From 181897514fa53b70ad568c280a9464a6c410f616 Mon Sep 17 00:00:00 2001 From: Bimba Laszlo Date: Tue, 19 Feb 2019 12:33:31 +0100 Subject: [PATCH 0001/2376] Add links to plugins made by @bimlas (#3778) --- .../Disqus comments plugin by bimlas.tid | 12 ++++++++++++ .../resources/Kin filter operator by bimlas.tid | 16 ++++++++++++++++ .../resources/Locator plugin by bimlas.tid | 10 ++++++++++ 3 files changed, 38 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/resources/Disqus comments plugin by bimlas.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Kin filter operator by bimlas.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Locator plugin by bimlas.tid diff --git a/editions/tw5.com/tiddlers/community/resources/Disqus comments plugin by bimlas.tid b/editions/tw5.com/tiddlers/community/resources/Disqus comments plugin by bimlas.tid new file mode 100644 index 000000000..2dfbab738 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Disqus comments plugin by bimlas.tid @@ -0,0 +1,12 @@ +created: 20190219201946994 +modified: 20190219202305854 +tags: Resources +title: Disqus comments plugin by bimlas +type: text/vnd.tiddlywiki +url: https://bimlas.gitlab.io/tw5-disqus/ + +Use this plugin to give your visitors the opportunity to comment on your tiddlers without changing the wiki itself. + +[[Disqus|https://disqus.com/]] is a networked community platform used by hundreds of thousands of sites all over the web. With Disqus, your website gains a feature-rich comment system complete with social network integration, advanced administration and moderation options, and other extensive community functions. + +{{!!url}} diff --git a/editions/tw5.com/tiddlers/community/resources/Kin filter operator by bimlas.tid b/editions/tw5.com/tiddlers/community/resources/Kin filter operator by bimlas.tid new file mode 100644 index 000000000..e92a0f3ee --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Kin filter operator by bimlas.tid @@ -0,0 +1,16 @@ +created: 20190219094230499 +modified: 20190219095858434 +tags: Resources +title: Kin filter operator by bimlas +type: text/vnd.tiddlywiki +url: https://bimlas.gitlab.io/tw5-kin-filter/ + +The purpose of the kin operator with examples: + +* Finds related tags, related tiddlers in any depth +* Finds out where base tiddler originates and what other elements originate from it +* Finds the ancestors and successors of a family member +* Finds the "leaves" of the branch of the base tiddler in a tree-like structure (where the base tiddler is a leaf) +* Finds the super- and subsets / groups of a mathematical set (where the base tiddler is a set) + +{{!!url}} diff --git a/editions/tw5.com/tiddlers/community/resources/Locator plugin by bimlas.tid b/editions/tw5.com/tiddlers/community/resources/Locator plugin by bimlas.tid new file mode 100644 index 000000000..761d94f82 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Locator plugin by bimlas.tid @@ -0,0 +1,10 @@ +created: 20190219191946994 +modified: 20190219192305854 +tags: Resources +title: Locator plugin by bimlas +type: text/vnd.tiddlywiki +url: https://bimlas.gitlab.io/tw5-locator/ + +For those who use many tags or store many different topics in a common wiki the Locator plugin is a table of contents widget and an enhanced search engine that gives you the opportunity to filter results by related tags. Unlike table of contents, standard search and list of tags, this plugin offers these features in an organic, collaborative way. + +{{!!url}} From 36e76429b1a1d4638374d513430393db5693b932 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 25 Feb 2019 13:08:22 +0000 Subject: [PATCH 0002/2376] Add is[variable] filter See discussion here https://groups.google.com/d/topic/tiddlywiki/4rEuAWc4EpM/discussion --- core/modules/filters/is/variable.js | 36 ++++++++++++++++++++++++ editions/tw5.com/tiddlers/filters/is.tid | 3 +- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 core/modules/filters/is/variable.js diff --git a/core/modules/filters/is/variable.js b/core/modules/filters/is/variable.js new file mode 100644 index 000000000..fe7ea94bc --- /dev/null +++ b/core/modules/filters/is/variable.js @@ -0,0 +1,36 @@ +/*\ +title: $:/core/modules/filters/is/variable.js +type: application/javascript +module-type: isfilteroperator + +Filter function for [is[variable]] + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.variable = function(source,prefix,options) { + var results = []; + if(prefix === "!") { + source(function(tiddler,title) { + if(!title in options.widget.variables) { + results.push(title); + } + }); + } else { + source(function(tiddler,title) { + if(title in options.widget.variables) { + results.push(title); + } + }); + } + return results; +}; + +})(); diff --git a/editions/tw5.com/tiddlers/filters/is.tid b/editions/tw5.com/tiddlers/filters/is.tid index bd33d11a6..6e838e872 100644 --- a/editions/tw5.com/tiddlers/filters/is.tid +++ b/editions/tw5.com/tiddlers/filters/is.tid @@ -1,5 +1,5 @@ created: 20140410103123179 -modified: 20161127142329969 +modified: 20190225130632157 tags: [[Filter Operators]] [[Common Operators]] [[Negatable Operators]] title: is Operator type: text/vnd.tiddlywiki @@ -22,6 +22,7 @@ The parameter <<.place C>> is one of the following fundamental categories: |^`system` |is a [[system tiddler|SystemTiddlers]], i.e. its title starts with `$:/` | |^`tag` |is in use as a tag | |^`tiddler` |exists as a non-shadow tiddler | +|^`variable` |<<.from-version "5.1.20">> exists as a variable (whether or not it has a non-blank value) | If <<.place C>> is anything else an error message is returned. <<.from-version "5.1.14">> if <<.place C>> is blank, the output is passed through unchanged (in earlier versions an error message was returned). From b862348b06994868d0d81319ff61e7792dd23818 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Thu, 28 Feb 2019 11:54:04 +0000 Subject: [PATCH 0003/2376] Fix !is[variable] operator Fixes #3804 --- core/modules/filters/is/variable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters/is/variable.js b/core/modules/filters/is/variable.js index fe7ea94bc..1f2e5d1b3 100644 --- a/core/modules/filters/is/variable.js +++ b/core/modules/filters/is/variable.js @@ -19,7 +19,7 @@ exports.variable = function(source,prefix,options) { var results = []; if(prefix === "!") { source(function(tiddler,title) { - if(!title in options.widget.variables) { + if(!(title in options.widget.variables)) { results.push(title); } }); From 18c00c2ef05f3362f9ee7685f0f59498c457671b Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 1 Mar 2019 17:39:42 +0000 Subject: [PATCH 0004/2376] Don't allow $:/Import tiddler to be imported --- core/modules/upgraders/system.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/upgraders/system.js b/core/modules/upgraders/system.js index a5f9970da..fb6e1dd0c 100644 --- a/core/modules/upgraders/system.js +++ b/core/modules/upgraders/system.js @@ -13,7 +13,7 @@ Upgrader module that suppresses certain system tiddlers that shouldn't be import "use strict"; var DONT_IMPORT_LIST = ["$:/StoryList","$:/HistoryList"], - DONT_IMPORT_PREFIX_LIST = ["$:/temp/","$:/state/"], + DONT_IMPORT_PREFIX_LIST = ["$:/temp/","$:/state/","$:/Import"], WARN_IMPORT_PREFIX_LIST = ["$:/core/modules/"]; exports.upgrade = function(wiki,titles,tiddlers) { From 655fc31cee21486157adc039c459395f98a309e7 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 1 Mar 2019 18:28:51 +0000 Subject: [PATCH 0005/2376] Server: Avoid displaying "undefined" for missing path prefix --- core/modules/server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/server/server.js b/core/modules/server/server.js index c82d3f4eb..3225b95f3 100644 --- a/core/modules/server/server.js +++ b/core/modules/server/server.js @@ -239,7 +239,7 @@ Server.prototype.listen = function(port,host,prefix) { // Handle defaults for port and host port = port || this.get("port"); host = host || this.get("host"); - prefix = prefix || this.get("path-prefix"); + prefix = prefix || this.get("path-prefix") || ""; // Check for the port being a string and look it up as an environment variable if(parseInt(port,10).toString() !== port) { port = process.env[port] || 8080; From a6875df7ef7580972d9b0462ba68f25c72cd230f Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 1 Mar 2019 22:06:14 +0000 Subject: [PATCH 0006/2376] Browser-storage: Add enable/disable and clear button --- .../tiddlywiki/browser-storage/settings.tid | 12 ++++++++++++ plugins/tiddlywiki/browser-storage/startup.js | 18 ++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/browser-storage/settings.tid b/plugins/tiddlywiki/browser-storage/settings.tid index 5b8367a4f..4dfde08bd 100644 --- a/plugins/tiddlywiki/browser-storage/settings.tid +++ b/plugins/tiddlywiki/browser-storage/settings.tid @@ -1,5 +1,17 @@ title: $:/plugins/tiddlywiki/browser-storage/settings +! Disable + +You can disable the browser storage plugin: + +<$checkbox tiddler="$:/config/BrowserStorage/Enabled" field="text" checked="yes" unchecked="no" default="yes"> Use browser local storage + +! Clear + +Click this button to clear browser storage and disable its use: + +<$button message="tm-clear-browser-storage">Clear browser storage + ! Save Filter This filter determines which tiddlers will be saved to local storage. By default, it contains `[all[]]` meaning that it will attempt to save all tiddlers. Other useful values include `[prefix[$:/state/]]` to just save state tiddlers, thus preserving selected tabs, and the open/closed status of table of contents entries. diff --git a/plugins/tiddlywiki/browser-storage/startup.js b/plugins/tiddlywiki/browser-storage/startup.js index 39a9ff842..83e7affcb 100644 --- a/plugins/tiddlywiki/browser-storage/startup.js +++ b/plugins/tiddlywiki/browser-storage/startup.js @@ -18,7 +18,8 @@ exports.platforms = ["browser"]; exports.after = ["load-modules"]; exports.synchronous = true; -var SAVE_FILTER_TITLE = "$:/config/BrowserStorage/SaveFilter", +var ENABLED_TITLE = "$:/config/BrowserStorage/Enabled", + SAVE_FILTER_TITLE = "$:/config/BrowserStorage/SaveFilter", QUOTA_EXCEEDED_ALERT_TITLE = "$:/config/BrowserStorage/QuotaExceededAlert", DEFAULT_QUOTA_EXCEEDED_ALERT_PREFIX = "Quota exceeded attempting to store `", DEFAULT_QUOTA_EXCEEDED_ALERT_SUFFIX = "` in browser local storage"; @@ -37,8 +38,17 @@ exports.startup = function() { filterFn = $tw.wiki.compileFilter($tw.wiki.getTiddlerText(SAVE_FILTER_TITLE)); } compileFilter(); + // Listen for tm-clear-browser-storage messages + $tw.rootWidget.addEventListener("tm-clear-browser-storage",function(event) { + window.localStorage.clear(); + $tw.wiki.addTiddler({title: ENABLED_TITLE, text: "no"}); + }); // Track tiddler changes $tw.wiki.addEventListener("change",function(changes) { + // Bail if browser storage is disabled + if($tw.wiki.getTiddlerText(ENABLED_TITLE) === "no") { + return; + } // Recompile the filter if it has changed if(changes[SAVE_FILTER_TITLE]) { compileFilter(); @@ -50,8 +60,12 @@ exports.startup = function() { iterator(tiddler,title); }); }); -console.log("Filtered changes",filteredChanges) $tw.utils.each(filteredChanges,function(title) { + // Don't try to save changes to our enabled status + // (If it were enabled in the file but disabled in local storage then we might not realise that distributing a copy of the file would have local storage enabled for other users) + if(title === ENABLED_TITLE) { + return; + } // Get the tiddler var tiddler = $tw.wiki.getTiddler(title); if(tiddler) { From 41e338dc412e2d17b68bdd395b043ac0a84737bc Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 2 Mar 2019 14:46:10 +0100 Subject: [PATCH 0007/2376] Add smartIndent to codemirror (#3810) * add smartIndent config to codemirror * add indentWithTabs config to codemirror * make default tabSize same value as indentUnit * make tab and enter do smart indentation --- plugins/tiddlywiki/codemirror/config/extraKeysTW.tid | 4 +++- plugins/tiddlywiki/codemirror/config/indentWithTabs.tid | 3 +++ plugins/tiddlywiki/codemirror/config/smartIndent.tid | 3 +++ plugins/tiddlywiki/codemirror/config/tabSize.tid | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 plugins/tiddlywiki/codemirror/config/indentWithTabs.tid create mode 100644 plugins/tiddlywiki/codemirror/config/smartIndent.tid diff --git a/plugins/tiddlywiki/codemirror/config/extraKeysTW.tid b/plugins/tiddlywiki/codemirror/config/extraKeysTW.tid index 1be220f75..1c84e91a1 100644 --- a/plugins/tiddlywiki/codemirror/config/extraKeysTW.tid +++ b/plugins/tiddlywiki/codemirror/config/extraKeysTW.tid @@ -11,5 +11,7 @@ type: json "Alt-T": "transposeChars", "Alt-U": "undoSelection", "Shift-Alt-U": "redoSelection", - "Cmd-U": "" + "Cmd-U": "", + "Tab": "indentAuto()", + "Enter": "newLineAndIndent()" } diff --git a/plugins/tiddlywiki/codemirror/config/indentWithTabs.tid b/plugins/tiddlywiki/codemirror/config/indentWithTabs.tid new file mode 100644 index 000000000..4b8d68903 --- /dev/null +++ b/plugins/tiddlywiki/codemirror/config/indentWithTabs.tid @@ -0,0 +1,3 @@ +title: $:/config/codemirror/indentWithTabs +type: bool +text: true diff --git a/plugins/tiddlywiki/codemirror/config/smartIndent.tid b/plugins/tiddlywiki/codemirror/config/smartIndent.tid new file mode 100644 index 000000000..62faa8a49 --- /dev/null +++ b/plugins/tiddlywiki/codemirror/config/smartIndent.tid @@ -0,0 +1,3 @@ +title: $:/config/codemirror/smartIndent +type: bool +text: true diff --git a/plugins/tiddlywiki/codemirror/config/tabSize.tid b/plugins/tiddlywiki/codemirror/config/tabSize.tid index 58559a055..93285fded 100644 --- a/plugins/tiddlywiki/codemirror/config/tabSize.tid +++ b/plugins/tiddlywiki/codemirror/config/tabSize.tid @@ -1,3 +1,3 @@ title: $:/config/codemirror/tabSize type: integer -text: 4 +text: 2 From 77e6f5c0e36ae1f50e3eb8ffa9fadce8cfa004b5 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 2 Mar 2019 14:54:23 +0100 Subject: [PATCH 0008/2376] Fix for "Open" tab placeholders in FireFox (#3806) * fix for "Open" tab placeholders in FireFox this PR fixes the placeholders in FireFox not being removed on drag-leave from time to time it consists of 2 mods where apparently both are needed: - creating a `droppable-item` macro where whitespace is trimmed. that macro contains the droppable and inserts the placeholders - removing the ` ` entity in favor of an inline style `height:2em;` on the placeholder div, putting it in a macro where whitespace can be trimmed, too I'm investigating if there's a similar fix for the top page dropzone * remove unnecessary whitespace trim, add css classes `.tc-sidebar-tab-open-item { position: relative; }` `.tc-sidebar-tab-open .tc-droppable-placeholer { line-height:2em; height:2em; } ` * replace times entity with close-button * add sidebar-open-tab styles --- core/ui/SideBar/Open.tid | 28 +++++++++++++++++----------- themes/tiddlywiki/vanilla/base.tid | 14 ++++++++++++++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/core/ui/SideBar/Open.tid b/core/ui/SideBar/Open.tid index dc40e9ac1..32b0d865c 100644 --- a/core/ui/SideBar/Open.tid +++ b/core/ui/SideBar/Open.tid @@ -9,23 +9,29 @@ caption: {{$:/language/SideBar/Open/Caption}} <$action-listops $tiddler="$:/StoryList" $subfilter="+[insertbefore:currentTiddler]"/> \end -<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop"> -
+\define placeholder() +
+\end + +\define droppable-item(button) +\whitespace trim <$droppable actions=<>> -
-  -
+<>
-<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">× <$link to={{!!title}}><$view field="title"/> +$button$
+\end + +
+<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop"> +
+<$macrocall $name="droppable-item" button="""<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">{{$:/core/images/close-button}} <$link to={{!!title}}><$view field="title"/>"""/>
<$tiddler tiddler=""> -<$droppable actions=<>> -
-  +
+<$macrocall $name="droppable-item" button="""<$button message="tm-close-all-tiddlers" class="tc-btn-invisible tc-btn-mini"><>"""/>
-<$button message="tm-close-all-tiddlers" class="tc-btn-invisible tc-btn-mini"><> - +
diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index c69523a17..56c49a8f0 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -384,6 +384,20 @@ a.tc-tiddlylink-external:hover { cursor: move; } +.tc-sidebar-tab-open .tc-droppable-placeholder { + line-height: 2em; + height: 2em; +} + +.tc-sidebar-tab-open-item { + position: relative; +} + +.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg { + font-size: 0.7em; + fill: <>; +} + /* ** Plugin reload warning */ From 16bb474fef561a41ae0dafb5247a3dc5f559ee5c Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 2 Mar 2019 16:13:36 +0100 Subject: [PATCH 0009/2376] Partial fix for the sticky dropzone on firefox (#3809) in my tests listening for the dragend event and removing the tc-dragover class in that case removes the `tc-dragover` every time it should ... without this, firefox often doesn't remove it and the green bar sticks at the top investigating now if the droppable widget has a similar problem --- core/modules/widgets/dropzone.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 7968f5a44..c4cb36262 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -42,7 +42,8 @@ DropZoneWidget.prototype.render = function(parent,nextSibling) { {name: "dragover", handlerObject: this, handlerMethod: "handleDragOverEvent"}, {name: "dragleave", handlerObject: this, handlerMethod: "handleDragLeaveEvent"}, {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"}, - {name: "paste", handlerObject: this, handlerMethod: "handlePasteEvent"} + {name: "paste", handlerObject: this, handlerMethod: "handlePasteEvent"}, + {name: "dragend", handlerObject: this, handlerMethod: "handleDragEndEvent"} ]); domNode.addEventListener("click",function (event) { },false); @@ -103,6 +104,10 @@ DropZoneWidget.prototype.handleDragLeaveEvent = function(event) { this.leaveDrag(event); }; +DropZoneWidget.prototype.handleDragEndEvent = function(event) { + $tw.utils.removeClass(this.domNodes[0],"tc-dragover"); +}; + DropZoneWidget.prototype.handleDropEvent = function(event) { var self = this, readFileCallback = function(tiddlerFieldsArray) { From fb0713ae78dce63a13438c6f4aeab2ea0771de6c Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 2 Mar 2019 16:18:50 +0000 Subject: [PATCH 0010/2376] Comments plugin: Fix extraneous paragraph in above story area Fixes #3813 --- plugins/tiddlywiki/comments/above-story.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/tiddlywiki/comments/above-story.tid b/plugins/tiddlywiki/comments/above-story.tid index 5042faf1d..9ea3b60d8 100644 --- a/plugins/tiddlywiki/comments/above-story.tid +++ b/plugins/tiddlywiki/comments/above-story.tid @@ -2,7 +2,11 @@ title: $:/plugins/tiddlywiki/comments/above-story tags: $:/tags/AboveStory <$reveal state="$:/config/Comments/EnableWikiComments" type="match" text="yes" default="no"> + <$tiddler tiddler="$:/SiteTitle"> + <$transclude tiddler="$:/plugins/tiddlywiki/comments/comments-template" mode="inline"/> + + From 87eab62b7e98921ec43fc1762e4a4d4a1fdc5719 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 2 Mar 2019 17:25:49 +0100 Subject: [PATCH 0011/2376] Make the keyboard-shortcut input focus automatically (#3776) * add focus capability to edit-shortcut widget * focus the keyboard-shortcut inputs in the control panel ... there's no other reason why it could have been opened other than just pressing a shorcut ... ... saves the mouseclick --- core/modules/widgets/edit-shortcut.js | 15 +++++++++++++++ core/ui/ControlPanel/KeyboardShortcuts.tid | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/edit-shortcut.js b/core/modules/widgets/edit-shortcut.js index 78f34839c..49da6843b 100644 --- a/core/modules/widgets/edit-shortcut.js +++ b/core/modules/widgets/edit-shortcut.js @@ -57,6 +57,10 @@ EditShortcutWidget.prototype.render = function(parent,nextSibling) { // Link into the DOM parent.insertBefore(this.inputNode,nextSibling); this.domNodes.push(this.inputNode); + // Focus the input Node if focus === "yes" or focus === "true" + if(this.shortcutFocus === "yes" || this.shortcutFocus === "true") { + this.focus(); + } }; /* @@ -72,6 +76,7 @@ EditShortcutWidget.prototype.execute = function() { this.shortcutStyle = this.getAttribute("style"); this.shortcutTooltip = this.getAttribute("tooltip"); this.shortcutAriaLabel = this.getAttribute("aria-label"); + this.shorcutFocus = this.getAttribute("focus"); }; /* @@ -118,6 +123,16 @@ EditShortcutWidget.prototype.handleKeydownEvent = function(event) { } }; +/* +focus the input node +*/ +EditShortcutWidget.prototype.focus = function() { + if(this.inputNode.focus && this.inputNode.select) { + this.inputNode.focus(); + this.inputNode.select(); + } +}; + /* Selectively refreshes the widget if needed. Returns true if the widget needed re-rendering */ diff --git a/core/ui/ControlPanel/KeyboardShortcuts.tid b/core/ui/ControlPanel/KeyboardShortcuts.tid index dceb68690..579c914e6 100644 --- a/core/ui/ControlPanel/KeyboardShortcuts.tid +++ b/core/ui/ControlPanel/KeyboardShortcuts.tid @@ -6,7 +6,7 @@ caption: {{$:/language/ControlPanel/KeyboardShortcuts/Caption}} \define new-shortcut(title)
-<$edit-shortcut tiddler="$title$" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} style="width:auto;"/> <$button> +<$edit-shortcut tiddler="$title$" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus="true" style="width:auto;"/> <$button> <> <$action-listops $tiddler="$(shortcutTitle)$" From b6e2985ac69221505bc6218792066d13ffffa1bb Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 2 Mar 2019 18:16:55 +0100 Subject: [PATCH 0012/2376] Fix typo in edit-shortcut widget refresh - missing focus attr (#3815) * fix edit-shortcut widget refresh - missing focus attr * + typo fix. NOW it works --- core/modules/widgets/edit-shortcut.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/edit-shortcut.js b/core/modules/widgets/edit-shortcut.js index 49da6843b..b70328d5a 100644 --- a/core/modules/widgets/edit-shortcut.js +++ b/core/modules/widgets/edit-shortcut.js @@ -76,7 +76,7 @@ EditShortcutWidget.prototype.execute = function() { this.shortcutStyle = this.getAttribute("style"); this.shortcutTooltip = this.getAttribute("tooltip"); this.shortcutAriaLabel = this.getAttribute("aria-label"); - this.shorcutFocus = this.getAttribute("focus"); + this.shortcutFocus = this.getAttribute("focus"); }; /* @@ -138,7 +138,7 @@ Selectively refreshes the widget if needed. Returns true if the widget needed re */ EditShortcutWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes["aria-label"]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes["aria-label"] || changedAttributes.focus) { this.refreshSelf(); return true; } else if(changedTiddlers[this.shortcutTiddler]) { From 638eb53429e40e15d35465c2d672c31d1c361d12 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 2 Mar 2019 19:04:27 +0100 Subject: [PATCH 0013/2376] Add tabindex attributes to edit templates (#3758) * add tabindex attribute to editor-body edit-template * add tabindex attr to fields edit-template * add tabIndex variable to tags edit-template * add tabindex attr to title edit-template * add tabindex attr to type edit-template * add tabindex attr to canonical-uri input * add tabindex attr (as variable tabIndex) to tag-picker macro --- core/ui/EditTemplate/body-editor.tid | 1 + core/ui/EditTemplate/body.tid | 2 +- core/ui/EditTemplate/fields.tid | 6 +++--- core/ui/EditTemplate/tags.tid | 2 ++ core/ui/EditTemplate/title.tid | 2 +- core/ui/EditTemplate/type.tid | 2 +- core/wiki/macros/tag-picker.tid | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/core/ui/EditTemplate/body-editor.tid b/core/ui/EditTemplate/body-editor.tid index 3de3beec9..48d51b104 100644 --- a/core/ui/EditTemplate/body-editor.tid +++ b/core/ui/EditTemplate/body-editor.tid @@ -5,6 +5,7 @@ title: $:/core/ui/EditTemplate/body/editor field="text" class="tc-edit-texteditor" placeholder={{$:/language/EditTemplate/Body/Placeholder}} + tabindex={{$:/config/EditTabIndex}} ><$set diff --git a/core/ui/EditTemplate/body.tid b/core/ui/EditTemplate/body.tid index faf43ac31..50a8f7f88 100644 --- a/core/ui/EditTemplate/body.tid +++ b/core/ui/EditTemplate/body.tid @@ -13,7 +13,7 @@ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$ <$text text={{!!_canonical_uri}}/> -<$edit-text field="_canonical_uri" class="tc-edit-fields"> +<$edit-text field="_canonical_uri" class="tc-edit-fields" tabindex={{$:/config/EditTabIndex}}>
diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 3b70e1b6e..440d02826 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -39,7 +39,7 @@ $value={{$:/temp/newfieldvalue}}/> <$text text=<>/>: -<$edit-text tiddler=<> field=<> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}}/> +<$edit-text tiddler=<> field=<> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/> <$button class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}> @@ -60,7 +60,7 @@ $value={{$:/temp/newfieldvalue}}/> <> -<$edit-text tiddler="$:/temp/newfieldname" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<> class="tc-edit-texteditor tc-popup-handle"/> +<$edit-text tiddler="$:/temp/newfieldname" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}}/> <$button popup=<> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}} <$reveal state=<> type="nomatch" text="" default=""> @@ -88,7 +88,7 @@ $value={{$:/temp/newfieldvalue}}/>
-<$edit-text tiddler="$:/temp/newfieldvalue" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor"/> +<$edit-text tiddler="$:/temp/newfieldvalue" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}}/> <$macrocall $name="new-field"/> diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index c19d4cdb5..e2ca88d8e 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -39,5 +39,7 @@ color:$(foregroundColor)$; <$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/> +<$set name="tabIndex" value={{$:/config/EditTabIndex}}> <$macrocall $name="tag-picker" actions=<>/> +
diff --git a/core/ui/EditTemplate/title.tid b/core/ui/EditTemplate/title.tid index 406bab32c..6496db075 100644 --- a/core/ui/EditTemplate/title.tid +++ b/core/ui/EditTemplate/title.tid @@ -1,7 +1,7 @@ title: $:/core/ui/EditTemplate/title tags: $:/tags/EditTemplate -<$edit-text field="draft.title" class="tc-titlebar tc-edit-texteditor" focus="true"/> +<$edit-text field="draft.title" class="tc-titlebar tc-edit-texteditor" focus="true" tabindex={{$:/config/EditTabIndex}}/> <$vars pattern="""[\|\[\]{}]""" bad-chars="""`| [ ] { }`"""> diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 16fb20e04..8bf206d74 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditTemplate \define lingo-base() $:/language/EditTemplate/
<$fieldmangler> -<> <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<> class="tc-edit-typeeditor tc-popup-handle"/> <$button popup=<> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}} <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}} +<> <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<> class="tc-edit-typeeditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}}/> <$button popup=<> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}} <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}
diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 81bfaaabc..039a12140 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -24,7 +24,7 @@ $(actions)$
<$keyboard key="ENTER" actions=<>> -<$edit-text tiddler="$:/temp/NewTagName" tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<> class="tc-edit-texteditor tc-popup-handle"/> +<$edit-text tiddler="$:/temp/NewTagName" tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<> class="tc-edit-texteditor tc-popup-handle" tabindex=<>/> <$button popup=<> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}} <$set name="tag" value={{$:/temp/NewTagName}}> From dd4305d52042cff9b73975c97d3d3edc6fce2cdf Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 3 Mar 2019 11:30:14 +0000 Subject: [PATCH 0014/2376] Browser-storage: Only delete our own items We should only delete our own items because browsers share local storage with all file:// URIs --- plugins/tiddlywiki/browser-storage/startup.js | 75 ++++++++++++------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/plugins/tiddlywiki/browser-storage/startup.js b/plugins/tiddlywiki/browser-storage/startup.js index 83e7affcb..8871e777c 100644 --- a/plugins/tiddlywiki/browser-storage/startup.js +++ b/plugins/tiddlywiki/browser-storage/startup.js @@ -40,8 +40,8 @@ exports.startup = function() { compileFilter(); // Listen for tm-clear-browser-storage messages $tw.rootWidget.addEventListener("tm-clear-browser-storage",function(event) { - window.localStorage.clear(); $tw.wiki.addTiddler({title: ENABLED_TITLE, text: "no"}); + clearLocalStorage(); }); // Track tiddler changes $tw.wiki.addEventListener("change",function(changes) { @@ -66,32 +66,57 @@ exports.startup = function() { if(title === ENABLED_TITLE) { return; } - // Get the tiddler - var tiddler = $tw.wiki.getTiddler(title); - if(tiddler) { - // Get the JSON of the tiddler - var json = JSON.stringify(tiddler.getFieldStrings()); - // Try to save it to local storage - try { - window.localStorage.setItem(prefix + title,json); - } catch(e) { - if(e.name === "QuotaExceededError") { - // Complain if we failed - var msg = $tw.wiki.getTiddlerText(QUOTA_EXCEEDED_ALERT_TITLE,DEFAULT_QUOTA_EXCEEDED_ALERT_PREFIX + title + DEFAULT_QUOTA_EXCEEDED_ALERT_SUFFIX); - logger.alert(msg); - // No point in keeping old values around for this tiddler - window.localStorage.removeItem(prefix + title); - } else { - throw e; - } - } - console.log("browser-storage: Saving",title); - } else { - window.localStorage.removeItem(prefix + title); - console.log("browser-storage: Deleting",title); - } + // Save the tiddler + saveTiddlerToLocalStorage(title,{ + logger: logger, + prefix: prefix + }); }); }); }; +function saveTiddlerToLocalStorage(title,options) { + options = options || {}; + // Get the tiddler + var tiddler = $tw.wiki.getTiddler(title); + if(tiddler) { + // Get the JSON of the tiddler + var json = JSON.stringify(tiddler.getFieldStrings()); + // Try to save it to local storage + try { + window.localStorage.setItem(options.prefix + title,json); + } catch(e) { + if(e.name === "QuotaExceededError") { + // Complain if we failed + var msg = $tw.wiki.getTiddlerText(QUOTA_EXCEEDED_ALERT_TITLE,DEFAULT_QUOTA_EXCEEDED_ALERT_PREFIX + title + DEFAULT_QUOTA_EXCEEDED_ALERT_SUFFIX); + if(options.logger) { + options.logger.alert(msg); + } + // No point in keeping old values around for this tiddler + window.localStorage.removeItem(options.prefix + title); + } else { + throw e; + } + } + console.log("browser-storage: Saving",title); + } else { + window.localStorage.removeItem(options.prefix + title); + console.log("browser-storage: Deleting",title); + } +} + +function clearLocalStorage() { + var url = window.location.pathname, + log = []; + // Step through each browsder storage item + for(var index=window.localStorage.length - 1; index>=0; index--) { + var key = window.localStorage.key(index), + parts = key.split("#"); + // Delete it if it's ours + if(parts[0] === "tw5" && parts[1] === url) { + window.localStorage.removeItem(key); + } + } +} + })(); From 148c1a03553a04ebb89d84bcbab09a4ff50616ea Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sun, 3 Mar 2019 14:32:26 +0000 Subject: [PATCH 0015/2376] Clarify that filter operator brackets cannot be nested --- .../tiddlers/filters/Introduction to filter notation.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid b/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid index 1155923ee..e6b785a18 100644 --- a/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid +++ b/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid @@ -83,3 +83,5 @@ as an alternative to `[tag[Vegetarian]]`. This allows the preference to change o <<.def "Angle brackets">> `<>` mean that the parameter is the name of a [[variable|Variables]] whose value is to be used instead. Here we use the built-in <<.vlink currentTiddler>> variable in a filter that selects any tiddlers whose text contains the title of the current one: > `[search]` + +Note that these special brackets cannot be nested. It is not possible for example to write `[search{}]`. From 2104017249c5ac148e8d5ffa88f40ce959271b78 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 3 Mar 2019 17:16:35 +0000 Subject: [PATCH 0016/2376] Browser-storage: Only save state tiddlers by default And add it back to the prerelease now that it's a bit safer --- editions/prerelease/tiddlywiki.info | 3 ++- plugins/tiddlywiki/browser-storage/config/SaveFilter.tid | 2 +- plugins/tiddlywiki/browser-storage/settings.tid | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/editions/prerelease/tiddlywiki.info b/editions/prerelease/tiddlywiki.info index d29305576..7cfc207af 100644 --- a/editions/prerelease/tiddlywiki.info +++ b/editions/prerelease/tiddlywiki.info @@ -14,7 +14,8 @@ "tiddlywiki/external-attachments", "tiddlywiki/dynaview", "tiddlywiki/codemirror", - "tiddlywiki/comments" + "tiddlywiki/comments", + "tiddlywiki/browser-storage" ], "themes": [ "tiddlywiki/vanilla", diff --git a/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid b/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid index 60224bb8c..b08b934c0 100644 --- a/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid +++ b/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid @@ -1,2 +1,2 @@ title: $:/config/BrowserStorage/SaveFilter -text: [all[]] +text: [prefix[$:/state/]] diff --git a/plugins/tiddlywiki/browser-storage/settings.tid b/plugins/tiddlywiki/browser-storage/settings.tid index 4dfde08bd..380a1bbac 100644 --- a/plugins/tiddlywiki/browser-storage/settings.tid +++ b/plugins/tiddlywiki/browser-storage/settings.tid @@ -14,7 +14,7 @@ Click this button to clear browser storage and disable its use: ! Save Filter -This filter determines which tiddlers will be saved to local storage. By default, it contains `[all[]]` meaning that it will attempt to save all tiddlers. Other useful values include `[prefix[$:/state/]]` to just save state tiddlers, thus preserving selected tabs, and the open/closed status of table of contents entries. +This filter determines which tiddlers will be saved to local storage. By default, it contains `[prefix[$:/state/]]` to just save state tiddlers, thus preserving selected tabs, and the open/closed status of table of contents entries. Other useful values include `[all[]]` meaning that it will attempt to save all tiddlers. <$link to="$:/config/BrowserStorage/SaveFilter">Browser Storage Save Filter: <$edit-text tiddler="$:/config/BrowserStorage/SaveFilter" default="" tag="input" size="50"/> From e8b50df4a6af42fb59ce28426d7367d17d2d658b Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 3 Mar 2019 22:09:42 +0100 Subject: [PATCH 0017/2376] Porting the Nord palette (#3820) https://github.com/arcticicestudio/nord this palette is very popular, available for highlight.js, codemirror, all kinds of desktop/terminal applications ... would be great to have it in tiddlywiki, too this is a draft PR, certain things needs to be improved, but looks very good in tiddlywiki --- core/palettes/Nord.tid | 120 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 core/palettes/Nord.tid diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid new file mode 100644 index 000000000..73b278a99 --- /dev/null +++ b/core/palettes/Nord.tid @@ -0,0 +1,120 @@ +title: $:/palettes/Nord +name: Nord +description: An arctic, north-bluish color palette. +tags: $:/tags/Palette +type: application/x-tiddler-dictionary +license: MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md + +alert-background: #EBCB8B +alert-border: #D08770 +alert-highlight: #B48EAD +alert-muted-foreground: #D08770 +background: #3b4252 +blockquote-bar: <> +button-background: #4C566A +button-foreground: #D8DEE9 +button-border: transparent +code-background: #2E3440 +code-border: #2E3440 +code-foreground: #BF616A +diff-delete-background: #BF616A +diff-delete-foreground: <> +diff-equal-background: +diff-equal-foreground: <> +diff-insert-background: #A3BE8C +diff-insert-foreground: <> +diff-invisible-background: +diff-invisible-foreground: <> +dirty-indicator: #BF616A +download-background: #A3BE8C +download-foreground: <> +dragger-background: <> +dragger-foreground: <> +dropdown-background: <> +dropdown-border: <> +dropdown-tab-background-selected: #fff +dropdown-tab-background: #ececec +dropzone-background: #A3BE8C +external-link-background-hover: inherit +external-link-background-visited: inherit +external-link-background: inherit +external-link-foreground-hover: inherit +external-link-foreground-visited: #5E81AC +external-link-foreground: #8FBCBB +foreground: #d8dee9 +message-background: #2E3440 +message-border: #2E3440 +message-foreground: #547599 +modal-backdrop: <> +modal-background: <> +modal-border: #3b4252 +modal-footer-background: #3b4252 +modal-footer-border: #3b4252 +modal-header-border: #3b4252 +muted-foreground: #434C5E +notification-background: #EBCB8B +notification-border: #D08770 +page-background: #2e3440 +pre-background: #2E3440 +pre-border: #2E3440 +primary: #5E81AC +select-tag-background: #3b4252 +select-tag-foreground: <> +sidebar-button-foreground: <> +sidebar-controls-foreground-hover: #4C566A +sidebar-controls-foreground: #3B4252 +sidebar-foreground-shadow: #4C566A +sidebar-foreground: #D8DEE9 +sidebar-muted-foreground-hover: #4C566A +sidebar-muted-foreground: #4C566A +sidebar-tab-background-selected: #ECEFF4 +sidebar-tab-background: #4C566A +sidebar-tab-border-selected: <> +sidebar-tab-border: #4C566A +sidebar-tab-divider: <> +sidebar-tab-foreground-selected: #4C566A +sidebar-tab-foreground: <> +sidebar-tiddler-link-foreground-hover: #A3BE8C +sidebar-tiddler-link-foreground: #81A1C1 +site-title-foreground: <> +static-alert-foreground: #B48EAD +tab-background-selected: #ECEFF4 +tab-background: #4C566A +tab-border-selected: #4C566A +tab-border: #4C566A +tab-divider: #4C566A +tab-foreground-selected: #4C566A +tab-foreground: #D8DEE9 +table-border: #434C5E +table-footer-background: #2e3440 +table-header-background: #3B4252 +tag-background: #A3BE8C +tag-foreground: #4C566A +tiddler-background: <> +tiddler-border: <> +tiddler-controls-foreground-hover: +tiddler-controls-foreground-selected: #2E3440 +tiddler-controls-foreground: #4C566A +tiddler-editor-background: #2e3440 +tiddler-editor-border-image: #2e3440 +tiddler-editor-border: #2e3440 +tiddler-editor-fields-even: #2e3440 +tiddler-editor-fields-odd: #2e3440 +tiddler-info-background: #2e3440 +tiddler-info-border: #2e3440 +tiddler-info-tab-background: #2e3440 +tiddler-link-background: <> +tiddler-link-foreground: <> +tiddler-subtitle-foreground: #4C566A +tiddler-title-foreground: #81A1C1 +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +toolbar-info-button: +toolbar-edit-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-cancel-button: +toolbar-done-button: +untagged-background: #3B4252 +very-muted-foreground: #3B4252 From 0b1ce30a042b1a9cc0b9e83f96384a23a2225937 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 3 Mar 2019 22:22:13 +0100 Subject: [PATCH 0018/2376] Add outline color to button, textarea, input (#3822) * add outline-color to button, textarea, input * add select elements, move to top * use primary color --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 56c49a8f0..0350fefd8 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -176,6 +176,10 @@ dl dt { margin-top: 6px; } +button, textarea, input, select { + outline-color: <>; +} + textarea, input[type=text], input[type=search], From 477c41f84304ed83245c87068dba3695a5053d62 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 4 Mar 2019 12:24:16 +0000 Subject: [PATCH 0019/2376] Add tooltip attribute to select widget --- core/modules/widgets/select.js | 6 +++++- editions/tw5.com/tiddlers/widgets/SelectWidget.tid | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/modules/widgets/select.js b/core/modules/widgets/select.js index cf094687b..d860d42cf 100644 --- a/core/modules/widgets/select.js +++ b/core/modules/widgets/select.js @@ -145,6 +145,7 @@ SelectWidget.prototype.execute = function() { this.selectDefault = this.getAttribute("default"); this.selectMultiple = this.getAttribute("multiple", false); this.selectSize = this.getAttribute("size"); + this.selectTooltip = this.getAttribute("tooltip"); // Make the child widgets var selectNode = { type: "element", @@ -160,6 +161,9 @@ SelectWidget.prototype.execute = function() { if(this.selectSize) { $tw.utils.addAttributeToParseTreeNode(selectNode,"size",this.selectSize); } + if(this.selectTooltip) { + $tw.utils.addAttributeToParseTreeNode(selectNode,"title",this.selectTooltip); + } this.makeChildWidgets([selectNode]); }; @@ -169,7 +173,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of SelectWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // If we're using a different tiddler/field/index then completely refresh ourselves - if(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex) { + if(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) { this.refreshSelf(); return true; // If the target tiddler value has changed, just update setting and refresh the children diff --git a/editions/tw5.com/tiddlers/widgets/SelectWidget.tid b/editions/tw5.com/tiddlers/widgets/SelectWidget.tid index 51aede5a1..47c1117a6 100644 --- a/editions/tw5.com/tiddlers/widgets/SelectWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/SelectWidget.tid @@ -1,6 +1,6 @@ caption: select created: 20131024141900000 -modified: 20160429175220241 +modified: 20190304122040876 tags: Widgets title: SelectWidget type: text/vnd.tiddlywiki @@ -35,6 +35,7 @@ The content of the `<$select>` widget should be one or more HTML ` From 348a0bc8bcbf5c42d9b93e5e208696d28fc95cb7 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 4 Mar 2019 16:59:15 +0000 Subject: [PATCH 0020/2376] Core: Allow startup navigation to be suppressed Plugins can suppress it so that they can provide their own startup scroll handling --- core/modules/startup/story.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/core/modules/startup/story.js b/core/modules/startup/story.js index b71bc0439..14d45554a 100644 --- a/core/modules/startup/story.js +++ b/core/modules/startup/story.js @@ -36,7 +36,9 @@ var HELP_OPEN_EXTERNAL_WINDOW = "http://tiddlywiki.com/#WidgetMessage%3A%20tm-op exports.startup = function() { // Open startup tiddlers - openStartupTiddlers(); + openStartupTiddlers({ + disableHistory: $tw.boot.disableStartupNavigation + }); if($tw.browser) { // Set up location hash update $tw.wiki.addEventListener("change",function(changes) { @@ -106,6 +108,7 @@ exports.startup = function() { /* Process the location hash to open the specified tiddlers. Options: +disableHistory: if true $:/History is NOT updated defaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers */ function openStartupTiddlers(options) { @@ -146,15 +149,18 @@ function openStartupTiddlers(options) { } // Save the story list $tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: "", list: storyList},$tw.wiki.getModificationFields()); - // If a target tiddler was specified add it to the history stack - if(target && target !== "") { - // The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present - if(target.indexOf("[[") === 0 && target.substr(-2) === "]]") { - target = target.substr(2,target.length - 4); - } - $tw.wiki.addToHistory(target); - } else if(storyList.length > 0) { - $tw.wiki.addToHistory(storyList[0]); + // Update history + if(!options.disableHistory) { + // If a target tiddler was specified add it to the history stack + if(target && target !== "") { + // The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present + if(target.indexOf("[[") === 0 && target.substr(-2) === "]]") { + target = target.substr(2,target.length - 4); + } + $tw.wiki.addToHistory(target); + } else if(storyList.length > 0) { + $tw.wiki.addToHistory(storyList[0]); + } } } From a9e595c3f633391003224e499440cdeb8560c055 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 4 Mar 2019 16:59:39 +0000 Subject: [PATCH 0021/2376] Dynaview: Add support for saving/restoring scroll position from local storage --- .../RestoreScrollPositionAtStartup.tid | 2 + plugins/tiddlywiki/dynaview/docs.tid | 12 ++++- plugins/tiddlywiki/dynaview/dynaview.js | 49 +++++++++++++++++-- 3 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 editions/dynaviewdemo/tiddlers/RestoreScrollPositionAtStartup.tid diff --git a/editions/dynaviewdemo/tiddlers/RestoreScrollPositionAtStartup.tid b/editions/dynaviewdemo/tiddlers/RestoreScrollPositionAtStartup.tid new file mode 100644 index 000000000..7d2f673e7 --- /dev/null +++ b/editions/dynaviewdemo/tiddlers/RestoreScrollPositionAtStartup.tid @@ -0,0 +1,2 @@ +title: $:/config/DynaView/RestoreScrollPositionAtStartup +text: yes diff --git a/plugins/tiddlywiki/dynaview/docs.tid b/plugins/tiddlywiki/dynaview/docs.tid index f9492254d..bf55007fa 100644 --- a/plugins/tiddlywiki/dynaview/docs.tid +++ b/plugins/tiddlywiki/dynaview/docs.tid @@ -13,12 +13,18 @@ The components of this plugin include: ! Scroll Features -!! Scroll Position Preservation +!! Scroll position preservation during refresh Some recent browsers have a feature called "scroll anchoring" whereby they suppress the apparent scrolling that occurs when elements are inserted or removed above the current viewport. (See https://github.com/WICG/ScrollAnchoring for more details). ~DynaView can optionally polyfill this behaviour for older browsers by setting the configuration tiddler $:/config/DynaView/PreserveScrollPosition to `yes`. +!! Startup scroll position restoration + +Optionally, ~DynaView can store the current scroll position in local storage and restore it upon startup. Set the configuration tiddler $:/config/DynaView/RestoreScrollPositionAtStartup to `yes`. + +Note that it is not recommended to use this setting at the same time as the "UpdateAddressBar" option. + !! Set tiddler field when visible The background task detects when elements with the class `tc-dynaview-set-tiddler-when-visible` scroll into view. The first time that they do, the background task assigns the value in the attribute `data-dynaview-set-value` to the tiddler whose title is in the attribute `data-dynaview-set-tiddler`. This assignment can be tied to a reveal widget to cause content to be displayed when it becomes visible. If the class `tc-dynaview-expand-viewport` is set then the viewport is expanded so that the processing occurs when elements move near the viewport. @@ -29,7 +35,9 @@ The background task detects when elements with the class `tc-dynaview-set-tiddle !! Update address bar when scrolling -The background task detects the tiddler at the top of the viewport and sets the address bar location hash to the title of that tiddler. +If the configuration tiddler $:/config/DynaView/UpdateAddressBar is set to `yes` the background task detects the tiddler at the top of the viewport and sets the address bar location hash to the title of that tiddler. + +Note that it is not recommended to use this setting at the same time as the "RestoreScrollPositionAtStartup" option. ! Viewport Size Features diff --git a/plugins/tiddlywiki/dynaview/dynaview.js b/plugins/tiddlywiki/dynaview/dynaview.js index ae67de024..fbf787847 100644 --- a/plugins/tiddlywiki/dynaview/dynaview.js +++ b/plugins/tiddlywiki/dynaview/dynaview.js @@ -15,7 +15,7 @@ Zoom everything // Export name and synchronous status exports.name = "dynaview"; exports.platforms = ["browser"]; -exports.after = ["render"]; +exports.before = ["story"]; exports.synchronous = true; var isWaitingForAnimationFrame = 0, // Bitmask: @@ -23,22 +23,33 @@ var isWaitingForAnimationFrame = 0, // Bitmask: ANIM_FRAME_CAUSED_BY_SCROLL = 2, // Animation frame was requested because of page scroll ANIM_FRAME_CAUSED_BY_RESIZE = 4; // Animation frame was requested because of window resize +var LOCAL_STORAGE_KEY_PREFIX = "tw5-dynaview-scroll-position#"; + +var hasRestoredScrollPosition = false; + exports.startup = function() { var topmost = null, lastScrollY; + $tw.boot.disableStartupNavigation = true; window.addEventListener("load",onLoad,false); window.addEventListener("scroll",onScroll,false); window.addEventListener("resize",onResize,false); $tw.hooks.addHook("th-page-refreshing",function() { - if(shouldPreserveScrollPosition()) { + if(!hasRestoredScrollPosition) { + topmost = restoreScrollPosition(); + } else if(shouldPreserveScrollPosition()) { topmost = findTopmostTiddler(); } lastScrollY = window.scrollY; }); $tw.hooks.addHook("th-page-refreshed",function() { if(lastScrollY === window.scrollY) { // Don't do scroll anchoring if the scroll position got changed - scrollToTiddler(topmost); + if(shouldPreserveScrollPosition() || !hasRestoredScrollPosition) { + scrollToTiddler(topmost); + hasRestoredScrollPosition = true; + } } updateAddressBar(); + saveScrollPosition(); checkVisibility(); saveViewportDimensions(); }); @@ -71,6 +82,7 @@ function worker() { } setZoomClasses(); updateAddressBar(); + saveScrollPosition(); checkVisibility(); isWaitingForAnimationFrame = 0; } @@ -157,11 +169,40 @@ function updateAddressBar() { } } +function saveScrollPosition() { + if(hasRestoredScrollPosition && $tw.wiki.getTiddlerText("$:/config/DynaView/RestoreScrollPositionAtStartup") === "yes") { + var top = findTopmostTiddler(); + if(top.element) { + try { + window.localStorage.setItem(LOCAL_STORAGE_KEY_PREFIX + window.location.pathname,JSON.stringify({ + title: top.title, + offset: top.offset + })); + } catch(e) { + console.log("Error setting local storage",e) + } + } + } +} + +function restoreScrollPosition() { + var str = window.localStorage.getItem(LOCAL_STORAGE_KEY_PREFIX + window.location.pathname), + json; + if(str) { + try { + json = JSON.parse(str); + } catch(e) { + // Ignore errors + }; + } + return json; +} + /* tiddlerDetails: {title: , offset: <offset in pixels from the top of the tiddler>} */ function scrollToTiddler(tiddlerDetails) { - if(shouldPreserveScrollPosition() && !$tw.pageScroller.isScrolling() && tiddlerDetails) { + if(!$tw.pageScroller.isScrolling() && tiddlerDetails) { var elements = document.querySelectorAll(".tc-tiddler-frame[data-tiddler-title]"), topmostTiddlerElement = null; $tw.utils.each(elements,function(element) { From 0c2689dd78e47b211ed4f2ec7586dea03dcc3a9a Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Tue, 5 Mar 2019 15:43:14 +0000 Subject: [PATCH 0022/2376] SaverHandler: Don't generate file if autosave disabled --- core/modules/saver-handler.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/modules/saver-handler.js b/core/modules/saver-handler.js index 1c9b519f3..44dc130ff 100644 --- a/core/modules/saver-handler.js +++ b/core/modules/saver-handler.js @@ -151,8 +151,12 @@ Save the wiki contents. Options are: SaverHandler.prototype.saveWiki = function(options) { options = options || {}; var self = this, - method = options.method || "save", - variables = options.variables || {}, + method = options.method || "save"; + // Ignore autosave if disabled + if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") { + return false; + } + var variables = options.variables || {}, template = options.template || "$:/core/save/all", downloadType = options.downloadType || "text/plain", text = this.wiki.renderTiddler(downloadType,template,options), @@ -171,10 +175,6 @@ SaverHandler.prototype.saveWiki = function(options) { } } }; - // Ignore autosave if disabled - if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") { - return false; - } // Call the highest priority saver that supports this method for(var t=this.savers.length-1; t>=0; t--) { var saver = this.savers[t]; From 6de13e2f60b65e4ac22e999ef58b3f6f58a50686 Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Tue, 5 Mar 2019 22:22:55 +0000 Subject: [PATCH 0023/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.20.tid | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index d0aff06d2..b2b203645 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -1,6 +1,6 @@ caption: 5.1.20 created: 20181220163418974 -modified: 20181220163418974 +modified: 20190305165612365 tags: ReleaseNotes title: Release 5.1.20 type: text/vnd.tiddlywiki @@ -9,7 +9,11 @@ type: text/vnd.tiddlywiki !! Major Improvements -Added several new [[Mathematics Operators]] for working with numbers. +Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. + +Added serveral new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[concat|concat Operator]], [[split|split Operator]] and [[join|join Operator]]. + +Added several new palettes. See the [[palette manager|$:/core/ui/ControlPanel/Palette]]. !! Plugin Improvements @@ -17,6 +21,10 @@ New and improved plugins: * New [[BrowserStorage Plugin]] for saving tiddlers in browser local storage * New [[Innerwiki Plugin]] for rendering TiddlyWiki screenshots +* Several improvements to the [[CodeMirror Plugin]]: +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent +* Several improvements to the [[DynaView Plugin]]: +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage !! Translation Improvements @@ -30,17 +38,28 @@ New and improved translations: * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/5a37a84a54f2dc9ccf106309b739cfa693bae3e3]] the plugin library to search all plugin fields * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e5f3301c1c36e8add4ed89ab1bd53a9b68411d3f]] a warning when core JavaScript modules are overwritten via import * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3654]] prompt for references when renaming a tiddler +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0e6855eba8945e023cc5ef19809cfb6d6025627b]] a new filter preset for advanced search for "tiddlers modified this session" !! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/36e76429b1a1d4638374d513430393db5693b932]] new `[is[variable]]` option to the [[is Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/94f143bf643e36e817d1dd5b678515853eed6aca]] optional autofocus for the text inputs in $:/AdvancedSearch (controlled by the same [[Hidden Setting: Search AutoFocus]] as the sidebar search) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3677]] support for deflate and gzip compression to the WebServer ListenCommand +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3756]] optional ''tabindex'' attribute to simple, framed and CodeMirror text editor engines +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3758]] ''tabindex'' attributes to edit templates +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3822]] outline colour to button, textarea, input +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/477c41f84304ed83245c87068dba3695a5053d62]] ''tooltip'' attribute to SelectWidget +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/348a0bc8bcbf5c42d9b93e5e208696d28fc95cb7]] an option for plugins to disable the initial navigation at startup !! Bug Fixes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8b04cfd4d5142a957f2e3da80c3f079e215b9e75]] a long standing problem with the main standalone HTML file template whereby raw markup tiddlers would be included even if not selected by the save filter * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3572]] overlapping dropdowns with sticky titles enabled * [[Removed|https://github.com/Jermolene/TiddlyWiki5/pull/3749]] apparently obsolete limitation of selection wrapping in text editor * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3745]] bug in RevealWidget when stateTitle tiddler is missing +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/72f2a9425197b013ab3664e1679c6763d92d4382]] bug with animation duration being blank +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3806]] Firefox problem with drag and drop placeholders in the "open" tab of the sidebar +* [[Ameliorated|https://github.com/Jermolene/TiddlyWiki5/pull/3809]] Firefox problem with sticky placeholder during drag and drop operations !! Developer Bug Fixes and Improvements From c036c228269fc30d0df770a7c7713fd9af829df7 Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Thu, 7 Mar 2019 18:42:49 +0000 Subject: [PATCH 0024/2376] Add $:/info/browser/language to the info mechanism --- core/modules/info/platform.js | 2 ++ editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/modules/info/platform.js b/core/modules/info/platform.js index ce258daea..94991ea80 100644 --- a/core/modules/info/platform.js +++ b/core/modules/info/platform.js @@ -35,6 +35,8 @@ exports.getInfoTiddlerFields = function() { // Screen size infoTiddlerFields.push({title: "$:/info/browser/screen/width", text: window.screen.width.toString()}); infoTiddlerFields.push({title: "$:/info/browser/screen/height", text: window.screen.height.toString()}); + // Language + infoTiddlerFields.push({title: "$:/info/browser/language", text: navigator.language || ""}); } return infoTiddlerFields; }; diff --git a/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid index 3187bea2f..d095b5a61 100644 --- a/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid @@ -1,5 +1,5 @@ created: 20140720164948099 -modified: 20161017122011379 +modified: 20190307175403915 tags: Mechanisms title: InfoMechanism type: text/vnd.tiddlywiki @@ -14,6 +14,7 @@ System tiddlers in the namespace `$:/info/` are used to expose information about |!Title |!Description | |[[$:/info/browser]] |Running in the browser? ("yes" or "no") | +|[[$:/info/browser/language]] |<<.from-version "5.1.20">> Language as reported by browser (note that some browsers report two character codes such as `en` while others report full codes such as `en-GB`) | |[[$:/info/browser/screen/width]] |Screen width in pixels | |[[$:/info/browser/screen/height]] |Screen height in pixels | |[[$:/info/node]] |Running under [[Node.js]]? ("yes" or "no") | From 2c2d03f7a76f81b68a9bce2e84f7fb05e1197a9b Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Thu, 7 Mar 2019 18:43:23 +0000 Subject: [PATCH 0025/2376] Refactor startup action execution so that they can switch language/theme --- core/modules/startup/startup.js | 42 ++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/core/modules/startup/startup.js b/core/modules/startup/startup.js index 442ba67ad..8c2153ea1 100755 --- a/core/modules/startup/startup.js +++ b/core/modules/startup/startup.js @@ -55,6 +55,27 @@ exports.startup = function() { $tw.version = $tw.utils.extractVersionInfo(); // Set up the performance framework $tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,"no") === "yes"); + // Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers + $tw.rootWidget = new widget.widget({ + type: "widget", + children: [] + },{ + wiki: $tw.wiki, + document: $tw.browser ? document : $tw.fakeDocument + }); + // Execute any startup actions + var executeStartupTiddlers = function(tag) { + $tw.utils.each($tw.wiki.filterTiddlers("[all[shadows+tiddlers]tag[" + tag + "]!has[draft.of]]"),function(title) { + $tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget); + }); + }; + executeStartupTiddlers("$:/tags/StartupAction"); + if($tw.browser) { + executeStartupTiddlers("$:/tags/StartupAction/Browser"); + } + if($tw.node) { + executeStartupTiddlers("$:/tags/StartupAction/Node"); + } // Kick off the language manager and switcher $tw.language = new $tw.Language(); $tw.languageSwitcher = new $tw.PluginSwitcher({ @@ -95,27 +116,6 @@ exports.startup = function() { handlerMethod: "handleKeydownEvent" }]); } - // Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers - $tw.rootWidget = new widget.widget({ - type: "widget", - children: [] - },{ - wiki: $tw.wiki, - document: $tw.browser ? document : $tw.fakeDocument - }); - // Execute any startup actions - var executeStartupTiddlers = function(tag) { - $tw.utils.each($tw.wiki.filterTiddlers("[all[shadows+tiddlers]tag[" + tag + "]!has[draft.of]]"),function(title) { - $tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget); - }); - }; - executeStartupTiddlers("$:/tags/StartupAction"); - if($tw.browser) { - executeStartupTiddlers("$:/tags/StartupAction/Browser"); - } - if($tw.node) { - executeStartupTiddlers("$:/tags/StartupAction/Node"); - } // Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup $tw.wiki.clearTiddlerEventQueue(); // Find a working syncadaptor From f047e7cbf50edcf4775b50bdebc3f704970b8cde Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Thu, 7 Mar 2019 18:45:52 +0000 Subject: [PATCH 0026/2376] Add example startup action to switch to browser language --- editions/full/tiddlers/Startup-SetLanguage.tid | 4 ++++ editions/tw5.com/tiddlers/features/StartupActions.tid | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 editions/full/tiddlers/Startup-SetLanguage.tid diff --git a/editions/full/tiddlers/Startup-SetLanguage.tid b/editions/full/tiddlers/Startup-SetLanguage.tid new file mode 100644 index 000000000..60c5e3c0e --- /dev/null +++ b/editions/full/tiddlers/Startup-SetLanguage.tid @@ -0,0 +1,4 @@ +title: $:/_Startup/SetLanguage +tags: $:/tags/StartupAction + +<$action-setfield $tiddler="$:/language" text={{{ [[$:/languages/en-GB]] [plugin-type[language]sort[description]removeprefix[$:/languages/]] +[prefix{$:/info/browser/language}] ~[[en-GB]] +[addprefix[$:/languages/]] }}}/> diff --git a/editions/tw5.com/tiddlers/features/StartupActions.tid b/editions/tw5.com/tiddlers/features/StartupActions.tid index e1aa53204..c6ababfba 100644 --- a/editions/tw5.com/tiddlers/features/StartupActions.tid +++ b/editions/tw5.com/tiddlers/features/StartupActions.tid @@ -1,10 +1,10 @@ created: 20180323092308399 -modified: 20180323092547312 +modified: 20190307183936035 tags: Features title: StartupActions type: text/vnd.tiddlywiki -During startup, TiddlyWiki executes any ActionWidgets found in tiddlers with the following system tags: +TiddlyWiki executes any ActionWidgets found in tiddlers with the following system tags during startup: * <<tag "$:/tags/StartupAction">> (executed on all platforms) * <<tag "$:/tags/StartupAction/Browser">> (only executed when running in the browser) @@ -22,6 +22,12 @@ Startup actions are useful for customising TiddlyWiki according to environmental </$reveal> ``` +<<.from-version "5.1.20">> This example switches to the language plugin matching the language reported by the browser: + +``` +<$action-setfield $tiddler="$:/language" text={{{ [[$:/languages/en-GB]] [plugin-type[language]sort[description]removeprefix[$:/languages/]] +[prefix{$:/info/browser/language}] ~[[en-GB]] +[addprefix[$:/languages/]] }}}/> +``` + Note that global macros are not available within startup action tiddlers by default. If you need to access them then you'll need to explicitly include them with an ''import'' [[pragma|Pragma]] at the top of the tiddler: ``` From e61c71961bed2864ba0c34934530f2dd97c2ff8a Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Thu, 7 Mar 2019 18:46:24 +0000 Subject: [PATCH 0027/2376] Fix default language It is supposed to be the built-in core language, en-GB --- core/modules/startup/startup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/startup/startup.js b/core/modules/startup/startup.js index 8c2153ea1..4cd53dfcd 100755 --- a/core/modules/startup/startup.js +++ b/core/modules/startup/startup.js @@ -83,7 +83,7 @@ exports.startup = function() { pluginType: "language", controllerTitle: "$:/language", defaultPlugins: [ - "$:/languages/en-US" + "$:/languages/en-GB" ], onSwitch: function(plugins) { if($tw.browser) { From 07635d7b3e7311946ca2b27107422efb482ed1af Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Thu, 7 Mar 2019 18:46:38 +0000 Subject: [PATCH 0028/2376] Full edition: Fix plugin display --- editions/full/tiddlers/HelloThere.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/full/tiddlers/HelloThere.tid b/editions/full/tiddlers/HelloThere.tid index 3266eb44a..d354a6e49 100644 --- a/editions/full/tiddlers/HelloThere.tid +++ b/editions/full/tiddlers/HelloThere.tid @@ -8,5 +8,5 @@ It is intended for use in testing TiddlyWiki - in particular, for switching betw --- -{{$:/core/ui/ControlPanel/Plugins/Installed}} +{{$:/core/ui/ControlPanel/Plugins}} From 12630d4a91b4cc7b1eb846c3afbeda16858df05a Mon Sep 17 00:00:00 2001 From: Jermolene <jeremy@jermolene.com> Date: Fri, 8 Mar 2019 16:43:04 +0000 Subject: [PATCH 0029/2376] Provide an option for the load command to not error if no tiddlers are found --- core/language/en-GB/Help/load.tid | 6 ++++-- core/modules/commands/load.js | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/language/en-GB/Help/load.tid b/core/language/en-GB/Help/load.tid index afc8642cb..2999f60c5 100644 --- a/core/language/en-GB/Help/load.tid +++ b/core/language/en-GB/Help/load.tid @@ -4,10 +4,12 @@ description: Load tiddlers from a file Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly. ``` ---load <filepath> ---load <dirpath> +--load <filepath> [noerror] +--load <dirpath> [noerror] ``` +By default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional "noerror" parameter. + To load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example: ``` diff --git a/core/modules/commands/load.js b/core/modules/commands/load.js index 230a253d5..8fd9cba10 100644 --- a/core/modules/commands/load.js +++ b/core/modules/commands/load.js @@ -38,7 +38,7 @@ Command.prototype.execute = function() { count++; }); }); - if(!count) { + if(!count && self.params[1] !== "noerror") { self.callback("No tiddlers found in file \"" + self.params[0] + "\""); } else { self.callback(null); From 7478ba916505babf266c5a82b722ae4befe05d61 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sat, 9 Mar 2019 21:17:54 +0800 Subject: [PATCH 0030/2376] Update Chinese languages (#3837) * Add initial translation for zh-TW depends on zh-Hant * Add initial translation for zh-CN depends on zh-Hans * Add initial translation for zh-HK depends on zh-Hant * Update chinese help texts for load command * for the new optional "noerror" parameter --- languages/zh-CN/icon.tid | 18 ++++++++++++++++++ languages/zh-CN/plugin.info | 10 ++++++++++ languages/zh-HK/icon.tid | 16 ++++++++++++++++ languages/zh-HK/plugin.info | 10 ++++++++++ languages/zh-Hans/Help/load.tid | 6 ++++-- languages/zh-Hans/plugin.info | 3 ++- languages/zh-Hant/Help/load.tid | 6 ++++-- languages/zh-Hant/plugin.info | 3 ++- languages/zh-TW/icon.tid | 14 ++++++++++++++ languages/zh-TW/plugin.info | 10 ++++++++++ 10 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 languages/zh-CN/icon.tid create mode 100644 languages/zh-CN/plugin.info create mode 100644 languages/zh-HK/icon.tid create mode 100644 languages/zh-HK/plugin.info create mode 100644 languages/zh-TW/icon.tid create mode 100644 languages/zh-TW/plugin.info diff --git a/languages/zh-CN/icon.tid b/languages/zh-CN/icon.tid new file mode 100644 index 000000000..29cb7b9f1 --- /dev/null +++ b/languages/zh-CN/icon.tid @@ -0,0 +1,18 @@ +title: $:/languages/zh-CN/icon +type: image/svg+xml + +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="1500" height="1000" viewBox="-5 -5 30 20"> +<title>Flag of the People's Republic of China + + + + + + + + + + diff --git a/languages/zh-CN/plugin.info b/languages/zh-CN/plugin.info new file mode 100644 index 000000000..aff7a8c6c --- /dev/null +++ b/languages/zh-CN/plugin.info @@ -0,0 +1,10 @@ +{ + "title": "$:/languages/zh-CN", + "name": "zh-CN", + "plugin-type": "language", + "description": "Chinese (China)", + "author": "BramChen", + "core-version": ">=5.0.8", + "dependents": ["$:/languages/zh-Hans"], + "plugin-priority": 110 +} diff --git a/languages/zh-HK/icon.tid b/languages/zh-HK/icon.tid new file mode 100644 index 000000000..38c8ff096 --- /dev/null +++ b/languages/zh-HK/icon.tid @@ -0,0 +1,16 @@ +title: $:/languages/zh-HK/icon +type: image/svg+xml + + + + + + + + + + + + + + \ No newline at end of file diff --git a/languages/zh-HK/plugin.info b/languages/zh-HK/plugin.info new file mode 100644 index 000000000..ab9b8b39b --- /dev/null +++ b/languages/zh-HK/plugin.info @@ -0,0 +1,10 @@ +{ + "title": "$:/languages/zh-HK", + "name": "zh-HK", + "plugin-type": "language", + "description": "Chinese (Hong Kong)", + "author": "BramChen", + "core-version": ">=5.0.8", + "dependents": ["$:/languages/zh-Hant"], + "plugin-priority": 110 +} diff --git a/languages/zh-Hans/Help/load.tid b/languages/zh-Hans/Help/load.tid index 586e277ef..b7a16bc0c 100644 --- a/languages/zh-Hans/Help/load.tid +++ b/languages/zh-Hans/Help/load.tid @@ -4,10 +4,12 @@ description: 从文件中加载条目 从 TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` 或其他本机文件加载条目。应用的处理程序取决于导入文件的扩展名。如果您需要明确指定解串器和编码,请改用 `import` 命令。 ``` ---load ---load +--load [noerror] +--load [noerror] ``` +默认情况下, 如果未找到条目,load 命令会引发错误。通过提供可选的 "noerror" 参数可以抑制该错误。 + 从已加密的 TiddlyWiki 文件中加载条目,须使用 PasswordCommand 指定密码,例如: ``` diff --git a/languages/zh-Hans/plugin.info b/languages/zh-Hans/plugin.info index f94d74a86..37532db38 100644 --- a/languages/zh-Hans/plugin.info +++ b/languages/zh-Hans/plugin.info @@ -4,5 +4,6 @@ "plugin-type": "language", "description": "Chinese (Simplified)", "author": "BramChen", - "core-version": ">=5.0.8" + "core-version": ">=5.0.8", + "plugin-priority": 100 } diff --git a/languages/zh-Hant/Help/load.tid b/languages/zh-Hant/Help/load.tid index 482aa2cb8..2e2684625 100644 --- a/languages/zh-Hant/Help/load.tid +++ b/languages/zh-Hant/Help/load.tid @@ -4,10 +4,12 @@ description: 從檔案中載入條目 從 TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` 或其他本機檔案載入條目。應用的處理程序取決於導入檔案的副檔名。如果您需要明確指定解串器和編碼,請改用 `import` 命令。 ``` ---load ---load +--load [noerror] +--load [noerror] ``` +預設情況下, 如果未找到條目,load 命令會引發錯誤。通過提供可選的 "noerror" 參數可以抑制該錯誤。 + 從已加密的 TiddlyWiki 檔案中載入條目,須使用 PasswordCommand 指定密碼,例如: ``` diff --git a/languages/zh-Hant/plugin.info b/languages/zh-Hant/plugin.info index 6add7d918..596c5edfb 100644 --- a/languages/zh-Hant/plugin.info +++ b/languages/zh-Hant/plugin.info @@ -4,5 +4,6 @@ "plugin-type": "language", "description": "Chinese (Traditional)", "author": "BramChen", - "core-version": ">=5.0.8" + "core-version": ">=5.0.8", + "plugin-priority": 100 } diff --git a/languages/zh-TW/icon.tid b/languages/zh-TW/icon.tid new file mode 100644 index 000000000..5db3cae30 --- /dev/null +++ b/languages/zh-TW/icon.tid @@ -0,0 +1,14 @@ +title: $:/languages/zh-TW/icon +type: image/svg+xml + + + + + + + + + + + + \ No newline at end of file diff --git a/languages/zh-TW/plugin.info b/languages/zh-TW/plugin.info new file mode 100644 index 000000000..d342f9a76 --- /dev/null +++ b/languages/zh-TW/plugin.info @@ -0,0 +1,10 @@ +{ + "title": "$:/languages/zh-TW", + "name": "zh-TW", + "plugin-type": "language", + "description": "Chinese (Taiwan)", + "author": "BramChen", + "core-version": ">=5.0.8", + "dependents": ["$:/languages/zh-Hant"], + "plugin-priority": 110 +} From a7dc8b5583336460a0f0cfd85c0e9c62ae1e6f9b Mon Sep 17 00:00:00 2001 From: Joshua Fontany Date: Sat, 9 Mar 2019 08:39:13 -0800 Subject: [PATCH 0031/2376] Signing the CLA (#3838) * Signing the CLA * added json mangler resource --- .../Json Mangler plugin by Joshua Fontany.tid | 12 ++++++++++++ licenses/cla-individual.md | 2 ++ 2 files changed, 14 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid diff --git a/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid b/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid new file mode 100644 index 000000000..a02972a63 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid @@ -0,0 +1,12 @@ +created: 20190308041321498 +modified: 20190308042014046 +tags: Resources +title: Json Mangler plugin by Joshua Fontany + +Extend tiddlywiki to parse complex ("nested") json data tiddlers. + +Json Mangler introduces a new path syntax for indexes of json data tiddlers , and includes many supporting tools, filters, widgets, etc. + +Example Wiki: https://joshuafontany.github.io/TW5-JsonManglerPlugin/ + +Source: https://github.com/joshuafontany/TW5-JsonManglerPlugin \ No newline at end of file diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 26f23e109..cf8c61298 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -353,3 +353,5 @@ Ben Webber, @benwebber, 2019/01/09 Jesse Weinstein, @JesseWeinstein, 2019/01/14 Adam Sherwood, @admls, 2019/01/27 + +Joshua Fontany, @joshuafontany, 2019/03/07 \ No newline at end of file From 449fd02cdae71a8d12188b60e1b311b2a70bc82a Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 9 Mar 2019 18:08:58 +0100 Subject: [PATCH 0032/2376] Update Nord palette + solarized light palette (#3828) * update Nord palette * small change * port solarized light palette * Update SolarizedLight.tid --- core/palettes/Nord.tid | 26 +++---- core/palettes/SolarizedLight.tid | 118 +++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 core/palettes/SolarizedLight.tid diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index 73b278a99..f2d0ddea5 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -5,10 +5,10 @@ tags: $:/tags/Palette type: application/x-tiddler-dictionary license: MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md -alert-background: #EBCB8B +alert-background: #D08770 alert-border: #D08770 alert-highlight: #B48EAD -alert-muted-foreground: #D08770 +alert-muted-foreground: #4C566A background: #3b4252 blockquote-bar: <> button-background: #4C566A @@ -32,8 +32,8 @@ dragger-background: <> dragger-foreground: <> dropdown-background: <> dropdown-border: <> -dropdown-tab-background-selected: #fff -dropdown-tab-background: #ececec +dropdown-tab-background-selected: #ECEFF4 +dropdown-tab-background: #4C566A dropzone-background: #A3BE8C external-link-background-hover: inherit external-link-background-visited: inherit @@ -51,9 +51,9 @@ modal-border: #3b4252 modal-footer-background: #3b4252 modal-footer-border: #3b4252 modal-header-border: #3b4252 -muted-foreground: #434C5E -notification-background: #EBCB8B -notification-border: #D08770 +muted-foreground: #4C566A +notification-background: #D08770 +notification-border: #EBCB8B page-background: #2e3440 pre-background: #2E3440 pre-border: #2E3440 @@ -63,7 +63,7 @@ select-tag-foreground: <> sidebar-button-foreground: <> sidebar-controls-foreground-hover: #4C566A sidebar-controls-foreground: #3B4252 -sidebar-foreground-shadow: #4C566A +sidebar-foreground-shadow: transparent sidebar-foreground: #D8DEE9 sidebar-muted-foreground-hover: #4C566A sidebar-muted-foreground: #4C566A @@ -85,15 +85,15 @@ tab-border: #4C566A tab-divider: #4C566A tab-foreground-selected: #4C566A tab-foreground: #D8DEE9 -table-border: #434C5E +table-border: #4C566A table-footer-background: #2e3440 -table-header-background: #3B4252 +table-header-background: #2e3440 tag-background: #A3BE8C tag-foreground: #4C566A tiddler-background: <> tiddler-border: <> tiddler-controls-foreground-hover: -tiddler-controls-foreground-selected: #2E3440 +tiddler-controls-foreground-selected: #EBCB8B tiddler-controls-foreground: #4C566A tiddler-editor-background: #2e3440 tiddler-editor-border-image: #2e3440 @@ -116,5 +116,5 @@ toolbar-close-button: toolbar-delete-button: toolbar-cancel-button: toolbar-done-button: -untagged-background: #3B4252 -very-muted-foreground: #3B4252 +untagged-background: #2d3038 +very-muted-foreground: #2d3038 diff --git a/core/palettes/SolarizedLight.tid b/core/palettes/SolarizedLight.tid new file mode 100644 index 000000000..c5dfb3eaa --- /dev/null +++ b/core/palettes/SolarizedLight.tid @@ -0,0 +1,118 @@ +title: $:/palettes/SolarizedLight +description: Precision colors for machines and people +license: MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE +name: SolarizedLight + +alert-background: #eee8d5 +alert-border: #073642 +alert-highlight: #cb4b16 +alert-muted-foreground: #586e75 +background: #fdf6e3 +blockquote-bar: <> +button-background: #cb4b16 +button-foreground: #fdf6e3 +button-border: transparent +code-background: #eee8d5 +code-border: #93a1a1 +code-foreground: #d33682 +diff-delete-background: #BF616A +diff-delete-foreground: <> +diff-equal-background: +diff-equal-foreground: <> +diff-insert-background: #859900 +diff-insert-foreground: <> +diff-invisible-background: +diff-invisible-foreground: <> +dirty-indicator: #D08770 +download-background: #859900 +download-foreground: <> +dragger-background: <> +dragger-foreground: <> +dropdown-background: <> +dropdown-border: <> +dropdown-tab-background-selected: #fdf6e3 +dropdown-tab-background: #93a1a1 +dropzone-background: #859900 +external-link-background-hover: inherit +external-link-background-visited: inherit +external-link-background: inherit +external-link-foreground-hover: #d33682 +external-link-foreground-visited: #b58900 +external-link-foreground: #cb4b16 +foreground: #839496 +message-background: #586e75 +message-border: #586e75 +message-foreground: #eee8d5 +modal-backdrop: <> +modal-background: <> +modal-border: #eee8d5 +modal-footer-background: #eee8d5 +modal-footer-border: #eee8d5 +modal-header-border: #eee8d5 +muted-foreground: #93a1a1 +notification-background: #EBCB8B +notification-border: #D08770 +page-background: #eee8d5 +pre-background: #eee8d5 +pre-border: #93a1a1 +primary: #2aa198 +select-tag-background: #eee8d5 +select-tag-foreground: <> +sidebar-button-foreground: #eee8d5 +sidebar-controls-foreground-hover: #268bd2 +sidebar-controls-foreground: #586e75 +sidebar-foreground-shadow: transparent +sidebar-foreground: #839496 +sidebar-muted-foreground-hover: #657b83 +sidebar-muted-foreground: #93a1a1 +sidebar-tab-background-selected: #eee8d5 +sidebar-tab-background: #839496 +sidebar-tab-border-selected: <> +sidebar-tab-border: #657b83 +sidebar-tab-divider: <> +sidebar-tab-foreground-selected: #839496 +sidebar-tab-foreground: <> +sidebar-tiddler-link-foreground-hover: #859900 +sidebar-tiddler-link-foreground: #268bd2 +site-title-foreground: <> +static-alert-foreground: #dc322f +tab-background-selected: #fdf6e3 +tab-background: #839496 +tab-border-selected: #93a1a1 +tab-border: #93a1a1 +tab-divider: #fdf6e3 +tab-foreground-selected: #839496 +tab-foreground: #eee8d5 +table-border: #657b83 +table-footer-background: #657b83 +table-header-background: #93a1a1 +tag-background: #6c71c4 +tag-foreground: #eee8d5 +tiddler-background: <> +tiddler-border: <> +tiddler-controls-foreground-hover: #b58900 +tiddler-controls-foreground-selected: #b58900 +tiddler-controls-foreground: #073642 +tiddler-editor-background: #eee8d5 +tiddler-editor-border-image: #eee8d5 +tiddler-editor-border: #eee8d5 +tiddler-editor-fields-even: #eee8d5 +tiddler-editor-fields-odd: #fdf6e3 +tiddler-info-background: #eee8d5 +tiddler-info-border: #eee8d5 +tiddler-info-tab-background: #586e75 +tiddler-link-background: <> +tiddler-link-foreground: <> +tiddler-subtitle-foreground: #586e75 +tiddler-title-foreground: #073642 +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +toolbar-info-button: +toolbar-edit-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-cancel-button: +toolbar-done-button: +untagged-background: #839496 +very-muted-foreground: #93a1a1 From 441011885c24ac979a5d0471670d7703fd4eb813 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 9 Mar 2019 18:09:34 +0100 Subject: [PATCH 0033/2376] Fix: tm-full-screen when event.event undefined (#3835) --- core/modules/startup/rootwidget.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/modules/startup/rootwidget.js b/core/modules/startup/rootwidget.js index 1d24f1db6..84756d11b 100644 --- a/core/modules/startup/rootwidget.js +++ b/core/modules/startup/rootwidget.js @@ -42,15 +42,16 @@ exports.startup = function() { var fullscreen = $tw.utils.getFullScreenApis(); if(fullscreen) { $tw.rootWidget.addEventListener("tm-full-screen",function(event) { + var fullScreenDocument = event.event ? event.event.target.ownerDocument : document; if(event.param === "enter") { - event.event.target.ownerDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT); + fullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT); } else if(event.param === "exit") { - event.event.target.ownerDocument[fullscreen._exitFullscreen](); + fullScreenDocument[fullscreen._exitFullscreen](); } else { - if(event.event.target.ownerDocument[fullscreen._fullscreenElement]) { - event.event.target.ownerDocument[fullscreen._exitFullscreen](); + if(fullScreenDocument[fullscreen._fullscreenElement]) { + fullScreenDocument[fullscreen._exitFullscreen](); } else { - event.event.target.ownerDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT); + fullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT); } } }); From 2dc70682cde946b4bbea0aa91667ef2468b4cbde Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 9 Mar 2019 18:37:15 +0100 Subject: [PATCH 0034/2376] Fix for SolarizedLight palette, missing tag and type (#3844) --- core/palettes/SolarizedLight.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/palettes/SolarizedLight.tid b/core/palettes/SolarizedLight.tid index c5dfb3eaa..13c6b83a5 100644 --- a/core/palettes/SolarizedLight.tid +++ b/core/palettes/SolarizedLight.tid @@ -1,4 +1,6 @@ title: $:/palettes/SolarizedLight +tags: $:/tags/Palette +type: application/x-tiddler-dictionary description: Precision colors for machines and people license: MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE name: SolarizedLight From 648c7ccd1f0266b792e4a06a28dbca3f9e4c9fff Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 9 Mar 2019 18:45:59 +0100 Subject: [PATCH 0035/2376] Add documentation for edit-text tabindex attribute (#3833) * add tabindex attr to edit-text documentation * add tabindex to edit widget documentation --- editions/tw5.com/tiddlers/widgets/EditTextWidget.tid | 3 ++- editions/tw5.com/tiddlers/widgets/EditWidget.tid | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid index e2bcfee59..c1884f1b3 100644 --- a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid @@ -23,7 +23,8 @@ The content of the `<$edit-text>` widget is ignored. |class |A CSS class to be assigned to the generated HTML editing element | |placeholder |Placeholder text to be displayed when the edit field is empty | |focusPopup |Title of a state tiddler for a popup that is displayed when the editing element has focus | -|focus |Set to "yes" or "true" to automatically focus the editor after creation | +|focus |Set to "yes" or "true" to automatically focus the editor after creation | +|tabindex |Sets the `tabindex` attribute of the input or textarea to the given value | |tag |Overrides the generated HTML editing element tag. For a multi-line editor use `tag=textarea`. For a single-line editor use `tag=input` | |type |Overrides the generated HTML editing element `type` attribute | |size |The size of the input field (in characters) | diff --git a/editions/tw5.com/tiddlers/widgets/EditWidget.tid b/editions/tw5.com/tiddlers/widgets/EditWidget.tid index 22b5c8836..04db79002 100644 --- a/editions/tw5.com/tiddlers/widgets/EditWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditWidget.tid @@ -17,3 +17,4 @@ The content of the `<$edit>` widget is ignored. |field |The field to edit (defaults to `text`). Takes precedence over the `index` attribute | |index |The index to edit | |class |A CSS class to be added the generated editing widget | +|tabindex |Sets the `tabindex` attribute of the input or textarea to the given value | From 0ab29e2c09e692821189885463f67c921317a360 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 10 Mar 2019 18:37:05 +0100 Subject: [PATCH 0036/2376] Community Palettes: Twilight by Thomas Elmiger (#3845) --- core/palettes/Twilight.tid | 120 +++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 core/palettes/Twilight.tid diff --git a/core/palettes/Twilight.tid b/core/palettes/Twilight.tid new file mode 100644 index 000000000..d90fef328 --- /dev/null +++ b/core/palettes/Twilight.tid @@ -0,0 +1,120 @@ +title: $:/palettes/Twilight +tags: $:/tags/Palette +author: Thomas Elmiger +type: application/x-tiddler-dictionary +name: Twilight +description: Delightful, soft darkness. + +alert-background: rgb(255, 255, 102) +alert-border: rgb(232, 232, 125) +alert-highlight: rgb(255, 51, 51) +alert-muted-foreground: rgb(224, 82, 82) +background: rgb(38, 38, 38) +blockquote-bar: rgba(240, 196, 117, 0.7) +button-background: rgb(63, 63, 63) +button-border: rgb(127, 127, 127) +button-foreground: rgb(179, 179, 179) +code-background: rgba(0,0,0,0.03) +code-border: rgba(0,0,0,0.08) +code-foreground: rgb(255, 94, 94) +diff-delete-background: #ffc9c9 +diff-delete-foreground: <> +diff-equal-background: +diff-equal-foreground: <> +diff-insert-background: #aaefad +diff-insert-foreground: <> +diff-invisible-background: +diff-invisible-foreground: <> +dirty-indicator: rgb(255, 94, 94) +download-background: #19a974 +download-foreground: rgb(38, 38, 38) +dragger-background: rgb(179, 179, 179) +dragger-foreground: rgb(38, 38, 38) +dropdown-background: rgb(38, 38, 38) +dropdown-border: rgb(255, 255, 255) +dropdown-tab-background: rgba(0,0,0,.1) +dropdown-tab-background-selected: rgba(255,255,255,1) +dropzone-background: #9eebcf +external-link-background: inherit +external-link-background-hover: inherit +external-link-background-visited: inherit +external-link-foreground: rgb(179, 179, 255) +external-link-foreground-hover: inherit +external-link-foreground-visited: rgb(153, 153, 255) +foreground: rgb(179, 179, 179) +message-background: <> +message-border: #96ccff +message-foreground: <> +modal-backdrop: rgb(179, 179, 179) +modal-background: rgb(38, 38, 38) +modal-border: rgba(0,0,0,.5) +modal-footer-background: #f4f4f4 +modal-footer-border: rgba(0,0,0,.1) +modal-header-border: rgba(0,0,0,.2) +muted-foreground: rgb(255, 255, 255) +notification-background: <> +notification-border: <> +page-background: rgb(26, 26, 26) +pre-background: rgb(25, 25, 25) +pre-border: rgba(0,0,0,.2) +primary: rgb(255, 201, 102) +select-tag-background: +select-tag-foreground: +sidebar-button-foreground: rgb(179, 179, 179) +sidebar-controls-foreground: rgb(153, 153, 153) +sidebar-controls-foreground-hover: <> +sidebar-foreground: rgb(141, 141, 141) +sidebar-foreground-shadow: transparent +sidebar-muted-foreground: rgba(0, 0, 0, 0.5) +sidebar-muted-foreground-hover: rgb(141, 141, 141) +sidebar-tab-background: rgba(141, 141, 141, 0.2) +sidebar-tab-background-selected: rgb(26, 26, 26) +sidebar-tab-border: rgb(127, 127, 127) +sidebar-tab-border-selected: rgb(127, 127, 127) +sidebar-tab-divider: rgb(127, 127, 127) +sidebar-tab-foreground: rgb(179, 179, 179) +sidebar-tab-foreground-selected: rgb(179, 179, 179) +sidebar-tiddler-link-foreground: rgb(179, 179, 179) +sidebar-tiddler-link-foreground-hover: rgb(115, 115, 115) +site-title-foreground: rgb(255, 201, 102) +static-alert-foreground: rgba(0,0,0,.3) +tab-background: rgba(0,0,0,0.125) +tab-background-selected: rgb(38, 38, 38) +tab-border: rgb(255, 201, 102) +tab-border-selected: rgb(255, 201, 102) +tab-divider: rgb(255, 201, 102) +tab-foreground: rgb(179, 179, 179) +tab-foreground-selected: rgb(179, 179, 179) +table-border: rgba(255,255,255,.3) +table-footer-background: rgba(0,0,0,.4) +table-header-background: rgba(0,0,0,.1) +tag-background: rgb(255, 201, 102) +tag-foreground: rgb(25, 25, 25) +tiddler-background: rgb(38, 38, 38) +tiddler-border: rgba(240, 196, 117, 0.7) +tiddler-controls-foreground: rgb(128, 128, 128) +tiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8) +tiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9) +tiddler-editor-background: rgb(33, 33, 33) +tiddler-editor-border: rgb(63, 63, 63) +tiddler-editor-border-image: rgb(25, 25, 25) +tiddler-editor-fields-even: rgb(33, 33, 33) +tiddler-editor-fields-odd: rgb(28, 28, 28) +tiddler-info-background: rgb(43, 43, 43) +tiddler-info-border: rgb(25, 25, 25) +tiddler-info-tab-background: rgb(43, 43, 43) +tiddler-link-background: rgb(38, 38, 38) +tiddler-link-foreground: rgb(204, 204, 255) +tiddler-subtitle-foreground: rgb(255, 255, 255) +tiddler-title-foreground: rgb(255, 192, 76) +toolbar-cancel-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-done-button: +toolbar-edit-button: +toolbar-info-button: +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +untagged-background: rgb(255, 255, 255) +very-muted-foreground: rgba(240, 196, 117, 0.7) From 71aed78e2ef6ff79377827b498a1d6c47fe78aa9 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 10 Mar 2019 21:05:18 +0100 Subject: [PATCH 0037/2376] Fix sticky draggable-placeholders in list macros (firefox) (#3823) * fix draggable lists for firefox (sticky placeholders) ff doesn't like whitespace and also those   entities make problems placeholder is styled in vanilla base * tc-droppable-placeholder styles for tagged-draggable ... and links-draggable lists * make it beautiful --- core/wiki/macros/list.tid | 18 +++++++++--------- themes/tiddlywiki/vanilla/base.tid | 3 ++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/core/wiki/macros/list.tid b/core/wiki/macros/list.tid index f20c0a710..0bcafcc1c 100644 --- a/core/wiki/macros/list.tid +++ b/core/wiki/macros/list.tid @@ -20,13 +20,13 @@ tags: $:/tags/Macro \end \define list-links-draggable(tiddler,field:"list",type:"ul",subtype:"li",class:"",itemTemplate) +\whitespace trim + <$vars targetTiddler="""$tiddler$""" targetField="""$field$"""> <$type$ class="$class$"> <$list filter="[list[$tiddler$!!$field$]]"> <$droppable actions=<> tag="""$subtype$"""> -
-  -
+
<$transclude tiddler="""$itemTemplate$"""> <$link to={{!!title}}> @@ -48,6 +48,7 @@ tags: $:/tags/Macro + \end \define list-tagged-draggable-drop-actions(tag) @@ -73,13 +74,13 @@ tags: $:/tags/Macro \end \define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:"div") +\whitespace trim + <$set name="tag" value=<<__tag__>>> <$list filter="[<__tag__>tagging[]$subFilter$]" emptyMessage=<<__emptyMessage__>>> <$elementTag$ class="tc-menu-list-item"> <$droppable actions="""<$macrocall $name="list-tagged-draggable-drop-actions" tag=<<__tag__>>/>"""> -<$elementTag$ class="tc-droppable-placeholder"> -  - +<$elementTag$ class="tc-droppable-placeholder"/> <$elementTag$> <$transclude tiddler="""$itemTemplate$"""> <$link to={{!!title}}> @@ -92,12 +93,11 @@ tags: $:/tags/Macro <$tiddler tiddler=""> <$droppable actions="""<$macrocall $name="list-tagged-draggable-drop-actions" tag=<<__tag__>>/>"""> -<$elementTag$ class="tc-droppable-placeholder"> -  - +<$elementTag$ class="tc-droppable-placeholder"/> <$elementTag$ style="height:0.5em;"> + \end diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 0350fefd8..cf05274df 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -388,7 +388,8 @@ a.tc-tiddlylink-external:hover { cursor: move; } -.tc-sidebar-tab-open .tc-droppable-placeholder { +.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder, +.tc-links-draggable-list .tc-droppable-placeholder { line-height: 2em; height: 2em; } From c9b16d88f337ed56b158e95caa75b53207b13457 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 11 Mar 2019 10:04:17 +0100 Subject: [PATCH 0038/2376] Fix: reveal widget prevent undefined state (#3848) the state didn't fall back to the default when there was no data-item to extract for a stateIndex see the google group for a bug report: https://groups.google.com/forum/#!topic/TiddlyWiki/3jiFpayAIRc --- core/modules/widgets/reveal.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index 6334f0d53..15659e125 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -118,17 +118,18 @@ Read the state tiddler */ RevealWidget.prototype.readState = function() { // Read the information from the state tiddler - var state; + var state, + defaultState = this["default"] || this.getVariable("currentTiddler"); if(this.stateTitle) { var stateTitleTiddler = this.wiki.getTiddler(this.stateTitle); if(this.stateField) { - state = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) : this["default"] || this.getVariable("currentTiddler"); + state = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState; } else if(this.stateIndex) { - state = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) : this["default"] || this.getVariable("currentTiddler"); + state = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState; } else if(stateTitleTiddler) { - state = this.wiki.getTiddlerText(this.stateTitle) || this["default"] || this.getVariable("currentTiddler"); + state = this.wiki.getTiddlerText(this.stateTitle) || defaultState; } else { - state = this["default"] || this.getVariable("currentTiddler"); + state = defaultState; } } else { state = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this["default"],this.getVariable("currentTiddler")) : this["default"]; From f07ffb2b41cad7a3eb7469e6ac72bc6ace46d8a2 Mon Sep 17 00:00:00 2001 From: jdjdjdjdjdjd <37834546+jdjdjdjdjdjd@users.noreply.github.com> Date: Mon, 11 Mar 2019 18:25:16 +0900 Subject: [PATCH 0039/2376] Add @jdjdjdjdjdjd to the CLA (#3849) --- licenses/cla-individual.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index cf8c61298..ba9949937 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -354,4 +354,6 @@ Jesse Weinstein, @JesseWeinstein, 2019/01/14 Adam Sherwood, @admls, 2019/01/27 -Joshua Fontany, @joshuafontany, 2019/03/07 \ No newline at end of file +Joshua Fontany, @joshuafontany, 2019/03/07 + +Irene Castaños, @jdjdjdjdjdjd, 2019/03/11 From b82cf3d07094b78a56dcc26b5be56fe7cb7db077 Mon Sep 17 00:00:00 2001 From: jdjdjdjdjdjd <37834546+jdjdjdjdjdjd@users.noreply.github.com> Date: Mon, 11 Mar 2019 18:25:37 +0900 Subject: [PATCH 0040/2376] Add Spartan Night palette (#3847) * add Spartan Night palette This and Spartan Day go hand in hand I feel like. * Found a typo --- core/palettes/SpartanNight | 110 +++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 core/palettes/SpartanNight diff --git a/core/palettes/SpartanNight b/core/palettes/SpartanNight new file mode 100644 index 000000000..9e5f6b3ba --- /dev/null +++ b/core/palettes/SpartanNight @@ -0,0 +1,110 @@ +title: $:/palettes/SpartanNight +tags: $:/tags/Palette +description: Dark spartan colors +name: Spartan Night + +alert-background: <> +alert-border: <> +alert-highlight: <> +alert-muted-foreground: <> +background: #303030 +blockquote-bar: <> +button-background: transparent +button-foreground: inherit +button-border: <> +code-background: <> +code-border: <> +code-foreground: rgba(255, 255, 255, 0.54) +dirty-indicator: #c80000 +download-background: <> +download-foreground: <> +dragger-background: <> +dragger-foreground: <> +dropdown-background: #424242 +dropdown-border: <> +dropdown-tab-background-selected: <> +dropdown-tab-background: #050505 +dropzone-background: <> +external-link-background-hover: transparent +external-link-background-visited: transparent +external-link-background: transparent +external-link-foreground-hover: +external-link-foreground-visited: #7c318c +external-link-foreground: #9e3eb3 +foreground: rgba(255, 255, 255, 0.7) +message-background: <> +message-border: <> +message-foreground: rgba(255, 255, 255, 0.54) +modal-backdrop: <> +modal-background: <> +modal-border: <> +modal-footer-background: <> +modal-footer-border: <> +modal-header-border: <> +muted-foreground: rgba(255, 255, 255, 0.54) +notification-background: <> +notification-border: <> +page-background: #212121 +pre-background: #2a2a2a +pre-border: transparent +primary: #5656f3 +select-tag-background: <> +select-tag-foreground: <> +sidebar-button-foreground: <> +sidebar-controls-foreground-hover: #494949 +sidebar-controls-foreground: #5d5d5d +sidebar-foreground-shadow: transparent +sidebar-foreground: rgba(255, 255, 255, 0.54) +sidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54) +sidebar-muted-foreground: rgba(255, 255, 255, 0.38) +sidebar-tab-background-selected: <> +sidebar-tab-background: transparent +sidebar-tab-border-selected: <> +sidebar-tab-border: transparent +sidebar-tab-divider: <> +sidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87) +sidebar-tab-foreground: rgba(255, 255, 255, 0.54) +sidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7) +sidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54) +site-title-foreground: rgba(255, 255, 255, 0.7) +static-alert-foreground: #aaaaaa +tab-background-selected: <> +tab-background: transparent +tab-border-selected: <> +tab-border: transparent +tab-divider: <> +tab-foreground-selected: rgba(255, 255, 255, 0.87) +tab-foreground: rgba(255, 255, 255, 0.54) +table-border: #3a3a3a +table-footer-background: <> +table-header-background: <> +tag-background: #ec6 +tag-foreground: <> +tiddler-background: <> +tiddler-border: rgb(55,55,55) +tiddler-controls-foreground-hover: <> +tiddler-controls-foreground-selected: <> +tiddler-controls-foreground: <> +tiddler-editor-background: transparent +tiddler-editor-border-image: +tiddler-editor-border: rgba(255, 255, 255, 0.08) +tiddler-editor-fields-even: rgba(255, 255, 255, 0.1) +tiddler-editor-fields-odd: rgba(255, 255, 255, 0.04) +tiddler-info-background: #454545 +tiddler-info-border: #454545 +tiddler-info-tab-background: <> +tiddler-link-background: <> +tiddler-link-foreground: <> +tiddler-subtitle-foreground: <> +tiddler-title-foreground: #FFFFFF +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +toolbar-info-button: +toolbar-edit-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-cancel-button: +toolbar-done-button: +untagged-background: <> +very-muted-foreground: rgba(255, 255, 255, 0.12) From 26c6d6035eb88f3da05ca719208fe8220b634551 Mon Sep 17 00:00:00 2001 From: jdjdjdjdjdjd <37834546+jdjdjdjdjdjd@users.noreply.github.com> Date: Mon, 11 Mar 2019 18:25:54 +0900 Subject: [PATCH 0041/2376] Add Spartan Day palette (#3846) Ugh, hehe.. this is my first try at this. Hopefully got it right... --- core/palettes/SpartanDay | 110 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 core/palettes/SpartanDay diff --git a/core/palettes/SpartanDay b/core/palettes/SpartanDay new file mode 100644 index 000000000..ba5e07d29 --- /dev/null +++ b/core/palettes/SpartanDay @@ -0,0 +1,110 @@ +title: $:/palettes/SpartanDay +tags: $:/tags/Palette +description: Cold, spartan day colors +name: Spartan Day + +alert-background: <> +alert-border: <> +alert-highlight: <> +alert-muted-foreground: <> +background: #FAFAFA +blockquote-bar: <> +button-background: transparent +button-foreground: inherit +button-border: <> +code-background: #ececec +code-border: #ececec +code-foreground: +dirty-indicator: #c80000 +download-background: <> +download-foreground: <> +dragger-background: <> +dragger-foreground: <> +dropdown-background: #FFFFFF +dropdown-border: <> +dropdown-tab-background-selected: <> +dropdown-tab-background: #F5F5F5 +dropzone-background: <> +external-link-background-hover: transparent +external-link-background-visited: transparent +external-link-background: transparent +external-link-foreground-hover: +external-link-foreground-visited: +external-link-foreground: +foreground: rgba(0, 0, 0, 0.87) +message-background: <> +message-border: <> +message-foreground: rgba(0, 0, 0, 0.54) +modal-backdrop: <> +modal-background: <> +modal-border: <> +modal-footer-background: <> +modal-footer-border: <> +modal-header-border: <> +muted-foreground: rgba(0, 0, 0, 0.54) +notification-background: <> +notification-border: <> +page-background: #f4f4f4 +pre-background: #ececec +pre-border: #ececec +primary: #3949ab +select-tag-background: <> +select-tag-foreground: <> +sidebar-button-foreground: <> +sidebar-controls-foreground-hover: #aeaeae +sidebar-controls-foreground: #c6c6c6 +sidebar-foreground-shadow: transparent +sidebar-foreground: rgba(0, 0, 0, 0.54) +sidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54) +sidebar-muted-foreground: rgba(0, 0, 0, 0.38) +sidebar-tab-background-selected: <> +sidebar-tab-background: transparent +sidebar-tab-border-selected: <> +sidebar-tab-border: transparent +sidebar-tab-divider: <> +sidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87) +sidebar-tab-foreground: rgba(0, 0, 0, 0.54) +sidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87) +sidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54) +site-title-foreground: rgba(0, 0, 0, 0.87) +static-alert-foreground: #aaaaaa +tab-background-selected: <> +tab-background: transparent +tab-border-selected: <> +tab-border: transparent +tab-divider: <> +tab-foreground-selected: rgba(0, 0, 0, 0.87) +tab-foreground: rgba(0, 0, 0, 0.54) +table-border: #d8d8d8 +table-footer-background: <> +table-header-background: <> +tag-background: #ec6 +tag-foreground: <> +tiddler-background: <> +tiddler-border: #f9f9f9 +tiddler-controls-foreground-hover: <> +tiddler-controls-foreground-selected: <> +tiddler-controls-foreground: <> +tiddler-editor-background: transparent +tiddler-editor-border-image: +tiddler-editor-border: #e8e7e7 +tiddler-editor-fields-even: rgba(0, 0, 0, 0.1) +tiddler-editor-fields-odd: rgba(0, 0, 0, 0.04) +tiddler-info-background: #F5F5F5 +tiddler-info-border: #F5F5F5 +tiddler-info-tab-background: <> +tiddler-link-background: <> +tiddler-link-foreground: <> +tiddler-subtitle-foreground: <> +tiddler-title-foreground: #000000 +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +toolbar-info-button: +toolbar-edit-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-cancel-button: +toolbar-done-button: +untagged-background: <> +very-muted-foreground: rgba(0, 0, 0, 0.12) From 784db30614083fbc0fc557965f9bd32844941962 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 11 Mar 2019 10:37:49 +0100 Subject: [PATCH 0042/2376] Fix removesuffix filter when title is undefined (#3827) --- core/modules/filters/removesuffix.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters/removesuffix.js b/core/modules/filters/removesuffix.js index 0dac6e598..3d305aabf 100644 --- a/core/modules/filters/removesuffix.js +++ b/core/modules/filters/removesuffix.js @@ -18,7 +18,7 @@ Export our filter function exports.removesuffix = function(source,operator,options) { var results = []; source(function(tiddler,title) { - if(title.substr(-operator.operand.length) === operator.operand) { + if(title && title.substr(-operator.operand.length) === operator.operand) { results.push(title.substr(0,title.length - operator.operand.length)); } }); From 44d1a00bb0aba9a11766ea5a66e70eeba6181ec9 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 11 Mar 2019 10:38:15 +0100 Subject: [PATCH 0043/2376] Fix "cannot read substr of undefined" in removeprefix filter (#3826) From 0303b7871b7dc67c6d5d19a80fe1a294f23dfc17 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 11 Mar 2019 10:55:14 +0100 Subject: [PATCH 0044/2376] Rename SpartanNight to SpartanNight.tid (#3850) --- core/palettes/{SpartanNight => SpartanNight.tid} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/palettes/{SpartanNight => SpartanNight.tid} (100%) diff --git a/core/palettes/SpartanNight b/core/palettes/SpartanNight.tid similarity index 100% rename from core/palettes/SpartanNight rename to core/palettes/SpartanNight.tid From 0d8c749f376add8ebd9fdaaf980212f3a02c8edf Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 11 Mar 2019 10:55:49 +0100 Subject: [PATCH 0045/2376] Rename SpartanDay to SpartanDay.tid (#3851) * Rename SpartanDay to SpartanDay.tid * Update SpartanDay.tid --- core/palettes/{SpartanDay => SpartanDay.tid} | 1 + 1 file changed, 1 insertion(+) rename core/palettes/{SpartanDay => SpartanDay.tid} (99%) diff --git a/core/palettes/SpartanDay b/core/palettes/SpartanDay.tid similarity index 99% rename from core/palettes/SpartanDay rename to core/palettes/SpartanDay.tid index ba5e07d29..8f722d029 100644 --- a/core/palettes/SpartanDay +++ b/core/palettes/SpartanDay.tid @@ -1,5 +1,6 @@ title: $:/palettes/SpartanDay tags: $:/tags/Palette +type: application/x-tiddler-dictionary description: Cold, spartan day colors name: Spartan Day From d068cb36259fa0c9d1cf4ae469ff3c4454ff65f6 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 11 Mar 2019 11:59:34 +0100 Subject: [PATCH 0046/2376] Fix palette: missing type application/x-tiddler-dictionary (#3852) --- core/palettes/SpartanNight.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/core/palettes/SpartanNight.tid b/core/palettes/SpartanNight.tid index 9e5f6b3ba..f4f672af3 100644 --- a/core/palettes/SpartanNight.tid +++ b/core/palettes/SpartanNight.tid @@ -1,5 +1,6 @@ title: $:/palettes/SpartanNight tags: $:/tags/Palette +type: application/x-tiddler-dictionary description: Dark spartan colors name: Spartan Night From 2e0b2c80459d61d20607bd6b197f68dc49a74b54 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Tue, 12 Mar 2019 10:48:34 +0100 Subject: [PATCH 0047/2376] Palette manager: sort palettes by name, not description (#3853) ... currently it appears as if there was no sorting logic --- core/wiki/paletteswitcher.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/paletteswitcher.tid b/core/wiki/paletteswitcher.tid index 14c647b55..42cda4481 100644 --- a/core/wiki/paletteswitcher.tid +++ b/core/wiki/paletteswitcher.tid @@ -1,8 +1,8 @@ title: $:/snippets/paletteswitcher <$linkcatcher to="$:/palette"> -
<$list filter="[all[shadows+tiddlers]tag[$:/tags/Palette]sort[description]]"><$set name="cls" filter="[all[current]prefix{$:/palette}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item">
>><$link to={{!!title}}>''<$view field="name" format="text"/>'' - <$view field="description" format="text"/>{{||$:/snippets/currpalettepreview}} +
<$list filter="[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]"><$set name="cls" filter="[all[current]prefix{$:/palette}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item">
>><$link to={{!!title}}>''<$view field="name" format="text"/>'' - <$view field="description" format="text"/>{{||$:/snippets/currpalettepreview}}
- \ No newline at end of file + From a4b24670f6c4c348488acc45404896697ea2eecd Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Tue, 12 Mar 2019 13:04:38 +0100 Subject: [PATCH 0048/2376] Update highlight.js to latest release v9.15.6 (#3635) * update highlight.js to latest release v9.13.1 * update to v9.13.1 default.css does the current default.css include adjustments for the different languages? * Update highlight.pack.js * Update readme.tid * update highlight.pack to 9.15.6 * update version number + included languages --- .../tiddlywiki/highlight/files/default.css | 204 +++++++----------- .../highlight/files/highlight.pack.js | 3 +- plugins/tiddlywiki/highlight/readme.tid | 25 ++- 3 files changed, 100 insertions(+), 132 deletions(-) diff --git a/plugins/tiddlywiki/highlight/files/default.css b/plugins/tiddlywiki/highlight/files/default.css index b0ac8b8aa..f1bfade31 100644 --- a/plugins/tiddlywiki/highlight/files/default.css +++ b/plugins/tiddlywiki/highlight/files/default.css @@ -1,6 +1,6 @@ /* -Original style from softwaremaniacs.org (c) Ivan Sagalaev +Original highlight.js style (c) Ivan Sagalaev */ @@ -8,148 +8,92 @@ Original style from softwaremaniacs.org (c) Ivan Sagalaev /gm,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){return/^(no-?highlight|plain|text)$/i.test(e)}function i(e){var n,t,r,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=/\blang(?:uage)?-([\w-]+)\b/i.exec(i))return w(t[1])?t[1]:"no-highlight";for(i=i.split(/\s+/),n=0,r=i.length;r>n;n++)if(w(i[n])||a(i[n]))return i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset"}function u(e){f+=""}function c(e){("start"==e.event?o:u)(e.node)}for(var s=0,f="",l=[];e.length||r.length;){var g=i();if(f+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){l.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);l.reverse().forEach(o)}else"start"==g[0].event?l.push(g[0].node):l.pop(),c(g.splice(0,1)[0])}return f+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\b\w+\b/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var f=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=f.length?t(f.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){for(var t=0;t";return i+=e+'">',i+n+o}function p(){if(!L.k)return n(y);var e="",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=h(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function d(){var e="string"==typeof L.sL;if(e&&!x[L.sL])return n(y);var t=e?f(L.sL,y,!0,M[L.sL]):l(y,L.sL.length?L.sL:void 0);return L.r>0&&(B+=t.r),e&&(M[L.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){return void 0!==L.sL?d():p()}function v(e,t){var r=e.cN?h(e.cN,"",!0):"";e.rB?(k+=r,y=""):e.eB?(k+=n(t)+r,y=""):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=""),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y="",a.starts&&v(a.starts,""),i.rE?0:t.length}if(c(t,L))throw new Error('Illegal lexeme "'+t+'" for mode "'+(L.cN||"")+'"');return y+=t,t.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,L=i||N,M={},k="";for(R=L;R!=N;R=R.parent)R.cN&&(k=h(R.cN,"",!0)+k);var y="",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+="");return{r:B,value:k,language:e,top:L}}catch(O){if(-1!=O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function l(e,t){t=t||E.languages||Object.keys(x);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(w(n)){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function g(e){return E.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,function(e,n){return n.replace(/\t/g,E.tabReplace)})),E.useBR&&(e=e.replace(/\n/g,"
")),e}function h(e,n,t){var r=n?R[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n=i(e);if(!a(n)){var t;E.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):t=e;var r=t.textContent,o=n?f(n,r,!0):l(r),s=u(t);if(s.length){var p=document.createElementNS("http://www.w3.org/1999/xhtml","div");p.innerHTML=o.value,o.value=c(s,u(p),r)}o.value=g(o.value),e.innerHTML=o.value,e.className=h(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){E=o(E,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");Array.prototype.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){R[e]=n})}function N(){return Object.keys(x)}function w(e){return e=e.toLowerCase(),x[e]||x[R[e]]}var E={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},x={},R={};return e.highlight=f,e.highlightAuto=l,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:"^\\[.+\\]:",rB:!0,c:[{cN:"link_reference",b:"\\[",e:"\\]:",eB:!0,eE:!0,starts:{cN:"link_url",e:"$"}}]}]}});hljs.registerLanguage("ruby",function(e){var c="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",b={cN:"doctag",b:"@[A-Za-z]+"},a={cN:"value",b:"#<",e:">"},n=[e.C("#","$",{c:[b]}),e.C("^\\=begin","^\\=end",{c:[b],r:10}),e.C("^__END__","\\n$")],s={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]},i={cN:"params",b:"\\(",e:"\\)",k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(n)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":",c:[t,{b:c}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[a,{cN:"regexp",c:[e.BE,s],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(n),r:0}].concat(n);s.c=d,i.c=d;var o="[>?]>",l="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",N=[{b:/^\s*=>/,cN:"status",starts:{e:"$",c:d}},{cN:"prompt",b:"^("+o+"|"+l+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,c:n.concat(N).concat(d)}});hljs.registerLanguage("makefile",function(e){var a={cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]};return{aliases:["mk","mak"],c:[e.HCM,{b:/^\w+\s*\W*=/,rB:!0,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:!0,starts:{e:/$/,r:0,c:[a]}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,r:0,c:[e.QSM,a]}]}});hljs.registerLanguage("json",function(e){var t={literal:"true false null"},i=[e.QSM,e.CNM],l={cN:"value",e:",",eW:!0,eE:!0,c:i,k:t},c={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[e.BE],i:"\\n",starts:l}],i:"\\S"},n={b:"\\[",e:"\\]",c:[e.inherit(l,{cN:null})],i:"\\S"};return i.splice(i.length,0,c,n),{c:i,k:t,i:"\\S"}});hljs.registerLanguage("xml",function(t){var s="[A-Za-z0-9\\._:-]+",c={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php"},e={eW:!0,i:/]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:!0,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},t.C("",{r:10}),{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[e],starts:{e:"",rE:!0,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[e],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars"]}},c,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:/[^ \/><\n\t]+/,r:0},e]}]}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",a={cN:"function",b:c+"\\(",rB:!0,eE:!0,e:"\\("},r={cN:"rule",b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{cN:"value",eW:!0,eE:!0,c:[a,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,r,{cN:"id",b:/\#[A-Za-z0-9_-]+/},{cN:"class",b:/\.[A-Za-z0-9_-]+/},{cN:"attr_selector",b:/\[/,e:/\]/,i:"$"},{cN:"pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"']+/},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[a,e.ASM,e.QSM,e.CSSNM]}]},{cN:"tag",b:c,r:0},{cN:"rules",b:"{",e:"}",i:/\S/,c:[e.CBCM,r]}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={cN:"variable",v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},o=[e.BE,r,n],i=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:o,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=i,s.c=i,{aliases:["pl"],k:t,c:i}});hljs.registerLanguage("cs",function(e){var r="abstract as base bool break byte case catch char checked const continue decimal dynamic default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long null when object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async protected public private internal ascending descending from get group into join let orderby partial select set value var where yield",t=e.IR+"(<"+e.IR+">)?";return{aliases:["csharp"],k:r,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"xmlDocTag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},e.ASM,e.QSM,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[{cN:"title",b:"[a-zA-Z](\\.?\\w)*",r:0},e.CLCM,e.CBCM]},{bK:"new return throw await",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"tag",b:""},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("http",function(t){return{aliases:["https"],i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"(AV|CA|CF|CG|CI|MK|MP|NS|UI)\\w+"},i={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},o=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:i,l:o,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:o,c:[e.UTM]},{cN:"variable",b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("python",function(e){var r={cN:"prompt",b:/^(>>>|\.\.\.) /},b={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[r],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},e.ASM,e.QSM]},a={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},l={cN:"params",b:/\(/,e:/\)/,c:["self",r,a,b]};return{aliases:["py","gyp"],k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[r,a,b,e.HCM,{v:[{cN:"function",bK:"def",r:10},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,l]},{cN:"decorator",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("java",function(e){var a=e.UIR+"(<"+e.UIR+">)?",t="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private",c="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",r={cN:"number",b:c,r:0};return{aliases:["jsp"],k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+a+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:t,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},r,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,e.NM,s,a,t]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{cN:"operator",bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke",e:/;/,eW:!0,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes c cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle d data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration e each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract f failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function g general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http i id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists k keep keep_duplicates key keys kill l language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim m main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex n name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding p package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime t table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"title",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[t.inherit(t.QSM,{b:'((u8?|U)|L)?"'}),{b:'(u8?|U)?R"',e:'"',c:[t.BE]},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},{b:t.CNR}]},i={cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line pragma ifdef ifndef",c:[{b:/\\\n/,r:0},{bK:"include",e:"$",c:[r,{cN:"string",b:"<",e:">",i:"\\n"}]},r,s,t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf",literal:"true false nullptr NULL"};return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{bK:"new throw return else",r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s]},t.CLCM,t.CBCM,i]}]}});hljs.registerLanguage("php",function(e){var c={cN:"variable",b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},a={cN:"preprocessor",b:/<\?(php)?|\?>/},i={cN:"string",c:[e.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},t={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.CLCM,e.HCM,e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"},a]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},a,c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,i,t]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},i,t]}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},t=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{cN:"property",b:"@"+n},{b:"`",e:"`",eB:!0,eE:!0,sL:"javascript"}];r.c=t;var s=e.inherit(e.TM,{b:n}),i="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(t)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:t.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+i,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:i,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{cN:"attribute",b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("javascript",function(e){return{aliases:["js"],k:{keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},c:[{cN:"pi",r:10,b:/^\s*['"]use (strict|asm)['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{b:/\s*[);\]]/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM]}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{bK:"import",e:"[;$]",k:"import from as",c:[e.ASM,e.QSM]},{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]}],i:/#/}});hljs.registerLanguage("ini",function(e){var c={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"title",b:/^\s*\[+/,e:/\]+/},{cN:"setting",b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",c:[{cN:"value",eW:!0,k:"on off true false yes no",c:[{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},c,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM],r:0}]}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"chunk",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}); \ No newline at end of file +/*! highlight.js v9.15.6 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(a){var E=[],u=Object.keys,N={},g={},n=/^(no-?highlight|plain|text)$/i,R=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(//g,">")}function d(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function p(e){return n.test(e)}function l(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function M(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),d(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(c){function s(e){return e&&e.source||e}function o(e,n){return new RegExp(s(e),"m"+(c.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){var r={},a=function(t,e){c.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");r[n[0]]=[t,n[1]?Number(n[1]):1]})};"string"==typeof t.k?a("keyword",t.k):u(t.k).forEach(function(e){a(e,t.k[e])}),t.k=r}t.lR=o(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=o(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=o(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=o(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return(n="self"===e?t:e).v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return l(n,{v:null},e)})),n.cached_variants||n.eW&&[l(n)]||[n];var n})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?o(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i')+n+(t?"":b)}function s(){g+=null!=E.sL?function(){var e="string"==typeof E.sL;if(e&&!N[E.sL])return _(R);var n=e?C(E.sL,R,!0,i[E.sL]):O(R,E.sL.length?E.sL:void 0);return 0")+'"');return R+=n,n.length||1}var f=S(e);if(!f)throw new Error('Unknown language: "'+e+'"');m(f);var a,E=t||f,i={},g="";for(a=E;a!==f;a=a.parent)a.cN&&(g=u(a.cN,"",!0)+g);var R="",d=0;try{for(var c,p,M=0;E.t.lastIndex=M,c=E.t.exec(n);)p=r(n.substring(M,c.index),c[0]),M=c.index+p;for(r(n.substr(M)),a=E;a.parent;a=a.parent)a.cN&&(g+=b);return{r:d,value:g,language:e,top:E}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(S).filter(s).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function B(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"
":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function c(e){var n,t,r,a,i,c,o,u,s,l,f=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=R.exec(i))return S(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=f?C(f,i,!0):O(i),(t=M(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function c(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){a+=""}function s(e){("start"===e.event?o:u)(e.node)}for(;e.length||n.length;){var l=c();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=c())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(o)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,M(a),i)),r.value=B(r.value),e.innerHTML=r.value,e.className=(c=e.className,o=f,u=r.language,s=o?g[o]:u,l=[c.trim()],c.match(/\bhljs\b/)||l.push("hljs"),-1===c.indexOf(s)&&l.push(s),l.join(" ").trim()),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function o(){if(!o.called){o.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,c)}}function S(e){return e=(e||"").toLowerCase(),N[e]||N[g[e]]}function s(e){var n=S(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=B,a.highlightBlock=c,a.configure=function(e){h=l(h,e)},a.initHighlighting=o,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",o,!1),addEventListener("load",o,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){g[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=S,a.autoDetection=s,a.inherit=l,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="("+t+"[:=]"+t+"|[ \\t\\f]+)",s="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",n="([^\\\\:= \\t\\f\\n]|\\\\.)+",a={e:e,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:s+e,rB:!0,c:[{cN:"attr",b:s,endsParent:!0,r:0}],starts:a},{b:n+e,rB:!0,r:0,c:[{cN:"meta",b:n,endsParent:!0,r:0}],starts:a},{cN:"attr",r:0,b:n+t+"$"}]}});hljs.registerLanguage("typescript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise"},n={cN:"meta",b:"@"+r},a={b:"\\(",e:/\)/,k:t,c:["self",e.QSM,e.ASM,e.NM]},o={cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]};return{aliases:["ts"],k:t,c:[{cN:"meta",b:/^\s*['"]use strict['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+e.IR+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:e.IR},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:["self",e.CLCM,e.CBCM]}]}]}],r:0},{cN:"function",b:"function",e:/[\{;]/,eE:!0,k:t,c:["self",e.inherit(e.TM,{b:r}),o],i:/%/,r:0},{bK:"constructor",e:/\{/,eE:!0,c:["self",o]},{b:/module\./,k:{built_in:"module"},r:0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},n,a]}});hljs.registerLanguage("rust",function(e){var t="([ui](8|16|32|64|128|size)|f(32|64))?",r="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{aliases:["rs"],k:{keyword:"alignof as be box break const continue crate do else enum extern false fn for if impl in let loop match mod mut offsetof once priv proc pub pure ref return self Self sizeof static struct super trait true type typeof unsafe unsized use virtual while where yield move default",literal:"true false Some None Ok Err",built_in:r},l:e.IR+"!?",i:""}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("kotlin",function(e){var t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},r={cN:"symbol",b:e.UIR+"@"},a={cN:"subst",b:"\\${",e:"}",c:[e.ASM,e.CNM]},i={cN:"variable",b:"\\$"+e.UIR},n={cN:"string",v:[{b:'"""',e:'"""',c:[i,a]},{b:"'",e:"'",i:/\n/,c:[e.BE]},{b:'"',e:'"',i:/\n/,c:[e.BE,i,a]}]},c={cN:"meta",b:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UIR+")?"},s={cN:"meta",b:"@"+e.UIR,c:[{b:/\(/,e:/\)/,c:[e.inherit(n,{cN:"meta-string"})]}]},l={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",r:0};return{aliases:["kt"],k:t,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,{cN:"keyword",b:/\b(break|continue|return|this)\b/,starts:{c:[{cN:"symbol",b:/@\w+/}]}},r,c,s,{cN:"function",bK:"fun",e:"[(]|$",rB:!0,eE:!0,k:t,i:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,c,s,n,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},c,s]},n,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},l]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("xml",function(s){var e={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("\x3c!--","--\x3e",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[e],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[e],starts:{e:"<\/script>",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},e]}]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{r:10}),e.C("^//","$",{r:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"section",r:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,r:10},{cN:"meta",b:"^\\[.+?\\]$",r:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("erlang-repl",function(e){return{k:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"meta",b:"^[0-9]+> ",r:10},e.C("%","$"),{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},e.ASM,e.QSM,{b:"\\?(::)?([A-Z]\\w*(::)?)+"},{b:"->"},{b:"ok"},{b:"!"},{b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:s.c=o}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U|L)?"',e:'"',i:"\\n",c:[t.BE]},{b:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e,{b:/\(/,e:/\)/,k:c,r:0,c:["self",t.CLCM,t.CBCM,r,s,e]}]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("arduino",function(e){var t=e.getLanguage("cpp").exports;return{k:{keyword:"boolean byte word string String array "+t.k.keyword,built_in:"setup loop while catch for if do goto try switch case else default break continue return KeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put",literal:"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW"},c:[t.preprocessor,e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("cmake",function(e){return{aliases:["cmake.in"],cI:!0,k:{keyword:"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined"},c:[{cN:"variable",b:"\\${",e:"}"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("java",function(e){var a="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",t={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("armasm",function(s){return{cI:!0,aliases:["arm"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},c:[{cN:"keyword",b:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?",e:"\\s"},s.C("[;@]","$",{r:0}),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",r:0},{cN:"number",v:[{b:"[#$=]?0x[0-9a-f]+"},{b:"[#$=]?0b[01]+"},{b:"[#$=]\\d+"},{b:"\\b\\d+"}],r:0},{cN:"symbol",v:[{b:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"[=#]\\w+"}],r:0}]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"|<-"}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php","php3","php4","php5","php6","php7"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("autohotkey",function(e){var r={b:"`[\\s\\S]"};return{cI:!0,aliases:["ahk"],k:{keyword:"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group",literal:"A|0 true false NOT AND OR",built_in:"ComSpec Clipboard ClipboardAll ErrorLevel"},c:[{cN:"built_in",b:"A_[a-zA-Z0-9]+"},r,e.inherit(e.QSM,{c:[r]}),e.C(";","$",{r:0}),e.CBCM,{cN:"number",b:e.NR,r:0},{cN:"subst",b:"%(?=[a-zA-Z0-9#_$@])",e:"%",i:"[^a-zA-Z0-9#_$@]"},{cN:"built_in",b:"^\\s*\\w+\\s*,"},{cN:"meta",b:"^\\s*#w+",e:"$",r:0},{cN:"symbol",c:[r],v:[{b:'^[^\\n";]+::(?!=)'},{b:'^[^\\n";]+:(?!=)',r:0}]},{b:",\\s*,"}]}});hljs.registerLanguage("x86asm",function(s){return{cI:!0,l:"[.%]?"+s.IR,k:{keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},c:[s.C(";","$",{r:0}),{cN:"number",v:[{b:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",r:0},{b:"\\$[0-9][0-9A-Fa-f]*",r:0},{b:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{b:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QSM,{cN:"string",v:[{b:"'",e:"[^\\\\]'"},{b:"`",e:"[^\\\\]`"}],r:0},{cN:"symbol",v:[{b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{b:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],r:0},{cN:"subst",b:"%[0-9]+",r:0},{cN:"subst",b:"%!S+",r:0},{cN:"meta",b:/^\s*\.[\w_-]+/}]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},o={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},r={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[t,o,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},n=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]});return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Add-MDTPersistentDrive Disable-MDTMonitorService Enable-MDTMonitorService Get-MDTDeploymentShareStatistics Get-MDTMonitorData Get-MDTOperatingSystemCatalog Get-MDTPersistentDrive Import-MDTApplication Import-MDTDriver Import-MDTOperatingSystem Import-MDTPackage Import-MDTTaskSequence New-MDTDatabase Remove-MDTMonitorData Remove-MDTPersistentDrive Restore-MDTPersistentDrive Set-MDTMonitorData Test-MDTDeploymentShare Test-MDTMonitorData Update-MDTDatabaseSchema Update-MDTDeploymentShare Update-MDTLinkedDS Update-MDTMedia Update-MDTMedia Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[t,e.NM,r,{cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},{cN:"literal",b:/\$(null|true|false)\b/},o,n]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,{cN:"string",b:/'/,e:/'/},t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("css",function(e){var c={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:"[a-zA-Z-][a-zA-Z0-9_-]*",r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,c]}]}});hljs.registerLanguage("vim",function(e){return{l:/[!#@\w]+/,k:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",built_in:"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp"},i:/;/,c:[e.NM,{cN:"string",b:"'",e:"'",i:"\\n"},{cN:"string",b:/"(\\"|\n\\|[^"\n])*"/},e.C('"',"$"),{cN:"variable",b:/[bwtglsav]:[\w\d_]*/},{cN:"function",bK:"function function!",e:"$",r:0,c:[e.TM,{cN:"params",b:"\\(",e:"\\)"}]},{cN:"symbol",b:/<[\w-]+>/}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d;var l=[{b:/^\s*=>/,starts:{e:"$",c:i.c=d}},{cN:"meta",b:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(l).concat(d)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:a+r+":"},{b:a+'"'+r+'":'},{b:a+"'"+r+"':"}]},c={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,{cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]}]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:c.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},e.HCM,{bK:b,k:{literal:b}},e.CNM,c]}});hljs.registerLanguage("fortran",function(e){return{cI:!0,aliases:["f90","f95"],k:{literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data",built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image"},i:/\/\*/,c:[e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{cN:"string",r:0}),{cN:"function",bK:"subroutine function program",i:"[${=\\n]",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)"}]},e.C("!","$",{r:0}),{cN:"number",b:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",r:0}]}});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",b={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},i=e.C("%","$"),n={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a={b:"fun\\s+"+r+"/\\d+"},d={b:c+"\\(",e:"\\)",rB:!0,r:0,c:[{b:c,r:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,r:0}]},o={b:"{",e:"}",r:0},t={b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0},f={b:"[A-Z][a-zA-Z0-9_]*",r:0},l={b:"#"+e.UIR,r:0,rB:!0,c:[{b:"#"+e.UIR,r:0},{b:"{",e:"}",r:0}]},s={bK:"fun receive if try case",e:"end",k:b};s.c=[i,a,e.inherit(e.ASM,{cN:""}),s,d,e.QSM,n,o,t,f,l];var u=[i,a,s,d,e.QSM,n,o,t,f,l];d.c[1].c=u,o.c=u;var h={cN:"params",b:"\\(",e:"\\)",c:l.c[1].c=u};return{aliases:["erl"],k:b,i:"(",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}],r:0},{cN:"symbol",b:r+":(?!:)",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"->"},{b:"("+e.RSR+")\\s*",c:[e.HCM,{cN:"regexp",i:"\\n",c:[e.BE,n],v:[{b:"/",e:"/[a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];return{l:r,k:b,c:n.c=l}});hljs.registerLanguage("objectivec",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,_="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:{keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},l:t,i:""}]}]},{cN:"class",b:"("+_.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:_,l:t,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},t={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a=e.inherit(t,{i:/\n/}),c={cN:"subst",b:"{",e:"}",k:i},n=e.inherit(c,{i:/\n/}),s={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,n]},b={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},c]},l=e.inherit(b,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},n]});c.c=[b,s,t,e.ASM,e.QSM,r,e.CBCM],n.c=[l,s,a,e.ASM,e.QSM,r,e.inherit(e.CBCM,{i:/\n/})];var o={v:[b,s,t,e.ASM,e.QSM]},d=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp","c#"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:"\x3c!--|--\x3e"},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},o,r,{bK:"class interface",e:/[{;=]/,i:/[^\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+d+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/\s*[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[o,r,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[e.BE,b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[e.BE,b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,c]},{b:/(fr|rf|f)"/,e:/"/,c:[e.BE,c]},e.ASM,e.QSM]},i={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},l={cN:"params",b:/\(/,e:/\)/,c:["self",b,i,a]};return c.c=[a,i,b],{aliases:["py","gyp","ipython"],k:r,i:/(<\/|->|\?)|=>/,c:[b,i,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,l,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor get set",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]$/,sL:"bash"}}],i:" Date: Tue, 12 Mar 2019 17:41:22 +0100 Subject: [PATCH 0049/2376] Make codemirror use tiddler-editor-border palette color (#3819) --- plugins/tiddlywiki/codemirror/styles.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index 3dfad6a4c..869521839 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -5,7 +5,7 @@ tags: [[$:/tags/Stylesheet]] .CodeMirror { height: auto; - border: 1px solid #ddd; + border: 1px solid <>; line-height: 1.5; font-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}}; font-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}}; From c904aeb05f6fcf14a93a9955de7db7e24664f356 Mon Sep 17 00:00:00 2001 From: Xavier Cazin Date: Wed, 13 Mar 2019 10:34:44 +0100 Subject: [PATCH 0050/2376] fr-FR translation updates (#3856) * update/improve translations of a few fr-FR strings * update/add fr-FR for load and listen command docs --- languages/fr-FR/Buttons.multids | 6 +++-- languages/fr-FR/ControlPanel.multids | 2 +- languages/fr-FR/Fields.multids | 1 + languages/fr-FR/Help/listen.tid | 34 ++++++++++++++++++++++++++++ languages/fr-FR/Help/load.tid | 12 +++++++--- languages/fr-FR/Import.multids | 2 ++ languages/fr-FR/Search.multids | 2 +- languages/fr-FR/SideBar.multids | 1 + 8 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 languages/fr-FR/Help/listen.tid diff --git a/languages/fr-FR/Buttons.multids b/languages/fr-FR/Buttons.multids index 5dff4f9c2..ae40ab436 100644 --- a/languages/fr-FR/Buttons.multids +++ b/languages/fr-FR/Buttons.multids @@ -38,8 +38,8 @@ Unfold/Caption: déplier le tiddler Unfold/Hint: Déplie le corps de ce tiddler FoldOthers/Caption: replier les autres tiddlers FoldOthers/Hint: Replie le corps des autres tiddlers ouverts -FoldAll/Caption: replie tous les tiddlers -FoldAll/Hint: Replier le corps de tous les tiddlers ouverts +FoldAll/Caption: replier tous les tiddlers +FoldAll/Hint: Replie le corps de tous les tiddlers ouverts UnfoldAll/Caption: déplier tous les tiddlers UnfoldAll/Hint: Déplie le corps de tous les tiddlers ouverts FullScreen/Caption: plein-écran @@ -54,6 +54,8 @@ Home/Caption: accueil Home/Hint: Ouvre les tiddlers par défaut Language/Caption: langue Language/Hint: Choix de la langue pour l'interface utilisateur +Manager/Caption: gestionnaire de tiddlers +Manager/Hint: Ouvre le gestionnaire de tiddlers More/Caption: plus More/Hint: Actions supplémentaires NewHere/Caption: nouveau, à partir d'ici diff --git a/languages/fr-FR/ControlPanel.multids b/languages/fr-FR/ControlPanel.multids index 661486da2..7e98d6344 100644 --- a/languages/fr-FR/ControlPanel.multids +++ b/languages/fr-FR/ControlPanel.multids @@ -161,7 +161,7 @@ Settings/MissingLinks/Hint: Peut-on pointer vers des tiddlers qui n'existent pas Settings/MissingLinks/Description: Active les liens vers les tiddlers inexistants StoryView/Caption: Vue sur le déroulé StoryView/Prompt: Vue courante : -Stylesheets/Caption: Stylesheets +Stylesheets/Caption: Feuilles de style Stylesheets/Expand/Caption: Tout déployer Stylesheets/Hint: Voici le rendu CSS courant pour les tiddlers feuilles de style tagués avec <> Stylesheets/Restore/Caption: Restaurer diff --git a/languages/fr-FR/Fields.multids b/languages/fr-FR/Fields.multids index cc6e382a0..b326141ea 100644 --- a/languages/fr-FR/Fields.multids +++ b/languages/fr-FR/Fields.multids @@ -31,5 +31,6 @@ subtitle: Texte du sous-titre pour un wizard tags: Liste des tags associés à un tiddler text: Texte du corps de ce tiddler title: Nom unique du tiddler +toc-link: Une valeur à ''no'' supprime le lien vers le tiddler dans l'arborescences des tables des matières type: Type de contenu du tiddler version: S'il s'agit d'un plugin, l'information de version diff --git a/languages/fr-FR/Help/listen.tid b/languages/fr-FR/Help/listen.tid new file mode 100644 index 000000000..b6d812bd0 --- /dev/null +++ b/languages/fr-FR/Help/listen.tid @@ -0,0 +1,34 @@ +title: $:/language/Help/listen +description: Fournit à TiddlyWiki une interface serveur HTTP + +Sert un wiki via HTTP. + +La commande //listen// utilise des [[paramètres de commande nommés|NamedCommandParameters]] : + +``` +--listen [=]... +``` + +Tous les paramètres sont optionnels avec des valeurs par défaut sûres, et peuvent être spécifiés dans n'importe quel ordre. Les paramètres reconnus sont les suivants : + +* ''host'' - nom ou adresse de machine hôte à laquelle sera attaché le service (par défaut "127.0.0.1", autrement dit "localhost") +* ''path-prefix'' - préfixe optionnel pour les noms de chemin +* ''port'' - numéro de port sur lequel écouter ; une valeur non numérique est interprétée comme un nom de variable d'environnement dont sera extrait le numéro de port (par défaut à "8080") +* ''credentials'' - chemin vers le fichier CSV d'autorisations (relativement au dossier du wiki) +* ''anon-username'' - nom d'utilisateur qui servira à signer les modifications si l'utilisateur est anonyme +* ''username'' - nom d'utilisateur optionnel pour l'authentification basique +* ''password'' - mot de passe optionnel pour l'authentification basique +* ''authenticated-user-header'' - nom d'en-tête optionnel à utiliser pour les authentifications de confiance +* ''readers'' - liste de personnes de confiance autorisées à lire ce wiki, séparées par des virgules +* ''writers'' - liste de personnes de confiance autorisées à modifier ce wiki, séparées par des virgules +* ''csrf-disable'' - donner la valeur "yes" pour désactiver les vérifications CSRF (vaut "no" par défaut) +* ''root-tiddler'' - le tiddler à servir à la racine (par défaut "$:/core/save/all") +* ''root-render-type'' - le type de contenu avec lequel le tiddler racine doit être rendu (par défaut "text/plain") +* ''root-serve-type'' - le type de contenu avec lequel le tiddler racine doit être servi (par défaut "text/html") +* ''tls-cert'' - nom de chemin du fichier de certificat TLS (relativement au dossier du wiki) +* ''tls-key'' - nom de chemin du fichier de clé TLS (relativement au dossier du wiki) +* ''debug-level'' - niveau de débogage optionnel ; mettre à "debug" pour voir le détail des requêtes (par défaut à "none") +* ''gzip'' - donner la valeur "yes" pour activer la compression gzip pour certaines interactions http (par défaut à "no") + +Pour plus d'informations sur la manière de donner accès à votre instance de serveur à l'ensemble de votre réseau local, ainsi que sur les risques éventuels en matière de sécurité, voir le tiddler [[WebServer sur tiddlywiki.com|https://tiddlywiki.com/#WebServer]]. + diff --git a/languages/fr-FR/Help/load.tid b/languages/fr-FR/Help/load.tid index d04f64a8d..ee7423464 100644 --- a/languages/fr-FR/Help/load.tid +++ b/languages/fr-FR/Help/load.tid @@ -1,16 +1,22 @@ title: $:/language/Help/load description: Charge des tiddlers à partir d'un fichier -Charge des tiddlers à partir de fichiers ~TiddlyWikiClassic 2.x.x (`.html`), `.tiddler`, `.tid`, `.json` ou d'autres types de fichiers. +Charge des tiddlers à partir de fichiers ~TiddlyWikiClassic 2.x.x +(`.html`), `.tiddler`, `.tid`, `.json` ou d'autres types de +fichiers. Le traitement appliqué aux fichiers entrants est déterminé par l'extension du fichier. Utilisez plutôt la commande `import` si vous devez spécifier explicitement le désérialiseur et l'encodage. + ``` ---load +--load [noerror] +--load [noerror] ``` +Par défaut, la commande //load// provoque une erreur si aucun tiddler n'est trouvé. L'erreur peut être supprimée en spécifiant le paramètre optionnel "noerror". + Pour charger des tiddlers à partir d'un fichier ~TiddlyWiki chiffré, vous devrez d'abord spécifier le mot de passe à l'aide de la [[commande password|PasswordCommand]]. Par exemple : ``` tiddlywiki ./MonWiki --password pa55w0rd --load mon_wiki_secret.html ``` -À noter que Tiddlywiki refusera de charger une version plus ancienne d'un plugin déjà chargé. \ No newline at end of file +À noter : TiddlyWiki refusera de charger une version plus ancienne d'un plugin déjà chargé. \ No newline at end of file diff --git a/languages/fr-FR/Import.multids b/languages/fr-FR/Import.multids index 685e4d996..51140427a 100644 --- a/languages/fr-FR/Import.multids +++ b/languages/fr-FR/Import.multids @@ -18,4 +18,6 @@ Upgrader/Plugins/Suppressed/Version: Plugin bloqué (la version <> en Upgrader/Plugins/Upgraded: Plugin mis à jour depuis <> vers <> Upgrader/State/Suppressed: Tiddler d'état temporaire bloqué Upgrader/System/Suppressed: Tiddler système bloqué +Upgrader/System/Warning: Tiddler du module //core// +Upgrader/System/Alert: Vous êtes sur le point d'importer un tiddler qui écrasera un tiddler du module //core//. Ceci est déconseillé car cela peut rendre le système instable Upgrader/ThemeTweaks/Created: Thème modifié à partir de <$text text=<>/> diff --git a/languages/fr-FR/Search.multids b/languages/fr-FR/Search.multids index 0b4da8d5a..e61db5497 100644 --- a/languages/fr-FR/Search.multids +++ b/languages/fr-FR/Search.multids @@ -7,7 +7,7 @@ Filter/Matches: //<> correspondances// Matches: //<> correspondances// Matches/All: Toutes les correspondances : Matches/Title: Correspondances sur les titres : -Search: Recherch +Search: Recherche Search/TooShort: Texte de recherche trop court Shadows/Caption: Shadows Shadows/Hint: Recherche parmi les tiddlers //shadow// diff --git a/languages/fr-FR/SideBar.multids b/languages/fr-FR/SideBar.multids index f82793ab1..499e38cfd 100644 --- a/languages/fr-FR/SideBar.multids +++ b/languages/fr-FR/SideBar.multids @@ -3,6 +3,7 @@ title: $:/language/SideBar/ All/Caption: Tout Contents/Caption: Sommaire Drafts/Caption: Brouillons +Explorer/Caption: Explorateur Missing/Caption: Manquants More/Caption: Plus Open/Caption: Ouverts From 9f630b58294a9008854c1f9f065e64134dba45fa Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 16 Mar 2019 13:24:58 +0000 Subject: [PATCH 0051/2376] v5.1.20 new release banner --- .../tiddlers/images/New Release Banner.jpg | Bin 68631 -> 44301 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.jpg b/editions/tw5.com/tiddlers/images/New Release Banner.jpg index 9e91fe57ba2139042b686bd68d982c56feb797fd..dd31b43f0eedc4e842fbe07e08fa7ad0188a6e53 100644 GIT binary patch literal 44301 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 cfBt(|_Mg`O+jW2bmuUOnKI@s0RaI45gRoG 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 z Date: Sat, 16 Mar 2019 13:25:34 +0000 Subject: [PATCH 0052/2376] Clarify help for render command The ordering of the bullet lists didn't match the order of the parameters --- core/language/en-GB/Help/render.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/language/en-GB/Help/render.tid b/core/language/en-GB/Help/render.tid index 9318b5cfa..2b7b168c9 100644 --- a/core/language/en-GB/Help/render.tid +++ b/core/language/en-GB/Help/render.tid @@ -13,8 +13,8 @@ A name and value for an additional variable may optionally also be specified. * ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered * ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename -* ''template'': Optional template through which each tiddler is rendered * ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material) +* ''template'': Optional template through which each tiddler is rendered * ''name'': Name of optional variable * ''value'': Value of optional variable From a89991cc4625805666950e5970a9c6a068463285 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 16 Mar 2019 13:25:45 +0000 Subject: [PATCH 0053/2376] Dynaview: Fix crash --- plugins/tiddlywiki/dynaview/dynaview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/dynaview/dynaview.js b/plugins/tiddlywiki/dynaview/dynaview.js index fbf787847..46cef336a 100644 --- a/plugins/tiddlywiki/dynaview/dynaview.js +++ b/plugins/tiddlywiki/dynaview/dynaview.js @@ -239,7 +239,7 @@ function findTopmostTiddler() { return { element: topmostElement, offset: -topmostElementTop, - title: topmostElement.getAttribute("data-tiddler-title") + title: topmostElement ? topmostElement.getAttribute("data-tiddler-title") : null }; } From 05243a6c4881546b76f239d9b2996511e1fbaba1 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 16 Mar 2019 16:39:08 +0000 Subject: [PATCH 0054/2376] Docs: Add performance instrumentation docs --- .../features/Performance Instrumentation.tid | 31 +++++++++++++++++++ .../tiddlers/workingwithtw/Performance.tid | 3 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 editions/tw5.com/tiddlers/features/Performance Instrumentation.tid diff --git a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid new file mode 100644 index 000000000..b7a95a39c --- /dev/null +++ b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid @@ -0,0 +1,31 @@ +created: 20190316163428191 +modified: 20190316163657710 +tags: Features +title: Performance Instrumentation +type: text/vnd.tiddlywiki + +The core has built-in performance instrumentation for the refresh cycle. See “Performance Instrumentation” on the “Settings” tab of control panel. The wiki will need to be reloaded before it takes effect. + +With performance instrumentation switched on, there is additional timing information displayed the browser developer console each time a refresh cycle is triggered. For example: + +``` +performance: mainRender: 327.83ms +performance: +filter: 49.70ms +performance: styleRefresh: 9.14ms +performance: +filter: 2.46ms +performance: mainRefresh: 68.10ms +performance: +filter: 37.69ms +``` + +The information above should be interpreted as follows: + +<<< +"Initial rendering of the main page took 327ms (of which 50ms was filter evaluation). Refreshing the page stylesheet took 9ms (of which 2ms was filter evaluation). Refreshing the main page took 68ms (of which 38ms was filter evaluation)" +<<< + +* mainRender is the time taken for the initial display of the page template +* styleRefresh is the time taken to refresh the page stylesheet +* mainRender is the time taken to refresh the main page template +* in each case, +filter denotes the time taken up with filter evaluation. + +As an example, try switching between the sidebar tabs to compare how long they take to render. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index 32c9707c8..a701a06ac 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -1,5 +1,5 @@ created: 20150330155120127 -modified: 20160607145222633 +modified: 20190316163827303 tags: [[Working with TiddlyWiki]] title: Performance type: text/vnd.tiddlywiki @@ -10,3 +10,4 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d * ''Use the "Vanilla" theme''. The default "Snow White" theme includes visual effects like shadows, transparency and blurring that can be slow to render on older devices * ''Avoid large tiddlers''. Large bitmaps can significantly slow TiddlyWiki's performance. For example, an image taken with a modern smartphone will often be 5MB or more. Use ExternalImages whenever possible * ''Don't have too many tiddlers open at once''. Every tiddler you have open will require processing to keep it up to date as the store changes (for example, while you type into a draft tiddler). It is particularly easy when using zoomin story view to end up with dozens of tiddlers listed in the ''Open'' tab in the sidebar. Get into the habit of periodically closing all open tiddlers with the {{$:/core/images/close-all-button}} ''close all'' button +* ''Use the built-in performance instrumentation''. Studying the [[performance instrumentation|Performance Instrumentation]] results can help highlight performance problems From e52a616891977bde142334df2a72c7dd121efb82 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 17 Mar 2019 12:25:15 +0000 Subject: [PATCH 0055/2376] Add support for widget subclassing Fixes #3865 --- core/modules/widgets/widget.js | 22 ++++++-- .../tiddlers/new/WidgetSubclassingMechanism | 54 +++++++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 editions/dev/tiddlers/new/WidgetSubclassingMechanism diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 28b9f4e35..1c4407167 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -22,15 +22,17 @@ Options include: document: optional document object to use instead of global document */ var Widget = function(parseTreeNode,options) { - if(arguments.length > 0) { - this.initialise(parseTreeNode,options); - } + this.initialise(parseTreeNode,options); }; /* Initialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses */ Widget.prototype.initialise = function(parseTreeNode,options) { + // Bail if parseTreeNode is undefined, meaning that the widget constructor was called without any arguments so that it can be subclassed + if(parseTreeNode === undefined) { + return; + } options = options || {}; // Save widget info this.parseTreeNode = parseTreeNode; @@ -46,7 +48,21 @@ Widget.prototype.initialise = function(parseTreeNode,options) { this.eventListeners = {}; // Hashmap of the widget classes if(!this.widgetClasses) { + // Get widget classes Widget.prototype.widgetClasses = $tw.modules.applyMethods("widget"); + // Process any subclasses + $tw.modules.forEachModuleOfType("widget-subclass",function(title,module) { + if(module.baseClass) { + var baseClass = Widget.prototype.widgetClasses[module.baseClass]; + if(!baseClass) { + throw "Module '" + title + "' is attemping to extend a non-existent base class '" + module.baseClass + "'"; + } + var subClass = module.constructor; + subClass.prototype = new baseClass(); + $tw.utils.extend(subClass.prototype,module.prototype); + Widget.prototype.widgetClasses[module.name || module.baseClass] = subClass; + } + }); } }; diff --git a/editions/dev/tiddlers/new/WidgetSubclassingMechanism b/editions/dev/tiddlers/new/WidgetSubclassingMechanism new file mode 100644 index 000000000..214fd461d --- /dev/null +++ b/editions/dev/tiddlers/new/WidgetSubclassingMechanism @@ -0,0 +1,54 @@ +created: 20190317121937335 +modified: 20190317121937335 +tile: WidgetSubclassingMechanism + +!! Introduction + +The widget subclassing mechansim allows widgets to be subclassed with additional methods and properties. The subclassed widgets can either overwrite the existing definition of the baseclass widget, or it can be made availabel as a new widget + +Widget subclasses are defined in modules of module-type `widget-subclass`. They should export the following properties: + +* ''baseClass'': the name of the widget class being subclassed +* ''name'': (optional) the name to be used for the subclassed widget (defaults to overwriting the baseclass widget) +* ''constructor'': constructor function for creating the widget object +* ''prototype'': object whose properties are added to the subclass + +!! Example + +Here is an example of a subclass of the checkbox widget that adds logging to the event handler: + +``` +/*\ +title: $:/my-customised-checkbox-widget.js +type: application/javascript +module-type: widget-subclass + +Widget base class + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.baseClass = "checkbox"; // Extend the <$checkbox> widget + +// Specify a different name to make the subclass available as a new widget instead of overwriting the baseclass: +// exports.name = "my-enhanced-checkbox"; + +exports.constructor = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +exports.prototype = {}; + +exports.prototype.handleChangeEvent = function(event) { + // Call the base class handleChangeEvent function + Object.getPrototypeOf(Object.getPrototypeOf(this)).handleChangeEvent.call(this,event); + // Print our message + console.log("Checkbox status:",this.inputDomNode.checked); +}; + +})(); +``` From f99fb4f9f5caede00baa423d21aa5f4f24016d24 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 17 Mar 2019 19:13:13 +0100 Subject: [PATCH 0056/2376] Fix typos in WidgetSubclassingMechanism (#3870) --- editions/dev/tiddlers/new/WidgetSubclassingMechanism | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/dev/tiddlers/new/WidgetSubclassingMechanism b/editions/dev/tiddlers/new/WidgetSubclassingMechanism index 214fd461d..734d2a309 100644 --- a/editions/dev/tiddlers/new/WidgetSubclassingMechanism +++ b/editions/dev/tiddlers/new/WidgetSubclassingMechanism @@ -1,10 +1,10 @@ created: 20190317121937335 modified: 20190317121937335 -tile: WidgetSubclassingMechanism +title: WidgetSubclassingMechanism !! Introduction -The widget subclassing mechansim allows widgets to be subclassed with additional methods and properties. The subclassed widgets can either overwrite the existing definition of the baseclass widget, or it can be made availabel as a new widget +The widget subclassing mechanism allows widgets to be subclassed with additional methods and properties. The subclassed widgets can either overwrite the existing definition of the baseclass widget, or it can be made availabel as a new widget Widget subclasses are defined in modules of module-type `widget-subclass`. They should export the following properties: From a01dc6cb3dc56569c7a48dc2145d401df16b5255 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 18 Mar 2019 13:40:15 +0100 Subject: [PATCH 0057/2376] Docs: Typo --- ...idgetSubclassingMechanism => WidgetSubclassingMechanism.tid} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename editions/dev/tiddlers/new/{WidgetSubclassingMechanism => WidgetSubclassingMechanism.tid} (97%) diff --git a/editions/dev/tiddlers/new/WidgetSubclassingMechanism b/editions/dev/tiddlers/new/WidgetSubclassingMechanism.tid similarity index 97% rename from editions/dev/tiddlers/new/WidgetSubclassingMechanism rename to editions/dev/tiddlers/new/WidgetSubclassingMechanism.tid index 734d2a309..3f39d4e3a 100644 --- a/editions/dev/tiddlers/new/WidgetSubclassingMechanism +++ b/editions/dev/tiddlers/new/WidgetSubclassingMechanism.tid @@ -4,7 +4,7 @@ title: WidgetSubclassingMechanism !! Introduction -The widget subclassing mechanism allows widgets to be subclassed with additional methods and properties. The subclassed widgets can either overwrite the existing definition of the baseclass widget, or it can be made availabel as a new widget +The widget subclassing mechanism allows widgets to be subclassed with additional methods and properties. The subclassed widgets can either overwrite the existing definition of the baseclass widget, or it can be made available as a new widget Widget subclasses are defined in modules of module-type `widget-subclass`. They should export the following properties: From 02ae8969b2ca041606ec487d3c1d9ab1d19585b2 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Wed, 20 Mar 2019 16:50:34 +0000 Subject: [PATCH 0058/2376] Reveal widget: faulty logic for default handling @BurningTreeC I think this might have been a typo in your recent refactorings; if you look back at an old version such as https://github.com/Jermolene/TiddlyWiki5/blob/c0c1b557ebcd76fecc7b305115cbabe921b38e0d/core/modules/widgets/reveal.js then there is no sign of this fallback. Fixes #3874 --- core/modules/widgets/reveal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index 15659e125..9858ad14c 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -119,7 +119,7 @@ Read the state tiddler RevealWidget.prototype.readState = function() { // Read the information from the state tiddler var state, - defaultState = this["default"] || this.getVariable("currentTiddler"); + defaultState = this["default"]; if(this.stateTitle) { var stateTitleTiddler = this.wiki.getTiddler(this.stateTitle); if(this.stateField) { From 7709192cc89ce78109749adb768d203a71dd6d11 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Wed, 20 Mar 2019 18:24:29 +0000 Subject: [PATCH 0059/2376] DynaView: Simplify visibility processing And add a table of contents to the demo --- .../dynaviewdemo/tiddlers/SideBar-Open.tid | 7 +++- .../dynaviewdemo/tiddlers/TableOfContents.tid | 33 +++++++++++++++++++ .../dynaviewdemo/tiddlers/ViewTemplate.tid | 8 ++--- .../tiddlers/alice/Alice TableOfContents.json | 27 +++++++++++++++ plugins/tiddlywiki/dynaview/docs.tid | 10 ++++-- plugins/tiddlywiki/dynaview/dynaview.js | 27 +++++---------- 6 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 editions/dynaviewdemo/tiddlers/TableOfContents.tid create mode 100644 editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json diff --git a/editions/dynaviewdemo/tiddlers/SideBar-Open.tid b/editions/dynaviewdemo/tiddlers/SideBar-Open.tid index 756cbdf5b..fac95637e 100644 --- a/editions/dynaviewdemo/tiddlers/SideBar-Open.tid +++ b/editions/dynaviewdemo/tiddlers/SideBar-Open.tid @@ -17,9 +17,14 @@ caption: {{$:/language/SideBar/Open/Caption}}
<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">× <$link to={{!!title}}><$view field="title"/> -<$reveal type="match" stateTitle={{{ [[$:/state/viewtemplate/visibility/]addsuffix] }}} text="true"> +<$set name="state" value={{{ [[$:/state/viewtemplate/visibility/]addsuffix] }}}> +<$reveal type="match" stateTitle=<> text="true"> LOADED +<$reveal type="match" stateTitle=<> text="false"> +UNLOADED + +
diff --git a/editions/dynaviewdemo/tiddlers/TableOfContents.tid b/editions/dynaviewdemo/tiddlers/TableOfContents.tid new file mode 100644 index 000000000..e3cc5f653 --- /dev/null +++ b/editions/dynaviewdemo/tiddlers/TableOfContents.tid @@ -0,0 +1,33 @@ +title: $:/_Sidebar/TableOfContents +tags: $:/tags/SideBar +caption: Contents + +\define toc-body(tag,sort:"",exclude,path) +
    + <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> + <$vars item=<> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}} excluded="""[enlist<__exclude__>] -[<__tag__>]"""> +
  1. + <$link to={{{ [enlist{!!tiddler-list}] }}}> +<$list filter="[enlist{!!tiddler-list}addprefix[$:/state/viewtemplate/visibility/]text[true]limit[1]]" variable="listItem" emptyMessage="""
    """> +
    + + <$view field='caption'> + <$view field='title'/> + + + <$macrocall $name="toc-body" tag=<> sort=<<__sort__>> exclude=<> path=<>/> +
  2. + + +
+\end + +\define toc(tag,sort:"") +<$macrocall $name="toc-body" tag=<<__tag__>> sort=<<__sort__>> /> +\end + +
+ +<> + +
diff --git a/editions/dynaviewdemo/tiddlers/ViewTemplate.tid b/editions/dynaviewdemo/tiddlers/ViewTemplate.tid index e25936484..07f93928f 100644 --- a/editions/dynaviewdemo/tiddlers/ViewTemplate.tid +++ b/editions/dynaviewdemo/tiddlers/ViewTemplate.tid @@ -11,15 +11,15 @@ $:/state/folded/$(currentTiddler)$ <$tiddler tiddler=<>>
> data-tags={{!!tags}} class=<>> <$set name="state" value={{{ [[$:/state/viewtemplate/visibility/]addsuffix] }}}> -<$reveal stateTitle=<> type="match" text="true" tag="div"> -
> data-dynaview-set-value="true" data-dynaview-has-triggered={{{ [get[text]] }}}> +<$reveal stateTitle=<> type="nomatch" text="" default="" tag="div"> +
> data-dynaview-set-value="true" data-dynaview-unset-value="false"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem"> <$transclude tiddler=<>/>
-<$reveal stateTitle=<> type="nomatch" text="true" tag="div"> -
> data-dynaview-set-value="true" data-dynaview-has-triggered={{{ [get[text]] }}}> +<$reveal stateTitle=<> type="match" text="" default="" tag="div"> +
> data-dynaview-set-value="true" data-dynaview-unset-value="false">
diff --git a/editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json b/editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json new file mode 100644 index 000000000..98b19d333 --- /dev/null +++ b/editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json @@ -0,0 +1,27 @@ +[ +{"title": "TableOfContents", "text": "", "list": "[[Chapter 1]] [[Chapter 2]] [[Chapter 3]] [[Chapter 4]] [[Chapter 5]] [[Chapter 6]] [[Chapter 7]] [[Chapter 8]] [[Chapter 9]] [[Chapter 10]] [[Chapter 11]] [[Chapter 12]]"}, +{"title": "Chapter 1", "tiddler-list": "[[Alice in Wonderland:-anchor-]] [[Alice in Wonderland:-paragraph-1]] [[Alice in Wonderland:-paragraph-2]] [[Alice in Wonderland:-paragraph-3]] [[Alice in Wonderland:-paragraph-4]] [[Alice in Wonderland:-paragraph-5]] [[Alice in Wonderland:-paragraph-6]] [[Alice in Wonderland:-paragraph-7]] [[Alice in Wonderland:-paragraph-8]] [[Alice in Wonderland:-paragraph-9]] [[Alice in Wonderland:-paragraph-10]] [[Alice in Wonderland:-paragraph-11]] [[Alice in Wonderland:-paragraph-12]] [[Alice in Wonderland:-paragraph-13]] [[Alice in Wonderland:-paragraph-14]] [[Alice in Wonderland:-paragraph-15]] [[Alice in Wonderland:-paragraph-16]] [[Alice in Wonderland:-paragraph-17]] [[Alice in Wonderland:-paragraph-18]] [[Alice in Wonderland:-paragraph-19]] [[Alice in Wonderland:-paragraph-20]] [[Alice in Wonderland:-paragraph-21]] [[Alice in Wonderland:-paragraph-22]] [[Alice in Wonderland:-paragraph-23]] [[Alice in Wonderland:-paragraph-24]] [[Alice in Wonderland:-paragraph-25]] [[Alice in Wonderland:-paragraph-26]] [[Alice in Wonderland:-paragraph-27]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 2", "tiddler-list": "[[Alice in Wonderland:-paragraph-28]] [[Alice in Wonderland:-paragraph-29]] [[Alice in Wonderland:-paragraph-30]] [[Alice in Wonderland:-paragraph-31]] [[Alice in Wonderland:-paragraph-32]] [[Alice in Wonderland:-paragraph-33]] [[Alice in Wonderland:-paragraph-34]] [[Alice in Wonderland:-paragraph-35]] [[Alice in Wonderland:-paragraph-36]] [[Alice in Wonderland:-paragraph-37]] [[Alice in Wonderland:-paragraph-38]] [[Alice in Wonderland:-paragraph-39]] [[Alice in Wonderland:-paragraph-40]] [[Alice in Wonderland:-paragraph-41]] [[Alice in Wonderland:-paragraph-42]] [[Alice in Wonderland:-paragraph-43]] [[Alice in Wonderland:-paragraph-44]] [[Alice in Wonderland:-paragraph-45]] [[Alice in Wonderland:-paragraph-46]] [[Alice in Wonderland:-paragraph-47]] [[Alice in Wonderland:-paragraph-48]] [[Alice in Wonderland:-paragraph-49]] [[Alice in Wonderland:-paragraph-50]] [[Alice in Wonderland:-paragraph-51]] [[Alice in Wonderland:-paragraph-52]] [[Alice in Wonderland:-paragraph-53]] [[Alice in Wonderland:-paragraph-54]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 3", "tiddler-list": "[[Alice in Wonderland:-paragraph-55]] [[Alice in Wonderland:-paragraph-56]] [[Alice in Wonderland:-paragraph-57]] [[Alice in Wonderland:-paragraph-58]] [[Alice in Wonderland:-paragraph-59]] [[Alice in Wonderland:-paragraph-60]] [[Alice in Wonderland:-paragraph-61]] [[Alice in Wonderland:-paragraph-62]] [[Alice in Wonderland:-paragraph-63]] [[Alice in Wonderland:-paragraph-64]] [[Alice in Wonderland:-paragraph-65]] [[Alice in Wonderland:-paragraph-66]] [[Alice in Wonderland:-paragraph-67]] [[Alice in Wonderland:-paragraph-68]] [[Alice in Wonderland:-paragraph-69]] [[Alice in Wonderland:-paragraph-70]] [[Alice in Wonderland:-paragraph-71]] [[Alice in Wonderland:-paragraph-72]] [[Alice in Wonderland:-paragraph-73]] [[Alice in Wonderland:-paragraph-74]] [[Alice in Wonderland:-paragraph-75]] [[Alice in Wonderland:-paragraph-76]] [[Alice in Wonderland:-paragraph-77]] [[Alice in Wonderland:-paragraph-78]] [[Alice in Wonderland:-paragraph-79]] [[Alice in Wonderland:-paragraph-80]] [[Alice in Wonderland:-paragraph-81]] [[Alice in Wonderland:-paragraph-82]] [[Alice in Wonderland:-paragraph-83]] [[Alice in Wonderland:-paragraph-84]] [[Alice in Wonderland:-paragraph-85]] [[Alice in Wonderland:-paragraph-86]] [[Alice in Wonderland:-paragraph-87]] [[Alice in Wonderland:-paragraph-88]] [[Alice in Wonderland:-paragraph-89]] [[Alice in Wonderland:-paragraph-90]] [[Alice in Wonderland:-paragraph-91]] [[Alice in Wonderland:-paragraph-92]] [[Alice in Wonderland:-paragraph-93]] [[Alice in Wonderland:-paragraph-94]] [[Alice in Wonderland:-paragraph-95]] [[Alice in Wonderland:-paragraph-96]] [[Alice in Wonderland:-paragraph-97]] [[Alice in Wonderland:-paragraph-98]] [[Alice in Wonderland:-paragraph-99]] [[Alice in Wonderland:-paragraph-100]] [[Alice in Wonderland:-paragraph-101]] [[Alice in Wonderland:-paragraph-102]] [[Alice in Wonderland:-paragraph-103]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 4", "tiddler-list": "[[Alice in Wonderland:-paragraph-104]] [[Alice in Wonderland:-paragraph-105]] [[Alice in Wonderland:-paragraph-106]] [[Alice in Wonderland:-paragraph-107]] [[Alice in Wonderland:-paragraph-108]] [[Alice in Wonderland:-paragraph-109]] [[Alice in Wonderland:-paragraph-110]] [[Alice in Wonderland:-paragraph-111]] [[Alice in Wonderland:-paragraph-112]] [[Alice in Wonderland:-paragraph-113]] [[Alice in Wonderland:-paragraph-114]] [[Alice in Wonderland:-paragraph-115]] [[Alice in Wonderland:-paragraph-116]] [[Alice in Wonderland:-paragraph-117]] [[Alice in Wonderland:-paragraph-118]] [[Alice in Wonderland:-paragraph-119]] [[Alice in Wonderland:-paragraph-120]] [[Alice in Wonderland:-paragraph-121]] [[Alice in Wonderland:-paragraph-122]] [[Alice in Wonderland:-paragraph-123]] [[Alice in Wonderland:-paragraph-124]] [[Alice in Wonderland:-paragraph-125]] [[Alice in Wonderland:-paragraph-126]] [[Alice in Wonderland:-paragraph-127]] [[Alice in Wonderland:-paragraph-128]] [[Alice in Wonderland:-paragraph-129]] [[Alice in Wonderland:-paragraph-130]] [[Alice in Wonderland:-paragraph-131]] [[Alice in Wonderland:-paragraph-132]] [[Alice in Wonderland:-paragraph-133]] [[Alice in Wonderland:-paragraph-134]] [[Alice in Wonderland:-paragraph-135]] [[Alice in Wonderland:-paragraph-136]] [[Alice in Wonderland:-paragraph-137]] [[Alice in Wonderland:-paragraph-138]] [[Alice in Wonderland:-paragraph-139]] [[Alice in Wonderland:-paragraph-140]] [[Alice in Wonderland:-paragraph-141]] [[Alice in Wonderland:-paragraph-142]] [[Alice in Wonderland:-paragraph-143]] [[Alice in Wonderland:-paragraph-144]] [[Alice in Wonderland:-paragraph-145]] [[Alice in Wonderland:-paragraph-146]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 5", "tiddler-list": "[[Alice in Wonderland:-paragraph-147]] [[Alice in Wonderland:-paragraph-148]] [[Alice in Wonderland:-paragraph-149]] [[Alice in Wonderland:-paragraph-150]] [[Alice in Wonderland:-paragraph-151]] [[Alice in Wonderland:-paragraph-152]] [[Alice in Wonderland:-paragraph-153]] [[Alice in Wonderland:-paragraph-154]] [[Alice in Wonderland:-paragraph-155]] [[Alice in Wonderland:-paragraph-156]] [[Alice in Wonderland:-paragraph-157]] [[Alice in Wonderland:-paragraph-158]] [[Alice in Wonderland:-paragraph-159]] [[Alice in Wonderland:-paragraph-160]] [[Alice in Wonderland:-paragraph-161]] [[Alice in Wonderland:-paragraph-162]] [[Alice in Wonderland:-paragraph-163]] [[Alice in Wonderland:-paragraph-164]] [[Alice in Wonderland:-paragraph-165]] [[Alice in Wonderland:-paragraph-166]] [[Alice in Wonderland:-paragraph-167]] [[Alice in Wonderland:-paragraph-168]] [[Alice in Wonderland:-paragraph-169]] [[Alice in Wonderland:-paragraph-170]] [[Alice in Wonderland:-paragraph-171]] [[Alice in Wonderland:-paragraph-172]] [[Alice in Wonderland:-paragraph-173]] [[Alice in Wonderland:-paragraph-174]] [[Alice in Wonderland:-paragraph-175]] [[Alice in Wonderland:-paragraph-176]] [[Alice in Wonderland:-paragraph-177]] [[Alice in Wonderland:-paragraph-178]] [[Alice in Wonderland:-paragraph-179]] [[Alice in Wonderland:-paragraph-180]] [[Alice in Wonderland:-paragraph-181]] [[Alice in Wonderland:-paragraph-182]] [[Alice in Wonderland:-paragraph-183]] [[Alice in Wonderland:-paragraph-184]] [[Alice in Wonderland:-paragraph-185]] [[Alice in Wonderland:-paragraph-186]] [[Alice in Wonderland:-paragraph-187]] [[Alice in Wonderland:-paragraph-188]] [[Alice in Wonderland:-paragraph-189]] [[Alice in Wonderland:-paragraph-190]] [[Alice in Wonderland:-paragraph-191]] [[Alice in Wonderland:-paragraph-192]] [[Alice in Wonderland:-paragraph-193]] [[Alice in Wonderland:-paragraph-194]] [[Alice in Wonderland:-paragraph-195]] [[Alice in Wonderland:-paragraph-196]] [[Alice in Wonderland:-paragraph-197]] [[Alice in Wonderland:-paragraph-198]] [[Alice in Wonderland:-paragraph-199]] [[Alice in Wonderland:-paragraph-200]] [[Alice in Wonderland:-paragraph-201]] [[Alice in Wonderland:-paragraph-202]] [[Alice in Wonderland:-paragraph-203]] [[Alice in Wonderland:-paragraph-204]] [[Alice in Wonderland:-paragraph-205]] [[Alice in Wonderland:-paragraph-206]] [[Alice in Wonderland:-paragraph-207]] [[Alice in Wonderland:-paragraph-208]] [[Alice in Wonderland:-paragraph-209]] [[Alice in Wonderland:-paragraph-210]] [[Alice in Wonderland:-paragraph-211]] [[Alice in Wonderland:-paragraph-212]] [[Alice in Wonderland:-paragraph-213]] [[Alice in Wonderland:-paragraph-214]] [[Alice in Wonderland:-paragraph-215]] [[Alice in Wonderland:-paragraph-216]] [[Alice in Wonderland:-paragraph-217]] [[Alice in Wonderland:-paragraph-218]] [[Alice in Wonderland:-paragraph-219]] [[Alice in Wonderland:-paragraph-220]] [[Alice in Wonderland:-paragraph-221]] [[Alice in Wonderland:-paragraph-222]] [[Alice in Wonderland:-paragraph-223]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 6", "tiddler-list": "[[Alice in Wonderland:-paragraph-224]] [[Alice in Wonderland:-paragraph-225]] [[Alice in Wonderland:-paragraph-226]] [[Alice in Wonderland:-paragraph-227]] [[Alice in Wonderland:-paragraph-228]] [[Alice in Wonderland:-paragraph-229]] [[Alice in Wonderland:-paragraph-230]] [[Alice in Wonderland:-paragraph-231]] [[Alice in Wonderland:-paragraph-232]] [[Alice in Wonderland:-paragraph-233]] [[Alice in Wonderland:-paragraph-234]] [[Alice in Wonderland:-paragraph-235]] [[Alice in Wonderland:-paragraph-236]] [[Alice in Wonderland:-paragraph-237]] [[Alice in Wonderland:-paragraph-238]] [[Alice in Wonderland:-paragraph-239]] [[Alice in Wonderland:-paragraph-240]] [[Alice in Wonderland:-paragraph-241]] [[Alice in Wonderland:-paragraph-242]] [[Alice in Wonderland:-paragraph-243]] [[Alice in Wonderland:-paragraph-244]] [[Alice in Wonderland:-paragraph-245]] [[Alice in Wonderland:-paragraph-246]] [[Alice in Wonderland:-paragraph-247]] [[Alice in Wonderland:-paragraph-248]] [[Alice in Wonderland:-paragraph-249]] [[Alice in Wonderland:-paragraph-250]] [[Alice in Wonderland:-paragraph-251]] [[Alice in Wonderland:-paragraph-252]] [[Alice in Wonderland:-paragraph-253]] [[Alice in Wonderland:-paragraph-254]] [[Alice in Wonderland:-paragraph-255]] [[Alice in Wonderland:-paragraph-256]] [[Alice in Wonderland:-paragraph-257]] [[Alice in Wonderland:-paragraph-258]] [[Alice in Wonderland:-paragraph-259]] [[Alice in Wonderland:-paragraph-260]] [[Alice in Wonderland:-paragraph-261]] [[Alice in Wonderland:-paragraph-262]] [[Alice in Wonderland:-paragraph-263]] [[Alice in Wonderland:-paragraph-264]] [[Alice in Wonderland:-paragraph-265]] [[Alice in Wonderland:-paragraph-266]] [[Alice in Wonderland:-paragraph-267]] [[Alice in Wonderland:-paragraph-268]] [[Alice in Wonderland:-paragraph-269]] [[Alice in Wonderland:-paragraph-270]] [[Alice in Wonderland:-paragraph-271]] [[Alice in Wonderland:-paragraph-272]] [[Alice in Wonderland:-paragraph-273]] [[Alice in Wonderland:-paragraph-274]] [[Alice in Wonderland:-paragraph-275]] [[Alice in Wonderland:-paragraph-276]] [[Alice in Wonderland:-paragraph-277]] [[Alice in Wonderland:-paragraph-278]] [[Alice in Wonderland:-paragraph-279]] [[Alice in Wonderland:-paragraph-280]] [[Alice in Wonderland:-paragraph-281]] [[Alice in Wonderland:-paragraph-282]] [[Alice in Wonderland:-paragraph-283]] [[Alice in Wonderland:-paragraph-284]] [[Alice in Wonderland:-paragraph-285]] [[Alice in Wonderland:-paragraph-286]] [[Alice in Wonderland:-paragraph-287]] [[Alice in Wonderland:-paragraph-288]] [[Alice in Wonderland:-paragraph-289]] [[Alice in Wonderland:-paragraph-290]] [[Alice in Wonderland:-paragraph-291]] [[Alice in Wonderland:-paragraph-292]] [[Alice in Wonderland:-paragraph-293]] [[Alice in Wonderland:-paragraph-294]] [[Alice in Wonderland:-paragraph-295]] [[Alice in Wonderland:-paragraph-296]] [[Alice in Wonderland:-paragraph-297]] [[Alice in Wonderland:-paragraph-298]] [[Alice in Wonderland:-paragraph-299]] [[Alice in Wonderland:-paragraph-300]] [[Alice in Wonderland:-paragraph-301]] [[Alice in Wonderland:-paragraph-302]] [[Alice in Wonderland:-paragraph-303]] [[Alice in Wonderland:-paragraph-304]] [[Alice in Wonderland:-paragraph-305]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 7", "tiddler-list": "[[Alice in Wonderland:-paragraph-306]] [[Alice in Wonderland:-paragraph-307]] [[Alice in Wonderland:-paragraph-308]] [[Alice in Wonderland:-paragraph-309]] [[Alice in Wonderland:-paragraph-310]] [[Alice in Wonderland:-paragraph-311]] [[Alice in Wonderland:-paragraph-312]] [[Alice in Wonderland:-paragraph-313]] [[Alice in Wonderland:-paragraph-314]] [[Alice in Wonderland:-paragraph-315]] [[Alice in Wonderland:-paragraph-316]] [[Alice in Wonderland:-paragraph-317]] [[Alice in Wonderland:-paragraph-318]] [[Alice in Wonderland:-paragraph-319]] [[Alice in Wonderland:-paragraph-320]] [[Alice in Wonderland:-paragraph-321]] [[Alice in Wonderland:-paragraph-322]] [[Alice in Wonderland:-paragraph-323]] [[Alice in Wonderland:-paragraph-324]] [[Alice in Wonderland:-paragraph-325]] [[Alice in Wonderland:-paragraph-326]] [[Alice in Wonderland:-paragraph-327]] [[Alice in Wonderland:-paragraph-328]] [[Alice in Wonderland:-paragraph-329]] [[Alice in Wonderland:-paragraph-330]] [[Alice in Wonderland:-paragraph-331]] [[Alice in Wonderland:-paragraph-332]] [[Alice in Wonderland:-paragraph-333]] [[Alice in Wonderland:-paragraph-334]] [[Alice in Wonderland:-paragraph-335]] [[Alice in Wonderland:-paragraph-336]] [[Alice in Wonderland:-paragraph-337]] [[Alice in Wonderland:-paragraph-338]] [[Alice in Wonderland:-paragraph-339]] [[Alice in Wonderland:-paragraph-340]] [[Alice in Wonderland:-paragraph-341]] [[Alice in Wonderland:-paragraph-342]] [[Alice in Wonderland:-paragraph-343]] [[Alice in Wonderland:-paragraph-344]] [[Alice in Wonderland:-paragraph-345]] [[Alice in Wonderland:-paragraph-346]] [[Alice in Wonderland:-paragraph-347]] [[Alice in Wonderland:-paragraph-348]] [[Alice in Wonderland:-paragraph-349]] [[Alice in Wonderland:-paragraph-350]] [[Alice in Wonderland:-paragraph-351]] [[Alice in Wonderland:-paragraph-352]] [[Alice in Wonderland:-paragraph-353]] [[Alice in Wonderland:-paragraph-354]] [[Alice in Wonderland:-paragraph-355]] [[Alice in Wonderland:-paragraph-356]] [[Alice in Wonderland:-paragraph-357]] [[Alice in Wonderland:-paragraph-358]] [[Alice in Wonderland:-paragraph-359]] [[Alice in Wonderland:-paragraph-360]] [[Alice in Wonderland:-paragraph-361]] [[Alice in Wonderland:-paragraph-362]] [[Alice in Wonderland:-paragraph-363]] [[Alice in Wonderland:-paragraph-364]] [[Alice in Wonderland:-paragraph-365]] [[Alice in Wonderland:-paragraph-366]] [[Alice in Wonderland:-paragraph-367]] [[Alice in Wonderland:-paragraph-368]] [[Alice in Wonderland:-paragraph-369]] [[Alice in Wonderland:-paragraph-370]] [[Alice in Wonderland:-paragraph-371]] [[Alice in Wonderland:-paragraph-372]] [[Alice in Wonderland:-paragraph-373]] [[Alice in Wonderland:-paragraph-374]] [[Alice in Wonderland:-paragraph-375]] [[Alice in Wonderland:-paragraph-376]] [[Alice in Wonderland:-paragraph-377]] [[Alice in Wonderland:-paragraph-378]] [[Alice in Wonderland:-paragraph-379]] [[Alice in Wonderland:-paragraph-380]] [[Alice in Wonderland:-paragraph-381]] [[Alice in Wonderland:-paragraph-382]] [[Alice in Wonderland:-paragraph-383]] [[Alice in Wonderland:-paragraph-384]] [[Alice in Wonderland:-paragraph-385]] [[Alice in Wonderland:-paragraph-386]] [[Alice in Wonderland:-paragraph-387]] [[Alice in Wonderland:-paragraph-388]] [[Alice in Wonderland:-paragraph-389]] [[Alice in Wonderland:-paragraph-390]] [[Alice in Wonderland:-paragraph-391]] [[Alice in Wonderland:-paragraph-392]] [[Alice in Wonderland:-paragraph-393]] [[Alice in Wonderland:-paragraph-394]] [[Alice in Wonderland:-paragraph-395]] [[Alice in Wonderland:-paragraph-396]] [[Alice in Wonderland:-paragraph-397]] [[Alice in Wonderland:-paragraph-398]] [[Alice in Wonderland:-paragraph-399]] [[Alice in Wonderland:-paragraph-400]] [[Alice in Wonderland:-paragraph-401]] [[Alice in Wonderland:-paragraph-402]] [[Alice in Wonderland:-paragraph-403]] [[Alice in Wonderland:-paragraph-404]] [[Alice in Wonderland:-paragraph-405]] [[Alice in Wonderland:-paragraph-406]] [[Alice in Wonderland:-paragraph-407]] [[Alice in Wonderland:-paragraph-408]] [[Alice in Wonderland:-paragraph-409]] [[Alice in Wonderland:-paragraph-410]] [[Alice in Wonderland:-paragraph-411]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 8", "tiddler-list": "[[Alice in Wonderland:-paragraph-412]] [[Alice in Wonderland:-paragraph-413]] [[Alice in Wonderland:-paragraph-414]] [[Alice in Wonderland:-paragraph-415]] [[Alice in Wonderland:-paragraph-416]] [[Alice in Wonderland:-paragraph-417]] [[Alice in Wonderland:-paragraph-418]] [[Alice in Wonderland:-paragraph-419]] [[Alice in Wonderland:-paragraph-420]] [[Alice in Wonderland:-paragraph-421]] [[Alice in Wonderland:-paragraph-422]] [[Alice in Wonderland:-paragraph-423]] [[Alice in Wonderland:-paragraph-424]] [[Alice in Wonderland:-paragraph-425]] [[Alice in Wonderland:-paragraph-426]] [[Alice in Wonderland:-paragraph-427]] [[Alice in Wonderland:-paragraph-428]] [[Alice in Wonderland:-paragraph-429]] [[Alice in Wonderland:-paragraph-430]] [[Alice in Wonderland:-paragraph-431]] [[Alice in Wonderland:-paragraph-432]] [[Alice in Wonderland:-paragraph-433]] [[Alice in Wonderland:-paragraph-434]] [[Alice in Wonderland:-paragraph-435]] [[Alice in Wonderland:-paragraph-436]] [[Alice in Wonderland:-paragraph-437]] [[Alice in Wonderland:-paragraph-438]] [[Alice in Wonderland:-paragraph-439]] [[Alice in Wonderland:-paragraph-440]] [[Alice in Wonderland:-paragraph-441]] [[Alice in Wonderland:-paragraph-442]] [[Alice in Wonderland:-paragraph-443]] [[Alice in Wonderland:-paragraph-444]] [[Alice in Wonderland:-paragraph-445]] [[Alice in Wonderland:-paragraph-446]] [[Alice in Wonderland:-paragraph-447]] [[Alice in Wonderland:-paragraph-448]] [[Alice in Wonderland:-paragraph-449]] [[Alice in Wonderland:-paragraph-450]] [[Alice in Wonderland:-paragraph-451]] [[Alice in Wonderland:-paragraph-452]] [[Alice in Wonderland:-paragraph-453]] [[Alice in Wonderland:-paragraph-454]] [[Alice in Wonderland:-paragraph-455]] [[Alice in Wonderland:-paragraph-456]] [[Alice in Wonderland:-paragraph-457]] [[Alice in Wonderland:-paragraph-458]] [[Alice in Wonderland:-paragraph-459]] [[Alice in Wonderland:-paragraph-460]] [[Alice in Wonderland:-paragraph-461]] [[Alice in Wonderland:-paragraph-462]] [[Alice in Wonderland:-paragraph-463]] [[Alice in Wonderland:-paragraph-464]] [[Alice in Wonderland:-paragraph-465]] [[Alice in Wonderland:-paragraph-466]] [[Alice in Wonderland:-paragraph-467]] [[Alice in Wonderland:-paragraph-468]] [[Alice in Wonderland:-paragraph-469]] [[Alice in Wonderland:-paragraph-470]] [[Alice in Wonderland:-paragraph-471]] [[Alice in Wonderland:-paragraph-472]] [[Alice in Wonderland:-paragraph-473]] [[Alice in Wonderland:-paragraph-474]] [[Alice in Wonderland:-paragraph-475]] [[Alice in Wonderland:-paragraph-476]] [[Alice in Wonderland:-paragraph-477]] [[Alice in Wonderland:-paragraph-478]] [[Alice in Wonderland:-paragraph-479]] [[Alice in Wonderland:-paragraph-480]] [[Alice in Wonderland:-paragraph-481]] [[Alice in Wonderland:-paragraph-482]] [[Alice in Wonderland:-paragraph-483]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 9", "tiddler-list": "[[Alice in Wonderland:-paragraph-484]] [[Alice in Wonderland:-paragraph-485]] [[Alice in Wonderland:-paragraph-486]] [[Alice in Wonderland:-paragraph-487]] [[Alice in Wonderland:-paragraph-488]] [[Alice in Wonderland:-paragraph-489]] [[Alice in Wonderland:-paragraph-490]] [[Alice in Wonderland:-paragraph-491]] [[Alice in Wonderland:-paragraph-492]] [[Alice in Wonderland:-paragraph-493]] [[Alice in Wonderland:-paragraph-494]] [[Alice in Wonderland:-paragraph-495]] [[Alice in Wonderland:-paragraph-496]] [[Alice in Wonderland:-paragraph-497]] [[Alice in Wonderland:-paragraph-498]] [[Alice in Wonderland:-paragraph-499]] [[Alice in Wonderland:-paragraph-500]] [[Alice in Wonderland:-paragraph-501]] [[Alice in Wonderland:-paragraph-502]] [[Alice in Wonderland:-paragraph-503]] [[Alice in Wonderland:-paragraph-504]] [[Alice in Wonderland:-paragraph-505]] [[Alice in Wonderland:-paragraph-506]] [[Alice in Wonderland:-paragraph-507]] [[Alice in Wonderland:-paragraph-508]] [[Alice in Wonderland:-paragraph-509]] [[Alice in Wonderland:-paragraph-510]] [[Alice in Wonderland:-paragraph-511]] [[Alice in Wonderland:-paragraph-512]] [[Alice in Wonderland:-paragraph-513]] [[Alice in Wonderland:-paragraph-514]] [[Alice in Wonderland:-paragraph-515]] [[Alice in Wonderland:-paragraph-516]] [[Alice in Wonderland:-paragraph-517]] [[Alice in Wonderland:-paragraph-518]] [[Alice in Wonderland:-paragraph-519]] [[Alice in Wonderland:-paragraph-520]] [[Alice in Wonderland:-paragraph-521]] [[Alice in Wonderland:-paragraph-522]] [[Alice in Wonderland:-paragraph-523]] [[Alice in Wonderland:-paragraph-524]] [[Alice in Wonderland:-paragraph-525]] [[Alice in Wonderland:-paragraph-526]] [[Alice in Wonderland:-paragraph-527]] [[Alice in Wonderland:-paragraph-528]] [[Alice in Wonderland:-paragraph-529]] [[Alice in Wonderland:-paragraph-530]] [[Alice in Wonderland:-paragraph-531]] [[Alice in Wonderland:-paragraph-532]] [[Alice in Wonderland:-paragraph-533]] [[Alice in Wonderland:-paragraph-534]] [[Alice in Wonderland:-paragraph-535]] [[Alice in Wonderland:-paragraph-536]] [[Alice in Wonderland:-paragraph-537]] [[Alice in Wonderland:-paragraph-538]] [[Alice in Wonderland:-paragraph-539]] [[Alice in Wonderland:-paragraph-540]] [[Alice in Wonderland:-paragraph-541]] [[Alice in Wonderland:-paragraph-542]] [[Alice in Wonderland:-paragraph-543]] [[Alice in Wonderland:-paragraph-544]] [[Alice in Wonderland:-paragraph-545]] [[Alice in Wonderland:-paragraph-546]] [[Alice in Wonderland:-paragraph-547]] [[Alice in Wonderland:-paragraph-548]] [[Alice in Wonderland:-paragraph-549]] [[Alice in Wonderland:-paragraph-550]] [[Alice in Wonderland:-paragraph-551]] [[Alice in Wonderland:-paragraph-552]] [[Alice in Wonderland:-paragraph-553]] [[Alice in Wonderland:-paragraph-554]] [[Alice in Wonderland:-paragraph-555]] [[Alice in Wonderland:-paragraph-556]] [[Alice in Wonderland:-paragraph-557]] [[Alice in Wonderland:-paragraph-558]] [[Alice in Wonderland:-paragraph-559]] [[Alice in Wonderland:-paragraph-560]] [[Alice in Wonderland:-paragraph-561]] [[Alice in Wonderland:-paragraph-562]] [[Alice in Wonderland:-paragraph-563]] [[Alice in Wonderland:-paragraph-564]] [[Alice in Wonderland:-paragraph-565]] [[Alice in Wonderland:-paragraph-566]] [[Alice in Wonderland:-paragraph-567]] [[Alice in Wonderland:-paragraph-568]] [[Alice in Wonderland:-paragraph-569]] [[Alice in Wonderland:-paragraph-570]] [[Alice in Wonderland:-paragraph-571]] [[Alice in Wonderland:-paragraph-572]] [[Alice in Wonderland:-paragraph-573]] [[Alice in Wonderland:-paragraph-574]] [[Alice in Wonderland:-paragraph-575]] [[Alice in Wonderland:-paragraph-576]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 10", "tiddler-list": "[[Alice in Wonderland:-paragraph-577]] [[Alice in Wonderland:-paragraph-578]] [[Alice in Wonderland:-paragraph-579]] [[Alice in Wonderland:-paragraph-580]] [[Alice in Wonderland:-paragraph-581]] [[Alice in Wonderland:-paragraph-582]] [[Alice in Wonderland:-paragraph-583]] [[Alice in Wonderland:-paragraph-584]] [[Alice in Wonderland:-paragraph-585]] [[Alice in Wonderland:-paragraph-586]] [[Alice in Wonderland:-paragraph-587]] [[Alice in Wonderland:-paragraph-588]] [[Alice in Wonderland:-paragraph-589]] [[Alice in Wonderland:-paragraph-590]] [[Alice in Wonderland:-paragraph-591]] [[Alice in Wonderland:-paragraph-592]] [[Alice in Wonderland:-paragraph-593]] [[Alice in Wonderland:-paragraph-594]] [[Alice in Wonderland:-paragraph-595]] [[Alice in Wonderland:-paragraph-596]] [[Alice in Wonderland:-paragraph-597]] [[Alice in Wonderland:-paragraph-598]] [[Alice in Wonderland:-paragraph-599]] [[Alice in Wonderland:-paragraph-600]] [[Alice in Wonderland:-paragraph-601]] [[Alice in Wonderland:-paragraph-602]] [[Alice in Wonderland:-paragraph-603]] [[Alice in Wonderland:-paragraph-604]] [[Alice in Wonderland:-paragraph-605]] [[Alice in Wonderland:-paragraph-606]] [[Alice in Wonderland:-paragraph-607]] [[Alice in Wonderland:-paragraph-608]] [[Alice in Wonderland:-paragraph-609]] [[Alice in Wonderland:-paragraph-610]] [[Alice in Wonderland:-paragraph-611]] [[Alice in Wonderland:-paragraph-612]] [[Alice in Wonderland:-paragraph-613]] [[Alice in Wonderland:-paragraph-614]] [[Alice in Wonderland:-paragraph-615]] [[Alice in Wonderland:-paragraph-616]] [[Alice in Wonderland:-paragraph-617]] [[Alice in Wonderland:-paragraph-618]] [[Alice in Wonderland:-paragraph-619]] [[Alice in Wonderland:-paragraph-620]] [[Alice in Wonderland:-paragraph-621]] [[Alice in Wonderland:-paragraph-622]] [[Alice in Wonderland:-paragraph-623]] [[Alice in Wonderland:-paragraph-624]] [[Alice in Wonderland:-paragraph-625]] [[Alice in Wonderland:-paragraph-626]] [[Alice in Wonderland:-paragraph-627]] [[Alice in Wonderland:-paragraph-628]] [[Alice in Wonderland:-paragraph-629]] [[Alice in Wonderland:-paragraph-630]] [[Alice in Wonderland:-paragraph-631]] [[Alice in Wonderland:-paragraph-632]] [[Alice in Wonderland:-paragraph-633]] [[Alice in Wonderland:-paragraph-634]] [[Alice in Wonderland:-paragraph-635]] [[Alice in Wonderland:-paragraph-636]] [[Alice in Wonderland:-paragraph-637]] [[Alice in Wonderland:-paragraph-638]] [[Alice in Wonderland:-paragraph-639]] [[Alice in Wonderland:-paragraph-640]] [[Alice in Wonderland:-paragraph-641]] [[Alice in Wonderland:-paragraph-642]] [[Alice in Wonderland:-paragraph-643]] [[Alice in Wonderland:-paragraph-644]] [[Alice in Wonderland:-paragraph-645]] [[Alice in Wonderland:-paragraph-646]] [[Alice in Wonderland:-paragraph-647]] [[Alice in Wonderland:-paragraph-648]] [[Alice in Wonderland:-paragraph-649]] [[Alice in Wonderland:-paragraph-650]] [[Alice in Wonderland:-paragraph-651]] [[Alice in Wonderland:-paragraph-652]] [[Alice in Wonderland:-paragraph-653]] [[Alice in Wonderland:-paragraph-654]] [[Alice in Wonderland:-paragraph-655]] [[Alice in Wonderland:-paragraph-656]] [[Alice in Wonderland:-paragraph-657]] [[Alice in Wonderland:-paragraph-658]] [[Alice in Wonderland:-paragraph-659]] [[Alice in Wonderland:-paragraph-660]] [[Alice in Wonderland:-paragraph-661]] [[Alice in Wonderland:-paragraph-662]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 11", "tiddler-list": "[[Alice in Wonderland:-paragraph-663]] [[Alice in Wonderland:-paragraph-664]] [[Alice in Wonderland:-paragraph-665]] [[Alice in Wonderland:-paragraph-666]] [[Alice in Wonderland:-paragraph-667]] [[Alice in Wonderland:-paragraph-668]] [[Alice in Wonderland:-paragraph-669]] [[Alice in Wonderland:-paragraph-670]] [[Alice in Wonderland:-paragraph-671]] [[Alice in Wonderland:-paragraph-672]] [[Alice in Wonderland:-paragraph-673]] [[Alice in Wonderland:-paragraph-674]] [[Alice in Wonderland:-paragraph-675]] [[Alice in Wonderland:-paragraph-676]] [[Alice in Wonderland:-paragraph-677]] [[Alice in Wonderland:-paragraph-678]] [[Alice in Wonderland:-paragraph-679]] [[Alice in Wonderland:-paragraph-680]] [[Alice in Wonderland:-paragraph-681]] [[Alice in Wonderland:-paragraph-682]] [[Alice in Wonderland:-paragraph-683]] [[Alice in Wonderland:-paragraph-684]] [[Alice in Wonderland:-paragraph-685]] [[Alice in Wonderland:-paragraph-686]] [[Alice in Wonderland:-paragraph-687]] [[Alice in Wonderland:-paragraph-688]] [[Alice in Wonderland:-paragraph-689]] [[Alice in Wonderland:-paragraph-690]] [[Alice in Wonderland:-paragraph-691]] [[Alice in Wonderland:-paragraph-692]] [[Alice in Wonderland:-paragraph-693]] [[Alice in Wonderland:-paragraph-694]] [[Alice in Wonderland:-paragraph-695]] [[Alice in Wonderland:-paragraph-696]] [[Alice in Wonderland:-paragraph-697]] [[Alice in Wonderland:-paragraph-698]] [[Alice in Wonderland:-paragraph-699]] [[Alice in Wonderland:-paragraph-700]] [[Alice in Wonderland:-paragraph-701]] [[Alice in Wonderland:-paragraph-702]] [[Alice in Wonderland:-paragraph-703]] [[Alice in Wonderland:-paragraph-704]] [[Alice in Wonderland:-paragraph-705]] [[Alice in Wonderland:-paragraph-706]] [[Alice in Wonderland:-paragraph-707]] [[Alice in Wonderland:-paragraph-708]] [[Alice in Wonderland:-paragraph-709]] [[Alice in Wonderland:-paragraph-710]] [[Alice in Wonderland:-paragraph-711]] [[Alice in Wonderland:-paragraph-712]] [[Alice in Wonderland:-paragraph-713]] [[Alice in Wonderland:-paragraph-714]] [[Alice in Wonderland:-paragraph-715]] [[Alice in Wonderland:-paragraph-716]] [[Alice in Wonderland:-paragraph-717]] [[Alice in Wonderland:-paragraph-718]] [[Alice in Wonderland:-paragraph-719]] [[Alice in Wonderland:-paragraph-720]] [[Alice in Wonderland:-paragraph-721]] [[Alice in Wonderland:-paragraph-722]] [[Alice in Wonderland:-paragraph-723]] [[Alice in Wonderland:-paragraph-724]] [[Alice in Wonderland:-paragraph-725]] [[Alice in Wonderland:-paragraph-726]] [[Alice in Wonderland:-paragraph-727]] [[Alice in Wonderland:-paragraph-728]] [[Alice in Wonderland:-paragraph-729]] [[Alice in Wonderland:-paragraph-730]] [[Alice in Wonderland:-paragraph-731]] [[Alice in Wonderland:-paragraph-732]] [[Alice in Wonderland:-paragraph-733]] [[Alice in Wonderland:-paragraph-734]] [[Alice in Wonderland:-paragraph-735]] [[Alice in Wonderland:-paragraph-736]] [[Alice in Wonderland:-paragraph-737]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 12", "tiddler-list": "[[Alice in Wonderland:-paragraph-738]] [[Alice in Wonderland:-paragraph-739]] [[Alice in Wonderland:-paragraph-740]] [[Alice in Wonderland:-paragraph-741]] [[Alice in Wonderland:-paragraph-742]] [[Alice in Wonderland:-paragraph-743]] [[Alice in Wonderland:-paragraph-744]] [[Alice in Wonderland:-paragraph-745]] [[Alice in Wonderland:-paragraph-746]] [[Alice in Wonderland:-paragraph-747]] [[Alice in Wonderland:-paragraph-748]] [[Alice in Wonderland:-paragraph-749]] [[Alice in Wonderland:-paragraph-750]] [[Alice in Wonderland:-paragraph-751]] [[Alice in Wonderland:-paragraph-752]] [[Alice in Wonderland:-paragraph-753]] [[Alice in Wonderland:-paragraph-754]] [[Alice in Wonderland:-paragraph-755]] [[Alice in Wonderland:-paragraph-756]] [[Alice in Wonderland:-paragraph-757]] [[Alice in Wonderland:-paragraph-758]] [[Alice in Wonderland:-paragraph-759]] [[Alice in Wonderland:-paragraph-760]] [[Alice in Wonderland:-paragraph-761]] [[Alice in Wonderland:-paragraph-762]] [[Alice in Wonderland:-paragraph-763]] [[Alice in Wonderland:-paragraph-764]] [[Alice in Wonderland:-paragraph-765]] [[Alice in Wonderland:-paragraph-766]] [[Alice in Wonderland:-paragraph-767]] [[Alice in Wonderland:-paragraph-768]] [[Alice in Wonderland:-paragraph-769]] [[Alice in Wonderland:-paragraph-770]] [[Alice in Wonderland:-paragraph-771]] [[Alice in Wonderland:-paragraph-772]] [[Alice in Wonderland:-paragraph-773]] [[Alice in Wonderland:-paragraph-774]] [[Alice in Wonderland:-paragraph-775]] [[Alice in Wonderland:-paragraph-776]] [[Alice in Wonderland:-paragraph-777]] [[Alice in Wonderland:-paragraph-778]] [[Alice in Wonderland:-paragraph-779]] [[Alice in Wonderland:-paragraph-780]] [[Alice in Wonderland:-paragraph-781]] [[Alice in Wonderland:-paragraph-782]] [[Alice in Wonderland:-paragraph-783]] [[Alice in Wonderland:-paragraph-784]] [[Alice in Wonderland:-paragraph-785]] [[Alice in Wonderland:-paragraph-786]] [[Alice in Wonderland:-paragraph-787]] [[Alice in Wonderland:-paragraph-788]] [[Alice in Wonderland:-paragraph-789]] [[Alice in Wonderland:-paragraph-790]] [[Alice in Wonderland:-paragraph-791]] [[Alice in Wonderland:-paragraph-792]] [[Alice in Wonderland:-paragraph-793]] [[Alice in Wonderland:-paragraph-794]] [[Alice in Wonderland:-paragraph-795]] [[Alice in Wonderland:-paragraph-796]] [[Alice in Wonderland:-paragraph-797]] [[Alice in Wonderland:-paragraph-798]] [[Alice in Wonderland:-paragraph-799]] [[Alice in Wonderland:-paragraph-800]] [[Alice in Wonderland:-paragraph-801]] [[Alice in Wonderland:-paragraph-802]] [[Alice in Wonderland:-paragraph-803]] [[Alice in Wonderland:-paragraph-804]] [[Alice in Wonderland:-paragraph-805]] [[Alice in Wonderland:-paragraph-806]] [[Alice in Wonderland:-paragraph-807]] [[Alice in Wonderland:-paragraph-808]] [[Alice in Wonderland:-paragraph-809]] [[Alice in Wonderland:-paragraph-810]]", "tags": "TableOfContents", "text": ""} +] + + + + + + + + + + + + diff --git a/plugins/tiddlywiki/dynaview/docs.tid b/plugins/tiddlywiki/dynaview/docs.tid index bf55007fa..aa3fdfaa9 100644 --- a/plugins/tiddlywiki/dynaview/docs.tid +++ b/plugins/tiddlywiki/dynaview/docs.tid @@ -27,11 +27,15 @@ Note that it is not recommended to use this setting at the same time as the "Upd !! Set tiddler field when visible -The background task detects when elements with the class `tc-dynaview-set-tiddler-when-visible` scroll into view. The first time that they do, the background task assigns the value in the attribute `data-dynaview-set-value` to the tiddler whose title is in the attribute `data-dynaview-set-tiddler`. This assignment can be tied to a reveal widget to cause content to be displayed when it becomes visible. If the class `tc-dynaview-expand-viewport` is set then the viewport is expanded so that the processing occurs when elements move near the viewport. +The background task detects when elements with the class `tc-dynaview-set-tiddler-when-visible` scroll into view. The first time that they do, the background task assigns the value in the attribute `data-dynaview-set-value` to the tiddler whose title is in the attribute `data-dynaview-set-tiddler`. -!! Unset tiddler field when set visible before but then scrolled out of view +This assignment can be tied to a reveal widget to cause content to be displayed when it becomes visible. -The background task detects when elements with the class `tc-dynaview-set-tiddler-when-visible` scroll out view after they have scrolled into view. When scrolling out of view after they have scrolled in, the background task assigns the value in the attribute `data-dynaview-unset-value` to the tiddler whose title is in the attribute `data-dynaview-unset-tiddler`. This assignment can be tied to a reveal widget to cause content to be hidden when it becomes invisible. If the class `tc-dynaview-expand-viewport` is set then the viewport is expanded so that the processing occurs when elements move near the viewport. +If the class `tc-dynaview-expand-viewport` is set then the viewport is expanded so that the processing occurs when elements move near the viewport. + +!!! Unset tiddler field when set visible before but then scrolled out of view + +In addition to the processing described above, if the element also has the attribute `data-dynaview-unset-value` then its value will be assigned to the associated tiddler if the element is out of view and the current value of the tiddler corresponds to the value specified in the `data-dynaview-set-value` attribute. !! Update address bar when scrolling diff --git a/plugins/tiddlywiki/dynaview/dynaview.js b/plugins/tiddlywiki/dynaview/dynaview.js index 46cef336a..bfaae66fa 100644 --- a/plugins/tiddlywiki/dynaview/dynaview.js +++ b/plugins/tiddlywiki/dynaview/dynaview.js @@ -108,10 +108,6 @@ function setZoomClasses() { function checkVisibility() { var elements = document.querySelectorAll(".tc-dynaview-set-tiddler-when-visible"); $tw.utils.each(elements,function(element) { - // Bail if we've already triggered this element and we're not unsetting a tiddler when this element leaves the viewport - if(element.getAttribute("data-dynaview-has-triggered") === "true" && !element.hasAttribute("data-dynaview-unset-tiddler")) { - return; - } // Calculate whether the element is visible var elementRect = element.getBoundingClientRect(), viewportWidth = window.innerWidth || document.documentElement.clientWidth, @@ -122,8 +118,9 @@ function checkVisibility() { top: 0, bottom: viewportHeight }, - tiddler, - value; + title = element.getAttribute("data-dynaview-set-tiddler"), + setValue = element.getAttribute("data-dynaview-set-value") || "", + unsetValue = element.getAttribute("data-dynaview-unset-value") || ""; if(element.classList.contains("tc-dynaview-expand-viewport")) { viewportRect.left -= viewportWidth; viewportRect.right += viewportWidth; @@ -135,23 +132,15 @@ function checkVisibility() { elementRect.top > viewportRect.bottom || elementRect.bottom < viewportRect.top) { // Element is not visible - // Set the unset tiddler if required and this element has previously been triggered - if(element.getAttribute("data-dynaview-has-triggered") === "true" && element.hasAttribute("data-dynaview-unset-tiddler")) { - tiddler = element.getAttribute("data-dynaview-unset-tiddler"); - value = element.getAttribute("data-dynaview-unset-value") || ""; - if(tiddler && $tw.wiki.getTiddlerText(tiddler) !== value) { - $tw.wiki.addTiddler(new $tw.Tiddler({title: tiddler, text: value})); - } - element.setAttribute("data-dynaview-has-triggered","false"); + // Set the unset tiddler if required + if(title && unsetValue && $tw.wiki.getTiddlerText(title) === setValue) { + $tw.wiki.addTiddler(new $tw.Tiddler({title: title, text: unsetValue})); } } else { // Element is visible - tiddler = element.getAttribute("data-dynaview-set-tiddler"); - value = element.getAttribute("data-dynaview-set-value") || ""; - if(tiddler && $tw.wiki.getTiddlerText(tiddler) !== value) { - $tw.wiki.addTiddler(new $tw.Tiddler({title: tiddler, text: value})); + if(title && $tw.wiki.getTiddlerText(title) !== setValue) { + $tw.wiki.addTiddler(new $tw.Tiddler({title: title, text: setValue})); } - element.setAttribute("data-dynaview-has-triggered","true"); } }); } From 9f0d726f7d486a61ede0f673f69725ee5a00671d Mon Sep 17 00:00:00 2001 From: Jermolene Date: Thu, 21 Mar 2019 12:56:26 +0000 Subject: [PATCH 0060/2376] Dynaview: Simplify visibility tracking logic --- .../dynaviewdemo/tiddlers/SideBar-Open.tid | 11 ++-- .../dynaviewdemo/tiddlers/TableOfContents.tid | 6 +-- .../dynaviewdemo/tiddlers/ViewTemplate.tid | 4 +- plugins/tiddlywiki/dynaview/docs.tid | 19 ++++--- plugins/tiddlywiki/dynaview/dynaview.js | 50 +++++++++++-------- 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/editions/dynaviewdemo/tiddlers/SideBar-Open.tid b/editions/dynaviewdemo/tiddlers/SideBar-Open.tid index fac95637e..b3e42d2b2 100644 --- a/editions/dynaviewdemo/tiddlers/SideBar-Open.tid +++ b/editions/dynaviewdemo/tiddlers/SideBar-Open.tid @@ -18,11 +18,14 @@ caption: {{$:/language/SideBar/Open/Caption}} <$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">× <$link to={{!!title}}><$view field="title"/> <$set name="state" value={{{ [[$:/state/viewtemplate/visibility/]addsuffix] }}}> -<$reveal type="match" stateTitle=<> text="true"> -LOADED +<$reveal type="match" stateTitle=<> text="0"> +OUT OF VIEW -<$reveal type="match" stateTitle=<> text="false"> -UNLOADED +<$reveal type="match" stateTitle=<> text="1"> +NEAR + +<$reveal type="match" stateTitle=<> text="2"> +VISIBLE
diff --git a/editions/dynaviewdemo/tiddlers/TableOfContents.tid b/editions/dynaviewdemo/tiddlers/TableOfContents.tid index e3cc5f653..4d5559f44 100644 --- a/editions/dynaviewdemo/tiddlers/TableOfContents.tid +++ b/editions/dynaviewdemo/tiddlers/TableOfContents.tid @@ -8,9 +8,9 @@ caption: Contents <$vars item=<> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}} excluded="""[enlist<__exclude__>] -[<__tag__>]""">
  • <$link to={{{ [enlist{!!tiddler-list}] }}}> -<$list filter="[enlist{!!tiddler-list}addprefix[$:/state/viewtemplate/visibility/]text[true]limit[1]]" variable="listItem" emptyMessage="""
    """> -
    - + <$list filter="[enlist{!!tiddler-list}addprefix[$:/state/viewtemplate/visibility/]text[2]limit[1]]" variable="listItem" emptyMessage="""
    """> +
    + <$view field='caption'> <$view field='title'/> diff --git a/editions/dynaviewdemo/tiddlers/ViewTemplate.tid b/editions/dynaviewdemo/tiddlers/ViewTemplate.tid index 07f93928f..881c7aaff 100644 --- a/editions/dynaviewdemo/tiddlers/ViewTemplate.tid +++ b/editions/dynaviewdemo/tiddlers/ViewTemplate.tid @@ -12,14 +12,14 @@ $:/state/folded/$(currentTiddler)$
    > data-tags={{!!tags}} class=<>> <$set name="state" value={{{ [[$:/state/viewtemplate/visibility/]addsuffix] }}}> <$reveal stateTitle=<> type="nomatch" text="" default="" tag="div"> -
    > data-dynaview-set-value="true" data-dynaview-unset-value="false"> +
    >> <$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem"> <$transclude tiddler=<>/>
    <$reveal stateTitle=<> type="match" text="" default="" tag="div"> -
    > data-dynaview-set-value="true" data-dynaview-unset-value="false"> +
    >>
    diff --git a/plugins/tiddlywiki/dynaview/docs.tid b/plugins/tiddlywiki/dynaview/docs.tid index aa3fdfaa9..2e8dd8189 100644 --- a/plugins/tiddlywiki/dynaview/docs.tid +++ b/plugins/tiddlywiki/dynaview/docs.tid @@ -25,17 +25,24 @@ Optionally, ~DynaView can store the current scroll position in local storage and Note that it is not recommended to use this setting at the same time as the "UpdateAddressBar" option. -!! Set tiddler field when visible +!! Visibility tracking -The background task detects when elements with the class `tc-dynaview-set-tiddler-when-visible` scroll into view. The first time that they do, the background task assigns the value in the attribute `data-dynaview-set-value` to the tiddler whose title is in the attribute `data-dynaview-set-tiddler`. +The background task detects when elements with the class `tc-dynaview-track-tiddler-when-visible` scroll in and out of view. It tracks four different states: -This assignment can be tied to a reveal widget to cause content to be displayed when it becomes visible. +* ''Blank/missing'' -- The element has not yet been scrolled into view +* ''0'' -- The element has been scrolled into view, but subsequently scrolled out of view +* ''1'' -- The element is near the viewport +* ''2'' -- The element is partially or wholly within the viewport -If the class `tc-dynaview-expand-viewport` is set then the viewport is expanded so that the processing occurs when elements move near the viewport. +The processing applied to each element is as follows: -!!! Unset tiddler field when set visible before but then scrolled out of view +* If the element is partially or wholly within the viewport then set the state to "2" +* If the element is near the viewport then set the state to "1" +* If the element is fully outside the viewport then only set the state to "0" if it is currently unset (ie blank/missing) -In addition to the processing described above, if the element also has the attribute `data-dynaview-unset-value` then its value will be assigned to the associated tiddler if the element is out of view and the current value of the tiddler corresponds to the value specified in the `data-dynaview-set-value` attribute. +Attributes on the tracked element specify the following parameters: + +* ''data-dynaview-track-tiddler'' -- specifies the tiddler in which the element tracking state will be stored !! Update address bar when scrolling diff --git a/plugins/tiddlywiki/dynaview/dynaview.js b/plugins/tiddlywiki/dynaview/dynaview.js index bfaae66fa..12230b337 100644 --- a/plugins/tiddlywiki/dynaview/dynaview.js +++ b/plugins/tiddlywiki/dynaview/dynaview.js @@ -18,6 +18,10 @@ exports.platforms = ["browser"]; exports.before = ["story"]; exports.synchronous = true; +var STATE_OUT_OF_VIEW = "0", + STATE_NEAR_VIEW = "1", + STATE_IN_VIEW = "2"; + var isWaitingForAnimationFrame = 0, // Bitmask: ANIM_FRAME_CAUSED_BY_LOAD = 1, // Animation frame was requested because of page load ANIM_FRAME_CAUSED_BY_SCROLL = 2, // Animation frame was requested because of page scroll @@ -106,7 +110,7 @@ function setZoomClasses() { } function checkVisibility() { - var elements = document.querySelectorAll(".tc-dynaview-set-tiddler-when-visible"); + var elements = document.querySelectorAll(".tc-dynaview-track-tiddler-when-visible"); $tw.utils.each(elements,function(element) { // Calculate whether the element is visible var elementRect = element.getBoundingClientRect(), @@ -118,28 +122,30 @@ function checkVisibility() { top: 0, bottom: viewportHeight }, - title = element.getAttribute("data-dynaview-set-tiddler"), - setValue = element.getAttribute("data-dynaview-set-value") || "", - unsetValue = element.getAttribute("data-dynaview-unset-value") || ""; - if(element.classList.contains("tc-dynaview-expand-viewport")) { - viewportRect.left -= viewportWidth; - viewportRect.right += viewportWidth; - viewportRect.top -= viewportHeight; - viewportRect.bottom += viewportHeight; - } - if(elementRect.left > viewportRect.right || - elementRect.right < viewportRect.left || - elementRect.top > viewportRect.bottom || - elementRect.bottom < viewportRect.top) { - // Element is not visible - // Set the unset tiddler if required - if(title && unsetValue && $tw.wiki.getTiddlerText(title) === setValue) { - $tw.wiki.addTiddler(new $tw.Tiddler({title: title, text: unsetValue})); + title = element.getAttribute("data-dynaview-track-tiddler"); + if(title) { + var currValue = $tw.wiki.getTiddlerText(title), + newValue = currValue; + // Within viewport + if(!(elementRect.left > viewportRect.right || + elementRect.right < viewportRect.left || + elementRect.top > viewportRect.bottom || + elementRect.bottom < viewportRect.top)) { + newValue = STATE_IN_VIEW; + // Near viewport + } else if(!(elementRect.left > (viewportRect.right + viewportWidth) || + elementRect.right < (viewportRect.left - viewportWidth) || + elementRect.top > (viewportRect.bottom + viewportHeight) || + elementRect.bottom < (viewportRect.top - viewportHeight))) { + newValue = STATE_NEAR_VIEW; + } else { + // Outside viewport + if(currValue !== undefined) { + newValue = STATE_OUT_OF_VIEW; + } } - } else { - // Element is visible - if(title && $tw.wiki.getTiddlerText(title) !== setValue) { - $tw.wiki.addTiddler(new $tw.Tiddler({title: title, text: setValue})); + if(newValue !== currValue) { + $tw.wiki.addTiddler(new $tw.Tiddler({title: title, text: newValue})); } } }); From fffd0ee9e17d6b6a561648a42f0f200d4bb04046 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 22 Mar 2019 09:20:25 +0000 Subject: [PATCH 0061/2376] AWS: Add command for setting credentials profile --- plugins/tiddlywiki/aws/docs/help.tid | 10 ++++++++++ plugins/tiddlywiki/aws/modules/command.js | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/plugins/tiddlywiki/aws/docs/help.tid b/plugins/tiddlywiki/aws/docs/help.tid index c6b294e07..dc07f24f3 100644 --- a/plugins/tiddlywiki/aws/docs/help.tid +++ b/plugins/tiddlywiki/aws/docs/help.tid @@ -9,6 +9,16 @@ Perform operation on Amazon Web Services --aws [ ...] ``` +! "profile" subcommand + +Sets the AWS credentials profile to be used for subsequent commands. + +``` +--aws profile +``` + +* ''profile-name'': AWS profile name + ! "s3-load" subcommand Load tiddlers from files in an S3 bucket. diff --git a/plugins/tiddlywiki/aws/modules/command.js b/plugins/tiddlywiki/aws/modules/command.js index 3c62e87d9..294f182bd 100644 --- a/plugins/tiddlywiki/aws/modules/command.js +++ b/plugins/tiddlywiki/aws/modules/command.js @@ -42,6 +42,15 @@ Command.prototype.execute = function() { Command.prototype.subCommands = {}; +// Set credentials profile +Command.prototype.subCommands["profile"] = function() { + var AWS = require("aws-sdk"), + profile = this.params[1], + credentials = new AWS.SharedIniFileCredentials({profile: profile}); + AWS.config.update({credentials: credentials}); + this.callback(null); +}; + // Load tiddlers from files in an S3 bucket Command.prototype.subCommands["s3-load"] = function() { var self = this, From d38b42f7c70461bf3df57cd0149e59638dfeae87 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 22 Mar 2019 17:27:20 +0000 Subject: [PATCH 0062/2376] AWS Plugin: Don't error when no files to load --- plugins/tiddlywiki/aws/modules/command.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/aws/modules/command.js b/plugins/tiddlywiki/aws/modules/command.js index 294f182bd..880eea924 100644 --- a/plugins/tiddlywiki/aws/modules/command.js +++ b/plugins/tiddlywiki/aws/modules/command.js @@ -59,8 +59,8 @@ Command.prototype.subCommands["s3-load"] = function() { bucket = this.params[2], filepaths = this.params.slice(3); // Check parameters - if(!region || !bucket || filepaths.length < 1) { - throw "Missing parameters"; + if(!region || !bucket) { + self.callback("Missing parameters"); } async.eachLimit( filepaths, From d51a89135dc3cde16bc0b3b8b67f8d5ff733fac2 Mon Sep 17 00:00:00 2001 From: Brooks Boyd Date: Fri, 22 Mar 2019 13:08:36 -0500 Subject: [PATCH 0063/2376] Add signature for MidnightDesign, LLC to CLA Entity agreement (#3877) --- licenses/cla-entity.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/licenses/cla-entity.md b/licenses/cla-entity.md index cb8603085..a42687687 100644 --- a/licenses/cla-entity.md +++ b/licenses/cla-entity.md @@ -12,7 +12,7 @@ This contributor agreement ("Agreement") documents the rights granted by contrib "CLA" means Contributor License Agreement (this document). "Contribution" means any work of authorship that is Submitted by You to Us in which You own or assert ownership of the Copyright. If You do not own the Copyright in the entire work of authorship, please follow the instructions in `contributing.md`, which is in the root directory of the project repository. - + "Copyright" means all rights protecting works of authorship owned or controlled by You or Your Affiliates, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence including any extensions by You. "Material" means the work of authorship which is made available by Us to third parties. When this Agreement covers more than one software project, the Material means the work of authorship to which the Contribution was Submitted. After You Submit the Contribution, it may be included in the Material. @@ -25,7 +25,7 @@ This contributor agreement ("Agreement") documents the rights granted by contrib "Media" means any portion of a Contribution which is not software. -"Legal Entity" means an entity which is not a natural person. +"Legal Entity" means an entity which is not a natural person. "Affiliates" means other Legal Entities that control, are controlled by, or under common control with that Legal Entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such Legal Entity, whether by contract or otherwise, (ii) ownership of fifty percent (50%) or more of the outstanding shares or securities which vote to elect the management or other persons who direct such Legal Entity or (iii) beneficial ownership of such entity. @@ -71,7 +71,7 @@ You confirm that: (a) You have the legal authority to enter into this Agreement. -(b) You or Your Affiliates own the Copyright and patent claims covering the Contribution which are required to grant the rights under Section 2. +(b) You or Your Affiliates own the Copyright and patent claims covering the Contribution which are required to grant the rights under Section 2. (c) The grant of rights under Section 2 does not violate any grant of rights which You or Your Affiliates have made to third parties. @@ -109,3 +109,5 @@ eg: Jeremy Ruston, @Jermolene for Federatial Limited, 2011/11/22 Jeremy Ruston, @Jermolene for Federatial Limited, 2011/11/22 Google Inc, 2015/12/21 + +Brooks Boyd, @MidnightLightning for MidnightDesign, LLC 2019/03/21 From b1edcdb757dd49382d0c4e27e08c6734ee89ae19 Mon Sep 17 00:00:00 2001 From: jed Date: Tue, 26 Mar 2019 22:57:58 +0100 Subject: [PATCH 0064/2376] Add unusedtitle macro (#3880) * Add uniquetitle macro This macro is a wrapper on the $tw.wiki.generateNewTitle function to return a unique name, it has been requested multiple times in the forums. * Add documentation tiddler for uniquetitle macro * Add uniquetitle macro examples * Change name from uniquetitle to unusedtitle for clarity The title isn't unique, just not currently used in the wiki. * Update uniquetitle to unusedtitle * Change uniquetitle to unusedtitle * Fix a typo --- core/modules/macros/uniquetitle.js | 34 +++++++++++++++++++ .../tiddlers/macros/UnusedTitleMacro.tid | 16 +++++++++ .../tiddlers/macros/examples/unusedtitle.tid | 7 ++++ 3 files changed, 57 insertions(+) create mode 100644 core/modules/macros/uniquetitle.js create mode 100644 editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid create mode 100644 editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid diff --git a/core/modules/macros/uniquetitle.js b/core/modules/macros/uniquetitle.js new file mode 100644 index 000000000..8531d1ce7 --- /dev/null +++ b/core/modules/macros/uniquetitle.js @@ -0,0 +1,34 @@ +/*\ +title: $:/core/modules/macros/unusedtitle.js +type: application/javascript +module-type: macro +Macro to return a new title that is unused in the wiki. It can be given a name as a base. +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Information about this macro +*/ + +exports.name = "unusedtitle"; + +exports.params = [ + {name: "baseName"}, + {name: "options"} +]; + +/* +Run the macro +*/ +exports.run = function(baseName, options) { + if(!baseName) { + baseName = $tw.language.getString("DefaultNewTiddlerTitle"); + } + return this.wiki.generateNewTitle(baseName, options); +}; + +})(); diff --git a/editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid b/editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid new file mode 100644 index 000000000..39fdacf93 --- /dev/null +++ b/editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid @@ -0,0 +1,16 @@ + +caption: unusedtitle +tags: Macros [[Core Macros]] +title: unusedtitle Macro +type: text/vnd.tiddlywiki + +The <<.def unusedtitle>> [[macro|Macros]] returns an unused title. Optionally you can provide a base title to generate the new title. + +It uses the same method as the create new tiddler button, a number is appended to the end of the base name. + +!! Parameters + +;baseName +: A string specifying the desired base name, defaulting to `New Tiddler` + +<<.macro-examples "unusedtitle">> diff --git a/editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid b/editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid new file mode 100644 index 000000000..0389d2d67 --- /dev/null +++ b/editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid @@ -0,0 +1,7 @@ +tags: [[unusedtitle Macro]] [[Macro Examples]] +title: unusedtitle Macro (Examples) +type: text/vnd.tiddlywiki + +<$macrocall $name=".example" n="1" eg="""<>"""/> +<$macrocall $name=".example" n="2" eg="""<>"""/> +<$macrocall $name=".example" n="3" eg="""<>"""/> From 62477c9fbba8bbaf13c28bdd79bb291bbdf15ff4 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Wed, 27 Mar 2019 14:59:38 +0000 Subject: [PATCH 0065/2376] TOC Macros: fix recursion regression Fixes #3881 --- core/wiki/macros/toc.tid | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index 373c466c5..e3ab6602a 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -12,14 +12,16 @@ tags: $:/tags/Macro \define toc-body(tag,sort:"",itemClassFilter,exclude,path)
      <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> - <$vars item=<> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}} excluded="""[enlist<__exclude__>] -[<__tag__>]"""> - <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> -
    1. >> - <$list filter="[all[current]toc-link[no]]" emptyMessage="<$link><$view field='caption'><$view field='title'/>"> - <> - - <$macrocall $name="toc-body" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<> path=<>/> -
    2. + <$vars item=<> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}> + <$set name="excluded" filter="""[enlist<__exclude__>] [<__tag__>]"""> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> +
    3. >> + <$list filter="[all[current]toc-link[no]]" emptyMessage="<$link><$view field='caption'><$view field='title'/>"> + <> + + <$macrocall $name="toc-body" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<> path=<>/> +
    4. + From 94607aa9cdc4a853710ea48544aa5f99bfdc017a Mon Sep 17 00:00:00 2001 From: Jermolene Date: Wed, 27 Mar 2019 15:00:13 +0000 Subject: [PATCH 0066/2376] TOC macros: Remove redundant recursion protection As discussed in #3881, it isn't really needed when user interaction is required to open child nodes. --- core/wiki/macros/toc.tid | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index e3ab6602a..a09ea0018 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -32,7 +32,7 @@ tags: $:/tags/Macro <$macrocall $name="toc-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> /> \end -\define toc-linked-expandable-body(tag,sort:"",itemClassFilter,exclude,path) +\define toc-linked-expandable-body(tag,sort:"",itemClassFilter,path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> @@ -51,14 +51,14 @@ tags: $:/tags/Macro <> <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/> + <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/> \end -\define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) +\define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter:" ",path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> @@ -76,7 +76,7 @@ tags: $:/tags/Macro <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/> + <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/> @@ -84,22 +84,22 @@ tags: $:/tags/Macro \end \define toc-expandable-empty-message() -<$macrocall $name="toc-linked-expandable-body" tag=<> sort=<> itemClassFilter=<> exclude=<> path=<>/> +<$macrocall $name="toc-linked-expandable-body" tag=<> sort=<> itemClassFilter=<> path=<>/> \end -\define toc-expandable(tag,sort:"",itemClassFilter:" ",exclude,path) -<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> excluded="""[enlist<__exclude__>] -[<__tag__>]""" path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}> +\define toc-expandable(tag,sort:"",itemClassFilter:" ",path) +<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>
        - <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> + <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>]"""> <$list filter="[all[current]toc-link[no]]" emptyMessage=<> > - <$macrocall $name="toc-unlinked-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="""itemClassFilter""" exclude=<> path=<> /> + <$macrocall $name="toc-unlinked-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="""itemClassFilter""" path=<> />
      \end -\define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) +\define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected" >
    5. >> @@ -119,14 +119,14 @@ tags: $:/tags/Macro <> <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/> + <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/>
    6. \end -\define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) +\define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
    7. >> @@ -145,7 +145,7 @@ tags: $:/tags/Macro <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/> + <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/>
    8. @@ -153,15 +153,15 @@ tags: $:/tags/Macro \end \define toc-selective-expandable-empty-message() -<$macrocall $name="toc-linked-selective-expandable-body" tag=<> sort=<> itemClassFilter=<> exclude=<> path=<>/> +<$macrocall $name="toc-linked-selective-expandable-body" tag=<> sort=<> itemClassFilter=<> path=<>/> \end -\define toc-selective-expandable(tag,sort:"",itemClassFilter,exclude,path) -<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> excluded="""[enlist<__exclude__>] -[<__tag__>]""" path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}> +\define toc-selective-expandable(tag,sort:"",itemClassFilter,path) +<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>
        - <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> + <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>]"""> <$list filter="[all[current]toc-link[no]]" variable="ignore" emptyMessage=<> > - <$macrocall $name="toc-unlinked-selective-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<> path=<>/> + <$macrocall $name="toc-unlinked-selective-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<>/>
      From 1c436cbbf356779a006220ee594653fadd8a79cd Mon Sep 17 00:00:00 2001 From: Jermolene Date: Thu, 28 Mar 2019 10:58:24 +0000 Subject: [PATCH 0067/2376] DynaviewDemo: Rename tiddler-list field to story-list --- .../dynaviewdemo/tiddlers/TableOfContents.tid | 4 ++-- .../tiddlers/alice/Alice TableOfContents.json | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/editions/dynaviewdemo/tiddlers/TableOfContents.tid b/editions/dynaviewdemo/tiddlers/TableOfContents.tid index 4d5559f44..794ad443c 100644 --- a/editions/dynaviewdemo/tiddlers/TableOfContents.tid +++ b/editions/dynaviewdemo/tiddlers/TableOfContents.tid @@ -7,8 +7,8 @@ caption: Contents <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> <$vars item=<> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}} excluded="""[enlist<__exclude__>] -[<__tag__>]""">
    9. - <$link to={{{ [enlist{!!tiddler-list}] }}}> - <$list filter="[enlist{!!tiddler-list}addprefix[$:/state/viewtemplate/visibility/]text[2]limit[1]]" variable="listItem" emptyMessage="""
      """> + <$link to={{{ [enlist{!!story-tiddlers}] }}}> + <$list filter="[enlist{!!story-tiddlers}addprefix[$:/state/viewtemplate/visibility/]text[2]limit[1]]" variable="listItem" emptyMessage="""
      """>
      <$view field='caption'> diff --git a/editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json b/editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json index 98b19d333..65ff8fce3 100644 --- a/editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json +++ b/editions/dynaviewdemo/tiddlers/alice/Alice TableOfContents.json @@ -1,17 +1,17 @@ [ {"title": "TableOfContents", "text": "", "list": "[[Chapter 1]] [[Chapter 2]] [[Chapter 3]] [[Chapter 4]] [[Chapter 5]] [[Chapter 6]] [[Chapter 7]] [[Chapter 8]] [[Chapter 9]] [[Chapter 10]] [[Chapter 11]] [[Chapter 12]]"}, -{"title": "Chapter 1", "tiddler-list": "[[Alice in Wonderland:-anchor-]] [[Alice in Wonderland:-paragraph-1]] [[Alice in Wonderland:-paragraph-2]] [[Alice in Wonderland:-paragraph-3]] [[Alice in Wonderland:-paragraph-4]] [[Alice in Wonderland:-paragraph-5]] [[Alice in Wonderland:-paragraph-6]] [[Alice in Wonderland:-paragraph-7]] [[Alice in Wonderland:-paragraph-8]] [[Alice in Wonderland:-paragraph-9]] [[Alice in Wonderland:-paragraph-10]] [[Alice in Wonderland:-paragraph-11]] [[Alice in Wonderland:-paragraph-12]] [[Alice in Wonderland:-paragraph-13]] [[Alice in Wonderland:-paragraph-14]] [[Alice in Wonderland:-paragraph-15]] [[Alice in Wonderland:-paragraph-16]] [[Alice in Wonderland:-paragraph-17]] [[Alice in Wonderland:-paragraph-18]] [[Alice in Wonderland:-paragraph-19]] [[Alice in Wonderland:-paragraph-20]] [[Alice in Wonderland:-paragraph-21]] [[Alice in Wonderland:-paragraph-22]] [[Alice in Wonderland:-paragraph-23]] [[Alice in Wonderland:-paragraph-24]] [[Alice in Wonderland:-paragraph-25]] [[Alice in Wonderland:-paragraph-26]] [[Alice in Wonderland:-paragraph-27]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 2", "tiddler-list": "[[Alice in Wonderland:-paragraph-28]] [[Alice in Wonderland:-paragraph-29]] [[Alice in Wonderland:-paragraph-30]] [[Alice in Wonderland:-paragraph-31]] [[Alice in Wonderland:-paragraph-32]] [[Alice in Wonderland:-paragraph-33]] [[Alice in Wonderland:-paragraph-34]] [[Alice in Wonderland:-paragraph-35]] [[Alice in Wonderland:-paragraph-36]] [[Alice in Wonderland:-paragraph-37]] [[Alice in Wonderland:-paragraph-38]] [[Alice in Wonderland:-paragraph-39]] [[Alice in Wonderland:-paragraph-40]] [[Alice in Wonderland:-paragraph-41]] [[Alice in Wonderland:-paragraph-42]] [[Alice in Wonderland:-paragraph-43]] [[Alice in Wonderland:-paragraph-44]] [[Alice in Wonderland:-paragraph-45]] [[Alice in Wonderland:-paragraph-46]] [[Alice in Wonderland:-paragraph-47]] [[Alice in Wonderland:-paragraph-48]] [[Alice in Wonderland:-paragraph-49]] [[Alice in Wonderland:-paragraph-50]] [[Alice in Wonderland:-paragraph-51]] [[Alice in Wonderland:-paragraph-52]] [[Alice in Wonderland:-paragraph-53]] [[Alice in Wonderland:-paragraph-54]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 3", "tiddler-list": "[[Alice in Wonderland:-paragraph-55]] [[Alice in Wonderland:-paragraph-56]] [[Alice in Wonderland:-paragraph-57]] [[Alice in Wonderland:-paragraph-58]] [[Alice in Wonderland:-paragraph-59]] [[Alice in Wonderland:-paragraph-60]] [[Alice in Wonderland:-paragraph-61]] [[Alice in Wonderland:-paragraph-62]] [[Alice in Wonderland:-paragraph-63]] [[Alice in Wonderland:-paragraph-64]] [[Alice in Wonderland:-paragraph-65]] [[Alice in Wonderland:-paragraph-66]] [[Alice in Wonderland:-paragraph-67]] [[Alice in Wonderland:-paragraph-68]] [[Alice in Wonderland:-paragraph-69]] [[Alice in Wonderland:-paragraph-70]] [[Alice in Wonderland:-paragraph-71]] [[Alice in Wonderland:-paragraph-72]] [[Alice in Wonderland:-paragraph-73]] [[Alice in Wonderland:-paragraph-74]] [[Alice in Wonderland:-paragraph-75]] [[Alice in Wonderland:-paragraph-76]] [[Alice in Wonderland:-paragraph-77]] [[Alice in Wonderland:-paragraph-78]] [[Alice in Wonderland:-paragraph-79]] [[Alice in Wonderland:-paragraph-80]] [[Alice in Wonderland:-paragraph-81]] [[Alice in Wonderland:-paragraph-82]] [[Alice in Wonderland:-paragraph-83]] [[Alice in Wonderland:-paragraph-84]] [[Alice in Wonderland:-paragraph-85]] [[Alice in Wonderland:-paragraph-86]] [[Alice in Wonderland:-paragraph-87]] [[Alice in Wonderland:-paragraph-88]] [[Alice in Wonderland:-paragraph-89]] [[Alice in Wonderland:-paragraph-90]] [[Alice in Wonderland:-paragraph-91]] [[Alice in Wonderland:-paragraph-92]] [[Alice in Wonderland:-paragraph-93]] [[Alice in Wonderland:-paragraph-94]] [[Alice in Wonderland:-paragraph-95]] [[Alice in Wonderland:-paragraph-96]] [[Alice in Wonderland:-paragraph-97]] [[Alice in Wonderland:-paragraph-98]] [[Alice in Wonderland:-paragraph-99]] [[Alice in Wonderland:-paragraph-100]] [[Alice in Wonderland:-paragraph-101]] [[Alice in Wonderland:-paragraph-102]] [[Alice in Wonderland:-paragraph-103]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 4", "tiddler-list": "[[Alice in Wonderland:-paragraph-104]] [[Alice in Wonderland:-paragraph-105]] [[Alice in Wonderland:-paragraph-106]] [[Alice in Wonderland:-paragraph-107]] [[Alice in Wonderland:-paragraph-108]] [[Alice in Wonderland:-paragraph-109]] [[Alice in Wonderland:-paragraph-110]] [[Alice in Wonderland:-paragraph-111]] [[Alice in Wonderland:-paragraph-112]] [[Alice in Wonderland:-paragraph-113]] [[Alice in Wonderland:-paragraph-114]] [[Alice in Wonderland:-paragraph-115]] [[Alice in Wonderland:-paragraph-116]] [[Alice in Wonderland:-paragraph-117]] [[Alice in Wonderland:-paragraph-118]] [[Alice in Wonderland:-paragraph-119]] [[Alice in Wonderland:-paragraph-120]] [[Alice in Wonderland:-paragraph-121]] [[Alice in Wonderland:-paragraph-122]] [[Alice in Wonderland:-paragraph-123]] [[Alice in Wonderland:-paragraph-124]] [[Alice in Wonderland:-paragraph-125]] [[Alice in Wonderland:-paragraph-126]] [[Alice in Wonderland:-paragraph-127]] [[Alice in Wonderland:-paragraph-128]] [[Alice in Wonderland:-paragraph-129]] [[Alice in Wonderland:-paragraph-130]] [[Alice in Wonderland:-paragraph-131]] [[Alice in Wonderland:-paragraph-132]] [[Alice in Wonderland:-paragraph-133]] [[Alice in Wonderland:-paragraph-134]] [[Alice in Wonderland:-paragraph-135]] [[Alice in Wonderland:-paragraph-136]] [[Alice in Wonderland:-paragraph-137]] [[Alice in Wonderland:-paragraph-138]] [[Alice in Wonderland:-paragraph-139]] [[Alice in Wonderland:-paragraph-140]] [[Alice in Wonderland:-paragraph-141]] [[Alice in Wonderland:-paragraph-142]] [[Alice in Wonderland:-paragraph-143]] [[Alice in Wonderland:-paragraph-144]] [[Alice in Wonderland:-paragraph-145]] [[Alice in Wonderland:-paragraph-146]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 5", "tiddler-list": "[[Alice in Wonderland:-paragraph-147]] [[Alice in Wonderland:-paragraph-148]] [[Alice in Wonderland:-paragraph-149]] [[Alice in Wonderland:-paragraph-150]] [[Alice in Wonderland:-paragraph-151]] [[Alice in Wonderland:-paragraph-152]] [[Alice in Wonderland:-paragraph-153]] [[Alice in Wonderland:-paragraph-154]] [[Alice in Wonderland:-paragraph-155]] [[Alice in Wonderland:-paragraph-156]] [[Alice in Wonderland:-paragraph-157]] [[Alice in Wonderland:-paragraph-158]] [[Alice in Wonderland:-paragraph-159]] [[Alice in Wonderland:-paragraph-160]] [[Alice in Wonderland:-paragraph-161]] [[Alice in Wonderland:-paragraph-162]] [[Alice in Wonderland:-paragraph-163]] [[Alice in Wonderland:-paragraph-164]] [[Alice in Wonderland:-paragraph-165]] [[Alice in Wonderland:-paragraph-166]] [[Alice in Wonderland:-paragraph-167]] [[Alice in Wonderland:-paragraph-168]] [[Alice in Wonderland:-paragraph-169]] [[Alice in Wonderland:-paragraph-170]] [[Alice in Wonderland:-paragraph-171]] [[Alice in Wonderland:-paragraph-172]] [[Alice in Wonderland:-paragraph-173]] [[Alice in Wonderland:-paragraph-174]] [[Alice in Wonderland:-paragraph-175]] [[Alice in Wonderland:-paragraph-176]] [[Alice in Wonderland:-paragraph-177]] [[Alice in Wonderland:-paragraph-178]] [[Alice in Wonderland:-paragraph-179]] [[Alice in Wonderland:-paragraph-180]] [[Alice in Wonderland:-paragraph-181]] [[Alice in Wonderland:-paragraph-182]] [[Alice in Wonderland:-paragraph-183]] [[Alice in Wonderland:-paragraph-184]] [[Alice in Wonderland:-paragraph-185]] [[Alice in Wonderland:-paragraph-186]] [[Alice in Wonderland:-paragraph-187]] [[Alice in Wonderland:-paragraph-188]] [[Alice in Wonderland:-paragraph-189]] [[Alice in Wonderland:-paragraph-190]] [[Alice in Wonderland:-paragraph-191]] [[Alice in Wonderland:-paragraph-192]] [[Alice in Wonderland:-paragraph-193]] [[Alice in Wonderland:-paragraph-194]] [[Alice in Wonderland:-paragraph-195]] [[Alice in Wonderland:-paragraph-196]] [[Alice in Wonderland:-paragraph-197]] [[Alice in Wonderland:-paragraph-198]] [[Alice in Wonderland:-paragraph-199]] [[Alice in Wonderland:-paragraph-200]] [[Alice in Wonderland:-paragraph-201]] [[Alice in Wonderland:-paragraph-202]] [[Alice in Wonderland:-paragraph-203]] [[Alice in Wonderland:-paragraph-204]] [[Alice in Wonderland:-paragraph-205]] [[Alice in Wonderland:-paragraph-206]] [[Alice in Wonderland:-paragraph-207]] [[Alice in Wonderland:-paragraph-208]] [[Alice in Wonderland:-paragraph-209]] [[Alice in Wonderland:-paragraph-210]] [[Alice in Wonderland:-paragraph-211]] [[Alice in Wonderland:-paragraph-212]] [[Alice in Wonderland:-paragraph-213]] [[Alice in Wonderland:-paragraph-214]] [[Alice in Wonderland:-paragraph-215]] [[Alice in Wonderland:-paragraph-216]] [[Alice in Wonderland:-paragraph-217]] [[Alice in Wonderland:-paragraph-218]] [[Alice in Wonderland:-paragraph-219]] [[Alice in Wonderland:-paragraph-220]] [[Alice in Wonderland:-paragraph-221]] [[Alice in Wonderland:-paragraph-222]] [[Alice in Wonderland:-paragraph-223]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 6", "tiddler-list": "[[Alice in Wonderland:-paragraph-224]] [[Alice in Wonderland:-paragraph-225]] [[Alice in Wonderland:-paragraph-226]] [[Alice in Wonderland:-paragraph-227]] [[Alice in Wonderland:-paragraph-228]] [[Alice in Wonderland:-paragraph-229]] [[Alice in Wonderland:-paragraph-230]] [[Alice in Wonderland:-paragraph-231]] [[Alice in Wonderland:-paragraph-232]] [[Alice in Wonderland:-paragraph-233]] [[Alice in Wonderland:-paragraph-234]] [[Alice in Wonderland:-paragraph-235]] [[Alice in Wonderland:-paragraph-236]] [[Alice in Wonderland:-paragraph-237]] [[Alice in Wonderland:-paragraph-238]] [[Alice in Wonderland:-paragraph-239]] [[Alice in Wonderland:-paragraph-240]] [[Alice in Wonderland:-paragraph-241]] [[Alice in Wonderland:-paragraph-242]] [[Alice in Wonderland:-paragraph-243]] [[Alice in Wonderland:-paragraph-244]] [[Alice in Wonderland:-paragraph-245]] [[Alice in Wonderland:-paragraph-246]] [[Alice in Wonderland:-paragraph-247]] [[Alice in Wonderland:-paragraph-248]] [[Alice in Wonderland:-paragraph-249]] [[Alice in Wonderland:-paragraph-250]] [[Alice in Wonderland:-paragraph-251]] [[Alice in Wonderland:-paragraph-252]] [[Alice in Wonderland:-paragraph-253]] [[Alice in Wonderland:-paragraph-254]] [[Alice in Wonderland:-paragraph-255]] [[Alice in Wonderland:-paragraph-256]] [[Alice in Wonderland:-paragraph-257]] [[Alice in Wonderland:-paragraph-258]] [[Alice in Wonderland:-paragraph-259]] [[Alice in Wonderland:-paragraph-260]] [[Alice in Wonderland:-paragraph-261]] [[Alice in Wonderland:-paragraph-262]] [[Alice in Wonderland:-paragraph-263]] [[Alice in Wonderland:-paragraph-264]] [[Alice in Wonderland:-paragraph-265]] [[Alice in Wonderland:-paragraph-266]] [[Alice in Wonderland:-paragraph-267]] [[Alice in Wonderland:-paragraph-268]] [[Alice in Wonderland:-paragraph-269]] [[Alice in Wonderland:-paragraph-270]] [[Alice in Wonderland:-paragraph-271]] [[Alice in Wonderland:-paragraph-272]] [[Alice in Wonderland:-paragraph-273]] [[Alice in Wonderland:-paragraph-274]] [[Alice in Wonderland:-paragraph-275]] [[Alice in Wonderland:-paragraph-276]] [[Alice in Wonderland:-paragraph-277]] [[Alice in Wonderland:-paragraph-278]] [[Alice in Wonderland:-paragraph-279]] [[Alice in Wonderland:-paragraph-280]] [[Alice in Wonderland:-paragraph-281]] [[Alice in Wonderland:-paragraph-282]] [[Alice in Wonderland:-paragraph-283]] [[Alice in Wonderland:-paragraph-284]] [[Alice in Wonderland:-paragraph-285]] [[Alice in Wonderland:-paragraph-286]] [[Alice in Wonderland:-paragraph-287]] [[Alice in Wonderland:-paragraph-288]] [[Alice in Wonderland:-paragraph-289]] [[Alice in Wonderland:-paragraph-290]] [[Alice in Wonderland:-paragraph-291]] [[Alice in Wonderland:-paragraph-292]] [[Alice in Wonderland:-paragraph-293]] [[Alice in Wonderland:-paragraph-294]] [[Alice in Wonderland:-paragraph-295]] [[Alice in Wonderland:-paragraph-296]] [[Alice in Wonderland:-paragraph-297]] [[Alice in Wonderland:-paragraph-298]] [[Alice in Wonderland:-paragraph-299]] [[Alice in Wonderland:-paragraph-300]] [[Alice in Wonderland:-paragraph-301]] [[Alice in Wonderland:-paragraph-302]] [[Alice in Wonderland:-paragraph-303]] [[Alice in Wonderland:-paragraph-304]] [[Alice in Wonderland:-paragraph-305]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 7", "tiddler-list": "[[Alice in Wonderland:-paragraph-306]] [[Alice in Wonderland:-paragraph-307]] [[Alice in Wonderland:-paragraph-308]] [[Alice in Wonderland:-paragraph-309]] [[Alice in Wonderland:-paragraph-310]] [[Alice in Wonderland:-paragraph-311]] [[Alice in Wonderland:-paragraph-312]] [[Alice in Wonderland:-paragraph-313]] [[Alice in Wonderland:-paragraph-314]] [[Alice in Wonderland:-paragraph-315]] [[Alice in Wonderland:-paragraph-316]] [[Alice in Wonderland:-paragraph-317]] [[Alice in Wonderland:-paragraph-318]] [[Alice in Wonderland:-paragraph-319]] [[Alice in Wonderland:-paragraph-320]] [[Alice in Wonderland:-paragraph-321]] [[Alice in Wonderland:-paragraph-322]] [[Alice in Wonderland:-paragraph-323]] [[Alice in Wonderland:-paragraph-324]] [[Alice in Wonderland:-paragraph-325]] [[Alice in Wonderland:-paragraph-326]] [[Alice in Wonderland:-paragraph-327]] [[Alice in Wonderland:-paragraph-328]] [[Alice in Wonderland:-paragraph-329]] [[Alice in Wonderland:-paragraph-330]] [[Alice in Wonderland:-paragraph-331]] [[Alice in Wonderland:-paragraph-332]] [[Alice in Wonderland:-paragraph-333]] [[Alice in Wonderland:-paragraph-334]] [[Alice in Wonderland:-paragraph-335]] [[Alice in Wonderland:-paragraph-336]] [[Alice in Wonderland:-paragraph-337]] [[Alice in Wonderland:-paragraph-338]] [[Alice in Wonderland:-paragraph-339]] [[Alice in Wonderland:-paragraph-340]] [[Alice in Wonderland:-paragraph-341]] [[Alice in Wonderland:-paragraph-342]] [[Alice in Wonderland:-paragraph-343]] [[Alice in Wonderland:-paragraph-344]] [[Alice in Wonderland:-paragraph-345]] [[Alice in Wonderland:-paragraph-346]] [[Alice in Wonderland:-paragraph-347]] [[Alice in Wonderland:-paragraph-348]] [[Alice in Wonderland:-paragraph-349]] [[Alice in Wonderland:-paragraph-350]] [[Alice in Wonderland:-paragraph-351]] [[Alice in Wonderland:-paragraph-352]] [[Alice in Wonderland:-paragraph-353]] [[Alice in Wonderland:-paragraph-354]] [[Alice in Wonderland:-paragraph-355]] [[Alice in Wonderland:-paragraph-356]] [[Alice in Wonderland:-paragraph-357]] [[Alice in Wonderland:-paragraph-358]] [[Alice in Wonderland:-paragraph-359]] [[Alice in Wonderland:-paragraph-360]] [[Alice in Wonderland:-paragraph-361]] [[Alice in Wonderland:-paragraph-362]] [[Alice in Wonderland:-paragraph-363]] [[Alice in Wonderland:-paragraph-364]] [[Alice in Wonderland:-paragraph-365]] [[Alice in Wonderland:-paragraph-366]] [[Alice in Wonderland:-paragraph-367]] [[Alice in Wonderland:-paragraph-368]] [[Alice in Wonderland:-paragraph-369]] [[Alice in Wonderland:-paragraph-370]] [[Alice in Wonderland:-paragraph-371]] [[Alice in Wonderland:-paragraph-372]] [[Alice in Wonderland:-paragraph-373]] [[Alice in Wonderland:-paragraph-374]] [[Alice in Wonderland:-paragraph-375]] [[Alice in Wonderland:-paragraph-376]] [[Alice in Wonderland:-paragraph-377]] [[Alice in Wonderland:-paragraph-378]] [[Alice in Wonderland:-paragraph-379]] [[Alice in Wonderland:-paragraph-380]] [[Alice in Wonderland:-paragraph-381]] [[Alice in Wonderland:-paragraph-382]] [[Alice in Wonderland:-paragraph-383]] [[Alice in Wonderland:-paragraph-384]] [[Alice in Wonderland:-paragraph-385]] [[Alice in Wonderland:-paragraph-386]] [[Alice in Wonderland:-paragraph-387]] [[Alice in Wonderland:-paragraph-388]] [[Alice in Wonderland:-paragraph-389]] [[Alice in Wonderland:-paragraph-390]] [[Alice in Wonderland:-paragraph-391]] [[Alice in Wonderland:-paragraph-392]] [[Alice in Wonderland:-paragraph-393]] [[Alice in Wonderland:-paragraph-394]] [[Alice in Wonderland:-paragraph-395]] [[Alice in Wonderland:-paragraph-396]] [[Alice in Wonderland:-paragraph-397]] [[Alice in Wonderland:-paragraph-398]] [[Alice in Wonderland:-paragraph-399]] [[Alice in Wonderland:-paragraph-400]] [[Alice in Wonderland:-paragraph-401]] [[Alice in Wonderland:-paragraph-402]] [[Alice in Wonderland:-paragraph-403]] [[Alice in Wonderland:-paragraph-404]] [[Alice in Wonderland:-paragraph-405]] [[Alice in Wonderland:-paragraph-406]] [[Alice in Wonderland:-paragraph-407]] [[Alice in Wonderland:-paragraph-408]] [[Alice in Wonderland:-paragraph-409]] [[Alice in Wonderland:-paragraph-410]] [[Alice in Wonderland:-paragraph-411]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 8", "tiddler-list": "[[Alice in Wonderland:-paragraph-412]] [[Alice in Wonderland:-paragraph-413]] [[Alice in Wonderland:-paragraph-414]] [[Alice in Wonderland:-paragraph-415]] [[Alice in Wonderland:-paragraph-416]] [[Alice in Wonderland:-paragraph-417]] [[Alice in Wonderland:-paragraph-418]] [[Alice in Wonderland:-paragraph-419]] [[Alice in Wonderland:-paragraph-420]] [[Alice in Wonderland:-paragraph-421]] [[Alice in Wonderland:-paragraph-422]] [[Alice in Wonderland:-paragraph-423]] [[Alice in Wonderland:-paragraph-424]] [[Alice in Wonderland:-paragraph-425]] [[Alice in Wonderland:-paragraph-426]] [[Alice in Wonderland:-paragraph-427]] [[Alice in Wonderland:-paragraph-428]] [[Alice in Wonderland:-paragraph-429]] [[Alice in Wonderland:-paragraph-430]] [[Alice in Wonderland:-paragraph-431]] [[Alice in Wonderland:-paragraph-432]] [[Alice in Wonderland:-paragraph-433]] [[Alice in Wonderland:-paragraph-434]] [[Alice in Wonderland:-paragraph-435]] [[Alice in Wonderland:-paragraph-436]] [[Alice in Wonderland:-paragraph-437]] [[Alice in Wonderland:-paragraph-438]] [[Alice in Wonderland:-paragraph-439]] [[Alice in Wonderland:-paragraph-440]] [[Alice in Wonderland:-paragraph-441]] [[Alice in Wonderland:-paragraph-442]] [[Alice in Wonderland:-paragraph-443]] [[Alice in Wonderland:-paragraph-444]] [[Alice in Wonderland:-paragraph-445]] [[Alice in Wonderland:-paragraph-446]] [[Alice in Wonderland:-paragraph-447]] [[Alice in Wonderland:-paragraph-448]] [[Alice in Wonderland:-paragraph-449]] [[Alice in Wonderland:-paragraph-450]] [[Alice in Wonderland:-paragraph-451]] [[Alice in Wonderland:-paragraph-452]] [[Alice in Wonderland:-paragraph-453]] [[Alice in Wonderland:-paragraph-454]] [[Alice in Wonderland:-paragraph-455]] [[Alice in Wonderland:-paragraph-456]] [[Alice in Wonderland:-paragraph-457]] [[Alice in Wonderland:-paragraph-458]] [[Alice in Wonderland:-paragraph-459]] [[Alice in Wonderland:-paragraph-460]] [[Alice in Wonderland:-paragraph-461]] [[Alice in Wonderland:-paragraph-462]] [[Alice in Wonderland:-paragraph-463]] [[Alice in Wonderland:-paragraph-464]] [[Alice in Wonderland:-paragraph-465]] [[Alice in Wonderland:-paragraph-466]] [[Alice in Wonderland:-paragraph-467]] [[Alice in Wonderland:-paragraph-468]] [[Alice in Wonderland:-paragraph-469]] [[Alice in Wonderland:-paragraph-470]] [[Alice in Wonderland:-paragraph-471]] [[Alice in Wonderland:-paragraph-472]] [[Alice in Wonderland:-paragraph-473]] [[Alice in Wonderland:-paragraph-474]] [[Alice in Wonderland:-paragraph-475]] [[Alice in Wonderland:-paragraph-476]] [[Alice in Wonderland:-paragraph-477]] [[Alice in Wonderland:-paragraph-478]] [[Alice in Wonderland:-paragraph-479]] [[Alice in Wonderland:-paragraph-480]] [[Alice in Wonderland:-paragraph-481]] [[Alice in Wonderland:-paragraph-482]] [[Alice in Wonderland:-paragraph-483]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 9", "tiddler-list": "[[Alice in Wonderland:-paragraph-484]] [[Alice in Wonderland:-paragraph-485]] [[Alice in Wonderland:-paragraph-486]] [[Alice in Wonderland:-paragraph-487]] [[Alice in Wonderland:-paragraph-488]] [[Alice in Wonderland:-paragraph-489]] [[Alice in Wonderland:-paragraph-490]] [[Alice in Wonderland:-paragraph-491]] [[Alice in Wonderland:-paragraph-492]] [[Alice in Wonderland:-paragraph-493]] [[Alice in Wonderland:-paragraph-494]] [[Alice in Wonderland:-paragraph-495]] [[Alice in Wonderland:-paragraph-496]] [[Alice in Wonderland:-paragraph-497]] [[Alice in Wonderland:-paragraph-498]] [[Alice in Wonderland:-paragraph-499]] [[Alice in Wonderland:-paragraph-500]] [[Alice in Wonderland:-paragraph-501]] [[Alice in Wonderland:-paragraph-502]] [[Alice in Wonderland:-paragraph-503]] [[Alice in Wonderland:-paragraph-504]] [[Alice in Wonderland:-paragraph-505]] [[Alice in Wonderland:-paragraph-506]] [[Alice in Wonderland:-paragraph-507]] [[Alice in Wonderland:-paragraph-508]] [[Alice in Wonderland:-paragraph-509]] [[Alice in Wonderland:-paragraph-510]] [[Alice in Wonderland:-paragraph-511]] [[Alice in Wonderland:-paragraph-512]] [[Alice in Wonderland:-paragraph-513]] [[Alice in Wonderland:-paragraph-514]] [[Alice in Wonderland:-paragraph-515]] [[Alice in Wonderland:-paragraph-516]] [[Alice in Wonderland:-paragraph-517]] [[Alice in Wonderland:-paragraph-518]] [[Alice in Wonderland:-paragraph-519]] [[Alice in Wonderland:-paragraph-520]] [[Alice in Wonderland:-paragraph-521]] [[Alice in Wonderland:-paragraph-522]] [[Alice in Wonderland:-paragraph-523]] [[Alice in Wonderland:-paragraph-524]] [[Alice in Wonderland:-paragraph-525]] [[Alice in Wonderland:-paragraph-526]] [[Alice in Wonderland:-paragraph-527]] [[Alice in Wonderland:-paragraph-528]] [[Alice in Wonderland:-paragraph-529]] [[Alice in Wonderland:-paragraph-530]] [[Alice in Wonderland:-paragraph-531]] [[Alice in Wonderland:-paragraph-532]] [[Alice in Wonderland:-paragraph-533]] [[Alice in Wonderland:-paragraph-534]] [[Alice in Wonderland:-paragraph-535]] [[Alice in Wonderland:-paragraph-536]] [[Alice in Wonderland:-paragraph-537]] [[Alice in Wonderland:-paragraph-538]] [[Alice in Wonderland:-paragraph-539]] [[Alice in Wonderland:-paragraph-540]] [[Alice in Wonderland:-paragraph-541]] [[Alice in Wonderland:-paragraph-542]] [[Alice in Wonderland:-paragraph-543]] [[Alice in Wonderland:-paragraph-544]] [[Alice in Wonderland:-paragraph-545]] [[Alice in Wonderland:-paragraph-546]] [[Alice in Wonderland:-paragraph-547]] [[Alice in Wonderland:-paragraph-548]] [[Alice in Wonderland:-paragraph-549]] [[Alice in Wonderland:-paragraph-550]] [[Alice in Wonderland:-paragraph-551]] [[Alice in Wonderland:-paragraph-552]] [[Alice in Wonderland:-paragraph-553]] [[Alice in Wonderland:-paragraph-554]] [[Alice in Wonderland:-paragraph-555]] [[Alice in Wonderland:-paragraph-556]] [[Alice in Wonderland:-paragraph-557]] [[Alice in Wonderland:-paragraph-558]] [[Alice in Wonderland:-paragraph-559]] [[Alice in Wonderland:-paragraph-560]] [[Alice in Wonderland:-paragraph-561]] [[Alice in Wonderland:-paragraph-562]] [[Alice in Wonderland:-paragraph-563]] [[Alice in Wonderland:-paragraph-564]] [[Alice in Wonderland:-paragraph-565]] [[Alice in Wonderland:-paragraph-566]] [[Alice in Wonderland:-paragraph-567]] [[Alice in Wonderland:-paragraph-568]] [[Alice in Wonderland:-paragraph-569]] [[Alice in Wonderland:-paragraph-570]] [[Alice in Wonderland:-paragraph-571]] [[Alice in Wonderland:-paragraph-572]] [[Alice in Wonderland:-paragraph-573]] [[Alice in Wonderland:-paragraph-574]] [[Alice in Wonderland:-paragraph-575]] [[Alice in Wonderland:-paragraph-576]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 10", "tiddler-list": "[[Alice in Wonderland:-paragraph-577]] [[Alice in Wonderland:-paragraph-578]] [[Alice in Wonderland:-paragraph-579]] [[Alice in Wonderland:-paragraph-580]] [[Alice in Wonderland:-paragraph-581]] [[Alice in Wonderland:-paragraph-582]] [[Alice in Wonderland:-paragraph-583]] [[Alice in Wonderland:-paragraph-584]] [[Alice in Wonderland:-paragraph-585]] [[Alice in Wonderland:-paragraph-586]] [[Alice in Wonderland:-paragraph-587]] [[Alice in Wonderland:-paragraph-588]] [[Alice in Wonderland:-paragraph-589]] [[Alice in Wonderland:-paragraph-590]] [[Alice in Wonderland:-paragraph-591]] [[Alice in Wonderland:-paragraph-592]] [[Alice in Wonderland:-paragraph-593]] [[Alice in Wonderland:-paragraph-594]] [[Alice in Wonderland:-paragraph-595]] [[Alice in Wonderland:-paragraph-596]] [[Alice in Wonderland:-paragraph-597]] [[Alice in Wonderland:-paragraph-598]] [[Alice in Wonderland:-paragraph-599]] [[Alice in Wonderland:-paragraph-600]] [[Alice in Wonderland:-paragraph-601]] [[Alice in Wonderland:-paragraph-602]] [[Alice in Wonderland:-paragraph-603]] [[Alice in Wonderland:-paragraph-604]] [[Alice in Wonderland:-paragraph-605]] [[Alice in Wonderland:-paragraph-606]] [[Alice in Wonderland:-paragraph-607]] [[Alice in Wonderland:-paragraph-608]] [[Alice in Wonderland:-paragraph-609]] [[Alice in Wonderland:-paragraph-610]] [[Alice in Wonderland:-paragraph-611]] [[Alice in Wonderland:-paragraph-612]] [[Alice in Wonderland:-paragraph-613]] [[Alice in Wonderland:-paragraph-614]] [[Alice in Wonderland:-paragraph-615]] [[Alice in Wonderland:-paragraph-616]] [[Alice in Wonderland:-paragraph-617]] [[Alice in Wonderland:-paragraph-618]] [[Alice in Wonderland:-paragraph-619]] [[Alice in Wonderland:-paragraph-620]] [[Alice in Wonderland:-paragraph-621]] [[Alice in Wonderland:-paragraph-622]] [[Alice in Wonderland:-paragraph-623]] [[Alice in Wonderland:-paragraph-624]] [[Alice in Wonderland:-paragraph-625]] [[Alice in Wonderland:-paragraph-626]] [[Alice in Wonderland:-paragraph-627]] [[Alice in Wonderland:-paragraph-628]] [[Alice in Wonderland:-paragraph-629]] [[Alice in Wonderland:-paragraph-630]] [[Alice in Wonderland:-paragraph-631]] [[Alice in Wonderland:-paragraph-632]] [[Alice in Wonderland:-paragraph-633]] [[Alice in Wonderland:-paragraph-634]] [[Alice in Wonderland:-paragraph-635]] [[Alice in Wonderland:-paragraph-636]] [[Alice in Wonderland:-paragraph-637]] [[Alice in Wonderland:-paragraph-638]] [[Alice in Wonderland:-paragraph-639]] [[Alice in Wonderland:-paragraph-640]] [[Alice in Wonderland:-paragraph-641]] [[Alice in Wonderland:-paragraph-642]] [[Alice in Wonderland:-paragraph-643]] [[Alice in Wonderland:-paragraph-644]] [[Alice in Wonderland:-paragraph-645]] [[Alice in Wonderland:-paragraph-646]] [[Alice in Wonderland:-paragraph-647]] [[Alice in Wonderland:-paragraph-648]] [[Alice in Wonderland:-paragraph-649]] [[Alice in Wonderland:-paragraph-650]] [[Alice in Wonderland:-paragraph-651]] [[Alice in Wonderland:-paragraph-652]] [[Alice in Wonderland:-paragraph-653]] [[Alice in Wonderland:-paragraph-654]] [[Alice in Wonderland:-paragraph-655]] [[Alice in Wonderland:-paragraph-656]] [[Alice in Wonderland:-paragraph-657]] [[Alice in Wonderland:-paragraph-658]] [[Alice in Wonderland:-paragraph-659]] [[Alice in Wonderland:-paragraph-660]] [[Alice in Wonderland:-paragraph-661]] [[Alice in Wonderland:-paragraph-662]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 11", "tiddler-list": "[[Alice in Wonderland:-paragraph-663]] [[Alice in Wonderland:-paragraph-664]] [[Alice in Wonderland:-paragraph-665]] [[Alice in Wonderland:-paragraph-666]] [[Alice in Wonderland:-paragraph-667]] [[Alice in Wonderland:-paragraph-668]] [[Alice in Wonderland:-paragraph-669]] [[Alice in Wonderland:-paragraph-670]] [[Alice in Wonderland:-paragraph-671]] [[Alice in Wonderland:-paragraph-672]] [[Alice in Wonderland:-paragraph-673]] [[Alice in Wonderland:-paragraph-674]] [[Alice in Wonderland:-paragraph-675]] [[Alice in Wonderland:-paragraph-676]] [[Alice in Wonderland:-paragraph-677]] [[Alice in Wonderland:-paragraph-678]] [[Alice in Wonderland:-paragraph-679]] [[Alice in Wonderland:-paragraph-680]] [[Alice in Wonderland:-paragraph-681]] [[Alice in Wonderland:-paragraph-682]] [[Alice in Wonderland:-paragraph-683]] [[Alice in Wonderland:-paragraph-684]] [[Alice in Wonderland:-paragraph-685]] [[Alice in Wonderland:-paragraph-686]] [[Alice in Wonderland:-paragraph-687]] [[Alice in Wonderland:-paragraph-688]] [[Alice in Wonderland:-paragraph-689]] [[Alice in Wonderland:-paragraph-690]] [[Alice in Wonderland:-paragraph-691]] [[Alice in Wonderland:-paragraph-692]] [[Alice in Wonderland:-paragraph-693]] [[Alice in Wonderland:-paragraph-694]] [[Alice in Wonderland:-paragraph-695]] [[Alice in Wonderland:-paragraph-696]] [[Alice in Wonderland:-paragraph-697]] [[Alice in Wonderland:-paragraph-698]] [[Alice in Wonderland:-paragraph-699]] [[Alice in Wonderland:-paragraph-700]] [[Alice in Wonderland:-paragraph-701]] [[Alice in Wonderland:-paragraph-702]] [[Alice in Wonderland:-paragraph-703]] [[Alice in Wonderland:-paragraph-704]] [[Alice in Wonderland:-paragraph-705]] [[Alice in Wonderland:-paragraph-706]] [[Alice in Wonderland:-paragraph-707]] [[Alice in Wonderland:-paragraph-708]] [[Alice in Wonderland:-paragraph-709]] [[Alice in Wonderland:-paragraph-710]] [[Alice in Wonderland:-paragraph-711]] [[Alice in Wonderland:-paragraph-712]] [[Alice in Wonderland:-paragraph-713]] [[Alice in Wonderland:-paragraph-714]] [[Alice in Wonderland:-paragraph-715]] [[Alice in Wonderland:-paragraph-716]] [[Alice in Wonderland:-paragraph-717]] [[Alice in Wonderland:-paragraph-718]] [[Alice in Wonderland:-paragraph-719]] [[Alice in Wonderland:-paragraph-720]] [[Alice in Wonderland:-paragraph-721]] [[Alice in Wonderland:-paragraph-722]] [[Alice in Wonderland:-paragraph-723]] [[Alice in Wonderland:-paragraph-724]] [[Alice in Wonderland:-paragraph-725]] [[Alice in Wonderland:-paragraph-726]] [[Alice in Wonderland:-paragraph-727]] [[Alice in Wonderland:-paragraph-728]] [[Alice in Wonderland:-paragraph-729]] [[Alice in Wonderland:-paragraph-730]] [[Alice in Wonderland:-paragraph-731]] [[Alice in Wonderland:-paragraph-732]] [[Alice in Wonderland:-paragraph-733]] [[Alice in Wonderland:-paragraph-734]] [[Alice in Wonderland:-paragraph-735]] [[Alice in Wonderland:-paragraph-736]] [[Alice in Wonderland:-paragraph-737]]", "tags": "TableOfContents", "text": ""}, -{"title": "Chapter 12", "tiddler-list": "[[Alice in Wonderland:-paragraph-738]] [[Alice in Wonderland:-paragraph-739]] [[Alice in Wonderland:-paragraph-740]] [[Alice in Wonderland:-paragraph-741]] [[Alice in Wonderland:-paragraph-742]] [[Alice in Wonderland:-paragraph-743]] [[Alice in Wonderland:-paragraph-744]] [[Alice in Wonderland:-paragraph-745]] [[Alice in Wonderland:-paragraph-746]] [[Alice in Wonderland:-paragraph-747]] [[Alice in Wonderland:-paragraph-748]] [[Alice in Wonderland:-paragraph-749]] [[Alice in Wonderland:-paragraph-750]] [[Alice in Wonderland:-paragraph-751]] [[Alice in Wonderland:-paragraph-752]] [[Alice in Wonderland:-paragraph-753]] [[Alice in Wonderland:-paragraph-754]] [[Alice in Wonderland:-paragraph-755]] [[Alice in Wonderland:-paragraph-756]] [[Alice in Wonderland:-paragraph-757]] [[Alice in Wonderland:-paragraph-758]] [[Alice in Wonderland:-paragraph-759]] [[Alice in Wonderland:-paragraph-760]] [[Alice in Wonderland:-paragraph-761]] [[Alice in Wonderland:-paragraph-762]] [[Alice in Wonderland:-paragraph-763]] [[Alice in Wonderland:-paragraph-764]] [[Alice in Wonderland:-paragraph-765]] [[Alice in Wonderland:-paragraph-766]] [[Alice in Wonderland:-paragraph-767]] [[Alice in Wonderland:-paragraph-768]] [[Alice in Wonderland:-paragraph-769]] [[Alice in Wonderland:-paragraph-770]] [[Alice in Wonderland:-paragraph-771]] [[Alice in Wonderland:-paragraph-772]] [[Alice in Wonderland:-paragraph-773]] [[Alice in Wonderland:-paragraph-774]] [[Alice in Wonderland:-paragraph-775]] [[Alice in Wonderland:-paragraph-776]] [[Alice in Wonderland:-paragraph-777]] [[Alice in Wonderland:-paragraph-778]] [[Alice in Wonderland:-paragraph-779]] [[Alice in Wonderland:-paragraph-780]] [[Alice in Wonderland:-paragraph-781]] [[Alice in Wonderland:-paragraph-782]] [[Alice in Wonderland:-paragraph-783]] [[Alice in Wonderland:-paragraph-784]] [[Alice in Wonderland:-paragraph-785]] [[Alice in Wonderland:-paragraph-786]] [[Alice in Wonderland:-paragraph-787]] [[Alice in Wonderland:-paragraph-788]] [[Alice in Wonderland:-paragraph-789]] [[Alice in Wonderland:-paragraph-790]] [[Alice in Wonderland:-paragraph-791]] [[Alice in Wonderland:-paragraph-792]] [[Alice in Wonderland:-paragraph-793]] [[Alice in Wonderland:-paragraph-794]] [[Alice in Wonderland:-paragraph-795]] [[Alice in Wonderland:-paragraph-796]] [[Alice in Wonderland:-paragraph-797]] [[Alice in Wonderland:-paragraph-798]] [[Alice in Wonderland:-paragraph-799]] [[Alice in Wonderland:-paragraph-800]] [[Alice in Wonderland:-paragraph-801]] [[Alice in Wonderland:-paragraph-802]] [[Alice in Wonderland:-paragraph-803]] [[Alice in Wonderland:-paragraph-804]] [[Alice in Wonderland:-paragraph-805]] [[Alice in Wonderland:-paragraph-806]] [[Alice in Wonderland:-paragraph-807]] [[Alice in Wonderland:-paragraph-808]] [[Alice in Wonderland:-paragraph-809]] [[Alice in Wonderland:-paragraph-810]]", "tags": "TableOfContents", "text": ""} +{"title": "Chapter 1", "story-tiddlers": "[[Alice in Wonderland:-anchor-]] [[Alice in Wonderland:-paragraph-1]] [[Alice in Wonderland:-paragraph-2]] [[Alice in Wonderland:-paragraph-3]] [[Alice in Wonderland:-paragraph-4]] [[Alice in Wonderland:-paragraph-5]] [[Alice in Wonderland:-paragraph-6]] [[Alice in Wonderland:-paragraph-7]] [[Alice in Wonderland:-paragraph-8]] [[Alice in Wonderland:-paragraph-9]] [[Alice in Wonderland:-paragraph-10]] [[Alice in Wonderland:-paragraph-11]] [[Alice in Wonderland:-paragraph-12]] [[Alice in Wonderland:-paragraph-13]] [[Alice in Wonderland:-paragraph-14]] [[Alice in Wonderland:-paragraph-15]] [[Alice in Wonderland:-paragraph-16]] [[Alice in Wonderland:-paragraph-17]] [[Alice in Wonderland:-paragraph-18]] [[Alice in Wonderland:-paragraph-19]] [[Alice in Wonderland:-paragraph-20]] [[Alice in Wonderland:-paragraph-21]] [[Alice in Wonderland:-paragraph-22]] [[Alice in Wonderland:-paragraph-23]] [[Alice in Wonderland:-paragraph-24]] [[Alice in Wonderland:-paragraph-25]] [[Alice in Wonderland:-paragraph-26]] [[Alice in Wonderland:-paragraph-27]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 2", "story-tiddlers": "[[Alice in Wonderland:-paragraph-28]] [[Alice in Wonderland:-paragraph-29]] [[Alice in Wonderland:-paragraph-30]] [[Alice in Wonderland:-paragraph-31]] [[Alice in Wonderland:-paragraph-32]] [[Alice in Wonderland:-paragraph-33]] [[Alice in Wonderland:-paragraph-34]] [[Alice in Wonderland:-paragraph-35]] [[Alice in Wonderland:-paragraph-36]] [[Alice in Wonderland:-paragraph-37]] [[Alice in Wonderland:-paragraph-38]] [[Alice in Wonderland:-paragraph-39]] [[Alice in Wonderland:-paragraph-40]] [[Alice in Wonderland:-paragraph-41]] [[Alice in Wonderland:-paragraph-42]] [[Alice in Wonderland:-paragraph-43]] [[Alice in Wonderland:-paragraph-44]] [[Alice in Wonderland:-paragraph-45]] [[Alice in Wonderland:-paragraph-46]] [[Alice in Wonderland:-paragraph-47]] [[Alice in Wonderland:-paragraph-48]] [[Alice in Wonderland:-paragraph-49]] [[Alice in Wonderland:-paragraph-50]] [[Alice in Wonderland:-paragraph-51]] [[Alice in Wonderland:-paragraph-52]] [[Alice in Wonderland:-paragraph-53]] [[Alice in Wonderland:-paragraph-54]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 3", "story-tiddlers": "[[Alice in Wonderland:-paragraph-55]] [[Alice in Wonderland:-paragraph-56]] [[Alice in Wonderland:-paragraph-57]] [[Alice in Wonderland:-paragraph-58]] [[Alice in Wonderland:-paragraph-59]] [[Alice in Wonderland:-paragraph-60]] [[Alice in Wonderland:-paragraph-61]] [[Alice in Wonderland:-paragraph-62]] [[Alice in Wonderland:-paragraph-63]] [[Alice in Wonderland:-paragraph-64]] [[Alice in Wonderland:-paragraph-65]] [[Alice in Wonderland:-paragraph-66]] [[Alice in Wonderland:-paragraph-67]] [[Alice in Wonderland:-paragraph-68]] [[Alice in Wonderland:-paragraph-69]] [[Alice in Wonderland:-paragraph-70]] [[Alice in Wonderland:-paragraph-71]] [[Alice in Wonderland:-paragraph-72]] [[Alice in Wonderland:-paragraph-73]] [[Alice in Wonderland:-paragraph-74]] [[Alice in Wonderland:-paragraph-75]] [[Alice in Wonderland:-paragraph-76]] [[Alice in Wonderland:-paragraph-77]] [[Alice in Wonderland:-paragraph-78]] [[Alice in Wonderland:-paragraph-79]] [[Alice in Wonderland:-paragraph-80]] [[Alice in Wonderland:-paragraph-81]] [[Alice in Wonderland:-paragraph-82]] [[Alice in Wonderland:-paragraph-83]] [[Alice in Wonderland:-paragraph-84]] [[Alice in Wonderland:-paragraph-85]] [[Alice in Wonderland:-paragraph-86]] [[Alice in Wonderland:-paragraph-87]] [[Alice in Wonderland:-paragraph-88]] [[Alice in Wonderland:-paragraph-89]] [[Alice in Wonderland:-paragraph-90]] [[Alice in Wonderland:-paragraph-91]] [[Alice in Wonderland:-paragraph-92]] [[Alice in Wonderland:-paragraph-93]] [[Alice in Wonderland:-paragraph-94]] [[Alice in Wonderland:-paragraph-95]] [[Alice in Wonderland:-paragraph-96]] [[Alice in Wonderland:-paragraph-97]] [[Alice in Wonderland:-paragraph-98]] [[Alice in Wonderland:-paragraph-99]] [[Alice in Wonderland:-paragraph-100]] [[Alice in Wonderland:-paragraph-101]] [[Alice in Wonderland:-paragraph-102]] [[Alice in Wonderland:-paragraph-103]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 4", "story-tiddlers": "[[Alice in Wonderland:-paragraph-104]] [[Alice in Wonderland:-paragraph-105]] [[Alice in Wonderland:-paragraph-106]] [[Alice in Wonderland:-paragraph-107]] [[Alice in Wonderland:-paragraph-108]] [[Alice in Wonderland:-paragraph-109]] [[Alice in Wonderland:-paragraph-110]] [[Alice in Wonderland:-paragraph-111]] [[Alice in Wonderland:-paragraph-112]] [[Alice in Wonderland:-paragraph-113]] [[Alice in Wonderland:-paragraph-114]] [[Alice in Wonderland:-paragraph-115]] [[Alice in Wonderland:-paragraph-116]] [[Alice in Wonderland:-paragraph-117]] [[Alice in Wonderland:-paragraph-118]] [[Alice in Wonderland:-paragraph-119]] [[Alice in Wonderland:-paragraph-120]] [[Alice in Wonderland:-paragraph-121]] [[Alice in Wonderland:-paragraph-122]] [[Alice in Wonderland:-paragraph-123]] [[Alice in Wonderland:-paragraph-124]] [[Alice in Wonderland:-paragraph-125]] [[Alice in Wonderland:-paragraph-126]] [[Alice in Wonderland:-paragraph-127]] [[Alice in Wonderland:-paragraph-128]] [[Alice in Wonderland:-paragraph-129]] [[Alice in Wonderland:-paragraph-130]] [[Alice in Wonderland:-paragraph-131]] [[Alice in Wonderland:-paragraph-132]] [[Alice in Wonderland:-paragraph-133]] [[Alice in Wonderland:-paragraph-134]] [[Alice in Wonderland:-paragraph-135]] [[Alice in Wonderland:-paragraph-136]] [[Alice in Wonderland:-paragraph-137]] [[Alice in Wonderland:-paragraph-138]] [[Alice in Wonderland:-paragraph-139]] [[Alice in Wonderland:-paragraph-140]] [[Alice in Wonderland:-paragraph-141]] [[Alice in Wonderland:-paragraph-142]] [[Alice in Wonderland:-paragraph-143]] [[Alice in Wonderland:-paragraph-144]] [[Alice in Wonderland:-paragraph-145]] [[Alice in Wonderland:-paragraph-146]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 5", "story-tiddlers": "[[Alice in Wonderland:-paragraph-147]] [[Alice in Wonderland:-paragraph-148]] [[Alice in Wonderland:-paragraph-149]] [[Alice in Wonderland:-paragraph-150]] [[Alice in Wonderland:-paragraph-151]] [[Alice in Wonderland:-paragraph-152]] [[Alice in Wonderland:-paragraph-153]] [[Alice in Wonderland:-paragraph-154]] [[Alice in Wonderland:-paragraph-155]] [[Alice in Wonderland:-paragraph-156]] [[Alice in Wonderland:-paragraph-157]] [[Alice in Wonderland:-paragraph-158]] [[Alice in Wonderland:-paragraph-159]] [[Alice in Wonderland:-paragraph-160]] [[Alice in Wonderland:-paragraph-161]] [[Alice in Wonderland:-paragraph-162]] [[Alice in Wonderland:-paragraph-163]] [[Alice in Wonderland:-paragraph-164]] [[Alice in Wonderland:-paragraph-165]] [[Alice in Wonderland:-paragraph-166]] [[Alice in Wonderland:-paragraph-167]] [[Alice in Wonderland:-paragraph-168]] [[Alice in Wonderland:-paragraph-169]] [[Alice in Wonderland:-paragraph-170]] [[Alice in Wonderland:-paragraph-171]] [[Alice in Wonderland:-paragraph-172]] [[Alice in Wonderland:-paragraph-173]] [[Alice in Wonderland:-paragraph-174]] [[Alice in Wonderland:-paragraph-175]] [[Alice in Wonderland:-paragraph-176]] [[Alice in Wonderland:-paragraph-177]] [[Alice in Wonderland:-paragraph-178]] [[Alice in Wonderland:-paragraph-179]] [[Alice in Wonderland:-paragraph-180]] [[Alice in Wonderland:-paragraph-181]] [[Alice in Wonderland:-paragraph-182]] [[Alice in Wonderland:-paragraph-183]] [[Alice in Wonderland:-paragraph-184]] [[Alice in Wonderland:-paragraph-185]] [[Alice in Wonderland:-paragraph-186]] [[Alice in Wonderland:-paragraph-187]] [[Alice in Wonderland:-paragraph-188]] [[Alice in Wonderland:-paragraph-189]] [[Alice in Wonderland:-paragraph-190]] [[Alice in Wonderland:-paragraph-191]] [[Alice in Wonderland:-paragraph-192]] [[Alice in Wonderland:-paragraph-193]] [[Alice in Wonderland:-paragraph-194]] [[Alice in Wonderland:-paragraph-195]] [[Alice in Wonderland:-paragraph-196]] [[Alice in Wonderland:-paragraph-197]] [[Alice in Wonderland:-paragraph-198]] [[Alice in Wonderland:-paragraph-199]] [[Alice in Wonderland:-paragraph-200]] [[Alice in Wonderland:-paragraph-201]] [[Alice in Wonderland:-paragraph-202]] [[Alice in Wonderland:-paragraph-203]] [[Alice in Wonderland:-paragraph-204]] [[Alice in Wonderland:-paragraph-205]] [[Alice in Wonderland:-paragraph-206]] [[Alice in Wonderland:-paragraph-207]] [[Alice in Wonderland:-paragraph-208]] [[Alice in Wonderland:-paragraph-209]] [[Alice in Wonderland:-paragraph-210]] [[Alice in Wonderland:-paragraph-211]] [[Alice in Wonderland:-paragraph-212]] [[Alice in Wonderland:-paragraph-213]] [[Alice in Wonderland:-paragraph-214]] [[Alice in Wonderland:-paragraph-215]] [[Alice in Wonderland:-paragraph-216]] [[Alice in Wonderland:-paragraph-217]] [[Alice in Wonderland:-paragraph-218]] [[Alice in Wonderland:-paragraph-219]] [[Alice in Wonderland:-paragraph-220]] [[Alice in Wonderland:-paragraph-221]] [[Alice in Wonderland:-paragraph-222]] [[Alice in Wonderland:-paragraph-223]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 6", "story-tiddlers": "[[Alice in Wonderland:-paragraph-224]] [[Alice in Wonderland:-paragraph-225]] [[Alice in Wonderland:-paragraph-226]] [[Alice in Wonderland:-paragraph-227]] [[Alice in Wonderland:-paragraph-228]] [[Alice in Wonderland:-paragraph-229]] [[Alice in Wonderland:-paragraph-230]] [[Alice in Wonderland:-paragraph-231]] [[Alice in Wonderland:-paragraph-232]] [[Alice in Wonderland:-paragraph-233]] [[Alice in Wonderland:-paragraph-234]] [[Alice in Wonderland:-paragraph-235]] [[Alice in Wonderland:-paragraph-236]] [[Alice in Wonderland:-paragraph-237]] [[Alice in Wonderland:-paragraph-238]] [[Alice in Wonderland:-paragraph-239]] [[Alice in Wonderland:-paragraph-240]] [[Alice in Wonderland:-paragraph-241]] [[Alice in Wonderland:-paragraph-242]] [[Alice in Wonderland:-paragraph-243]] [[Alice in Wonderland:-paragraph-244]] [[Alice in Wonderland:-paragraph-245]] [[Alice in Wonderland:-paragraph-246]] [[Alice in Wonderland:-paragraph-247]] [[Alice in Wonderland:-paragraph-248]] [[Alice in Wonderland:-paragraph-249]] [[Alice in Wonderland:-paragraph-250]] [[Alice in Wonderland:-paragraph-251]] [[Alice in Wonderland:-paragraph-252]] [[Alice in Wonderland:-paragraph-253]] [[Alice in Wonderland:-paragraph-254]] [[Alice in Wonderland:-paragraph-255]] [[Alice in Wonderland:-paragraph-256]] [[Alice in Wonderland:-paragraph-257]] [[Alice in Wonderland:-paragraph-258]] [[Alice in Wonderland:-paragraph-259]] [[Alice in Wonderland:-paragraph-260]] [[Alice in Wonderland:-paragraph-261]] [[Alice in Wonderland:-paragraph-262]] [[Alice in Wonderland:-paragraph-263]] [[Alice in Wonderland:-paragraph-264]] [[Alice in Wonderland:-paragraph-265]] [[Alice in Wonderland:-paragraph-266]] [[Alice in Wonderland:-paragraph-267]] [[Alice in Wonderland:-paragraph-268]] [[Alice in Wonderland:-paragraph-269]] [[Alice in Wonderland:-paragraph-270]] [[Alice in Wonderland:-paragraph-271]] [[Alice in Wonderland:-paragraph-272]] [[Alice in Wonderland:-paragraph-273]] [[Alice in Wonderland:-paragraph-274]] [[Alice in Wonderland:-paragraph-275]] [[Alice in Wonderland:-paragraph-276]] [[Alice in Wonderland:-paragraph-277]] [[Alice in Wonderland:-paragraph-278]] [[Alice in Wonderland:-paragraph-279]] [[Alice in Wonderland:-paragraph-280]] [[Alice in Wonderland:-paragraph-281]] [[Alice in Wonderland:-paragraph-282]] [[Alice in Wonderland:-paragraph-283]] [[Alice in Wonderland:-paragraph-284]] [[Alice in Wonderland:-paragraph-285]] [[Alice in Wonderland:-paragraph-286]] [[Alice in Wonderland:-paragraph-287]] [[Alice in Wonderland:-paragraph-288]] [[Alice in Wonderland:-paragraph-289]] [[Alice in Wonderland:-paragraph-290]] [[Alice in Wonderland:-paragraph-291]] [[Alice in Wonderland:-paragraph-292]] [[Alice in Wonderland:-paragraph-293]] [[Alice in Wonderland:-paragraph-294]] [[Alice in Wonderland:-paragraph-295]] [[Alice in Wonderland:-paragraph-296]] [[Alice in Wonderland:-paragraph-297]] [[Alice in Wonderland:-paragraph-298]] [[Alice in Wonderland:-paragraph-299]] [[Alice in Wonderland:-paragraph-300]] [[Alice in Wonderland:-paragraph-301]] [[Alice in Wonderland:-paragraph-302]] [[Alice in Wonderland:-paragraph-303]] [[Alice in Wonderland:-paragraph-304]] [[Alice in Wonderland:-paragraph-305]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 7", "story-tiddlers": "[[Alice in Wonderland:-paragraph-306]] [[Alice in Wonderland:-paragraph-307]] [[Alice in Wonderland:-paragraph-308]] [[Alice in Wonderland:-paragraph-309]] [[Alice in Wonderland:-paragraph-310]] [[Alice in Wonderland:-paragraph-311]] [[Alice in Wonderland:-paragraph-312]] [[Alice in Wonderland:-paragraph-313]] [[Alice in Wonderland:-paragraph-314]] [[Alice in Wonderland:-paragraph-315]] [[Alice in Wonderland:-paragraph-316]] [[Alice in Wonderland:-paragraph-317]] [[Alice in Wonderland:-paragraph-318]] [[Alice in Wonderland:-paragraph-319]] [[Alice in Wonderland:-paragraph-320]] [[Alice in Wonderland:-paragraph-321]] [[Alice in Wonderland:-paragraph-322]] [[Alice in Wonderland:-paragraph-323]] [[Alice in Wonderland:-paragraph-324]] [[Alice in Wonderland:-paragraph-325]] [[Alice in Wonderland:-paragraph-326]] [[Alice in Wonderland:-paragraph-327]] [[Alice in Wonderland:-paragraph-328]] [[Alice in Wonderland:-paragraph-329]] [[Alice in Wonderland:-paragraph-330]] [[Alice in Wonderland:-paragraph-331]] [[Alice in Wonderland:-paragraph-332]] [[Alice in Wonderland:-paragraph-333]] [[Alice in Wonderland:-paragraph-334]] [[Alice in Wonderland:-paragraph-335]] [[Alice in Wonderland:-paragraph-336]] [[Alice in Wonderland:-paragraph-337]] [[Alice in Wonderland:-paragraph-338]] [[Alice in Wonderland:-paragraph-339]] [[Alice in Wonderland:-paragraph-340]] [[Alice in Wonderland:-paragraph-341]] [[Alice in Wonderland:-paragraph-342]] [[Alice in Wonderland:-paragraph-343]] [[Alice in Wonderland:-paragraph-344]] [[Alice in Wonderland:-paragraph-345]] [[Alice in Wonderland:-paragraph-346]] [[Alice in Wonderland:-paragraph-347]] [[Alice in Wonderland:-paragraph-348]] [[Alice in Wonderland:-paragraph-349]] [[Alice in Wonderland:-paragraph-350]] [[Alice in Wonderland:-paragraph-351]] [[Alice in Wonderland:-paragraph-352]] [[Alice in Wonderland:-paragraph-353]] [[Alice in Wonderland:-paragraph-354]] [[Alice in Wonderland:-paragraph-355]] [[Alice in Wonderland:-paragraph-356]] [[Alice in Wonderland:-paragraph-357]] [[Alice in Wonderland:-paragraph-358]] [[Alice in Wonderland:-paragraph-359]] [[Alice in Wonderland:-paragraph-360]] [[Alice in Wonderland:-paragraph-361]] [[Alice in Wonderland:-paragraph-362]] [[Alice in Wonderland:-paragraph-363]] [[Alice in Wonderland:-paragraph-364]] [[Alice in Wonderland:-paragraph-365]] [[Alice in Wonderland:-paragraph-366]] [[Alice in Wonderland:-paragraph-367]] [[Alice in Wonderland:-paragraph-368]] [[Alice in Wonderland:-paragraph-369]] [[Alice in Wonderland:-paragraph-370]] [[Alice in Wonderland:-paragraph-371]] [[Alice in Wonderland:-paragraph-372]] [[Alice in Wonderland:-paragraph-373]] [[Alice in Wonderland:-paragraph-374]] [[Alice in Wonderland:-paragraph-375]] [[Alice in Wonderland:-paragraph-376]] [[Alice in Wonderland:-paragraph-377]] [[Alice in Wonderland:-paragraph-378]] [[Alice in Wonderland:-paragraph-379]] [[Alice in Wonderland:-paragraph-380]] [[Alice in Wonderland:-paragraph-381]] [[Alice in Wonderland:-paragraph-382]] [[Alice in Wonderland:-paragraph-383]] [[Alice in Wonderland:-paragraph-384]] [[Alice in Wonderland:-paragraph-385]] [[Alice in Wonderland:-paragraph-386]] [[Alice in Wonderland:-paragraph-387]] [[Alice in Wonderland:-paragraph-388]] [[Alice in Wonderland:-paragraph-389]] [[Alice in Wonderland:-paragraph-390]] [[Alice in Wonderland:-paragraph-391]] [[Alice in Wonderland:-paragraph-392]] [[Alice in Wonderland:-paragraph-393]] [[Alice in Wonderland:-paragraph-394]] [[Alice in Wonderland:-paragraph-395]] [[Alice in Wonderland:-paragraph-396]] [[Alice in Wonderland:-paragraph-397]] [[Alice in Wonderland:-paragraph-398]] [[Alice in Wonderland:-paragraph-399]] [[Alice in Wonderland:-paragraph-400]] [[Alice in Wonderland:-paragraph-401]] [[Alice in Wonderland:-paragraph-402]] [[Alice in Wonderland:-paragraph-403]] [[Alice in Wonderland:-paragraph-404]] [[Alice in Wonderland:-paragraph-405]] [[Alice in Wonderland:-paragraph-406]] [[Alice in Wonderland:-paragraph-407]] [[Alice in Wonderland:-paragraph-408]] [[Alice in Wonderland:-paragraph-409]] [[Alice in Wonderland:-paragraph-410]] [[Alice in Wonderland:-paragraph-411]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 8", "story-tiddlers": "[[Alice in Wonderland:-paragraph-412]] [[Alice in Wonderland:-paragraph-413]] [[Alice in Wonderland:-paragraph-414]] [[Alice in Wonderland:-paragraph-415]] [[Alice in Wonderland:-paragraph-416]] [[Alice in Wonderland:-paragraph-417]] [[Alice in Wonderland:-paragraph-418]] [[Alice in Wonderland:-paragraph-419]] [[Alice in Wonderland:-paragraph-420]] [[Alice in Wonderland:-paragraph-421]] [[Alice in Wonderland:-paragraph-422]] [[Alice in Wonderland:-paragraph-423]] [[Alice in Wonderland:-paragraph-424]] [[Alice in Wonderland:-paragraph-425]] [[Alice in Wonderland:-paragraph-426]] [[Alice in Wonderland:-paragraph-427]] [[Alice in Wonderland:-paragraph-428]] [[Alice in Wonderland:-paragraph-429]] [[Alice in Wonderland:-paragraph-430]] [[Alice in Wonderland:-paragraph-431]] [[Alice in Wonderland:-paragraph-432]] [[Alice in Wonderland:-paragraph-433]] [[Alice in Wonderland:-paragraph-434]] [[Alice in Wonderland:-paragraph-435]] [[Alice in Wonderland:-paragraph-436]] [[Alice in Wonderland:-paragraph-437]] [[Alice in Wonderland:-paragraph-438]] [[Alice in Wonderland:-paragraph-439]] [[Alice in Wonderland:-paragraph-440]] [[Alice in Wonderland:-paragraph-441]] [[Alice in Wonderland:-paragraph-442]] [[Alice in Wonderland:-paragraph-443]] [[Alice in Wonderland:-paragraph-444]] [[Alice in Wonderland:-paragraph-445]] [[Alice in Wonderland:-paragraph-446]] [[Alice in Wonderland:-paragraph-447]] [[Alice in Wonderland:-paragraph-448]] [[Alice in Wonderland:-paragraph-449]] [[Alice in Wonderland:-paragraph-450]] [[Alice in Wonderland:-paragraph-451]] [[Alice in Wonderland:-paragraph-452]] [[Alice in Wonderland:-paragraph-453]] [[Alice in Wonderland:-paragraph-454]] [[Alice in Wonderland:-paragraph-455]] [[Alice in Wonderland:-paragraph-456]] [[Alice in Wonderland:-paragraph-457]] [[Alice in Wonderland:-paragraph-458]] [[Alice in Wonderland:-paragraph-459]] [[Alice in Wonderland:-paragraph-460]] [[Alice in Wonderland:-paragraph-461]] [[Alice in Wonderland:-paragraph-462]] [[Alice in Wonderland:-paragraph-463]] [[Alice in Wonderland:-paragraph-464]] [[Alice in Wonderland:-paragraph-465]] [[Alice in Wonderland:-paragraph-466]] [[Alice in Wonderland:-paragraph-467]] [[Alice in Wonderland:-paragraph-468]] [[Alice in Wonderland:-paragraph-469]] [[Alice in Wonderland:-paragraph-470]] [[Alice in Wonderland:-paragraph-471]] [[Alice in Wonderland:-paragraph-472]] [[Alice in Wonderland:-paragraph-473]] [[Alice in Wonderland:-paragraph-474]] [[Alice in Wonderland:-paragraph-475]] [[Alice in Wonderland:-paragraph-476]] [[Alice in Wonderland:-paragraph-477]] [[Alice in Wonderland:-paragraph-478]] [[Alice in Wonderland:-paragraph-479]] [[Alice in Wonderland:-paragraph-480]] [[Alice in Wonderland:-paragraph-481]] [[Alice in Wonderland:-paragraph-482]] [[Alice in Wonderland:-paragraph-483]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 9", "story-tiddlers": "[[Alice in Wonderland:-paragraph-484]] [[Alice in Wonderland:-paragraph-485]] [[Alice in Wonderland:-paragraph-486]] [[Alice in Wonderland:-paragraph-487]] [[Alice in Wonderland:-paragraph-488]] [[Alice in Wonderland:-paragraph-489]] [[Alice in Wonderland:-paragraph-490]] [[Alice in Wonderland:-paragraph-491]] [[Alice in Wonderland:-paragraph-492]] [[Alice in Wonderland:-paragraph-493]] [[Alice in Wonderland:-paragraph-494]] [[Alice in Wonderland:-paragraph-495]] [[Alice in Wonderland:-paragraph-496]] [[Alice in Wonderland:-paragraph-497]] [[Alice in Wonderland:-paragraph-498]] [[Alice in Wonderland:-paragraph-499]] [[Alice in Wonderland:-paragraph-500]] [[Alice in Wonderland:-paragraph-501]] [[Alice in Wonderland:-paragraph-502]] [[Alice in Wonderland:-paragraph-503]] [[Alice in Wonderland:-paragraph-504]] [[Alice in Wonderland:-paragraph-505]] [[Alice in Wonderland:-paragraph-506]] [[Alice in Wonderland:-paragraph-507]] [[Alice in Wonderland:-paragraph-508]] [[Alice in Wonderland:-paragraph-509]] [[Alice in Wonderland:-paragraph-510]] [[Alice in Wonderland:-paragraph-511]] [[Alice in Wonderland:-paragraph-512]] [[Alice in Wonderland:-paragraph-513]] [[Alice in Wonderland:-paragraph-514]] [[Alice in Wonderland:-paragraph-515]] [[Alice in Wonderland:-paragraph-516]] [[Alice in Wonderland:-paragraph-517]] [[Alice in Wonderland:-paragraph-518]] [[Alice in Wonderland:-paragraph-519]] [[Alice in Wonderland:-paragraph-520]] [[Alice in Wonderland:-paragraph-521]] [[Alice in Wonderland:-paragraph-522]] [[Alice in Wonderland:-paragraph-523]] [[Alice in Wonderland:-paragraph-524]] [[Alice in Wonderland:-paragraph-525]] [[Alice in Wonderland:-paragraph-526]] [[Alice in Wonderland:-paragraph-527]] [[Alice in Wonderland:-paragraph-528]] [[Alice in Wonderland:-paragraph-529]] [[Alice in Wonderland:-paragraph-530]] [[Alice in Wonderland:-paragraph-531]] [[Alice in Wonderland:-paragraph-532]] [[Alice in Wonderland:-paragraph-533]] [[Alice in Wonderland:-paragraph-534]] [[Alice in Wonderland:-paragraph-535]] [[Alice in Wonderland:-paragraph-536]] [[Alice in Wonderland:-paragraph-537]] [[Alice in Wonderland:-paragraph-538]] [[Alice in Wonderland:-paragraph-539]] [[Alice in Wonderland:-paragraph-540]] [[Alice in Wonderland:-paragraph-541]] [[Alice in Wonderland:-paragraph-542]] [[Alice in Wonderland:-paragraph-543]] [[Alice in Wonderland:-paragraph-544]] [[Alice in Wonderland:-paragraph-545]] [[Alice in Wonderland:-paragraph-546]] [[Alice in Wonderland:-paragraph-547]] [[Alice in Wonderland:-paragraph-548]] [[Alice in Wonderland:-paragraph-549]] [[Alice in Wonderland:-paragraph-550]] [[Alice in Wonderland:-paragraph-551]] [[Alice in Wonderland:-paragraph-552]] [[Alice in Wonderland:-paragraph-553]] [[Alice in Wonderland:-paragraph-554]] [[Alice in Wonderland:-paragraph-555]] [[Alice in Wonderland:-paragraph-556]] [[Alice in Wonderland:-paragraph-557]] [[Alice in Wonderland:-paragraph-558]] [[Alice in Wonderland:-paragraph-559]] [[Alice in Wonderland:-paragraph-560]] [[Alice in Wonderland:-paragraph-561]] [[Alice in Wonderland:-paragraph-562]] [[Alice in Wonderland:-paragraph-563]] [[Alice in Wonderland:-paragraph-564]] [[Alice in Wonderland:-paragraph-565]] [[Alice in Wonderland:-paragraph-566]] [[Alice in Wonderland:-paragraph-567]] [[Alice in Wonderland:-paragraph-568]] [[Alice in Wonderland:-paragraph-569]] [[Alice in Wonderland:-paragraph-570]] [[Alice in Wonderland:-paragraph-571]] [[Alice in Wonderland:-paragraph-572]] [[Alice in Wonderland:-paragraph-573]] [[Alice in Wonderland:-paragraph-574]] [[Alice in Wonderland:-paragraph-575]] [[Alice in Wonderland:-paragraph-576]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 10", "story-tiddlers": "[[Alice in Wonderland:-paragraph-577]] [[Alice in Wonderland:-paragraph-578]] [[Alice in Wonderland:-paragraph-579]] [[Alice in Wonderland:-paragraph-580]] [[Alice in Wonderland:-paragraph-581]] [[Alice in Wonderland:-paragraph-582]] [[Alice in Wonderland:-paragraph-583]] [[Alice in Wonderland:-paragraph-584]] [[Alice in Wonderland:-paragraph-585]] [[Alice in Wonderland:-paragraph-586]] [[Alice in Wonderland:-paragraph-587]] [[Alice in Wonderland:-paragraph-588]] [[Alice in Wonderland:-paragraph-589]] [[Alice in Wonderland:-paragraph-590]] [[Alice in Wonderland:-paragraph-591]] [[Alice in Wonderland:-paragraph-592]] [[Alice in Wonderland:-paragraph-593]] [[Alice in Wonderland:-paragraph-594]] [[Alice in Wonderland:-paragraph-595]] [[Alice in Wonderland:-paragraph-596]] [[Alice in Wonderland:-paragraph-597]] [[Alice in Wonderland:-paragraph-598]] [[Alice in Wonderland:-paragraph-599]] [[Alice in Wonderland:-paragraph-600]] [[Alice in Wonderland:-paragraph-601]] [[Alice in Wonderland:-paragraph-602]] [[Alice in Wonderland:-paragraph-603]] [[Alice in Wonderland:-paragraph-604]] [[Alice in Wonderland:-paragraph-605]] [[Alice in Wonderland:-paragraph-606]] [[Alice in Wonderland:-paragraph-607]] [[Alice in Wonderland:-paragraph-608]] [[Alice in Wonderland:-paragraph-609]] [[Alice in Wonderland:-paragraph-610]] [[Alice in Wonderland:-paragraph-611]] [[Alice in Wonderland:-paragraph-612]] [[Alice in Wonderland:-paragraph-613]] [[Alice in Wonderland:-paragraph-614]] [[Alice in Wonderland:-paragraph-615]] [[Alice in Wonderland:-paragraph-616]] [[Alice in Wonderland:-paragraph-617]] [[Alice in Wonderland:-paragraph-618]] [[Alice in Wonderland:-paragraph-619]] [[Alice in Wonderland:-paragraph-620]] [[Alice in Wonderland:-paragraph-621]] [[Alice in Wonderland:-paragraph-622]] [[Alice in Wonderland:-paragraph-623]] [[Alice in Wonderland:-paragraph-624]] [[Alice in Wonderland:-paragraph-625]] [[Alice in Wonderland:-paragraph-626]] [[Alice in Wonderland:-paragraph-627]] [[Alice in Wonderland:-paragraph-628]] [[Alice in Wonderland:-paragraph-629]] [[Alice in Wonderland:-paragraph-630]] [[Alice in Wonderland:-paragraph-631]] [[Alice in Wonderland:-paragraph-632]] [[Alice in Wonderland:-paragraph-633]] [[Alice in Wonderland:-paragraph-634]] [[Alice in Wonderland:-paragraph-635]] [[Alice in Wonderland:-paragraph-636]] [[Alice in Wonderland:-paragraph-637]] [[Alice in Wonderland:-paragraph-638]] [[Alice in Wonderland:-paragraph-639]] [[Alice in Wonderland:-paragraph-640]] [[Alice in Wonderland:-paragraph-641]] [[Alice in Wonderland:-paragraph-642]] [[Alice in Wonderland:-paragraph-643]] [[Alice in Wonderland:-paragraph-644]] [[Alice in Wonderland:-paragraph-645]] [[Alice in Wonderland:-paragraph-646]] [[Alice in Wonderland:-paragraph-647]] [[Alice in Wonderland:-paragraph-648]] [[Alice in Wonderland:-paragraph-649]] [[Alice in Wonderland:-paragraph-650]] [[Alice in Wonderland:-paragraph-651]] [[Alice in Wonderland:-paragraph-652]] [[Alice in Wonderland:-paragraph-653]] [[Alice in Wonderland:-paragraph-654]] [[Alice in Wonderland:-paragraph-655]] [[Alice in Wonderland:-paragraph-656]] [[Alice in Wonderland:-paragraph-657]] [[Alice in Wonderland:-paragraph-658]] [[Alice in Wonderland:-paragraph-659]] [[Alice in Wonderland:-paragraph-660]] [[Alice in Wonderland:-paragraph-661]] [[Alice in Wonderland:-paragraph-662]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 11", "story-tiddlers": "[[Alice in Wonderland:-paragraph-663]] [[Alice in Wonderland:-paragraph-664]] [[Alice in Wonderland:-paragraph-665]] [[Alice in Wonderland:-paragraph-666]] [[Alice in Wonderland:-paragraph-667]] [[Alice in Wonderland:-paragraph-668]] [[Alice in Wonderland:-paragraph-669]] [[Alice in Wonderland:-paragraph-670]] [[Alice in Wonderland:-paragraph-671]] [[Alice in Wonderland:-paragraph-672]] [[Alice in Wonderland:-paragraph-673]] [[Alice in Wonderland:-paragraph-674]] [[Alice in Wonderland:-paragraph-675]] [[Alice in Wonderland:-paragraph-676]] [[Alice in Wonderland:-paragraph-677]] [[Alice in Wonderland:-paragraph-678]] [[Alice in Wonderland:-paragraph-679]] [[Alice in Wonderland:-paragraph-680]] [[Alice in Wonderland:-paragraph-681]] [[Alice in Wonderland:-paragraph-682]] [[Alice in Wonderland:-paragraph-683]] [[Alice in Wonderland:-paragraph-684]] [[Alice in Wonderland:-paragraph-685]] [[Alice in Wonderland:-paragraph-686]] [[Alice in Wonderland:-paragraph-687]] [[Alice in Wonderland:-paragraph-688]] [[Alice in Wonderland:-paragraph-689]] [[Alice in Wonderland:-paragraph-690]] [[Alice in Wonderland:-paragraph-691]] [[Alice in Wonderland:-paragraph-692]] [[Alice in Wonderland:-paragraph-693]] [[Alice in Wonderland:-paragraph-694]] [[Alice in Wonderland:-paragraph-695]] [[Alice in Wonderland:-paragraph-696]] [[Alice in Wonderland:-paragraph-697]] [[Alice in Wonderland:-paragraph-698]] [[Alice in Wonderland:-paragraph-699]] [[Alice in Wonderland:-paragraph-700]] [[Alice in Wonderland:-paragraph-701]] [[Alice in Wonderland:-paragraph-702]] [[Alice in Wonderland:-paragraph-703]] [[Alice in Wonderland:-paragraph-704]] [[Alice in Wonderland:-paragraph-705]] [[Alice in Wonderland:-paragraph-706]] [[Alice in Wonderland:-paragraph-707]] [[Alice in Wonderland:-paragraph-708]] [[Alice in Wonderland:-paragraph-709]] [[Alice in Wonderland:-paragraph-710]] [[Alice in Wonderland:-paragraph-711]] [[Alice in Wonderland:-paragraph-712]] [[Alice in Wonderland:-paragraph-713]] [[Alice in Wonderland:-paragraph-714]] [[Alice in Wonderland:-paragraph-715]] [[Alice in Wonderland:-paragraph-716]] [[Alice in Wonderland:-paragraph-717]] [[Alice in Wonderland:-paragraph-718]] [[Alice in Wonderland:-paragraph-719]] [[Alice in Wonderland:-paragraph-720]] [[Alice in Wonderland:-paragraph-721]] [[Alice in Wonderland:-paragraph-722]] [[Alice in Wonderland:-paragraph-723]] [[Alice in Wonderland:-paragraph-724]] [[Alice in Wonderland:-paragraph-725]] [[Alice in Wonderland:-paragraph-726]] [[Alice in Wonderland:-paragraph-727]] [[Alice in Wonderland:-paragraph-728]] [[Alice in Wonderland:-paragraph-729]] [[Alice in Wonderland:-paragraph-730]] [[Alice in Wonderland:-paragraph-731]] [[Alice in Wonderland:-paragraph-732]] [[Alice in Wonderland:-paragraph-733]] [[Alice in Wonderland:-paragraph-734]] [[Alice in Wonderland:-paragraph-735]] [[Alice in Wonderland:-paragraph-736]] [[Alice in Wonderland:-paragraph-737]]", "tags": "TableOfContents", "text": ""}, +{"title": "Chapter 12", "story-tiddlers": "[[Alice in Wonderland:-paragraph-738]] [[Alice in Wonderland:-paragraph-739]] [[Alice in Wonderland:-paragraph-740]] [[Alice in Wonderland:-paragraph-741]] [[Alice in Wonderland:-paragraph-742]] [[Alice in Wonderland:-paragraph-743]] [[Alice in Wonderland:-paragraph-744]] [[Alice in Wonderland:-paragraph-745]] [[Alice in Wonderland:-paragraph-746]] [[Alice in Wonderland:-paragraph-747]] [[Alice in Wonderland:-paragraph-748]] [[Alice in Wonderland:-paragraph-749]] [[Alice in Wonderland:-paragraph-750]] [[Alice in Wonderland:-paragraph-751]] [[Alice in Wonderland:-paragraph-752]] [[Alice in Wonderland:-paragraph-753]] [[Alice in Wonderland:-paragraph-754]] [[Alice in Wonderland:-paragraph-755]] [[Alice in Wonderland:-paragraph-756]] [[Alice in Wonderland:-paragraph-757]] [[Alice in Wonderland:-paragraph-758]] [[Alice in Wonderland:-paragraph-759]] [[Alice in Wonderland:-paragraph-760]] [[Alice in Wonderland:-paragraph-761]] [[Alice in Wonderland:-paragraph-762]] [[Alice in Wonderland:-paragraph-763]] [[Alice in Wonderland:-paragraph-764]] [[Alice in Wonderland:-paragraph-765]] [[Alice in Wonderland:-paragraph-766]] [[Alice in Wonderland:-paragraph-767]] [[Alice in Wonderland:-paragraph-768]] [[Alice in Wonderland:-paragraph-769]] [[Alice in Wonderland:-paragraph-770]] [[Alice in Wonderland:-paragraph-771]] [[Alice in Wonderland:-paragraph-772]] [[Alice in Wonderland:-paragraph-773]] [[Alice in Wonderland:-paragraph-774]] [[Alice in Wonderland:-paragraph-775]] [[Alice in Wonderland:-paragraph-776]] [[Alice in Wonderland:-paragraph-777]] [[Alice in Wonderland:-paragraph-778]] [[Alice in Wonderland:-paragraph-779]] [[Alice in Wonderland:-paragraph-780]] [[Alice in Wonderland:-paragraph-781]] [[Alice in Wonderland:-paragraph-782]] [[Alice in Wonderland:-paragraph-783]] [[Alice in Wonderland:-paragraph-784]] [[Alice in Wonderland:-paragraph-785]] [[Alice in Wonderland:-paragraph-786]] [[Alice in Wonderland:-paragraph-787]] [[Alice in Wonderland:-paragraph-788]] [[Alice in Wonderland:-paragraph-789]] [[Alice in Wonderland:-paragraph-790]] [[Alice in Wonderland:-paragraph-791]] [[Alice in Wonderland:-paragraph-792]] [[Alice in Wonderland:-paragraph-793]] [[Alice in Wonderland:-paragraph-794]] [[Alice in Wonderland:-paragraph-795]] [[Alice in Wonderland:-paragraph-796]] [[Alice in Wonderland:-paragraph-797]] [[Alice in Wonderland:-paragraph-798]] [[Alice in Wonderland:-paragraph-799]] [[Alice in Wonderland:-paragraph-800]] [[Alice in Wonderland:-paragraph-801]] [[Alice in Wonderland:-paragraph-802]] [[Alice in Wonderland:-paragraph-803]] [[Alice in Wonderland:-paragraph-804]] [[Alice in Wonderland:-paragraph-805]] [[Alice in Wonderland:-paragraph-806]] [[Alice in Wonderland:-paragraph-807]] [[Alice in Wonderland:-paragraph-808]] [[Alice in Wonderland:-paragraph-809]] [[Alice in Wonderland:-paragraph-810]]", "tags": "TableOfContents", "text": ""} ] From 754c1251a9bdf45e8f64079a4bbdaed2d05be2b7 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Mar 2019 10:52:28 +0000 Subject: [PATCH 0068/2376] Add new "variables" and "getvariables" operators --- core/modules/filters/getvariable.js | 26 +++++++++++++++++++ core/modules/filters/variables.js | 26 +++++++++++++++++++ .../tiddlers/filters/examples/getvariable.tid | 7 +++++ .../tiddlers/filters/examples/variables.tid | 7 +++++ .../tw5.com/tiddlers/filters/getvariable.tid | 17 ++++++++++++ .../tw5.com/tiddlers/filters/variables.tid | 16 ++++++++++++ 6 files changed, 99 insertions(+) create mode 100644 core/modules/filters/getvariable.js create mode 100644 core/modules/filters/variables.js create mode 100644 editions/tw5.com/tiddlers/filters/examples/getvariable.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/variables.tid create mode 100644 editions/tw5.com/tiddlers/filters/getvariable.tid create mode 100644 editions/tw5.com/tiddlers/filters/variables.tid diff --git a/core/modules/filters/getvariable.js b/core/modules/filters/getvariable.js new file mode 100644 index 000000000..43451abed --- /dev/null +++ b/core/modules/filters/getvariable.js @@ -0,0 +1,26 @@ +/*\ +title: $:/core/modules/filters/getvariable.js +type: application/javascript +module-type: filteroperator + +Filter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.getvariable = function(source,operator,options) { + var results = []; + source(function(tiddler,title) { + results.push(options.widget.getVariable(title) || ""); + }); + return results; +}; + +})(); diff --git a/core/modules/filters/variables.js b/core/modules/filters/variables.js new file mode 100644 index 000000000..fda40a404 --- /dev/null +++ b/core/modules/filters/variables.js @@ -0,0 +1,26 @@ +/*\ +title: $:/core/modules/filters/variables.js +type: application/javascript +module-type: filteroperator + +Filter operator for returning the names of the active variables + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.variables = function(source,operator,options) { + var names = []; + for(var variable in options.widget.variables) { + names.push(variable); + } + return names.sort(); +}; + +})(); diff --git a/editions/tw5.com/tiddlers/filters/examples/getvariable.tid b/editions/tw5.com/tiddlers/filters/examples/getvariable.tid new file mode 100644 index 000000000..4276ac9cf --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/getvariable.tid @@ -0,0 +1,7 @@ +created: 20190330100101453 +modified: 20190330100101453 +tags: [[getvariable Operator]] [[Operator Examples]] +title: getvariable Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[currentTiddler]getvariable[]]" "returns the value of the variable ''currentTiddler''">> diff --git a/editions/tw5.com/tiddlers/filters/examples/variables.tid b/editions/tw5.com/tiddlers/filters/examples/variables.tid new file mode 100644 index 000000000..f4db9207f --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/variables.tid @@ -0,0 +1,7 @@ +created: 20190330100101453 +modified: 20190330100101453 +tags: [[variables Operator]] [[Operator Examples]] +title: variables Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[variables[]prefix[colour]]" "returns the names of any variables whose names start with ''colour''">> diff --git a/editions/tw5.com/tiddlers/filters/getvariable.tid b/editions/tw5.com/tiddlers/filters/getvariable.tid new file mode 100644 index 000000000..241ec448b --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/getvariable.tid @@ -0,0 +1,17 @@ +created: 20190330100101453 +modified: 20190330100101453 +tags: [[Filter Operators]] [[Special Operators]] +title: getvariable Operator +caption: getvariable +op-purpose: select all values of variables named in the input titles +op-input: a selection of varible names +op-parameter: ignored +op-output: the values of each of the variables named in the input titles (or blank if the variable is not defined) + +The usual way to retrieve a variable value within a filter is with the angle brackets notation. For example, `[]` will retrieve the value of the variable called `currentTiddler`. + +The `getvariable` filter operator provides an alternative way to retrieve a variable. For example, `[[currentTiddler]getvariable[]]` is another way to retrieve the value of the variable `currentTiddler`. + +The advantage of `getvariable` is that it makes it possible to work with variables whose name is computed, and not known in advance. For example, `[getvariable[]]` gets the value of the variable whose name is given in the variable `myvariable`. + +<<.operator-examples "getvariable">> diff --git a/editions/tw5.com/tiddlers/filters/variables.tid b/editions/tw5.com/tiddlers/filters/variables.tid new file mode 100644 index 000000000..fd8200f24 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/variables.tid @@ -0,0 +1,16 @@ +created: 20190330100101453 +modified: 20190330100101453 +tags: [[Filter Operators]] [[Special Operators]] [[Selection Constructors]] +title: variables Operator +type: text/vnd.tiddlywiki +caption: variables +op-purpose: select the names of all the actively defined variables +op-input: ignored +op-parameter: none +op-output: the names of all the actively defined variables + +The primary purpose of the `variables` operator is to implement the [[dumpvariables Macro]]: + +<$codeblock code={{$:/core/macros/dumpvariables}}/> + +<<.operator-examples "variables">> From 37ea659bf011b1d4a152f54171399d94f5bba3ef Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Mar 2019 10:52:49 +0000 Subject: [PATCH 0069/2376] Refactor the dumpvariables macro as wikitext Making it easier to customise --- core/modules/macros/dumpvariables.js | 41 ---------------------------- core/wiki/macros/dumpvariables.tid | 13 +++++++++ 2 files changed, 13 insertions(+), 41 deletions(-) delete mode 100644 core/modules/macros/dumpvariables.js create mode 100644 core/wiki/macros/dumpvariables.tid diff --git a/core/modules/macros/dumpvariables.js b/core/modules/macros/dumpvariables.js deleted file mode 100644 index 248beae96..000000000 --- a/core/modules/macros/dumpvariables.js +++ /dev/null @@ -1,41 +0,0 @@ -/*\ -title: $:/core/modules/macros/dumpvariables.js -type: application/javascript -module-type: macro - -Macro to dump all active variable values - -\*/ -(function(){ - -/*jslint node: true, browser: true */ -/*global $tw: false */ -"use strict"; - -/* -Information about this macro -*/ - -exports.name = "dumpvariables"; - -exports.params = [ -]; - -/* -Run the macro -*/ -exports.run = function() { - var output = ["|!Variable |!Value |"], - variables = [], variable; - for(variable in this.variables) { - variables.push(variable); - } - variables.sort(); - for(var index=0; index>/> |") - } - return output.join("\n"); -}; - -})(); diff --git a/core/wiki/macros/dumpvariables.tid b/core/wiki/macros/dumpvariables.tid new file mode 100644 index 000000000..d713fd073 --- /dev/null +++ b/core/wiki/macros/dumpvariables.tid @@ -0,0 +1,13 @@ +title: $:/core/macros/dumpvariables +tags: $:/tags/Macro + +\define dumpvariables() +
        +<$list filter="[variables[]]" variable="varname"> +
      • +<$text text=<>/>:
        +<$codeblock code={{{ [getvariable[]] }}}/> +
      • + +
      +\end From f4d8c901918582682ba45e2485bcd6ff1679d2f2 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Mar 2019 10:55:22 +0000 Subject: [PATCH 0070/2376] Add missing "from-version" tags to new features --- editions/tw5.com/tiddlers/filters/getvariable.tid | 2 +- editions/tw5.com/tiddlers/filters/variables.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/getvariable.tid b/editions/tw5.com/tiddlers/filters/getvariable.tid index 241ec448b..6d6caae5d 100644 --- a/editions/tw5.com/tiddlers/filters/getvariable.tid +++ b/editions/tw5.com/tiddlers/filters/getvariable.tid @@ -8,7 +8,7 @@ op-input: a selection of varible names op-parameter: ignored op-output: the values of each of the variables named in the input titles (or blank if the variable is not defined) -The usual way to retrieve a variable value within a filter is with the angle brackets notation. For example, `[]` will retrieve the value of the variable called `currentTiddler`. +|<<.from-version "5.1.20">> The usual way to retrieve a variable value within a filter is with the angle brackets notation. For example, `[]` will retrieve the value of the variable called `currentTiddler`. The `getvariable` filter operator provides an alternative way to retrieve a variable. For example, `[[currentTiddler]getvariable[]]` is another way to retrieve the value of the variable `currentTiddler`. diff --git a/editions/tw5.com/tiddlers/filters/variables.tid b/editions/tw5.com/tiddlers/filters/variables.tid index fd8200f24..d1c6b08a8 100644 --- a/editions/tw5.com/tiddlers/filters/variables.tid +++ b/editions/tw5.com/tiddlers/filters/variables.tid @@ -9,7 +9,7 @@ op-input: ignored op-parameter: none op-output: the names of all the actively defined variables -The primary purpose of the `variables` operator is to implement the [[dumpvariables Macro]]: +<<.from-version "5.1.20">> The primary purpose of the `variables` operator is to implement the [[dumpvariables Macro]]: <$codeblock code={{$:/core/macros/dumpvariables}}/> From 6575db07c7c0a9cb9b55a21556b58ae559e857c4 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Mar 2019 12:06:46 +0000 Subject: [PATCH 0071/2376] Docs typo --- editions/tw5.com/tiddlers/filters/getvariable.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/getvariable.tid b/editions/tw5.com/tiddlers/filters/getvariable.tid index 6d6caae5d..19427cb75 100644 --- a/editions/tw5.com/tiddlers/filters/getvariable.tid +++ b/editions/tw5.com/tiddlers/filters/getvariable.tid @@ -8,7 +8,7 @@ op-input: a selection of varible names op-parameter: ignored op-output: the values of each of the variables named in the input titles (or blank if the variable is not defined) -|<<.from-version "5.1.20">> The usual way to retrieve a variable value within a filter is with the angle brackets notation. For example, `[]` will retrieve the value of the variable called `currentTiddler`. +<<.from-version "5.1.20">> The usual way to retrieve a variable value within a filter is with the angle brackets notation. For example, `[]` will retrieve the value of the variable called `currentTiddler`. The `getvariable` filter operator provides an alternative way to retrieve a variable. For example, `[[currentTiddler]getvariable[]]` is another way to retrieve the value of the variable `currentTiddler`. From 6e81122fa3ac0b74764b86347f84e2805f0ece34 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 30 Mar 2019 12:10:42 +0000 Subject: [PATCH 0072/2376] Restore exclude parameter for selective TOC macros Reverting 94607aa9cdc4a853710ea48544aa5f99bfdc017a --- core/wiki/macros/toc.tid | 52 +++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index a09ea0018..8d82cb359 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -32,7 +32,7 @@ tags: $:/tags/Macro <$macrocall $name="toc-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> /> \end -\define toc-linked-expandable-body(tag,sort:"",itemClassFilter,path) +\define toc-linked-expandable-body(tag,sort:"",itemClassFilter,exclude,path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> @@ -51,14 +51,14 @@ tags: $:/tags/Macro <> <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/> + <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
    10. \end -\define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter:" ",path) +\define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> @@ -76,7 +76,7 @@ tags: $:/tags/Macro <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/> + <$macrocall $name="toc-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/> @@ -84,22 +84,24 @@ tags: $:/tags/Macro \end \define toc-expandable-empty-message() -<$macrocall $name="toc-linked-expandable-body" tag=<> sort=<> itemClassFilter=<> path=<>/> +<$macrocall $name="toc-linked-expandable-body" tag=<> sort=<> itemClassFilter=<> exclude=<> path=<>/> \end -\define toc-expandable(tag,sort:"",itemClassFilter:" ",path) +\define toc-expandable(tag,sort:"",itemClassFilter:" ",exclude,path) <$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}> -
        - <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>]"""> - <$list filter="[all[current]toc-link[no]]" emptyMessage=<> > - <$macrocall $name="toc-unlinked-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="""itemClassFilter""" path=<> /> + <$set name="excluded" filter="""[enlist<__exclude__>] [<__tag__>]"""> +
          + <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> + <$list filter="[all[current]toc-link[no]]" emptyMessage=<> > + <$macrocall $name="toc-unlinked-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="""itemClassFilter""" exclude=<> path=<> /> + - -
        +
      + \end -\define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",path) +\define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected" >
    11. >> @@ -119,14 +121,14 @@ tags: $:/tags/Macro <> <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/> + <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
    12. \end -\define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",path) +\define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected">
    13. >> @@ -145,7 +147,7 @@ tags: $:/tags/Macro <$reveal type="match" stateTitle=<> text="open"> - <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<<__path__>>/> + <$macrocall $name="toc-selective-expandable" tag=<> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>
    14. @@ -153,18 +155,20 @@ tags: $:/tags/Macro \end \define toc-selective-expandable-empty-message() -<$macrocall $name="toc-linked-selective-expandable-body" tag=<> sort=<> itemClassFilter=<> path=<>/> +<$macrocall $name="toc-linked-selective-expandable-body" tag=<> sort=<> itemClassFilter=<> exclude=<> path=<>/> \end -\define toc-selective-expandable(tag,sort:"",itemClassFilter,path) +\define toc-selective-expandable(tag,sort:"",itemClassFilter,exclude,path) <$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}> -
        - <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>]"""> - <$list filter="[all[current]toc-link[no]]" variable="ignore" emptyMessage=<> > - <$macrocall $name="toc-unlinked-selective-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path=<>/> + <$set name="excluded" filter="""[enlist<__exclude__>] [<__tag__>]"""> +
          + <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> + <$list filter="[all[current]toc-link[no]]" variable="ignore" emptyMessage=<> > + <$macrocall $name="toc-unlinked-selective-expandable-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<> path=<>/> + - -
        +
      + \end From d5fa68b46a0e7db0d7280a0a64a3d7973ce3aacd Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 5 Apr 2019 09:11:54 +0100 Subject: [PATCH 0073/2376] Simplify PageTemplate We no longer need to mess around with the currentTiddler variable to be able to access to the "name" field of the current language --- core/ui/PageTemplate.tid | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/ui/PageTemplate.tid b/core/ui/PageTemplate.tid index 6ec711950..0dafc9666 100644 --- a/core/ui/PageTemplate.tid +++ b/core/ui/PageTemplate.tid @@ -15,11 +15,7 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ <$set name="storyviewTitle" value={{$:/view}}> -<$set name="currentTiddler" value={{$:/language}}> - -<$set name="languageTitle" value={{!!name}}> - -<$set name="currentTiddler" value=""> +<$set name="languageTitle" value={{{ [{$:/language}get[name]] }}}>
      >> @@ -50,7 +46,3 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ - - - - From 662ae91067f475d4035b7d6f7174d1a3650cc8a5 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sat, 6 Apr 2019 11:27:37 +0200 Subject: [PATCH 0074/2376] Bugfix: reveal widget regression! (#3897) --- core/modules/widgets/reveal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index 9858ad14c..f5511f4b3 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -197,7 +197,7 @@ RevealWidget.prototype.refresh = function(changedTiddlers) { } else { var currentlyOpen = this.isOpen; this.readState(); - if(this.isOpen !== currentlyOpen || (this.stateTiddlerTitle && changedTiddlers[this.stateTiddlerTitle])) { + if(this.isOpen !== currentlyOpen) { if(this.retain === "yes") { this.updateState(); } else { From aa5eaa98fcb8658dbc2b93476c2e09c9207439d8 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 8 Apr 2019 21:08:58 +0100 Subject: [PATCH 0075/2376] Add a GitHub saver Fixes #3890 I think it would be useful to have a simple tutorial for setting up saving via GitHub pages. --- core/language/en-GB/ControlPanel.multids | 8 ++ core/modules/savers/github.js | 117 +++++++++++++++++ .../utils/base64-utf8/base64-utf8.module.js | 124 ++++++++++++++++++ .../utils/base64-utf8/tiddlywiki.files | 14 ++ core/ui/ControlPanel/Saving/GitHub.tid | 14 ++ .../prerelease/tiddlers/Release 5.1.20.tid | 2 + .../tw5.com/tiddlers/definitions/GitHub.tid | 6 +- .../tiddlers/saving/Saving to GitHub.tid | 24 ++++ 8 files changed, 307 insertions(+), 2 deletions(-) create mode 100644 core/modules/savers/github.js create mode 100644 core/modules/utils/base64-utf8/base64-utf8.module.js create mode 100644 core/modules/utils/base64-utf8/tiddlywiki.files create mode 100644 core/ui/ControlPanel/Saving/GitHub.tid create mode 100644 editions/tw5.com/tiddlers/saving/Saving to GitHub.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 2b2358250..835a5e6d3 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -89,6 +89,14 @@ Saving/DownloadSaver/Hint: These settings apply to the HTML5-compatible download Saving/General/Caption: General Saving/General/Hint: These settings apply to all the loaded savers Saving/Hint: Settings used for saving the entire TiddlyWiki as a single file via a saver module +Saving/GitHub/Branch: Target branch for saving (defaults to `master`) +Saving/GitHub/Caption: ~GitHub Saver +Saving/GitHub/Description: These settings are only used when saving to ~GitHub +Saving/GitHub/Filename: Filename of target file (e.g. `index.html`) +Saving/GitHub/Password: Password, OAUTH token, or personal access token +Saving/GitHub/Path: Path to target file (e.g. `/wiki/`) +Saving/GitHub/Repo: Target repository (e.g. `Jermolene/TiddlyWiki5`) +Saving/GitHub/UserName: Username Saving/TiddlySpot/Advanced/Heading: Advanced Settings Saving/TiddlySpot/BackupDir: Backup Directory Saving/TiddlySpot/Backups: Backups diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js new file mode 100644 index 000000000..642ffd75d --- /dev/null +++ b/core/modules/savers/github.js @@ -0,0 +1,117 @@ +/*\ +title: $:/core/modules/savers/github.js +type: application/javascript +module-type: saver + +Saves wiki by pushing a commit to the GitHub v3 REST API + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var base64utf8 = require("$:/core/modules/utils/base64-utf8/base64-utf8.module.js"); + +/* +Select the appropriate saver module and set it up +*/ +var GitHubSaver = function(wiki) { + this.wiki = wiki; +}; + +GitHubSaver.prototype.save = function(text,method,callback) { + var self = this, + username = this.wiki.getTiddlerText("$:/GitHub/Username"), + password = $tw.utils.getPassword("github"), + repo = this.wiki.getTiddlerText("$:/GitHub/Repo"), + path = this.wiki.getTiddlerText("$:/GitHub/Path"), + filename = this.wiki.getTiddlerText("$:/GitHub/Filename"), + branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "master", + headers = { + "Accept": "application/vnd.github.v3+json", + "Content-Type": "application/json;charset=UTF-8", + "Authorization": "Basic " + window.btoa(username + ":" + password) + }; + // Make sure the path start and ends with a slash + if(path.substring(0,1) !== "/") { + path = "/" + path; + } + if(path.substring(path.length - 1) !== "/") { + path = path + "/"; + } + // Compose the base URI + var uri = "https://api.github.com/repos/" + repo + "/contents" + path; + // Bail if we don't have everything we need + if(!username || !password || !repo || !path || !filename) { + return false; + } + // Perform a get request to get the details (inc shas) of files in the same path as our file + $tw.utils.httpRequest({ + url: uri, + type: "GET", + headers: headers, + data: { + ref: branch + }, + callback: function(err,getResponseDataJson,xhr) { + if(err) { + return callback(err); + } + var getResponseData = JSON.parse(getResponseDataJson), + sha = ""; + $tw.utils.each(getResponseData,function(details) { + if(details.name === filename) { + sha = details.sha; + } + }); + var data = { + message: "Saved by TiddlyWiki", + content: base64utf8.base64.encode.call(base64utf8,text), + branch: branch, + sha: sha + }; + // Perform a PUT request to save the file + $tw.utils.httpRequest({ + url: uri + filename, + type: "PUT", + headers: headers, + data: JSON.stringify(data), + callback: function(err,putResponseDataJson,xhr) { + if(err) { + return callback(err); + } + var putResponseData = JSON.parse(putResponseDataJson); + callback(null); + } + }); + } + }); + return true; +}; + +/* +Information about this saver +*/ +GitHubSaver.prototype.info = { + name: "github", + priority: 2000, + capabilities: ["save", "autosave"] +}; + +/* +Static method that returns true if this saver is capable of working +*/ +exports.canSave = function(wiki) { + return true; +}; + +/* +Create an instance of this saver +*/ +exports.create = function(wiki) { + return new GitHubSaver(wiki); +}; + +})(); diff --git a/core/modules/utils/base64-utf8/base64-utf8.module.js b/core/modules/utils/base64-utf8/base64-utf8.module.js new file mode 100644 index 000000000..58bbc8fc0 --- /dev/null +++ b/core/modules/utils/base64-utf8/base64-utf8.module.js @@ -0,0 +1,124 @@ +// From https://gist.github.com/Nijikokun/5192472 +// +// UTF8 Module +// +// Cleaner and modularized utf-8 encoding and decoding library for javascript. +// +// copyright: MIT +// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com +(function (name, definition, context, dependencies) { + if (typeof context['module'] !== 'undefined' && context['module']['exports']) { if (dependencies && context['require']) { for (var i = 0; i < dependencies.length; i++) context[dependencies[i]] = context['require'](dependencies[i]); } context['module']['exports'] = definition.apply(context); } + else if (typeof context['define'] !== 'undefined' && context['define'] === 'function' && context['define']['amd']) { define(name, (dependencies || []), definition); } + else { context[name] = definition.apply(context); } +})('utf8', function () { + return { + encode: function (string) { + if (typeof string !== 'string') return string; + else string = string.replace(/\r\n/g, "\n"); + var output = "", i = 0, charCode; + + for (i; i < string.length; i++) { + charCode = string.charCodeAt(i); + + if (charCode < 128) + output += String.fromCharCode(charCode); + else if ((charCode > 127) && (charCode < 2048)) + output += String.fromCharCode((charCode >> 6) | 192), + output += String.fromCharCode((charCode & 63) | 128); + else + output += String.fromCharCode((charCode >> 12) | 224), + output += String.fromCharCode(((charCode >> 6) & 63) | 128), + output += String.fromCharCode((charCode & 63) | 128); + } + + return output; + }, + + decode: function (string) { + if (typeof string !== 'string') return string; + var output = "", i = 0, charCode = 0; + + while (i < string.length) { + charCode = string.charCodeAt(i); + + if (charCode < 128) + output += String.fromCharCode(charCode), + i++; + else if ((charCode > 191) && (charCode < 224)) + output += String.fromCharCode(((charCode & 31) << 6) | (string.charCodeAt(i + 1) & 63)), + i += 2; + else + output += String.fromCharCode(((charCode & 15) << 12) | ((string.charCodeAt(i + 1) & 63) << 6) | (string.charCodeAt(i + 2) & 63)), + i += 3; + } + + return output; + } + }; +}, this); + +// Base64 Module +// +// Cleaner, modularized and properly scoped base64 encoding and decoding module for strings. +// +// copyright: MIT +// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com +(function (name, definition, context, dependencies) { + if (typeof context['module'] !== 'undefined' && context['module']['exports']) { if (dependencies && context['require']) { for (var i = 0; i < dependencies.length; i++) context[dependencies[i]] = context['require'](dependencies[i]); } context['module']['exports'] = definition.apply(context); } + else if (typeof context['define'] !== 'undefined' && context['define'] === 'function' && context['define']['amd']) { define(name, (dependencies || []), definition); } + else { context[name] = definition.apply(context); } +})('base64', function (utf8) { + var $this = this; + var $utf8 = utf8 || this.utf8; + var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + + return { + encode: function (input) { + if (typeof $utf8 === 'undefined') throw { error: "MissingMethod", message: "UTF8 Module is missing." }; + if (typeof input !== 'string') return input; + else input = $utf8.encode(input); + var output = "", a, b, c, d, e, f, g, i = 0; + + while (i < input.length) { + a = input.charCodeAt(i++); + b = input.charCodeAt(i++); + c = input.charCodeAt(i++); + d = a >> 2; + e = ((a & 3) << 4) | (b >> 4); + f = ((b & 15) << 2) | (c >> 6); + g = c & 63; + + if (isNaN(b)) f = g = 64; + else if (isNaN(c)) g = 64; + + output += map.charAt(d) + map.charAt(e) + map.charAt(f) + map.charAt(g); + } + + return output; + }, + + decode: function (input) { + if (typeof $utf8 === 'undefined') throw { error: "MissingMethod", message: "UTF8 Module is missing." }; + if (typeof input !== 'string') return input; + else input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + var output = "", a, b, c, d, e, f, g, i = 0; + + while (i < input.length) { + d = map.indexOf(input.charAt(i++)); + e = map.indexOf(input.charAt(i++)); + f = map.indexOf(input.charAt(i++)); + g = map.indexOf(input.charAt(i++)); + + a = (d << 2) | (e >> 4); + b = ((e & 15) << 4) | (f >> 2); + c = ((f & 3) << 6) | g; + + output += String.fromCharCode(a); + if (f != 64) output += String.fromCharCode(b); + if (g != 64) output += String.fromCharCode(c); + } + + return $utf8.decode(output); + } + } +}, this, [ "utf8" ]); \ No newline at end of file diff --git a/core/modules/utils/base64-utf8/tiddlywiki.files b/core/modules/utils/base64-utf8/tiddlywiki.files new file mode 100644 index 000000000..b63b5e543 --- /dev/null +++ b/core/modules/utils/base64-utf8/tiddlywiki.files @@ -0,0 +1,14 @@ +{ + "tiddlers": [ + { + "file": "base64-utf8.module.js", + "fields": { + "type": "application/javascript", + "title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js", + "module-type": "library" + }, + "prefix": "(function(){", + "suffix": "}).call(exports);" + } + ] +} diff --git a/core/ui/ControlPanel/Saving/GitHub.tid b/core/ui/ControlPanel/Saving/GitHub.tid new file mode 100644 index 000000000..11a6f48f1 --- /dev/null +++ b/core/ui/ControlPanel/Saving/GitHub.tid @@ -0,0 +1,14 @@ +title: $:/core/ui/ControlPanel/Saving/GitHub +tags: $:/tags/ControlPanel/Saving +caption: {{$:/language/ControlPanel/Saving/GitHub/Caption}} + +\define lingo-base() $:/language/ControlPanel/Saving/GitHub/ + +<> + +|<> |<$edit-text tiddler="$:/GitHub/Username" default="" tag="input"/> | +|<> |<$password name="github"/> | +|<> |<$edit-text tiddler="$:/GitHub/Repo" default="" tag="input"/> | +|<> |<$edit-text tiddler="$:/GitHub/Branch" default="" tag="input"/> | +|<> |<$edit-text tiddler="$:/GitHub/Path" default="" tag="input"/> | +|<> |<$edit-text tiddler="$:/GitHub/Filename" default="" tag="input"/> | diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index b2b203645..b98b62f47 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -15,6 +15,8 @@ Added serveral new string operators: [[length|length Operator]], [[uppercase|upp Added several new palettes. See the [[palette manager|$:/core/ui/ControlPanel/Palette]]. +Added new [[GitHub saver|Saving to GitHub]]. + !! Plugin Improvements New and improved plugins: diff --git a/editions/tw5.com/tiddlers/definitions/GitHub.tid b/editions/tw5.com/tiddlers/definitions/GitHub.tid index ccd873566..28a097a73 100644 --- a/editions/tw5.com/tiddlers/definitions/GitHub.tid +++ b/editions/tw5.com/tiddlers/definitions/GitHub.tid @@ -1,5 +1,5 @@ created: 20140910212609354 -modified: 20140910212725412 +modified: 20190408173002622 tags: Definitions title: GitHub type: text/vnd.tiddlywiki @@ -8,4 +8,6 @@ GitHub is a hosting service for distributed projects that use git as their versi The code and documentation of TiddlyWiki is hosted on GitHub at: -https://github.com/Jermolene/TiddlyWiki5 \ No newline at end of file +https://github.com/Jermolene/TiddlyWiki5 + +GitHub also offer a free web hosting service called [[GitHub Pages|https://pages.github.com/]] that can be used directly from the single file configuration. See [[Saving to GitHub]]. diff --git a/editions/tw5.com/tiddlers/saving/Saving to GitHub.tid b/editions/tw5.com/tiddlers/saving/Saving to GitHub.tid new file mode 100644 index 000000000..a3962e52e --- /dev/null +++ b/editions/tw5.com/tiddlers/saving/Saving to GitHub.tid @@ -0,0 +1,24 @@ +created: 20190408173002622 +modified: 20190408173002622 +tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera Safari Windows +title: Saving to GitHub +type: text/vnd.tiddlywiki +delivery: Service +method: save +caption: GitHub Saver +description: Save changes directly to a GitHub repository + +TiddlyWiki can save changes directly to a GitHub repository in the single file configuration. + +Saving to GitHub is configured in the [[$:/ControlPanel]] in the ''~GitHub Saver'' tab under the ''Saving'' tab. The following settings are supported: + +* ''Username'' - (mandatory) the username for the GitHub account used for saving changes +* ''Password'' - (mandatory) the password, OAUTH token or personal access token for the specified account. Note that GitHub permits [[several different mechanisms|https://developer.github.com/v3/#authentication]] for authentication +* ''Repository'' - (mandatory) the name of the GitHub repository. Both the owner name and the repository name must be specified. For example `Jermolene/TiddlyWiki5` +* ''Branch'' - (optional) the name of the branch to be used within the GitHub repository. Defaults to `master` +* ''Path'' - (optional) the path to the target file. Defaults to `/` +* ''Filename'' - (mandatory) the filename of the target file + +Notes + +* The GitHub password is stored persistently in browser local storage. Be sure to clear the password if using a shared machine. Using a [[personal access token|]] for authentication offers an extra layer of security: if the access token is accidentally exposed it can be revoked without needing to reset the account password From 73703da2e7a8762cfd9cfe881e989f34f85519bc Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 8 Apr 2019 21:37:32 +0100 Subject: [PATCH 0076/2376] Minify base64-utif8 module Minified with https://skalman.github.io/UglifyJS-online/ --- core/modules/utils/base64-utf8/base64-utf8.module.min.js | 9 +++++++++ core/modules/utils/base64-utf8/tiddlywiki.files | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 core/modules/utils/base64-utf8/base64-utf8.module.min.js diff --git a/core/modules/utils/base64-utf8/base64-utf8.module.min.js b/core/modules/utils/base64-utf8/base64-utf8.module.min.js new file mode 100644 index 000000000..47f0e50c3 --- /dev/null +++ b/core/modules/utils/base64-utf8/base64-utf8.module.min.js @@ -0,0 +1,9 @@ +// From https://gist.github.com/Nijikokun/5192472 +// +// UTF8 Module +// +// Cleaner and modularized utf-8 encoding and decoding library for javascript. +// +// copyright: MIT +// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com +!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&"function"===o.define&&o.define.amd?define("utf8",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if("string"!=typeof r)return r;r=r.replace(/\r\n/g,"\n");for(var e,o="",t=0;t127&&e<2048?(o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128)):(o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128));return o},decode:function(r){if("string"!=typeof r)return r;for(var e="",o=0,t=0;o191&&t<224?(e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2):(e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3);return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var n=0;n>2,f=(3&t)<<4|(n=r.charCodeAt(u++))>>4,a=(15&n)<<2|(i=r.charCodeAt(u++))>>6,h=63&i,isNaN(n)?a=h=64:isNaN(i)&&(h=64),c+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return c},decode:function(r){if(void 0===e)throw{error:"MissingMethod",message:"UTF8 Module is missing."};if("string"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var t,n,i,d,f,a,h="",c=0;c>4,n=(15&d)<<4|(f=o.indexOf(r.charAt(c++)))>>2,i=(3&f)<<6|(a=o.indexOf(r.charAt(c++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(n)),64!=a&&(h+=String.fromCharCode(i));return e.decode(h)}}},this,["utf8"]); \ No newline at end of file diff --git a/core/modules/utils/base64-utf8/tiddlywiki.files b/core/modules/utils/base64-utf8/tiddlywiki.files index b63b5e543..b12e7dfb9 100644 --- a/core/modules/utils/base64-utf8/tiddlywiki.files +++ b/core/modules/utils/base64-utf8/tiddlywiki.files @@ -1,7 +1,7 @@ { "tiddlers": [ { - "file": "base64-utf8.module.js", + "file": "base64-utf8.module.min.js", "fields": { "type": "application/javascript", "title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js", From 61d87875ff9d80c3a5fd00c8367666399542b2ac Mon Sep 17 00:00:00 2001 From: Bram Chen Date: Tue, 9 Apr 2019 15:13:14 +0800 Subject: [PATCH 0077/2376] Add chinese translations for configuration of GitHub saver (#3899) --- languages/zh-Hans/ControlPanel.multids | 8 ++++++++ languages/zh-Hant/ControlPanel.multids | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index fbfd88514..0de6686a9 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -90,6 +90,14 @@ Saving/DownloadSaver/Hint: 这些设置适用于兼容 HTML5 的下载保存模 Saving/General/Caption: 通用 Saving/General/Hint: 这些设置适用于所有已载入的保存模块 Saving/Hint: 用于通过保存模块将整个 TiddlyWiki 保存为单个文件的设置 +Saving/GitHub/Branch: 用于保存的目标分支 (预设值为 `master`) +Saving/GitHub/Caption: ~GitHub 保存模组 +Saving/GitHub/Description: 这些设定仅用于保存到 ~GitHub +Saving/GitHub/Filename: 目标文件的文件名称 (例如,`index.html`) +Saving/GitHub/Password: 密码、OAUTH 令牌,或个人存取的令牌 +Saving/GitHub/Path: 目标文件的路径 (例如,`/wiki/`) +Saving/GitHub/Repo: 目标存储库 (例如,`Jermolene/TiddlyWiki5`) +Saving/GitHub/UserName: 用户名称 Saving/TiddlySpot/Advanced/Heading: 高级设置 Saving/TiddlySpot/BackupDir: 备份文件夹 Saving/TiddlySpot/Backups: 备份 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 61e357cb4..e70eaae26 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -89,7 +89,15 @@ Saving/DownloadSaver/Caption: 下載儲存模組 Saving/DownloadSaver/Hint: 這些設定適用於相容 HTML5 的下載儲存模組 Saving/General/Caption: 通用 Saving/General/Hint: 這些設定適用於所有已載入的儲存模組 -Saving/Hint: 用於通過儲存模組將整個 TiddlyWiki 保存為單個檔案的設定 +Saving/Hint: 用於通過儲存模組將整個 TiddlyWiki 儲存為單個檔案的設定 +Saving/GitHub/Branch: 用於儲存的目標分支 (預設值為 `master`) +Saving/GitHub/Caption: ~GitHub 儲存模組 +Saving/GitHub/Description: 這些設定僅用於儲存到 ~GitHub +Saving/GitHub/Filename: 目標檔案的檔案名稱 (例如,`index.html`) +Saving/GitHub/Password: 密碼、OAUTH 令牌,或個人存取的令牌 +Saving/GitHub/Path: 目標檔案的路徑 (例如,`/wiki/`) +Saving/GitHub/Repo: 目標存儲庫 (例如,`Jermolene/TiddlyWiki5`) +Saving/GitHub/UserName: 使用者名稱 Saving/TiddlySpot/Advanced/Heading: 進階設定 Saving/TiddlySpot/BackupDir: 備份資料夾 Saving/TiddlySpot/Backups: 備份 From 4ecc99c9d5225e4a2045f32c1dbdd7792b5cb87e Mon Sep 17 00:00:00 2001 From: 00SS <38947777+00SS@users.noreply.github.com> Date: Wed, 10 Apr 2019 17:17:07 +0700 Subject: [PATCH 0078/2376] DOCS: Correction: How to change the sort order of sub-branches in a TOC macro.tid (#3783) Changed line `<>` to `<>` Tested that this is the correct code. --- ...change the sort order of sub-branches in a TOC macro.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/How to change the sort order of sub-branches in a TOC macro.tid b/editions/tw5.com/tiddlers/howtos/How to change the sort order of sub-branches in a TOC macro.tid index 76dbfcbf6..86ee4280d 100644 --- a/editions/tw5.com/tiddlers/howtos/How to change the sort order of sub-branches in a TOC macro.tid +++ b/editions/tw5.com/tiddlers/howtos/How to change the sort order of sub-branches in a TOC macro.tid @@ -1,5 +1,5 @@ created: 20161209172820513 -modified: 20161209174234840 +modified: 20190220000000000 tags: Learning title: How to change the sort order of sub-branches in a TOC macro type: text/vnd.tiddlywiki @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki Imagine that you are using a [[Table of Contents|Table-of-Contents Macros]] macro similar to this: ``` -<> +<> ``` The sorting is fine for most cases, but you would like all your items tagged `Journal` to be sorted by the `created` field. How can you apply a separate sort order to just those sub-items tagged `Journal`? @@ -17,7 +17,7 @@ The trick is to add a field to the parent tagging tiddler (i.e. `Journal`) that Now change your [[Table of Contents|Table-of-Contents Macros]] to look like this: ``` -<> +<> ``` Now your Table of Contents will sort by title everywhere, except for the children of the `Journal` tiddler, which will sort by the `created `date. From 53124e1d8276da541ff101ed33b846d88e4b6576 Mon Sep 17 00:00:00 2001 From: 00SS <38947777+00SS@users.noreply.github.com> Date: Wed, 10 Apr 2019 17:17:54 +0700 Subject: [PATCH 0079/2376] DOCS: Update: TiddlyWiki5 Squared by Iannis Zannos.tid (#3773) * Update TiddlyWiki5 Squared by Iannis Zannos.tid Link no longer works. Changed it to the github page. * Update TiddlyWiki5 Squared by Iannis Zannos.tid Fixed URL linking to the "ur" field --- .../resources/TiddlyWiki5 Squared by Iannis Zannos.tid | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid index b3a3e880b..4e9457218 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid @@ -1,14 +1,12 @@ created: 20141009170239174 -modified: 20141009170711343 +modified: 20190217000000000 tags: Resources title: "TiddlyWiki5^2 documenting while learning TiddlyWiki5" by Iannis Zannos type: text/vnd.tiddlywiki -url: http://larigot.avarts.ionio.gr/users/iani/wikis/tw5square.html +url: https://web.archive.org/web/20170728212414/http://larigot.avarts.ionio.gr/users/iani/wikis/tw5square.html A wealth of hints, tips and notes about using [[TiddlyWiki on Node.js]]: -{{!!url}} - <<< TiddlyWiki is different from other wikis because of its principle of dynamically customizeable "storyline" based on tiddlers as basic units of information. That is, the user "composes" their own version of the webpage by clicking on tiddler links, which add tiddlers to the page in order to compose a storyline. @@ -16,3 +14,7 @@ The Node.js implementation in TiddlyWiki5 adds all the advantages of flat-file m Also very cool is the treatment of tags as menus everywhere. <<< + +<$text text="http://larigot.avarts.ionio.gr/users/iani/wikis/tw5square.html"/> + +Also available on [[GitHub|https://github.com/iani/tw5square]] (download and save index.html and open it in your browser). From 12b08b7abfe79abf0a78b1d21d875256925a088a Mon Sep 17 00:00:00 2001 From: 00SS <38947777+00SS@users.noreply.github.com> Date: Wed, 10 Apr 2019 17:22:12 +0700 Subject: [PATCH 0080/2376] Docs: Update ListMacro.tid (#3754) Addressing 2 issues. 1) If the caption field of a tiddler is empty 2) A note addressing no input titles resulting in a Filter Run as brought up on [Google Groups](https://groups.google.com/forum/?hl=en#!topic/tiddlywikidev/VNl_cwu_rIE) --- editions/tw5.com/tiddlers/macros/ListMacro.tid | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/macros/ListMacro.tid b/editions/tw5.com/tiddlers/macros/ListMacro.tid index 5ab99f8f3..7ee39ee12 100644 --- a/editions/tw5.com/tiddlers/macros/ListMacro.tid +++ b/editions/tw5.com/tiddlers/macros/ListMacro.tid @@ -1,13 +1,15 @@ caption: list-links created: 20140917083515996 -modified: 20180109171310659 +modified: 20190206000000000 tags: Macros [[Core Macros]] title: list-links Macro type: text/vnd.tiddlywiki The <<.def list-links>> [[macro|Macros]] returns a formatted list of links to a [[selection of tiddlers|Title Selection]]. -If a tiddler has a <<.field caption>> field, this is shown instead of the tiddler's title. +If a tiddler has a <<.field caption>> field, this is shown instead of the tiddler's title. If the caption field is empty, a blank entry is shown. + +Note: Each first [[step|Filter Step]] of a [[filter run|Filter Run]] not given any input titles receives the output of <$link to="all Operator">[all[tiddlers]] as its input. This means all the existing non-[[shadow|ShadowTiddlers]] tiddlers. !! Parameters From 9b72eabd1ae6260f7e07e35c3072b65149cb919c Mon Sep 17 00:00:00 2001 From: Bimba Laszlo Date: Thu, 11 Apr 2019 09:21:55 +0200 Subject: [PATCH 0081/2376] Fix crash in GitHub saver (#3905) If the path was not specified, RSOD error occurred when we wanted to download the wiki: Uncaught TypeError: Cannot read property 'substring' of undefined --- core/modules/savers/github.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index 642ffd75d..cad1b99f1 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -34,6 +34,10 @@ GitHubSaver.prototype.save = function(text,method,callback) { "Content-Type": "application/json;charset=UTF-8", "Authorization": "Basic " + window.btoa(username + ":" + password) }; + // Bail if we don't have everything we need + if(!username || !password || !repo || !path || !filename) { + return false; + } // Make sure the path start and ends with a slash if(path.substring(0,1) !== "/") { path = "/" + path; @@ -43,10 +47,6 @@ GitHubSaver.prototype.save = function(text,method,callback) { } // Compose the base URI var uri = "https://api.github.com/repos/" + repo + "/contents" + path; - // Bail if we don't have everything we need - if(!username || !password || !repo || !path || !filename) { - return false; - } // Perform a get request to get the details (inc shas) of files in the same path as our file $tw.utils.httpRequest({ url: uri, From 61db047870c630d93f0817b48e31da4384d0c4e9 Mon Sep 17 00:00:00 2001 From: 00SS <38947777+00SS@users.noreply.github.com> Date: Fri, 12 Apr 2019 17:44:58 +0700 Subject: [PATCH 0082/2376] Docs: Update Headings in WikiText.tid (#3908) Changed the example to use the **wikitext-example** macro and pointed out that wikitext only works till `
      ` --- .../tw5.com/tiddlers/wikitext/Headings in WikiText.tid | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/editions/tw5.com/tiddlers/wikitext/Headings in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Headings in WikiText.tid index ac3f155d6..e23278db4 100644 --- a/editions/tw5.com/tiddlers/wikitext/Headings in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Headings in WikiText.tid @@ -1,11 +1,11 @@ created: 20131205161234909 -modified: 20131205161256525 +modified: 20190412000000000 tags: WikiText title: Headings in WikiText type: text/vnd.tiddlywiki caption: Headings -Headings are specified with one or more leading `!` characters: +Headings are specified with one up to six leading `!` characters: ``` ! This is a level 1 heading @@ -17,6 +17,4 @@ Headings are specified with one or more leading `!` characters: CSS classes can be assigned to individual headings like this: -``` -!.myStyle This heading has the class `myStyle` -``` +<> From 8c72a28f0c70e6a62387ccdd1431f9225a5fd2de Mon Sep 17 00:00:00 2001 From: Jermolene Date: Fri, 12 Apr 2019 18:09:16 +0100 Subject: [PATCH 0083/2376] Add ability to load plugins via the command line Fixes #3907 --- boot/boot.js | 18 +++++++++++++++++- .../nodejs/Using TiddlyWiki on Node.js.tid | 15 ++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 23cf25b23..f4add931b 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1855,8 +1855,10 @@ $tw.loadPlugin = function(name,paths) { var pluginFields = $tw.loadPluginFolder(pluginPath); if(pluginFields) { $tw.wiki.addTiddler(pluginFields); + return; } } + console.log("Warning: Cannot find plugin '" + name + "'"); }; /* @@ -1870,7 +1872,7 @@ $tw.getLibraryItemSearchPaths = function(libraryPath,envVar) { if(env) { env.split(path.delimiter).map(function(item) { if(item) { - pluginPaths.push(item) + pluginPaths.push(item); } }); } @@ -2006,6 +2008,14 @@ $tw.loadTiddlersNode = function() { }); // Load the core tiddlers $tw.wiki.addTiddler($tw.loadPluginFolder($tw.boot.corePath)); + // Load any extra plugins + $tw.utils.each($tw.boot.extraPlugins,function(name) { + var parts = name.split("/"), + type = parts[0]; + if(parts.length === 3 && ["plugins","themes","languages"].indexOf(type) !== -1) { + $tw.loadPlugins([parts[1] + "/" + parts[2]],$tw.config[type + "Path"],$tw.config[type + "EnvVar"]); + } + }); // Load the tiddlers from the wiki directory if($tw.boot.wikiPath) { $tw.boot.wikiInfo = $tw.loadWikiTiddlers($tw.boot.wikiPath); @@ -2069,6 +2079,12 @@ $tw.boot.startup = function(options) { if($tw.boot.argv.length === 0) { $tw.boot.argv = ["--help"]; } + // Parse any extra plugin references + $tw.boot.extraPlugins = $tw.boot.extraPlugins || []; + while($tw.boot.argv[0] && $tw.boot.argv[0].indexOf("+") === 0) { + $tw.boot.extraPlugins.push($tw.boot.argv[0].substring(1)); + $tw.boot.argv.splice(0,1); + } // If the first command line argument doesn't start with `--` then we // interpret it as the path to the wiki folder, which will otherwise default // to the current folder diff --git a/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid index 17e7e0841..e76bb68e5 100644 --- a/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid @@ -1,5 +1,5 @@ created: 20131219100520659 -modified: 20180626122347768 +modified: 20190412170813209 tags: [[TiddlyWiki on Node.js]] title: Using TiddlyWiki on Node.js type: text/vnd.tiddlywiki @@ -14,12 +14,21 @@ tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html Running `tiddlywiki` from the command line boots the TiddlyWiki kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces. -The first argument is the optional path to the [[TiddlyWikiFolder|TiddlyWikiFolders]] to be loaded. If not present, then the current directory is used. +<<.from-version "5.1.20">> First, there can be zero or more plugin references identified by the prefix `+`. These plugins are loaded in addition to any specified in the [[TiddlyWikiFolder|TiddlyWikiFolders]]. + +The next argument is the optional path to the [[TiddlyWikiFolder|TiddlyWikiFolders]] to be loaded. If not present, then the current directory is used. The commands and their individual arguments follow, each command being identified by the prefix `--`. ``` -tiddlywiki [] [-- [[,]]] +tiddlywiki [+] [] [-- [[,]]] +``` + +For example: + +``` +tiddlywiki --version +tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen ``` <<.from-version "5.1.18">> Commands such as the ListenCommand that support large numbers of parameters can use NamedCommandParameters to make things less unwieldy. For example: From edd3156430dd94b0ced630a1b70f2e2ef0ff6c36 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sat, 13 Apr 2019 14:47:27 +0100 Subject: [PATCH 0084/2376] Improve loading/importing of JSON files First part of fix for #3875 The idea is to do a better of job of distinguishing JSON files that contain tiddlers versus those that contain plain blobs of JSON that should be stored as a single application/json tiddler. Under Node.js, .json files with an accompanying metafile are always treated as a JSON blob. Without a meta file, those that appear to not contain valid tiddlers are returned as a JSON blob, otherwise the tiddlers within the file are imported. In the browser, we don't have .meta files so we rely on the valid tiddler check. --- boot/boot.js | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index f4add931b..fada4014d 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1469,8 +1469,40 @@ $tw.modules.define("$:/boot/tiddlerdeserializer/html","tiddlerdeserializer",{ }); $tw.modules.define("$:/boot/tiddlerdeserializer/json","tiddlerdeserializer",{ "application/json": function(text,fields) { - var data = JSON.parse(text); - return $tw.utils.isArray(data) ? data : [data]; + var isTiddlerValid = function(data) { + // Not valid if it's not an object with a title property + if(typeof(data) !== "object" || !$tw.utils.hop(data,"title")) { + return false; + } + for(var f in data) { + if($tw.utils.hop(data,f)) { + // Check field name doesn't contain whitespace or control characters + if(typeof(data[f]) !== "string" || /[\x00-\x1F\s]/.test(f)) { + return false; + } + } + } + return true; + }, + isTiddlerArrayValid = function(data) { + for(var t=0; t Date: Sat, 13 Apr 2019 14:59:44 +0100 Subject: [PATCH 0085/2376] Filesystemadaptor: Improve handling of JSON files Fixes #3875 * Use .json files (instead of .tid) for any tiddler whose fields contain values that can't be stored as a .tid file * Save application/json tiddlers as .json files * Refactor most of the file handling as re-usable utilities --- core/modules/utils/filesystem.js | 139 ++++++++++++++++++ .../filesystem/filesystemadaptor.js | 128 ++-------------- 2 files changed, 148 insertions(+), 119 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 57e916108..8d07a9c45 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -181,4 +181,143 @@ exports.deleteEmptyDirs = function(dirpath,callback) { }); }; +/* +Create a fileInfo object for saving a tiddler: + filepath: the absolute path to the file containing the tiddler + type: the type of the tiddler file (NOT the type of the tiddler) + hasMetaFile: true if the file also has a companion .meta file +Options include: + directory: absolute path of root directory to which we are saving + pathFilters: optional array of filters to be used to generate the base path + wiki: optional wiki for evaluating the pathFilters +*/ +exports.generateTiddlerFileInfo = function(tiddler,options) { + var fileInfo = {}; + // Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace + var hasUnsafeFields = false; + $tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) { + if(fieldName !== "text") { + hasUnsafeFields = hasUnsafeFields || /[\x00-\x1F]/mg.test(value); + hasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value); + } + }); + // Check for field values + if(hasUnsafeFields) { + // Save as a JSON file + fileInfo.type = "application/json"; + fileInfo.hasMetaFile = false; + } else { + // Save as a .tid or a text/binary file plus a .meta file + var tiddlerType = tiddler.fields.type || "text/vnd.tiddlywiki"; + if(tiddlerType === "text/vnd.tiddlywiki") { + // Save as a .tid file + fileInfo.type = "application/x-tiddler"; + fileInfo.hasMetaFile = false; + } else { + // Save as a text/binary file and a .meta file + fileInfo.type = tiddlerType; + fileInfo.hasMetaFile = true; + } + } + // Take the file extension from the tiddler content type + var contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: ""}; + // Generate the filepath + fileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler,{ + extension: contentTypeInfo.extension, + directory: options.directory, + pathFilters: options.pathFilters + }); + return fileInfo; +}; + +/* +Generate the filepath for saving a tiddler +Options include: + extension: file extension to be added the finished filepath + directory: absolute path of root directory to which we are saving + pathFilters: optional array of filters to be used to generate the base path + wiki: optional wiki for evaluating the pathFilters +*/ +exports.generateTiddlerFilepath = function(tiddler,options) { + var self = this, + directory = options.directory || "", + extension = options.extension || "", + filepath; + // Check if any of the pathFilters applies + if(options.pathFilters && options.wiki) { + $tw.utils.each(options.pathFilters,function(filter) { + if(!filepath) { + var source = options.wiki.makeTiddlerIterator([tiddler.fields.title]), + result = options.wiki.filterTiddlers(filter,null,source); + if(result.length > 0) { + filepath = result[0]; + } + } + }); + } + // If not, generate a base pathname + if(!filepath) { + filepath = tiddler.fields.title; + // If the filepath already ends in the extension then remove it + if(filepath.substring(filepath.length - extension.length) === extension) { + filepath = filepath.substring(0,filepath.length - extension.length); + } + // Remove any forward or backward slashes so we don't create directories + filepath = filepath.replace(/\/|\\/g,"_"); + } + // Remove any characters that can't be used in cross-platform filenames + filepath = $tw.utils.transliterate(filepath.replace(/<|>|\:|\"|\||\?|\*|\^/g,"_")); + // Truncate the filename if it is too long + if(filepath.length > 200) { + filepath = filepath.substr(0,200); + } + // If the resulting filename is blank (eg because the title is just punctuation characters) + if(!filepath) { + // ...then just use the character codes of the title + filepath = ""; + $tw.utils.each(tiddler.fields.title.split(""),function(char) { + if(filepath) { + filepath += "-"; + } + filepath += char.charCodeAt(0).toString(); + }); + } + // Add a uniquifier if the file already exists + var fullPath, + count = 0; + do { + fullPath = path.resolve(directory,filepath + (count ? "_" + count : "") + extension); + count++; + } while(fs.existsSync(fullPath)); + // Return the full path to the file + return fullPath; +}; + +/* +Save a tiddler to a file described by the fileInfo: + filepath: the absolute path to the file containing the tiddler + type: the type of the tiddler file (NOT the type of the tiddler) + hasMetaFile: true if the file also has a companion .meta file +*/ +exports.saveTiddlerToFile = function(tiddler,fileInfo,callback) { + $tw.utils.createDirectory(path.dirname(fileInfo.filepath)); + if(fileInfo.hasMetaFile) { + // Save the tiddler as a separate body and meta file + var typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/plain"] || {encoding: "utf8"}; + fs.writeFile(fileInfo.filepath,tiddler.fields.text,{encoding: typeInfo.encoding},function(err) { + if(err) { + return callback(err); + } + fs.writeFile(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text"]}),{encoding: "utf8"},callback); + }); + } else { + // Save the tiddler as a self contained templated file + if(fileInfo.type === "application/x-tiddler") { + fs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),{encoding: "utf8"},callback); + } else { + fs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings()],null,$tw.config.preferences.jsonSpaces),{encoding: "utf8"},callback); + } + } +}; + })(); diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index c824bd0fb..1b4ddf18f 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -47,98 +47,20 @@ It is the responsibility of the filesystem adaptor to update $tw.boot.files for */ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { // See if we've already got information about this file - var self = this, - title = tiddler.fields.title, + var title = tiddler.fields.title, fileInfo = $tw.boot.files[title]; - if(fileInfo) { - // If so, just invoke the callback - callback(null,fileInfo); - } else { + if(!fileInfo) { // Otherwise, we'll need to generate it - fileInfo = {}; - var tiddlerType = tiddler.fields.type || "text/vnd.tiddlywiki"; - // Get the content type info - var contentTypeInfo = $tw.config.contentTypeInfo[tiddlerType] || {}; - // Get the file type by looking up the extension - var extension = contentTypeInfo.extension || ".tid"; - fileInfo.type = ($tw.config.fileExtensionInfo[extension] || {type: "application/x-tiddler"}).type; - // Use a .meta file unless we're saving a .tid file. - // (We would need more complex logic if we supported other template rendered tiddlers besides .tid) - fileInfo.hasMetaFile = (fileInfo.type !== "application/x-tiddler") && (fileInfo.type !== "application/json"); - if(!fileInfo.hasMetaFile) { - extension = ".tid"; - } - // Generate the base filepath and ensure the directories exist - var baseFilepath = path.resolve($tw.boot.wikiTiddlersPath,this.generateTiddlerBaseFilepath(title)); - $tw.utils.createFileDirectories(baseFilepath); - // Start by getting a list of the existing files in the directory - fs.readdir(path.dirname(baseFilepath),function(err,files) { - if(err) { - return callback(err); - } - // Start with the base filename plus the extension - var filepath = baseFilepath; - if(filepath.substr(-extension.length).toLocaleLowerCase() !== extension.toLocaleLowerCase()) { - filepath = filepath + extension; - } - var filename = path.basename(filepath), - count = 1; - // Add a discriminator if we're clashing with an existing filename while - // handling case-insensitive filesystems (NTFS, FAT/FAT32, etc.) - while(files.some(function(value) {return value.toLocaleLowerCase() === filename.toLocaleLowerCase();})) { - filepath = baseFilepath + " " + (count++) + extension; - filename = path.basename(filepath); - } - // Set the final fileInfo - fileInfo.filepath = filepath; -console.log("\x1b[1;35m" + "For " + title + ", type is " + fileInfo.type + " hasMetaFile is " + fileInfo.hasMetaFile + " filepath is " + fileInfo.filepath + "\x1b[0m"); - $tw.boot.files[title] = fileInfo; - // Pass it to the callback - callback(null,fileInfo); + fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ + directory: $tw.boot.wikiTiddlersPath, + pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths"), + wiki: this.wiki }); + $tw.boot.files[title] = fileInfo; } + callback(null,fileInfo); }; -/* -Given a list of filters, apply every one in turn to source, and return the first result of the first filter with non-empty result. -*/ -FileSystemAdaptor.prototype.findFirstFilter = function(filters,source) { - for(var i=0; i 0) { - return result[0]; - } - } - return null; -}; - -/* -Given a tiddler title and an array of existing filenames, generate a new legal filename for the title, case insensitively avoiding the array of existing filenames -*/ -FileSystemAdaptor.prototype.generateTiddlerBaseFilepath = function(title) { - var baseFilename; - // Check whether the user has configured a tiddler -> pathname mapping - var pathNameFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths"); - if(pathNameFilters) { - var source = this.wiki.makeTiddlerIterator([title]); - baseFilename = this.findFirstFilter(pathNameFilters.split("\n"),source); - if(baseFilename) { - // Interpret "/" and "\" as path separator - baseFilename = baseFilename.replace(/\/|\\/g,path.sep); - } - } - if(!baseFilename) { - // No mappings provided, or failed to match this tiddler so we use title as filename - baseFilename = title.replace(/\/|\\/g,"_"); - } - // Remove any of the characters that are illegal in Windows filenames - var baseFilename = $tw.utils.transliterate(baseFilename.replace(/<|>|\:|\"|\||\?|\*|\^/g,"_")); - // Truncate the filename if it is too long - if(baseFilename.length > 200) { - baseFilename = baseFilename.substr(0,200); - } - return baseFilename; -}; /* Save a tiddler and invoke the callback with (err,adaptorInfo,revision) @@ -149,38 +71,7 @@ FileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) { if(err) { return callback(err); } - var filepath = fileInfo.filepath, - error = $tw.utils.createDirectory(path.dirname(filepath)); - if(error) { - return callback(error); - } - if(fileInfo.hasMetaFile) { - // Save the tiddler as a separate body and meta file - var typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/plain"] || {encoding: "utf8"}; - fs.writeFile(filepath,tiddler.fields.text,{encoding: typeInfo.encoding},function(err) { - if(err) { - return callback(err); - } - content = self.wiki.renderTiddler("text/plain","$:/core/templates/tiddler-metadata",{variables: {currentTiddler: tiddler.fields.title}}); - fs.writeFile(fileInfo.filepath + ".meta",content,{encoding: "utf8"},function (err) { - if(err) { - return callback(err); - } - self.logger.log("Saved file",filepath); - return callback(null); - }); - }); - } else { - // Save the tiddler as a self contained templated file - var content = self.wiki.renderTiddler("text/plain","$:/core/templates/tid-tiddler",{variables: {currentTiddler: tiddler.fields.title}}); - fs.writeFile(filepath,content,{encoding: "utf8"},function (err) { - if(err) { - return callback(err); - } - self.logger.log("Saved file",filepath); - return callback(null); - }); - } + $tw.utils.saveTiddlerToFile(tiddler,fileInfo,callback); }); }; @@ -206,7 +97,6 @@ FileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) { if(err) { return callback(err); } - self.logger.log("Deleted file",fileInfo.filepath); // Delete the metafile if present if(fileInfo.hasMetaFile) { fs.unlink(fileInfo.filepath + ".meta",function(err) { From 373afd72c804b0ffa2779849ba0d278d53e65df4 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 14 Apr 2019 12:04:00 +0100 Subject: [PATCH 0086/2376] Add savewikifolder command Makes it much easier to convert a TiddlyWiki HTML file into a full wiki folder. --- core/language/en-GB/Help/savewikifolder.tid | 19 ++ core/modules/commands/savewikifolder.js | 190 ++++++++++++++++++ core/modules/utils/filesystem.js | 41 +++- .../commands/SaveWikiFolderCommand.tid | 7 + 4 files changed, 248 insertions(+), 9 deletions(-) create mode 100644 core/language/en-GB/Help/savewikifolder.tid create mode 100644 core/modules/commands/savewikifolder.js create mode 100644 editions/tw5.com/tiddlers/commands/SaveWikiFolderCommand.tid diff --git a/core/language/en-GB/Help/savewikifolder.tid b/core/language/en-GB/Help/savewikifolder.tid new file mode 100644 index 000000000..2f6f034f1 --- /dev/null +++ b/core/language/en-GB/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: Saves a wiki to a new wiki folder + +Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration: + +``` +--savewikifolder [] +``` + +* The target wiki folder must be empty or non-existent +* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]` +* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file +* Custom plugins are unpacked into their own folder + +A common usage is to convert a TiddlyWiki HTML file into a wiki folder: + +``` +tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder +``` diff --git a/core/modules/commands/savewikifolder.js b/core/modules/commands/savewikifolder.js new file mode 100644 index 000000000..d29292742 --- /dev/null +++ b/core/modules/commands/savewikifolder.js @@ -0,0 +1,190 @@ +/*\ +title: $:/core/modules/commands/savewikifolder.js +type: application/javascript +module-type: command + +Command to save the current wiki as a wiki folder + +--savewikifolder [] [] + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.info = { + name: "savewikifolder", + synchronous: true +}; + +var fs,path; +if($tw.node) { + fs = require("fs"); + path = require("path"); +} + +var Command = function(params,commander,callback) { + this.params = params; + this.commander = commander; + this.callback = callback; +}; + +Command.prototype.execute = function() { + if(this.params.length < 1) { + return "Missing wiki folder path"; + } + var wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander); + return wikifoldermaker.save(); +}; + +function WikiFolderMaker(wikiFolderPath,wikiFilter,commander) { + this.wikiFolderPath = wikiFolderPath; + this.wikiFilter = wikiFilter || "[all[tiddlers]]"; + this.commander = commander; + this.wiki = commander.wiki; + this.savedPaths = []; // So that we can detect filename clashes +} + +WikiFolderMaker.prototype.log = function(str) { + if(this.commander.verbose) { + console.log(str); + } +}; + +WikiFolderMaker.prototype.tiddlersToIgnore = [ + "$:/boot/boot.css", + "$:/boot/boot.js", + "$:/boot/bootprefix.js", + "$:/core", + "$:/library/sjcl.js", + "$:/temp/info-plugin" +]; + +/* +Returns null if successful, or an error string if there was an error +*/ +WikiFolderMaker.prototype.save = function() { + var self = this; + // Check that the output directory doesn't exist + if(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) { + return "The unpackwiki command requires that the output wiki folder be empty"; + } + // Get the tiddlers from the source wiki + var tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter); + // Initialise a new tiddlwiki.info file + var newWikiInfo = {}; + // Process each incoming tiddler in turn + $tw.utils.each(tiddlerTitles,function(title) { + var tiddler = self.wiki.getTiddler(title); + if(tiddler) { + if(self.tiddlersToIgnore.indexOf(title) !== -1) { + // Ignore the core plugin and the ephemeral info plugin + self.log("Ignoring tiddler: " + title); + } else { + var type = tiddler.fields.type, + pluginType = tiddler.fields["plugin-type"]; + if(type === "application/json" && pluginType) { + // Plugin tiddler + var libraryDetails = self.findPluginInLibrary(title); + if(libraryDetails) { + // A plugin from the core library + self.log("Adding built-in plugin: " + libraryDetails.name); + newWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || []; + $tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name); + } else { + // A custom plugin + self.log("Processing custom plugin: " + title); + self.saveCustomPlugin(tiddler); + } + } else { + // Ordinary tiddler + self.saveTiddler("tiddlers",tiddler); + } + } + } + }); + // Save the tiddlywiki.info file + this.saveJSONFile("tiddlywiki.info",newWikiInfo); + self.log("Writing tiddlywiki.info: " + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces)); + return null; +}; + +/* +Test whether the specified tiddler is a plugin in the plugin library +*/ +WikiFolderMaker.prototype.findPluginInLibrary = function(title) { + var parts = title.split("/"), + pluginPath, type, name; + if(parts[0] === "$:") { + if(parts[1] === "languages" && parts.length === 3) { + pluginPath = "languages" + path.sep + parts[2]; + type = parts[1]; + name = parts[2]; + } else if(parts[1] === "plugins" || parts[1] === "themes" && parts.length === 4) { + pluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3]; + type = parts[1]; + name = parts[2] + "/" + parts[3]; + } + } + if(pluginPath && type && name) { + pluginPath = path.resolve($tw.boot.bootPath,"..",pluginPath); + if(fs.existsSync(pluginPath)) { + return { + pluginPath: pluginPath, + type: type, + name: name + }; + } + } + return false; +}; + +WikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) { + var self = this, + pluginTitle = pluginTiddler.fields.title, + titleParts = pluginTitle.split("/"), + directory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{ + directory: path.resolve(this.wikiFolderPath,pluginTiddler.fields["plugin-type"] + "s") + }), + pluginInfo = { + title: pluginTitle, + description: pluginTiddler.fields.description, + author: pluginTiddler.fields.author, + "core-version": pluginTiddler.fields["core-version"], + list: pluginTiddler.fields.list + }; + this.saveJSONFile(directory + path.sep + "plugin.info",pluginInfo); + self.log("Writing " + directory + path.sep + "plugin.info: " + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces)); + var pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin + $tw.utils.each(pluginTiddlers,function(tiddler) { + self.saveTiddler(directory,new $tw.Tiddler(tiddler)); + }); +}; + +WikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) { + var fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ + directory: path.resolve(this.wikiFolderPath,directory), + wiki: this.wiki + }); + $tw.utils.saveTiddlerToFileSync(tiddler,fileInfo); +}; + +WikiFolderMaker.prototype.saveJSONFile = function(filename,json) { + this.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)); +}; + +WikiFolderMaker.prototype.saveTextFile = function(filename,data) { + this.saveFile(filename,"utf8",data); +}; + +WikiFolderMaker.prototype.saveFile = function(filename,encoding,data) { + var filepath = path.resolve(this.wikiFolderPath,filename); + $tw.utils.createFileDirectories(filepath); + fs.writeFileSync(filepath,data,encoding); +}; + +exports.Command = Command; + +})(); diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 8d07a9c45..a2011c433 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -222,7 +222,7 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { // Take the file extension from the tiddler content type var contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: ""}; // Generate the filepath - fileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler,{ + fileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{ extension: contentTypeInfo.extension, directory: options.directory, pathFilters: options.pathFilters @@ -238,7 +238,7 @@ Options include: pathFilters: optional array of filters to be used to generate the base path wiki: optional wiki for evaluating the pathFilters */ -exports.generateTiddlerFilepath = function(tiddler,options) { +exports.generateTiddlerFilepath = function(title,options) { var self = this, directory = options.directory || "", extension = options.extension || "", @@ -247,7 +247,7 @@ exports.generateTiddlerFilepath = function(tiddler,options) { if(options.pathFilters && options.wiki) { $tw.utils.each(options.pathFilters,function(filter) { if(!filepath) { - var source = options.wiki.makeTiddlerIterator([tiddler.fields.title]), + var source = options.wiki.makeTiddlerIterator([title]), result = options.wiki.filterTiddlers(filter,null,source); if(result.length > 0) { filepath = result[0]; @@ -257,7 +257,7 @@ exports.generateTiddlerFilepath = function(tiddler,options) { } // If not, generate a base pathname if(!filepath) { - filepath = tiddler.fields.title; + filepath = title; // If the filepath already ends in the extension then remove it if(filepath.substring(filepath.length - extension.length) === extension) { filepath = filepath.substring(0,filepath.length - extension.length); @@ -275,7 +275,7 @@ exports.generateTiddlerFilepath = function(tiddler,options) { if(!filepath) { // ...then just use the character codes of the title filepath = ""; - $tw.utils.each(tiddler.fields.title.split(""),function(char) { + $tw.utils.each(title.split(""),function(char) { if(filepath) { filepath += "-"; } @@ -304,18 +304,41 @@ exports.saveTiddlerToFile = function(tiddler,fileInfo,callback) { if(fileInfo.hasMetaFile) { // Save the tiddler as a separate body and meta file var typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/plain"] || {encoding: "utf8"}; - fs.writeFile(fileInfo.filepath,tiddler.fields.text,{encoding: typeInfo.encoding},function(err) { + fs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) { if(err) { return callback(err); } - fs.writeFile(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text"]}),{encoding: "utf8"},callback); + fs.writeFile(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text"]}),"utf8",callback); }); } else { // Save the tiddler as a self contained templated file if(fileInfo.type === "application/x-tiddler") { - fs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),{encoding: "utf8"},callback); + fs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8",callback); } else { - fs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings()],null,$tw.config.preferences.jsonSpaces),{encoding: "utf8"},callback); + fs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings()],null,$tw.config.preferences.jsonSpaces),"utf8",callback); + } + } +}; + +/* +Save a tiddler to a file described by the fileInfo: + filepath: the absolute path to the file containing the tiddler + type: the type of the tiddler file (NOT the type of the tiddler) + hasMetaFile: true if the file also has a companion .meta file +*/ +exports.saveTiddlerToFileSync = function(tiddler,fileInfo) { + $tw.utils.createDirectory(path.dirname(fileInfo.filepath)); + if(fileInfo.hasMetaFile) { + // Save the tiddler as a separate body and meta file + var typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/plain"] || {encoding: "utf8"}; + fs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding); + fs.writeFileSync(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text"]}),"utf8"); + } else { + // Save the tiddler as a self contained templated file + if(fileInfo.type === "application/x-tiddler") { + fs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8"); + } else { + fs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings()],null,$tw.config.preferences.jsonSpaces),"utf8"); } } }; diff --git a/editions/tw5.com/tiddlers/commands/SaveWikiFolderCommand.tid b/editions/tw5.com/tiddlers/commands/SaveWikiFolderCommand.tid new file mode 100644 index 000000000..a079cc21f --- /dev/null +++ b/editions/tw5.com/tiddlers/commands/SaveWikiFolderCommand.tid @@ -0,0 +1,7 @@ +title: SaveWikiFolderCommand +tags: Commands +created: 20190414110120829 +modified: 20190414110120829 +caption: savewikifolder + +{{$:/language/Help/savewikifolder}} From 58cdbbf8657ba4ef193bd0278f0d33692a3b1f35 Mon Sep 17 00:00:00 2001 From: Bram Chen Date: Sun, 14 Apr 2019 21:14:20 +0800 Subject: [PATCH 0087/2376] Add chinese help texts for the new savewikifolder command (#3911) --- languages/zh-Hans/Help/savewikifolder.tid | 19 +++++++++++++++++++ languages/zh-Hant/Help/savewikifolder.tid | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 languages/zh-Hans/Help/savewikifolder.tid create mode 100644 languages/zh-Hant/Help/savewikifolder.tid diff --git a/languages/zh-Hans/Help/savewikifolder.tid b/languages/zh-Hans/Help/savewikifolder.tid new file mode 100644 index 000000000..3e511fe18 --- /dev/null +++ b/languages/zh-Hans/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: 将维基保存到一个新的维基文件夹 + +将当前维基保存为一个维基文件夹,包含条目、插件和配置: + +``` +--savewikifolder [] +``` + +* 目标维基文件夹必须为空或不存在 +* 筛选器指定应包括哪些条目。其为可选,默认为 `[all[tiddlers]]` +* 官方插件库中的插件,将替换为 `tiddlywiki.info` 文件中引用到的插件 +* 自订插件将解压缩到自己的文件夹中 + +常见的用法是将一个 TiddlyWiki HTML 文件转换成维基文件夹: + +``` +tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder +``` diff --git a/languages/zh-Hant/Help/savewikifolder.tid b/languages/zh-Hant/Help/savewikifolder.tid new file mode 100644 index 000000000..ecd3c1ec9 --- /dev/null +++ b/languages/zh-Hant/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: 將維基儲存到一個新的維基資料夾 + +將當前維基儲存為一個維基資料夾,包含條目、插件和配置: + +``` +--savewikifolder [] +``` + +* 目標維基資料夾必須為空或不存在 +* 篩選器指定應包括哪些條目。其為可選,預設為 `[all[tiddlers]]` +* 官方插件庫中的插件,將替換為 `tiddlywiki.info` 檔案中引用到的插件 +* 自訂插件將解壓縮到自己的資料夾中 + +常見的用法是將一個 TiddlyWiki HTML 檔案轉換成維基資料夾: + +``` +tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder +``` From 05138372285d66e406214b0c74cdb720fce3e1b1 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Sun, 14 Apr 2019 14:23:49 +0100 Subject: [PATCH 0088/2376] Ensure tiddler.getFieldStringBlock uses a deterministic ordering Makes diffs easier to track --- core/modules/tiddler.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/modules/tiddler.js b/core/modules/tiddler.js index 8715fedfd..e58d4ddf9 100644 --- a/core/modules/tiddler.js +++ b/core/modules/tiddler.js @@ -75,16 +75,16 @@ Get all the fields as a name:value block. Options: */ exports.getFieldStringBlock = function(options) { options = options || {}; - var exclude = options.exclude || []; - var fields = []; - for(var field in this.fields) { - if($tw.utils.hop(this.fields,field)) { - if(exclude.indexOf(field) === -1) { - fields.push(field + ": " + this.getFieldString(field)); - } + var exclude = options.exclude || [], + fields = Object.keys(this.fields).sort(), + result = []; + for(var t=0; t Date: Mon, 15 Apr 2019 22:45:46 +0500 Subject: [PATCH 0089/2376] Add support of language aliases in highlight.js plugin (#3898) listLanguages() returns a list of supported languages. It does not return language aliases. highlight.js has extensive support of language aliases which can be viewed here https://highlightjs.readthedocs.io/en/latest/css-classes-reference.html#language-names-and-aliases But because of using listLanguages(), TW does not take advantage of alias. getLanguage() method on the other hand supports aliases. https://highlightjs.readthedocs.io/en/latest/api.html#getlanguage-name To summarize, now user can use javascript, js or jsx for the code block. getLanguage() will return an object which means highlight.js supports this language. --- plugins/tiddlywiki/highlight/highlightblock.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/highlight/highlightblock.js b/plugins/tiddlywiki/highlight/highlightblock.js index 22ba0d7d0..7d261fb58 100644 --- a/plugins/tiddlywiki/highlight/highlightblock.js +++ b/plugins/tiddlywiki/highlight/highlightblock.js @@ -27,7 +27,7 @@ CodeBlockWidget.prototype.postRender = function() { if(tiddler) { language = tiddler.fields.text || ""; } - if(language && hljs.listLanguages().indexOf(language) !== -1) { + if(language && hljs.getLanguage(language)) { domNode.className = language.toLowerCase() + " hljs"; if($tw.browser && !domNode.isTiddlyWikiFakeDom) { hljs.highlightBlock(domNode); From 232eba2f7d7dfc47670a3a9b6745a8782180c1d7 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 15 Apr 2019 21:07:23 +0100 Subject: [PATCH 0090/2376] Http utilities: add xhr object to callback --- core/modules/utils/dom/http.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/modules/utils/dom/http.js b/core/modules/utils/dom/http.js index 7fdd81781..77cb67c24 100644 --- a/core/modules/utils/dom/http.js +++ b/core/modules/utils/dom/http.js @@ -17,7 +17,7 @@ A quick and dirty HTTP function; to be refactored later. Options are: url: URL to retrieve headers: hashmap of headers to send type: GET, PUT, POST etc - callback: function invoked with (err,data) + callback: function invoked with (err,data,xhr) returnProp: string name of the property to return as first argument of callback */ exports.httpRequest = function(options) { @@ -48,7 +48,7 @@ exports.httpRequest = function(options) { return; } // Something went wrong - options.callback($tw.language.getString("Error/XMLHttpRequest") + ": " + this.status); + options.callback($tw.language.getString("Error/XMLHttpRequest") + ": " + this.status,null,this); } }; // Make the request @@ -67,7 +67,7 @@ exports.httpRequest = function(options) { try { request.send(data); } catch(e) { - options.callback(e); + options.callback(e,null,this); } return request; }; From b32a5aa9afcdd6059fe57226385bde0c7655e000 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 15 Apr 2019 21:08:04 +0100 Subject: [PATCH 0091/2376] GitHub saver: Fix problem with saving to a non-existent directory --- core/modules/savers/github.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index cad1b99f1..f0064c586 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -56,16 +56,18 @@ GitHubSaver.prototype.save = function(text,method,callback) { ref: branch }, callback: function(err,getResponseDataJson,xhr) { - if(err) { + var getResponseData,sha = ""; + if(err && xhr.status !== 404) { return callback(err); } - var getResponseData = JSON.parse(getResponseDataJson), - sha = ""; - $tw.utils.each(getResponseData,function(details) { - if(details.name === filename) { - sha = details.sha; - } - }); + if(xhr.status !== 404) { + getResponseData = JSON.parse(getResponseDataJson); + $tw.utils.each(getResponseData,function(details) { + if(details.name === filename) { + sha = details.sha; + } + }); + } var data = { message: "Saved by TiddlyWiki", content: base64utf8.base64.encode.call(base64utf8,text), From 25c0ebb5231d17844ad70be435fe7987da71de80 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Mon, 15 Apr 2019 21:30:59 +0100 Subject: [PATCH 0092/2376] GitHub Saver: Make server URL configurable --- core/language/en-GB/ControlPanel.multids | 1 + core/modules/savers/github.js | 3 ++- core/ui/ControlPanel/Saving/GitHub.tid | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 835a5e6d3..cafe748dc 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -92,6 +92,7 @@ Saving/Hint: Settings used for saving the entire TiddlyWiki as a single file via Saving/GitHub/Branch: Target branch for saving (defaults to `master`) Saving/GitHub/Caption: ~GitHub Saver Saving/GitHub/Description: These settings are only used when saving to ~GitHub +Saving/GitHub/URL: Server URL (defaults to `https://api.github.com`) Saving/GitHub/Filename: Filename of target file (e.g. `index.html`) Saving/GitHub/Password: Password, OAUTH token, or personal access token Saving/GitHub/Path: Path to target file (e.g. `/wiki/`) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index f0064c586..2de2d13a3 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -29,6 +29,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { path = this.wiki.getTiddlerText("$:/GitHub/Path"), filename = this.wiki.getTiddlerText("$:/GitHub/Filename"), branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "master", + endpoint = this.wiki.getTiddlerText("$:/GitHub/Url") || "https://api.github.com", headers = { "Accept": "application/vnd.github.v3+json", "Content-Type": "application/json;charset=UTF-8", @@ -46,7 +47,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { path = path + "/"; } // Compose the base URI - var uri = "https://api.github.com/repos/" + repo + "/contents" + path; + var uri = endpoint + "/repos/" + repo + "/contents" + path; // Perform a get request to get the details (inc shas) of files in the same path as our file $tw.utils.httpRequest({ url: uri, diff --git a/core/ui/ControlPanel/Saving/GitHub.tid b/core/ui/ControlPanel/Saving/GitHub.tid index 11a6f48f1..cff158dbb 100644 --- a/core/ui/ControlPanel/Saving/GitHub.tid +++ b/core/ui/ControlPanel/Saving/GitHub.tid @@ -12,3 +12,4 @@ caption: {{$:/language/ControlPanel/Saving/GitHub/Caption}} |<> |<$edit-text tiddler="$:/GitHub/Branch" default="" tag="input"/> | |<> |<$edit-text tiddler="$:/GitHub/Path" default="" tag="input"/> | |<> |<$edit-text tiddler="$:/GitHub/Filename" default="" tag="input"/> | +|<> |<$edit-text tiddler="$:/GitHub/Url" default="" tag="input"/> | From 0a5c8268166a04cac3cb30935d984aa4792cc4a0 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Tue, 16 Apr 2019 10:15:58 +0100 Subject: [PATCH 0093/2376] GitHub Saver: Fix ServerURL name --- core/language/en-GB/ControlPanel.multids | 2 +- core/modules/savers/github.js | 2 +- core/ui/ControlPanel/Saving/GitHub.tid | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index cafe748dc..7621842ab 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -92,7 +92,7 @@ Saving/Hint: Settings used for saving the entire TiddlyWiki as a single file via Saving/GitHub/Branch: Target branch for saving (defaults to `master`) Saving/GitHub/Caption: ~GitHub Saver Saving/GitHub/Description: These settings are only used when saving to ~GitHub -Saving/GitHub/URL: Server URL (defaults to `https://api.github.com`) +Saving/GitHub/ServerURL: Server URL (defaults to `https://api.github.com`) Saving/GitHub/Filename: Filename of target file (e.g. `index.html`) Saving/GitHub/Password: Password, OAUTH token, or personal access token Saving/GitHub/Path: Path to target file (e.g. `/wiki/`) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index 2de2d13a3..ab644cbeb 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -29,7 +29,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { path = this.wiki.getTiddlerText("$:/GitHub/Path"), filename = this.wiki.getTiddlerText("$:/GitHub/Filename"), branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "master", - endpoint = this.wiki.getTiddlerText("$:/GitHub/Url") || "https://api.github.com", + endpoint = this.wiki.getTiddlerText("$:/GitHub/ServerURL") || "https://api.github.com", headers = { "Accept": "application/vnd.github.v3+json", "Content-Type": "application/json;charset=UTF-8", diff --git a/core/ui/ControlPanel/Saving/GitHub.tid b/core/ui/ControlPanel/Saving/GitHub.tid index cff158dbb..5e2bc7853 100644 --- a/core/ui/ControlPanel/Saving/GitHub.tid +++ b/core/ui/ControlPanel/Saving/GitHub.tid @@ -12,4 +12,4 @@ caption: {{$:/language/ControlPanel/Saving/GitHub/Caption}} |<> |<$edit-text tiddler="$:/GitHub/Branch" default="" tag="input"/> | |<> |<$edit-text tiddler="$:/GitHub/Path" default="" tag="input"/> | |<> |<$edit-text tiddler="$:/GitHub/Filename" default="" tag="input"/> | -|<> |<$edit-text tiddler="$:/GitHub/Url" default="" tag="input"/> | +|<> |<$edit-text tiddler="$:/GitHub/ServerURL" default="" tag="input"/> | From b7e0930122bb6b99204b1abefda5d6a93c888da3 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Tue, 16 Apr 2019 11:59:34 +0100 Subject: [PATCH 0094/2376] savewikifolder: Fix custom plugin fields We need to carry across all plugin fields into the tiddlywiki.info file --- core/modules/commands/savewikifolder.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/core/modules/commands/savewikifolder.js b/core/modules/commands/savewikifolder.js index d29292742..1e3ab36c6 100644 --- a/core/modules/commands/savewikifolder.js +++ b/core/modules/commands/savewikifolder.js @@ -5,7 +5,7 @@ module-type: command Command to save the current wiki as a wiki folder ---savewikifolder [] [] +--savewikifolder [] \*/ (function(){ @@ -148,13 +148,7 @@ WikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) { directory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{ directory: path.resolve(this.wikiFolderPath,pluginTiddler.fields["plugin-type"] + "s") }), - pluginInfo = { - title: pluginTitle, - description: pluginTiddler.fields.description, - author: pluginTiddler.fields.author, - "core-version": pluginTiddler.fields["core-version"], - list: pluginTiddler.fields.list - }; + pluginInfo = pluginTiddler.getFieldStrings({exclude: ["text","type"]}); this.saveJSONFile(directory + path.sep + "plugin.info",pluginInfo); self.log("Writing " + directory + path.sep + "plugin.info: " + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces)); var pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin From df416814b13fadd541ca30dffe3f77d24e63f8b0 Mon Sep 17 00:00:00 2001 From: Bram Chen Date: Tue, 16 Apr 2019 22:56:05 +0800 Subject: [PATCH 0095/2376] Update chinese translations (#3917) * Add chinese translations for Saving/GitHub/ServerURL * Improve simplified chinese wording --- languages/zh-Hans/ControlPanel.multids | 5 +++-- languages/zh-Hant/ControlPanel.multids | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 0de6686a9..6a5bcb712 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -90,9 +90,10 @@ Saving/DownloadSaver/Hint: 这些设置适用于兼容 HTML5 的下载保存模 Saving/General/Caption: 通用 Saving/General/Hint: 这些设置适用于所有已载入的保存模块 Saving/Hint: 用于通过保存模块将整个 TiddlyWiki 保存为单个文件的设置 -Saving/GitHub/Branch: 用于保存的目标分支 (预设值为 `master`) -Saving/GitHub/Caption: ~GitHub 保存模组 +Saving/GitHub/Branch: 用于保存的目标分支 (默认值为 `master`) +Saving/GitHub/Caption: ~GitHub 保存模块 Saving/GitHub/Description: 这些设定仅用于保存到 ~GitHub +Saving/GitHub/ServerURL: 服务器网址 (默认值为 `https://api.github.com`) Saving/GitHub/Filename: 目标文件的文件名称 (例如,`index.html`) Saving/GitHub/Password: 密码、OAUTH 令牌,或个人存取的令牌 Saving/GitHub/Path: 目标文件的路径 (例如,`/wiki/`) diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index e70eaae26..0d3d53a51 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -93,6 +93,7 @@ Saving/Hint: 用於通過儲存模組將整個 TiddlyWiki 儲存為單個檔案 Saving/GitHub/Branch: 用於儲存的目標分支 (預設值為 `master`) Saving/GitHub/Caption: ~GitHub 儲存模組 Saving/GitHub/Description: 這些設定僅用於儲存到 ~GitHub +Saving/GitHub/ServerURL: 伺服器網址 (預設值為 `https://api.github.com`) Saving/GitHub/Filename: 目標檔案的檔案名稱 (例如,`index.html`) Saving/GitHub/Password: 密碼、OAUTH 令牌,或個人存取的令牌 Saving/GitHub/Path: 目標檔案的路徑 (例如,`/wiki/`) From 4401e7149809b0452afc5c81bfaa600dddd3a7ac Mon Sep 17 00:00:00 2001 From: Jermolene Date: Tue, 23 Apr 2019 17:53:19 +0100 Subject: [PATCH 0096/2376] Docs: Update WebServer Parameter: csrf-disable --- .../tiddlers/webserver/WebServer Parameter_ csrf-disable.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ csrf-disable.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ csrf-disable.tid index 125f1466f..7ceef7273 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ csrf-disable.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ csrf-disable.tid @@ -1,10 +1,12 @@ caption: csrf-disable created: 20180630180340448 -modified: 20180702142051779 +modified: 20190419171355307 tags: [[WebServer Parameters]] title: WebServer Parameter: csrf-disable type: text/vnd.tiddlywiki The [[web server configuration parameter|WebServer Parameters]] ''csrf-disable'' causes the usual [[cross-site request forgery|https://en.wikipedia.org/wiki/Cross-site_request_forgery]] checks to be disabled. This might be necessary in unusual or experimental configurations. +Setting ''csrf-disable'' to `yes` disables the CSRF checks; `no` (or any other value) enables them. + The only currently implemented check is the use of a [[custom header|https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Protecting_REST_Services:_Use_of_Custom_Request_Headers]] called `x-requested-with` that must contain the string `TiddlyWiki` in order for write requests to succeed. \ No newline at end of file From 07198b9cda12da82fc66dcf0589d6a9caab1cdf6 Mon Sep 17 00:00:00 2001 From: Jermolene Date: Tue, 23 Apr 2019 17:54:49 +0100 Subject: [PATCH 0097/2376] Update view toolbar "new here" button Avoiding textual substitution fixes probems with tiddler titles containing double square brackets. --- core/ui/ViewToolbar/new-here.tid | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/ui/ViewToolbar/new-here.tid b/core/ui/ViewToolbar/new-here.tid index 5089bbf59..7fd7bf54f 100644 --- a/core/ui/ViewToolbar/new-here.tid +++ b/core/ui/ViewToolbar/new-here.tid @@ -4,12 +4,13 @@ caption: {{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Captio description: {{$:/language/Buttons/NewHere/Hint}} \whitespace trim -\define newHereButtonTags() -[[$(currentTiddler)$]] +\define newHereActions() +<$set name="tags" filter="[]"> +<$action-sendmessage $message="tm-new-tiddler" tags=<>/> + \end \define newHereButton() -<$button tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<>> -<$action-sendmessage $message="tm-new-tiddler" tags=<>/> +<$button actions=<> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<>> <$list filter="[prefix[yes]]"> {{$:/core/images/new-here-button}} From 091864ddaf17509191b269d316b917852da9c0df Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Thu, 2 May 2019 20:21:58 +0100 Subject: [PATCH 0098/2376] Browser messaging: suppress logging Commented out because it can be useful for debugging. --- core/modules/startup/browser-messaging.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/modules/startup/browser-messaging.js b/core/modules/startup/browser-messaging.js index c67090464..bee6d4988 100644 --- a/core/modules/startup/browser-messaging.js +++ b/core/modules/startup/browser-messaging.js @@ -144,9 +144,9 @@ exports.startup = function() { }); // Listen for window messages from other windows window.addEventListener("message",function listener(event){ - console.log("browser-messaging: ",document.location.toString()) - console.log("browser-messaging: Received message from",event.origin); - console.log("browser-messaging: Message content",event.data); + // console.log("browser-messaging: ",document.location.toString()) + // console.log("browser-messaging: Received message from",event.origin); + // console.log("browser-messaging: Message content",event.data); switch(event.data.verb) { case "GET-RESPONSE": if(event.data.status.charAt(0) === "2") { From fddc5d4ee627232441278284ed6bee2f50fe8b26 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Thu, 2 May 2019 21:20:24 +0100 Subject: [PATCH 0099/2376] Classic Storyview: Optimise for animation duration of zero (part 1) Approximtely 50% speed improvement in tests opening a storyview with 8,000 entries. (I've deferred the indentation adjustments until the next commit so that the git diffs are clearer) --- core/modules/storyviews/classic.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js index 1474d4512..a2abe03d4 100644 --- a/core/modules/storyviews/classic.js +++ b/core/modules/storyviews/classic.js @@ -19,6 +19,7 @@ var ClassicStoryView = function(listWidget) { }; ClassicStoryView.prototype.navigateTo = function(historyInfo) { + var duration = $tw.utils.getAnimationDuration() var listElementIndex = this.listWidget.findListItem(0,historyInfo.title); if(listElementIndex === undefined) { return; @@ -29,13 +30,18 @@ ClassicStoryView.prototype.navigateTo = function(historyInfo) { if(!(targetElement instanceof Element)) { return; } - // Scroll the node into view - this.listWidget.dispatchEvent({type: "tm-scroll", target: targetElement}); + if(duration) { + // Scroll the node into view + this.listWidget.dispatchEvent({type: "tm-scroll", target: targetElement}); + } else { + targetElement.scrollIntoView(); + } }; ClassicStoryView.prototype.insert = function(widget) { - var targetElement = widget.findFirstDomNode(), - duration = $tw.utils.getAnimationDuration(); + var duration = $tw.utils.getAnimationDuration(); + if(duration) { + var targetElement = widget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) if(!(targetElement instanceof Element)) { return; @@ -66,11 +72,13 @@ ClassicStoryView.prototype.insert = function(widget) { {marginBottom: currMarginBottom + "px"}, {opacity: "1.0"} ]); + } }; ClassicStoryView.prototype.remove = function(widget) { + var duration = $tw.utils.getAnimationDuration(); + if(duration) { var targetElement = widget.findFirstDomNode(), - duration = $tw.utils.getAnimationDuration(), removeElement = function() { widget.removeChildDomNodes(); }; @@ -103,6 +111,9 @@ ClassicStoryView.prototype.remove = function(widget) { {marginBottom: (-currHeight) + "px"}, {opacity: "0.0"} ]); + } else { + widget.removeChildDomNodes(); + } }; exports.classic = ClassicStoryView; From 5ae14a16ec8bc47e8ee62276cd14e8c1b6f9e0b4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Thu, 2 May 2019 21:21:22 +0100 Subject: [PATCH 0100/2376] Classic Storyview: Optimise for animation duration of zero (part 2) See fddc5d4ee --- core/modules/storyviews/classic.js | 120 ++++++++++++++--------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js index a2abe03d4..e5f726f5f 100644 --- a/core/modules/storyviews/classic.js +++ b/core/modules/storyviews/classic.js @@ -41,36 +41,36 @@ ClassicStoryView.prototype.navigateTo = function(historyInfo) { ClassicStoryView.prototype.insert = function(widget) { var duration = $tw.utils.getAnimationDuration(); if(duration) { - var targetElement = widget.findFirstDomNode(); - // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { - return; - } - // Get the current height of the tiddler - var computedStyle = window.getComputedStyle(targetElement), - currMarginBottom = parseInt(computedStyle.marginBottom,10), - currMarginTop = parseInt(computedStyle.marginTop,10), - currHeight = targetElement.offsetHeight + currMarginTop; - // Reset the margin once the transition is over - setTimeout(function() { + var targetElement = widget.findFirstDomNode(); + // Abandon if the list entry isn't a DOM element (it might be a text node) + if(!(targetElement instanceof Element)) { + return; + } + // Get the current height of the tiddler + var computedStyle = window.getComputedStyle(targetElement), + currMarginBottom = parseInt(computedStyle.marginBottom,10), + currMarginTop = parseInt(computedStyle.marginTop,10), + currHeight = targetElement.offsetHeight + currMarginTop; + // Reset the margin once the transition is over + setTimeout(function() { + $tw.utils.setStyle(targetElement,[ + {transition: "none"}, + {marginBottom: ""} + ]); + },duration); + // Set up the initial position of the element $tw.utils.setStyle(targetElement,[ {transition: "none"}, - {marginBottom: ""} + {marginBottom: (-currHeight) + "px"}, + {opacity: "0.0"} ]); - },duration); - // Set up the initial position of the element - $tw.utils.setStyle(targetElement,[ - {transition: "none"}, - {marginBottom: (-currHeight) + "px"}, - {opacity: "0.0"} - ]); - $tw.utils.forceLayout(targetElement); - // Transition to the final position - $tw.utils.setStyle(targetElement,[ - {transition: "opacity " + duration + "ms " + easing + ", " + - "margin-bottom " + duration + "ms " + easing}, - {marginBottom: currMarginBottom + "px"}, - {opacity: "1.0"} + $tw.utils.forceLayout(targetElement); + // Transition to the final position + $tw.utils.setStyle(targetElement,[ + {transition: "opacity " + duration + "ms " + easing + ", " + + "margin-bottom " + duration + "ms " + easing}, + {marginBottom: currMarginBottom + "px"}, + {opacity: "1.0"} ]); } }; @@ -78,39 +78,39 @@ ClassicStoryView.prototype.insert = function(widget) { ClassicStoryView.prototype.remove = function(widget) { var duration = $tw.utils.getAnimationDuration(); if(duration) { - var targetElement = widget.findFirstDomNode(), - removeElement = function() { - widget.removeChildDomNodes(); - }; - // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { - removeElement(); - return; - } - // Get the current height of the tiddler - var currWidth = targetElement.offsetWidth, - computedStyle = window.getComputedStyle(targetElement), - currMarginBottom = parseInt(computedStyle.marginBottom,10), - currMarginTop = parseInt(computedStyle.marginTop,10), - currHeight = targetElement.offsetHeight + currMarginTop; - // Remove the dom nodes of the widget at the end of the transition - setTimeout(removeElement,duration); - // Animate the closure - $tw.utils.setStyle(targetElement,[ - {transition: "none"}, - {transform: "translateX(0px)"}, - {marginBottom: currMarginBottom + "px"}, - {opacity: "1.0"} - ]); - $tw.utils.forceLayout(targetElement); - $tw.utils.setStyle(targetElement,[ - {transition: $tw.utils.roundTripPropertyName("transform") + " " + duration + "ms " + easing + ", " + - "opacity " + duration + "ms " + easing + ", " + - "margin-bottom " + duration + "ms " + easing}, - {transform: "translateX(-" + currWidth + "px)"}, - {marginBottom: (-currHeight) + "px"}, - {opacity: "0.0"} - ]); + var targetElement = widget.findFirstDomNode(), + removeElement = function() { + widget.removeChildDomNodes(); + }; + // Abandon if the list entry isn't a DOM element (it might be a text node) + if(!(targetElement instanceof Element)) { + removeElement(); + return; + } + // Get the current height of the tiddler + var currWidth = targetElement.offsetWidth, + computedStyle = window.getComputedStyle(targetElement), + currMarginBottom = parseInt(computedStyle.marginBottom,10), + currMarginTop = parseInt(computedStyle.marginTop,10), + currHeight = targetElement.offsetHeight + currMarginTop; + // Remove the dom nodes of the widget at the end of the transition + setTimeout(removeElement,duration); + // Animate the closure + $tw.utils.setStyle(targetElement,[ + {transition: "none"}, + {transform: "translateX(0px)"}, + {marginBottom: currMarginBottom + "px"}, + {opacity: "1.0"} + ]); + $tw.utils.forceLayout(targetElement); + $tw.utils.setStyle(targetElement,[ + {transition: $tw.utils.roundTripPropertyName("transform") + " " + duration + "ms " + easing + ", " + + "opacity " + duration + "ms " + easing + ", " + + "margin-bottom " + duration + "ms " + easing}, + {transform: "translateX(-" + currWidth + "px)"}, + {marginBottom: (-currHeight) + "px"}, + {opacity: "0.0"} + ]); } else { widget.removeChildDomNodes(); } From 7869546fef7b2ea5fd6fd72feacd565a7f177fb6 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 10 May 2019 08:47:00 +0100 Subject: [PATCH 0101/2376] Speed up reveal widget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It turns out that the `localeCompare` function used by `compareStateText()` is very, very slow. Replacing it with a straightforward equality test makes one of my test rigs be 10x faster... Note that this PR reverts the behaviour of match/nomatch to that before #3157. That change was not backwards compatible in that the switch to localeCompare meant that é === e, now it doesn't again. --- core/modules/widgets/reveal.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index f5511f4b3..e89377186 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -142,10 +142,10 @@ RevealWidget.prototype.readState = function() { this.readPopupState(state); break; case "match": - this.isOpen = !!(this.compareStateText(state) == 0); + this.isOpen = this.text === state; break; case "nomatch": - this.isOpen = !(this.compareStateText(state) == 0); + this.isOpen = this.text !== state; break; case "lt": this.isOpen = !!(this.compareStateText(state) < 0); From e8d1fbba6c109ccbeaedc1b34e47677c0ada7529 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 10 May 2019 15:56:01 +0100 Subject: [PATCH 0102/2376] Performance Instrumentation: Track execution times for individual filters Fixes #3941 --- core/modules/filters.js | 2 +- core/modules/utils/logger.js | 7 +++ core/modules/utils/performance.js | 43 +++++++++++++++---- .../config/PerformanceInstrumentation.tid | 2 +- .../tiddlers/PerformanceInstrumentation.tid | 2 +- 5 files changed, 45 insertions(+), 11 deletions(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index fdad467d2..a1c4d8750 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -270,7 +270,7 @@ exports.compileFilter = function(filterString) { })()); }); // Return a function that applies the operations to a source iterator of tiddler titles - return $tw.perf.measure("filter",function filterFunction(source,widget) { + return $tw.perf.measure("filter: " + filterString,function filterFunction(source,widget) { if(!source) { source = self.each; } else if(typeof source === "object") { // Array or hashmap diff --git a/core/modules/utils/logger.js b/core/modules/utils/logger.js index ee14c5b2b..f194d78b3 100644 --- a/core/modules/utils/logger.js +++ b/core/modules/utils/logger.js @@ -33,6 +33,13 @@ Logger.prototype.log = function(/* args */) { } }; +/* +Log a structure as a table +*/ +Logger.prototype.table = function(value) { + (console.table || console.log)(value); +}; + /* Alert a message */ diff --git a/core/modules/utils/performance.js b/core/modules/utils/performance.js index 3e7acfac3..51c8ebcfb 100644 --- a/core/modules/utils/performance.js +++ b/core/modules/utils/performance.js @@ -14,10 +14,15 @@ Performance measurement. function Performance(enabled) { this.enabled = !!enabled; - this.measures = {}; // Hashmap of current values of measurements + this.measures = {}; // Hashmap by measurement name of {time:, invocations:} this.logger = new $tw.utils.Logger("performance"); + this.showGreeting(); } +Performance.prototype.showGreeting = function() { + this.logger("Execute $tw.perf.log(); to see filter execution timings"); +}; + /* Wrap performance reporting around a top level function */ @@ -25,13 +30,9 @@ Performance.prototype.report = function(name,fn) { var self = this; if(this.enabled) { return function() { - self.measures = {}; var startTime = $tw.utils.timer(), result = fn.apply(this,arguments); self.logger.log(name + ": " + $tw.utils.timer(startTime).toFixed(2) + "ms"); - for(var m in self.measures) { - self.logger.log("+" + m + ": " + self.measures[m].toFixed(2) + "ms"); - } return result; }; } else { @@ -39,6 +40,29 @@ Performance.prototype.report = function(name,fn) { } }; +Performance.prototype.log = function() { + var self = this, + totalTime = 0, + orderedMeasures = Object.keys(this.measures).sort(function(a,b) { + if(self.measures[a].time > self.measures[b].time) { + return -1; + } else if (self.measures[a].time < self.measures[b].time) { + return + 1; + } else { + return 0; + } + }); + $tw.utils.each(orderedMeasures,function(name) { + totalTime += self.measures[name].time; + }); + var results = [] + $tw.utils.each(orderedMeasures,function(name) { + var measure = self.measures[name]; + results.push({name: name,invocations: measure.invocations, totalTime: measure.time,percentTime: (measure.time / totalTime) * 100}) + }); + self.logger.table(results); +}; + /* Wrap performance measurements around a subfunction */ @@ -47,9 +71,12 @@ Performance.prototype.measure = function(name,fn) { if(this.enabled) { return function() { var startTime = $tw.utils.timer(), - result = fn.apply(this,arguments), - value = self.measures[name] || 0; - self.measures[name] = value + $tw.utils.timer(startTime); + result = fn.apply(this,arguments); + if(!(name in self.measures)) { + self.measures[name] = {time: 0, invocations: 0}; + } + self.measures[name].time += $tw.utils.timer(startTime); + self.measures[name].invocations++; return result; }; } else { diff --git a/core/wiki/config/PerformanceInstrumentation.tid b/core/wiki/config/PerformanceInstrumentation.tid index ccae6842e..e4220f287 100644 --- a/core/wiki/config/PerformanceInstrumentation.tid +++ b/core/wiki/config/PerformanceInstrumentation.tid @@ -1,2 +1,2 @@ title: $:/config/Performance/Instrumentation -text: no +text: yes diff --git a/editions/dynaviewdemo/tiddlers/PerformanceInstrumentation.tid b/editions/dynaviewdemo/tiddlers/PerformanceInstrumentation.tid index ccae6842e..e4220f287 100644 --- a/editions/dynaviewdemo/tiddlers/PerformanceInstrumentation.tid +++ b/editions/dynaviewdemo/tiddlers/PerformanceInstrumentation.tid @@ -1,2 +1,2 @@ title: $:/config/Performance/Instrumentation -text: no +text: yes From ff85fcfe93d5f7e65acf9040559bbb368582ef21 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 10 May 2019 16:03:24 +0100 Subject: [PATCH 0103/2376] Fix typo from e8d1fbba6 --- core/modules/utils/performance.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/performance.js b/core/modules/utils/performance.js index 51c8ebcfb..ebae60768 100644 --- a/core/modules/utils/performance.js +++ b/core/modules/utils/performance.js @@ -20,7 +20,7 @@ function Performance(enabled) { } Performance.prototype.showGreeting = function() { - this.logger("Execute $tw.perf.log(); to see filter execution timings"); + this.logger.log("Execute $tw.perf.log(); to see filter execution timings"); }; /* From 94d18a2f18942971e7bc48f300c34a28b6b41c7c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sat, 11 May 2019 17:31:35 +0100 Subject: [PATCH 0104/2376] KaTeX: Fix bug with embedded SVGs See https://github.com/Jermolene/TiddlyWiki5/issues/2500#issuecomment-489976530 --- plugins/tiddlywiki/katex/styles.tid | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/tiddlywiki/katex/styles.tid b/plugins/tiddlywiki/katex/styles.tid index fb65aaec1..bda948e69 100644 --- a/plugins/tiddlywiki/katex/styles.tid +++ b/plugins/tiddlywiki/katex/styles.tid @@ -13,6 +13,12 @@ tags: [[$:/tags/Stylesheet]] text-rendering: auto; } +/* Avoid TW5's max-width: 100% */ + +.katex svg { + max-width: initial; +} + /* Override font URLs */ @font-face { From 184fd9dda869e1e4b784b54f1f8bc6c471c46b3b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sat, 11 May 2019 19:28:09 +0100 Subject: [PATCH 0105/2376] Docs for Performance Instrumentation improvements Left off e8d1fbba6 --- .../features/Performance Instrumentation.tid | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid index b7a95a39c..270e8bf7d 100644 --- a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid +++ b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid @@ -1,5 +1,5 @@ created: 20190316163428191 -modified: 20190316163657710 +modified: 20190510133455372 tags: Features title: Performance Instrumentation type: text/vnd.tiddlywiki @@ -10,22 +10,27 @@ With performance instrumentation switched on, there is additional timing informa ``` performance: mainRender: 327.83ms -performance: +filter: 49.70ms performance: styleRefresh: 9.14ms -performance: +filter: 2.46ms performance: mainRefresh: 68.10ms -performance: +filter: 37.69ms ``` The information above should be interpreted as follows: -<<< -"Initial rendering of the main page took 327ms (of which 50ms was filter evaluation). Refreshing the page stylesheet took 9ms (of which 2ms was filter evaluation). Refreshing the main page took 68ms (of which 38ms was filter evaluation)" -<<< - * mainRender is the time taken for the initial display of the page template * styleRefresh is the time taken to refresh the page stylesheet * mainRender is the time taken to refresh the main page template -* in each case, +filter denotes the time taken up with filter evaluation. -As an example, try switching between the sidebar tabs to compare how long they take to render. \ No newline at end of file +As an example, try switching between the sidebar tabs to compare how long they take to render. + +More detailed information on filter execution timings is also available. With performance instrumentation enabled, ype the following JavaScript command in the browser developer console: + +``` +tw.perf.log() +``` + +A table is displayed with the following information: + +* ''name'' - the string "Filter: " plus the text of the filter +* ''invocations'' - the number of invocations of the filter since startup +* ''totalTime'' - the total time in milliseconds spent evaluating this filter since startup +* ''percentTime'' - the percentage of the execution time of this filter against the total execution time of all filters From 634ac92ba2cb142e85f90de584e028fd6d32e812 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sat, 11 May 2019 19:48:06 +0100 Subject: [PATCH 0106/2376] Update splash screen to add new release banner See #3935 --- .../tiddlers/system/$__SplashScreen.tid | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/editions/tw5.com/tiddlers/system/$__SplashScreen.tid b/editions/tw5.com/tiddlers/system/$__SplashScreen.tid index 774fffe9b..7d632140f 100644 --- a/editions/tw5.com/tiddlers/system/$__SplashScreen.tid +++ b/editions/tw5.com/tiddlers/system/$__SplashScreen.tid @@ -21,6 +21,11 @@ type: text/vnd.tiddlywiki fill: <>; } +.tc-splash-text img { + width: 150px; + <> +} + html body.tc-body { background: <>; } @@ -94,24 +99,24 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. } -
      -Please wait while {{$:/SiteTitle}} is loading -
      -
      -
      -{{$:/core/images/home-button||$:/core/templates/plain-text-tiddler}} +Please wait while {{$:/SiteTitle}} is loading
      - + +
      + + +
      +{{$:/core/icon||$:/core/templates/plain-text-tiddler}}
      From ba0da99b17d0b0c473873226265101bea747e299 Mon Sep 17 00:00:00 2001 From: Kartik Saranathan <278928+Kartiku@users.noreply.github.com> Date: Thu, 16 May 2019 12:28:09 -0400 Subject: [PATCH 0107/2376] Docs: fix typo (#3949) --- editions/tw5.com/tiddlers/howtos/Custom Styles by title.tid | 4 ++-- editions/tw5.com/tiddlers/howtos/Custom_data-styles.tid | 2 +- .../tw5.com/tiddlers/howtos/How to apply custom styles.tid | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/Custom Styles by title.tid b/editions/tw5.com/tiddlers/howtos/Custom Styles by title.tid index c3730d6d7..2d0280b9b 100644 --- a/editions/tw5.com/tiddlers/howtos/Custom Styles by title.tid +++ b/editions/tw5.com/tiddlers/howtos/Custom Styles by title.tid @@ -13,7 +13,7 @@ The ~TiddlyWiki core adds several `attributes` to the rendered content. With tho For example this tiddler is named: "{{!!title}}" so the attribute looks like this: ``` -data-tiddler-title="Custom styles by title" +data-tiddler-title="Custom styles by data-tiddler-title" ``` !! Examples @@ -21,7 +21,7 @@ data-tiddler-title="Custom styles by title" The following CSS is defined in [[Custom data-styles]] and creates a blue border for exactly this tiddler. ``` -[data-tiddler-title="Custom styles by title"] { +[data-tiddler-title="Custom styles by data-tiddler-title"] { border: 1px solid blue; } ``` diff --git a/editions/tw5.com/tiddlers/howtos/Custom_data-styles.tid b/editions/tw5.com/tiddlers/howtos/Custom_data-styles.tid index 884dab36a..1ad8ab6f8 100644 --- a/editions/tw5.com/tiddlers/howtos/Custom_data-styles.tid +++ b/editions/tw5.com/tiddlers/howtos/Custom_data-styles.tid @@ -4,7 +4,7 @@ tags: data-tags-styles [[How to apply custom styles]] $:/tags/Stylesheet title: Custom data-styles type: text/vnd.tiddlywiki -[data-tiddler-title="Custom styles by title"] { +[data-tiddler-title="Custom styles by data-tiddler-title"] { border: 1px solid blue; } diff --git a/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid b/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid index df347f002..9d9c2bc29 100644 --- a/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid +++ b/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid @@ -1,5 +1,5 @@ created: 20141001132300000 -list: [[Custom styles by data-tags]] [[Custom styles by title]] +list: [[Custom styles by data-tags]] [[Custom styles by data-tiddler-title]] modified: 201804111740 tags: [[Customise TiddlyWiki]] title: How to apply custom styles From 409a297a63892a84655e05f93b6917ea0f3f8715 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sat, 18 May 2019 15:55:34 +0100 Subject: [PATCH 0108/2376] Docs: Fix inaccuracies in "has" filter docs --- editions/tw5.com/tiddlers/filters/has.tid | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/has.tid b/editions/tw5.com/tiddlers/filters/has.tid index c04370944..ed9a536d1 100644 --- a/editions/tw5.com/tiddlers/filters/has.tid +++ b/editions/tw5.com/tiddlers/filters/has.tid @@ -1,14 +1,14 @@ caption: has created: 20140410103123179 -modified: 20151111150117431 +modified: 20190518145446047 op-input: a [[selection of titles|Title Selection]] -op-neg-output: ''without suffix'' or with ''suffix `value`''
      » those input tiddlers in which field <<.place F>> does <<.em not>> exist or has an empty value
      ''suffix `field`''
      » those input tiddlers in which field <<.place F>> does <<.em not>> exist -op-output: ''without suffix'' or with ''suffix `value`''
      » those input tiddlers in which field <<.place F>> has a non-empty value
      ''suffix `field`''
      » those input tiddlers in which field <<.place F>> exists +op-neg-output: ''without suffix''
      » those input tiddlers in which field <<.place F>> does <<.em not>> exist or has an empty value
      ''suffix `field`''
      » those input tiddlers in which field <<.place F>> does <<.em not>> exist +op-output: ''without suffix''
      » those input tiddlers in which field <<.place F>> has a non-empty value
      ''suffix `field`''
      » those input tiddlers in which field <<.place F>> exists op-parameter: the name of a [[field|TiddlerFields]] op-parameter-name: F op-purpose: filter the input by field existence -op-suffix: <<.from-version "5.1.14">> optionally, the name of a [[field|TiddlerFields]] -op-suffix-name: F +op-suffix: <<.from-version "5.1.14">> optionally, the keyword `field` +op-suffix-name: S tags: [[Filter Operators]] [[Common Operators]] [[Field Operators]] [[Negatable Operators]] title: has Operator type: text/vnd.tiddlywiki From 2f8053265e96e0ae57b8d7b6c841af15aebd3f6d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Mon, 20 May 2019 12:50:10 +0100 Subject: [PATCH 0109/2376] Performance: Add average filter execution time --- core/modules/utils/performance.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/performance.js b/core/modules/utils/performance.js index ebae60768..c9d53d60f 100644 --- a/core/modules/utils/performance.js +++ b/core/modules/utils/performance.js @@ -58,7 +58,7 @@ Performance.prototype.log = function() { var results = [] $tw.utils.each(orderedMeasures,function(name) { var measure = self.measures[name]; - results.push({name: name,invocations: measure.invocations, totalTime: measure.time,percentTime: (measure.time / totalTime) * 100}) + results.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100}) }); self.logger.table(results); }; From feab75a6d1723cd6db5912b2902f0ec33c550fb6 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 24 May 2019 12:06:11 +0100 Subject: [PATCH 0110/2376] Add support for preloading plugins by path instead of name --- boot/boot.js | 15 +++++++++++---- .../nodejs/Using TiddlyWiki on Node.js.tid | 7 ++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index fada4014d..0f9aabd2b 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2044,10 +2044,17 @@ $tw.loadTiddlersNode = function() { $tw.wiki.addTiddler($tw.loadPluginFolder($tw.boot.corePath)); // Load any extra plugins $tw.utils.each($tw.boot.extraPlugins,function(name) { - var parts = name.split("/"), - type = parts[0]; - if(parts.length === 3 && ["plugins","themes","languages"].indexOf(type) !== -1) { - $tw.loadPlugins([parts[1] + "/" + parts[2]],$tw.config[type + "Path"],$tw.config[type + "EnvVar"]); + if(name.charAt(0) === "+") { // Relative path to plugin + var pluginFields = $tw.loadPluginFolder(name.substring(1));; + if(pluginFields) { + $tw.wiki.addTiddler(pluginFields); + } + } else { + var parts = name.split("/"), + type = parts[0]; + if(parts.length === 3 && ["plugins","themes","languages"].indexOf(type) !== -1) { + $tw.loadPlugins([parts[1] + "/" + parts[2]],$tw.config[type + "Path"],$tw.config[type + "EnvVar"]); + } } }); // Load the tiddlers from the wiki directory diff --git a/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid index e76bb68e5..577cdb016 100644 --- a/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid @@ -1,5 +1,5 @@ created: 20131219100520659 -modified: 20190412170813209 +modified: $tw.loadPluginFolder(name.substring(1)); tags: [[TiddlyWiki on Node.js]] title: Using TiddlyWiki on Node.js type: text/vnd.tiddlywiki @@ -14,14 +14,14 @@ tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html Running `tiddlywiki` from the command line boots the TiddlyWiki kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces. -<<.from-version "5.1.20">> First, there can be zero or more plugin references identified by the prefix `+`. These plugins are loaded in addition to any specified in the [[TiddlyWikiFolder|TiddlyWikiFolders]]. +<<.from-version "5.1.20">> First, there can be zero or more plugin references identified by the prefix `+` for plugin names or `++` for a path to a plugin folder. These plugins are loaded in addition to any specified in the [[TiddlyWikiFolder|TiddlyWikiFolders]]. The next argument is the optional path to the [[TiddlyWikiFolder|TiddlyWikiFolders]] to be loaded. If not present, then the current directory is used. The commands and their individual arguments follow, each command being identified by the prefix `--`. ``` -tiddlywiki [+] [] [-- [[,]]] +tiddlywiki [+ | ++] [] [-- [[,]]] ``` For example: @@ -29,6 +29,7 @@ For example: ``` tiddlywiki --version tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen +tiddlywiki ++./mygreatplugin mywiki --listen ``` <<.from-version "5.1.18">> Commands such as the ListenCommand that support large numbers of parameters can use NamedCommandParameters to make things less unwieldy. For example: From a8f70b08a8106b2c86acf6509a2fdb40ac4780a4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 24 May 2019 21:07:37 +0100 Subject: [PATCH 0111/2376] Add indexes to the wiki store to improve performance (#3951) * First pass at modular wiki indexes An exploratory experiment * Fix tests * Faster checking for existence of index methods We don't really need to check the type * Use the index for the has operator * Fix typo * Move iterator index methods into indexer modules Now boot.js doesn't know the core indexers * Fix up the other iterator index functions * Fix crash with missing index branch * Limit the field indexer to values less than 128 characters * Fallback to the old manual scan if the index method returns null * Sadly, we can no longe re-use the field indexer to accelerate the `has` operator, because the index now omits tiddlers that have field values longer than the limit Still need to make the index configuration exposed somehow * Rearrange tests so that we can test with and without indexers We also need to expose the list of enabled indexers as a config option * Test the field indexer with different length fields So that we test the indexed and non-indexed codepaths --- boot/boot.js | 34 ++++- core/modules/filters/field.js | 8 +- core/modules/filters/has.js | 2 +- core/modules/filters/tag.js | 23 ++- core/modules/indexers/field-indexer.js | 141 +++++++++++++++++++ core/modules/indexers/tag-indexer.js | 131 +++++++++++++++++ core/modules/startup/load-modules.js | 1 + core/modules/wiki.js | 27 +++- editions/test/tiddlers/tests/test-filters.js | 32 ++++- editions/test/tiddlers/tests/test-tags.js | 31 +++- 10 files changed, 403 insertions(+), 27 deletions(-) create mode 100644 core/modules/indexers/field-indexer.js create mode 100644 core/modules/indexers/tag-indexer.js diff --git a/boot/boot.js b/boot/boot.js index 0f9aabd2b..19f1417c1 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1035,7 +1035,23 @@ $tw.Wiki = function(options) { shadowTiddlerTitles = Object.keys(shadowTiddlers); } return shadowTiddlerTitles; - }; + }, + enableIndexers = options.enableIndexers || null, // Array of indexer names to enable, or null to use all available indexers + indexers = [], + indexersByName = Object.create(null); + + this.addIndexer = function(indexer,name) { + // Bail if this indexer is not enabled + if(enableIndexers && enableIndexers.indexOf(name) === -1) { + return; + } + indexers.push(indexer); + indexersByName[name] = indexer; + }; + + this.getIndexer = function(name) { + return indexersByName[name] || null; + }; // Add a tiddler to the store this.addTiddler = function(tiddler) { @@ -1046,6 +1062,7 @@ $tw.Wiki = function(options) { if(tiddler) { var title = tiddler.fields.title; if(title) { + var oldTiddler = this.getTiddler(title); // Uncomment the following line for detailed logs of all tiddler writes // console.log("Adding",title,tiddler) tiddlers[title] = tiddler; @@ -1054,6 +1071,9 @@ $tw.Wiki = function(options) { } this.clearCache(title); this.clearGlobalCache(); + $tw.utils.each(indexers,function(indexer) { + indexer.update(oldTiddler,tiddler); + }); this.enqueueTiddlerEvent(title); } } @@ -1064,6 +1084,7 @@ $tw.Wiki = function(options) { // Uncomment the following line for detailed logs of all tiddler deletions // console.log("Deleting",title) if($tw.utils.hop(tiddlers,title)) { + var oldTiddler = this.getTiddler(title); delete tiddlers[title]; if(tiddlerTitles) { var index = tiddlerTitles.indexOf(title); @@ -1073,6 +1094,10 @@ $tw.Wiki = function(options) { } this.clearCache(title); this.clearGlobalCache(); + var newTiddler = this.getTiddler(title); + $tw.utils.each(indexers,function(indexer) { + indexer.update(oldTiddler,newTiddler); + }); this.enqueueTiddlerEvent(title,true); } }; @@ -1159,7 +1184,6 @@ $tw.Wiki = function(options) { callback(tiddlers[title],title); } } - }; // Test for the existence of a tiddler (excludes shadow tiddlers) @@ -1273,8 +1297,14 @@ $tw.Wiki = function(options) { shadowTiddlerTitles = null; this.clearCache(null); this.clearGlobalCache(); + $tw.utils.each(indexers,function(indexer) { + indexer.rebuild(); + }); }; + if(this.addIndexersToWiki) { + this.addIndexersToWiki(); + } }; // Dummy methods that will be filled in after boot diff --git a/core/modules/filters/field.js b/core/modules/filters/field.js index f85df5c0d..7480a87cb 100644 --- a/core/modules/filters/field.js +++ b/core/modules/filters/field.js @@ -16,7 +16,7 @@ Filter operator for comparing fields for equality Export our filter function */ exports.field = function(source,operator,options) { - var results = [], + var results = [],indexedResults, fieldname = (operator.suffix || operator.operator || "title").toLowerCase(); if(operator.prefix === "!") { if(operator.regexp) { @@ -53,6 +53,12 @@ exports.field = function(source,operator,options) { } }); } else { + if(source.byField) { + indexedResults = source.byField(fieldname,operator.operand); + if(indexedResults) { + return indexedResults + } + } source(function(tiddler,title) { if(tiddler) { var text = tiddler.getFieldString(fieldname); diff --git a/core/modules/filters/has.js b/core/modules/filters/has.js index d05da4113..de24ab67b 100644 --- a/core/modules/filters/has.js +++ b/core/modules/filters/has.js @@ -45,7 +45,7 @@ exports.has = function(source,operator,options) { if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && !(tiddler.fields[operator.operand] === "" || tiddler.fields[operator.operand].length === 0)) { results.push(title); } - }); + }); } } return results; diff --git a/core/modules/filters/tag.js b/core/modules/filters/tag.js index a0093f565..e7ddbb361 100644 --- a/core/modules/filters/tag.js +++ b/core/modules/filters/tag.js @@ -16,7 +16,7 @@ Filter operator for checking for the presence of a tag Export our filter function */ exports.tag = function(source,operator,options) { - var results = []; + var results = [],indexedResults; if((operator.suffix || "").toLowerCase() === "strict" && !operator.operand) { // New semantics: // Always return copy of input if operator.operand is missing @@ -25,9 +25,10 @@ exports.tag = function(source,operator,options) { }); } else { // Old semantics: - var tiddlers = options.wiki.getTiddlersWithTag(operator.operand); + var tiddlers; if(operator.prefix === "!") { // Returns a copy of the input if operator.operand is missing + tiddlers = options.wiki.getTiddlersWithTag(operator.operand); source(function(tiddler,title) { if(tiddlers.indexOf(title) === -1) { results.push(title); @@ -35,12 +36,20 @@ exports.tag = function(source,operator,options) { }); } else { // Returns empty results if operator.operand is missing - source(function(tiddler,title) { - if(tiddlers.indexOf(title) !== -1) { - results.push(title); + if(source.byTag) { + indexedResults = source.byTag(operator.operand); + if(indexedResults) { + return indexedResults; } - }); - results = options.wiki.sortByList(results,operator.operand); + } else { + tiddlers = options.wiki.getTiddlersWithTag(operator.operand); + source(function(tiddler,title) { + if(tiddlers.indexOf(title) !== -1) { + results.push(title); + } + }); + results = options.wiki.sortByList(results,operator.operand); + } } } return results; diff --git a/core/modules/indexers/field-indexer.js b/core/modules/indexers/field-indexer.js new file mode 100644 index 000000000..96b869f90 --- /dev/null +++ b/core/modules/indexers/field-indexer.js @@ -0,0 +1,141 @@ +/*\ +title: $:/core/modules/indexers/field-indexer.js +type: application/javascript +module-type: indexer + +Indexes the tiddlers with each field value + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global modules: false */ +"use strict"; + +var DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128; + +function FieldIndexer(wiki) { + this.wiki = wiki; + this.index = null; + this.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH; + this.addIndexMethods(); +} + +// Provided for testing +FieldIndexer.prototype.setMaxIndexedValueLength = function(length) { + this.index = null; + this.maxIndexedValueLength = length; +}; + +FieldIndexer.prototype.addIndexMethods = function() { + var self = this; + this.wiki.each.byField = function(name,value) { + var titles = self.wiki.allTitles(), + lookup = self.lookup(name,value); + return lookup && lookup.filter(function(title) { + return titles.indexOf(title) !== -1; + }); + }; + this.wiki.eachShadow.byField = function(name,value) { + var titles = self.wiki.allShadowTitles(), + lookup = self.lookup(name,value); + return lookup && lookup.filter(function(title) { + return titles.indexOf(title) !== -1; + }); + }; + this.wiki.eachTiddlerPlusShadows.byField = function(name,value) { + var lookup = self.lookup(name,value); + return lookup ? lookup.slice(0) : null; + }; + this.wiki.eachShadowPlusTiddlers.byField = function(name,value) { + var lookup = self.lookup(name,value); + return lookup ? lookup.slice(0) : null; + }; +}; + +/* +Tear down and then rebuild the index as if all tiddlers have changed +*/ +FieldIndexer.prototype.rebuild = function() { + // Invalidate the index so that it will be rebuilt when it is next used + this.index = null; +}; + +/* +Build the index for a particular field +*/ +FieldIndexer.prototype.buildIndexForField = function(name) { + var self = this; + // Hashmap by field name of hashmap by field value of array of tiddler titles + this.index = this.index || Object.create(null); + this.index[name] = Object.create(null); + var baseIndex = this.index[name]; + // Update the index for each tiddler + this.wiki.eachTiddlerPlusShadows(function(tiddler,title) { + if(name in tiddler.fields) { + var value = tiddler.getFieldString(name); + // Skip any values above the maximum length + if(value.length < self.maxIndexedValueLength) { + baseIndex[value] = baseIndex[value] || []; + baseIndex[value].push(title); + } + } + }); +}; + +/* +Update the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create) +oldTiddler: old tiddler value, or null for creation +newTiddler: new tiddler value, or null for deletion +*/ +FieldIndexer.prototype.update = function(oldTiddler,newTiddler) { + var self = this; + // Don't do anything if the index hasn't been built yet + if(this.index === null) { + return; + } + // Remove the old tiddler from the index + if(oldTiddler) { + $tw.utils.each(this.index,function(indexEntry,name) { + if(name in oldTiddler.fields) { + var value = oldTiddler.getFieldString(name), + tiddlerList = indexEntry[value]; + if(tiddlerList) { + var index = tiddlerList.indexOf(oldTiddler.fields.title); + if(index !== -1) { + tiddlerList.splice(index,1); + } + } + } + }); + } + // Add the new tiddler to the index + if(newTiddler) { + $tw.utils.each(this.index,function(indexEntry,name) { + if(name in newTiddler.fields) { + var value = newTiddler.getFieldString(name); + if(value.length < self.maxIndexedValueLength) { + indexEntry[value] = indexEntry[value] || []; + indexEntry[value].push(newTiddler.fields.title); + } + } + }); + } +}; + +// Lookup the given field returning a list of tiddler titles +FieldIndexer.prototype.lookup = function(name,value) { + // Fail the lookup if the value is too long + if(value.length >= this.maxIndexedValueLength) { + return null; + } + // Update the index if it has yet to be built + if(this.index === null || !this.index[name]) { + this.buildIndexForField(name); + } + return this.index[name][value] || []; +}; + +exports.FieldIndexer = FieldIndexer; + +})(); diff --git a/core/modules/indexers/tag-indexer.js b/core/modules/indexers/tag-indexer.js new file mode 100644 index 000000000..7b8e87267 --- /dev/null +++ b/core/modules/indexers/tag-indexer.js @@ -0,0 +1,131 @@ +/*\ +title: $:/core/modules/indexers/tag-indexer.js +type: application/javascript +module-type: indexer + +Indexes the tiddlers with each tag + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global modules: false */ +"use strict"; + +function TagIndexer(wiki) { + this.wiki = wiki; + this.index = null; + this.addIndexMethods(); +} + +TagIndexer.prototype.addIndexMethods = function() { + var self = this; + this.wiki.each.byTag = function(tag) { + var titles = self.wiki.allTitles(); + return self.lookup(tag).filter(function(title) { + return titles.indexOf(title) !== -1; + }); + }; + this.wiki.eachShadow.byTag = function(tag) { + var titles = self.wiki.allShadowTitles(); + return self.lookup(tag).filter(function(title) { + return titles.indexOf(title) !== -1; + }); + }; + this.wiki.eachTiddlerPlusShadows.byTag = function(tag) { + return self.lookup(tag).slice(0); + }; + this.wiki.eachShadowPlusTiddlers.byTag = function(tag) { + return self.lookup(tag).slice(0); + }; +}; + +/* +Tear down and then rebuild the index as if all tiddlers have changed +*/ +TagIndexer.prototype.rebuild = function() { + var self = this; + // Hashmap by tag of array of {isSorted:, titles:[]} + this.index = Object.create(null); + // Add all the tags + this.wiki.eachTiddlerPlusShadows(function(tiddler,title) { + $tw.utils.each(tiddler.fields.tags,function(tag) { + if(!self.index[tag]) { + self.index[tag] = {isSorted: false, titles: [title]}; + } else { + self.index[tag].titles.push(title); + } + }); + }); +}; + +/* +Update the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create) +oldTiddler: old tiddler value, or null for creation +newTiddler: new tiddler value, or null for deletion +*/ +TagIndexer.prototype.update = function(oldTiddler,newTiddler) { + // Don't update the index if it has yet to be built + if(this.index === null) { + return; + } + var self = this, + title = oldTiddler ? oldTiddler.fields.title : newTiddler.fields.title; + // Handle changes to the tags + var oldTiddlerTags = (oldTiddler ? (oldTiddler.fields.tags || []) : []), + newTiddlerTags = (newTiddler ? (newTiddler.fields.tags || []) : []); + $tw.utils.each(oldTiddlerTags,function(oldTag) { + if(newTiddlerTags.indexOf(oldTag) === -1) { + // Deleted tag + var indexRecord = self.index[oldTag], + pos = indexRecord.titles.indexOf(title); + if(pos !== -1) { + indexRecord.titles.splice(pos,1); + } + } + }); + $tw.utils.each(newTiddlerTags,function(newTag) { + if(oldTiddlerTags.indexOf(newTag) === -1) { + // New tag + var indexRecord = self.index[newTag]; + if(!indexRecord) { + self.index[newTag] = {isSorted: false, titles: [title]}; + } else { + indexRecord.titles.push(title); + indexRecord.isSorted = false; + } + } + }); + // Handle changes to the list field of tags + var oldTiddlerList = (oldTiddler ? (oldTiddler.fields.list || []) : []), + newTiddlerList = (newTiddler ? (newTiddler.fields.list || []) : []); + if(!$tw.utils.isArrayEqual(oldTiddlerList,newTiddlerList)) { + if(self.index[title]) { + self.index[title].isSorted = false; + } + } +}; + +// Lookup the given tag returning an ordered list of tiddler titles +TagIndexer.prototype.lookup = function(tag) { + // Update the index if it has yet to be built + if(this.index === null) { + this.rebuild(); + } + var indexRecord = this.index[tag]; + if(indexRecord) { + if(!indexRecord.isSorted) { + if(this.wiki.sortByList) { + indexRecord.titles = this.wiki.sortByList(indexRecord.titles,tag); + } + indexRecord.isSorted = true; + } + return indexRecord.titles; + } else { + return []; + } +}; + +exports.TagIndexer = TagIndexer; + +})(); diff --git a/core/modules/startup/load-modules.js b/core/modules/startup/load-modules.js index 6dc703111..e2234d0ac 100644 --- a/core/modules/startup/load-modules.js +++ b/core/modules/startup/load-modules.js @@ -27,6 +27,7 @@ exports.startup = function() { $tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap("tiddlerfield"); $tw.modules.applyMethods("tiddlermethod",$tw.Tiddler.prototype); $tw.modules.applyMethods("wikimethod",$tw.Wiki.prototype); + $tw.wiki.addIndexersToWiki(); $tw.modules.applyMethods("tiddlerdeserializer",$tw.Wiki.tiddlerDeserializerModules); $tw.macros = $tw.modules.getModulesByTypeAsHashmap("macro"); $tw.wiki.initParsers(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 74ba082d4..508ca07f3 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -27,6 +27,16 @@ var widget = require("$:/core/modules/widgets/widget.js"); var USER_NAME_TITLE = "$:/status/UserName", TIMESTAMP_DISABLE_TITLE = "$:/config/TimestampDisable"; +/* +Add available indexers to this wiki +*/ +exports.addIndexersToWiki = function() { + var self = this; + $tw.utils.each($tw.modules.applyMethods("indexer"),function(Indexer,name) { + self.addIndexer(new Indexer(self),name); + }); +}; + /* Get the value of a text reference. Text references can have any of these forms: @@ -478,11 +488,18 @@ exports.getOrphanTitles = function() { Retrieves a list of the tiddler titles that are tagged with a given tag */ exports.getTiddlersWithTag = function(tag) { - var self = this; - return this.getGlobalCache("taglist-" + tag,function() { - var tagmap = self.getTagMap(); - return self.sortByList(tagmap[tag],tag); - }); + // Try to use the indexer + var self = this, + tagIndexer = this.getIndexer("TagIndexer"), + results = tagIndexer && tagIndexer.lookup(tag); + if(!results) { + // If not available, perform a manual scan + results = this.getGlobalCache("taglist-" + tag,function() { + var tagmap = self.getTagMap(); + return self.sortByList(tagmap[tag],tag); + }); + } + return results; }; /* diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 41755e920..12fed1656 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -33,9 +33,20 @@ describe("Filter tests", function() { ); }); + describe("With no indexers", function() { + var wiki = setupWiki({enableIndexers: []}); + runTests(wiki); + }); + describe("With all indexers", function() { + var wiki = setupWiki(); + wiki.getIndexer("FieldIndexer").setMaxIndexedValueLength(8); // Note that JoeBloggs is 9, and JohnDoe is 7 + runTests(wiki); + }); + +function setupWiki(wikiOptions) { // Create a wiki - var wiki = new $tw.Wiki({ + var wiki = new $tw.Wiki($tw.utils.extend({ shadowTiddlers: { "$:/TiddlerFive": { tiddler: new $tw.Tiddler({title: "$:/TiddlerFive", @@ -64,8 +75,8 @@ describe("Filter tests", function() { }) } } - }); - + }, + wikiOptions)); // Add a few tiddlers wiki.addTiddler({ title: "TiddlerOne", @@ -99,8 +110,11 @@ describe("Filter tests", function() { list: "[[Tiddler Three]] [[TiddlerOne]]", empty: "", modifier: "JohnDoe"}); + return wiki; +} - // Our tests +// Our tests +function runTests(wiki) { it("should handle the ~ prefix", function() { expect(wiki.filterTiddlers("[modifier[JoeBloggs]] ~[[No such tiddler]]").join(",")).toBe("TiddlerOne"); @@ -131,6 +145,12 @@ describe("Filter tests", function() { expect(wiki.filterTiddlers("[field:modifier[JoeBloggs]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[!field:modifier[JoeBloggs]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); expect(wiki.filterTiddlers("[!is[system]!field:modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[modifier[JohnDoe]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!is[system]!modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[field:modifier[JohnDoe]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!field:modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!is[system]!field:modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); }); it("should handle the regexp operator", function() { @@ -342,7 +362,7 @@ describe("Filter tests", function() { type: "widget", children: [{type: "widget", children: []}] },{ - wiki: $tw.wiki, + wiki: wiki, document: $tw.document }); rootWidget.makeChildWidgets(); @@ -388,6 +408,8 @@ describe("Filter tests", function() { expect(wiki.filterTiddlers("1 2 3 4 +[min[2]]").join(",")).toBe("1,2,2,2"); }); +} + }); })(); diff --git a/editions/test/tiddlers/tests/test-tags.js b/editions/test/tiddlers/tests/test-tags.js index 77a27535a..324a1e51a 100644 --- a/editions/test/tiddlers/tests/test-tags.js +++ b/editions/test/tiddlers/tests/test-tags.js @@ -14,8 +14,21 @@ Tests the tagging mechanism. describe("Tag tests", function() { +describe("With no indexers", function() { + var wikiOptions = {enableIndexers: []}, + wiki = setupWiki(wikiOptions); + runTests(wiki,wikiOptions); +}); + +describe("With all indexers", function() { + var wikiOptions = {enableIndexers: []}, + wiki = setupWiki(); + runTests(wiki,wikiOptions); +}); + +function setupWiki(wikiOptions) { // Create a wiki - var wiki = new $tw.Wiki(); + var wiki = new $tw.Wiki(wikiOptions); // Add a few tiddlers wiki.addTiddler({ @@ -79,8 +92,11 @@ describe("Tag tests", function() { text: "Another tiddler", tags: ["TiddlerSeventh"], "list-after": "Tiddler Three"}); + return wiki; +} // Our tests +function runTests(wiki,wikiOptions) { it("should handle custom tag ordering", function() { expect(wiki.filterTiddlers("[tag[TiddlerSeventh]]").join(",")).toBe("Tiddler10,TiddlerOne,Tiddler Three,Tiddler11,Tiddler9,a fourth tiddler"); @@ -88,7 +104,7 @@ describe("Tag tests", function() { // Tests for issue (#3296) it("should apply tag ordering in order of dependency", function () { - var wiki = new $tw.Wiki(); + var wiki = new $tw.Wiki(wikiOptions); wiki.addTiddler({ title: "A", text: "", tags: "sortTag", "list-after": "B"}); wiki.addTiddler({ title: "B", text: "", tags: "sortTag", "list-after": "C"}); @@ -98,7 +114,7 @@ describe("Tag tests", function() { }); it("should handle self-referencing dependency without looping infinitely", function() { - var wiki = new $tw.Wiki(); + var wiki = new $tw.Wiki(wikiOptions); wiki.addTiddler({ title: "A", text: "", tags: "sortTag"}); wiki.addTiddler({ title: "B", text: "", tags: "sortTag", "list-after": "B"}); @@ -108,7 +124,7 @@ describe("Tag tests", function() { }); it("should handle empty list-after ordering", function() { - var wiki = new $tw.Wiki(); + var wiki = new $tw.Wiki(wikiOptions); wiki.addTiddler({ title: "A", text: "", tags: "sortTag", "list-after": ""}); wiki.addTiddler({ title: "B", text: "", tags: "sortTag"}); @@ -121,7 +137,7 @@ describe("Tag tests", function() { // with list-after/before, we need to make sure we don't accidentally // handle that external tiddler, or that reference. it("should gracefully handle dependencies that aren't in the tag list", function() { - var wiki = new $tw.Wiki(); + var wiki = new $tw.Wiki(wikiOptions); wiki.addTiddler({ title: "A", text: "", tags: "sortTag"}); wiki.addTiddler({ title: "B", text: "", tags: "sortTag", "list-after": "Z"}); @@ -132,13 +148,16 @@ describe("Tag tests", function() { }); it("should handle javascript-specific titles", function() { - var wiki = new $tw.Wiki(); + var wiki = new $tw.Wiki(wikiOptions); wiki.addTiddler({ title: "A", text: "", tags: "sortTag"}); wiki.addTiddler({ title: "__proto__", text: "", tags: "sortTag", "list-before": ""}); expect(wiki.filterTiddlers("[tag[sortTag]]").join(',')).toBe("__proto__,A"); }); + +} + }); })(); From 698733a4ad18ad86aa93478556cf2589d55b25f7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Wed, 29 May 2019 09:01:11 +0100 Subject: [PATCH 0112/2376] Fix crashes when localStorage not available As reported by @bimlas in https://github.com/Jermolene/TiddlyWiki5/issues/3945#issuecomment-496797809 --- plugins/tiddlywiki/browser-storage/rawmarkup.js | 6 ++++++ plugins/tiddlywiki/dynaview/dynaview.js | 15 ++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/tiddlywiki/browser-storage/rawmarkup.js b/plugins/tiddlywiki/browser-storage/rawmarkup.js index bebc76688..629100c84 100644 --- a/plugins/tiddlywiki/browser-storage/rawmarkup.js +++ b/plugins/tiddlywiki/browser-storage/rawmarkup.js @@ -27,6 +27,12 @@ if(Object.prototype.hasOwnProperty.call($tw.hooks.names,hookName)) { function hookBootTiddlersLoaded() { var url = window.location.pathname, log = []; + // Check that browser storage is available + try { + window.localStorage; + } catch(e) { + return; + } // Step through each browsder storage item for(var index=0; index Date: Wed, 29 May 2019 09:37:48 +0100 Subject: [PATCH 0113/2376] More browser storage fixes See 698733a4a --- plugins/tiddlywiki/browser-storage/startup.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/tiddlywiki/browser-storage/startup.js b/plugins/tiddlywiki/browser-storage/startup.js index 8871e777c..f76e7fc98 100644 --- a/plugins/tiddlywiki/browser-storage/startup.js +++ b/plugins/tiddlywiki/browser-storage/startup.js @@ -80,6 +80,7 @@ function saveTiddlerToLocalStorage(title,options) { // Get the tiddler var tiddler = $tw.wiki.getTiddler(title); if(tiddler) { + console.log("browser-storage: Saving",title); // Get the JSON of the tiddler var json = JSON.stringify(tiddler.getFieldStrings()); // Try to save it to local storage @@ -90,18 +91,21 @@ function saveTiddlerToLocalStorage(title,options) { // Complain if we failed var msg = $tw.wiki.getTiddlerText(QUOTA_EXCEEDED_ALERT_TITLE,DEFAULT_QUOTA_EXCEEDED_ALERT_PREFIX + title + DEFAULT_QUOTA_EXCEEDED_ALERT_SUFFIX); if(options.logger) { - options.logger.alert(msg); + options.logger.alert(msg); } // No point in keeping old values around for this tiddler window.localStorage.removeItem(options.prefix + title); } else { - throw e; + console.log("Browser-storage error:",e); } } - console.log("browser-storage: Saving",title); } else { - window.localStorage.removeItem(options.prefix + title); console.log("browser-storage: Deleting",title); + try { + window.localStorage.removeItem(options.prefix + title); + } catch(e) { + console.log("Browser-storage error:",e); + } } } From 496610aa490a5dc33613b9117faf1499d1af3777 Mon Sep 17 00:00:00 2001 From: donmor Date: Thu, 30 May 2019 16:42:57 +0800 Subject: [PATCH 0114/2376] Signing the CLA for @donmor (#3957) --- licenses/cla-individual.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index cf8c61298..fb9a592a9 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -354,4 +354,6 @@ Jesse Weinstein, @JesseWeinstein, 2019/01/14 Adam Sherwood, @admls, 2019/01/27 -Joshua Fontany, @joshuafontany, 2019/03/07 \ No newline at end of file +Joshua Fontany, @joshuafontany, 2019/03/07 + +Dong Zhihong, @donmor, 2019/05/29 From 5b09881679200dc78e5962a0588c8f214ddedbbb Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Thu, 30 May 2019 16:54:57 +0100 Subject: [PATCH 0115/2376] Add new deletetiddlers command --- core/language/en-GB/Help/deletetiddlers.tid | 8 ++++ core/modules/commands/deletetiddlers.js | 42 +++++++++++++++++++ .../commands/DeleteTiddlersCommand.tid | 7 ++++ 3 files changed, 57 insertions(+) create mode 100644 core/language/en-GB/Help/deletetiddlers.tid create mode 100644 core/modules/commands/deletetiddlers.js create mode 100644 editions/tw5.com/tiddlers/commands/DeleteTiddlersCommand.tid diff --git a/core/language/en-GB/Help/deletetiddlers.tid b/core/language/en-GB/Help/deletetiddlers.tid new file mode 100644 index 000000000..4bcf2123d --- /dev/null +++ b/core/language/en-GB/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: Deletes a group of tiddlers + +Deletes a group of tiddlers identified by a filter. + +``` +--deletetiddlers +``` diff --git a/core/modules/commands/deletetiddlers.js b/core/modules/commands/deletetiddlers.js new file mode 100644 index 000000000..3d8b855d9 --- /dev/null +++ b/core/modules/commands/deletetiddlers.js @@ -0,0 +1,42 @@ +/*\ +title: $:/core/modules/commands/deletetiddlers.js +type: application/javascript +module-type: command + +Command to delete tiddlers + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.info = { + name: "deletetiddlers", + synchronous: true +}; + +var Command = function(params,commander,callback) { + this.params = params; + this.commander = commander; + this.callback = callback; +}; + +Command.prototype.execute = function() { + if(this.params.length < 1) { + return "Missing filter"; + } + var self = this, + wiki = this.commander.wiki, + filter = this.params[0], + tiddlers = wiki.filterTiddlers(filter); + $tw.utils.each(tiddlers,function(title) { + wiki.deleteTiddler(title); + }); + return null; +}; + +exports.Command = Command; + +})(); diff --git a/editions/tw5.com/tiddlers/commands/DeleteTiddlersCommand.tid b/editions/tw5.com/tiddlers/commands/DeleteTiddlersCommand.tid new file mode 100644 index 000000000..b2a90ecf9 --- /dev/null +++ b/editions/tw5.com/tiddlers/commands/DeleteTiddlersCommand.tid @@ -0,0 +1,7 @@ +title: DeleteTiddlersCommand +tags: Commands +created: 20190530155418184 +modified: 20190530155418184 +caption: deletetiddlers + +{{$:/language/Help/deletetiddlers}} From 5f6abad3c5681cf4b06170fe59e7e03a0c3d6f39 Mon Sep 17 00:00:00 2001 From: Bram Chen Date: Fri, 31 May 2019 15:36:19 +0800 Subject: [PATCH 0116/2376] Update chinese translations (#3959) * Add chinese translations for Saving/GitHub/ServerURL * Improve simplified chinese wording * Add chinese help text for deletetiddlers command --- languages/zh-Hans/Help/deletetiddlers.tid | 8 ++++++++ languages/zh-Hant/Help/deletetiddlers.tid | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 languages/zh-Hans/Help/deletetiddlers.tid create mode 100644 languages/zh-Hant/Help/deletetiddlers.tid diff --git a/languages/zh-Hans/Help/deletetiddlers.tid b/languages/zh-Hans/Help/deletetiddlers.tid new file mode 100644 index 000000000..4620016bf --- /dev/null +++ b/languages/zh-Hans/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: 删除一组条目 + +删除由筛选器标识的一组条目。 + +``` +--deletetiddlers +``` diff --git a/languages/zh-Hant/Help/deletetiddlers.tid b/languages/zh-Hant/Help/deletetiddlers.tid new file mode 100644 index 000000000..6fd2d7b04 --- /dev/null +++ b/languages/zh-Hant/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: 刪除一組條目 + +刪除由篩選器標識的一組條目。 + +``` +--deletetiddlers +``` From 147d7589315b8129309c408ca96958843b1d91a9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Fri, 31 May 2019 08:38:34 +0100 Subject: [PATCH 0117/2376] Add version tags for deletetiddlers and savewikifolders commands @BramChen -- I added the tag to the Chinese translations, too, let me know if it is not right. --- core/language/en-GB/Help/deletetiddlers.tid | 2 +- core/language/en-GB/Help/savewikifolder.tid | 2 +- languages/zh-Hans/Help/deletetiddlers.tid | 2 +- languages/zh-Hans/Help/savewikifolder.tid | 2 +- languages/zh-Hant/Help/deletetiddlers.tid | 2 +- languages/zh-Hant/Help/savewikifolder.tid | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/language/en-GB/Help/deletetiddlers.tid b/core/language/en-GB/Help/deletetiddlers.tid index 4bcf2123d..ec2b2cf94 100644 --- a/core/language/en-GB/Help/deletetiddlers.tid +++ b/core/language/en-GB/Help/deletetiddlers.tid @@ -1,7 +1,7 @@ title: $:/language/Help/deletetiddlers description: Deletes a group of tiddlers -Deletes a group of tiddlers identified by a filter. +<<.from-version "5.1.20">> Deletes a group of tiddlers identified by a filter. ``` --deletetiddlers diff --git a/core/language/en-GB/Help/savewikifolder.tid b/core/language/en-GB/Help/savewikifolder.tid index 2f6f034f1..bda1d19a3 100644 --- a/core/language/en-GB/Help/savewikifolder.tid +++ b/core/language/en-GB/Help/savewikifolder.tid @@ -1,7 +1,7 @@ title: $:/language/Help/savewikifolder description: Saves a wiki to a new wiki folder -Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration: +<<.from-version "5.1.20">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration: ``` --savewikifolder [] diff --git a/languages/zh-Hans/Help/deletetiddlers.tid b/languages/zh-Hans/Help/deletetiddlers.tid index 4620016bf..237d7e310 100644 --- a/languages/zh-Hans/Help/deletetiddlers.tid +++ b/languages/zh-Hans/Help/deletetiddlers.tid @@ -1,7 +1,7 @@ title: $:/language/Help/deletetiddlers description: 删除一组条目 -删除由筛选器标识的一组条目。 +<<.from-version "5.1.20">> 删除由筛选器标识的一组条目。 ``` --deletetiddlers diff --git a/languages/zh-Hans/Help/savewikifolder.tid b/languages/zh-Hans/Help/savewikifolder.tid index 3e511fe18..912eb6c67 100644 --- a/languages/zh-Hans/Help/savewikifolder.tid +++ b/languages/zh-Hans/Help/savewikifolder.tid @@ -1,7 +1,7 @@ title: $:/language/Help/savewikifolder description: 将维基保存到一个新的维基文件夹 -将当前维基保存为一个维基文件夹,包含条目、插件和配置: +<<.from-version "5.1.20">> 将当前维基保存为一个维基文件夹,包含条目、插件和配置: ``` --savewikifolder [] diff --git a/languages/zh-Hant/Help/deletetiddlers.tid b/languages/zh-Hant/Help/deletetiddlers.tid index 6fd2d7b04..2a2db8653 100644 --- a/languages/zh-Hant/Help/deletetiddlers.tid +++ b/languages/zh-Hant/Help/deletetiddlers.tid @@ -1,7 +1,7 @@ title: $:/language/Help/deletetiddlers description: 刪除一組條目 -刪除由篩選器標識的一組條目。 +<<.from-version "5.1.20">> 刪除由篩選器標識的一組條目。 ``` --deletetiddlers diff --git a/languages/zh-Hant/Help/savewikifolder.tid b/languages/zh-Hant/Help/savewikifolder.tid index ecd3c1ec9..6e3053962 100644 --- a/languages/zh-Hant/Help/savewikifolder.tid +++ b/languages/zh-Hant/Help/savewikifolder.tid @@ -1,7 +1,7 @@ title: $:/language/Help/savewikifolder description: 將維基儲存到一個新的維基資料夾 -將當前維基儲存為一個維基資料夾,包含條目、插件和配置: +<<.from-version "5.1.20">> 將當前維基儲存為一個維基資料夾,包含條目、插件和配置: ``` --savewikifolder [] From 6c08fec2ee814715610fb7f2533b27d3f71a3d77 Mon Sep 17 00:00:00 2001 From: twMat Date: Fri, 31 May 2019 17:05:35 +0200 Subject: [PATCH 0118/2376] Update Saving on TiddlySpot.tid (#3960) Included mention of community created (i.e created by me) "shortcut" to set up new TW5 on TS. --- .../tiddlers/saving/Saving on TiddlySpot.tid | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid index 607ae87ae..af1ce8957 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid @@ -8,9 +8,17 @@ method: save caption: TiddlySpot description: Free online service for hosting TiddlyWiki files -TiddlySpot is a free hosting service for TiddlyWiki documents from Simon and Daniel Baird. The easiest way to get started is to sign up for a new wiki at http://tiddlyspot.com - by default you'll get the latest release of TiddlyWiki Classic. +[[TiddlySpot|http://tiddlyspot.com]] is a free hosting service for TiddlyWiki documents from Simon Baird and Daniel Baird. -You can upload an existing TiddlyWiki5 document from your local disc to TiddlySpot by following these steps: +! Setting up a TiddlyWiki on TiddlySpot +To set up a [[TiddlyWiki Classic|TiddlyWikiClassic]], you merely create a new wiki at http://tiddlyspot.com + +!!TiddlyWiki5 on TiddlySpot +~TiddlyWiki5 also functions well on ~TiddlySpot but this version is not offered directly in the TiddlySpot set-up. + +The simplest way to create a new ~TiddlySpot with ~TiddlyWiki5 is probably through the community created site http://tiddlywiki5.tiddlyspot.com + +Alternatively, you can upload an existing ~TiddlyWiki5 document from your local disc to ~TiddlySpot by following these steps: # Sign up for a new wiki at http://tiddlyspot.com/, and remember the wiki name and password # Open your locally stored TiddlyWiki document in your browser @@ -43,4 +51,4 @@ The upgrade operation falls foul of a security restriction in Firefox. Until thi * After you've uploaded your local document once, further editing and saving of the online version hosted on TiddlySpot should work with any modern browser of your choice. ** Don't forget to fill in the TiddlySpot wikiname and password in your TiddlySpot TiddlyWiki control panel for any new browser you want to use for saving changes -* //See also : [[Upgrading]]// \ No newline at end of file +* //See also : [[Upgrading]]// From 736ac9052d3f67ef042799e0ada7840abe9d5290 Mon Sep 17 00:00:00 2001 From: LordRatte Date: Fri, 31 May 2019 19:11:17 +0200 Subject: [PATCH 0119/2376] Update TiddlyDrive info on Tiddlywiki.com (#3961) * Update TiddlyDrive info * Accept Licence --- .../TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid | 5 +++-- licenses/cla-individual.md | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid index 211ed4519..5fee9c4cf 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid @@ -3,14 +3,15 @@ created: 20171109172705241 delivery: Google Drive Add-on description: Google Drive add-on to save TiddlyWiki files method: save -modified: 20171113134317867 +modified: 20190531161707260 tags: Saving plugins Resources Android Chrome Firefox InternetExplorer iOS Linux Mac Opera PHP Safari Windows title: TiddlyDrive Add-on for Google Drive by Joshua Stubbs type: text/vnd.tiddlywiki -url: https://chrome.google.com/webstore/detail/tiddly-drive/oaphhjhbbabdjnpjpiliepphpmnioolo +url: https://lordratte.gitlab.io/tiddlydrive/#installation-guide An add-on for Google Drive that allows TiddlyWiki files stored there to be opened and saved directly +To find out how to add it to your account, go to the project's info page: {{!!url}} <<< diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index fb9a592a9..90dd309e0 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -357,3 +357,5 @@ Adam Sherwood, @admls, 2019/01/27 Joshua Fontany, @joshuafontany, 2019/03/07 Dong Zhihong, @donmor, 2019/05/29 + +Joshua Stubbs, @LordRatte, 2019/05/31 From 427b56039bc5726a7e89fbeb69b6d9459e1cad66 Mon Sep 17 00:00:00 2001 From: Xavier Cazin Date: Sun, 2 Jun 2019 21:49:50 +0200 Subject: [PATCH 0120/2376] fr-FR translations of Help on the savewikifolder and deletetiddlers commands (#3966) * fr-FR translation of Help on the savewikifolder command * fr-FR translation of Help on the deletetiddlers command --- languages/fr-FR/Help/deletetiddlers.tid | 8 ++++++++ languages/fr-FR/Help/savewikifolder.tid | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 languages/fr-FR/Help/deletetiddlers.tid create mode 100644 languages/fr-FR/Help/savewikifolder.tid diff --git a/languages/fr-FR/Help/deletetiddlers.tid b/languages/fr-FR/Help/deletetiddlers.tid new file mode 100644 index 000000000..b00ccc9b7 --- /dev/null +++ b/languages/fr-FR/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: Supprime un groupe de tiddlers + +<<.from-version "5.1.20">> Supprime un groupe de tiddlers identifiés par un filtre. + +``` +--deletetiddlers +``` diff --git a/languages/fr-FR/Help/savewikifolder.tid b/languages/fr-FR/Help/savewikifolder.tid new file mode 100644 index 000000000..aefd1b901 --- /dev/null +++ b/languages/fr-FR/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: Enregistre un wiki dans un nouveau dossier wiki + +<<.from-version "5.1.20">> Enregistre le wiki courant sous la forme d'un dossier wiki, comprenant les tiddlers, les plugins et les informations de configuration : + +``` +--savewikifolder [] +``` + +* Le dossier wiki cible doit être vide ou inexistant +* Le filtre spécifie les tiddlers à inclure. Il est optionnel et vaut par défaut `[all[tiddlers]]` +* Les plugins appartenant à la bibliothèque officielle de plugins sont remplacés par des références à ces plugins dans le fichier `tiddlywiki.info` +* Les plugins sur mesure sont déballés dans leur propre dossier + +On utilise typiquement cette commande avec la commande `--load` pour convertir un fichier TiddlyWiki HTML en un dossier wiki : + +``` +tiddlywiki --load ./monwiki.html --savewikifolder ./mondossierwiki +``` From 9c2726c530d6eed58f9df405f59a5ee6c14045ef Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Mon, 3 Jun 2019 13:28:41 +0100 Subject: [PATCH 0121/2376] Remove $tw.perf.log() banner under Node.js --- core/modules/utils/performance.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/modules/utils/performance.js b/core/modules/utils/performance.js index c9d53d60f..9908be4d7 100644 --- a/core/modules/utils/performance.js +++ b/core/modules/utils/performance.js @@ -20,7 +20,9 @@ function Performance(enabled) { } Performance.prototype.showGreeting = function() { - this.logger.log("Execute $tw.perf.log(); to see filter execution timings"); + if($tw.browser) { + this.logger.log("Execute $tw.perf.log(); to see filter execution timings"); + } }; /* From 72c64013c7a6d3203a562475d896869dd0f67c34 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Mon, 3 Jun 2019 13:28:59 +0100 Subject: [PATCH 0122/2376] Fix control panel stylesheets tab to use $:/state/... instead of $:/config/... --- core/wiki/peek-stylesheets.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/peek-stylesheets.tid b/core/wiki/peek-stylesheets.tid index 06ef57cf4..37bb37e77 100644 --- a/core/wiki/peek-stylesheets.tid +++ b/core/wiki/peek-stylesheets.tid @@ -3,7 +3,7 @@ title: $:/snippets/peek-stylesheets \define expandable-stylesheets-list()
        <$list filter="[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]"> -<$vars state=<>> +<$vars state=<>> <$set name="state" value={{{ [addsuffix] }}}>
      1. <$reveal type="match" state=<> text="yes" tag="span"> @@ -58,7 +58,7 @@ title: $:/snippets/peek-stylesheets
      \end -<$vars modeState=<>> +<$vars modeState=<>> <$reveal type="nomatch" state=<> text="expanded" tag="div"> <$button set=<> setTo="expanded" class="tc-btn-invisible">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}} From 28c732d2be77a79cf5b1a177e2b022a8e960cb9f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Tue, 4 Jun 2019 12:33:01 +0100 Subject: [PATCH 0123/2376] Improve action-createtiddler to return a draft title too --- core/modules/widgets/action-createtiddler.js | 4 ++++ core/modules/widgets/navigator.js | 10 +--------- core/modules/wiki.js | 15 +++++++++++++++ .../widgets/ActionCreateTiddlerWidget.tid | 3 ++- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/core/modules/widgets/action-createtiddler.js b/core/modules/widgets/action-createtiddler.js index 01010b940..879f0d68d 100644 --- a/core/modules/widgets/action-createtiddler.js +++ b/core/modules/widgets/action-createtiddler.js @@ -37,6 +37,7 @@ Compute the internal state of the widget CreateTiddlerWidget.prototype.execute = function() { this.actionBaseTitle = this.getAttribute("$basetitle"); this.actionSaveTitle = this.getAttribute("$savetitle"); + this.actionSaveDraftTitle = this.getAttribute("$savedrafttitle"); this.actionTimestamp = this.getAttribute("$timestamp","yes") === "yes"; }; @@ -73,6 +74,9 @@ CreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) { if(this.actionSaveTitle) { this.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable("currentTiddler")); } + if(this.actionSaveDraftTitle) { + this.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable("currentTiddler")); + } return true; // Action was invoked }; diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index e792341d9..33745b898 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -279,15 +279,7 @@ NavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) { Generate a title for the draft of a given tiddler */ NavigatorWidget.prototype.generateDraftTitle = function(title) { - var c = 0, - draftTitle, - username = this.wiki.getTiddlerText("$:/status/UserName"), - attribution = username ? " by " + username : ""; - do { - draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'" + attribution; - c++; - } while(this.wiki.tiddlerExists(draftTitle)); - return draftTitle; + return this.wiki.generateDraftTitle(title); }; // Take a tiddler out of edit mode, saving the changes diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 508ca07f3..f77d68fa2 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1402,6 +1402,21 @@ exports.addToStory = function(title,fromTitle,storyTitle,options) { story.addToStory(title,fromTitle,options); }; +/* +Generate a title for the draft of a given tiddler +*/ +exports.generateDraftTitle = function(title) { + var c = 0, + draftTitle, + username = this.getTiddlerText("$:/status/UserName"), + attribution = username ? " by " + username : ""; + do { + draftTitle = "Draft " + (c ? (c + 1) + " " : "") + "of '" + title + "'" + attribution; + c++; + } while(this.tiddlerExists(draftTitle)); + return draftTitle; +}; + /* Invoke the available upgrader modules titles: array of tiddler titles to be processed diff --git a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid index a7d223e4e..ed2ffbb90 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid @@ -1,6 +1,6 @@ caption: action-createtiddler created: 20161020152745942 -modified: 20161020155119177 +modified: 20190604113017742 tags: Widgets ActionWidgets title: ActionCreateTiddlerWidget type: text/vnd.tiddlywiki @@ -21,6 +21,7 @@ The ''action-createtiddler'' widget is invisible. Any content within it is ignor |!Attribute |!Description | |$basetitle |The initial title that will be attempted. If a tiddler with that title already exists, then a numerical counter is added to the title and incremented until it is unique| |$savetitle |A text reference identifying a field or index into which the title of the newly created tiddler will be stored after it is created | +|$savedrafttitle |<<.from-version "5.1.20">> A text reference identifying a field or index into which the draft title associated with the newly created tiddler will be stored after it is created. This is useful when using a sequence of action widgets to create a new tiddler, put it into edit mode, and position it within the list of its parent tag | |$timestamp |Specifies whether the timestamp(s) of the target tiddler will be updated (''modified'' and ''modifier'', plus ''created'' and ''creator'' for newly created tiddlers). Can be "yes" (the default) or "no" | |//{any attributes not starting with $}// |Each attribute name specifies a field to be created in the new tiddler | From abb3c0150526dc0fa786dd16b2e687b76e4ca733 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sat, 8 Jun 2019 13:19:41 +0100 Subject: [PATCH 0124/2376] Catalan Translation update --- languages/ca-ES/CoreReadMe.tid | 7 ++++- languages/ca-ES/Misc.multids | 42 +++++++++++++++++++++++++-- languages/ca-ES/Notifications.multids | 2 ++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/languages/ca-ES/CoreReadMe.tid b/languages/ca-ES/CoreReadMe.tid index a5c51a47e..b626542c6 100644 --- a/languages/ca-ES/CoreReadMe.tid +++ b/languages/ca-ES/CoreReadMe.tid @@ -1,3 +1,8 @@ title: $:/core/readme -Aquest connector conté components del nucli de TiddlyWiki, com ara: els mòduls de codi JavaScript, Icones* Plantilles que calen per la traducció de les cadenes de caràcters localitzables del nucli i de l'interfície d'usuari en Català ("ca-ES") del TiddlyWiki \ No newline at end of file +Aquest connector conté components del nucli de TiddlyWiki, com ara: + +* Els mòduls de codi JavaScript, +* Icones +* Plantilles necessàries per crear la interfície d'usuari de TiddlyWiki +* Traduccions en Català ('ca-ES' ') de les cadenes localitzables utilitzades pel nucli \ No newline at end of file diff --git a/languages/ca-ES/Misc.multids b/languages/ca-ES/Misc.multids index dea380e8c..c4e7c9eca 100644 --- a/languages/ca-ES/Misc.multids +++ b/languages/ca-ES/Misc.multids @@ -1,14 +1,17 @@ title: $:/language/ +AboveStory/ClassicPlugin/Warning: Sembla que intenteu carregar un connector dissenyat per a ~TiddlyWiki Classic. Tingueu en compte que [[aquests connectors no funcionen amb la versió 5.x.x de TiddlyWiki |https://tiddlywiki.com/#TiddlyWikiClassic]]. S'han detectat connectors de ~TiddlyWiki Classic: BinaryWarning/Prompt: Aquest tiddler conté dades binàries -ClassicWarning/Hint: Aquest tiddler està escrit en format de text de TiddlyWiki, que no es totalment compatible amb la versió 5 de TiddlyWiki. Veieu els detalls a https://tiddlywiki.com/static/Upgrading.html . +ClassicWarning/Hint: Aquest tiddler està escrit en format de text de TiddlyWiki, que no es totalment compatible amb la versió 5 de TiddlyWiki. Veieu els detalls a https://tiddlywiki.com/static/Upgrading.html . ClassicWarning/Upgrade/Caption: actualitza CloseAll/Button: tanca-ho tot ConfirmCancelTiddler: Voleu descartar els canvis del tiddler "<$text text=<>/>"? ConfirmDeleteTiddler: Voleu suprimir el tiddler "<$text text=<<title>>/>"? ConfirmEditShadowTiddler: Aneu a editar un TiddlerOmbra. Qualsevol canvi sobreescriurà les opcions per omisió del sistema i complicarà les actualitzacions. Segur que voleu editar "<$text text=<<title>>/>"? ConfirmOverwriteTiddler: Segur que voleu sobreescriure el tiddler "<$text text=<<title>>/>"? +Count: compte DefaultNewTiddlerTitle: Nou Tiddler +Diffs/CountMessage: <<diff-count>> diferències DropMessage: Dexeu-ho anar aquí (o anul·leu-ho amb la tecla 'Escape') Encryption/Cancel: Anul·la Encryption/ConfirmClearPassword: Voleu suprimir la contrasenya? Això eliminarà l'encriptació utilitzada quan es desa aquest wiki @@ -18,14 +21,49 @@ Encryption/PromptSetPassword: Indiqueu una nova contrasenya per aquest TiddlyWik Encryption/RepeatPassword: Repetiu la contrasenya Encryption/SetPassword: Indiqueu la contrasenya Encryption/Username: Usuari +Error/Caption: S'ha produït un error +Error/EditConflict: El fitxer ha canviat al servidor +Error/Filter: S'ha produït un error de filtre +Error/FilterSyntax: S'ha produït un error de sintaxi en l'expressió del filtre +Error/IsFilterOperator: S'ha produït un error del filtre: operant desconegut per a l’operador de filtre "is" +Error/LoadingPluginLibrary: S'ha produït un error en carregar la biblioteca del connector +Error/RecursiveTransclusion: S'ha produït un error de transclusió recursiva en el widget de transclusió +Error/RetrievingSkinny: S'ha produït un error en recuperar la llista de tiddler parcials +Error/SavingToTWEdit: S'ha produït un error en desar a TWEdit +Error/WhileSaving: S'ha produït un error en desar +Error/XMLHttpRequest: Codi d'error XMLHttpRequest +InternalJavaScriptError/Hint: Bé, això és compromès. Es recomana que reiniciau TiddlyWiki actualitzant el navegador +InternalJavaScriptError/Title: Error de JavaScript intern InvalidFieldName: Hi ha caràcters il·legals al nom del camp "<$text text=<<fieldName>>/>". Els camps només poden utilitzar minúscules, digits i els caràcters subratllat (`_`), guió (`-`) i punt (`.`) +LazyLoadingWarning: <p>Tractant de carregar contingut extern de ''<$text text={{!!_canonical_uri}}/>''</p><p>Si aquest missatge no desapareix, o bé el tipus de contingut del tiddler no coincideix amb el tipus de contingut extern o bé esteu utilitzant un navegador que no admet contingut extern per als wikis carregats com a fitxers independents. Mireu https://tiddlywiki.com/#ExternalText</p> +LoginToTiddlySpace: Inicieu sessió a TiddlySpace +Manager/Controls/FilterByTag/None: (cap) +Manager/Controls/FilterByTag/Prompt: Filtra per etiqueta: +Manager/Controls/Order/Prompt: Ordre invers +Manager/Controls/Search/Placeholder: Cerca +Manager/Controls/Search/Prompt: Cerca: +Manager/Controls/Show/Option/Tags: etiquetes +Manager/Controls/Show/Prompt: Mostra: +Manager/Controls/Sort/Prompt: Ordena per: +Manager/Item/Colour: Color +Manager/Item/Fields: Camps +Manager/Item/Icon: Icona +Manager/Item/Icon/None: (cap) +Manager/Item/RawText: Text en brut +Manager/Item/Tags: Etiquetes +Manager/Item/Tools: Eines +Manager/Item/WikifiedText: Text en format Wiki MissingTiddler/Hint: Falta el tiddler "<$text text=<<currentTiddler>>/>" - cliqueu {{||$:/core/ui/Buttons/edit}} per generar-ho -OfficialPluginLibrary: Biblioteca de connectors de ~TiddlyWiki Oficial +OfficialPluginLibrary: Biblioteca Oficial de connectors de ~TiddlyWiki +OfficialPluginLibrary/Hint: La biblioteca de complements oficials de ~TiddlyWiki a tiddlywiki.com. L'equip principal gestiona els connectors, els temes i els paquets d'idioma. PluginReloadWarning: Deseu si us plau {{$:/core/ui/Buttons/save-wiki}} i torneu a carregar {{$:/core/ui/Buttons/refresh}} per tal que els canvis als connectors es puguin activar RecentChanges/DateFormat: DD MMM YYYY SystemTiddler/Tooltip: Aquest és un tiddler del sistema +SystemTiddlers/Include/Prompt: Inclou els tiddlers del sistema TagManager/Colour/Heading: Color +TagManager/Count/Heading: Compte TagManager/Icon/Heading: Icona TagManager/Info/Heading: Informació TagManager/Tag/Heading: Etiqueta UnsavedChangesWarning: Teniu canvis sense desar al TiddlyWiki +Yes: Sí diff --git a/languages/ca-ES/Notifications.multids b/languages/ca-ES/Notifications.multids index f4b1a0a8c..65ccf5225 100644 --- a/languages/ca-ES/Notifications.multids +++ b/languages/ca-ES/Notifications.multids @@ -1,4 +1,6 @@ title: $:/language/Notifications/ +CopiedToClipboard/Failed: No s’ha pogut copiar al porta-retalls. +CopiedToClipboard/Succeeded: S’ha copiat al porta-retalls! Save/Done: S'ha desat el wiki Save/Starting: S'està desant el wiki From 8012a3508f209fbbe68484e30ed65832cf5146b9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 8 Jun 2019 16:38:13 +0100 Subject: [PATCH 0125/2376] Ensure tiddlyspot saver works with local storage disabled Fixes #3955 --- core/modules/utils/dom/dom.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/core/modules/utils/dom/dom.js b/core/modules/utils/dom/dom.js index b45745ae3..b01ea3ac1 100644 --- a/core/modules/utils/dom/dom.js +++ b/core/modules/utils/dom/dom.js @@ -136,22 +136,31 @@ exports.getBoundingPageRect = function(element) { Saves a named password in the browser */ exports.savePassword = function(name,password) { + var done = false; try { - if(window.localStorage) { - localStorage.setItem("tw5-password-" + name,password); - } + window.localStorage.setItem("tw5-password-" + name,password); + done = true; } catch(e) { } + if(!done) { + $tw.savedPasswords = $tw.savedPasswords || Object.create(null); + $tw.savedPasswords[name] = password; + } }; /* Retrieve a named password from the browser */ exports.getPassword = function(name) { + var value; try { - return window.localStorage ? localStorage.getItem("tw5-password-" + name) : ""; + value = window.localStorage.getItem("tw5-password-" + name); } catch(e) { - return ""; + } + if(value !== undefined) { + return value; + } else { + return ($tw.savedPasswords || Object.create(null))[name] || ""; } }; From 1e8a56768f502f4598a6429f22f57ebaa63a23c5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 8 Jun 2019 17:34:06 +0100 Subject: [PATCH 0126/2376] Update ListWidget docs Fixes #3964 --- editions/tw5.com/tiddlers/widgets/ListWidget.tid | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/ListWidget.tid b/editions/tw5.com/tiddlers/widgets/ListWidget.tid index 12a4b6577..272df8d87 100644 --- a/editions/tw5.com/tiddlers/widgets/ListWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ListWidget.tid @@ -1,6 +1,6 @@ caption: list created: 20131024141900000 -modified: 20181013230425882 +modified: 20190608162410684 tags: Widgets Lists title: ListWidget type: text/vnd.tiddlywiki @@ -68,7 +68,14 @@ See GroupedLists for how to generate nested and grouped lists using the ListWidg ! Content and Attributes -The content of the `<$list>` widget is an optional template to use for rendering each tiddler in the list. Alternatively, the template can be specified as a tiddler title in the ``template`` attribute. As a fallback, the default template just displays the tiddler title. +The content of the `<$list>` widget is an optional template to use for rendering each tiddler in the list. + +The action of the list widget depends on the results of the filter combined with several options for specifying the template: + +* If the filter evaluates to an empty list, the text of the ''emptyMessage'' attribute is rendered, and all other templates are ignored +* Otherwise, if the ''template'' attribute is specified then it is taken as the title of a tiddler to use as a template for rendering each item of the list +* Otherwise, if the list widget content is not blank, it is used as a template for rendering each item of the list +* Otherwise, a default template is used consisting of a `<span>` or `<div>` element wrapped around a link to the item |!Attribute |!Description | |filter |The [[tiddler filter|Filters]] to display | From 7590977dd543cba4da062e13e2fe46d5bfd39c0b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 9 Jun 2019 17:09:11 +0100 Subject: [PATCH 0127/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.20.tid | 48 +++++++++++++++---- .../tiddlers/fileformats/TiddlerFiles.tid | 6 ++- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index b98b62f47..48d0af95f 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -13,37 +13,48 @@ Added several new [[Mathematics Operators]] for working with numbers: [[negate|n Added serveral new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[concat|concat Operator]], [[split|split Operator]] and [[join|join Operator]]. -Added several new palettes. See the [[palette manager|$:/core/ui/ControlPanel/Palette]]. - -Added new [[GitHub saver|Saving to GitHub]]. - !! Plugin Improvements New and improved plugins: * New [[BrowserStorage Plugin]] for saving tiddlers in browser local storage * New [[Innerwiki Plugin]] for rendering TiddlyWiki screenshots -* Several improvements to the [[CodeMirror Plugin]]: -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent -* Several improvements to the [[DynaView Plugin]]: -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage +* Several improvements to the [[CodeMirror Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent +* Several improvements to the [[DynaView Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage +* Several improvements to the [[AWS Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/fffd0ee9e17d6b6a561648a42f0f200d4bb04046]] support for specifying credentials !! Translation Improvements New and improved translations: +* Catalan * Chinese Simplified and Chinese Traditional +* French +!! Performance Improvements + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3951]] pluggable index modules to accelerate the [[field Operator]] and the [[tag Operator]] (in tests on a wiki with 60K tiddlers, startup time is reduced by 25% with these optimisations, and refresh time is reduced by a factor of three.) +* [[Optimised|https://github.com/Jermolene/TiddlyWiki5/commit/fddc5d4ee627232441278284ed6bee2f50fe8b26]] the "Classic" storyview to perform much faster when the animation duration is set to zero (approximtely 50% speed improvement was observed in tests opening a storyview with 8,000 entries) +* [[Optimised|https://github.com/Jermolene/TiddlyWiki5/commit/7869546fef7b2ea5fd6fd72feacd565a7f177fb6]] the RevealWidget to avoid using the relatively slow `localeCompare()` method to compare strings +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e8d1fbba6c109ccbeaedc1b34e47677c0ada7529]] [[Performance Instrumentation]] to show the timings for individual filters !! Usability Improvements +* Several new palettes: "Nord", "Solarized Light", "Spartan Day", "Spartan Night" and "Twilight" * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/5a37a84a54f2dc9ccf106309b739cfa693bae3e3]] the plugin library to search all plugin fields * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e5f3301c1c36e8add4ed89ab1bd53a9b68411d3f]] a warning when core JavaScript modules are overwritten via import * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3654]] prompt for references when renaming a tiddler * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0e6855eba8945e023cc5ef19809cfb6d6025627b]] a new filter preset for advanced search for "tiddlers modified this session" +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3898]] support for language aliases with the [[Highlight Plugin]] !! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8c72a28f0c70e6a62387ccdd1431f9225a5fd2de]] (and [[also here|https://github.com/Jermolene/TiddlyWiki5/commit/feab75a6d1723cd6db5912b2902f0ec33c550fb6]]) ability to specify plugins on the command line (see [[Using TiddlyWiki on Node.js]]) +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a saver for [[Saveing to GitHub]] +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/37ea659bf011b1d4a152f54171399d94f5bba3ef]] the [[dumpvariables Macro]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/754c1251a9bdf45e8f64079a4bbdaed2d05be2b7]] new [[variables Operator]] and [[getvariable Operator]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3880]] new [[unusedtitle Macro]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e52a616891977bde142334df2a72c7dd121efb82]] support for widget subclassing -- see https://tiddlywiki.com/prerelease/dev/#WidgetSubclassingMechanism * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/36e76429b1a1d4638374d513430393db5693b932]] new `[is[variable]]` option to the [[is Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/94f143bf643e36e817d1dd5b678515853eed6aca]] optional autofocus for the text inputs in $:/AdvancedSearch (controlled by the same [[Hidden Setting: Search AutoFocus]] as the sidebar search) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3677]] support for deflate and gzip compression to the WebServer ListenCommand @@ -52,6 +63,12 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3822]] outline colour to button, textarea, input * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/477c41f84304ed83245c87068dba3695a5053d62]] ''tooltip'' attribute to SelectWidget * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/348a0bc8bcbf5c42d9b93e5e208696d28fc95cb7]] an option for plugins to disable the initial navigation at startup +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c036c228269fc30d0df770a7c7713fd9af829df7]] $:/info/browser/language to the InfoMechanism +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f047e7cbf50edcf4775b50bdebc3f704970b8cde]] an example of using StartupActions to set the default language +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/12630d4a91b4cc7b1eb846c3afbeda16858df05a]] an option to the LoadCommand to ignore loading errors +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/edd3156430dd94b0ced630a1b70f2e2ef0ff6c36]] importing of JSON files to verify whether they are valid tiddler files, and import them as plain JSON if not +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/373afd72c804b0ffa2779849ba0d278d53e65df4]] new SaveWikiFolderCommand to save a wiki as a [[wiki folder|TiddlyWikiFolders]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5b09881679200dc78e5962a0588c8f214ddedbbb]] new DeleteTiddlersCommand !! Bug Fixes @@ -62,9 +79,16 @@ New and improved translations: * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/72f2a9425197b013ab3664e1679c6763d92d4382]] bug with animation duration being blank * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3806]] Firefox problem with drag and drop placeholders in the "open" tab of the sidebar * [[Ameliorated|https://github.com/Jermolene/TiddlyWiki5/pull/3809]] Firefox problem with sticky placeholder during drag and drop operations +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3819]] [[CodeMirror Plugin]] to use ''tiddler-editor-border'' colour +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/7fcd2f132e91aa375a1fece501b14e991ba1bd4c]] handling of JSON files by the file system adaptor: +** Use `.json` files (instead of `.tid`) for any tiddler whose fields contain values that can't be stored as a .tid file +** Save `application/json` tiddlers as `.json` files +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8012a3508f209fbbe68484e30ed65832cf5146b9]] problem using the TiddlySpot saver with cookies disabled !! Developer Bug Fixes and Improvements +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/3635]] [[Highlight Plugin]] to use highlight.js v9.15.6 + ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: @@ -77,7 +101,15 @@ New and improved translations: * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@diego898|https://github.com/diego898]] * [[@dnebauer|https://github.com/dnebauer]] +* [[@inmysocks|https://github.com/inmysocks]] +* [[@jdjdjdjdjdjd|https://github.com/jdjdjdjdjdjd]] * [[@JesseWeinstein|https://github.com/JesseWeinstein]] +* [[@joshuafontany|https://github.com/joshuafontany]] +* [[@Kartiku|https://github.com/Kartiku]] * [[@kyrias|https://github.com/kyrias]] * [[@MarxSal|https://github.com/MarxSal]] +* [[@MidnightLightning|https://github.com/MidnightLightning]] +* [[@talha131|https://github.com/talha131]] +* [[@telmiger|https://github.com/telmiger]] * [[@the-kenny|https://github.com/the-kenny]] +* [[@xcazin|https://github.com/xcazin]] diff --git a/editions/tw5.com/tiddlers/fileformats/TiddlerFiles.tid b/editions/tw5.com/tiddlers/fileformats/TiddlerFiles.tid index 27b31aa74..b5c66a582 100644 --- a/editions/tw5.com/tiddlers/fileformats/TiddlerFiles.tid +++ b/editions/tw5.com/tiddlers/fileformats/TiddlerFiles.tid @@ -1,5 +1,5 @@ created: 20130825150000000 -modified: 20150216171751154 +modified: 20190609154450433 tags: [[TiddlyWiki on Node.js]] title: TiddlerFiles type: text/vnd.tiddlywiki @@ -74,7 +74,9 @@ For example: ] ``` -//The ContentType `application/json` is used internally for these files// +The ContentType `application/json` is used internally for these files. + +Note that JSON files that do not conform to the tiddler structure will instead be imported as a single tiddler containing the JSON data. !! TiddlyWiki HTML files From 6fdc5c8cb21ca870e7565a82013993a9cd1ff779 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 9 Jun 2019 17:09:35 +0100 Subject: [PATCH 0128/2376] Docs: Update performance notes --- .../tw5.com/tiddlers/workingwithtw/Performance.tid | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index a701a06ac..d4d660132 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -1,5 +1,5 @@ created: 20150330155120127 -modified: 20190316163827303 +modified: 20190609154450433 tags: [[Working with TiddlyWiki]] title: Performance type: text/vnd.tiddlywiki @@ -11,3 +11,15 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d * ''Avoid large tiddlers''. Large bitmaps can significantly slow TiddlyWiki's performance. For example, an image taken with a modern smartphone will often be 5MB or more. Use ExternalImages whenever possible * ''Don't have too many tiddlers open at once''. Every tiddler you have open will require processing to keep it up to date as the store changes (for example, while you type into a draft tiddler). It is particularly easy when using zoomin story view to end up with dozens of tiddlers listed in the ''Open'' tab in the sidebar. Get into the habit of periodically closing all open tiddlers with the {{$:/core/images/close-all-button}} ''close all'' button * ''Use the built-in performance instrumentation''. Studying the [[performance instrumentation|Performance Instrumentation]] results can help highlight performance problems +* Take advantage of indexed filter operators. The following constructions at the start of a filter run will be optimised to run many times faster than otherwise: +** `[all[tiddlers]tag[x]...` +** `[all[shadows]tag[x]...` +** `[all[tiddlers+shadows]tag[x]...` +** `[all[shadows+tiddlers]tag[x]...` +** `[all[tiddlers]field:y[x]...` +** `[all[shadows]field:y[x]...` +** `[all[tiddlers+shadows]field:y[x]...` +** `[all[shadows+tiddlers]field:y[x]...` +** Note that the field indexer currently defaults to indexing field values of less than 128 characters; longer values can still be searched for, but no index will be constructed +** Also note that the “field” operator is also used when the operator name is a fieldname, so, for example, `[all[shadows+tiddlers]caption[x]...` is optimised. + From 55bc6e086f0a18fb111484004da2e5b78dcb3cac Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 9 Jun 2019 17:26:34 +0100 Subject: [PATCH 0129/2376] Tweaks and fixes for the release note --- .../prerelease/tiddlers/Release 5.1.20.tid | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 48d0af95f..64de96a02 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. -Added serveral new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[concat|concat Operator]], [[split|split Operator]] and [[join|join Operator]]. +Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[concat|concat Operator]], [[split|split Operator]] and [[join|join Operator]]. !! Plugin Improvements @@ -20,8 +20,8 @@ New and improved plugins: * New [[BrowserStorage Plugin]] for saving tiddlers in browser local storage * New [[Innerwiki Plugin]] for rendering TiddlyWiki screenshots * Several improvements to the [[CodeMirror Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent -* Several improvements to the [[DynaView Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage -* Several improvements to the [[AWS Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/fffd0ee9e17d6b6a561648a42f0f200d4bb04046]] support for specifying credentials +* Several improvements to the [[Dynaview Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage +* Several improvements to the [[Amazon Web Services Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/fffd0ee9e17d6b6a561648a42f0f200d4bb04046]] support for specifying credentials !! Translation Improvements @@ -49,15 +49,12 @@ New and improved translations: !! Hackability Improvements -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8c72a28f0c70e6a62387ccdd1431f9225a5fd2de]] (and [[also here|https://github.com/Jermolene/TiddlyWiki5/commit/feab75a6d1723cd6db5912b2902f0ec33c550fb6]]) ability to specify plugins on the command line (see [[Using TiddlyWiki on Node.js]]) -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a saver for [[Saveing to GitHub]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a saver for [[Saving to GitHub]] * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/37ea659bf011b1d4a152f54171399d94f5bba3ef]] the [[dumpvariables Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/754c1251a9bdf45e8f64079a4bbdaed2d05be2b7]] new [[variables Operator]] and [[getvariable Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3880]] new [[unusedtitle Macro]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e52a616891977bde142334df2a72c7dd121efb82]] support for widget subclassing -- see https://tiddlywiki.com/prerelease/dev/#WidgetSubclassingMechanism * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/36e76429b1a1d4638374d513430393db5693b932]] new `[is[variable]]` option to the [[is Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/94f143bf643e36e817d1dd5b678515853eed6aca]] optional autofocus for the text inputs in $:/AdvancedSearch (controlled by the same [[Hidden Setting: Search AutoFocus]] as the sidebar search) -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3677]] support for deflate and gzip compression to the WebServer ListenCommand * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3756]] optional ''tabindex'' attribute to simple, framed and CodeMirror text editor engines * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3758]] ''tabindex'' attributes to edit templates * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3822]] outline colour to button, textarea, input @@ -65,10 +62,7 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/348a0bc8bcbf5c42d9b93e5e208696d28fc95cb7]] an option for plugins to disable the initial navigation at startup * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c036c228269fc30d0df770a7c7713fd9af829df7]] $:/info/browser/language to the InfoMechanism * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f047e7cbf50edcf4775b50bdebc3f704970b8cde]] an example of using StartupActions to set the default language -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/12630d4a91b4cc7b1eb846c3afbeda16858df05a]] an option to the LoadCommand to ignore loading errors * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/edd3156430dd94b0ced630a1b70f2e2ef0ff6c36]] importing of JSON files to verify whether they are valid tiddler files, and import them as plain JSON if not -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/373afd72c804b0ffa2779849ba0d278d53e65df4]] new SaveWikiFolderCommand to save a wiki as a [[wiki folder|TiddlyWikiFolders]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5b09881679200dc78e5962a0588c8f214ddedbbb]] new DeleteTiddlersCommand !! Bug Fixes @@ -80,13 +74,22 @@ New and improved translations: * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3806]] Firefox problem with drag and drop placeholders in the "open" tab of the sidebar * [[Ameliorated|https://github.com/Jermolene/TiddlyWiki5/pull/3809]] Firefox problem with sticky placeholder during drag and drop operations * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3819]] [[CodeMirror Plugin]] to use ''tiddler-editor-border'' colour +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8012a3508f209fbbe68484e30ed65832cf5146b9]] problem using the TiddlySpot saver with cookies disabled + +!! Node.js Bug Fixes and Improvements + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/373afd72c804b0ffa2779849ba0d278d53e65df4]] new SaveWikiFolderCommand to save a wiki as a [[wiki folder|TiddlyWikiFolders]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5b09881679200dc78e5962a0588c8f214ddedbbb]] new DeleteTiddlersCommand +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8c72a28f0c70e6a62387ccdd1431f9225a5fd2de]] (and [[also here|https://github.com/Jermolene/TiddlyWiki5/commit/feab75a6d1723cd6db5912b2902f0ec33c550fb6]]) ability to specify plugins on the command line (see [[Using TiddlyWiki on Node.js]]) +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3677]] support for deflate and gzip compression to the WebServer ListenCommand +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/12630d4a91b4cc7b1eb846c3afbeda16858df05a]] an option to the LoadCommand to ignore loading errors * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/7fcd2f132e91aa375a1fece501b14e991ba1bd4c]] handling of JSON files by the file system adaptor: ** Use `.json` files (instead of `.tid`) for any tiddler whose fields contain values that can't be stored as a .tid file ** Save `application/json` tiddlers as `.json` files -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8012a3508f209fbbe68484e30ed65832cf5146b9]] problem using the TiddlySpot saver with cookies disabled !! Developer Bug Fixes and Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e52a616891977bde142334df2a72c7dd121efb82]] support for widget subclassing -- see https://tiddlywiki.com/prerelease/dev/#WidgetSubclassingMechanism * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/3635]] [[Highlight Plugin]] to use highlight.js v9.15.6 ! Contributors From ac1d5b828dac302be31087da95452d1c8eaf8b76 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 10 Jun 2019 17:52:26 +0100 Subject: [PATCH 0130/2376] Fix regression in 7fcd2f132 Previously we saved tiddlers as .tid files using this template that explicitly excludes the "bag" field: https://github.com/Jermolene/TiddlyWiki5/blob/master/core/templates/tid-tiddler.tid Now we generate both .tid and .json files programmatically, and so we have to explicitly exclude the bag field --- core/modules/utils/filesystem.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index a2011c433..fbba11f2b 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -308,14 +308,14 @@ exports.saveTiddlerToFile = function(tiddler,fileInfo,callback) { if(err) { return callback(err); } - fs.writeFile(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text"]}),"utf8",callback); + fs.writeFile(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text","bag"]}),"utf8",callback); }); } else { // Save the tiddler as a self contained templated file if(fileInfo.type === "application/x-tiddler") { - fs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8",callback); + fs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text","bag"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8",callback); } else { - fs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings()],null,$tw.config.preferences.jsonSpaces),"utf8",callback); + fs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: ["bag"]})],null,$tw.config.preferences.jsonSpaces),"utf8",callback); } } }; @@ -332,13 +332,13 @@ exports.saveTiddlerToFileSync = function(tiddler,fileInfo) { // Save the tiddler as a separate body and meta file var typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/plain"] || {encoding: "utf8"}; fs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding); - fs.writeFileSync(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text"]}),"utf8"); + fs.writeFileSync(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text","bag"]}),"utf8"); } else { // Save the tiddler as a self contained templated file if(fileInfo.type === "application/x-tiddler") { - fs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8"); + fs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text","bag"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8"); } else { - fs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings()],null,$tw.config.preferences.jsonSpaces),"utf8"); + fs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: ["bag"]})],null,$tw.config.preferences.jsonSpaces),"utf8"); } } }; From 37bb75f0cf446d62eb45d07b9f9b0aa14814a43f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 10 Jun 2019 17:54:20 +0100 Subject: [PATCH 0131/2376] Add support for `=` prefix for filter runs that doesn't remove duplicates --- core/modules/filters.js | 6 +++++- editions/tw5.com/tiddlers/concepts/Dominant Append.tid | 6 +++++- .../tiddlers/filters/syntax/Filter Expression.tid | 10 ++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index a1c4d8750..b00082bd1 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -119,7 +119,7 @@ exports.parseFilter = function(filterString) { p = 0, // Current position in the filter string match; var whitespaceRegExp = /(\s+)/mg, - operandRegExp = /((?:\+|\-|~)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg; + operandRegExp = /((?:\+|\-|~|=)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg; while(p < filterString.length) { // Skip any whitespace whitespaceRegExp.lastIndex = p; @@ -248,6 +248,10 @@ exports.compileFilter = function(filterString) { return function(results,source,widget) { $tw.utils.pushTop(results,operationSubFunction(source,widget)); }; + case "=": // The results of the operation are pushed into the result without deduplication + return function(results,source,widget) { + Array.prototype.push.apply(results,operationSubFunction(source,widget)); + }; case "-": // The results of this operation are removed from the main result return function(results,source,widget) { $tw.utils.removeArrayEntries(results,operationSubFunction(source,widget)); diff --git a/editions/tw5.com/tiddlers/concepts/Dominant Append.tid b/editions/tw5.com/tiddlers/concepts/Dominant Append.tid index ed0eb8544..59e79d6c7 100644 --- a/editions/tw5.com/tiddlers/concepts/Dominant Append.tid +++ b/editions/tw5.com/tiddlers/concepts/Dominant Append.tid @@ -1,5 +1,5 @@ created: 20150123220223000 -modified: 20150917193646675 +modified: 20190610165255223 tags: Filters title: Dominant Append type: text/vnd.tiddlywiki @@ -9,3 +9,7 @@ type: text/vnd.tiddlywiki This is done in such a way that, if a title would be duplicated, the earlier copy of that title is discarded. The titles being appended are dominant. For example, if a selection contains `Andrew Becky Clara Daniel` and `Andrew Barney Clara Daisy` is then appended to it, the result is `Becky Daniel Andrew Barney Clara Daisy`. + +This behaviour can cause unexpected results when working with [[Mathematics Operators]]. For example, `1 2 3 +[sum[]]` evaluates to `6`, as expected. But `1 1 1 +[sum[]]` evaluates to `1`. Removing the `+[sum[]]` from each filter reveals the problem: `1 2 3` evaluates to the list `1`, `2`, `3`, while `1 1 1` evaluates to the single item `1` due to de-duplication. + +In such situations, the `=` prefix can be used to disable the de-duplication. For example, `=1 =1 =1 +[sum[]]` evaluates to `3` as expected. Alternatively, the [[split Operator]] can be used: `[[1,1,1]split[,]sum[]]`. diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index 8550fa394..a01aa56ec 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20181120125803533 +modified: 20190610165329062 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki <$railroad text=""" [{: [: [[whitespace|"Filter Whitespace"]] ] - ("+"|"~"|:-|"-") + ("+"|"~"|:-|"-"|"=") [[run|"Filter Run"]] }] """/> @@ -17,6 +17,7 @@ A <<.def "filter expression">> is the outermost level of the [[filter syntax|Fil If a run has: * no prefix, its output titles are [[dominantly appended|Dominant Append]] to the filter's output +* <<.from-version "5.1.20">> the prefix `=`, output titles are appended to the filter's output without de-duplication * the prefix `-`, output titles are <<.em removed>> from the filter's output (if such tiddlers exist) * the prefix `+`, it receives the filter output so far as its input; its output then <<.em "replaces">> all filter ouput so far and forms the input for the next run * <<.from-version "5.1.18">> the prefix `~`, if the filter output so far is an empty list then the output titles of the run are [[dominantly appended|Dominant Append]] to the filter's output. If the filter output so far is not an empty list then the run is ignored @@ -24,7 +25,8 @@ If a run has: In technical / logical terms: |!Run |!Interpretation |!Output | -|`run` |union of sets |... OR run | +|`run` |de-duplicated union of sets |... OR run | +|`=run` |union of sets without de-duplication |... OR run | |`+run` |intersection of sets |... AND run | |`-run` |difference of sets |... AND NOT run | |`~run` |else |... ELSE run | @@ -32,7 +34,7 @@ In technical / logical terms: The input of a run is normally a list of all the non-[[shadow|ShadowTiddlers]] tiddler titles in the wiki (in no particular order). But the `+` prefix can change this: |Prefix|Input|h -|`-`, `~` or none| <$link to="all Operator">`[all[]]`</$link> tiddler titles, unless otherwise determined by the first [[filter operator|Filter Operators]]| +|`-`, `~`, `=` or none| <$link to="all Operator">`[all[]]`</$link> tiddler titles, unless otherwise determined by the first [[filter operator|Filter Operators]]| |`+`|the filter output of all previous runs so far| Precisely because of varying inputs, be aware that both prefixes `-` and `+` do not behave inverse to one another! From 18fe112da7d3ac210a5a0b9cf73fe9050717d4e3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 10 Jun 2019 17:54:46 +0100 Subject: [PATCH 0132/2376] Extend the enlist operator to optionally not de-duplicate --- core/modules/filters/enlist.js | 11 ++++++++++- editions/tw5.com/tiddlers/filters/enlist Operator.tid | 4 +++- .../filters/examples/enlist Operator (Examples).tid | 6 ++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/modules/filters/enlist.js b/core/modules/filters/enlist.js index c5e67d54c..0baaa9366 100644 --- a/core/modules/filters/enlist.js +++ b/core/modules/filters/enlist.js @@ -16,7 +16,16 @@ Filter operator returning its operand parsed as a list Export our filter function */ exports.enlist = function(source,operator,options) { - var list = $tw.utils.parseStringArray(operator.operand); + var allowDuplicates = false; + switch(operator.suffix) { + case "raw": + allowDuplicates = true; + break; + case "dedupe": + allowDuplicates = false; + break; + } + var list = $tw.utils.parseStringArray(operator.operand,allowDuplicates); if(operator.prefix === "!") { var results = []; source(function(tiddler,title) { diff --git a/editions/tw5.com/tiddlers/filters/enlist Operator.tid b/editions/tw5.com/tiddlers/filters/enlist Operator.tid index f148edde7..18df375f6 100644 --- a/editions/tw5.com/tiddlers/filters/enlist Operator.tid +++ b/editions/tw5.com/tiddlers/filters/enlist Operator.tid @@ -1,6 +1,6 @@ caption: enlist created: 20170221144241063 -modified: 20170221151340420 +modified: 20190610165246154 op-input: ignored op-neg-input: a [[selection of titles|Title Selection]] op-neg-output: those input titles that are <<.em not>> listed in <<.place L>> @@ -8,6 +8,8 @@ op-output: the titles stored as a [[title list|Title List]] at <<.place L>> op-parameter: a [[title list|Title List]] op-parameter-name: L op-purpose: select titles from the operand interpreted as a [[title list|Title List]] +op-suffix: <<.from-version "5.1.20">> `dedupe` (the default) to remove duplicates, `raw` to leave duplicates untouched +op-suffix-name: D tags: [[Filter Operators]] [[Field Operators]] [[Selection Constructors]] [[Negatable Operators]] title: enlist Operator type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/enlist Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/enlist Operator (Examples).tid index a3f9a289a..6cf43f57e 100644 --- a/editions/tw5.com/tiddlers/filters/examples/enlist Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/enlist Operator (Examples).tid @@ -1,8 +1,10 @@ created: 20170221144328467 -modified: 20170221151620898 +modified: 20190610165309565 tags: [[enlist Operator]] [[Operator Examples]] title: enlist Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[enlist[one two three]addsuffix[!]]">> -<<.operator-example 2 "[enlist{$:/StoryList!!list}]">> +<<.operator-example 2 "[enlist[one one one]]">> +<<.operator-example 3 "[enlist:raw[one one one]]">> +<<.operator-example 4 "[enlist{$:/StoryList!!list}]">> From cd412d8ccb7ee829e23b73b8d34f789691c07726 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 10 Jun 2019 18:24:38 +0100 Subject: [PATCH 0133/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.20.tid | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 64de96a02..5092b4259 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -13,6 +13,11 @@ Added several new [[Mathematics Operators]] for working with numbers: [[negate|n Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[concat|concat Operator]], [[split|split Operator]] and [[join|join Operator]]. +There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter resulst, making it much easier to work with the new mathematics and string operators: + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/37bb75f0cf446d62eb45d07b9f9b0aa14814a43f]] support for new `=` prefix for merging filter runs without removing duplicates +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/18fe112da7d3ac210a5a0b9cf73fe9050717d4e3]] option for the [[enlist Operator]] to not remove duplicates + !! Plugin Improvements New and improved plugins: @@ -22,6 +27,7 @@ New and improved plugins: * Several improvements to the [[CodeMirror Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent * Several improvements to the [[Dynaview Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage * Several improvements to the [[Amazon Web Services Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/fffd0ee9e17d6b6a561648a42f0f200d4bb04046]] support for specifying credentials +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3898]] support for language aliases with the [[Highlight Plugin]] !! Translation Improvements @@ -45,7 +51,6 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e5f3301c1c36e8add4ed89ab1bd53a9b68411d3f]] a warning when core JavaScript modules are overwritten via import * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3654]] prompt for references when renaming a tiddler * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0e6855eba8945e023cc5ef19809cfb6d6025627b]] a new filter preset for advanced search for "tiddlers modified this session" -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3898]] support for language aliases with the [[Highlight Plugin]] !! Hackability Improvements From f02352f6a19b41057044ad5a25b47429ea4f6144 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 10 Jun 2019 21:04:21 +0100 Subject: [PATCH 0134/2376] Use default link text when link widget has no content Fixes #3974 --- core/modules/widgets/link.js | 9 ++++++++- editions/tw5.com/tiddlers/widgets/LinkWidget.tid | 8 ++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/core/modules/widgets/link.js b/core/modules/widgets/link.js index ad519ac62..6d3ffe093 100755 --- a/core/modules/widgets/link.js +++ b/core/modules/widgets/link.js @@ -183,7 +183,14 @@ LinkWidget.prototype.execute = function() { this.isShadow = this.wiki.isShadowTiddler(this.to); this.hideMissingLinks = (this.getVariable("tv-show-missing-links") || "yes") === "no"; // Make the child widgets - this.makeChildWidgets(); + var templateTree; + if(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) { + templateTree = this.parseTreeNode.children; + } else { + // Default template is a link to the title + templateTree = [{type: "text", text: this.to}]; + } + this.makeChildWidgets(templateTree); }; /* diff --git a/editions/tw5.com/tiddlers/widgets/LinkWidget.tid b/editions/tw5.com/tiddlers/widgets/LinkWidget.tid index b704d77b1..bebebef6a 100644 --- a/editions/tw5.com/tiddlers/widgets/LinkWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/LinkWidget.tid @@ -1,6 +1,6 @@ caption: link created: 20131024141900000 -modified: 20171212063130159 +modified: 20190610195105615 tags: Widgets title: LinkWidget type: text/vnd.tiddlywiki @@ -9,6 +9,10 @@ The `link` widget generates links to tiddlers. (Use the HTML `<a>` element to ge ! Content and Attributes +The content of the link widget is rendered within the `<a>` tag representing the link. If the content is empty then the title of the target tiddler is rendered as the default. + +For example, `<$link to="HelloThere"/>` is equivalent to `<$link to="HelloThere">HelloThere</$link>` and `<$link/>` is equivalent to `<$link to=<<currentTiddler>>><$view field="title"/></$link>`. + |!Attribute |!Description | |to |The title of the target tiddler for the link (defaults to the [[current tiddler|Current Tiddler]]) | |aria-label |Optional accessibility label | @@ -19,7 +23,7 @@ The `link` widget generates links to tiddlers. (Use the HTML `<a>` element to ge |class|Optional CSS classes //in addition to// the default classes (see below)| |overrideClass|<<.from-version "5.1.16">> Optional CSS classes //instead of// the default classes | -The content of the link widget is rendered within the `<a>` tag. The draggable functionality is equivalent to using the DraggableWidget with the ''tiddler'' attribute set to the link target. +The draggable functionality is equivalent to using the DraggableWidget with the ''tiddler'' attribute set to the link target. The default value of the tooltip attribute is supplied by the <<.vlink tv-wikilink-tooltip>> variable. From 4a66ecbf6f9d4a3bc62fea0b7847881494617c0b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 10 Jun 2019 21:06:25 +0100 Subject: [PATCH 0135/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.20.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 5092b4259..59d060239 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -36,6 +36,7 @@ New and improved translations: * Catalan * Chinese Simplified and Chinese Traditional * French +* US English !! Performance Improvements @@ -68,6 +69,7 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c036c228269fc30d0df770a7c7713fd9af829df7]] $:/info/browser/language to the InfoMechanism * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f047e7cbf50edcf4775b50bdebc3f704970b8cde]] an example of using StartupActions to set the default language * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/edd3156430dd94b0ced630a1b70f2e2ef0ff6c36]] importing of JSON files to verify whether they are valid tiddler files, and import them as plain JSON if not +* [[Enhanced|https://github.com/Jermolene/TiddlyWiki5/issues/3974]] the ListWidget to use the title of the target tiddler as a default if it has no content !! Bug Fixes From dd7837d1647f0669d5939b83e67b41d2dea2e72b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 11 Jun 2019 09:38:14 +0100 Subject: [PATCH 0136/2376] Fix issue with allafter operator Fixes #3962 --- core/modules/filters/x-listops.js | 4 +-- editions/test/tiddlers/tests/test-filters.js | 30 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index e742e3430..dc290a42e 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -95,7 +95,7 @@ Extended filter operators to manipulate the current list. exports.allafter = function (source, operator) { var results = prepare_results(source), index = results.indexOf(operator.operand); - return (index === -1 || index > (results.length - 2)) ? [] : + return (index === -1) ? [] : (operator.suffix) ? results.slice(index) : results.slice(index + 1); }; @@ -106,7 +106,7 @@ Extended filter operators to manipulate the current list. exports.allbefore = function (source, operator) { var results = prepare_results(source), index = results.indexOf(operator.operand); - return (index < 0) ? [] : + return (index === -1) ? [] : (operator.suffix) ? results.slice(0, index + 1) : results.slice(0, index); }; diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 12fed1656..da2998107 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -408,6 +408,36 @@ function runTests(wiki) { expect(wiki.filterTiddlers("1 2 3 4 +[min[2]]").join(",")).toBe("1,2,2,2"); }); + it("should handle the allafter operator", function() { + expect(wiki.filterTiddlers("1 2 3 4 +[allafter[]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter:include[]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter[1]]").join(",")).toBe("2,3,4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter:include[1]]").join(",")).toBe("1,2,3,4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter[2]]").join(",")).toBe("3,4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter:include[2]]").join(",")).toBe("2,3,4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter[3]]").join(",")).toBe("4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter:include[3]]").join(",")).toBe("3,4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter[4]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter:include[4]]").join(",")).toBe("4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter[5]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allafter:include[5]]").join(",")).toBe(""); + }); + + it("should handle the allbefore operator", function() { + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore[]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore:include[]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore[1]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore:include[1]]").join(",")).toBe("1"); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore[2]]").join(",")).toBe("1"); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore:include[2]]").join(",")).toBe("1,2"); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore[3]]").join(",")).toBe("1,2"); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore:include[3]]").join(",")).toBe("1,2,3"); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore[4]]").join(",")).toBe("1,2,3"); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore:include[4]]").join(",")).toBe("1,2,3,4"); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore[5]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1 2 3 4 +[allbefore:include[5]]").join(",")).toBe(""); + }); + } }); From 86387a918525270362a0a9e25e5334f1d8293932 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 11 Jun 2019 17:18:18 +0100 Subject: [PATCH 0137/2376] Add some error trapping to maths operators --- core/modules/filters/math.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/modules/filters/math.js b/core/modules/filters/math.js index d07192d91..801ebf5ed 100644 --- a/core/modules/filters/math.js +++ b/core/modules/filters/math.js @@ -76,33 +76,33 @@ exports.min = makeNumericBinaryOperator( ); exports.fixed = makeNumericBinaryOperator( - function(a,b) {return Number.prototype.toFixed.call(a,b);} + function(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));} ); exports.precision = makeNumericBinaryOperator( - function(a,b) {return Number.prototype.toPrecision.call(a,b);} + function(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));} ); exports.exponential = makeNumericBinaryOperator( - function(a,b) {return Number.prototype.toExponential.call(a,b);} + function(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));} ); -exports.sum = makeNumericArrayOperator( +exports.sum = makeNumericReducingOperator( function(accumulator,value) {return accumulator + value}, 0 // Initial value ); -exports.product = makeNumericArrayOperator( +exports.product = makeNumericReducingOperator( function(accumulator,value) {return accumulator * value}, 1 // Initial value ); -exports.maxall = makeNumericArrayOperator( +exports.maxall = makeNumericReducingOperator( function(accumulator,value) {return Math.max(accumulator,value)}, -Infinity // Initial value ); -exports.minall = makeNumericArrayOperator( +exports.minall = makeNumericReducingOperator( function(accumulator,value) {return Math.min(accumulator,value)}, Infinity // Initial value ); @@ -118,7 +118,7 @@ function makeNumericBinaryOperator(fnCalc) { }; } -function makeNumericArrayOperator(fnCalc,initialValue) { +function makeNumericReducingOperator(fnCalc,initialValue) { initialValue = initialValue || 0; return function(source,operator,options) { var result = []; From 7fcdc83bae1a06195036fd67876ffcf070d95572 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 11 Jun 2019 17:18:51 +0100 Subject: [PATCH 0138/2376] First batch of docs for the maths operators --- .../tiddlers/filters/Mathematics Operators.tid | 9 ++++++--- editions/tw5.com/tiddlers/filters/add.tid | 16 ++++++++-------- .../tiddlers/filters/divide Operator.tid | 15 +++++++++++++++ .../examples/add Operator (Examples).tid | 8 ++++++++ .../examples/divide Operator (Examples).tid | 8 ++++++++ .../exponential Operator (Examples).tid | 9 +++++++++ .../examples/fixed Operator (Examples).tid | 8 ++++++++ .../examples/max Operator (Examples).tid | 8 ++++++++ .../examples/maxall Operator (Examples).tid | 8 ++++++++ .../examples/min Operator (Examples).tid | 8 ++++++++ .../examples/minall Operator (Examples).tid | 8 ++++++++ .../examples/multiply Operator (Examples).tid | 8 ++++++++ .../examples/precision Operator (Examples).tid | 9 +++++++++ .../examples/product Operator (Examples).tid | 8 ++++++++ .../examples/remainder Operator (Examples).tid | 8 ++++++++ .../examples/subtract Operator (Examples).tid | 8 ++++++++ .../examples/sum Operator (Examples).tid | 8 ++++++++ .../tiddlers/filters/exponential Operator.tid | 17 +++++++++++++++++ .../tw5.com/tiddlers/filters/fixed Operator.tid | 17 +++++++++++++++++ .../tw5.com/tiddlers/filters/max Operator.tid | 17 +++++++++++++++++ .../tiddlers/filters/maxall Operator.tid | 15 +++++++++++++++ .../tw5.com/tiddlers/filters/min Operator.tid | 17 +++++++++++++++++ .../tiddlers/filters/minall Operator.tid | 15 +++++++++++++++ .../tiddlers/filters/multiply Operator.tid | 15 +++++++++++++++ .../tiddlers/filters/precision Operator.tid | 17 +++++++++++++++++ .../tiddlers/filters/product Operator.tid | 13 +++++++++++++ .../tiddlers/filters/remainder Operator.tid | 15 +++++++++++++++ .../tiddlers/filters/subtract Operator.tid | 15 +++++++++++++++ .../tw5.com/tiddlers/filters/sum Operator.tid | 13 +++++++++++++ 29 files changed, 329 insertions(+), 11 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/divide Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/exponential Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/fixed Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/max Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/maxall Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/min Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/minall Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/multiply Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/precision Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/product Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/remainder Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/subtract Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/sum Operator.tid diff --git a/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid b/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid index 6a4b3c5c7..8fb021dbe 100644 --- a/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid +++ b/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid @@ -1,7 +1,8 @@ created: 20190206140446821 -modified: 20190206140446821 -title: Mathematics Operators +modified: 20190611155838557 tags: Filters +title: Mathematics Operators +type: text/vnd.tiddlywiki <<.from-version "5.1.20">>The mathematics filter operators allow numerical calculations to be performed within filters. @@ -11,6 +12,8 @@ The mathematics operators interpret their arguments as numbers according to the * If the argument cannot be interpreted as a number, the value 0 is used (e.g. `foo` is interpreted as the number 0) * The special values `Infinity` and `-Infinity` can be used to represent positive and negative infinity respectively +<$macrocall $name=".warning" _="Some filter operators remove duplicate items which can cause unexpected results when using the mathematics operators. See [[Dominant Append]] for details."/> + The mathematics operators take three different forms: * ''Unary operators'' apply an operation to each number in the input list (e.g. negate, truncate, sign) @@ -20,7 +23,7 @@ The mathematics operators take three different forms: * ''Binary operators'' apply an operation and operand to each number in the input list (e.g. add, multiply, remainder) ** <<.inline-operator-example "1 2 3 4 +[add[3]]">> ** <<.inline-operator-example "1 2 3 4 +[multiply[8]]">> -* ''Array operators'' apply an operation to all of the numbers in the input list, returning a single result (e.g. sum, product) +* ''Reducing operators'' apply an operation to all of the numbers in the input list, returning a single result (e.g. sum, product) ** <<.inline-operator-example "1 2 3 4 +[sum[]]">> ** <<.inline-operator-example "1 2 3 4 +[product[]]">> diff --git a/editions/tw5.com/tiddlers/filters/add.tid b/editions/tw5.com/tiddlers/filters/add.tid index 187e0483b..3bed37537 100644 --- a/editions/tw5.com/tiddlers/filters/add.tid +++ b/editions/tw5.com/tiddlers/filters/add.tid @@ -1,15 +1,15 @@ +caption: add created: 20190206140446821 -modified: 20190206140446821 +modified: 20190611125053329 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, but with <<.place N>> added to each one +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, add to each the numeric value of the operand tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] title: add Operator type: text/vnd.tiddlywiki -caption: add -op-purpose: treating each input title as a number, add to each the numeric value of the operand -op-input: a [[selection of titles|Title Selection]] -op-parameter: a number -op-parameter-name: N -op-output: the input as numbers, but with <<.place N>> added to each one -<<.from-version "5.1.20">> +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. <<.operator-examples "add">> diff --git a/editions/tw5.com/tiddlers/filters/divide Operator.tid b/editions/tw5.com/tiddlers/filters/divide Operator.tid new file mode 100644 index 000000000..9218c9a99 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/divide Operator.tid @@ -0,0 +1,15 @@ +caption: divide +created: 20190611125839100 +modified: 20190611125922960 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, but with each one divided by <<.place N>> +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, divide them by the numeric value of the operand +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: divide Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "divide">> diff --git a/editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid new file mode 100644 index 000000000..480c3d67f --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611125225770 +modified: 20190611125525466 +tags: [[after Operator]] [[Operator Examples]] +title: add Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[23]add[19]]">> +<<.operator-example 2 "=1 =2 =3 =4 +[add[4]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid new file mode 100644 index 000000000..4204c8eec --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611125929173 +modified: 20190611130146154 +tags: [[after Operator]] [[Operator Examples]] +title: divide Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[355]divide[113]]">> +<<.operator-example 2 "=1 =2 =3 =4 +[divide[2]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid new file mode 100644 index 000000000..20a936167 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190611154509136 +modified: 20190611154545304 +tags: [[after Operator]] [[Operator Examples]] +title: exponential Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "123456789 +[exponential[4]]">> +<<.operator-example 2 "123456789 +[exponential[13]]">> +<<.operator-example 3 "1.23E23 +[exponential[90]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid new file mode 100644 index 000000000..e662e4c28 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611150610846 +modified: 20190611150743047 +tags: [[after Operator]] [[Operator Examples]] +title: fixed Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "10.123456789 +[fixed[5]]">> +<<.operator-example 2 "[[355]divide[113]fixed[7]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid new file mode 100644 index 000000000..0a4524c12 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611130905752 +modified: 20190611130938471 +tags: [[after Operator]] [[Operator Examples]] +title: max Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[23]max[32]]">> +<<.operator-example 2 "=1 =2 =3 =4 +[max[3]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid new file mode 100644 index 000000000..6f87c182f --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611160949615 +modified: 20190611161010568 +tags: [[after Operator]] [[Operator Examples]] +title: maxall Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "=1 =2 =3 =4 =5 +[maxall[]]">> +<<.operator-example 2 "[tag[HelloThere]get[text]length[]maxall[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid new file mode 100644 index 000000000..5d3638846 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611131138259 +modified: 20190611131149542 +tags: [[after Operator]] [[Operator Examples]] +title: min Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[23]min[32]]">> +<<.operator-example 2 "=1 =2 =3 =4 +[min[3]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid new file mode 100644 index 000000000..c1d594cce --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611161051108 +modified: 20190611161107239 +tags: [[after Operator]] [[Operator Examples]] +title: minall Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "=1 =2 =3 =4 =5 +[minall[]]">> +<<.operator-example 2 "[tag[HelloThere]get[text]length[]minall[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid new file mode 100644 index 000000000..9638b47e0 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611125743568 +modified: 20190611125757767 +tags: [[after Operator]] [[Operator Examples]] +title: multiply Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[23]multiply[19]]">> +<<.operator-example 2 "=1 =2 =3 =4 +[multiply[4]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid new file mode 100644 index 000000000..96a17356f --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190611151444751 +modified: 20190611154248537 +tags: [[after Operator]] [[Operator Examples]] +title: precision Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "123456789 +[precision[3]]">> +<<.operator-example 2 "123456789 +[precision[13]]">> +<<.operator-example 3 "1.23E23 +[precision[90]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid new file mode 100644 index 000000000..5f8bbd42a --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611160221390 +modified: 20190611160243829 +tags: [[after Operator]] [[Operator Examples]] +title: product Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "=1 =2 =3 =4 =5 +[product[]]">> +<<.operator-example 2 "[tag[HelloThere]get[text]length[]product[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid new file mode 100644 index 000000000..b88cecc4f --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611130110805 +modified: 20190611130121033 +tags: [[after Operator]] [[Operator Examples]] +title: remainder Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[23]remainder[3]]">> +<<.operator-example 2 "=1 =2 =3 =4 +[remainder[2]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid new file mode 100644 index 000000000..3ed88db33 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611125619962 +modified: 20190611125638512 +tags: [[after Operator]] [[Operator Examples]] +title: subtract Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[23]subtract[19]]">> +<<.operator-example 2 "=1 =2 =3 =4 +[subtract[4]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid new file mode 100644 index 000000000..2f97564d7 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611160000682 +modified: 20190611160139594 +tags: [[after Operator]] [[Operator Examples]] +title: sum Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "=1 =2 =3 =4 =5 +[sum[]]">> +<<.operator-example 2 "[tag[HelloThere]get[text]length[]sum[]]">> diff --git a/editions/tw5.com/tiddlers/filters/exponential Operator.tid b/editions/tw5.com/tiddlers/filters/exponential Operator.tid new file mode 100644 index 000000000..ab1342b3b --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/exponential Operator.tid @@ -0,0 +1,17 @@ +caption: exponential +created: 20190611154259136 +modified: 20190611154505880 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers converted to exponential notation with <<.place N>> digits +op-parameter: a number +op-parameter-name: N +op-purpose: convert each number to exponential notation with <<.place N>> digits +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: exponential Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +The ''exponential'' operator returns a string representation of the input number in exponential notation with the specified number of digits. If a number has more digits than requested, the number is rounded to the nearest number represented by the specified number of digits + +<<.operator-examples "exponential">> diff --git a/editions/tw5.com/tiddlers/filters/fixed Operator.tid b/editions/tw5.com/tiddlers/filters/fixed Operator.tid new file mode 100644 index 000000000..240ae61db --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/fixed Operator.tid @@ -0,0 +1,17 @@ +caption: fixed +created: 20190611150505495 +modified: 20190611150931872 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers converted to fixed point notation with <<.place N>> digits after the decimal point +op-parameter: a number +op-parameter-name: N +op-purpose: convert each number to fixed point notation with <<.place N>> digits after the decimal point +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: fixed Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +The ''fixed'' operator returns a string representation of the input number that does not use exponential notation and has exactly the specified number of digits after the decimal place. The number is rounded if necessary, and the fractional part is padded with zeros if necessary so that it has the specified length. + +<<.operator-examples "fixed">> diff --git a/editions/tw5.com/tiddlers/filters/max Operator.tid b/editions/tw5.com/tiddlers/filters/max Operator.tid new file mode 100644 index 000000000..837c456ce --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/max Operator.tid @@ -0,0 +1,17 @@ +caption: max +created: 20190611130631390 +modified: 20190611131047026 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, with any that are less than <<.place N>> being replaced by <<.place N>> +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, take the maximum of its value and the numeric value of the operand +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: max Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +See also the [[min Operator]], and compare with the [[maxall Operator]] and the [[minall Operator]]. + +<<.operator-examples "max">> diff --git a/editions/tw5.com/tiddlers/filters/maxall Operator.tid b/editions/tw5.com/tiddlers/filters/maxall Operator.tid new file mode 100644 index 000000000..d14c6982d --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/maxall Operator.tid @@ -0,0 +1,15 @@ +caption: maxall +created: 20190611160656499 +modified: 20190611160942704 +op-input: a [[selection of titles|Title Selection]] +op-output: the largest of the input numbers +op-purpose: find the largest of a list of numbers +tags: [[Reducing Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: maxall Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +See also the [[minall Operator]], and compare with the [[max Operator]] and the [[min Operator]]. + +<<.operator-examples "maxall">> diff --git a/editions/tw5.com/tiddlers/filters/min Operator.tid b/editions/tw5.com/tiddlers/filters/min Operator.tid new file mode 100644 index 000000000..2966eea39 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/min Operator.tid @@ -0,0 +1,17 @@ +caption: min +created: 20190611131102707 +modified: 20190611131135931 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, with any that are greater than <<.place N>> being replaced by <<.place N>> +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, take the minimum of its value and the numeric value of the operand +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: min Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +See also the [[min Operator]], and compare with the [[maxall Operator]] and the [[minall Operator]]. + +<<.operator-examples "min">> diff --git a/editions/tw5.com/tiddlers/filters/minall Operator.tid b/editions/tw5.com/tiddlers/filters/minall Operator.tid new file mode 100644 index 000000000..83f6ab495 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/minall Operator.tid @@ -0,0 +1,15 @@ +caption: minall +created: 20190611161015153 +modified: 20190611161043817 +op-input: a [[selection of titles|Title Selection]] +op-output: the smallest of the input numbers +op-purpose: find the smallest of a list of numbers +tags: [[Reducing Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: minall Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +See also the [[maxall Operator]], and compare with the [[max Operator]] and the [[min Operator]]. + +<<.operator-examples "minall">> diff --git a/editions/tw5.com/tiddlers/filters/multiply Operator.tid b/editions/tw5.com/tiddlers/filters/multiply Operator.tid new file mode 100644 index 000000000..c555b0a60 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/multiply Operator.tid @@ -0,0 +1,15 @@ +caption: multiply +created: 20190611125657820 +modified: 20190611125816555 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, but with each one multiplied by <<.place N>> +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, multiply it by the numeric value of the operand +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: multiply Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "multiply">> diff --git a/editions/tw5.com/tiddlers/filters/precision Operator.tid b/editions/tw5.com/tiddlers/filters/precision Operator.tid new file mode 100644 index 000000000..168fe8ef8 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/precision Operator.tid @@ -0,0 +1,17 @@ +caption: precision +created: 20190611150935800 +modified: 20190611151434569 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers with <<.place N>> significant digits +op-parameter: a number +op-parameter-name: N +op-purpose: convert each number to a string with <<.place N>> significant digits +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: precision Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +The ''precision'' operator returns a string representation of the input number that has exactly the specified number of significant digits, using whichever is shorter of [[exponential|exponential Operator]] or [[fixed|fixed Operator]] notation. + +<<.operator-examples "precision">> diff --git a/editions/tw5.com/tiddlers/filters/product Operator.tid b/editions/tw5.com/tiddlers/filters/product Operator.tid new file mode 100644 index 000000000..175a8718d --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/product Operator.tid @@ -0,0 +1,13 @@ +caption: product +created: 20190611160145434 +modified: 20190611160215653 +op-input: a [[selection of titles|Title Selection]] +op-output: the result of multiplying together the input as numbers +op-purpose: produce the product of the input numbers +tags: [[Reducing Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: product Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "product">> diff --git a/editions/tw5.com/tiddlers/filters/remainder Operator.tid b/editions/tw5.com/tiddlers/filters/remainder Operator.tid new file mode 100644 index 000000000..ede8b314c --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/remainder Operator.tid @@ -0,0 +1,15 @@ +caption: remainder +created: 20190611130006275 +modified: 20190611130107195 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, but with each replaced by the remainder when dividing it by <<.place N>> +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, return the remainder when divided by the numeric value of the operand +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: remainder Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "remainder">> diff --git a/editions/tw5.com/tiddlers/filters/subtract Operator.tid b/editions/tw5.com/tiddlers/filters/subtract Operator.tid new file mode 100644 index 000000000..c386b90ff --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/subtract Operator.tid @@ -0,0 +1,15 @@ +caption: subtract +created: 20190611125542096 +modified: 20190611125616692 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, but with <<.place N>> subtracted from each one +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, subtract from each the numeric value of the operand +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: subtract Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "subtract">> diff --git a/editions/tw5.com/tiddlers/filters/sum Operator.tid b/editions/tw5.com/tiddlers/filters/sum Operator.tid new file mode 100644 index 000000000..fe5d09788 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/sum Operator.tid @@ -0,0 +1,13 @@ +caption: sum +created: 20190611155400623 +modified: 20190611155953322 +op-input: a [[selection of titles|Title Selection]] +op-output: the result of adding together the input as numbers +op-purpose: produce the sum of the input numbers +tags: [[Reducing Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: sum Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "sum">> From e5e5b1d7390594ec15856de5e0571b845b259ff0 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 12 Jun 2019 11:34:07 +0100 Subject: [PATCH 0139/2376] Fixes for 7fcdc83ba Thanks @twMat --- .../tw5.com/tiddlers/Draft of 'abs Operator 1'.tid | 5 +++++ .../tw5.com/tiddlers/abs Operator (Examples).tid | 8 ++++++++ editions/tw5.com/tiddlers/abs Operator.tid | 13 +++++++++++++ .../tw5.com/tiddlers/ceil Operator (Examples).tid | 9 +++++++++ editions/tw5.com/tiddlers/ceil Operator.tid | 13 +++++++++++++ .../filters/examples/add Operator (Examples).tid | 2 +- .../filters/examples/divide Operator (Examples).tid | 2 +- .../examples/exponential Operator (Examples).tid | 2 +- .../filters/examples/fixed Operator (Examples).tid | 2 +- .../filters/examples/max Operator (Examples).tid | 2 +- .../filters/examples/maxall Operator (Examples).tid | 2 +- .../filters/examples/min Operator (Examples).tid | 2 +- .../filters/examples/minall Operator (Examples).tid | 2 +- .../examples/multiply Operator (Examples).tid | 2 +- .../examples/precision Operator (Examples).tid | 2 +- .../examples/product Operator (Examples).tid | 2 +- .../examples/remainder Operator (Examples).tid | 2 +- .../examples/subtract Operator (Examples).tid | 2 +- .../filters/examples/sum Operator (Examples).tid | 2 +- editions/tw5.com/tiddlers/filters/min Operator.tid | 2 +- .../tw5.com/tiddlers/filters/multiply Operator.tid | 2 ++ .../tw5.com/tiddlers/filters/product Operator.tid | 2 ++ .../tw5.com/tiddlers/negate Operator (Examples).tid | 8 ++++++++ editions/tw5.com/tiddlers/negate Operator.tid | 13 +++++++++++++ 24 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid create mode 100644 editions/tw5.com/tiddlers/abs Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/abs Operator.tid create mode 100644 editions/tw5.com/tiddlers/ceil Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/ceil Operator.tid create mode 100644 editions/tw5.com/tiddlers/negate Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/negate Operator.tid diff --git a/editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid b/editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid new file mode 100644 index 000000000..e3e179246 --- /dev/null +++ b/editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid @@ -0,0 +1,5 @@ +created: 20190611174450261 +modified: 20190611174451292 +op-purpose: rounds a list of numbers up to the next largest integer +title: Draft of 'abs Operator 1' +type: text/vnd.tiddlywiki \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/abs Operator (Examples).tid b/editions/tw5.com/tiddlers/abs Operator (Examples).tid new file mode 100644 index 000000000..7261bee3a --- /dev/null +++ b/editions/tw5.com/tiddlers/abs Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611174214039 +modified: 20190611174245197 +tags: [[after Operator]] [[Operator Examples]] +title: abs Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[-2000]abs[]]">> +<<.operator-example 2 "=-1 =-2 =3 =4 =5 +[abs[]]">> diff --git a/editions/tw5.com/tiddlers/abs Operator.tid b/editions/tw5.com/tiddlers/abs Operator.tid new file mode 100644 index 000000000..5598df1f0 --- /dev/null +++ b/editions/tw5.com/tiddlers/abs Operator.tid @@ -0,0 +1,13 @@ +caption: abs +created: 20190611174137960 +modified: 20190611174208327 +op-input: a [[selection of titles|Title Selection]] +op-output: the absolute value of the input numbers +op-purpose: calculate the absolute value of a list of numbers +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: abs Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "abs">> diff --git a/editions/tw5.com/tiddlers/ceil Operator (Examples).tid b/editions/tw5.com/tiddlers/ceil Operator (Examples).tid new file mode 100644 index 000000000..e424b2801 --- /dev/null +++ b/editions/tw5.com/tiddlers/ceil Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190611174446781 +modified: 20190611174554787 +tags: [[after Operator]] [[Operator Examples]] +title: ceil Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[1.6]ceil[]]">> +<<.operator-example 2 "[[-1.6]ceil[]]">> +<<.operator-example 3 "=-1.2 =-2.4 =3.6 =4.8 =5.1 +[ceil[]]">> diff --git a/editions/tw5.com/tiddlers/ceil Operator.tid b/editions/tw5.com/tiddlers/ceil Operator.tid new file mode 100644 index 000000000..2339b25b5 --- /dev/null +++ b/editions/tw5.com/tiddlers/ceil Operator.tid @@ -0,0 +1,13 @@ +caption: ceil +created: 20190611174247845 +modified: 20190611174443899 +op-input: a [[selection of titles|Title Selection]] +op-output: rounds each of the input numbers up to the next largest integer +op-purpose: rounds a list of numbers up to the next largest integer +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: ceil Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "ceil">> diff --git a/editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid index 480c3d67f..92530285e 100644 --- a/editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/add Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611125225770 modified: 20190611125525466 -tags: [[after Operator]] [[Operator Examples]] +tags: [[add Operator]] [[Operator Examples]] title: add Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid index 4204c8eec..0d5214dc2 100644 --- a/editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/divide Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611125929173 modified: 20190611130146154 -tags: [[after Operator]] [[Operator Examples]] +tags: [[divide Operator]] [[Operator Examples]] title: divide Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid index 20a936167..c8a536cd5 100644 --- a/editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/exponential Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611154509136 modified: 20190611154545304 -tags: [[after Operator]] [[Operator Examples]] +tags: [[exponential Operator]] [[Operator Examples]] title: exponential Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid index e662e4c28..2f60b72b9 100644 --- a/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611150610846 modified: 20190611150743047 -tags: [[after Operator]] [[Operator Examples]] +tags: [[fixed Operator]] [[Operator Examples]] title: fixed Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid index 0a4524c12..56e20ec2a 100644 --- a/editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/max Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611130905752 modified: 20190611130938471 -tags: [[after Operator]] [[Operator Examples]] +tags: [[max Operator]] [[Operator Examples]] title: max Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid index 6f87c182f..0a6f455d7 100644 --- a/editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/maxall Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611160949615 modified: 20190611161010568 -tags: [[after Operator]] [[Operator Examples]] +tags: [[maxall Operator]] [[Operator Examples]] title: maxall Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid index 5d3638846..9eb33be1b 100644 --- a/editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/min Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611131138259 modified: 20190611131149542 -tags: [[after Operator]] [[Operator Examples]] +tags: [[min Operator]] [[Operator Examples]] title: min Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid index c1d594cce..d694a2f1b 100644 --- a/editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/minall Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611161051108 modified: 20190611161107239 -tags: [[after Operator]] [[Operator Examples]] +tags: [[minall Operator]] [[Operator Examples]] title: minall Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid index 9638b47e0..bb074821a 100644 --- a/editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/multiply Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611125743568 modified: 20190611125757767 -tags: [[after Operator]] [[Operator Examples]] +tags: [[multiply Operator]] [[Operator Examples]] title: multiply Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid index 96a17356f..af1fb8dff 100644 --- a/editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/precision Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611151444751 modified: 20190611154248537 -tags: [[after Operator]] [[Operator Examples]] +tags: [[precision Operator]] [[Operator Examples]] title: precision Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid index 5f8bbd42a..b22d9f330 100644 --- a/editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/product Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611160221390 modified: 20190611160243829 -tags: [[after Operator]] [[Operator Examples]] +tags: [[product Operator]] [[Operator Examples]] title: product Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid index b88cecc4f..2522fe700 100644 --- a/editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/remainder Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611130110805 modified: 20190611130121033 -tags: [[after Operator]] [[Operator Examples]] +tags: [[remainder Operator]] [[Operator Examples]] title: remainder Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid index 3ed88db33..2382824f2 100644 --- a/editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/subtract Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611125619962 modified: 20190611125638512 -tags: [[after Operator]] [[Operator Examples]] +tags: [[subtract Operator]] [[Operator Examples]] title: subtract Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid index 2f97564d7..3b1ce1a76 100644 --- a/editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/sum Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611160000682 modified: 20190611160139594 -tags: [[after Operator]] [[Operator Examples]] +tags: [[sum Operator]] [[Operator Examples]] title: sum Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/min Operator.tid b/editions/tw5.com/tiddlers/filters/min Operator.tid index 2966eea39..097cf376e 100644 --- a/editions/tw5.com/tiddlers/filters/min Operator.tid +++ b/editions/tw5.com/tiddlers/filters/min Operator.tid @@ -12,6 +12,6 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. -See also the [[min Operator]], and compare with the [[maxall Operator]] and the [[minall Operator]]. +See also the [[max Operator]], and compare with the [[maxall Operator]] and the [[minall Operator]]. <<.operator-examples "min">> diff --git a/editions/tw5.com/tiddlers/filters/multiply Operator.tid b/editions/tw5.com/tiddlers/filters/multiply Operator.tid index c555b0a60..6eb92b7ad 100644 --- a/editions/tw5.com/tiddlers/filters/multiply Operator.tid +++ b/editions/tw5.com/tiddlers/filters/multiply Operator.tid @@ -12,4 +12,6 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. +Compare with the [[product Operator]]. + <<.operator-examples "multiply">> diff --git a/editions/tw5.com/tiddlers/filters/product Operator.tid b/editions/tw5.com/tiddlers/filters/product Operator.tid index 175a8718d..b2cedb540 100644 --- a/editions/tw5.com/tiddlers/filters/product Operator.tid +++ b/editions/tw5.com/tiddlers/filters/product Operator.tid @@ -10,4 +10,6 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. +Compare with the [[multiply Operator]]. + <<.operator-examples "product">> diff --git a/editions/tw5.com/tiddlers/negate Operator (Examples).tid b/editions/tw5.com/tiddlers/negate Operator (Examples).tid new file mode 100644 index 000000000..6b86f0f60 --- /dev/null +++ b/editions/tw5.com/tiddlers/negate Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190611174040931 +modified: 20190611174121059 +tags: [[after Operator]] [[Operator Examples]] +title: negate Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[-2000]negate[]]">> +<<.operator-example 2 "=1 =2 =3 =4 =5 +[negate[]]">> diff --git a/editions/tw5.com/tiddlers/negate Operator.tid b/editions/tw5.com/tiddlers/negate Operator.tid new file mode 100644 index 000000000..8dc2f322d --- /dev/null +++ b/editions/tw5.com/tiddlers/negate Operator.tid @@ -0,0 +1,13 @@ +caption: negate +created: 20190611173918279 +modified: 20190611174037439 +op-input: a [[selection of titles|Title Selection]] +op-output: the negation of the input numbers +op-purpose: calculate the negation of a list of numbers +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: negate Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "negate">> From 23dd8da22cd1b48751f137ca97b43eb3ce8e2baf Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 12 Jun 2019 12:48:14 +0100 Subject: [PATCH 0140/2376] Remove draft inadvertantly included in e5e5b1d73 Thanks @twMat --- editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid diff --git a/editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid b/editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid deleted file mode 100644 index e3e179246..000000000 --- a/editions/tw5.com/tiddlers/Draft of 'abs Operator 1'.tid +++ /dev/null @@ -1,5 +0,0 @@ -created: 20190611174450261 -modified: 20190611174451292 -op-purpose: rounds a list of numbers up to the next largest integer -title: Draft of 'abs Operator 1' -type: text/vnd.tiddlywiki \ No newline at end of file From 1a08430a0c63c958f35728fffa580205f22b2be4 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Wed, 12 Jun 2019 23:03:01 +0200 Subject: [PATCH 0141/2376] Docs: Fix typo in TextReference.tid (#3978) minor correction - or am I mistaken? --- editions/tw5.com/tiddlers/concepts/TextReference.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/concepts/TextReference.tid b/editions/tw5.com/tiddlers/concepts/TextReference.tid index 4b9a9d2f7..474149b88 100644 --- a/editions/tw5.com/tiddlers/concepts/TextReference.tid +++ b/editions/tw5.com/tiddlers/concepts/TextReference.tid @@ -18,7 +18,7 @@ A TextReference consists of several parts: Most of the parts of a text reference can be optional: -* `tiddlerTitle` - the text [[field|TiddlerFields]] of the specified tiddler +* `tiddlerTitle` - the title [[field|TiddlerFields]] of the specified tiddler * `tiddlerTitle!!field` - a [[tiddler field|TiddlerFields]] (eg, `modified`, `modifier`, `type` etc) * `!!field` - a [[field|TiddlerFields]] of the current tiddler * `tiddlerTitle##propertyIndex` - extracts a named property from DataTiddlers From fc09f8e3312f1cf9e6635dda78ce55d53712070b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 13 Jun 2019 08:47:42 +0100 Subject: [PATCH 0142/2376] Tree macro: allow separator to be customised --- core/wiki/macros/tree.tid | 22 +++++++++---------- .../macros/examples/tree Macro (Examples).tid | 3 +++ .../examples/tree-macro-example-data.multids | 21 ++++++++++++++++++ .../tw5.com/tiddlers/macros/tree Macro.tid | 6 +++-- 4 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 editions/tw5.com/tiddlers/macros/examples/tree-macro-example-data.multids diff --git a/core/wiki/macros/tree.tid b/core/wiki/macros/tree.tid index d47c1fbc4..5bd877927 100644 --- a/core/wiki/macros/tree.tid +++ b/core/wiki/macros/tree.tid @@ -1,11 +1,11 @@ title: $:/core/macros/tree tags: $:/tags/Macro -\define leaf-link(full-title, chunk) +\define leaf-link(full-title,chunk,separator: "/") <$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link> \end -\define leaf-node(prefix, chunk) +\define leaf-node(prefix,chunk) <li> <$list filter="[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]" variable="full-title"> <$list filter="[<full-title>removeprefix<__prefix__>]" variable="chunk"> @@ -15,7 +15,7 @@ tags: $:/tags/Macro </li> \end -\define branch-node(prefix, chunk) +\define branch-node(prefix,chunk,separator: "/") <li> <$set name="reveal-state" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}> <$reveal type="nomatch" stateTitle=<<reveal-state>> text="show"> @@ -30,28 +30,28 @@ tags: $:/tags/Macro </$reveal> <span>(<$count filter="[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]"/>)</span> <$reveal type="match" stateTitle=<<reveal-state>> text="show"> -<$macrocall $name="tree-node" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}}/> +<$macrocall $name="tree-node" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/> </$reveal> </$set> </li> \end -\define tree-node(prefix) +\define tree-node(prefix,separator: "/") <ol> -<$list filter="[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore[/]sort[]!suffix[/]]" variable="chunk"> -<$macrocall $name="leaf-node" prefix=<<__prefix__>> chunk=<<chunk>>/> +<$list filter="[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]" variable="chunk"> +<$macrocall $name="leaf-node" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/> </$list> -<$list filter="[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore[/]sort[]suffix[/]]" variable="chunk"> -<$macrocall $name="branch-node" prefix=<<__prefix__>> chunk=<<chunk>>/> +<$list filter="[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]" variable="chunk"> +<$macrocall $name="branch-node" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/> </$list> </ol> \end -\define tree(prefix: "$:/") +\define tree(prefix: "$:/",separator: "/") <div class="tc-tree"> <span><$text text=<<__prefix__>>/></span> <div> -<$macrocall $name="tree-node" prefix=<<__prefix__>>/> +<$macrocall $name="tree-node" prefix=<<__prefix__>> separator=<<__separator__>>/> </div> </div> \end diff --git a/editions/tw5.com/tiddlers/macros/examples/tree Macro (Examples).tid b/editions/tw5.com/tiddlers/macros/examples/tree Macro (Examples).tid index ed19fa528..8a3c4506e 100644 --- a/editions/tw5.com/tiddlers/macros/examples/tree Macro (Examples).tid +++ b/editions/tw5.com/tiddlers/macros/examples/tree Macro (Examples).tid @@ -6,3 +6,6 @@ type: text/vnd.tiddlywiki <$macrocall $name=".example" n="1" eg="""<<tree prefix:"$:/">>"""/> + +<$macrocall $name=".example" n="2" +eg="""<<tree prefix:"tree-macro-example-" separator:"-">>"""/> diff --git a/editions/tw5.com/tiddlers/macros/examples/tree-macro-example-data.multids b/editions/tw5.com/tiddlers/macros/examples/tree-macro-example-data.multids new file mode 100644 index 000000000..8f5d61203 --- /dev/null +++ b/editions/tw5.com/tiddlers/macros/examples/tree-macro-example-data.multids @@ -0,0 +1,21 @@ +title: tree-macro-example- +tag: [[tree Macro (Examples)]] + +house: See [[tree Macro (Examples)]] +house-kitchen: See [[tree Macro (Examples)]] +house-kitchen-table: See [[tree Macro (Examples)]] +house-kitchen-sink: See [[tree Macro (Examples)]] +house-kitchen-window: See [[tree Macro (Examples)]] +house-attic: See [[tree Macro (Examples)]] +house-attic-window: See [[tree Macro (Examples)]] +house-attic-roof: See [[tree Macro (Examples)]] +house-garden: See [[tree Macro (Examples)]] +house-garden-shed: See [[tree Macro (Examples)]] +house-garden-lawn: See [[tree Macro (Examples)]] +car: See [[tree Macro (Examples)]] +car-boot: See [[tree Macro (Examples)]] +car-boot-lock: See [[tree Macro (Examples)]] +car-boot-handle: See [[tree Macro (Examples)]] +car-roof: See [[tree Macro (Examples)]] +car-roof-rails: See [[tree Macro (Examples)]] +car-roof-aerial: See [[tree Macro (Examples)]] diff --git a/editions/tw5.com/tiddlers/macros/tree Macro.tid b/editions/tw5.com/tiddlers/macros/tree Macro.tid index 8f6892071..e3cc990a2 100644 --- a/editions/tw5.com/tiddlers/macros/tree Macro.tid +++ b/editions/tw5.com/tiddlers/macros/tree Macro.tid @@ -5,11 +5,13 @@ tags: Macros [[Core Macros]] title: tree Macro type: text/vnd.tiddlywiki -The <<.def tree>> [[macro|Macros]] renders an expandable tree view based on tiddler titles. +The <<.def tree>> [[macro|Macros]] renders an expandable tree view based on a prefix and separator within tiddler titles. !! Parameters ;prefix -: The prefix from which to generate the tree, e.g. `$:/` +: The prefix from which to generate the tree, defaults to `$:/` +;separator +: The separator between parts of the tiddler titles, defaults to `/` <<.macro-examples "tree">> From 73eb7fbd4eb5c4f462fecafa49f063373991ccc0 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 13 Jun 2019 16:52:19 +0100 Subject: [PATCH 0143/2376] Maths operators: Remove concat (same as addsuffix) and add splitregexp --- core/modules/filters/strings.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index a3b95dd9d..d844f7c56 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -30,15 +30,11 @@ exports.trim = makeStringBinaryOperator( function(a) {return [$tw.utils.trim(a)];} ); -exports.concat = makeStringBinaryOperator( - function(a,b) {return ["" + a + b];} -); - exports.split = makeStringBinaryOperator( function(a,b) {return ("" + a).split(b).filter(function(str) {return !!str;});} ); -exports.join = makeStringArrayOperator( +exports.join = makeStringReducingOperator( function(accumulator,value,operand) { return "" + (accumulator ? accumulator + (operand || "") + value : value); } @@ -54,7 +50,7 @@ function makeStringBinaryOperator(fnCalc) { }; } -function makeStringArrayOperator(fnCalc,initialValue) { +function makeStringReducingOperator(fnCalc,initialValue) { initialValue = initialValue || ""; return function(source,operator,options) { var result = []; @@ -67,4 +63,15 @@ function makeStringArrayOperator(fnCalc,initialValue) { }; } +exports.splitregexp = function(source,operator,options) { + var result = [], + suffix = operator.suffix || "", + flags = (suffix.indexOf("m") !== -1 ? "m" : "") + (suffix.indexOf("i") !== -1 ? "i" : ""), + regExp = new RegExp(operator.operand || "",flags); + source(function(tiddler,title) { + Array.prototype.push.apply(result,title.split(regExp)); + }); + return result; +}; + })(); From fef2ea97a11b5b08641649a4788453b346821032 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 13 Jun 2019 16:53:23 +0100 Subject: [PATCH 0144/2376] Final chunk of docs for new maths/string operators --- editions/prerelease/tiddlers/Release 5.1.20.tid | 2 +- .../tiddlers/{ => filters}/abs Operator.tid | 0 .../tiddlers/{ => filters}/ceil Operator.tid | 0 .../examples}/abs Operator (Examples).tid | 2 +- .../examples}/ceil Operator (Examples).tid | 2 +- .../examples/floor Operator (Examples).tid | 9 +++++++++ .../examples/join Operator (Examples).tid | 7 +++++++ .../examples/length Operator (Examples).tid | 8 ++++++++ .../examples/lowercase Operator (Examples).tid | 8 ++++++++ .../examples}/negate Operator (Examples).tid | 2 +- .../examples/round Operator (Examples).tid | 9 +++++++++ .../examples/sign Operator (Examples).tid | 9 +++++++++ .../examples/split Operator (Examples).tid | 8 ++++++++ .../examples/splitregexp Operator (Examples).tid | 7 +++++++ .../examples/trim Operator (Examples).tid | 7 +++++++ .../examples/trunc Operator (Examples).tid | 9 +++++++++ .../examples/uppercase Operator (Examples).tid | 8 ++++++++ .../tw5.com/tiddlers/filters/floor Operator.tid | 13 +++++++++++++ .../tw5.com/tiddlers/filters/join Operator.tid | 15 +++++++++++++++ .../tw5.com/tiddlers/filters/length Operator.tid | 13 +++++++++++++ .../tiddlers/filters/lowercase Operator.tid | 15 +++++++++++++++ .../tiddlers/{ => filters}/negate Operator.tid | 0 .../tw5.com/tiddlers/filters/round Operator.tid | 13 +++++++++++++ .../tw5.com/tiddlers/filters/sign Operator.tid | 13 +++++++++++++ .../tw5.com/tiddlers/filters/split Operator.tid | 15 +++++++++++++++ .../tiddlers/filters/splitregexp Operator.tid | 16 ++++++++++++++++ .../tw5.com/tiddlers/filters/trim Operator.tid | 13 +++++++++++++ .../tw5.com/tiddlers/filters/trunc Operator.tid | 13 +++++++++++++ .../tiddlers/filters/uppercase Operator.tid | 15 +++++++++++++++ 29 files changed, 247 insertions(+), 4 deletions(-) rename editions/tw5.com/tiddlers/{ => filters}/abs Operator.tid (100%) rename editions/tw5.com/tiddlers/{ => filters}/ceil Operator.tid (100%) rename editions/tw5.com/tiddlers/{ => filters/examples}/abs Operator (Examples).tid (81%) rename editions/tw5.com/tiddlers/{ => filters/examples}/ceil Operator (Examples).tid (84%) create mode 100644 editions/tw5.com/tiddlers/filters/examples/floor Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/join Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/length Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/lowercase Operator (Examples).tid rename editions/tw5.com/tiddlers/{ => filters/examples}/negate Operator (Examples).tid (81%) create mode 100644 editions/tw5.com/tiddlers/filters/examples/round Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/sign Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/split Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/splitregexp Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/trunc Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/uppercase Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/floor Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/join Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/length Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/lowercase Operator.tid rename editions/tw5.com/tiddlers/{ => filters}/negate Operator.tid (100%) create mode 100644 editions/tw5.com/tiddlers/filters/round Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/sign Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/split Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/splitregexp Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/trim Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/trunc Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/uppercase Operator.tid diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 59d060239..e57362745 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. -Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[concat|concat Operator]], [[split|split Operator]] and [[join|join Operator]]. +Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|split Operator]] and [[join|join Operator]]. There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter resulst, making it much easier to work with the new mathematics and string operators: diff --git a/editions/tw5.com/tiddlers/abs Operator.tid b/editions/tw5.com/tiddlers/filters/abs Operator.tid similarity index 100% rename from editions/tw5.com/tiddlers/abs Operator.tid rename to editions/tw5.com/tiddlers/filters/abs Operator.tid diff --git a/editions/tw5.com/tiddlers/ceil Operator.tid b/editions/tw5.com/tiddlers/filters/ceil Operator.tid similarity index 100% rename from editions/tw5.com/tiddlers/ceil Operator.tid rename to editions/tw5.com/tiddlers/filters/ceil Operator.tid diff --git a/editions/tw5.com/tiddlers/abs Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/abs Operator (Examples).tid similarity index 81% rename from editions/tw5.com/tiddlers/abs Operator (Examples).tid rename to editions/tw5.com/tiddlers/filters/examples/abs Operator (Examples).tid index 7261bee3a..874f2bd32 100644 --- a/editions/tw5.com/tiddlers/abs Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/abs Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611174214039 modified: 20190611174245197 -tags: [[after Operator]] [[Operator Examples]] +tags: [[abs Operator]] [[Operator Examples]] title: abs Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/ceil Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/ceil Operator (Examples).tid similarity index 84% rename from editions/tw5.com/tiddlers/ceil Operator (Examples).tid rename to editions/tw5.com/tiddlers/filters/examples/ceil Operator (Examples).tid index e424b2801..95ed8fbac 100644 --- a/editions/tw5.com/tiddlers/ceil Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/ceil Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611174446781 modified: 20190611174554787 -tags: [[after Operator]] [[Operator Examples]] +tags: [[ceil Operator]] [[Operator Examples]] title: ceil Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/floor Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/floor Operator (Examples).tid new file mode 100644 index 000000000..98ff98cce --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/floor Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190613084453154 +modified: 20190613084521199 +tags: [[floor Operator]] [[Operator Examples]] +title: floor Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[1.6]floor[]]">> +<<.operator-example 2 "[[-1.6]floor[]]">> +<<.operator-example 3 "=-1.2 =-2.4 =3.6 =4.8 =5.1 +[floor[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/join Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/join Operator (Examples).tid new file mode 100644 index 000000000..fcdad3fc5 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/join Operator (Examples).tid @@ -0,0 +1,7 @@ +created: 20190613154634914 +modified: 20190613154711864 +tags: [[join Operator]] [[Operator Examples]] +title: join Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "a b c d e +[join[,]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/length Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/length Operator (Examples).tid new file mode 100644 index 000000000..805ac7385 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/length Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190613153325774 +modified: 20190613153409962 +tags: [[length Operator]] [[Operator Examples]] +title: length Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[abc]length[]]">> +<<.operator-example 2 "[tag[HelloThere]length[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/lowercase Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/lowercase Operator (Examples).tid new file mode 100644 index 000000000..8efbd8d9d --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/lowercase Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190613153824151 +modified: 20190613153842330 +tags: [[lowercase Operator]] [[Operator Examples]] +title: lowercase Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[Abc]lowercase[]]">> +<<.operator-example 2 "[tag[HelloThere]lowercase[]]">> diff --git a/editions/tw5.com/tiddlers/negate Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/negate Operator (Examples).tid similarity index 81% rename from editions/tw5.com/tiddlers/negate Operator (Examples).tid rename to editions/tw5.com/tiddlers/filters/examples/negate Operator (Examples).tid index 6b86f0f60..abdc23111 100644 --- a/editions/tw5.com/tiddlers/negate Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/negate Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190611174040931 modified: 20190611174121059 -tags: [[after Operator]] [[Operator Examples]] +tags: [[negate Operator]] [[Operator Examples]] title: negate Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/round Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/round Operator (Examples).tid new file mode 100644 index 000000000..ab9ab4f3c --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/round Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190613084626721 +modified: 20190613084651519 +tags: [[round Operator]] [[Operator Examples]] +title: round Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[1.6]round[]]">> +<<.operator-example 2 "[[-1.6]round[]]">> +<<.operator-example 3 "=-1.2 =-2.4 =3.6 =4.8 =5.1 +[round[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/sign Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sign Operator (Examples).tid new file mode 100644 index 000000000..40e37a3c6 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/sign Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190613085050151 +modified: 20190613085120851 +tags: [[sign Operator]] [[Operator Examples]] +title: sign Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[1.6]sign[]]">> +<<.operator-example 2 "[[-1.6]sign[]]">> +<<.operator-example 3 "[[0]sign[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/split Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/split Operator (Examples).tid new file mode 100644 index 000000000..ba38b3f36 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/split Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190613154338930 +modified: 20190613154445868 +tags: [[split Operator]] [[Operator Examples]] +title: split Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[a b c d e]split[ ]]">> +<<.operator-example 2 "[[Mississippi]split[i]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/splitregexp Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/splitregexp Operator (Examples).tid new file mode 100644 index 000000000..a86bc7471 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/splitregexp Operator (Examples).tid @@ -0,0 +1,7 @@ +created: 20190613154934814 +modified: 20190613155013565 +tags: [[splitregexp Operator]] [[Operator Examples]] +title: splitregexp Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "a=b-c=d-e +[splitregexp[=|-]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid new file mode 100644 index 000000000..18a1562bd --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid @@ -0,0 +1,7 @@ +created: 20190613153847475 +modified: 20190613153924808 +tags: [[trim Operator]] [[Operator Examples]] +title: trim Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[ a b ]trim[]addprefix[-]addsuffix[-]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/trunc Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/trunc Operator (Examples).tid new file mode 100644 index 000000000..60cf10fb4 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/trunc Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190613084830686 +modified: 20190613084854081 +tags: [[trunc Operator]] [[Operator Examples]] +title: trunc Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[1.6]trunc[]]">> +<<.operator-example 2 "[[-1.6]trunc[]]">> +<<.operator-example 3 "=-1.2 =-2.4 =3.6 =4.8 =5.1 +[trunc[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/uppercase Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/uppercase Operator (Examples).tid new file mode 100644 index 000000000..9ec781791 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/uppercase Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190613153541799 +modified: 20190613153642345 +tags: [[uppercase Operator]] [[Operator Examples]] +title: uppercase Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[Abc]uppercase[]]">> +<<.operator-example 2 "[tag[HelloThere]uppercase[]]">> diff --git a/editions/tw5.com/tiddlers/filters/floor Operator.tid b/editions/tw5.com/tiddlers/filters/floor Operator.tid new file mode 100644 index 000000000..7ea1a599c --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/floor Operator.tid @@ -0,0 +1,13 @@ +caption: floor +created: 20190613084227037 +modified: 20190613084450121 +op-input: a [[selection of titles|Title Selection]] +op-output: rounds each of the input numbers to the largest integer less than or equal to the given number +op-purpose: rounds a list of numbers to the largest integer less than or equal to each number +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: floor Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "floor">> diff --git a/editions/tw5.com/tiddlers/filters/join Operator.tid b/editions/tw5.com/tiddlers/filters/join Operator.tid new file mode 100644 index 000000000..c53396887 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/join Operator.tid @@ -0,0 +1,15 @@ +caption: split +created: 20190613154502541 +modified: 20190613154632657 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles joined together with the separator <<.place S>> +op-parameter: the separator to insert between each of the items +op-parameter-name: S +op-purpose: join a list of strings together with the separator <<.place S>> +tags: [[Filter Operators]] +title: join Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +<<.operator-examples "join">> diff --git a/editions/tw5.com/tiddlers/filters/length Operator.tid b/editions/tw5.com/tiddlers/filters/length Operator.tid new file mode 100644 index 000000000..d9cd66b85 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/length Operator.tid @@ -0,0 +1,13 @@ +caption: length +created: 20190613153225735 +modified: 20190613153321546 +op-input: a [[selection of titles|Title Selection]] +op-output: replaces each input title with its length as an integer +op-purpose: returns the lengths of each item in the list +tags: [[Filter Operators]] +title: length Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +<<.operator-examples "length">> diff --git a/editions/tw5.com/tiddlers/filters/lowercase Operator.tid b/editions/tw5.com/tiddlers/filters/lowercase Operator.tid new file mode 100644 index 000000000..1efaec980 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/lowercase Operator.tid @@ -0,0 +1,15 @@ +caption: lowercase +created: 20190613153650010 +modified: 20190613153726427 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles with each uppercase letter replaced by the equivalent lowercase letter +op-purpose: returns each item in the list as lowercase +tags: [[Filter Operators]] +title: lowercase Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +See also [[uppercase Operator]]. + +<<.operator-examples "lowercase">> diff --git a/editions/tw5.com/tiddlers/negate Operator.tid b/editions/tw5.com/tiddlers/filters/negate Operator.tid similarity index 100% rename from editions/tw5.com/tiddlers/negate Operator.tid rename to editions/tw5.com/tiddlers/filters/negate Operator.tid diff --git a/editions/tw5.com/tiddlers/filters/round Operator.tid b/editions/tw5.com/tiddlers/filters/round Operator.tid new file mode 100644 index 000000000..47cf6db5a --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/round Operator.tid @@ -0,0 +1,13 @@ +caption: round +created: 20190613084541416 +modified: 20190613084623913 +op-input: a [[selection of titles|Title Selection]] +op-output: rounds each of the input numbers to the nearest integer +op-purpose: rounds a list of numbers to the nearest integer +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: round Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "round">> diff --git a/editions/tw5.com/tiddlers/filters/sign Operator.tid b/editions/tw5.com/tiddlers/filters/sign Operator.tid new file mode 100644 index 000000000..e25783f92 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/sign Operator.tid @@ -0,0 +1,13 @@ +caption: sign +created: 20190613084919354 +modified: 20190613085044655 +op-input: a [[selection of titles|Title Selection]] +op-output: replaces each input number with -1, 0 or +1 according to whether the number is negative, zero, or positive +op-purpose: return -1, 0 or +1 for a list of numbers according to whether each number is negative, zero, or positive +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: sign Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "sign">> diff --git a/editions/tw5.com/tiddlers/filters/split Operator.tid b/editions/tw5.com/tiddlers/filters/split Operator.tid new file mode 100644 index 000000000..e713eb326 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/split Operator.tid @@ -0,0 +1,15 @@ +caption: split +created: 20190613153944647 +modified: 20190613154541225 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles split into separate items according to the specified separator <<.place S>> +op-parameter: The substring at which to split each title +op-parameter-name: S +op-purpose: returns each item in the list split into separate strings according to the specified separator <<.place S>> +tags: [[Filter Operators]] +title: split Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +<<.operator-examples "split">> diff --git a/editions/tw5.com/tiddlers/filters/splitregexp Operator.tid b/editions/tw5.com/tiddlers/filters/splitregexp Operator.tid new file mode 100644 index 000000000..085cbd1ff --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/splitregexp Operator.tid @@ -0,0 +1,16 @@ +caption: splitregexp +created: 20190613154722705 +modified: 20190613154924724 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles split into separate items according to the specified regular expression <<.place R>> +op-parameter: The regular expression at which to split each title +op-parameter-name: R +op-purpose: returns each item in the list split into separate strings according to the specified regular expression <<.place R>> +op-suffix: flags: ''m'' for multiline mode, ''i'' for case-insensitive mode +tags: [[Filter Operators]] +title: splitregexp Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +<<.operator-examples "splitregexp">> diff --git a/editions/tw5.com/tiddlers/filters/trim Operator.tid b/editions/tw5.com/tiddlers/filters/trim Operator.tid new file mode 100644 index 000000000..e791c2f87 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/trim Operator.tid @@ -0,0 +1,13 @@ +caption: trim +created: 20190613153740241 +modified: 20190613153820282 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles with whitespace trimmed from the start and end +op-purpose: returns each item in the list with whitespace trimmed from the start and end +tags: [[Filter Operators]] +title: trim Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +<<.operator-examples "trim">> diff --git a/editions/tw5.com/tiddlers/filters/trunc Operator.tid b/editions/tw5.com/tiddlers/filters/trunc Operator.tid new file mode 100644 index 000000000..43cf2d2dd --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/trunc Operator.tid @@ -0,0 +1,13 @@ +caption: trunc +created: 20190613084703801 +modified: 20190613084829253 +op-input: a [[selection of titles|Title Selection]] +op-output: truncates each of the input numbers to their integer part, removing any fractional part +op-purpose: truncates a list of numbers to their integer part, removing any fractional part +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: trunc Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "trunc">> diff --git a/editions/tw5.com/tiddlers/filters/uppercase Operator.tid b/editions/tw5.com/tiddlers/filters/uppercase Operator.tid new file mode 100644 index 000000000..f52031bee --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/uppercase Operator.tid @@ -0,0 +1,15 @@ +caption: uppercase +created: 20190613153420821 +modified: 20190613153538557 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles with each lowercase letter replaced by the equivalent uppercase letter +op-purpose: returns each item in the list as uppercase +tags: [[Filter Operators]] +title: uppercase Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +See also [[lowercase Operator]]. + +<<.operator-examples "uppercase">> From 630a0ecf9e16f6e4bc73e6ab4a9ef46042473c21 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 13 Jun 2019 16:55:55 +0100 Subject: [PATCH 0145/2376] Remove test for concat operator --- editions/test/tiddlers/tests/test-filters.js | 1 - 1 file changed, 1 deletion(-) diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index da2998107..553183f49 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -386,7 +386,6 @@ function runTests(wiki) { expect(wiki.filterTiddlers("John Paul George Ringo +[length[]]").join(",")).toBe("4,4,6,5"); expect(wiki.filterTiddlers("John Paul George Ringo +[uppercase[]]").join(",")).toBe("JOHN,PAUL,GEORGE,RINGO"); expect(wiki.filterTiddlers("John Paul George Ringo +[lowercase[]]").join(",")).toBe("john,paul,george,ringo"); - expect(wiki.filterTiddlers("John Paul George Ringo +[concat[y]]").join(",")).toBe("Johny,Pauly,Georgey,Ringoy"); expect(wiki.filterTiddlers("John Paul George Ringo +[split[]]").join(",")).toBe("J,o,h,n,P,a,u,l,G,e,o,r,g,e,R,i,n,g,o"); expect(wiki.filterTiddlers("[[John. Paul. George. Ringo.]] +[split[.]trim[]]").join(",")).toBe("John,Paul,George,Ringo"); expect(wiki.filterTiddlers("John Paul George Ringo +[split[e]]").join(",")).toBe("John,Paul,G,org,Ringo"); From 250a1e53563cb4b2c6e51010f7d858079fcc422b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 14 Jun 2019 09:26:24 +0100 Subject: [PATCH 0146/2376] Release note: Typo --- editions/prerelease/tiddlers/Release 5.1.20.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index e57362745..2bde6ed8f 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -69,7 +69,7 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c036c228269fc30d0df770a7c7713fd9af829df7]] $:/info/browser/language to the InfoMechanism * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f047e7cbf50edcf4775b50bdebc3f704970b8cde]] an example of using StartupActions to set the default language * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/edd3156430dd94b0ced630a1b70f2e2ef0ff6c36]] importing of JSON files to verify whether they are valid tiddler files, and import them as plain JSON if not -* [[Enhanced|https://github.com/Jermolene/TiddlyWiki5/issues/3974]] the ListWidget to use the title of the target tiddler as a default if it has no content +* [[Enhanced|https://github.com/Jermolene/TiddlyWiki5/issues/3974]] the LinkWidget to use the title of the target tiddler as a default if it has no content !! Bug Fixes From 2002ff72b7b07cb5a1b50f54393206ebbf3e85f0 Mon Sep 17 00:00:00 2001 From: Xavier Cazin <xcazin@immateriel.fr> Date: Mon, 17 Jun 2019 17:46:03 +0200 Subject: [PATCH 0147/2376] fr-FR translation for GitHub saver related strings (#3988) --- languages/fr-FR/ControlPanel.multids | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/languages/fr-FR/ControlPanel.multids b/languages/fr-FR/ControlPanel.multids index 7e98d6344..2813e6092 100644 --- a/languages/fr-FR/ControlPanel.multids +++ b/languages/fr-FR/ControlPanel.multids @@ -57,7 +57,7 @@ Parsing/Caption: Analyse Parsing/Hint: Ici, vous pouvez activer/désactiver globalement les règles de l'analyseur du wiki. Les changements seront effectifs après enregistrement et rechargement de votre wiki. Désactiver certaines règles peut empêcher <$text text="TiddlyWiki"/> de fonctionner correctement. Pour restaurer le fonctionnement normal, utilisez le [[safe mode|https://tiddlywiki.com/#SafeMode]]. Parsing/Block/Caption: Règles d'analyse Block Parsing/Inline/Caption: Règles d'analyse Inline -Parsing/Pragma/Caption: Règles d'analyse PragmaP +Parsing/Pragma/Caption: Règles d'analyse Pragma Plugins/Add/Caption: Ajouter des plugins Plugins/Add/Hint: Installer des plugins à partir de la bibliothèque officielle Plugins/AlreadyInstalled/Hint: Ce plugin est déjà installé dans la version <$text text=<<installedVersion>>/> @@ -88,6 +88,15 @@ Saving/DownloadSaver/Hint: Ces paramètres s'appliquent à l'enregistreur de té Saving/General/Caption: Général Saving/General/Hint: Ces paramètres s'appliquent à tous les enregistreurs chargés Saving/Hint: Paramètres pour enregistrer le ~TiddlyWiki complet dans un seul fichier, via un module enregistreur +Saving/GitHub/Branch: Branche cible dans laquelle enregistrer (`master` par défaut) +Saving/GitHub/Caption: Enregistreur ~GitHub +Saving/GitHub/Description: Ces paramètres ne sont utilisés que pour l'enregistrement sur ~GitHub +Saving/GitHub/ServerURL: URL du serveur (`https://api.github.com` par défaut) +Saving/GitHub/Filename: Nom du fichier cible (par ex. `index.html`) +Saving/GitHub/Password: Mot de passe, jeton OAUTH, ou //personal access token// +Saving/GitHub/Path: Chemin vers le fichier cible (par ex. `/wiki/`) +Saving/GitHub/Repo: //Repository// cible (par ex. `Jermolene/TiddlyWiki5`) +Saving/GitHub/UserName: Nom d'utilisateur Saving/TiddlySpot/Advanced/Heading: Paramètres avancés Saving/TiddlySpot/BackupDir: Dossier des //sauvegardes// Saving/TiddlySpot/Backups: Sauvegardes From a4dcc20797ff242129f24c44c48b7a5c57de7af5 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 17 Jun 2019 12:31:54 -0500 Subject: [PATCH 0148/2376] Signing the CLA as rmunn (#3992) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 90dd309e0..8677707d9 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -359,3 +359,5 @@ Joshua Fontany, @joshuafontany, 2019/03/07 Dong Zhihong, @donmor, 2019/05/29 Joshua Stubbs, @LordRatte, 2019/05/31 + +Robin Munn, @rmunn, 2019/06/16 From 58cb300a0a1446c3aa08ea9ecda9f24a521207a4 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 17 Jun 2019 12:32:35 -0500 Subject: [PATCH 0149/2376] Fix typo (#3984) --- editions/prerelease/tiddlers/Release 5.1.20.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 2bde6ed8f..47baa720a 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -13,7 +13,7 @@ Added several new [[Mathematics Operators]] for working with numbers: [[negate|n Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|split Operator]] and [[join|join Operator]]. -There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter resulst, making it much easier to work with the new mathematics and string operators: +There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter results, making it much easier to work with the new mathematics and string operators: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/37bb75f0cf446d62eb45d07b9f9b0aa14814a43f]] support for new `=` prefix for merging filter runs without removing duplicates * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/18fe112da7d3ac210a5a0b9cf73fe9050717d4e3]] option for the [[enlist Operator]] to not remove duplicates From 62829dc9d34a84f892a0b5c5829faebf89c787f3 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 17 Jun 2019 12:34:30 -0500 Subject: [PATCH 0150/2376] Add untrunc operator, the mirror of trunc (#3994) --- core/modules/filters/math.js | 4 ++++ editions/prerelease/tiddlers/Release 5.1.20.tid | 2 +- .../examples/untrunc Operator (Examples).tid | 9 +++++++++ .../tw5.com/tiddlers/filters/trunc Operator.tid | 2 ++ .../tw5.com/tiddlers/filters/untrunc Operator.tid | 15 +++++++++++++++ 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 editions/tw5.com/tiddlers/filters/examples/untrunc Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/untrunc Operator.tid diff --git a/core/modules/filters/math.js b/core/modules/filters/math.js index 801ebf5ed..c3f6d3b45 100644 --- a/core/modules/filters/math.js +++ b/core/modules/filters/math.js @@ -43,6 +43,10 @@ exports.trunc = makeNumericBinaryOperator( function(a) {return Math.trunc(a)} ); +exports.untrunc = makeNumericBinaryOperator( + function(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)} +); + exports.sign = makeNumericBinaryOperator( function(a) {return Math.sign(a)} ); diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 47baa720a..aac0e9259 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -9,7 +9,7 @@ type: text/vnd.tiddlywiki !! Major Improvements -Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. +Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[untrunc|untrunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|split Operator]] and [[join|join Operator]]. diff --git a/editions/tw5.com/tiddlers/filters/examples/untrunc Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/untrunc Operator (Examples).tid new file mode 100644 index 000000000..a1415001a --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/untrunc Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190617162921280 +modified: 20190617162921280 +tags: [[untrunc Operator]] [[Operator Examples]] +title: untrunc Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[1.6]untrunc[]]">> +<<.operator-example 2 "[[-1.6]untrunc[]]">> +<<.operator-example 3 "=-1.2 =-2.4 =3.6 =4.8 =5.1 +[untrunc[]]">> diff --git a/editions/tw5.com/tiddlers/filters/trunc Operator.tid b/editions/tw5.com/tiddlers/filters/trunc Operator.tid index 43cf2d2dd..72bb23534 100644 --- a/editions/tw5.com/tiddlers/filters/trunc Operator.tid +++ b/editions/tw5.com/tiddlers/filters/trunc Operator.tid @@ -10,4 +10,6 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. +<<.tip " The trunc operator rounds towards zero. To round away from zero, use [[untrunc|untrunc Operator]].">> + <<.operator-examples "trunc">> diff --git a/editions/tw5.com/tiddlers/filters/untrunc Operator.tid b/editions/tw5.com/tiddlers/filters/untrunc Operator.tid new file mode 100644 index 000000000..9aaf06295 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/untrunc Operator.tid @@ -0,0 +1,15 @@ +caption: untrunc +created: 20190617163327756 +modified: 20190617163327756 +op-input: a [[selection of titles|Title Selection]] +op-output: rounds each of the input numbers to the next integer with largest absolute value, that is, away from zero +op-purpose: rounds a list of numbers to the next integer with largest absolute value, that is, away from zero +tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: untrunc Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Mathematics Operators]] for an overview. + +<<.tip " This is the inverse operation of [[trunc|trunc Operator]]: trunc rounds to zero, but untrunc rounds away from zero.">> + +<<.operator-examples "untrunc">> From 32a2bea7f5c841b56fc34a1fbb6670352f454a38 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 17 Jun 2019 15:21:23 -0500 Subject: [PATCH 0151/2376] Better examples for mathematics operators (#3982) Include = before each number in the Mathematics Operators examples, so that people get used to seeing that in math examples where dupes are likely. Only the Mathematics Operators tiddler really needed to be changed; the example tiddlers for individual operators were already using =. Fixes #3979. --- .../tiddlers/filters/Mathematics Operators.tid | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid b/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid index 8fb021dbe..2040e0293 100644 --- a/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid +++ b/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid @@ -17,15 +17,15 @@ The mathematics operators interpret their arguments as numbers according to the The mathematics operators take three different forms: * ''Unary operators'' apply an operation to each number in the input list (e.g. negate, truncate, sign) -** <<.inline-operator-example "1 2 3 4 +[negate[]]">> -** <<.inline-operator-example "1.2 2.4 3.6 4.8 +[trunc[]]">> -** <<.inline-operator-example "1.2 2.4 3.6 4.8 +[round[]]">> +** <<.inline-operator-example "=1 =2 =3 =4 +[negate[]]">> +** <<.inline-operator-example "=1.2 =2.4 =3.6 =4.8 +[trunc[]]">> +** <<.inline-operator-example "=1.2 =2.4 =3.6 =4.8 +[round[]]">> * ''Binary operators'' apply an operation and operand to each number in the input list (e.g. add, multiply, remainder) -** <<.inline-operator-example "1 2 3 4 +[add[3]]">> -** <<.inline-operator-example "1 2 3 4 +[multiply[8]]">> +** <<.inline-operator-example "=1 =2 =3 =4 +[add[3]]">> +** <<.inline-operator-example "=1 =2 =3 =4 +[multiply[8]]">> * ''Reducing operators'' apply an operation to all of the numbers in the input list, returning a single result (e.g. sum, product) -** <<.inline-operator-example "1 2 3 4 +[sum[]]">> -** <<.inline-operator-example "1 2 3 4 +[product[]]">> +** <<.inline-operator-example "=1 =2 =3 =4 +[sum[]]">> +** <<.inline-operator-example "=1 =2 =3 =4 +[product[]]">> Operators can be combined: From e6ac709840c53162fa8d24076404ba40b4681c88 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 17 Jun 2019 15:21:48 -0500 Subject: [PATCH 0152/2376] Clarify that the split operator does not dedupe (#3981) --- editions/tw5.com/tiddlers/filters/split Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/split Operator.tid b/editions/tw5.com/tiddlers/filters/split Operator.tid index e713eb326..27b946772 100644 --- a/editions/tw5.com/tiddlers/filters/split Operator.tid +++ b/editions/tw5.com/tiddlers/filters/split Operator.tid @@ -5,7 +5,7 @@ op-input: a [[selection of titles|Title Selection]] op-output: the input titles split into separate items according to the specified separator <<.place S>> op-parameter: The substring at which to split each title op-parameter-name: S -op-purpose: returns each item in the list split into separate strings according to the specified separator <<.place S>> +op-purpose: returns each item in the list split into separate strings according to the specified separator <<.place S>>; duplicates are <<.em not>> removed tags: [[Filter Operators]] title: split Operator type: text/vnd.tiddlywiki From c963680f9ce7f93ca89dde97ce17ebd201209cbd Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 17 Jun 2019 21:27:50 +0100 Subject: [PATCH 0153/2376] Release note updates --- editions/prerelease/tiddlers/Release 5.1.20.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index aac0e9259..d33006329 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[untrunc|untrunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. -Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|split Operator]] and [[join|join Operator]]. +Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter results, making it much easier to work with the new mathematics and string operators: @@ -119,6 +119,7 @@ New and improved translations: * [[@kyrias|https://github.com/kyrias]] * [[@MarxSal|https://github.com/MarxSal]] * [[@MidnightLightning|https://github.com/MidnightLightning]] +* [[@rmunn|https://github.com/rmunn]] * [[@talha131|https://github.com/talha131]] * [[@telmiger|https://github.com/telmiger]] * [[@the-kenny|https://github.com/the-kenny]] From 47dc59cd547fc189a0d93badd85b63fc37cccff2 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 17 Jun 2019 21:44:50 +0100 Subject: [PATCH 0154/2376] Fix caption for "join" operator docs Thanks @twMat --- editions/tw5.com/tiddlers/filters/join Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/join Operator.tid b/editions/tw5.com/tiddlers/filters/join Operator.tid index c53396887..280d03047 100644 --- a/editions/tw5.com/tiddlers/filters/join Operator.tid +++ b/editions/tw5.com/tiddlers/filters/join Operator.tid @@ -1,4 +1,4 @@ -caption: split +caption: join created: 20190613154502541 modified: 20190613154632657 op-input: a [[selection of titles|Title Selection]] From 6099ec576cb1f7300b7195ad5e47fee4ab169df5 Mon Sep 17 00:00:00 2001 From: Bimba Laszlo <bimbalaszlo@gmail.com> Date: Tue, 18 Jun 2019 10:41:50 +0200 Subject: [PATCH 0155/2376] Fix typo in docs of performance instrumentation (#3995) --- .../tw5.com/tiddlers/features/Performance Instrumentation.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid index 270e8bf7d..702782883 100644 --- a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid +++ b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid @@ -25,7 +25,7 @@ As an example, try switching between the sidebar tabs to compare how long they t More detailed information on filter execution timings is also available. With performance instrumentation enabled, ype the following JavaScript command in the browser developer console: ``` -tw.perf.log() +$tw.perf.log() ``` A table is displayed with the following information: From 6fd70f9c11a15981f4d8586c49f7533331f5872c Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Tue, 18 Jun 2019 11:49:52 +0200 Subject: [PATCH 0156/2376] Docs: Update CheckBox example (#3996) --- editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid index 60f1b389b..ec6e2162f 100644 --- a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid @@ -63,7 +63,7 @@ It is often necessary to use triple quotes with the `actions` attribute. Alterna <$macrocall $name='wikitext-example-without-html' src='<$fieldmangler> <$set filter="[[Features]] [[Encryption]] +[tags[]]" name="tag"> -<$checkbox actions="""<$action-setfield $field="tags" $value=<<tag>> /><$action-sendmessage $message="tm-add-tag" $param=<<tag>> />""" field="checked" checked="YES" unchecked="NO" > +<$checkbox actions="""<$action-setfield $field="tags" $value=<<tag>> ><$action-sendmessage $message="tm-add-tag" $param=<<tag>> />""" field="checked" checked="YES" unchecked="NO" > Add tags from tiddlers [[Features]] and [[Encryption]] </$checkbox> </$set> From 2e2ed7902ccb7c2f8093634d8abbade0765bd97c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 19 Jun 2019 12:11:02 +0100 Subject: [PATCH 0157/2376] Add sentencecase operator Fixes #4000 --- core/modules/filters/strings.js | 4 ++++ core/modules/utils/utils.js | 7 +++++++ editions/prerelease/tiddlers/Release 5.1.20.tid | 2 +- .../examples/sentencecase Operator (Examples).tid | 8 ++++++++ .../tiddlers/filters/lowercase Operator.tid | 4 ++-- .../tiddlers/filters/sentencecase Operator.tid | 15 +++++++++++++++ .../tiddlers/filters/uppercase Operator.tid | 4 ++-- 7 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/sentencecase Operator.tid diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index d844f7c56..d2a9b5f0b 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -26,6 +26,10 @@ exports.lowercase = makeStringBinaryOperator( function(a) {return [("" + a).toLowerCase()];} ); +exports.sentencecase = makeStringBinaryOperator( + function(a) {return [$tw.utils.toSentenceCase(a)];} +); + exports.trim = makeStringBinaryOperator( function(a) {return [$tw.utils.trim(a)];} ); diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 672961a40..1b1ccb548 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -92,6 +92,13 @@ exports.trim = function(str) { } }; +/* +Convert a string to sentence case (ie capitalise each initial letter) +*/ +exports.toSentenceCase = function(str) { + return (str || "").toLowerCase().replace(/(^|\s)\S/g, function(c) {return c.toUpperCase();}); +} + /* Find the line break preceding a given position in a string Returns position immediately after that line break, or the start of the string diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index d33006329..c1e52d6b2 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[untrunc|untrunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. -Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. +Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[sentencecase|sentencecase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter results, making it much easier to work with the new mathematics and string operators: diff --git a/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid new file mode 100644 index 000000000..5dd2a26bc --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190619110741485 +modified: 20190619110812080 +tags: [[uppercase Operator]] [[Operator Examples]] +title: sentencecase Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[abc def ghi jkl]sentencecase[]]">> +<<.operator-example 2 "[tag[HelloThere]sentencecase[]]">> diff --git a/editions/tw5.com/tiddlers/filters/lowercase Operator.tid b/editions/tw5.com/tiddlers/filters/lowercase Operator.tid index 1efaec980..110c79345 100644 --- a/editions/tw5.com/tiddlers/filters/lowercase Operator.tid +++ b/editions/tw5.com/tiddlers/filters/lowercase Operator.tid @@ -1,6 +1,6 @@ caption: lowercase created: 20190613153650010 -modified: 20190613153726427 +modified: 20190619110848522 op-input: a [[selection of titles|Title Selection]] op-output: the input titles with each uppercase letter replaced by the equivalent lowercase letter op-purpose: returns each item in the list as lowercase @@ -10,6 +10,6 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> -See also [[uppercase Operator]]. +See also [[uppercase Operator]] and [[sentencecase Operator]]. <<.operator-examples "lowercase">> diff --git a/editions/tw5.com/tiddlers/filters/sentencecase Operator.tid b/editions/tw5.com/tiddlers/filters/sentencecase Operator.tid new file mode 100644 index 000000000..dc2262ee2 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/sentencecase Operator.tid @@ -0,0 +1,15 @@ +caption: sentencecase +created: 20190619110607457 +modified: 20190619110736016 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles with each word capitalised +op-purpose: returns each item in the list capitalised +tags: [[Filter Operators]] +title: sentencecase Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +See also [[lowercase Operator]], [[uppercase Operator]]. + +<<.operator-examples "sentencecase">> diff --git a/editions/tw5.com/tiddlers/filters/uppercase Operator.tid b/editions/tw5.com/tiddlers/filters/uppercase Operator.tid index f52031bee..192922a3c 100644 --- a/editions/tw5.com/tiddlers/filters/uppercase Operator.tid +++ b/editions/tw5.com/tiddlers/filters/uppercase Operator.tid @@ -1,6 +1,6 @@ caption: uppercase created: 20190613153420821 -modified: 20190613153538557 +modified: 20190619110837473 op-input: a [[selection of titles|Title Selection]] op-output: the input titles with each lowercase letter replaced by the equivalent uppercase letter op-purpose: returns each item in the list as uppercase @@ -10,6 +10,6 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> -See also [[lowercase Operator]]. +See also [[lowercase Operator]] and [[sentencecase Operator]]. <<.operator-examples "uppercase">> From d8b79723cd3f3ecbdc307a39ade6dbebae2b3cb9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 19 Jun 2019 15:56:07 +0100 Subject: [PATCH 0158/2376] Docs: Remove broken example of checkbox actions attribute See https://github.com/Jermolene/TiddlyWiki5/pull/3996#issuecomment-503596160 --- .../tw5.com/tiddlers/widgets/CheckboxWidget.tid | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid index ec6e2162f..053eebab5 100644 --- a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid @@ -52,20 +52,3 @@ To use the checkbox widget in index mode set the ''index'' attribute to the inde The example below creates a checkbox that is checked if the index by the name of this tiddler in the tiddler ExampleData is equal to ''selected'' and unchecked if the index is an empty string. If the index is undefined then it defaults to an empty string, meaning the checkbox will be unchecked if the index is missing. <$macrocall $name="wikitext-example-without-html" src="""<$checkbox tiddler="ExampleData" index=<<currentTiddler>> checked="selected" unchecked="" default=""> Selected?</$checkbox>"""/> - -!! `actions` Attribute - -This example of using the `actions` attribute shows both the [[Action Set Field Widget|ActionSetFieldWidget]] and [[Action Send Message Widget|ActionSendMessageWidget]] to demonstrate two actions. - -The [[Set Widget|SetWidget]] uses a filter value to set the value of variable `tag`. The [[Action Send Message Widget|ActionSendMessageWidget]] joins all the tags into one large tag. The [[Action Set Field Widget|ActionSetFieldWidget]] appends the tags as individual tags. In this example, the [[Field Mangler Widget|FieldManglerWidget]] is required for the [[Action Send Message Widget|ActionSendMessageWidget]] but not for [[Action Set Field Widget|ActionSetFieldWidget]]. Be aware that the action occurs whether you check or uncheck. - -It is often necessary to use triple quotes with the `actions` attribute. Alternatively, the attribute can be assigned directly from a variable with `actions=<<my-actions>>`. - -<$macrocall $name='wikitext-example-without-html' src='<$fieldmangler> -<$set filter="[[Features]] [[Encryption]] +[tags[]]" name="tag"> -<$checkbox actions="""<$action-setfield $field="tags" $value=<<tag>> ><$action-sendmessage $message="tm-add-tag" $param=<<tag>> />""" field="checked" checked="YES" unchecked="NO" > - Add tags from tiddlers [[Features]] and [[Encryption]] -</$checkbox> -</$set> -</$fieldmangler>' /> - From 9b27f82a805df51ebc240593978a549138588c6c Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Fri, 21 Jun 2019 02:24:02 -0500 Subject: [PATCH 0159/2376] Fix sentencecase operator, add titlecase operator (#4006) --- core/modules/filters/strings.js | 4 ++++ core/modules/utils/utils.js | 11 +++++++++-- .../sentencecase Operator (Examples).tid | 6 ++++-- .../examples/titlecase Operator (Examples).tid | 10 ++++++++++ .../tiddlers/filters/sentencecase Operator.tid | 8 +++++--- .../tiddlers/filters/titlecase Operator.tid | 17 +++++++++++++++++ 6 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/titlecase Operator.tid diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index d2a9b5f0b..c62dcaac6 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -30,6 +30,10 @@ exports.sentencecase = makeStringBinaryOperator( function(a) {return [$tw.utils.toSentenceCase(a)];} ); +exports.titlecase = makeStringBinaryOperator( + function(a) {return [$tw.utils.toTitleCase(a)];} +); + exports.trim = makeStringBinaryOperator( function(a) {return [$tw.utils.trim(a)];} ); diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 1b1ccb548..289f132f8 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -93,12 +93,19 @@ exports.trim = function(str) { }; /* -Convert a string to sentence case (ie capitalise each initial letter) +Convert a string to sentence case (ie capitalise first letter) */ exports.toSentenceCase = function(str) { - return (str || "").toLowerCase().replace(/(^|\s)\S/g, function(c) {return c.toUpperCase();}); + return (str || "").replace(/^\S/, function(c) {return c.toUpperCase();}); } +/* +Convert a string to title case (ie capitalise each initial letter) +*/ +exports.toTitleCase = function(str) { + return (str || "").replace(/(^|\s)\S/g, function(c) {return c.toUpperCase();}); +} + /* Find the line break preceding a given position in a string Returns position immediately after that line break, or the start of the string diff --git a/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid index 5dd2a26bc..0511eafee 100644 --- a/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid @@ -1,8 +1,10 @@ created: 20190619110741485 -modified: 20190619110812080 +modified: 20190620140353983 tags: [[uppercase Operator]] [[Operator Examples]] title: sentencecase Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[[abc def ghi jkl]sentencecase[]]">> -<<.operator-example 2 "[tag[HelloThere]sentencecase[]]">> +<<.operator-example 2 "[[abc deF gHi jKL]sentencecase[]]">> +<<.operator-example 3 "[[abc deF gHi jKL]lowercase[]sentencecase[]]">> +<<.operator-example 4 "[tag[HelloThere]sentencecase[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid new file mode 100644 index 000000000..ff52026cf --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid @@ -0,0 +1,10 @@ +created: 20190620140005348 +modified: 20190620140412655 +tags: [[uppercase Operator]] [[Operator Examples]] +title: sentencecase Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[abc def ghi jkl]titlecase[]]">> +<<.operator-example 2 "[[abc deF gHi jKL]titlecase[]]">> +<<.operator-example 3 "[[abc deF gHi jKL]lowercase[]titlecase[]]">> +<<.operator-example 4 "[tag[HelloThere]titlecase[]]">> diff --git a/editions/tw5.com/tiddlers/filters/sentencecase Operator.tid b/editions/tw5.com/tiddlers/filters/sentencecase Operator.tid index dc2262ee2..1bcd3cb19 100644 --- a/editions/tw5.com/tiddlers/filters/sentencecase Operator.tid +++ b/editions/tw5.com/tiddlers/filters/sentencecase Operator.tid @@ -2,14 +2,16 @@ caption: sentencecase created: 20190619110607457 modified: 20190619110736016 op-input: a [[selection of titles|Title Selection]] -op-output: the input titles with each word capitalised -op-purpose: returns each item in the list capitalised +op-output: the input titles with each first letter capitalised +op-purpose: returns each item in the list with the first letter capitalised tags: [[Filter Operators]] title: sentencecase Operator type: text/vnd.tiddlywiki <<.from-version "5.1.20">> -See also [[lowercase Operator]], [[uppercase Operator]]. +See also [[lowercase Operator]], [[uppercase Operator]], [[titlecase Operator]]. + +<<.tip " This operator does not change anything except the first letter of each title, so `[[aBcD eFgH]]` would become `[[ABcD eFgH]]`. If you want `[[Abcd efgh]]`, then use a filter like `[lowercase[]sentencecase[]]`.">> <<.operator-examples "sentencecase">> diff --git a/editions/tw5.com/tiddlers/filters/titlecase Operator.tid b/editions/tw5.com/tiddlers/filters/titlecase Operator.tid new file mode 100644 index 000000000..2b869faaf --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/titlecase Operator.tid @@ -0,0 +1,17 @@ +caption: titlecase +created: 20190620135008529 +modified: 20190620135008529 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles with each word capitalised +op-purpose: returns each item in the list with each word capitalised +tags: [[Filter Operators]] +title: titlecase Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +See also [[lowercase Operator]], [[uppercase Operator]], [[sentencecase Operator]]. + +<<.tip " This operator does not change anything except the first letter of each word, so `[[aBcD eFgH]]` would become `[[ABcD EFgH]]`. If you want `[[Abcd Efgh]]`, then use a filter like `[lowercase[]titlecase[]]`.">> + +<<.operator-examples "titlecase">> From ceb2d9f119a6b01a885578c6fc8b608258185867 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Fri, 21 Jun 2019 09:36:09 +0200 Subject: [PATCH 0160/2376] Update StartupActions.tid (#4002) Regarding the bulleted tag pills; they should probably also be removed in place of text but I see value in keeping them for the sake of being able to easily peek at what they tag. We should probably have a section under Ctrlpanel>Settings where any startupaction-tiddlers are listed but since we don't yet, then the mentioned tag pills could perhaps remain.... except for the one in the PR. --- editions/tw5.com/tiddlers/features/StartupActions.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/features/StartupActions.tid b/editions/tw5.com/tiddlers/features/StartupActions.tid index e1aa53204..c7a392174 100644 --- a/editions/tw5.com/tiddlers/features/StartupActions.tid +++ b/editions/tw5.com/tiddlers/features/StartupActions.tid @@ -10,7 +10,7 @@ During startup, TiddlyWiki executes any ActionWidgets found in tiddlers with the * <<tag "$:/tags/StartupAction/Browser">> (only executed when running in the browser) * <<tag "$:/tags/StartupAction/Node">> (only executed when running under Node.js) -Startup actions are useful for customising TiddlyWiki according to environmental factors such as the screen size. For example, the following action widgets when placed in a tiddler tagged <<tag "$:/tags/StartupAction/Browser">> will cause the sidebar to be hidden by default when the screen width is less than 1000 pixels: +Startup actions are useful for customising TiddlyWiki according to environmental factors such as the screen size. For example, the following action widgets when placed in a tiddler tagged `$:/tags/StartupAction/Browser` will cause the sidebar to be hidden by default when the screen width is less than 1000 pixels: ``` <$reveal type="lt" state="$:/info/browser/screen/width" text="3000"> From 90684f9f52809ff5df39629d3b161d7ff23002f4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 21 Jun 2019 10:20:37 +0100 Subject: [PATCH 0161/2376] Add support for [is[blank]] to detect empty/blank strings --- core/modules/filters/is/blank.js | 36 ++++++++++++++++++++++++ editions/tw5.com/tiddlers/filters/is.tid | 5 ++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 core/modules/filters/is/blank.js diff --git a/core/modules/filters/is/blank.js b/core/modules/filters/is/blank.js new file mode 100644 index 000000000..8f500da45 --- /dev/null +++ b/core/modules/filters/is/blank.js @@ -0,0 +1,36 @@ +/*\ +title: $:/core/modules/filters/is/blank.js +type: application/javascript +module-type: isfilteroperator + +Filter function for [is[blank]] + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.blank = function(source,prefix,options) { + var results = []; + if(prefix === "!") { + source(function(tiddler,title) { + if(title) { + results.push(title); + } + }); + } else { + source(function(tiddler,title) { + if(!title) { + results.push(title); + } + }); + } + return results; +}; + +})(); diff --git a/editions/tw5.com/tiddlers/filters/is.tid b/editions/tw5.com/tiddlers/filters/is.tid index 6e838e872..bec256edf 100644 --- a/editions/tw5.com/tiddlers/filters/is.tid +++ b/editions/tw5.com/tiddlers/filters/is.tid @@ -13,7 +13,7 @@ op-neg-output: those input tiddlers that do <<.em not>> belong to category <<.pl The parameter <<.place C>> is one of the following fundamental categories: -|!Category |!Matches any tiddler that... | +|!Category |!Matches any tiddler title that... | |^`current` |is the [[current tiddler|Current Tiddler]] | |^`image` |has an image ContentType | |^`missing` |does not exist (other than possibly as a shadow tiddler), regardless of whether there are any links to it | @@ -22,7 +22,8 @@ The parameter <<.place C>> is one of the following fundamental categories: |^`system` |is a [[system tiddler|SystemTiddlers]], i.e. its title starts with `$:/` | |^`tag` |is in use as a tag | |^`tiddler` |exists as a non-shadow tiddler | -|^`variable` |<<.from-version "5.1.20">> exists as a variable (whether or not it has a non-blank value) | +|^`variable` |<<.from-version "5.1.20">> exists as a variable (whether or not that variable has a non-blank value) | +|^`blank` |<<.from-version "5.1.20">> is blank (i.e. is a zero length string) | If <<.place C>> is anything else an error message is returned. <<.from-version "5.1.14">> if <<.place C>> is blank, the output is passed through unchanged (in earlier versions an error message was returned). From 6582b106ee4d226d2f686b78b632eded44c1f07b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 21 Jun 2019 10:21:52 +0100 Subject: [PATCH 0162/2376] Fixes to split operator, plus instructions for using it to do search and replace --- core/modules/filters/strings.js | 20 +++++++++---- .../tiddlers/filters/split Operator.tid | 24 ++++++++++++++++ .../tiddlers/filters/splitregexp Operator.tid | 28 +++++++++++++++++++ 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index c62dcaac6..27273ca41 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -39,13 +39,17 @@ exports.trim = makeStringBinaryOperator( ); exports.split = makeStringBinaryOperator( - function(a,b) {return ("" + a).split(b).filter(function(str) {return !!str;});} + function(a,b) {return ("" + a).split(b);} ); exports.join = makeStringReducingOperator( function(accumulator,value,operand) { - return "" + (accumulator ? accumulator + (operand || "") + value : value); - } + if(accumulator === null) { + return value; + } else { + return accumulator + operand + value; + } + },null ); function makeStringBinaryOperator(fnCalc) { @@ -59,7 +63,6 @@ function makeStringBinaryOperator(fnCalc) { } function makeStringReducingOperator(fnCalc,initialValue) { - initialValue = initialValue || ""; return function(source,operator,options) { var result = []; source(function(tiddler,title) { @@ -75,10 +78,15 @@ exports.splitregexp = function(source,operator,options) { var result = [], suffix = operator.suffix || "", flags = (suffix.indexOf("m") !== -1 ? "m" : "") + (suffix.indexOf("i") !== -1 ? "i" : ""), - regExp = new RegExp(operator.operand || "",flags); + regExp; + try { + regExp = new RegExp(operator.operand || "",flags); + } catch(ex) { + return ["RegExp error: " + ex]; + } source(function(tiddler,title) { Array.prototype.push.apply(result,title.split(regExp)); - }); + }); return result; }; diff --git a/editions/tw5.com/tiddlers/filters/split Operator.tid b/editions/tw5.com/tiddlers/filters/split Operator.tid index 27b946772..552e7daf5 100644 --- a/editions/tw5.com/tiddlers/filters/split Operator.tid +++ b/editions/tw5.com/tiddlers/filters/split Operator.tid @@ -12,4 +12,28 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> +Note that in some circumstances the <<.op split>> operator will include blank items in the list of results. For example, + +``` +[[the band thethe are the best the]split[the]] +``` + +The following results are returned: + +``` +["", " band ", "", " are ", " best ", ""] +``` + +Where it might be expected that the results would be: + +``` +[" band ", " are ", " best "] +``` + +The blank items mark the boundaries between matches. If they are not required they can be removed with the ''blank'' category of the [[is Operator]]: `[[the band thethe are the best the]split[the]!is[blank]]`. + +The reason that the blank items can be useful is that they allow search and replace operations to be constructed from a combination of the [[split Operator]] or [[splitregexp Operator]] and the [[join Operator]]. For example: + +<<.operator-example 1 "[[the band thethe are the best the]split[the]join[every]]">> + <<.operator-examples "split">> diff --git a/editions/tw5.com/tiddlers/filters/splitregexp Operator.tid b/editions/tw5.com/tiddlers/filters/splitregexp Operator.tid index 085cbd1ff..59043e7f8 100644 --- a/editions/tw5.com/tiddlers/filters/splitregexp Operator.tid +++ b/editions/tw5.com/tiddlers/filters/splitregexp Operator.tid @@ -13,4 +13,32 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.20">> +Note that in some circumstances the <<.op splitregexp>> operator will include blank items in the list of results. For example, + +``` +[[the band thethe are the best the]splitregexp[the]] +``` + +The following results are returned: + +``` +["", " band ", "", " are ", " best ", ""] +``` + +Where it might be expected that the results would be: + +``` +[" band ", " are ", " best "] +``` + +The blank items mark the boundaries between matches. If they are not required they can be removed with the ''blank'' category of the [[is Operator]]: `[[the band thethe are the best the]splitregexp[the]!is[blank]]`. + +The reason that the blank items can be useful is that they allow search and replace operations to be constructed from a combination of the [[split Operator]] or [[splitregexp Operator]] and the [[join Operator]]. For example: + +<<.operator-example 1 "[[nobody, really; wants; to see -- all this \punctuation]splitregexp[,|;|-|\\]join[...]]">> + +Syntax errors in the regular expression will cause the filter to return an error message. For example: + +<<.operator-example 2 "[[the cat sat on the mat]splitregexp[\]]">> + <<.operator-examples "splitregexp">> From c8d6f3b681950a42063abd499fd075b2c480773b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 21 Jun 2019 10:36:53 +0100 Subject: [PATCH 0163/2376] Fix tests for changes to split operator We now retain any blank strings --- editions/test/tiddlers/tests/test-filters.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 553183f49..76e604e31 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -387,8 +387,8 @@ function runTests(wiki) { expect(wiki.filterTiddlers("John Paul George Ringo +[uppercase[]]").join(",")).toBe("JOHN,PAUL,GEORGE,RINGO"); expect(wiki.filterTiddlers("John Paul George Ringo +[lowercase[]]").join(",")).toBe("john,paul,george,ringo"); expect(wiki.filterTiddlers("John Paul George Ringo +[split[]]").join(",")).toBe("J,o,h,n,P,a,u,l,G,e,o,r,g,e,R,i,n,g,o"); - expect(wiki.filterTiddlers("[[John. Paul. George. Ringo.]] +[split[.]trim[]]").join(",")).toBe("John,Paul,George,Ringo"); - expect(wiki.filterTiddlers("John Paul George Ringo +[split[e]]").join(",")).toBe("John,Paul,G,org,Ringo"); + expect(wiki.filterTiddlers("[[John. Paul. George. Ringo.]] +[split[.]trim[]]").join(",")).toBe("John,Paul,George,Ringo,"); + expect(wiki.filterTiddlers("John Paul George Ringo +[split[e]]").join(",")).toBe("John,Paul,G,org,,Ringo"); expect(wiki.filterTiddlers("John Paul George Ringo +[join[ ]split[e]join[ee]split[ ]]").join(",")).toBe("John,Paul,Geeorgee,Ringo"); expect(wiki.filterTiddlers("[[ John ]] [[Paul ]] [[ George]] Ringo +[trim[]join[-]]").join(",")).toBe("John-Paul-George-Ringo"); }); From fd8ede07bf0d4d782329faa4cccdd0aae0c87386 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 21 Jun 2019 10:52:54 +0100 Subject: [PATCH 0164/2376] Release note updates --- editions/prerelease/tiddlers/Release 5.1.20.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index c1e52d6b2..9be098d38 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[untrunc|untrunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. -Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[sentencecase|sentencecase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. +Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[titlecase|titlecase Operator]], [[sentencecase|sentencecase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter results, making it much easier to work with the new mathematics and string operators: @@ -60,6 +60,7 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/754c1251a9bdf45e8f64079a4bbdaed2d05be2b7]] new [[variables Operator]] and [[getvariable Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3880]] new [[unusedtitle Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/36e76429b1a1d4638374d513430393db5693b932]] new `[is[variable]]` option to the [[is Operator]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/90684f9f52809ff5df39629d3b161d7ff23002f4]] new `[is[blank]]` option to the [[is Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/94f143bf643e36e817d1dd5b678515853eed6aca]] optional autofocus for the text inputs in $:/AdvancedSearch (controlled by the same [[Hidden Setting: Search AutoFocus]] as the sidebar search) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3756]] optional ''tabindex'' attribute to simple, framed and CodeMirror text editor engines * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3758]] ''tabindex'' attributes to edit templates From a6500ba7111aab230e32334059fadcc0450f8ad6 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 21 Jun 2019 15:19:51 +0100 Subject: [PATCH 0165/2376] DynaView: Suppress local storage errors --- plugins/tiddlywiki/dynaview/dynaview.js | 36 ++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/plugins/tiddlywiki/dynaview/dynaview.js b/plugins/tiddlywiki/dynaview/dynaview.js index 4c0b846a8..271a41985 100644 --- a/plugins/tiddlywiki/dynaview/dynaview.js +++ b/plugins/tiddlywiki/dynaview/dynaview.js @@ -31,6 +31,8 @@ var LOCAL_STORAGE_KEY_PREFIX = "tw5-dynaview-scroll-position#"; var hasRestoredScrollPosition = false; +var localStorageHasFailed = false; + exports.startup = function() { var topmost = null, lastScrollY; $tw.boot.disableStartupNavigation = true; @@ -165,16 +167,18 @@ function updateAddressBar() { } function saveScrollPosition() { - if(hasRestoredScrollPosition && $tw.wiki.getTiddlerText("$:/config/DynaView/RestoreScrollPositionAtStartup") === "yes") { - var top = findTopmostTiddler(); - if(top.element) { - try { - window.localStorage.setItem(LOCAL_STORAGE_KEY_PREFIX + window.location.pathname,JSON.stringify({ - title: top.title, - offset: top.offset - })); - } catch(e) { - console.log("Error setting local storage",e) + if(!localStorageHasFailed) { + if(hasRestoredScrollPosition && $tw.wiki.getTiddlerText("$:/config/DynaView/RestoreScrollPositionAtStartup") === "yes") { + var top = findTopmostTiddler(); + if(top.element) { + try { + window.localStorage.setItem(LOCAL_STORAGE_KEY_PREFIX + window.location.pathname,JSON.stringify({ + title: top.title, + offset: top.offset + })); + } catch(e) { + localStorageHasFailed = true; + } } } } @@ -182,11 +186,13 @@ function saveScrollPosition() { function restoreScrollPosition() { var json; - try { - json = JSON.parse(window.localStorage.getItem(LOCAL_STORAGE_KEY_PREFIX + window.location.pathname)); - } catch(e) { - // Ignore errors - }; + if(!localStorageHasFailed) { + try { + json = JSON.parse(window.localStorage.getItem(LOCAL_STORAGE_KEY_PREFIX + window.location.pathname)); + } catch(e) { + localStorageHasFailed = true; + }; + } return json; } From b580baf5ee57801464538c3c5d703972684cad58 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 21 Jun 2019 15:21:10 +0100 Subject: [PATCH 0166/2376] Add a "commit" field to the $:/build tiddler --- bin/build-site.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/build-site.sh b/bin/build-site.sh index 42f709c60..6f5794f04 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -32,6 +32,8 @@ if [ -z "$TW5_BUILD_DETAILS" ]; then TW5_BUILD_DETAILS="$(git symbolic-ref --short HEAD)-$(git rev-parse HEAD) from $(git remote get-url origin)" fi +TW5_BUILD_COMMIT="$(git rev-parse HEAD)" + echo "Using TW5_BUILD_DETAILS as [$TW5_BUILD_DETAILS]" # Set up the build output directory @@ -74,7 +76,7 @@ echo "<a href='./plugins/tiddlywiki/tahoelafs/index.html'>Moved to http://tiddly # Put the build details into a .tid file so that it can be included in each build (deleted at the end of this script) -echo -e -n "title: $:/build\n\n$TW5_BUILD_DETAILS\n" > $TW5_BUILD_OUTPUT/build.tid +echo -e -n "title: $:/build\ncommit: $TW_BUILD_COMMIT\n\n$TW5_BUILD_DETAILS\n" > $TW5_BUILD_OUTPUT/build.tid ###################################################### # From e09ac2ab3795cf3ba46141f32daaf5ca4029dcfa Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 23 Jun 2019 20:11:55 +0100 Subject: [PATCH 0167/2376] CI: Fix commit field in $:/build --- bin/build-site.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bin/build-site.sh b/bin/build-site.sh index 6f5794f04..f6cc2dfea 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -32,10 +32,14 @@ if [ -z "$TW5_BUILD_DETAILS" ]; then TW5_BUILD_DETAILS="$(git symbolic-ref --short HEAD)-$(git rev-parse HEAD) from $(git remote get-url origin)" fi -TW5_BUILD_COMMIT="$(git rev-parse HEAD)" - echo "Using TW5_BUILD_DETAILS as [$TW5_BUILD_DETAILS]" +if [ -z "$TW5_BUILD_COMMIT" ]; then + TW5_BUILD_COMMIT="$(git rev-parse HEAD)" +fi + +echo "Using TW5_BUILD_COMMIT as [$TW5_BUILD_COMMIT]" + # Set up the build output directory if [ -z "$TW5_BUILD_OUTPUT" ]; then @@ -76,7 +80,7 @@ echo "<a href='./plugins/tiddlywiki/tahoelafs/index.html'>Moved to http://tiddly # Put the build details into a .tid file so that it can be included in each build (deleted at the end of this script) -echo -e -n "title: $:/build\ncommit: $TW_BUILD_COMMIT\n\n$TW5_BUILD_DETAILS\n" > $TW5_BUILD_OUTPUT/build.tid +echo -e -n "title: $:/build\ncommit: $TW5_BUILD_COMMIT\n\n$TW5_BUILD_DETAILS\n" > $TW5_BUILD_OUTPUT/build.tid ###################################################### # From cb2bf25563c9a5493d86befef1b781c6da310ce3 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 24 Jun 2019 04:36:28 -0500 Subject: [PATCH 0168/2376] Fix examples for sentencecase and titlecase (#4010) --- .../filters/examples/sentencecase Operator (Examples).tid | 2 +- .../filters/examples/titlecase Operator (Examples).tid | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid index 0511eafee..365e2e44c 100644 --- a/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/sentencecase Operator (Examples).tid @@ -1,6 +1,6 @@ created: 20190619110741485 modified: 20190620140353983 -tags: [[uppercase Operator]] [[Operator Examples]] +tags: [[sentencecase Operator]] [[Operator Examples]] title: sentencecase Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid index ff52026cf..cc2a8dfe1 100644 --- a/editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/titlecase Operator (Examples).tid @@ -1,7 +1,7 @@ created: 20190620140005348 modified: 20190620140412655 -tags: [[uppercase Operator]] [[Operator Examples]] -title: sentencecase Operator (Examples) +tags: [[titlecase Operator]] [[Operator Examples]] +title: titlecase Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[[abc def ghi jkl]titlecase[]]">> From dc9f4e2de7fc17009e7f57996ba3d77c3864f4ee Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 26 Jun 2019 12:50:52 +0200 Subject: [PATCH 0169/2376] Pop storyview: animation - don't x-overflow page (#3857) ... this makes the animation when inserting tiddlers / navigating to tiddlers in the pop storyview less jumpy it simply sets `overflow-x` to `hidden` for the time of the insert-animation --- core/modules/storyviews/pop.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/modules/storyviews/pop.js b/core/modules/storyviews/pop.js index 1896633f4..f720785c6 100644 --- a/core/modules/storyviews/pop.js +++ b/core/modules/storyviews/pop.js @@ -44,7 +44,14 @@ PopStoryView.prototype.insert = function(widget) { {transition: "none"}, {transform: "none"} ]); + $tw.utils.setStyle(widget.document.body,[ + {"overflow-x": ""} + ]); },duration); + // Prevent the page from overscrolling due to the zoom factor + $tw.utils.setStyle(widget.document.body,[ + {"overflow-x": "hidden"} + ]); // Set up the initial position of the element $tw.utils.setStyle(targetElement,[ {transition: "none"}, From e313b0b7caf730e8967abfe796b590098569137c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 26 Jun 2019 13:31:22 +0200 Subject: [PATCH 0170/2376] CSS.escape as startup module (#3574) * don't know what I'm doing - apply polyfill methods * don't know what I'm doing add CSS.escape polyfill * execute polyfills in load-modules * Delete cssescape.js * add css-escape polyfill as startup module * Update load-modules.js * this was for testing :) * Update css-escape-polyfill.js * Update css-escape-polyfill.js --- core/modules/startup/css-escape-polyfill.js | 114 ++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 core/modules/startup/css-escape-polyfill.js diff --git a/core/modules/startup/css-escape-polyfill.js b/core/modules/startup/css-escape-polyfill.js new file mode 100644 index 000000000..288a7336b --- /dev/null +++ b/core/modules/startup/css-escape-polyfill.js @@ -0,0 +1,114 @@ +/*\ +title: $:/core/modules/startup/CSSescape.js +type: application/javascript +module-type: startup + +Polyfill for CSS.escape() + +\*/ +(function(root,factory){ +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +// Export name and synchronous status +exports.name = "css-escape"; +exports.platforms = ["browser"]; +exports.after = ["startup"]; +exports.synchronous = true; + +/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */ +// https://github.com/umdjs/umd/blob/master/returnExports.js +exports.startup = factory(root); +}(typeof global != 'undefined' ? global : this, function(root) { + + if (root.CSS && root.CSS.escape) { + return; + } + + // https://drafts.csswg.org/cssom/#serialize-an-identifier + var cssEscape = function(value) { + if (arguments.length == 0) { + throw new TypeError('`CSS.escape` requires an argument.'); + } + var string = String(value); + var length = string.length; + var index = -1; + var codeUnit; + var result = ''; + var firstCodeUnit = string.charCodeAt(0); + while (++index < length) { + codeUnit = string.charCodeAt(index); + // Note: there’s no need to special-case astral symbols, surrogate + // pairs, or lone surrogates. + + // If the character is NULL (U+0000), then the REPLACEMENT CHARACTER + // (U+FFFD). + if (codeUnit == 0x0000) { + result += '\uFFFD'; + continue; + } + + if ( + // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is + // U+007F, […] + (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || + // If the character is the first character and is in the range [0-9] + // (U+0030 to U+0039), […] + (index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || + // If the character is the second character and is in the range [0-9] + // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] + ( + index == 1 && + codeUnit >= 0x0030 && codeUnit <= 0x0039 && + firstCodeUnit == 0x002D + ) + ) { + // https://drafts.csswg.org/cssom/#escape-a-character-as-code-point + result += '\\' + codeUnit.toString(16) + ' '; + continue; + } + + if ( + // If the character is the first character and is a `-` (U+002D), and + // there is no second character, […] + index == 0 && + length == 1 && + codeUnit == 0x002D + ) { + result += '\\' + string.charAt(index); + continue; + } + + // If the character is not handled by one of the above rules and is + // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or + // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to + // U+005A), or [a-z] (U+0061 to U+007A), […] + if ( + codeUnit >= 0x0080 || + codeUnit == 0x002D || + codeUnit == 0x005F || + codeUnit >= 0x0030 && codeUnit <= 0x0039 || + codeUnit >= 0x0041 && codeUnit <= 0x005A || + codeUnit >= 0x0061 && codeUnit <= 0x007A + ) { + // the character itself + result += string.charAt(index); + continue; + } + + // Otherwise, the escaped character. + // https://drafts.csswg.org/cssom/#escape-a-character + result += '\\' + string.charAt(index); + + } + return result; + }; + + if (!root.CSS) { + root.CSS = {}; + } + + root.CSS.escape = cssEscape; + +})); From 69d3a4707370cc15064a6ed74dd4b13236dccb4a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 26 Jun 2019 13:32:01 +0200 Subject: [PATCH 0171/2376] Add escapecss filter (#3546) * add escapecss filter this filter would allow creating valid css classes from titles containing special characters we assign a class to an element using `encodeuricomponent[]` so that the class name is encoded in a stylesheet we create the classname by `<title>escapecss[]` which applies the uri encoding and escapes characters that need to be escaped * Update encodings.js * refactor tagToCssSelector, add escapeCssSelector * use escapeCssSelector * escape using CSS.escape if it's available * Update encodings.js * revert factoring out escapeCssSelector --- core/modules/filters/encodings.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/modules/filters/encodings.js b/core/modules/filters/encodings.js index b03354ada..f41350791 100644 --- a/core/modules/filters/encodings.js +++ b/core/modules/filters/encodings.js @@ -98,4 +98,13 @@ exports.escaperegexp = function(source,operator,options) { return results; }; +exports.escapecss = function(source,operator,options) { + var results = []; + source(function(tiddler,title) { + // escape any character with a special meaning in CSS using CSS.escape() + results.push(CSS.escape(title)); + }); + return results; +}; + })(); From 448d108d693b1a02d9ca085165340e1f4924cb53 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 26 Jun 2019 13:33:44 +0200 Subject: [PATCH 0172/2376] Make ContributionBanner more solid (#3645) this makes the contribution banner work with "badly" named tiddlers, too --- .../tw5.com/tiddlers/system/ContributionBanner.tid | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/editions/tw5.com/tiddlers/system/ContributionBanner.tid b/editions/tw5.com/tiddlers/system/ContributionBanner.tid index 4fe24c7eb..f2ff308ab 100644 --- a/editions/tw5.com/tiddlers/system/ContributionBanner.tid +++ b/editions/tw5.com/tiddlers/system/ContributionBanner.tid @@ -5,16 +5,16 @@ list-after: $:/core/ui/EditTemplate/title \define makeGitHubLink() https://github.com/Jermolene/TiddlyWiki5/edit/tiddlywiki-com/editions/tw5.com/tiddlers/$(githubLink)$ \end -\define innerMakeGitHubLink(linkText) -<$set name="githubLink" value={{$:/config/OriginalTiddlerPaths##$(draftOfTiddler)$}}> +\define innerMakeGitHubLink(linkText,tiddler) +<$set name="githubLink" value={{{ [[$:/config/OriginalTiddlerPaths]getindex<__tiddler__>] }}}> <a href=<<makeGitHubLink>> class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">$linkText$</a> </$set> \end \define outerMakeGitHubLink(linkText) -<$set name="draftOfTiddler" value={{$(currentTiddler)$!!draft.of}}> -<<innerMakeGitHubLink "$linkText$">> +<$set name="draftOfTiddler" value={{{ [[$(currentTiddler)$]get[draft.of]] }}}> +<$macrocall $name="innerMakeGitHubLink" linkText="$linkText$" tiddler=<<draftOfTiddler>>/> </$set> \end <div class="tc-improvement-banner"> -{{$:/core/images/star-filled}} Can you help us improve this documentation? [[Find out how|Improving TiddlyWiki Documentation]] to edit <<outerMakeGitHubLink "this tiddler on ~GitHub">> +{{$:/core/images/star-filled}} Can you help us improve this documentation? [[Find out how|Improving TiddlyWiki Documentation]] to edit <$macrocall $name="outerMakeGitHubLink" linkText="this tiddler on ~GitHub"/> </div> From 31b141097d2ea3d8ac4e5a1f87c1ec462f605eb7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 26 Jun 2019 13:34:18 +0200 Subject: [PATCH 0173/2376] Tags edittemplate: replace × with svg (#3859) * tags edittemplate: replace × with close-button svg * make close-button smaller + v-aligned middle --- core/ui/EditTemplate/tags.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index e2ca88d8e..d368ce491 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -16,7 +16,7 @@ color:$(foregroundColor)$; <$vars foregroundColor=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">> backgroundColor="""$colour$"""> <span style=<<tag-styles>> class="tc-tag-label tc-tag-list-item"> <$transclude tiddler="""$icon$"""/> <$view field="title" format="text" /> -<$button message="tm-remove-tag" param={{!!title}} class="tc-btn-invisible tc-remove-tag-button">×</$button> +<$button message="tm-remove-tag" param={{!!title}} class="tc-btn-invisible tc-remove-tag-button">{{$:/core/images/close-button}}</$button> </span> </$vars> \end diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index cf05274df..dd3b20e06 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -662,6 +662,11 @@ button.tc-untagged-label { vertical-align: text-bottom; } +.tc-edit-tags button.tc-remove-tag-button svg { + font-size: 0.7em; + vertical-align: middle; +} + .tc-tag-manager-table .tc-tag-label { white-space: normal; } From 36c7e82cc0cd4bf5df72af8dbe3ca6b13dff7a5d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 26 Jun 2019 13:36:13 +0200 Subject: [PATCH 0174/2376] Add/refactor PaletteManager (#3832) * add PaletteManager * add hint for "external" palette-names * macro utility, for local \import only this tiddler is never meant to be tagged $:/tags/Macro contains only a colour macro which allows to call `<<colour "...">>` within a tiddler and get the parameter-name instead of the resolved color used in the PaletteManager to reveal the original color below the color that just uses its color with the colour macrocall example: ``` \define get-real-index(string) \import $:/core/macros/utils <$wikify $name="result" text="""$string$"""> <- does the "colour" macrocall, but the one that returns the parameter name <<result>> </$wikify> \end <$set name="color" value={{{ [{$:/palette}getindex[color-of-interest]] }}}> -> <<colour primary>> <$wikify name="real-color-index" text="""<$macrocall $name="get-real-index" string=<<color>>/>"""> <<real-color-index>> -> primary ... ``` * transclude PaletteManager in snippets/paletteeditor * transclude PaletteManager in core/ui/ControlPanel/Palette * Update ControlPanel.multids * add style for color inputs in PaletteManager * Update PaletteManager.tid * Update PaletteManager.tid * add tooltips & aria-labels * Update ControlPanel.multids * Update PaletteManager.tid * Update PaletteManager.tid * Update PaletteManager.tid --- core/language/en-GB/ControlPanel.multids | 2 + core/ui/ControlPanel/Palette.tid | 2 +- core/ui/PaletteManager.tid | 93 ++++++++++++++++++++++++ core/wiki/macros/utils.tid | 5 ++ core/wiki/paletteeditor.tid | 38 +--------- themes/tiddlywiki/vanilla/base.tid | 5 ++ 6 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 core/ui/PaletteManager.tid create mode 100644 core/wiki/macros/utils.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 7621842ab..c81381aea 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -47,6 +47,8 @@ LoadedModules/Hint: These are the currently loaded tiddler modules linked to the Palette/Caption: Palette Palette/Editor/Clone/Caption: clone Palette/Editor/Clone/Prompt: It is recommended that you clone this shadow palette before editing it +Palette/Editor/Delete/Hint: delete this entry from the current palette +Palette/Editor/Names/External/Show: Show color names that are not part of the current palette Palette/Editor/Prompt/Modified: This shadow palette has been modified Palette/Editor/Prompt: Editing Palette/Editor/Reset/Caption: reset diff --git a/core/ui/ControlPanel/Palette.tid b/core/ui/ControlPanel/Palette.tid index c76b4984e..335a3632d 100644 --- a/core/ui/ControlPanel/Palette.tid +++ b/core/ui/ControlPanel/Palette.tid @@ -15,7 +15,7 @@ caption: {{$:/language/ControlPanel/Palette/Caption}} <$reveal type="match" state="$:/state/ShowPaletteEditor" text="yes"> <$button set="$:/state/ShowPaletteEditor" setTo="no"><<lingo HideEditor/Caption>></$button> -{{$:/snippets/paletteeditor}} +{{$:/PaletteManager}} </$reveal> diff --git a/core/ui/PaletteManager.tid b/core/ui/PaletteManager.tid new file mode 100644 index 000000000..c1a46df3c --- /dev/null +++ b/core/ui/PaletteManager.tid @@ -0,0 +1,93 @@ +title: $:/PaletteManager + +\define lingo-base() $:/language/ControlPanel/Palette/Editor/ +\define describePaletteColour(colour) +<$transclude tiddler="$:/language/Docs/PaletteColours/$colour$"><$text text="$colour$"/></$transclude> +\end +\define edit-colour-placeholder() + edit $(colourName)$ +\end +\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ +\define resolve-colour(macrocall) +\import $:/core/macros/utils +\whitespace trim +<$wikify name="name" text="""$macrocall$"""> +<<name>> +</$wikify> +\end +\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/> +\define palette-manager-colour-row-segment() +\whitespace trim +<$edit-text index=<<colourName>> tag="input" placeholder=<<edit-colour-placeholder>> default=""/> +<br> +<$edit-text index=<<colourName>> type="color" tag="input" class="tc-palette-manager-colour-input"/> +<$list filter="[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]" variable="ignore"> +<$set name="state" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}> +<$wikify name="newColourName" text="""<$macrocall $name="resolve-colour" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>"""> +<$reveal state=<<state>> type="nomatch" text="show"> +<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class="tc-btn-invisible" set=<<state>> setTo="show">{{$:/core/images/down-arrow}} <$text text=<<newColourName>>/></$button><br> +</$reveal> +<$reveal state=<<state>> type="match" text="show"> +<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class="tc-btn-invisible" actions="""<$action-deletetiddler $tiddler=<<state>>/>""">{{$:/core/images/up-arrow}} <$text text=<<newColourName>>/></$button><br> +</$reveal> +<$reveal state=<<state>> type="match" text="show"> +<$set name="colourName" value=<<newColourName>>> +<br> +<<palette-manager-colour-row-segment>> +<br><br> +</$set> +</$reveal> +</$wikify> +</$set> +</$list> +\end +\define palette-manager-colour-row() +\whitespace trim +<tr> +<td> +<span style="float:right;"> +<$button tooltip=<<lingo Delete/Hint>> aria-label=<<lingo Delete/Hint>> class="tc-btn-invisible" actions=<<delete-colour-index-actions>>> +{{$:/core/images/delete-button}}</$button> +</span> +''<$macrocall $name="describePaletteColour" colour=<<colourName>>/>''<br/> +<$macrocall $name="colourName" $output="text/plain"/> +</td> +<td> +<<palette-manager-colour-row-segment>> +</td> +</tr> +\end +\define palette-manager-table() +\whitespace trim +<table> +<tbody> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]" variable="colourName"> +<$list filter="[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]" variable="ignore" emptyMessage=""" +<$list filter="[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]" variable="ignore"> +<<palette-manager-colour-row>> +</$list> +"""> +<<palette-manager-colour-row>> +</$list> +</$list> +</tbody> +</table> +\end +<$set name="currentTiddler" value={{$:/palette}}> + +<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name="currentTiddler" $output="text/plain"/></$link> + +<$list filter="[all[current]is[shadow]is[tiddler]]" variable="listItem"> +<<lingo Prompt/Modified>> +<$button message="tm-delete-tiddler" param={{$:/palette}}><<lingo Reset/Caption>></$button> +</$list> + +<$list filter="[all[current]is[shadow]!is[tiddler]]" variable="listItem"> +<<lingo Clone/Prompt>> +</$list> + +<$button message="tm-new-tiddler" param={{$:/palette}}><<lingo Clone/Caption>></$button> + +<$checkbox tiddler="$:/state/palettemanager/showexternal" field="text" checked="yes" unchecked="no"> <<lingo Names/External/Show>></$checkbox> + +<<palette-manager-table>> diff --git a/core/wiki/macros/utils.tid b/core/wiki/macros/utils.tid new file mode 100644 index 000000000..f17c6cadc --- /dev/null +++ b/core/wiki/macros/utils.tid @@ -0,0 +1,5 @@ +title: $:/core/macros/utils + +\define colour(colour) +$colour$ +\end diff --git a/core/wiki/paletteeditor.tid b/core/wiki/paletteeditor.tid index b1d57dbd1..8e6c9fea8 100644 --- a/core/wiki/paletteeditor.tid +++ b/core/wiki/paletteeditor.tid @@ -1,39 +1,3 @@ title: $:/snippets/paletteeditor -\define lingo-base() $:/language/ControlPanel/Palette/Editor/ -\define describePaletteColour(colour) -<$transclude tiddler="$:/language/Docs/PaletteColours/$colour$"><$text text="$colour$"/></$transclude> -\end -<$set name="currentTiddler" value={{$:/palette}}> - -<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name="currentTiddler" $output="text/plain"/></$link> - -<$list filter="[all[current]is[shadow]is[tiddler]]" variable="listItem"> -<<lingo Prompt/Modified>> -<$button message="tm-delete-tiddler" param={{$:/palette}}><<lingo Reset/Caption>></$button> -</$list> - -<$list filter="[all[current]is[shadow]!is[tiddler]]" variable="listItem"> -<<lingo Clone/Prompt>> -</$list> - -<$button message="tm-new-tiddler" param={{$:/palette}}><<lingo Clone/Caption>></$button> - -<table> -<tbody> -<$list filter="[all[current]indexes[]]" variable="colourName"> -<tr> -<td> -''<$macrocall $name="describePaletteColour" colour=<<colourName>>/>''<br/> -<$macrocall $name="colourName" $output="text/plain"/> -</td> -<td> -<$edit-text index=<<colourName>> tag="input"/> -<br> -<$edit-text index=<<colourName>> type="color" tag="input"/> -</td> -</tr> -</$list> -</tbody> -</table> -</$set> +<$transclude tiddler="$:/PaletteManager"/> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index dd3b20e06..775bee9f5 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2266,6 +2266,11 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s border: 1px solid #888; } +input.tc-palette-manager-colour-input { + width: 100%; + padding: 0; +} + /* ** Table of contents */ From 14003b0e88fa8378af71f499700c648fe2a3f3d7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 26 Jun 2019 15:53:49 +0200 Subject: [PATCH 0175/2376] Make framed editor use tiddler-editor-background color (#3611) so we can customise it better if we don't like what we see --- core/modules/editor/engines/framed.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 658d2638d..6e7da24da 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -42,6 +42,7 @@ function FramedEngine(options) { this.iframeNode.style.border = "none"; this.iframeNode.style.padding = "0"; this.iframeNode.style.resize = "none"; + this.iframeNode.style["background-color"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText("$:/palette"),"tiddler-editor-background"); this.iframeDoc.body.style.margin = "0"; this.iframeDoc.body.style.padding = "0"; this.widget.domNodes.push(this.iframeNode); @@ -95,6 +96,7 @@ FramedEngine.prototype.copyStyles = function() { this.domNode.style.display = "block"; this.domNode.style.width = "100%"; this.domNode.style.margin = "0"; + this.domNode.style["background-color"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText("$:/palette"),"tiddler-editor-background"); // In Chrome setting -webkit-text-fill-color overrides the placeholder text colour this.domNode.style["-webkit-text-fill-color"] = "currentcolor"; }; From 274dffe75053b165b4498c42fc70f1fa9488cedf Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 26 Jun 2019 23:44:31 +0800 Subject: [PATCH 0176/2376] Update chinese translations for the revised PaletteManager (#4019) * Palette/Editor/Delete/Hint * Palette/Editor/Names/External/Show --- languages/zh-Hans/ControlPanel.multids | 2 ++ languages/zh-Hant/ControlPanel.multids | 2 ++ 2 files changed, 4 insertions(+) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 6a5bcb712..a43cf7f43 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -47,6 +47,8 @@ LoadedModules/Hint: 这些是当前已加载的模块之源码条目。斜体的 Palette/Caption: 调色板 Palette/Editor/Clone/Caption: 复制 Palette/Editor/Clone/Prompt: 建议您修改前先复制此默认调色板 +Palette/Editor/Delete/Hint: 从当前调色板中删除此项 +Palette/Editor/Names/External/Show: 显示不属于当前调色板的颜色名称 Palette/Editor/Prompt/Modified: 此默认调色板已被修改过 Palette/Editor/Prompt: 编辑 Palette/Editor/Reset/Caption: 重置 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 0d3d53a51..664ad121a 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -47,6 +47,8 @@ LoadedModules/Hint: 這些是當前已載入的模組之源碼條目。斜體的 Palette/Caption: 調色盤 Palette/Editor/Clone/Caption: 複製 Palette/Editor/Clone/Prompt: 建議您修改前先複製此預設調色盤 +Palette/Editor/Delete/Hint: 從當前調色盤中刪除此項 +Palette/Editor/Names/External/Show: 顯示不屬於當前調色盤的顏色名稱 Palette/Editor/Prompt/Modified: 此預設調色盤已被修改過 Palette/Editor/Prompt: 編輯 Palette/Editor/Reset/Caption: 重置 From ed67f4a88b29c5c81d4de31203dbf23d66955fb7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Jun 2019 17:27:36 +0100 Subject: [PATCH 0177/2376] Add new tm-focus-selector message --- core/modules/startup/rootwidget.js | 13 +++++++++++++ .../messages/WidgetMessage_ tm-focus-selector.tid | 12 ++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid diff --git a/core/modules/startup/rootwidget.js b/core/modules/startup/rootwidget.js index 84756d11b..bf96c6fbd 100644 --- a/core/modules/startup/rootwidget.js +++ b/core/modules/startup/rootwidget.js @@ -34,6 +34,19 @@ exports.startup = function() { $tw.rootWidget.addEventListener("tm-copy-to-clipboard",function(event) { $tw.utils.copyToClipboard(event.param); }); + // Install the tm-focus-selector message + $tw.rootWidget.addEventListener("tm-focus-selector",function(event) { + var selector = event.param || "", + element; + try { + element = document.querySelector(selector); + } catch(e) { + console.log("Error in selector: ",selector) + } + if(element && element.focus) { + element.focus(); + } + }); // Install the scroller $tw.pageScroller = new $tw.utils.PageScroller(); $tw.rootWidget.addEventListener("tm-scroll",function(event) { diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid new file mode 100644 index 000000000..dc41ad393 --- /dev/null +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid @@ -0,0 +1,12 @@ +caption: tm-focus-selector +created: 20190628162542132 +modified: 20190628162542132 +tags: Messages +title: WidgetMessage: tm-focus-selector +type: text/vnd.tiddlywiki + +The `tm-focus-selector` message sets the focus to the DOM element identified by the selector in the `param` parameter. + +|!Name |!Description | +|param |Selector identifying the DOM element to be focussed | + From bf51ae001993565fd43443d053ea83e209b67c6f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Jun 2019 17:28:24 +0100 Subject: [PATCH 0178/2376] Add keyboard shortcut for focusing sidebar search Fixes #4020 Fixes #4025 --- core/language/en-GB/Buttons.multids | 1 + core/ui/KeyboardShortcuts/focus-sidebar-search.tid | 5 +++++ core/wiki/config/ShortcutInfo.multids | 1 + core/wiki/config/shortcuts/shortcuts.multids | 1 + 4 files changed, 8 insertions(+) create mode 100644 core/ui/KeyboardShortcuts/focus-sidebar-search.tid diff --git a/core/language/en-GB/Buttons.multids b/core/language/en-GB/Buttons.multids index cddf68485..572c515d7 100644 --- a/core/language/en-GB/Buttons.multids +++ b/core/language/en-GB/Buttons.multids @@ -32,6 +32,7 @@ ExportTiddler/Caption: export tiddler ExportTiddler/Hint: Export tiddler ExportTiddlers/Caption: export tiddlers ExportTiddlers/Hint: Export tiddlers +FocusSidebarSearch/Hint: Focus the sidebar search field Fold/Caption: fold tiddler Fold/Hint: Fold the body of this tiddler Fold/FoldBar/Caption: fold-bar diff --git a/core/ui/KeyboardShortcuts/focus-sidebar-search.tid b/core/ui/KeyboardShortcuts/focus-sidebar-search.tid new file mode 100644 index 000000000..e7441e0b1 --- /dev/null +++ b/core/ui/KeyboardShortcuts/focus-sidebar-search.tid @@ -0,0 +1,5 @@ +title: $:/core/ui/KeyboardShortcuts/focus-sidebar-search +tags: $:/tags/KeyboardShortcut +key: ((focus-sidebar-search)) + +<$action-sendmessage $message="tm-focus-selector" $param=".tc-search input"/> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 8bf424a66..7d2c35062 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -3,6 +3,7 @@ title: $:/config/ShortcutInfo/ bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} excise: {{$:/language/Buttons/Excise/Hint}} +focus-sidebar-search: {{$:/language/Buttons/FocusSidebarSearch/Hint}} heading-1: {{$:/language/Buttons/Heading1/Hint}} heading-2: {{$:/language/Buttons/Heading2/Hint}} heading-3: {{$:/language/Buttons/Heading3/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 9c135b4d4..db1633b61 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -2,6 +2,7 @@ title: $:/config/shortcuts/ cancel-edit-tiddler: escape excise: ctrl-E +focus-sidebar-search: ctrl-shift-F heading-1: ctrl-1 heading-2: ctrl-2 heading-3: ctrl-3 From 7781cb1f8b23baa7cbc9d2e16fda90d2006fe00f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Jun 2019 17:35:17 +0100 Subject: [PATCH 0179/2376] Streamline wording for sidebar search shortcut --- core/language/en-GB/Buttons.multids | 2 +- .../{focus-sidebar-search.tid => sidebar-search.tid} | 4 ++-- core/wiki/config/ShortcutInfo.multids | 2 +- core/wiki/config/shortcuts/shortcuts.multids | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename core/ui/KeyboardShortcuts/{focus-sidebar-search.tid => sidebar-search.tid} (55%) diff --git a/core/language/en-GB/Buttons.multids b/core/language/en-GB/Buttons.multids index 572c515d7..2ac239047 100644 --- a/core/language/en-GB/Buttons.multids +++ b/core/language/en-GB/Buttons.multids @@ -32,7 +32,7 @@ ExportTiddler/Caption: export tiddler ExportTiddler/Hint: Export tiddler ExportTiddlers/Caption: export tiddlers ExportTiddlers/Hint: Export tiddlers -FocusSidebarSearch/Hint: Focus the sidebar search field +SidebarSearch/Hint: Select the sidebar search field Fold/Caption: fold tiddler Fold/Hint: Fold the body of this tiddler Fold/FoldBar/Caption: fold-bar diff --git a/core/ui/KeyboardShortcuts/focus-sidebar-search.tid b/core/ui/KeyboardShortcuts/sidebar-search.tid similarity index 55% rename from core/ui/KeyboardShortcuts/focus-sidebar-search.tid rename to core/ui/KeyboardShortcuts/sidebar-search.tid index e7441e0b1..7b9ec8cad 100644 --- a/core/ui/KeyboardShortcuts/focus-sidebar-search.tid +++ b/core/ui/KeyboardShortcuts/sidebar-search.tid @@ -1,5 +1,5 @@ -title: $:/core/ui/KeyboardShortcuts/focus-sidebar-search +title: $:/core/ui/KeyboardShortcuts/sidebar-search tags: $:/tags/KeyboardShortcut -key: ((focus-sidebar-search)) +key: ((sidebar-search)) <$action-sendmessage $message="tm-focus-selector" $param=".tc-search input"/> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 7d2c35062..1ffaca3be 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -3,7 +3,7 @@ title: $:/config/ShortcutInfo/ bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} excise: {{$:/language/Buttons/Excise/Hint}} -focus-sidebar-search: {{$:/language/Buttons/FocusSidebarSearch/Hint}} +sidebar-search: {{$:/language/Buttons/SidebarSearch/Hint}} heading-1: {{$:/language/Buttons/Heading1/Hint}} heading-2: {{$:/language/Buttons/Heading2/Hint}} heading-3: {{$:/language/Buttons/Heading3/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index db1633b61..d5a287327 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -2,7 +2,7 @@ title: $:/config/shortcuts/ cancel-edit-tiddler: escape excise: ctrl-E -focus-sidebar-search: ctrl-shift-F +sidebar-search: ctrl-shift-F heading-1: ctrl-1 heading-2: ctrl-2 heading-3: ctrl-3 From 112443c054572d171982e9c41fd678b6f09ca5b8 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 29 Jun 2019 09:15:46 +0200 Subject: [PATCH 0180/2376] Update/fix nord palette notification background (#4031) --- core/palettes/Nord.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index f2d0ddea5..4dc220bf1 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -52,7 +52,7 @@ modal-footer-background: #3b4252 modal-footer-border: #3b4252 modal-header-border: #3b4252 muted-foreground: #4C566A -notification-background: #D08770 +notification-background: <<colour primary>> notification-border: #EBCB8B page-background: #2e3440 pre-background: #2E3440 From 42bde75de2daecabcecb05fc51ae803b5db0170d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 29 Jun 2019 09:16:35 +0200 Subject: [PATCH 0181/2376] Update KeyboardShortcuts.tid (#4030) --- editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid b/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid index 432e38226..f8deba7f7 100644 --- a/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid +++ b/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid @@ -6,8 +6,8 @@ type: text/vnd.tiddlywiki Keyboard shortcuts can either be used with the <<.wlink KeyboardWidget>> Widget or with [[Keyboard Shortcut Tiddlers|Keyboard Shortcut Tiddler]] -<<.tip """The <$macrocall $name=".wlink" to="KeyboardWidget"/> Widget makes the shortcuts accessible within an `input` or `textarea` field - +<<.tip """The <$macrocall $name=".wlink" to="KeyboardWidget"/> Widget makes the shortcuts accessible within an `input` or `textarea` field. +<br> A shortcut defined through a [[Keyboard Shortcut Tiddler]] makes the shortcut accessible globally""">> !!!See [[How to create keyboard shortcuts]] with a detailed explanation for creating your own shortcuts From 2f723dd85a7bb80f327334ef451a056cae2eb388 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 29 Jun 2019 09:17:11 +0200 Subject: [PATCH 0182/2376] Add docs for escapecss operator (#4028) * Create escapecss_Operator.tid * Create escapecss Operator (Examples).tid --- .../tiddlers/filters/escapecss_Operator.tid | 14 ++++++++++++++ .../examples/escapecss Operator (Examples).tid | 5 +++++ 2 files changed, 19 insertions(+) create mode 100644 editions/tw5.com/tiddlers/filters/escapecss_Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid diff --git a/editions/tw5.com/tiddlers/filters/escapecss_Operator.tid b/editions/tw5.com/tiddlers/filters/escapecss_Operator.tid new file mode 100644 index 000000000..240f48ec3 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/escapecss_Operator.tid @@ -0,0 +1,14 @@ +caption: escapecss +op-input: a [[selection of titles|Title Selection]] +op-output: the input with CSS escaping applied through the CSS.escape() method +op-parameter: +op-parameter-name: +op-purpose: apply CSS escaping to a selection of titles through the CSS.escape() method / operation +tags: [[Filter Operators]] [[String Operators]] +title: escapecss Operator +type: text/vnd.tiddlywiki +from-version: 5.1.20 + +See Mozilla Developer Network for details of the [[CSS.escape()|https://developer.mozilla.org/docs/Web/API/CSS/escape]] operation. + +<<.operator-examples "escapecss">> diff --git a/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid new file mode 100644 index 000000000..394a49985 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid @@ -0,0 +1,5 @@ +tags: [[escapecss Operator]] [[Operator Examples]] +title: escapecss Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[all[tiddlers]tag[Examples]escapecss[]]">> From f6c9150d3297b6dd5e39a73a6d4ccdc22c76cf1e Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sat, 29 Jun 2019 15:21:06 +0800 Subject: [PATCH 0183/2376] Add chinese translations for hint of sidebar-search keyboard shortcut (#4027) --- languages/zh-Hans/Buttons.multids | 1 + languages/zh-Hant/Buttons.multids | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/Buttons.multids b/languages/zh-Hans/Buttons.multids index f6c074180..1bc13dd7d 100644 --- a/languages/zh-Hans/Buttons.multids +++ b/languages/zh-Hans/Buttons.multids @@ -32,6 +32,7 @@ ExportTiddler/Caption: 导出此条目 ExportTiddler/Hint: 导出此条目 ExportTiddlers/Caption: 导出条目 ExportTiddlers/Hint: 导出条目 +SidebarSearch/Hint: 选择侧边栏的查找字段 Fold/Caption: 收合条目 Fold/Hint: 收合此条目的内容 Unfold/Caption: 展开条目 diff --git a/languages/zh-Hant/Buttons.multids b/languages/zh-Hant/Buttons.multids index 9f7477650..27a669db5 100644 --- a/languages/zh-Hant/Buttons.multids +++ b/languages/zh-Hant/Buttons.multids @@ -32,6 +32,7 @@ ExportTiddler/Caption: 導出此條目 ExportTiddler/Hint: 導出此條目 ExportTiddlers/Caption: 導出條目 ExportTiddlers/Hint: 導出條目 +SidebarSearch/Hint: 選擇側邊欄的搜尋欄位 Fold/Caption: 收合條目 Fold/Hint: 收合此條目的內容 Fold/FoldBar/Caption: 收合條 From d2f1debf92d2e716080f50286c937e3531d4ce5b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 29 Jun 2019 09:40:46 +0200 Subject: [PATCH 0184/2376] Make escapecss tiddlers show in recent tab (#4032) * make escapecss show in recent tab * make escapecss examples show in recent tab --- editions/tw5.com/tiddlers/filters/escapecss_Operator.tid | 2 ++ .../tiddlers/filters/examples/escapecss Operator (Examples).tid | 2 ++ 2 files changed, 4 insertions(+) diff --git a/editions/tw5.com/tiddlers/filters/escapecss_Operator.tid b/editions/tw5.com/tiddlers/filters/escapecss_Operator.tid index 240f48ec3..060476a7c 100644 --- a/editions/tw5.com/tiddlers/filters/escapecss_Operator.tid +++ b/editions/tw5.com/tiddlers/filters/escapecss_Operator.tid @@ -1,4 +1,6 @@ caption: escapecss +created: 20190629072855199 +modified: 20190629072855199 op-input: a [[selection of titles|Title Selection]] op-output: the input with CSS escaping applied through the CSS.escape() method op-parameter: diff --git a/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid index 394a49985..d1b9e4d14 100644 --- a/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid @@ -1,5 +1,7 @@ tags: [[escapecss Operator]] [[Operator Examples]] title: escapecss Operator (Examples) type: text/vnd.tiddlywiki +created: 20190629072855199 +modified: 20190629072855199 <<.operator-example 1 "[all[tiddlers]tag[Examples]escapecss[]]">> From 91db09bd1e532224e00e8dcc558618ed4356ef5c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 2 Jul 2019 16:04:57 +0200 Subject: [PATCH 0185/2376] Katex dropdown: add description hint (#4048) * katex dropdown: add description hint * Update katex-dropdown.tid --- plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown.tid b/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown.tid index b605bcff9..10f4b4417 100644 --- a/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown.tid +++ b/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown.tid @@ -36,6 +36,7 @@ title: $:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown $message="tm-new-tiddler" tags="$:/tags/KaTeX/Snippet" text="""$$snippet$$""" + caption="description shown in dropdown" /> <$action-deletetiddler From 15b576618fab5c98ab09623aa4150869d7835f10 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 2 Jul 2019 16:33:43 +0200 Subject: [PATCH 0186/2376] Docs: Add information about hidden setting EditTabIndex (#4045) --- .../hiddensettings/Hidden Setting EditTabIndex.tid | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting EditTabIndex.tid diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting EditTabIndex.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting EditTabIndex.tid new file mode 100644 index 000000000..08e4adf04 --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting EditTabIndex.tid @@ -0,0 +1,8 @@ +title: Hidden Setting: Tab Index for Edit-Inputs +tags: [[Hidden Settings]] +created: 20190702074846206 +modified: 20190702074846206 + +The input fields of Tiddlers that are being edited can be assigned a ''tabindex'' value (preferably 1) so that the <kbd>Tab</kbd> key can be used to directly move the focus from one input to the next or backwards using <kbd>shift-Tab</kbd> + +$:/config/EditTabIndex From 02b141f97f0beb4dc702c62cb3968f5a050854fc Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 2 Jul 2019 15:35:11 +0100 Subject: [PATCH 0187/2376] Docs: typo in "Using the external JavaScript template" --- .../webserver/Using the external JavaScript template.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid b/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid index c6c2373cb..122a30629 100644 --- a/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid +++ b/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid @@ -12,7 +12,7 @@ tiddlywiki editions/tw5.com-server/ --listen host=0.0.0.0 "root-tiddler=$:/core/ !! Background -TiddlyWiki in the single file configuration ordinarily packs everything into a single file: your data, and the JavaScript, CSS and HTML comprising TiddlyWiki itself. This lack of dependencies is usually very convenient: it means that it is impossible for the parts of a TiddlyWiki to become separated, and enormously improves the changes of it still functioning in the future. +TiddlyWiki in the single file configuration ordinarily packs everything into a single file: your data, and the JavaScript, CSS and HTML comprising TiddlyWiki itself. This lack of dependencies is usually very convenient: it means that it is impossible for the parts of a TiddlyWiki to become separated, and enormously improves the chances of it still functioning in the future. However, there is some inefficiency in this arrangement because the core code is repeatedly loaded and saved every time the content of the wiki is saved. This inefficiency is partially ameliorated when working in the client server configuration because once the wiki is loaded by the browser the synchronisation process only transmits individual tiddlers back and forth to the server. From de04755a0a9f78bbe46b2146dae144e70b46e31d Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Tue, 2 Jul 2019 22:40:07 +0800 Subject: [PATCH 0188/2376] Fix bug with not definded variable (#4049) Using the variable "resolveCredentialsFilepath" to provide a good debug information. --- core/modules/server/authenticators/basic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/server/authenticators/basic.js b/core/modules/server/authenticators/basic.js index df14139ed..9db9b91ff 100644 --- a/core/modules/server/authenticators/basic.js +++ b/core/modules/server/authenticators/basic.js @@ -41,7 +41,7 @@ BasicAuthenticator.prototype.init = function() { this.credentialsData = credentialsData; } } else { - return "Error: Unable to load user credentials from '" + credentialsFilepath + "'"; + return "Error: Unable to load user credentials from '" + resolveCredentialsFilepath + "'"; } } // Add the hardcoded username and password if specified From d1948621d30b97b78baf0cb91db0ed4e05d53368 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 2 Jul 2019 17:24:48 +0200 Subject: [PATCH 0189/2376] Docs for stamp-button optionally wrap selection (#4047) * make stamp-button optionally wrap selection * Update Using Stamp.tid --- core/ui/EditorToolbar/stamp-dropdown.tid | 16 ++++++++++++++++ .../tw5.com/tiddlers/howtos/Using Stamp.tid | 18 +++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/core/ui/EditorToolbar/stamp-dropdown.tid b/core/ui/EditorToolbar/stamp-dropdown.tid index 01b3abd90..a22a3e800 100644 --- a/core/ui/EditorToolbar/stamp-dropdown.tid +++ b/core/ui/EditorToolbar/stamp-dropdown.tid @@ -3,12 +3,28 @@ title: $:/core/ui/EditorToolbar/stamp-dropdown \define toolbar-button-stamp-inner() <$button tag="a"> +<$list filter="[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]"> + <$action-sendmessage $message="tm-edit-text-operation" $param="replace-selection" text={{$(snippetTitle)$}} /> +</$list> + + +<$list filter="[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]"> + +<$action-sendmessage + $message="tm-edit-text-operation" + $param="wrap-selection" + prefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}} +suffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}} +/> + +</$list> + <$action-deletetiddler $tiddler=<<dropdown-state>> /> diff --git a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid index 5e7f34aa5..ec7677f8b 100644 --- a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid +++ b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid @@ -9,8 +9,20 @@ You can insert preconfigured snippets of text to use stamp from toolbar. Click ' ! Create a snippet # Click ''stamp'' ({{$:/core/images/stamp}}) -# Create a snippet tiddler to use "//Add your own//" menu -# Type some text of snippet for the tiddler, and caption for the name as shown in menu +# Create a snippet tiddler through the "//Add your own//" menu entry +# Type some text as snippet for the tiddler, add a caption for the name as shown in the menu # Click the {{$:/core/images/done-button}} ''ok'' button -''Tip:'' You can also create a snippet tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar, and add tag ''~$:/tags/TextEditor/Snippet'' +<<.tip """''Tip:'' You can also create a snippet tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar, and add tag ''~$:/tags/TextEditor/Snippet''""">> + + +!!<<.from-version "5.1.20">> Adding a prefix and/or suffix to a selection + +# Click ''stamp'' ({{$:/core/images/stamp}}) +# Create a snippet tiddler through the "//Add your own//" menu entry +# Add a caption for the name as shown in the menu +# Create a tiddler with the same title but add the suffix `/prefix` +# Insert the prefix in its text field +# Create a tiddler with the same title but add the suffix `/suffix` +# Insert the suffix in its text field +# Click the {{$:/core/images/done-button}} ''ok'' button From 16a53ae394b36d2abea659d5bcb3cde638c6a5a8 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 2 Jul 2019 17:25:34 +0200 Subject: [PATCH 0190/2376] Use Resources tag for escapecss examples (#4040) --- .../tiddlers/filters/examples/escapecss Operator (Examples).tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid index d1b9e4d14..dca586cd9 100644 --- a/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/escapecss Operator (Examples).tid @@ -4,4 +4,4 @@ type: text/vnd.tiddlywiki created: 20190629072855199 modified: 20190629072855199 -<<.operator-example 1 "[all[tiddlers]tag[Examples]escapecss[]]">> +<<.operator-example 1 "[all[tiddlers]tag[Resources]escapecss[]]">> From da6191779799ad0eaa9ccece8d7121738cd897f7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 2 Jul 2019 16:53:02 +0100 Subject: [PATCH 0191/2376] list-links macro: trim whitespace Fixes #4044 --- core/wiki/macros/list.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/core/wiki/macros/list.tid b/core/wiki/macros/list.tid index 0bcafcc1c..f6d4b8442 100644 --- a/core/wiki/macros/list.tid +++ b/core/wiki/macros/list.tid @@ -2,6 +2,7 @@ title: $:/core/macros/list tags: $:/tags/Macro \define list-links(filter,type:"ul",subtype:"li",class:"",emptyMessage) +\whitespace trim <$type$ class="$class$"> <$list filter="$filter$" emptyMessage=<<__emptyMessage__>>> <$subtype$> From f42351e23585a54296db4d3dad021e187f6680d4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 2 Jul 2019 16:53:23 +0100 Subject: [PATCH 0192/2376] Add new readme build script, and update the readme build --- bin/readme-bld.sh | 17 ++++++ bin/readme.md | 3 +- contributing.md | 3 +- readme.md | 132 ++++------------------------------------------ 4 files changed, 29 insertions(+), 126 deletions(-) create mode 100755 bin/readme-bld.sh diff --git a/bin/readme-bld.sh b/bin/readme-bld.sh new file mode 100755 index 000000000..198c3abd0 --- /dev/null +++ b/bin/readme-bld.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Build readmes from corresponding tiddlers + +# Default to the version of TiddlyWiki installed in this repo + +if [ -z "$TW5_BUILD_TIDDLYWIKI" ]; then + TW5_BUILD_TIDDLYWIKI=./tiddlywiki.js +fi + +# tw5.com readmes +node $TW5_BUILD_TIDDLYWIKI \ + editions/tw5.com \ + --verbose \ + --output . \ + --build readmes \ + || exit 1 diff --git a/bin/readme.md b/bin/readme.md index 22cb2965e..d2014ca6b 100644 --- a/bin/readme.md +++ b/bin/readme.md @@ -1,3 +1,4 @@ <h1 class="">Script Files</h1><p>The <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> repository contains several scripts in the <code>bin</code> folder that you can use to automate common tasks, or as a useful starting point for your own scripts. See <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/Scripts%2520for%2520building%2520tiddlywiki.com.html">Scripts for building tiddlywiki.com</a> for details of the scripts used to build and release <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a>.</p><p>All the scripts expect to be run from the root folder of the repository.</p><h2 class=""><code>serve</code>: serves tw5.com</h2><pre><code>./bin/serve.sh -h ./bin/serve.sh [edition dir] [username] [password] [host] [port]</code></pre><p>Or:</p><pre><code>./bin/serve.cmd -h -./bin/serve.cmd [edition dir] [username] [password] [host] [port]</code></pre><p>This script starts <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> running as an HTTP server, defaulting to the content from the <code>tw5.com-server</code> edition. By default, the Node.js serves on port 8080. If the optional <code>username</code> parameter is provided, it is used for signing edits. If the <code>password</code> is provided then HTTP basic authentication is used. Run the script with the <code>-h</code> parameter to see online help.</p><p>To experiment with this configuration, run the script and then visit <code>http://127.0.0.1:8080</code> in a browser.</p><p>Changes made in the browser propagate to the server over HTTP (use the browser developer console to see these requests). The server then syncs changes to the file system (and logs each change to the screen).</p><h2 class=""><code>test</code>: build and run tests</h2><p>This script runs the <code>test</code> edition of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on the server to perform the server-side tests and to build <code>test.html</code> for running the tests in the browser.</p><h2 class=""><code>lazy</code>: serves tw5.com with lazily loaded images</h2><pre><code>./bin/lazy.sh <username> [<password>]</code></pre><p>Or:</p><pre><code>./bin/lazy.cmd <username> [<password>]</code></pre><p>This script serves the <code>tw5.com-server</code> edition content with <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/LazyLoading.html">LazyLoading</a> applied to images.</p><h2 class=""><code>2bld</code>: builds <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> 2.6.5</h2><p>This script builds <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> 2.6.5 from the original source and then displays the differences between them (<code>diff</code> is used for *nix, <code>fc</code> for Windows).</p> \ No newline at end of file +./bin/serve.cmd [edition dir] [username] [password] [host] [port]</code></pre><p>This script starts <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> running as an HTTP server, defaulting to the content from the <code>tw5.com-server</code> edition. By default, the Node.js serves on port 8080. If the optional <code>username</code> parameter is provided, it is used for signing edits. If the <code>password</code> is provided then HTTP basic authentication is used. Run the script with the <code>-h</code> parameter to see online help.</p><p>To experiment with this configuration, run the script and then visit <code>http://127.0.0.1:8080</code> in a browser.</p><p>Changes made in the browser propagate to the server over HTTP (use the browser developer console to see these requests). The server then syncs changes to the file system (and logs each change to the screen).</p><h2 class=""><code>test</code>: build and run tests</h2><p>This script runs the <code>test</code> edition of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on the server to perform the server-side tests and to build <code>test.html</code> for running the tests in the browser.</p><h2 class=""><code>lazy</code>: serves tw5.com with lazily loaded images</h2><pre><code>./bin/lazy.sh <username> [<password>]</code></pre><p>Or:</p><pre><code>./bin/lazy.cmd <username> [<password>]</code></pre><p>This script serves the <code>tw5.com-server</code> edition content with <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/LazyLoading.html">LazyLoading</a> applied to images. +</p> \ No newline at end of file diff --git a/contributing.md b/contributing.md index 01112e1f1..cb328b582 100644 --- a/contributing.md +++ b/contributing.md @@ -1,4 +1,3 @@ -<h1 class="">Contributing to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a></h1><p>We welcome contributions to the code and documentation of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> in several ways:</p><ul><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ReportingBugs.html">ReportingBugs</a></li><li>Helping to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Improving%2520TiddlyWiki%2520Documentation.html">improve our documentation</a></li><li>Contributing to the code via <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">GitHub</a><ul><li>See <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev</a> for more details</li></ul></li></ul><p>There are other ways to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/HelpingTiddlyWiki.html">help TiddlyWiki</a> too.</p><h1 class="">Contributor License Agreement</h1><p>Like other <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/OpenSource.html">OpenSource</a> projects, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> needs a signed contributor license agreement from individual contributors. This is a legal agreement that allows contributors to assert that they own the copyright of their contribution, and that they agree to license it to the <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/UnaMesa.html">UnaMesa</a> Association (the legal entity that owns <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on behalf of the community).</p><ul><li>For individuals use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a></li><li>For entities use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a></li></ul><h1 class="">How to sign the CLA</h1><p>Create a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/GitHub.html">GitHub</a> pull request to add your name to <code>cla-individual.md</code> or <code>cla-entity.md</code>, with the date in the format (YYYY/MM/DD).</p><p><strong>step by step</strong></p><ol><li>Navigate to <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a> or <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a> according to whether you are signing as an individual or representative of an organisation</li><li>Click the "edit" button at the top-right corner (clicking this button will fork the project so you can edit the file)</li><li>Add your name at the bottom<ul><li>eg: <code>Jeremy Ruston, @Jermolene, 2011/11/22</code></li></ul></li><li>Below the edit box for the CLA text you should see a box labelled <strong>Propose file change</strong></li><li>Enter a brief title to explain the change (eg, "Signing the CLA")</li><li>Click the green button labelled <strong>Propose file change</strong></li><li>On the following screen, click the green button labelled <strong>Create pull request</strong></li></ol><hr><p><em>The CLA documents used for this project were created using <a class="tc-tiddlylink-external" href="http://www.harmonyagreements.org" rel="noopener noreferrer" target="_blank">Harmony Project Templates</a>. "HA-CLA-I-LIST Version 1.0" for "CLA-individual" and "HA-CLA-E-LIST Version 1.0" for "CLA-entity".</em></p><p>Remarks -----—</p><ul><li><ul><li>When not owning the copyright in the entire work of authorship**</li></ul></li></ul><p>In this case, please clearly state so, since otherwise we assume that you are the legal copyright holder of the contributed work! Please provide links and additional information that clarify under which license the rest of the code is distributed. +<h1 class="">Contributing to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a></h1><p>We welcome contributions to the code and documentation of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> in several ways:</p><ul><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ReportingBugs.html">ReportingBugs</a></li><li>Helping to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Improving%2520TiddlyWiki%2520Documentation.html">improve our documentation</a></li><li>Contributing to the code via <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">GitHub</a><ul><li>See <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev</a> for more details</li></ul></li></ul><p>There are other ways to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/HelpingTiddlyWiki.html">help TiddlyWiki</a> too.</p><h1 class="">Contributor License Agreement</h1><p>Like other <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/OpenSource.html">OpenSource</a> projects, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> needs a signed contributor license agreement from individual contributors. This is a legal agreement that allows contributors to assert that they own the copyright of their contribution, and that they agree to license it to the <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/UnaMesa.html">UnaMesa</a> Association (the legal entity that owns <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on behalf of the community).</p><ul><li>For individuals use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a></li><li>For entities use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a></li></ul><h1 class="">How to sign the CLA</h1><p>Create a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/GitHub.html">GitHub</a> pull request to add your name to <code>cla-individual.md</code> or <code>cla-entity.md</code>, with the date in the format (YYYY/MM/DD).</p><p><strong>step by step</strong></p><ol><li>Navigate to <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a> or <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a> according to whether you are signing as an individual or representative of an organisation</li><li>Ensure that the "branch" dropdown at the top left is set to <code>tiddlywiki-com</code></li><li>Click the "edit" button at the top-right corner (clicking this button will fork the project so you can edit the file)</li><li>Add your name at the bottom<ul><li>eg: <code>Jeremy Ruston, @Jermolene, 2011/11/22</code></li></ul></li><li>Below the edit box for the CLA text you should see a box labelled <strong>Propose file change</strong></li><li>Enter a brief title to explain the change (eg, "Signing the CLA")</li><li>Click the green button labelled <strong>Propose file change</strong></li><li>On the following screen, click the green button labelled <strong>Create pull request</strong></li></ol><hr><p><em>The CLA documents used for this project were created using <a class="tc-tiddlylink-external" href="http://www.harmonyagreements.org" rel="noopener noreferrer" target="_blank">Harmony Project Templates</a>. "HA-CLA-I-LIST Version 1.0" for "CLA-individual" and "HA-CLA-E-LIST Version 1.0" for "CLA-entity".</em></p><h2 class="">Remarks</h2><p><strong>If you do not own the copyright in the entire work of authorship</strong>:</p><p>In this case, please clearly state so and provide links and any additional information that clarify under which license the rest of the code is distributed. </p><p><em>This file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a></em> </p> \ No newline at end of file diff --git a/readme.md b/readme.md index d653c77d7..d26bd8fdb 100644 --- a/readme.md +++ b/readme.md @@ -1,134 +1,20 @@ <p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is a complete interactive wiki in <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/JavaScript.html">JavaScript</a>. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h1 class="">Join the Community</h1><p> <h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWiki</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li><strong>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</strong></li></ul><h2 class="">Developers</h2><ul><li>The <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiDev.html">TiddlyWikiDev</a> group for developers: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWikiDev</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/tiddlywikidocs</a> </p> -</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><p><code>npm install -g tiddlywiki</code></p><p>If it fails with an error you may need to re-run the command as an administrator:</p><p><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</p></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><p><code>tiddlywiki --version</code></p></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.18"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> +</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><p><code>npm install -g tiddlywiki</code></p><p>If it fails with an error you may need to re-run the command as an administrator:</p><p><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</p></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><p><code>tiddlywiki --version</code></p></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.20-prerelease"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> <g fill-rule="evenodd"> <path d="M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z"></path> </g> -</svg> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><p>npm install -g tiddlywiki@5.1.13</p></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p>The first argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> +</svg> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><p>npm install -g tiddlywiki@5.1.13</p></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> + <g fill-rule="evenodd"> + <path d="M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z"></path> + </g> +</svg> New in: 5.1.20</span> First, there can be zero or more plugin references identified by the prefix <code>+</code> for plugin names or <code>++</code> for a path to a plugin folder. These plugins are loaded in addition to any specified in the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a>.</p><p>The next argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p>For example:</p><pre><code>tiddlywiki --version +tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen +tiddlywiki ++./mygreatplugin mywiki --listen</code></pre><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> <g fill-rule="evenodd"> <path d="M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z"></path> </g> </svg> New in: 5.1.18</span> Commands such as the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ListenCommand.html">ListenCommand</a> that support large numbers of parameters can use <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/NamedCommandParameters.html">NamedCommandParameters</a> to make things less unwieldy. For example:</p><pre><code>tiddlywiki wikipath --listen username=jeremy port=8090</code></pre><p>See <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for a full listing of the available commands. -</p><h1 class="">Upgrading <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p>If you've installed <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html">TiddlyWiki on Node.js</a> on the usual way, when a new version is released you can upgrade it with this command:</p><pre><code>npm update -g tiddlywiki</code></pre><p>On Mac or Linux you'll need to add <strong>sudo</strong> like this:</p><pre><code>sudo npm update -g tiddlywiki</code></pre><h1 class="">Also see</h1><p><ul class=""> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html"> - -TiddlyWikiFolders - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFileSyntax.html"> - -MultiTiddlerFileSyntax - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFiles.html"> - -MultiTiddlerFiles - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html"> - -TiddlerFiles - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Generating%2520Static%2520Sites%2520with%2520TiddlyWiki.html"> - -Generating Static Sites with TiddlyWiki - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/How%2520to%2520build%2520a%2520TiddlyWiki5%2520from%2520individual%2520tiddlers.html"> - -How to build a TiddlyWiki5 from individual tiddlers - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520TiddlyWiki%2520for%2520GitHub%2520project%2520documentation.html"> - -Using TiddlyWiki for GitHub project documentation - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520a%2520custom%2520path%2520prefix%2520with%2520the%2520client-server%2520edition.html"> - -Using a custom path prefix with the client-server edition - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Building%2520TiddlyWikiClassic.html"> - -Building TiddlyWikiClassic - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Customising%2520Tiddler%2520File%2520Naming.html"> - -Customising Tiddler File Naming - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Environment%2520Variables%2520on%2520Node.js.html"> - -Environment Variables on Node.js - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Scripts%2520for%2520TiddlyWiki%2520on%2520Node.js.html"> - -Scripts for TiddlyWiki on Node.js - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html"> - -Serving TW5 from Android - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Working%2520with%2520the%2520TiddlyWiki5%2520repository.html"> - -Working with the TiddlyWiki5 repository - -</a> -</li> - -<li> -<a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Microsoft%2520Internet%2520Information%2520Server.html"> -Internet Information Services -</a> -</li> - -</ul></p><p><em>This readme file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></em> +</p><h1 class="">Upgrading <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p>If you've installed <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html">TiddlyWiki on Node.js</a> on the usual way, when a new version is released you can upgrade it with this command:</p><pre><code>npm update -g tiddlywiki</code></pre><p>On Mac or Linux you'll need to add <strong>sudo</strong> like this:</p><pre><code>sudo npm update -g tiddlywiki</code></pre><h1 class="">Also see</h1><p><ul class=""><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFileSyntax.html">MultiTiddlerFileSyntax</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFiles.html">MultiTiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Generating%2520Static%2520Sites%2520with%2520TiddlyWiki.html">Generating Static Sites with TiddlyWiki</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/How%2520to%2520build%2520a%2520TiddlyWiki5%2520from%2520individual%2520tiddlers.html">How to build a TiddlyWiki5 from individual tiddlers</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520TiddlyWiki%2520for%2520GitHub%2520project%2520documentation.html">Using TiddlyWiki for GitHub project documentation</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520a%2520custom%2520path%2520prefix%2520with%2520the%2520client-server%2520edition.html">Using a custom path prefix with the client-server edition</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Building%2520TiddlyWikiClassic.html">Building TiddlyWikiClassic</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Customising%2520Tiddler%2520File%2520Naming.html">Customising Tiddler File Naming</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Environment%2520Variables%2520on%2520Node.js.html">Environment Variables on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Scripts%2520for%2520TiddlyWiki%2520on%2520Node.js.html">Scripts for TiddlyWiki on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Serving TW5 from Android</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Working%2520with%2520the%2520TiddlyWiki5%2520repository.html">Working with the TiddlyWiki5 repository</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Microsoft%2520Internet%2520Information%2520Server.html">Internet Information Services</a></li></ul></p><p><em>This readme file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></em> </p> \ No newline at end of file From c202ef420101edb87c227b1e2f34b630dd7c7f55 Mon Sep 17 00:00:00 2001 From: jed <inmysocks@fastmail.com> Date: Wed, 3 Jul 2019 12:11:10 +0200 Subject: [PATCH 0193/2376] include wiki in options sent to generateTiddlerFilePath This adds options.wiki to the object sent to the generateTiddlerFilePath The function generateTiddlerFilePath can take a wiki in the options object, but generateTiddlerFileInfo doesn't pass the wiki to it. --- core/modules/utils/filesystem.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index fbba11f2b..0bf41fb47 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -225,7 +225,8 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { fileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{ extension: contentTypeInfo.extension, directory: options.directory, - pathFilters: options.pathFilters + pathFilters: options.pathFilters, + wiki: options.wiki }); return fileInfo; }; From 35a71ad57727c63e11bc7ab394b05901bf9b49d6 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 3 Jul 2019 15:07:06 +0200 Subject: [PATCH 0194/2376] Story PageTemplate: configurable View- and EditTemplates --- core/ui/PageTemplate/story.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/PageTemplate/story.tid b/core/ui/PageTemplate/story.tid index 796c60032..524aabed4 100644 --- a/core/ui/PageTemplate/story.tid +++ b/core/ui/PageTemplate/story.tid @@ -13,7 +13,7 @@ tags: $:/tags/PageTemplate </section> -<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" template="$:/core/ui/ViewTemplate" editTemplate="$:/core/ui/EditTemplate" storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/> +<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/> <section class="story-frontdrop"> From 8a0aef4dcb3ee3239ca0231dfaf55fce849746aa Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 3 Jul 2019 15:08:43 +0200 Subject: [PATCH 0195/2376] add $:/config/ui/ViewTemplate --- core/wiki/config/ui/ViewTemplate.tid | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core/wiki/config/ui/ViewTemplate.tid diff --git a/core/wiki/config/ui/ViewTemplate.tid b/core/wiki/config/ui/ViewTemplate.tid new file mode 100644 index 000000000..d82cfe887 --- /dev/null +++ b/core/wiki/config/ui/ViewTemplate.tid @@ -0,0 +1,2 @@ +title: $:/config/ui/ViewTemplate +text: $:/core/ui/ViewTemplate From c578566dea9c4fbbb4623503e64c9ec83e1f5c91 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 3 Jul 2019 15:09:32 +0200 Subject: [PATCH 0196/2376] add $:/config/ui/EditTemplate --- core/wiki/config/ui/EditTemplate.tid | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core/wiki/config/ui/EditTemplate.tid diff --git a/core/wiki/config/ui/EditTemplate.tid b/core/wiki/config/ui/EditTemplate.tid new file mode 100644 index 000000000..318a4f5b7 --- /dev/null +++ b/core/wiki/config/ui/EditTemplate.tid @@ -0,0 +1,2 @@ +title: $:/config/ui/EditTemplate +text: $:/core/ui/EditTemplate From 958b3e7b7c1661c8cfb27b19cdd2427faf220347 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Thu, 4 Jul 2019 00:39:32 +0800 Subject: [PATCH 0197/2376] Improve the base64 encode/decode utility functions (#4053) Make good use of "$:/core/modules/utils/base64-utf8/base64-utf8.module.js" * Add a new base64Encode() * Both of base64Encode and base64Decode work for Nodejs and Browsers --- core/modules/utils/utils.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 289f132f8..316797337 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -12,6 +12,8 @@ Various static utility functions. /*global $tw: false */ "use strict"; +var base64utf8 = require("$:/core/modules/utils/base64-utf8/base64-utf8.module.js"); + /* Display a message, in colour if we're on a terminal */ @@ -683,12 +685,14 @@ exports.hashString = function(str) { Decode a base64 string */ exports.base64Decode = function(string64) { - if($tw.browser) { - // TODO - throw "$tw.utils.base64Decode() doesn't work in the browser"; - } else { - return Buffer.from(string64,"base64").toString(); - } + return base64utf8.base64.decode.call(base64utf8,string64); +}; + +/* +Encode a string to base64 +*/ +exports.base64Encode = function(string64) { + return base64utf8.base64.encode.call(base64utf8,string64); }; /* From 6e5566b907ac0d5fa8dfd55b738eb3ea39efebf6 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 3 Jul 2019 18:41:23 +0200 Subject: [PATCH 0198/2376] Add whitespace trim to pagetemplate, story and sidebar (#4052) * add whitespace trim to pagetemplate * add whitespace trim to story pagetemplate * add whitespace trim to sidebar pagetemplate --- core/ui/PageTemplate.tid | 1 + core/ui/PageTemplate/sidebar.tid | 3 ++- core/ui/PageTemplate/story.tid | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/ui/PageTemplate.tid b/core/ui/PageTemplate.tid index 0dafc9666..ecf719f34 100644 --- a/core/ui/PageTemplate.tid +++ b/core/ui/PageTemplate.tid @@ -1,5 +1,6 @@ title: $:/core/ui/PageTemplate +\whitespace trim \define containerClasses() tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ \end diff --git a/core/ui/PageTemplate/sidebar.tid b/core/ui/PageTemplate/sidebar.tid index 290be8aaf..642289418 100644 --- a/core/ui/PageTemplate/sidebar.tid +++ b/core/ui/PageTemplate/sidebar.tid @@ -1,6 +1,7 @@ title: $:/core/ui/PageTemplate/sidebar tags: $:/tags/PageTemplate +\whitespace trim \define config-title() $:/config/SideBarSegments/Visibility/$(listItem)$ \end @@ -25,4 +26,4 @@ $:/config/SideBarSegments/Visibility/$(listItem)$ </div> -</$scrollable> \ No newline at end of file +</$scrollable> diff --git a/core/ui/PageTemplate/story.tid b/core/ui/PageTemplate/story.tid index 796c60032..329293add 100644 --- a/core/ui/PageTemplate/story.tid +++ b/core/ui/PageTemplate/story.tid @@ -1,6 +1,7 @@ title: $:/core/ui/PageTemplate/story tags: $:/tags/PageTemplate +\whitespace trim <section class="tc-story-river"> <section class="story-backdrop"> From 1e1b2e28b6d2099bc60d7055accc940b03382f22 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 4 Jul 2019 07:45:04 +0200 Subject: [PATCH 0199/2376] Create Hidden Setting ViewTemplate and EditTemplate.tid this PR adds information about the hidden settings for View- and EditTemplate --- .../Hidden Setting ViewTemplate and EditTemplate.tid | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting ViewTemplate and EditTemplate.tid diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting ViewTemplate and EditTemplate.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting ViewTemplate and EditTemplate.tid new file mode 100644 index 000000000..0b5bd4f2b --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting ViewTemplate and EditTemplate.tid @@ -0,0 +1,6 @@ +title: Hidden Setting: ViewTemplate and EditTemplate +tags: [[Hidden Settings]] +created: 20190704053532718 +modified: 20190704053532718 + +The configuration Tiddlers $:/config/ui/ViewTemplate and $:/config/ui/EditTemplate can be used to change the ''~ViewTemplate'' respectively the ''~EditTemplate'' used in the [[Story PageTemplate|$:/core/ui/PageTemplate/story]] From f978355ea4a048b3d141f2e3f6c43691b67e0c32 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 4 Jul 2019 07:50:47 +0200 Subject: [PATCH 0200/2376] make Using Stamp show up in Recent tab ... just a "modified" update --- editions/tw5.com/tiddlers/howtos/Using Stamp.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid index ec7677f8b..07de4d7a0 100644 --- a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid +++ b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid @@ -1,5 +1,5 @@ created: 20160618090057124 -modified: 20160618090130833 +modified: 20190704054958185 tags: [[Editor toolbar]] title: Using Stamp type: text/vnd.tiddlywiki From e91fb292533dc351688b3495c508cc872187c005 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 4 Jul 2019 08:56:17 +0200 Subject: [PATCH 0201/2376] add keyboard shortcut toggle-sidebar --- core/ui/KeyboardShortcuts/toggle-sidebar.tid | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 core/ui/KeyboardShortcuts/toggle-sidebar.tid diff --git a/core/ui/KeyboardShortcuts/toggle-sidebar.tid b/core/ui/KeyboardShortcuts/toggle-sidebar.tid new file mode 100644 index 000000000..e69051c65 --- /dev/null +++ b/core/ui/KeyboardShortcuts/toggle-sidebar.tid @@ -0,0 +1,9 @@ +title: $:/core/ui/KeyboardShortcut/toggle-sidebar +tags: $:/tags/KeyboardShortcut +key: ((toggle-sidebar)) + +<$list filter="[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]" emptyMessage=""" +<$action-setfield $tiddler="$:/state/sidebar" text="yes"/> +> +<$action-setfield $tiddler="$:/state/sidebar" text="no"/> +</$list> From ef7210adf4ecbec9838dcf898a5841f3ffa31567 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 4 Jul 2019 08:57:49 +0200 Subject: [PATCH 0202/2376] add alt-shift-S to toggle sidebar --- core/wiki/config/shortcuts/shortcuts.multids | 1 + 1 file changed, 1 insertion(+) diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index d5a287327..11a07d560 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -23,4 +23,5 @@ stamp: ctrl-S strikethrough: ctrl-T subscript: ctrl-shift-B superscript: ctrl-shift-P +toggle-sidebar: alt-shift-S transcludify: alt-shift-T From ea0e1357bfeed67eb0bb10f350b5d05632e3a8ac Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 4 Jul 2019 08:59:23 +0200 Subject: [PATCH 0203/2376] Update ShortcutInfo.multids --- core/wiki/config/ShortcutInfo.multids | 1 + 1 file changed, 1 insertion(+) diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 1ffaca3be..f08d71efd 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -27,4 +27,5 @@ stamp: {{$:/language/Buttons/Stamp/Hint}} strikethrough: {{$:/language/Buttons/Strikethrough/Hint}} subscript: {{$:/language/Buttons/Subscript/Hint}} superscript: {{$:/language/Buttons/Superscript/Hint}} +toggle-sidebar: {{$:/language/Buttons/ToggleSidebar/Hint}} underline: {{$:/language/Buttons/Underline/Hint}} From cf4c4532c3af75dac64be171e5cf3d16b70dd721 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 4 Jul 2019 09:00:34 +0200 Subject: [PATCH 0204/2376] Update Buttons.multids --- core/language/en-GB/Buttons.multids | 1 + 1 file changed, 1 insertion(+) diff --git a/core/language/en-GB/Buttons.multids b/core/language/en-GB/Buttons.multids index 2ac239047..83598f410 100644 --- a/core/language/en-GB/Buttons.multids +++ b/core/language/en-GB/Buttons.multids @@ -182,6 +182,7 @@ Subscript/Caption: subscript Subscript/Hint: Apply subscript formatting to selection Superscript/Caption: superscript Superscript/Hint: Apply superscript formatting to selection +ToggleSidebar/Hint: Toggle the sidebar visibility Transcludify/Caption: transclusion Transcludify/Hint: Wrap selection in curly brackets Underline/Caption: underline From 77fedf9582a2660feb82e2b6fb8df97e49933c10 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 4 Jul 2019 12:00:10 +0200 Subject: [PATCH 0205/2376] fix keyboard shortcut --- core/ui/KeyboardShortcuts/toggle-sidebar.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/KeyboardShortcuts/toggle-sidebar.tid b/core/ui/KeyboardShortcuts/toggle-sidebar.tid index e69051c65..09216f470 100644 --- a/core/ui/KeyboardShortcuts/toggle-sidebar.tid +++ b/core/ui/KeyboardShortcuts/toggle-sidebar.tid @@ -4,6 +4,6 @@ key: ((toggle-sidebar)) <$list filter="[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]" emptyMessage=""" <$action-setfield $tiddler="$:/state/sidebar" text="yes"/> -> +"""> <$action-setfield $tiddler="$:/state/sidebar" text="no"/> </$list> From 3edaa652ee23c29eead3643ce9dd95c8b526675b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 4 Jul 2019 15:58:27 +0100 Subject: [PATCH 0206/2376] Reveal widget: add option to avoid clamping popup position Fixes #4041 --- core/modules/widgets/reveal.js | 34 ++++++++++++------- .../tw5.com/tiddlers/widgets/RevealWidget.tid | 3 +- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index e89377186..ebbf490b2 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -56,32 +56,39 @@ RevealWidget.prototype.render = function(parent,nextSibling) { RevealWidget.prototype.positionPopup = function(domNode) { domNode.style.position = "absolute"; domNode.style.zIndex = "1000"; + var left,top; switch(this.position) { case "left": - domNode.style.left = Math.max(0, this.popup.left - domNode.offsetWidth) + "px"; - domNode.style.top = this.popup.top + "px"; + left = this.popup.left - domNode.offsetWidth; + top = this.popup.top; break; case "above": - domNode.style.left = this.popup.left + "px"; - domNode.style.top = Math.max(0, this.popup.top - domNode.offsetHeight) + "px"; + left = this.popup.left; + top = this.popup.top - domNode.offsetHeight; break; case "aboveright": - domNode.style.left = (this.popup.left + this.popup.width) + "px"; - domNode.style.top = Math.max(0, this.popup.top + this.popup.height - domNode.offsetHeight) + "px"; + left = this.popup.left + this.popup.width; + top = this.popup.top + this.popup.height - domNode.offsetHeight; break; case "right": - domNode.style.left = (this.popup.left + this.popup.width) + "px"; - domNode.style.top = this.popup.top + "px"; + left = this.popup.left + this.popup.width; + top = this.popup.top; break; case "belowleft": - domNode.style.left = Math.max(0, this.popup.left + this.popup.width - domNode.offsetWidth) + "px"; - domNode.style.top = (this.popup.top + this.popup.height) + "px"; + left = this.popup.left + this.popup.width - domNode.offsetWidth; + top = this.popup.top + this.popup.height; break; default: // Below - domNode.style.left = this.popup.left + "px"; - domNode.style.top = (this.popup.top + this.popup.height) + "px"; + left = this.popup.left; + top = this.popup.top + this.popup.height; break; } + if(!this.positionAllowNegative) { + left = Math.max(0,left); + top = Math.max(0,top); + } + domNode.style.left = left + "px"; + domNode.style.top = top + "px"; }; /* @@ -94,6 +101,7 @@ RevealWidget.prototype.execute = function() { this.type = this.getAttribute("type"); this.text = this.getAttribute("text"); this.position = this.getAttribute("position"); + this.positionAllowNegative = this.getAttribute("positionAllowNegative") === "yes"; this["class"] = this.getAttribute("class",""); this.style = this.getAttribute("style",""); this["default"] = this.getAttribute("default",""); @@ -191,7 +199,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ RevealWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes["default"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) { + if(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes["default"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) { this.refreshSelf(); return true; } else { diff --git a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid index 0dbe174dd..a44a84eb4 100644 --- a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid @@ -1,7 +1,7 @@ caption: reveal created: 20131024141900000 jeremy: tiddlywiki -modified: 20181007231748909 +modified: 20190704145627537 tags: Widgets title: RevealWidget type: text/vnd.tiddlywiki @@ -34,6 +34,7 @@ The content of the `<$reveal>` widget is displayed according to the rules given |class |An optional CSS class name to be assigned to the HTML element<br/>» Set to `tc-popup-keep` to make a popup "sticky", so it won't close when you click inside of it| |style |An optional CSS style attribute to be assigned to the HTML element | |position |The position used for the popup when the type is ''popup''. Can be ''left'', ''above'', ''aboveright'', ''right'', ''belowleft'' or ''below'' | +|positionAllowNegative |Set to "yes" to prevent computed popup positions from being clamped to be above zero | |default |Default value to use when the state tiddler is missing | |animate |Set to "yes" to animate opening and closure (defaults to "no") | |retain |Set to "yes" to force the content to be retained even when hidden (defaults to "no") | From 2a4c60b23dc1436af6206fad5a56742550eac1a3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 4 Jul 2019 15:59:34 +0100 Subject: [PATCH 0207/2376] Allow tm-open-window to specify a page title --- core/modules/startup/windows.js | 3 ++- .../tiddlers/messages/WidgetMessage_ tm-open-window.tid | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/modules/startup/windows.js b/core/modules/startup/windows.js index 8dd5692a9..16b8f0316 100644 --- a/core/modules/startup/windows.js +++ b/core/modules/startup/windows.js @@ -28,6 +28,7 @@ exports.startup = function() { var refreshHandler, title = event.param || event.tiddlerTitle, paramObject = event.paramObject || {}, + windowTitle = paramObject.windowTitle || title, template = paramObject.template || "$:/core/templates/single.tiddler.window", width = paramObject.width || "700", height = paramObject.height || "600", @@ -51,7 +52,7 @@ exports.startup = function() { // Initialise the document srcDocument.write("<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>"); srcDocument.close(); - srcDocument.title = title; + srcDocument.title = windowTitle; srcWindow.addEventListener("beforeunload",function(event) { delete windows[title]; $tw.wiki.removeEventListener("change",refreshHandler); diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-window.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-window.tid index dad280772..432aecebf 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-window.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-window.tid @@ -1,6 +1,6 @@ caption: tm-open-window created: 20160424181447704 -modified: 20160424182909036 +modified: 20190704145627537 tags: Messages title: WidgetMessage: tm-open-window type: text/vnd.tiddlywiki @@ -10,6 +10,7 @@ The `tm-open-window` message opens a tiddler in a new //browser// window. If no |!Name |!Description | |param |Title of the tiddler to be opened in a new browser window, defaults to <<.var "currentTiddler">> if empty | |template |Template in which the tiddler will be rendered in | +|windowTitle |Title string for the opened window | |width |Width of the new browser window | |height |Height of the new browser window | |paramObject |Hashmap of variables that will be provided to the window | From 6f3db0118e4afe6764c8fcc88629255861e498ba Mon Sep 17 00:00:00 2001 From: BramChen <bram.chen@gmail.com> Date: Fri, 5 Jul 2019 10:30:19 +0800 Subject: [PATCH 0208/2376] Update chinese translations * Add hint of toggle-sidebar keyboard shortcut --- languages/zh-Hans/Buttons.multids | 1 + languages/zh-Hant/Buttons.multids | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/Buttons.multids b/languages/zh-Hans/Buttons.multids index 1bc13dd7d..cdcdd1b93 100644 --- a/languages/zh-Hans/Buttons.multids +++ b/languages/zh-Hans/Buttons.multids @@ -182,6 +182,7 @@ Subscript/Caption: 下标 Subscript/Hint: 套用下标格式于所选文本 Superscript/Caption: 上标 Superscript/Hint: 套用上标格式于所选文本 +ToggleSidebar/Hint: 切换显示或隐藏侧边栏 Transcludify/Caption: 嵌入 Transcludify/Hint: 套用嵌入于所选文字 Underline/Caption: 下划线 diff --git a/languages/zh-Hant/Buttons.multids b/languages/zh-Hant/Buttons.multids index 27a669db5..73bb1c83d 100644 --- a/languages/zh-Hant/Buttons.multids +++ b/languages/zh-Hant/Buttons.multids @@ -182,6 +182,7 @@ Subscript/Caption: 下標 Subscript/Hint: 套用下標格式於所選文字 Superscript/Caption: 上標 Superscript/Hint: 套用上標格式於所選文字 +ToggleSidebar/Hint: 切換顯示或隱藏側邊欄 Transcludify/Caption: 嵌入 Transcludify/Hint: 套用嵌入於所選文字 Underline/Caption: 底線 From a06acc4eb8ade26cbb17b9f5911876bac1da7715 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Fri, 5 Jul 2019 11:03:05 +0800 Subject: [PATCH 0209/2376] Update core/modules/savers/github.js Using "$tw.utils.base64Encode()" to encode content of data instead of calling module library directly. --- core/modules/savers/github.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index ab644cbeb..892ba4847 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -12,8 +12,6 @@ Saves wiki by pushing a commit to the GitHub v3 REST API /*global $tw: false */ "use strict"; -var base64utf8 = require("$:/core/modules/utils/base64-utf8/base64-utf8.module.js"); - /* Select the appropriate saver module and set it up */ @@ -71,7 +69,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { } var data = { message: "Saved by TiddlyWiki", - content: base64utf8.base64.encode.call(base64utf8,text), + content: $tw.utils.base64Encode(text), branch: branch, sha: sha }; From 6721d70de5f6217638a5ae4814f74d931a3322c8 Mon Sep 17 00:00:00 2001 From: pmario <pmariojo@gmail.com> Date: Sun, 7 Jul 2019 01:08:25 +0200 Subject: [PATCH 0210/2376] german translations --- languages/de-DE/Buttons.multids | 2 ++ languages/de-DE/ControlPanel.multids | 9 +++++++++ languages/de-DE/Fields.multids | 2 ++ languages/de-DE/Filters.multids | 1 + languages/de-DE/Help/deletetiddlers.tid | 8 ++++++++ languages/de-DE/Help/listen.tid | 7 +++++-- languages/de-DE/Help/load.tid | 6 ++++-- languages/de-DE/Help/render.tid | 2 +- languages/de-DE/Help/savewikifolder.tig | 19 +++++++++++++++++++ languages/de-DE/Help/server.tid | 4 +++- languages/de-DE/Import.multids | 2 ++ 11 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 languages/de-DE/Help/deletetiddlers.tid create mode 100644 languages/de-DE/Help/savewikifolder.tig diff --git a/languages/de-DE/Buttons.multids b/languages/de-DE/Buttons.multids index ac9ae808e..15094f23a 100644 --- a/languages/de-DE/Buttons.multids +++ b/languages/de-DE/Buttons.multids @@ -32,6 +32,7 @@ ExportTiddler/Caption: Exportieren ExportTiddler/Hint: Diesen Tiddler exportieren ExportTiddlers/Caption: Mehrere exportieren ExportTiddlers/Hint: Mehrere Tiddler exportieren +SidebarSearch/Hint: Aktiviere das "sidebar" Suchfeld Fold/Caption: Ausblenden Textbereich Fold/Hint: Der Tiddler Textbereich wird ausgeblendet Fold/FoldBar/Caption: Textbereich ein/aus @@ -181,6 +182,7 @@ Subscript/Caption: Tiefsgestellt Subscript/Hint: Ausgewählten Text tiefgestellt darstellen Superscript/Caption: Hochgestellt Superscript/Hint: Ausgewählten Text hochgestellt darstellen +ToggleSidebar/Hint: Invertiere die "sidebar" Sichtbarkeit Transcludify/Caption: Transklusion Transcludify/Hint: Transklusion - Den selektierten Text in geschwungene Klammern setzen Underline/Caption: Unterstreichen diff --git a/languages/de-DE/ControlPanel.multids b/languages/de-DE/ControlPanel.multids index 6222bf9a6..2c26d2209 100644 --- a/languages/de-DE/ControlPanel.multids +++ b/languages/de-DE/ControlPanel.multids @@ -89,6 +89,15 @@ Saving/DownloadSaver/Hint: Diese Einstellungen gelten für den HTML5-compatiblen Saving/General/Caption: Allgemein Saving/General/Hint: Diese Einstellungen gelten für alle Speichermechanismen Saving/Hint: Einstellungen zu den TiddlyWiki Speichermechanismen +Saving/GitHub/Branch: Ziel "branch" zum Speichern (Standard: `master`) +Saving/GitHub/Caption: ~GitHub Saver +Saving/GitHub/Description: Diese Einstellungen werden nur zum Speichern auf GitHub verwendet +Saving/GitHub/ServerURL: Server URL (Standard: `https://api.github.com`) +Saving/GitHub/Filename: Dateiname für Zielpfad (zB: `index.html`) +Saving/GitHub/Password: Password, OAUTH token, oder persönlicher "Zugriffs-Token" +Saving/GitHub/Path: Pfad für Datei (zB: `/wiki/`) +Saving/GitHub/Repo: Ziel "Repository" (zB: `Jermolene/TiddlyWiki5`) +Saving/GitHub/UserName: Benuzername Saving/TiddlySpot/Advanced/Heading: Erweiterte Einstellungen Saving/TiddlySpot/BackupDir: Verzeichnis für das "Backup" Saving/TiddlySpot/Backups: "Backups" diff --git a/languages/de-DE/Fields.multids b/languages/de-DE/Fields.multids index 745d51cf4..7ba2e94ec 100755 --- a/languages/de-DE/Fields.multids +++ b/languages/de-DE/Fields.multids @@ -14,6 +14,7 @@ draft.of: Entwurf von - enthält den Titel des Tiddlers, zu dem dieser Entwurf-T draft.title: Entwurf Titel - enthält den neuen Titel, wenn der Entwurf-Tiddler gespeichert wird. footer: Der Fußnoten Text bei einem "~Wizard-Dialog" hack-to-give-us-something-to-compare-against: Ein temporäres Feld, verwendet in [[$:/core/templates/static.content]] +hide-body: Der Textbereich eines Tiddlers wird verborgen, wenn dieses Feld auf ''"yes"'' gesetzt wird icon: Der Titel eines ~Icon-Tiddlers, der mit diesem Tiddler verbunden ist. library: Wenn dieses Feld="yes" ist, dann soll der Tiddler als JavaScript Bibliothek gespeichert werden. list: Eine geordnete Tiddler Liste, die mit diesem Tiddler verbunden ist. @@ -31,5 +32,6 @@ subtitle: Der Untertitel für einen "~Wizard-Dialog". tags: Eine Liste von "Tags" für diesen Tiddler. text: Der Haupttext eines Tiddlers. title: Ein individueller einmaliger Name eines Tiddlers. +toc-link: Unterdrückt die Anzeige als Link, wenn der Wert auf ''"no"'' gesetzt wird type: Legt den Typ eines Tiddlers fest (aka MIME-type). version: Versions-Information eines "plugins". diff --git a/languages/de-DE/Filters.multids b/languages/de-DE/Filters.multids index 5af138156..9a7c915b0 100755 --- a/languages/de-DE/Filters.multids +++ b/languages/de-DE/Filters.multids @@ -10,6 +10,7 @@ Orphans: Waisen Tiddler SystemTiddlers: System-Tiddler ShadowTiddlers: Schatten-Tiddler OverriddenShadowTiddlers: Überschriebene Schatten-Tiddler +SessionTiddlers: Tiddler, die seit dem letzten Laden verändert wurden SystemTags: System-Tags StoryList: Tiddler im "story river", außer <$text text="$:/AdvancedSearch"/> TypedTiddlers: Nicht "wiki-text" Tiddler \ No newline at end of file diff --git a/languages/de-DE/Help/deletetiddlers.tid b/languages/de-DE/Help/deletetiddlers.tid new file mode 100644 index 000000000..a3c8c7e67 --- /dev/null +++ b/languages/de-DE/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: Löscht eine Gruppe von Tiddlern + +<<.from-version "5.1.20">> Löscht eine Gruppe von Tiddlern, die über einen Filter definiert werden. + +``` +--deletetiddlers <filter> +``` \ No newline at end of file diff --git a/languages/de-DE/Help/listen.tid b/languages/de-DE/Help/listen.tid index a8e16dc04..1426eaf8d 100644 --- a/languages/de-DE/Help/listen.tid +++ b/languages/de-DE/Help/listen.tid @@ -1,7 +1,7 @@ title: $:/language/Help/listen description: Definiert das HTTP-Server Interface für Tiddlywiki -Stellt das Wiki über einen HTTP-Server zur verfügung. +Stellt das Wiki über einen HTTP-Server zur Verfügung. Die "listen" Parameter werden wie folgt verwendet: @@ -29,4 +29,7 @@ Mögliche Parameter: * ''root-serve-type'' - Inhalts-Type, die für den Root-Tiddler verwendet wird. (Standard: "text/html") * ''tls-cert'' - Pfad zur "TLS certificate" Datei (relativ zum Wiki Verzeichnis) * ''tls-key'' - Pfad zur "TLS key" Datei (relativ zum Wiki Verzeichnis) -* ''debug-level'' - "debug" bewikt eine detailierte Anzeige der HTTP Anfrage-Parameter. (Standard: "none") \ No newline at end of file +* ''debug-level'' - "debug" bewikt eine detailierte Anzeige der HTTP Anfrage-Parameter. (Standard: "none") +* ''gzip'' - Wenn auf "yes" gesetzt, dann wird gzip Kompression aktiviert. (Standard: "no") + +Für weitere Sicherheitshinweise und Informationen für die Verwendung in lokalen Netzwerken siehe: WebServer auf TiddlyWiki.com diff --git a/languages/de-DE/Help/load.tid b/languages/de-DE/Help/load.tid index 69e26b842..079855a32 100644 --- a/languages/de-DE/Help/load.tid +++ b/languages/de-DE/Help/load.tid @@ -7,10 +7,12 @@ Die Umsetzung der geladenen Datei wird anhand der Datei-Erweiterung bestimmt. Ve ``` ---load <filepath> ---load <dirpath> +--load <filepath> [noerror] +--load <dirpath> [noerror] ``` +Der "load" Befehl erzeugt eine Fehlermeldung, wenn keine Tiddler gefunden werden. Diese Verhalten kann mit dem Parameter "noerror" unterdrückt werden. + Um Daten aus einer verschlüsselten TiddlyWiki Datei zu laden, muss zuerst mit dem "password" Parameter ein Passwort definiert werden. Beispiel: diff --git a/languages/de-DE/Help/render.tid b/languages/de-DE/Help/render.tid index 61d1a38c2..a35c59521 100644 --- a/languages/de-DE/Help/render.tid +++ b/languages/de-DE/Help/render.tid @@ -13,8 +13,8 @@ Es können noch zusätzliche Variablen per Name und Wert gesetzt werden. * ''tiddler-filter'': Ein Filter, der die Auszugebenden Tiddler eindeutig spezifiziert. * ''filename-filter'': [Option] Filter, der aus Tiddler Titeln, Pfadnamen extrahiert. Wenn weggelassen, dann wird der Standard verwendet: `[is[tiddler]addsuffix[.html]]`, welcher den Titel als Dateiname verwendet. -* ''template'': [Option] Template, das verwendet werden soll * ''render-type'': [Option] Ausgabe Type: `text/html` (Standard) generiert HTML Text und `text/plain` gibt den "reinen" Text Inhalt zurück. `text/plain` ignoriert HTML Marker und andere "nicht-druckbare" Zeichen. +* ''template'': [Option] Template, das verwendet werden soll * ''name'': [Option] Name einer zusätzlichen Variablen. * ''value'': [Option] Wert dieser zusätzlichen Variablen. diff --git a/languages/de-DE/Help/savewikifolder.tig b/languages/de-DE/Help/savewikifolder.tig new file mode 100644 index 000000000..be2cdb834 --- /dev/null +++ b/languages/de-DE/Help/savewikifolder.tig @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: Speichert ein Wiki in einen neues Verzeichnis + +<<.from-version "5.1.20">> Speichert das aktuelle Wiki als ein Wiki-Verzeichnis. Inklusive Tiddlern, Plugins und Konfiguration: + +``` +--savewikifolder <wikifolderpath> [<filter>] +``` + +* Das Zielverzeichnis muss leer sein, oder nicht existent +* Der "filter" Parameter definiert, welche Tiddler inkludiert werden. Diser Parameter is optional. Standard: `[all[tiddlers]]` +* Plugins des offiziellen Plugin-Verzeichnisses werden durch Referenzen zu den Plugins in der `tiddlywiki.info` Datei ersetzt. +* Drittanbieter Plugins werden in ihre eigenen Verzeichnisse entpackt + +Diese Funktion wird vor allem dazu verwendet, eine Wiki-Datei in einzelne Tiddler in einem Wiki-Verzeichnis umzuwandeln. + +``` +tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder +``` diff --git a/languages/de-DE/Help/server.tid b/languages/de-DE/Help/server.tid index 2b31842ca..94b40acc6 100644 --- a/languages/de-DE/Help/server.tid +++ b/languages/de-DE/Help/server.tid @@ -1,7 +1,7 @@ title: $:/language/Help/server description: Stellt einen HTTP server für TiddlyWiki zur Verfügung. (Dieser Befehl ist abgekündigt! - Neu ist: "listen") -TiddlyWiki bringt einen sehr einfachen Web-Server mit. Dieser ist zwar kompatibel mit dem TiddlyWeb Protokoll, ist jedoch nicht ausgereift genug, um im produktiven Einsatz im Netz eingesetzt zu werden. +TiddlyWiki bringt einen einfachen Web-Server mit. Der Server kann spezifische Tiddler im angegebenen Format anzeigen (rendern). Zudem können einzelne, oder mehrere Tiddler im JSON Format übertragen werden. Die unterstützten HTTP Funktionen sind: `GET`, `PUT` und `DELETE` @@ -35,6 +35,8 @@ Der Name und das Passwort können als "leere" Zeichenketten definiert werden, we --server 8080 $:/core/save/all text/plain text/html "" "" 192.168.0.245 ``` +Wenn Sie eine Addresse wie oben verwenden, dann ist der Server für das lokale Netzwerk sichtbar. Weitere Sicherheitshinweise finden sie unter: WebServer auf tiddlywiki.com + Es ist möglich mehrere TiddlyWiki Server gleichzeitig zu starten. Jeder Server muss jedoch mit einem eigenen Port gestartet werden. Es kann sinnvoll sein, den Prozess mit lokalen "Umgebungsvariable" zu starten. Hier wird "MEINE_PORT_NUMMER" als Beispiel verwendet. diff --git a/languages/de-DE/Import.multids b/languages/de-DE/Import.multids index 0434359cd..be3987cc7 100644 --- a/languages/de-DE/Import.multids +++ b/languages/de-DE/Import.multids @@ -18,4 +18,6 @@ Upgrader/Plugins/Suppressed/Version: Einige "plugins" weden unterdrückt! Import Upgrader/Plugins/Upgraded: Aktualisieren der plugins von: <<incoming>> nach: <<upgraded>> Upgrader/State/Suppressed: Unterdrückte temporäre Status Tiddler Upgrader/System/Suppressed: Unterdrückte "System Tiddler" +Upgrader/System/Warning: "Core Modul Tiddler" +Upgrader/System/Alert: Sie sind dabei einen Tiddler zu importieren, der einen "Core Tiddler" überschreibt. Diese Aktion wird nicht empfohlen! Das System kann instabil werden Upgrader/ThemeTweaks/Created: Migrieren der "theme tweaks" von: <$text text=<<from>>/> From efa593bb5071abcaab733aa8b6237b45149c4fff Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 7 Jul 2019 18:00:17 +0200 Subject: [PATCH 0211/2376] make katex toolbar (text buttons) button same color --- themes/tiddlywiki/vanilla/base.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 775bee9f5..247c76f65 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1115,6 +1115,7 @@ html body.tc-body.tc-single-tiddler-window { .tc-editor-toolbar button { vertical-align: middle; background-color: <<colour tiddler-controls-foreground>>; + color: <<colour tiddler-controls-foreground-selected>>; fill: <<colour tiddler-controls-foreground-selected>>; border-radius: 4px; padding: 3px; From f7da4bafae478387b8406f7b37f6a865d7ddd11d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 8 Jul 2019 11:14:32 +0200 Subject: [PATCH 0212/2376] big-green button: border-radius 2px make it a bit more beautiful --- themes/tiddlywiki/vanilla/base.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 247c76f65..4aee2a3b9 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -511,6 +511,7 @@ html body.tc-body .tc-btn-rounded:hover svg { color: <<colour download-foreground>>; fill: <<colour download-foreground>>; border: none; + border-radius: 2px; font-size: 1.2em; line-height: 1.4em; text-decoration: none; From 86286c6fce60eb88e8f701a9b19b2705bfee073e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 9 Jul 2019 12:22:52 +0100 Subject: [PATCH 0213/2376] Don't generate filenames starting with a period --- core/modules/utils/filesystem.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 0bf41fb47..999239450 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -266,6 +266,8 @@ exports.generateTiddlerFilepath = function(title,options) { // Remove any forward or backward slashes so we don't create directories filepath = filepath.replace(/\/|\\/g,"_"); } + // Don't let the filename start with a dot because such files are invisible on *nix + filepath = filepath.replace(/^\./g,"_"); // Remove any characters that can't be used in cross-platform filenames filepath = $tw.utils.transliterate(filepath.replace(/<|>|\:|\"|\||\?|\*|\^/g,"_")); // Truncate the filename if it is too long From 8aa6427d6728ddfb7365bd51a1c136dc7f54395b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 10 Jul 2019 09:54:35 +0200 Subject: [PATCH 0214/2376] Update factory.js --- core/modules/editor/factory.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index 0e44bd459..c2e56f150 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -248,6 +248,13 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { } }; + /* + Cancel Popups + */ + EditTextWidget.prototype.cancelPopups = function() { + $tw.popup.cancel(0,this.engine.domNode); + }; + /* Handle a dom "keydown" event, which we'll bubble up to our container for the keyboard widgets benefit */ From 7811614d532440f926c29bfbad5698cbec43c052 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 10 Jul 2019 09:55:32 +0200 Subject: [PATCH 0215/2376] Update popup.js --- core/modules/utils/dom/popup.js | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index 7411a6d8b..fd5ab9b79 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -148,17 +148,41 @@ Popup.prototype.show = function(options) { } }; +/* +Detect if a Popup contains an input field that has focus +Returns true or false +*/ +Popup.prototype.detectInputWithinPopup = function(node) { + var withinPopup = false; + for(var i=0; i<this.popups.length; i++) { + var popup = (this.popups[i] && this.popups[i].domNode) ? this.popups[i].domNode : null; + while(node && popup) { + if(node === popup || (node.classList && node.classList.contains("tc-popup-keep"))) { + withinPopup = true; + } + node = node.parentNode; + } + } + return withinPopup; +}; + /* Cancel all popups at or above a specified level or DOM node level: popup level to cancel (0 cancels all popups) */ -Popup.prototype.cancel = function(level) { +Popup.prototype.cancel = function(level,focusedInputNode) { var numPopups = this.popups.length; level = Math.max(0,Math.min(level,numPopups)); for(var t=level; t<numPopups; t++) { - var popup = this.popups.pop(); - if(popup.title) { - popup.wiki.deleteTiddler(popup.title); + var inputWithinPopup; + if(focusedInputNode) { + inputWithinPopup = this.detectInputWithinPopup(focusedInputNode); + } + if(!inputWithinPopup) { + var popup = this.popups.pop(); + if(popup.title) { + popup.wiki.deleteTiddler(popup.title); + } } } if(this.popups.length === 0) { From c647b4257440bf1cd24e597d30d3c787b7edc58d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 10 Jul 2019 09:56:34 +0200 Subject: [PATCH 0216/2376] Update simple.js --- core/modules/editor/engines/simple.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index bb77893d7..acd4bc3d2 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -122,6 +122,7 @@ SimpleEngine.prototype.handleInputEvent = function(event) { Handle a dom "focus" event */ SimpleEngine.prototype.handleFocusEvent = function(event) { + this.widget.cancelPopups(); if(this.widget.editFocusPopup) { $tw.popup.triggerPopup({ domNode: this.domNode, From 345a6a0f9001b69d62537f643983314bbeffbdc3 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 10 Jul 2019 09:57:11 +0200 Subject: [PATCH 0217/2376] Update framed.js --- core/modules/editor/engines/framed.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 6e7da24da..5eee8255b 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -79,6 +79,7 @@ function FramedEngine(options) { // Add event listeners $tw.utils.addEventListeners(this.domNode,[ {name: "click",handlerObject: this,handlerMethod: "handleClickEvent"}, + {name: "focus",handlerObject: this.widget,handlerMethod: "handleFocusEvent"}, {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"} ]); @@ -152,6 +153,13 @@ FramedEngine.prototype.focus = function() { this.domNode.select(); } }; + +/* +Handle the focus event +*/ +FramedEngine.prototype.handleFocusEvent = function() { + this.widget.cancelPopups(); +}; /* Handle a click From 217670cdf3151176141a4ef1bf966b2d3637628b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 10 Jul 2019 09:57:59 +0200 Subject: [PATCH 0218/2376] Update engine.js --- plugins/tiddlywiki/codemirror/engine.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/tiddlywiki/codemirror/engine.js b/plugins/tiddlywiki/codemirror/engine.js index 630482d7d..5fa4686cf 100755 --- a/plugins/tiddlywiki/codemirror/engine.js +++ b/plugins/tiddlywiki/codemirror/engine.js @@ -125,6 +125,9 @@ function CodeMirrorEngine(options) { event.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event return false; }); + this.cm.on("focus",function() { + self.widget.cancelPopups(); + }); this.cm.on("keydown",function(cm,event) { return self.widget.handleKeydownEvent.call(self.widget,event); }); From ecbbe87a0d22465ce46ec772e560bf4b0ebec08b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jul 2019 07:35:06 +0200 Subject: [PATCH 0219/2376] popup cancelling - use state reference in the google group there's a discussion: https://groups.google.com/forum/#!topic/tiddlywiki/_mDDZ1jpMgU buttons allow setting a state-reference for popups but the popup mechanism doesn't respect that --- core/modules/utils/dom/popup.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index 7411a6d8b..d44da6779 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -158,7 +158,11 @@ Popup.prototype.cancel = function(level) { for(var t=level; t<numPopups; t++) { var popup = this.popups.pop(); if(popup.title) { - popup.wiki.deleteTiddler(popup.title); + if(popup.noStateReference) { + popup.wiki.deleteTiddler(popup.title); + } else { + popup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title); + } } } if(this.popups.length === 0) { From f5b25994322e58de84cae70ab67a68b1413db27f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 11 Jul 2019 22:00:28 +0100 Subject: [PATCH 0220/2376] Make it possible to distinguish the two different sidebar elements with the class "tc-sidebar-lists" --- core/ui/SideBarSegments/search.tid | 2 +- core/ui/SideBarSegments/tabs.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index aa752b2c8..529ce74aa 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -1,7 +1,7 @@ title: $:/core/ui/SideBarSegments/search tags: $:/tags/SideBarSegment -<div class="tc-sidebar-lists"> +<div class="tc-sidebar-lists tc-sidebar-search"> <$set name="searchTiddler" value="$:/temp/search"> <div class="tc-search"> diff --git a/core/ui/SideBarSegments/tabs.tid b/core/ui/SideBarSegments/tabs.tid index f93485c74..8247ecf83 100644 --- a/core/ui/SideBarSegments/tabs.tid +++ b/core/ui/SideBarSegments/tabs.tid @@ -1,7 +1,7 @@ title: $:/core/ui/SideBarSegments/tabs tags: $:/tags/SideBarSegment -<div class="tc-sidebar-lists"> +<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" /> From a87a299aa9b092350a247f599cc37a951742b9b3 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 14 Jul 2019 07:22:46 +0200 Subject: [PATCH 0221/2376] add advanced-search kb shortcut --- core/ui/KeyboardShortcuts/advanced-search.tid | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 core/ui/KeyboardShortcuts/advanced-search.tid diff --git a/core/ui/KeyboardShortcuts/advanced-search.tid b/core/ui/KeyboardShortcuts/advanced-search.tid new file mode 100644 index 000000000..796814ea7 --- /dev/null +++ b/core/ui/KeyboardShortcuts/advanced-search.tid @@ -0,0 +1,7 @@ +title: $:/core/ui/KeyboardShortcuts/advanced-search +key: ((advanced-search)) + +<$navigator story="$:/StoryList" history="$:/HistoryList"> +<$action-navigate $to="$:/AdvancedSearch"/> +<$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/AdvancedSearch"] .tc-search input"""/> +</$navigator> From 173e9c6c3ac37c16c9be81dcd2659fcd0620cdef Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 14 Jul 2019 07:23:47 +0200 Subject: [PATCH 0222/2376] add advanced search key combination ctrl-shift-A --- core/wiki/config/shortcuts/shortcuts.multids | 1 + 1 file changed, 1 insertion(+) diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 11a07d560..1d192df9a 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -1,5 +1,6 @@ title: $:/config/shortcuts/ +advanced-search: ctrl-shift-A cancel-edit-tiddler: escape excise: ctrl-E sidebar-search: ctrl-shift-F From 880a2aa1535798b13660cc013222dda194cb75b7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 14 Jul 2019 07:25:02 +0200 Subject: [PATCH 0223/2376] Update ShortcutInfo.multids --- core/wiki/config/ShortcutInfo.multids | 1 + 1 file changed, 1 insertion(+) diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index f08d71efd..5ed690b6c 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -1,5 +1,6 @@ title: $:/config/ShortcutInfo/ +advanced-search: {{$:/language/Buttons/AdvancedSearch/Hint}} bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} excise: {{$:/language/Buttons/Excise/Hint}} From fd88be4173dbac9ae0ba78fec69ebe9fab7c63db Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 14 Jul 2019 07:25:50 +0200 Subject: [PATCH 0224/2376] Update ShortcutInfo.multids --- core/wiki/config/ShortcutInfo.multids | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 5ed690b6c..2c67ec29e 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -4,7 +4,6 @@ advanced-search: {{$:/language/Buttons/AdvancedSearch/Hint}} bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} excise: {{$:/language/Buttons/Excise/Hint}} -sidebar-search: {{$:/language/Buttons/SidebarSearch/Hint}} heading-1: {{$:/language/Buttons/Heading1/Hint}} heading-2: {{$:/language/Buttons/Heading2/Hint}} heading-3: {{$:/language/Buttons/Heading3/Hint}} @@ -24,6 +23,7 @@ picture: {{$:/language/Buttons/Picture/Hint}} preview: {{$:/language/Buttons/Preview/Hint}} quote: {{$:/language/Buttons/Quote/Hint}} save-tiddler: {{$:/language/Buttons/Save/Hint}} +sidebar-search: {{$:/language/Buttons/SidebarSearch/Hint}} stamp: {{$:/language/Buttons/Stamp/Hint}} strikethrough: {{$:/language/Buttons/Strikethrough/Hint}} subscript: {{$:/language/Buttons/Subscript/Hint}} From 66dc7df745b55ff3fe5ce9682de5782669632ddf Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 14 Jul 2019 09:37:53 +0200 Subject: [PATCH 0225/2376] Update popup.js --- core/modules/utils/dom/popup.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index 9d41c4658..ce148af95 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -180,12 +180,12 @@ Popup.prototype.cancel = function(level,focusedInputNode) { } if(!inputWithinPopup) { var popup = this.popups.pop(); - if(popup.title) { - if(popup.noStateReference) { - popup.wiki.deleteTiddler(popup.title); - } else { - popup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title); - } + if(popup.title) { + if(popup.noStateReference) { + popup.wiki.deleteTiddler(popup.title); + } else { + popup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title); + } } } } From 8e7c0907f8cce4708a02486fc93dcea1ab115196 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 14 Jul 2019 13:42:43 +0100 Subject: [PATCH 0226/2376] Add checkactions attribute to Checkbox widget See discussion at https://groups.google.com/d/msgid/tiddlywiki/526754d5-8786-49cd-aaa1-c77311670116%40googlegroups.com: The history here is that in v5.1.14 we added an "actions" attribute to the checkbox widget that specified an action string to be specified whenever the state of the checkbox changed. The same action string is executed regardless of whether the checkbox was checked or unchecked. Then in v5.1.16 we merged https://github.com/Jermolene/TiddlyWiki5/pull/3182 which added the "uncheckactions" attribute. The difference between the two is that the uncheckactions are only executed if the checkbox is unchecked. The main "actions" attribute is executed before any actions in "uncheckactions", which makes it possible to arrange things so that the "actions" attribute sets things to the checked state while the "uncheckactions" attribute overwrites those changes to set things to the unchecked state. In retrospect, it would have made more sense to have also added a "checkactions" attribute that was executed only if the checkbox was checked. I'll investigate adding it for v5.1.20. --- core/modules/widgets/checkbox.js | 4 ++++ editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/checkbox.js b/core/modules/widgets/checkbox.js index 9fa1c4889..1edf0bee0 100644 --- a/core/modules/widgets/checkbox.js +++ b/core/modules/widgets/checkbox.js @@ -156,6 +156,9 @@ CheckboxWidget.prototype.handleChangeEvent = function(event) { if(this.checkboxActions) { this.invokeActionString(this.checkboxActions,this,event); } + if(this.checkboxCheckActions && checked) { + this.invokeActionString(this.checkboxCheckActions,this,event); + } if(this.checkboxUncheckActions && !checked) { this.invokeActionString(this.checkboxUncheckActions,this,event); } @@ -167,6 +170,7 @@ Compute the internal state of the widget CheckboxWidget.prototype.execute = function() { // Get the parameters from the attributes this.checkboxActions = this.getAttribute("actions"); + this.checkboxCheckActions = this.getAttribute("checkactions"); this.checkboxUncheckActions = this.getAttribute("uncheckactions"); this.checkboxTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler")); this.checkboxTag = this.getAttribute("tag"); diff --git a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid index 60f1b389b..87ef7b936 100644 --- a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid @@ -1,6 +1,6 @@ caption: checkbox created: 20131024141900000 -modified: 20161221202816730 +modified: 20190714134002652 tags: Widgets title: CheckboxWidget type: text/vnd.tiddlywiki @@ -26,8 +26,9 @@ The content of the `<$checkbox>` widget is displayed within an HTML `<label>` el |unchecked |The value of the field corresponding to the checkbox being unchecked | |default |The default value to use if the field is not defined | |class |The class that will be assigned to the label element | -|actions |<<.from-version "5.1.14">> A string containing ActionWidgets to be triggered when the checkbox is checked | +|actions |<<.from-version "5.1.14">> A string containing ActionWidgets to be triggered when the status of the checkbox changes (whether it is checked or unchecked) | |uncheckactions |<<.from-version "5.1.16">> A string containing ActionWidgets to be triggered when the checkbox is unchecked | +|checkactions |<<.from-version "5.1.20">> A string containing ActionWidgets to be triggered when the checkbox is checked | !! Tag Mode From 78cc80db1361a6d3a2556f2298390644823000e8 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 14 Jul 2019 17:06:09 +0200 Subject: [PATCH 0227/2376] fix missing tag for advanced-search keyboard shortcut --- core/ui/KeyboardShortcuts/advanced-search.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/core/ui/KeyboardShortcuts/advanced-search.tid b/core/ui/KeyboardShortcuts/advanced-search.tid index 796814ea7..997538ecb 100644 --- a/core/ui/KeyboardShortcuts/advanced-search.tid +++ b/core/ui/KeyboardShortcuts/advanced-search.tid @@ -1,4 +1,5 @@ title: $:/core/ui/KeyboardShortcuts/advanced-search +tags: $:/tags/KeyboardShortcut key: ((advanced-search)) <$navigator story="$:/StoryList" history="$:/HistoryList"> From b67e088e551bcfb765d12599a2b46d402e7e9a66 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Sun, 14 Jul 2019 11:20:27 -0400 Subject: [PATCH 0228/2376] Reducing function calls across board (#4102) --- core/modules/widgets/widget.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 1c4407167..7fd868ba1 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -385,9 +385,10 @@ Widget.prototype.previousSibling = function() { Render the children of this widget into the DOM */ Widget.prototype.renderChildren = function(parent,nextSibling) { - $tw.utils.each(this.children,function(childWidget) { - childWidget.render(parent,nextSibling); - }); + var children = this.children; + for(var i = 0; i < children.length; i++) { + children[i].render(parent,nextSibling); + }; }; /* @@ -455,11 +456,11 @@ Widget.prototype.refreshSelf = function() { Refresh all the children of a widget */ Widget.prototype.refreshChildren = function(changedTiddlers) { - var self = this, + var children = this.children, refreshed = false; - $tw.utils.each(this.children,function(childWidget) { - refreshed = childWidget.refresh(changedTiddlers) || refreshed; - }); + for (var i = 0; i < children.length; i++) { + refreshed = children[i].refresh(changedTiddlers) || refreshed; + } return refreshed; }; From e2bad34e8977946ab0374e1f54a268f1fc16b6a1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 15 Jul 2019 11:11:36 +0200 Subject: [PATCH 0229/2376] Fix bug and typo in framed.js (#4110) --- core/modules/editor/engines/framed.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 5eee8255b..c807ffde9 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -79,7 +79,7 @@ function FramedEngine(options) { // Add event listeners $tw.utils.addEventListeners(this.domNode,[ {name: "click",handlerObject: this,handlerMethod: "handleClickEvent"}, - {name: "focus",handlerObject: this.widget,handlerMethod: "handleFocusEvent"}, + {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"}, {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"} ]); @@ -157,8 +157,9 @@ FramedEngine.prototype.focus = function() { /* Handle the focus event */ -FramedEngine.prototype.handleFocusEvent = function() { +FramedEngine.prototype.handleFocusEvent = function(event) { this.widget.cancelPopups(); + return true; }; /* From 5d36b484c6150cf1c78b214d353dd82507cd7eea Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Mon, 15 Jul 2019 13:31:50 +0200 Subject: [PATCH 0230/2376] Toc cosmetic changes for tabbed-xxxx macros (#4101) * toc cosmetic changes. * toc in right sidebar should use toc-item if itemCalssFilter is not defined --- core/wiki/macros/toc.tid | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index 8d82cb359..7d1ea80ea 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -14,7 +14,7 @@ tags: $:/tags/Macro <$list filter="""[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]"""> <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}> <$set name="excluded" filter="""[enlist<__exclude__>] [<__tag__>]"""> - <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item"> <li class=<<toc-item-class>>> <$list filter="[all[current]toc-link[no]]" emptyMessage="<$link><$view field='caption'><$view field='title'/></$view></$link>"> <<toc-caption>> @@ -35,7 +35,7 @@ tags: $:/tags/Macro \define toc-linked-expandable-body(tag,sort:"",itemClassFilter,exclude,path) <!-- helper function --> <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}> - <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item"> <li class=<<toc-item-class>>> <$link> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> @@ -58,10 +58,10 @@ tags: $:/tags/Macro </$qualify> \end -\define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) +\define toc-unlinked-expandable-body(tag,sort:"",itemClassFilter,exclude,path) <!-- helper function --> <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}> - <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item"> <li class=<<toc-item-class>>> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> <$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep"> @@ -101,9 +101,9 @@ tags: $:/tags/Macro </$vars> \end -\define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) +\define toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter,exclude,path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}> - <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected" > + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item" > <li class=<<toc-item-class>>> <$link> <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> @@ -128,9 +128,9 @@ tags: $:/tags/Macro </$qualify> \end -\define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter:" ",exclude,path) +\define toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter,exclude,path) <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}> - <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item" value="toc-item-selected"> + <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item"> <li class=<<toc-item-class>>> <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>"> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> @@ -177,7 +177,7 @@ tags: $:/tags/Macro <div class="tc-tabbed-table-of-contents"> <$linkcatcher to=<<__selectedTiddler__>>> <div class="tc-table-of-contents"> - <$macrocall $name="toc-selective-expandable" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="[all[current]field:title<__selectedTiddler__>]"/> + <$macrocall $name="toc-selective-expandable" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter="[all[current]] -[<__selectedTiddler__>get[text]]"/> </div> </$linkcatcher> <div class="tc-tabbed-table-of-contents-content"> From 8a53cca00dfaec478c65b206f6bc7c2d3932657f Mon Sep 17 00:00:00 2001 From: morosanuae <morosanuae@yahoo.com> Date: Mon, 15 Jul 2019 20:09:40 +0300 Subject: [PATCH 0231/2376] Adding the "Font Awesome 5 Free SVGs for TiddlyWiki" resource site (#4112) --- ...nt Awesome 5 Free SVGs for TiddlyWiki by morosanuae | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae diff --git a/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae b/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae new file mode 100644 index 000000000..681a45f0b --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae @@ -0,0 +1,10 @@ +created: 20190710085450262 +modified: 20190710090131976 +tags: SVG Images [[Font Awesome 5]] Resources +title: "Font Awesome 5 Free SVGs for TiddlyWiki" by morosanuae +type: text/vnd.tiddlywiki +url: http://fa5-free-svg.tiddlyspot.com + +The ''Font Awesome 5 Free'' SVG images collection converted to tiddlers that you can easily import (drag'n'drop) in your wiki. + +{{!!url}} From 27b75f39225f72f77129d1fd519794c26834dff5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 16 Jul 2019 15:43:18 +0100 Subject: [PATCH 0232/2376] Fix missing .tid extension from #4112 --- ... => Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename editions/tw5.com/tiddlers/community/resources/{Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae => Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid} (100%) diff --git a/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae b/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid similarity index 100% rename from editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae rename to editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid From cbd07465f329671f78e0ca3de56fce3f85a9c576 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 16 Jul 2019 16:53:37 +0100 Subject: [PATCH 0233/2376] Fix test rig shadow tiddler behaviour The test rig previously used a simplified implementation of shadow tiddlers which broke with the new indexing engine. There was also a problem that made that even if indexers were disabled they were still initialised. This PR fixes both problems, in preparation for fixing #4082 --- boot/boot.js | 7 +- core/modules/indexers/field-indexer.js | 3 + core/modules/indexers/tag-indexer.js | 5 +- editions/test/tiddlers/tests/test-filters.js | 142 ++++++++++--------- 4 files changed, 88 insertions(+), 69 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 19f1417c1..aac0132e6 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1013,7 +1013,7 @@ $tw.modules.define("$:/boot/tiddlerfields/list","tiddlerfield",{ /* Wiki constructor. State is stored in private members that only a small number of privileged accessor methods have direct access. Methods added via the prototype have to use these accessors and cannot access the state data directly. options include: -shadowTiddlers: Array of shadow tiddlers to be added +enableIndexers - Array of indexer names to enable, or null to use all available indexers */ $tw.Wiki = function(options) { options = options || {}; @@ -1028,7 +1028,7 @@ $tw.Wiki = function(options) { }, pluginTiddlers = [], // Array of tiddlers containing registered plugins, ordered by priority pluginInfo = Object.create(null), // Hashmap of parsed plugin content - shadowTiddlers = options.shadowTiddlers || Object.create(null), // Hashmap by title of {source:, tiddler:} + shadowTiddlers = Object.create(null), // Hashmap by title of {source:, tiddler:} shadowTiddlerTitles = null, getShadowTiddlerTitles = function() { if(!shadowTiddlerTitles) { @@ -1036,7 +1036,7 @@ $tw.Wiki = function(options) { } return shadowTiddlerTitles; }, - enableIndexers = options.enableIndexers || null, // Array of indexer names to enable, or null to use all available indexers + enableIndexers = options.enableIndexers || null, indexers = [], indexersByName = Object.create(null); @@ -1047,6 +1047,7 @@ $tw.Wiki = function(options) { } indexers.push(indexer); indexersByName[name] = indexer; + indexer.init(); }; this.getIndexer = function(name) { diff --git a/core/modules/indexers/field-indexer.js b/core/modules/indexers/field-indexer.js index 96b869f90..07a6e8d55 100644 --- a/core/modules/indexers/field-indexer.js +++ b/core/modules/indexers/field-indexer.js @@ -16,6 +16,9 @@ var DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128; function FieldIndexer(wiki) { this.wiki = wiki; +} + +FieldIndexer.prototype.init = function() { this.index = null; this.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH; this.addIndexMethods(); diff --git a/core/modules/indexers/tag-indexer.js b/core/modules/indexers/tag-indexer.js index 7b8e87267..054df7d91 100644 --- a/core/modules/indexers/tag-indexer.js +++ b/core/modules/indexers/tag-indexer.js @@ -14,7 +14,10 @@ Indexes the tiddlers with each tag function TagIndexer(wiki) { this.wiki = wiki; - this.index = null; +} + +TagIndexer.prototype.init = function() { + this.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} this.addIndexMethods(); } diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 76e604e31..b41db3a59 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -35,48 +35,55 @@ describe("Filter tests", function() { describe("With no indexers", function() { var wiki = setupWiki({enableIndexers: []}); + it("should not create indexes when requested not to",function() { + expect(wiki.getIndexer("FieldIndexer")).toBe(null); + }); runTests(wiki); }); describe("With all indexers", function() { var wiki = setupWiki(); - wiki.getIndexer("FieldIndexer").setMaxIndexedValueLength(8); // Note that JoeBloggs is 9, and JohnDoe is 7 + if(wiki.getIndexer("FieldIndexer")) { + wiki.getIndexer("FieldIndexer").setMaxIndexedValueLength(8); // Note that JoeBloggs is 9, and JohnDoe is 7 + } runTests(wiki); }); function setupWiki(wikiOptions) { // Create a wiki - var wiki = new $tw.Wiki($tw.utils.extend({ - shadowTiddlers: { + var wiki = new $tw.Wiki(wikiOptions); + // Add a plugin containing some shadow tiddlers + var shadowTiddlers = { + tiddlers: { "$:/TiddlerFive": { - tiddler: new $tw.Tiddler({title: "$:/TiddlerFive", - text: "Everything in federation", - tags: ["two"] - }), + title: "$:/TiddlerFive", + text: "Everything in federation", + tags: ["two"] }, "TiddlerSix": { - tiddler: new $tw.Tiddler({title: "TiddlerSix", - text: "Missing inaction from TiddlerOne", - tags: [] - }), + title: "TiddlerSix", + text: "Missing inaction from TiddlerOne", + tags: [] }, "TiddlerSeventh": { - tiddler: new $tw.Tiddler({title: "TiddlerSeventh", - text: "", - list: "TiddlerOne [[Tiddler Three]] [[a fourth tiddler]] MissingTiddler", - tags: ["one"] - }), + title: "TiddlerSeventh", + text: "", + list: "TiddlerOne [[Tiddler Three]] [[a fourth tiddler]] MissingTiddler", + tags: ["one"] }, "Tiddler8": { - tiddler: new $tw.Tiddler({title: "Tiddler8", - text: "Tidd", - tags: ["one"], - "test-field": "JoeBloggs" - }) - } + title: "Tiddler8", + text: "Tidd", + tags: ["one"], + "test-field": "JoeBloggs" + } } - }, - wikiOptions)); + }; + wiki.addTiddler({ + title: "$:/ShadowPlugin", + text: JSON.stringify(shadowTiddlers), + "plugin-type": "plugin", + type: "application/json"}); // Add a few tiddlers wiki.addTiddler({ title: "TiddlerOne", @@ -110,6 +117,11 @@ function setupWiki(wikiOptions) { list: "[[Tiddler Three]] [[TiddlerOne]]", empty: "", modifier: "JohnDoe"}); + // Unpack plugin tiddlers + wiki.readPluginInfo(); + wiki.registerPluginTiddlers("plugin"); + wiki.unpackPluginTiddlers(); + wiki.addIndexersToWiki(); return wiki; } @@ -134,31 +146,31 @@ function runTests(wiki) { it("should handle the title operator", function() { expect(wiki.filterTiddlers("TiddlerOne [title[$:/TiddlerTwo]] [[Tiddler Three]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three"); - expect(wiki.filterTiddlers("[!title[Tiddler Three]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!title[Tiddler Three]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,a fourth tiddler,one"); expect(wiki.filterTiddlers("TiddlerOne [title[$:/TiddlerTwo]] [[Tiddler Three]] [[A Missing Tiddler]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,A Missing Tiddler"); }); it("should handle the field operator", function() { expect(wiki.filterTiddlers("[modifier[JoeBloggs]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[!modifier[JoeBloggs]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); expect(wiki.filterTiddlers("[!is[system]!modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one"); expect(wiki.filterTiddlers("[field:modifier[JoeBloggs]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[!field:modifier[JoeBloggs]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!field:modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); expect(wiki.filterTiddlers("[!is[system]!field:modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one"); expect(wiki.filterTiddlers("[modifier[JohnDoe]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!modifier[JohnDoe]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne"); expect(wiki.filterTiddlers("[!is[system]!modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[field:modifier[JohnDoe]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!field:modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!field:modifier[JohnDoe]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne"); expect(wiki.filterTiddlers("[!is[system]!field:modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); }); it("should handle the regexp operator", function() { expect(wiki.filterTiddlers("[regexp[id]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler"); - expect(wiki.filterTiddlers("[!regexp[id]]").join(",")).toBe("one"); + expect(wiki.filterTiddlers("[!regexp[id]]").join(",")).toBe("$:/ShadowPlugin,one"); expect(wiki.filterTiddlers("[regexp[Tid]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three"); expect(wiki.filterTiddlers("[regexp[(?i)Tid]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler"); - expect(wiki.filterTiddlers("[!regexp[Tid(?i)]]").join(",")).toBe("one"); + expect(wiki.filterTiddlers("[!regexp[Tid(?i)]]").join(",")).toBe("$:/ShadowPlugin,one"); }); it("should handle the field operator with a regular expression operand", function() { @@ -172,41 +184,41 @@ function runTests(wiki) { }); it("should handle the sort and sortcs operators", function() { - expect(wiki.filterTiddlers("[sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[!sort[title]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo"); + expect(wiki.filterTiddlers("[sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!sort[title]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); // Temporarily commenting out the following two lines because of platform differences for localeCompare between the browser and Node.js // expect(wiki.filterTiddlers("[sortcs[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler,one"); // expect(wiki.filterTiddlers("[!sortcs[title]]").join(",")).toBe("one,a fourth tiddler,TiddlerOne,Tiddler Three,$:/TiddlerTwo"); }); it("should handle the reverse, first, last, butfirst, butlast, rest and nth operators", function() { - expect(wiki.filterTiddlers("[sort[title]first[]]").join(",")).toBe("$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[sort[title]first[2]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler"); - expect(wiki.filterTiddlers("[sort[title]first[8]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]first[x]]").join(",")).toBe("$:/TiddlerTwo"); + expect(wiki.filterTiddlers("[sort[title]first[]]").join(",")).toBe("$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[sort[title]first[2]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo"); + expect(wiki.filterTiddlers("[sort[title]first[8]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]first[x]]").join(",")).toBe("$:/ShadowPlugin"); expect(wiki.filterTiddlers("[sort[title]last[]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[sort[title]last[2]]").join(",")).toBe("Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]last[8]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]last[8]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[sort[title]last[x]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]reverse[]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[sort[title]reverse[x]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[sort[title]butlast[]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); - expect(wiki.filterTiddlers("[sort[title]butlast[2]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[sort[title]reverse[]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[sort[title]reverse[x]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[sort[title]butlast[]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); + expect(wiki.filterTiddlers("[sort[title]butlast[2]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one"); expect(wiki.filterTiddlers("[sort[title]butlast[8]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[sort[title]butlast[x]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); - expect(wiki.filterTiddlers("[sort[title]rest[]]").join(",")).toBe("a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]rest[2]]").join(",")).toBe("one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]butlast[x]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); + expect(wiki.filterTiddlers("[sort[title]rest[]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]rest[2]]").join(",")).toBe("a fourth tiddler,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[sort[title]rest[8]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[sort[title]rest[x]]").join(",")).toBe("a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]nth[]]").join(",")).toBe("$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[sort[title]nth[2]]").join(",")).toBe("a fourth tiddler"); + expect(wiki.filterTiddlers("[sort[title]rest[x]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]nth[]]").join(",")).toBe("$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[sort[title]nth[2]]").join(",")).toBe("$:/TiddlerTwo"); expect(wiki.filterTiddlers("[sort[title]nth[8]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[sort[title]nth[x]]").join(",")).toBe("$:/TiddlerTwo"); + expect(wiki.filterTiddlers("[sort[title]nth[x]]").join(",")).toBe("$:/ShadowPlugin"); }); it("should handle the tag operator", function() { expect(wiki.filterTiddlers("[tag[one]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[!tag[one]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!tag[one]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one"); expect(wiki.filterTiddlers("[prefix[Tidd]tag[one]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[!is[shadow]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three"); expect(wiki.filterTiddlers("[all[shadows]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerFive"); @@ -226,7 +238,7 @@ function runTests(wiki) { }); it("should handle the untagged operator", function() { - expect(wiki.filterTiddlers("[untagged[]sort[title]]").join(",")).toBe("a fourth tiddler,one"); + expect(wiki.filterTiddlers("[untagged[]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,one"); expect(wiki.filterTiddlers("[!untagged[]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); }); @@ -242,12 +254,12 @@ function runTests(wiki) { it("should handle the has operator", function() { expect(wiki.filterTiddlers("[has[modified]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[!has[modified]sort[title]]").join(",")).toBe("a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!has[modified]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,one"); }); it("should handle the has:field operator", function() { expect(wiki.filterTiddlers("[has:field[empty]sort[title]]").join(",")).toBe("a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!has:field[empty]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!has:field[empty]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne"); }); @@ -274,14 +286,14 @@ function runTests(wiki) { it("should handle the search operator", function() { expect(wiki.filterTiddlers("[search[the]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[search{Tiddler8}sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[search{Tiddler8}sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[search:modifier[og]sort[title]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[search:modifier,authors:casesensitive[Do]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); expect(wiki.filterTiddlers("[search:modifier,authors:casesensitive[do]sort[title]]").join(",")).toBe(""); expect(wiki.filterTiddlers("[search:authors:casesensitive,whitespace[John Doe]sort[title]]").join(",")).toBe("$:/TiddlerTwo"); expect(wiki.filterTiddlers("[search:modifier:regexp[(d|bl)o(ggs|e)]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[search:-modifier,authors:[g]sort[title]]").join(",")).toBe("Tiddler Three"); - expect(wiki.filterTiddlers("[search:*:[g]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[search:-modifier,authors:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,Tiddler Three"); + expect(wiki.filterTiddlers("[search:*:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,Tiddler Three,TiddlerOne"); }); it("should yield search results that have search tokens spread across different fields", function() { @@ -289,7 +301,7 @@ function runTests(wiki) { }); it("should handle the each operator", function() { - expect(wiki.filterTiddlers("[each[modifier]sort[title]]").join(",")).toBe("$:/TiddlerTwo,TiddlerOne"); + expect(wiki.filterTiddlers("[each[modifier]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,TiddlerOne"); expect(wiki.filterTiddlers("[each:list-item[tags]sort[title]]").join(",")).toBe("one,two"); expect(wiki.filterTiddlers("[each:list-item[authors]sort[title]]").join(",")).toBe("Bloggs,Joe,John Doe"); }); @@ -309,36 +321,36 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[is[current]]",fakeWidget).join(",")).toBe("Tiddler Three"); expect(wiki.filterTiddlers("[[Tiddler Three]is[current]]",fakeWidget).join(",")).toBe("Tiddler Three"); expect(wiki.filterTiddlers("[[$:/TiddlerTwo]is[current]]",fakeWidget).join(",")).toBe(""); - expect(wiki.filterTiddlers("[!is[current]sort[title]]",fakeWidget).join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[current]sort[title]]",fakeWidget).join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,TiddlerOne"); }); it("should handle the '[is[system]]' operator", function() { - expect(wiki.filterTiddlers("[is[system]]").join(",")).toBe("$:/TiddlerTwo"); + expect(wiki.filterTiddlers("[is[system]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo"); expect(wiki.filterTiddlers("[!is[system]sort[title]]").join(",")).toBe("a fourth tiddler,one,Tiddler Three,TiddlerOne"); }); it("should handle the '[is[shadow]]' operator", function() { expect(wiki.filterTiddlers("[all[shadows]sort[title]]").join(",")).toBe("$:/TiddlerFive,Tiddler8,TiddlerSeventh,TiddlerSix"); - expect(wiki.filterTiddlers("[!is[shadow]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[shadow]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); }); it("should handle the '[is[missing]]' operator", function() { - expect(wiki.filterTiddlers("[all[]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[all[]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); expect(wiki.filterTiddlers("[all[missing]]").join(",")).toBe("TiddlerZero"); - expect(wiki.filterTiddlers("[!is[missing]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[missing]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[[TiddlerOne]is[missing]]").join(",")).toBe(""); expect(wiki.filterTiddlers("[[TiddlerZero]is[missing]]").join(",")).toBe("TiddlerZero"); expect(wiki.filterTiddlers("[!title[Tiddler Three]is[missing]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[missing]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,TiddlerOne"); + expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[missing]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,TiddlerOne"); }); it("should handle the '[is[orphan]]' operator", function() { expect(wiki.filterTiddlers("[is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,TiddlerOne"); - expect(wiki.filterTiddlers("[!is[orphan]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,one"); + expect(wiki.filterTiddlers("[!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,one"); expect(wiki.filterTiddlers("[[TiddlerOne]is[orphan]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[[TiddlerOne]!is[orphan]]").join(",")).toBe(""); expect(wiki.filterTiddlers("[!title[Tiddler Three]is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,TiddlerOne"); - expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[orphan]]").join(",")).toBe("$:/TiddlerTwo,one"); + expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,one"); }); }); From e86d4d29d58d1ce55218e220c19dea6a7184ad31 Mon Sep 17 00:00:00 2001 From: jed <inmysocks@fastmail.com> Date: Wed, 24 Jul 2019 19:12:09 +0200 Subject: [PATCH 0234/2376] Fix th-renaming-tiddler (see #4023) (#4037) * Remove the th-renaming-tiddler hook from navigatior.js The hook is invoked in the renameTiddler function which would cause the same hook to be called twice, and the version in the navigator widget didn't have the correct inputs and return value according to the documentation. * Make it so that the th-renaming-tiddler hook isn't called twice by removing it from the navigator.js file --- core/modules/widgets/navigator.js | 1 - 1 file changed, 1 deletion(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 33745b898..9494346fb 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -598,7 +598,6 @@ NavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) { }; NavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) { - event = $tw.hooks.invokeHook("th-renaming-tiddler", event); var paramObject = event.paramObject || {}, from = paramObject.from || event.tiddlerTitle, to = paramObject.to; From 32c5490a20e0e17d2c49a5ae458dff8ce8f177be Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 26 Jul 2019 12:46:27 +0100 Subject: [PATCH 0235/2376] Improve contribution banner * Make it work with titles with crazy characters * Hide the banner for tiddlers that didn't originate on GitHub Fixes #4116 and #4129 --- .../tiddlers/system/ContributionBanner.tid | 22 ++++++++----------- .../es-ES/tiddlers/$__ContributionBanner.tid | 22 ++++++++----------- .../fr-FR/tiddlers/$__ContributionBanner.tid | 22 ++++++++----------- .../tiddlers/system/ContributionBanner.tid | 22 ++++++++----------- .../tiddlers/system/ContributionBanner.tid | 22 ++++++++----------- 5 files changed, 45 insertions(+), 65 deletions(-) diff --git a/editions/dev/tiddlers/system/ContributionBanner.tid b/editions/dev/tiddlers/system/ContributionBanner.tid index f9ec77791..0ec32b007 100644 --- a/editions/dev/tiddlers/system/ContributionBanner.tid +++ b/editions/dev/tiddlers/system/ContributionBanner.tid @@ -2,19 +2,15 @@ title: $:/ContributionBanner tags: $:/tags/EditTemplate list-after: $:/core/ui/EditTemplate/title -\define makeGitHubLink() -https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/dev/tiddlers/$(githubLink)$ -\end -\define innerMakeGitHubLink(linkText) -<$set name="githubLink" value={{$:/config/OriginalTiddlerPaths##$(draftOfTiddler)$}}> -<a href=<<makeGitHubLink>> class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">$linkText$</a> -</$set> -\end -\define outerMakeGitHubLink(linkText) -<$set name="draftOfTiddler" value={{$(currentTiddler)$!!draft.of}}> -<<innerMakeGitHubLink "$linkText$">> -</$set> +\define base-github() +https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/dev/tiddlers/ \end + +<$set name="draft-of" value={{{ [<currentTiddler>get[draft.of]] }}}> +<$list filter="[[$:/config/OriginalTiddlerPaths]getindex<draft-of>]" variable="target" > <div class="tc-improvement-banner"> -{{$:/core/images/star-filled}} Can you help us improve this documentation? [ext[Find out how|https://tiddlywiki.com/#Improving%20TiddlyWiki%20Documentation]] to edit <<outerMakeGitHubLink "this tiddler on ~GitHub">> +{{$:/core/images/star-filled}} Can you help us improve this documentation? [ext[Find out how|https://tiddlywiki.com/#Improving%20TiddlyWiki%20Documentation]] to +<a href={{{ [<target>addprefix<base-github>] }}} class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">edit this tiddler on ~GitHub</a> </div> +</$list> +</$set> diff --git a/editions/es-ES/tiddlers/$__ContributionBanner.tid b/editions/es-ES/tiddlers/$__ContributionBanner.tid index 772e14d74..484917633 100644 --- a/editions/es-ES/tiddlers/$__ContributionBanner.tid +++ b/editions/es-ES/tiddlers/$__ContributionBanner.tid @@ -5,19 +5,15 @@ tags: $:/tags/EditTemplate title: $:/ContributionBanner type: text/vnd.tiddlywiki -\define makeGitHubLink() -https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/es-ES/tiddlers/$(githubLink)$ -\end -\define innerMakeGitHubLink(linkText) -<$set name="githubLink" value={{$:/config/OriginalTiddlerPaths##$(draftOfTiddler)$}}> -<a href=<<makeGitHubLink>> class="tc-tiddlylink-external" target="_blank">$linkText$</a> -</$set> -\end -\define outerMakeGitHubLink(linkText) -<$set name="draftOfTiddler" value={{$(currentTiddler)$!!draft.of}}> -<<innerMakeGitHubLink "$linkText$">> -</$set> +\define base-github() +https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/es-ES/tiddlers/ \end + +<$set name="draft-of" value={{{ [<currentTiddler>get[draft.of]] }}}> +<$list filter="[[$:/config/OriginalTiddlerPaths]getindex<draft-of>]" variable="target" > <div class="tc-improvement-banner"> -{{$:/core/images/star-filled}} ¿Puedes ayudarnos a mejorar la documentación? [[Aquí te explicamos|Improving TiddlyWiki Documentation]] cómo editar <<outerMakeGitHubLink "este tiddler en ~GitHub">> +{{$:/core/images/star-filled}} ¿Puedes ayudarnos a mejorar la documentación? [[Aquí te explicamos|Improving TiddlyWiki Documentation]] cómo editar +<a href={{{ [<target>addprefix<base-github>] }}} class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">este tiddler en ~GitHub</a> </div> +</$list> +</$set> diff --git a/editions/fr-FR/tiddlers/$__ContributionBanner.tid b/editions/fr-FR/tiddlers/$__ContributionBanner.tid index 56b072fa1..5dcc8d82d 100644 --- a/editions/fr-FR/tiddlers/$__ContributionBanner.tid +++ b/editions/fr-FR/tiddlers/$__ContributionBanner.tid @@ -5,19 +5,15 @@ tags: $:/tags/EditTemplate title: $:/ContributionBanner type: text/vnd.tiddlywiki -\define makeGitHubLink() -https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/fr-FR/tiddlers/$(githubLink)$ -\end -\define innerMakeGitHubLink(linkText) -<$set name="githubLink" value={{$:/config/OriginalTiddlerPaths##$(draftOfTiddler)$}}> -<a href=<<makeGitHubLink>> class="tc-tiddlylink-external" target="_blank">$linkText$</a> -</$set> -\end -\define outerMakeGitHubLink(linkText) -<$set name="draftOfTiddler" value={{$(currentTiddler)$!!draft.of}}> -<<innerMakeGitHubLink "$linkText$">> -</$set> +\define base-github() +https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/fr-FR/tiddlers/ \end + +<$set name="draft-of" value={{{ [<currentTiddler>get[draft.of]] }}}> +<$list filter="[[$:/config/OriginalTiddlerPaths]getindex<draft-of>]" variable="target" > <div class="tc-improvement-banner"> -{{$:/core/images/star-filled}} Pouvez-vous nous aider à améliorer cette documentation ? [[Voyez comment|Improving TiddlyWiki Documentation]] éditer <<outerMakeGitHubLink "ce tiddler sur ~GitHub">> +{{$:/core/images/star-filled}} Pouvez-vous nous aider à améliorer cette documentation ? [[Voyez comment|Improving TiddlyWiki Documentation]] éditer +<a href={{{ [<target>addprefix<base-github>] }}} class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">ce tiddler sur ~GitHub</a> </div> +</$list> +</$set> diff --git a/editions/ko-KR/tiddlers/system/ContributionBanner.tid b/editions/ko-KR/tiddlers/system/ContributionBanner.tid index 8f04dba2c..8e7e325f7 100644 --- a/editions/ko-KR/tiddlers/system/ContributionBanner.tid +++ b/editions/ko-KR/tiddlers/system/ContributionBanner.tid @@ -2,19 +2,15 @@ title: $:/ContributionBanner tags: $:/tags/EditTemplate list-after: $:/core/ui/EditTemplate/title -\define makeGitHubLink() -https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/ko-KR/tiddlers/$(githubLink)$ -\end -\define innerMakeGitHubLink(linkText) -<$set name="githubLink" value={{$:/config/OriginalTiddlerPaths##$(draftOfTiddler)$}}> -<a href=<<makeGitHubLink>> class="tc-tiddlylink-external" target="_blank">$linkText$</a> -</$set> -\end -\define outerMakeGitHubLink(linkText) -<$set name="draftOfTiddler" value={{$(currentTiddler)$!!draft.of}}> -<<innerMakeGitHubLink "$linkText$">> -</$set> +\define base-github() +https://github.com/Jermolene/TiddlyWiki5/edit/master/editions/ko-KR/tiddlers/ \end + +<$set name="draft-of" value={{{ [<currentTiddler>get[draft.of]] }}}> +<$list filter="[[$:/config/OriginalTiddlerPaths]getindex<draft-of>]" variable="target" > <div class="tc-improvement-banner"> -{{$:/core/images/star-filled}} 우리에게 이 설명문서를 개선하는 데 도움을 줄 수 있나요? <<outerMakeGitHubLink "~GitHub에서 이 티들러">>를 편집하는 [[방법에 대해 알아보세요|Improving TiddlyWiki Documentation]] +{{$:/core/images/star-filled}}우리에게 이 설명문서를 개선하는 데 도움을 줄 수 있나요? +<a href={{{ [<target>addprefix<base-github>] }}} class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">~GitHub에서 이 티들러</a>를 편집하는 [[방법에 대해 알아보세요|Improving TiddlyWiki Documentation]] </div> +</$list> +</$set> diff --git a/editions/tw5.com/tiddlers/system/ContributionBanner.tid b/editions/tw5.com/tiddlers/system/ContributionBanner.tid index f2ff308ab..0cd359079 100644 --- a/editions/tw5.com/tiddlers/system/ContributionBanner.tid +++ b/editions/tw5.com/tiddlers/system/ContributionBanner.tid @@ -2,19 +2,15 @@ title: $:/ContributionBanner tags: $:/tags/EditTemplate list-after: $:/core/ui/EditTemplate/title -\define makeGitHubLink() -https://github.com/Jermolene/TiddlyWiki5/edit/tiddlywiki-com/editions/tw5.com/tiddlers/$(githubLink)$ -\end -\define innerMakeGitHubLink(linkText,tiddler) -<$set name="githubLink" value={{{ [[$:/config/OriginalTiddlerPaths]getindex<__tiddler__>] }}}> -<a href=<<makeGitHubLink>> class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">$linkText$</a> -</$set> -\end -\define outerMakeGitHubLink(linkText) -<$set name="draftOfTiddler" value={{{ [[$(currentTiddler)$]get[draft.of]] }}}> -<$macrocall $name="innerMakeGitHubLink" linkText="$linkText$" tiddler=<<draftOfTiddler>>/> -</$set> +\define base-github() +https://github.com/Jermolene/TiddlyWiki5/edit/tiddlywiki-com/editions/tw5.com/tiddlers/ \end + +<$set name="draft-of" value={{{ [<currentTiddler>get[draft.of]] }}}> +<$list filter="[[$:/config/OriginalTiddlerPaths]getindex<draft-of>]" variable="target" > <div class="tc-improvement-banner"> -{{$:/core/images/star-filled}} Can you help us improve this documentation? [[Find out how|Improving TiddlyWiki Documentation]] to edit <$macrocall $name="outerMakeGitHubLink" linkText="this tiddler on ~GitHub"/> +{{$:/core/images/star-filled}} Can you help us improve this documentation? [[Find out how|Improving TiddlyWiki Documentation]] to +<a href={{{ [<target>addprefix<base-github>] }}} class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">edit this tiddler on ~GitHub</a> </div> +</$list> +</$set> From b30746813b97bc8957913814f3452f8b04ffec78 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 26 Jul 2019 18:13:53 +0200 Subject: [PATCH 0236/2376] Fix: store noStateReference in popup.js (#4115) --- core/modules/utils/dom/popup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index ce148af95..a62bf8975 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -120,7 +120,8 @@ Popup.prototype.show = function(options) { this.popups.push({ title: options.title, wiki: options.wiki, - domNode: options.domNode + domNode: options.domNode, + noStateReference: options.noStateReference }); } // Set the state tiddler From 269fa5313f12305651aec085deb8c339c46f4ee6 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 28 Jul 2019 16:39:34 +0100 Subject: [PATCH 0237/2376] Fix for index ordering issue Fixes #4082 This version removes selective updating of the tag index, instead completely clearing the index on each update. I'm investigating restoring that optimisation. --- boot/boot.js | 43 +++++++- core/modules/indexers/field-indexer.js | 21 ++-- core/modules/indexers/tag-indexer.js | 110 +++++++------------ core/modules/wiki.js | 2 +- editions/test/tiddlers/tests/test-filters.js | 9 ++ 5 files changed, 95 insertions(+), 90 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index aac0132e6..444bf5c32 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1063,18 +1063,35 @@ $tw.Wiki = function(options) { if(tiddler) { var title = tiddler.fields.title; if(title) { - var oldTiddler = this.getTiddler(title); // Uncomment the following line for detailed logs of all tiddler writes // console.log("Adding",title,tiddler) + // Record the old tiddler state + var updateDescriptor = { + old: { + tiddler: this.getTiddler(title), + shadow: this.isShadowTiddler(title), + exists: this.tiddlerExists(title) + } + } + // Save the new tiddler tiddlers[title] = tiddler; + // Check we've got it's title if(tiddlerTitles && tiddlerTitles.indexOf(title) === -1) { tiddlerTitles.push(title); } + // Record the new tiddler state + updateDescriptor["new"] = { + tiddler: tiddler, + shadow: this.isShadowTiddler(title), + exists: this.tiddlerExists(title) + } + // Update indexes this.clearCache(title); this.clearGlobalCache(); $tw.utils.each(indexers,function(indexer) { - indexer.update(oldTiddler,tiddler); + indexer.update(updateDescriptor); }); + // Queue a change event this.enqueueTiddlerEvent(title); } } @@ -1085,20 +1102,36 @@ $tw.Wiki = function(options) { // Uncomment the following line for detailed logs of all tiddler deletions // console.log("Deleting",title) if($tw.utils.hop(tiddlers,title)) { - var oldTiddler = this.getTiddler(title); + // Record the old tiddler state + var updateDescriptor = { + old: { + tiddler: this.getTiddler(title), + shadow: this.isShadowTiddler(title), + exists: this.tiddlerExists(title) + } + } + // Delete the tiddler delete tiddlers[title]; + // Delete it from the list of titles if(tiddlerTitles) { var index = tiddlerTitles.indexOf(title); if(index !== -1) { tiddlerTitles.splice(index,1); } } + // Record the new tiddler state + updateDescriptor["new"] = { + tiddler: this.getTiddler(title), + shadow: this.isShadowTiddler(title), + exists: this.tiddlerExists(title) + } + // Update indexes this.clearCache(title); this.clearGlobalCache(); - var newTiddler = this.getTiddler(title); $tw.utils.each(indexers,function(indexer) { - indexer.update(oldTiddler,newTiddler); + indexer.update(updateDescriptor); }); + // Queue a change event this.enqueueTiddlerEvent(title,true); } }; diff --git a/core/modules/indexers/field-indexer.js b/core/modules/indexers/field-indexer.js index 07a6e8d55..0f070e5e5 100644 --- a/core/modules/indexers/field-indexer.js +++ b/core/modules/indexers/field-indexer.js @@ -88,23 +88,22 @@ FieldIndexer.prototype.buildIndexForField = function(name) { /* Update the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create) -oldTiddler: old tiddler value, or null for creation -newTiddler: new tiddler value, or null for deletion +updateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}} */ -FieldIndexer.prototype.update = function(oldTiddler,newTiddler) { +FieldIndexer.prototype.update = function(updateDescriptor) { var self = this; // Don't do anything if the index hasn't been built yet if(this.index === null) { return; } // Remove the old tiddler from the index - if(oldTiddler) { + if(updateDescriptor.old.tiddler) { $tw.utils.each(this.index,function(indexEntry,name) { - if(name in oldTiddler.fields) { - var value = oldTiddler.getFieldString(name), + if(name in updateDescriptor.old.tiddler.fields) { + var value = updateDescriptor.old.tiddler.getFieldString(name), tiddlerList = indexEntry[value]; if(tiddlerList) { - var index = tiddlerList.indexOf(oldTiddler.fields.title); + var index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title); if(index !== -1) { tiddlerList.splice(index,1); } @@ -113,13 +112,13 @@ FieldIndexer.prototype.update = function(oldTiddler,newTiddler) { }); } // Add the new tiddler to the index - if(newTiddler) { + if(updateDescriptor["new"].tiddler) { $tw.utils.each(this.index,function(indexEntry,name) { - if(name in newTiddler.fields) { - var value = newTiddler.getFieldString(name); + if(name in updateDescriptor["new"].tiddler.fields) { + var value = updateDescriptor["new"].tiddler.getFieldString(name); if(value.length < self.maxIndexedValueLength) { indexEntry[value] = indexEntry[value] || []; - indexEntry[value].push(newTiddler.fields.title); + indexEntry[value].push(updateDescriptor["new"].tiddler.fields.title); } } }); diff --git a/core/modules/indexers/tag-indexer.js b/core/modules/indexers/tag-indexer.js index 054df7d91..c7d297fc9 100644 --- a/core/modules/indexers/tag-indexer.js +++ b/core/modules/indexers/tag-indexer.js @@ -17,41 +17,48 @@ function TagIndexer(wiki) { } TagIndexer.prototype.init = function() { - this.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} - this.addIndexMethods(); + this.subIndexers = [ + new TagSubIndexer(this,"each"), + new TagSubIndexer(this,"eachShadow"), + new TagSubIndexer(this,"eachTiddlerPlusShadows"), + new TagSubIndexer(this,"eachShadowPlusTiddlers") + ]; + $tw.utils.each(this.subIndexers,function(subIndexer) { + subIndexer.addIndexMethod(); + }); +}; + +TagIndexer.prototype.rebuild = function() { + $tw.utils.each(this.subIndexers,function(subIndexer) { + subIndexer.rebuild(); + }); +}; + +TagIndexer.prototype.update = function(updateDescriptor) { + $tw.utils.each(this.subIndexers,function(subIndexer) { + subIndexer.update(updateDescriptor); + }); +}; + +function TagSubIndexer(indexer,iteratorMethod) { + this.indexer = indexer; + this.iteratorMethod = iteratorMethod; + this.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised } -TagIndexer.prototype.addIndexMethods = function() { +TagSubIndexer.prototype.addIndexMethod = function() { var self = this; - this.wiki.each.byTag = function(tag) { - var titles = self.wiki.allTitles(); - return self.lookup(tag).filter(function(title) { - return titles.indexOf(title) !== -1; - }); - }; - this.wiki.eachShadow.byTag = function(tag) { - var titles = self.wiki.allShadowTitles(); - return self.lookup(tag).filter(function(title) { - return titles.indexOf(title) !== -1; - }); - }; - this.wiki.eachTiddlerPlusShadows.byTag = function(tag) { - return self.lookup(tag).slice(0); - }; - this.wiki.eachShadowPlusTiddlers.byTag = function(tag) { + this.indexer.wiki[this.iteratorMethod].byTag = function(tag) { return self.lookup(tag).slice(0); }; }; -/* -Tear down and then rebuild the index as if all tiddlers have changed -*/ -TagIndexer.prototype.rebuild = function() { +TagSubIndexer.prototype.rebuild = function() { var self = this; // Hashmap by tag of array of {isSorted:, titles:[]} this.index = Object.create(null); // Add all the tags - this.wiki.eachTiddlerPlusShadows(function(tiddler,title) { + this.indexer.wiki[this.iteratorMethod](function(tiddler,title) { $tw.utils.each(tiddler.fields.tags,function(tag) { if(!self.index[tag]) { self.index[tag] = {isSorted: false, titles: [title]}; @@ -62,55 +69,11 @@ TagIndexer.prototype.rebuild = function() { }); }; -/* -Update the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create) -oldTiddler: old tiddler value, or null for creation -newTiddler: new tiddler value, or null for deletion -*/ -TagIndexer.prototype.update = function(oldTiddler,newTiddler) { - // Don't update the index if it has yet to be built - if(this.index === null) { - return; - } - var self = this, - title = oldTiddler ? oldTiddler.fields.title : newTiddler.fields.title; - // Handle changes to the tags - var oldTiddlerTags = (oldTiddler ? (oldTiddler.fields.tags || []) : []), - newTiddlerTags = (newTiddler ? (newTiddler.fields.tags || []) : []); - $tw.utils.each(oldTiddlerTags,function(oldTag) { - if(newTiddlerTags.indexOf(oldTag) === -1) { - // Deleted tag - var indexRecord = self.index[oldTag], - pos = indexRecord.titles.indexOf(title); - if(pos !== -1) { - indexRecord.titles.splice(pos,1); - } - } - }); - $tw.utils.each(newTiddlerTags,function(newTag) { - if(oldTiddlerTags.indexOf(newTag) === -1) { - // New tag - var indexRecord = self.index[newTag]; - if(!indexRecord) { - self.index[newTag] = {isSorted: false, titles: [title]}; - } else { - indexRecord.titles.push(title); - indexRecord.isSorted = false; - } - } - }); - // Handle changes to the list field of tags - var oldTiddlerList = (oldTiddler ? (oldTiddler.fields.list || []) : []), - newTiddlerList = (newTiddler ? (newTiddler.fields.list || []) : []); - if(!$tw.utils.isArrayEqual(oldTiddlerList,newTiddlerList)) { - if(self.index[title]) { - self.index[title].isSorted = false; - } - } +TagSubIndexer.prototype.update = function(updateDescriptor) { + this.index = null; }; -// Lookup the given tag returning an ordered list of tiddler titles -TagIndexer.prototype.lookup = function(tag) { +TagSubIndexer.prototype.lookup = function(tag) { // Update the index if it has yet to be built if(this.index === null) { this.rebuild(); @@ -118,8 +81,8 @@ TagIndexer.prototype.lookup = function(tag) { var indexRecord = this.index[tag]; if(indexRecord) { if(!indexRecord.isSorted) { - if(this.wiki.sortByList) { - indexRecord.titles = this.wiki.sortByList(indexRecord.titles,tag); + if(this.indexer.wiki.sortByList) { + indexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag); } indexRecord.isSorted = true; } @@ -129,6 +92,7 @@ TagIndexer.prototype.lookup = function(tag) { } }; + exports.TagIndexer = TagIndexer; })(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index f77d68fa2..4d1f938e7 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -491,7 +491,7 @@ exports.getTiddlersWithTag = function(tag) { // Try to use the indexer var self = this, tagIndexer = this.getIndexer("TagIndexer"), - results = tagIndexer && tagIndexer.lookup(tag); + results = tagIndexer && tagIndexer.subIndexers[3].lookup(tag); if(!results) { // If not available, perform a manual scan results = this.getGlobalCache("taglist-" + tag,function() { diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index b41db3a59..7735d283b 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -224,6 +224,15 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[all[shadows]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerFive"); }); + it("should handle the all operator with field, has and tag operators", function() { + expect(wiki.filterTiddlers("[all[shadows]tag[two]]").join(",")).toBe("$:/TiddlerFive"); + expect(wiki.filterTiddlers("[all[shadows+tiddlers]tag[two]]").join(",")).toBe("$:/TiddlerFive,$:/TiddlerTwo,Tiddler Three"); + expect(wiki.filterTiddlers("[all[tiddlers+shadows]tag[two]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,$:/TiddlerFive"); + expect(wiki.filterTiddlers("[all[shadows+tiddlers]]").join(",")).toBe("$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8,$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[all[tiddlers+shadows]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8"); + expect(wiki.filterTiddlers("[all[tiddlers]tag[two]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three"); + }); + it("should handle the tags operator", function() { expect(wiki.filterTiddlers("[tags[]sort[title]]").join(",")).toBe("one,two"); expect(wiki.filterTiddlers("[[TiddlerOne]tags[]sort[title]]").join(",")).toBe("one"); From e669ec098fca778b88b9a71ec9131cc9817ae513 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 30 Jul 2019 14:47:56 +0200 Subject: [PATCH 0238/2376] Fix beyboard widget empty parameters (#4094) --- core/modules/widgets/keyboard.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/modules/widgets/keyboard.js b/core/modules/widgets/keyboard.js index c8cbb70a8..7611b3d61 100644 --- a/core/modules/widgets/keyboard.js +++ b/core/modules/widgets/keyboard.js @@ -73,13 +73,13 @@ Compute the internal state of the widget KeyboardWidget.prototype.execute = function() { var self = this; // Get attributes - this.actions = this.getAttribute("actions"); - this.message = this.getAttribute("message"); - this.param = this.getAttribute("param"); - this.key = this.getAttribute("key"); - this.tag = this.getAttribute("tag"); + this.actions = this.getAttribute("actions",""); + this.message = this.getAttribute("message",""); + this.param = this.getAttribute("param",""); + this.key = this.getAttribute("key",""); + this.tag = this.getAttribute("tag",""); this.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key); - this["class"] = this.getAttribute("class"); + this["class"] = this.getAttribute("class",""); if(this.key.substr(0,2) === "((" && this.key.substr(-2,2) === "))") { this.shortcutTiddlers = []; var name = this.key.substring(2,this.key.length -2); From 0a2d532a7b03d47195553cd859b003b9fe3e2d4d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 30 Jul 2019 14:49:05 +0200 Subject: [PATCH 0239/2376] Fix bug where edit widget input-tag is empty (#4088) --- core/modules/editor/factory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index c2e56f150..82b4484c6 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -193,7 +193,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { type = type || "text"; } // Get the rest of our parameters - this.editTag = this.getAttribute("tag",tag); + this.editTag = this.getAttribute("tag",tag) || "input"; this.editType = this.getAttribute("type",type); // Make the child widgets this.makeChildWidgets(); From cb1d35e230a2f303b2273f2dad1bc21df5ad07d5 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 30 Jul 2019 14:49:40 +0200 Subject: [PATCH 0240/2376] More Plugins - Button: use primary color (#4075) * Update AddPlugins.tid * Update base.tid * Update AddPlugins.tid * Update AddPlugins.tid * Update base.tid --- core/ui/ControlPanel/Plugins/AddPlugins.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/ui/ControlPanel/Plugins/AddPlugins.tid b/core/ui/ControlPanel/Plugins/AddPlugins.tid index 51132e270..8fc3c324e 100644 --- a/core/ui/ControlPanel/Plugins/AddPlugins.tid +++ b/core/ui/ControlPanel/Plugins/AddPlugins.tid @@ -2,6 +2,6 @@ title: $:/core/ui/ControlPanel/Plugins/AddPlugins \define lingo-base() $:/language/ControlPanel/Plugins/ -<$button message="tm-modal" param="$:/core/ui/ControlPanel/Modals/AddPlugins" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class="tc-btn-big-green" style="background:blue;"> +<$button message="tm-modal" param="$:/core/ui/ControlPanel/Modals/AddPlugins" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class="tc-btn-big-green tc-primary-btn"> {{$:/core/images/download-button}} <<lingo Add/Caption>> </$button> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 4aee2a3b9..92b804651 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -525,6 +525,10 @@ html body.tc-body .tc-btn-rounded:hover svg { fill: <<colour download-foreground>>; } +.tc-primary-btn { + background: <<colour primary>>; +} + .tc-sidebar-lists input { color: <<colour foreground>>; } From 7f78065992baf290ae221fb12c63e52e0f8da403 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 30 Jul 2019 17:10:53 +0100 Subject: [PATCH 0241/2376] Fix unnecessary "list" field creation when renaming tiddlers Fixes #4120 --- core/modules/wiki-bulkops.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/wiki-bulkops.js b/core/modules/wiki-bulkops.js index fa2acbe19..f64beccf5 100644 --- a/core/modules/wiki-bulkops.js +++ b/core/modules/wiki-bulkops.js @@ -44,8 +44,8 @@ function relinkTiddler(fromTitle,toTitle,options) { var type = tiddler.fields.type || ""; // Don't touch plugins or JavaScript modules if(!tiddler.fields["plugin-type"] && type !== "application/javascript") { - var tags = (tiddler.fields.tags || []).slice(0), - list = (tiddler.fields.list || []).slice(0), + var tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined, + list = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined, isModified = false; if(!options.dontRenameInTags) { // Rename tags From 5faae2547d68d386b2aa33255dcceed3539aa57e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 31 Jul 2019 09:11:12 +0100 Subject: [PATCH 0242/2376] Add "match" operator for string comparison Fixes #4130 --- core/modules/filters/match.js | 53 +++++++++++++++++++ .../prerelease/tiddlers/Release 5.1.20.tid | 2 +- editions/test/tiddlers/tests/test-filters.js | 10 ++++ .../examples/match Operator (Examples).tid | 8 +++ .../tiddlers/filters/match Operator.tid | 30 +++++++++++ 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 core/modules/filters/match.js create mode 100644 editions/tw5.com/tiddlers/filters/examples/match Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/match Operator.tid diff --git a/core/modules/filters/match.js b/core/modules/filters/match.js new file mode 100644 index 000000000..34caf487e --- /dev/null +++ b/core/modules/filters/match.js @@ -0,0 +1,53 @@ +/*\ +title: $:/core/modules/filters/match.js +type: application/javascript +module-type: filteroperator + +Filter operator for checking if a title matches a string + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.match = function(source,operator,options) { + var results = [], + suffixes = (operator.suffixes || [])[0] || []; + if(suffixes.indexOf("caseinsensitive") !== -1) { + if(operator.prefix === "!") { + source(function(tiddler,title) { + if(title.toLowerCase() !== (operator.operand || "").toLowerCase()) { + results.push(title); + } + }); + } else { + source(function(tiddler,title) { + if(title.toLowerCase() === (operator.operand || "").toLowerCase()) { + results.push(title); + } + }); + } + } else { + if(operator.prefix === "!") { + source(function(tiddler,title) { + if(title !== operator.operand) { + results.push(title); + } + }); + } else { + source(function(tiddler,title) { + if(title === operator.operand) { + results.push(title); + } + }); + } + } + return results; +}; + +})(); diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 9be098d38..3af277070 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[untrunc|untrunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. -Added several new string operators: [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[titlecase|titlecase Operator]], [[sentencecase|sentencecase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. +Added several new string operators: [[match|match Operator]], [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[titlecase|titlecase Operator]], [[sentencecase|sentencecase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter results, making it much easier to work with the new mathematics and string operators: diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 7735d283b..ae6f66de7 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -238,6 +238,16 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[[TiddlerOne]tags[]sort[title]]").join(",")).toBe("one"); }); + it("should handle the match operator", function() { + expect(wiki.filterTiddlers("[match[TiddlerOne]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("TiddlerOne TiddlerOne =[match[TiddlerOne]]").join(",")).toBe("TiddlerOne,TiddlerOne"); + expect(wiki.filterTiddlers("[!match[TiddlerOne]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[match:casesensitive[tiddlerone]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[!match:casesensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[match:caseinsensitive[tiddlerone]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!match:caseinsensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + }); + it("should handle the tagging operator", function() { expect(wiki.filterTiddlers("[[one]tagging[]sort[title]]").join(",")).toBe("Tiddler Three,Tiddler8,TiddlerOne,TiddlerSeventh"); expect(wiki.filterTiddlers("[[one]tagging[]]").join(",")).toBe("Tiddler Three,TiddlerOne,TiddlerSeventh,Tiddler8"); diff --git a/editions/tw5.com/tiddlers/filters/examples/match Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/match Operator (Examples).tid new file mode 100644 index 000000000..46e82ab0b --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/match Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20190731080350471 +modified: 20190731080435966 +tags: [[match Operator]] [[Operator Examples]] +title: match Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "a b c +[match[b]]">> +<<.operator-example 1 "[match[HelloThere]]">> diff --git a/editions/tw5.com/tiddlers/filters/match Operator.tid b/editions/tw5.com/tiddlers/filters/match Operator.tid new file mode 100644 index 000000000..9228b618e --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/match Operator.tid @@ -0,0 +1,30 @@ +caption: match +created: 20190731080209404 +modified: 20190731081047732 +op-input: a [[selection of titles|Title Selection]] +op-neg-output: each item in the input list that does not match the operand string +op-output: each item in the input list that matches the operand string (potentially including duplicates) +op-parameter: the string to be matched +op-purpose: returns each item in the list that matches the operand string +op-suffix: the <<.op match>> operator uses a rich suffix, see below for details +tags: [[Filter Operators]] +title: match Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> + +The <<.op match>> operator uses an extended syntax that permits multiple flags to be passed: + +``` +[match:<flag list>[<operand>]] +``` + +* ''flag list'': a comma delimited list of flags +* ''operand'': filter operand + +The available flags are: + +* ''casesensitive'': (default), this flag forces a case-sensitive match, where upper and lower case letters are considered different +* "caseinsensitive". overrides the default so that upper and lower case letters are considered identical for matching purposes + +<<.operator-examples "match">> From dbaccf792d82f755ef8c8ddb09112e68c5b27d18 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 31 Jul 2019 09:30:16 +0100 Subject: [PATCH 0243/2376] Use the new "match" operator across the core Instead of the old "prefix" hack --- core/ui/ControlPanel/KeyboardShortcuts.tid | 2 +- core/ui/EditToolbar/cancel.tid | 4 ++-- core/ui/EditToolbar/delete.tid | 4 ++-- core/ui/EditToolbar/save.tid | 4 ++-- core/ui/PageControls/advanced-search.tid | 4 ++-- core/ui/PageControls/closeall.tid | 4 ++-- core/ui/PageControls/controlpanel.tid | 4 ++-- core/ui/PageControls/encryption.tid | 8 ++++---- core/ui/PageControls/fold-all.tid | 4 ++-- core/ui/PageControls/full-screen.tid | 4 ++-- core/ui/PageControls/home.tid | 4 ++-- core/ui/PageControls/import.tid | 4 ++-- core/ui/PageControls/language.tid | 4 ++-- core/ui/PageControls/manager.tid | 4 ++-- core/ui/PageControls/more-page-actions.tid | 4 ++-- core/ui/PageControls/new-image.tid | 4 ++-- core/ui/PageControls/new-journal.tid | 4 ++-- core/ui/PageControls/newtiddler.tid | 4 ++-- core/ui/PageControls/palette.tid | 4 ++-- core/ui/PageControls/print.tid | 4 ++-- core/ui/PageControls/refresh.tid | 4 ++-- core/ui/PageControls/savewiki.tid | 4 ++-- core/ui/PageControls/storyview.tid | 4 ++-- core/ui/PageControls/tag-button.tid | 4 ++-- core/ui/PageControls/theme.tid | 4 ++-- core/ui/PageControls/timestamp.tid | 8 ++++---- core/ui/PageControls/unfold-all.tid | 4 ++-- core/ui/ViewToolbar/clone.tid | 4 ++-- core/ui/ViewToolbar/close-others.tid | 4 ++-- core/ui/ViewToolbar/close.tid | 4 ++-- core/ui/ViewToolbar/edit.tid | 4 ++-- core/ui/ViewToolbar/fold-others.tid | 4 ++-- core/ui/ViewToolbar/fold.tid | 8 ++++---- core/ui/ViewToolbar/info.tid | 4 ++-- core/ui/ViewToolbar/more-tiddler-actions.tid | 4 ++-- core/ui/ViewToolbar/new-here.tid | 4 ++-- core/ui/ViewToolbar/new-journal-here.tid | 4 ++-- core/ui/ViewToolbar/open-window.tid | 4 ++-- core/ui/ViewToolbar/permalink.tid | 4 ++-- core/ui/ViewToolbar/permaview.tid | 4 ++-- core/wiki/macros/export.tid | 4 ++-- 41 files changed, 87 insertions(+), 87 deletions(-) diff --git a/core/ui/ControlPanel/KeyboardShortcuts.tid b/core/ui/ControlPanel/KeyboardShortcuts.tid index 579c914e6..8aec8b3fc 100644 --- a/core/ui/ControlPanel/KeyboardShortcuts.tid +++ b/core/ui/ControlPanel/KeyboardShortcuts.tid @@ -119,7 +119,7 @@ caption: {{$:/language/ControlPanel/KeyboardShortcuts/Caption}} </td> </tr> <$set name="dropdownState" value={{$(dropdownStateTitle)$}}> -<$list filter="[<dropdownState>prefix[open]]" variable="listItem"> +<$list filter="[<dropdownState>match[open]]" variable="listItem"> <<shortcut-editor>> </$list> </$set> diff --git a/core/ui/EditToolbar/cancel.tid b/core/ui/EditToolbar/cancel.tid index a06e8690c..6b5aa56a1 100644 --- a/core/ui/EditToolbar/cancel.tid +++ b/core/ui/EditToolbar/cancel.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}} description: {{$:/language/Buttons/Cancel/Hint}} <$button message="tm-cancel-tiddler" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/cancel-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/EditToolbar/delete.tid b/core/ui/EditToolbar/delete.tid index f211998a9..c6ce6b823 100644 --- a/core/ui/EditToolbar/delete.tid +++ b/core/ui/EditToolbar/delete.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}} description: {{$:/language/Buttons/Delete/Hint}} <$button message="tm-delete-tiddler" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/delete-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Delete/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/EditToolbar/save.tid b/core/ui/EditToolbar/save.tid index 6b94691bf..8c5a81b01 100644 --- a/core/ui/EditToolbar/save.tid +++ b/core/ui/EditToolbar/save.tid @@ -10,10 +10,10 @@ description: {{$:/language/Buttons/Save/Hint}} <$action-deletetiddler $tiddler="$:/temp/newfieldname"/> <$action-deletetiddler $tiddler="$:/temp/newfieldvalue"/> <$action-sendmessage $message="tm-save-tiddler"/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/done-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Save/Caption}}/></span> </$list> </$button></$fieldmangler> diff --git a/core/ui/PageControls/advanced-search.tid b/core/ui/PageControls/advanced-search.tid index cb2923407..c2962c9c4 100644 --- a/core/ui/PageControls/advanced-search.tid +++ b/core/ui/PageControls/advanced-search.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/AdvancedSearch/Hint}} \define control-panel-button(class) <$button to="$:/AdvancedSearch" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/advanced-search-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/closeall.tid b/core/ui/PageControls/closeall.tid index 1aa4ba348..213c868df 100644 --- a/core/ui/PageControls/closeall.tid +++ b/core/ui/PageControls/closeall.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Capt description: {{$:/language/Buttons/CloseAll/Hint}} <$button message="tm-close-all-tiddlers" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/close-all-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/controlpanel.tid b/core/ui/PageControls/controlpanel.tid index c2a15a837..056f77263 100644 --- a/core/ui/PageControls/controlpanel.tid +++ b/core/ui/PageControls/controlpanel.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/ControlPanel/Hint}} \define control-panel-button(class) <$button to="$:/ControlPanel" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/options-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/encryption.tid b/core/ui/PageControls/encryption.tid index d6dc59e53..80d473152 100644 --- a/core/ui/PageControls/encryption.tid +++ b/core/ui/PageControls/encryption.tid @@ -5,20 +5,20 @@ description: {{$:/language/Buttons/Encryption/Hint}} <$reveal type="match" state="$:/isEncrypted" text="yes"> <$button message="tm-clear-password" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/locked-padlock}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span> </$list> </$button> </$reveal> <$reveal type="nomatch" state="$:/isEncrypted" text="yes"> <$button message="tm-set-password" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/unlocked-padlock}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/fold-all.tid b/core/ui/PageControls/fold-all.tid index f5ce98698..15dcca2df 100644 --- a/core/ui/PageControls/fold-all.tid +++ b/core/ui/PageControls/fold-all.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/FoldAll/Hint}} <$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-fold-all-tiddlers" $param=<<currentTiddler>> foldedStatePrefix="$:/state/folded/"/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]" variable="listItem"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem"> {{$:/core/images/fold-all-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/full-screen.tid b/core/ui/PageControls/full-screen.tid index 548f96895..efaeadb2e 100644 --- a/core/ui/PageControls/full-screen.tid +++ b/core/ui/PageControls/full-screen.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/ description: {{$:/language/Buttons/FullScreen/Hint}} <$button message="tm-full-screen" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/full-screen-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/home.tid b/core/ui/PageControls/home.tid index f06418ad2..946ac2361 100644 --- a/core/ui/PageControls/home.tid +++ b/core/ui/PageControls/home.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}} description: {{$:/language/Buttons/Home/Hint}} <$button message="tm-home" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/home-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Home/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/import.tid b/core/ui/PageControls/import.tid index de9a80916..dbf3121b7 100644 --- a/core/ui/PageControls/import.tid +++ b/core/ui/PageControls/import.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Import/Hint}} <div class="tc-file-input-wrapper"> <$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/import-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Import/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/language.tid b/core/ui/PageControls/language.tid index c0e7123df..5591a768b 100644 --- a/core/ui/PageControls/language.tid +++ b/core/ui/PageControls/language.tid @@ -8,14 +8,14 @@ $(languagePluginTitle)$/icon \end <span class="tc-popup-keep"> <$button popup=<<qualify "$:/state/popup/language">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> <span class="tc-image-button"> <$set name="languagePluginTitle" value={{$:/language}}> <$image source=<<flag-title>>/> </$set> </span> </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Language/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/manager.tid b/core/ui/PageControls/manager.tid index b2a7ed9bf..09b3b05fc 100644 --- a/core/ui/PageControls/manager.tid +++ b/core/ui/PageControls/manager.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Manager/Hint}} \define manager-button(class) <$button to="$:/Manager" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/list}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Manager/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/more-page-actions.tid b/core/ui/PageControls/more-page-actions.tid index a3b18201f..e74185824 100644 --- a/core/ui/PageControls/more-page-actions.tid +++ b/core/ui/PageControls/more-page-actions.tid @@ -7,10 +7,10 @@ description: {{$:/language/Buttons/More/Hint}} $:/config/PageControlButtons/Visibility/$(listItem)$ \end <$button popup=<<qualify "$:/state/popup/more">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/down-arrow}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/More/Caption}}/></span> </$list> </$button><$reveal state=<<qualify "$:/state/popup/more">> type="popup" position="below" animate="yes"> diff --git a/core/ui/PageControls/new-image.tid b/core/ui/PageControls/new-image.tid index 4e5adc877..71b401ad8 100644 --- a/core/ui/PageControls/new-image.tid +++ b/core/ui/PageControls/new-image.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Capt description: {{$:/language/Buttons/NewImage/Hint}} <$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-image-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/new-journal.tid b/core/ui/PageControls/new-journal.tid index 8f64c9376..797b65b49 100644 --- a/core/ui/PageControls/new-journal.tid +++ b/core/ui/PageControls/new-journal.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/NewJournal/Hint}} \define journalButton() <$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-journal-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/newtiddler.tid b/core/ui/PageControls/newtiddler.tid index efc502d5b..1896d827f 100644 --- a/core/ui/PageControls/newtiddler.tid +++ b/core/ui/PageControls/newtiddler.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption} description: {{$:/language/Buttons/NewTiddler/Hint}} <$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/palette.tid b/core/ui/PageControls/palette.tid index 344f7432b..d0a2ca60b 100644 --- a/core/ui/PageControls/palette.tid +++ b/core/ui/PageControls/palette.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Palette/Hint}} <span class="tc-popup-keep"> <$button popup=<<qualify "$:/state/popup/palette">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/palette}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Palette/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/print.tid b/core/ui/PageControls/print.tid index cc2709cd2..c0782ff33 100644 --- a/core/ui/PageControls/print.tid +++ b/core/ui/PageControls/print.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}} description: {{$:/language/Buttons/Print/Hint}} <$button message="tm-print" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/print-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Print/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/refresh.tid b/core/ui/PageControls/refresh.tid index 7ffd58936..b8bc437f8 100644 --- a/core/ui/PageControls/refresh.tid +++ b/core/ui/PageControls/refresh.tid @@ -4,10 +4,10 @@ caption: {{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption description: {{$:/language/Buttons/Refresh/Hint}} <$button message="tm-browser-refresh" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/refresh-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/savewiki.tid b/core/ui/PageControls/savewiki.tid index a299bcb88..e44c99276 100644 --- a/core/ui/PageControls/savewiki.tid +++ b/core/ui/PageControls/savewiki.tid @@ -8,10 +8,10 @@ description: {{$:/language/Buttons/SaveWiki/Hint}} <$action-sendmessage $message="tm-save-wiki" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/> </$wikify> <span class="tc-dirty-indicator"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/save-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span> </$list> </span> diff --git a/core/ui/PageControls/storyview.tid b/core/ui/PageControls/storyview.tid index acdb08d12..f84c0d2f9 100644 --- a/core/ui/PageControls/storyview.tid +++ b/core/ui/PageControls/storyview.tid @@ -8,12 +8,12 @@ $:/core/images/storyview-$(storyview)$ \end <span class="tc-popup-keep"> <$button popup=<<qualify "$:/state/popup/storyview">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> <$set name="storyview" value={{$:/view}}> <$transclude tiddler=<<icon>>/> </$set> </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/tag-button.tid b/core/ui/PageControls/tag-button.tid index 79615bdb2..808a3bfd6 100644 --- a/core/ui/PageControls/tag-button.tid +++ b/core/ui/PageControls/tag-button.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/TagManager/Hint}} \define control-panel-button(class) <$button to="$:/TagManager" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/tag-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/theme.tid b/core/ui/PageControls/theme.tid index e5574eabf..b859beb68 100644 --- a/core/ui/PageControls/theme.tid +++ b/core/ui/PageControls/theme.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Theme/Hint}} <span class="tc-popup-keep"> <$button popup=<<qualify "$:/state/popup/theme">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/theme-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Theme/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/timestamp.tid b/core/ui/PageControls/timestamp.tid index 28cfbd74e..b25a1af05 100644 --- a/core/ui/PageControls/timestamp.tid +++ b/core/ui/PageControls/timestamp.tid @@ -6,10 +6,10 @@ description: {{$:/language/Buttons/Timestamp/Hint}} <$reveal type="nomatch" state="$:/config/TimestampDisable" text="yes"> <$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>> <$action-setfield $tiddler="$:/config/TimestampDisable" $value="yes"/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/timestamp-on}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span> </$list> </$button> @@ -17,10 +17,10 @@ description: {{$:/language/Buttons/Timestamp/Hint}} <$reveal type="match" state="$:/config/TimestampDisable" text="yes"> <$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>> <$action-setfield $tiddler="$:/config/TimestampDisable" $value="no"/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/timestamp-off}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span> </$list> </$button> diff --git a/core/ui/PageControls/unfold-all.tid b/core/ui/PageControls/unfold-all.tid index 21185cb64..9f91bc288 100644 --- a/core/ui/PageControls/unfold-all.tid +++ b/core/ui/PageControls/unfold-all.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/UnfoldAll/Hint}} <$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-unfold-all-tiddlers" $param=<<currentTiddler>> foldedStatePrefix="$:/state/folded/"/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]" variable="listItem"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem"> {{$:/core/images/unfold-all-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/ViewToolbar/clone.tid b/core/ui/ViewToolbar/clone.tid index 5625c5a2a..dcba64486 100644 --- a/core/ui/ViewToolbar/clone.tid +++ b/core/ui/ViewToolbar/clone.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Clone/Hint}} \whitespace trim <$button message="tm-new-tiddler" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/clone-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/Clone/Caption}}/> diff --git a/core/ui/ViewToolbar/close-others.tid b/core/ui/ViewToolbar/close-others.tid index 55042d989..47bde5fdc 100644 --- a/core/ui/ViewToolbar/close-others.tid +++ b/core/ui/ViewToolbar/close-others.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/CloseOthers/Hint}} \whitespace trim <$button message="tm-close-other-tiddlers" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/close-others-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/CloseOthers/Caption}}/> diff --git a/core/ui/ViewToolbar/close.tid b/core/ui/ViewToolbar/close.tid index 49695a77a..bd1fbe0ee 100644 --- a/core/ui/ViewToolbar/close.tid +++ b/core/ui/ViewToolbar/close.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Close/Hint}} \whitespace trim <$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/close-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text={{$:/language/Buttons/Close/Caption}}/> </span> diff --git a/core/ui/ViewToolbar/edit.tid b/core/ui/ViewToolbar/edit.tid index fd299c173..9d12243b2 100644 --- a/core/ui/ViewToolbar/edit.tid +++ b/core/ui/ViewToolbar/edit.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Edit/Hint}} \whitespace trim <$button message="tm-edit-tiddler" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/edit-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/Edit/Caption}}/> diff --git a/core/ui/ViewToolbar/fold-others.tid b/core/ui/ViewToolbar/fold-others.tid index 55c31c721..290a03ac3 100644 --- a/core/ui/ViewToolbar/fold-others.tid +++ b/core/ui/ViewToolbar/fold-others.tid @@ -6,10 +6,10 @@ description: {{$:/language/Buttons/FoldOthers/Hint}} \whitespace trim <$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-fold-other-tiddlers" $param=<<currentTiddler>> foldedStatePrefix="$:/state/folded/"/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]" variable="listItem"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem"> {{$:/core/images/fold-others-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/FoldOthers/Caption}}/> diff --git a/core/ui/ViewToolbar/fold.tid b/core/ui/ViewToolbar/fold.tid index e35e58663..a392b4a77 100644 --- a/core/ui/ViewToolbar/fold.tid +++ b/core/ui/ViewToolbar/fold.tid @@ -7,10 +7,10 @@ description: {{$:/language/Buttons/Fold/Hint}} <$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" default="show"> <$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-fold-tiddler" $param=<<currentTiddler>> foldedState=<<folded-state>>/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]" variable="listItem"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem"> {{$:/core/images/fold-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/Fold/Caption}}/> @@ -21,10 +21,10 @@ description: {{$:/language/Buttons/Fold/Hint}} <$reveal type="match" stateTitle=<<folded-state>> text="hide" default="show"> <$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-fold-tiddler" $param=<<currentTiddler>> foldedState=<<folded-state>>/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]" variable="listItem"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem"> {{$:/core/images/unfold-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/Unfold/Caption}}/> diff --git a/core/ui/ViewToolbar/info.tid b/core/ui/ViewToolbar/info.tid index a5dd9afce..3639aac09 100644 --- a/core/ui/ViewToolbar/info.tid +++ b/core/ui/ViewToolbar/info.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Info/Hint}} \whitespace trim \define button-content() -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/info-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text={{$:/language/Buttons/Info/Caption}}/> </span> diff --git a/core/ui/ViewToolbar/more-tiddler-actions.tid b/core/ui/ViewToolbar/more-tiddler-actions.tid index b344dc4d1..9e9bd4528 100644 --- a/core/ui/ViewToolbar/more-tiddler-actions.tid +++ b/core/ui/ViewToolbar/more-tiddler-actions.tid @@ -8,10 +8,10 @@ description: {{$:/language/Buttons/More/Hint}} $:/config/ViewToolbarButtons/Visibility/$(listItem)$ \end <$button popup=<<qualify "$:/state/popup/more">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/down-arrow}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/More/Caption}}/> diff --git a/core/ui/ViewToolbar/new-here.tid b/core/ui/ViewToolbar/new-here.tid index 7fd7bf54f..7b3f96c32 100644 --- a/core/ui/ViewToolbar/new-here.tid +++ b/core/ui/ViewToolbar/new-here.tid @@ -11,10 +11,10 @@ description: {{$:/language/Buttons/NewHere/Hint}} \end \define newHereButton() <$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-here-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text={{$:/language/Buttons/NewHere/Caption}}/> </span> diff --git a/core/ui/ViewToolbar/new-journal-here.tid b/core/ui/ViewToolbar/new-journal-here.tid index 54291a6f2..e41fd4063 100644 --- a/core/ui/ViewToolbar/new-journal-here.tid +++ b/core/ui/ViewToolbar/new-journal-here.tid @@ -11,10 +11,10 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}} <$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>> <$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>"""> <$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalButtonTags>>/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-journal-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text={{$:/language/Buttons/NewJournalHere/Caption}}/> </span> diff --git a/core/ui/ViewToolbar/open-window.tid b/core/ui/ViewToolbar/open-window.tid index b3f982f26..b1eb46f9b 100644 --- a/core/ui/ViewToolbar/open-window.tid +++ b/core/ui/ViewToolbar/open-window.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/OpenWindow/Hint}} \whitespace trim <$button message="tm-open-window" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/open-window}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/OpenWindow/Caption}}/> diff --git a/core/ui/ViewToolbar/permalink.tid b/core/ui/ViewToolbar/permalink.tid index b6ea2c0c8..8a53ce11f 100644 --- a/core/ui/ViewToolbar/permalink.tid +++ b/core/ui/ViewToolbar/permalink.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Permalink/Hint}} \whitespace trim <$button message="tm-permalink" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/permalink-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/Permalink/Caption}}/> diff --git a/core/ui/ViewToolbar/permaview.tid b/core/ui/ViewToolbar/permaview.tid index 523bac128..ee95963b1 100644 --- a/core/ui/ViewToolbar/permaview.tid +++ b/core/ui/ViewToolbar/permaview.tid @@ -5,10 +5,10 @@ description: {{$:/language/Buttons/Permaview/Hint}} \whitespace trim <$button message="tm-permaview" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/permaview-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/language/Buttons/Permaview/Caption}}/> diff --git a/core/wiki/macros/export.tid b/core/wiki/macros/export.tid index 089cc870e..567f8ff95 100644 --- a/core/wiki/macros/export.tid +++ b/core/wiki/macros/export.tid @@ -7,10 +7,10 @@ $baseFilename$$(extension)$ \define exportButton(exportFilter:"[!is[system]sort[title]]",lingoBase,baseFilename:"tiddlers") <span class="tc-popup-keep"><$button popup=<<qualify "$:/state/popup/export">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/export-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$lingoBase$Caption}}/></span> </$list> </$button></span><$reveal state=<<qualify "$:/state/popup/export">> type="popup" position="below" animate="yes"> From 3afaa9de9aaae7654c1d03ddc22ee97724cbb159 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 31 Jul 2019 21:36:12 +0100 Subject: [PATCH 0244/2376] Add support for anchored searches --- core/modules/filters/search.js | 1 + core/modules/wiki.js | 10 ++++++---- editions/test/tiddlers/tests/test-filters.js | 1 + editions/tw5.com/tiddlers/filters/search.tid | 3 ++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/core/modules/filters/search.js b/core/modules/filters/search.js index 1e59deb63..adcb076a0 100644 --- a/core/modules/filters/search.js +++ b/core/modules/filters/search.js @@ -43,6 +43,7 @@ exports.search = function(source,operator,options) { caseSensitive: hasFlag("casesensitive"), literal: hasFlag("literal"), whitespace: hasFlag("whitespace"), + anchored: hasFlag("anchored"), regexp: hasFlag("regexp"), words: hasFlag("words") }); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 4d1f938e7..3e5687638 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1065,6 +1065,7 @@ Options available: invert: If true returns tiddlers that do not contain the specified string caseSensitive: If true forces a case sensitive search field: If specified, restricts the search to the specified field, or an array of field names + anchored: If true, forces all but regexp searches to be anchored to the start of text excludeField: If true, the field options are inverted to specify the fields that are not to be searched The search mode is determined by the first of these boolean flags to be true literal: searches for literal string @@ -1079,12 +1080,13 @@ exports.search = function(text,options) { invert = !!options.invert; // Convert the search string into a regexp for each term var terms, searchTermsRegExps, - flags = options.caseSensitive ? "" : "i"; + flags = options.caseSensitive ? "" : "i", + anchor = options.anchored ? "^" : ""; if(options.literal) { if(text.length === 0) { searchTermsRegExps = null; } else { - searchTermsRegExps = [new RegExp("(" + $tw.utils.escapeRegExp(text) + ")",flags)]; + searchTermsRegExps = [new RegExp("(" + anchor + $tw.utils.escapeRegExp(text) + ")",flags)]; } } else if(options.whitespace) { terms = []; @@ -1093,7 +1095,7 @@ exports.search = function(text,options) { terms.push($tw.utils.escapeRegExp(term)); } }); - searchTermsRegExps = [new RegExp("(" + terms.join("\\s+") + ")",flags)]; + searchTermsRegExps = [new RegExp("(" + anchor + terms.join("\\s+") + ")",flags)]; } else if(options.regexp) { try { searchTermsRegExps = [new RegExp("(" + text + ")",flags)]; @@ -1108,7 +1110,7 @@ exports.search = function(text,options) { } else { searchTermsRegExps = []; for(t=0; t<terms.length; t++) { - searchTermsRegExps.push(new RegExp("(" + $tw.utils.escapeRegExp(terms[t]) + ")",flags)); + searchTermsRegExps.push(new RegExp("(" + anchor + $tw.utils.escapeRegExp(terms[t]) + ")",flags)); } } } diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index ae6f66de7..ab544c40f 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -313,6 +313,7 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[search:modifier:regexp[(d|bl)o(ggs|e)]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[search:-modifier,authors:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,Tiddler Three"); expect(wiki.filterTiddlers("[search:*:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[search:text:anchored[the]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler"); }); it("should yield search results that have search tokens spread across different fields", function() { diff --git a/editions/tw5.com/tiddlers/filters/search.tid b/editions/tw5.com/tiddlers/filters/search.tid index 9da7f8189..3aba89bf1 100644 --- a/editions/tw5.com/tiddlers/filters/search.tid +++ b/editions/tw5.com/tiddlers/filters/search.tid @@ -1,5 +1,5 @@ created: 20140410103123179 -modified: 20181025082022690 +modified: 20190731212738712 tags: [[Filter Operators]] [[Common Operators]] [[Field Operators]] [[Negatable Operators]] title: search Operator type: text/vnd.tiddlywiki @@ -40,5 +40,6 @@ The available flags are: ** ''regexp'': treats the search string as a regular expression. Note that the ''regexp'' option obviates the need for the older <<.olink regexp>> operator. ** ''words'': (the default) treats the search string as a list of tokens separated by whitespace, and matches if all of the tokens appear in the string (regardless of ordering and whether there is other text in between) * ''casesensitive'': if present, this flag forces a case-sensitive match, where upper and lower case letters are considered different. By default, upper and lower case letters are considered identical for matching purposes. +* ''anchored'': <<.from-version "5.1.20">> anchors the search to the start of the string (applies to ''whitespace'', ''literal'' and ''words'' modes) <<.operator-examples "search">> From b5653babdf85ad894ba3dd3acf4bb063dd5ffa94 Mon Sep 17 00:00:00 2001 From: Bimba Laszlo <bimbalaszlo@gmail.com> Date: Wed, 31 Jul 2019 22:38:52 +0200 Subject: [PATCH 0245/2376] Add GitLab saver, apply common lingo to Git savers (#3931) * Transform GitHub saver to work with GitLab as well You can choose which provider you want to use, the data is given in the same place. I tried to avoid code duplication, so service providers' unique properties are in separate files, the settings of the selected provider are loaded. In two fields I am not sure that it fits into the current structure: * module-type: gitservice Which module is a `gitservice` type, it will be listed in the drop-down menu. * default-api-url: https://gitlab.com/api/v4 The default URL to access the provider's API. This is just a sketch, not a final version, suggestions for modification are welcome! * Rename saver from GitHub to GitService, update docs * Split GitHub and GitLab to separate savers, apply common lingo Sadly, it doesn't seem to make much sense to search for common parts in the code, because there might be a Git service that is very different from the GitHub API (such as BitBucket). Therefore, I feel that Git savers are not able to share other than the translations. I deleted the defaults values from the translations and set it to the text entry because they should not depend on the translations. * Add more information about the password field It is not clear how to create a personal access token, thus added a link to the help pages. In addition, GitLab only accepts personal access token, GitHub also accepts the password, so I made this clear. * Extract commit message to lingo * Fix indentation * Use improved base64 encoder Fix conflict with a06acc4eb8ade26cbb17b9f5911876bac1da7715 --- core/language/en-GB/ControlPanel.multids | 21 +-- core/modules/savers/github.js | 16 +-- core/modules/savers/gitlab.js | 120 ++++++++++++++++++ core/ui/ControlPanel/Saving/GitHub.tid | 11 +- core/ui/ControlPanel/Saving/GitLab.tid | 16 +++ .../tiddlers/saving/Saving to GitHub.tid | 24 ---- .../saving/Saving to a Git service.tid | 25 ++++ 7 files changed, 187 insertions(+), 46 deletions(-) create mode 100644 core/modules/savers/gitlab.js create mode 100644 core/ui/ControlPanel/Saving/GitLab.tid delete mode 100644 editions/tw5.com/tiddlers/saving/Saving to GitHub.tid create mode 100644 editions/tw5.com/tiddlers/saving/Saving to a Git service.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index c81381aea..4ccb30787 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -91,15 +91,18 @@ Saving/DownloadSaver/Hint: These settings apply to the HTML5-compatible download Saving/General/Caption: General Saving/General/Hint: These settings apply to all the loaded savers Saving/Hint: Settings used for saving the entire TiddlyWiki as a single file via a saver module -Saving/GitHub/Branch: Target branch for saving (defaults to `master`) -Saving/GitHub/Caption: ~GitHub Saver -Saving/GitHub/Description: These settings are only used when saving to ~GitHub -Saving/GitHub/ServerURL: Server URL (defaults to `https://api.github.com`) -Saving/GitHub/Filename: Filename of target file (e.g. `index.html`) -Saving/GitHub/Password: Password, OAUTH token, or personal access token -Saving/GitHub/Path: Path to target file (e.g. `/wiki/`) -Saving/GitHub/Repo: Target repository (e.g. `Jermolene/TiddlyWiki5`) -Saving/GitHub/UserName: Username +Saving/GitService/Branch: Target branch for saving +Saving/GitService/CommitMessage: Saved by TiddlyWiki +Saving/GitService/Description: These settings are only used when saving to <<service-name>> +Saving/GitService/Filename: Filename of target file (e.g. `index.html`) +Saving/GitService/Path: Path to target file (e.g. `/wiki/`) +Saving/GitService/Repo: Target repository (e.g. `Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: Server API URL +Saving/GitService/UserName: Username +Saving/GitService/GitHub/Caption: ~GitHub Saver +Saving/GitService/GitHub/Password: Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details) +Saving/GitService/GitLab/Caption: ~GitLab Saver +Saving/GitService/GitLab/Password: Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html for details]] for details) Saving/TiddlySpot/Advanced/Heading: Advanced Settings Saving/TiddlySpot/BackupDir: Backup Directory Saving/TiddlySpot/Backups: Backups diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index 892ba4847..d7f1b06d8 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -9,7 +9,7 @@ Saves wiki by pushing a commit to the GitHub v3 REST API (function(){ /*jslint node: true, browser: true */ -/*global $tw: false */ +/*global $tw: true */ "use strict"; /* @@ -57,7 +57,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { callback: function(err,getResponseDataJson,xhr) { var getResponseData,sha = ""; if(err && xhr.status !== 404) { - return callback(err); + return callback(err); } if(xhr.status !== 404) { getResponseData = JSON.parse(getResponseDataJson); @@ -65,14 +65,14 @@ GitHubSaver.prototype.save = function(text,method,callback) { if(details.name === filename) { sha = details.sha; } - }); + }); } var data = { - message: "Saved by TiddlyWiki", - content: $tw.utils.base64Encode(text), - branch: branch, - sha: sha - }; + message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"), + content: $tw.utils.base64Encode(text), + branch: branch, + sha: sha + }; // Perform a PUT request to save the file $tw.utils.httpRequest({ url: uri + filename, diff --git a/core/modules/savers/gitlab.js b/core/modules/savers/gitlab.js new file mode 100644 index 000000000..fcb3b51e8 --- /dev/null +++ b/core/modules/savers/gitlab.js @@ -0,0 +1,120 @@ +/*\ +title: $:/core/modules/savers/gitlab.js +type: application/javascript +module-type: saver + +Saves wiki by pushing a commit to the GitLab REST API + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: true */ +"use strict"; + +/* +Select the appropriate saver module and set it up +*/ +var GitLabSaver = function(wiki) { + this.wiki = wiki; +}; + +GitLabSaver.prototype.save = function(text,method,callback) { + /* See https://docs.gitlab.com/ee/api/repository_files.html */ + var self = this, + username = this.wiki.getTiddlerText("$:/GitLab/Username"), + password = $tw.utils.getPassword("gitlab"), + repo = this.wiki.getTiddlerText("$:/GitLab/Repo"), + path = this.wiki.getTiddlerText("$:/GitLab/Path"), + filename = this.wiki.getTiddlerText("$:/GitLab/Filename"), + branch = this.wiki.getTiddlerText("$:/GitLab/Branch") || "master", + endpoint = this.wiki.getTiddlerText("$:/GitLab/ServerURL") || "https://gitlab.com/api/v4", + headers = { + "Content-Type": "application/json;charset=UTF-8", + "Private-Token": password + }; + // Bail if we don't have everything we need + if(!username || !password || !repo || !path || !filename) { + return false; + } + // Make sure the path start and ends with a slash + if(path.substring(0,1) !== "/") { + path = "/" + path; + } + if(path.substring(path.length - 1) !== "/") { + path = path + "/"; + } + // Compose the base URI + var uri = endpoint + "/projects/" + encodeURIComponent(repo) + "/repository/"; + // Perform a get request to get the details (inc shas) of files in the same path as our file + $tw.utils.httpRequest({ + url: uri + "tree/" + encodeURIComponent(path.replace(/^\/+|\/$/g, '')), + type: "GET", + headers: headers, + data: { + ref: branch + }, + callback: function(err,getResponseDataJson,xhr) { + var getResponseData,sha = ""; + if(err && xhr.status !== 404) { + return callback(err); + } + var requestType = "POST"; + if(xhr.status !== 404) { + getResponseData = JSON.parse(getResponseDataJson); + $tw.utils.each(getResponseData,function(details) { + if(details.name === filename) { + requestType = "PUT"; + sha = details.sha; + } + }); + } + var data = { + commit_message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"), + content: $tw.utils.base64Encode(text), + branch: branch, + sha: sha + }; + // Perform a request to save the file + $tw.utils.httpRequest({ + url: uri + "files/" + encodeURIComponent(path.replace(/^\/+/, '') + filename), + type: requestType, + headers: headers, + data: JSON.stringify(data), + callback: function(err,putResponseDataJson,xhr) { + if(err) { + return callback(err); + } + var putResponseData = JSON.parse(putResponseDataJson); + callback(null); + } + }); + } + }); + return true; +}; + +/* +Information about this saver +*/ +GitLabSaver.prototype.info = { + name: "gitlab", + priority: 2000, + capabilities: ["save", "autosave"] +}; + +/* +Static method that returns true if this saver is capable of working +*/ +exports.canSave = function(wiki) { + return true; +}; + +/* +Create an instance of this saver +*/ +exports.create = function(wiki) { + return new GitLabSaver(wiki); +}; + +})(); diff --git a/core/ui/ControlPanel/Saving/GitHub.tid b/core/ui/ControlPanel/Saving/GitHub.tid index 5e2bc7853..88d6f947f 100644 --- a/core/ui/ControlPanel/Saving/GitHub.tid +++ b/core/ui/ControlPanel/Saving/GitHub.tid @@ -1,15 +1,16 @@ title: $:/core/ui/ControlPanel/Saving/GitHub tags: $:/tags/ControlPanel/Saving -caption: {{$:/language/ControlPanel/Saving/GitHub/Caption}} +caption: {{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}} -\define lingo-base() $:/language/ControlPanel/Saving/GitHub/ +\define lingo-base() $:/language/ControlPanel/Saving/GitService/ +\define service-name() ~GitHub <<lingo Description>> |<<lingo UserName>> |<$edit-text tiddler="$:/GitHub/Username" default="" tag="input"/> | -|<<lingo Password>> |<$password name="github"/> | +|<<lingo GitHub/Password>> |<$password name="github"/> | |<<lingo Repo>> |<$edit-text tiddler="$:/GitHub/Repo" default="" tag="input"/> | -|<<lingo Branch>> |<$edit-text tiddler="$:/GitHub/Branch" default="" tag="input"/> | +|<<lingo Branch>> |<$edit-text tiddler="$:/GitHub/Branch" default="master" tag="input"/> | |<<lingo Path>> |<$edit-text tiddler="$:/GitHub/Path" default="" tag="input"/> | |<<lingo Filename>> |<$edit-text tiddler="$:/GitHub/Filename" default="" tag="input"/> | -|<<lingo ServerURL>> |<$edit-text tiddler="$:/GitHub/ServerURL" default="" tag="input"/> | +|<<lingo ServerURL>> |<$edit-text tiddler="$:/GitHub/ServerURL" default="https://api.github.com" tag="input"/> | \ No newline at end of file diff --git a/core/ui/ControlPanel/Saving/GitLab.tid b/core/ui/ControlPanel/Saving/GitLab.tid new file mode 100644 index 000000000..dbe198824 --- /dev/null +++ b/core/ui/ControlPanel/Saving/GitLab.tid @@ -0,0 +1,16 @@ +title: $:/core/ui/ControlPanel/Saving/GitLab +tags: $:/tags/ControlPanel/Saving +caption: {{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}} + +\define lingo-base() $:/language/ControlPanel/Saving/GitService/ +\define service-name() ~GitLab + +<<lingo Description>> + +|<<lingo UserName>> |<$edit-text tiddler="$:/GitLab/Username" default="" tag="input"/> | +|<<lingo GitLab/Password>> |<$password name="gitlab"/> | +|<<lingo Repo>> |<$edit-text tiddler="$:/GitLab/Repo" default="" tag="input"/> | +|<<lingo Branch>> |<$edit-text tiddler="$:/GitLab/Branch" default="master" tag="input"/> | +|<<lingo Path>> |<$edit-text tiddler="$:/GitLab/Path" default="" tag="input"/> | +|<<lingo Filename>> |<$edit-text tiddler="$:/GitLab/Filename" default="" tag="input"/> | +|<<lingo ServerURL>> |<$edit-text tiddler="$:/GitLab/ServerURL" default="https://gitlab.com/api/v4" tag="input"/> | \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/saving/Saving to GitHub.tid b/editions/tw5.com/tiddlers/saving/Saving to GitHub.tid deleted file mode 100644 index a3962e52e..000000000 --- a/editions/tw5.com/tiddlers/saving/Saving to GitHub.tid +++ /dev/null @@ -1,24 +0,0 @@ -created: 20190408173002622 -modified: 20190408173002622 -tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera Safari Windows -title: Saving to GitHub -type: text/vnd.tiddlywiki -delivery: Service -method: save -caption: GitHub Saver -description: Save changes directly to a GitHub repository - -TiddlyWiki can save changes directly to a GitHub repository in the single file configuration. - -Saving to GitHub is configured in the [[$:/ControlPanel]] in the ''~GitHub Saver'' tab under the ''Saving'' tab. The following settings are supported: - -* ''Username'' - (mandatory) the username for the GitHub account used for saving changes -* ''Password'' - (mandatory) the password, OAUTH token or personal access token for the specified account. Note that GitHub permits [[several different mechanisms|https://developer.github.com/v3/#authentication]] for authentication -* ''Repository'' - (mandatory) the name of the GitHub repository. Both the owner name and the repository name must be specified. For example `Jermolene/TiddlyWiki5` -* ''Branch'' - (optional) the name of the branch to be used within the GitHub repository. Defaults to `master` -* ''Path'' - (optional) the path to the target file. Defaults to `/` -* ''Filename'' - (mandatory) the filename of the target file - -Notes - -* The GitHub password is stored persistently in browser local storage. Be sure to clear the password if using a shared machine. Using a [[personal access token|]] for authentication offers an extra layer of security: if the access token is accidentally exposed it can be revoked without needing to reset the account password diff --git a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid new file mode 100644 index 000000000..f7ad41918 --- /dev/null +++ b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid @@ -0,0 +1,25 @@ +created: 20190408173002622 +modified: 20190408173002622 +tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera Safari Windows +title: Saving to a Git service +type: text/vnd.tiddlywiki +delivery: Service +method: save +caption: Git Service Saver +description: Save changes directly to a Git repository (on GitHub, GitLab) + +TiddlyWiki can save changes directly to a GitHub repository in the single file configuration. + +Saving to a Git service is configured in the [[$:/ControlPanel]] in the ''Git Service Saver'' tab under the ''Saving'' tab. The following settings are supported: + +* ''Type'' - (mandatory) the type of the service (e.g. GitHub, GitLab) +* ''Username'' - (mandatory) the username for the Git service account used for saving changes +* ''Password'' - (mandatory) the password, OAUTH token or personal access token for the specified account. Note that GitHub permits [[several different mechanisms|https://developer.github.com/v3/#authentication]] for authentication +* ''Repository'' - (mandatory) the name of the Git repository. Both the owner name and the repository name must be specified. For example `Jermolene/TiddlyWiki5` +* ''Branch'' - (optional) the name of the branch to be used within the Git repository. Defaults to `master` +* ''Path'' - (optional) the path to the target file. Defaults to `/` +* ''Filename'' - (mandatory) the filename of the target file + +Notes + +* The Git service password is stored persistently in browser local storage. Be sure to clear the password if using a shared machine. Using a [[personal access token|]] for authentication offers an extra layer of security: if the access token is accidentally exposed it can be revoked without needing to reset the account password From 0a6870656f791f4c3e879ae89c0f22eea437fd39 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 31 Jul 2019 21:39:52 +0100 Subject: [PATCH 0246/2376] Fix typo in b5653babd --- core/modules/savers/github.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index d7f1b06d8..08f809d19 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -9,7 +9,7 @@ Saves wiki by pushing a commit to the GitHub v3 REST API (function(){ /*jslint node: true, browser: true */ -/*global $tw: true */ +/*global $tw: false */ "use strict"; /* From 2d4831f9204bc3e854d8fdbf4241b18ed94cc06d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 1 Aug 2019 18:32:39 +0200 Subject: [PATCH 0247/2376] Tag-picker: delete double-definition of tag-actions (#4139) --- core/wiki/macros/tag-picker.tid | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 039a12140..52b19bb4b 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -6,11 +6,6 @@ tags: $:/tags/Macro <$action-deletetiddler $tiddler="$:/temp/NewTagName"/> \end -\define add-tag-actions() -<$action-sendmessage $message="tm-add-tag" $param={{$:/temp/NewTagName}}/> -<$action-deletetiddler $tiddler="$:/temp/NewTagName"/> -\end - \define tag-button() <$button class="tc-btn-invisible" tag="a"> $(actions)$ From 8db893b9c99744e02797aa1837657f33b9222d62 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 09:47:47 +0200 Subject: [PATCH 0248/2376] Add pop storyview for pagecontrols (#4145) this PR adds the pop storyview to the page-control buttons in the sidebar --- core/ui/PageControls.tid | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/ui/PageControls.tid b/core/ui/PageControls.tid index b12fc5203..31df286fe 100644 --- a/core/ui/PageControls.tid +++ b/core/ui/PageControls.tid @@ -1,15 +1,17 @@ title: $:/core/ui/PageTemplate/pagecontrols +\whitespace trim \define config-title() $:/config/PageControlButtons/Visibility/$(listItem)$ \end <div class="tc-page-controls"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem"> -<$reveal type="nomatch" state=<<config-title>> text="hide"> +<$set name="hidden" value=<<config-title>>> +<$list filter="[<hidden>!text[hide]]" storyview="pop"> <$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"> <$transclude tiddler=<<listItem>> mode="inline"/> </$set> -</$reveal> +</$list> +</$set> </$list> </div> - From 64fe260f4dc19c0891cc09ca6535e01075b7dd94 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 09:49:06 +0200 Subject: [PATCH 0249/2376] Fix: correct handling of tc-popup-keep when cancelling ... (#4144) ... popups through focussing inputs --- core/modules/utils/dom/popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index a62bf8975..2b615f411 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -158,7 +158,7 @@ Popup.prototype.detectInputWithinPopup = function(node) { for(var i=0; i<this.popups.length; i++) { var popup = (this.popups[i] && this.popups[i].domNode) ? this.popups[i].domNode : null; while(node && popup) { - if(node === popup || (node.classList && node.classList.contains("tc-popup-keep"))) { + if(node === popup || (node.classList && (node.classList.contains("tc-popup-keep") || node.classList.contains("tc-popup-handle")))) { withinPopup = true; } node = node.parentNode; From fab67a463b7c0287a3b4d1183fbe9494217691eb Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 09:51:16 +0200 Subject: [PATCH 0250/2376] Pop storyview: fix bug where targetElement is null (#4143) --- core/modules/storyviews/pop.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/storyviews/pop.js b/core/modules/storyviews/pop.js index f720785c6..d0592cf18 100644 --- a/core/modules/storyviews/pop.js +++ b/core/modules/storyviews/pop.js @@ -72,7 +72,7 @@ PopStoryView.prototype.remove = function(widget) { var targetElement = widget.findFirstDomNode(), duration = $tw.utils.getAnimationDuration(), removeElement = function() { - if(targetElement.parentNode) { + if(targetElement && targetElement.parentNode) { widget.removeChildDomNodes(); } }; From 9a2de11db11cf6feb6d71c1d8b27b4d254244b3b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 10:03:51 +0200 Subject: [PATCH 0251/2376] Pop storyview for topright and topleft bar (#4146) * pop storyview for topright bar * pop storyview for topleft bar --- core/ui/PageTemplate/topleftbar.tid | 2 +- core/ui/PageTemplate/toprightbar.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/PageTemplate/topleftbar.tid b/core/ui/PageTemplate/topleftbar.tid index 609c03a20..2362db869 100644 --- a/core/ui/PageTemplate/topleftbar.tid +++ b/core/ui/PageTemplate/topleftbar.tid @@ -3,7 +3,7 @@ tags: $:/tags/PageTemplate <span class="tc-topbar tc-topbar-left"> -<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]" variable="listItem"> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]" variable="listItem" storyview="pop"> <$transclude tiddler=<<listItem>> mode="inline"/> diff --git a/core/ui/PageTemplate/toprightbar.tid b/core/ui/PageTemplate/toprightbar.tid index 427006a52..03629fff2 100644 --- a/core/ui/PageTemplate/toprightbar.tid +++ b/core/ui/PageTemplate/toprightbar.tid @@ -3,7 +3,7 @@ tags: $:/tags/PageTemplate <span class="tc-topbar tc-topbar-right"> -<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]" variable="listItem"> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]" variable="listItem" storyview="pop"> <$transclude tiddler=<<listItem>> mode="inline"/> From 394725f00cd8f38089d2840aa026d72c88627bff Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 2 Aug 2019 09:16:36 +0100 Subject: [PATCH 0252/2376] Fix edit-bitmap crash with missing tiddlers Fixes #4141 --- core/modules/widgets/edit-bitmap.js | 33 +++++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/core/modules/widgets/edit-bitmap.js b/core/modules/widgets/edit-bitmap.js index 0a7ecd0ef..0e72b5df1 100644 --- a/core/modules/widgets/edit-bitmap.js +++ b/core/modules/widgets/edit-bitmap.js @@ -14,7 +14,8 @@ Edit-bitmap widget // Default image sizes var DEFAULT_IMAGE_WIDTH = 600, - DEFAULT_IMAGE_HEIGHT = 370; + DEFAULT_IMAGE_HEIGHT = 370, + DEFAULT_IMAGE_TYPE = "image/png"; // Configuration tiddlers var LINE_WIDTH_TITLE = "$:/config/BitmapEditor/LineWidth", @@ -154,7 +155,13 @@ EditBitmapWidget.prototype.loadCanvas = function() { self.refreshToolbar(); }; // Get the current bitmap into an image object - currImage.src = "data:" + tiddler.fields.type + ";base64," + tiddler.fields.text; + if(tiddler && tiddler.fields.type && tiddler.fields.text) { + currImage.src = "data:" + tiddler.fields.type + ";base64," + tiddler.fields.text; + } else { + currImage.width = DEFAULT_IMAGE_WIDTH; + currImage.height = DEFAULT_IMAGE_HEIGHT; + currImage.onerror(); + } }; EditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) { @@ -319,18 +326,16 @@ EditBitmapWidget.prototype.strokeEnd = function() { }; EditBitmapWidget.prototype.saveChanges = function() { - var tiddler = this.wiki.getTiddler(this.editTitle); - if(tiddler) { - // data URIs look like "data:<type>;base64,<text>" - var dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type), - posColon = dataURL.indexOf(":"), - posSemiColon = dataURL.indexOf(";"), - posComma = dataURL.indexOf(","), - type = dataURL.substring(posColon+1,posSemiColon), - text = dataURL.substring(posComma+1); - var update = {type: type, text: text}; - this.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields())); - } + var tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE}); + // data URIs look like "data:<type>;base64,<text>" + var dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type), + posColon = dataURL.indexOf(":"), + posSemiColon = dataURL.indexOf(";"), + posComma = dataURL.indexOf(","), + type = dataURL.substring(posColon+1,posSemiColon), + text = dataURL.substring(posComma+1); + var update = {type: type, text: text}; + this.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields())); }; exports["edit-bitmap"] = EditBitmapWidget; From 17711657b6028a177c8aef97f7a0a1c084d65436 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 2 Aug 2019 14:27:58 +0100 Subject: [PATCH 0253/2376] Add then and else operators Fixes #4147 --- core/modules/filters/else.js | 30 +++++++++++++++++++ core/modules/filters/then.js | 26 ++++++++++++++++ editions/test/tiddlers/tests/test-filters.js | 9 ++++++ .../filters/Conditional Operators.tid | 24 +++++++++++++++ .../tiddlers/filters/else Operator.tid | 15 ++++++++++ .../examples/else Operator (Examples).tid | 9 ++++++ .../examples/then Operator (Examples).tid | 9 ++++++ .../tiddlers/filters/then Operator.tid | 15 ++++++++++ 8 files changed, 137 insertions(+) create mode 100644 core/modules/filters/else.js create mode 100644 core/modules/filters/then.js create mode 100644 editions/tw5.com/tiddlers/filters/Conditional Operators.tid create mode 100644 editions/tw5.com/tiddlers/filters/else Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/else Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/then Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/then Operator.tid diff --git a/core/modules/filters/else.js b/core/modules/filters/else.js new file mode 100644 index 000000000..c3829371e --- /dev/null +++ b/core/modules/filters/else.js @@ -0,0 +1,30 @@ +/*\ +title: $:/core/modules/filters/else.js +type: application/javascript +module-type: filteroperator + +Filter operator for replacing an empty input list with a constant, passing a non-empty input list straight through + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.else = function(source,operator,options) { + var results = []; + source(function(tiddler,title) { + results.push(title); + }); + if(results.length === 0) { + return [operator.operand]; + } else { + return results; + } +}; + +})(); diff --git a/core/modules/filters/then.js b/core/modules/filters/then.js new file mode 100644 index 000000000..994775c08 --- /dev/null +++ b/core/modules/filters/then.js @@ -0,0 +1,26 @@ +/*\ +title: $:/core/modules/filters/then.js +type: application/javascript +module-type: filteroperator + +Filter operator for replacing any titles with a constant + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.then = function(source,operator,options) { + var results = []; + source(function(tiddler,title) { + results.push(operator.operand); + }); + return results; +}; + +})(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index ab544c40f..13e939c4d 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -128,6 +128,15 @@ function setupWiki(wikiOptions) { // Our tests function runTests(wiki) { + it("should handle the then and else operators", function() { + expect(wiki.filterTiddlers("[modifier[JoeBloggs]then[JaneBloggs]]").join(",")).toBe("JaneBloggs"); + expect(wiki.filterTiddlers("[!modifier[JoeBloggs]then[JaneBloggs]]").join(",")).toBe("JaneBloggs,JaneBloggs,JaneBloggs,JaneBloggs,JaneBloggs"); + expect(wiki.filterTiddlers("[modifier[DaveBloggs]then[JaneBloggs]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[modifier[JoeBloggs]else[JaneBloggs]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!modifier[JoeBloggs]else[JaneBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[modifier[DaveBloggs]else[JaneBloggs]]").join(",")).toBe("JaneBloggs"); + }); + it("should handle the ~ prefix", function() { expect(wiki.filterTiddlers("[modifier[JoeBloggs]] ~[[No such tiddler]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[modifier[JaneBloggs]] ~[[No such tiddler]]").join(",")).toBe("No such tiddler"); diff --git a/editions/tw5.com/tiddlers/filters/Conditional Operators.tid b/editions/tw5.com/tiddlers/filters/Conditional Operators.tid new file mode 100644 index 000000000..989f81f15 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/Conditional Operators.tid @@ -0,0 +1,24 @@ +created: 20190802113703788 +modified: 20190802132727925 +tags: Filters +title: Conditional Operators +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">>The conditional filter operators allow ''if-then-else'' logic to be expressed within filters. + +The foundation is the convention that an empty list can be used to represent the boolean value ''false'' and a list with at one (or more) entries to represent ''true''. + +The conditional operators are: + +* [[then Operator]] replaces any input values with a constant string. For example: +** <<.inline-operator-example "[[HelloThere]is[missing]then[FOO]]">> +** <<.inline-operator-example "[[Missing Tiddler]is[missing]then[FOO]]">> +* [[else Operator]] if the title list is empty then returns a constant string, otherwise returns the original title list +** <<.inline-operator-example "[[HelloThere]is[tiddler]else[BAR]]">> +** <<.inline-operator-example "[[Missing Tiddler]is[tiddler]else[BAR]]">> + +These operators can be combined. For example: + +* <<.inline-operator-example "[[New Tiddler]is[missing]then[I am missing]else[No I am not missing]]">> + +<<list-links "[tag[Conditional Operators]]">> diff --git a/editions/tw5.com/tiddlers/filters/else Operator.tid b/editions/tw5.com/tiddlers/filters/else Operator.tid new file mode 100644 index 000000000..83f6dbe7d --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/else Operator.tid @@ -0,0 +1,15 @@ +caption: else +created: 20190802113024942 +modified: 20190802113919945 +op-input: a [[selection of titles|Title Selection]] +op-output: the original input titles unless empty, in which case return a list with the single entry <<.place E>> +op-parameter: a string +op-parameter-name: E +op-purpose: if the list of input titles is empty then return a list consisting of a single constant string, otherwise return the original titles +tags: [[Conditional Operators]] [[Filter Operators]] +title: else Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Conditional Operators]] for an overview. + +<<.operator-examples "else">> diff --git a/editions/tw5.com/tiddlers/filters/examples/else Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/else Operator (Examples).tid new file mode 100644 index 000000000..590559d8a --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/else Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190802113334259 +modified: 20190802113551566 +tags: [[else Operator]] [[Operator Examples]] +title: else Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[HelloThereMissing]is[missing]else[yes]]">> +<<.operator-example 2 "[[HelloThere]is[missing]else[yes]]">> + diff --git a/editions/tw5.com/tiddlers/filters/examples/then Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/then Operator (Examples).tid new file mode 100644 index 000000000..2bf0e1341 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/then Operator (Examples).tid @@ -0,0 +1,9 @@ +created: 20190802113310992 +modified: 20190802113555129 +tags: [[then Operator]] [[Operator Examples]] +title: then Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[HelloThereMissing]is[missing]then[yes]]">> +<<.operator-example 2 "[[HelloThere]is[missing]then[yes]]">> + diff --git a/editions/tw5.com/tiddlers/filters/then Operator.tid b/editions/tw5.com/tiddlers/filters/then Operator.tid new file mode 100644 index 000000000..e4ea5901e --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/then Operator.tid @@ -0,0 +1,15 @@ +caption: then +created: 20190802112756430 +modified: 20190802113849579 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles with each one replaced by the string <<.place T>> +op-parameter: a string +op-parameter-name: T +op-purpose: replace input titles by a constant string +tags: [[Conditional Operators]] [[Filter Operators]] +title: then Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.20">> See [[Conditional Operators]] for an overview. + +<<.operator-examples "then">> From 427fbfd6230200a4185507880943643648e8bdef Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 15:32:36 +0200 Subject: [PATCH 0254/2376] Fix tags not animating in viewtemplate (#4142) * fix tags not animating in viewtemplate this PR uses the addprefix removesuffix filters, not a new filter as proposed in #3763 * use new `then` operator --- core/ui/ViewTemplate.tid | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/ui/ViewTemplate.tid b/core/ui/ViewTemplate.tid index ce685c148..54765fbde 100644 --- a/core/ui/ViewTemplate.tid +++ b/core/ui/ViewTemplate.tid @@ -1,11 +1,8 @@ title: $:/core/ui/ViewTemplate -\define frame-classes() -tc-tiddler-frame tc-tiddler-view-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ $(tiddlerTagClasses)$ $(userClass)$ -\end \define folded-state() $:/state/folded/$(currentTiddler)$ \end -<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify "$:/state/popup/tiddler-info">> userClass={{!!class}}><$tiddler tiddler=<<currentTiddler>>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class=<<frame-classes>>><$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list> +<$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[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"><$transclude tiddler=<<listItem>>/></$list> </div> -</$tiddler></$vars> +</$vars> From 4952be6518cb505b2a170702fd2f13b2d0bfba7a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 16:03:10 +0200 Subject: [PATCH 0255/2376] "Open" SideBar tab: use tv-story-list and tv-history-list (#4150) --- core/ui/SideBar/Open.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/SideBar/Open.tid b/core/ui/SideBar/Open.tid index 32b0d865c..6ee386770 100644 --- a/core/ui/SideBar/Open.tid +++ b/core/ui/SideBar/Open.tid @@ -24,7 +24,7 @@ $button$ \end <div class="tc-sidebar-tab-open"> -<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop"> +<$list filter="[list<tv-story-list>]" history=<<tv-history-list>> storyview="pop"> <div class="tc-sidebar-tab-open-item"> <$macrocall $name="droppable-item" button="""<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field="title"/></$link>"""/> </div> From 776ce0f65f5b74f31467b1d7f3afae6a97fcdf4c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 16:05:12 +0200 Subject: [PATCH 0256/2376] Pop storyview for tabs macro (#4149) --- core/wiki/macros/tabs.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/macros/tabs.tid b/core/wiki/macros/tabs.tid index cc12c1f41..39610d664 100644 --- a/core/wiki/macros/tabs.tid +++ b/core/wiki/macros/tabs.tid @@ -4,7 +4,7 @@ tags: $:/tags/Macro \define tabs(tabsList,default,state:"$:/state/tab",class,template,buttonTemplate,retain) <div class="tc-tab-set $class$"> <div class="tc-tab-buttons $class$"> -<$list filter="$tabsList$" variable="currentTab"><$set name="save-currentTiddler" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify "$state$">> setTo=<<currentTab>> default="$default$" selectedClass="tc-tab-selected" tooltip={{!!tooltip}}> +<$list filter="$tabsList$" variable="currentTab" storyview="pop"><$set name="save-currentTiddler" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify "$state$">> setTo=<<currentTab>> default="$default$" selectedClass="tc-tab-selected" tooltip={{!!tooltip}}> <$tiddler tiddler=<<save-currentTiddler>>> <$set name="tv-wikilinks" value="no"> <$transclude tiddler="$buttonTemplate$" mode="inline"> From 62a7fa4203919300c6f9b1267e777e7ffae83b81 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 2 Aug 2019 16:05:30 +0200 Subject: [PATCH 0257/2376] Pop storyview for fields list in EditTemplate (#4148) --- core/ui/EditTemplate/fields.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 440d02826..806301f01 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -29,11 +29,12 @@ $value={{$:/temp/newfieldvalue}}/> </$reveal> </$vars> \end +\whitespace trim <div class="tc-edit-fields"> <table class="tc-edit-fields"> <tbody> -<$list filter="[all[current]fields[]] +[sort[title]]" variable="currentField"> +<$list filter="[all[current]fields[]] +[sort[title]]" variable="currentField" storyview="pop"> <$list filter=<<config-filter>> variable="temp"> <tr class="tc-edit-field"> <td class="tc-edit-field-name"> From 0903fd2fec2dbfdd0bbad73746fa8202d3cb6c4c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 3 Aug 2019 18:36:40 +0200 Subject: [PATCH 0258/2376] Update katex plugin to latest v0.10.2 (#4133) * update katex.min.js to v0.10.2 * update katex-without-fontface.min.js to latest * Update katex.min.css * Update katex.js * update katex fonts * Delete katex.js ... ... we're using katex.min.js * add version number to plugin.info * Update readme.tid * Create katex.js * Update plugin.info --- .../katex/files/fonts/KaTeX_AMS-Regular.ttf | Bin 70972 -> 70972 bytes .../katex/files/fonts/KaTeX_AMS-Regular.woff | Bin 38868 -> 38868 bytes .../katex/files/fonts/KaTeX_AMS-Regular.woff2 | Bin 32908 -> 32944 bytes .../files/fonts/KaTeX_Caligraphic-Bold.ttf | Bin 19316 -> 19316 bytes .../files/fonts/KaTeX_Caligraphic-Bold.woff | Bin 11696 -> 11696 bytes .../files/fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 10464 -> 10448 bytes .../files/fonts/KaTeX_Caligraphic-Regular.ttf | Bin 18684 -> 18684 bytes .../fonts/KaTeX_Caligraphic-Regular.woff | Bin 11460 -> 11460 bytes .../fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 10236 -> 10240 bytes .../katex/files/fonts/KaTeX_Fraktur-Bold.ttf | Bin 35660 -> 35660 bytes .../katex/files/fonts/KaTeX_Fraktur-Bold.woff | Bin 22632 -> 22632 bytes .../files/fonts/KaTeX_Fraktur-Bold.woff2 | Bin 20352 -> 20360 bytes .../files/fonts/KaTeX_Fraktur-Regular.ttf | Bin 34352 -> 34352 bytes .../files/fonts/KaTeX_Fraktur-Regular.woff | Bin 22088 -> 22088 bytes .../files/fonts/KaTeX_Fraktur-Regular.woff2 | Bin 19784 -> 19784 bytes .../katex/files/fonts/KaTeX_Main-Bold.ttf | Bin 61272 -> 60784 bytes .../katex/files/fonts/KaTeX_Main-Bold.woff | Bin 35608 -> 35464 bytes .../katex/files/fonts/KaTeX_Main-Bold.woff2 | Bin 30488 -> 30244 bytes .../files/fonts/KaTeX_Main-BoldItalic.ttf | Bin 44496 -> 44496 bytes .../files/fonts/KaTeX_Main-BoldItalic.woff | Bin 25352 -> 25352 bytes .../files/fonts/KaTeX_Main-BoldItalic.woff2 | Bin 21976 -> 21944 bytes .../katex/files/fonts/KaTeX_Main-Italic.ttf | Bin 47640 -> 47640 bytes .../katex/files/fonts/KaTeX_Main-Italic.woff | Bin 26228 -> 26228 bytes .../katex/files/fonts/KaTeX_Main-Italic.woff2 | Bin 22764 -> 22748 bytes .../katex/files/fonts/KaTeX_Main-Regular.ttf | Bin 69588 -> 69520 bytes .../katex/files/fonts/KaTeX_Main-Regular.woff | Bin 38148 -> 38112 bytes .../files/fonts/KaTeX_Main-Regular.woff2 | Bin 32524 -> 32464 bytes .../files/fonts/KaTeX_Math-BoldItalic.ttf | Bin 39456 -> 39308 bytes .../files/fonts/KaTeX_Math-BoldItalic.woff | Bin 22420 -> 22324 bytes .../files/fonts/KaTeX_Math-BoldItalic.woff2 | Bin 19752 -> 19720 bytes .../katex/files/fonts/KaTeX_Math-Italic.ttf | Bin 41148 -> 40992 bytes .../katex/files/fonts/KaTeX_Math-Italic.woff | Bin 22940 -> 22844 bytes .../katex/files/fonts/KaTeX_Math-Italic.woff2 | Bin 20192 -> 20096 bytes .../katex/files/fonts/KaTeX_Math-Regular.ttf | Bin 41000 -> 0 bytes .../katex/files/fonts/KaTeX_Math-Regular.woff | Bin 22832 -> 0 bytes .../files/fonts/KaTeX_Math-Regular.woff2 | Bin 20048 -> 0 bytes .../files/fonts/KaTeX_SansSerif-Bold.ttf | Bin 33688 -> 33688 bytes .../files/fonts/KaTeX_SansSerif-Bold.woff | Bin 18516 -> 18516 bytes .../files/fonts/KaTeX_SansSerif-Bold.woff2 | Bin 15720 -> 15732 bytes .../files/fonts/KaTeX_SansSerif-Italic.ttf | Bin 30960 -> 30960 bytes .../files/fonts/KaTeX_SansSerif-Italic.woff | Bin 17572 -> 17572 bytes .../files/fonts/KaTeX_SansSerif-Italic.woff2 | Bin 14940 -> 15024 bytes .../files/fonts/KaTeX_SansSerif-Regular.ttf | Bin 29812 -> 29812 bytes .../files/fonts/KaTeX_SansSerif-Regular.woff | Bin 16228 -> 16228 bytes .../files/fonts/KaTeX_SansSerif-Regular.woff2 | Bin 13712 -> 13708 bytes .../files/fonts/KaTeX_Script-Regular.ttf | Bin 24620 -> 24620 bytes .../files/fonts/KaTeX_Script-Regular.woff | Bin 13428 -> 13428 bytes .../files/fonts/KaTeX_Script-Regular.woff2 | Bin 12056 -> 12064 bytes .../katex/files/fonts/KaTeX_Size1-Regular.ttf | Bin 12916 -> 12916 bytes .../files/fonts/KaTeX_Size1-Regular.woff | Bin 6696 -> 6696 bytes .../files/fonts/KaTeX_Size1-Regular.woff2 | Bin 5600 -> 5592 bytes .../katex/files/fonts/KaTeX_Size2-Regular.ttf | Bin 12172 -> 12172 bytes .../files/fonts/KaTeX_Size2-Regular.woff | Bin 6436 -> 6436 bytes .../files/fonts/KaTeX_Size2-Regular.woff2 | Bin 5448 -> 5392 bytes .../katex/files/fonts/KaTeX_Size3-Regular.ttf | Bin 8120 -> 8120 bytes .../files/fonts/KaTeX_Size3-Regular.woff | Bin 4564 -> 4568 bytes .../files/fonts/KaTeX_Size3-Regular.woff2 | Bin 3724 -> 3728 bytes .../katex/files/fonts/KaTeX_Size4-Regular.ttf | Bin 11016 -> 11016 bytes .../files/fonts/KaTeX_Size4-Regular.woff | Bin 6184 -> 6184 bytes .../files/fonts/KaTeX_Size4-Regular.woff2 | Bin 5020 -> 5028 bytes .../files/fonts/KaTeX_Typewriter-Regular.ttf | Bin 35924 -> 35924 bytes .../files/fonts/KaTeX_Typewriter-Regular.woff | Bin 20260 -> 20260 bytes .../fonts/KaTeX_Typewriter-Regular.woff2 | Bin 17304 -> 17272 bytes plugins/tiddlywiki/katex/files/katex.js | 31481 ++++++++-------- plugins/tiddlywiki/katex/files/katex.min.css | 2 +- plugins/tiddlywiki/katex/files/katex.min.js | 2 +- .../files/katex.without-font-face.min.css | 2 +- plugins/tiddlywiki/katex/plugin.info | 3 +- plugins/tiddlywiki/katex/readme.tid | 2 +- 69 files changed, 16078 insertions(+), 15414 deletions(-) delete mode 100644 plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.ttf delete mode 100644 plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.woff delete mode 100644 plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.woff2 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.ttf index b8455b8365ab92fc2106b9138bd947130010ef88..afcd2eb4d1488b6eb04b00302eaa6e223812b012 100644 GIT binary patch delta 78 zcmdn9ie=9#mI(zc0?j3#Czkjyoj$wq(4}`WGtBEV<N0mAGH^4$U;u&}n`Zok(VI8C cR}^P7*?x(Qv5Se(Wcou+M#b%QoQ(Up0X1|VN&o-= delta 78 zcmdn9ie=9#mI(zcd=fR96H9!UPMz6!=+Zlx`TPZc<N0mAGH^4$U;u*awK7v+^yUrk c6~!5iw_jpo>|$axp8k-NQE_`6C*wYD0JIn!O#lD@ diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff index 2a37b81c4d87877b596e51b1ff5914440d138943..4f575152f2d92dfe48ed316b668e5558c6102c93 100644 GIT binary patch delta 641 zcmV-{0)G9}uL9Js0+6%>5QB8{k+@q2x&QzM&&$oT8Ufyg9GEwMX<rXK^#BV4=l}o! z0NApa`2YX_0NApa`Lh&<LJNO&EjJFsz<t(N;O&}B+q$0Kt4n(FmSJSXVxl%8-TwX% zrnl?Ewgc`iKybMzCza_Zj^4)aC~7pm*P=$VK`U%cKd1fJa2|6=n|Z8)r{w0REAltm zPIOL-vF>p;+13Yqa=O^w-{bxu)zw;&yS1X~GexRFQ*?J<yCFOa9C3eTO_5VWHPok9 z>I+{iklxOWMkAGJmt5$vlB{#@eyivk;iZK1b>vzc1|#DV+GESrkb89X80zSZ@1LQ9 z;2<&f`f9&8cOzXfNgy>b=T=06yvG%}glT`XMctC~YjW$F5Yp{~o2seA>|RTHs7<QR zQYK%ArnSXg(rzk9oGX8)>UA4ergT<WlU@~E@2<68zrivJl$fA`K_3Ym2yYSNotzOG zGQOkcQBxLS1q|!CISBiR1+(B7j8Gz*9xDXDbZ+9)o%1(|Z3{<x*G0sFdSGOt-xhoz z_ynhN)0UijU~wEEg%<ZU6rytetR&9fU-@dMWIfl{9y|O7;|PB&yM^(&NW7I_pZ>6a z;qQ0Q`^;eEhe8GoC;k_5j-hVeI)``vvD1$;Uf!_uL(ZejAp&6<Ul;j~S>LB2Son1J zGlUMbsQJa;P~s9uED<OBNVPBMT+qn>fv9g7shqLznZ3z05Zv>*$ydW(y@{5bU6h{t z(7E-<Ap|}9;U+wkU%s*z^Aa?MvW&zv&XD@peLu9%xQJbk9i|XS+{q{f*JW75{?AG{ b!Ah2R-F3K*uIO8Tqxk_@>rkJwj+90NMuJDJ delta 641 zcmV-{0)G9}uL9Js0+6%>4j6nXk+@q2xc~qL&&tfR8Ufyg9G?$x{a+6}^#BV4=l}o! z0M~sSlmGw#0M~sSl(Q6vLJNOcZMUuiVfefDQ_S5VM{#m!^WJ4<yz5dOHCF4`UbaF{ zUr<tJ2-t$3W@aichNW#MPJWO7kY*Hpt~H}ZB-5s{?M${}YqHpcvXI3pxC?Ila{>M& zONq{8BGxU_87}E<vwtwLvbAa2-Bg#edFE#GvTdZPBKaa$_q8$L-obyaDJz?25~)c2 z{Ybv>!GQAnw|>8`I@%@2dZ5l-fBf;H&|~7s`H>!-jL2cow=R)QQ<<`7T5?g0tm=-r zE<**uc4Dj1)mDDw`noi7evsPOWYsyTo3%_SE-|vTuq<nZ$wuJi5g?Syf*Y!#Mq*>G z=$^KzK1_}H99m{4Hbj5BFG1p5@ugm`;?fqbQk6|F0@v4Ommj}jikyNWC6+b`4&irV z{y=CF5%HOtUp0sjrZH3=n;~owV=-jJ7(#>vzg7g#DmVD&O8FDQ5((O?P7tGMVdyYq z3C%W!eGZslg)KHQwCR$fDVZfF!})hf8{_qrPx}RVfM2_<@B)9tE{4+Ao%@6l%K!g< zW&gsLchKv6qwl|p4jM<oF`5BtT<Z`1_`puzc03uQ^i9ky=a7It*5?x6vC8+UhoOaB zO-5Kn)4@DA4Mjk}HVKyM7Hf-~BOHA+rDu;2Db{x@qZ&JP$$Y{R@o9`_FR+ZTMsb0? zrM!GgAw=#?xPd(Kf1m6@UqRDDV@c5*lKQjjerWGF!G>Quz7Y7?IEwRiojMh<pIL#U bLV5S}s>5~Gm}U7boHJ4~P@Mp?j+90NAZt8` diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff2 index 7f70848909563397c9fb2f9f2624915355243733..b982d6eaf85fcd6eaa94a0302bdf1db9c08e8231 100644 GIT binary patch literal 32944 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 literal 32908 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 K-6mNE1_l88xy@Jr diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.ttf index c3c24b83811cdc03c0e31f692577dbd3cfee0a88..f84148db5806b752524c18c6173fa19e8675c976 100644 GIT binary patch delta 79 zcmew|jq%Gg#t8*1qMJ(tCYJax{SDZ7=#jC^i_6`c<N0mAGH^4$U;u&}n`Zom(VGvL e>=0ly*<9(mfr-&%@;VR2$#32GHb;6$GXnr)1t6dR delta 79 zcmew|jq%Gg#t8*1!X7nE6H9!U{`hY^^vGD|{pwo(cz&C&4BX5w7=Yk<t;`e{z4?I2 d4gp5v&6Tbjm>7*Guk%ox{ML<cbEJnfGXU+d9ispM diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff index 1b531c7ca4f03345271390404243cb009c9fe54f..ab56ab7fa707dda6bf71209cf0275ef6be2bab03 100644 GIT binary patch delta 78 zcmdlGy&-zS78cRXr2!LnBryFA*eu0Zr6}{_a`)zVew(ih+{`Z+fZ)ca8NXrl<_$`B cI2ffi_iD2+GX9-BNoO@nZD{hd$&R}D0RFolt^fc4 delta 78 zcmdlGy&-zS78YTTnx=_65}5w@Z<b=LQj~eWy4F9Q-{va=H}eYyAh=#DGX+L(-k@}c cgHdL4uQm%K<G;z1bXK#Jh9y6l?5LX$0Et%|tpET3 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff2 index 2b2f41a8bf251c9da4c72678105ea86f896ce54a..710c26179c5f1c9998065035a82a578cf45d60e9 100644 GIT binary patch delta 10229 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 delta 10260 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 aGI`Q%?=%;KG0AV>jXR0$d@5Xxx32*0^U(kR diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.ttf index 3e1b283525d7bb0015d2e26147af4dbeaa129613..97814db7e2c7bb3039692551a4fbbb7f33baa46a 100644 GIT binary patch delta 71 zcmew}k@3$&#t8*1BG*eLCYJax$yseY<Yy=&^}*9Dp5Nvx12^*v1|YbxX~u6Dy;;ZT Tpa7%E=66nqn1IwqS8rwj%3>On delta 71 zcmew}k@3$&#t8*1LOC^F6H9!UWGy!y@-viCJYjVyp5Nvx12^*v1|YazD>DT~Z`Lt7 TD8OjE`JK}tCLp!Z)tearnAaGV diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff index 6c9039f653b670406a3fce78cec856820c9c8c54..aec8a33389cb27a7e2e603ece720eb000fb9a0a9 100644 GIT binary patch delta 78 zcmX>Sc_ebe78a4~r4kc&BrwTYZI)u}Qjn4Q;As}mZ}XLboB0I;5Zu@_<2Q`nd_eII c2c!Syxmp~IjK3x?(_YPzy*%gE<WQY_0Ei<V9smFU delta 78 zcmX>Sc_ebe78aqL8n1~v5}0HyH%l>gDaa_Eu(}k_Z}XLboB0I;5L~a7nF6CXA5gr* c!Pvift`-L)<DbdPv{$nvPs_P6IaDVf0820&NdN!< diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff2 index c2ca9666d736cf8d5339fd02536d86815f5fb600..ee5193d7c888fe2e82fb54342f2bb5d4c34b83a5 100644 GIT binary patch delta 10166 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 delta 10145 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 P=e_r(o4PG7VgmpGV!MNo diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.ttf index 235d88c60bd789c9500a66af124db518f208d0c6..483a7cdd4eb2e0aedd07727ead59f50818497a0b 100644 GIT binary patch delta 75 zcmX>zjp@uZrU?ZsqHZORCYJax)n{)!q*f#|dvm&ZJipCX25#mT3_x&W(~LhbdNWJ$ Z89_#q%@<pyFfp1;R%p}TJhgp0GXQD(9iIRI delta 75 zcmX>zjp@uZrU?ZsLbq##CYJax)n#owq*f%es5|0%JipCX25#mT3_x(bR%Qx}-po>b ZMv&2X^Tn1aOpL~p725PSPi^1M3;;5K8=(LI diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff index 6061f412a361ebded2a7ce70a35b8a0b36e39e6e..189fea5e4ff5d5d66f2793d6753f702590add053 100644 GIT binary patch delta 638 zcmV-^0)hSLumR|>0g$u=6-IR8k+@(2e`~WE0oqC&o3m#(Uk^O>01E@?00000*s_@X z00000*s_@Xvk**A34biPu0z3I`zy}wk)y!7ILyqvo6<O%SOME*EA;obqYN{ZseRle zdE~#CX2aYzVkdt`|46M;`CY12sufu>g>58q7+I4<CY1FgQo%!V_1lR2OEzPj$b6*h zrZe2sN9OE&CD$$2%@@*keI-rYN}4x})Ko<#<Q}0kVmzLln18&mX(AO>QQw}a7(Uri z{+{ah`>LZ|+|&cb+?jvg)cZ=<;z*AtV{sVtt&8Qr6ejPPx{Q`1JGx`;FGK~wQEZFx z=fm{U^>uE9gSL%KQc&1U>LwQ#8#!FxlHJTCWAfIR5X$wUtE#GKcB>WL)3&WI+D3dA zEi3c;qTNIgJAao=l*>hw+sqZJu<cRl^6tvk^Ix!t6d8udVbMSg2f^Qn@DHCgRCxSG z$)hSS!4eD#&rSGth=|w_N4$retb42wyy{%Vw;ShQoNbb$z3V(8qB;yZ)Nc|W5uf24 zE6DlQqF0w_feCH$R`^Wd{4-~k@d?WJoq)XHP`dGW3xDSXhVNXx&lCD9e|>xBE{1R4 zNAEL*zCRQ?&~Wr`@;QLITJH@0`NI9apV+!$>AReJ$sqzVt?wl`@ar=C+JhlqZvKv7 z2bya0;vZ26cpTBoqPV9%B)TN(lbw5)F{90A<oB+)O6(HXeFyQaj90H?i_cwTo_p7M z>z+dhc|Y{0t5E*(&7RB^X!Lkl&NVK0=j_hDXrDNbeUBX`5OD5zWW;421tS0NGB{%8 Y)7v*YUB)i;TOZN<0iF(7Uz3_w&PB~l3;+NC delta 638 zcmV-^0)hSLumR|>0g$u=65D(dk+@(2ermHC0oqC&qKjD9Uk^O>01E@?00000*L@t6 z00000*L@t6vk**A34b*?55qt`=U3?Mqtu0ukC~a@ZhWb(aUsb#F8%x4xW`Om(2l%X zfeZclG#gseh#h~8zHzNm`CqD4suf<4+%yv2kBlUdguI$WD!5Os{wm1-cs<q$&qlf~ zo#DDZkdxCTt6Q#X=hAk4DNWo`Y8%2eRpBwdLnsxDhn^#`xqnF$uBeLo`9z7~qc!r^ ziGIJYI@-leJy6Iy_3c%4Uk0||(j(6(I1Kv6#k?oE*q+q6Xot6SNA5PFg5V%F`RI8+ zJ$HR=h2dzMNRk|Z-J~v-T`au6y20C-BqQ?1h!FBs(^XYf5W9(G-P5M6&)UMi7R^hu zyR6+<5IdKRm4C~5WKHIBm78`^ba{Je<LMWgr<5`pk|je8ipdevSBmHxY>g^d|Ec6r z6^ChogmTYKh-n{815W}g6vDIWv7+Eb<tqKUR{jUyIyl;^&Vr?>4#f`Q*MSd!Pw14E zpr)w>tuD|UGPJ>4f=$SIYmrNQ2IcD=!+Bbvbgl6k&VLc!ZPC5Y$Iw^){CwjS!`IKz z>r7DJFGU^F<e=Y#9gw>0cZ$A!;=J!>Y+bVSZO)y{Aq8L>Ul-G!?@RF7BLSbUe}`#{ zG@|9%A5l;X@D@WczZ1O=bPm)9+j^A|qYWGR+2xlRyTEl{1N*APN3YTb>^5Zu_m1+$ z9fgqi!9Pz|NfqZ#Wq0#3Y3kt^_%)s3hVRx~w9hz8yB<3lqX2$~l>wKra;RDGGjhNR Y2U^#YF4H#RH{KI-0hT*iU6Yzu&RM`h@&Et; diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff2 index 4a8c731ea153df3211caadb5ac7b7a01d751671c..dc3bd4c040abd23afb59d2fe385f80e23b0cff41 100644 GIT binary patch literal 20360 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 literal 20352 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.ttf index 3728c153ad83eaa58266836c36d83d5ee8546fc7..9aa5f674daddca531e771b400501317fe476a722 100644 GIT binary patch delta 75 zcmdnc!?dA?X+i;uNN35zi6uTvv)nfxdX*znV9UHFp5Nvx12^*v1|YbxX~rKIz4=7$ ZML|ZB$?xjKH*c)(XJRzj?AY|4832VS9^U`} delta 75 zcmdnc!?dA?X+i;ukX()6#1bE-nQj{oy~>d(7y0TF&u{aUft&dS0}x!Vm6-ygH=oG8 ZD9C6$`CXm(=8g6JOpL~x9h=@W0{{*38{z-} diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff index b85b6f3b95066766eb45767eade94d51d24ee451..d01450e91806b0c316af1228ce35f7a31788e77e 100644 GIT binary patch delta 80 zcmX@HhVjH2#tB<kL^?|zPTY~eG|PRn6yrV*nF3qpHSzp5Um3WWUoZf{jZHKD!063i fJWq2nUfg^jn1zw?@8qK)t68RqCxlKe3B3XUBkUm< delta 80 zcmX@HhVjH2#tB<kgyd=jC+<jKn(4M#igBNZOu5KcpLl+ouMFJGFBpK}dacY97`^$6 e=V?yHhno)svoJFLn|w56HA|0CLh$60&?^9;Y#u)V diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff2 index e2ffe8cdd18b43cb0b71c03a1b4c34de7a976052..7eeba377932c6914b32e8e3da14520c231559e77 100644 GIT binary patch delta 19295 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 S{}0ae5c~8WI4y*Y0002<`ELvW delta 19255 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.ttf index 6c5b48735428830ec04171dfda284f667d03605f..dc0185a12290672e819e1d62ac9a955311c60341 100644 GIT binary patch delta 1206 zcmZ8gc~H|w6n-zE1_h1EkxqIHI#wKt4&{iPAtVq&!VwY-B+8M5$Wa2RMh3NQtgVhB z1IiE7QERD3Ye!ovL7?r76{nR_Eg&!qN7+QA6fCvKR6E)z-B|li-yYw4-|l<6`*wGT zuxCfu2mNi`Rsbk4n)MbzWJe!B_W*#0+*oN1V6}3;0dOSJ@#xK#BJ+^%=qx~g0D#w# zBK=ki<(C5dUQE%msBHUYkC$e6RG$I3URrF@7y4Vb9RTS1l5&D#N-Sb?9?|$pYOg9b zTdTsS;(4Hkt|_`;aan~?FIVz@1n8^+U<u6nDho^Iy@T30)FGf;Z#Mm$6>^_$XcxeO ztCotb)@1$^7hqBZzzMW$F<I(sT-2YmUz$2?w7+7i4z@G(uX61fr%G2ZM`)T~#~NdG zf)6aPF9Zx>oP{w=`wwOg0Mg302X*<OjTI^kJsdh177~^hb}gJ2zB7C-qUwKziTEPo zzF?i8QSkTr!;w{ygHbO;#YKG=eI$k(b1c>t7a6xBu1m-h76|*|CGjWYpNe#%uM_+d z$`bm--r^+jJK{D;fTUXTSE4>~ENPq6Ln@WFOXrgJC10`0d}ZabYS~TM{gf9|YE!PH zjLTQb8x%Z+R$*0KRQ#H{BDFa6^EB@?MOt0jqxAgriHz)wk27YJ3CaV?dztFY4>O4> zQ1zCoUmc=8sh-SQou$g!o<%kUZ#b<%jZ(8ib3)Utd6>N>yCi#WHpy9^Q<F2GeO;^8 zR%#oxwifN2?lqlJ*QC3%k-xEM<MmCFO&4?dxp}!QdD^@^c`f;nugbqskXX>FFV){P z1RHi6h79vYA7h{~f?gC&rMn#;P;buX#y$WqHoabeq2{Ac{=+BZPak+LX1CFKp1^Xm zR31a98|+taOrib4PaI_0y33fro(CT6ccF=SxtH%hf82BNv-s|b&jtBRYVRdxzE_N% zjQEy@<qTks-df9a-ZG$`3F;HLiGsc$n`_!N>6&njyKcK2F5((<?s2~F-07@xRywUt zi__%ja8x_?JN7v~aJ=Uzac~`M2a;KGk4%u;q>Z$a%cO-glMCcL`HY++pOCZU3~3;T zNFAvqHDn*zODc(#ScrjaB07>qR76f>WGx9M9I{|+#q8L~sA5z)Dj5}y`iz_&IX1j< zm^bV{I521mc({xY$h^_t!HD`f%v}GOgoeUr=PPyh1}G}&Gz|>{v{S1GVDFn|0OR*S zKPnv7)2_l&TUXB<JXA*Yf2EN|^R@pr;JXCFoA20I7;fM7%U3L#t>~%80yu}BxDXei z7kcAjT!LKq2$$kAT#i2Ii+<=2&0vRCXoD8G47=ePoJSs0IxUjHQH;bWjK&y@g+DM3 zg&2<_Oh7T5MG4enA|{~}lTn5#D2EfMz*J1bbodlAP>Gq)0F9_ZHS_26+su}`YwV}) jev9_9nI6`vkkAm$w(^oBsWkC9COt=~`$^&aJaGR3AFId4 delta 1526 zcmZuxX-rgC6h7xYa2A#kW(E*R(MBn0T?oqvgTSye3&XI<00J`%2w0XuQKZpQP3s;V zdAPJ`Q(IHDYE>Mzrm0nGP)Zf324uT4fD5rSXsWT2LHa=LkGA*ap8I{@JMTO1otJwb z572iBZE~yaRsn#{P^LGwG*+qsy3YaFDGZyd7E#TD9{@(Y*!$9T#-g&jqQS=icm4u! zI9jCNXk_*I0FxSa<rbCJth;xqFNehw05^h*3-tve-q!B{IzM7HNii$%Y5Qo_-<Rb} zip#3Dgce4$LMn8&vIUK$6$X9djqMabM+^WZEz@r?QVPcpSiXdPU{SfgtZ*pJZ<2i> zEx^1h#)^$qnNd+a0OKA29Eov5p|Nhi?H2&6sbTztA^rHw3Tl|T4nj~i(FlkN<;Ax( zTA3pY#YzeRJVCWkdC~us2DsskCgTH}KSxV4Gi4444m=Q|ke(-EF0_Z5_Y~}3=0Sme zX2m?OxdJNSHpO}Jfbx6Ko@r<oA~M@d!D8Cx=t5BxQXE%D7n<{urg=6k(`;HU{!Qq} zwWsMU+R4R<XYXV?NAvKe`JO3B;IU#}_ME3TECYVa(nSkIJfL6u)}l{P;3~=D#qMq* z&eDIdSj4dl{ckCOyBm!~SY+qwHtpvwvVV>LuXY4aEaD-}^>MKBg<>v6b3{T102*X7 z({vcV00DTxN-#$p&-Gz`Z!fiHyN6!p-0Nbjb@x~L@A9_<cn8!3oC<UZ)CFD(3JtpY zuWKmixkM_dmXK93t1Q7+L%c)OAv>i`QfsI-bZqsFu<c<#hr5RB!oQ7J7_mR%p)6i@ zB9e~Gjckfq7?mD%AgVnYqD!K0$H-#N#QMZuj!TR?7?1Ix@jbN(oP?Z&+w$ddxqP4e zqP$O$sMx0XN-?5LRrabpQ~|1T)k&2#@twrd#7;F|tyZ@ty_IxA<EGJRE@-BblafD8 zwx#G(&ZbPH2Bp@fj--XBolAR~9+<96-<3YGM!KdULy(c1u{+~T#*o%dE74YK>$MY^ zv6-J`j%I~q)#|f8&iXp5EgP}}vMaOCXFpl%yLQvsJ2}ZYKj!-8mgctQ73DE`Z8~S2 zPS>wb(O=8ol0RUO8cc=<hN%MQg4ylGwsUs&##cVi6Rds)4)i#yK;Jg6`Zw$J=*wqZ zC%T2r;{v-&=EfBGn<qLZ(2o8Pj+^gxa*!GP)yTx(eBp;rS<7W?RslO%Z@T5>Gsxnq zr$=pLT&KB;uRP`=dNEbE8Zeky(iM$7rnqYjbERuJ%O|=FsADwU5@vVzyS39Xwnw&y zw)?g*+o;WIv)G7rr}bm&R%?y5+PcYFX<cV&v+T3%wd}EcV%cF?Z<%kgvryy-nI!kg zC}|}vq?t64Msl8fN6wNn<TN=&PLd;pA%}>G93XqiZc;<4$wpF0@<<NJAn7ELD2X3g zN%+K@H~i=D@Su87J{UI`Ip{WUa^Q>prTw1$3wrx{i(S0Tnx1luJUsiw0PAN%et%I( zN8#WQ0DBSvdsysxzYM@|9eP=MRL_PA<3STsf2gjM#jnN@M&Bbc3vY{@F@QN>bvH+h z6jLm`HM-c`F?Nh%dzJrSN`hQCjXdO|13ID;I->yR!<XoSt|&wiiqQ?-;S!jk8Cswb znqUXC!C9v6p-h3na129GilMj~!!R5sF#=^6iBTAhG4Kt>LLJ6oJSLzV6{tiNe2$5z z#w66hDNM!`IEblG4~H4g@vRirF-OLIxtvYqC4K<`!RE{3KcOAJyrRmy`B5*$r2Qf0 Lvi}=rW<c;az}5pv diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff index 7b9b8f50c0727d9cab3a13333f20469e50dfdbb8..acf48e66893be130a57bb66b9506becef9b72f81 100644 GIT binary patch delta 33266 zcmY&;V{o8Nux@PI*2c!hwr$&X-q_yQwl{XNF*eD@wrwZ(JNMi_x2v9->8_`1@Mn6u zJ0lG&G8GK)RFsea0R{O_q9Z|&{%5>&`d|Hj=KsGasxq;HfcR|uXVv%*MiQqccBb~m zP9Pw@>>wauZ6F{JGMwB4|4cpHNI*bBUjE}S{)eAnt;k&#PL}o{ApRF1AdoR2An@rc z80$Bd#;(AB&e4JYkzoEGP%Q1dEkHm(#XvyZ8bClsY#{J2u&vCE%|JlB<o@Gu{tvL+ z++(c%Gyb=k?*DX>|3Co;4*hCn@8<O%FZ937{Ktc^Vm}eYwsSQ7kLQ8$zcw&V871rq zdt<Nv)^&dX0RjH6GYOa!f{%l-y*UU-D9wMwW)Kjl{tY$eTPH_XHxQ8U|4s~E1Oft0 zEs1x6?BrtppL5863xNduhv?+kj|s1}6kkX$UCE^<9?L7eL^n$PQ-dILl*v}RNi00` zVQGR<j{@s|3(jlo?i1E$RQg-23~Y|+>xY-X@0*L!ssCgWLH#R}E;Ft7x_<3wFxG8{ z|G3-I0t~_&<OR_sFbL|+QXMjABnGqE1d~>y>>~~Skd<fV(-T(^62dmHVwOn+=Z$n( z<~%ZRG7#n*WTyrMRTp~X!*1~}aycf427=~!stX04v)w;6`RNjP@8lV>y{N3e_3}W; zKhvK}upMaebPN4aer0MpMCHenk}9xe&};P?I7wwYhsR&kTneRj4&4wC-h8p&qJmKV z%;4a)29QZNaFS$NmM|y<iz@7@(Pio_<v9P{jopvHmrtD*<@9`?GFr&0@3FSmM!gP) zA<Z75`cuRQ3VD@T81di0r)b{%g$nSxav=1yQFFz?v3T=@l#YmxX}TA|2OYe$=<U%r zd&ubpOJL3LoCVR2>>ihfNp_Pxq`t!i?N{Q1_|Hw9cLs%}VNX~e`LtT|s^k1gm+Nm$ z?oVeocV|GrlSFe`^S-cPjk;!AiX&^mi9?N}OT{^Ly(2Y#t~u7C+Sg$*z8(l=8C;xt z-sq&NYTwpzWIy0fH|^Y>_1}svnvOMz?harpA?P{fn|BF`wiwUGcTf{aT6a_>L-jc^ zc7C1Eq_Lx!VP9`n*l_E0CFB&Pc4#NX`{ak@U^+G!A@ZS-VY$_rLi@fJ80HNDb-bp# zHnA8Z{-W|GXYx~H`BT=8VF+M96-Cj-h{?5y?ybF#{h>E{byKrGUkiaN9Bq~RC4N63 zG{Owi6L2QC?gJ&~b;8vkpC3W)g!lK)?NXAn*~GZ$JFew<#5}^QO$v;<gpeODMwuSe z-$dsP2#RnwX>l+KCs>dx$Pt28pZ(Q5B@?@`B?uwc)+(M%9jg5CV_QI<yGln#R+3El zwlc-GMZ{oDzq3xInj7;~4{5@V-*I7BeIyAz<7{Qmy;%cM{T{Mh1&e6(sn#+}tk?9| zwK7P=QH}fn%9GXqr;a7{KUvjP9NW9X*~`{s#c(hQN5!FnJTqzjfb4k98S6Rkr@V2} ze`NfHeSAQDn-1wV!ziE{CIax4Ctn@LEB3i)HzKE7B5&-yRAZ{k=C%!18ml}wF{Uj> zlEpvi9&J_=Y}*mHeo~@4b~jGPE8+unzJy9f+l$*q&+zaGf57zM+xjb)q6n&nP*-r^ z6q)Fx3RqRR0zs`1IEBC$I5t2C`3yE)K`F=-LY60&5m`crc>&Kqr>c^g(Dxk!Zmmjk zuVQ=!azbGhgw7PRhjHxfu@UjPhpF#S2eP+RIWr|3%XxR^wK`+P1l^WT&xnPR6Nl*4 z24bIbCjAR(@k^t~NSF$_ZN*Fi1Ta}xbFP9j?uLS!J8WcW+m6G~CQ-rAj)aDM+$ooT zUtjsJPr3!iVF7g+Yy(5~Ip5LBxHqqBy}&wn-Lj&)V}iQJ^PGS%lSW;KxZ&gw$r&uZ zOYFFr#d=>+&%u{G&witiv*i`gr0IkKL?`Txji2QtIOma0FCZ)%LMA`dAPVHoyl`;P zSl1x_C@l-C=VBt7?>(PEpkQ=FN@*Wg(4d-Q?i^(+<N+w#z85D+tK)Wzyci0v5Py}k zD)!9S1+BAe8#)`bYRPI(eMY8Pb$QyCdaAf4++kl7;+H6zhtDO-G%7mF(nqirGZ^~x zM??+$kT>l%opTlW(+OncOM<~4WxhiTIi-2$yI;#Hjvq#DyFwQBbt_oYD83)%;VStx zY*wW6HGr3~T!Wbh8JFAgWZ3yJ-%4t)qw5%QXq&C`V+=xX!7l{U>3<tmZ0Kq^172g6 z%;L8xI{N}Gy(<ryA==fPp;-YJYoV)r#w2(H;HDjB_EFyT9iz5#hKwAB8P+sG$y=^w zOMv|Qs6|@x+a6(6y0x~D*2teRagLKzcZO&RI-rK$fy5TSz0|%r(Za?}QU8~bTdjuU z!p30B1y;q$Zr}uez)UYp6aVAsMeNMY`{O_9#hDIz(LkqlbwpwmmKEs6H1vxF521F1 zNKY|xT$NlCEk6MJ``^`o1BKaLT|J`?Q!fjOnNGoi?}KPXqtVU?wl0Ap|J(6>$%##Y z4&c3M*aGZ}4)Mii0k>9#I-nRG>VM|<G*xG}Wl+Fm{6U$}!8U?WU`63n<yvCq+@P^F z8fJyV0~I^SGKSK)*D{F!;N|Ifv^yX~N;&iWzWeygWLFoIGV#KnjZDY!{1Fl(q!^<> zh2i50ot&S9B*FY6E73&R%yVCerId~WfY5$5yS_cw<pg0iBIAoxG9s8OSrn^=2Eon2 zdXCOM;5uk<=eb+anZ&`5jYI5wAn!h;D%bVi+?YdMf7Bgt9#2%OY*n{99E(@x9j{FL zzAm{$;C`m*Bsxv#g|KcFp93A8P4Ue+FuH^8D=>t69QyN@&?{MM<n%dq1@-O`;IWpV zzD1&5m`8sjz1Hj7m^nHTPYjo_%^?jAiLHo%k&tU(uuf3@N7P(KLP|Jp@tbEoS;kbq zXh_-}cUYshX7T4oVN#X)?dMy8a63IsKif>AaRj2z(WzDBzH#Ty%Eu|Po6QS!-qCJD zyXYSe_NSn7;gPXLDl|WYWE4kn03>iJXsiz`l2nfYv2$+DiQ&0tm-I!N>T=DiBZWAg znmp<Uu_j_);Y)<Q3N9<<!GUb~-G1fNpqzK1*%&h^U@Q>>m1zJa#Jn4_G6cgMr3E6! z4GGdN5g91?)2J~cGEIWvFoXMcU|RkM8;PI%n4NGtX3G9D=v+cIWW+)wkkUGr+D3Qf zQfSCxqs+Ew3z0k*qzZ2O6KVB!OF3kaWm&LlQaaeE<zwAhM{3+rG>T20(uKo*0Tj?~ z`y?Go_>dTb$uy?$i~O2s^_O^0^SIWcIpA7l6JqvxJU5%O?GI8u`2_-PLJ~NgL1z!4 z84(>KJ$~M(%G&m+liJM$oE@2}{~DgH4Huznv+()w{!~Spk?T2}H!ZwbY5D!p`{GwP z!>Oc6-Sn78LdxQUNcB~);x)Z@pP$$Jd2_Vd8SSa?!~=cB)K{B9AOE;f%QSi|ttg|O z0KRj4+JX|HQ*Bo~=#1Mw$P@w=i_uz0hFWuq#|k1?0~VR&%$qv_=%krfM48a$FR-@A z)MlY}R8vv7|H?8~C-@kZdLOmBSI*LFs-f2G`HB=tU|agQORqgDxl&&Pw!hw~NaR3K zu+y?4*y!>fq9~HUc4EQTAtZ(zAR&;(xB{hkz@zsx#YUvA@&4fIzk!B`9pS_sNW$e# zk=~28!CbBA`Zd=9&gVrQ6TXt6zb3mWK~HZ`SzcyhGH)x0BK52omMo#8RipfS=;D@a z<^B{mP(k_C_%r;QP7m29o!MP&_}TA;w%)O4R6uQsEu%rNsl6hYiUU6r>!eXq5eL_G zjHbEAA8WsX?Xd9nW~rg1isK5R)C7A6pHDwfxD@1HQAwl*c){T|n$N1$+4!ML8N<Oo zf~p}dAnp{PXzKapUhdFw9biDYmNwTtU7ZoOFl_4kwl6u|PjH^1Wi};VG4D2c>0W0Q z{xZHFtta4p?Iz*J;?9$;+@*Ht@!Uq4vtktFtayGxzJfpB4XD;rQlAOLdQjm^r;o>= zC9iZt?Q`A%4lYuto3%A^Zj)3fI^Ep1XVrY{__&A;qpxzK734YT38NxJ@lfB=Y{|ni z^e2%pgGgY7J|BMK1kw}OF_e%EVd^~<j5!rJ9X2hK)D?vedQU^vNM3_+{wSmRJsz9! z(?~lhJkWlEnm##MMtY~rChm<dby8oAJ6J918!oL15dUGv|8<nuvHJC_=oefWZBpeN z#-^jI`(DjO*h^91CwkBHjfR`-^-2wpUC+Ko{ib1I;2R5rR_w2>jniIO;Gw8R#?^+2 zB?mM7OKx~3hDS~Ul??@kwnM2Tw1}bJ<YIzn4^q^NR77!F4KpbVjYV}{I=83fsJL)@ z;smA$c!`NSx<wbB4^fTFB{8+1T=s9(2BW>)eL7T;k8sBe2|pJSY}TeGl!ep9VwY8Y z3NVqL_DY?-G+4Y8=a}VEVR5_Nttc~bVeF5=5BlddM~Bj;X0`D>9MOTV?)sN0e=P5+ zZHkx|Y!m!NJn9Y$$lqkfV0u4!lMWw3?}_FDP#!j|SU5St#+aS2JK}s1U1_r;sbWBy z31KN$kR3m2pw$^OLnSGq5NHAmcBq&^#5q}D^ipw!)Hm_4P=`zof5qcuz4sR8bV+l! zH~HRtpVBQa>EspaIXF8}ltx`d)Wsc2GAD1EOHSL3Dm`aTinFuyvhn?kYx5)8ULpPg zJRq+Hq_S90?`5VdQ2VN`+8!CQ^S*{tGmkMLophLOGyh!m8YE_STQH5&P!d(BF2iJ` zI1V?JJ7t;1mz6w&{&o8GsOkvJQ~P_dV#y;O{TdeZ_$ZXB0vs0WFv*#?b0FLH{NqMW ztZ4?w^ABM{Cvz9FL6T{@^>u<Vx<O)rOgaKkGLl*z+VBUD@ctuY0&)YkF#WGBmd)is zA1skhE*o9pd{9dIO0cf(KmRrq#Ih6~t{;_JRGfXUUBp)E=a;NDkwuyUx4Nc_?e-t5 zEI3&BnT@=t9-2=giOGHPSuB{v;Cv!jLHGF`VRA{;7Q+$;DQpnyeuy>V><d}|jGNm) zLzx1|`Q8ObVhHO+$lTJ6*2GK(^Q6Y6hEur{{M?iJa~zgw61!)VUt5t_mwYO|Ue{WE z_{XoVL){{A1cda>E{86B9^#%x^#`QGgdZC@9Nnh!L|!`^r`T&m<efFXX|ufUI*OY$ zrXqp|j*Q1QpCu9_@k-9k@qAhUH*VV*Pu*iqZN&a$`4L{DT$5#Qf6LqW9NqA^I(~Lf ztB#c+5$@#U&g$6Mg&Vq+?mlYawOjSBcpX}>$YcRY0hyj;fr|@Wj2R>&r67E)_{y0Q zBd->Xg&7FD-Slwd%R(rt?t<FJwFSp!DGrreTxSR`>_qNOdYG6E1>qAg#N$#<ZLp%* zow_~Ct+HUK3)9`|elff1*90)9;2>A33YXc0^@>nb_!#D#-;RI<UBnFPB%I313Dz0r z{WZDZ|2_JBruNnU(eDIWT)Ijt`Ylo6#g3t<(!ZYo=H5>Jg^<Ba(luC%xx90Qxhzt$ zQ`a6|)#Y9C^x5q~rWy}))VMg=F%1ueK-21nzy9`JrIH>&+;*eH3AtT5L7`0%qoVJV z#4^`!%D^<DAJQ0=Fv%3j0`jG7j_X{{sdBPPSP`Fpp@MtJYE8Vx1=*PoJ$QYLaiq2R z5&Srtyh3{-PNT{=HZuR}HLl-XPDFLdJ(Toim4gh;t_z5LoPz@%M4Qb=J>O(O+D+Lh zR#~yV8GlWB1m;g`w8|hJql!mKXyu!qUFJJ{W3VAWBJY7!O*!Jqyw|S*goE^J8yOGU z*M8Bs0`p3FKD=Ra`GwtQ>Uo+16Nn(eSR2zvH-|eRI4L^hAaG=$dC(@Y3ewnh&SpdL z8B~F|Y^JT0BX2-eRjjIJg<5&S-a1#S$4?vAZbU~_k)-31u*6MUzCBo8AIsN!VuVr7 z#8Ypkizd;83!Ucc^WPz$Cj)s3`Ilb^NARl(-?%|m%S6aoq}g-5*gch>_j2&Bh(0PT z2uoj;Pcu19Qw0gkeEuhd(N}B?cHe0xFuV=rTd)xCAh*EviDd!Uy^^E4NUl1f(NLhC zhSWr9E!7`wQ1RXK{*L^5i<nXsffL3(&yuy%(~X4A76i>}h!d<Jrwtkll@|wGU!PW? zqudBXWg@K%0x6tGDLvSAIO>B!i�fL>XS|lAx3>$fU{i8@jNP(r9A&_*N*@FtxnH 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 delta 33370 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%0D&^d#&n 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff2 index e215df090028d2d637e3f36cb4d59e0c0a93c2d0..cf5ababf46d8d4d15ba26b1c72fdeb39500b3d1b 100644 GIT binary patch literal 30244 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 literal 30488 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.ttf index 9e0b071562f6de7b71850e9126d9f389373b85fa..4346f173ce347459e433f45d1fb06cfc74bc8eca 100644 GIT binary patch delta 78 zcmca`o9V)BrU?ZsqG=`fCzkjzF57tc=p>nF*)`hn{5D@1xS3xt0Ktt-GycQq%}XY$ c2{W2ZmRlyi`O&f&OhBgM3jNKiR;sZ801h4>zW@LL delta 78 zcmca`o9V)BrU?ZsLceP`CzkjzF4=ha=p>o=&kL`|^V@u7;AVco00h@-Wv0OB%}XY$ c2{Rf`mRlyi`O&f&OhBgM3jNKiR;sZ800hk*zyJUM diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff index b56c3c663fc9ba85ab9b7b1af6e68bc735e34d9b..d2cfe4e319168499f33686f3b1524addca1a596d 100644 GIT binary patch delta 80 zcmeA;#@KO;al#fB(X^8L6L%yrF54{4s2d^^ExSfLp5Nvx12^*v1|YbxX~usTy*VXx e2Nz@iX4wQzM#kfl)f3mTOkbM3bMwtaeMSJuejb|u delta 80 zcmeA;#@KO;al#fBq2D!}6L%yrF4-*2s2d^^|9Ro{cz&C&4BX5w7=Yk<t;`e{y*VXx e2N&b_&9VucjEui0t0%5w>7Sjvee=ykeMSJvX&xp3 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff2 index b6b3ec4baf0c69d8dffdd1fdca3ed052b52f8f3b..d0178f421501dbac3424821b480c7e58b1dd9b48 100644 GIT binary patch literal 21944 zcmV)4K+3;&Pew8T0RR9109CjE4gdfE0IpO3099T90RR9100000000000000000000 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 PQtWEZ=5h_SOlTAUVvCDK literal 21976 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Ћr=_*CL)SF7wmo_~yL9iSTXb~l7QLOA{dMcrtCJVh-CI2x z@8evn*ldw$aW0AOq(+ZythIK8kwT9ZJ3Vb;J1q>3j9aY(+G&RS7Ho%8<E}Z>$<D(G vEn{6ZCd4W@lzbx&*hV0RRc5q_g)-v$o_2cM#H-LgWR9INHCu&Bi=z$zE#rv4 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.ttf index 97e7b9e18eef61535b3ff6edc4a592b1f0d6ac71..f2c3ebaec0e7306f4ea36c98f43e301c0a3308b3 100644 GIT binary patch delta 115 zcmbR7g=xkYrU?Z~BBx4jGBC{l!N9;^mXVQ~$llNNmw{oC50I~tky}!s{AA)JeMa?- zhwSFdxZT@Q6VGq+m4Tc21yG*h#-^Dd3QSLySrEa*_<wWRf(MLD%>On=EP5%xXtLR9 Nb2k%^I=9t}1ptAyDsTV* delta 115 zcmbR7g=xkYrU?Z~Lh&_>3=H#sFfcHfWn`o#viGxaFfc6g0rFKca!V@I-c6jOcb zkllP4*Ck8D;`wd9GH^4$0Ln95ua%hsqbJKOh+tyn++4Qc0V9ZxSoBhW(Rj1d=58h+ Jb#AK{3jj~cC3OG* diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff index c36fbc8c2f9a62aece4b582198c2f659d5b738c6..1184295def56183abcff437cd382b3b295a8bac0 100644 GIT binary patch delta 527 zcmV+q0`UFx%mMVw0g$vR6v}kjXlP|&003HG0000V0000a2af{%Xl-<O003D00004F z0006UBjl0ZI{_!N8UeCbe@5Q4d|wYd^#BV4=l}o!0NApb000000NApb0RQ0s1_WdR z?f?P+2mk^A000000C?IhkOPdKQ4mG%%qxQ0MqJwpYTLH0sJ4xuwiVV4YPV5so4enh zA4yK`;J%r>(O*@RBx@lN%PMJ@yAFkl8VAcg(o|}9ZM~L3c8heLf7(K74Q!y=qr<4> zf{{s@LvJVxLt!$^gMKg!Kd2!y#wTa3^H-|rXH>(lXpMhUb>E??zF1X52J%;`YBN;9 zGpl7V>f@+S$4{NNtMOKg>qE4nnlfWAy>oCi09p|)`2e+MZxgE&eYMEavAY`#uqzr4 zgOc$u`ft#(<PGpQe<OcP-oT_z+@qNTJ^ac*eSqyCU(cVLtCQy^zJg~RdP6nsWxQ7v z?=NnvVCrn_hU)mbhjIKP(k#y(ee^5pfUl0RGd$E5^8VJG-S{CVy%%U(C=NOBeGm2Q zfiasrWBe`^)i8dGW6WL0Ew~YLT2s4=ZbYxg=koWEstL@vHVAj!^$iYrA(iwKl9iU! zUrGabxs)IPc-muNWME)=_n(a+iuvFF2mcFMQh*|;pdA3R4hNC5e_9d=0jraeWBvhG RlaXYr1TH*M?z2E;Gyy`k?Q#GB delta 527 zcmV+q0`UFx%mMVw0g$vR5?_1)XlP|&003HG0000V0000a2af~@Xl-<O003D00004G z0006UChn2mI{_uL8UeCbe?_FE7GDoM^#BV4=l}o!0M~sSlmGw#0M~sSl>gxW1_WdR z?f?P+2mk^A000000C?IhkOQooQ4odC%&l!Ru5AUiZQE8<+eT2^3Tp<n+o-nf{_lIc zo8-&r+&j>3m6s%ICgIB}Xo$NGgz_2#OFhzLa<^@*mOxgEbe7zFe{%J#zuIDlq)e+E z<cB9{3O%7T42Fp?2l~Je^q~6uF*fnn8h@eceoEE+l2-W_RrPJE><d*nq#}Ny$~H~q zJfoTiBR_`xRP^L|yAo}cn7xlJug3hbo7x$;8~|G$E_gq+q;Dgu5Pi1DQqa2#^s`GE z3Ih`U5bCe6%&vOqf140LB(7&t2kz0tff{<HBHz!p5wB(Ert08%@h_oSgT1Ee_B>Xr zjP?h&RWNlldP7xoUBehvXZ9JMH+s+9?a<XSdWQSjMBLY!(i=Twr}hln8j3<TbYDXq zyJ!4OoH}-w@~R)Z#S#8p!!5WG|Fk4`8@nERHTEyNhyNPKHXrBVw!6N-0WYB9eoV5G zlKM(XyJ3?qc-muNWME)=_n(a+ik0*Kga3srDL@fa&<+5aRR*53e_9d=0n3w;WBvh` RlaXYr1SWn`?6W{+Gyz})@r?ig diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff2 index f644940d78acb687513e454ba611e9b3dae19388..aa05e142c4293315104e02adac9ed65dff454deb 100644 GIT binary patch literal 22748 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 literal 22764 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 D{o?eB diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.ttf index 9bb362faf92c91475c38018d22b76aa3ad82e7a5..8acb365453b7590425ad0fe65c41a5488d3d64e9 100644 GIT binary patch delta 1084 zcmY*WYfPJE6h7x`VO&?P)*oBaOlRU{gAinMHwNQUD3=0-LNCBa?>AanM(SmP8V4H- z0v{Wo%xRQ?5K!raZOL?*F~r3g%q9UU@7D#hbgPS8b-KFwO@8^_p65I#@AICM_trUn zC%1&nsQ^%`vC)pE*ej6$%RK=6I!#lfh>{6f0C5|a-=}vNY;y_TWq|bu0Fk{0+U4N% z7(hWAhhYZmt9tpPbdJJr0RB*;j@Bk#JgNi;RB~FHkrTobx5RP&F<ktt(bnjmZQ1(= zKxv?pd$7f7*U<jdu@eAy69A}88|`*b1yOHtX6xJqQ9W(b-K&&ZxPmytP_M)8Y7}Zl zjsu2q4QwfMICYNhQ^D(i(D|kRgH})UiK{hn2<?xbr{1J~;3^IEgaIZqb8RWi4Zqd1 z=dK8wW3vuseU!D5ot@p0?az_skX%ddga1!)ym+@*FCGv-&Qs^7N-`wxNiIuP3t9^^ z3MY$>6z?p)DNU5>rGwIkC3Pk1rION5O8+TSmVF_kWF@j=vJu(OvS4{Z`C$2@ilU11 z@)Y^k^1mzVEBmXSsVZr%>aPkYK#``XRJavON}=*)rCE7XB~iVuVpKC~N}Z}cs-CPC zRI94{sslCZntQc{we7Xv(0n?R{<yBE?w00h4Xqi~Qd))fn)XlK3p%N;Nk{a_`T_l# zL1}oyaMp0euxN}o<{4?@n2B%NZ)!AsZkjQznB&ZrJ!ZT4GxLh&ki~8pwk%kqtVZj! zO=5e$URYmI-(!E#F1NSXryW}z#f}cgUk&nxac7#d-4)`JyGC6%T(?~tjXdsqaC4{c zioRbXIIsbcJU^$v+(iGA%zx;)8i=AiGxyyTpBDk`jCgs8*|l<(@`;%1D@n}5P1?8m zQgbj6^at+*e+@1LZwGxr*4OHL*LTeKn$PWP@;QA5_FMK8+s>Y3kF)Qv7B-d*VR>Yg zER#EAiCiKV$rPC+7sxmnBco)543i;po}3{J=^~w^gPbI7#7&xrlW0jbQIQHFBLyU% zB$3@DoP;gzTwVNSQR*%B=6iF!nO@<-(87oF&&}_c-#))>c45{c3dV{6nTECRn3lD0 zCT;!Gj59ibIxtwD^r``q<$L{t7vM4%{RGfvvjb?SVU`Q~Xzplmc6Rlg?q=#azBzh1 zw**hp#`dk4I#tNSE{a1o1TXQ@U>L(N93wCiqc9q`q5#fe48~#{#$y5|;!`jI9+-qF zxBy?l+i(p=QP}%qI3CV{KHQ71;6B`s2jF)+h=(v84`T*q!XO@jZp^}L%)wj~V;<(i n07|d`3$X}>uo$IS0zGgVOM7JzI6f5-iQ{}KIi+_(fII#L){(02 delta 1173 zcmZ8fYfKYX6h5czgaTT|V>0Ih$FgCv1ttk1L*?C;@+i<kc@!w6^g&AttpdXda|Te{ z1{5fZOqj`pjZN4JW9sHM=aR+n!%Tu;<+eD*B07u6vV=}|3GvU)&AI1%-_7~%xjDD3 zk2TrHYTMjU3jif@oy>4)W4{ByH4VTjl^-$%Gen$5KrEr>(d7oEZaTo`0$7Ow@U|#r zMg!%20XY*idMdSb<*Ps4V$l2nfHPI4kd^tT9ey8Rv6pg@DoU^eJ^ZM?h~n2&I#cab zW7OXOS&NhO!bYuLE}IYiatdHU0>FsZ$!ZOZR39p^5Jd}uD`h&xf+VAYHbezC*bI83 z$=`<`4d_W9;E`>pRv0=?x~~Gl<TuV!&EnQ)yBJ3p6SPIa7z1fpieMx}D2er<X`p~I zumw_I5sd6!=K!mpbFp4jWF4yW@?yOa*q-2vzRV2)X0da(wXx;bV)L*wlzO6d#kn0D zIEgulM-%TRMJAm{x}N-2au+v*JHp%dza`-rc|*K8ej@)&N}ZrdFe!MJx+iratto9a zy(L2<3=-xGhlKYtV>1V`_GYzZIkV%l`?FU>Tv4~^vgna`i#Sf)F20|WkYmnS%&n0y zB?lx{3CUA6<aOtf{P6sw{QCS)^M5P|EhsE_w_vz1sIaZ@=fY`epp+}ElU|Un7Kw^J zE1E41FFsQeR?<;&O~#V(WzDkr(i!>7a;f~R+*QUc>r;3rVibBsm*Qf1Ncq9?Ic1cx zU-^sjwu+&8RV7h<q&lm5tmdm5)#ueuG=Z8(O+&8cux3>AS4CvS2Nk0g54AhAncA;) zKDsuYy|S?KROO7`pzqcHX7Dj&8#)cwtM*s*RxMZ8S6?%x7<-K_6U!82dYw+04rR^j z)359)=ESUkH`7TOxbfcB&gb#zuBR>!Z{{(IJz?#;QM0x!{(~&07qnVi9@a9<EZ3hH zWuAAPHa9JW(QI_-v|04{&4z!I-4EOg?tAXL?mO<=?m4%^(c)-w9C6e;>Kru=qeErC zV*k*7(%x!swjZ-=?SA$Rb{1JCOXME8LoSf><a;ts#>g-^N4_FM<O?!L28e}pk`B^N zJ|?Z?IH@Bw#7GpRm`F)35tB3`AmJp8c#)m#+2z^U*-V?zCb02r3AUh{gE#wT-k1rQ z**>#v$~L971}`7NIEw<H6qMSvr^!KGakbob3*aI}e*hfU=>f`qhZ_`rBBNVXb$drw zx4E;D=IhpDetS8<y7*+<CX5(oGqIh45td;V?i~N&1?*u)q9+U@8@<pQeQ+agLJs;u zAHIlw=#K#yh%e!0_!g}29gM>$jKNX33`3R^Y>Z9DDCohx7>(~>4DN$RxE~K-EXH9x zCcx*I2pyP&$;d?>@-YPk(2J><hUu6A11Q8y%z{qnviN%8IZuy+mFn<_h^X;P6tOHO H4sQJq#z?pL diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff index 8015b825e41af83fef09628cd6b15922b58a85de..9f8228fc38b5d404b5573cad5b33f28dbfb47cf7 100644 GIT binary patch delta 34387 zcmY&eV{j(GvW;!q#>Te4*tTu+i)}mE7#rK%7#rKRHrCzy-uv^q>eSSnI$hmAW~OSo zJG2UHw-OBKsVFH40t)iaQg=a+{w<)$iT}I*FZcgVQI&}m1SAaQAFKKgMiPBGn5Oo| zPX9PF5D>6g5D*9x57ZubQx7*15RiD`e;S5=;004d4zzHxv<Cr+WCsC(i~#|G&sfFS zxV1EP1^#nRUHvD5`9Gjo+Id_2%R(FkB;X%^3Z?la1Y%`w{4YRo;6DxLe}UQVu50y= z1OW-X{kJFi2MSnBXf!K(H?M!X_J7Iz(?J9-2Xa5zIhy{{1@iynME{FZ_L?YrW3PX4 z0|`JtfdAu60w#wL<X~)X{x560f1+*>5U7oFEhSqgM^`rxkR%!q5bzoh5NK6w)2eVM z7xRD4asB^-2K+;Ga_q;1*Lrt1q@S*4w%|uEG*e{lpJa2CNs5p$9C{?~25|er$^(^i zkBL0FjXk7RJ~`Q;?kTY=2Da&dAz=4Z7x*NC>IvV;IUK>Mo8Zg$I)&ylzf`Bs%;bpx z7?>-_Z5IU;1_h2HOt`QGRh7aLt$N<(rtVE<4tYa)FHZ!q#wvQ?E#F}ZN+@ajHEa+} zd&BF`O?R%=<UnE2GYODLd)AUvJ8)7^7rS~)Xkjk^;=b4xXavEA&8z6oKR_ibtM1Gr zG8WWIjw;tXtyDnLWO_6OnkLiw%A?MK_zxZ>8gl1Bh{@{lIT0YmIq_7|O@cX_bBAvr z9@K9`pYt3uGiGA;X(K@aIAM|)rV**J6lNHCKnofMs&Nj9FiHZ4P4Q4=5CeL{lO^@$ zYzkSmVBMP4vWqCtr{R^|6u2g5L&BLGj|3^P*j7Ml{-wnFJYKy`$s}`3w&qVC*YMLQ zlyzr4Jpm<4R{ya!;OSNNy`nPzlRz)9Wtol~0xVz<@^&LckjyRxAT|b%ff|y7g(tbn z?XfYv!L{x5_I43(Po%Zch88!Ci8rSsNPs4G&c|7OKKGarC4-u>4UF;n^;sqFp)gVL zZ11W99DTyB<zn(J{jTA}MD8G~Yq3<%c?bd$5}Qt8QysB<P`cAH>@mgdNd>33A1zy5 zCPjo|E~4B72vMNC{kFQ?ix7Q@z^nY)Z8hvY(H}%;Y6~Eyew#>Ley)%`dv^A@<W@0m zLrw4e76|_P1CwG56BrDy1|$YA{L}rn>m}xpc$Z=m%yVdNd2j6}MX6Rx6p3eM=m4I} z2&Wz?<jl*Ea1e})hcE~;C||!;G9jO{9nf}XV$rN4lL$eUl6$&hp8-p87#+4el@Uu; zLQ@B`Wyyyl{SSEbGN*H#O_Kpb+FyOfb<y+64j%=@D(@K7O5jl=9C3_|Tv0a7abts4 zu`+#t6E|r)0nZGMOUgDk(H0jveNy!IqFOc?el&$-IJ(`bBo={e+_W77f=)A;18uw# zyJQJ2{<fkPg=S^Es>oQfw6ja;8~mLzUUNF)Fb-Pq9NPi<yMxTCWNGkMX%u9H)INFC z3rund=NEFz5b$i{{Nj1!*O`o0!#vyrYKX<%>O%>zQcvfRbO3v9l(;Qn+XE&ud2^>U z+{71@bC0SWMoK3F2W>a?maq^cIG75nw4X4sFnxLxbdvd(tC98yCr-Na{g<y}*U?8@ zd9AKcdn0=~y}X58Qm*g{0S($gRKP)D<-)HSTC8Vh31D$(ZM`I3oah{-x~onNom>yr z-Lcyah00$q#lOObO0Gx!*%k;<>U8XqE-Uuz{@v`20U=tcTudkmG)Ien_f!>e<!}O` zfo?ah9zd$(XkOF;A-woTfZ1D<O?*YV%oW!Qr2tM#yFN-Q5#_8b61jvKKcDBppkMdv z>39qkE>QcC9EvMa1jnTRZTZ{fm<^}g>##?t6EA95cUCthoO}V>VdpW=uT?rbhRfls z<1|4W4Za2(d>SQ6ZYKbgCf4u`>NUD?72k%CD3qziq#SkJzvg$CI0XeyavTF1|9a~l z4>Q8*6GD5iy($Govo+a?iEa^!v$LJkgIEe&Hc*)+B(TBN-Dn<ihISVKT|ojj3447R z)&i#~0W&b`9;BDMxxQ}mn`zT$|7D=XfAZ0Wr2rR~2u}`^!M^*Ex2t-Mb6$nE7%kMI zM`P;fe5qY$+J=GJEYJ$S>``XRhCM9+E=jd<5i_kU9gGp&$46dTxDrt8tcepXb6&RO z2fV{CUDpz@vKYx582Xym4=8q`QIT<B^Shz#gUJW{M8%MzLzC9f7>Rjko>FX8Abwt> zcI5YPlri`gq;vfZ!KR=Kn4X<hY<<E_Maly}GFn=JwB2-{x!K2N=Pd2%9aMY|PKqsG zK1d=`tNd&pd^lCqN%)ZsU@g*`#Xp{>0_w9&FU!AE$2_^epwy~yu7n(SP_bC|Yp-!= zBxrK~w7bopa9YK!0w>As#~#Ag2jbZC6y}k(_bR=L%s+(8<u}~CcA{$^Ermm+X%;ig zyW4uN)R-ISbZr7jH(jK6oy{Sk`mG^BM6@*medlq>_R;yX7d&R2uMCRMI({mV0pmx9 z0&w3~m5zvT%K{4OcOHMd7s#W2iR1$3@@_ihAu0=}z6Q#-??X62=(>K?R|uLa0mHE^ zcLmP0KXH?e^;)X1Hk|w76W`z~72&O2yQa9G-GxR^QmlF|^s$orq#l*K`rh~Rp3f6Z zpxy+9iCzPd5rwUc;f1OMZ4oVWfU5K@_qR%-GW|zTq{5t=OaRnK9|+NF5v^Qexk0>I z7Sy~*FFhO88v|?FUzMYCoI<3Jwu){W*tK!86ndk|HZ}u2<Ty>$mf;V!Q_;|NPXq`? z!^E*ByWSoo4h=0WZ0fqm42Wf=!vGST0bxJ)OgKL&G8|^r-@;y*xIfz&fe<`#_bdg3 z9)6BJA~1YJtgE+HEap&Tq#WG1aSjga3S-a9N|ZquO4<(vR0Y%*C?P(!Glvk&Xk@WI zhPXK9$mkF<dki8VoxhX71c;EN20Q9eDx)N8vMRga&dpM-%n6bhd9q$X6bjAXDC40+ zx(w54JKjtC6vx|om+A~~f#4(88Q`D<p5{;Uf-n5tC{RYnQ2@g!Yj6+;a1)RO#3utD zFT0DVpmzFMM8;WPu{IwK*@q~(s!Z~r(m>SKC)mR;VLGl1$7xAX-5TLcXIu9Tsjx3M ze8Fgz7c3<l2ShNELG4dzT?o`$?m)akq@|z20_aV1Z>Mv`Z&{$bK+j!BBazn)!OPKm zW5(Kv{ZlFXY8}Q5V!%<l>RRp_HS#qb3|BC$Xc4A6WnLkgdrdEj+$l8R)Db57)JsoN zBwGG#D2L`5UvTr2^vCxoHRGG?lxV@>4zHQEaG~27{)_azLgXMr_rL3I{g}%_GRy(@ zC11GcKho~A|CA941OfRe?D2%8Udx%fxZ_&riJg@HFhXPF`*o;h!ap?JFD@PvPW_^v zVL)R8WGJ2>@Ws;IfHhBvc{I6eeTA3G2}v3h?_?3YbMhyP;&!v(CL#l9(Fk%2a^fJf z1XGB|8wh3K34Lze@U~<|Z@Hf9bM-m7yRkQT^k~KGXz+If(TIuS>j-{qV;Q2a)PW9K zgM7gLmV$Dyf%FGxuTzP``oOIvae~7d3Bwli5x@p9(k6mI?5^%ENf9VnE1-a|CTfqR zvMP)y!6nTNgx|~Y>Nz*6oL+=;hRTSM-BF?qJ@YyGgdE5+@=8WVPKZ*tSO{KHD@P4< z$VJb?N#r;I@kZdLwFBrp`kLQ=8$p7&b4K))^@^Yi{v9Sk>yLYCj0ZElZhYZ_1iQ80 z<!^)y{li$uF8s)fM8C;Q!W?gRl1(!$+8F{?>l8YqAaraUPUs`&dk-V(?&0ERMuV45 zkiD9kAGdhEo(4gSo=v)<I;l0XwA~7GswFS)tgg!s%p~&PT}7O|OVN9?>uqtn6u?5C zqAT~@0o?utCx=G5(w#z=^md^L5lT}e?6^3dc5-Uq4RA9vC*qO3f|L<bAXkoV>#lG1 zx3jMvp`d;ZGDA`tReXWHN8$$Ws_A!zz?J+#m85)*s>^~>l1TCc>?l^%0~NxF?ga^O z#)1?J?2vZMb%V+6cEJjUNafpF^F3DUE#{HVbDtFi=O(?(<%&Y(8j&F(;OXvU-O0?S zJC+JZ0JXf0UDMCA&{ajh`ukhf%xps*Q$Ux##BNlMHz1qJC%d})t<<2sHDjSa12I0= z5bk(N&SUzgR8B6s>5-h-ZV<TbESzqb8gD@~aB^hNV%-{&{vZ`5nJE9)p-E*2Srbhu z18?TQtQj<RyzJr6spunyEdt8O;SO)>Us?jpLWDW9N6_fn3T5Y6A#=J?kYsZrkk}_0 zPov-=!)6FcW(VN7B#BV{b&15m1gX0nHA<u++)c_CKp1ao08xYdAf(FR8KluvAFaMS zur0Qh6bE!<P0YWZXpjvi%8!V|Z~~hYx+54pel*SaHp*><x%sF&zp_i)m}9TvWl0_u zeMxKlC+vsY?jAP8R1)l@QTzMi#<mE6g2AB^wu6Q5Z<3H-;5;0wN#eTRkz-%D_~kO) zQUgea)+<>4>L*QSx~Oz(D~8nVh=vy&up?7!yn5^uRNN@vO*2Tj5a9<Hw6#-*=~)Ma z5^R!_K<LbJY+@_wF=wX5=4GT8CImLJzUx;@nZlP)RyI4I46E-_rBOu&)K!nf_pru6 z)(nfh%S?{6T+I*N8j(={$+&enbCX|c0IDM60?PLNzmYX=Wou6-9pZZQ;+mlRK<x6b zI?gKlS&h7y-+!-Eex;1IlROrLb6n$(nVBX-J;&80h(oFVMmMLjk3hi)4Sgoo+i`R{ zc$1P!ULJIz2-v-xbTG(^g$PF^_;jJl!Z|8Fm<+q>y3YzphI>LED!=q5Q?bT+GDJC~ zrr-459={rO?bYg4_+%G=8*cIG16G?AgF)Bdh6)d~5I11-Nf@oS?;wJ>;nS$I_IKDG zFWSJ&SvEGmq^?_azg+F<n8E3DL-r8xt$-;CvN<){^0{gTD!)_pE+E^d)y0vC=RVYn z>dN#yRZ*c3R$~mQASf6$lxT3K-`*>klL!zW*A%zr<$EuNv+u!)GMr0G0!_mfqhB_? zUT^=h<C#X#cLZe_#l9a?o&O91IGMVftqzQw@4x+-LXlU*LTeJVrBWqCz=K+gUO4)! zGyggQ6bkZp;V6h_*r;+A2estvcz#2dN5A8Z@4300+rAE8g6ppB-I>@m;KDI7bapIo z-PVmG4-)YIY5W8@|2UH51LkQV2ceblIWV-3qDyp(PvSqX%C_8~$q+%6V9bIR8Mu{1 z*QN7l;3;UD%AJ_gan-3;PZa)M+A+|nCGW{RrOJaV!gcwMIm*U?lPDg_N$9yXs>h+^ zh#_rEy6s1S&yQ@S<N9tMFEN6ceDOW(eTQiR`{m~PE4yr^&%#cC8EBS0BWyv#{dK+) z>rexS7Kg+e3Z|6l)bq|~jAOCK%)iaLQZ^XP7mWWs8nSoxdX|ijfUOVK{OfWYR-jn9 z0#jChO`5_D5UZ>|W0ix=<+xb#d1xnqA+*8o6@e^$o9UQuCkVXw9V5-pYM5T>Bbap} z8^cY4*Y)i_G`I>n3LMAH35vCT(I|$>ClKgnW?^5_E5P1sZ{Re=7{6bBL@t=sB!0Px zG6#Q%nv0@f!eF7H^7uA7^YUQkU{7MPn9kfav7?3b$0~u7+C^uij|^6YkmNUk??+M6 z)dd}cusL#nR6@PViuU4KpK>37XeaS2=d(s`zLzVMu6q1f2hzyw<wiiBONuWG|KQ_P z|6$AMc)m+@Zce@~*0!`!{la;2yx$`y8RH^fV^Y^x@w<l*3KK|oTn{2^M(#qTx^IfV zGL1|r72QIf%9=6~dqIyr*^xJLe&=Iysz9$t5c|qgz}PtQYe2T`_dLd&c+AW3u_1L_ zNW?v~Z4CbJY@j&BUek%ecR2h*wJi3+3$Yn<Z=-X)Uhc7{eeM{NdSLT|%7=A53Dn8P z-w|GOl9ht_D~A#x??(|SRh*z&&C6|dmE45mp<0Y*7wwaY=H+*2;`{lHt-jOaj^XJi z;H>{3f!#OoE0lQF{QeCU{WAe)9@VBCphS00#ySq01-#;Sq-rUE#4CeAZ!Tvjfgoqt z@_pN>Im%CoH`rkni+w%OlwcP}b>s9tt3H%Y4#$zJ?u0ZNty&GlnR6kE@Sp|RGxnFw z0D~I5I?o(CmUSqFS$~A5^3LVAhVuB{opwxu(uM`7UVj~ZCxham4y+LJ4>RVNa?>E( zWuF+L0k5x7{jgv81@RdG!mS+p4bGr2rH8*V5>S2k=kyyaB!MWi7^degnN=5Z&Vs@Q zXb6{IZ`XAZqKC?<sZa$z425kLB|DsnK=!dD)$zrPFUQ<aCwd%sR4wR07=p>7Ncm8X zNrpWQY@XQ;i`qgulh<S!W(usGdkfm}>w?QKU>1yOc=5OU9Y+^%1P1Ek?Lvab`^pxO z3ICOSvh>^+e&M(ZG5nlj7$U(9cH>tRFYH{54miDm5~t-Z4;5Nv8ETLZ%5AbYV(9Ni zd*m1xAX-)4)wpKOZ9C{#NKknqYj19LGdmj#`dm=u3N10=yzFT1kZfs7z=`pYAzTjy zUR;jFAc1ePz4*2X5!b~sWRzimUUp3k95Y5ENnW8yAV?mF8Pn(HW-*bNr=p5aj66MZ z0>+j00Y84<nfaKxfAq_P|87nop-!2sX}Fsk18fVS#+M~kbzq>*5y@UUJUSMg`;P&s z3pDvJ@^YE{KL(%~COYM~f^??l$4eoApej}=Hp(Vft79l4tnJ|3o~Bos@speV0@hwn zZ+uxqn`}MmeI{kFxtV?^6P~Bj3m53UC$$?6Jf5v6xJ(&M@JHQ>2=Yek!rgJDy^+%! z4DxPvK1KMyGkiF=Hsq`{x~i9Ao;K%1v8&7J&3e=*3b+o~I>cz@xiivQBE2Ml8d!8E z;)f$tgn-U>5=m|=Ojov(49)b6gq?H6?!#~^izCJ+7wO!9J=p|e{wD_FfJ5_eS2@F^ zt?x-Bo#y#5^KyGbMsjf|$9!#}%z_09C*^@X%@Q_h8!1A5MwID(a>pkrvvc(}`%PXR zb~V2Z{iTUB?C@2qU^t6-1&bKqj_bgL-|WqclKvJJP)Oo^8@&9)hMn2be?EJqvz%*1 zNJ0=+T`OElCx~jjB+x1mF}!{oD^9t7KzO4aBy^ZlzVZmZ)h%GSJ%cU*tYKV?aMK_% zgMJh=9lH>2X)UW_A~{cmJmapKvieEo$VrQOJo?<JD39!<yMd=gqcj(I`LeAgUQ^el z>QC!uJV_lQRpj-o4-m6R-K(RdX|f%%xZS4@PXE5`?_Viarjv30div?*R_k-p<hE2J z-Vm?OuC%M#*YhJY%*T{UF8&u2BkatF0%Y54OZxU3Cq!XqzOaE}0N8zWG5YOi%^wC7 zBx4MIVsbSl#W2ahkU~A6o)OHhdaPMpkZAS9s=Dz2(bOF13rZp00Sq6Z)lNH>zvaW2 zjx1&M(dFrw5|!<#mR?l#Hu;6RyID7SzgO6}B)a;atZA$!vYdr7dJTIU9tU=^^8nhF zHp_Ldspwd9!8=$Wc~|Cbo=y|e&Y9GH-)G|Yq~T1g1cP6*V7xTY{7!XP@$8HZE3Jq< zLnpuY0f|C<la-Gszakl$F&vY^Lamhh?0gM{LxCa2X;6#T6qTb;>wEev1d2@NDLI2g zL=-H-qp!m$FRspCU@tVLKU|mTo65VqQK$Nry2c6=7b^nBoF33_A{cRs=@uiLWu&H; zO2du*A=0KKqr?Y<-z8`j5UROaTKE~F?}o;kPYLAF0S!_%<NI7)UR~%1dEr5x8i<n$ z0jY<pF5P$H)L&dOlN$~_WfO47>pl-Ff?c_*kd-=Kv@*Q^BaN4R_zuzceW}!&*!dFA zT=Xy#Q;fP_48A-U4)jX=S*Q~EOZZ{f&+PDeh&qNGxsDjvvoi`=1d|Wc*Nc8h5VWyi zTaF1}AWeL^=v5J!UjNKSd8)(~Kio?Zx*r^pg}%{Nlq|u|LI6wLQS(U(hT8nT^Mj+g zx;~?LOAR!vgoqN{JMj$_I))RHSl#mt+h!0-&&r&JOFD=1-Q<|^mFTA4Q2^X67pU~i zW1bh#j5-3pYe7hZxVCP-hpF|fIi<;RW=2{V$Qxo^-?<*B%}!rRs0YSOg+7d$(fpsF z2kkp3t84#U2iQM5R!9TftiGj?j&JG^K}FF5yMsPx?D}PO20-npHI&B?**h&nv8hXp z=G7g<Xt^jMK-%=G+@2FID8V}m)gcx`*3t9?E8&4|a^`wsQb@!)wivluENrJ{_ALLN z_NX&3$=dA{9L+0C@=lza3Q%|7x?@kc$KX?yp0dA3*_@38FsVr|NV$zzH_UR;ai0Tj zsi~6`*+|!pBr3|4`N#~{o?ui%tm$K_#4DT0@9bg!Dz!;0c)dp`Qo&f>bMQ&{rU!Fd zbrQhQQH1z9pO$6MRMoUWmt-Xw&+iPC>E_YXtLVAU+lh20*wBG5Ycig@QvztXVAY?v z`^k6k5M6d}2xO%l=DNe=%?JRL%;SefZGj3YYd3duZ)@k?wJ~vyI(mg=AfrxK_jR$o z2ECf|Iufmq!mr80R1+06SDzp57gM2ykuAVGlaXb$^{jm_#5kq(9|&(Mj$Ycsy}5(h zrp9agxlZ@d8Kf~-jSX9MzZ=77hBEp#cOx+qI9D73LOv=Rb98SnY7WuhI`t^^auuK| zhndmFIk6IbMqClvK?e4U%+Z)p%)6N7+Hh5>F3VGWpPBOmME~UME~QZMX@wJ=eWm~@ zNbhqaGQ>4A2SMr~b&rZ#W7F1dmiJ?I5|+LZ<tuDoO|EWh|K{n+%~C9Gl~y0rA$E_@ zX+2p*;(*dKMHMojczz@;Pw5$-W@*n)lh5WGv{{WgVX2-fiT`?8)t^Pv_;VLmCU(EE zwp0-C9CdJ@ZCh(WUK2?DV5pY<h~fuqz?_f_?&l`3nL5fOJRkeSaDrLmcN;*9wTa?F zl!jd~A$AR3Z1vZj190!22paaEFmAL^L)K*;R!G;tI_eE=Sd8TWDRpvA_k%ubmi%kC z7pvIPD#xSl8eA%wdHGX4a&zI{38?Y0#q{5|u1`=^bh9TNc<wwvR+R~*F7$vm8k#wF zmMh9SXep6mz6O(8&l1DypR$_|>l~N)wcV!@-^;#ti<UksIDU_|K6N0ZP=V!3Rj~u6 zit$>ZZYkx>@w2PxyW)-%xL5XM3mbs@iknf0XCs0?5}E=eb6Z}$c7If(Sa9%H5YGFW zWz3?B^LkFg(Oq0|<##KnnCXGOUv+px<UhB*;nwcv3lq=>{X<II2}MnB2nn%NLrlO9 z7L}N~SGsmqKRe%bWJ{|c17^}Dc5GfR$RWl8q?AJA0r4^r!4S7(Qljgv{e7^JCiuMa zmT9)T!TNf2CwA>IsxXj{G9GWrHJj?7qPslE;aA~JID-@Wn^SI;T4O-VPfmhCF-cEd zsc7*wM&m4Yn@4k%UrW5lKdWlOY(4ok#IB-^W@M4updQ3nWV}qgD2$NOxQik~HRpSW zb81}p(WxY@m@SyaFZMeD^CPI>55zNw$g!*xWGIEl`#AAajKq^v7ir^m6N%}^gs2>^ zW?T-x^2v^Sr5)l9`8<Govx{(gfy9olOnPnJ+^9&w#%{&6zswvMNVzHHa)J|Q%fgKv zAi)D-tf^0H29Cydj{u{K*809`Vu+!6^rX=nbGnYb*6$z7aVHMkuBZL$U(0??f;<KU zgt+-j>(`No2KKYwUG$yAHK~s{*I6DvH~6~F3|qCPo>YYGufT!gGWLUY#xVQfh`}!c zJ7O@>=uuNHM6C1kk?%?noYb#UUrJg*w_Z~u14&lfe#%pvbc=${@z5$?a2)BiCL{#+ z*PcCR)3JEYQCDHc-d`zZ&j%KN>fP)jo0HMV{sxa~k(}jpK4Mvznk!zqXw|H+cej{F z1OYN7Nu@1YcqxI%+XnD5kp^t&Va%=l%wPuIM|fjK$Y(e{ExaTGRY7RR<;X>v^voQn zvgw3*ftEG-lutVJTk`&R=VxN_?hKlBk&sunlYLB=_zbIOi9cacB34voA2>_rXmCjs zKMxGxV>Xq7?pG=lPIJ+vyjf+qw|c}oM(0pK{CoGUz_)>0aE=U1<)bRn_;OI~&L|z4 zAvixBdWDtH58DtXaCV;7%4&u0L7u(NBOvPndGt<}A(C3f`m19vju*)z^qE@q@)nj` z6Sb$z!1c@AaA}EP+wirjR-Du)OAN?V%w*ZAisrOR`ci-1UyX7^JZ}$i2Y8$uGK)-H zceGtJh)w{NY`<<VV&fVeN#5dl%f7We-w{uY5`BKTJS`HFzkj#`YWG{h6C5|OqWB** zXdybN2?T*JW7mC$Sw!YTMNF*~Lwvg6O$%Y-o2?YdXkf{4A|+BjX$7R?Fr;dHj4~}o z=WsptxB{adJT$A&_xu}$M1OEf%q(vzj``p~+$(@9$8fmRnl5l1v5I_cMEVLdEokfS z)VTrHn901N=ex)<@v^K>nI_A<1G7r^=$5mRNZgWMC)xoEJXL%HU?OxLOfJ*5IcUi% zSkFLp$bIO?w9br;&+}_d*y3OUHjloR_f!+)NPNYMb89q<-Q}48C{hCfJen<ClT$>f z9uZ)j3^NE!D48?<=^2k>?0Hdtis@11uOIuS%|aDR-|lbj6)Qdqm0~{QjISS#y+6|0 zp9xU|Y$$rYbI$mk1O>aXC^AN(k3>Hcf8S*5$Hj!Sa1aeOIlhy*3f|@(zEs~#M?7VD z4UgyfP{dX`al7wW`0T-#k1+q~ypzJ3zqtjve8kA;MAswiY&2R1Wh#lw@NzPMQ=!-- z6BcLOJd+XD@fvo}F|UIAq`jgFbJ&nwy7l{_t_O11%r5z46-=4c1hj0bUUd#i7%9Ul zw_P8#u(ZH~_1#wAzdU?~zBuT{?RZZTF$Hp!Wlz!?vc`hStR%#M%lB!bp`0M&++_kA zoYrUWAZKsZ{8-W2P$_*6@RffN=GB6!yEMu4RvnfharG14`ZDgU`HSN%p#@!IeIh8q zCU*+ZhaZM3l=8YzQrhLfpsaM6TtA7g9{jaFhV*?%_C0Q)>QY64kZM@Sqr=Pwtey>U z>_~^^!EfkFAv4Wrmcdo&3hjpQE;9l#1)Uv*%o6;3rqNjH?u%|Ft?ICtBr2CjsPH~1 zy%h6hTYMUDuWTDpUtTT(2*IJBU^rk2hz$R}zy48kjxQRgT&5N`W5_~+sJYWzhF2(J zrtt%hxQKh0@9WzOUAe|L0>D>lSvdWP=QItuW9nrzHR%4S_+dFX%g2_3n#l@0meCeM zt~0C$u(mW4Q1m{8@vt@SvZ+`Ky&SVyesW_*?!4shbd$=#CIxA&vsPke;m&myF$@#a z>USvAJlwQ_>4Fvtw%4kc6?M(47wVPwV-G;*zP&(pm2+ajk+#X{N5Z&aGhY9AT3t{; zd{T7pR88^evFvJ6+Vj_G={^IlWEbcBbm%w>U!ab+cOcLg@&gbrR!qys(@*9;-qf&r z+D;oV6;_Al$*44KNYZqFbaBhOY%%;;sms=$Q=SU1&Z;%}nwpiW;7IG@2(-k8r4GfD zB8V-D<(ZoO^hlNIn;oMRtGrP}!8q2M(9s=gMfX3O<Y)3}b9bQE5*GrN#^gvr5pJj& zMi0kM<sLtMWWkV;l^$_C(M(!GHWZudy3qHT!8_M|TG`c`q4-@k2tvP8PfFD6CkR~= zyNyg1@4D}P<jmi(-Nw`aU~$vk<K8G-3h_s~M5fxsMS|ekR}FK@ntjjQ&qq2kK=th< z>$%8R^O6ob+n1or#%6%Dkv>P9UrtCT{0z4#`6~k8<;b<u({izx50ydPKlyf+Tz>P7 zG#q}dc+$y2hh9a?$a(7vtP7eSjEi)4VbXz9lre2C@ayjH>H6C>@}%V;J0|}&eWyFR zA73+~7_pb!NK38nbeX}3ZUJ9Iy_n)P<o5ZhNbB^BL&ri!7lQ**?DeTN`cP*}Sx_(g zgA$FL=0T@BN{csXn2CpTi`_koax)Ra6INJai}K@<-uW&o3Qz;Ec<z%ZioC8LV4*|# zL0)N>@H@dgTP{J_om>)8ich8yD6A4=&`^8ANrQMh_hP-|=g0{W0!48H`TSub&JXIr zAJ!$(o~N_c#m;~NdvXlhl{l?zkG~ZD5Y~yVP9D0G)k$>`s(K@&5F%tGjg_dzP9sy< zMTe(2BD|Y+2@yXabKS=WEh-===%SA+hZx}kMUEmx+kp+IVLvmcE2aN^$KE|XsO#ET zqFGE-QX2-|i{ym)y8d;&A-z;5b8(hA${h@N+{}|;x!Ztk1FZ+GCvmk9kX?l(H4iED zG19Hmv)(ukT`hg<n_eAiYKLiCHc2-&OGQ>pBFc+T$TC|%Dv9!w`$jlaHdj?f>Sn(| z3pyJ1&jS0=P(akf>DuQc_Ce%l*iXeTZ5N<%@cK#{TEWL}1*;dn0=PowEmuh_Lz4iJ zCM@M&pFu#A8aSpGtJW^uG-j_HINEOU?hS0+4i_!-qn7&kVA$iKs|`4(W$^x1K5!9N zjLiHo^T9LQL#JALM9rSBx3A3~G9{TL(YP{1jYDCiY`44c`yRhcni7ny-!8q9b7ro% zRz)3#zX`1Wu!E=af9SdNO>e|%r6zBk3NXFnv!MYOxJGU(pNoxA^hCG9aC-kDzRgBQ zsowT#+^&wyN#>#t$Ei#9n^ImiA&$3y@q+f5!~JLuP`+ehDCZ?7N(Z@C`b#%X=^l2t zhXjE-<Gusa)`J_EU4jwlldQT@z+c3_8uXchYYDXel{*R1W6~&<h7k&=OC}((SCm+c z>6rq0OTp@2U3C%1gkEqwV-dpa_-|5wusMg!Z#a@~!m7ILn|%y}87oKZ-6$JFN5}I7 zJb8<37{Y3ga%w)0hN(;A2l*P}G<{q+`l7=!t{zf1`-~uxdJ6TtOAJ!JwtZWDZj5G% z2OUCAiE5CRm?#bOzCQQe(YmNLgU{YNzzPA;C>geDiKs!wGL~dEtE$8Y9#&8(+F6>Y z8z!>{r`Hh1aThA}`^h5fG2!0)Id3dHHOWGJlMJG{)`^ys@(%T3mEl<t3W-ja<H#=} zws_}y*Yzy4CU5<I99)jSG(RibGK=`g!Jj=zF5{Q>6m4TY36O?`pIzDE7G4<(go6UV z$=lu$ENxSJZphg;VZ^6*n~38!HgTzEslD26p`{R-;&{?ZBUS_@;@qsogA8)(!`K2! zlnRI8MnY^Oi=Er}b<n=UAr9Cpu=|hyVhaYg?pSZE5cHh<py=wW!V&S*nvcN3qJgDw ziQ=P~5Y9dIsX`R~60K2%-(G6W{v8XPJ?zQ8uSmA2N+D+4ky}agchKhEy{V%&jDmmK z>psGDK(;Q_HS9&$wU&j~sit3AvsP~=c3YA7#N6y+e)Oqqw=@p5qYp3oXmn4?6ZnmT z`ZJ?XEzDFFs^`K1FEdJF`j5nKf3NWTp1oCA6&CsTCoykaeu2ogZE-6S?wT0joK<z> znBpfpVtXq!VEg_!LnwTaz=b1Fe(!z9`&nSB&_2o$ED`tjA;yOjJ#$d71gbO?txCdl zks22)dgmED?f^6oE0pe4ypgz1??$wiw~pH%G2fo3*U2CdIJ&^AzXRPpU$mJnGGXF8 zCXuNQI={N?eZYou%UZiGs)`_hTg+OHp+oLWEE9x{cd}sP*Z2S*<H=3nA0{(gvG0%B z)JDU%wYC>W+62iv>?uVgIu^;dMMZRR*8t<&3Tu>>1RIjQufU)bEny7!7E^Jyr*2uW zA4xzE*dvWSI)N|*cU96rFu+md<Bd;yx#nWQNzc<@*!NFEdf>&i%eOahB+xg1PGEUW zpig%U4fTdVGTcKM{Mdg!8Nu-$H@&1w2=Jx!#_(DL4qEX0l<BO}`O)s?LLesqqYyig zq!T$pHxS}kP<MFCvxfI>rS}Q!_3FM2YU1xzpi`3gEz3QHxQHKnC^s9bbycVY;LJnw z!s(})4QGJ&xL0Xnz;XqU>oa7YB%m*inn|0Ph;kk#F>9h(fCLg2lA#R>IU|7Z`*D6J z;N7)^1@m#Q@0uP11jdZ%lkZF5i|*H;bS!_;@7ALC)OtqYXRizq1Q|E_7Ll+y0Z-09 zGc(NyP;Q00`mA-%PkcThW;ck*zgD{2o)LYZr@Fa1m;Y*f;!Z;V9Zjg!*XBj08sdh+ zSp08`aOOqixHndQ)GeUYNh@B2dj6={zK%b`{9WY$-+Dg;S5V<?4pA5N^_XTn1T+b_ z5=|s`LA`}nmNc0$OQw__vhx65srA!PHbUPZ!r0b2k$m|B#%*Js<Z8Q(&~gdmpa(;S zCfR~E!#3C~NOp68V;K{y`eT&1aSaXQeiW?wG7wVY{P+_Xal1+%Au(1&QB+N7S-Fe! zMCx1VSl%iHJweC;-3GEM1HS$>u>-B*AY6%08qynulQZ3N*PzhP!Fd9^8nwO?r7?YA zOWO##I+;1N*lgrcnLFWd3TM;xV}eBqE^0k?bqjB`gtV~0<Xi>0=9?OI_r6RISe4TI zPs*{4JQp=xy>)&}q}m;s599)Y?NqEJ0&lfA3RYti?cd*oi4mia#Q9GVx{yP+uO^3L zfborO1*<S9120nwx6h^wv&=Vn6SDXNjF=Z`vLJxRck&OsZwAZMqV+pH+v0k-)AObG zRD<b$-TW~id04#05lAB0CSocHB{EnMy+8P88dAcJAHEEeAY*G<55Wk>PJ2_En@Kz- z+;10vC#{HX$um1qJLBMzLqa9qg<E-*?#t$cQ(|$Jj9NsQ)CdwK`2i`}2WV36Mt;tE z6xkaR6S2QU?*1i!AN3Go?euR*d70*~)!+e$xYPt7Mb#`ehxg?Cln7hm?In^l4Q*~P z=3o1OijrPOt5Q)KOzqTEJF~<ZWP^a1I!EtOUC;*CTrrqcPLzJko?4#d#vOvRw-bmu z-qEvZ=T2GXfGeI|`Lk-*Q)Lm6OE*h>!t=Zk{oI1QWlN(4T52Pi%t2b!$#=aXgNu~2 zvUDJjdNH1|sWb1_&6s9U-?OH=$d|oo1N|Rk#p}n(8_RhuZlCrBroe;%^YdLhmb2Id zxf31Ka3P`hUtL{Av4HVwOHU#B;sBL~dRoh}9Nm%KFwO0TY(>KD=gS5;7V<#h^^|LV zxuH)+c$Cl(z?kGHD~d2l1*0GeD0csak><ZCt*4ps!%l7}J?7qp-_J_AjP%&V3>f#< zEbXFd7CvYfc~$Md=y`v*3zpP4{EEIw=>nop?{KqVv{c?oSs(s&q3CcD-0%9PXliv7 zFu%?S(xIXg{Jc?t;)=#Eo>SJ<n)*e!`&9YcZ?7yv+iPbX95$M*7#<CT6f!WOB6}SS z=+}xlLvD#$vMEW?T*t+;^E%QXf2Ls!p@O&0zIh*Ko~%&9zm|Y#0Ds}eC)i{o7nGR% zqkLd8sYY3zTHWob-<MR^;9>-f0VD6{sWEl_<f=bui{}eKf5{!c_DAh+K5F=!4ijHC z^5cBmr`F*)SRp6hewb2s)qywO<Uf^|KsPT3Dt+mQtTSR7ZLk7=A=aU69P2ixMC5?N zMvs0QqEx_0Q<NJoYCQVjNO*CMZQ3(15hv6bk_JIPd#G<@Cm4|%8M(T*I24(3Cjm?< zF%pygRP14xz5QgsLImVz@F_{LDPvFan(#As19mNlDXrpC!JfF~tazKfbdlgB5Izvh zsr;QtbI6vsJizVz*ws>zNT|~wkMSsC;Wf4tO!+U}yiR;hi$zbD`d*f)=0KOZeaAD5 zi0bzOtP0wE4BL7ahKhK1;})inYmgN63AAMKPh|yeRzVaFm~jM!9ZuC2)v_iZ3nNNR zvLJuia>bfU_{5|_(~}4)Xw%U$V08-dgofl~uFB5(AMSF)1g>f^=#M!Fj$`<}DXaE+ z64+i-7k1oeB<SW3(nb{O(D>=tG^Envy<BpXq@3c?()vt7B4q(wGHy-`_F+JeO152m zhGcZ56#hfjz#kDy$`lU|pm1E)?@W6tnPisY)ZH(;@*A^E{z{622%VWnplce56SH%1 zi=9jOzu_8Q&Q(SaZ&}-a14Q<cWF{a2xThi^D}lUl>l3HQpbpn=a~Y;?r0>HGVz$-q z=~x!!qiW)+aZ@^EKjGG7OPb!xHHvEAeQX|e<hh>o9PR~9F3hX9q}|q)YwC6^i{ z59U^x@JfZpZogZ1U?63nfCk6lPkBBK$Vs>j%@Hi;ku*}0<&8W+?U!YZphI%lmesN$ zVGFj?%9{tM0S*s5_jeiSb)R(N1`jr-ZZtX7rnM|6Qza%2dX=t^vWEh@5j;!k`#Cab z6HcZ-<RaTpaBpdBzD>ep9j#O^?FW}9nTwcrHB9P4y{S=sV31;6fUOH$*H_!K3K{AV zhWzIc1IS-R+fu8(hqR5O>(*gwLwy%c#25LlK281)9;<9lQx)sc+kUIGl1cZ%ydv8R zo+W3MgtLP^uQeLYqx%O~qi`S{f1_m8U%)deAzwuK7#KoILdUxFqY>nlnOL1?38Qm_ zBU4Wav<Vly=*E9r0$D{|b<X9Kv~GFh>fjtPYlZ1hl*UgLh!wgLxrK{sc{%Po<_1cn zn!F*W7hRWog#8_etyLMspUdG}K7D~1m%ia)vjki)jcS}Si{#-cy|-EjxMaxr*#*4Z zdbn$1uWbQo3%kn1y}IJ|i>c(Dxi?>PZuO0<0%hyFXwo2|KpGGO6|4h=mnDtUaCDxD zz=M&Q8YyJfvvF%&Zpeu}6Q(h<S}9IMV>XZu`=6<xXUe{mf?gcm#kV!i9DxM1D|`oI zdjr?0^!?F0q+o4^?MGz?|LTpFz1r$=)nb)e5Z4r*Z*Dn-tt2fvrdg-U{qzU`hQ0B} zZ3~gQC!C!HAlSBoR#<ArTF!_1FW4VUY^Voi-v(K?5)6l5Vhi|8DM6c&jD9(7?}$A8 zr;MlYCHyI--(~jvdET!Zeb(%u)}cL6Vg@?qFRm8DEi%JN$$c~T)W_I-$K~iD(k;<V zPQB);&!-oExsA8MsC?k1ctB6{M=#?b-X-0@r6x(0fLR3e9Un8v+ILs4kLy}p4Dp6x z^a(+?^3mz#E%pDZXZW8xOt8Y$FAulecr}aMDi^=8XQpSVLX1w2V|@$Uy`~R~4t8xo zn;F_(-HcQXJz6@;cLO$3L%VWNq0XMYc3$<M`Hr$!VJxCtZSc&Oc~$^{tZ148ZTDau zBhI$az*^V^D)U{)S>LD6=S}~UD@z4?qNr4O(?{AP-VhV3gp0peWo5vFL%4>7s>!O2 z(K|W*ipY_93ZfYAo3Fh0RnZMt5>AgF!{Z<|M1JE7Ji4D$iZ`LI=yOSr;zfr16B7Ii z3HQdl5B4ARFnXqi==8K%>%oexCI^7&i)LYGAfr;XtpA+~sN91LOS{hS->H6qAY7;v z)+TD&jN(o5NUEizr6p8{pz9Y44i$&Vu*bZ~-z|{)d<NGMJ?>w?*8Iz$azh!e$uH!O z=!wQ+rQoBP1XPsyX=xv!Pv<3Kh&7)^J^aaw)*g$Ux;c-8dx<yv+~duIy)&s=<g61N zU_^(bEe8vG?rQf@LAwAyw`0oK=^VE6$>c_Yc8R+eHE+9*D<E<Vo+Y;T@8jM?%~2XL z&Q<~US}oHxd3thFh?9<c8f6oWG?H>Yw?TRM#{LB7@)K&qcI|{*P-@<eC*<&Tsj=6i zcCD+%ifCBZz*K1V;W9MTy6f&)S+k5VP=qXvPZ$I-m~Tb+yp|R0-=DR$p|7Q}<i08R z0ud=Wq_djg?y9H8qCH`M-aPp@-({&}bTjg_s&`3?ho}u{NA%YL{ZKKqtz<#q-gAu{ zT1xH8$nt1Y+zmVqYgS%v6|xx@mSx0~SBjd9LUMo1jD+aBqqJ7a{bfgd?p{a)@S4Nv zTZo8u3Op!Qr!rKhQd%nvT4!&ml9`!yBnfP7EY8aF{1dAV<!XdTqAm3*UisP0tj^yt zlq5Kj#-lcV)n*M`$|cFfguyiOulPW9#tMEORsOJE)7p*7JJ~~ISq*+$JJ(&u<mkyP zwbWYBx|g#S5e_;I9Hx(%w=*vxP!Qm6=51#cAj&P`OvBdI&Cde_5OmXHN&pvV(mcLR zo@W6!TCi&)O}c^<&=$ybTPNf=>!-u9&-D46^^0(b@32FdGJ#2P<Q1kPf%HiTK}}sj z57mGs=BW5f1SY$`Hkn(*QQj7=GCOkwQcpISJv_c?#}l|UCfIT!qm|gez={kA&nK|9 z*7b?TS|6Nc9k!Gs6%Te?&)|9y&R-6vi!=5YrIYHv8P(h_q$gfleWUq@@HbpX0us^> zhe+-H$kR-Cb?}IYSz)5WVjKHC^vB(7l~!0gBP1U@no)>lMhSCBQNtOwwdhJe#qR2N z9U3bAvuTQLay)6PyFeX*j-|-IP<Ek}MG-5TljcOkN4UtwZmn{*qk}qw<Vj9yeY`Sy z9NJ41JbGjoj{)+D1T(ZafQh3pTaqoj242Apoor&&zhzK^q^tj?bsZ_M8DXq#$sdnf z-&W{@JH@uoFm8mV-A!f$fUDPOs-Dq(e&{UJ^zaQ!%uq7VOp18GGL%+QNLI94SDR4R z_aC8Rw3cRqofZf9+Rgj~?4M<#k<FQ-&)3gQL7CRC;mA==)?VaH@&k;{F2Gch2TZ9d z>hM9-5a|uPwb9E6@K6XuYxui%lp+=I(E5Al(Q*C6h!a7U$WD{px%KU8^H4NNCOA9C zIuk2Z!wJU3c|>lY&(iaJK5Ss}u682aG)2cBF&o*#VYs>A1MYRSN<^KuMBE$uOKVZS zr^+qE+mZWf!#EnS4r%zw&00lv9RkJdFtxBvoR75$U4vxU^kqbKp$hRyS6TJfkrk}d zKd~EKPd5%zEl}Tokb-j8)yRf%2I7=M$y3HwpzGSHdAkUJ-cjotsv#hu&34V^^o5Tr zU5EMUhVU1E>yd7rW~@>N*+}?SL|Y}9po1dL2wWdLSkjk3IhXJ>aTJiLJ~@Bw1vGWp zV&7a3Tlbyef~n`JVLV@1x_Kx*I<-N$&VK7}_=1c$6GRoME*an3#cLU%bCN{pUxHD< z1cOp!f+UdvX_Lq(WlF^9MpNvR6=c#GCes&Q`A+`khL{x$QCiB*+-RS`BhB6gH~G(s zXnkF0tsNy70rbHDmzQ#ip6>3R>h7gT>ZT6cK5RPE;u^SrSj@bznM%)%C{;3dDDpv= zP3OfIXojQ$cZY}%Scc}<_(-`}_)!rg^>jxf1o!cQ99TBtyc(J}-JCU$`un>+lb=ZW zfzR~C6Y<_%I+AB3%NZu(+JEcuk77|O5z9#CHd^h%e`~&$<U!Ge&Fdx6VNI6qhvu{} z8C<mIdwuC?;r^DnQ<F*yFOVkkX!!Y+MZs1+<b~a6721Ph)h|QU;XFVII$fEl!^oF| zq~aw6+^3<PTYk^19ZH+}^T##JHT3!B9>2wCQD4xQ<^4<MuZ{Go6<KgBMxwOX;nQ@> zT>bRGjjoC+F5b0*+zCwv4&;s?dIs0WDC<MecmK3Zhy7$(+;rvmT@oqJ6Kti0ZZKt5 z8XDaE^Z4V##d+n0jJyJDJXJX_jEp7cPh6X55-|PeJ+^~)XQO(qs>-L@xLjxEajjbo zym%!X;w@8V=aed*e}_cmDs<4HD=&iVluU-urpHiquh$o-qs-C1=1DmW!vDO+&X?6e zmRi<1`md!=LwD=daR2t&Yas0MwJy4B5(q5<+StOGO=@<xFQ3|6Bb1eLS3F=JKC@L> zT&b^7(3E<2;LtOseAepmCT1<wZuNbSv<KbSUM~_qFoSE|M<VTU^6PF+>lWqAWInB6 zy>n)P09HWL+wkrDNvry{^&!Qamkey4ASH^I0oOM=>rk{tiK2=~Z2)sz)P~<SRoZSg z?DREdhL->+`4x|Bj+V;cv#y>c2iO!SW0j$p7XZ%zD<o86XRLA0<J}9p5_BJUwd;!Y zqKbJP=*dGfar<=!05)pn)<TsQxObyZ)6@PW$W--*F->|?C8XS|k{pF*6G>57LgM!S zO!~9W=`N03ahx9`mM!S<dg{a~*WTNcg=Iz_+{FY$Qp025W^U=_Ixe9lJ6d+LKP@hB zn#1P(*)Pv^HV_$eMHcXGc+i9;r-tT|ZaG|#0i<Q{dx;fMaiI#z+@SW<I)}Z`M1S z6@%rno7%kfX`tM_M_?XNprO5zQsd;qBJl=X7}5`;AfG>|M2rifdDdIa&PUFf;G^yR z3@wD4ckS7i7L{pQeM-6KlNTp4g_m*d6+{fI7RiqyOT!0Lbdj3FD9Q{q8S9@3JGb|H z+eAuyW`@6|VgO3g2d6`>I*woaQV3TN+hp%2W*aHiekG=a@H0c%8Q4}ZMW%G{697N> zUR7B1i1$4OcV_;QC&llz<tgbG@aX5qm)c@fsx5mUU7RAzNOgPtL~}{`8}ZfGe4f8{ z3k@BBAk+%3$lh7sE|Zm4kOg5x9>}aF5p7nzpB<DrRT6_yQXv|d<ErQ2PNSXgkPa1- zCLJYnc6|ajGS8x^2k@<yecs$D(u1=Tw8+_(#xp&wOfe8(0n*p>{rJPVY5DxI1`n}* zUS)qjK+yHwyCqPTU%-6bRd58=?km`Ta4VUq>XY{N5ei#avh{bDmnKHKe;N)2g3F(V zuH?!btX&U>#tn(rX<Uvi=`=H{R8~zQ|NC!|7a1pODnpt2Xw)&e0u2lMCGaA|nVR5Q zoe@15Q{UbY3s@p(De`Ak_pUB2FZkQvR*(R!pHk^3MCvR^aWlFIR0UZD7fo%2YaUcC zS-FWmTghc->-L1a&r$6ryK^31{#SL7szF`>_o!~Ng6vw$L%c0EKX9cN-c#T2>$k0j z;*w<e@aefh)y(mD^J+3b`{dTB+4%dGwM$Rbesbn@Jp#oJq=Z6V<Rl+`{#r_wAQ@0- zD>07y{w|%y*FM0jI*Hf-zkmPyQ|FJidNf7Ko**K1RD*+)8%r_{{n7gfR<WNMCtkjg zS2)_5A9vnOnuMffaZNQA)enNAc4L>5L{h02G=k6!c;AxBlC(~)?5FXNOFPZJ$lY*` zLi`P>{x}P-l0H1fmo+VaXsENk-BMuNowK*JVA|A)YUSq6leq9usGNquF!`McOFqrL z5@~k15`Y4p=d7Xna%jj&ydf><l@(kKA%4CR02-PDS$OKxye|mKdL8*UA_}LoUXDKd z)+I;rsGQJEZCV47P>0G6P(A#TW^d@<a(OgakBqceECZmWnMCGunlBX)1qGVpXEY!D zG!>UIx^kz=2it|j=x(>h5GZIP-`f^%N1;uHm-9huQ^zBe`ZHWYOnYANf&uK%xY@}+ z=I`m4|FdgFn`bU<Ax7t*^YXDRvw$RZY0;6u8}tg;34}^KJ>!tWriTj<Gvl41<MKVz z_eCiYOo7`m{q9DTSraVn!3Q!-ko^b}(7sM3Q+!>VWj6{ZOH!gBLbT;S*nd7e(`32v zBYbw$=D$-|6IoK?fZFEa+pm+`qjPBcLY^vL((De-&P{Xh&*Bd}!PZehFF<iIMPJ#c z@)M_}H+>iq7}v@qL(dKBAb5u2`SzRjh<agmNQfBPdz-dL5~4-OP6682YPu<YIDacF z#klVf{_?(&K$*ah+DC?v)1is<;EMXLuo#)``XRhm4Sl^R+$4ut@IpUIdU3eJBm|{l z_Fa~ExaFCP6Qry75u=4J_Mi?X4%<%TfYg8dG-V|<UvBK%4J4t+5EVT~Uw7b@P#@cG zY4se?^jxSAz&r2z4*+FAn!j({lQuyb0soUxK^A`<%|-&iEbxP@6&1L8sYB5}4aJtm zJK}nNK_@ojTrUN>Uh+31Lkf}4<#B~iezUu@AGLAh(1D9C*t@(Wv%fW`ilIn(I20-7 zgQvQfMP$OVs0=?GWt~)Ilbr-`#di9)$vNy!{nqhL^Bm>9yqm>}gTlg710{UfK1<cM zq>KuWZo!F6m6;K7K$Gx69RZh<4ni9>40O0Lo(yvYL)dF_^D@WTeD0aY(EtpLFU+Sq z8R7`hL@v3jQq6!9PLJX>4zL&A=V}^WrjuSm8h?M6h<&6oT6I$?m!d9}sdOKr*7Uhg zJH=S%s1&hm@m5P`g&oJPyozwtEEMrB$Bq)TH00!}E066cFx{fZ#1HM&tehx!4BdxZ zmgDX#C~oe^SsK-jU3uj(O>y%Fd=|fsKNdZiRkkV5lp2PaT-xA7^alVId&M06pGikC zZ+}YnIU&l#sZ=*Kr8w6K_3k#n2!2%eFw>Q-LX|Vn+Y2}A;b5gwP~;caZ4Sq$H7x{` zh^Y$k<rrs?S6vm$T)0D>hFm72UmgNC=zsq;^Rrs8w&Ak*_37;E->_#=h1O?s_UKgY zU<M!D$C$x+${2;{uA8&f!PJd!3ehooVSfxpM)U(O(bu~n{);_yuz$zSckQ`mWTiz~ z%P_s&Y)S2wnwlsnApP{=ap7mWAD%Ox*a^hQf<|-zd5#L~Mq~=x>KPwaDH=f{BY!!9 z%8x0A;rpJtsmXPJ6Dt#($f@OOsSo&iQ*VS;ch`U%ZupN?F?_Zv0%xou)Ln%?6=G&i zuR;g!kkm^%bv;!D^UWtUPZjBxaJW;)ncs9R8Dgp~?^xWteqBRkyQ-9u@qlAnoC?%m z=sMb*?iAZ-cAcQWRX@hOP&p|V@-9zHsfLkHI!6?7m6K4hD3eItb&=)UlUGDEMu*xh zOD3?f)wO|iZ+%CY<(|2`{Yp9&aH8pCq{l?$z=pHwfoHGE%hPQ+kd4#l$JtO(ZT(~G zp8!B1N=ax99~SnH^F&ya(L@<FiSp4+T``4u$)XmcHz=k;EK|rPnqo1{I&6Thx6Ow( zP}+4gXY=%T5kM4IKtFtXE!}U*tdk!_7DXMdBgvpg1QWdNGVULN7C%WJ<ljyr?x}h^ z8>1K@)tCEA9V>aQCZv2O1pRttO6_RH+<+cyOFbLiHk8~kynGQ5+WOIxdPP71i<7%W zD}Uzz7f8e#(L!<70_6FPztT$Fa2%jxRny6iuW_mPKME?IQfwur6qO}EtX@HdP!!nr zJ)k2Uhs`*XqH*UrRTyQLbc#u<m0l`FVkI{pF39E3*)`F6(-j;Or`(0Pa$h|}%DIU! zY5mc`JB0Xn_wP^MgKuQ36PlANk86*oRevq1eWvr>&4GR5mGHQLe?plPdhQG6qiakg z7z63n!U171>$0KYZcdXtmD5DpoTlrp;4xblr>91SqG6B6)N4XJ?O;25wFJG+`IOY= zSG)-9&cu`4sOuCJxgSI|+A%QI;lMlw1E`18EJ@J0=N@bh6bh8+IwAQyW0m1b?tf5Y zbbxS(R!p8+Dn<+YpH1lpQMXw%b7e|}cU_05>NJ>frbvu#I&jJJVmLdCfJ~mgJOh+v z57xG<nrK9Tlu3}l=IWj!gRi?yqpdF?a1QE`TvK4e^Vt>lseWN0u(GBbk=;+R&A8+3 zqb;OOz#n5@gMG%QzPK0_<Kk+ryMJ$sqcJK|BG8=)O-$`+c;5cMv-;bf#laSpO(Np| z+xXX_<(nY%@Dy;`mau00tU{Mc;Z^6VWGt>FJSHc2`vfUn_j<ZbG0pCScg|Kppi@Dh zQ$eUxK?>Tsj=I$SajE+|y&_Wq6E5khPuEYPbW(K7plBRE*X#aE?I4e<j(;6GxO2H4 zij~*)5BINk&m!Qc`Z4NVkzUQt(R(#dCKtr6ET49z5pLAF(lZzQ^vph8okL+c1utVx z$5F!{UGi<H!lPf-&B9dr=-%TI@DnEm2geGg{<+U)st91_lXGj6Td6@{b^}!UWZvQ4 zDr}eqVrZLoZp)UU09b9YSbu}sxaa0ex297QiIhf&297Ir1E6ZoAAGAXU(M-;iU6+M zPC>QkW!a<!VBqm*A{&^HIi4p57(V|#Gyt7U@wr6jK;X70m>)TQ%O}%XG_p1S@J9+; z+!&PKp^TE95ME8Yl-u2iCnM1n@ifqhWRe;cL%CFkldb?7$Z)2PRe!D0E-RjjVg^$W zx8Le6Dbr`~THd;4pjb_pN<!UX^4?S8pL|y44&teYO1J}A^ZWo#GO*4maZC<uhpXYw z)YcF0(860%l&1-2q4QSvB+eV=>yFG#ogV_UYwKS-ldu?2I)BlweXRqfvHqT7z~uVu z#CZP*l+-yI2s`s3et+!fziX=XrZnz0IbosNIv&}e?=Cj4(vp3~_WImNG^kR(d_%Pu zO$_HZPG=_8_K#nCUH#e^Ad4@@9aI$XyyFE;8d7fatT(+<!>h1k-R@zELJyo0zSAcQ zfpo$?bE)}Ey8r=S>)!QPS`eaxp{Z(KvaQ6^_E^t64L|j_Jbz8k^#6&NaCwC9^YCsZ zB<c)MS*IkjVtTj{T?twDO`I8k%_hALXn<^3=qux4T~w9JuH|tyF%g&Aq6N&s`*7*p zvE>o5rC)$6F*oX3P9K9m!2S3MC8$(CtVu>J2lNrSp^XWu=3WFOv(?2#5P~RKt$&=d zS}E7+Qh<hof`89}IC$KFT7!o16X{UUfw@(V0~<E;m}uoH(Mm<M5>Rp<HruT{tay#c zPuYgZf^+ixaoL0_*UMEsp`b}_wga2DfrBp&^_b)p1Z-#395|xp14!VNVocIXZoXFo zxm7m+7iHfSxI~g^+#VY$5UE3sxAS+`x{gbjlGOB0ZGV2Wuqx=3=<H~;Clei=r6s_( zjL!Av`x4BYxiF}z!3$?h29mBUV@dg(8y(W{n3kn<QjAJg5JrhMxBz|TDwFRBf~2_N z7vxFd7Y}xVD!KzET#INB`{1Achcu#aZjC5}{&Ol(X(z!ccq6`6=~Z^kho5985fdOU zIuUlMEPr<TV9P!vpUQ@^?~(ty6$M}Plvb46p#^WnPbrRodCWtyP5_BFNxf@-F$97E zPy)TdUc~{2x*@@S)O#nwwfpPW!WoJeL1B!Ve|ho}Ka~#Y8huU(@IE8eeXVrz|GrZh z5p<!zV7&YMfHv#*`9>)6RObbR97i&4d-;Z)nty?C*7E^Cv*^(|M4hz$x%DrnoCtu5 zAQdExk0}9x3+>@hkSjPoRP)aomt&!b{#J<Gl+_rVPiR0-FaqbZSN{9-#^e8v4Dn-B zRq4tiGSU4%-1xu~Agb)jj9OFHDu&2)Fdz?R96w7MQ(uDd*=5%$9c3aFyW)Rwsu+8! ztbeAhuUT<w;YE!p&0d<x<!T4|CVFD~|4{u?wfd*0%5OSMz`0=g<?AXtu1;7pljq-a z>GsuoTDQHSP!RtVa8E*dg}_cjj8#<f1!$Ww!+mrzKH2TCF;zwtUC_JkiXMbvp4+;k z5<Gl_QmRpt2WgKMxJo42vKQf{@Bs2kl7DHT%XXUF-VlJl#?NTTvGq5tzvPUd=Ux<H z@GWR<3lnOG<#$#EJSy-!=;mU5n-Wp7N<-i|pNmB~63K1qxmY4vaLr>m*Pd383i7;* z$9#-bYLlnOrPgZdn1;hzRa2eTlA~(X168P3tF6bLr$wVG;YROgKASN(QKL}}R+Fnu z41f23QLBl6ttUQ$BN>YWA;7K72!5n<dV!erqXLtm?pc54#QveknG*ZsC(fP4-<|kw z0_1O;OxuQQgtPJYPkwLb2YR*4Z6_d#Oa5FEki_ybsYto$I*XKDqLa`2Lb>N6Cov{u zKjNQ@QkPP>s3!%j@BiZ#sb>q$_a1-taerV0a*)kbowa)^cU^fb*{~f-ezy`^GnXuz z0M-9Tenu!z;4Bhe%)jv6?{gv)J%RbqPMy9uzdaI`$H@Q*C#wgDhQx<iuBt@=^Ej7S zEEY~`o;$0ly-602ItRSOPtPkTJ>NR{8u=14)$>+Iqc@caV5&K`E}PDetHB6?sefWU zJ888kOr-U#h@0lyF=_Y;9xhH9m}JJfeXQ@{05~@_$L!G3s7V<x5K5K$bHZ<VQ-|aL z(_a3*+#_Kq_i5Cn5~4q^5@WDM*{xh6X751}o?TVM?9F$BS?qG6^^?4el2ea1kVDs% z?pJMh7i6lhkXs<pHWe2`=!9E;AAk0{fe=`n+ZzH1?VVc;0CHvp0<x<D%yvd|XUFkW zAdot~!|~A2dPp2wNQ~(8)bAEH%&u{O`Q6(Gs1?Sy@<^C(9WQ7I`xv2cvitkc*ff#J z6?!H%8Mx0y4D8(`1e+RnHhtS%+`M74h0ywPXRKvjfBxa+J~`Hfa$C#c|9>VXr_O{4 zH7XI;&PVQAXu0bB3M`#zBDm;X&>0ZBIHVRW14yGMtHYUa0l?xHF)*y6Iy_8?#uKJ3 z-Wz$j-JT;|$o)GNY!g;^oKQr4FuCeEjkHc4fBaOeJpQ;j@|IP}K^-ZkI7y~ztE+b= zab%=>=Iqb>pq5I?l{+jj^DZ`_V>l!^D9V)^Rb?7YA@L=mK5A-ipSn(f=^Wnbdmhz% z1WgIF$?x4sggU2rlVMO32I3J6E&igDdQd(Bh?$eRP&j|@;WyBG?!Cg4n}_Q6rIP;^ z`N`9Li~PiYYaWgZS@{tqqr`<84;2N)fB*zw`%u-B%A=>Kcs<-l{jKrm3aN4|h}KA! zlZdsB0-<&=U4W0J`YYLyh_ijB5FylBzt2Kc3$nc>(cb?S?e!?p`A}QyDOyV>3wUyO z5$!h2)r)`Lm!(2F8SCwd_67*;G?wbe+f&6z{@Hbr{@`R=McI+(!g2V9yZ2})mHB=K zKmY*`QI4*l2uh<qP|5a&gSM%pA+36nVs{6-J0Cv_CcaC<o$eQl0x1CyNcltOsvAA{ zNR+q1ob0dkj-^$BrysR1yHV!m`4PRi#l=`tdVqg*+)5<Y8ueVCz#Q#h&R-g*VXk?W zXNA1LYF|cRl}9^BEk1U}yDq8=b88x>;yQiCyI%I>D%>MD-8$tr^A1-Kl-bc9lOmw+ z8X02%6g=IrbZzQ*HCf_e!oB6~kr)6ZPd;|e_HOL#?-tMY?&y;q2HFqjd%XY&g5+if zvgUsaWX*UH1$X=7{><zBBfZ68R|_JyK~hH`(H`rbPr@+YW^x^RH6<xkmmJ_yy+`aG zE2wfX4G5(M<Ka{?lB^aOVayH_p5Y{HGx4oZP0B~{!JZ(1Vd7i*4Bd?OFV6QeqFIUl zgsrQ^%v|#mUm4_l@GGBa&Si?KZYRQ_q@{l&>z!Ye$&<xs)!flqP@XG1CY)gv5uSDJ z#miLd9BeYF5acM6j&l{cdfjPQj%+hQRke!@(6qSJzozw0M*Gv=JQc@X@1@%BiB}}P zpYpvYzasUu&$#ub8!kUm9L$Ju5Ka?rn&G;TkzG~YWTSJ&zk9yKC`zaK?no-(`oe!* zUq*i*`p}E*54m+njx%|Nf#iiV4r0yaUk~pxEkGltjf5jfO*cZRk`^-%EHhq?`;SV= zP$n4(kN6LESt|91)gN)HTB7usZsSYG#xl({As`Ixc*GR*#Y9E`t+mbGcq$d|ZO*z6 zO(z|R+wLQKZL_s|Y^-;6H7)0XJ3)Wa)zxls|E8QA-d%;rGs)?K@(jgL;!0kb^5#N- zB1*jqBYr^qsdqxIDXTx)-`^jWtD$-FH1Co?Pv`o{hmXTw6;o;d%D*-1pX8l9?Nb4z zPmv1waV4b0=EDS(%>cqJR{Re^2v6?)(I?*FX5(||GQxW)QG@C0nS<l~31)w&t@9|; zsS1B<$h_~Z0i-8>fL~Gya?dEG6Cz>m%8Rc$#A8rJcLC?i$4y;jj2T&zn?pHN38$(( z_U?DvHXKdjBbvo%K!`Y|&Ut(QbwpE-R6#dXyR3jXjsG_|i62$27VRx%M0?GMl=|C} zk1OT7?fKgS2}9H;>S|GyzB_+@&{}({OP7|KEa>ynN@s#g>9Wf~e((;Xr_3zMgXQ6{ z9uMdyk{z3zaD*)F&>da>K!EDZtj&$AGu6q26N^LwdOTv8m93W9H)YUJt(wV2Moga5 zLOK{c6b~iS@OuhWcjU2GNN5m|s(gS7oSV2qV_bJklWzzV!=g~Bzb}6gsXaI!agvdt zxMrje#YrxurJ}VL)Fy)ZXhMB%?}id_NHFG6sei|Z1(j+lcMDy|vz8|j$J^Y`J2Q34 zb5rh0#aHP*TP5C}d*U_|C@r5NB*xlyol)Yu9SF0I#B8k(rPST=NRS8>4_%~-+M3VY zy|k^dI_Q|$34t}vh?;*oG+Z5=uJ^=}ndsmu4V>uSn$DQ9T^!_$M{E_xayHFH)N<bB zV3!W+Yi5mjEkC1Aj~kq6YQk{J&^z6e9~$hf%$S^N<zZ9XT&UExQq_Pz?YgC2+7>aw zQH=oSmOUPgF3j3uLTwmUW4U6rp_-PuZz1$HYNqlSm`^42d{2Km80+cT90X)NsS$OM za5IDeG@I-j=r#1QTrd*QVq$TH9Bm;Vst=h=;9NcNZ}6a-v2BOI`R3U?6FBdmjJFY7 z=k90Sov008{+{d-I=I?pKk=q^$JO3*!-suZFtlgQg)xM_JYfbm2J(<7?-(CLfhY^H z_dQw^kRpr4%A<dJA!RtoA(_n%hXYad>K=A1Vg#4(bpU#^mZlk%90!xE+V}dKw;C{_ zrP9tjKB31jFdT8>rF=!rVkR5}ef_5QZ=w)P>37{9m$Pfbi7MU*pH-HXOGQr)>>A0V zyEBP)tZ|*G<j0Ttha*Ur=eBmS9Z0}WX5Bow4C}Q?@M?ea!-(VqxGJ8F4_3;FU?CsR zuY2ZbLcDAYF>}iV)wY#*@5QqkwK(dDbgWN3bbr0p8{fBgq?YQfj$t|3IuS}3ES6`m z0ck|XYhzZdcc8LwZLTz`1}<N!qNZl7rch(9x<-S`mX3u=)BE3Vp=Mi@4D?=JDZi^3 z(~37-wSRvoq>ofqpHMPAXwK$ri(F{Tu6A{dRiO)fRA|v&sJu~N=Cu!PETW)N9Yc=m zWLQ7BTa&A?GYP`phCUG$1>Gn$pH_7akdd{x$-RYckaq}{%H6s=ZtB`wqTV3^U5C84 z^^7qd5qspCq<WL$f$!XRQzok=wXhlB0H~G<I@W)Z+e`UGVapvPLT$tckv$Lv6LVUw zNO+PU?j_(fa`9edgj@@HXrfRZS{neWnOZ1HHSrP&0Mk@EzoaqbBr)9ApX<qRp!bGw z=g#7A3UV1Ir)k#O;^1$_ayp~NU?87N6t$kgO0O2$TnwjD)xs(r5L&-Of^3V*&Ci)U z$f|$+YQ7jCjKU6tc%YeOA&!?%PN=K)ln>Sm%>hI-bgFSmqYl9UGDav%jP0y^{sXx| zYq6G3<oibYwDe11?V7DaV5RIejno>)K_{8?wGl)3h~VV>!xtnamvJXyXV2UjJ~@d6 zQbCftsm?t)rhPQghu(1dCx!41Wo=t4rpkY=S4aD%xZBNwwio(THIn4kxCz1WoC?$o z=(Jx0gOV)hDIO6wR3uf#b>gsy;ZPD_Dg!W01i%bpa3)}fG_KKpa>Mh}40?fQv*F=9 zYYqkw2$s-_gu}t&a5369w>yl%=}MM4y@8TFF>JQJN0T278EV`}^hcv5!=BX)o!Eag zXk??|xSc?5Mnhp$x84<sf)<?1q%va(UA#$-zbwP(s_TL@(O;|vdy5Q!qHPl5?R9=f zJ^&|_s=#el7r0fTYTm=i$>7|I%gyJQ&zIFa`9NTWlA}2uvs6S3U%oj&!kaG-0|KEM zkMX`M2|fWlsgdR5abhw<HMZQ8;mm)gnVYr{i)sW-62I+y7lzP@weSNmzI6e^NXXST z$&4F~dZQEWBnB}mM#MeOXEH7>qp_$LQtG;Z%SF>;05Vi@a49)vf~6r~=$dWf2178o ze#<&lO{?nY(j>e-Lftq&1amUCYID#4uHw?o5kN#D9z{v+Qe&myIQSi7Q#pSjeer!P zl?8--rhu>^WhaRkF*jVA(0%f^WGn8>lyM0wn=2^|q5@Aui(j!(*Ee1fS1GDijAyS| zAwNs2Q`-c$pkOjR8ryJXf&@w8$_=rI!32h$b)Ji#ITt@o(fU|K>YT(lL^+RgFOErE zdZ!P2<5egNJ5F7~CDnAHpqqdGCggIfZ~Hjfc1;KYH4C&xX}sBuBjmOvu(UkBw}Yg} z%}c0qFoF{o_mrJekObGm_0$Asr63X2J)hPKSc~XdEgGF^Q?8sHU1y$m4KN9}ygBvy ztL2<KGcGSX(}aXy8PuC;=RGS<o&v{bnxx#FnXO;K4+vE*7rogOIn#g4Jp0`A9-n!z z&OBVFPvv2YP(pP%nXld2Jy3Ft5~mEOE(#KTs(9*vx-<UYx@UZIU6>MY&fgL~b<U$4 z#wQItp^?#jsndoYTmIVUJ+X#-0KcY83mgqZJGx>?palz*7M^a+lk9pSo={Hu0ZOJ9 zkI9F164l3hs7B|v<U)TNr)^52p@s9K!Ttn3*n$^=T-2Pl{%pq&M@QJS3EQLGS-yB- z#z3Y*j+jL~N>p>mME0Uq>lTVsvk~Ee9X}WuG5dl?_j%DLYsi;;Xv^;Wtov>=lio;r z<X^((Ny>7}l#W_Y%;us$dbmk6KfMshubDHMhO}qgZN5oIM}B{}qxEN$%k?FiZ#@W! zQZRb{LJ0ptbg<tbX|5A<X5r#xhetyfT$xU)BO^Z$uOQkQMG7xG@gPId4{ts73wS@O ztQPPNB6Ri)&_|~_3@+|N9rI1rT?#W<SV$I%2#Yaw<P;v5eChJ;5+F29)x$Sx%$!@3 z4=hYO+(URN0S{5O1U!Im(JaK)pH04Gd3QfR!05a3f{>4OljuB6jQ%d9!wV_8Goqh- zK)^iLo)L{MO<r`4G?mVL0M2Xfv(9|*;a9o8@vHR8`lk`0w0rrblc`-Ee<XUc?`Sj{ z0O;Sn{E|s{0r8OAy2VGX?0nHAX+#8-p&`eki+)L3+wbzCb_mqdq4%!H;0cB^+|oD$ z{NY*Ye+C#2iem6Ci?isOZD;2N+tx%G=dApKcYBc1Q32_cfHY^goSPTV&AQ#)fKQ0& z=<b=P!N+IQfz^ZQ^b9<Be`LeC_&Ljk<Ao~0a8&7nu_j;?5~eG8*W3KSbr*aZSpCe* z?maW9v<t=A+3Alr9N7>JqYuM5`D#=7u{+iY0iB^p=maQjqAo|>MVNqRjsrFBn`M-6 z7DU3wj}c-A0zc-O#?_rK3j%N&y6ZfmCAE`0&~fVxpgV^=4`^@ee|0kLNfS6Z90)w| z8<thK_j7_li?g-&7!(wZi^^D!x^!uXa_YSNJe5m1#D_R8YPMaU03UDSw;h`&M;$*L z6*bM?8U>B0PrS}?h*R5@VDMX$*$-~FfU%&IhRQe1*&XS|aXrvX^rai0Tzk2x8?G!v z4y)z^vy5932Z>#^e<yw|q!(3n=$@B4RA6B3jb#PB-s2ktjH6=5RZiJ}U2xV;ffLS* zn5Tk&<?g3K7{1)?ncdZ~*7Z+;!xKLh@Y(JP@6n|+b-KhW0I2)yz2-Zmx#(bdaVa4c z+Z7^3;MW<oB8!?T-TLCeQG;{iir0+_OoUmnX5is~)B0HJe`7{<2j$JWfe(R7$g6DC zXe`L}qQ7)g%p%NSBz@Nb3qU8<Lc>sPQv<E9LNHm?fDt$IeD=f~Zt&&5xE%F_Jj>aY z6xxZOPMY5(t?~s7QAS>b#HDM0B|kL723U=?Hb<437v9xF2qgkTcU@>wDf!LUEzm88 z>4Ry+bV-K~lS5z@F*P@;mYXnJUu}KG4&e)}#v00I#;w-Jx^O%pJuXh0rvjf{i@TY3 z^^oGKEFt#3x$KjQU{QZ}aqv?WM8vh5D<IT>msmPj^?47U`<|B(jc1;>&qL<gh6RRh z7@!YGY?gHuAF;(TYF{-cavnB^Uw4J<+pver?4$`3FlozK^A~nwR$z0&!UqH1sTn^Z zpF>C4rW_D!YR`_UyQVsVbyRu)RXn2Jhix?b>QW!ib$Kq0Kh1wfQ5NoafU`<oRN~HS zFQO3Y775YJsQSC#5;~e;ag|fL@t%CtG^6<k<|yTAoQcQ3{oSdL4I`R=!90hb=qq0= zt}%?Mf{snSFeR?gLQB;)Olts?PH(WN0m$_~-xT3ANO@%YLpnz=sP)t(UTQz875h0C zMr>i!7M}ty+17tAaRZ^sCgnnbmt9-RRN`fh_$whH(IdU2LvqBVk6YUpK@P6}E78-D zyrs<N;w0g(nNVl6p@0M#(bT?sc3G&h(A+wJweumSqP3=(%1$QKpqiLW_s-19$Ki#V zs@4|5^6~7<!P}A}1haWf^FQ%7L?a}$>)yPIb{IiTH~xRT^}qkTo>2kAHma%7SYgeY zaCps{-t<_~FVi=|@Ip4y=a)&2?Om5zq_k1gSN7}v6~0~C!-dvs*z;c%c*$nsDDV<$ z`|9MS*M38iHpNAR0>WJ@61Fshk>O#n8jOU^oN((2!lI0{R^WB5U*2~d-=x_p`LkPY z?pd7!9m9WgWiL@xitlK(09vnub)wxt(QZR{mNs3D>%!`oj_!V-+YzEmsd&00Ugwl$ zRZ4>i_u4<dx#L#yrAUefw$xIpmFMRlj@S3^yliSyPh3Tw*tT(fB+(aLA0pA^o=kZ@ zGEjPSr;u$YqDC|xK4S45W06Q0o`{7FyRpS)5O{y!=;~b$@7h)x$QAXTT=M9~Ih(49 zjpq4{n~P?DM$Pw>zI0^}M&sea1&jGhz}}HxGvmeP!*B5smk;X*<9<4VkW9tr#m9G| z<lkfvG{5$B$ANoW_ldvHXx)ylNUNH<a*XL9gW|L9AB8BD6CZ-d2vzFJW@W$dNV;Il zhUtHl^hiob47NjkeQZe`S6hr$Pdy;Qo8=K7eNxO4D?cL26W`rVXf0j+nHnW`tBz@E znP|B$Jvcc(lw;H&gd6g%l?qkMk-o-4f5D>6<n$whR(P_MbbzMLj|`j7NegF-Oq@W3 zsIYs<RJB4y>lxnr`iIWnoF53IRWJ<0y=#A^D;K=&^?Qf<CIS@fV3`v9M-n09h3DN6 zn^T`(gTDD!6<7W`o$bBousRnTzi-Mi3ATP9eMC=umxP5UlI{A4MgqEPH<8%x%w8sD zZ#-NJk23sw)_N~tqhiv&7awS8_y_nSzLgR}ab=Op$@;M+0M-I@J-K(E_&eN;8P|U= zup<2ey&M*PdI8nr0)Fm;cH%|%k*{mn{id5CS5F=e*vGC<Z@VhY;gf+tYa<U|y`|^+ zV|L)uYm)~a2(v%l_Ie9c+t2}6<kE$tjapJeJGt>lkb`d8Dh)jQf`s&L7VvBm@YFhT zqqO4qGI7Vg+iZIeNuP6fo^>UAtdxJxZ#T;#uRfw)aj6SjPPk((#CdC@<G?3*d?67l zW+aHHiPoKGUy$6CIC!TffHZYrnqvkVy9AhGUJ5XGHG*b<a{%4Nnet<N1RO;bF!GM9 zC=j&U!37b*_lcjm!FsL?uphqxzg4oLWVo|NI%y;%m-RQ<oyCIB@-s=uzl?ut7RT2A z@l#5C)2+Al3jx&2ZY?ox(pS8~O)1fR=3hXxr7GaB7)5Hn;;Nh{+f)k<5N2x@wBE+l zKU%6mK1B_%RQAMzVRYBw_-pz<c1$2B^GXpu3}08a$Xzd&?+Xw*N9e@b%hhGrUE5vn z!nGuD@kCzN1%2+0>;I9R1Py=fh|OkudN{XZ20oXM?$^TsjgnjJh!f~~1f_-E^`lAe zA@toFjOYMCEA$*rg;x|wrVU(!@nPKw#1MDi8?*xf+kF^~$cGRrIN7-6J(kkE(u7aK zCk0me#QIAH4V0E87xs>Jz3s2o33UAAElay+8jYFr#owzdQzPZ|>#HQ=W7YM4*m>jZ z^m)sT+1crdbb5UGym9gOyk&{~PCIfhhVZ15@n#l(hvSG>Ba`8<dl4f<R!J_Q5x~0u ziOSv!U->H0tRVU4f29GP{OyN=oB%xnXteHy{{<fqT#&bVTWOWR+Z6@nPD#w^k1ONK zMuCmBwF07~8g1_7wo>$&mM4aJ8TfpAu5UGJw#{-~M&9WoyDr}yNUB5Etk#ND3x<vJ z=lZCBJ~=v^>WLvqhc~Y;juBM%KD&^gSX<h-I;QQNl?8+csAJO6)ql6|{v(mHwPlf2 z5S_!LG`ct+x3R|S>CKE-F9{@X+Pvjj3|=aq?6DAxOBIE9yEW0H0m0L@37#`QGd36p z>BH>{3n%@0+u<#p3>2Pl+<?ipebMDZQ0R((1N3@$Uw!@F<#NBHF6<hr<oi}_C&Pu> z!rmRH-ojVTFP*o(IkCE#&1p-msdd{|jl|>i`YQQ-)2szA8eWqfix`LVK{IjdcC~S^ z=kyz`zrK9k)~j;meboWu5NtWJe)h1V<=wBl4Ls?2{fLqhb48PsqUP!K6rYtkr~=D> z%d5>nG#~+e7ST)so9<uN`ZX9}+S1d22Vf4iP*dj&&U^jV)}t;RSGx0_iTatS|Li%= zP`O)Bo$E#Upi&SssyD0wws9YHaV(G=3VIwr9uIQWLwxWa7BD%YR5AgD&&o_Z;u9#i zR1?1^=EM^XYI49k;ClGJ=3cE7juYU2CM92zm=LnsVce^vCB1X^Xr9qCET`)zRtWLz z<n?eE=2Xq3aMxWJW}G4U+0Q_;!YIBkt17hqsr5JygGyA4uKXK7Fw9{9ippti#5_%i zXrvDlk%+ghqlhjOM{I(romx4tD3fh&R83j=%D-XMt-STPNLe7-g(3`ewJ{)n+DO<Q z#;591ikJWWl*s;`xQ?BS|B|y`C`N>Wo-IFfao64X9_n&wG_u*NRy}8PfkVvsYIfpY z2cgnGI5}Gz7~o(2V!&R2=)zdOP}y1<WsiQL3j%3Fv;Ey<EGnfi`M)FSdPGPLV>_or z1D8$Rg`o7TO-uI{(hNX1#4U7xp1;S1K*ha*4h%yRYbML1>SJHD?XP~t*s#L`AmDo} z{vAH%YPB0F$^U%+BvqA5QMTs)cBkN$yF%Aq-T4(xmzioN9^yK&1C9|0*`Z`CvxVuy z3A^(k7&i4_aw1&l>8}jm7#D$U;WR-sz|eTI@cw&meDfvu1Yo4MxBHQQt`8Mnx$^7% zl^!zdt;2f+CB0smY_G#+;UvlK!_JBNE(>g@cIkGDQTc)c+R|#nj9BSLuCI|CtPB@= ziaK+sHYHNiYMJ=xcJFRe#e4Fmy7e+03GYkyj5(=PWTD>*<-^g*Wx*+f8|1B#9a$Hb z?^V8oo0U>K?j}-i8!x(l490CY-;Q5RGqZjRHHHRsIv9=j<kxO)e~D#q#yPwt85-NM zV<2ts9E<{5&e2WD(CE^(LH~x!Y5N66zNQQ+bwLRxN8&OXN)dhU?zy<|Xs;Z-j!LB_ z!<E2S+U3jmNM`+1G-4F8<%Rh|wvRRkODNjhz0oKP^v3J%y~YxMUAZ%ew+Cg`F8Eq* z{$NP815*=@RV`2S<rfd@cF?MduZxY=^8-w^ElrjDLW$!yaEBPTHOf}OFBa!lPicze z7yse$Q+<G0z8n*meZ&R+KQyW-DKa{(zis_(FenI}N{HK=!%uIpZ?jd+GBscy4lt=} zqq2*h%p*qP2g;a#a)}s;)#JQ-Bsz+N&PcSo?J>;GQ3X%+z;nrbQbl6W=4w4X`BHXM z(HW_#k;%#g5rancnW1P1Ejl!b&l(=!;{GUKdGVR=XQ*|-{ApFd53(~mgSumm#*CB> zscgNs&x#Mv+ZrTchrH9<Xx;dvTfMnpaC&R^TP|jT0y95<6l-Ihz|43h-SJ}UbkC(b z4pG~<8fB4_1|E6iRQr^v>E`YCS*e8c{M)Ud2?SN#fAQkn+Qp0aqnmvD^9!pMH(k6x zU<R$*pYJ46)&sYRf`R?;HPto_hft^^4ND`8q6&-IL?XM06e*#t{~eEK7j0d$+*0Ao zL@C`~l#xGwlJ?;16+=lVMKOnS>6opdoWp0Fk<jJ$Ieq2{7wWivUSzAP-94wocleg? z_bJ=<SGlf)lpfJ`DjKxZ?zZ#gsJ~BAJ9pexgDdw2<)>`0vu-~rr?9QEzjk*=?`yA9 z6nn{A@e#a3v{4cxRqP9hIqb(+Q#GET33*j4^;gOql1qx6QWyDnvu3HSAN=Wt`yfY& z;J4pveFs%(lb3BQe=aI*cjgSG?#7m}qB|E#%~JU!7S1=g1|{eNRmIkKTHoVgLLvA2 zm7l86f#4W-?!RA(33&f~u4r=KttZr#!A{#kUjLNPLr*JdWlFR?)Eks-Q*UR{FZ%B0 z18&AWEk7uUvpmA*SQ^vy*1xt|NC?4xMhS5^Svi3Opm~;uf7PH#*(+Z}sY4kIApmnU zPFg={{RsF|Ka#7>g}$lmQQj?}KYC%PYqcq!!iTnZjFWPISrfnV&(r$wFV>>44VV5W zDiv#+>kft}q1gJxea|<zYI0bA=Nx!H2;Dztx#>Uo+{y`1Vd9ippMT$fORZQ`ZKk%q z%eeTZuiUbQe_26Z+FXEh{9FeK!nN*q|9s2V|H!+p7V2@aK6+evBO&Dt7WH{U!JUO| zbx)(_dHMQ0A0LSZS@4y||8IpF2CZz^@yk6G4RtH5jV*n0T_Ik1MotYSllRO{P*me8 zf|@)!wkBYa*z)wja==tWv)3lwn0mi`DL-c{Xj2K^e@+$S>ccw$ZCw$7lMP8JOj>!x zp+Ce~FzPj&E<7Wzg(){stL*vJwv9#{9MdpWB+>f2lS!{}J+S(^LLg39WX;&oqzd3` z;~r^i<G7RvPfhnJq3QVSxez>A8yCq|CX=rT*l&1e2-Ka|*#O4&X1+Jt|AIHzfmgjw zz5G>?e{OXg0f=6Ep4OAr)?S(ka0c!+4vgm>OenrS?qLDZ$kWru`J$kUC{GjTw<tAn z+G}6sgO$rQw;71Wwq`No0*0Dw^En5*m2d<=b269B1;dfxoDUo53M#vOYC5Vk1WlNl zsBlRW{$rSGE8?Cm#-a{R2)6T8*#ERp*V^Q%e*k^j|FD2|#HGLW@c`m~6pL+OpDs4R z2NsV#U97HT+wgYn<TeR-R}I<<{s(q*tgR@i34n`o4Y}$~X%P@P<j%d<YyCmSSx|U$ zF!*Mq8H(=3xi^4UnViMe?bPG?&Yje<=uY=?mp@y+gm*|;L-Z#VwGmHxBZPcTTOp*w ze|0aW7VZ$}dlc(}#eRtCU<7fmxO|6$*H~0)U@gg9(S%5AvMp|imgfC=8C23zPZ-e< zyR0IfSvQnF+0eX$ORA=+D<5)#SX+723E%}@GZ)G1%`4wBh_v0pZ&w;^cCLW3Ml^L$ zj89nZ8d1^+uDbdaza4R%zg#sfLrM+Qe<1R*H6Cyv2)&Tesc7#D;tTejRu}U$L2XS< zKGc|$)v+BGbyYU-HK_|XTPLU`E3yMC-^Z*#(-#DS6om;n<Gn(n+^i&&oS>tV!doja zZ#C*egVj<hX#*2T@A9YbPTIsmo+omw<c0W$@({{<5#%tH54n4&S026dL6Ltkle%#q ze}%k8Sl#+10q5{T@T1EvJ9>BAx#j#-sX%|Se8oMz>MeIe5W{`<?9{ZYUTkCQm#r^A z(7gmr6V_Dw#fn0@`qQsW2q|^AT+G-&&eDx?Ct4+zk4^bKcq-uWQUPeNFOxWMmx)_e zK5D-73N_uMUh&d1LVSmWjzu20TpQQ4f2&_?0|+3yab8r01$~*5IA7hE7^(JWQ)k6_ z$yZhiwpM16NJ^tONU|f%;OeBzzQEP^8PWc4+pftZ_DuZEp-YL;x^8iCc<PcvaFO_| zA3F5x>&~Nh&d)!0^BKEw{tOFE{LQ6@P_LeM!;Q;BQ-=<<zSq9`%trFub?ctHfB6*L zSCzWJ{pdhJbcdX)JD&bsW{xP6Nxv`g#92CV+5Hm{dhtzPCC0<Y-@SP8jbDZSg{J~M z`kL$aZS6aF(^pVm`R%)oU%yjaLeJ1C&`v1p1hi|K<);H}hc`{0)S!@hqhl_S<<AJZ zJ8h0_m``PH*p!*;5m$PovGJeEe`&C2eqg9D8B@>Li5DP?oxgl+?ezS9hq;&i{aa_Y zwEnGcm;xQliz5{sr7PAT;M=!+3gfy^yHxWMNmC5VRN+&BKx>1fE%@g_a9Uqb)9UFp zSgs{Q*5F%&Wj#3LlBJEoAbe6*B&&d?Alc9q_4qY>6JOi0M0M97L4a4ee-(Ty7<3J0 z|Hp;lh^Rnvu`|8j@4H<2-N0{(y`yM-(Cx-hE~$xk@rY=A<u$$zn+yq^bpFXYY=3(! z;u~X=^_ss!?r65#dt(5A&hEIa?ruHgZj9lz;O~oD4=JcviUmJ~pNjd@EBHnxWp(u5 zeHcBNPs`0dk*J6n-S{<Oe;ny|sQ8DR5%!M+5&!YgPkrj(p+oRvas3@l)4qf9CMSk? z{?DKK)S-h1WfZ^im&)g%p%~Ii=#K4^qd5QA-l~i8L<z#L;K#0xGQq)<v+6Z(VmI1R zifTg0>qXxxq85a}+?JPRQk!q|0i~#7-(NG(*M_Zq2P{C$mo{xGf8`Ou!q`G}Vn2co zkjB47QS>vAvshN=BOkILU)i*&k_U?p-W^MhPykC(=k$p`kt^X33Kw**Cf3~eXjTKM zgX<3#Xp|-rZXh65+9|9AUlS|K_pz8m_kxuQ!CIrAti#qj;Q|~`EyD4wU+jfXeqBRA z;EZt)7uwffpUr;uf9=Ro3|Ou84giD;CgGva<L96nK)B?V5M1{RKs4byCL%oJKqP$A zA;7>dztFk?J}0AaPyAoy^W<)U^_Y?q(Do+7wu<Bw?1#>H*&dTqKl=O;f)BMX-q{&5 zBFC66K*Njq6|ME9BAwR$^MSm7e5ycR(c(SI5qbxyE2e0%e;``SrXr4~P3md}PBsHw zx9>T<rLM;D_kJU-e>?p`0p)!sIK17p8}Sc2zK^M&gQ8e;C876G>zZq%IC$ugBp3J{ ziy}{Qd}7&wpr|1xYOrMuZ92tVD&s~(dbwM`mM<PUL~NT}cdbGGRlG<(;8vokr@=s7 zt9#j}lx;}<f6}6o#vD2%;kf3H)FNL9g7d_(TSpfRQU>F)hKT1xQ)s)k*FudynJSvs zUf9F9O%5G0@aLj}2GhZJ5Fj52dNl8LVaL2%$#?7tZT);L-u5nU>sxcGL$^hZp~ZXN zHh%n;E9VVUw={s!wa<EI>o@lTM@DaFj%KfK9_DO*f6XCVQ!Qd5%n$AQ6lzGpZSP*u z-tBIrwJF<Eyj^n_w{!c@tr{gS4O>8G5?8#aHotE2#aAR|q;zQ+b5~#WyysqZ^&H%8 zX$;LZ(Y?Kf(YsfsG-jF=*f}~hG`iEZOjvL^{?y$eM`fGfI=K1AnYVeZcc9Uf-+Or~ zb~_pye=Z~1g%MX5Li3|LbjDHLA9BC5-SaB`l;}2{y~TNPWv&m5Tkc|Oo7>AoMbH?T zyUBT|vc|i;<CcEndQAB6G^KZUNa8#mlc%clxPT@huGM1ua2x@{ES4K(_cW_DSYM59 z0Ri{VW%I#<8i`&wk|Y4$SCwh{(nuLrFmo(9f0T|}I>qO$rM6B+_Ki>S%PTjbc1Lp1 zd+^+O!ZfCpw{6~dOR?Ffppd^6GArz1AtfQWN;GUDdVaqC5n%49L?V^C7{3^qbyj+V zgus<ZEtS&0_}EnI5o|pYwN>4uT%P?U8fpEn*1K)Q!z-@^ML|h};oE`+CzY(^Tj>yU zfB9C2%=)9@)8CRuZPRU<`k36Ee7;R-;ZC2f!autt^fnb$jcB*HWc3#=9hH4LF+gVF zw|<{uVb$H63M7)Y3DsRQEFTpNi;OxS`#7NvrSJQw#)A0Cm8)PY!dCdLYID(*|AmAg ztcN|eg{EGGmDl2tu3m+el*C&k01|I*f6R{0g!|q8p~q<8+mda-qhF%B&fp;?nMBoN zC`JHpy@jwiBR?S+Xf1ji!}FmS5Jcor!SAP~4WZz+0d42y?vu(pDU_goYAn3JpyV%H zvwqF)**o4I!esd!H;hdWWiEJCZG8X|#aH0-zV<48U~J&e-X3FC^0^mnUWy0bCU*6X z0OG^(_~6%H9Pin-_2xHaEEYJt?b2tN<)zJ6y}EVu9Y2qgaCsMhg;e#pGB0NPMA-LG z@lT7DK>7Q939x(Tq`k{seV#44kG9ok_|0`2>zh;*tk|UMsmT(PsnU8Q5XpzjgxPzy z?V9AOK^dh$VRF}n<q;JgJ9_&-L8DaLwmr;r6;U-<X!|ye_9Y73$*j7jnBI8Z`t5f* zIwD5{?%cj(X8lHg?rAo@E1-W&(2l**GjqB}k@I!Zb#6Ur74|#_+o8-J4fEqOq))7G z{d8aIPFCfW_YIV4;XBiNQ%EAqW7L{1Z3E-F<YIq0s&UFxoswv|e=&KT0TUzH@X^82 zjg?Yb=Bp14o;SFu&_B}{s_Hag>cprFtkEgO$JUM$R-NX5kePlFkKm2R)0_HdM&k&o zW{l4CZ%QA(5hHx*8c{>!t=kvouj`*2qb%E(tn6qUyy)V|k%8(=(sZV)RdDfeu{(-A z%7~0k=yf$B&?eJfs-aVyqZ6JVa68AH^p3vC;--51BaZX%?KDkqeVb+LdT-&LOYI~h zc-<?*;a6UN*S<ipG>rfEb~|jp>$kf8v)7rn8dcN%4}Ky!t5f!smxn?x|4REpp2aBU z*w67>${sPtw&h*Pzq57nN6Cew*_B+Z1Gt(<bne7EhZ&z~a>81=d8{#73*zi(I5AN` ziom#$*9vGYui?SL?5+r+-DHLd;#r~ImmHXg$9B|z#y7C8`MS0;S{~RP3~jn1po%&G zOe>zZYU|Sa+yy#>s#lof=GHM5PXLHYoamwX`tb1d@PK;y{Pi?%upNIcH4b82@~NOV zKNF!&eh~khYa*OsB6aTsznIKVwB6M7fo5&N1c-k*Xxkisez1`m*BNXZNaN3W>r1?6 z{UlF+ruA39*yM0K97naa`;vG_8@%f++b)_Ft*<+ghmH6hCFQoBO*@@kNXSL0_;f=p z{I~#_AwZ-g;Q?G{2N|>MnfR5c2OY*7dn$R9^U8++AlbXWAHQy^tsgO#&<FTR$yOg_ zJf;uwqnqI!Z#S%d$L)C@cHlRa%akic+sBT7Y>i8rD|Cyp!>-NQ^|O)(rTactqWAL3 zi&bhq>8tDN9+$Y8YD%J$m~{8l(hl9JReVuH;wsb-{Z<JE15`Sq!tOzmB!CQoL?~h6 zO4aS|>vl0fh%yB5N_tg@tF^s_wYx82yOA)yaU-XkV5l~q3%r0BfT8+Yl~oHCA%wku z<L#ZxD~`J5QcIWR0>_Rb(EyXnm#JPQqFe%&Ogqu~P)^Dm*PY<7L(UWFYvW3-9#*g( zc9ST0A)I2y!wxW|r{+gLN{C7bgmM2x7w!M4Y8onh$AIssj6#_G{AcuMKleP9IK)N0 zv33lUf3#aTiY{%FL|o9iW~Wls&`gkjRpLL&I$H&!RZtC6^{WKsy<O5;1SF*0;*c+r z)lQY*x`ZdV+?R-a=`8BYZoatmtF|C?b4Mg=OK;`5ENI8Or6x~SQ+_F+8J96cZvUpb zgs^Vmu`M^BBC<_Q`vMvIqN9r1z7T0kYxobo_*I(Dkl+oT<VbakuDLmO|6QklN@{+D z9Q&Q0bs%p_X!7xM=N)((TNeoY@vqJvuLzEI&a4Bjwdr>}^q+|6-|evVXA436<6l0V zh<?$3)fBC7mNqxt?f<#kJ~w*)a8}6Fb0O~RV4oYOBI=8W&~{^$^8v}dq=M+_N7of9 zod`P!(_gvzqd(1_CB}|^#@9E0Ve4C+NW1s?>ZNnX*+Dzf&WC+ez~1-|N32x}MRqc5 zjsEQ!!`A+kb%M-18MX!htxvZ^S^E8_8NCM3iC;qrt!fBp*SgZ&w)qg?*&sgm0LZ&= zTA%!(V6Q)Ok5->;U_L7!{^=Ihduo?I(HW(u=<!(xO?JNZ{x(9oN3SV=SMz^k)HYi< z>q`2>e?DqEqbT@w5zlg=fOIq_=b32T_38@+r6ZrOGtcLI1&G||go0A8_Kz8hdwIQL zo!3Hn|GC^(%SYaG{JIv64e0>-P%MeavGv~8`@{z(#a%@IZm@Jo>cXf^-LeQpc|WRg zE4XL<o}k6?<=kSXbV&JsF)=xD!W4jp9l}ix35aufFT@cvN0#Fv(e?Kr2YuXR7T0tJ zz`AYLRb^bv*0G_qyQ}o4<2fB2+Q&!XBT-Y6P6fZ*vEeK}4=Zo<15wUP7(vgw;Hmu| z{-xVe?ZP;yObQq$MtW^L=?OvQbUC{#gyKW#yF|2peEd)VHS;Ndog!8~;)4m-yWSCe z+p1$hBk>gO5iO@3RrA1!0erUD#|7JZu0)}u((po}-VkLrd;+PZS*>wO9}lZ)np`Zf zq_HQCBN2TSKQOEuQHY|7zA_3@)}HY5+#m6Nl&4(|6!~*RmJ=|60$v&U?EeQSh8JxB z0RR92AONfY1polEOn?&se-T7IM4&|RMMXu9Md(IQM&3tjNBBqhNBBqhNBBqhNBBqh zNE1jdNM=Z!NdHM)N;FGBOOH#sOY%&IO+ihzPD4*6Pt#BpP-al2Q2SA0QS?$vQlnD+ zQ(IH8R032{RDD#cRMk}cRZLZ-RsL2^R;E`nSH4&JSZ-LEStD6de_5GX>skO>Hd<I( zcv|CI7h5%3YFpD>OI&+glU&eU0$ns+bzQbz4_;hem|p8&U0>>8O<;>)zhMMnLSdm| zlw#Cl7-L~$t7HOXT4cgx_hl+&P-S*y-exdnoM!W9TW5S{ooBsg-DneNNoZkct!V^l zJ85)juW8U}@oExke>ZAxYN=}RYd&jlYp845Yz%B@Y{zX&ZJKTuZdPuTZ!2$CZ-8&d za1L-!aE@^KaaVD!ayD{{a|Lr(bE|XBbK!IKbOQhY0096100961KP?UIUk^O>01E@? z00000*s_@c00000*s_@c{we<O2MYs)0000800IC200000e|XwmlLg3CK@f${-TVIT zF1x#R*Y55h?e6aGR>B}`30r9?Njs>Yl9p8JC+zmjFb^&QALrb&Z)Wr12YLWNG!dXj zREbH^C$xx%B2c|(oQn>cAI2QwnGazWBx7Bk)dbR(OeZ}^2hu3vJ?Tiam%tv=Nf3?R z!i#qeXy%@vf03)F|Ajht8#V4UYT^<dtBIDQ!a08DGG9+UkH(T~?QPVlzGGb{c=l)| zW27vVLMgS1<hh0LoPUd~nOaF*M?hMzt~`3A+Jf3B>VaD3jrm;@RnqtP`_dJoTs+UF zMsw~{>X<i=j&bY+^)Tn-7_&02qm-H_UVDDRP}Xl1e<jo9+?kK0pX)9nP|xZ<xK8G~ z;-hHBZ)Q4H&VH@UH_~-{!6<$=mbKYlHW2CehO8j7_`AujAu6`}*`a4Q6kT+lhiJxm zJLp-}>pggCFzqB~6TeTt5pvU*4(QkiY9)r)JJ?6$?7WaV$E*xZfIsbBBXp4d(RF0G zT^LT^e@^zude52?YB2Stjl~=4Q%eX*<iSwSeoYhFLX`IaSB4H$eWS8(?so=}_cwz` zo@NN~_V&kcOnb|^?amId&L`o1cxF0IwRKUAU`$tRtv2uU|5f^#A3{G+(E23yHUxS? z7V6sa?GEDj5NgHC`DZvB=3P7icm;?0AQfp%pI>xI2|Mw2^k-ddT6LY)+h`>JeKOQ^ z4UyXWBxH_-&s>5TS;OJ!1AWLErt0~w8YT95GU@~fSOok7Q<c@T0Fx7id4E&D95E0F z@cA~iZ6vdY+O}=I)V6Kgwr$(C-TQ8Gs%`ByP0iu|^#=g#`=)>}_!8>?`<hZf1Xct9 z&cFbO1Qnn@^n(Sk0@lDr*akb`7~B8}ci>%E*0AbEZsWLd+PGzS*%UT|&1Uo10=Aef zV=H+i9*rm9NqI^xxQl1w*MCK95m&?)Nkj^fQ_K|0#452@92957RRm-h5u;#qjE~7M z6>>DuiRrNb7Qy0J63bvktbz@(DYnMmI2ecHIGl+~aRna36ZjOLo6$|v-00lw-09rw zJnVexYV2z7zVCkO{@}LK6;8Lo$Db;t0Dwb7ty!)$8@_9<f7QIznty6qbIdqt+%Uq~ z<li()*$Qs(s60MT!c%bmAI$`<St<6216p$d0S&E*tTpj4A*TGUasQ)ff~~L@4#Htt zGZ7bQ%@M76qBT)WG&lUFY2a$>zUO}8e*IOmUTbX4395iPsCKIzYOC6)HmJpFvKp&~ ztM00>O8u#Tz0O{1FMqTbSP!jx)*UNk1uehjv!rjhZ>X=Yua~cfubZ!vuem%d$H>ug zlpH1p%hockj3^nspl5W4g0z!%(01BJTWB4vrPZ{GR?u=<M$>3AO{57ljz-Z4>OtM8 z6E&fFREKI&4XQxpC^KcEs1(Kf!W-_b;;HN@=PB(e=1F{O`G2i>H(fXJX3Co>uHCxU znp<)C=K<5*umX&1Kn!Cu0SP8_1;G5q!pg?Z!O6wV!^_7nASfg(A}S^>At@y-BP%Db zps1v*qN=8@p{b><qpPQHU}$7)Vrph?VQFP;V{2#c;ONBQ?BeR??&0a>?c?j`9}pN6 z91<E99uXN89Z(Y+7oR}Tjnh&Y7?K#$b3p85hRp1fX}4}OFzf>IE;2B5<mNLlq#S3s z2IS621QLZs6DCfXI%#qqT>o@zh8C36FjQ7mXVfy30summHE*+5h(ZSfzn-I;j{yR| z-jkh>s|5V3Rxp!Hk<BD1Hw`n~2qTR$+8ATGV4U$Lm}rv8rtp|2Jm&>ZdB$d5amQ4X zJ(4IbPTFR>9d_Eqcf0Me*FO6l;F?P~?4UyqJL0Hgj&s%tC!KPd8_qcE97j3kypxiW zkAKNaY8sk+yRxC_J8Dif{r5}!_eo5?ic3SY@4XhXYybar75{(IVp!&To(}`KhX)wK z7$(z3wAQdo^W*5wE9bAzitdb63pxuC?))fTJ+NS<jUuh*U(lYA<o>!KrMd^nXEPfk z+b>6zxLl2E*4;zvqElzE!1i_P4va&1gnto?ok<8|m^jl6=FZH6JD9EA=_fhdZb?XN zzafO<9iRU-T=O{@ZtC{Q4~v`ktTf3LKMHNQHG<@vo8CNWHuH<3THJ~=mfYN&Yg=8- zmCU$-zYE|2hHKJ>mC$z$nJbDBjMu&D`c4_qwInChUL?DgAHc&>b{A2Rq_$ol?0?i+ zw1$=DYFIh3?d^A_MI$6Bw{GvjU{Q7LMOkhQD!KFEt@yVU_awQkaB7&q)Ok!`I$o5O zwkOSI`!^YW*sK+wB|oBv1U<JtDxC2S`Y?d|WhGQ4xtCU>6mDIqvC@cMKA{}J*qQh+ zfcs6)s^_*Am6fDW#j0#St2;A12xjCVM87Ct=`44nffvCTCNOpSJ`9|x2i^KZ8o(Il z&J6XUoamlv9<wmqLH|W1?FmT^3s{aGiwMTBfasS87{VirU<?zOjV3|qOrRU7@O)=k X=CFX}AKp^yF8}}l00962|Nj6Fw-N8Y delta 34474 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 DZ+7pd diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff2 index bac697c7559dc20b01c489830273fc656b3793c4..e3f71eb7e9c0568f6144e45c59b3000ed3dda7d4 100644 GIT binary patch literal 32464 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 literal 32524 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.ttf index 156b57a430b24e917d4ce24194275da584878a1d..a645df64e5114034e6596c79103b380dfcbc8061 100644 GIT binary patch delta 719 zcmZ3mg{fyV(*&{l#xo2I3<=4(i3OMEEb?byXwqR|U_6yvR-zz3iB*e%VS)xwJ|nFl zJ@>ZA?GFqL%|93zxTmKl78d};1sE7+wg734^qk5x(VI3=K=vC3hB~H<)Wj4~<B}H) z4E1+_VrCgY0rq>$CJYRXD}a2JjNFn6)?z+mhG2#U5uk-ra`KZCqckhLfEs{?GMvdx ztSDe?=kWs?2DFqxAulmE_2=oC;XnsXU|?VuFUT)0+1swt!@w{dXdvV5f}+%d#_z?m z7#R8|OnhOuc_!nXTE^7LW%a7{`x#4^oS4osZ((U?4Q8`tTgz_5A<wanvz^O@YZZ48 zj|#6m?+3ok{7C`~0yhOu2vrKp2_F`T6xk_SD*90Dp!gPvd`U*h6;czW1*PxERLfkJ zZIt7ZYnGRkU#yU-@LutpQkQa`iXRZZQ*~97Q`@Iuq4865tyZ~qu}+$<UA^u#y<UAa z{iOyehWv)JjM$ALjJ1q6n)sTWGTmh+WH!m{oB3i3MvGL7kCrp7@~ru-r`p8Xa@wx8 zOSC&}ci--_JtG4nFbIIy-tv@NJipCX25x3x$TBe8*ff(FM*n~LUxVc^(^Up$1`Y-$ zkSGxRVlZNuJhy>o^V)`GjKJUsX)2aH0#pGqPlkbo0TdT%3<^LN8-v2+M@^cOd7IUg z5C7l$f5x9>e-{5)_-Fo~d4J~onf+(hpUHoE{&fDy|C1w-%D_08u|;EYQ?v2p{AM95 z7FITP4o)s^9$r3v0YM>Q5m7O52}vnw8Cj4U7#QT_6%>_}RaDi~H8i!fb#(Rg4GfKp zO-#+qfyUSg1p}2hgB3yvi_L*8oqUWYll3NvZ~ioC1{08JI7NT+uBr2xI8%X&7=a#S S-kdUHGb1}NZ2tde;0FNKRn>|B delta 853 zcmY*Ydq|T}6hHU-wtai+9&XyEo3^Q&wmIh>mZm}wWn?c(3$kTSkygt|800pm(Sr*0 zD_mBl(c_Q8g3qW3BS|nygN%q0`$qz)j4UgPkJeoes0;U=^ZVW3Ip>~xxknkIZ;<Fv zg(4dOU|WsP;}_gMcm*Ib2!JMP_BQEtU0gFj$1S{H@AcRDCY6&P0NM`$h`Q@M0YByw z0eX_L<=5@p=jG(gj9~vAKrm8Y>)9cHuwMue-iA46JtnAEqyy*A!`M*oYij1tNuR=c z2uE?j=+50Wp7sv!K7ddM7CiQOn*HdIcs0iHLi$}EU+uR?-J1Y9^#GLGzdO)m*fKN@ z5Ow4DDSu<Fzx8XN2On79Ib#bU=!;p1DPj~9;J!g3Kxk$8b<3K{QZaUO%LxQvgH@V1 z1l0HkR+Wknhy<WO3X)Rhs53Gh1uiGJoc4TGl9J*9#TydK2!cQaB^S#`>IX>*CKO^m zmn1in5}8E6m9SSy0WisEss(xJFF|8yBgD`k5g{eyJZF?k^ICYbR3pEd|6VXEY!|)} zb%}RKs-=0-PYLG}OJyl?zWlagtCCcnQhrOip-NXH^?dTRl(LkW1y3|<wOZ|+R7L7= z+RC*1x+>kY{$jc{Lz?k$;eg?|;keOaJdn9H^G9~Gsn9fQzL~@1UTRnrw5TlOR<HGS z-UVBQ?PdP*{HVRbK38zeA#{9qu5(VfoUUninfqd)t?<R-fh847o)z^LuPA=Iw7*1D zqARhNl;J197Z#sS?zG>lPAK{eB60>Z@VrHP;;-!r8_6K_F^2GEgqt604QR%I{1vGM z4qV5&Y|vwmk5?;Q88IO%9gbufpT$OEcVnm6%j^aAJln^fW6!c@*wgF@_85DF^|QW2 zFCcnPo0<L?v9IF9>-{&lJc=(6io_CWLZVErP$sF=$tepo+SIh)GMzp>W1+#AnU!ra z=j1N3So3W8_5z2~<;F>u%Hv;P*}n-3nc=p>Qe>xlJJrngt|)=se%i{IPo5)0UaUkw S;Kt<4L^p#3afo6uNcag72<x-} diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff index 8e5c2df6f6addc46176398db51d3357316d7b542..87d4f223eaad873324b3e0d42a9a0cf211929ed6 100644 GIT binary patch delta 20151 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 QI}&(esQ>{00ssF14=bL!EC2ui delta 20218 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff2 index 718315da834e59c6f52c42bceb65ebe21699f734..83b49962aa8353a7eb7cdea57fe843af4dc06f88 100644 GIT binary patch literal 19720 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 bXssLhNj(c?!93G5;NEIzo9EzaliuzI?ubzb literal 19752 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 HTg+Y`27x}L diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.ttf index 30b16c37cb62db7eceb91bb9c90bb5ec7ac04d82..9c38359cca652bf7fc7e7f9581df11e3267a375a 100644 GIT binary patch delta 741 zcmdmUkZHjIrU_#89ZMJ(7!s0m6ALcSS>(^a(8<EUz<4UTtVBVcfhCK9VLDKnAtS9I zJ@>ZA?GFqLT^AS_xTmKl78d};1sE6>NC0V$^qk7HP47Lqfb2I63@x`ZQWH}|s!AR( zFtlv}ikW2q1=!`7<}fgHGywT38M!4Dk34v?8G;$wfEpO5<m4wOzMRgvjDex`1yI46 z+{B6k#$ujaApZoAuaK9Ro9d@61eBki!N9<FsUW|&WN*7l4+FzI8=(H%1x2X^jo*uB zF)&QanE1kQ^J2zzE$l!Epx)HUVQs4QI~XT1#WS-ozhybcdY@gKeJ4jOXC9X(w><ZK zo(x_?K0E$Wfha*y!KXqKgr|wj5KR%|6x$_kExt&iK;n_)QK^;E#WG?tw`8}-$;rKu zZ<N2HFhfyOal2Bi(ii1zDmtqCsxQ@EsQ0V)YXoVW(|oP9R!2bRi|#VLB>ixMD#L_& zBW9y@#&X8@O_rJlnVvN>HJe~=Xx?ifZ_#ZTYq`Nn!>Zq!!#c_Okd2egP1_ZAUG_5e zXB|2njT|pJnLBwq#XIGKJp=SmSE%#Ecz&C&4BX71pklbOX(lkvAoTy6|J7Kena(mW zF>nAe1pHz!Vwhap&b_&(eG;SCe>WCsuu)K1FqJylq_bG^2m>=%MuvffVFgfJjX?p( zVq;L4e5g}%^4m@|<-`B?{-5z@*`LLK7XF$4XWpMVe`f!g^=I;*o<E&`^8e%rq%ts0 ze%PfkIjPHdvVWJ56$>jHI|nBhHxDl#zkr~Su!yLbxP+vXw2Umob~$+kMI~hwRW)@D zO)YI5T|IpRLnC7oQ!{g*F?K@1Kvm8Vl@QWmvtf4)AEU|Ubu+t}7)>Vco1?fndd@5+ Z&Qzd0Bhbgpo91t3WM^bx{QsYU9{?M)+9v=2 delta 874 zcmY*Xdq`7Z6hGhH)opINb)EAuA5*7O^RfAu&PS~gVOe5ipc&Pe&J|9V4zsfCrM5|6 zUBPE6Vo5|KEun{%QAB_E2vJ1Dp#DiJBMOb^>h0Ssr~}_Q=l473I}bShW5nolqE*^p zPX&M@MvKA9f7pB*z}^Ocrj4~Wc^Ht#0NOin+-$OzTNWe>UjbUo0D|^%LyZ;lVu1ep z*z(FNPMY|Mwzt^-4A59=E;E!;qIwLQby#W4nBa!OJg$%bfWmCC)xFOZuEIWOuEPyG zDyobI>ATehfF@VrNsFP*iflp)#swJ5D-D*i{8;KHfNLJlX=_!DO;Pe>0-$#W|6jCL zms!vMsOiE3!__5q1A-PdmN-j{;~Dct2m}c2${UU>DAEbB8=r?6P{VFn-mrRu162K& z(|G~Tcf+H_#X123J`co5%;8El`$wdurfVQwlaeg;lK|JVPvYT?9uuUHCtO#N<Q&E2 z25}B~5qu%fgE>ubz!`w<Uh=^0z(h|rMm3bc8k!>pIXlT@4_{9O_aJwjH^6s#RSHUl z3gI2^TAz!eN8-Ls2dFq|)^|a&=yyw+FJ=AD`F{u)2~-Ao1$~h{2rdZ;3;7vp3{!`_ zk_XBc!z;s?h=E9L<S)hXsKV$(WrA`>ITO<!>l>$v`xd`HL7VU?aVV)r^{hdCBRMzu zdx|ktk@_*MT|;S3X=c-F)2A~^Gu~(iv@4mG%$ck`Swq>}?B<-%oaHT3TMar&H@WSE zUaGIxx9SJ=_wX{Vh49PQK-FPU_6i6%OPGPVGr{<PHY_{OMw2pP0tn#Yw;}X$lZeD_ zi<4=(hNNp3NSV9VpRn7Q=)uc1vT@+JBf&tzFy>=Gjy)dMNwmryi<0OfyE1Z?eaSv$ zJDDM7kQre5nLg$^)5CN#ZOj$M!B`oK*hKf+<LKA+G|JWYf1$;WKzx^Op;eARltJ%x zXy`FJk1E9E_J6aru8?!evBL+YIHjE}1WKVtyTY9>y1NL031=d_BnK#`sn?14E{Iqb GM85%)*792b diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff index 50b3b4ec8afc893ad519f22245485e53cb373114..959746ef56fb302f4f8381cd199acb54ab7db0ed 100644 GIT binary patch delta 20597 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¥%cc*&By$+WPCi?4GJ$lcmuDIkK!HviXi5C(arb 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 delta 20689 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff2 index 78a7fd21c9828878d2cc137b501382fc2f1ceb72..e3ea522a6a2da7b5bfcde8aa4cc4825593e3f857 100644 GIT binary patch literal 20096 zcmV)0K+eB+Pew8T0RR9108W4a4gdfE0HAyT08S?W0RR9100000000000000000000 z00006U;u+k2xtkH7ZC^wf{HkS<9-1)0we>26bpe&00bZfjZz1LTMU5}8-9xg+!&`} z;{aF~`4UDUuyFuD()VNjKOeV72wq@T)^C9f<(yP&mscVAxG#*ZGQFJoNFt$<Qfe5z z?-j&1HjBj)H4+}Y0z=`_Fn^8`3Q{BmUkg9}$EGa^iZ%Z6Ve!t*^HgM``1<9gSExy* z9SBVm!Wq~$@+UcY2l%!5udd$J%Zq#$9C2{m9aR@iU6M+r0SE%t07ZK$M)jiHrmnto zsjG4oF7nsLygEN+OrijqNEVqW&Sw{hroL=l57w^TI?YFamb3o7tF&{IT5TFHo*^^_ zJm7@$<fum8VXN4XU3=R7A>%9l|JL0&qzSMoC4uaG{HgB46a7JZyL*>3HxpPONfKg_ zhtN!TWPu$>Gv9x{pK9k^dhdV9X2neuAj@(U2heVSz)|F&lGGh=e+gEd&5BktE2iD- zfN_iet7=-Sc$Z3%>22GNlAS(gS%DQ;Kky-e3LT40rkcB&LtX8l;PUolZBW8mW|9L| zU&fSB=q;cTHA1|ug|`1$QG%zLWf99E_T{jgp^`<DC%>pE>U7oQa0uJ>cNUF#+exY< zH$^~^+C9`+jbzzz5SBv@04mH2<i!Kzu6nMoE#CLt`%C_W^4K#c70ERfI&3vp`+?&@ zJA%LZ|9SAc&F~No%Iphlb%U@MQGjP(dmU%rflIm)SRBHnSXz+?wRV@dE7T%P+W02S zFMn^U*1o@BfT#=7MLA11Lx;$VHN?x^&9zrv(OkKBfB$0l?~(*|NeEbwBWNMf65v3B zihu(Ef@3B*P;v^HT*$OZ${HDPPDfvkp=hosud7oi+A@~e#?o31C8ntx6^8E>8>U*E z;S8s7Hzx_506VYh5YyJJx%aJcFa{w=O>z@_!fT0l^5ZWD0Oc#$LIFVEeG&jRzMnMs zr#BGRN1g!q3G>4}cTV`TaRDIa5yt<MhQ4Bh0c^h02LSN5=Kz3_T5!@-zfJ~#=QMDh zj5vLBnlKP-j0Q^_*6rK9eLJ|rJGPTMvlsV#>;1F&V*|`%IJE*jw@o{-)4SrTRQx51 z-+%T~XZQcfV@D1h+`n({wvFo+{=Z<I0BD*CJ^@W>=?xM937r4hid-WlSUJ_o|8&s> zKAqFNh7pP}p^PVKmKSAJH*MDs=Mk*#m>%w_GJmHRwT{7fiM<Y>d&cLFytDy^3Fo_t zg%3#1P5#N_u1C0g6L~`DUPe_P1wdHD!GNd#Kz03;-0i2x#5O(8=>TQ%M6CHgPduG3 zb>Tz^dxV<yGa#y^;E6zMJ@CZ93jF<wB!8McoMKoGZ$3v+ab@>_<Etp7&koG|xK-xa zP*Jn;iXI#LRRjnT9)ZH|HaI}}mFFN+lZjiET=t`of|Ng58)rx4W=a^xwV5Xa3?R|G z0@-*K$x0w6!HF1A^(0VH!K$*80F~4_ehU%TGK-9fBNQn8vi-5?H8NC^{5qyrF2Av; z<_^=_xO3Ml*0f05WkE??ngMeIoFd6l1wrR#;>iK4UnNA=iX{Q8Y%h=HKSF01?`_d) zVy6CZaXe<p4Aq8kQP>7)Hv77)nlN&8q>^aDP#kR}C{+e*(77$G+oS}|M@BXGZS+T8 zK0s#}fliO0z#gscEKmKDC{D#Lil-74_fB{Lo8_rO@dIqclk(n~h_{T&U&)jx#XF$} zsNrNW{3CQ;94&BaB$QJ{g#aB)gQxFeCEvZBj+ykMKNPKL_Uric?KR+}xbz#=p@KTz zE9xPIs0FIsdKAYRs^UhJixI6U$mqo@dwvpIr2Im=VH1s$f6*NPu=homwnjxvR3@)E z$5`bvf@4;IL)sGsp)@1r`}2Sv8x=lz7pazjfpQ6y32_ZbMD4d`VUtu;4dwJ-H*!98 zcgj2ssGz^(X+%XofJwk$78tMy1l9x=)&&kW1PN>kJZuTlwqBqidS{mpeqDa}J40_{ zgEu#l?2v6@#R+Tz2D`w3Lm=Q3SP%pbT!IAL0uLTRsss|WP$AepQB%?Bns?)Y@xucS z=MTXhbq4L48U`@sF%-7u9nE9;LqbmMY>13cVYJ4uRhCzWc-4BSMXAY8ABzFE3|8a7 zW#pt4i^yB=Tw#Oh7p(6%{XN~OF<!msnE+Z$28ReW75DQgiRM`AnZo*sTweU*X;e(6 zGibyjI9%KDarrgLq#1GH@}g)Rc}_8}9=_<A0l`F~Uy2!=(zvuPApzQw@q1(&(NtoS zNPt=3X~2(4uj5aAuzlcu;=H|OAqgh<KykqRIvxX(h$Ws9k(BKR!I4%<Ch|(Xt3Y<d zQxeKqD3ldC63IH|9jD}DB-W8Ov&@8}uIWx850W2dHNSGAERx(MO|5WilG0p8V~RbH zbAw6bCN`50(ssx0%GV$-0l<i@;c)SSg7$z>x+KhFgI2|v<SU0UGUowKmpvYDex;G> z)P>p5aPebad?MZQ!qfISXCLLUjF+HjXd85V6VX~zL%edyURj>*RWB6YIq29cV8&}r zt%6xE)`QktmQ^xSJCbM^!Zy@g46@G$qly+<w^QF4yN=2aH2C5##N>WxKPH%?wz}hF zz?;O3<PA1t0)%Fh=!td2*JskwjnQe$5QxelhdW`9NqcSw70@ccBq?2xnjWDy9GC`0 zgRwXoQAQvB7+`PSZh#q}7cvwOjH(ckvA}!+B7-nRfmszIG8dRHggg|MD6pzRM0N${ zdqO&49|aDo5RpTH`H_%OI7We!Dn#T|U@i&?!WjyjS0N%70&jT<=6L2;zXe#@T|^GD zgB$2V5=4W*;Vcul%0w#@NpLslJJd3TR;JL)6rM_hx6ELa8GL27(8PlqB70AY>som2 z{MGm|wo!4&06^f0t+lEXzx8@?3V`Ol+3*2mTMUqSdwsNF2n+;ucGn<v-;jcRlYh)o zc3xcz0Dz5^!#&_7`;R`!{K95dO{NLIGQuN>2Q8G4<#xqD|HyG~-lq7{m`v`K=cw@c z(%P1}p_Nn3W%<$!MPZ1{z(YAyNKh;&>CPLANXWRdh%Bx0)VjL5y6gNBzD%9rOG`6% z`sOx^(fj5Vs0^l}JlvIVDaFF{nv|fePeQsFyhM##f`w#7TcloGAR-I&1w<CIe&zF7 ze58gCI~AEv(+k3P>OB5mV4eC1=Q$TtK>!%|gl)n^J%s{=?`%b@ez0Ny2DyId-{^+* zosvP5Pth>>Yc*8}D^`@E^)k^3uO?1GZlI63trn0*vgkDt^LTj;p}^gH>4zy<Vy_bm z3^a2jPE3A0Nk1)0LPoR<NW<g8nkQ(R@RX@$FyNh1jXg996)l=&v^>-{r4B+_v+|Il z{Pu)sajGoV`^nY5ACj?4J+!&(Xq9gyjpWe=0<NsQcEbAEB3>a@d-D`(v$jA(Evrhq zQg0$&EFP1B^*{lS$cgV_=-@h;DhTkPj#9IvqY<f;*n@^%4fU0K*C<_|;R5PD-NAON z2?R++i~ZtNjDpdAOEGPA*MKWR)a&?+7)`&lZE+bmTX7<aIFad=8S24Ulvy@!V5(er z)F9#nsL$_ZZ9;V%8<9YTdMYm^n>-ps)2ew63TI~0spsJ8Jr@J!!m16kN${~tm-9u7 z`fRHI!h<SPtj?NWBP&LCGL3^y3~Z}7AwZPwbtkem5w?rCT6wms^?^>xOdEiUCJRcn z%3MNyn<`t3o{@8r)K*Bhp{m`2r?05Uxx|Et4vy}GD$9x0+QNhb!#=Iaz`mv_ikGcm zktcEr18LYq6aI(#jH;8opMWaw!}cwPo6hUwS5ZoPaFJX5-vSXShFCB<?qUD{MsY6A zPWtV3tFz+5Bstu%z#@oJD+nk>!)V0kcD+vHetT=Guc+R7%8$_d7GIS{N8clj<1Tw_ zVftZW7K!?0um8*l+Me9P<G<t4tn(hOQl&OTN>_u6ZSay=E$3a#QItUUEHJ0()OO!F zX>$_`xfPTCoqgE4$5svl%NlK|$P-<n4cg7B#hpPrQ4NbAI*El5Yvg|N<8HsyXVm|O zxy2FBeqbh))~Qw%S$i*SpU7};`&;Mo+)9Ji>4fT{RhHAC>$K#zTYCjy+n2H?!!-Ya z!K^A2T{V&4Dne^v4;CuAm)=CzI5eeBnJCiGp8*L1-hGDZCkM@bV#~^7!cVX9Pda^T z6e3FVNC!|Z15+G~$H%;#T#eU5iJu2PfjzLR!>3T6e@f=bpeqD(KLqM|TxHA=$pb*x zCnJVEe-}g#F)EuUV!Fe<yKTZ-%M7dmfg9Hb@drTiMn_*riWYZFJ_fe3(@*@0m(KlZ zOoiJNQ?Oe(XS6sX&d9cP+(wwOr;n%W@HJkis%nXdpewFfHxRXj<YoeCUQsp%K*>xT zrgNzRn1`^L8q?ycAQ}W^=}swOyJ(9#J;Z$YW;4ZZxoPA$4*=+mz-5a3LS@vYpCy4b zw$bShq~)M-%dP;LqC-rm1Qd>_bNy5K>B)?&^G$2ef)wv9kT?h?fi#52+273l%)>(I z+QncHn~L7`x8j^lSCxPTFVzRjmMmgZMUvg8aIy|7sxQ3s(r0;FN4yKG_=BCA4erQs zU|VM_Go)=`XCNo~<A3_;PH7HPj$B(|ucEOo&YmZrRMLLTDRV3D+RbcHw`7W0EEQ?L zz>FuET`$f-UbIN7wGI0KY^-n)nVTU?EvA{zL6bb7ANg&Rlaz%*Ldzi4JIPh??q575 z3#!d^Nj8hlo3#f4f^_h4;kl2pUn^2hC#j&fg~dq0!p++>Sbuy|zqWuNjjQNj|Ie6H zhi1UhHW0I!em{?knKUFKD+w+JY#C)m92p@*&m4S8by!n1K;+n26iT<y5qUxFG5kp6 zZ+~P|lXcWc;#Y2?RAs2`w}@B_;S9fx7|w*LHNv546PqL-p^a|^yo(b0WOWFbOEgoU zTTqP^M%nxMGa&s8RN|!(B7b+LO5O+W6F!T04r~o8h5vc!T+1*P`l^80Q~1_X>)Z8~ zuPy#hUTX|1t0EkF1ZE?sB~wg9(W&*Rw<g!C;;`5j<*(?qVM92YW^TA*BAY*S*l;L$ zOEN~-HuwaeilrUG;d=$O-K%o%ewRfrp~^>PD{2;?8599GR?^uIiz|p2^Haj8k^wO~ zw-dd%ZzyUmO=}<WkKWATrXm*52rkJVIXV{MazW8HqMu;VGJ#^xC_M=5m!bB<o%v@C z-aO3>d@x=4=3e$A!U1eiI3u(>GE5ORrz^H#afvd1@lts!yI67p6p#Og%7I^QvBsAb z-SlTRh~KShLQsPl@8+flUBqvWwHmQBE$qdD3TPuB1LGKCLCz&Vj7;>@M6M1lwF<>Q z=Yox@e~9UF9b63YI{i&1FF*u_g?b<+cA+LgrR>;;k%78~isHk3&(*Up-38SL{!_|F zt}hA4<MDj_C^_qFgH=_aKunC<W;o}Oe?_bytWNQm*oR(ZV1#Bbn@-HVfwuS+!)%6! zOtv)RhMc*NpNs0s&|J#u86N<TH7TQH_!+r0&^$!!Aj|QdHlPMy$ZLr5Z1z^mfM#7I zv+Ihz#rM#Nc**79+N|Iscw%!?+^w97vLO7no?}m9#>qG$*_AJi4?8h#6^u?a5@r~7 zG6rV5RvoyO|Iktz%8T2!*Dr@q%<)uAm`XDqXix$vGhLra6>@1Q)t|~@N6oVh*8LPg z7MoqQ4KyF}q@VKRx_j9_N9PjjDO6TaHpR72Ar?9rOlpH?<u)1XqZ0YlZh381sJq`0 zii^s0F@6%9?86)^8i_0KEbeIrB=}tLgsNX7in1u1KGVjUBM#m?{hnag^V~%@*wwyg zHA@`v*<R5>a>Dxp87-+TRN@84R%jX<K&r(u1Y?NTOGxU@aJSAWd#5O!p2mNSNOY!1 zBA2`Y$FS&sOviVY1o)|UqXT<HI6B`ar$wX=5Mc;EQC^sMaM7GIT_!RP78ahhA~Nqs z5XzY!E*Oj4%N_VbGZHmjq@zpaK2<>TfQ(=MLaZ7Eqgj}?mCsqqPzUa&kB+edI(x6> z_?g{~<ZmNheroF4tF;fliUc2wbkxUZL5&f*Eb%%2!yE6SO)W=x<E*pP;-`_r0+^AO zQtV4$at@;%A)vwi9Vo_<ls8J@WaYKeHy27={;dBP;9GhA>YBZ+hwni!I*Tmh7D-Ac z-Tjf_v$ZVUohIkYc<gJT_nvd;iiugF2g{<-50=Vik+677_%;K^Ov8V3N~;m@<hWIq zN1A;kl;>8Oly)0@@HT^IpQdc<V_-EiyC!Ho1muv0<Z2$Q<Dj^T|Kw3q15#fx#R@F> ztNIsD(v|xVal1jJ@rU1VYx`O&Fl*I+VXxCJd=@ORu;!DZm1DJz3%3?eQMaQd6+R_a zHU~oM(8V$^4y4*N7I0F~(je8uVsVIx_)t8L|Hu5w*Be=^K*A!-N5;-tPHU$fd55ia zvZ56#t_G<a;FyF(w){Beo0udm22tuI!GdY-V(?TaoI7B@byD61u}m-FynCgi7))OB zxU1s(ECfMghI+5JL@mc68Bv$_j{W`M6O(gxU=N|ojS#+Rz5!phKJzDX-ern(-Yur3 zdR&J97`Yw~VCKg;7CX3#GOb`rcGI-@3$c;#X7AaHe0lM(!orZXMX0(X-V!L{4Nju` z=#wgjC)A;we%o;)&!CeeD=Sy1;D+ASrg5Q_y-)Z(8}fBS<lc$gJ8<x$Fw5Kq52!mC z_Jj=|=Ua?1bAoM9d2gl?SIC_FQm-A|L}S7nT7i-N;EzW7=IBerk7|vGcfW8jE+rL$ zL_^r86D^NR+)i7^nuQi+P-mYUe5o)A>t#{n3?ThL*SlJh%kOJL6tFZ|HK<-)bOCEN z6z4&MdgsXRrS+XMLY>Hry==f4-YlA6VCQmpYcKUbs;*zMe)jP?M*U-D`)xyxbxL`) zq6C9m<n9)gZbuc;O7n9fi-;m}Ysveb)s$FJa9)ntUb}On#i~7!_l>(3`z#}SbQ#~4 zZ!Ev~CZQY@j2EHoa^mRNEl++-1A4ge9N>AN<PGs#KIlKC42HGS@bG$Q0Af|Um8#*u zVNq}1PXSgXVMtv>#@&dtygvwki&f)zO3xXon2{ziFje%_yADo~r=zc9W}cFSc6S(! zg(L)%p3&Y%hUYHM%6V(<C=s6xA^mOf<dJoyWDA41F~5J(4vJ76McmK^<$#wQ@;d8# zyNK*qC37S>SA0%*Zd%xc0+E$KqY<*5L|iMnkEVJyO#%Vjw1#X%cSPG{`7zeC)Je+; z@Ps$pEBqM~PdFvt{f85=ON3f9KbIP<GwYOR9(QY$KTlJ#>7A}v;=!M_XqnD+oZ@x5 z?zz7IV&%hjF)}aa4=d~8RyzJnPT;3wR93!A8m45!4`}h&<kXa~L^LChDiC-^i}rdk z+gVo&r%OS#WW*(<5QwKlaj|6Q@_i)X#^>OiOO>oVQMIG>xi3DR(rx^EWK@!Es}-sW zb)B+DZ1XNhb0v~y4~z_UzXlq$NjI#KkNNm&!(0V$>NI;sI2v{tI7JK9?JCP?m3UZ3 zeZ?VIeZhm>!${Dg^_sS!$~-hYs}v?$qCN5yDn1)bM1~`=wzcj9o{^4@$9#{4q4g)i zDBmbM$D(}0`KRje3VW&n+0^g)O2_r|>x3!K#BXYNcSN-K42&;1IltdYBcU})xegkw zLHt>EW|t4n5?$Y_cL{GL;xtmxLDcn%0tq12F~DnkEJ8O$?<f$k)1m=Hw%*MICQSPG z^oNA{%FhbAA5a}ERg*ur`1&UZ!n0_J1D_<$OZg2h1uur!eekp2N8Uty(7XyaeqhdK zZY?Eg!kg65ekS9xgYsoBK>OrW1*0-Um+{$T7p^$v;6@Gn1#3A!I*e_ccPZ4g9s>Vi z7TUO-TLLPWA0b0BtAB8#+|qIv<~5O#mV7wEz@Q_fz*Gq!>De}-VtLJVJ2>e6MpshV zYVUb7%2gBn_G0N-%a);hFRGG?Y#GNg#wiC9nh+h(mNpg5!Ddv_+byr63M$&g<L?_I z&i$j(2h^1&59}u?@9=i_Q?kb5D3nQio6c@`Kbf$*d?{5w=++Gn7a-GdD{5>;hP_qF zbtb^{zcLCnBJJMdCofrSb*#MO^UG~U%m$pz1%n1FZWCt3`TW{@EOJ+6hdGxNa7Z)| z+bm0#uYV!-j-5YHn_exn9%P;%j+Q48^y8ol{G5qDDCxv-i0E_E)UcnlvS4WaqNx6u zbJHrXLF*}`NrPU_QG~IjwYTlb+Q6C^%$&x`>^tp!9UpXlNF_GyBjlIk&Uh0*9r9>+ zKmD~RiS=$$+ng?3tMubO+ZeJ7nuye1ItpQ8nhUCX@0n~xDBf;<w;O;mja-SNEt0_4 z0!PytkNzHQR+!3$!$2k;eH;uQA`M79WE8PCsJeTN5?{rAYtoxh87!D!Q8&THNKz%h z82VEPhNof`AGED)nv>^7Po{|iE!93zch2vOF9PWa|Kz`ENX~P&-DbaH=caXWdvUwS z3;mO5sv!bX1YQR!T}l@bD&|kPS&-S{;}cO(-gHBdKr)L7I~6&|-|?fo2+8Bf-yl&| zN=7Y;2SL(ryAAVYI^gVoE!FkAx`6H`?IMt{+6LHYivW>rr3j1D228@YJ-p75ECW;9 z;t0(+x#3`5z*$-m?B%w+d{bv<aU?FMmCsf}cLIiWh8~YT^IxrTfVwOczMf+!{*4`p zTv;8kXL)lZ>EC9DD;EQheiP=!y~uzEsBdwwJ36<mzZ(lQd2-(E&nTXk+ajFe&_m_6 zUwo$Pr<&*Ej$*fv=0Z|w-R4d8REnW{!wAtZ&o~wuNcXJlt(G6L8N-jS!LMxq;qlJd zpYb2rA`YTmWmpeVQ8DI$wB+-eh23#_6O`eyVb7lg2C}R0xs$E-Ys!JT#*Xd@>h=v_ zVLbwpAY?8ZCRg;+?9k>=Wx~sbWQ>N9f!F=yraTyFaYnW@i5!lsjOOG63m?CMHgeNn z39!fFfVIs875@aa$a&6*-x@YUT!?hEuvuXnU<8<z%qpE;p^ticNp+qyoE<Oy2SQrh zK+|(CiXGKS4Lf2|U5wN7w@0UZ*AKv|d;vzSPewS%&<$+@$*@J!x)7H9ZBRl8I(I(? zs_FnrU>xnCTnvE_9;;X#z}y0hYN`S25DhSs+KIf&Vb+h%w;(A@F-|s1(7}RBXZ5w1 zxTK_?(yXRkdD<1)rGm)Aez{M*iAvy;yPWjmJ=>S>f-c+RSMT=J#n0etak`+u(y)}x z&aKaYlch~8?y=XC5-?Mozy~`Nen2eZ!b(U68Lb0s$~BZ+oc>M1TyJ%zrAdr91nXCQ z76k2fQGe2xxkG39F@e<Kf*|$)ia17WM&tT)n1c-6*7_i(I3aen%Hsfqb3p~<sc#db zlLdoYw=%1B(=0aA_RHA4@gTEL_a=^tL9H%KJlQOZ1Ei2%W}W(WGpH8#&X$%!Tem{6 zW>h)Eg$$7v!GxG)MCm%Ch=_waCJJ6Xe2QC$5wJ_X0s-gaX&0ZY_evoW+)+ZsCB>F3 zoyZS{@*I<B7dJJJO=+QLY7Bn4Zi8+;w`Jx!qwZ*!vqRnhEPHxDFjpRzlx|DMUS%bK z@ex<}+|?oGrOz!c__p*fpue=Xx}>7mW|-1vl&d-02jQ;$HdDYgTeSFtGpgVSI_=B5 z$8jzz#cj2z!Xq|gxCC6F&H9KZp2YZ24`>u&AyAfUyF0~2dH^F9LSA_kd+`7;J)Knl zSLm`A*S+VU)m%;fP~IqkCXh^XmL9dsS%n)4*15C$Y{?u+qwQ1bAZ)&ekJlLI5CBYQ zjK2X7s6fftWn~1>pvWo^A8vs$?sIsF$K(MXZGXM!N3p{&vvMVZVddW@7F#RsYtM5D zgmp;DV8)8nBuw`YT-`k@`63Uf3;+YV2nXr`Y03}7Ia2}w0)ybp7WoVX%VV+j>Innv zPlLeW6i0TnU`{VBJC@>j@BzRLL|R&Ob{1R*<><n$2j<L0Z8!!p+Att)A~N5N2kBRN zrC{y)-ZRhTuhp20K3in91P!~;xU{6qW}SIm%!7LYns!53foUb?)Eq%zxGmOP*+OM6 z>*LY?H<I&a_8pPpcUnTELsEpqaRe3xAf>_u3dJbW15lI?qPAB`NRe)KZ<345j{fmo zMfhnY<pH+dx`vy!v<gQyFIZDEmLCb*d)$5fK6iO=nSqC|Z5_JyzXgqH?^bwPUwVe1 ze|vvk>+kQEJ=PG&Z)bK%OHM4V%)O#&T7sy|OrH#|Jq6r&rmFM-7A2QHX7{+~;VrE| zvwE?5k!YJgmvt7J9$3>70C1}WyzZy<n{?9v6o~-?E?&-A+`D`F{%XFSgM9wJsZZD7 z7`mSCUsj*^W+02h0x34M`YEmH<IQt9JQ=$yWz4HzFSitC>5QLO->k@Px+)sw=|<eP z`Po)ky?OL?(Il$ri4U{58NM?1TFXPcT=WVD4ui;4&K-$<miM#bcLePGIpFp+!Ck)% z&63nD&ArU-a3uu<?rN>!Lz&3d^jl>@KnaM&A1oQ9dw$%^;S03Varrlx{nS^s>t5|7 zvl8OK&Qq{8%M!n4e5ltgC=+ZU!Rvm=i9n#Y64>EDGykMR8tp8@IUY~Ynb%QYs{MYA zZj~PVeBl!b#q!YiB}-N+uSnXv_CEb|j3ea21z*#I&;w}#3fNIoR*v5OE>t-ql{#|6 zEA_f3vqRbT{Jv#oKWgRhdk$R!!;nyv|3yMb@z^kndH0ZV8EBZ)iE;mD2vxBQ7zRMs zjD9`lKI<jeEVb6{Jzal6+t^vlhlL4<t*)m%-$c9KT+IRj2xRNu0bm<0WVc}10LL&b zmp=7V_m!V5Q(j<0I>Nc}#&!J-3d*p#Ft~r$hP;>aqsw|_q1M%?e@_qx%iR-<<R=v> z^J>cJP3pP>>sll88_^&Om*O(}%hu<)oJo)_4a|8p_b#bESh%bU;qKD&XUZ14P#77E zj&Pq#g$jNJ+QWU}t@p?vOZpsNdM1TH!i#gd5Mq;F6#YNG4oJ#c7>~LzLT7`M3<XIg zP(ud)zJg_4h~#C#Od)!iFLYR;iGS@}H-1TRn77#b$f|WzYFo^zk`U=`8*>>iQCEQ& z&OsUgT4vj?hXvZ_1O##a+wKDy?upNeV5~(VLSZ??fk|7KMT7v{r4#Ylqqv?^rs)Gt zC!b0NY6x+*p81M%CEok^SD}@qKs`lDVDlIt`~B{rG>ng!OJYAKAYjiM-vIMy&-$=x zH=hSZc&#J`P-v7b>!QT553uz4+F0nbi#3Nh7B6d%H)=0V2-;d}AK-Q&+%<Zv0^+R2 z2whg9siqk$J?K1^wVN?;`5i`~xE#=GA^?VSH&bc+GM3AMz>Hzb2>8US;3!Hy4{iYk zC_61ZE+DG`s%rn(DZU?Hh?YY7k(bv_?U~pq?^g7&_#S+UlPR~30geb@nd@d~nGPD| zU9zr};mFr(4U7?m%r+M$__bt-9$m}7QVQ~gtacTk&-!(L<FdYGy&HMhuQ&=REk3?z z+b(e<h{y4*{IYsrpq!V8NP`ef!60bF@KkO8IA;@>gz3Ki+5<zi;wY%EZvqAa+_+mA zSh#7dmxs`NB*Jp(e!Pe4w|=#o7tTUpGaZ|KnGIrP6BQt!!}0%r8zx;RKk#6zg`VNx z_B-qYe`|zg0%6ERq^TxOxykaF730pc7{Ax3Igf70Bkiwn1t%I(Q;OaHQ&sWfuy{q? zS@3=o6cD=ULBj8}!wKb{D~c;cB{9dq{s-o$_gCr%)s3L-CHqTiHpM|`ecV-|)BmS4 zTmnsig&*Pu1E}99Z<1R_XJtC=YK;r?;r^T*V~8H%eg96AFoO4|)*3S`nX1rKPmmK9 z8r~nx*4C)WIEk12ISeBw)AX7Pfy5rIU+lW5vh3_m7XLC=Smark^6;g*Q5`7Ya%QUJ z=z<OtLUIvPd?w6wH<Xl@6J9FsMK1(r-$4YiW7p{f%(%FqPUq>Nt8!L<k%;koO-_M- z$x6eP8I^ziMEnc$8X6T~nQ54+oSNUr1H^FJ@y)P^kWju_S`Y`4Ku~#Do4GS>AP`@t z{yJ7_a0`}SfI&)k<@hf10_(_;6Ofd5x!9%L3BZ||x^`zNKwVF<f)L)EN;PdCFxxmf zb)GUkEs0r03)Iug@eY9#%FDpn{0{1_C0{abe0q&;=X7=8FP$cT;7{y-2Yti{p|p2F zGj>yB-?Gu@-q*M#Ph1f?Lk-@t7c-g@X>X-kHsi$GDq)#GJovmZX|XS~s5~H6<VEfu z|Nc)YGy(4U_90m-=4Pr(3$nfAh7Erm;3aF4uzi*>f!iW2vJrzWp*=EBw^}<{eoHG@ zAe$+-9(u`N6g<9RL((=F>N?@ibLM1AEmIlGF^O=TuM*rziwX4zSn}T_#dD9=N)vKo z4Ivqo5u=jo<iC?~8fyF%s-|Q(B&+%P2ap1A7Qz-K*lF?veq5VUk}Pz9>0{|*UQ~{Y zPCO)wncX5@OBM@BN%6(*ONl9J6nF=w%vBP@ycg99{)4Aec~Bl0VR1yGbJYGn6h`oM z)<FKDDII2g!Tzu0|5mtun3g5~qEn5?$xhPvtAnRs_r{sCnkCxhbPJdB_*%dJF308A zUbH>WF%Nur=IV+iMoqHLsM3<tgq&z=y(-Y(wsgJR@*V5fpFh&VbKDdq@#9*uN=k_E zm_yNUXi{eBvhWgIVdKpbR0v&{G+rpGm=OyW2+*L}u*J9~WQyIh7R`ue2$1_gh(_$X zuyulk!m`|&ur%g=6c%v#Tb*i10IT1z{cO8NCp`V8Q84Gvg-XZcTeJF6QK=$nr)dwz zA~4E%Cx@hsX1waK@Xdn7qw2DaM|lu<_O);;8G**j;qRDTdSb0~W%4=hB$?cFYN?id z(>(m-?!WJQMb=n9GtEo|Z)s$UAQIy1R^Eqs&O(oCb=q8)a<d8{l4Vlk@jWq+#zhGj zai~W=8sru2SETWi%JWa!oj!6tD{#Hl|EiR@Ki`yV9uqMG-}&qPMc*0yYwI>9s(B6; zrpTNsY8iBA&&fA`W+Lc-)R0IB!z_7gwCq0|s+<g%RCEI7zL2_SR9#-Z`^Ep_*likh zWSV5o*0!w)g@kpE?EzBHfe@r)9IOF0ipYI%rnv^i0wCejar+yu8HI(ChHtA8UaDNM z*vz|LXhFQsEq&i7<h@9DLtQd6hs23W+#g|GqdWj6=0d4(Stn-Q8KY~+FaWlj$053u z0>kLARDg1M9@3{oxEKeKld;1j{8YdKC(Uhee|3rMTEW+;UbNho<>aYwD~)vr{u8E> z-ZL_3YI2&et(YUCQ^lVg+NxTl+Yq=lf8-F^N#L1(JqKb8VEp>k%!<3;(2RI`jl<LO zY}=~X#+>|(Z$w*3HziWtkz+PY_wgbS&K}7~ZZr`0cCUT!?Js_&VLf8)T+{#50!kYk zkxz8Nw7=N9<{YA$3MXCFU(XZ@h=BEUsvNRsF_LF&zhR4UI|o72lpKdF#dm0!jtVF) zRB*}am?}>*8aGKvLcc-35rDE5yn0b&5tWx9{4`bDuP48i5-BgF9vPC4pleM$q0Uan z*UYf3sy<V9gH#mav80|^F_wHqke*$cNokrSN|Q2wm?JigGHGO1IceCY9(`<7wB={i z5pt9f+RaIAvk^>Aa;9|h7WtpA&C)8#aYM4wh^KJA$XI4nI&RsO)$gWkTS}z2y(E@; zq_X{516fT}+$^2QxqeYpDiRici7902^WQ0@{?zgQK?Jpz{GXIYrJxnsTgDJkvRq?b z8Wo3y8E(x7b6zpJ!)0YkS*@vO0ly;;Od3N6BY5gRMoMEIu?kb>7|nu!RE2=b5$&?v zTbB#y1gr3j#pgqBa}39BT{i@+sTRF9RZWf%77RSGgA_)Z@#L&mRTi=Asx-~*dm=R| zB)OnmSouY^uk__tC-K6uEmBQ^%AA(OU{M>$z+XNjGVVX3Tv+qYd?+N4?UQCWJuk~# zqJyto6qPDk*R}oZi+)|7S#jxrLa%p8(<MK^CQ1IlxcFp)yIOjf4chIYj4Ws7{{5Lk zd3S2l)u{x?{vu_;qW7<6(lx%{z@0?pRML*zTc55^z)0QSg@-yCE4=5fu>|X%Ak{-v z?>J~KE9HepbFQ$&`)+-7Pr`F@&iBC#UzmW9&1ILLYpJRBy>|7kBqg0p`D#;sOhBQa z^z*84D9p#7TJ70BEJ`=~@fv_Abh0~D*!*djy%mbHfRNPs^{Hd^zLr}0hIEJ>dDth% z>-2AuDV%BsjD{NEs?EU#v$6T}vLG0I-0dI+IBeYJguxS!K3P>fdvagX#8UwDZ)o8P z-TLXu_vxMSSt8Ku;X&8A*C9V=Wlvf>vqd<}W1^n+?+2x_$@d0olU>C<;<fnXX-JU@ zu3VW>s?!SvP7?=nVD9-q6#9T7rd!pGBV1}$_*vuzr6revRtkW{^OI1=EK%16cF}kO zAf2QaHiE;9JYds=pT_7IKw<p12)y7^(JzJUag7$7y?G+JiqDIZd%)s*@}qrF*O_qy z1YnlHZ5flxB!r-gE$KpF&NI(_mss;LlmRBV96<*QN?y&~ScEM>Ca8!`FBBRbTy}8J zUZ1CikBzwX4?#38)VpilS#ezw{V1yofz><VTuji#2Bmzs1&8%Iy?#e`$B+@6f8}UQ zIBzt4Ck@(<BQ<;HXM9(K(OBCh>*4&{b8VCSDvtz!^q3~56)@*M;`z^BKnuC1HMe%G zdUgXa6~z3chCt9}tMXa*tOv~2M<R{vqWq+WNDT_pd@%7PL@I$Voi47Y0L790AqrMH z?K+i8pTkkS3ucQ2!`ss(+_0WS?JsPen|11`@gx!^L2`Oo*}@pZH;`MoyQ6(RjOIan zMD?^b|7D*$X(psc+5OPlbdkCnkn*E!x(=SCJ@jDriWQOuX%kVc?n%u#-BW7%`e5oR z{%HF`VZE#ybJF5Uu(rg%wSV<ds+f{{STqKOp=$1U+@ZO*YGpizIc~I1ATU+keBFmZ zRma(0_$ey-%ftWcOA%Hnd8l$_Q|(gQUm#V}cL^-Ff*`TDicG3=W#zy5{N*gwc;*vZ z8~G2T)z(+GytDI^Y)|sx8Y1(J+dT2vlr-y_625%Lr4%T>^nkv<Uor35>^B6TwHcJ& zVl@~q4Q%B{J6=sYhxmdTeDGf9dPP^?B2|ULk;Vv2APB+`oa$xEf_>je8^@N{(a9)` z(+QZpjNi7B#5c8e10Mm)<!UEGTU}-r1>XSgUPo<^ATO>7tIEf@Y9_d`pmy$WLCMkl zZg1LpOT-$;i?>(QI)aay5rz^lpzc`U;&cI{lj>q@W3{1*(bd<-Ii;s&SeX^cuC4aw zDpz%dyWDGU@)9%r6bswKi5Te|e~=0X_IlUST)0@ZAkcDw1BLJD*tdr&BvApyV>g~S zsNi@cev>O2OfC1<(4qfhMpVD~{sta=7je}D#Ev;EwKXVjEb&~!%y&{1e=YZS+{()0 z@*teWn|IkMl6bQMtHfj=qPmfQ;Dh5OirD|QHa$NI-9^f(LdCYcIkPXLaQCK7EuyW; z`Xo<I+5c%GcfeE>_la6$G6K0%N`GEbyFebTcCxq#mS5<wH+0^Qbh8Wf2h7!4j_HHR z#`f9Wk#P2ZWDqW*c(8+ZwASwuD8v6PNzk<)$PqBK(AZ?}^Z}Sin1De#d@y@=SjF++ zepz?EorSAV)+Y0&D9FowW(RqZ=G)$M^0Td6%@<4f>1|_Xtv|0VEoKTGd_~Dg!=sjR zP!%9L8bT|cBL_^z$~eML{VF&p20G~nrP1WfztWYSJxM(|`g>0mY-`l&myzzX?uEhW zA$}77wwROG*lc&?y8j+cHvjMXs-0s!T77V)IdfR-{dj?DM98~YXiosJmIT&DrtaAZ zrgJ}E667|icK-KH@{~$JU~DKrv(zvEVOR?m8Q_qS?XU9HYp?-r=hf+vjxBV#EPHNH zw`y7HuRr@S#ZO!Q86=dopBs$+h8{jEy5c*<?TwVd={n}1xlI|%>~Blvth*XCuL^ha zJx26pg8eqm%m1+8yWCrh2orF|zNFJH+oh$~z}H#v5Bj>4TEVKkMLJ(Y@5A?`ob*@y zORd|D{~BCT>{>q2m7`13=!Z-BfVBni2m-=D=G%^E*_x##p7C=;irHcDq~`AyM!3}Q zFMVxE?37dEdTgJrHtqBbbxVWkMC_^5qsF$25-fzWi=Yh$lHoWjC%Tfz+{O9Sa9sFe zu?zU*&9^wmUb|_`NRj6%$<+iR-TrDtXWva0WSbIF?o@?)E+siC#{OPQ_{}jP2OK9* zPE~o%8Z9{%UJVz2`hgD4&ln(SQgoVbRi8K_;E?su3h0$0aQ4YK0w+A1Cg%PF6?uLZ zUF^L|7#Y!0-^R5br`rj((}l%ayy!dfhD<Z7r;w|^Qd|((lW=6OKKC3ISu*-JA+ie4 z89&7Z%jGNiO{0)S+&KL@?K9kO*pz=O61-SW-hS+iCo-RcF{X`aHywIXJ?}M>&>`Zw zlUIIzd#7PF3jYem*ihO<^QF>o91}2;Vbce&m$eBcK~kKkq20bJsGwx{V}8J?5t^k! zWP0}t7pC=KRwtgwDXH)B${sQc11kS>^wE46VIL*D$Bi7v`!b8B=Ks<BxmNA=+;N~+ zj<-%f#RqQ0HI`k^cucC$8bTz!v68t~!K|{HAz*ox_1}#z8u3?X@u^0$+sJ2oq^)kK z4F*f+nVrB3?`fqI6rcZ6=zwl$lu7xrd4=2`6_6-$$kXHGwZ4DYnoDc{8!2-ze1B%W z#^0J%@QzN6c5F-fv)!Ah6GE2}$phtO31|KI=~_v)h;OKEP%M<SjF0}^_<KmLGk6Ot zKbE#(?xDvRQ&yDn=YHbDYY2%NTUUu4;d@|_JY5`G-W?XYWmcd;#Q#{(a`I1IV5nv% zjAmcJcg1ah#|`%AQZiFoar&N+`x1veRO@~e^~UNwIcs+%Vp-#NfDP-52<^9#qT(Q( zIS`MJ2E-i)nQ)?HeGk<<EK56_ocro}y6&Rcq@+<00H^E@YuX!;qlcZ@5@G5yk%u5a zb3}WJsyZUp=}_B|V~X1LIB2msx)c6r{{H)<F^Oy+lSG8R3ze*>Q?m%sHt`@Vl$w_r znwj&%$YNQ?bg6%*{OY%?u%!QFru~P@`>DVZ!u-JpdAZqtJf2@vSxRcLj`GT&zm9yK zQ9#<0{=f;*Z9pW<Jp(X|)kW4e2dHw@3WrljbCL1CWOFvK<W+2!(n?^_PDP^2(%1Ob zieu(kk1bKH^xYPQHr{5}m1j=kKRzZ2xtk~y8GOP~A;0+Qv|?^O2!H%XGy)SihoHt+ zjji0wEHzc>ToTc)Na`TXEJ}0J$$yFY(H~z)Sv!&Q(a$bBn{$@UGQy+BZ(h<mgKq-u z5Vh4`Vc$6XSc=#{X)>0vQ%9W%sSpZ>Vj(~$q&U2=GvbHXH1+F(#iXkjOIz+2bUay< zmhWezqe4fkqRQc@t7%3hbEI=Ynh+)+R>p&H3+EuULd0%2cG%N+<i~yZD;QffALo@T ztMm5Mt0dB}x&o|uyF44CYrhmb^EBxfskW@jx3)j>&^sc|AKn(Uk|oaCmm&!NRWwSn z_v}00#?u;6^S<(C)}?7%vPDT(b<vr^S*}?4O|8U!O&f5lpX^%pkSr#t!=MOu^W95c z|2NC!Rz808AM^am!kbD32xD6Zw_5EG%xSZto}=WP1rH7{N!v6mD8eLhSw{{SUu}BF zR~LJ-<c~~i+&Yeu@9j!`15_^Z?Y@-5<q8uJN4=>3UTIl)z{P9uzvGnEZ{OWZKa3;N zCTTNn+MgmUx?a)<a-lnpTT$P$4ux&vSV!bdhn5Aa$2E&J(%erx9Lv>=C!xVEaZW_} z)xGfs`=+mNgK)+ZnO7kY0Kx4S7TV++Lqi;1ZmzG0%jCKjv=Wn2+~K9#EN@bNo4bxq z>0_o4U_vkddnNgt6EXs1v9pw#6}mOGe%_wJ^EPJwO<!>ZQPD4tmYKXC1p37elTIW` zKoAJC;akb`s$6-2f~x4t7kuv2{0#Hkzd*(v+BAKsSrn!treHoOmzT5aXyv*m-zgX~ zoTUXyb4(;mu(-o0O8Ai%Zb8WqyHK&in9|B5#fW_F*1mP`Zb=RNuuvy{=8xW;Ft@Zy zU*9rgHkIg0>dNZA=l2x8iKUpn65|wRFj<>Xrn%_KO_a=gB>&Sp9yay=!ug*nE(YQ- zJ>5RbMhMxO6Wk1Z4uzaK`-fcmm2N_YBl~@jo1~g3puI%Z$vD^aw=(m2P?kXF+H|R6 z`q$9W7t}=-X;n@e(6NT_9&@Y-bw@@G_2?S`_CRjbTU+TtWYVjMd-U0(MLM&n2XwYN z(Z^;1ZculRYES-J&bpmiDbXbKqbr}5<(m!)(3D$8fPf&Rf)K(b0M>JwZ4w~02i2J{ zsNX<Wwp?veYPFvPq13yD6nh4u9Od;~BoKx^sLJ_jqtuJt_8z6Osf(1+6wOjICs-$l zVe4)tvlfL|cQc98D=v*_FHYWyr0qYRKVQ|fBHOscA_!`bT7?=><5HSxYN1orO&$12 zCTRVFK-ooEZq%IasfUy%>vK(dSAklFwn~Y9O}^sLxnf<ayZ6u4<>|4fVF=txN483< z46BibBqqtGT8PDla={|=+69UnMc*l+U8rspB#B;)z~lh*YbdH}P-{}@*O5^WI(KH5 zZV~kFAMQ`b-Buyjw-o!Hsjq8zn=RJUcusH%wP)!uJjHuJEt#eYDKk7pA7<<cV=NBb z(W5OmW4@Me0go26*|QHpREO-vakrpSpo266)({e=w2Tt1fX`QMI-IWLHH7Z`uvMkm zRFPriSjz%0^2M^3k8+E3o}<brZm7eh?)|}mT49V0Uk(YdQS&erNg_19^TbczA{~Pg zjRb40gZ+Xz9_X{zLO^);&K=t}tiA8$<2#op^GUB>E{<K9;Q`u6!Uw>EFWQ?;1~Xe* z^AD?MJh@a?VzHBj@NAI|#ufSsVU`Mw0psXTJ(W2nIIs+uaEu3=#@F@I?P9jU;4rTw zdU1GX=tAP@+hCO~SDT<>GXUzrjOZ`RqLF@%s?XnJu9vz&|B!t)K8r4X+RO|BKK;-M zmhw#8%BkpVxyd}{re4#Oa&Mq4H0R02=-j~CTBKu8Uq^3;n20_CIb40q_pd9SJ-mM| z9_;U}j3K)J$#Ffus?(~nE(iv)13H}+QmN`axKEZ2*E!CkMLI$1L3|`-EtrEhKKo#$ z<lW`M?;hUQGZZU&Z26H5bLf1qBGq*E+{#8VfAVm0s<Hj+vc=)W=WpLSIocifI<%A? z;?Op?19&}N&pS@L6vdM0QBqvIT<s0c<mB?Q`HVtNxiB6r_HbJ)E_lzOlyXE-r%qJL zh1;Qsk*RHJIdFyN-=y}(FoFnr05%DzG9R45ZGGCxma9$5j&z`)@-7HBSc{tgh(h`q zST|qHP$sOm@IP!xLODH=Z_SY8Ax|SgG|BxS3fP)vlSSW#^JtL{?r=bmBx5rHINcEW ziLU#ru#aBnX=P69s~0j%%Bu>2%3N9$G$ARff{vU#_Yu*Wc*Y=8>S<y|K%`!nMym2J z>CvjKO-k)yFP?*-j4HCr1!+;_T!08?^q-jvCXUZY%k;Zc^0!|m;#90vlH>E3I;xB= z)AF1kSmG{|P*B*zH7b;FEq#xH3d+4AeBzqvzm@c8Rd#x`g^9`-UXCBDBA;^0NAn^l z1%Zj(eP}fUt7m@m^6~xai{sUF+-+ymO_g$XC0I7x>dHx+Fuf+4&NW<+phy}}`{JJD zhP@Yb-^8}pa*X5+uWV%oO|K5Y1iTmH-C`Khy(KWOXILOP`Y_VwD>jY00oOw}`KI4% z*26(cLf<mbJT>xlk;c;<+OZ8xsm3Z_4zp1+5fa_JuT>v_0&s0L*Zv~!RTXLGFn@i} zi-sBY?Csz{4R_;Ck=TY^t)A*i*#an=?YCUws-*OSA{zw&Z|OB7DqF5Lfok^9=fNQC z>j$8&YK|G^?<S0pbot{~{BH7}X?>Wlbh{owgAh5hi4&ZflT3VawajH2_ky+o5i?cm z-0)WkVg)1+&32Vw?2vdt>5X*FH%bo|hFsi6(*ST9Cs$a03XFTUcquS%fBdyuxEFo% zKtAx5GS1fAP}U2y!Jm@~Hs6wEIn$jw$GBRg9iVvHEaeLtG)S7fH!H^;WTVKpfPa_1 zynFlN?C9`dIp_(`a^Zi&;BJJ|;m(&HL8iPaGJGxjkTTS`E!pN+;j&$_mu1%3vz`;? z*^-~!Rn?_?PCY*Es*i7;KfSs<*_}=5wS4w6cI`7J?AGatoYpsYvPzts!NQln5oz{H z>=dPPrpepvZrF9r4f1G_j!EsmQ#qJ`eJ%1;Ji+{pX1!c`xak^BBS$+f3*51V+9}b) z2dAiECr~-dlPL;QG`<FZ&%ti;9bDNWodGEtchUk-(0_+Ca1)bH?2{~&1}8x}N2h>f zD<JTe!k*w2%%%iVTAesWbn(Fv7PpI<Cbd)v<S`aQA3205OH?JN7+HG0{~q?3t&A?4 z(E8b3fuSCNZ(+f7l}>Fxcerf%oNgdB<+LXtYAT6Q3O*$Spe0kgj*ncp0-W?_f@EXY zh=3MSsL*tX`Lr?D0@tZ1qKAkrg3J+3&Lc0G$E1aY<8?r|d1KIPH7ey)pC_TOpH?+j zoaU*QSP?YE1t&Q~U8+8L1@}>%Z^Frv&*|<w%oOGz3eu&9!Cc%HksA}mBHVASn=~UB z3R4@;3&?p}Lqw0t8B!gGn+2-lF)oi;YhYRk8Hx@7@8fQSEZ+G95OAGUCytq1J;96_ z5v2cX+L(fLMt}$EW@6DFCr0osJ0dkfusgGHUx53zl5A-~p~Ej=b;v%lsA;H0CEX># zuFH6KBrZ`J!ttZoOjS@E`i2HGcCxcAxgTXYp>w2MAOx9-IaQzojEnM(Q!)>ve(9Ei zbqo3jvB#_xq`3qZNDx?B<~5$x1efc`;bOk27{SPQ_0y`vX`X%|YxQApXpa<{VkuGg z&VV+)WmjzJWrjC;O->Px&f;>g|E0(-H7e_e4rIq7Bgi&ZCkIY$v@ht`rEG%4G%EW@ zp+1xp1eFlFchpEJ9;<`lE8|?IKajQVA*sV9k(Q2uXfA<kAlCU8q#2uDwx54|abP!G z-J~rZO;U{v6d(!~7ELOPNUq73Vku}#C6x@73z$VOlV|jDBfH0>>KLU<RreO$>l9ZE z=O`HCQymOcs<p#2pr}x*w1d=#x`Z>)+IOtO2D{l^I&uj=dF`TbmPm32!bI6v!lYUu zq_z!A)lFRhy)xHzqGFzX=jris-fdTCAy=222A-Zh?N|89z{Hb3-DWu_g@C~7#rCDl zPp0wicCSmmD&-x!YpbHSm3G*{j7z-q-i~+Hk{)E><x|@#*Qb$o&@3~f)7MQI7a40P zlAM`EcCuuOB2rOhsvakSE$Ki?QyJAHOcwz>^Yn57S8;jD{nOVzBU`dLd#XAywlyO{ zW$G0^dGs+P%rIS?;q=K;p{o)WN2aza@l-L}QiwI9bdvNI+rTOGMF=QZ3QIK27~MJ= zw472Mw3{{d0Z$IF@y?qfW7xHiyLn(g`x{7lm^Nxh2_=a;DvC*_i)kS77-rfxY(Y8R zjs=|zGf*9eZs5{kb*X-fu5>z?rzGBOaGvK=8qc?-^`be?bmfx?J`Y#lwX2+D$4udY zo-1?fp7B600>2;Bp$~^i1iQdd9Gddzr<>FHrNBxVzJ66!#vUp21t46!Z%<q=&d1u- z!7cJQ)_V(9QVNtyFdq?$prxHZTPbJHWfpjru^q?>H+ZAuM3X>>^af>!v(IMmz`mn% zk%hjgt!g;T!%1q<#qAqDt<0>+U9qvH2P@qz>7`tq>oYDm&*8b3N|MRqB8%iRn5Bu5 zdfoA;S<7e2oD<vH)bWUqRyo{iMK7Wkp2C)0Ym_92)>Ibjthv_E3Nqv!X0!abq-ww| zyr5YuB(&2<!GUYlA!f+=e8w-OnE-f%NB53r6TwMw$}nN;t6DWLF?<U-nu3t@Hcdcy z_Q(~)RAtdCnnBJrCdF2=5Zs1^dnARA028f_8T8^>IcMmCEVKWb3%7>-f<+ej$NjRv zV?KU~|Ik2@fpjV|BnNVQSG@!S#L!2eETZgtpu}dbThXi6q$t|$IRNvxacw&2I_=qq z*d3$HZZX)xI+OCA^6l;fh;+fFr*+X`gk{=#>oDJioB@aRb!la~{71lq-tF4E=N>l_ zM~<x>r=8%T9BY~>Bwbts<Y+zs$O_cWJy6?le?*{n+{gs}-;)ZTSG(;>{cE$W6cahE zx@U2Uqr0#h16;LVN;frMM1py;2g2HLORQlmk88`FZD&&%*Eq5Az#gF0L7;{`T!>CT zE9q>x<)pbtu0}8nYu&<N@cZ|i35M_TuM;bb&#=>K_STR@4---nIha6oRI@OZKA1D> zrs2bnez^Z4+#lS?1U~ZQMW3fSr<w^49gNi(F8)%t1K~Js#|s}@_X3rLJHuQrG2tRo zE^=C|u_(*pF#sW?k9O?b2SKxYI8c`Lg#p&<Bg4A-%1&_jb5SlGWTQN{hg)?JsV%=p z71gm5iNgdn^n1=S|8f3q{`TqPJJ*N%23I_kBhSz#R$cugY0f%mZXVsgNbZg@6Mh;u z`3@BIl+Fe%jZBl@qYQFj!{OG=>9E}>rQ4cdQQ(O`<lS1_9%eh@lTgS8clHJV*-t`H zK$XL;5kYbdMgS+C^`&d0U;<l057RpTXzV3i!1{@{nVqOTQwYrM3}&{Z!=su#lv=^a z(ltlH1WigM&R=ge%9*Z7SQJ>sB4L5OGP=MuNvPgAVl1)LfB*s5s!{?|Vs0?aYQh;K z<tKR{78lY5oa|xwkI*Knv0~K^?|0kPe5xn=pCUe<$O)chpp2B&0e{EHk#c3N52E^T z3A1V^uuPCS7d;fkNUK@BSB7h1q7COfB_2mgCYC|jU>tYUNQnMN>V~UndG+$q?W>EU z!^N!IOegEAOfbrK($I#4gHA|ISP2mw7c+vj+ryH0C^=`DU9$~5YynnBR|YZT-x@{$ z-j28R_WIpgHJeJ<FP1cx<@9wU;hY(<Y9^|;NS)5pX+q?m3131)fap!yO0>vvKSx}; zP|Q~u3LW#f2eZsJJ~sU3_+h~yhwk1IJ>J*5nuq#uqbQ!KIyRk@y13XaZ}ccsI^7?X z7sk_mXFF#MaO{W{D&kLZ8?3kWXJ0I7h)zyo?#Yx)e7#znL2l?m^YWQBigVkeF`{~; z#6-TU`CZcGa95W`g%TB-yxLNlk_)WhxaWw@#?>~w)R+zdu9^CLd38`2o_`cyQ)GLe zyXL__s-ESvJh&w0$QN>WGQ(SLsVidS#9(b^<P$EOkePD7qo_4)Ko<1n+U*3=ROh8? z1#$RH$US-LhhytX4`bgoS;9yZ&_lE!Wea8#V(rQ$ggPUv;4AP7gczmo4Qw*rK;7QG zF-Z<}y*m`^Z70Q%!^OhTv8PBqOUvDk(AU5c-J^0f`S_<5HOh0u++$sm_$wBF)U9_+ zL1C_TpFd^!V~3V;NFPFEceiV6h*G)z)f9Adgr+>+nb^2vXv>TaPnOdU^`&)NRB4Tp zG$%Y+a-XG6z{e^BDqGhqQvF$27%$=Cg+?u(?OWG2v{~RfuhXD4ZKM*LqXkusn?$li zYYX^ellK2BrTd>x+enUX%;*dSMoJ6iR$Q%u0aA3?aZ_^wW13kn!)|R39Z2?Nu9JNC zu(5<wJXP!nHc({Bg<I7iqX|?h5@-sDjQCS0{|^&eb^p7x1U0+#eMnF_x-Ti2c30tW z?OlM=3WVQDJ4BzwNQgK{x7KJ_>p~uf|JCPngK5VTbEiG*SIS+_bEO!b;WIfpS(VN5 zaT2B10l~OxU4+RQ7(qi7Dr63fjY;Ibt$de@a-N`BG;`{_wrDfUTP%luqZH*0;#p&< zrnatO4QncWL{5>3%We$4zp3gfj^2-*Cj^igc6UZCni<Z08+f*LI)HubtLNYx#ph!e z<d|1AIqwChk3#>nUzb?P%G2?I)M#s6y281Mm-Q^w@w2pRANa0z47~pgGc}vIpfZAM z8dO}=tLWjj!&#p<@ucf=cY{(tsiCk57$!`3xCL~xmZK!u6p=MFa4&&4ajaBmYK#v1 zRf##~_RQEB`@F*u>CldK$)IOC&Iu$-xOhiW&H$Sk(deJgXq3;I$SHP8LS4fv@$Bz- zsyu{Ffx^}A%4&79dhAul<0*CVZXPT1jRa(B&@oyB#Ec9E=DTqP1L`&`6!ERkB6H|& z{(_+NoW?^J$n&qchf9}NO6c7j4+^<+pCzZ`x{mw2AMaOT6o42G@9;`$L!|1N=Y!!V zLt+1f;ZFLAdOlkflp}z4`rs6KJgP%YcYmrv4Q#g?hK(zwp|aj63;V0Zuve>O(~gN} zOlws;1r-+$79{EhgfLNWES0_SKHrgTWg3BVWDh}{1TCU?{?W__FdwJvybV0lXyj8C z@eRYIJhKXAo<<gx{EUz(Ni;RNT$ixNwBQAvAWQ5X<mQcjuU;+W^Yp@k#aI>;3VQbH zcK~tP0TXbBdrC`Z1jcGoTxu-0Jw2EK+n6Vh7xQ(=h^cMrm}TdSJvaorGjL>h7`qR% z9#M}mV<(Rr`WuP~Zkcb`=e_&FuPCns2!La_QlEXP`r8xnzIpETF97h9xshf&v+KuY zP5<VrVtDt4KtR4Z3%B%ZZfN3N*=zg}{->=c@I3slo%~De|E?o{T^svso&QeY?-Io5 zHS|GS!xz}zvAMYHsQE!*d`%o1hVcJu{Vh>UOyJ)ygZ>CR{S+GhVfTI#JL40&*k>#J zI9B_I-TH{F<D)pAggj#%-^2Kukzayx2wUl*!TZktZLyUntrbgX_)RqUBgDVYdOj5K zRT@7uFlF>Yw)jCW2wwIsCK>WwEVsp->iC6rPOL^IKO*i|2A#Q$CqQBSsJf5Y4(K5W zcLHjzNy`R5Ux9OnlSkzFMcI<^v|+6S+qPt88<FNmJpgLhJ<viU%YrohXj^33JnT@F z(Y;^WA>`da>jK2R2;Dg56*DB<*@>e+nD%A>(4m2;x!-X}D+3@5t5E>3=y{iQrX-?d zLWJF@2B9L=5Vpo@m`-ao0ykC7BDAeL`+;g<w%g%q5k>BF#}v451=b0dqU9)mXsba~ z@2`dk`u=K|s~4*g`u<$aq8QPg-Bt_xa7nKg$-Zvsj<o`wQJ&7m->G=?5cP##Lz-sT zqNQ?E%Sm0;^b1_VFM7m#=(Ll1;{0;=1b(S}@`L;w$Ef%UJ-WWEM=9&@HYCu4eeQc0 z)ELFOEl=4S*mvGX8GiqwVbL#Gx5O9NHg<n0)oRA6_S<x^lemo>q85?CN1-<e^CrV= zD}<t0N2Lelq7#%sYGk0dvtq&ii40I`b`s;V%YIwgQJRmr!CK%UO6$I$b7E~B&Y@^j zSou6Di(qK-VGLLM`VZYk;I`0!aYK4_>oJUxqFpM6ot0IAjH{|mJ2E^vEh1JI2*kXZ zbgJz`A{`@G?>`Gv^n-1(NxoVR(ptq5XSh{|&YN#s`GUl!)oE6#4g<qM!&i8o-aG8G zFiac15+2f>P=RJKci#&!0(xYOT_sU#vNq(nYhlF7a@aYu1Gsagk0>ZoY;<d}m~WWc zH)$DTarT#_RBEVmsjTZK>(M%7t5(xBGOE|G2qWqk21;E#s2!J_nvFB6w3^>}u<_}l zqGq)x_guuN#-^l89lgkq&XBOQhyn|kGId0>4)q!%RO@692UTRN+5mC3=$;iKAU$`I zi4APbv`!VzW3*bF!oB7V(1v$rhD2*snQ)3=T(t_J>G5vrz(URJkwx0mrVdDC5sUhU zc|ktoXR78?!DK?#r#ib*tD*DHrb{(SVv;OHsx)TlGFW6jUH-hW%aScet~~h)6e?1z zgol@pUqDbuxeAr4R11rUiiu08QL9e9294&J8;FY2MCc4AW)>`2!yyVdz(Edi7#so; z3L1&+q7)f&+eZaTRH)IQg+YfN14fcCkxUAyq}3z!X2klQmF3TO?}}{PFQ159MZSA> zA>z8g;b3ENeOHtu`s15-?%!j=ev=80n=I0n0BM7pY&R=KLDMMdqzjNG9?m?<hb4wd zZ=28GpC3FBxp~4nE|_>MBny$uB;R9({64oxkr~Oxx>R6%%Lr#gCmB%NU*5ICiimY~ zx3Z-MY>3CSvG3Asegw08SA?8(ygr|&+`BR#Q2rQj^Ge+n5WK(sGKgTnY2XULc0HJ> zgn+bZ{)hEk5f|c)Yo)Vg?4h`>tK94GbpQf*3h3H^18@uu1D-2JaBZaSvSV%C2RZ~( nn<uyv0EpPE_IMo)eRFa|BNyXBg0#oL+37!!O;?~$i`C%)t+@02 literal 20192 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.ttf deleted file mode 100644 index 146996ce578dc1ab635bcb0ce092a2a6b9efccea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41000 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.woff deleted file mode 100644 index ce6197a40ff5e8ce2f04b1a9055b10e1647c9c41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22832 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 AcK`qY diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Regular.woff2 deleted file mode 100644 index d9695eadafd9e1a4582cd3d1a2e96e83ba7b3888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20048 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.ttf index 170026dd4ac99b027162ba9a829c20d33f744fb6..ff108512453a58cdbfa2549249ee5f2562640f08 100644 GIT binary patch delta 70 zcmbQy&NQQ)X+i;uNN35@i6y>FKKvUGD`v`kQI64x=ePOFz|H)E0SInvn#l&EH)Wj? SVl>%&x@Hj*kjksqVgUei=onf6 delta 70 zcmbQy&NQQ)X+i;ukX#Mp#1da7Z@!I(6*Fai{PzD6&u{aUft&dS0}x!Vm6-ygH)Wj? SVl>`-x@Hj*kjksqVgUeUpcq;J diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff index 13af1221eafb6aaedc40d57c9efd2170765f82b6..f0d6ea739b8405ce37eab96c71feb4b0091503f4 100644 GIT binary patch delta 643 zcmV-}0(||{kO9<?0g$u=6p3`@k+@+3Ob@dg0rfc?^dnp>Uk^O>01E@?00000*s_@h z00000*s_@hvn)H!34e-qQU`+QJooMX!8}S*mO^+?VoXp&LLd??F}|6#EOfQBO?RdG z_xCXMq7aSVo14vKrl)7lnVtQ$)xRjp*UGL^&qqm%dr@@K?nT{*FO9RSoa4lrJTW1U z^F#%Q<ZgdUKITcPa~>voVb-q`JvVpvvCds=D!V){vc;&#{eP&aR)%{j;sGB}+FQ<N z*sZCYEpm=jr21bB8h$z{ADz~9t=8J7kNQQy`>ge&>E9Zk0O<y4n!}*BKII$ZOtmo! z-d>5X^x7O=Mg_q<wXPw=#nRWhG7KQIiOC&WpYw&O*r$f$@sww!$s6*tA%y(r+FjLE z5PR=sz0o$)4}Y0qnMU(yc+J`mg4FwR(CN6OvZZ&**=##@XEvIC{f927ppssxB1<bu z$rIBNCDcOhQG|0sZK=8lrb{y9gq!0l2Gat`kqw1F#!@Q^zE$p0f2Vv5YyyrJ)gf4# z7EoNHe}a0B`i|}?7KTGMqPwJXxMbjtkaO~qEBG04QGYV?fcP7g_D<)gyj#Jr3Grq4 zD2e`GZZ!P)PDSUGYB>tK(d423i2Q=@=H6%2`j5NccYJzd>5rT}=a2$0t<1%A1BR15 zZODMnyH{emB8_hI?aL?%aOTjn<n|O|R7+GfdMZ(B7#T7)CpwMmGwOvXvP@>AdrVX0 z8I{8Qs6#y6QwV_^zIK<CgiQ9SFO#MX!UEUyK$&3gyV2q}q-&`?4JZKaaZ1!397l=l dpd^o4A)vL}c86x@pZ-hFZ$SoKyR$e)90ALnMA`rV delta 643 zcmV-}0(||{kO9<?0g$u=5*~a3k+@+3OAfOe0rfc?`1?=vUk^O>01E@?00000*L@t6 z00000*L@t6vn)H!34i)}(pQ4$dG6c&2J<LMSz7c#i7`P934uto#Q0{`ve4DiHr<u# zx4*;GON40j{_@LanaSb&nVtT#^}i~s_u8&9Pe*Bo`cZV&?MHD$*T&gZK}l*&k(!Xk zMXG{Ba(uESpVB1L1r1ZZFzfe;o|}iqL>DeGwOwA8`C?QSet%TfD?@!1(SQyp-7V)U z?B3MQmIXyBQpev68h$w`9i2B#qt@DI&-zVq_C@Dc(|-tG7}71$io>9>KBGJ1OuaD+ z+CGVH^x7OgMg_q<v#up1<<d90HpD<~Q&TvWz7`8plg|t#<0;K5Q?%r1O9<(|XU8g5 zTeF>(^hVoUKY!(hWExGQ;Vo%D2r}=hL9gf1+E(5vXY=jYz1e8`{Xe)ui3;ziVX;C6 z55f^rbh!2r@i{|Rx|lEF8U{|d1qcZ<Eh7b2gOHK2^a{a`&M{7Q&Zmq`n4`sY$SjQo z4A!ila6jk%0gp(8;kX*{UE-2ca^{Y>7VuJQ&NGstWPj!X=m(eX&gZwhd%+y6<Pzs7 zxyS!=qv7v&Dn93E<S4A6;o1M0>l@U^yD!lBi@V=XeEDGMJ<jLk5CJo-%tg3khLb&Q zV3<$4uSB?kX0`e8%P0hV=Im$T_8b!KmfSV0sl};f<Xlr2@o7_ExnGDQ$z(><V@$cu zPzm?5^FwscA!Ow6YsXM>WwI}G2^t%|mT`?I{$=dbZnPv0aVx#Y00HBkPsM$Yk3%Xu dsNlI*lAiCj-NTIa(?8Mt3ppKKxwAM&904QSM;ZVC diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff2 index fdaa21bcbd1e6a1c8ea01248007bbb68f6e98aaf..4cf8f146967e1243ebfd1eab7ff9c596be939f2a 100644 GIT binary patch delta 15650 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 I^ydHo04$qTEdT%j delta 15638 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.ttf index 262b56fa24f66ba4915b213ffd42893edf2903a9..3dd767131a57981bb2e065f4a34010ff3f3ad45f 100644 GIT binary patch delta 81 zcmezHk@3Sv#t8*1B2gtzCzklI$bS<o+;}7+P9`JaoIyOl%~u9)<`)b=aAVU<HW<Cx fBL0jJqseC0qIFD+CX+W5D^4yi=G*+ZgqH;XD(xOw delta 81 zcmezHk@3Sv#t8*1g70e>CzklI$bAzm*mxu&PA1=M|F3v{o39Mq%r6*#;Cijh6d1kP fBL0jJqw!|eqIFD+#*;S`D^4yi=G*+ZgqH;XD*_%_ diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff index 22d4e28e1874ce619c8204b0623263709d0fd81a..9da0dfe39632bb169458e6ed72c84803a6c058c1 100644 GIT binary patch delta 626 zcmV-&0*(Eoi2<aE0g$u=6k2rUk+@(4ANCP(vm5~|HXLYR&M;pOJoNwz1Lyz%007vs znFas=007vsnFh0DH}VO8`k+OGq7+JtMN`B#S<`8=+NL2{8~yj+IPvp_qEs)JWwVEq zGw00gUhayw(ycR3CuxWJQFPYrM{z_~T)A~lN$NOHIiyLRn&40z58lP6G|g;Iqtq^W z`!=-;zJEw;UL{<*)x_J4OUJw1k9Xyosc#}0(t)VksJ>?JxUAfNE~m&uX7EkB;g|i= z$$4GZW@~-+WM7TsUvz#n!$;w>P_|*3;xMS4&*+vbF892o_p#{OZuxK^69kLQRgECo zt$b}uCLv@V&MPT>$(LM`&zO?QjOGRBjd<1wLi&H~*u+N6{?wA)Teq=~8z$|>(s*=3 z)(?Zs`(oJZRcYye3SXJZZQk4N&BwFv|KJik6nH}khcz;I5KfSyBWE9xtTS{K#j*)k zU{tEjK}e7aX2Gd^Lt!S04T7W2F$SN`r@~D|W7TzpRL~NPt<+BiF9hG?0f{OqIaz&I zlIMln2u?AU#2jAFQZiYSjP^YQ9dYWmy?&*=Q@(=Je3CqWqkHhn+YNtyzv^?2T9?5V z7GC_H<a~wsnEwKufA<atiO-Enc3aa<4iSjbX<vj}or_Uo4;DRrz82vcR;u~v3mF8m z7UJiGZ#yJ{R)T6+l<L$dn)hM#X;NPVFV&H>GuG+}W^&F^sJ87qYdh!*9KLo8qgy-s zGM8Ynm+gcww|JDVaIL$snmEFZVvivL;k~Rva8Fi+RPUgG7i=_r^Lg7n%%y(zH#PqO MGvH!wvw}k+0Yg4G1^@s6 delta 626 zcmV-&0*(Eoi2<aE0g$u=5$}8fk+@(49`+G%vm5~|HXLs@zxrPfJoNwz1Lyz%007s0 z9Fzb6007s09F((UH}VO8eb6F8Q3|ESqAB8=tm(8_ZPSpfjsE*@ocMV|QL2~Avf0DQ znR8}#FSo^8=~kJiqqIZ)C_3x*qd1}~uG}i8Bz2sp9MU*XO|UPHPu|6+G|6mE!_+Q# z^ER<_zJEw;UL{<*<=ES`OGn$>kGAECsc#}0(4MH<sJ>?JxUAfNHmAr$=J=a-!!P@# zqw~71&Bprd$-WxNzv%pEhL6H$p=`r6#bHo8pV2K>T<&;5?_<%m-SGZECJ5%4s~SPF zUHaOVOhU*!oL5r%k}tR<pD`ulDa{Jb8}YOeg!KQ|v5AeC{i!9pvu<r4*G$@trP1() ztRDoK_r;*stJ2bc6}~c+Tfev6n~kR5|G_1;DDZ|74l88vARHk@N6tPXS!d`fie(e7 zz^GK4gODH<%z{(-hQf>$8w3ZPW1M_Cp9(h-jaAnnQb7waHc~$kJQsYA2PCSf<Ye_- zN}d;PEjYzU5_5PxOUYzSGTQe5bik?G_WG6fPWcK>^GWi5jPB!K-fsBw`&FNF)Vd5d zu<+vlB<Cy4$NU%Q{JVG9OMGrrvfG+=a)>~bPWvL<>RgNxJFw{K^R)=quu{zjU&tVk zH5Wf8eA^)rv=mgsqEx3w(Yz0<Pm}s0c%hD@ov~JrF_m+MLbYw@Y1=_xVE?sa7~R_0 zm$?LsoopvCyv3t@g=^i7)x;rg6nhL12=8STf_t(mq<RMhykMj0>(ATnVJ7v{zp42T ME9+uxvw}k+0mJV?N&o-= diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff2 index 6bce9562e3d34abc0bfd47643fee9b5e941d1279..ce19ae03d50fade531801d77634f35ed06f90681 100644 GIT binary patch literal 15024 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 G0000sx++@$ literal 14940 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 a=c!GSBVmm2JbXG#eBCKj8X+`Q0001)*UiBI diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.ttf index 6b907f7144eb8829b7d07aaca9c1d9c47c045577..f117cd619e99bf1d030446c40c725a1e79c57b71 100644 GIT binary patch delta 77 zcmezJg7M1>#t8*1A_gVTCzklI6sUVG-FW0mq|E&I3!(A+HeVUInO`sf!HrEb*<tkN bEm7x%7)>^}<ZfYNG?}cQuedp?K#Bzb*+d;y delta 77 zcmezJg7M1>#t8*1f=6o@CzklI<g0rv*?8niq|7qYL(1{|HeVUInO`sf!S!01DKL8T bmZ<YWjK-T=a<?!s8c){GSKJ&`AjJXzsgN93 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff index 3db533ff0d5f1c484ee5c8beecba92c2d6a9b047..6ed98780a7a46c0c459d2f455fff7ee01954d3f4 100644 GIT binary patch delta 645 zcmV;00($-Ae&l|Tv;-6|bmx({U<7a{N~N<L0sJr=pI^{bUk^O>01E@?00000*s_@i z00000*s_@ivotc#34bK71kv-{xBCy~QIfJ0!h;fHLNp{qBGD4#n_0_1S4(NS3&_8} z<G@wrYSb@ZHk&y)d*;mS%s&wS^JTTI-8>I;lr^Z6Bqz;I(oX1ty_=VmW{%5@V;Yv3 zi4Mi>?u+=CE^}K_KeJO_Y%lGE@9tAu`jl%oyW#n&u=QYBhJV4bo-=h!LOnWAHTSYF z=v%J6Tb7iV#B{&tIR3O{Iy&8KHfCW%{%D_#ba2-A(Kq&qPeR!pvrCSnjSD&5u;+Ts zQ+oLrUD*X6e#u19BzJx%NSCv)u{Dzrh0D0~lDaCVTvN!I(&3246_-2lXeWs2zi+oq z+lbj)F4?tpg@1i0n6w*9gZ?$y(2MdAs$Q$*v)Wa`8}Evjwp-)D=<64pV~Gk|)Nq(1 zM*!gn85$BhNaUQLsi-ZNZ~=x_Z3#k(OfU=1z=(wzDmI9|b#9~k>U=ERrD&|W_K^vi zg0a9>c#DbPJKQ5xg_p?cJHw5jIaVlOg&9cA5<z1vJb!B~qn-Ca-*`0-+<vFN)fbtK z_CQk8=<WV;#_`XmtUjmM=rLHpB8dN^#AlfO49?K_d)qju__SBq_nHrtV??5K+861> zyv}J27CpUgjBo`j+5GL63?exb@pJGW98y6uK^xr%gZ7F-Vg^>9UDcJ~sXCH&#+p6E zNa7fkYDM2Wk3KlWp#N>V4Wm~(`?M~>VlCGRZ}EUaxwqL^t=Px4;(#6^;e(t?a7&Iy frZcDz1RJehyiU7?vE+~bB<Ektpk=VLL_Qz^PJ%`& delta 645 zcmV;00($-Ae&l|Tv;+~wd;yWTU<7X`N~E(K0sJr=rZvJNUk^O>01E@?00000*L@t6 z00000*L@t6votc#34f%{1kv-{x9=a!qa?5t^g)R+AsP}Qk!XqW&8%ghtEDvEh04GG z#(}F!H0sUGW;3U!XU@#d{0H$rUzVH7&9guUX@k0PeA4R1otQ4zyLmxL>bOX`Ny8#F z(Z0BI^ddf{%gh$kPwkW!n@c<4yZgizKH<vEZg{@RZ8caHVSli!=1g4^Q;+skt)1)( z`j#v2mIcKoHiuty-2Aj<IykNC+AM6y9__P{4$c}sdd4pCNhrHzw#m(?b|Ir1_FS!b zN-qziE4$$RCz&XkWX^8|$#NEITQLcdyOawrsjFhj6@`o`8IEXNa<LVUwt^=8d3MKi zjF`RUl3iPu+kc0gNxQK$=wFi!y(kNz?6uoIty~$r@h*R9yFDI^zW#%AEKy>E3J!B* z2p}9FMMGj2v78gM6m{ehF2L}rEkH<+3TDA67)@b@iVdP~ojW*sbv_pEQZ!aw`$z>% z!B}7;yv0QD9qy5+!b@cJo#95%94q9o!VIvK|3PCVJb!B~qn-Ca-*~n5+<vFN)ju*D z?ST-(=so=9jGI57vih8&)?=`MMG*f-iO(>*8JwZ<@3yg5@oA^BA2jbPHxY@_X<wuh z^E#(BSoHL|F~SwBWb?OMGKl0%kja<-;E)KK395A;4B9Dji78lpwpCYxr|L-B8Ef_s zBZ*^_szrV8JbLe-8`$4=2S%@U_Gw*$#agZt-r@nda&NP-TCtC7#Q{A;!Us8};I<r( fRA*2k2sT<hf1P$4W62-=P0s(rrDd+OL_Qz^?u|Sg diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff2 index 214e7a4fc404a0184cddbfec107592c56b8c5a77..27611491a1fcae82b54021dcddf3de913573b065 100644 GIT binary patch literal 13708 zcmV;7HFL^$Pew8T0RR9105yyN4gdfE0CeC005viI0RR9100000000000000000000 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 literal 13712 zcmV;BHE+syPew8T0RR9105y;R4gdfE0CeC005vxN0RR9100000000000000000000 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.ttf index e9b7fa92855aa1180242f5eb58ded8effe3d9a67..e6f34542e296e006bd7f5b313ec59b1e42f12d8c 100644 GIT binary patch delta 70 zcmZ2;fN{+M#t8*1qR}O@CYJayF5Gzdr-#hx`^N9$`E9;3a5KMP0D>EvW^%yj%{M&T S1Q<;=$4AX)0#g5DbeRG7p&IxA delta 70 zcmZ2;fN{+M#t8*1LLaI(O)T+aoWJq#PY;<3TQ&E^^V@u7;AVco00h@-Wv0OB%{M&T S1Q?As$4AX)0#g5DbeRDLt{V6N diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff index 536a0a27433da35b3bf581f5d5767f4385b0d013..4a48e65f0de679fce0ca17c32f8b52bd3de33fca 100644 GIT binary patch delta 77 zcmey8@g-xz78cRyl35dXBrz`BEX`P|A#?h^@w<3_o39Mq%r6*#;Krtz958zG8qFOX bO!o68ry2cYl%Jexyo$vwFlNeRVUt7vw-p@~ delta 77 zcmey8@g-xz78aoo)te^nNMfA7S(>p_L*~L(&3*CwHeVUInO`sf!S!01DKL8T8qFOX bO!wzcPBZ$)_<nM#@hTR(@|a1Jg-sFx;5i<o diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff2 index 2ccdc1d07991cba09fac3bba36c17a184e2d9f25..b0aed195ca3be06a66c66919dfd66564882bdd81 100644 GIT binary patch delta 11918 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 UW;}_Vo%QyIxYusa+5`Xq0M2qB1poj5 delta 11895 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.ttf index 84a732ea5ce2506685ad05c2ebdfdbdcc2cae66b..37faa0f9fe41ddb1c9a15725f8ad4856599193a1 100644 GIT binary patch delta 75 zcmey8@+D<L0gG@($?J(FJ}e$5A8g%tBt=qY*TDy=@%%Pl8Mv8WFaW`gO*1)R^kx^S Za6v|s&2zM8Ffp1;eyO9sIYm!^1pvB?9Bcpp delta 75 zcmey8@+D<L0gJ%j8peqwJ}mAhA8grpBt=r@;Pgw@@%%Pl8Mv8WFaW{zTA3*@db5jE ZxFDnP<~iCkm>7*Gztqv+oT4Yd0sxBS8*Kmp diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff index 0d35870fa18fc4c82763077410f475e7935b4ad6..0832f7a468852ced3080993f4a826e8ef608befe 100644 GIT binary patch delta 642 zcmV-|0)73cG^jL?v;-4qbnB70TM5Ac00!qs$>6oK905=b9J;~aWnT|G^#BV4=l}o! z0NApb2><{90NApb3A2a}hzNhy)R`c9p7Sf_u|ixE@u8Jckgo`$R9Z{vTiLEtvu%ta zyPCGY{+q5|F{N_7m&>x*!^xR*W@lIBM`ah8r!&){ZjxNIyGfeRH9NZ~Xl5)IhGQBP zMn&JnY41yXPUB1$G%$M3%a5_X=f|g+{p9qH7wcSC!&Tvjt7^g2RSAFf=|IumNq(Rn zxN>$?P@)pmJJMzRW1Dn#S=Y5%YM;I8cO}VJt&>{c6}}0jx6HOUj%w>Ox?{)HhUfHk zA-d5^KD>&GqWjFc?a$fj#n-xG5+b*T3nyjkV$K!$jA=HS(6r=YE1qlxG5xx7s>Dsq z_O+xp+UEK>X9}HY8V-MMN&9}3d0+NB9cL<AdZ(Ptzgq50hm+%f@E=wv@qr2!3uN#h zoWY<aXBUaA3$z1DWfQK!a6wyuFoO}yf{lD*VMYNfM89=T(c3$p3pW;x4z2?jL31#c zQa=`aFZdBpl4tQLIK>@UT-V5<C1EI81$;Ow;W=ce&~YDh#G`-RbU9J=0G6+V4Vfev zD(v1L&N4oIn!)E1byx~ZXn65|mGd2Hcjqg#{^8V{iElfVKGZalV??5~p)U#(b74*! zu;^+3LWCP=spg}vqQof@J`=_@DrbUT1l8dk#9^n%<uqY#ZkM(eJP-L4I^s}0!bHv~ z%Ah@To-`a{(Dy!94t>dPbk@uzXl!I#;WeJ+E8M|MbVwZFHeioFBH_KPQgBC>g9-0e c!V6X*J>O5cgQ?U{{-)-CwYgZ?0Fz1?-WfVKJ^%m! delta 642 zcmV-|0)73cG^jL?v;+|Sd;yWTTM5Dd00!qr$>6lJ905=b9Kn~;J6{hx^#BV4=l}o! z0M~sSlmGw#0M~sSl(UEqhzNh4)R`c9p8G52QIfK>=z|htLOw%6AQHtG-^{v<bhVVG zyHNGlf8)X>)JQJ(=4P|qlhZTj%+4;$kIK$7Pba2D-6Xkacat=sYj$>C(9~Ei497Gq zjEcUC)3Yz}IgK)1P~YeoFFr>4o*$p4_LI{)p09FU4VHx;EUP(FS0#Vcqdi4?EBS$X z;L6!$L5WJ#>47feAKRpp%et=BLi_Ahzbi?;Y8}=3w(w0Ty<s-Raa3EM(H%Rk);y!H z3(<{U@cva)6y0amZGKLdFTU0llMuNzTsSFP6*I2LXH3)Km?k9`8}WD}i0RjrQzdR< zwyPz*);8DAIaBCF)1ZHUOWOCM%=@y}={Qr_(mUmB{?&44G8iBJga5EZi4Rn;m?MJ+ z;RFUPIlD+?U7#IMDw}W(h6~yPgei<*7Hs4j3o{H@A^NRzinE>bxo{)V=-}Fi5i|p1 zA@w7{_kthsBzYE}f>Ydq#dU=oS`r45RltX{5}reb3LW=A2Rwh;O_w884`BH^*pNw* zp~61>!&%11Pc!&jq7F-80SzzyuX4UaZSQ=A)<2wjGx2S!(hbdia*RlnHuObdVlK>S z4HiA^UWjl5E!BMRRg^eI!e_#`M&(q{i=aBZgE(vzxtu1<&27_Gf@dM0LPs2`hZxH_ zK^e6B&f|td4EjF)%AqgWjn1061dX+9E4;?De1+Sai4KW<+y?B?LnOSHRSNFNaxmfD cN_fF4r02UScQBFq@!!<^53TB0*ON*a-W4=D00000 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff2 index 79696baeaeb07e7c5a5b2fef737c622268f56af8..483e7b66e0f49b65dcc2110d44886220bb2c3e51 100644 GIT binary patch delta 5578 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 Ym*1h<V<4Oz!O2Fg8zYuoPQ3#F09zT&^8f$< delta 5586 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.ttf index 22b866b5eeb8ea1ada11ed37b1b1c4ff1535abe4..cf326236c0e940c533606031140a116d7ab707ec 100644 GIT binary patch delta 75 zcmeB)?}?vKz#<Y{@^WH{4~y5SC)+k2F%g%kclrD^p5Nvx12^*v1|YbxX(lI(-Yg>V ZU4YSKGmqvBCPtIVky`qjuW0XJ1^{KI8=3$B delta 75 zcmeB)?}?vKz#{mf`v1fd9~RG3PquD6Vj?cnCiV1mJipCX25#mT3_x(bR%Qx}-Yg>V ZU4YSeGmqvBCPw4Qky`qjuW0XJ1^{-v8=3$B diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff index d6fb3a2437586c31a1d422aa4d522eb4d4a88a7b..14f6485abb4e1483c0adf14e93c7d838efdcebfc 100644 GIT binary patch delta 80 zcmZ2tw8Ut_78a4<l9v;AB(Qj$da`Y^4C5LenR=JcU*q|0zA|t#zhD4@8=Gcw!syLU fc&~CW?%ljgjG2+~%jA9HYgw)=jCeRXUt%i&BH<vR delta 80 zcmZ2tw8Ut_78b!5)&D2%NMP|i^<?X28OAj{GHp^%Psj7yd}ZKfe!&0)*K1{_!063S fc&~CW?%TXejG2+~$K-wDYgx`*inu>HUt%i&HX$I- diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff2 index d7813ac5fc6ca1e76908b64754bac433bc3f7e04..5ff7060676d81f040dafd77ac0ac9e68eef20767 100644 GIT binary patch delta 5378 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 delta 5435 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.ttf index 59c717b18145610cde2e04bb7f307b74b9bd1c40..ff7e2b90106baf6920ef84d26890d21617a4730a 100644 GIT binary patch delta 75 zcmdmCzr%h)0gFI$$=it~J}f?`Uu@raB!WYxyhHGBJipCX25#mT3_x&W(@ZWHz1f1Z ZU4YSK^8v{jOpGRzd8PF?cgPqp0{~xS8g2jp delta 75 zcmdmCzr%h)0Sli*4dcWT9~SS^FSczw62T!;7sq@(p5Nvx12^*v1|YazD>DT~Z?@oU Y7hp8rd_Zyr6Ql8DUTOW!9Wn;Y0POb|Z~y=R diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff index cb5ac7267b2ab081f7f360d384a3e4a0da1db806..d3626cef39b774137c67500ed0bdf3fc93391fdc 100644 GIT binary patch delta 672 zcmV;R0$=^qBiJJhcTYw}00961000r#kqmbM(2;~N1Q3IC?UA@!5yAif2Iox6=(lih zb94Xz5md7z0n7y)cZd=FUk^O>01E@?00000*s_@l00000*s_@lvkV6d2!Fz!#DO6C zKKED5M@h<3kPk|X2{}VTAQHtGznQg+bhVVGyHNGl-#Bm{+)2*6TsGT%d42QV?Ci39 zt=v2dbd)xzlO(6jPSQ^3g1ws;G))~BDaSM{QWO0uZg=0sCp5}zLH*Ruc=0;2H+*+L zb#Hup&GS`mtHH7egJm^m>VKGodbFcxZY7^kw_JI*EGRLF=^p4Z{<KXxI;-p2ENsZ0 z?2D1)^TwB2-xfX#WjD;GIF4!;GP-8Z)tYDYej&QF3*NnoiK3g#`OVMi@-fu5ViF>E zDHmSKR>h1f3K`RMIHpO-#YQ~d2x9ti<+f=XG5c9dc5Pj5A95z`#DCJDe?>O*qAY~6 z*J}B+a%J$wyZpW7)?_d~{0HB#M2S~aaF`=Q0O1HJ8gh1!$T~$+QCl|Q0t~O(0)#12 z!7MnHZ!FAEu|f1l=Qg?@&L_f+L}S&pk5teMjD^&X1m6h0!@cA=ya_(WHCS9%$YCX6 zAXx>1o|W*d8AdzqfqxEoH1}P;sJaEq*TZQhNrutg{mWU#U!SJ>oT1ibuz*Dn|0g+L zV77NYN8>+EeLwMetFn8V-Q*aND4q62Ix(+vT7yMTA1_3>gq3PO_$o%6BH=S({9ff$ z(4(MQ-+@6}MJ{KmbMxD@mEf7?lXk>fJ;Yef2};%OI*<1pVnNVvuiS>wt(|?EOR!kW zcEVdc$XB?XnOIHi<4SQr50UUeRw=k8%OllyD-i@6P0v53+`>fa$Ny6E9rKA;=>Pze GP!WXZHbS5P delta 668 zcmV;N0%QHyBh(`dcTYw}00961000rxkqmbM%#nmJ1P&N{0g<>{5x@Wd2Iou5=(ccg zb94Xz5m2)v0n7y)eqICDUk^O>01E@?00000*L@t600000*L@t6vkV6d2!D#@*p(Q1 z*8U3Z9(j7`T?#WZ?@}F)GVa7wb`O62RTQSnWjZAvXi0f7DqT1B^mp_RwHl2twN|6q zpe3$cH>1PIaTak%>se%im*nREH{{Q>8QYBJBirG0v}up{?EKJ;xqZOhUSi9YJo77g z*=1^(22IctM(vLBM(Kph%75h<HB7^_-#KOY<}vB-sli}iQtRU@J2a9!^Un_*{Z4o- zC3{=B6^FsV`Irv4;<C>jx@m}ZY|2ktF+p$?yXyAmVSeccwq%k*;v&u}k@d0;m*iun z!}TrNEjYU+Z`~3?x^KB@nnuhXwPgF&CH5j=(vw(PncpYtCxY1fVt=AuucFcwzA}|d zZjM~vUD<m74;GQ5zz8KAx`^RH_!|-ak#7qPxxS#Ls3{L&35-g)83>1n1he2s-l0_1 z6&nQKb#CJS2j|aH+Z2vf*Lg&OI$)%t-xPc#_zdTg=P(xB#sOGddq`j<VMVesc>R`A zXU#Br;t9|@9<}E#KYz$N0n59B(@c^Kqfh%MXBqzZG}UJc1HBAVSa|WjlJ5}auICy2 z^9QH?Jn{ODWuI}LCWi=w>GWKr6RUJieX#K9VMBx+SW)x4TQTAkNIjNH^-Osv=u*%? z_rRb#Mk3!x=T_aN^#pe`pY%km>UC_%cNc|npE_?na|l7Nwmsa0(MM1AW-h^^FOQSD z#f7}3_GBhj6X&t7*kb~L)V*AV;JREDBHdd7FW6{$@-XE(c16GSE1IwCx>)CvR1t)1 C>qGVc diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff2 index 867dccbadc3a9bedd77c2f741953a839632eb926..e45ca49db8c66ca43ce41bd15a219db59b0c9350 100644 GIT binary patch delta 3513 zcmV;q4My^e9grOucTYw#00961000h<01f~E001A<000g-kr+-{01`Zx2(e-W4v{Ln zj+5(ri+<sUig(lb>a$hn<GsWYlFa(g(`Np;Z-ik4hA_wycZirTgqYQZtdZ8qu16|n z+4hS`l8QUTKi=-YZ8RPZB*DZIi#1Cvkdd~SfBWe$1b{`@&jIWY-I!iRaWQnGhJlZC zy#E0{&A^GR3ur*n7v++oYsQ58xZ_E{p(zgC(n$yaH`H-)6Szau+T?N7=aE3i!Ga{& z3Qb}c_TU!wNA^6&rFc@6%y&MDzJUBBS&Y%gk=09?Z-4Z|_=kDz`RxY|9X$Pq_8+`I z3TQ8U^@99#fgTH!*8v@W%}j!dX=xVxN?jIE;3-YB^yVLy@7^Fjd`grYko8th)CUqQ zy8n{RT61U%=RJ4>vdI9LN(>N5Do+B8IugI$f={1@EXbN3PIo>hZ{GDIVqhzI8nP1= z;iihWtU536j>rniIA>6iTSN=L_US}@q;o)4CFUljx^kGxpzIfaP;$-=$~hajO~*M0 zIBF{R=#GS-t%Tqa(WCP|LuG)cdGk7|LLGIm)r)Z+C|5b$#Am(~sZaWUWI5NOsdV_X zoywN$c5<@pMZ<1_vdfm#&HI`HG3nNT9ylO6Ci!wqz+(riPoM@W5hei>rKwPK_>Z?* zGAd{&nJBYN%zTo6#KE*+n#P+RZZK~Qf3hs+l_?t#d=yRl)JjKKW#9nMR+0{AK#0$( zux_GcXA}YHq}3r}E<hDo`jQ4^zF#Eo%;%dvps})E!9q6)SO}F8s$S27u)$+Si{m|N ziwCR}Iw()oKi--?wZfvJenyB>z@Dn}&0eZ}JIR;PI{OiS16$R0db7JtcYYc6zGGOi zqJ78ueLhr0tT_Y0B35;Q+S8$J6I^ViN~QuYg?&Vdmzj8js#vn402Z{NgFmBcj@E+l zD9&n&3tzIrPT2$!xEKi7{{rk>s^}Ga39Cm<Q9L3$D5DBg{nl5Pv1~W7pQ$m^xm<9| zUCIH26&tsI0uELRfs+`xhyyqAu!98fkO;A4f;f^Op3MGis)4?SkpsU*F8tlp30y+U zR$?L^W0IIbGBHRY4pNDSG!h`4M93f$WRe6~WOnizv`|8RWI-=Awt(=c>QDxGCGLeO zAo-d6NuZF@T)wEVZq2U9+D@~a^EpuDpa;`7g_A0OU~8K0<SeEZV-uU8(n~$GSoxR- zph8Unl-0*hslfIxbT7{2sjXEn95(|cRI9ngc|iI%3Y4-r*9OXn%OM>Wd~4;b%(kzn z(HwY$#j8Ftx4Csn3+FTBaVP_AoxT~UAlQZv_#nDFX5BjO3tVdZ3c_fWS!$$Iz<Z=C z5Hpv5_!S$r(@%D~n&iGOkybr9MiY|Mr_$%ytmyFsvsYXb*;n^>VJb%kr|w9DZhGgs zTdswoa=oF>B=}^rZp|5zX0QMuJqIjWxYjDmse;N8qO(!S3gA<obeNGC#lD`~KwCu) zRG~14B!rY_?OMX99tz2$q?u4B{N>i9gt8!iF?|vqQ=`_rgH1k42%x8n;cxTm_Sbe* z%rY!}<9b2%YHdi7bKG(R9W|3-XExN))Zlj4*-lcMn_2+lRwAK(jIHf7(8s2_eB+3U zEY{yNqB8eMF;QF&)K|<S;MGt-PHiq@lw=_+GqqB0O<-Bes7jpO9Sh@sVqX442E;Xg z%!RG3Iq&gopRIIT;Rqu@ZQ0(I`?0l5V|((}#WQ2TCDA#RNi3O+Pe)znr~+;}rM<js zL^*)&$6<SFYBcLpE2J`dMg=mRZYQF5G{7bk`v}m_$Z&uFgC=Z>Lj>5#$k0!KfC+nn z!vqL2G8`ems0kb67y-r^8BP#j(uB=_aEbuaj0|T8Fl)jh&Jkdqk>LWN7Q_-}6lj-= zrkhD@@R$N2<Hp%y8pPBXJxGBV$bpzvX5s{DLL9U}9P~gOj6fVV2?^K+60i#-U>`^< zb0B_Sd3N{dF<Gbia)QaFZJlpb?nAzB5GWdj6&;I}Sf<_sOtkQQs7;L1^Dr2Hwnxip z1BC4E#Pf-9PRT6|bQl>YJwcTAE;s*EQUrw`Rya8nHe~00LvK!P(NgfGlm3_MQdSW* z{{K9?B=AgNb^gi|m(~@<aqr+8lbZ<ppI`WQmLW&h=vTqFLXqoe$+iBSe$&eGy~Z^o z|Nq+mwXqV~r9loU2!&VVh;wa!aqHXRXK86&S#_+2Hoplxvx~HlO3JQ~Av?FWhOfJA z?AegBM&`7;t-JoUb33>`{@m@cz~@pN2pi{aPi6hzf6Xl;Pv7GH|8`d1rx`~2=4Rm9 zTSvp#+_8!sd2i(^R`K0G4Gufe8AXwSpQNv@B3zO7=bB2-kPxyyjfm}kxK8<Y@cNh5 z{qC>+S#@T{*6?*NdJOqDn_77-7@U1Y3A^2q59P?r%d+RX>4c^2%<bTxlx4?eV6$~Y zSq|Q<#E1R=_pd~pTf<vz$K{Csjz!)HUwrA%+PBW7qLq6LW6kLd2184z`c@s`uZ<Ok zIAo|H<kI9_ph5|0SS+T0Qjn%!LjT#o#Pi|FNrdl-IM=2^5lZ=&re35a*Y){y$Lh^@ zq_IMzK(QNz-miD9Ip&MKk9wut|2@D35`EkIOZ^4aV*iEbi-QGK-pAd)?Mn=B{QbZE z%g-B^YwM$*PkZhC`^Ede-EsBR(s>pu$B0$p;Q1Gb0|nJT3#)a1Uiz@ACvl%B*f*3{ zWS+9h-bs(?)>V=R5AIDEw14Iw`#8p@_)ZnA=WW0|t=0Vt(rf>!6Kj8Wof4I;r~2}o z6l8MxZI3NW>JRE~MkcPea!|y^>2(_K=PPF1{%{~+b2>A$+t$@0L)U0ldS}BeX~#Kc zxV-1RESI*ZLuNF8LZAC<yyo}*FB1Y*-Nud;ADim1Px?&IS(O$`%fdx{*~uI8`X!P- z`;6Vz_7(+}qHg@Xh%x)*R7b^6p4oI!D!n41RTV66OlDrZXzLtSVMYDcFE}aCy*Qt) z$)d06hMSr?EEDl)fK?r~bzZzUnfZoA-zl3!bLm`>zB=fCUIv|KRr`Dmr}rNEx}x%@ zGoIT(=i=enpVp>b<i?Jk;{Qp`PjXM)d8(ht>lJ=?InOOL%{6geuPDzR=4KO1uE;sZ zl37{(NRMf6+USn;KbGJAMSmN2SU5lB-jajLBV&*Bh~f0B-IZJC6UQzY7dtus`_n#p zbZ+_ic`ki_Lf4*P;66K5DQ)wg^!M&i&&8Vk&s^f4Pc}wX@h75`@|P-Kmcz-g&ii|@ z);bf+$xg&pRp*K{dGML)L|f`b0?C5-b%}dEvAx^*PN)4LT_a6;tNE=)(X8-Rli8xX zKeT5?6ixrzNJuch)wJ^4%^IW24ckM?>-buu>)mdD>=m)lZ7T&|ugC-d<$pK#yl`Li z`;-WGbNsg>JrUeJH$<MmigF*fF`CTanHdH#3u7D^$t;60ncuGoF&1k#XsR5s7$HeT z)`p;4h9u>u0s$ak<LEt)PFrifkQDB10C@VbYvuN3za9C$OSoIO4}b&)@bCzamtjn} zBcB+5eg8Nhbp6Eo7GCAl3wZTlFXKOU<&<uqJUYHYSW&OA4{=FzFQqCI?udTh`T+so zjto1=y^XV2JHGUkkl?_*4O5f{%#yI6NvAhppBS6Ei%id47hS2dELOsxj9CN)gBF7c z6BdV5^A-=gD=YyTuH9Npu{84GF3SQ>J+rlcuEDT9iUaXx0JqU+GmGHNs>NVo_gl5* zwB^s@Wh80|JS}}|ab{^b@jhi)l#DyK)@Nkf;18W=(DpY(xMZ!UU8ydg-M0U@M^tj= z@h=sInt-*BM_QzY`|No2CR5M%f%f99wA}v2Ezg1%xgiQP9=VJ)QPy~;xzX7fznwdO zCYGG##w!Ix6-0rA&s8jkp0pb;S(O}2#tWN0gLtbv3%>?VWJ$c*U_;C0Ujxn(cgf+u z@D#2r-JlwwpjWAXpk|0%{+O0<rqev=*y1F2D*W(92VYBPI)L}lw^~v8JJI>0mHLg7 zY!&NiU(rpD&Tz3M;tBSE4b2XCxw%DukYVM~#X%lxN3FDpJub+ONMjK|<<yWj*<C#R z7*;iw#&RK34r8=lby4%MKkV2_kLX(O)5Xe59VoD^BAsR*QrnDXwP<AX$wYya?U3uu zL8pdWZ&5JxLN_$roqjZT7qJ$S3gb@wD<djwPawh0P_F+cNp{?$>GWi}ZSZP;W8I3- z!i$KOX~0bHkW$BQDFb}eFKEKlHu*)A9wlck7KnDds)vzNryp)Tpiv6aG;+8@1`nFC zK!Z)1<zKa;4zw858_V9dE(3_@eg=;iO50*;t_Rq$X|bf36lH5bMPr?X8J$?;Ueue1 z_)&%^S1a71J;x(z?`fnzRl)gx=67i+s&i%D=@uG&U-C+ct;YYBC{!_$Qqq>zb%&?% z3~|KcP6#BDi6k<UObV%_nJ&;ow>#qw-Pz~%zMd~C4ErPE#5C}F;WjQ3moc)PLWM9z zdKHSrd|ct>iZ`_ve;!H}(ZPvHPg$*bTM$nR$Z5xvF8TvtUf=y5El(OOuIh}<hMy51 n7AV8_FNJTY2Mgx=V<L6E_qL!O|8Ap~!ym9%U4gKW2LJ#7*xln} delta 3509 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.ttf index f474ae8b9e3559ed4179a52927ae38d389275a45..3034091cdb7b1c98799073e1770eb57c24747d70 100644 GIT binary patch delta 79 zcmeAO>j;}rz#`CG@^)g04~yTKH#;^S5fG9oO~~?&=ePOFz|H)E0SInvn#l#DH-8Wk b7GyM;9H%V4Sz4u$3CIjo)!%$Z&4vX4m}eUF delta 79 zcmeAO>j;}rz``d{!#J_ThsF2Io9!Eq2nfm4n8m2Z^V@u7;AVco00h@-Wv0OB%^!q> b1sRPe$0>_%mR4zG0x|<t^*5hUvta=M9u*k& diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff index 8280840bf2fb2a878c2ab3cd6c7e5f26efe832e8..93c57a6f97f529f7cbf7ff49678c423a54aa34c0 100644 GIT binary patch delta 640 zcmV-`0)PFeFsLw)v;+`?bnTJ2TM57b00!qy%<Q<c9080A9Ccu7OJ5H>^#BV4=l}o! z0NApb3IG5A0NApb3bVuvSO|Y5*I^*oXMe@q9ytosGBY#ZwzSS{tbpUP6#V)(QI?s? zpmw`K&`f)osl<+cM}MePC`{%`g<^qL*qTa0$C2SA;*d6zNCi*D#gTz{g0^Fw&|;*^ z+~{rV6TY}SHhmsB;!3Nov$ba8)|y#`siX=tMGq9Y8_5gQ8E4is6DohGf*N^cmf?%j zq~9~0PDeGgi>tb;q<QYoho*jGtO=!u%+MSL9php;V#`^Z%QRRJ?db+TT#5>Uli1kd z&*SE`>*$P0h`Nb5v0`f_WzNXOOvjr$w4ZV^6z>cLA>A&ysESI$?!Bbj+SK(`oypHc z)7s)8X*U(b&ZSfNyp4Y{lRB%csSl={-(TB#{STJWM2a3V7*r6$f$$p<{>WHDL9R*U zJSxgVSOLR&Z6aUChy=6XNZz3^n;t6!?<N;9a+f?I+_q@6PhCVLs0>C!{M&+01Yh7% z`V9JlM{op|)E4T{(y%6737j7@;n{a6KjSITD;c@RDIZjwf#rW~VSFb^hw{(JC-*Y^ z_-^`~8Fc)m(13=M{HlyysGBv<;m;55`s2phjY>b#JZugTh|>6Zk>4@v_o)pQJ>8uU zVGml|{OYMFNeYCIg|UyE$AYc}b;OtXgrTA?W90YE-n6v@mwi9^8L@Y7Vn@b(q+a_l zdFN3=2zqwPMJPP~_?f-fOVDV`V}#eZlDBXV_C))}MI3tUFoi&PCs!&sFPB9mokqT$ aU?q=a-R*K7`{LjEiswHPfLQU9R2S6W4nW5M delta 640 zcmV-`0)PFeFsLw)v;+<qd;yWTTM54a00!qx%<Q+b9080A9DFuhC0`Fb^#BV4=l}o! z0M~sSlmGw#0M~sSl(WPPSO|aR$blI8&i)GBmOMSM9A;*|r8*vE+=;2|9{l=M6sF}e zy^<faq`VlGt`mED8@;1eqw&4gYBU?Pz?JJ{v>!RnA`WRai%js8-28M!{zmJu&1g2V zZBB>l_JB`L_uYs;?Qy4@*m5b){8C<am|CVmWAuPgyP>>LI^wc&c}9N?(=Z=jIc50b zG3o6@zuz~h_3?!r7)hRb_ghE55nf8kURSQgVbFIzrai8>>~Wi}8lo+m^21h45FEs= zy8gMJpZmTonWT`oh_gy$-K@<e`Iu>cb%VAG&aTND*MyL6TW*@B5wm+O*`9TYJxiGM zB$k$Dcggy(Aoji(tJi<4sC0#|Oy!cRBiFZ=HeUaOdE_WCL<xruVt5eVBEmcQw$PC4 zJ8FuW@(>olsFa(5u#ZSE3y$O+N@Z2CLGVlGCO+Lcf0Np}aICt{A`;XFBNhF+-~+)Y zIF&qy5m=OaU~%mtft7?M$;#mMTS}cZ!{~{}K(Bbz9=rS|>j-}=?+Q*cNivK+AOCQc z;qOmVeJ0S?%OHh?7yk?S4q$G2p2EBTIQ7Sgmp3f?i1RQxL?BG3=OUe0rE}_mg->@I zB5c8mnqS?D5vM@vu~e!@%6&oSg8I4#2Hh|c`9?ao>L#r#xUKo5Ct_8vVne>$D3trq zdE=2o2zs{VCX75jda@UD2^KwhoYXDO<Sn%aGqIXDi(SPYV+f?~<thZ%<*E?r-U@iZ aM$?nKDc7+r`i;NQ`~V8ESnmLnR2S4Roj<t% diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff2 index c836318b41d1dac1cb5d35ada9690dcf873435c4..53b65afcff022dc8512e61cb25f7075715de8f7c 100644 GIT binary patch delta 4982 zcmV-+6N&7cC!{ABcTYw#00961000xD01f~E001jM000wCkr+&W1a8QLzk$^`iEDDY zSTNOW-J6NqsaB~(gG6y8cRKIJf`L2Va8xe+wXhExA<66!Zr02uSrUQ-I4YW!t5Xh& zR)v--P;so{r}}2rdo@4P!vCYKpA{u|kQ*LiS;W2!mNiroG_zLJ6!mn~$>3E-1rPK) z-#2D*GBHUSbw{axkh-QeLv!g}%Xk07KncKA4g+P>6m!`)u{2<I2!Rr-%@_I~0Jbpv z*YBtQC0tg7JNp8AjLMyQq>tkpBkNoT=jBEDV1(ls(~sbkk*hlSKbvOzXLiRh)$LJ| z4mZ$o4*(TV(|mnt_U-IQY*<SHNg<MK*7-=%%aatwlA)4+9Y8Lct3uehsZ&&GiWKG9 zkfkLL#Lik>_>OHG&Mwqmx;YXfq1_9w?*a(J;f25fkh96t0C4W{!SQ>r1p>z%?*RBu zg1`TP&(pEjN1=-RFELu$0{z*i?2j_Q1;Y%Shh)1J8ca&k0eIQq;;?Y%mzhn*0tH!~ z6^3lK)s5s%Rq{2%WG0zJ(|xALa{l-pe+c}y)B#3hxxk$cFyip0YpQ?$9)9Tf@5KC< z;3r@E%)KsfzL^t^CyGv}zd1Cc{Ce}(4dnXYN*9m)mt2!D0v3NOcma-aC2WG!tsOz2 zf<sel;77U$W&y!8&eG#Qpy_-JefW@YoRIrgR_cPU5O4qT#RQtU&7Ai@A5d$f9uQPw z06{KS0fH9d`4_PHL!X;a?RY+Z^)Y$#uIs&|<2HG!-kk76&-1)xRjg9GAUCFx2;kPh ziVDwHXr=D#)&_s2E}=j!43tss0#~}^yXe5ULIZ;S()ii~3>pj8+lAotBEeaNT6ErL zune%6H?KwI>Zqcabh-<H(W3;j^og%U>g2!0^{CciB5Zz{$_v-N%E_`9RSyXaS1TnN z$7~K1y3hl$4NzaviY7qbP7A45U;~zL%YXuDStDxxhb@0<u_#kjW}I9Zg%{%K6`P=O zJnyXy!rIo4E7`m@h5@y(UNr7Zl@_MTLb5q8L_VR)K**=LwIdmqM5NEKyo^D^5mZ#8 zuc;R|nEK?M`F!37)Kt=|Ct8gH8o*LQrAI@=LVP}>PO>hh#?QH0gk+O%U4Pi3=}Z+G z6?LPRXe@tPK;rS6RM~cvPonPZTR_L-m+A5A+>G;wW!S2o3fkJYzE;(MRYV)PM&}TZ zRrSKu)4+WbjGsZZUK%!5=+2hhk)^jfFA;YLKq6aot<0!2MNN@#9bYx$!B?yR1{;9_ zDtb)#x(*mvt3c}CB(xSaMzo01fYGP|RzIb^b+CT}tJsbH>qqIV4R<03mQlfQAz-9p z1mZY>c+NlqXCaYuki;n@a|NVu9#XkbnTH18*R=BC*D8SZ<2sEs)S)CxXK75P02!P> zCTGCJSy;|F$l?^TxdL)H54l|M%>)gUP*`1%N)637Lw{h;Vs3B?#sY;w;WDrSX)0Hg zt=)gJ{aEuTq4W7CW%bW9<31~vl}pBPx}0lhY^G_h{L~_JLt$+PUJc$zDS#opVL=(< ze!zL*)ZMYIT9oMX0S9U{RX7A{<sTGqGC0r#T)22)DuSQxrjla+lm?s!OilY6df1&k zwW+mAGv_mCv3DhC+<QLY0f>WjSjXv(pbLM?&SFy2dGb3c9?*bE8P+0NUW{(=)2r^% zcXGKI<J2qU&9EG!30~?<=%G!D+>{{d(vB#$x9>t!76zksArUXrx)GF}P+g+8)S3jF zZPIQzgVzM&Ix6OBi^jk}TS^zB1n2Em7b_2&t7Ke@J}<G|+#16Cd_hSc#Niy|vJrnm zYqsK6={DdkN}7-~a#v7R5UqhS=?g(14b+%-klY&x&gL2FZrj6$-<YQwHeuzOz}j(8 zej;;wE1owgm#fM1Wmtg$$!uLGuacTPsFp-si1$|R>_vwv^u|c{Tn(P!T3Z9f(aD!h zYq`446RKb}z=BQHHZhT@b%mzJ9khQfe#JT}54o&kTl`;4n;+><JD58+w&lFT2YpsD zsJDh^0Nya@ZNi#5b!Lrm<JOt&VMFxyB>Ei7-O?0#sXlTB=O{IUTSLq9LEP9h(4;d} zhRXVAj~QC*s#ba`fI4Pv9HCtzunvyU=>XKTE{@=r2rR%6f(}46>*feO5`lm9a)dqy zpqBM>gaL`b206lz1JJ;RIl_oUV51x%<N(yLFh__;1Qz9ZX3V@;V&`Bim07G<);Oz# zi7dnctAfc?DLPEqr7&%mnwdaHnC&ftIlBzz?J`)f%V1@1IjpkFVYOWjYwYq#Yt0V{ zEP3n6uQ@04u|;Ni$A$-$c?y340hfRl&eElC#<Ms9`zQdNhVu>*02Tp(PB^VE0C-`f zJF@I*8j(f^F}%1xwDieD2K019QVc&%fM39z3C<`cwlFa~ltrFIF4AxK5nzApCtwDx z6M_`Rs9Fs?+H*VI#8@XGR_(aop}GlPk}+0ky>ex}^9_YGgcK;JyA6L+{)g))g<F!T z-ULJg+8U)H<rb7pXl{;5UO=N5B>6V&=yjUtfZP!ACN>zEk)V3igIF4+P|~NuQ*HRx zGpE8Fi_VK=DEnqZ>dLyVcse}1;UIfC+I&;5%abt;2=&RzdBABt2PlhcmETKmX4<^& z`n2-zI@1z$03_MOcbI?pL}_To$xz*A!Va||MP1cN3pGWn!x5gaYU}$>gjD|G5|CoR zlIiT%YF9LU53;J}cJ<HlFT38QX_h<4%>P9VEMaw>Rsjh)gOv96)_J6aoq{rJO3$%c zX!ADz6syH<hl_QcJ_!g#N;HeJkW%9aj#KjtDFs&RCuA7RC02hfH(k*kW4Wh{rAIfb zkr8c(CveO!Og768LL$;cQE!^@NY*oI`83+B%Xp&~#%>;zbU>)_=~{~djqYU`;}mqo z&BJ6(+@@SnvQWwp9%Q-W#O=JZz=w=Bmr7=}*{PRLr^v~Xbv{2a!|TI%dZo#(BPW;! zhB}Yhtnety7=nLiZ&IMl-p_aE8eAxk&u|i0+}f&9TA%vodO7UZH=E#!s0>;e9rdhF z7H;U#lF$ULAhWLcQ)DHcC^<kHj!)TS<%oa!1%x!zkeL*eZ&XACr#4GZ9i<S{M3uJ0 zz_%+QlA@^|p2KG-CM2m1GnYsi<1kK?BOKRIB|}f3$~u3ci0*L>e+{j{O&Q`lb?6^$ zwuaqCQ2VEshMYG?wK0uQQP|wf71uDLI8oQ+KQfj?I5LO#Ri{S33Bbrq6SYCkA7(U< zDz_kXH^niyv33d7o0`DjG<D+tE9=`pnf4oAm0q1t9zQKs;25Y`R=uuHK-^2Zhc`kr zvlNFit~h^(w|N@q7c!4__27dSvh}R#iYG(wmU8MnWhlH#0%VvT^f?xHrNqLFI=+&1 z#n;)V!%dVwil7%jhyjLp{SxzNgYL-9dzcrL9km1aZ9Bj?^yuH)*N^^tcjskFI$e-{ z_}DL_o>gmeayKM&R-h#A9l^k>@j_5+m~UdXi;jPCRHtOvJKi6RJLQaK?}i3C?~$cV zzrJ}*lB_}oX??*~!#R>lCr)plN+16K;$sf)Um#}v<)zH&kE>8+m^KtfK<9}%m2^&+ ziWItUuLJ!{rFns`f*A>$%j(CiUe!SI`EX%+;by(Be|uG)&X1Wa<yel>lMJ0*3Sk&i zU+#bALJ2NBFM0HE-t1Hx|9gK%P^S_uQFisM{+4UxPd$ZKZtt6FZg0!JW$Wr6Omr#p z`y;IP_FpJOuDe7~QGq@uWecKI{K(*r5&2AiUh;Y1=N;7Dp-UUhx+unR5@*CfMx!}& zsk++-UR_Ueo<Cu#HxO&iD%R?QI(4?+Jl%gER-VeAaw^Yn>Ynh1ntxT~hrA6NN&J4$ z@Z|MvmWYwQ`~64LDpCrchN+S`I|TCa;D;k0k9;zS!kme62sCS-(-z<KxmTRb-(J+g z`}4B*J+6-nR2f)kFxPV+WFCIhSucI*zN{?4D~{(krvwv>_Waz3aC0XH_OX%+?(%;q zZHFIU4{>!K?aTZ@<ld^3GE>ptVcHLkzwd3n+n?q9cbIy~OX**pLz>l!yQm`bt4lL; zjVeO4eJzjeIz*QIf3oFD-{mkqM|)e!q8YEr%rylzqrDy#skO@FrTSB^WaGvCIZ{Vp zSCC<^dsBY#Kg|(xO@^Fol?rO5YP5fof0upAF$t%AKCvG3*|j`M$!eD@lf+H;S%_V# z6OGR!i(~y~QpbavnV`-9>(A*YhTcox&$#Vqlj;g2YqGpw`XKF!m)731?>dV6*NZw) zgSYX!=?59tl4_}Tf$oz&N?v_?<As0zbTon12%F|UB~f7dj{fvb-`-U6G^Ky{52V#d z9=F0TPAg6Yg<>F}0QwNE><{!u*eN=|xR<FVFtAb~S7hjl(*!8W)O^Y*b@_UOi_a0g zT^mJG3Ky_qan@dB_T)PxnI!)34=+A>=>=)ES+CNBz!_3iUiQcQ<_}(Z?Z~!@u0HqY z{xv(>>vlOKbe{iXQOTk-fwF&2eEp}WrH`HYIDt&$@!p#8cjz|p&z}f2|Fkt|y6qZ& z%T@V7ZcunU745Pke-DFuV85uSTCy5jf{`E?vQr(>Mq35VY3meLwiJKoS0PpI+a>9A zx1HA1w!Lhgj`ROKB(f;+IOty3H>ht_Zc-uhz}jS$#tV-mAU&05LdJjiKGC_d@zx!u zH{B)~f(9J~msUsg4ow8H49=rsN!A_%wM51t*mQ-cD%qdV`stY;?F!r#7=PP$weOm6 z{`$!;F5L@zt`$_<=sA1z2fjHttKaewE|B+&Bq8mz`}cl+z~-e)Y1yJaRigZ@-#ase zj=jtLZ*=a>R|%3yyX=3399H7NzO7xP->Q>li@?URdze1sD}AWv*Q8%7owMODo9aFe znzpu_y1gk@zJ+HbR%gTsG)np%Yv>bQo<`#>&XAT~la|8S#M9R{;t>1Jwwi)EZOHlC zra;~1_^(SOBhvVWyfa?iL->W*jM4TCoAz%bI*ESd6O`VzzYl-*XxDdl;bY1*L;Q|C zuR4iNPn8>P-9RCFZs%j?P#`-1(AWlPR17ih!#DLU9iR6R$|4YJ!9yB?Ge=952vSWX zgO*iVh*Tm^^%5~+!6>pi!BSsQOYSU;iRX|&Xqu5_lquM%220zTnvn6FH1JXc$$=Dz zB}f%34cNj9&OU#_8OMuw*|<r7_qDskY9G;-9pFXgcL0FTAG}H#UiI)r$I=vY^iu%f zfdG(T0K-M-&qL|HrQhp+Mrl)*qfpe3t#Gu&B)~u0?2P0jc%nvBM@9k1WW$9(NJT|x zX)kRJ2*BZsws{ltJIqJhQ9T6Qa0g}@O^|_f;&0p`x(0tMAp<~MQDipa4$8va;3Yhm z!OAcnXT!OD)A2+m&u)Y-F8!W52>L>D%m5BR)L``zJ*J>LN3z~Ys;{7@Q{sZgAke82 zE`kW1E&&A$x(t{^Tow#YcR5hQRjstZRihnlcQud{zG#&MSUR7PepWc?X55!>5#plD zTml+$kIR2RL-d5pLUy#|a*z~fwbH>=lQE{!)qo?ttyLPhZjJx6KsJ*1m5S6KAa3pK zu0HJ?`-^(&VoRH2f=6zd2+e)p!ci@uK&*G<yFVlxKWT=(#|3WTs_|IKoh??mL`F#z zPL1+ZSG2U%@>~*!nip@L5EPVswx0S1<flR#`aXYL`-(i>6{Vhz#Y1C^I%`(;YVkU! zQ;nz_;F^l7zu9|Wa&@Wqx3zh_nAZ6Ge%|l(eW&Xvw)!oXygH|CmM6wd5vSzeh}93R ziPfEQXibT-yOR0?4)AMcIv(7@_6A?kHw3ljE!b$4N#iE0A<Gq!M^?njs#sxE+hnY) zPRxI5WIe~skB!B2L}_!#c*Cu;P_o{@#=$(g1!O{OS@lRrRA$cFs6|M?*=Da1ev>v; zap)3jue8>TkX0JYo3kdOS0zkLh_R@AOG?O0IutG!1)A=5%_<{U^93u*&1LB@=4EAG zh*6=;`pauu%nDg!!jzB=ER|kQD&(2Hp2&a1G+J9|UR$&_3qsALVn#NZS#2o2PMs1Z zyJ)MjHX*akxrG{!RwndBsC_l5_M2=>uRqzUgp8tR3==UNTMf~EYfV%EBdcU$<h5Qt zvUUr|YqM_mu>f;@H-n9ClxhtHpDhbnM`p62IAJrbvQbP(WT9GT;@mY#C>?}dFEoF> z;wh{aahzUYbc{uOYR1fu{}tLb@Db$*oKJA+U`3Ly{&hbo5J3fc6)II3HW~<g4qqUH zEZl}1QdB%hDs8OedOirj2#VnZNzn|;sni;+PH!-p%<<1nTCLt1d20Kzfp2mq8vC6f zDGQ1c4~SQIJM_FFiX^gK@LwnpHc@{h?7|_O!X@0oBZ@_}s1dbxT|5v<cP5BJy54%L zV6Dq+&PA+Z6T5XRYiI!0iTYP-fR+zl@9N!+cz)j^e&%fUwHs*7Zh(B)Ie(WY06<u} zGf?*~$1^*77pu<fbs@^LE1u+c0J5=sB+!ear+e<*pvr$7mv;8N-J~qfMe70p0AD1f A2mk;8 delta 4955 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�M3RiTatOni`f@jB%W&a&v7<*bW~bWt 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 Zz}t(Xr+e<bpv!z5!#jK4UQ(9lf_3-pkpTbz diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.ttf index d0312db2f0103337913106b5dbbd33503a248dca..2fd85294ab68105c5ae44fd65332fce36c49f8cd 100644 GIT binary patch delta 74 zcmcaIgXzi)rU?ZsLNiNFO)T+a6x?`tYN5;|`?K@n`E9;3a5KMP0D>EvW^%#k%_T*L YgcwaWo44*}Vl<iD*`~i)sl$i`06EbcR{#J2 delta 74 zcmcaIgXzi)rU?Zs0(#Z=CYJay@^3smwNPfd=;5+>ew(ih+{`Z+fZ%$q%oG^Cxuocj Y5To&C^VZ!=jK-5Y+w?apbr`V#00}4>SO5S3 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff index 4c476b7f1a038d9ed0b459cf722f704170f11f4b..e90fa2bc7ff9e2f81e57a567be2a8620ef9c8d27 100644 GIT binary patch delta 638 zcmV-^0)hRco<u0g$u=5}9<$k+@q3!vFvWBaKcGvl{^wK^&4l&7NNmJoNwz1Lyz% z007vsnF;^^007vsnF_N^LTm|t;X#QpAsP|_ktoFYX4W#&)l!=7Lgn9o<G`mE)u=Z& zn`TZ<&zw0s3-Lc+mD|cKvOq^^gE~oa((EMdgf7^-MM2ZlaglON!y+}&dvUw_B0i>3 zW((@4cFxP~$j<ooZniDCu3X^iniuQbR)bX$2CHhp)G-P5=)J7D*L}r*-*DyKs-VOq zru#+c_|w#MbXwQ7S=x|2+Gisf&Kf_u$-ePPD7#~J&2dz_kkK`Jt~NZUm#fjGUGj%Z znJAiN&hHe{)kCOl#Uw=TQZBsou8TQW6f&mia7>eui=BA96U6lYz1ya3#O$q??8ds> z-semj$I_sGMK<)JEQGRu*J}B+a%J$wyZj}0Ycd#r{Rih*p~Myy92UqBKsZ8*hSUxc zIVWf;YRgBs0K==c0AY$$Fr$#lh=my{Hi*7;Zln9^d@S5ZG*(^vNCnNoSW5p$@J#S6 z?xb!}3a-^PfTdo8#ea=lbQK0NwLs8X3C}vsX!aiHTes$+->>z5H_CcA%|SBP=-2(_ zrsJRQT76DY>oHiuB8dN^)MuFe9?sDChi`H?@oBHJe`*dU$B0DfG#BZ{yzXfO7CpVb z8sQRFy7>n$We~}kArr<QcuWO72&(l(7_?X9Qd8Za-_KnOo~s*aHrDPT#!@Fbu{dxZ zA2`II5AWTE(NB{&eL9z5v60USZ*h-Yxwq|Do!G~f;(#6^;e(t~a7&Iys(UCA1RI^6 YzwWz*iS&>ErsqGK1Z$}Pv+PYc0f+!WTL1t6 delta 638 zcmV-^0)hRco<u0g$u=5H5S(k+@q3!~g&XBaKcEvl{^wK^&JA!**W}JoNwz1Lyz% z007s09Fzb6007s09F((6LTm|t`k=&^5Df`|NEBjxGiw>?YAH>3q4Mv)ap2R7YSf#X zO*1E_XU?3Rh4`N@%T49xS)hZoL7gNyX?Bu!LKp1ayr4<yxJWssL6Ms1y|{h!B0i>J zW((@2cE*d%&`$aGZn`PCu3X^in&+$BR{doW`pat0)G-Nl>AkGE(|yH%-*DyKvY^By z=J1Qq@u#Wj;Iyu5v#=q1w9iH|oHc%QlU?JJP<G2~o8zc<A){;dT&;OVFIS^WyWkI( zGEp?moZl)Y%ZE_gib;svrCfOFT@^E~C}d2N!HC8s7hCaYD~Rd;d$h}l~&*|l}K zz0a96j-`I@ifrgcSqNo+x7G4#<;viVclk^1*0?|V`VY>rM2QV5ILwhDfN+2m4XGU@ za!$}x)RvEM0ftv?0m1~SU`8R85eqX=Y!H3x+{V$X^RaM4(O7luAr&+OV<G)R!BfGv zxRbg;DY#bG0G4_U7XKA;(N*Zn)B-_kB|PgiquINlZ{3>ve!td#-ze+hGzZCCqu=2# zHy!_c*XnbMT93g37D4<Ur9Q*#_Hc&AKYWw@iBCI~{Zq3yIYuN(r@2Ts=5<eNu;}Ua z)d-ic(#=13DT7GP6qzu7&toF!K~SwP!l0cZmzwGZ{ci3`@J!uEv$1v$Fp@gfiN&7t zXwM-AeR%ISjDDIp?9;gfi?w`Cc#C`F%DrvJ>ck$d6bEz>2_NK?f?IMtQr$y|AlT^i Y{B_?gjHQ3{H$DFWlKyL_v+PYc0UCltl>h($ diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff2 index 1fccfb8e713ee098063335df01b557609a0927d2..e40ab151617cb25fce5b4e739aab4f44ff3a652d 100644 GIT binary patch literal 17272 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 X7IHyB_z7@g-T~&)gHWZ(YH|VqvZ`!^ literal 17304 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 D;e#_Z diff --git a/plugins/tiddlywiki/katex/files/katex.js b/plugins/tiddlywiki/katex/files/katex.js index f552be1c1..8f2991188 100644 --- a/plugins/tiddlywiki/katex/files/katex.js +++ b/plugins/tiddlywiki/katex/files/katex.js @@ -7,7 +7,7 @@ exports["katex"] = factory(); else root["katex"] = factory(); -})(this, function() { +})((typeof self !== 'undefined' ? self : this), function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; @@ -46,14 +46,34 @@ return /******/ (function(modules) { // webpackBootstrap /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? @@ -69,3930 +89,78 @@ return /******/ (function(modules) { // webpackBootstrap /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ +/******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 63); +/******/ return __webpack_require__(__webpack_require__.s = 1); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray__ = __webpack_require__(57); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__fontMetrics__ = __webpack_require__(30); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__units__ = __webpack_require__(19); - - - -/* eslint no-console:0 */ -/** - * This module contains general functions that can be used for building - * different kinds of domTree nodes in a consistent manner. - */ - - - - - - - - -// The following have to be loaded from Main-Italic font, using class mainit -var mainitLetters = ["\\imath", "ı", // dotless i -"\\jmath", "ȷ", // dotless j -"\\pounds", "\\mathsterling", "\\textsterling", "£"]; - -/** - * Looks up the given symbol in fontMetrics, after applying any symbol - * replacements defined in symbol.js - */ -var lookupSymbol = function lookupSymbol(value, -// TODO(#963): Use a union type for this. -fontFamily, mode) { - // Replace the value with its replaced value from symbol.js - if (__WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value] && __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].replace) { - value = __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].replace; - } - return { - value: value, - metrics: __WEBPACK_IMPORTED_MODULE_3__fontMetrics__["a" /* default */].getCharacterMetrics(value, fontFamily, mode) - }; -}; - -/** - * Makes a symbolNode after translation via the list of symbols in symbols.js. - * Correctly pulls out metrics for the character, and optionally takes a list of - * classes to be attached to the node. - * - * TODO: make argument order closer to makeSpan - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - * TODO(#953): Make `options` mandatory and always pass it in. - */ -var makeSymbol = function makeSymbol(value, fontFamily, mode, options, classes) { - var lookup = lookupSymbol(value, fontFamily, mode); - var metrics = lookup.metrics; - value = lookup.value; - - var symbolNode = void 0; - if (metrics) { - var italic = metrics.italic; - if (mode === "text") { - italic = 0; - } - symbolNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes); - } else { - // TODO(emily): Figure out a good way to only print this in development - typeof console !== "undefined" && console.warn("No character metrics for '" + value + "' in style '" + fontFamily + "'"); - symbolNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode(value, 0, 0, 0, 0, 0, classes); - } - - if (options) { - symbolNode.maxFontSize = options.sizeMultiplier; - if (options.style.isTight()) { - symbolNode.classes.push("mtight"); - } - var color = options.getColor(); - if (color) { - symbolNode.style.color = color; - } - } - - return symbolNode; -}; - -/** - * Makes a symbol in Main-Regular or AMS-Regular. - * Used for rel, bin, open, close, inner, and punct. - * - * TODO(#953): Make `options` mandatory and always pass it in. - */ -var mathsym = function mathsym(value, mode, options) { - var classes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - - // Decide what font to render the symbol in by its entry in the symbols - // table. - // Have a special case for when the value = \ because the \ is used as a - // textord in unsupported command errors but cannot be parsed as a regular - // text ordinal and is therefore not present as a symbol in the symbols - // table for text, as well as a special case for boldsymbol because it - // can be used for bold + and - - if (options && options.fontFamily && options.fontFamily === "boldsymbol" && lookupSymbol(value, "Main-Bold", mode).metrics) { - return makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"])); - } else if (value === "\\" || __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].font === "main") { - return makeSymbol(value, "Main-Regular", mode, options, classes); - } else { - return makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"])); - } -}; - -/** - * Makes a symbol in the default font for mathords and textords. - */ -var mathDefault = function mathDefault(value, mode, options, classes, type) { - if (type === "mathord") { - var fontLookup = mathit(value, mode, options, classes); - return makeSymbol(value, fontLookup.fontName, mode, options, classes.concat([fontLookup.fontClass])); - } else if (type === "textord") { - var font = __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value] && __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].font; - if (font === "ams") { - var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape); - return makeSymbol(value, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape)); - } else { - // if (font === "main") { - var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape); - return makeSymbol(value, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape)); - } - } else { - throw new Error("unexpected type: " + type + " in mathDefault"); - } -}; - -/** - * Determines which of the two font names (Main-Italic and Math-Italic) and - * corresponding style tags (mainit or mathit) to use for font "mathit", - * depending on the symbol. Use this function instead of fontMap for font - * "mathit". - */ -var mathit = function mathit(value, mode, options, classes) { - if (/[0-9]/.test(value.charAt(0)) || - // glyphs for \imath and \jmath do not exist in Math-Italic so we - // need to use Main-Italic instead - __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].contains(mainitLetters, value)) { - return { - fontName: "Main-Italic", - fontClass: "mainit" - }; - } else { - return { - fontName: "Math-Italic", - fontClass: "mathit" - }; - } -}; - -/** - * Determines which of the two font names (Main-Bold and Math-BoldItalic) and - * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol", - * depending on the symbol. Use this function instead of fontMap for font - * "boldsymbol". - */ -var boldsymbol = function boldsymbol(value, mode, options, classes) { - if (lookupSymbol(value, "Math-BoldItalic", mode).metrics) { - return { - fontName: "Math-BoldItalic", - fontClass: "boldsymbol" - }; - } else { - // Some glyphs do not exist in Math-BoldItalic so we need to use - // Main-Bold instead. - return { - fontName: "Main-Bold", - fontClass: "mathbf" - }; - } -}; - -/** - * Makes either a mathord or textord in the correct font and color. - */ -var makeOrd = function makeOrd(group, options, type) { - var mode = group.mode; - var value = group.value; - - var classes = ["mord"]; - - var fontFamily = options.fontFamily; - if (fontFamily) { - var _fontName3 = void 0; - var fontClasses = void 0; - if (fontFamily === "boldsymbol") { - var fontData = boldsymbol(value, mode, options, classes); - _fontName3 = fontData.fontName; - fontClasses = [fontData.fontClass]; - } else if (fontFamily === "mathit" || __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].contains(mainitLetters, value)) { - var _fontData = mathit(value, mode, options, classes); - _fontName3 = _fontData.fontName; - fontClasses = [_fontData.fontClass]; - } else if (fontFamily.indexOf("math") !== -1 || mode === "math") { - // To support old font functions (i.e. \rm \sf etc.) or math mode. - _fontName3 = fontMap[fontFamily].fontName; - fontClasses = [fontFamily]; - } else { - _fontName3 = retrieveTextFontName(fontFamily, options.fontWeight, options.fontShape); - fontClasses = [fontFamily, options.fontWeight, options.fontShape]; - } - if (lookupSymbol(value, _fontName3, mode).metrics) { - return makeSymbol(value, _fontName3, mode, options, classes.concat(fontClasses)); - } else { - return mathDefault(value, mode, options, classes, type); - } - } else { - return mathDefault(value, mode, options, classes, type); - } -}; - -/** - * Combine as many characters as possible in the given array of characters - * via their tryCombine method. - */ -var tryCombineChars = function tryCombineChars(chars) { - for (var i = 0; i < chars.length - 1; i++) { - if (chars[i].tryCombine(chars[i + 1])) { - chars.splice(i + 1, 1); - i--; - } - } - return chars; -}; - -/** - * Calculate the height, depth, and maxFontSize of an element based on its - * children. - */ -var sizeElementFromChildren = function sizeElementFromChildren(elem) { - var height = 0; - var depth = 0; - var maxFontSize = 0; - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(elem.children), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var child = _step.value; - - if (child.height > height) { - height = child.height; - } - if (child.depth > depth) { - depth = child.depth; - } - if (child.maxFontSize > maxFontSize) { - maxFontSize = child.maxFontSize; - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - elem.height = height; - elem.depth = depth; - elem.maxFontSize = maxFontSize; -}; - -/** - * Makes a span with the given list of classes, list of children, and options. - * - * TODO(#953): Ensure that `options` is always provided (currently some call - * sites don't pass it) and make the type below mandatory. - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - */ -var makeSpan = function makeSpan(classes, children, options, style) { - var span = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].span(classes, children, options, style); - - sizeElementFromChildren(span); - - return span; -}; - -var makeLineSpan = function makeLineSpan(className, options) { - // Return a span with an SVG image of a horizontal line. The SVG path - // fills the middle fifth of the span. We want an extra tall span - // because Chrome will sometimes not display a span that is 0.04em tall. - var lineHeight = options.fontMetrics().defaultRuleThickness; - var line = __WEBPACK_IMPORTED_MODULE_6__stretchy__["a" /* default */].ruleSpan(className, lineHeight, options); - line.height = lineHeight; - line.style.height = 5 * line.height + "em"; - line.maxFontSize = 1.0; - return line; -}; - -/** - * Makes an anchor with the given href, list of classes, list of children, - * and options. - */ -var makeAnchor = function makeAnchor(href, classes, children, options) { - var anchor = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].anchor(href, classes, children, options); - - sizeElementFromChildren(anchor); - - return anchor; -}; - -/** - * Makes a document fragment with the given list of children. - */ -var makeFragment = function makeFragment(children) { - var fragment = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].documentFragment(children); - - sizeElementFromChildren(fragment); - - return fragment; -}; - -// These are exact object types to catch typos in the names of the optional fields. - - -// A list of child or kern nodes to be stacked on top of each other (i.e. the -// first element will be at the bottom, and the last at the top). - - -// Computes the updated `children` list and the overall depth. -// -// This helper function for makeVList makes it easier to enforce type safety by -// allowing early exits (returns) in the logic. -var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) { - if (params.positionType === "individualShift") { - var oldChildren = params.children; - var _children = [oldChildren[0]]; - - // Add in kerns to the list of params.children to get each element to be - // shifted to the correct specified shift - var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth; - var currPos = _depth; - for (var i = 1; i < oldChildren.length; i++) { - var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth; - var _size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth); - - currPos = currPos + diff; - - _children.push({ type: "kern", size: _size }); - _children.push(oldChildren[i]); - } - - return { children: _children, depth: _depth }; - } - - var depth = void 0; - if (params.positionType === "top") { - // We always start at the bottom, so calculate the bottom by adding up - // all the sizes - var bottom = params.positionData; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(params.children), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var child = _step2.value; - - bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth; - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - depth = bottom; - } else if (params.positionType === "bottom") { - depth = -params.positionData; - } else { - var firstChild = params.children[0]; - if (firstChild.type !== "elem") { - throw new Error('First child must have type "elem".'); - } - if (params.positionType === "shift") { - depth = -firstChild.elem.depth - params.positionData; - } else if (params.positionType === "firstBaseline") { - depth = -firstChild.elem.depth; - } else { - throw new Error("Invalid positionType " + params.positionType + "."); - } - } - return { children: params.children, depth: depth }; -}; - -/** - * Makes a vertical list by stacking elements and kerns on top of each other. - * Allows for many different ways of specifying the positioning method. - * - * See VListParam documentation above. - */ -var makeVList = function makeVList(params, options) { - var _getVListChildrenAndD = getVListChildrenAndDepth(params), - children = _getVListChildrenAndD.children, - depth = _getVListChildrenAndD.depth; - - // Create a strut that is taller than any list item. The strut is added to - // each item, where it will determine the item's baseline. Since it has - // `overflow:hidden`, the strut's top edge will sit on the item's line box's - // top edge and the strut's bottom edge will sit on the item's baseline, - // with no additional line-height spacing. This allows the item baseline to - // be positioned precisely without worrying about font ascent and - // line-height. - - - var pstrutSize = 0; - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; - - try { - for (var _iterator3 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(children), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var child = _step3.value; - - if (child.type === "elem") { - var _elem = child.elem; - pstrutSize = Math.max(pstrutSize, _elem.maxFontSize, _elem.height); - } - } - } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; - } finally { - try { - if (!_iteratorNormalCompletion3 && _iterator3.return) { - _iterator3.return(); - } - } finally { - if (_didIteratorError3) { - throw _iteratorError3; - } - } - } - - pstrutSize += 2; - var pstrut = makeSpan(["pstrut"], []); - pstrut.style.height = pstrutSize + "em"; - - // Create a new list of actual children at the correct offsets - var realChildren = []; - var minPos = depth; - var maxPos = depth; - var currPos = depth; - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; - - try { - for (var _iterator4 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(children), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var _child = _step4.value; - - if (_child.type === "kern") { - currPos += _child.size; - } else { - var _elem2 = _child.elem; - var classes = _child.wrapperClasses || []; - var style = _child.wrapperStyle || {}; - - var childWrap = makeSpan(classes, [pstrut, _elem2], undefined, style); - childWrap.style.top = -pstrutSize - currPos - _elem2.depth + "em"; - if (_child.marginLeft) { - childWrap.style.marginLeft = _child.marginLeft; - } - if (_child.marginRight) { - childWrap.style.marginRight = _child.marginRight; - } - - realChildren.push(childWrap); - currPos += _elem2.height + _elem2.depth; - } - minPos = Math.min(minPos, currPos); - maxPos = Math.max(maxPos, currPos); - } - - // The vlist contents go in a table-cell with `vertical-align:bottom`. - // This cell's bottom edge will determine the containing table's baseline - // without overly expanding the containing line-box. - } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; - } finally { - try { - if (!_iteratorNormalCompletion4 && _iterator4.return) { - _iterator4.return(); - } - } finally { - if (_didIteratorError4) { - throw _iteratorError4; - } - } - } - - var vlist = makeSpan(["vlist"], realChildren); - vlist.style.height = maxPos + "em"; - - // A second row is used if necessary to represent the vlist's depth. - var rows = void 0; - if (minPos < 0) { - var depthStrut = makeSpan(["vlist"], []); - depthStrut.style.height = -minPos + "em"; - - // Safari wants the first row to have inline content; otherwise it - // puts the bottom of the *second* row on the baseline. - var topStrut = makeSpan(["vlist-s"], [new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode("\u200B")]); - - rows = [makeSpan(["vlist-r"], [vlist, topStrut]), makeSpan(["vlist-r"], [depthStrut])]; - } else { - rows = [makeSpan(["vlist-r"], [vlist])]; - } - - var vtable = makeSpan(["vlist-t"], rows); - if (rows.length === 2) { - vtable.classes.push("vlist-t2"); - } - vtable.height = maxPos; - vtable.depth = -minPos; - return vtable; -}; - -// Converts verb group into body string, dealing with \verb* form -var makeVerb = function makeVerb(group, options) { - // TODO(#892): Make ParseNode type-safe and confirm `group.type` to guarantee - // that `group.value.body` is of type string. - var text = group.value.body; - if (group.value.star) { - text = text.replace(/ /g, "\u2423"); // Open Box - } else { - text = text.replace(/ /g, '\xA0'); // No-Break Space - // (so that, in particular, spaces don't coalesce) - } - return text; -}; - -// Glue is a concept from TeX which is a flexible space between elements in -// either a vertical or horizontal list. In KaTeX, at least for now, it's -// static space between elements in a horizontal layout. -var makeGlue = function makeGlue(measurement, options) { - // Make an empty span for the rule - var rule = makeSpan(["mord", "rule"], [], options); - var size = Object(__WEBPACK_IMPORTED_MODULE_7__units__["a" /* calculateSize */])(measurement, options); - rule.style.marginRight = size + "em"; - return rule; -}; - -// Takes an Options object, and returns the appropriate fontLookup -var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) { - var baseFontName = retrieveBaseFontName(fontFamily); - var fontStylesName = retrieveFontStylesName(fontWeight, fontShape); - return baseFontName + "-" + fontStylesName; -}; - -var retrieveBaseFontName = function retrieveBaseFontName(font) { - var baseFontName = ""; - switch (font) { - case "amsrm": - baseFontName = "AMS"; - break; - case "textrm": - baseFontName = "Main"; - break; - case "textsf": - baseFontName = "SansSerif"; - break; - case "texttt": - baseFontName = "Typewriter"; - break; - default: - throw new Error("Invalid font provided: " + font); - } - return baseFontName; -}; - -var retrieveFontStylesName = function retrieveFontStylesName(fontWeight, fontShape) { - var fontStylesName = ''; - if (fontWeight === "textbf") { - fontStylesName += "Bold"; - } - if (fontShape === "textit") { - fontStylesName += "Italic"; - } - return fontStylesName || "Regular"; -}; - -// A map of spacing functions to their attributes, like size and corresponding -// CSS class -var spacingFunctions = { - "\\qquad": { - size: "2em", - className: "qquad" - }, - "\\quad": { - size: "1em", - className: "quad" - }, - "\\enspace": { - size: "0.5em", - className: "enspace" - }, - "\\;": { - size: "0.277778em", - className: "thickspace" - }, - "\\:": { - size: "0.22222em", - className: "mediumspace" - }, - "\\,": { - size: "0.16667em", - className: "thinspace" - }, - "\\!": { - size: "-0.16667em", - className: "negativethinspace" - } -}; - -/** - * Maps TeX font commands to objects containing: - * - variant: string used for "mathvariant" attribute in buildMathML.js - * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics - */ -// A map between tex font commands an MathML mathvariant attribute values -var fontMap = { - // styles - "mathbf": { - variant: "bold", - fontName: "Main-Bold" - }, - "mathrm": { - variant: "normal", - fontName: "Main-Regular" - }, - "textit": { - variant: "italic", - fontName: "Main-Italic" - }, - - // "mathit" and "boldsymbol" are missing because they require the use of two - // fonts: Main-Italic and Math-Italic for "mathit", and Math-BoldItalic and - // Main-Bold for "boldsymbol". This is handled by a special case in makeOrd - // which ends up calling mathit and boldsymbol. - - // families - "mathbb": { - variant: "double-struck", - fontName: "AMS-Regular" - }, - "mathcal": { - variant: "script", - fontName: "Caligraphic-Regular" - }, - "mathfrak": { - variant: "fraktur", - fontName: "Fraktur-Regular" - }, - "mathscr": { - variant: "script", - fontName: "Script-Regular" - }, - "mathsf": { - variant: "sans-serif", - fontName: "SansSerif-Regular" - }, - "mathtt": { - variant: "monospace", - fontName: "Typewriter-Regular" - } -}; - -var svgData = { - // path, width, height - vec: ["vec", 0.471, 0.714] // values from the font glyph -}; - -var staticSvg = function staticSvg(value, options) { - // Create a span with inline SVG for the element. - var _svgData$value = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray___default()(svgData[value], 3), - pathName = _svgData$value[0], - width = _svgData$value[1], - height = _svgData$value[2]; - - var path = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].pathNode(pathName); - var svgNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].svgNode([path], { - "width": width + "em", - "height": height + "em", - // Override CSS rule `.katex svg { width: 100% }` - "style": "width:" + width + "em", - "viewBox": "0 0 " + 1000 * width + " " + 1000 * height, - "preserveAspectRatio": "xMinYMin" - }); - var span = makeSpan(["overlay"], [svgNode], options); - span.height = height; - span.style.height = height + "em"; - span.style.width = width + "em"; - return span; -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - fontMap: fontMap, - makeSymbol: makeSymbol, - mathsym: mathsym, - makeSpan: makeSpan, - makeLineSpan: makeLineSpan, - makeAnchor: makeAnchor, - makeFragment: makeFragment, - makeVList: makeVList, - makeOrd: makeOrd, - makeVerb: makeVerb, - makeGlue: makeGlue, - staticSvg: staticSvg, - svgData: svgData, - tryCombineChars: tryCombineChars, - spacingFunctions: spacingFunctions -}); +// extracted by mini-css-extract-plugin /***/ }), /* 1 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); - - +__webpack_require__.r(__webpack_exports__); +// EXTERNAL MODULE: ./src/katex.less +var katex = __webpack_require__(0); +// CONCATENATED MODULE: ./src/SourceLocation.js /** - * These objects store data about MathML nodes. This is the MathML equivalent - * of the types in domTree.js. Since MathML handles its own rendering, and - * since we're mainly using MathML to improve accessibility, we don't manage - * any of the styling state that the plain DOM nodes do. - * - * The `toNode` and `toMarkup` functions work simlarly to how they do in - * domTree.js, creating namespaced DOM nodes and HTML text markup respectively. + * Lexing or parsing positional information for error reporting. + * This object is immutable. */ - - - -/** - * MathML node types used in KaTeX. For a complete list of MathML nodes, see - * https://developer.mozilla.org/en-US/docs/Web/MathML/Element. - */ - -/** - * This node represents a general purpose MathML node of any type. The - * constructor requires the type of node to create (for example, `"mo"` or - * `"mspace"`, corresponding to `<mo>` and `<mspace>` tags). - */ -var MathNode = function () { - function MathNode(type, children) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, MathNode); - - this.type = type; - this.attributes = {}; - this.children = children || []; - } - - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - - - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(MathNode, [{ - key: "setAttribute", - value: function setAttribute(name, value) { - this.attributes[name] = value; - } - - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - - }, { - key: "toNode", - value: function toNode() { - var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.children), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var child = _step.value; - - node.appendChild(child.toNode()); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return node; - } - - /** - * Converts the math node into an HTML markup string. - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = "<" + this.type; - - // Add the attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "=\""; - markup += __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].escape(this.attributes[attr]); - markup += "\""; - } - } - - markup += ">"; - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += "</" + this.type + ">"; - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText. - */ - - }, { - key: "toText", - value: function toText() { - if (this.type === "mspace") { - if (this.attributes.width === "0.16667em") { - return "\u2006"; - } else { - // TODO: Use other space characters for different widths. - // https://github.com/Khan/KaTeX/issues/1036 - return " "; - } - } - return this.children.map(function (child) { - return child.toText(); - }).join(""); - } - }]); - - return MathNode; -}(); - -/** - * This node represents a piece of text. - */ - - -var TextNode = function () { - function TextNode(text) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, TextNode); - - this.text = text; - } - - /** - * Converts the text node into a DOM text node. - */ - - - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(TextNode, [{ - key: "toNode", - value: function toNode() { - return document.createTextNode(this.text); - } - - /** - * Converts the text node into HTML markup (which is just the text itself). - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - return __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].escape(this.text); - } - - /** - * Converts the text node into a string (which is just the text iteself). - */ - - }, { - key: "toText", - value: function toText() { - return this.text; - } - }]); - - return TextNode; -}(); - -/* harmony default export */ __webpack_exports__["a"] = ({ - MathNode: MathNode, - TextNode: TextNode -}); - -/***/ }), -/* 2 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return makeText; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return groupTypes; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return buildExpression; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return buildGroup; }); -/* harmony export (immutable) */ __webpack_exports__["c"] = buildMathML; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__fontMetrics__ = __webpack_require__(30); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__stretchy__ = __webpack_require__(13); -/** - * WARNING: New methods on groupTypes should be added to src/functions. - * - * This file converts a parse tree into a cooresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - - - - - - - - - - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -var makeText = function makeText(text, mode) { - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][text] && __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][text].replace) { - text = __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][text].replace; - } - - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode(text); -}; - -/** - * Returns the math variant as a string or null if none is required. - */ -var getVariant = function getVariant(group, options) { - var font = options.fontFamily; - if (!font) { - return null; - } - - var mode = group.mode; - if (font === "mathit") { - return "italic"; - } else if (font === "boldsymbol") { - return "bold-italic"; - } - - var value = group.value; - if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(["\\imath", "\\jmath"], value)) { - return null; - } - - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][value] && __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][value].replace) { - value = __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][value].replace; - } - - var fontName = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].fontMap[font].fontName; - if (__WEBPACK_IMPORTED_MODULE_1__fontMetrics__["a" /* default */].getCharacterMetrics(value, fontName, mode)) { - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].fontMap[font].variant; - } - - return null; -}; - -/** - * Functions for handling the different types of groups found in the parse - * tree. Each function should take a parse group and return a MathML node. - */ -var groupTypes = {}; - -var defaultVariant = { - "mi": "italic", - "mn": "normal", - "mtext": "normal" -}; - -groupTypes.mathord = function (group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mi", [makeText(group.value, group.mode)]); - - var variant = getVariant(group, options) || "italic"; - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - return node; -}; - -groupTypes.textord = function (group, options) { - var text = makeText(group.value, group.mode); - - var variant = getVariant(group, options) || "normal"; - - var node = void 0; - if (group.mode === 'text') { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtext", [text]); - } else if (/[0-9]/.test(group.value)) { - // TODO(kevinb) merge adjacent <mn> nodes - // do it as a post processing step - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mn", [text]); - } else if (group.value === "\\prime") { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [text]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mi", [text]); - } - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - - return node; -}; - -groupTypes.bin = function (group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - var variant = getVariant(group, options); - if (variant === "bold-italic") { - node.setAttribute("mathvariant", variant); - } - - return node; -}; - -groupTypes.rel = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.open = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.close = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.inner = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.punct = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - node.setAttribute("separator", "true"); - - return node; -}; - -groupTypes.ordgroup = function (group, options) { - var inner = buildExpression(group.value, options); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", inner); - - return node; -}; - -groupTypes.supsub = function (group, options) { - // Is the inner group a relevant horizonal brace? - var isBrace = false; - var isOver = void 0; - var isSup = void 0; - if (group.value.base) { - if (group.value.base.value.type === "horizBrace") { - isSup = group.value.sup ? true : false; - if (isSup === group.value.base.value.isOver) { - isBrace = true; - isOver = group.value.base.value.isOver; - } - } - } - - var removeUnnecessaryRow = true; - var children = [buildGroup(group.value.base, options, removeUnnecessaryRow)]; - - if (group.value.sub) { - children.push(buildGroup(group.value.sub, options, removeUnnecessaryRow)); - } - - if (group.value.sup) { - children.push(buildGroup(group.value.sup, options, removeUnnecessaryRow)); - } - - var nodeType = void 0; - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.value.sub) { - var base = group.value.base; - if (base && base.value.limits && options.style === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.value.sup) { - var _base = group.value.base; - if (_base && _base.value.limits && options.style === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - var _base2 = group.value.base; - if (_base2 && _base2.value.limits && options.style === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode(nodeType, children); - - return node; -}; - -groupTypes.spacing = function (group) { - var node = void 0; - - if (group.value === "\\ " || group.value === "\\space" || group.value === " " || group.value === "~") { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtext", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode("\xA0")]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mspace"); - - node.setAttribute("width", __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].spacingFunctions[group.value].size); - } - - return node; -}; - -groupTypes.horizBrace = function (group, options) { - var accentNode = __WEBPACK_IMPORTED_MODULE_7__stretchy__["a" /* default */].mathMLnode(group.value.label); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode(group.value.isOver ? "mover" : "munder", [buildGroup(group.value.base, options), accentNode]); -}; - -groupTypes.xArrow = function (group, options) { - var arrowNode = __WEBPACK_IMPORTED_MODULE_7__stretchy__["a" /* default */].mathMLnode(group.value.label); - var node = void 0; - var lowerNode = void 0; - - if (group.value.body) { - var upperNode = buildGroup(group.value.body, options); - if (group.value.below) { - lowerNode = buildGroup(group.value.below, options); - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [arrowNode, upperNode]); - } - } else if (group.value.below) { - lowerNode = buildGroup(group.value.below, options); - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munder", [arrowNode, lowerNode]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [arrowNode]); - } - return node; -}; - -groupTypes.mclass = function (group, options) { - var inner = buildExpression(group.value.value, options); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mstyle", inner); -}; - -groupTypes.raisebox = function (group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mpadded", [buildGroup(group.value.body, options)]); - var dy = group.value.dy.value.number + group.value.dy.value.unit; - node.setAttribute("voffset", dy); - return node; -}; - -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. A little simpler than the HTML version because we don't do any - * previous-node handling. - */ -var buildExpression = function buildExpression(expression, options) { - var groups = []; - for (var i = 0; i < expression.length; i++) { - var group = expression[i]; - groups.push(buildGroup(group, options)); - } - - // TODO(kevinb): combine \\not with mrels and mords - - return groups; -}; - -/** - * Takes a group from the parser and calls the appropriate groupTypes function - * on it to produce a MathML node. - */ -var buildGroup = function buildGroup(group, options) { - var removeUnnecessaryRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - if (!group) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow"); - } - - if (groupTypes[group.type]) { - // Call the groupTypes function - var result = groupTypes[group.type](group, options); - if (removeUnnecessaryRow) { - if (result.type === "mrow" && result.children.length === 1) { - return result.children[0]; - } - } - return result; - } else { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Got group of unknown type: '" + group.type + "'"); - } -}; - -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. In particular, we put the elements from building the parse tree into a - * <semantics> tag so we can also include that TeX source as an annotation. - * - * Note that we actually return a domTree element with a `<math>` inside it so - * we can do appropriate styling. - */ -function buildMathML(tree, texExpression, options) { - var expression = buildExpression(tree, options); - - // Wrap up the expression in an mrow so it is presented in the semantics - // tag correctly. - var wrapper = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", expression); - - // Build a TeX annotation of the source - var annotation = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("annotation", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode(texExpression)]); - - annotation.setAttribute("encoding", "application/x-tex"); - - var semantics = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("semantics", [wrapper, annotation]); - - var math = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("math", [semantics]); - - // You can't style <math> nodes, so we wrap the node in a span. - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["katex-mathml"], [math]); -} - -/***/ }), -/* 3 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _functions; }); -/* harmony export (immutable) */ __webpack_exports__["b"] = defineFunction; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return ordargument; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildMathML__ = __webpack_require__(2); - - - -/** Context provided to function handlers for error messages. */ - - -// TODO: Enumerate all allowed output types. - - -/** - * Final function spec for use at parse time. - * This is almost identical to `FunctionPropSpec`, except it - * 1. includes the function handler, and - * 2. requires all arguments except argTypes. - * It is generated by `defineFunction()` below. - */ - - -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -var _functions = {}; - -function defineFunction(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; - - // Set default values of functions - var data = { - numArgs: props.numArgs, - argTypes: props.argTypes, - greediness: props.greediness === undefined ? 1 : props.greediness, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - handler: handler - }; - for (var i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - if (type) { - if (htmlBuilder) { - __WEBPACK_IMPORTED_MODULE_0__buildHTML__["d" /* groupTypes */][type] = htmlBuilder; - } - if (mathmlBuilder) { - __WEBPACK_IMPORTED_MODULE_1__buildMathML__["d" /* groupTypes */][type] = mathmlBuilder; - } - } -} - -// Since the corresponding buildHTML/buildMathML function expects a -// list of elements, we normalize for different kinds of arguments -var ordargument = function ordargument(arg) { - if (arg.type === "ordgroup") { - return arg.value; - } else { - return [arg]; - } -}; - -/***/ }), -/* 4 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return buildExpression; }); -/* unused harmony export getTypeOfDomTree */ -/* unused harmony export isLeftTight */ -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return makeNullDelimiter; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return groupTypes; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return buildGroup; }); -/* harmony export (immutable) */ __webpack_exports__["c"] = buildHTML; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(77); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(35); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__spacingData__ = __webpack_require__(112); - - -/** - * WARNING: New methods on groupTypes should be added to src/functions. - * - * This file does the main work of building a domTree structure from a parse - * tree. The entry point is the `buildHTML` function, which takes a parse tree. - * Then, the buildExpression, buildGroup, and various groupTypes functions are - * called, to produce a final HTML tree. - */ - - - - - - - - - - - -var makeSpan = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeSpan; - -// Binary atoms (first class `mbin`) change into ordinary atoms (`mord`) -// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6, -// and the text before Rule 19. -var isBinLeftCanceller = function isBinLeftCanceller(node, isRealGroup) { - // TODO: This code assumes that a node's math class is the first element - // of its `classes` array. A later cleanup should ensure this, for - // instance by changing the signature of `makeSpan`. - if (node) { - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(["mbin", "mopen", "mrel", "mop", "mpunct"], getTypeOfDomTree(node, "right")); - } else { - return isRealGroup; - } -}; - -var isBinRightCanceller = function isBinRightCanceller(node, isRealGroup) { - if (node) { - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(["mrel", "mclose", "mpunct"], getTypeOfDomTree(node, "left")); - } else { - return isRealGroup; - } -}; - -var styleMap = { - "display": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY, - "text": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].TEXT, - "script": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPT, - "scriptscript": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPTSCRIPT -}; - -/** - * Take a list of nodes, build them in order, and return a list of the built - * nodes. documentFragments are flattened into their contents, so the - * returned list contains no fragments. `isRealGroup` is true if `expression` - * is a real group (no atoms will be added on either side), as opposed to - * a partial group (e.g. one created by \color). `surrounding` is an array - * consisting type of nodes that will be added to the left and right. - */ -var buildExpression = function buildExpression(expression, options, isRealGroup) { - var surrounding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [null, null]; - - // Parse expressions into `groups`. - var rawGroups = []; - for (var i = 0; i < expression.length; i++) { - var group = expression[i]; - var output = buildGroup(group, options); - if (output instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].documentFragment) { - rawGroups.push.apply(rawGroups, __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray___default()(output.children)); - } else { - rawGroups.push(output); - } - } - // At this point `rawGroups` consists entirely of `symbolNode`s and `span`s. - - // Ignore explicit spaces (e.g., \;, \,) when determining what implicit - // spacing should go between atoms of different classes, and add dummy - // spans for determining spacings between surrounding atoms - var nonSpaces = [surrounding[0] && makeSpan([surrounding[0]], [], options)].concat(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray___default()(rawGroups.filter(function (group) { - return group && group.classes[0] !== "mspace"; - })), [surrounding[1] && makeSpan([surrounding[1]], [], options)]); - - // Before determining what spaces to insert, perform bin cancellation. - // Binary operators change to ordinary symbols in some contexts. - for (var _i = 1; _i < nonSpaces.length - 1; _i++) { - var left = getOutermostNode(nonSpaces[_i], "left"); - if (left.classes[0] === "mbin" && isBinLeftCanceller(nonSpaces[_i - 1], isRealGroup)) { - left.classes[0] = "mord"; - } - - var right = getOutermostNode(nonSpaces[_i], "right"); - if (right.classes[0] === "mbin" && isBinRightCanceller(nonSpaces[_i + 1], isRealGroup)) { - right.classes[0] = "mord"; - } - } - - var groups = []; - var j = 0; - for (var _i2 = 0; _i2 < rawGroups.length; _i2++) { - groups.push(rawGroups[_i2]); - - // For any group that is not a space, get the next non-space. Then - // lookup what implicit space should be placed between those atoms and - // add it to groups. - if (rawGroups[_i2].classes[0] !== "mspace" && j < nonSpaces.length - 1) { - // if current non-space node is left dummy span, add a glue before - // first real non-space node - if (j === 0) { - groups.pop(); - _i2--; - } - - // Get the type of the current non-space node. If it's a document - // fragment, get the type of the rightmost node in the fragment. - var _left = getTypeOfDomTree(nonSpaces[j], "right"); - - // Get the type of the next non-space node. If it's a document - // fragment, get the type of the leftmost node in the fragment. - var _right = getTypeOfDomTree(nonSpaces[j + 1], "left"); - - // We use buildExpression inside of sizingGroup, but it returns a - // document fragment of elements. sizingGroup sets `isRealGroup` - // to false to avoid processing spans multiple times. - if (_left && _right && isRealGroup) { - var space = isLeftTight(nonSpaces[j + 1]) ? __WEBPACK_IMPORTED_MODULE_9__spacingData__["b" /* tightSpacings */][_left][_right] : __WEBPACK_IMPORTED_MODULE_9__spacingData__["a" /* spacings */][_left][_right]; - - if (space) { - var glueOptions = options; - - if (expression.length === 1) { - if (expression[0].type === "sizing") { - glueOptions = options.havingSize(expression[0].value.size); - } else if (expression[0].type === "styling") { - glueOptions = options.havingStyle(styleMap[expression[0].value.style]); - } - } - - groups.push(__WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeGlue(space, glueOptions)); - } - } - j++; - } - } - - // Process \\not commands within the group. - for (var _i3 = 0; _i3 < groups.length; _i3++) { - if (groups[_i3].value === "\u0338") { - groups[_i3].style.position = "absolute"; - // TODO(kevinb) fix this for Safari by switching to a non-combining - // character for \not. - // This value was determined empirically. - // TODO(kevinb) figure out the real math for this value. - groups[_i3].style.paddingLeft = "0.8em"; - } - } - - return groups; -}; - -// Return the outermost node of a domTree. -var getOutermostNode = function getOutermostNode(node) { - var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "right"; - - if (node instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].documentFragment || node instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].anchor) { - if (node.children.length) { - if (side === "right") { - return getOutermostNode(node.children[node.children.length - 1]); - } else if (side === "left") { - return getOutermostNode(node.children[0]); - } - } - } - return node; -}; - -// Return math atom class (mclass) of a domTree. -var getTypeOfDomTree = function getTypeOfDomTree(node) { - var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "right"; - - if (!node) { - return null; - } - - node = getOutermostNode(node, side); - // This makes a lot of assumptions as to where the type of atom - // appears. We should do a better job of enforcing this. - if (__WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(["mord", "mop", "mbin", "mrel", "mopen", "mclose", "mpunct", "minner"], node.classes[0])) { - return node.classes[0]; - } - return null; -}; - -// If `node` is an atom return whether it's been assigned the mtight class. -// If `node` is a document fragment, return the value of isLeftTight() for the -// leftmost node in the fragment. -// 'mtight' indicates that the node is script or scriptscript style. -var isLeftTight = function isLeftTight(node) { - node = getOutermostNode(node, "left"); - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(node.classes, "mtight"); -}; - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ -var shouldHandleSupSub = function shouldHandleSupSub(group, options) { - if (!group.value.base) { - return false; - } else { - var base = group.value.base; - if (base.type === "op") { - // Operators handle supsubs differently when they have limits - // (e.g. `\displaystyle\sum_2^3`) - return base.value.limits && (options.style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY.size || base.value.alwaysHandleSupSub); - } else if (base.type === "accent") { - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].isCharacterBox(base.value.base); - } else if (base.type === "horizBrace") { - var isSup = group.value.sub ? false : true; - return isSup === base.value.isOver; - } else { - return null; - } - } -}; - -var makeNullDelimiter = function makeNullDelimiter(options, classes) { - var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses()); - return makeSpan(classes.concat(moreClasses)); -}; - -/** - * This is a map of group types to the function used to handle that type. - * Simpler types come at the beginning, while complicated types come afterwards. - */ -var groupTypes = {}; - -groupTypes.mathord = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeOrd(group, options, "mathord"); -}; - -groupTypes.textord = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeOrd(group, options, "textord"); -}; - -groupTypes.bin = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mbin"]); -}; - -groupTypes.rel = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mrel"]); -}; - -groupTypes.open = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mopen"]); -}; - -groupTypes.close = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mclose"]); -}; - -groupTypes.inner = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["minner"]); -}; - -groupTypes.punct = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mpunct"]); -}; - -groupTypes.ordgroup = function (group, options) { - return makeSpan(["mord"], buildExpression(group.value, options, true), options); -}; - -groupTypes.supsub = function (group, options) { - // Superscript and subscripts are handled in the TeXbook on page - // 445-446, rules 18(a-f). - - // Here is where we defer to the inner group if it should handle - // superscripts and subscripts itself. - if (shouldHandleSupSub(group, options)) { - return groupTypes[group.value.base.type](group, options); - } - - var base = buildGroup(group.value.base, options); - var supm = void 0; - var subm = void 0; - - var metrics = options.fontMetrics(); - var newOptions = void 0; - - // Rule 18a - var supShift = 0; - var subShift = 0; - - if (group.value.sup) { - newOptions = options.havingStyle(options.style.sup()); - supm = buildGroup(group.value.sup, newOptions, options); - if (!__WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].isCharacterBox(group.value.base)) { - supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - if (group.value.sub) { - newOptions = options.havingStyle(options.style.sub()); - subm = buildGroup(group.value.sub, newOptions, options); - if (!__WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].isCharacterBox(group.value.base)) { - subShift = base.depth + newOptions.fontMetrics().subDrop * newOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - // Rule 18c - var minSupShift = void 0; - if (options.style === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY) { - minSupShift = metrics.sup1; - } else if (options.style.cramped) { - minSupShift = metrics.sup3; - } else { - minSupShift = metrics.sup2; - } - - // scriptspace is a font-size-independent size, so scale it - // appropriately - var multiplier = options.sizeMultiplier; - var scriptspace = 0.5 / metrics.ptPerEm / multiplier + "em"; - - var supsub = void 0; - if (!group.value.sup) { - // Rule 18b - subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight); - - var vlistElem = [{ type: "elem", elem: subm, marginRight: scriptspace }]; - // Subscripts shouldn't be shifted by the base's italic correction. - // Account for that by shifting the subscript back the appropriate - // amount. Note we only do this when the base is a single symbol. - if (base instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].symbolNode) { - vlistElem[0].marginLeft = -base.italic + "em"; - } - - supsub = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: subShift, - children: vlistElem - }, options); - } else if (!group.value.sub) { - // Rule 18c, d - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - - supsub = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: -supShift, - children: [{ type: "elem", elem: supm, marginRight: scriptspace }] - }, options); - } else { - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - subShift = Math.max(subShift, metrics.sub2); - - var ruleWidth = metrics.defaultRuleThickness; - - // Rule 18e - if (supShift - supm.depth - (subm.height - subShift) < 4 * ruleWidth) { - subShift = 4 * ruleWidth - (supShift - supm.depth) + subm.height; - var psi = 0.8 * metrics.xHeight - (supShift - supm.depth); - if (psi > 0) { - supShift += psi; - subShift -= psi; - } - } - - var _vlistElem = [{ type: "elem", elem: subm, shift: subShift, marginRight: scriptspace }, { type: "elem", elem: supm, shift: -supShift, marginRight: scriptspace }]; - // See comment above about subscripts not being shifted - if (base instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].symbolNode) { - _vlistElem[0].marginLeft = -base.italic + "em"; - } - - supsub = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: _vlistElem - }, options); - } - - // We ensure to wrap the supsub vlist in a span.msupsub to reset text-align - var mclass = getTypeOfDomTree(base) || "mord"; - return makeSpan([mclass], [base, makeSpan(["msupsub"], [supsub])], options); -}; - -groupTypes.spacing = function (group, options) { - if (group.value === "\\ " || group.value === "\\space" || group.value === " " || group.value === "~") { - // Spaces are generated by adding an actual space. Each of these - // things has an entry in the symbols table, so these will be turned - // into appropriate outputs. - if (group.mode === "text") { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeOrd(group, options, "textord"); - } else { - return makeSpan(["mspace"], [__WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options)], options); - } - } else { - // Other kinds of spaces are of arbitrary width. We use CSS to - // generate these. - return makeSpan(["mspace", __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].spacingFunctions[group.value].className], [], options); - } -}; - -groupTypes.horizBrace = function (group, options) { - var style = options.style; - - var hasSupSub = group.type === "supsub"; - var supSubGroup = void 0; - var newOptions = void 0; - if (hasSupSub) { - // Ref: LaTeX source2e: }}}}\limits} - // i.e. LaTeX treats the brace similar to an op and passes it - // with \limits, so we need to assign supsub style. - if (group.value.sup) { - newOptions = options.havingStyle(style.sup()); - supSubGroup = buildGroup(group.value.sup, newOptions, options); - } else { - newOptions = options.havingStyle(style.sub()); - supSubGroup = buildGroup(group.value.sub, newOptions, options); - } - group = group.value.base; - } - - // Build the base group - var body = buildGroup(group.value.base, options.havingBaseStyle(__WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY)); - - // Create the stretchy element - var braceBody = __WEBPACK_IMPORTED_MODULE_8__stretchy__["a" /* default */].svgSpan(group, options); - - // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓ - // This first vlist contains the subject matter and the brace: equation - var vlist = void 0; - if (group.value.isOver) { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: body }, { type: "kern", size: 0.1 }, { type: "elem", elem: braceBody }] - }, options); - vlist.children[0].children[0].children[1].classes.push("svg-align"); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: body.depth + 0.1 + braceBody.height, - children: [{ type: "elem", elem: braceBody }, { type: "kern", size: 0.1 }, { type: "elem", elem: body }] - }, options); - vlist.children[0].children[0].children[0].classes.push("svg-align"); - } - - if (hasSupSub) { - // In order to write the supsub, wrap the first vlist in another vlist: - // They can't all go in the same vlist, because the note might be wider - // than the equation. We want the equation to control the brace width. - - // note long note long note - // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓ - // equation eqn eqn - - var vSpan = makeSpan(["mord", group.value.isOver ? "mover" : "munder"], [vlist], options); - - if (group.value.isOver) { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: vSpan }, { type: "kern", size: 0.2 }, { type: "elem", elem: supSubGroup }] - }, options); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: vSpan.depth + 0.2 + supSubGroup.height, - children: [{ type: "elem", elem: supSubGroup }, { type: "kern", size: 0.2 }, { type: "elem", elem: vSpan }] - }, options); - } - } - - return makeSpan(["mord", group.value.isOver ? "mover" : "munder"], [vlist], options); -}; - -groupTypes.xArrow = function (group, options) { - var style = options.style; - - // Build the argument groups in the appropriate style. - // Ref: amsmath.dtx: \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}% - - var newOptions = options.havingStyle(style.sup()); - var upperGroup = buildGroup(group.value.body, newOptions, options); - upperGroup.classes.push("x-arrow-pad"); - - var lowerGroup = void 0; - if (group.value.below) { - // Build the lower group - newOptions = options.havingStyle(style.sub()); - lowerGroup = buildGroup(group.value.below, newOptions, options); - lowerGroup.classes.push("x-arrow-pad"); - } - - var arrowBody = __WEBPACK_IMPORTED_MODULE_8__stretchy__["a" /* default */].svgSpan(group, options); - - // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0. - // The point we want on the math axis is at 0.5 * arrowBody.height. - var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; - // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi - var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; - if (group.value.label === "\\xleftequilibrium") { - upperShift -= upperGroup.depth; - } - - // Generate the vlist - var vlist = void 0; - if (group.value.below) { - var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111; - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: upperGroup, shift: upperShift }, { type: "elem", elem: arrowBody, shift: arrowShift }, { type: "elem", elem: lowerGroup, shift: lowerShift }] - }, options); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: upperGroup, shift: upperShift }, { type: "elem", elem: arrowBody, shift: arrowShift }] - }, options); - } - - vlist.children[0].children[0].children[1].classes.push("svg-align"); - - return makeSpan(["mrel", "x-arrow"], [vlist], options); -}; - -groupTypes.mclass = function (group, options) { - var elements = buildExpression(group.value.value, options, true); - - return makeSpan([group.value.mclass], elements, options); -}; - -groupTypes.raisebox = function (group, options) { - var body = groupTypes.sizing({ value: { - value: [{ - type: "text", - value: { - body: group.value.value, - font: "mathrm" // simulate \textrm - } - }], - size: 6 // simulate \normalsize - } }, options); - var dy = Object(__WEBPACK_IMPORTED_MODULE_6__units__["a" /* calculateSize */])(group.value.dy.value, options); - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: -dy, - children: [{ type: "elem", elem: body }] - }, options); -}; - -/** - * buildGroup is the function that takes a group and calls the correct groupType - * function for it. It also handles the interaction of size and style changes - * between parents and children. - */ -var buildGroup = function buildGroup(group, options, baseOptions) { - if (!group) { - return makeSpan(); - } - - if (groupTypes[group.type]) { - // Call the groupTypes function - var groupNode = groupTypes[group.type](group, options); - - // If the size changed between the parent and the current group, account - // for that size difference. - if (baseOptions && options.size !== baseOptions.size) { - groupNode = makeSpan(options.sizingClasses(baseOptions), [groupNode], options); - - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; - - groupNode.height *= multiplier; - groupNode.depth *= multiplier; - } - - return groupNode; - } else { - throw new __WEBPACK_IMPORTED_MODULE_2__ParseError__["a" /* default */]("Got group of unknown type: '" + group.type + "'"); - } -}; - -/** - * Take an entire parse tree, and build it into an appropriate set of HTML - * nodes. - */ -function buildHTML(tree, options) { - // buildExpression is destructive, so we need to make a clone - // of the incoming tree so that it isn't accidentally changed - tree = JSON.parse(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(tree)); - - // Build the expression contained in the tree - var expression = buildExpression(tree, options, true); - var body = makeSpan(["base"], expression, options); - - // Add struts, which ensure that the top of the HTML element falls at the - // height of the expression, and the bottom of the HTML element falls at the - // depth of the expression. - var topStrut = makeSpan(["strut"]); - var bottomStrut = makeSpan(["strut", "bottom"]); - - topStrut.style.height = body.height + "em"; - bottomStrut.style.height = body.height + body.depth + "em"; - // We'd like to use `vertical-align: top` but in IE 9 this lowers the - // baseline of the box to the bottom of this strut (instead staying in the - // normal place) so we use an absolute value for vertical-align instead - bottomStrut.style.verticalAlign = -body.depth + "em"; - - // Wrap the struts and body together - var htmlNode = makeSpan(["katex-html"], [topStrut, bottomStrut, body]); - - htmlNode.setAttribute("aria-hidden", "true"); - - return htmlNode; -} - -/***/ }), -/* 5 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; - -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Provide an `indexOf` function which works in IE8, but defers to native if - * possible. - */ -var nativeIndexOf = Array.prototype.indexOf; -var indexOf = function indexOf(list, elem) { - if (list == null) { - return -1; - } - if (nativeIndexOf && list.indexOf === nativeIndexOf) { - return list.indexOf(elem); - } - var l = list.length; - for (var i = 0; i < l; i++) { - if (list[i] === elem) { - return i; - } - } - return -1; -}; - -/** - * Return whether an element is contained in a list - */ -var contains = function contains(list, elem) { - return indexOf(list, elem) !== -1; -}; - -/** - * Provide a default value if a setting is undefined - * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022. - */ -var deflt = function deflt(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; - -// hyphenate and escape adapted from Facebook's React under Apache 2 license - -var uppercase = /([A-Z])/g; -var hyphenate = function hyphenate(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -var ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - "\"": """, - "'": "'" -}; - -var ESCAPE_REGEX = /[&><"']/g; - -/** - * Escapes text to prevent scripting attacks. - */ -function escape(text) { - return String(text).replace(ESCAPE_REGEX, function (match) { - return ESCAPE_LOOKUP[match]; - }); -} - -/** - * A function to set the text content of a DOM element in all supported - * browsers. Note that we don't define this if there is no document. - */ -var setTextContent = void 0; -if (typeof document !== "undefined") { - var testNode = document.createElement("span"); - if ("textContent" in testNode) { - setTextContent = function setTextContent(node, text) { - node.textContent = text; - }; - } else { - setTextContent = function setTextContent(node, text) { - node.innerText = text; - }; - } -} - -/** - * A function to clear a node. - */ -function clearNode(node) { - setTextContent(node, ""); -} - -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ -var getBaseElem = function getBaseElem(group) { - if (!group) { - return false; - } else if (group.type === "ordgroup") { - if (group.value.length === 1) { - return getBaseElem(group.value[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.value.value.length === 1) { - return getBaseElem(group.value.value[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.value.body); - } else { - return group; - } -}; - -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ -var isCharacterBox = function isCharacterBox(group) { - var baseElem = getBaseElem(group); - - // These are all they types of groups which hold single characters - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "bin" || baseElem.type === "rel" || baseElem.type === "inner" || baseElem.type === "open" || baseElem.type === "close" || baseElem.type === "punct"; -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - contains: contains, - deflt: deflt, - escape: escape, - hyphenate: hyphenate, - indexOf: indexOf, - setTextContent: setTextContent, - clearNode: clearNode, - getBaseElem: getBaseElem, - isCharacterBox: isCharacterBox -}); - -/***/ }), -/* 6 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Token__ = __webpack_require__(27); - - - - -/** - * This is the ParseError class, which is the main error thrown by KaTeX - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ - -var ParseError = -// Error position based on passed-in Token or ParseNode. - -function ParseError(message, // The error message -token) // An object providing position information -{ - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, ParseError); - - var error = "KaTeX parse error: " + message; - var start = void 0; - - var loc = token && token.loc; - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - - // Get the input - var input = loc.lexer.input; - - // Prepend some information - start = loc.start; - var end = loc.end; - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } - - // Underline token in question using combining underscores - var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); - - // Extract some context from the input and add it to the error - var left = void 0; - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - var right = void 0; - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - error += left + underlined + right; - } - - // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - var self = new Error(error); - self.name = "ParseError"; - // $FlowFixMe - self.__proto__ = ParseError.prototype; - // $FlowFixMe - self.position = start; - return self; -}; - -// $FlowFixMe More hackery - - -ParseError.prototype.__proto__ = Error.prototype; - -/* harmony default export */ __webpack_exports__["a"] = (ParseError); - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -exports.default = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); +var SourceLocation = +/*#__PURE__*/ +function () { + // The + prefix indicates that these fields aren't writeable + // Lexer holding the input string. + // Start offset, zero-based inclusive. + // End offset, zero-based exclusive. + function SourceLocation(lexer, start, end) { + this.lexer = void 0; + this.start = void 0; + this.end = void 0; + this.lexer = lexer; + this.start = start; + this.end = end; } -}; - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - -var core = module.exports = {version: '2.4.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef - -/***/ }), -/* 9 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); + /** + * Merges two `SourceLocation`s from location providers, given they are + * provided in order of appearance. + * - Returns the first one's location if only the first is provided. + * - Returns a merged range of the first and the last if both are provided + * and their lexers match. + * - Otherwise, returns null. + */ - -/** - * This file contains information and classes for the various kinds of styles - * used in TeX. It provides a generic `Style` class, which holds information - * about a specific style. It then provides instances of all the different kinds - * of styles possible, and provides functions to move between them and get - * information about them. - */ - -/** - * The main style class. Contains a unique id for the style, a size (which is - * the same for cramped and uncramped version of a style), and a cramped flag. - */ -var Style = function () { - function Style(id, size, cramped) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Style); - - this.id = id; - this.size = size; - this.cramped = cramped; + SourceLocation.range = function range(first, second) { + if (!second) { + return first && first.loc; + } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { + return null; + } else { + return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); } - - /** - * Get the style of a superscript given a base in the current style. - */ - - - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Style, [{ - key: "sup", - value: function sup() { - return styles[_sup[this.id]]; - } - - /** - * Get the style of a subscript given a base in the current style. - */ - - }, { - key: "sub", - value: function sub() { - return styles[_sub[this.id]]; - } - - /** - * Get the style of a fraction numerator given the fraction in the current - * style. - */ - - }, { - key: "fracNum", - value: function fracNum() { - return styles[_fracNum[this.id]]; - } - - /** - * Get the style of a fraction denominator given the fraction in the current - * style. - */ - - }, { - key: "fracDen", - value: function fracDen() { - return styles[_fracDen[this.id]]; - } - - /** - * Get the cramped version of a style (in particular, cramping a cramped style - * doesn't change the style). - */ - - }, { - key: "cramp", - value: function cramp() { - return styles[_cramp[this.id]]; - } - - /** - * Get a text or display version of this style. - */ - - }, { - key: "text", - value: function text() { - return styles[_text[this.id]]; - } - - /** - * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle) - */ - - }, { - key: "isTight", - value: function isTight() { - return this.size >= 2; - } - }]); - - return Style; -}(); - -// Export an interface for type checking, but don't expose the implementation. -// This way, no more styles can be generated. - - -// IDs of the different styles -var D = 0; -var Dc = 1; -var T = 2; -var Tc = 3; -var S = 4; -var Sc = 5; -var SS = 6; -var SSc = 7; - -// Instances of the different styles -var styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; - -// Lookup tables for switching from one style to another -var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc]; -var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc]; -var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc]; -var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; - -// We only export some of the styles. -/* harmony default export */ __webpack_exports__["a"] = ({ - DISPLAY: styles[D], - TEXT: styles[T], - SCRIPT: styles[S], - SCRIPTSCRIPT: styles[SS] -}); - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _defineProperty = __webpack_require__(73); - -var _defineProperty2 = _interopRequireDefault(_defineProperty); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - (0, _defineProperty2.default)(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; }; + + return SourceLocation; }(); -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -var store = __webpack_require__(52)('wks') - , uid = __webpack_require__(32) - , Symbol = __webpack_require__(16).Symbol - , USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function(name){ - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - -/***/ }), -/* 12 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign__ = __webpack_require__(105); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__unicodeScripts__ = __webpack_require__(42); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__svgGeometry__ = __webpack_require__(111); - - - - - -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - */ - - - - - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove null or empty classes. - */ -var createClass = function createClass(classes) { - classes = classes.slice(); - for (var i = classes.length - 1; i >= 0; i--) { - if (!classes[i]) { - classes.splice(i, 1); - } - } - - return classes.join(" "); -}; - -// To ensure that all nodes have compatible signatures for these methods. - - -/** - * All `DomChildNode`s MUST have `height`, `depth`, and `maxFontSize` numeric - * fields. - * - * `DomChildNode` is not defined as an interface since `documentFragment` also - * has these fields but should not be considered a `DomChildNode`. - */ - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. It also contains information about its height, depth, and - * maxFontSize. - */ -var span = function () { - function span(classes, children, options, style) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, span); - - this.classes = classes || []; - this.children = children || []; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default()({}, style); - this.attributes = {}; - if (options) { - if (options.style.isTight()) { - this.classes.push("mtight"); - } - var color = options.getColor(); - if (color) { - this.style.color = color; - } - } - } - - /** - * Sets an arbitrary attribute on the span. Warning: use this wisely. Not all - * browsers support attributes the same, and having too many custom attributes - * is probably bad. - */ - - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(span, [{ - key: "setAttribute", - value: function setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - }, { - key: "tryCombine", - value: function tryCombine(sibling) { - return false; - } - - /** - * Convert the span into an HTML node - */ - - }, { - key: "toNode", - value: function toNode() { - var span = document.createElement("span"); - - // Apply the class - span.className = createClass(this.classes); - - // Apply inline styles - for (var style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style)) { - // $FlowFixMe Flow doesn't seem to understand span.style's type. - span.style[style] = this.style[style]; - } - } - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - span.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (var i = 0; i < this.children.length; i++) { - span.appendChild(this.children[i].toNode()); - } - - return span; - } - - /** - * Convert the span into an HTML markup string - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = "<span"; - - // Add the class - if (this.classes.length) { - markup += " class=\""; - markup += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(createClass(this.classes)); - markup += "\""; - } - - var styles = ""; - - // Add the styles, after hyphenation - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - markup += " style=\"" + __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(styles) + "\""; - } - - // Add the attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "=\""; - markup += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(this.attributes[attr]); - markup += "\""; - } - } - - markup += ">"; - - // Add the markup of the children, also as markup - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += "</span>"; - - return markup; - } - }]); - - return span; -}(); - -/** - * This node represents an anchor (<a>) element with a hyperlink, a list of classes, - * a list of children, and an inline style. It also contains information about its - * height, depth, and maxFontSize. - */ - - -var anchor = function () { - function anchor(href, classes, children, options) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, anchor); - - this.href = href; - this.classes = classes; - this.children = children; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = {}; - this.attributes = {}; - if (options.style.isTight()) { - this.classes.push("mtight"); - } - var color = options.getColor(); - if (color) { - this.style.color = color; - } - } - - /** - * Sets an arbitrary attribute on the anchor. Warning: use this wisely. Not all - * browsers support attributes the same, and having too many custom attributes - * is probably bad. - */ - - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(anchor, [{ - key: "setAttribute", - value: function setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - }, { - key: "tryCombine", - value: function tryCombine(sibling) { - return false; - } - - /** - * Convert the anchor into an HTML node - */ - - }, { - key: "toNode", - value: function toNode() { - var a = document.createElement("a"); - - // Apply the href - a.setAttribute('href', this.href); - - // Apply the class - if (this.classes.length) { - a.className = createClass(this.classes); - } - - // Apply inline styles - for (var style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style)) { - // $FlowFixMe Flow doesn't seem to understand a.style's type. - a.style[style] = this.style[style]; - } - } - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - a.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (var i = 0; i < this.children.length; i++) { - a.appendChild(this.children[i].toNode()); - } - - return a; - } - - /** - * Convert the a into an HTML markup string - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = "<a"; - - // Add the href - markup += "href=\"" + (markup += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(this.href)) + "\""; - // Add the class - if (this.classes.length) { - markup += " class=\"" + __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(createClass(this.classes)) + "\""; - } - - var styles = ""; - - // Add the styles, after hyphenation - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - markup += " style=\"" + __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(styles) + "\""; - } - - // Add the attributes - for (var attr in this.attributes) { - if (attr !== "href" && Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "=\"" + __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(this.attributes[attr]) + "\""; - } - } - - markup += ">"; - - // Add the markup of the children, also as markup - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.children), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var child = _step.value; - - markup += child.toMarkup(); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - markup += "</a>"; - - return markup; - } - }]); - - return anchor; -}(); - -/** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. Thus, it only - * contains children and doesn't have any HTML properties. It also keeps track - * of a height, depth, and maxFontSize. - */ - - -var documentFragment = function () { - function documentFragment(children) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, documentFragment); - - this.children = children || []; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - } - - /** - * Convert the fragment into a node - */ - - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(documentFragment, [{ - key: "toNode", - value: function toNode() { - // Create a fragment - var frag = document.createDocumentFragment(); - - // Append the children - for (var i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - - /** - * Convert the fragment into HTML markup - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = ""; - - // Simply concatenate the markup for the children together - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - }]); - - return documentFragment; -}(); - -var iCombinations = { - 'î': "\u0131\u0302", - 'ï': "\u0131\u0308", - 'í': "\u0131\u0301", - // 'ī': '\u0131\u0304', // enable when we add Extended Latin - 'ì': "\u0131\u0300" -}; - -/** - * A symbol node contains information about a single symbol. It either renders - * to a single text node, or a span with a single text node in it, depending on - * whether it has CSS classes, styles, or needs italic correction. - */ - -var symbolNode = function () { - function symbolNode(value, height, depth, italic, skew, width, classes, style) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, symbolNode); - - this.value = value; - this.height = height || 0; - this.depth = depth || 0; - this.italic = italic || 0; - this.skew = skew || 0; - this.width = width || 0; - this.classes = classes || []; - this.style = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default()({}, style); - this.maxFontSize = 0; - - // Mark text from non-Latin scripts with specific classes so that we - // can specify which fonts to use. This allows us to render these - // characters with a serif font in situations where the browser would - // either default to a sans serif or render a placeholder character. - // We use CSS class names like cjk_fallback, hangul_fallback and - // brahmic_fallback. See ./unicodeScripts.js for the set of possible - // script names - var script = Object(__WEBPACK_IMPORTED_MODULE_4__unicodeScripts__["a" /* scriptFromCodepoint */])(this.value.charCodeAt(0)); - if (script) { - this.classes.push(script + "_fallback"); - } - - if (/[îïíì]/.test(this.value)) { - // add ī when we add Extended Latin - this.value = iCombinations[this.value]; - } - } - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(symbolNode, [{ - key: "tryCombine", - value: function tryCombine(sibling) { - if (!sibling || !(sibling instanceof symbolNode) || this.italic > 0 || createClass(this.classes) !== createClass(sibling.classes) || this.skew !== sibling.skew || this.maxFontSize !== sibling.maxFontSize) { - return false; - } - for (var style in this.style) { - if (this.style.hasOwnProperty(style) && this.style[style] !== sibling.style[style]) { - return false; - } - } - for (var _style in sibling.style) { - if (sibling.style.hasOwnProperty(_style) && this.style[_style] !== sibling.style[_style]) { - return false; - } - } - this.value += sibling.value; - this.height = Math.max(this.height, sibling.height); - this.depth = Math.max(this.depth, sibling.depth); - this.italic = sibling.italic; - return true; - } - - /** - * Creates a text node or span from a symbol node. Note that a span is only - * created if it is needed. - */ - - }, { - key: "toNode", - value: function toNode() { - var node = document.createTextNode(this.value); - var span = null; - - if (this.italic > 0) { - span = document.createElement("span"); - span.style.marginRight = this.italic + "em"; - } - - if (this.classes.length > 0) { - span = span || document.createElement("span"); - span.className = createClass(this.classes); - } - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - span = span || document.createElement("span"); - // $FlowFixMe Flow doesn't seem to understand span.style's type. - span.style[style] = this.style[style]; - } - } - - if (span) { - span.appendChild(node); - return span; - } else { - return node; - } - } - - /** - * Creates markup for a symbol node. - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - // TODO(alpert): More duplication than I'd like from - // span.prototype.toMarkup and symbolNode.prototype.toNode... - var needsSpan = false; - - var markup = "<span"; - - if (this.classes.length) { - needsSpan = true; - markup += " class=\""; - markup += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(createClass(this.classes)); - markup += "\""; - } - - var styles = ""; - - if (this.italic > 0) { - styles += "margin-right:" + this.italic + "em;"; - } - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - needsSpan = true; - markup += " style=\"" + __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(styles) + "\""; - } - - var escaped = __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(this.value); - if (needsSpan) { - markup += ">"; - markup += escaped; - markup += "</span>"; - return markup; - } else { - return escaped; - } - } - }]); - - return symbolNode; -}(); - -/** - * SVG nodes are used to render stretchy wide elements. - */ - - -var svgNode = function () { - function svgNode(children, attributes) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, svgNode); - - this.children = children || []; - this.attributes = attributes || {}; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - } - // Required for all `DomChildNode`s. Are always 0 for svgNode. - - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(svgNode, [{ - key: "toNode", - value: function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "svg"); - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - return node; - } - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = "<svg"; - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "='" + this.attributes[attr] + "'"; - } - } - - markup += ">"; - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += "</svg>"; - - return markup; - } - }]); - - return svgNode; -}(); - -var pathNode = function () { - function pathNode(pathName, alternate) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, pathNode); - - this.pathName = pathName; - this.alternate = alternate; // Used only for tall \sqrt - } - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(pathNode, [{ - key: "toNode", - value: function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "path"); - - if (this.alternate) { - node.setAttribute("d", this.alternate); - } else { - node.setAttribute("d", __WEBPACK_IMPORTED_MODULE_6__svgGeometry__["a" /* default */].path[this.pathName]); - } - - return node; - } - }, { - key: "toMarkup", - value: function toMarkup() { - if (this.alternate) { - return "<path d='" + this.alternate + "'/>"; - } else { - return "<path d='" + __WEBPACK_IMPORTED_MODULE_6__svgGeometry__["a" /* default */].path[this.pathName] + "'/>"; - } - } - }]); - - return pathNode; -}(); - -var lineNode = function () { - function lineNode(attributes) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, lineNode); - - this.attributes = attributes || {}; - } - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(lineNode, [{ - key: "toNode", - value: function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "line"); - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - return node; - } - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = "<line"; - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "='" + this.attributes[attr] + "'"; - } - } - - markup += "/>"; - - return markup; - } - }]); - - return lineNode; -}(); - -/* harmony default export */ __webpack_exports__["a"] = ({ - span: span, - anchor: anchor, - documentFragment: documentFragment, - symbolNode: symbolNode, - svgNode: svgNode, - pathNode: pathNode, - lineNode: lineNode -}); - -/***/ }), -/* 13 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray__ = __webpack_require__(57); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils__ = __webpack_require__(5); - - -/** - * This file provides support to buildMathML.js and buildHTML.js - * for stretchy wide elements rendered from SVG files - * and other CSS trickery. - */ - - - - - - -var stretchyCodePoint = { - widehat: "^", - widetilde: "~", - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23B5", - overbrace: "\u23DE", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21D2", - xRightarrow: "\u21D2", - overleftharpoon: "\u21BC", - xleftharpoonup: "\u21BC", - overrightharpoon: "\u21C0", - xrightharpoonup: "\u21C0", - xLeftarrow: "\u21D0", - xLeftrightarrow: "\u21D4", - xhookleftarrow: "\u21A9", - xhookrightarrow: "\u21AA", - xmapsto: "\u21A6", - xrightharpoondown: "\u21C1", - xleftharpoondown: "\u21BD", - xrightleftharpoons: "\u21CC", - xleftrightharpoons: "\u21CB", - xtwoheadleftarrow: "\u219E", - xtwoheadrightarrow: "\u21A0", - xlongequal: "=", - xtofrom: "\u21C4", - xrightleftarrows: "\u21C4", - xrightequilibrium: "\u21CC", // Not a perfect match. - xleftequilibrium: "\u21CB" // None better available. -}; - -var mathMLnode = function mathMLnode(label) { - var node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(stretchyCodePoint[label.substr(1)])]); - node.setAttribute("stretchy", "true"); - return node; -}; - -// Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts. -// Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>) -// Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>) -// Licensed under the SIL Open Font License, Version 1.1. -// See \nhttp://scripts.sil.org/OFL - -// Very Long SVGs -// Many of the KaTeX stretchy wide elements use a long SVG image and an -// overflow: hidden tactic to achieve a stretchy image while avoiding -// distortion of arrowheads or brace corners. - -// The SVG typically contains a very long (400 em) arrow. - -// The SVG is in a container span that has overflow: hidden, so the span -// acts like a window that exposes only part of the SVG. - -// The SVG always has a longer, thinner aspect ratio than the container span. -// After the SVG fills 100% of the height of the container span, -// there is a long arrow shaft left over. That left-over shaft is not shown. -// Instead, it is sliced off because the span's CSS has overflow: hidden. - -// Thus, the reader sees an arrow that matches the subject matter width -// without distortion. - -// Some functions, such as \cancel, need to vary their aspect ratio. These -// functions do not get the overflow SVG treatment. - -// Second Brush Stroke -// Low resolution monitors struggle to display images in fine detail. -// So browsers apply anti-aliasing. A long straight arrow shaft therefore -// will sometimes appear as if it has a blurred edge. - -// To mitigate this, these SVG files contain a second "brush-stroke" on the -// arrow shafts. That is, a second long thin rectangular SVG path has been -// written directly on top of each arrow shaft. This reinforcement causes -// some of the screen pixels to display as black instead of the anti-aliased -// gray pixel that a single path would generate. So we get arrow shafts -// whose edges appear to be sharper. - -// In the katexImagesData object just below, the dimensions all -// correspond to path geometry inside the relevant SVG. -// For example, \overrightarrow uses the same arrowhead as glyph U+2192 -// from the KaTeX Main font. The scaling factor is 1000. -// That is, inside the font, that arrowhead is 522 units tall, which -// corresponds to 0.522 em inside the document. - -var katexImagesData = { - // path(s), minWidth, height, align - overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"], - xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"], - Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"], - xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"], - xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"], - overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"], - overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"], - xlongequal: [["longequal"], 0.888, 334, "xMinYMin"], - xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"], - xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"], - - overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548], - underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548], - underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522], - xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560], - xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716], - xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716], - xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522], - xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522], - overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - overgroup: [["leftgroup", "rightgroup"], 0.888, 342], - undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342], - xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522], - xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528], - - // The next three arrows are from the mhchem package. - // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the - // document as \xrightarrow or \xrightleftharpoons. Those have - // min-length = 1.75em, so we set min-length on these next three to match. - xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 667], - xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716], - xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716] -}; - -var groupLength = function groupLength(arg) { - if (arg.type === "ordgroup") { - return arg.value.length; - } else { - return 1; - } -}; - -var svgSpan = function svgSpan(group, options) { - // Create a span with inline SVG for the element. - function buildSvgSpan_() { - var viewBoxWidth = 400000; // default - var label = group.value.label.substr(1); - if (__WEBPACK_IMPORTED_MODULE_4__utils__["a" /* default */].contains(["widehat", "widetilde", "utilde"], label)) { - // There are four SVG images available for each function. - // Choose a taller image when there are more characters. - var numChars = groupLength(group.value.base); - var viewBoxHeight = void 0; - var pathName = void 0; - var _height = void 0; - - if (numChars > 5) { - viewBoxHeight = label === "widehat" ? 420 : 312; - viewBoxWidth = label === "widehat" ? 2364 : 2340; - // Next get the span height, in 1000 ems - _height = label === "widehat" ? 0.42 : 0.34; - pathName = (label === "widehat" ? "widehat" : "tilde") + "4"; - } else { - var imgIndex = [1, 1, 2, 2, 3, 3][numChars]; - if (label === "widehat") { - viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex]; - viewBoxHeight = [0, 239, 300, 360, 420][imgIndex]; - _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex]; - pathName = "widehat" + imgIndex; - } else { - viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex]; - viewBoxHeight = [0, 260, 286, 306, 312][imgIndex]; - _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex]; - pathName = "tilde" + imgIndex; - } - } - var path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode(pathName); - var svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([path], { - "width": "100%", - "height": _height + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight, - "preserveAspectRatio": "none" - }); - return { - span: __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([], [svgNode], options), - minWidth: 0, - height: _height - }; - } else { - var spans = []; - - var _katexImagesData$labe = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray___default()(katexImagesData[label], 4), - paths = _katexImagesData$labe[0], - _minWidth = _katexImagesData$labe[1], - _viewBoxHeight = _katexImagesData$labe[2], - align1 = _katexImagesData$labe[3]; - - var _height2 = _viewBoxHeight / 1000; - - var numSvgChildren = paths.length; - var widthClasses = void 0; - var aligns = void 0; - if (numSvgChildren === 1) { - widthClasses = ["hide-tail"]; - aligns = [align1]; - } else if (numSvgChildren === 2) { - widthClasses = ["halfarrow-left", "halfarrow-right"]; - aligns = ["xMinYMin", "xMaxYMin"]; - } else if (numSvgChildren === 3) { - widthClasses = ["brace-left", "brace-center", "brace-right"]; - aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"]; - } else { - throw new Error("Correct katexImagesData or update code here to support\n " + numSvgChildren + " children."); - } - - for (var i = 0; i < numSvgChildren; i++) { - var _path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode(paths[i]); - - var _svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([_path], { - "width": "400em", - "height": _height2 + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight, - "preserveAspectRatio": aligns[i] + " slice" - }); - - var _span = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([widthClasses[i]], [_svgNode], options); - if (numSvgChildren === 1) { - return { span: _span, minWidth: _minWidth, height: _height2 }; - } else { - _span.style.height = _height2 + "em"; - spans.push(_span); - } - } - - return { - span: __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["stretchy"], spans, options), - minWidth: _minWidth, - height: _height2 - }; - } - } // buildSvgSpan_() - - var _buildSvgSpan_ = buildSvgSpan_(), - span = _buildSvgSpan_.span, - minWidth = _buildSvgSpan_.minWidth, - height = _buildSvgSpan_.height; - - // Note that we are returning span.depth = 0. - // Any adjustments relative to the baseline must be done in buildHTML. - - - span.height = height; - span.style.height = height + "em"; - if (minWidth > 0) { - span.style.minWidth = minWidth + "em"; - } - - return span; -}; - -var encloseSpan = function encloseSpan(inner, label, pad, options) { - // Return an image span for \cancel, \bcancel, \xcancel, or \fbox - var img = void 0; - var totalHeight = inner.height + inner.depth + 2 * pad; - - if (/fbox|color/.test(label)) { - img = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["stretchy", label], [], options); - - if (label === "fbox") { - var color = options.color && options.getColor(); - if (color) { - img.style.borderColor = color; - } - } - } else { - // \cancel, \bcancel, or \xcancel - // Since \cancel's SVG is inline and it omits the viewBox attribute, - // its stroke-width will not vary with span area. - - var lines = []; - if (/^[bx]cancel$/.test(label)) { - lines.push(new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].lineNode({ - "x1": "0", - "y1": "0", - "x2": "100%", - "y2": "100%", - "stroke-width": "0.046em" - })); - } - - if (/^x?cancel$/.test(label)) { - lines.push(new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].lineNode({ - "x1": "0", - "y1": "100%", - "x2": "100%", - "y2": "0", - "stroke-width": "0.046em" - })); - } - - var svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode(lines, { - "width": "100%", - "height": totalHeight + "em" - }); - - img = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([], [svgNode], options); - } - - img.height = totalHeight; - img.style.height = totalHeight + "em"; - - return img; -}; - -var ruleSpan = function ruleSpan(className, lineThickness, options) { - - // Get a span with an SVG path that fills the middle fifth of the span. - // We're using an extra wide span so Chrome won't round it down to zero. - - var path = void 0; - var svgNode = void 0; - var parentClass = "stretchy"; // default - - if (className === "vertical-separator") { - path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode("vertSeparator"); - svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([path], { - "width": "0.25em", // contains a path that is 0.05 ems wide. - "height": "400em", - "viewBox": "0 0 250 400000", - "preserveAspectRatio": "xMinYMin slice" - }); - parentClass = "vertical-separator"; - } else { - // The next two lines are the only place in KaTeX where SVG paths are - // put into a viewBox that is not always exactly a 1000:1 scale to the - // document em size. Instead, the path is a horizontal line set to - // take up the middle fifth of the viewBox and span. If the context is - // normalsize/textstyle then the line will be 0.04em and the usual - // 1000:1 ratio holds. But if the context is scriptstyle, then - // lineThickness > 0.04em and we have a ratio somewhat different than - // 1000:1. - - path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode("stdHorizRule"); - svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([path], { - "width": "400em", - "height": 5 * lineThickness + "em", - "viewBox": "0 0 400000 200", - "preserveAspectRatio": "xMinYMin slice" - }); - } - - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([parentClass], [svgNode], options); -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - encloseSpan: encloseSpan, - mathMLnode: mathMLnode, - ruleSpan: ruleSpan, - svgSpan: svgSpan -}); - -/***/ }), -/* 14 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__SourceLocation__ = __webpack_require__(31); - - - -/** - * The resulting parse tree nodes of the parse tree. - * - * It is possible to provide position information, so that a `ParseNode` can - * fulfill a role similar to a `Token` in error reporting. - * For details on the corresponding properties see `Token` constructor. - * Providing such information can lead to better error reporting. - */ -var ParseNode = function ParseNode(type, // type of node, like e.g. "ordgroup" -value, // type-specific representation of the node -mode, // parse mode in action for this node, "math" or "text" -first, // first token or node of the input for -last) // last token or node of the input for this -// node, will default to firstToken if unset -{ - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, ParseNode); - - this.type = type; - this.value = value; - this.mode = mode; - this.loc = __WEBPACK_IMPORTED_MODULE_1__SourceLocation__["a" /* default */].range(first, last); -}; - -/* harmony default export */ __webpack_exports__["a"] = (ParseNode); - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(22) - , IE8_DOM_DEFINE = __webpack_require__(70) - , toPrimitive = __webpack_require__(71) - , dP = Object.defineProperty; - -exports.f = __webpack_require__(23) ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; - -/***/ }), -/* 16 */ -/***/ (function(module, exports) { - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef - -/***/ }), -/* 17 */ -/***/ (function(module, exports) { - -module.exports = {}; - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(103), __esModule: true }; - -/***/ }), -/* 19 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return validUnit; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return calculateSize; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Options__ = __webpack_require__(43); - - -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into ems. - */ - - - - -// This table gives the number of TeX pts in one of each *absolute* TeX unit. -// Thus, multiplying a length by this number converts the length from units -// into pts. Dividing the result by ptPerEm gives the number of ems -// *assuming* a font size of ptPerEm (normal size, normal style). -var ptPerUnit = { - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - "pt": 1, // TeX point - "mm": 7227 / 2540, // millimeter - "cm": 7227 / 254, // centimeter - "in": 72.27, // inch - "bp": 803 / 800, // big (PostScript) points - "pc": 12, // pica - "dd": 1238 / 1157, // didot - "cc": 14856 / 1157, // cicero (12 didot) - "nd": 685 / 642, // new didot - "nc": 1370 / 107, // new cicero (12 new didot) - "sp": 1 / 65536, // scaled point (TeX's internal smallest unit) - // https://tex.stackexchange.com/a/41371 - "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX -}; - -// Dictionary of relative units, for fast validity testing. -var relativeUnit = { - "ex": true, - "em": true, - "mu": true -}; - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -var validUnit = function validUnit(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - return unit in ptPerUnit || unit in relativeUnit || unit === "ex"; -}; - -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS em value for the - * current style/scale. `options` gives the current options. - */ -var calculateSize = function calculateSize(sizeValue, options) { - var scale = void 0; - if (sizeValue.unit in ptPerUnit) { - // Absolute units - scale = ptPerUnit[sizeValue.unit] // Convert unit to pt - / options.fontMetrics().ptPerEm // Convert pt to CSS em - / options.sizeMultiplier; // Unscale to make absolute units - } else if (sizeValue.unit === "mu") { - // `mu` units scale with scriptstyle/scriptscriptstyle. - scale = options.fontMetrics().cssEmPerMu; - } else { - // Other relative units always refer to the *textstyle* font - // in the current size. - var unitOptions = void 0; - if (options.style.isTight()) { - // isTight() means current style is script/scriptscript. - unitOptions = options.havingStyle(options.style.text()); - } else { - unitOptions = options; - } - // TODO: In TeX these units are relative to the quad of the current - // *text* font, e.g. cmr10. KaTeX instead uses values from the - // comparably-sized *Computer Modern symbol* font. At 10pt, these - // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641; - // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$. - // TeX \showlists shows a kern of 1.13889 * fontsize; - // KaTeX shows a kern of 1.171 * fontsize. - if (sizeValue.unit === "ex") { - scale = unitOptions.fontMetrics().xHeight; - } else if (sizeValue.unit === "em") { - scale = unitOptions.fontMetrics().quad; - } else { - throw new __WEBPACK_IMPORTED_MODULE_0__ParseError__["a" /* default */]("Invalid unit: '" + sizeValue.unit + "'"); - } - if (unitOptions !== options) { - scale *= unitOptions.sizeMultiplier / options.sizeMultiplier; - } - } - return Math.min(sizeValue.number * scale, options.maxSize); -}; - -/***/ }), -/* 20 */ -/***/ (function(module, exports) { - -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - -/***/ }), -/* 21 */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function(it, key){ - return hasOwnProperty.call(it, key); -}; - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(20); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - -// Thank's IE8 for his funny defineProperty -module.exports = !__webpack_require__(24)(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); - -/***/ }), -/* 24 */ -/***/ (function(module, exports) { - -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(16) - , core = __webpack_require__(8) - , ctx = __webpack_require__(47) - , hide = __webpack_require__(26) - , PROTOTYPE = 'prototype'; - -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , IS_WRAP = type & $export.W - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] - , key, own, out; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - if(own && key in exports)continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function(C){ - var F = function(a, b, c){ - if(this instanceof C){ - switch(arguments.length){ - case 0: return new C; - case 1: return new C(a); - case 2: return new C(a, b); - } return new C(a, b, c); - } return C.apply(this, arguments); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% - if(IS_PROTO){ - (exports.virtual || (exports.virtual = {}))[key] = out; - // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% - if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); - } - } -}; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(15) - , createDesc = __webpack_require__(33); -module.exports = __webpack_require__(23) ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; - -/***/ }), -/* 27 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Token; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__SourceLocation__ = __webpack_require__(31); - - +// CONCATENATED MODULE: ./src/Token.js /** * Interface required to break circular dependency between Token, Lexer, and * ParseError. */ - /** * The resulting token returned from `lex`. * @@ -4006,797 +174,3424 @@ module.exports = __webpack_require__(23) ? function(object, key, value){ * tokens if appropriate. Not providing available position information may * lead to degraded error reporting, though. */ -var Token = function () { - function Token(text, // the text of this token - loc) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Token); - - this.text = text; - this.loc = loc; - } - - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ +var Token_Token = +/*#__PURE__*/ +function () { + function Token(text, // the text of this token + loc) { + this.text = void 0; + this.loc = void 0; + this.text = text; + this.loc = loc; + } + /** + * Given a pair of tokens (this and endToken), compute a `Token` encompassing + * the whole input range enclosed by these two. + */ - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Token, [{ - key: "range", - value: function range(endToken, // last token of the range, inclusive - text) // the text of the newly constructed token - { - return new Token(text, __WEBPACK_IMPORTED_MODULE_2__SourceLocation__["a" /* default */].range(this, endToken)); - } - }]); + var _proto = Token.prototype; - return Token; + _proto.range = function range(endToken, // last token of the range, inclusive + text) // the text of the newly constructed token + { + return new Token(text, SourceLocation.range(this, endToken)); + }; + + return Token; }(); +// CONCATENATED MODULE: ./src/ParseError.js -/***/ }), -/* 28 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; /** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). + * This is the ParseError class, which is the main error thrown by KaTeX + * functions when something has gone wrong. This is used to distinguish internal + * errors from errors in the expression that the user provided. * - * For each of the symbols, there are three properties they can have: - * - font (required): the font to be used for this symbol. Either "main" (the - normal font), or "ams" (the ams fonts). - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - See https://github.com/Khan/KaTeX/wiki/Examining-TeX#group-types - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). + * If possible, a caller should provide a Token or ParseNode with information + * about where in the source string the problem occurred. + */ +var ParseError = // Error position based on passed-in Token or ParseNode. +function ParseError(message, // The error message +token) // An object providing position information +{ + this.position = void 0; + var error = "KaTeX parse error: " + message; + var start; + var loc = token && token.loc; + + if (loc && loc.start <= loc.end) { + // If we have the input and a position, make the error a bit fancier + // Get the input + var input = loc.lexer.input; // Prepend some information + + start = loc.start; + var end = loc.end; + + if (start === input.length) { + error += " at end of input: "; + } else { + error += " at position " + (start + 1) + ": "; + } // Underline token in question using combining underscores + + + var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); // Extract some context from the input and add it to the error + + var left; + + if (start > 15) { + left = "…" + input.slice(start - 15, start); + } else { + left = input.slice(0, start); + } + + var right; + + if (end + 15 < input.length) { + right = input.slice(end, end + 15) + "…"; + } else { + right = input.slice(end); + } + + error += left + underlined + right; + } // Some hackery to make ParseError a prototype of Error + // See http://stackoverflow.com/a/8460753 + + + var self = new Error(error); + self.name = "ParseError"; // $FlowFixMe + + self.__proto__ = ParseError.prototype; // $FlowFixMe + + self.position = start; + return self; +}; // $FlowFixMe More hackery + + +ParseError.prototype.__proto__ = Error.prototype; +/* harmony default export */ var src_ParseError = (ParseError); +// CONCATENATED MODULE: ./src/utils.js +/** + * This file contains a list of utility functions which are useful in other + * files. */ -var symbols = { - "math": {}, - "text": {} +/** + * Return whether an element is contained in a list + */ +var contains = function contains(list, elem) { + return list.indexOf(elem) !== -1; }; -/* harmony default export */ __webpack_exports__["a"] = (symbols); +/** + * Provide a default value if a setting is undefined + * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022. + */ -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ -function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { font: font, group: group, replace: replace }; - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; +var deflt = function deflt(setting, defaultIfUndefined) { + return setting === undefined ? defaultIfUndefined : setting; +}; // hyphenate and escape adapted from Facebook's React under Apache 2 license + + +var uppercase = /([A-Z])/g; + +var hyphenate = function hyphenate(str) { + return str.replace(uppercase, "-$1").toLowerCase(); +}; + +var ESCAPE_LOOKUP = { + "&": "&", + ">": ">", + "<": "<", + "\"": """, + "'": "'" +}; +var ESCAPE_REGEX = /[&><"']/g; +/** + * Escapes text to prevent scripting attacks. + */ + +function utils_escape(text) { + return String(text).replace(ESCAPE_REGEX, function (match) { + return ESCAPE_LOOKUP[match]; + }); +} +/** + * Sometimes we want to pull out the innermost element of a group. In most + * cases, this will just be the group itself, but when ordgroups and colors have + * a single element, we want to pull that out. + */ + + +var getBaseElem = function getBaseElem(group) { + if (group.type === "ordgroup") { + if (group.body.length === 1) { + return getBaseElem(group.body[0]); + } else { + return group; } -} + } else if (group.type === "color") { + if (group.body.length === 1) { + return getBaseElem(group.body[0]); + } else { + return group; + } + } else if (group.type === "font") { + return getBaseElem(group.body); + } else { + return group; + } +}; +/** + * TeXbook algorithms often reference "character boxes", which are simply groups + * with a single character in them. To decide if something is a character box, + * we find its innermost group, and see if it is a single character. + */ -// Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. -// modes: -var math = "math"; -var text = "text"; +var utils_isCharacterBox = function isCharacterBox(group) { + var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters -// fonts: -var main = "main"; -var ams = "ams"; - -// groups: -var accent = "accent"; -var bin = "bin"; -var close = "close"; -var inner = "inner"; -var mathord = "mathord"; -var op = "op"; -var open = "open"; -var punct = "punct"; -var rel = "rel"; -var spacing = "spacing"; -var textord = "textord"; - -// Now comes the symbol table - -// Relation Symbols -defineSymbol(math, main, rel, "\u2261", "\\equiv", true); -defineSymbol(math, main, rel, "\u227A", "\\prec", true); -defineSymbol(math, main, rel, "\u227B", "\\succ", true); -defineSymbol(math, main, rel, "\u223C", "\\sim", true); -defineSymbol(math, main, rel, "\u22A5", "\\perp"); -defineSymbol(math, main, rel, "\u2AAF", "\\preceq", true); -defineSymbol(math, main, rel, "\u2AB0", "\\succeq", true); -defineSymbol(math, main, rel, "\u2243", "\\simeq", true); -defineSymbol(math, main, rel, "\u2223", "\\mid", true); -defineSymbol(math, main, rel, "\u226A", "\\ll"); -defineSymbol(math, main, rel, "\u226B", "\\gg", true); -defineSymbol(math, main, rel, "\u224D", "\\asymp", true); -defineSymbol(math, main, rel, "\u2225", "\\parallel"); -defineSymbol(math, main, rel, "\u22C8", "\\bowtie", true); -defineSymbol(math, main, rel, "\u2323", "\\smile", true); -defineSymbol(math, main, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(math, main, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(math, main, rel, "\u2250", "\\doteq", true); -defineSymbol(math, main, rel, "\u2322", "\\frown", true); -defineSymbol(math, main, rel, "\u220B", "\\ni", true); -defineSymbol(math, main, rel, "\u221D", "\\propto", true); -defineSymbol(math, main, rel, "\u22A2", "\\vdash", true); -defineSymbol(math, main, rel, "\u22A3", "\\dashv", true); -defineSymbol(math, main, rel, "\u220B", "\\owns"); - -// Punctuation -defineSymbol(math, main, punct, ".", "\\ldotp"); -defineSymbol(math, main, punct, "\u22C5", "\\cdotp"); - -// Misc Symbols -defineSymbol(math, main, textord, "#", "\\#"); -defineSymbol(text, main, textord, "#", "\\#"); -defineSymbol(math, main, textord, "&", "\\&"); -defineSymbol(text, main, textord, "&", "\\&"); -defineSymbol(math, main, textord, "\u2135", "\\aleph", true); -defineSymbol(math, main, textord, "\u2200", "\\forall", true); -defineSymbol(math, main, textord, "\u210F", "\\hbar"); -defineSymbol(math, main, textord, "\u2203", "\\exists", true); -defineSymbol(math, main, textord, "\u2207", "\\nabla", true); -defineSymbol(math, main, textord, "\u266D", "\\flat", true); -defineSymbol(math, main, textord, "\u2113", "\\ell", true); -defineSymbol(math, main, textord, "\u266E", "\\natural", true); -defineSymbol(math, main, textord, "\u2663", "\\clubsuit", true); -defineSymbol(math, main, textord, "\u2118", "\\wp", true); -defineSymbol(math, main, textord, "\u266F", "\\sharp", true); -defineSymbol(math, main, textord, "\u2662", "\\diamondsuit", true); -defineSymbol(math, main, textord, "\u211C", "\\Re", true); -defineSymbol(math, main, textord, "\u2661", "\\heartsuit", true); -defineSymbol(math, main, textord, "\u2111", "\\Im", true); -defineSymbol(math, main, textord, "\u2660", "\\spadesuit", true); -defineSymbol(text, main, textord, "\xA7", "\\S", true); -defineSymbol(text, main, textord, "\xB6", "\\P", true); - -// Math and Text -defineSymbol(math, main, textord, "\u2020", "\\dag"); -defineSymbol(text, main, textord, "\u2020", "\\dag"); -defineSymbol(text, main, textord, "\u2020", "\\textdagger"); -defineSymbol(math, main, textord, "\u2021", "\\ddag"); -defineSymbol(text, main, textord, "\u2021", "\\ddag"); -defineSymbol(text, main, textord, "\u2020", "\\textdaggerdbl"); - -// Large Delimiters -defineSymbol(math, main, close, "\u23B1", "\\rmoustache"); -defineSymbol(math, main, open, "\u23B0", "\\lmoustache"); -defineSymbol(math, main, close, "\u27EF", "\\rgroup"); -defineSymbol(math, main, open, "\u27EE", "\\lgroup"); - -// Binary Operators -defineSymbol(math, main, bin, "\u2213", "\\mp", true); -defineSymbol(math, main, bin, "\u2296", "\\ominus", true); -defineSymbol(math, main, bin, "\u228E", "\\uplus", true); -defineSymbol(math, main, bin, "\u2293", "\\sqcap", true); -defineSymbol(math, main, bin, "\u2217", "\\ast"); -defineSymbol(math, main, bin, "\u2294", "\\sqcup", true); -defineSymbol(math, main, bin, "\u25EF", "\\bigcirc"); -defineSymbol(math, main, bin, "\u2219", "\\bullet"); -defineSymbol(math, main, bin, "\u2021", "\\ddagger"); -defineSymbol(math, main, bin, "\u2240", "\\wr", true); -defineSymbol(math, main, bin, "\u2A3F", "\\amalg"); -defineSymbol(math, main, bin, "&", "\\And"); // from amsmath - -// Arrow Symbols -defineSymbol(math, main, rel, "\u27F5", "\\longleftarrow", true); -defineSymbol(math, main, rel, "\u21D0", "\\Leftarrow", true); -defineSymbol(math, main, rel, "\u27F8", "\\Longleftarrow", true); -defineSymbol(math, main, rel, "\u27F6", "\\longrightarrow", true); -defineSymbol(math, main, rel, "\u21D2", "\\Rightarrow", true); -defineSymbol(math, main, rel, "\u27F9", "\\Longrightarrow", true); -defineSymbol(math, main, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(math, main, rel, "\u27F7", "\\longleftrightarrow", true); -defineSymbol(math, main, rel, "\u21D4", "\\Leftrightarrow", true); -defineSymbol(math, main, rel, "\u27FA", "\\Longleftrightarrow", true); -defineSymbol(math, main, rel, "\u21A6", "\\mapsto", true); -defineSymbol(math, main, rel, "\u27FC", "\\longmapsto", true); -defineSymbol(math, main, rel, "\u2197", "\\nearrow", true); -defineSymbol(math, main, rel, "\u21A9", "\\hookleftarrow", true); -defineSymbol(math, main, rel, "\u21AA", "\\hookrightarrow", true); -defineSymbol(math, main, rel, "\u2198", "\\searrow", true); -defineSymbol(math, main, rel, "\u21BC", "\\leftharpoonup", true); -defineSymbol(math, main, rel, "\u21C0", "\\rightharpoonup", true); -defineSymbol(math, main, rel, "\u2199", "\\swarrow", true); -defineSymbol(math, main, rel, "\u21BD", "\\leftharpoondown", true); -defineSymbol(math, main, rel, "\u21C1", "\\rightharpoondown", true); -defineSymbol(math, main, rel, "\u2196", "\\nwarrow", true); -defineSymbol(math, main, rel, "\u21CC", "\\rightleftharpoons", true); - -// AMS Negated Binary Relations -defineSymbol(math, ams, rel, "\u226E", "\\nless", true); -defineSymbol(math, ams, rel, "\uE010", "\\nleqslant"); -defineSymbol(math, ams, rel, "\uE011", "\\nleqq"); -defineSymbol(math, ams, rel, "\u2A87", "\\lneq", true); -defineSymbol(math, ams, rel, "\u2268", "\\lneqq", true); -defineSymbol(math, ams, rel, "\uE00C", "\\lvertneqq"); -defineSymbol(math, ams, rel, "\u22E6", "\\lnsim", true); -defineSymbol(math, ams, rel, "\u2A89", "\\lnapprox", true); -defineSymbol(math, ams, rel, "\u2280", "\\nprec", true); -// unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u22E0", "\\npreceq", true); -defineSymbol(math, ams, rel, "\u22E8", "\\precnsim", true); -defineSymbol(math, ams, rel, "\u2AB9", "\\precnapprox", true); -defineSymbol(math, ams, rel, "\u2241", "\\nsim", true); -defineSymbol(math, ams, rel, "\uE006", "\\nshortmid"); -defineSymbol(math, ams, rel, "\u2224", "\\nmid", true); -defineSymbol(math, ams, rel, "\u22AC", "\\nvdash", true); -defineSymbol(math, ams, rel, "\u22AD", "\\nvDash", true); -defineSymbol(math, ams, rel, "\u22EA", "\\ntriangleleft"); -defineSymbol(math, ams, rel, "\u22EC", "\\ntrianglelefteq", true); -defineSymbol(math, ams, rel, "\u228A", "\\subsetneq", true); -defineSymbol(math, ams, rel, "\uE01A", "\\varsubsetneq"); -defineSymbol(math, ams, rel, "\u2ACB", "\\subsetneqq", true); -defineSymbol(math, ams, rel, "\uE017", "\\varsubsetneqq"); -defineSymbol(math, ams, rel, "\u226F", "\\ngtr", true); -defineSymbol(math, ams, rel, "\uE00F", "\\ngeqslant"); -defineSymbol(math, ams, rel, "\uE00E", "\\ngeqq"); -defineSymbol(math, ams, rel, "\u2A88", "\\gneq", true); -defineSymbol(math, ams, rel, "\u2269", "\\gneqq", true); -defineSymbol(math, ams, rel, "\uE00D", "\\gvertneqq"); -defineSymbol(math, ams, rel, "\u22E7", "\\gnsim", true); -defineSymbol(math, ams, rel, "\u2A8A", "\\gnapprox", true); -defineSymbol(math, ams, rel, "\u2281", "\\nsucc", true); -// unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u22E1", "\\nsucceq", true); -defineSymbol(math, ams, rel, "\u22E9", "\\succnsim", true); -defineSymbol(math, ams, rel, "\u2ABA", "\\succnapprox", true); -// unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u2246", "\\ncong", true); -defineSymbol(math, ams, rel, "\uE007", "\\nshortparallel"); -defineSymbol(math, ams, rel, "\u2226", "\\nparallel", true); -defineSymbol(math, ams, rel, "\u22AF", "\\nVDash", true); -defineSymbol(math, ams, rel, "\u22EB", "\\ntriangleright"); -defineSymbol(math, ams, rel, "\u22ED", "\\ntrianglerighteq", true); -defineSymbol(math, ams, rel, "\uE018", "\\nsupseteqq"); -defineSymbol(math, ams, rel, "\u228B", "\\supsetneq", true); -defineSymbol(math, ams, rel, "\uE01B", "\\varsupsetneq"); -defineSymbol(math, ams, rel, "\u2ACC", "\\supsetneqq", true); -defineSymbol(math, ams, rel, "\uE019", "\\varsupsetneqq"); -defineSymbol(math, ams, rel, "\u22AE", "\\nVdash", true); -defineSymbol(math, ams, rel, "\u2AB5", "\\precneqq", true); -defineSymbol(math, ams, rel, "\u2AB6", "\\succneqq", true); -defineSymbol(math, ams, rel, "\uE016", "\\nsubseteqq"); -defineSymbol(math, ams, bin, "\u22B4", "\\unlhd"); -defineSymbol(math, ams, bin, "\u22B5", "\\unrhd"); - -// AMS Negated Arrows -defineSymbol(math, ams, rel, "\u219A", "\\nleftarrow", true); -defineSymbol(math, ams, rel, "\u219B", "\\nrightarrow", true); -defineSymbol(math, ams, rel, "\u21CD", "\\nLeftarrow", true); -defineSymbol(math, ams, rel, "\u21CF", "\\nRightarrow", true); -defineSymbol(math, ams, rel, "\u21AE", "\\nleftrightarrow", true); -defineSymbol(math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); - -// AMS Misc -defineSymbol(math, ams, rel, "\u25B3", "\\vartriangle"); -defineSymbol(math, ams, textord, "\u210F", "\\hslash"); -defineSymbol(math, ams, textord, "\u25BD", "\\triangledown"); -defineSymbol(math, ams, textord, "\u25CA", "\\lozenge"); -defineSymbol(math, ams, textord, "\u24C8", "\\circledS"); -defineSymbol(math, ams, textord, "\xAE", "\\circledR"); -defineSymbol(text, ams, textord, "\xAE", "\\circledR"); -defineSymbol(math, ams, textord, "\u2221", "\\measuredangle", true); -defineSymbol(math, ams, textord, "\u2204", "\\nexists"); -defineSymbol(math, ams, textord, "\u2127", "\\mho"); -defineSymbol(math, ams, textord, "\u2132", "\\Finv", true); -defineSymbol(math, ams, textord, "\u2141", "\\Game", true); -defineSymbol(math, ams, textord, "k", "\\Bbbk"); -defineSymbol(math, ams, textord, "\u2035", "\\backprime"); -defineSymbol(math, ams, textord, "\u25B2", "\\blacktriangle"); -defineSymbol(math, ams, textord, "\u25BC", "\\blacktriangledown"); -defineSymbol(math, ams, textord, "\u25A0", "\\blacksquare"); -defineSymbol(math, ams, textord, "\u29EB", "\\blacklozenge"); -defineSymbol(math, ams, textord, "\u2605", "\\bigstar"); -defineSymbol(math, ams, textord, "\u2222", "\\sphericalangle", true); -defineSymbol(math, ams, textord, "\u2201", "\\complement", true); -// unicode-math maps U+F0 (ð) to \matheth. We map to AMS function \eth -defineSymbol(math, ams, textord, "\xF0", "\\eth", true); -defineSymbol(math, ams, textord, "\u2571", "\\diagup"); -defineSymbol(math, ams, textord, "\u2572", "\\diagdown"); -defineSymbol(math, ams, textord, "\u25A1", "\\square"); -defineSymbol(math, ams, textord, "\u25A1", "\\Box"); -defineSymbol(math, ams, textord, "\u25CA", "\\Diamond"); -// unicode-math maps U+A5 to \mathyen. We map to AMS function \yen -defineSymbol(math, ams, textord, "\xA5", "\\yen", true); -defineSymbol(math, ams, textord, "\u2713", "\\checkmark", true); -defineSymbol(text, ams, textord, "\u2713", "\\checkmark"); - -// AMS Hebrew -defineSymbol(math, ams, textord, "\u2136", "\\beth", true); -defineSymbol(math, ams, textord, "\u2138", "\\daleth", true); -defineSymbol(math, ams, textord, "\u2137", "\\gimel", true); - -// AMS Greek -defineSymbol(math, ams, textord, "\u03DD", "\\digamma"); -defineSymbol(math, ams, textord, "\u03F0", "\\varkappa"); - -// AMS Delimiters -defineSymbol(math, ams, open, "\u250C", "\\ulcorner"); -defineSymbol(math, ams, close, "\u2510", "\\urcorner"); -defineSymbol(math, ams, open, "\u2514", "\\llcorner"); -defineSymbol(math, ams, close, "\u2518", "\\lrcorner"); - -// AMS Binary Relations -defineSymbol(math, ams, rel, "\u2266", "\\leqq", true); -defineSymbol(math, ams, rel, "\u2A7D", "\\leqslant"); -defineSymbol(math, ams, rel, "\u2A95", "\\eqslantless", true); -defineSymbol(math, ams, rel, "\u2272", "\\lesssim"); -defineSymbol(math, ams, rel, "\u2A85", "\\lessapprox"); -defineSymbol(math, ams, rel, "\u224A", "\\approxeq", true); -defineSymbol(math, ams, bin, "\u22D6", "\\lessdot"); -defineSymbol(math, ams, rel, "\u22D8", "\\lll"); -defineSymbol(math, ams, rel, "\u2276", "\\lessgtr"); -defineSymbol(math, ams, rel, "\u22DA", "\\lesseqgtr"); -defineSymbol(math, ams, rel, "\u2A8B", "\\lesseqqgtr"); -defineSymbol(math, ams, rel, "\u2251", "\\doteqdot"); -defineSymbol(math, ams, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(math, ams, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(math, ams, rel, "\u223D", "\\backsim", true); -defineSymbol(math, ams, rel, "\u22CD", "\\backsimeq", true); -defineSymbol(math, ams, rel, "\u2AC5", "\\subseteqq", true); -defineSymbol(math, ams, rel, "\u22D0", "\\Subset", true); -defineSymbol(math, ams, rel, "\u228F", "\\sqsubset", true); -defineSymbol(math, ams, rel, "\u227C", "\\preccurlyeq", true); -defineSymbol(math, ams, rel, "\u22DE", "\\curlyeqprec", true); -defineSymbol(math, ams, rel, "\u227E", "\\precsim", true); -defineSymbol(math, ams, rel, "\u2AB7", "\\precapprox", true); -defineSymbol(math, ams, rel, "\u22B2", "\\vartriangleleft"); -defineSymbol(math, ams, rel, "\u22B4", "\\trianglelefteq"); -defineSymbol(math, ams, rel, "\u22A8", "\\vDash"); -defineSymbol(math, ams, rel, "\u22AA", "\\Vvdash", true); -defineSymbol(math, ams, rel, "\u2323", "\\smallsmile"); -defineSymbol(math, ams, rel, "\u2322", "\\smallfrown"); -defineSymbol(math, ams, rel, "\u224F", "\\bumpeq", true); -defineSymbol(math, ams, rel, "\u224E", "\\Bumpeq", true); -defineSymbol(math, ams, rel, "\u2267", "\\geqq", true); -defineSymbol(math, ams, rel, "\u2A7E", "\\geqslant", true); -defineSymbol(math, ams, rel, "\u2A96", "\\eqslantgtr", true); -defineSymbol(math, ams, rel, "\u2273", "\\gtrsim", true); -defineSymbol(math, ams, rel, "\u2A86", "\\gtrapprox", true); -defineSymbol(math, ams, bin, "\u22D7", "\\gtrdot"); -defineSymbol(math, ams, rel, "\u22D9", "\\ggg", true); -defineSymbol(math, ams, rel, "\u2277", "\\gtrless", true); -defineSymbol(math, ams, rel, "\u22DB", "\\gtreqless", true); -defineSymbol(math, ams, rel, "\u2A8C", "\\gtreqqless", true); -defineSymbol(math, ams, rel, "\u2256", "\\eqcirc", true); -defineSymbol(math, ams, rel, "\u2257", "\\circeq", true); -defineSymbol(math, ams, rel, "\u225C", "\\triangleq", true); -defineSymbol(math, ams, rel, "\u223C", "\\thicksim"); -defineSymbol(math, ams, rel, "\u2248", "\\thickapprox"); -defineSymbol(math, ams, rel, "\u2AC6", "\\supseteqq", true); -defineSymbol(math, ams, rel, "\u22D1", "\\Supset", true); -defineSymbol(math, ams, rel, "\u2290", "\\sqsupset", true); -defineSymbol(math, ams, rel, "\u227D", "\\succcurlyeq", true); -defineSymbol(math, ams, rel, "\u22DF", "\\curlyeqsucc", true); -defineSymbol(math, ams, rel, "\u227F", "\\succsim", true); -defineSymbol(math, ams, rel, "\u2AB8", "\\succapprox", true); -defineSymbol(math, ams, rel, "\u22B3", "\\vartriangleright"); -defineSymbol(math, ams, rel, "\u22B5", "\\trianglerighteq"); -defineSymbol(math, ams, rel, "\u22A9", "\\Vdash", true); -defineSymbol(math, ams, rel, "\u2223", "\\shortmid"); -defineSymbol(math, ams, rel, "\u2225", "\\shortparallel"); -defineSymbol(math, ams, rel, "\u226C", "\\between", true); -defineSymbol(math, ams, rel, "\u22D4", "\\pitchfork", true); -defineSymbol(math, ams, rel, "\u221D", "\\varpropto"); -defineSymbol(math, ams, rel, "\u25C0", "\\blacktriangleleft"); -// unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, ams, rel, "\u2234", "\\therefore", true); -defineSymbol(math, ams, rel, "\u220D", "\\backepsilon"); -defineSymbol(math, ams, rel, "\u25B6", "\\blacktriangleright"); -// unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, ams, rel, "\u2235", "\\because", true); -defineSymbol(math, ams, rel, "\u22D8", "\\llless"); -defineSymbol(math, ams, rel, "\u22D9", "\\gggtr"); -defineSymbol(math, ams, bin, "\u22B2", "\\lhd"); -defineSymbol(math, ams, bin, "\u22B3", "\\rhd"); -defineSymbol(math, ams, rel, "\u2242", "\\eqsim", true); -defineSymbol(math, main, rel, "\u22C8", "\\Join"); -defineSymbol(math, ams, rel, "\u2251", "\\Doteq", true); - -// AMS Binary Operators -defineSymbol(math, ams, bin, "\u2214", "\\dotplus", true); -defineSymbol(math, ams, bin, "\u2216", "\\smallsetminus"); -defineSymbol(math, ams, bin, "\u22D2", "\\Cap", true); -defineSymbol(math, ams, bin, "\u22D3", "\\Cup", true); -defineSymbol(math, ams, bin, "\u2A5E", "\\doublebarwedge", true); -defineSymbol(math, ams, bin, "\u229F", "\\boxminus", true); -defineSymbol(math, ams, bin, "\u229E", "\\boxplus", true); -defineSymbol(math, ams, bin, "\u22C7", "\\divideontimes", true); -defineSymbol(math, ams, bin, "\u22C9", "\\ltimes", true); -defineSymbol(math, ams, bin, "\u22CA", "\\rtimes", true); -defineSymbol(math, ams, bin, "\u22CB", "\\leftthreetimes", true); -defineSymbol(math, ams, bin, "\u22CC", "\\rightthreetimes", true); -defineSymbol(math, ams, bin, "\u22CF", "\\curlywedge", true); -defineSymbol(math, ams, bin, "\u22CE", "\\curlyvee", true); -defineSymbol(math, ams, bin, "\u229D", "\\circleddash", true); -defineSymbol(math, ams, bin, "\u229B", "\\circledast", true); -defineSymbol(math, ams, bin, "\u22C5", "\\centerdot"); -defineSymbol(math, ams, bin, "\u22BA", "\\intercal", true); -defineSymbol(math, ams, bin, "\u22D2", "\\doublecap"); -defineSymbol(math, ams, bin, "\u22D3", "\\doublecup"); -defineSymbol(math, ams, bin, "\u22A0", "\\boxtimes", true); - -// AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. -defineSymbol(math, ams, rel, "\u21E2", "\\dashrightarrow", true); -// unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u21E0", "\\dashleftarrow", true); -defineSymbol(math, ams, rel, "\u21C7", "\\leftleftarrows", true); -defineSymbol(math, ams, rel, "\u21C6", "\\leftrightarrows", true); -defineSymbol(math, ams, rel, "\u21DA", "\\Lleftarrow", true); -defineSymbol(math, ams, rel, "\u219E", "\\twoheadleftarrow", true); -defineSymbol(math, ams, rel, "\u21A2", "\\leftarrowtail", true); -defineSymbol(math, ams, rel, "\u21AB", "\\looparrowleft", true); -defineSymbol(math, ams, rel, "\u21CB", "\\leftrightharpoons", true); -defineSymbol(math, ams, rel, "\u21B6", "\\curvearrowleft", true); -// unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u21BA", "\\circlearrowleft", true); -defineSymbol(math, ams, rel, "\u21B0", "\\Lsh", true); -defineSymbol(math, ams, rel, "\u21C8", "\\upuparrows", true); -defineSymbol(math, ams, rel, "\u21BF", "\\upharpoonleft", true); -defineSymbol(math, ams, rel, "\u21C3", "\\downharpoonleft", true); -defineSymbol(math, ams, rel, "\u22B8", "\\multimap", true); -defineSymbol(math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true); -defineSymbol(math, ams, rel, "\u21C9", "\\rightrightarrows", true); -defineSymbol(math, ams, rel, "\u21C4", "\\rightleftarrows", true); -defineSymbol(math, ams, rel, "\u21A0", "\\twoheadrightarrow", true); -defineSymbol(math, ams, rel, "\u21A3", "\\rightarrowtail", true); -defineSymbol(math, ams, rel, "\u21AC", "\\looparrowright", true); -defineSymbol(math, ams, rel, "\u21B7", "\\curvearrowright", true); -// unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u21BB", "\\circlearrowright", true); -defineSymbol(math, ams, rel, "\u21B1", "\\Rsh", true); -defineSymbol(math, ams, rel, "\u21CA", "\\downdownarrows", true); -defineSymbol(math, ams, rel, "\u21BE", "\\upharpoonright", true); -defineSymbol(math, ams, rel, "\u21C2", "\\downharpoonright", true); -defineSymbol(math, ams, rel, "\u21DD", "\\rightsquigarrow", true); -defineSymbol(math, ams, rel, "\u21DD", "\\leadsto"); -defineSymbol(math, ams, rel, "\u21DB", "\\Rrightarrow", true); -defineSymbol(math, ams, rel, "\u21BE", "\\restriction"); - -defineSymbol(math, main, textord, "\u2018", "`"); -defineSymbol(math, main, textord, "$", "\\$"); -defineSymbol(text, main, textord, "$", "\\$"); -defineSymbol(text, main, textord, "$", "\\textdollar"); -defineSymbol(math, main, textord, "%", "\\%"); -defineSymbol(text, main, textord, "%", "\\%"); -defineSymbol(math, main, textord, "_", "\\_"); -defineSymbol(text, main, textord, "_", "\\_"); -defineSymbol(text, main, textord, "_", "\\textunderscore"); -defineSymbol(math, main, textord, "\u2220", "\\angle", true); -defineSymbol(math, main, textord, "\u221E", "\\infty", true); -defineSymbol(math, main, textord, "\u2032", "\\prime"); -defineSymbol(math, main, textord, "\u25B3", "\\triangle"); -defineSymbol(math, main, textord, "\u0393", "\\Gamma", true); -defineSymbol(math, main, textord, "\u0394", "\\Delta", true); -defineSymbol(math, main, textord, "\u0398", "\\Theta", true); -defineSymbol(math, main, textord, "\u039B", "\\Lambda", true); -defineSymbol(math, main, textord, "\u039E", "\\Xi", true); -defineSymbol(math, main, textord, "\u03A0", "\\Pi", true); -defineSymbol(math, main, textord, "\u03A3", "\\Sigma", true); -defineSymbol(math, main, textord, "\u03A5", "\\Upsilon", true); -defineSymbol(math, main, textord, "\u03A6", "\\Phi", true); -defineSymbol(math, main, textord, "\u03A8", "\\Psi", true); -defineSymbol(math, main, textord, "\u03A9", "\\Omega", true); -defineSymbol(math, main, textord, "\xAC", "\\neg"); -defineSymbol(math, main, textord, "\xAC", "\\lnot"); -defineSymbol(math, main, textord, "\u22A4", "\\top"); -defineSymbol(math, main, textord, "\u22A5", "\\bot"); -defineSymbol(math, main, textord, "\u2205", "\\emptyset"); -defineSymbol(math, ams, textord, "\u2205", "\\varnothing"); -defineSymbol(math, main, mathord, "\u03B1", "\\alpha", true); -defineSymbol(math, main, mathord, "\u03B2", "\\beta", true); -defineSymbol(math, main, mathord, "\u03B3", "\\gamma", true); -defineSymbol(math, main, mathord, "\u03B4", "\\delta", true); -defineSymbol(math, main, mathord, "\u03F5", "\\epsilon", true); -defineSymbol(math, main, mathord, "\u03B6", "\\zeta", true); -defineSymbol(math, main, mathord, "\u03B7", "\\eta", true); -defineSymbol(math, main, mathord, "\u03B8", "\\theta", true); -defineSymbol(math, main, mathord, "\u03B9", "\\iota", true); -defineSymbol(math, main, mathord, "\u03BA", "\\kappa", true); -defineSymbol(math, main, mathord, "\u03BB", "\\lambda", true); -defineSymbol(math, main, mathord, "\u03BC", "\\mu", true); -defineSymbol(math, main, mathord, "\u03BD", "\\nu", true); -defineSymbol(math, main, mathord, "\u03BE", "\\xi", true); -defineSymbol(math, main, mathord, "\u03BF", "\\omicron", true); -defineSymbol(math, main, mathord, "\u03C0", "\\pi", true); -defineSymbol(math, main, mathord, "\u03C1", "\\rho", true); -defineSymbol(math, main, mathord, "\u03C3", "\\sigma", true); -defineSymbol(math, main, mathord, "\u03C4", "\\tau", true); -defineSymbol(math, main, mathord, "\u03C5", "\\upsilon", true); -defineSymbol(math, main, mathord, "\u03D5", "\\phi", true); -defineSymbol(math, main, mathord, "\u03C7", "\\chi", true); -defineSymbol(math, main, mathord, "\u03C8", "\\psi", true); -defineSymbol(math, main, mathord, "\u03C9", "\\omega", true); -defineSymbol(math, main, mathord, "\u03B5", "\\varepsilon", true); -defineSymbol(math, main, mathord, "\u03D1", "\\vartheta", true); -defineSymbol(math, main, mathord, "\u03D6", "\\varpi", true); -defineSymbol(math, main, mathord, "\u03F1", "\\varrho", true); -defineSymbol(math, main, mathord, "\u03C2", "\\varsigma", true); -defineSymbol(math, main, mathord, "\u03C6", "\\varphi", true); -defineSymbol(math, main, bin, "\u2217", "*"); -defineSymbol(math, main, bin, "+", "+"); -defineSymbol(math, main, bin, "\u2212", "-"); -defineSymbol(math, main, bin, "\u22C5", "\\cdot", true); -defineSymbol(math, main, bin, "\u2218", "\\circ"); -defineSymbol(math, main, bin, "\xF7", "\\div", true); -defineSymbol(math, main, bin, "\xB1", "\\pm", true); -defineSymbol(math, main, bin, "\xD7", "\\times", true); -defineSymbol(math, main, bin, "\u2229", "\\cap", true); -defineSymbol(math, main, bin, "\u222A", "\\cup", true); -defineSymbol(math, main, bin, "\u2216", "\\setminus"); -defineSymbol(math, main, bin, "\u2227", "\\land"); -defineSymbol(math, main, bin, "\u2228", "\\lor"); -defineSymbol(math, main, bin, "\u2227", "\\wedge", true); -defineSymbol(math, main, bin, "\u2228", "\\vee", true); -defineSymbol(math, main, textord, "\u221A", "\\surd"); -defineSymbol(math, main, open, "(", "("); -defineSymbol(math, main, open, "[", "["); -defineSymbol(math, main, open, "\u27E8", "\\langle", true); -defineSymbol(math, main, open, "\u2223", "\\lvert"); -defineSymbol(math, main, open, "\u2225", "\\lVert"); -defineSymbol(math, main, close, ")", ")"); -defineSymbol(math, main, close, "]", "]"); -defineSymbol(math, main, close, "?", "?"); -defineSymbol(math, main, close, "!", "!"); -defineSymbol(math, main, close, "\u27E9", "\\rangle", true); -defineSymbol(math, main, close, "\u2223", "\\rvert"); -defineSymbol(math, main, close, "\u2225", "\\rVert"); -defineSymbol(math, main, rel, "=", "="); -defineSymbol(math, main, rel, "<", "<"); -defineSymbol(math, main, rel, ">", ">"); -defineSymbol(math, main, rel, ":", ":"); -defineSymbol(math, main, rel, "\u2248", "\\approx", true); -defineSymbol(math, main, rel, "\u2245", "\\cong", true); -defineSymbol(math, main, rel, "\u2265", "\\ge"); -defineSymbol(math, main, rel, "\u2265", "\\geq", true); -defineSymbol(math, main, rel, "\u2190", "\\gets"); -defineSymbol(math, main, rel, ">", "\\gt"); -defineSymbol(math, main, rel, "\u2208", "\\in", true); -defineSymbol(math, main, rel, "\u2209", "\\notin", true); -defineSymbol(math, main, rel, "\u0338", "\\not"); -defineSymbol(math, main, rel, "\u2282", "\\subset", true); -defineSymbol(math, main, rel, "\u2283", "\\supset", true); -defineSymbol(math, main, rel, "\u2286", "\\subseteq", true); -defineSymbol(math, main, rel, "\u2287", "\\supseteq", true); -defineSymbol(math, ams, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(math, ams, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(math, main, rel, "\u22A8", "\\models"); -defineSymbol(math, main, rel, "\u2190", "\\leftarrow", true); -defineSymbol(math, main, rel, "\u2264", "\\le"); -defineSymbol(math, main, rel, "\u2264", "\\leq", true); -defineSymbol(math, main, rel, "<", "\\lt"); -defineSymbol(math, main, rel, "\u2260", "\\ne", true); -defineSymbol(math, main, rel, "\u2260", "\\neq"); -defineSymbol(math, main, rel, "\u2192", "\\rightarrow", true); -defineSymbol(math, main, rel, "\u2192", "\\to"); -defineSymbol(math, ams, rel, "\u2271", "\\ngeq", true); -defineSymbol(math, ams, rel, "\u2270", "\\nleq", true); -defineSymbol(math, main, spacing, null, "\\!"); -defineSymbol(math, main, spacing, "\xA0", "\\ "); -defineSymbol(math, main, spacing, "\xA0", "~"); -defineSymbol(math, main, spacing, null, "\\,"); -defineSymbol(math, main, spacing, null, "\\:"); -defineSymbol(math, main, spacing, null, "\\;"); -defineSymbol(math, main, spacing, null, "\\enspace"); -defineSymbol(math, main, spacing, null, "\\qquad"); -defineSymbol(math, main, spacing, null, "\\quad"); -defineSymbol(math, main, spacing, "\xA0", "\\space"); -// Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% -defineSymbol(math, main, spacing, "\xA0", "\\nobreakspace"); -defineSymbol(text, main, spacing, null, "\\!"); -defineSymbol(text, main, spacing, "\xA0", "\\ "); -defineSymbol(text, main, spacing, "\xA0", "~"); -defineSymbol(text, main, spacing, null, "\\,"); -defineSymbol(text, main, spacing, null, "\\:"); -defineSymbol(text, main, spacing, null, "\\;"); -defineSymbol(text, main, spacing, null, "\\enspace"); -defineSymbol(text, main, spacing, null, "\\qquad"); -defineSymbol(text, main, spacing, null, "\\quad"); -defineSymbol(text, main, spacing, "\xA0", "\\space"); -defineSymbol(text, main, spacing, "\xA0", "\\nobreakspace"); -defineSymbol(math, main, punct, ",", ","); -defineSymbol(math, main, punct, ";", ";"); -defineSymbol(math, main, punct, ":", "\\colon"); -defineSymbol(math, ams, bin, "\u22BC", "\\barwedge", true); -defineSymbol(math, ams, bin, "\u22BB", "\\veebar", true); -defineSymbol(math, main, bin, "\u2299", "\\odot", true); -defineSymbol(math, main, bin, "\u2295", "\\oplus", true); -defineSymbol(math, main, bin, "\u2297", "\\otimes", true); -defineSymbol(math, main, textord, "\u2202", "\\partial", true); -defineSymbol(math, main, bin, "\u2298", "\\oslash", true); -defineSymbol(math, ams, bin, "\u229A", "\\circledcirc", true); -defineSymbol(math, ams, bin, "\u22A1", "\\boxdot", true); -defineSymbol(math, main, bin, "\u25B3", "\\bigtriangleup"); -defineSymbol(math, main, bin, "\u25BD", "\\bigtriangledown"); -defineSymbol(math, main, bin, "\u2020", "\\dagger"); -defineSymbol(math, main, bin, "\u22C4", "\\diamond"); -defineSymbol(math, main, bin, "\u22C6", "\\star"); -defineSymbol(math, main, bin, "\u25C3", "\\triangleleft"); -defineSymbol(math, main, bin, "\u25B9", "\\triangleright"); -defineSymbol(math, main, open, "{", "\\{"); -defineSymbol(text, main, textord, "{", "\\{"); -defineSymbol(text, main, textord, "{", "\\textbraceleft"); -defineSymbol(math, main, close, "}", "\\}"); -defineSymbol(text, main, textord, "}", "\\}"); -defineSymbol(text, main, textord, "}", "\\textbraceright"); -defineSymbol(math, main, open, "{", "\\lbrace"); -defineSymbol(math, main, close, "}", "\\rbrace"); -defineSymbol(math, main, open, "[", "\\lbrack"); -defineSymbol(math, main, close, "]", "\\rbrack"); -defineSymbol(text, main, textord, "<", "\\textless"); // in T1 fontenc -defineSymbol(text, main, textord, ">", "\\textgreater"); // in T1 fontenc -defineSymbol(math, main, open, "\u230A", "\\lfloor"); -defineSymbol(math, main, close, "\u230B", "\\rfloor"); -defineSymbol(math, main, open, "\u2308", "\\lceil"); -defineSymbol(math, main, close, "\u2309", "\\rceil"); -defineSymbol(math, main, textord, "\\", "\\backslash"); -defineSymbol(math, main, textord, "\u2223", "|"); -defineSymbol(math, main, textord, "\u2223", "\\vert"); -defineSymbol(text, main, textord, "|", "\\textbar"); // in T1 fontenc -defineSymbol(math, main, textord, "\u2225", "\\|"); -defineSymbol(math, main, textord, "\u2225", "\\Vert"); -defineSymbol(text, main, textord, "\u2225", "\\textbardbl"); -defineSymbol(math, main, rel, "\u2191", "\\uparrow", true); -defineSymbol(math, main, rel, "\u21D1", "\\Uparrow", true); -defineSymbol(math, main, rel, "\u2193", "\\downarrow", true); -defineSymbol(math, main, rel, "\u21D3", "\\Downarrow", true); -defineSymbol(math, main, rel, "\u2195", "\\updownarrow", true); -defineSymbol(math, main, rel, "\u21D5", "\\Updownarrow", true); -defineSymbol(math, main, op, "\u2210", "\\coprod"); -defineSymbol(math, main, op, "\u22C1", "\\bigvee"); -defineSymbol(math, main, op, "\u22C0", "\\bigwedge"); -defineSymbol(math, main, op, "\u2A04", "\\biguplus"); -defineSymbol(math, main, op, "\u22C2", "\\bigcap"); -defineSymbol(math, main, op, "\u22C3", "\\bigcup"); -defineSymbol(math, main, op, "\u222B", "\\int"); -defineSymbol(math, main, op, "\u222B", "\\intop"); -defineSymbol(math, main, op, "\u222C", "\\iint"); -defineSymbol(math, main, op, "\u222D", "\\iiint"); -defineSymbol(math, main, op, "\u220F", "\\prod"); -defineSymbol(math, main, op, "\u2211", "\\sum"); -defineSymbol(math, main, op, "\u2A02", "\\bigotimes"); -defineSymbol(math, main, op, "\u2A01", "\\bigoplus"); -defineSymbol(math, main, op, "\u2A00", "\\bigodot"); -defineSymbol(math, main, op, "\u222E", "\\oint"); -defineSymbol(math, main, op, "\u2A06", "\\bigsqcup"); -defineSymbol(math, main, op, "\u222B", "\\smallint"); -defineSymbol(text, main, inner, "\u2026", "\\textellipsis"); -defineSymbol(math, main, inner, "\u2026", "\\mathellipsis"); -defineSymbol(text, main, inner, "\u2026", "\\ldots", true); -defineSymbol(math, main, inner, "\u2026", "\\ldots", true); -defineSymbol(math, main, inner, "\u22EF", "\\@cdots", true); -defineSymbol(math, main, inner, "\u22F1", "\\ddots", true); -defineSymbol(math, main, textord, "\u22EE", "\\vdots", true); -defineSymbol(math, main, accent, "\u02CA", "\\acute"); -defineSymbol(math, main, accent, "\u02CB", "\\grave"); -defineSymbol(math, main, accent, "\xA8", "\\ddot"); -defineSymbol(math, main, accent, "~", "\\tilde"); -defineSymbol(math, main, accent, "\u02C9", "\\bar"); -defineSymbol(math, main, accent, "\u02D8", "\\breve"); -defineSymbol(math, main, accent, "\u02C7", "\\check"); -defineSymbol(math, main, accent, "^", "\\hat"); -defineSymbol(math, main, accent, "\u20D7", "\\vec"); -defineSymbol(math, main, accent, "\u02D9", "\\dot"); -defineSymbol(math, main, accent, "\u02DA", "\\mathring"); -defineSymbol(math, main, mathord, "\u0131", "\\imath", true); -defineSymbol(math, main, mathord, "\u0237", "\\jmath", true); -defineSymbol(text, main, textord, "\u0131", "\\i", true); -defineSymbol(text, main, textord, "\u0237", "\\j", true); -defineSymbol(text, main, textord, "\xDF", "\\ss", true); -defineSymbol(text, main, textord, "\xE6", "\\ae", true); -defineSymbol(text, main, textord, "\xE6", "\\ae", true); -defineSymbol(text, main, textord, "\u0153", "\\oe", true); -defineSymbol(text, main, textord, "\xF8", "\\o", true); -defineSymbol(text, main, textord, "\xC6", "\\AE", true); -defineSymbol(text, main, textord, "\u0152", "\\OE", true); -defineSymbol(text, main, textord, "\xD8", "\\O", true); -defineSymbol(text, main, accent, "\u02CA", "\\'"); // acute -defineSymbol(text, main, accent, "\u02CB", "\\`"); // grave -defineSymbol(text, main, accent, "\u02C6", "\\^"); // circumflex -defineSymbol(text, main, accent, "\u02DC", "\\~"); // tilde -defineSymbol(text, main, accent, "\u02C9", "\\="); // macron -defineSymbol(text, main, accent, "\u02D8", "\\u"); // breve -defineSymbol(text, main, accent, "\u02D9", "\\."); // dot above -defineSymbol(text, main, accent, "\u02DA", "\\r"); // ring above -defineSymbol(text, main, accent, "\u02C7", "\\v"); // caron -defineSymbol(text, main, accent, "\xA8", '\\"'); // diaresis -defineSymbol(text, main, accent, "\u02DD", "\\H"); // double acute - -defineSymbol(text, main, textord, "\u2013", "--"); -defineSymbol(text, main, textord, "\u2013", "\\textendash"); -defineSymbol(text, main, textord, "\u2014", "---"); -defineSymbol(text, main, textord, "\u2014", "\\textemdash"); -defineSymbol(text, main, textord, "\u2018", "`"); -defineSymbol(text, main, textord, "\u2018", "\\textquoteleft"); -defineSymbol(text, main, textord, "\u2019", "'"); -defineSymbol(text, main, textord, "\u2019", "\\textquoteright"); -defineSymbol(text, main, textord, "\u201C", "``"); -defineSymbol(text, main, textord, "\u201C", "\\textquotedblleft"); -defineSymbol(text, main, textord, "\u201D", "''"); -defineSymbol(text, main, textord, "\u201D", "\\textquotedblright"); -defineSymbol(math, main, textord, "\xB0", "\\degree"); -defineSymbol(text, main, textord, "\xB0", "\\degree"); -// TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Italic defines this character "163". -defineSymbol(math, main, mathord, "\xA3", "\\pounds"); -defineSymbol(math, main, mathord, "\xA3", "\\mathsterling", true); -defineSymbol(text, main, mathord, "\xA3", "\\pounds"); -defineSymbol(text, main, mathord, "\xA3", "\\textsterling", true); -defineSymbol(math, ams, textord, "\u2720", "\\maltese"); -defineSymbol(text, ams, textord, "\u2720", "\\maltese"); - -defineSymbol(text, main, spacing, "\xA0", "\\ "); -defineSymbol(text, main, spacing, "\xA0", " "); -defineSymbol(text, main, spacing, "\xA0", "~"); - -// There are lots of symbols which are the same, so we add them in afterwards. - -// All of these are textords in math mode -var mathTextSymbols = "0123456789/@.\""; -for (var i = 0; i < mathTextSymbols.length; i++) { - var ch = mathTextSymbols.charAt(i); - defineSymbol(math, main, textord, ch, ch); -} - -// All of these are textords in text mode -var textSymbols = "0123456789!@*()-=+[]<>|\";:?/.,"; -for (var _i = 0; _i < textSymbols.length; _i++) { - var _ch = textSymbols.charAt(_i); - defineSymbol(text, main, textord, _ch, _ch); -} - -// All of these are textords in text mode, and mathords in math mode -var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; -for (var _i2 = 0; _i2 < letters.length; _i2++) { - var _ch2 = letters.charAt(_i2); - defineSymbol(math, main, mathord, _ch2, _ch2); - defineSymbol(text, main, textord, _ch2, _ch2); -} - -// We add these Latin-1 letters as symbols for backwards-compatibility, -// but they are not actually in the font, nor are they supported by the -// Unicode accent mechanism, so they fall back to Times font and look ugly. -// TODO(edemaine): Fix this. -var extraLatin = "ÇÐÞçþ"; -for (var _i3 = 0; _i3 < extraLatin.length; _i3++) { - var _ch3 = extraLatin.charAt(_i3); - defineSymbol(math, main, mathord, _ch3, _ch3); - defineSymbol(text, main, textord, _ch3, _ch3); -} -defineSymbol(text, main, textord, "ð", "ð"); - -// Unicode versions of existing characters -defineSymbol(text, main, textord, "\u2013", "–"); -defineSymbol(text, main, textord, "\u2014", "—"); -defineSymbol(text, main, textord, "\u2018", "‘"); -defineSymbol(text, main, textord, "\u2019", "’"); -defineSymbol(text, main, textord, "\u201C", "“"); -defineSymbol(text, main, textord, "\u201D", "”"); - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.13 ToObject(argument) -var defined = __webpack_require__(38); -module.exports = function(it){ - return Object(defined(it)); + return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom"; }; -/***/ }), -/* 30 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +var assert = function assert(value) { + if (!value) { + throw new Error('Expected non-null, but got ' + String(value)); + } -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__unicodeScripts__ = __webpack_require__(42); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__ = __webpack_require__(59); + return value; +}; +/* harmony default export */ var utils = ({ + contains: contains, + deflt: deflt, + escape: utils_escape, + hyphenate: hyphenate, + getBaseElem: getBaseElem, + isCharacterBox: utils_isCharacterBox +}); +// CONCATENATED MODULE: ./src/Settings.js +/* eslint no-console:0 */ + +/** + * This is a module for storing settings passed into KaTeX. It correctly handles + * default settings. + */ + + + + +/** + * The main Settings object + * + * The current options stored are: + * - displayMode: Whether the expression should be typeset as inline math + * (false, the default), meaning that the math starts in + * \textstyle and is placed in an inline-block); or as display + * math (true), meaning that the math starts in \displaystyle + * and is placed in a block with vertical margin. + */ +var Settings_Settings = +/*#__PURE__*/ +function () { + function Settings(options) { + this.displayMode = void 0; + this.leqno = void 0; + this.fleqn = void 0; + this.throwOnError = void 0; + this.errorColor = void 0; + this.macros = void 0; + this.colorIsTextColor = void 0; + this.strict = void 0; + this.maxSize = void 0; + this.maxExpand = void 0; + this.allowedProtocols = void 0; + // allow null options + options = options || {}; + this.displayMode = utils.deflt(options.displayMode, false); + this.leqno = utils.deflt(options.leqno, false); + this.fleqn = utils.deflt(options.fleqn, false); + this.throwOnError = utils.deflt(options.throwOnError, true); + this.errorColor = utils.deflt(options.errorColor, "#cc0000"); + this.macros = options.macros || {}; + this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); + this.strict = utils.deflt(options.strict, "warn"); + this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity)); + this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); + this.allowedProtocols = utils.deflt(options.allowedProtocols, ["http", "https", "mailto", "_relative"]); + } + /** + * Report nonstrict (non-LaTeX-compatible) input. + * Can safely not be called if `this.strict` is false in JavaScript. + */ + + + var _proto = Settings.prototype; + + _proto.reportNonstrict = function reportNonstrict(errorCode, errorMsg, token) { + var strict = this.strict; + + if (typeof strict === "function") { + // Allow return value of strict function to be boolean or string + // (or null/undefined, meaning no further processing). + strict = strict(errorCode, errorMsg, token); + } + + if (!strict || strict === "ignore") { + return; + } else if (strict === true || strict === "error") { + throw new src_ParseError("LaTeX-incompatible input and strict mode is set to 'error': " + (errorMsg + " [" + errorCode + "]"), token); + } else if (strict === "warn") { + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); + } else { + // won't happen in type-safe code + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); + } + } + /** + * Check whether to apply strict (LaTeX-adhering) behavior for unusual + * input (like `\\`). Unlike `nonstrict`, will not throw an error; + * instead, "error" translates to a return value of `true`, while "ignore" + * translates to a return value of `false`. May still print a warning: + * "warn" prints a warning and returns `false`. + * This is for the second category of `errorCode`s listed in the README. + */ + ; + + _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) { + var strict = this.strict; + + if (typeof strict === "function") { + // Allow return value of strict function to be boolean or string + // (or null/undefined, meaning no further processing). + // But catch any exceptions thrown by function, treating them + // like "error". + try { + strict = strict(errorCode, errorMsg, token); + } catch (error) { + strict = "error"; + } + } + + if (!strict || strict === "ignore") { + return false; + } else if (strict === true || strict === "error") { + return true; + } else if (strict === "warn") { + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); + return false; + } else { + // won't happen in type-safe code + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); + return false; + } + }; + + return Settings; +}(); + +/* harmony default export */ var src_Settings = (Settings_Settings); +// CONCATENATED MODULE: ./src/Style.js +/** + * This file contains information and classes for the various kinds of styles + * used in TeX. It provides a generic `Style` class, which holds information + * about a specific style. It then provides instances of all the different kinds + * of styles possible, and provides functions to move between them and get + * information about them. + */ + +/** + * The main style class. Contains a unique id for the style, a size (which is + * the same for cramped and uncramped version of a style), and a cramped flag. + */ +var Style = +/*#__PURE__*/ +function () { + function Style(id, size, cramped) { + this.id = void 0; + this.size = void 0; + this.cramped = void 0; + this.id = id; + this.size = size; + this.cramped = cramped; + } + /** + * Get the style of a superscript given a base in the current style. + */ + + + var _proto = Style.prototype; + + _proto.sup = function sup() { + return Style_styles[_sup[this.id]]; + } + /** + * Get the style of a subscript given a base in the current style. + */ + ; + + _proto.sub = function sub() { + return Style_styles[_sub[this.id]]; + } + /** + * Get the style of a fraction numerator given the fraction in the current + * style. + */ + ; + + _proto.fracNum = function fracNum() { + return Style_styles[_fracNum[this.id]]; + } + /** + * Get the style of a fraction denominator given the fraction in the current + * style. + */ + ; + + _proto.fracDen = function fracDen() { + return Style_styles[_fracDen[this.id]]; + } + /** + * Get the cramped version of a style (in particular, cramping a cramped style + * doesn't change the style). + */ + ; + + _proto.cramp = function cramp() { + return Style_styles[_cramp[this.id]]; + } + /** + * Get a text or display version of this style. + */ + ; + + _proto.text = function text() { + return Style_styles[_text[this.id]]; + } + /** + * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle) + */ + ; + + _proto.isTight = function isTight() { + return this.size >= 2; + }; + + return Style; +}(); // Export an interface for type checking, but don't expose the implementation. +// This way, no more styles can be generated. + + +// IDs of the different styles +var D = 0; +var Dc = 1; +var T = 2; +var Tc = 3; +var S = 4; +var Sc = 5; +var SS = 6; +var SSc = 7; // Instances of the different styles + +var Style_styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another + +var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc]; +var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc]; +var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc]; +var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc]; +var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc]; +var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles. + +/* harmony default export */ var src_Style = ({ + DISPLAY: Style_styles[D], + TEXT: Style_styles[T], + SCRIPT: Style_styles[S], + SCRIPTSCRIPT: Style_styles[SS] +}); +// CONCATENATED MODULE: ./src/unicodeScripts.js +/* + * This file defines the Unicode scripts and script families that we + * support. To add new scripts or families, just add a new entry to the + * scriptData array below. Adding scripts to the scriptData array allows + * characters from that script to appear in \text{} environments. + */ + +/** + * Each script or script family has a name and an array of blocks. + * Each block is an array of two numbers which specify the start and + * end points (inclusive) of a block of Unicode codepoints. + */ + +/** + * Unicode block data for the families of scripts we support in \text{}. + * Scripts only need to appear here if they do not have font metrics. + */ +var scriptData = [{ + // Latin characters beyond the Latin-1 characters we have metrics for. + // Needed for Czech, Hungarian and Turkish text, for example. + name: 'latin', + blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B + [0x0300, 0x036f]] +}, { + // The Cyrillic script used by Russian and related languages. + // A Cyrillic subset used to be supported as explicitly defined + // symbols in symbols.js + name: 'cyrillic', + blocks: [[0x0400, 0x04ff]] +}, { + // The Brahmic scripts of South and Southeast Asia + // Devanagari (0900–097F) + // Bengali (0980–09FF) + // Gurmukhi (0A00–0A7F) + // Gujarati (0A80–0AFF) + // Oriya (0B00–0B7F) + // Tamil (0B80–0BFF) + // Telugu (0C00–0C7F) + // Kannada (0C80–0CFF) + // Malayalam (0D00–0D7F) + // Sinhala (0D80–0DFF) + // Thai (0E00–0E7F) + // Lao (0E80–0EFF) + // Tibetan (0F00–0FFF) + // Myanmar (1000–109F) + name: 'brahmic', + blocks: [[0x0900, 0x109F]] +}, { + name: 'georgian', + blocks: [[0x10A0, 0x10ff]] +}, { + // Chinese and Japanese. + // The "k" in cjk is for Korean, but we've separated Korean out + name: "cjk", + blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana + [0x4E00, 0x9FAF], // CJK ideograms + [0xFF00, 0xFF60]] +}, { + // Korean + name: 'hangul', + blocks: [[0xAC00, 0xD7AF]] +}]; +/** + * Given a codepoint, return the name of the script or script family + * it is from, or null if it is not part of a known block + */ + +function scriptFromCodepoint(codepoint) { + for (var i = 0; i < scriptData.length; i++) { + var script = scriptData[i]; + + for (var _i = 0; _i < script.blocks.length; _i++) { + var block = script.blocks[_i]; + + if (codepoint >= block[0] && codepoint <= block[1]) { + return script.name; + } + } + } + + return null; +} +/** + * A flattened version of all the supported blocks in a single array. + * This is an optimization to make supportedCodepoint() fast. + */ + +var allBlocks = []; +scriptData.forEach(function (s) { + return s.blocks.forEach(function (b) { + return allBlocks.push.apply(allBlocks, b); + }); +}); +/** + * Given a codepoint, return true if it falls within one of the + * scripts or script families defined above and false otherwise. + * + * Micro benchmarks shows that this is faster than + * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test() + * in Firefox, Chrome and Node. + */ + +function supportedCodepoint(codepoint) { + for (var i = 0; i < allBlocks.length; i += 2) { + if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) { + return true; + } + } + + return false; +} +// CONCATENATED MODULE: ./src/svgGeometry.js +/** + * This file provides support to domTree.js + * It's a storehouse of path geometry for SVG images. + */ +// In all paths below, the viewBox-to-em scale is 1000:1. +var hLinePad = 80; // padding above a sqrt viniculum. + +var svgGeometry_path = { + // sqrtMain path geometry is from glyph U221A in the font KaTeX Main + // All surds have 80 units padding above the viniculumn. + sqrtMain: "M95," + (622 + hLinePad) + "c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\ns-65,47,-65,47z M834 " + hLinePad + "H400000v40H845z", + // size1 is from glyph U221A in the font KaTeX_Size1-Regular + sqrtSize1: "M263," + (601 + hLinePad) + "c0.7,0,18,39.7,52,119c34,79.3,68.167,\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\ns76,-59,76,-59s76,-60,76,-60z M1001 " + hLinePad + "H40000v40H1012z", + // size2 is from glyph U221A in the font KaTeX_Size2-Regular + // The 80 units padding is most obvious here. Note start node at M1001 80. + sqrtSize2: "M1001," + hLinePad + "H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\nM1001 " + hLinePad + "H400000v40H1013z", + // size3 is from glyph U221A in the font KaTeX_Size3-Regular + sqrtSize3: "M424," + (2398 + hLinePad) + "c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M1001 " + hLinePad + "H400000v40H1014z", + // size4 is from glyph U221A in the font KaTeX_Size4-Regular + sqrtSize4: "M473," + (2713 + hLinePad) + "c339.3,-1799.3,509.3,-2700,510,-2702\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\nM1001 " + hLinePad + "H400000v40H1017z", + // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main + doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", + // doublerightarrow is from glyph U+21D2 in font KaTeX Main + doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z", + // leftarrow is from glyph U+2190 in font KaTeX Main + leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z", + // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular + leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z", + leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z", + // overgroup is from the MnSymbol package (public domain) + leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z", + leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z", + // Harpoons are from glyph U+21BD in font KaTeX Main + leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z", + leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z", + leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z", + leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z", + // hook is from glyph U+21A9 in font KaTeX Main + lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z", + leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z", + leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z", + // tofrom is from glyph U+21C4 in font KaTeX AMS Regular + leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z", + longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z", + midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z", + midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z", + oiintSize1: "M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z", + oiintSize2: "M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z", + oiiintSize1: "M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z", + oiiintSize2: "M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z", + rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z", + rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z", + rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z", + rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z", + rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z", + rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z", + rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z", + rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z", + rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z", + righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z", + rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z", + rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z", + // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular + twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z", + twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z", + // tilde1 is a modified version of a glyph from the MnSymbol package + tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z", + // ditto tilde2, tilde3, & tilde4 + tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z", + tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z", + tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z", + // vec is from glyph U+20D7 in font KaTeX Main + vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z", + // widehat1 is a modified version of a glyph from the MnSymbol package + widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z", + // ditto widehat2, widehat3, & widehat4 + widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", + widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", + widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", + // widecheck paths are all inverted versions of widehat + widecheck1: "M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z", + widecheck2: "M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", + widecheck3: "M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", + widecheck4: "M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", + // The next ten paths support reaction arrows from the mhchem package. + // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX + // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main + baraboveleftarrow: "M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z", + // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main + rightarrowabovebar: "M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z", + // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end. + // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em + baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z", + rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z", + shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", + shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" +}; +/* harmony default export */ var svgGeometry = ({ + path: svgGeometry_path +}); +// CONCATENATED MODULE: ./src/tree.js + + +/** + * This node represents a document fragment, which contains elements, but when + * placed into the DOM doesn't have any representation itself. It only contains + * children and doesn't have any DOM node properties. + */ +var tree_DocumentFragment = +/*#__PURE__*/ +function () { + // HtmlDomNode + // Never used; needed for satisfying interface. + function DocumentFragment(children) { + this.children = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.maxFontSize = void 0; + this.style = void 0; + this.children = children; + this.classes = []; + this.height = 0; + this.depth = 0; + this.maxFontSize = 0; + this.style = {}; + } + + var _proto = DocumentFragment.prototype; + + _proto.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + } + /** Convert the fragment into a node. */ + ; + + _proto.toNode = function toNode() { + var frag = document.createDocumentFragment(); + + for (var i = 0; i < this.children.length; i++) { + frag.appendChild(this.children[i].toNode()); + } + + return frag; + } + /** Convert the fragment into HTML markup. */ + ; + + _proto.toMarkup = function toMarkup() { + var markup = ""; // Simply concatenate the markup for the children together. + + for (var i = 0; i < this.children.length; i++) { + markup += this.children[i].toMarkup(); + } + + return markup; + } + /** + * Converts the math node into a string, similar to innerText. Applies to + * MathDomNode's only. + */ + ; + + _proto.toText = function toText() { + // To avoid this, we would subclass documentFragment separately for + // MathML, but polyfills for subclassing is expensive per PR 1469. + // $FlowFixMe: Only works for ChildType = MathDomNode. + var toText = function toText(child) { + return child.toText(); + }; + + return this.children.map(toText).join(""); + }; + + return DocumentFragment; +}(); +// CONCATENATED MODULE: ./src/domTree.js +/** + * These objects store the data about the DOM nodes we create, as well as some + * extra data. They can then be transformed into real DOM nodes with the + * `toNode` function or HTML markup using `toMarkup`. They are useful for both + * storing extra properties on the nodes, as well as providing a way to easily + * work with the DOM. + * + * Similar functions for working with MathML nodes exist in mathMLTree.js. + * + * TODO: refactor `span` and `anchor` into common superclass when + * target environments support class inheritance + */ + + + + + +/** + * Create an HTML className based on a list of classes. In addition to joining + * with spaces, we also remove empty classes. + */ +var createClass = function createClass(classes) { + return classes.filter(function (cls) { + return cls; + }).join(" "); +}; + +var initNode = function initNode(classes, options, style) { + this.classes = classes || []; + this.attributes = {}; + this.height = 0; + this.depth = 0; + this.maxFontSize = 0; + this.style = style || {}; + + if (options) { + if (options.style.isTight()) { + this.classes.push("mtight"); + } + + var color = options.getColor(); + + if (color) { + this.style.color = color; + } + } +}; +/** + * Convert into an HTML node + */ + + +var _toNode = function toNode(tagName) { + var node = document.createElement(tagName); // Apply the class + + node.className = createClass(this.classes); // Apply inline styles + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + // $FlowFixMe Flow doesn't seem to understand span.style's type. + node.style[style] = this.style[style]; + } + } // Apply attributes + + + for (var attr in this.attributes) { + if (this.attributes.hasOwnProperty(attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } // Append the children, also as HTML nodes + + + for (var i = 0; i < this.children.length; i++) { + node.appendChild(this.children[i].toNode()); + } + + return node; +}; +/** + * Convert into an HTML markup string + */ + + +var _toMarkup = function toMarkup(tagName) { + var markup = "<" + tagName; // Add the class + + if (this.classes.length) { + markup += " class=\"" + utils.escape(createClass(this.classes)) + "\""; + } + + var styles = ""; // Add the styles, after hyphenation + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; + } + } + + if (styles) { + markup += " style=\"" + utils.escape(styles) + "\""; + } // Add the attributes + + + for (var attr in this.attributes) { + if (this.attributes.hasOwnProperty(attr)) { + markup += " " + attr + "=\"" + utils.escape(this.attributes[attr]) + "\""; + } + } + + markup += ">"; // Add the markup of the children, also as markup + + for (var i = 0; i < this.children.length; i++) { + markup += this.children[i].toMarkup(); + } + + markup += "</" + tagName + ">"; + return markup; +}; // Making the type below exact with all optional fields doesn't work due to +// - https://github.com/facebook/flow/issues/4582 +// - https://github.com/facebook/flow/issues/5688 +// However, since *all* fields are optional, $Shape<> works as suggested in 5688 +// above. +// This type does not include all CSS properties. Additional properties should +// be added as needed. + + +/** + * This node represents a span node, with a className, a list of children, and + * an inline style. It also contains information about its height, depth, and + * maxFontSize. + * + * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan + * otherwise. This typesafety is important when HTML builders access a span's + * children. + */ +var domTree_Span = +/*#__PURE__*/ +function () { + function Span(classes, children, options, style) { + this.children = void 0; + this.attributes = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.width = void 0; + this.maxFontSize = void 0; + this.style = void 0; + initNode.call(this, classes, options, style); + this.children = children || []; + } + /** + * Sets an arbitrary attribute on the span. Warning: use this wisely. Not + * all browsers support attributes the same, and having too many custom + * attributes is probably bad. + */ + + + var _proto = Span.prototype; + + _proto.setAttribute = function setAttribute(attribute, value) { + this.attributes[attribute] = value; + }; + + _proto.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + }; + + _proto.toNode = function toNode() { + return _toNode.call(this, "span"); + }; + + _proto.toMarkup = function toMarkup() { + return _toMarkup.call(this, "span"); + }; + + return Span; +}(); +/** + * This node represents an anchor (<a>) element with a hyperlink. See `span` + * for further details. + */ + +var domTree_Anchor = +/*#__PURE__*/ +function () { + function Anchor(href, classes, children, options) { + this.children = void 0; + this.attributes = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.maxFontSize = void 0; + this.style = void 0; + initNode.call(this, classes, options); + this.children = children || []; + this.setAttribute('href', href); + } + + var _proto2 = Anchor.prototype; + + _proto2.setAttribute = function setAttribute(attribute, value) { + this.attributes[attribute] = value; + }; + + _proto2.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + }; + + _proto2.toNode = function toNode() { + return _toNode.call(this, "a"); + }; + + _proto2.toMarkup = function toMarkup() { + return _toMarkup.call(this, "a"); + }; + + return Anchor; +}(); +/** + * This node represents an image embed (<img>) element. + */ + +var domTree_Img = +/*#__PURE__*/ +function () { + function Img(src, alt, style) { + this.src = void 0; + this.alt = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.maxFontSize = void 0; + this.style = void 0; + this.alt = alt; + this.src = src; + this.classes = ["mord"]; + this.style = style; + } + + var _proto3 = Img.prototype; + + _proto3.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + }; + + _proto3.toNode = function toNode() { + var node = document.createElement("img"); + node.src = this.src; + node.alt = this.alt; + node.className = "mord"; // Apply inline styles + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + // $FlowFixMe + node.style[style] = this.style[style]; + } + } + + return node; + }; + + _proto3.toMarkup = function toMarkup() { + var markup = "<img src='" + this.src + " 'alt='" + this.alt + "' "; // Add the styles, after hyphenation + + var styles = ""; + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; + } + } + + if (styles) { + markup += " style=\"" + utils.escape(styles) + "\""; + } + + markup += "'/>"; + return markup; + }; + + return Img; +}(); +var iCombinations = { + 'î': "\u0131\u0302", + 'ï': "\u0131\u0308", + 'í': "\u0131\u0301", + // 'ī': '\u0131\u0304', // enable when we add Extended Latin + 'ì': "\u0131\u0300" +}; +/** + * A symbol node contains information about a single symbol. It either renders + * to a single text node, or a span with a single text node in it, depending on + * whether it has CSS classes, styles, or needs italic correction. + */ + +var domTree_SymbolNode = +/*#__PURE__*/ +function () { + function SymbolNode(text, height, depth, italic, skew, width, classes, style) { + this.text = void 0; + this.height = void 0; + this.depth = void 0; + this.italic = void 0; + this.skew = void 0; + this.width = void 0; + this.maxFontSize = void 0; + this.classes = void 0; + this.style = void 0; + this.text = text; + this.height = height || 0; + this.depth = depth || 0; + this.italic = italic || 0; + this.skew = skew || 0; + this.width = width || 0; + this.classes = classes || []; + this.style = style || {}; + this.maxFontSize = 0; // Mark text from non-Latin scripts with specific classes so that we + // can specify which fonts to use. This allows us to render these + // characters with a serif font in situations where the browser would + // either default to a sans serif or render a placeholder character. + // We use CSS class names like cjk_fallback, hangul_fallback and + // brahmic_fallback. See ./unicodeScripts.js for the set of possible + // script names + + var script = scriptFromCodepoint(this.text.charCodeAt(0)); + + if (script) { + this.classes.push(script + "_fallback"); + } + + if (/[îïíì]/.test(this.text)) { + // add ī when we add Extended Latin + this.text = iCombinations[this.text]; + } + } + + var _proto4 = SymbolNode.prototype; + + _proto4.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + } + /** + * Creates a text node or span from a symbol node. Note that a span is only + * created if it is needed. + */ + ; + + _proto4.toNode = function toNode() { + var node = document.createTextNode(this.text); + var span = null; + + if (this.italic > 0) { + span = document.createElement("span"); + span.style.marginRight = this.italic + "em"; + } + + if (this.classes.length > 0) { + span = span || document.createElement("span"); + span.className = createClass(this.classes); + } + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + span = span || document.createElement("span"); // $FlowFixMe Flow doesn't seem to understand span.style's type. + + span.style[style] = this.style[style]; + } + } + + if (span) { + span.appendChild(node); + return span; + } else { + return node; + } + } + /** + * Creates markup for a symbol node. + */ + ; + + _proto4.toMarkup = function toMarkup() { + // TODO(alpert): More duplication than I'd like from + // span.prototype.toMarkup and symbolNode.prototype.toNode... + var needsSpan = false; + var markup = "<span"; + + if (this.classes.length) { + needsSpan = true; + markup += " class=\""; + markup += utils.escape(createClass(this.classes)); + markup += "\""; + } + + var styles = ""; + + if (this.italic > 0) { + styles += "margin-right:" + this.italic + "em;"; + } + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; + } + } + + if (styles) { + needsSpan = true; + markup += " style=\"" + utils.escape(styles) + "\""; + } + + var escaped = utils.escape(this.text); + + if (needsSpan) { + markup += ">"; + markup += escaped; + markup += "</span>"; + return markup; + } else { + return escaped; + } + }; + + return SymbolNode; +}(); +/** + * SVG nodes are used to render stretchy wide elements. + */ + +var SvgNode = +/*#__PURE__*/ +function () { + function SvgNode(children, attributes) { + this.children = void 0; + this.attributes = void 0; + this.children = children || []; + this.attributes = attributes || {}; + } + + var _proto5 = SvgNode.prototype; + + _proto5.toNode = function toNode() { + var svgNS = "http://www.w3.org/2000/svg"; + var node = document.createElementNS(svgNS, "svg"); // Apply attributes + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } + + for (var i = 0; i < this.children.length; i++) { + node.appendChild(this.children[i].toNode()); + } + + return node; + }; + + _proto5.toMarkup = function toMarkup() { + var markup = "<svg"; // Apply attributes + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + markup += " " + attr + "='" + this.attributes[attr] + "'"; + } + } + + markup += ">"; + + for (var i = 0; i < this.children.length; i++) { + markup += this.children[i].toMarkup(); + } + + markup += "</svg>"; + return markup; + }; + + return SvgNode; +}(); +var domTree_PathNode = +/*#__PURE__*/ +function () { + function PathNode(pathName, alternate) { + this.pathName = void 0; + this.alternate = void 0; + this.pathName = pathName; + this.alternate = alternate; // Used only for tall \sqrt + } + + var _proto6 = PathNode.prototype; + + _proto6.toNode = function toNode() { + var svgNS = "http://www.w3.org/2000/svg"; + var node = document.createElementNS(svgNS, "path"); + + if (this.alternate) { + node.setAttribute("d", this.alternate); + } else { + node.setAttribute("d", svgGeometry.path[this.pathName]); + } + + return node; + }; + + _proto6.toMarkup = function toMarkup() { + if (this.alternate) { + return "<path d='" + this.alternate + "'/>"; + } else { + return "<path d='" + svgGeometry.path[this.pathName] + "'/>"; + } + }; + + return PathNode; +}(); +var LineNode = +/*#__PURE__*/ +function () { + function LineNode(attributes) { + this.attributes = void 0; + this.attributes = attributes || {}; + } + + var _proto7 = LineNode.prototype; + + _proto7.toNode = function toNode() { + var svgNS = "http://www.w3.org/2000/svg"; + var node = document.createElementNS(svgNS, "line"); // Apply attributes + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } + + return node; + }; + + _proto7.toMarkup = function toMarkup() { + var markup = "<line"; + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + markup += " " + attr + "='" + this.attributes[attr] + "'"; + } + } + + markup += "/>"; + return markup; + }; + + return LineNode; +}(); +function assertSymbolDomNode(group) { + if (group instanceof domTree_SymbolNode) { + return group; + } else { + throw new Error("Expected symbolNode but got " + String(group) + "."); + } +} +function assertSpan(group) { + if (group instanceof domTree_Span) { + return group; + } else { + throw new Error("Expected span<HtmlDomNode> but got " + String(group) + "."); + } +} +// CONCATENATED MODULE: ./submodules/katex-fonts/fontMetricsData.js +// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY. +/* harmony default export */ var fontMetricsData = ({ + "AMS-Regular": { + "65": [0, 0.68889, 0, 0, 0.72222], + "66": [0, 0.68889, 0, 0, 0.66667], + "67": [0, 0.68889, 0, 0, 0.72222], + "68": [0, 0.68889, 0, 0, 0.72222], + "69": [0, 0.68889, 0, 0, 0.66667], + "70": [0, 0.68889, 0, 0, 0.61111], + "71": [0, 0.68889, 0, 0, 0.77778], + "72": [0, 0.68889, 0, 0, 0.77778], + "73": [0, 0.68889, 0, 0, 0.38889], + "74": [0.16667, 0.68889, 0, 0, 0.5], + "75": [0, 0.68889, 0, 0, 0.77778], + "76": [0, 0.68889, 0, 0, 0.66667], + "77": [0, 0.68889, 0, 0, 0.94445], + "78": [0, 0.68889, 0, 0, 0.72222], + "79": [0.16667, 0.68889, 0, 0, 0.77778], + "80": [0, 0.68889, 0, 0, 0.61111], + "81": [0.16667, 0.68889, 0, 0, 0.77778], + "82": [0, 0.68889, 0, 0, 0.72222], + "83": [0, 0.68889, 0, 0, 0.55556], + "84": [0, 0.68889, 0, 0, 0.66667], + "85": [0, 0.68889, 0, 0, 0.72222], + "86": [0, 0.68889, 0, 0, 0.72222], + "87": [0, 0.68889, 0, 0, 1.0], + "88": [0, 0.68889, 0, 0, 0.72222], + "89": [0, 0.68889, 0, 0, 0.72222], + "90": [0, 0.68889, 0, 0, 0.66667], + "107": [0, 0.68889, 0, 0, 0.55556], + "165": [0, 0.675, 0.025, 0, 0.75], + "174": [0.15559, 0.69224, 0, 0, 0.94666], + "240": [0, 0.68889, 0, 0, 0.55556], + "295": [0, 0.68889, 0, 0, 0.54028], + "710": [0, 0.825, 0, 0, 2.33334], + "732": [0, 0.9, 0, 0, 2.33334], + "770": [0, 0.825, 0, 0, 2.33334], + "771": [0, 0.9, 0, 0, 2.33334], + "989": [0.08167, 0.58167, 0, 0, 0.77778], + "1008": [0, 0.43056, 0.04028, 0, 0.66667], + "8245": [0, 0.54986, 0, 0, 0.275], + "8463": [0, 0.68889, 0, 0, 0.54028], + "8487": [0, 0.68889, 0, 0, 0.72222], + "8498": [0, 0.68889, 0, 0, 0.55556], + "8502": [0, 0.68889, 0, 0, 0.66667], + "8503": [0, 0.68889, 0, 0, 0.44445], + "8504": [0, 0.68889, 0, 0, 0.66667], + "8513": [0, 0.68889, 0, 0, 0.63889], + "8592": [-0.03598, 0.46402, 0, 0, 0.5], + "8594": [-0.03598, 0.46402, 0, 0, 0.5], + "8602": [-0.13313, 0.36687, 0, 0, 1.0], + "8603": [-0.13313, 0.36687, 0, 0, 1.0], + "8606": [0.01354, 0.52239, 0, 0, 1.0], + "8608": [0.01354, 0.52239, 0, 0, 1.0], + "8610": [0.01354, 0.52239, 0, 0, 1.11111], + "8611": [0.01354, 0.52239, 0, 0, 1.11111], + "8619": [0, 0.54986, 0, 0, 1.0], + "8620": [0, 0.54986, 0, 0, 1.0], + "8621": [-0.13313, 0.37788, 0, 0, 1.38889], + "8622": [-0.13313, 0.36687, 0, 0, 1.0], + "8624": [0, 0.69224, 0, 0, 0.5], + "8625": [0, 0.69224, 0, 0, 0.5], + "8630": [0, 0.43056, 0, 0, 1.0], + "8631": [0, 0.43056, 0, 0, 1.0], + "8634": [0.08198, 0.58198, 0, 0, 0.77778], + "8635": [0.08198, 0.58198, 0, 0, 0.77778], + "8638": [0.19444, 0.69224, 0, 0, 0.41667], + "8639": [0.19444, 0.69224, 0, 0, 0.41667], + "8642": [0.19444, 0.69224, 0, 0, 0.41667], + "8643": [0.19444, 0.69224, 0, 0, 0.41667], + "8644": [0.1808, 0.675, 0, 0, 1.0], + "8646": [0.1808, 0.675, 0, 0, 1.0], + "8647": [0.1808, 0.675, 0, 0, 1.0], + "8648": [0.19444, 0.69224, 0, 0, 0.83334], + "8649": [0.1808, 0.675, 0, 0, 1.0], + "8650": [0.19444, 0.69224, 0, 0, 0.83334], + "8651": [0.01354, 0.52239, 0, 0, 1.0], + "8652": [0.01354, 0.52239, 0, 0, 1.0], + "8653": [-0.13313, 0.36687, 0, 0, 1.0], + "8654": [-0.13313, 0.36687, 0, 0, 1.0], + "8655": [-0.13313, 0.36687, 0, 0, 1.0], + "8666": [0.13667, 0.63667, 0, 0, 1.0], + "8667": [0.13667, 0.63667, 0, 0, 1.0], + "8669": [-0.13313, 0.37788, 0, 0, 1.0], + "8672": [-0.064, 0.437, 0, 0, 1.334], + "8674": [-0.064, 0.437, 0, 0, 1.334], + "8705": [0, 0.825, 0, 0, 0.5], + "8708": [0, 0.68889, 0, 0, 0.55556], + "8709": [0.08167, 0.58167, 0, 0, 0.77778], + "8717": [0, 0.43056, 0, 0, 0.42917], + "8722": [-0.03598, 0.46402, 0, 0, 0.5], + "8724": [0.08198, 0.69224, 0, 0, 0.77778], + "8726": [0.08167, 0.58167, 0, 0, 0.77778], + "8733": [0, 0.69224, 0, 0, 0.77778], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8737": [0, 0.69224, 0, 0, 0.72222], + "8738": [0.03517, 0.52239, 0, 0, 0.72222], + "8739": [0.08167, 0.58167, 0, 0, 0.22222], + "8740": [0.25142, 0.74111, 0, 0, 0.27778], + "8741": [0.08167, 0.58167, 0, 0, 0.38889], + "8742": [0.25142, 0.74111, 0, 0, 0.5], + "8756": [0, 0.69224, 0, 0, 0.66667], + "8757": [0, 0.69224, 0, 0, 0.66667], + "8764": [-0.13313, 0.36687, 0, 0, 0.77778], + "8765": [-0.13313, 0.37788, 0, 0, 0.77778], + "8769": [-0.13313, 0.36687, 0, 0, 0.77778], + "8770": [-0.03625, 0.46375, 0, 0, 0.77778], + "8774": [0.30274, 0.79383, 0, 0, 0.77778], + "8776": [-0.01688, 0.48312, 0, 0, 0.77778], + "8778": [0.08167, 0.58167, 0, 0, 0.77778], + "8782": [0.06062, 0.54986, 0, 0, 0.77778], + "8783": [0.06062, 0.54986, 0, 0, 0.77778], + "8785": [0.08198, 0.58198, 0, 0, 0.77778], + "8786": [0.08198, 0.58198, 0, 0, 0.77778], + "8787": [0.08198, 0.58198, 0, 0, 0.77778], + "8790": [0, 0.69224, 0, 0, 0.77778], + "8791": [0.22958, 0.72958, 0, 0, 0.77778], + "8796": [0.08198, 0.91667, 0, 0, 0.77778], + "8806": [0.25583, 0.75583, 0, 0, 0.77778], + "8807": [0.25583, 0.75583, 0, 0, 0.77778], + "8808": [0.25142, 0.75726, 0, 0, 0.77778], + "8809": [0.25142, 0.75726, 0, 0, 0.77778], + "8812": [0.25583, 0.75583, 0, 0, 0.5], + "8814": [0.20576, 0.70576, 0, 0, 0.77778], + "8815": [0.20576, 0.70576, 0, 0, 0.77778], + "8816": [0.30274, 0.79383, 0, 0, 0.77778], + "8817": [0.30274, 0.79383, 0, 0, 0.77778], + "8818": [0.22958, 0.72958, 0, 0, 0.77778], + "8819": [0.22958, 0.72958, 0, 0, 0.77778], + "8822": [0.1808, 0.675, 0, 0, 0.77778], + "8823": [0.1808, 0.675, 0, 0, 0.77778], + "8828": [0.13667, 0.63667, 0, 0, 0.77778], + "8829": [0.13667, 0.63667, 0, 0, 0.77778], + "8830": [0.22958, 0.72958, 0, 0, 0.77778], + "8831": [0.22958, 0.72958, 0, 0, 0.77778], + "8832": [0.20576, 0.70576, 0, 0, 0.77778], + "8833": [0.20576, 0.70576, 0, 0, 0.77778], + "8840": [0.30274, 0.79383, 0, 0, 0.77778], + "8841": [0.30274, 0.79383, 0, 0, 0.77778], + "8842": [0.13597, 0.63597, 0, 0, 0.77778], + "8843": [0.13597, 0.63597, 0, 0, 0.77778], + "8847": [0.03517, 0.54986, 0, 0, 0.77778], + "8848": [0.03517, 0.54986, 0, 0, 0.77778], + "8858": [0.08198, 0.58198, 0, 0, 0.77778], + "8859": [0.08198, 0.58198, 0, 0, 0.77778], + "8861": [0.08198, 0.58198, 0, 0, 0.77778], + "8862": [0, 0.675, 0, 0, 0.77778], + "8863": [0, 0.675, 0, 0, 0.77778], + "8864": [0, 0.675, 0, 0, 0.77778], + "8865": [0, 0.675, 0, 0, 0.77778], + "8872": [0, 0.69224, 0, 0, 0.61111], + "8873": [0, 0.69224, 0, 0, 0.72222], + "8874": [0, 0.69224, 0, 0, 0.88889], + "8876": [0, 0.68889, 0, 0, 0.61111], + "8877": [0, 0.68889, 0, 0, 0.61111], + "8878": [0, 0.68889, 0, 0, 0.72222], + "8879": [0, 0.68889, 0, 0, 0.72222], + "8882": [0.03517, 0.54986, 0, 0, 0.77778], + "8883": [0.03517, 0.54986, 0, 0, 0.77778], + "8884": [0.13667, 0.63667, 0, 0, 0.77778], + "8885": [0.13667, 0.63667, 0, 0, 0.77778], + "8888": [0, 0.54986, 0, 0, 1.11111], + "8890": [0.19444, 0.43056, 0, 0, 0.55556], + "8891": [0.19444, 0.69224, 0, 0, 0.61111], + "8892": [0.19444, 0.69224, 0, 0, 0.61111], + "8901": [0, 0.54986, 0, 0, 0.27778], + "8903": [0.08167, 0.58167, 0, 0, 0.77778], + "8905": [0.08167, 0.58167, 0, 0, 0.77778], + "8906": [0.08167, 0.58167, 0, 0, 0.77778], + "8907": [0, 0.69224, 0, 0, 0.77778], + "8908": [0, 0.69224, 0, 0, 0.77778], + "8909": [-0.03598, 0.46402, 0, 0, 0.77778], + "8910": [0, 0.54986, 0, 0, 0.76042], + "8911": [0, 0.54986, 0, 0, 0.76042], + "8912": [0.03517, 0.54986, 0, 0, 0.77778], + "8913": [0.03517, 0.54986, 0, 0, 0.77778], + "8914": [0, 0.54986, 0, 0, 0.66667], + "8915": [0, 0.54986, 0, 0, 0.66667], + "8916": [0, 0.69224, 0, 0, 0.66667], + "8918": [0.0391, 0.5391, 0, 0, 0.77778], + "8919": [0.0391, 0.5391, 0, 0, 0.77778], + "8920": [0.03517, 0.54986, 0, 0, 1.33334], + "8921": [0.03517, 0.54986, 0, 0, 1.33334], + "8922": [0.38569, 0.88569, 0, 0, 0.77778], + "8923": [0.38569, 0.88569, 0, 0, 0.77778], + "8926": [0.13667, 0.63667, 0, 0, 0.77778], + "8927": [0.13667, 0.63667, 0, 0, 0.77778], + "8928": [0.30274, 0.79383, 0, 0, 0.77778], + "8929": [0.30274, 0.79383, 0, 0, 0.77778], + "8934": [0.23222, 0.74111, 0, 0, 0.77778], + "8935": [0.23222, 0.74111, 0, 0, 0.77778], + "8936": [0.23222, 0.74111, 0, 0, 0.77778], + "8937": [0.23222, 0.74111, 0, 0, 0.77778], + "8938": [0.20576, 0.70576, 0, 0, 0.77778], + "8939": [0.20576, 0.70576, 0, 0, 0.77778], + "8940": [0.30274, 0.79383, 0, 0, 0.77778], + "8941": [0.30274, 0.79383, 0, 0, 0.77778], + "8994": [0.19444, 0.69224, 0, 0, 0.77778], + "8995": [0.19444, 0.69224, 0, 0, 0.77778], + "9416": [0.15559, 0.69224, 0, 0, 0.90222], + "9484": [0, 0.69224, 0, 0, 0.5], + "9488": [0, 0.69224, 0, 0, 0.5], + "9492": [0, 0.37788, 0, 0, 0.5], + "9496": [0, 0.37788, 0, 0, 0.5], + "9585": [0.19444, 0.68889, 0, 0, 0.88889], + "9586": [0.19444, 0.74111, 0, 0, 0.88889], + "9632": [0, 0.675, 0, 0, 0.77778], + "9633": [0, 0.675, 0, 0, 0.77778], + "9650": [0, 0.54986, 0, 0, 0.72222], + "9651": [0, 0.54986, 0, 0, 0.72222], + "9654": [0.03517, 0.54986, 0, 0, 0.77778], + "9660": [0, 0.54986, 0, 0, 0.72222], + "9661": [0, 0.54986, 0, 0, 0.72222], + "9664": [0.03517, 0.54986, 0, 0, 0.77778], + "9674": [0.11111, 0.69224, 0, 0, 0.66667], + "9733": [0.19444, 0.69224, 0, 0, 0.94445], + "10003": [0, 0.69224, 0, 0, 0.83334], + "10016": [0, 0.69224, 0, 0, 0.83334], + "10731": [0.11111, 0.69224, 0, 0, 0.66667], + "10846": [0.19444, 0.75583, 0, 0, 0.61111], + "10877": [0.13667, 0.63667, 0, 0, 0.77778], + "10878": [0.13667, 0.63667, 0, 0, 0.77778], + "10885": [0.25583, 0.75583, 0, 0, 0.77778], + "10886": [0.25583, 0.75583, 0, 0, 0.77778], + "10887": [0.13597, 0.63597, 0, 0, 0.77778], + "10888": [0.13597, 0.63597, 0, 0, 0.77778], + "10889": [0.26167, 0.75726, 0, 0, 0.77778], + "10890": [0.26167, 0.75726, 0, 0, 0.77778], + "10891": [0.48256, 0.98256, 0, 0, 0.77778], + "10892": [0.48256, 0.98256, 0, 0, 0.77778], + "10901": [0.13667, 0.63667, 0, 0, 0.77778], + "10902": [0.13667, 0.63667, 0, 0, 0.77778], + "10933": [0.25142, 0.75726, 0, 0, 0.77778], + "10934": [0.25142, 0.75726, 0, 0, 0.77778], + "10935": [0.26167, 0.75726, 0, 0, 0.77778], + "10936": [0.26167, 0.75726, 0, 0, 0.77778], + "10937": [0.26167, 0.75726, 0, 0, 0.77778], + "10938": [0.26167, 0.75726, 0, 0, 0.77778], + "10949": [0.25583, 0.75583, 0, 0, 0.77778], + "10950": [0.25583, 0.75583, 0, 0, 0.77778], + "10955": [0.28481, 0.79383, 0, 0, 0.77778], + "10956": [0.28481, 0.79383, 0, 0, 0.77778], + "57350": [0.08167, 0.58167, 0, 0, 0.22222], + "57351": [0.08167, 0.58167, 0, 0, 0.38889], + "57352": [0.08167, 0.58167, 0, 0, 0.77778], + "57353": [0, 0.43056, 0.04028, 0, 0.66667], + "57356": [0.25142, 0.75726, 0, 0, 0.77778], + "57357": [0.25142, 0.75726, 0, 0, 0.77778], + "57358": [0.41951, 0.91951, 0, 0, 0.77778], + "57359": [0.30274, 0.79383, 0, 0, 0.77778], + "57360": [0.30274, 0.79383, 0, 0, 0.77778], + "57361": [0.41951, 0.91951, 0, 0, 0.77778], + "57366": [0.25142, 0.75726, 0, 0, 0.77778], + "57367": [0.25142, 0.75726, 0, 0, 0.77778], + "57368": [0.25142, 0.75726, 0, 0, 0.77778], + "57369": [0.25142, 0.75726, 0, 0, 0.77778], + "57370": [0.13597, 0.63597, 0, 0, 0.77778], + "57371": [0.13597, 0.63597, 0, 0, 0.77778] + }, + "Caligraphic-Regular": { + "48": [0, 0.43056, 0, 0, 0.5], + "49": [0, 0.43056, 0, 0, 0.5], + "50": [0, 0.43056, 0, 0, 0.5], + "51": [0.19444, 0.43056, 0, 0, 0.5], + "52": [0.19444, 0.43056, 0, 0, 0.5], + "53": [0.19444, 0.43056, 0, 0, 0.5], + "54": [0, 0.64444, 0, 0, 0.5], + "55": [0.19444, 0.43056, 0, 0, 0.5], + "56": [0, 0.64444, 0, 0, 0.5], + "57": [0.19444, 0.43056, 0, 0, 0.5], + "65": [0, 0.68333, 0, 0.19445, 0.79847], + "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], + "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], + "68": [0, 0.68333, 0.02778, 0.08334, 0.77139], + "69": [0, 0.68333, 0.08944, 0.11111, 0.52778], + "70": [0, 0.68333, 0.09931, 0.11111, 0.71875], + "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487], + "72": [0, 0.68333, 0.00965, 0.11111, 0.84452], + "73": [0, 0.68333, 0.07382, 0, 0.54452], + "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778], + "75": [0, 0.68333, 0.01445, 0.05556, 0.76195], + "76": [0, 0.68333, 0, 0.13889, 0.68972], + "77": [0, 0.68333, 0, 0.13889, 1.2009], + "78": [0, 0.68333, 0.14736, 0.08334, 0.82049], + "79": [0, 0.68333, 0.02778, 0.11111, 0.79611], + "80": [0, 0.68333, 0.08222, 0.08334, 0.69556], + "81": [0.09722, 0.68333, 0, 0.11111, 0.81667], + "82": [0, 0.68333, 0, 0.08334, 0.8475], + "83": [0, 0.68333, 0.075, 0.13889, 0.60556], + "84": [0, 0.68333, 0.25417, 0, 0.54464], + "85": [0, 0.68333, 0.09931, 0.08334, 0.62583], + "86": [0, 0.68333, 0.08222, 0, 0.61278], + "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], + "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], + "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], + "90": [0, 0.68333, 0.07944, 0.13889, 0.72473] + }, + "Fraktur-Regular": { + "33": [0, 0.69141, 0, 0, 0.29574], + "34": [0, 0.69141, 0, 0, 0.21471], + "38": [0, 0.69141, 0, 0, 0.73786], + "39": [0, 0.69141, 0, 0, 0.21201], + "40": [0.24982, 0.74947, 0, 0, 0.38865], + "41": [0.24982, 0.74947, 0, 0, 0.38865], + "42": [0, 0.62119, 0, 0, 0.27764], + "43": [0.08319, 0.58283, 0, 0, 0.75623], + "44": [0, 0.10803, 0, 0, 0.27764], + "45": [0.08319, 0.58283, 0, 0, 0.75623], + "46": [0, 0.10803, 0, 0, 0.27764], + "47": [0.24982, 0.74947, 0, 0, 0.50181], + "48": [0, 0.47534, 0, 0, 0.50181], + "49": [0, 0.47534, 0, 0, 0.50181], + "50": [0, 0.47534, 0, 0, 0.50181], + "51": [0.18906, 0.47534, 0, 0, 0.50181], + "52": [0.18906, 0.47534, 0, 0, 0.50181], + "53": [0.18906, 0.47534, 0, 0, 0.50181], + "54": [0, 0.69141, 0, 0, 0.50181], + "55": [0.18906, 0.47534, 0, 0, 0.50181], + "56": [0, 0.69141, 0, 0, 0.50181], + "57": [0.18906, 0.47534, 0, 0, 0.50181], + "58": [0, 0.47534, 0, 0, 0.21606], + "59": [0.12604, 0.47534, 0, 0, 0.21606], + "61": [-0.13099, 0.36866, 0, 0, 0.75623], + "63": [0, 0.69141, 0, 0, 0.36245], + "65": [0, 0.69141, 0, 0, 0.7176], + "66": [0, 0.69141, 0, 0, 0.88397], + "67": [0, 0.69141, 0, 0, 0.61254], + "68": [0, 0.69141, 0, 0, 0.83158], + "69": [0, 0.69141, 0, 0, 0.66278], + "70": [0.12604, 0.69141, 0, 0, 0.61119], + "71": [0, 0.69141, 0, 0, 0.78539], + "72": [0.06302, 0.69141, 0, 0, 0.7203], + "73": [0, 0.69141, 0, 0, 0.55448], + "74": [0.12604, 0.69141, 0, 0, 0.55231], + "75": [0, 0.69141, 0, 0, 0.66845], + "76": [0, 0.69141, 0, 0, 0.66602], + "77": [0, 0.69141, 0, 0, 1.04953], + "78": [0, 0.69141, 0, 0, 0.83212], + "79": [0, 0.69141, 0, 0, 0.82699], + "80": [0.18906, 0.69141, 0, 0, 0.82753], + "81": [0.03781, 0.69141, 0, 0, 0.82699], + "82": [0, 0.69141, 0, 0, 0.82807], + "83": [0, 0.69141, 0, 0, 0.82861], + "84": [0, 0.69141, 0, 0, 0.66899], + "85": [0, 0.69141, 0, 0, 0.64576], + "86": [0, 0.69141, 0, 0, 0.83131], + "87": [0, 0.69141, 0, 0, 1.04602], + "88": [0, 0.69141, 0, 0, 0.71922], + "89": [0.18906, 0.69141, 0, 0, 0.83293], + "90": [0.12604, 0.69141, 0, 0, 0.60201], + "91": [0.24982, 0.74947, 0, 0, 0.27764], + "93": [0.24982, 0.74947, 0, 0, 0.27764], + "94": [0, 0.69141, 0, 0, 0.49965], + "97": [0, 0.47534, 0, 0, 0.50046], + "98": [0, 0.69141, 0, 0, 0.51315], + "99": [0, 0.47534, 0, 0, 0.38946], + "100": [0, 0.62119, 0, 0, 0.49857], + "101": [0, 0.47534, 0, 0, 0.40053], + "102": [0.18906, 0.69141, 0, 0, 0.32626], + "103": [0.18906, 0.47534, 0, 0, 0.5037], + "104": [0.18906, 0.69141, 0, 0, 0.52126], + "105": [0, 0.69141, 0, 0, 0.27899], + "106": [0, 0.69141, 0, 0, 0.28088], + "107": [0, 0.69141, 0, 0, 0.38946], + "108": [0, 0.69141, 0, 0, 0.27953], + "109": [0, 0.47534, 0, 0, 0.76676], + "110": [0, 0.47534, 0, 0, 0.52666], + "111": [0, 0.47534, 0, 0, 0.48885], + "112": [0.18906, 0.52396, 0, 0, 0.50046], + "113": [0.18906, 0.47534, 0, 0, 0.48912], + "114": [0, 0.47534, 0, 0, 0.38919], + "115": [0, 0.47534, 0, 0, 0.44266], + "116": [0, 0.62119, 0, 0, 0.33301], + "117": [0, 0.47534, 0, 0, 0.5172], + "118": [0, 0.52396, 0, 0, 0.5118], + "119": [0, 0.52396, 0, 0, 0.77351], + "120": [0.18906, 0.47534, 0, 0, 0.38865], + "121": [0.18906, 0.47534, 0, 0, 0.49884], + "122": [0.18906, 0.47534, 0, 0, 0.39054], + "8216": [0, 0.69141, 0, 0, 0.21471], + "8217": [0, 0.69141, 0, 0, 0.21471], + "58112": [0, 0.62119, 0, 0, 0.49749], + "58113": [0, 0.62119, 0, 0, 0.4983], + "58114": [0.18906, 0.69141, 0, 0, 0.33328], + "58115": [0.18906, 0.69141, 0, 0, 0.32923], + "58116": [0.18906, 0.47534, 0, 0, 0.50343], + "58117": [0, 0.69141, 0, 0, 0.33301], + "58118": [0, 0.62119, 0, 0, 0.33409], + "58119": [0, 0.47534, 0, 0, 0.50073] + }, + "Main-Bold": { + "33": [0, 0.69444, 0, 0, 0.35], + "34": [0, 0.69444, 0, 0, 0.60278], + "35": [0.19444, 0.69444, 0, 0, 0.95833], + "36": [0.05556, 0.75, 0, 0, 0.575], + "37": [0.05556, 0.75, 0, 0, 0.95833], + "38": [0, 0.69444, 0, 0, 0.89444], + "39": [0, 0.69444, 0, 0, 0.31944], + "40": [0.25, 0.75, 0, 0, 0.44722], + "41": [0.25, 0.75, 0, 0, 0.44722], + "42": [0, 0.75, 0, 0, 0.575], + "43": [0.13333, 0.63333, 0, 0, 0.89444], + "44": [0.19444, 0.15556, 0, 0, 0.31944], + "45": [0, 0.44444, 0, 0, 0.38333], + "46": [0, 0.15556, 0, 0, 0.31944], + "47": [0.25, 0.75, 0, 0, 0.575], + "48": [0, 0.64444, 0, 0, 0.575], + "49": [0, 0.64444, 0, 0, 0.575], + "50": [0, 0.64444, 0, 0, 0.575], + "51": [0, 0.64444, 0, 0, 0.575], + "52": [0, 0.64444, 0, 0, 0.575], + "53": [0, 0.64444, 0, 0, 0.575], + "54": [0, 0.64444, 0, 0, 0.575], + "55": [0, 0.64444, 0, 0, 0.575], + "56": [0, 0.64444, 0, 0, 0.575], + "57": [0, 0.64444, 0, 0, 0.575], + "58": [0, 0.44444, 0, 0, 0.31944], + "59": [0.19444, 0.44444, 0, 0, 0.31944], + "60": [0.08556, 0.58556, 0, 0, 0.89444], + "61": [-0.10889, 0.39111, 0, 0, 0.89444], + "62": [0.08556, 0.58556, 0, 0, 0.89444], + "63": [0, 0.69444, 0, 0, 0.54305], + "64": [0, 0.69444, 0, 0, 0.89444], + "65": [0, 0.68611, 0, 0, 0.86944], + "66": [0, 0.68611, 0, 0, 0.81805], + "67": [0, 0.68611, 0, 0, 0.83055], + "68": [0, 0.68611, 0, 0, 0.88194], + "69": [0, 0.68611, 0, 0, 0.75555], + "70": [0, 0.68611, 0, 0, 0.72361], + "71": [0, 0.68611, 0, 0, 0.90416], + "72": [0, 0.68611, 0, 0, 0.9], + "73": [0, 0.68611, 0, 0, 0.43611], + "74": [0, 0.68611, 0, 0, 0.59444], + "75": [0, 0.68611, 0, 0, 0.90138], + "76": [0, 0.68611, 0, 0, 0.69166], + "77": [0, 0.68611, 0, 0, 1.09166], + "78": [0, 0.68611, 0, 0, 0.9], + "79": [0, 0.68611, 0, 0, 0.86388], + "80": [0, 0.68611, 0, 0, 0.78611], + "81": [0.19444, 0.68611, 0, 0, 0.86388], + "82": [0, 0.68611, 0, 0, 0.8625], + "83": [0, 0.68611, 0, 0, 0.63889], + "84": [0, 0.68611, 0, 0, 0.8], + "85": [0, 0.68611, 0, 0, 0.88472], + "86": [0, 0.68611, 0.01597, 0, 0.86944], + "87": [0, 0.68611, 0.01597, 0, 1.18888], + "88": [0, 0.68611, 0, 0, 0.86944], + "89": [0, 0.68611, 0.02875, 0, 0.86944], + "90": [0, 0.68611, 0, 0, 0.70277], + "91": [0.25, 0.75, 0, 0, 0.31944], + "92": [0.25, 0.75, 0, 0, 0.575], + "93": [0.25, 0.75, 0, 0, 0.31944], + "94": [0, 0.69444, 0, 0, 0.575], + "95": [0.31, 0.13444, 0.03194, 0, 0.575], + "97": [0, 0.44444, 0, 0, 0.55902], + "98": [0, 0.69444, 0, 0, 0.63889], + "99": [0, 0.44444, 0, 0, 0.51111], + "100": [0, 0.69444, 0, 0, 0.63889], + "101": [0, 0.44444, 0, 0, 0.52708], + "102": [0, 0.69444, 0.10903, 0, 0.35139], + "103": [0.19444, 0.44444, 0.01597, 0, 0.575], + "104": [0, 0.69444, 0, 0, 0.63889], + "105": [0, 0.69444, 0, 0, 0.31944], + "106": [0.19444, 0.69444, 0, 0, 0.35139], + "107": [0, 0.69444, 0, 0, 0.60694], + "108": [0, 0.69444, 0, 0, 0.31944], + "109": [0, 0.44444, 0, 0, 0.95833], + "110": [0, 0.44444, 0, 0, 0.63889], + "111": [0, 0.44444, 0, 0, 0.575], + "112": [0.19444, 0.44444, 0, 0, 0.63889], + "113": [0.19444, 0.44444, 0, 0, 0.60694], + "114": [0, 0.44444, 0, 0, 0.47361], + "115": [0, 0.44444, 0, 0, 0.45361], + "116": [0, 0.63492, 0, 0, 0.44722], + "117": [0, 0.44444, 0, 0, 0.63889], + "118": [0, 0.44444, 0.01597, 0, 0.60694], + "119": [0, 0.44444, 0.01597, 0, 0.83055], + "120": [0, 0.44444, 0, 0, 0.60694], + "121": [0.19444, 0.44444, 0.01597, 0, 0.60694], + "122": [0, 0.44444, 0, 0, 0.51111], + "123": [0.25, 0.75, 0, 0, 0.575], + "124": [0.25, 0.75, 0, 0, 0.31944], + "125": [0.25, 0.75, 0, 0, 0.575], + "126": [0.35, 0.34444, 0, 0, 0.575], + "168": [0, 0.69444, 0, 0, 0.575], + "172": [0, 0.44444, 0, 0, 0.76666], + "176": [0, 0.69444, 0, 0, 0.86944], + "177": [0.13333, 0.63333, 0, 0, 0.89444], + "184": [0.17014, 0, 0, 0, 0.51111], + "198": [0, 0.68611, 0, 0, 1.04166], + "215": [0.13333, 0.63333, 0, 0, 0.89444], + "216": [0.04861, 0.73472, 0, 0, 0.89444], + "223": [0, 0.69444, 0, 0, 0.59722], + "230": [0, 0.44444, 0, 0, 0.83055], + "247": [0.13333, 0.63333, 0, 0, 0.89444], + "248": [0.09722, 0.54167, 0, 0, 0.575], + "305": [0, 0.44444, 0, 0, 0.31944], + "338": [0, 0.68611, 0, 0, 1.16944], + "339": [0, 0.44444, 0, 0, 0.89444], + "567": [0.19444, 0.44444, 0, 0, 0.35139], + "710": [0, 0.69444, 0, 0, 0.575], + "711": [0, 0.63194, 0, 0, 0.575], + "713": [0, 0.59611, 0, 0, 0.575], + "714": [0, 0.69444, 0, 0, 0.575], + "715": [0, 0.69444, 0, 0, 0.575], + "728": [0, 0.69444, 0, 0, 0.575], + "729": [0, 0.69444, 0, 0, 0.31944], + "730": [0, 0.69444, 0, 0, 0.86944], + "732": [0, 0.69444, 0, 0, 0.575], + "733": [0, 0.69444, 0, 0, 0.575], + "915": [0, 0.68611, 0, 0, 0.69166], + "916": [0, 0.68611, 0, 0, 0.95833], + "920": [0, 0.68611, 0, 0, 0.89444], + "923": [0, 0.68611, 0, 0, 0.80555], + "926": [0, 0.68611, 0, 0, 0.76666], + "928": [0, 0.68611, 0, 0, 0.9], + "931": [0, 0.68611, 0, 0, 0.83055], + "933": [0, 0.68611, 0, 0, 0.89444], + "934": [0, 0.68611, 0, 0, 0.83055], + "936": [0, 0.68611, 0, 0, 0.89444], + "937": [0, 0.68611, 0, 0, 0.83055], + "8211": [0, 0.44444, 0.03194, 0, 0.575], + "8212": [0, 0.44444, 0.03194, 0, 1.14999], + "8216": [0, 0.69444, 0, 0, 0.31944], + "8217": [0, 0.69444, 0, 0, 0.31944], + "8220": [0, 0.69444, 0, 0, 0.60278], + "8221": [0, 0.69444, 0, 0, 0.60278], + "8224": [0.19444, 0.69444, 0, 0, 0.51111], + "8225": [0.19444, 0.69444, 0, 0, 0.51111], + "8242": [0, 0.55556, 0, 0, 0.34444], + "8407": [0, 0.72444, 0.15486, 0, 0.575], + "8463": [0, 0.69444, 0, 0, 0.66759], + "8465": [0, 0.69444, 0, 0, 0.83055], + "8467": [0, 0.69444, 0, 0, 0.47361], + "8472": [0.19444, 0.44444, 0, 0, 0.74027], + "8476": [0, 0.69444, 0, 0, 0.83055], + "8501": [0, 0.69444, 0, 0, 0.70277], + "8592": [-0.10889, 0.39111, 0, 0, 1.14999], + "8593": [0.19444, 0.69444, 0, 0, 0.575], + "8594": [-0.10889, 0.39111, 0, 0, 1.14999], + "8595": [0.19444, 0.69444, 0, 0, 0.575], + "8596": [-0.10889, 0.39111, 0, 0, 1.14999], + "8597": [0.25, 0.75, 0, 0, 0.575], + "8598": [0.19444, 0.69444, 0, 0, 1.14999], + "8599": [0.19444, 0.69444, 0, 0, 1.14999], + "8600": [0.19444, 0.69444, 0, 0, 1.14999], + "8601": [0.19444, 0.69444, 0, 0, 1.14999], + "8636": [-0.10889, 0.39111, 0, 0, 1.14999], + "8637": [-0.10889, 0.39111, 0, 0, 1.14999], + "8640": [-0.10889, 0.39111, 0, 0, 1.14999], + "8641": [-0.10889, 0.39111, 0, 0, 1.14999], + "8656": [-0.10889, 0.39111, 0, 0, 1.14999], + "8657": [0.19444, 0.69444, 0, 0, 0.70277], + "8658": [-0.10889, 0.39111, 0, 0, 1.14999], + "8659": [0.19444, 0.69444, 0, 0, 0.70277], + "8660": [-0.10889, 0.39111, 0, 0, 1.14999], + "8661": [0.25, 0.75, 0, 0, 0.70277], + "8704": [0, 0.69444, 0, 0, 0.63889], + "8706": [0, 0.69444, 0.06389, 0, 0.62847], + "8707": [0, 0.69444, 0, 0, 0.63889], + "8709": [0.05556, 0.75, 0, 0, 0.575], + "8711": [0, 0.68611, 0, 0, 0.95833], + "8712": [0.08556, 0.58556, 0, 0, 0.76666], + "8715": [0.08556, 0.58556, 0, 0, 0.76666], + "8722": [0.13333, 0.63333, 0, 0, 0.89444], + "8723": [0.13333, 0.63333, 0, 0, 0.89444], + "8725": [0.25, 0.75, 0, 0, 0.575], + "8726": [0.25, 0.75, 0, 0, 0.575], + "8727": [-0.02778, 0.47222, 0, 0, 0.575], + "8728": [-0.02639, 0.47361, 0, 0, 0.575], + "8729": [-0.02639, 0.47361, 0, 0, 0.575], + "8730": [0.18, 0.82, 0, 0, 0.95833], + "8733": [0, 0.44444, 0, 0, 0.89444], + "8734": [0, 0.44444, 0, 0, 1.14999], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8739": [0.25, 0.75, 0, 0, 0.31944], + "8741": [0.25, 0.75, 0, 0, 0.575], + "8743": [0, 0.55556, 0, 0, 0.76666], + "8744": [0, 0.55556, 0, 0, 0.76666], + "8745": [0, 0.55556, 0, 0, 0.76666], + "8746": [0, 0.55556, 0, 0, 0.76666], + "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875], + "8764": [-0.10889, 0.39111, 0, 0, 0.89444], + "8768": [0.19444, 0.69444, 0, 0, 0.31944], + "8771": [0.00222, 0.50222, 0, 0, 0.89444], + "8776": [0.02444, 0.52444, 0, 0, 0.89444], + "8781": [0.00222, 0.50222, 0, 0, 0.89444], + "8801": [0.00222, 0.50222, 0, 0, 0.89444], + "8804": [0.19667, 0.69667, 0, 0, 0.89444], + "8805": [0.19667, 0.69667, 0, 0, 0.89444], + "8810": [0.08556, 0.58556, 0, 0, 1.14999], + "8811": [0.08556, 0.58556, 0, 0, 1.14999], + "8826": [0.08556, 0.58556, 0, 0, 0.89444], + "8827": [0.08556, 0.58556, 0, 0, 0.89444], + "8834": [0.08556, 0.58556, 0, 0, 0.89444], + "8835": [0.08556, 0.58556, 0, 0, 0.89444], + "8838": [0.19667, 0.69667, 0, 0, 0.89444], + "8839": [0.19667, 0.69667, 0, 0, 0.89444], + "8846": [0, 0.55556, 0, 0, 0.76666], + "8849": [0.19667, 0.69667, 0, 0, 0.89444], + "8850": [0.19667, 0.69667, 0, 0, 0.89444], + "8851": [0, 0.55556, 0, 0, 0.76666], + "8852": [0, 0.55556, 0, 0, 0.76666], + "8853": [0.13333, 0.63333, 0, 0, 0.89444], + "8854": [0.13333, 0.63333, 0, 0, 0.89444], + "8855": [0.13333, 0.63333, 0, 0, 0.89444], + "8856": [0.13333, 0.63333, 0, 0, 0.89444], + "8857": [0.13333, 0.63333, 0, 0, 0.89444], + "8866": [0, 0.69444, 0, 0, 0.70277], + "8867": [0, 0.69444, 0, 0, 0.70277], + "8868": [0, 0.69444, 0, 0, 0.89444], + "8869": [0, 0.69444, 0, 0, 0.89444], + "8900": [-0.02639, 0.47361, 0, 0, 0.575], + "8901": [-0.02639, 0.47361, 0, 0, 0.31944], + "8902": [-0.02778, 0.47222, 0, 0, 0.575], + "8968": [0.25, 0.75, 0, 0, 0.51111], + "8969": [0.25, 0.75, 0, 0, 0.51111], + "8970": [0.25, 0.75, 0, 0, 0.51111], + "8971": [0.25, 0.75, 0, 0, 0.51111], + "8994": [-0.13889, 0.36111, 0, 0, 1.14999], + "8995": [-0.13889, 0.36111, 0, 0, 1.14999], + "9651": [0.19444, 0.69444, 0, 0, 1.02222], + "9657": [-0.02778, 0.47222, 0, 0, 0.575], + "9661": [0.19444, 0.69444, 0, 0, 1.02222], + "9667": [-0.02778, 0.47222, 0, 0, 0.575], + "9711": [0.19444, 0.69444, 0, 0, 1.14999], + "9824": [0.12963, 0.69444, 0, 0, 0.89444], + "9825": [0.12963, 0.69444, 0, 0, 0.89444], + "9826": [0.12963, 0.69444, 0, 0, 0.89444], + "9827": [0.12963, 0.69444, 0, 0, 0.89444], + "9837": [0, 0.75, 0, 0, 0.44722], + "9838": [0.19444, 0.69444, 0, 0, 0.44722], + "9839": [0.19444, 0.69444, 0, 0, 0.44722], + "10216": [0.25, 0.75, 0, 0, 0.44722], + "10217": [0.25, 0.75, 0, 0, 0.44722], + "10815": [0, 0.68611, 0, 0, 0.9], + "10927": [0.19667, 0.69667, 0, 0, 0.89444], + "10928": [0.19667, 0.69667, 0, 0, 0.89444], + "57376": [0.19444, 0.69444, 0, 0, 0] + }, + "Main-BoldItalic": { + "33": [0, 0.69444, 0.11417, 0, 0.38611], + "34": [0, 0.69444, 0.07939, 0, 0.62055], + "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], + "37": [0.05556, 0.75, 0.12861, 0, 0.94444], + "38": [0, 0.69444, 0.08528, 0, 0.88555], + "39": [0, 0.69444, 0.12945, 0, 0.35555], + "40": [0.25, 0.75, 0.15806, 0, 0.47333], + "41": [0.25, 0.75, 0.03306, 0, 0.47333], + "42": [0, 0.75, 0.14333, 0, 0.59111], + "43": [0.10333, 0.60333, 0.03306, 0, 0.88555], + "44": [0.19444, 0.14722, 0, 0, 0.35555], + "45": [0, 0.44444, 0.02611, 0, 0.41444], + "46": [0, 0.14722, 0, 0, 0.35555], + "47": [0.25, 0.75, 0.15806, 0, 0.59111], + "48": [0, 0.64444, 0.13167, 0, 0.59111], + "49": [0, 0.64444, 0.13167, 0, 0.59111], + "50": [0, 0.64444, 0.13167, 0, 0.59111], + "51": [0, 0.64444, 0.13167, 0, 0.59111], + "52": [0.19444, 0.64444, 0.13167, 0, 0.59111], + "53": [0, 0.64444, 0.13167, 0, 0.59111], + "54": [0, 0.64444, 0.13167, 0, 0.59111], + "55": [0.19444, 0.64444, 0.13167, 0, 0.59111], + "56": [0, 0.64444, 0.13167, 0, 0.59111], + "57": [0, 0.64444, 0.13167, 0, 0.59111], + "58": [0, 0.44444, 0.06695, 0, 0.35555], + "59": [0.19444, 0.44444, 0.06695, 0, 0.35555], + "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555], + "63": [0, 0.69444, 0.11472, 0, 0.59111], + "64": [0, 0.69444, 0.09208, 0, 0.88555], + "65": [0, 0.68611, 0, 0, 0.86555], + "66": [0, 0.68611, 0.0992, 0, 0.81666], + "67": [0, 0.68611, 0.14208, 0, 0.82666], + "68": [0, 0.68611, 0.09062, 0, 0.87555], + "69": [0, 0.68611, 0.11431, 0, 0.75666], + "70": [0, 0.68611, 0.12903, 0, 0.72722], + "71": [0, 0.68611, 0.07347, 0, 0.89527], + "72": [0, 0.68611, 0.17208, 0, 0.8961], + "73": [0, 0.68611, 0.15681, 0, 0.47166], + "74": [0, 0.68611, 0.145, 0, 0.61055], + "75": [0, 0.68611, 0.14208, 0, 0.89499], + "76": [0, 0.68611, 0, 0, 0.69777], + "77": [0, 0.68611, 0.17208, 0, 1.07277], + "78": [0, 0.68611, 0.17208, 0, 0.8961], + "79": [0, 0.68611, 0.09062, 0, 0.85499], + "80": [0, 0.68611, 0.0992, 0, 0.78721], + "81": [0.19444, 0.68611, 0.09062, 0, 0.85499], + "82": [0, 0.68611, 0.02559, 0, 0.85944], + "83": [0, 0.68611, 0.11264, 0, 0.64999], + "84": [0, 0.68611, 0.12903, 0, 0.7961], + "85": [0, 0.68611, 0.17208, 0, 0.88083], + "86": [0, 0.68611, 0.18625, 0, 0.86555], + "87": [0, 0.68611, 0.18625, 0, 1.15999], + "88": [0, 0.68611, 0.15681, 0, 0.86555], + "89": [0, 0.68611, 0.19803, 0, 0.86555], + "90": [0, 0.68611, 0.14208, 0, 0.70888], + "91": [0.25, 0.75, 0.1875, 0, 0.35611], + "93": [0.25, 0.75, 0.09972, 0, 0.35611], + "94": [0, 0.69444, 0.06709, 0, 0.59111], + "95": [0.31, 0.13444, 0.09811, 0, 0.59111], + "97": [0, 0.44444, 0.09426, 0, 0.59111], + "98": [0, 0.69444, 0.07861, 0, 0.53222], + "99": [0, 0.44444, 0.05222, 0, 0.53222], + "100": [0, 0.69444, 0.10861, 0, 0.59111], + "101": [0, 0.44444, 0.085, 0, 0.53222], + "102": [0.19444, 0.69444, 0.21778, 0, 0.4], + "103": [0.19444, 0.44444, 0.105, 0, 0.53222], + "104": [0, 0.69444, 0.09426, 0, 0.59111], + "105": [0, 0.69326, 0.11387, 0, 0.35555], + "106": [0.19444, 0.69326, 0.1672, 0, 0.35555], + "107": [0, 0.69444, 0.11111, 0, 0.53222], + "108": [0, 0.69444, 0.10861, 0, 0.29666], + "109": [0, 0.44444, 0.09426, 0, 0.94444], + "110": [0, 0.44444, 0.09426, 0, 0.64999], + "111": [0, 0.44444, 0.07861, 0, 0.59111], + "112": [0.19444, 0.44444, 0.07861, 0, 0.59111], + "113": [0.19444, 0.44444, 0.105, 0, 0.53222], + "114": [0, 0.44444, 0.11111, 0, 0.50167], + "115": [0, 0.44444, 0.08167, 0, 0.48694], + "116": [0, 0.63492, 0.09639, 0, 0.385], + "117": [0, 0.44444, 0.09426, 0, 0.62055], + "118": [0, 0.44444, 0.11111, 0, 0.53222], + "119": [0, 0.44444, 0.11111, 0, 0.76777], + "120": [0, 0.44444, 0.12583, 0, 0.56055], + "121": [0.19444, 0.44444, 0.105, 0, 0.56166], + "122": [0, 0.44444, 0.13889, 0, 0.49055], + "126": [0.35, 0.34444, 0.11472, 0, 0.59111], + "163": [0, 0.69444, 0, 0, 0.86853], + "168": [0, 0.69444, 0.11473, 0, 0.59111], + "176": [0, 0.69444, 0, 0, 0.94888], + "184": [0.17014, 0, 0, 0, 0.53222], + "198": [0, 0.68611, 0.11431, 0, 1.02277], + "216": [0.04861, 0.73472, 0.09062, 0, 0.88555], + "223": [0.19444, 0.69444, 0.09736, 0, 0.665], + "230": [0, 0.44444, 0.085, 0, 0.82666], + "248": [0.09722, 0.54167, 0.09458, 0, 0.59111], + "305": [0, 0.44444, 0.09426, 0, 0.35555], + "338": [0, 0.68611, 0.11431, 0, 1.14054], + "339": [0, 0.44444, 0.085, 0, 0.82666], + "567": [0.19444, 0.44444, 0.04611, 0, 0.385], + "710": [0, 0.69444, 0.06709, 0, 0.59111], + "711": [0, 0.63194, 0.08271, 0, 0.59111], + "713": [0, 0.59444, 0.10444, 0, 0.59111], + "714": [0, 0.69444, 0.08528, 0, 0.59111], + "715": [0, 0.69444, 0, 0, 0.59111], + "728": [0, 0.69444, 0.10333, 0, 0.59111], + "729": [0, 0.69444, 0.12945, 0, 0.35555], + "730": [0, 0.69444, 0, 0, 0.94888], + "732": [0, 0.69444, 0.11472, 0, 0.59111], + "733": [0, 0.69444, 0.11472, 0, 0.59111], + "915": [0, 0.68611, 0.12903, 0, 0.69777], + "916": [0, 0.68611, 0, 0, 0.94444], + "920": [0, 0.68611, 0.09062, 0, 0.88555], + "923": [0, 0.68611, 0, 0, 0.80666], + "926": [0, 0.68611, 0.15092, 0, 0.76777], + "928": [0, 0.68611, 0.17208, 0, 0.8961], + "931": [0, 0.68611, 0.11431, 0, 0.82666], + "933": [0, 0.68611, 0.10778, 0, 0.88555], + "934": [0, 0.68611, 0.05632, 0, 0.82666], + "936": [0, 0.68611, 0.10778, 0, 0.88555], + "937": [0, 0.68611, 0.0992, 0, 0.82666], + "8211": [0, 0.44444, 0.09811, 0, 0.59111], + "8212": [0, 0.44444, 0.09811, 0, 1.18221], + "8216": [0, 0.69444, 0.12945, 0, 0.35555], + "8217": [0, 0.69444, 0.12945, 0, 0.35555], + "8220": [0, 0.69444, 0.16772, 0, 0.62055], + "8221": [0, 0.69444, 0.07939, 0, 0.62055] + }, + "Main-Italic": { + "33": [0, 0.69444, 0.12417, 0, 0.30667], + "34": [0, 0.69444, 0.06961, 0, 0.51444], + "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], + "37": [0.05556, 0.75, 0.13639, 0, 0.81777], + "38": [0, 0.69444, 0.09694, 0, 0.76666], + "39": [0, 0.69444, 0.12417, 0, 0.30667], + "40": [0.25, 0.75, 0.16194, 0, 0.40889], + "41": [0.25, 0.75, 0.03694, 0, 0.40889], + "42": [0, 0.75, 0.14917, 0, 0.51111], + "43": [0.05667, 0.56167, 0.03694, 0, 0.76666], + "44": [0.19444, 0.10556, 0, 0, 0.30667], + "45": [0, 0.43056, 0.02826, 0, 0.35778], + "46": [0, 0.10556, 0, 0, 0.30667], + "47": [0.25, 0.75, 0.16194, 0, 0.51111], + "48": [0, 0.64444, 0.13556, 0, 0.51111], + "49": [0, 0.64444, 0.13556, 0, 0.51111], + "50": [0, 0.64444, 0.13556, 0, 0.51111], + "51": [0, 0.64444, 0.13556, 0, 0.51111], + "52": [0.19444, 0.64444, 0.13556, 0, 0.51111], + "53": [0, 0.64444, 0.13556, 0, 0.51111], + "54": [0, 0.64444, 0.13556, 0, 0.51111], + "55": [0.19444, 0.64444, 0.13556, 0, 0.51111], + "56": [0, 0.64444, 0.13556, 0, 0.51111], + "57": [0, 0.64444, 0.13556, 0, 0.51111], + "58": [0, 0.43056, 0.0582, 0, 0.30667], + "59": [0.19444, 0.43056, 0.0582, 0, 0.30667], + "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666], + "63": [0, 0.69444, 0.1225, 0, 0.51111], + "64": [0, 0.69444, 0.09597, 0, 0.76666], + "65": [0, 0.68333, 0, 0, 0.74333], + "66": [0, 0.68333, 0.10257, 0, 0.70389], + "67": [0, 0.68333, 0.14528, 0, 0.71555], + "68": [0, 0.68333, 0.09403, 0, 0.755], + "69": [0, 0.68333, 0.12028, 0, 0.67833], + "70": [0, 0.68333, 0.13305, 0, 0.65277], + "71": [0, 0.68333, 0.08722, 0, 0.77361], + "72": [0, 0.68333, 0.16389, 0, 0.74333], + "73": [0, 0.68333, 0.15806, 0, 0.38555], + "74": [0, 0.68333, 0.14028, 0, 0.525], + "75": [0, 0.68333, 0.14528, 0, 0.76888], + "76": [0, 0.68333, 0, 0, 0.62722], + "77": [0, 0.68333, 0.16389, 0, 0.89666], + "78": [0, 0.68333, 0.16389, 0, 0.74333], + "79": [0, 0.68333, 0.09403, 0, 0.76666], + "80": [0, 0.68333, 0.10257, 0, 0.67833], + "81": [0.19444, 0.68333, 0.09403, 0, 0.76666], + "82": [0, 0.68333, 0.03868, 0, 0.72944], + "83": [0, 0.68333, 0.11972, 0, 0.56222], + "84": [0, 0.68333, 0.13305, 0, 0.71555], + "85": [0, 0.68333, 0.16389, 0, 0.74333], + "86": [0, 0.68333, 0.18361, 0, 0.74333], + "87": [0, 0.68333, 0.18361, 0, 0.99888], + "88": [0, 0.68333, 0.15806, 0, 0.74333], + "89": [0, 0.68333, 0.19383, 0, 0.74333], + "90": [0, 0.68333, 0.14528, 0, 0.61333], + "91": [0.25, 0.75, 0.1875, 0, 0.30667], + "93": [0.25, 0.75, 0.10528, 0, 0.30667], + "94": [0, 0.69444, 0.06646, 0, 0.51111], + "95": [0.31, 0.12056, 0.09208, 0, 0.51111], + "97": [0, 0.43056, 0.07671, 0, 0.51111], + "98": [0, 0.69444, 0.06312, 0, 0.46], + "99": [0, 0.43056, 0.05653, 0, 0.46], + "100": [0, 0.69444, 0.10333, 0, 0.51111], + "101": [0, 0.43056, 0.07514, 0, 0.46], + "102": [0.19444, 0.69444, 0.21194, 0, 0.30667], + "103": [0.19444, 0.43056, 0.08847, 0, 0.46], + "104": [0, 0.69444, 0.07671, 0, 0.51111], + "105": [0, 0.65536, 0.1019, 0, 0.30667], + "106": [0.19444, 0.65536, 0.14467, 0, 0.30667], + "107": [0, 0.69444, 0.10764, 0, 0.46], + "108": [0, 0.69444, 0.10333, 0, 0.25555], + "109": [0, 0.43056, 0.07671, 0, 0.81777], + "110": [0, 0.43056, 0.07671, 0, 0.56222], + "111": [0, 0.43056, 0.06312, 0, 0.51111], + "112": [0.19444, 0.43056, 0.06312, 0, 0.51111], + "113": [0.19444, 0.43056, 0.08847, 0, 0.46], + "114": [0, 0.43056, 0.10764, 0, 0.42166], + "115": [0, 0.43056, 0.08208, 0, 0.40889], + "116": [0, 0.61508, 0.09486, 0, 0.33222], + "117": [0, 0.43056, 0.07671, 0, 0.53666], + "118": [0, 0.43056, 0.10764, 0, 0.46], + "119": [0, 0.43056, 0.10764, 0, 0.66444], + "120": [0, 0.43056, 0.12042, 0, 0.46389], + "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], + "122": [0, 0.43056, 0.12292, 0, 0.40889], + "126": [0.35, 0.31786, 0.11585, 0, 0.51111], + "163": [0, 0.69444, 0, 0, 0.76909], + "168": [0, 0.66786, 0.10474, 0, 0.51111], + "176": [0, 0.69444, 0, 0, 0.83129], + "184": [0.17014, 0, 0, 0, 0.46], + "198": [0, 0.68333, 0.12028, 0, 0.88277], + "216": [0.04861, 0.73194, 0.09403, 0, 0.76666], + "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], + "230": [0, 0.43056, 0.07514, 0, 0.71555], + "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], + "305": [0, 0.43056, 0, 0.02778, 0.32246], + "338": [0, 0.68333, 0.12028, 0, 0.98499], + "339": [0, 0.43056, 0.07514, 0, 0.71555], + "567": [0.19444, 0.43056, 0, 0.08334, 0.38403], + "710": [0, 0.69444, 0.06646, 0, 0.51111], + "711": [0, 0.62847, 0.08295, 0, 0.51111], + "713": [0, 0.56167, 0.10333, 0, 0.51111], + "714": [0, 0.69444, 0.09694, 0, 0.51111], + "715": [0, 0.69444, 0, 0, 0.51111], + "728": [0, 0.69444, 0.10806, 0, 0.51111], + "729": [0, 0.66786, 0.11752, 0, 0.30667], + "730": [0, 0.69444, 0, 0, 0.83129], + "732": [0, 0.66786, 0.11585, 0, 0.51111], + "733": [0, 0.69444, 0.1225, 0, 0.51111], + "915": [0, 0.68333, 0.13305, 0, 0.62722], + "916": [0, 0.68333, 0, 0, 0.81777], + "920": [0, 0.68333, 0.09403, 0, 0.76666], + "923": [0, 0.68333, 0, 0, 0.69222], + "926": [0, 0.68333, 0.15294, 0, 0.66444], + "928": [0, 0.68333, 0.16389, 0, 0.74333], + "931": [0, 0.68333, 0.12028, 0, 0.71555], + "933": [0, 0.68333, 0.11111, 0, 0.76666], + "934": [0, 0.68333, 0.05986, 0, 0.71555], + "936": [0, 0.68333, 0.11111, 0, 0.76666], + "937": [0, 0.68333, 0.10257, 0, 0.71555], + "8211": [0, 0.43056, 0.09208, 0, 0.51111], + "8212": [0, 0.43056, 0.09208, 0, 1.02222], + "8216": [0, 0.69444, 0.12417, 0, 0.30667], + "8217": [0, 0.69444, 0.12417, 0, 0.30667], + "8220": [0, 0.69444, 0.1685, 0, 0.51444], + "8221": [0, 0.69444, 0.06961, 0, 0.51444], + "8463": [0, 0.68889, 0, 0, 0.54028] + }, + "Main-Regular": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.27778], + "34": [0, 0.69444, 0, 0, 0.5], + "35": [0.19444, 0.69444, 0, 0, 0.83334], + "36": [0.05556, 0.75, 0, 0, 0.5], + "37": [0.05556, 0.75, 0, 0, 0.83334], + "38": [0, 0.69444, 0, 0, 0.77778], + "39": [0, 0.69444, 0, 0, 0.27778], + "40": [0.25, 0.75, 0, 0, 0.38889], + "41": [0.25, 0.75, 0, 0, 0.38889], + "42": [0, 0.75, 0, 0, 0.5], + "43": [0.08333, 0.58333, 0, 0, 0.77778], + "44": [0.19444, 0.10556, 0, 0, 0.27778], + "45": [0, 0.43056, 0, 0, 0.33333], + "46": [0, 0.10556, 0, 0, 0.27778], + "47": [0.25, 0.75, 0, 0, 0.5], + "48": [0, 0.64444, 0, 0, 0.5], + "49": [0, 0.64444, 0, 0, 0.5], + "50": [0, 0.64444, 0, 0, 0.5], + "51": [0, 0.64444, 0, 0, 0.5], + "52": [0, 0.64444, 0, 0, 0.5], + "53": [0, 0.64444, 0, 0, 0.5], + "54": [0, 0.64444, 0, 0, 0.5], + "55": [0, 0.64444, 0, 0, 0.5], + "56": [0, 0.64444, 0, 0, 0.5], + "57": [0, 0.64444, 0, 0, 0.5], + "58": [0, 0.43056, 0, 0, 0.27778], + "59": [0.19444, 0.43056, 0, 0, 0.27778], + "60": [0.0391, 0.5391, 0, 0, 0.77778], + "61": [-0.13313, 0.36687, 0, 0, 0.77778], + "62": [0.0391, 0.5391, 0, 0, 0.77778], + "63": [0, 0.69444, 0, 0, 0.47222], + "64": [0, 0.69444, 0, 0, 0.77778], + "65": [0, 0.68333, 0, 0, 0.75], + "66": [0, 0.68333, 0, 0, 0.70834], + "67": [0, 0.68333, 0, 0, 0.72222], + "68": [0, 0.68333, 0, 0, 0.76389], + "69": [0, 0.68333, 0, 0, 0.68056], + "70": [0, 0.68333, 0, 0, 0.65278], + "71": [0, 0.68333, 0, 0, 0.78472], + "72": [0, 0.68333, 0, 0, 0.75], + "73": [0, 0.68333, 0, 0, 0.36111], + "74": [0, 0.68333, 0, 0, 0.51389], + "75": [0, 0.68333, 0, 0, 0.77778], + "76": [0, 0.68333, 0, 0, 0.625], + "77": [0, 0.68333, 0, 0, 0.91667], + "78": [0, 0.68333, 0, 0, 0.75], + "79": [0, 0.68333, 0, 0, 0.77778], + "80": [0, 0.68333, 0, 0, 0.68056], + "81": [0.19444, 0.68333, 0, 0, 0.77778], + "82": [0, 0.68333, 0, 0, 0.73611], + "83": [0, 0.68333, 0, 0, 0.55556], + "84": [0, 0.68333, 0, 0, 0.72222], + "85": [0, 0.68333, 0, 0, 0.75], + "86": [0, 0.68333, 0.01389, 0, 0.75], + "87": [0, 0.68333, 0.01389, 0, 1.02778], + "88": [0, 0.68333, 0, 0, 0.75], + "89": [0, 0.68333, 0.025, 0, 0.75], + "90": [0, 0.68333, 0, 0, 0.61111], + "91": [0.25, 0.75, 0, 0, 0.27778], + "92": [0.25, 0.75, 0, 0, 0.5], + "93": [0.25, 0.75, 0, 0, 0.27778], + "94": [0, 0.69444, 0, 0, 0.5], + "95": [0.31, 0.12056, 0.02778, 0, 0.5], + "97": [0, 0.43056, 0, 0, 0.5], + "98": [0, 0.69444, 0, 0, 0.55556], + "99": [0, 0.43056, 0, 0, 0.44445], + "100": [0, 0.69444, 0, 0, 0.55556], + "101": [0, 0.43056, 0, 0, 0.44445], + "102": [0, 0.69444, 0.07778, 0, 0.30556], + "103": [0.19444, 0.43056, 0.01389, 0, 0.5], + "104": [0, 0.69444, 0, 0, 0.55556], + "105": [0, 0.66786, 0, 0, 0.27778], + "106": [0.19444, 0.66786, 0, 0, 0.30556], + "107": [0, 0.69444, 0, 0, 0.52778], + "108": [0, 0.69444, 0, 0, 0.27778], + "109": [0, 0.43056, 0, 0, 0.83334], + "110": [0, 0.43056, 0, 0, 0.55556], + "111": [0, 0.43056, 0, 0, 0.5], + "112": [0.19444, 0.43056, 0, 0, 0.55556], + "113": [0.19444, 0.43056, 0, 0, 0.52778], + "114": [0, 0.43056, 0, 0, 0.39167], + "115": [0, 0.43056, 0, 0, 0.39445], + "116": [0, 0.61508, 0, 0, 0.38889], + "117": [0, 0.43056, 0, 0, 0.55556], + "118": [0, 0.43056, 0.01389, 0, 0.52778], + "119": [0, 0.43056, 0.01389, 0, 0.72222], + "120": [0, 0.43056, 0, 0, 0.52778], + "121": [0.19444, 0.43056, 0.01389, 0, 0.52778], + "122": [0, 0.43056, 0, 0, 0.44445], + "123": [0.25, 0.75, 0, 0, 0.5], + "124": [0.25, 0.75, 0, 0, 0.27778], + "125": [0.25, 0.75, 0, 0, 0.5], + "126": [0.35, 0.31786, 0, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], + "167": [0.19444, 0.69444, 0, 0, 0.44445], + "168": [0, 0.66786, 0, 0, 0.5], + "172": [0, 0.43056, 0, 0, 0.66667], + "176": [0, 0.69444, 0, 0, 0.75], + "177": [0.08333, 0.58333, 0, 0, 0.77778], + "182": [0.19444, 0.69444, 0, 0, 0.61111], + "184": [0.17014, 0, 0, 0, 0.44445], + "198": [0, 0.68333, 0, 0, 0.90278], + "215": [0.08333, 0.58333, 0, 0, 0.77778], + "216": [0.04861, 0.73194, 0, 0, 0.77778], + "223": [0, 0.69444, 0, 0, 0.5], + "230": [0, 0.43056, 0, 0, 0.72222], + "247": [0.08333, 0.58333, 0, 0, 0.77778], + "248": [0.09722, 0.52778, 0, 0, 0.5], + "305": [0, 0.43056, 0, 0, 0.27778], + "338": [0, 0.68333, 0, 0, 1.01389], + "339": [0, 0.43056, 0, 0, 0.77778], + "567": [0.19444, 0.43056, 0, 0, 0.30556], + "710": [0, 0.69444, 0, 0, 0.5], + "711": [0, 0.62847, 0, 0, 0.5], + "713": [0, 0.56778, 0, 0, 0.5], + "714": [0, 0.69444, 0, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0, 0, 0.5], + "729": [0, 0.66786, 0, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.75], + "732": [0, 0.66786, 0, 0, 0.5], + "733": [0, 0.69444, 0, 0, 0.5], + "915": [0, 0.68333, 0, 0, 0.625], + "916": [0, 0.68333, 0, 0, 0.83334], + "920": [0, 0.68333, 0, 0, 0.77778], + "923": [0, 0.68333, 0, 0, 0.69445], + "926": [0, 0.68333, 0, 0, 0.66667], + "928": [0, 0.68333, 0, 0, 0.75], + "931": [0, 0.68333, 0, 0, 0.72222], + "933": [0, 0.68333, 0, 0, 0.77778], + "934": [0, 0.68333, 0, 0, 0.72222], + "936": [0, 0.68333, 0, 0, 0.77778], + "937": [0, 0.68333, 0, 0, 0.72222], + "8211": [0, 0.43056, 0.02778, 0, 0.5], + "8212": [0, 0.43056, 0.02778, 0, 1.0], + "8216": [0, 0.69444, 0, 0, 0.27778], + "8217": [0, 0.69444, 0, 0, 0.27778], + "8220": [0, 0.69444, 0, 0, 0.5], + "8221": [0, 0.69444, 0, 0, 0.5], + "8224": [0.19444, 0.69444, 0, 0, 0.44445], + "8225": [0.19444, 0.69444, 0, 0, 0.44445], + "8230": [0, 0.12, 0, 0, 1.172], + "8242": [0, 0.55556, 0, 0, 0.275], + "8407": [0, 0.71444, 0.15382, 0, 0.5], + "8463": [0, 0.68889, 0, 0, 0.54028], + "8465": [0, 0.69444, 0, 0, 0.72222], + "8467": [0, 0.69444, 0, 0.11111, 0.41667], + "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646], + "8476": [0, 0.69444, 0, 0, 0.72222], + "8501": [0, 0.69444, 0, 0, 0.61111], + "8592": [-0.13313, 0.36687, 0, 0, 1.0], + "8593": [0.19444, 0.69444, 0, 0, 0.5], + "8594": [-0.13313, 0.36687, 0, 0, 1.0], + "8595": [0.19444, 0.69444, 0, 0, 0.5], + "8596": [-0.13313, 0.36687, 0, 0, 1.0], + "8597": [0.25, 0.75, 0, 0, 0.5], + "8598": [0.19444, 0.69444, 0, 0, 1.0], + "8599": [0.19444, 0.69444, 0, 0, 1.0], + "8600": [0.19444, 0.69444, 0, 0, 1.0], + "8601": [0.19444, 0.69444, 0, 0, 1.0], + "8614": [0.011, 0.511, 0, 0, 1.0], + "8617": [0.011, 0.511, 0, 0, 1.126], + "8618": [0.011, 0.511, 0, 0, 1.126], + "8636": [-0.13313, 0.36687, 0, 0, 1.0], + "8637": [-0.13313, 0.36687, 0, 0, 1.0], + "8640": [-0.13313, 0.36687, 0, 0, 1.0], + "8641": [-0.13313, 0.36687, 0, 0, 1.0], + "8652": [0.011, 0.671, 0, 0, 1.0], + "8656": [-0.13313, 0.36687, 0, 0, 1.0], + "8657": [0.19444, 0.69444, 0, 0, 0.61111], + "8658": [-0.13313, 0.36687, 0, 0, 1.0], + "8659": [0.19444, 0.69444, 0, 0, 0.61111], + "8660": [-0.13313, 0.36687, 0, 0, 1.0], + "8661": [0.25, 0.75, 0, 0, 0.61111], + "8704": [0, 0.69444, 0, 0, 0.55556], + "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309], + "8707": [0, 0.69444, 0, 0, 0.55556], + "8709": [0.05556, 0.75, 0, 0, 0.5], + "8711": [0, 0.68333, 0, 0, 0.83334], + "8712": [0.0391, 0.5391, 0, 0, 0.66667], + "8715": [0.0391, 0.5391, 0, 0, 0.66667], + "8722": [0.08333, 0.58333, 0, 0, 0.77778], + "8723": [0.08333, 0.58333, 0, 0, 0.77778], + "8725": [0.25, 0.75, 0, 0, 0.5], + "8726": [0.25, 0.75, 0, 0, 0.5], + "8727": [-0.03472, 0.46528, 0, 0, 0.5], + "8728": [-0.05555, 0.44445, 0, 0, 0.5], + "8729": [-0.05555, 0.44445, 0, 0, 0.5], + "8730": [0.2, 0.8, 0, 0, 0.83334], + "8733": [0, 0.43056, 0, 0, 0.77778], + "8734": [0, 0.43056, 0, 0, 1.0], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8739": [0.25, 0.75, 0, 0, 0.27778], + "8741": [0.25, 0.75, 0, 0, 0.5], + "8743": [0, 0.55556, 0, 0, 0.66667], + "8744": [0, 0.55556, 0, 0, 0.66667], + "8745": [0, 0.55556, 0, 0, 0.66667], + "8746": [0, 0.55556, 0, 0, 0.66667], + "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667], + "8764": [-0.13313, 0.36687, 0, 0, 0.77778], + "8768": [0.19444, 0.69444, 0, 0, 0.27778], + "8771": [-0.03625, 0.46375, 0, 0, 0.77778], + "8773": [-0.022, 0.589, 0, 0, 1.0], + "8776": [-0.01688, 0.48312, 0, 0, 0.77778], + "8781": [-0.03625, 0.46375, 0, 0, 0.77778], + "8784": [-0.133, 0.67, 0, 0, 0.778], + "8801": [-0.03625, 0.46375, 0, 0, 0.77778], + "8804": [0.13597, 0.63597, 0, 0, 0.77778], + "8805": [0.13597, 0.63597, 0, 0, 0.77778], + "8810": [0.0391, 0.5391, 0, 0, 1.0], + "8811": [0.0391, 0.5391, 0, 0, 1.0], + "8826": [0.0391, 0.5391, 0, 0, 0.77778], + "8827": [0.0391, 0.5391, 0, 0, 0.77778], + "8834": [0.0391, 0.5391, 0, 0, 0.77778], + "8835": [0.0391, 0.5391, 0, 0, 0.77778], + "8838": [0.13597, 0.63597, 0, 0, 0.77778], + "8839": [0.13597, 0.63597, 0, 0, 0.77778], + "8846": [0, 0.55556, 0, 0, 0.66667], + "8849": [0.13597, 0.63597, 0, 0, 0.77778], + "8850": [0.13597, 0.63597, 0, 0, 0.77778], + "8851": [0, 0.55556, 0, 0, 0.66667], + "8852": [0, 0.55556, 0, 0, 0.66667], + "8853": [0.08333, 0.58333, 0, 0, 0.77778], + "8854": [0.08333, 0.58333, 0, 0, 0.77778], + "8855": [0.08333, 0.58333, 0, 0, 0.77778], + "8856": [0.08333, 0.58333, 0, 0, 0.77778], + "8857": [0.08333, 0.58333, 0, 0, 0.77778], + "8866": [0, 0.69444, 0, 0, 0.61111], + "8867": [0, 0.69444, 0, 0, 0.61111], + "8868": [0, 0.69444, 0, 0, 0.77778], + "8869": [0, 0.69444, 0, 0, 0.77778], + "8872": [0.249, 0.75, 0, 0, 0.867], + "8900": [-0.05555, 0.44445, 0, 0, 0.5], + "8901": [-0.05555, 0.44445, 0, 0, 0.27778], + "8902": [-0.03472, 0.46528, 0, 0, 0.5], + "8904": [0.005, 0.505, 0, 0, 0.9], + "8942": [0.03, 0.9, 0, 0, 0.278], + "8943": [-0.19, 0.31, 0, 0, 1.172], + "8945": [-0.1, 0.82, 0, 0, 1.282], + "8968": [0.25, 0.75, 0, 0, 0.44445], + "8969": [0.25, 0.75, 0, 0, 0.44445], + "8970": [0.25, 0.75, 0, 0, 0.44445], + "8971": [0.25, 0.75, 0, 0, 0.44445], + "8994": [-0.14236, 0.35764, 0, 0, 1.0], + "8995": [-0.14236, 0.35764, 0, 0, 1.0], + "9136": [0.244, 0.744, 0, 0, 0.412], + "9137": [0.244, 0.744, 0, 0, 0.412], + "9651": [0.19444, 0.69444, 0, 0, 0.88889], + "9657": [-0.03472, 0.46528, 0, 0, 0.5], + "9661": [0.19444, 0.69444, 0, 0, 0.88889], + "9667": [-0.03472, 0.46528, 0, 0, 0.5], + "9711": [0.19444, 0.69444, 0, 0, 1.0], + "9824": [0.12963, 0.69444, 0, 0, 0.77778], + "9825": [0.12963, 0.69444, 0, 0, 0.77778], + "9826": [0.12963, 0.69444, 0, 0, 0.77778], + "9827": [0.12963, 0.69444, 0, 0, 0.77778], + "9837": [0, 0.75, 0, 0, 0.38889], + "9838": [0.19444, 0.69444, 0, 0, 0.38889], + "9839": [0.19444, 0.69444, 0, 0, 0.38889], + "10216": [0.25, 0.75, 0, 0, 0.38889], + "10217": [0.25, 0.75, 0, 0, 0.38889], + "10222": [0.244, 0.744, 0, 0, 0.412], + "10223": [0.244, 0.744, 0, 0, 0.412], + "10229": [0.011, 0.511, 0, 0, 1.609], + "10230": [0.011, 0.511, 0, 0, 1.638], + "10231": [0.011, 0.511, 0, 0, 1.859], + "10232": [0.024, 0.525, 0, 0, 1.609], + "10233": [0.024, 0.525, 0, 0, 1.638], + "10234": [0.024, 0.525, 0, 0, 1.858], + "10236": [0.011, 0.511, 0, 0, 1.638], + "10815": [0, 0.68333, 0, 0, 0.75], + "10927": [0.13597, 0.63597, 0, 0, 0.77778], + "10928": [0.13597, 0.63597, 0, 0, 0.77778], + "57376": [0.19444, 0.69444, 0, 0, 0] + }, + "Math-BoldItalic": { + "65": [0, 0.68611, 0, 0, 0.86944], + "66": [0, 0.68611, 0.04835, 0, 0.8664], + "67": [0, 0.68611, 0.06979, 0, 0.81694], + "68": [0, 0.68611, 0.03194, 0, 0.93812], + "69": [0, 0.68611, 0.05451, 0, 0.81007], + "70": [0, 0.68611, 0.15972, 0, 0.68889], + "71": [0, 0.68611, 0, 0, 0.88673], + "72": [0, 0.68611, 0.08229, 0, 0.98229], + "73": [0, 0.68611, 0.07778, 0, 0.51111], + "74": [0, 0.68611, 0.10069, 0, 0.63125], + "75": [0, 0.68611, 0.06979, 0, 0.97118], + "76": [0, 0.68611, 0, 0, 0.75555], + "77": [0, 0.68611, 0.11424, 0, 1.14201], + "78": [0, 0.68611, 0.11424, 0, 0.95034], + "79": [0, 0.68611, 0.03194, 0, 0.83666], + "80": [0, 0.68611, 0.15972, 0, 0.72309], + "81": [0.19444, 0.68611, 0, 0, 0.86861], + "82": [0, 0.68611, 0.00421, 0, 0.87235], + "83": [0, 0.68611, 0.05382, 0, 0.69271], + "84": [0, 0.68611, 0.15972, 0, 0.63663], + "85": [0, 0.68611, 0.11424, 0, 0.80027], + "86": [0, 0.68611, 0.25555, 0, 0.67778], + "87": [0, 0.68611, 0.15972, 0, 1.09305], + "88": [0, 0.68611, 0.07778, 0, 0.94722], + "89": [0, 0.68611, 0.25555, 0, 0.67458], + "90": [0, 0.68611, 0.06979, 0, 0.77257], + "97": [0, 0.44444, 0, 0, 0.63287], + "98": [0, 0.69444, 0, 0, 0.52083], + "99": [0, 0.44444, 0, 0, 0.51342], + "100": [0, 0.69444, 0, 0, 0.60972], + "101": [0, 0.44444, 0, 0, 0.55361], + "102": [0.19444, 0.69444, 0.11042, 0, 0.56806], + "103": [0.19444, 0.44444, 0.03704, 0, 0.5449], + "104": [0, 0.69444, 0, 0, 0.66759], + "105": [0, 0.69326, 0, 0, 0.4048], + "106": [0.19444, 0.69326, 0.0622, 0, 0.47083], + "107": [0, 0.69444, 0.01852, 0, 0.6037], + "108": [0, 0.69444, 0.0088, 0, 0.34815], + "109": [0, 0.44444, 0, 0, 1.0324], + "110": [0, 0.44444, 0, 0, 0.71296], + "111": [0, 0.44444, 0, 0, 0.58472], + "112": [0.19444, 0.44444, 0, 0, 0.60092], + "113": [0.19444, 0.44444, 0.03704, 0, 0.54213], + "114": [0, 0.44444, 0.03194, 0, 0.5287], + "115": [0, 0.44444, 0, 0, 0.53125], + "116": [0, 0.63492, 0, 0, 0.41528], + "117": [0, 0.44444, 0, 0, 0.68102], + "118": [0, 0.44444, 0.03704, 0, 0.56666], + "119": [0, 0.44444, 0.02778, 0, 0.83148], + "120": [0, 0.44444, 0, 0, 0.65903], + "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], + "122": [0, 0.44444, 0.04213, 0, 0.55509], + "915": [0, 0.68611, 0.15972, 0, 0.65694], + "916": [0, 0.68611, 0, 0, 0.95833], + "920": [0, 0.68611, 0.03194, 0, 0.86722], + "923": [0, 0.68611, 0, 0, 0.80555], + "926": [0, 0.68611, 0.07458, 0, 0.84125], + "928": [0, 0.68611, 0.08229, 0, 0.98229], + "931": [0, 0.68611, 0.05451, 0, 0.88507], + "933": [0, 0.68611, 0.15972, 0, 0.67083], + "934": [0, 0.68611, 0, 0, 0.76666], + "936": [0, 0.68611, 0.11653, 0, 0.71402], + "937": [0, 0.68611, 0.04835, 0, 0.8789], + "945": [0, 0.44444, 0, 0, 0.76064], + "946": [0.19444, 0.69444, 0.03403, 0, 0.65972], + "947": [0.19444, 0.44444, 0.06389, 0, 0.59003], + "948": [0, 0.69444, 0.03819, 0, 0.52222], + "949": [0, 0.44444, 0, 0, 0.52882], + "950": [0.19444, 0.69444, 0.06215, 0, 0.50833], + "951": [0.19444, 0.44444, 0.03704, 0, 0.6], + "952": [0, 0.69444, 0.03194, 0, 0.5618], + "953": [0, 0.44444, 0, 0, 0.41204], + "954": [0, 0.44444, 0, 0, 0.66759], + "955": [0, 0.69444, 0, 0, 0.67083], + "956": [0.19444, 0.44444, 0, 0, 0.70787], + "957": [0, 0.44444, 0.06898, 0, 0.57685], + "958": [0.19444, 0.69444, 0.03021, 0, 0.50833], + "959": [0, 0.44444, 0, 0, 0.58472], + "960": [0, 0.44444, 0.03704, 0, 0.68241], + "961": [0.19444, 0.44444, 0, 0, 0.6118], + "962": [0.09722, 0.44444, 0.07917, 0, 0.42361], + "963": [0, 0.44444, 0.03704, 0, 0.68588], + "964": [0, 0.44444, 0.13472, 0, 0.52083], + "965": [0, 0.44444, 0.03704, 0, 0.63055], + "966": [0.19444, 0.44444, 0, 0, 0.74722], + "967": [0.19444, 0.44444, 0, 0, 0.71805], + "968": [0.19444, 0.69444, 0.03704, 0, 0.75833], + "969": [0, 0.44444, 0.03704, 0, 0.71782], + "977": [0, 0.69444, 0, 0, 0.69155], + "981": [0.19444, 0.69444, 0, 0, 0.7125], + "982": [0, 0.44444, 0.03194, 0, 0.975], + "1009": [0.19444, 0.44444, 0, 0, 0.6118], + "1013": [0, 0.44444, 0, 0, 0.48333] + }, + "Math-Italic": { + "65": [0, 0.68333, 0, 0.13889, 0.75], + "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], + "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], + "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], + "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], + "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], + "71": [0, 0.68333, 0, 0.08334, 0.78625], + "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], + "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], + "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], + "76": [0, 0.68333, 0, 0.02778, 0.68056], + "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], + "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], + "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], + "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], + "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], + "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], + "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], + "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], + "86": [0, 0.68333, 0.22222, 0, 0.58333], + "87": [0, 0.68333, 0.13889, 0, 0.94445], + "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], + "89": [0, 0.68333, 0.22222, 0, 0.58056], + "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], + "97": [0, 0.43056, 0, 0, 0.52859], + "98": [0, 0.69444, 0, 0, 0.42917], + "99": [0, 0.43056, 0, 0.05556, 0.43276], + "100": [0, 0.69444, 0, 0.16667, 0.52049], + "101": [0, 0.43056, 0, 0.05556, 0.46563], + "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], + "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], + "104": [0, 0.69444, 0, 0, 0.57616], + "105": [0, 0.65952, 0, 0, 0.34451], + "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], + "107": [0, 0.69444, 0.03148, 0, 0.5206], + "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], + "109": [0, 0.43056, 0, 0, 0.87801], + "110": [0, 0.43056, 0, 0, 0.60023], + "111": [0, 0.43056, 0, 0.05556, 0.48472], + "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], + "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], + "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], + "115": [0, 0.43056, 0, 0.05556, 0.46875], + "116": [0, 0.61508, 0, 0.08334, 0.36111], + "117": [0, 0.43056, 0, 0.02778, 0.57246], + "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], + "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], + "120": [0, 0.43056, 0, 0.02778, 0.57153], + "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], + "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], + "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], + "916": [0, 0.68333, 0, 0.16667, 0.83334], + "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "923": [0, 0.68333, 0, 0.16667, 0.69445], + "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], + "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], + "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], + "934": [0, 0.68333, 0, 0.08334, 0.66667], + "936": [0, 0.68333, 0.11, 0.05556, 0.61222], + "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], + "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], + "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], + "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], + "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], + "949": [0, 0.43056, 0, 0.08334, 0.46632], + "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], + "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], + "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], + "953": [0, 0.43056, 0, 0.05556, 0.35394], + "954": [0, 0.43056, 0, 0, 0.57616], + "955": [0, 0.69444, 0, 0, 0.58334], + "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], + "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], + "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], + "959": [0, 0.43056, 0, 0.05556, 0.48472], + "960": [0, 0.43056, 0.03588, 0, 0.57003], + "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], + "963": [0, 0.43056, 0.03588, 0, 0.57141], + "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], + "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], + "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], + "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], + "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], + "969": [0, 0.43056, 0.03588, 0, 0.62245], + "977": [0, 0.69444, 0, 0.08334, 0.59144], + "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], + "982": [0, 0.43056, 0.02778, 0, 0.82813], + "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "1013": [0, 0.43056, 0, 0.05556, 0.4059] + }, + "Math-Regular": { + "65": [0, 0.68333, 0, 0.13889, 0.75], + "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], + "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], + "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], + "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], + "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], + "71": [0, 0.68333, 0, 0.08334, 0.78625], + "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], + "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], + "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], + "76": [0, 0.68333, 0, 0.02778, 0.68056], + "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], + "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], + "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], + "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], + "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], + "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], + "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], + "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], + "86": [0, 0.68333, 0.22222, 0, 0.58333], + "87": [0, 0.68333, 0.13889, 0, 0.94445], + "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], + "89": [0, 0.68333, 0.22222, 0, 0.58056], + "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], + "97": [0, 0.43056, 0, 0, 0.52859], + "98": [0, 0.69444, 0, 0, 0.42917], + "99": [0, 0.43056, 0, 0.05556, 0.43276], + "100": [0, 0.69444, 0, 0.16667, 0.52049], + "101": [0, 0.43056, 0, 0.05556, 0.46563], + "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], + "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], + "104": [0, 0.69444, 0, 0, 0.57616], + "105": [0, 0.65952, 0, 0, 0.34451], + "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], + "107": [0, 0.69444, 0.03148, 0, 0.5206], + "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], + "109": [0, 0.43056, 0, 0, 0.87801], + "110": [0, 0.43056, 0, 0, 0.60023], + "111": [0, 0.43056, 0, 0.05556, 0.48472], + "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], + "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], + "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], + "115": [0, 0.43056, 0, 0.05556, 0.46875], + "116": [0, 0.61508, 0, 0.08334, 0.36111], + "117": [0, 0.43056, 0, 0.02778, 0.57246], + "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], + "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], + "120": [0, 0.43056, 0, 0.02778, 0.57153], + "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], + "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], + "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], + "916": [0, 0.68333, 0, 0.16667, 0.83334], + "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "923": [0, 0.68333, 0, 0.16667, 0.69445], + "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], + "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], + "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], + "934": [0, 0.68333, 0, 0.08334, 0.66667], + "936": [0, 0.68333, 0.11, 0.05556, 0.61222], + "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], + "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], + "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], + "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], + "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], + "949": [0, 0.43056, 0, 0.08334, 0.46632], + "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], + "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], + "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], + "953": [0, 0.43056, 0, 0.05556, 0.35394], + "954": [0, 0.43056, 0, 0, 0.57616], + "955": [0, 0.69444, 0, 0, 0.58334], + "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], + "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], + "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], + "959": [0, 0.43056, 0, 0.05556, 0.48472], + "960": [0, 0.43056, 0.03588, 0, 0.57003], + "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], + "963": [0, 0.43056, 0.03588, 0, 0.57141], + "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], + "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], + "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], + "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], + "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], + "969": [0, 0.43056, 0.03588, 0, 0.62245], + "977": [0, 0.69444, 0, 0.08334, 0.59144], + "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], + "982": [0, 0.43056, 0.02778, 0, 0.82813], + "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "1013": [0, 0.43056, 0, 0.05556, 0.4059] + }, + "SansSerif-Bold": { + "33": [0, 0.69444, 0, 0, 0.36667], + "34": [0, 0.69444, 0, 0, 0.55834], + "35": [0.19444, 0.69444, 0, 0, 0.91667], + "36": [0.05556, 0.75, 0, 0, 0.55], + "37": [0.05556, 0.75, 0, 0, 1.02912], + "38": [0, 0.69444, 0, 0, 0.83056], + "39": [0, 0.69444, 0, 0, 0.30556], + "40": [0.25, 0.75, 0, 0, 0.42778], + "41": [0.25, 0.75, 0, 0, 0.42778], + "42": [0, 0.75, 0, 0, 0.55], + "43": [0.11667, 0.61667, 0, 0, 0.85556], + "44": [0.10556, 0.13056, 0, 0, 0.30556], + "45": [0, 0.45833, 0, 0, 0.36667], + "46": [0, 0.13056, 0, 0, 0.30556], + "47": [0.25, 0.75, 0, 0, 0.55], + "48": [0, 0.69444, 0, 0, 0.55], + "49": [0, 0.69444, 0, 0, 0.55], + "50": [0, 0.69444, 0, 0, 0.55], + "51": [0, 0.69444, 0, 0, 0.55], + "52": [0, 0.69444, 0, 0, 0.55], + "53": [0, 0.69444, 0, 0, 0.55], + "54": [0, 0.69444, 0, 0, 0.55], + "55": [0, 0.69444, 0, 0, 0.55], + "56": [0, 0.69444, 0, 0, 0.55], + "57": [0, 0.69444, 0, 0, 0.55], + "58": [0, 0.45833, 0, 0, 0.30556], + "59": [0.10556, 0.45833, 0, 0, 0.30556], + "61": [-0.09375, 0.40625, 0, 0, 0.85556], + "63": [0, 0.69444, 0, 0, 0.51945], + "64": [0, 0.69444, 0, 0, 0.73334], + "65": [0, 0.69444, 0, 0, 0.73334], + "66": [0, 0.69444, 0, 0, 0.73334], + "67": [0, 0.69444, 0, 0, 0.70278], + "68": [0, 0.69444, 0, 0, 0.79445], + "69": [0, 0.69444, 0, 0, 0.64167], + "70": [0, 0.69444, 0, 0, 0.61111], + "71": [0, 0.69444, 0, 0, 0.73334], + "72": [0, 0.69444, 0, 0, 0.79445], + "73": [0, 0.69444, 0, 0, 0.33056], + "74": [0, 0.69444, 0, 0, 0.51945], + "75": [0, 0.69444, 0, 0, 0.76389], + "76": [0, 0.69444, 0, 0, 0.58056], + "77": [0, 0.69444, 0, 0, 0.97778], + "78": [0, 0.69444, 0, 0, 0.79445], + "79": [0, 0.69444, 0, 0, 0.79445], + "80": [0, 0.69444, 0, 0, 0.70278], + "81": [0.10556, 0.69444, 0, 0, 0.79445], + "82": [0, 0.69444, 0, 0, 0.70278], + "83": [0, 0.69444, 0, 0, 0.61111], + "84": [0, 0.69444, 0, 0, 0.73334], + "85": [0, 0.69444, 0, 0, 0.76389], + "86": [0, 0.69444, 0.01528, 0, 0.73334], + "87": [0, 0.69444, 0.01528, 0, 1.03889], + "88": [0, 0.69444, 0, 0, 0.73334], + "89": [0, 0.69444, 0.0275, 0, 0.73334], + "90": [0, 0.69444, 0, 0, 0.67223], + "91": [0.25, 0.75, 0, 0, 0.34306], + "93": [0.25, 0.75, 0, 0, 0.34306], + "94": [0, 0.69444, 0, 0, 0.55], + "95": [0.35, 0.10833, 0.03056, 0, 0.55], + "97": [0, 0.45833, 0, 0, 0.525], + "98": [0, 0.69444, 0, 0, 0.56111], + "99": [0, 0.45833, 0, 0, 0.48889], + "100": [0, 0.69444, 0, 0, 0.56111], + "101": [0, 0.45833, 0, 0, 0.51111], + "102": [0, 0.69444, 0.07639, 0, 0.33611], + "103": [0.19444, 0.45833, 0.01528, 0, 0.55], + "104": [0, 0.69444, 0, 0, 0.56111], + "105": [0, 0.69444, 0, 0, 0.25556], + "106": [0.19444, 0.69444, 0, 0, 0.28611], + "107": [0, 0.69444, 0, 0, 0.53056], + "108": [0, 0.69444, 0, 0, 0.25556], + "109": [0, 0.45833, 0, 0, 0.86667], + "110": [0, 0.45833, 0, 0, 0.56111], + "111": [0, 0.45833, 0, 0, 0.55], + "112": [0.19444, 0.45833, 0, 0, 0.56111], + "113": [0.19444, 0.45833, 0, 0, 0.56111], + "114": [0, 0.45833, 0.01528, 0, 0.37222], + "115": [0, 0.45833, 0, 0, 0.42167], + "116": [0, 0.58929, 0, 0, 0.40417], + "117": [0, 0.45833, 0, 0, 0.56111], + "118": [0, 0.45833, 0.01528, 0, 0.5], + "119": [0, 0.45833, 0.01528, 0, 0.74445], + "120": [0, 0.45833, 0, 0, 0.5], + "121": [0.19444, 0.45833, 0.01528, 0, 0.5], + "122": [0, 0.45833, 0, 0, 0.47639], + "126": [0.35, 0.34444, 0, 0, 0.55], + "168": [0, 0.69444, 0, 0, 0.55], + "176": [0, 0.69444, 0, 0, 0.73334], + "180": [0, 0.69444, 0, 0, 0.55], + "184": [0.17014, 0, 0, 0, 0.48889], + "305": [0, 0.45833, 0, 0, 0.25556], + "567": [0.19444, 0.45833, 0, 0, 0.28611], + "710": [0, 0.69444, 0, 0, 0.55], + "711": [0, 0.63542, 0, 0, 0.55], + "713": [0, 0.63778, 0, 0, 0.55], + "728": [0, 0.69444, 0, 0, 0.55], + "729": [0, 0.69444, 0, 0, 0.30556], + "730": [0, 0.69444, 0, 0, 0.73334], + "732": [0, 0.69444, 0, 0, 0.55], + "733": [0, 0.69444, 0, 0, 0.55], + "915": [0, 0.69444, 0, 0, 0.58056], + "916": [0, 0.69444, 0, 0, 0.91667], + "920": [0, 0.69444, 0, 0, 0.85556], + "923": [0, 0.69444, 0, 0, 0.67223], + "926": [0, 0.69444, 0, 0, 0.73334], + "928": [0, 0.69444, 0, 0, 0.79445], + "931": [0, 0.69444, 0, 0, 0.79445], + "933": [0, 0.69444, 0, 0, 0.85556], + "934": [0, 0.69444, 0, 0, 0.79445], + "936": [0, 0.69444, 0, 0, 0.85556], + "937": [0, 0.69444, 0, 0, 0.79445], + "8211": [0, 0.45833, 0.03056, 0, 0.55], + "8212": [0, 0.45833, 0.03056, 0, 1.10001], + "8216": [0, 0.69444, 0, 0, 0.30556], + "8217": [0, 0.69444, 0, 0, 0.30556], + "8220": [0, 0.69444, 0, 0, 0.55834], + "8221": [0, 0.69444, 0, 0, 0.55834] + }, + "SansSerif-Italic": { + "33": [0, 0.69444, 0.05733, 0, 0.31945], + "34": [0, 0.69444, 0.00316, 0, 0.5], + "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], + "36": [0.05556, 0.75, 0.11156, 0, 0.5], + "37": [0.05556, 0.75, 0.03126, 0, 0.83334], + "38": [0, 0.69444, 0.03058, 0, 0.75834], + "39": [0, 0.69444, 0.07816, 0, 0.27778], + "40": [0.25, 0.75, 0.13164, 0, 0.38889], + "41": [0.25, 0.75, 0.02536, 0, 0.38889], + "42": [0, 0.75, 0.11775, 0, 0.5], + "43": [0.08333, 0.58333, 0.02536, 0, 0.77778], + "44": [0.125, 0.08333, 0, 0, 0.27778], + "45": [0, 0.44444, 0.01946, 0, 0.33333], + "46": [0, 0.08333, 0, 0, 0.27778], + "47": [0.25, 0.75, 0.13164, 0, 0.5], + "48": [0, 0.65556, 0.11156, 0, 0.5], + "49": [0, 0.65556, 0.11156, 0, 0.5], + "50": [0, 0.65556, 0.11156, 0, 0.5], + "51": [0, 0.65556, 0.11156, 0, 0.5], + "52": [0, 0.65556, 0.11156, 0, 0.5], + "53": [0, 0.65556, 0.11156, 0, 0.5], + "54": [0, 0.65556, 0.11156, 0, 0.5], + "55": [0, 0.65556, 0.11156, 0, 0.5], + "56": [0, 0.65556, 0.11156, 0, 0.5], + "57": [0, 0.65556, 0.11156, 0, 0.5], + "58": [0, 0.44444, 0.02502, 0, 0.27778], + "59": [0.125, 0.44444, 0.02502, 0, 0.27778], + "61": [-0.13, 0.37, 0.05087, 0, 0.77778], + "63": [0, 0.69444, 0.11809, 0, 0.47222], + "64": [0, 0.69444, 0.07555, 0, 0.66667], + "65": [0, 0.69444, 0, 0, 0.66667], + "66": [0, 0.69444, 0.08293, 0, 0.66667], + "67": [0, 0.69444, 0.11983, 0, 0.63889], + "68": [0, 0.69444, 0.07555, 0, 0.72223], + "69": [0, 0.69444, 0.11983, 0, 0.59722], + "70": [0, 0.69444, 0.13372, 0, 0.56945], + "71": [0, 0.69444, 0.11983, 0, 0.66667], + "72": [0, 0.69444, 0.08094, 0, 0.70834], + "73": [0, 0.69444, 0.13372, 0, 0.27778], + "74": [0, 0.69444, 0.08094, 0, 0.47222], + "75": [0, 0.69444, 0.11983, 0, 0.69445], + "76": [0, 0.69444, 0, 0, 0.54167], + "77": [0, 0.69444, 0.08094, 0, 0.875], + "78": [0, 0.69444, 0.08094, 0, 0.70834], + "79": [0, 0.69444, 0.07555, 0, 0.73611], + "80": [0, 0.69444, 0.08293, 0, 0.63889], + "81": [0.125, 0.69444, 0.07555, 0, 0.73611], + "82": [0, 0.69444, 0.08293, 0, 0.64584], + "83": [0, 0.69444, 0.09205, 0, 0.55556], + "84": [0, 0.69444, 0.13372, 0, 0.68056], + "85": [0, 0.69444, 0.08094, 0, 0.6875], + "86": [0, 0.69444, 0.1615, 0, 0.66667], + "87": [0, 0.69444, 0.1615, 0, 0.94445], + "88": [0, 0.69444, 0.13372, 0, 0.66667], + "89": [0, 0.69444, 0.17261, 0, 0.66667], + "90": [0, 0.69444, 0.11983, 0, 0.61111], + "91": [0.25, 0.75, 0.15942, 0, 0.28889], + "93": [0.25, 0.75, 0.08719, 0, 0.28889], + "94": [0, 0.69444, 0.0799, 0, 0.5], + "95": [0.35, 0.09444, 0.08616, 0, 0.5], + "97": [0, 0.44444, 0.00981, 0, 0.48056], + "98": [0, 0.69444, 0.03057, 0, 0.51667], + "99": [0, 0.44444, 0.08336, 0, 0.44445], + "100": [0, 0.69444, 0.09483, 0, 0.51667], + "101": [0, 0.44444, 0.06778, 0, 0.44445], + "102": [0, 0.69444, 0.21705, 0, 0.30556], + "103": [0.19444, 0.44444, 0.10836, 0, 0.5], + "104": [0, 0.69444, 0.01778, 0, 0.51667], + "105": [0, 0.67937, 0.09718, 0, 0.23889], + "106": [0.19444, 0.67937, 0.09162, 0, 0.26667], + "107": [0, 0.69444, 0.08336, 0, 0.48889], + "108": [0, 0.69444, 0.09483, 0, 0.23889], + "109": [0, 0.44444, 0.01778, 0, 0.79445], + "110": [0, 0.44444, 0.01778, 0, 0.51667], + "111": [0, 0.44444, 0.06613, 0, 0.5], + "112": [0.19444, 0.44444, 0.0389, 0, 0.51667], + "113": [0.19444, 0.44444, 0.04169, 0, 0.51667], + "114": [0, 0.44444, 0.10836, 0, 0.34167], + "115": [0, 0.44444, 0.0778, 0, 0.38333], + "116": [0, 0.57143, 0.07225, 0, 0.36111], + "117": [0, 0.44444, 0.04169, 0, 0.51667], + "118": [0, 0.44444, 0.10836, 0, 0.46111], + "119": [0, 0.44444, 0.10836, 0, 0.68334], + "120": [0, 0.44444, 0.09169, 0, 0.46111], + "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], + "122": [0, 0.44444, 0.08752, 0, 0.43472], + "126": [0.35, 0.32659, 0.08826, 0, 0.5], + "168": [0, 0.67937, 0.06385, 0, 0.5], + "176": [0, 0.69444, 0, 0, 0.73752], + "184": [0.17014, 0, 0, 0, 0.44445], + "305": [0, 0.44444, 0.04169, 0, 0.23889], + "567": [0.19444, 0.44444, 0.04169, 0, 0.26667], + "710": [0, 0.69444, 0.0799, 0, 0.5], + "711": [0, 0.63194, 0.08432, 0, 0.5], + "713": [0, 0.60889, 0.08776, 0, 0.5], + "714": [0, 0.69444, 0.09205, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0.09483, 0, 0.5], + "729": [0, 0.67937, 0.07774, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.73752], + "732": [0, 0.67659, 0.08826, 0, 0.5], + "733": [0, 0.69444, 0.09205, 0, 0.5], + "915": [0, 0.69444, 0.13372, 0, 0.54167], + "916": [0, 0.69444, 0, 0, 0.83334], + "920": [0, 0.69444, 0.07555, 0, 0.77778], + "923": [0, 0.69444, 0, 0, 0.61111], + "926": [0, 0.69444, 0.12816, 0, 0.66667], + "928": [0, 0.69444, 0.08094, 0, 0.70834], + "931": [0, 0.69444, 0.11983, 0, 0.72222], + "933": [0, 0.69444, 0.09031, 0, 0.77778], + "934": [0, 0.69444, 0.04603, 0, 0.72222], + "936": [0, 0.69444, 0.09031, 0, 0.77778], + "937": [0, 0.69444, 0.08293, 0, 0.72222], + "8211": [0, 0.44444, 0.08616, 0, 0.5], + "8212": [0, 0.44444, 0.08616, 0, 1.0], + "8216": [0, 0.69444, 0.07816, 0, 0.27778], + "8217": [0, 0.69444, 0.07816, 0, 0.27778], + "8220": [0, 0.69444, 0.14205, 0, 0.5], + "8221": [0, 0.69444, 0.00316, 0, 0.5] + }, + "SansSerif-Regular": { + "33": [0, 0.69444, 0, 0, 0.31945], + "34": [0, 0.69444, 0, 0, 0.5], + "35": [0.19444, 0.69444, 0, 0, 0.83334], + "36": [0.05556, 0.75, 0, 0, 0.5], + "37": [0.05556, 0.75, 0, 0, 0.83334], + "38": [0, 0.69444, 0, 0, 0.75834], + "39": [0, 0.69444, 0, 0, 0.27778], + "40": [0.25, 0.75, 0, 0, 0.38889], + "41": [0.25, 0.75, 0, 0, 0.38889], + "42": [0, 0.75, 0, 0, 0.5], + "43": [0.08333, 0.58333, 0, 0, 0.77778], + "44": [0.125, 0.08333, 0, 0, 0.27778], + "45": [0, 0.44444, 0, 0, 0.33333], + "46": [0, 0.08333, 0, 0, 0.27778], + "47": [0.25, 0.75, 0, 0, 0.5], + "48": [0, 0.65556, 0, 0, 0.5], + "49": [0, 0.65556, 0, 0, 0.5], + "50": [0, 0.65556, 0, 0, 0.5], + "51": [0, 0.65556, 0, 0, 0.5], + "52": [0, 0.65556, 0, 0, 0.5], + "53": [0, 0.65556, 0, 0, 0.5], + "54": [0, 0.65556, 0, 0, 0.5], + "55": [0, 0.65556, 0, 0, 0.5], + "56": [0, 0.65556, 0, 0, 0.5], + "57": [0, 0.65556, 0, 0, 0.5], + "58": [0, 0.44444, 0, 0, 0.27778], + "59": [0.125, 0.44444, 0, 0, 0.27778], + "61": [-0.13, 0.37, 0, 0, 0.77778], + "63": [0, 0.69444, 0, 0, 0.47222], + "64": [0, 0.69444, 0, 0, 0.66667], + "65": [0, 0.69444, 0, 0, 0.66667], + "66": [0, 0.69444, 0, 0, 0.66667], + "67": [0, 0.69444, 0, 0, 0.63889], + "68": [0, 0.69444, 0, 0, 0.72223], + "69": [0, 0.69444, 0, 0, 0.59722], + "70": [0, 0.69444, 0, 0, 0.56945], + "71": [0, 0.69444, 0, 0, 0.66667], + "72": [0, 0.69444, 0, 0, 0.70834], + "73": [0, 0.69444, 0, 0, 0.27778], + "74": [0, 0.69444, 0, 0, 0.47222], + "75": [0, 0.69444, 0, 0, 0.69445], + "76": [0, 0.69444, 0, 0, 0.54167], + "77": [0, 0.69444, 0, 0, 0.875], + "78": [0, 0.69444, 0, 0, 0.70834], + "79": [0, 0.69444, 0, 0, 0.73611], + "80": [0, 0.69444, 0, 0, 0.63889], + "81": [0.125, 0.69444, 0, 0, 0.73611], + "82": [0, 0.69444, 0, 0, 0.64584], + "83": [0, 0.69444, 0, 0, 0.55556], + "84": [0, 0.69444, 0, 0, 0.68056], + "85": [0, 0.69444, 0, 0, 0.6875], + "86": [0, 0.69444, 0.01389, 0, 0.66667], + "87": [0, 0.69444, 0.01389, 0, 0.94445], + "88": [0, 0.69444, 0, 0, 0.66667], + "89": [0, 0.69444, 0.025, 0, 0.66667], + "90": [0, 0.69444, 0, 0, 0.61111], + "91": [0.25, 0.75, 0, 0, 0.28889], + "93": [0.25, 0.75, 0, 0, 0.28889], + "94": [0, 0.69444, 0, 0, 0.5], + "95": [0.35, 0.09444, 0.02778, 0, 0.5], + "97": [0, 0.44444, 0, 0, 0.48056], + "98": [0, 0.69444, 0, 0, 0.51667], + "99": [0, 0.44444, 0, 0, 0.44445], + "100": [0, 0.69444, 0, 0, 0.51667], + "101": [0, 0.44444, 0, 0, 0.44445], + "102": [0, 0.69444, 0.06944, 0, 0.30556], + "103": [0.19444, 0.44444, 0.01389, 0, 0.5], + "104": [0, 0.69444, 0, 0, 0.51667], + "105": [0, 0.67937, 0, 0, 0.23889], + "106": [0.19444, 0.67937, 0, 0, 0.26667], + "107": [0, 0.69444, 0, 0, 0.48889], + "108": [0, 0.69444, 0, 0, 0.23889], + "109": [0, 0.44444, 0, 0, 0.79445], + "110": [0, 0.44444, 0, 0, 0.51667], + "111": [0, 0.44444, 0, 0, 0.5], + "112": [0.19444, 0.44444, 0, 0, 0.51667], + "113": [0.19444, 0.44444, 0, 0, 0.51667], + "114": [0, 0.44444, 0.01389, 0, 0.34167], + "115": [0, 0.44444, 0, 0, 0.38333], + "116": [0, 0.57143, 0, 0, 0.36111], + "117": [0, 0.44444, 0, 0, 0.51667], + "118": [0, 0.44444, 0.01389, 0, 0.46111], + "119": [0, 0.44444, 0.01389, 0, 0.68334], + "120": [0, 0.44444, 0, 0, 0.46111], + "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], + "122": [0, 0.44444, 0, 0, 0.43472], + "126": [0.35, 0.32659, 0, 0, 0.5], + "168": [0, 0.67937, 0, 0, 0.5], + "176": [0, 0.69444, 0, 0, 0.66667], + "184": [0.17014, 0, 0, 0, 0.44445], + "305": [0, 0.44444, 0, 0, 0.23889], + "567": [0.19444, 0.44444, 0, 0, 0.26667], + "710": [0, 0.69444, 0, 0, 0.5], + "711": [0, 0.63194, 0, 0, 0.5], + "713": [0, 0.60889, 0, 0, 0.5], + "714": [0, 0.69444, 0, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0, 0, 0.5], + "729": [0, 0.67937, 0, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.66667], + "732": [0, 0.67659, 0, 0, 0.5], + "733": [0, 0.69444, 0, 0, 0.5], + "915": [0, 0.69444, 0, 0, 0.54167], + "916": [0, 0.69444, 0, 0, 0.83334], + "920": [0, 0.69444, 0, 0, 0.77778], + "923": [0, 0.69444, 0, 0, 0.61111], + "926": [0, 0.69444, 0, 0, 0.66667], + "928": [0, 0.69444, 0, 0, 0.70834], + "931": [0, 0.69444, 0, 0, 0.72222], + "933": [0, 0.69444, 0, 0, 0.77778], + "934": [0, 0.69444, 0, 0, 0.72222], + "936": [0, 0.69444, 0, 0, 0.77778], + "937": [0, 0.69444, 0, 0, 0.72222], + "8211": [0, 0.44444, 0.02778, 0, 0.5], + "8212": [0, 0.44444, 0.02778, 0, 1.0], + "8216": [0, 0.69444, 0, 0, 0.27778], + "8217": [0, 0.69444, 0, 0, 0.27778], + "8220": [0, 0.69444, 0, 0, 0.5], + "8221": [0, 0.69444, 0, 0, 0.5] + }, + "Script-Regular": { + "65": [0, 0.7, 0.22925, 0, 0.80253], + "66": [0, 0.7, 0.04087, 0, 0.90757], + "67": [0, 0.7, 0.1689, 0, 0.66619], + "68": [0, 0.7, 0.09371, 0, 0.77443], + "69": [0, 0.7, 0.18583, 0, 0.56162], + "70": [0, 0.7, 0.13634, 0, 0.89544], + "71": [0, 0.7, 0.17322, 0, 0.60961], + "72": [0, 0.7, 0.29694, 0, 0.96919], + "73": [0, 0.7, 0.19189, 0, 0.80907], + "74": [0.27778, 0.7, 0.19189, 0, 1.05159], + "75": [0, 0.7, 0.31259, 0, 0.91364], + "76": [0, 0.7, 0.19189, 0, 0.87373], + "77": [0, 0.7, 0.15981, 0, 1.08031], + "78": [0, 0.7, 0.3525, 0, 0.9015], + "79": [0, 0.7, 0.08078, 0, 0.73787], + "80": [0, 0.7, 0.08078, 0, 1.01262], + "81": [0, 0.7, 0.03305, 0, 0.88282], + "82": [0, 0.7, 0.06259, 0, 0.85], + "83": [0, 0.7, 0.19189, 0, 0.86767], + "84": [0, 0.7, 0.29087, 0, 0.74697], + "85": [0, 0.7, 0.25815, 0, 0.79996], + "86": [0, 0.7, 0.27523, 0, 0.62204], + "87": [0, 0.7, 0.27523, 0, 0.80532], + "88": [0, 0.7, 0.26006, 0, 0.94445], + "89": [0, 0.7, 0.2939, 0, 0.70961], + "90": [0, 0.7, 0.24037, 0, 0.8212] + }, + "Size1-Regular": { + "40": [0.35001, 0.85, 0, 0, 0.45834], + "41": [0.35001, 0.85, 0, 0, 0.45834], + "47": [0.35001, 0.85, 0, 0, 0.57778], + "91": [0.35001, 0.85, 0, 0, 0.41667], + "92": [0.35001, 0.85, 0, 0, 0.57778], + "93": [0.35001, 0.85, 0, 0, 0.41667], + "123": [0.35001, 0.85, 0, 0, 0.58334], + "125": [0.35001, 0.85, 0, 0, 0.58334], + "710": [0, 0.72222, 0, 0, 0.55556], + "732": [0, 0.72222, 0, 0, 0.55556], + "770": [0, 0.72222, 0, 0, 0.55556], + "771": [0, 0.72222, 0, 0, 0.55556], + "8214": [-0.00099, 0.601, 0, 0, 0.77778], + "8593": [1e-05, 0.6, 0, 0, 0.66667], + "8595": [1e-05, 0.6, 0, 0, 0.66667], + "8657": [1e-05, 0.6, 0, 0, 0.77778], + "8659": [1e-05, 0.6, 0, 0, 0.77778], + "8719": [0.25001, 0.75, 0, 0, 0.94445], + "8720": [0.25001, 0.75, 0, 0, 0.94445], + "8721": [0.25001, 0.75, 0, 0, 1.05556], + "8730": [0.35001, 0.85, 0, 0, 1.0], + "8739": [-0.00599, 0.606, 0, 0, 0.33333], + "8741": [-0.00599, 0.606, 0, 0, 0.55556], + "8747": [0.30612, 0.805, 0.19445, 0, 0.47222], + "8748": [0.306, 0.805, 0.19445, 0, 0.47222], + "8749": [0.306, 0.805, 0.19445, 0, 0.47222], + "8750": [0.30612, 0.805, 0.19445, 0, 0.47222], + "8896": [0.25001, 0.75, 0, 0, 0.83334], + "8897": [0.25001, 0.75, 0, 0, 0.83334], + "8898": [0.25001, 0.75, 0, 0, 0.83334], + "8899": [0.25001, 0.75, 0, 0, 0.83334], + "8968": [0.35001, 0.85, 0, 0, 0.47222], + "8969": [0.35001, 0.85, 0, 0, 0.47222], + "8970": [0.35001, 0.85, 0, 0, 0.47222], + "8971": [0.35001, 0.85, 0, 0, 0.47222], + "9168": [-0.00099, 0.601, 0, 0, 0.66667], + "10216": [0.35001, 0.85, 0, 0, 0.47222], + "10217": [0.35001, 0.85, 0, 0, 0.47222], + "10752": [0.25001, 0.75, 0, 0, 1.11111], + "10753": [0.25001, 0.75, 0, 0, 1.11111], + "10754": [0.25001, 0.75, 0, 0, 1.11111], + "10756": [0.25001, 0.75, 0, 0, 0.83334], + "10758": [0.25001, 0.75, 0, 0, 0.83334] + }, + "Size2-Regular": { + "40": [0.65002, 1.15, 0, 0, 0.59722], + "41": [0.65002, 1.15, 0, 0, 0.59722], + "47": [0.65002, 1.15, 0, 0, 0.81111], + "91": [0.65002, 1.15, 0, 0, 0.47222], + "92": [0.65002, 1.15, 0, 0, 0.81111], + "93": [0.65002, 1.15, 0, 0, 0.47222], + "123": [0.65002, 1.15, 0, 0, 0.66667], + "125": [0.65002, 1.15, 0, 0, 0.66667], + "710": [0, 0.75, 0, 0, 1.0], + "732": [0, 0.75, 0, 0, 1.0], + "770": [0, 0.75, 0, 0, 1.0], + "771": [0, 0.75, 0, 0, 1.0], + "8719": [0.55001, 1.05, 0, 0, 1.27778], + "8720": [0.55001, 1.05, 0, 0, 1.27778], + "8721": [0.55001, 1.05, 0, 0, 1.44445], + "8730": [0.65002, 1.15, 0, 0, 1.0], + "8747": [0.86225, 1.36, 0.44445, 0, 0.55556], + "8748": [0.862, 1.36, 0.44445, 0, 0.55556], + "8749": [0.862, 1.36, 0.44445, 0, 0.55556], + "8750": [0.86225, 1.36, 0.44445, 0, 0.55556], + "8896": [0.55001, 1.05, 0, 0, 1.11111], + "8897": [0.55001, 1.05, 0, 0, 1.11111], + "8898": [0.55001, 1.05, 0, 0, 1.11111], + "8899": [0.55001, 1.05, 0, 0, 1.11111], + "8968": [0.65002, 1.15, 0, 0, 0.52778], + "8969": [0.65002, 1.15, 0, 0, 0.52778], + "8970": [0.65002, 1.15, 0, 0, 0.52778], + "8971": [0.65002, 1.15, 0, 0, 0.52778], + "10216": [0.65002, 1.15, 0, 0, 0.61111], + "10217": [0.65002, 1.15, 0, 0, 0.61111], + "10752": [0.55001, 1.05, 0, 0, 1.51112], + "10753": [0.55001, 1.05, 0, 0, 1.51112], + "10754": [0.55001, 1.05, 0, 0, 1.51112], + "10756": [0.55001, 1.05, 0, 0, 1.11111], + "10758": [0.55001, 1.05, 0, 0, 1.11111] + }, + "Size3-Regular": { + "40": [0.95003, 1.45, 0, 0, 0.73611], + "41": [0.95003, 1.45, 0, 0, 0.73611], + "47": [0.95003, 1.45, 0, 0, 1.04445], + "91": [0.95003, 1.45, 0, 0, 0.52778], + "92": [0.95003, 1.45, 0, 0, 1.04445], + "93": [0.95003, 1.45, 0, 0, 0.52778], + "123": [0.95003, 1.45, 0, 0, 0.75], + "125": [0.95003, 1.45, 0, 0, 0.75], + "710": [0, 0.75, 0, 0, 1.44445], + "732": [0, 0.75, 0, 0, 1.44445], + "770": [0, 0.75, 0, 0, 1.44445], + "771": [0, 0.75, 0, 0, 1.44445], + "8730": [0.95003, 1.45, 0, 0, 1.0], + "8968": [0.95003, 1.45, 0, 0, 0.58334], + "8969": [0.95003, 1.45, 0, 0, 0.58334], + "8970": [0.95003, 1.45, 0, 0, 0.58334], + "8971": [0.95003, 1.45, 0, 0, 0.58334], + "10216": [0.95003, 1.45, 0, 0, 0.75], + "10217": [0.95003, 1.45, 0, 0, 0.75] + }, + "Size4-Regular": { + "40": [1.25003, 1.75, 0, 0, 0.79167], + "41": [1.25003, 1.75, 0, 0, 0.79167], + "47": [1.25003, 1.75, 0, 0, 1.27778], + "91": [1.25003, 1.75, 0, 0, 0.58334], + "92": [1.25003, 1.75, 0, 0, 1.27778], + "93": [1.25003, 1.75, 0, 0, 0.58334], + "123": [1.25003, 1.75, 0, 0, 0.80556], + "125": [1.25003, 1.75, 0, 0, 0.80556], + "710": [0, 0.825, 0, 0, 1.8889], + "732": [0, 0.825, 0, 0, 1.8889], + "770": [0, 0.825, 0, 0, 1.8889], + "771": [0, 0.825, 0, 0, 1.8889], + "8730": [1.25003, 1.75, 0, 0, 1.0], + "8968": [1.25003, 1.75, 0, 0, 0.63889], + "8969": [1.25003, 1.75, 0, 0, 0.63889], + "8970": [1.25003, 1.75, 0, 0, 0.63889], + "8971": [1.25003, 1.75, 0, 0, 0.63889], + "9115": [0.64502, 1.155, 0, 0, 0.875], + "9116": [1e-05, 0.6, 0, 0, 0.875], + "9117": [0.64502, 1.155, 0, 0, 0.875], + "9118": [0.64502, 1.155, 0, 0, 0.875], + "9119": [1e-05, 0.6, 0, 0, 0.875], + "9120": [0.64502, 1.155, 0, 0, 0.875], + "9121": [0.64502, 1.155, 0, 0, 0.66667], + "9122": [-0.00099, 0.601, 0, 0, 0.66667], + "9123": [0.64502, 1.155, 0, 0, 0.66667], + "9124": [0.64502, 1.155, 0, 0, 0.66667], + "9125": [-0.00099, 0.601, 0, 0, 0.66667], + "9126": [0.64502, 1.155, 0, 0, 0.66667], + "9127": [1e-05, 0.9, 0, 0, 0.88889], + "9128": [0.65002, 1.15, 0, 0, 0.88889], + "9129": [0.90001, 0, 0, 0, 0.88889], + "9130": [0, 0.3, 0, 0, 0.88889], + "9131": [1e-05, 0.9, 0, 0, 0.88889], + "9132": [0.65002, 1.15, 0, 0, 0.88889], + "9133": [0.90001, 0, 0, 0, 0.88889], + "9143": [0.88502, 0.915, 0, 0, 1.05556], + "10216": [1.25003, 1.75, 0, 0, 0.80556], + "10217": [1.25003, 1.75, 0, 0, 0.80556], + "57344": [-0.00499, 0.605, 0, 0, 1.05556], + "57345": [-0.00499, 0.605, 0, 0, 1.05556], + "57680": [0, 0.12, 0, 0, 0.45], + "57681": [0, 0.12, 0, 0, 0.45], + "57682": [0, 0.12, 0, 0, 0.45], + "57683": [0, 0.12, 0, 0, 0.45] + }, + "Typewriter-Regular": { + "32": [0, 0, 0, 0, 0.525], + "33": [0, 0.61111, 0, 0, 0.525], + "34": [0, 0.61111, 0, 0, 0.525], + "35": [0, 0.61111, 0, 0, 0.525], + "36": [0.08333, 0.69444, 0, 0, 0.525], + "37": [0.08333, 0.69444, 0, 0, 0.525], + "38": [0, 0.61111, 0, 0, 0.525], + "39": [0, 0.61111, 0, 0, 0.525], + "40": [0.08333, 0.69444, 0, 0, 0.525], + "41": [0.08333, 0.69444, 0, 0, 0.525], + "42": [0, 0.52083, 0, 0, 0.525], + "43": [-0.08056, 0.53055, 0, 0, 0.525], + "44": [0.13889, 0.125, 0, 0, 0.525], + "45": [-0.08056, 0.53055, 0, 0, 0.525], + "46": [0, 0.125, 0, 0, 0.525], + "47": [0.08333, 0.69444, 0, 0, 0.525], + "48": [0, 0.61111, 0, 0, 0.525], + "49": [0, 0.61111, 0, 0, 0.525], + "50": [0, 0.61111, 0, 0, 0.525], + "51": [0, 0.61111, 0, 0, 0.525], + "52": [0, 0.61111, 0, 0, 0.525], + "53": [0, 0.61111, 0, 0, 0.525], + "54": [0, 0.61111, 0, 0, 0.525], + "55": [0, 0.61111, 0, 0, 0.525], + "56": [0, 0.61111, 0, 0, 0.525], + "57": [0, 0.61111, 0, 0, 0.525], + "58": [0, 0.43056, 0, 0, 0.525], + "59": [0.13889, 0.43056, 0, 0, 0.525], + "60": [-0.05556, 0.55556, 0, 0, 0.525], + "61": [-0.19549, 0.41562, 0, 0, 0.525], + "62": [-0.05556, 0.55556, 0, 0, 0.525], + "63": [0, 0.61111, 0, 0, 0.525], + "64": [0, 0.61111, 0, 0, 0.525], + "65": [0, 0.61111, 0, 0, 0.525], + "66": [0, 0.61111, 0, 0, 0.525], + "67": [0, 0.61111, 0, 0, 0.525], + "68": [0, 0.61111, 0, 0, 0.525], + "69": [0, 0.61111, 0, 0, 0.525], + "70": [0, 0.61111, 0, 0, 0.525], + "71": [0, 0.61111, 0, 0, 0.525], + "72": [0, 0.61111, 0, 0, 0.525], + "73": [0, 0.61111, 0, 0, 0.525], + "74": [0, 0.61111, 0, 0, 0.525], + "75": [0, 0.61111, 0, 0, 0.525], + "76": [0, 0.61111, 0, 0, 0.525], + "77": [0, 0.61111, 0, 0, 0.525], + "78": [0, 0.61111, 0, 0, 0.525], + "79": [0, 0.61111, 0, 0, 0.525], + "80": [0, 0.61111, 0, 0, 0.525], + "81": [0.13889, 0.61111, 0, 0, 0.525], + "82": [0, 0.61111, 0, 0, 0.525], + "83": [0, 0.61111, 0, 0, 0.525], + "84": [0, 0.61111, 0, 0, 0.525], + "85": [0, 0.61111, 0, 0, 0.525], + "86": [0, 0.61111, 0, 0, 0.525], + "87": [0, 0.61111, 0, 0, 0.525], + "88": [0, 0.61111, 0, 0, 0.525], + "89": [0, 0.61111, 0, 0, 0.525], + "90": [0, 0.61111, 0, 0, 0.525], + "91": [0.08333, 0.69444, 0, 0, 0.525], + "92": [0.08333, 0.69444, 0, 0, 0.525], + "93": [0.08333, 0.69444, 0, 0, 0.525], + "94": [0, 0.61111, 0, 0, 0.525], + "95": [0.09514, 0, 0, 0, 0.525], + "96": [0, 0.61111, 0, 0, 0.525], + "97": [0, 0.43056, 0, 0, 0.525], + "98": [0, 0.61111, 0, 0, 0.525], + "99": [0, 0.43056, 0, 0, 0.525], + "100": [0, 0.61111, 0, 0, 0.525], + "101": [0, 0.43056, 0, 0, 0.525], + "102": [0, 0.61111, 0, 0, 0.525], + "103": [0.22222, 0.43056, 0, 0, 0.525], + "104": [0, 0.61111, 0, 0, 0.525], + "105": [0, 0.61111, 0, 0, 0.525], + "106": [0.22222, 0.61111, 0, 0, 0.525], + "107": [0, 0.61111, 0, 0, 0.525], + "108": [0, 0.61111, 0, 0, 0.525], + "109": [0, 0.43056, 0, 0, 0.525], + "110": [0, 0.43056, 0, 0, 0.525], + "111": [0, 0.43056, 0, 0, 0.525], + "112": [0.22222, 0.43056, 0, 0, 0.525], + "113": [0.22222, 0.43056, 0, 0, 0.525], + "114": [0, 0.43056, 0, 0, 0.525], + "115": [0, 0.43056, 0, 0, 0.525], + "116": [0, 0.55358, 0, 0, 0.525], + "117": [0, 0.43056, 0, 0, 0.525], + "118": [0, 0.43056, 0, 0, 0.525], + "119": [0, 0.43056, 0, 0, 0.525], + "120": [0, 0.43056, 0, 0, 0.525], + "121": [0.22222, 0.43056, 0, 0, 0.525], + "122": [0, 0.43056, 0, 0, 0.525], + "123": [0.08333, 0.69444, 0, 0, 0.525], + "124": [0.08333, 0.69444, 0, 0, 0.525], + "125": [0.08333, 0.69444, 0, 0, 0.525], + "126": [0, 0.61111, 0, 0, 0.525], + "127": [0, 0.61111, 0, 0, 0.525], + "160": [0, 0, 0, 0, 0.525], + "176": [0, 0.61111, 0, 0, 0.525], + "184": [0.19445, 0, 0, 0, 0.525], + "305": [0, 0.43056, 0, 0, 0.525], + "567": [0.22222, 0.43056, 0, 0, 0.525], + "711": [0, 0.56597, 0, 0, 0.525], + "713": [0, 0.56555, 0, 0, 0.525], + "714": [0, 0.61111, 0, 0, 0.525], + "715": [0, 0.61111, 0, 0, 0.525], + "728": [0, 0.61111, 0, 0, 0.525], + "730": [0, 0.61111, 0, 0, 0.525], + "770": [0, 0.61111, 0, 0, 0.525], + "771": [0, 0.61111, 0, 0, 0.525], + "776": [0, 0.61111, 0, 0, 0.525], + "915": [0, 0.61111, 0, 0, 0.525], + "916": [0, 0.61111, 0, 0, 0.525], + "920": [0, 0.61111, 0, 0, 0.525], + "923": [0, 0.61111, 0, 0, 0.525], + "926": [0, 0.61111, 0, 0, 0.525], + "928": [0, 0.61111, 0, 0, 0.525], + "931": [0, 0.61111, 0, 0, 0.525], + "933": [0, 0.61111, 0, 0, 0.525], + "934": [0, 0.61111, 0, 0, 0.525], + "936": [0, 0.61111, 0, 0, 0.525], + "937": [0, 0.61111, 0, 0, 0.525], + "8216": [0, 0.61111, 0, 0, 0.525], + "8217": [0, 0.61111, 0, 0, 0.525], + "8242": [0, 0.61111, 0, 0, 0.525], + "9251": [0.11111, 0.21944, 0, 0, 0.525] + } +}); +// CONCATENATED MODULE: ./src/fontMetrics.js /** @@ -4805,7 +3600,6 @@ module.exports = function(it){ * TeX, TeX font metrics, and the TTF files. These data are then exposed via the * `metrics` variable and the getCharacterMetrics function. */ - // In TeX, there are actually three sets of dimensions, one for each of // textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4: // 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are @@ -4830,147 +3624,175 @@ module.exports = function(it){ // The output of each of these commands is quite lengthy. The only part we // care about is the FONTDIMEN section. Each value is measured in EMs. var sigmasAndXis = { - slant: [0.250, 0.250, 0.250], // sigma1 - space: [0.000, 0.000, 0.000], // sigma2 - stretch: [0.000, 0.000, 0.000], // sigma3 - shrink: [0.000, 0.000, 0.000], // sigma4 - xHeight: [0.431, 0.431, 0.431], // sigma5 - quad: [1.000, 1.171, 1.472], // sigma6 - extraSpace: [0.000, 0.000, 0.000], // sigma7 - num1: [0.677, 0.732, 0.925], // sigma8 - num2: [0.394, 0.384, 0.387], // sigma9 - num3: [0.444, 0.471, 0.504], // sigma10 - denom1: [0.686, 0.752, 1.025], // sigma11 - denom2: [0.345, 0.344, 0.532], // sigma12 - sup1: [0.413, 0.503, 0.504], // sigma13 - sup2: [0.363, 0.431, 0.404], // sigma14 - sup3: [0.289, 0.286, 0.294], // sigma15 - sub1: [0.150, 0.143, 0.200], // sigma16 - sub2: [0.247, 0.286, 0.400], // sigma17 - supDrop: [0.386, 0.353, 0.494], // sigma18 - subDrop: [0.050, 0.071, 0.100], // sigma19 - delim1: [2.390, 1.700, 1.980], // sigma20 - delim2: [1.010, 1.157, 1.420], // sigma21 - axisHeight: [0.250, 0.250, 0.250], // sigma22 - - // These font metrics are extracted from TeX by using tftopl on cmex10.tfm; - // they correspond to the font parameters of the extension fonts (family 3). - // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to - // match cmex7, we'd use cmex7.tfm values for script and scriptscript - // values. - defaultRuleThickness: [0.04, 0.049, 0.049], // xi8; cmex7: 0.049 - bigOpSpacing1: [0.111, 0.111, 0.111], // xi9 - bigOpSpacing2: [0.166, 0.166, 0.166], // xi10 - bigOpSpacing3: [0.2, 0.2, 0.2], // xi11 - bigOpSpacing4: [0.6, 0.611, 0.611], // xi12; cmex7: 0.611 - bigOpSpacing5: [0.1, 0.143, 0.143], // xi13; cmex7: 0.143 - - // The \sqrt rule width is taken from the height of the surd character. - // Since we use the same font at all sizes, this thickness doesn't scale. - sqrtRuleThickness: [0.04, 0.04, 0.04], - - // This value determines how large a pt is, for metrics which are defined - // in terms of pts. - // This value is also used in katex.less; if you change it make sure the - // values match. - ptPerEm: [10.0, 10.0, 10.0], - - // The space between adjacent `|` columns in an array definition. From - // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. - doubleRuleSep: [0.2, 0.2, 0.2] -}; - -// This map contains a mapping from font name and character code to character + slant: [0.250, 0.250, 0.250], + // sigma1 + space: [0.000, 0.000, 0.000], + // sigma2 + stretch: [0.000, 0.000, 0.000], + // sigma3 + shrink: [0.000, 0.000, 0.000], + // sigma4 + xHeight: [0.431, 0.431, 0.431], + // sigma5 + quad: [1.000, 1.171, 1.472], + // sigma6 + extraSpace: [0.000, 0.000, 0.000], + // sigma7 + num1: [0.677, 0.732, 0.925], + // sigma8 + num2: [0.394, 0.384, 0.387], + // sigma9 + num3: [0.444, 0.471, 0.504], + // sigma10 + denom1: [0.686, 0.752, 1.025], + // sigma11 + denom2: [0.345, 0.344, 0.532], + // sigma12 + sup1: [0.413, 0.503, 0.504], + // sigma13 + sup2: [0.363, 0.431, 0.404], + // sigma14 + sup3: [0.289, 0.286, 0.294], + // sigma15 + sub1: [0.150, 0.143, 0.200], + // sigma16 + sub2: [0.247, 0.286, 0.400], + // sigma17 + supDrop: [0.386, 0.353, 0.494], + // sigma18 + subDrop: [0.050, 0.071, 0.100], + // sigma19 + delim1: [2.390, 1.700, 1.980], + // sigma20 + delim2: [1.010, 1.157, 1.420], + // sigma21 + axisHeight: [0.250, 0.250, 0.250], + // sigma22 + // These font metrics are extracted from TeX by using tftopl on cmex10.tfm; + // they correspond to the font parameters of the extension fonts (family 3). + // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to + // match cmex7, we'd use cmex7.tfm values for script and scriptscript + // values. + defaultRuleThickness: [0.04, 0.049, 0.049], + // xi8; cmex7: 0.049 + bigOpSpacing1: [0.111, 0.111, 0.111], + // xi9 + bigOpSpacing2: [0.166, 0.166, 0.166], + // xi10 + bigOpSpacing3: [0.2, 0.2, 0.2], + // xi11 + bigOpSpacing4: [0.6, 0.611, 0.611], + // xi12; cmex7: 0.611 + bigOpSpacing5: [0.1, 0.143, 0.143], + // xi13; cmex7: 0.143 + // The \sqrt rule width is taken from the height of the surd character. + // Since we use the same font at all sizes, this thickness doesn't scale. + sqrtRuleThickness: [0.04, 0.04, 0.04], + // This value determines how large a pt is, for metrics which are defined + // in terms of pts. + // This value is also used in katex.less; if you change it make sure the + // values match. + ptPerEm: [10.0, 10.0, 10.0], + // The space between adjacent `|` columns in an array definition. From + // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. + doubleRuleSep: [0.2, 0.2, 0.2] +}; // This map contains a mapping from font name and character code to character // metrics, including height, depth, italic correction, and skew (kern from the // character to the corresponding \skewchar) // This map is generated via `make metrics`. It should not be changed manually. - -// These are very rough approximations. We default to Times New Roman which + // These are very rough approximations. We default to Times New Roman which // should have Latin-1 and Cyrillic characters, but may not depending on the // operating system. The metrics do not account for extra height from the // accents. In the case of Cyrillic characters which have both ascenders and // descenders we prefer approximations with ascenders, primarily to prevent // the fraction bar or root line from intersecting the glyph. // TODO(kevinb) allow union of multiple glyph metrics for better accuracy. -var extraCharacterMap = { - // Latin-1 - 'Å': 'A', - 'Ç': 'C', - 'Ð': 'D', - 'Þ': 'o', - 'å': 'a', - 'ç': 'c', - 'ð': 'd', - 'þ': 'o', - // Cyrillic - 'А': 'A', - 'Б': 'B', - 'В': 'B', - 'Г': 'F', - 'Д': 'A', - 'Е': 'E', - 'Ж': 'K', - 'З': '3', - 'И': 'N', - 'Й': 'N', - 'К': 'K', - 'Л': 'N', - 'М': 'M', - 'Н': 'H', - 'О': 'O', - 'П': 'N', - 'Р': 'P', - 'С': 'C', - 'Т': 'T', - 'У': 'y', - 'Ф': 'O', - 'Х': 'X', - 'Ц': 'U', - 'Ч': 'h', - 'Ш': 'W', - 'Щ': 'W', - 'Ъ': 'B', - 'Ы': 'X', - 'Ь': 'B', - 'Э': '3', - 'Ю': 'X', - 'Я': 'R', - 'а': 'a', - 'б': 'b', - 'в': 'a', - 'г': 'r', - 'д': 'y', - 'е': 'e', - 'ж': 'm', - 'з': 'e', - 'и': 'n', - 'й': 'n', - 'к': 'n', - 'л': 'n', - 'м': 'm', - 'н': 'n', - 'о': 'o', - 'п': 'n', - 'р': 'p', - 'с': 'c', - 'т': 'o', - 'у': 'y', - 'ф': 'b', - 'х': 'x', - 'ц': 'n', - 'ч': 'n', - 'ш': 'w', - 'щ': 'w', - 'ъ': 'a', - 'ы': 'm', - 'ь': 'a', - 'э': 'e', - 'ю': 'm', - 'я': 'r' +var extraCharacterMap = { + // Latin-1 + 'Å': 'A', + 'Ç': 'C', + 'Ð': 'D', + 'Þ': 'o', + 'å': 'a', + 'ç': 'c', + 'ð': 'd', + 'þ': 'o', + // Cyrillic + 'А': 'A', + 'Б': 'B', + 'В': 'B', + 'Г': 'F', + 'Д': 'A', + 'Е': 'E', + 'Ж': 'K', + 'З': '3', + 'И': 'N', + 'Й': 'N', + 'К': 'K', + 'Л': 'N', + 'М': 'M', + 'Н': 'H', + 'О': 'O', + 'П': 'N', + 'Р': 'P', + 'С': 'C', + 'Т': 'T', + 'У': 'y', + 'Ф': 'O', + 'Х': 'X', + 'Ц': 'U', + 'Ч': 'h', + 'Ш': 'W', + 'Щ': 'W', + 'Ъ': 'B', + 'Ы': 'X', + 'Ь': 'B', + 'Э': '3', + 'Ю': 'X', + 'Я': 'R', + 'а': 'a', + 'б': 'b', + 'в': 'a', + 'г': 'r', + 'д': 'y', + 'е': 'e', + 'ж': 'm', + 'з': 'e', + 'и': 'n', + 'й': 'n', + 'к': 'n', + 'л': 'n', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'n', + 'р': 'p', + 'с': 'c', + 'т': 'o', + 'у': 'y', + 'ф': 'b', + 'х': 'x', + 'ц': 'n', + 'ч': 'n', + 'ш': 'w', + 'щ': 'w', + 'ъ': 'a', + 'ы': 'm', + 'ь': 'a', + 'э': 'e', + 'ю': 'm', + 'я': 'r' }; +/** + * This function adds new font metrics to default metricMap + * It can also override existing metrics + */ +function setFontMetrics(fontName, metrics) { + fontMetricsData[fontName] = metrics; +} /** * This function is a convenience function for looking up information in the * metricMap table. It takes a character as a string, and a font. @@ -4978,480 +3800,1043 @@ var extraCharacterMap = { * Note: the `width` property may be undefined if fontMetricsData.js wasn't * built using `Make extended_metrics`. */ -var getCharacterMetrics = function getCharacterMetrics(character, font, mode) { - if (!__WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__["a" /* default */][font]) { - throw new Error("Font metrics not found for font: " + font + "."); - } - var ch = character.charCodeAt(0); - if (character[0] in extraCharacterMap) { - ch = extraCharacterMap[character[0]].charCodeAt(0); - } - var metrics = __WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__["a" /* default */][font][ch]; - if (!metrics && mode === 'text') { - // We don't typically have font metrics for Asian scripts. - // But since we support them in text mode, we need to return - // some sort of metrics. - // So if the character is in a script we support but we - // don't have metrics for it, just use the metrics for - // the Latin capital letter M. This is close enough because - // we (currently) only care about the height of the glpyh - // not its width. - if (Object(__WEBPACK_IMPORTED_MODULE_0__unicodeScripts__["b" /* supportedCodepoint */])(ch)) { - metrics = __WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__["a" /* default */][font][77]; // 77 is the charcode for 'M' - } - } +function getCharacterMetrics(character, font, mode) { + if (!fontMetricsData[font]) { + throw new Error("Font metrics not found for font: " + font + "."); + } - if (metrics) { - return { - depth: metrics[0], - height: metrics[1], - italic: metrics[2], - skew: metrics[3], - width: metrics[4] - }; - } -}; + var ch = character.charCodeAt(0); + var metrics = fontMetricsData[font][ch]; + if (!metrics && character[0] in extraCharacterMap) { + ch = extraCharacterMap[character[0]].charCodeAt(0); + metrics = fontMetricsData[font][ch]; + } + + if (!metrics && mode === 'text') { + // We don't typically have font metrics for Asian scripts. + // But since we support them in text mode, we need to return + // some sort of metrics. + // So if the character is in a script we support but we + // don't have metrics for it, just use the metrics for + // the Latin capital letter M. This is close enough because + // we (currently) only care about the height of the glpyh + // not its width. + if (supportedCodepoint(ch)) { + metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M' + } + } + + if (metrics) { + return { + depth: metrics[0], + height: metrics[1], + italic: metrics[2], + skew: metrics[3], + width: metrics[4] + }; + } +} var fontMetricsBySizeIndex = {}; - /** * Get the font metrics for a given size. */ -var getFontMetrics = function getFontMetrics(size) { - var sizeIndex = void 0; - if (size >= 5) { - sizeIndex = 0; - } else if (size >= 3) { - sizeIndex = 1; - } else { - sizeIndex = 2; - } - if (!fontMetricsBySizeIndex[sizeIndex]) { - var metrics = fontMetricsBySizeIndex[sizeIndex] = { - cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18 - }; - for (var key in sigmasAndXis) { - if (sigmasAndXis.hasOwnProperty(key)) { - metrics[key] = sigmasAndXis[key][sizeIndex]; - } - } - } - return fontMetricsBySizeIndex[sizeIndex]; -}; -/* harmony default export */ __webpack_exports__["a"] = ({ - getFontMetrics: getFontMetrics, - getCharacterMetrics: getCharacterMetrics -}); +function getGlobalMetrics(size) { + var sizeIndex; -/***/ }), -/* 31 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze__ = __webpack_require__(66); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__); - - - - -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -var SourceLocation = function () { - // End offset, zero-based exclusive. - - // Lexer holding the input string. - function SourceLocation(lexer, start, end) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, SourceLocation); - - this.lexer = lexer; - this.start = start; - this.end = end; - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze___default()(this); // Immutable to allow sharing in range(). - } - - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - // Start offset, zero-based inclusive. - - - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(SourceLocation, null, [{ - key: "range", - value: function range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - } - }]); - - return SourceLocation; -}(); - -/* harmony default export */ __webpack_exports__["a"] = (SourceLocation); - -/***/ }), -/* 32 */ -/***/ (function(module, exports) { - -var id = 0 - , px = Math.random(); -module.exports = function(key){ - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; - -/***/ }), -/* 33 */ -/***/ (function(module, exports) { - -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; - -/***/ }), -/* 34 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils__ = __webpack_require__(5); - - -/** - * This is a module for storing settings passed into KaTeX. It correctly handles - * default settings. - */ - - - -/** - * The main Settings object - * - * The current options stored are: - * - displayMode: Whether the expression should be typeset as inline math - * (false, the default), meaning that the math starts in - * \textstyle and is placed in an inline-block); or as display - * math (true), meaning that the math starts in \displaystyle - * and is placed in a block with vertical margin. - */ -var Settings = function Settings(options) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Settings); - - // allow null options - options = options || {}; - this.displayMode = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.displayMode, false); - this.throwOnError = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.throwOnError, true); - this.errorColor = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.errorColor, "#cc0000"); - this.macros = options.macros || {}; - this.colorIsTextColor = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.colorIsTextColor, false); - this.maxSize = Math.max(0, __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.maxSize, Infinity)); -}; - -/* harmony default export */ __webpack_exports__["a"] = (Settings); - -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _from = __webpack_require__(79); - -var _from2 = _interopRequireDefault(_from); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { - arr2[i] = arr[i]; - } - - return arr2; + if (size >= 5) { + sizeIndex = 0; + } else if (size >= 3) { + sizeIndex = 1; } else { - return (0, _from2.default)(arr); + sizeIndex = 2; + } + + if (!fontMetricsBySizeIndex[sizeIndex]) { + var metrics = fontMetricsBySizeIndex[sizeIndex] = { + cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18 + }; + + for (var key in sigmasAndXis) { + if (sigmasAndXis.hasOwnProperty(key)) { + metrics[key] = sigmasAndXis[key][sizeIndex]; + } + } + } + + return fontMetricsBySizeIndex[sizeIndex]; +} +// CONCATENATED MODULE: ./src/symbols.js +/** + * This file holds a list of all no-argument functions and single-character + * symbols (like 'a' or ';'). + * + * For each of the symbols, there are three properties they can have: + * - font (required): the font to be used for this symbol. Either "main" (the + normal font), or "ams" (the ams fonts). + * - group (required): the ParseNode group type the symbol should have (i.e. + "textord", "mathord", etc). + See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types + * - replace: the character that this symbol or function should be + * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi + * character in the main font). + * + * The outermost map in the table indicates what mode the symbols should be + * accepted in (e.g. "math" or "text"). + */ +// Some of these have a "-token" suffix since these are also used as `ParseNode` +// types for raw text tokens, and we want to avoid conflicts with higher-level +// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by +// looking up the `symbols` map. +var ATOMS = { + "bin": 1, + "close": 1, + "inner": 1, + "open": 1, + "punct": 1, + "rel": 1 +}; +var NON_ATOMS = { + "accent-token": 1, + "mathord": 1, + "op-token": 1, + "spacing": 1, + "textord": 1 +}; +var symbols = { + "math": {}, + "text": {} +}; +/* harmony default export */ var src_symbols = (symbols); +/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ + +function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) { + symbols[mode][name] = { + font: font, + group: group, + replace: replace + }; + + if (acceptUnicodeChar && replace) { + symbols[mode][replace] = symbols[mode][name]; + } +} // Some abbreviations for commonly used strings. +// This helps minify the code, and also spotting typos using jshint. +// modes: + +var symbols_math = "math"; +var symbols_text = "text"; // fonts: + +var main = "main"; +var ams = "ams"; // groups: + +var symbols_accent = "accent-token"; +var bin = "bin"; +var symbols_close = "close"; +var symbols_inner = "inner"; +var mathord = "mathord"; +var op = "op-token"; +var symbols_open = "open"; +var punct = "punct"; +var rel = "rel"; +var symbols_spacing = "spacing"; +var symbols_textord = "textord"; // Now comes the symbol table +// Relation Symbols + +defineSymbol(symbols_math, main, rel, "\u2261", "\\equiv", true); +defineSymbol(symbols_math, main, rel, "\u227A", "\\prec", true); +defineSymbol(symbols_math, main, rel, "\u227B", "\\succ", true); +defineSymbol(symbols_math, main, rel, "\u223C", "\\sim", true); +defineSymbol(symbols_math, main, rel, "\u22A5", "\\perp"); +defineSymbol(symbols_math, main, rel, "\u2AAF", "\\preceq", true); +defineSymbol(symbols_math, main, rel, "\u2AB0", "\\succeq", true); +defineSymbol(symbols_math, main, rel, "\u2243", "\\simeq", true); +defineSymbol(symbols_math, main, rel, "\u2223", "\\mid", true); +defineSymbol(symbols_math, main, rel, "\u226A", "\\ll", true); +defineSymbol(symbols_math, main, rel, "\u226B", "\\gg", true); +defineSymbol(symbols_math, main, rel, "\u224D", "\\asymp", true); +defineSymbol(symbols_math, main, rel, "\u2225", "\\parallel"); +defineSymbol(symbols_math, main, rel, "\u22C8", "\\bowtie", true); +defineSymbol(symbols_math, main, rel, "\u2323", "\\smile", true); +defineSymbol(symbols_math, main, rel, "\u2291", "\\sqsubseteq", true); +defineSymbol(symbols_math, main, rel, "\u2292", "\\sqsupseteq", true); +defineSymbol(symbols_math, main, rel, "\u2250", "\\doteq", true); +defineSymbol(symbols_math, main, rel, "\u2322", "\\frown", true); +defineSymbol(symbols_math, main, rel, "\u220B", "\\ni", true); +defineSymbol(symbols_math, main, rel, "\u221D", "\\propto", true); +defineSymbol(symbols_math, main, rel, "\u22A2", "\\vdash", true); +defineSymbol(symbols_math, main, rel, "\u22A3", "\\dashv", true); +defineSymbol(symbols_math, main, rel, "\u220B", "\\owns"); // Punctuation + +defineSymbol(symbols_math, main, punct, ".", "\\ldotp"); +defineSymbol(symbols_math, main, punct, "\u22C5", "\\cdotp"); // Misc Symbols + +defineSymbol(symbols_math, main, symbols_textord, "#", "\\#"); +defineSymbol(symbols_text, main, symbols_textord, "#", "\\#"); +defineSymbol(symbols_math, main, symbols_textord, "&", "\\&"); +defineSymbol(symbols_text, main, symbols_textord, "&", "\\&"); +defineSymbol(symbols_math, main, symbols_textord, "\u2135", "\\aleph", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2200", "\\forall", true); +defineSymbol(symbols_math, main, symbols_textord, "\u210F", "\\hbar", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2203", "\\exists", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2207", "\\nabla", true); +defineSymbol(symbols_math, main, symbols_textord, "\u266D", "\\flat", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2113", "\\ell", true); +defineSymbol(symbols_math, main, symbols_textord, "\u266E", "\\natural", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2663", "\\clubsuit", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2118", "\\wp", true); +defineSymbol(symbols_math, main, symbols_textord, "\u266F", "\\sharp", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2662", "\\diamondsuit", true); +defineSymbol(symbols_math, main, symbols_textord, "\u211C", "\\Re", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2661", "\\heartsuit", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2111", "\\Im", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2660", "\\spadesuit", true); +defineSymbol(symbols_text, main, symbols_textord, "\xA7", "\\S", true); +defineSymbol(symbols_text, main, symbols_textord, "\xB6", "\\P", true); // Math and Text + +defineSymbol(symbols_math, main, symbols_textord, "\u2020", "\\dag"); +defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\dag"); +defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\textdagger"); +defineSymbol(symbols_math, main, symbols_textord, "\u2021", "\\ddag"); +defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\ddag"); +defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\textdaggerdbl"); // Large Delimiters + +defineSymbol(symbols_math, main, symbols_close, "\u23B1", "\\rmoustache", true); +defineSymbol(symbols_math, main, symbols_open, "\u23B0", "\\lmoustache", true); +defineSymbol(symbols_math, main, symbols_close, "\u27EF", "\\rgroup", true); +defineSymbol(symbols_math, main, symbols_open, "\u27EE", "\\lgroup", true); // Binary Operators + +defineSymbol(symbols_math, main, bin, "\u2213", "\\mp", true); +defineSymbol(symbols_math, main, bin, "\u2296", "\\ominus", true); +defineSymbol(symbols_math, main, bin, "\u228E", "\\uplus", true); +defineSymbol(symbols_math, main, bin, "\u2293", "\\sqcap", true); +defineSymbol(symbols_math, main, bin, "\u2217", "\\ast"); +defineSymbol(symbols_math, main, bin, "\u2294", "\\sqcup", true); +defineSymbol(symbols_math, main, bin, "\u25EF", "\\bigcirc"); +defineSymbol(symbols_math, main, bin, "\u2219", "\\bullet"); +defineSymbol(symbols_math, main, bin, "\u2021", "\\ddagger"); +defineSymbol(symbols_math, main, bin, "\u2240", "\\wr", true); +defineSymbol(symbols_math, main, bin, "\u2A3F", "\\amalg"); +defineSymbol(symbols_math, main, bin, "&", "\\And"); // from amsmath +// Arrow Symbols + +defineSymbol(symbols_math, main, rel, "\u27F5", "\\longleftarrow", true); +defineSymbol(symbols_math, main, rel, "\u21D0", "\\Leftarrow", true); +defineSymbol(symbols_math, main, rel, "\u27F8", "\\Longleftarrow", true); +defineSymbol(symbols_math, main, rel, "\u27F6", "\\longrightarrow", true); +defineSymbol(symbols_math, main, rel, "\u21D2", "\\Rightarrow", true); +defineSymbol(symbols_math, main, rel, "\u27F9", "\\Longrightarrow", true); +defineSymbol(symbols_math, main, rel, "\u2194", "\\leftrightarrow", true); +defineSymbol(symbols_math, main, rel, "\u27F7", "\\longleftrightarrow", true); +defineSymbol(symbols_math, main, rel, "\u21D4", "\\Leftrightarrow", true); +defineSymbol(symbols_math, main, rel, "\u27FA", "\\Longleftrightarrow", true); +defineSymbol(symbols_math, main, rel, "\u21A6", "\\mapsto", true); +defineSymbol(symbols_math, main, rel, "\u27FC", "\\longmapsto", true); +defineSymbol(symbols_math, main, rel, "\u2197", "\\nearrow", true); +defineSymbol(symbols_math, main, rel, "\u21A9", "\\hookleftarrow", true); +defineSymbol(symbols_math, main, rel, "\u21AA", "\\hookrightarrow", true); +defineSymbol(symbols_math, main, rel, "\u2198", "\\searrow", true); +defineSymbol(symbols_math, main, rel, "\u21BC", "\\leftharpoonup", true); +defineSymbol(symbols_math, main, rel, "\u21C0", "\\rightharpoonup", true); +defineSymbol(symbols_math, main, rel, "\u2199", "\\swarrow", true); +defineSymbol(symbols_math, main, rel, "\u21BD", "\\leftharpoondown", true); +defineSymbol(symbols_math, main, rel, "\u21C1", "\\rightharpoondown", true); +defineSymbol(symbols_math, main, rel, "\u2196", "\\nwarrow", true); +defineSymbol(symbols_math, main, rel, "\u21CC", "\\rightleftharpoons", true); // AMS Negated Binary Relations + +defineSymbol(symbols_math, ams, rel, "\u226E", "\\nless", true); // Symbol names preceeded by "@" each have a corresponding macro. + +defineSymbol(symbols_math, ams, rel, "\uE010", "\\@nleqslant"); +defineSymbol(symbols_math, ams, rel, "\uE011", "\\@nleqq"); +defineSymbol(symbols_math, ams, rel, "\u2A87", "\\lneq", true); +defineSymbol(symbols_math, ams, rel, "\u2268", "\\lneqq", true); +defineSymbol(symbols_math, ams, rel, "\uE00C", "\\@lvertneqq"); +defineSymbol(symbols_math, ams, rel, "\u22E6", "\\lnsim", true); +defineSymbol(symbols_math, ams, rel, "\u2A89", "\\lnapprox", true); +defineSymbol(symbols_math, ams, rel, "\u2280", "\\nprec", true); // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. + +defineSymbol(symbols_math, ams, rel, "\u22E0", "\\npreceq", true); +defineSymbol(symbols_math, ams, rel, "\u22E8", "\\precnsim", true); +defineSymbol(symbols_math, ams, rel, "\u2AB9", "\\precnapprox", true); +defineSymbol(symbols_math, ams, rel, "\u2241", "\\nsim", true); +defineSymbol(symbols_math, ams, rel, "\uE006", "\\@nshortmid"); +defineSymbol(symbols_math, ams, rel, "\u2224", "\\nmid", true); +defineSymbol(symbols_math, ams, rel, "\u22AC", "\\nvdash", true); +defineSymbol(symbols_math, ams, rel, "\u22AD", "\\nvDash", true); +defineSymbol(symbols_math, ams, rel, "\u22EA", "\\ntriangleleft"); +defineSymbol(symbols_math, ams, rel, "\u22EC", "\\ntrianglelefteq", true); +defineSymbol(symbols_math, ams, rel, "\u228A", "\\subsetneq", true); +defineSymbol(symbols_math, ams, rel, "\uE01A", "\\@varsubsetneq"); +defineSymbol(symbols_math, ams, rel, "\u2ACB", "\\subsetneqq", true); +defineSymbol(symbols_math, ams, rel, "\uE017", "\\@varsubsetneqq"); +defineSymbol(symbols_math, ams, rel, "\u226F", "\\ngtr", true); +defineSymbol(symbols_math, ams, rel, "\uE00F", "\\@ngeqslant"); +defineSymbol(symbols_math, ams, rel, "\uE00E", "\\@ngeqq"); +defineSymbol(symbols_math, ams, rel, "\u2A88", "\\gneq", true); +defineSymbol(symbols_math, ams, rel, "\u2269", "\\gneqq", true); +defineSymbol(symbols_math, ams, rel, "\uE00D", "\\@gvertneqq"); +defineSymbol(symbols_math, ams, rel, "\u22E7", "\\gnsim", true); +defineSymbol(symbols_math, ams, rel, "\u2A8A", "\\gnapprox", true); +defineSymbol(symbols_math, ams, rel, "\u2281", "\\nsucc", true); // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. + +defineSymbol(symbols_math, ams, rel, "\u22E1", "\\nsucceq", true); +defineSymbol(symbols_math, ams, rel, "\u22E9", "\\succnsim", true); +defineSymbol(symbols_math, ams, rel, "\u2ABA", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. + +defineSymbol(symbols_math, ams, rel, "\u2246", "\\ncong", true); +defineSymbol(symbols_math, ams, rel, "\uE007", "\\@nshortparallel"); +defineSymbol(symbols_math, ams, rel, "\u2226", "\\nparallel", true); +defineSymbol(symbols_math, ams, rel, "\u22AF", "\\nVDash", true); +defineSymbol(symbols_math, ams, rel, "\u22EB", "\\ntriangleright"); +defineSymbol(symbols_math, ams, rel, "\u22ED", "\\ntrianglerighteq", true); +defineSymbol(symbols_math, ams, rel, "\uE018", "\\@nsupseteqq"); +defineSymbol(symbols_math, ams, rel, "\u228B", "\\supsetneq", true); +defineSymbol(symbols_math, ams, rel, "\uE01B", "\\@varsupsetneq"); +defineSymbol(symbols_math, ams, rel, "\u2ACC", "\\supsetneqq", true); +defineSymbol(symbols_math, ams, rel, "\uE019", "\\@varsupsetneqq"); +defineSymbol(symbols_math, ams, rel, "\u22AE", "\\nVdash", true); +defineSymbol(symbols_math, ams, rel, "\u2AB5", "\\precneqq", true); +defineSymbol(symbols_math, ams, rel, "\u2AB6", "\\succneqq", true); +defineSymbol(symbols_math, ams, rel, "\uE016", "\\@nsubseteqq"); +defineSymbol(symbols_math, ams, bin, "\u22B4", "\\unlhd"); +defineSymbol(symbols_math, ams, bin, "\u22B5", "\\unrhd"); // AMS Negated Arrows + +defineSymbol(symbols_math, ams, rel, "\u219A", "\\nleftarrow", true); +defineSymbol(symbols_math, ams, rel, "\u219B", "\\nrightarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21CD", "\\nLeftarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21CF", "\\nRightarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21AE", "\\nleftrightarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); // AMS Misc + +defineSymbol(symbols_math, ams, rel, "\u25B3", "\\vartriangle"); +defineSymbol(symbols_math, ams, symbols_textord, "\u210F", "\\hslash"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25BD", "\\triangledown"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\lozenge"); +defineSymbol(symbols_math, ams, symbols_textord, "\u24C8", "\\circledS"); +defineSymbol(symbols_math, ams, symbols_textord, "\xAE", "\\circledR"); +defineSymbol(symbols_text, ams, symbols_textord, "\xAE", "\\circledR"); +defineSymbol(symbols_math, ams, symbols_textord, "\u2221", "\\measuredangle", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2204", "\\nexists"); +defineSymbol(symbols_math, ams, symbols_textord, "\u2127", "\\mho"); +defineSymbol(symbols_math, ams, symbols_textord, "\u2132", "\\Finv", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2141", "\\Game", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2035", "\\backprime"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25B2", "\\blacktriangle"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25BC", "\\blacktriangledown"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25A0", "\\blacksquare"); +defineSymbol(symbols_math, ams, symbols_textord, "\u29EB", "\\blacklozenge"); +defineSymbol(symbols_math, ams, symbols_textord, "\u2605", "\\bigstar"); +defineSymbol(symbols_math, ams, symbols_textord, "\u2222", "\\sphericalangle", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 (ð) to \matheth. We map to AMS function \eth + +defineSymbol(symbols_math, ams, symbols_textord, "\xF0", "\\eth", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2571", "\\diagup"); +defineSymbol(symbols_math, ams, symbols_textord, "\u2572", "\\diagdown"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\square"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\Box"); +defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\Diamond"); // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen + +defineSymbol(symbols_math, ams, symbols_textord, "\xA5", "\\yen", true); +defineSymbol(symbols_text, ams, symbols_textord, "\xA5", "\\yen", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2713", "\\checkmark", true); +defineSymbol(symbols_text, ams, symbols_textord, "\u2713", "\\checkmark"); // AMS Hebrew + +defineSymbol(symbols_math, ams, symbols_textord, "\u2136", "\\beth", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2138", "\\daleth", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2137", "\\gimel", true); // AMS Greek + +defineSymbol(symbols_math, ams, symbols_textord, "\u03DD", "\\digamma"); +defineSymbol(symbols_math, ams, symbols_textord, "\u03F0", "\\varkappa"); // AMS Delimiters + +defineSymbol(symbols_math, ams, symbols_open, "\u250C", "\\ulcorner", true); +defineSymbol(symbols_math, ams, symbols_close, "\u2510", "\\urcorner", true); +defineSymbol(symbols_math, ams, symbols_open, "\u2514", "\\llcorner", true); +defineSymbol(symbols_math, ams, symbols_close, "\u2518", "\\lrcorner", true); // AMS Binary Relations + +defineSymbol(symbols_math, ams, rel, "\u2266", "\\leqq", true); +defineSymbol(symbols_math, ams, rel, "\u2A7D", "\\leqslant", true); +defineSymbol(symbols_math, ams, rel, "\u2A95", "\\eqslantless", true); +defineSymbol(symbols_math, ams, rel, "\u2272", "\\lesssim", true); +defineSymbol(symbols_math, ams, rel, "\u2A85", "\\lessapprox", true); +defineSymbol(symbols_math, ams, rel, "\u224A", "\\approxeq", true); +defineSymbol(symbols_math, ams, bin, "\u22D6", "\\lessdot"); +defineSymbol(symbols_math, ams, rel, "\u22D8", "\\lll", true); +defineSymbol(symbols_math, ams, rel, "\u2276", "\\lessgtr", true); +defineSymbol(symbols_math, ams, rel, "\u22DA", "\\lesseqgtr", true); +defineSymbol(symbols_math, ams, rel, "\u2A8B", "\\lesseqqgtr", true); +defineSymbol(symbols_math, ams, rel, "\u2251", "\\doteqdot"); +defineSymbol(symbols_math, ams, rel, "\u2253", "\\risingdotseq", true); +defineSymbol(symbols_math, ams, rel, "\u2252", "\\fallingdotseq", true); +defineSymbol(symbols_math, ams, rel, "\u223D", "\\backsim", true); +defineSymbol(symbols_math, ams, rel, "\u22CD", "\\backsimeq", true); +defineSymbol(symbols_math, ams, rel, "\u2AC5", "\\subseteqq", true); +defineSymbol(symbols_math, ams, rel, "\u22D0", "\\Subset", true); +defineSymbol(symbols_math, ams, rel, "\u228F", "\\sqsubset", true); +defineSymbol(symbols_math, ams, rel, "\u227C", "\\preccurlyeq", true); +defineSymbol(symbols_math, ams, rel, "\u22DE", "\\curlyeqprec", true); +defineSymbol(symbols_math, ams, rel, "\u227E", "\\precsim", true); +defineSymbol(symbols_math, ams, rel, "\u2AB7", "\\precapprox", true); +defineSymbol(symbols_math, ams, rel, "\u22B2", "\\vartriangleleft"); +defineSymbol(symbols_math, ams, rel, "\u22B4", "\\trianglelefteq"); +defineSymbol(symbols_math, ams, rel, "\u22A8", "\\vDash", true); +defineSymbol(symbols_math, ams, rel, "\u22AA", "\\Vvdash", true); +defineSymbol(symbols_math, ams, rel, "\u2323", "\\smallsmile"); +defineSymbol(symbols_math, ams, rel, "\u2322", "\\smallfrown"); +defineSymbol(symbols_math, ams, rel, "\u224F", "\\bumpeq", true); +defineSymbol(symbols_math, ams, rel, "\u224E", "\\Bumpeq", true); +defineSymbol(symbols_math, ams, rel, "\u2267", "\\geqq", true); +defineSymbol(symbols_math, ams, rel, "\u2A7E", "\\geqslant", true); +defineSymbol(symbols_math, ams, rel, "\u2A96", "\\eqslantgtr", true); +defineSymbol(symbols_math, ams, rel, "\u2273", "\\gtrsim", true); +defineSymbol(symbols_math, ams, rel, "\u2A86", "\\gtrapprox", true); +defineSymbol(symbols_math, ams, bin, "\u22D7", "\\gtrdot"); +defineSymbol(symbols_math, ams, rel, "\u22D9", "\\ggg", true); +defineSymbol(symbols_math, ams, rel, "\u2277", "\\gtrless", true); +defineSymbol(symbols_math, ams, rel, "\u22DB", "\\gtreqless", true); +defineSymbol(symbols_math, ams, rel, "\u2A8C", "\\gtreqqless", true); +defineSymbol(symbols_math, ams, rel, "\u2256", "\\eqcirc", true); +defineSymbol(symbols_math, ams, rel, "\u2257", "\\circeq", true); +defineSymbol(symbols_math, ams, rel, "\u225C", "\\triangleq", true); +defineSymbol(symbols_math, ams, rel, "\u223C", "\\thicksim"); +defineSymbol(symbols_math, ams, rel, "\u2248", "\\thickapprox"); +defineSymbol(symbols_math, ams, rel, "\u2AC6", "\\supseteqq", true); +defineSymbol(symbols_math, ams, rel, "\u22D1", "\\Supset", true); +defineSymbol(symbols_math, ams, rel, "\u2290", "\\sqsupset", true); +defineSymbol(symbols_math, ams, rel, "\u227D", "\\succcurlyeq", true); +defineSymbol(symbols_math, ams, rel, "\u22DF", "\\curlyeqsucc", true); +defineSymbol(symbols_math, ams, rel, "\u227F", "\\succsim", true); +defineSymbol(symbols_math, ams, rel, "\u2AB8", "\\succapprox", true); +defineSymbol(symbols_math, ams, rel, "\u22B3", "\\vartriangleright"); +defineSymbol(symbols_math, ams, rel, "\u22B5", "\\trianglerighteq"); +defineSymbol(symbols_math, ams, rel, "\u22A9", "\\Vdash", true); +defineSymbol(symbols_math, ams, rel, "\u2223", "\\shortmid"); +defineSymbol(symbols_math, ams, rel, "\u2225", "\\shortparallel"); +defineSymbol(symbols_math, ams, rel, "\u226C", "\\between", true); +defineSymbol(symbols_math, ams, rel, "\u22D4", "\\pitchfork", true); +defineSymbol(symbols_math, ams, rel, "\u221D", "\\varpropto"); +defineSymbol(symbols_math, ams, rel, "\u25C0", "\\blacktriangleleft"); // unicode-math says that \therefore is a mathord atom. +// We kept the amssymb atom type, which is rel. + +defineSymbol(symbols_math, ams, rel, "\u2234", "\\therefore", true); +defineSymbol(symbols_math, ams, rel, "\u220D", "\\backepsilon"); +defineSymbol(symbols_math, ams, rel, "\u25B6", "\\blacktriangleright"); // unicode-math says that \because is a mathord atom. +// We kept the amssymb atom type, which is rel. + +defineSymbol(symbols_math, ams, rel, "\u2235", "\\because", true); +defineSymbol(symbols_math, ams, rel, "\u22D8", "\\llless"); +defineSymbol(symbols_math, ams, rel, "\u22D9", "\\gggtr"); +defineSymbol(symbols_math, ams, bin, "\u22B2", "\\lhd"); +defineSymbol(symbols_math, ams, bin, "\u22B3", "\\rhd"); +defineSymbol(symbols_math, ams, rel, "\u2242", "\\eqsim", true); +defineSymbol(symbols_math, main, rel, "\u22C8", "\\Join"); +defineSymbol(symbols_math, ams, rel, "\u2251", "\\Doteq", true); // AMS Binary Operators + +defineSymbol(symbols_math, ams, bin, "\u2214", "\\dotplus", true); +defineSymbol(symbols_math, ams, bin, "\u2216", "\\smallsetminus"); +defineSymbol(symbols_math, ams, bin, "\u22D2", "\\Cap", true); +defineSymbol(symbols_math, ams, bin, "\u22D3", "\\Cup", true); +defineSymbol(symbols_math, ams, bin, "\u2A5E", "\\doublebarwedge", true); +defineSymbol(symbols_math, ams, bin, "\u229F", "\\boxminus", true); +defineSymbol(symbols_math, ams, bin, "\u229E", "\\boxplus", true); +defineSymbol(symbols_math, ams, bin, "\u22C7", "\\divideontimes", true); +defineSymbol(symbols_math, ams, bin, "\u22C9", "\\ltimes", true); +defineSymbol(symbols_math, ams, bin, "\u22CA", "\\rtimes", true); +defineSymbol(symbols_math, ams, bin, "\u22CB", "\\leftthreetimes", true); +defineSymbol(symbols_math, ams, bin, "\u22CC", "\\rightthreetimes", true); +defineSymbol(symbols_math, ams, bin, "\u22CF", "\\curlywedge", true); +defineSymbol(symbols_math, ams, bin, "\u22CE", "\\curlyvee", true); +defineSymbol(symbols_math, ams, bin, "\u229D", "\\circleddash", true); +defineSymbol(symbols_math, ams, bin, "\u229B", "\\circledast", true); +defineSymbol(symbols_math, ams, bin, "\u22C5", "\\centerdot"); +defineSymbol(symbols_math, ams, bin, "\u22BA", "\\intercal", true); +defineSymbol(symbols_math, ams, bin, "\u22D2", "\\doublecap"); +defineSymbol(symbols_math, ams, bin, "\u22D3", "\\doublecup"); +defineSymbol(symbols_math, ams, bin, "\u22A0", "\\boxtimes", true); // AMS Arrows +// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. +// We'll map it to AMS function \dashrightarrow. It produces the same atom. + +defineSymbol(symbols_math, ams, rel, "\u21E2", "\\dashrightarrow", true); // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. + +defineSymbol(symbols_math, ams, rel, "\u21E0", "\\dashleftarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21C7", "\\leftleftarrows", true); +defineSymbol(symbols_math, ams, rel, "\u21C6", "\\leftrightarrows", true); +defineSymbol(symbols_math, ams, rel, "\u21DA", "\\Lleftarrow", true); +defineSymbol(symbols_math, ams, rel, "\u219E", "\\twoheadleftarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21A2", "\\leftarrowtail", true); +defineSymbol(symbols_math, ams, rel, "\u21AB", "\\looparrowleft", true); +defineSymbol(symbols_math, ams, rel, "\u21CB", "\\leftrightharpoons", true); +defineSymbol(symbols_math, ams, rel, "\u21B6", "\\curvearrowleft", true); // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. + +defineSymbol(symbols_math, ams, rel, "\u21BA", "\\circlearrowleft", true); +defineSymbol(symbols_math, ams, rel, "\u21B0", "\\Lsh", true); +defineSymbol(symbols_math, ams, rel, "\u21C8", "\\upuparrows", true); +defineSymbol(symbols_math, ams, rel, "\u21BF", "\\upharpoonleft", true); +defineSymbol(symbols_math, ams, rel, "\u21C3", "\\downharpoonleft", true); +defineSymbol(symbols_math, ams, rel, "\u22B8", "\\multimap", true); +defineSymbol(symbols_math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21C9", "\\rightrightarrows", true); +defineSymbol(symbols_math, ams, rel, "\u21C4", "\\rightleftarrows", true); +defineSymbol(symbols_math, ams, rel, "\u21A0", "\\twoheadrightarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21A3", "\\rightarrowtail", true); +defineSymbol(symbols_math, ams, rel, "\u21AC", "\\looparrowright", true); +defineSymbol(symbols_math, ams, rel, "\u21B7", "\\curvearrowright", true); // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. + +defineSymbol(symbols_math, ams, rel, "\u21BB", "\\circlearrowright", true); +defineSymbol(symbols_math, ams, rel, "\u21B1", "\\Rsh", true); +defineSymbol(symbols_math, ams, rel, "\u21CA", "\\downdownarrows", true); +defineSymbol(symbols_math, ams, rel, "\u21BE", "\\upharpoonright", true); +defineSymbol(symbols_math, ams, rel, "\u21C2", "\\downharpoonright", true); +defineSymbol(symbols_math, ams, rel, "\u21DD", "\\rightsquigarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21DD", "\\leadsto"); +defineSymbol(symbols_math, ams, rel, "\u21DB", "\\Rrightarrow", true); +defineSymbol(symbols_math, ams, rel, "\u21BE", "\\restriction"); +defineSymbol(symbols_math, main, symbols_textord, "\u2018", "`"); +defineSymbol(symbols_math, main, symbols_textord, "$", "\\$"); +defineSymbol(symbols_text, main, symbols_textord, "$", "\\$"); +defineSymbol(symbols_text, main, symbols_textord, "$", "\\textdollar"); +defineSymbol(symbols_math, main, symbols_textord, "%", "\\%"); +defineSymbol(symbols_text, main, symbols_textord, "%", "\\%"); +defineSymbol(symbols_math, main, symbols_textord, "_", "\\_"); +defineSymbol(symbols_text, main, symbols_textord, "_", "\\_"); +defineSymbol(symbols_text, main, symbols_textord, "_", "\\textunderscore"); +defineSymbol(symbols_math, main, symbols_textord, "\u2220", "\\angle", true); +defineSymbol(symbols_math, main, symbols_textord, "\u221E", "\\infty", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2032", "\\prime"); +defineSymbol(symbols_math, main, symbols_textord, "\u25B3", "\\triangle"); +defineSymbol(symbols_math, main, symbols_textord, "\u0393", "\\Gamma", true); +defineSymbol(symbols_math, main, symbols_textord, "\u0394", "\\Delta", true); +defineSymbol(symbols_math, main, symbols_textord, "\u0398", "\\Theta", true); +defineSymbol(symbols_math, main, symbols_textord, "\u039B", "\\Lambda", true); +defineSymbol(symbols_math, main, symbols_textord, "\u039E", "\\Xi", true); +defineSymbol(symbols_math, main, symbols_textord, "\u03A0", "\\Pi", true); +defineSymbol(symbols_math, main, symbols_textord, "\u03A3", "\\Sigma", true); +defineSymbol(symbols_math, main, symbols_textord, "\u03A5", "\\Upsilon", true); +defineSymbol(symbols_math, main, symbols_textord, "\u03A6", "\\Phi", true); +defineSymbol(symbols_math, main, symbols_textord, "\u03A8", "\\Psi", true); +defineSymbol(symbols_math, main, symbols_textord, "\u03A9", "\\Omega", true); +defineSymbol(symbols_math, main, symbols_textord, "A", "\u0391"); +defineSymbol(symbols_math, main, symbols_textord, "B", "\u0392"); +defineSymbol(symbols_math, main, symbols_textord, "E", "\u0395"); +defineSymbol(symbols_math, main, symbols_textord, "Z", "\u0396"); +defineSymbol(symbols_math, main, symbols_textord, "H", "\u0397"); +defineSymbol(symbols_math, main, symbols_textord, "I", "\u0399"); +defineSymbol(symbols_math, main, symbols_textord, "K", "\u039A"); +defineSymbol(symbols_math, main, symbols_textord, "M", "\u039C"); +defineSymbol(symbols_math, main, symbols_textord, "N", "\u039D"); +defineSymbol(symbols_math, main, symbols_textord, "O", "\u039F"); +defineSymbol(symbols_math, main, symbols_textord, "P", "\u03A1"); +defineSymbol(symbols_math, main, symbols_textord, "T", "\u03A4"); +defineSymbol(symbols_math, main, symbols_textord, "X", "\u03A7"); +defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\neg", true); +defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\lnot"); +defineSymbol(symbols_math, main, symbols_textord, "\u22A4", "\\top"); +defineSymbol(symbols_math, main, symbols_textord, "\u22A5", "\\bot"); +defineSymbol(symbols_math, main, symbols_textord, "\u2205", "\\emptyset"); +defineSymbol(symbols_math, ams, symbols_textord, "\u2205", "\\varnothing"); +defineSymbol(symbols_math, main, mathord, "\u03B1", "\\alpha", true); +defineSymbol(symbols_math, main, mathord, "\u03B2", "\\beta", true); +defineSymbol(symbols_math, main, mathord, "\u03B3", "\\gamma", true); +defineSymbol(symbols_math, main, mathord, "\u03B4", "\\delta", true); +defineSymbol(symbols_math, main, mathord, "\u03F5", "\\epsilon", true); +defineSymbol(symbols_math, main, mathord, "\u03B6", "\\zeta", true); +defineSymbol(symbols_math, main, mathord, "\u03B7", "\\eta", true); +defineSymbol(symbols_math, main, mathord, "\u03B8", "\\theta", true); +defineSymbol(symbols_math, main, mathord, "\u03B9", "\\iota", true); +defineSymbol(symbols_math, main, mathord, "\u03BA", "\\kappa", true); +defineSymbol(symbols_math, main, mathord, "\u03BB", "\\lambda", true); +defineSymbol(symbols_math, main, mathord, "\u03BC", "\\mu", true); +defineSymbol(symbols_math, main, mathord, "\u03BD", "\\nu", true); +defineSymbol(symbols_math, main, mathord, "\u03BE", "\\xi", true); +defineSymbol(symbols_math, main, mathord, "\u03BF", "\\omicron", true); +defineSymbol(symbols_math, main, mathord, "\u03C0", "\\pi", true); +defineSymbol(symbols_math, main, mathord, "\u03C1", "\\rho", true); +defineSymbol(symbols_math, main, mathord, "\u03C3", "\\sigma", true); +defineSymbol(symbols_math, main, mathord, "\u03C4", "\\tau", true); +defineSymbol(symbols_math, main, mathord, "\u03C5", "\\upsilon", true); +defineSymbol(symbols_math, main, mathord, "\u03D5", "\\phi", true); +defineSymbol(symbols_math, main, mathord, "\u03C7", "\\chi", true); +defineSymbol(symbols_math, main, mathord, "\u03C8", "\\psi", true); +defineSymbol(symbols_math, main, mathord, "\u03C9", "\\omega", true); +defineSymbol(symbols_math, main, mathord, "\u03B5", "\\varepsilon", true); +defineSymbol(symbols_math, main, mathord, "\u03D1", "\\vartheta", true); +defineSymbol(symbols_math, main, mathord, "\u03D6", "\\varpi", true); +defineSymbol(symbols_math, main, mathord, "\u03F1", "\\varrho", true); +defineSymbol(symbols_math, main, mathord, "\u03C2", "\\varsigma", true); +defineSymbol(symbols_math, main, mathord, "\u03C6", "\\varphi", true); +defineSymbol(symbols_math, main, bin, "\u2217", "*"); +defineSymbol(symbols_math, main, bin, "+", "+"); +defineSymbol(symbols_math, main, bin, "\u2212", "-"); +defineSymbol(symbols_math, main, bin, "\u22C5", "\\cdot", true); +defineSymbol(symbols_math, main, bin, "\u2218", "\\circ"); +defineSymbol(symbols_math, main, bin, "\xF7", "\\div", true); +defineSymbol(symbols_math, main, bin, "\xB1", "\\pm", true); +defineSymbol(symbols_math, main, bin, "\xD7", "\\times", true); +defineSymbol(symbols_math, main, bin, "\u2229", "\\cap", true); +defineSymbol(symbols_math, main, bin, "\u222A", "\\cup", true); +defineSymbol(symbols_math, main, bin, "\u2216", "\\setminus"); +defineSymbol(symbols_math, main, bin, "\u2227", "\\land"); +defineSymbol(symbols_math, main, bin, "\u2228", "\\lor"); +defineSymbol(symbols_math, main, bin, "\u2227", "\\wedge", true); +defineSymbol(symbols_math, main, bin, "\u2228", "\\vee", true); +defineSymbol(symbols_math, main, symbols_textord, "\u221A", "\\surd"); +defineSymbol(symbols_math, main, symbols_open, "(", "("); +defineSymbol(symbols_math, main, symbols_open, "[", "["); +defineSymbol(symbols_math, main, symbols_open, "\u27E8", "\\langle", true); +defineSymbol(symbols_math, main, symbols_open, "\u2223", "\\lvert"); +defineSymbol(symbols_math, main, symbols_open, "\u2225", "\\lVert"); +defineSymbol(symbols_math, main, symbols_close, ")", ")"); +defineSymbol(symbols_math, main, symbols_close, "]", "]"); +defineSymbol(symbols_math, main, symbols_close, "?", "?"); +defineSymbol(symbols_math, main, symbols_close, "!", "!"); +defineSymbol(symbols_math, main, symbols_close, "\u27E9", "\\rangle", true); +defineSymbol(symbols_math, main, symbols_close, "\u2223", "\\rvert"); +defineSymbol(symbols_math, main, symbols_close, "\u2225", "\\rVert"); +defineSymbol(symbols_math, main, rel, "=", "="); +defineSymbol(symbols_math, main, rel, "<", "<"); +defineSymbol(symbols_math, main, rel, ">", ">"); +defineSymbol(symbols_math, main, rel, ":", ":"); +defineSymbol(symbols_math, main, rel, "\u2248", "\\approx", true); +defineSymbol(symbols_math, main, rel, "\u2245", "\\cong", true); +defineSymbol(symbols_math, main, rel, "\u2265", "\\ge"); +defineSymbol(symbols_math, main, rel, "\u2265", "\\geq", true); +defineSymbol(symbols_math, main, rel, "\u2190", "\\gets"); +defineSymbol(symbols_math, main, rel, ">", "\\gt"); +defineSymbol(symbols_math, main, rel, "\u2208", "\\in", true); +defineSymbol(symbols_math, main, rel, "\uE020", "\\@not"); +defineSymbol(symbols_math, main, rel, "\u2282", "\\subset", true); +defineSymbol(symbols_math, main, rel, "\u2283", "\\supset", true); +defineSymbol(symbols_math, main, rel, "\u2286", "\\subseteq", true); +defineSymbol(symbols_math, main, rel, "\u2287", "\\supseteq", true); +defineSymbol(symbols_math, ams, rel, "\u2288", "\\nsubseteq", true); +defineSymbol(symbols_math, ams, rel, "\u2289", "\\nsupseteq", true); +defineSymbol(symbols_math, main, rel, "\u22A8", "\\models"); +defineSymbol(symbols_math, main, rel, "\u2190", "\\leftarrow", true); +defineSymbol(symbols_math, main, rel, "\u2264", "\\le"); +defineSymbol(symbols_math, main, rel, "\u2264", "\\leq", true); +defineSymbol(symbols_math, main, rel, "<", "\\lt"); +defineSymbol(symbols_math, main, rel, "\u2192", "\\rightarrow", true); +defineSymbol(symbols_math, main, rel, "\u2192", "\\to"); +defineSymbol(symbols_math, ams, rel, "\u2271", "\\ngeq", true); +defineSymbol(symbols_math, ams, rel, "\u2270", "\\nleq", true); +defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\ "); +defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "~"); +defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\space"); // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% + +defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\nobreakspace"); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ "); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\space"); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\nobreakspace"); +defineSymbol(symbols_math, main, symbols_spacing, null, "\\nobreak"); +defineSymbol(symbols_math, main, symbols_spacing, null, "\\allowbreak"); +defineSymbol(symbols_math, main, punct, ",", ","); +defineSymbol(symbols_math, main, punct, ";", ";"); +defineSymbol(symbols_math, ams, bin, "\u22BC", "\\barwedge", true); +defineSymbol(symbols_math, ams, bin, "\u22BB", "\\veebar", true); +defineSymbol(symbols_math, main, bin, "\u2299", "\\odot", true); +defineSymbol(symbols_math, main, bin, "\u2295", "\\oplus", true); +defineSymbol(symbols_math, main, bin, "\u2297", "\\otimes", true); +defineSymbol(symbols_math, main, symbols_textord, "\u2202", "\\partial", true); +defineSymbol(symbols_math, main, bin, "\u2298", "\\oslash", true); +defineSymbol(symbols_math, ams, bin, "\u229A", "\\circledcirc", true); +defineSymbol(symbols_math, ams, bin, "\u22A1", "\\boxdot", true); +defineSymbol(symbols_math, main, bin, "\u25B3", "\\bigtriangleup"); +defineSymbol(symbols_math, main, bin, "\u25BD", "\\bigtriangledown"); +defineSymbol(symbols_math, main, bin, "\u2020", "\\dagger"); +defineSymbol(symbols_math, main, bin, "\u22C4", "\\diamond"); +defineSymbol(symbols_math, main, bin, "\u22C6", "\\star"); +defineSymbol(symbols_math, main, bin, "\u25C3", "\\triangleleft"); +defineSymbol(symbols_math, main, bin, "\u25B9", "\\triangleright"); +defineSymbol(symbols_math, main, symbols_open, "{", "\\{"); +defineSymbol(symbols_text, main, symbols_textord, "{", "\\{"); +defineSymbol(symbols_text, main, symbols_textord, "{", "\\textbraceleft"); +defineSymbol(symbols_math, main, symbols_close, "}", "\\}"); +defineSymbol(symbols_text, main, symbols_textord, "}", "\\}"); +defineSymbol(symbols_text, main, symbols_textord, "}", "\\textbraceright"); +defineSymbol(symbols_math, main, symbols_open, "{", "\\lbrace"); +defineSymbol(symbols_math, main, symbols_close, "}", "\\rbrace"); +defineSymbol(symbols_math, main, symbols_open, "[", "\\lbrack"); +defineSymbol(symbols_text, main, symbols_textord, "[", "\\lbrack"); +defineSymbol(symbols_math, main, symbols_close, "]", "\\rbrack"); +defineSymbol(symbols_text, main, symbols_textord, "]", "\\rbrack"); +defineSymbol(symbols_math, main, symbols_open, "(", "\\lparen"); +defineSymbol(symbols_math, main, symbols_close, ")", "\\rparen"); +defineSymbol(symbols_text, main, symbols_textord, "<", "\\textless"); // in T1 fontenc + +defineSymbol(symbols_text, main, symbols_textord, ">", "\\textgreater"); // in T1 fontenc + +defineSymbol(symbols_math, main, symbols_open, "\u230A", "\\lfloor", true); +defineSymbol(symbols_math, main, symbols_close, "\u230B", "\\rfloor", true); +defineSymbol(symbols_math, main, symbols_open, "\u2308", "\\lceil", true); +defineSymbol(symbols_math, main, symbols_close, "\u2309", "\\rceil", true); +defineSymbol(symbols_math, main, symbols_textord, "\\", "\\backslash"); +defineSymbol(symbols_math, main, symbols_textord, "\u2223", "|"); +defineSymbol(symbols_math, main, symbols_textord, "\u2223", "\\vert"); +defineSymbol(symbols_text, main, symbols_textord, "|", "\\textbar"); // in T1 fontenc + +defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\|"); +defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\Vert"); +defineSymbol(symbols_text, main, symbols_textord, "\u2225", "\\textbardbl"); +defineSymbol(symbols_text, main, symbols_textord, "~", "\\textasciitilde"); +defineSymbol(symbols_text, main, symbols_textord, "\\", "\\textbackslash"); +defineSymbol(symbols_text, main, symbols_textord, "^", "\\textasciicircum"); +defineSymbol(symbols_math, main, rel, "\u2191", "\\uparrow", true); +defineSymbol(symbols_math, main, rel, "\u21D1", "\\Uparrow", true); +defineSymbol(symbols_math, main, rel, "\u2193", "\\downarrow", true); +defineSymbol(symbols_math, main, rel, "\u21D3", "\\Downarrow", true); +defineSymbol(symbols_math, main, rel, "\u2195", "\\updownarrow", true); +defineSymbol(symbols_math, main, rel, "\u21D5", "\\Updownarrow", true); +defineSymbol(symbols_math, main, op, "\u2210", "\\coprod"); +defineSymbol(symbols_math, main, op, "\u22C1", "\\bigvee"); +defineSymbol(symbols_math, main, op, "\u22C0", "\\bigwedge"); +defineSymbol(symbols_math, main, op, "\u2A04", "\\biguplus"); +defineSymbol(symbols_math, main, op, "\u22C2", "\\bigcap"); +defineSymbol(symbols_math, main, op, "\u22C3", "\\bigcup"); +defineSymbol(symbols_math, main, op, "\u222B", "\\int"); +defineSymbol(symbols_math, main, op, "\u222B", "\\intop"); +defineSymbol(symbols_math, main, op, "\u222C", "\\iint"); +defineSymbol(symbols_math, main, op, "\u222D", "\\iiint"); +defineSymbol(symbols_math, main, op, "\u220F", "\\prod"); +defineSymbol(symbols_math, main, op, "\u2211", "\\sum"); +defineSymbol(symbols_math, main, op, "\u2A02", "\\bigotimes"); +defineSymbol(symbols_math, main, op, "\u2A01", "\\bigoplus"); +defineSymbol(symbols_math, main, op, "\u2A00", "\\bigodot"); +defineSymbol(symbols_math, main, op, "\u222E", "\\oint"); +defineSymbol(symbols_math, main, op, "\u222F", "\\oiint"); +defineSymbol(symbols_math, main, op, "\u2230", "\\oiiint"); +defineSymbol(symbols_math, main, op, "\u2A06", "\\bigsqcup"); +defineSymbol(symbols_math, main, op, "\u222B", "\\smallint"); +defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\textellipsis"); +defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\mathellipsis"); +defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\ldots", true); +defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\ldots", true); +defineSymbol(symbols_math, main, symbols_inner, "\u22EF", "\\@cdots", true); +defineSymbol(symbols_math, main, symbols_inner, "\u22F1", "\\ddots", true); +defineSymbol(symbols_math, main, symbols_textord, "\u22EE", "\\varvdots"); // \vdots is a macro + +defineSymbol(symbols_math, main, symbols_accent, "\u02CA", "\\acute"); +defineSymbol(symbols_math, main, symbols_accent, "\u02CB", "\\grave"); +defineSymbol(symbols_math, main, symbols_accent, "\xA8", "\\ddot"); +defineSymbol(symbols_math, main, symbols_accent, "~", "\\tilde"); +defineSymbol(symbols_math, main, symbols_accent, "\u02C9", "\\bar"); +defineSymbol(symbols_math, main, symbols_accent, "\u02D8", "\\breve"); +defineSymbol(symbols_math, main, symbols_accent, "\u02C7", "\\check"); +defineSymbol(symbols_math, main, symbols_accent, "^", "\\hat"); +defineSymbol(symbols_math, main, symbols_accent, "\u20D7", "\\vec"); +defineSymbol(symbols_math, main, symbols_accent, "\u02D9", "\\dot"); +defineSymbol(symbols_math, main, symbols_accent, "\u02DA", "\\mathring"); +defineSymbol(symbols_math, main, mathord, "\u0131", "\\imath", true); +defineSymbol(symbols_math, main, mathord, "\u0237", "\\jmath", true); +defineSymbol(symbols_text, main, symbols_textord, "\u0131", "\\i", true); +defineSymbol(symbols_text, main, symbols_textord, "\u0237", "\\j", true); +defineSymbol(symbols_text, main, symbols_textord, "\xDF", "\\ss", true); +defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true); +defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true); +defineSymbol(symbols_text, main, symbols_textord, "\u0153", "\\oe", true); +defineSymbol(symbols_text, main, symbols_textord, "\xF8", "\\o", true); +defineSymbol(symbols_text, main, symbols_textord, "\xC6", "\\AE", true); +defineSymbol(symbols_text, main, symbols_textord, "\u0152", "\\OE", true); +defineSymbol(symbols_text, main, symbols_textord, "\xD8", "\\O", true); +defineSymbol(symbols_text, main, symbols_accent, "\u02CA", "\\'"); // acute + +defineSymbol(symbols_text, main, symbols_accent, "\u02CB", "\\`"); // grave + +defineSymbol(symbols_text, main, symbols_accent, "\u02C6", "\\^"); // circumflex + +defineSymbol(symbols_text, main, symbols_accent, "\u02DC", "\\~"); // tilde + +defineSymbol(symbols_text, main, symbols_accent, "\u02C9", "\\="); // macron + +defineSymbol(symbols_text, main, symbols_accent, "\u02D8", "\\u"); // breve + +defineSymbol(symbols_text, main, symbols_accent, "\u02D9", "\\."); // dot above + +defineSymbol(symbols_text, main, symbols_accent, "\u02DA", "\\r"); // ring above + +defineSymbol(symbols_text, main, symbols_accent, "\u02C7", "\\v"); // caron + +defineSymbol(symbols_text, main, symbols_accent, "\xA8", '\\"'); // diaresis + +defineSymbol(symbols_text, main, symbols_accent, "\u02DD", "\\H"); // double acute + +defineSymbol(symbols_text, main, symbols_accent, "\u25EF", "\\textcircled"); // \bigcirc glyph +// These ligatures are detected and created in Parser.js's `formLigatures`. + +var ligatures = { + "--": true, + "---": true, + "``": true, + "''": true +}; +defineSymbol(symbols_text, main, symbols_textord, "\u2013", "--"); +defineSymbol(symbols_text, main, symbols_textord, "\u2013", "\\textendash"); +defineSymbol(symbols_text, main, symbols_textord, "\u2014", "---"); +defineSymbol(symbols_text, main, symbols_textord, "\u2014", "\\textemdash"); +defineSymbol(symbols_text, main, symbols_textord, "\u2018", "`"); +defineSymbol(symbols_text, main, symbols_textord, "\u2018", "\\textquoteleft"); +defineSymbol(symbols_text, main, symbols_textord, "\u2019", "'"); +defineSymbol(symbols_text, main, symbols_textord, "\u2019", "\\textquoteright"); +defineSymbol(symbols_text, main, symbols_textord, "\u201C", "``"); +defineSymbol(symbols_text, main, symbols_textord, "\u201C", "\\textquotedblleft"); +defineSymbol(symbols_text, main, symbols_textord, "\u201D", "''"); +defineSymbol(symbols_text, main, symbols_textord, "\u201D", "\\textquotedblright"); // \degree from gensymb package + +defineSymbol(symbols_math, main, symbols_textord, "\xB0", "\\degree", true); +defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\degree"); // \textdegree from inputenc package + +defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math +// mode, but among our fonts, only Main-Italic defines this character "163". + +defineSymbol(symbols_math, main, mathord, "\xA3", "\\pounds"); +defineSymbol(symbols_math, main, mathord, "\xA3", "\\mathsterling", true); +defineSymbol(symbols_text, main, mathord, "\xA3", "\\pounds"); +defineSymbol(symbols_text, main, mathord, "\xA3", "\\textsterling", true); +defineSymbol(symbols_math, ams, symbols_textord, "\u2720", "\\maltese"); +defineSymbol(symbols_text, ams, symbols_textord, "\u2720", "\\maltese"); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ "); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", " "); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); // There are lots of symbols which are the same, so we add them in afterwards. +// All of these are textords in math mode + +var mathTextSymbols = "0123456789/@.\""; + +for (var symbols_i = 0; symbols_i < mathTextSymbols.length; symbols_i++) { + var symbols_ch = mathTextSymbols.charAt(symbols_i); + defineSymbol(symbols_math, main, symbols_textord, symbols_ch, symbols_ch); +} // All of these are textords in text mode + + +var textSymbols = "0123456789!@*()-=+[]<>|\";:?/.,"; + +for (var src_symbols_i = 0; src_symbols_i < textSymbols.length; src_symbols_i++) { + var _ch = textSymbols.charAt(src_symbols_i); + + defineSymbol(symbols_text, main, symbols_textord, _ch, _ch); +} // All of these are textords in text mode, and mathords in math mode + + +var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +for (var symbols_i2 = 0; symbols_i2 < letters.length; symbols_i2++) { + var _ch2 = letters.charAt(symbols_i2); + + defineSymbol(symbols_math, main, mathord, _ch2, _ch2); + defineSymbol(symbols_text, main, symbols_textord, _ch2, _ch2); +} // Blackboard bold and script letters in Unicode range + + +defineSymbol(symbols_math, ams, symbols_textord, "C", "\u2102"); // blackboard bold + +defineSymbol(symbols_text, ams, symbols_textord, "C", "\u2102"); +defineSymbol(symbols_math, ams, symbols_textord, "H", "\u210D"); +defineSymbol(symbols_text, ams, symbols_textord, "H", "\u210D"); +defineSymbol(symbols_math, ams, symbols_textord, "N", "\u2115"); +defineSymbol(symbols_text, ams, symbols_textord, "N", "\u2115"); +defineSymbol(symbols_math, ams, symbols_textord, "P", "\u2119"); +defineSymbol(symbols_text, ams, symbols_textord, "P", "\u2119"); +defineSymbol(symbols_math, ams, symbols_textord, "Q", "\u211A"); +defineSymbol(symbols_text, ams, symbols_textord, "Q", "\u211A"); +defineSymbol(symbols_math, ams, symbols_textord, "R", "\u211D"); +defineSymbol(symbols_text, ams, symbols_textord, "R", "\u211D"); +defineSymbol(symbols_math, ams, symbols_textord, "Z", "\u2124"); +defineSymbol(symbols_text, ams, symbols_textord, "Z", "\u2124"); +defineSymbol(symbols_math, main, mathord, "h", "\u210E"); // italic h, Planck constant + +defineSymbol(symbols_text, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters. +// We support some letters in the Unicode range U+1D400 to U+1D7FF, +// Mathematical Alphanumeric Symbols. +// Some editors do not deal well with wide characters. So don't write the +// string into this file. Instead, create the string from the surrogate pair. + +var symbols_wideChar = ""; + +for (var symbols_i3 = 0; symbols_i3 < letters.length; symbols_i3++) { + var _ch3 = letters.charAt(symbols_i3); // The hex numbers in the next line are a surrogate pair. + // 0xD835 is the high surrogate for all letters in the range we support. + // 0xDC00 is the low surrogate for bold A. + + + symbols_wideChar = String.fromCharCode(0xD835, 0xDC00 + symbols_i3); // A-Z a-z bold + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDC34 + symbols_i3); // A-Z a-z italic + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDC68 + symbols_i3); // A-Z a-z bold italic + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDD04 + symbols_i3); // A-Z a-z Fractur + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDDA0 + symbols_i3); // A-Z a-z sans-serif + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDDD4 + symbols_i3); // A-Z a-z sans bold + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDE08 + symbols_i3); // A-Z a-z sans italic + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDE70 + symbols_i3); // A-Z a-z monospace + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + + if (symbols_i3 < 26) { + // KaTeX fonts have only capital letters for blackboard bold and script. + // See exception for k below. + symbols_wideChar = String.fromCharCode(0xD835, 0xDD38 + symbols_i3); // A-Z double struck + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDC9C + symbols_i3); // A-Z script + + defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar); + } // TODO: Add bold script when it is supported by a KaTeX font. + +} // "k" is the only double struck lower case letter in the KaTeX fonts. + + +symbols_wideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck + +defineSymbol(symbols_math, main, mathord, "k", symbols_wideChar); +defineSymbol(symbols_text, main, symbols_textord, "k", symbols_wideChar); // Next, some wide character numerals + +for (var symbols_i4 = 0; symbols_i4 < 10; symbols_i4++) { + var _ch4 = symbols_i4.toString(); + + symbols_wideChar = String.fromCharCode(0xD835, 0xDFCE + symbols_i4); // 0-9 bold + + defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDFE2 + symbols_i4); // 0-9 sans serif + + defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDFEC + symbols_i4); // 0-9 bold sans + + defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); + symbols_wideChar = String.fromCharCode(0xD835, 0xDFF6 + symbols_i4); // 0-9 monospace + + defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar); + defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar); +} // We add these Latin-1 letters as symbols for backwards-compatibility, +// but they are not actually in the font, nor are they supported by the +// Unicode accent mechanism, so they fall back to Times font and look ugly. +// TODO(edemaine): Fix this. + + +var extraLatin = "ÇÐÞçþ"; + +for (var _i5 = 0; _i5 < extraLatin.length; _i5++) { + var _ch5 = extraLatin.charAt(_i5); + + defineSymbol(symbols_math, main, mathord, _ch5, _ch5); + defineSymbol(symbols_text, main, symbols_textord, _ch5, _ch5); +} + +defineSymbol(symbols_text, main, symbols_textord, "ð", "ð"); // Unicode versions of existing characters + +defineSymbol(symbols_text, main, symbols_textord, "\u2013", "–"); +defineSymbol(symbols_text, main, symbols_textord, "\u2014", "—"); +defineSymbol(symbols_text, main, symbols_textord, "\u2018", "‘"); +defineSymbol(symbols_text, main, symbols_textord, "\u2019", "’"); +defineSymbol(symbols_text, main, symbols_textord, "\u201C", "“"); +defineSymbol(symbols_text, main, symbols_textord, "\u201D", "”"); +// CONCATENATED MODULE: ./src/wide-character.js +/** + * This file provides support for Unicode range U+1D400 to U+1D7FF, + * Mathematical Alphanumeric Symbols. + * + * Function wideCharacterFont takes a wide character as input and returns + * the font information necessary to render it properly. + */ + +/** + * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf + * That document sorts characters into groups by font type, say bold or italic. + * + * In the arrays below, each subarray consists three elements: + * * The CSS class of that group when in math mode. + * * The CSS class of that group when in text mode. + * * The font name, so that KaTeX can get font metrics. + */ + +var wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright +["mathbf", "textbf", "Main-Bold"], // a-z bold upright +["mathdefault", "textit", "Math-Italic"], // A-Z italic +["mathdefault", "textit", "Math-Italic"], // a-z italic +["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic +["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic +// Map fancy A-Z letters to script, not calligraphic. +// This aligns with unicode-math and math fonts (except Cambria Math). +["mathscr", "textscr", "Script-Regular"], // A-Z script +["", "", ""], // a-z script. No font +["", "", ""], // A-Z bold script. No font +["", "", ""], // a-z bold script. No font +["mathfrak", "textfrak", "Fraktur-Regular"], // A-Z Fraktur +["mathfrak", "textfrak", "Fraktur-Regular"], // a-z Fraktur +["mathbb", "textbb", "AMS-Regular"], // A-Z double-struck +["mathbb", "textbb", "AMS-Regular"], // k double-struck +["", "", ""], // A-Z bold Fraktur No font metrics +["", "", ""], // a-z bold Fraktur. No font. +["mathsf", "textsf", "SansSerif-Regular"], // A-Z sans-serif +["mathsf", "textsf", "SansSerif-Regular"], // a-z sans-serif +["mathboldsf", "textboldsf", "SansSerif-Bold"], // A-Z bold sans-serif +["mathboldsf", "textboldsf", "SansSerif-Bold"], // a-z bold sans-serif +["mathitsf", "textitsf", "SansSerif-Italic"], // A-Z italic sans-serif +["mathitsf", "textitsf", "SansSerif-Italic"], // a-z italic sans-serif +["", "", ""], // A-Z bold italic sans. No font +["", "", ""], // a-z bold italic sans. No font +["mathtt", "texttt", "Typewriter-Regular"], // A-Z monospace +["mathtt", "texttt", "Typewriter-Regular"]]; +var wideNumeralData = [["mathbf", "textbf", "Main-Bold"], // 0-9 bold +["", "", ""], // 0-9 double-struck. No KaTeX font. +["mathsf", "textsf", "SansSerif-Regular"], // 0-9 sans-serif +["mathboldsf", "textboldsf", "SansSerif-Bold"], // 0-9 bold sans-serif +["mathtt", "texttt", "Typewriter-Regular"]]; +var wide_character_wideCharacterFont = function wideCharacterFont(wideChar, mode) { + // IE doesn't support codePointAt(). So work with the surrogate pair. + var H = wideChar.charCodeAt(0); // high surrogate + + var L = wideChar.charCodeAt(1); // low surrogate + + var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000; + var j = mode === "math" ? 0 : 1; // column index for CSS class. + + if (0x1D400 <= codePoint && codePoint < 0x1D6A4) { + // wideLatinLetterData contains exactly 26 chars on each row. + // So we can calculate the relevant row. No traverse necessary. + var i = Math.floor((codePoint - 0x1D400) / 26); + return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]]; + } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) { + // Numerals, ten per row. + var _i = Math.floor((codePoint - 0x1D7CE) / 10); + + return [wideNumeralData[_i][2], wideNumeralData[_i][j]]; + } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) { + // dotless i or j + return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]]; + } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) { + // Greek letters. Not supported, yet. + return ["", ""]; + } else { + // We don't support any wide characters outside 1D400–1D7FF. + throw new src_ParseError("Unsupported character: " + wideChar); } }; - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $at = __webpack_require__(81)(true); - -// 21.1.3.27 String.prototype[@@iterator]() -__webpack_require__(48)(String, 'String', function(iterated){ - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function(){ - var O = this._t - , index = this._i - , point; - if(index >= O.length)return {value: undefined, done: true}; - point = $at(O, index); - this._i += point.length; - return {value: point, done: false}; -}); - -/***/ }), -/* 37 */ -/***/ (function(module, exports) { - -// 7.1.4 ToInteger -var ceil = Math.ceil - , floor = Math.floor; -module.exports = function(it){ - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; - -/***/ }), -/* 38 */ -/***/ (function(module, exports) { - -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function(it){ - if(it == undefined)throw TypeError("Can't call method on " + it); - return it; -}; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = __webpack_require__(87) - , enumBugKeys = __webpack_require__(53); - -module.exports = Object.keys || function keys(O){ - return $keys(O, enumBugKeys); -}; - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__(49) - , defined = __webpack_require__(38); -module.exports = function(it){ - return IObject(defined(it)); -}; - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(52)('keys') - , uid = __webpack_require__(32); -module.exports = function(key){ - return shared[key] || (shared[key] = uid(key)); -}; - -/***/ }), -/* 42 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (immutable) */ __webpack_exports__["a"] = scriptFromCodepoint; -/* harmony export (immutable) */ __webpack_exports__["b"] = supportedCodepoint; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(35); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__); - - - - -/** - * Unicode block data for the families of scripts we support in \text{}. - * Scripts only need to appear here if they do not have font metrics. - */ -var scriptData = [{ - // Latin characters beyond the Latin-1 characters we have metrics for. - // Needed for Czech, Hungarian and Turkish text, for example. - name: 'latin', - blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B - [0x0300, 0x036f]] -}, { - // The Cyrillic script used by Russian and related languages. - // A Cyrillic subset used to be supported as explicitly defined - // symbols in symbols.js - name: 'cyrillic', - blocks: [[0x0400, 0x04ff]] -}, { - // The Brahmic scripts of South and Southeast Asia - // Devanagari (0900–097F) - // Bengali (0980–09FF) - // Gurmukhi (0A00–0A7F) - // Gujarati (0A80–0AFF) - // Oriya (0B00–0B7F) - // Tamil (0B80–0BFF) - // Telugu (0C00–0C7F) - // Kannada (0C80–0CFF) - // Malayalam (0D00–0D7F) - // Sinhala (0D80–0DFF) - // Thai (0E00–0E7F) - // Lao (0E80–0EFF) - // Tibetan (0F00–0FFF) - // Myanmar (1000–109F) - name: 'brahmic', - blocks: [[0x0900, 0x109F]] -}, { - name: 'georgian', - blocks: [[0x10A0, 0x10ff]] -}, { - // Chinese and Japanese. - // The "k" in cjk is for Korean, but we've separated Korean out - name: "cjk", - blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana - [0x4E00, 0x9FAF], // CJK ideograms - [0xFF00, 0xFF60]] -}, { - // Korean - name: 'hangul', - blocks: [[0xAC00, 0xD7AF]] -}]; - -/** - * Given a codepoint, return the name of the script or script family - * it is from, or null if it is not part of a known block - */ - - -/* - * This file defines the Unicode scripts and script families that we - * support. To add new scripts or families, just add a new entry to the - * scriptData array below. Adding scripts to the scriptData array allows - * characters from that script to appear in \text{} environments. - */ - -/** - * Each script or script family has a name and an array of blocks. - * Each block is an array of two numbers which specify the start and - * end points (inclusive) of a block of Unicode codepoints. - */ -function scriptFromCodepoint(codepoint) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(scriptData), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var script = _step.value; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(script.blocks), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var block = _step2.value; - - if (codepoint >= block[0] && codepoint <= block[1]) { - return script.name; - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return null; -} - -/** - * A flattened version of all the supported blocks in a single array. - * This is an optimization to make supportedCodepoint() fast. - */ -var allBlocks = []; -scriptData.forEach(function (s) { - return s.blocks.forEach(function (b) { - return allBlocks.push.apply(allBlocks, __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default()(b)); - }); -}); - -/** - * Given a codepoint, return true if it falls within one of the - * scripts or script families defined above and false otherwise. - * - * Micro benchmarks shows that this is faster than - * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test() - * in Firefox, Chrome and Node. - */ -function supportedCodepoint(codepoint) { - for (var i = 0; i < allBlocks.length; i += 2) { - if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) { - return true; - } - } - return false; -} - -/***/ }), -/* 43 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__fontMetrics__ = __webpack_require__(30); - - - +// CONCATENATED MODULE: ./src/Options.js /** * This file contains information about the options that the Parser carries * around with it while parsing. Data is held in an `Options` object, and when @@ -5459,11 +4844,7 @@ function supportedCodepoint(codepoint) { * `.reset` functions. */ - - - -var sizeStyleMap = [ -// Each element contains [textsize, scriptsize, scriptscriptsize]. +var sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize]. // The size mappings are taken from TeX with \normalsize=10pt. [1, 1, 1], // size1: [5, 5, 5] \tiny [2, 1, 1], // size2: [6, 5, 5] @@ -5476,15 +4857,14 @@ var sizeStyleMap = [ [9, 7, 6], // size9: [17.28, 12, 10] \LARGE [10, 8, 7], // size10: [20.74, 14.4, 12] \huge [11, 10, 9]]; - -var sizeMultipliers = [ -// fontMetrics.js:getFontMetrics also uses size indexes, so if +var sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if // you change size indexes, change that function. 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488]; var sizeAtStyle = function sizeAtStyle(size, style) { - return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1]; -}; + return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1]; +}; // In these types, "" (empty string) means "no change". + /** * This is the main options class. It contains the current style, size, color, @@ -5493,332 +4873,3209 @@ var sizeAtStyle = function sizeAtStyle(size, style) { * Options objects should not be modified. To create a new Options with * different properties, call a `.having*` method. */ -var Options = function () { - function Options(data) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Options); +var Options_Options = +/*#__PURE__*/ +function () { + // A font family applies to a group of fonts (i.e. SansSerif), while a font + // represents a specific font (i.e. SansSerif Bold). + // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - this.style = data.style; - this.color = data.color; - this.size = data.size || Options.BASESIZE; - this.textSize = data.textSize || this.size; - this.phantom = !!data.phantom; - this.fontFamily = data.fontFamily; - this.fontWeight = data.fontWeight || ''; - this.fontShape = data.fontShape || ''; - this.sizeMultiplier = sizeMultipliers[this.size - 1]; - this.maxSize = data.maxSize; - this._fontMetrics = undefined; + /** + * The base size index. + */ + function Options(data) { + this.style = void 0; + this.color = void 0; + this.size = void 0; + this.textSize = void 0; + this.phantom = void 0; + this.font = void 0; + this.fontFamily = void 0; + this.fontWeight = void 0; + this.fontShape = void 0; + this.sizeMultiplier = void 0; + this.maxSize = void 0; + this._fontMetrics = void 0; + this.style = data.style; + this.color = data.color; + this.size = data.size || Options.BASESIZE; + this.textSize = data.textSize || this.size; + this.phantom = !!data.phantom; + this.font = data.font || ""; + this.fontFamily = data.fontFamily || ""; + this.fontWeight = data.fontWeight || ''; + this.fontShape = data.fontShape || ''; + this.sizeMultiplier = sizeMultipliers[this.size - 1]; + this.maxSize = data.maxSize; + this._fontMetrics = undefined; + } + /** + * Returns a new options object with the same properties as "this". Properties + * from "extension" will be copied to the new options object. + */ + + + var _proto = Options.prototype; + + _proto.extend = function extend(extension) { + var data = { + style: this.style, + size: this.size, + textSize: this.textSize, + color: this.color, + phantom: this.phantom, + font: this.font, + fontFamily: this.fontFamily, + fontWeight: this.fontWeight, + fontShape: this.fontShape, + maxSize: this.maxSize + }; + + for (var key in extension) { + if (extension.hasOwnProperty(key)) { + data[key] = extension[key]; + } } - /** - * Returns a new options object with the same properties as "this". Properties - * from "extension" will be copied to the new options object. - */ + return new Options(data); + } + /** + * Return an options object with the given style. If `this.style === style`, + * returns `this`. + */ + ; + _proto.havingStyle = function havingStyle(style) { + if (this.style === style) { + return this; + } else { + return this.extend({ + style: style, + size: sizeAtStyle(this.textSize, style) + }); + } + } + /** + * Return an options object with a cramped version of the current style. If + * the current style is cramped, returns `this`. + */ + ; - /** - * The base size index. - */ + _proto.havingCrampedStyle = function havingCrampedStyle() { + return this.havingStyle(this.style.cramp()); + } + /** + * Return an options object with the given size and in at least `\textstyle`. + * Returns `this` if appropriate. + */ + ; + _proto.havingSize = function havingSize(size) { + if (this.size === size && this.textSize === size) { + return this; + } else { + return this.extend({ + style: this.style.text(), + size: size, + textSize: size, + sizeMultiplier: sizeMultipliers[size - 1] + }); + } + } + /** + * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted, + * changes to at least `\textstyle`. + */ + ; - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Options, [{ - key: "extend", - value: function extend(extension) { - var data = { - style: this.style, - size: this.size, - textSize: this.textSize, - color: this.color, - phantom: this.phantom, - fontFamily: this.fontFamily, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize - }; + _proto.havingBaseStyle = function havingBaseStyle(style) { + style = style || this.style.text(); + var wantSize = sizeAtStyle(Options.BASESIZE, style); - for (var key in extension) { - if (extension.hasOwnProperty(key)) { - data[key] = extension[key]; - } - } + if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) { + return this; + } else { + return this.extend({ + style: style, + size: wantSize + }); + } + } + /** + * Remove the effect of sizing changes such as \Huge. + * Keep the effect of the current style, such as \scriptstyle. + */ + ; - return new Options(data); - } + _proto.havingBaseSizing = function havingBaseSizing() { + var size; - /** - * Return an options object with the given style. If `this.style === style`, - * returns `this`. - */ + switch (this.style.id) { + case 4: + case 5: + size = 3; // normalsize in scriptstyle - }, { - key: "havingStyle", - value: function havingStyle(style) { - if (this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: sizeAtStyle(this.textSize, style) - }); - } - } + break; - /** - * Return an options object with a cramped version of the current style. If - * the current style is cramped, returns `this`. - */ + case 6: + case 7: + size = 1; // normalsize in scriptscriptstyle - }, { - key: "havingCrampedStyle", - value: function havingCrampedStyle() { - return this.havingStyle(this.style.cramp()); - } + break; - /** - * Return an options object with the given size and in at least `\textstyle`. - * Returns `this` if appropriate. - */ + default: + size = 6; + // normalsize in textstyle or displaystyle + } - }, { - key: "havingSize", - value: function havingSize(size) { - if (this.size === size && this.textSize === size) { - return this; - } else { - return this.extend({ - style: this.style.text(), - size: size, - textSize: size, - sizeMultiplier: sizeMultipliers[size - 1] - }); - } - } + return this.extend({ + style: this.style.text(), + size: size + }); + } + /** + * Create a new options object with the given color. + */ + ; - /** - * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted, - * changes to at least `\textstyle`. - */ + _proto.withColor = function withColor(color) { + return this.extend({ + color: color + }); + } + /** + * Create a new options object with "phantom" set to true. + */ + ; - }, { - key: "havingBaseStyle", - value: function havingBaseStyle(style) { - style = style || this.style.text(); - var wantSize = sizeAtStyle(Options.BASESIZE, style); - if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: wantSize - }); - } - } + _proto.withPhantom = function withPhantom() { + return this.extend({ + phantom: true + }); + } + /** + * Creates a new options object with the given math font or old text font. + * @type {[type]} + */ + ; - /** - * Create a new options object with the given color. - */ + _proto.withFont = function withFont(font) { + return this.extend({ + font: font + }); + } + /** + * Create a new options objects with the given fontFamily. + */ + ; - }, { - key: "withColor", - value: function withColor(color) { - return this.extend({ - color: color - }); - } + _proto.withTextFontFamily = function withTextFontFamily(fontFamily) { + return this.extend({ + fontFamily: fontFamily, + font: "" + }); + } + /** + * Creates a new options object with the given font weight + */ + ; - /** - * Create a new options object with "phantom" set to true. - */ + _proto.withTextFontWeight = function withTextFontWeight(fontWeight) { + return this.extend({ + fontWeight: fontWeight, + font: "" + }); + } + /** + * Creates a new options object with the given font weight + */ + ; - }, { - key: "withPhantom", - value: function withPhantom() { - return this.extend({ - phantom: true - }); - } + _proto.withTextFontShape = function withTextFontShape(fontShape) { + return this.extend({ + fontShape: fontShape, + font: "" + }); + } + /** + * Return the CSS sizing classes required to switch from enclosing options + * `oldOptions` to `this`. Returns an array of classes. + */ + ; - /** - * Create a new options objects with the give font. - */ + _proto.sizingClasses = function sizingClasses(oldOptions) { + if (oldOptions.size !== this.size) { + return ["sizing", "reset-size" + oldOptions.size, "size" + this.size]; + } else { + return []; + } + } + /** + * Return the CSS sizing classes required to switch to the base size. Like + * `this.havingSize(BASESIZE).sizingClasses(this)`. + */ + ; - }, { - key: "withFontFamily", - value: function withFontFamily(fontFamily) { - return this.extend({ - fontFamily: fontFamily || this.fontFamily - }); - } + _proto.baseSizingClasses = function baseSizingClasses() { + if (this.size !== Options.BASESIZE) { + return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE]; + } else { + return []; + } + } + /** + * Return the font metrics for this size. + */ + ; - /** - * Creates a new options object with the given font weight - */ + _proto.fontMetrics = function fontMetrics() { + if (!this._fontMetrics) { + this._fontMetrics = getGlobalMetrics(this.size); + } - }, { - key: "withFontWeight", - value: function withFontWeight(fontWeight) { - return this.extend({ - fontWeight: fontWeight - }); - } + return this._fontMetrics; + } + /** + * Gets the CSS color of the current options object + */ + ; - /** - * Creates a new options object with the given font weight - */ + _proto.getColor = function getColor() { + if (this.phantom) { + return "transparent"; + } else { + return this.color; + } + }; - }, { - key: "withFontShape", - value: function withFontShape(fontShape) { - return this.extend({ - fontShape: fontShape - }); - } - - /** - * Return the CSS sizing classes required to switch from enclosing options - * `oldOptions` to `this`. Returns an array of classes. - */ - - }, { - key: "sizingClasses", - value: function sizingClasses(oldOptions) { - if (oldOptions.size !== this.size) { - return ["sizing", "reset-size" + oldOptions.size, "size" + this.size]; - } else { - return []; - } - } - - /** - * Return the CSS sizing classes required to switch to the base size. Like - * `this.havingSize(BASESIZE).sizingClasses(this)`. - */ - - }, { - key: "baseSizingClasses", - value: function baseSizingClasses() { - if (this.size !== Options.BASESIZE) { - return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE]; - } else { - return []; - } - } - - /** - * Return the font metrics for this size. - */ - - }, { - key: "fontMetrics", - value: function fontMetrics() { - if (!this._fontMetrics) { - this._fontMetrics = __WEBPACK_IMPORTED_MODULE_2__fontMetrics__["a" /* default */].getFontMetrics(this.size); - } - return this._fontMetrics; - } - - /** - * A map of color names to CSS colors. - * TODO(emily): Remove this when we have real macros - */ - - }, { - key: "getColor", - - - /** - * Gets the CSS color of the current options object, accounting for the - * `colorMap`. - */ - value: function getColor() { - if (this.phantom) { - return "transparent"; - } else if (this.color != null && Options.colorMap.hasOwnProperty(this.color)) { - return Options.colorMap[this.color]; - } else { - return this.color; - } - } - }]); - - return Options; + return Options; }(); -Options.BASESIZE = 6; -Options.colorMap = { - "katex-blue": "#6495ed", - "katex-orange": "#ffa500", - "katex-pink": "#ff00af", - "katex-red": "#df0030", - "katex-green": "#28ae7b", - "katex-gray": "gray", - "katex-purple": "#9d38bd", - "katex-blueA": "#ccfaff", - "katex-blueB": "#80f6ff", - "katex-blueC": "#63d9ea", - "katex-blueD": "#11accd", - "katex-blueE": "#0c7f99", - "katex-tealA": "#94fff5", - "katex-tealB": "#26edd5", - "katex-tealC": "#01d1c1", - "katex-tealD": "#01a995", - "katex-tealE": "#208170", - "katex-greenA": "#b6ffb0", - "katex-greenB": "#8af281", - "katex-greenC": "#74cf70", - "katex-greenD": "#1fab54", - "katex-greenE": "#0d923f", - "katex-goldA": "#ffd0a9", - "katex-goldB": "#ffbb71", - "katex-goldC": "#ff9c39", - "katex-goldD": "#e07d10", - "katex-goldE": "#a75a05", - "katex-redA": "#fca9a9", - "katex-redB": "#ff8482", - "katex-redC": "#f9685d", - "katex-redD": "#e84d39", - "katex-redE": "#bc2612", - "katex-maroonA": "#ffbde0", - "katex-maroonB": "#ff92c6", - "katex-maroonC": "#ed5fa6", - "katex-maroonD": "#ca337c", - "katex-maroonE": "#9e034e", - "katex-purpleA": "#ddd7ff", - "katex-purpleB": "#c6b9fc", - "katex-purpleC": "#aa87ff", - "katex-purpleD": "#7854ab", - "katex-purpleE": "#543b78", - "katex-mintA": "#f5f9e8", - "katex-mintB": "#edf2df", - "katex-mintC": "#e0e5cc", - "katex-grayA": "#f6f7f7", - "katex-grayB": "#f0f1f2", - "katex-grayC": "#e3e5e6", - "katex-grayD": "#d6d8da", - "katex-grayE": "#babec2", - "katex-grayF": "#888d93", - "katex-grayG": "#626569", - "katex-grayH": "#3b3e40", - "katex-grayI": "#21242c", - "katex-kaBlue": "#314453", - "katex-kaGreen": "#71B307" +Options_Options.BASESIZE = 6; +/* harmony default export */ var src_Options = (Options_Options); +// CONCATENATED MODULE: ./src/units.js +/** + * This file does conversion between units. In particular, it provides + * calculateSize to convert other units into ems. + */ + + // This table gives the number of TeX pts in one of each *absolute* TeX unit. +// Thus, multiplying a length by this number converts the length from units +// into pts. Dividing the result by ptPerEm gives the number of ems +// *assuming* a font size of ptPerEm (normal size, normal style). + +var ptPerUnit = { + // https://en.wikibooks.org/wiki/LaTeX/Lengths and + // https://tex.stackexchange.com/a/8263 + "pt": 1, + // TeX point + "mm": 7227 / 2540, + // millimeter + "cm": 7227 / 254, + // centimeter + "in": 72.27, + // inch + "bp": 803 / 800, + // big (PostScript) points + "pc": 12, + // pica + "dd": 1238 / 1157, + // didot + "cc": 14856 / 1157, + // cicero (12 didot) + "nd": 685 / 642, + // new didot + "nc": 1370 / 107, + // new cicero (12 new didot) + "sp": 1 / 65536, + // scaled point (TeX's internal smallest unit) + // https://tex.stackexchange.com/a/41371 + "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX + +}; // Dictionary of relative units, for fast validity testing. + +var relativeUnit = { + "ex": true, + "em": true, + "mu": true }; +/** + * Determine whether the specified unit (either a string defining the unit + * or a "size" parse node containing a unit field) is valid. + */ +var validUnit = function validUnit(unit) { + if (typeof unit !== "string") { + unit = unit.unit; + } -/* harmony default export */ __webpack_exports__["a"] = (Options); + return unit in ptPerUnit || unit in relativeUnit || unit === "ex"; +}; +/* + * Convert a "size" parse node (with numeric "number" and string "unit" fields, + * as parsed by functions.js argType "size") into a CSS em value for the + * current style/scale. `options` gives the current options. + */ -/***/ }), -/* 44 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +var units_calculateSize = function calculateSize(sizeValue, options) { + var scale; -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__fontMetrics__ = __webpack_require__(30); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__utils__ = __webpack_require__(5); + if (sizeValue.unit in ptPerUnit) { + // Absolute units + scale = ptPerUnit[sizeValue.unit] // Convert unit to pt + / options.fontMetrics().ptPerEm // Convert pt to CSS em + / options.sizeMultiplier; // Unscale to make absolute units + } else if (sizeValue.unit === "mu") { + // `mu` units scale with scriptstyle/scriptscriptstyle. + scale = options.fontMetrics().cssEmPerMu; + } else { + // Other relative units always refer to the *textstyle* font + // in the current size. + var unitOptions; + + if (options.style.isTight()) { + // isTight() means current style is script/scriptscript. + unitOptions = options.havingStyle(options.style.text()); + } else { + unitOptions = options; + } // TODO: In TeX these units are relative to the quad of the current + // *text* font, e.g. cmr10. KaTeX instead uses values from the + // comparably-sized *Computer Modern symbol* font. At 10pt, these + // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641; + // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$. + // TeX \showlists shows a kern of 1.13889 * fontsize; + // KaTeX shows a kern of 1.171 * fontsize. + + + if (sizeValue.unit === "ex") { + scale = unitOptions.fontMetrics().xHeight; + } else if (sizeValue.unit === "em") { + scale = unitOptions.fontMetrics().quad; + } else { + throw new src_ParseError("Invalid unit: '" + sizeValue.unit + "'"); + } + + if (unitOptions !== options) { + scale *= unitOptions.sizeMultiplier / options.sizeMultiplier; + } + } + + return Math.min(sizeValue.number * scale, options.maxSize); +}; +// CONCATENATED MODULE: ./src/buildCommon.js +/* eslint no-console:0 */ + +/** + * This module contains general functions that can be used for building + * different kinds of domTree nodes in a consistent manner. + */ + + + + + + + +// The following have to be loaded from Main-Italic font, using class mathit +var mathitLetters = ["\\imath", "ı", // dotless i +"\\jmath", "ȷ", // dotless j +"\\pounds", "\\mathsterling", "\\textsterling", "£"]; +/** + * Looks up the given symbol in fontMetrics, after applying any symbol + * replacements defined in symbol.js + */ + +var buildCommon_lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this. +fontName, mode) { + // Replace the value with its replaced value from symbol.js + if (src_symbols[mode][value] && src_symbols[mode][value].replace) { + value = src_symbols[mode][value].replace; + } + + return { + value: value, + metrics: getCharacterMetrics(value, fontName, mode) + }; +}; +/** + * Makes a symbolNode after translation via the list of symbols in symbols.js. + * Correctly pulls out metrics for the character, and optionally takes a list of + * classes to be attached to the node. + * + * TODO: make argument order closer to makeSpan + * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which + * should if present come first in `classes`. + * TODO(#953): Make `options` mandatory and always pass it in. + */ + + +var buildCommon_makeSymbol = function makeSymbol(value, fontName, mode, options, classes) { + var lookup = buildCommon_lookupSymbol(value, fontName, mode); + var metrics = lookup.metrics; + value = lookup.value; + var symbolNode; + + if (metrics) { + var italic = metrics.italic; + + if (mode === "text" || options && options.font === "mathit") { + italic = 0; + } + + symbolNode = new domTree_SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes); + } else { + // TODO(emily): Figure out a good way to only print this in development + typeof console !== "undefined" && console.warn("No character metrics for '" + value + "' in style '" + fontName + "'"); + symbolNode = new domTree_SymbolNode(value, 0, 0, 0, 0, 0, classes); + } + + if (options) { + symbolNode.maxFontSize = options.sizeMultiplier; + + if (options.style.isTight()) { + symbolNode.classes.push("mtight"); + } + + var color = options.getColor(); + + if (color) { + symbolNode.style.color = color; + } + } + + return symbolNode; +}; +/** + * Makes a symbol in Main-Regular or AMS-Regular. + * Used for rel, bin, open, close, inner, and punct. + * + * TODO(#953): Make `options` mandatory and always pass it in. + */ + + +var buildCommon_mathsym = function mathsym(value, mode, options, classes) { + if (classes === void 0) { + classes = []; + } + + // Decide what font to render the symbol in by its entry in the symbols + // table. + // Have a special case for when the value = \ because the \ is used as a + // textord in unsupported command errors but cannot be parsed as a regular + // text ordinal and is therefore not present as a symbol in the symbols + // table for text, as well as a special case for boldsymbol because it + // can be used for bold + and - + if (options && options.font && options.font === "boldsymbol" && buildCommon_lookupSymbol(value, "Main-Bold", mode).metrics) { + return buildCommon_makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"])); + } else if (value === "\\" || src_symbols[mode][value].font === "main") { + return buildCommon_makeSymbol(value, "Main-Regular", mode, options, classes); + } else { + return buildCommon_makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"])); + } +}; +/** + * Determines which of the two font names (Main-Italic and Math-Italic) and + * corresponding style tags (maindefault or mathit) to use for default math font, + * depending on the symbol. + */ + + +var buildCommon_mathdefault = function mathdefault(value, mode, options, classes) { + if (/[0-9]/.test(value.charAt(0)) || // glyphs for \imath and \jmath do not exist in Math-Italic so we + // need to use Main-Italic instead + utils.contains(mathitLetters, value)) { + return { + fontName: "Main-Italic", + fontClass: "mathit" + }; + } else { + return { + fontName: "Math-Italic", + fontClass: "mathdefault" + }; + } +}; +/** + * Determines which of the font names (Main-Italic, Math-Italic, and Caligraphic) + * and corresponding style tags (mathit, mathdefault, or mathcal) to use for font + * "mathnormal", depending on the symbol. Use this function instead of fontMap for + * font "mathnormal". + */ + + +var buildCommon_mathnormal = function mathnormal(value, mode, options, classes) { + if (utils.contains(mathitLetters, value)) { + return { + fontName: "Main-Italic", + fontClass: "mathit" + }; + } else if (/[0-9]/.test(value.charAt(0))) { + return { + fontName: "Caligraphic-Regular", + fontClass: "mathcal" + }; + } else { + return { + fontName: "Math-Italic", + fontClass: "mathdefault" + }; + } +}; +/** + * Determines which of the two font names (Main-Bold and Math-BoldItalic) and + * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol", + * depending on the symbol. Use this function instead of fontMap for font + * "boldsymbol". + */ + + +var boldsymbol = function boldsymbol(value, mode, options, classes) { + if (buildCommon_lookupSymbol(value, "Math-BoldItalic", mode).metrics) { + return { + fontName: "Math-BoldItalic", + fontClass: "boldsymbol" + }; + } else { + // Some glyphs do not exist in Math-BoldItalic so we need to use + // Main-Bold instead. + return { + fontName: "Main-Bold", + fontClass: "mathbf" + }; + } +}; +/** + * Makes either a mathord or textord in the correct font and color. + */ + + +var buildCommon_makeOrd = function makeOrd(group, options, type) { + var mode = group.mode; + var text = group.text; + var classes = ["mord"]; // Math mode or Old font (i.e. \rm) + + var isFont = mode === "math" || mode === "text" && options.font; + var fontOrFamily = isFont ? options.font : options.fontFamily; + + if (text.charCodeAt(0) === 0xD835) { + // surrogate pairs get special treatment + var _wideCharacterFont = wide_character_wideCharacterFont(text, mode), + wideFontName = _wideCharacterFont[0], + wideFontClass = _wideCharacterFont[1]; + + return buildCommon_makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass)); + } else if (fontOrFamily) { + var fontName; + var fontClasses; + + if (fontOrFamily === "boldsymbol" || fontOrFamily === "mathnormal") { + var fontData = fontOrFamily === "boldsymbol" ? boldsymbol(text, mode, options, classes) : buildCommon_mathnormal(text, mode, options, classes); + fontName = fontData.fontName; + fontClasses = [fontData.fontClass]; + } else if (utils.contains(mathitLetters, text)) { + fontName = "Main-Italic"; + fontClasses = ["mathit"]; + } else if (isFont) { + fontName = fontMap[fontOrFamily].fontName; + fontClasses = [fontOrFamily]; + } else { + fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape); + fontClasses = [fontOrFamily, options.fontWeight, options.fontShape]; + } + + if (buildCommon_lookupSymbol(text, fontName, mode).metrics) { + return buildCommon_makeSymbol(text, fontName, mode, options, classes.concat(fontClasses)); + } else if (ligatures.hasOwnProperty(text) && fontName.substr(0, 10) === "Typewriter") { + // Deconstruct ligatures in monospace fonts (\texttt, \tt). + var parts = []; + + for (var i = 0; i < text.length; i++) { + parts.push(buildCommon_makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses))); + } + + return buildCommon_makeFragment(parts); + } + } // Makes a symbol in the default font for mathords and textords. + + + if (type === "mathord") { + var fontLookup = buildCommon_mathdefault(text, mode, options, classes); + return buildCommon_makeSymbol(text, fontLookup.fontName, mode, options, classes.concat([fontLookup.fontClass])); + } else if (type === "textord") { + var font = src_symbols[mode][text] && src_symbols[mode][text].font; + + if (font === "ams") { + var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape); + + return buildCommon_makeSymbol(text, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape)); + } else if (font === "main" || !font) { + var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape); + + return buildCommon_makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape)); + } else { + // fonts added by plugins + var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class + + + return buildCommon_makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape)); + } + } else { + throw new Error("unexpected type: " + type + " in makeOrd"); + } +}; +/** + * Returns true if subsequent symbolNodes have the same classes, skew, maxFont, + * and styles. + */ + + +var buildCommon_canCombine = function canCombine(prev, next) { + if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) { + return false; + } + + for (var style in prev.style) { + if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) { + return false; + } + } + + for (var _style in next.style) { + if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) { + return false; + } + } + + return true; +}; +/** + * Combine consequetive domTree.symbolNodes into a single symbolNode. + * Note: this function mutates the argument. + */ + + +var buildCommon_tryCombineChars = function tryCombineChars(chars) { + for (var i = 0; i < chars.length - 1; i++) { + var prev = chars[i]; + var next = chars[i + 1]; + + if (prev instanceof domTree_SymbolNode && next instanceof domTree_SymbolNode && buildCommon_canCombine(prev, next)) { + prev.text += next.text; + prev.height = Math.max(prev.height, next.height); + prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use + // it to add padding to the right of the span created from + // the combined characters. + + prev.italic = next.italic; + chars.splice(i + 1, 1); + i--; + } + } + + return chars; +}; +/** + * Calculate the height, depth, and maxFontSize of an element based on its + * children. + */ + + +var sizeElementFromChildren = function sizeElementFromChildren(elem) { + var height = 0; + var depth = 0; + var maxFontSize = 0; + + for (var i = 0; i < elem.children.length; i++) { + var child = elem.children[i]; + + if (child.height > height) { + height = child.height; + } + + if (child.depth > depth) { + depth = child.depth; + } + + if (child.maxFontSize > maxFontSize) { + maxFontSize = child.maxFontSize; + } + } + + elem.height = height; + elem.depth = depth; + elem.maxFontSize = maxFontSize; +}; +/** + * Makes a span with the given list of classes, list of children, and options. + * + * TODO(#953): Ensure that `options` is always provided (currently some call + * sites don't pass it) and make the type below mandatory. + * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which + * should if present come first in `classes`. + */ + + +var buildCommon_makeSpan = function makeSpan(classes, children, options, style) { + var span = new domTree_Span(classes, children, options, style); + sizeElementFromChildren(span); + return span; +}; // SVG one is simpler -- doesn't require height, depth, max-font setting. +// This is also a separate method for typesafety. + + +var buildCommon_makeSvgSpan = function makeSvgSpan(classes, children, options, style) { + return new domTree_Span(classes, children, options, style); +}; + +var makeLineSpan = function makeLineSpan(className, options, thickness) { + var line = buildCommon_makeSpan([className], [], options); + line.height = thickness || options.fontMetrics().defaultRuleThickness; + line.style.borderBottomWidth = line.height + "em"; + line.maxFontSize = 1.0; + return line; +}; +/** + * Makes an anchor with the given href, list of classes, list of children, + * and options. + */ + + +var buildCommon_makeAnchor = function makeAnchor(href, classes, children, options) { + var anchor = new domTree_Anchor(href, classes, children, options); + sizeElementFromChildren(anchor); + return anchor; +}; +/** + * Makes a document fragment with the given list of children. + */ + + +var buildCommon_makeFragment = function makeFragment(children) { + var fragment = new tree_DocumentFragment(children); + sizeElementFromChildren(fragment); + return fragment; +}; +/** + * Wraps group in a span if it's a document fragment, allowing to apply classes + * and styles + */ + + +var buildCommon_wrapFragment = function wrapFragment(group, options) { + if (group instanceof tree_DocumentFragment) { + return buildCommon_makeSpan([], [group], options); + } + + return group; +}; // These are exact object types to catch typos in the names of the optional fields. + + +// Computes the updated `children` list and the overall depth. +// +// This helper function for makeVList makes it easier to enforce type safety by +// allowing early exits (returns) in the logic. +var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) { + if (params.positionType === "individualShift") { + var oldChildren = params.children; + var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be + // shifted to the correct specified shift + + var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth; + + var currPos = _depth; + + for (var i = 1; i < oldChildren.length; i++) { + var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth; + var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth); + currPos = currPos + diff; + children.push({ + type: "kern", + size: size + }); + children.push(oldChildren[i]); + } + + return { + children: children, + depth: _depth + }; + } + + var depth; + + if (params.positionType === "top") { + // We always start at the bottom, so calculate the bottom by adding up + // all the sizes + var bottom = params.positionData; + + for (var _i = 0; _i < params.children.length; _i++) { + var child = params.children[_i]; + bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth; + } + + depth = bottom; + } else if (params.positionType === "bottom") { + depth = -params.positionData; + } else { + var firstChild = params.children[0]; + + if (firstChild.type !== "elem") { + throw new Error('First child must have type "elem".'); + } + + if (params.positionType === "shift") { + depth = -firstChild.elem.depth - params.positionData; + } else if (params.positionType === "firstBaseline") { + depth = -firstChild.elem.depth; + } else { + throw new Error("Invalid positionType " + params.positionType + "."); + } + } + + return { + children: params.children, + depth: depth + }; +}; +/** + * Makes a vertical list by stacking elements and kerns on top of each other. + * Allows for many different ways of specifying the positioning method. + * + * See VListParam documentation above. + */ + + +var buildCommon_makeVList = function makeVList(params, options) { + var _getVListChildrenAndD = getVListChildrenAndDepth(params), + children = _getVListChildrenAndD.children, + depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to + // each item, where it will determine the item's baseline. Since it has + // `overflow:hidden`, the strut's top edge will sit on the item's line box's + // top edge and the strut's bottom edge will sit on the item's baseline, + // with no additional line-height spacing. This allows the item baseline to + // be positioned precisely without worrying about font ascent and + // line-height. + + + var pstrutSize = 0; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + if (child.type === "elem") { + var elem = child.elem; + pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height); + } + } + + pstrutSize += 2; + var pstrut = buildCommon_makeSpan(["pstrut"], []); + pstrut.style.height = pstrutSize + "em"; // Create a new list of actual children at the correct offsets + + var realChildren = []; + var minPos = depth; + var maxPos = depth; + var currPos = depth; + + for (var _i2 = 0; _i2 < children.length; _i2++) { + var _child = children[_i2]; + + if (_child.type === "kern") { + currPos += _child.size; + } else { + var _elem = _child.elem; + var classes = _child.wrapperClasses || []; + var style = _child.wrapperStyle || {}; + var childWrap = buildCommon_makeSpan(classes, [pstrut, _elem], undefined, style); + childWrap.style.top = -pstrutSize - currPos - _elem.depth + "em"; + + if (_child.marginLeft) { + childWrap.style.marginLeft = _child.marginLeft; + } + + if (_child.marginRight) { + childWrap.style.marginRight = _child.marginRight; + } + + realChildren.push(childWrap); + currPos += _elem.height + _elem.depth; + } + + minPos = Math.min(minPos, currPos); + maxPos = Math.max(maxPos, currPos); + } // The vlist contents go in a table-cell with `vertical-align:bottom`. + // This cell's bottom edge will determine the containing table's baseline + // without overly expanding the containing line-box. + + + var vlist = buildCommon_makeSpan(["vlist"], realChildren); + vlist.style.height = maxPos + "em"; // A second row is used if necessary to represent the vlist's depth. + + var rows; + + if (minPos < 0) { + // We will define depth in an empty span with display: table-cell. + // It should render with the height that we define. But Chrome, in + // contenteditable mode only, treats that span as if it contains some + // text content. And that min-height over-rides our desired height. + // So we put another empty span inside the depth strut span. + var emptySpan = buildCommon_makeSpan([], []); + var depthStrut = buildCommon_makeSpan(["vlist"], [emptySpan]); + depthStrut.style.height = -minPos + "em"; // Safari wants the first row to have inline content; otherwise it + // puts the bottom of the *second* row on the baseline. + + var topStrut = buildCommon_makeSpan(["vlist-s"], [new domTree_SymbolNode("\u200B")]); + rows = [buildCommon_makeSpan(["vlist-r"], [vlist, topStrut]), buildCommon_makeSpan(["vlist-r"], [depthStrut])]; + } else { + rows = [buildCommon_makeSpan(["vlist-r"], [vlist])]; + } + + var vtable = buildCommon_makeSpan(["vlist-t"], rows); + + if (rows.length === 2) { + vtable.classes.push("vlist-t2"); + } + + vtable.height = maxPos; + vtable.depth = -minPos; + return vtable; +}; // Glue is a concept from TeX which is a flexible space between elements in +// either a vertical or horizontal list. In KaTeX, at least for now, it's +// static space between elements in a horizontal layout. + + +var buildCommon_makeGlue = function makeGlue(measurement, options) { + // Make an empty span for the space + var rule = buildCommon_makeSpan(["mspace"], [], options); + var size = units_calculateSize(measurement, options); + rule.style.marginRight = size + "em"; + return rule; +}; // Takes font options, and returns the appropriate fontLookup name + + +var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) { + var baseFontName = ""; + + switch (fontFamily) { + case "amsrm": + baseFontName = "AMS"; + break; + + case "textrm": + baseFontName = "Main"; + break; + + case "textsf": + baseFontName = "SansSerif"; + break; + + case "texttt": + baseFontName = "Typewriter"; + break; + + default: + baseFontName = fontFamily; + // use fonts added by a plugin + } + + var fontStylesName; + + if (fontWeight === "textbf" && fontShape === "textit") { + fontStylesName = "BoldItalic"; + } else if (fontWeight === "textbf") { + fontStylesName = "Bold"; + } else if (fontWeight === "textit") { + fontStylesName = "Italic"; + } else { + fontStylesName = "Regular"; + } + + return baseFontName + "-" + fontStylesName; +}; +/** + * Maps TeX font commands to objects containing: + * - variant: string used for "mathvariant" attribute in buildMathML.js + * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics + */ +// A map between tex font commands an MathML mathvariant attribute values + + +var fontMap = { + // styles + "mathbf": { + variant: "bold", + fontName: "Main-Bold" + }, + "mathrm": { + variant: "normal", + fontName: "Main-Regular" + }, + "textit": { + variant: "italic", + fontName: "Main-Italic" + }, + "mathit": { + variant: "italic", + fontName: "Main-Italic" + }, + // Default math font, "mathnormal" and "boldsymbol" are missing because they + // require the use of several fonts: Main-Italic and Math-Italic for default + // math font, Main-Italic, Math-Italic, Caligraphic for "mathnormal", and + // Math-BoldItalic and Main-Bold for "boldsymbol". This is handled by a + // special case in makeOrd which ends up calling mathdefault, mathnormal, + // and boldsymbol. + // families + "mathbb": { + variant: "double-struck", + fontName: "AMS-Regular" + }, + "mathcal": { + variant: "script", + fontName: "Caligraphic-Regular" + }, + "mathfrak": { + variant: "fraktur", + fontName: "Fraktur-Regular" + }, + "mathscr": { + variant: "script", + fontName: "Script-Regular" + }, + "mathsf": { + variant: "sans-serif", + fontName: "SansSerif-Regular" + }, + "mathtt": { + variant: "monospace", + fontName: "Typewriter-Regular" + } +}; +var svgData = { + // path, width, height + vec: ["vec", 0.471, 0.714], + // values from the font glyph + oiintSize1: ["oiintSize1", 0.957, 0.499], + // oval to overlay the integrand + oiintSize2: ["oiintSize2", 1.472, 0.659], + oiiintSize1: ["oiiintSize1", 1.304, 0.499], + oiiintSize2: ["oiiintSize2", 1.98, 0.659] +}; + +var buildCommon_staticSvg = function staticSvg(value, options) { + // Create a span with inline SVG for the element. + var _svgData$value = svgData[value], + pathName = _svgData$value[0], + width = _svgData$value[1], + height = _svgData$value[2]; + var path = new domTree_PathNode(pathName); + var svgNode = new SvgNode([path], { + "width": width + "em", + "height": height + "em", + // Override CSS rule `.katex svg { width: 100% }` + "style": "width:" + width + "em", + "viewBox": "0 0 " + 1000 * width + " " + 1000 * height, + "preserveAspectRatio": "xMinYMin" + }); + var span = buildCommon_makeSvgSpan(["overlay"], [svgNode], options); + span.height = height; + span.style.height = height + "em"; + span.style.width = width + "em"; + return span; +}; + +/* harmony default export */ var buildCommon = ({ + fontMap: fontMap, + makeSymbol: buildCommon_makeSymbol, + mathsym: buildCommon_mathsym, + makeSpan: buildCommon_makeSpan, + makeSvgSpan: buildCommon_makeSvgSpan, + makeLineSpan: makeLineSpan, + makeAnchor: buildCommon_makeAnchor, + makeFragment: buildCommon_makeFragment, + wrapFragment: buildCommon_wrapFragment, + makeVList: buildCommon_makeVList, + makeOrd: buildCommon_makeOrd, + makeGlue: buildCommon_makeGlue, + staticSvg: buildCommon_staticSvg, + svgData: svgData, + tryCombineChars: buildCommon_tryCombineChars +}); +// CONCATENATED MODULE: ./src/parseNode.js + + +/** + * Asserts that the node is of the given type and returns it with stricter + * typing. Throws if the node's type does not match. + */ +function assertNodeType(node, type) { + var typedNode = checkNodeType(node, type); + + if (!typedNode) { + throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node))); + } // $FlowFixMe: Unsure why. + + + return typedNode; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function checkNodeType(node, type) { + if (node && node.type === type) { + // The definition of ParseNode<TYPE> doesn't communicate to flow that + // `type: TYPE` (as that's not explicitly mentioned anywhere), though that + // happens to be true for all our value types. + // $FlowFixMe + return node; + } + + return null; +} +/** + * Asserts that the node is of the given type and returns it with stricter + * typing. Throws if the node's type does not match. + */ + +function assertAtomFamily(node, family) { + var typedNode = checkAtomFamily(node, family); + + if (!typedNode) { + throw new Error("Expected node of type \"atom\" and family \"" + family + "\", but got " + (node ? node.type === "atom" ? "atom of family " + node.family : "node of type " + node.type : String(node))); + } + + return typedNode; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function checkAtomFamily(node, family) { + return node && node.type === "atom" && node.family === family ? node : null; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function assertSymbolNodeType(node) { + var typedNode = checkSymbolNodeType(node); + + if (!typedNode) { + throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node))); + } + + return typedNode; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function checkSymbolNodeType(node) { + if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) { + // $FlowFixMe + return node; + } + + return null; +} +// CONCATENATED MODULE: ./src/spacingData.js +/** + * Describes spaces between different classes of atoms. + */ +var thinspace = { + number: 3, + unit: "mu" +}; +var mediumspace = { + number: 4, + unit: "mu" +}; +var thickspace = { + number: 5, + unit: "mu" +}; // Making the type below exact with all optional fields doesn't work due to +// - https://github.com/facebook/flow/issues/4582 +// - https://github.com/facebook/flow/issues/5688 +// However, since *all* fields are optional, $Shape<> works as suggested in 5688 +// above. + +// Spacing relationships for display and text styles +var spacings = { + mord: { + mop: thinspace, + mbin: mediumspace, + mrel: thickspace, + minner: thinspace + }, + mop: { + mord: thinspace, + mop: thinspace, + mrel: thickspace, + minner: thinspace + }, + mbin: { + mord: mediumspace, + mop: mediumspace, + mopen: mediumspace, + minner: mediumspace + }, + mrel: { + mord: thickspace, + mop: thickspace, + mopen: thickspace, + minner: thickspace + }, + mopen: {}, + mclose: { + mop: thinspace, + mbin: mediumspace, + mrel: thickspace, + minner: thinspace + }, + mpunct: { + mord: thinspace, + mop: thinspace, + mrel: thickspace, + mopen: thinspace, + mclose: thinspace, + mpunct: thinspace, + minner: thinspace + }, + minner: { + mord: thinspace, + mop: thinspace, + mbin: mediumspace, + mrel: thickspace, + mopen: thinspace, + mpunct: thinspace, + minner: thinspace + } +}; // Spacing relationships for script and scriptscript styles + +var tightSpacings = { + mord: { + mop: thinspace + }, + mop: { + mord: thinspace, + mop: thinspace + }, + mbin: {}, + mrel: {}, + mopen: {}, + mclose: { + mop: thinspace + }, + mpunct: {}, + minner: { + mop: thinspace + } +}; +// CONCATENATED MODULE: ./src/defineFunction.js + + +/** + * All registered functions. + * `functions.js` just exports this same dictionary again and makes it public. + * `Parser.js` requires this dictionary. + */ +var _functions = {}; +/** + * All HTML builders. Should be only used in the `define*` and the `build*ML` + * functions. + */ + +var _htmlGroupBuilders = {}; +/** + * All MathML builders. Should be only used in the `define*` and the `build*ML` + * functions. + */ + +var _mathmlGroupBuilders = {}; +function defineFunction(_ref) { + var type = _ref.type, + nodeType = _ref.nodeType, + names = _ref.names, + props = _ref.props, + handler = _ref.handler, + htmlBuilder = _ref.htmlBuilder, + mathmlBuilder = _ref.mathmlBuilder; + // Set default values of functions + var data = { + type: type, + numArgs: props.numArgs, + argTypes: props.argTypes, + greediness: props.greediness === undefined ? 1 : props.greediness, + allowedInText: !!props.allowedInText, + allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, + numOptionalArgs: props.numOptionalArgs || 0, + infix: !!props.infix, + consumeMode: props.consumeMode, + handler: handler + }; + + for (var i = 0; i < names.length; ++i) { + // TODO: The value type of _functions should be a type union of all + // possible `FunctionSpec<>` possibilities instead of `FunctionSpec<*>`, + // which is an existential type. + // $FlowFixMe + _functions[names[i]] = data; + } + + if (type) { + if (htmlBuilder) { + _htmlGroupBuilders[type] = htmlBuilder; + } + + if (mathmlBuilder) { + _mathmlGroupBuilders[type] = mathmlBuilder; + } + } +} +/** + * Use this to register only the HTML and MathML builders for a function (e.g. + * if the function's ParseNode is generated in Parser.js rather than via a + * stand-alone handler provided to `defineFunction`). + */ + +function defineFunctionBuilders(_ref2) { + var type = _ref2.type, + htmlBuilder = _ref2.htmlBuilder, + mathmlBuilder = _ref2.mathmlBuilder; + defineFunction({ + type: type, + names: [], + props: { + numArgs: 0 + }, + handler: function handler() { + throw new Error('Should never be called.'); + }, + htmlBuilder: htmlBuilder, + mathmlBuilder: mathmlBuilder + }); +} // Since the corresponding buildHTML/buildMathML function expects a +// list of elements, we normalize for different kinds of arguments + +var defineFunction_ordargument = function ordargument(arg) { + var node = checkNodeType(arg, "ordgroup"); + return node ? node.body : [arg]; +}; +// CONCATENATED MODULE: ./src/buildHTML.js +/** + * This file does the main work of building a domTree structure from a parse + * tree. The entry point is the `buildHTML` function, which takes a parse tree. + * Then, the buildExpression, buildGroup, and various groupBuilders functions + * are called, to produce a final HTML tree. + */ + + + + + + + + + +var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`) +// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6, +// and the text before Rule 19. + +var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"]; +var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"]; +var buildHTML_styleMap = { + "display": src_Style.DISPLAY, + "text": src_Style.TEXT, + "script": src_Style.SCRIPT, + "scriptscript": src_Style.SCRIPTSCRIPT +}; +var DomEnum = { + mord: "mord", + mop: "mop", + mbin: "mbin", + mrel: "mrel", + mopen: "mopen", + mclose: "mclose", + mpunct: "mpunct", + minner: "minner" +}; + +/** + * Take a list of nodes, build them in order, and return a list of the built + * nodes. documentFragments are flattened into their contents, so the + * returned list contains no fragments. `isRealGroup` is true if `expression` + * is a real group (no atoms will be added on either side), as opposed to + * a partial group (e.g. one created by \color). `surrounding` is an array + * consisting type of nodes that will be added to the left and right. + */ +var buildHTML_buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) { + if (surrounding === void 0) { + surrounding = [null, null]; + } + + // Parse expressions into `groups`. + var groups = []; + + for (var i = 0; i < expression.length; i++) { + var output = buildHTML_buildGroup(expression[i], options); + + if (output instanceof tree_DocumentFragment) { + var children = output.children; + groups.push.apply(groups, children); + } else { + groups.push(output); + } + } // If `expression` is a partial group, let the parent handle spacings + // to avoid processing groups multiple times. + + + if (!isRealGroup) { + return groups; + } + + var glueOptions = options; + + if (expression.length === 1) { + var node = checkNodeType(expression[0], "sizing") || checkNodeType(expression[0], "styling"); + + if (!node) {// No match. + } else if (node.type === "sizing") { + glueOptions = options.havingSize(node.size); + } else if (node.type === "styling") { + glueOptions = options.havingStyle(buildHTML_styleMap[node.style]); + } + } // Dummy spans for determining spacings between surrounding atoms. + // If `expression` has no atoms on the left or right, class "leftmost" + // or "rightmost", respectively, is used to indicate it. + + + var dummyPrev = buildHTML_makeSpan([surrounding[0] || "leftmost"], [], options); + var dummyNext = buildHTML_makeSpan([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element + // of its `classes` array. A later cleanup should ensure this, for + // instance by changing the signature of `makeSpan`. + // Before determining what spaces to insert, perform bin cancellation. + // Binary operators change to ordinary symbols in some contexts. + + traverseNonSpaceNodes(groups, function (node, prev) { + var prevType = prev.classes[0]; + var type = node.classes[0]; + + if (prevType === "mbin" && utils.contains(binRightCanceller, type)) { + prev.classes[0] = "mord"; + } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) { + node.classes[0] = "mord"; + } + }, { + node: dummyPrev + }, dummyNext); + traverseNonSpaceNodes(groups, function (node, prev) { + var prevType = getTypeOfDomTree(prev); + var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style. + + var space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null; + + if (space) { + // Insert glue (spacing) after the `prev`. + return buildCommon.makeGlue(space, glueOptions); + } + }, { + node: dummyPrev + }, dummyNext); + return groups; +}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and +// previous node as arguments, optionally returning a node to insert after the +// previous node. `prev` is an object with the previous node and `insertAfter` +// function to insert after it. `next` is a node that will be added to the right. +// Used for bin cancellation and inserting spacings. + +var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next) { + if (next) { + // temporarily append the right node, if exists + nodes.push(next); + } + + var i = 0; + + for (; i < nodes.length; i++) { + var node = nodes[i]; + var partialGroup = buildHTML_checkPartialGroup(node); + + if (partialGroup) { + // Recursive DFS + traverseNonSpaceNodes(partialGroup.children, callback, prev); + continue; + } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit + // spacing should go between atoms of different classes + + + if (node.classes[0] === "mspace") { + continue; + } + + var result = callback(node, prev.node); + + if (result) { + if (prev.insertAfter) { + prev.insertAfter(result); + } else { + // insert at front + nodes.unshift(result); + i++; + } + } + + prev.node = node; + + prev.insertAfter = function (index) { + return function (n) { + nodes.splice(index + 1, 0, n); + i++; + }; + }(i); + } + + if (next) { + nodes.pop(); + } +}; // Check if given node is a partial group, i.e., does not affect spacing around. + + +var buildHTML_checkPartialGroup = function checkPartialGroup(node) { + if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor) { + return node; + } + + return null; +}; // Return the outermost node of a domTree. + + +var getOutermostNode = function getOutermostNode(node, side) { + var partialGroup = buildHTML_checkPartialGroup(node); + + if (partialGroup) { + var children = partialGroup.children; + + if (children.length) { + if (side === "right") { + return getOutermostNode(children[children.length - 1], "right"); + } else if (side === "left") { + return getOutermostNode(children[0], "left"); + } + } + } + + return node; +}; // Return math atom class (mclass) of a domTree. +// If `side` is given, it will get the type of the outermost node at given side. + + +var getTypeOfDomTree = function getTypeOfDomTree(node, side) { + if (!node) { + return null; + } + + if (side) { + node = getOutermostNode(node, side); + } // This makes a lot of assumptions as to where the type of atom + // appears. We should do a better job of enforcing this. + + + return DomEnum[node.classes[0]] || null; +}; +var makeNullDelimiter = function makeNullDelimiter(options, classes) { + var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses()); + return buildHTML_makeSpan(classes.concat(moreClasses)); +}; +/** + * buildGroup is the function that takes a group and calls the correct groupType + * function for it. It also handles the interaction of size and style changes + * between parents and children. + */ + +var buildHTML_buildGroup = function buildGroup(group, options, baseOptions) { + if (!group) { + return buildHTML_makeSpan(); + } + + if (_htmlGroupBuilders[group.type]) { + // Call the groupBuilders function + var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account + // for that size difference. + + if (baseOptions && options.size !== baseOptions.size) { + groupNode = buildHTML_makeSpan(options.sizingClasses(baseOptions), [groupNode], options); + var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; + groupNode.height *= multiplier; + groupNode.depth *= multiplier; + } + + return groupNode; + } else { + throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); + } +}; +/** + * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`) + * into an unbreakable HTML node of class .base, with proper struts to + * guarantee correct vertical extent. `buildHTML` calls this repeatedly to + * make up the entire expression as a sequence of unbreakable units. + */ + +function buildHTMLUnbreakable(children, options) { + // Compute height and depth of this chunk. + var body = buildHTML_makeSpan(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at + // the height of the expression, and the bottom of the HTML element + // falls at the depth of the expression. + // We used to have separate top and bottom struts, where the bottom strut + // would like to use `vertical-align: top`, but in IE 9 this lowers the + // baseline of the box to the bottom of this strut (instead of staying in + // the normal place) so we use an absolute value for vertical-align instead. + + var strut = buildHTML_makeSpan(["strut"]); + strut.style.height = body.height + body.depth + "em"; + strut.style.verticalAlign = -body.depth + "em"; + body.children.unshift(strut); + return body; +} +/** + * Take an entire parse tree, and build it into an appropriate set of HTML + * nodes. + */ + + +function buildHTML(tree, options) { + // Strip off outer tag wrapper for processing below. + var tag = null; + + if (tree.length === 1 && tree[0].type === "tag") { + tag = tree[0].tag; + tree = tree[0].body; + } // Build the expression contained in the tree + + + var expression = buildHTML_buildExpression(tree, options, true); + var children = []; // Create one base node for each chunk between potential line breaks. + // The TeXBook [p.173] says "A formula will be broken only after a + // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary + // operation symbol like $+$ or $-$ or $\times$, where the relation or + // binary operation is on the ``outer level'' of the formula (i.e., not + // enclosed in {...} and not part of an \over construction)." + + var parts = []; + + for (var i = 0; i < expression.length; i++) { + parts.push(expression[i]); + + if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) { + // Put any post-operator glue on same line as operator. + // Watch for \nobreak along the way, and stop at \newline. + var nobreak = false; + + while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) { + i++; + parts.push(expression[i]); + + if (expression[i].hasClass("nobreak")) { + nobreak = true; + } + } // Don't allow break if \nobreak among the post-operator glue. + + + if (!nobreak) { + children.push(buildHTMLUnbreakable(parts, options)); + parts = []; + } + } else if (expression[i].hasClass("newline")) { + // Write the line except the newline + parts.pop(); + + if (parts.length > 0) { + children.push(buildHTMLUnbreakable(parts, options)); + parts = []; + } // Put the newline at the top level + + + children.push(expression[i]); + } + } + + if (parts.length > 0) { + children.push(buildHTMLUnbreakable(parts, options)); + } // Now, if there was a tag, build it too and append it as a final child. + + + var tagChild; + + if (tag) { + tagChild = buildHTMLUnbreakable(buildHTML_buildExpression(tag, options, true)); + tagChild.classes = ["tag"]; + children.push(tagChild); + } + + var htmlNode = buildHTML_makeSpan(["katex-html"], children); + htmlNode.setAttribute("aria-hidden", "true"); // Adjust the strut of the tag to be the maximum height of all children + // (the height of the enclosing htmlNode) for proper vertical alignment. + + if (tagChild) { + var strut = tagChild.children[0]; + strut.style.height = htmlNode.height + htmlNode.depth + "em"; + strut.style.verticalAlign = -htmlNode.depth + "em"; + } + + return htmlNode; +} +// CONCATENATED MODULE: ./src/mathMLTree.js +/** + * These objects store data about MathML nodes. This is the MathML equivalent + * of the types in domTree.js. Since MathML handles its own rendering, and + * since we're mainly using MathML to improve accessibility, we don't manage + * any of the styling state that the plain DOM nodes do. + * + * The `toNode` and `toMarkup` functions work simlarly to how they do in + * domTree.js, creating namespaced DOM nodes and HTML text markup respectively. + */ + + +function newDocumentFragment(children) { + return new tree_DocumentFragment(children); +} +/** + * This node represents a general purpose MathML node of any type. The + * constructor requires the type of node to create (for example, `"mo"` or + * `"mspace"`, corresponding to `<mo>` and `<mspace>` tags). + */ + +var mathMLTree_MathNode = +/*#__PURE__*/ +function () { + function MathNode(type, children) { + this.type = void 0; + this.attributes = void 0; + this.children = void 0; + this.type = type; + this.attributes = {}; + this.children = children || []; + } + /** + * Sets an attribute on a MathML node. MathML depends on attributes to convey a + * semantic content, so this is used heavily. + */ + + + var _proto = MathNode.prototype; + + _proto.setAttribute = function setAttribute(name, value) { + this.attributes[name] = value; + } + /** + * Gets an attribute on a MathML node. + */ + ; + + _proto.getAttribute = function getAttribute(name) { + return this.attributes[name]; + } + /** + * Converts the math node into a MathML-namespaced DOM element. + */ + ; + + _proto.toNode = function toNode() { + var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } + + for (var i = 0; i < this.children.length; i++) { + node.appendChild(this.children[i].toNode()); + } + + return node; + } + /** + * Converts the math node into an HTML markup string. + */ + ; + + _proto.toMarkup = function toMarkup() { + var markup = "<" + this.type; // Add the attributes + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + markup += " " + attr + "=\""; + markup += utils.escape(this.attributes[attr]); + markup += "\""; + } + } + + markup += ">"; + + for (var i = 0; i < this.children.length; i++) { + markup += this.children[i].toMarkup(); + } + + markup += "</" + this.type + ">"; + return markup; + } + /** + * Converts the math node into a string, similar to innerText, but escaped. + */ + ; + + _proto.toText = function toText() { + return this.children.map(function (child) { + return child.toText(); + }).join(""); + }; + + return MathNode; +}(); +/** + * This node represents a piece of text. + */ + +var mathMLTree_TextNode = +/*#__PURE__*/ +function () { + function TextNode(text) { + this.text = void 0; + this.text = text; + } + /** + * Converts the text node into a DOM text node. + */ + + + var _proto2 = TextNode.prototype; + + _proto2.toNode = function toNode() { + return document.createTextNode(this.text); + } + /** + * Converts the text node into escaped HTML markup + * (representing the text itself). + */ + ; + + _proto2.toMarkup = function toMarkup() { + return utils.escape(this.toText()); + } + /** + * Converts the text node into a string + * (representing the text iteself). + */ + ; + + _proto2.toText = function toText() { + return this.text; + }; + + return TextNode; +}(); +/** + * This node represents a space, but may render as <mspace.../> or as text, + * depending on the width. + */ + +var SpaceNode = +/*#__PURE__*/ +function () { + /** + * Create a Space node with width given in CSS ems. + */ + function SpaceNode(width) { + this.width = void 0; + this.character = void 0; + this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html + // for a table of space-like characters. We use Unicode + // representations instead of &LongNames; as it's not clear how to + // make the latter via document.createTextNode. + + if (width >= 0.05555 && width <= 0.05556) { + this.character = "\u200A"; //   + } else if (width >= 0.1666 && width <= 0.1667) { + this.character = "\u2009"; //   + } else if (width >= 0.2222 && width <= 0.2223) { + this.character = "\u2005"; //   + } else if (width >= 0.2777 && width <= 0.2778) { + this.character = "\u2005\u200A"; //    + } else if (width >= -0.05556 && width <= -0.05555) { + this.character = "\u200A\u2063"; // ​ + } else if (width >= -0.1667 && width <= -0.1666) { + this.character = "\u2009\u2063"; // ​ + } else if (width >= -0.2223 && width <= -0.2222) { + this.character = "\u205F\u2063"; // ​ + } else if (width >= -0.2778 && width <= -0.2777) { + this.character = "\u2005\u2063"; // ​ + } else { + this.character = null; + } + } + /** + * Converts the math node into a MathML-namespaced DOM element. + */ + + + var _proto3 = SpaceNode.prototype; + + _proto3.toNode = function toNode() { + if (this.character) { + return document.createTextNode(this.character); + } else { + var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace"); + node.setAttribute("width", this.width + "em"); + return node; + } + } + /** + * Converts the math node into an HTML markup string. + */ + ; + + _proto3.toMarkup = function toMarkup() { + if (this.character) { + return "<mtext>" + this.character + "</mtext>"; + } else { + return "<mspace width=\"" + this.width + "em\"/>"; + } + } + /** + * Converts the math node into a string, similar to innerText. + */ + ; + + _proto3.toText = function toText() { + if (this.character) { + return this.character; + } else { + return " "; + } + }; + + return SpaceNode; +}(); + +/* harmony default export */ var mathMLTree = ({ + MathNode: mathMLTree_MathNode, + TextNode: mathMLTree_TextNode, + SpaceNode: SpaceNode, + newDocumentFragment: newDocumentFragment +}); +// CONCATENATED MODULE: ./src/buildMathML.js +/** + * This file converts a parse tree into a cooresponding MathML tree. The main + * entry point is the `buildMathML` function, which takes a parse tree from the + * parser. + */ + + + + + + + + + +/** + * Takes a symbol and converts it into a MathML text node after performing + * optional replacement from symbols.js. + */ +var buildMathML_makeText = function makeText(text, mode, options) { + if (src_symbols[mode][text] && src_symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.substr(4, 2) === "tt" || options.font && options.font.substr(4, 2) === "tt"))) { + text = src_symbols[mode][text].replace; + } + + return new mathMLTree.TextNode(text); +}; +/** + * Wrap the given array of nodes in an <mrow> node if needed, i.e., + * unless the array has length 1. Always returns a single node. + */ + +var buildMathML_makeRow = function makeRow(body) { + if (body.length === 1) { + return body[0]; + } else { + return new mathMLTree.MathNode("mrow", body); + } +}; +/** + * Returns the math variant as a string or null if none is required. + */ + +var buildMathML_getVariant = function getVariant(group, options) { + // Handle \text... font specifiers as best we can. + // MathML has a limited list of allowable mathvariant specifiers; see + // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt + if (options.fontFamily === "texttt") { + return "monospace"; + } else if (options.fontFamily === "textsf") { + if (options.fontShape === "textit" && options.fontWeight === "textbf") { + return "sans-serif-bold-italic"; + } else if (options.fontShape === "textit") { + return "sans-serif-italic"; + } else if (options.fontWeight === "textbf") { + return "bold-sans-serif"; + } else { + return "sans-serif"; + } + } else if (options.fontShape === "textit" && options.fontWeight === "textbf") { + return "bold-italic"; + } else if (options.fontShape === "textit") { + return "italic"; + } else if (options.fontWeight === "textbf") { + return "bold"; + } + + var font = options.font; + + if (!font || font === "mathnormal") { + return null; + } + + var mode = group.mode; + + if (font === "mathit") { + return "italic"; + } else if (font === "boldsymbol") { + return "bold-italic"; + } + + var text = group.text; + + if (utils.contains(["\\imath", "\\jmath"], text)) { + return null; + } + + if (src_symbols[mode][text] && src_symbols[mode][text].replace) { + text = src_symbols[mode][text].replace; + } + + var fontName = buildCommon.fontMap[font].fontName; + + if (getCharacterMetrics(text, fontName, mode)) { + return buildCommon.fontMap[font].variant; + } + + return null; +}; +/** + * Takes a list of nodes, builds them, and returns a list of the generated + * MathML nodes. Also combine consecutive <mtext> outputs into a single + * <mtext> tag. + */ + +var buildMathML_buildExpression = function buildExpression(expression, options) { + var groups = []; + var lastGroup; + + for (var i = 0; i < expression.length; i++) { + var group = buildMathML_buildGroup(expression[i], options); + + if (group instanceof mathMLTree_MathNode && lastGroup instanceof mathMLTree_MathNode) { + // Concatenate adjacent <mtext>s + if (group.type === 'mtext' && lastGroup.type === 'mtext' && group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) { + var _lastGroup$children; + + (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, group.children); + + continue; // Concatenate adjacent <mn>s + } else if (group.type === 'mn' && lastGroup.type === 'mn') { + var _lastGroup$children2; + + (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, group.children); + + continue; // Concatenate <mn>...</mn> followed by <mi>.</mi> + } else if (group.type === 'mi' && group.children.length === 1 && lastGroup.type === 'mn') { + var child = group.children[0]; + + if (child instanceof mathMLTree_TextNode && child.text === '.') { + var _lastGroup$children3; + + (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, group.children); + + continue; + } + } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) { + var lastChild = lastGroup.children[0]; + + if (lastChild instanceof mathMLTree_TextNode && lastChild.text === "\u0338" && (group.type === 'mo' || group.type === 'mi' || group.type === 'mn')) { + var _child = group.children[0]; + + if (_child instanceof mathMLTree_TextNode && _child.text.length > 0) { + // Overlay with combining character long solidus + _child.text = _child.text.slice(0, 1) + "\u0338" + _child.text.slice(1); + groups.pop(); + } + } + } + } + + groups.push(group); + lastGroup = group; + } + + return groups; +}; +/** + * Equivalent to buildExpression, but wraps the elements in an <mrow> + * if there's more than one. Returns a single node instead of an array. + */ + +var buildExpressionRow = function buildExpressionRow(expression, options) { + return buildMathML_makeRow(buildMathML_buildExpression(expression, options)); +}; +/** + * Takes a group from the parser and calls the appropriate groupBuilders function + * on it to produce a MathML node. + */ + +var buildMathML_buildGroup = function buildGroup(group, options) { + if (!group) { + return new mathMLTree.MathNode("mrow"); + } + + if (_mathmlGroupBuilders[group.type]) { + // Call the groupBuilders function + var result = _mathmlGroupBuilders[group.type](group, options); + return result; + } else { + throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); + } +}; +/** + * Takes a full parse tree and settings and builds a MathML representation of + * it. In particular, we put the elements from building the parse tree into a + * <semantics> tag so we can also include that TeX source as an annotation. + * + * Note that we actually return a domTree element with a `<math>` inside it so + * we can do appropriate styling. + */ + +function buildMathML(tree, texExpression, options) { + var expression = buildMathML_buildExpression(tree, options); // Wrap up the expression in an mrow so it is presented in the semantics + // tag correctly, unless it's a single <mrow> or <mtable>. + + var wrapper; + + if (expression.length === 1 && expression[0] instanceof mathMLTree_MathNode && utils.contains(["mrow", "mtable"], expression[0].type)) { + wrapper = expression[0]; + } else { + wrapper = new mathMLTree.MathNode("mrow", expression); + } // Build a TeX annotation of the source + + + var annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]); + annotation.setAttribute("encoding", "application/x-tex"); + var semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]); + var math = new mathMLTree.MathNode("math", [semantics]); // You can't style <math> nodes, so we wrap the node in a span. + // NOTE: The span class is not typed to have <math> nodes as children, and + // we don't want to make the children type more generic since the children + // of span are expected to have more fields in `buildHtml` contexts. + // $FlowFixMe + + return buildCommon.makeSpan(["katex-mathml"], [math]); +} +// CONCATENATED MODULE: ./src/buildTree.js + + + + + + + +var buildTree_optionsFromSettings = function optionsFromSettings(settings) { + return new src_Options({ + style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT, + maxSize: settings.maxSize + }); +}; + +var buildTree_displayWrap = function displayWrap(node, settings) { + if (settings.displayMode) { + var classes = ["katex-display"]; + + if (settings.leqno) { + classes.push("leqno"); + } + + if (settings.fleqn) { + classes.push("fleqn"); + } + + node = buildCommon.makeSpan(classes, [node]); + } + + return node; +}; + +var buildTree_buildTree = function buildTree(tree, expression, settings) { + var options = buildTree_optionsFromSettings(settings); + var mathMLNode = buildMathML(tree, expression, options); + var htmlNode = buildHTML(tree, options); + var katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, htmlNode]); + return buildTree_displayWrap(katexNode, settings); +}; +var buildTree_buildHTMLTree = function buildHTMLTree(tree, expression, settings) { + var options = buildTree_optionsFromSettings(settings); + var htmlNode = buildHTML(tree, options); + var katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); + return buildTree_displayWrap(katexNode, settings); +}; +/* harmony default export */ var src_buildTree = (buildTree_buildTree); +// CONCATENATED MODULE: ./src/stretchy.js +/** + * This file provides support to buildMathML.js and buildHTML.js + * for stretchy wide elements rendered from SVG files + * and other CSS trickery. + */ + + + + +var stretchyCodePoint = { + widehat: "^", + widecheck: "ˇ", + widetilde: "~", + utilde: "~", + overleftarrow: "\u2190", + underleftarrow: "\u2190", + xleftarrow: "\u2190", + overrightarrow: "\u2192", + underrightarrow: "\u2192", + xrightarrow: "\u2192", + underbrace: "\u23DF", + overbrace: "\u23DE", + overgroup: "\u23E0", + undergroup: "\u23E1", + overleftrightarrow: "\u2194", + underleftrightarrow: "\u2194", + xleftrightarrow: "\u2194", + Overrightarrow: "\u21D2", + xRightarrow: "\u21D2", + overleftharpoon: "\u21BC", + xleftharpoonup: "\u21BC", + overrightharpoon: "\u21C0", + xrightharpoonup: "\u21C0", + xLeftarrow: "\u21D0", + xLeftrightarrow: "\u21D4", + xhookleftarrow: "\u21A9", + xhookrightarrow: "\u21AA", + xmapsto: "\u21A6", + xrightharpoondown: "\u21C1", + xleftharpoondown: "\u21BD", + xrightleftharpoons: "\u21CC", + xleftrightharpoons: "\u21CB", + xtwoheadleftarrow: "\u219E", + xtwoheadrightarrow: "\u21A0", + xlongequal: "=", + xtofrom: "\u21C4", + xrightleftarrows: "\u21C4", + xrightequilibrium: "\u21CC", + // Not a perfect match. + xleftequilibrium: "\u21CB" // None better available. + +}; + +var stretchy_mathMLnode = function mathMLnode(label) { + var node = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(stretchyCodePoint[label.substr(1)])]); + node.setAttribute("stretchy", "true"); + return node; +}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts. +// Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>) +// Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>) +// Licensed under the SIL Open Font License, Version 1.1. +// See \nhttp://scripts.sil.org/OFL +// Very Long SVGs +// Many of the KaTeX stretchy wide elements use a long SVG image and an +// overflow: hidden tactic to achieve a stretchy image while avoiding +// distortion of arrowheads or brace corners. +// The SVG typically contains a very long (400 em) arrow. +// The SVG is in a container span that has overflow: hidden, so the span +// acts like a window that exposes only part of the SVG. +// The SVG always has a longer, thinner aspect ratio than the container span. +// After the SVG fills 100% of the height of the container span, +// there is a long arrow shaft left over. That left-over shaft is not shown. +// Instead, it is sliced off because the span's CSS has overflow: hidden. +// Thus, the reader sees an arrow that matches the subject matter width +// without distortion. +// Some functions, such as \cancel, need to vary their aspect ratio. These +// functions do not get the overflow SVG treatment. +// Second Brush Stroke +// Low resolution monitors struggle to display images in fine detail. +// So browsers apply anti-aliasing. A long straight arrow shaft therefore +// will sometimes appear as if it has a blurred edge. +// To mitigate this, these SVG files contain a second "brush-stroke" on the +// arrow shafts. That is, a second long thin rectangular SVG path has been +// written directly on top of each arrow shaft. This reinforcement causes +// some of the screen pixels to display as black instead of the anti-aliased +// gray pixel that a single path would generate. So we get arrow shafts +// whose edges appear to be sharper. +// In the katexImagesData object just below, the dimensions all +// correspond to path geometry inside the relevant SVG. +// For example, \overrightarrow uses the same arrowhead as glyph U+2192 +// from the KaTeX Main font. The scaling factor is 1000. +// That is, inside the font, that arrowhead is 522 units tall, which +// corresponds to 0.522 em inside the document. + + +var katexImagesData = { + // path(s), minWidth, height, align + overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], + overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], + underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], + underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], + xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"], + xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"], + Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"], + xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"], + xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"], + overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"], + xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"], + xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"], + overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"], + xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"], + xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"], + xlongequal: [["longequal"], 0.888, 334, "xMinYMin"], + xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"], + xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"], + overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], + overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548], + underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548], + underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], + xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522], + xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560], + xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716], + xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716], + xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522], + xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522], + overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], + underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], + overgroup: [["leftgroup", "rightgroup"], 0.888, 342], + undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342], + xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522], + xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528], + // The next three arrows are from the mhchem package. + // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the + // document as \xrightarrow or \xrightleftharpoons. Those have + // min-length = 1.75em, so we set min-length on these next three to match. + xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901], + xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716], + xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716] +}; + +var groupLength = function groupLength(arg) { + if (arg.type === "ordgroup") { + return arg.body.length; + } else { + return 1; + } +}; + +var stretchy_svgSpan = function svgSpan(group, options) { + // Create a span with inline SVG for the element. + function buildSvgSpan_() { + var viewBoxWidth = 400000; // default + + var label = group.label.substr(1); + + if (utils.contains(["widehat", "widecheck", "widetilde", "utilde"], label)) { + // Each type in the `if` statement corresponds to one of the ParseNode + // types below. This narrowing is required to access `grp.base`. + var grp = group; // There are four SVG images available for each function. + // Choose a taller image when there are more characters. + + var numChars = groupLength(grp.base); + var viewBoxHeight; + var pathName; + + var _height; + + if (numChars > 5) { + if (label === "widehat" || label === "widecheck") { + viewBoxHeight = 420; + viewBoxWidth = 2364; + _height = 0.42; + pathName = label + "4"; + } else { + viewBoxHeight = 312; + viewBoxWidth = 2340; + _height = 0.34; + pathName = "tilde4"; + } + } else { + var imgIndex = [1, 1, 2, 2, 3, 3][numChars]; + + if (label === "widehat" || label === "widecheck") { + viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex]; + viewBoxHeight = [0, 239, 300, 360, 420][imgIndex]; + _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex]; + pathName = label + imgIndex; + } else { + viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex]; + viewBoxHeight = [0, 260, 286, 306, 312][imgIndex]; + _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex]; + pathName = "tilde" + imgIndex; + } + } + + var path = new domTree_PathNode(pathName); + var svgNode = new SvgNode([path], { + "width": "100%", + "height": _height + "em", + "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight, + "preserveAspectRatio": "none" + }); + return { + span: buildCommon.makeSvgSpan([], [svgNode], options), + minWidth: 0, + height: _height + }; + } else { + var spans = []; + var data = katexImagesData[label]; + var paths = data[0], + _minWidth = data[1], + _viewBoxHeight = data[2]; + + var _height2 = _viewBoxHeight / 1000; + + var numSvgChildren = paths.length; + var widthClasses; + var aligns; + + if (numSvgChildren === 1) { + // $FlowFixMe: All these cases must be of the 4-tuple type. + var align1 = data[3]; + widthClasses = ["hide-tail"]; + aligns = [align1]; + } else if (numSvgChildren === 2) { + widthClasses = ["halfarrow-left", "halfarrow-right"]; + aligns = ["xMinYMin", "xMaxYMin"]; + } else if (numSvgChildren === 3) { + widthClasses = ["brace-left", "brace-center", "brace-right"]; + aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"]; + } else { + throw new Error("Correct katexImagesData or update code here to support\n " + numSvgChildren + " children."); + } + + for (var i = 0; i < numSvgChildren; i++) { + var _path = new domTree_PathNode(paths[i]); + + var _svgNode = new SvgNode([_path], { + "width": "400em", + "height": _height2 + "em", + "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight, + "preserveAspectRatio": aligns[i] + " slice" + }); + + var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options); + + if (numSvgChildren === 1) { + return { + span: _span, + minWidth: _minWidth, + height: _height2 + }; + } else { + _span.style.height = _height2 + "em"; + spans.push(_span); + } + } + + return { + span: buildCommon.makeSpan(["stretchy"], spans, options), + minWidth: _minWidth, + height: _height2 + }; + } + } // buildSvgSpan_() + + + var _buildSvgSpan_ = buildSvgSpan_(), + span = _buildSvgSpan_.span, + minWidth = _buildSvgSpan_.minWidth, + height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0. + // Any adjustments relative to the baseline must be done in buildHTML. + + + span.height = height; + span.style.height = height + "em"; + + if (minWidth > 0) { + span.style.minWidth = minWidth + "em"; + } + + return span; +}; + +var stretchy_encloseSpan = function encloseSpan(inner, label, pad, options) { + // Return an image span for \cancel, \bcancel, \xcancel, or \fbox + var img; + var totalHeight = inner.height + inner.depth + 2 * pad; + + if (/fbox|color/.test(label)) { + img = buildCommon.makeSpan(["stretchy", label], [], options); + + if (label === "fbox") { + var color = options.color && options.getColor(); + + if (color) { + img.style.borderColor = color; + } + } + } else { + // \cancel, \bcancel, or \xcancel + // Since \cancel's SVG is inline and it omits the viewBox attribute, + // its stroke-width will not vary with span area. + var lines = []; + + if (/^[bx]cancel$/.test(label)) { + lines.push(new LineNode({ + "x1": "0", + "y1": "0", + "x2": "100%", + "y2": "100%", + "stroke-width": "0.046em" + })); + } + + if (/^x?cancel$/.test(label)) { + lines.push(new LineNode({ + "x1": "0", + "y1": "100%", + "x2": "100%", + "y2": "0", + "stroke-width": "0.046em" + })); + } + + var svgNode = new SvgNode(lines, { + "width": "100%", + "height": totalHeight + "em" + }); + img = buildCommon.makeSvgSpan([], [svgNode], options); + } + + img.height = totalHeight; + img.style.height = totalHeight + "em"; + return img; +}; + +/* harmony default export */ var stretchy = ({ + encloseSpan: stretchy_encloseSpan, + mathMLnode: stretchy_mathMLnode, + svgSpan: stretchy_svgSpan +}); +// CONCATENATED MODULE: ./src/functions/accent.js + + + + + + + + + +// NOTE: Unlike most `htmlBuilder`s, this one handles not only "accent", but +var accent_htmlBuilder = function htmlBuilder(grp, options) { + // Accents are handled in the TeXbook pg. 443, rule 12. + var base; + var group; + var supSub = checkNodeType(grp, "supsub"); + var supSubGroup; + + if (supSub) { + // If our base is a character box, and we have superscripts and + // subscripts, the supsub will defer to us. In particular, we want + // to attach the superscripts and subscripts to the inner body (so + // that the position of the superscripts and subscripts won't be + // affected by the height of the accent). We accomplish this by + // sticking the base of the accent into the base of the supsub, and + // rendering that, while keeping track of where the accent is. + // The real accent group is the base of the supsub group + group = assertNodeType(supSub.base, "accent"); // The character box is the base of the accent group + + base = group.base; // Stick the character box into the base of the supsub group + + supSub.base = base; // Rerender the supsub group with its new base, and store that + // result. + + supSubGroup = assertSpan(buildHTML_buildGroup(supSub, options)); // reset original base + + supSub.base = group; + } else { + group = assertNodeType(grp, "accent"); + base = group.base; + } // Build the base group + + + var body = buildHTML_buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character? + + var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line "If the + // nucleus is not a single character, let s = 0; otherwise set s to the + // kern amount for the nucleus followed by the \skewchar of its font." + // Note that our skew metrics are just the kern between each character + // and the skewchar. + + var skew = 0; + + if (mustShift) { + // If the base is a character box, then we want the skew of the + // innermost character. To do that, we find the innermost character: + var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it + + var baseGroup = buildHTML_buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol. + + skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we + // removed with getBaseElem might contain things like \color which + // we can't get rid of. + // TODO(emily): Find a better way to get the skew + } // calculate the amount of space between the body and the accent + + + var clearance = Math.min(body.height, options.fontMetrics().xHeight); // Build the accent + + var accentBody; + + if (!group.isStretchy) { + var accent; + var width; + + if (group.label === "\\vec") { + // Before version 0.9, \vec used the combining font glyph U+20D7. + // But browsers, especially Safari, are not consistent in how they + // render combining characters when not preceded by a character. + // So now we use an SVG. + // If Safari reforms, we should consider reverting to the glyph. + accent = buildCommon.staticSvg("vec", options); + width = buildCommon.svgData.vec[1]; + } else { + accent = buildCommon.makeSymbol(group.label, "Main-Regular", group.mode, options); // Remove the italic correction of the accent, because it only serves to + // shift the accent over to a place we don't want. + + accent.italic = 0; + width = accent.width; + } + + accentBody = buildCommon.makeSpan(["accent-body"], [accent]); // "Full" accents expand the width of the resulting symbol to be + // at least the width of the accent, and overlap directly onto the + // character without any vertical offset. + + var accentFull = group.label === "\\textcircled"; + + if (accentFull) { + accentBody.classes.push('accent-full'); + clearance = body.height; + } // Shift the accent over by the skew. + + + var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }` + // so that the accent doesn't contribute to the bounding box. + // We need to shift the character by its width (effectively half + // its width) to compensate. + + if (!accentFull) { + left -= width / 2; + } + + accentBody.style.left = left + "em"; // \textcircled uses the \bigcirc glyph, so it needs some + // vertical adjustment to match LaTeX. + + if (group.label === "\\textcircled") { + accentBody.style.top = ".2em"; + } + + accentBody = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: body + }, { + type: "kern", + size: -clearance + }, { + type: "elem", + elem: accentBody + }] + }, options); + } else { + accentBody = stretchy.svgSpan(group, options); + accentBody = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: body + }, { + type: "elem", + elem: accentBody, + wrapperClasses: ["svg-align"], + wrapperStyle: skew > 0 ? { + width: "calc(100% - " + 2 * skew + "em)", + marginLeft: 2 * skew + "em" + } : undefined + }] + }, options); + } + + var accentWrap = buildCommon.makeSpan(["mord", "accent"], [accentBody], options); + + if (supSubGroup) { + // Here, we replace the "base" child of the supsub with our newly + // generated accent. + supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the + // accent, we manually recalculate height. + + supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not. + + supSubGroup.classes[0] = "mord"; + return supSubGroup; + } else { + return accentWrap; + } +}; + +var accent_mathmlBuilder = function mathmlBuilder(group, options) { + var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode("mo", [buildMathML_makeText(group.label, group.mode)]); + var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.base, options), accentNode]); + node.setAttribute("accent", "true"); + return node; +}; + +var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) { + return "\\" + accent; +}).join("|")); // Accents + +defineFunction({ + type: "accent", + names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + var base = args[0]; + var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName); + var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde" || context.funcName === "\\widecheck"; + return { + type: "accent", + mode: context.parser.mode, + label: context.funcName, + isStretchy: isStretchy, + isShifty: isShifty, + base: base + }; + }, + htmlBuilder: accent_htmlBuilder, + mathmlBuilder: accent_mathmlBuilder +}); // Text-mode accents + +defineFunction({ + type: "accent", + names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"], + props: { + numArgs: 1, + allowedInText: true, + allowedInMath: false + }, + handler: function handler(context, args) { + var base = args[0]; + return { + type: "accent", + mode: context.parser.mode, + label: context.funcName, + isStretchy: false, + isShifty: true, + base: base + }; + }, + htmlBuilder: accent_htmlBuilder, + mathmlBuilder: accent_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/functions/accentunder.js +// Horizontal overlap functions + + + + + + +defineFunction({ + type: "accentUnder", + names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var base = args[0]; + return { + type: "accentUnder", + mode: parser.mode, + label: funcName, + base: base + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Treat under accents much like underlines. + var innerGroup = buildHTML_buildGroup(group.base, options); + var accentBody = stretchy.svgSpan(group, options); + var kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns + + var vlist = buildCommon.makeVList({ + positionType: "bottom", + positionData: accentBody.height + kern, + children: [{ + type: "elem", + elem: accentBody, + wrapperClasses: ["svg-align"] + }, { + type: "kern", + size: kern + }, { + type: "elem", + elem: innerGroup + }] + }, options); + return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var accentNode = stretchy.mathMLnode(group.label); + var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.base, options), accentNode]); + node.setAttribute("accentunder", "true"); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/arrow.js + + + + + + + +// Helper function +var arrow_paddedNode = function paddedNode(group) { + var node = new mathMLTree.MathNode("mpadded", group ? [group] : []); + node.setAttribute("width", "+0.6em"); + node.setAttribute("lspace", "0.3em"); + return node; +}; // Stretchy arrows with an optional argument + + +defineFunction({ + type: "xArrow", + names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", // The next 3 functions are here to support the mhchem extension. + // Direct use of these functions is discouraged and may break someday. + "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"], + props: { + numArgs: 1, + numOptionalArgs: 1 + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser, + funcName = _ref.funcName; + return { + type: "xArrow", + mode: parser.mode, + label: funcName, + body: args[0], + below: optArgs[0] + }; + }, + // Flow is unable to correctly infer the type of `group`, even though it's + // unamibiguously determined from the passed-in `type` above. + htmlBuilder: function htmlBuilder(group, options) { + var style = options.style; // Build the argument groups in the appropriate style. + // Ref: amsmath.dtx: \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}% + // Some groups can return document fragments. Handle those by wrapping + // them in a span. + + var newOptions = options.havingStyle(style.sup()); + var upperGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, newOptions, options), options); + upperGroup.classes.push("x-arrow-pad"); + var lowerGroup; + + if (group.below) { + // Build the lower group + newOptions = options.havingStyle(style.sub()); + lowerGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.below, newOptions, options), options); + lowerGroup.classes.push("x-arrow-pad"); + } + + var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0. + // The point we want on the math axis is at 0.5 * arrowBody.height. + + var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi + + var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu + + if (upperGroup.depth > 0.25 || group.label === "\\xleftequilibrium") { + upperShift -= upperGroup.depth; // shift up if depth encroaches + } // Generate the vlist + + + var vlist; + + if (lowerGroup) { + var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111; + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: upperGroup, + shift: upperShift + }, { + type: "elem", + elem: arrowBody, + shift: arrowShift + }, { + type: "elem", + elem: lowerGroup, + shift: lowerShift + }] + }, options); + } else { + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: upperGroup, + shift: upperShift + }, { + type: "elem", + elem: arrowBody, + shift: arrowShift + }] + }, options); + } // $FlowFixMe: Replace this with passing "svg-align" into makeVList. + + + vlist.children[0].children[0].children[1].classes.push("svg-align"); + return buildCommon.makeSpan(["mrel", "x-arrow"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var arrowNode = stretchy.mathMLnode(group.label); + var node; + + if (group.body) { + var upperNode = arrow_paddedNode(buildMathML_buildGroup(group.body, options)); + + if (group.below) { + var lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options)); + node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); + } else { + node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); + } + } else if (group.below) { + var _lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options)); + + node = new mathMLTree.MathNode("munder", [arrowNode, _lowerNode]); + } else { + // This should never happen. + // Parser.js throws an error if there is no argument. + node = arrow_paddedNode(); + node = new mathMLTree.MathNode("mover", [arrowNode, node]); + } + + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/char.js + + + // \@char is an internal function that takes a grouped decimal argument like +// {123} and converts into symbol with code 123. It is used by the *macro* +// \char defined in macros.js. + +defineFunction({ + type: "textord", + names: ["\\@char"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var arg = assertNodeType(args[0], "ordgroup"); + var group = arg.body; + var number = ""; + + for (var i = 0; i < group.length; i++) { + var node = assertNodeType(group[i], "textord"); + number += node.text; + } + + var code = parseInt(number); + + if (isNaN(code)) { + throw new src_ParseError("\\@char has non-numeric argument " + number); + } + + return { + type: "textord", + mode: parser.mode, + text: String.fromCharCode(code) + }; + } +}); +// CONCATENATED MODULE: ./src/functions/color.js + + + + + + + +var color_htmlBuilder = function htmlBuilder(group, options) { + var elements = buildHTML_buildExpression(group.body, options.withColor(group.color), false); // \color isn't supposed to affect the type of the elements it contains. + // To accomplish this, we wrap the results in a fragment, so the inner + // elements will be able to directly interact with their neighbors. For + // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3` + + return buildCommon.makeFragment(elements); +}; + +var color_mathmlBuilder = function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(group.body, options.withColor(group.color)); + var node = new mathMLTree.MathNode("mstyle", inner); + node.setAttribute("mathcolor", group.color); + return node; +}; + +defineFunction({ + type: "color", + names: ["\\textcolor"], + props: { + numArgs: 2, + allowedInText: true, + greediness: 3, + argTypes: ["color", "original"] + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var color = assertNodeType(args[0], "color-token").color; + var body = args[1]; + return { + type: "color", + mode: parser.mode, + color: color, + body: defineFunction_ordargument(body) + }; + }, + htmlBuilder: color_htmlBuilder, + mathmlBuilder: color_mathmlBuilder +}); +defineFunction({ + type: "color", + names: ["\\color"], + props: { + numArgs: 1, + allowedInText: true, + greediness: 3, + argTypes: ["color"] + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser, + breakOnTokenText = _ref2.breakOnTokenText; + var color = assertNodeType(args[0], "color-token").color; // If we see a styling function, parse out the implicit body + + var body = parser.parseExpression(true, breakOnTokenText); + return { + type: "color", + mode: parser.mode, + color: color, + body: body + }; + }, + htmlBuilder: color_htmlBuilder, + mathmlBuilder: color_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/functions/cr.js +// Row breaks within tabular environments, and line breaks at top level + + + + + + // \\ is a macro mapping to either \cr or \newline. Because they have the +// same signature, we implement them as one megafunction, with newRow +// indicating whether we're in the \cr case, and newLine indicating whether +// to break the line in the \newline case. + +defineFunction({ + type: "cr", + names: ["\\cr", "\\newline"], + props: { + numArgs: 0, + numOptionalArgs: 1, + argTypes: ["size"], + allowedInText: true + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser, + funcName = _ref.funcName; + var size = optArgs[0]; + var newRow = funcName === "\\cr"; + var newLine = false; + + if (!newRow) { + if (parser.settings.displayMode && parser.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline " + "does nothing in display mode")) { + newLine = false; + } else { + newLine = true; + } + } + + return { + type: "cr", + mode: parser.mode, + newLine: newLine, + newRow: newRow, + size: size && assertNodeType(size, "size").value + }; + }, + // The following builders are called only at the top level, + // not within tabular/array environments. + htmlBuilder: function htmlBuilder(group, options) { + if (group.newRow) { + throw new src_ParseError("\\cr valid only within a tabular/array environment"); + } + + var span = buildCommon.makeSpan(["mspace"], [], options); + + if (group.newLine) { + span.classes.push("newline"); + + if (group.size) { + span.style.marginTop = units_calculateSize(group.size, options) + "em"; + } + } + + return span; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mspace"); + + if (group.newLine) { + node.setAttribute("linebreak", "newline"); + + if (group.size) { + node.setAttribute("height", units_calculateSize(group.size, options) + "em"); + } + } + + return node; + } +}); +// CONCATENATED MODULE: ./src/delimiter.js /** * This file deals with creating delimiters of various sizes. The TeXbook * discusses these routines on page 441-442, in the "Another subroutine sets box @@ -5848,406 +8105,419 @@ Options.colorMap = { - - /** * Get the metrics for a given symbol and font, after transformation (i.e. * after following replacement from symbols.js) */ -var getMetrics = function getMetrics(symbol, font, mode) { - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */].math[symbol] && __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */].math[symbol].replace) { - return __WEBPACK_IMPORTED_MODULE_4__fontMetrics__["a" /* default */].getCharacterMetrics(__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */].math[symbol].replace, font, mode); - } else { - return __WEBPACK_IMPORTED_MODULE_4__fontMetrics__["a" /* default */].getCharacterMetrics(symbol, font, mode); - } -}; +var delimiter_getMetrics = function getMetrics(symbol, font, mode) { + var replace = src_symbols.math[symbol] && src_symbols.math[symbol].replace; + var metrics = getCharacterMetrics(replace || symbol, font, mode); + if (!metrics) { + throw new Error("Unsupported symbol " + symbol + " and font size " + font + "."); + } + + return metrics; +}; /** * Puts a delimiter span in a given style, and adds appropriate height, depth, * and maxFontSizes. */ -var styleWrap = function styleWrap(delim, toStyle, options, classes) { - var newOptions = options.havingBaseStyle(toStyle); - var span = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan((classes || []).concat(newOptions.sizingClasses(options)), [delim], options); - span.delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; - span.height *= span.delimSizeMultiplier; - span.depth *= span.delimSizeMultiplier; - span.maxFontSize = newOptions.sizeMultiplier; - - return span; +var delimiter_styleWrap = function styleWrap(delim, toStyle, options, classes) { + var newOptions = options.havingBaseStyle(toStyle); + var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options); + var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; + span.height *= delimSizeMultiplier; + span.depth *= delimSizeMultiplier; + span.maxFontSize = newOptions.sizeMultiplier; + return span; }; var centerSpan = function centerSpan(span, options, style) { - var newOptions = options.havingBaseStyle(style); - var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight; - - span.classes.push("delimcenter"); - span.style.top = shift + "em"; - span.height -= shift; - span.depth += shift; + var newOptions = options.havingBaseStyle(style); + var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight; + span.classes.push("delimcenter"); + span.style.top = shift + "em"; + span.height -= shift; + span.depth += shift; }; - /** * Makes a small delimiter. This is a delimiter that comes in the Main-Regular * font, but is restyled to either be in textstyle, scriptstyle, or * scriptscriptstyle. */ -var makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) { - var text = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSymbol(delim, "Main-Regular", mode, options); - var span = styleWrap(text, style, options, classes); - if (center) { - centerSpan(span, options, style); - } - return span; -}; + +var delimiter_makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) { + var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options); + var span = delimiter_styleWrap(text, style, options, classes); + + if (center) { + centerSpan(span, options, style); + } + + return span; +}; /** * Builds a symbol in the given font size (note size is an integer) */ -var mathrmSize = function mathrmSize(value, size, mode, options) { - return __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSymbol(value, "Size" + size + "-Regular", mode, options); -}; + +var delimiter_mathrmSize = function mathrmSize(value, size, mode, options) { + return buildCommon.makeSymbol(value, "Size" + size + "-Regular", mode, options); +}; /** * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2, * Size3, or Size4 fonts. It is always rendered in textstyle. */ -var makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) { - var inner = mathrmSize(delim, size, mode, options); - var span = styleWrap(__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["delimsizing", "size" + size], [inner], options), __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT, options, classes); - if (center) { - centerSpan(span, options, __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT); - } - return span; -}; + +var delimiter_makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) { + var inner = delimiter_mathrmSize(delim, size, mode, options); + var span = delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "size" + size], [inner], options), src_Style.TEXT, options, classes); + + if (center) { + centerSpan(span, options, src_Style.TEXT); + } + + return span; +}; /** * Make an inner span with the given offset and in the given font. This is used * in `makeStackedDelim` to make the stacking pieces for the delimiter. */ -var makeInner = function makeInner(symbol, font, mode) { - var sizeClass = void 0; - // Apply the correct CSS class to choose the right font. - if (font === "Size1-Regular") { - sizeClass = "delim-size1"; - } else if (font === "Size4-Regular") { - sizeClass = "delim-size4"; + + +var delimiter_makeInner = function makeInner(symbol, font, mode) { + var sizeClass; // Apply the correct CSS class to choose the right font. + + if (font === "Size1-Regular") { + sizeClass = "delim-size1"; + } else + /* if (font === "Size4-Regular") */ + { + sizeClass = "delim-size4"; } - var inner = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["delimsizinginner", sizeClass], [__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan([], [__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSymbol(symbol, font, mode)])]); + var inner = buildCommon.makeSpan(["delimsizinginner", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element + // in the appropriate tag that VList uses. - // Since this will be passed into `makeVList` in the end, wrap the element - // in the appropriate tag that VList uses. - return { type: "elem", elem: inner }; + return { + type: "elem", + elem: inner + }; }; - /** * Make a stacked delimiter out of a given delimiter, with the total height at * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook. */ -var makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) { - // There are four parts, the top, an optional middle, a repeated part, and a - // bottom. - var top = void 0; - var middle = void 0; - var repeat = void 0; - var bottom = void 0; - top = repeat = bottom = delim; - middle = null; - // Also keep track of what font the delimiters are in - var font = "Size1-Regular"; - // We set the parts and font based on the symbol. Note that we use - // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the - // repeats of the arrows - if (delim === "\\uparrow") { - repeat = bottom = "\u23D0"; - } else if (delim === "\\Uparrow") { - repeat = bottom = "\u2016"; - } else if (delim === "\\downarrow") { - top = repeat = "\u23D0"; - } else if (delim === "\\Downarrow") { - top = repeat = "\u2016"; - } else if (delim === "\\updownarrow") { - top = "\\uparrow"; - repeat = "\u23D0"; - bottom = "\\downarrow"; - } else if (delim === "\\Updownarrow") { - top = "\\Uparrow"; - repeat = "\u2016"; - bottom = "\\Downarrow"; - } else if (delim === "[" || delim === "\\lbrack") { - top = "\u23A1"; - repeat = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "]" || delim === "\\rbrack") { - top = "\u23A4"; - repeat = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\lfloor") { - repeat = top = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "\\lceil") { - top = "\u23A1"; - repeat = bottom = "\u23A2"; - font = "Size4-Regular"; - } else if (delim === "\\rfloor") { - repeat = top = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\rceil") { - top = "\u23A4"; - repeat = bottom = "\u23A5"; - font = "Size4-Regular"; - } else if (delim === "(") { - top = "\u239B"; - repeat = "\u239C"; - bottom = "\u239D"; - font = "Size4-Regular"; - } else if (delim === ")") { - top = "\u239E"; - repeat = "\u239F"; - bottom = "\u23A0"; - font = "Size4-Regular"; - } else if (delim === "\\{" || delim === "\\lbrace") { - top = "\u23A7"; - middle = "\u23A8"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\}" || delim === "\\rbrace") { - top = "\u23AB"; - middle = "\u23AC"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lgroup") { - top = "\u23A7"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rgroup") { - top = "\u23AB"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lmoustache") { - top = "\u23A7"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rmoustache") { - top = "\u23AB"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; + +var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) { + // There are four parts, the top, an optional middle, a repeated part, and a + // bottom. + var top; + var middle; + var repeat; + var bottom; + top = repeat = bottom = delim; + middle = null; // Also keep track of what font the delimiters are in + + var font = "Size1-Regular"; // We set the parts and font based on the symbol. Note that we use + // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the + // repeats of the arrows + + if (delim === "\\uparrow") { + repeat = bottom = "\u23D0"; + } else if (delim === "\\Uparrow") { + repeat = bottom = "\u2016"; + } else if (delim === "\\downarrow") { + top = repeat = "\u23D0"; + } else if (delim === "\\Downarrow") { + top = repeat = "\u2016"; + } else if (delim === "\\updownarrow") { + top = "\\uparrow"; + repeat = "\u23D0"; + bottom = "\\downarrow"; + } else if (delim === "\\Updownarrow") { + top = "\\Uparrow"; + repeat = "\u2016"; + bottom = "\\Downarrow"; + } else if (delim === "[" || delim === "\\lbrack") { + top = "\u23A1"; + repeat = "\u23A2"; + bottom = "\u23A3"; + font = "Size4-Regular"; + } else if (delim === "]" || delim === "\\rbrack") { + top = "\u23A4"; + repeat = "\u23A5"; + bottom = "\u23A6"; + font = "Size4-Regular"; + } else if (delim === "\\lfloor" || delim === "\u230A") { + repeat = top = "\u23A2"; + bottom = "\u23A3"; + font = "Size4-Regular"; + } else if (delim === "\\lceil" || delim === "\u2308") { + top = "\u23A1"; + repeat = bottom = "\u23A2"; + font = "Size4-Regular"; + } else if (delim === "\\rfloor" || delim === "\u230B") { + repeat = top = "\u23A5"; + bottom = "\u23A6"; + font = "Size4-Regular"; + } else if (delim === "\\rceil" || delim === "\u2309") { + top = "\u23A4"; + repeat = bottom = "\u23A5"; + font = "Size4-Regular"; + } else if (delim === "(" || delim === "\\lparen") { + top = "\u239B"; + repeat = "\u239C"; + bottom = "\u239D"; + font = "Size4-Regular"; + } else if (delim === ")" || delim === "\\rparen") { + top = "\u239E"; + repeat = "\u239F"; + bottom = "\u23A0"; + font = "Size4-Regular"; + } else if (delim === "\\{" || delim === "\\lbrace") { + top = "\u23A7"; + middle = "\u23A8"; + bottom = "\u23A9"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\}" || delim === "\\rbrace") { + top = "\u23AB"; + middle = "\u23AC"; + bottom = "\u23AD"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\lgroup" || delim === "\u27EE") { + top = "\u23A7"; + bottom = "\u23A9"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\rgroup" || delim === "\u27EF") { + top = "\u23AB"; + bottom = "\u23AD"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\lmoustache" || delim === "\u23B0") { + top = "\u23A7"; + bottom = "\u23AD"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\rmoustache" || delim === "\u23B1") { + top = "\u23AB"; + bottom = "\u23A9"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } // Get the metrics of the four sections + + + var topMetrics = delimiter_getMetrics(top, font, mode); + var topHeightTotal = topMetrics.height + topMetrics.depth; + var repeatMetrics = delimiter_getMetrics(repeat, font, mode); + var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth; + var bottomMetrics = delimiter_getMetrics(bottom, font, mode); + var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth; + var middleHeightTotal = 0; + var middleFactor = 1; + + if (middle !== null) { + var middleMetrics = delimiter_getMetrics(middle, font, mode); + middleHeightTotal = middleMetrics.height + middleMetrics.depth; + middleFactor = 2; // repeat symmetrically above and below middle + } // Calcuate the minimal height that the delimiter can have. + // It is at least the size of the top, bottom, and optional middle combined. + + + var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need + + var repeatCount = Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal)); // Compute the total height of the delimiter including all the symbols + + var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note + // that in this context, "center" means that the delimiter should be + // centered around the axis in the current style, while normally it is + // centered around the axis in textstyle. + + var axisHeight = options.fontMetrics().axisHeight; + + if (center) { + axisHeight *= options.sizeMultiplier; + } // Calculate the depth + + + var depth = realHeightTotal / 2 - axisHeight; // Now, we start building the pieces that will go into the vlist + // Keep a list of the inner pieces + + var inners = []; // Add the bottom symbol + + inners.push(delimiter_makeInner(bottom, font, mode)); + + if (middle === null) { + // Add that many symbols + for (var i = 0; i < repeatCount; i++) { + inners.push(delimiter_makeInner(repeat, font, mode)); + } + } else { + // When there is a middle bit, we need the middle part and two repeated + // sections + for (var _i = 0; _i < repeatCount; _i++) { + inners.push(delimiter_makeInner(repeat, font, mode)); } - // Get the metrics of the four sections - var topMetrics = getMetrics(top, font, mode); - var topHeightTotal = topMetrics.height + topMetrics.depth; - var repeatMetrics = getMetrics(repeat, font, mode); - var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth; - var bottomMetrics = getMetrics(bottom, font, mode); - var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth; - var middleHeightTotal = 0; - var middleFactor = 1; - if (middle !== null) { - var middleMetrics = getMetrics(middle, font, mode); - middleHeightTotal = middleMetrics.height + middleMetrics.depth; - middleFactor = 2; // repeat symmetrically above and below middle + inners.push(delimiter_makeInner(middle, font, mode)); + + for (var _i2 = 0; _i2 < repeatCount; _i2++) { + inners.push(delimiter_makeInner(repeat, font, mode)); } + } // Add the top symbol - // Calcuate the minimal height that the delimiter can have. - // It is at least the size of the top, bottom, and optional middle combined. - var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; - // Compute the number of copies of the repeat symbol we will need - var repeatCount = Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal)); + inners.push(delimiter_makeInner(top, font, mode)); // Finally, build the vlist - // Compute the total height of the delimiter including all the symbols - var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; - - // The center of the delimiter is placed at the center of the axis. Note - // that in this context, "center" means that the delimiter should be - // centered around the axis in the current style, while normally it is - // centered around the axis in textstyle. - var axisHeight = options.fontMetrics().axisHeight; - if (center) { - axisHeight *= options.sizeMultiplier; - } - // Calculate the depth - var depth = realHeightTotal / 2 - axisHeight; - - // Now, we start building the pieces that will go into the vlist - - // Keep a list of the inner pieces - var inners = []; - - // Add the bottom symbol - inners.push(makeInner(bottom, font, mode)); - - if (middle === null) { - // Add that many symbols - for (var i = 0; i < repeatCount; i++) { - inners.push(makeInner(repeat, font, mode)); - } - } else { - // When there is a middle bit, we need the middle part and two repeated - // sections - for (var _i = 0; _i < repeatCount; _i++) { - inners.push(makeInner(repeat, font, mode)); - } - inners.push(makeInner(middle, font, mode)); - for (var _i2 = 0; _i2 < repeatCount; _i2++) { - inners.push(makeInner(repeat, font, mode)); - } - } - - // Add the top symbol - inners.push(makeInner(top, font, mode)); - - // Finally, build the vlist - var newOptions = options.havingBaseStyle(__WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT); - var inner = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: depth, - children: inners - }, newOptions); - - return styleWrap(__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["delimsizing", "mult"], [inner], newOptions), __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT, options, classes); -}; - -// All surds have 0.08em padding above the viniculum inside the SVG. + var newOptions = options.havingBaseStyle(src_Style.TEXT); + var inner = buildCommon.makeVList({ + positionType: "bottom", + positionData: depth, + children: inners + }, newOptions); + return delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "mult"], [inner], newOptions), src_Style.TEXT, options, classes); +}; // All surds have 0.08em padding above the viniculum inside the SVG. // That keeps browser span height rounding error from pinching the line. + + var vbPad = 80; // padding above the surd, measured inside the viewBox. + var emPad = 0.08; // padding, in ems, measured in the document. -var sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, options) { - var alternate = void 0; - if (sqrtName === "sqrtTall") { - // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular - // One path edge has a variable length. It runs from the viniculumn - // to a point near (14 units) the bottom of the surd. The viniculum - // is 40 units thick. So the length of the line in question is: - var vertSegment = viewBoxHeight - 54 - vbPad; - alternate = "M702 " + vbPad + "H400000v40H742v" + vertSegment + "l-4 4-4 4c-.667.7\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 " + vbPad + "H400000v40H742z"; - } - var pathNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].pathNode(sqrtName, alternate); +var delimiter_sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, options) { + var alternate; - var svg = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].svgNode([pathNode], { - // Note: 1000:1 ratio of viewBox to document em width. - "width": "400em", - "height": height + "em", - "viewBox": "0 0 400000 " + viewBoxHeight, - "preserveAspectRatio": "xMinYMin slice" - }); + if (sqrtName === "sqrtTall") { + // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular + // One path edge has a variable length. It runs from the viniculumn + // to a point near (14 units) the bottom of the surd. The viniculum + // is 40 units thick. So the length of the line in question is: + var vertSegment = viewBoxHeight - 54 - vbPad; + alternate = "M702 " + vbPad + "H400000v40H742v" + vertSegment + "l-4 4-4 4c-.667.7\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 " + vbPad + "H400000v40H742z"; + } - return __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["hide-tail"], [svg], options); + var pathNode = new domTree_PathNode(sqrtName, alternate); + var svg = new SvgNode([pathNode], { + // Note: 1000:1 ratio of viewBox to document em width. + "width": "400em", + "height": height + "em", + "viewBox": "0 0 400000 " + viewBoxHeight, + "preserveAspectRatio": "xMinYMin slice" + }); + return buildCommon.makeSvgSpan(["hide-tail"], [svg], options); }; - /** * Make a sqrt image of the given height, */ + + var makeSqrtImage = function makeSqrtImage(height, options) { - var delim = traverseSequence("\\surd", height, stackLargeDelimiterSequence, options); + // Define a newOptions that removes the effect of size changes such as \Huge. + // We don't pick different a height surd for \Huge. For it, we scale up. + var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds. - // Create a span containing an SVG image of a sqrt symbol. - var span = void 0; - var sizeMultiplier = options.sizeMultiplier; // default - var spanHeight = 0; - var texHeight = 0; - var viewBoxHeight = 0; + var delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions); + var sizeMultiplier = newOptions.sizeMultiplier; // default + // Create a span containing an SVG image of a sqrt symbol. - // We create viewBoxes with 80 units of "padding" above each surd. - // Then browser rounding error on the parent span height will not - // encroach on the ink of the viniculum. But that padding is not - // included in the TeX-like `height` used for calculation of - // vertical alignment. So texHeight = span.height < span.style.height. + var span; + var spanHeight = 0; + var texHeight = 0; + var viewBoxHeight = 0; + var advanceWidth; // We create viewBoxes with 80 units of "padding" above each surd. + // Then browser rounding error on the parent span height will not + // encroach on the ink of the viniculum. But that padding is not + // included in the TeX-like `height` used for calculation of + // vertical alignment. So texHeight = span.height < span.style.height. - if (delim.type === "small") { - // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. - viewBoxHeight = 1000 + vbPad; // 1000 unit glyph height. - var newOptions = options.havingBaseStyle(delim.style); - sizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; - spanHeight = (1.0 + emPad) * sizeMultiplier; - texHeight = 1.00 * sizeMultiplier; - span = sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, options); - span.style.minWidth = "0.853em"; - span.advanceWidth = 0.833 * sizeMultiplier; // from the font. - } else if (delim.type === "large") { - // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. - viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size]; - texHeight = sizeToMaxHeight[delim.size] / sizeMultiplier; - spanHeight = (sizeToMaxHeight[delim.size] + emPad) / sizeMultiplier; - span = sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, options); - span.style.minWidth = "1.02em"; - span.advanceWidth = 1.0 / sizeMultiplier; // from the font - } else { - // Tall sqrt. In TeX, this would be stacked using multiple glyphs. - // We'll use a single SVG to accomplish the same thing. - spanHeight = height / sizeMultiplier + emPad; - texHeight = height / sizeMultiplier; - viewBoxHeight = Math.floor(1000 * height) + vbPad; - span = sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, options); - span.style.minWidth = "0.742em"; - span.advanceWidth = 1.056 / sizeMultiplier; + if (delim.type === "small") { + // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. + viewBoxHeight = 1000 + vbPad; // 1000 unit glyph height. + + if (height < 1.0) { + sizeMultiplier = 1.0; // mimic a \textfont radical + } else if (height < 1.4) { + sizeMultiplier = 0.7; // mimic a \scriptfont radical } - span.height = texHeight; - span.style.height = spanHeight + "em"; + spanHeight = (1.0 + emPad) / sizeMultiplier; + texHeight = 1.00 / sizeMultiplier; + span = delimiter_sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, options); + span.style.minWidth = "0.853em"; + advanceWidth = 0.833 / sizeMultiplier; // from the font. + } else if (delim.type === "large") { + // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. + viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size]; + texHeight = sizeToMaxHeight[delim.size] / sizeMultiplier; + spanHeight = (sizeToMaxHeight[delim.size] + emPad) / sizeMultiplier; + span = delimiter_sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, options); + span.style.minWidth = "1.02em"; + advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font. + } else { + // Tall sqrt. In TeX, this would be stacked using multiple glyphs. + // We'll use a single SVG to accomplish the same thing. + spanHeight = height + emPad; + texHeight = height; + viewBoxHeight = Math.floor(1000 * height) + vbPad; + span = delimiter_sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, options); + span.style.minWidth = "0.742em"; + advanceWidth = 1.056; + } - return { - span: span, - // Calculate the actual line width. - // This actually should depend on the chosen font -- e.g. \boldmath - // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and - // have thicker rules. - ruleWidth: options.fontMetrics().sqrtRuleThickness * sizeMultiplier - }; -}; - -// There are three kinds of delimiters, delimiters that stack when they become + span.height = texHeight; + span.style.height = spanHeight + "em"; + return { + span: span, + advanceWidth: advanceWidth, + // Calculate the actual line width. + // This actually should depend on the chosen font -- e.g. \boldmath + // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and + // have thicker rules. + ruleWidth: options.fontMetrics().sqrtRuleThickness * sizeMultiplier + }; +}; // There are three kinds of delimiters, delimiters that stack when they become // too large -var stackLargeDelimiters = ["(", ")", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\\lceil", "\\rceil", "\\surd"]; -// delimiters that always stack -var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache"]; -// and delimiters that never stack -var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; +var stackLargeDelimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"]; // delimiters that always stack -// Metrics of the different sizes. Found by looking at TeX's output of +var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1"]; // and delimiters that never stack + +var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; // Metrics of the different sizes. Found by looking at TeX's output of // $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ // Used to create stacked delimiters of appropriate sizes in makeSizedDelim. -var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; +var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; /** * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4. */ -var makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) { - // < and > turn into \langle and \rangle in delimiters - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; - } - // Sized delimiters are never centered. - if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackLargeDelimiters, delim) || __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackNeverDelimiters, delim)) { - return makeLargeDelim(delim, size, false, options, mode, classes); - } else if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackAlwaysDelimiters, delim)) { - return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes); - } else { - throw new __WEBPACK_IMPORTED_MODULE_0__ParseError__["a" /* default */]("Illegal delimiter: '" + delim + "'"); - } +var delimiter_makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) { + // < and > turn into \langle and \rangle in delimiters + if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { + delim = "\\langle"; + } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { + delim = "\\rangle"; + } // Sized delimiters are never centered. + + + if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) { + return delimiter_makeLargeDelim(delim, size, false, options, mode, classes); + } else if (utils.contains(stackAlwaysDelimiters, delim)) { + return delimiter_makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes); + } else { + throw new src_ParseError("Illegal delimiter: '" + delim + "'"); + } }; - /** * There are three different sequences of delimiter sizes that the delimiters * follow depending on the kind of delimiter. This is used when creating custom @@ -6260,2710 +8530,772 @@ var makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes * them explicitly here. */ + // Delimiters that never stack try small delimiters and large delimiters only -var stackNeverDelimiterSequence = [{ type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPTSCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT }, { type: "large", size: 1 }, { type: "large", size: 2 }, { type: "large", size: 3 }, { type: "large", size: 4 }]; +var stackNeverDelimiterSequence = [{ + type: "small", + style: src_Style.SCRIPTSCRIPT +}, { + type: "small", + style: src_Style.SCRIPT +}, { + type: "small", + style: src_Style.TEXT +}, { + type: "large", + size: 1 +}, { + type: "large", + size: 2 +}, { + type: "large", + size: 3 +}, { + type: "large", + size: 4 +}]; // Delimiters that always stack try the small delimiters first, then stack -// Delimiters that always stack try the small delimiters first, then stack -var stackAlwaysDelimiterSequence = [{ type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPTSCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT }, { type: "stack" }]; - -// Delimiters that stack when large try the small and then large delimiters, and +var stackAlwaysDelimiterSequence = [{ + type: "small", + style: src_Style.SCRIPTSCRIPT +}, { + type: "small", + style: src_Style.SCRIPT +}, { + type: "small", + style: src_Style.TEXT +}, { + type: "stack" +}]; // Delimiters that stack when large try the small and then large delimiters, and // stack afterwards -var stackLargeDelimiterSequence = [{ type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPTSCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT }, { type: "large", size: 1 }, { type: "large", size: 2 }, { type: "large", size: 3 }, { type: "large", size: 4 }, { type: "stack" }]; +var stackLargeDelimiterSequence = [{ + type: "small", + style: src_Style.SCRIPTSCRIPT +}, { + type: "small", + style: src_Style.SCRIPT +}, { + type: "small", + style: src_Style.TEXT +}, { + type: "large", + size: 1 +}, { + type: "large", + size: 2 +}, { + type: "large", + size: 3 +}, { + type: "large", + size: 4 +}, { + type: "stack" +}]; /** * Get the font used in a delimiter based on what kind of delimiter it is. + * TODO(#963) Use more specific font family return type once that is introduced. */ -var delimTypeToFont = function delimTypeToFont(type) { - if (type.type === "small") { - return "Main-Regular"; - } else if (type.type === "large") { - return "Size" + type.size + "-Regular"; - } else if (type.type === "stack") { - return "Size4-Regular"; - } -}; +var delimTypeToFont = function delimTypeToFont(type) { + if (type.type === "small") { + return "Main-Regular"; + } else if (type.type === "large") { + return "Size" + type.size + "-Regular"; + } else if (type.type === "stack") { + return "Size4-Regular"; + } else { + throw new Error("Add support for delim type '" + type.type + "' here."); + } +}; /** * Traverse a sequence of types of delimiters to decide what kind of delimiter * should be used to create a delimiter of the given height+depth. */ + + var traverseSequence = function traverseSequence(delim, height, sequence, options) { - // Here, we choose the index we should start at in the sequences. In smaller - // sizes (which correspond to larger numbers in style.size) we start earlier - // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts - // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2 - var start = Math.min(2, 3 - options.style.size); - for (var i = start; i < sequence.length; i++) { - if (sequence[i].type === "stack") { - // This is always the last delimiter, so we just break the loop now. - break; - } + // Here, we choose the index we should start at in the sequences. In smaller + // sizes (which correspond to larger numbers in style.size) we start earlier + // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts + // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2 + var start = Math.min(2, 3 - options.style.size); - var metrics = getMetrics(delim, delimTypeToFont(sequence[i]), "math"); - var heightDepth = metrics.height + metrics.depth; - - // Small delimiters are scaled down versions of the same font, so we - // account for the style change size. - - if (sequence[i].type === "small") { - var newOptions = options.havingBaseStyle(sequence[i].style); - heightDepth *= newOptions.sizeMultiplier; - } - - // Check if the delimiter at this size works for the given height. - if (heightDepth > height) { - return sequence[i]; - } + for (var i = start; i < sequence.length; i++) { + if (sequence[i].type === "stack") { + // This is always the last delimiter, so we just break the loop now. + break; } - // If we reached the end of the sequence, return the last sequence element. - return sequence[sequence.length - 1]; -}; + var metrics = delimiter_getMetrics(delim, delimTypeToFont(sequence[i]), "math"); + var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we + // account for the style change size. + if (sequence[i].type === "small") { + var newOptions = options.havingBaseStyle(sequence[i].style); + heightDepth *= newOptions.sizeMultiplier; + } // Check if the delimiter at this size works for the given height. + + + if (heightDepth > height) { + return sequence[i]; + } + } // If we reached the end of the sequence, return the last sequence element. + + + return sequence[sequence.length - 1]; +}; /** * Make a delimiter of a given height+depth, with optional centering. Here, we * traverse the sequences, and create a delimiter that the sequence tells us to. */ -var makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) { - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; + + +var delimiter_makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) { + if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { + delim = "\\langle"; + } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { + delim = "\\rangle"; + } // Decide what sequence to use + + + var sequence; + + if (utils.contains(stackNeverDelimiters, delim)) { + sequence = stackNeverDelimiterSequence; + } else if (utils.contains(stackLargeDelimiters, delim)) { + sequence = stackLargeDelimiterSequence; + } else { + sequence = stackAlwaysDelimiterSequence; + } // Look through the sequence + + + var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs. + // Depending on the sequence element we decided on, call the + // appropriate function. + + if (delimType.type === "small") { + return delimiter_makeSmallDelim(delim, delimType.style, center, options, mode, classes); + } else if (delimType.type === "large") { + return delimiter_makeLargeDelim(delim, delimType.size, center, options, mode, classes); + } else + /* if (delimType.type === "stack") */ + { + return delimiter_makeStackedDelim(delim, height, center, options, mode, classes); } - - // Decide what sequence to use - var sequence = void 0; - if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackNeverDelimiters, delim)) { - sequence = stackNeverDelimiterSequence; - } else if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackLargeDelimiters, delim)) { - sequence = stackLargeDelimiterSequence; - } else { - sequence = stackAlwaysDelimiterSequence; - } - - // Look through the sequence - var delimType = traverseSequence(delim, height, sequence, options); - - // Get the delimiter from font glyphs. - // Depending on the sequence element we decided on, call the - // appropriate function. - if (delimType.type === "small") { - return makeSmallDelim(delim, delimType.style, center, options, mode, classes); - } else if (delimType.type === "large") { - return makeLargeDelim(delim, delimType.size, center, options, mode, classes); - } else /* if (delimType.type === "stack") */{ - return makeStackedDelim(delim, height, center, options, mode, classes); - } }; - /** * Make a delimiter for use with `\left` and `\right`, given a height and depth * of an expression that the delimiters surround. */ + + var makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) { - // We always center \left/\right delimiters, so the axis is always shifted - var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; + // We always center \left/\right delimiters, so the axis is always shifted + var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right - // Taken from TeX source, tex.web, function make_left_right - var delimiterFactor = 901; - var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm; + var delimiterFactor = 901; + var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm; + var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight); + var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are + // 65536 per pt, or 655360 per em. So, the division here truncates in + // TeX but doesn't here, producing different results. If we wanted to + // exactly match TeX's calculation, we could do + // Math.floor(655360 * maxDistFromAxis / 500) * + // delimiterFactor / 655360 + // (To see the difference, compare + // x^{x^{\left(\rule{0.1em}{0.68em}\right)}} + // in TeX and KaTeX) + maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total + // height - var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight); - - var totalHeight = Math.max( - // In real TeX, calculations are done using integral values which are - // 65536 per pt, or 655360 per em. So, the division here truncates in - // TeX but doesn't here, producing different results. If we wanted to - // exactly match TeX's calculation, we could do - // Math.floor(655360 * maxDistFromAxis / 500) * - // delimiterFactor / 655360 - // (To see the difference, compare - // x^{x^{\left(\rule{0.1em}{0.68em}\right)}} - // in TeX and KaTeX) - maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); - - // Finally, we defer to `makeCustomSizedDelim` with our calculated total - // height - return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes); + return delimiter_makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes); }; -/* harmony default export */ __webpack_exports__["a"] = ({ - sqrtImage: makeSqrtImage, - sizedDelim: makeSizedDelim, - customSizedDelim: makeCustomSizedDelim, - leftRightDelim: makeLeftRightDelim +/* harmony default export */ var delimiter = ({ + sqrtImage: makeSqrtImage, + sizedDelim: delimiter_makeSizedDelim, + customSizedDelim: delimiter_makeCustomSizedDelim, + leftRightDelim: makeLeftRightDelim }); +// CONCATENATED MODULE: ./src/functions/delimsizing.js -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { -var isObject = __webpack_require__(20) - , document = __webpack_require__(16).document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; + + + + + + + +// Extra data needed for the delimiter handler down below +var delimiterSizes = { + "\\bigl": { + mclass: "mopen", + size: 1 + }, + "\\Bigl": { + mclass: "mopen", + size: 2 + }, + "\\biggl": { + mclass: "mopen", + size: 3 + }, + "\\Biggl": { + mclass: "mopen", + size: 4 + }, + "\\bigr": { + mclass: "mclose", + size: 1 + }, + "\\Bigr": { + mclass: "mclose", + size: 2 + }, + "\\biggr": { + mclass: "mclose", + size: 3 + }, + "\\Biggr": { + mclass: "mclose", + size: 4 + }, + "\\bigm": { + mclass: "mrel", + size: 1 + }, + "\\Bigm": { + mclass: "mrel", + size: 2 + }, + "\\biggm": { + mclass: "mrel", + size: 3 + }, + "\\Biggm": { + mclass: "mrel", + size: 4 + }, + "\\big": { + mclass: "mord", + size: 1 + }, + "\\Big": { + mclass: "mord", + size: 2 + }, + "\\bigg": { + mclass: "mord", + size: 3 + }, + "\\Bigg": { + mclass: "mord", + size: 4 + } }; +var delimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."]; -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { +// Delimiter functions +function checkDelimiter(delim, context) { + var symDelim = checkSymbolNodeType(delim); -// most Object methods by ES6 should accept primitives -var $export = __webpack_require__(25) - , core = __webpack_require__(8) - , fails = __webpack_require__(24); -module.exports = function(KEY, exec){ - var fn = (core.Object || {})[KEY] || Object[KEY] - , exp = {}; - exp[KEY] = exec(fn); - $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); -}; + if (symDelim && utils.contains(delimiters, symDelim.text)) { + return symDelim; + } else { + throw new src_ParseError("Invalid delimiter: '" + (symDelim ? symDelim.text : JSON.stringify(delim)) + "' after '" + context.funcName + "'", delim); + } +} -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -// optional / simple context binding -var aFunction = __webpack_require__(72); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); +defineFunction({ + type: "delimsizing", + names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + var delim = checkDelimiter(args[0], context); + return { + type: "delimsizing", + mode: context.parser.mode, + size: delimiterSizes[context.funcName].size, + mclass: delimiterSizes[context.funcName].mclass, + delim: delim.text }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; - -/***/ }), -/* 48 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__(82) - , $export = __webpack_require__(25) - , redefine = __webpack_require__(83) - , hide = __webpack_require__(26) - , has = __webpack_require__(21) - , Iterators = __webpack_require__(17) - , $iterCreate = __webpack_require__(84) - , setToStringTag = __webpack_require__(54) - , getPrototypeOf = __webpack_require__(91) - , ITERATOR = __webpack_require__(11)('iterator') - , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` - , FF_ITERATOR = '@@iterator' - , KEYS = 'keys' - , VALUES = 'values'; - -var returnThis = function(){ return this; }; - -module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ - $iterCreate(Constructor, NAME, next); - var getMethod = function(kind){ - if(!BUGGY && kind in proto)return proto[kind]; - switch(kind){ - case KEYS: return function keys(){ return new Constructor(this, kind); }; - case VALUES: return function values(){ return new Constructor(this, kind); }; - } return function entries(){ return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator' - , DEF_VALUES = DEFAULT == VALUES - , VALUES_BUG = false - , proto = Base.prototype - , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] - , $default = $native || getMethod(DEFAULT) - , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined - , $anyNative = NAME == 'Array' ? proto.entries || $native : $native - , methods, key, IteratorPrototype; - // Fix native - if($anyNative){ - IteratorPrototype = getPrototypeOf($anyNative.call(new Base)); - if(IteratorPrototype !== Object.prototype){ - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); - } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if(DEF_VALUES && $native && $native.name !== VALUES){ - VALUES_BUG = true; - $default = function values(){ return $native.call(this); }; - } - // Define iterator - if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if(DEFAULT){ - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if(FORCED)for(key in methods){ - if(!(key in proto))redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; - -/***/ }), -/* 49 */ -/***/ (function(module, exports, __webpack_require__) { - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = __webpack_require__(50); -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ - return cof(it) == 'String' ? it.split('') : Object(it); -}; - -/***/ }), -/* 50 */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; - -/***/ }), -/* 51 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.15 ToLength -var toInteger = __webpack_require__(37) - , min = Math.min; -module.exports = function(it){ - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(16) - , SHARED = '__core-js_shared__' - , store = global[SHARED] || (global[SHARED] = {}); -module.exports = function(key){ - return store[key] || (store[key] = {}); -}; - -/***/ }), -/* 53 */ -/***/ (function(module, exports) { - -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); - -/***/ }), -/* 54 */ -/***/ (function(module, exports, __webpack_require__) { - -var def = __webpack_require__(15).f - , has = __webpack_require__(21) - , TAG = __webpack_require__(11)('toStringTag'); - -module.exports = function(it, tag, stat){ - if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); -}; - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(56) - , ITERATOR = __webpack_require__(11)('iterator') - , Iterators = __webpack_require__(17); -module.exports = __webpack_require__(8).getIteratorMethod = function(it){ - if(it != undefined)return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -// getting tag from 19.1.3.6 Object.prototype.toString() -var cof = __webpack_require__(50) - , TAG = __webpack_require__(11)('toStringTag') - // ES3 wrong here - , ARG = cof(function(){ return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function(it, key){ - try { - return it[key]; - } catch(e){ /* empty */ } -}; - -module.exports = function(it){ - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T - // builtinTag case - : ARG ? cof(O) - // ES3 arguments fallback - : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + }, + htmlBuilder: function htmlBuilder(group, options) { + if (group.delim === ".") { + // Empty delimiters still count as elements, even though they don't + // show anything. + return buildCommon.makeSpan([group.mclass]); + } // Use delimiter.sizedDelim to generate the delimiter. -exports.__esModule = true; + return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]); + }, + mathmlBuilder: function mathmlBuilder(group) { + var children = []; -var _isIterable2 = __webpack_require__(97); - -var _isIterable3 = _interopRequireDefault(_isIterable2); - -var _getIterator2 = __webpack_require__(18); - -var _getIterator3 = _interopRequireDefault(_getIterator2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } + if (group.delim !== ".") { + children.push(buildMathML_makeText(group.delim, group.mode)); } - return _arr; - } + var node = new mathMLTree.MathNode("mo", children); - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if ((0, _isIterable3.default)(Object(arr))) { - return sliceIterator(arr, i); + if (group.mclass === "mopen" || group.mclass === "mclose") { + // Only some of the delimsizing functions act as fences, and they + // return "mopen" or "mclose" mclass. + node.setAttribute("fence", "true"); } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); + // Explicitly disable fencing if it's not a fence, to override the + // defaults. + node.setAttribute("fence", "false"); } - }; -}(); -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(99); -var global = __webpack_require__(16) - , hide = __webpack_require__(26) - , Iterators = __webpack_require__(17) - , TO_STRING_TAG = __webpack_require__(11)('toStringTag'); - -for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){ - var NAME = collections[i] - , Collection = global[NAME] - , proto = Collection && Collection.prototype; - if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); - Iterators[NAME] = Iterators.Array; -} - -/***/ }), -/* 59 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony default export */ __webpack_exports__["a"] = ({ - "AMS-Regular": { - "65": [0, 0.68889, 0, 0, 0.72222], - "66": [0, 0.68889, 0, 0, 0.66667], - "67": [0, 0.68889, 0, 0, 0.72222], - "68": [0, 0.68889, 0, 0, 0.72222], - "69": [0, 0.68889, 0, 0, 0.66667], - "70": [0, 0.68889, 0, 0, 0.61111], - "71": [0, 0.68889, 0, 0, 0.77778], - "72": [0, 0.68889, 0, 0, 0.77778], - "73": [0, 0.68889, 0, 0, 0.38889], - "74": [0.16667, 0.68889, 0, 0, 0.5], - "75": [0, 0.68889, 0, 0, 0.77778], - "76": [0, 0.68889, 0, 0, 0.66667], - "77": [0, 0.68889, 0, 0, 0.94445], - "78": [0, 0.68889, 0, 0, 0.72222], - "79": [0.16667, 0.68889, 0, 0, 0.77778], - "80": [0, 0.68889, 0, 0, 0.61111], - "81": [0.16667, 0.68889, 0, 0, 0.77778], - "82": [0, 0.68889, 0, 0, 0.72222], - "83": [0, 0.68889, 0, 0, 0.55556], - "84": [0, 0.68889, 0, 0, 0.66667], - "85": [0, 0.68889, 0, 0, 0.72222], - "86": [0, 0.68889, 0, 0, 0.72222], - "87": [0, 0.68889, 0, 0, 1.0], - "88": [0, 0.68889, 0, 0, 0.72222], - "89": [0, 0.68889, 0, 0, 0.72222], - "90": [0, 0.68889, 0, 0, 0.66667], - "107": [0, 0.68889, 0, 0, 0.55556], - "165": [0, 0.675, 0.025, 0, 0.75], - "174": [0.15559, 0.69224, 0, 0, 0.94666], - "240": [0, 0.68889, 0, 0, 0.55556], - "295": [0, 0.68889, 0, 0, 0.54028], - "710": [0, 0.825, 0, 0, 2.33334], - "732": [0, 0.9, 0, 0, 2.33334], - "770": [0, 0.825, 0, 0, 2.33334], - "771": [0, 0.9, 0, 0, 2.33334], - "989": [0.08167, 0.58167, 0, 0, 0.77778], - "1008": [0, 0.43056, 0.04028, 0, 0.66667], - "8245": [0, 0.54986, 0, 0, 0.275], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8487": [0, 0.68889, 0, 0, 0.72222], - "8498": [0, 0.68889, 0, 0, 0.55556], - "8502": [0, 0.68889, 0, 0, 0.66667], - "8503": [0, 0.68889, 0, 0, 0.44445], - "8504": [0, 0.68889, 0, 0, 0.66667], - "8513": [0, 0.68889, 0, 0, 0.63889], - "8592": [-0.03598, 0.46402, 0, 0, 0.5], - "8594": [-0.03598, 0.46402, 0, 0, 0.5], - "8602": [-0.13313, 0.36687, 0, 0, 1.0], - "8603": [-0.13313, 0.36687, 0, 0, 1.0], - "8606": [0.01354, 0.52239, 0, 0, 1.0], - "8608": [0.01354, 0.52239, 0, 0, 1.0], - "8610": [0.01354, 0.52239, 0, 0, 1.11111], - "8611": [0.01354, 0.52239, 0, 0, 1.11111], - "8619": [0, 0.54986, 0, 0, 1.0], - "8620": [0, 0.54986, 0, 0, 1.0], - "8621": [-0.13313, 0.37788, 0, 0, 1.38889], - "8622": [-0.13313, 0.36687, 0, 0, 1.0], - "8624": [0, 0.69224, 0, 0, 0.5], - "8625": [0, 0.69224, 0, 0, 0.5], - "8630": [0, 0.43056, 0, 0, 1.0], - "8631": [0, 0.43056, 0, 0, 1.0], - "8634": [0.08198, 0.58198, 0, 0, 0.77778], - "8635": [0.08198, 0.58198, 0, 0, 0.77778], - "8638": [0.19444, 0.69224, 0, 0, 0.41667], - "8639": [0.19444, 0.69224, 0, 0, 0.41667], - "8642": [0.19444, 0.69224, 0, 0, 0.41667], - "8643": [0.19444, 0.69224, 0, 0, 0.41667], - "8644": [0.1808, 0.675, 0, 0, 1.0], - "8646": [0.1808, 0.675, 0, 0, 1.0], - "8647": [0.1808, 0.675, 0, 0, 1.0], - "8648": [0.19444, 0.69224, 0, 0, 0.83334], - "8649": [0.1808, 0.675, 0, 0, 1.0], - "8650": [0.19444, 0.69224, 0, 0, 0.83334], - "8651": [0.01354, 0.52239, 0, 0, 1.0], - "8652": [0.01354, 0.52239, 0, 0, 1.0], - "8653": [-0.13313, 0.36687, 0, 0, 1.0], - "8654": [-0.13313, 0.36687, 0, 0, 1.0], - "8655": [-0.13313, 0.36687, 0, 0, 1.0], - "8666": [0.13667, 0.63667, 0, 0, 1.0], - "8667": [0.13667, 0.63667, 0, 0, 1.0], - "8669": [-0.13313, 0.37788, 0, 0, 1.0], - "8672": [-0.064, 0.437, 0, 0, 1187], - "8674": [-0.064, 0.437, 0, 0, 1167], - "8705": [0, 0.825, 0, 0, 0.5], - "8708": [0, 0.68889, 0, 0, 0.55556], - "8709": [0.08167, 0.58167, 0, 0, 0.77778], - "8717": [0, 0.43056, 0, 0, 0.42917], - "8722": [-0.03598, 0.46402, 0, 0, 0.5], - "8724": [0.08198, 0.69224, 0, 0, 0.77778], - "8726": [0.08167, 0.58167, 0, 0, 0.77778], - "8733": [0, 0.69224, 0, 0, 0.77778], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8737": [0, 0.69224, 0, 0, 0.72222], - "8738": [0.03517, 0.52239, 0, 0, 0.72222], - "8739": [0.08167, 0.58167, 0, 0, 0.22222], - "8740": [0.25142, 0.74111, 0, 0, 0.27778], - "8741": [0.08167, 0.58167, 0, 0, 0.38889], - "8742": [0.25142, 0.74111, 0, 0, 0.5], - "8756": [0, 0.69224, 0, 0, 0.66667], - "8757": [0, 0.69224, 0, 0, 0.66667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8765": [-0.13313, 0.37788, 0, 0, 0.77778], - "8769": [-0.13313, 0.36687, 0, 0, 0.77778], - "8770": [-0.03625, 0.46375, 0, 0, 0.77778], - "8774": [0.30274, 0.79383, 0, 0, 0.77778], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8778": [0.08167, 0.58167, 0, 0, 0.77778], - "8782": [0.06062, 0.54986, 0, 0, 0.77778], - "8783": [0.06062, 0.54986, 0, 0, 0.77778], - "8785": [0.08198, 0.58198, 0, 0, 0.77778], - "8786": [0.08198, 0.58198, 0, 0, 0.77778], - "8787": [0.08198, 0.58198, 0, 0, 0.77778], - "8790": [0, 0.69224, 0, 0, 0.77778], - "8791": [0.22958, 0.72958, 0, 0, 0.77778], - "8796": [0.08198, 0.91667, 0, 0, 0.77778], - "8806": [0.25583, 0.75583, 0, 0, 0.77778], - "8807": [0.25583, 0.75583, 0, 0, 0.77778], - "8808": [0.25142, 0.75726, 0, 0, 0.77778], - "8809": [0.25142, 0.75726, 0, 0, 0.77778], - "8812": [0.25583, 0.75583, 0, 0, 0.5], - "8814": [0.20576, 0.70576, 0, 0, 0.77778], - "8815": [0.20576, 0.70576, 0, 0, 0.77778], - "8816": [0.30274, 0.79383, 0, 0, 0.77778], - "8817": [0.30274, 0.79383, 0, 0, 0.77778], - "8818": [0.22958, 0.72958, 0, 0, 0.77778], - "8819": [0.22958, 0.72958, 0, 0, 0.77778], - "8822": [0.1808, 0.675, 0, 0, 0.77778], - "8823": [0.1808, 0.675, 0, 0, 0.77778], - "8828": [0.13667, 0.63667, 0, 0, 0.77778], - "8829": [0.13667, 0.63667, 0, 0, 0.77778], - "8830": [0.22958, 0.72958, 0, 0, 0.77778], - "8831": [0.22958, 0.72958, 0, 0, 0.77778], - "8832": [0.20576, 0.70576, 0, 0, 0.77778], - "8833": [0.20576, 0.70576, 0, 0, 0.77778], - "8840": [0.30274, 0.79383, 0, 0, 0.77778], - "8841": [0.30274, 0.79383, 0, 0, 0.77778], - "8842": [0.13597, 0.63597, 0, 0, 0.77778], - "8843": [0.13597, 0.63597, 0, 0, 0.77778], - "8847": [0.03517, 0.54986, 0, 0, 0.77778], - "8848": [0.03517, 0.54986, 0, 0, 0.77778], - "8858": [0.08198, 0.58198, 0, 0, 0.77778], - "8859": [0.08198, 0.58198, 0, 0, 0.77778], - "8861": [0.08198, 0.58198, 0, 0, 0.77778], - "8862": [0, 0.675, 0, 0, 0.77778], - "8863": [0, 0.675, 0, 0, 0.77778], - "8864": [0, 0.675, 0, 0, 0.77778], - "8865": [0, 0.675, 0, 0, 0.77778], - "8872": [0, 0.69224, 0, 0, 0.61111], - "8873": [0, 0.69224, 0, 0, 0.72222], - "8874": [0, 0.69224, 0, 0, 0.88889], - "8876": [0, 0.68889, 0, 0, 0.61111], - "8877": [0, 0.68889, 0, 0, 0.61111], - "8878": [0, 0.68889, 0, 0, 0.72222], - "8879": [0, 0.68889, 0, 0, 0.72222], - "8882": [0.03517, 0.54986, 0, 0, 0.77778], - "8883": [0.03517, 0.54986, 0, 0, 0.77778], - "8884": [0.13667, 0.63667, 0, 0, 0.77778], - "8885": [0.13667, 0.63667, 0, 0, 0.77778], - "8888": [0, 0.54986, 0, 0, 1.11111], - "8890": [0.19444, 0.43056, 0, 0, 0.55556], - "8891": [0.19444, 0.69224, 0, 0, 0.61111], - "8892": [0.19444, 0.69224, 0, 0, 0.61111], - "8901": [0, 0.54986, 0, 0, 0.27778], - "8903": [0.08167, 0.58167, 0, 0, 0.77778], - "8905": [0.08167, 0.58167, 0, 0, 0.77778], - "8906": [0.08167, 0.58167, 0, 0, 0.77778], - "8907": [0, 0.69224, 0, 0, 0.77778], - "8908": [0, 0.69224, 0, 0, 0.77778], - "8909": [-0.03598, 0.46402, 0, 0, 0.77778], - "8910": [0, 0.54986, 0, 0, 0.76042], - "8911": [0, 0.54986, 0, 0, 0.76042], - "8912": [0.03517, 0.54986, 0, 0, 0.77778], - "8913": [0.03517, 0.54986, 0, 0, 0.77778], - "8914": [0, 0.54986, 0, 0, 0.66667], - "8915": [0, 0.54986, 0, 0, 0.66667], - "8916": [0, 0.69224, 0, 0, 0.66667], - "8918": [0.0391, 0.5391, 0, 0, 0.77778], - "8919": [0.0391, 0.5391, 0, 0, 0.77778], - "8920": [0.03517, 0.54986, 0, 0, 1.33334], - "8921": [0.03517, 0.54986, 0, 0, 1.33334], - "8922": [0.38569, 0.88569, 0, 0, 0.77778], - "8923": [0.38569, 0.88569, 0, 0, 0.77778], - "8926": [0.13667, 0.63667, 0, 0, 0.77778], - "8927": [0.13667, 0.63667, 0, 0, 0.77778], - "8928": [0.30274, 0.79383, 0, 0, 0.77778], - "8929": [0.30274, 0.79383, 0, 0, 0.77778], - "8934": [0.23222, 0.74111, 0, 0, 0.77778], - "8935": [0.23222, 0.74111, 0, 0, 0.77778], - "8936": [0.23222, 0.74111, 0, 0, 0.77778], - "8937": [0.23222, 0.74111, 0, 0, 0.77778], - "8938": [0.20576, 0.70576, 0, 0, 0.77778], - "8939": [0.20576, 0.70576, 0, 0, 0.77778], - "8940": [0.30274, 0.79383, 0, 0, 0.77778], - "8941": [0.30274, 0.79383, 0, 0, 0.77778], - "8994": [0.19444, 0.69224, 0, 0, 0.77778], - "8995": [0.19444, 0.69224, 0, 0, 0.77778], - "9416": [0.15559, 0.69224, 0, 0, 0.90222], - "9484": [0, 0.69224, 0, 0, 0.5], - "9488": [0, 0.69224, 0, 0, 0.5], - "9492": [0, 0.37788, 0, 0, 0.5], - "9496": [0, 0.37788, 0, 0, 0.5], - "9585": [0.19444, 0.68889, 0, 0, 0.88889], - "9586": [0.19444, 0.74111, 0, 0, 0.88889], - "9632": [0, 0.675, 0, 0, 0.77778], - "9633": [0, 0.675, 0, 0, 0.77778], - "9650": [0, 0.54986, 0, 0, 0.72222], - "9651": [0, 0.54986, 0, 0, 0.72222], - "9654": [0.03517, 0.54986, 0, 0, 0.77778], - "9660": [0, 0.54986, 0, 0, 0.72222], - "9661": [0, 0.54986, 0, 0, 0.72222], - "9664": [0.03517, 0.54986, 0, 0, 0.77778], - "9674": [0.11111, 0.69224, 0, 0, 0.66667], - "9733": [0.19444, 0.69224, 0, 0, 0.94445], - "10003": [0, 0.69224, 0, 0, 0.83334], - "10016": [0, 0.69224, 0, 0, 0.83334], - "10731": [0.11111, 0.69224, 0, 0, 0.66667], - "10846": [0.19444, 0.75583, 0, 0, 0.61111], - "10877": [0.13667, 0.63667, 0, 0, 0.77778], - "10878": [0.13667, 0.63667, 0, 0, 0.77778], - "10885": [0.25583, 0.75583, 0, 0, 0.77778], - "10886": [0.25583, 0.75583, 0, 0, 0.77778], - "10887": [0.13597, 0.63597, 0, 0, 0.77778], - "10888": [0.13597, 0.63597, 0, 0, 0.77778], - "10889": [0.26167, 0.75726, 0, 0, 0.77778], - "10890": [0.26167, 0.75726, 0, 0, 0.77778], - "10891": [0.48256, 0.98256, 0, 0, 0.77778], - "10892": [0.48256, 0.98256, 0, 0, 0.77778], - "10901": [0.13667, 0.63667, 0, 0, 0.77778], - "10902": [0.13667, 0.63667, 0, 0, 0.77778], - "10933": [0.25142, 0.75726, 0, 0, 0.77778], - "10934": [0.25142, 0.75726, 0, 0, 0.77778], - "10935": [0.26167, 0.75726, 0, 0, 0.77778], - "10936": [0.26167, 0.75726, 0, 0, 0.77778], - "10937": [0.26167, 0.75726, 0, 0, 0.77778], - "10938": [0.26167, 0.75726, 0, 0, 0.77778], - "10949": [0.25583, 0.75583, 0, 0, 0.77778], - "10950": [0.25583, 0.75583, 0, 0, 0.77778], - "10955": [0.28481, 0.79383, 0, 0, 0.77778], - "10956": [0.28481, 0.79383, 0, 0, 0.77778], - "57350": [0.08167, 0.58167, 0, 0, 0.22222], - "57351": [0.08167, 0.58167, 0, 0, 0.38889], - "57352": [0.08167, 0.58167, 0, 0, 0.77778], - "57353": [0, 0.43056, 0.04028, 0, 0.66667], - "57356": [0.25142, 0.75726, 0, 0, 0.77778], - "57357": [0.25142, 0.75726, 0, 0, 0.77778], - "57358": [0.41951, 0.91951, 0, 0, 0.77778], - "57359": [0.30274, 0.79383, 0, 0, 0.77778], - "57360": [0.30274, 0.79383, 0, 0, 0.77778], - "57361": [0.41951, 0.91951, 0, 0, 0.77778], - "57366": [0.25142, 0.75726, 0, 0, 0.77778], - "57367": [0.25142, 0.75726, 0, 0, 0.77778], - "57368": [0.25142, 0.75726, 0, 0, 0.77778], - "57369": [0.25142, 0.75726, 0, 0, 0.77778], - "57370": [0.13597, 0.63597, 0, 0, 0.77778], - "57371": [0.13597, 0.63597, 0, 0, 0.77778] - }, - "Caligraphic-Regular": { - "48": [0, 0.43056, 0, 0, 0.5], - "49": [0, 0.43056, 0, 0, 0.5], - "50": [0, 0.43056, 0, 0, 0.5], - "51": [0.19444, 0.43056, 0, 0, 0.5], - "52": [0.19444, 0.43056, 0, 0, 0.5], - "53": [0.19444, 0.43056, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0.19444, 0.43056, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0.19444, 0.43056, 0, 0, 0.5], - "65": [0, 0.68333, 0, 0.19445, 0.79847], - "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], - "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], - "68": [0, 0.68333, 0.02778, 0.08334, 0.77139], - "69": [0, 0.68333, 0.08944, 0.11111, 0.52778], - "70": [0, 0.68333, 0.09931, 0.11111, 0.71875], - "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487], - "72": [0, 0.68333, 0.00965, 0.11111, 0.84452], - "73": [0, 0.68333, 0.07382, 0, 0.54452], - "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778], - "75": [0, 0.68333, 0.01445, 0.05556, 0.76195], - "76": [0, 0.68333, 0, 0.13889, 0.68972], - "77": [0, 0.68333, 0, 0.13889, 1.2009], - "78": [0, 0.68333, 0.14736, 0.08334, 0.82049], - "79": [0, 0.68333, 0.02778, 0.11111, 0.79611], - "80": [0, 0.68333, 0.08222, 0.08334, 0.69556], - "81": [0.09722, 0.68333, 0, 0.11111, 0.81667], - "82": [0, 0.68333, 0, 0.08334, 0.8475], - "83": [0, 0.68333, 0.075, 0.13889, 0.60556], - "84": [0, 0.68333, 0.25417, 0, 0.54464], - "85": [0, 0.68333, 0.09931, 0.08334, 0.62583], - "86": [0, 0.68333, 0.08222, 0, 0.61278], - "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], - "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], - "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], - "90": [0, 0.68333, 0.07944, 0.13889, 0.72473] - }, - "Fraktur-Regular": { - "33": [0, 0.69141, 0, 0, 0.29574], - "34": [0, 0.69141, 0, 0, 0.21471], - "38": [0, 0.69141, 0, 0, 0.73786], - "39": [0, 0.69141, 0, 0, 0.21201], - "40": [0.24982, 0.74947, 0, 0, 0.38865], - "41": [0.24982, 0.74947, 0, 0, 0.38865], - "42": [0, 0.62119, 0, 0, 0.27764], - "43": [0.08319, 0.58283, 0, 0, 0.75623], - "44": [0, 0.10803, 0, 0, 0.27764], - "45": [0.08319, 0.58283, 0, 0, 0.75623], - "46": [0, 0.10803, 0, 0, 0.27764], - "47": [0.24982, 0.74947, 0, 0, 0.50181], - "48": [0, 0.47534, 0, 0, 0.50181], - "49": [0, 0.47534, 0, 0, 0.50181], - "50": [0, 0.47534, 0, 0, 0.50181], - "51": [0.18906, 0.47534, 0, 0, 0.50181], - "52": [0.18906, 0.47534, 0, 0, 0.50181], - "53": [0.18906, 0.47534, 0, 0, 0.50181], - "54": [0, 0.69141, 0, 0, 0.50181], - "55": [0.18906, 0.47534, 0, 0, 0.50181], - "56": [0, 0.69141, 0, 0, 0.50181], - "57": [0.18906, 0.47534, 0, 0, 0.50181], - "58": [0, 0.47534, 0, 0, 0.21606], - "59": [0.12604, 0.47534, 0, 0, 0.21606], - "61": [-0.13099, 0.36866, 0, 0, 0.75623], - "63": [0, 0.69141, 0, 0, 0.36245], - "65": [0, 0.69141, 0, 0, 0.7176], - "66": [0, 0.69141, 0, 0, 0.88397], - "67": [0, 0.69141, 0, 0, 0.61254], - "68": [0, 0.69141, 0, 0, 0.83158], - "69": [0, 0.69141, 0, 0, 0.66278], - "70": [0.12604, 0.69141, 0, 0, 0.61119], - "71": [0, 0.69141, 0, 0, 0.78539], - "72": [0.06302, 0.69141, 0, 0, 0.7203], - "73": [0, 0.69141, 0, 0, 0.55448], - "74": [0.12604, 0.69141, 0, 0, 0.55231], - "75": [0, 0.69141, 0, 0, 0.66845], - "76": [0, 0.69141, 0, 0, 0.66602], - "77": [0, 0.69141, 0, 0, 1.04953], - "78": [0, 0.69141, 0, 0, 0.83212], - "79": [0, 0.69141, 0, 0, 0.82699], - "80": [0.18906, 0.69141, 0, 0, 0.82753], - "81": [0.03781, 0.69141, 0, 0, 0.82699], - "82": [0, 0.69141, 0, 0, 0.82807], - "83": [0, 0.69141, 0, 0, 0.82861], - "84": [0, 0.69141, 0, 0, 0.66899], - "85": [0, 0.69141, 0, 0, 0.64576], - "86": [0, 0.69141, 0, 0, 0.83131], - "87": [0, 0.69141, 0, 0, 1.04602], - "88": [0, 0.69141, 0, 0, 0.71922], - "89": [0.18906, 0.69141, 0, 0, 0.83293], - "90": [0.12604, 0.69141, 0, 0, 0.60201], - "91": [0.24982, 0.74947, 0, 0, 0.27764], - "93": [0.24982, 0.74947, 0, 0, 0.27764], - "94": [0, 0.69141, 0, 0, 0.49965], - "97": [0, 0.47534, 0, 0, 0.50046], - "98": [0, 0.69141, 0, 0, 0.51315], - "99": [0, 0.47534, 0, 0, 0.38946], - "100": [0, 0.62119, 0, 0, 0.49857], - "101": [0, 0.47534, 0, 0, 0.40053], - "102": [0.18906, 0.69141, 0, 0, 0.32626], - "103": [0.18906, 0.47534, 0, 0, 0.5037], - "104": [0.18906, 0.69141, 0, 0, 0.52126], - "105": [0, 0.69141, 0, 0, 0.27899], - "106": [0, 0.69141, 0, 0, 0.28088], - "107": [0, 0.69141, 0, 0, 0.38946], - "108": [0, 0.69141, 0, 0, 0.27953], - "109": [0, 0.47534, 0, 0, 0.76676], - "110": [0, 0.47534, 0, 0, 0.52666], - "111": [0, 0.47534, 0, 0, 0.48885], - "112": [0.18906, 0.52396, 0, 0, 0.50046], - "113": [0.18906, 0.47534, 0, 0, 0.48912], - "114": [0, 0.47534, 0, 0, 0.38919], - "115": [0, 0.47534, 0, 0, 0.44266], - "116": [0, 0.62119, 0, 0, 0.33301], - "117": [0, 0.47534, 0, 0, 0.5172], - "118": [0, 0.52396, 0, 0, 0.5118], - "119": [0, 0.52396, 0, 0, 0.77351], - "120": [0.18906, 0.47534, 0, 0, 0.38865], - "121": [0.18906, 0.47534, 0, 0, 0.49884], - "122": [0.18906, 0.47534, 0, 0, 0.39054], - "8216": [0, 0.69141, 0, 0, 0.21471], - "8217": [0, 0.69141, 0, 0, 0.21471], - "58112": [0, 0.62119, 0, 0, 0.49749], - "58113": [0, 0.62119, 0, 0, 0.4983], - "58114": [0.18906, 0.69141, 0, 0, 0.33328], - "58115": [0.18906, 0.69141, 0, 0, 0.32923], - "58116": [0.18906, 0.47534, 0, 0, 0.50343], - "58117": [0, 0.69141, 0, 0, 0.33301], - "58118": [0, 0.62119, 0, 0, 0.33409], - "58119": [0, 0.47534, 0, 0, 0.50073] - }, - "Main-Bold": { - "33": [0, 0.69444, 0, 0, 0.35], - "34": [0, 0.69444, 0, 0, 0.60278], - "35": [0.19444, 0.69444, 0, 0, 0.95833], - "36": [0.05556, 0.75, 0, 0, 0.575], - "37": [0.05556, 0.75, 0, 0, 0.95833], - "38": [0, 0.69444, 0, 0, 0.89444], - "39": [0, 0.69444, 0, 0, 0.31944], - "40": [0.25, 0.75, 0, 0, 0.44722], - "41": [0.25, 0.75, 0, 0, 0.44722], - "42": [0, 0.75, 0, 0, 0.575], - "43": [0.13333, 0.63333, 0, 0, 0.89444], - "44": [0.19444, 0.15556, 0, 0, 0.31944], - "45": [0, 0.44444, 0, 0, 0.38333], - "46": [0, 0.15556, 0, 0, 0.31944], - "47": [0.25, 0.75, 0, 0, 0.575], - "48": [0, 0.64444, 0, 0, 0.575], - "49": [0, 0.64444, 0, 0, 0.575], - "50": [0, 0.64444, 0, 0, 0.575], - "51": [0, 0.64444, 0, 0, 0.575], - "52": [0, 0.64444, 0, 0, 0.575], - "53": [0, 0.64444, 0, 0, 0.575], - "54": [0, 0.64444, 0, 0, 0.575], - "55": [0, 0.64444, 0, 0, 0.575], - "56": [0, 0.64444, 0, 0, 0.575], - "57": [0, 0.64444, 0, 0, 0.575], - "58": [0, 0.44444, 0, 0, 0.31944], - "59": [0.19444, 0.44444, 0, 0, 0.31944], - "60": [0.08556, 0.58556, 0, 0, 0.89444], - "61": [-0.10889, 0.39111, 0, 0, 0.89444], - "62": [0.08556, 0.58556, 0, 0, 0.89444], - "63": [0, 0.69444, 0, 0, 0.54305], - "64": [0, 0.69444, 0, 0, 0.89444], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0, 0, 0.81805], - "67": [0, 0.68611, 0, 0, 0.83055], - "68": [0, 0.68611, 0, 0, 0.88194], - "69": [0, 0.68611, 0, 0, 0.75555], - "70": [0, 0.68611, 0, 0, 0.72361], - "71": [0, 0.68611, 0, 0, 0.90416], - "72": [0, 0.68611, 0, 0, 0.9], - "73": [0, 0.68611, 0, 0, 0.43611], - "74": [0, 0.68611, 0, 0, 0.59444], - "75": [0, 0.68611, 0, 0, 0.90138], - "76": [0, 0.68611, 0, 0, 0.69166], - "77": [0, 0.68611, 0, 0, 1.09166], - "78": [0, 0.68611, 0, 0, 0.9], - "79": [0, 0.68611, 0, 0, 0.86388], - "80": [0, 0.68611, 0, 0, 0.78611], - "81": [0.19444, 0.68611, 0, 0, 0.86388], - "82": [0, 0.68611, 0, 0, 0.8625], - "83": [0, 0.68611, 0, 0, 0.63889], - "84": [0, 0.68611, 0, 0, 0.8], - "85": [0, 0.68611, 0, 0, 0.88472], - "86": [0, 0.68611, 0.01597, 0, 0.86944], - "87": [0, 0.68611, 0.01597, 0, 1.18888], - "88": [0, 0.68611, 0, 0, 0.86944], - "89": [0, 0.68611, 0.02875, 0, 0.86944], - "90": [0, 0.68611, 0, 0, 0.70277], - "91": [0.25, 0.75, 0, 0, 0.31944], - "92": [0.25, 0.75, 0, 0, 0.575], - "93": [0.25, 0.75, 0, 0, 0.31944], - "94": [0, 0.69444, 0, 0, 0.575], - "95": [0.31, 0.13444, 0.03194, 0, 0.575], - "97": [0, 0.44444, 0, 0, 0.55902], - "98": [0, 0.69444, 0, 0, 0.63889], - "99": [0, 0.44444, 0, 0, 0.51111], - "100": [0, 0.69444, 0, 0, 0.63889], - "101": [0, 0.44444, 0, 0, 0.52708], - "102": [0, 0.69444, 0.10903, 0, 0.35139], - "103": [0.19444, 0.44444, 0.01597, 0, 0.575], - "104": [0, 0.69444, 0, 0, 0.63889], - "105": [0, 0.69444, 0, 0, 0.31944], - "106": [0.19444, 0.69444, 0, 0, 0.35139], - "107": [0, 0.69444, 0, 0, 0.60694], - "108": [0, 0.69444, 0, 0, 0.31944], - "109": [0, 0.44444, 0, 0, 0.95833], - "110": [0, 0.44444, 0, 0, 0.63889], - "111": [0, 0.44444, 0, 0, 0.575], - "112": [0.19444, 0.44444, 0, 0, 0.63889], - "113": [0.19444, 0.44444, 0, 0, 0.60694], - "114": [0, 0.44444, 0, 0, 0.47361], - "115": [0, 0.44444, 0, 0, 0.45361], - "116": [0, 0.63492, 0, 0, 0.44722], - "117": [0, 0.44444, 0, 0, 0.63889], - "118": [0, 0.44444, 0.01597, 0, 0.60694], - "119": [0, 0.44444, 0.01597, 0, 0.83055], - "120": [0, 0.44444, 0, 0, 0.60694], - "121": [0.19444, 0.44444, 0.01597, 0, 0.60694], - "122": [0, 0.44444, 0, 0, 0.51111], - "123": [0.25, 0.75, 0, 0, 0.575], - "124": [0.25, 0.75, 0, 0, 0.31944], - "125": [0.25, 0.75, 0, 0, 0.575], - "126": [0.35, 0.34444, 0, 0, 0.575], - "168": [0, 0.69444, 0, 0, 0.575], - "172": [0, 0.44444, 0, 0, 0.76666], - "176": [0, 0.69444, 0, 0, 0.86944], - "177": [0.13333, 0.63333, 0, 0, 0.89444], - "198": [0, 0.68611, 0, 0, 1.04166], - "215": [0.13333, 0.63333, 0, 0, 0.89444], - "216": [0.04861, 0.73472, 0, 0, 0.89444], - "223": [0, 0.69444, 0, 0, 0.59722], - "230": [0, 0.44444, 0, 0, 0.83055], - "247": [0.13333, 0.63333, 0, 0, 0.89444], - "248": [0.09722, 0.54167, 0, 0, 0.575], - "305": [0, 0.44444, 0, 0, 0.31944], - "338": [0, 0.68611, 0, 0, 1.16944], - "339": [0, 0.44444, 0, 0, 0.89444], - "567": [0.19444, 0.44444, 0, 0, 0.35139], - "710": [0, 0.69444, 0, 0, 0.575], - "711": [0, 0.63194, 0, 0, 0.575], - "713": [0, 0.59611, 0, 0, 0.575], - "714": [0, 0.69444, 0, 0, 0.575], - "715": [0, 0.69444, 0, 0, 0.575], - "728": [0, 0.69444, 0, 0, 0.575], - "729": [0, 0.69444, 0, 0, 0.31944], - "730": [0, 0.69444, 0, 0, 0.86944], - "732": [0, 0.69444, 0, 0, 0.575], - "733": [0, 0.69444, 0, 0, 0.575], - "824": [0.19444, 0.69444, 0, 0, 0], - "915": [0, 0.68611, 0, 0, 0.69166], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0, 0, 0.89444], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0, 0, 0.76666], - "928": [0, 0.68611, 0, 0, 0.9], - "931": [0, 0.68611, 0, 0, 0.83055], - "933": [0, 0.68611, 0, 0, 0.89444], - "934": [0, 0.68611, 0, 0, 0.83055], - "936": [0, 0.68611, 0, 0, 0.89444], - "937": [0, 0.68611, 0, 0, 0.83055], - "8211": [0, 0.44444, 0.03194, 0, 0.575], - "8212": [0, 0.44444, 0.03194, 0, 1.14999], - "8216": [0, 0.69444, 0, 0, 0.31944], - "8217": [0, 0.69444, 0, 0, 0.31944], - "8220": [0, 0.69444, 0, 0, 0.60278], - "8221": [0, 0.69444, 0, 0, 0.60278], - "8224": [0.19444, 0.69444, 0, 0, 0.51111], - "8225": [0.19444, 0.69444, 0, 0, 0.51111], - "8242": [0, 0.55556, 0, 0, 0.34444], - "8407": [0, 0.72444, 0.15486, 0, 0.575], - "8463": [0, 0.69444, 0, 0, 0.66759], - "8465": [0, 0.69444, 0, 0, 0.83055], - "8467": [0, 0.69444, 0, 0, 0.47361], - "8472": [0.19444, 0.44444, 0, 0, 0.74027], - "8476": [0, 0.69444, 0, 0, 0.83055], - "8501": [0, 0.69444, 0, 0, 0.70277], - "8592": [-0.10889, 0.39111, 0, 0, 1.14999], - "8593": [0.19444, 0.69444, 0, 0, 0.575], - "8594": [-0.10889, 0.39111, 0, 0, 1.14999], - "8595": [0.19444, 0.69444, 0, 0, 0.575], - "8596": [-0.10889, 0.39111, 0, 0, 1.14999], - "8597": [0.25, 0.75, 0, 0, 0.575], - "8598": [0.19444, 0.69444, 0, 0, 1.14999], - "8599": [0.19444, 0.69444, 0, 0, 1.14999], - "8600": [0.19444, 0.69444, 0, 0, 1.14999], - "8601": [0.19444, 0.69444, 0, 0, 1.14999], - "8636": [-0.10889, 0.39111, 0, 0, 1.14999], - "8637": [-0.10889, 0.39111, 0, 0, 1.14999], - "8640": [-0.10889, 0.39111, 0, 0, 1.14999], - "8641": [-0.10889, 0.39111, 0, 0, 1.14999], - "8656": [-0.10889, 0.39111, 0, 0, 1.14999], - "8657": [0.19444, 0.69444, 0, 0, 0.70277], - "8658": [-0.10889, 0.39111, 0, 0, 1.14999], - "8659": [0.19444, 0.69444, 0, 0, 0.70277], - "8660": [-0.10889, 0.39111, 0, 0, 1.14999], - "8661": [0.25, 0.75, 0, 0, 0.70277], - "8704": [0, 0.69444, 0, 0, 0.63889], - "8706": [0, 0.69444, 0.06389, 0, 0.62847], - "8707": [0, 0.69444, 0, 0, 0.63889], - "8709": [0.05556, 0.75, 0, 0, 0.575], - "8711": [0, 0.68611, 0, 0, 0.95833], - "8712": [0.08556, 0.58556, 0, 0, 0.76666], - "8715": [0.08556, 0.58556, 0, 0, 0.76666], - "8722": [0.13333, 0.63333, 0, 0, 0.89444], - "8723": [0.13333, 0.63333, 0, 0, 0.89444], - "8725": [0.25, 0.75, 0, 0, 0.575], - "8726": [0.25, 0.75, 0, 0, 0.575], - "8727": [-0.02778, 0.47222, 0, 0, 0.575], - "8728": [-0.02639, 0.47361, 0, 0, 0.575], - "8729": [-0.02639, 0.47361, 0, 0, 0.575], - "8730": [0.18, 0.82, 0, 0, 0.95833], - "8733": [0, 0.44444, 0, 0, 0.89444], - "8734": [0, 0.44444, 0, 0, 1.14999], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.31944], - "8741": [0.25, 0.75, 0, 0, 0.575], - "8743": [0, 0.55556, 0, 0, 0.76666], - "8744": [0, 0.55556, 0, 0, 0.76666], - "8745": [0, 0.55556, 0, 0, 0.76666], - "8746": [0, 0.55556, 0, 0, 0.76666], - "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875], - "8764": [-0.10889, 0.39111, 0, 0, 0.89444], - "8768": [0.19444, 0.69444, 0, 0, 0.31944], - "8771": [0.00222, 0.50222, 0, 0, 0.89444], - "8776": [0.02444, 0.52444, 0, 0, 0.89444], - "8781": [0.00222, 0.50222, 0, 0, 0.89444], - "8801": [0.00222, 0.50222, 0, 0, 0.89444], - "8804": [0.19667, 0.69667, 0, 0, 0.89444], - "8805": [0.19667, 0.69667, 0, 0, 0.89444], - "8810": [0.08556, 0.58556, 0, 0, 1.14999], - "8811": [0.08556, 0.58556, 0, 0, 1.14999], - "8826": [0.08556, 0.58556, 0, 0, 0.89444], - "8827": [0.08556, 0.58556, 0, 0, 0.89444], - "8834": [0.08556, 0.58556, 0, 0, 0.89444], - "8835": [0.08556, 0.58556, 0, 0, 0.89444], - "8838": [0.19667, 0.69667, 0, 0, 0.89444], - "8839": [0.19667, 0.69667, 0, 0, 0.89444], - "8846": [0, 0.55556, 0, 0, 0.76666], - "8849": [0.19667, 0.69667, 0, 0, 0.89444], - "8850": [0.19667, 0.69667, 0, 0, 0.89444], - "8851": [0, 0.55556, 0, 0, 0.76666], - "8852": [0, 0.55556, 0, 0, 0.76666], - "8853": [0.13333, 0.63333, 0, 0, 0.89444], - "8854": [0.13333, 0.63333, 0, 0, 0.89444], - "8855": [0.13333, 0.63333, 0, 0, 0.89444], - "8856": [0.13333, 0.63333, 0, 0, 0.89444], - "8857": [0.13333, 0.63333, 0, 0, 0.89444], - "8866": [0, 0.69444, 0, 0, 0.70277], - "8867": [0, 0.69444, 0, 0, 0.70277], - "8868": [0, 0.69444, 0, 0, 0.89444], - "8869": [0, 0.69444, 0, 0, 0.89444], - "8900": [-0.02639, 0.47361, 0, 0, 0.575], - "8901": [-0.02639, 0.47361, 0, 0, 0.31944], - "8902": [-0.02778, 0.47222, 0, 0, 0.575], - "8968": [0.25, 0.75, 0, 0, 0.51111], - "8969": [0.25, 0.75, 0, 0, 0.51111], - "8970": [0.25, 0.75, 0, 0, 0.51111], - "8971": [0.25, 0.75, 0, 0, 0.51111], - "8994": [-0.13889, 0.36111, 0, 0, 1.14999], - "8995": [-0.13889, 0.36111, 0, 0, 1.14999], - "9651": [0.19444, 0.69444, 0, 0, 1.02222], - "9657": [-0.02778, 0.47222, 0, 0, 0.575], - "9661": [0.19444, 0.69444, 0, 0, 1.02222], - "9667": [-0.02778, 0.47222, 0, 0, 0.575], - "9711": [0.19444, 0.69444, 0, 0, 1.14999], - "9824": [0.12963, 0.69444, 0, 0, 0.89444], - "9825": [0.12963, 0.69444, 0, 0, 0.89444], - "9826": [0.12963, 0.69444, 0, 0, 0.89444], - "9827": [0.12963, 0.69444, 0, 0, 0.89444], - "9837": [0, 0.75, 0, 0, 0.44722], - "9838": [0.19444, 0.69444, 0, 0, 0.44722], - "9839": [0.19444, 0.69444, 0, 0, 0.44722], - "10216": [0.25, 0.75, 0, 0, 0.44722], - "10217": [0.25, 0.75, 0, 0, 0.44722], - "10815": [0, 0.68611, 0, 0, 0.9], - "10927": [0.19667, 0.69667, 0, 0, 0.89444], - "10928": [0.19667, 0.69667, 0, 0, 0.89444] - }, - "Main-BoldItalic": { - "33": [0, 0.69444, 0.11417, 0, 0.38611], - "34": [0, 0.69444, 0.07939, 0, 0.62055], - "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], - "37": [0.05556, 0.75, 0.12861, 0, 0.94444], - "38": [0, 0.69444, 0.08528, 0, 0.88555], - "39": [0, 0.69444, 0.12945, 0, 0.35555], - "40": [0.25, 0.75, 0.15806, 0, 0.47333], - "41": [0.25, 0.75, 0.03306, 0, 0.47333], - "42": [0, 0.75, 0.14333, 0, 0.59111], - "43": [0.10333, 0.60333, 0.03306, 0, 0.88555], - "44": [0.19444, 0.14722, 0, 0, 0.35555], - "45": [0, 0.44444, 0.02611, 0, 0.41444], - "46": [0, 0.14722, 0, 0, 0.35555], - "47": [0.25, 0.75, 0.15806, 0, 0.59111], - "48": [0, 0.64444, 0.13167, 0, 0.59111], - "49": [0, 0.64444, 0.13167, 0, 0.59111], - "50": [0, 0.64444, 0.13167, 0, 0.59111], - "51": [0, 0.64444, 0.13167, 0, 0.59111], - "52": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "53": [0, 0.64444, 0.13167, 0, 0.59111], - "54": [0, 0.64444, 0.13167, 0, 0.59111], - "55": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "56": [0, 0.64444, 0.13167, 0, 0.59111], - "57": [0, 0.64444, 0.13167, 0, 0.59111], - "58": [0, 0.44444, 0.06695, 0, 0.35555], - "59": [0.19444, 0.44444, 0.06695, 0, 0.35555], - "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555], - "63": [0, 0.69444, 0.11472, 0, 0.59111], - "64": [0, 0.69444, 0.09208, 0, 0.88555], - "65": [0, 0.68611, 0, 0, 0.86555], - "66": [0, 0.68611, 0.0992, 0, 0.81666], - "67": [0, 0.68611, 0.14208, 0, 0.82666], - "68": [0, 0.68611, 0.09062, 0, 0.87555], - "69": [0, 0.68611, 0.11431, 0, 0.75666], - "70": [0, 0.68611, 0.12903, 0, 0.72722], - "71": [0, 0.68611, 0.07347, 0, 0.89527], - "72": [0, 0.68611, 0.17208, 0, 0.8961], - "73": [0, 0.68611, 0.15681, 0, 0.47166], - "74": [0, 0.68611, 0.145, 0, 0.61055], - "75": [0, 0.68611, 0.14208, 0, 0.89499], - "76": [0, 0.68611, 0, 0, 0.69777], - "77": [0, 0.68611, 0.17208, 0, 1.07277], - "78": [0, 0.68611, 0.17208, 0, 0.8961], - "79": [0, 0.68611, 0.09062, 0, 0.85499], - "80": [0, 0.68611, 0.0992, 0, 0.78721], - "81": [0.19444, 0.68611, 0.09062, 0, 0.85499], - "82": [0, 0.68611, 0.02559, 0, 0.85944], - "83": [0, 0.68611, 0.11264, 0, 0.64999], - "84": [0, 0.68611, 0.12903, 0, 0.7961], - "85": [0, 0.68611, 0.17208, 0, 0.88083], - "86": [0, 0.68611, 0.18625, 0, 0.86555], - "87": [0, 0.68611, 0.18625, 0, 1.15999], - "88": [0, 0.68611, 0.15681, 0, 0.86555], - "89": [0, 0.68611, 0.19803, 0, 0.86555], - "90": [0, 0.68611, 0.14208, 0, 0.70888], - "91": [0.25, 0.75, 0.1875, 0, 0.35611], - "93": [0.25, 0.75, 0.09972, 0, 0.35611], - "94": [0, 0.69444, 0.06709, 0, 0.59111], - "95": [0.31, 0.13444, 0.09811, 0, 0.59111], - "97": [0, 0.44444, 0.09426, 0, 0.59111], - "98": [0, 0.69444, 0.07861, 0, 0.53222], - "99": [0, 0.44444, 0.05222, 0, 0.53222], - "100": [0, 0.69444, 0.10861, 0, 0.59111], - "101": [0, 0.44444, 0.085, 0, 0.53222], - "102": [0.19444, 0.69444, 0.21778, 0, 0.4], - "103": [0.19444, 0.44444, 0.105, 0, 0.53222], - "104": [0, 0.69444, 0.09426, 0, 0.59111], - "105": [0, 0.69326, 0.11387, 0, 0.35555], - "106": [0.19444, 0.69326, 0.1672, 0, 0.35555], - "107": [0, 0.69444, 0.11111, 0, 0.53222], - "108": [0, 0.69444, 0.10861, 0, 0.29666], - "109": [0, 0.44444, 0.09426, 0, 0.94444], - "110": [0, 0.44444, 0.09426, 0, 0.64999], - "111": [0, 0.44444, 0.07861, 0, 0.59111], - "112": [0.19444, 0.44444, 0.07861, 0, 0.59111], - "113": [0.19444, 0.44444, 0.105, 0, 0.53222], - "114": [0, 0.44444, 0.11111, 0, 0.50167], - "115": [0, 0.44444, 0.08167, 0, 0.48694], - "116": [0, 0.63492, 0.09639, 0, 0.385], - "117": [0, 0.44444, 0.09426, 0, 0.62055], - "118": [0, 0.44444, 0.11111, 0, 0.53222], - "119": [0, 0.44444, 0.11111, 0, 0.76777], - "120": [0, 0.44444, 0.12583, 0, 0.56055], - "121": [0.19444, 0.44444, 0.105, 0, 0.56166], - "122": [0, 0.44444, 0.13889, 0, 0.49055], - "126": [0.35, 0.34444, 0.11472, 0, 0.59111], - "163": [0, 0.69444, 0, 0, 0.86853], - "168": [0, 0.69444, 0.11473, 0, 0.59111], - "176": [0, 0.69444, 0, 0, 0.94888], - "198": [0, 0.68611, 0.11431, 0, 1.02277], - "216": [0.04861, 0.73472, 0.09062, 0, 0.88555], - "223": [0.19444, 0.69444, 0.09736, 0, 0.665], - "230": [0, 0.44444, 0.085, 0, 0.82666], - "248": [0.09722, 0.54167, 0.09458, 0, 0.59111], - "305": [0, 0.44444, 0.09426, 0, 0.35555], - "338": [0, 0.68611, 0.11431, 0, 1.14054], - "339": [0, 0.44444, 0.085, 0, 0.82666], - "567": [0.19444, 0.44444, 0.04611, 0, 0.385], - "710": [0, 0.69444, 0.06709, 0, 0.59111], - "711": [0, 0.63194, 0.08271, 0, 0.59111], - "713": [0, 0.59444, 0.10444, 0, 0.59111], - "714": [0, 0.69444, 0.08528, 0, 0.59111], - "715": [0, 0.69444, 0, 0, 0.59111], - "728": [0, 0.69444, 0.10333, 0, 0.59111], - "729": [0, 0.69444, 0.12945, 0, 0.35555], - "730": [0, 0.69444, 0, 0, 0.94888], - "732": [0, 0.69444, 0.11472, 0, 0.59111], - "733": [0, 0.69444, 0.11472, 0, 0.59111], - "915": [0, 0.68611, 0.12903, 0, 0.69777], - "916": [0, 0.68611, 0, 0, 0.94444], - "920": [0, 0.68611, 0.09062, 0, 0.88555], - "923": [0, 0.68611, 0, 0, 0.80666], - "926": [0, 0.68611, 0.15092, 0, 0.76777], - "928": [0, 0.68611, 0.17208, 0, 0.8961], - "931": [0, 0.68611, 0.11431, 0, 0.82666], - "933": [0, 0.68611, 0.10778, 0, 0.88555], - "934": [0, 0.68611, 0.05632, 0, 0.82666], - "936": [0, 0.68611, 0.10778, 0, 0.88555], - "937": [0, 0.68611, 0.0992, 0, 0.82666], - "8211": [0, 0.44444, 0.09811, 0, 0.59111], - "8212": [0, 0.44444, 0.09811, 0, 1.18221], - "8216": [0, 0.69444, 0.12945, 0, 0.35555], - "8217": [0, 0.69444, 0.12945, 0, 0.35555], - "8220": [0, 0.69444, 0.16772, 0, 0.62055], - "8221": [0, 0.69444, 0.07939, 0, 0.62055] - }, - "Main-Italic": { - "33": [0, 0.69444, 0.12417, 0, 0.30667], - "34": [0, 0.69444, 0.06961, 0, 0.51444], - "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], - "37": [0.05556, 0.75, 0.13639, 0, 0.81777], - "38": [0, 0.69444, 0.09694, 0, 0.76666], - "39": [0, 0.69444, 0.12417, 0, 0.30667], - "40": [0.25, 0.75, 0.16194, 0, 0.40889], - "41": [0.25, 0.75, 0.03694, 0, 0.40889], - "42": [0, 0.75, 0.14917, 0, 0.51111], - "43": [0.05667, 0.56167, 0.03694, 0, 0.76666], - "44": [0.19444, 0.10556, 0, 0, 0.30667], - "45": [0, 0.43056, 0.02826, 0, 0.35778], - "46": [0, 0.10556, 0, 0, 0.30667], - "47": [0.25, 0.75, 0.16194, 0, 0.51111], - "48": [0, 0.64444, 0.13556, 0, 0.51111], - "49": [0, 0.64444, 0.13556, 0, 0.51111], - "50": [0, 0.64444, 0.13556, 0, 0.51111], - "51": [0, 0.64444, 0.13556, 0, 0.51111], - "52": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "53": [0, 0.64444, 0.13556, 0, 0.51111], - "54": [0, 0.64444, 0.13556, 0, 0.51111], - "55": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "56": [0, 0.64444, 0.13556, 0, 0.51111], - "57": [0, 0.64444, 0.13556, 0, 0.51111], - "58": [0, 0.43056, 0.0582, 0, 0.30667], - "59": [0.19444, 0.43056, 0.0582, 0, 0.30667], - "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666], - "63": [0, 0.69444, 0.1225, 0, 0.51111], - "64": [0, 0.69444, 0.09597, 0, 0.76666], - "65": [0, 0.68333, 0, 0, 0.74333], - "66": [0, 0.68333, 0.10257, 0, 0.70389], - "67": [0, 0.68333, 0.14528, 0, 0.71555], - "68": [0, 0.68333, 0.09403, 0, 0.755], - "69": [0, 0.68333, 0.12028, 0, 0.67833], - "70": [0, 0.68333, 0.13305, 0, 0.65277], - "71": [0, 0.68333, 0.08722, 0, 0.77361], - "72": [0, 0.68333, 0.16389, 0, 0.74333], - "73": [0, 0.68333, 0.15806, 0, 0.38555], - "74": [0, 0.68333, 0.14028, 0, 0.525], - "75": [0, 0.68333, 0.14528, 0, 0.76888], - "76": [0, 0.68333, 0, 0, 0.62722], - "77": [0, 0.68333, 0.16389, 0, 0.89666], - "78": [0, 0.68333, 0.16389, 0, 0.74333], - "79": [0, 0.68333, 0.09403, 0, 0.76666], - "80": [0, 0.68333, 0.10257, 0, 0.67833], - "81": [0.19444, 0.68333, 0.09403, 0, 0.76666], - "82": [0, 0.68333, 0.03868, 0, 0.72944], - "83": [0, 0.68333, 0.11972, 0, 0.56222], - "84": [0, 0.68333, 0.13305, 0, 0.71555], - "85": [0, 0.68333, 0.16389, 0, 0.74333], - "86": [0, 0.68333, 0.18361, 0, 0.74333], - "87": [0, 0.68333, 0.18361, 0, 0.99888], - "88": [0, 0.68333, 0.15806, 0, 0.74333], - "89": [0, 0.68333, 0.19383, 0, 0.74333], - "90": [0, 0.68333, 0.14528, 0, 0.61333], - "91": [0.25, 0.75, 0.1875, 0, 0.30667], - "93": [0.25, 0.75, 0.10528, 0, 0.30667], - "94": [0, 0.69444, 0.06646, 0, 0.51111], - "95": [0.31, 0.12056, 0.09208, 0, 0.51111], - "97": [0, 0.43056, 0.07671, 0, 0.51111], - "98": [0, 0.69444, 0.06312, 0, 0.46], - "99": [0, 0.43056, 0.05653, 0, 0.46], - "100": [0, 0.69444, 0.10333, 0, 0.51111], - "101": [0, 0.43056, 0.07514, 0, 0.46], - "102": [0.19444, 0.69444, 0.21194, 0, 0.30667], - "103": [0.19444, 0.43056, 0.08847, 0, 0.46], - "104": [0, 0.69444, 0.07671, 0, 0.51111], - "105": [0, 0.65536, 0.1019, 0, 0.30667], - "106": [0.19444, 0.65536, 0.14467, 0, 0.30667], - "107": [0, 0.69444, 0.10764, 0, 0.46], - "108": [0, 0.69444, 0.10333, 0, 0.25555], - "109": [0, 0.43056, 0.07671, 0, 0.81777], - "110": [0, 0.43056, 0.07671, 0, 0.56222], - "111": [0, 0.43056, 0.06312, 0, 0.51111], - "112": [0.19444, 0.43056, 0.06312, 0, 0.51111], - "113": [0.19444, 0.43056, 0.08847, 0, 0.46], - "114": [0, 0.43056, 0.10764, 0, 0.42166], - "115": [0, 0.43056, 0.08208, 0, 0.40889], - "116": [0, 0.61508, 0.09486, 0, 0.33222], - "117": [0, 0.43056, 0.07671, 0, 0.53666], - "118": [0, 0.43056, 0.10764, 0, 0.46], - "119": [0, 0.43056, 0.10764, 0, 0.66444], - "120": [0, 0.43056, 0.12042, 0, 0.46389], - "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], - "122": [0, 0.43056, 0.12292, 0, 0.40889], - "126": [0.35, 0.31786, 0.11585, 0, 0.51111], - "163": [0, 0.69444, 0, 0, 0.76909], - "168": [0, 0.66786, 0.10474, 0, 0.51111], - "176": [0, 0.69444, 0, 0, 0.83129], - "198": [0, 0.68333, 0.12028, 0, 0.88277], - "216": [0.04861, 0.73194, 0.09403, 0, 0.76666], - "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], - "230": [0, 0.43056, 0.07514, 0, 0.71555], - "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], - "305": [0, 0.43056, 0, 0.02778, 0.32246], - "338": [0, 0.68333, 0.12028, 0, 0.98499], - "339": [0, 0.43056, 0.07514, 0, 0.71555], - "567": [0.19444, 0.43056, 0, 0.08334, 0.38403], - "710": [0, 0.69444, 0.06646, 0, 0.51111], - "711": [0, 0.62847, 0.08295, 0, 0.51111], - "713": [0, 0.56167, 0.10333, 0, 0.51111], - "714": [0, 0.69444, 0.09694, 0, 0.51111], - "715": [0, 0.69444, 0, 0, 0.51111], - "728": [0, 0.69444, 0.10806, 0, 0.51111], - "729": [0, 0.66786, 0.11752, 0, 0.30667], - "730": [0, 0.69444, 0, 0, 0.83129], - "732": [0, 0.66786, 0.11585, 0, 0.51111], - "733": [0, 0.69444, 0.1225, 0, 0.51111], - "915": [0, 0.68333, 0.13305, 0, 0.62722], - "916": [0, 0.68333, 0, 0, 0.81777], - "920": [0, 0.68333, 0.09403, 0, 0.76666], - "923": [0, 0.68333, 0, 0, 0.69222], - "926": [0, 0.68333, 0.15294, 0, 0.66444], - "928": [0, 0.68333, 0.16389, 0, 0.74333], - "931": [0, 0.68333, 0.12028, 0, 0.71555], - "933": [0, 0.68333, 0.11111, 0, 0.76666], - "934": [0, 0.68333, 0.05986, 0, 0.71555], - "936": [0, 0.68333, 0.11111, 0, 0.76666], - "937": [0, 0.68333, 0.10257, 0, 0.71555], - "8211": [0, 0.43056, 0.09208, 0, 0.51111], - "8212": [0, 0.43056, 0.09208, 0, 1.02222], - "8216": [0, 0.69444, 0.12417, 0, 0.30667], - "8217": [0, 0.69444, 0.12417, 0, 0.30667], - "8220": [0, 0.69444, 0.1685, 0, 0.51444], - "8221": [0, 0.69444, 0.06961, 0, 0.51444], - "8463": [0, 0.68889, 0, 0, 0.54028] - }, - "Main-Regular": { - "32": [0, 0, 0, 0, 0], - "33": [0, 0.69444, 0, 0, 0.27778], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.77778], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.19444, 0.10556, 0, 0, 0.27778], - "45": [0, 0.43056, 0, 0, 0.33333], - "46": [0, 0.10556, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.64444, 0, 0, 0.5], - "49": [0, 0.64444, 0, 0, 0.5], - "50": [0, 0.64444, 0, 0, 0.5], - "51": [0, 0.64444, 0, 0, 0.5], - "52": [0, 0.64444, 0, 0, 0.5], - "53": [0, 0.64444, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0, 0.64444, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0, 0.64444, 0, 0, 0.5], - "58": [0, 0.43056, 0, 0, 0.27778], - "59": [0.19444, 0.43056, 0, 0, 0.27778], - "60": [0.0391, 0.5391, 0, 0, 0.77778], - "61": [-0.13313, 0.36687, 0, 0, 0.77778], - "62": [0.0391, 0.5391, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.77778], - "65": [0, 0.68333, 0, 0, 0.75], - "66": [0, 0.68333, 0, 0, 0.70834], - "67": [0, 0.68333, 0, 0, 0.72222], - "68": [0, 0.68333, 0, 0, 0.76389], - "69": [0, 0.68333, 0, 0, 0.68056], - "70": [0, 0.68333, 0, 0, 0.65278], - "71": [0, 0.68333, 0, 0, 0.78472], - "72": [0, 0.68333, 0, 0, 0.75], - "73": [0, 0.68333, 0, 0, 0.36111], - "74": [0, 0.68333, 0, 0, 0.51389], - "75": [0, 0.68333, 0, 0, 0.77778], - "76": [0, 0.68333, 0, 0, 0.625], - "77": [0, 0.68333, 0, 0, 0.91667], - "78": [0, 0.68333, 0, 0, 0.75], - "79": [0, 0.68333, 0, 0, 0.77778], - "80": [0, 0.68333, 0, 0, 0.68056], - "81": [0.19444, 0.68333, 0, 0, 0.77778], - "82": [0, 0.68333, 0, 0, 0.73611], - "83": [0, 0.68333, 0, 0, 0.55556], - "84": [0, 0.68333, 0, 0, 0.72222], - "85": [0, 0.68333, 0, 0, 0.75], - "86": [0, 0.68333, 0.01389, 0, 0.75], - "87": [0, 0.68333, 0.01389, 0, 1.02778], - "88": [0, 0.68333, 0, 0, 0.75], - "89": [0, 0.68333, 0.025, 0, 0.75], - "90": [0, 0.68333, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.27778], - "92": [0.25, 0.75, 0, 0, 0.5], - "93": [0.25, 0.75, 0, 0, 0.27778], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.31, 0.12056, 0.02778, 0, 0.5], - "97": [0, 0.43056, 0, 0, 0.5], - "98": [0, 0.69444, 0, 0, 0.55556], - "99": [0, 0.43056, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.55556], - "101": [0, 0.43056, 0, 0, 0.44445], - "102": [0, 0.69444, 0.07778, 0, 0.30556], - "103": [0.19444, 0.43056, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.55556], - "105": [0, 0.66786, 0, 0, 0.27778], - "106": [0.19444, 0.66786, 0, 0, 0.30556], - "107": [0, 0.69444, 0, 0, 0.52778], - "108": [0, 0.69444, 0, 0, 0.27778], - "109": [0, 0.43056, 0, 0, 0.83334], - "110": [0, 0.43056, 0, 0, 0.55556], - "111": [0, 0.43056, 0, 0, 0.5], - "112": [0.19444, 0.43056, 0, 0, 0.55556], - "113": [0.19444, 0.43056, 0, 0, 0.52778], - "114": [0, 0.43056, 0, 0, 0.39167], - "115": [0, 0.43056, 0, 0, 0.39445], - "116": [0, 0.61508, 0, 0, 0.38889], - "117": [0, 0.43056, 0, 0, 0.55556], - "118": [0, 0.43056, 0.01389, 0, 0.52778], - "119": [0, 0.43056, 0.01389, 0, 0.72222], - "120": [0, 0.43056, 0, 0, 0.52778], - "121": [0.19444, 0.43056, 0.01389, 0, 0.52778], - "122": [0, 0.43056, 0, 0, 0.44445], - "123": [0.25, 0.75, 0, 0, 0.5], - "124": [0.25, 0.75, 0, 0, 0.27778], - "125": [0.25, 0.75, 0, 0, 0.5], - "126": [0.35, 0.31786, 0, 0, 0.5], - "160": [0, 0, 0, 0, 0], - "168": [0, 0.66786, 0, 0, 0.5], - "172": [0, 0.43056, 0, 0, 0.66667], - "176": [0, 0.69444, 0, 0, 0.75], - "177": [0.08333, 0.58333, 0, 0, 0.77778], - "198": [0, 0.68333, 0, 0, 0.90278], - "215": [0.08333, 0.58333, 0, 0, 0.77778], - "216": [0.04861, 0.73194, 0, 0, 0.77778], - "223": [0, 0.69444, 0, 0, 0.5], - "230": [0, 0.43056, 0, 0, 0.72222], - "247": [0.08333, 0.58333, 0, 0, 0.77778], - "248": [0.09722, 0.52778, 0, 0, 0.5], - "305": [0, 0.43056, 0, 0, 0.27778], - "338": [0, 0.68333, 0, 0, 1.01389], - "339": [0, 0.43056, 0, 0, 0.77778], - "567": [0.19444, 0.43056, 0, 0, 0.30556], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.62847, 0, 0, 0.5], - "713": [0, 0.56778, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.66786, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.75], - "732": [0, 0.66786, 0, 0, 0.5], - "733": [0, 0.69444, 0, 0, 0.5], - "824": [0.19444, 0.69444, 0, 0, 0], - "915": [0, 0.68333, 0, 0, 0.625], - "916": [0, 0.68333, 0, 0, 0.83334], - "920": [0, 0.68333, 0, 0, 0.77778], - "923": [0, 0.68333, 0, 0, 0.69445], - "926": [0, 0.68333, 0, 0, 0.66667], - "928": [0, 0.68333, 0, 0, 0.75], - "931": [0, 0.68333, 0, 0, 0.72222], - "933": [0, 0.68333, 0, 0, 0.77778], - "934": [0, 0.68333, 0, 0, 0.72222], - "936": [0, 0.68333, 0, 0, 0.77778], - "937": [0, 0.68333, 0, 0, 0.72222], - "8211": [0, 0.43056, 0.02778, 0, 0.5], - "8212": [0, 0.43056, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5], - "8224": [0.19444, 0.69444, 0, 0, 0.44445], - "8225": [0.19444, 0.69444, 0, 0, 0.44445], - "8230": [0, 0.12, 0, 0, 1015], - "8242": [0, 0.55556, 0, 0, 0.275], - "8407": [0, 0.71444, 0.15382, 0, 0.5], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8465": [0, 0.69444, 0, 0, 0.72222], - "8467": [0, 0.69444, 0, 0.11111, 0.41667], - "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646], - "8476": [0, 0.69444, 0, 0, 0.72222], - "8501": [0, 0.69444, 0, 0, 0.61111], - "8592": [-0.13313, 0.36687, 0, 0, 1.0], - "8593": [0.19444, 0.69444, 0, 0, 0.5], - "8594": [-0.13313, 0.36687, 0, 0, 1.0], - "8595": [0.19444, 0.69444, 0, 0, 0.5], - "8596": [-0.13313, 0.36687, 0, 0, 1.0], - "8597": [0.25, 0.75, 0, 0, 0.5], - "8598": [0.19444, 0.69444, 0, 0, 1.0], - "8599": [0.19444, 0.69444, 0, 0, 1.0], - "8600": [0.19444, 0.69444, 0, 0, 1.0], - "8601": [0.19444, 0.69444, 0, 0, 1.0], - "8614": [0.011, 0.511, 0, 0, 889], - "8617": [0.011, 0.511, 0, 0, 1015], - "8618": [0.011, 0.511, 0, 0, 1015], - "8636": [-0.13313, 0.36687, 0, 0, 1.0], - "8637": [-0.13313, 0.36687, 0, 0, 1.0], - "8640": [-0.13313, 0.36687, 0, 0, 1.0], - "8641": [-0.13313, 0.36687, 0, 0, 1.0], - "8652": [0.011, 0.671, 0, 0, 889], - "8656": [-0.13313, 0.36687, 0, 0, 1.0], - "8657": [0.19444, 0.69444, 0, 0, 0.61111], - "8658": [-0.13313, 0.36687, 0, 0, 1.0], - "8659": [0.19444, 0.69444, 0, 0, 0.61111], - "8660": [-0.13313, 0.36687, 0, 0, 1.0], - "8661": [0.25, 0.75, 0, 0, 0.61111], - "8704": [0, 0.69444, 0, 0, 0.55556], - "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309], - "8707": [0, 0.69444, 0, 0, 0.55556], - "8709": [0.05556, 0.75, 0, 0, 0.5], - "8711": [0, 0.68333, 0, 0, 0.83334], - "8712": [0.0391, 0.5391, 0, 0, 0.66667], - "8715": [0.0391, 0.5391, 0, 0, 0.66667], - "8722": [0.08333, 0.58333, 0, 0, 0.77778], - "8723": [0.08333, 0.58333, 0, 0, 0.77778], - "8725": [0.25, 0.75, 0, 0, 0.5], - "8726": [0.25, 0.75, 0, 0, 0.5], - "8727": [-0.03472, 0.46528, 0, 0, 0.5], - "8728": [-0.05555, 0.44445, 0, 0, 0.5], - "8729": [-0.05555, 0.44445, 0, 0, 0.5], - "8730": [0.2, 0.8, 0, 0, 0.83334], - "8733": [0, 0.43056, 0, 0, 0.77778], - "8734": [0, 0.43056, 0, 0, 1.0], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.27778], - "8741": [0.25, 0.75, 0, 0, 0.5], - "8743": [0, 0.55556, 0, 0, 0.66667], - "8744": [0, 0.55556, 0, 0, 0.66667], - "8745": [0, 0.55556, 0, 0, 0.66667], - "8746": [0, 0.55556, 0, 0, 0.66667], - "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8768": [0.19444, 0.69444, 0, 0, 0.27778], - "8771": [-0.03625, 0.46375, 0, 0, 0.77778], - "8773": [-0.022, 0.589, 0, 0, 667], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8781": [-0.03625, 0.46375, 0, 0, 0.77778], - "8784": [-0.133, 0.67, 0, 0, 666], - "8800": [0.215, 0.716, 0, 0, 666], - "8801": [-0.03625, 0.46375, 0, 0, 0.77778], - "8804": [0.13597, 0.63597, 0, 0, 0.77778], - "8805": [0.13597, 0.63597, 0, 0, 0.77778], - "8810": [0.0391, 0.5391, 0, 0, 1.0], - "8811": [0.0391, 0.5391, 0, 0, 1.0], - "8826": [0.0391, 0.5391, 0, 0, 0.77778], - "8827": [0.0391, 0.5391, 0, 0, 0.77778], - "8834": [0.0391, 0.5391, 0, 0, 0.77778], - "8835": [0.0391, 0.5391, 0, 0, 0.77778], - "8838": [0.13597, 0.63597, 0, 0, 0.77778], - "8839": [0.13597, 0.63597, 0, 0, 0.77778], - "8846": [0, 0.55556, 0, 0, 0.66667], - "8849": [0.13597, 0.63597, 0, 0, 0.77778], - "8850": [0.13597, 0.63597, 0, 0, 0.77778], - "8851": [0, 0.55556, 0, 0, 0.66667], - "8852": [0, 0.55556, 0, 0, 0.66667], - "8853": [0.08333, 0.58333, 0, 0, 0.77778], - "8854": [0.08333, 0.58333, 0, 0, 0.77778], - "8855": [0.08333, 0.58333, 0, 0, 0.77778], - "8856": [0.08333, 0.58333, 0, 0, 0.77778], - "8857": [0.08333, 0.58333, 0, 0, 0.77778], - "8866": [0, 0.69444, 0, 0, 0.61111], - "8867": [0, 0.69444, 0, 0, 0.61111], - "8868": [0, 0.69444, 0, 0, 0.77778], - "8869": [0, 0.69444, 0, 0, 0.77778], - "8872": [0.249, 0.75, 0, 0, 692], - "8900": [-0.05555, 0.44445, 0, 0, 0.5], - "8901": [-0.05555, 0.44445, 0, 0, 0.27778], - "8902": [-0.03472, 0.46528, 0, 0, 0.5], - "8904": [0.005, 0.505, 0, 0, 847], - "8942": [0.03, 0.9, 0, 0, 121], - "8943": [-0.19, 0.31, 0, 0, 1015], - "8945": [-0.1, 0.82, 0, 0, 1015], - "8968": [0.25, 0.75, 0, 0, 0.44445], - "8969": [0.25, 0.75, 0, 0, 0.44445], - "8970": [0.25, 0.75, 0, 0, 0.44445], - "8971": [0.25, 0.75, 0, 0, 0.44445], - "8994": [-0.14236, 0.35764, 0, 0, 1.0], - "8995": [-0.14236, 0.35764, 0, 0, 1.0], - "9136": [0.244, 0.744, 0, 0, 301], - "9137": [0.244, 0.744, 0, 0, 301], - "9651": [0.19444, 0.69444, 0, 0, 0.88889], - "9657": [-0.03472, 0.46528, 0, 0, 0.5], - "9661": [0.19444, 0.69444, 0, 0, 0.88889], - "9667": [-0.03472, 0.46528, 0, 0, 0.5], - "9711": [0.19444, 0.69444, 0, 0, 1.0], - "9824": [0.12963, 0.69444, 0, 0, 0.77778], - "9825": [0.12963, 0.69444, 0, 0, 0.77778], - "9826": [0.12963, 0.69444, 0, 0, 0.77778], - "9827": [0.12963, 0.69444, 0, 0, 0.77778], - "9837": [0, 0.75, 0, 0, 0.38889], - "9838": [0.19444, 0.69444, 0, 0, 0.38889], - "9839": [0.19444, 0.69444, 0, 0, 0.38889], - "10216": [0.25, 0.75, 0, 0, 0.38889], - "10217": [0.25, 0.75, 0, 0, 0.38889], - "10222": [0.244, 0.744, 0, 0, 184], - "10223": [0.244, 0.744, 0, 0, 184], - "10229": [0.011, 0.511, 0, 0, 1470], - "10230": [0.011, 0.511, 0, 0, 1469], - "10231": [0.011, 0.511, 0, 0, 1748], - "10232": [0.024, 0.525, 0, 0, 1497], - "10233": [0.024, 0.525, 0, 0, 1526], - "10234": [0.024, 0.525, 0, 0, 1746], - "10236": [0.011, 0.511, 0, 0, 1498], - "10815": [0, 0.68333, 0, 0, 0.75], - "10927": [0.13597, 0.63597, 0, 0, 0.77778], - "10928": [0.13597, 0.63597, 0, 0, 0.77778] - }, - "Math-BoldItalic": { - "47": [0.19444, 0.69444, 0, 0, 0], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0.04835, 0, 0.8664], - "67": [0, 0.68611, 0.06979, 0, 0.81694], - "68": [0, 0.68611, 0.03194, 0, 0.93812], - "69": [0, 0.68611, 0.05451, 0, 0.81007], - "70": [0, 0.68611, 0.15972, 0, 0.68889], - "71": [0, 0.68611, 0, 0, 0.88673], - "72": [0, 0.68611, 0.08229, 0, 0.98229], - "73": [0, 0.68611, 0.07778, 0, 0.51111], - "74": [0, 0.68611, 0.10069, 0, 0.63125], - "75": [0, 0.68611, 0.06979, 0, 0.97118], - "76": [0, 0.68611, 0, 0, 0.75555], - "77": [0, 0.68611, 0.11424, 0, 1.14201], - "78": [0, 0.68611, 0.11424, 0, 0.95034], - "79": [0, 0.68611, 0.03194, 0, 0.83666], - "80": [0, 0.68611, 0.15972, 0, 0.72309], - "81": [0.19444, 0.68611, 0, 0, 0.86861], - "82": [0, 0.68611, 0.00421, 0, 0.87235], - "83": [0, 0.68611, 0.05382, 0, 0.69271], - "84": [0, 0.68611, 0.15972, 0, 0.63663], - "85": [0, 0.68611, 0.11424, 0, 0.80027], - "86": [0, 0.68611, 0.25555, 0, 0.67778], - "87": [0, 0.68611, 0.15972, 0, 1.09305], - "88": [0, 0.68611, 0.07778, 0, 0.94722], - "89": [0, 0.68611, 0.25555, 0, 0.67458], - "90": [0, 0.68611, 0.06979, 0, 0.77257], - "97": [0, 0.44444, 0, 0, 0.63287], - "98": [0, 0.69444, 0, 0, 0.52083], - "99": [0, 0.44444, 0, 0, 0.51342], - "100": [0, 0.69444, 0, 0, 0.60972], - "101": [0, 0.44444, 0, 0, 0.55361], - "102": [0.19444, 0.69444, 0.11042, 0, 0.56806], - "103": [0.19444, 0.44444, 0.03704, 0, 0.5449], - "104": [0, 0.69444, 0, 0, 0.66759], - "105": [0, 0.69326, 0, 0, 0.4048], - "106": [0.19444, 0.69326, 0.0622, 0, 0.47083], - "107": [0, 0.69444, 0.01852, 0, 0.6037], - "108": [0, 0.69444, 0.0088, 0, 0.34815], - "109": [0, 0.44444, 0, 0, 1.0324], - "110": [0, 0.44444, 0, 0, 0.71296], - "111": [0, 0.44444, 0, 0, 0.58472], - "112": [0.19444, 0.44444, 0, 0, 0.60092], - "113": [0.19444, 0.44444, 0.03704, 0, 0.54213], - "114": [0, 0.44444, 0.03194, 0, 0.5287], - "115": [0, 0.44444, 0, 0, 0.53125], - "116": [0, 0.63492, 0, 0, 0.41528], - "117": [0, 0.44444, 0, 0, 0.68102], - "118": [0, 0.44444, 0.03704, 0, 0.56666], - "119": [0, 0.44444, 0.02778, 0, 0.83148], - "120": [0, 0.44444, 0, 0, 0.65903], - "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], - "122": [0, 0.44444, 0.04213, 0, 0.55509], - "915": [0, 0.68611, 0.15972, 0, 0.65694], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0.03194, 0, 0.86722], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0.07458, 0, 0.84125], - "928": [0, 0.68611, 0.08229, 0, 0.98229], - "931": [0, 0.68611, 0.05451, 0, 0.88507], - "933": [0, 0.68611, 0.15972, 0, 0.67083], - "934": [0, 0.68611, 0, 0, 0.76666], - "936": [0, 0.68611, 0.11653, 0, 0.71402], - "937": [0, 0.68611, 0.04835, 0, 0.8789], - "945": [0, 0.44444, 0, 0, 0.76064], - "946": [0.19444, 0.69444, 0.03403, 0, 0.65972], - "947": [0.19444, 0.44444, 0.06389, 0, 0.59003], - "948": [0, 0.69444, 0.03819, 0, 0.52222], - "949": [0, 0.44444, 0, 0, 0.52882], - "950": [0.19444, 0.69444, 0.06215, 0, 0.50833], - "951": [0.19444, 0.44444, 0.03704, 0, 0.6], - "952": [0, 0.69444, 0.03194, 0, 0.5618], - "953": [0, 0.44444, 0, 0, 0.41204], - "954": [0, 0.44444, 0, 0, 0.66759], - "955": [0, 0.69444, 0, 0, 0.67083], - "956": [0.19444, 0.44444, 0, 0, 0.70787], - "957": [0, 0.44444, 0.06898, 0, 0.57685], - "958": [0.19444, 0.69444, 0.03021, 0, 0.50833], - "959": [0, 0.44444, 0, 0, 0.58472], - "960": [0, 0.44444, 0.03704, 0, 0.68241], - "961": [0.19444, 0.44444, 0, 0, 0.6118], - "962": [0.09722, 0.44444, 0.07917, 0, 0.42361], - "963": [0, 0.44444, 0.03704, 0, 0.68588], - "964": [0, 0.44444, 0.13472, 0, 0.52083], - "965": [0, 0.44444, 0.03704, 0, 0.63055], - "966": [0.19444, 0.44444, 0, 0, 0.74722], - "967": [0.19444, 0.44444, 0, 0, 0.71805], - "968": [0.19444, 0.69444, 0.03704, 0, 0.75833], - "969": [0, 0.44444, 0.03704, 0, 0.71782], - "977": [0, 0.69444, 0, 0, 0.69155], - "981": [0.19444, 0.69444, 0, 0, 0.7125], - "982": [0, 0.44444, 0.03194, 0, 0.975], - "1009": [0.19444, 0.44444, 0, 0, 0.6118], - "1013": [0, 0.44444, 0, 0, 0.48333] - }, - "Math-Italic": { - "47": [0.19444, 0.69444, 0, 0, 0], - "65": [0, 0.68333, 0, 0.13889, 0.75], - "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], - "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], - "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], - "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], - "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], - "71": [0, 0.68333, 0, 0.08334, 0.78625], - "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], - "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], - "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], - "76": [0, 0.68333, 0, 0.02778, 0.68056], - "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], - "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], - "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], - "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], - "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], - "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], - "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], - "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], - "86": [0, 0.68333, 0.22222, 0, 0.58333], - "87": [0, 0.68333, 0.13889, 0, 0.94445], - "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], - "89": [0, 0.68333, 0.22222, 0, 0.58056], - "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], - "97": [0, 0.43056, 0, 0, 0.52859], - "98": [0, 0.69444, 0, 0, 0.42917], - "99": [0, 0.43056, 0, 0.05556, 0.43276], - "100": [0, 0.69444, 0, 0.16667, 0.52049], - "101": [0, 0.43056, 0, 0.05556, 0.46563], - "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], - "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], - "104": [0, 0.69444, 0, 0, 0.57616], - "105": [0, 0.65952, 0, 0, 0.34451], - "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], - "107": [0, 0.69444, 0.03148, 0, 0.5206], - "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], - "109": [0, 0.43056, 0, 0, 0.87801], - "110": [0, 0.43056, 0, 0, 0.60023], - "111": [0, 0.43056, 0, 0.05556, 0.48472], - "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], - "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], - "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], - "115": [0, 0.43056, 0, 0.05556, 0.46875], - "116": [0, 0.61508, 0, 0.08334, 0.36111], - "117": [0, 0.43056, 0, 0.02778, 0.57246], - "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], - "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], - "120": [0, 0.43056, 0, 0.02778, 0.57153], - "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], - "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], - "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], - "916": [0, 0.68333, 0, 0.16667, 0.83334], - "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "923": [0, 0.68333, 0, 0.16667, 0.69445], - "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], - "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], - "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], - "934": [0, 0.68333, 0, 0.08334, 0.66667], - "936": [0, 0.68333, 0.11, 0.05556, 0.61222], - "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], - "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], - "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], - "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], - "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], - "949": [0, 0.43056, 0, 0.08334, 0.46632], - "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], - "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], - "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], - "953": [0, 0.43056, 0, 0.05556, 0.35394], - "954": [0, 0.43056, 0, 0, 0.57616], - "955": [0, 0.69444, 0, 0, 0.58334], - "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], - "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], - "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], - "959": [0, 0.43056, 0, 0.05556, 0.48472], - "960": [0, 0.43056, 0.03588, 0, 0.57003], - "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], - "963": [0, 0.43056, 0.03588, 0, 0.57141], - "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], - "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], - "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], - "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], - "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], - "969": [0, 0.43056, 0.03588, 0, 0.62245], - "977": [0, 0.69444, 0, 0.08334, 0.59144], - "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], - "982": [0, 0.43056, 0.02778, 0, 0.82813], - "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059] - }, - "Math-Regular": { - "65": [0, 0.68333, 0, 0.13889, 0.75], - "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], - "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], - "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], - "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], - "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], - "71": [0, 0.68333, 0, 0.08334, 0.78625], - "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], - "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], - "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], - "76": [0, 0.68333, 0, 0.02778, 0.68056], - "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], - "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], - "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], - "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], - "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], - "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], - "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], - "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], - "86": [0, 0.68333, 0.22222, 0, 0.58333], - "87": [0, 0.68333, 0.13889, 0, 0.94445], - "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], - "89": [0, 0.68333, 0.22222, 0, 0.58056], - "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], - "97": [0, 0.43056, 0, 0, 0.52859], - "98": [0, 0.69444, 0, 0, 0.42917], - "99": [0, 0.43056, 0, 0.05556, 0.43276], - "100": [0, 0.69444, 0, 0.16667, 0.52049], - "101": [0, 0.43056, 0, 0.05556, 0.46563], - "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], - "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], - "104": [0, 0.69444, 0, 0, 0.57616], - "105": [0, 0.65952, 0, 0, 0.34451], - "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], - "107": [0, 0.69444, 0.03148, 0, 0.5206], - "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], - "109": [0, 0.43056, 0, 0, 0.87801], - "110": [0, 0.43056, 0, 0, 0.60023], - "111": [0, 0.43056, 0, 0.05556, 0.48472], - "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], - "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], - "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], - "115": [0, 0.43056, 0, 0.05556, 0.46875], - "116": [0, 0.61508, 0, 0.08334, 0.36111], - "117": [0, 0.43056, 0, 0.02778, 0.57246], - "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], - "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], - "120": [0, 0.43056, 0, 0.02778, 0.57153], - "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], - "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], - "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], - "916": [0, 0.68333, 0, 0.16667, 0.83334], - "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "923": [0, 0.68333, 0, 0.16667, 0.69445], - "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], - "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], - "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], - "934": [0, 0.68333, 0, 0.08334, 0.66667], - "936": [0, 0.68333, 0.11, 0.05556, 0.61222], - "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], - "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], - "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], - "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], - "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], - "949": [0, 0.43056, 0, 0.08334, 0.46632], - "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], - "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], - "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], - "953": [0, 0.43056, 0, 0.05556, 0.35394], - "954": [0, 0.43056, 0, 0, 0.57616], - "955": [0, 0.69444, 0, 0, 0.58334], - "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], - "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], - "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], - "959": [0, 0.43056, 0, 0.05556, 0.48472], - "960": [0, 0.43056, 0.03588, 0, 0.57003], - "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], - "963": [0, 0.43056, 0.03588, 0, 0.57141], - "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], - "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], - "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], - "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], - "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], - "969": [0, 0.43056, 0.03588, 0, 0.62245], - "977": [0, 0.69444, 0, 0.08334, 0.59144], - "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], - "982": [0, 0.43056, 0.02778, 0, 0.82813], - "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059] - }, - "SansSerif-Bold": { - "33": [0, 0.69444, 0, 0, 0.36667], - "34": [0, 0.69444, 0, 0, 0.55834], - "35": [0.19444, 0.69444, 0, 0, 0.91667], - "36": [0.05556, 0.75, 0, 0, 0.55], - "37": [0.05556, 0.75, 0, 0, 1.02912], - "38": [0, 0.69444, 0, 0, 0.83056], - "39": [0, 0.69444, 0, 0, 0.30556], - "40": [0.25, 0.75, 0, 0, 0.42778], - "41": [0.25, 0.75, 0, 0, 0.42778], - "42": [0, 0.75, 0, 0, 0.55], - "43": [0.11667, 0.61667, 0, 0, 0.85556], - "44": [0.10556, 0.13056, 0, 0, 0.30556], - "45": [0, 0.45833, 0, 0, 0.36667], - "46": [0, 0.13056, 0, 0, 0.30556], - "47": [0.25, 0.75, 0, 0, 0.55], - "48": [0, 0.69444, 0, 0, 0.55], - "49": [0, 0.69444, 0, 0, 0.55], - "50": [0, 0.69444, 0, 0, 0.55], - "51": [0, 0.69444, 0, 0, 0.55], - "52": [0, 0.69444, 0, 0, 0.55], - "53": [0, 0.69444, 0, 0, 0.55], - "54": [0, 0.69444, 0, 0, 0.55], - "55": [0, 0.69444, 0, 0, 0.55], - "56": [0, 0.69444, 0, 0, 0.55], - "57": [0, 0.69444, 0, 0, 0.55], - "58": [0, 0.45833, 0, 0, 0.30556], - "59": [0.10556, 0.45833, 0, 0, 0.30556], - "61": [-0.09375, 0.40625, 0, 0, 0.85556], - "63": [0, 0.69444, 0, 0, 0.51945], - "64": [0, 0.69444, 0, 0, 0.73334], - "65": [0, 0.69444, 0, 0, 0.73334], - "66": [0, 0.69444, 0, 0, 0.73334], - "67": [0, 0.69444, 0, 0, 0.70278], - "68": [0, 0.69444, 0, 0, 0.79445], - "69": [0, 0.69444, 0, 0, 0.64167], - "70": [0, 0.69444, 0, 0, 0.61111], - "71": [0, 0.69444, 0, 0, 0.73334], - "72": [0, 0.69444, 0, 0, 0.79445], - "73": [0, 0.69444, 0, 0, 0.33056], - "74": [0, 0.69444, 0, 0, 0.51945], - "75": [0, 0.69444, 0, 0, 0.76389], - "76": [0, 0.69444, 0, 0, 0.58056], - "77": [0, 0.69444, 0, 0, 0.97778], - "78": [0, 0.69444, 0, 0, 0.79445], - "79": [0, 0.69444, 0, 0, 0.79445], - "80": [0, 0.69444, 0, 0, 0.70278], - "81": [0.10556, 0.69444, 0, 0, 0.79445], - "82": [0, 0.69444, 0, 0, 0.70278], - "83": [0, 0.69444, 0, 0, 0.61111], - "84": [0, 0.69444, 0, 0, 0.73334], - "85": [0, 0.69444, 0, 0, 0.76389], - "86": [0, 0.69444, 0.01528, 0, 0.73334], - "87": [0, 0.69444, 0.01528, 0, 1.03889], - "88": [0, 0.69444, 0, 0, 0.73334], - "89": [0, 0.69444, 0.0275, 0, 0.73334], - "90": [0, 0.69444, 0, 0, 0.67223], - "91": [0.25, 0.75, 0, 0, 0.34306], - "93": [0.25, 0.75, 0, 0, 0.34306], - "94": [0, 0.69444, 0, 0, 0.55], - "95": [0.35, 0.10833, 0.03056, 0, 0.55], - "97": [0, 0.45833, 0, 0, 0.525], - "98": [0, 0.69444, 0, 0, 0.56111], - "99": [0, 0.45833, 0, 0, 0.48889], - "100": [0, 0.69444, 0, 0, 0.56111], - "101": [0, 0.45833, 0, 0, 0.51111], - "102": [0, 0.69444, 0.07639, 0, 0.33611], - "103": [0.19444, 0.45833, 0.01528, 0, 0.55], - "104": [0, 0.69444, 0, 0, 0.56111], - "105": [0, 0.69444, 0, 0, 0.25556], - "106": [0.19444, 0.69444, 0, 0, 0.28611], - "107": [0, 0.69444, 0, 0, 0.53056], - "108": [0, 0.69444, 0, 0, 0.25556], - "109": [0, 0.45833, 0, 0, 0.86667], - "110": [0, 0.45833, 0, 0, 0.56111], - "111": [0, 0.45833, 0, 0, 0.55], - "112": [0.19444, 0.45833, 0, 0, 0.56111], - "113": [0.19444, 0.45833, 0, 0, 0.56111], - "114": [0, 0.45833, 0.01528, 0, 0.37222], - "115": [0, 0.45833, 0, 0, 0.42167], - "116": [0, 0.58929, 0, 0, 0.40417], - "117": [0, 0.45833, 0, 0, 0.56111], - "118": [0, 0.45833, 0.01528, 0, 0.5], - "119": [0, 0.45833, 0.01528, 0, 0.74445], - "120": [0, 0.45833, 0, 0, 0.5], - "121": [0.19444, 0.45833, 0.01528, 0, 0.5], - "122": [0, 0.45833, 0, 0, 0.47639], - "126": [0.35, 0.34444, 0, 0, 0.55], - "168": [0, 0.69444, 0, 0, 0.55], - "176": [0, 0.69444, 0, 0, 0.73334], - "180": [0, 0.69444, 0, 0, 0.55], - "305": [0, 0.45833, 0, 0, 0.25556], - "567": [0.19444, 0.45833, 0, 0, 0.28611], - "710": [0, 0.69444, 0, 0, 0.55], - "711": [0, 0.63542, 0, 0, 0.55], - "713": [0, 0.63778, 0, 0, 0.55], - "728": [0, 0.69444, 0, 0, 0.55], - "729": [0, 0.69444, 0, 0, 0.30556], - "730": [0, 0.69444, 0, 0, 0.73334], - "732": [0, 0.69444, 0, 0, 0.55], - "733": [0, 0.69444, 0, 0, 0.55], - "915": [0, 0.69444, 0, 0, 0.58056], - "916": [0, 0.69444, 0, 0, 0.91667], - "920": [0, 0.69444, 0, 0, 0.85556], - "923": [0, 0.69444, 0, 0, 0.67223], - "926": [0, 0.69444, 0, 0, 0.73334], - "928": [0, 0.69444, 0, 0, 0.79445], - "931": [0, 0.69444, 0, 0, 0.79445], - "933": [0, 0.69444, 0, 0, 0.85556], - "934": [0, 0.69444, 0, 0, 0.79445], - "936": [0, 0.69444, 0, 0, 0.85556], - "937": [0, 0.69444, 0, 0, 0.79445], - "8211": [0, 0.45833, 0.03056, 0, 0.55], - "8212": [0, 0.45833, 0.03056, 0, 1.10001], - "8216": [0, 0.69444, 0, 0, 0.30556], - "8217": [0, 0.69444, 0, 0, 0.30556], - "8220": [0, 0.69444, 0, 0, 0.55834], - "8221": [0, 0.69444, 0, 0, 0.55834] - }, - "SansSerif-Italic": { - "33": [0, 0.69444, 0.05733, 0, 0.31945], - "34": [0, 0.69444, 0.00316, 0, 0.5], - "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], - "36": [0.05556, 0.75, 0.11156, 0, 0.5], - "37": [0.05556, 0.75, 0.03126, 0, 0.83334], - "38": [0, 0.69444, 0.03058, 0, 0.75834], - "39": [0, 0.69444, 0.07816, 0, 0.27778], - "40": [0.25, 0.75, 0.13164, 0, 0.38889], - "41": [0.25, 0.75, 0.02536, 0, 0.38889], - "42": [0, 0.75, 0.11775, 0, 0.5], - "43": [0.08333, 0.58333, 0.02536, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0.01946, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0.13164, 0, 0.5], - "48": [0, 0.65556, 0.11156, 0, 0.5], - "49": [0, 0.65556, 0.11156, 0, 0.5], - "50": [0, 0.65556, 0.11156, 0, 0.5], - "51": [0, 0.65556, 0.11156, 0, 0.5], - "52": [0, 0.65556, 0.11156, 0, 0.5], - "53": [0, 0.65556, 0.11156, 0, 0.5], - "54": [0, 0.65556, 0.11156, 0, 0.5], - "55": [0, 0.65556, 0.11156, 0, 0.5], - "56": [0, 0.65556, 0.11156, 0, 0.5], - "57": [0, 0.65556, 0.11156, 0, 0.5], - "58": [0, 0.44444, 0.02502, 0, 0.27778], - "59": [0.125, 0.44444, 0.02502, 0, 0.27778], - "61": [-0.13, 0.37, 0.05087, 0, 0.77778], - "63": [0, 0.69444, 0.11809, 0, 0.47222], - "64": [0, 0.69444, 0.07555, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0.08293, 0, 0.66667], - "67": [0, 0.69444, 0.11983, 0, 0.63889], - "68": [0, 0.69444, 0.07555, 0, 0.72223], - "69": [0, 0.69444, 0.11983, 0, 0.59722], - "70": [0, 0.69444, 0.13372, 0, 0.56945], - "71": [0, 0.69444, 0.11983, 0, 0.66667], - "72": [0, 0.69444, 0.08094, 0, 0.70834], - "73": [0, 0.69444, 0.13372, 0, 0.27778], - "74": [0, 0.69444, 0.08094, 0, 0.47222], - "75": [0, 0.69444, 0.11983, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0.08094, 0, 0.875], - "78": [0, 0.69444, 0.08094, 0, 0.70834], - "79": [0, 0.69444, 0.07555, 0, 0.73611], - "80": [0, 0.69444, 0.08293, 0, 0.63889], - "81": [0.125, 0.69444, 0.07555, 0, 0.73611], - "82": [0, 0.69444, 0.08293, 0, 0.64584], - "83": [0, 0.69444, 0.09205, 0, 0.55556], - "84": [0, 0.69444, 0.13372, 0, 0.68056], - "85": [0, 0.69444, 0.08094, 0, 0.6875], - "86": [0, 0.69444, 0.1615, 0, 0.66667], - "87": [0, 0.69444, 0.1615, 0, 0.94445], - "88": [0, 0.69444, 0.13372, 0, 0.66667], - "89": [0, 0.69444, 0.17261, 0, 0.66667], - "90": [0, 0.69444, 0.11983, 0, 0.61111], - "91": [0.25, 0.75, 0.15942, 0, 0.28889], - "93": [0.25, 0.75, 0.08719, 0, 0.28889], - "94": [0, 0.69444, 0.0799, 0, 0.5], - "95": [0.35, 0.09444, 0.08616, 0, 0.5], - "97": [0, 0.44444, 0.00981, 0, 0.48056], - "98": [0, 0.69444, 0.03057, 0, 0.51667], - "99": [0, 0.44444, 0.08336, 0, 0.44445], - "100": [0, 0.69444, 0.09483, 0, 0.51667], - "101": [0, 0.44444, 0.06778, 0, 0.44445], - "102": [0, 0.69444, 0.21705, 0, 0.30556], - "103": [0.19444, 0.44444, 0.10836, 0, 0.5], - "104": [0, 0.69444, 0.01778, 0, 0.51667], - "105": [0, 0.67937, 0.09718, 0, 0.23889], - "106": [0.19444, 0.67937, 0.09162, 0, 0.26667], - "107": [0, 0.69444, 0.08336, 0, 0.48889], - "108": [0, 0.69444, 0.09483, 0, 0.23889], - "109": [0, 0.44444, 0.01778, 0, 0.79445], - "110": [0, 0.44444, 0.01778, 0, 0.51667], - "111": [0, 0.44444, 0.06613, 0, 0.5], - "112": [0.19444, 0.44444, 0.0389, 0, 0.51667], - "113": [0.19444, 0.44444, 0.04169, 0, 0.51667], - "114": [0, 0.44444, 0.10836, 0, 0.34167], - "115": [0, 0.44444, 0.0778, 0, 0.38333], - "116": [0, 0.57143, 0.07225, 0, 0.36111], - "117": [0, 0.44444, 0.04169, 0, 0.51667], - "118": [0, 0.44444, 0.10836, 0, 0.46111], - "119": [0, 0.44444, 0.10836, 0, 0.68334], - "120": [0, 0.44444, 0.09169, 0, 0.46111], - "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], - "122": [0, 0.44444, 0.08752, 0, 0.43472], - "126": [0.35, 0.32659, 0.08826, 0, 0.5], - "168": [0, 0.67937, 0.06385, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.73752], - "305": [0, 0.44444, 0.04169, 0, 0.23889], - "567": [0.19444, 0.44444, 0.04169, 0, 0.26667], - "710": [0, 0.69444, 0.0799, 0, 0.5], - "711": [0, 0.63194, 0.08432, 0, 0.5], - "713": [0, 0.60889, 0.08776, 0, 0.5], - "714": [0, 0.69444, 0.09205, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0.09483, 0, 0.5], - "729": [0, 0.67937, 0.07774, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.73752], - "732": [0, 0.67659, 0.08826, 0, 0.5], - "733": [0, 0.69444, 0.09205, 0, 0.5], - "915": [0, 0.69444, 0.13372, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0.07555, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0.12816, 0, 0.66667], - "928": [0, 0.69444, 0.08094, 0, 0.70834], - "931": [0, 0.69444, 0.11983, 0, 0.72222], - "933": [0, 0.69444, 0.09031, 0, 0.77778], - "934": [0, 0.69444, 0.04603, 0, 0.72222], - "936": [0, 0.69444, 0.09031, 0, 0.77778], - "937": [0, 0.69444, 0.08293, 0, 0.72222], - "8211": [0, 0.44444, 0.08616, 0, 0.5], - "8212": [0, 0.44444, 0.08616, 0, 1.0], - "8216": [0, 0.69444, 0.07816, 0, 0.27778], - "8217": [0, 0.69444, 0.07816, 0, 0.27778], - "8220": [0, 0.69444, 0.14205, 0, 0.5], - "8221": [0, 0.69444, 0.00316, 0, 0.5] - }, - "SansSerif-Regular": { - "33": [0, 0.69444, 0, 0, 0.31945], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.75834], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.65556, 0, 0, 0.5], - "49": [0, 0.65556, 0, 0, 0.5], - "50": [0, 0.65556, 0, 0, 0.5], - "51": [0, 0.65556, 0, 0, 0.5], - "52": [0, 0.65556, 0, 0, 0.5], - "53": [0, 0.65556, 0, 0, 0.5], - "54": [0, 0.65556, 0, 0, 0.5], - "55": [0, 0.65556, 0, 0, 0.5], - "56": [0, 0.65556, 0, 0, 0.5], - "57": [0, 0.65556, 0, 0, 0.5], - "58": [0, 0.44444, 0, 0, 0.27778], - "59": [0.125, 0.44444, 0, 0, 0.27778], - "61": [-0.13, 0.37, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0, 0, 0.66667], - "67": [0, 0.69444, 0, 0, 0.63889], - "68": [0, 0.69444, 0, 0, 0.72223], - "69": [0, 0.69444, 0, 0, 0.59722], - "70": [0, 0.69444, 0, 0, 0.56945], - "71": [0, 0.69444, 0, 0, 0.66667], - "72": [0, 0.69444, 0, 0, 0.70834], - "73": [0, 0.69444, 0, 0, 0.27778], - "74": [0, 0.69444, 0, 0, 0.47222], - "75": [0, 0.69444, 0, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0, 0, 0.875], - "78": [0, 0.69444, 0, 0, 0.70834], - "79": [0, 0.69444, 0, 0, 0.73611], - "80": [0, 0.69444, 0, 0, 0.63889], - "81": [0.125, 0.69444, 0, 0, 0.73611], - "82": [0, 0.69444, 0, 0, 0.64584], - "83": [0, 0.69444, 0, 0, 0.55556], - "84": [0, 0.69444, 0, 0, 0.68056], - "85": [0, 0.69444, 0, 0, 0.6875], - "86": [0, 0.69444, 0.01389, 0, 0.66667], - "87": [0, 0.69444, 0.01389, 0, 0.94445], - "88": [0, 0.69444, 0, 0, 0.66667], - "89": [0, 0.69444, 0.025, 0, 0.66667], - "90": [0, 0.69444, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.28889], - "93": [0.25, 0.75, 0, 0, 0.28889], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.35, 0.09444, 0.02778, 0, 0.5], - "97": [0, 0.44444, 0, 0, 0.48056], - "98": [0, 0.69444, 0, 0, 0.51667], - "99": [0, 0.44444, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.51667], - "101": [0, 0.44444, 0, 0, 0.44445], - "102": [0, 0.69444, 0.06944, 0, 0.30556], - "103": [0.19444, 0.44444, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.51667], - "105": [0, 0.67937, 0, 0, 0.23889], - "106": [0.19444, 0.67937, 0, 0, 0.26667], - "107": [0, 0.69444, 0, 0, 0.48889], - "108": [0, 0.69444, 0, 0, 0.23889], - "109": [0, 0.44444, 0, 0, 0.79445], - "110": [0, 0.44444, 0, 0, 0.51667], - "111": [0, 0.44444, 0, 0, 0.5], - "112": [0.19444, 0.44444, 0, 0, 0.51667], - "113": [0.19444, 0.44444, 0, 0, 0.51667], - "114": [0, 0.44444, 0.01389, 0, 0.34167], - "115": [0, 0.44444, 0, 0, 0.38333], - "116": [0, 0.57143, 0, 0, 0.36111], - "117": [0, 0.44444, 0, 0, 0.51667], - "118": [0, 0.44444, 0.01389, 0, 0.46111], - "119": [0, 0.44444, 0.01389, 0, 0.68334], - "120": [0, 0.44444, 0, 0, 0.46111], - "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], - "122": [0, 0.44444, 0, 0, 0.43472], - "126": [0.35, 0.32659, 0, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.66667], - "305": [0, 0.44444, 0, 0, 0.23889], - "567": [0.19444, 0.44444, 0, 0, 0.26667], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.63194, 0, 0, 0.5], - "713": [0, 0.60889, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.67937, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.66667], - "733": [0, 0.69444, 0, 0, 0.5], - "771": [0, 0.67659, 0, 0, 0.5], - "776": [0, 0.67937, 0, 0, 0.5], - "915": [0, 0.69444, 0, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0, 0, 0.66667], - "928": [0, 0.69444, 0, 0, 0.70834], - "931": [0, 0.69444, 0, 0, 0.72222], - "933": [0, 0.69444, 0, 0, 0.77778], - "934": [0, 0.69444, 0, 0, 0.72222], - "936": [0, 0.69444, 0, 0, 0.77778], - "937": [0, 0.69444, 0, 0, 0.72222], - "8211": [0, 0.44444, 0.02778, 0, 0.5], - "8212": [0, 0.44444, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5] - }, - "Script-Regular": { - "65": [0, 0.7, 0.22925, 0, 0.80253], - "66": [0, 0.7, 0.04087, 0, 0.90757], - "67": [0, 0.7, 0.1689, 0, 0.66619], - "68": [0, 0.7, 0.09371, 0, 0.77443], - "69": [0, 0.7, 0.18583, 0, 0.56162], - "70": [0, 0.7, 0.13634, 0, 0.89544], - "71": [0, 0.7, 0.17322, 0, 0.60961], - "72": [0, 0.7, 0.29694, 0, 0.96919], - "73": [0, 0.7, 0.19189, 0, 0.80907], - "74": [0.27778, 0.7, 0.19189, 0, 1.05159], - "75": [0, 0.7, 0.31259, 0, 0.91364], - "76": [0, 0.7, 0.19189, 0, 0.87373], - "77": [0, 0.7, 0.15981, 0, 1.08031], - "78": [0, 0.7, 0.3525, 0, 0.9015], - "79": [0, 0.7, 0.08078, 0, 0.73787], - "80": [0, 0.7, 0.08078, 0, 1.01262], - "81": [0, 0.7, 0.03305, 0, 0.88282], - "82": [0, 0.7, 0.06259, 0, 0.85], - "83": [0, 0.7, 0.19189, 0, 0.86767], - "84": [0, 0.7, 0.29087, 0, 0.74697], - "85": [0, 0.7, 0.25815, 0, 0.79996], - "86": [0, 0.7, 0.27523, 0, 0.62204], - "87": [0, 0.7, 0.27523, 0, 0.80532], - "88": [0, 0.7, 0.26006, 0, 0.94445], - "89": [0, 0.7, 0.2939, 0, 0.70961], - "90": [0, 0.7, 0.24037, 0, 0.8212] - }, - "Size1-Regular": { - "40": [0.35001, 0.85, 0, 0, 0.45834], - "41": [0.35001, 0.85, 0, 0, 0.45834], - "47": [0.35001, 0.85, 0, 0, 0.57778], - "91": [0.35001, 0.85, 0, 0, 0.41667], - "92": [0.35001, 0.85, 0, 0, 0.57778], - "93": [0.35001, 0.85, 0, 0, 0.41667], - "123": [0.35001, 0.85, 0, 0, 0.58334], - "125": [0.35001, 0.85, 0, 0, 0.58334], - "710": [0, 0.72222, 0, 0, 0.55556], - "732": [0, 0.72222, 0, 0, 0.55556], - "770": [0, 0.72222, 0, 0, 0.55556], - "771": [0, 0.72222, 0, 0, 0.55556], - "8214": [-0.00099, 0.601, 0, 0, 0.77778], - "8593": [1e-05, 0.6, 0, 0, 0.66667], - "8595": [1e-05, 0.6, 0, 0, 0.66667], - "8657": [1e-05, 0.6, 0, 0, 0.77778], - "8659": [1e-05, 0.6, 0, 0, 0.77778], - "8719": [0.25001, 0.75, 0, 0, 0.94445], - "8720": [0.25001, 0.75, 0, 0, 0.94445], - "8721": [0.25001, 0.75, 0, 0, 1.05556], - "8730": [0.35001, 0.85, 0, 0, 1.0], - "8739": [-0.00599, 0.606, 0, 0, 0.33333], - "8741": [-0.00599, 0.606, 0, 0, 0.55556], - "8747": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8748": [0.306, 0.805, 0.19445, 0, 0.47222], - "8749": [0.306, 0.805, 0.19445, 0, 0.47222], - "8750": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8896": [0.25001, 0.75, 0, 0, 0.83334], - "8897": [0.25001, 0.75, 0, 0, 0.83334], - "8898": [0.25001, 0.75, 0, 0, 0.83334], - "8899": [0.25001, 0.75, 0, 0, 0.83334], - "8968": [0.35001, 0.85, 0, 0, 0.47222], - "8969": [0.35001, 0.85, 0, 0, 0.47222], - "8970": [0.35001, 0.85, 0, 0, 0.47222], - "8971": [0.35001, 0.85, 0, 0, 0.47222], - "9168": [-0.00099, 0.601, 0, 0, 0.66667], - "10216": [0.35001, 0.85, 0, 0, 0.47222], - "10217": [0.35001, 0.85, 0, 0, 0.47222], - "10752": [0.25001, 0.75, 0, 0, 1.11111], - "10753": [0.25001, 0.75, 0, 0, 1.11111], - "10754": [0.25001, 0.75, 0, 0, 1.11111], - "10756": [0.25001, 0.75, 0, 0, 0.83334], - "10758": [0.25001, 0.75, 0, 0, 0.83334] - }, - "Size2-Regular": { - "40": [0.65002, 1.15, 0, 0, 0.59722], - "41": [0.65002, 1.15, 0, 0, 0.59722], - "47": [0.65002, 1.15, 0, 0, 0.81111], - "91": [0.65002, 1.15, 0, 0, 0.47222], - "92": [0.65002, 1.15, 0, 0, 0.81111], - "93": [0.65002, 1.15, 0, 0, 0.47222], - "123": [0.65002, 1.15, 0, 0, 0.66667], - "125": [0.65002, 1.15, 0, 0, 0.66667], - "710": [0, 0.75, 0, 0, 1.0], - "732": [0, 0.75, 0, 0, 1.0], - "770": [0, 0.75, 0, 0, 1.0], - "771": [0, 0.75, 0, 0, 1.0], - "8719": [0.55001, 1.05, 0, 0, 1.27778], - "8720": [0.55001, 1.05, 0, 0, 1.27778], - "8721": [0.55001, 1.05, 0, 0, 1.44445], - "8730": [0.65002, 1.15, 0, 0, 1.0], - "8747": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8748": [0.862, 1.36, 0.44445, 0, 0.55556], - "8749": [0.862, 1.36, 0.44445, 0, 0.55556], - "8750": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8896": [0.55001, 1.05, 0, 0, 1.11111], - "8897": [0.55001, 1.05, 0, 0, 1.11111], - "8898": [0.55001, 1.05, 0, 0, 1.11111], - "8899": [0.55001, 1.05, 0, 0, 1.11111], - "8968": [0.65002, 1.15, 0, 0, 0.52778], - "8969": [0.65002, 1.15, 0, 0, 0.52778], - "8970": [0.65002, 1.15, 0, 0, 0.52778], - "8971": [0.65002, 1.15, 0, 0, 0.52778], - "10216": [0.65002, 1.15, 0, 0, 0.61111], - "10217": [0.65002, 1.15, 0, 0, 0.61111], - "10752": [0.55001, 1.05, 0, 0, 1.51112], - "10753": [0.55001, 1.05, 0, 0, 1.51112], - "10754": [0.55001, 1.05, 0, 0, 1.51112], - "10756": [0.55001, 1.05, 0, 0, 1.11111], - "10758": [0.55001, 1.05, 0, 0, 1.11111] - }, - "Size3-Regular": { - "40": [0.95003, 1.45, 0, 0, 0.73611], - "41": [0.95003, 1.45, 0, 0, 0.73611], - "47": [0.95003, 1.45, 0, 0, 1.04445], - "91": [0.95003, 1.45, 0, 0, 0.52778], - "92": [0.95003, 1.45, 0, 0, 1.04445], - "93": [0.95003, 1.45, 0, 0, 0.52778], - "123": [0.95003, 1.45, 0, 0, 0.75], - "125": [0.95003, 1.45, 0, 0, 0.75], - "710": [0, 0.75, 0, 0, 1.44445], - "732": [0, 0.75, 0, 0, 1.44445], - "770": [0, 0.75, 0, 0, 1.44445], - "771": [0, 0.75, 0, 0, 1.44445], - "8730": [0.95003, 1.45, 0, 0, 1.0], - "8968": [0.95003, 1.45, 0, 0, 0.58334], - "8969": [0.95003, 1.45, 0, 0, 0.58334], - "8970": [0.95003, 1.45, 0, 0, 0.58334], - "8971": [0.95003, 1.45, 0, 0, 0.58334], - "10216": [0.95003, 1.45, 0, 0, 0.75], - "10217": [0.95003, 1.45, 0, 0, 0.75] - }, - "Size4-Regular": { - "40": [1.25003, 1.75, 0, 0, 0.79167], - "41": [1.25003, 1.75, 0, 0, 0.79167], - "47": [1.25003, 1.75, 0, 0, 1.27778], - "91": [1.25003, 1.75, 0, 0, 0.58334], - "92": [1.25003, 1.75, 0, 0, 1.27778], - "93": [1.25003, 1.75, 0, 0, 0.58334], - "123": [1.25003, 1.75, 0, 0, 0.80556], - "125": [1.25003, 1.75, 0, 0, 0.80556], - "710": [0, 0.825, 0, 0, 1.8889], - "732": [0, 0.825, 0, 0, 1.8889], - "770": [0, 0.825, 0, 0, 1.8889], - "771": [0, 0.825, 0, 0, 1.8889], - "8730": [1.25003, 1.75, 0, 0, 1.0], - "8968": [1.25003, 1.75, 0, 0, 0.63889], - "8969": [1.25003, 1.75, 0, 0, 0.63889], - "8970": [1.25003, 1.75, 0, 0, 0.63889], - "8971": [1.25003, 1.75, 0, 0, 0.63889], - "9115": [0.64502, 1.155, 0, 0, 0.875], - "9116": [1e-05, 0.6, 0, 0, 0.875], - "9117": [0.64502, 1.155, 0, 0, 0.875], - "9118": [0.64502, 1.155, 0, 0, 0.875], - "9119": [1e-05, 0.6, 0, 0, 0.875], - "9120": [0.64502, 1.155, 0, 0, 0.875], - "9121": [0.64502, 1.155, 0, 0, 0.66667], - "9122": [-0.00099, 0.601, 0, 0, 0.66667], - "9123": [0.64502, 1.155, 0, 0, 0.66667], - "9124": [0.64502, 1.155, 0, 0, 0.66667], - "9125": [-0.00099, 0.601, 0, 0, 0.66667], - "9126": [0.64502, 1.155, 0, 0, 0.66667], - "9127": [1e-05, 0.9, 0, 0, 0.88889], - "9128": [0.65002, 1.15, 0, 0, 0.88889], - "9129": [0.90001, 0, 0, 0, 0.88889], - "9130": [0, 0.3, 0, 0, 0.88889], - "9131": [1e-05, 0.9, 0, 0, 0.88889], - "9132": [0.65002, 1.15, 0, 0, 0.88889], - "9133": [0.90001, 0, 0, 0, 0.88889], - "9143": [0.88502, 0.915, 0, 0, 1.05556], - "10216": [1.25003, 1.75, 0, 0, 0.80556], - "10217": [1.25003, 1.75, 0, 0, 0.80556], - "57344": [-0.00499, 0.605, 0, 0, 1.05556], - "57345": [-0.00499, 0.605, 0, 0, 1.05556], - "57680": [0, 0.12, 0, 0, 0.45], - "57681": [0, 0.12, 0, 0, 0.45], - "57682": [0, 0.12, 0, 0, 0.45], - "57683": [0, 0.12, 0, 0, 0.45] - }, - "Typewriter-Regular": { - "33": [0, 0.61111, 0, 0, 0.525], - "34": [0, 0.61111, 0, 0, 0.525], - "35": [0, 0.61111, 0, 0, 0.525], - "36": [0.08333, 0.69444, 0, 0, 0.525], - "37": [0.08333, 0.69444, 0, 0, 0.525], - "38": [0, 0.61111, 0, 0, 0.525], - "39": [0, 0.61111, 0, 0, 0.525], - "40": [0.08333, 0.69444, 0, 0, 0.525], - "41": [0.08333, 0.69444, 0, 0, 0.525], - "42": [0, 0.52083, 0, 0, 0.525], - "43": [-0.08056, 0.53055, 0, 0, 0.525], - "44": [0.13889, 0.125, 0, 0, 0.525], - "45": [-0.08056, 0.53055, 0, 0, 0.525], - "46": [0, 0.125, 0, 0, 0.525], - "47": [0.08333, 0.69444, 0, 0, 0.525], - "48": [0, 0.61111, 0, 0, 0.525], - "49": [0, 0.61111, 0, 0, 0.525], - "50": [0, 0.61111, 0, 0, 0.525], - "51": [0, 0.61111, 0, 0, 0.525], - "52": [0, 0.61111, 0, 0, 0.525], - "53": [0, 0.61111, 0, 0, 0.525], - "54": [0, 0.61111, 0, 0, 0.525], - "55": [0, 0.61111, 0, 0, 0.525], - "56": [0, 0.61111, 0, 0, 0.525], - "57": [0, 0.61111, 0, 0, 0.525], - "58": [0, 0.43056, 0, 0, 0.525], - "59": [0.13889, 0.43056, 0, 0, 0.525], - "60": [-0.05556, 0.55556, 0, 0, 0.525], - "61": [-0.19549, 0.41562, 0, 0, 0.525], - "62": [-0.05556, 0.55556, 0, 0, 0.525], - "63": [0, 0.61111, 0, 0, 0.525], - "64": [0, 0.61111, 0, 0, 0.525], - "65": [0, 0.61111, 0, 0, 0.525], - "66": [0, 0.61111, 0, 0, 0.525], - "67": [0, 0.61111, 0, 0, 0.525], - "68": [0, 0.61111, 0, 0, 0.525], - "69": [0, 0.61111, 0, 0, 0.525], - "70": [0, 0.61111, 0, 0, 0.525], - "71": [0, 0.61111, 0, 0, 0.525], - "72": [0, 0.61111, 0, 0, 0.525], - "73": [0, 0.61111, 0, 0, 0.525], - "74": [0, 0.61111, 0, 0, 0.525], - "75": [0, 0.61111, 0, 0, 0.525], - "76": [0, 0.61111, 0, 0, 0.525], - "77": [0, 0.61111, 0, 0, 0.525], - "78": [0, 0.61111, 0, 0, 0.525], - "79": [0, 0.61111, 0, 0, 0.525], - "80": [0, 0.61111, 0, 0, 0.525], - "81": [0.13889, 0.61111, 0, 0, 0.525], - "82": [0, 0.61111, 0, 0, 0.525], - "83": [0, 0.61111, 0, 0, 0.525], - "84": [0, 0.61111, 0, 0, 0.525], - "85": [0, 0.61111, 0, 0, 0.525], - "86": [0, 0.61111, 0, 0, 0.525], - "87": [0, 0.61111, 0, 0, 0.525], - "88": [0, 0.61111, 0, 0, 0.525], - "89": [0, 0.61111, 0, 0, 0.525], - "90": [0, 0.61111, 0, 0, 0.525], - "91": [0.08333, 0.69444, 0, 0, 0.525], - "92": [0.08333, 0.69444, 0, 0, 0.525], - "93": [0.08333, 0.69444, 0, 0, 0.525], - "94": [0, 0.61111, 0, 0, 0.525], - "95": [0.09514, 0, 0, 0, 0.525], - "96": [0, 0.61111, 0, 0, 0.525], - "97": [0, 0.43056, 0, 0, 0.525], - "98": [0, 0.61111, 0, 0, 0.525], - "99": [0, 0.43056, 0, 0, 0.525], - "100": [0, 0.61111, 0, 0, 0.525], - "101": [0, 0.43056, 0, 0, 0.525], - "102": [0, 0.61111, 0, 0, 0.525], - "103": [0.22222, 0.43056, 0, 0, 0.525], - "104": [0, 0.61111, 0, 0, 0.525], - "105": [0, 0.61111, 0, 0, 0.525], - "106": [0.22222, 0.61111, 0, 0, 0.525], - "107": [0, 0.61111, 0, 0, 0.525], - "108": [0, 0.61111, 0, 0, 0.525], - "109": [0, 0.43056, 0, 0, 0.525], - "110": [0, 0.43056, 0, 0, 0.525], - "111": [0, 0.43056, 0, 0, 0.525], - "112": [0.22222, 0.43056, 0, 0, 0.525], - "113": [0.22222, 0.43056, 0, 0, 0.525], - "114": [0, 0.43056, 0, 0, 0.525], - "115": [0, 0.43056, 0, 0, 0.525], - "116": [0, 0.55358, 0, 0, 0.525], - "117": [0, 0.43056, 0, 0, 0.525], - "118": [0, 0.43056, 0, 0, 0.525], - "119": [0, 0.43056, 0, 0, 0.525], - "120": [0, 0.43056, 0, 0, 0.525], - "121": [0.22222, 0.43056, 0, 0, 0.525], - "122": [0, 0.43056, 0, 0, 0.525], - "123": [0.08333, 0.69444, 0, 0, 0.525], - "124": [0.08333, 0.69444, 0, 0, 0.525], - "125": [0.08333, 0.69444, 0, 0, 0.525], - "126": [0, 0.61111, 0, 0, 0.525], - "127": [0, 0.61111, 0, 0, 0.525], - "176": [0, 0.61111, 0, 0, 0.525], - "305": [0, 0.43056, 0, 0, 0.525], - "567": [0.22222, 0.43056, 0, 0, 0.525], - "711": [0, 0.56597, 0, 0, 0.525], - "713": [0, 0.56555, 0, 0, 0.525], - "714": [0, 0.61111, 0, 0, 0.525], - "715": [0, 0.61111, 0, 0, 0.525], - "728": [0, 0.61111, 0, 0, 0.525], - "730": [0, 0.61111, 0, 0, 0.525], - "770": [0, 0.61111, 0, 0, 0.525], - "771": [0, 0.61111, 0, 0, 0.525], - "776": [0, 0.61111, 0, 0, 0.525], - "915": [0, 0.61111, 0, 0, 0.525], - "916": [0, 0.61111, 0, 0, 0.525], - "920": [0, 0.61111, 0, 0, 0.525], - "923": [0, 0.61111, 0, 0, 0.525], - "926": [0, 0.61111, 0, 0, 0.525], - "928": [0, 0.61111, 0, 0, 0.525], - "931": [0, 0.61111, 0, 0, 0.525], - "933": [0, 0.61111, 0, 0, 0.525], - "934": [0, 0.61111, 0, 0, 0.525], - "936": [0, 0.61111, 0, 0, 0.525], - "937": [0, 0.61111, 0, 0, 0.525], - "8216": [0, 0.61111, 0, 0, 0.525], - "8217": [0, 0.61111, 0, 0, 0.525], - "8242": [0, 0.61111, 0, 0, 0.525], - "9251": [0.11111, 0.21944, 0, 0, 0.525] - } + return node; + } }); -/***/ }), -/* 60 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +function assertParsed(group) { + if (!group.body) { + throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); + } +} -"use strict"; -/* harmony export (immutable) */ __webpack_exports__["a"] = sizingGroup; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); +defineFunction({ + type: "leftright-right", + names: ["\\right"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + // \left case below triggers parsing of \right in + // `const right = parser.parseFunction();` + // uses this return value. + return { + type: "leftright-right", + mode: context.parser.mode, + delim: checkDelimiter(args[0], context).text + }; + } +}); +defineFunction({ + type: "leftright", + names: ["\\left"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + var delim = checkDelimiter(args[0], context); + var parser = context.parser; // Parse out the implicit body + ++parser.leftrightDepth; // parseExpression stops before '\\right' + var body = parser.parseExpression(false); + --parser.leftrightDepth; // Check the next token + parser.expect("\\right", false); + var right = assertNodeType(parser.parseFunction(), "leftright-right"); + return { + type: "leftright", + mode: parser.mode, + body: body, + left: delim.text, + right: right.delim + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + assertParsed(group); // Build the inner expression + var inner = buildHTML_buildExpression(group.body, options, true, ["mopen", "mclose"]); + var innerHeight = 0; + var innerDepth = 0; + var hadMiddle = false; // Calculate its height and depth - - - -function sizingGroup(value, options, baseOptions) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](value, options, false); - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; - - // Add size-resetting classes to the inner list and set maxFontSize - // manually. Handle nested size changes. for (var i = 0; i < inner.length; i++) { - var pos = __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].indexOf(inner[i].classes, "sizing"); - if (pos < 0) { - Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); - } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { - // This is a nested size change: e.g., inner[i] is the "b" in - // `\Huge a \small b`. Override the old size (the `reset-` class) - // but not the new size. - inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; + // Property `isMiddle` not defined on `span`. See comment in + // "middle"'s htmlBuilder. + // $FlowFixMe + if (inner[i].isMiddle) { + hadMiddle = true; + } else { + innerHeight = Math.max(inner[i].height, innerHeight); + innerDepth = Math.max(inner[i].depth, innerDepth); + } + } // The size of delimiters is the same, regardless of what style we are + // in. Thus, to correctly calculate the size of delimiter we need around + // a group, we scale down the inner size based on the size. + + + innerHeight *= options.sizeMultiplier; + innerDepth *= options.sizeMultiplier; + var leftDelim; + + if (group.left === ".") { + // Empty delimiters in \left and \right make null delimiter spaces. + leftDelim = makeNullDelimiter(options, ["mopen"]); + } else { + // Otherwise, use leftRightDelim to generate the correct sized + // delimiter. + leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, ["mopen"]); + } // Add it to the beginning of the expression + + + inner.unshift(leftDelim); // Handle middle delimiters + + if (hadMiddle) { + for (var _i = 1; _i < inner.length; _i++) { + var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in + // "middle"'s htmlBuilder. + // $FlowFixMe + + var isMiddle = middleDelim.isMiddle; + + if (isMiddle) { + // Apply the options that were active when \middle was called + inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []); } - - inner[i].height *= multiplier; - inner[i].depth *= multiplier; + } } - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeFragment(inner); -} + var rightDelim; // Same for the right delimiter -var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "sizing", - names: sizeFuncs, - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args) { - var breakOnTokenText = context.breakOnTokenText, - funcName = context.funcName, - parser = context.parser; + if (group.right === ".") { + rightDelim = makeNullDelimiter(options, ["mclose"]); + } else { + rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, options, group.mode, ["mclose"]); + } // Add it to the end of the expression. - parser.consumeSpaces(); - var body = parser.parseExpression(false, breakOnTokenText); + inner.push(rightDelim); + return buildCommon.makeSpan(["minner"], inner, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + assertParsed(group); + var inner = buildMathML_buildExpression(group.body, options); - return { - type: "sizing", - // Figure out what size to use based on the list of functions above - size: __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].indexOf(sizeFuncs, funcName) + 1, - value: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Handle sizing operators like \Huge. Real TeX doesn't actually allow - // these functions inside of math expressions, so we do some special - // handling. - var newOptions = options.havingSize(group.value.size); - return sizingGroup(group.value.value, newOptions, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var newOptions = options.havingSize(group.value.size); - var inner = __WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](group.value.value, newOptions); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mstyle", inner); - - // TODO(emily): This doesn't produce the correct size for nested size - // changes, because we don't keep state of what style we're currently - // in, so we can't reset the size to normal before changing it. Now - // that we're passing an options parameter we should be able to fix - // this. - node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); - - return node; + if (group.left !== ".") { + var leftNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.left, group.mode)]); + leftNode.setAttribute("fence", "true"); + inner.unshift(leftNode); } + + if (group.right !== ".") { + var rightNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.right, group.mode)]); + rightNode.setAttribute("fence", "true"); + inner.push(rightNode); + } + + return buildMathML_makeRow(inner); + } }); +defineFunction({ + type: "middle", + names: ["\\middle"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + var delim = checkDelimiter(args[0], context); -/***/ }), -/* 61 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (!context.parser.leftrightDepth) { + throw new src_ParseError("\\middle without preceding \\left", delim); + } -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _environments; }); -/* harmony export (immutable) */ __webpack_exports__["b"] = defineEnvironment; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildMathML__ = __webpack_require__(2); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Options__ = __webpack_require__(43); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseNode__ = __webpack_require__(14); + return { + type: "middle", + mode: context.parser.mode, + delim: delim.text + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var middleDelim; + + if (group.delim === ".") { + middleDelim = makeNullDelimiter(options, []); + } else { + middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []); + var isMiddle = { + delim: group.delim, + options: options + }; // Property `isMiddle` not defined on `span`. It is only used in + // this file above. + // TODO: Fix this violation of the `span` type and possibly rename + // things since `isMiddle` sounds like a boolean, but is a struct. + // $FlowFixMe + + middleDelim.isMiddle = isMiddle; + } + + return middleDelim; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // A Firefox \middle will strech a character vertically only if it + // is in the fence part of the operator dictionary at: + // https://www.w3.org/TR/MathML3/appendixc.html. + // So we need to avoid U+2223 and use plain "|" instead. + var textNode = group.delim === "\\vert" || group.delim === "|" ? buildMathML_makeText("|", "text") : buildMathML_makeText(group.delim, group.mode); + var middleNode = new mathMLTree.MathNode("mo", [textNode]); + middleNode.setAttribute("fence", "true"); // MathML gives 5/18em spacing to each <mo> element. + // \middle should get delimiter spacing instead. + + middleNode.setAttribute("lspace", "0.05em"); + middleNode.setAttribute("rspace", "0.05em"); + return middleNode; + } +}); +// CONCATENATED MODULE: ./src/functions/enclose.js -/** - * The context contains the following properties: - * - mode: current parsing mode. - * - envName: the name of the environment, one of the listed names. - * - parser: the parser object. - */ -/** - * - context: information and references provided by the parser - * - args: an array of arguments passed to \begin{name} - * - optArgs: an array of optional arguments passed to \begin{name} - */ + +var enclose_htmlBuilder = function htmlBuilder(group, options) { + // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox + // Some groups can return document fragments. Handle those by wrapping + // them in a span. + var inner = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, options), options); + var label = group.label.substr(1); + var scale = options.sizeMultiplier; + var img; + var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different + // depending on whether the subject is wider than it is tall, or vice versa. + // We don't know the width of a group, so as a proxy, we test if + // the subject is a single character. This captures most of the + // subjects that should get the "tall" treatment. + + var isSingleChar = utils.isCharacterBox(group.body); + + if (label === "sout") { + img = buildCommon.makeSpan(["stretchy", "sout"]); + img.height = options.fontMetrics().defaultRuleThickness / scale; + imgShift = -0.5 * options.fontMetrics().xHeight; + } else { + // Add horizontal padding + if (/cancel/.test(label)) { + if (!isSingleChar) { + inner.classes.push("cancel-pad"); + } + } else { + inner.classes.push("boxpad"); + } // Add vertical padding -/** - * - numArgs: (default 0) The number of arguments after the \begin{name} function. - * - argTypes: (optional) Just like for a function - * - allowedInText: (default false) Whether or not the environment is allowed - * inside text mode (not enforced yet). - * - numOptionalArgs: (default 0) Just like for a function - */ + var vertPad = 0; // ref: LaTeX source2e: \fboxsep = 3pt; \fboxrule = .4pt + // ref: cancel package: \advance\totalheight2\p@ % "+2" + if (/box/.test(label)) { + vertPad = label === "colorbox" ? 0.3 : 0.34; + } else { + vertPad = isSingleChar ? 0.2 : 0; + } -/** - * Final enviornment spec for use at parse time. - * This is almost identical to `EnvDefSpec`, except it - * 1. includes the function handler - * 2. requires all arguments except argType - * It is generated by `defineEnvironment()` below. - */ + img = stretchy.encloseSpan(inner, label, vertPad, options); + imgShift = inner.depth + vertPad; + + if (group.backgroundColor) { + img.style.backgroundColor = group.backgroundColor; + + if (group.borderColor) { + img.style.borderColor = group.borderColor; + } + } + } + + var vlist; + + if (group.backgroundColor) { + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [// Put the color background behind inner; + { + type: "elem", + elem: img, + shift: imgShift + }, { + type: "elem", + elem: inner, + shift: 0 + }] + }, options); + } else { + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [// Write the \cancel stroke on top of inner. + { + type: "elem", + elem: inner, + shift: 0 + }, { + type: "elem", + elem: img, + shift: imgShift, + wrapperClasses: /cancel/.test(label) ? ["svg-align"] : [] + }] + }, options); + } + + if (/cancel/.test(label)) { + // The cancel package documentation says that cancel lines add their height + // to the expression, but tests show that isn't how it actually works. + vlist.height = inner.height; + vlist.depth = inner.depth; + } + + if (/cancel/.test(label) && !isSingleChar) { + // cancel does not create horiz space for its line extension. + return buildCommon.makeSpan(["mord", "cancel-lap"], [vlist], options); + } else { + return buildCommon.makeSpan(["mord"], [vlist], options); + } +}; + +var enclose_mathmlBuilder = function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildMathML_buildGroup(group.body, options)]); + + switch (group.label) { + case "\\cancel": + node.setAttribute("notation", "updiagonalstrike"); + break; + + case "\\bcancel": + node.setAttribute("notation", "downdiagonalstrike"); + break; + + case "\\sout": + node.setAttribute("notation", "horizontalstrike"); + break; + + case "\\fbox": + node.setAttribute("notation", "box"); + break; + + case "\\fcolorbox": + case "\\colorbox": + // <menclose> doesn't have a good notation option. So use <mpadded> + // instead. Set some attributes that come included with <menclose>. + node.setAttribute("width", "+6pt"); + node.setAttribute("height", "+6pt"); + node.setAttribute("lspace", "3pt"); // LaTeX source2e: \fboxsep = 3pt + + node.setAttribute("voffset", "3pt"); + + if (group.label === "\\fcolorbox") { + var thk = options.fontMetrics().defaultRuleThickness; + node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor)); + } + + break; + + case "\\xcancel": + node.setAttribute("notation", "updiagonalstrike downdiagonalstrike"); + break; + } + + if (group.backgroundColor) { + node.setAttribute("mathbackground", group.backgroundColor); + } + + return node; +}; + +defineFunction({ + type: "enclose", + names: ["\\colorbox"], + props: { + numArgs: 2, + allowedInText: true, + greediness: 3, + argTypes: ["color", "text"] + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser, + funcName = _ref.funcName; + var color = assertNodeType(args[0], "color-token").color; + var body = args[1]; + return { + type: "enclose", + mode: parser.mode, + label: funcName, + backgroundColor: color, + body: body + }; + }, + htmlBuilder: enclose_htmlBuilder, + mathmlBuilder: enclose_mathmlBuilder +}); +defineFunction({ + type: "enclose", + names: ["\\fcolorbox"], + props: { + numArgs: 3, + allowedInText: true, + greediness: 3, + argTypes: ["color", "color", "text"] + }, + handler: function handler(_ref2, args, optArgs) { + var parser = _ref2.parser, + funcName = _ref2.funcName; + var borderColor = assertNodeType(args[0], "color-token").color; + var backgroundColor = assertNodeType(args[1], "color-token").color; + var body = args[2]; + return { + type: "enclose", + mode: parser.mode, + label: funcName, + backgroundColor: backgroundColor, + borderColor: borderColor, + body: body + }; + }, + htmlBuilder: enclose_htmlBuilder, + mathmlBuilder: enclose_mathmlBuilder +}); +defineFunction({ + type: "enclose", + names: ["\\fbox"], + props: { + numArgs: 1, + argTypes: ["text"], + allowedInText: true + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser; + return { + type: "enclose", + mode: parser.mode, + label: "\\fbox", + body: args[0] + }; + } +}); +defineFunction({ + type: "enclose", + names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout"], + props: { + numArgs: 1 + }, + handler: function handler(_ref4, args, optArgs) { + var parser = _ref4.parser, + funcName = _ref4.funcName; + var body = args[0]; + return { + type: "enclose", + mode: parser.mode, + label: funcName, + body: body + }; + }, + htmlBuilder: enclose_htmlBuilder, + mathmlBuilder: enclose_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/defineEnvironment.js /** @@ -8972,53 +9304,3966 @@ Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ * `Parser.js` requires this dictionary via `environments.js`. */ var _environments = {}; - function defineEnvironment(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; + var type = _ref.type, + names = _ref.names, + props = _ref.props, + handler = _ref.handler, + htmlBuilder = _ref.htmlBuilder, + mathmlBuilder = _ref.mathmlBuilder; + // Set default values of environments. + var data = { + type: type, + numArgs: props.numArgs || 0, + greediness: 1, + allowedInText: false, + numOptionalArgs: 0, + handler: handler + }; - // Set default values of environments - var data = { - numArgs: props.numArgs || 0, - greediness: 1, - allowedInText: false, - numOptionalArgs: 0, - handler: handler + for (var i = 0; i < names.length; ++i) { + // TODO: The value type of _environments should be a type union of all + // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is + // an existential type. + // $FlowFixMe + _environments[names[i]] = data; + } + + if (htmlBuilder) { + _htmlGroupBuilders[type] = htmlBuilder; + } + + if (mathmlBuilder) { + _mathmlGroupBuilders[type] = mathmlBuilder; + } +} +// CONCATENATED MODULE: ./src/environments/array.js + + + + + + + + + + + + +function getHLines(parser) { + // Return an array. The array length = number of hlines. + // Each element in the array tells if the line is dashed. + var hlineInfo = []; + parser.consumeSpaces(); + var nxt = parser.nextToken.text; + + while (nxt === "\\hline" || nxt === "\\hdashline") { + parser.consume(); + hlineInfo.push(nxt === "\\hdashline"); + parser.consumeSpaces(); + nxt = parser.nextToken.text; + } + + return hlineInfo; +} +/** + * Parse the body of the environment, with rows delimited by \\ and + * columns delimited by &, and create a nested list in row-major order + * with one group per cell. If given an optional argument style + * ("text", "display", etc.), then each cell is cast into that style. + */ + + +function parseArray(parser, _ref, style) { + var hskipBeforeAndAfter = _ref.hskipBeforeAndAfter, + addJot = _ref.addJot, + cols = _ref.cols, + arraystretch = _ref.arraystretch, + colSeparationType = _ref.colSeparationType; + // Parse body of array with \\ temporarily mapped to \cr + parser.gullet.beginGroup(); + parser.gullet.macros.set("\\\\", "\\cr"); // Get current arraystretch if it's not set by the environment + + if (!arraystretch) { + var stretch = parser.gullet.expandMacroAsText("\\arraystretch"); + + if (stretch == null) { + // Default \arraystretch from lttab.dtx + arraystretch = 1; + } else { + arraystretch = parseFloat(stretch); + + if (!arraystretch || arraystretch < 0) { + throw new src_ParseError("Invalid \\arraystretch: " + stretch); + } + } + } + + var row = []; + var body = [row]; + var rowGaps = []; + var hLinesBeforeRow = []; // Test for \hline at the top of the array. + + hLinesBeforeRow.push(getHLines(parser)); + + while (true) { + // eslint-disable-line no-constant-condition + var cell = parser.parseExpression(false, "\\cr"); + cell = { + type: "ordgroup", + mode: parser.mode, + body: cell }; - for (var i = 0; i < names.length; ++i) { - _environments[names[i]] = data; + + if (style) { + cell = { + type: "styling", + mode: parser.mode, + style: style, + body: [cell] + }; } - if (htmlBuilder) { - __WEBPACK_IMPORTED_MODULE_0__buildHTML__["d" /* groupTypes */][type] = htmlBuilder; - } - if (mathmlBuilder) { - __WEBPACK_IMPORTED_MODULE_1__buildMathML__["d" /* groupTypes */][type] = mathmlBuilder; + + row.push(cell); + var next = parser.nextToken.text; + + if (next === "&") { + parser.consume(); + } else if (next === "\\end") { + // Arrays terminate newlines with `\crcr` which consumes a `\cr` if + // the last line is empty. + // NOTE: Currently, `cell` is the last item added into `row`. + if (row.length === 1 && cell.type === "styling" && cell.body[0].body.length === 0) { + body.pop(); + } + + if (hLinesBeforeRow.length < body.length + 1) { + hLinesBeforeRow.push([]); + } + + break; + } else if (next === "\\cr") { + var cr = assertNodeType(parser.parseFunction(), "cr"); + rowGaps.push(cr.size); // check for \hline(s) following the row separator + + hLinesBeforeRow.push(getHLines(parser)); + row = []; + body.push(row); + } else { + throw new src_ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); } + } + + parser.gullet.endGroup(); + return { + type: "array", + mode: parser.mode, + addJot: addJot, + arraystretch: arraystretch, + body: body, + cols: cols, + rowGaps: rowGaps, + hskipBeforeAndAfter: hskipBeforeAndAfter, + hLinesBeforeRow: hLinesBeforeRow, + colSeparationType: colSeparationType + }; +} // Decides on a style for cells in an array according to whether the given +// environment name starts with the letter 'd'. + + +function dCellStyle(envName) { + if (envName.substr(0, 1) === "d") { + return "display"; + } else { + return "text"; + } } -/***/ }), -/* 62 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +var array_htmlBuilder = function htmlBuilder(group, options) { + var r; + var c; + var nr = group.body.length; + var hLinesBeforeRow = group.hLinesBeforeRow; + var nc = 0; + var body = new Array(nr); + var hlines = []; // Horizontal spacing -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return combiningDiacriticalMarksEndRegex; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return controlWordRegex; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_match_at__ = __webpack_require__(145); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_match_at___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_match_at__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__SourceLocation__ = __webpack_require__(31); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Token__ = __webpack_require__(27); + var pt = 1 / options.fontMetrics().ptPerEm; + var arraycolsep = 5 * pt; // \arraycolsep in article.cls + // Vertical spacing + + var baselineskip = 12 * pt; // see size10.clo + // Default \jot from ltmath.dtx + // TODO(edemaine): allow overriding \jot via \setlength (#687) + + var jot = 3 * pt; + var arrayskip = group.arraystretch * baselineskip; + var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and + + var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx + + var totalHeight = 0; // Set a position for \hline(s) at the top of the array, if any. + + function setHLinePos(hlinesInGap) { + for (var i = 0; i < hlinesInGap.length; ++i) { + if (i > 0) { + totalHeight += 0.25; + } + + hlines.push({ + pos: totalHeight, + isDashed: hlinesInGap[i] + }); + } + } + + setHLinePos(hLinesBeforeRow[0]); + + for (r = 0; r < group.body.length; ++r) { + var inrow = group.body[r]; + var height = arstrutHeight; // \@array adds an \@arstrut + + var depth = arstrutDepth; // to each tow (via the template) + + if (nc < inrow.length) { + nc = inrow.length; + } + + var outrow = new Array(inrow.length); + + for (c = 0; c < inrow.length; ++c) { + var elt = buildHTML_buildGroup(inrow[c], options); + + if (depth < elt.depth) { + depth = elt.depth; + } + + if (height < elt.height) { + height = elt.height; + } + + outrow[c] = elt; + } + + var rowGap = group.rowGaps[r]; + var gap = 0; + + if (rowGap) { + gap = units_calculateSize(rowGap, options); + + if (gap > 0) { + // \@argarraycr + gap += arstrutDepth; + + if (depth < gap) { + depth = gap; // \@xargarraycr + } + + gap = 0; + } + } // In AMS multiline environments such as aligned and gathered, rows + // correspond to lines that have additional \jot added to the + // \baselineskip via \openup. + + + if (group.addJot) { + depth += jot; + } + + outrow.height = height; + outrow.depth = depth; + totalHeight += height; + outrow.pos = totalHeight; + totalHeight += depth + gap; // \@yargarraycr + + body[r] = outrow; // Set a position for \hline(s), if any. + + setHLinePos(hLinesBeforeRow[r + 1]); + } + + var offset = totalHeight / 2 + options.fontMetrics().axisHeight; + var colDescriptions = group.cols || []; + var cols = []; + var colSep; + var colDescrNum; + + for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column + // descriptions, so trailing separators don't get lost. + c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) { + var colDescr = colDescriptions[colDescrNum] || {}; + var firstSeparator = true; + + while (colDescr.type === "separator") { + // If there is more than one separator in a row, add a space + // between them. + if (!firstSeparator) { + colSep = buildCommon.makeSpan(["arraycolsep"], []); + colSep.style.width = options.fontMetrics().doubleRuleSep + "em"; + cols.push(colSep); + } + + if (colDescr.separator === "|") { + var separator = buildCommon.makeSpan(["vertical-separator"], [], options); + separator.style.height = totalHeight + "em"; + separator.style.verticalAlign = -(totalHeight - offset) + "em"; + cols.push(separator); + } else if (colDescr.separator === ":") { + var _separator = buildCommon.makeSpan(["vertical-separator", "vs-dashed"], [], options); + + _separator.style.height = totalHeight + "em"; + _separator.style.verticalAlign = -(totalHeight - offset) + "em"; + cols.push(_separator); + } else { + throw new src_ParseError("Invalid separator type: " + colDescr.separator); + } + + colDescrNum++; + colDescr = colDescriptions[colDescrNum] || {}; + firstSeparator = false; + } + + if (c >= nc) { + continue; + } + + var sepwidth = void 0; + + if (c > 0 || group.hskipBeforeAndAfter) { + sepwidth = utils.deflt(colDescr.pregap, arraycolsep); + + if (sepwidth !== 0) { + colSep = buildCommon.makeSpan(["arraycolsep"], []); + colSep.style.width = sepwidth + "em"; + cols.push(colSep); + } + } + + var col = []; + + for (r = 0; r < nr; ++r) { + var row = body[r]; + var elem = row[c]; + + if (!elem) { + continue; + } + + var shift = row.pos - offset; + elem.depth = row.depth; + elem.height = row.height; + col.push({ + type: "elem", + elem: elem, + shift: shift + }); + } + + col = buildCommon.makeVList({ + positionType: "individualShift", + children: col + }, options); + col = buildCommon.makeSpan(["col-align-" + (colDescr.align || "c")], [col]); + cols.push(col); + + if (c < nc - 1 || group.hskipBeforeAndAfter) { + sepwidth = utils.deflt(colDescr.postgap, arraycolsep); + + if (sepwidth !== 0) { + colSep = buildCommon.makeSpan(["arraycolsep"], []); + colSep.style.width = sepwidth + "em"; + cols.push(colSep); + } + } + } + + body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any. + + if (hlines.length > 0) { + var line = buildCommon.makeLineSpan("hline", options, 0.05); + var dashes = buildCommon.makeLineSpan("hdashline", options, 0.05); + var vListElems = [{ + type: "elem", + elem: body, + shift: 0 + }]; + + while (hlines.length > 0) { + var hline = hlines.pop(); + var lineShift = hline.pos - offset; + + if (hline.isDashed) { + vListElems.push({ + type: "elem", + elem: dashes, + shift: lineShift + }); + } else { + vListElems.push({ + type: "elem", + elem: line, + shift: lineShift + }); + } + } + + body = buildCommon.makeVList({ + positionType: "individualShift", + children: vListElems + }, options); + } + + return buildCommon.makeSpan(["mord"], [body], options); +}; + +var alignMap = { + c: "center ", + l: "left ", + r: "right " +}; + +var array_mathmlBuilder = function mathmlBuilder(group, options) { + var table = new mathMLTree.MathNode("mtable", group.body.map(function (row) { + return new mathMLTree.MathNode("mtr", row.map(function (cell) { + return new mathMLTree.MathNode("mtd", [buildMathML_buildGroup(cell, options)]); + })); + })); // Set column alignment, row spacing, column spacing, and + // array lines by setting attributes on the table element. + // Set the row spacing. In MathML, we specify a gap distance. + // We do not use rowGap[] because MathML automatically increases + // cell height with the height/depth of the element content. + // LaTeX \arraystretch multiplies the row baseline-to-baseline distance. + // We simulate this by adding (arraystretch - 1)em to the gap. This + // does a reasonable job of adjusting arrays containing 1 em tall content. + // The 0.16 and 0.09 values are found emprically. They produce an array + // similar to LaTeX and in which content does not interfere with \hines. + + var gap = 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0); + table.setAttribute("rowspacing", gap + "em"); // MathML table lines go only between cells. + // To place a line on an edge we'll use <menclose>, if necessary. + + var menclose = ""; + var align = ""; + + if (group.cols) { + // Find column alignment, column spacing, and vertical lines. + var cols = group.cols; + var columnLines = ""; + var prevTypeWasAlign = false; + var iStart = 0; + var iEnd = cols.length; + + if (cols[0].type === "separator") { + menclose += "top "; + iStart = 1; + } + + if (cols[cols.length - 1].type === "separator") { + menclose += "bottom "; + iEnd -= 1; + } + + for (var i = iStart; i < iEnd; i++) { + if (cols[i].type === "align") { + align += alignMap[cols[i].align]; + + if (prevTypeWasAlign) { + columnLines += "none "; + } + + prevTypeWasAlign = true; + } else if (cols[i].type === "separator") { + // MathML accepts only single lines between cells. + // So we read only the first of consecutive separators. + if (prevTypeWasAlign) { + columnLines += cols[i].separator === "|" ? "solid " : "dashed "; + prevTypeWasAlign = false; + } + } + } + + table.setAttribute("columnalign", align.trim()); + + if (/[sd]/.test(columnLines)) { + table.setAttribute("columnlines", columnLines.trim()); + } + } // Set column spacing. + + + if (group.colSeparationType === "align") { + var _cols = group.cols || []; + + var spacing = ""; + + for (var _i = 1; _i < _cols.length; _i++) { + spacing += _i % 2 ? "0em " : "1em "; + } + + table.setAttribute("columnspacing", spacing.trim()); + } else if (group.colSeparationType === "alignat") { + table.setAttribute("columnspacing", "0em"); + } else { + table.setAttribute("columnspacing", "1em"); + } // Address \hline and \hdashline + + + var rowLines = ""; + var hlines = group.hLinesBeforeRow; + menclose += hlines[0].length > 0 ? "left " : ""; + menclose += hlines[hlines.length - 1].length > 0 ? "right " : ""; + + for (var _i2 = 1; _i2 < hlines.length - 1; _i2++) { + rowLines += hlines[_i2].length === 0 ? "none " // MathML accepts only a single line between rows. Read one element. + : hlines[_i2][0] ? "dashed " : "solid "; + } + + if (/[sd]/.test(rowLines)) { + table.setAttribute("rowlines", rowLines.trim()); + } + + if (menclose === "") { + return table; + } else { + var wrapper = new mathMLTree.MathNode("menclose", [table]); + wrapper.setAttribute("notation", menclose.trim()); + return wrapper; + } +}; // Convenience function for aligned and alignedat environments. + + +var array_alignedHandler = function alignedHandler(context, args) { + var cols = []; + var res = parseArray(context.parser, { + cols: cols, + addJot: true + }, "display"); // Determining number of columns. + // 1. If the first argument is given, we use it as a number of columns, + // and makes sure that each row doesn't exceed that number. + // 2. Otherwise, just count number of columns = maximum number + // of cells in each row ("aligned" mode -- isAligned will be true). + // + // At the same time, prepend empty group {} at beginning of every second + // cell in each row (starting with second cell) so that operators become + // binary. This behavior is implemented in amsmath's \start@aligned. + + var numMaths; + var numCols = 0; + var emptyGroup = { + type: "ordgroup", + mode: context.mode, + body: [] + }; + var ordgroup = checkNodeType(args[0], "ordgroup"); + + if (ordgroup) { + var arg0 = ""; + + for (var i = 0; i < ordgroup.body.length; i++) { + var textord = assertNodeType(ordgroup.body[i], "textord"); + arg0 += textord.text; + } + + numMaths = Number(arg0); + numCols = numMaths * 2; + } + + var isAligned = !numCols; + res.body.forEach(function (row) { + for (var _i3 = 1; _i3 < row.length; _i3 += 2) { + // Modify ordgroup node within styling node + var styling = assertNodeType(row[_i3], "styling"); + + var _ordgroup = assertNodeType(styling.body[0], "ordgroup"); + + _ordgroup.body.unshift(emptyGroup); + } + + if (!isAligned) { + // Case 1 + var curMaths = row.length / 2; + + if (numMaths < curMaths) { + throw new src_ParseError("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row[0]); + } + } else if (numCols < row.length) { + // Case 2 + numCols = row.length; + } + }); // Adjusting alignment. + // In aligned mode, we add one \qquad between columns; + // otherwise we add nothing. + + for (var _i4 = 0; _i4 < numCols; ++_i4) { + var align = "r"; + var pregap = 0; + + if (_i4 % 2 === 1) { + align = "l"; + } else if (_i4 > 0 && isAligned) { + // "aligned" mode. + pregap = 1; // add one \quad + } + + cols[_i4] = { + type: "align", + align: align, + pregap: pregap, + postgap: 0 + }; + } + + res.colSeparationType = isAligned ? "align" : "alignat"; + return res; +}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation +// is part of the source2e.pdf file of LaTeX2e source documentation. +// {darray} is an {array} environment where cells are set in \displaystyle, +// as defined in nccmath.sty. + + +defineEnvironment({ + type: "array", + names: ["array", "darray"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + // Since no types are specified above, the two possibilities are + // - The argument is wrapped in {} or [], in which case Parser's + // parseGroup() returns an "ordgroup" wrapping some symbol node. + // - The argument is a bare symbol node. + var symNode = checkSymbolNodeType(args[0]); + var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; + var cols = colalign.map(function (nde) { + var node = assertSymbolNodeType(nde); + var ca = node.text; + + if ("lcr".indexOf(ca) !== -1) { + return { + type: "align", + align: ca + }; + } else if (ca === "|") { + return { + type: "separator", + separator: "|" + }; + } else if (ca === ":") { + return { + type: "separator", + separator: ":" + }; + } + + throw new src_ParseError("Unknown column alignment: " + ca, nde); + }); + var res = { + cols: cols, + hskipBeforeAndAfter: true // \@preamble in lttab.dtx + + }; + return parseArray(context.parser, res, dCellStyle(context.envName)); + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // The matrix environments of amsmath builds on the array environment +// of LaTeX, which is discussed above. + +defineEnvironment({ + type: "array", + names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + var delimiters = { + "matrix": null, + "pmatrix": ["(", ")"], + "bmatrix": ["[", "]"], + "Bmatrix": ["\\{", "\\}"], + "vmatrix": ["|", "|"], + "Vmatrix": ["\\Vert", "\\Vert"] + }[context.envName]; // \hskip -\arraycolsep in amsmath + + var payload = { + hskipBeforeAndAfter: false + }; + var res = parseArray(context.parser, payload, dCellStyle(context.envName)); + return delimiters ? { + type: "leftright", + mode: context.mode, + body: [res], + left: delimiters[0], + right: delimiters[1] + } : res; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // A cases environment (in amsmath.sty) is almost equivalent to +// \def\arraystretch{1.2}% +// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. +// {dcases} is a {cases} environment where cells are set in \displaystyle, +// as defined in mathtools.sty. + +defineEnvironment({ + type: "array", + names: ["cases", "dcases"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + var payload = { + arraystretch: 1.2, + cols: [{ + type: "align", + align: "l", + pregap: 0, + // TODO(kevinb) get the current style. + // For now we use the metrics for TEXT style which is what we were + // doing before. Before attempting to get the current style we + // should look at TeX's behavior especially for \over and matrices. + postgap: 1.0 + /* 1em quad */ + + }, { + type: "align", + align: "l", + pregap: 0, + postgap: 0 + }] + }; + var res = parseArray(context.parser, payload, dCellStyle(context.envName)); + return { + type: "leftright", + mode: context.mode, + body: [res], + left: "\\{", + right: "." + }; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // An aligned environment is like the align* environment +// except it operates within math mode. +// Note that we assume \nomallineskiplimit to be zero, +// so that \strut@ is the same as \strut. + +defineEnvironment({ + type: "array", + names: ["aligned"], + props: { + numArgs: 0 + }, + handler: array_alignedHandler, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // A gathered environment is like an array environment with one centered +// column, but where rows are considered lines so get \jot line spacing +// and contents are set in \displaystyle. + +defineEnvironment({ + type: "array", + names: ["gathered"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + var res = { + cols: [{ + type: "align", + align: "c" + }], + addJot: true + }; + return parseArray(context.parser, res, "display"); + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // alignat environment is like an align environment, but one must explicitly +// specify maximum number of columns in each row, and can adjust spacing between +// each columns. + +defineEnvironment({ + type: "array", + names: ["alignedat"], + // One for numbered and for unnumbered; + // but, KaTeX doesn't supports math numbering yet, + // they make no difference for now. + props: { + numArgs: 1 + }, + handler: array_alignedHandler, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // Catch \hline outside array environment + +defineFunction({ + type: "text", + // Doesn't matter what this is. + names: ["\\hline", "\\hdashline"], + props: { + numArgs: 0, + allowedInText: true, + allowedInMath: true + }, + handler: function handler(context, args) { + throw new src_ParseError(context.funcName + " valid only within array environment"); + } +}); +// CONCATENATED MODULE: ./src/environments.js + +var environments = _environments; +/* harmony default export */ var src_environments = (environments); // All environment definitions should be imported below + + +// CONCATENATED MODULE: ./src/functions/environment.js + // Environment delimiters. HTML/MathML rendering is defined in the corresponding +// defineEnvironment definitions. +// $FlowFixMe, "environment" handler returns an environment ParseNode + +defineFunction({ + type: "environment", + names: ["\\begin", "\\end"], + props: { + numArgs: 1, + argTypes: ["text"] + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var nameGroup = args[0]; + + if (nameGroup.type !== "ordgroup") { + throw new src_ParseError("Invalid environment name", nameGroup); + } + + var envName = ""; + + for (var i = 0; i < nameGroup.body.length; ++i) { + envName += assertNodeType(nameGroup.body[i], "textord").text; + } + + if (funcName === "\\begin") { + // begin...end is similar to left...right + if (!src_environments.hasOwnProperty(envName)) { + throw new src_ParseError("No such environment: " + envName, nameGroup); + } // Build the environment object. Arguments and other information will + // be made available to the begin and end methods using properties. + + + var env = src_environments[envName]; + + var _parser$parseArgument = parser.parseArguments("\\begin{" + envName + "}", env), + _args = _parser$parseArgument.args, + optArgs = _parser$parseArgument.optArgs; + + var context = { + mode: parser.mode, + envName: envName, + parser: parser + }; + var result = env.handler(context, _args, optArgs); + parser.expect("\\end", false); + var endNameToken = parser.nextToken; + var end = assertNodeType(parser.parseFunction(), "environment"); + + if (end.name !== envName) { + throw new src_ParseError("Mismatch: \\begin{" + envName + "} matched by \\end{" + end.name + "}", endNameToken); + } + + return result; + } + + return { + type: "environment", + mode: parser.mode, + name: envName, + nameGroup: nameGroup + }; + } +}); +// CONCATENATED MODULE: ./src/functions/mclass.js + + + + + +var mclass_makeSpan = buildCommon.makeSpan; + +function mclass_htmlBuilder(group, options) { + var elements = buildHTML_buildExpression(group.body, options, true); + return mclass_makeSpan([group.mclass], elements, options); +} + +function mclass_mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(group.body, options); + return mathMLTree.newDocumentFragment(inner); +} // Math class commands except \mathop + + +defineFunction({ + type: "mclass", + names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + return { + type: "mclass", + mode: parser.mode, + mclass: "m" + funcName.substr(5), + body: defineFunction_ordargument(body) + }; + }, + htmlBuilder: mclass_htmlBuilder, + mathmlBuilder: mclass_mathmlBuilder +}); +var binrelClass = function binrelClass(arg) { + // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. + // (by rendering separately and with {}s before and after, and measuring + // the change in spacing). We'll do roughly the same by detecting the + // atom type directly. + var atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; + + if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { + return "m" + atom.family; + } else { + return "mord"; + } +}; // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. +// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. + +defineFunction({ + type: "mclass", + names: ["\\@binrel"], + props: { + numArgs: 2 + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + return { + type: "mclass", + mode: parser.mode, + mclass: binrelClass(args[0]), + body: [args[1]] + }; + } +}); // Build a relation or stacked op by placing one symbol on top of another + +defineFunction({ + type: "mclass", + names: ["\\stackrel", "\\overset", "\\underset"], + props: { + numArgs: 2 + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser, + funcName = _ref3.funcName; + var baseArg = args[1]; + var shiftedArg = args[0]; + var mclass; + + if (funcName !== "\\stackrel") { + // LaTeX applies \binrel spacing to \overset and \underset. + mclass = binrelClass(baseArg); + } else { + mclass = "mrel"; // for \stackrel + } + + var baseOp = { + type: "op", + mode: baseArg.mode, + limits: true, + alwaysHandleSupSub: true, + parentIsSupSub: false, + symbol: false, + suppressBaseShift: funcName !== "\\stackrel", + body: defineFunction_ordargument(baseArg) + }; + var supsub = { + type: "supsub", + mode: shiftedArg.mode, + base: baseOp, + sup: funcName === "\\underset" ? null : shiftedArg, + sub: funcName === "\\underset" ? shiftedArg : null + }; + return { + type: "mclass", + mode: parser.mode, + mclass: mclass, + body: [supsub] + }; + }, + htmlBuilder: mclass_htmlBuilder, + mathmlBuilder: mclass_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/functions/font.js +// TODO(kevinb): implement \\sl and \\sc + + + + + +var font_htmlBuilder = function htmlBuilder(group, options) { + var font = group.font; + var newOptions = options.withFont(font); + return buildHTML_buildGroup(group.body, newOptions); +}; + +var font_mathmlBuilder = function mathmlBuilder(group, options) { + var font = group.font; + var newOptions = options.withFont(font); + return buildMathML_buildGroup(group.body, newOptions); +}; + +var fontAliases = { + "\\Bbb": "\\mathbb", + "\\bold": "\\mathbf", + "\\frak": "\\mathfrak", + "\\bm": "\\boldsymbol" +}; +defineFunction({ + type: "font", + names: [// styles, except \boldsymbol defined below + "\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", // families + "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", // aliases, except \bm defined below + "\\Bbb", "\\bold", "\\frak"], + props: { + numArgs: 1, + greediness: 2 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + var func = funcName; + + if (func in fontAliases) { + func = fontAliases[func]; + } + + return { + type: "font", + mode: parser.mode, + font: func.slice(1), + body: body + }; + }, + htmlBuilder: font_htmlBuilder, + mathmlBuilder: font_mathmlBuilder +}); +defineFunction({ + type: "mclass", + names: ["\\boldsymbol", "\\bm"], + props: { + numArgs: 1, + greediness: 2 + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var body = args[0]; // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the + // argument's bin|rel|ord status + + return { + type: "mclass", + mode: parser.mode, + mclass: binrelClass(body), + body: [{ + type: "font", + mode: parser.mode, + font: "boldsymbol", + body: body + }] + }; + } +}); // Old font changing functions + +defineFunction({ + type: "font", + names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser, + funcName = _ref3.funcName, + breakOnTokenText = _ref3.breakOnTokenText; + var mode = parser.mode; + var body = parser.parseExpression(true, breakOnTokenText); + var style = "math" + funcName.slice(1); + return { + type: "font", + mode: mode, + font: style, + body: { + type: "ordgroup", + mode: parser.mode, + body: body + } + }; + }, + htmlBuilder: font_htmlBuilder, + mathmlBuilder: font_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/functions/genfrac.js + + + + + + + + + + + +var genfrac_adjustStyle = function adjustStyle(size, originalStyle) { + // Figure out what style this fraction should be in based on the + // function used + var style = originalStyle; + + if (size === "display") { + // Get display style as a default. + // If incoming style is sub/sup, use style.text() to get correct size. + style = style.id >= src_Style.SCRIPT.id ? style.text() : src_Style.DISPLAY; + } else if (size === "text" && style.size === src_Style.DISPLAY.size) { + // We're in a \tfrac but incoming style is displaystyle, so: + style = src_Style.TEXT; + } else if (size === "script") { + style = src_Style.SCRIPT; + } else if (size === "scriptscript") { + style = src_Style.SCRIPTSCRIPT; + } + + return style; +}; + +var genfrac_htmlBuilder = function htmlBuilder(group, options) { + // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e). + var style = genfrac_adjustStyle(group.size, options.style); + var nstyle = style.fracNum(); + var dstyle = style.fracDen(); + var newOptions; + newOptions = options.havingStyle(nstyle); + var numerm = buildHTML_buildGroup(group.numer, newOptions, options); + + if (group.continued) { + // \cfrac inserts a \strut into the numerator. + // Get \strut dimensions from TeXbook page 353. + var hStrut = 8.5 / options.fontMetrics().ptPerEm; + var dStrut = 3.5 / options.fontMetrics().ptPerEm; + numerm.height = numerm.height < hStrut ? hStrut : numerm.height; + numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth; + } + + newOptions = options.havingStyle(dstyle); + var denomm = buildHTML_buildGroup(group.denom, newOptions, options); + var rule; + var ruleWidth; + var ruleSpacing; + + if (group.hasBarLine) { + if (group.barSize) { + ruleWidth = units_calculateSize(group.barSize, options); + rule = buildCommon.makeLineSpan("frac-line", options, ruleWidth); + } else { + rule = buildCommon.makeLineSpan("frac-line", options); + } + + ruleWidth = rule.height; + ruleSpacing = rule.height; + } else { + rule = null; + ruleWidth = 0; + ruleSpacing = options.fontMetrics().defaultRuleThickness; + } // Rule 15b + + + var numShift; + var clearance; + var denomShift; + + if (style.size === src_Style.DISPLAY.size || group.size === "display") { + numShift = options.fontMetrics().num1; + + if (ruleWidth > 0) { + clearance = 3 * ruleSpacing; + } else { + clearance = 7 * ruleSpacing; + } + + denomShift = options.fontMetrics().denom1; + } else { + if (ruleWidth > 0) { + numShift = options.fontMetrics().num2; + clearance = ruleSpacing; + } else { + numShift = options.fontMetrics().num3; + clearance = 3 * ruleSpacing; + } + + denomShift = options.fontMetrics().denom2; + } + + var frac; + + if (!rule) { + // Rule 15c + var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift); + + if (candidateClearance < clearance) { + numShift += 0.5 * (clearance - candidateClearance); + denomShift += 0.5 * (clearance - candidateClearance); + } + + frac = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: denomm, + shift: denomShift + }, { + type: "elem", + elem: numerm, + shift: -numShift + }] + }, options); + } else { + // Rule 15d + var axisHeight = options.fontMetrics().axisHeight; + + if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) { + numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth)); + } + + if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) { + denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift)); + } + + var midShift = -(axisHeight - 0.5 * ruleWidth); + frac = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: denomm, + shift: denomShift + }, { + type: "elem", + elem: rule, + shift: midShift + }, { + type: "elem", + elem: numerm, + shift: -numShift + }] + }, options); + } // Since we manually change the style sometimes (with \dfrac or \tfrac), + // account for the possible size change here. + + + newOptions = options.havingStyle(style); + frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier; + frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e + + var delimSize; + + if (style.size === src_Style.DISPLAY.size) { + delimSize = options.fontMetrics().delim1; + } else { + delimSize = options.fontMetrics().delim2; + } + + var leftDelim; + var rightDelim; + + if (group.leftDelim == null) { + leftDelim = makeNullDelimiter(options, ["mopen"]); + } else { + leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]); + } + + if (group.continued) { + rightDelim = buildCommon.makeSpan([]); // zero width for \cfrac + } else if (group.rightDelim == null) { + rightDelim = makeNullDelimiter(options, ["mclose"]); + } else { + rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]); + } + + return buildCommon.makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan(["mfrac"], [frac]), rightDelim], options); +}; + +var genfrac_mathmlBuilder = function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mfrac", [buildMathML_buildGroup(group.numer, options), buildMathML_buildGroup(group.denom, options)]); + + if (!group.hasBarLine) { + node.setAttribute("linethickness", "0px"); + } else if (group.barSize) { + var ruleWidth = units_calculateSize(group.barSize, options); + node.setAttribute("linethickness", ruleWidth + "em"); + } + + var style = genfrac_adjustStyle(group.size, options.style); + + if (style.size !== options.style.size) { + node = new mathMLTree.MathNode("mstyle", [node]); + var isDisplay = style.size === src_Style.DISPLAY.size ? "true" : "false"; + node.setAttribute("displaystyle", isDisplay); + node.setAttribute("scriptlevel", "0"); + } + + if (group.leftDelim != null || group.rightDelim != null) { + var withDelims = []; + + if (group.leftDelim != null) { + var leftOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.leftDelim.replace("\\", ""))]); + leftOp.setAttribute("fence", "true"); + withDelims.push(leftOp); + } + + withDelims.push(node); + + if (group.rightDelim != null) { + var rightOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.rightDelim.replace("\\", ""))]); + rightOp.setAttribute("fence", "true"); + withDelims.push(rightOp); + } + + return buildMathML_makeRow(withDelims); + } + + return node; +}; + +defineFunction({ + type: "genfrac", + names: ["\\cfrac", "\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", // can’t be entered directly + "\\\\bracefrac", "\\\\brackfrac"], + props: { + numArgs: 2, + greediness: 2 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var numer = args[0]; + var denom = args[1]; + var hasBarLine; + var leftDelim = null; + var rightDelim = null; + var size = "auto"; + + switch (funcName) { + case "\\cfrac": + case "\\dfrac": + case "\\frac": + case "\\tfrac": + hasBarLine = true; + break; + + case "\\\\atopfrac": + hasBarLine = false; + break; + + case "\\dbinom": + case "\\binom": + case "\\tbinom": + hasBarLine = false; + leftDelim = "("; + rightDelim = ")"; + break; + + case "\\\\bracefrac": + hasBarLine = false; + leftDelim = "\\{"; + rightDelim = "\\}"; + break; + + case "\\\\brackfrac": + hasBarLine = false; + leftDelim = "["; + rightDelim = "]"; + break; + + default: + throw new Error("Unrecognized genfrac command"); + } + + switch (funcName) { + case "\\cfrac": + case "\\dfrac": + case "\\dbinom": + size = "display"; + break; + + case "\\tfrac": + case "\\tbinom": + size = "text"; + break; + } + + return { + type: "genfrac", + mode: parser.mode, + continued: funcName === "\\cfrac", + numer: numer, + denom: denom, + hasBarLine: hasBarLine, + leftDelim: leftDelim, + rightDelim: rightDelim, + size: size, + barSize: null + }; + }, + htmlBuilder: genfrac_htmlBuilder, + mathmlBuilder: genfrac_mathmlBuilder +}); // Infix generalized fractions -- these are not rendered directly, but replaced +// immediately by one of the variants above. + +defineFunction({ + type: "infix", + names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], + props: { + numArgs: 0, + infix: true + }, + handler: function handler(_ref2) { + var parser = _ref2.parser, + funcName = _ref2.funcName, + token = _ref2.token; + var replaceWith; + + switch (funcName) { + case "\\over": + replaceWith = "\\frac"; + break; + + case "\\choose": + replaceWith = "\\binom"; + break; + + case "\\atop": + replaceWith = "\\\\atopfrac"; + break; + + case "\\brace": + replaceWith = "\\\\bracefrac"; + break; + + case "\\brack": + replaceWith = "\\\\brackfrac"; + break; + + default: + throw new Error("Unrecognized infix genfrac command"); + } + + return { + type: "infix", + mode: parser.mode, + replaceWith: replaceWith, + token: token + }; + } +}); +var stylArray = ["display", "text", "script", "scriptscript"]; + +var delimFromValue = function delimFromValue(delimString) { + var delim = null; + + if (delimString.length > 0) { + delim = delimString; + delim = delim === "." ? null : delim; + } + + return delim; +}; + +defineFunction({ + type: "genfrac", + names: ["\\genfrac"], + props: { + numArgs: 6, + greediness: 6, + argTypes: ["math", "math", "size", "text", "math", "math"] + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser; + var numer = args[4]; + var denom = args[5]; // Look into the parse nodes to get the desired delimiters. + + var leftNode = checkNodeType(args[0], "atom"); + + if (leftNode) { + leftNode = assertAtomFamily(args[0], "open"); + } + + var leftDelim = leftNode ? delimFromValue(leftNode.text) : null; + var rightNode = checkNodeType(args[1], "atom"); + + if (rightNode) { + rightNode = assertAtomFamily(args[1], "close"); + } + + var rightDelim = rightNode ? delimFromValue(rightNode.text) : null; + var barNode = assertNodeType(args[2], "size"); + var hasBarLine; + var barSize = null; + + if (barNode.isBlank) { + // \genfrac acts differently than \above. + // \genfrac treats an empty size group as a signal to use a + // standard bar size. \above would see size = 0 and omit the bar. + hasBarLine = true; + } else { + barSize = barNode.value; + hasBarLine = barSize.number > 0; + } // Find out if we want displaystyle, textstyle, etc. + + + var size = "auto"; + var styl = checkNodeType(args[3], "ordgroup"); + + if (styl) { + if (styl.body.length > 0) { + var textOrd = assertNodeType(styl.body[0], "textord"); + size = stylArray[Number(textOrd.text)]; + } + } else { + styl = assertNodeType(args[3], "textord"); + size = stylArray[Number(styl.text)]; + } + + return { + type: "genfrac", + mode: parser.mode, + numer: numer, + denom: denom, + continued: false, + hasBarLine: hasBarLine, + barSize: barSize, + leftDelim: leftDelim, + rightDelim: rightDelim, + size: size + }; + }, + htmlBuilder: genfrac_htmlBuilder, + mathmlBuilder: genfrac_mathmlBuilder +}); // \above is an infix fraction that also defines a fraction bar size. + +defineFunction({ + type: "infix", + names: ["\\above"], + props: { + numArgs: 1, + argTypes: ["size"], + infix: true + }, + handler: function handler(_ref4, args) { + var parser = _ref4.parser, + funcName = _ref4.funcName, + token = _ref4.token; + return { + type: "infix", + mode: parser.mode, + replaceWith: "\\\\abovefrac", + size: assertNodeType(args[0], "size").value, + token: token + }; + } +}); +defineFunction({ + type: "genfrac", + names: ["\\\\abovefrac"], + props: { + numArgs: 3, + argTypes: ["math", "size", "math"] + }, + handler: function handler(_ref5, args) { + var parser = _ref5.parser, + funcName = _ref5.funcName; + var numer = args[0]; + var barSize = assert(assertNodeType(args[1], "infix").size); + var denom = args[2]; + var hasBarLine = barSize.number > 0; + return { + type: "genfrac", + mode: parser.mode, + numer: numer, + denom: denom, + continued: false, + hasBarLine: hasBarLine, + barSize: barSize, + leftDelim: null, + rightDelim: null, + size: "auto" + }; + }, + htmlBuilder: genfrac_htmlBuilder, + mathmlBuilder: genfrac_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/functions/horizBrace.js + + + + + + + + +// NOTE: Unlike most `htmlBuilder`s, this one handles not only "horizBrace", but +var horizBrace_htmlBuilder = function htmlBuilder(grp, options) { + var style = options.style; // Pull out the `ParseNode<"horizBrace">` if `grp` is a "supsub" node. + + var supSubGroup; + var group; + var supSub = checkNodeType(grp, "supsub"); + + if (supSub) { + // Ref: LaTeX source2e: }}}}\limits} + // i.e. LaTeX treats the brace similar to an op and passes it + // with \limits, so we need to assign supsub style. + supSubGroup = supSub.sup ? buildHTML_buildGroup(supSub.sup, options.havingStyle(style.sup()), options) : buildHTML_buildGroup(supSub.sub, options.havingStyle(style.sub()), options); + group = assertNodeType(supSub.base, "horizBrace"); + } else { + group = assertNodeType(grp, "horizBrace"); + } // Build the base group + + + var body = buildHTML_buildGroup(group.base, options.havingBaseStyle(src_Style.DISPLAY)); // Create the stretchy element + + var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓ + // This first vlist contains the content and the brace: equation + + var vlist; + + if (group.isOver) { + vlist = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: body + }, { + type: "kern", + size: 0.1 + }, { + type: "elem", + elem: braceBody + }] + }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. + + vlist.children[0].children[0].children[1].classes.push("svg-align"); + } else { + vlist = buildCommon.makeVList({ + positionType: "bottom", + positionData: body.depth + 0.1 + braceBody.height, + children: [{ + type: "elem", + elem: braceBody + }, { + type: "kern", + size: 0.1 + }, { + type: "elem", + elem: body + }] + }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. + + vlist.children[0].children[0].children[0].classes.push("svg-align"); + } + + if (supSubGroup) { + // To write the supsub, wrap the first vlist in another vlist: + // They can't all go in the same vlist, because the note might be + // wider than the equation. We want the equation to control the + // brace width. + // note long note long note + // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓ + // equation eqn eqn + var vSpan = buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); + + if (group.isOver) { + vlist = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: vSpan + }, { + type: "kern", + size: 0.2 + }, { + type: "elem", + elem: supSubGroup + }] + }, options); + } else { + vlist = buildCommon.makeVList({ + positionType: "bottom", + positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth, + children: [{ + type: "elem", + elem: supSubGroup + }, { + type: "kern", + size: 0.2 + }, { + type: "elem", + elem: vSpan + }] + }, options); + } + } + + return buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); +}; + +var horizBrace_mathmlBuilder = function mathmlBuilder(group, options) { + var accentNode = stretchy.mathMLnode(group.label); + return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [buildMathML_buildGroup(group.base, options), accentNode]); +}; // Horizontal stretchy braces + + +defineFunction({ + type: "horizBrace", + names: ["\\overbrace", "\\underbrace"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + return { + type: "horizBrace", + mode: parser.mode, + label: funcName, + isOver: /^\\over/.test(funcName), + base: args[0] + }; + }, + htmlBuilder: horizBrace_htmlBuilder, + mathmlBuilder: horizBrace_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/functions/href.js + + + + + + +defineFunction({ + type: "href", + names: ["\\href"], + props: { + numArgs: 2, + argTypes: ["url", "original"], + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var body = args[1]; + var href = assertNodeType(args[0], "url").url; + return { + type: "href", + mode: parser.mode, + href: href, + body: defineFunction_ordargument(body) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildHTML_buildExpression(group.body, options, false); + return buildCommon.makeAnchor(group.href, [], elements, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var math = buildExpressionRow(group.body, options); + + if (!(math instanceof mathMLTree_MathNode)) { + math = new mathMLTree_MathNode("mrow", [math]); + } + + math.setAttribute("href", group.href); + return math; + } +}); +defineFunction({ + type: "href", + names: ["\\url"], + props: { + numArgs: 1, + argTypes: ["url"], + allowedInText: true + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var href = assertNodeType(args[0], "url").url; + var chars = []; + + for (var i = 0; i < href.length; i++) { + var c = href[i]; + + if (c === "~") { + c = "\\textasciitilde"; + } + + chars.push({ + type: "textord", + mode: "text", + text: c + }); + } + + var body = { + type: "text", + mode: parser.mode, + font: "\\texttt", + body: chars + }; + return { + type: "href", + mode: parser.mode, + href: href, + body: defineFunction_ordargument(body) + }; + } +}); +// CONCATENATED MODULE: ./src/functions/htmlmathml.js + + + + +defineFunction({ + type: "htmlmathml", + names: ["\\html@mathml"], + props: { + numArgs: 2, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "htmlmathml", + mode: parser.mode, + html: defineFunction_ordargument(args[0]), + mathml: defineFunction_ordargument(args[1]) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildHTML_buildExpression(group.html, options, false); + return buildCommon.makeFragment(elements); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return buildExpressionRow(group.mathml, options); + } +}); +// CONCATENATED MODULE: ./src/functions/kern.js +// Horizontal spacing commands + + + + + // TODO: \hskip and \mskip should support plus and minus in lengths + +defineFunction({ + type: "kern", + names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], + props: { + numArgs: 1, + argTypes: ["size"], + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var size = assertNodeType(args[0], "size"); + + if (parser.settings.strict) { + var mathFunction = funcName[1] === 'm'; // \mkern, \mskip + + var muUnit = size.value.unit === 'mu'; + + if (mathFunction) { + if (!muUnit) { + parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " supports only mu units, " + ("not " + size.value.unit + " units")); + } + + if (parser.mode !== "math") { + parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " works only in math mode"); + } + } else { + // !mathFunction + if (muUnit) { + parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " doesn't support mu units"); + } + } + } + + return { + type: "kern", + mode: parser.mode, + dimension: size.value + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.makeGlue(group.dimension, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var dimension = units_calculateSize(group.dimension, options); + return new mathMLTree.SpaceNode(dimension); + } +}); +// CONCATENATED MODULE: ./src/functions/lap.js +// Horizontal overlap functions + + + + + +defineFunction({ + type: "lap", + names: ["\\mathllap", "\\mathrlap", "\\mathclap"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + return { + type: "lap", + mode: parser.mode, + alignment: funcName.slice(5), + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // mathllap, mathrlap, mathclap + var inner; + + if (group.alignment === "clap") { + // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/ + inner = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span + + inner = buildCommon.makeSpan(["inner"], [inner], options); + } else { + inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options)]); + } + + var fix = buildCommon.makeSpan(["fix"], []); + var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the + // two items involved in the lap. + // Next, use a strut to set the height of the HTML bounding box. + // Otherwise, a tall argument may be misplaced. + + var strut = buildCommon.makeSpan(["strut"]); + strut.style.height = node.height + node.depth + "em"; + strut.style.verticalAlign = -node.depth + "em"; + node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall. + + node = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: node + }] + }, options); // Get the horizontal spacing correct relative to adjacent items. + + return buildCommon.makeSpan(["mord"], [node], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // mathllap, mathrlap, mathclap + var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); + + if (group.alignment !== "rlap") { + var offset = group.alignment === "llap" ? "-1" : "-0.5"; + node.setAttribute("lspace", offset + "width"); + } + + node.setAttribute("width", "0px"); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/math.js + + // Switching from text mode back to math mode + +defineFunction({ + type: "styling", + names: ["\\(", "$"], + props: { + numArgs: 0, + allowedInText: true, + allowedInMath: false, + consumeMode: "math" + }, + handler: function handler(_ref, args) { + var funcName = _ref.funcName, + parser = _ref.parser; + var outerMode = parser.mode; + parser.switchMode("math"); + var close = funcName === "\\(" ? "\\)" : "$"; + var body = parser.parseExpression(false, close); // We can't expand the next symbol after the closing $ until after + // switching modes back. So don't consume within expect. + + parser.expect(close, false); + parser.switchMode(outerMode); + parser.consume(); + return { + type: "styling", + mode: parser.mode, + style: "text", + body: body + }; + } +}); // Check for extra closing math delimiters + +defineFunction({ + type: "text", + // Doesn't matter what this is. + names: ["\\)", "\\]"], + props: { + numArgs: 0, + allowedInText: true, + allowedInMath: false + }, + handler: function handler(context, args) { + throw new src_ParseError("Mismatched " + context.funcName); + } +}); +// CONCATENATED MODULE: ./src/functions/mathchoice.js + + + + + + +var mathchoice_chooseMathStyle = function chooseMathStyle(group, options) { + switch (options.style.size) { + case src_Style.DISPLAY.size: + return group.display; + + case src_Style.TEXT.size: + return group.text; + + case src_Style.SCRIPT.size: + return group.script; + + case src_Style.SCRIPTSCRIPT.size: + return group.scriptscript; + + default: + return group.text; + } +}; + +defineFunction({ + type: "mathchoice", + names: ["\\mathchoice"], + props: { + numArgs: 4 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "mathchoice", + mode: parser.mode, + display: defineFunction_ordargument(args[0]), + text: defineFunction_ordargument(args[1]), + script: defineFunction_ordargument(args[2]), + scriptscript: defineFunction_ordargument(args[3]) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var body = mathchoice_chooseMathStyle(group, options); + var elements = buildHTML_buildExpression(body, options, false); + return buildCommon.makeFragment(elements); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var body = mathchoice_chooseMathStyle(group, options); + return buildExpressionRow(body, options); + } +}); +// CONCATENATED MODULE: ./src/functions/op.js +// Limits, symbols + + + + + + + + + +// Most operators have a large successor symbol, but these don't. +var noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also +// "supsub" since some of them (like \int) can affect super/subscripting. + +var op_htmlBuilder = function htmlBuilder(grp, options) { + // Operators are handled in the TeXbook pg. 443-444, rule 13(a). + var supGroup; + var subGroup; + var hasLimits = false; + var group; + var supSub = checkNodeType(grp, "supsub"); + + if (supSub) { + // If we have limits, supsub will pass us its group to handle. Pull + // out the superscript and subscript and set the group to the op in + // its base. + supGroup = supSub.sup; + subGroup = supSub.sub; + group = assertNodeType(supSub.base, "op"); + hasLimits = true; + } else { + group = assertNodeType(grp, "op"); + } + + var style = options.style; + var large = false; + + if (style.size === src_Style.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) { + // Most symbol operators get larger in displaystyle (rule 13) + large = true; + } + + var base; + + if (group.symbol) { + // If this is a symbol, create the symbol. + var fontName = large ? "Size2-Regular" : "Size1-Regular"; + var stash = ""; + + if (group.name === "\\oiint" || group.name === "\\oiiint") { + // No font glyphs yet, so use a glyph w/o the oval. + // TODO: When font glyphs are available, delete this code. + stash = group.name.substr(1); // $FlowFixMe + + group.name = stash === "oiint" ? "\\iint" : "\\iiint"; + } + + base = buildCommon.makeSymbol(group.name, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]); + + if (stash.length > 0) { + // We're in \oiint or \oiiint. Overlay the oval. + // TODO: When font glyphs are available, delete this code. + var italic = base.italic; + var oval = buildCommon.staticSvg(stash + "Size" + (large ? "2" : "1"), options); + base = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: base, + shift: 0 + }, { + type: "elem", + elem: oval, + shift: large ? 0.08 : 0 + }] + }, options); // $FlowFixMe + + group.name = "\\" + stash; + base.classes.unshift("mop"); // $FlowFixMe + + base.italic = italic; + } + } else if (group.body) { + // If this is a list, compose that list. + var inner = buildHTML_buildExpression(group.body, options, true); + + if (inner.length === 1 && inner[0] instanceof domTree_SymbolNode) { + base = inner[0]; + base.classes[0] = "mop"; // replace old mclass + } else { + base = buildCommon.makeSpan(["mop"], buildCommon.tryCombineChars(inner), options); + } + } else { + // Otherwise, this is a text operator. Build the text from the + // operator's name. + // TODO(emily): Add a space in the middle of some of these + // operators, like \limsup + var output = []; + + for (var i = 1; i < group.name.length; i++) { + output.push(buildCommon.mathsym(group.name[i], group.mode)); + } + + base = buildCommon.makeSpan(["mop"], output, options); + } // If content of op is a single symbol, shift it vertically. + + + var baseShift = 0; + var slant = 0; + + if ((base instanceof domTree_SymbolNode || group.name === "\\oiint" || group.name === "\\oiiint") && !group.suppressBaseShift) { + // We suppress the shift of the base of \overset and \underset. Otherwise, + // shift the symbol so its center lies on the axis (rule 13). It + // appears that our fonts have the centers of the symbols already + // almost on the axis, so these numbers are very small. Note we + // don't actually apply this here, but instead it is used either in + // the vlist creation or separately when there are no limits. + baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction. + // $FlowFixMe + + slant = base.italic; + } + + if (hasLimits) { + // IE 8 clips \int if it is in a display: inline-block. We wrap it + // in a new span so it is an inline, and works. + base = buildCommon.makeSpan([], [base]); + var sub; + var sup; // We manually have to handle the superscripts and subscripts. This, + // aside from the kern calculations, is copied from supsub. + + if (supGroup) { + var elem = buildHTML_buildGroup(supGroup, options.havingStyle(style.sup()), options); + sup = { + elem: elem, + kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) + }; + } + + if (subGroup) { + var _elem = buildHTML_buildGroup(subGroup, options.havingStyle(style.sub()), options); + + sub = { + elem: _elem, + kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) + }; + } // Build the final group as a vlist of the possible subscript, base, + // and possible superscript. + + + var finalGroup; + + if (sup && sub) { + var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; + finalGroup = buildCommon.makeVList({ + positionType: "bottom", + positionData: bottom, + children: [{ + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }, { + type: "elem", + elem: sub.elem, + marginLeft: -slant + "em" + }, { + type: "kern", + size: sub.kern + }, { + type: "elem", + elem: base + }, { + type: "kern", + size: sup.kern + }, { + type: "elem", + elem: sup.elem, + marginLeft: slant + "em" + }, { + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }] + }, options); + } else if (sub) { + var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note + // that we are supposed to shift the limits by 1/2 of the slant, + // but since we are centering the limits adding a full slant of + // margin will shift by 1/2 that. + + finalGroup = buildCommon.makeVList({ + positionType: "top", + positionData: top, + children: [{ + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }, { + type: "elem", + elem: sub.elem, + marginLeft: -slant + "em" + }, { + type: "kern", + size: sub.kern + }, { + type: "elem", + elem: base + }] + }, options); + } else if (sup) { + var _bottom = base.depth + baseShift; + + finalGroup = buildCommon.makeVList({ + positionType: "bottom", + positionData: _bottom, + children: [{ + type: "elem", + elem: base + }, { + type: "kern", + size: sup.kern + }, { + type: "elem", + elem: sup.elem, + marginLeft: slant + "em" + }, { + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }] + }, options); + } else { + // This case probably shouldn't occur (this would mean the + // supsub was sending us a group with no superscript or + // subscript) but be safe. + return base; + } + + return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options); + } else { + if (baseShift) { + base.style.position = "relative"; + base.style.top = baseShift + "em"; + } + + return base; + } +}; + +var op_mathmlBuilder = function mathmlBuilder(group, options) { + var node; + + if (group.symbol) { + // This is a symbol. Just add the symbol. + node = new mathMLTree_MathNode("mo", [buildMathML_makeText(group.name, group.mode)]); + + if (utils.contains(noSuccessor, group.name)) { + node.setAttribute("largeop", "false"); + } + } else if (group.body) { + // This is an operator with children. Add them. + node = new mathMLTree_MathNode("mo", buildMathML_buildExpression(group.body, options)); + } else { + // This is a text operator. Add all of the characters from the + // operator's name. + // TODO(emily): Add a space in the middle of some of these + // operators, like \limsup. + node = new mathMLTree_MathNode("mi", [new mathMLTree_TextNode(group.name.slice(1))]); // Append an <mo>⁡</mo>. + // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 + + var operator = new mathMLTree_MathNode("mo", [buildMathML_makeText("\u2061", "text")]); + + if (group.parentIsSupSub) { + node = new mathMLTree_MathNode("mo", [node, operator]); + } else { + node = newDocumentFragment([node, operator]); + } + } + + return node; +}; + +var singleCharBigOps = { + "\u220F": "\\prod", + "\u2210": "\\coprod", + "\u2211": "\\sum", + "\u22C0": "\\bigwedge", + "\u22C1": "\\bigvee", + "\u22C2": "\\bigcap", + "\u22C3": "\\bigcup", + "\u2A00": "\\bigodot", + "\u2A01": "\\bigoplus", + "\u2A02": "\\bigotimes", + "\u2A04": "\\biguplus", + "\u2A06": "\\bigsqcup" +}; +defineFunction({ + type: "op", + names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"], + props: { + numArgs: 0 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var fName = funcName; + + if (fName.length === 1) { + fName = singleCharBigOps[fName]; + } + + return { + type: "op", + mode: parser.mode, + limits: true, + parentIsSupSub: false, + symbol: true, + name: fName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // Note: calling defineFunction with a type that's already been defined only +// works because the same htmlBuilder and mathmlBuilder are being used. + +defineFunction({ + type: "op", + names: ["\\mathop"], + props: { + numArgs: 1 + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var body = args[0]; + return { + type: "op", + mode: parser.mode, + limits: false, + parentIsSupSub: false, + symbol: false, + body: defineFunction_ordargument(body) + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // There are 2 flags for operators; whether they produce limits in +// displaystyle, and whether they are symbols and should grow in +// displaystyle. These four groups cover the four possible choices. + +var singleCharIntegrals = { + "\u222B": "\\int", + "\u222C": "\\iint", + "\u222D": "\\iiint", + "\u222E": "\\oint", + "\u222F": "\\oiint", + "\u2230": "\\oiiint" +}; // No limits, not symbols + +defineFunction({ + type: "op", + names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"], + props: { + numArgs: 0 + }, + handler: function handler(_ref3) { + var parser = _ref3.parser, + funcName = _ref3.funcName; + return { + type: "op", + mode: parser.mode, + limits: false, + parentIsSupSub: false, + symbol: false, + name: funcName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // Limits, not symbols + +defineFunction({ + type: "op", + names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], + props: { + numArgs: 0 + }, + handler: function handler(_ref4) { + var parser = _ref4.parser, + funcName = _ref4.funcName; + return { + type: "op", + mode: parser.mode, + limits: true, + parentIsSupSub: false, + symbol: false, + name: funcName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // No limits, symbols + +defineFunction({ + type: "op", + names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222B", "\u222C", "\u222D", "\u222E", "\u222F", "\u2230"], + props: { + numArgs: 0 + }, + handler: function handler(_ref5) { + var parser = _ref5.parser, + funcName = _ref5.funcName; + var fName = funcName; + + if (fName.length === 1) { + fName = singleCharIntegrals[fName]; + } + + return { + type: "op", + mode: parser.mode, + limits: false, + parentIsSupSub: false, + symbol: true, + name: fName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); +// CONCATENATED MODULE: ./src/functions/operatorname.js + + + + + + // \operatorname +// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ + +defineFunction({ + type: "operatorname", + names: ["\\operatorname"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var body = args[0]; + return { + type: "operatorname", + mode: parser.mode, + body: defineFunction_ordargument(body) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + if (group.body.length > 0) { + var body = group.body.map(function (child) { + // $FlowFixMe: Check if the node has a string `text` property. + var childText = child.text; + + if (typeof childText === "string") { + return { + type: "textord", + mode: child.mode, + text: childText + }; + } else { + return child; + } + }); // Consolidate function names into symbol characters. + + var expression = buildHTML_buildExpression(body, options.withFont("mathrm"), true); + + for (var i = 0; i < expression.length; i++) { + var child = expression[i]; + + if (child instanceof domTree_SymbolNode) { + // Per amsopn package, + // change minus to hyphen and \ast to asterisk + child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); + } + } + + return buildCommon.makeSpan(["mop"], expression, options); + } else { + return buildCommon.makeSpan(["mop"], [], options); + } + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // The steps taken here are similar to the html version. + var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction? + + var isAllString = true; // default + + for (var i = 0; i < expression.length; i++) { + var node = expression[i]; + + if (node instanceof mathMLTree.SpaceNode) {// Do nothing + } else if (node instanceof mathMLTree.MathNode) { + switch (node.type) { + case "mi": + case "mn": + case "ms": + case "mspace": + case "mtext": + break; + // Do nothing yet. + + case "mo": + { + var child = node.children[0]; + + if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { + child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); + } else { + isAllString = false; + } + + break; + } + + default: + isAllString = false; + } + } else { + isAllString = false; + } + } + + if (isAllString) { + // Write a single TextNode instead of multiple nested tags. + var word = expression.map(function (node) { + return node.toText(); + }).join(""); + expression = [new mathMLTree.TextNode(word)]; + } + + var identifier = new mathMLTree.MathNode("mi", expression); + identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as ⁡ + // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp + + var operator = new mathMLTree.MathNode("mo", [buildMathML_makeText("\u2061", "text")]); + return mathMLTree.newDocumentFragment([identifier, operator]); + } +}); +// CONCATENATED MODULE: ./src/functions/ordgroup.js + + + + +defineFunctionBuilders({ + type: "ordgroup", + htmlBuilder: function htmlBuilder(group, options) { + if (group.semisimple) { + return buildCommon.makeFragment(buildHTML_buildExpression(group.body, options, false)); + } + + return buildCommon.makeSpan(["mord"], buildHTML_buildExpression(group.body, options, true), options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return buildExpressionRow(group.body, options); + } +}); +// CONCATENATED MODULE: ./src/functions/overline.js + + + + + +defineFunction({ + type: "overline", + names: ["\\overline"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var body = args[0]; + return { + type: "overline", + mode: parser.mode, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Overlines are handled in the TeXbook pg 443, Rule 9. + // Build the inner group in the cramped style. + var innerGroup = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body + + var line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns + + var vlist = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: innerGroup + }, { + type: "kern", + size: 3 * line.height + }, { + type: "elem", + elem: line + }, { + type: "kern", + size: line.height + }] + }, options); + return buildCommon.makeSpan(["mord", "overline"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); + operator.setAttribute("stretchy", "true"); + var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.body, options), operator]); + node.setAttribute("accent", "true"); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/phantom.js + + + + + +defineFunction({ + type: "phantom", + names: ["\\phantom"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var body = args[0]; + return { + type: "phantom", + mode: parser.mode, + body: defineFunction_ordargument(body) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildHTML_buildExpression(group.body, options.withPhantom(), false); // \phantom isn't supposed to affect the elements it contains. + // See "color" for more details. + + return buildCommon.makeFragment(elements); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(group.body, options); + return new mathMLTree.MathNode("mphantom", inner); + } +}); +defineFunction({ + type: "hphantom", + names: ["\\hphantom"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var body = args[0]; + return { + type: "hphantom", + mode: parser.mode, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options.withPhantom())]); + node.height = 0; + node.depth = 0; + + if (node.children) { + for (var i = 0; i < node.children.length; i++) { + node.children[i].height = 0; + node.children[i].depth = 0; + } + } // See smash for comment re: use of makeVList + + + node = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: node + }] + }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord). + + return buildCommon.makeSpan(["mord"], [node], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options); + var phantom = new mathMLTree.MathNode("mphantom", inner); + var node = new mathMLTree.MathNode("mpadded", [phantom]); + node.setAttribute("height", "0px"); + node.setAttribute("depth", "0px"); + return node; + } +}); +defineFunction({ + type: "vphantom", + names: ["\\vphantom"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser; + var body = args[0]; + return { + type: "vphantom", + mode: parser.mode, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options.withPhantom())]); + var fix = buildCommon.makeSpan(["fix"], []); + return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options); + var phantom = new mathMLTree.MathNode("mphantom", inner); + var node = new mathMLTree.MathNode("mpadded", [phantom]); + node.setAttribute("width", "0px"); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/sizing.js + + + + + +function sizingGroup(value, options, baseOptions) { + var inner = buildHTML_buildExpression(value, options, false); + var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize + // manually. Handle nested size changes. + + for (var i = 0; i < inner.length; i++) { + var pos = inner[i].classes.indexOf("sizing"); + + if (pos < 0) { + Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); + } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { + // This is a nested size change: e.g., inner[i] is the "b" in + // `\Huge a \small b`. Override the old size (the `reset-` class) + // but not the new size. + inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; + } + + inner[i].height *= multiplier; + inner[i].depth *= multiplier; + } + + return buildCommon.makeFragment(inner); +} +var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; +var sizing_htmlBuilder = function htmlBuilder(group, options) { + // Handle sizing operators like \Huge. Real TeX doesn't actually allow + // these functions inside of math expressions, so we do some special + // handling. + var newOptions = options.havingSize(group.size); + return sizingGroup(group.body, newOptions, options); +}; +defineFunction({ + type: "sizing", + names: sizeFuncs, + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref, args) { + var breakOnTokenText = _ref.breakOnTokenText, + funcName = _ref.funcName, + parser = _ref.parser; + var body = parser.parseExpression(false, breakOnTokenText); + return { + type: "sizing", + mode: parser.mode, + // Figure out what size to use based on the list of functions above + size: sizeFuncs.indexOf(funcName) + 1, + body: body + }; + }, + htmlBuilder: sizing_htmlBuilder, + mathmlBuilder: function mathmlBuilder(group, options) { + var newOptions = options.havingSize(group.size); + var inner = buildMathML_buildExpression(group.body, newOptions); + var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size + // changes, because we don't keep state of what style we're currently + // in, so we can't reset the size to normal before changing it. Now + // that we're passing an options parameter we should be able to fix + // this. + + node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/raisebox.js + + + + + + + // Box manipulation + +defineFunction({ + type: "raisebox", + names: ["\\raisebox"], + props: { + numArgs: 2, + argTypes: ["size", "text"], + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var amount = assertNodeType(args[0], "size").value; + var body = args[1]; + return { + type: "raisebox", + mode: parser.mode, + dy: amount, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var text = { + type: "text", + mode: group.mode, + body: defineFunction_ordargument(group.body), + font: "mathrm" // simulate \textrm + + }; + var sizedText = { + type: "sizing", + mode: group.mode, + body: [text], + size: 6 // simulate \normalsize + + }; + var body = sizing_htmlBuilder(sizedText, options); + var dy = units_calculateSize(group.dy, options); + return buildCommon.makeVList({ + positionType: "shift", + positionData: -dy, + children: [{ + type: "elem", + elem: body + }] + }, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); + var dy = group.dy.number + group.dy.unit; + node.setAttribute("voffset", dy); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/rule.js + + + + + +defineFunction({ + type: "rule", + names: ["\\rule"], + props: { + numArgs: 2, + numOptionalArgs: 1, + argTypes: ["size", "size", "size"] + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var shift = optArgs[0]; + var width = assertNodeType(args[0], "size"); + var height = assertNodeType(args[1], "size"); + return { + type: "rule", + mode: parser.mode, + shift: shift && assertNodeType(shift, "size").value, + width: width.value, + height: height.value + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Make an empty span for the rule + var rule = buildCommon.makeSpan(["mord", "rule"], [], options); // Calculate the shift, width, and height of the rule, and account for units + + var width = units_calculateSize(group.width, options); + var height = units_calculateSize(group.height, options); + var shift = group.shift ? units_calculateSize(group.shift, options) : 0; // Style the rule to the right size + + rule.style.borderRightWidth = width + "em"; + rule.style.borderTopWidth = height + "em"; + rule.style.bottom = shift + "em"; // Record the height and width + + rule.width = width; + rule.height = height + shift; + rule.depth = -shift; // Font size is the number large enough that the browser will + // reserve at least `absHeight` space above the baseline. + // The 1.125 factor was empirically determined + + rule.maxFontSize = height * 1.125 * options.sizeMultiplier; + return rule; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var width = units_calculateSize(group.width, options); + var height = units_calculateSize(group.height, options); + var shift = group.shift ? units_calculateSize(group.shift, options) : 0; + var color = options.color && options.getColor() || "black"; + var rule = new mathMLTree.MathNode("mspace"); + rule.setAttribute("mathbackground", color); + rule.setAttribute("width", width + "em"); + rule.setAttribute("height", height + "em"); + var wrapper = new mathMLTree.MathNode("mpadded", [rule]); + + if (shift >= 0) { + wrapper.setAttribute("height", "+" + shift + "em"); + } else { + wrapper.setAttribute("height", shift + "em"); + wrapper.setAttribute("depth", "+" + -shift + "em"); + } + + wrapper.setAttribute("voffset", shift + "em"); + return wrapper; + } +}); +// CONCATENATED MODULE: ./src/functions/smash.js +// smash, with optional [tb], as in AMS + + + + + + +defineFunction({ + type: "smash", + names: ["\\smash"], + props: { + numArgs: 1, + numOptionalArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var smashHeight = false; + var smashDepth = false; + var tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); + + if (tbArg) { + // Optional [tb] argument is engaged. + // ref: amsmath: \renewcommand{\smash}[1][tb]{% + // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% + var letter = ""; + + for (var i = 0; i < tbArg.body.length; ++i) { + var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property. + + letter = node.text; + + if (letter === "t") { + smashHeight = true; + } else if (letter === "b") { + smashDepth = true; + } else { + smashHeight = false; + smashDepth = false; + break; + } + } + } else { + smashHeight = true; + smashDepth = true; + } + + var body = args[0]; + return { + type: "smash", + mode: parser.mode, + body: body, + smashHeight: smashHeight, + smashDepth: smashDepth + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); + + if (!group.smashHeight && !group.smashDepth) { + return node; + } + + if (group.smashHeight) { + node.height = 0; // In order to influence makeVList, we have to reset the children. + + if (node.children) { + for (var i = 0; i < node.children.length; i++) { + node.children[i].height = 0; + } + } + } + + if (group.smashDepth) { + node.depth = 0; + + if (node.children) { + for (var _i = 0; _i < node.children.length; _i++) { + node.children[_i].depth = 0; + } + } + } // At this point, we've reset the TeX-like height and depth values. + // But the span still has an HTML line height. + // makeVList applies "display: table-cell", which prevents the browser + // from acting on that line height. So we'll call makeVList now. + + + var smashedNode = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: node + }] + }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord). + + return buildCommon.makeSpan(["mord"], [smashedNode], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); + + if (group.smashHeight) { + node.setAttribute("height", "0px"); + } + + if (group.smashDepth) { + node.setAttribute("depth", "0px"); + } + + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/sqrt.js + + + + + + + +defineFunction({ + type: "sqrt", + names: ["\\sqrt"], + props: { + numArgs: 1, + numOptionalArgs: 1 + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var index = optArgs[0]; + var body = args[0]; + return { + type: "sqrt", + mode: parser.mode, + body: body, + index: index + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Square roots are handled in the TeXbook pg. 443, Rule 11. + // First, we do the same steps as in overline to build the inner group + // and line + var inner = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); + + if (inner.height === 0) { + // Render a small surd. + inner.height = options.fontMetrics().xHeight; + } // Some groups can return document fragments. Handle those by wrapping + // them in a span. + + + inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \surd delimiter + + var metrics = options.fontMetrics(); + var theta = metrics.defaultRuleThickness; + var phi = theta; + + if (options.style.id < src_Style.TEXT.id) { + phi = options.fontMetrics().xHeight; + } // Calculate the clearance between the body and line + + + var lineClearance = theta + phi / 4; + var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size + + var _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options), + img = _delimiter$sqrtImage.span, + ruleWidth = _delimiter$sqrtImage.ruleWidth, + advanceWidth = _delimiter$sqrtImage.advanceWidth; + + var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size + + if (delimDepth > inner.height + inner.depth + lineClearance) { + lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2; + } // Shift the sqrt image + + + var imgShift = img.height - inner.height - lineClearance - ruleWidth; + inner.style.paddingLeft = advanceWidth + "em"; // Overlay the image and the argument. + + var body = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: inner, + wrapperClasses: ["svg-align"] + }, { + type: "kern", + size: -(inner.height + imgShift) + }, { + type: "elem", + elem: img + }, { + type: "kern", + size: ruleWidth + }] + }, options); + + if (!group.index) { + return buildCommon.makeSpan(["mord", "sqrt"], [body], options); + } else { + // Handle the optional root index + // The index is always in scriptscript style + var newOptions = options.havingStyle(src_Style.SCRIPTSCRIPT); + var rootm = buildHTML_buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX + // source, in the definition of `\r@@t`. + + var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly + + var rootVList = buildCommon.makeVList({ + positionType: "shift", + positionData: -toShift, + children: [{ + type: "elem", + elem: rootm + }] + }, options); // Add a class surrounding it so we can add on the appropriate + // kerning + + var rootVListWrap = buildCommon.makeSpan(["root"], [rootVList]); + return buildCommon.makeSpan(["mord", "sqrt"], [rootVListWrap, body], options); + } + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var body = group.body, + index = group.index; + return index ? new mathMLTree.MathNode("mroot", [buildMathML_buildGroup(body, options), buildMathML_buildGroup(index, options)]) : new mathMLTree.MathNode("msqrt", [buildMathML_buildGroup(body, options)]); + } +}); +// CONCATENATED MODULE: ./src/functions/styling.js + + + + + +var styling_styleMap = { + "display": src_Style.DISPLAY, + "text": src_Style.TEXT, + "script": src_Style.SCRIPT, + "scriptscript": src_Style.SCRIPTSCRIPT +}; +defineFunction({ + type: "styling", + names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref, args) { + var breakOnTokenText = _ref.breakOnTokenText, + funcName = _ref.funcName, + parser = _ref.parser; + // parse out the implicit body + var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g. + // here and in buildHTML and de-dupe the enumeration of all the styles). + // $FlowFixMe: The names above exactly match the styles. + + var style = funcName.slice(1, funcName.length - 5); + return { + type: "styling", + mode: parser.mode, + // Figure out what style to use by pulling out the style from + // the function name + style: style, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Style changes are handled in the TeXbook on pg. 442, Rule 3. + var newStyle = styling_styleMap[group.style]; + var newOptions = options.havingStyle(newStyle).withFont(''); + return sizingGroup(group.body, newOptions, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // Figure out what style we're changing to. + // TODO(kevinb): dedupe this with buildHTML.js + // This will be easier of handling of styling nodes is in the same file. + var styleMap = { + "display": src_Style.DISPLAY, + "text": src_Style.TEXT, + "script": src_Style.SCRIPT, + "scriptscript": src_Style.SCRIPTSCRIPT + }; + var newStyle = styleMap[group.style]; + var newOptions = options.havingStyle(newStyle); + var inner = buildMathML_buildExpression(group.body, newOptions); + var node = new mathMLTree.MathNode("mstyle", inner); + var styleAttributes = { + "display": ["0", "true"], + "text": ["0", "false"], + "script": ["1", "false"], + "scriptscript": ["2", "false"] + }; + var attr = styleAttributes[group.style]; + node.setAttribute("scriptlevel", attr[0]); + node.setAttribute("displaystyle", attr[1]); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/supsub.js + + + + + + + + + + + + + +/** + * Sometimes, groups perform special rules when they have superscripts or + * subscripts attached to them. This function lets the `supsub` group know that + * Sometimes, groups perform special rules when they have superscripts or + * its inner element should handle the superscripts and subscripts instead of + * handling them itself. + */ +var supsub_htmlBuilderDelegate = function htmlBuilderDelegate(group, options) { + var base = group.base; + + if (!base) { + return null; + } else if (base.type === "op") { + // Operators handle supsubs differently when they have limits + // (e.g. `\displaystyle\sum_2^3`) + var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub); + return delegate ? op_htmlBuilder : null; + } else if (base.type === "accent") { + return utils.isCharacterBox(base.base) ? accent_htmlBuilder : null; + } else if (base.type === "horizBrace") { + var isSup = !group.sub; + return isSup === base.isOver ? horizBrace_htmlBuilder : null; + } else { + return null; + } +}; // Super scripts and subscripts, whose precise placement can depend on other +// functions that precede them. + + +defineFunctionBuilders({ + type: "supsub", + htmlBuilder: function htmlBuilder(group, options) { + // Superscript and subscripts are handled in the TeXbook on page + // 445-446, rules 18(a-f). + // Here is where we defer to the inner group if it should handle + // superscripts and subscripts itself. + var builderDelegate = supsub_htmlBuilderDelegate(group, options); + + if (builderDelegate) { + return builderDelegate(group, options); + } + + var valueBase = group.base, + valueSup = group.sup, + valueSub = group.sub; + var base = buildHTML_buildGroup(valueBase, options); + var supm; + var subm; + var metrics = options.fontMetrics(); // Rule 18a + + var supShift = 0; + var subShift = 0; + var isCharacterBox = valueBase && utils.isCharacterBox(valueBase); + + if (valueSup) { + var newOptions = options.havingStyle(options.style.sup()); + supm = buildHTML_buildGroup(valueSup, newOptions, options); + + if (!isCharacterBox) { + supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier; + } + } + + if (valueSub) { + var _newOptions = options.havingStyle(options.style.sub()); + + subm = buildHTML_buildGroup(valueSub, _newOptions, options); + + if (!isCharacterBox) { + subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier; + } + } // Rule 18c + + + var minSupShift; + + if (options.style === src_Style.DISPLAY) { + minSupShift = metrics.sup1; + } else if (options.style.cramped) { + minSupShift = metrics.sup3; + } else { + minSupShift = metrics.sup2; + } // scriptspace is a font-size-independent size, so scale it + // appropriately for use as the marginRight. + + + var multiplier = options.sizeMultiplier; + var marginRight = 0.5 / metrics.ptPerEm / multiplier + "em"; + var marginLeft = null; + + if (subm) { + // Subscripts shouldn't be shifted by the base's italic correction. + // Account for that by shifting the subscript back the appropriate + // amount. Note we only do this when the base is a single symbol. + var isOiint = group.base && group.base.type === "op" && group.base.name && (group.base.name === "\\oiint" || group.base.name === "\\oiiint"); + + if (base instanceof domTree_SymbolNode || isOiint) { + // $FlowFixMe + marginLeft = -base.italic + "em"; + } + } + + var supsub; + + if (supm && subm) { + supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); + subShift = Math.max(subShift, metrics.sub2); + var ruleWidth = metrics.defaultRuleThickness; // Rule 18e + + var maxWidth = 4 * ruleWidth; + + if (supShift - supm.depth - (subm.height - subShift) < maxWidth) { + subShift = maxWidth - (supShift - supm.depth) + subm.height; + var psi = 0.8 * metrics.xHeight - (supShift - supm.depth); + + if (psi > 0) { + supShift += psi; + subShift -= psi; + } + } + + var vlistElem = [{ + type: "elem", + elem: subm, + shift: subShift, + marginRight: marginRight, + marginLeft: marginLeft + }, { + type: "elem", + elem: supm, + shift: -supShift, + marginRight: marginRight + }]; + supsub = buildCommon.makeVList({ + positionType: "individualShift", + children: vlistElem + }, options); + } else if (subm) { + // Rule 18b + subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight); + var _vlistElem = [{ + type: "elem", + elem: subm, + marginLeft: marginLeft, + marginRight: marginRight + }]; + supsub = buildCommon.makeVList({ + positionType: "shift", + positionData: subShift, + children: _vlistElem + }, options); + } else if (supm) { + // Rule 18c, d + supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); + supsub = buildCommon.makeVList({ + positionType: "shift", + positionData: -supShift, + children: [{ + type: "elem", + elem: supm, + marginRight: marginRight + }] + }, options); + } else { + throw new Error("supsub must have either sup or sub."); + } // Wrap the supsub vlist in a span.msupsub to reset text-align. + + + var mclass = getTypeOfDomTree(base, "right") || "mord"; + return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan(["msupsub"], [supsub])], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // Is the inner group a relevant horizonal brace? + var isBrace = false; + var isOver; + var isSup; + var horizBrace = checkNodeType(group.base, "horizBrace"); + + if (horizBrace) { + isSup = !!group.sup; + + if (isSup === horizBrace.isOver) { + isBrace = true; + isOver = horizBrace.isOver; + } + } + + if (group.base && group.base.type === "op") { + group.base.parentIsSupSub = true; + } + + var children = [buildMathML_buildGroup(group.base, options)]; + + if (group.sub) { + children.push(buildMathML_buildGroup(group.sub, options)); + } + + if (group.sup) { + children.push(buildMathML_buildGroup(group.sup, options)); + } + + var nodeType; + + if (isBrace) { + nodeType = isOver ? "mover" : "munder"; + } else if (!group.sub) { + var base = group.base; + + if (base && base.type === "op" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) { + nodeType = "mover"; + } else { + nodeType = "msup"; + } + } else if (!group.sup) { + var _base = group.base; + + if (_base && _base.type === "op" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) { + nodeType = "munder"; + } else { + nodeType = "msub"; + } + } else { + var _base2 = group.base; + + if (_base2 && _base2.type === "op" && _base2.limits && options.style === src_Style.DISPLAY) { + nodeType = "munderover"; + } else { + nodeType = "msubsup"; + } + } + + var node = new mathMLTree.MathNode(nodeType, children); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/symbolsOp.js + + + + // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. + +defineFunctionBuilders({ + type: "atom", + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.mathsym(group.text, group.mode, options, ["m" + group.family]); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.text, group.mode)]); + + if (group.family === "bin") { + var variant = buildMathML_getVariant(group, options); + + if (variant === "bold-italic") { + node.setAttribute("mathvariant", variant); + } + } else if (group.family === "punct") { + node.setAttribute("separator", "true"); + } else if (group.family === "open" || group.family === "close") { + // Delims built here should not stretch vertically. + // See delimsizing.js for stretchy delims. + node.setAttribute("stretchy", "false"); + } + + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/symbolsOrd.js + + + + +// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in +var defaultVariant = { + "mi": "italic", + "mn": "normal", + "mtext": "normal" +}; +defineFunctionBuilders({ + type: "mathord", + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.makeOrd(group, options, "mathord"); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mi", [buildMathML_makeText(group.text, group.mode, options)]); + var variant = buildMathML_getVariant(group, options) || "italic"; + + if (variant !== defaultVariant[node.type]) { + node.setAttribute("mathvariant", variant); + } + + return node; + } +}); +defineFunctionBuilders({ + type: "textord", + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.makeOrd(group, options, "textord"); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var text = buildMathML_makeText(group.text, group.mode, options); + var variant = buildMathML_getVariant(group, options) || "normal"; + var node; + + if (group.mode === 'text') { + node = new mathMLTree.MathNode("mtext", [text]); + } else if (/[0-9]/.test(group.text)) { + // TODO(kevinb) merge adjacent <mn> nodes + // do it as a post processing step + node = new mathMLTree.MathNode("mn", [text]); + } else if (group.text === "\\prime") { + node = new mathMLTree.MathNode("mo", [text]); + } else { + node = new mathMLTree.MathNode("mi", [text]); + } + + if (variant !== defaultVariant[node.type]) { + node.setAttribute("mathvariant", variant); + } + + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/symbolsSpacing.js + + + + // A map of CSS-based spacing functions to their CSS class. + +var cssSpace = { + "\\nobreak": "nobreak", + "\\allowbreak": "allowbreak" +}; // A lookup table to determine whether a spacing function/symbol should be +// treated like a regular space character. If a symbol or command is a key +// in this table, then it should be a regular space character. Furthermore, +// the associated value may have a `className` specifying an extra CSS class +// to add to the created `span`. + +var regularSpace = { + " ": {}, + "\\ ": {}, + "~": { + className: "nobreak" + }, + "\\space": {}, + "\\nobreakspace": { + className: "nobreak" + } +}; // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in +// src/symbols.js. + +defineFunctionBuilders({ + type: "spacing", + htmlBuilder: function htmlBuilder(group, options) { + if (regularSpace.hasOwnProperty(group.text)) { + var className = regularSpace[group.text].className || ""; // Spaces are generated by adding an actual space. Each of these + // things has an entry in the symbols table, so these will be turned + // into appropriate outputs. + + if (group.mode === "text") { + var ord = buildCommon.makeOrd(group, options, "textord"); + ord.classes.push(className); + return ord; + } else { + return buildCommon.makeSpan(["mspace", className], [buildCommon.mathsym(group.text, group.mode, options)], options); + } + } else if (cssSpace.hasOwnProperty(group.text)) { + // Spaces based on just a CSS class. + return buildCommon.makeSpan(["mspace", cssSpace[group.text]], [], options); + } else { + throw new src_ParseError("Unknown type of space \"" + group.text + "\""); + } + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node; + + if (regularSpace.hasOwnProperty(group.text)) { + node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\xA0")]); + } else if (cssSpace.hasOwnProperty(group.text)) { + // CSS-based MathML spaces (\nobreak, \allowbreak) are ignored + return new mathMLTree.MathNode("mspace"); + } else { + throw new src_ParseError("Unknown type of space \"" + group.text + "\""); + } + + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/tag.js + + + + +var tag_pad = function pad() { + var padNode = new mathMLTree.MathNode("mtd", []); + padNode.setAttribute("width", "50%"); + return padNode; +}; + +defineFunctionBuilders({ + type: "tag", + mathmlBuilder: function mathmlBuilder(group, options) { + var table = new mathMLTree.MathNode("mtable", [new mathMLTree.MathNode("mtr", [tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.body, options)]), tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.tag, options)])])]); + table.setAttribute("width", "100%"); + return table; // TODO: Left-aligned tags. + // Currently, the group and options passed here do not contain + // enough info to set tag alignment. `leqno` is in Settings but it is + // not passed to Options. On the HTML side, leqno is + // set by a CSS class applied in buildTree.js. That would have worked + // in MathML if browsers supported <mlabeledtr>. Since they don't, we + // need to rewrite the way this function is called. + } +}); +// CONCATENATED MODULE: ./src/functions/text.js + + + + // Non-mathy text, possibly in a font + +var textFontFamilies = { + "\\text": undefined, + "\\textrm": "textrm", + "\\textsf": "textsf", + "\\texttt": "texttt", + "\\textnormal": "textrm" +}; +var textFontWeights = { + "\\textbf": "textbf", + "\\textmd": "textmd" +}; +var textFontShapes = { + "\\textit": "textit", + "\\textup": "textup" +}; + +var optionsWithFont = function optionsWithFont(group, options) { + var font = group.font; // Checks if the argument is a font family or a font style. + + if (!font) { + return options; + } else if (textFontFamilies[font]) { + return options.withTextFontFamily(textFontFamilies[font]); + } else if (textFontWeights[font]) { + return options.withTextFontWeight(textFontWeights[font]); + } else { + return options.withTextFontShape(textFontShapes[font]); + } +}; + +defineFunction({ + type: "text", + names: [// Font families + "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", // Font weights + "\\textbf", "\\textmd", // Font Shapes + "\\textit", "\\textup"], + props: { + numArgs: 1, + argTypes: ["text"], + greediness: 2, + allowedInText: true, + consumeMode: "text" + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + return { + type: "text", + mode: parser.mode, + body: defineFunction_ordargument(body), + font: funcName + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var newOptions = optionsWithFont(group, options); + var inner = buildHTML_buildExpression(group.body, newOptions, true); + return buildCommon.makeSpan(["mord", "text"], buildCommon.tryCombineChars(inner), newOptions); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var newOptions = optionsWithFont(group, options); + return buildExpressionRow(group.body, newOptions); + } +}); +// CONCATENATED MODULE: ./src/functions/underline.js + + + + + +defineFunction({ + type: "underline", + names: ["\\underline"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "underline", + mode: parser.mode, + body: args[0] + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Underlines are handled in the TeXbook pg 443, Rule 10. + // Build the inner group. + var innerGroup = buildHTML_buildGroup(group.body, options); // Create the line to go below the body + + var line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns + + var vlist = buildCommon.makeVList({ + positionType: "top", + positionData: innerGroup.height, + children: [{ + type: "kern", + size: line.height + }, { + type: "elem", + elem: line + }, { + type: "kern", + size: 3 * line.height + }, { + type: "elem", + elem: innerGroup + }] + }, options); + return buildCommon.makeSpan(["mord", "underline"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); + operator.setAttribute("stretchy", "true"); + var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.body, options), operator]); + node.setAttribute("accentunder", "true"); + return node; + } +}); +// CONCATENATED MODULE: ./src/functions/verb.js + + + + +defineFunction({ + type: "verb", + names: ["\\verb"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(context, args, optArgs) { + // \verb and \verb* are dealt with directly in Parser.js. + // If we end up here, it's because of a failure to match the two delimiters + // in the regex in Lexer.js. LaTeX raises the following error when \verb is + // terminated by end of line (or file). + throw new src_ParseError("\\verb ended by end of line instead of matching delimiter"); + }, + htmlBuilder: function htmlBuilder(group, options) { + var text = makeVerb(group); + var body = []; // \verb enters text mode and therefore is sized like \textstyle + + var newOptions = options.havingStyle(options.style.text()); + + for (var i = 0; i < text.length; i++) { + var c = text[i]; + + if (c === '~') { + c = '\\textasciitilde'; + } + + body.push(buildCommon.makeSymbol(c, "Typewriter-Regular", group.mode, newOptions, ["mord", "texttt"])); + } + + return buildCommon.makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var text = new mathMLTree.TextNode(makeVerb(group)); + var node = new mathMLTree.MathNode("mtext", [text]); + node.setAttribute("mathvariant", "monospace"); + return node; + } +}); +/** + * Converts verb group into body string. + * + * \verb* replaces each space with an open box \u2423 + * \verb replaces each space with a no-break space \xA0 + */ + +var makeVerb = function makeVerb(group) { + return group.body.replace(/ /g, group.star ? "\u2423" : '\xA0'); +}; +// CONCATENATED MODULE: ./src/functions.js +/** Include this to ensure that all functions are defined. */ + +var functions = _functions; +/* harmony default export */ var src_functions = (functions); // TODO(kevinb): have functions return an object and call defineFunction with +// that object in this file instead of relying on side-effects. + + + + + + + + + + + + + + + // Disabled until https://github.com/KaTeX/KaTeX/pull/1794 is merged. +// import "./functions/includegraphics"; + + + + + + + + + + + + + + + + + + + + + + + + + +// CONCATENATED MODULE: ./src/Lexer.js /** * The Lexer class handles tokenizing the input in various ways. Since our * parser expects us to be able to backtrack, the lexer allows lexing from any @@ -9035,11 +13280,8 @@ function defineEnvironment(_ref) { - - /* The following tokenRegex * - matches typical whitespace (but not NBSP etc.) using its first group - * - matches comments (must have trailing newlines) * - does not match any control character \x00-\x1f except whitespace * - does not match a bare backslash * - matches any ASCII character except those just mentioned @@ -9053,1267 +13295,2207 @@ function defineEnvironment(_ref) { * If there is no matching function or symbol definition, the Parser will * still reject the input. */ -var commentRegexString = "%[^\n]*[\n]"; +var spaceRegexString = "[ \r\n\t]"; var controlWordRegexString = "\\\\[a-zA-Z@]+"; var controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; +var controlWordWhitespaceRegexString = "" + controlWordRegexString + spaceRegexString + "*"; +var controlWordWhitespaceRegex = new RegExp("^(" + controlWordRegexString + ")" + spaceRegexString + "*$"); var combiningDiacriticalMarkString = "[\u0300-\u036F]"; var combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + "+$"); -var tokenRegex = new RegExp("([ \r\n\t]+)|" + ( // whitespace -"(" + commentRegexString) + // comments -"|[!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint +var tokenRegexString = "(" + spaceRegexString + "+)|" + // whitespace +"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint combiningDiacriticalMarkString + "*") + // ...plus accents "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair combiningDiacriticalMarkString + "*") + // ...plus accents "|\\\\verb\\*([^]).*?\\3" + // \verb* "|\\\\verb([^*a-zA-Z]).*?\\4" + ( // \verb unstarred -"|" + controlWordRegexString) + ( // \macroName -"|" + controlSymbolRegexString) + // \\, \', etc. -")"); - -// tokenRegex has no ^ marker, as required by matchAt. -// These regexs are for matching results from tokenRegex, -// so they do have ^ markers. -var controlWordRegex = new RegExp("^" + controlWordRegexString); -var commentRegex = new RegExp("^" + commentRegexString); +"|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces +"|" + controlSymbolRegexString + ")"); // \\, \', etc. /** Main Lexer class */ -var Lexer = function () { - function Lexer(input) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Lexer); +var Lexer_Lexer = +/*#__PURE__*/ +function () { + // category codes, only supports comment characters (14) for now + function Lexer(input, settings) { + this.input = void 0; + this.settings = void 0; + this.tokenRegex = void 0; + this.catcodes = void 0; + // Separate accents from characters + this.input = input; + this.settings = settings; + this.tokenRegex = new RegExp(tokenRegexString, 'g'); + this.catcodes = { + "%": 14 // comment character - // Separate accents from characters - this.input = input; - this.pos = 0; + }; + } + + var _proto = Lexer.prototype; + + _proto.setCatcode = function setCatcode(char, code) { + this.catcodes[char] = code; + } + /** + * This function lexes a single token. + */ + ; + + _proto.lex = function lex() { + var input = this.input; + var pos = this.tokenRegex.lastIndex; + + if (pos === input.length) { + return new Token_Token("EOF", new SourceLocation(this, pos, pos)); } - /** - * This function lexes a single token. - */ + var match = this.tokenRegex.exec(input); + + if (match === null || match.index !== pos) { + throw new src_ParseError("Unexpected character: '" + input[pos] + "'", new Token_Token(input[pos], new SourceLocation(this, pos, pos + 1))); + } + + var text = match[2] || " "; + + if (this.catcodes[text] === 14) { + // comment character + var nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex); + + if (nlIndex === -1) { + this.tokenRegex.lastIndex = input.length; // EOF + + this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)"); + } else { + this.tokenRegex.lastIndex = nlIndex + 1; + } + + return this.lex(); + } // Trim any trailing whitespace from control word match - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Lexer, [{ - key: "lex", - value: function lex() { - var input = this.input; - var pos = this.pos; - if (pos === input.length) { - return new __WEBPACK_IMPORTED_MODULE_5__Token__["a" /* Token */]("EOF", new __WEBPACK_IMPORTED_MODULE_4__SourceLocation__["a" /* default */](this, pos, pos)); - } - var match = __WEBPACK_IMPORTED_MODULE_2_match_at___default()(tokenRegex, input, pos); - if (match === null) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Unexpected character: '" + input[pos] + "'", new __WEBPACK_IMPORTED_MODULE_5__Token__["a" /* Token */](input[pos], new __WEBPACK_IMPORTED_MODULE_4__SourceLocation__["a" /* default */](this, pos, pos + 1))); - } - var text = match[2] || " "; - var start = this.pos; - this.pos += match[0].length; - var end = this.pos; + var controlMatch = text.match(controlWordWhitespaceRegex); - if (commentRegex.test(text)) { - return this.lex(); - } else { - return new __WEBPACK_IMPORTED_MODULE_5__Token__["a" /* Token */](text, new __WEBPACK_IMPORTED_MODULE_4__SourceLocation__["a" /* default */](this, start, end)); - } - } - }]); + if (controlMatch) { + text = controlMatch[1]; + } - return Lexer; + return new Token_Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); + }; + + return Lexer; }(); -/* harmony default export */ __webpack_exports__["c"] = (Lexer); -/***/ }), -/* 63 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_katex_less__ = __webpack_require__(64); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_katex_less___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_katex_less__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__katex_js__ = __webpack_require__(65); +// CONCATENATED MODULE: ./src/Namespace.js /** - * This is the webpack entry point for KaTeX. As flow[1] and jest[2] doesn't support - * CSS modules natively, a separate entry point is used and it is not flowtyped. - * - * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef - * [2] https://facebook.github.io/jest/docs/en/webpack.html + * A `Namespace` refers to a space of nameable things like macros or lengths, + * which can be `set` either globally or local to a nested group, using an + * undo stack similar to how TeX implements this functionality. + * Performance-wise, `get` and local `set` take constant time, while global + * `set` takes time proportional to the depth of group nesting. */ - -/* harmony default export */ __webpack_exports__["default"] = (__WEBPACK_IMPORTED_MODULE_1__katex_js__["a" /* default */]); - -/***/ }), -/* 64 */ -/***/ (function(module, exports) { - -// removed by extract-text-webpack-plugin - -/***/ }), -/* 65 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_Settings__ = __webpack_require__(34); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_buildTree__ = __webpack_require__(76); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_parseTree__ = __webpack_require__(113); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_utils__ = __webpack_require__(5); - -/* eslint no-console:0 */ -/** - * This is the main entry point for KaTeX. Here, we expose functions for - * rendering expressions either to DOM nodes or to markup strings. - * - * We also expose the ParseError class to check if errors thrown from KaTeX are - * errors in the expression, or errors in javascript handling. - */ - - - - - - - - -/** - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -var render = function render(expression, baseNode, options) { - __WEBPACK_IMPORTED_MODULE_4__src_utils__["a" /* default */].clearNode(baseNode); - var node = renderToDomTree(expression, options).toNode(); - baseNode.appendChild(node); -}; - -// KaTeX's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype."); - - render = function render() { - throw new __WEBPACK_IMPORTED_MODULE_0__src_ParseError__["a" /* default */]("KaTeX doesn't work in quirks mode."); - }; +var Namespace_Namespace = +/*#__PURE__*/ +function () { + /** + * Both arguments are optional. The first argument is an object of + * built-in mappings which never change. The second argument is an object + * of initial (global-level) mappings, which will constantly change + * according to any global/top-level `set`s done. + */ + function Namespace(builtins, globalMacros) { + if (builtins === void 0) { + builtins = {}; } -} -/** - * Parse and build an expression, and return the markup for that. - */ -var renderToString = function renderToString(expression, options) { - var markup = renderToDomTree(expression, options).toMarkup(); - return markup; -}; - -/** - * Parse an expression and return the parse tree. - */ -var generateParseTree = function generateParseTree(expression, options) { - var settings = new __WEBPACK_IMPORTED_MODULE_1__src_Settings__["a" /* default */](options); - return Object(__WEBPACK_IMPORTED_MODULE_3__src_parseTree__["a" /* default */])(expression, settings); -}; - -/** - * Generates and returns the katex build tree. This is used for advanced - * use cases (like rendering to custom output). - */ -var renderToDomTree = function renderToDomTree(expression, options) { - var settings = new __WEBPACK_IMPORTED_MODULE_1__src_Settings__["a" /* default */](options); - var tree = Object(__WEBPACK_IMPORTED_MODULE_3__src_parseTree__["a" /* default */])(expression, settings); - return Object(__WEBPACK_IMPORTED_MODULE_2__src_buildTree__["b" /* buildTree */])(tree, expression, settings); -}; - -/** - * Generates and returns the katex build tree, with just HTML (no MathML). - * This is used for advanced use cases (like rendering to custom output). - */ -var renderToHTMLTree = function renderToHTMLTree(expression, options) { - var settings = new __WEBPACK_IMPORTED_MODULE_1__src_Settings__["a" /* default */](options); - var tree = Object(__WEBPACK_IMPORTED_MODULE_3__src_parseTree__["a" /* default */])(expression, settings); - return Object(__WEBPACK_IMPORTED_MODULE_2__src_buildTree__["a" /* buildHTMLTree */])(tree, expression, settings); -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - /** - * Renders the given LaTeX into an HTML+MathML combination, and adds - * it as a child to the specified DOM node. - */ - render: render, - /** - * Renders the given LaTeX into an HTML+MathML combination string, - * for sending to the client. - */ - renderToString: renderToString, - /** - * KaTeX error, usually during parsing. - */ - ParseError: __WEBPACK_IMPORTED_MODULE_0__src_ParseError__["a" /* default */], - /** - * Parses the given LaTeX into KaTeX's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: generateParseTree, - /** - * Renders the given LaTeX into an HTML+MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToDomTree: renderToDomTree, - /** - * Renders the given LaTeX into an HTML internal DOM tree representation, - * without MathML and without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToHTMLTree: renderToHTMLTree -}); - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(67), __esModule: true }; - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(68); -module.exports = __webpack_require__(8).Object.freeze; - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.5 Object.freeze(O) -var isObject = __webpack_require__(20) - , meta = __webpack_require__(69).onFreeze; - -__webpack_require__(46)('freeze', function($freeze){ - return function freeze(it){ - return $freeze && isObject(it) ? $freeze(meta(it)) : it; - }; -}); - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -var META = __webpack_require__(32)('meta') - , isObject = __webpack_require__(20) - , has = __webpack_require__(21) - , setDesc = __webpack_require__(15).f - , id = 0; -var isExtensible = Object.isExtensible || function(){ - return true; -}; -var FREEZE = !__webpack_require__(24)(function(){ - return isExtensible(Object.preventExtensions({})); -}); -var setMeta = function(it){ - setDesc(it, META, {value: { - i: 'O' + ++id, // object ID - w: {} // weak collections IDs - }}); -}; -var fastKey = function(it, create){ - // return primitive with prefix - if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if(!has(it, META)){ - // can't set metadata to uncaught frozen object - if(!isExtensible(it))return 'F'; - // not necessary to add metadata - if(!create)return 'E'; - // add missing metadata - setMeta(it); - // return object ID - } return it[META].i; -}; -var getWeak = function(it, create){ - if(!has(it, META)){ - // can't set metadata to uncaught frozen object - if(!isExtensible(it))return true; - // not necessary to add metadata - if(!create)return false; - // add missing metadata - setMeta(it); - // return hash weak collections IDs - } return it[META].w; -}; -// add metadata on freeze-family methods calling -var onFreeze = function(it){ - if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it); - return it; -}; -var meta = module.exports = { - KEY: META, - NEED: false, - fastKey: fastKey, - getWeak: getWeak, - onFreeze: onFreeze -}; - -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = !__webpack_require__(23) && !__webpack_require__(24)(function(){ - return Object.defineProperty(__webpack_require__(45)('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); - -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = __webpack_require__(20); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; - -/***/ }), -/* 72 */ -/***/ (function(module, exports) { - -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; - -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(74), __esModule: true }; - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(75); -var $Object = __webpack_require__(8).Object; -module.exports = function defineProperty(it, key, desc){ - return $Object.defineProperty(it, key, desc); -}; - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - -var $export = __webpack_require__(25); -// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) -$export($export.S + $export.F * !__webpack_require__(23), 'Object', {defineProperty: __webpack_require__(15).f}); - -/***/ }), -/* 76 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return buildTree; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return buildHTMLTree; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildMathML__ = __webpack_require__(2); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Options__ = __webpack_require__(43); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Settings__ = __webpack_require__(34); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Style__ = __webpack_require__(9); - - - - - - - -var optionsFromSettings = function optionsFromSettings(settings) { - return new __WEBPACK_IMPORTED_MODULE_3__Options__["a" /* default */]({ - style: settings.displayMode ? __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].DISPLAY : __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].TEXT, - maxSize: settings.maxSize - }); -}; - -var buildTree = function buildTree(tree, expression, settings) { - var options = optionsFromSettings(settings); - // `buildHTML` sometimes messes with the parse tree (like turning bins -> - // ords), so we build the MathML version first. - var mathMLNode = Object(__WEBPACK_IMPORTED_MODULE_1__buildMathML__["c" /* default */])(tree, expression, options); - var htmlNode = Object(__WEBPACK_IMPORTED_MODULE_0__buildHTML__["c" /* default */])(tree, options); - - var katexNode = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex"], [mathMLNode, htmlNode]); - - if (settings.displayMode) { - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex-display"], [katexNode]); - } else { - return katexNode; + if (globalMacros === void 0) { + globalMacros = {}; } -}; -var buildHTMLTree = function buildHTMLTree(tree, expression, settings) { - var options = optionsFromSettings(settings); - var htmlNode = Object(__WEBPACK_IMPORTED_MODULE_0__buildHTML__["c" /* default */])(tree, options); - var katexNode = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex"], [htmlNode]); - if (settings.displayMode) { - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex-display"], [katexNode]); - } else { - return katexNode; - } -}; - -/* unused harmony default export */ var _unused_webpack_default_export = (buildTree); - -/***/ }), -/* 77 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(78), __esModule: true }; - -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -var core = __webpack_require__(8) - , $JSON = core.JSON || (core.JSON = {stringify: JSON.stringify}); -module.exports = function stringify(it){ // eslint-disable-line no-unused-vars - return $JSON.stringify.apply($JSON, arguments); -}; - -/***/ }), -/* 79 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(80), __esModule: true }; - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(36); -__webpack_require__(92); -module.exports = __webpack_require__(8).Array.from; - -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(37) - , defined = __webpack_require__(38); -// true -> String#at -// false -> String#codePointAt -module.exports = function(TO_STRING){ - return function(that, pos){ - var s = String(defined(that)) - , i = toInteger(pos) - , l = s.length - , a, b; - if(i < 0 || i >= l)return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; - -/***/ }), -/* 82 */ -/***/ (function(module, exports) { - -module.exports = true; - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(26); - -/***/ }), -/* 84 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var create = __webpack_require__(85) - , descriptor = __webpack_require__(33) - , setToStringTag = __webpack_require__(54) - , IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -__webpack_require__(26)(IteratorPrototype, __webpack_require__(11)('iterator'), function(){ return this; }); - -module.exports = function(Constructor, NAME, next){ - Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); - setToStringTag(Constructor, NAME + ' Iterator'); -}; - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = __webpack_require__(22) - , dPs = __webpack_require__(86) - , enumBugKeys = __webpack_require__(53) - , IE_PROTO = __webpack_require__(41)('IE_PROTO') - , Empty = function(){ /* empty */ } - , PROTOTYPE = 'prototype'; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function(){ - // Thrash, waste and sodomy: IE GC bug - var iframe = __webpack_require__(45)('iframe') - , i = enumBugKeys.length - , lt = '<' - , gt = '>' - , iframeDocument; - iframe.style.display = 'none'; - __webpack_require__(90).appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; - -module.exports = Object.create || function create(O, Properties){ - var result; - if(O !== null){ - Empty[PROTOTYPE] = anObject(O); - result = new Empty; - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; - - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(15) - , anObject = __webpack_require__(22) - , getKeys = __webpack_require__(39); - -module.exports = __webpack_require__(23) ? Object.defineProperties : function defineProperties(O, Properties){ - anObject(O); - var keys = getKeys(Properties) - , length = keys.length - , i = 0 - , P; - while(length > i)dP.f(O, P = keys[i++], Properties[P]); - return O; -}; - -/***/ }), -/* 87 */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(21) - , toIObject = __webpack_require__(40) - , arrayIndexOf = __webpack_require__(88)(false) - , IE_PROTO = __webpack_require__(41)('IE_PROTO'); - -module.exports = function(object, names){ - var O = toIObject(object) - , i = 0 - , result = [] - , key; - for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while(names.length > i)if(has(O, key = names[i++])){ - ~arrayIndexOf(result, key) || result.push(key); + this.current = void 0; + this.builtins = void 0; + this.undefStack = void 0; + this.current = globalMacros; + this.builtins = builtins; + this.undefStack = []; } - return result; -}; + /** + * Start a new nested group, affecting future local `set`s. + */ -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { -// false -> Array#indexOf -// true -> Array#includes -var toIObject = __webpack_require__(40) - , toLength = __webpack_require__(51) - , toIndex = __webpack_require__(89); -module.exports = function(IS_INCLUDES){ - return function($this, el, fromIndex){ - var O = toIObject($this) - , length = toLength(O.length) - , index = toIndex(fromIndex, length) - , value; - // Array#includes uses SameValueZero equality algorithm - if(IS_INCLUDES && el != el)while(length > index){ - value = O[index++]; - if(value != value)return true; - // Array#toIndex ignores holes, Array#includes - not - } else for(;length > index; index++)if(IS_INCLUDES || index in O){ - if(O[index] === el)return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; + var _proto = Namespace.prototype; -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { + _proto.beginGroup = function beginGroup() { + this.undefStack.push({}); + } + /** + * End current nested group, restoring values before the group began. + */ + ; -var toInteger = __webpack_require__(37) - , max = Math.max - , min = Math.min; -module.exports = function(index, length){ - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; + _proto.endGroup = function endGroup() { + if (this.undefStack.length === 0) { + throw new src_ParseError("Unbalanced namespace destruction: attempt " + "to pop global namespace; please report this as a bug"); + } -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { + var undefs = this.undefStack.pop(); -module.exports = __webpack_require__(16).document && document.documentElement; - -/***/ }), -/* 91 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = __webpack_require__(21) - , toObject = __webpack_require__(29) - , IE_PROTO = __webpack_require__(41)('IE_PROTO') - , ObjectProto = Object.prototype; - -module.exports = Object.getPrototypeOf || function(O){ - O = toObject(O); - if(has(O, IE_PROTO))return O[IE_PROTO]; - if(typeof O.constructor == 'function' && O instanceof O.constructor){ - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; - -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var ctx = __webpack_require__(47) - , $export = __webpack_require__(25) - , toObject = __webpack_require__(29) - , call = __webpack_require__(93) - , isArrayIter = __webpack_require__(94) - , toLength = __webpack_require__(51) - , createProperty = __webpack_require__(95) - , getIterFn = __webpack_require__(55); - -$export($export.S + $export.F * !__webpack_require__(96)(function(iter){ Array.from(iter); }), 'Array', { - // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) - from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){ - var O = toObject(arrayLike) - , C = typeof this == 'function' ? this : Array - , aLen = arguments.length - , mapfn = aLen > 1 ? arguments[1] : undefined - , mapping = mapfn !== undefined - , index = 0 - , iterFn = getIterFn(O) - , length, result, step, iterator; - if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); - // if object isn't iterable or it's array with default iterator - use simple case - if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){ - for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){ - createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); - } - } else { - length = toLength(O.length); - for(result = new C(length); length > index; index++){ - createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + for (var undef in undefs) { + if (undefs.hasOwnProperty(undef)) { + if (undefs[undef] === undefined) { + delete this.current[undef]; + } else { + this.current[undef] = undefs[undef]; + } } } - result.length = index; - return result; + } + /** + * Detect whether `name` has a definition. Equivalent to + * `get(name) != null`. + */ + ; + + _proto.has = function has(name) { + return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name); + } + /** + * Get the current value of a name, or `undefined` if there is no value. + * + * Note: Do not use `if (namespace.get(...))` to detect whether a macro + * is defined, as the definition may be the empty string which evaluates + * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or + * `if (namespace.has(...))`. + */ + ; + + _proto.get = function get(name) { + if (this.current.hasOwnProperty(name)) { + return this.current[name]; + } else { + return this.builtins[name]; + } + } + /** + * Set the current value of a name, and optionally set it globally too. + * Local set() sets the current value and (when appropriate) adds an undo + * operation to the undo stack. Global set() may change the undo + * operation at every level, so takes time linear in their number. + */ + ; + + _proto.set = function set(name, value, global) { + if (global === void 0) { + global = false; + } + + if (global) { + // Global set is equivalent to setting in all groups. Simulate this + // by destroying any undos currently scheduled for this name, + // and adding an undo with the *new* value (in case it later gets + // locally reset within this environment). + for (var i = 0; i < this.undefStack.length; i++) { + delete this.undefStack[i][name]; + } + + if (this.undefStack.length > 0) { + this.undefStack[this.undefStack.length - 1][name] = value; + } + } else { + // Undo this set at end of this group (possibly to `undefined`), + // unless an undo is already in place, in which case that older + // value is the correct one. + var top = this.undefStack[this.undefStack.length - 1]; + + if (top && !top.hasOwnProperty(name)) { + top[name] = this.current[name]; + } + } + + this.current[name] = value; + }; + + return Namespace; +}(); + + +// CONCATENATED MODULE: ./src/macros.js +/** + * Predefined macros for KaTeX. + * This can be used to define some commands in terms of others. + */ + + + + + +var builtinMacros = {}; +/* harmony default export */ var macros = (builtinMacros); // This function might one day accept an additional argument and do more things. + +function defineMacro(name, body) { + builtinMacros[name] = body; +} ////////////////////////////////////////////////////////////////////// +// macro tools +// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 +// TeX source: \long\def\@firstoftwo#1#2{#1} + +defineMacro("\\@firstoftwo", function (context) { + var args = context.consumeArgs(2); + return { + tokens: args[0], + numArgs: 0 + }; +}); // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 +// TeX source: \long\def\@secondoftwo#1#2{#2} + +defineMacro("\\@secondoftwo", function (context) { + var args = context.consumeArgs(2); + return { + tokens: args[1], + numArgs: 0 + }; +}); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) +// symbol. If it matches #1, then the macro expands to #2; otherwise, #3. +// Note, however, that it does not consume the next symbol in either case. + +defineMacro("\\@ifnextchar", function (context) { + var args = context.consumeArgs(3); // symbol, if, else + + var nextToken = context.future(); + + if (args[0].length === 1 && args[0][0].text === nextToken.text) { + return { + tokens: args[1], + numArgs: 0 + }; + } else { + return { + tokens: args[2], + numArgs: 0 + }; + } +}); // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. +// If it is `*`, then it consumes the symbol, and the macro expands to #1; +// otherwise, the macro expands to #2 (without consuming the symbol). +// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} + +defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode + +defineMacro("\\TextOrMath", function (context) { + var args = context.consumeArgs(2); + + if (context.mode === 'text') { + return { + tokens: args[0], + numArgs: 0 + }; + } else { + return { + tokens: args[1], + numArgs: 0 + }; + } +}); // Lookup table for parsing numbers in base 8 through 16 + +var digitToNumber = { + "0": 0, + "1": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "7": 7, + "8": 8, + "9": 9, + "a": 10, + "A": 10, + "b": 11, + "B": 11, + "c": 12, + "C": 12, + "d": 13, + "D": 13, + "e": 14, + "E": 14, + "f": 15, + "F": 15 +}; // TeX \char makes a literal character (catcode 12) using the following forms: +// (see The TeXBook, p. 43) +// \char123 -- decimal +// \char'123 -- octal +// \char"123 -- hex +// \char`x -- character that can be written (i.e. isn't active) +// \char`\x -- character that cannot be written (e.g. %) +// These all refer to characters from the font, so we turn them into special +// calls to a function \@char dealt with in the Parser. + +defineMacro("\\char", function (context) { + var token = context.popToken(); + var base; + var number = ''; + + if (token.text === "'") { + base = 8; + token = context.popToken(); + } else if (token.text === '"') { + base = 16; + token = context.popToken(); + } else if (token.text === "`") { + token = context.popToken(); + + if (token.text[0] === "\\") { + number = token.text.charCodeAt(1); + } else if (token.text === "EOF") { + throw new src_ParseError("\\char` missing argument"); + } else { + number = token.text.charCodeAt(0); + } + } else { + base = 10; + } + + if (base) { + // Parse a number in the given base, starting with first `token`. + number = digitToNumber[token.text]; + + if (number == null || number >= base) { + throw new src_ParseError("Invalid base-" + base + " digit " + token.text); + } + + var digit; + + while ((digit = digitToNumber[context.future().text]) != null && digit < base) { + number *= base; + number += digit; + context.popToken(); + } + } + + return "\\@char{" + number + "}"; +}); // Basic support for macro definitions: +// \def\macro{expansion} +// \def\macro#1{expansion} +// \def\macro#1#2{expansion} +// \def\macro#1#2#3#4#5#6#7#8#9{expansion} +// Also the \gdef and \global\def equivalents + +var macros_def = function def(context, global) { + var arg = context.consumeArgs(1)[0]; + + if (arg.length !== 1) { + throw new src_ParseError("\\gdef's first argument must be a macro name"); + } + + var name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ... + + var numArgs = 0; + arg = context.consumeArgs(1)[0]; + + while (arg.length === 1 && arg[0].text === "#") { + arg = context.consumeArgs(1)[0]; + + if (arg.length !== 1) { + throw new src_ParseError("Invalid argument number length \"" + arg.length + "\""); + } + + if (!/^[1-9]$/.test(arg[0].text)) { + throw new src_ParseError("Invalid argument number \"" + arg[0].text + "\""); + } + + numArgs++; + + if (parseInt(arg[0].text) !== numArgs) { + throw new src_ParseError("Argument number \"" + arg[0].text + "\" out of order"); + } + + arg = context.consumeArgs(1)[0]; + } // Final arg is the expansion of the macro + + + context.macros.set(name, { + tokens: arg, + numArgs: numArgs + }, global); + return ''; +}; + +defineMacro("\\gdef", function (context) { + return macros_def(context, true); +}); +defineMacro("\\def", function (context) { + return macros_def(context, false); +}); +defineMacro("\\global", function (context) { + var next = context.consumeArgs(1)[0]; + + if (next.length !== 1) { + throw new src_ParseError("Invalid command after \\global"); + } + + var command = next[0].text; // TODO: Should expand command + + if (command === "\\def") { + // \global\def is equivalent to \gdef + return macros_def(context, true); + } else { + throw new src_ParseError("Invalid command '" + command + "' after \\global"); + } +}); // \newcommand{\macro}[args]{definition} +// \renewcommand{\macro}[args]{definition} +// TODO: Optional arguments: \newcommand{\macro}[args][default]{definition} + +var macros_newcommand = function newcommand(context, existsOK, nonexistsOK) { + var arg = context.consumeArgs(1)[0]; + + if (arg.length !== 1) { + throw new src_ParseError("\\newcommand's first argument must be a macro name"); + } + + var name = arg[0].text; + var exists = context.isDefined(name); + + if (exists && !existsOK) { + throw new src_ParseError("\\newcommand{" + name + "} attempting to redefine " + (name + "; use \\renewcommand")); + } + + if (!exists && !nonexistsOK) { + throw new src_ParseError("\\renewcommand{" + name + "} when command " + name + " " + "does not yet exist; use \\newcommand"); + } + + var numArgs = 0; + arg = context.consumeArgs(1)[0]; + + if (arg.length === 1 && arg[0].text === "[") { + var argText = ''; + var token = context.expandNextToken(); + + while (token.text !== "]" && token.text !== "EOF") { + // TODO: Should properly expand arg, e.g., ignore {}s + argText += token.text; + token = context.expandNextToken(); + } + + if (!argText.match(/^\s*[0-9]+\s*$/)) { + throw new src_ParseError("Invalid number of arguments: " + argText); + } + + numArgs = parseInt(argText); + arg = context.consumeArgs(1)[0]; + } // Final arg is the expansion of the macro + + + context.macros.set(name, { + tokens: arg, + numArgs: numArgs + }); + return ''; +}; + +defineMacro("\\newcommand", function (context) { + return macros_newcommand(context, false, true); +}); +defineMacro("\\renewcommand", function (context) { + return macros_newcommand(context, true, false); +}); +defineMacro("\\providecommand", function (context) { + return macros_newcommand(context, true, true); +}); ////////////////////////////////////////////////////////////////////// +// Grouping +// \let\bgroup={ \let\egroup=} + +defineMacro("\\bgroup", "{"); +defineMacro("\\egroup", "}"); // Symbols from latex.ltx: +// \def\lq{`} +// \def\rq{'} +// \def \aa {\r a} +// \def \AA {\r A} + +defineMacro("\\lq", "`"); +defineMacro("\\rq", "'"); +defineMacro("\\aa", "\\r a"); +defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML. +// \DeclareTextCommandDefault{\textcopyright}{\textcircled{c}} +// \DeclareTextCommandDefault{\textregistered}{\textcircled{% +// \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}} +// \DeclareRobustCommand{\copyright}{% +// \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi} + +defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}"); +defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"); +defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF + +defineMacro("\u212C", "\\mathscr{B}"); // script + +defineMacro("\u2130", "\\mathscr{E}"); +defineMacro("\u2131", "\\mathscr{F}"); +defineMacro("\u210B", "\\mathscr{H}"); +defineMacro("\u2110", "\\mathscr{I}"); +defineMacro("\u2112", "\\mathscr{L}"); +defineMacro("\u2133", "\\mathscr{M}"); +defineMacro("\u211B", "\\mathscr{R}"); +defineMacro("\u212D", "\\mathfrak{C}"); // Fraktur + +defineMacro("\u210C", "\\mathfrak{H}"); +defineMacro("\u2128", "\\mathfrak{Z}"); // Define \Bbbk with a macro that works in both HTML and MathML. + +defineMacro("\\Bbbk", "\\Bbb{k}"); // Unicode middle dot +// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays +// the dot at U+22C5 and gives it punct spacing. + +defineMacro("\xB7", "\\cdotp"); // \llap and \rlap render their contents in text mode + +defineMacro("\\llap", "\\mathllap{\\textrm{#1}}"); +defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}"); +defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); // \not is defined by base/fontmath.ltx via +// \DeclareMathSymbol{\not}{\mathrel}{symbols}{"36} +// It's thus treated like a \mathrel, but defined by a symbol that has zero +// width but extends to the right. We use \rlap to get that spacing. +// For MathML we write U+0338 here. buildMathML.js will then do the overlay. + +defineMacro("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'); // Negated symbols from base/fontmath.ltx: +// \def\neq{\not=} \let\ne=\neq +// \DeclareRobustCommand +// \notin{\mathrel{\m@th\mathpalette\c@ncel\in}} +// \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} + +defineMacro("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"); +defineMacro("\\ne", "\\neq"); +defineMacro("\u2260", "\\neq"); +defineMacro("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}" + "{\\mathrel{\\char`∉}}"); +defineMacro("\u2209", "\\notin"); // Unicode stacked relations + +defineMacro("\u2258", "\\html@mathml{" + "\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}" + "}{\\mathrel{\\char`\u2258}}"); +defineMacro("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"); +defineMacro("\u225A", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}"); +defineMacro("\u225B", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}" + "{\\mathrel{\\char`\u225B}}"); +defineMacro("\u225D", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}" + "{\\mathrel{\\char`\u225D}}"); +defineMacro("\u225E", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}" + "{\\mathrel{\\char`\u225E}}"); +defineMacro("\u225F", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}"); // Misc Unicode + +defineMacro("\u27C2", "\\perp"); +defineMacro("\u203C", "\\mathclose{!\\mkern-0.8mu!}"); +defineMacro("\u220C", "\\notni"); +defineMacro("\u231C", "\\ulcorner"); +defineMacro("\u231D", "\\urcorner"); +defineMacro("\u231E", "\\llcorner"); +defineMacro("\u231F", "\\lrcorner"); +defineMacro("\xA9", "\\copyright"); +defineMacro("\xAE", "\\textregistered"); +defineMacro("\uFE0F", "\\textregistered"); ////////////////////////////////////////////////////////////////////// +// LaTeX_2ε +// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ +// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} +// We'll call \varvdots, which gets a glyph from symbols.js. +// The zero-width rule gets us an equivalent to the vertical 6pt kern. + +defineMacro("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}"); +defineMacro("\u22EE", "\\vdots"); ////////////////////////////////////////////////////////////////////// +// amsmath.sty +// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf +// Italic Greek capital letters. AMS defines these with \DeclareMathSymbol, +// but they are equivalent to \mathit{\Letter}. + +defineMacro("\\varGamma", "\\mathit{\\Gamma}"); +defineMacro("\\varDelta", "\\mathit{\\Delta}"); +defineMacro("\\varTheta", "\\mathit{\\Theta}"); +defineMacro("\\varLambda", "\\mathit{\\Lambda}"); +defineMacro("\\varXi", "\\mathit{\\Xi}"); +defineMacro("\\varPi", "\\mathit{\\Pi}"); +defineMacro("\\varSigma", "\\mathit{\\Sigma}"); +defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}"); +defineMacro("\\varPhi", "\\mathit{\\Phi}"); +defineMacro("\\varPsi", "\\mathit{\\Psi}"); +defineMacro("\\varOmega", "\\mathit{\\Omega}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript +// \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} + +defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} + +defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}"); // \def\iff{\DOTSB\;\Longleftrightarrow\;} +// \def\implies{\DOTSB\;\Longrightarrow\;} +// \def\impliedby{\DOTSB\;\Longleftarrow\;} + +defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); +defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); +defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); // AMSMath's automatic \dots, based on \mdots@@ macro. + +var dotsByToken = { + ',': '\\dotsc', + '\\not': '\\dotsb', + // \keybin@ checks for the following: + '+': '\\dotsb', + '=': '\\dotsb', + '<': '\\dotsb', + '>': '\\dotsb', + '-': '\\dotsb', + '*': '\\dotsb', + ':': '\\dotsb', + // Symbols whose definition starts with \DOTSB: + '\\DOTSB': '\\dotsb', + '\\coprod': '\\dotsb', + '\\bigvee': '\\dotsb', + '\\bigwedge': '\\dotsb', + '\\biguplus': '\\dotsb', + '\\bigcap': '\\dotsb', + '\\bigcup': '\\dotsb', + '\\prod': '\\dotsb', + '\\sum': '\\dotsb', + '\\bigotimes': '\\dotsb', + '\\bigoplus': '\\dotsb', + '\\bigodot': '\\dotsb', + '\\bigsqcup': '\\dotsb', + '\\And': '\\dotsb', + '\\longrightarrow': '\\dotsb', + '\\Longrightarrow': '\\dotsb', + '\\longleftarrow': '\\dotsb', + '\\Longleftarrow': '\\dotsb', + '\\longleftrightarrow': '\\dotsb', + '\\Longleftrightarrow': '\\dotsb', + '\\mapsto': '\\dotsb', + '\\longmapsto': '\\dotsb', + '\\hookrightarrow': '\\dotsb', + '\\doteq': '\\dotsb', + // Symbols whose definition starts with \mathbin: + '\\mathbin': '\\dotsb', + // Symbols whose definition starts with \mathrel: + '\\mathrel': '\\dotsb', + '\\relbar': '\\dotsb', + '\\Relbar': '\\dotsb', + '\\xrightarrow': '\\dotsb', + '\\xleftarrow': '\\dotsb', + // Symbols whose definition starts with \DOTSI: + '\\DOTSI': '\\dotsi', + '\\int': '\\dotsi', + '\\oint': '\\dotsi', + '\\iint': '\\dotsi', + '\\iiint': '\\dotsi', + '\\iiiint': '\\dotsi', + '\\idotsint': '\\dotsi', + // Symbols whose definition starts with \DOTSX: + '\\DOTSX': '\\dotsx' +}; +defineMacro("\\dots", function (context) { + // TODO: If used in text mode, should expand to \textellipsis. + // However, in KaTeX, \textellipsis and \ldots behave the same + // (in text mode), and it's unlikely we'd see any of the math commands + // that affect the behavior of \dots when in text mode. So fine for now + // (until we support \ifmmode ... \else ... \fi). + var thedots = '\\dotso'; + var next = context.expandAfterFuture().text; + + if (next in dotsByToken) { + thedots = dotsByToken[next]; + } else if (next.substr(0, 4) === '\\not') { + thedots = '\\dotsb'; + } else if (next in src_symbols.math) { + if (utils.contains(['bin', 'rel'], src_symbols.math[next].group)) { + thedots = '\\dotsb'; + } + } + + return thedots; +}); +var spaceAfterDots = { + // \rightdelim@ checks for the following: + ')': true, + ']': true, + '\\rbrack': true, + '\\}': true, + '\\rbrace': true, + '\\rangle': true, + '\\rceil': true, + '\\rfloor': true, + '\\rgroup': true, + '\\rmoustache': true, + '\\right': true, + '\\bigr': true, + '\\biggr': true, + '\\Bigr': true, + '\\Biggr': true, + // \extra@ also tests for the following: + '$': true, + // \extrap@ checks for the following: + ';': true, + '.': true, + ',': true +}; +defineMacro("\\dotso", function (context) { + var next = context.future().text; + + if (next in spaceAfterDots) { + return "\\ldots\\,"; + } else { + return "\\ldots"; } }); +defineMacro("\\dotsc", function (context) { + var next = context.future().text; // \dotsc uses \extra@ but not \extrap@, instead specially checking for + // ';' and '.', but doesn't check for ','. - -/***/ }), -/* 93 */ -/***/ (function(module, exports, __webpack_require__) { - -// call something on iterator step with safe closing on error -var anObject = __webpack_require__(22); -module.exports = function(iterator, fn, value, entries){ - try { - return entries ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch(e){ - var ret = iterator['return']; - if(ret !== undefined)anObject(ret.call(iterator)); - throw e; + if (next in spaceAfterDots && next !== ',') { + return "\\ldots\\,"; + } else { + return "\\ldots"; } -}; +}); +defineMacro("\\cdots", function (context) { + var next = context.future().text; -/***/ }), -/* 94 */ -/***/ (function(module, exports, __webpack_require__) { - -// check on default Array iterator -var Iterators = __webpack_require__(17) - , ITERATOR = __webpack_require__(11)('iterator') - , ArrayProto = Array.prototype; - -module.exports = function(it){ - return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); -}; - -/***/ }), -/* 95 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $defineProperty = __webpack_require__(15) - , createDesc = __webpack_require__(33); - -module.exports = function(object, index, value){ - if(index in object)$defineProperty.f(object, index, createDesc(0, value)); - else object[index] = value; -}; - -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { - -var ITERATOR = __webpack_require__(11)('iterator') - , SAFE_CLOSING = false; - -try { - var riter = [7][ITERATOR](); - riter['return'] = function(){ SAFE_CLOSING = true; }; - Array.from(riter, function(){ throw 2; }); -} catch(e){ /* empty */ } - -module.exports = function(exec, skipClosing){ - if(!skipClosing && !SAFE_CLOSING)return false; - var safe = false; - try { - var arr = [7] - , iter = arr[ITERATOR](); - iter.next = function(){ return {done: safe = true}; }; - arr[ITERATOR] = function(){ return iter; }; - exec(arr); - } catch(e){ /* empty */ } - return safe; -}; - -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(98), __esModule: true }; - -/***/ }), -/* 98 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(58); -__webpack_require__(36); -module.exports = __webpack_require__(102); - -/***/ }), -/* 99 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var addToUnscopables = __webpack_require__(100) - , step = __webpack_require__(101) - , Iterators = __webpack_require__(17) - , toIObject = __webpack_require__(40); - -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -module.exports = __webpack_require__(48)(Array, 'Array', function(iterated, kind){ - this._t = toIObject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function(){ - var O = this._t - , kind = this._k - , index = this._i++; - if(!O || index >= O.length){ - this._t = undefined; - return step(1); + if (next in spaceAfterDots) { + return "\\@cdots\\,"; + } else { + return "\\@cdots"; } - if(kind == 'keys' )return step(0, index); - if(kind == 'values')return step(0, O[index]); - return step(0, [index, O[index]]); -}, 'values'); +}); +defineMacro("\\dotsb", "\\cdots"); +defineMacro("\\dotsm", "\\cdots"); +defineMacro("\\dotsi", "\\!\\cdots"); // amsmath doesn't actually define \dotsx, but \dots followed by a macro +// starting with \DOTSX implies \dotso, and then \extra@ detects this case +// and forces the added `\,`. -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -Iterators.Arguments = Iterators.Array; +defineMacro("\\dotsx", "\\ldots\\,"); // \let\DOTSI\relax +// \let\DOTSB\relax +// \let\DOTSX\relax -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); +defineMacro("\\DOTSI", "\\relax"); +defineMacro("\\DOTSB", "\\relax"); +defineMacro("\\DOTSX", "\\relax"); // Spacing, based on amsmath.sty's override of LaTeX defaults +// \DeclareRobustCommand{\tmspace}[3]{% +// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} -/***/ }), -/* 100 */ -/***/ (function(module, exports) { +defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} +// TODO: math mode should use \thinmuskip -module.exports = function(){ /* empty */ }; +defineMacro("\\,", "\\tmspace+{3mu}{.1667em}"); // \let\thinspace\, -/***/ }), -/* 101 */ -/***/ (function(module, exports) { +defineMacro("\\thinspace", "\\,"); // \def\>{\mskip\medmuskip} +// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} +// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu -module.exports = function(done, value){ - return {value: value, done: !!done}; -}; +defineMacro("\\>", "\\mskip{4mu}"); +defineMacro("\\:", "\\tmspace+{4mu}{.2222em}"); // \let\medspace\: -/***/ }), -/* 102 */ -/***/ (function(module, exports, __webpack_require__) { +defineMacro("\\medspace", "\\:"); // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} +// TODO: math mode should use \thickmuskip = 5mu plus 5mu -var classof = __webpack_require__(56) - , ITERATOR = __webpack_require__(11)('iterator') - , Iterators = __webpack_require__(17); -module.exports = __webpack_require__(8).isIterable = function(it){ - var O = Object(it); - return O[ITERATOR] !== undefined - || '@@iterator' in O - || Iterators.hasOwnProperty(classof(O)); -}; +defineMacro("\\;", "\\tmspace+{5mu}{.2777em}"); // \let\thickspace\; -/***/ }), -/* 103 */ -/***/ (function(module, exports, __webpack_require__) { +defineMacro("\\thickspace", "\\;"); // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} +// TODO: math mode should use \thinmuskip -__webpack_require__(58); -__webpack_require__(36); -module.exports = __webpack_require__(104); +defineMacro("\\!", "\\tmspace-{3mu}{.1667em}"); // \let\negthinspace\! -/***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { +defineMacro("\\negthinspace", "\\!"); // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} +// TODO: math mode should use \medmuskip -var anObject = __webpack_require__(22) - , get = __webpack_require__(55); -module.exports = __webpack_require__(8).getIterator = function(it){ - var iterFn = get(it); - if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!'); - return anObject(iterFn.call(it)); -}; +defineMacro("\\negmedspace", "\\tmspace-{4mu}{.2222em}"); // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} +// TODO: math mode should use \thickmuskip -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { +defineMacro("\\negthickspace", "\\tmspace-{5mu}{.277em}"); // \def\enspace{\kern.5em } -module.exports = { "default": __webpack_require__(106), __esModule: true }; +defineMacro("\\enspace", "\\kern.5em "); // \def\enskip{\hskip.5em\relax} -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { +defineMacro("\\enskip", "\\hskip.5em\\relax"); // \def\quad{\hskip1em\relax} -__webpack_require__(107); -module.exports = __webpack_require__(8).Object.assign; +defineMacro("\\quad", "\\hskip1em\\relax"); // \def\qquad{\hskip2em\relax} -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { +defineMacro("\\qquad", "\\hskip2em\\relax"); // \tag@in@display form of \tag -// 19.1.3.1 Object.assign(target, source) -var $export = __webpack_require__(25); +defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); +defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); +defineMacro("\\tag@literal", function (context) { + if (context.macros.get("\\df@tag")) { + throw new src_ParseError("Multiple \\tag"); + } -$export($export.S + $export.F, 'Object', {assign: __webpack_require__(108)}); + return "\\gdef\\df@tag{\\text{#1}}"; +}); // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin +// {\operator@font mod}\penalty900 +// \mkern5mu\nonscript\mskip-\medmuskip} +// \newcommand{\pod}[1]{\allowbreak +// \if@display\mkern18mu\else\mkern8mu\fi(#1)} +// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} +// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu +// \else\mkern12mu\fi{\operator@font mod}\,\,#1} +// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu -/***/ }), -/* 108 */ -/***/ (function(module, exports, __webpack_require__) { +defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}" + "\\mathbin{\\rm mod}" + "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"); +defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"); +defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); +defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb -- A simulation of bold. +// It works by typesetting three copies of the argument with small offsets. +// Ref: a rather lengthy macro in ambsy.sty -"use strict"; +defineMacro("\\pmb", "\\html@mathml{\\@binrel{#1}{" + "\\mathrlap{#1}" + "\\mathrlap{\\mkern0.4mu\\raisebox{0.4mu}{$#1$}}" + "{\\mkern0.8mu#1}" + "}}{\\mathbf{#1}}"); ////////////////////////////////////////////////////////////////////// +// LaTeX source2e +// \\ defaults to \newline, but changes to \cr within array environment -// 19.1.2.1 Object.assign(target, source, ...) -var getKeys = __webpack_require__(39) - , gOPS = __webpack_require__(109) - , pIE = __webpack_require__(110) - , toObject = __webpack_require__(29) - , IObject = __webpack_require__(49) - , $assign = Object.assign; +defineMacro("\\\\", "\\newline"); // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} +// TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't +// support \@ yet, so that's omitted, and we add \text so that the result +// doesn't look funny in math mode. -// should work with symbols and should have deterministic property order (V8 bug) -module.exports = !$assign || __webpack_require__(24)(function(){ - var A = {} - , B = {} - , S = Symbol() - , K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function(k){ B[k] = k; }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; -}) ? function assign(target, source){ // eslint-disable-line no-unused-vars - var T = toObject(target) - , aLen = arguments.length - , index = 1 - , getSymbols = gOPS.f - , isEnum = pIE.f; - while(aLen > index){ - var S = IObject(arguments[index++]) - , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S) - , length = keys.length - , j = 0 - , key; - while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key]; - } return T; -} : $assign; +defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX" + "}{TeX}}"); // \DeclareRobustCommand{\LaTeX}{L\kern-.36em% +// {\sbox\z@ T% +// \vbox to\ht\z@{\hbox{\check@mathfonts +// \fontsize\sf@size\z@ +// \math@fontsfalse\selectfont +// A}% +// \vss}% +// }% +// \kern-.15em% +// \TeX} +// This code aligns the top of the A with the T (from the perspective of TeX's +// boxes, though visually the A appears to extend above slightly). +// We compute the corresponding \raisebox when A is rendered at \scriptsize, +// which is size3, which has a scale factor of 0.7 (see Options.js). -/***/ }), -/* 109 */ -/***/ (function(module, exports) { +var latexRaiseA = fontMetricsData['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular']["A".charCodeAt(0)][1] + "em"; +defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo -exports.f = Object.getOwnPropertySymbols; +defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} +// \def\@hspace#1{\hskip #1\relax} +// \def\@hspacer#1{\vrule \@width\z@\nobreak +// \hskip #1\hskip \z@skip} -/***/ }), -/* 110 */ -/***/ (function(module, exports) { +defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); +defineMacro("\\@hspace", "\\hskip #1\\relax"); +defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); ////////////////////////////////////////////////////////////////////// +// mathtools.sty +//\providecommand\ordinarycolon{:} -exports.f = {}.propertyIsEnumerable; +defineMacro("\\ordinarycolon", ":"); //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} +//TODO(edemaine): Not yet centered. Fix via \raisebox or #726 -/***/ }), -/* 111 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); // \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon} -"use strict"; +defineMacro("\\dblcolon", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}" + "{\\mathop{\\char\"2237}}"); // \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=} +defineMacro("\\coloneqq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2254}}"); // ≔ +// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=} + +defineMacro("\\Coloneqq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2237\\char\"3d}}"); // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} + +defineMacro("\\coloneq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"3a\\char\"2212}}"); // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} + +defineMacro("\\Coloneq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"2237\\char\"2212}}"); // \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon} + +defineMacro("\\eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2255}}"); // ≕ +// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} + +defineMacro("\\Eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"3d\\char\"2237}}"); // \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon} + +defineMacro("\\eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2239}}"); // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} + +defineMacro("\\Eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"2212\\char\"2237}}"); // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} + +defineMacro("\\colonapprox", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"3a\\char\"2248}}"); // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} + +defineMacro("\\Colonapprox", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"2237\\char\"2248}}"); // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} + +defineMacro("\\colonsim", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"3a\\char\"223c}}"); // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} + +defineMacro("\\Colonsim", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"2237\\char\"223c}}"); // Some Unicode characters are implemented with macros to mathtools functions. + +defineMacro("\u2237", "\\dblcolon"); // :: + +defineMacro("\u2239", "\\eqcolon"); // -: + +defineMacro("\u2254", "\\coloneqq"); // := + +defineMacro("\u2255", "\\eqqcolon"); // =: + +defineMacro("\u2A74", "\\Coloneqq"); // ::= +////////////////////////////////////////////////////////////////////// +// colonequals.sty +// Alternate names for mathtools's macros: + +defineMacro("\\ratio", "\\vcentcolon"); +defineMacro("\\coloncolon", "\\dblcolon"); +defineMacro("\\colonequals", "\\coloneqq"); +defineMacro("\\coloncolonequals", "\\Coloneqq"); +defineMacro("\\equalscolon", "\\eqqcolon"); +defineMacro("\\equalscoloncolon", "\\Eqqcolon"); +defineMacro("\\colonminus", "\\coloneq"); +defineMacro("\\coloncolonminus", "\\Coloneq"); +defineMacro("\\minuscolon", "\\eqcolon"); +defineMacro("\\minuscoloncolon", "\\Eqcolon"); // \colonapprox name is same in mathtools and colonequals. + +defineMacro("\\coloncolonapprox", "\\Colonapprox"); // \colonsim name is same in mathtools and colonequals. + +defineMacro("\\coloncolonsim", "\\Colonsim"); // Additional macros, implemented by analogy with mathtools definitions: + +defineMacro("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); +defineMacro("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"); +defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); +defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts + +defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}"); +defineMacro("\\limsup", "\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"); +defineMacro("\\liminf", "\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"); ////////////////////////////////////////////////////////////////////// +// MathML alternates for KaTeX glyphs in the Unicode private area + +defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}"); +defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}"); +defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}"); +defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}"); +defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}"); +defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}"); +defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}"); +defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}"); +defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}"); +defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}"); +defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}"); +defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}"); +defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}"); +defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); ////////////////////////////////////////////////////////////////////// +// stmaryrd and semantic +// The stmaryrd and semantic packages render the next four items by calling a +// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros. + +defineMacro("\\llbracket", "\\html@mathml{" + "\\mathopen{[\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u27E6}}"); +defineMacro("\\rrbracket", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu]}}" + "{\\mathclose{\\char`\u27E7}}"); +defineMacro("\u27E6", "\\llbracket"); // blackboard bold [ + +defineMacro("\u27E7", "\\rrbracket"); // blackboard bold ] + +defineMacro("\\lBrace", "\\html@mathml{" + "\\mathopen{\\{\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u2983}}"); +defineMacro("\\rBrace", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu\\}}}" + "{\\mathclose{\\char`\u2984}}"); +defineMacro("\u2983", "\\lBrace"); // blackboard bold { + +defineMacro("\u2984", "\\rBrace"); // blackboard bold } +// TODO: Create variable sized versions of the last two items. I believe that +// will require new font glyphs. +////////////////////////////////////////////////////////////////////// +// texvc.sty +// The texvc package contains macros available in mediawiki pages. +// We omit the functions deprecated at +// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax +// We also omit texvc's \O, which conflicts with \text{\O} + +defineMacro("\\darr", "\\downarrow"); +defineMacro("\\dArr", "\\Downarrow"); +defineMacro("\\Darr", "\\Downarrow"); +defineMacro("\\lang", "\\langle"); +defineMacro("\\rang", "\\rangle"); +defineMacro("\\uarr", "\\uparrow"); +defineMacro("\\uArr", "\\Uparrow"); +defineMacro("\\Uarr", "\\Uparrow"); +defineMacro("\\N", "\\mathbb{N}"); +defineMacro("\\R", "\\mathbb{R}"); +defineMacro("\\Z", "\\mathbb{Z}"); +defineMacro("\\alef", "\\aleph"); +defineMacro("\\alefsym", "\\aleph"); +defineMacro("\\Alpha", "\\mathrm{A}"); +defineMacro("\\Beta", "\\mathrm{B}"); +defineMacro("\\bull", "\\bullet"); +defineMacro("\\Chi", "\\mathrm{X}"); +defineMacro("\\clubs", "\\clubsuit"); +defineMacro("\\cnums", "\\mathbb{C}"); +defineMacro("\\Complex", "\\mathbb{C}"); +defineMacro("\\Dagger", "\\ddagger"); +defineMacro("\\diamonds", "\\diamondsuit"); +defineMacro("\\empty", "\\emptyset"); +defineMacro("\\Epsilon", "\\mathrm{E}"); +defineMacro("\\Eta", "\\mathrm{H}"); +defineMacro("\\exist", "\\exists"); +defineMacro("\\harr", "\\leftrightarrow"); +defineMacro("\\hArr", "\\Leftrightarrow"); +defineMacro("\\Harr", "\\Leftrightarrow"); +defineMacro("\\hearts", "\\heartsuit"); +defineMacro("\\image", "\\Im"); +defineMacro("\\infin", "\\infty"); +defineMacro("\\Iota", "\\mathrm{I}"); +defineMacro("\\isin", "\\in"); +defineMacro("\\Kappa", "\\mathrm{K}"); +defineMacro("\\larr", "\\leftarrow"); +defineMacro("\\lArr", "\\Leftarrow"); +defineMacro("\\Larr", "\\Leftarrow"); +defineMacro("\\lrarr", "\\leftrightarrow"); +defineMacro("\\lrArr", "\\Leftrightarrow"); +defineMacro("\\Lrarr", "\\Leftrightarrow"); +defineMacro("\\Mu", "\\mathrm{M}"); +defineMacro("\\natnums", "\\mathbb{N}"); +defineMacro("\\Nu", "\\mathrm{N}"); +defineMacro("\\Omicron", "\\mathrm{O}"); +defineMacro("\\plusmn", "\\pm"); +defineMacro("\\rarr", "\\rightarrow"); +defineMacro("\\rArr", "\\Rightarrow"); +defineMacro("\\Rarr", "\\Rightarrow"); +defineMacro("\\real", "\\Re"); +defineMacro("\\reals", "\\mathbb{R}"); +defineMacro("\\Reals", "\\mathbb{R}"); +defineMacro("\\Rho", "\\mathrm{P}"); +defineMacro("\\sdot", "\\cdot"); +defineMacro("\\sect", "\\S"); +defineMacro("\\spades", "\\spadesuit"); +defineMacro("\\sub", "\\subset"); +defineMacro("\\sube", "\\subseteq"); +defineMacro("\\supe", "\\supseteq"); +defineMacro("\\Tau", "\\mathrm{T}"); +defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}"); + +defineMacro("\\weierp", "\\wp"); +defineMacro("\\Zeta", "\\mathrm{Z}"); ////////////////////////////////////////////////////////////////////// +// statmath.sty +// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf + +defineMacro("\\argmin", "\\DOTSB\\mathop{\\operatorname{arg\\,min}}\\limits"); +defineMacro("\\argmax", "\\DOTSB\\mathop{\\operatorname{arg\\,max}}\\limits"); // Custom Khan Academy colors, should be moved to an optional package + +defineMacro("\\blue", "\\textcolor{##6495ed}{#1}"); +defineMacro("\\orange", "\\textcolor{##ffa500}{#1}"); +defineMacro("\\pink", "\\textcolor{##ff00af}{#1}"); +defineMacro("\\red", "\\textcolor{##df0030}{#1}"); +defineMacro("\\green", "\\textcolor{##28ae7b}{#1}"); +defineMacro("\\gray", "\\textcolor{gray}{##1}"); +defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}"); +defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}"); +defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}"); +defineMacro("\\blueC", "\\textcolor{##63d9ea}{#1}"); +defineMacro("\\blueD", "\\textcolor{##11accd}{#1}"); +defineMacro("\\blueE", "\\textcolor{##0c7f99}{#1}"); +defineMacro("\\tealA", "\\textcolor{##94fff5}{#1}"); +defineMacro("\\tealB", "\\textcolor{##26edd5}{#1}"); +defineMacro("\\tealC", "\\textcolor{##01d1c1}{#1}"); +defineMacro("\\tealD", "\\textcolor{##01a995}{#1}"); +defineMacro("\\tealE", "\\textcolor{##208170}{#1}"); +defineMacro("\\greenA", "\\textcolor{##b6ffb0}{#1}"); +defineMacro("\\greenB", "\\textcolor{##8af281}{#1}"); +defineMacro("\\greenC", "\\textcolor{##74cf70}{#1}"); +defineMacro("\\greenD", "\\textcolor{##1fab54}{#1}"); +defineMacro("\\greenE", "\\textcolor{##0d923f}{#1}"); +defineMacro("\\goldA", "\\textcolor{##ffd0a9}{#1}"); +defineMacro("\\goldB", "\\textcolor{##ffbb71}{#1}"); +defineMacro("\\goldC", "\\textcolor{##ff9c39}{#1}"); +defineMacro("\\goldD", "\\textcolor{##e07d10}{#1}"); +defineMacro("\\goldE", "\\textcolor{##a75a05}{#1}"); +defineMacro("\\redA", "\\textcolor{##fca9a9}{#1}"); +defineMacro("\\redB", "\\textcolor{##ff8482}{#1}"); +defineMacro("\\redC", "\\textcolor{##f9685d}{#1}"); +defineMacro("\\redD", "\\textcolor{##e84d39}{#1}"); +defineMacro("\\redE", "\\textcolor{##bc2612}{#1}"); +defineMacro("\\maroonA", "\\textcolor{##ffbde0}{#1}"); +defineMacro("\\maroonB", "\\textcolor{##ff92c6}{#1}"); +defineMacro("\\maroonC", "\\textcolor{##ed5fa6}{#1}"); +defineMacro("\\maroonD", "\\textcolor{##ca337c}{#1}"); +defineMacro("\\maroonE", "\\textcolor{##9e034e}{#1}"); +defineMacro("\\purpleA", "\\textcolor{##ddd7ff}{#1}"); +defineMacro("\\purpleB", "\\textcolor{##c6b9fc}{#1}"); +defineMacro("\\purpleC", "\\textcolor{##aa87ff}{#1}"); +defineMacro("\\purpleD", "\\textcolor{##7854ab}{#1}"); +defineMacro("\\purpleE", "\\textcolor{##543b78}{#1}"); +defineMacro("\\mintA", "\\textcolor{##f5f9e8}{#1}"); +defineMacro("\\mintB", "\\textcolor{##edf2df}{#1}"); +defineMacro("\\mintC", "\\textcolor{##e0e5cc}{#1}"); +defineMacro("\\grayA", "\\textcolor{##f6f7f7}{#1}"); +defineMacro("\\grayB", "\\textcolor{##f0f1f2}{#1}"); +defineMacro("\\grayC", "\\textcolor{##e3e5e6}{#1}"); +defineMacro("\\grayD", "\\textcolor{##d6d8da}{#1}"); +defineMacro("\\grayE", "\\textcolor{##babec2}{#1}"); +defineMacro("\\grayF", "\\textcolor{##888d93}{#1}"); +defineMacro("\\grayG", "\\textcolor{##626569}{#1}"); +defineMacro("\\grayH", "\\textcolor{##3b3e40}{#1}"); +defineMacro("\\grayI", "\\textcolor{##21242c}{#1}"); +defineMacro("\\kaBlue", "\\textcolor{##314453}{#1}"); +defineMacro("\\kaGreen", "\\textcolor{##71B307}{#1}"); +// CONCATENATED MODULE: ./src/MacroExpander.js /** - * This file provides support to domTree.js - * It's a storehouse of path geometry for SVG images. + * This file contains the “gullet” where macros are expanded + * until only non-macro tokens remain. */ -// We do frac-lines, underlines, and overlines with an SVG path and we put that -// path is into a viewBox that is 5 times as thick as the line. That way, -// any browser rounding error on the size of the surrounding span will -// not pinch the ink of the line. Think of it as padding for the line. -// As usual, the viewBox-to-em scale is 1000. -var hLinePad = 80; // padding above and below a std 0.04em horiz rule. -var vLinePad = 100; // padding on either side of a std vert 0.05em rule. -var path = { - // stdHorizRule is used for frac-lines, underlines, and overlines. - // It is 0.04em thick if the line comes from normalsize/textstyle. - stdHorizRule: "M0 " + hLinePad + "H400000 v40H0z M0 " + hLinePad + "H400000 v40H0z", - // vertSeparator is used in arrays. It is 0.05em wide in a 0.25em viewBox. - vertSeparator: "M" + vLinePad + " 0h50V400000h-50zM" + vLinePad + " 0h50V400000h-50z", - // sqrtMain path geometry is from glyph U221A in the font KaTeX Main - // All surds have 80 units padding above the viniculumn. - sqrtMain: "M95," + (622 + hLinePad) + "c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\ns-65,47,-65,47z M834 " + hLinePad + "H400000v40H845z", - // size1 is from glyph U221A in the font KaTeX_Size1-Regular - sqrtSize1: "M263," + (601 + hLinePad) + "c0.7,0,18,39.7,52,119c34,79.3,68.167,\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\ns76,-59,76,-59s76,-60,76,-60z M1001 " + hLinePad + "H40000v40H1012z", - // size2 is from glyph U221A in the font KaTeX_Size2-Regular - // The 80 units padding is most obvious here. Note start node at M1001 80. - sqrtSize2: "M1001," + hLinePad + "H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\nM1001 " + hLinePad + "H400000v40H1013z", +// List of commands that act like macros but aren't defined as a macro, +// function, or symbol. Used in `isDefined`. +var implicitCommands = { + "\\relax": true, + // MacroExpander.js + "^": true, + // Parser.js + "_": true, + // Parser.js + "\\limits": true, + // Parser.js + "\\nolimits": true // Parser.js - // size3 is from glyph U221A in the font KaTeX_Size3-Regular - sqrtSize3: "M424," + (2398 + hLinePad) + "c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M1001 " + hLinePad + "H400000v40H1014z", - - // size4 is from glyph U221A in the font KaTeX_Size4-Regular - sqrtSize4: "M473," + (2713 + hLinePad) + "c339.3,-1799.3,509.3,-2700,510,-2702\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\nM1001 " + hLinePad + "H400000v40H1017z", - - // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main - doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", - - // doublerightarrow is from glyph U+21D2 in font KaTeX Main - doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z", - - // leftarrow is from glyph U+2190 in font KaTeX Main - leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z", - - // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular - leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z", - - leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z", - - // overgroup is from the MnSymbol package (public domain) - leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z", - - leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z", - - // Harpoons are from glyph U+21BD in font KaTeX Main - leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z", - - leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z", - - leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z", - - leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z", - - // hook is from glyph U+21A9 in font KaTeX Main - lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z", - - leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z", - - leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z", - - // tofrom is from glyph U+21C4 in font KaTeX AMS Regular - leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z", - - longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z", - - midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z", - - midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z", - - rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z", - - rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z", - - rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z", - - rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z", - - rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z", - - rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z", - - rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z", - - rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z", - - rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z", - - righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z", - - rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z", - - rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z", - - // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular - twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z", - - twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z", - - // tilde1 is a modified version of a glyph from the MnSymbol package - tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z", - - // ditto tilde2, tilde3, & tilde4 - tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z", - - tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z", - - tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z", - - // vec is from glyph U+20D7 in font KaTeX Main - vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z", - - // widehat1 is a modified version of a glyph from the MnSymbol package - widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z", - - // ditto widehat2, widehat3, & widehat4 - widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - - widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - - widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - - // baraboveleftarrow is from glyph U+21C4 in font KaTeX AMS Regular - baraboveleftarrow: "M1 500c30.67-18 59-41.833 85-71.5s45-61.17 57-94.5h23\nc15.33 0 23 .33 23 1 0 .67-5.33 12.67-16 36-16.67 34.67-39 67.33-67 98l-10 11\nh39904v40H96l9 10c27.33 30.67 50.67 65 70 103l14 33c0 .67-7.67 1-23 1h-22\nC116.67 596.33 69 540.67 1 500z M96 480 H400000 v40 H96z\nM1 147 H399905 v40 H1z M0 147 H399905 v40 H0z", - - // ditto rightarrowabovebar - rightarrowabovebar: "M400000 167c-70.67 42-118 97.67-142 167h-23c-15.33 0\n-23-.33-23-1 0-1.33 5.33-13.67 16-37 18-35.33 41.33-69 70-101l7-8h-39905\nv-40h39905c-389 0 0 0 0 0l-7-8c-28.67-32-52-65.67-70-101-10.67-23.33-16-35.67\n-16-37 0-.67 7.67-1 23-1h23c11.33 33.33 30 64.833 56 94.5s54.67 53.83 86 72.5z\nM0 147 H399905 v40 H0z M96 480 H400000 v40 H0z M96 480 H400000 v40 H0z", - - // The next eight paths support reaction arrows from the mhchem package. - - // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end. - // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em - baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z", - - rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z", - - shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", - - shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" }; -/* harmony default export */ __webpack_exports__["a"] = ({ path: path }); +var MacroExpander_MacroExpander = +/*#__PURE__*/ +function () { + function MacroExpander(input, settings, mode) { + this.settings = void 0; + this.expansionCount = void 0; + this.lexer = void 0; + this.macros = void 0; + this.stack = void 0; + this.mode = void 0; + this.settings = settings; + this.expansionCount = 0; + this.feed(input); // Make new global namespace -/***/ }), -/* 112 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + this.macros = new Namespace_Namespace(macros, settings.macros); + this.mode = mode; + this.stack = []; // contains tokens in REVERSE order + } + /** + * Feed a new input string to the same MacroExpander + * (with existing macros etc.). + */ -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return spacings; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return tightSpacings; }); -/** - * Describes spaces between different classes of atoms. - */ -var thinspace = { - number: 3, - unit: "mu" -}; -var mediumspace = { - number: 4, - unit: "mu" -}; -var thickspace = { - number: 5, - unit: "mu" -}; + var _proto = MacroExpander.prototype; -// Spacing relationships for display and text styles -var spacings = { - mord: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - minner: thinspace - }, - mbin: { - mord: mediumspace, - mop: mediumspace, - mopen: mediumspace, - minner: mediumspace - }, - mrel: { - mord: thickspace, - mop: thickspace, - mopen: thickspace, - minner: thickspace - }, - mopen: {}, - mclose: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mpunct: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - mopen: thinspace, - mclose: thinspace, - mpunct: thinspace, - minner: thinspace - }, - minner: { - mord: thinspace, - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - mopen: thinspace, - mpunct: thinspace, - minner: thinspace + _proto.feed = function feed(input) { + this.lexer = new Lexer_Lexer(input, this.settings); + } + /** + * Switches between "text" and "math" modes. + */ + ; + + _proto.switchMode = function switchMode(newMode) { + this.mode = newMode; + } + /** + * Start a new group nesting within all namespaces. + */ + ; + + _proto.beginGroup = function beginGroup() { + this.macros.beginGroup(); + } + /** + * End current group nesting within all namespaces. + */ + ; + + _proto.endGroup = function endGroup() { + this.macros.endGroup(); + } + /** + * Returns the topmost token on the stack, without expanding it. + * Similar in behavior to TeX's `\futurelet`. + */ + ; + + _proto.future = function future() { + if (this.stack.length === 0) { + this.pushToken(this.lexer.lex()); } -}; -// Spacing relationships for script and scriptscript styles -var tightSpacings = { - mord: { - mop: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace - }, - mbin: {}, - mrel: {}, - mopen: {}, - mclose: { - mop: thinspace - }, - mpunct: {}, - minner: { - mop: thinspace - } -}; - -/***/ }), -/* 113 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Parser__ = __webpack_require__(114); - -/** - * Provides a single function for parsing an expression using a Parser - * TODO(emily): Remove this - */ - - - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -var parseTree = function parseTree(toParse, settings) { - if (!(typeof toParse === 'string' || toParse instanceof String)) { - throw new TypeError('KaTeX can only parse string typed expression'); + return this.stack[this.stack.length - 1]; } - var parser = new __WEBPACK_IMPORTED_MODULE_0__Parser__["a" /* default */](toParse, settings); + /** + * Remove and return the next unexpanded token. + */ + ; - return parser.parse(); -}; + _proto.popToken = function popToken() { + this.future(); // ensure non-empty stack -/* harmony default export */ __webpack_exports__["a"] = (parseTree); + return this.stack.pop(); + } + /** + * Add a given token to the token stack. In particular, this get be used + * to put back a token returned from one of the other methods. + */ + ; -/***/ }), -/* 114 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + _proto.pushToken = function pushToken(token) { + this.stack.push(token); + } + /** + * Append an array of tokens to the token stack. + */ + ; -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__functions__ = __webpack_require__(115); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__environments__ = __webpack_require__(142); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__MacroExpander__ = __webpack_require__(144); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__unicodeScripts__ = __webpack_require__(42); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__unicodeAccents__ = __webpack_require__(148); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__unicodeAccents___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8__unicodeAccents__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__unicodeSymbols__ = __webpack_require__(149); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__Lexer_js__ = __webpack_require__(62); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__Settings__ = __webpack_require__(34); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__Token__ = __webpack_require__(27); + _proto.pushTokens = function pushTokens(tokens) { + var _this$stack; + + (_this$stack = this.stack).push.apply(_this$stack, tokens); + } + /** + * Consume all following space tokens, without expansion. + */ + ; + + _proto.consumeSpaces = function consumeSpaces() { + for (;;) { + var token = this.future(); + + if (token.text === " ") { + this.stack.pop(); + } else { + break; + } + } + } + /** + * Consume the specified number of arguments from the token stream, + * and return the resulting array of arguments. + */ + ; + + _proto.consumeArgs = function consumeArgs(numArgs) { + var args = []; // obtain arguments, either single token or balanced {…} group + + for (var i = 0; i < numArgs; ++i) { + this.consumeSpaces(); // ignore spaces before each argument + + var startOfArg = this.popToken(); + + if (startOfArg.text === "{") { + var arg = []; + var depth = 1; + + while (depth !== 0) { + var tok = this.popToken(); + arg.push(tok); + + if (tok.text === "{") { + ++depth; + } else if (tok.text === "}") { + --depth; + } else if (tok.text === "EOF") { + throw new src_ParseError("End of input in macro argument", startOfArg); + } + } + + arg.pop(); // remove last } + + arg.reverse(); // like above, to fit in with stack order + + args[i] = arg; + } else if (startOfArg.text === "EOF") { + throw new src_ParseError("End of input expecting macro argument"); + } else { + args[i] = [startOfArg]; + } + } + + return args; + } + /** + * Expand the next token only once if possible. + * + * If the token is expanded, the resulting tokens will be pushed onto + * the stack in reverse order and will be returned as an array, + * also in reverse order. + * + * If not, the next token will be returned without removing it + * from the stack. This case can be detected by a `Token` return value + * instead of an `Array` return value. + * + * In either case, the next token will be on the top of the stack, + * or the stack will be empty. + * + * Used to implement `expandAfterFuture` and `expandNextToken`. + * + * At the moment, macro expansion doesn't handle delimited macros, + * i.e. things like those defined by \def\foo#1\end{…}. + * See the TeX book page 202ff. for details on how those should behave. + */ + ; + + _proto.expandOnce = function expandOnce() { + var topToken = this.popToken(); + var name = topToken.text; + + var expansion = this._getExpansion(name); + + if (expansion == null) { + // mainly checking for undefined here + // Fully expanded + this.pushToken(topToken); + return topToken; + } + + this.expansionCount++; + + if (this.expansionCount > this.settings.maxExpand) { + throw new src_ParseError("Too many expansions: infinite loop or " + "need to increase maxExpand setting"); + } + + var tokens = expansion.tokens; + + if (expansion.numArgs) { + var args = this.consumeArgs(expansion.numArgs); // paste arguments in place of the placeholders + + tokens = tokens.slice(); // make a shallow copy + + for (var i = tokens.length - 1; i >= 0; --i) { + var tok = tokens[i]; + + if (tok.text === "#") { + if (i === 0) { + throw new src_ParseError("Incomplete placeholder at end of macro body", tok); + } + + tok = tokens[--i]; // next token on stack + + if (tok.text === "#") { + // ## → # + tokens.splice(i + 1, 1); // drop first # + } else if (/^[1-9]$/.test(tok.text)) { + var _tokens; + + // replace the placeholder with the indicated argument + (_tokens = tokens).splice.apply(_tokens, [i, 2].concat(args[+tok.text - 1])); + } else { + throw new src_ParseError("Not a valid argument number", tok); + } + } + } + } // Concatenate expansion onto top of stack. + this.pushTokens(tokens); + return tokens; + } + /** + * Expand the next token only once (if possible), and return the resulting + * top token on the stack (without removing anything from the stack). + * Similar in behavior to TeX's `\expandafter\futurelet`. + * Equivalent to expandOnce() followed by future(). + */ + ; + _proto.expandAfterFuture = function expandAfterFuture() { + this.expandOnce(); + return this.future(); + } + /** + * Recursively expand first token, then return first non-expandable token. + */ + ; + + _proto.expandNextToken = function expandNextToken() { + for (;;) { + var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded. + + if (expanded instanceof Token_Token) { + // \relax stops the expansion, but shouldn't get returned (a + // null return value couldn't get implemented as a function). + if (expanded.text === "\\relax") { + this.stack.pop(); + } else { + return this.stack.pop(); // === expanded + } + } + } // Flow unable to figure out that this pathway is impossible. + // https://github.com/facebook/flow/issues/4808 + + + throw new Error(); // eslint-disable-line no-unreachable + } + /** + * Fully expand the given macro name and return the resulting list of + * tokens, or return `undefined` if no such macro is defined. + */ + ; + + _proto.expandMacro = function expandMacro(name) { + if (!this.macros.get(name)) { + return undefined; + } + + var output = []; + var oldStackLength = this.stack.length; + this.pushToken(new Token_Token(name)); + + while (this.stack.length > oldStackLength) { + var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded. + + if (expanded instanceof Token_Token) { + output.push(this.stack.pop()); + } + } + + return output; + } + /** + * Fully expand the given macro name and return the result as a string, + * or return `undefined` if no such macro is defined. + */ + ; + + _proto.expandMacroAsText = function expandMacroAsText(name) { + var tokens = this.expandMacro(name); + + if (tokens) { + return tokens.map(function (token) { + return token.text; + }).join(""); + } else { + return tokens; + } + } + /** + * Returns the expanded macro as a reversed array of tokens and a macro + * argument count. Or returns `null` if no such macro. + */ + ; + + _proto._getExpansion = function _getExpansion(name) { + var definition = this.macros.get(name); + + if (definition == null) { + // mainly checking for undefined here + return definition; + } + + var expansion = typeof definition === "function" ? definition(this) : definition; + + if (typeof expansion === "string") { + var numArgs = 0; + + if (expansion.indexOf("#") !== -1) { + var stripped = expansion.replace(/##/g, ""); + + while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { + ++numArgs; + } + } + + var bodyLexer = new Lexer_Lexer(expansion, this.settings); + var tokens = []; + var tok = bodyLexer.lex(); + + while (tok.text !== "EOF") { + tokens.push(tok); + tok = bodyLexer.lex(); + } + + tokens.reverse(); // to fit in with stack using push and pop + + var expanded = { + tokens: tokens, + numArgs: numArgs + }; + return expanded; + } + + return expansion; + } + /** + * Determine whether a command is currently "defined" (has some + * functionality), meaning that it's a macro (in the current group), + * a function, a symbol, or one of the special commands listed in + * `implicitCommands`. + */ + ; + + _proto.isDefined = function isDefined(name) { + return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name); + }; + + return MacroExpander; +}(); + + +// CONCATENATED MODULE: ./src/unicodeAccents.js +// Mapping of Unicode accent characters to their LaTeX equivalent in text and +// math mode (when they exist). +/* harmony default export */ var unicodeAccents = ({ + "\u0301": { + text: "\\'", + math: '\\acute' + }, + "\u0300": { + text: '\\`', + math: '\\grave' + }, + "\u0308": { + text: '\\"', + math: '\\ddot' + }, + "\u0303": { + text: '\\~', + math: '\\tilde' + }, + "\u0304": { + text: '\\=', + math: '\\bar' + }, + "\u0306": { + text: "\\u", + math: '\\breve' + }, + "\u030C": { + text: '\\v', + math: '\\check' + }, + "\u0302": { + text: '\\^', + math: '\\hat' + }, + "\u0307": { + text: '\\.', + math: '\\dot' + }, + "\u030A": { + text: '\\r', + math: '\\mathring' + }, + "\u030B": { + text: '\\H' + } +}); +// CONCATENATED MODULE: ./src/unicodeSymbols.js +// This file is GENERATED by unicodeMake.js. DO NOT MODIFY. +/* harmony default export */ var unicodeSymbols = ({ + "\xE1": "a\u0301", + // á = \'{a} + "\xE0": "a\u0300", + // à = \`{a} + "\xE4": "a\u0308", + // ä = \"{a} + "\u01DF": "a\u0308\u0304", + // ǟ = \"\={a} + "\xE3": "a\u0303", + // ã = \~{a} + "\u0101": "a\u0304", + // ā = \={a} + "\u0103": "a\u0306", + // ă = \u{a} + "\u1EAF": "a\u0306\u0301", + // ắ = \u\'{a} + "\u1EB1": "a\u0306\u0300", + // ằ = \u\`{a} + "\u1EB5": "a\u0306\u0303", + // ẵ = \u\~{a} + "\u01CE": "a\u030C", + // ǎ = \v{a} + "\xE2": "a\u0302", + // â = \^{a} + "\u1EA5": "a\u0302\u0301", + // ấ = \^\'{a} + "\u1EA7": "a\u0302\u0300", + // ầ = \^\`{a} + "\u1EAB": "a\u0302\u0303", + // ẫ = \^\~{a} + "\u0227": "a\u0307", + // ȧ = \.{a} + "\u01E1": "a\u0307\u0304", + // ǡ = \.\={a} + "\xE5": "a\u030A", + // å = \r{a} + "\u01FB": "a\u030A\u0301", + // ǻ = \r\'{a} + "\u1E03": "b\u0307", + // ḃ = \.{b} + "\u0107": "c\u0301", + // ć = \'{c} + "\u010D": "c\u030C", + // č = \v{c} + "\u0109": "c\u0302", + // ĉ = \^{c} + "\u010B": "c\u0307", + // ċ = \.{c} + "\u010F": "d\u030C", + // ď = \v{d} + "\u1E0B": "d\u0307", + // ḋ = \.{d} + "\xE9": "e\u0301", + // é = \'{e} + "\xE8": "e\u0300", + // è = \`{e} + "\xEB": "e\u0308", + // ë = \"{e} + "\u1EBD": "e\u0303", + // ẽ = \~{e} + "\u0113": "e\u0304", + // ē = \={e} + "\u1E17": "e\u0304\u0301", + // ḗ = \=\'{e} + "\u1E15": "e\u0304\u0300", + // ḕ = \=\`{e} + "\u0115": "e\u0306", + // ĕ = \u{e} + "\u011B": "e\u030C", + // ě = \v{e} + "\xEA": "e\u0302", + // ê = \^{e} + "\u1EBF": "e\u0302\u0301", + // ế = \^\'{e} + "\u1EC1": "e\u0302\u0300", + // ề = \^\`{e} + "\u1EC5": "e\u0302\u0303", + // ễ = \^\~{e} + "\u0117": "e\u0307", + // ė = \.{e} + "\u1E1F": "f\u0307", + // ḟ = \.{f} + "\u01F5": "g\u0301", + // ǵ = \'{g} + "\u1E21": "g\u0304", + // ḡ = \={g} + "\u011F": "g\u0306", + // ğ = \u{g} + "\u01E7": "g\u030C", + // ǧ = \v{g} + "\u011D": "g\u0302", + // ĝ = \^{g} + "\u0121": "g\u0307", + // ġ = \.{g} + "\u1E27": "h\u0308", + // ḧ = \"{h} + "\u021F": "h\u030C", + // ȟ = \v{h} + "\u0125": "h\u0302", + // ĥ = \^{h} + "\u1E23": "h\u0307", + // ḣ = \.{h} + "\xED": "i\u0301", + // í = \'{i} + "\xEC": "i\u0300", + // ì = \`{i} + "\xEF": "i\u0308", + // ï = \"{i} + "\u1E2F": "i\u0308\u0301", + // ḯ = \"\'{i} + "\u0129": "i\u0303", + // ĩ = \~{i} + "\u012B": "i\u0304", + // ī = \={i} + "\u012D": "i\u0306", + // ĭ = \u{i} + "\u01D0": "i\u030C", + // ǐ = \v{i} + "\xEE": "i\u0302", + // î = \^{i} + "\u01F0": "j\u030C", + // ǰ = \v{j} + "\u0135": "j\u0302", + // ĵ = \^{j} + "\u1E31": "k\u0301", + // ḱ = \'{k} + "\u01E9": "k\u030C", + // ǩ = \v{k} + "\u013A": "l\u0301", + // ĺ = \'{l} + "\u013E": "l\u030C", + // ľ = \v{l} + "\u1E3F": "m\u0301", + // ḿ = \'{m} + "\u1E41": "m\u0307", + // ṁ = \.{m} + "\u0144": "n\u0301", + // ń = \'{n} + "\u01F9": "n\u0300", + // ǹ = \`{n} + "\xF1": "n\u0303", + // ñ = \~{n} + "\u0148": "n\u030C", + // ň = \v{n} + "\u1E45": "n\u0307", + // ṅ = \.{n} + "\xF3": "o\u0301", + // ó = \'{o} + "\xF2": "o\u0300", + // ò = \`{o} + "\xF6": "o\u0308", + // ö = \"{o} + "\u022B": "o\u0308\u0304", + // ȫ = \"\={o} + "\xF5": "o\u0303", + // õ = \~{o} + "\u1E4D": "o\u0303\u0301", + // ṍ = \~\'{o} + "\u1E4F": "o\u0303\u0308", + // ṏ = \~\"{o} + "\u022D": "o\u0303\u0304", + // ȭ = \~\={o} + "\u014D": "o\u0304", + // ō = \={o} + "\u1E53": "o\u0304\u0301", + // ṓ = \=\'{o} + "\u1E51": "o\u0304\u0300", + // ṑ = \=\`{o} + "\u014F": "o\u0306", + // ŏ = \u{o} + "\u01D2": "o\u030C", + // ǒ = \v{o} + "\xF4": "o\u0302", + // ô = \^{o} + "\u1ED1": "o\u0302\u0301", + // ố = \^\'{o} + "\u1ED3": "o\u0302\u0300", + // ồ = \^\`{o} + "\u1ED7": "o\u0302\u0303", + // ỗ = \^\~{o} + "\u022F": "o\u0307", + // ȯ = \.{o} + "\u0231": "o\u0307\u0304", + // ȱ = \.\={o} + "\u0151": "o\u030B", + // ő = \H{o} + "\u1E55": "p\u0301", + // ṕ = \'{p} + "\u1E57": "p\u0307", + // ṗ = \.{p} + "\u0155": "r\u0301", + // ŕ = \'{r} + "\u0159": "r\u030C", + // ř = \v{r} + "\u1E59": "r\u0307", + // ṙ = \.{r} + "\u015B": "s\u0301", + // ś = \'{s} + "\u1E65": "s\u0301\u0307", + // ṥ = \'\.{s} + "\u0161": "s\u030C", + // š = \v{s} + "\u1E67": "s\u030C\u0307", + // ṧ = \v\.{s} + "\u015D": "s\u0302", + // ŝ = \^{s} + "\u1E61": "s\u0307", + // ṡ = \.{s} + "\u1E97": "t\u0308", + // ẗ = \"{t} + "\u0165": "t\u030C", + // ť = \v{t} + "\u1E6B": "t\u0307", + // ṫ = \.{t} + "\xFA": "u\u0301", + // ú = \'{u} + "\xF9": "u\u0300", + // ù = \`{u} + "\xFC": "u\u0308", + // ü = \"{u} + "\u01D8": "u\u0308\u0301", + // ǘ = \"\'{u} + "\u01DC": "u\u0308\u0300", + // ǜ = \"\`{u} + "\u01D6": "u\u0308\u0304", + // ǖ = \"\={u} + "\u01DA": "u\u0308\u030C", + // ǚ = \"\v{u} + "\u0169": "u\u0303", + // ũ = \~{u} + "\u1E79": "u\u0303\u0301", + // ṹ = \~\'{u} + "\u016B": "u\u0304", + // ū = \={u} + "\u1E7B": "u\u0304\u0308", + // ṻ = \=\"{u} + "\u016D": "u\u0306", + // ŭ = \u{u} + "\u01D4": "u\u030C", + // ǔ = \v{u} + "\xFB": "u\u0302", + // û = \^{u} + "\u016F": "u\u030A", + // ů = \r{u} + "\u0171": "u\u030B", + // ű = \H{u} + "\u1E7D": "v\u0303", + // ṽ = \~{v} + "\u1E83": "w\u0301", + // ẃ = \'{w} + "\u1E81": "w\u0300", + // ẁ = \`{w} + "\u1E85": "w\u0308", + // ẅ = \"{w} + "\u0175": "w\u0302", + // ŵ = \^{w} + "\u1E87": "w\u0307", + // ẇ = \.{w} + "\u1E98": "w\u030A", + // ẘ = \r{w} + "\u1E8D": "x\u0308", + // ẍ = \"{x} + "\u1E8B": "x\u0307", + // ẋ = \.{x} + "\xFD": "y\u0301", + // ý = \'{y} + "\u1EF3": "y\u0300", + // ỳ = \`{y} + "\xFF": "y\u0308", + // ÿ = \"{y} + "\u1EF9": "y\u0303", + // ỹ = \~{y} + "\u0233": "y\u0304", + // ȳ = \={y} + "\u0177": "y\u0302", + // ŷ = \^{y} + "\u1E8F": "y\u0307", + // ẏ = \.{y} + "\u1E99": "y\u030A", + // ẙ = \r{y} + "\u017A": "z\u0301", + // ź = \'{z} + "\u017E": "z\u030C", + // ž = \v{z} + "\u1E91": "z\u0302", + // ẑ = \^{z} + "\u017C": "z\u0307", + // ż = \.{z} + "\xC1": "A\u0301", + // Á = \'{A} + "\xC0": "A\u0300", + // À = \`{A} + "\xC4": "A\u0308", + // Ä = \"{A} + "\u01DE": "A\u0308\u0304", + // Ǟ = \"\={A} + "\xC3": "A\u0303", + // Ã = \~{A} + "\u0100": "A\u0304", + // Ā = \={A} + "\u0102": "A\u0306", + // Ă = \u{A} + "\u1EAE": "A\u0306\u0301", + // Ắ = \u\'{A} + "\u1EB0": "A\u0306\u0300", + // Ằ = \u\`{A} + "\u1EB4": "A\u0306\u0303", + // Ẵ = \u\~{A} + "\u01CD": "A\u030C", + // Ǎ = \v{A} + "\xC2": "A\u0302", + // Â = \^{A} + "\u1EA4": "A\u0302\u0301", + // Ấ = \^\'{A} + "\u1EA6": "A\u0302\u0300", + // Ầ = \^\`{A} + "\u1EAA": "A\u0302\u0303", + // Ẫ = \^\~{A} + "\u0226": "A\u0307", + // Ȧ = \.{A} + "\u01E0": "A\u0307\u0304", + // Ǡ = \.\={A} + "\xC5": "A\u030A", + // Å = \r{A} + "\u01FA": "A\u030A\u0301", + // Ǻ = \r\'{A} + "\u1E02": "B\u0307", + // Ḃ = \.{B} + "\u0106": "C\u0301", + // Ć = \'{C} + "\u010C": "C\u030C", + // Č = \v{C} + "\u0108": "C\u0302", + // Ĉ = \^{C} + "\u010A": "C\u0307", + // Ċ = \.{C} + "\u010E": "D\u030C", + // Ď = \v{D} + "\u1E0A": "D\u0307", + // Ḋ = \.{D} + "\xC9": "E\u0301", + // É = \'{E} + "\xC8": "E\u0300", + // È = \`{E} + "\xCB": "E\u0308", + // Ë = \"{E} + "\u1EBC": "E\u0303", + // Ẽ = \~{E} + "\u0112": "E\u0304", + // Ē = \={E} + "\u1E16": "E\u0304\u0301", + // Ḗ = \=\'{E} + "\u1E14": "E\u0304\u0300", + // Ḕ = \=\`{E} + "\u0114": "E\u0306", + // Ĕ = \u{E} + "\u011A": "E\u030C", + // Ě = \v{E} + "\xCA": "E\u0302", + // Ê = \^{E} + "\u1EBE": "E\u0302\u0301", + // Ế = \^\'{E} + "\u1EC0": "E\u0302\u0300", + // Ề = \^\`{E} + "\u1EC4": "E\u0302\u0303", + // Ễ = \^\~{E} + "\u0116": "E\u0307", + // Ė = \.{E} + "\u1E1E": "F\u0307", + // Ḟ = \.{F} + "\u01F4": "G\u0301", + // Ǵ = \'{G} + "\u1E20": "G\u0304", + // Ḡ = \={G} + "\u011E": "G\u0306", + // Ğ = \u{G} + "\u01E6": "G\u030C", + // Ǧ = \v{G} + "\u011C": "G\u0302", + // Ĝ = \^{G} + "\u0120": "G\u0307", + // Ġ = \.{G} + "\u1E26": "H\u0308", + // Ḧ = \"{H} + "\u021E": "H\u030C", + // Ȟ = \v{H} + "\u0124": "H\u0302", + // Ĥ = \^{H} + "\u1E22": "H\u0307", + // Ḣ = \.{H} + "\xCD": "I\u0301", + // Í = \'{I} + "\xCC": "I\u0300", + // Ì = \`{I} + "\xCF": "I\u0308", + // Ï = \"{I} + "\u1E2E": "I\u0308\u0301", + // Ḯ = \"\'{I} + "\u0128": "I\u0303", + // Ĩ = \~{I} + "\u012A": "I\u0304", + // Ī = \={I} + "\u012C": "I\u0306", + // Ĭ = \u{I} + "\u01CF": "I\u030C", + // Ǐ = \v{I} + "\xCE": "I\u0302", + // Î = \^{I} + "\u0130": "I\u0307", + // İ = \.{I} + "\u0134": "J\u0302", + // Ĵ = \^{J} + "\u1E30": "K\u0301", + // Ḱ = \'{K} + "\u01E8": "K\u030C", + // Ǩ = \v{K} + "\u0139": "L\u0301", + // Ĺ = \'{L} + "\u013D": "L\u030C", + // Ľ = \v{L} + "\u1E3E": "M\u0301", + // Ḿ = \'{M} + "\u1E40": "M\u0307", + // Ṁ = \.{M} + "\u0143": "N\u0301", + // Ń = \'{N} + "\u01F8": "N\u0300", + // Ǹ = \`{N} + "\xD1": "N\u0303", + // Ñ = \~{N} + "\u0147": "N\u030C", + // Ň = \v{N} + "\u1E44": "N\u0307", + // Ṅ = \.{N} + "\xD3": "O\u0301", + // Ó = \'{O} + "\xD2": "O\u0300", + // Ò = \`{O} + "\xD6": "O\u0308", + // Ö = \"{O} + "\u022A": "O\u0308\u0304", + // Ȫ = \"\={O} + "\xD5": "O\u0303", + // Õ = \~{O} + "\u1E4C": "O\u0303\u0301", + // Ṍ = \~\'{O} + "\u1E4E": "O\u0303\u0308", + // Ṏ = \~\"{O} + "\u022C": "O\u0303\u0304", + // Ȭ = \~\={O} + "\u014C": "O\u0304", + // Ō = \={O} + "\u1E52": "O\u0304\u0301", + // Ṓ = \=\'{O} + "\u1E50": "O\u0304\u0300", + // Ṑ = \=\`{O} + "\u014E": "O\u0306", + // Ŏ = \u{O} + "\u01D1": "O\u030C", + // Ǒ = \v{O} + "\xD4": "O\u0302", + // Ô = \^{O} + "\u1ED0": "O\u0302\u0301", + // Ố = \^\'{O} + "\u1ED2": "O\u0302\u0300", + // Ồ = \^\`{O} + "\u1ED6": "O\u0302\u0303", + // Ỗ = \^\~{O} + "\u022E": "O\u0307", + // Ȯ = \.{O} + "\u0230": "O\u0307\u0304", + // Ȱ = \.\={O} + "\u0150": "O\u030B", + // Ő = \H{O} + "\u1E54": "P\u0301", + // Ṕ = \'{P} + "\u1E56": "P\u0307", + // Ṗ = \.{P} + "\u0154": "R\u0301", + // Ŕ = \'{R} + "\u0158": "R\u030C", + // Ř = \v{R} + "\u1E58": "R\u0307", + // Ṙ = \.{R} + "\u015A": "S\u0301", + // Ś = \'{S} + "\u1E64": "S\u0301\u0307", + // Ṥ = \'\.{S} + "\u0160": "S\u030C", + // Š = \v{S} + "\u1E66": "S\u030C\u0307", + // Ṧ = \v\.{S} + "\u015C": "S\u0302", + // Ŝ = \^{S} + "\u1E60": "S\u0307", + // Ṡ = \.{S} + "\u0164": "T\u030C", + // Ť = \v{T} + "\u1E6A": "T\u0307", + // Ṫ = \.{T} + "\xDA": "U\u0301", + // Ú = \'{U} + "\xD9": "U\u0300", + // Ù = \`{U} + "\xDC": "U\u0308", + // Ü = \"{U} + "\u01D7": "U\u0308\u0301", + // Ǘ = \"\'{U} + "\u01DB": "U\u0308\u0300", + // Ǜ = \"\`{U} + "\u01D5": "U\u0308\u0304", + // Ǖ = \"\={U} + "\u01D9": "U\u0308\u030C", + // Ǚ = \"\v{U} + "\u0168": "U\u0303", + // Ũ = \~{U} + "\u1E78": "U\u0303\u0301", + // Ṹ = \~\'{U} + "\u016A": "U\u0304", + // Ū = \={U} + "\u1E7A": "U\u0304\u0308", + // Ṻ = \=\"{U} + "\u016C": "U\u0306", + // Ŭ = \u{U} + "\u01D3": "U\u030C", + // Ǔ = \v{U} + "\xDB": "U\u0302", + // Û = \^{U} + "\u016E": "U\u030A", + // Ů = \r{U} + "\u0170": "U\u030B", + // Ű = \H{U} + "\u1E7C": "V\u0303", + // Ṽ = \~{V} + "\u1E82": "W\u0301", + // Ẃ = \'{W} + "\u1E80": "W\u0300", + // Ẁ = \`{W} + "\u1E84": "W\u0308", + // Ẅ = \"{W} + "\u0174": "W\u0302", + // Ŵ = \^{W} + "\u1E86": "W\u0307", + // Ẇ = \.{W} + "\u1E8C": "X\u0308", + // Ẍ = \"{X} + "\u1E8A": "X\u0307", + // Ẋ = \.{X} + "\xDD": "Y\u0301", + // Ý = \'{Y} + "\u1EF2": "Y\u0300", + // Ỳ = \`{Y} + "\u0178": "Y\u0308", + // Ÿ = \"{Y} + "\u1EF8": "Y\u0303", + // Ỹ = \~{Y} + "\u0232": "Y\u0304", + // Ȳ = \={Y} + "\u0176": "Y\u0302", + // Ŷ = \^{Y} + "\u1E8E": "Y\u0307", + // Ẏ = \.{Y} + "\u0179": "Z\u0301", + // Ź = \'{Z} + "\u017D": "Z\u030C", + // Ž = \v{Z} + "\u1E90": "Z\u0302", + // Ẑ = \^{Z} + "\u017B": "Z\u0307", + // Ż = \.{Z} + "\u03AC": "\u03B1\u0301", + // ά = \'{α} + "\u1F70": "\u03B1\u0300", + // ὰ = \`{α} + "\u1FB1": "\u03B1\u0304", + // ᾱ = \={α} + "\u1FB0": "\u03B1\u0306", + // ᾰ = \u{α} + "\u03AD": "\u03B5\u0301", + // έ = \'{ε} + "\u1F72": "\u03B5\u0300", + // ὲ = \`{ε} + "\u03AE": "\u03B7\u0301", + // ή = \'{η} + "\u1F74": "\u03B7\u0300", + // ὴ = \`{η} + "\u03AF": "\u03B9\u0301", + // ί = \'{ι} + "\u1F76": "\u03B9\u0300", + // ὶ = \`{ι} + "\u03CA": "\u03B9\u0308", + // ϊ = \"{ι} + "\u0390": "\u03B9\u0308\u0301", + // ΐ = \"\'{ι} + "\u1FD2": "\u03B9\u0308\u0300", + // ῒ = \"\`{ι} + "\u1FD1": "\u03B9\u0304", + // ῑ = \={ι} + "\u1FD0": "\u03B9\u0306", + // ῐ = \u{ι} + "\u03CC": "\u03BF\u0301", + // ό = \'{ο} + "\u1F78": "\u03BF\u0300", + // ὸ = \`{ο} + "\u03CD": "\u03C5\u0301", + // ύ = \'{υ} + "\u1F7A": "\u03C5\u0300", + // ὺ = \`{υ} + "\u03CB": "\u03C5\u0308", + // ϋ = \"{υ} + "\u03B0": "\u03C5\u0308\u0301", + // ΰ = \"\'{υ} + "\u1FE2": "\u03C5\u0308\u0300", + // ῢ = \"\`{υ} + "\u1FE1": "\u03C5\u0304", + // ῡ = \={υ} + "\u1FE0": "\u03C5\u0306", + // ῠ = \u{υ} + "\u03CE": "\u03C9\u0301", + // ώ = \'{ω} + "\u1F7C": "\u03C9\u0300", + // ὼ = \`{ω} + "\u038E": "\u03A5\u0301", + // Ύ = \'{Υ} + "\u1FEA": "\u03A5\u0300", + // Ὺ = \`{Υ} + "\u03AB": "\u03A5\u0308", + // Ϋ = \"{Υ} + "\u1FE9": "\u03A5\u0304", + // Ῡ = \={Υ} + "\u1FE8": "\u03A5\u0306", + // Ῠ = \u{Υ} + "\u038F": "\u03A9\u0301", + // Ώ = \'{Ω} + "\u1FFA": "\u03A9\u0300" // Ὼ = \`{Ω} + +}); +// CONCATENATED MODULE: ./src/Parser.js /* eslint no-constant-condition:0 */ -/* eslint no-console:0 */ + @@ -10337,7 +15519,7 @@ var parseTree = function parseTree(toParse, settings) { * * The main functions (the `.parse...` ones) take a position in the current * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.lexer) also supports pulling out tokens at arbitrary places. When + * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When * individual tokens are needed at a position, the lexer is called to pull out a * token, which is then used. * @@ -10355,4939 +15537,1075 @@ var parseTree = function parseTree(toParse, settings) { * There are also extra `.handle...` functions, which pull out some reused * functionality into self-contained functions. * - * The earlier functions return ParseNodes. - * The later functions (which are called deeper in the parse) sometimes return - * ParsedFuncOrArgOrDollar, which contain a ParseNode as well as some data about - * whether the parsed object is a function which is missing some arguments, or a - * standalone object which can be used as an argument to another function. + * The functions return ParseNodes. */ +var Parser_Parser = +/*#__PURE__*/ +function () { + function Parser(input, settings) { + this.mode = void 0; + this.gullet = void 0; + this.settings = void 0; + this.leftrightDepth = void 0; + this.nextToken = void 0; + // Start in math mode + this.mode = "math"; // Create a new macro expander (gullet) and (indirectly via that) also a + // new lexer (mouth) for this parser (stomach, in the language of TeX) -function newArgument(result, token) { - return { type: "arg", result: result, token: token }; -} + this.gullet = new MacroExpander_MacroExpander(input, settings, this.mode); // Store the settings for use in parsing -function newFunction(token) { - return { type: "fn", result: token.text, token: token }; -} + this.settings = settings; // Count leftright depth (for \middle errors) -function newDollar(token) { - return { type: "$", result: "$", token: token }; -} + this.leftrightDepth = 0; + } + /** + * Checks a result to make sure it has the right type, and throws an + * appropriate error otherwise. + */ -function assertFuncOrArg(parsed) { - if (parsed.type === "$") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unexpected $", parsed.token); - } - return parsed; -} -var Parser = function () { - function Parser(input, settings) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Parser); + var _proto = Parser.prototype; - // Start in math mode - this.mode = "math"; - // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - this.gullet = new __WEBPACK_IMPORTED_MODULE_4__MacroExpander__["a" /* default */](input, settings.macros, this.mode); - // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this after the macros object has been copied by MacroExpander. - if (settings.colorIsTextColor) { - this.gullet.macros["\\color"] = "\\textcolor"; - } - // Store the settings for use in parsing - this.settings = settings; - // Count leftright depth (for \middle errors) - this.leftrightDepth = 0; + _proto.expect = function expect(text, consume) { + if (consume === void 0) { + consume = true; } - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - - - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Parser, [{ - key: "expect", - value: function expect(text) { - var consume = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - if (this.nextToken.text !== text) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Expected '" + text + "', got '" + this.nextToken.text + "'", this.nextToken); - } - if (consume) { - this.consume(); - } - } - - /** - * Considers the current look ahead token as consumed, - * and fetches the one after that as the new look ahead. - */ - - }, { - key: "consume", - value: function consume() { - this.nextToken = this.gullet.expandNextToken(); - } - - /** - * Switches between "text" and "math" modes. - */ - - }, { - key: "switchMode", - value: function switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - - /** - * Main parsing function, which parses an entire input. - */ - - }, { - key: "parse", - value: function parse() { - // Try to parse the input - this.consume(); - var parse = this.parseInput(); - return parse; - } - - /** - * Parses an entire input tree. - */ - - }, { - key: "parseInput", - value: function parseInput() { - // Parse an expression - var expression = this.parseExpression(false); - // If we succeeded, make sure there's an EOF at the end - this.expect("EOF", false); - return expression; - } - }, { - key: "parseExpression", - - - /** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precendence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - */ - value: function parseExpression(breakOnInfix, breakOnTokenText) { - var body = []; - // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - var lex = this.nextToken; - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - if (breakOnInfix && __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][lex.text] && __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][lex.text].infix) { - break; - } - var atom = this.parseAtom(breakOnTokenText); - if (!atom) { - if (!this.settings.throwOnError && lex.text[0] === "\\") { - var errorNode = this.handleUnsupportedCmd(); - body.push(errorNode); - continue; - } - - break; - } - body.push(atom); - } - return this.handleInfixNodes(body); - } - - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - - }, { - key: "handleInfixNodes", - value: function handleInfixNodes(body) { - var overIndex = -1; - var funcName = void 0; - - for (var i = 0; i < body.length; i++) { - var node = body[i]; - if (node.type === "infix") { - if (overIndex !== -1) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("only one infix operator per group", node.value.token); - } - overIndex = i; - funcName = node.value.replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - var numerNode = void 0; - var denomNode = void 0; - - var numerBody = body.slice(0, overIndex); - var denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", numerBody, this.mode); - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", denomBody, this.mode); - } - - var value = this.callFunction(funcName, [numerNode, denomNode], []); - return [new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */](value.type, value, this.mode)]; - } else { - return body; - } - } - - // The greediness of a superscript or subscript - - }, { - key: "handleSupSubscript", - - - /** - * Handle a subscript or superscript with nice errors. - */ - value: function handleSupSubscript(name) { - var symbolToken = this.nextToken; - var symbol = symbolToken.text; - this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - var group = this.parseGroup(); - - if (!group) { - if (!this.settings.throwOnError && this.nextToken.text[0] === "\\") { - return this.handleUnsupportedCmd(); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Expected group after '" + symbol + "'", symbolToken); - } - } - - var arg = assertFuncOrArg(group); - if (arg.type === "fn") { - // ^ and _ have a greediness, so handle interactions with functions' - // greediness - var funcGreediness = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][arg.result].greediness; - if (funcGreediness > Parser.SUPSUB_GREEDINESS) { - return this.parseGivenFunction(group); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Got function '" + arg.result + "' with no arguments " + "as " + name, symbolToken); - } - } else { - return arg.result; - } - } - - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - - }, { - key: "handleUnsupportedCmd", - value: function handleUnsupportedCmd() { - var text = this.nextToken.text; - var textordArray = []; - - for (var i = 0; i < text.length; i++) { - textordArray.push(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", text[i], "text")); - } - - var textNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("text", { - body: textordArray, - type: "text" - }, this.mode); - - var colorNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("color", { - color: this.settings.errorColor, - value: [textNode], - type: "color" - }, this.mode); - - this.consume(); - return colorNode; - } - - /** - * Parses a group with optional super/subscripts. - */ - - }, { - key: "parseAtom", - value: function parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - var base = this.parseImplicitGroup(breakOnTokenText); - - // In text mode, we don't have superscripts or subscripts - if (this.mode === "text") { - return base; - } - - // Note that base may be empty (i.e. null) at this point. - - var superscript = void 0; - var subscript = void 0; - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); - - // Lex the first token - var lex = this.nextToken; - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (!base || base.type !== "op") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Limit controls must follow a math operator", lex); - } else { - var limits = lex.text === "\\limits"; - base.value.limits = limits; - base.value.alwaysHandleSupSub = true; - } - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Double superscript", lex); - } - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Double subscript", lex); - } - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Double superscript", lex); - } - var prime = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", "\\prime", this.mode); - - // Many primes can be grouped together, so we handle this here - var primes = [prime]; - this.consume(); - // Keep lexing tokens until we get something that's not a prime - while (this.nextToken.text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } - // If there's a superscript following the primes, combine that - // superscript in with the primes. - if (this.nextToken.text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } - // Put everything into an ordgroup as the superscript - superscript = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", primes, this.mode); - } else { - // If it wasn't ^, _, or ', stop parsing super/subscripts - break; - } - } - - if (superscript || subscript) { - // If we got either a superscript or subscript, create a supsub - return new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("supsub", { - base: base, - sup: superscript, - sub: subscript - }, this.mode); - } else { - // Otherwise return the original body - return base; - } - } - - /** - * Parses an implicit group, which is a group that starts at the end of a - * specified, and ends right before a higher explicit group ends, or at EOL. It - * is used for functions that appear to affect the current style, like \Large or - * \textrm, where instead of keeping a style we just pretend that there is an - * implicit grouping after it until the end of the group. E.g. - * small text {\Large large text} small text again - */ - - }, { - key: "parseImplicitGroup", - value: function parseImplicitGroup(breakOnTokenText) { - var start = this.parseSymbol(); - - if (start == null) { - // If we didn't get anything we handle, fall back to parseFunction - return this.parseFunction(); - } else if (start.type === "arg") { - // Defer to parseGivenFunction if it's not a function we handle - return this.parseGivenFunction(start); - } - - var func = start.result; - - if (func === "$") { - if (this.mode === "math") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("$ within math mode"); - } - var outerMode = this.mode; - this.switchMode("math"); - // Expand next symbol now that we're in math mode. - this.consume(); - var body = this.parseExpression(false, "$"); - // We can't expand the next symbol after the $ until after - // switching modes back. So don't consume within expect. - this.expect("$", false); - this.switchMode(outerMode); - this.consume(); - return new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("styling", { - style: "text", - value: body - }, "math"); - } else if (func === "\\begin") { - // begin...end is similar to left...right - var begin = this.parseGivenFunction(start); - var envName = begin.value.name; - if (!__WEBPACK_IMPORTED_MODULE_3__environments__["a" /* default */].hasOwnProperty(envName)) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("No such environment: " + envName, begin.value.nameGroup); - } - // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - var env = __WEBPACK_IMPORTED_MODULE_3__environments__["a" /* default */][envName]; - - var _parseArguments = this.parseArguments("\\begin{" + envName + "}", env), - args = _parseArguments.args, - optArgs = _parseArguments.optArgs; - - var context = { - mode: this.mode, - envName: envName, - parser: this - }; - var _result = env.handler(context, args, optArgs); - this.expect("\\end", false); - var endNameToken = this.nextToken; - var end = this.parseFunction(); - if (!end) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("failed to parse function after \\end"); - } else if (end.value.name !== envName) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Mismatch: \\begin{" + envName + "} matched " + "by \\end{" + end.value.name + "}", endNameToken); - } - return _result; - } else { - // Defer to parseGivenFunction if it's not a function we handle - return this.parseGivenFunction(start, breakOnTokenText); - } - } - - /** - * Parses an entire function, including its base and all of its arguments. - * It also handles the case where the parsed node is not a function. - */ - - }, { - key: "parseFunction", - value: function parseFunction() { - var baseGroup = this.parseGroup(); - return baseGroup ? this.parseGivenFunction(baseGroup) : null; - } - - /** - * Same as parseFunction(), except that the base is provided, guaranteeing a - * non-nullable result. - */ - - }, { - key: "parseGivenFunction", - value: function parseGivenFunction(baseGroup, breakOnTokenText) { - baseGroup = assertFuncOrArg(baseGroup); - if (baseGroup.type === "fn") { - var func = baseGroup.result; - var funcData = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][func]; - if (this.mode === "text" && !funcData.allowedInText) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Can't use function '" + func + "' in text mode", baseGroup.token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Can't use function '" + func + "' in math mode", baseGroup.token); - } - - var _parseArguments2 = this.parseArguments(func, funcData), - args = _parseArguments2.args, - optArgs = _parseArguments2.optArgs; - - var _token = baseGroup.token; - var _result2 = this.callFunction(func, args, optArgs, _token, breakOnTokenText); - return new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */](_result2.type, _result2, this.mode); - } else { - return baseGroup.result; - } - } - - /** - * Call a function handler with a suitable context and arguments. - */ - - }, { - key: "callFunction", - value: function callFunction(name, args, optArgs, token, breakOnTokenText) { - var context = { - funcName: name, - parser: this, - token: token, - breakOnTokenText: breakOnTokenText - }; - var func = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][name]; - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("No function handler for " + name); - } - } - - /** - * Parses the arguments of a function or environment - */ - - }, { - key: "parseArguments", - value: function parseArguments(func, // Should look like "\name" or "\begin{name}". - funcData) { - var totalArgs = funcData.numArgs + funcData.numOptionalArgs; - if (totalArgs === 0) { - return { args: [], optArgs: [] }; - } - - var baseGreediness = funcData.greediness; - var args = []; - var optArgs = []; - - for (var i = 0; i < totalArgs; i++) { - var argType = funcData.argTypes && funcData.argTypes[i]; - var isOptional = i < funcData.numOptionalArgs; - // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - if (i > 0 && !isOptional) { - this.consumeSpaces(); - } - // Also consume leading spaces in math mode, as parseSymbol - // won't know what to do with them. This can only happen with - // macros, e.g. \frac\foo\foo where \foo expands to a space symbol. - // In LaTeX, the \foo's get treated as (blank) arguments). - // In KaTeX, for now, both spaces will get consumed. - // TODO(edemaine) - if (i === 0 && !isOptional && this.mode === "math") { - this.consumeSpaces(); - } - var nextToken = this.nextToken; - var arg = argType ? this.parseGroupOfType(argType, isOptional) : this.parseGroup(isOptional); - if (!arg) { - if (isOptional) { - optArgs.push(null); - continue; - } - if (!this.settings.throwOnError && this.nextToken.text[0] === "\\") { - arg = newArgument(this.handleUnsupportedCmd(), nextToken); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Expected group after '" + func + "'", nextToken); - } - } - var argNode = void 0; - arg = assertFuncOrArg(arg); - if (arg.type === "fn") { - var argGreediness = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][arg.result].greediness; - if (argGreediness > baseGreediness) { - argNode = this.parseGivenFunction(arg); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Got function '" + arg.result + "' as " + "argument to '" + func + "'", nextToken); - } - } else { - argNode = arg.result; - } - (isOptional ? optArgs : args).push(argNode); - } - - return { args: args, optArgs: optArgs }; - } - - /** - * Parses a group when the mode is changing. - */ - - }, { - key: "parseGroupOfType", - value: function parseGroupOfType(type, // Used to describe the mode in error messages. - optional) { - // Handle `original` argTypes - if (type === "original") { - type = this.mode; - } - - if (type === "color") { - return this.parseColorGroup(optional); - } - if (type === "size") { - return this.parseSizeGroup(optional); - } - if (type === "url") { - return this.parseUrlGroup(optional); - } - - // By the time we get here, type is one of "text" or "math". - // Specify this as mode to parseGroup. - return this.parseGroup(optional, type); - } - }, { - key: "consumeSpaces", - value: function consumeSpaces() { - while (this.nextToken.text === " ") { - this.consume(); - } - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - - }, { - key: "parseStringGroup", - value: function parseStringGroup(modeName, // Used to describe the mode in error messages. - optional) { - if (optional && this.nextToken.text !== "[") { - return null; - } - var outerMode = this.mode; - this.mode = "text"; - this.expect(optional ? "[" : "{"); - var str = ""; - var firstToken = this.nextToken; - var lastToken = firstToken; - while (this.nextToken.text !== (optional ? "]" : "}")) { - if (this.nextToken.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unexpected end of input in " + modeName, firstToken.range(this.nextToken, str)); - } - lastToken = this.nextToken; - str += lastToken.text; - this.consume(); - } - this.mode = outerMode; - this.expect(optional ? "]" : "}"); - return firstToken.range(lastToken, str); - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information, possibly - * with nested braces. - */ - - }, { - key: "parseStringGroupWithBalancedBraces", - value: function parseStringGroupWithBalancedBraces(modeName, // Used to describe the mode in error messages. - optional) { - if (optional && this.nextToken.text !== "[") { - return null; - } - var outerMode = this.mode; - this.mode = "text"; - this.expect(optional ? "[" : "{"); - var str = ""; - var nest = 0; - var firstToken = this.nextToken; - var lastToken = firstToken; - while (nest > 0 || this.nextToken.text !== (optional ? "]" : "}")) { - if (this.nextToken.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unexpected end of input in " + modeName, firstToken.range(this.nextToken, str)); - } - lastToken = this.nextToken; - str += lastToken.text; - if (lastToken.text === "{") { - nest += 1; - } else if (lastToken.text === "}") { - if (nest <= 0) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unbalanced brace of input in " + modeName, firstToken.range(this.nextToken, str)); - } else { - nest -= 1; - } - } - this.consume(); - } - this.mode = outerMode; - this.expect(optional ? "]" : "}"); - return firstToken.range(lastToken, str); - } - - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - - }, { - key: "parseRegexGroup", - value: function parseRegexGroup(regex, modeName) { - var outerMode = this.mode; - this.mode = "text"; - var firstToken = this.nextToken; - var lastToken = firstToken; - var str = ""; - while (this.nextToken.text !== "EOF" && regex.test(str + this.nextToken.text)) { - lastToken = this.nextToken; - str += lastToken.text; - this.consume(); - } - if (str === "") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - this.mode = outerMode; - return firstToken.range(lastToken, str); - } - - /** - * Parses a color description. - */ - - }, { - key: "parseColorGroup", - value: function parseColorGroup(optional) { - var res = this.parseStringGroup("color", optional); - if (!res) { - return null; - } - var match = /^(#[a-f0-9]{3}|#[a-f0-9]{6}|[a-z]+)$/i.exec(res.text); - if (!match) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid color: '" + res.text + "'", res); - } - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("color", match[0], this.mode), res); - } - - /** - * Parses a url string. - */ - - }, { - key: "parseUrlGroup", - value: function parseUrlGroup(optional) { - var res = this.parseStringGroupWithBalancedBraces("url", optional); - if (!res) { - return null; - } - var raw = res.text; - // hyperref package allows backslashes alone in href, but doesn't generate - // valid links in such cases; we interpret this as "undefiend" behaviour, - // and keep them as-is. Some browser will replace backslashes with - // forward slashes. - var url = raw.replace(/\\([#$%&~_^{}])/g, '$1'); - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("url", url, this.mode), res); - } - - /** - * Parses a size specification, consisting of magnitude and unit. - */ - - }, { - key: "parseSizeGroup", - value: function parseSizeGroup(optional) { - var res = void 0; - if (!optional && this.nextToken.text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - if (!res) { - return null; - } - var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - if (!match) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid size: '" + res.text + "'", res); - } - var data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!Object(__WEBPACK_IMPORTED_MODULE_6__units__["b" /* validUnit */])(data)) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid unit: '" + data.unit + "'", res); - } - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("size", data, this.mode), res); - } - - /** - * If `optional` is false or absent, this parses an ordinary group, - * which is either a single nucleus (like "x") or an expression - * in braces (like "{x+y}"). - * If `optional` is true, it parses either a bracket-delimited expression - * (like "[x+y]") or returns null to indicate the absence of a - * bracket-enclosed group. - * If `mode` is present, switches to that mode while parsing the group, - * and switches back after. - */ - - }, { - key: "parseGroup", - value: function parseGroup(optional, mode) { - var outerMode = this.mode; - var firstToken = this.nextToken; - // Try to parse an open brace - if (this.nextToken.text === (optional ? "[" : "{")) { - // Switch to specified mode before we expand symbol after brace - if (mode) { - this.switchMode(mode); - } - // If we get a brace, parse an expression - this.consume(); - var expression = this.parseExpression(false, optional ? "]" : "}"); - var lastToken = this.nextToken; - // Switch mode back before consuming symbol after close brace - if (mode) { - this.switchMode(outerMode); - } - // Make sure we get a close brace - this.expect(optional ? "]" : "}"); - if (mode === "text") { - this.formLigatures(expression); - } - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", expression, this.mode, firstToken, lastToken), firstToken.range(lastToken, firstToken.text)); - } else { - // Otherwise, just return a nucleus, or nothing for an optional group - if (mode) { - this.switchMode(mode); - } - var _result3 = optional ? null : this.parseSymbol(); - if (mode) { - this.switchMode(outerMode); - } - return _result3; - } - } - - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - - }, { - key: "formLigatures", - value: function formLigatures(group) { - var n = group.length - 1; - for (var i = 0; i < n; ++i) { - var a = group[i]; - var v = a.value; - if (v === "-" && group[i + 1].value === "-") { - if (i + 1 < n && group[i + 2].value === "-") { - group.splice(i, 3, new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", "---", "text", a, group[i + 2])); - n -= 2; - } else { - group.splice(i, 2, new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", "--", "text", a, group[i + 1])); - n -= 1; - } - } - if ((v === "'" || v === "`") && group[i + 1].value === v) { - group.splice(i, 2, new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", v + v, "text", a, group[i + 1])); - n -= 1; - } - } - } - - /** - * Parse a single symbol out of the string. Here, we handle both the functions - * we have defined, as well as the single character symbols - */ - - }, { - key: "parseSymbol", - value: function parseSymbol() { - var nucleus = this.nextToken; - var text = nucleus.text; - - if (__WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][text]) { - this.consume(); - // If there exists a function with this name, we return the function and - // say that it is a function. - return newFunction(nucleus); - } else if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - var arg = text.slice(5); - var star = arg.charAt(0) === "*"; - if (star) { - arg = arg.slice(1); - } - // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("\\verb assertion failed --\n please report what input caused this bug"); - } - arg = arg.slice(1, -1); // remove first and last char - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("verb", { - body: arg, - star: star - }, "text"), nucleus); - } else if (text === "$") { - return newDollar(nucleus); - } - // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - if (__WEBPACK_IMPORTED_MODULE_9__unicodeSymbols__["a" /* default */].hasOwnProperty(text[0]) && !__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][this.mode][text[0]]) { - text = __WEBPACK_IMPORTED_MODULE_9__unicodeSymbols__["a" /* default */][text[0]] + text.substr(1); - } - // Strip off any combining characters - var match = __WEBPACK_IMPORTED_MODULE_12__Lexer_js__["a" /* combiningDiacriticalMarksEndRegex */].exec(text); - if (match) { - text = text.substring(0, match.index); - if (text === 'i') { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === 'j') { - text = "\u0237"; // dotless j, in math and text mode - } - } - // Recognize base symbol - var symbol = null; - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][this.mode][text]) { - symbol = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */](__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][this.mode][text].group, text, this.mode, nucleus); - } else if (this.mode === "text" && Object(__WEBPACK_IMPORTED_MODULE_7__unicodeScripts__["b" /* supportedCodepoint */])(text.charCodeAt(0))) { - symbol = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", text, this.mode, nucleus); - } else { - return null; // EOF, ^, _, {, }, etc. - } - this.consume(); - // Transform combining characters into accents - if (match) { - for (var i = 0; i < match[0].length; i++) { - var accent = match[0][i]; - if (!__WEBPACK_IMPORTED_MODULE_8__unicodeAccents___default.a[accent]) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unknown accent ' " + accent + "'", nucleus); - } - var command = __WEBPACK_IMPORTED_MODULE_8__unicodeAccents___default.a[accent][this.mode]; - if (!command) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus); - } - symbol = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("accent", { - type: "accent", - label: command, - isStretchy: false, - isShifty: true, - base: symbol - }, this.mode, nucleus); - } - } - return newArgument(symbol, nucleus); - } - }]); - - return Parser; -}(); - -Parser.endOfExpression = ["}", "\\end", "\\right", "&", "\\\\", "\\cr"]; -Parser.SUPSUB_GREEDINESS = 1; -/* harmony default export */ __webpack_exports__["a"] = (Parser); - -/***/ }), -/* 115 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__functions_sqrt__ = __webpack_require__(116); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__functions_color__ = __webpack_require__(117); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__functions_text__ = __webpack_require__(118); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__functions_enclose__ = __webpack_require__(119); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__functions_overline__ = __webpack_require__(120); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__functions_underline__ = __webpack_require__(121); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__functions_rule__ = __webpack_require__(122); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__functions_kern__ = __webpack_require__(123); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__functions_phantom__ = __webpack_require__(124); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__functions_mod__ = __webpack_require__(125); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__functions_op__ = __webpack_require__(126); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__functions_operatorname__ = __webpack_require__(127); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__functions_genfrac__ = __webpack_require__(128); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__functions_lap__ = __webpack_require__(129); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__functions_smash__ = __webpack_require__(130); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__functions_delimsizing__ = __webpack_require__(131); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__functions_sizing__ = __webpack_require__(60); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__functions_styling__ = __webpack_require__(132); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__functions_font__ = __webpack_require__(133); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__functions_accent__ = __webpack_require__(137); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__functions_accentunder__ = __webpack_require__(138); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__functions_verb__ = __webpack_require__(139); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__functions_href__ = __webpack_require__(140); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__functions_mathchoice__ = __webpack_require__(141); - -/** Include this to ensure that all functions are defined. */ - - - - -// WARNING: New functions should be added to src/functions and imported here. - -var functions = __WEBPACK_IMPORTED_MODULE_2__defineFunction__["a" /* _functions */]; -/* harmony default export */ __webpack_exports__["a"] = (functions); - -// Define a convenience function that mimcs the old semantics of defineFunction -// to support existing code so that we can migrate it a little bit at a time. -var defineFunction = function defineFunction(names, props, handler) // null only if handled in parser -{ - Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["b" /* default */])({ names: names, props: props, handler: handler }); -}; - -// TODO(kevinb): have functions return an object and call defineFunction with -// that object in this file instead of relying on side-effects. - - - - - - - - - - - - - - - - - - -// Math class commands except \mathop -defineFunction(["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"], { - numArgs: 1 -}, function (context, args) { - var body = args[0]; - return { - type: "mclass", - mclass: "m" + context.funcName.substr(5), - value: Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["c" /* ordargument */])(body) - }; -}); - -// Build a relation by placing one symbol on top of another -defineFunction(["\\stackrel"], { - numArgs: 2 -}, function (context, args) { - var top = args[0]; - var bottom = args[1]; - - var bottomop = new __WEBPACK_IMPORTED_MODULE_1__ParseNode__["a" /* default */]("op", { - type: "op", - limits: true, - alwaysHandleSupSub: true, - symbol: false, - value: Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["c" /* ordargument */])(bottom) - }, bottom.mode); - - var supsub = new __WEBPACK_IMPORTED_MODULE_1__ParseNode__["a" /* default */]("supsub", { - base: bottomop, - sup: top, - sub: null - }, top.mode); - - return { - type: "mclass", - mclass: "mrel", - value: [supsub] - }; -}); - - - -var singleCharIntegrals = { - "\u222B": "\\int", - "\u222C": "\\iint", - "\u222D": "\\iiint", - "\u222E": "\\oint" -}; - -// There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -// No limits, not symbols -defineFunction(["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"], { - numArgs: 0 -}, function (context) { - return { - type: "op", - limits: false, - symbol: false, - body: context.funcName - }; -}); - -// Limits, not symbols -defineFunction(["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], { - numArgs: 0 -}, function (context) { - return { - type: "op", - limits: true, - symbol: false, - body: context.funcName - }; -}); - -// No limits, symbols -defineFunction(["\\int", "\\iint", "\\iiint", "\\oint", "\u222B", "\u222C", "\u222D", "\u222E"], { - numArgs: 0 -}, function (context) { - var fName = context.funcName; - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - return { - type: "op", - limits: false, - symbol: true, - body: fName - }; -}); - - - - - - - - - - - - - - - - - - - - - -// Horizontal stretchy braces -defineFunction(["\\overbrace", "\\underbrace"], { - numArgs: 1 -}, function (context, args) { - var base = args[0]; - return { - type: "horizBrace", - label: context.funcName, - isOver: /^\\over/.test(context.funcName), - base: base - }; -}); - -// Stretchy accents under the body - - -// Stretchy arrows with an optional argument -defineFunction(["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", -// The next 3 functions are here to support the mhchem extension. -// Direct use of these functions is discouraged and may break someday. -"\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"], { - numArgs: 1, - numOptionalArgs: 1 -}, function (context, args, optArgs) { - var below = optArgs[0]; - var body = args[0]; - return { - type: "xArrow", // x for extensible - label: context.funcName, - body: body, - below: below - }; -}); - -// Infix generalized fractions -defineFunction(["\\over", "\\choose", "\\atop"], { - numArgs: 0, - infix: true -}, function (context) { - var replaceWith = void 0; - switch (context.funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - case "\\choose": - replaceWith = "\\binom"; - break; - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - default: - throw new Error("Unrecognized infix genfrac command"); - } - return { - type: "infix", - replaceWith: replaceWith, - token: context.token - }; -}); - -// Row breaks for aligned data -defineFunction(["\\\\", "\\cr"], { - numArgs: 0, - numOptionalArgs: 1, - argTypes: ["size"] -}, function (context, args, optArgs) { - var size = optArgs[0]; - return { - type: "cr", - size: size - }; -}); - -// Environment delimiters -defineFunction(["\\begin", "\\end"], { - numArgs: 1, - argTypes: ["text"] -}, function (context, args) { - var nameGroup = args[0]; - if (nameGroup.type !== "ordgroup") { - throw new __WEBPACK_IMPORTED_MODULE_0__ParseError__["a" /* default */]("Invalid environment name", nameGroup); - } - var name = ""; - for (var i = 0; i < nameGroup.value.length; ++i) { - name += nameGroup.value[i].value; - } - return { - type: "environment", - name: name, - nameGroup: nameGroup - }; -}); - -// Box manipulation -defineFunction(["\\raisebox"], { - numArgs: 2, - argTypes: ["size", "text"], - allowedInText: true -}, function (context, args) { - var amount = args[0]; - var body = args[1]; - return { - type: "raisebox", - dy: amount, - body: body, - value: Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["c" /* ordargument */])(body) - }; -}); - - - -// Hyperlinks - - -// MathChoice - - -/***/ }), -/* 116 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__delimiter__ = __webpack_require__(44); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__buildMathML__ = __webpack_require__(2); - - - - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler: function handler(context, args, optArgs) { - var index = optArgs[0]; - var body = args[0]; - return { - type: "sqrt", - body: body, - index: index - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Square roots are handled in the TeXbook pg. 443, Rule 11. - - // First, we do the same steps as in overline to build the inner group - // and line - var inner = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](group.value.body, options.havingCrampedStyle()); - if (inner.height === 0) { - // Render a small surd. - inner.height = options.fontMetrics().xHeight; - } - - // Some groups can return document fragments. Handle those by wrapping - // them in a span. - if (inner instanceof __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].documentFragment) { - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [inner], options); - } - - // Calculate the minimum size for the \surd delimiter - var metrics = options.fontMetrics(); - var theta = metrics.defaultRuleThickness; - - var phi = theta; - if (options.style.id < __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].TEXT.id) { - phi = options.fontMetrics().xHeight; - } - - // Calculate the clearance between the body and line - var lineClearance = theta + phi / 4; - - var minDelimiterHeight = (inner.height + inner.depth + lineClearance + theta) * options.sizeMultiplier; - - // Create a sqrt SVG of the required minimum size - - var _delimiter$sqrtImage = __WEBPACK_IMPORTED_MODULE_4__delimiter__["a" /* default */].sqrtImage(minDelimiterHeight, options), - img = _delimiter$sqrtImage.span, - ruleWidth = _delimiter$sqrtImage.ruleWidth; - - var delimDepth = img.height - ruleWidth; - - // Adjust the clearance based on the delimiter size - if (delimDepth > inner.height + inner.depth + lineClearance) { - lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2; - } - - // Shift the sqrt image - var imgShift = img.height - inner.height - lineClearance - ruleWidth; - - inner.style.paddingLeft = img.advanceWidth + "em"; - - // Overlay the image and the argument. - var body = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: inner, wrapperClasses: ["svg-align"] }, { type: "kern", size: -(inner.height + imgShift) }, { type: "elem", elem: img }, { type: "kern", size: ruleWidth }] - }, options); - - if (!group.value.index) { - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "sqrt"], [body], options); - } else { - // Handle the optional root index - - // The index is always in scriptscript style - var newOptions = options.havingStyle(__WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].SCRIPTSCRIPT); - var rootm = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](group.value.index, newOptions, options); - - // The amount the index is shifted by. This is taken from the TeX - // source, in the definition of `\r@@t`. - var toShift = 0.6 * (body.height - body.depth); - - // Build a VList with the superscript shifted up correctly - var rootVList = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: -toShift, - children: [{ type: "elem", elem: rootm }] - }, options); - // Add a class surrounding it so we can add on the appropriate - // kerning - var rootVListWrap = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["root"], [rootVList]); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "sqrt"], [rootVListWrap, body], options); - } - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = void 0; - if (group.value.index) { - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mroot", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["b" /* buildGroup */](group.value.body, options), __WEBPACK_IMPORTED_MODULE_7__buildMathML__["b" /* buildGroup */](group.value.index, options)]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("msqrt", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - } - - return node; - } -}); - -/***/ }), -/* 117 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - var elements = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](group.value.value, options.withColor(group.value.color), false); - - // \color isn't supposed to affect the type of the elements it contains. - // To accomplish this, we wrap the results in a fragment, so the inner - // elements will be able to directly interact with their neighbors. For - // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3` - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(elements); -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](group.value.value, options); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mstyle", inner); - - node.setAttribute("mathcolor", group.value.color); - - return node; -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "original"] - }, - handler: function handler(context, args) { - var color = args[0]; - var body = args[1]; - return { - type: "color", - color: color.value, - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// TODO(kevinb): define these using macros -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "color", - names: ["\\blue", "\\orange", "\\pink", "\\red", "\\green", "\\gray", "\\purple", "\\blueA", "\\blueB", "\\blueC", "\\blueD", "\\blueE", "\\tealA", "\\tealB", "\\tealC", "\\tealD", "\\tealE", "\\greenA", "\\greenB", "\\greenC", "\\greenD", "\\greenE", "\\goldA", "\\goldB", "\\goldC", "\\goldD", "\\goldE", "\\redA", "\\redB", "\\redC", "\\redD", "\\redE", "\\maroonA", "\\maroonB", "\\maroonC", "\\maroonD", "\\maroonE", "\\purpleA", "\\purpleB", "\\purpleC", "\\purpleD", "\\purpleE", "\\mintA", "\\mintB", "\\mintC", "\\grayA", "\\grayB", "\\grayC", "\\grayD", "\\grayE", "\\grayF", "\\grayG", "\\grayH", "\\grayI", "\\kaBlue", "\\kaGreen"], - props: { - numArgs: 1, - allowedInText: true, - greediness: 3 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "color", - color: "katex-" + context.funcName.slice(1), - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - allowedInText: true, - greediness: 3, - argTypes: ["color"] - }, - handler: function handler(context, args) { - var parser = context.parser, - breakOnTokenText = context.breakOnTokenText; - - - var color = args[0]; - if (!color) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("\\color not followed by color"); - } - - // If we see a styling function, parse out the implicit body - var body = parser.parseExpression(true, breakOnTokenText); - - return { - type: "color", - color: color.value, - value: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 118 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -// Non-mathy text, possibly in a font -var textFontFamilies = { - "\\text": undefined, "\\textrm": "textrm", "\\textsf": "textsf", - "\\texttt": "texttt", "\\textnormal": "textrm" -}; - -var textFontWeights = { - "\\textbf": "textbf" -}; - -var textFontShapes = { - "\\textit": "textit" -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "text", - names: [ - // Font families - "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", - // Font weights - "\\textbf", - // Font Shapes - "\\textit"], - props: { - numArgs: 1, - argTypes: ["text"], - greediness: 2, - allowedInText: true - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "text", - body: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body), - font: context.funcName - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var font = group.value.font; - // Checks if the argument is a font family or a font style. - var newOptions = void 0; - if (textFontFamilies[font]) { - newOptions = options.withFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - newOptions = options.withFontWeight(textFontWeights[font]); - } else { - newOptions = options.withFontShape(textFontShapes[font]); - } - var inner = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["a" /* buildExpression */](group.value.body, newOptions, true); - __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].tryCombineChars(inner); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "text"], inner, newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = group.value.body; - - // Convert each element of the body into MathML, and combine consecutive - // <mtext> outputs into a single <mtext> tag. In this way, we don't - // nest non-text items (e.g., $nested-math$) within an <mtext>. - var inner = []; - var currentText = null; - for (var i = 0; i < body.length; i++) { - var _group = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](body[i], options); - if (_group.type === 'mtext' && currentText != null) { - Array.prototype.push.apply(currentText.children, _group.children); - } else { - inner.push(_group); - if (_group.type === 'mtext') { - currentText = _group; - } - } - } - - // If there is a single tag in the end (presumably <mtext>), - // just return it. Otherwise, wrap them in an <mrow>. - if (inner.length === 1) { - return inner[0]; - } else { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", inner); - } - } -}); - -/***/ }), -/* 119 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox - var inner = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](group.value.body, options); - - var label = group.value.label.substr(1); - var scale = options.sizeMultiplier; - var img = void 0; - var imgShift = 0; - var isColorbox = /color/.test(label); - - if (label === "sout") { - img = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["stretchy", "sout"]); - img.height = options.fontMetrics().defaultRuleThickness / scale; - imgShift = -0.5 * options.fontMetrics().xHeight; - } else { - // Add horizontal padding - inner.classes.push(/cancel/.test(label) ? "cancel-pad" : "boxpad"); - - // Add vertical padding - var vertPad = 0; - // ref: LaTeX source2e: \fboxsep = 3pt; \fboxrule = .4pt - // ref: cancel package: \advance\totalheight2\p@ % "+2" - if (/box/.test(label)) { - vertPad = label === "colorbox" ? 0.3 : 0.34; - } else { - vertPad = __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].isCharacterBox(group.value.body) ? 0.2 : 0; - } - - img = __WEBPACK_IMPORTED_MODULE_4__stretchy__["a" /* default */].encloseSpan(inner, label, vertPad, options); - imgShift = inner.depth + vertPad; - - if (isColorbox) { - img.style.backgroundColor = group.value.backgroundColor.value; - if (label === "fcolorbox") { - img.style.borderColor = group.value.borderColor.value; - } - } + if (this.nextToken.text !== text) { + throw new src_ParseError("Expected '" + text + "', got '" + this.nextToken.text + "'", this.nextToken); } - var vlist = void 0; - if (isColorbox) { - vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [ - // Put the color background behind inner; - { type: "elem", elem: img, shift: imgShift }, { type: "elem", elem: inner, shift: 0 }] - }, options); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [ - // Write the \cancel stroke on top of inner. - { - type: "elem", - elem: inner, - shift: 0 - }, { - type: "elem", - elem: img, - shift: imgShift, - wrapperClasses: /cancel/.test(label) ? ["svg-align"] : [] - }] - }, options); + if (consume) { + this.consume(); } - - if (/cancel/.test(label)) { - // cancel does not create horiz space for its line extension. - // That is, not when adjacent to a mord. - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "cancel-lap"], [vlist], options); - } else { - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord"], [vlist], options); - } -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("menclose", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - switch (group.value.label) { - case "\\cancel": - node.setAttribute("notation", "updiagonalstrike"); - break; - case "\\bcancel": - node.setAttribute("notation", "downdiagonalstrike"); - break; - case "\\sout": - node.setAttribute("notation", "horizontalstrike"); - break; - case "\\fbox": - node.setAttribute("notation", "box"); - break; - case "\\colorbox": - node.setAttribute("mathbackground", group.value.backgroundColor.value); - break; - case "\\fcolorbox": - node.setAttribute("mathbackground", group.value.backgroundColor.value); - // TODO(ron): I don't know any way to set the border color. - node.setAttribute("notation", "box"); - break; - default: - // xcancel - node.setAttribute("notation", "updiagonalstrike downdiagonalstrike"); - } - return node; -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "text"] - }, - handler: function handler(context, args, optArgs) { - var color = args[0]; - var body = args[1]; - return { - type: "enclose", - label: context.funcName, - backgroundColor: color, - body: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - allowedInText: true, - greediness: 3, - argTypes: ["color", "color", "text"] - }, - handler: function handler(context, args, optArgs) { - var borderColor = args[0]; - var backgroundColor = args[1]; - var body = args[2]; - return { - type: "enclose", - label: context.funcName, - backgroundColor: backgroundColor, - borderColor: borderColor, - body: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "enclose", - names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\fbox"], - props: { - numArgs: 1 - }, - handler: function handler(context, args, optArgs) { - var body = args[0]; - return { - type: "enclose", - label: context.funcName, - body: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 120 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "overline", - names: ["\\overline"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "overline", - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Overlines are handled in the TeXbook pg 443, Rule 9. - - // Build the inner group in the cramped style. - var innerGroup = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.havingCrampedStyle()); - - // Create the line above the body - var line = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeLineSpan("overline-line", options); - - // Generate the vlist, with the appropriate kerns - var vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: innerGroup }, - // The kern on the next line would ordinarily be 3 * line.height - // But we put the line into a span that is 5 lines tall, to - // overcome a Chrome rendering issue. The SVG has a space in - // the bottom that is 2 lines high. That and the 1-line-high - // kern sum up to the same distance as the old 3 line kern. - { type: "kern", size: line.height }, { type: "elem", elem: line }] - }, options); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "overline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options), operator]); - node.setAttribute("accent", "true"); - - return node; - } -}); - -/***/ }), -/* 121 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "underline", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "underline", - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Underlines are handled in the TeXbook pg 443, Rule 10. - // Build the inner group. - var innerGroup = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options); - - // Create the line to go below the body - var line = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeLineSpan("underline-line", options); - - // Generate the vlist, with the appropriate kerns - var vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "top", - positionData: innerGroup.height, - children: [ - // The SVG image is 5x as tall as the line. - // The bottom 2/5 of the image is blank and acts like a kern. - // So we omit the kern that would otherwise go at the bottom. - { type: "elem", elem: line }, { type: "kern", size: 5 * line.height }, { type: "elem", elem: innerGroup }] - }, options); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "underline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munder", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options), operator]); - node.setAttribute("accentunder", "true"); - - return node; - } -}); - -/***/ }), -/* 122 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__units__ = __webpack_require__(19); - - - - - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler: function handler(context, args, optArgs) { - var shift = optArgs[0]; - var width = args[0]; - var height = args[1]; - return { - type: "rule", - shift: shift && shift.value, - width: width.value, - height: height.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Make an empty span for the rule - var rule = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["mord", "rule"], [], options); - - // Calculate the shift, width, and height of the rule, and account for units - var shift = 0; - if (group.value.shift) { - shift = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.shift, options); - } - - var width = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.width, options); - var height = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.height, options); - - // Style the rule to the right size - rule.style.borderRightWidth = width + "em"; - rule.style.borderTopWidth = height + "em"; - rule.style.bottom = shift + "em"; - - // Record the height and width - rule.width = width; - rule.height = height + shift; - rule.depth = -shift; - // Font size is the number large enough that the browser will - // reserve at least `absHeight` space above the baseline. - // The 1.125 factor was empirically determined - rule.maxFontSize = height * 1.125 * options.sizeMultiplier; - - return rule; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // TODO(emily): Figure out if there's an actual way to draw black boxes - // in MathML. - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow"); - - return node; - } -}); - -/***/ }), -/* 123 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ParseError__ = __webpack_require__(6); - -/* eslint no-console:0 */ -// Horizontal spacing commands - - - - - - - -// TODO: \hskip and \mskip should support plus and minus in lengths - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - allowedInText: true - }, - handler: function handler(context, args) { - var mathFunction = context.funcName[1] === 'm'; // \mkern, \mskip - var muUnit = args[0].value.unit === 'mu'; - if (mathFunction) { - if (!muUnit) { - typeof console !== "undefined" && console.warn("In LaTeX, " + context.funcName + " supports only mu units, " + ("not " + args[0].value.unit + " units")); - } - if (context.parser.mode !== "math") { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]("Can't use function '" + context.funcName + "' in text mode"); - } - } else { - // !mathFunction - if (muUnit) { - typeof console !== "undefined" && console.warn("In LaTeX, " + context.funcName + " does not support mu units"); - } - } - return { - type: "kern", - dimension: args[0].value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeGlue(group.value.dimension, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mspace"); - - var dimension = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.dimension, options); - node.setAttribute("width", dimension + "em"); - - return node; - } -}); - -/***/ }), -/* 124 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "phantom", - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["a" /* buildExpression */](group.value.value, options.withPhantom(), false); - - // \phantom isn't supposed to affect the elements it contains. - // See "color" for more details. - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, options); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mphantom", inner); - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "hphantom", - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.withPhantom())]); - node.height = 0; - node.depth = 0; - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - node.children[i].depth = 0; - } - } - - // See smash for comment re: use of makeVList - node = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: node }] - }, options); - - return node; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, options); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mphantom", inner); - node.setAttribute("height", "0px"); - return node; - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "vphantom", - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["inner"], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.withPhantom())]); - var fix = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["fix"], []); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "rlap"], [inner, fix], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, options); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mphantom", inner); - node.setAttribute("width", "0px"); - return node; - } -}); - -/***/ }), -/* 125 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - -// \mod-type functions - - - - - - - - -var htmlModBuilder = function htmlModBuilder(group, options) { - var inner = []; - - if (group.value.modType === "bmod") { - // “\nonscript\mskip-\medmuskip\mkern5mu”, where \medmuskip is - // 4mu plus 2mu minus 1mu, translates to 1mu space in - // display/textstyle and 5mu space in script/scriptscriptstyle. - if (!options.style.isTight()) { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "muspace"], [], options)); - } else { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "thickspace"], [], options)); - } - } else if (options.style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY.size) { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "quad"], [], options)); - } else if (group.value.modType === "mod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "twelvemuspace"], [], options)); - } else { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "eightmuspace"], [], options)); - } - - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("(", group.mode)); - } - - if (group.value.modType !== "pod") { - var modInner = [__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("m", group.mode), __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("o", group.mode), __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("d", group.mode)]; - if (group.value.modType === "bmod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mbin"], modInner, options)); - // “\mkern5mu\nonscript\mskip-\medmuskip” as above - if (!options.style.isTight()) { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "muspace"], [], options)); - } else { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "thickspace"], [], options)); - } - } else { - Array.prototype.push.apply(inner, modInner); - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "sixmuspace"], [], options)); - } - } - - if (group.value.value) { - Array.prototype.push.apply(inner, __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](group.value.value, options, false)); - } - - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym(")", group.mode)); - } - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(inner); -}; - -var mmlModBuilder = function mmlModBuilder(group, options) { - var inner = []; - - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["e" /* makeText */]("(", group.mode)])); - } - if (group.value.modType !== "pod") { - inner.push(new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["e" /* makeText */]("mod", group.mode)])); - } - if (group.value.value) { - var space = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mspace"); - space.setAttribute("width", "0.333333em"); - inner.push(space); - inner = inner.concat(__WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](group.value.value, options)); - } - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["e" /* makeText */](")", group.mode)])); - } - - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", inner); -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "mod", - names: ["\\bmod"], - props: { - numArgs: 0 - }, - handler: function handler(context, args) { - return { - type: "mod", - modType: "bmod", - value: null - }; - }, - htmlBuilder: htmlModBuilder, - mathmlBuilder: mmlModBuilder -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same htmlBuilder and mathmlBuilder are being used. -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "mod", - names: ["\\pod", "\\pmod", "\\mod"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "mod", - modType: context.funcName.substr(1), - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: htmlModBuilder, - mathmlBuilder: mmlModBuilder -}); - -/***/ }), -/* 126 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__buildMathML__ = __webpack_require__(2); - -// Limits, symbols - - - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - // Operators are handled in the TeXbook pg. 443-444, rule 13(a). - var supGroup = void 0; - var subGroup = void 0; - var hasLimits = false; - if (group.type === "supsub") { - // If we have limits, supsub will pass us its group to handle. Pull - // out the superscript and subscript and set the group to the op in - // its base. - supGroup = group.value.sup; - subGroup = group.value.sub; - group = group.value.base; - hasLimits = true; - } - - var style = options.style; - - // Most operators have a large successor symbol, but these don't. - var noSuccessor = ["\\smallint"]; - - var large = false; - if (style.size === __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].DISPLAY.size && group.value.symbol && !__WEBPACK_IMPORTED_MODULE_4__utils__["a" /* default */].contains(noSuccessor, group.value.body)) { - - // Most symbol operators get larger in displaystyle (rule 13) - large = true; - } - - var base = void 0; - if (group.value.symbol) { - // If this is a symbol, create the symbol. - var fontName = large ? "Size2-Regular" : "Size1-Regular"; - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSymbol(group.value.body, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]); - } else if (group.value.value) { - // If this is a list, compose that list. - var inner = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["a" /* buildExpression */](group.value.value, options, true); - if (inner.length === 1 && inner[0] instanceof __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode) { - base = inner[0]; - base.classes[0] = "mop"; // replace old mclass - } else { - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mop"], inner, options); - } - } else { - // Otherwise, this is a text operator. Build the text from the - // operator's name. - // TODO(emily): Add a space in the middle of some of these - // operators, like \limsup - var output = []; - for (var i = 1; i < group.value.body.length; i++) { - output.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym(group.value.body[i], group.mode)); - } - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mop"], output, options); - } - - // If content of op is a single symbol, shift it vertically. - var baseShift = 0; - var slant = 0; - if (base instanceof __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode) { - // Shift the symbol so its center lies on the axis (rule 13). It - // appears that our fonts have the centers of the symbols already - // almost on the axis, so these numbers are very small. Note we - // don't actually apply this here, but instead it is used either in - // the vlist creation or separately when there are no limits. - baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; - - // The slant of the symbol is just its italic correction. - slant = base.italic; - } - - if (hasLimits) { - // IE 8 clips \int if it is in a display: inline-block. We wrap it - // in a new span so it is an inline, and works. - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [base]); - - var sub = void 0; - var sup = void 0; - // We manually have to handle the superscripts and subscripts. This, - // aside from the kern calculations, is copied from supsub. - if (supGroup) { - var elem = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](supGroup, options.havingStyle(style.sup()), options); - - sup = { - elem: elem, - kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) - }; - } - - if (subGroup) { - var _elem = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](subGroup, options.havingStyle(style.sub()), options); - - sub = { - elem: _elem, - kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) - }; - } - - // Build the final group as a vlist of the possible subscript, base, - // and possible superscript. - var finalGroup = void 0; - if (sup && sub) { - var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; - - finalGroup = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: bottom, - children: [{ type: "kern", size: options.fontMetrics().bigOpSpacing5 }, { type: "elem", elem: sub.elem, marginLeft: -slant + "em" }, { type: "kern", size: sub.kern }, { type: "elem", elem: base }, { type: "kern", size: sup.kern }, { type: "elem", elem: sup.elem, marginLeft: slant + "em" }, { type: "kern", size: options.fontMetrics().bigOpSpacing5 }] - }, options); - } else if (sub) { - var top = base.height - baseShift; - - // Shift the limits by the slant of the symbol. Note - // that we are supposed to shift the limits by 1/2 of the slant, - // but since we are centering the limits adding a full slant of - // margin will shift by 1/2 that. - finalGroup = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "top", - positionData: top, - children: [{ type: "kern", size: options.fontMetrics().bigOpSpacing5 }, { type: "elem", elem: sub.elem, marginLeft: -slant + "em" }, { type: "kern", size: sub.kern }, { type: "elem", elem: base }] - }, options); - } else if (sup) { - var _bottom = base.depth + baseShift; - - finalGroup = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: _bottom, - children: [{ type: "elem", elem: base }, { type: "kern", size: sup.kern }, { type: "elem", elem: sup.elem, marginLeft: slant + "em" }, { type: "kern", size: options.fontMetrics().bigOpSpacing5 }] - }, options); - } else { - // This case probably shouldn't occur (this would mean the - // supsub was sending us a group with no superscript or - // subscript) but be safe. - return base; - } - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mop", "op-limits"], [finalGroup], options); - } else { - if (baseShift) { - base.style.position = "relative"; - base.style.top = baseShift + "em"; - } - - return base; - } -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var node = void 0; - - // TODO(emily): handle big operators using the `largeop` attribute - - if (group.value.symbol) { - // This is a symbol. Just add the symbol. - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.body, group.mode)]); - } else if (group.value.value) { - // This is an operator with children. Add them. - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", __WEBPACK_IMPORTED_MODULE_7__buildMathML__["a" /* buildExpression */](group.value.value, options)); - } else { - // This is a text operator. Add all of the characters from the - // operator's name. - // TODO(emily): Add a space in the middle of some of these - // operators, like \limsup. - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mi", [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(group.value.body.slice(1))]); - - // Append an <mo>⁡</mo>. - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - var operator = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */]("\u2061", "text")]); - - return new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].documentFragment([node, operator]); - } - - return node; -}; - -var singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22C0": "\\bigwedge", - "\u22C1": "\\bigvee", - "\u22C2": "\\bigcap", - "\u22C3": "\\bigcap", - "\u2A00": "\\bigodot", - "\u2A01": "\\bigoplus", - "\u2A02": "\\bigotimes", - "\u2A04": "\\biguplus", - "\u2A06": "\\bigsqcup" -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "op", - names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"], - props: { - numArgs: 0 - }, - handler: function handler(context, args) { - var fName = context.funcName; - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - return { - type: "op", - limits: true, - symbol: true, - body: fName - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same htmlBuilder and mathmlBuilder are being used. -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "op", - limits: false, - symbol: false, - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 127 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -// \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "operatorname", - names: ["\\operatorname"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "operatorname", - value: Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["c" /* ordargument */])(body) - }; - }, - - htmlBuilder: function htmlBuilder(group, options) { - var output = []; - if (group.value.value.length > 0) { - var letter = ""; - var mode = ""; - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(group.value.value), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var child = _step.value; - - // In the amsopn package, \newmcodes@ changes four - // characters, *-/:’, from math operators back into text. - if ("*-/:".indexOf(child.value) !== -1) { - child.type = "textord"; - } - } - - // Consolidate Greek letter function names into symbol characters. - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - var temp = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["a" /* buildExpression */](group.value.value, options.withFontFamily("mathrm"), true); - - // All we want from temp are the letters. With them, we'll - // create a text operator similar to \tan or \cos. - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(temp), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var _child = _step2.value; - - if (_child instanceof __WEBPACK_IMPORTED_MODULE_4__domTree__["a" /* default */].symbolNode) { - letter = _child.value; - - // In the amsopn package, \newmcodes@ changes four - // characters, *-/:’, from math operators back into text. - // Given what is in temp, we have to address two of them. - letter = letter.replace(/\u2212/, "-"); // minus => hyphen - letter = letter.replace(/\u2217/, "*"); - - // Use math mode for Greek letters - mode = /[\u0391-\u03D7]/.test(letter) ? "math" : "text"; - output.push(__WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].mathsym(letter, mode)); - } else { - output.push(_child); - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - } - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["mop"], output, options); - }, - - mathmlBuilder: function mathmlBuilder(group, options) { - // The steps taken here are similar to the html version. - var output = []; - if (group.value.value.length > 0) { - var temp = __WEBPACK_IMPORTED_MODULE_6__buildMathML__["a" /* buildExpression */](group.value.value, options.withFontFamily("mathrm")); - - var word = temp.map(function (node) { - return node.toText(); - }).join(""); - - word = word.replace(/\u2212/g, "-"); - word = word.replace(/\u2217/g, "*"); - output = [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(word)]; - } - var identifier = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mi", output); - identifier.setAttribute("mathvariant", "normal"); - - // \u2061 is the same as ⁡ - // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp - var operator = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["e" /* makeText */]("\u2061", "text")]); - - return new __WEBPACK_IMPORTED_MODULE_4__domTree__["a" /* default */].documentFragment([identifier, operator]); - } -}); - -/***/ }), -/* 128 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__delimiter__ = __webpack_require__(44); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "genfrac", - names: ["\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac"], - props: { - numArgs: 2, - greediness: 2 - }, - handler: function handler(context, args) { - var numer = args[0]; - var denom = args[1]; - var hasBarLine = void 0; - var leftDelim = null; - var rightDelim = null; - var size = "auto"; - - switch (context.funcName) { - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - case "\\\\atopfrac": - hasBarLine = false; - break; - case "\\dbinom": - case "\\binom": - case "\\tbinom": - hasBarLine = false; - leftDelim = "("; - rightDelim = ")"; - break; - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (context.funcName) { - case "\\dfrac": - case "\\dbinom": - size = "display"; - break; - case "\\tfrac": - case "\\tbinom": - size = "text"; - break; - } - - return { - type: "genfrac", - numer: numer, - denom: denom, - hasBarLine: hasBarLine, - leftDelim: leftDelim, - rightDelim: rightDelim, - size: size - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e). - // Figure out what style this fraction should be in based on the - // function used - var style = options.style; - if (group.value.size === "display") { - style = __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY; - } else if (group.value.size === "text") { - style = __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].TEXT; - } - - var nstyle = style.fracNum(); - var dstyle = style.fracDen(); - var newOptions = void 0; - - newOptions = options.havingStyle(nstyle); - var numerm = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](group.value.numer, newOptions, options); - - newOptions = options.havingStyle(dstyle); - var denomm = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](group.value.denom, newOptions, options); - - var rule = void 0; - var ruleWidth = void 0; - var ruleSpacing = void 0; - if (group.value.hasBarLine) { - rule = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeLineSpan("frac-line", options); - ruleWidth = rule.height; - ruleSpacing = rule.height; - } else { - rule = null; - ruleWidth = 0; - ruleSpacing = options.fontMetrics().defaultRuleThickness; - } - - // Rule 15b - var numShift = void 0; - var clearance = void 0; - var denomShift = void 0; - if (style.size === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY.size) { - numShift = options.fontMetrics().num1; - if (ruleWidth > 0) { - clearance = 3 * ruleSpacing; - } else { - clearance = 7 * ruleSpacing; - } - denomShift = options.fontMetrics().denom1; - } else { - if (ruleWidth > 0) { - numShift = options.fontMetrics().num2; - clearance = ruleSpacing; - } else { - numShift = options.fontMetrics().num3; - clearance = 3 * ruleSpacing; - } - denomShift = options.fontMetrics().denom2; - } - - var frac = void 0; - if (!rule) { - // Rule 15c - var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift); - if (candidateClearance < clearance) { - numShift += 0.5 * (clearance - candidateClearance); - denomShift += 0.5 * (clearance - candidateClearance); - } - - frac = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: denomm, shift: denomShift }, { type: "elem", elem: numerm, shift: -numShift }] - }, options); - } else { - // Rule 15d - var axisHeight = options.fontMetrics().axisHeight; - - if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) { - numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth)); - } - - if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) { - denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift)); - } - - var midShift = -(axisHeight - 0.5 * ruleWidth); - - frac = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: denomm, shift: denomShift }, - // The next line would ordinarily contain "shift: midShift". - // But we put the rule into a a span that is 5 rules tall, - // to overcome a Chrome rendering issue. Put another way, - // we've replaced a kern of width = 2 * ruleWidth with a - // bottom padding inside the SVG = 2 * ruleWidth. - { type: "elem", elem: rule, shift: midShift + 2 * ruleWidth }, { type: "elem", elem: numerm, shift: -numShift }] - }, options); - } - - // Since we manually change the style sometimes (with \dfrac or \tfrac), - // account for the possible size change here. - newOptions = options.havingStyle(style); - frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier; - frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; - - // Rule 15e - var delimSize = void 0; - if (style.size === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY.size) { - delimSize = options.fontMetrics().delim1; - } else { - delimSize = options.fontMetrics().delim2; - } - - var leftDelim = void 0; - var rightDelim = void 0; - if (group.value.leftDelim == null) { - leftDelim = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["e" /* makeNullDelimiter */](options, ["mopen"]); - } else { - leftDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].customSizedDelim(group.value.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]); - } - if (group.value.rightDelim == null) { - rightDelim = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["e" /* makeNullDelimiter */](options, ["mclose"]); - } else { - rightDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].customSizedDelim(group.value.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]); - } - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mfrac"], [frac]), rightDelim], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mfrac", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.numer, options), __WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.denom, options)]); - - if (!group.value.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } - - if (group.value.leftDelim != null || group.value.rightDelim != null) { - var withDelims = []; - - if (group.value.leftDelim != null) { - var leftOp = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(group.value.leftDelim)]); - - leftOp.setAttribute("fence", "true"); - - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.value.rightDelim != null) { - var rightOp = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(group.value.rightDelim)]); - - rightOp.setAttribute("fence", "true"); - - withDelims.push(rightOp); - } - - var outerNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mrow", withDelims); - - return outerNode; - } - - return node; - } -}); - -/***/ }), -/* 129 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - -// Horizontal overlap functions - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "lap", - alignment: context.funcName.slice(5), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var inner = void 0; - if (group.value.alignment === "clap") { - // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/ - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options)]); - // wrap, since CSS will center a .clap > .inner > span - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["inner"], [inner], options); - } else { - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["inner"], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options)]); - } - var fix = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["fix"], []); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", group.value.alignment], [inner, fix], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mpadded", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - - if (group.value.alignment !== "rlap") { - var offset = group.value.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - } - node.setAttribute("width", "0px"); - - return node; - } -}); - -/***/ }), -/* 130 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - -// smash, with optional [tb], as in AMS - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: function handler(context, args, optArgs) { - var smashHeight = false; - var smashDepth = false; - var tbArg = optArgs[0]; - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - var letter = ""; - for (var i = 0; i < tbArg.value.length; ++i) { - letter = tbArg.value[i].value; - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - var body = args[0]; - return { - type: "smash", - body: body, - smashHeight: smashHeight, - smashDepth: smashDepth - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord"], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options)]); - - if (!group.value.smashHeight && !group.value.smashDepth) { - return node; - } - - if (group.value.smashHeight) { - node.height = 0; - // In order to influence makeVList, we have to reset the children. - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - } - } - } - - if (group.value.smashDepth) { - node.depth = 0; - if (node.children) { - for (var _i = 0; _i < node.children.length; _i++) { - node.children[_i].depth = 0; - } - } - } - - // At this point, we've reset the TeX-like height and depth values. - // But the span still has an HTML line height. - // makeVList applies "display: table-cell", which prevents the browser - // from acting on that line height. So we'll call makeVList now. - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: node }] - }, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mpadded", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - - if (group.value.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.value.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); - -/***/ }), -/* 131 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__delimiter__ = __webpack_require__(44); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__buildMathML__ = __webpack_require__(2); - - - - - - - - - - -// Extra data needed for the delimiter handler down below -var delimiterSizes = { - "\\bigl": { mclass: "mopen", size: 1 }, - "\\Bigl": { mclass: "mopen", size: 2 }, - "\\biggl": { mclass: "mopen", size: 3 }, - "\\Biggl": { mclass: "mopen", size: 4 }, - "\\bigr": { mclass: "mclose", size: 1 }, - "\\Bigr": { mclass: "mclose", size: 2 }, - "\\biggr": { mclass: "mclose", size: 3 }, - "\\Biggr": { mclass: "mclose", size: 4 }, - "\\bigm": { mclass: "mrel", size: 1 }, - "\\Bigm": { mclass: "mrel", size: 2 }, - "\\biggm": { mclass: "mrel", size: 3 }, - "\\Biggm": { mclass: "mrel", size: 4 }, - "\\big": { mclass: "mord", size: 1 }, - "\\Big": { mclass: "mord", size: 2 }, - "\\bigg": { mclass: "mord", size: 3 }, - "\\Bigg": { mclass: "mord", size: 4 } -}; - -var delimiters = ["(", ")", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\\lceil", "\\rceil", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."]; - -// Delimiter functions -function checkDelimiter(delim, context) { - if (__WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].contains(delimiters, delim.value)) { - return delim; - } else { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]("Invalid delimiter: '" + delim.value + "' after '" + context.funcName + "'", delim); - } -} - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "delimsizing", - names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - - return { - type: "delimsizing", - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - value: delim.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var delim = group.value.value; - - if (delim === ".") { - // Empty delimiters still count as elements, even though they don't - // show anything. - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan([group.value.mclass]); - } - - // Use delimiter.sizedDelim to generate the delimiter. - return __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].sizedDelim(delim, group.value.size, options, group.mode, [group.value.mclass]); - }, - mathmlBuilder: function mathmlBuilder(group) { - var children = []; - - if (group.value.value !== ".") { - children.push(__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.value, group.mode)); - } - - var node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", children); - - if (group.value.mclass === "mopen" || group.value.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - - return node; - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "leftright", - names: ["\\left", "\\right"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - - if (context.funcName === "\\left") { - var parser = context.parser; - // Parse out the implicit body - ++parser.leftrightDepth; - // parseExpression stops before '\\right' - var body = parser.parseExpression(false); - --parser.leftrightDepth; - // Check the next token - parser.expect("\\right", false); - var right = parser.parseFunction(); - if (!right) { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]('failed to parse function after \\right'); - } - return { - type: "leftright", - body: body, - left: delim.value, - right: right.value.value - }; - } else { - // This is a little weird. We return this object which gets turned - // into a ParseNode which gets returned by - // `const right = parser.parseFunction();` up above. - return { - type: "leftright", - value: delim.value - }; - } - }, - htmlBuilder: function htmlBuilder(group, options) { - // Build the inner expression - var inner = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["a" /* buildExpression */](group.value.body, options, true, [null, "mclose"]); - - var innerHeight = 0; - var innerDepth = 0; - var hadMiddle = false; - - // Calculate its height and depth - for (var i = 0; i < inner.length; i++) { - if (inner[i].isMiddle) { - hadMiddle = true; - } else { - innerHeight = Math.max(inner[i].height, innerHeight); - innerDepth = Math.max(inner[i].depth, innerDepth); - } - } - - // The size of delimiters is the same, regardless of what style we are - // in. Thus, to correctly calculate the size of delimiter we need around - // a group, we scale down the inner size based on the size. - innerHeight *= options.sizeMultiplier; - innerDepth *= options.sizeMultiplier; - - var leftDelim = void 0; - if (group.value.left === ".") { - // Empty delimiters in \left and \right make null delimiter spaces. - leftDelim = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["e" /* makeNullDelimiter */](options, ["mopen"]); - } else { - // Otherwise, use leftRightDelim to generate the correct sized - // delimiter. - leftDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].leftRightDelim(group.value.left, innerHeight, innerDepth, options, group.mode, ["mopen"]); - } - // Add it to the beginning of the expression - inner.unshift(leftDelim); - - // Handle middle delimiters - if (hadMiddle) { - for (var _i = 1; _i < inner.length; _i++) { - var middleDelim = inner[_i]; - if (middleDelim.isMiddle) { - // Apply the options that were active when \middle was called - inner[_i] = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].leftRightDelim(middleDelim.isMiddle.value, innerHeight, innerDepth, middleDelim.isMiddle.options, group.mode, []); - } - } - } - - var rightDelim = void 0; - // Same for the right delimiter - if (group.value.right === ".") { - rightDelim = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["e" /* makeNullDelimiter */](options, ["mclose"]); - } else { - rightDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].leftRightDelim(group.value.right, innerHeight, innerDepth, options, group.mode, ["mclose"]); - } - // Add it to the end of the expression. - inner.push(rightDelim); - - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["minner"], inner, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_7__buildMathML__["a" /* buildExpression */](group.value.body, options); - - if (group.value.left !== ".") { - var leftNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.left, group.mode)]); - - leftNode.setAttribute("fence", "true"); - - inner.unshift(leftNode); - } - - if (group.value.right !== ".") { - var rightNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.right, group.mode)]); - - rightNode.setAttribute("fence", "true"); - - inner.push(rightNode); - } - - var outerNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mrow", inner); - - return outerNode; - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - if (!context.parser.leftrightDepth) { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - value: delim.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var middleDelim = void 0; - if (group.value.value === ".") { - middleDelim = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["e" /* makeNullDelimiter */](options, []); - } else { - middleDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].sizedDelim(group.value.value, 1, options, group.mode, []); - middleDelim.isMiddle = { value: group.value.value, options: options }; - } - return middleDelim; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var middleNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.middle, group.mode)]); - middleNode.setAttribute("fence", "true"); - return middleNode; - } -}); - -/***/ }), -/* 132 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__sizing__ = __webpack_require__(60); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -var styleMap = { - "display": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].DISPLAY, - "text": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].TEXT, - "script": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPT, - "scriptscript": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPTSCRIPT -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args) { - var breakOnTokenText = context.breakOnTokenText, - funcName = context.funcName, - parser = context.parser; - - // parse out the implicit body - - parser.consumeSpaces(); - var body = parser.parseExpression(true, breakOnTokenText); - - return { - type: "styling", - // Figure out what style to use by pulling out the style from - // the function name - style: funcName.slice(1, funcName.length - 5), - value: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Style changes are handled in the TeXbook on pg. 442, Rule 3. - var newStyle = styleMap[group.value.style]; - var newOptions = options.havingStyle(newStyle); - return Object(__WEBPACK_IMPORTED_MODULE_3__sizing__["a" /* sizingGroup */])(group.value.value, newOptions, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // Figure out what style we're changing to. - // TODO(kevinb): dedupe this with buildHTML.js - // This will be easier of handling of styling nodes is in the same file. - var styleMap = { - "display": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].DISPLAY, - "text": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].TEXT, - "script": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPT, - "scriptscript": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPTSCRIPT - }; - - var newStyle = styleMap[group.value.style]; - var newOptions = options.havingStyle(newStyle); - - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, newOptions); - - var node = new __WEBPACK_IMPORTED_MODULE_1__mathMLTree__["a" /* default */].MathNode("mstyle", inner); - - var styleAttributes = { - "display": ["0", "true"], - "text": ["0", "false"], - "script": ["1", "false"], - "scriptscript": ["2", "false"] - }; - - var attr = styleAttributes[group.value.style]; - - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - - return node; - } -}); - -/***/ }), -/* 133 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(134); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - -// TODO(kevinb): implement \\sl and \\sc - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - var font = group.value.font; - return __WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.withFontFamily(font)); -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var font = group.value.font; - return __WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options.withFontFamily(font)); -}; - -var fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "font", - names: [ - // styles - "\\mathrm", "\\mathit", "\\mathbf", "\\boldsymbol", - - // families - "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", - - // aliases - "\\Bbb", "\\bold", "\\frak", "\\bm"], - props: { - numArgs: 1, - greediness: 2 - }, - handler: function handler(context, args) { - var body = args[0]; - var func = context.funcName; - if (func in fontAliases) { - func = fontAliases[func]; - } - return { - type: "font", - font: func.slice(1), - body: body - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -var oldFontFuncsMap = { - "\\rm": "mathrm", - "\\sf": "mathsf", - "\\tt": "mathtt", - "\\bf": "mathbf", - "\\it": "mathit" -}; - -// Old font changing functions -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "font", - names: __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(oldFontFuncsMap), - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args) { - var parser = context.parser, - funcName = context.funcName, - breakOnTokenText = context.breakOnTokenText; - - - parser.consumeSpaces(); - var body = parser.parseExpression(true, breakOnTokenText); - var style = oldFontFuncsMap[funcName]; - - return { - type: "font", - font: style, - body: new __WEBPACK_IMPORTED_MODULE_2__ParseNode__["a" /* default */]("ordgroup", body, parser.mode) - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(135), __esModule: true }; - -/***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(136); -module.exports = __webpack_require__(8).Object.keys; - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 Object.keys(O) -var toObject = __webpack_require__(29) - , $keys = __webpack_require__(39); - -__webpack_require__(46)('keys', function(){ - return function keys(it){ - return $keys(toObject(it)); + } + /** + * Considers the current look ahead token as consumed, + * and fetches the one after that as the new look ahead. + */ + ; + + _proto.consume = function consume() { + this.nextToken = this.gullet.expandNextToken(); + } + /** + * Switches between "text" and "math" modes. + */ + ; + + _proto.switchMode = function switchMode(newMode) { + this.mode = newMode; + this.gullet.switchMode(newMode); + } + /** + * Main parsing function, which parses an entire input. + */ + ; + + _proto.parse = function parse() { + // Create a group namespace for the math expression. + // (LaTeX creates a new group for every $...$, $$...$$, \[...\].) + this.gullet.beginGroup(); // Use old \color behavior (same as LaTeX's \textcolor) if requested. + // We do this within the group for the math expression, so it doesn't + // pollute settings.macros. + + if (this.settings.colorIsTextColor) { + this.gullet.macros.set("\\color", "\\textcolor"); + } // Try to parse the input + + + this.consume(); + var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end + + this.expect("EOF", false); // End the group namespace for the expression + + this.gullet.endGroup(); + return parse; }; -}); -/***/ }), -/* 137 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) { + var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either + // we reached the end, a }, or a \right) -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - // Accents are handled in the TeXbook pg. 443, rule 12. - var base = group.value.base; - - var supsubGroup = void 0; - if (group.type === "supsub") { - // If our base is a character box, and we have superscripts and - // subscripts, the supsub will defer to us. In particular, we want - // to attach the superscripts and subscripts to the inner body (so - // that the position of the superscripts and subscripts won't be - // affected by the height of the accent). We accomplish this by - // sticking the base of the accent into the base of the supsub, and - // rendering that, while keeping track of where the accent is. - - // The supsub group is the group that was passed in - var supsub = group; - // The real accent group is the base of the supsub group - group = supsub.value.base; - // The character box is the base of the accent group - base = group.value.base; - // Stick the character box into the base of the supsub group - supsub.value.base = base; - - // Rerender the supsub group with its new base, and store that - // result. - supsubGroup = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](supsub, options); - } - - // Build the base group - var body = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](base, options.havingCrampedStyle()); - - // Does the accent need to shift for the skew of a character? - var mustShift = group.value.isShifty && __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].isCharacterBox(base); - - // Calculate the skew of the accent. This is based on the line "If the - // nucleus is not a single character, let s = 0; otherwise set s to the - // kern amount for the nucleus followed by the \skewchar of its font." - // Note that our skew metrics are just the kern between each character - // and the skewchar. - var skew = 0; - if (mustShift) { - // If the base is a character box, then we want the skew of the - // innermost character. To do that, we find the innermost character: - var baseChar = __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].getBaseElem(base); - // Then, we render its group to get the symbol inside it - var baseGroup = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](baseChar, options.havingCrampedStyle()); - // Finally, we pull the skew off of the symbol. - skew = baseGroup.skew; - // Note that we now throw away baseGroup, because the layers we - // removed with getBaseElem might contain things like \color which - // we can't get rid of. - // TODO(emily): Find a better way to get the skew - } - - // calculate the amount of space between the body and the accent - var clearance = Math.min(body.height, options.fontMetrics().xHeight); - - // Build the accent - var accentBody = void 0; - if (!group.value.isStretchy) { - var accent = void 0; - var width = void 0; - if (group.value.label === "\\vec") { - // Before version 0.9, \vec used the combining font glyph U+20D7. - // But browsers, especially Safari, are not consistent in how they - // render combining characters when not preceded by a character. - // So now we use an SVG. - // If Safari reforms, we should consider reverting to the glyph. - accent = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].staticSvg("vec", options); - width = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].svgData.vec[1]; - } else { - accent = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSymbol(group.value.label, "Main-Regular", group.mode, options); - // Remove the italic correction of the accent, because it only serves to - // shift the accent over to a place we don't want. - accent.italic = 0; - width = accent.width; - } - - accentBody = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["accent-body"], [accent]); - - // CSS defines `.katex .accent .accent-body { width: 0 }` - // so that the accent doesn't contribute to the bounding box. - // We need to shift the character by its width (effectively half - // its width) to compensate. - var left = -width / 2; - - // Shift the accent over by the skew. - left += skew; - - accentBody.style.left = left + "em"; - - accentBody = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: body }, { type: "kern", size: -clearance }, { type: "elem", elem: accentBody }] - }, options); - } else { - accentBody = __WEBPACK_IMPORTED_MODULE_4__stretchy__["a" /* default */].svgSpan(group, options); - - accentBody = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: body }, { - type: "elem", - elem: accentBody, - wrapperClasses: ["svg-align"], - wrapperStyle: skew > 0 ? { - width: "calc(100% - " + 2 * skew + "em)", - marginLeft: 2 * skew + "em" - } : undefined - }] - }, options); - } - - var accentWrap = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "accent"], [accentBody], options); - - if (supsubGroup) { - // Here, we replace the "base" child of the supsub with our newly - // generated accent. - supsubGroup.children[0] = accentWrap; - - // Since we don't rerun the height calculation after replacing the - // accent, we manually recalculate height. - supsubGroup.height = Math.max(accentWrap.height, supsubGroup.height); - - // Accents should always be ords, even when their innards are not. - supsubGroup.classes[0] = "mord"; - - return supsubGroup; - } else { - return accentWrap; - } -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var accentNode = void 0; - if (group.value.isStretchy) { - accentNode = __WEBPACK_IMPORTED_MODULE_4__stretchy__["a" /* default */].mathMLnode(group.value.label); - } else { - accentNode = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["e" /* makeText */](group.value.label, group.mode)]); - } - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.base, options), accentNode]); - - node.setAttribute("accent", "true"); - - return node; -}; - -var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) { - return "\\" + accent; -}).join("|")); - -// Accents -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "accent", - names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var base = args[0]; - - var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName); - var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde"; - - return { - type: "accent", - label: context.funcName, - isStretchy: isStretchy, - isShifty: isShifty, - base: base - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// Text-mode accents -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(context, args) { - var base = args[0]; - - return { - type: "accent", - label: context.funcName, - isStretchy: false, - isShifty: true, - base: base - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 138 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - -// Horizontal overlap functions - - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "accentUnder", - names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var base = args[0]; - return { - type: "accentUnder", - label: context.funcName, - base: base - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Treat under accents much like underlines. - var innerGroup = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["b" /* buildGroup */](group.value.base, options); - - var accentBody = __WEBPACK_IMPORTED_MODULE_3__stretchy__["a" /* default */].svgSpan(group, options); - var kern = group.value.label === "\\utilde" ? 0.12 : 0; - - // Generate the vlist, with the appropriate kerns - var vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: accentBody.height + kern, - children: [{ type: "elem", elem: accentBody, wrapperClasses: ["svg-align"] }, { type: "kern", size: kern }, { type: "elem", elem: innerGroup }] - }, options); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "accentunder"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var accentNode = __WEBPACK_IMPORTED_MODULE_3__stretchy__["a" /* default */].mathMLnode(group.value.label); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munder", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["b" /* buildGroup */](group.value.body, options), accentNode]); - node.setAttribute("accentunder", "true"); - return node; - } -}); - -/***/ }), -/* 139 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("\\verb ended by end of line instead of matching delimiter"); - }, - htmlBuilder: function htmlBuilder(group, options) { - var text = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVerb(group, options); - var body = []; - // \verb enters text mode and therefore is sized like \textstyle - var newOptions = options.havingStyle(options.style.text()); - for (var i = 0; i < text.length; i++) { - if (text[i] === '\xA0') { - // spaces appear as nonbreaking space - // The space character isn't in the Typewriter-Regular font, - // so we implement it as a kern of the same size as a character. - // 0.525 is the width of a texttt character in LaTeX. - // It automatically gets scaled by the font size. - var rule = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "rule"], [], newOptions); - rule.style.marginLeft = "0.525em"; - body.push(rule); - } else { - body.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSymbol(text[i], "Typewriter-Regular", group.mode, newOptions, ["mathtt"])); - } - } - __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].tryCombineChars(body); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), - // tryCombinChars expects CombinableDomNode[] while makeSpan expects - // DomChildNode[]. - // $FlowFixMe: CombinableDomNode[] is not compatible with DomChildNode[] - body, newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var text = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVerb(group, options)); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtext", [text]); - node.setAttribute("mathvariant", __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].fontMap["mathtt"].variant); - return node; - } -}); - -/***/ }), -/* 140 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"] - }, - handler: function handler(context, args) { - var body = args[1]; - var href = args[0].value; - return { - type: "href", - href: href, - body: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["a" /* buildExpression */](group.value.body, options, false); - - var href = group.value.href; - - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeAnchor(href, [], elements, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.body, options); - var math = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", inner); - math.setAttribute("href", group.value.href); - return math; - } -}); - -/***/ }), -/* 141 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - - - - - - - -var chooseMathStyle = function chooseMathStyle(group, options) { - var style = options.style; - if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY.size) { - return group.value.display; - } else if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].TEXT.size) { - return group.value.text; - } else if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPT.size) { - return group.value.script; - } else if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPTSCRIPT.size) { - return group.value.scriptscript; - } - return group.value.text; -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4 - }, - handler: function handler(context, args) { - return { - type: "mathchoice", - display: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[0]), - text: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[1]), - script: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[2]), - scriptscript: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[3]) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var body = chooseMathStyle(group, options); - var elements = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](body, options, false); - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = chooseMathStyle(group, options); - var elements = __WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](body, options, false); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", elements); - } -}); - -/***/ }), -/* 142 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineEnvironment__ = __webpack_require__(61); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__environments_array_js__ = __webpack_require__(143); - - -var environments = __WEBPACK_IMPORTED_MODULE_0__defineEnvironment__["a" /* _environments */]; - -/* harmony default export */ __webpack_exports__["a"] = (environments); - -// All environment definitions should be imported below - - -/***/ }), -/* 143 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineEnvironment__ = __webpack_require__(61); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__buildMathML__ = __webpack_require__(2); - - - - - - - - - - - - -// Data stored in the ParseNode associated with the environment. - - -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument style - * ("text", "display", etc.), then each cell is cast into that style. - */ -function parseArray(parser, result, style) { - var row = []; - var body = [row]; - var rowGaps = []; while (true) { - // eslint-disable-line no-constant-condition - var cell = parser.parseExpression(false, undefined); - cell = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("ordgroup", cell, parser.mode); - if (style) { - cell = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("styling", { - style: style, - value: [cell] - }, parser.mode); - } - row.push(cell); - var next = parser.nextToken.text; - if (next === "&") { - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. - var lastRow = body[body.length - 1]; - if (body.length > 1 && lastRow.length === 1 && lastRow[0].value.value[0].value.length === 0) { - body.pop(); - } - break; - } else if (next === "\\\\" || next === "\\cr") { - var cr = parser.parseFunction(); - if (!cr) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Failed to parse function after " + next); - } - rowGaps.push(cr.value.size); - row = []; - body.push(row); - } else { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Expected & or \\\\ or \\end", parser.nextToken); - } - } - result.body = body; - result.rowGaps = rowGaps; - return new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */](result.type, result, parser.mode); -} + // Ignore spaces in math mode + if (this.mode === "math") { + this.consumeSpaces(); + } -// Decides on a style for cells in an array according to whether the given -// environment name starts with the letter 'd'. -function dCellStyle(envName) { - if (envName.substr(0, 1) === "d") { - return "display"; + var lex = this.nextToken; + + if (Parser.endOfExpression.indexOf(lex.text) !== -1) { + break; + } + + if (breakOnTokenText && lex.text === breakOnTokenText) { + break; + } + + if (breakOnInfix && src_functions[lex.text] && src_functions[lex.text].infix) { + break; + } + + var atom = this.parseAtom(breakOnTokenText); + + if (!atom) { + break; + } + + body.push(atom); + } + + if (this.mode === "text") { + this.formLigatures(body); + } + + return this.handleInfixNodes(body); + } + /** + * Rewrites infix operators such as \over with corresponding commands such + * as \frac. + * + * There can only be one infix operator per group. If there's more than one + * then the expression is ambiguous. This can be resolved by adding {}. + */ + ; + + _proto.handleInfixNodes = function handleInfixNodes(body) { + var overIndex = -1; + var funcName; + + for (var i = 0; i < body.length; i++) { + var node = checkNodeType(body[i], "infix"); + + if (node) { + if (overIndex !== -1) { + throw new src_ParseError("only one infix operator per group", node.token); + } + + overIndex = i; + funcName = node.replaceWith; + } + } + + if (overIndex !== -1 && funcName) { + var numerNode; + var denomNode; + var numerBody = body.slice(0, overIndex); + var denomBody = body.slice(overIndex + 1); + + if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { + numerNode = numerBody[0]; + } else { + numerNode = { + type: "ordgroup", + mode: this.mode, + body: numerBody + }; + } + + if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { + denomNode = denomBody[0]; + } else { + denomNode = { + type: "ordgroup", + mode: this.mode, + body: denomBody + }; + } + + var _node; + + if (funcName === "\\\\abovefrac") { + _node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); + } else { + _node = this.callFunction(funcName, [numerNode, denomNode], []); + } + + return [_node]; } else { - return "text"; + return body; } -} + } // The greediness of a superscript or subscript + ; -var htmlBuilder = function htmlBuilder(group, options) { - var r = void 0; - var c = void 0; - var nr = group.value.body.length; - var nc = 0; - var body = new Array(nr); + /** + * Handle a subscript or superscript with nice errors. + */ + _proto.handleSupSubscript = function handleSupSubscript(name) { + var symbolToken = this.nextToken; + var symbol = symbolToken.text; + this.consume(); + this.consumeSpaces(); // ignore spaces before sup/subscript argument - // Horizontal spacing - var pt = 1 / options.fontMetrics().ptPerEm; - var arraycolsep = 5 * pt; // \arraycolsep in article.cls + var group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS); - // Vertical spacing - var baselineskip = 12 * pt; // see size10.clo - // Default \jot from ltmath.dtx - // TODO(edemaine): allow overriding \jot via \setlength (#687) - var jot = 3 * pt; - // Default \arraystretch from lttab.dtx - // TODO(gagern): may get redefined once we have user-defined macros - var arraystretch = __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].deflt(group.value.arraystretch, 1); - var arrayskip = arraystretch * baselineskip; - var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and - var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx - - var totalHeight = 0; - for (r = 0; r < group.value.body.length; ++r) { - var inrow = group.value.body[r]; - var _height = arstrutHeight; // \@array adds an \@arstrut - var _depth = arstrutDepth; // to each tow (via the template) - - if (nc < inrow.length) { - nc = inrow.length; - } - - var outrow = new Array(inrow.length); - for (c = 0; c < inrow.length; ++c) { - var elt = __WEBPACK_IMPORTED_MODULE_8__buildHTML__["b" /* buildGroup */](inrow[c], options); - if (_depth < elt.depth) { - _depth = elt.depth; - } - if (_height < elt.height) { - _height = elt.height; - } - outrow[c] = elt; - } - - var gap = 0; - if (group.value.rowGaps[r]) { - gap = Object(__WEBPACK_IMPORTED_MODULE_5__units__["a" /* calculateSize */])(group.value.rowGaps[r].value, options); - if (gap > 0) { - // \@argarraycr - gap += arstrutDepth; - if (_depth < gap) { - _depth = gap; // \@xargarraycr - } - gap = 0; - } - } - // In AMS multiline environments such as aligned and gathered, rows - // correspond to lines that have additional \jot added to the - // \baselineskip via \openup. - if (group.value.addJot) { - _depth += jot; - } - - outrow.height = _height; - outrow.depth = _depth; - totalHeight += _height; - outrow.pos = totalHeight; - totalHeight += _depth + gap; // \@yargarraycr - body[r] = outrow; + if (!group) { + throw new src_ParseError("Expected group after '" + symbol + "'", symbolToken); } - var offset = totalHeight / 2 + options.fontMetrics().axisHeight; - var colDescriptions = group.value.cols || []; - var cols = []; - var colSep = void 0; - var colDescrNum = void 0; - for (c = 0, colDescrNum = 0; - // Continue while either there are more columns or more column - // descriptions, so trailing separators don't get lost. - c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) { + return group; + } + /** + * Converts the textual input of an unsupported command into a text node + * contained within a color node whose color is determined by errorColor + */ + ; - var colDescr = colDescriptions[colDescrNum] || {}; + _proto.handleUnsupportedCmd = function handleUnsupportedCmd() { + var text = this.nextToken.text; + var textordArray = []; - var firstSeparator = true; - while (colDescr.type === "separator") { - // If there is more than one separator in a row, add a space - // between them. - if (!firstSeparator) { - colSep = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["arraycolsep"], []); - colSep.style.width = options.fontMetrics().doubleRuleSep + "em"; - cols.push(colSep); - } - - if (colDescr.separator === "|") { - var _separator = __WEBPACK_IMPORTED_MODULE_7__stretchy__["a" /* default */].ruleSpan("vertical-separator", 0.05, options); - _separator.style.height = totalHeight + "em"; - _separator.style.verticalAlign = -(totalHeight - offset) + "em"; - - cols.push(_separator); - } else { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Invalid separator type: " + colDescr.separator); - } - - colDescrNum++; - colDescr = colDescriptions[colDescrNum] || {}; - firstSeparator = false; - } - - if (c >= nc) { - continue; - } - - var sepwidth = void 0; - if (c > 0 || group.value.hskipBeforeAndAfter) { - sepwidth = __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].deflt(colDescr.pregap, arraycolsep); - if (sepwidth !== 0) { - colSep = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } - - var col = []; - for (r = 0; r < nr; ++r) { - var row = body[r]; - var elem = row[c]; - if (!elem) { - continue; - } - var shift = row.pos - offset; - elem.depth = row.depth; - elem.height = row.height; - col.push({ type: "elem", elem: elem, shift: shift }); - } - - col = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: col - }, options); - col = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["col-align-" + (colDescr.align || "c")], [col]); - cols.push(col); - - if (c < nc - 1 || group.value.hskipBeforeAndAfter) { - sepwidth = __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].deflt(colDescr.postgap, arraycolsep); - if (sepwidth !== 0) { - colSep = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } + for (var i = 0; i < text.length; i++) { + textordArray.push({ + type: "textord", + mode: "text", + text: text[i] + }); } - body = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["mtable"], cols); - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["mord"], [body], options); -}; -var mathmlBuilder = function mathmlBuilder(group, options) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtable", group.value.body.map(function (row) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtr", row.map(function (cell) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtd", [__WEBPACK_IMPORTED_MODULE_9__buildMathML__["b" /* buildGroup */](cell, options)]); - })); - })); -}; - -// Convinient function for aligned and alignedat environments. -var alignedHandler = function alignedHandler(context, args) { - var res = { - type: "array", - cols: [], - addJot: true + var textNode = { + type: "text", + mode: this.mode, + body: textordArray }; - res = parseArray(context.parser, res, "display"); + var colorNode = { + type: "color", + mode: this.mode, + color: this.settings.errorColor, + body: [textNode] + }; + this.consume(); + return colorNode; + } + /** + * Parses a group with optional super/subscripts. + */ + ; - // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - var numMaths = void 0; - var numCols = 0; - var emptyGroup = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("ordgroup", [], context.mode); - if (args[0] && args[0].value) { - var arg0 = ""; - for (var i = 0; i < args[0].value.length; i++) { - arg0 += args[0].value[i].value; - } - numMaths = Number(arg0); - numCols = numMaths * 2; - } - var isAligned = !numCols; - res.value.body.forEach(function (row) { - for (var _i = 1; _i < row.length; _i += 2) { - // Modify ordgroup node within styling node - var ordgroup = row[_i].value.value[0]; - ordgroup.value.unshift(emptyGroup); - } - if (!isAligned) { - // Case 1 - var curMaths = row.length / 2; - if (numMaths < curMaths) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); + _proto.parseAtom = function parseAtom(breakOnTokenText) { + // The body of an atom is an implicit group, so that things like + // \left(x\right)^2 work correctly. + var base = this.parseGroup("atom", false, null, breakOnTokenText); // In text mode, we don't have superscripts or subscripts - // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - for (var _i2 = 0; _i2 < numCols; ++_i2) { - var _align = "r"; - var _pregap = 0; - if (_i2 % 2 === 1) { - _align = "l"; - } else if (_i2 > 0 && isAligned) { - // "aligned" mode. - _pregap = 1; // add one \quad + if (this.mode === "text") { + return base; + } // Note that base may be empty (i.e. null) at this point. + + + var superscript; + var subscript; + + while (true) { + // Guaranteed in math mode, so eat any spaces first. + this.consumeSpaces(); // Lex the first token + + var lex = this.nextToken; + + if (lex.text === "\\limits" || lex.text === "\\nolimits") { + // We got a limit control + var opNode = checkNodeType(base, "op"); + + if (opNode) { + var limits = lex.text === "\\limits"; + opNode.limits = limits; + opNode.alwaysHandleSupSub = true; + } else { + throw new src_ParseError("Limit controls must follow a math operator", lex); } - res.value.cols[_i2] = { - type: "align", - align: _align, - pregap: _pregap, - postgap: 0 + + this.consume(); + } else if (lex.text === "^") { + // We got a superscript start + if (superscript) { + throw new src_ParseError("Double superscript", lex); + } + + superscript = this.handleSupSubscript("superscript"); + } else if (lex.text === "_") { + // We got a subscript start + if (subscript) { + throw new src_ParseError("Double subscript", lex); + } + + subscript = this.handleSupSubscript("subscript"); + } else if (lex.text === "'") { + // We got a prime + if (superscript) { + throw new src_ParseError("Double superscript", lex); + } + + var prime = { + type: "textord", + mode: this.mode, + text: "\\prime" + }; // Many primes can be grouped together, so we handle this here + + var primes = [prime]; + this.consume(); // Keep lexing tokens until we get something that's not a prime + + while (this.nextToken.text === "'") { + // For each one, add another prime to the list + primes.push(prime); + this.consume(); + } // If there's a superscript following the primes, combine that + // superscript in with the primes. + + + if (this.nextToken.text === "^") { + primes.push(this.handleSupSubscript("superscript")); + } // Put everything into an ordgroup as the superscript + + + superscript = { + type: "ordgroup", + mode: this.mode, + body: primes }; - } - return res; -}; + } else { + // If it wasn't ^, _, or ', stop parsing super/subscripts + break; + } + } // Base must be set if superscript or subscript are set per logic above, + // but need to check here for type check to pass. -// Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var colalign = args[0]; - colalign = colalign.value.map ? colalign.value : [colalign]; - var cols = colalign.map(function (node) { - var ca = node.value; - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Unknown column alignment: " + node.value, node); + + if (superscript || subscript) { + // If we got either a superscript or subscript, create a supsub + return { + type: "supsub", + mode: this.mode, + base: base, + sup: superscript, + sub: subscript + }; + } else { + // Otherwise return the original body + return base; + } + } + /** + * Parses an entire function, including its base and all of its arguments. + */ + ; + + _proto.parseFunction = function parseFunction(breakOnTokenText, name, // For error reporting. + greediness) { + var token = this.nextToken; + var func = token.text; + var funcData = src_functions[func]; + + if (!funcData) { + return null; + } + + if (greediness != null && funcData.greediness <= greediness) { + throw new src_ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token); + } else if (this.mode === "text" && !funcData.allowedInText) { + throw new src_ParseError("Can't use function '" + func + "' in text mode", token); + } else if (this.mode === "math" && funcData.allowedInMath === false) { + throw new src_ParseError("Can't use function '" + func + "' in math mode", token); + } // hyperref package sets the catcode of % as an active character + + + if (funcData.argTypes && funcData.argTypes[0] === "url") { + this.gullet.lexer.setCatcode("%", 13); + } // Consume the command token after possibly switching to the + // mode specified by the function (for instant mode switching), + // and then immediately switch back. + + + if (funcData.consumeMode) { + var oldMode = this.mode; + this.switchMode(funcData.consumeMode); + this.consume(); + this.switchMode(oldMode); + } else { + this.consume(); + } + + var _this$parseArguments = this.parseArguments(func, funcData), + args = _this$parseArguments.args, + optArgs = _this$parseArguments.optArgs; + + return this.callFunction(func, args, optArgs, token, breakOnTokenText); + } + /** + * Call a function handler with a suitable context and arguments. + */ + ; + + _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) { + var context = { + funcName: name, + parser: this, + token: token, + breakOnTokenText: breakOnTokenText + }; + var func = src_functions[name]; + + if (func && func.handler) { + return func.handler(context, args, optArgs); + } else { + throw new src_ParseError("No function handler for " + name); + } + } + /** + * Parses the arguments of a function or environment + */ + ; + + _proto.parseArguments = function parseArguments(func, // Should look like "\name" or "\begin{name}". + funcData) { + var totalArgs = funcData.numArgs + funcData.numOptionalArgs; + + if (totalArgs === 0) { + return { + args: [], + optArgs: [] + }; + } + + var baseGreediness = funcData.greediness; + var args = []; + var optArgs = []; + + for (var i = 0; i < totalArgs; i++) { + var argType = funcData.argTypes && funcData.argTypes[i]; + var isOptional = i < funcData.numOptionalArgs; // Ignore spaces between arguments. As the TeXbook says: + // "After you have said ‘\def\row#1#2{...}’, you are allowed to + // put spaces between the arguments (e.g., ‘\row x n’), because + // TeX doesn’t use single spaces as undelimited arguments." + + if (i > 0 && !isOptional) { + this.consumeSpaces(); + } // Also consume leading spaces in math mode, as parseSymbol + // won't know what to do with them. This can only happen with + // macros, e.g. \frac\foo\foo where \foo expands to a space symbol. + // In LaTeX, the \foo's get treated as (blank) arguments). + // In KaTeX, for now, both spaces will get consumed. + // TODO(edemaine) + + + if (i === 0 && !isOptional && this.mode === "math") { + this.consumeSpaces(); + } + + var nextToken = this.nextToken; + var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional, baseGreediness); + + if (!arg) { + if (isOptional) { + optArgs.push(null); + continue; + } + + throw new src_ParseError("Expected group after '" + func + "'", nextToken); + } + + (isOptional ? optArgs : args).push(arg); + } + + return { + args: args, + optArgs: optArgs + }; + } + /** + * Parses a group when the mode is changing. + */ + ; + + _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness) { + switch (type) { + case "color": + return this.parseColorGroup(optional); + + case "size": + return this.parseSizeGroup(optional); + + case "url": + return this.parseUrlGroup(optional); + + case "math": + case "text": + return this.parseGroup(name, optional, greediness, undefined, type); + + case "raw": + { + if (optional && this.nextToken.text === "{") { + return null; + } + + var token = this.parseStringGroup("raw", optional, true); + + if (token) { + return { + type: "raw", + mode: "text", + string: token.text + }; + } else { + throw new src_ParseError("Expected raw group", this.nextToken); + } + } + + case "original": + case null: + case undefined: + return this.parseGroup(name, optional, greediness); + + default: + throw new src_ParseError("Unknown group type as " + name, this.nextToken); + } + }; + + _proto.consumeSpaces = function consumeSpaces() { + while (this.nextToken.text === " ") { + this.consume(); + } + } + /** + * Parses a group, essentially returning the string formed by the + * brace-enclosed tokens plus some position information. + */ + ; + + _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages. + optional, raw) { + var groupBegin = optional ? "[" : "{"; + var groupEnd = optional ? "]" : "}"; + var nextToken = this.nextToken; + + if (nextToken.text !== groupBegin) { + if (optional) { + return null; + } else if (raw && nextToken.text !== "EOF" && /[^{}[\]]/.test(nextToken.text)) { + // allow a single character in raw string group + this.gullet.lexer.setCatcode("%", 14); // reset the catcode of % + + this.consume(); + return nextToken; + } + } + + var outerMode = this.mode; + this.mode = "text"; + this.expect(groupBegin); + var str = ""; + var firstToken = this.nextToken; + var nested = 0; // allow nested braces in raw string group + + var lastToken = firstToken; + + while (raw && nested > 0 || this.nextToken.text !== groupEnd) { + switch (this.nextToken.text) { + case "EOF": + throw new src_ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str)); + + case groupBegin: + nested++; + break; + + case groupEnd: + nested--; + break; + } + + lastToken = this.nextToken; + str += lastToken.text; + this.consume(); + } + + this.mode = outerMode; + this.gullet.lexer.setCatcode("%", 14); // reset the catcode of % + + this.expect(groupEnd); + return firstToken.range(lastToken, str); + } + /** + * Parses a regex-delimited group: the largest sequence of tokens + * whose concatenated strings match `regex`. Returns the string + * formed by the tokens plus some position information. + */ + ; + + _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) { + var outerMode = this.mode; + this.mode = "text"; + var firstToken = this.nextToken; + var lastToken = firstToken; + var str = ""; + + while (this.nextToken.text !== "EOF" && regex.test(str + this.nextToken.text)) { + lastToken = this.nextToken; + str += lastToken.text; + this.consume(); + } + + if (str === "") { + throw new src_ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); + } + + this.mode = outerMode; + return firstToken.range(lastToken, str); + } + /** + * Parses a color description. + */ + ; + + _proto.parseColorGroup = function parseColorGroup(optional) { + var res = this.parseStringGroup("color", optional); + + if (!res) { + return null; + } + + var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text); + + if (!match) { + throw new src_ParseError("Invalid color: '" + res.text + "'", res); + } + + var color = match[0]; + + if (/^[0-9a-f]{6}$/i.test(color)) { + // We allow a 6-digit HTML color spec without a leading "#". + // This follows the xcolor package's HTML color model. + // Predefined color names are all missed by this RegEx pattern. + color = "#" + color; + } + + return { + type: "color-token", + mode: this.mode, + color: color + }; + } + /** + * Parses a size specification, consisting of magnitude and unit. + */ + ; + + _proto.parseSizeGroup = function parseSizeGroup(optional) { + var res; + var isBlank = false; + + if (!optional && this.nextToken.text !== "{") { + res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); + } else { + res = this.parseStringGroup("size", optional); + } + + if (!res) { + return null; + } + + if (!optional && res.text.length === 0) { + // Because we've tested for what is !optional, this block won't + // affect \kern, \hspace, etc. It will capture the mandatory arguments + // to \genfrac and \above. + res.text = "0pt"; // Enable \above{} + + isBlank = true; // This is here specifically for \genfrac + } + + var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); + + if (!match) { + throw new src_ParseError("Invalid size: '" + res.text + "'", res); + } + + var data = { + number: +(match[1] + match[2]), + // sign + magnitude, cast to number + unit: match[3] + }; + + if (!validUnit(data)) { + throw new src_ParseError("Invalid unit: '" + data.unit + "'", res); + } + + return { + type: "size", + mode: this.mode, + value: data, + isBlank: isBlank + }; + } + /** + * Parses an URL, checking escaped letters and allowed protocols. + */ + ; + + _proto.parseUrlGroup = function parseUrlGroup(optional) { + var res = this.parseStringGroup("url", optional, true); // get raw string + + if (!res) { + return null; + } // hyperref package allows backslashes alone in href, but doesn't + // generate valid links in such cases; we interpret this as + // "undefined" behaviour, and keep them as-is. Some browser will + // replace backslashes with forward slashes. + + + var url = res.text.replace(/\\([#$%&~_^{}])/g, '$1'); + var protocol = /^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(url); + protocol = protocol != null ? protocol[1] : "_relative"; + var allowed = this.settings.allowedProtocols; + + if (!utils.contains(allowed, "*") && !utils.contains(allowed, protocol)) { + throw new src_ParseError("Forbidden protocol '" + protocol + "'", res); + } + + return { + type: "url", + mode: this.mode, + url: url + }; + } + /** + * If `optional` is false or absent, this parses an ordinary group, + * which is either a single nucleus (like "x") or an expression + * in braces (like "{x+y}") or an implicit group, a group that starts + * at the current position, and ends right before a higher explicit + * group ends, or at EOF. + * If `optional` is true, it parses either a bracket-delimited expression + * (like "[x+y]") or returns null to indicate the absence of a + * bracket-enclosed group. + * If `mode` is present, switches to that mode while parsing the group, + * and switches back after. + */ + ; + + _proto.parseGroup = function parseGroup(name, // For error reporting. + optional, greediness, breakOnTokenText, mode) { + var outerMode = this.mode; + var firstToken = this.nextToken; + var text = firstToken.text; // Switch to specified mode + + if (mode) { + this.switchMode(mode); + } + + var groupEnd; + var result; // Try to parse an open brace or \begingroup + + if (optional ? text === "[" : text === "{" || text === "\\begingroup") { + groupEnd = Parser.endOfGroup[text]; // Start a new group namespace + + this.gullet.beginGroup(); // If we get a brace, parse an expression + + this.consume(); + var expression = this.parseExpression(false, groupEnd); + var lastToken = this.nextToken; // End group namespace before consuming symbol after close brace + + this.gullet.endGroup(); + result = { + type: "ordgroup", + mode: this.mode, + loc: SourceLocation.range(firstToken, lastToken), + body: expression, + // A group formed by \begingroup...\endgroup is a semi-simple group + // which doesn't affect spacing in math mode, i.e., is transparent. + // https://tex.stackexchange.com/questions/1930/when-should-one- + // use-begingroup-instead-of-bgroup + semisimple: text === "\\begingroup" || undefined + }; + } else if (optional) { + // Return nothing for an optional group + result = null; + } else { + // If there exists a function with this name, parse the function. + // Otherwise, just return a nucleus + result = this.parseFunction(breakOnTokenText, name, greediness) || this.parseSymbol(); + + if (result == null && text[0] === "\\" && !implicitCommands.hasOwnProperty(text)) { + if (this.settings.throwOnError) { + throw new src_ParseError("Undefined control sequence: " + text, firstToken); + } + + result = this.handleUnsupportedCmd(); + } + } // Switch mode back + + + if (mode) { + this.switchMode(outerMode); + } // Make sure we got a close brace + + + if (groupEnd) { + this.expect(groupEnd); + } + + return result; + } + /** + * Form ligature-like combinations of characters for text mode. + * This includes inputs like "--", "---", "``" and "''". + * The result will simply replace multiple textord nodes with a single + * character in each value by a single textord node having multiple + * characters in its value. The representation is still ASCII source. + * The group will be modified in place. + */ + ; + + _proto.formLigatures = function formLigatures(group) { + var n = group.length - 1; + + for (var i = 0; i < n; ++i) { + var a = group[i]; // $FlowFixMe: Not every node type has a `text` property. + + var v = a.text; + + if (v === "-" && group[i + 1].text === "-") { + if (i + 1 < n && group[i + 2].text === "-") { + group.splice(i, 3, { + type: "textord", + mode: "text", + loc: SourceLocation.range(a, group[i + 2]), + text: "---" + }); + n -= 2; + } else { + group.splice(i, 2, { + type: "textord", + mode: "text", + loc: SourceLocation.range(a, group[i + 1]), + text: "--" + }); + n -= 1; + } + } + + if ((v === "'" || v === "`") && group[i + 1].text === v) { + group.splice(i, 2, { + type: "textord", + mode: "text", + loc: SourceLocation.range(a, group[i + 1]), + text: v + v }); - var res = { - type: "array", - cols: cols, - hskipBeforeAndAfter: true // \@preamble in lttab.dtx - }; - res = parseArray(context.parser, res, dCellStyle(context.envName)); - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); + n -= 1; + } + } + } + /** + * Parse a single symbol out of the string. Here, we handle single character + * symbols and special functions like verbatim + */ + ; -// The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var delimiters = { - "matrix": null, - "pmatrix": ["(", ")"], - "bmatrix": ["[", "]"], - "Bmatrix": ["\\{", "\\}"], - "vmatrix": ["|", "|"], - "Vmatrix": ["\\Vert", "\\Vert"] - }[context.envName]; - var res = { - type: "array", - hskipBeforeAndAfter: false // \hskip -\arraycolsep in amsmath + _proto.parseSymbol = function parseSymbol() { + var nucleus = this.nextToken; + var text = nucleus.text; + + if (/^\\verb[^a-zA-Z]/.test(text)) { + this.consume(); + var arg = text.slice(5); + var star = arg.charAt(0) === "*"; + + if (star) { + arg = arg.slice(1); + } // Lexer's tokenRegex is constructed to always have matching + // first/last characters. + + + if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { + throw new src_ParseError("\\verb assertion failed --\n please report what input caused this bug"); + } + + arg = arg.slice(1, -1); // remove first and last char + + return { + type: "verb", + mode: "text", + body: arg, + star: star + }; + } // At this point, we should have a symbol, possibly with accents. + // First expand any accented base symbol according to unicodeSymbols. + + + if (unicodeSymbols.hasOwnProperty(text[0]) && !src_symbols[this.mode][text[0]]) { + // This behavior is not strict (XeTeX-compatible) in math mode. + if (this.settings.strict && this.mode === "math") { + this.settings.reportNonstrict("unicodeTextInMathMode", "Accented Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); + } + + text = unicodeSymbols[text[0]] + text.substr(1); + } // Strip off any combining characters + + + var match = combiningDiacriticalMarksEndRegex.exec(text); + + if (match) { + text = text.substring(0, match.index); + + if (text === 'i') { + text = "\u0131"; // dotless i, in math and text mode + } else if (text === 'j') { + text = "\u0237"; // dotless j, in math and text mode + } + } // Recognize base symbol + + + var symbol; + + if (src_symbols[this.mode][text]) { + if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) { + this.settings.reportNonstrict("unicodeTextInMathMode", "Latin-1/Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); + } + + var group = src_symbols[this.mode][text].group; + var loc = SourceLocation.range(nucleus); + var s; + + if (ATOMS.hasOwnProperty(group)) { + // $FlowFixMe + var family = group; + s = { + type: "atom", + mode: this.mode, + family: family, + loc: loc, + text: text }; - res = parseArray(context.parser, res, dCellStyle(context.envName)); - if (delimiters) { - res = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("leftright", { - body: [res], - left: delimiters[0], - right: delimiters[1] - }, context.mode); + } else { + // $FlowFixMe + s = { + type: group, + mode: this.mode, + loc: loc, + text: text + }; + } + + symbol = s; + } else if (text.charCodeAt(0) >= 0x80) { + // no symbol for e.g. ^ + if (this.settings.strict) { + if (!supportedCodepoint(text.charCodeAt(0))) { + this.settings.reportNonstrict("unknownSymbol", "Unrecognized Unicode character \"" + text[0] + "\"" + (" (" + text.charCodeAt(0) + ")"), nucleus); + } else if (this.mode === "math") { + this.settings.reportNonstrict("unicodeTextInMathMode", "Unicode text character \"" + text[0] + "\" used in math mode", nucleus); } - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); + } -// A cases environment (in amsmath.sty) is almost equivalent to -// \def\arraystretch{1.2}% -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["cases", "dcases"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var res = { - type: "array", - arraystretch: 1.2, - cols: [{ - type: "align", - align: "l", - pregap: 0, - // TODO(kevinb) get the current style. - // For now we use the metrics for TEXT style which is what we were - // doing before. Before attempting to get the current style we - // should look at TeX's behavior especially for \over and matrices. - postgap: 1.0 /* 1em quad */ - }, { - type: "align", - align: "l", - pregap: 0, - postgap: 0 - }] - }; - res = parseArray(context.parser, res, dCellStyle(context.envName)); - res = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("leftright", { - body: [res], - left: "\\{", - right: "." - }, context.mode); - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// An aligned environment is like the align* environment -// except it operates within math mode. -// Note that we assume \nomallineskiplimit to be zero, -// so that \strut@ is the same as \strut. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["aligned"], - props: { - numArgs: 0 - }, - handler: alignedHandler, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["gathered"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var res = { - type: "array", - cols: [{ - type: "align", - align: "c" - }], - addJot: true - }; - res = parseArray(context.parser, res, "display"); - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust spacing between -// each columns. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["alignedat"], - // One for numbered and for unnumbered; - // but, KaTeX doesn't supports math numbering yet, - // they make no difference for now. - props: { - numArgs: 1 - }, - handler: alignedHandler, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 144 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(35); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Lexer__ = __webpack_require__(62); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Token__ = __webpack_require__(27); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__macros__ = __webpack_require__(146); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_object_assign__ = __webpack_require__(147); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_object_assign___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_object_assign__); - - - - -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - - - - - - - - -var MacroExpander = function () { - function MacroExpander(input, macros, mode) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, MacroExpander); - - this.lexer = new __WEBPACK_IMPORTED_MODULE_3__Lexer__["c" /* default */](input); - this.macros = __WEBPACK_IMPORTED_MODULE_7_object_assign___default()({}, __WEBPACK_IMPORTED_MODULE_5__macros__["a" /* default */], macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order + symbol = { + type: "textord", + mode: this.mode, + loc: SourceLocation.range(nucleus), + text: text + }; + } else { + return null; // EOF, ^, _, {, }, etc. } - /** - * Switches between "text" and "math" modes. - */ + this.consume(); // Transform combining characters into accents + if (match) { + for (var i = 0; i < match[0].length; i++) { + var accent = match[0][i]; - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(MacroExpander, [{ - key: "switchMode", - value: function switchMode(newMode) { - this.mode = newMode; + if (!unicodeAccents[accent]) { + throw new src_ParseError("Unknown accent ' " + accent + "'", nucleus); } - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ + var command = unicodeAccents[accent][this.mode]; - }, { - key: "future", - value: function future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - return this.stack[this.stack.length - 1]; + if (!command) { + throw new src_ParseError("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus); } - /** - * Remove and return the next unexpanded token. - */ + symbol = { + type: "accent", + mode: this.mode, + loc: SourceLocation.range(nucleus), + label: command, + isStretchy: false, + isShifty: true, + base: symbol + }; + } + } - }, { - key: "popToken", - value: function popToken() { - this.future(); // ensure non-empty stack - return this.stack.pop(); - } + return symbol; + }; - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - - }, { - key: "pushToken", - value: function pushToken(token) { - this.stack.push(token); - } - - /** - * Append an array of tokens to the token stack. - */ - - }, { - key: "pushTokens", - value: function pushTokens(tokens) { - var _stack; - - (_stack = this.stack).push.apply(_stack, __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default()(tokens)); - } - - /** - * Consume all following space tokens, without expansion. - */ - - }, { - key: "consumeSpaces", - value: function consumeSpaces() { - for (;;) { - var token = this.future(); - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - - /** - * Consume the specified number of arguments from the token stream, - * and return the resulting array of arguments. - */ - - }, { - key: "consumeArgs", - value: function consumeArgs(numArgs) { - var args = []; - // obtain arguments, either single token or balanced {…} group - for (var i = 0; i < numArgs; ++i) { - this.consumeSpaces(); // ignore spaces before each argument - var startOfArg = this.popToken(); - if (startOfArg.text === "{") { - var arg = []; - var depth = 1; - while (depth !== 0) { - var tok = this.popToken(); - arg.push(tok); - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - } else if (tok.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("End of input in macro argument", startOfArg); - } - } - arg.pop(); // remove last } - arg.reverse(); // like above, to fit in with stack order - args[i] = arg; - } else if (startOfArg.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("End of input expecting macro argument"); - } else { - args[i] = [startOfArg]; - } - } - return args; - } - - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order and will be returned as an array, - * also in reverse order. - * - * If not, the next token will be returned without removing it - * from the stack. This case can be detected by a `Token` return value - * instead of an `Array` return value. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty. - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * At the moment, macro expansion doesn't handle delimited macros, - * i.e. things like those defined by \def\foo#1\end{…}. - * See the TeX book page 202ff. for details on how those should behave. - */ - - }, { - key: "expandOnce", - value: function expandOnce() { - var topToken = this.popToken(); - var name = topToken.text; - var isMacro = name.charAt(0) === "\\"; - if (isMacro && __WEBPACK_IMPORTED_MODULE_3__Lexer__["b" /* controlWordRegex */].test(name)) { - // Consume all spaces after \macro (but not \\, \', etc.) - this.consumeSpaces(); - } - if (!this.macros.hasOwnProperty(name)) { - // Fully expanded - this.pushToken(topToken); - return topToken; - } - - var _getExpansion2 = this._getExpansion(name), - tokens = _getExpansion2.tokens, - numArgs = _getExpansion2.numArgs; - - var expansion = tokens; - if (numArgs) { - var args = this.consumeArgs(numArgs); - // paste arguments in place of the placeholders - expansion = expansion.slice(); // make a shallow copy - for (var i = expansion.length - 1; i >= 0; --i) { - var tok = expansion[i]; - if (tok.text === "#") { - if (i === 0) { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("Incomplete placeholder at end of macro body", tok); - } - tok = expansion[--i]; // next token on stack - if (tok.text === "#") { - // ## → # - expansion.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - var _expansion; - - // replace the placeholder with the indicated argument - (_expansion = expansion).splice.apply(_expansion, [i, 2].concat(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default()(args[+tok.text - 1]))); - } else { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("Not a valid argument number", tok); - } - } - } - } - // Concatenate expansion onto top of stack. - this.pushTokens(expansion); - return expansion; - } - - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - - }, { - key: "expandAfterFuture", - value: function expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - - /** - * Recursively expand first token, then return first non-expandable token. - */ - - }, { - key: "expandNextToken", - value: function expandNextToken() { - for (;;) { - var expanded = this.expandOnce(); - // expandOnce returns Token if and only if it's fully expanded. - if (expanded instanceof __WEBPACK_IMPORTED_MODULE_4__Token__["a" /* Token */]) { - // \relax stops the expansion, but shouldn't get returned (a - // null return value couldn't get implemented as a function). - if (expanded.text === "\\relax") { - this.stack.pop(); - } else { - return this.stack.pop(); // === expanded - } - } - } - - // Flow unable to figure out that this pathway is impossible. - // https://github.com/facebook/flow/issues/4808 - throw new Error(); // eslint-disable-line no-unreachable - } - - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. - * Caches macro expansions for those that were defined simple TeX strings. - */ - - }, { - key: "_getExpansion", - value: function _getExpansion(name) { - var definition = this.macros[name]; - var expansion = typeof definition === "function" ? definition(this) : definition; - if (typeof expansion === "string") { - var numArgs = 0; - if (expansion.indexOf("#") !== -1) { - var stripped = expansion.replace(/##/g, ""); - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - var bodyLexer = new __WEBPACK_IMPORTED_MODULE_3__Lexer__["c" /* default */](expansion); - var tokens = []; - var tok = bodyLexer.lex(); - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - tokens.reverse(); // to fit in with stack using push and pop - var expanded = { tokens: tokens, numArgs: numArgs }; - // Cannot cache a macro defined using a function since it relies on - // parser context. - if (typeof definition !== "function") { - this.macros[name] = expanded; - } - return expanded; - } - - return expansion; - } - }]); - - return MacroExpander; + return Parser; }(); -/* harmony default export */ __webpack_exports__["a"] = (MacroExpander); +Parser_Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"]; +Parser_Parser.endOfGroup = { + "[": "]", + "{": "}", + "\\begingroup": "\\endgroup" + /** + * Parses an "expression", which is a list of atoms. + * + * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This + * happens when functions have higher precendence han infix + * nodes in implicit parses. + * + * `breakOnTokenText`: The text of the token that the expression should end + * with, or `null` if something else should end the + * expression. + */ -/***/ }), -/* 145 */ -/***/ (function(module, exports) { +}; +Parser_Parser.SUPSUB_GREEDINESS = 1; -function getRelocatable(re) { - // In the future, this could use a WeakMap instead of an expando. - if (!re.__matchAtRelocatable) { - // Disjunctions are the lowest-precedence operator, so we can make any - // pattern match the empty string by appending `|()` to it: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-patterns - var source = re.source + '|()'; +// CONCATENATED MODULE: ./src/parseTree.js +/** + * Provides a single function for parsing an expression using a Parser + * TODO(emily): Remove this + */ - // We always make the new regex global. - var flags = 'g' + (re.ignoreCase ? 'i' : '') + (re.multiline ? 'm' : '') + (re.unicode ? 'u' : '') - // sticky (/.../y) doesn't make sense in conjunction with our relocation - // logic, so we ignore it here. - ; - re.__matchAtRelocatable = new RegExp(source, flags); - } - return re.__matchAtRelocatable; -} - -function matchAt(re, str, pos) { - if (re.global || re.sticky) { - throw new Error('matchAt(...): Only non-global regexes are supported'); - } - var reloc = getRelocatable(re); - reloc.lastIndex = pos; - var match = reloc.exec(str); - // Last capturing group is our sentinel that indicates whether the regex - // matched at the given location. - if (match[match.length - 1] == null) { - // Original regex matched. - match.length = match.length - 1; - return match; - } else { - return null; - } -} - -module.exports = matchAt; - -/***/ }), -/* 146 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* unused harmony export defineMacro */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__submodules_katex_fonts_fontMetricsData__ = __webpack_require__(59); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Token__ = __webpack_require__(27); /** - * Predefined macros for KaTeX. - * This can be used to define some commands in terms of others. + * Parses an expression using a Parser, then returns the parsed result. + */ +var parseTree_parseTree = function parseTree(toParse, settings) { + if (!(typeof toParse === 'string' || toParse instanceof String)) { + throw new TypeError('KaTeX can only parse string typed expression'); + } + + var parser = new Parser_Parser(toParse, settings); // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors + + delete parser.gullet.macros.current["\\df@tag"]; + var tree = parser.parse(); // If the input used \tag, it will set the \df@tag macro to the tag. + // In this case, we separately parse the tag and wrap the tree. + + if (parser.gullet.macros.get("\\df@tag")) { + if (!settings.displayMode) { + throw new src_ParseError("\\tag works only in display equations"); + } + + parser.gullet.feed("\\df@tag"); + tree = [{ + type: "tag", + mode: "text", + body: tree, + tag: parser.parse() + }]; + } + + return tree; +}; + +/* harmony default export */ var src_parseTree = (parseTree_parseTree); +// CONCATENATED MODULE: ./katex.js +/* eslint no-console:0 */ + +/** + * This is the main entry point for KaTeX. Here, we expose functions for + * rendering expressions either to DOM nodes or to markup strings. + * + * We also expose the ParseError class to check if errors thrown from KaTeX are + * errors in the expression, or errors in javascript handling. */ @@ -15295,852 +16613,197 @@ module.exports = matchAt; + + + + /** - * Provides context to macros defined by functions. Implemented by - * MacroExpander. + * Parse and build an expression, and place that expression in the DOM node + * given. + */ +var katex_render = function render(expression, baseNode, options) { + baseNode.textContent = ""; + var node = katex_renderToDomTree(expression, options).toNode(); + baseNode.appendChild(node); +}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and +// disable rendering. + + +if (typeof document !== "undefined") { + if (document.compatMode !== "CSS1Compat") { + typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype."); + + katex_render = function render() { + throw new src_ParseError("KaTeX doesn't work in quirks mode."); + }; + } +} +/** + * Parse and build an expression, and return the markup for that. */ -/** Macro tokens (in reverse order). */ +var renderToString = function renderToString(expression, options) { + var markup = katex_renderToDomTree(expression, options).toMarkup(); + return markup; +}; +/** + * Parse an expression and return the parse tree. + */ -var builtinMacros = {}; -/* harmony default export */ __webpack_exports__["a"] = (builtinMacros); +var katex_generateParseTree = function generateParseTree(expression, options) { + var settings = new src_Settings(options); + return src_parseTree(expression, settings); +}; +/** + * If the given error is a KaTeX ParseError and options.throwOnError is false, + * renders the invalid LaTeX as a span with hover title giving the KaTeX + * error message. Otherwise, simply throws the error. + */ -// This function might one day accept an additional argument and do more things. -function defineMacro(name, body) { - builtinMacros[name] = body; -} -////////////////////////////////////////////////////////////////////// -// macro tools +var katex_renderError = function renderError(error, expression, options) { + if (options.throwOnError || !(error instanceof src_ParseError)) { + throw error; + } -// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} -defineMacro("\\@firstoftwo", function (context) { - var args = context.consumeArgs(2); - return { tokens: args[0], numArgs: 0 }; -}); + var node = buildCommon.makeSpan(["katex-error"], [new domTree_SymbolNode(expression)]); + node.setAttribute("title", error.toString()); + node.setAttribute("style", "color:" + options.errorColor); + return node; +}; +/** + * Generates and returns the katex build tree. This is used for advanced + * use cases (like rendering to custom output). + */ -// LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} -defineMacro("\\@secondoftwo", function (context) { - var args = context.consumeArgs(2); - return { tokens: args[1], numArgs: 0 }; -}); -// LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol. If it matches #1, then the macro expands to #2; otherwise, #3. -// Note, however, that it does not consume the next symbol in either case. -defineMacro("\\@ifnextchar", function (context) { - var args = context.consumeArgs(3); // symbol, if, else - var nextToken = context.future(); - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { tokens: args[1], numArgs: 0 }; - } else { - return { tokens: args[2], numArgs: 0 }; - } -}); +var katex_renderToDomTree = function renderToDomTree(expression, options) { + var settings = new src_Settings(options); -// LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); + try { + var tree = src_parseTree(expression, settings); + return buildTree_buildTree(tree, expression, settings); + } catch (error) { + return katex_renderError(error, expression, settings); + } +}; +/** + * Generates and returns the katex build tree, with just HTML (no MathML). + * This is used for advanced use cases (like rendering to custom output). + */ -// LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode -defineMacro("\\TextOrMath", function (context) { - var args = context.consumeArgs(2); - if (context.mode === 'text') { - return { tokens: args[0], numArgs: 0 }; - } else { - return { tokens: args[1], numArgs: 0 }; - } -}); -////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); -defineMacro("\\begingroup", "{"); -defineMacro("\\endgroup", "}"); +var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) { + var settings = new src_Settings(options); -// Symbols from latex.ltx: -// \def\lq{`} -// \def\rq{'} -// \def\lbrack{[} -// \def\rbrack{]} -// \def \aa {\r a} -// \def \AA {\r A} -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\lbrack", "["); -defineMacro("\\rbrack", "]"); -defineMacro("\\aa", "\\r a"); -defineMacro("\\AA", "\\r A"); - -// Unicode double-struck letters -defineMacro("\u2102", "\\mathbb{C}"); -defineMacro("\u210D", "\\mathbb{H}"); -defineMacro("\u2115", "\\mathbb{N}"); -defineMacro("\u2119", "\\mathbb{P}"); -defineMacro("\u211A", "\\mathbb{Q}"); -defineMacro("\u211D", "\\mathbb{R}"); -defineMacro("\u2124", "\\mathbb{Z}"); - -// Unicode middle dot -// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays -// the dot at U+22C5 and gives it punct spacing. -defineMacro("\xB7", "\\cdotp"); - -// \llap and \rlap render their contents in text mode -defineMacro("\\llap", "\\mathllap{\\textrm{#1}}"); -defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}"); -defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); - -////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf - -// Italic Greek capital letters. AMS defines these with \DeclareMathSymbol, -// but they are equivalent to \mathit{\Letter}. -defineMacro("\\varGamma", "\\mathit{\\Gamma}"); -defineMacro("\\varDelta", "\\mathit{\\Delta}"); -defineMacro("\\varTheta", "\\mathit{\\Theta}"); -defineMacro("\\varLambda", "\\mathit{\\Lambda}"); -defineMacro("\\varXi", "\\mathit{\\Xi}"); -defineMacro("\\varPi", "\\mathit{\\Pi}"); -defineMacro("\\varSigma", "\\mathit{\\Sigma}"); -defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}"); -defineMacro("\\varPhi", "\\mathit{\\Phi}"); -defineMacro("\\varPsi", "\\mathit{\\Psi}"); -defineMacro("\\varOmega", "\\mathit{\\Omega}"); - -// \def\overset#1#2{\binrel@{#2}\binrel@@{\mathop{\kern\z@#2}\limits^{#1}}} -defineMacro("\\overset", "\\mathop{#2}\\limits^{#1}"); -defineMacro("\\underset", "\\mathop{#2}\\limits_{#1}"); - -// \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} -defineMacro("\\boxed", "\\fbox{\\displaystyle{#1}}"); - -// \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); - -// AMSMath's automatic \dots, based on \mdots@@ macro. -var dotsByToken = { - ',': '\\dotsc', - '\\not': '\\dotsb', - // \keybin@ checks for the following: - '+': '\\dotsb', - '=': '\\dotsb', - '<': '\\dotsb', - '>': '\\dotsb', - '-': '\\dotsb', - '*': '\\dotsb', - ':': '\\dotsb', - // Symbols whose definition starts with \DOTSB: - '\\DOTSB': '\\dotsb', - '\\coprod': '\\dotsb', - '\\bigvee': '\\dotsb', - '\\bigwedge': '\\dotsb', - '\\biguplus': '\\dotsb', - '\\bigcap': '\\dotsb', - '\\bigcup': '\\dotsb', - '\\prod': '\\dotsb', - '\\sum': '\\dotsb', - '\\bigotimes': '\\dotsb', - '\\bigoplus': '\\dotsb', - '\\bigodot': '\\dotsb', - '\\bigsqcup': '\\dotsb', - '\\implies': '\\dotsb', - '\\impliedby': '\\dotsb', - '\\And': '\\dotsb', - '\\longrightarrow': '\\dotsb', - '\\Longrightarrow': '\\dotsb', - '\\longleftarrow': '\\dotsb', - '\\Longleftarrow': '\\dotsb', - '\\longleftrightarrow': '\\dotsb', - '\\Longleftrightarrow': '\\dotsb', - '\\mapsto': '\\dotsb', - '\\longmapsto': '\\dotsb', - '\\hookrightarrow': '\\dotsb', - '\\iff': '\\dotsb', - '\\doteq': '\\dotsb', - // Symbols whose definition starts with \mathbin: - '\\mathbin': '\\dotsb', - '\\bmod': '\\dotsb', - // Symbols whose definition starts with \mathrel: - '\\mathrel': '\\dotsb', - '\\relbar': '\\dotsb', - '\\Relbar': '\\dotsb', - '\\xrightarrow': '\\dotsb', - '\\xleftarrow': '\\dotsb', - // Symbols whose definition starts with \DOTSI: - '\\DOTSI': '\\dotsi', - '\\int': '\\dotsi', - '\\oint': '\\dotsi', - '\\iint': '\\dotsi', - '\\iiint': '\\dotsi', - '\\iiiint': '\\dotsi', - '\\idotsint': '\\dotsi', - // Symbols whose definition starts with \DOTSX: - '\\DOTSX': '\\dotsx' + try { + var tree = src_parseTree(expression, settings); + return buildTree_buildHTMLTree(tree, expression, settings); + } catch (error) { + return katex_renderError(error, expression, settings); + } }; -defineMacro("\\dots", function (context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in KaTeX, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - var thedots = '\\dotso'; - var next = context.expandAfterFuture().text; - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.substr(0, 4) === '\\not') { - thedots = '\\dotsb'; - } else if (next in __WEBPACK_IMPORTED_MODULE_1__symbols__["a" /* default */].math) { - if (__WEBPACK_IMPORTED_MODULE_2__utils__["a" /* default */].contains(['bin', 'rel'], __WEBPACK_IMPORTED_MODULE_1__symbols__["a" /* default */].math[next].group)) { - thedots = '\\dotsb'; - } - } - return thedots; +/* harmony default export */ var katex_0 = ({ + /** + * Current KaTeX version + */ + version: "0.10.2", + + /** + * Renders the given LaTeX into an HTML+MathML combination, and adds + * it as a child to the specified DOM node. + */ + render: katex_render, + + /** + * Renders the given LaTeX into an HTML+MathML combination string, + * for sending to the client. + */ + renderToString: renderToString, + + /** + * KaTeX error, usually during parsing. + */ + ParseError: src_ParseError, + + /** + * Parses the given LaTeX into KaTeX's internal parse tree structure, + * without rendering to HTML or MathML. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __parse: katex_generateParseTree, + + /** + * Renders the given LaTeX into an HTML+MathML internal DOM tree + * representation, without flattening that representation to a string. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __renderToDomTree: katex_renderToDomTree, + + /** + * Renders the given LaTeX into an HTML internal DOM tree representation, + * without MathML and without flattening that representation to a string. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __renderToHTMLTree: katex_renderToHTMLTree, + + /** + * extends internal font metrics object with a new object + * each key in the new object represents a font name + */ + __setFontMetrics: setFontMetrics, + + /** + * adds a new symbol to builtin symbols table + */ + __defineSymbol: defineSymbol, + + /** + * adds a new macro to builtin macro list + */ + __defineMacro: defineMacro, + + /** + * Expose the dom tree node types, which can be useful for type checking nodes. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __domTree: { + Span: domTree_Span, + Anchor: domTree_Anchor, + SymbolNode: domTree_SymbolNode, + SvgNode: SvgNode, + PathNode: domTree_PathNode, + LineNode: LineNode + } }); - -var spaceAfterDots = { - // \rightdelim@ checks for the following: - ')': true, - ']': true, - '\\rbrack': true, - '\\}': true, - '\\rbrace': true, - '\\rangle': true, - '\\rceil': true, - '\\rfloor': true, - '\\rgroup': true, - '\\rmoustache': true, - '\\right': true, - '\\bigr': true, - '\\biggr': true, - '\\Bigr': true, - '\\Biggr': true, - // \extra@ also tests for the following: - '$': true, - // \extrap@ checks for the following: - ';': true, - '.': true, - ',': true -}; - -defineMacro("\\dotso", function (context) { - var next = context.future().text; - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\dotsc", function (context) { - var next = context.future().text; - // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - if (next in spaceAfterDots && next !== ',') { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\cdots", function (context) { - var next = context.future().text; - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); - -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); -// amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. -defineMacro("\\dotsx", "\\ldots\\,"); - -// \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); - -// http://texdoc.net/texmf-dist/doc/latex/amsmath/amsmath.pdf -defineMacro("\\thinspace", "\\,"); // \let\thinspace\, -defineMacro("\\medspace", "\\:"); // \let\medspace\: -defineMacro("\\thickspace", "\\;"); // \let\thickspace\; - -////////////////////////////////////////////////////////////////////// -// LaTeX source2e - -// \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't -// support \@ yet, so that's omitted, and we add \text so that the result -// doesn't look funny in math mode. -defineMacro("\\TeX", "\\textrm{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}"); - -// \DeclareRobustCommand{\LaTeX}{L\kern-.36em% -// {\sbox\z@ T% -// \vbox to\ht\z@{\hbox{\check@mathfonts -// \fontsize\sf@size\z@ -// \math@fontsfalse\selectfont -// A}% -// \vss}% -// }% -// \kern-.15em% -// \TeX} -// This code aligns the top of the A with the T (from the perspective of TeX's -// boxes, though visually the A appears to extend above slightly). -// We compute the corresponding \raisebox when A is rendered at \scriptsize, -// which is size3, which has a scale factor of 0.7 (see Options.js). -var latexRaiseA = __WEBPACK_IMPORTED_MODULE_0__submodules_katex_fonts_fontMetricsData__["a" /* default */]['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * __WEBPACK_IMPORTED_MODULE_0__submodules_katex_fonts_fontMetricsData__["a" /* default */]['Main-Regular']["A".charCodeAt(0)][1] + "em"; -defineMacro("\\LaTeX", "\\textrm{L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}" + "\\kern-.15em\\TeX}"); - -// New KaTeX logo based on tweaking LaTeX logo -defineMacro("\\KaTeX", "\\textrm{K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}" + "\\kern-.15em\\TeX}"); - -// \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// KaTeX doesn't do line breaks, so \hspace and \hspace* are the same as \kern -defineMacro("\\hspace", "\\@ifstar\\kern\\kern"); - -////////////////////////////////////////////////////////////////////// -// mathtools.sty - -//\providecommand\ordinarycolon{:} -defineMacro("\\ordinarycolon", ":"); -//\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} -//TODO(edemaine): Not yet centered. Fix via \raisebox or #726 -defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); -// \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon} -defineMacro("\\dblcolon", "\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon"); -// \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=} -defineMacro("\\coloneqq", "\\vcentcolon\\mathrel{\\mkern-1.2mu}="); -// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=} -defineMacro("\\Coloneqq", "\\dblcolon\\mathrel{\\mkern-1.2mu}="); -// \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\coloneq", "\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}"); -// \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\Coloneq", "\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}"); -// \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon} -defineMacro("\\eqqcolon", "=\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqqcolon", "=\\mathrel{\\mkern-1.2mu}\\dblcolon"); -// \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon} -defineMacro("\\eqcolon", "\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -// \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqcolon", "\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon"); -// \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\colonapprox", "\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx"); -// \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\Colonapprox", "\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx"); -// \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\colonsim", "\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim"); -// \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\Colonsim", "\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim"); - -// Some Unicode characters are implemented with macros to mathtools functions. -defineMacro("\u2254", "\\coloneqq"); // := -defineMacro("\u2255", "\\eqqcolon"); // =: -defineMacro("\u2A74", "\\Coloneqq"); // ::= - -////////////////////////////////////////////////////////////////////// -// colonequals.sty - -// Alternate names for mathtools's macros: -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); -// \colonapprox name is same in mathtools and colonequals. -defineMacro("\\coloncolonapprox", "\\Colonapprox"); -// \colonsim name is same in mathtools and colonequals. -defineMacro("\\coloncolonsim", "\\Colonsim"); - -// Additional macros, implemented by analogy with mathtools definitions: -defineMacro("\\simcolon", "\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -defineMacro("\\simcoloncolon", "\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon"); -defineMacro("\\approxcolon", "\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -defineMacro("\\approxcoloncolon", "\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon"); - -// Present in newtxmath, pxfonts and txfonts -// TODO: The unicode character U+220C ∌ should be added to the font, and this -// macro turned into a propper defineSymbol in symbols.js. That way, the -// MathML result will be much cleaner. -defineMacro("\\notni", "\\not\\ni"); -defineMacro("\\limsup", "\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"); -defineMacro("\\liminf", "\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"); - -/***/ }), -/* 147 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ +// CONCATENATED MODULE: ./katex.webpack.js +/** + * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2] + * doesn't support CSS modules natively, a separate entry point is used and + * it is not flowtyped. + * + * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef + * [2] https://facebook.github.io/jest/docs/en/webpack.html + */ -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; - - -/***/ }), -/* 148 */ -/***/ (function(module, exports) { - -// Mapping of Unicode accent characters to their LaTeX equivalent in text and -// math mode (when they exist). - -// NOTE: This module needs to be written with Node-style modules (not -// ES6 modules) so that unicodeMake.js (a Node application) can import it. -module.exports = { - '\u0301': { text: "\\'", math: '\\acute' }, - '\u0300': { text: '\\`', math: '\\grave' }, - '\u0308': { text: '\\"', math: '\\ddot' }, - '\u0303': { text: '\\~', math: '\\tilde' }, - '\u0304': { text: '\\=', math: '\\bar' }, - '\u0306': { text: '\\u', math: '\\breve' }, - '\u030C': { text: '\\v', math: '\\check' }, - '\u0302': { text: '\\^', math: '\\hat' }, - '\u0307': { text: '\\.', math: '\\dot' }, - '\u030A': { text: '\\r', math: '\\mathring' }, - '\u030B': { text: '\\H' } -}; - -/***/ }), -/* 149 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -// This file is GENERATED by unicodeMake.js. DO NOT MODIFY. - -/* harmony default export */ __webpack_exports__["a"] = ({ - "\xE1": "a\u0301", // á = \'{a} - "\xE0": "a\u0300", // à = \`{a} - "\xE4": "a\u0308", // ä = \"{a} - "\u01DF": "a\u0308\u0304", // ǟ = \"\={a} - "\xE3": "a\u0303", // ã = \~{a} - "\u0101": "a\u0304", // ā = \={a} - "\u0103": "a\u0306", // ă = \u{a} - "\u1EAF": "a\u0306\u0301", // ắ = \u\'{a} - "\u1EB1": "a\u0306\u0300", // ằ = \u\`{a} - "\u1EB5": "a\u0306\u0303", // ẵ = \u\~{a} - "\u01CE": "a\u030C", // ǎ = \v{a} - "\xE2": "a\u0302", // â = \^{a} - "\u1EA5": "a\u0302\u0301", // ấ = \^\'{a} - "\u1EA7": "a\u0302\u0300", // ầ = \^\`{a} - "\u1EAB": "a\u0302\u0303", // ẫ = \^\~{a} - "\u0227": "a\u0307", // ȧ = \.{a} - "\u01E1": "a\u0307\u0304", // ǡ = \.\={a} - "\xE5": "a\u030A", // å = \r{a} - "\u01FB": "a\u030A\u0301", // ǻ = \r\'{a} - "\u1E03": "b\u0307", // ḃ = \.{b} - "\u0107": "c\u0301", // ć = \'{c} - "\u010D": "c\u030C", // č = \v{c} - "\u0109": "c\u0302", // ĉ = \^{c} - "\u010B": "c\u0307", // ċ = \.{c} - "\u010F": "d\u030C", // ď = \v{d} - "\u1E0B": "d\u0307", // ḋ = \.{d} - "\xE9": "e\u0301", // é = \'{e} - "\xE8": "e\u0300", // è = \`{e} - "\xEB": "e\u0308", // ë = \"{e} - "\u1EBD": "e\u0303", // ẽ = \~{e} - "\u0113": "e\u0304", // ē = \={e} - "\u1E17": "e\u0304\u0301", // ḗ = \=\'{e} - "\u1E15": "e\u0304\u0300", // ḕ = \=\`{e} - "\u0115": "e\u0306", // ĕ = \u{e} - "\u011B": "e\u030C", // ě = \v{e} - "\xEA": "e\u0302", // ê = \^{e} - "\u1EBF": "e\u0302\u0301", // ế = \^\'{e} - "\u1EC1": "e\u0302\u0300", // ề = \^\`{e} - "\u1EC5": "e\u0302\u0303", // ễ = \^\~{e} - "\u0117": "e\u0307", // ė = \.{e} - "\u1E1F": "f\u0307", // ḟ = \.{f} - "\u01F5": "g\u0301", // ǵ = \'{g} - "\u1E21": "g\u0304", // ḡ = \={g} - "\u011F": "g\u0306", // ğ = \u{g} - "\u01E7": "g\u030C", // ǧ = \v{g} - "\u011D": "g\u0302", // ĝ = \^{g} - "\u0121": "g\u0307", // ġ = \.{g} - "\u1E27": "h\u0308", // ḧ = \"{h} - "\u021F": "h\u030C", // ȟ = \v{h} - "\u0125": "h\u0302", // ĥ = \^{h} - "\u1E23": "h\u0307", // ḣ = \.{h} - "\xED": "i\u0301", // í = \'{i} - "\xEC": "i\u0300", // ì = \`{i} - "\xEF": "i\u0308", // ï = \"{i} - "\u1E2F": "i\u0308\u0301", // ḯ = \"\'{i} - "\u0129": "i\u0303", // ĩ = \~{i} - "\u012B": "i\u0304", // ī = \={i} - "\u012D": "i\u0306", // ĭ = \u{i} - "\u01D0": "i\u030C", // ǐ = \v{i} - "\xEE": "i\u0302", // î = \^{i} - "\u01F0": "j\u030C", // ǰ = \v{j} - "\u0135": "j\u0302", // ĵ = \^{j} - "\u1E31": "k\u0301", // ḱ = \'{k} - "\u01E9": "k\u030C", // ǩ = \v{k} - "\u013A": "l\u0301", // ĺ = \'{l} - "\u013E": "l\u030C", // ľ = \v{l} - "\u1E3F": "m\u0301", // ḿ = \'{m} - "\u1E41": "m\u0307", // ṁ = \.{m} - "\u0144": "n\u0301", // ń = \'{n} - "\u01F9": "n\u0300", // ǹ = \`{n} - "\xF1": "n\u0303", // ñ = \~{n} - "\u0148": "n\u030C", // ň = \v{n} - "\u1E45": "n\u0307", // ṅ = \.{n} - "\xF3": "o\u0301", // ó = \'{o} - "\xF2": "o\u0300", // ò = \`{o} - "\xF6": "o\u0308", // ö = \"{o} - "\u022B": "o\u0308\u0304", // ȫ = \"\={o} - "\xF5": "o\u0303", // õ = \~{o} - "\u1E4D": "o\u0303\u0301", // ṍ = \~\'{o} - "\u1E4F": "o\u0303\u0308", // ṏ = \~\"{o} - "\u022D": "o\u0303\u0304", // ȭ = \~\={o} - "\u014D": "o\u0304", // ō = \={o} - "\u1E53": "o\u0304\u0301", // ṓ = \=\'{o} - "\u1E51": "o\u0304\u0300", // ṑ = \=\`{o} - "\u014F": "o\u0306", // ŏ = \u{o} - "\u01D2": "o\u030C", // ǒ = \v{o} - "\xF4": "o\u0302", // ô = \^{o} - "\u1ED1": "o\u0302\u0301", // ố = \^\'{o} - "\u1ED3": "o\u0302\u0300", // ồ = \^\`{o} - "\u1ED7": "o\u0302\u0303", // ỗ = \^\~{o} - "\u022F": "o\u0307", // ȯ = \.{o} - "\u0231": "o\u0307\u0304", // ȱ = \.\={o} - "\u0151": "o\u030B", // ő = \H{o} - "\u1E55": "p\u0301", // ṕ = \'{p} - "\u1E57": "p\u0307", // ṗ = \.{p} - "\u0155": "r\u0301", // ŕ = \'{r} - "\u0159": "r\u030C", // ř = \v{r} - "\u1E59": "r\u0307", // ṙ = \.{r} - "\u015B": "s\u0301", // ś = \'{s} - "\u1E65": "s\u0301\u0307", // ṥ = \'\.{s} - "\u0161": "s\u030C", // š = \v{s} - "\u1E67": "s\u030C\u0307", // ṧ = \v\.{s} - "\u015D": "s\u0302", // ŝ = \^{s} - "\u1E61": "s\u0307", // ṡ = \.{s} - "\u1E97": "t\u0308", // ẗ = \"{t} - "\u0165": "t\u030C", // ť = \v{t} - "\u1E6B": "t\u0307", // ṫ = \.{t} - "\xFA": "u\u0301", // ú = \'{u} - "\xF9": "u\u0300", // ù = \`{u} - "\xFC": "u\u0308", // ü = \"{u} - "\u01D8": "u\u0308\u0301", // ǘ = \"\'{u} - "\u01DC": "u\u0308\u0300", // ǜ = \"\`{u} - "\u01D6": "u\u0308\u0304", // ǖ = \"\={u} - "\u01DA": "u\u0308\u030C", // ǚ = \"\v{u} - "\u0169": "u\u0303", // ũ = \~{u} - "\u1E79": "u\u0303\u0301", // ṹ = \~\'{u} - "\u016B": "u\u0304", // ū = \={u} - "\u1E7B": "u\u0304\u0308", // ṻ = \=\"{u} - "\u016D": "u\u0306", // ŭ = \u{u} - "\u01D4": "u\u030C", // ǔ = \v{u} - "\xFB": "u\u0302", // û = \^{u} - "\u016F": "u\u030A", // ů = \r{u} - "\u0171": "u\u030B", // ű = \H{u} - "\u1E7D": "v\u0303", // ṽ = \~{v} - "\u1E83": "w\u0301", // ẃ = \'{w} - "\u1E81": "w\u0300", // ẁ = \`{w} - "\u1E85": "w\u0308", // ẅ = \"{w} - "\u0175": "w\u0302", // ŵ = \^{w} - "\u1E87": "w\u0307", // ẇ = \.{w} - "\u1E98": "w\u030A", // ẘ = \r{w} - "\u1E8D": "x\u0308", // ẍ = \"{x} - "\u1E8B": "x\u0307", // ẋ = \.{x} - "\xFD": "y\u0301", // ý = \'{y} - "\u1EF3": "y\u0300", // ỳ = \`{y} - "\xFF": "y\u0308", // ÿ = \"{y} - "\u1EF9": "y\u0303", // ỹ = \~{y} - "\u0233": "y\u0304", // ȳ = \={y} - "\u0177": "y\u0302", // ŷ = \^{y} - "\u1E8F": "y\u0307", // ẏ = \.{y} - "\u1E99": "y\u030A", // ẙ = \r{y} - "\u017A": "z\u0301", // ź = \'{z} - "\u017E": "z\u030C", // ž = \v{z} - "\u1E91": "z\u0302", // ẑ = \^{z} - "\u017C": "z\u0307", // ż = \.{z} - "\xC1": "A\u0301", // Á = \'{A} - "\xC0": "A\u0300", // À = \`{A} - "\xC4": "A\u0308", // Ä = \"{A} - "\u01DE": "A\u0308\u0304", // Ǟ = \"\={A} - "\xC3": "A\u0303", // Ã = \~{A} - "\u0100": "A\u0304", // Ā = \={A} - "\u0102": "A\u0306", // Ă = \u{A} - "\u1EAE": "A\u0306\u0301", // Ắ = \u\'{A} - "\u1EB0": "A\u0306\u0300", // Ằ = \u\`{A} - "\u1EB4": "A\u0306\u0303", // Ẵ = \u\~{A} - "\u01CD": "A\u030C", // Ǎ = \v{A} - "\xC2": "A\u0302", // Â = \^{A} - "\u1EA4": "A\u0302\u0301", // Ấ = \^\'{A} - "\u1EA6": "A\u0302\u0300", // Ầ = \^\`{A} - "\u1EAA": "A\u0302\u0303", // Ẫ = \^\~{A} - "\u0226": "A\u0307", // Ȧ = \.{A} - "\u01E0": "A\u0307\u0304", // Ǡ = \.\={A} - "\xC5": "A\u030A", // Å = \r{A} - "\u01FA": "A\u030A\u0301", // Ǻ = \r\'{A} - "\u1E02": "B\u0307", // Ḃ = \.{B} - "\u0106": "C\u0301", // Ć = \'{C} - "\u010C": "C\u030C", // Č = \v{C} - "\u0108": "C\u0302", // Ĉ = \^{C} - "\u010A": "C\u0307", // Ċ = \.{C} - "\u010E": "D\u030C", // Ď = \v{D} - "\u1E0A": "D\u0307", // Ḋ = \.{D} - "\xC9": "E\u0301", // É = \'{E} - "\xC8": "E\u0300", // È = \`{E} - "\xCB": "E\u0308", // Ë = \"{E} - "\u1EBC": "E\u0303", // Ẽ = \~{E} - "\u0112": "E\u0304", // Ē = \={E} - "\u1E16": "E\u0304\u0301", // Ḗ = \=\'{E} - "\u1E14": "E\u0304\u0300", // Ḕ = \=\`{E} - "\u0114": "E\u0306", // Ĕ = \u{E} - "\u011A": "E\u030C", // Ě = \v{E} - "\xCA": "E\u0302", // Ê = \^{E} - "\u1EBE": "E\u0302\u0301", // Ế = \^\'{E} - "\u1EC0": "E\u0302\u0300", // Ề = \^\`{E} - "\u1EC4": "E\u0302\u0303", // Ễ = \^\~{E} - "\u0116": "E\u0307", // Ė = \.{E} - "\u1E1E": "F\u0307", // Ḟ = \.{F} - "\u01F4": "G\u0301", // Ǵ = \'{G} - "\u1E20": "G\u0304", // Ḡ = \={G} - "\u011E": "G\u0306", // Ğ = \u{G} - "\u01E6": "G\u030C", // Ǧ = \v{G} - "\u011C": "G\u0302", // Ĝ = \^{G} - "\u0120": "G\u0307", // Ġ = \.{G} - "\u1E26": "H\u0308", // Ḧ = \"{H} - "\u021E": "H\u030C", // Ȟ = \v{H} - "\u0124": "H\u0302", // Ĥ = \^{H} - "\u1E22": "H\u0307", // Ḣ = \.{H} - "\xCD": "I\u0301", // Í = \'{I} - "\xCC": "I\u0300", // Ì = \`{I} - "\xCF": "I\u0308", // Ï = \"{I} - "\u1E2E": "I\u0308\u0301", // Ḯ = \"\'{I} - "\u0128": "I\u0303", // Ĩ = \~{I} - "\u012A": "I\u0304", // Ī = \={I} - "\u012C": "I\u0306", // Ĭ = \u{I} - "\u01CF": "I\u030C", // Ǐ = \v{I} - "\xCE": "I\u0302", // Î = \^{I} - "\u0130": "I\u0307", // İ = \.{I} - "\u0134": "J\u0302", // Ĵ = \^{J} - "\u1E30": "K\u0301", // Ḱ = \'{K} - "\u01E8": "K\u030C", // Ǩ = \v{K} - "\u0139": "L\u0301", // Ĺ = \'{L} - "\u013D": "L\u030C", // Ľ = \v{L} - "\u1E3E": "M\u0301", // Ḿ = \'{M} - "\u1E40": "M\u0307", // Ṁ = \.{M} - "\u0143": "N\u0301", // Ń = \'{N} - "\u01F8": "N\u0300", // Ǹ = \`{N} - "\xD1": "N\u0303", // Ñ = \~{N} - "\u0147": "N\u030C", // Ň = \v{N} - "\u1E44": "N\u0307", // Ṅ = \.{N} - "\xD3": "O\u0301", // Ó = \'{O} - "\xD2": "O\u0300", // Ò = \`{O} - "\xD6": "O\u0308", // Ö = \"{O} - "\u022A": "O\u0308\u0304", // Ȫ = \"\={O} - "\xD5": "O\u0303", // Õ = \~{O} - "\u1E4C": "O\u0303\u0301", // Ṍ = \~\'{O} - "\u1E4E": "O\u0303\u0308", // Ṏ = \~\"{O} - "\u022C": "O\u0303\u0304", // Ȭ = \~\={O} - "\u014C": "O\u0304", // Ō = \={O} - "\u1E52": "O\u0304\u0301", // Ṓ = \=\'{O} - "\u1E50": "O\u0304\u0300", // Ṑ = \=\`{O} - "\u014E": "O\u0306", // Ŏ = \u{O} - "\u01D1": "O\u030C", // Ǒ = \v{O} - "\xD4": "O\u0302", // Ô = \^{O} - "\u1ED0": "O\u0302\u0301", // Ố = \^\'{O} - "\u1ED2": "O\u0302\u0300", // Ồ = \^\`{O} - "\u1ED6": "O\u0302\u0303", // Ỗ = \^\~{O} - "\u022E": "O\u0307", // Ȯ = \.{O} - "\u0230": "O\u0307\u0304", // Ȱ = \.\={O} - "\u0150": "O\u030B", // Ő = \H{O} - "\u1E54": "P\u0301", // Ṕ = \'{P} - "\u1E56": "P\u0307", // Ṗ = \.{P} - "\u0154": "R\u0301", // Ŕ = \'{R} - "\u0158": "R\u030C", // Ř = \v{R} - "\u1E58": "R\u0307", // Ṙ = \.{R} - "\u015A": "S\u0301", // Ś = \'{S} - "\u1E64": "S\u0301\u0307", // Ṥ = \'\.{S} - "\u0160": "S\u030C", // Š = \v{S} - "\u1E66": "S\u030C\u0307", // Ṧ = \v\.{S} - "\u015C": "S\u0302", // Ŝ = \^{S} - "\u1E60": "S\u0307", // Ṡ = \.{S} - "\u0164": "T\u030C", // Ť = \v{T} - "\u1E6A": "T\u0307", // Ṫ = \.{T} - "\xDA": "U\u0301", // Ú = \'{U} - "\xD9": "U\u0300", // Ù = \`{U} - "\xDC": "U\u0308", // Ü = \"{U} - "\u01D7": "U\u0308\u0301", // Ǘ = \"\'{U} - "\u01DB": "U\u0308\u0300", // Ǜ = \"\`{U} - "\u01D5": "U\u0308\u0304", // Ǖ = \"\={U} - "\u01D9": "U\u0308\u030C", // Ǚ = \"\v{U} - "\u0168": "U\u0303", // Ũ = \~{U} - "\u1E78": "U\u0303\u0301", // Ṹ = \~\'{U} - "\u016A": "U\u0304", // Ū = \={U} - "\u1E7A": "U\u0304\u0308", // Ṻ = \=\"{U} - "\u016C": "U\u0306", // Ŭ = \u{U} - "\u01D3": "U\u030C", // Ǔ = \v{U} - "\xDB": "U\u0302", // Û = \^{U} - "\u016E": "U\u030A", // Ů = \r{U} - "\u0170": "U\u030B", // Ű = \H{U} - "\u1E7C": "V\u0303", // Ṽ = \~{V} - "\u1E82": "W\u0301", // Ẃ = \'{W} - "\u1E80": "W\u0300", // Ẁ = \`{W} - "\u1E84": "W\u0308", // Ẅ = \"{W} - "\u0174": "W\u0302", // Ŵ = \^{W} - "\u1E86": "W\u0307", // Ẇ = \.{W} - "\u1E8C": "X\u0308", // Ẍ = \"{X} - "\u1E8A": "X\u0307", // Ẋ = \.{X} - "\xDD": "Y\u0301", // Ý = \'{Y} - "\u1EF2": "Y\u0300", // Ỳ = \`{Y} - "\u0178": "Y\u0308", // Ÿ = \"{Y} - "\u1EF8": "Y\u0303", // Ỹ = \~{Y} - "\u0232": "Y\u0304", // Ȳ = \={Y} - "\u0176": "Y\u0302", // Ŷ = \^{Y} - "\u1E8E": "Y\u0307", // Ẏ = \.{Y} - "\u0179": "Z\u0301", // Ź = \'{Z} - "\u017D": "Z\u030C", // Ž = \v{Z} - "\u1E90": "Z\u0302", // Ẑ = \^{Z} - "\u017B": "Z\u0307", // Ż = \.{Z} - "\u03AC": "\u03B1\u0301", // ά = \'{α} - "\u1F70": "\u03B1\u0300", // ὰ = \`{α} - "\u1FB1": "\u03B1\u0304", // ᾱ = \={α} - "\u1FB0": "\u03B1\u0306", // ᾰ = \u{α} - "\u03AD": "\u03B5\u0301", // έ = \'{ε} - "\u1F72": "\u03B5\u0300", // ὲ = \`{ε} - "\u03AE": "\u03B7\u0301", // ή = \'{η} - "\u1F74": "\u03B7\u0300", // ὴ = \`{η} - "\u03AF": "\u03B9\u0301", // ί = \'{ι} - "\u1F76": "\u03B9\u0300", // ὶ = \`{ι} - "\u03CA": "\u03B9\u0308", // ϊ = \"{ι} - "\u0390": "\u03B9\u0308\u0301", // ΐ = \"\'{ι} - "\u1FD2": "\u03B9\u0308\u0300", // ῒ = \"\`{ι} - "\u1FD1": "\u03B9\u0304", // ῑ = \={ι} - "\u1FD0": "\u03B9\u0306", // ῐ = \u{ι} - "\u03CC": "\u03BF\u0301", // ό = \'{ο} - "\u1F78": "\u03BF\u0300", // ὸ = \`{ο} - "\u03CD": "\u03C5\u0301", // ύ = \'{υ} - "\u1F7A": "\u03C5\u0300", // ὺ = \`{υ} - "\u03CB": "\u03C5\u0308", // ϋ = \"{υ} - "\u03B0": "\u03C5\u0308\u0301", // ΰ = \"\'{υ} - "\u1FE2": "\u03C5\u0308\u0300", // ῢ = \"\`{υ} - "\u1FE1": "\u03C5\u0304", // ῡ = \={υ} - "\u1FE0": "\u03C5\u0306", // ῠ = \u{υ} - "\u03CE": "\u03C9\u0301", // ώ = \'{ω} - "\u1F7C": "\u03C9\u0300", // ὼ = \`{ω} - "\u038E": "\u03A5\u0301", // Ύ = \'{Υ} - "\u1FEA": "\u03A5\u0300", // Ὺ = \`{Υ} - "\u03AB": "\u03A5\u0308", // Ϋ = \"{Υ} - "\u1FE9": "\u03A5\u0304", // Ῡ = \={Υ} - "\u1FE8": "\u03A5\u0306", // Ῠ = \u{Υ} - "\u038F": "\u03A9\u0301", // Ώ = \'{Ω} - "\u1FFA": "\u03A9\u0300" // Ὼ = \`{Ω} -}); +/* harmony default export */ var katex_webpack = __webpack_exports__["default"] = (katex_0); /***/ }) /******/ ])["default"]; -}); \ No newline at end of file +}); diff --git a/plugins/tiddlywiki/katex/files/katex.min.css b/plugins/tiddlywiki/katex/files/katex.min.css index 7d6908e63..c804fc128 100644 --- a/plugins/tiddlywiki/katex/files/katex.min.css +++ b/plugins/tiddlywiki/katex/files/katex.min.css @@ -1 +1 @@ -@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-mathml{border:0;clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{border-right:.05em solid;display:inline-block;margin:0 -.025em;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;fill:currentColor;fill-opacity:1;fill-rule:nonzero;height:inherit;position:absolute;stroke:currentColor;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:1;width:100%}.katex svg path{stroke:none}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox{border:.04em solid #000;box-sizing:border-box}.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0} +@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.10.2"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} diff --git a/plugins/tiddlywiki/katex/files/katex.min.js b/plugins/tiddlywiki/katex/files/katex.min.js index 0d338475b..80045b56d 100644 --- a/plugins/tiddlywiki/katex/files/katex.min.js +++ b/plugins/tiddlywiki/katex/files/katex.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,function(){return function(r){var n={};function i(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return i.m=r,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)i.d(r,n,function(e){return t[e]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=2)}([function(e,t,r){},,function(e,t,r){"use strict";r.r(t);r(0);var p=function(){function r(e,t,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=t,this.end=r}return r.prototype.getSource=function(){return this.lexer.input.slice(this.start,this.end)},r.range=function(e,t){return t?e&&e.loc&&t.loc&&e.loc.lexer===t.loc.lexer?new r(e.loc.lexer,e.loc.start,t.loc.end):null:e&&e.loc},r}(),a=function(){function r(e,t){this.text=void 0,this.loc=void 0,this.text=e,this.loc=t}return r.prototype.range=function(e,t){return new r(t,p.range(this,e))},r}(),n=function e(t,r){this.position=void 0;var n,i="KaTeX parse error: "+t,a=r&&r.loc;if(a&&a.start<=a.end){var o=a.lexer.input;n=a.start;var s=a.end;n===o.length?i+=" at end of input: ":i+=" at position "+(n+1)+": ";var l=o.slice(n,s).replace(/[^]/g,"$&\u0332");i+=(15<n?"\u2026"+o.slice(n-15,n):o.slice(0,n))+l+(s+15<o.length?o.slice(s,s+15)+"\u2026":o.slice(s))}var h=new Error(i);return h.name="ParseError",h.__proto__=e.prototype,h.position=n,h};n.prototype.__proto__=Error.prototype;var X=n,i=/([A-Z])/g,o={"&":"&",">":">","<":"<",'"':""","'":"'"},s=/[&><"']/g;var l=function e(t){return"ordgroup"===t.type?1===t.body.length?e(t.body[0]):t:"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},T=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},Y={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(s,function(e){return o[e]})},hyphenate:function(e){return e.replace(i,"-$1").toLowerCase()},getBaseElem:l,isCharacterBox:function(e){var t=l(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type}},h=function(){function e(e){this.displayMode=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.allowedProtocols=void 0,e=e||{},this.displayMode=Y.deflt(e.displayMode,!1),this.throwOnError=Y.deflt(e.throwOnError,!0),this.errorColor=Y.deflt(e.errorColor,"#cc0000"),this.macros=e.macros||{},this.colorIsTextColor=Y.deflt(e.colorIsTextColor,!1),this.strict=Y.deflt(e.strict,"warn"),this.maxSize=Math.max(0,Y.deflt(e.maxSize,1/0)),this.maxExpand=Math.max(0,Y.deflt(e.maxExpand,1e3)),this.allowedProtocols=Y.deflt(e.allowedProtocols,["http","https","mailto","_relative"])}var t=e.prototype;return t.reportNonstrict=function(e,t,r){var n=this.strict;if("function"==typeof n&&(n=n(e,t,r)),n&&"ignore"!==n){if(!0===n||"error"===n)throw new X("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]")}},t.useStrictBehavior=function(e,t,r){var n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1))},e}(),m=function(){function e(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}var t=e.prototype;return t.sup=function(){return c[u[this.id]]},t.sub=function(){return c[d[this.id]]},t.fracNum=function(){return c[f[this.id]]},t.fracDen=function(){return c[g[this.id]]},t.cramp=function(){return c[v[this.id]]},t.text=function(){return c[y[this.id]]},t.isTight=function(){return 2<=this.size},e}(),c=[new m(0,0,!1),new m(1,0,!0),new m(2,1,!1),new m(3,1,!0),new m(4,2,!1),new m(5,2,!0),new m(6,3,!1),new m(7,3,!0)],u=[4,5,4,5,6,7,6,7],d=[5,5,5,5,7,7,7,7],f=[2,3,4,5,6,7,6,7],g=[3,3,5,5,7,7,7,7],v=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],q={DISPLAY:c[0],TEXT:c[2],SCRIPT:c[4],SCRIPTSCRIPT:c[6]},b=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var x=[];function w(e){for(var t=0;t<x.length;t+=2)if(e>=x[t]&&e<=x[t+1])return!0;return!1}b.forEach(function(e){return e.blocks.forEach(function(e){return x.push.apply(x,e)})});var k={path:{sqrtMain:"M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\ns-65,47,-65,47z M834 80H400000v40H845z",sqrtSize1:"M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\ns76,-59,76,-59s76,-60,76,-60z M1001 80H40000v40H1012z",sqrtSize2:"M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\nM1001 80H400000v40H1013z",sqrtSize3:"M424,2478c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M1001 80H400000v40H1014z",sqrtSize4:"M473,2793c339.3,-1799.3,509.3,-2700,510,-2702\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\nM1001 80H400000v40H1017z",doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 241v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"}},A=function(){function e(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var t=e.prototype;return t.hasClass=function(e){return Y.contains(this.classes,e)},t.toNode=function(){for(var e=document.createDocumentFragment(),t=0;t<this.children.length;t++)e.appendChild(this.children[t].toNode());return e},t.toMarkup=function(){for(var e="",t=0;t<this.children.length;t++)e+=this.children[t].toMarkup();return e},t.toText=function(){var e=function(e){return e.toText()};return this.children.map(e).join("")},e}(),S=function(e){return e.filter(function(e){return e}).join(" ")},z=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},M=function(e){var t=document.createElement(e);for(var r in t.className=S(this.classes),this.style)this.style.hasOwnProperty(r)&&(t.style[r]=this.style[r]);for(var n in this.attributes)this.attributes.hasOwnProperty(n)&&t.setAttribute(n,this.attributes[n]);for(var i=0;i<this.children.length;i++)t.appendChild(this.children[i].toNode());return t},B=function(e){var t="<"+e;this.classes.length&&(t+=' class="'+Y.escape(S(this.classes))+'"');var r="";for(var n in this.style)this.style.hasOwnProperty(n)&&(r+=Y.hyphenate(n)+":"+this.style[n]+";");for(var i in r&&(t+=' style="'+Y.escape(r)+'"'),this.attributes)this.attributes.hasOwnProperty(i)&&(t+=" "+i+'="'+Y.escape(this.attributes[i])+'"');t+=">";for(var a=0;a<this.children.length;a++)t+=this.children[a].toMarkup();return t+="</"+e+">"},C=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,z.call(this,e,r,n),this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return Y.contains(this.classes,e)},t.toNode=function(){return M.call(this,"span")},t.toMarkup=function(){return B.call(this,"span")},e}(),N=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,z.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return Y.contains(this.classes,e)},t.toNode=function(){return M.call(this,"a")},t.toMarkup=function(){return B.call(this,"a")},e}(),E={"\xee":"\u0131\u0302","\xef":"\u0131\u0308","\xed":"\u0131\u0301","\xec":"\u0131\u0300"},O=function(){function e(e,t,r,n,i,a,o,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=e,this.height=t||0,this.depth=r||0,this.italic=n||0,this.skew=i||0,this.width=a||0,this.classes=o||[],this.style=s||{},this.maxFontSize=0;var l=function(e){for(var t=0;t<b.length;t++)for(var r=b[t],n=0;n<r.blocks.length;n++){var i=r.blocks[n];if(e>=i[0]&&e<=i[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=E[this.text])}var t=e.prototype;return t.hasClass=function(e){return Y.contains(this.classes,e)},t.toNode=function(){var e=document.createTextNode(this.text),t=null;for(var r in 0<this.italic&&((t=document.createElement("span")).style.marginRight=this.italic+"em"),0<this.classes.length&&((t=t||document.createElement("span")).className=S(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e},t.toMarkup=function(){var e=!1,t="<span";this.classes.length&&(e=!0,t+=' class="',t+=Y.escape(S(this.classes)),t+='"');var r="";for(var n in 0<this.italic&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(n)&&(r+=Y.hyphenate(n)+":"+this.style[n]+";");r&&(e=!0,t+=' style="'+Y.escape(r)+'"');var i=Y.escape(this.text);return e?(t+=">",t+=i,t+="</span>"):i},e}(),I=function(){function e(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r<this.children.length;r++)e.appendChild(this.children[r].toNode());return e},t.toMarkup=function(){var e="<svg";for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&(e+=" "+t+"='"+this.attributes[t]+"'");e+=">";for(var r=0;r<this.children.length;r++)e+=this.children[r].toMarkup();return e+="</svg>"},e}(),R=function(){function e(e,t){this.pathName=void 0,this.alternate=void 0,this.pathName=e,this.alternate=t}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?e.setAttribute("d",this.alternate):e.setAttribute("d",k.path[this.pathName]),e},t.toMarkup=function(){return this.alternate?"<path d='"+this.alternate+"'/>":"<path d='"+k.path[this.pathName]+"'/>"},e}(),L=function(){function e(e){this.attributes=void 0,this.attributes=e||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e},t.toMarkup=function(){var e="<line";for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&(e+=" "+t+"='"+this.attributes[t]+"'");return e+="/>"},e}();var H={"AMS-Regular":{65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473]},"Fraktur-Regular":{33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],824:[.19444,.69444,0,0,0],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444]},"Main-BoldItalic":{33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],163:[0,.69444,0,0,.86853],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],163:[0,.69444,0,0,.76909],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],305:[0,.43056,0,.02778,.32246],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],567:[.19444,.43056,0,.08334,.38403],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],824:[.19444,.69444,0,0,0],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,1],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.67,0,0,.778],8800:[.215,.716,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.744,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.744,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778]},"Math-BoldItalic":{47:[.19444,.69444,0,0,0],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333]},"Math-Italic":{47:[.19444,.69444,0,0,0],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"Math-Regular":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"SansSerif-Bold":{33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212]},"Size1-Regular":{40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},D={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2]},P={"\xc5":"A","\xc7":"C","\xd0":"D","\xde":"o","\xe5":"a","\xe7":"c","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function F(e,t,r){if(!H[t])throw new Error("Font metrics not found for font: "+t+".");var n=e.charCodeAt(0);e[0]in P&&(n=P[e[0]].charCodeAt(0));var i=H[t][n];if(i||"text"!==r||w(n)&&(i=H[t][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}var V={};var U={bin:1,close:1,inner:1,open:1,punct:1,rel:1},G={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},_={math:{},text:{}},W=_;function j(e,t,r,n,i,a){_[e][i]={font:t,group:r,replace:n},a&&n&&(_[e][n]=_[e][i])}var $="math",Z="text",K="main",J="ams",Q="accent-token",ee="bin",te="close",re="inner",ne="mathord",ie="op-token",ae="open",oe="punct",se="rel",le="spacing",he="textord";j($,K,se,"\u2261","\\equiv",!0),j($,K,se,"\u227a","\\prec",!0),j($,K,se,"\u227b","\\succ",!0),j($,K,se,"\u223c","\\sim",!0),j($,K,se,"\u22a5","\\perp"),j($,K,se,"\u2aaf","\\preceq",!0),j($,K,se,"\u2ab0","\\succeq",!0),j($,K,se,"\u2243","\\simeq",!0),j($,K,se,"\u2223","\\mid",!0),j($,K,se,"\u226a","\\ll",!0),j($,K,se,"\u226b","\\gg",!0),j($,K,se,"\u224d","\\asymp",!0),j($,K,se,"\u2225","\\parallel"),j($,K,se,"\u22c8","\\bowtie",!0),j($,K,se,"\u2323","\\smile",!0),j($,K,se,"\u2291","\\sqsubseteq",!0),j($,K,se,"\u2292","\\sqsupseteq",!0),j($,K,se,"\u2250","\\doteq",!0),j($,K,se,"\u2322","\\frown",!0),j($,K,se,"\u220b","\\ni",!0),j($,K,se,"\u221d","\\propto",!0),j($,K,se,"\u22a2","\\vdash",!0),j($,K,se,"\u22a3","\\dashv",!0),j($,K,se,"\u220b","\\owns"),j($,K,oe,".","\\ldotp"),j($,K,oe,"\u22c5","\\cdotp"),j($,K,he,"#","\\#"),j(Z,K,he,"#","\\#"),j($,K,he,"&","\\&"),j(Z,K,he,"&","\\&"),j($,K,he,"\u2135","\\aleph",!0),j($,K,he,"\u2200","\\forall",!0),j($,K,he,"\u210f","\\hbar",!0),j($,K,he,"\u2203","\\exists",!0),j($,K,he,"\u2207","\\nabla",!0),j($,K,he,"\u266d","\\flat",!0),j($,K,he,"\u2113","\\ell",!0),j($,K,he,"\u266e","\\natural",!0),j($,K,he,"\u2663","\\clubsuit",!0),j($,K,he,"\u2118","\\wp",!0),j($,K,he,"\u266f","\\sharp",!0),j($,K,he,"\u2662","\\diamondsuit",!0),j($,K,he,"\u211c","\\Re",!0),j($,K,he,"\u2661","\\heartsuit",!0),j($,K,he,"\u2111","\\Im",!0),j($,K,he,"\u2660","\\spadesuit",!0),j(Z,K,he,"\xa7","\\S",!0),j(Z,K,he,"\xb6","\\P",!0),j($,K,he,"\u2020","\\dag"),j(Z,K,he,"\u2020","\\dag"),j(Z,K,he,"\u2020","\\textdagger"),j($,K,he,"\u2021","\\ddag"),j(Z,K,he,"\u2021","\\ddag"),j(Z,K,he,"\u2021","\\textdaggerdbl"),j($,K,te,"\u23b1","\\rmoustache",!0),j($,K,ae,"\u23b0","\\lmoustache",!0),j($,K,te,"\u27ef","\\rgroup",!0),j($,K,ae,"\u27ee","\\lgroup",!0),j($,K,ee,"\u2213","\\mp",!0),j($,K,ee,"\u2296","\\ominus",!0),j($,K,ee,"\u228e","\\uplus",!0),j($,K,ee,"\u2293","\\sqcap",!0),j($,K,ee,"\u2217","\\ast"),j($,K,ee,"\u2294","\\sqcup",!0),j($,K,ee,"\u25ef","\\bigcirc"),j($,K,ee,"\u2219","\\bullet"),j($,K,ee,"\u2021","\\ddagger"),j($,K,ee,"\u2240","\\wr",!0),j($,K,ee,"\u2a3f","\\amalg"),j($,K,ee,"&","\\And"),j($,K,se,"\u27f5","\\longleftarrow",!0),j($,K,se,"\u21d0","\\Leftarrow",!0),j($,K,se,"\u27f8","\\Longleftarrow",!0),j($,K,se,"\u27f6","\\longrightarrow",!0),j($,K,se,"\u21d2","\\Rightarrow",!0),j($,K,se,"\u27f9","\\Longrightarrow",!0),j($,K,se,"\u2194","\\leftrightarrow",!0),j($,K,se,"\u27f7","\\longleftrightarrow",!0),j($,K,se,"\u21d4","\\Leftrightarrow",!0),j($,K,se,"\u27fa","\\Longleftrightarrow",!0),j($,K,se,"\u21a6","\\mapsto",!0),j($,K,se,"\u27fc","\\longmapsto",!0),j($,K,se,"\u2197","\\nearrow",!0),j($,K,se,"\u21a9","\\hookleftarrow",!0),j($,K,se,"\u21aa","\\hookrightarrow",!0),j($,K,se,"\u2198","\\searrow",!0),j($,K,se,"\u21bc","\\leftharpoonup",!0),j($,K,se,"\u21c0","\\rightharpoonup",!0),j($,K,se,"\u2199","\\swarrow",!0),j($,K,se,"\u21bd","\\leftharpoondown",!0),j($,K,se,"\u21c1","\\rightharpoondown",!0),j($,K,se,"\u2196","\\nwarrow",!0),j($,K,se,"\u21cc","\\rightleftharpoons",!0),j($,J,se,"\u226e","\\nless",!0),j($,J,se,"\ue010","\\nleqslant"),j($,J,se,"\ue011","\\nleqq"),j($,J,se,"\u2a87","\\lneq",!0),j($,J,se,"\u2268","\\lneqq",!0),j($,J,se,"\ue00c","\\lvertneqq"),j($,J,se,"\u22e6","\\lnsim",!0),j($,J,se,"\u2a89","\\lnapprox",!0),j($,J,se,"\u2280","\\nprec",!0),j($,J,se,"\u22e0","\\npreceq",!0),j($,J,se,"\u22e8","\\precnsim",!0),j($,J,se,"\u2ab9","\\precnapprox",!0),j($,J,se,"\u2241","\\nsim",!0),j($,J,se,"\ue006","\\nshortmid"),j($,J,se,"\u2224","\\nmid",!0),j($,J,se,"\u22ac","\\nvdash",!0),j($,J,se,"\u22ad","\\nvDash",!0),j($,J,se,"\u22ea","\\ntriangleleft"),j($,J,se,"\u22ec","\\ntrianglelefteq",!0),j($,J,se,"\u228a","\\subsetneq",!0),j($,J,se,"\ue01a","\\varsubsetneq"),j($,J,se,"\u2acb","\\subsetneqq",!0),j($,J,se,"\ue017","\\varsubsetneqq"),j($,J,se,"\u226f","\\ngtr",!0),j($,J,se,"\ue00f","\\ngeqslant"),j($,J,se,"\ue00e","\\ngeqq"),j($,J,se,"\u2a88","\\gneq",!0),j($,J,se,"\u2269","\\gneqq",!0),j($,J,se,"\ue00d","\\gvertneqq"),j($,J,se,"\u22e7","\\gnsim",!0),j($,J,se,"\u2a8a","\\gnapprox",!0),j($,J,se,"\u2281","\\nsucc",!0),j($,J,se,"\u22e1","\\nsucceq",!0),j($,J,se,"\u22e9","\\succnsim",!0),j($,J,se,"\u2aba","\\succnapprox",!0),j($,J,se,"\u2246","\\ncong",!0),j($,J,se,"\ue007","\\nshortparallel"),j($,J,se,"\u2226","\\nparallel",!0),j($,J,se,"\u22af","\\nVDash",!0),j($,J,se,"\u22eb","\\ntriangleright"),j($,J,se,"\u22ed","\\ntrianglerighteq",!0),j($,J,se,"\ue018","\\nsupseteqq"),j($,J,se,"\u228b","\\supsetneq",!0),j($,J,se,"\ue01b","\\varsupsetneq"),j($,J,se,"\u2acc","\\supsetneqq",!0),j($,J,se,"\ue019","\\varsupsetneqq"),j($,J,se,"\u22ae","\\nVdash",!0),j($,J,se,"\u2ab5","\\precneqq",!0),j($,J,se,"\u2ab6","\\succneqq",!0),j($,J,se,"\ue016","\\nsubseteqq"),j($,J,ee,"\u22b4","\\unlhd"),j($,J,ee,"\u22b5","\\unrhd"),j($,J,se,"\u219a","\\nleftarrow",!0),j($,J,se,"\u219b","\\nrightarrow",!0),j($,J,se,"\u21cd","\\nLeftarrow",!0),j($,J,se,"\u21cf","\\nRightarrow",!0),j($,J,se,"\u21ae","\\nleftrightarrow",!0),j($,J,se,"\u21ce","\\nLeftrightarrow",!0),j($,J,se,"\u25b3","\\vartriangle"),j($,J,he,"\u210f","\\hslash"),j($,J,he,"\u25bd","\\triangledown"),j($,J,he,"\u25ca","\\lozenge"),j($,J,he,"\u24c8","\\circledS"),j($,J,he,"\xae","\\circledR"),j(Z,J,he,"\xae","\\circledR"),j($,J,he,"\u2221","\\measuredangle",!0),j($,J,he,"\u2204","\\nexists"),j($,J,he,"\u2127","\\mho"),j($,J,he,"\u2132","\\Finv",!0),j($,J,he,"\u2141","\\Game",!0),j($,J,he,"k","\\Bbbk"),j($,J,he,"\u2035","\\backprime"),j($,J,he,"\u25b2","\\blacktriangle"),j($,J,he,"\u25bc","\\blacktriangledown"),j($,J,he,"\u25a0","\\blacksquare"),j($,J,he,"\u29eb","\\blacklozenge"),j($,J,he,"\u2605","\\bigstar"),j($,J,he,"\u2222","\\sphericalangle",!0),j($,J,he,"\u2201","\\complement",!0),j($,J,he,"\xf0","\\eth",!0),j($,J,he,"\u2571","\\diagup"),j($,J,he,"\u2572","\\diagdown"),j($,J,he,"\u25a1","\\square"),j($,J,he,"\u25a1","\\Box"),j($,J,he,"\u25ca","\\Diamond"),j($,J,he,"\xa5","\\yen",!0),j(Z,J,he,"\xa5","\\yen",!0),j($,J,he,"\u2713","\\checkmark",!0),j(Z,J,he,"\u2713","\\checkmark"),j($,J,he,"\u2136","\\beth",!0),j($,J,he,"\u2138","\\daleth",!0),j($,J,he,"\u2137","\\gimel",!0),j($,J,he,"\u03dd","\\digamma"),j($,J,he,"\u03f0","\\varkappa"),j($,J,ae,"\u250c","\\ulcorner",!0),j($,J,te,"\u2510","\\urcorner",!0),j($,J,ae,"\u2514","\\llcorner",!0),j($,J,te,"\u2518","\\lrcorner",!0),j($,J,se,"\u2266","\\leqq",!0),j($,J,se,"\u2a7d","\\leqslant",!0),j($,J,se,"\u2a95","\\eqslantless",!0),j($,J,se,"\u2272","\\lesssim",!0),j($,J,se,"\u2a85","\\lessapprox",!0),j($,J,se,"\u224a","\\approxeq",!0),j($,J,ee,"\u22d6","\\lessdot"),j($,J,se,"\u22d8","\\lll",!0),j($,J,se,"\u2276","\\lessgtr",!0),j($,J,se,"\u22da","\\lesseqgtr",!0),j($,J,se,"\u2a8b","\\lesseqqgtr",!0),j($,J,se,"\u2251","\\doteqdot"),j($,J,se,"\u2253","\\risingdotseq",!0),j($,J,se,"\u2252","\\fallingdotseq",!0),j($,J,se,"\u223d","\\backsim",!0),j($,J,se,"\u22cd","\\backsimeq",!0),j($,J,se,"\u2ac5","\\subseteqq",!0),j($,J,se,"\u22d0","\\Subset",!0),j($,J,se,"\u228f","\\sqsubset",!0),j($,J,se,"\u227c","\\preccurlyeq",!0),j($,J,se,"\u22de","\\curlyeqprec",!0),j($,J,se,"\u227e","\\precsim",!0),j($,J,se,"\u2ab7","\\precapprox",!0),j($,J,se,"\u22b2","\\vartriangleleft"),j($,J,se,"\u22b4","\\trianglelefteq"),j($,J,se,"\u22a8","\\vDash",!0),j($,J,se,"\u22aa","\\Vvdash",!0),j($,J,se,"\u2323","\\smallsmile"),j($,J,se,"\u2322","\\smallfrown"),j($,J,se,"\u224f","\\bumpeq",!0),j($,J,se,"\u224e","\\Bumpeq",!0),j($,J,se,"\u2267","\\geqq",!0),j($,J,se,"\u2a7e","\\geqslant",!0),j($,J,se,"\u2a96","\\eqslantgtr",!0),j($,J,se,"\u2273","\\gtrsim",!0),j($,J,se,"\u2a86","\\gtrapprox",!0),j($,J,ee,"\u22d7","\\gtrdot"),j($,J,se,"\u22d9","\\ggg",!0),j($,J,se,"\u2277","\\gtrless",!0),j($,J,se,"\u22db","\\gtreqless",!0),j($,J,se,"\u2a8c","\\gtreqqless",!0),j($,J,se,"\u2256","\\eqcirc",!0),j($,J,se,"\u2257","\\circeq",!0),j($,J,se,"\u225c","\\triangleq",!0),j($,J,se,"\u223c","\\thicksim"),j($,J,se,"\u2248","\\thickapprox"),j($,J,se,"\u2ac6","\\supseteqq",!0),j($,J,se,"\u22d1","\\Supset",!0),j($,J,se,"\u2290","\\sqsupset",!0),j($,J,se,"\u227d","\\succcurlyeq",!0),j($,J,se,"\u22df","\\curlyeqsucc",!0),j($,J,se,"\u227f","\\succsim",!0),j($,J,se,"\u2ab8","\\succapprox",!0),j($,J,se,"\u22b3","\\vartriangleright"),j($,J,se,"\u22b5","\\trianglerighteq"),j($,J,se,"\u22a9","\\Vdash",!0),j($,J,se,"\u2223","\\shortmid"),j($,J,se,"\u2225","\\shortparallel"),j($,J,se,"\u226c","\\between",!0),j($,J,se,"\u22d4","\\pitchfork",!0),j($,J,se,"\u221d","\\varpropto"),j($,J,se,"\u25c0","\\blacktriangleleft"),j($,J,se,"\u2234","\\therefore",!0),j($,J,se,"\u220d","\\backepsilon"),j($,J,se,"\u25b6","\\blacktriangleright"),j($,J,se,"\u2235","\\because",!0),j($,J,se,"\u22d8","\\llless"),j($,J,se,"\u22d9","\\gggtr"),j($,J,ee,"\u22b2","\\lhd"),j($,J,ee,"\u22b3","\\rhd"),j($,J,se,"\u2242","\\eqsim",!0),j($,K,se,"\u22c8","\\Join"),j($,J,se,"\u2251","\\Doteq",!0),j($,J,ee,"\u2214","\\dotplus",!0),j($,J,ee,"\u2216","\\smallsetminus"),j($,J,ee,"\u22d2","\\Cap",!0),j($,J,ee,"\u22d3","\\Cup",!0),j($,J,ee,"\u2a5e","\\doublebarwedge",!0),j($,J,ee,"\u229f","\\boxminus",!0),j($,J,ee,"\u229e","\\boxplus",!0),j($,J,ee,"\u22c7","\\divideontimes",!0),j($,J,ee,"\u22c9","\\ltimes",!0),j($,J,ee,"\u22ca","\\rtimes",!0),j($,J,ee,"\u22cb","\\leftthreetimes",!0),j($,J,ee,"\u22cc","\\rightthreetimes",!0),j($,J,ee,"\u22cf","\\curlywedge",!0),j($,J,ee,"\u22ce","\\curlyvee",!0),j($,J,ee,"\u229d","\\circleddash",!0),j($,J,ee,"\u229b","\\circledast",!0),j($,J,ee,"\u22c5","\\centerdot"),j($,J,ee,"\u22ba","\\intercal",!0),j($,J,ee,"\u22d2","\\doublecap"),j($,J,ee,"\u22d3","\\doublecup"),j($,J,ee,"\u22a0","\\boxtimes",!0),j($,J,se,"\u21e2","\\dashrightarrow",!0),j($,J,se,"\u21e0","\\dashleftarrow",!0),j($,J,se,"\u21c7","\\leftleftarrows",!0),j($,J,se,"\u21c6","\\leftrightarrows",!0),j($,J,se,"\u21da","\\Lleftarrow",!0),j($,J,se,"\u219e","\\twoheadleftarrow",!0),j($,J,se,"\u21a2","\\leftarrowtail",!0),j($,J,se,"\u21ab","\\looparrowleft",!0),j($,J,se,"\u21cb","\\leftrightharpoons",!0),j($,J,se,"\u21b6","\\curvearrowleft",!0),j($,J,se,"\u21ba","\\circlearrowleft",!0),j($,J,se,"\u21b0","\\Lsh",!0),j($,J,se,"\u21c8","\\upuparrows",!0),j($,J,se,"\u21bf","\\upharpoonleft",!0),j($,J,se,"\u21c3","\\downharpoonleft",!0),j($,J,se,"\u22b8","\\multimap",!0),j($,J,se,"\u21ad","\\leftrightsquigarrow",!0),j($,J,se,"\u21c9","\\rightrightarrows",!0),j($,J,se,"\u21c4","\\rightleftarrows",!0),j($,J,se,"\u21a0","\\twoheadrightarrow",!0),j($,J,se,"\u21a3","\\rightarrowtail",!0),j($,J,se,"\u21ac","\\looparrowright",!0),j($,J,se,"\u21b7","\\curvearrowright",!0),j($,J,se,"\u21bb","\\circlearrowright",!0),j($,J,se,"\u21b1","\\Rsh",!0),j($,J,se,"\u21ca","\\downdownarrows",!0),j($,J,se,"\u21be","\\upharpoonright",!0),j($,J,se,"\u21c2","\\downharpoonright",!0),j($,J,se,"\u21dd","\\rightsquigarrow",!0),j($,J,se,"\u21dd","\\leadsto"),j($,J,se,"\u21db","\\Rrightarrow",!0),j($,J,se,"\u21be","\\restriction"),j($,K,he,"\u2018","`"),j($,K,he,"$","\\$"),j(Z,K,he,"$","\\$"),j(Z,K,he,"$","\\textdollar"),j($,K,he,"%","\\%"),j(Z,K,he,"%","\\%"),j($,K,he,"_","\\_"),j(Z,K,he,"_","\\_"),j(Z,K,he,"_","\\textunderscore"),j($,K,he,"\u2220","\\angle",!0),j($,K,he,"\u221e","\\infty",!0),j($,K,he,"\u2032","\\prime"),j($,K,he,"\u25b3","\\triangle"),j($,K,he,"\u0393","\\Gamma",!0),j($,K,he,"\u0394","\\Delta",!0),j($,K,he,"\u0398","\\Theta",!0),j($,K,he,"\u039b","\\Lambda",!0),j($,K,he,"\u039e","\\Xi",!0),j($,K,he,"\u03a0","\\Pi",!0),j($,K,he,"\u03a3","\\Sigma",!0),j($,K,he,"\u03a5","\\Upsilon",!0),j($,K,he,"\u03a6","\\Phi",!0),j($,K,he,"\u03a8","\\Psi",!0),j($,K,he,"\u03a9","\\Omega",!0),j($,K,he,"A","\u0391"),j($,K,he,"B","\u0392"),j($,K,he,"E","\u0395"),j($,K,he,"Z","\u0396"),j($,K,he,"H","\u0397"),j($,K,he,"I","\u0399"),j($,K,he,"K","\u039a"),j($,K,he,"M","\u039c"),j($,K,he,"N","\u039d"),j($,K,he,"O","\u039f"),j($,K,he,"P","\u03a1"),j($,K,he,"T","\u03a4"),j($,K,he,"X","\u03a7"),j($,K,he,"\xac","\\neg",!0),j($,K,he,"\xac","\\lnot"),j($,K,he,"\u22a4","\\top"),j($,K,he,"\u22a5","\\bot"),j($,K,he,"\u2205","\\emptyset"),j($,J,he,"\u2205","\\varnothing"),j($,K,ne,"\u03b1","\\alpha",!0),j($,K,ne,"\u03b2","\\beta",!0),j($,K,ne,"\u03b3","\\gamma",!0),j($,K,ne,"\u03b4","\\delta",!0),j($,K,ne,"\u03f5","\\epsilon",!0),j($,K,ne,"\u03b6","\\zeta",!0),j($,K,ne,"\u03b7","\\eta",!0),j($,K,ne,"\u03b8","\\theta",!0),j($,K,ne,"\u03b9","\\iota",!0),j($,K,ne,"\u03ba","\\kappa",!0),j($,K,ne,"\u03bb","\\lambda",!0),j($,K,ne,"\u03bc","\\mu",!0),j($,K,ne,"\u03bd","\\nu",!0),j($,K,ne,"\u03be","\\xi",!0),j($,K,ne,"\u03bf","\\omicron",!0),j($,K,ne,"\u03c0","\\pi",!0),j($,K,ne,"\u03c1","\\rho",!0),j($,K,ne,"\u03c3","\\sigma",!0),j($,K,ne,"\u03c4","\\tau",!0),j($,K,ne,"\u03c5","\\upsilon",!0),j($,K,ne,"\u03d5","\\phi",!0),j($,K,ne,"\u03c7","\\chi",!0),j($,K,ne,"\u03c8","\\psi",!0),j($,K,ne,"\u03c9","\\omega",!0),j($,K,ne,"\u03b5","\\varepsilon",!0),j($,K,ne,"\u03d1","\\vartheta",!0),j($,K,ne,"\u03d6","\\varpi",!0),j($,K,ne,"\u03f1","\\varrho",!0),j($,K,ne,"\u03c2","\\varsigma",!0),j($,K,ne,"\u03c6","\\varphi",!0),j($,K,ee,"\u2217","*"),j($,K,ee,"+","+"),j($,K,ee,"\u2212","-"),j($,K,ee,"\u22c5","\\cdot",!0),j($,K,ee,"\u2218","\\circ"),j($,K,ee,"\xf7","\\div",!0),j($,K,ee,"\xb1","\\pm",!0),j($,K,ee,"\xd7","\\times",!0),j($,K,ee,"\u2229","\\cap",!0),j($,K,ee,"\u222a","\\cup",!0),j($,K,ee,"\u2216","\\setminus"),j($,K,ee,"\u2227","\\land"),j($,K,ee,"\u2228","\\lor"),j($,K,ee,"\u2227","\\wedge",!0),j($,K,ee,"\u2228","\\vee",!0),j($,K,he,"\u221a","\\surd"),j($,K,ae,"(","("),j($,K,ae,"[","["),j($,K,ae,"\u27e8","\\langle",!0),j($,K,ae,"\u2223","\\lvert"),j($,K,ae,"\u2225","\\lVert"),j($,K,te,")",")"),j($,K,te,"]","]"),j($,K,te,"?","?"),j($,K,te,"!","!"),j($,K,te,"\u27e9","\\rangle",!0),j($,K,te,"\u2223","\\rvert"),j($,K,te,"\u2225","\\rVert"),j($,K,se,"=","="),j($,K,se,"<","<"),j($,K,se,">",">"),j($,K,se,":",":"),j($,K,se,"\u2248","\\approx",!0),j($,K,se,"\u2245","\\cong",!0),j($,K,se,"\u2265","\\ge"),j($,K,se,"\u2265","\\geq",!0),j($,K,se,"\u2190","\\gets"),j($,K,se,">","\\gt"),j($,K,se,"\u2208","\\in",!0),j($,K,se,"\u0338","\\@not"),j($,K,se,"\u2282","\\subset",!0),j($,K,se,"\u2283","\\supset",!0),j($,K,se,"\u2286","\\subseteq",!0),j($,K,se,"\u2287","\\supseteq",!0),j($,J,se,"\u2288","\\nsubseteq",!0),j($,J,se,"\u2289","\\nsupseteq",!0),j($,K,se,"\u22a8","\\models"),j($,K,se,"\u2190","\\leftarrow",!0),j($,K,se,"\u2264","\\le"),j($,K,se,"\u2264","\\leq",!0),j($,K,se,"<","\\lt"),j($,K,se,"\u2192","\\rightarrow",!0),j($,K,se,"\u2192","\\to"),j($,J,se,"\u2271","\\ngeq",!0),j($,J,se,"\u2270","\\nleq",!0),j($,K,le,"\xa0","\\ "),j($,K,le,"\xa0","~"),j($,K,le,"\xa0","\\space"),j($,K,le,"\xa0","\\nobreakspace"),j(Z,K,le,"\xa0","\\ "),j(Z,K,le,"\xa0","~"),j(Z,K,le,"\xa0","\\space"),j(Z,K,le,"\xa0","\\nobreakspace"),j($,K,le,null,"\\nobreak"),j($,K,le,null,"\\allowbreak"),j($,K,oe,",",","),j($,K,oe,";",";"),j($,J,ee,"\u22bc","\\barwedge",!0),j($,J,ee,"\u22bb","\\veebar",!0),j($,K,ee,"\u2299","\\odot",!0),j($,K,ee,"\u2295","\\oplus",!0),j($,K,ee,"\u2297","\\otimes",!0),j($,K,he,"\u2202","\\partial",!0),j($,K,ee,"\u2298","\\oslash",!0),j($,J,ee,"\u229a","\\circledcirc",!0),j($,J,ee,"\u22a1","\\boxdot",!0),j($,K,ee,"\u25b3","\\bigtriangleup"),j($,K,ee,"\u25bd","\\bigtriangledown"),j($,K,ee,"\u2020","\\dagger"),j($,K,ee,"\u22c4","\\diamond"),j($,K,ee,"\u22c6","\\star"),j($,K,ee,"\u25c3","\\triangleleft"),j($,K,ee,"\u25b9","\\triangleright"),j($,K,ae,"{","\\{"),j(Z,K,he,"{","\\{"),j(Z,K,he,"{","\\textbraceleft"),j($,K,te,"}","\\}"),j(Z,K,he,"}","\\}"),j(Z,K,he,"}","\\textbraceright"),j($,K,ae,"{","\\lbrace"),j($,K,te,"}","\\rbrace"),j($,K,ae,"[","\\lbrack"),j(Z,K,he,"[","\\lbrack"),j($,K,te,"]","\\rbrack"),j(Z,K,he,"]","\\rbrack"),j($,K,ae,"(","\\lparen"),j($,K,te,")","\\rparen"),j(Z,K,he,"<","\\textless"),j(Z,K,he,">","\\textgreater"),j($,K,ae,"\u230a","\\lfloor",!0),j($,K,te,"\u230b","\\rfloor",!0),j($,K,ae,"\u2308","\\lceil",!0),j($,K,te,"\u2309","\\rceil",!0),j($,K,he,"\\","\\backslash"),j($,K,he,"\u2223","|"),j($,K,he,"\u2223","\\vert"),j(Z,K,he,"|","\\textbar"),j($,K,he,"\u2225","\\|"),j($,K,he,"\u2225","\\Vert"),j(Z,K,he,"\u2225","\\textbardbl"),j(Z,K,he,"~","\\textasciitilde"),j($,K,se,"\u2191","\\uparrow",!0),j($,K,se,"\u21d1","\\Uparrow",!0),j($,K,se,"\u2193","\\downarrow",!0),j($,K,se,"\u21d3","\\Downarrow",!0),j($,K,se,"\u2195","\\updownarrow",!0),j($,K,se,"\u21d5","\\Updownarrow",!0),j($,K,ie,"\u2210","\\coprod"),j($,K,ie,"\u22c1","\\bigvee"),j($,K,ie,"\u22c0","\\bigwedge"),j($,K,ie,"\u2a04","\\biguplus"),j($,K,ie,"\u22c2","\\bigcap"),j($,K,ie,"\u22c3","\\bigcup"),j($,K,ie,"\u222b","\\int"),j($,K,ie,"\u222b","\\intop"),j($,K,ie,"\u222c","\\iint"),j($,K,ie,"\u222d","\\iiint"),j($,K,ie,"\u220f","\\prod"),j($,K,ie,"\u2211","\\sum"),j($,K,ie,"\u2a02","\\bigotimes"),j($,K,ie,"\u2a01","\\bigoplus"),j($,K,ie,"\u2a00","\\bigodot"),j($,K,ie,"\u222e","\\oint"),j($,K,ie,"\u222f","\\oiint"),j($,K,ie,"\u2230","\\oiiint"),j($,K,ie,"\u2a06","\\bigsqcup"),j($,K,ie,"\u222b","\\smallint"),j(Z,K,re,"\u2026","\\textellipsis"),j($,K,re,"\u2026","\\mathellipsis"),j(Z,K,re,"\u2026","\\ldots",!0),j($,K,re,"\u2026","\\ldots",!0),j($,K,re,"\u22ef","\\@cdots",!0),j($,K,re,"\u22f1","\\ddots",!0),j($,K,he,"\u22ee","\\varvdots"),j($,K,Q,"\u02ca","\\acute"),j($,K,Q,"\u02cb","\\grave"),j($,K,Q,"\xa8","\\ddot"),j($,K,Q,"~","\\tilde"),j($,K,Q,"\u02c9","\\bar"),j($,K,Q,"\u02d8","\\breve"),j($,K,Q,"\u02c7","\\check"),j($,K,Q,"^","\\hat"),j($,K,Q,"\u20d7","\\vec"),j($,K,Q,"\u02d9","\\dot"),j($,K,Q,"\u02da","\\mathring"),j($,K,ne,"\u0131","\\imath",!0),j($,K,ne,"\u0237","\\jmath",!0),j(Z,K,he,"\u0131","\\i",!0),j(Z,K,he,"\u0237","\\j",!0),j(Z,K,he,"\xdf","\\ss",!0),j(Z,K,he,"\xe6","\\ae",!0),j(Z,K,he,"\xe6","\\ae",!0),j(Z,K,he,"\u0153","\\oe",!0),j(Z,K,he,"\xf8","\\o",!0),j(Z,K,he,"\xc6","\\AE",!0),j(Z,K,he,"\u0152","\\OE",!0),j(Z,K,he,"\xd8","\\O",!0),j(Z,K,Q,"\u02ca","\\'"),j(Z,K,Q,"\u02cb","\\`"),j(Z,K,Q,"\u02c6","\\^"),j(Z,K,Q,"\u02dc","\\~"),j(Z,K,Q,"\u02c9","\\="),j(Z,K,Q,"\u02d8","\\u"),j(Z,K,Q,"\u02d9","\\."),j(Z,K,Q,"\u02da","\\r"),j(Z,K,Q,"\u02c7","\\v"),j(Z,K,Q,"\xa8",'\\"'),j(Z,K,Q,"\u02dd","\\H"),j(Z,K,Q,"\u25ef","\\textcircled");var me={"--":!0,"---":!0,"``":!0,"''":!0};j(Z,K,he,"\u2013","--"),j(Z,K,he,"\u2013","\\textendash"),j(Z,K,he,"\u2014","---"),j(Z,K,he,"\u2014","\\textemdash"),j(Z,K,he,"\u2018","`"),j(Z,K,he,"\u2018","\\textquoteleft"),j(Z,K,he,"\u2019","'"),j(Z,K,he,"\u2019","\\textquoteright"),j(Z,K,he,"\u201c","``"),j(Z,K,he,"\u201c","\\textquotedblleft"),j(Z,K,he,"\u201d","''"),j(Z,K,he,"\u201d","\\textquotedblright"),j($,K,he,"\xb0","\\degree",!0),j(Z,K,he,"\xb0","\\degree"),j(Z,K,he,"\xb0","\\textdegree",!0),j($,K,ne,"\xa3","\\pounds"),j($,K,ne,"\xa3","\\mathsterling",!0),j(Z,K,ne,"\xa3","\\pounds"),j(Z,K,ne,"\xa3","\\textsterling",!0),j($,J,he,"\u2720","\\maltese"),j(Z,J,he,"\u2720","\\maltese"),j(Z,K,le,"\xa0","\\ "),j(Z,K,le,"\xa0"," "),j(Z,K,le,"\xa0","~");for(var ce='0123456789/@."',ue=0;ue<ce.length;ue++){var pe=ce.charAt(ue);j($,K,he,pe,pe)}for(var de='0123456789!@*()-=+[]<>|";:?/.,',fe=0;fe<de.length;fe++){var ge=de.charAt(fe);j(Z,K,he,ge,ge)}for(var ve="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",ye=0;ye<ve.length;ye++){var be=ve.charAt(ye);j($,K,ne,be,be),j(Z,K,he,be,be)}for(var xe="",we=0;we<ve.length;we++){var ke=ve.charAt(we);j($,K,ne,ke,xe=String.fromCharCode(55349,56320+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56372+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56424+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56580+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56736+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56788+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56840+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56944+we)),j(Z,K,he,ke,xe),we<26&&(j($,K,ne,ke,xe=String.fromCharCode(55349,56632+we)),j(Z,K,he,ke,xe),j($,K,ne,ke,xe=String.fromCharCode(55349,56476+we)),j(Z,K,he,ke,xe))}j($,K,ne,"k",xe=String.fromCharCode(55349,56668)),j(Z,K,he,"k",xe);for(var Se=0;Se<10;Se++){var ze=Se.toString();j($,K,ne,ze,xe=String.fromCharCode(55349,57294+Se)),j(Z,K,he,ze,xe),j($,K,ne,ze,xe=String.fromCharCode(55349,57314+Se)),j(Z,K,he,ze,xe),j($,K,ne,ze,xe=String.fromCharCode(55349,57324+Se)),j(Z,K,he,ze,xe),j($,K,ne,ze,xe=String.fromCharCode(55349,57334+Se)),j(Z,K,he,ze,xe)}for(var Me="\xc7\xd0\xde\xe7\xfe",Te=0;Te<Me.length;Te++){var Ae=Me.charAt(Te);j($,K,ne,Ae,Ae),j(Z,K,he,Ae,Ae)}j(Z,K,he,"\xf0","\xf0"),j(Z,K,he,"\u2013","\u2013"),j(Z,K,he,"\u2014","\u2014"),j(Z,K,he,"\u2018","\u2018"),j(Z,K,he,"\u2019","\u2019"),j(Z,K,he,"\u201c","\u201c"),j(Z,K,he,"\u201d","\u201d");var Be=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathdefault","textit","Math-Italic"],["mathdefault","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["","",""],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],Ce=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],Ne=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],qe=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Ee=function(e,t){return t.size<2?e:Ne[e-1][t.size-1]},Oe=function(){function n(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||n.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=qe[this.size-1],this.maxSize=e.maxSize,this._fontMetrics=void 0}var e=n.prototype;return e.extend=function(e){var t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new n(t)},e.havingStyle=function(e){return this.style===e?this:this.extend({style:e,size:Ee(this.textSize,e)})},e.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},e.havingSize=function(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:qe[e-1]})},e.havingBaseStyle=function(e){e=e||this.style.text();var t=Ee(n.BASESIZE,e);return this.size===t&&this.textSize===n.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})},e.havingBaseSizing=function(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})},e.withColor=function(e){return this.extend({color:e})},e.withPhantom=function(){return this.extend({phantom:!0})},e.withFont=function(e){return this.extend({font:e})},e.withTextFontFamily=function(e){return this.extend({fontFamily:e,font:""})},e.withTextFontWeight=function(e){return this.extend({fontWeight:e,font:""})},e.withTextFontShape=function(e){return this.extend({fontShape:e,font:""})},e.sizingClasses=function(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]},e.baseSizingClasses=function(){return this.size!==n.BASESIZE?["sizing","reset-size"+this.size,"size"+n.BASESIZE]:[]},e.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=function(e){var t;if(!V[t=5<=e?0:3<=e?1:2]){var r=V[t]={cssEmPerMu:D.quad[t]/18};for(var n in D)D.hasOwnProperty(n)&&(r[n]=D[n][t])}return V[t]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?"transparent":null!=this.color&&n.colorMap.hasOwnProperty(this.color)?n.colorMap[this.color]:this.color},n}();Oe.BASESIZE=6,Oe.colorMap={"katex-blue":"#6495ed","katex-orange":"#ffa500","katex-pink":"#ff00af","katex-red":"#df0030","katex-green":"#28ae7b","katex-gray":"gray","katex-purple":"#9d38bd","katex-blueA":"#ccfaff","katex-blueB":"#80f6ff","katex-blueC":"#63d9ea","katex-blueD":"#11accd","katex-blueE":"#0c7f99","katex-tealA":"#94fff5","katex-tealB":"#26edd5","katex-tealC":"#01d1c1","katex-tealD":"#01a995","katex-tealE":"#208170","katex-greenA":"#b6ffb0","katex-greenB":"#8af281","katex-greenC":"#74cf70","katex-greenD":"#1fab54","katex-greenE":"#0d923f","katex-goldA":"#ffd0a9","katex-goldB":"#ffbb71","katex-goldC":"#ff9c39","katex-goldD":"#e07d10","katex-goldE":"#a75a05","katex-redA":"#fca9a9","katex-redB":"#ff8482","katex-redC":"#f9685d","katex-redD":"#e84d39","katex-redE":"#bc2612","katex-maroonA":"#ffbde0","katex-maroonB":"#ff92c6","katex-maroonC":"#ed5fa6","katex-maroonD":"#ca337c","katex-maroonE":"#9e034e","katex-purpleA":"#ddd7ff","katex-purpleB":"#c6b9fc","katex-purpleC":"#aa87ff","katex-purpleD":"#7854ab","katex-purpleE":"#543b78","katex-mintA":"#f5f9e8","katex-mintB":"#edf2df","katex-mintC":"#e0e5cc","katex-grayA":"#f6f7f7","katex-grayB":"#f0f1f2","katex-grayC":"#e3e5e6","katex-grayD":"#d6d8da","katex-grayE":"#babec2","katex-grayF":"#888d93","katex-grayG":"#626569","katex-grayH":"#3b3e40","katex-grayI":"#21242c","katex-kaBlue":"#314453","katex-kaGreen":"#71B307"};var Ie=Oe,Re={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},Le={ex:!0,em:!0,mu:!0},He=function(e,t){var r;if(e.unit in Re)r=Re[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var n;if(n=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=n.fontMetrics().xHeight;else{if("em"!==e.unit)throw new X("Invalid unit: '"+e.unit+"'");r=n.fontMetrics().quad}n!==t&&(r*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},De=["\\imath","\u0131","\\jmath","\u0237","\\pounds","\\mathsterling","\\textsterling","\xa3"],Pe=function(e,t,r){return W[r][e]&&W[r][e].replace&&(e=W[r][e].replace),{value:e,metrics:F(e,t,r)}},Fe=function(e,t,r,n,i){var a,o=Pe(e,t,r),s=o.metrics;if(e=o.value,s){var l=s.italic;("text"===r||n&&"mathit"===n.font)&&(l=0),a=new O(e,s.height,s.depth,l,s.skew,s.width,i)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+e+"' in style '"+t+"'"),a=new O(e,0,0,0,0,0,i);if(n){a.maxFontSize=n.sizeMultiplier,n.style.isTight()&&a.classes.push("mtight");var h=n.getColor();h&&(a.style.color=h)}return a},Ve=function(e,t){if(S(e.classes)!==S(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;for(var r in e.style)if(e.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;for(var n in t.style)if(t.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;return!0},Ue=function(e){for(var t=0,r=0,n=0,i=0;i<e.children.length;i++){var a=e.children[i];a.height>t&&(t=a.height),a.depth>r&&(r=a.depth),a.maxFontSize>n&&(n=a.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Ge=function(e,t,r,n){var i=new C(e,t,r,n);return Ue(i),i},Xe=function(e,t,r,n){return new C(e,t,r,n)},Ye=function(e){var t=new A(e);return Ue(t),t},_e=function(e,t,r){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},We={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},je={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},$e={fontMap:We,makeSymbol:Fe,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),r&&r.font&&"boldsymbol"===r.font&&Pe(e,"Main-Bold",t).metrics?Fe(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===W[t][e].font?Fe(e,"Main-Regular",t,r,n):Fe(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Ge,makeSvgSpan:Xe,makeLineSpan:function(e,t,r){var n=Ge([e],[],t);return n.height=r||t.fontMetrics().defaultRuleThickness,n.style.borderBottomWidth=n.height+"em",n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){var i=new N(e,t,r,n);return Ue(i),i},makeFragment:Ye,wrapFragment:function(e,t){return e instanceof A?Ge([],[e],t):e},makeVList:function(e,t){for(var r=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth,i=n,a=1;a<t.length;a++){var o=-t[a].shift-i-t[a].elem.depth,s=o-(t[a-1].elem.height+t[a-1].elem.depth);i+=o,r.push({type:"kern",size:s}),r.push(t[a])}return{children:r,depth:n}}var l;if("top"===e.positionType){for(var h=e.positionData,m=0;m<e.children.length;m++){var c=e.children[m];h-="kern"===c.type?c.size:c.elem.height+c.elem.depth}l=h}else if("bottom"===e.positionType)l=-e.positionData;else{var u=e.children[0];if("elem"!==u.type)throw new Error('First child must have type "elem".');if("shift"===e.positionType)l=-u.elem.depth-e.positionData;else{if("firstBaseline"!==e.positionType)throw new Error("Invalid positionType "+e.positionType+".");l=-u.elem.depth}}return{children:e.children,depth:l}}(e),n=r.children,i=r.depth,a=0,o=0;o<n.length;o++){var s=n[o];if("elem"===s.type){var l=s.elem;a=Math.max(a,l.maxFontSize,l.height)}}a+=2;var h=Ge(["pstrut"],[]);h.style.height=a+"em";for(var m=[],c=i,u=i,p=i,d=0;d<n.length;d++){var f=n[d];if("kern"===f.type)p+=f.size;else{var g=f.elem,v=f.wrapperClasses||[],y=f.wrapperStyle||{},b=Ge(v,[h,g],void 0,y);b.style.top=-a-p-g.depth+"em",f.marginLeft&&(b.style.marginLeft=f.marginLeft),f.marginRight&&(b.style.marginRight=f.marginRight),m.push(b),p+=g.height+g.depth}c=Math.min(c,p),u=Math.max(u,p)}var x,w=Ge(["vlist"],m);if(w.style.height=u+"em",c<0){var k=Ge([],[]),S=Ge(["vlist"],[k]);S.style.height=-c+"em";var z=Ge(["vlist-s"],[new O("\u200b")]);x=[Ge(["vlist-r"],[w,z]),Ge(["vlist-r"],[S])]}else x=[Ge(["vlist-r"],[w])];var M=Ge(["vlist-t"],x);return 2===x.length&&M.classes.push("vlist-t2"),M.height=u,M.depth=-c,M},makeOrd:function(e,t,r){var n,i=e.mode,a=e.text,o=["mord"],s="math"===i||"text"===i&&t.font,l=s?t.font:t.fontFamily;if(55349===a.charCodeAt(0)){var h=function(e,t){var r=1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536,n="math"===t?0:1;if(119808<=r&&r<120484){var i=Math.floor((r-119808)/26);return[Be[i][2],Be[i][n]]}if(120782<=r&&r<=120831){var a=Math.floor((r-120782)/10);return[Ce[a][2],Ce[a][n]]}if(120485===r||120486===r)return[Be[0][2],Be[0][n]];if(120486<r&&r<120782)return["",""];throw new X("Unsupported character: "+e)}(a,i),m=h[0],c=h[1];return Fe(a,m,i,t,o.concat(c))}if(l){var u,p;if("boldsymbol"===l||"mathnormal"===l){var d="boldsymbol"===l?Pe(a,"Math-BoldItalic",i).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}:(n=a,Y.contains(De,n)?{fontName:"Main-Italic",fontClass:"mathit"}:/[0-9]/.test(n.charAt(0))?{fontName:"Caligraphic-Regular",fontClass:"mathcal"}:{fontName:"Math-Italic",fontClass:"mathdefault"});u=d.fontName,p=[d.fontClass]}else p=Y.contains(De,a)?(u="Main-Italic",["mathit"]):s?(u=We[l].fontName,[l]):(u=_e(l,t.fontWeight,t.fontShape),[l,t.fontWeight,t.fontShape]);if(Pe(a,u,i).metrics)return Fe(a,u,i,t,o.concat(p));if(me.hasOwnProperty(a)&&"Typewriter"===u.substr(0,10)){for(var f=[],g=0;g<a.length;g++)f.push(Fe(a[g],u,i,t,o.concat(p)));return Ye(f)}}if("mathord"===r){var v=/[0-9]/.test((w=a).charAt(0))||Y.contains(De,w)?{fontName:"Main-Italic",fontClass:"mathit"}:{fontName:"Math-Italic",fontClass:"mathdefault"};return Fe(a,v.fontName,i,t,o.concat([v.fontClass]))}if("textord"!==r)throw new Error("unexpected type: "+r+" in makeOrd");var y=W[i][a]&&W[i][a].font;if("ams"===y){var b=_e("amsrm",t.fontWeight,t.fontShape);return Fe(a,b,i,t,o.concat("amsrm",t.fontWeight,t.fontShape))}if("main"!==y&&y){var x=_e(y,t.fontWeight,t.fontShape);return Fe(a,x,i,t,o.concat(x,t.fontWeight,t.fontShape))}var w,k=_e("textrm",t.fontWeight,t.fontShape);return Fe(a,k,i,t,o.concat(t.fontWeight,t.fontShape))},makeGlue:function(e,t){var r=Ge(["mspace"],[],t),n=He(e,t);return r.style.marginRight=n+"em",r},staticSvg:function(e,t){var r=je[e],n=r[0],i=r[1],a=r[2],o=new R(n),s=new I([o],{width:i+"em",height:a+"em",style:"width:"+i+"em",viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),l=Xe(["overlay"],[s],t);return l.height=a,l.style.height=a+"em",l.style.width=i+"em",l},svgData:je,tryCombineChars:function(e){for(var t=0;t<e.length-1;t++){var r=e[t],n=e[t+1];r instanceof O&&n instanceof O&&Ve(r,n)&&(r.text+=n.text,r.height=Math.max(r.height,n.height),r.depth=Math.max(r.depth,n.depth),r.italic=n.italic,e.splice(t+1,1),t--)}return e}};function Ze(e,t){var r=Ke(e,t);if(!r)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return r}function Ke(e,t){return e&&e.type===t?e:null}function Je(e,t){var r,n,i=(n=t,(r=e)&&"atom"===r.type&&r.family===n?r:null);if(!i)throw new Error('Expected node of type "atom" and family "'+t+'", but got '+(e?"atom"===e.type?"atom of family "+e.family:"node of type "+e.type:String(e)));return i}function Qe(e){return e&&("atom"===e.type||G.hasOwnProperty(e.type))?e:null}var et={number:3,unit:"mu"},tt={number:4,unit:"mu"},rt={number:5,unit:"mu"},nt={mord:{mop:et,mbin:tt,mrel:rt,minner:et},mop:{mord:et,mop:et,mrel:rt,minner:et},mbin:{mord:tt,mop:tt,mopen:tt,minner:tt},mrel:{mord:rt,mop:rt,mopen:rt,minner:rt},mopen:{},mclose:{mop:et,mbin:tt,mrel:rt,minner:et},mpunct:{mord:et,mop:et,mrel:rt,mopen:et,mclose:et,mpunct:et,minner:et},minner:{mord:et,mop:et,mbin:tt,mrel:rt,mopen:et,mpunct:et,minner:et}},it={mord:{mop:et},mop:{mord:et,mop:et},mbin:{},mrel:{},mopen:{},mclose:{mop:et},mpunct:{},minner:{mop:et}},at={},ot={},st={};function lt(e){for(var t=e.type,r=(e.nodeType,e.names),n=e.props,i=e.handler,a=e.htmlBuilder,o=e.mathmlBuilder,s={type:t,numArgs:n.numArgs,argTypes:n.argTypes,greediness:void 0===n.greediness?1:n.greediness,allowedInText:!!n.allowedInText,allowedInMath:void 0===n.allowedInMath||n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,consumeMode:n.consumeMode,handler:i},l=0;l<r.length;++l)at[r[l]]=s;t&&(a&&(ot[t]=a),o&&(st[t]=o))}function ht(e){lt({type:e.type,names:[],props:{numArgs:0},handler:function(){throw new Error("Should never be called.")},htmlBuilder:e.htmlBuilder,mathmlBuilder:e.mathmlBuilder})}var mt=function(e){var t=Ke(e,"ordgroup");return t?t.body:[e]},ct=$e.makeSpan,ut={display:q.DISPLAY,text:q.TEXT,script:q.SCRIPT,scriptscript:q.SCRIPTSCRIPT},pt={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},dt=function(e,t,r,n){void 0===n&&(n=[null,null]);for(var i=[],a=0;a<e.length;a++){var o=bt(e[a],t);if(o instanceof A){var s=o.children;i.push.apply(i,s)}else i.push(o)}for(var l,h,m,c,u=[n[0]?ct([n[0]],[],t):null].concat(i.filter(function(e){return e&&"mspace"!==e.classes[0]}),[n[1]?ct([n[1]],[],t):null]),p=1;p<u.length-1;p++){var d=T(u[p]),f=ft(d,"left");"mbin"===f.classes[0]&&(m=u[p-1],c=r,m?Y.contains(["mbin","mopen","mrel","mop","mpunct"],gt(m,"right")):c)&&(f.classes[0]="mord");var g=ft(d,"right");"mbin"===g.classes[0]&&(l=u[p+1],h=r,l?Y.contains(["mrel","mclose","mpunct"],gt(l,"left")):h)&&(g.classes[0]="mord")}for(var v=[],y=0,b=0;b<i.length;b++)if(v.push(i[b]),"mspace"!==i[b].classes[0]&&y<u.length-1){0===y&&(v.pop(),b--);var x=gt(u[y],"right"),w=gt(u[y+1],"left");if(x&&w&&r){var k=T(u[y+1]),S=vt(k)?it[x][w]:nt[x][w];if(S){var z=t;if(1===e.length){var M=Ke(e[0],"sizing")||Ke(e[0],"styling");M&&("sizing"===M.type?z=t.havingSize(M.size):"styling"===M.type&&(z=t.havingStyle(ut[M.style])))}v.push($e.makeGlue(S,z))}}y++}return v},ft=function e(t,r){if(t instanceof A||t instanceof N){var n=t.children;if(n.length){if("right"===r)return e(n[n.length-1],"right");if("left"===r)return e(n[0],"right")}}return t},gt=function(e,t){return e?(e=ft(e,t),pt[e.classes[0]]||null):null},vt=function(e){return(e=ft(e,"left")).hasClass("mtight")},yt=function(e,t){var r=["nulldelimiter"].concat(e.baseSizingClasses());return ct(t.concat(r))},bt=function(e,t,r){if(!e)return ct();if(ot[e.type]){var n=ot[e.type](e,t);if(r&&t.size!==r.size){n=ct(t.sizingClasses(r),[n],t);var i=t.sizeMultiplier/r.sizeMultiplier;n.height*=i,n.depth*=i}return n}throw new X("Got group of unknown type: '"+e.type+"'")};function xt(e,t){var r=ct(["base"],e,t),n=ct(["strut"]);return n.style.height=r.height+r.depth+"em",n.style.verticalAlign=-r.depth+"em",r.children.unshift(n),r}function wt(e,t){var r=null;1===e.length&&"tag"===e[0].type&&(r=e[0].tag,e=e[0].body);for(var n,i=dt(e,t,!0),a=[],o=[],s=0;s<i.length;s++)if(o.push(i[s]),i[s].hasClass("mbin")||i[s].hasClass("mrel")||i[s].hasClass("allowbreak")){for(var l=!1;s<i.length-1&&i[s+1].hasClass("mspace");)s++,o.push(i[s]),i[s].hasClass("nobreak")&&(l=!0);l||(a.push(xt(o,t)),o=[])}else i[s].hasClass("newline")&&(o.pop(),0<o.length&&(a.push(xt(o,t)),o=[]),a.push(i[s]));0<o.length&&a.push(xt(o,t)),r&&((n=xt(dt(r,t,!0))).classes=["tag"],a.push(n));var h=ct(["katex-html"],a);if(h.setAttribute("aria-hidden","true"),n){var m=n.children[0];m.style.height=h.height+h.depth+"em",m.style.verticalAlign=-h.depth+"em"}return h}function kt(e){return new A(e)}var St=function(){function e(e,t){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=e,this.attributes={},this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.getAttribute=function(e){return this.attributes[e]},t.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r<this.children.length;r++)e.appendChild(this.children[r].toNode());return e},t.toMarkup=function(){var e="<"+this.type;for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&(e+=" "+t+'="',e+=Y.escape(this.attributes[t]),e+='"');e+=">";for(var r=0;r<this.children.length;r++)e+=this.children[r].toMarkup();return e+="</"+this.type+">"},t.toText=function(){return this.children.map(function(e){return e.toText()}).join("")},e}(),zt=function(){function e(e,t){void 0===t&&(t=!0),this.text=void 0,this.needsEscape=void 0,this.text=e,this.needsEscape=t}var t=e.prototype;return t.toNode=function(){return document.createTextNode(this.toText())},t.toMarkup=function(){return this.toText()},t.toText=function(){return this.needsEscape?Y.escape(this.text):this.text},e}(),Mt={MathNode:St,TextNode:zt,SpaceNode:function(){function e(e){this.width=void 0,this.character=void 0,this.width=e,this.character=.05555<=e&&e<=.05556?" ":.1666<=e&&e<=.1667?" ":.2222<=e&&e<=.2223?" ":.2777<=e&&e<=.2778?"  ":-.05556<=e&&e<=-.05555?"​":-.1667<=e&&e<=-.1666?"​":-.2223<=e&&e<=-.2222?"​":-.2778<=e&&e<=-.2777?"​":null}var t=e.prototype;return t.toNode=function(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",this.width+"em"),e},t.toMarkup=function(){return this.character?"<mtext>"+this.character+"</mtext>":'<mspace width="'+this.width+'em"/>'},t.toText=function(){return this.character?this.character:" "},e}(),newDocumentFragment:kt},Tt=function(e,t,r){return!W[t][e]||!W[t][e].replace||55349===e.charCodeAt(0)||me.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(e=W[t][e].replace),new Mt.TextNode(e)},At=function(e){return 1===e.length?e[0]:new Mt.MathNode("mrow",e)},Bt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"bold-italic";var i=e.text;return Y.contains(["\\imath","\\jmath"],i)?null:(W[n][i]&&W[n][i].replace&&(i=W[n][i].replace),F(i,$e.fontMap[r].fontName,n)?$e.fontMap[r].variant:null)},Ct=function(e,t){for(var r,n=[],i=0;i<e.length;i++){var a=qt(e[i],t);if(a instanceof St&&r instanceof St){if("mtext"===a.type&&"mtext"===r.type&&a.getAttribute("mathvariant")===r.getAttribute("mathvariant")){var o;(o=r.children).push.apply(o,a.children);continue}if("mn"===a.type&&"mn"===r.type){var s;(s=r.children).push.apply(s,a.children);continue}if("mi"===a.type&&1===a.children.length&&"mn"===r.type){var l=a.children[0];if(l instanceof zt&&"."===l.text){var h;(h=r.children).push.apply(h,a.children);continue}}}n.push(a),r=a}return n},Nt=function(e,t){return At(Ct(e,t))},qt=function(e,t){if(!e)return new Mt.MathNode("mrow");if(st[e.type])return st[e.type](e,t);throw new X("Got group of unknown type: '"+e.type+"'")};var Et=function(e){return new Ie({style:e.displayMode?q.DISPLAY:q.TEXT,maxSize:e.maxSize})},Ot=function(e,t,r){var n=Et(r),i=function(e,t,r){var n,i=Ct(e,r);n=1===i.length&&i[0]instanceof St&&Y.contains(["mrow","mtable"],i[0].type)?i[0]:new Mt.MathNode("mrow",i);var a=new Mt.MathNode("annotation",[new Mt.TextNode(t)]);a.setAttribute("encoding","application/x-tex");var o=new Mt.MathNode("semantics",[n,a]),s=new Mt.MathNode("math",[o]);return $e.makeSpan(["katex-mathml"],[s])}(e,t,n),a=wt(e,n),o=$e.makeSpan(["katex"],[i,a]);return r.displayMode?$e.makeSpan(["katex-display"],[o]):o},It={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23b5",overbrace:"\u23de",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb"},Rt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Lt=function(e,t,r,n){var i,a=e.height+e.depth+2*r;if(/fbox|color/.test(t)){if(i=$e.makeSpan(["stretchy",t],[],n),"fbox"===t){var o=n.color&&n.getColor();o&&(i.style.borderColor=o)}}else{var s=[];/^[bx]cancel$/.test(t)&&s.push(new L({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&s.push(new L({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var l=new I(s,{width:"100%",height:a+"em"});i=$e.makeSvgSpan([],[l],n)}return i.height=a,i.style.height=a+"em",i},Ht=function(e){var t=new Mt.MathNode("mo",[new Mt.TextNode(It[e.substr(1)])]);return t.setAttribute("stretchy","true"),t},Dt=function(S,z){var e=function(){var e=4e5,t=S.label.substr(1);if(Y.contains(["widehat","widecheck","widetilde","utilde"],t)){var r,n,i,a="ordgroup"===(c=S.base).type?c.body.length:1;if(5<a)n="widehat"===t||"widecheck"===t?(r=420,e=2364,i=.42,t+"4"):(r=312,e=2340,i=.34,"tilde4");else{var o=[1,1,2,2,3,3][a];n="widehat"===t||"widecheck"===t?(e=[0,1062,2364,2364,2364][o],r=[0,239,300,360,420][o],i=[0,.24,.3,.3,.36,.42][o],t+o):(e=[0,600,1033,2339,2340][o],r=[0,260,286,306,312][o],i=[0,.26,.286,.3,.306,.34][o],"tilde"+o)}var s=new R(n),l=new I([s],{width:"100%",height:i+"em",viewBox:"0 0 "+e+" "+r,preserveAspectRatio:"none"});return{span:$e.makeSvgSpan([],[l],z),minWidth:0,height:i}}var h,m,c,u=[],p=Rt[t],d=p[0],f=p[1],g=p[2],v=g/1e3,y=d.length;if(1===y)h=["hide-tail"],m=[p[3]];else if(2===y)h=["halfarrow-left","halfarrow-right"],m=["xMinYMin","xMaxYMin"];else{if(3!==y)throw new Error("Correct katexImagesData or update code here to support\n "+y+" children.");h=["brace-left","brace-center","brace-right"],m=["xMinYMin","xMidYMin","xMaxYMin"]}for(var b=0;b<y;b++){var x=new R(d[b]),w=new I([x],{width:"400em",height:v+"em",viewBox:"0 0 "+e+" "+g,preserveAspectRatio:m[b]+" slice"}),k=$e.makeSvgSpan([h[b]],[w],z);if(1===y)return{span:k,minWidth:f,height:v};k.style.height=v+"em",u.push(k)}return{span:$e.makeSpan(["stretchy"],u,z),minWidth:f,height:v}}(),t=e.span,r=e.minWidth,n=e.height;return t.height=n,t.style.height=n+"em",0<r&&(t.style.minWidth=r+"em"),t},Pt=function(e,t){var r,n,i,a=Ke(e,"supsub");a?(r=(n=Ze(a.base,"accent")).base,a.base=r,i=function(e){if(e instanceof C)return e;throw new Error("Expected span<HtmlDomNode> but got "+String(e)+".")}(bt(a,t)),a.base=n):r=(n=Ze(e,"accent")).base;var o=bt(r,t.havingCrampedStyle()),s=0;if(n.isShifty&&Y.isCharacterBox(r)){var l=Y.getBaseElem(r);s=function(e){if(e instanceof O)return e;throw new Error("Expected symbolNode but got "+String(e)+".")}(bt(l,t.havingCrampedStyle())).skew}var h,m=Math.min(o.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Dt(n,t),h=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:0<s?{width:"calc(100% - "+2*s+"em)",marginLeft:2*s+"em"}:void 0}]},t);else{var c,u;u="\\vec"===n.label?(c=$e.staticSvg("vec",t),$e.svgData.vec[1]):((c=$e.makeSymbol(n.label,"Main-Regular",n.mode,t)).italic=0,c.width),h=$e.makeSpan(["accent-body"],[c]);var p="\\textcircled"===n.label;p&&(h.classes.push("accent-full"),m=o.height);var d=s;p||(d-=u/2),h.style.left=d+"em","\\textcircled"===n.label&&(h.style.top=".2em"),h=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:-m},{type:"elem",elem:h}]},t)}var f=$e.makeSpan(["mord","accent"],[h],t);return i?(i.children[0]=f,i.height=Math.max(f.height,i.height),i.classes[0]="mord",i):f},Ft=function(e,t){var r=e.isStretchy?Ht(e.label):new Mt.MathNode("mo",[Tt(e.label,e.mode)]),n=new Mt.MathNode("mover",[qt(e.base,t),r]);return n.setAttribute("accent","true"),n},Vt=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(e){return"\\"+e}).join("|"));lt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(e,t){var r=t[0],n=!Vt.test(e.funcName),i=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:i,base:r}},htmlBuilder:Pt,mathmlBuilder:Ft}),lt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(e,t){var r=t[0];return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Pt,mathmlBuilder:Ft}),lt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,i=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},htmlBuilder:function(e,t){var r=bt(e.base,t),n=Dt(e,t),i="\\utilde"===e.label?.12:0,a=$e.makeVList({positionType:"bottom",positionData:n.height+i,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},t);return $e.makeSpan(["mord","accentunder"],[a],t)},mathmlBuilder:function(e,t){var r=Ht(e.label),n=new Mt.MathNode("munder",[qt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}}),lt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,r){var n=e.parser,i=e.funcName;return{type:"xArrow",mode:n.mode,label:i,body:t[0],below:r[0]}},htmlBuilder:function(e,t){var r,n=t.style,i=t.havingStyle(n.sup()),a=$e.wrapFragment(bt(e.body,i,t),t);a.classes.push("x-arrow-pad"),e.below&&(i=t.havingStyle(n.sub()),(r=$e.wrapFragment(bt(e.below,i,t),t)).classes.push("x-arrow-pad"));var o,s=Dt(e,t),l=-t.fontMetrics().axisHeight+.5*s.height,h=-t.fontMetrics().axisHeight-.5*s.height-.111;if((.25<a.depth||"\\xleftequilibrium"===e.label)&&(h-=a.depth),r){var m=-t.fontMetrics().axisHeight+r.height+.5*s.height+.111;o=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:h},{type:"elem",elem:s,shift:l},{type:"elem",elem:r,shift:m}]},t)}else o=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:h},{type:"elem",elem:s,shift:l}]},t);return o.children[0].children[0].children[1].classes.push("svg-align"),$e.makeSpan(["mrel","x-arrow"],[o],t)},mathmlBuilder:function(e,t){var r,n,i=Ht(e.label);if(e.body){var a=qt(e.body,t);r=e.below?(n=qt(e.below,t),new Mt.MathNode("munderover",[i,n,a])):new Mt.MathNode("mover",[i,a])}else r=e.below?(n=qt(e.below,t),new Mt.MathNode("munder",[i,n])):new Mt.MathNode("mover",[i]);return r}}),lt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){for(var r=e.parser,n=Ze(t[0],"ordgroup").body,i="",a=0;a<n.length;a++){i+=Ze(n[a],"textord").text}var o=parseInt(i);if(isNaN(o))throw new X("\\@char has non-numeric argument "+i);return{type:"textord",mode:r.mode,text:String.fromCharCode(o)}}});var Ut=function(e,t){var r=dt(e.body,t.withColor(e.color),!1);return $e.makeFragment(r)},Gt=function(e,t){var r=Ct(e.body,t),n=new Mt.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};lt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","original"]},handler:function(e,t){var r=e.parser,n=Ze(t[0],"color-token").color,i=t[1];return{type:"color",mode:r.mode,color:n,body:mt(i)}},htmlBuilder:Ut,mathmlBuilder:Gt}),lt({type:"color",names:["\\blue","\\orange","\\pink","\\red","\\green","\\gray","\\purple","\\blueA","\\blueB","\\blueC","\\blueD","\\blueE","\\tealA","\\tealB","\\tealC","\\tealD","\\tealE","\\greenA","\\greenB","\\greenC","\\greenD","\\greenE","\\goldA","\\goldB","\\goldC","\\goldD","\\goldE","\\redA","\\redB","\\redC","\\redD","\\redE","\\maroonA","\\maroonB","\\maroonC","\\maroonD","\\maroonE","\\purpleA","\\purpleB","\\purpleC","\\purpleD","\\purpleE","\\mintA","\\mintB","\\mintC","\\grayA","\\grayB","\\grayC","\\grayD","\\grayE","\\grayF","\\grayG","\\grayH","\\grayI","\\kaBlue","\\kaGreen"],props:{numArgs:1,allowedInText:!0,greediness:3},handler:function(e,t){var r=e.parser,n=e.funcName,i=t[0];return{type:"color",mode:r.mode,color:"katex-"+n.slice(1),body:mt(i)}},htmlBuilder:Ut,mathmlBuilder:Gt}),lt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,greediness:3,argTypes:["color"]},handler:function(e,t){var r=e.parser,n=e.breakOnTokenText,i=Ze(t[0],"color-token").color,a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:Ut,mathmlBuilder:Gt}),lt({type:"cr",names:["\\cr","\\newline"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(e,t,r){var n=e.parser,i=e.funcName,a=r[0],o="\\cr"===i,s=!1;return o||(s=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode")),{type:"cr",mode:n.mode,newLine:s,newRow:o,size:a&&Ze(a,"size").value}},htmlBuilder:function(e,t){if(e.newRow)throw new X("\\cr valid only within a tabular/array environment");var r=$e.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=He(e.size,t)+"em")),r},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",He(e.size,t)+"em")),r}});var Xt=function(e,t,r){var n=F(W.math[e]&&W.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},Yt=function(e,t,r,n){var i=r.havingBaseStyle(t),a=$e.makeSpan(n.concat(i.sizingClasses(r)),[e],r),o=i.sizeMultiplier/r.sizeMultiplier;return a.height*=o,a.depth*=o,a.maxFontSize=i.sizeMultiplier,a},_t=function(e,t,r){var n=t.havingBaseStyle(r),i=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=i+"em",e.height-=i,e.depth+=i},Wt=function(e,t,r,n,i,a){var o,s,l,h,m=(o=e,s=t,l=i,h=n,$e.makeSymbol(o,"Size"+s+"-Regular",l,h)),c=Yt($e.makeSpan(["delimsizing","size"+t],[m],n),q.TEXT,n,a);return r&&_t(c,n,q.TEXT),c},jt=function(e,t,r){var n;return n="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:$e.makeSpan(["delimsizinginner",n],[$e.makeSpan([],[$e.makeSymbol(e,t,r)])])}},$t=function(e,t,r,n,i,a){var o,s,l,h;o=l=h=e,s=null;var m="Size1-Regular";"\\uparrow"===e?l=h="\u23d0":"\\Uparrow"===e?l=h="\u2016":"\\downarrow"===e?o=l="\u23d0":"\\Downarrow"===e?o=l="\u2016":"\\updownarrow"===e?(o="\\uparrow",l="\u23d0",h="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",l="\u2016",h="\\Downarrow"):"["===e||"\\lbrack"===e?(o="\u23a1",l="\u23a2",h="\u23a3",m="Size4-Regular"):"]"===e||"\\rbrack"===e?(o="\u23a4",l="\u23a5",h="\u23a6",m="Size4-Regular"):"\\lfloor"===e||"\u230a"===e?(l=o="\u23a2",h="\u23a3",m="Size4-Regular"):"\\lceil"===e||"\u2308"===e?(o="\u23a1",l=h="\u23a2",m="Size4-Regular"):"\\rfloor"===e||"\u230b"===e?(l=o="\u23a5",h="\u23a6",m="Size4-Regular"):"\\rceil"===e||"\u2309"===e?(o="\u23a4",l=h="\u23a5",m="Size4-Regular"):"("===e||"\\lparen"===e?(o="\u239b",l="\u239c",h="\u239d",m="Size4-Regular"):")"===e||"\\rparen"===e?(o="\u239e",l="\u239f",h="\u23a0",m="Size4-Regular"):"\\{"===e||"\\lbrace"===e?(o="\u23a7",s="\u23a8",h="\u23a9",l="\u23aa",m="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="\u23ab",s="\u23ac",h="\u23ad",l="\u23aa",m="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(o="\u23a7",h="\u23a9",l="\u23aa",m="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(o="\u23ab",h="\u23ad",l="\u23aa",m="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(o="\u23a7",h="\u23ad",l="\u23aa",m="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(o="\u23ab",h="\u23a9",l="\u23aa",m="Size4-Regular");var c=Xt(o,m,i),u=c.height+c.depth,p=Xt(l,m,i),d=p.height+p.depth,f=Xt(h,m,i),g=f.height+f.depth,v=0,y=1;if(null!==s){var b=Xt(s,m,i);v=b.height+b.depth,y=2}var x=u+g+v,w=Math.ceil((t-x)/(y*d)),k=x+w*y*d,S=n.fontMetrics().axisHeight;r&&(S*=n.sizeMultiplier);var z=k/2-S,M=[];if(M.push(jt(h,m,i)),null===s)for(var T=0;T<w;T++)M.push(jt(l,m,i));else{for(var A=0;A<w;A++)M.push(jt(l,m,i));M.push(jt(s,m,i));for(var B=0;B<w;B++)M.push(jt(l,m,i))}M.push(jt(o,m,i));var C=n.havingBaseStyle(q.TEXT),N=$e.makeVList({positionType:"bottom",positionData:z,children:M},C);return Yt($e.makeSpan(["delimsizing","mult"],[N],C),q.TEXT,n,a)},Zt=function(e,t,r,n){var i;"sqrtTall"===e&&(i="M702 80H400000v40H742v"+(r-54-80)+"l-4 4-4 4c-.667.7\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 80H400000v40H742z");var a=new R(e,i),o=new I([a],{width:"400em",height:t+"em",viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return $e.makeSvgSpan(["hide-tail"],[o],n)},Kt=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],Jt=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],Qt=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],er=[0,1.2,1.8,2.4,3],tr=[{type:"small",style:q.SCRIPTSCRIPT},{type:"small",style:q.SCRIPT},{type:"small",style:q.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],rr=[{type:"small",style:q.SCRIPTSCRIPT},{type:"small",style:q.SCRIPT},{type:"small",style:q.TEXT},{type:"stack"}],nr=[{type:"small",style:q.SCRIPTSCRIPT},{type:"small",style:q.SCRIPT},{type:"small",style:q.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],ir=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},ar=function(e,t,r,n){for(var i=Math.min(2,3-n.style.size);i<r.length&&"stack"!==r[i].type;i++){var a=Xt(e,ir(r[i]),"math"),o=a.height+a.depth;if("small"===r[i].type&&(o*=n.havingBaseStyle(r[i].style).sizeMultiplier),t<o)return r[i]}return r[r.length-1]},or=function(e,t,r,n,i,a){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=Y.contains(Qt,e)?tr:Y.contains(Kt,e)?nr:rr;var s,l,h,m,c,u,p,d,f=ar(e,t,o,n);return"small"===f.type?(s=e,l=f.style,h=r,m=n,c=i,u=a,p=$e.makeSymbol(s,"Main-Regular",c,m),d=Yt(p,l,m,u),h&&_t(d,m,l),d):"large"===f.type?Wt(e,f.size,r,n,i,a):$t(e,t,r,n,i,a)},sr=function(e,t){var r,n,i=t.havingBaseSizing(),a=ar("\\surd",e*i.sizeMultiplier,nr,i),o=i.sizeMultiplier,s=0,l=0,h=0;return n="small"===a.type?(e<1?o=1:e<1.4&&(o=.7),l=1/o,(r=Zt("sqrtMain",s=1.08/o,h=1080,t)).style.minWidth="0.853em",.833/o):"large"===a.type?(h=1080*er[a.size],l=er[a.size]/o,s=(er[a.size]+.08)/o,(r=Zt("sqrtSize"+a.size,s,h,t)).style.minWidth="1.02em",1/o):(s=e+.08,l=e,h=Math.floor(1e3*e)+80,(r=Zt("sqrtTall",s,h,t)).style.minWidth="0.742em",1.056),r.height=l,r.style.height=s+"em",{span:r,advanceWidth:n,ruleWidth:t.fontMetrics().sqrtRuleThickness*o}},lr=function(e,t,r,n,i){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),Y.contains(Kt,e)||Y.contains(Qt,e))return Wt(e,t,!1,r,n,i);if(Y.contains(Jt,e))return $t(e,er[t],!1,r,n,i);throw new X("Illegal delimiter: '"+e+"'")},hr=or,mr=function(e,t,r,n,i,a){var o=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return or(e,h,!0,n,i,a)},cr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},ur=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function pr(e,t){var r=Qe(e);if(r&&Y.contains(ur,r.text))return r;throw new X("Invalid delimiter: '"+(r?r.text:JSON.stringify(e))+"' after '"+t.funcName+"'",e)}function dr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}lt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1},handler:function(e,t){var r=pr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:cr[e.funcName].size,mclass:cr[e.funcName].mclass,delim:r.text}},htmlBuilder:function(e,t){return"."===e.delim?$e.makeSpan([e.mclass]):lr(e.delim,e.size,t,e.mode,[e.mclass])},mathmlBuilder:function(e){var t=[];"."!==e.delim&&t.push(Tt(e.delim,e.mode));var r=new Mt.MathNode("mo",t);return"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r}}),lt({type:"leftright-right",names:["\\right"],props:{numArgs:1},handler:function(e,t){return{type:"leftright-right",mode:e.parser.mode,delim:pr(t[0],e).text}}}),lt({type:"leftright",names:["\\left"],props:{numArgs:1},handler:function(e,t){var r=pr(t[0],e),n=e.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=Ze(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim}},htmlBuilder:function(e,t){dr(e);for(var r,n,i=dt(e.body,t,!0,[null,"mclose"]),a=0,o=0,s=!1,l=0;l<i.length;l++)i[l].isMiddle?s=!0:(a=Math.max(i[l].height,a),o=Math.max(i[l].depth,o));if(a*=t.sizeMultiplier,o*=t.sizeMultiplier,r="."===e.left?yt(t,["mopen"]):mr(e.left,a,o,t,e.mode,["mopen"]),i.unshift(r),s)for(var h=1;h<i.length;h++){var m=i[h].isMiddle;m&&(i[h]=mr(m.delim,a,o,m.options,e.mode,[]))}return n="."===e.right?yt(t,["mclose"]):mr(e.right,a,o,t,e.mode,["mclose"]),i.push(n),$e.makeSpan(["minner"],i,t)},mathmlBuilder:function(e,t){dr(e);var r=Ct(e.body,t);if("."!==e.left){var n=new Mt.MathNode("mo",[Tt(e.left,e.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if("."!==e.right){var i=new Mt.MathNode("mo",[Tt(e.right,e.mode)]);i.setAttribute("fence","true"),r.push(i)}return At(r)}}),lt({type:"middle",names:["\\middle"],props:{numArgs:1},handler:function(e,t){var r=pr(t[0],e);if(!e.parser.leftrightDepth)throw new X("\\middle without preceding \\left",r);return{type:"middle",mode:e.parser.mode,delim:r.text}},htmlBuilder:function(e,t){var r;if("."===e.delim)r=yt(t,[]);else{r=lr(e.delim,1,t,e.mode,[]);var n={delim:e.delim,options:t};r.isMiddle=n}return r},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mo",[Tt(e.delim,e.mode)]);return r.setAttribute("fence","true"),r}});var fr=function(e,t){var r,n,i=$e.wrapFragment(bt(e.body,t),t),a=e.label.substr(1),o=t.sizeMultiplier,s=0,l=Y.isCharacterBox(e.body);if("sout"===a)(r=$e.makeSpan(["stretchy","sout"])).height=t.fontMetrics().defaultRuleThickness/o,s=-.5*t.fontMetrics().xHeight;else{/cancel/.test(a)?l||i.classes.push("cancel-pad"):i.classes.push("boxpad");var h=0;h=/box/.test(a)?"colorbox"===a?.3:.34:l?.2:0,r=Lt(i,a,h,t),s=i.depth+h,e.backgroundColor&&(r.style.backgroundColor=e.backgroundColor,e.borderColor&&(r.style.borderColor=e.borderColor))}return n=e.backgroundColor?$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:s},{type:"elem",elem:i,shift:0}]},t):$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:0},{type:"elem",elem:r,shift:s,wrapperClasses:/cancel/.test(a)?["svg-align"]:[]}]},t),/cancel/.test(a)&&(n.height=i.height,n.depth=i.depth),/cancel/.test(a)&&!l?$e.makeSpan(["mord","cancel-lap"],[n],t):$e.makeSpan(["mord"],[n],t)},gr=function(e,t){var r=new Mt.MathNode("menclose",[qt(e.body,t)]);switch(e.label){case"\\cancel":r.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":r.setAttribute("notation","downdiagonalstrike");break;case"\\sout":r.setAttribute("notation","horizontalstrike");break;case"\\fbox":case"\\fcolorbox":r.setAttribute("notation","box");break;case"\\xcancel":r.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&r.setAttribute("mathbackground",e.backgroundColor),r};lt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","text"]},handler:function(e,t,r){var n=e.parser,i=e.funcName,a=Ze(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:o}},htmlBuilder:fr,mathmlBuilder:gr}),lt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:["color","color","text"]},handler:function(e,t,r){var n=e.parser,i=e.funcName,a=Ze(t[0],"color-token").color,o=Ze(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:o,borderColor:a,body:s}},htmlBuilder:fr,mathmlBuilder:gr}),lt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["text"],allowedInText:!0},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\fbox",body:t[0]}}}),lt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout"],props:{numArgs:1},handler:function(e,t,r){var n=e.parser,i=e.funcName,a=t[0];return{type:"enclose",mode:n.mode,label:i,body:a}},htmlBuilder:fr,mathmlBuilder:gr});var vr={};function yr(e){for(var t=e.type,r=e.names,n=e.props,i=e.handler,a=e.htmlBuilder,o=e.mathmlBuilder,s={type:t,numArgs:n.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:i},l=0;l<r.length;++l)vr[r[l]]=s;a&&(ot[t]=a),o&&(st[t]=o)}function br(e){var t=[];e.consumeSpaces();for(var r=e.nextToken.text;"\\hline"===r||"\\hdashline"===r;)e.consume(),t.push("\\hdashline"===r),e.consumeSpaces(),r=e.nextToken.text;return t}function xr(e,t,r){var n=t.hskipBeforeAndAfter,i=t.addJot,a=t.cols,o=t.arraystretch;if(e.gullet.beginGroup(),e.gullet.macros.set("\\\\","\\cr"),!o){var s=e.gullet.expandMacroAsText("\\arraystretch");if(null==s)o=1;else if(!(o=parseFloat(s))||o<0)throw new X("Invalid \\arraystretch: "+s)}var l=[],h=[l],m=[],c=[];for(c.push(br(e));;){var u=e.parseExpression(!1,"\\cr");u={type:"ordgroup",mode:e.mode,body:u},r&&(u={type:"styling",mode:e.mode,style:r,body:[u]}),l.push(u);var p=e.nextToken.text;if("&"===p)e.consume();else{if("\\end"===p){1===l.length&&"styling"===u.type&&0===u.body[0].body.length&&h.pop(),c.length<h.length+1&&c.push([]);break}if("\\cr"!==p)throw new X("Expected & or \\\\ or \\cr or \\end",e.nextToken);var d=Ze(e.parseFunction(),"cr");m.push(d.size),c.push(br(e)),l=[],h.push(l)}}return e.gullet.endGroup(),{type:"array",mode:e.mode,addJot:i,arraystretch:o,body:h,cols:a,rowGaps:m,hskipBeforeAndAfter:n,hLinesBeforeRow:c}}function wr(e){return"d"===e.substr(0,1)?"display":"text"}var kr=function(e,t){var r,n,i=e.body.length,a=e.hLinesBeforeRow,o=0,s=new Array(i),l=[],h=1/t.fontMetrics().ptPerEm,m=5*h,c=12*h,u=3*h,p=e.arraystretch*c,d=.7*p,f=.3*p,g=0;function v(e){for(var t=0;t<e.length;++t)0<t&&(g+=.25),l.push({pos:g,isDashed:e[t]})}for(v(a[0]),r=0;r<e.body.length;++r){var y=e.body[r],b=d,x=f;o<y.length&&(o=y.length);var w=new Array(y.length);for(n=0;n<y.length;++n){var k=bt(y[n],t);x<k.depth&&(x=k.depth),b<k.height&&(b=k.height),w[n]=k}var S=e.rowGaps[r],z=0;S&&0<(z=He(S,t))&&(x<(z+=f)&&(x=z),z=0),e.addJot&&(x+=u),w.height=b,w.depth=x,g+=b,w.pos=g,g+=x+z,s[r]=w,v(a[r+1])}var M,T,A=g/2+t.fontMetrics().axisHeight,B=e.cols||[],C=[];for(T=n=0;n<o||T<B.length;++n,++T){for(var N=B[T]||{},q=!0;"separator"===N.type;){if(q||((M=$e.makeSpan(["arraycolsep"],[])).style.width=t.fontMetrics().doubleRuleSep+"em",C.push(M)),"|"===N.separator){var E=$e.makeSpan(["vertical-separator"],[],t);E.style.height=g+"em",E.style.verticalAlign=-(g-A)+"em",C.push(E)}else{if(":"!==N.separator)throw new X("Invalid separator type: "+N.separator);var O=$e.makeSpan(["vertical-separator","vs-dashed"],[],t);O.style.height=g+"em",O.style.verticalAlign=-(g-A)+"em",C.push(O)}N=B[++T]||{},q=!1}if(!(o<=n)){var I=void 0;(0<n||e.hskipBeforeAndAfter)&&0!==(I=Y.deflt(N.pregap,m))&&((M=$e.makeSpan(["arraycolsep"],[])).style.width=I+"em",C.push(M));var R=[];for(r=0;r<i;++r){var L=s[r],H=L[n];if(H){var D=L.pos-A;H.depth=L.depth,H.height=L.height,R.push({type:"elem",elem:H,shift:D})}}R=$e.makeVList({positionType:"individualShift",children:R},t),R=$e.makeSpan(["col-align-"+(N.align||"c")],[R]),C.push(R),(n<o-1||e.hskipBeforeAndAfter)&&0!==(I=Y.deflt(N.postgap,m))&&((M=$e.makeSpan(["arraycolsep"],[])).style.width=I+"em",C.push(M))}}if(s=$e.makeSpan(["mtable"],C),0<l.length){for(var P=$e.makeLineSpan("hline",t,.05),F=$e.makeLineSpan("hdashline",t,.05),V=[{type:"elem",elem:s,shift:0}];0<l.length;){var U=l.pop(),G=U.pos-A;U.isDashed?V.push({type:"elem",elem:F,shift:G}):V.push({type:"elem",elem:P,shift:G})}s=$e.makeVList({positionType:"individualShift",children:V},t)}return $e.makeSpan(["mord"],[s],t)},Sr=function(e,t){return new Mt.MathNode("mtable",e.body.map(function(e){return new Mt.MathNode("mtr",e.map(function(e){return new Mt.MathNode("mtd",[qt(e,t)])}))}))},zr=function(e,t){var n,r=[],i=xr(e.parser,{cols:r,addJot:!0},"display"),a=0,o={type:"ordgroup",mode:e.mode,body:[]},s=Ke(t[0],"ordgroup");if(s){for(var l="",h=0;h<s.body.length;h++){l+=Ze(s.body[h],"textord").text}n=Number(l),a=2*n}var m=!a;i.body.forEach(function(e){for(var t=1;t<e.length;t+=2){Ze(Ze(e[t],"styling").body[0],"ordgroup").body.unshift(o)}if(m)a<e.length&&(a=e.length);else{var r=e.length/2;if(n<r)throw new X("Too many math in a row: expected "+n+", but got "+r,e[0])}});for(var c=0;c<a;++c){var u="r",p=0;c%2==1?u="l":0<c&&m&&(p=1),r[c]={type:"align",align:u,pregap:p,postgap:0}}return i};yr({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(e,t){var r={cols:(Qe(t[0])?[t[0]]:Ze(t[0],"ordgroup").body).map(function(e){var t=function(e){var t=Qe(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new X("Unknown column alignment: "+t,e)}),hskipBeforeAndAfter:!0};return xr(e.parser,r,wr(e.envName))},htmlBuilder:kr,mathmlBuilder:Sr}),yr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],props:{numArgs:0},handler:function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName],r=xr(e.parser,{hskipBeforeAndAfter:!1},wr(e.envName));return t?{type:"leftright",mode:e.mode,body:[r],left:t[0],right:t[1]}:r},htmlBuilder:kr,mathmlBuilder:Sr}),yr({type:"array",names:["cases","dcases"],props:{numArgs:0},handler:function(e){var t=xr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},wr(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:"\\{",right:"."}},htmlBuilder:kr,mathmlBuilder:Sr}),yr({type:"array",names:["aligned"],props:{numArgs:0},handler:zr,htmlBuilder:kr,mathmlBuilder:Sr}),yr({type:"array",names:["gathered"],props:{numArgs:0},handler:function(e){return xr(e.parser,{cols:[{type:"align",align:"c"}],addJot:!0},"display")},htmlBuilder:kr,mathmlBuilder:Sr}),yr({type:"array",names:["alignedat"],props:{numArgs:1},handler:zr,htmlBuilder:kr,mathmlBuilder:Sr}),lt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(e,t){throw new X(e.funcName+" valid only within array environment")}});var Mr=vr;lt({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(e,t){var r=e.parser,n=e.funcName,i=t[0];if("ordgroup"!==i.type)throw new X("Invalid environment name",i);for(var a="",o=0;o<i.body.length;++o)a+=Ze(i.body[o],"textord").text;if("\\begin"!==n)return{type:"environment",mode:r.mode,name:a,nameGroup:i};if(!Mr.hasOwnProperty(a))throw new X("No such environment: "+a,i);var s=Mr[a],l=r.parseArguments("\\begin{"+a+"}",s),h=l.args,m=l.optArgs,c={mode:r.mode,envName:a,parser:r},u=s.handler(c,h,m);r.expect("\\end",!1);var p=r.nextToken,d=Ze(r.parseFunction(),"environment");if(d.name!==a)throw new X("Mismatch: \\begin{"+a+"} matched by \\end{"+d.name+"}",p);return u}});var Tr=$e.makeSpan;function Ar(e,t){var r=dt(e.body,t,!0);return Tr([e.mclass],r,t)}function Br(e,t){var r=Ct(e.body,t);return Mt.newDocumentFragment(r)}lt({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,i=t[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.substr(5),body:mt(i)}},htmlBuilder:Ar,mathmlBuilder:Br});var Cr=function(e){var t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};lt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:function(e,t){return{type:"mclass",mode:e.parser.mode,mclass:Cr(t[0]),body:[t[1]]}}}),lt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler:function(e,t){var r,n=e.parser,i=e.funcName,a=t[1],o=t[0];r="\\stackrel"!==i?Cr(a):"mrel";var s={type:"op",mode:a.mode,limits:!0,alwaysHandleSupSub:!0,symbol:!1,suppressBaseShift:"\\stackrel"!==i,body:mt(a)},l={type:"supsub",mode:o.mode,base:s,sup:"\\underset"===i?null:o,sub:"\\underset"===i?o:null};return{type:"mclass",mode:n.mode,mclass:r,body:[l]}},htmlBuilder:Ar,mathmlBuilder:Br});var Nr=function(e,t){var r=e.font,n=t.withFont(r);return bt(e.body,n)},qr=function(e,t){var r=e.font,n=t.withFont(r);return qt(e.body,n)},Er={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};lt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,greediness:2},handler:function(e,t){var r=e.parser,n=e.funcName,i=t[0],a=n;return a in Er&&(a=Er[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},htmlBuilder:Nr,mathmlBuilder:qr}),lt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1,greediness:2},handler:function(e,t){var r=e.parser,n=t[0];return{type:"mclass",mode:r.mode,mclass:Cr(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}]}}}),lt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it"],props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,i=e.breakOnTokenText,a=r.mode;r.consumeSpaces();var o=r.parseExpression(!0,i);return{type:"font",mode:a,font:"math"+n.slice(1),body:{type:"ordgroup",mode:r.mode,body:o}}},htmlBuilder:Nr,mathmlBuilder:qr});var Or=function(e,t){var r=t.style;"display"===e.size?r=q.DISPLAY:"text"===e.size&&r.size===q.DISPLAY.size?r=q.TEXT:"script"===e.size?r=q.SCRIPT:"scriptscript"===e.size&&(r=q.SCRIPTSCRIPT);var n,i=r.fracNum(),a=r.fracDen();n=t.havingStyle(i);var o=bt(e.numer,n,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height<s?s:o.height,o.depth=o.depth<l?l:o.depth}n=t.havingStyle(a);var h,m,c,u,p,d,f,g,v,y,b=bt(e.denom,n,t);if(c=e.hasBarLine?(m=(h=e.barSize?(m=He(e.barSize,t),$e.makeLineSpan("frac-line",t,m)):$e.makeLineSpan("frac-line",t)).height,h.height):(h=null,m=0,t.fontMetrics().defaultRuleThickness),d=r.size===q.DISPLAY.size?(u=t.fontMetrics().num1,p=0<m?3*c:7*c,t.fontMetrics().denom1):(p=0<m?(u=t.fontMetrics().num2,c):(u=t.fontMetrics().num3,3*c),t.fontMetrics().denom2),h){var x=t.fontMetrics().axisHeight;u-o.depth-(x+.5*m)<p&&(u+=p-(u-o.depth-(x+.5*m))),x-.5*m-(b.height-d)<p&&(d+=p-(x-.5*m-(b.height-d)));var w=-(x-.5*m);f=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:d},{type:"elem",elem:h,shift:w},{type:"elem",elem:o,shift:-u}]},t)}else{var k=u-o.depth-(b.height-d);k<p&&(u+=.5*(p-k),d+=.5*(p-k)),f=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:d},{type:"elem",elem:o,shift:-u}]},t)}return n=t.havingStyle(r),f.height*=n.sizeMultiplier/t.sizeMultiplier,f.depth*=n.sizeMultiplier/t.sizeMultiplier,g=r.size===q.DISPLAY.size?t.fontMetrics().delim1:t.fontMetrics().delim2,v=null==e.leftDelim?yt(t,["mopen"]):hr(e.leftDelim,g,!0,t.havingStyle(r),e.mode,["mopen"]),y=e.continued?$e.makeSpan([]):null==e.rightDelim?yt(t,["mclose"]):hr(e.rightDelim,g,!0,t.havingStyle(r),e.mode,["mclose"]),$e.makeSpan(["mord"].concat(n.sizingClasses(t)),[v,$e.makeSpan(["mfrac"],[f]),y],t)},Ir=function(e,t){var r=new Mt.MathNode("mfrac",[qt(e.numer,t),qt(e.denom,t)]);if(e.hasBarLine){if(e.barSize){var n=He(e.barSize,t);r.setAttribute("linethickness",n+"em")}}else r.setAttribute("linethickness","0px");if(null==e.leftDelim&&null==e.rightDelim)return r;var i=[];if(null!=e.leftDelim){var a=new Mt.MathNode("mo",[new Mt.TextNode(e.leftDelim)]);a.setAttribute("fence","true"),i.push(a)}if(i.push(r),null!=e.rightDelim){var o=new Mt.MathNode("mo",[new Mt.TextNode(e.rightDelim)]);o.setAttribute("fence","true"),i.push(o)}return At(i)};lt({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,greediness:2},handler:function(e,t){var r,n=e.parser,i=e.funcName,a=t[0],o=t[1],s=null,l=null,h="auto";switch(i){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,s="(",l=")";break;case"\\\\bracefrac":r=!1,s="\\{",l="\\}";break;case"\\\\brackfrac":r=!1,s="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(i){case"\\cfrac":case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text"}return{type:"genfrac",mode:n.mode,continued:"\\cfrac"===i,numer:a,denom:o,hasBarLine:r,leftDelim:s,rightDelim:l,size:h,barSize:null}},htmlBuilder:Or,mathmlBuilder:Ir}),lt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler:function(e){var t,r=e.parser,n=e.funcName,i=e.token;switch(n){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:i}}});var Rr=["display","text","script","scriptscript"],Lr=function(e){var t=null;return 0<e.length&&(t="."===(t=e)?null:t),t};lt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,greediness:6,argTypes:["math","math","size","text","math","math"]},handler:function(e,t){var r=e.parser,n=t[4],i=t[5],a=Ke(t[0],"ordgroup");a=Je(a?a.body[0]:t[0],"open");var o=Lr(a.text),s=Ke(t[1],"ordgroup");s=Je(s?s.body[0]:t[1],"close");var l,h=Lr(s.text),m=Ze(t[2],"size"),c=null;l=!!m.isBlank||0<(c=m.value).number;var u="auto",p=Ke(t[3],"ordgroup");if(p){if(0<p.body.length){var d=Ze(p.body[0],"textord");u=Rr[Number(d.text)]}}else p=Ze(t[3],"textord"),u=Rr[Number(p.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:l,barSize:c,leftDelim:o,rightDelim:h,size:u}},htmlBuilder:Or,mathmlBuilder:Ir}),lt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(e,t){var r=e.parser,n=(e.funcName,e.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ze(t[0],"size").value,token:n}}}),lt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(e,t){var r=e.parser,n=(e.funcName,t[0]),i=T(Ze(t[1],"infix").size),a=t[2],o=0<i.number;return{type:"genfrac",mode:r.mode,numer:n,denom:a,continued:!1,hasBarLine:o,barSize:i,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Or,mathmlBuilder:Ir});var Hr=function(e,t){var r,n,i=t.style,a=Ke(e,"supsub");n=a?(r=a.sup?bt(a.sup,t.havingStyle(i.sup()),t):bt(a.sub,t.havingStyle(i.sub()),t),Ze(a.base,"horizBrace")):Ze(e,"horizBrace");var o,s=bt(n.base,t.havingBaseStyle(q.DISPLAY)),l=Dt(n,t);if(n.isOver?(o=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:l}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(o=$e.makeVList({positionType:"bottom",positionData:s.depth+.1+l.height,children:[{type:"elem",elem:l},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var h=$e.makeSpan(["mord",n.isOver?"mover":"munder"],[o],t);o=n.isOver?$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:h},{type:"kern",size:.2},{type:"elem",elem:r}]},t):$e.makeVList({positionType:"bottom",positionData:h.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:h}]},t)}return $e.makeSpan(["mord",n.isOver?"mover":"munder"],[o],t)};lt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:Hr,mathmlBuilder:function(e,t){var r=Ht(e.label);return new Mt.MathNode(e.isOver?"mover":"munder",[qt(e.base,t),r])}}),lt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[1],i=Ze(t[0],"url").url;return{type:"href",mode:r.mode,href:i,body:mt(n)}},htmlBuilder:function(e,t){var r=dt(e.body,t,!1);return $e.makeAnchor(e.href,[],r,t)},mathmlBuilder:function(e,t){var r=Nt(e.body,t);return r instanceof St||(r=new St("mrow",[r])),r.setAttribute("href",e.href),r}}),lt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(e,t){for(var r=e.parser,n=Ze(t[0],"url").url,i=[],a=0;a<n.length;a++){var o=n[a];"~"===o&&(o="\\textasciitilde"),i.push({type:"textord",mode:"text",text:o})}var s={type:"text",mode:r.mode,font:"\\texttt",body:i};return{type:"href",mode:r.mode,href:n,body:mt(s)}}}),lt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:function(e,t){return{type:"htmlmathml",mode:e.parser.mode,html:mt(t[0]),mathml:mt(t[1])}},htmlBuilder:function(e,t){var r=dt(e.html,t,!1);return $e.makeFragment(r)},mathmlBuilder:function(e,t){return Nt(e.mathml,t)}}),lt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,i=Ze(t[0],"size");if(r.settings.strict){var a="m"===n[1],o="mu"===i.value.unit;a?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+i.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder:function(e,t){return $e.makeGlue(e.dimension,t)},mathmlBuilder:function(e,t){var r=He(e.dimension,t);return new Mt.SpaceNode(r)}}),lt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,i=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},htmlBuilder:function(e,t){var r;r="clap"===e.alignment?(r=$e.makeSpan([],[bt(e.body,t)]),$e.makeSpan(["inner"],[r],t)):$e.makeSpan(["inner"],[bt(e.body,t)]);var n=$e.makeSpan(["fix"],[]),i=$e.makeSpan([e.alignment],[r,n],t),a=$e.makeSpan(["strut"]);return a.style.height=i.height+i.depth+"em",a.style.verticalAlign=-i.depth+"em",i.children.unshift(a),i=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i}]},t),$e.makeSpan(["mord"],[i],t)},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mpadded",[qt(e.body,t)]);if("rlap"!==e.alignment){var n="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}}),lt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1,consumeMode:"math"},handler:function(e,t){var r=e.funcName,n=e.parser,i=n.mode;n.switchMode("math");var a="\\("===r?"\\)":"$",o=n.parseExpression(!1,a);return n.expect(a,!1),n.switchMode(i),n.consume(),{type:"styling",mode:n.mode,style:"text",body:o}}}),lt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){throw new X("Mismatched "+e.funcName)}});var Dr=function(e,t){switch(t.style.size){case q.DISPLAY.size:return e.display;case q.TEXT.size:return e.text;case q.SCRIPT.size:return e.script;case q.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};lt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4},handler:function(e,t){return{type:"mathchoice",mode:e.parser.mode,display:mt(t[0]),text:mt(t[1]),script:mt(t[2]),scriptscript:mt(t[3])}},htmlBuilder:function(e,t){var r=Dr(e,t),n=dt(r,t,!1);return $e.makeFragment(n)},mathmlBuilder:function(e,t){var r=Dr(e,t);return Nt(r,t)}});var Pr=function(e,t){var r,n,i,a=!1,o=Ke(e,"supsub");o?(r=o.sup,n=o.sub,i=Ze(o.base,"op"),a=!0):i=Ze(e,"op");var s,l=t.style,h=!1;if(l.size===q.DISPLAY.size&&i.symbol&&!Y.contains(["\\smallint"],i.name)&&(h=!0),i.symbol){var m=h?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==i.name&&"\\oiiint"!==i.name||(c=i.name.substr(1),i.name="oiint"===c?"\\iint":"\\iiint"),s=$e.makeSymbol(i.name,m,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),0<c.length){var u=s.italic,p=$e.staticSvg(c+"Size"+(h?"2":"1"),t);s=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:0},{type:"elem",elem:p,shift:h?.08:0}]},t),i.name="\\"+c,s.classes.unshift("mop"),s.italic=u}}else if(i.body){var d=dt(i.body,t,!0);1===d.length&&d[0]instanceof O?(s=d[0]).classes[0]="mop":s=$e.makeSpan(["mop"],$e.tryCombineChars(d),t)}else{for(var f=[],g=1;g<i.name.length;g++)f.push($e.mathsym(i.name[g],i.mode));s=$e.makeSpan(["mop"],f,t)}var v=0,y=0;if((s instanceof O||"\\oiint"===i.name||"\\oiiint"===i.name)&&!i.suppressBaseShift&&(v=(s.height-s.depth)/2-t.fontMetrics().axisHeight,y=s.italic),a){var b,x,w;if(s=$e.makeSpan([],[s]),r){var k=bt(r,t.havingStyle(l.sup()),t);x={elem:k,kern:Math.max(t.fontMetrics().bigOpSpacing1,t.fontMetrics().bigOpSpacing3-k.depth)}}if(n){var S=bt(n,t.havingStyle(l.sub()),t);b={elem:S,kern:Math.max(t.fontMetrics().bigOpSpacing2,t.fontMetrics().bigOpSpacing4-S.height)}}if(x&&b){var z=t.fontMetrics().bigOpSpacing5+b.elem.height+b.elem.depth+b.kern+s.depth+v;w=$e.makeVList({positionType:"bottom",positionData:z,children:[{type:"kern",size:t.fontMetrics().bigOpSpacing5},{type:"elem",elem:b.elem,marginLeft:-y+"em"},{type:"kern",size:b.kern},{type:"elem",elem:s},{type:"kern",size:x.kern},{type:"elem",elem:x.elem,marginLeft:y+"em"},{type:"kern",size:t.fontMetrics().bigOpSpacing5}]},t)}else if(b){var M=s.height-v;w=$e.makeVList({positionType:"top",positionData:M,children:[{type:"kern",size:t.fontMetrics().bigOpSpacing5},{type:"elem",elem:b.elem,marginLeft:-y+"em"},{type:"kern",size:b.kern},{type:"elem",elem:s}]},t)}else{if(!x)return s;var T=s.depth+v;w=$e.makeVList({positionType:"bottom",positionData:T,children:[{type:"elem",elem:s},{type:"kern",size:x.kern},{type:"elem",elem:x.elem,marginLeft:y+"em"},{type:"kern",size:t.fontMetrics().bigOpSpacing5}]},t)}return $e.makeSpan(["mop","op-limits"],[w],t)}return v&&(s.style.position="relative",s.style.top=v+"em"),s},Fr=function(e,t){var r;if(e.symbol)r=new St("mo",[Tt(e.name,e.mode)]);else{if(!e.body)return kt([r=new St("mi",[new zt(e.name.slice(1))]),new St("mo",[Tt("\u2061","text")])]);r=new St("mo",Ct(e.body,t))}return r},Vr={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcap","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};lt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:function(e,t){var r=e.parser,n=e.funcName;return 1===n.length&&(n=Vr[n]),{type:"op",mode:r.mode,limits:!0,symbol:!0,name:n}},htmlBuilder:Pr,mathmlBuilder:Fr}),lt({type:"op",names:["\\mathop"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=t[0];return{type:"op",mode:r.mode,limits:!1,symbol:!1,body:mt(n)}},htmlBuilder:Pr,mathmlBuilder:Fr});var Ur={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};function Gr(e,t,r){for(var n=dt(e,t,!1),i=t.sizeMultiplier/r.sizeMultiplier,a=0;a<n.length;a++){var o=n[a].classes.indexOf("sizing");o<0?Array.prototype.push.apply(n[a].classes,t.sizingClasses(r)):n[a].classes[o+1]==="reset-size"+t.size&&(n[a].classes[o+1]="reset-size"+r.size),n[a].height*=i,n[a].depth*=i}return $e.makeFragment(n)}lt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler:function(e){var t=e.parser,r=e.funcName;return{type:"op",mode:t.mode,limits:!1,symbol:!1,name:r}},htmlBuilder:Pr,mathmlBuilder:Fr}),lt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler:function(e){var t=e.parser,r=e.funcName;return{type:"op",mode:t.mode,limits:!0,symbol:!1,name:r}},htmlBuilder:Pr,mathmlBuilder:Fr}),lt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler:function(e){var t=e.parser,r=e.funcName;return 1===r.length&&(r=Ur[r]),{type:"op",mode:t.mode,limits:!1,symbol:!0,name:r}},htmlBuilder:Pr,mathmlBuilder:Fr}),lt({type:"operatorname",names:["\\operatorname"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=t[0];return{type:"operatorname",mode:r.mode,body:mt(n)}},htmlBuilder:function(e,t){if(0<e.body.length){for(var r=e.body.map(function(e){var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e}),n=dt(r,t.withFont("mathrm"),!0),i=0;i<n.length;i++){var a=n[i];a instanceof O&&(a.text=a.text.replace(/\u2212/,"-").replace(/\u2217/,"*"))}return $e.makeSpan(["mop"],n,t)}return $e.makeSpan(["mop"],[],t)},mathmlBuilder:function(e,t){for(var r=Ct(e.body,t.withFont("mathrm")),n=!0,i=0;i<r.length;i++){var a=r[i];if(a instanceof Mt.SpaceNode);else if(a instanceof Mt.MathNode)switch(a.type){case"mi":case"mn":case"ms":case"mspace":case"mtext":break;case"mo":var o=a.children[0];1===a.children.length&&o instanceof Mt.TextNode?o.text=o.text.replace(/\u2212/,"-").replace(/\u2217/,"*"):n=!1;break;default:n=!1}else n=!1}if(n){var s=r.map(function(e){return e.toText()}).join("");r=[new Mt.TextNode(s,!1)]}var l=new Mt.MathNode("mi",r);l.setAttribute("mathvariant","normal");var h=new Mt.MathNode("mo",[Tt("\u2061","text")]);return Mt.newDocumentFragment([l,h])}}),ht({type:"ordgroup",htmlBuilder:function(e,t){return $e.makeSpan(["mord"],dt(e.body,t,!0),t)},mathmlBuilder:function(e,t){return Nt(e.body,t)}}),lt({type:"overline",names:["\\overline"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=t[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder:function(e,t){var r=bt(e.body,t.havingCrampedStyle()),n=$e.makeLineSpan("overline-line",t),i=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*n.height},{type:"elem",elem:n},{type:"kern",size:n.height}]},t);return $e.makeSpan(["mord","overline"],[i],t)},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mo",[new Mt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var n=new Mt.MathNode("mover",[qt(e.body,t),r]);return n.setAttribute("accent","true"),n}}),lt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[0];return{type:"phantom",mode:r.mode,body:mt(n)}},htmlBuilder:function(e,t){var r=dt(e.body,t.withPhantom(),!1);return $e.makeFragment(r)},mathmlBuilder:function(e,t){var r=Ct(e.body,t);return new Mt.MathNode("mphantom",r)}}),lt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[0];return{type:"hphantom",mode:r.mode,body:n}},htmlBuilder:function(e,t){var r=$e.makeSpan([],[bt(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n<r.children.length;n++)r.children[n].height=0,r.children[n].depth=0;return r=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},t)},mathmlBuilder:function(e,t){var r=Ct(mt(e.body),t),n=new Mt.MathNode("mphantom",r);return n.setAttribute("height","0px"),n}}),lt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[0];return{type:"vphantom",mode:r.mode,body:n}},htmlBuilder:function(e,t){var r=$e.makeSpan(["inner"],[bt(e.body,t.withPhantom())]),n=$e.makeSpan(["fix"],[]);return $e.makeSpan(["mord","rlap"],[r,n],t)},mathmlBuilder:function(e,t){var r=Ct(mt(e.body),t),n=new Mt.MathNode("mphantom",r);return n.setAttribute("width","0px"),n}});var Xr=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],Yr=function(e,t){var r=t.havingSize(e.size);return Gr(e.body,r,t)};lt({type:"sizing",names:Xr,props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,i=e.parser;i.consumeSpaces();var a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:Xr.indexOf(n)+1,body:a}},htmlBuilder:Yr,mathmlBuilder:function(e,t){var r=t.havingSize(e.size),n=Ct(e.body,r),i=new Mt.MathNode("mstyle",n);return i.setAttribute("mathsize",r.sizeMultiplier+"em"),i}}),lt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","text"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=Ze(t[0],"size").value,i=t[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder:function(e,t){var r={type:"text",mode:e.mode,body:mt(e.body),font:"mathrm"},n={type:"sizing",mode:e.mode,body:[r],size:6},i=Yr(n,t),a=He(e.dy,t);return $e.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:i}]},t)},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mpadded",[qt(e.body,t)]),n=e.dy.number+e.dy.unit;return r.setAttribute("voffset",n),r}}),lt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler:function(e,t,r){var n=e.parser,i=r[0],a=Ze(t[0],"size"),o=Ze(t[1],"size");return{type:"rule",mode:n.mode,shift:i&&Ze(i,"size").value,width:a.value,height:o.value}},htmlBuilder:function(e,t){var r=$e.makeSpan(["mord","rule"],[],t),n=0;e.shift&&(n=He(e.shift,t));var i=He(e.width,t),a=He(e.height,t);return r.style.borderRightWidth=i+"em",r.style.borderTopWidth=a+"em",r.style.bottom=n+"em",r.width=i,r.height=a+n,r.depth=-n,r.maxFontSize=1.125*a*t.sizeMultiplier,r},mathmlBuilder:function(e,t){return new Mt.MathNode("mrow")}}),lt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(e,t,r){var n=e.parser,i=!1,a=!1,o=r[0]&&Ze(r[0],"ordgroup");if(o)for(var s="",l=0;l<o.body.length;++l){if("t"===(s=o.body[l].text))i=!0;else{if("b"!==s){a=i=!1;break}a=!0}}else a=i=!0;var h=t[0];return{type:"smash",mode:n.mode,body:h,smashHeight:i,smashDepth:a}},htmlBuilder:function(e,t){var r=$e.makeSpan(["mord"],[bt(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].height=0;if(e.smashDepth&&(r.depth=0,r.children))for(var i=0;i<r.children.length;i++)r.children[i].depth=0;return $e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},t)},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mpadded",[qt(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}}),lt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,r){var n=e.parser,i=r[0],a=t[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder:function(e,t){var r=bt(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=$e.wrapFragment(r,t);var n=t.fontMetrics().defaultRuleThickness,i=n;t.style.id<q.TEXT.id&&(i=t.fontMetrics().xHeight);var a=n+i/4,o=r.height+r.depth+a+n,s=sr(o,t),l=s.span,h=s.ruleWidth,m=s.advanceWidth,c=l.height-h;c>r.height+r.depth+a&&(a=(a+c-r.height-r.depth)/2);var u=l.height-r.height-a-h;r.style.paddingLeft=m+"em";var p=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},t);if(e.index){var d=t.havingStyle(q.SCRIPTSCRIPT),f=bt(e.index,d,t),g=.6*(p.height-p.depth),v=$e.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},t),y=$e.makeSpan(["root"],[v]);return $e.makeSpan(["mord","sqrt"],[y,p],t)}return $e.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder:function(e,t){var r=e.body,n=e.index;return n?new Mt.MathNode("mroot",[qt(r,t),qt(n,t)]):new Mt.MathNode("msqrt",[qt(r,t)])}});var _r={display:q.DISPLAY,text:q.TEXT,script:q.SCRIPT,scriptscript:q.SCRIPTSCRIPT};lt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,i=e.parser;i.consumeSpaces();var a=i.parseExpression(!0,r),o=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:o,body:a}},htmlBuilder:function(e,t){var r=_r[e.style],n=t.havingStyle(r).withFont("");return Gr(e.body,n,t)},mathmlBuilder:function(e,t){var r={display:q.DISPLAY,text:q.TEXT,script:q.SCRIPT,scriptscript:q.SCRIPTSCRIPT}[e.style],n=t.havingStyle(r),i=Ct(e.body,n),a=new Mt.MathNode("mstyle",i),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return a.setAttribute("scriptlevel",o[0]),a.setAttribute("displaystyle",o[1]),a}});ht({type:"supsub",htmlBuilder:function(e,t){var r,n,i,a=(n=t,(i=(r=e).base)?"op"!==i.type?"accent"===i.type?Y.isCharacterBox(i.base)?Pt:null:"horizBrace"!==i.type?null:!r.sub===i.isOver?Hr:null:i.limits&&(n.style.size===q.DISPLAY.size||i.alwaysHandleSupSub)?Pr:null:null);if(a)return a(e,t);var o,s,l,h=e.base,m=e.sup,c=e.sub,u=bt(h,t),p=t.fontMetrics(),d=0,f=0,g=h&&Y.isCharacterBox(h);if(m){var v=t.havingStyle(t.style.sup());o=bt(m,v,t),g||(d=u.height-v.fontMetrics().supDrop*v.sizeMultiplier/t.sizeMultiplier)}if(c){var y=t.havingStyle(t.style.sub());s=bt(c,y,t),g||(f=u.depth+y.fontMetrics().subDrop*y.sizeMultiplier/t.sizeMultiplier)}l=t.style===q.DISPLAY?p.sup1:t.style.cramped?p.sup3:p.sup2;var b,x=t.sizeMultiplier,w=.5/p.ptPerEm/x+"em",k=null;if(s){var S=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(u instanceof O||S)&&(k=-u.italic+"em")}if(o&&s){d=Math.max(d,l,o.depth+.25*p.xHeight),f=Math.max(f,p.sub2);var z=4*p.defaultRuleThickness;if(d-o.depth-(s.height-f)<z){f=z-(d-o.depth)+s.height;var M=.8*p.xHeight-(d-o.depth);0<M&&(d+=M,f-=M)}var T=[{type:"elem",elem:s,shift:f,marginRight:w,marginLeft:k},{type:"elem",elem:o,shift:-d,marginRight:w}];b=$e.makeVList({positionType:"individualShift",children:T},t)}else if(s){f=Math.max(f,p.sub1,s.height-.8*p.xHeight);var A=[{type:"elem",elem:s,marginLeft:k,marginRight:w}];b=$e.makeVList({positionType:"shift",positionData:f,children:A},t)}else{if(!o)throw new Error("supsub must have either sup or sub.");d=Math.max(d,l,o.depth+.25*p.xHeight),b=$e.makeVList({positionType:"shift",positionData:-d,children:[{type:"elem",elem:o,marginRight:w}]},t)}var B=gt(u,"right")||"mord";return $e.makeSpan([B],[u,$e.makeSpan(["msupsub"],[b])],t)},mathmlBuilder:function(e,t){var r,n=!1,i=Ke(e.base,"horizBrace");i&&!!e.sup===i.isOver&&(n=!0,r=i.isOver);var a,o=[qt(e.base,t)];if(e.sub&&o.push(qt(e.sub,t)),e.sup&&o.push(qt(e.sup,t)),n)a=r?"mover":"munder";else if(e.sub)if(e.sup){var s=e.base;a=s&&"op"===s.type&&s.limits&&t.style===q.DISPLAY?"munderover":"msubsup"}else{var l=e.base;a=l&&"op"===l.type&&l.limits&&t.style===q.DISPLAY?"munder":"msub"}else{var h=e.base;a=h&&"op"===h.type&&h.limits&&t.style===q.DISPLAY?"mover":"msup"}return new Mt.MathNode(a,o)}}),ht({type:"atom",htmlBuilder:function(e,t){return $e.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mo",[Tt(e.text,e.mode)]);if("bin"===e.family){var n=Bt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family&&r.setAttribute("separator","true");return r}});var Wr={mi:"italic",mn:"normal",mtext:"normal"};ht({type:"mathord",htmlBuilder:function(e,t){return $e.makeOrd(e,t,"mathord")},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mi",[Tt(e.text,e.mode,t)]),n=Bt(e,t)||"italic";return n!==Wr[r.type]&&r.setAttribute("mathvariant",n),r}}),ht({type:"textord",htmlBuilder:function(e,t){return $e.makeOrd(e,t,"textord")},mathmlBuilder:function(e,t){var r,n=Tt(e.text,e.mode,t),i=Bt(e,t)||"normal";return r="text"===e.mode?new Mt.MathNode("mtext",[n]):/[0-9]/.test(e.text)?new Mt.MathNode("mn",[n]):"\\prime"===e.text?new Mt.MathNode("mo",[n]):new Mt.MathNode("mi",[n]),i!==Wr[r.type]&&r.setAttribute("mathvariant",i),r}});var jr={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},$r={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};ht({type:"spacing",htmlBuilder:function(e,t){if($r.hasOwnProperty(e.text)){var r=$r[e.text].className||"";if("text"!==e.mode)return $e.makeSpan(["mspace",r],[$e.mathsym(e.text,e.mode,t)],t);var n=$e.makeOrd(e,t,"textord");return n.classes.push(r),n}if(jr.hasOwnProperty(e.text))return $e.makeSpan(["mspace",jr[e.text]],[],t);throw new X('Unknown type of space "'+e.text+'"')},mathmlBuilder:function(e,t){if($r.hasOwnProperty(e.text))return new Mt.MathNode("mtext",[new Mt.TextNode("\xa0")]);if(jr.hasOwnProperty(e.text))return new Mt.MathNode("mspace");throw new X('Unknown type of space "'+e.text+'"')}}),ht({type:"tag",mathmlBuilder:function(e,t){var r=new Mt.MathNode("mtable",[new Mt.MathNode("mlabeledtr",[new Mt.MathNode("mtd",[Nt(e.tag,t)]),new Mt.MathNode("mtd",[Nt(e.body,t)])])]);return r.setAttribute("side","right"),r}});var Zr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Kr={"\\textbf":"textbf"},Jr={"\\textit":"textit"},Qr=function(e,t){var r=e.font;return r?Zr[r]?t.withTextFontFamily(Zr[r]):Kr[r]?t.withTextFontWeight(Kr[r]):t.withTextFontShape(Jr[r]):t};lt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textit"],props:{numArgs:1,argTypes:["text"],greediness:2,allowedInText:!0,consumeMode:"text"},handler:function(e,t){var r=e.parser,n=e.funcName,i=t[0];return{type:"text",mode:r.mode,body:mt(i),font:n}},htmlBuilder:function(e,t){var r=Qr(e,t),n=dt(e.body,r,!0);return $e.makeSpan(["mord","text"],$e.tryCombineChars(n),r)},mathmlBuilder:function(e,t){var r=Qr(e,t);return Nt(e.body,r)}}),lt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"underline",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=bt(e.body,t),n=$e.makeLineSpan("underline-line",t),i=$e.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:n.height},{type:"elem",elem:n},{type:"kern",size:3*n.height},{type:"elem",elem:r}]},t);return $e.makeSpan(["mord","underline"],[i],t)},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mo",[new Mt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var n=new Mt.MathNode("munder",[qt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),lt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(e,t,r){throw new X("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(e,t){for(var r=en(e),n=[],i=t.havingStyle(t.style.text()),a=0;a<r.length;a++){var o=r[a];"~"===o&&(o="\\textasciitilde"),n.push($e.makeSymbol(o,"Typewriter-Regular",e.mode,i,["mord","texttt"]))}return $e.makeSpan(["mord","text"].concat(i.sizingClasses(t)),$e.tryCombineChars(n),i)},mathmlBuilder:function(e,t){var r=new Mt.TextNode(en(e)),n=new Mt.MathNode("mtext",[r]);return n.setAttribute("mathvariant","monospace"),n}});var en=function(e){return e.body.replace(/ /g,e.star?"\u2423":"\xa0")},tn=at,rn="[ \r\n\t]",nn="\\\\[a-zA-Z@]+",an=new RegExp("^("+nn+")"+rn+"*$"),on="[\u0300-\u036f]",sn=new RegExp(on+"+$"),ln=(new RegExp("^"+nn),function(){function e(e){this.input=void 0,this.tokenRegex=void 0,this.input=e,this.tokenRegex=new RegExp("([ \r\n\t]+)|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff][\u0300-\u036f]*|[\ud800-\udbff][\udc00-\udfff][\u0300-\u036f]*|\\\\verb\\*([^]).*?\\3|\\\\verb([^*a-zA-Z]).*?\\4|\\\\[a-zA-Z@]+[ \r\n\t]*|\\\\[^\ud800-\udfff])","g")}return e.prototype.lex=function(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new a("EOF",new p(this,t,t));var r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new X("Unexpected character: '"+e[t]+"'",new a(e[t],new p(this,t,t+1)));var n=r[2]||" ",i=n.match(an);return i&&(n=i[1]),new a(n,new p(this,t,this.tokenRegex.lastIndex))},e}()),hn=function(){function e(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}var t=e.prototype;return t.beginGroup=function(){this.undefStack.push({})},t.endGroup=function(){if(0===this.undefStack.length)throw new X("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(void 0===e[t]?delete this.current[t]:this.current[t]=e[t])},t.has=function(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)},t.get=function(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]},t.set=function(e,t,r){if(void 0===r&&(r=!1),r){for(var n=0;n<this.undefStack.length;n++)delete this.undefStack[n][e];0<this.undefStack.length&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var i=this.undefStack[this.undefStack.length-1];i&&!i.hasOwnProperty(e)&&(i[e]=this.current[e])}this.current[e]=t},e}(),mn={},cn=mn;function un(e,t){mn[e]=t}un("\\@firstoftwo",function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}}),un("\\@secondoftwo",function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}}),un("\\@ifnextchar",function(e){var t=e.consumeArgs(3),r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}}),un("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),un("\\TextOrMath",function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}});var pn={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};un("\\char",function(e){var t,r=e.popToken(),n="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if("\\"===(r=e.popToken()).text[0])n=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new X("\\char` missing argument");n=r.text.charCodeAt(0)}else t=10;if(t){if(null==(n=pn[r.text])||t<=n)throw new X("Invalid base-"+t+" digit "+r.text);for(var i;null!=(i=pn[e.future().text])&&i<t;)n*=t,n+=i,e.popToken()}return"\\@char{"+n+"}"});var dn=function(e,t){var r=e.consumeArgs(1)[0];if(1!==r.length)throw new X("\\gdef's first argument must be a macro name");var n=r[0].text,i=0;for(r=e.consumeArgs(1)[0];1===r.length&&"#"===r[0].text;){if(1!==(r=e.consumeArgs(1)[0]).length)throw new X('Invalid argument number length "'+r.length+'"');if(!/^[1-9]$/.test(r[0].text))throw new X('Invalid argument number "'+r[0].text+'"');if(i++,parseInt(r[0].text)!==i)throw new X('Argument number "'+r[0].text+'" out of order');r=e.consumeArgs(1)[0]}return e.macros.set(n,{tokens:r,numArgs:i},t),""};un("\\gdef",function(e){return dn(e,!0)}),un("\\def",function(e){return dn(e,!1)}),un("\\global",function(e){var t=e.consumeArgs(1)[0];if(1!==t.length)throw new X("Invalid command after \\global");var r=t[0].text;if("\\def"===r)return dn(e,!0);throw new X("Invalid command '"+r+"' after \\global")});var fn=function(e,t,r){var n=e.consumeArgs(1)[0];if(1!==n.length)throw new X("\\newcommand's first argument must be a macro name");var i=n[0].text,a=e.isDefined(i);if(a&&!t)throw new X("\\newcommand{"+i+"} attempting to redefine "+i+"; use \\renewcommand");if(!a&&!r)throw new X("\\renewcommand{"+i+"} when command "+i+" does not yet exist; use \\newcommand");var o=0;if(1===(n=e.consumeArgs(1)[0]).length&&"["===n[0].text){for(var s="",l=e.expandNextToken();"]"!==l.text&&"EOF"!==l.text;)s+=l.text,l=e.expandNextToken();if(!s.match(/^\s*[0-9]+\s*$/))throw new X("Invalid number of arguments: "+s);o=parseInt(s),n=e.consumeArgs(1)[0]}return e.macros.set(i,{tokens:n,numArgs:o}),""};un("\\newcommand",function(e){return fn(e,!1,!0)}),un("\\renewcommand",function(e){return fn(e,!0,!1)}),un("\\providecommand",function(e){return fn(e,!0,!0)}),un("\\bgroup","{"),un("\\egroup","}"),un("\\begingroup","{"),un("\\endgroup","}"),un("\\lq","`"),un("\\rq","'"),un("\\aa","\\r a"),un("\\AA","\\r A"),un("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),un("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),un("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),un("\u2102","\\mathbb{C}"),un("\u210d","\\mathbb{H}"),un("\u2115","\\mathbb{N}"),un("\u2119","\\mathbb{P}"),un("\u211a","\\mathbb{Q}"),un("\u211d","\\mathbb{R}"),un("\u2124","\\mathbb{Z}"),un("\u210e","\\mathit{h}"),un("\u212c","\\mathscr{B}"),un("\u2130","\\mathscr{E}"),un("\u2131","\\mathscr{F}"),un("\u210b","\\mathscr{H}"),un("\u2110","\\mathscr{I}"),un("\u2112","\\mathscr{L}"),un("\u2133","\\mathscr{M}"),un("\u211b","\\mathscr{R}"),un("\u212d","\\mathfrak{C}"),un("\u210c","\\mathfrak{H}"),un("\u2128","\\mathfrak{Z}"),un("\xb7","\\cdotp"),un("\\llap","\\mathllap{\\textrm{#1}}"),un("\\rlap","\\mathrlap{\\textrm{#1}}"),un("\\clap","\\mathclap{\\textrm{#1}}"),un("\\not","\\mathrel{\\mathrlap\\@not}"),un("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),un("\\ne","\\neq"),un("\u2260","\\neq"),un("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),un("\u2209","\\notin"),un("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),un("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),un("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),un("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),un("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),un("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),un("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),un("\u27c2","\\perp"),un("\u203c","\\mathclose{!\\mkern-0.8mu!}"),un("\u220c","\\notni"),un("\u231c","\\ulcorner"),un("\u231d","\\urcorner"),un("\u231e","\\llcorner"),un("\u231f","\\lrcorner"),un("\xa9","\\copyright"),un("\xae","\\textregistered"),un("\ufe0f","\\textregistered"),un("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),un("\u22ee","\\vdots"),un("\\varGamma","\\mathit{\\Gamma}"),un("\\varDelta","\\mathit{\\Delta}"),un("\\varTheta","\\mathit{\\Theta}"),un("\\varLambda","\\mathit{\\Lambda}"),un("\\varXi","\\mathit{\\Xi}"),un("\\varPi","\\mathit{\\Pi}"),un("\\varSigma","\\mathit{\\Sigma}"),un("\\varUpsilon","\\mathit{\\Upsilon}"),un("\\varPhi","\\mathit{\\Phi}"),un("\\varPsi","\\mathit{\\Psi}"),un("\\varOmega","\\mathit{\\Omega}"),un("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"),un("\\boxed","\\fbox{$\\displaystyle{#1}$}"),un("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),un("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),un("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");var gn={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};un("\\dots",function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in gn?t=gn[r]:"\\not"===r.substr(0,4)?t="\\dotsb":r in W.math&&Y.contains(["bin","rel"],W.math[r].group)&&(t="\\dotsb"),t});var vn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};un("\\dotso",function(e){return e.future().text in vn?"\\ldots\\,":"\\ldots"}),un("\\dotsc",function(e){var t=e.future().text;return t in vn&&","!==t?"\\ldots\\,":"\\ldots"}),un("\\cdots",function(e){return e.future().text in vn?"\\@cdots\\,":"\\@cdots"}),un("\\dotsb","\\cdots"),un("\\dotsm","\\cdots"),un("\\dotsi","\\!\\cdots"),un("\\dotsx","\\ldots\\,"),un("\\DOTSI","\\relax"),un("\\DOTSB","\\relax"),un("\\DOTSX","\\relax"),un("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),un("\\,","\\tmspace+{3mu}{.1667em}"),un("\\thinspace","\\,"),un("\\>","\\mskip{4mu}"),un("\\:","\\tmspace+{4mu}{.2222em}"),un("\\medspace","\\:"),un("\\;","\\tmspace+{5mu}{.2777em}"),un("\\thickspace","\\;"),un("\\!","\\tmspace-{3mu}{.1667em}"),un("\\negthinspace","\\!"),un("\\negmedspace","\\tmspace-{4mu}{.2222em}"),un("\\negthickspace","\\tmspace-{5mu}{.277em}"),un("\\enspace","\\kern.5em "),un("\\enskip","\\hskip.5em\\relax"),un("\\quad","\\hskip1em\\relax"),un("\\qquad","\\hskip2em\\relax"),un("\\tag","\\@ifstar\\tag@literal\\tag@paren"),un("\\tag@paren","\\tag@literal{({#1})}"),un("\\tag@literal",function(e){if(e.macros.get("\\df@tag"))throw new X("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),un("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),un("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),un("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),un("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),un("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\mathrlap{\\mkern0.4mu\\raisebox{0.4mu}{$#1$}}{\\mkern0.8mu#1}}}{\\mathbf{#1}}"),un("\\\\","\\newline"),un("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var yn=H["Main-Regular"]["T".charCodeAt(0)][1]-.7*H["Main-Regular"]["A".charCodeAt(0)][1]+"em";un("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+yn+"}{\\scriptsize A}\\kern-.15em\\TeX}{LaTeX}}"),un("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+yn+"}{\\scriptsize A}\\kern-.15em\\TeX}{KaTeX}}"),un("\\hspace","\\@ifstar\\@hspacer\\@hspace"),un("\\@hspace","\\hskip #1\\relax"),un("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),un("\\ordinarycolon",":"),un("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),un("\\dblcolon","\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}"),un("\\coloneqq","\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}"),un("\\Coloneqq","\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}"),un("\\coloneq","\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}"),un("\\Coloneq","\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}"),un("\\eqqcolon","\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),un("\\Eqqcolon","\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}"),un("\\eqcolon","\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),un("\\Eqcolon","\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}"),un("\\colonapprox","\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}"),un("\\Colonapprox","\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}"),un("\\colonsim","\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}"),un("\\Colonsim","\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}"),un("\u2254","\\coloneqq"),un("\u2255","\\eqqcolon"),un("\u2a74","\\Coloneqq"),un("\\ratio","\\vcentcolon"),un("\\coloncolon","\\dblcolon"),un("\\colonequals","\\coloneqq"),un("\\coloncolonequals","\\Coloneqq"),un("\\equalscolon","\\eqqcolon"),un("\\equalscoloncolon","\\Eqqcolon"),un("\\colonminus","\\coloneq"),un("\\coloncolonminus","\\Coloneq"),un("\\minuscolon","\\eqcolon"),un("\\minuscoloncolon","\\Eqcolon"),un("\\coloncolonapprox","\\Colonapprox"),un("\\coloncolonsim","\\Colonsim"),un("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),un("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),un("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),un("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),un("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),un("\\limsup","\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"),un("\\liminf","\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"),un("\u27e6","\\mathopen{[\\mkern-3.2mu[}"),un("\u27e7","\\mathclose{]\\mkern-3.2mu]}"),un("\\darr","\\downarrow"),un("\\dArr","\\Downarrow"),un("\\Darr","\\Downarrow"),un("\\lang","\\langle"),un("\\rang","\\rangle"),un("\\uarr","\\uparrow"),un("\\uArr","\\Uparrow"),un("\\Uarr","\\Uparrow"),un("\\N","\\mathbb{N}"),un("\\R","\\mathbb{R}"),un("\\Z","\\mathbb{Z}"),un("\\alef","\\aleph"),un("\\alefsym","\\aleph"),un("\\Alpha","\\mathrm{A}"),un("\\Beta","\\mathrm{B}"),un("\\bull","\\bullet"),un("\\Chi","\\mathrm{X}"),un("\\clubs","\\clubsuit"),un("\\cnums","\\mathbb{C}"),un("\\Complex","\\mathbb{C}"),un("\\Dagger","\\ddagger"),un("\\diamonds","\\diamondsuit"),un("\\empty","\\emptyset"),un("\\Epsilon","\\mathrm{E}"),un("\\Eta","\\mathrm{H}"),un("\\exist","\\exists"),un("\\harr","\\leftrightarrow"),un("\\hArr","\\Leftrightarrow"),un("\\Harr","\\Leftrightarrow"),un("\\hearts","\\heartsuit"),un("\\image","\\Im"),un("\\infin","\\infty"),un("\\Iota","\\mathrm{I}"),un("\\isin","\\in"),un("\\Kappa","\\mathrm{K}"),un("\\larr","\\leftarrow"),un("\\lArr","\\Leftarrow"),un("\\Larr","\\Leftarrow"),un("\\lrarr","\\leftrightarrow"),un("\\lrArr","\\Leftrightarrow"),un("\\Lrarr","\\Leftrightarrow"),un("\\Mu","\\mathrm{M}"),un("\\natnums","\\mathbb{N}"),un("\\Nu","\\mathrm{N}"),un("\\Omicron","\\mathrm{O}"),un("\\plusmn","\\pm"),un("\\rarr","\\rightarrow"),un("\\rArr","\\Rightarrow"),un("\\Rarr","\\Rightarrow"),un("\\real","\\Re"),un("\\reals","\\mathbb{R}"),un("\\Reals","\\mathbb{R}"),un("\\Rho","\\mathrm{R}"),un("\\sdot","\\cdot"),un("\\sect","\\S"),un("\\spades","\\spadesuit"),un("\\sub","\\subset"),un("\\sube","\\subseteq"),un("\\supe","\\supseteq"),un("\\Tau","\\mathrm{T}"),un("\\thetasym","\\vartheta"),un("\\weierp","\\wp"),un("\\Zeta","\\mathrm{Z}");var bn={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},xn=function(){function e(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new hn(cn,t.macros),this.mode=r,this.stack=[]}var t=e.prototype;return t.feed=function(e){this.lexer=new ln(e)},t.switchMode=function(e){this.mode=e},t.beginGroup=function(){this.macros.beginGroup()},t.endGroup=function(){this.macros.endGroup()},t.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},t.popToken=function(){return this.future(),this.stack.pop()},t.pushToken=function(e){this.stack.push(e)},t.pushTokens=function(e){var t;(t=this.stack).push.apply(t,e)},t.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},t.consumeArgs=function(e){for(var t=[],r=0;r<e;++r){this.consumeSpaces();var n=this.popToken();if("{"===n.text){for(var i=[],a=1;0!==a;){var o=this.popToken();if(i.push(o),"{"===o.text)++a;else if("}"===o.text)--a;else if("EOF"===o.text)throw new X("End of input in macro argument",n)}i.pop(),i.reverse(),t[r]=i}else{if("EOF"===n.text)throw new X("End of input expecting macro argument");t[r]=[n]}}return t},t.expandOnce=function(){var e=this.popToken(),t=e.text,r=this._getExpansion(t);if(null==r)return this.pushToken(e),e;if(this.expansionCount++,this.expansionCount>this.settings.maxExpand)throw new X("Too many expansions: infinite loop or need to increase maxExpand setting");var n=r.tokens;if(r.numArgs)for(var i=this.consumeArgs(r.numArgs),a=(n=n.slice()).length-1;0<=a;--a){var o=n[a];if("#"===o.text){if(0===a)throw new X("Incomplete placeholder at end of macro body",o);if("#"===(o=n[--a]).text)n.splice(a+1,1);else{if(!/^[1-9]$/.test(o.text))throw new X("Not a valid argument number",o);var s;(s=n).splice.apply(s,[a,2].concat(i[+o.text-1]))}}}return this.pushTokens(n),n},t.expandAfterFuture=function(){return this.expandOnce(),this.future()},t.expandNextToken=function(){for(;;){var e=this.expandOnce();if(e instanceof a){if("\\relax"!==e.text)return this.stack.pop();this.stack.pop()}}throw new Error},t.expandMacro=function(e){if(this.macros.get(e)){var t=[],r=this.stack.length;for(this.pushToken(new a(e));this.stack.length>r;){this.expandOnce()instanceof a&&t.push(this.stack.pop())}return t}},t.expandMacroAsText=function(e){var t=this.expandMacro(e);return t?t.map(function(e){return e.text}).join(""):t},t._getExpansion=function(e){var t=this.macros.get(e);if(null==t)return t;var r="function"==typeof t?t(this):t;if("string"!=typeof r)return r;var n=0;if(-1!==r.indexOf("#"))for(var i=r.replace(/##/g,"");-1!==i.indexOf("#"+(n+1));)++n;for(var a=new ln(r),o=[],s=a.lex();"EOF"!==s.text;)o.push(s),s=a.lex();return o.reverse(),{tokens:o,numArgs:n}},t.isDefined=function(e){return this.macros.has(e)||tn.hasOwnProperty(e)||W.math.hasOwnProperty(e)||W.text.hasOwnProperty(e)||bn.hasOwnProperty(e)},e}(),wn={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"}},kn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\u010f":"d\u030c","\u1e0b":"d\u0307","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u013a":"l\u0301","\u013e":"l\u030c","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\u010e":"D\u030c","\u1e0a":"D\u0307","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0139":"L\u0301","\u013d":"L\u030c","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u0164":"T\u030c","\u1e6a":"T\u0307","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Sn=function(){function a(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new xn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}var e=a.prototype;return e.expect=function(e,t){if(void 0===t&&(t=!0),this.nextToken.text!==e)throw new X("Expected '"+e+"', got '"+this.nextToken.text+"'",this.nextToken);t&&this.consume()},e.consume=function(){this.nextToken=this.gullet.expandNextToken()},e.switchMode=function(e){this.mode=e,this.gullet.switchMode(e)},e.parse=function(){this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor"),this.consume();var e=this.parseExpression(!1);return this.expect("EOF",!1),this.gullet.endGroup(),e},e.parseExpression=function(e,t){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.nextToken;if(-1!==a.endOfExpression.indexOf(n.text))break;if(t&&n.text===t)break;if(e&&tn[n.text]&&tn[n.text].infix)break;var i=this.parseAtom(t);if(!i)break;r.push(i)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)},e.handleInfixNodes=function(e){for(var t,r=-1,n=0;n<e.length;n++){var i=Ke(e[n],"infix");if(i){if(-1!==r)throw new X("only one infix operator per group",i.token);r=n,t=i.replaceWith}}if(-1!==r&&t){var a,o,s=e.slice(0,r),l=e.slice(r+1);return a=1===s.length&&"ordgroup"===s[0].type?s[0]:{type:"ordgroup",mode:this.mode,body:s},o=1===l.length&&"ordgroup"===l[0].type?l[0]:{type:"ordgroup",mode:this.mode,body:l},["\\\\abovefrac"===t?this.callFunction(t,[a,e[r],o],[]):this.callFunction(t,[a,o],[])]}return e},e.handleSupSubscript=function(e){var t=this.nextToken,r=t.text;this.consume(),this.consumeSpaces();var n=this.parseGroup(e,!1,a.SUPSUB_GREEDINESS);if(!n)throw new X("Expected group after '"+r+"'",t);return n},e.handleUnsupportedCmd=function(){for(var e=this.nextToken.text,t=[],r=0;r<e.length;r++)t.push({type:"textord",mode:"text",text:e[r]});var n={type:"text",mode:this.mode,body:t},i={type:"color",mode:this.mode,color:this.settings.errorColor,body:[n]};return this.consume(),i},e.parseAtom=function(e){var t,r,n=this.parseGroup("atom",!1,null,e);if("text"===this.mode)return n;for(;;){this.consumeSpaces();var i=this.nextToken;if("\\limits"===i.text||"\\nolimits"===i.text){var a=Ke(n,"op");if(!a)throw new X("Limit controls must follow a math operator",i);var o="\\limits"===i.text;a.limits=o,a.alwaysHandleSupSub=!0,this.consume()}else if("^"===i.text){if(t)throw new X("Double superscript",i);t=this.handleSupSubscript("superscript")}else if("_"===i.text){if(r)throw new X("Double subscript",i);r=this.handleSupSubscript("subscript")}else if("'"===i.text){if(t)throw new X("Double superscript",i);var s={type:"textord",mode:this.mode,text:"\\prime"},l=[s];for(this.consume();"'"===this.nextToken.text;)l.push(s),this.consume();"^"===this.nextToken.text&&l.push(this.handleSupSubscript("superscript")),t={type:"ordgroup",mode:this.mode,body:l}}else{if("%"!==i.text)break;this.consumeComment()}}return t||r?{type:"supsub",mode:this.mode,base:n,sup:t,sub:r}:n},e.parseFunction=function(e,t,r){var n=this.nextToken,i=n.text,a=tn[i];if(!a)return null;if(null!=r&&a.greediness<=r)throw new X("Got function '"+i+"' with no arguments"+(t?" as "+t:""),n);if("text"===this.mode&&!a.allowedInText)throw new X("Can't use function '"+i+"' in text mode",n);if("math"===this.mode&&!1===a.allowedInMath)throw new X("Can't use function '"+i+"' in math mode",n);if(a.consumeMode){var o=this.mode;this.switchMode(a.consumeMode),this.consume(),this.switchMode(o)}else this.consume();var s=this.parseArguments(i,a),l=s.args,h=s.optArgs;return this.callFunction(i,l,h,n,e)},e.callFunction=function(e,t,r,n,i){var a={funcName:e,parser:this,token:n,breakOnTokenText:i},o=tn[e];if(o&&o.handler)return o.handler(a,t,r);throw new X("No function handler for "+e)},e.parseArguments=function(e,t){var r=t.numArgs+t.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var n=t.greediness,i=[],a=[],o=0;o<r;o++){var s=t.argTypes&&t.argTypes[o],l=o<t.numOptionalArgs;0<o&&!l&&this.consumeSpaces(),0!==o||l||"math"!==this.mode||this.consumeSpaces();var h=this.nextToken,m=this.parseGroupOfType("argument to '"+e+"'",s,l,n);if(!m){if(l){a.push(null);continue}throw new X("Expected group after '"+e+"'",h)}(l?a:i).push(m)}return{args:i,optArgs:a}},e.parseGroupOfType=function(e,t,r,n){switch(t){case"color":return this.parseColorGroup(r);case"size":return this.parseSizeGroup(r);case"url":return this.parseUrlGroup(r);case"math":case"text":return this.parseGroup(e,r,n,void 0,t);case"original":case null:case void 0:return this.parseGroup(e,r,n);default:throw new X("Unknown group type as "+e,this.nextToken)}},e.consumeSpaces=function(){for(;" "===this.nextToken.text;)this.consume()},e.consumeComment=function(){for(;"EOF"!==this.nextToken.text&&this.nextToken.loc&&-1===this.nextToken.loc.getSource().indexOf("\n");)this.consume();if("EOF"===this.nextToken.text&&this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)"),"math"===this.mode)this.consumeSpaces();else if(this.nextToken.loc){var e=this.nextToken.loc.getSource();e.indexOf("\n")===e.length-1&&this.consumeSpaces()}},e.parseStringGroup=function(e,t,r){var n=t?"[":"{",i=t?"]":"}",a=this.nextToken;if(a.text!==n){if(t)return null;if(r&&"EOF"!==a.text&&/[^{}[\]]/.test(a.text))return this.consume(),a}var o=this.mode;this.mode="text",this.expect(n);for(var s="",l=this.nextToken,h=0,m=l;r&&0<h||this.nextToken.text!==i;){switch(this.nextToken.text){case"EOF":throw new X("Unexpected end of input in "+e,l.range(m,s));case"%":if(r)break;this.consumeComment();continue;case n:h++;break;case i:h--}s+=(m=this.nextToken).text,this.consume()}return this.mode=o,this.expect(i),l.range(m,s)},e.parseRegexGroup=function(e,t){var r=this.mode;this.mode="text";for(var n=this.nextToken,i=n,a="";"EOF"!==this.nextToken.text&&(e.test(a+this.nextToken.text)||"%"===this.nextToken.text);)"%"!==this.nextToken.text?(a+=(i=this.nextToken).text,this.consume()):this.consumeComment();if(""===a)throw new X("Invalid "+t+": '"+n.text+"'",n);return this.mode=r,n.range(i,a)},e.parseColorGroup=function(e){var t=this.parseStringGroup("color",e);if(!t)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(t.text);if(!r)throw new X("Invalid color: '"+t.text+"'",t);var n=r[0];return/^[0-9a-f]{6}$/i.test(n)&&(n="#"+n),{type:"color-token",mode:this.mode,color:n}},e.parseSizeGroup=function(e){var t,r=!1;if(!(t=e||"{"===this.nextToken.text?this.parseStringGroup("size",e):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;e||0!==t.text.length||(t.text="0pt",r=!0);var n=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t.text);if(!n)throw new X("Invalid size: '"+t.text+"'",t);var i,a={number:+(n[1]+n[2]),unit:n[3]};if("string"!=typeof(i=a)&&(i=i.unit),!(i in Re||i in Le||"ex"===i))throw new X("Invalid unit: '"+a.unit+"'",t);return{type:"size",mode:this.mode,value:a,isBlank:r}},e.parseUrlGroup=function(e){var t=this.parseStringGroup("url",e,!0);if(!t)return null;var r=t.text.replace(/\\([#$%&~_^{}])/g,"$1"),n=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(r);n=null!=n?n[1]:"_relative";var i=this.settings.allowedProtocols;if(!Y.contains(i,"*")&&!Y.contains(i,n))throw new X("Forbidden protocol '"+n+"'",t);return{type:"url",mode:this.mode,url:r}},e.parseGroup=function(e,t,r,n,i){var a,o=this.mode,s=this.nextToken,l=s.text;if(i&&this.switchMode(i),l===(t?"[":"{")){this.gullet.beginGroup(),this.consume();var h=this.parseExpression(!1,t?"]":"}"),m=this.nextToken;return i&&this.switchMode(o),this.gullet.endGroup(),this.expect(t?"]":"}"),{type:"ordgroup",mode:this.mode,loc:p.range(s,m),body:h}}if(t)a=null;else if(null==(a=this.parseFunction(n,e,r)||this.parseSymbol())&&"\\"===l[0]&&!bn.hasOwnProperty(l)){if(this.settings.throwOnError)throw new X("Undefined control sequence: "+l,s);a=this.handleUnsupportedCmd()}return i&&this.switchMode(o),a},e.formLigatures=function(e){for(var t=e.length-1,r=0;r<t;++r){var n=e[r],i=n.text;"-"===i&&"-"===e[r+1].text&&(r+1<t&&"-"===e[r+2].text?(e.splice(r,3,{type:"textord",mode:"text",loc:p.range(n,e[r+2]),text:"---"}),t-=2):(e.splice(r,2,{type:"textord",mode:"text",loc:p.range(n,e[r+1]),text:"--"}),t-=1)),"'"!==i&&"`"!==i||e[r+1].text!==i||(e.splice(r,2,{type:"textord",mode:"text",loc:p.range(n,e[r+1]),text:i+i}),t-=1)}},e.parseSymbol=function(){var e=this.nextToken,t=e.text;if(/^\\verb[^a-zA-Z]/.test(t)){this.consume();var r=t.slice(5),n="*"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new X("\\verb assertion failed --\n please report what input caused this bug");return{type:"verb",mode:"text",body:r=r.slice(1,-1),star:n}}if("%"===t)return this.consumeComment(),this.parseSymbol();kn.hasOwnProperty(t[0])&&!W[this.mode][t[0]]&&(this.settings.strict&&"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Accented Unicode text character "'+t[0]+'" used in math mode',e),t=kn[t[0]]+t.substr(1));var i,a=sn.exec(t);if(a&&("i"===(t=t.substring(0,a.index))?t="\u0131":"j"===t&&(t="\u0237")),W[this.mode][t]){this.settings.strict&&"math"===this.mode&&0<=Me.indexOf(t)&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var o,s=W[this.mode][t].group,l=p.range(e);if(U.hasOwnProperty(s)){var h=s;o={type:"atom",mode:this.mode,family:h,loc:l,text:t}}else o={type:s,mode:this.mode,loc:l,text:t};i=o}else{if(!(128<=t.charCodeAt(0)))return null;this.settings.strict&&(w(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),i={type:"textord",mode:this.mode,loc:p.range(e),text:t}}if(this.consume(),a)for(var m=0;m<a[0].length;m++){var c=a[0][m];if(!wn[c])throw new X("Unknown accent ' "+c+"'",e);var u=wn[c][this.mode];if(!u)throw new X("Accent "+c+" unsupported in "+this.mode+" mode",e);i={type:"accent",mode:this.mode,loc:p.range(e),label:u,isStretchy:!1,isShifty:!0,base:i}}return i},a}();Sn.endOfExpression=["}","\\end","\\right","&"],Sn.SUPSUB_GREEDINESS=1;var zn=function(e,t){if(!("string"==typeof e||e instanceof String))throw new TypeError("KaTeX can only parse string typed expression");var r=new Sn(e,t);delete r.gullet.macros.current["\\df@tag"];var n=r.parse();if(r.gullet.macros.get("\\df@tag")){if(!t.displayMode)throw new X("\\tag works only in display equations");r.gullet.feed("\\df@tag"),n=[{type:"tag",mode:"text",body:n,tag:r.parse()}]}return n},Mn=function(e,t,r){t.textContent="";var n=An(e,r).toNode();t.appendChild(n)};"undefined"!=typeof document&&"CSS1Compat"!==document.compatMode&&("undefined"!=typeof console&&console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."),Mn=function(){throw new X("KaTeX doesn't work in quirks mode.")});var Tn=function(e,t,r){if(r.throwOnError||!(e instanceof X))throw e;var n=$e.makeSpan(["katex-error"],[new O(t)]);return n.setAttribute("title",e.toString()),n.setAttribute("style","color:"+r.errorColor),n},An=function(t,e){var r=new h(e);try{var n=zn(t,r);return Ot(n,t,r)}catch(e){return Tn(e,t,r)}},Bn={version:"0.10.0",render:Mn,renderToString:function(e,t){return An(e,t).toMarkup()},ParseError:X,__parse:function(e,t){var r=new h(t);return zn(e,r)},__renderToDomTree:An,__renderToHTMLTree:function(t,e){var r,n,i,a=new h(e);try{var o=zn(t,a);return n=wt(o,Et(r=a)),i=$e.makeSpan(["katex"],[n]),r.displayMode?$e.makeSpan(["katex-display"],[i]):i}catch(e){return Tn(e,t,a)}},__setFontMetrics:function(e,t){H[e]=t},__defineSymbol:j,__defineMacro:un,__domTree:{Span:C,Anchor:N,SymbolNode:O,SvgNode:I,PathNode:R,LineNode:L}};t.default=Bn}]).default}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.katex=e():t.katex=e()}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(a,n,function(e){return t[e]}.bind(null,n));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e,r){},function(t,e,r){"use strict";r.r(e);r(0);var a=function(){function t(t,e,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=t,this.start=e,this.end=r}return t.range=function(e,r){return r?e&&e.loc&&r.loc&&e.loc.lexer===r.loc.lexer?new t(e.loc.lexer,e.loc.start,r.loc.end):null:e&&e.loc},t}(),n=function(){function t(t,e){this.text=void 0,this.loc=void 0,this.text=t,this.loc=e}return t.prototype.range=function(e,r){return new t(r,a.range(this,e))},t}(),o=function t(e,r){this.position=void 0;var a,n="KaTeX parse error: "+e,o=r&&r.loc;if(o&&o.start<=o.end){var i=o.lexer.input;a=o.start;var s=o.end;a===i.length?n+=" at end of input: ":n+=" at position "+(a+1)+": ";var h=i.slice(a,s).replace(/[^]/g,"$&\u0332");n+=(a>15?"\u2026"+i.slice(a-15,a):i.slice(0,a))+h+(s+15<i.length?i.slice(s,s+15)+"\u2026":i.slice(s))}var l=new Error(n);return l.name="ParseError",l.__proto__=t.prototype,l.position=a,l};o.prototype.__proto__=Error.prototype;var i=o,s=/([A-Z])/g,h={"&":"&",">":">","<":"<",'"':""","'":"'"},l=/[&><"']/g;var m=function t(e){return"ordgroup"===e.type?1===e.body.length?t(e.body[0]):e:"color"===e.type?1===e.body.length?t(e.body[0]):e:"font"===e.type?t(e.body):e},c={contains:function(t,e){return-1!==t.indexOf(e)},deflt:function(t,e){return void 0===t?e:t},escape:function(t){return String(t).replace(l,function(t){return h[t]})},hyphenate:function(t){return t.replace(s,"-$1").toLowerCase()},getBaseElem:m,isCharacterBox:function(t){var e=m(t);return"mathord"===e.type||"textord"===e.type||"atom"===e.type}},u=function(){function t(t){this.displayMode=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.allowedProtocols=void 0,t=t||{},this.displayMode=c.deflt(t.displayMode,!1),this.leqno=c.deflt(t.leqno,!1),this.fleqn=c.deflt(t.fleqn,!1),this.throwOnError=c.deflt(t.throwOnError,!0),this.errorColor=c.deflt(t.errorColor,"#cc0000"),this.macros=t.macros||{},this.colorIsTextColor=c.deflt(t.colorIsTextColor,!1),this.strict=c.deflt(t.strict,"warn"),this.maxSize=Math.max(0,c.deflt(t.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(t.maxExpand,1e3)),this.allowedProtocols=c.deflt(t.allowedProtocols,["http","https","mailto","_relative"])}var e=t.prototype;return e.reportNonstrict=function(t,e,r){var a=this.strict;if("function"==typeof a&&(a=a(t,e,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new i("LaTeX-incompatible input and strict mode is set to 'error': "+e+" ["+t+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]")}},e.useStrictBehavior=function(t,e,r){var a=this.strict;if("function"==typeof a)try{a=a(t,e,r)}catch(t){a="error"}return!(!a||"ignore"===a)&&(!0===a||"error"===a||("warn"===a?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]"),!1)))},t}(),d=function(){function t(t,e,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=e,this.cramped=r}var e=t.prototype;return e.sup=function(){return p[f[this.id]]},e.sub=function(){return p[g[this.id]]},e.fracNum=function(){return p[x[this.id]]},e.fracDen=function(){return p[v[this.id]]},e.cramp=function(){return p[b[this.id]]},e.text=function(){return p[y[this.id]]},e.isTight=function(){return this.size>=2},t}(),p=[new d(0,0,!1),new d(1,0,!0),new d(2,1,!1),new d(3,1,!0),new d(4,2,!1),new d(5,2,!0),new d(6,3,!1),new d(7,3,!0)],f=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],x=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],w={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},k=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var S=[];function z(t){for(var e=0;e<S.length;e+=2)if(t>=S[e]&&t<=S[e+1])return!0;return!1}k.forEach(function(t){return t.blocks.forEach(function(t){return S.push.apply(S,t)})});var M={path:{sqrtMain:"M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\ns-65,47,-65,47z M834 80H400000v40H845z",sqrtSize1:"M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\ns76,-59,76,-59s76,-60,76,-60z M1001 80H40000v40H1012z",sqrtSize2:"M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\nM1001 80H400000v40H1013z",sqrtSize3:"M424,2478c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M1001 80H400000v40H1014z",sqrtSize4:"M473,2793c339.3,-1799.3,509.3,-2700,510,-2702\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\nM1001 80H400000v40H1017z",doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"}},T=function(){function t(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){for(var t=document.createDocumentFragment(),e=0;e<this.children.length;e++)t.appendChild(this.children[e].toNode());return t},e.toMarkup=function(){for(var t="",e=0;e<this.children.length;e++)t+=this.children[e].toMarkup();return t},e.toText=function(){var t=function(t){return t.toText()};return this.children.map(t).join("")},t}(),A=function(t){return t.filter(function(t){return t}).join(" ")},B=function(t,e,r){if(this.classes=t||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},e){e.style.isTight()&&this.classes.push("mtight");var a=e.getColor();a&&(this.style.color=a)}},q=function(t){var e=document.createElement(t);for(var r in e.className=A(this.classes),this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&e.setAttribute(a,this.attributes[a]);for(var n=0;n<this.children.length;n++)e.appendChild(this.children[n].toNode());return e},C=function(t){var e="<"+t;this.classes.length&&(e+=' class="'+c.escape(A(this.classes))+'"');var r="";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");for(var n in r&&(e+=' style="'+c.escape(r)+'"'),this.attributes)this.attributes.hasOwnProperty(n)&&(e+=" "+n+'="'+c.escape(this.attributes[n])+'"');e+=">";for(var o=0;o<this.children.length;o++)e+=this.children[o].toMarkup();return e+="</"+t+">"},N=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,t,r,a),this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,"span")},e.toMarkup=function(){return C.call(this,"span")},t}(),I=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,e,a),this.children=r||[],this.setAttribute("href",t)}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,"a")},e.toMarkup=function(){return C.call(this,"a")},t}(),O={"\xee":"\u0131\u0302","\xef":"\u0131\u0308","\xed":"\u0131\u0301","\xec":"\u0131\u0300"},E=function(){function t(t,e,r,a,n,o,i,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=t,this.height=e||0,this.depth=r||0,this.italic=a||0,this.skew=n||0,this.width=o||0,this.classes=i||[],this.style=s||{},this.maxFontSize=0;var h=function(t){for(var e=0;e<k.length;e++)for(var r=k[e],a=0;a<r.blocks.length;a++){var n=r.blocks[a];if(t>=n[0]&&t<=n[1])return r.name}return null}(this.text.charCodeAt(0));h&&this.classes.push(h+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=O[this.text])}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createTextNode(this.text),e=null;for(var r in this.italic>0&&((e=document.createElement("span")).style.marginRight=this.italic+"em"),this.classes.length>0&&((e=e||document.createElement("span")).className=A(this.classes)),this.style)this.style.hasOwnProperty(r)&&((e=e||document.createElement("span")).style[r]=this.style[r]);return e?(e.appendChild(t),e):t},e.toMarkup=function(){var t=!1,e="<span";this.classes.length&&(t=!0,e+=' class="',e+=c.escape(A(this.classes)),e+='"');var r="";for(var a in this.italic>0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");r&&(t=!0,e+=' style="'+c.escape(r)+'"');var n=c.escape(this.text);return t?(e+=">",e+=n,e+="</span>"):n},t}(),R=function(){function t(t,e){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=e||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<svg";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</svg>"},t}(),L=function(){function t(t,e){this.pathName=void 0,this.alternate=void 0,this.pathName=t,this.alternate=e}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?t.setAttribute("d",this.alternate):t.setAttribute("d",M.path[this.pathName]),t},e.toMarkup=function(){return this.alternate?"<path d='"+this.alternate+"'/>":"<path d='"+M.path[this.pathName]+"'/>"},t}(),H=function(){function t(t){this.attributes=void 0,this.attributes=t||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","line");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t},e.toMarkup=function(){var t="<line";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");return t+="/>"},t}();var P={"AMS-Regular":{65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473]},"Fraktur-Regular":{33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],163:[0,.69444,0,0,.86853],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],163:[0,.69444,0,0,.76909],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],305:[0,.43056,0,.02778,.32246],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],567:[.19444,.43056,0,.08334,.38403],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,1],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.67,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.744,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.744,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333]},"Math-Italic":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"Math-Regular":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"SansSerif-Bold":{33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212]},"Size1-Regular":{40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},D={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2]},F={"\xc5":"A","\xc7":"C","\xd0":"D","\xde":"o","\xe5":"a","\xe7":"c","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function V(t,e,r){if(!P[e])throw new Error("Font metrics not found for font: "+e+".");var a=t.charCodeAt(0),n=P[e][a];if(!n&&t[0]in F&&(a=F[t[0]].charCodeAt(0),n=P[e][a]),n||"text"!==r||z(a)&&(n=P[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var U={};var G={bin:1,close:1,inner:1,open:1,punct:1,rel:1},X={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},Y={math:{},text:{}},_=Y;function W(t,e,r,a,n,o){Y[t][n]={font:e,group:r,replace:a},o&&a&&(Y[t][a]=Y[t][n])}var j="main",$="ams",Z="bin",K="mathord",J="op-token",Q="rel";W("math",j,Q,"\u2261","\\equiv",!0),W("math",j,Q,"\u227a","\\prec",!0),W("math",j,Q,"\u227b","\\succ",!0),W("math",j,Q,"\u223c","\\sim",!0),W("math",j,Q,"\u22a5","\\perp"),W("math",j,Q,"\u2aaf","\\preceq",!0),W("math",j,Q,"\u2ab0","\\succeq",!0),W("math",j,Q,"\u2243","\\simeq",!0),W("math",j,Q,"\u2223","\\mid",!0),W("math",j,Q,"\u226a","\\ll",!0),W("math",j,Q,"\u226b","\\gg",!0),W("math",j,Q,"\u224d","\\asymp",!0),W("math",j,Q,"\u2225","\\parallel"),W("math",j,Q,"\u22c8","\\bowtie",!0),W("math",j,Q,"\u2323","\\smile",!0),W("math",j,Q,"\u2291","\\sqsubseteq",!0),W("math",j,Q,"\u2292","\\sqsupseteq",!0),W("math",j,Q,"\u2250","\\doteq",!0),W("math",j,Q,"\u2322","\\frown",!0),W("math",j,Q,"\u220b","\\ni",!0),W("math",j,Q,"\u221d","\\propto",!0),W("math",j,Q,"\u22a2","\\vdash",!0),W("math",j,Q,"\u22a3","\\dashv",!0),W("math",j,Q,"\u220b","\\owns"),W("math",j,"punct",".","\\ldotp"),W("math",j,"punct","\u22c5","\\cdotp"),W("math",j,"textord","#","\\#"),W("text",j,"textord","#","\\#"),W("math",j,"textord","&","\\&"),W("text",j,"textord","&","\\&"),W("math",j,"textord","\u2135","\\aleph",!0),W("math",j,"textord","\u2200","\\forall",!0),W("math",j,"textord","\u210f","\\hbar",!0),W("math",j,"textord","\u2203","\\exists",!0),W("math",j,"textord","\u2207","\\nabla",!0),W("math",j,"textord","\u266d","\\flat",!0),W("math",j,"textord","\u2113","\\ell",!0),W("math",j,"textord","\u266e","\\natural",!0),W("math",j,"textord","\u2663","\\clubsuit",!0),W("math",j,"textord","\u2118","\\wp",!0),W("math",j,"textord","\u266f","\\sharp",!0),W("math",j,"textord","\u2662","\\diamondsuit",!0),W("math",j,"textord","\u211c","\\Re",!0),W("math",j,"textord","\u2661","\\heartsuit",!0),W("math",j,"textord","\u2111","\\Im",!0),W("math",j,"textord","\u2660","\\spadesuit",!0),W("text",j,"textord","\xa7","\\S",!0),W("text",j,"textord","\xb6","\\P",!0),W("math",j,"textord","\u2020","\\dag"),W("text",j,"textord","\u2020","\\dag"),W("text",j,"textord","\u2020","\\textdagger"),W("math",j,"textord","\u2021","\\ddag"),W("text",j,"textord","\u2021","\\ddag"),W("text",j,"textord","\u2021","\\textdaggerdbl"),W("math",j,"close","\u23b1","\\rmoustache",!0),W("math",j,"open","\u23b0","\\lmoustache",!0),W("math",j,"close","\u27ef","\\rgroup",!0),W("math",j,"open","\u27ee","\\lgroup",!0),W("math",j,Z,"\u2213","\\mp",!0),W("math",j,Z,"\u2296","\\ominus",!0),W("math",j,Z,"\u228e","\\uplus",!0),W("math",j,Z,"\u2293","\\sqcap",!0),W("math",j,Z,"\u2217","\\ast"),W("math",j,Z,"\u2294","\\sqcup",!0),W("math",j,Z,"\u25ef","\\bigcirc"),W("math",j,Z,"\u2219","\\bullet"),W("math",j,Z,"\u2021","\\ddagger"),W("math",j,Z,"\u2240","\\wr",!0),W("math",j,Z,"\u2a3f","\\amalg"),W("math",j,Z,"&","\\And"),W("math",j,Q,"\u27f5","\\longleftarrow",!0),W("math",j,Q,"\u21d0","\\Leftarrow",!0),W("math",j,Q,"\u27f8","\\Longleftarrow",!0),W("math",j,Q,"\u27f6","\\longrightarrow",!0),W("math",j,Q,"\u21d2","\\Rightarrow",!0),W("math",j,Q,"\u27f9","\\Longrightarrow",!0),W("math",j,Q,"\u2194","\\leftrightarrow",!0),W("math",j,Q,"\u27f7","\\longleftrightarrow",!0),W("math",j,Q,"\u21d4","\\Leftrightarrow",!0),W("math",j,Q,"\u27fa","\\Longleftrightarrow",!0),W("math",j,Q,"\u21a6","\\mapsto",!0),W("math",j,Q,"\u27fc","\\longmapsto",!0),W("math",j,Q,"\u2197","\\nearrow",!0),W("math",j,Q,"\u21a9","\\hookleftarrow",!0),W("math",j,Q,"\u21aa","\\hookrightarrow",!0),W("math",j,Q,"\u2198","\\searrow",!0),W("math",j,Q,"\u21bc","\\leftharpoonup",!0),W("math",j,Q,"\u21c0","\\rightharpoonup",!0),W("math",j,Q,"\u2199","\\swarrow",!0),W("math",j,Q,"\u21bd","\\leftharpoondown",!0),W("math",j,Q,"\u21c1","\\rightharpoondown",!0),W("math",j,Q,"\u2196","\\nwarrow",!0),W("math",j,Q,"\u21cc","\\rightleftharpoons",!0),W("math",$,Q,"\u226e","\\nless",!0),W("math",$,Q,"\ue010","\\@nleqslant"),W("math",$,Q,"\ue011","\\@nleqq"),W("math",$,Q,"\u2a87","\\lneq",!0),W("math",$,Q,"\u2268","\\lneqq",!0),W("math",$,Q,"\ue00c","\\@lvertneqq"),W("math",$,Q,"\u22e6","\\lnsim",!0),W("math",$,Q,"\u2a89","\\lnapprox",!0),W("math",$,Q,"\u2280","\\nprec",!0),W("math",$,Q,"\u22e0","\\npreceq",!0),W("math",$,Q,"\u22e8","\\precnsim",!0),W("math",$,Q,"\u2ab9","\\precnapprox",!0),W("math",$,Q,"\u2241","\\nsim",!0),W("math",$,Q,"\ue006","\\@nshortmid"),W("math",$,Q,"\u2224","\\nmid",!0),W("math",$,Q,"\u22ac","\\nvdash",!0),W("math",$,Q,"\u22ad","\\nvDash",!0),W("math",$,Q,"\u22ea","\\ntriangleleft"),W("math",$,Q,"\u22ec","\\ntrianglelefteq",!0),W("math",$,Q,"\u228a","\\subsetneq",!0),W("math",$,Q,"\ue01a","\\@varsubsetneq"),W("math",$,Q,"\u2acb","\\subsetneqq",!0),W("math",$,Q,"\ue017","\\@varsubsetneqq"),W("math",$,Q,"\u226f","\\ngtr",!0),W("math",$,Q,"\ue00f","\\@ngeqslant"),W("math",$,Q,"\ue00e","\\@ngeqq"),W("math",$,Q,"\u2a88","\\gneq",!0),W("math",$,Q,"\u2269","\\gneqq",!0),W("math",$,Q,"\ue00d","\\@gvertneqq"),W("math",$,Q,"\u22e7","\\gnsim",!0),W("math",$,Q,"\u2a8a","\\gnapprox",!0),W("math",$,Q,"\u2281","\\nsucc",!0),W("math",$,Q,"\u22e1","\\nsucceq",!0),W("math",$,Q,"\u22e9","\\succnsim",!0),W("math",$,Q,"\u2aba","\\succnapprox",!0),W("math",$,Q,"\u2246","\\ncong",!0),W("math",$,Q,"\ue007","\\@nshortparallel"),W("math",$,Q,"\u2226","\\nparallel",!0),W("math",$,Q,"\u22af","\\nVDash",!0),W("math",$,Q,"\u22eb","\\ntriangleright"),W("math",$,Q,"\u22ed","\\ntrianglerighteq",!0),W("math",$,Q,"\ue018","\\@nsupseteqq"),W("math",$,Q,"\u228b","\\supsetneq",!0),W("math",$,Q,"\ue01b","\\@varsupsetneq"),W("math",$,Q,"\u2acc","\\supsetneqq",!0),W("math",$,Q,"\ue019","\\@varsupsetneqq"),W("math",$,Q,"\u22ae","\\nVdash",!0),W("math",$,Q,"\u2ab5","\\precneqq",!0),W("math",$,Q,"\u2ab6","\\succneqq",!0),W("math",$,Q,"\ue016","\\@nsubseteqq"),W("math",$,Z,"\u22b4","\\unlhd"),W("math",$,Z,"\u22b5","\\unrhd"),W("math",$,Q,"\u219a","\\nleftarrow",!0),W("math",$,Q,"\u219b","\\nrightarrow",!0),W("math",$,Q,"\u21cd","\\nLeftarrow",!0),W("math",$,Q,"\u21cf","\\nRightarrow",!0),W("math",$,Q,"\u21ae","\\nleftrightarrow",!0),W("math",$,Q,"\u21ce","\\nLeftrightarrow",!0),W("math",$,Q,"\u25b3","\\vartriangle"),W("math",$,"textord","\u210f","\\hslash"),W("math",$,"textord","\u25bd","\\triangledown"),W("math",$,"textord","\u25ca","\\lozenge"),W("math",$,"textord","\u24c8","\\circledS"),W("math",$,"textord","\xae","\\circledR"),W("text",$,"textord","\xae","\\circledR"),W("math",$,"textord","\u2221","\\measuredangle",!0),W("math",$,"textord","\u2204","\\nexists"),W("math",$,"textord","\u2127","\\mho"),W("math",$,"textord","\u2132","\\Finv",!0),W("math",$,"textord","\u2141","\\Game",!0),W("math",$,"textord","\u2035","\\backprime"),W("math",$,"textord","\u25b2","\\blacktriangle"),W("math",$,"textord","\u25bc","\\blacktriangledown"),W("math",$,"textord","\u25a0","\\blacksquare"),W("math",$,"textord","\u29eb","\\blacklozenge"),W("math",$,"textord","\u2605","\\bigstar"),W("math",$,"textord","\u2222","\\sphericalangle",!0),W("math",$,"textord","\u2201","\\complement",!0),W("math",$,"textord","\xf0","\\eth",!0),W("math",$,"textord","\u2571","\\diagup"),W("math",$,"textord","\u2572","\\diagdown"),W("math",$,"textord","\u25a1","\\square"),W("math",$,"textord","\u25a1","\\Box"),W("math",$,"textord","\u25ca","\\Diamond"),W("math",$,"textord","\xa5","\\yen",!0),W("text",$,"textord","\xa5","\\yen",!0),W("math",$,"textord","\u2713","\\checkmark",!0),W("text",$,"textord","\u2713","\\checkmark"),W("math",$,"textord","\u2136","\\beth",!0),W("math",$,"textord","\u2138","\\daleth",!0),W("math",$,"textord","\u2137","\\gimel",!0),W("math",$,"textord","\u03dd","\\digamma"),W("math",$,"textord","\u03f0","\\varkappa"),W("math",$,"open","\u250c","\\ulcorner",!0),W("math",$,"close","\u2510","\\urcorner",!0),W("math",$,"open","\u2514","\\llcorner",!0),W("math",$,"close","\u2518","\\lrcorner",!0),W("math",$,Q,"\u2266","\\leqq",!0),W("math",$,Q,"\u2a7d","\\leqslant",!0),W("math",$,Q,"\u2a95","\\eqslantless",!0),W("math",$,Q,"\u2272","\\lesssim",!0),W("math",$,Q,"\u2a85","\\lessapprox",!0),W("math",$,Q,"\u224a","\\approxeq",!0),W("math",$,Z,"\u22d6","\\lessdot"),W("math",$,Q,"\u22d8","\\lll",!0),W("math",$,Q,"\u2276","\\lessgtr",!0),W("math",$,Q,"\u22da","\\lesseqgtr",!0),W("math",$,Q,"\u2a8b","\\lesseqqgtr",!0),W("math",$,Q,"\u2251","\\doteqdot"),W("math",$,Q,"\u2253","\\risingdotseq",!0),W("math",$,Q,"\u2252","\\fallingdotseq",!0),W("math",$,Q,"\u223d","\\backsim",!0),W("math",$,Q,"\u22cd","\\backsimeq",!0),W("math",$,Q,"\u2ac5","\\subseteqq",!0),W("math",$,Q,"\u22d0","\\Subset",!0),W("math",$,Q,"\u228f","\\sqsubset",!0),W("math",$,Q,"\u227c","\\preccurlyeq",!0),W("math",$,Q,"\u22de","\\curlyeqprec",!0),W("math",$,Q,"\u227e","\\precsim",!0),W("math",$,Q,"\u2ab7","\\precapprox",!0),W("math",$,Q,"\u22b2","\\vartriangleleft"),W("math",$,Q,"\u22b4","\\trianglelefteq"),W("math",$,Q,"\u22a8","\\vDash",!0),W("math",$,Q,"\u22aa","\\Vvdash",!0),W("math",$,Q,"\u2323","\\smallsmile"),W("math",$,Q,"\u2322","\\smallfrown"),W("math",$,Q,"\u224f","\\bumpeq",!0),W("math",$,Q,"\u224e","\\Bumpeq",!0),W("math",$,Q,"\u2267","\\geqq",!0),W("math",$,Q,"\u2a7e","\\geqslant",!0),W("math",$,Q,"\u2a96","\\eqslantgtr",!0),W("math",$,Q,"\u2273","\\gtrsim",!0),W("math",$,Q,"\u2a86","\\gtrapprox",!0),W("math",$,Z,"\u22d7","\\gtrdot"),W("math",$,Q,"\u22d9","\\ggg",!0),W("math",$,Q,"\u2277","\\gtrless",!0),W("math",$,Q,"\u22db","\\gtreqless",!0),W("math",$,Q,"\u2a8c","\\gtreqqless",!0),W("math",$,Q,"\u2256","\\eqcirc",!0),W("math",$,Q,"\u2257","\\circeq",!0),W("math",$,Q,"\u225c","\\triangleq",!0),W("math",$,Q,"\u223c","\\thicksim"),W("math",$,Q,"\u2248","\\thickapprox"),W("math",$,Q,"\u2ac6","\\supseteqq",!0),W("math",$,Q,"\u22d1","\\Supset",!0),W("math",$,Q,"\u2290","\\sqsupset",!0),W("math",$,Q,"\u227d","\\succcurlyeq",!0),W("math",$,Q,"\u22df","\\curlyeqsucc",!0),W("math",$,Q,"\u227f","\\succsim",!0),W("math",$,Q,"\u2ab8","\\succapprox",!0),W("math",$,Q,"\u22b3","\\vartriangleright"),W("math",$,Q,"\u22b5","\\trianglerighteq"),W("math",$,Q,"\u22a9","\\Vdash",!0),W("math",$,Q,"\u2223","\\shortmid"),W("math",$,Q,"\u2225","\\shortparallel"),W("math",$,Q,"\u226c","\\between",!0),W("math",$,Q,"\u22d4","\\pitchfork",!0),W("math",$,Q,"\u221d","\\varpropto"),W("math",$,Q,"\u25c0","\\blacktriangleleft"),W("math",$,Q,"\u2234","\\therefore",!0),W("math",$,Q,"\u220d","\\backepsilon"),W("math",$,Q,"\u25b6","\\blacktriangleright"),W("math",$,Q,"\u2235","\\because",!0),W("math",$,Q,"\u22d8","\\llless"),W("math",$,Q,"\u22d9","\\gggtr"),W("math",$,Z,"\u22b2","\\lhd"),W("math",$,Z,"\u22b3","\\rhd"),W("math",$,Q,"\u2242","\\eqsim",!0),W("math",j,Q,"\u22c8","\\Join"),W("math",$,Q,"\u2251","\\Doteq",!0),W("math",$,Z,"\u2214","\\dotplus",!0),W("math",$,Z,"\u2216","\\smallsetminus"),W("math",$,Z,"\u22d2","\\Cap",!0),W("math",$,Z,"\u22d3","\\Cup",!0),W("math",$,Z,"\u2a5e","\\doublebarwedge",!0),W("math",$,Z,"\u229f","\\boxminus",!0),W("math",$,Z,"\u229e","\\boxplus",!0),W("math",$,Z,"\u22c7","\\divideontimes",!0),W("math",$,Z,"\u22c9","\\ltimes",!0),W("math",$,Z,"\u22ca","\\rtimes",!0),W("math",$,Z,"\u22cb","\\leftthreetimes",!0),W("math",$,Z,"\u22cc","\\rightthreetimes",!0),W("math",$,Z,"\u22cf","\\curlywedge",!0),W("math",$,Z,"\u22ce","\\curlyvee",!0),W("math",$,Z,"\u229d","\\circleddash",!0),W("math",$,Z,"\u229b","\\circledast",!0),W("math",$,Z,"\u22c5","\\centerdot"),W("math",$,Z,"\u22ba","\\intercal",!0),W("math",$,Z,"\u22d2","\\doublecap"),W("math",$,Z,"\u22d3","\\doublecup"),W("math",$,Z,"\u22a0","\\boxtimes",!0),W("math",$,Q,"\u21e2","\\dashrightarrow",!0),W("math",$,Q,"\u21e0","\\dashleftarrow",!0),W("math",$,Q,"\u21c7","\\leftleftarrows",!0),W("math",$,Q,"\u21c6","\\leftrightarrows",!0),W("math",$,Q,"\u21da","\\Lleftarrow",!0),W("math",$,Q,"\u219e","\\twoheadleftarrow",!0),W("math",$,Q,"\u21a2","\\leftarrowtail",!0),W("math",$,Q,"\u21ab","\\looparrowleft",!0),W("math",$,Q,"\u21cb","\\leftrightharpoons",!0),W("math",$,Q,"\u21b6","\\curvearrowleft",!0),W("math",$,Q,"\u21ba","\\circlearrowleft",!0),W("math",$,Q,"\u21b0","\\Lsh",!0),W("math",$,Q,"\u21c8","\\upuparrows",!0),W("math",$,Q,"\u21bf","\\upharpoonleft",!0),W("math",$,Q,"\u21c3","\\downharpoonleft",!0),W("math",$,Q,"\u22b8","\\multimap",!0),W("math",$,Q,"\u21ad","\\leftrightsquigarrow",!0),W("math",$,Q,"\u21c9","\\rightrightarrows",!0),W("math",$,Q,"\u21c4","\\rightleftarrows",!0),W("math",$,Q,"\u21a0","\\twoheadrightarrow",!0),W("math",$,Q,"\u21a3","\\rightarrowtail",!0),W("math",$,Q,"\u21ac","\\looparrowright",!0),W("math",$,Q,"\u21b7","\\curvearrowright",!0),W("math",$,Q,"\u21bb","\\circlearrowright",!0),W("math",$,Q,"\u21b1","\\Rsh",!0),W("math",$,Q,"\u21ca","\\downdownarrows",!0),W("math",$,Q,"\u21be","\\upharpoonright",!0),W("math",$,Q,"\u21c2","\\downharpoonright",!0),W("math",$,Q,"\u21dd","\\rightsquigarrow",!0),W("math",$,Q,"\u21dd","\\leadsto"),W("math",$,Q,"\u21db","\\Rrightarrow",!0),W("math",$,Q,"\u21be","\\restriction"),W("math",j,"textord","\u2018","`"),W("math",j,"textord","$","\\$"),W("text",j,"textord","$","\\$"),W("text",j,"textord","$","\\textdollar"),W("math",j,"textord","%","\\%"),W("text",j,"textord","%","\\%"),W("math",j,"textord","_","\\_"),W("text",j,"textord","_","\\_"),W("text",j,"textord","_","\\textunderscore"),W("math",j,"textord","\u2220","\\angle",!0),W("math",j,"textord","\u221e","\\infty",!0),W("math",j,"textord","\u2032","\\prime"),W("math",j,"textord","\u25b3","\\triangle"),W("math",j,"textord","\u0393","\\Gamma",!0),W("math",j,"textord","\u0394","\\Delta",!0),W("math",j,"textord","\u0398","\\Theta",!0),W("math",j,"textord","\u039b","\\Lambda",!0),W("math",j,"textord","\u039e","\\Xi",!0),W("math",j,"textord","\u03a0","\\Pi",!0),W("math",j,"textord","\u03a3","\\Sigma",!0),W("math",j,"textord","\u03a5","\\Upsilon",!0),W("math",j,"textord","\u03a6","\\Phi",!0),W("math",j,"textord","\u03a8","\\Psi",!0),W("math",j,"textord","\u03a9","\\Omega",!0),W("math",j,"textord","A","\u0391"),W("math",j,"textord","B","\u0392"),W("math",j,"textord","E","\u0395"),W("math",j,"textord","Z","\u0396"),W("math",j,"textord","H","\u0397"),W("math",j,"textord","I","\u0399"),W("math",j,"textord","K","\u039a"),W("math",j,"textord","M","\u039c"),W("math",j,"textord","N","\u039d"),W("math",j,"textord","O","\u039f"),W("math",j,"textord","P","\u03a1"),W("math",j,"textord","T","\u03a4"),W("math",j,"textord","X","\u03a7"),W("math",j,"textord","\xac","\\neg",!0),W("math",j,"textord","\xac","\\lnot"),W("math",j,"textord","\u22a4","\\top"),W("math",j,"textord","\u22a5","\\bot"),W("math",j,"textord","\u2205","\\emptyset"),W("math",$,"textord","\u2205","\\varnothing"),W("math",j,K,"\u03b1","\\alpha",!0),W("math",j,K,"\u03b2","\\beta",!0),W("math",j,K,"\u03b3","\\gamma",!0),W("math",j,K,"\u03b4","\\delta",!0),W("math",j,K,"\u03f5","\\epsilon",!0),W("math",j,K,"\u03b6","\\zeta",!0),W("math",j,K,"\u03b7","\\eta",!0),W("math",j,K,"\u03b8","\\theta",!0),W("math",j,K,"\u03b9","\\iota",!0),W("math",j,K,"\u03ba","\\kappa",!0),W("math",j,K,"\u03bb","\\lambda",!0),W("math",j,K,"\u03bc","\\mu",!0),W("math",j,K,"\u03bd","\\nu",!0),W("math",j,K,"\u03be","\\xi",!0),W("math",j,K,"\u03bf","\\omicron",!0),W("math",j,K,"\u03c0","\\pi",!0),W("math",j,K,"\u03c1","\\rho",!0),W("math",j,K,"\u03c3","\\sigma",!0),W("math",j,K,"\u03c4","\\tau",!0),W("math",j,K,"\u03c5","\\upsilon",!0),W("math",j,K,"\u03d5","\\phi",!0),W("math",j,K,"\u03c7","\\chi",!0),W("math",j,K,"\u03c8","\\psi",!0),W("math",j,K,"\u03c9","\\omega",!0),W("math",j,K,"\u03b5","\\varepsilon",!0),W("math",j,K,"\u03d1","\\vartheta",!0),W("math",j,K,"\u03d6","\\varpi",!0),W("math",j,K,"\u03f1","\\varrho",!0),W("math",j,K,"\u03c2","\\varsigma",!0),W("math",j,K,"\u03c6","\\varphi",!0),W("math",j,Z,"\u2217","*"),W("math",j,Z,"+","+"),W("math",j,Z,"\u2212","-"),W("math",j,Z,"\u22c5","\\cdot",!0),W("math",j,Z,"\u2218","\\circ"),W("math",j,Z,"\xf7","\\div",!0),W("math",j,Z,"\xb1","\\pm",!0),W("math",j,Z,"\xd7","\\times",!0),W("math",j,Z,"\u2229","\\cap",!0),W("math",j,Z,"\u222a","\\cup",!0),W("math",j,Z,"\u2216","\\setminus"),W("math",j,Z,"\u2227","\\land"),W("math",j,Z,"\u2228","\\lor"),W("math",j,Z,"\u2227","\\wedge",!0),W("math",j,Z,"\u2228","\\vee",!0),W("math",j,"textord","\u221a","\\surd"),W("math",j,"open","(","("),W("math",j,"open","[","["),W("math",j,"open","\u27e8","\\langle",!0),W("math",j,"open","\u2223","\\lvert"),W("math",j,"open","\u2225","\\lVert"),W("math",j,"close",")",")"),W("math",j,"close","]","]"),W("math",j,"close","?","?"),W("math",j,"close","!","!"),W("math",j,"close","\u27e9","\\rangle",!0),W("math",j,"close","\u2223","\\rvert"),W("math",j,"close","\u2225","\\rVert"),W("math",j,Q,"=","="),W("math",j,Q,"<","<"),W("math",j,Q,">",">"),W("math",j,Q,":",":"),W("math",j,Q,"\u2248","\\approx",!0),W("math",j,Q,"\u2245","\\cong",!0),W("math",j,Q,"\u2265","\\ge"),W("math",j,Q,"\u2265","\\geq",!0),W("math",j,Q,"\u2190","\\gets"),W("math",j,Q,">","\\gt"),W("math",j,Q,"\u2208","\\in",!0),W("math",j,Q,"\ue020","\\@not"),W("math",j,Q,"\u2282","\\subset",!0),W("math",j,Q,"\u2283","\\supset",!0),W("math",j,Q,"\u2286","\\subseteq",!0),W("math",j,Q,"\u2287","\\supseteq",!0),W("math",$,Q,"\u2288","\\nsubseteq",!0),W("math",$,Q,"\u2289","\\nsupseteq",!0),W("math",j,Q,"\u22a8","\\models"),W("math",j,Q,"\u2190","\\leftarrow",!0),W("math",j,Q,"\u2264","\\le"),W("math",j,Q,"\u2264","\\leq",!0),W("math",j,Q,"<","\\lt"),W("math",j,Q,"\u2192","\\rightarrow",!0),W("math",j,Q,"\u2192","\\to"),W("math",$,Q,"\u2271","\\ngeq",!0),W("math",$,Q,"\u2270","\\nleq",!0),W("math",j,"spacing","\xa0","\\ "),W("math",j,"spacing","\xa0","~"),W("math",j,"spacing","\xa0","\\space"),W("math",j,"spacing","\xa0","\\nobreakspace"),W("text",j,"spacing","\xa0","\\ "),W("text",j,"spacing","\xa0","~"),W("text",j,"spacing","\xa0","\\space"),W("text",j,"spacing","\xa0","\\nobreakspace"),W("math",j,"spacing",null,"\\nobreak"),W("math",j,"spacing",null,"\\allowbreak"),W("math",j,"punct",",",","),W("math",j,"punct",";",";"),W("math",$,Z,"\u22bc","\\barwedge",!0),W("math",$,Z,"\u22bb","\\veebar",!0),W("math",j,Z,"\u2299","\\odot",!0),W("math",j,Z,"\u2295","\\oplus",!0),W("math",j,Z,"\u2297","\\otimes",!0),W("math",j,"textord","\u2202","\\partial",!0),W("math",j,Z,"\u2298","\\oslash",!0),W("math",$,Z,"\u229a","\\circledcirc",!0),W("math",$,Z,"\u22a1","\\boxdot",!0),W("math",j,Z,"\u25b3","\\bigtriangleup"),W("math",j,Z,"\u25bd","\\bigtriangledown"),W("math",j,Z,"\u2020","\\dagger"),W("math",j,Z,"\u22c4","\\diamond"),W("math",j,Z,"\u22c6","\\star"),W("math",j,Z,"\u25c3","\\triangleleft"),W("math",j,Z,"\u25b9","\\triangleright"),W("math",j,"open","{","\\{"),W("text",j,"textord","{","\\{"),W("text",j,"textord","{","\\textbraceleft"),W("math",j,"close","}","\\}"),W("text",j,"textord","}","\\}"),W("text",j,"textord","}","\\textbraceright"),W("math",j,"open","{","\\lbrace"),W("math",j,"close","}","\\rbrace"),W("math",j,"open","[","\\lbrack"),W("text",j,"textord","[","\\lbrack"),W("math",j,"close","]","\\rbrack"),W("text",j,"textord","]","\\rbrack"),W("math",j,"open","(","\\lparen"),W("math",j,"close",")","\\rparen"),W("text",j,"textord","<","\\textless"),W("text",j,"textord",">","\\textgreater"),W("math",j,"open","\u230a","\\lfloor",!0),W("math",j,"close","\u230b","\\rfloor",!0),W("math",j,"open","\u2308","\\lceil",!0),W("math",j,"close","\u2309","\\rceil",!0),W("math",j,"textord","\\","\\backslash"),W("math",j,"textord","\u2223","|"),W("math",j,"textord","\u2223","\\vert"),W("text",j,"textord","|","\\textbar"),W("math",j,"textord","\u2225","\\|"),W("math",j,"textord","\u2225","\\Vert"),W("text",j,"textord","\u2225","\\textbardbl"),W("text",j,"textord","~","\\textasciitilde"),W("text",j,"textord","\\","\\textbackslash"),W("text",j,"textord","^","\\textasciicircum"),W("math",j,Q,"\u2191","\\uparrow",!0),W("math",j,Q,"\u21d1","\\Uparrow",!0),W("math",j,Q,"\u2193","\\downarrow",!0),W("math",j,Q,"\u21d3","\\Downarrow",!0),W("math",j,Q,"\u2195","\\updownarrow",!0),W("math",j,Q,"\u21d5","\\Updownarrow",!0),W("math",j,J,"\u2210","\\coprod"),W("math",j,J,"\u22c1","\\bigvee"),W("math",j,J,"\u22c0","\\bigwedge"),W("math",j,J,"\u2a04","\\biguplus"),W("math",j,J,"\u22c2","\\bigcap"),W("math",j,J,"\u22c3","\\bigcup"),W("math",j,J,"\u222b","\\int"),W("math",j,J,"\u222b","\\intop"),W("math",j,J,"\u222c","\\iint"),W("math",j,J,"\u222d","\\iiint"),W("math",j,J,"\u220f","\\prod"),W("math",j,J,"\u2211","\\sum"),W("math",j,J,"\u2a02","\\bigotimes"),W("math",j,J,"\u2a01","\\bigoplus"),W("math",j,J,"\u2a00","\\bigodot"),W("math",j,J,"\u222e","\\oint"),W("math",j,J,"\u222f","\\oiint"),W("math",j,J,"\u2230","\\oiiint"),W("math",j,J,"\u2a06","\\bigsqcup"),W("math",j,J,"\u222b","\\smallint"),W("text",j,"inner","\u2026","\\textellipsis"),W("math",j,"inner","\u2026","\\mathellipsis"),W("text",j,"inner","\u2026","\\ldots",!0),W("math",j,"inner","\u2026","\\ldots",!0),W("math",j,"inner","\u22ef","\\@cdots",!0),W("math",j,"inner","\u22f1","\\ddots",!0),W("math",j,"textord","\u22ee","\\varvdots"),W("math",j,"accent-token","\u02ca","\\acute"),W("math",j,"accent-token","\u02cb","\\grave"),W("math",j,"accent-token","\xa8","\\ddot"),W("math",j,"accent-token","~","\\tilde"),W("math",j,"accent-token","\u02c9","\\bar"),W("math",j,"accent-token","\u02d8","\\breve"),W("math",j,"accent-token","\u02c7","\\check"),W("math",j,"accent-token","^","\\hat"),W("math",j,"accent-token","\u20d7","\\vec"),W("math",j,"accent-token","\u02d9","\\dot"),W("math",j,"accent-token","\u02da","\\mathring"),W("math",j,K,"\u0131","\\imath",!0),W("math",j,K,"\u0237","\\jmath",!0),W("text",j,"textord","\u0131","\\i",!0),W("text",j,"textord","\u0237","\\j",!0),W("text",j,"textord","\xdf","\\ss",!0),W("text",j,"textord","\xe6","\\ae",!0),W("text",j,"textord","\xe6","\\ae",!0),W("text",j,"textord","\u0153","\\oe",!0),W("text",j,"textord","\xf8","\\o",!0),W("text",j,"textord","\xc6","\\AE",!0),W("text",j,"textord","\u0152","\\OE",!0),W("text",j,"textord","\xd8","\\O",!0),W("text",j,"accent-token","\u02ca","\\'"),W("text",j,"accent-token","\u02cb","\\`"),W("text",j,"accent-token","\u02c6","\\^"),W("text",j,"accent-token","\u02dc","\\~"),W("text",j,"accent-token","\u02c9","\\="),W("text",j,"accent-token","\u02d8","\\u"),W("text",j,"accent-token","\u02d9","\\."),W("text",j,"accent-token","\u02da","\\r"),W("text",j,"accent-token","\u02c7","\\v"),W("text",j,"accent-token","\xa8",'\\"'),W("text",j,"accent-token","\u02dd","\\H"),W("text",j,"accent-token","\u25ef","\\textcircled");var tt={"--":!0,"---":!0,"``":!0,"''":!0};W("text",j,"textord","\u2013","--"),W("text",j,"textord","\u2013","\\textendash"),W("text",j,"textord","\u2014","---"),W("text",j,"textord","\u2014","\\textemdash"),W("text",j,"textord","\u2018","`"),W("text",j,"textord","\u2018","\\textquoteleft"),W("text",j,"textord","\u2019","'"),W("text",j,"textord","\u2019","\\textquoteright"),W("text",j,"textord","\u201c","``"),W("text",j,"textord","\u201c","\\textquotedblleft"),W("text",j,"textord","\u201d","''"),W("text",j,"textord","\u201d","\\textquotedblright"),W("math",j,"textord","\xb0","\\degree",!0),W("text",j,"textord","\xb0","\\degree"),W("text",j,"textord","\xb0","\\textdegree",!0),W("math",j,K,"\xa3","\\pounds"),W("math",j,K,"\xa3","\\mathsterling",!0),W("text",j,K,"\xa3","\\pounds"),W("text",j,K,"\xa3","\\textsterling",!0),W("math",$,"textord","\u2720","\\maltese"),W("text",$,"textord","\u2720","\\maltese"),W("text",j,"spacing","\xa0","\\ "),W("text",j,"spacing","\xa0"," "),W("text",j,"spacing","\xa0","~");for(var et=0;et<'0123456789/@."'.length;et++){var rt='0123456789/@."'.charAt(et);W("math",j,"textord",rt,rt)}for(var at=0;at<'0123456789!@*()-=+[]<>|";:?/.,'.length;at++){var nt='0123456789!@*()-=+[]<>|";:?/.,'.charAt(at);W("text",j,"textord",nt,nt)}for(var ot="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",it=0;it<ot.length;it++){var st=ot.charAt(it);W("math",j,K,st,st),W("text",j,"textord",st,st)}W("math",$,"textord","C","\u2102"),W("text",$,"textord","C","\u2102"),W("math",$,"textord","H","\u210d"),W("text",$,"textord","H","\u210d"),W("math",$,"textord","N","\u2115"),W("text",$,"textord","N","\u2115"),W("math",$,"textord","P","\u2119"),W("text",$,"textord","P","\u2119"),W("math",$,"textord","Q","\u211a"),W("text",$,"textord","Q","\u211a"),W("math",$,"textord","R","\u211d"),W("text",$,"textord","R","\u211d"),W("math",$,"textord","Z","\u2124"),W("text",$,"textord","Z","\u2124"),W("math",j,K,"h","\u210e"),W("text",j,K,"h","\u210e");for(var ht="",lt=0;lt<ot.length;lt++){var mt=ot.charAt(lt);W("math",j,K,mt,ht=String.fromCharCode(55349,56320+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56372+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56424+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56580+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56736+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56788+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56840+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56944+lt)),W("text",j,"textord",mt,ht),lt<26&&(W("math",j,K,mt,ht=String.fromCharCode(55349,56632+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56476+lt)),W("text",j,"textord",mt,ht))}W("math",j,K,"k",ht=String.fromCharCode(55349,56668)),W("text",j,"textord","k",ht);for(var ct=0;ct<10;ct++){var ut=ct.toString();W("math",j,K,ut,ht=String.fromCharCode(55349,57294+ct)),W("text",j,"textord",ut,ht),W("math",j,K,ut,ht=String.fromCharCode(55349,57314+ct)),W("text",j,"textord",ut,ht),W("math",j,K,ut,ht=String.fromCharCode(55349,57324+ct)),W("text",j,"textord",ut,ht),W("math",j,K,ut,ht=String.fromCharCode(55349,57334+ct)),W("text",j,"textord",ut,ht)}for(var dt=0;dt<"\xc7\xd0\xde\xe7\xfe".length;dt++){var pt="\xc7\xd0\xde\xe7\xfe".charAt(dt);W("math",j,K,pt,pt),W("text",j,"textord",pt,pt)}W("text",j,"textord","\xf0","\xf0"),W("text",j,"textord","\u2013","\u2013"),W("text",j,"textord","\u2014","\u2014"),W("text",j,"textord","\u2018","\u2018"),W("text",j,"textord","\u2019","\u2019"),W("text",j,"textord","\u201c","\u201c"),W("text",j,"textord","\u201d","\u201d");var ft=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathdefault","textit","Math-Italic"],["mathdefault","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["","",""],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],gt=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],xt=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],vt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],bt=function(t,e){return e.size<2?t:xt[t-1][e.size-1]},yt=function(){function t(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=vt[this.size-1],this.maxSize=e.maxSize,this._fontMetrics=void 0}var e=t.prototype;return e.extend=function(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize};for(var a in e)e.hasOwnProperty(a)&&(r[a]=e[a]);return new t(r)},e.havingStyle=function(t){return this.style===t?this:this.extend({style:t,size:bt(this.textSize,t)})},e.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},e.havingSize=function(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:vt[t-1]})},e.havingBaseStyle=function(e){e=e||this.style.text();var r=bt(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})},e.havingBaseSizing=function(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})},e.withColor=function(t){return this.extend({color:t})},e.withPhantom=function(){return this.extend({phantom:!0})},e.withFont=function(t){return this.extend({font:t})},e.withTextFontFamily=function(t){return this.extend({fontFamily:t,font:""})},e.withTextFontWeight=function(t){return this.extend({fontWeight:t,font:""})},e.withTextFontShape=function(t){return this.extend({fontShape:t,font:""})},e.sizingClasses=function(t){return t.size!==this.size?["sizing","reset-size"+t.size,"size"+this.size]:[]},e.baseSizingClasses=function(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]},e.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=function(t){var e;if(!U[e=t>=5?0:t>=3?1:2]){var r=U[e]={cssEmPerMu:D.quad[e]/18};for(var a in D)D.hasOwnProperty(a)&&(r[a]=D[a][e])}return U[e]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?"transparent":this.color},t}();yt.BASESIZE=6;var wt=yt,kt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},St={ex:!0,em:!0,mu:!0},zt=function(t,e){var r;if(t.unit in kt)r=kt[t.unit]/e.fontMetrics().ptPerEm/e.sizeMultiplier;else if("mu"===t.unit)r=e.fontMetrics().cssEmPerMu;else{var a;if(a=e.style.isTight()?e.havingStyle(e.style.text()):e,"ex"===t.unit)r=a.fontMetrics().xHeight;else{if("em"!==t.unit)throw new i("Invalid unit: '"+t.unit+"'");r=a.fontMetrics().quad}a!==e&&(r*=a.sizeMultiplier/e.sizeMultiplier)}return Math.min(t.number*r,e.maxSize)},Mt=["\\imath","\u0131","\\jmath","\u0237","\\pounds","\\mathsterling","\\textsterling","\xa3"],Tt=function(t,e,r){return _[r][t]&&_[r][t].replace&&(t=_[r][t].replace),{value:t,metrics:V(t,e,r)}},At=function(t,e,r,a,n){var o,i=Tt(t,e,r),s=i.metrics;if(t=i.value,s){var h=s.italic;("text"===r||a&&"mathit"===a.font)&&(h=0),o=new E(t,s.height,s.depth,h,s.skew,s.width,n)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+t+"' in style '"+e+"'"),o=new E(t,0,0,0,0,0,n);if(a){o.maxFontSize=a.sizeMultiplier,a.style.isTight()&&o.classes.push("mtight");var l=a.getColor();l&&(o.style.color=l)}return o},Bt=function(t,e){if(A(t.classes)!==A(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;for(var r in t.style)if(t.style.hasOwnProperty(r)&&t.style[r]!==e.style[r])return!1;for(var a in e.style)if(e.style.hasOwnProperty(a)&&t.style[a]!==e.style[a])return!1;return!0},qt=function(t){for(var e=0,r=0,a=0,n=0;n<t.children.length;n++){var o=t.children[n];o.height>e&&(e=o.height),o.depth>r&&(r=o.depth),o.maxFontSize>a&&(a=o.maxFontSize)}t.height=e,t.depth=r,t.maxFontSize=a},Ct=function(t,e,r,a){var n=new N(t,e,r,a);return qt(n),n},Nt=function(t,e,r,a){return new N(t,e,r,a)},It=function(t){var e=new T(t);return qt(e),e},Ot=function(t,e,r){var a="";switch(t){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=t}return a+"-"+("textbf"===e&&"textit"===r?"BoldItalic":"textbf"===e?"Bold":"textit"===e?"Italic":"Regular")},Et={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Rt={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Lt={fontMap:Et,makeSymbol:At,mathsym:function(t,e,r,a){return void 0===a&&(a=[]),r&&r.font&&"boldsymbol"===r.font&&Tt(t,"Main-Bold",e).metrics?At(t,"Main-Bold",e,r,a.concat(["mathbf"])):"\\"===t||"main"===_[e][t].font?At(t,"Main-Regular",e,r,a):At(t,"AMS-Regular",e,r,a.concat(["amsrm"]))},makeSpan:Ct,makeSvgSpan:Nt,makeLineSpan:function(t,e,r){var a=Ct([t],[],e);return a.height=r||e.fontMetrics().defaultRuleThickness,a.style.borderBottomWidth=a.height+"em",a.maxFontSize=1,a},makeAnchor:function(t,e,r,a){var n=new I(t,e,r,a);return qt(n),n},makeFragment:It,wrapFragment:function(t,e){return t instanceof T?Ct([],[t],e):t},makeVList:function(t,e){for(var r=function(t){if("individualShift"===t.positionType){for(var e=t.children,r=[e[0]],a=-e[0].shift-e[0].elem.depth,n=a,o=1;o<e.length;o++){var i=-e[o].shift-n-e[o].elem.depth,s=i-(e[o-1].elem.height+e[o-1].elem.depth);n+=i,r.push({type:"kern",size:s}),r.push(e[o])}return{children:r,depth:a}}var h;if("top"===t.positionType){for(var l=t.positionData,m=0;m<t.children.length;m++){var c=t.children[m];l-="kern"===c.type?c.size:c.elem.height+c.elem.depth}h=l}else if("bottom"===t.positionType)h=-t.positionData;else{var u=t.children[0];if("elem"!==u.type)throw new Error('First child must have type "elem".');if("shift"===t.positionType)h=-u.elem.depth-t.positionData;else{if("firstBaseline"!==t.positionType)throw new Error("Invalid positionType "+t.positionType+".");h=-u.elem.depth}}return{children:t.children,depth:h}}(t),a=r.children,n=r.depth,o=0,i=0;i<a.length;i++){var s=a[i];if("elem"===s.type){var h=s.elem;o=Math.max(o,h.maxFontSize,h.height)}}o+=2;var l=Ct(["pstrut"],[]);l.style.height=o+"em";for(var m=[],c=n,u=n,d=n,p=0;p<a.length;p++){var f=a[p];if("kern"===f.type)d+=f.size;else{var g=f.elem,x=f.wrapperClasses||[],v=f.wrapperStyle||{},b=Ct(x,[l,g],void 0,v);b.style.top=-o-d-g.depth+"em",f.marginLeft&&(b.style.marginLeft=f.marginLeft),f.marginRight&&(b.style.marginRight=f.marginRight),m.push(b),d+=g.height+g.depth}c=Math.min(c,d),u=Math.max(u,d)}var y,w=Ct(["vlist"],m);if(w.style.height=u+"em",c<0){var k=Ct([],[]),S=Ct(["vlist"],[k]);S.style.height=-c+"em";var z=Ct(["vlist-s"],[new E("\u200b")]);y=[Ct(["vlist-r"],[w,z]),Ct(["vlist-r"],[S])]}else y=[Ct(["vlist-r"],[w])];var M=Ct(["vlist-t"],y);return 2===y.length&&M.classes.push("vlist-t2"),M.height=u,M.depth=-c,M},makeOrd:function(t,e,r){var a,n=t.mode,o=t.text,s=["mord"],h="math"===n||"text"===n&&e.font,l=h?e.font:e.fontFamily;if(55349===o.charCodeAt(0)){var m=function(t,e){var r=1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536,a="math"===e?0:1;if(119808<=r&&r<120484){var n=Math.floor((r-119808)/26);return[ft[n][2],ft[n][a]]}if(120782<=r&&r<=120831){var o=Math.floor((r-120782)/10);return[gt[o][2],gt[o][a]]}if(120485===r||120486===r)return[ft[0][2],ft[0][a]];if(120486<r&&r<120782)return["",""];throw new i("Unsupported character: "+t)}(o,n),u=m[0],d=m[1];return At(o,u,n,e,s.concat(d))}if(l){var p,f;if("boldsymbol"===l||"mathnormal"===l){var g="boldsymbol"===l?function(t,e,r,a){return Tt(t,"Math-BoldItalic",e).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(o,n):(a=o,c.contains(Mt,a)?{fontName:"Main-Italic",fontClass:"mathit"}:/[0-9]/.test(a.charAt(0))?{fontName:"Caligraphic-Regular",fontClass:"mathcal"}:{fontName:"Math-Italic",fontClass:"mathdefault"});p=g.fontName,f=[g.fontClass]}else c.contains(Mt,o)?(p="Main-Italic",f=["mathit"]):h?(p=Et[l].fontName,f=[l]):(p=Ot(l,e.fontWeight,e.fontShape),f=[l,e.fontWeight,e.fontShape]);if(Tt(o,p,n).metrics)return At(o,p,n,e,s.concat(f));if(tt.hasOwnProperty(o)&&"Typewriter"===p.substr(0,10)){for(var x=[],v=0;v<o.length;v++)x.push(At(o[v],p,n,e,s.concat(f)));return It(x)}}if("mathord"===r){var b=function(t,e,r,a){return/[0-9]/.test(t.charAt(0))||c.contains(Mt,t)?{fontName:"Main-Italic",fontClass:"mathit"}:{fontName:"Math-Italic",fontClass:"mathdefault"}}(o);return At(o,b.fontName,n,e,s.concat([b.fontClass]))}if("textord"===r){var y=_[n][o]&&_[n][o].font;if("ams"===y){var w=Ot("amsrm",e.fontWeight,e.fontShape);return At(o,w,n,e,s.concat("amsrm",e.fontWeight,e.fontShape))}if("main"!==y&&y){var k=Ot(y,e.fontWeight,e.fontShape);return At(o,k,n,e,s.concat(k,e.fontWeight,e.fontShape))}var S=Ot("textrm",e.fontWeight,e.fontShape);return At(o,S,n,e,s.concat(e.fontWeight,e.fontShape))}throw new Error("unexpected type: "+r+" in makeOrd")},makeGlue:function(t,e){var r=Ct(["mspace"],[],e),a=zt(t,e);return r.style.marginRight=a+"em",r},staticSvg:function(t,e){var r=Rt[t],a=r[0],n=r[1],o=r[2],i=new L(a),s=new R([i],{width:n+"em",height:o+"em",style:"width:"+n+"em",viewBox:"0 0 "+1e3*n+" "+1e3*o,preserveAspectRatio:"xMinYMin"}),h=Nt(["overlay"],[s],e);return h.height=o,h.style.height=o+"em",h.style.width=n+"em",h},svgData:Rt,tryCombineChars:function(t){for(var e=0;e<t.length-1;e++){var r=t[e],a=t[e+1];r instanceof E&&a instanceof E&&Bt(r,a)&&(r.text+=a.text,r.height=Math.max(r.height,a.height),r.depth=Math.max(r.depth,a.depth),r.italic=a.italic,t.splice(e+1,1),e--)}return t}};function Ht(t,e){var r=Pt(t,e);if(!r)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return r}function Pt(t,e){return t&&t.type===e?t:null}function Dt(t,e){var r=function(t,e){return t&&"atom"===t.type&&t.family===e?t:null}(t,e);if(!r)throw new Error('Expected node of type "atom" and family "'+e+'", but got '+(t?"atom"===t.type?"atom of family "+t.family:"node of type "+t.type:String(t)));return r}function Ft(t){return t&&("atom"===t.type||X.hasOwnProperty(t.type))?t:null}var Vt={number:3,unit:"mu"},Ut={number:4,unit:"mu"},Gt={number:5,unit:"mu"},Xt={mord:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mop:{mord:Vt,mop:Vt,mrel:Gt,minner:Vt},mbin:{mord:Ut,mop:Ut,mopen:Ut,minner:Ut},mrel:{mord:Gt,mop:Gt,mopen:Gt,minner:Gt},mopen:{},mclose:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mpunct:{mord:Vt,mop:Vt,mrel:Gt,mopen:Vt,mclose:Vt,mpunct:Vt,minner:Vt},minner:{mord:Vt,mop:Vt,mbin:Ut,mrel:Gt,mopen:Vt,mpunct:Vt,minner:Vt}},Yt={mord:{mop:Vt},mop:{mord:Vt,mop:Vt},mbin:{},mrel:{},mopen:{},mclose:{mop:Vt},mpunct:{},minner:{mop:Vt}},_t={},Wt={},jt={};function $t(t){for(var e=t.type,r=(t.nodeType,t.names),a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs,argTypes:a.argTypes,greediness:void 0===a.greediness?1:a.greediness,allowedInText:!!a.allowedInText,allowedInMath:void 0===a.allowedInMath||a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,consumeMode:a.consumeMode,handler:n},h=0;h<r.length;++h)_t[r[h]]=s;e&&(o&&(Wt[e]=o),i&&(jt[e]=i))}function Zt(t){$t({type:t.type,names:[],props:{numArgs:0},handler:function(){throw new Error("Should never be called.")},htmlBuilder:t.htmlBuilder,mathmlBuilder:t.mathmlBuilder})}var Kt=function(t){var e=Pt(t,"ordgroup");return e?e.body:[t]},Jt=Lt.makeSpan,Qt=["leftmost","mbin","mopen","mrel","mop","mpunct"],te=["rightmost","mrel","mclose","mpunct"],ee={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT},re={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},ae=function(t,e,r,a){void 0===a&&(a=[null,null]);for(var n=[],o=0;o<t.length;o++){var i=he(t[o],e);if(i instanceof T){var s=i.children;n.push.apply(n,s)}else n.push(i)}if(!r)return n;var h=e;if(1===t.length){var l=Pt(t[0],"sizing")||Pt(t[0],"styling");l&&("sizing"===l.type?h=e.havingSize(l.size):"styling"===l.type&&(h=e.havingStyle(ee[l.style])))}var m=Jt([a[0]||"leftmost"],[],e),u=Jt([a[1]||"rightmost"],[],e);return ne(n,function(t,e){var r=e.classes[0],a=t.classes[0];"mbin"===r&&c.contains(te,a)?e.classes[0]="mord":"mbin"===a&&c.contains(Qt,r)&&(t.classes[0]="mord")},{node:m},u),ne(n,function(t,e){var r=ie(e),a=ie(t),n=r&&a?t.hasClass("mtight")?Yt[r][a]:Xt[r][a]:null;if(n)return Lt.makeGlue(n,h)},{node:m},u),n},ne=function t(e,r,a,n){n&&e.push(n);for(var o=0;o<e.length;o++){var i=e[o],s=oe(i);if(s)t(s.children,r,a);else if("mspace"!==i.classes[0]){var h=r(i,a.node);h&&(a.insertAfter?a.insertAfter(h):(e.unshift(h),o++)),a.node=i,a.insertAfter=function(t){return function(r){e.splice(t+1,0,r),o++}}(o)}}n&&e.pop()},oe=function(t){return t instanceof T||t instanceof I?t:null},ie=function(t,e){return t?(e&&(t=function t(e,r){var a=oe(e);if(a){var n=a.children;if(n.length){if("right"===r)return t(n[n.length-1],"right");if("left"===r)return t(n[0],"left")}}return e}(t,e)),re[t.classes[0]]||null):null},se=function(t,e){var r=["nulldelimiter"].concat(t.baseSizingClasses());return Jt(e.concat(r))},he=function(t,e,r){if(!t)return Jt();if(Wt[t.type]){var a=Wt[t.type](t,e);if(r&&e.size!==r.size){a=Jt(e.sizingClasses(r),[a],e);var n=e.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new i("Got group of unknown type: '"+t.type+"'")};function le(t,e){var r=Jt(["base"],t,e),a=Jt(["strut"]);return a.style.height=r.height+r.depth+"em",a.style.verticalAlign=-r.depth+"em",r.children.unshift(a),r}function me(t,e){var r=null;1===t.length&&"tag"===t[0].type&&(r=t[0].tag,t=t[0].body);for(var a,n=ae(t,e,!0),o=[],i=[],s=0;s<n.length;s++)if(i.push(n[s]),n[s].hasClass("mbin")||n[s].hasClass("mrel")||n[s].hasClass("allowbreak")){for(var h=!1;s<n.length-1&&n[s+1].hasClass("mspace")&&!n[s+1].hasClass("newline");)s++,i.push(n[s]),n[s].hasClass("nobreak")&&(h=!0);h||(o.push(le(i,e)),i=[])}else n[s].hasClass("newline")&&(i.pop(),i.length>0&&(o.push(le(i,e)),i=[]),o.push(n[s]));i.length>0&&o.push(le(i,e)),r&&((a=le(ae(r,e,!0))).classes=["tag"],o.push(a));var l=Jt(["katex-html"],o);if(l.setAttribute("aria-hidden","true"),a){var m=a.children[0];m.style.height=l.height+l.depth+"em",m.style.verticalAlign=-l.depth+"em"}return l}function ce(t){return new T(t)}var ue=function(){function t(t,e){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=t,this.attributes={},this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.getAttribute=function(t){return this.attributes[t]},e.toNode=function(){var t=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<"+this.type;for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+'="',t+=c.escape(this.attributes[e]),t+='"');t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</"+this.type+">"},e.toText=function(){return this.children.map(function(t){return t.toText()}).join("")},t}(),de=function(){function t(t){this.text=void 0,this.text=t}var e=t.prototype;return e.toNode=function(){return document.createTextNode(this.text)},e.toMarkup=function(){return c.escape(this.toText())},e.toText=function(){return this.text},t}(),pe={MathNode:ue,TextNode:de,SpaceNode:function(){function t(t){this.width=void 0,this.character=void 0,this.width=t,this.character=t>=.05555&&t<=.05556?"\u200a":t>=.1666&&t<=.1667?"\u2009":t>=.2222&&t<=.2223?"\u2005":t>=.2777&&t<=.2778?"\u2005\u200a":t>=-.05556&&t<=-.05555?"\u200a\u2063":t>=-.1667&&t<=-.1666?"\u2009\u2063":t>=-.2223&&t<=-.2222?"\u205f\u2063":t>=-.2778&&t<=-.2777?"\u2005\u2063":null}var e=t.prototype;return e.toNode=function(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return t.setAttribute("width",this.width+"em"),t},e.toMarkup=function(){return this.character?"<mtext>"+this.character+"</mtext>":'<mspace width="'+this.width+'em"/>'},e.toText=function(){return this.character?this.character:" "},t}(),newDocumentFragment:ce},fe=function(t,e,r){return!_[e][t]||!_[e][t].replace||55349===t.charCodeAt(0)||tt.hasOwnProperty(t)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(t=_[e][t].replace),new pe.TextNode(t)},ge=function(t){return 1===t.length?t[0]:new pe.MathNode("mrow",t)},xe=function(t,e){if("texttt"===e.fontFamily)return"monospace";if("textsf"===e.fontFamily)return"textit"===e.fontShape&&"textbf"===e.fontWeight?"sans-serif-bold-italic":"textit"===e.fontShape?"sans-serif-italic":"textbf"===e.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===e.fontShape&&"textbf"===e.fontWeight)return"bold-italic";if("textit"===e.fontShape)return"italic";if("textbf"===e.fontWeight)return"bold";var r=e.font;if(!r||"mathnormal"===r)return null;var a=t.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"bold-italic";var n=t.text;return c.contains(["\\imath","\\jmath"],n)?null:(_[a][n]&&_[a][n].replace&&(n=_[a][n].replace),V(n,Lt.fontMap[r].fontName,a)?Lt.fontMap[r].variant:null)},ve=function(t,e){for(var r,a=[],n=0;n<t.length;n++){var o=ye(t[n],e);if(o instanceof ue&&r instanceof ue){if("mtext"===o.type&&"mtext"===r.type&&o.getAttribute("mathvariant")===r.getAttribute("mathvariant")){var i;(i=r.children).push.apply(i,o.children);continue}if("mn"===o.type&&"mn"===r.type){var s;(s=r.children).push.apply(s,o.children);continue}if("mi"===o.type&&1===o.children.length&&"mn"===r.type){var h=o.children[0];if(h instanceof de&&"."===h.text){var l;(l=r.children).push.apply(l,o.children);continue}}else if("mi"===r.type&&1===r.children.length){var m=r.children[0];if(m instanceof de&&"\u0338"===m.text&&("mo"===o.type||"mi"===o.type||"mn"===o.type)){var c=o.children[0];c instanceof de&&c.text.length>0&&(c.text=c.text.slice(0,1)+"\u0338"+c.text.slice(1),a.pop())}}}a.push(o),r=o}return a},be=function(t,e){return ge(ve(t,e))},ye=function(t,e){if(!t)return new pe.MathNode("mrow");if(jt[t.type])return jt[t.type](t,e);throw new i("Got group of unknown type: '"+t.type+"'")};var we=function(t){return new wt({style:t.displayMode?w.DISPLAY:w.TEXT,maxSize:t.maxSize})},ke=function(t,e){if(e.displayMode){var r=["katex-display"];e.leqno&&r.push("leqno"),e.fleqn&&r.push("fleqn"),t=Lt.makeSpan(r,[t])}return t},Se=function(t,e,r){var a=we(r),n=function(t,e,r){var a,n=ve(t,r);a=1===n.length&&n[0]instanceof ue&&c.contains(["mrow","mtable"],n[0].type)?n[0]:new pe.MathNode("mrow",n);var o=new pe.MathNode("annotation",[new pe.TextNode(e)]);o.setAttribute("encoding","application/x-tex");var i=new pe.MathNode("semantics",[a,o]),s=new pe.MathNode("math",[i]);return Lt.makeSpan(["katex-mathml"],[s])}(t,e,a),o=me(t,a),i=Lt.makeSpan(["katex"],[n,o]);return ke(i,r)},ze={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb"},Me={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Te=function(t){return"ordgroup"===t.type?t.body.length:1},Ae=function(t,e,r,a){var n,o=t.height+t.depth+2*r;if(/fbox|color/.test(e)){if(n=Lt.makeSpan(["stretchy",e],[],a),"fbox"===e){var i=a.color&&a.getColor();i&&(n.style.borderColor=i)}}else{var s=[];/^[bx]cancel$/.test(e)&&s.push(new H({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(e)&&s.push(new H({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new R(s,{width:"100%",height:o+"em"});n=Lt.makeSvgSpan([],[h],a)}return n.height=o,n.style.height=o+"em",n},Be=function(t){var e=new pe.MathNode("mo",[new pe.TextNode(ze[t.substr(1)])]);return e.setAttribute("stretchy","true"),e},qe=function(t,e){var r=function(){var r=4e5,a=t.label.substr(1);if(c.contains(["widehat","widecheck","widetilde","utilde"],a)){var n,o,i,s=Te(t.base);if(s>5)"widehat"===a||"widecheck"===a?(n=420,r=2364,i=.42,o=a+"4"):(n=312,r=2340,i=.34,o="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===a||"widecheck"===a?(r=[0,1062,2364,2364,2364][h],n=[0,239,300,360,420][h],i=[0,.24,.3,.3,.36,.42][h],o=a+h):(r=[0,600,1033,2339,2340][h],n=[0,260,286,306,312][h],i=[0,.26,.286,.3,.306,.34][h],o="tilde"+h)}var l=new L(o),m=new R([l],{width:"100%",height:i+"em",viewBox:"0 0 "+r+" "+n,preserveAspectRatio:"none"});return{span:Lt.makeSvgSpan([],[m],e),minWidth:0,height:i}}var u,d,p=[],f=Me[a],g=f[0],x=f[1],v=f[2],b=v/1e3,y=g.length;if(1===y)u=["hide-tail"],d=[f[3]];else if(2===y)u=["halfarrow-left","halfarrow-right"],d=["xMinYMin","xMaxYMin"];else{if(3!==y)throw new Error("Correct katexImagesData or update code here to support\n "+y+" children.");u=["brace-left","brace-center","brace-right"],d=["xMinYMin","xMidYMin","xMaxYMin"]}for(var w=0;w<y;w++){var k=new L(g[w]),S=new R([k],{width:"400em",height:b+"em",viewBox:"0 0 "+r+" "+v,preserveAspectRatio:d[w]+" slice"}),z=Lt.makeSvgSpan([u[w]],[S],e);if(1===y)return{span:z,minWidth:x,height:b};z.style.height=b+"em",p.push(z)}return{span:Lt.makeSpan(["stretchy"],p,e),minWidth:x,height:b}}(),a=r.span,n=r.minWidth,o=r.height;return a.height=o,a.style.height=o+"em",n>0&&(a.style.minWidth=n+"em"),a},Ce=function(t,e){var r,a,n,o=Pt(t,"supsub");o?(r=(a=Ht(o.base,"accent")).base,o.base=r,n=function(t){if(t instanceof N)return t;throw new Error("Expected span<HtmlDomNode> but got "+String(t)+".")}(he(o,e)),o.base=a):r=(a=Ht(t,"accent")).base;var i=he(r,e.havingCrampedStyle()),s=0;if(a.isShifty&&c.isCharacterBox(r)){var h=c.getBaseElem(r);s=function(t){if(t instanceof E)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}(he(h,e.havingCrampedStyle())).skew}var l,m=Math.min(i.height,e.fontMetrics().xHeight);if(a.isStretchy)l=qe(a,e),l=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:l,wrapperClasses:["svg-align"],wrapperStyle:s>0?{width:"calc(100% - "+2*s+"em)",marginLeft:2*s+"em"}:void 0}]},e);else{var u,d;"\\vec"===a.label?(u=Lt.staticSvg("vec",e),d=Lt.svgData.vec[1]):((u=Lt.makeSymbol(a.label,"Main-Regular",a.mode,e)).italic=0,d=u.width),l=Lt.makeSpan(["accent-body"],[u]);var p="\\textcircled"===a.label;p&&(l.classes.push("accent-full"),m=i.height);var f=s;p||(f-=d/2),l.style.left=f+"em","\\textcircled"===a.label&&(l.style.top=".2em"),l=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-m},{type:"elem",elem:l}]},e)}var g=Lt.makeSpan(["mord","accent"],[l],e);return n?(n.children[0]=g,n.height=Math.max(g.height,n.height),n.classes[0]="mord",n):g},Ne=function(t,e){var r=t.isStretchy?Be(t.label):new pe.MathNode("mo",[fe(t.label,t.mode)]),a=new pe.MathNode("mover",[ye(t.base,e),r]);return a.setAttribute("accent","true"),a},Ie=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(t){return"\\"+t}).join("|"));$t({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(t,e){var r=e[0],a=!Ie.test(t.funcName),n=!a||"\\widehat"===t.funcName||"\\widetilde"===t.funcName||"\\widecheck"===t.funcName;return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=e[0];return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"accentUnder",mode:r.mode,label:a,base:n}},htmlBuilder:function(t,e){var r=he(t.base,e),a=qe(t,e),n="\\utilde"===t.label?.12:0,o=Lt.makeVList({positionType:"bottom",positionData:a.height+n,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:r}]},e);return Lt.makeSpan(["mord","accentunder"],[o],e)},mathmlBuilder:function(t,e){var r=Be(t.label),a=new pe.MathNode("munder",[ye(t.base,e),r]);return a.setAttribute("accentunder","true"),a}});var Oe=function(t){var e=new pe.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};$t({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:r[0]}},htmlBuilder:function(t,e){var r,a=e.style,n=e.havingStyle(a.sup()),o=Lt.wrapFragment(he(t.body,n,e),e);o.classes.push("x-arrow-pad"),t.below&&(n=e.havingStyle(a.sub()),(r=Lt.wrapFragment(he(t.below,n,e),e)).classes.push("x-arrow-pad"));var i,s=qe(t,e),h=-e.fontMetrics().axisHeight+.5*s.height,l=-e.fontMetrics().axisHeight-.5*s.height-.111;if((o.depth>.25||"\\xleftequilibrium"===t.label)&&(l-=o.depth),r){var m=-e.fontMetrics().axisHeight+r.height+.5*s.height+.111;i=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:l},{type:"elem",elem:s,shift:h},{type:"elem",elem:r,shift:m}]},e)}else i=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:l},{type:"elem",elem:s,shift:h}]},e);return i.children[0].children[0].children[1].classes.push("svg-align"),Lt.makeSpan(["mrel","x-arrow"],[i],e)},mathmlBuilder:function(t,e){var r,a=Be(t.label);if(t.body){var n=Oe(ye(t.body,e));if(t.below){var o=Oe(ye(t.below,e));r=new pe.MathNode("munderover",[a,o,n])}else r=new pe.MathNode("mover",[a,n])}else if(t.below){var i=Oe(ye(t.below,e));r=new pe.MathNode("munder",[a,i])}else r=Oe(),r=new pe.MathNode("mover",[a,r]);return r}}),$t({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],"ordgroup").body,n="",o=0;o<a.length;o++){n+=Ht(a[o],"textord").text}var s=parseInt(n);if(isNaN(s))throw new i("\\@char has non-numeric argument "+n);return{type:"textord",mode:r.mode,text:String.fromCharCode(s)}}});var Ee=function(t,e){var r=ae(t.body,e.withColor(t.color),!1);return Lt.makeFragment(r)},Re=function(t,e){var r=ve(t.body,e.withColor(t.color)),a=new pe.MathNode("mstyle",r);return a.setAttribute("mathcolor",t.color),a};$t({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","original"]},handler:function(t,e){var r=t.parser,a=Ht(e[0],"color-token").color,n=e[1];return{type:"color",mode:r.mode,color:a,body:Kt(n)}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,greediness:3,argTypes:["color"]},handler:function(t,e){var r=t.parser,a=t.breakOnTokenText,n=Ht(e[0],"color-token").color,o=r.parseExpression(!0,a);return{type:"color",mode:r.mode,color:n,body:o}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:"cr",names:["\\cr","\\newline"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=r[0],i="\\cr"===n,s=!1;return i||(s=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode")),{type:"cr",mode:a.mode,newLine:s,newRow:i,size:o&&Ht(o,"size").value}},htmlBuilder:function(t,e){if(t.newRow)throw new i("\\cr valid only within a tabular/array environment");var r=Lt.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=zt(t.size,e)+"em")),r},mathmlBuilder:function(t,e){var r=new pe.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",zt(t.size,e)+"em")),r}});var Le=function(t,e,r){var a=V(_.math[t]&&_.math[t].replace||t,e,r);if(!a)throw new Error("Unsupported symbol "+t+" and font size "+e+".");return a},He=function(t,e,r,a){var n=r.havingBaseStyle(e),o=Lt.makeSpan(a.concat(n.sizingClasses(r)),[t],r),i=n.sizeMultiplier/r.sizeMultiplier;return o.height*=i,o.depth*=i,o.maxFontSize=n.sizeMultiplier,o},Pe=function(t,e,r){var a=e.havingBaseStyle(r),n=(1-e.sizeMultiplier/a.sizeMultiplier)*e.fontMetrics().axisHeight;t.classes.push("delimcenter"),t.style.top=n+"em",t.height-=n,t.depth+=n},De=function(t,e,r,a,n,o){var i=function(t,e,r,a){return Lt.makeSymbol(t,"Size"+e+"-Regular",r,a)}(t,e,n,a),s=He(Lt.makeSpan(["delimsizing","size"+e],[i],a),w.TEXT,a,o);return r&&Pe(s,a,w.TEXT),s},Fe=function(t,e,r){var a;return a="Size1-Regular"===e?"delim-size1":"delim-size4",{type:"elem",elem:Lt.makeSpan(["delimsizinginner",a],[Lt.makeSpan([],[Lt.makeSymbol(t,e,r)])])}},Ve=function(t,e,r,a,n,o){var i,s,h,l;i=h=l=t,s=null;var m="Size1-Regular";"\\uparrow"===t?h=l="\u23d0":"\\Uparrow"===t?h=l="\u2016":"\\downarrow"===t?i=h="\u23d0":"\\Downarrow"===t?i=h="\u2016":"\\updownarrow"===t?(i="\\uparrow",h="\u23d0",l="\\downarrow"):"\\Updownarrow"===t?(i="\\Uparrow",h="\u2016",l="\\Downarrow"):"["===t||"\\lbrack"===t?(i="\u23a1",h="\u23a2",l="\u23a3",m="Size4-Regular"):"]"===t||"\\rbrack"===t?(i="\u23a4",h="\u23a5",l="\u23a6",m="Size4-Regular"):"\\lfloor"===t||"\u230a"===t?(h=i="\u23a2",l="\u23a3",m="Size4-Regular"):"\\lceil"===t||"\u2308"===t?(i="\u23a1",h=l="\u23a2",m="Size4-Regular"):"\\rfloor"===t||"\u230b"===t?(h=i="\u23a5",l="\u23a6",m="Size4-Regular"):"\\rceil"===t||"\u2309"===t?(i="\u23a4",h=l="\u23a5",m="Size4-Regular"):"("===t||"\\lparen"===t?(i="\u239b",h="\u239c",l="\u239d",m="Size4-Regular"):")"===t||"\\rparen"===t?(i="\u239e",h="\u239f",l="\u23a0",m="Size4-Regular"):"\\{"===t||"\\lbrace"===t?(i="\u23a7",s="\u23a8",l="\u23a9",h="\u23aa",m="Size4-Regular"):"\\}"===t||"\\rbrace"===t?(i="\u23ab",s="\u23ac",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\lgroup"===t||"\u27ee"===t?(i="\u23a7",l="\u23a9",h="\u23aa",m="Size4-Regular"):"\\rgroup"===t||"\u27ef"===t?(i="\u23ab",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\lmoustache"===t||"\u23b0"===t?(i="\u23a7",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\rmoustache"!==t&&"\u23b1"!==t||(i="\u23ab",l="\u23a9",h="\u23aa",m="Size4-Regular");var c=Le(i,m,n),u=c.height+c.depth,d=Le(h,m,n),p=d.height+d.depth,f=Le(l,m,n),g=f.height+f.depth,x=0,v=1;if(null!==s){var b=Le(s,m,n);x=b.height+b.depth,v=2}var y=u+g+x,k=Math.ceil((e-y)/(v*p)),S=y+k*v*p,z=a.fontMetrics().axisHeight;r&&(z*=a.sizeMultiplier);var M=S/2-z,T=[];if(T.push(Fe(l,m,n)),null===s)for(var A=0;A<k;A++)T.push(Fe(h,m,n));else{for(var B=0;B<k;B++)T.push(Fe(h,m,n));T.push(Fe(s,m,n));for(var q=0;q<k;q++)T.push(Fe(h,m,n))}T.push(Fe(i,m,n));var C=a.havingBaseStyle(w.TEXT),N=Lt.makeVList({positionType:"bottom",positionData:M,children:T},C);return He(Lt.makeSpan(["delimsizing","mult"],[N],C),w.TEXT,a,o)},Ue=function(t,e,r,a){var n;"sqrtTall"===t&&(n="M702 80H400000v40H742v"+(r-54-80)+"l-4 4-4 4c-.667.7\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 80H400000v40H742z");var o=new L(t,n),i=new R([o],{width:"400em",height:e+"em",viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Lt.makeSvgSpan(["hide-tail"],[i],a)},Ge=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],Xe=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],Ye=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],_e=[0,1.2,1.8,2.4,3],We=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],je=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],$e=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Ze=function(t){if("small"===t.type)return"Main-Regular";if("large"===t.type)return"Size"+t.size+"-Regular";if("stack"===t.type)return"Size4-Regular";throw new Error("Add support for delim type '"+t.type+"' here.")},Ke=function(t,e,r,a){for(var n=Math.min(2,3-a.style.size);n<r.length&&"stack"!==r[n].type;n++){var o=Le(t,Ze(r[n]),"math"),i=o.height+o.depth;if("small"===r[n].type&&(i*=a.havingBaseStyle(r[n].style).sizeMultiplier),i>e)return r[n]}return r[r.length-1]},Je=function(t,e,r,a,n,o){var i;"<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),i=c.contains(Ye,t)?We:c.contains(Ge,t)?$e:je;var s=Ke(t,e,i,a);return"small"===s.type?function(t,e,r,a,n,o){var i=Lt.makeSymbol(t,"Main-Regular",n,a),s=He(i,e,a,o);return r&&Pe(s,a,e),s}(t,s.style,r,a,n,o):"large"===s.type?De(t,s.size,r,a,n,o):Ve(t,e,r,a,n,o)},Qe=function(t,e){var r,a,n=e.havingBaseSizing(),o=Ke("\\surd",t*n.sizeMultiplier,$e,n),i=n.sizeMultiplier,s=0,h=0,l=0;return"small"===o.type?(t<1?i=1:t<1.4&&(i=.7),h=1/i,(r=Ue("sqrtMain",s=1.08/i,l=1080,e)).style.minWidth="0.853em",a=.833/i):"large"===o.type?(l=1080*_e[o.size],h=_e[o.size]/i,s=(_e[o.size]+.08)/i,(r=Ue("sqrtSize"+o.size,s,l,e)).style.minWidth="1.02em",a=1/i):(s=t+.08,h=t,l=Math.floor(1e3*t)+80,(r=Ue("sqrtTall",s,l,e)).style.minWidth="0.742em",a=1.056),r.height=h,r.style.height=s+"em",{span:r,advanceWidth:a,ruleWidth:e.fontMetrics().sqrtRuleThickness*i}},tr=function(t,e,r,a,n){if("<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),c.contains(Ge,t)||c.contains(Ye,t))return De(t,e,!1,r,a,n);if(c.contains(Xe,t))return Ve(t,_e[e],!1,r,a,n);throw new i("Illegal delimiter: '"+t+"'")},er=Je,rr=function(t,e,r,a,n,o){var i=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,h=Math.max(e-i,r+i),l=Math.max(h/500*901,2*h-s);return Je(t,l,!0,a,n,o)},ar={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},nr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function or(t,e){var r=Ft(t);if(r&&c.contains(nr,r.text))return r;throw new i("Invalid delimiter: '"+(r?r.text:JSON.stringify(t))+"' after '"+e.funcName+"'",t)}function ir(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}$t({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:ar[t.funcName].size,mclass:ar[t.funcName].mclass,delim:r.text}},htmlBuilder:function(t,e){return"."===t.delim?Lt.makeSpan([t.mclass]):tr(t.delim,t.size,e,t.mode,[t.mclass])},mathmlBuilder:function(t){var e=[];"."!==t.delim&&e.push(fe(t.delim,t.mode));var r=new pe.MathNode("mo",e);return"mopen"===t.mclass||"mclose"===t.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r}}),$t({type:"leftright-right",names:["\\right"],props:{numArgs:1},handler:function(t,e){return{type:"leftright-right",mode:t.parser.mode,delim:or(e[0],t).text}}}),$t({type:"leftright",names:["\\left"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t),a=t.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var o=Ht(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:r.text,right:o.delim}},htmlBuilder:function(t,e){ir(t);for(var r,a,n=ae(t.body,e,!0,["mopen","mclose"]),o=0,i=0,s=!1,h=0;h<n.length;h++)n[h].isMiddle?s=!0:(o=Math.max(n[h].height,o),i=Math.max(n[h].depth,i));if(o*=e.sizeMultiplier,i*=e.sizeMultiplier,r="."===t.left?se(e,["mopen"]):rr(t.left,o,i,e,t.mode,["mopen"]),n.unshift(r),s)for(var l=1;l<n.length;l++){var m=n[l].isMiddle;m&&(n[l]=rr(m.delim,o,i,m.options,t.mode,[]))}return a="."===t.right?se(e,["mclose"]):rr(t.right,o,i,e,t.mode,["mclose"]),n.push(a),Lt.makeSpan(["minner"],n,e)},mathmlBuilder:function(t,e){ir(t);var r=ve(t.body,e);if("."!==t.left){var a=new pe.MathNode("mo",[fe(t.left,t.mode)]);a.setAttribute("fence","true"),r.unshift(a)}if("."!==t.right){var n=new pe.MathNode("mo",[fe(t.right,t.mode)]);n.setAttribute("fence","true"),r.push(n)}return ge(r)}}),$t({type:"middle",names:["\\middle"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);if(!t.parser.leftrightDepth)throw new i("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},htmlBuilder:function(t,e){var r;if("."===t.delim)r=se(e,[]);else{r=tr(t.delim,1,e,t.mode,[]);var a={delim:t.delim,options:e};r.isMiddle=a}return r},mathmlBuilder:function(t,e){var r="\\vert"===t.delim||"|"===t.delim?fe("|","text"):fe(t.delim,t.mode),a=new pe.MathNode("mo",[r]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var sr=function(t,e){var r,a,n=Lt.wrapFragment(he(t.body,e),e),o=t.label.substr(1),i=e.sizeMultiplier,s=0,h=c.isCharacterBox(t.body);if("sout"===o)(r=Lt.makeSpan(["stretchy","sout"])).height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else{/cancel/.test(o)?h||n.classes.push("cancel-pad"):n.classes.push("boxpad");var l=0;l=/box/.test(o)?"colorbox"===o?.3:.34:h?.2:0,r=Ae(n,o,l,e),s=n.depth+l,t.backgroundColor&&(r.style.backgroundColor=t.backgroundColor,t.borderColor&&(r.style.borderColor=t.borderColor))}return a=t.backgroundColor?Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:s},{type:"elem",elem:n,shift:0}]},e):Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:0},{type:"elem",elem:r,shift:s,wrapperClasses:/cancel/.test(o)?["svg-align"]:[]}]},e),/cancel/.test(o)&&(a.height=n.height,a.depth=n.depth),/cancel/.test(o)&&!h?Lt.makeSpan(["mord","cancel-lap"],[a],e):Lt.makeSpan(["mord"],[a],e)},hr=function(t,e){var r=new pe.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[ye(t.body,e)]);switch(t.label){case"\\cancel":r.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":r.setAttribute("notation","downdiagonalstrike");break;case"\\sout":r.setAttribute("notation","horizontalstrike");break;case"\\fbox":r.setAttribute("notation","box");break;case"\\fcolorbox":case"\\colorbox":if(r.setAttribute("width","+6pt"),r.setAttribute("height","+6pt"),r.setAttribute("lspace","3pt"),r.setAttribute("voffset","3pt"),"\\fcolorbox"===t.label){var a=e.fontMetrics().defaultRuleThickness;r.setAttribute("style","border: "+a+"em solid "+String(t.borderColor))}break;case"\\xcancel":r.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return t.backgroundColor&&r.setAttribute("mathbackground",t.backgroundColor),r};$t({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],"color-token").color,i=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,body:i}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:["color","color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],"color-token").color,i=Ht(e[1],"color-token").color,s=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:i,borderColor:o,body:s}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["text"],allowedInText:!0},handler:function(t,e){return{type:"enclose",mode:t.parser.mode,label:"\\fbox",body:e[0]}}}),$t({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout"],props:{numArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=e[0];return{type:"enclose",mode:a.mode,label:n,body:o}},htmlBuilder:sr,mathmlBuilder:hr});var lr={};function mr(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:n},h=0;h<r.length;++h)lr[r[h]]=s;o&&(Wt[e]=o),i&&(jt[e]=i)}function cr(t){var e=[];t.consumeSpaces();for(var r=t.nextToken.text;"\\hline"===r||"\\hdashline"===r;)t.consume(),e.push("\\hdashline"===r),t.consumeSpaces(),r=t.nextToken.text;return e}function ur(t,e,r){var a=e.hskipBeforeAndAfter,n=e.addJot,o=e.cols,s=e.arraystretch,h=e.colSeparationType;if(t.gullet.beginGroup(),t.gullet.macros.set("\\\\","\\cr"),!s){var l=t.gullet.expandMacroAsText("\\arraystretch");if(null==l)s=1;else if(!(s=parseFloat(l))||s<0)throw new i("Invalid \\arraystretch: "+l)}var m=[],c=[m],u=[],d=[];for(d.push(cr(t));;){var p=t.parseExpression(!1,"\\cr");p={type:"ordgroup",mode:t.mode,body:p},r&&(p={type:"styling",mode:t.mode,style:r,body:[p]}),m.push(p);var f=t.nextToken.text;if("&"===f)t.consume();else{if("\\end"===f){1===m.length&&"styling"===p.type&&0===p.body[0].body.length&&c.pop(),d.length<c.length+1&&d.push([]);break}if("\\cr"!==f)throw new i("Expected & or \\\\ or \\cr or \\end",t.nextToken);var g=Ht(t.parseFunction(),"cr");u.push(g.size),d.push(cr(t)),m=[],c.push(m)}}return t.gullet.endGroup(),{type:"array",mode:t.mode,addJot:n,arraystretch:s,body:c,cols:o,rowGaps:u,hskipBeforeAndAfter:a,hLinesBeforeRow:d,colSeparationType:h}}function dr(t){return"d"===t.substr(0,1)?"display":"text"}var pr=function(t,e){var r,a,n=t.body.length,o=t.hLinesBeforeRow,s=0,h=new Array(n),l=[],m=1/e.fontMetrics().ptPerEm,u=5*m,d=12*m,p=3*m,f=t.arraystretch*d,g=.7*f,x=.3*f,v=0;function b(t){for(var e=0;e<t.length;++e)e>0&&(v+=.25),l.push({pos:v,isDashed:t[e]})}for(b(o[0]),r=0;r<t.body.length;++r){var y=t.body[r],w=g,k=x;s<y.length&&(s=y.length);var S=new Array(y.length);for(a=0;a<y.length;++a){var z=he(y[a],e);k<z.depth&&(k=z.depth),w<z.height&&(w=z.height),S[a]=z}var M=t.rowGaps[r],T=0;M&&(T=zt(M,e))>0&&(k<(T+=x)&&(k=T),T=0),t.addJot&&(k+=p),S.height=w,S.depth=k,v+=w,S.pos=v,v+=k+T,h[r]=S,b(o[r+1])}var A,B,q=v/2+e.fontMetrics().axisHeight,C=t.cols||[],N=[];for(a=0,B=0;a<s||B<C.length;++a,++B){for(var I=C[B]||{},O=!0;"separator"===I.type;){if(O||((A=Lt.makeSpan(["arraycolsep"],[])).style.width=e.fontMetrics().doubleRuleSep+"em",N.push(A)),"|"===I.separator){var E=Lt.makeSpan(["vertical-separator"],[],e);E.style.height=v+"em",E.style.verticalAlign=-(v-q)+"em",N.push(E)}else{if(":"!==I.separator)throw new i("Invalid separator type: "+I.separator);var R=Lt.makeSpan(["vertical-separator","vs-dashed"],[],e);R.style.height=v+"em",R.style.verticalAlign=-(v-q)+"em",N.push(R)}I=C[++B]||{},O=!1}if(!(a>=s)){var L=void 0;(a>0||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.pregap,u))&&((A=Lt.makeSpan(["arraycolsep"],[])).style.width=L+"em",N.push(A));var H=[];for(r=0;r<n;++r){var P=h[r],D=P[a];if(D){var F=P.pos-q;D.depth=P.depth,D.height=P.height,H.push({type:"elem",elem:D,shift:F})}}H=Lt.makeVList({positionType:"individualShift",children:H},e),H=Lt.makeSpan(["col-align-"+(I.align||"c")],[H]),N.push(H),(a<s-1||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.postgap,u))&&((A=Lt.makeSpan(["arraycolsep"],[])).style.width=L+"em",N.push(A))}}if(h=Lt.makeSpan(["mtable"],N),l.length>0){for(var V=Lt.makeLineSpan("hline",e,.05),U=Lt.makeLineSpan("hdashline",e,.05),G=[{type:"elem",elem:h,shift:0}];l.length>0;){var X=l.pop(),Y=X.pos-q;X.isDashed?G.push({type:"elem",elem:U,shift:Y}):G.push({type:"elem",elem:V,shift:Y})}h=Lt.makeVList({positionType:"individualShift",children:G},e)}return Lt.makeSpan(["mord"],[h],e)},fr={c:"center ",l:"left ",r:"right "},gr=function(t,e){var r=new pe.MathNode("mtable",t.body.map(function(t){return new pe.MathNode("mtr",t.map(function(t){return new pe.MathNode("mtd",[ye(t,e)])}))})),a=.16+t.arraystretch-1+(t.addJot?.09:0);r.setAttribute("rowspacing",a+"em");var n="",o="";if(t.cols){var i=t.cols,s="",h=!1,l=0,m=i.length;"separator"===i[0].type&&(n+="top ",l=1),"separator"===i[i.length-1].type&&(n+="bottom ",m-=1);for(var c=l;c<m;c++)"align"===i[c].type?(o+=fr[i[c].align],h&&(s+="none "),h=!0):"separator"===i[c].type&&h&&(s+="|"===i[c].separator?"solid ":"dashed ",h=!1);r.setAttribute("columnalign",o.trim()),/[sd]/.test(s)&&r.setAttribute("columnlines",s.trim())}if("align"===t.colSeparationType){for(var u=t.cols||[],d="",p=1;p<u.length;p++)d+=p%2?"0em ":"1em ";r.setAttribute("columnspacing",d.trim())}else"alignat"===t.colSeparationType?r.setAttribute("columnspacing","0em"):r.setAttribute("columnspacing","1em");var f="",g=t.hLinesBeforeRow;n+=g[0].length>0?"left ":"",n+=g[g.length-1].length>0?"right ":"";for(var x=1;x<g.length-1;x++)f+=0===g[x].length?"none ":g[x][0]?"dashed ":"solid ";if(/[sd]/.test(f)&&r.setAttribute("rowlines",f.trim()),""===n)return r;var v=new pe.MathNode("menclose",[r]);return v.setAttribute("notation",n.trim()),v},xr=function(t,e){var r,a=[],n=ur(t.parser,{cols:a,addJot:!0},"display"),o=0,s={type:"ordgroup",mode:t.mode,body:[]},h=Pt(e[0],"ordgroup");if(h){for(var l="",m=0;m<h.body.length;m++){l+=Ht(h.body[m],"textord").text}r=Number(l),o=2*r}var c=!o;n.body.forEach(function(t){for(var e=1;e<t.length;e+=2){var a=Ht(t[e],"styling");Ht(a.body[0],"ordgroup").body.unshift(s)}if(c)o<t.length&&(o=t.length);else{var n=t.length/2;if(r<n)throw new i("Too many math in a row: expected "+r+", but got "+n,t[0])}});for(var u=0;u<o;++u){var d="r",p=0;u%2==1?d="l":u>0&&c&&(p=1),a[u]={type:"align",align:d,pregap:p,postgap:0}}return n.colSeparationType=c?"align":"alignat",n};mr({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(t,e){var r={cols:(Ft(e[0])?[e[0]]:Ht(e[0],"ordgroup").body).map(function(t){var e=function(t){var e=Ft(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}(t).text;if(-1!=="lcr".indexOf(e))return{type:"align",align:e};if("|"===e)return{type:"separator",separator:"|"};if(":"===e)return{type:"separator",separator:":"};throw new i("Unknown column alignment: "+e,t)}),hskipBeforeAndAfter:!0};return ur(t.parser,r,dr(t.envName))},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],props:{numArgs:0},handler:function(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName],r=ur(t.parser,{hskipBeforeAndAfter:!1},dr(t.envName));return e?{type:"leftright",mode:t.mode,body:[r],left:e[0],right:e[1]}:r},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["cases","dcases"],props:{numArgs:0},handler:function(t){var e=ur(t.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},dr(t.envName));return{type:"leftright",mode:t.mode,body:[e],left:"\\{",right:"."}},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["aligned"],props:{numArgs:0},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["gathered"],props:{numArgs:0},handler:function(t){return ur(t.parser,{cols:[{type:"align",align:"c"}],addJot:!0},"display")},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["alignedat"],props:{numArgs:1},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),$t({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(t,e){throw new i(t.funcName+" valid only within array environment")}});var vr=lr;$t({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];if("ordgroup"!==n.type)throw new i("Invalid environment name",n);for(var o="",s=0;s<n.body.length;++s)o+=Ht(n.body[s],"textord").text;if("\\begin"===a){if(!vr.hasOwnProperty(o))throw new i("No such environment: "+o,n);var h=vr[o],l=r.parseArguments("\\begin{"+o+"}",h),m=l.args,c=l.optArgs,u={mode:r.mode,envName:o,parser:r},d=h.handler(u,m,c);r.expect("\\end",!1);var p=r.nextToken,f=Ht(r.parseFunction(),"environment");if(f.name!==o)throw new i("Mismatch: \\begin{"+o+"} matched by \\end{"+f.name+"}",p);return d}return{type:"environment",mode:r.mode,name:o,nameGroup:n}}});var br=Lt.makeSpan;function yr(t,e){var r=ae(t.body,e,!0);return br([t.mclass],r,e)}function wr(t,e){var r=ve(t.body,e);return pe.newDocumentFragment(r)}$t({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+a.substr(5),body:Kt(n)}},htmlBuilder:yr,mathmlBuilder:wr});var kr=function(t){var e="ordgroup"===t.type&&t.body.length?t.body[0]:t;return"atom"!==e.type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family};$t({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:function(t,e){return{type:"mclass",mode:t.parser.mode,mclass:kr(e[0]),body:[e[1]]}}}),$t({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[1],i=e[0];r="\\stackrel"!==n?kr(o):"mrel";var s={type:"op",mode:o.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:Kt(o)},h={type:"supsub",mode:i.mode,base:s,sup:"\\underset"===n?null:i,sub:"\\underset"===n?i:null};return{type:"mclass",mode:a.mode,mclass:r,body:[h]}},htmlBuilder:yr,mathmlBuilder:wr});var Sr=function(t,e){var r=t.font,a=e.withFont(r);return he(t.body,a)},zr=function(t,e){var r=t.font,a=e.withFont(r);return ye(t.body,a)},Mr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};$t({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0],o=a;return o in Mr&&(o=Mr[o]),{type:"font",mode:r.mode,font:o.slice(1),body:n}},htmlBuilder:Sr,mathmlBuilder:zr}),$t({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=e[0];return{type:"mclass",mode:r.mode,mclass:kr(a),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:a}]}}}),$t({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=t.breakOnTokenText,o=r.mode,i=r.parseExpression(!0,n);return{type:"font",mode:o,font:"math"+a.slice(1),body:{type:"ordgroup",mode:r.mode,body:i}}},htmlBuilder:Sr,mathmlBuilder:zr});var Tr=function(t,e){var r=e;return"display"===t?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:"text"===t&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===t?r=w.SCRIPT:"scriptscript"===t&&(r=w.SCRIPTSCRIPT),r},Ar=function(t,e){var r,a=Tr(t.size,e.style),n=a.fracNum(),o=a.fracDen();r=e.havingStyle(n);var i=he(t.numer,r,e);if(t.continued){var s=8.5/e.fontMetrics().ptPerEm,h=3.5/e.fontMetrics().ptPerEm;i.height=i.height<s?s:i.height,i.depth=i.depth<h?h:i.depth}r=e.havingStyle(o);var l,m,c,u,d,p,f,g,x,v,b=he(t.denom,r,e);if(t.hasBarLine?(t.barSize?(m=zt(t.barSize,e),l=Lt.makeLineSpan("frac-line",e,m)):l=Lt.makeLineSpan("frac-line",e),m=l.height,c=l.height):(l=null,m=0,c=e.fontMetrics().defaultRuleThickness),a.size===w.DISPLAY.size||"display"===t.size?(u=e.fontMetrics().num1,d=m>0?3*c:7*c,p=e.fontMetrics().denom1):(m>0?(u=e.fontMetrics().num2,d=c):(u=e.fontMetrics().num3,d=3*c),p=e.fontMetrics().denom2),l){var y=e.fontMetrics().axisHeight;u-i.depth-(y+.5*m)<d&&(u+=d-(u-i.depth-(y+.5*m))),y-.5*m-(b.height-p)<d&&(p+=d-(y-.5*m-(b.height-p)));var k=-(y-.5*m);f=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:p},{type:"elem",elem:l,shift:k},{type:"elem",elem:i,shift:-u}]},e)}else{var S=u-i.depth-(b.height-p);S<d&&(u+=.5*(d-S),p+=.5*(d-S)),f=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:p},{type:"elem",elem:i,shift:-u}]},e)}return r=e.havingStyle(a),f.height*=r.sizeMultiplier/e.sizeMultiplier,f.depth*=r.sizeMultiplier/e.sizeMultiplier,g=a.size===w.DISPLAY.size?e.fontMetrics().delim1:e.fontMetrics().delim2,x=null==t.leftDelim?se(e,["mopen"]):er(t.leftDelim,g,!0,e.havingStyle(a),t.mode,["mopen"]),v=t.continued?Lt.makeSpan([]):null==t.rightDelim?se(e,["mclose"]):er(t.rightDelim,g,!0,e.havingStyle(a),t.mode,["mclose"]),Lt.makeSpan(["mord"].concat(r.sizingClasses(e)),[x,Lt.makeSpan(["mfrac"],[f]),v],e)},Br=function(t,e){var r=new pe.MathNode("mfrac",[ye(t.numer,e),ye(t.denom,e)]);if(t.hasBarLine){if(t.barSize){var a=zt(t.barSize,e);r.setAttribute("linethickness",a+"em")}}else r.setAttribute("linethickness","0px");var n=Tr(t.size,e.style);if(n.size!==e.style.size){r=new pe.MathNode("mstyle",[r]);var o=n.size===w.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",o),r.setAttribute("scriptlevel","0")}if(null!=t.leftDelim||null!=t.rightDelim){var i=[];if(null!=t.leftDelim){var s=new pe.MathNode("mo",[new pe.TextNode(t.leftDelim.replace("\\",""))]);s.setAttribute("fence","true"),i.push(s)}if(i.push(r),null!=t.rightDelim){var h=new pe.MathNode("mo",[new pe.TextNode(t.rightDelim.replace("\\",""))]);h.setAttribute("fence","true"),i.push(h)}return ge(i)}return r};$t({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,greediness:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[0],i=e[1],s=null,h=null,l="auto";switch(n){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,s="(",h=")";break;case"\\\\bracefrac":r=!1,s="\\{",h="\\}";break;case"\\\\brackfrac":r=!1,s="[",h="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\cfrac":case"\\dfrac":case"\\dbinom":l="display";break;case"\\tfrac":case"\\tbinom":l="text"}return{type:"genfrac",mode:a.mode,continued:"\\cfrac"===n,numer:o,denom:i,hasBarLine:r,leftDelim:s,rightDelim:h,size:l,barSize:null}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler:function(t){var e,r=t.parser,a=t.funcName,n=t.token;switch(a){case"\\over":e="\\frac";break;case"\\choose":e="\\binom";break;case"\\atop":e="\\\\atopfrac";break;case"\\brace":e="\\\\bracefrac";break;case"\\brack":e="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:e,token:n}}});var qr=["display","text","script","scriptscript"],Cr=function(t){var e=null;return t.length>0&&(e="."===(e=t)?null:e),e};$t({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,greediness:6,argTypes:["math","math","size","text","math","math"]},handler:function(t,e){var r=t.parser,a=e[4],n=e[5],o=Pt(e[0],"atom");o&&(o=Dt(e[0],"open"));var i=o?Cr(o.text):null,s=Pt(e[1],"atom");s&&(s=Dt(e[1],"close"));var h,l=s?Cr(s.text):null,m=Ht(e[2],"size"),c=null;h=!!m.isBlank||(c=m.value).number>0;var u="auto",d=Pt(e[3],"ordgroup");if(d){if(d.body.length>0){var p=Ht(d.body[0],"textord");u=qr[Number(p.text)]}}else d=Ht(e[3],"textord"),u=qr[Number(d.text)];return{type:"genfrac",mode:r.mode,numer:a,denom:n,continued:!1,hasBarLine:h,barSize:c,leftDelim:i,rightDelim:l,size:u}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(t,e){var r=t.parser,a=(t.funcName,t.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ht(e[0],"size").value,token:a}}}),$t({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(t,e){var r=t.parser,a=(t.funcName,e[0]),n=function(t){if(!t)throw new Error("Expected non-null, but got "+String(t));return t}(Ht(e[1],"infix").size),o=e[2],i=n.number>0;return{type:"genfrac",mode:r.mode,numer:a,denom:o,continued:!1,hasBarLine:i,barSize:n,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Ar,mathmlBuilder:Br});var Nr=function(t,e){var r,a,n=e.style,o=Pt(t,"supsub");o?(r=o.sup?he(o.sup,e.havingStyle(n.sup()),e):he(o.sub,e.havingStyle(n.sub()),e),a=Ht(o.base,"horizBrace")):a=Ht(t,"horizBrace");var i,s=he(a.base,e.havingBaseStyle(w.DISPLAY)),h=qe(a,e);if(a.isOver?(i=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:h}]},e)).children[0].children[0].children[1].classes.push("svg-align"):(i=Lt.makeVList({positionType:"bottom",positionData:s.depth+.1+h.height,children:[{type:"elem",elem:h},{type:"kern",size:.1},{type:"elem",elem:s}]},e)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Lt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e);i=a.isOver?Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},e):Lt.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},e)}return Lt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e)};$t({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName;return{type:"horizBrace",mode:r.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:Nr,mathmlBuilder:function(t,e){var r=Be(t.label);return new pe.MathNode(t.isOver?"mover":"munder",[ye(t.base,e),r])}}),$t({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[1],n=Ht(e[0],"url").url;return{type:"href",mode:r.mode,href:n,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e,!1);return Lt.makeAnchor(t.href,[],r,e)},mathmlBuilder:function(t,e){var r=be(t.body,e);return r instanceof ue||(r=new ue("mrow",[r])),r.setAttribute("href",t.href),r}}),$t({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],"url").url,n=[],o=0;o<a.length;o++){var i=a[o];"~"===i&&(i="\\textasciitilde"),n.push({type:"textord",mode:"text",text:i})}var s={type:"text",mode:r.mode,font:"\\texttt",body:n};return{type:"href",mode:r.mode,href:a,body:Kt(s)}}}),$t({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:function(t,e){return{type:"htmlmathml",mode:t.parser.mode,html:Kt(e[0]),mathml:Kt(e[1])}},htmlBuilder:function(t,e){var r=ae(t.html,e,!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){return be(t.mathml,e)}}),$t({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=Ht(e[0],"size");if(r.settings.strict){var o="m"===a[1],i="mu"===n.value.unit;o?(i||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, not "+n.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):i&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:n.value}},htmlBuilder:function(t,e){return Lt.makeGlue(t.dimension,e)},mathmlBuilder:function(t,e){var r=zt(t.dimension,e);return new pe.SpaceNode(r)}}),$t({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"lap",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:function(t,e){var r;"clap"===t.alignment?(r=Lt.makeSpan([],[he(t.body,e)]),r=Lt.makeSpan(["inner"],[r],e)):r=Lt.makeSpan(["inner"],[he(t.body,e)]);var a=Lt.makeSpan(["fix"],[]),n=Lt.makeSpan([t.alignment],[r,a],e),o=Lt.makeSpan(["strut"]);return o.style.height=n.height+n.depth+"em",o.style.verticalAlign=-n.depth+"em",n.children.unshift(o),n=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:n}]},e),Lt.makeSpan(["mord"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mpadded",[ye(t.body,e)]);if("rlap"!==t.alignment){var a="llap"===t.alignment?"-1":"-0.5";r.setAttribute("lspace",a+"width")}return r.setAttribute("width","0px"),r}}),$t({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1,consumeMode:"math"},handler:function(t,e){var r=t.funcName,a=t.parser,n=a.mode;a.switchMode("math");var o="\\("===r?"\\)":"$",i=a.parseExpression(!1,o);return a.expect(o,!1),a.switchMode(n),a.consume(),{type:"styling",mode:a.mode,style:"text",body:i}}}),$t({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){throw new i("Mismatched "+t.funcName)}});var Ir=function(t,e){switch(e.style.size){case w.DISPLAY.size:return t.display;case w.TEXT.size:return t.text;case w.SCRIPT.size:return t.script;case w.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};$t({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4},handler:function(t,e){return{type:"mathchoice",mode:t.parser.mode,display:Kt(e[0]),text:Kt(e[1]),script:Kt(e[2]),scriptscript:Kt(e[3])}},htmlBuilder:function(t,e){var r=Ir(t,e),a=ae(r,e,!1);return Lt.makeFragment(a)},mathmlBuilder:function(t,e){var r=Ir(t,e);return be(r,e)}});var Or=["\\smallint"],Er=function(t,e){var r,a,n,o=!1,i=Pt(t,"supsub");i?(r=i.sup,a=i.sub,n=Ht(i.base,"op"),o=!0):n=Ht(t,"op");var s,h=e.style,l=!1;if(h.size===w.DISPLAY.size&&n.symbol&&!c.contains(Or,n.name)&&(l=!0),n.symbol){var m=l?"Size2-Regular":"Size1-Regular",u="";if("\\oiint"!==n.name&&"\\oiiint"!==n.name||(u=n.name.substr(1),n.name="oiint"===u?"\\iint":"\\iiint"),s=Lt.makeSymbol(n.name,m,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),u.length>0){var d=s.italic,p=Lt.staticSvg(u+"Size"+(l?"2":"1"),e);s=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),n.name="\\"+u,s.classes.unshift("mop"),s.italic=d}}else if(n.body){var f=ae(n.body,e,!0);1===f.length&&f[0]instanceof E?(s=f[0]).classes[0]="mop":s=Lt.makeSpan(["mop"],Lt.tryCombineChars(f),e)}else{for(var g=[],x=1;x<n.name.length;x++)g.push(Lt.mathsym(n.name[x],n.mode));s=Lt.makeSpan(["mop"],g,e)}var v=0,b=0;if((s instanceof E||"\\oiint"===n.name||"\\oiiint"===n.name)&&!n.suppressBaseShift&&(v=(s.height-s.depth)/2-e.fontMetrics().axisHeight,b=s.italic),o){var y,k,S;if(s=Lt.makeSpan([],[s]),r){var z=he(r,e.havingStyle(h.sup()),e);k={elem:z,kern:Math.max(e.fontMetrics().bigOpSpacing1,e.fontMetrics().bigOpSpacing3-z.depth)}}if(a){var M=he(a,e.havingStyle(h.sub()),e);y={elem:M,kern:Math.max(e.fontMetrics().bigOpSpacing2,e.fontMetrics().bigOpSpacing4-M.height)}}if(k&&y){var T=e.fontMetrics().bigOpSpacing5+y.elem.height+y.elem.depth+y.kern+s.depth+v;S=Lt.makeVList({positionType:"bottom",positionData:T,children:[{type:"kern",size:e.fontMetrics().bigOpSpacing5},{type:"elem",elem:y.elem,marginLeft:-b+"em"},{type:"kern",size:y.kern},{type:"elem",elem:s},{type:"kern",size:k.kern},{type:"elem",elem:k.elem,marginLeft:b+"em"},{type:"kern",size:e.fontMetrics().bigOpSpacing5}]},e)}else if(y){var A=s.height-v;S=Lt.makeVList({positionType:"top",positionData:A,children:[{type:"kern",size:e.fontMetrics().bigOpSpacing5},{type:"elem",elem:y.elem,marginLeft:-b+"em"},{type:"kern",size:y.kern},{type:"elem",elem:s}]},e)}else{if(!k)return s;var B=s.depth+v;S=Lt.makeVList({positionType:"bottom",positionData:B,children:[{type:"elem",elem:s},{type:"kern",size:k.kern},{type:"elem",elem:k.elem,marginLeft:b+"em"},{type:"kern",size:e.fontMetrics().bigOpSpacing5}]},e)}return Lt.makeSpan(["mop","op-limits"],[S],e)}return v&&(s.style.position="relative",s.style.top=v+"em"),s},Rr=function(t,e){var r;if(t.symbol)r=new ue("mo",[fe(t.name,t.mode)]),c.contains(Or,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new ue("mo",ve(t.body,e));else{r=new ue("mi",[new de(t.name.slice(1))]);var a=new ue("mo",[fe("\u2061","text")]);r=t.parentIsSupSub?new ue("mo",[r,a]):ce([r,a])}return r},Lr={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};$t({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:function(t,e){var r=t.parser,a=t.funcName;return 1===a.length&&(a=Lr[a]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"op",names:["\\mathop"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Kt(a)}},htmlBuilder:Er,mathmlBuilder:Rr});var Hr={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};function Pr(t,e,r){for(var a=ae(t,e,!1),n=e.sizeMultiplier/r.sizeMultiplier,o=0;o<a.length;o++){var i=a[o].classes.indexOf("sizing");i<0?Array.prototype.push.apply(a[o].classes,e.sizingClasses(r)):a[o].classes[i+1]==="reset-size"+e.size&&(a[o].classes[i+1]="reset-size"+r.size),a[o].height*=n,a[o].depth*=n}return Lt.makeFragment(a)}$t({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return 1===r.length&&(r=Hr[r]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"operatorname",names:["\\operatorname"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"operatorname",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){if(t.body.length>0){for(var r=t.body.map(function(t){var e=t.text;return"string"==typeof e?{type:"textord",mode:t.mode,text:e}:t}),a=ae(r,e.withFont("mathrm"),!0),n=0;n<a.length;n++){var o=a[n];o instanceof E&&(o.text=o.text.replace(/\u2212/,"-").replace(/\u2217/,"*"))}return Lt.makeSpan(["mop"],a,e)}return Lt.makeSpan(["mop"],[],e)},mathmlBuilder:function(t,e){for(var r=ve(t.body,e.withFont("mathrm")),a=!0,n=0;n<r.length;n++){var o=r[n];if(o instanceof pe.SpaceNode);else if(o instanceof pe.MathNode)switch(o.type){case"mi":case"mn":case"ms":case"mspace":case"mtext":break;case"mo":var i=o.children[0];1===o.children.length&&i instanceof pe.TextNode?i.text=i.text.replace(/\u2212/,"-").replace(/\u2217/,"*"):a=!1;break;default:a=!1}else a=!1}if(a){var s=r.map(function(t){return t.toText()}).join("");r=[new pe.TextNode(s)]}var h=new pe.MathNode("mi",r);h.setAttribute("mathvariant","normal");var l=new pe.MathNode("mo",[fe("\u2061","text")]);return pe.newDocumentFragment([h,l])}}),Zt({type:"ordgroup",htmlBuilder:function(t,e){return t.semisimple?Lt.makeFragment(ae(t.body,e,!1)):Lt.makeSpan(["mord"],ae(t.body,e,!0),e)},mathmlBuilder:function(t,e){return be(t.body,e)}}),$t({type:"overline",names:["\\overline"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"overline",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle()),a=Lt.makeLineSpan("overline-line",e),n=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*a.height},{type:"elem",elem:a},{type:"kern",size:a.height}]},e);return Lt.makeSpan(["mord","overline"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mo",[new pe.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new pe.MathNode("mover",[ye(t.body,e),r]);return a.setAttribute("accent","true"),a}}),$t({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"phantom",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e.withPhantom(),!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){var r=ve(t.body,e);return new pe.MathNode("mphantom",r)}}),$t({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"hphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a<r.children.length;a++)r.children[a].height=0,r.children[a].depth=0;return r=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e),Lt.makeSpan(["mord"],[r],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode("mphantom",r),n=new pe.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}}),$t({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"vphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan(["inner"],[he(t.body,e.withPhantom())]),a=Lt.makeSpan(["fix"],[]);return Lt.makeSpan(["mord","rlap"],[r,a],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode("mphantom",r),n=new pe.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}});var Dr=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],Fr=function(t,e){var r=e.havingSize(t.size);return Pr(t.body,r,e)};$t({type:"sizing",names:Dr,props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!1,r);return{type:"sizing",mode:n.mode,size:Dr.indexOf(a)+1,body:o}},htmlBuilder:Fr,mathmlBuilder:function(t,e){var r=e.havingSize(t.size),a=ve(t.body,r),n=new pe.MathNode("mstyle",a);return n.setAttribute("mathsize",r.sizeMultiplier+"em"),n}}),$t({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","text"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ht(e[0],"size").value,n=e[1];return{type:"raisebox",mode:r.mode,dy:a,body:n}},htmlBuilder:function(t,e){var r={type:"text",mode:t.mode,body:Kt(t.body),font:"mathrm"},a={type:"sizing",mode:t.mode,body:[r],size:6},n=Fr(a,e),o=zt(t.dy,e);return Lt.makeVList({positionType:"shift",positionData:-o,children:[{type:"elem",elem:n}]},e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mpadded",[ye(t.body,e)]),a=t.dy.number+t.dy.unit;return r.setAttribute("voffset",a),r}}),$t({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler:function(t,e,r){var a=t.parser,n=r[0],o=Ht(e[0],"size"),i=Ht(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&Ht(n,"size").value,width:o.value,height:i.value}},htmlBuilder:function(t,e){var r=Lt.makeSpan(["mord","rule"],[],e),a=zt(t.width,e),n=zt(t.height,e),o=t.shift?zt(t.shift,e):0;return r.style.borderRightWidth=a+"em",r.style.borderTopWidth=n+"em",r.style.bottom=o+"em",r.width=a,r.height=n+o,r.depth=-o,r.maxFontSize=1.125*n*e.sizeMultiplier,r},mathmlBuilder:function(t,e){var r=zt(t.width,e),a=zt(t.height,e),n=t.shift?zt(t.shift,e):0,o=e.color&&e.getColor()||"black",i=new pe.MathNode("mspace");i.setAttribute("mathbackground",o),i.setAttribute("width",r+"em"),i.setAttribute("height",a+"em");var s=new pe.MathNode("mpadded",[i]);return n>=0?s.setAttribute("height","+"+n+"em"):(s.setAttribute("height",n+"em"),s.setAttribute("depth","+"+-n+"em")),s.setAttribute("voffset",n+"em"),s}}),$t({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=!1,o=!1,i=r[0]&&Ht(r[0],"ordgroup");if(i)for(var s="",h=0;h<i.body.length;++h){if("t"===(s=i.body[h].text))n=!0;else{if("b"!==s){n=!1,o=!1;break}o=!0}}else n=!0,o=!0;var l=e[0];return{type:"smash",mode:a.mode,body:l,smashHeight:n,smashDepth:o}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var a=0;a<r.children.length;a++)r.children[a].height=0;if(t.smashDepth&&(r.depth=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].depth=0;var o=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e);return Lt.makeSpan(["mord"],[o],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mpadded",[ye(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r}}),$t({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=r[0],o=e[0];return{type:"sqrt",mode:a.mode,body:o,index:n}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle());0===r.height&&(r.height=e.fontMetrics().xHeight),r=Lt.wrapFragment(r,e);var a=e.fontMetrics().defaultRuleThickness,n=a;e.style.id<w.TEXT.id&&(n=e.fontMetrics().xHeight);var o=a+n/4,i=r.height+r.depth+o+a,s=Qe(i,e),h=s.span,l=s.ruleWidth,m=s.advanceWidth,c=h.height-l;c>r.height+r.depth+o&&(o=(o+c-r.height-r.depth)/2);var u=h.height-r.height-o-l;r.style.paddingLeft=m+"em";var d=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:h},{type:"kern",size:l}]},e);if(t.index){var p=e.havingStyle(w.SCRIPTSCRIPT),f=he(t.index,p,e),g=.6*(d.height-d.depth),x=Lt.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},e),v=Lt.makeSpan(["root"],[x]);return Lt.makeSpan(["mord","sqrt"],[v,d],e)}return Lt.makeSpan(["mord","sqrt"],[d],e)},mathmlBuilder:function(t,e){var r=t.body,a=t.index;return a?new pe.MathNode("mroot",[ye(r,e),ye(a,e)]):new pe.MathNode("msqrt",[ye(r,e)])}});var Vr={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};$t({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!0,r),i=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:i,body:o}},htmlBuilder:function(t,e){var r=Vr[t.style],a=e.havingStyle(r).withFont("");return Pr(t.body,a,e)},mathmlBuilder:function(t,e){var r={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT}[t.style],a=e.havingStyle(r),n=ve(t.body,a),o=new pe.MathNode("mstyle",n),i={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[t.style];return o.setAttribute("scriptlevel",i[0]),o.setAttribute("displaystyle",i[1]),o}});Zt({type:"supsub",htmlBuilder:function(t,e){var r=function(t,e){var r=t.base;return r?"op"===r.type?r.limits&&(e.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?Er:null:"accent"===r.type?c.isCharacterBox(r.base)?Ce:null:"horizBrace"===r.type&&!t.sub===r.isOver?Nr:null:null}(t,e);if(r)return r(t,e);var a,n,o,i=t.base,s=t.sup,h=t.sub,l=he(i,e),m=e.fontMetrics(),u=0,d=0,p=i&&c.isCharacterBox(i);if(s){var f=e.havingStyle(e.style.sup());a=he(s,f,e),p||(u=l.height-f.fontMetrics().supDrop*f.sizeMultiplier/e.sizeMultiplier)}if(h){var g=e.havingStyle(e.style.sub());n=he(h,g,e),p||(d=l.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}o=e.style===w.DISPLAY?m.sup1:e.style.cramped?m.sup3:m.sup2;var x,v=e.sizeMultiplier,b=.5/m.ptPerEm/v+"em",y=null;if(n){var k=t.base&&"op"===t.base.type&&t.base.name&&("\\oiint"===t.base.name||"\\oiiint"===t.base.name);(l instanceof E||k)&&(y=-l.italic+"em")}if(a&&n){u=Math.max(u,o,a.depth+.25*m.xHeight),d=Math.max(d,m.sub2);var S=4*m.defaultRuleThickness;if(u-a.depth-(n.height-d)<S){d=S-(u-a.depth)+n.height;var z=.8*m.xHeight-(u-a.depth);z>0&&(u+=z,d-=z)}var M=[{type:"elem",elem:n,shift:d,marginRight:b,marginLeft:y},{type:"elem",elem:a,shift:-u,marginRight:b}];x=Lt.makeVList({positionType:"individualShift",children:M},e)}else if(n){d=Math.max(d,m.sub1,n.height-.8*m.xHeight);var T=[{type:"elem",elem:n,marginLeft:y,marginRight:b}];x=Lt.makeVList({positionType:"shift",positionData:d,children:T},e)}else{if(!a)throw new Error("supsub must have either sup or sub.");u=Math.max(u,o,a.depth+.25*m.xHeight),x=Lt.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:a,marginRight:b}]},e)}var A=ie(l,"right")||"mord";return Lt.makeSpan([A],[l,Lt.makeSpan(["msupsub"],[x])],e)},mathmlBuilder:function(t,e){var r,a=!1,n=Pt(t.base,"horizBrace");n&&!!t.sup===n.isOver&&(a=!0,r=n.isOver),t.base&&"op"===t.base.type&&(t.base.parentIsSupSub=!0);var o,i=[ye(t.base,e)];if(t.sub&&i.push(ye(t.sub,e)),t.sup&&i.push(ye(t.sup,e)),a)o=r?"mover":"munder";else if(t.sub)if(t.sup){var s=t.base;o=s&&"op"===s.type&&s.limits&&e.style===w.DISPLAY?"munderover":"msubsup"}else{var h=t.base;o=h&&"op"===h.type&&h.limits&&(e.style===w.DISPLAY||h.alwaysHandleSupSub)?"munder":"msub"}else{var l=t.base;o=l&&"op"===l.type&&l.limits&&(e.style===w.DISPLAY||l.alwaysHandleSupSub)?"mover":"msup"}return new pe.MathNode(o,i)}}),Zt({type:"atom",htmlBuilder:function(t,e){return Lt.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder:function(t,e){var r=new pe.MathNode("mo",[fe(t.text,t.mode)]);if("bin"===t.family){var a=xe(t,e);"bold-italic"===a&&r.setAttribute("mathvariant",a)}else"punct"===t.family?r.setAttribute("separator","true"):"open"!==t.family&&"close"!==t.family||r.setAttribute("stretchy","false");return r}});var Ur={mi:"italic",mn:"normal",mtext:"normal"};Zt({type:"mathord",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,"mathord")},mathmlBuilder:function(t,e){var r=new pe.MathNode("mi",[fe(t.text,t.mode,e)]),a=xe(t,e)||"italic";return a!==Ur[r.type]&&r.setAttribute("mathvariant",a),r}}),Zt({type:"textord",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,"textord")},mathmlBuilder:function(t,e){var r,a=fe(t.text,t.mode,e),n=xe(t,e)||"normal";return r="text"===t.mode?new pe.MathNode("mtext",[a]):/[0-9]/.test(t.text)?new pe.MathNode("mn",[a]):"\\prime"===t.text?new pe.MathNode("mo",[a]):new pe.MathNode("mi",[a]),n!==Ur[r.type]&&r.setAttribute("mathvariant",n),r}});var Gr={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Xr={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};Zt({type:"spacing",htmlBuilder:function(t,e){if(Xr.hasOwnProperty(t.text)){var r=Xr[t.text].className||"";if("text"===t.mode){var a=Lt.makeOrd(t,e,"textord");return a.classes.push(r),a}return Lt.makeSpan(["mspace",r],[Lt.mathsym(t.text,t.mode,e)],e)}if(Gr.hasOwnProperty(t.text))return Lt.makeSpan(["mspace",Gr[t.text]],[],e);throw new i('Unknown type of space "'+t.text+'"')},mathmlBuilder:function(t,e){if(!Xr.hasOwnProperty(t.text)){if(Gr.hasOwnProperty(t.text))return new pe.MathNode("mspace");throw new i('Unknown type of space "'+t.text+'"')}return new pe.MathNode("mtext",[new pe.TextNode("\xa0")])}});var Yr=function(){var t=new pe.MathNode("mtd",[]);return t.setAttribute("width","50%"),t};Zt({type:"tag",mathmlBuilder:function(t,e){var r=new pe.MathNode("mtable",[new pe.MathNode("mtr",[Yr(),new pe.MathNode("mtd",[be(t.body,e)]),Yr(),new pe.MathNode("mtd",[be(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});var _r={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Wr={"\\textbf":"textbf","\\textmd":"textmd"},jr={"\\textit":"textit","\\textup":"textup"},$r=function(t,e){var r=t.font;return r?_r[r]?e.withTextFontFamily(_r[r]):Wr[r]?e.withTextFontWeight(Wr[r]):e.withTextFontShape(jr[r]):e};$t({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],greediness:2,allowedInText:!0,consumeMode:"text"},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"text",mode:r.mode,body:Kt(n),font:a}},htmlBuilder:function(t,e){var r=$r(t,e),a=ae(t.body,r,!0);return Lt.makeSpan(["mord","text"],Lt.tryCombineChars(a),r)},mathmlBuilder:function(t,e){var r=$r(t,e);return be(t.body,r)}}),$t({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){return{type:"underline",mode:t.parser.mode,body:e[0]}},htmlBuilder:function(t,e){var r=he(t.body,e),a=Lt.makeLineSpan("underline-line",e),n=Lt.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:a.height},{type:"elem",elem:a},{type:"kern",size:3*a.height},{type:"elem",elem:r}]},e);return Lt.makeSpan(["mord","underline"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mo",[new pe.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new pe.MathNode("munder",[ye(t.body,e),r]);return a.setAttribute("accentunder","true"),a}}),$t({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(t,e,r){throw new i("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(t,e){for(var r=Zr(t),a=[],n=e.havingStyle(e.style.text()),o=0;o<r.length;o++){var i=r[o];"~"===i&&(i="\\textasciitilde"),a.push(Lt.makeSymbol(i,"Typewriter-Regular",t.mode,n,["mord","texttt"]))}return Lt.makeSpan(["mord","text"].concat(n.sizingClasses(e)),Lt.tryCombineChars(a),n)},mathmlBuilder:function(t,e){var r=new pe.TextNode(Zr(t)),a=new pe.MathNode("mtext",[r]);return a.setAttribute("mathvariant","monospace"),a}});var Zr=function(t){return t.body.replace(/ /g,t.star?"\u2423":"\xa0")},Kr=_t,Jr=new RegExp("^(\\\\[a-zA-Z@]+)[ \r\n\t]*$"),Qr=new RegExp("[\u0300-\u036f]+$"),ta="([ \r\n\t]+)|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff][\u0300-\u036f]*|[\ud800-\udbff][\udc00-\udfff][\u0300-\u036f]*|\\\\verb\\*([^]).*?\\3|\\\\verb([^*a-zA-Z]).*?\\4|\\\\[a-zA-Z@]+[ \r\n\t]*|\\\\[^\ud800-\udfff])",ea=function(){function t(t,e){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=t,this.settings=e,this.tokenRegex=new RegExp(ta,"g"),this.catcodes={"%":14}}var e=t.prototype;return e.setCatcode=function(t,e){this.catcodes[t]=e},e.lex=function(){var t=this.input,e=this.tokenRegex.lastIndex;if(e===t.length)return new n("EOF",new a(this,e,e));var r=this.tokenRegex.exec(t);if(null===r||r.index!==e)throw new i("Unexpected character: '"+t[e]+"'",new n(t[e],new a(this,e,e+1)));var o=r[2]||" ";if(14===this.catcodes[o]){var s=t.indexOf("\n",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=t.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}var h=o.match(Jr);return h&&(o=h[1]),new n(o,new a(this,e,this.tokenRegex.lastIndex))},t}(),ra=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=e,this.builtins=t,this.undefStack=[]}var e=t.prototype;return e.beginGroup=function(){this.undefStack.push({})},e.endGroup=function(){if(0===this.undefStack.length)throw new i("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var t=this.undefStack.pop();for(var e in t)t.hasOwnProperty(e)&&(void 0===t[e]?delete this.current[e]:this.current[e]=t[e])},e.has=function(t){return this.current.hasOwnProperty(t)||this.builtins.hasOwnProperty(t)},e.get=function(t){return this.current.hasOwnProperty(t)?this.current[t]:this.builtins[t]},e.set=function(t,e,r){if(void 0===r&&(r=!1),r){for(var a=0;a<this.undefStack.length;a++)delete this.undefStack[a][t];this.undefStack.length>0&&(this.undefStack[this.undefStack.length-1][t]=e)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(t)&&(n[t]=this.current[t])}this.current[t]=e},t}(),aa={},na=aa;function oa(t,e){aa[t]=e}oa("\\@firstoftwo",function(t){return{tokens:t.consumeArgs(2)[0],numArgs:0}}),oa("\\@secondoftwo",function(t){return{tokens:t.consumeArgs(2)[1],numArgs:0}}),oa("\\@ifnextchar",function(t){var e=t.consumeArgs(3),r=t.future();return 1===e[0].length&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}}),oa("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),oa("\\TextOrMath",function(t){var e=t.consumeArgs(2);return"text"===t.mode?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var ia={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};oa("\\char",function(t){var e,r=t.popToken(),a="";if("'"===r.text)e=8,r=t.popToken();else if('"'===r.text)e=16,r=t.popToken();else if("`"===r.text)if("\\"===(r=t.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new i("\\char` missing argument");a=r.text.charCodeAt(0)}else e=10;if(e){if(null==(a=ia[r.text])||a>=e)throw new i("Invalid base-"+e+" digit "+r.text);for(var n;null!=(n=ia[t.future().text])&&n<e;)a*=e,a+=n,t.popToken()}return"\\@char{"+a+"}"});var sa=function(t,e){var r=t.consumeArgs(1)[0];if(1!==r.length)throw new i("\\gdef's first argument must be a macro name");var a=r[0].text,n=0;for(r=t.consumeArgs(1)[0];1===r.length&&"#"===r[0].text;){if(1!==(r=t.consumeArgs(1)[0]).length)throw new i('Invalid argument number length "'+r.length+'"');if(!/^[1-9]$/.test(r[0].text))throw new i('Invalid argument number "'+r[0].text+'"');if(n++,parseInt(r[0].text)!==n)throw new i('Argument number "'+r[0].text+'" out of order');r=t.consumeArgs(1)[0]}return t.macros.set(a,{tokens:r,numArgs:n},e),""};oa("\\gdef",function(t){return sa(t,!0)}),oa("\\def",function(t){return sa(t,!1)}),oa("\\global",function(t){var e=t.consumeArgs(1)[0];if(1!==e.length)throw new i("Invalid command after \\global");var r=e[0].text;if("\\def"===r)return sa(t,!0);throw new i("Invalid command '"+r+"' after \\global")});var ha=function(t,e,r){var a=t.consumeArgs(1)[0];if(1!==a.length)throw new i("\\newcommand's first argument must be a macro name");var n=a[0].text,o=t.isDefined(n);if(o&&!e)throw new i("\\newcommand{"+n+"} attempting to redefine "+n+"; use \\renewcommand");if(!o&&!r)throw new i("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var s=0;if(1===(a=t.consumeArgs(1)[0]).length&&"["===a[0].text){for(var h="",l=t.expandNextToken();"]"!==l.text&&"EOF"!==l.text;)h+=l.text,l=t.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new i("Invalid number of arguments: "+h);s=parseInt(h),a=t.consumeArgs(1)[0]}return t.macros.set(n,{tokens:a,numArgs:s}),""};oa("\\newcommand",function(t){return ha(t,!1,!0)}),oa("\\renewcommand",function(t){return ha(t,!0,!1)}),oa("\\providecommand",function(t){return ha(t,!0,!0)}),oa("\\bgroup","{"),oa("\\egroup","}"),oa("\\lq","`"),oa("\\rq","'"),oa("\\aa","\\r a"),oa("\\AA","\\r A"),oa("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),oa("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),oa("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),oa("\u212c","\\mathscr{B}"),oa("\u2130","\\mathscr{E}"),oa("\u2131","\\mathscr{F}"),oa("\u210b","\\mathscr{H}"),oa("\u2110","\\mathscr{I}"),oa("\u2112","\\mathscr{L}"),oa("\u2133","\\mathscr{M}"),oa("\u211b","\\mathscr{R}"),oa("\u212d","\\mathfrak{C}"),oa("\u210c","\\mathfrak{H}"),oa("\u2128","\\mathfrak{Z}"),oa("\\Bbbk","\\Bbb{k}"),oa("\xb7","\\cdotp"),oa("\\llap","\\mathllap{\\textrm{#1}}"),oa("\\rlap","\\mathrlap{\\textrm{#1}}"),oa("\\clap","\\mathclap{\\textrm{#1}}"),oa("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),oa("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),oa("\\ne","\\neq"),oa("\u2260","\\neq"),oa("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),oa("\u2209","\\notin"),oa("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),oa("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),oa("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),oa("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),oa("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),oa("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),oa("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),oa("\u27c2","\\perp"),oa("\u203c","\\mathclose{!\\mkern-0.8mu!}"),oa("\u220c","\\notni"),oa("\u231c","\\ulcorner"),oa("\u231d","\\urcorner"),oa("\u231e","\\llcorner"),oa("\u231f","\\lrcorner"),oa("\xa9","\\copyright"),oa("\xae","\\textregistered"),oa("\ufe0f","\\textregistered"),oa("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),oa("\u22ee","\\vdots"),oa("\\varGamma","\\mathit{\\Gamma}"),oa("\\varDelta","\\mathit{\\Delta}"),oa("\\varTheta","\\mathit{\\Theta}"),oa("\\varLambda","\\mathit{\\Lambda}"),oa("\\varXi","\\mathit{\\Xi}"),oa("\\varPi","\\mathit{\\Pi}"),oa("\\varSigma","\\mathit{\\Sigma}"),oa("\\varUpsilon","\\mathit{\\Upsilon}"),oa("\\varPhi","\\mathit{\\Phi}"),oa("\\varPsi","\\mathit{\\Psi}"),oa("\\varOmega","\\mathit{\\Omega}"),oa("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"),oa("\\boxed","\\fbox{$\\displaystyle{#1}$}"),oa("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),oa("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),oa("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");var la={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};oa("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in la?e=la[r]:"\\not"===r.substr(0,4)?e="\\dotsb":r in _.math&&c.contains(["bin","rel"],_.math[r].group)&&(e="\\dotsb"),e});var ma={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};oa("\\dotso",function(t){return t.future().text in ma?"\\ldots\\,":"\\ldots"}),oa("\\dotsc",function(t){var e=t.future().text;return e in ma&&","!==e?"\\ldots\\,":"\\ldots"}),oa("\\cdots",function(t){return t.future().text in ma?"\\@cdots\\,":"\\@cdots"}),oa("\\dotsb","\\cdots"),oa("\\dotsm","\\cdots"),oa("\\dotsi","\\!\\cdots"),oa("\\dotsx","\\ldots\\,"),oa("\\DOTSI","\\relax"),oa("\\DOTSB","\\relax"),oa("\\DOTSX","\\relax"),oa("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),oa("\\,","\\tmspace+{3mu}{.1667em}"),oa("\\thinspace","\\,"),oa("\\>","\\mskip{4mu}"),oa("\\:","\\tmspace+{4mu}{.2222em}"),oa("\\medspace","\\:"),oa("\\;","\\tmspace+{5mu}{.2777em}"),oa("\\thickspace","\\;"),oa("\\!","\\tmspace-{3mu}{.1667em}"),oa("\\negthinspace","\\!"),oa("\\negmedspace","\\tmspace-{4mu}{.2222em}"),oa("\\negthickspace","\\tmspace-{5mu}{.277em}"),oa("\\enspace","\\kern.5em "),oa("\\enskip","\\hskip.5em\\relax"),oa("\\quad","\\hskip1em\\relax"),oa("\\qquad","\\hskip2em\\relax"),oa("\\tag","\\@ifstar\\tag@literal\\tag@paren"),oa("\\tag@paren","\\tag@literal{({#1})}"),oa("\\tag@literal",function(t){if(t.macros.get("\\df@tag"))throw new i("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),oa("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),oa("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),oa("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),oa("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),oa("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\mathrlap{\\mkern0.4mu\\raisebox{0.4mu}{$#1$}}{\\mkern0.8mu#1}}}{\\mathbf{#1}}"),oa("\\\\","\\newline"),oa("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var ca=P["Main-Regular"]["T".charCodeAt(0)][1]-.7*P["Main-Regular"]["A".charCodeAt(0)][1]+"em";oa("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+ca+"}{\\scriptsize A}\\kern-.15em\\TeX}{LaTeX}}"),oa("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+ca+"}{\\scriptsize A}\\kern-.15em\\TeX}{KaTeX}}"),oa("\\hspace","\\@ifstar\\@hspacer\\@hspace"),oa("\\@hspace","\\hskip #1\\relax"),oa("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),oa("\\ordinarycolon",":"),oa("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),oa("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),oa("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),oa("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),oa("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),oa("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),oa("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),oa("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),oa("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),oa("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),oa("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),oa("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),oa("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),oa("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),oa("\u2237","\\dblcolon"),oa("\u2239","\\eqcolon"),oa("\u2254","\\coloneqq"),oa("\u2255","\\eqqcolon"),oa("\u2a74","\\Coloneqq"),oa("\\ratio","\\vcentcolon"),oa("\\coloncolon","\\dblcolon"),oa("\\colonequals","\\coloneqq"),oa("\\coloncolonequals","\\Coloneqq"),oa("\\equalscolon","\\eqqcolon"),oa("\\equalscoloncolon","\\Eqqcolon"),oa("\\colonminus","\\coloneq"),oa("\\coloncolonminus","\\Coloneq"),oa("\\minuscolon","\\eqcolon"),oa("\\minuscoloncolon","\\Eqcolon"),oa("\\coloncolonapprox","\\Colonapprox"),oa("\\coloncolonsim","\\Colonsim"),oa("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),oa("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),oa("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),oa("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),oa("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),oa("\\limsup","\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"),oa("\\liminf","\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"),oa("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),oa("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),oa("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),oa("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),oa("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),oa("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),oa("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),oa("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),oa("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),oa("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),oa("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),oa("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),oa("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),oa("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),oa("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),oa("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),oa("\u27e6","\\llbracket"),oa("\u27e7","\\rrbracket"),oa("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),oa("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),oa("\u2983","\\lBrace"),oa("\u2984","\\rBrace"),oa("\\darr","\\downarrow"),oa("\\dArr","\\Downarrow"),oa("\\Darr","\\Downarrow"),oa("\\lang","\\langle"),oa("\\rang","\\rangle"),oa("\\uarr","\\uparrow"),oa("\\uArr","\\Uparrow"),oa("\\Uarr","\\Uparrow"),oa("\\N","\\mathbb{N}"),oa("\\R","\\mathbb{R}"),oa("\\Z","\\mathbb{Z}"),oa("\\alef","\\aleph"),oa("\\alefsym","\\aleph"),oa("\\Alpha","\\mathrm{A}"),oa("\\Beta","\\mathrm{B}"),oa("\\bull","\\bullet"),oa("\\Chi","\\mathrm{X}"),oa("\\clubs","\\clubsuit"),oa("\\cnums","\\mathbb{C}"),oa("\\Complex","\\mathbb{C}"),oa("\\Dagger","\\ddagger"),oa("\\diamonds","\\diamondsuit"),oa("\\empty","\\emptyset"),oa("\\Epsilon","\\mathrm{E}"),oa("\\Eta","\\mathrm{H}"),oa("\\exist","\\exists"),oa("\\harr","\\leftrightarrow"),oa("\\hArr","\\Leftrightarrow"),oa("\\Harr","\\Leftrightarrow"),oa("\\hearts","\\heartsuit"),oa("\\image","\\Im"),oa("\\infin","\\infty"),oa("\\Iota","\\mathrm{I}"),oa("\\isin","\\in"),oa("\\Kappa","\\mathrm{K}"),oa("\\larr","\\leftarrow"),oa("\\lArr","\\Leftarrow"),oa("\\Larr","\\Leftarrow"),oa("\\lrarr","\\leftrightarrow"),oa("\\lrArr","\\Leftrightarrow"),oa("\\Lrarr","\\Leftrightarrow"),oa("\\Mu","\\mathrm{M}"),oa("\\natnums","\\mathbb{N}"),oa("\\Nu","\\mathrm{N}"),oa("\\Omicron","\\mathrm{O}"),oa("\\plusmn","\\pm"),oa("\\rarr","\\rightarrow"),oa("\\rArr","\\Rightarrow"),oa("\\Rarr","\\Rightarrow"),oa("\\real","\\Re"),oa("\\reals","\\mathbb{R}"),oa("\\Reals","\\mathbb{R}"),oa("\\Rho","\\mathrm{P}"),oa("\\sdot","\\cdot"),oa("\\sect","\\S"),oa("\\spades","\\spadesuit"),oa("\\sub","\\subset"),oa("\\sube","\\subseteq"),oa("\\supe","\\supseteq"),oa("\\Tau","\\mathrm{T}"),oa("\\thetasym","\\vartheta"),oa("\\weierp","\\wp"),oa("\\Zeta","\\mathrm{Z}"),oa("\\argmin","\\DOTSB\\mathop{\\operatorname{arg\\,min}}\\limits"),oa("\\argmax","\\DOTSB\\mathop{\\operatorname{arg\\,max}}\\limits"),oa("\\blue","\\textcolor{##6495ed}{#1}"),oa("\\orange","\\textcolor{##ffa500}{#1}"),oa("\\pink","\\textcolor{##ff00af}{#1}"),oa("\\red","\\textcolor{##df0030}{#1}"),oa("\\green","\\textcolor{##28ae7b}{#1}"),oa("\\gray","\\textcolor{gray}{##1}"),oa("\\purple","\\textcolor{##9d38bd}{#1}"),oa("\\blueA","\\textcolor{##ccfaff}{#1}"),oa("\\blueB","\\textcolor{##80f6ff}{#1}"),oa("\\blueC","\\textcolor{##63d9ea}{#1}"),oa("\\blueD","\\textcolor{##11accd}{#1}"),oa("\\blueE","\\textcolor{##0c7f99}{#1}"),oa("\\tealA","\\textcolor{##94fff5}{#1}"),oa("\\tealB","\\textcolor{##26edd5}{#1}"),oa("\\tealC","\\textcolor{##01d1c1}{#1}"),oa("\\tealD","\\textcolor{##01a995}{#1}"),oa("\\tealE","\\textcolor{##208170}{#1}"),oa("\\greenA","\\textcolor{##b6ffb0}{#1}"),oa("\\greenB","\\textcolor{##8af281}{#1}"),oa("\\greenC","\\textcolor{##74cf70}{#1}"),oa("\\greenD","\\textcolor{##1fab54}{#1}"),oa("\\greenE","\\textcolor{##0d923f}{#1}"),oa("\\goldA","\\textcolor{##ffd0a9}{#1}"),oa("\\goldB","\\textcolor{##ffbb71}{#1}"),oa("\\goldC","\\textcolor{##ff9c39}{#1}"),oa("\\goldD","\\textcolor{##e07d10}{#1}"),oa("\\goldE","\\textcolor{##a75a05}{#1}"),oa("\\redA","\\textcolor{##fca9a9}{#1}"),oa("\\redB","\\textcolor{##ff8482}{#1}"),oa("\\redC","\\textcolor{##f9685d}{#1}"),oa("\\redD","\\textcolor{##e84d39}{#1}"),oa("\\redE","\\textcolor{##bc2612}{#1}"),oa("\\maroonA","\\textcolor{##ffbde0}{#1}"),oa("\\maroonB","\\textcolor{##ff92c6}{#1}"),oa("\\maroonC","\\textcolor{##ed5fa6}{#1}"),oa("\\maroonD","\\textcolor{##ca337c}{#1}"),oa("\\maroonE","\\textcolor{##9e034e}{#1}"),oa("\\purpleA","\\textcolor{##ddd7ff}{#1}"),oa("\\purpleB","\\textcolor{##c6b9fc}{#1}"),oa("\\purpleC","\\textcolor{##aa87ff}{#1}"),oa("\\purpleD","\\textcolor{##7854ab}{#1}"),oa("\\purpleE","\\textcolor{##543b78}{#1}"),oa("\\mintA","\\textcolor{##f5f9e8}{#1}"),oa("\\mintB","\\textcolor{##edf2df}{#1}"),oa("\\mintC","\\textcolor{##e0e5cc}{#1}"),oa("\\grayA","\\textcolor{##f6f7f7}{#1}"),oa("\\grayB","\\textcolor{##f0f1f2}{#1}"),oa("\\grayC","\\textcolor{##e3e5e6}{#1}"),oa("\\grayD","\\textcolor{##d6d8da}{#1}"),oa("\\grayE","\\textcolor{##babec2}{#1}"),oa("\\grayF","\\textcolor{##888d93}{#1}"),oa("\\grayG","\\textcolor{##626569}{#1}"),oa("\\grayH","\\textcolor{##3b3e40}{#1}"),oa("\\grayI","\\textcolor{##21242c}{#1}"),oa("\\kaBlue","\\textcolor{##314453}{#1}"),oa("\\kaGreen","\\textcolor{##71B307}{#1}");var ua={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},da=function(){function t(t,e,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=e,this.expansionCount=0,this.feed(t),this.macros=new ra(na,e.macros),this.mode=r,this.stack=[]}var e=t.prototype;return e.feed=function(t){this.lexer=new ea(t,this.settings)},e.switchMode=function(t){this.mode=t},e.beginGroup=function(){this.macros.beginGroup()},e.endGroup=function(){this.macros.endGroup()},e.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},e.popToken=function(){return this.future(),this.stack.pop()},e.pushToken=function(t){this.stack.push(t)},e.pushTokens=function(t){var e;(e=this.stack).push.apply(e,t)},e.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},e.consumeArgs=function(t){for(var e=[],r=0;r<t;++r){this.consumeSpaces();var a=this.popToken();if("{"===a.text){for(var n=[],o=1;0!==o;){var s=this.popToken();if(n.push(s),"{"===s.text)++o;else if("}"===s.text)--o;else if("EOF"===s.text)throw new i("End of input in macro argument",a)}n.pop(),n.reverse(),e[r]=n}else{if("EOF"===a.text)throw new i("End of input expecting macro argument");e[r]=[a]}}return e},e.expandOnce=function(){var t=this.popToken(),e=t.text,r=this._getExpansion(e);if(null==r)return this.pushToken(t),t;if(this.expansionCount++,this.expansionCount>this.settings.maxExpand)throw new i("Too many expansions: infinite loop or need to increase maxExpand setting");var a=r.tokens;if(r.numArgs)for(var n=this.consumeArgs(r.numArgs),o=(a=a.slice()).length-1;o>=0;--o){var s=a[o];if("#"===s.text){if(0===o)throw new i("Incomplete placeholder at end of macro body",s);if("#"===(s=a[--o]).text)a.splice(o+1,1);else{if(!/^[1-9]$/.test(s.text))throw new i("Not a valid argument number",s);var h;(h=a).splice.apply(h,[o,2].concat(n[+s.text-1]))}}}return this.pushTokens(a),a},e.expandAfterFuture=function(){return this.expandOnce(),this.future()},e.expandNextToken=function(){for(;;){var t=this.expandOnce();if(t instanceof n){if("\\relax"!==t.text)return this.stack.pop();this.stack.pop()}}throw new Error},e.expandMacro=function(t){if(this.macros.get(t)){var e=[],r=this.stack.length;for(this.pushToken(new n(t));this.stack.length>r;){this.expandOnce()instanceof n&&e.push(this.stack.pop())}return e}},e.expandMacroAsText=function(t){var e=this.expandMacro(t);return e?e.map(function(t){return t.text}).join(""):e},e._getExpansion=function(t){var e=this.macros.get(t);if(null==e)return e;var r="function"==typeof e?e(this):e;if("string"==typeof r){var a=0;if(-1!==r.indexOf("#"))for(var n=r.replace(/##/g,"");-1!==n.indexOf("#"+(a+1));)++a;for(var o=new ea(r,this.settings),i=[],s=o.lex();"EOF"!==s.text;)i.push(s),s=o.lex();return i.reverse(),{tokens:i,numArgs:a}}return r},e.isDefined=function(t){return this.macros.has(t)||Kr.hasOwnProperty(t)||_.math.hasOwnProperty(t)||_.text.hasOwnProperty(t)||ua.hasOwnProperty(t)},t}(),pa={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"}},fa={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\u010f":"d\u030c","\u1e0b":"d\u0307","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u013a":"l\u0301","\u013e":"l\u030c","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\u010e":"D\u030c","\u1e0a":"D\u0307","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0139":"L\u0301","\u013d":"L\u030c","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u0164":"T\u030c","\u1e6a":"T\u0307","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},ga=function(){function t(t,e){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new da(t,e,this.mode),this.settings=e,this.leftrightDepth=0}var e=t.prototype;return e.expect=function(t,e){if(void 0===e&&(e=!0),this.nextToken.text!==t)throw new i("Expected '"+t+"', got '"+this.nextToken.text+"'",this.nextToken);e&&this.consume()},e.consume=function(){this.nextToken=this.gullet.expandNextToken()},e.switchMode=function(t){this.mode=t,this.gullet.switchMode(t)},e.parse=function(){this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor"),this.consume();var t=this.parseExpression(!1);return this.expect("EOF",!1),this.gullet.endGroup(),t},e.parseExpression=function(e,r){for(var a=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.nextToken;if(-1!==t.endOfExpression.indexOf(n.text))break;if(r&&n.text===r)break;if(e&&Kr[n.text]&&Kr[n.text].infix)break;var o=this.parseAtom(r);if(!o)break;a.push(o)}return"text"===this.mode&&this.formLigatures(a),this.handleInfixNodes(a)},e.handleInfixNodes=function(t){for(var e,r=-1,a=0;a<t.length;a++){var n=Pt(t[a],"infix");if(n){if(-1!==r)throw new i("only one infix operator per group",n.token);r=a,e=n.replaceWith}}if(-1!==r&&e){var o,s,h=t.slice(0,r),l=t.slice(r+1);return o=1===h.length&&"ordgroup"===h[0].type?h[0]:{type:"ordgroup",mode:this.mode,body:h},s=1===l.length&&"ordgroup"===l[0].type?l[0]:{type:"ordgroup",mode:this.mode,body:l},["\\\\abovefrac"===e?this.callFunction(e,[o,t[r],s],[]):this.callFunction(e,[o,s],[])]}return t},e.handleSupSubscript=function(e){var r=this.nextToken,a=r.text;this.consume(),this.consumeSpaces();var n=this.parseGroup(e,!1,t.SUPSUB_GREEDINESS);if(!n)throw new i("Expected group after '"+a+"'",r);return n},e.handleUnsupportedCmd=function(){for(var t=this.nextToken.text,e=[],r=0;r<t.length;r++)e.push({type:"textord",mode:"text",text:t[r]});var a={type:"text",mode:this.mode,body:e},n={type:"color",mode:this.mode,color:this.settings.errorColor,body:[a]};return this.consume(),n},e.parseAtom=function(t){var e,r,a=this.parseGroup("atom",!1,null,t);if("text"===this.mode)return a;for(;;){this.consumeSpaces();var n=this.nextToken;if("\\limits"===n.text||"\\nolimits"===n.text){var o=Pt(a,"op");if(!o)throw new i("Limit controls must follow a math operator",n);var s="\\limits"===n.text;o.limits=s,o.alwaysHandleSupSub=!0,this.consume()}else if("^"===n.text){if(e)throw new i("Double superscript",n);e=this.handleSupSubscript("superscript")}else if("_"===n.text){if(r)throw new i("Double subscript",n);r=this.handleSupSubscript("subscript")}else{if("'"!==n.text)break;if(e)throw new i("Double superscript",n);var h={type:"textord",mode:this.mode,text:"\\prime"},l=[h];for(this.consume();"'"===this.nextToken.text;)l.push(h),this.consume();"^"===this.nextToken.text&&l.push(this.handleSupSubscript("superscript")),e={type:"ordgroup",mode:this.mode,body:l}}}return e||r?{type:"supsub",mode:this.mode,base:a,sup:e,sub:r}:a},e.parseFunction=function(t,e,r){var a=this.nextToken,n=a.text,o=Kr[n];if(!o)return null;if(null!=r&&o.greediness<=r)throw new i("Got function '"+n+"' with no arguments"+(e?" as "+e:""),a);if("text"===this.mode&&!o.allowedInText)throw new i("Can't use function '"+n+"' in text mode",a);if("math"===this.mode&&!1===o.allowedInMath)throw new i("Can't use function '"+n+"' in math mode",a);if(o.argTypes&&"url"===o.argTypes[0]&&this.gullet.lexer.setCatcode("%",13),o.consumeMode){var s=this.mode;this.switchMode(o.consumeMode),this.consume(),this.switchMode(s)}else this.consume();var h=this.parseArguments(n,o),l=h.args,m=h.optArgs;return this.callFunction(n,l,m,a,t)},e.callFunction=function(t,e,r,a,n){var o={funcName:t,parser:this,token:a,breakOnTokenText:n},s=Kr[t];if(s&&s.handler)return s.handler(o,e,r);throw new i("No function handler for "+t)},e.parseArguments=function(t,e){var r=e.numArgs+e.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var a=e.greediness,n=[],o=[],s=0;s<r;s++){var h=e.argTypes&&e.argTypes[s],l=s<e.numOptionalArgs;s>0&&!l&&this.consumeSpaces(),0!==s||l||"math"!==this.mode||this.consumeSpaces();var m=this.nextToken,c=this.parseGroupOfType("argument to '"+t+"'",h,l,a);if(!c){if(l){o.push(null);continue}throw new i("Expected group after '"+t+"'",m)}(l?o:n).push(c)}return{args:n,optArgs:o}},e.parseGroupOfType=function(t,e,r,a){switch(e){case"color":return this.parseColorGroup(r);case"size":return this.parseSizeGroup(r);case"url":return this.parseUrlGroup(r);case"math":case"text":return this.parseGroup(t,r,a,void 0,e);case"raw":if(r&&"{"===this.nextToken.text)return null;var n=this.parseStringGroup("raw",r,!0);if(n)return{type:"raw",mode:"text",string:n.text};throw new i("Expected raw group",this.nextToken);case"original":case null:case void 0:return this.parseGroup(t,r,a);default:throw new i("Unknown group type as "+t,this.nextToken)}},e.consumeSpaces=function(){for(;" "===this.nextToken.text;)this.consume()},e.parseStringGroup=function(t,e,r){var a=e?"[":"{",n=e?"]":"}",o=this.nextToken;if(o.text!==a){if(e)return null;if(r&&"EOF"!==o.text&&/[^{}[\]]/.test(o.text))return this.gullet.lexer.setCatcode("%",14),this.consume(),o}var s=this.mode;this.mode="text",this.expect(a);for(var h="",l=this.nextToken,m=0,c=l;r&&m>0||this.nextToken.text!==n;){switch(this.nextToken.text){case"EOF":throw new i("Unexpected end of input in "+t,l.range(c,h));case a:m++;break;case n:m--}h+=(c=this.nextToken).text,this.consume()}return this.mode=s,this.gullet.lexer.setCatcode("%",14),this.expect(n),l.range(c,h)},e.parseRegexGroup=function(t,e){var r=this.mode;this.mode="text";for(var a=this.nextToken,n=a,o="";"EOF"!==this.nextToken.text&&t.test(o+this.nextToken.text);)o+=(n=this.nextToken).text,this.consume();if(""===o)throw new i("Invalid "+e+": '"+a.text+"'",a);return this.mode=r,a.range(n,o)},e.parseColorGroup=function(t){var e=this.parseStringGroup("color",t);if(!e)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text);if(!r)throw new i("Invalid color: '"+e.text+"'",e);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a="#"+a),{type:"color-token",mode:this.mode,color:a}},e.parseSizeGroup=function(t){var e,r=!1;if(!(e=t||"{"===this.nextToken.text?this.parseStringGroup("size",t):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;t||0!==e.text.length||(e.text="0pt",r=!0);var a=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e.text);if(!a)throw new i("Invalid size: '"+e.text+"'",e);var n,o={number:+(a[1]+a[2]),unit:a[3]};if("string"!=typeof(n=o)&&(n=n.unit),!(n in kt||n in St||"ex"===n))throw new i("Invalid unit: '"+o.unit+"'",e);return{type:"size",mode:this.mode,value:o,isBlank:r}},e.parseUrlGroup=function(t){var e=this.parseStringGroup("url",t,!0);if(!e)return null;var r=e.text.replace(/\\([#$%&~_^{}])/g,"$1"),a=/^\s*([^\\\/#]*?)(?::|�*58|�*3a)/i.exec(r);a=null!=a?a[1]:"_relative";var n=this.settings.allowedProtocols;if(!c.contains(n,"*")&&!c.contains(n,a))throw new i("Forbidden protocol '"+a+"'",e);return{type:"url",mode:this.mode,url:r}},e.parseGroup=function(e,r,n,o,s){var h,l,m=this.mode,c=this.nextToken,u=c.text;if(s&&this.switchMode(s),r?"["===u:"{"===u||"\\begingroup"===u){h=t.endOfGroup[u],this.gullet.beginGroup(),this.consume();var d=this.parseExpression(!1,h),p=this.nextToken;this.gullet.endGroup(),l={type:"ordgroup",mode:this.mode,loc:a.range(c,p),body:d,semisimple:"\\begingroup"===u||void 0}}else if(r)l=null;else if(null==(l=this.parseFunction(o,e,n)||this.parseSymbol())&&"\\"===u[0]&&!ua.hasOwnProperty(u)){if(this.settings.throwOnError)throw new i("Undefined control sequence: "+u,c);l=this.handleUnsupportedCmd()}return s&&this.switchMode(m),h&&this.expect(h),l},e.formLigatures=function(t){for(var e=t.length-1,r=0;r<e;++r){var n=t[r],o=n.text;"-"===o&&"-"===t[r+1].text&&(r+1<e&&"-"===t[r+2].text?(t.splice(r,3,{type:"textord",mode:"text",loc:a.range(n,t[r+2]),text:"---"}),e-=2):(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:"--"}),e-=1)),"'"!==o&&"`"!==o||t[r+1].text!==o||(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:o+o}),e-=1)}},e.parseSymbol=function(){var t=this.nextToken,e=t.text;if(/^\\verb[^a-zA-Z]/.test(e)){this.consume();var r=e.slice(5),n="*"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new i("\\verb assertion failed --\n please report what input caused this bug");return{type:"verb",mode:"text",body:r=r.slice(1,-1),star:n}}fa.hasOwnProperty(e[0])&&!_[this.mode][e[0]]&&(this.settings.strict&&"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Accented Unicode text character "'+e[0]+'" used in math mode',t),e=fa[e[0]]+e.substr(1));var o,s=Qr.exec(e);if(s&&("i"===(e=e.substring(0,s.index))?e="\u0131":"j"===e&&(e="\u0237")),_[this.mode][e]){this.settings.strict&&"math"===this.mode&&"\xc7\xd0\xde\xe7\xfe".indexOf(e)>=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+e[0]+'" used in math mode',t);var h,l=_[this.mode][e].group,m=a.range(t);if(G.hasOwnProperty(l)){var c=l;h={type:"atom",mode:this.mode,family:c,loc:m,text:e}}else h={type:l,mode:this.mode,loc:m,text:e};o=h}else{if(!(e.charCodeAt(0)>=128))return null;this.settings.strict&&(z(e.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+e[0]+'" used in math mode',t):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+e[0]+'" ('+e.charCodeAt(0)+")",t)),o={type:"textord",mode:this.mode,loc:a.range(t),text:e}}if(this.consume(),s)for(var u=0;u<s[0].length;u++){var d=s[0][u];if(!pa[d])throw new i("Unknown accent ' "+d+"'",t);var p=pa[d][this.mode];if(!p)throw new i("Accent "+d+" unsupported in "+this.mode+" mode",t);o={type:"accent",mode:this.mode,loc:a.range(t),label:p,isStretchy:!1,isShifty:!0,base:o}}return o},t}();ga.endOfExpression=["}","\\endgroup","\\end","\\right","&"],ga.endOfGroup={"[":"]","{":"}","\\begingroup":"\\endgroup"},ga.SUPSUB_GREEDINESS=1;var xa=function(t,e){if(!("string"==typeof t||t instanceof String))throw new TypeError("KaTeX can only parse string typed expression");var r=new ga(t,e);delete r.gullet.macros.current["\\df@tag"];var a=r.parse();if(r.gullet.macros.get("\\df@tag")){if(!e.displayMode)throw new i("\\tag works only in display equations");r.gullet.feed("\\df@tag"),a=[{type:"tag",mode:"text",body:a,tag:r.parse()}]}return a},va=function(t,e,r){e.textContent="";var a=ya(t,r).toNode();e.appendChild(a)};"undefined"!=typeof document&&"CSS1Compat"!==document.compatMode&&("undefined"!=typeof console&&console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."),va=function(){throw new i("KaTeX doesn't work in quirks mode.")});var ba=function(t,e,r){if(r.throwOnError||!(t instanceof i))throw t;var a=Lt.makeSpan(["katex-error"],[new E(e)]);return a.setAttribute("title",t.toString()),a.setAttribute("style","color:"+r.errorColor),a},ya=function(t,e){var r=new u(e);try{var a=xa(t,r);return Se(a,t,r)}catch(e){return ba(e,t,r)}},wa={version:"0.10.2",render:va,renderToString:function(t,e){return ya(t,e).toMarkup()},ParseError:i,__parse:function(t,e){var r=new u(e);return xa(t,r)},__renderToDomTree:ya,__renderToHTMLTree:function(t,e){var r=new u(e);try{return function(t,e,r){var a=me(t,we(r)),n=Lt.makeSpan(["katex"],[a]);return ke(n,r)}(xa(t,r),0,r)}catch(e){return ba(e,t,r)}},__setFontMetrics:function(t,e){P[t]=e},__defineSymbol:W,__defineMacro:oa,__domTree:{Span:N,Anchor:I,SymbolNode:E,SvgNode:R,PathNode:L,LineNode:H}};e.default=wa}]).default}); diff --git a/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css b/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css index 8487b34e5..f083f6062 100644 --- a/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css +++ b/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css @@ -1 +1 @@ -.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-mathml{border:0;clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{border-right:.05em solid;display:inline-block;margin:0 -.025em;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;fill:currentColor;fill-opacity:1;fill-rule:nonzero;height:inherit;position:absolute;stroke:currentColor;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:1;width:100%}.katex svg path{stroke:none}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox{border:.04em solid #000;box-sizing:border-box}.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0} +.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.10.2"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} diff --git a/plugins/tiddlywiki/katex/plugin.info b/plugins/tiddlywiki/katex/plugin.info index 6a8f5ee61..bf57322a1 100644 --- a/plugins/tiddlywiki/katex/plugin.info +++ b/plugins/tiddlywiki/katex/plugin.info @@ -3,5 +3,6 @@ "description": "KaTeX: mathematical typography", "author": "JeremyRuston", "core-version": ">=5.0.0", - "list": "readme usage" + "list": "readme usage", + "library-version": "v0.10.2" } diff --git a/plugins/tiddlywiki/katex/readme.tid b/plugins/tiddlywiki/katex/readme.tid index d6a589fda..0d8c291a3 100644 --- a/plugins/tiddlywiki/katex/readme.tid +++ b/plugins/tiddlywiki/katex/readme.tid @@ -1,6 +1,6 @@ title: $:/plugins/tiddlywiki/katex/readme -This is a TiddlyWiki plugin for mathematical and chemical typesetting based on [ext[KaTeX from Khan Academy|http://khan.github.io/KaTeX/]] and [ext[mhchem|https://github.com/mhchem/MathJax-mhchem]] through a [ext[Katex extension|https://github.com/KaTeX/KaTeX/tree/master/contrib/mhchem]]. +This is a TiddlyWiki plugin for mathematical and chemical typesetting based on [ext[KaTeX from Khan Academy|http://khan.github.io/KaTeX/]] (v0.10.2) and [ext[mhchem|https://github.com/mhchem/MathJax-mhchem]] through a [ext[Katex extension|https://github.com/KaTeX/KaTeX/tree/master/contrib/mhchem]]. It is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js. From 8159c4a8655c4c565baf6078074d1a791b5b81e5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 4 Aug 2019 11:34:45 +0100 Subject: [PATCH 0259/2376] Fix navigator widget when story and/or history attributes are missing To fix the crash described here: https://groups.google.com/d/msgid/tiddlywiki/c5461591-bf27-4c85-9f27-9eef14c38816%40googlegroups.com?utm_medium=email&utm_source=footer --- core/modules/widgets/navigator.js | 61 ++++++++++++++++++------------- core/modules/wiki.js | 12 ++++-- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 9494346fb..4825e7a02 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -84,39 +84,50 @@ NavigatorWidget.prototype.getStoryList = function() { }; NavigatorWidget.prototype.saveStoryList = function(storyList) { - var storyTiddler = this.wiki.getTiddler(this.storyTitle); - this.wiki.addTiddler(new $tw.Tiddler( - {title: this.storyTitle}, - storyTiddler, - {list: storyList} - )); + if(this.storyTitle) { + var storyTiddler = this.wiki.getTiddler(this.storyTitle); + this.wiki.addTiddler(new $tw.Tiddler( + {title: this.storyTitle}, + storyTiddler, + {list: storyList} + )); + } }; NavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) { - var p = storyList.indexOf(title); - while(p !== -1) { - storyList.splice(p,1); - p = storyList.indexOf(title); + if(storyList) { + var p = storyList.indexOf(title); + while(p !== -1) { + storyList.splice(p,1); + p = storyList.indexOf(title); + } } }; NavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) { - var pos = storyList.indexOf(oldTitle); - if(pos !== -1) { - storyList[pos] = newTitle; - do { - pos = storyList.indexOf(oldTitle,pos + 1); - if(pos !== -1) { - storyList.splice(pos,1); - } - } while(pos !== -1); - } else { - storyList.splice(0,0,newTitle); + if(storyList) { + var pos = storyList.indexOf(oldTitle); + if(pos !== -1) { + storyList[pos] = newTitle; + do { + pos = storyList.indexOf(oldTitle,pos + 1); + if(pos !== -1) { + storyList.splice(pos,1); + } + } while(pos !== -1); + } else { + storyList.splice(0,0,newTitle); + } } }; NavigatorWidget.prototype.addToStory = function(title,fromTitle) { - this.wiki.addToStory(title,fromTitle,this.storyTitle,{openLinkFromInsideRiver: this.getAttribute("openLinkFromInsideRiver","top"),openLinkFromOutsideRiver: this.getAttribute("openLinkFromOutsideRiver","top")}); + if(this.storyTitle) { + this.wiki.addToStory(title,fromTitle,this.storyTitle,{ + openLinkFromInsideRiver: this.getAttribute("openLinkFromInsideRiver","top"), + openLinkFromOutsideRiver: this.getAttribute("openLinkFromOutsideRiver","top") + }); + } }; /* @@ -458,14 +469,14 @@ NavigatorWidget.prototype.handleNewTiddlerEvent = function(event) { },this.wiki.getModificationFields()); this.wiki.addTiddler(draftTiddler); // Update the story to insert the new draft at the top and remove any existing tiddler - if(storyList.indexOf(draftTitle) === -1) { + if(storyList && storyList.indexOf(draftTitle) === -1) { var slot = storyList.indexOf(event.navigateFromTitle); if(slot === -1) { slot = this.getAttribute("openLinkFromOutsideRiver","top") === "bottom" ? storyList.length - 1 : slot; } storyList.splice(slot + 1,0,draftTitle); } - if(storyList.indexOf(title) !== -1) { + if(storyList && storyList.indexOf(title) !== -1) { storyList.splice(storyList.indexOf(title),1); } this.saveStoryList(storyList); @@ -521,7 +532,7 @@ NavigatorWidget.prototype.handleImportTiddlersEvent = function(event) { var storyList = this.getStoryList(), history = []; // Add it to the story - if(storyList.indexOf(IMPORT_TITLE) === -1) { + if(storyList && storyList.indexOf(IMPORT_TITLE) === -1) { storyList.unshift(IMPORT_TITLE); } // And to history diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 3e5687638..a4bc7b650 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1388,8 +1388,10 @@ fromPageRect: page coordinates of the origin of the navigation historyTitle: title of history tiddler (defaults to $:/HistoryList) */ exports.addToHistory = function(title,fromPageRect,historyTitle) { - var story = new $tw.Story({wiki: this, historyTitle: historyTitle}); - story.addToHistory(title,fromPageRect); + if(historyTitle) { + var story = new $tw.Story({wiki: this, historyTitle: historyTitle}); + story.addToHistory(title,fromPageRect); + } }; /* @@ -1400,8 +1402,10 @@ storyTitle: title of story tiddler (defaults to $:/StoryList) options: see story.js */ exports.addToStory = function(title,fromTitle,storyTitle,options) { - var story = new $tw.Story({wiki: this, storyTitle: storyTitle}); - story.addToStory(title,fromTitle,options); + if(storyTitle) { + var story = new $tw.Story({wiki: this, storyTitle: storyTitle}); + story.addToStory(title,fromTitle,options); + } }; /* From e1bb532d98ffa519015caaf444f079bb99dd9d08 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 4 Aug 2019 14:01:24 +0200 Subject: [PATCH 0260/2376] Fix popups not being cancelled correctly (#4158) --- core/modules/utils/dom/popup.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index 2b615f411..aa89d705c 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -154,11 +154,12 @@ Detect if a Popup contains an input field that has focus Returns true or false */ Popup.prototype.detectInputWithinPopup = function(node) { - var withinPopup = false; + var withinPopup = false, + currNode = node; for(var i=0; i<this.popups.length; i++) { var popup = (this.popups[i] && this.popups[i].domNode) ? this.popups[i].domNode : null; while(node && popup) { - if(node === popup || (node.classList && (node.classList.contains("tc-popup-keep") || node.classList.contains("tc-popup-handle")))) { + if(node === popup || (node.classList && (node.classList.contains("tc-popup-keep") || (node !== currNode && node.classList.contains("tc-popup-handle"))))) { withinPopup = true; } node = node.parentNode; From 41d3e8039783e199139851bbafc5bc87cff8d7e9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 5 Aug 2019 14:28:42 +0100 Subject: [PATCH 0261/2376] Update release note More to come, I've only got as far as June 28th... --- editions/prerelease/tiddlers/Release 5.1.20.tid | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 3af277070..5f4a1d639 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -18,6 +18,10 @@ There is now finer control over TiddlyWiki's default behaviour of removing dupli * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/37bb75f0cf446d62eb45d07b9f9b0aa14814a43f]] support for new `=` prefix for merging filter runs without removing duplicates * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/18fe112da7d3ac210a5a0b9cf73fe9050717d4e3]] option for the [[enlist Operator]] to not remove duplicates +Keyboard shortcut handling has been significantly improved: + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf51ae001993565fd43443d053ea83e209b67c6f]] a keyboard shortcut (default <kbd>ctrl</kbd>-<kbd>shift</kbd>-<kbd>F</kbd>) for focussing the sidebar search field + !! Plugin Improvements New and improved plugins: @@ -52,12 +56,16 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e5f3301c1c36e8add4ed89ab1bd53a9b68411d3f]] a warning when core JavaScript modules are overwritten via import * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3654]] prompt for references when renaming a tiddler * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0e6855eba8945e023cc5ef19809cfb6d6025627b]] a new filter preset for advanced search for "tiddlers modified this session" +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/3832]] the [[palette manager|$:/PaletteManager]] with the ability to delete entries, and directly edit indirect entries !! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4051]] support for [[configurable view and edit templates|Hidden Setting: ViewTemplate and EditTemplate]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a saver for [[Saving to GitHub]] * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/37ea659bf011b1d4a152f54171399d94f5bba3ef]] the [[dumpvariables Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/754c1251a9bdf45e8f64079a4bbdaed2d05be2b7]] new [[variables Operator]] and [[getvariable Operator]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ed67f4a88b29c5c81d4de31203dbf23d66955fb7]] new [[WidgetMessage: tm-focus-selector]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3546]] new [[escapecss Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3880]] new [[unusedtitle Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/36e76429b1a1d4638374d513430393db5693b932]] new `[is[variable]]` option to the [[is Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/90684f9f52809ff5df39629d3b161d7ff23002f4]] new `[is[blank]]` option to the [[is Operator]] @@ -83,6 +91,7 @@ New and improved translations: * [[Ameliorated|https://github.com/Jermolene/TiddlyWiki5/pull/3809]] Firefox problem with sticky placeholder during drag and drop operations * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3819]] [[CodeMirror Plugin]] to use ''tiddler-editor-border'' colour * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8012a3508f209fbbe68484e30ed65832cf5146b9]] problem using the TiddlySpot saver with cookies disabled +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3611]] framed text editor to use correct background colour !! Node.js Bug Fixes and Improvements From f49ab78ebd33726914c12f6610da7a10d3f8162b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 5 Aug 2019 14:28:59 +0100 Subject: [PATCH 0262/2376] Docs: Add another example to Conditional Operators --- editions/tw5.com/tiddlers/filters/Conditional Operators.tid | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/Conditional Operators.tid b/editions/tw5.com/tiddlers/filters/Conditional Operators.tid index 989f81f15..7028e6dad 100644 --- a/editions/tw5.com/tiddlers/filters/Conditional Operators.tid +++ b/editions/tw5.com/tiddlers/filters/Conditional Operators.tid @@ -19,6 +19,10 @@ The conditional operators are: These operators can be combined. For example: -* <<.inline-operator-example "[[New Tiddler]is[missing]then[I am missing]else[No I am not missing]]">> +<<.inline-operator-example "[[New Tiddler]is[missing]then[I am missing]else[No I am not missing]]">> + +The [[else Operator]] can be used to apply a defaults for missing values. In this example, we take advantage of the fact that the [[get Operator]] returns an empty list if the field or tiddler does not exist: + +<<.inline-operator-example "[[HelloThere]get[custom-field]else[default-value]]">> <<list-links "[tag[Conditional Operators]]">> From 31e7dbf020ddbbc5a7b88cbfc9acdd3168fe72c5 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 6 Aug 2019 14:12:21 +0200 Subject: [PATCH 0263/2376] Add "preventScroll" option to tm-focus-selector message (#4157) * add "delayed" option to tm-focus-selector message this delays the focussing for the time of the animation duration if delayed="yes" or delayed="true" this is useful when navigating the story river up and down with keyboard shortcuts and the shortcuts focus the title input if a navigated tiddler is in edit mode -> navigation doesn't jump but stays smooth * Update rootwidget.js * Update WidgetMessage_ tm-focus-selector.tid * add preventScroll="true" tip --- core/modules/startup/rootwidget.js | 2 +- .../tiddlers/messages/WidgetMessage_ tm-focus-selector.tid | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/modules/startup/rootwidget.js b/core/modules/startup/rootwidget.js index bf96c6fbd..d02748b28 100644 --- a/core/modules/startup/rootwidget.js +++ b/core/modules/startup/rootwidget.js @@ -44,7 +44,7 @@ exports.startup = function() { console.log("Error in selector: ",selector) } if(element && element.focus) { - element.focus(); + element.focus(event.paramObject); } }); // Install the scroller diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid index dc41ad393..b3cb9011d 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid @@ -9,4 +9,6 @@ The `tm-focus-selector` message sets the focus to the DOM element identified by |!Name |!Description | |param |Selector identifying the DOM element to be focussed | +|paramObject |Optional hashmap of additional parameters passed to the `focus` command | +<<.tip """preventScroll="true" prevents the browser from scrolling to the focused element""">> From 6df7b617fb3cfc895d91ce954dae18bedd9848eb Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 6 Aug 2019 14:53:14 +0100 Subject: [PATCH 0264/2376] Docs tweaks --- editions/tw5.com/tiddlers/filters/match Operator.tid | 2 +- .../tiddlers/messages/WidgetMessage_ tm-focus-selector.tid | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/match Operator.tid b/editions/tw5.com/tiddlers/filters/match Operator.tid index 9228b618e..6e9997d3f 100644 --- a/editions/tw5.com/tiddlers/filters/match Operator.tid +++ b/editions/tw5.com/tiddlers/filters/match Operator.tid @@ -25,6 +25,6 @@ The <<.op match>> operator uses an extended syntax that permits multiple flags t The available flags are: * ''casesensitive'': (default), this flag forces a case-sensitive match, where upper and lower case letters are considered different -* "caseinsensitive". overrides the default so that upper and lower case letters are considered identical for matching purposes +* ''caseinsensitive'': overrides the default so that upper and lower case letters are considered identical for matching purposes <<.operator-examples "match">> diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid index b3cb9011d..1b33502ed 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-focus-selector.tid @@ -9,6 +9,6 @@ The `tm-focus-selector` message sets the focus to the DOM element identified by |!Name |!Description | |param |Selector identifying the DOM element to be focussed | -|paramObject |Optional hashmap of additional parameters passed to the `focus` command | +|paramObject |Optional hashmap of additional parameters to be passed to the [[focus()|https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus]] method | -<<.tip """preventScroll="true" prevents the browser from scrolling to the focused element""">> +<<.tip """Use preventScroll="true" to prevent the browser from scrolling to the focused element""">> From 41d30bebc8d14ffa0ed6af2282bff2c6eed7dd2c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 6 Aug 2019 14:53:23 +0100 Subject: [PATCH 0265/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.20.tid | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 5f4a1d639..15d940735 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -21,6 +21,9 @@ There is now finer control over TiddlyWiki's default behaviour of removing dupli Keyboard shortcut handling has been significantly improved: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf51ae001993565fd43443d053ea83e209b67c6f]] a keyboard shortcut (default <kbd>ctrl</kbd>-<kbd>shift</kbd>-<kbd>F</kbd>) for focussing the sidebar search field +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ef7210adf4ecbec9838dcf898a5841f3ffa31567]] a keyboard shortcut (default <kbd>alt</kbd>-<kbd>shift</kbd>-<kbd>S</kbd>) for toggling the visibility of the sidebar +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/2bcb36f15147e3470688bd90276fa038c2991976]] a keyboard shortcut (default <kbd>ctrl</kbd>-<kbd>shift</kbd>-<kbd>A</kbd>) for opening the advanced search tiddler + !! Plugin Improvements @@ -28,9 +31,11 @@ New and improved plugins: * New [[BrowserStorage Plugin]] for saving tiddlers in browser local storage * New [[Innerwiki Plugin]] for rendering TiddlyWiki screenshots +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4133]] [[KaTeX Plugin]] to ~KaTeX v0.10.2 * Several improvements to the [[CodeMirror Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent * Several improvements to the [[Dynaview Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage * Several improvements to the [[Amazon Web Services Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/fffd0ee9e17d6b6a561648a42f0f200d4bb04046]] support for specifying credentials +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3131]] an editor toolbar button for the [[KaTeX Plugin]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3898]] support for language aliases with the [[Highlight Plugin]] !! Translation Improvements @@ -40,6 +45,7 @@ New and improved translations: * Catalan * Chinese Simplified and Chinese Traditional * French +* German * US English !! Performance Improvements @@ -48,6 +54,7 @@ New and improved translations: * [[Optimised|https://github.com/Jermolene/TiddlyWiki5/commit/fddc5d4ee627232441278284ed6bee2f50fe8b26]] the "Classic" storyview to perform much faster when the animation duration is set to zero (approximtely 50% speed improvement was observed in tests opening a storyview with 8,000 entries) * [[Optimised|https://github.com/Jermolene/TiddlyWiki5/commit/7869546fef7b2ea5fd6fd72feacd565a7f177fb6]] the RevealWidget to avoid using the relatively slow `localeCompare()` method to compare strings * [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e8d1fbba6c109ccbeaedc1b34e47677c0ada7529]] [[Performance Instrumentation]] to show the timings for individual filters +* [[Optimised|https://github.com/Jermolene/TiddlyWiki5/pull/4102]] rendering and refreshing child widgets !! Usability Improvements @@ -57,15 +64,23 @@ New and improved translations: * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3654]] prompt for references when renaming a tiddler * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0e6855eba8945e023cc5ef19809cfb6d6025627b]] a new filter preset for advanced search for "tiddlers modified this session" * [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/3832]] the [[palette manager|$:/PaletteManager]] with the ability to delete entries, and directly edit indirect entries +* Added a number of animations (some of were already present but had been broken over the years) for changes in: +** [[Tags in the view template|https://github.com/Jermolene/TiddlyWiki5/pull/4142]] +** [[Page controls|https://github.com/Jermolene/TiddlyWiki5/pull/4145]] +** [[Top left and top right bar|https://github.com/Jermolene/TiddlyWiki5/pull/4146]] +** [[Tabs|https://github.com/Jermolene/TiddlyWiki5/pull/4149]] +** [[Fields in the edit template|https://github.com/Jermolene/TiddlyWiki5/pull/4148]] !! Hackability Improvements * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4051]] support for [[configurable view and edit templates|Hidden Setting: ViewTemplate and EditTemplate]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a saver for [[Saving to GitHub]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a saver for [[Saving to GitHub]] and [[Saving to GitLab]] * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/37ea659bf011b1d4a152f54171399d94f5bba3ef]] the [[dumpvariables Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/754c1251a9bdf45e8f64079a4bbdaed2d05be2b7]] new [[variables Operator]] and [[getvariable Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ed67f4a88b29c5c81d4de31203dbf23d66955fb7]] new [[WidgetMessage: tm-focus-selector]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3546]] new [[escapecss Operator]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5faae2547d68d386b2aa33255dcceed3539aa57e]] new [[match Operator]] for text comparison +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/17711657b6028a177c8aef97f7a0a1c084d65436]] new [[Conditional Operators]] [[then Operator]] and [[else Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3880]] new [[unusedtitle Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/36e76429b1a1d4638374d513430393db5693b932]] new `[is[variable]]` option to the [[is Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/90684f9f52809ff5df39629d3b161d7ff23002f4]] new `[is[blank]]` option to the [[is Operator]] @@ -78,7 +93,10 @@ New and improved translations: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c036c228269fc30d0df770a7c7713fd9af829df7]] $:/info/browser/language to the InfoMechanism * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f047e7cbf50edcf4775b50bdebc3f704970b8cde]] an example of using StartupActions to set the default language * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/edd3156430dd94b0ced630a1b70f2e2ef0ff6c36]] importing of JSON files to verify whether they are valid tiddler files, and import them as plain JSON if not -* [[Enhanced|https://github.com/Jermolene/TiddlyWiki5/issues/3974]] the LinkWidget to use the title of the target tiddler as a default if it has no content +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/issues/3974]] the LinkWidget to use the title of the target tiddler as a default if it has no content +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/2a4c60b23dc1436af6206fad5a56742550eac1a3]] [[WidgetMessage: tm-open-window]] to allow a window title to be specified +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8e7c0907f8cce4708a02486fc93dcea1ab115196]] ''checkActions'' attribute to the CheckboxWidget +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3afaa9de9aaae7654c1d03ddc22ee97724cbb159]] support for searches anchored to the start of a field !! Bug Fixes @@ -92,6 +110,9 @@ New and improved translations: * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3819]] [[CodeMirror Plugin]] to use ''tiddler-editor-border'' colour * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8012a3508f209fbbe68484e30ed65832cf5146b9]] problem using the TiddlySpot saver with cookies disabled * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3611]] framed text editor to use correct background colour +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/f5b25994322e58de84cae70ab67a68b1413db27f]] problem with the class `tc-sidebar-lists` being used on two different areas of the sidebar, making it impossible to distinguish them in CSS selectors +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/7f78065992baf290ae221fb12c63e52e0f8da403]] problem with unnecessary "list" field created when renaming tiddlers +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/394725f00cd8f38089d2840aa026d72c88627bff]] crash with EditBitmapWidget and missing tiddlers !! Node.js Bug Fixes and Improvements From b8ac2d7a064b989dec82585f2814f8326b28daf7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 6 Aug 2019 14:57:46 +0100 Subject: [PATCH 0266/2376] Release note: update contributor list --- editions/prerelease/tiddlers/Release 5.1.20.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 15d940735..bd6421dae 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -143,6 +143,7 @@ New and improved translations: * [[@diego898|https://github.com/diego898]] * [[@dnebauer|https://github.com/dnebauer]] * [[@inmysocks|https://github.com/inmysocks]] +* [[@flibbles|https://github.com/flibbles]] * [[@jdjdjdjdjdjd|https://github.com/jdjdjdjdjdjd]] * [[@JesseWeinstein|https://github.com/JesseWeinstein]] * [[@joshuafontany|https://github.com/joshuafontany]] @@ -150,6 +151,7 @@ New and improved translations: * [[@kyrias|https://github.com/kyrias]] * [[@MarxSal|https://github.com/MarxSal]] * [[@MidnightLightning|https://github.com/MidnightLightning]] +* [[@pmario|https://github.com/pmario]] * [[@rmunn|https://github.com/rmunn]] * [[@talha131|https://github.com/talha131]] * [[@telmiger|https://github.com/telmiger]] From 9df64c1ecfd58993560989043698d86380e11d58 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 6 Aug 2019 16:02:43 +0100 Subject: [PATCH 0267/2376] Update Catalan translation --- .../prerelease/tiddlers/Release 5.1.20.tid | 1 + languages/ca-ES/Buttons.multids | 114 ++++++++++++++++++ languages/ca-ES/ControlPanel.multids | 107 ++++++++++++++-- languages/ca-ES/Docs/ModuleTypes.multids | 9 +- languages/ca-ES/Docs/PaletteColours.multids | 8 +- languages/ca-ES/EditTemplate.multids | 9 ++ languages/ca-ES/Fields.multids | 4 +- languages/ca-ES/Filters.multids | 2 + languages/ca-ES/Help/deletetiddlers.tid | 8 ++ languages/ca-ES/Help/fetch.tid | 37 ++++++ languages/ca-ES/Help/import.tid | 24 ++++ languages/ca-ES/Help/init.tid | 4 +- languages/ca-ES/Help/listen.tid | 33 +++++ languages/ca-ES/Help/load.tid | 2 +- languages/ca-ES/Help/render.tid | 36 ++++++ languages/ca-ES/Help/save.tid | 24 ++++ languages/ca-ES/Help/savetiddler.tid | 2 +- languages/ca-ES/Help/savetiddlers.tid | 10 +- languages/ca-ES/Help/savewikifolder.tid | 19 +++ languages/ca-ES/Help/server.tid | 16 +-- languages/ca-ES/Help/setfield.tid | 10 +- languages/ca-ES/Help/unpackplugin.tid | 4 +- languages/ca-ES/Import.multids | 10 +- languages/ca-ES/Misc.multids | 9 +- languages/ca-ES/Search.multids | 4 + languages/ca-ES/SideBar.multids | 1 + languages/ca-ES/Snippets/ListByTag.tid | 5 + languages/ca-ES/Snippets/MacroDefinition.tid | 7 ++ languages/ca-ES/Snippets/Table4x3.tid | 8 ++ languages/ca-ES/Snippets/TableOfContents.tid | 9 ++ languages/ca-ES/ThemeTweaks.multids | 41 +++++++ 31 files changed, 536 insertions(+), 41 deletions(-) create mode 100644 languages/ca-ES/Help/deletetiddlers.tid create mode 100644 languages/ca-ES/Help/fetch.tid create mode 100644 languages/ca-ES/Help/import.tid create mode 100644 languages/ca-ES/Help/listen.tid create mode 100644 languages/ca-ES/Help/render.tid create mode 100644 languages/ca-ES/Help/save.tid create mode 100644 languages/ca-ES/Help/savewikifolder.tid create mode 100644 languages/ca-ES/Snippets/ListByTag.tid create mode 100644 languages/ca-ES/Snippets/MacroDefinition.tid create mode 100644 languages/ca-ES/Snippets/Table4x3.tid create mode 100644 languages/ca-ES/Snippets/TableOfContents.tid create mode 100644 languages/ca-ES/ThemeTweaks.multids diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index bd6421dae..82eae327f 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -151,6 +151,7 @@ New and improved translations: * [[@kyrias|https://github.com/kyrias]] * [[@MarxSal|https://github.com/MarxSal]] * [[@MidnightLightning|https://github.com/MidnightLightning]] +* [[@pacoriviere|https://github.com/pacoriviere]] * [[@pmario|https://github.com/pmario]] * [[@rmunn|https://github.com/rmunn]] * [[@talha131|https://github.com/talha131]] diff --git a/languages/ca-ES/Buttons.multids b/languages/ca-ES/Buttons.multids index b7565696f..9ef77b819 100644 --- a/languages/ca-ES/Buttons.multids +++ b/languages/ca-ES/Buttons.multids @@ -2,8 +2,12 @@ title: $:/language/Buttons/ AdvancedSearch/Caption: cerca avançada AdvancedSearch/Hint: Cerca avançada +Bold/Caption: negreta +Bold/Hint: Poseu en negreta la selecció Cancel/Caption: anul·la Cancel/Hint: Descarta els canvis d'aquest tiddler +Clear/Caption: esborra +Clear/Hint: Esborra la imatge Clone/Caption: clona Clone/Hint: Clona aquest tiddler Close/Caption: tanca @@ -14,24 +18,60 @@ CloseOthers/Caption: tanca els altres CloseOthers/Hint: Tanca els altres tiddlers ControlPanel/Caption: tauler de control ControlPanel/Hint: Obre el tauler de control +CopyToClipboard/Caption: copia al portapapers +CopyToClipboard/Hint: Copia el text al portapapers Delete/Caption: suprimeix Delete/Hint: Suprimeix aquest tiddler Edit/Caption: edita Edit/Hint: Edita aquest tiddler +EditorHeight/Caption: alçada de l'editor +EditorHeight/Caption/Auto: Ajusta l'alçada al contingut +EditorHeight/Caption/Fixed: Alçada fixe: +EditorHeight/Hint: Trieu l'alçada de l'editor de text Encryption/Caption: encriptació Encryption/ClearPassword/Caption: neteja la contrasenya Encryption/ClearPassword/Hint: Suprimeix la contrasenya per desar aquest wiki sense encriptació Encryption/Hint: Estableix o suprimeix la contrasenya per desar aquest wiki Encryption/SetPassword/Caption: tria la contrasenya Encryption/SetPassword/Hint: Estableix una contrasenya per desar aquest wiki amb encriptació +Excise/Caption: extirpa +Excise/Caption/Excise: Executa l'extirpació +Excise/Caption/MacroName: Nom de la macro: +Excise/Caption/NewTitle: Títol del nou tiddler: +Excise/Caption/Replace: Reemplaça el text extirpat amb: +Excise/Caption/Replace/Link: enllaç +Excise/Caption/Replace/Transclusion: transclusió +Excise/Caption/Tag: Etiqueta el nou tiddler amb el títol d'aquest tiddler +Excise/Caption/TiddlerExists: Atenció: aquest tiddler ja existeix +Excise/Hint: Extirpa el text seleccionat en un nou tiddler ExportPage/Caption: exporta-ho tot ExportPage/Hint: Exporta tots els tiddlers ExportTiddler/Caption: exporta el tiddler ExportTiddler/Hint: Exporta el tiddler ExportTiddlers/Caption: exporta tiddlers ExportTiddlers/Hint: Exporta els tiddlers +Fold/Caption: expandeix el tiddler +Fold/FoldBar/Caption: barra d'expansió +Fold/FoldBar/Hint: Barres opcionals per a contraure i expandir els tiddlers +Fold/Hint: Contrau el cos d'aquest tiddler +FoldAll/Caption: contrau tots els tiddlers +FoldAll/Hint: Contrau el cos de tots els tiddlers oberts +FoldOthers/Caption: contrau els altres tiddlers +FoldOthers/Hint: Contrau el cos d'altres tiddlers oberts FullScreen/Caption: pantalla sencera FullScreen/Hint: Mostra o deixa de mostrar la finestra en pantalla sencera +Heading1/Caption: capçalera 1 +Heading1/Hint: Aplica el format de capçalera de nivell 1 a les línies que contenen la selecció +Heading2/Caption: capçalera 2 +Heading2/Hint: Aplica el format de capçalera de nivell 2 a les línies que contenen la selecció +Heading3/Caption: capçalera 3 +Heading3/Hint: Aplica el format de capçalera de nivell 3 a les línies que contenen la selecció +Heading4/Caption: capçalera 4 +Heading4/Hint: Aplica el format de capçalera de nivell 4 a les línies que contenen la selecció +Heading5/Caption: capçalera 5 +Heading5/Hint: Aplica el format de capçalera de nivell 5 a les línies que contenen la selecció +Heading6/Caption: capçalera 6 +Heading6/Hint: Aplica el format de capçalera de nivell 6 a les línies que contenen la selecció Help/Caption: ajuda Help/Hint: Mostra el tauler d'ajuda HideSideBar/Caption: amaga la barra lateral @@ -42,33 +82,107 @@ Import/Caption: importa Import/Hint: Importa fitxers Info/Caption: informació Info/Hint: Mostra la informació d'aquest tiddler +Italic/Caption: cursiva +Italic/Hint: Aplica el format de cursiva a la selecció Language/Caption: idioma Language/Hint: Trieu l'idioma de la interfície +LineWidth/Caption: amplada de la línia +LineWidth/Hint: Trieu l'amplada de la línia per pintar +Link/Caption: enllaç +Link/Hint: Genera un enllaç de tipus wikitext +Linkify/Caption: wikienllaç +Linkify/Hint: Posa la selecció dins de claudàtors +ListBullet/Caption: llista de pics +ListBullet/Hint: Aplica el format de llista de pics a la selecció +ListNumber/Caption: llista numerada +ListNumber/Hint: Aplica el format de llista numerada a la selecció +Manager/Caption: gestor de tiddlers +Manager/Hint: Obre el gestor de tiddlers +MonoBlock/Caption: bloc monoespaiat +MonoBlock/Hint: Aplica el format de bloc monoespaiat a la selecció +MonoLine/Caption: monoespaiat +MonoLine/Hint: Aplica el format monoespaiat a la selecció More/Caption: més More/Hint: Més accions NewHere/Caption: nou aquí NewHere/Hint: Obre un nou tiddler etiquetat amb aquest +NewImage/Caption: nova imatge +NewImage/Hint: Genera un nou tiddler d'imatge NewJournal/Caption: nou diari NewJournal/Hint: Nou tiddler diari NewJournalHere/Caption: nou diari aquí NewJournalHere/Hint: Obre un nou tiddler diari etiquetat amb aquest +NewMarkdown/Caption: nou tiddler de Markdown +NewMarkdown/Hint: Genera un nou tiddler de Markdown NewTiddler/Caption: nou tiddler NewTiddler/Hint: Obre un nou tiddler +Opacity/Caption: opacitat +Opacity/Hint: Trieu l'opacitat de la tinta +OpenWindow/Caption: obre en una nova finestra +OpenWindow/Hint: Obre el tiddler en una nova finestra +Paint/Caption: color de la tinta +Paint/Hint: Trieu el color de la tinta +Palette/Caption: paleta +Palette/Hint: Trieu el color de la paleta Permalink/Caption: enllaç permanent Permalink/Hint: Fés que la barra d'adreces del navegador mostri un enllaç directe cap aquest tiddler Permaview/Caption: vista permanent Permaview/Hint: Fés que la barra d'adreces del navegador mostri un enllaç directe cap a tots els tiddlers d'aquesta història +Picture/Caption: imatge +Picture/Hint: Inserta una imatge +Preview/Caption: previsualització +Preview/Hint: Mostra el quadre de previsualització +PreviewType/Caption: tipus de previsualització +PreviewType/Hint: Trieu el tipus de previsualització +Print/Caption: imprimeix la pàgina +Print/Hint: Imprimeix la pàgina actual +Quote/Caption: cita +Quote/Hint: Aplica el format de cita a la selecció Refresh/Caption: actualitza Refresh/Hint: Actualitza tot el wiki +RotateLeft/Caption: gira a l'esquerra +RotateLeft/Hint: Gira la imatge 90 graus a l'esquerra Save/Caption: D'acord Save/Hint: Confirma els canvis d'aquest tiddler SaveWiki/Caption: desa els canvis SaveWiki/Hint: Desa els canvis ShowSideBar/Caption: mostra la barra lateral ShowSideBar/Hint: Mostra la barra lateral +SidebarSearch/Hint: Trieu el camp de cerca de la barra lateral +Size/Caption: mida de la imatge +Size/Caption/Height: Alçada: +Size/Caption/Resize: Mida de la imatge +Size/Caption/Width: Amplada: +Size/Hint: Trieu la mida de la imatge +Stamp/Caption: marca +Stamp/Caption/New: Afegiu la vostra pròpia +Stamp/Hint: Inserta un fragment de text +Stamp/New/Text: Fragment de text. (Recordeu afegir un títol descriptiu al camp de la llegenda). +Stamp/New/Title: Es mostra el nom al menú StoryView/Caption: visualització de la cronologia StoryView/Hint: Trieu la visualització de la cronologia +Strikethrough/Caption: ratllat +Strikethrough/Hint: Aplica el format de ratllat a la selecció +Subscript/Caption: subíndex +Subscript/Hint: Aplica el format de subíndex a la selecció +Superscript/Caption: superíndex +Superscript/Hint: Aplica el format de superíndex a la selecció TagManager/Caption: gestor d'etiquetes TagManager/Hint: Obre el gestor d'etiquetes Theme/Caption: tema Theme/Hint: Tria el tema de l'aparença +Timestamp/Caption: marques del temps +Timestamp/Hint: Indiqueu si les modificacions han d'actualitzar les marques del temps +Timestamp/Off/Caption: sense marques del temps +Timestamp/Off/Hint: Les modificacions no actualitzen les marques del temps +Timestamp/On/Caption: amb marques del temps +Timestamp/On/Hint: Les modificacions actualitzen les marques del temps +ToggleSidebar/Hint: Commuta la visibilitat de la barra lateral +Transcludify/Caption: transclusió +Transcludify/Hint: Posa la selecció entre claus +Underline/Caption: subratllat +Underline/Hint: Aplica el format de subratllat a la selecció +Unfold/Caption: expandeix el tiddler +Unfold/Hint: Expandeix el cos d'aquest tiddler +UnfoldAll/Caption: expandeix tots els tiddlers +UnfoldAll/Hint: Expandeix el cos de tots els tiddlers oberts diff --git a/languages/ca-ES/ControlPanel.multids b/languages/ca-ES/ControlPanel.multids index 2f234b4bc..f02196f3a 100644 --- a/languages/ca-ES/ControlPanel.multids +++ b/languages/ca-ES/ControlPanel.multids @@ -6,12 +6,14 @@ Appearance/Caption: Aparença Appearance/Hint: Formes de personalitzar l'aparença del vostre TiddlyWiki. Basics/AnimDuration/Prompt: Duració de l'animació: Basics/Caption: Bàsic -Basics/DefaultTiddlers/BottomHint: Useu [[corxets dobles]] per als títols amb espais. O podeu triar <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">mantenir l'ordre de la cronologia</$button> +Basics/DefaultTiddlers/BottomHint: Useu [[claudàtors dobles]] per als títols amb espais. O podeu triar <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">mantenir l'ordre de la cronologia</$button> Basics/DefaultTiddlers/Prompt: Tiddlers per omissió: Basics/DefaultTiddlers/TopHint: Trieu quins tiddlers s'han de mostrar a l'inici: Basics/Language/Prompt: Hola! Idioma actual: -Basics/NewJournal/Tags/Prompt: Etiquetes per als nous tiddlers diaris -Basics/NewJournal/Title/Prompt: Títol dels nous tiddlers diaris +Basics/NewJournal/Tags/Prompt: Etiquetes per als nous tiddlers del diari +Basics/NewJournal/Text/Prompt: Text dels nous tiddlers del diari +Basics/NewJournal/Title/Prompt: Títol dels nous tiddlers del diari +Basics/NewTiddler/Title/Prompt: Títol dels nous tiddlers Basics/OverriddenShadowTiddlers/Prompt: Número de tiddlers ombra sobreescrits: Basics/ShadowTiddlers/Prompt: Número de tiddlers ombra: Basics/Subtitle/Prompt: Subtítol: @@ -27,38 +29,81 @@ EditorTypes/Hint: Aquests tiddlers determinen quin editor s'utilitza per a edita EditorTypes/Type/Caption: Tipus Info/Caption: Informació Info/Hint: Informació sobre aquest TiddlyWiki +KeyboardShortcuts/Add/Caption: afegeix una drecera +KeyboardShortcuts/Add/Prompt: Escriviu aquí la drecera +KeyboardShortcuts/Caption: Dreceres del teclat +KeyboardShortcuts/Hint: Gestioneu l'assignació de les dreceres del teclat +KeyboardShortcuts/NoShortcuts/Caption: No hi ha cap drecera del teclat assignada +KeyboardShortcuts/Platform/All: Totes les plataformes +KeyboardShortcuts/Platform/Linux: Només per a la plataforma Linux +KeyboardShortcuts/Platform/Mac: Només per a la plataforma Macintosh +KeyboardShortcuts/Platform/NonLinux: Només per a les plataformes No Linux +KeyboardShortcuts/Platform/NonMac: Només per a les plataformes No Macintosh +KeyboardShortcuts/Platform/NonWindows: Només per a les plataformes No Windows +KeyboardShortcuts/Platform/Windows: Només per a la plataforma Windows +KeyboardShortcuts/Remove/Hint: suprimeix la drecera del teclat LoadedModules/Caption: Mòduls carregats -LoadedModules/Hint: Aquests són els mòduls tiddlers enllaçats a als seus tiddlers font. Els mòduls indicats en cursiva no disposen de tiddler font, amb freqüència per que s'han configurat a l'arrencada. +LoadedModules/Hint: Aquests són els mòduls tiddlers enllaçats als seus tiddlers font. Els mòduls indicats en cursiva no disposen de tiddler font, sovint per que s'han configurat a l'arrencada. Palette/Caption: Paleta Palette/Editor/Clone/Caption: clona paquets de connectors Palette/Editor/Clone/Prompt: Es recomana que cloneu aquesta paleta ombra abans d'editar-la +Palette/Editor/Delete/Hint: suprimeix aquesta entrada de la paleta actual +Palette/Editor/Names/External/Show: Mostra el noms dels colors que no formen part de la paleta actual Palette/Editor/Prompt: S'està editant Palette/Editor/Prompt/Modified: Aquesta paleta ombra ha estat modificada Palette/Editor/Reset/Caption: reinicia Palette/HideEditor/Caption: amaga l'editor Palette/Prompt: Paleta actual: Palette/ShowEditor/Caption: mostra l'editor +Parsing/Block/Caption: Regles d'anàlisi de blocs +Parsing/Caption: Anàlisi +Parsing/Hint: Aquí podeu activar/desactivar globalment les regles de l’analitzador de wiki. Perquè els canvis tinguin efecte, deseu i torneu a carregar el vostre wiki. La desactivació de certes regles d'anàlisi pot impedir que <$text text="TiddlyWiki"/> funcioni correctament. Disposeu del [[mode segur | https: //tiddlywiki.com/#SafeMode]] per restaurar el funcionament normal. +Parsing/Inline/Caption: Regles d'anàlisi en línia +Parsing/Pragma/Caption: Regles d'anàlisi Pragma Plugins/Add/Caption: Obtingueu més connectors Plugins/Add/Hint: Instal·leu connectors de la biblioteca oficial +Plugins/AlreadyInstalled/Hint: Aquest connector ja té instal·lada la versió <$text text=<<installedVersion>>/> Plugins/Caption: Connectors +Plugins/ClosePluginLibrary: tanca la biblioteca de connectors Plugins/Disable/Caption: desactiva Plugins/Disable/Hint: Desactiva aquest connector quan la pàgina es torni a carregar Plugins/Disabled/Status: (desactivat) Plugins/Empty/Hint: Cap Plugins/Enable/Caption: activa Plugins/Enable/Hint: Activa aquest connector quan la pàgina es torni a carregar +Plugins/Install/Caption: instal·la Plugins/Installed/Hint: Connectors que ara mateix estàn carregats: Plugins/Languages/Caption: Idiomes Plugins/Languages/Hint: Connectors del paquet de l'idioma +Plugins/NoInfoFound/Hint: No s'ha trobat ''"<$text text=<<currentTab>>/>"'' +Plugins/NotInstalled/Hint: Aquest connector no està instal·lat +Plugins/OpenPluginLibrary: obre la biblioteca de connectors Plugins/Plugins/Caption: Connectors Plugins/Plugins/Hint: Connectors +Plugins/Reinstall/Caption: torna a instal·lar Plugins/Themes/Caption: Temes Plugins/Themes/Hint: Connectors del tema Saving/Caption: Desa +Saving/DownloadSaver/AutoSave/Description: Permet que el gestor de baixades desi automàticament +Saving/DownloadSaver/AutoSave/Hint: Habiliteu el desat automàtic pel gestor de baixades +Saving/DownloadSaver/Caption: Gestor de baixades +Saving/DownloadSaver/Hint: Aquesta configuració s’aplica al gestor de baixades compatible amb HTML5 +Saving/General/Hint: Aquests valors s'apliquen a tots els gestors de baixades carregats +Saving/GitHub/Branch: Branca destí a on desar (per omissió és `master`) +Saving/GitHub/Caption: Gestor de baixades de ~GitHub +Saving/GitHub/Description: Aquests valors només s’utilitzen quan es desa a ~ GitHub +Saving/GitHub/Filename: Nom del fitxer destinació (per exemple, `index.html`) +Saving/GitHub/Password: Contrasenya, clau OAUTH o clau d'accés personal +Saving/GitHub/Path: Ruta al fitxer destinació (per exemple, `/wiki/`) +Saving/GitHub/Repo: Repositori destí (per exemple, `Jermolene/TiddlyWiki5`) +Saving/GitHub/ServerURL: URL del servidor (per omissió és `https://api.github.com`) +Saving/GitHub/UserName: Nom d'usuari Saving/Heading: S'està desant +Saving/Hint: Configuració que s’utilitza per desar tot el TiddlyWiki com a un únic fitxer amb un mòdul de desar Saving/TiddlySpot/Advanced/Heading: Paràmetres avançats Saving/TiddlySpot/BackupDir: Carpeta de les còpies de seguretat Saving/TiddlySpot/Backups: Còpies de seguretat +Saving/TiddlySpot/Caption: Gestor de baixades de ~TiddlySpot Saving/TiddlySpot/Description: Aquests paràmetres només es fan servir quan es desa a http://tiddlyspot.com o a un servidor remot compatible Saving/TiddlySpot/Filename: Nom del fitxer que es pujarà Saving/TiddlySpot/Hint: //La URL per omisió del servidor és `http://<wikiname>.tiddlyspot.com/store.cgi` i es pot canviar per l'adreça d'un servidor personalitzat com ara `http://exemple.com/botiga.php`.// @@ -66,34 +111,78 @@ Saving/TiddlySpot/Password: Contrasenya Saving/TiddlySpot/ServerURL: URL del servidor Saving/TiddlySpot/UploadDir: Carpeta a la que es pujarà el fitxer Saving/TiddlySpot/UserName: Usuari -Settings/AutoSave/Caption: DesaAutomàticament +Settings/AutoSave/Caption: DesatAutomàtic Settings/AutoSave/Disabled/Description: No desis els canvis de forma automàtica Settings/AutoSave/Enabled/Description: Desa els canvis de forma automàtica Settings/AutoSave/Hint: Desa els canvis de forma automàtica mentre s'està editant +Settings/CamelCase/Caption: Enllaços wiki tipus CamelCase +Settings/CamelCase/Description: Habilita l'enllaç automàtic de ~CamelCase +Settings/CamelCase/Hint: Podeu desactivar l’enllaç automàtic de les frases ~CamelCase globalment. Cal que es torni a carregar per tenir efecte Settings/Caption: Paràmetres -Settings/DefaultSidebarTab/Caption: Pestanya de la barra lateral es mostra per omisió -Settings/DefaultSidebarTab/Hint: Indica quina pestanya de la barra lateral es mostra per omisió +Settings/DefaultMoreSidebarTab/Caption: Pestanya Més de la barra lateral per omissió +Settings/DefaultMoreSidebarTab/Hint: Indiqueu quina pestanya Més de la barra lateral es mostra per omissió +Settings/DefaultSidebarTab/Caption: Pestanya de la barra lateral que es mostra per omissió +Settings/DefaultSidebarTab/Hint: Indica quina pestanya de la barra lateral es mostra per omissió +Settings/EditorToolbar/Caption: Barra d'eines de l'editor +Settings/EditorToolbar/Description: Mostra la barra d'eines de l'editor +Settings/EditorToolbar/Hint: Activa o desactiva la barra d'eines de l'editor: Settings/Hint: Aquests paràmetres us permeten personalitzar el comportament del TiddlyWiki. +Settings/InfoPanelMode/Caption: Mode del tauler d'informació del Tiddler +Settings/InfoPanelMode/Hint: Controla quan es tanca el tauler d'informació del tiddler: +Settings/InfoPanelMode/Popup/Description: El tauler d’informació del Tiddler es tanca automàticament +Settings/InfoPanelMode/Sticky/Description: El tauler d’informació del Tiddler roman obert fins que es tanqui explícitament +Settings/LinkToBehaviour/Caption: Comportament d'obertura del tiddler +Settings/LinkToBehaviour/InsideRiver/Hint: Navegació des de //dins de// la cronologia +Settings/LinkToBehaviour/OpenAbove: Obre per sobre del tiddler actual +Settings/LinkToBehaviour/OpenAtBottom: Obriu a la part inferior de la cronologia +Settings/LinkToBehaviour/OpenAtTop: Obriu a la part superior de la cronologia +Settings/LinkToBehaviour/OpenBelow: Obre per sota del tiddler actual +Settings/LinkToBehaviour/OutsideRiver/Hint: Navegació des de //fora de//la cronologia +Settings/MissingLinks/Caption: Enllaços Wiki +Settings/MissingLinks/Description: Activa els enllaços als tiddlers que falten +Settings/MissingLinks/Hint: Escolliu si voleu enllaçar els tiddlers que encara no existeixen Settings/NavigationAddressBar/Caption: Barra d'adreces de navegació Settings/NavigationAddressBar/Hint: Comportament de la barra d'adreces en navegar cap a un tiddler: Settings/NavigationAddressBar/No/Description: No actualitzis la barra d'adreces Settings/NavigationAddressBar/Permalink/Description: Inclou el tiddler destí Settings/NavigationAddressBar/Permaview/Description: Inclou el tiddler destí i la seqùència actual -Settings/NavigationHistory/Caption: Història de navegació -Settings/NavigationHistory/Hint: Actualitza la història del navegador en navegar cap a un tiddler: +Settings/NavigationHistory/Caption: Històrial de navegació +Settings/NavigationHistory/Hint: Actualitza l'històrial del navegador en navegar cap a un tiddler: Settings/NavigationHistory/No/Description: No actualitzis la cronologia Settings/NavigationHistory/Yes/Description: Actualitza la cronologia +Settings/NavigationPermalinkviewMode/Caption: Mode enllaç permanent/vista permanent +Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Copieu l’URL de l'enllaç permanent/vista permanent al portapapers +Settings/NavigationPermalinkviewMode/Hint: Trieu com es gestiona l'enllaç permanent/vista permanent +Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Actualitzeu la barra d’adreça amb l’URL de l'enllaç permanent/vista permanent +Settings/PerformanceInstrumentation/Caption: Instrumentació del rendiment +Settings/PerformanceInstrumentation/Description: Habilita la instrumentació del rendiment +Settings/PerformanceInstrumentation/Hint: Mostra estadístiques de rendiment a la consola del desenvolupador del navegador. Cal tornar-ho a carregar per que tingui efecte +Settings/TitleLinks/Caption: Títols dels Tiddlers +Settings/TitleLinks/Hint: Mostra opcionalment els títols de tiddler com a enllaços +Settings/TitleLinks/No/Description: No mostris els títols dels tiddlers com a enllaços +Settings/TitleLinks/Yes/Description: Mostra els títols dels tiddlers com a enllaços Settings/ToolbarButtons/Caption: Botons de la barra d'eines Settings/ToolbarButtons/Hint: Aparença del botó de la barra d'eines per omissió: Settings/ToolbarButtons/Icons/Description: Inclou la icona Settings/ToolbarButtons/Text/Description: Inclou el text +Settings/ToolbarButtonStyle/Caption: Estil del botó de la barra d’eines +Settings/ToolbarButtonStyle/Hint: Trieu l'estil per als botons de la barra d'eines: +Settings/ToolbarButtonStyle/Styles/Borderless: Sense vora +Settings/ToolbarButtonStyle/Styles/Boxed: En caixa +Settings/ToolbarButtonStyle/Styles/Rounded: Arrodonit StoryView/Caption: Vista de la cronologia StoryView/Prompt: Vista actual: +Stylesheets/Caption: Fulls d'estil +Stylesheets/Expand/Caption: Expandeix-ho tot +Stylesheets/Hint: Aquest és el CSS generat amb el full d'estils actual etiquetat amb <<tag "$:/tags/Stylesheet">> +Stylesheets/Restore/Caption: Restaura Theme/Caption: Tema Theme/Prompt: Tema actual: TiddlerFields/Caption: Camps del tiddler TiddlerFields/Hint: Aquest és el conjunt complet de CampsDelsTiddlers utilitzats en aquest wiki (inclòs els tiddlers del sistema però sense incloure els tiddlers ombra). Toolbars/Caption: Barres d'eines +Toolbars/EditorToolbar/Caption: Barra d’eines de l’editor +Toolbars/EditorToolbar/Hint: Trieu quins botons es mostren a la barra d’eines de l’editor. Tingueu en compte que alguns botons només apareixeran en editar els tiddlers d’un determinat tipus. Podeu arrossegar i deixar els botons per canviar-ne l'ordre Toolbars/EditToolbar/Caption: Edita la barra d'eines Toolbars/EditToolbar/Hint: Trieu quins botons es mostren als tiddlers en mode edició Toolbars/Hint: Trieu els botons de la barra d'eines que es mostren diff --git a/languages/ca-ES/Docs/ModuleTypes.multids b/languages/ca-ES/Docs/ModuleTypes.multids index dde06516b..80e66c778 100644 --- a/languages/ca-ES/Docs/ModuleTypes.multids +++ b/languages/ca-ES/Docs/ModuleTypes.multids @@ -1,16 +1,23 @@ title: $:/language/Docs/ModuleTypes/ +allfilteroperator: Un suboperador per a l’operador de filtre '' all ''. animation: Animacions que es poden utilitzar amb el RevealWidget. +authenticator: Defineix com el servidor HTTP integrat autentica les sol·licituds. +bitmapeditoroperation: Una operació de la barra d'eines de l'editor de mapes de bits. command: Ordres que es poden executar a Node.js. config: Dades per a insertar a `$tw.config`. filteroperator: Mètodes individuals de l'operador filtre. global: Dades globals per a insertar a `$tw`. +info: Publica la informació del sistema mitjançant el pseudo-connector [[$:/temp/info-plugin]]. isfilteroperator: Operands pel operador filtre ''is''. +library: Tipus de mòdul genèric per a mòduls JavaScript de propòsit general. macro: Definicions de macros JavaScript. parser: Analitzadors sintàctics per a diferents tipus de continguts. +route: Defineix com el servidor HTTP integrat gestiona els patrons d’URL individuals. saver: Gestionen diferents mètodes per a desar fitxers des del navegador. -startup: Funcions d'inici +startup: Funcions de l'inici storyview: Les vistes de la cronologia personalitzen l'animació i el comportament dels widgets llista. +texteditoroperation: Una operació de la barra d'eines de l'editor de text. tiddlerdeserializer: Converteix diferents tipus de contingut a tiddlers. tiddlerfield: Defineix el comportament d'un camp individual d'un tiddler. tiddlermethod: Afegeix mètodes al prototip `$tw.Tiddler`. diff --git a/languages/ca-ES/Docs/PaletteColours.multids b/languages/ca-ES/Docs/PaletteColours.multids index b21f96596..0247f21d2 100644 --- a/languages/ca-ES/Docs/PaletteColours.multids +++ b/languages/ca-ES/Docs/PaletteColours.multids @@ -6,6 +6,9 @@ alert-highlight: Destacat de l'avís alert-muted-foreground: Primer plà de l'avís silenciat background: Fons general blockquote-bar: Barra de bloc de cita +button-background: Fons del botó predeterminat +button-border: Vora del botó predeterminat +button-foreground: Primer pla del botó predeterminat code-background: Fons del codi code-border: Vora del codi code-foreground: Primer plà del codi @@ -42,6 +45,8 @@ page-background: Fons de la pàgina pre-background: Fons del codi preformatat pre-border: Vora del codi preformatat primary: General primari +select-tag-background: `<select>` el fons de l’element +select-tag-foreground: `<select>`el text de l'element sidebar-button-foreground: Primer plà del botó de la barra lateral sidebar-controls-foreground: Primer plà dels controls de la barra lateral sidebar-controls-foreground-hover: Primer plà de la bafarada dels controls de la barra lateral @@ -53,11 +58,12 @@ sidebar-tab-background: Fons de la pestanya de la barra lateral sidebar-tab-background-selected: Fons de la pestanya de la barra lateral per les etiquetes seleccionades sidebar-tab-border: Vora de la pestanya de la barra lateraletiqueta sidebar-tab-border-selected: Vora de la pestanya de la barra lateral per les etiquetes seleccionadesetiqueta -sidebar-tab-divider: Divisor de lla pestanya de la barra lateral +sidebar-tab-divider: Divisor de la pestanya de la barra lateral sidebar-tab-foreground: Primer plà de la pestanya de la barra lateral sidebar-tab-foreground-selected: Primer plà de la pestanya de la barra lateral per les etiquetes seleccionades sidebar-tiddler-link-foreground: Primer plà de l'enllaç del tiddler de la barra lateral sidebar-tiddler-link-foreground-hover: Primer plà de la bafarada de l'enllaç del tiddler de la barra lateral +site-title-foreground: Primer pla del títol del lloc static-alert-foreground: Primer plà de l'avís estàtic tab-background: Fons de la pestanya tab-background-selected: Fons de la pestanya per les etiquetes seleccionades diff --git a/languages/ca-ES/EditTemplate.multids b/languages/ca-ES/EditTemplate.multids index b12a29426..6af9caad0 100644 --- a/languages/ca-ES/EditTemplate.multids +++ b/languages/ca-ES/EditTemplate.multids @@ -2,9 +2,14 @@ title: $:/language/EditTemplate/ Body/External/Hint: Aquest és un tiddler extern desat fora del fitxer del TiddlyWiki principal. Podeu editar les etiquetes i camps però no podeu editar directament el seu contingut Body/Placeholder: Escriviu el text per aquest tiddler +Body/Preview/Type/Output: s +Field/Dropdown/Caption: llista de camps +Field/Dropdown/Hint: Mostra la llista de camps Field/Remove/Caption: suprimeix el camp Field/Remove/Hint: Suprimeix el camp Fields/Add/Button: afegeix +Fields/Add/Dropdown/System: Camps del sistema +Fields/Add/Dropdown/User: Camps de l'usuari Fields/Add/Name/Placeholder: nom del camp Fields/Add/Prompt: Afegeix un nou camp Fields/Add/Value/Placeholder: valors del camp @@ -14,6 +19,10 @@ Tags/Add/Button: afegeix Tags/Add/Placeholder: nom de l'etiqueta Tags/Dropdown/Caption: llista d'etiquetes Tags/Dropdown/Hint: Mostra la llista d'etiquetes +Title/BadCharacterWarning: Avís: eviteu qualsevol dels caràcters <<bad-chars>> al títol d'un tiddler +Title/Exists/Prompt: El tiddler destí ja existeix +Title/References/Prompt: Les referències següents cap aquest tiddler no s'actualitzaran automàticament: +Title/Relink/Prompt: Actualitza ''<$text text=<<fromTitle>>/>'' cap a ''<$text text=<<toTitle>>/>'' a les //etiquetes// i a la //lista// de camps d'altres tiddlers Type/Delete/Caption: suprimeix el tipus de contingut Type/Delete/Hint: Suprimeix el tipus de contingut Type/Dropdown/Caption: llista del tipus de contingut diff --git a/languages/ca-ES/Fields.multids b/languages/ca-ES/Fields.multids index 7e1cc1ae7..5577d0c8a 100644 --- a/languages/ca-ES/Fields.multids +++ b/languages/ca-ES/Fields.multids @@ -13,7 +13,8 @@ description: El text que descriu un connector, o un diàleg modal draft.of: Per als tiddlers esborranys, conté el títol del tiddler del qual és un esborrany draft.title: Per als tiddlers esborranys, conté el títol proposat per al tiddler footer: El text del peu d'un assistent -hack-to-give-us-something-to-compare-against: Un camp d'emmagatzemament temporal utilitzat a [[$:/core/templates/static.content]] +hack-to-give-us-something-to-compare-against: Un camp on desar temporalment utilitzat a [[$:/core/templates/static.content]] +hide-body: El valor de la plantilla de vista amaga el cos dels tiddlers és: ''sí'' icon: El títol del tiddler que conté la icona associada amb el tiddler library: Si està a "si" indica que un tiddler s'ha de sar com una biblioteca de JavaScript list: Una llista ordenada de títols de tiddlers associats amb un tiddler @@ -31,5 +32,6 @@ subtitle: El text del subtítol d'un assistent tags: Una llista d'etiquetes associades a un tiddler text: El text del cos d'un tiddler title: El nom únic d'un tiddler +toc-link: El valor de Suprimeix l'enllaç del tiddler a la Taula de Continguts està a: ''no'' type: El tipus de contingut d'un tiddler version: Informació de la versió d'un connector diff --git a/languages/ca-ES/Filters.multids b/languages/ca-ES/Filters.multids index 0dc5f2ae1..80e9b119d 100644 --- a/languages/ca-ES/Filters.multids +++ b/languages/ca-ES/Filters.multids @@ -8,7 +8,9 @@ Orphans: Tiddlers orfes OverriddenShadowTiddlers: Tiddlers amb ombra sobreescrits RecentSystemTiddlers: Tiddlers que s'han modificat recentment, inclós els tiddlers del sistema RecentTiddlers: Tiddlers que s'han modificat recentment +SessionTiddlers: Tiddlers modificats des que es va carregar el wiki ShadowTiddlers: Tiddlers amb ombra predefinits +StoryList: Tiddlers al riu de la història, a excepció de <$text text="$:/AdvancedSearch"/> SystemTags: Etiquetes del sistema SystemTiddlers: Tiddlers del sistema TypedTiddlers: Tiddlers amb text que no és wiki diff --git a/languages/ca-ES/Help/deletetiddlers.tid b/languages/ca-ES/Help/deletetiddlers.tid new file mode 100644 index 000000000..2f11a429e --- /dev/null +++ b/languages/ca-ES/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: Suprimeix un grup de tiddlers + +<<.from-version "5.1.20">> Suprimeix un grup de tiddlers identificat per un filtre. + +``` +--deletetiddlers <filter> +``` diff --git a/languages/ca-ES/Help/fetch.tid b/languages/ca-ES/Help/fetch.tid new file mode 100644 index 000000000..db5e41307 --- /dev/null +++ b/languages/ca-ES/Help/fetch.tid @@ -0,0 +1,37 @@ +title: $:/language/Help/fetch +description: Obté tiddlers del wiki per URL + +Obté un o més fitxers per HTTP/HTTPS, i importa els tiddlers que compleixen un filtre, opcionalment transformant els títols entrants. + +``` +--fetch file <url> <filter-d-importacio> <filtre-de-transformacio> +--fetch files <url-de-filter> <import-d-importacio> <filtre-de-transformacio> +--fetch raw-file <url> <filtre-de-transformacio> +--fetch raw-files <url-de-filter> <filtre-de-transformacio> +``` + +Les variants "fitxer" i "fitxers" obtenen els fitxers indicats i intenten importar els tiddlers dins d’ells (el mateix processament que si els fitxers s’arrosseguessin a la finestra del navegador). Les variants "text-en-cru" i "texts-en-cru" obtenen els fitxers especificats i després emmagatzemen les dades del fitxer com a text cru sense aplicar la lògica d'importació. + +Amb les variants "fitxer" i "texts-en-cru" només s'obté un sol fitxer i el primer paràmetre és l’URL del fitxer a llegir. + +Amb les variants "fitxers" i "texts-en-cru", s'obtenen diversos fitxers i el primer paràmetre és un filtre que proporciona una llista d’URL dels fitxers a llegir. Per exemple, donat un conjunt de tiddlers etiquetats com "servidor-remot" que tenen un camp "url", amb el filtre `[etiqueta[servidor-remot]get[url]]` recuperarà tots els URL disponibles. + +Per a les variants "fitxer" i "fitxers", el paràmetre `<import-filter> indica un filtre que determina quins tiddlers s’importen. Per omissió, és `[all[tiddlers]]` si no s'indica res. + +Per a totes les variants, el paràmetre `<transform-filter>` indica un filtre opcional que transforma els títols dels tiddlers importats. Per exemple, `[addprefix[$: /myimports /]]` afegiria el prefix `$: /myimports/` a cada títol. + +Precedint l’ordre `--fetch` amb` --verbose` s’obtindrà informació del progrés durant la importació. + +Tingueu en compte que TiddlyWiki no obtindrà una versió anterior d’un connector ja carregat. + +El següent exemple recupera tots els tiddlers que no siguin del sistema de https://tiddlywiki.com i els desa en un fitxer JSON: + +``` +tiddlywiki --verbose --fetch file "https://tiddlywiki.com/" "[!is[system]]" "" --rendertiddler "$:/core/templates/exporters/JsonFile" sortida.json text/plain "" exportFilter "[!is[system]]" +``` +El següent exemple recupera el fitxer "favicon" de tiddlywiki.com i el desa en un fitxer anomenat "sortida.ico". Tingueu en compte que el tiddler intermedi "Icon Tiddler" està citat a l’ordre "--fetch" perquè s’utilitza com a filtre de transformació per substituir el títol per omisió, mentre que no hi ha cometes per a l’ordre "--savetiddler" perquè s’utilitza directament com a títol. + +``` +tiddlywiki --verbose --fetch raw-file "https://tiddlywiki.com/favicon.ico" "[[Tiddler d'icona]]" --savetiddler "Tiddler d'icona" sortida.ico +``` + diff --git a/languages/ca-ES/Help/import.tid b/languages/ca-ES/Help/import.tid new file mode 100644 index 000000000..908f0ca43 --- /dev/null +++ b/languages/ca-ES/Help/import.tid @@ -0,0 +1,24 @@ +title: $:/language/Help/import +description: Importa els tiddlers d’un fitxer + +Importa tiddlers de TiddlyWiki (`.html`),` .tiddler`, `.tid`,` .json` o altres fitxers locals. Cal indicar explícitament el deserialitzador, a diferència de l’ordre `load` que infereix al deserialitzador de l’extensió del fitxer. + +``` +--import <ruta> <deserialitzador> [<títol>] [<codificació>] +``` + +Els deserialitzadors inclosos són: + +* application/javascript +* application/json +* application/x-tiddler +* application/x-tiddler-html-div +* application/x-tiddlers +* text/html +* text/plain + +El títol del tiddler importat és per omissió el nom del fitxer. + +La codificació predeterminada és "utf8", però pot ser "base64" per importar fitxers binaris. + +Tingueu en compte que TiddlyWiki no importarà una versió anterior d’un connector ja carregat. \ No newline at end of file diff --git a/languages/ca-ES/Help/init.tid b/languages/ca-ES/Help/init.tid index d40c83476..93a05f728 100644 --- a/languages/ca-ES/Help/init.tid +++ b/languages/ca-ES/Help/init.tid @@ -15,8 +15,8 @@ tiddlywiki ./LaMevaCarpetaWiki --init empty Notes: -* Si cal es generarà la carpeta wiki folder -* El valor per omisió de "edition" és ''empty'' +* Si cal es generarà la carpeta wiki +* El valor per omisió de "edició" és ''empty'' * L'ordre init fracassarà si la carpeta wiki no està buida * L'ordre init suprimeix qualsevol definició `includeWikis` de l'edició del fitxer `tiddlywiki.info` * Quan s'indiqui múltiples edicions, les edicions que s'iniciïn més tard sobreescriuran qualsevol fitxer compartit amb edicions anteriors (així que el fitxer final `tiddlywiki.info` es copiarà de la darrera edció) diff --git a/languages/ca-ES/Help/listen.tid b/languages/ca-ES/Help/listen.tid new file mode 100644 index 000000000..f8177272a --- /dev/null +++ b/languages/ca-ES/Help/listen.tid @@ -0,0 +1,33 @@ +title: $:/language/Help/listen +description: Proporciona una interfície del servidor HTTP a TiddlyWiki + +Serveix una wiki via HTTP. + +L'ordre listen utilitza Paràmetres d'Ordre amb Nom: + +``` +--listen [<nom>=<valor>]... +``` + +Tots els paràmetres són opcionals amb valors predeterminats segurs i es poden especificar en qualsevol ordre. Els paràmetres reconeguts són: + +* ''host'': nom d'amfitrió opcional per servir (per omissió, "127.0.0.1" o "localhost") +* ''path-prefix'' - prefix opcional per a les rutes +* ''port'' - número de port on escoltar; Els valors no numèrics s’interpreten com a variable d’entorn del sistema des de la qual s’extreu el número de port (per omissió, "8080") +* ''credentials'': ruta del fitxer CSV de les credencials (relatiu a la carpeta wiki) +* ''anon-username'': el nom d’usuari per signar edicions per a usuaris anònims +* ''username'' - nom d’usuari opcional per a l’autenticació bàsica +* ''password'': contrasenya opcional per a l'autenticació bàsica +* ''authenticated-user-header'' - nom opcional de la capçalera que s’utilitzarà per a l’autenticació de confiança +* ''readers'' - llista separada per comes, dels usuaris que poden llegir aquesta wiki +* ''writers': llista separada per comes, dels usuaris que poden escriure en aquesta wiki +* ''csrf-disable'': es defineix com a "sí" per desactivar les comprovacions de CSRF (per omissió, "no") +* ''root-tiddler'': el tiddler que servirà a l’arrel (per omissió és "$:/core/save/all") +* ''root-render-type '' - el tipus de contingut amb el qual s'ha de generar el tiddler arrel (per omissió, "text/plain") +* ''root-serve-type'' - el tipus de contingut amb el qual s'ha de servir el tiddler root (per omissió, "text/html") +* ''tls-cert'': ruta del fitxer del certificat TLS (relatiu a la carpeta wiki) +* ''tls-key'': ruta d'accés al fitxer de la clau TLS (relatiu a la carpeta wiki) +* ''debug-level'' - nivell de depuració opcional; s'estableix a "debug" per veure els detalls de la sol·licitud (per omissió, "cap") +* ''gzip'': establiu-ho a "sí" per habilitar la compressió gzip per a alguns extrems http (per omissió "no") + +Per obtenir informació sobre com obrir la vostra instància a tota la xarxa local i possibles problemes de seguretat, consulteu el tiddler WebServer de TiddlyWiki.com. diff --git a/languages/ca-ES/Help/load.tid b/languages/ca-ES/Help/load.tid index 30989c447..3cafb8b59 100644 --- a/languages/ca-ES/Help/load.tid +++ b/languages/ca-ES/Help/load.tid @@ -13,4 +13,4 @@ Per carregar els tiddlers d'un fitxer TiddlyWiki encriptat cal indicar la contra tiddlywiki ./ElMeuWiki --password c0ntras3nya --load la_meva_wiki.html ``` -Noteu que TiddlyWiki no carregarà una versió anterior d'un connector ja carregat. +Tingueu en compte que TiddlyWiki no carregarà una versió anterior d'un connector ja carregat. diff --git a/languages/ca-ES/Help/render.tid b/languages/ca-ES/Help/render.tid new file mode 100644 index 000000000..c05085a8a --- /dev/null +++ b/languages/ca-ES/Help/render.tid @@ -0,0 +1,36 @@ +title: $:/language/Help/render +description: Genera fitxers individuals a partir de tiddlers + +Genera els tiddlers individuals indicats per un filtre i desa els resultats als fitxers indicats. + +Opcionalment, es pot especificar el títol d’un tiddler de plantilla. En aquest cas, en lloc de generar directament cada tiddler, el tiddler de la plantilla es genera amb la variable "currentTiddler" establerta al títol del tiddler que s'està generant. + +També es pot indicar opcionalment un nom i un valor per a una altra variable. + +``` +--render <filtre-de-tiddler> [<nom-del-filtre>] [<render-type>] [<plantilla>] [<nom>] [<valor>] +``` + +* '' filtre-de-tiddler '': Filtre que indica els tiddler(s) que s'han de generar +* '' nom-del-filtre '': Filtre opcional que transforma els títols dels tiddlers en noms de ruta. Si s'omet, el valor per omissió és `[is[tiddler]addsuffix [.html]]`, que utilitza el títol de tiddler sense modificar com a nom de fitxer +* '' tipus-de-contingut '': tipus de contingut opcional: `text / html` (el valor per omissió) retorna el text HTML complet i ` text/plain` només retorna el contingut del text (és a dir, ignora les etiquetes HTML i altres materials no imprimibles) +* ''plantilla'': Plantilla opcional per a generar cada tiddler +* ''nom'': Nom de variable opcional +* ''valor'': Valor de variable opcional + +Per omissió, el nom del fitxer es resol en relació amb la subcarpeta `output ' de la carpeta d’edició. L'ordre `--output` es pot utilitzar per dirigir la sortida a una altra carpeta. + +Notes: + +* A la carpeta de sortida no s'esborra cap fitxer existent +* Es generen automàticament les carpetes que falten a la ruta del nom del fitxer. +* En referir un tiddler amb espais al seu títol, tingueu cura de fer servir tant les cometes necessàries pel vostre intèrpret d'ordres com els dobles claudàtors de TiddlyWiki: `--render" [[Motovun Jack.jpg]] "` + +* El nom del filtre s'avalua amb els elements seleccionats establerts al títol del tiddler que s'està generant, el que permet que el títol s’utilitzi com a base per calcular el nom del fitxer. Per exemple `[encodeuricomponent[]addprefix[static/]]` s'aplica la codificació URI a cada títol i després afegeix el prefix `static/` + +* L'ordre `--render` reemplaça, i és més flexible, que les ordres` --rendertiddler` i `--rendertiddlers`, que estan obsoletes. + +Exemples: + +* `--render "[!is[system]]" "[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]"` -- +genera tots els tiddlers que no siguin del sistema com a fitxers a la carpeta "tiddlers" amb títols codificats per URL amb l'extensió HTML diff --git a/languages/ca-ES/Help/save.tid b/languages/ca-ES/Help/save.tid new file mode 100644 index 000000000..b8f3ff3fe --- /dev/null +++ b/languages/ca-ES/Help/save.tid @@ -0,0 +1,24 @@ +title: $:/language/Help/save +description: Desa tiddlers individuals a fitxers com a text cru + +Desa els tiddlers individuals indicats per un filtre en text cru o en binari als fitxers especificats. + +``` +--save <filtre-de-tiddler> <nom-del-filtre> +``` +* ''filtre-de-tiddler'': Un filtre que indica els tiddler(s) que s'han de desar +* ''nom-del-filtre'': Filtre opcional que transforma els títols de tiddler en noms de ruta. Si s'omet, el valor per omissió `[is[tiddler]]`, s'utilitza el títol del tiddler sense modificar com a nom de fitxer + +Per omissió, el nom del fitxer es resol en relació amb el subcarpeta `output 'de la carpeta d’edició. L'ordre `--output` es pot utilitzar per dirigir la sortida a una altra carpeta. + +Notes: + +* A la carpeta de sortida no s'esborra cap fitxer existent +* Es generen automàticament les carpetes que falten a la ruta del nom del fitxer. +* En guardar un tiddler amb espais en el seu títol, tingueu cura de fer servir tant les cometes necessàries pel vostre intèrpret d'ordres com els dobles claudàtors de TiddlyWiki: `--save" [[Motovun Jack.jpg]] "` +* El nom del filtre s'avalua amb els elements seleccionats establerts al títol del tiddler que s'està desant, el que permet que el títol s’utilitzi com a base per calcular el nom del fitxer. Per exemple `[encodeuricomponent[]addprefix[static/]]` s'aplica la codificació URI a cada títol i després afegeix el prefix `static/` +* L'ordre `--save` reemplaça, i és més flexible, que les ordres` --savetiddler` i `--savetiddlers`, que estan obsoletes. + +Exemples: + +* `--save" [!is[system]is[image]]" "[encodeuricomponent[]addprefix[tiddlers/]]"` -- desa tots els tiddlers d'imatges que no siguin del sistema com a fitxers a la subcarpeta "tiddlers" amb títols codificats en URL diff --git a/languages/ca-ES/Help/savetiddler.tid b/languages/ca-ES/Help/savetiddler.tid index 897892f82..7d9086e9c 100644 --- a/languages/ca-ES/Help/savetiddler.tid +++ b/languages/ca-ES/Help/savetiddler.tid @@ -1,5 +1,5 @@ title: $:/language/Help/savetiddler -description: Desa un tiddler cru a un fitxer +description: Desa un tiddler com a text cru a un fitxer Desa un tiddler individual com a text cru o en format binari al fitxer indicat. diff --git a/languages/ca-ES/Help/savetiddlers.tid b/languages/ca-ES/Help/savetiddlers.tid index 0c2b6915e..1d1f97cb8 100644 --- a/languages/ca-ES/Help/savetiddlers.tid +++ b/languages/ca-ES/Help/savetiddlers.tid @@ -1,12 +1,12 @@ title: $:/language/Help/savetiddlers -description: Desa un grup de tiddlers crus a una carpeta +description: Desa un grup de tiddlers com a text cru a una carpeta -Desa un grup de tiddlers com a text cru o en format binari a la carpeta indicada. +Desa un grup de tiddlers com a text com a text cru o en format binari a la carpeta indicada. ``` ---savetiddlers <filter> <ruta> -``` Noteu que la contrasenya es trasmet tal qual així que no és una bona solució d'ús general. +--savetiddlers <filtre> <ruta> +``` Tingueu en compte que la contrasenya es transmet tal qual així que no és una bona solució d'ús general. -Per omisió, la ruta es resoldrà de forma relativa a la carpeta `output` de la carpeta d'edició. L'ordre `--output` es pot fer servir per dirigir la sortida a una altre carpeta. +Per omissió, la ruta es resoldrà de forma relativa a la carpeta `output` de la carpeta d'edició. L'ordre `--output` es pot fer servir per dirigir la sortida a una altre carpeta. Les carpetes de la ruta que no es trobin es crearan de forma automàtica. diff --git a/languages/ca-ES/Help/savewikifolder.tid b/languages/ca-ES/Help/savewikifolder.tid new file mode 100644 index 000000000..86d435a21 --- /dev/null +++ b/languages/ca-ES/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: Desa un wiki a una nova carpeta wiki + +<<.from-version "5.1.20">> Desa el wiki actual a una carpeta wiki, incloent el tiddlers, els connectors i la configuració: + +``` +--carpeta-per-desar-el-wiki <ruta-per-desar-el-wiki> [<filtre>] +``` + +* La carpeta de destinació de la wiki ha d'estar buida o inexistent +* El filtre indica els tiddlers que s'han d'incloure. És opcional, per omissió és`[all[tiddlers]]` +* Els connectors de la biblioteca oficial de complements es reemplacen per referències a aquests connectors al fitxer `tiddlywiki.info ' +* Els connectors personalitzats es descomprimeixen a la seva pròpia carpeta + +Un ús habitual és convertir un fitxer HTML de TiddlyWiki en una carpeta wiki: + +``` +tiddlywiki --load ./elmeuwiki --carpeta-per-desar-el-wiki ./la-meva-carpeta-wiki +``` diff --git a/languages/ca-ES/Help/server.tid b/languages/ca-ES/Help/server.tid index 4a36a7ab4..3d22d970e 100644 --- a/languages/ca-ES/Help/server.tid +++ b/languages/ca-ES/Help/server.tid @@ -3,24 +3,24 @@ description: Proporciona una interfície de servidor HTTP a TiddlyWiki El servidor que inclou el TiddlyWiki5 és molt simple. Encara que és compatible amb TiddlyWeb no permet moltes de les característiques necessàries que calen per a l'ús robust de l'Internet. -A l'arrel, serveix per a renderitzar un tiddler concret. Fora de l'arrel, serveis els tiddlers individuals codificats en JSON, i permet l'ús de les operacions bàsiques HTTP per `GET`, `PUT` i `DELETE`. +A l'arrel, serveix per a generar un tiddler concret. Fora de l'arrel, serveis els tiddlers individuals codificats en JSON, i permet l'ús de les operacions bàsiques HTTP per `GET`, `PUT` i `DELETE`. ``` ---server <port> <tiddlerarrel> <rendertype> <tipusdeservidor> <usuari> <contrasenya> <host> <prefixdelaruta> +--server <port> <tiddler-arrel> <tipus-de-contingut> <tipus-de-servidor> <usuari> <contrasenya> <host> <prefix-de-la-ruta> ``` Els paràmetres són: * ''port'' - número del port que donarà el servei (per omissió "8080") -* ''tiddlerarrel'' - el tiddler que donarà el servei arrel (per omissió "$:/core/save/all") -* ''rendertype'' - el tipus de contingut al qual s'haurà de renderitzar el tiddler arrel (per omissió "text/plain") -* ''tipusdeservidor'' - el tipus de contingut amb el qual s'haurà de servir el tiddler arrel (per omissió "text/html") +* ''tiddler-arrel'' - el tiddler que donarà el servei arrel (per omissió "$:/core/save/all") +* ''tipus-de-contingut'' - el tipus de contingut al qual s'haurà de generar el tiddler arrel (per omissió "text/plain") +* ''tipus-de-servidor'' - el tipus de contingut amb el qual s'haurà de servir el tiddler arrel (per omissió "text/html") * ''usuari'' - nom de l'usuari per omissió per signar les edicions * ''contrasenya'' - contrasenya opcional per l'autenticació bàsica * ''host'' - nom de host opcional que donarà el servei (per omissió "127.0.0.1" és a dir "localhost") -* ''prefixdelaruta'' - prefix opcional de les rutes +* ''prefix-de-la-ruta'' - prefix opcional de les rutes -Si s'indica el paràmetre de la contrasenya el navegador demanarà un usuari i una contrasenya. La contrasenya es trasmet tal qual així que no és una bona solució d'ús general. +Si s'indica el paràmetre de la contrasenya el navegador demanarà un usuari i una contrasenya. La contrasenya es transmet tal qual així que no és una bona solució d'ús general. Per exemple: @@ -28,7 +28,7 @@ Per exemple: --server 8080 $:/core/save/all text/plain text/html ElMeuUsuari c0ntran3nya ``` -El nom d'usuari i la contrasenya es pot indicar com cadenes buides si voleu indicar un host o un prefixdelaruta i no us cal una contrasenya: +El nom d'usuari i la contrasenya es pot indicar com a cadenes buides si voleu indicar un host o un prefix-de-la-ruta i no us cal una contrasenya: ``` --server 8080 $:/core/save/all text/plain text/html "" "" 192.168.0.245 diff --git a/languages/ca-ES/Help/setfield.tid b/languages/ca-ES/Help/setfield.tid index 1f2fde61e..9ba41fb3b 100644 --- a/languages/ca-ES/Help/setfield.tid +++ b/languages/ca-ES/Help/setfield.tid @@ -1,17 +1,17 @@ title: $:/language/Help/setfield description: Prepara els tiddlers externs per que puguin ser utilitzats -//Noteu que aquesta ordre is experimental i podria canviar abans d'estar acabada// +//Tingueu en compte que aquesta ordre és experimental i podria canviar abans d'estar acabada// Estableix el camp d'un grup de tiddlers al resultat de wikificar un tiddler plantilla indicat per la variable `currentTiddler`. ``` ---setfield <filtre> <nomdelcamp> <plantilladeltítol> <tipus> +--setfield <filtre> <nom-del-camp> <plantilla-del-títol> <tipus> ``` Els paràmetres són: * ''filtre'' - filtre que identifica els tiddlers afectats -* ''nomdelcamp'' - el camp a modificar (per omisió "text") -* ''plantilladeltítol'' - el tiddler a wikificar del camp indicat. Si està en blanc o no hi és llavors el camp indicar es suprimirà -* ''rendertipus'' - el tipus de text que cal generar (per omisió "text/plain"; es possible utilitzar "text/html" per incloure etiquetes HTML) +* ''nom-del-camp'' - el camp a modificar (per omissió "text") +* ''plantilla-del-títol'' - el tiddler a wikificar del camp indicat. Si està en blanc o no hi és llavors el camp indicat es suprimirà +* ''tipus-de-text'' - el tipus de text que cal generar (per omissió "text/plain"; es possible utilitzar "text/html" per incloure etiquetes HTML) diff --git a/languages/ca-ES/Help/unpackplugin.tid b/languages/ca-ES/Help/unpackplugin.tid index ec5c2b5bd..23a41dabc 100644 --- a/languages/ca-ES/Help/unpackplugin.tid +++ b/languages/ca-ES/Help/unpackplugin.tid @@ -1,7 +1,7 @@ title: $:/language/Help/unpackplugin -description: Extrau els tiddlers carregats d'un connector +description: Extreu els tiddlers carregats d'un connector -Extrau els tiddlers carregats d'un connector, generant-los com a tiddlers tiddlers corrents: +Extreu els tiddlers carregats d'un connector, generant-los com a tiddlers corrents: ``` --unpackplugin <títol> diff --git a/languages/ca-ES/Import.multids b/languages/ca-ES/Import.multids index 3d2234f7f..b11a832e8 100644 --- a/languages/ca-ES/Import.multids +++ b/languages/ca-ES/Import.multids @@ -1,14 +1,22 @@ title: $:/language/Import/ +Imported/Hint: S'han importat els següents tiddlers: Listing/Cancel/Caption: Anul·la Listing/Hint: Aquests tiddlers estàn llestos per a ser importats Listing/Import/Caption: Importa +Listing/Preview: Vista prèvia: +Listing/Preview/Diff: Diferències +Listing/Preview/DiffFields: Diferències (Camps) +Listing/Preview/Fields: Camps +Listing/Preview/TextRaw: Text (Cru) Listing/Select/Caption: Trieu Listing/Status/Caption: Estat Listing/Title/Caption: Títol Upgrader/Plugins/Suppressed/Incompatible: Connector bloquejat incompatible o obsolet Upgrader/Plugins/Suppressed/Version: Connector bloquejat (degut a que la nova versió <<entrant>> és anterior a l'actual <<actual>>) Upgrader/Plugins/Upgraded: Connector actualitzat de <<entrant>> a <<actualitzat>> -Upgrader/State/Suppressed: Tiddler temporalment en estat bloquejat +Upgrader/State/Suppressed: Tiddler temporalment bloquejat +Upgrader/System/Alert: Esteu a punt d’importar un tiddler que sobreescrigui un tiddler del nucli central. Això no és recomanable, ja que pot fer que el sistema sigui inestable Upgrader/System/Suppressed: Tiddler del sistema bloquejat +Upgrader/System/Warning: Tiddler del nucli central Upgrader/ThemeTweaks/Created: Tema migrat des de <$text text=<<desde>>/> diff --git a/languages/ca-ES/Misc.multids b/languages/ca-ES/Misc.multids index c4e7c9eca..dac9291f7 100644 --- a/languages/ca-ES/Misc.multids +++ b/languages/ca-ES/Misc.multids @@ -23,7 +23,7 @@ Encryption/SetPassword: Indiqueu la contrasenya Encryption/Username: Usuari Error/Caption: S'ha produït un error Error/EditConflict: El fitxer ha canviat al servidor -Error/Filter: S'ha produït un error de filtre +Error/Filter: S'ha produït un error del filtre Error/FilterSyntax: S'ha produït un error de sintaxi en l'expressió del filtre Error/IsFilterOperator: S'ha produït un error del filtre: operant desconegut per a l’operador de filtre "is" Error/LoadingPluginLibrary: S'ha produït un error en carregar la biblioteca del connector @@ -32,10 +32,10 @@ Error/RetrievingSkinny: S'ha produït un error en recuperar la llista de tiddler Error/SavingToTWEdit: S'ha produït un error en desar a TWEdit Error/WhileSaving: S'ha produït un error en desar Error/XMLHttpRequest: Codi d'error XMLHttpRequest -InternalJavaScriptError/Hint: Bé, això és compromès. Es recomana que reiniciau TiddlyWiki actualitzant el navegador +InternalJavaScriptError/Hint: Bé, això és compromès. Es recomana que reinicieu TiddlyWiki actualitzant el navegador InternalJavaScriptError/Title: Error de JavaScript intern InvalidFieldName: Hi ha caràcters il·legals al nom del camp "<$text text=<<fieldName>>/>". Els camps només poden utilitzar minúscules, digits i els caràcters subratllat (`_`), guió (`-`) i punt (`.`) -LazyLoadingWarning: <p>Tractant de carregar contingut extern de ''<$text text={{!!_canonical_uri}}/>''</p><p>Si aquest missatge no desapareix, o bé el tipus de contingut del tiddler no coincideix amb el tipus de contingut extern o bé esteu utilitzant un navegador que no admet contingut extern per als wikis carregats com a fitxers independents. Mireu https://tiddlywiki.com/#ExternalText</p> +LazyLoadingWarning: <p>S'està tractant de carregar contingut extern de ''<$text text={{!!_canonical_uri}}/>''</p><p>Si aquest missatge no desapareix, o bé el tipus de contingut del tiddler no coincideix amb el tipus de contingut extern o bé esteu utilitzant un navegador que no admet contingut extern per als wikis carregats com a fitxers independents. Mireu https://tiddlywiki.com/#ExternalText</p> LoginToTiddlySpace: Inicieu sessió a TiddlySpace Manager/Controls/FilterByTag/None: (cap) Manager/Controls/FilterByTag/Prompt: Filtra per etiqueta: @@ -49,7 +49,7 @@ Manager/Item/Colour: Color Manager/Item/Fields: Camps Manager/Item/Icon: Icona Manager/Item/Icon/None: (cap) -Manager/Item/RawText: Text en brut +Manager/Item/RawText: Text cru Manager/Item/Tags: Etiquetes Manager/Item/Tools: Eines Manager/Item/WikifiedText: Text en format Wiki @@ -65,5 +65,6 @@ TagManager/Count/Heading: Compte TagManager/Icon/Heading: Icona TagManager/Info/Heading: Informació TagManager/Tag/Heading: Etiqueta +Tiddler/DateFormat: DDth de MMM de YYYY a les hh12:0mmam UnsavedChangesWarning: Teniu canvis sense desar al TiddlyWiki Yes: Sí diff --git a/languages/ca-ES/Search.multids b/languages/ca-ES/Search.multids index 2307857cf..0a212fc4b 100644 --- a/languages/ca-ES/Search.multids +++ b/languages/ca-ES/Search.multids @@ -5,6 +5,10 @@ Filter/Caption: Filtre Filter/Hint: Cerca amb una [[filter expression|https://tiddlywiki.com/static/Filters.html]] Filter/Matches: //<small><<resultCount>> coincidències</small>// Matches: //<small><<resultCount>> coincidències</small>// +Matches/All: Totes les coincidències: +Matches/Title: Coincidències del títol: +Search: Cerca +Search/TooShort: El text que voleu cercar és massa curt Shadows/Caption: Ombres Shadows/Hint: Cerca de tiddlers ombra Shadows/Matches: //<small><<resultCount>> coincidències</small>// diff --git a/languages/ca-ES/SideBar.multids b/languages/ca-ES/SideBar.multids index 90f5963aa..bc1232f56 100644 --- a/languages/ca-ES/SideBar.multids +++ b/languages/ca-ES/SideBar.multids @@ -3,6 +3,7 @@ title: $:/language/SideBar/ All/Caption: Tot Contents/Caption: Contingut Drafts/Caption: Esborranys +Explorer/Caption: Explorador Missing/Caption: Falten More/Caption: Més Open/Caption: Obre diff --git a/languages/ca-ES/Snippets/ListByTag.tid b/languages/ca-ES/Snippets/ListByTag.tid new file mode 100644 index 000000000..38ac9ecea --- /dev/null +++ b/languages/ca-ES/Snippets/ListByTag.tid @@ -0,0 +1,5 @@ +title: $:/language/Snippets/ListByTag +tags: $:/tags/TextEditor/Snippet +caption: Llista de tiddlers per etiqueta + +<<list-links "[tag[task]sort[title]]">> diff --git a/languages/ca-ES/Snippets/MacroDefinition.tid b/languages/ca-ES/Snippets/MacroDefinition.tid new file mode 100644 index 000000000..da729e0aa --- /dev/null +++ b/languages/ca-ES/Snippets/MacroDefinition.tid @@ -0,0 +1,7 @@ +title: $:/language/Snippets/MacroDefinition +tags: $:/tags/TextEditor/Snippet +caption: Definició de la macro + +\define macroName(param1:"default value",param2) +Text de la macro +\end diff --git a/languages/ca-ES/Snippets/Table4x3.tid b/languages/ca-ES/Snippets/Table4x3.tid new file mode 100644 index 000000000..4df16a415 --- /dev/null +++ b/languages/ca-ES/Snippets/Table4x3.tid @@ -0,0 +1,8 @@ +title: $:/language/Snippets/Table4x3 +tags: $:/tags/TextEditor/Snippet +caption: Taula amb 4 columnes i 3 files + +|! |!Alpha |!Beta |!Gamma |!Delta | +|!Un | | | | | +|!Dos | | | | | +|!Tres | | | | | diff --git a/languages/ca-ES/Snippets/TableOfContents.tid b/languages/ca-ES/Snippets/TableOfContents.tid new file mode 100644 index 000000000..5d5243e69 --- /dev/null +++ b/languages/ca-ES/Snippets/TableOfContents.tid @@ -0,0 +1,9 @@ +title: $:/language/Snippets/TableOfContents +tags: $:/tags/TextEditor/Snippet +caption: Taula de continguts + +<div class="tc-table-of-contents"> + +<<toc-selective-expandable 'TableOfContents'>> + +</div> \ No newline at end of file diff --git a/languages/ca-ES/ThemeTweaks.multids b/languages/ca-ES/ThemeTweaks.multids new file mode 100644 index 000000000..a22ccb012 --- /dev/null +++ b/languages/ca-ES/ThemeTweaks.multids @@ -0,0 +1,41 @@ +title: $:/language/ThemeTweaks/ + +Metrics: Mides +Metrics/BodyFontSize: Mida del tipus de lletra per al cos de tiddler +Metrics/BodyLineHeight: Alçada de la línia per al cos de tiddler +Metrics/FontSize: Mida del tipus de lletra +Metrics/LineHeight: Alçada de la línia +Metrics/SidebarBreakpoint: Punt d’interrupció de la barra lateral +Metrics/SidebarBreakpoint/Hint: l’amplada mínima de la pàgina en què apareixeran la cronologia i la barra lateral costat a costat +Metrics/SidebarWidth: Amplada de la barra lateral +Metrics/SidebarWidth/Hint: l'amplada de la barra lateral amb una disposició fluida fixe +Metrics/StoryLeft: Posició esquerra de la cronologia +Metrics/StoryLeft/Hint: distància entre el marge esquerre de la cronologia<br>(àrea del tiddler) fins a l’esquerra de la pàgina +Metrics/StoryRight: Dreta de la cronologia +Metrics/StoryRight/Hint: distància entre el marge esquerre de la barra lateral<br>fins a l’esquerra de la pàgina +Metrics/StoryTop: Posició de la cronologia +Metrics/StoryTop/Hint: distància del marge superior de la cronologia<br>fins a la part superior de la pàgina +Metrics/StoryWidth: Amplada de la cronologia +Metrics/StoryWidth/Hint: l'amplada global de la cronologia +Metrics/TiddlerWidth: Amplada del tiddler +Metrics/TiddlerWidth/Hint: dins de la cronologia +Options: Opcions +Options/CodeWrapping: Enganxa línies llargues en blocs de codi +Options/SidebarLayout: Disposició de la barra lateral +Options/SidebarLayout/Fixed-Fluid: Cronologia fixe, barra lateral fluida +Options/SidebarLayout/Fluid-Fixed: Cronologia fluida, barra lateral fixe +Options/StickyTitles: Títols enganxosos +Options/StickyTitles/Hint: Fa que els títols del tiddler "s'enganxin" a la part superior de la finestra del navegador +Settings: Paràmetres +Settings/BackgroundImage: Imatge de fons de la pàgina +Settings/BackgroundImageAttachment: Adjunt de la imatge de fons de la pàgina +Settings/BackgroundImageAttachment/Fixed: Fixe a la finestra +Settings/BackgroundImageAttachment/Scroll: Desplaça-ho amb els tiddlers +Settings/BackgroundImageSize: Mida de la imatge de fons de la pàgina +Settings/BackgroundImageSize/Contain: Conté +Settings/BackgroundImageSize/Cover: Coberta +Settings/CodeFontFamily: Família del tipus de lletra del codi +Settings/EditorFontFamily: Família del tipus de lletra de l'editor +Settings/FontFamily: Família del tipus de lletra +ThemeTweaks: Retocs del tema +ThemeTweaks/Hint: Podeu modificar alguns aspectes del tema ''Vainilla''. From 68e6298e7d5cd8fe8af0e382da0f54cbbcf81a0b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 6 Aug 2019 17:41:11 +0100 Subject: [PATCH 0268/2376] Tweaks to release note --- .../prerelease/tiddlers/Release 5.1.20.tid | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index 82eae327f..b8dc242fa 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -7,23 +7,36 @@ type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.19...v5.1.20]]// -!! Major Improvements +!! New Conditional Operators + +[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/17711657b6028a177c8aef97f7a0a1c084d65436]] new [[Conditional Operators]] [[then Operator]] and [[else Operator]] + +!! New Mathematics Operators Added several new [[Mathematics Operators]] for working with numbers: [[negate|negate Operator]], [[abs|abs Operator]], [[ceil|ceil Operator]], [[floor|floor Operator]], [[round|round Operator]], [[trunc|trunc Operator]], [[untrunc|untrunc Operator]], [[sign|sign Operator]], [[add|add Operator]], [[subtract|subtract Operator]], [[multiply|multiply Operator]], [[divide|divide Operator]], [[remainder|remainder Operator]], [[max|max Operator]], [[min|min Operator]], [[fixed|fixed Operator]], [[precision|precision Operator]], [[exponential|exponential Operator]], [[sum|sum Operator]], [[product|product Operator]], [[maxall|maxall Operator]] and [[minall|minall Operator]]. +!! New String Operators + Added several new string operators: [[match|match Operator]], [[length|length Operator]], [[uppercase|uppercase Operator]], [[lowercase|lowercase Operator]], [[titlecase|titlecase Operator]], [[sentencecase|sentencecase Operator]], [[trim|trim Operator]], [[split|split Operator]], [[splitregexp|splitregexp Operator]] and [[join|join Operator]]. +!! Improved Handling of Duplicates in Filters + There is now finer control over TiddlyWiki's default behaviour of removing duplicates from filter results, making it much easier to work with the new mathematics and string operators: * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/37bb75f0cf446d62eb45d07b9f9b0aa14814a43f]] support for new `=` prefix for merging filter runs without removing duplicates * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/18fe112da7d3ac210a5a0b9cf73fe9050717d4e3]] option for the [[enlist Operator]] to not remove duplicates -Keyboard shortcut handling has been significantly improved: +!! Improved Keyboard Shortcuts -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf51ae001993565fd43443d053ea83e209b67c6f]] a keyboard shortcut (default <kbd>ctrl</kbd>-<kbd>shift</kbd>-<kbd>F</kbd>) for focussing the sidebar search field -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ef7210adf4ecbec9838dcf898a5841f3ffa31567]] a keyboard shortcut (default <kbd>alt</kbd>-<kbd>shift</kbd>-<kbd>S</kbd>) for toggling the visibility of the sidebar -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/2bcb36f15147e3470688bd90276fa038c2991976]] a keyboard shortcut (default <kbd>ctrl</kbd>-<kbd>shift</kbd>-<kbd>A</kbd>) for opening the advanced search tiddler +Keyboard shortcut handling has been significantly improved with the following new global shortcuts +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf51ae001993565fd43443d053ea83e209b67c6f]] a keyboard shortcut (default <kbd>ctrl-shift-F</kbd>) for focussing the sidebar search field +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ef7210adf4ecbec9838dcf898a5841f3ffa31567]] a keyboard shortcut (default <kbd>alt-shift-S</kbd>) for toggling the visibility of the sidebar +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/2bcb36f15147e3470688bd90276fa038c2991976]] a keyboard shortcut (default <kbd>ctrl-shift-A</kbd>) for opening the advanced search tiddler + +!! Saving to ~GitHub and ~GitLab + +[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a [[Git service saver|Saving to a Git service]] for saving direct to ~GitHub and ~GitLab !! Plugin Improvements @@ -32,11 +45,12 @@ New and improved plugins: * New [[BrowserStorage Plugin]] for saving tiddlers in browser local storage * New [[Innerwiki Plugin]] for rendering TiddlyWiki screenshots * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4133]] [[KaTeX Plugin]] to ~KaTeX v0.10.2 -* Several improvements to the [[CodeMirror Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent -* Several improvements to the [[Dynaview Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage -* Several improvements to the [[Amazon Web Services Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/fffd0ee9e17d6b6a561648a42f0f200d4bb04046]] support for specifying credentials * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3131]] an editor toolbar button for the [[KaTeX Plugin]] +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/3635]] [[Highlight Plugin]] to use highlight.js v9.15.6 * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3898]] support for language aliases with the [[Highlight Plugin]] +* Updates to the [[CodeMirror Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/pull/3810]] support for smart indent +* Updates to the [[Dynaview Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/a9e595c3f633391003224e499440cdeb8560c055]] support for restoring the scroll position at startup from local storage +* Updates to the [[Amazon Web Services Plugin]], including [[adding|https://github.com/Jermolene/TiddlyWiki5/commit/fffd0ee9e17d6b6a561648a42f0f200d4bb04046]] support for specifying credentials !! Translation Improvements @@ -58,12 +72,12 @@ New and improved translations: !! Usability Improvements +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/3832]] the [[palette manager|$:/PaletteManager]] with the ability to delete entries, and directly edit indirect entries * Several new palettes: "Nord", "Solarized Light", "Spartan Day", "Spartan Night" and "Twilight" * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/5a37a84a54f2dc9ccf106309b739cfa693bae3e3]] the plugin library to search all plugin fields * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e5f3301c1c36e8add4ed89ab1bd53a9b68411d3f]] a warning when core JavaScript modules are overwritten via import * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3654]] prompt for references when renaming a tiddler * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0e6855eba8945e023cc5ef19809cfb6d6025627b]] a new filter preset for advanced search for "tiddlers modified this session" -* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/3832]] the [[palette manager|$:/PaletteManager]] with the ability to delete entries, and directly edit indirect entries * Added a number of animations (some of were already present but had been broken over the years) for changes in: ** [[Tags in the view template|https://github.com/Jermolene/TiddlyWiki5/pull/4142]] ** [[Page controls|https://github.com/Jermolene/TiddlyWiki5/pull/4145]] @@ -74,13 +88,10 @@ New and improved translations: !! Hackability Improvements * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4051]] support for [[configurable view and edit templates|Hidden Setting: ViewTemplate and EditTemplate]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a saver for [[Saving to GitHub]] and [[Saving to GitLab]] * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/37ea659bf011b1d4a152f54171399d94f5bba3ef]] the [[dumpvariables Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/754c1251a9bdf45e8f64079a4bbdaed2d05be2b7]] new [[variables Operator]] and [[getvariable Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ed67f4a88b29c5c81d4de31203dbf23d66955fb7]] new [[WidgetMessage: tm-focus-selector]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3546]] new [[escapecss Operator]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5faae2547d68d386b2aa33255dcceed3539aa57e]] new [[match Operator]] for text comparison -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/17711657b6028a177c8aef97f7a0a1c084d65436]] new [[Conditional Operators]] [[then Operator]] and [[else Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/3880]] new [[unusedtitle Macro]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/36e76429b1a1d4638374d513430393db5693b932]] new `[is[variable]]` option to the [[is Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/90684f9f52809ff5df39629d3b161d7ff23002f4]] new `[is[blank]]` option to the [[is Operator]] @@ -128,7 +139,6 @@ New and improved translations: !! Developer Bug Fixes and Improvements * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e52a616891977bde142334df2a72c7dd121efb82]] support for widget subclassing -- see https://tiddlywiki.com/prerelease/dev/#WidgetSubclassingMechanism -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/3635]] [[Highlight Plugin]] to use highlight.js v9.15.6 ! Contributors From c3df892321f879b8b0ce92dc7bc49669dfbd6b22 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 6 Aug 2019 18:46:28 +0100 Subject: [PATCH 0269/2376] More release note tweaks --- editions/prerelease/tiddlers/Release 5.1.20.tid | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/prerelease/tiddlers/Release 5.1.20.tid index b8dc242fa..2babb8d9f 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/prerelease/tiddlers/Release 5.1.20.tid @@ -28,15 +28,15 @@ There is now finer control over TiddlyWiki's default behaviour of removing dupli !! Improved Keyboard Shortcuts -Keyboard shortcut handling has been significantly improved with the following new global shortcuts +Keyboard shortcut handling has been significantly improved with the following new global shortcuts (configurable via $:/ControlPanel): -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf51ae001993565fd43443d053ea83e209b67c6f]] a keyboard shortcut (default <kbd>ctrl-shift-F</kbd>) for focussing the sidebar search field -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ef7210adf4ecbec9838dcf898a5841f3ffa31567]] a keyboard shortcut (default <kbd>alt-shift-S</kbd>) for toggling the visibility of the sidebar -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/2bcb36f15147e3470688bd90276fa038c2991976]] a keyboard shortcut (default <kbd>ctrl-shift-A</kbd>) for opening the advanced search tiddler +* <kbd>ctrl-shift-F</kbd> - focus the sidebar search field +* <kbd>alt-shift-S</kbd> - toggle the visibility of the sidebar +* <kbd>ctrl-shift-A</kbd> - open the advanced search tiddler !! Saving to ~GitHub and ~GitLab -[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a [[Git service saver|Saving to a Git service]] for saving direct to ~GitHub and ~GitLab +[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/aa5eaa98fcb8658dbc2b93476c2e09c9207439d8]] a [[Git service saver|Saving to a Git service]] for saving directly to ~GitHub and ~GitLab !! Plugin Improvements From 803c2c749f9f112f244fbd1a16ecad0a3581b02b Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 7 Aug 2019 04:05:35 +0800 Subject: [PATCH 0270/2376] Add chinese translations for Saving/GitService (#4137) --- languages/zh-Hans/ControlPanel.multids | 21 ++++++++++++--------- languages/zh-Hant/ControlPanel.multids | 21 ++++++++++++--------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index a43cf7f43..c528c3120 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -92,15 +92,18 @@ Saving/DownloadSaver/Hint: 这些设置适用于兼容 HTML5 的下载保存模 Saving/General/Caption: 通用 Saving/General/Hint: 这些设置适用于所有已载入的保存模块 Saving/Hint: 用于通过保存模块将整个 TiddlyWiki 保存为单个文件的设置 -Saving/GitHub/Branch: 用于保存的目标分支 (默认值为 `master`) -Saving/GitHub/Caption: ~GitHub 保存模块 -Saving/GitHub/Description: 这些设定仅用于保存到 ~GitHub -Saving/GitHub/ServerURL: 服务器网址 (默认值为 `https://api.github.com`) -Saving/GitHub/Filename: 目标文件的文件名称 (例如,`index.html`) -Saving/GitHub/Password: 密码、OAUTH 令牌,或个人存取的令牌 -Saving/GitHub/Path: 目标文件的路径 (例如,`/wiki/`) -Saving/GitHub/Repo: 目标存储库 (例如,`Jermolene/TiddlyWiki5`) -Saving/GitHub/UserName: 用户名称 +Saving/GitService/Branch: 用于保存的目标分支 +Saving/GitService/CommitMessage: 由 TiddlyWiki 保存 +Saving/GitService/Description: 这些设置仅用于保存至 <<service-name>> +Saving/GitService/Filename: 目标文件的文件名称 (例如,`index.html`) +Saving/GitService/Path: 目标文件的路径 (例如,`/wiki/`) +Saving/GitService/Repo: 目标存储库 (例如,`Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: 服务器 API 网址 +Saving/GitService/UserName: 用户名称 +Saving/GitService/GitHub/Caption: ~GitHub 保存模块 +Saving/GitService/GitHub/Password: 密码、OAUTH 令牌,或个人存取令牌 (详见 [[GitHub 帮助页面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) +Saving/GitService/GitLab/Caption: ~GitLab 保存模块 +Saving/GitService/GitLab/Password: 个人存取令牌的 API (详见 [[GitLab 帮助页面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html for details]]) Saving/TiddlySpot/Advanced/Heading: 高级设置 Saving/TiddlySpot/BackupDir: 备份文件夹 Saving/TiddlySpot/Backups: 备份 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 664ad121a..57aa727a5 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -92,15 +92,18 @@ Saving/DownloadSaver/Hint: 這些設定適用於相容 HTML5 的下載儲存模 Saving/General/Caption: 通用 Saving/General/Hint: 這些設定適用於所有已載入的儲存模組 Saving/Hint: 用於通過儲存模組將整個 TiddlyWiki 儲存為單個檔案的設定 -Saving/GitHub/Branch: 用於儲存的目標分支 (預設值為 `master`) -Saving/GitHub/Caption: ~GitHub 儲存模組 -Saving/GitHub/Description: 這些設定僅用於儲存到 ~GitHub -Saving/GitHub/ServerURL: 伺服器網址 (預設值為 `https://api.github.com`) -Saving/GitHub/Filename: 目標檔案的檔案名稱 (例如,`index.html`) -Saving/GitHub/Password: 密碼、OAUTH 令牌,或個人存取的令牌 -Saving/GitHub/Path: 目標檔案的路徑 (例如,`/wiki/`) -Saving/GitHub/Repo: 目標存儲庫 (例如,`Jermolene/TiddlyWiki5`) -Saving/GitHub/UserName: 使用者名稱 +Saving/GitService/Branch: 用於儲存的目標分支 +Saving/GitService/CommitMessage: 由 TiddlyWiki 儲存 +Saving/GitService/Description: 這些設定僅用於儲存至 <<service-name>> +Saving/GitService/Filename: 目標檔案的檔案名稱 (例如,`index.html`) +Saving/GitService/Path: 目標檔案的路徑 (例如,`/wiki/`) +Saving/GitService/Repo: 目標存儲庫 (例如,`Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: 伺服器 API 網址 +Saving/GitService/UserName: 使用者名稱 +Saving/GitService/GitHub/Caption: ~GitHub 儲存模組 +Saving/GitService/GitHub/Password: 密碼、OAUTH 令牌,或個人存取令牌 (詳見 [[GitHub 說明頁面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) +Saving/GitService/GitLab/Caption: ~GitLab 儲存模組 +Saving/GitService/GitLab/Password: 個人存取令牌的 API (詳見 [[GitLab 說明頁面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html for details]]) Saving/TiddlySpot/Advanced/Heading: 進階設定 Saving/TiddlySpot/BackupDir: 備份資料夾 Saving/TiddlySpot/Backups: 備份 From 59264bbf2a366e8a6cdb316eab39c20532389947 Mon Sep 17 00:00:00 2001 From: Xavier Cazin <cazinx@gmail.com> Date: Wed, 7 Aug 2019 19:01:02 +0200 Subject: [PATCH 0271/2376] fr-FR translation updates (#4167) * Typo in GitLab saver link * Improve fr-FR DateFormat for ViewTemplate subtitles * Update fr-FR translations for Saving/GitService --- core/language/en-GB/ControlPanel.multids | 2 +- languages/fr-FR/ControlPanel.multids | 23 +++++++++++++---------- languages/fr-FR/Misc.multids | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 4ccb30787..faa4d73c5 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -102,7 +102,7 @@ Saving/GitService/UserName: Username Saving/GitService/GitHub/Caption: ~GitHub Saver Saving/GitService/GitHub/Password: Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details) Saving/GitService/GitLab/Caption: ~GitLab Saver -Saving/GitService/GitLab/Password: Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html for details]] for details) +Saving/GitService/GitLab/Password: Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details) Saving/TiddlySpot/Advanced/Heading: Advanced Settings Saving/TiddlySpot/BackupDir: Backup Directory Saving/TiddlySpot/Backups: Backups diff --git a/languages/fr-FR/ControlPanel.multids b/languages/fr-FR/ControlPanel.multids index 2813e6092..d2f61d283 100644 --- a/languages/fr-FR/ControlPanel.multids +++ b/languages/fr-FR/ControlPanel.multids @@ -87,16 +87,19 @@ Saving/DownloadSaver/Caption: Enregistreur de téléchargement Saving/DownloadSaver/Hint: Ces paramètres s'appliquent à l'enregistreur de téléchargement compatible HTML5 Saving/General/Caption: Général Saving/General/Hint: Ces paramètres s'appliquent à tous les enregistreurs chargés -Saving/Hint: Paramètres pour enregistrer le ~TiddlyWiki complet dans un seul fichier, via un module enregistreur -Saving/GitHub/Branch: Branche cible dans laquelle enregistrer (`master` par défaut) -Saving/GitHub/Caption: Enregistreur ~GitHub -Saving/GitHub/Description: Ces paramètres ne sont utilisés que pour l'enregistrement sur ~GitHub -Saving/GitHub/ServerURL: URL du serveur (`https://api.github.com` par défaut) -Saving/GitHub/Filename: Nom du fichier cible (par ex. `index.html`) -Saving/GitHub/Password: Mot de passe, jeton OAUTH, ou //personal access token// -Saving/GitHub/Path: Chemin vers le fichier cible (par ex. `/wiki/`) -Saving/GitHub/Repo: //Repository// cible (par ex. `Jermolene/TiddlyWiki5`) -Saving/GitHub/UserName: Nom d'utilisateur +Saving/Hint: Paramètres pour enregistrer l'intégralité du TiddlyWiki dans un seul fichier, selon le module d'enregistrement choisi +Saving/GitService/Branch: Branche cible où doit s'effectuer l'enregistrement +Saving/GitService/CommitMessage: Enregistré depuis TiddlyWiki +Saving/GitService/Description: Ces paramètres ne sont utilisés que pour l'enregistrement sur <<service-name>> +Saving/GitService/Filename: Nom du fichier cible (par ex. `index.html`) +Saving/GitService/Path: Chemin vers le fichier cible (par ex. `/wiki/`) +Saving/GitService/Repo: //Repository// cible (par ex. `Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: URL du serveur d'API +Saving/GitService/UserName: Nom d'utilisateur +Saving/GitService/GitHub/Caption: Enregistreur ~GitHub +Saving/GitService/GitHub/Password: Mot de passe, jeton OAUTH, ou //personal access token// (voir [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] pour de plus amples détails) +Saving/GitService/GitLab/Caption: Enregistreur ~GitLab +Saving/GitService/GitLab/Password: //Personal access token// pour cette API (voir [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] pour de plus amples details) Saving/TiddlySpot/Advanced/Heading: Paramètres avancés Saving/TiddlySpot/BackupDir: Dossier des //sauvegardes// Saving/TiddlySpot/Backups: Sauvegardes diff --git a/languages/fr-FR/Misc.multids b/languages/fr-FR/Misc.multids index c18ce3cb6..499b9c24d 100644 --- a/languages/fr-FR/Misc.multids +++ b/languages/fr-FR/Misc.multids @@ -68,6 +68,6 @@ TagManager/Count/Heading: Total TagManager/Icon/Heading: Icône TagManager/Info/Heading: Info TagManager/Tag/Heading: Tag -Tiddler/DateFormat: DD MMM YYYY à hhhmm +Tiddler/DateFormat: DD MMM YYYY à 0hhhmm UnsavedChangesWarning: Vos dernières modifications n'ont pas été sauvegardées dans votre TiddlyWiki Yes: Oui From 2be09f23eb39496eb23fdeef76545c46db187b2f Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Thu, 8 Aug 2019 16:55:49 +0800 Subject: [PATCH 0272/2376] Corrected typo in help link for GitLab saver (#4169) * for zh-Hant and zh-Hans --- languages/zh-Hans/ControlPanel.multids | 2 +- languages/zh-Hant/ControlPanel.multids | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index c528c3120..108946d94 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -103,7 +103,7 @@ Saving/GitService/UserName: 用户名称 Saving/GitService/GitHub/Caption: ~GitHub 保存模块 Saving/GitService/GitHub/Password: 密码、OAUTH 令牌,或个人存取令牌 (详见 [[GitHub 帮助页面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) Saving/GitService/GitLab/Caption: ~GitLab 保存模块 -Saving/GitService/GitLab/Password: 个人存取令牌的 API (详见 [[GitLab 帮助页面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html for details]]) +Saving/GitService/GitLab/Password: 个人存取令牌的 API (详见 [[GitLab 帮助页面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]]) Saving/TiddlySpot/Advanced/Heading: 高级设置 Saving/TiddlySpot/BackupDir: 备份文件夹 Saving/TiddlySpot/Backups: 备份 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 57aa727a5..888f8b4bf 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -103,7 +103,7 @@ Saving/GitService/UserName: 使用者名稱 Saving/GitService/GitHub/Caption: ~GitHub 儲存模組 Saving/GitService/GitHub/Password: 密碼、OAUTH 令牌,或個人存取令牌 (詳見 [[GitHub 說明頁面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) Saving/GitService/GitLab/Caption: ~GitLab 儲存模組 -Saving/GitService/GitLab/Password: 個人存取令牌的 API (詳見 [[GitLab 說明頁面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html for details]]) +Saving/GitService/GitLab/Password: 個人存取令牌的 API (詳見 [[GitLab 說明頁面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]]) Saving/TiddlySpot/Advanced/Heading: 進階設定 Saving/TiddlySpot/BackupDir: 備份資料夾 Saving/TiddlySpot/Backups: 備份 From a91ae1a877a3898f292493729a94bd78884d2436 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 8 Aug 2019 15:22:57 +0100 Subject: [PATCH 0273/2376] More Catalan updates --- languages/ca-ES/ControlPanel.multids | 38 ++++++++++++++------- languages/ca-ES/Docs/PaletteColours.multids | 18 +++++----- languages/ca-ES/EditTemplate.multids | 2 +- languages/ca-ES/Misc.multids | 4 +-- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/languages/ca-ES/ControlPanel.multids b/languages/ca-ES/ControlPanel.multids index f02196f3a..ce761302b 100644 --- a/languages/ca-ES/ControlPanel.multids +++ b/languages/ca-ES/ControlPanel.multids @@ -85,19 +85,31 @@ Plugins/Themes/Caption: Temes Plugins/Themes/Hint: Connectors del tema Saving/Caption: Desa Saving/DownloadSaver/AutoSave/Description: Permet que el gestor de baixades desi automàticament -Saving/DownloadSaver/AutoSave/Hint: Habiliteu el desat automàtic pel gestor de baixades +Saving/DownloadSaver/AutoSave/Hint: Activa el desat automàtic pel gestor de baixades Saving/DownloadSaver/Caption: Gestor de baixades Saving/DownloadSaver/Hint: Aquesta configuració s’aplica al gestor de baixades compatible amb HTML5 Saving/General/Hint: Aquests valors s'apliquen a tots els gestors de baixades carregats -Saving/GitHub/Branch: Branca destí a on desar (per omissió és `master`) +Saving/GitHub/Branch: Branca destinació a on desar (per omissió és `master`) Saving/GitHub/Caption: Gestor de baixades de ~GitHub Saving/GitHub/Description: Aquests valors només s’utilitzen quan es desa a ~ GitHub Saving/GitHub/Filename: Nom del fitxer destinació (per exemple, `index.html`) Saving/GitHub/Password: Contrasenya, clau OAUTH o clau d'accés personal Saving/GitHub/Path: Ruta al fitxer destinació (per exemple, `/wiki/`) -Saving/GitHub/Repo: Repositori destí (per exemple, `Jermolene/TiddlyWiki5`) -Saving/GitHub/ServerURL: URL del servidor (per omissió és `https://api.github.com`) +Saving/GitHub/Repo: Repositori destinació (per exemple, `Jermolene/TiddlyWiki5`) +Saving/GitHub/ServerURL: URL del servidor (per omissió és `https://api.github.com`) Saving/GitHub/UserName: Nom d'usuari +Saving/GitService/Branch: Branca destinació a on desar +Saving/GitService/CommitMessage: Desat per TiddlyWiki +Saving/GitService/Description: Aquests paràmetres només s'utilitzen quan es desa a <<service-name>> +Saving/GitService/Filename: Nom del fitxer destinació (per exemple `index.html`) +Saving/GitService/GitHub/Caption: Gestor de baixades de ~GitHub +Saving/GitService/GitHub/Password: Contrasenya, clau OAUTH o clau d'accés personal (veieu els detalls a la [[pàgina d'ajuda del GitHub|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] ) +Saving/GitService/GitLab/Caption: Gestor de baixades de ~GitLab +Saving/GitService/GitLab/Password: Clau d'accés personal de l'API (veieu els detalls a la [[pàgina d'ajuda del GitLab|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] ) +Saving/GitService/Path: Ruta del fitxer destinació (e.g. `/wiki/`) +Saving/GitService/Repo: Repositori destinació (e.g. `Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: URL de l'API del servidor +Saving/GitService/UserName: NomDUsuari Saving/Heading: S'està desant Saving/Hint: Configuració que s’utilitza per desar tot el TiddlyWiki com a un únic fitxer amb un mòdul de desar Saving/TiddlySpot/Advanced/Heading: Paràmetres avançats @@ -116,7 +128,7 @@ Settings/AutoSave/Disabled/Description: No desis els canvis de forma automàtica Settings/AutoSave/Enabled/Description: Desa els canvis de forma automàtica Settings/AutoSave/Hint: Desa els canvis de forma automàtica mentre s'està editant Settings/CamelCase/Caption: Enllaços wiki tipus CamelCase -Settings/CamelCase/Description: Habilita l'enllaç automàtic de ~CamelCase +Settings/CamelCase/Description: Activa l'enllaç automàtic de ~CamelCase Settings/CamelCase/Hint: Podeu desactivar l’enllaç automàtic de les frases ~CamelCase globalment. Cal que es torni a carregar per tenir efecte Settings/Caption: Paràmetres Settings/DefaultMoreSidebarTab/Caption: Pestanya Més de la barra lateral per omissió @@ -134,8 +146,8 @@ Settings/InfoPanelMode/Sticky/Description: El tauler d’informació del Tiddler Settings/LinkToBehaviour/Caption: Comportament d'obertura del tiddler Settings/LinkToBehaviour/InsideRiver/Hint: Navegació des de //dins de// la cronologia Settings/LinkToBehaviour/OpenAbove: Obre per sobre del tiddler actual -Settings/LinkToBehaviour/OpenAtBottom: Obriu a la part inferior de la cronologia -Settings/LinkToBehaviour/OpenAtTop: Obriu a la part superior de la cronologia +Settings/LinkToBehaviour/OpenAtBottom: Obre a la part inferior de la cronologia +Settings/LinkToBehaviour/OpenAtTop: Obre a la part superior de la cronologia Settings/LinkToBehaviour/OpenBelow: Obre per sota del tiddler actual Settings/LinkToBehaviour/OutsideRiver/Hint: Navegació des de //fora de//la cronologia Settings/MissingLinks/Caption: Enllaços Wiki @@ -144,19 +156,19 @@ Settings/MissingLinks/Hint: Escolliu si voleu enllaçar els tiddlers que encara Settings/NavigationAddressBar/Caption: Barra d'adreces de navegació Settings/NavigationAddressBar/Hint: Comportament de la barra d'adreces en navegar cap a un tiddler: Settings/NavigationAddressBar/No/Description: No actualitzis la barra d'adreces -Settings/NavigationAddressBar/Permalink/Description: Inclou el tiddler destí -Settings/NavigationAddressBar/Permaview/Description: Inclou el tiddler destí i la seqùència actual +Settings/NavigationAddressBar/Permalink/Description: Inclou el tiddler destinació +Settings/NavigationAddressBar/Permaview/Description: Inclou el tiddler destinació i la seqùència actual Settings/NavigationHistory/Caption: Històrial de navegació Settings/NavigationHistory/Hint: Actualitza l'històrial del navegador en navegar cap a un tiddler: Settings/NavigationHistory/No/Description: No actualitzis la cronologia Settings/NavigationHistory/Yes/Description: Actualitza la cronologia Settings/NavigationPermalinkviewMode/Caption: Mode enllaç permanent/vista permanent -Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Copieu l’URL de l'enllaç permanent/vista permanent al portapapers +Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Copia l’URL de l'enllaç permanent/vista permanent al portapapers Settings/NavigationPermalinkviewMode/Hint: Trieu com es gestiona l'enllaç permanent/vista permanent Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Actualitzeu la barra d’adreça amb l’URL de l'enllaç permanent/vista permanent -Settings/PerformanceInstrumentation/Caption: Instrumentació del rendiment -Settings/PerformanceInstrumentation/Description: Habilita la instrumentació del rendiment -Settings/PerformanceInstrumentation/Hint: Mostra estadístiques de rendiment a la consola del desenvolupador del navegador. Cal tornar-ho a carregar per que tingui efecte +Settings/PerformanceInstrumentation/Caption: Instruments del rendiment +Settings/PerformanceInstrumentation/Description: Activa els instruments del rendiment +Settings/PerformanceInstrumentation/Hint: Mostra les estadístiques de rendiment a la consola del desenvolupador del navegador. Cal tornar-ho a carregar per que tingui efecte Settings/TitleLinks/Caption: Títols dels Tiddlers Settings/TitleLinks/Hint: Mostra opcionalment els títols de tiddler com a enllaços Settings/TitleLinks/No/Description: No mostris els títols dels tiddlers com a enllaços diff --git a/languages/ca-ES/Docs/PaletteColours.multids b/languages/ca-ES/Docs/PaletteColours.multids index 0247f21d2..83a739405 100644 --- a/languages/ca-ES/Docs/PaletteColours.multids +++ b/languages/ca-ES/Docs/PaletteColours.multids @@ -20,7 +20,7 @@ dragger-foreground: Primer plà de l'arrossegador dropdown-background: Fons de la llista desplegable dropdown-border: Vora de la llista desplegable dropdown-tab-background: Fons de la pestanya de la llista desplegable -dropdown-tab-background-selected: Fons de la pestanya de la llista desplegable per les etiquetes seleccionades +dropdown-tab-background-selected: Fons de la pestanya de la llista desplegable per les pestanyes seleccionades dropzone-background: Fons de la zona d'aterratge external-link-background: Fons de l'enllaç extern external-link-background-hover: Fons de la bafarada de l'enllaç extern @@ -33,7 +33,7 @@ message-background: Fons de la capsa de text message-border: Vora de la capsa de text message-foreground: Primer plà de la capsa de text modal-backdrop: Zona d'aterratge dels diàlegs modals -modal-background: Fons dels diàlegs modals per les etiquetes seleccionades +modal-background: Fons dels diàlegs modals modal-border: Vora dels diàlegs modals modal-footer-background: Fons del peu dels diàlegs modals modal-footer-border: Vora del peu dels diàlegs modals @@ -55,23 +55,23 @@ sidebar-foreground-shadow: Ombra del primer plà de la barra lateral sidebar-muted-foreground: Primer plà de la barra lateral silenciada sidebar-muted-foreground-hover: Primer plà de la bafarada de la barra lateral silenciada sidebar-tab-background: Fons de la pestanya de la barra lateral -sidebar-tab-background-selected: Fons de la pestanya de la barra lateral per les etiquetes seleccionades -sidebar-tab-border: Vora de la pestanya de la barra lateraletiqueta -sidebar-tab-border-selected: Vora de la pestanya de la barra lateral per les etiquetes seleccionadesetiqueta +sidebar-tab-background-selected: Fons de la pestanya de la barra lateral per les pestanyes seleccionades +sidebar-tab-border: Vora de la pestanya de la barra lateral +sidebar-tab-border-selected: Vora de la pestanya de la barra lateral per les pestanyes seleccionades sidebar-tab-divider: Divisor de la pestanya de la barra lateral sidebar-tab-foreground: Primer plà de la pestanya de la barra lateral -sidebar-tab-foreground-selected: Primer plà de la pestanya de la barra lateral per les etiquetes seleccionades +sidebar-tab-foreground-selected: Primer plà de la pestanya de la barra lateral per les pestanyes seleccionades sidebar-tiddler-link-foreground: Primer plà de l'enllaç del tiddler de la barra lateral sidebar-tiddler-link-foreground-hover: Primer plà de la bafarada de l'enllaç del tiddler de la barra lateral site-title-foreground: Primer pla del títol del lloc static-alert-foreground: Primer plà de l'avís estàtic tab-background: Fons de la pestanya -tab-background-selected: Fons de la pestanya per les etiquetes seleccionades +tab-background-selected: Fons de la pestanya per les pestanyes seleccionades tab-border: Vora de la pestanya -tab-border-selected: Vora de la pestanya per les etiquetes seleccionades +tab-border-selected: Vora de la pestanya per les pestanyes seleccionades tab-divider: Divisor de la pestanya tab-foreground: Primer plà de la pestanya -tab-foreground-selected: Primer plà de la pestanya per les etiquetes seleccionades +tab-foreground-selected: Primer plà de la pestanya per les pestanyes seleccionades table-border: Vora de la taula table-footer-background: Fons del peu de la taula table-header-background: Fons de la capçalera de la taula diff --git a/languages/ca-ES/EditTemplate.multids b/languages/ca-ES/EditTemplate.multids index 6af9caad0..452715f03 100644 --- a/languages/ca-ES/EditTemplate.multids +++ b/languages/ca-ES/EditTemplate.multids @@ -20,7 +20,7 @@ Tags/Add/Placeholder: nom de l'etiqueta Tags/Dropdown/Caption: llista d'etiquetes Tags/Dropdown/Hint: Mostra la llista d'etiquetes Title/BadCharacterWarning: Avís: eviteu qualsevol dels caràcters <<bad-chars>> al títol d'un tiddler -Title/Exists/Prompt: El tiddler destí ja existeix +Title/Exists/Prompt: El tiddler destinació ja existeix Title/References/Prompt: Les referències següents cap aquest tiddler no s'actualitzaran automàticament: Title/Relink/Prompt: Actualitza ''<$text text=<<fromTitle>>/>'' cap a ''<$text text=<<toTitle>>/>'' a les //etiquetes// i a la //lista// de camps d'altres tiddlers Type/Delete/Caption: suprimeix el tipus de contingut diff --git a/languages/ca-ES/Misc.multids b/languages/ca-ES/Misc.multids index dac9291f7..12e82a572 100644 --- a/languages/ca-ES/Misc.multids +++ b/languages/ca-ES/Misc.multids @@ -33,10 +33,10 @@ Error/SavingToTWEdit: S'ha produït un error en desar a TWEdit Error/WhileSaving: S'ha produït un error en desar Error/XMLHttpRequest: Codi d'error XMLHttpRequest InternalJavaScriptError/Hint: Bé, això és compromès. Es recomana que reinicieu TiddlyWiki actualitzant el navegador -InternalJavaScriptError/Title: Error de JavaScript intern +InternalJavaScriptError/Title: S'ha produït un error intern de JavaScript InvalidFieldName: Hi ha caràcters il·legals al nom del camp "<$text text=<<fieldName>>/>". Els camps només poden utilitzar minúscules, digits i els caràcters subratllat (`_`), guió (`-`) i punt (`.`) LazyLoadingWarning: <p>S'està tractant de carregar contingut extern de ''<$text text={{!!_canonical_uri}}/>''</p><p>Si aquest missatge no desapareix, o bé el tipus de contingut del tiddler no coincideix amb el tipus de contingut extern o bé esteu utilitzant un navegador que no admet contingut extern per als wikis carregats com a fitxers independents. Mireu https://tiddlywiki.com/#ExternalText</p> -LoginToTiddlySpace: Inicieu sessió a TiddlySpace +LoginToTiddlySpace: Inicieu la sessió a TiddlySpace Manager/Controls/FilterByTag/None: (cap) Manager/Controls/FilterByTag/Prompt: Filtra per etiqueta: Manager/Controls/Order/Prompt: Ordre invers From 9244a2f4fd89da9a9d6dc112568905cc4551b26f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 9 Aug 2019 10:30:26 +0100 Subject: [PATCH 0274/2376] Bring over remaining scripts from build.jermolene.github.io --- bin/npm-publish.sh | 7 +++++++ bin/quick-bld.sh | 8 ++++++++ bin/verbump.sh | 17 +++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100755 bin/npm-publish.sh create mode 100755 bin/quick-bld.sh create mode 100755 bin/verbump.sh diff --git a/bin/npm-publish.sh b/bin/npm-publish.sh new file mode 100755 index 000000000..c37de5c24 --- /dev/null +++ b/bin/npm-publish.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# publish to npm + +./bin/clean.sh + +npm publish || exit 1 diff --git a/bin/quick-bld.sh b/bin/quick-bld.sh new file mode 100755 index 000000000..bc11208f2 --- /dev/null +++ b/bin/quick-bld.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Abbreviated build script for building prerelease + +tiddlywiki editions/prerelease \ + --verbose \ + --build favicon index \ + || exit 1 diff --git a/bin/verbump.sh b/bin/verbump.sh new file mode 100755 index 000000000..ae4b0da80 --- /dev/null +++ b/bin/verbump.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Bump to a new version number + +if [ -z "$1" ] + then + echo "Missing version (eg '5.1.38-prerelease')" + exit 1 +fi + +# Set the new version number (will also commit and tag the release) + +npm version $1 -m "Version number update for $1" || exit 1 + +# Make sure our tags are pushed to the origin server + +git push origin --tags || exit 1 From 762810361f7def1c2070f4dfc05e44be6896485a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 9 Aug 2019 14:08:13 +0100 Subject: [PATCH 0275/2376] Docs: Update the build docs --- .../Releasing a new version of TiddlyWiki.tid | 40 +++++++++++-------- .../Releasing new content for TiddlyWiki.tid | 12 +++--- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index 6070d5d32..8b6e62e42 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -1,27 +1,35 @@ +created: 20190809095728085 +modified: 20190809123445125 title: Releasing a new version of TiddlyWiki +type: text/vnd.tiddlywiki -# Verify the version numbers in [[$:/config/OfficialPluginLibrary]] (both in `editions/tw5.com` and `editions/prerelease/tiddlers/system`) +!! Preparation on master + +# Update `master` from `tiddlywiki-com` +# Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `editions/tw5.com` # Move the latest release note from the prerelease edition into the tw5.com edition # Adjust the release date and the ''released'' field of the latest release tiddler (eg, [[Release 5.1.3]]) # Ensure [[TiddlyWiki Releases]] has the new version as the default tab # Adjust the modified time of HelloThere -# Make sure ''Jermolene/TiddlyWiki5'' is fully committed +# Make sure ''Jermolene/TiddlyWiki5-master'' is fully committed + +!! Update Readmes + # Edit `package.json` to the new version number -# Run `../build.jermolene.github.io/readme-bld.sh` to build the readme files -# Commit the new readme files in `TiddlyWiki5` +# Run `./bin/readme-bld.sh` to build the readme files +# Commit the new readme files to `master` # Restore `package.json` to the previous version number -# Run `../build.jermolene.github.io/verbump "5.1.3"` (substituting the correct version number) to update the version number, assign it a tag -# Run `../build.jermolene.github.io/npm-publish.sh` to publish the release to npm -# Update the `package.json` for `build.jermolene.github.io` to the new version + +!! Make New Release + +# Run `./bin/verbump "5.1.3"` (substituting the correct version number) to update the version number, assign it a tag +# Run `./bin/npm-publish.sh` to publish the release to npm # Verify that the new release of TiddlyWiki is available at https://www.npmjs.org/package/tiddlywiki -# Change current directory to the `build.jermolene.github.io` directory -# Run `npm install` to install the correct version of TiddlyWiki -# Change current directory to the `TiddlyWiki5` directory -# Run `../build.jermolene.github.io/bld.sh` to build the content files -# Verify that the files in the `jermolene.github.io` directory are correct -# Run `../build.jermolene.github.io/github-push.sh` to push the new files to GitHub # Tweet the release with the text "TiddlyWiki v5.x.x released to https://tiddlywiki.com #newtiddlywikirelease" -# Preparation for the next release: -## Adjust version number in [[$:/config/OfficialPluginLibrary]] (both in `editions/tw5.com` and `editions/prerelease/tiddlers/system`) and [[$:/config/LocalPluginLibrary]] -## Adjust version number in https://github.com/Jermolene/build.jermolene.github.io in `prerelease-bld.sh`, `bld.sh` and `make-library-bld.sh` +!! Preparation for the next release + +# Adjust version number in package.json +# Adjust version number in [[$:/config/OfficialPluginLibrary]] (both in `editions/tw5.com` and `editions/prerelease/tiddlers/system`) and [[$:/config/LocalPluginLibrary]] +# Create the release note for the new release +# Adjust version number in https://github.com/Jermolene/build.jermolene.github.io in `prerelease-bld.sh`, `bld.sh` and `make-library-bld.sh` diff --git a/editions/dev/tiddlers/build/Releasing new content for TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing new content for TiddlyWiki.tid index 662fbdf41..78230c40e 100644 --- a/editions/dev/tiddlers/build/Releasing new content for TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing new content for TiddlyWiki.tid @@ -1,8 +1,8 @@ +created: 20190809094421578 +modified: 20190809104210288 title: Releasing new content for TiddlyWiki +type: text/vnd.tiddlywiki -# Change current directory to the `TiddlyWiki5` directory -# Run `../build.jermolene.github.io/bld.sh` to build the content files -# Run `../build.jermolene.github.io/readme-bld.sh` to build the readmes -# Commit the readmes to `TiddlyWiki5` and `build.jermolene.github.io` if necessary -# Verify that the files in the `jermolene.github.io` directory are correct -# Run `../build.jermolene.github.io/github-push.sh` to push the new files to GitHub +To update https://tiddlywiki.com with new content, make a Pull Request with the updated tiddlers to the `tiddlywiki-com` branch. As soon as the PR is merged, the [[Continuous Deployment]] system will automatically rebuild the site. + +Note that the PR should only include updates within the `editions` folder of the repo. \ No newline at end of file From 2a3ea144373b347138fbf6a37f8c2236309fadf3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 9 Aug 2019 14:09:15 +0100 Subject: [PATCH 0276/2376] Docs: More updates to build docs --- .../Releasing a new version of TiddlyWiki.tid | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index 8b6e62e42..606420172 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -5,19 +5,19 @@ type: text/vnd.tiddlywiki !! Preparation on master -# Update `master` from `tiddlywiki-com` +# Update ''master'' with changes from ''tiddlywiki-com'' # Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `editions/tw5.com` # Move the latest release note from the prerelease edition into the tw5.com edition # Adjust the release date and the ''released'' field of the latest release tiddler (eg, [[Release 5.1.3]]) # Ensure [[TiddlyWiki Releases]] has the new version as the default tab # Adjust the modified time of HelloThere -# Make sure ''Jermolene/TiddlyWiki5-master'' is fully committed +# Make sure ''master'' is fully committed !! Update Readmes # Edit `package.json` to the new version number # Run `./bin/readme-bld.sh` to build the readme files -# Commit the new readme files to `master` +# Commit the new readme files to ''master'' # Restore `package.json` to the previous version number !! Make New Release @@ -25,11 +25,19 @@ type: text/vnd.tiddlywiki # Run `./bin/verbump "5.1.3"` (substituting the correct version number) to update the version number, assign it a tag # Run `./bin/npm-publish.sh` to publish the release to npm # Verify that the new release of TiddlyWiki is available at https://www.npmjs.org/package/tiddlywiki + +!! Update tiddlywiki.com release + +# Update ''tiddlywiki-com'' from ''master'' and push to ~GitHub + +!! Cleaning Up + # Tweet the release with the text "TiddlyWiki v5.x.x released to https://tiddlywiki.com #newtiddlywikirelease" -!! Preparation for the next release +!! Preparation for the next release in ''master'' -# Adjust version number in package.json +# Adjust version number in `package.json` # Adjust version number in [[$:/config/OfficialPluginLibrary]] (both in `editions/tw5.com` and `editions/prerelease/tiddlers/system`) and [[$:/config/LocalPluginLibrary]] # Create the release note for the new release # Adjust version number in https://github.com/Jermolene/build.jermolene.github.io in `prerelease-bld.sh`, `bld.sh` and `make-library-bld.sh` +# Commit changes to ''master'' and push to ~GitHub From ad175e222b691d4d03aaf7f8ffb286b65abe3416 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 9 Aug 2019 14:16:39 +0100 Subject: [PATCH 0277/2376] Preparing for v5.1.20 release --- core/wiki/config/OfficialPluginLibrary.tid | 2 +- .../tiddlers/build/Releasing a new version of TiddlyWiki.tid | 1 + editions/tw5.com/tiddlers/hellothere/HelloThere.tid | 2 +- .../tiddlers/releasenotes}/Release 5.1.20.tid | 5 +++-- readme.md | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) rename editions/{prerelease/tiddlers => tw5.com/tiddlers/releasenotes}/Release 5.1.20.tid (99%) diff --git a/core/wiki/config/OfficialPluginLibrary.tid b/core/wiki/config/OfficialPluginLibrary.tid index ccbaf94dc..b43c69610 100644 --- a/core/wiki/config/OfficialPluginLibrary.tid +++ b/core/wiki/config/OfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/library/v5.1.19/index.html +url: https://tiddlywiki.com/library/v5.1.20/index.html caption: {{$:/language/OfficialPluginLibrary}} {{$:/language/OfficialPluginLibrary/Hint}} diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index 606420172..f0228bb7e 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -37,6 +37,7 @@ type: text/vnd.tiddlywiki !! Preparation for the next release in ''master'' # Adjust version number in `package.json` +# Adjust version number in `bin/build-site.sh` # Adjust version number in [[$:/config/OfficialPluginLibrary]] (both in `editions/tw5.com` and `editions/prerelease/tiddlers/system`) and [[$:/config/LocalPluginLibrary]] # Create the release note for the new release # Adjust version number in https://github.com/Jermolene/build.jermolene.github.io in `prerelease-bld.sh`, `bld.sh` and `make-library-bld.sh` diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid index c5342909f..a6079ab1d 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid @@ -1,6 +1,6 @@ created: 20130822170200000 list: [[A Gentle Guide to TiddlyWiki]] [[Discover TiddlyWiki]] [[Some of the things you can do with TiddlyWiki]] [[Ten reasons to switch to TiddlyWiki]] Examples [[What happened to the original TiddlyWiki?]] [[HelloThumbnail - TWEUM2017]] -modified: 20181220163418974 +modified: 20190809141328809 tags: TableOfContents title: HelloThere type: text/vnd.tiddlywiki diff --git a/editions/prerelease/tiddlers/Release 5.1.20.tid b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.20.tid similarity index 99% rename from editions/prerelease/tiddlers/Release 5.1.20.tid rename to editions/tw5.com/tiddlers/releasenotes/Release 5.1.20.tid index 2babb8d9f..a56247222 100644 --- a/editions/prerelease/tiddlers/Release 5.1.20.tid +++ b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.20.tid @@ -1,6 +1,7 @@ caption: 5.1.20 -created: 20181220163418974 -modified: 20190305165612365 +created: 20190809141328809 +modified: 20190809141328809 +released: 20190809141328809 tags: ReleaseNotes title: Release 5.1.20 type: text/vnd.tiddlywiki diff --git a/readme.md b/readme.md index d26bd8fdb..e7c813301 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,7 @@ <p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is a complete interactive wiki in <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/JavaScript.html">JavaScript</a>. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h1 class="">Join the Community</h1><p> <h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWiki</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li><strong>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</strong></li></ul><h2 class="">Developers</h2><ul><li>The <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiDev.html">TiddlyWikiDev</a> group for developers: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWikiDev</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/tiddlywikidocs</a> </p> -</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><p><code>npm install -g tiddlywiki</code></p><p>If it fails with an error you may need to re-run the command as an administrator:</p><p><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</p></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><p><code>tiddlywiki --version</code></p></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.20-prerelease"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> +</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><p><code>npm install -g tiddlywiki</code></p><p>If it fails with an error you may need to re-run the command as an administrator:</p><p><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</p></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><p><code>tiddlywiki --version</code></p></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.20"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> <g fill-rule="evenodd"> <path d="M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z"></path> </g> From f49c55fe3c6c250fb46372b43d6b8f73fa532790 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 9 Aug 2019 14:17:35 +0100 Subject: [PATCH 0278/2376] Version number update for 5.1.20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 807303164..d9c17b57c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.20-prerelease", + "version": "5.1.20", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From a986e4f7d60030ece39b6ed5ec3313e64f937d17 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 9 Aug 2019 15:38:36 +0100 Subject: [PATCH 0279/2376] Prepare for v5.1.21-prerelease --- bin/build-site.sh | 2 +- core/wiki/config/OfficialPluginLibrary.tid | 2 +- .../Releasing a new version of TiddlyWiki.tid | 1 + .../prerelease/tiddlers/Release 5.1.21.tid | 50 ++++++++++++++++++ .../system/PrereleaseLocalPluginLibrary.tid | 2 +- .../PrereleaseOfficialPluginLibrary.tid | 2 +- .../tiddlers/images/New Release Banner.jpg | Bin 44301 -> 32772 bytes package.json | 2 +- 8 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 editions/prerelease/tiddlers/Release 5.1.21.tid diff --git a/bin/build-site.sh b/bin/build-site.sh index f6cc2dfea..5cb0d13a3 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -5,7 +5,7 @@ # Default to the current version number for building the plugin library if [ -z "$TW5_BUILD_VERSION" ]; then - TW5_BUILD_VERSION=v5.1.19 + TW5_BUILD_VERSION=v5.1.20 fi echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]" diff --git a/core/wiki/config/OfficialPluginLibrary.tid b/core/wiki/config/OfficialPluginLibrary.tid index b43c69610..f2ed50c1f 100644 --- a/core/wiki/config/OfficialPluginLibrary.tid +++ b/core/wiki/config/OfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/library/v5.1.20/index.html +url: https://tiddlywiki.com/library/v5.1.21/index.html caption: {{$:/language/OfficialPluginLibrary}} {{$:/language/OfficialPluginLibrary/Hint}} diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index f0228bb7e..f20b8fcae 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -39,6 +39,7 @@ type: text/vnd.tiddlywiki # Adjust version number in `package.json` # Adjust version number in `bin/build-site.sh` # Adjust version number in [[$:/config/OfficialPluginLibrary]] (both in `editions/tw5.com` and `editions/prerelease/tiddlers/system`) and [[$:/config/LocalPluginLibrary]] +# Adjust new release banner # Create the release note for the new release # Adjust version number in https://github.com/Jermolene/build.jermolene.github.io in `prerelease-bld.sh`, `bld.sh` and `make-library-bld.sh` # Commit changes to ''master'' and push to ~GitHub diff --git a/editions/prerelease/tiddlers/Release 5.1.21.tid b/editions/prerelease/tiddlers/Release 5.1.21.tid new file mode 100644 index 000000000..2aca5e6a2 --- /dev/null +++ b/editions/prerelease/tiddlers/Release 5.1.21.tid @@ -0,0 +1,50 @@ +caption: 5.1.21 +created: 20190809153802329 +modified: 20190809153802329 +tags: ReleaseNotes +title: Release 5.1.21 +type: text/vnd.tiddlywiki + +//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.20...v5.1.21]]// + +!! Plugin Improvements + +New and improved plugins: + +* + +!! Translation Improvements + +New and improved translations: + +* + +!! Performance Improvements + +* + +!! Usability Improvements + +* + +!! Hackability Improvements + +* + +!! Bug Fixes + +* + +!! Node.js Bug Fixes and Improvements + +* + +!! Developer Bug Fixes and Improvements + +* + +! Contributors + +[[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: + +* diff --git a/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid b/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid index 88301fd3e..6b3ecb0f9 100644 --- a/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid +++ b/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/LocalPluginLibrary tags: $:/tags/PluginLibrary -url: http://127.0.0.1:8080/prerelease/library/v5.1.20/index.html +url: http://127.0.0.1:8080/prerelease/library/v5.1.21/index.html caption: {{$:/language/OfficialPluginLibrary}} (Prerelease Local) A locally installed version of the official ~TiddlyWiki plugin library at tiddlywiki.com for testing and debugging. //Requires a local web server to share the library// diff --git a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid index 7a687e363..63029fddc 100644 --- a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid +++ b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/prerelease/library/v5.1.20/index.html +url: https://tiddlywiki.com/prerelease/library/v5.1.21/index.html caption: {{$:/language/OfficialPluginLibrary}} (Prerelease) The prerelease version of the official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.jpg b/editions/tw5.com/tiddlers/images/New Release Banner.jpg index dd31b43f0eedc4e842fbe07e08fa7ad0188a6e53..98cd725194266403c14b983f812f4af6aa9a699a 100644 GIT binary patch literal 32772 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 VPapdHe-}&eUk=Ux7stQF{|zo;ipc-~ literal 44301 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 diff --git a/package.json b/package.json index d9c17b57c..d05ad4db1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.20", + "version": "5.1.21-prerelease", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From bab1bca4855d49a637c8cea8db990c7966e9ec55 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 14 Aug 2019 23:00:01 +0100 Subject: [PATCH 0280/2376] Coding style tweaks --- core/modules/server/routes/get-index.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/core/modules/server/routes/get-index.js b/core/modules/server/routes/get-index.js index 08021af64..c90341925 100644 --- a/core/modules/server/routes/get-index.js +++ b/core/modules/server/routes/get-index.js @@ -12,22 +12,21 @@ GET / /*global $tw: false */ "use strict"; -var zlib = require('zlib'); +var zlib = require("zlib"); exports.method = "GET"; exports.path = /^\/$/; exports.handler = function(request,response,state) { - var acceptEncoding = request.headers['accept-encoding']; - if (!acceptEncoding) { acceptEncoding = ''; } - - var text = state.wiki.renderTiddler(state.server.get("root-render-type"),state.server.get("root-tiddler")); - - var responseHeaders = { + var acceptEncoding = request.headers["accept-encoding"]; + if(!acceptEncoding) { + acceptEncoding = ""; + } + var text = state.wiki.renderTiddler(state.server.get("root-render-type"),state.server.get("root-tiddler")), + responseHeaders = { "Content-Type": state.server.get("root-serve-type") }; - /* If the gzip=yes flag for `listen` is set, check if the user agent permits compression. If so, compress our response. Note that we use the synchronous @@ -36,15 +35,14 @@ exports.handler = function(request,response,state) { */ if(state.server.enableGzip) { if (/\bdeflate\b/.test(acceptEncoding)) { - responseHeaders['Content-Encoding'] = 'deflate'; + responseHeaders["Content-Encoding"] = "deflate"; text = zlib.deflateSync(text); } else if (/\bgzip\b/.test(acceptEncoding)) { - responseHeaders['Content-Encoding'] = 'gzip'; + responseHeaders["Content-Encoding"] = "gzip"; text = zlib.gzipSync(text); } } - - response.writeHead(200, responseHeaders); + response.writeHead(200,responseHeaders); response.end(text); }; From 0402dbd48df33850a8333f870481616ef8a74337 Mon Sep 17 00:00:00 2001 From: Rob Hoelz <rob@hoelz.ro> Date: Thu, 22 Aug 2019 03:24:40 -0500 Subject: [PATCH 0281/2376] Pass pathFilters as an array (#4174) * Pass pathFilters as an array Otherwise, when we try to iterate over pathFilters in the filesystem utils module, we end up iterating over each character in the filter string, which ends up generating 'Filter error_ Missing [ in filter expression.tid' as the tiddler's filename Fixes GH #4173 * Allow for multiple path filters to be specified ...via $:/config/FileSystemPaths, split by newlines --- plugins/tiddlywiki/filesystem/filesystemadaptor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index 1b4ddf18f..a346a6606 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -53,7 +53,7 @@ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { // Otherwise, we'll need to generate it fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ directory: $tw.boot.wikiTiddlersPath, - pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths"), + pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"), wiki: this.wiki }); $tw.boot.files[title] = fileInfo; From fada96651e2834992d93c226ddbbb09e71cccd71 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 24 Aug 2019 11:27:20 +0200 Subject: [PATCH 0282/2376] Update "Open" tab to use tv-config-story-list (#4189) --- core/ui/SideBar/Open.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/SideBar/Open.tid b/core/ui/SideBar/Open.tid index 6ee386770..1dac11b19 100644 --- a/core/ui/SideBar/Open.tid +++ b/core/ui/SideBar/Open.tid @@ -6,7 +6,7 @@ caption: {{$:/language/SideBar/Open/Caption}} \define lingo-base() $:/language/CloseAll/ \define drop-actions() -<$action-listops $tiddler="$:/StoryList" $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/> +<$action-listops $tiddler=<<tv-config-story-list>> $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/> \end \define placeholder() From 67066fe86e2e40e1830579b6b3cab4c2fc281e91 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Sat, 24 Aug 2019 06:35:03 -0400 Subject: [PATCH 0283/2376] Improve handling for titles starting with `+-~=` (#4084) (#4087) * $tw.utils.stringifyList will wrap tiddlers starting with `+-~=` in brackets. --- boot/boot.js | 10 +++++----- editions/test/tiddlers/tests/test-utils.js | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 444bf5c32..de5cc259b 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -314,13 +314,13 @@ $tw.utils.parseDate = function(value) { // Stringify an array of tiddler titles into a list string $tw.utils.stringifyList = function(value) { if($tw.utils.isArray(value)) { - var result = []; - for(var t=0; t<value.length; t++) { + var result = new Array(value.length); + for(var t=0, l=value.length; t<l; t++) { var entry = value[t] || ""; - if(entry.indexOf(" ") !== -1) { - result.push("[[" + entry + "]]"); + if(entry.indexOf(" ") !== -1 || "+-~=".indexOf(entry[0]) !== -1) { + result[t] = "[[" + entry + "]]"; } else { - result.push(entry); + result[t] = entry; } } return result.join(" "); diff --git a/editions/test/tiddlers/tests/test-utils.js b/editions/test/tiddlers/tests/test-utils.js index fd924e1bf..e7af600ed 100644 --- a/editions/test/tiddlers/tests/test-utils.js +++ b/editions/test/tiddlers/tests/test-utils.js @@ -25,6 +25,17 @@ describe("Utility tests", function() { expect(psa(" [[Tidd\u00a0ler8]] two ")).toEqual(["Tidd\u00a0ler8","two"]); }); + it("should handle stringifying a string array", function() { + var str = $tw.utils.stringifyList; + expect(str([])).toEqual(""); + expect(str(["Tiddler8"])).toEqual("Tiddler8"); + expect(str(["Tiddler8 "])).toEqual("[[Tiddler8 ]]"); + expect(str(["A+B", "A-B", "A=B"])).toEqual("A+B A-B A=B"); + expect(str(["A B"])).toEqual("[[A B]]"); + expect(str(["+T", "-T", "~T", "=T", "$T"])).toEqual("[[+T]] [[-T]] [[~T]] [[=T]] $T"); + expect(str(["A", "", "B"])).toEqual("A B"); + }); + it("should handle formatting a date string", function() { var fds = $tw.utils.formatDateString, // nov is month: 10! From a170210069bbec265992b365a61e0722b480ab1d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 24 Aug 2019 11:39:00 +0100 Subject: [PATCH 0284/2376] Fix crash with action-deletefield and missing tiddler attribute Fixes #4188 --- core/modules/widgets/action-deletefield.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/action-deletefield.js b/core/modules/widgets/action-deletefield.js index ffe4ef5d0..45425bf4e 100644 --- a/core/modules/widgets/action-deletefield.js +++ b/core/modules/widgets/action-deletefield.js @@ -59,7 +59,7 @@ DeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) { tiddler = this.wiki.getTiddler(self.actionTiddler), removeFields = {}, hasChanged = false; - if(this.actionField) { + if(this.actionField && tiddler) { removeFields[this.actionField] = undefined; if(this.actionField in tiddler.fields) { hasChanged = true; From 654eda02c6f138180f03951792753d00e90b7576 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 24 Aug 2019 12:17:17 +0100 Subject: [PATCH 0285/2376] Remove reference to stacked story view from prerelease introduction It's confusing --- .../tiddlers/system/TiddlyWiki Pre-release.tid | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/editions/prerelease/tiddlers/system/TiddlyWiki Pre-release.tid b/editions/prerelease/tiddlers/system/TiddlyWiki Pre-release.tid index 682dad792..a1fa201dc 100644 --- a/editions/prerelease/tiddlers/system/TiddlyWiki Pre-release.tid +++ b/editions/prerelease/tiddlers/system/TiddlyWiki Pre-release.tid @@ -7,15 +7,3 @@ This is a pre-release build of TiddlyWiki, [[also available in empty form|https: <h1><$text text=<<currentTiddler>>/></h1> <$transclude mode="block"/> </$list> - -! Features held back for later release - -These unfinished features are included in this prerelease build, but are not planned for inclusion in the next release. - -* <$button> -<$action-setfield $tiddler="$:/view" text="stacked"/> -Set "Stacked" story view -</$button> <$button> -<$action-setfield $tiddler="$:/view" text="classic"/> -Revert -</$button> From 8d3dfdebe3c817e20c52b4965041d318bf89da79 Mon Sep 17 00:00:00 2001 From: StefanSTFG <54553152+StefanSTFG@users.noreply.github.com> Date: Tue, 27 Aug 2019 18:09:23 +0200 Subject: [PATCH 0286/2376] Signing the CLA (#4206) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 8f7f3e2e1..17492465a 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -363,3 +363,5 @@ Dong Zhihong, @donmor, 2019/05/29 Joshua Stubbs, @LordRatte, 2019/05/31 Robin Munn, @rmunn, 2019/06/16 + +Stefan Schuster-Teupke, @StefanSTFG, 2019/08/26 From 990619b63499bcc6934fcff11dfe64f75bedcedb Mon Sep 17 00:00:00 2001 From: StefanSTFG <54553152+StefanSTFG@users.noreply.github.com> Date: Tue, 27 Aug 2019 18:10:00 +0200 Subject: [PATCH 0287/2376] Fixed 3 typos in the example in line 88 (#4207) 1. Removed closing square bracket after <currentTiddler> 2. Changed capital 'P' in addprefix 3. Added missing slash at the end --- editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid index f53b423a1..d491a8700 100644 --- a/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid @@ -85,6 +85,6 @@ Filtered attribute values are indicated with triple curly braces around a [[Filt This example shows how to add a prefix to a value: ``` -<$text text={{{ [<currentTiddler>]addPrefix[$:/myprefix/]] }}}> +<$text text={{{ [<currentTiddler>addprefix[$:/myprefix/]] }}} /> ``` From 471b73158a887d2f060194741739c1da8b5d44d8 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 28 Aug 2019 14:44:46 +0100 Subject: [PATCH 0288/2376] Fix overeager alerts from core module overwrite upgrade warning This fixes a bug in #3634, and refines the logic so that the warning is only given if the incoming tiddler exists as a shadow tiddler. (In my case I have several draft core modules inactive in my notes wiki and they were erroneously suppressed from the upgrade). --- core/modules/upgraders/system.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/modules/upgraders/system.js b/core/modules/upgraders/system.js index fb6e1dd0c..de7c48f52 100644 --- a/core/modules/upgraders/system.js +++ b/core/modules/upgraders/system.js @@ -35,17 +35,17 @@ exports.upgrade = function(wiki,titles,tiddlers) { } for(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) { var prefix = WARN_IMPORT_PREFIX_LIST[t]; - if(title.substr(0,prefix.length) === prefix) { + if(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) { showAlert = true; messages[title] = $tw.language.getString("Import/Upgrader/System/Warning"); } } } - if(showAlert) { - var logger = new $tw.utils.Logger("import"); - logger.alert($tw.language.getString("Import/Upgrader/System/Alert")); - } }); + if(showAlert) { + var logger = new $tw.utils.Logger("import"); + logger.alert($tw.language.getString("Import/Upgrader/System/Alert")); + } return messages; }; From b88812233c8c731c69fa9208945c50fc67c79999 Mon Sep 17 00:00:00 2001 From: bimlas <bimbalaszlo@gmail.com> Date: Thu, 29 Aug 2019 08:58:17 +0200 Subject: [PATCH 0289/2376] Hidden setting: Sync Polling Interval --- .../Hidden Setting SyncPollingInterval.tid | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid new file mode 100644 index 000000000..7fc05923c --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid @@ -0,0 +1,13 @@ +created: 20191029084535805 +modified: 20191029084535805 +tags: [[Hidden Settings]] +title: Hidden Setting: Sync Polling Interval +type: text/vnd.tiddlywiki + +Specifies the interval at which [[Syncadaptor|https://tiddlywiki.com/dev/#Syncadaptor]] synchronizes tiddlers between the server and the browser. + +Defaults to "60000" (60 * 1000 ms = 1 min). + +Changing needs restart to take effect. + +$:/config/SyncPollingInterval From 83386f34b50a9d93171df133957d489b5de629ef Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 30 Aug 2019 10:42:01 +0100 Subject: [PATCH 0290/2376] Restore performance instrumentation to be disabled by default Fixes #4201 --- core/wiki/config/PerformanceInstrumentation.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/config/PerformanceInstrumentation.tid b/core/wiki/config/PerformanceInstrumentation.tid index e4220f287..ccae6842e 100644 --- a/core/wiki/config/PerformanceInstrumentation.tid +++ b/core/wiki/config/PerformanceInstrumentation.tid @@ -1,2 +1,2 @@ title: $:/config/Performance/Instrumentation -text: yes +text: no From 4ef9ccbab967c127e510100da2790c92fa54039d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 30 Aug 2019 11:44:23 +0200 Subject: [PATCH 0291/2376] Fix bug with wikitext in fieldnames #4218 --- core/ui/EditTemplate/fields.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 806301f01..b37d63236 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -73,7 +73,7 @@ $value={{$:/temp/newfieldvalue}}/> </div> <$list filter="[!is[shadow]!is[system]fields[]search:title{$:/temp/newfieldname}sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField"> <$link to=<<currentField>>> -<<currentField>> +<$text text=<<currentField>>/> </$link> </$list> <div class="tc-dropdown-item"> @@ -81,7 +81,7 @@ $value={{$:/temp/newfieldvalue}}/> </div> <$list filter="[fields[]search:title{$:/temp/newfieldname}sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField"> <$link to=<<currentField>>> -<<currentField>> +<$text text=<<currentField>>/> </$link> </$list> </$linkcatcher> From 82d18ad1fa56adf8e0e08f29e7ec1ba695c2dfbd Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 30 Aug 2019 15:34:26 +0100 Subject: [PATCH 0292/2376] Update release note for v5.1.21 --- .../prerelease/tiddlers/Release 5.1.21.tid | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.21.tid b/editions/prerelease/tiddlers/Release 5.1.21.tid index 2aca5e6a2..6cde13f01 100644 --- a/editions/prerelease/tiddlers/Release 5.1.21.tid +++ b/editions/prerelease/tiddlers/Release 5.1.21.tid @@ -7,44 +7,28 @@ type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.20...v5.1.21]]// -!! Plugin Improvements - -New and improved plugins: - -* - -!! Translation Improvements - -New and improved translations: - -* - -!! Performance Improvements - -* - -!! Usability Improvements - -* +This is a minor bug fix release for [[Release 5.1.20]]. !! Hackability Improvements -* +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4189]] the ''Open'' sidebar tab to use the `tv-config-story-list` variable !! Bug Fixes -* +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/a170210069bbec265992b365a61e0722b480ab1d]] crash with ActionDeleteFieldWidget and a missing ''tiddler'' attribute +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4087]] edge cases where some tiddler lists were not valid when interpreted as a filter +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/471b73158a887d2f060194741739c1da8b5d44d8]] problem with too many alerts when upgrading a wiki containing an overwritten core module +* [[Reverted|https://github.com/Jermolene/TiddlyWiki5/commit/83386f34b50a9d93171df133957d489b5de629ef]] inadvertently switching on performance instrumentation +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4218]] bug with WikiText within field names -!! Node.js Bug Fixes and Improvements +!! Node.js Bug Fixes -* - -!! Developer Bug Fixes and Improvements - -* +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4174]] bug with [[customised tiddler file naming|Customising Tiddler File Naming]] ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: -* +* [[@BurningTreeC|https://github.com/BurningTreeC]] +* [[@flibbles|https://github.com/flibbles]] +* [[@hoelzro|https://github.com/hoelzro]] From 1c5b3e3d8d1adc9dea87281586b2c08f37a4ca7a Mon Sep 17 00:00:00 2001 From: Nils-Hero Lindemann <nilsherolindemann@gmail.com> Date: Fri, 30 Aug 2019 18:20:16 +0200 Subject: [PATCH 0293/2376] Remove duplicate code from transcludeblock parser (#4221) --- core/modules/parsers/wikiparser/rules/transcludeblock.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/modules/parsers/wikiparser/rules/transcludeblock.js b/core/modules/parsers/wikiparser/rules/transcludeblock.js index 1a5df1e06..56a4f63b8 100644 --- a/core/modules/parsers/wikiparser/rules/transcludeblock.js +++ b/core/modules/parsers/wikiparser/rules/transcludeblock.js @@ -27,8 +27,6 @@ exports.init = function(parser) { }; exports.parse = function() { - // Move past the match - this.parser.pos = this.matchRegExp.lastIndex; // Move past the match this.parser.pos = this.matchRegExp.lastIndex; // Get the match details From c81bf497044f89b621e74891a8cc6da9a045c078 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Sep 2019 11:00:09 +0200 Subject: [PATCH 0294/2376] fix "Open" SideBar tab --- core/ui/SideBar/Open.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/SideBar/Open.tid b/core/ui/SideBar/Open.tid index 1dac11b19..14e53ed40 100644 --- a/core/ui/SideBar/Open.tid +++ b/core/ui/SideBar/Open.tid @@ -6,7 +6,7 @@ caption: {{$:/language/SideBar/Open/Caption}} \define lingo-base() $:/language/CloseAll/ \define drop-actions() -<$action-listops $tiddler=<<tv-config-story-list>> $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/> +<$action-listops $tiddler=<<tv-story-list>> $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/> \end \define placeholder() From 8053cf1806cb6108f71d0f525a9342e5e3b169d4 Mon Sep 17 00:00:00 2001 From: markkerrigan <53887732+markkerrigan@users.noreply.github.com> Date: Mon, 2 Sep 2019 07:50:39 -0700 Subject: [PATCH 0295/2376] Signing the CLA (#4197) --- licenses/cla-individual.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 17492465a..01aedbe81 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -364,4 +364,7 @@ Joshua Stubbs, @LordRatte, 2019/05/31 Robin Munn, @rmunn, 2019/06/16 +Mark Kerrigan, @markkerrigan, 2019/08/24 + Stefan Schuster-Teupke, @StefanSTFG, 2019/08/26 + From 2008a617b569851a956c30c0990336cb11aa8a0b Mon Sep 17 00:00:00 2001 From: Nils-Hero Lindemann <nilsherolindemann@gmail.com> Date: Mon, 2 Sep 2019 16:55:24 +0200 Subject: [PATCH 0296/2376] Signing the CLA (#4204) --- licenses/cla-individual.md | 1 + 1 file changed, 1 insertion(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 01aedbe81..916056c08 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -368,3 +368,4 @@ Mark Kerrigan, @markkerrigan, 2019/08/24 Stefan Schuster-Teupke, @StefanSTFG, 2019/08/26 +Nils-Hero Lindemann, @heronils, 2019/08/26 From 1873785ef6832b0d791612c001bfd22123d61b7c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 2 Sep 2019 19:07:45 +0200 Subject: [PATCH 0297/2376] Fix whitespace around field inputs (#4227) --- core/ui/EditTemplate/fields.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index b37d63236..be4e54176 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -58,12 +58,12 @@ $value={{$:/temp/newfieldvalue}}/> <$fieldmangler> <div class="tc-edit-field-add"> <em class="tc-edit"> -<<lingo Fields/Add/Prompt>> +<<lingo Fields/Add/Prompt>>  </em> <span class="tc-edit-field-add-name"> <$edit-text tiddler="$:/temp/newfieldname" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}}/> </span> -<$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> +<$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> <div class="tc-block-dropdown tc-edit-type-dropdown"> <$set name="tv-show-missing-links" value="yes"> @@ -90,7 +90,7 @@ $value={{$:/temp/newfieldvalue}}/> </$reveal> <span class="tc-edit-field-add-value"> <$edit-text tiddler="$:/temp/newfieldvalue" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}}/> -</span> +</span>  <span class="tc-edit-field-add-button"> <$macrocall $name="new-field"/> </span> From ab24d58b1134c83dd72c3bc51b7a32299abad927 Mon Sep 17 00:00:00 2001 From: markstegeman <markstegeman@users.noreply.github.com> Date: Mon, 2 Sep 2019 19:27:06 +0200 Subject: [PATCH 0298/2376] Signing the CLA --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 916056c08..e7af6b888 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -369,3 +369,5 @@ Mark Kerrigan, @markkerrigan, 2019/08/24 Stefan Schuster-Teupke, @StefanSTFG, 2019/08/26 Nils-Hero Lindemann, @heronils, 2019/08/26 + +Mark Stegeman, @markstegeman, 2019/08/31 From dd09266b467173e45d75c172b2e82fd542f682fe Mon Sep 17 00:00:00 2001 From: Mark Stegeman <markstegeman@users.noreply.github.com> Date: Sat, 31 Aug 2019 16:00:34 +0200 Subject: [PATCH 0299/2376] Fix inverted default HTML-class for items in toc and toc-expandable 5d36b484c6 swapped the "emptyValue" and "value" that determine the HTML-class for toc items, but did not change the default values for "itemClassFilter" in "toc" and "toc-expandable" to reflect this. --- core/wiki/macros/toc.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index 7d1ea80ea..7602793f1 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -28,7 +28,7 @@ tags: $:/tags/Macro </ol> \end -\define toc(tag,sort:"",itemClassFilter:" ") +\define toc(tag,sort:"",itemClassFilter:"") <$macrocall $name="toc-body" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> /> \end @@ -87,7 +87,7 @@ tags: $:/tags/Macro <$macrocall $name="toc-linked-expandable-body" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/> \end -\define toc-expandable(tag,sort:"",itemClassFilter:" ",exclude,path) +\define toc-expandable(tag,sort:"",itemClassFilter:"",exclude,path) <$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}> <$set name="excluded" filter="""[enlist<__exclude__>] [<__tag__>]"""> <ol class="tc-toc toc-expandable"> From 6496107a32220e3a2638974489cf7e3035709902 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 3 Sep 2019 09:47:55 +0100 Subject: [PATCH 0300/2376] Docs: Clarify that webserver API get all tiddlers only returns non-system tiddlers Fixes #4212 --- .../tiddlers/webserver/WebServer API_ Get All Tiddlers.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid b/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid index ae39eca7d..98119804c 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid @@ -1,10 +1,10 @@ created: 20181002131215403 -modified: 20181003174025431 +modified: 20190903094711346 tags: [[WebServer API]] title: WebServer API: Get All Tiddlers type: text/vnd.tiddlywiki -Gets an array of all raw tiddlers, excluding the ''text'' field. +Gets an array of all raw non-system tiddlers, excluding the ''text'' field. ``` GET /recipes/default/tiddlers.json @@ -19,4 +19,4 @@ Response: * 200 OK *> `Content-Type: application/json` -*> Body: array of tiddlers in [[TiddlyWeb JSON tiddler format]] +*> Body: array of all non-system tiddlers in [[TiddlyWeb JSON tiddler format]] From 9305881efba1d2ffb2a74f54db2958550c937c14 Mon Sep 17 00:00:00 2001 From: Bimba Laszlo <bimbalaszlo@gmail.com> Date: Tue, 3 Sep 2019 10:49:17 +0200 Subject: [PATCH 0301/2376] Syncadapter uses different conditions for loading and saving (#4211) The description was ambiguous. --- editions/dev/tiddlers/from Heigele and Jurke/Syncadaptor.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/dev/tiddlers/from Heigele and Jurke/Syncadaptor.tid b/editions/dev/tiddlers/from Heigele and Jurke/Syncadaptor.tid index c488b7712..377bc47e5 100644 --- a/editions/dev/tiddlers/from Heigele and Jurke/Syncadaptor.tid +++ b/editions/dev/tiddlers/from Heigele and Jurke/Syncadaptor.tid @@ -7,4 +7,4 @@ title: Syncadaptor A module with ``module-type: syncadaptor`` provides functionality to get a list of tiddlers (this list is provided as ~SkinnyTiddlers, which are normal tiddlers without the text field) and to load, save and delete single tiddlers. A syncadaptor can also provide functions to login and logout so that syncadaptor modules can be used to synchronize tiddlers with a remote server. -The syncer module only uses one syncadaptor and honours a special [[system tiddler|System Tiddlers]] [[$:/config/SyncFilter]] containing a [[filter string|Tags and Filter Mechanism]]. Tiddlers matching this filter string are not synced with a syncadapter. \ No newline at end of file +The syncer module only uses one syncadaptor and honours a special [[system tiddler|System Tiddlers]] [[$:/config/SyncFilter]] containing a [[filter string|Tags and Filter Mechanism]]. Tiddlers matching this filter string are not saved to the server with a syncadapter. It uses the [[WebServer API|https://tiddlywiki.com/#WebServer%20API%3A%20Get%20All%20Tiddlers]] to load modified tiddlers from the server, which returns only non-system tiddlers. \ No newline at end of file From 6fb2a33847bab330a4472ce533729099e814e046 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 3 Sep 2019 10:50:24 +0200 Subject: [PATCH 0302/2376] Add missing foreground color to tc-btn-invisible (#4203) --- themes/tiddlywiki/vanilla/base.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 92b804651..021660e6e 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -431,7 +431,8 @@ button svg, button img, label svg, label img { margin: 0; background: none; border: none; - cursor: pointer; + cursor: pointer; + color: <<colour foreground>>; } .tc-btn-boxed { From 9e67be5b6cf744243c2f0f2a856ac6fb710969f6 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 3 Sep 2019 19:25:00 +0100 Subject: [PATCH 0303/2376] Fix date for "Hidden Setting: Sync Polling Interval" --- .../hiddensettings/Hidden Setting SyncPollingInterval.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid index 7fc05923c..7a3c5ca52 100644 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid @@ -1,5 +1,5 @@ -created: 20191029084535805 -modified: 20191029084535805 +created: 20190903192324700 +modified: 20190903192324700 tags: [[Hidden Settings]] title: Hidden Setting: Sync Polling Interval type: text/vnd.tiddlywiki From 6899be59e249e68e4dbb813ff47126734474833d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 3 Sep 2019 19:26:23 +0100 Subject: [PATCH 0304/2376] Fix date and time for for "Hidden Setting: Sync Polling Interval" --- .../hiddensettings/Hidden Setting SyncPollingInterval.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid index 7fc05923c..7a3c5ca52 100644 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting SyncPollingInterval.tid @@ -1,5 +1,5 @@ -created: 20191029084535805 -modified: 20191029084535805 +created: 20190903192324700 +modified: 20190903192324700 tags: [[Hidden Settings]] title: Hidden Setting: Sync Polling Interval type: text/vnd.tiddlywiki From ef5c53bf9ac82dc6501b60d6a4c4838a9aa036f4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 4 Sep 2019 16:04:33 +0100 Subject: [PATCH 0305/2376] Release note updates --- editions/prerelease/tiddlers/Release 5.1.21.tid | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.21.tid b/editions/prerelease/tiddlers/Release 5.1.21.tid index 6cde13f01..ae7b9b906 100644 --- a/editions/prerelease/tiddlers/Release 5.1.21.tid +++ b/editions/prerelease/tiddlers/Release 5.1.21.tid @@ -11,7 +11,7 @@ This is a minor bug fix release for [[Release 5.1.20]]. !! Hackability Improvements -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4189]] the ''Open'' sidebar tab to use the `tv-config-story-list` variable +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4189]] the ''Open'' sidebar tab to use the `tv-story-list` variable !! Bug Fixes @@ -20,6 +20,9 @@ This is a minor bug fix release for [[Release 5.1.20]]. * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/471b73158a887d2f060194741739c1da8b5d44d8]] problem with too many alerts when upgrading a wiki containing an overwritten core module * [[Reverted|https://github.com/Jermolene/TiddlyWiki5/commit/83386f34b50a9d93171df133957d489b5de629ef]] inadvertently switching on performance instrumentation * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4218]] bug with WikiText within field names +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/dd09266b467173e45d75c172b2e82fd542f682fe]] problem with classes in the [[Table-of-Contents Macros]] +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4203]] missing foreground colour for buttons with class `tc-btn-invisible` +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4227]] whitespace around field editor inputs !! Node.js Bug Fixes @@ -29,6 +32,10 @@ This is a minor bug fix release for [[Release 5.1.20]]. [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: +* [[@bimlas|https://github.com/bimlas]] * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@flibbles|https://github.com/flibbles]] +* [[@heronils|https://github.com/heronils]] * [[@hoelzro|https://github.com/hoelzro]] +* [[@markstegeman|https://github.com/markstegeman]] +* [[@StefanSTFG|https://github.com/StefanSTFG]] From bb036ced933ecb36f5d93693fb4f6e7aa2748df7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 6 Sep 2019 15:40:36 +0100 Subject: [PATCH 0306/2376] Translators plugin: Minor layout fixes --- .../translators/macros/translatableStringEditor.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/tiddlywiki/translators/macros/translatableStringEditor.tid b/plugins/tiddlywiki/translators/macros/translatableStringEditor.tid index a762f9f55..ec1a9585a 100644 --- a/plugins/tiddlywiki/translators/macros/translatableStringEditor.tid +++ b/plugins/tiddlywiki/translators/macros/translatableStringEditor.tid @@ -3,20 +3,20 @@ tags: $:/tags/Macro \define translatableStringEditorInner(tiddlerTitle) <tr> -<td width="1px"> +<td width="250px"> <$link><$list filter=<<shortenTitle>>><$text text=<<currentTiddler>>/></$list></$link> </td> -<td width="100%"> +<td> <$list filter="""$(editFieldsFilter)$""" variable="editorField"> <$edit-text tag="$(editorTagName)$" field=<<editorField>> type="text" class="tc-edit-texteditor" minHeight="10px"/> </$list> </td> -<td width="1px"> +<td width="20px"> <div class="tc-drop-down-wrapper"> <$button class="tc-btn-invisible" popup=<<qualify "$:/state/popup/translationInfo/$tiddlerTitle$">>> {{$:/core/images/down-arrow}} </$button> -<$reveal state=<<qualify "$:/state/popup/translationInfo/$tiddlerTitle$">> type="popup" position="belowleft" text="" default=""> +<$reveal state=<<qualify "$:/state/popup/translationInfo/$tiddlerTitle$">> type="popup" position="belowleft" positionAllowNegative="yes" text="" default=""> <div class="tc-drop-down"> <p> Original en-GB text: From 996ee52cf9f5e15d95deaf0acf4206959d34432a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 6 Sep 2019 17:40:03 +0100 Subject: [PATCH 0307/2376] External-attachments plugin: Fix bug on Windows Fixes #4237 --- .../external-attachments/startup.js | 84 +++++++++++-------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/plugins/tiddlywiki/external-attachments/startup.js b/plugins/tiddlywiki/external-attachments/startup.js index 174f43ff2..4967921c5 100644 --- a/plugins/tiddlywiki/external-attachments/startup.js +++ b/plugins/tiddlywiki/external-attachments/startup.js @@ -26,15 +26,15 @@ exports.startup = function() { test_makePathRelative(); $tw.hooks.addHook("th-importing-file",function(info) { if(document.location.protocol === "file:" && info.isBinary && info.file.path && $tw.wiki.getTiddlerText(ENABLE_EXTERNAL_ATTACHMENTS_TITLE,"") === "yes") { - var locationPathParts = document.location.pathname.split("/").slice(0,-1), - filePathParts = info.file.path.split(/[\\\/]/mg).map(encodeURIComponent); +console.log("Wiki location",document.location.pathname) +console.log("File location",info.file.path) info.callback([ { title: info.file.name, type: info.type, "_canonical_uri": makePathRelative( - filePathParts.join("/"), - locationPathParts.join("/"), + info.file.path, + document.location.pathname, { useAbsoluteForNonDescendents: $tw.wiki.getTiddlerText(USE_ABSOLUTE_FOR_NON_DESCENDENTS_TITLE,"") === "yes", useAbsoluteForDescendents: $tw.wiki.getTiddlerText(USE_ABSOLUTE_FOR_DESCENDENTS_TITLE,"") === "yes" @@ -50,29 +50,47 @@ exports.startup = function() { }; /* -Given a source absolute path and a root absolute path, returns the source path expressed as a relative path from the root path. +Given a source absolute filepath and a root absolute path, returns the source filepath expressed as a relative filepath from the root path. + +sourcepath comes from the "path" property of the file object, with the following patterns: + /path/to/file.png for Unix systems + C:\path\to\file.png for local files on Windows + \\sharename\path\to\file.png for network shares on Windows +rootpath comes from document.location.pathname with urlencode applied with the following patterns: + /path/to/file.html for Unix systems + /C:/path/to/file.html for local files on Windows + /sharename/path/to/file.html for network shares on Windows */ function makePathRelative(sourcepath,rootpath,options) { options = options || {}; + // First we convert the source path from OS-dependent format to generic file:// format + if(options.isWindows || $tw.platform.isWindows) { + sourcepath = sourcepath.replace(/\\/g,"/"); + // If it's a local file like C:/path/to/file.ext then add a leading slash + if(sourcepath.charAt(0) !== "/") { + sourcepath = "/" + sourcepath; + } + // If it's a network share then remove one of the leading slashes + if(sourcepath.substring(0,2) === "//") { + sourcepath = sourcepath.substring(1); + } + } + // Split the path into parts var sourceParts = sourcepath.split("/"), rootParts = rootpath.split("/"), outputParts = []; - // Check that each path started with a slash - if(sourceParts[0] || rootParts[0]) { - throw "makePathRelative: both paths must be absolute"; - } + // urlencode the parts of the sourcepath + $tw.utils.each(sourceParts,function(part,index) { + sourceParts[index] = encodeURI(part); + }); // Identify any common portion from the start - var c = 1, + var c = 0, p; while(c < sourceParts.length && c < rootParts.length && sourceParts[c] === rootParts[c]) { c += 1; } - // Return "." if there's nothing left - if(c === sourceParts.length && c === rootParts.length ) { - return "." - } - // Use an absolute path if required - if((options.useAbsoluteForNonDescendents && c < rootParts.length) || (options.useAbsoluteForDescendents && c === rootParts.length)) { + // Use an absolute path if there's no common portion, or if specifically requested + if(c === 1 || (options.useAbsoluteForNonDescendents && c < rootParts.length) || (options.useAbsoluteForDescendents && c === rootParts.length)) { return sourcepath; } // Move up a directory for each directory left in the root @@ -87,25 +105,21 @@ function makePathRelative(sourcepath,rootpath,options) { } function test_makePathRelative() { - var msg = "makePathRelative test failed"; - if(makePathRelative("/Users/me/something","/Users/you/something") !== "../../me/something") { - throw msg; - } - if(makePathRelative("/Users/me/something","/Users/you/something",{useAbsoluteForNonDescendents: true}) !== "/Users/me/something") { - throw msg; - } - if(makePathRelative("/Users/me/something/else","/Users/me/something") !== "else") { - throw msg; - } - if(makePathRelative("/Users/me/something","/Users/me/something/new") !== "..") { - throw msg; - } - if(makePathRelative("/Users/me/something","/Users/me/something/new",{useAbsoluteForNonDescendents: true}) !== "/Users/me/something") { - throw msg; - } - if(makePathRelative("/Users/me/something","/Users/me/something") !== ".") { - throw msg; - } + var test = function(sourcepath,rootpath,result,options) { + if(makePathRelative(sourcepath,rootpath,options) !== result) { + throw "makePathRelative test failed: makePathRelative(" + sourcepath + "," + rootpath + "," + JSON.stringify(options) + ") is not equal to " + result; + } + }; + test("/Users/me/something/file.png","/Users/you/something","../../me/something/file.png"); + test("/Users/me/something/file.png","/Users/you/something","/Users/me/something/file.png",{useAbsoluteForNonDescendents: true}); + test("/Users/me/something/else/file.png","/Users/me/something","else/file.png"); + test("/Users/me/something/file.png","/Users/me/something/new","../file.png"); + test("/Users/me/something/file.png","/Users/me/something/new","/Users/me/something/file.png",{useAbsoluteForNonDescendents: true}); + test("/Users/me/something/file.png","/Users/me/something","file.png"); + test("C:\\Users\\me\\something\\file.png","/C:/Users/me/something","file.png",{isWindows: true}); + test("\\\\SHARE\\Users\\me\\something\\file.png","/SHARE/Users/me/somethingelse","../something/file.png",{isWindows: true}); + test("\\\\SHARE\\Users\\me\\something\\file.png","/C:/Users/me/something","/SHARE/Users/me/something/file.png",{isWindows: true}); } + })(); From fff97e73261c9fdbcf957d6ddb86b420b864a696 Mon Sep 17 00:00:00 2001 From: Jan-Oliver Kaiser <mail@janno-kaiser.de> Date: Sat, 7 Sep 2019 10:06:19 +0200 Subject: [PATCH 0308/2376] Signing the CLA (#4244) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index e7af6b888..60c397c11 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -371,3 +371,5 @@ Stefan Schuster-Teupke, @StefanSTFG, 2019/08/26 Nils-Hero Lindemann, @heronils, 2019/08/26 Mark Stegeman, @markstegeman, 2019/08/31 + +Jan-Oliver Kaiser, @janno, 2019/09/06 From 19d2aab6b9a9f8e26b8eb99988ee05c3feaa16e5 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 7 Sep 2019 10:27:00 +0200 Subject: [PATCH 0309/2376] Remove text-shadow for tags in sidebar (#4245) For consistency with tags in the main story river --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 021660e6e..e6a19d013 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -649,6 +649,10 @@ button.tc-tag-label, span.tc-tag-label { border-radius: 1em; } +.tc-sidebar-scrollable .tc-tag-label { + text-shadow: none; +} + .tc-untagged-separator { width: 10em; left: 0; From 00fb4190f2970c0ee939681813486fb0b99d5892 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 9 Sep 2019 15:17:32 +0200 Subject: [PATCH 0310/2376] Fix whitespace around fields inputs (II) (#4240) --- core/ui/EditTemplate/fields.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index be4e54176..4b5ab5d4b 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -62,7 +62,7 @@ $value={{$:/temp/newfieldvalue}}/> </em> <span class="tc-edit-field-add-name"> <$edit-text tiddler="$:/temp/newfieldname" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}}/> -</span> +</span>  <$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> <div class="tc-block-dropdown tc-edit-type-dropdown"> From 85da202ccaa989be04f2b6a5aa74e0f8bba47d77 Mon Sep 17 00:00:00 2001 From: Xavier Cazin <cazinx@gmail.com> Date: Mon, 9 Sep 2019 15:28:56 +0200 Subject: [PATCH 0311/2376] fr-FR: small fix in tiddler date format (#4250) --- languages/fr-FR/Misc.multids | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/fr-FR/Misc.multids b/languages/fr-FR/Misc.multids index 499b9c24d..4fa120e08 100644 --- a/languages/fr-FR/Misc.multids +++ b/languages/fr-FR/Misc.multids @@ -68,6 +68,6 @@ TagManager/Count/Heading: Total TagManager/Icon/Heading: Icône TagManager/Info/Heading: Info TagManager/Tag/Heading: Tag -Tiddler/DateFormat: DD MMM YYYY à 0hhhmm +Tiddler/DateFormat: DD MMM YYYY à hhh0mm UnsavedChangesWarning: Vos dernières modifications n'ont pas été sauvegardées dans votre TiddlyWiki Yes: Oui From f74e4c520d5da90bbecc925fc9d22360cfc4a44b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 9 Sep 2019 14:38:29 +0100 Subject: [PATCH 0312/2376] Add docs for tm-rename-tiddler Fixes #4246 --- .../messages/WidgetMessage_ tm-rename-tiddler.tid | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid new file mode 100644 index 000000000..f97a9aaee --- /dev/null +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid @@ -0,0 +1,14 @@ +caption: tm-rename-tiddler +created: 20190909133618113 +modified: 20190909133618113 +tags: Messages navigator-message +title: WidgetMessage: tm-rename-tiddler +type: text/vnd.tiddlywiki + +The `tm-rename-tiddler` message renames a tiddler by deleting it and recreating it with a new title. The rename tiddler message requires the following properties on the `event` object: + +|!Name |!Description | +|from |Current title of tiddler | +|to |New title of tiddler | + +The rename tiddler message is usually generated with the ButtonWidget and is handled by the NavigatorWidget. From 953038f0b2a29a0201a0d278a6e64868db764f36 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 9 Sep 2019 14:47:27 +0100 Subject: [PATCH 0313/2376] Don't use field indexer when looking for blank/missing fields Fixes #4247 --- core/modules/filters/field.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters/field.js b/core/modules/filters/field.js index 7480a87cb..fc8223555 100644 --- a/core/modules/filters/field.js +++ b/core/modules/filters/field.js @@ -53,7 +53,7 @@ exports.field = function(source,operator,options) { } }); } else { - if(source.byField) { + if(source.byField && operator.operand) { indexedResults = source.byField(fieldname,operator.operand); if(indexedResults) { return indexedResults From fb12807a339510845e5a8a1b0a7feeb0f534053b Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Mon, 9 Sep 2019 09:56:40 -0400 Subject: [PATCH 0314/2376] Reverting changes to stringifyList (#4249) I (Flibbles) changed it so that lists generated by stringifyList would always be compatible with a filter parser, but since lists are not, and never will be, a subset of filters, there isn't a point. More importantly, wrapping negative numbers like "-7" in brackets would mess up some math stuff. --- boot/boot.js | 2 +- editions/test/tiddlers/tests/test-utils.js | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index de5cc259b..82583c594 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -317,7 +317,7 @@ $tw.utils.stringifyList = function(value) { var result = new Array(value.length); for(var t=0, l=value.length; t<l; t++) { var entry = value[t] || ""; - if(entry.indexOf(" ") !== -1 || "+-~=".indexOf(entry[0]) !== -1) { + if(entry.indexOf(" ") !== -1) { result[t] = "[[" + entry + "]]"; } else { result[t] = entry; diff --git a/editions/test/tiddlers/tests/test-utils.js b/editions/test/tiddlers/tests/test-utils.js index e7af600ed..860cc4d51 100644 --- a/editions/test/tiddlers/tests/test-utils.js +++ b/editions/test/tiddlers/tests/test-utils.js @@ -32,10 +32,19 @@ describe("Utility tests", function() { expect(str(["Tiddler8 "])).toEqual("[[Tiddler8 ]]"); expect(str(["A+B", "A-B", "A=B"])).toEqual("A+B A-B A=B"); expect(str(["A B"])).toEqual("[[A B]]"); - expect(str(["+T", "-T", "~T", "=T", "$T"])).toEqual("[[+T]] [[-T]] [[~T]] [[=T]] $T"); + // Starting special characters aren't treated specially, + // even though this makes a list incompatible with a filter parser. + expect(str(["+T", "-T", "~T", "=T", "$T"])).toEqual("+T -T ~T =T $T"); expect(str(["A", "", "B"])).toEqual("A B"); }); + it("stringifyList shouldn't interfere with setting variables to negative numbers", function() { + var wiki = new $tw.Wiki(); + wiki.addTiddler({title: "test", text: "<$set name=X filter='\"-7\"'>{{{ [<X>add[2]] }}}</$set>"}); + // X shouldn't be wrapped in brackets. If it is, math filters will treat it as zero. + expect(wiki.renderTiddler("text/plain","test")).toBe("-5"); + }); + it("should handle formatting a date string", function() { var fds = $tw.utils.formatDateString, // nov is month: 10! From ff6070f03354374f15bd6444a292bb620913b680 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 9 Sep 2019 16:48:12 +0100 Subject: [PATCH 0315/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.21.tid | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.21.tid b/editions/prerelease/tiddlers/Release 5.1.21.tid index ae7b9b906..05766fa21 100644 --- a/editions/prerelease/tiddlers/Release 5.1.21.tid +++ b/editions/prerelease/tiddlers/Release 5.1.21.tid @@ -1,17 +1,13 @@ caption: 5.1.21 -created: 20190809153802329 -modified: 20190809153802329 +created: 20190909164647824 +modified: 20190909164647824 tags: ReleaseNotes title: Release 5.1.21 type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.20...v5.1.21]]// -This is a minor bug fix release for [[Release 5.1.20]]. - -!! Hackability Improvements - -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4189]] the ''Open'' sidebar tab to use the `tv-story-list` variable +This is a bug fix release for [[Release 5.1.20]]. !! Bug Fixes @@ -23,6 +19,12 @@ This is a minor bug fix release for [[Release 5.1.20]]. * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/dd09266b467173e45d75c172b2e82fd542f682fe]] problem with classes in the [[Table-of-Contents Macros]] * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4203]] missing foreground colour for buttons with class `tc-btn-invisible` * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4227]] whitespace around field editor inputs +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/bb036ced933ecb36f5d93693fb4f6e7aa2748df7]] layout problems with the [[translators edition|Translate TiddlyWiki into your language]] +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/996ee52cf9f5e15d95deaf0acf4206959d34432a]] crash with the [[External Attachments Plugin]] on Windows +* [[Removed|https://github.com/Jermolene/TiddlyWiki5/pull/4245]] inconsistent shadow for tag pills in the sidebar +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4247]] regression with the [[field Operator]] and blank operands +* [[Reverted|https://github.com/Jermolene/TiddlyWiki5/pull/4249]] erroneous change in v5.1.20 in the way that lists are stringified +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4189]] the ''Open'' sidebar tab to use the `tv-story-list` variable !! Node.js Bug Fixes @@ -39,3 +41,4 @@ This is a minor bug fix release for [[Release 5.1.20]]. * [[@hoelzro|https://github.com/hoelzro]] * [[@markstegeman|https://github.com/markstegeman]] * [[@StefanSTFG|https://github.com/StefanSTFG]] +* [[@xcazin|https://github.com/xcazin]] From 3732c83ad476fbf8d2c0536da715ed9df456517a Mon Sep 17 00:00:00 2001 From: Bimba Laszlo <bimbalaszlo@gmail.com> Date: Tue, 10 Sep 2019 15:16:06 +0200 Subject: [PATCH 0316/2376] Fix GitLab saver Base64 encoding (#4255) --- core/modules/savers/gitlab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/savers/gitlab.js b/core/modules/savers/gitlab.js index fcb3b51e8..505face43 100644 --- a/core/modules/savers/gitlab.js +++ b/core/modules/savers/gitlab.js @@ -71,7 +71,7 @@ GitLabSaver.prototype.save = function(text,method,callback) { } var data = { commit_message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"), - content: $tw.utils.base64Encode(text), + content: text, branch: branch, sha: sha }; From b5e4cc0cc886b02340e643a2cddaeb8182dd9f0e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 10 Sep 2019 16:07:36 +0100 Subject: [PATCH 0317/2376] Docs: Clarify reveal widget animation requirements --- editions/tw5.com/tiddlers/widgets/RevealWidget.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid index a44a84eb4..754f05598 100644 --- a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid @@ -1,7 +1,7 @@ caption: reveal created: 20131024141900000 jeremy: tiddlywiki -modified: 20190704145627537 +modified: 20190910150520583 tags: Widgets title: RevealWidget type: text/vnd.tiddlywiki @@ -36,13 +36,13 @@ The content of the `<$reveal>` widget is displayed according to the rules given |position |The position used for the popup when the type is ''popup''. Can be ''left'', ''above'', ''aboveright'', ''right'', ''belowleft'' or ''below'' | |positionAllowNegative |Set to "yes" to prevent computed popup positions from being clamped to be above zero | |default |Default value to use when the state tiddler is missing | -|animate |Set to "yes" to animate opening and closure (defaults to "no") | +|animate |Set to "yes" to animate opening and closure (defaults to "no"; requires "retain" to be set to "yes") | |retain |Set to "yes" to force the content to be retained even when hidden (defaults to "no") | <<.tip """<$macrocall $name=".from-version" version="5.1.18"/> <$macrocall $name=".attr" _="stateTitle"/>, <$macrocall $name=".attr" _="stateField"/> and <$macrocall $name=".attr" _="stateIndex"/> attributes allow specifying Tiddler states ''directly'', without interpreting them as [[TextReferences|TextReference]]. This is useful for edge-cases where titles may contain characters that are used to denote Tiddler fields or indices (`!!`, `##`)""">> -<<.tip """Retaining the content when hidden can give poor performance since the hidden content requires refresh processing even though it is not displayed. On the other hand, the content can be revealed much more quickly. Note that setting ''animate="yes"'' will also force ''retain="yes"''""">> +<<.tip """Retaining the content when hidden can give poor performance since the hidden content requires refresh processing even though it is not displayed. On the other hand, the content can be revealed much more quickly. Note that setting ''animate="yes"'' will also require ''retain="yes"''""">> ! Examples From b8129b6e369e374ab94e694c5a1957ff918cae8d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 10 Sep 2019 16:21:37 +0100 Subject: [PATCH 0318/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.21.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.21.tid b/editions/prerelease/tiddlers/Release 5.1.21.tid index 05766fa21..c9f2dd580 100644 --- a/editions/prerelease/tiddlers/Release 5.1.21.tid +++ b/editions/prerelease/tiddlers/Release 5.1.21.tid @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.20...v5.1.21]]// -This is a bug fix release for [[Release 5.1.20]]. +This is a bug fix release that resolves issues introduced in the recent [[Release 5.1.20]]. !! Bug Fixes @@ -25,6 +25,7 @@ This is a bug fix release for [[Release 5.1.20]]. * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4247]] regression with the [[field Operator]] and blank operands * [[Reverted|https://github.com/Jermolene/TiddlyWiki5/pull/4249]] erroneous change in v5.1.20 in the way that lists are stringified * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4189]] the ''Open'' sidebar tab to use the `tv-story-list` variable +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4255]] problem [[saving to GitLab|Saving to a Git service]] !! Node.js Bug Fixes From 42060acb43b329036b7436ee154bf605e90efa8e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 10 Sep 2019 16:32:30 +0100 Subject: [PATCH 0319/2376] Preparing for release of v5.1.21 --- .../Releasing a new version of TiddlyWiki.tid | 1 + .../prerelease/tiddlers/Release 5.1.22.tid | 14 ++++++++++++++ .../tiddlers/hellothere/HelloThere.tid | 2 +- .../tiddlers/images/New Release Banner.jpg | Bin 32772 -> 29896 bytes .../tiddlers/releasenotes}/Release 5.1.21.tid | 5 +++-- readme.md | 2 +- 6 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 editions/prerelease/tiddlers/Release 5.1.22.tid rename editions/{prerelease/tiddlers => tw5.com/tiddlers/releasenotes}/Release 5.1.21.tid (97%) diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index f20b8fcae..5ceccb6ba 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -5,6 +5,7 @@ type: text/vnd.tiddlywiki !! Preparation on master +# Ensure the new release banner image is up to date # Update ''master'' with changes from ''tiddlywiki-com'' # Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `editions/tw5.com` # Move the latest release note from the prerelease edition into the tw5.com edition diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid new file mode 100644 index 000000000..78c9407c3 --- /dev/null +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -0,0 +1,14 @@ +caption: 5.1.22 +created: 20190910152413608 +modified: 20190910152413608 +tags: ReleaseNotes +title: Release 5.1.22 +type: text/vnd.tiddlywiki + +//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.21...v5.1.22]]// + +! Contributors + +[[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: + +* \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid index a6079ab1d..8eb1a6672 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid @@ -1,6 +1,6 @@ created: 20130822170200000 list: [[A Gentle Guide to TiddlyWiki]] [[Discover TiddlyWiki]] [[Some of the things you can do with TiddlyWiki]] [[Ten reasons to switch to TiddlyWiki]] Examples [[What happened to the original TiddlyWiki?]] [[HelloThumbnail - TWEUM2017]] -modified: 20190809141328809 +modified: 20190910152313608 tags: TableOfContents title: HelloThere type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.jpg b/editions/tw5.com/tiddlers/images/New Release Banner.jpg index 98cd725194266403c14b983f812f4af6aa9a699a..9ce97287501a7f99360a497fced36f648c2473f5 100644 GIT binary patch literal 29896 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 literal 32772 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 VPapdHe-}&eUk=Ux7stQF{|zo;ipc-~ diff --git a/editions/prerelease/tiddlers/Release 5.1.21.tid b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.21.tid similarity index 97% rename from editions/prerelease/tiddlers/Release 5.1.21.tid rename to editions/tw5.com/tiddlers/releasenotes/Release 5.1.21.tid index c9f2dd580..d1df30a41 100644 --- a/editions/prerelease/tiddlers/Release 5.1.21.tid +++ b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.21.tid @@ -1,6 +1,7 @@ caption: 5.1.21 -created: 20190909164647824 -modified: 20190909164647824 +created: 20190910152313608 +modified: 20190910152313608 +released: 20190910152313608 tags: ReleaseNotes title: Release 5.1.21 type: text/vnd.tiddlywiki diff --git a/readme.md b/readme.md index e7c813301..d7f266e90 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,7 @@ <p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is a complete interactive wiki in <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/JavaScript.html">JavaScript</a>. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h1 class="">Join the Community</h1><p> <h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWiki</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li><strong>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</strong></li></ul><h2 class="">Developers</h2><ul><li>The <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiDev.html">TiddlyWikiDev</a> group for developers: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWikiDev</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/tiddlywikidocs</a> </p> -</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><p><code>npm install -g tiddlywiki</code></p><p>If it fails with an error you may need to re-run the command as an administrator:</p><p><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</p></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><p><code>tiddlywiki --version</code></p></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.20"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> +</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><p><code>npm install -g tiddlywiki</code></p><p>If it fails with an error you may need to re-run the command as an administrator:</p><p><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</p></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><p><code>tiddlywiki --version</code></p></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.21"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> <g fill-rule="evenodd"> <path d="M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z"></path> </g> From 165538180ef6a89a5f35ae9aa2d764e59f1f6191 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 10 Sep 2019 16:32:45 +0100 Subject: [PATCH 0320/2376] Version number update for 5.1.21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d05ad4db1..25574ec31 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.21-prerelease", + "version": "5.1.21", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From 1631f21a6bf683c12951cd75701f4197c1e6f2a7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 10 Sep 2019 17:20:36 +0100 Subject: [PATCH 0321/2376] Preparation for v5.1.22-prerelease --- bin/build-site.sh | 2 +- core/wiki/config/OfficialPluginLibrary.tid | 2 +- .../Releasing a new version of TiddlyWiki.tid | 1 - .../system/PrereleaseLocalPluginLibrary.tid | 2 +- .../PrereleaseOfficialPluginLibrary.tid | 2 +- .../tiddlers/images/New Release Banner.jpg | Bin 29896 -> 143816 bytes package.json | 2 +- 7 files changed, 5 insertions(+), 6 deletions(-) diff --git a/bin/build-site.sh b/bin/build-site.sh index 5cb0d13a3..ba2fd80ec 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -5,7 +5,7 @@ # Default to the current version number for building the plugin library if [ -z "$TW5_BUILD_VERSION" ]; then - TW5_BUILD_VERSION=v5.1.20 + TW5_BUILD_VERSION=v5.1.21 fi echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]" diff --git a/core/wiki/config/OfficialPluginLibrary.tid b/core/wiki/config/OfficialPluginLibrary.tid index f2ed50c1f..39717937d 100644 --- a/core/wiki/config/OfficialPluginLibrary.tid +++ b/core/wiki/config/OfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/library/v5.1.21/index.html +url: https://tiddlywiki.com/library/v5.1.22/index.html caption: {{$:/language/OfficialPluginLibrary}} {{$:/language/OfficialPluginLibrary/Hint}} diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index 5ceccb6ba..1bfabebd2 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -42,5 +42,4 @@ type: text/vnd.tiddlywiki # Adjust version number in [[$:/config/OfficialPluginLibrary]] (both in `editions/tw5.com` and `editions/prerelease/tiddlers/system`) and [[$:/config/LocalPluginLibrary]] # Adjust new release banner # Create the release note for the new release -# Adjust version number in https://github.com/Jermolene/build.jermolene.github.io in `prerelease-bld.sh`, `bld.sh` and `make-library-bld.sh` # Commit changes to ''master'' and push to ~GitHub diff --git a/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid b/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid index 6b3ecb0f9..d32a95711 100644 --- a/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid +++ b/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/LocalPluginLibrary tags: $:/tags/PluginLibrary -url: http://127.0.0.1:8080/prerelease/library/v5.1.21/index.html +url: http://127.0.0.1:8080/prerelease/library/v5.1.22/index.html caption: {{$:/language/OfficialPluginLibrary}} (Prerelease Local) A locally installed version of the official ~TiddlyWiki plugin library at tiddlywiki.com for testing and debugging. //Requires a local web server to share the library// diff --git a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid index 63029fddc..9b2794ef0 100644 --- a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid +++ b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/prerelease/library/v5.1.21/index.html +url: https://tiddlywiki.com/prerelease/library/v5.1.22/index.html caption: {{$:/language/OfficialPluginLibrary}} (Prerelease) The prerelease version of the official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.jpg b/editions/tw5.com/tiddlers/images/New Release Banner.jpg index 9ce97287501a7f99360a497fced36f648c2473f5..c9a4d7e17cc0ad310d68cf08fff2f3267d75151c 100644 GIT binary patch literal 143816 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 literal 29896 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 diff --git a/package.json b/package.json index 25574ec31..2fc00f9ee 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.21", + "version": "5.1.22-prerelease", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From 11506e9acf9fccee96f569dd7c6cc13890f29a80 Mon Sep 17 00:00:00 2001 From: Jan-Oliver Kaiser <mail@janno-kaiser.de> Date: Wed, 11 Sep 2019 11:21:31 +0200 Subject: [PATCH 0322/2376] Fix gitlab saver (#4243) This fixes the HTTP request sent to gitlab that is meant to see if the target file already exists. It did not follow the official gitlab v4 api documentation. That documentation dictates both `path` and `branch` to be passed via corresponding GET parameters. --- core/modules/savers/gitlab.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/modules/savers/gitlab.js b/core/modules/savers/gitlab.js index 505face43..cce69099c 100644 --- a/core/modules/savers/gitlab.js +++ b/core/modules/savers/gitlab.js @@ -48,12 +48,9 @@ GitLabSaver.prototype.save = function(text,method,callback) { var uri = endpoint + "/projects/" + encodeURIComponent(repo) + "/repository/"; // Perform a get request to get the details (inc shas) of files in the same path as our file $tw.utils.httpRequest({ - url: uri + "tree/" + encodeURIComponent(path.replace(/^\/+|\/$/g, '')), + url: uri + "tree/?path=" + encodeURIComponent(path.replace(/^\/+|\/$/g, '')) + "&branch=" + encodeURIComponent(branch.replace(/^\/+|\/$/g, '')), type: "GET", headers: headers, - data: { - ref: branch - }, callback: function(err,getResponseDataJson,xhr) { var getResponseData,sha = ""; if(err && xhr.status !== 404) { From 68163684a2e57108e160295e445c194268b873c5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 11 Sep 2019 11:40:45 +0100 Subject: [PATCH 0323/2376] Fix publishFilter in save templates Fixes #4252 --- core/templates/external-js/save-all-external-js.tid | 1 + core/templates/save-all.tid | 1 + plugins/tiddlywiki/tiddlyweb/save-offline.tid | 1 + 3 files changed, 3 insertions(+) diff --git a/core/templates/external-js/save-all-external-js.tid b/core/templates/external-js/save-all-external-js.tid index 31476e663..8eff8b9e6 100644 --- a/core/templates/external-js/save-all-external-js.tid +++ b/core/templates/external-js/save-all-external-js.tid @@ -1,5 +1,6 @@ title: $:/core/save/all-external-js +\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() [is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ \end diff --git a/core/templates/save-all.tid b/core/templates/save-all.tid index 52ef0fb2c..d622f9c52 100644 --- a/core/templates/save-all.tid +++ b/core/templates/save-all.tid @@ -1,5 +1,6 @@ title: $:/core/save/all +\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() [is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ \end diff --git a/plugins/tiddlywiki/tiddlyweb/save-offline.tid b/plugins/tiddlywiki/tiddlyweb/save-offline.tid index 0cc4d55cc..b2bfdbdd1 100644 --- a/plugins/tiddlywiki/tiddlyweb/save-offline.tid +++ b/plugins/tiddlywiki/tiddlyweb/save-offline.tid @@ -1,5 +1,6 @@ title: $:/plugins/tiddlywiki/tiddlyweb/save/offline +\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() [is[tiddler]] -[[$:/boot/boot.css]] -[[$:/HistoryList]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] +[sort[title]] $(publishFilter)$ \end From b44dc39299d0f110186c16218f7546492bb66f94 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 11 Sep 2019 12:10:33 +0100 Subject: [PATCH 0324/2376] Update Dutch translation Thanks @gernert --- languages/nl-NL/Buttons.multids | 1 + languages/nl-NL/ControlPanel.multids | 24 ++++++++++++++++++++++++ languages/nl-NL/Fields.multids | 2 ++ languages/nl-NL/Filters.multids | 1 + languages/nl-NL/Help/deletetiddlers.tid | 8 ++++++++ languages/nl-NL/Help/savewikifolder.tid | 19 +++++++++++++++++++ languages/nl-NL/Import.multids | 2 ++ 7 files changed, 57 insertions(+) create mode 100644 languages/nl-NL/Help/deletetiddlers.tid create mode 100644 languages/nl-NL/Help/savewikifolder.tid diff --git a/languages/nl-NL/Buttons.multids b/languages/nl-NL/Buttons.multids index 44b7a66af..16f594dec 100644 --- a/languages/nl-NL/Buttons.multids +++ b/languages/nl-NL/Buttons.multids @@ -171,6 +171,7 @@ Timestamp/Off/Caption: tijdstempels zijn uit Timestamp/Off/Hint: Werk tijdstempels niet bij als tiddlers veranderd zijn Timestamp/On/Caption: tijdstempels zijn aan Timestamp/On/Hint: Werk tijdstempels bij als tiddlers veranderd zijn +ToggleSidebar/Hint: 'Toggle' de sideba Transcludify/Caption: transclusie Transcludify/Hint: Zet selectie tussen accolades Underline/Caption: onderstreept diff --git a/languages/nl-NL/ControlPanel.multids b/languages/nl-NL/ControlPanel.multids index 75770bc41..e3fa522fc 100644 --- a/languages/nl-NL/ControlPanel.multids +++ b/languages/nl-NL/ControlPanel.multids @@ -47,6 +47,8 @@ LoadedModules/Hint: Dit zijn de nu geladen tiddler modules gekoppeld aan hun bro Palette/Caption: Palet Palette/Editor/Clone/Caption: kloon Palette/Editor/Clone/Prompt: Het wordt aanbevolen dit schaduwpalet te klonen alvorens het te wijzigen. +Palette/Editor/Delete/Hint: verwijder deze invoer van het huidige palet +Palette/Editor/Names/External/Show: Toon namen van kleuren die niet tot het huiddige palet behoren Palette/Editor/Prompt: Wijzigen Palette/Editor/Prompt/Modified: Dit schaduwpalet is gewijzigd Palette/Editor/Reset/Caption: reset @@ -89,6 +91,27 @@ Saving/DownloadSaver/Caption: Opslagmodule Saving/DownloadSaver/Hint: Deze instellingen gelden voor de HTML5 compatibele opslagmodule Saving/General/Caption: Algemeen Saving/General/Hint: Deze instellingen gelden voor alle geladen opslagmodules +Saving/GitHub/Branch: 'Tak' (branch) voor opslaan (standaard `master`) +Saving/GitHub/Caption: ~GitHub opslagmodule +Saving/GitHub/Description: Deze instellingen worden alleen gebruikt voor opslaan bij ~GitHub +Saving/GitHub/Filename: Bestandsnaam van doelbestand (b.v. `index.html`) + +Saving/GitHub/Password: Wachtwoord, OAUTH token of persoonlijk toegangstoken +Saving/GitHub/Path: Pad naar doelbestand (b.v. `/wiki/`) +Saving/GitHub/Repo: Opslagplaats (b.v. `Jermolene/TiddlyWiki5`) +Saving/GitHub/ServerURL: Server URL (standaard `https://api.github.com`) +Saving/GitHub/UserName: Gebruikersnaam +Saving/GitService/Branch: Doeltak (branch) voor opslaan +Saving/GitService/CommitMessage: Opgeslagen door TiddlyWiki +Saving/GitService/Description: Deze instellingen worden alleen gebruikt bij opslaan naar <<service-name>> +Saving/GitService/Filename: Bestandsnaam van doelbestand (b.v. `index.html`) +Saving/GitService/GitHub/Password: Wachtwoord, OAUTH token, of persoonlijk toegangs-token (zie [[GitHub help-pagina|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] voor details) +Saving/GitService/GitLab/Caption: ~GitLab opslagmodule +Saving/GitService/GitLab/Password: Persoonlijk toegangs-token voor API (zie [[GitLab help-pagina|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] voor details) + +Saving/GitService/Path: Pad naar doelbestand (b.v. `/wiki/`) +Saving/GitService/Repo: Opslagdoel (b.v. `Jermolene/TiddlyWiki5`) +Saving/GitService/UserName: Gebruikersnaam Saving/Heading: Opslaan Saving/Hint: Instellingen voor opslaan van de gehele TiddlyWiki als één bestand via een opslagmodule Saving/TiddlySpot/Advanced/Heading: Geavanceerde instellingen @@ -141,6 +164,7 @@ Settings/NavigationHistory/Caption: Navigeer-geschiedenis Settings/NavigationHistory/Hint: Werk de browsergeschiedenis bij als er naar een tiddler genavigeerd wordt: Settings/NavigationHistory/No/Description: Werk de browsergeschiedenis niet bij Settings/NavigationHistory/Yes/Description: Werk de browsergeschiedenis bij +Settings/NavigationPermalinkviewMode/Caption: Permalink/permaview modus Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Kopieer permalink/permaview URL naar klembord Settings/NavigationPermalinkviewMode/Hint: Kies hoe permalink/permaview wordt behandeld: Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Werk de adresbalk bij met permalink/permaview URL diff --git a/languages/nl-NL/Fields.multids b/languages/nl-NL/Fields.multids index 14556084d..16b2f41d1 100644 --- a/languages/nl-NL/Fields.multids +++ b/languages/nl-NL/Fields.multids @@ -14,6 +14,7 @@ draft.of: Voor concepttiddlers; bevat de titel van de te maken tiddler draft.title: Voor concepttiddlers; bevat de voorgestelde titel van de tiddler footer: De voettekst van een 'wizard' hack-to-give-us-something-to-compare-against: Een tijdelijk opslagveld dat in [[$:/core/templates/static.content]] gebruikt wordt +hide-body: Als 'yes' ingevuld is, wordt de tekst van de tiddler niet weergegeven icon: De titel van de pictogramtiddler die met deze tiddler gekoppeld is library: Als 'yes' ingevuld is, dient de tiddler als JavaScript-bibliotheek opgeslagen te worden list: Een geordende lijst van tiddlertitels gekoppeld met een tiddler @@ -31,5 +32,6 @@ subtitle: De tekst van de ondertitel van een wizard tags: Een lijst van labels gekoppeld met een tiddler text: De tekst van een tiddler title: De unieke naam van een tiddler +toc-link: Als 'no' ingevuld is, is de tiddler geen link meer in de Inhoudsopgave type: Inhoudstype van een tiddler version: Versieinformatie van een plugin diff --git a/languages/nl-NL/Filters.multids b/languages/nl-NL/Filters.multids index c60073392..ff54435f4 100644 --- a/languages/nl-NL/Filters.multids +++ b/languages/nl-NL/Filters.multids @@ -8,6 +8,7 @@ Orphans: Weestiddlers OverriddenShadowTiddlers: Overschreven schaduwtiddlers RecentSystemTiddlers: Onlangs gewijzigde tiddlers inclusief systeemtiddlers RecentTiddlers: Onlangs gewijzigde tiddlers +SessionTiddlers: Tiddlers gewijzigf nadat de wiki geleaden werd ShadowTiddlers: Schaduwtiddlers StoryList: Tiddlers in de 'story river' behalve <$text text="$:/AdvancedSearch"/> SystemTags: Systeemlabels diff --git a/languages/nl-NL/Help/deletetiddlers.tid b/languages/nl-NL/Help/deletetiddlers.tid new file mode 100644 index 000000000..5c38bcf62 --- /dev/null +++ b/languages/nl-NL/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: Deletes a group of tiddlers + +<<.from-version "5.1.20">> Verwijdert een gefilterde groep tiddlers. + +``` +--deletetiddlers <filter> +``` diff --git a/languages/nl-NL/Help/savewikifolder.tid b/languages/nl-NL/Help/savewikifolder.tid new file mode 100644 index 000000000..06ea81fd8 --- /dev/null +++ b/languages/nl-NL/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: Saves a wiki to a new wiki folder + +<<.from-version "5.1.20">> Slaat de wiki als een wiki-folder op inclusief tiddlers, plugins en configuratie: + +``` +--savewikifolder <wikifolderpath> [<filter>] +``` + +* De doel wiki folder moet leeg zijn of niet bestaan +* Het filter geeft aan welke tiddlers opgeslagen worden. Het filter is optioneel; standaard is `[all[tiddlers]]` +* Plugins uit de officiële plugin-bibliotheek worden vervangen door referenties naar deze plugins in het `tiddlywiki.info` bestand +* Andere plugins worden uitgepakt in hun eigen folder + +Kan worden gebruikt om een TiddlyWiki HTML-bestand in een wiki-folder om te zetten: + +``` +tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder +``` diff --git a/languages/nl-NL/Import.multids b/languages/nl-NL/Import.multids index 526c84e6d..f08222ad7 100644 --- a/languages/nl-NL/Import.multids +++ b/languages/nl-NL/Import.multids @@ -17,5 +17,7 @@ Upgrader/Plugins/Suppressed/Incompatible: Geblokkeerde plugin (incompatibel of v Upgrader/Plugins/Suppressed/Version: Geblokkeerde plugin (te importeren <<incoming>> ouder dan bestaande <<existing>>) Upgrader/Plugins/Upgraded: Plugin opgewaardeerd van <<incoming>> naar <<upgraded>> Upgrader/State/Suppressed: Geblokkeerde tijdelijke statustiddler +Upgrader/System/Alert: Je staat op het punt om om een tiddler te importeren die een 'core module' tiddler zal overschrijven. Dit wordt niet aanbevolen daar het systeem instabiel kan worden Upgrader/System/Suppressed: Geblokkeerde systeemtiddler +Upgrader/System/Warning: 'Core module' tiddler Upgrader/ThemeTweaks/Created: Gemigreerde thema-aanpassing van <$text text=<<from>>/> From 90745f93a51922d83b05920d457bfb449908795f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 12 Sep 2019 10:33:25 +0100 Subject: [PATCH 0325/2376] Update safe mode docs Ping @anthonymuscio --- editions/tw5.com/tiddlers/features/SafeMode.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/features/SafeMode.tid b/editions/tw5.com/tiddlers/features/SafeMode.tid index 03fa8f00d..dfe634e23 100644 --- a/editions/tw5.com/tiddlers/features/SafeMode.tid +++ b/editions/tw5.com/tiddlers/features/SafeMode.tid @@ -1,5 +1,5 @@ created: 20140419082845576 -modified: 20160610082458079 +modified: 20190912093109517 tags: Features title: SafeMode type: text/vnd.tiddlywiki @@ -8,6 +8,8 @@ type: text/vnd.tiddlywiki Safe mode provides a way to disabling most customisations in TiddlyWiki. This is useful because if TiddlyWiki is customised incorrectly it can be rendered inoperable. A particular issue is that some customisations break when upgrading to a newer core version of TiddlyWiki (especially during the beta). +<<.warning "Safe mode should only be used with the single file configuration of TiddlyWiki, and then only with savers that do not autosave. Using safe mode in the client server configuration can lead to data loss.">> + ! Enabling Safe Mode Safe mode is enabled in the browser by starting TiddlyWiki with the URL hash set to the string `#:safe`. For example: From 1c230592045727263c5f84a86d70ba688e54e99a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 16 Sep 2019 12:15:39 +0100 Subject: [PATCH 0326/2376] Dynamic loading/unloading of plugins (#4259) * First pass at dynamic loading/unloading * Show warning for changes to plugins containing JS modules * Use $:/config/RegisterPluginType/* for configuring whether a plugin type is automatically registered Where "registered" means "the constituent shadows are loaded". * Fix the info plugin The previous mechanism re-read all plugin info during startup * Don't prettify JSON in the plugin library * Indicate in plugin library whether a plugin requires reloading * Display the highlighted plugin name in the plugin chooser And if there's no name field fall back to the part of the title after the final slash. --- boot/boot.js | 55 +++++++++++++----- core/language/en-GB/ControlPanel.multids | 1 + core/language/en-GB/Misc.multids | 2 +- core/modules/commands/makelibrary.js | 2 +- core/modules/commands/savelibrarytiddlers.js | 10 +++- core/modules/startup/info.js | 8 ++- core/modules/startup/plugins.js | 59 ++++++++++++++++++++ core/modules/wiki.js | 20 +++++++ core/ui/ControlPanel/Modals/AddPlugins.tid | 3 +- core/ui/PageTemplate/pluginreloadwarning.tid | 2 +- core/wiki/config/RegisterPluginTypes.multids | 7 +++ 11 files changed, 145 insertions(+), 24 deletions(-) create mode 100644 core/modules/startup/plugins.js create mode 100644 core/wiki/config/RegisterPluginTypes.multids diff --git a/boot/boot.js b/boot/boot.js index 82583c594..9f867c48a 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1237,15 +1237,39 @@ $tw.Wiki = function(options) { return null; }; - // Read plugin info for all plugins - this.readPluginInfo = function() { - for(var title in tiddlers) { - var tiddler = tiddlers[title]; - if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type")) { - pluginInfo[tiddler.fields.title] = JSON.parse(tiddler.fields.text); + // Get an array of all the currently recognised plugin types + this.getPluginTypes = function() { + var types = []; + $tw.utils.each(pluginTiddlers,function(pluginTiddler) { + var pluginType = pluginTiddler.fields["plugin-type"]; + if(pluginType && types.indexOf(pluginType) === -1) { + types.push(pluginType); } + }); + return types; + }; - } + // Read plugin info for all plugins, or just an array of titles. Returns the number of plugins updated or deleted + this.readPluginInfo = function(titles) { + var results = { + modifiedPlugins: [], + deletedPlugins: [] + }; + $tw.utils.each(titles || getTiddlerTitles(),function(title) { + var tiddler = tiddlers[title]; + if(tiddler) { + if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type")) { + pluginInfo[tiddler.fields.title] = JSON.parse(tiddler.fields.text); + results.modifiedPlugins.push(tiddler.fields.title); + } + } else { + if(pluginInfo[title]) { + delete pluginInfo[title]; + results.deletedPlugins.push(title); + } + } + }); + return results; }; // Get plugin info for a plugin @@ -1253,14 +1277,15 @@ $tw.Wiki = function(options) { return pluginInfo[title]; }; - // Register the plugin tiddlers of a particular type, optionally restricting registration to an array of tiddler titles. Return the array of titles affected + // Register the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting registration to an array of tiddler titles. Return the array of titles affected this.registerPluginTiddlers = function(pluginType,titles) { var self = this, registeredTitles = [], checkTiddler = function(tiddler,title) { - if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"] === pluginType) { + if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType)) { var disablingTiddler = self.getTiddler("$:/config/Plugins/Disabled/" + title); if(title === "$:/core" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") { + self.unregisterPluginTiddlers(null,[title]); // Unregister the plugin if it's already registered pluginTiddlers.push(tiddler); registeredTitles.push(tiddler.fields.title); } @@ -1278,19 +1303,19 @@ $tw.Wiki = function(options) { return registeredTitles; }; - // Unregister the plugin tiddlers of a particular type, returning an array of the titles affected - this.unregisterPluginTiddlers = function(pluginType) { + // Unregister the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting unregistering to an array of tiddler titles. Returns an array of the titles affected + this.unregisterPluginTiddlers = function(pluginType,titles) { var self = this, - titles = []; + unregisteredTitles = []; // Remove any previous registered plugins of this type for(var t=pluginTiddlers.length-1; t>=0; t--) { var tiddler = pluginTiddlers[t]; - if(tiddler.fields["plugin-type"] === pluginType) { - titles.push(tiddler.fields.title); + if(tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType) && (!titles || titles.indexOf(tiddler.fields.title) !== -1)) { + unregisteredTitles.push(tiddler.fields.title); pluginTiddlers.splice(t,1); } } - return titles; + return unregisteredTitles; }; // Unpack the currently registered plugins, creating shadow tiddlers for their constituent tiddlers diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index faa4d73c5..d1fd8f374 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -78,6 +78,7 @@ Plugins/NoInfoFound/Hint: No ''"<$text text=<<currentTab>>/>"'' found Plugins/NotInstalled/Hint: This plugin is not currently installed Plugins/OpenPluginLibrary: open plugin library Plugins/ClosePluginLibrary: close plugin library +Plugins/PluginWillRequireReload: (requires reload) Plugins/Plugins/Caption: Plugins Plugins/Plugins/Hint: Plugins Plugins/Reinstall/Caption: reinstall diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 0f267186e..599b575eb 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -59,7 +59,7 @@ MissingTiddler/Hint: Missing tiddler "<$text text=<<currentTiddler>>/>" -- click No: No OfficialPluginLibrary: Official ~TiddlyWiki Plugin Library OfficialPluginLibrary/Hint: The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. -PluginReloadWarning: Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to plugins to take effect +PluginReloadWarning: Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect RecentChanges/DateFormat: DDth MMM YYYY SystemTiddler/Tooltip: This is a system tiddler SystemTiddlers/Include/Prompt: Include system tiddlers diff --git a/core/modules/commands/makelibrary.js b/core/modules/commands/makelibrary.js index bb149fd16..ce7150f0c 100644 --- a/core/modules/commands/makelibrary.js +++ b/core/modules/commands/makelibrary.js @@ -59,7 +59,7 @@ Command.prototype.execute = function() { title: upgradeLibraryTitle, type: "application/json", "plugin-type": "library", - "text": JSON.stringify({tiddlers: tiddlers},null,$tw.config.preferences.jsonSpaces) + "text": JSON.stringify({tiddlers: tiddlers}) }; wiki.addTiddler(new $tw.Tiddler(pluginFields)); return null; diff --git a/core/modules/commands/savelibrarytiddlers.js b/core/modules/commands/savelibrarytiddlers.js index 44feea071..b1874c9b5 100644 --- a/core/modules/commands/savelibrarytiddlers.js +++ b/core/modules/commands/savelibrarytiddlers.js @@ -65,10 +65,11 @@ Command.prototype.execute = function() { // Save each JSON file and collect the skinny data var pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + ".json"); $tw.utils.createFileDirectories(pathname); - fs.writeFileSync(pathname,JSON.stringify(tiddler,null,$tw.config.preferences.jsonSpaces),"utf8"); + fs.writeFileSync(pathname,JSON.stringify(tiddler),"utf8"); // Collect the skinny list data var pluginTiddlers = JSON.parse(tiddler.text), readmeContent = (pluginTiddlers.tiddlers[title + "/readme"] || {}).text, + doesContainJavaScript = !!$tw.wiki.doesPluginInfoContainModules(pluginTiddlers), iconTiddler = pluginTiddlers.tiddlers[title + "/icon"] || {}, iconType = iconTiddler.type, iconText = iconTiddler.text, @@ -76,7 +77,12 @@ Command.prototype.execute = function() { if(iconType && iconText) { iconContent = $tw.utils.makeDataUri(iconText,iconType); } - skinnyList.push($tw.utils.extend({},tiddler,{text: undefined, readme: readmeContent, icon: iconContent})); + skinnyList.push($tw.utils.extend({},tiddler,{ + text: undefined, + readme: readmeContent, + "contains-javascript": doesContainJavaScript ? "yes" : "no", + icon: iconContent + })); }); // Save the catalogue tiddler if(skinnyListTitle) { diff --git a/core/modules/startup/info.js b/core/modules/startup/info.js index 1ebf568f4..7efaa5b0e 100644 --- a/core/modules/startup/info.js +++ b/core/modules/startup/info.js @@ -18,6 +18,8 @@ exports.before = ["startup"]; exports.after = ["load-modules"]; exports.synchronous = true; +var TITLE_INFO_PLUGIN = "$:/temp/info-plugin"; + exports.startup = function() { // Collect up the info tiddlers var infoTiddlerFields = {}; @@ -32,15 +34,15 @@ exports.startup = function() { }); } }); - // Bake the info tiddlers into a plugin + // Bake the info tiddlers into a plugin. We use the non-standard plugin-type "info" because ordinary plugins are only registered asynchronously after being loaded dynamically var fields = { - title: "$:/temp/info-plugin", + title: TITLE_INFO_PLUGIN, type: "application/json", "plugin-type": "info", text: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces) }; $tw.wiki.addTiddler(new $tw.Tiddler(fields)); - $tw.wiki.readPluginInfo(); + $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]); $tw.wiki.registerPluginTiddlers("info"); $tw.wiki.unpackPluginTiddlers(); }; diff --git a/core/modules/startup/plugins.js b/core/modules/startup/plugins.js new file mode 100644 index 000000000..5dd03bbf1 --- /dev/null +++ b/core/modules/startup/plugins.js @@ -0,0 +1,59 @@ +/*\ +title: $:/core/modules/startup/plugins.js +type: application/javascript +module-type: startup + +Startup logic concerned with managing plugins + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +// Export name and synchronous status +exports.name = "plugins"; +exports.after = ["load-modules"]; +exports.synchronous = true; + +var TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = "$:/status/RequireReloadDueToPluginChange"; + +var PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = "$:/config/RegisterPluginType/"; + +exports.startup = function() { + $tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "no"}); + $tw.wiki.addEventListener("change",function(changes) { + var changesToProcess = [], + requireReloadDueToPluginChange = false; + $tw.utils.each(Object.keys(changes),function(title) { + var tiddler = $tw.wiki.getTiddler(title), + containsModules = $tw.wiki.doesPluginContainModules(title); + if(containsModules) { + requireReloadDueToPluginChange = true; + } else if(tiddler) { + var pluginType = tiddler.fields["plugin-type"]; + if($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields["plugin-type"] || ""),"no") === "yes") { + changesToProcess.push(title); + } + } + }); + if(requireReloadDueToPluginChange) { + $tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "yes"}); + } + // Read or delete the plugin info of the changed tiddlers + if(changesToProcess.length > 0) { + var changes = $tw.wiki.readPluginInfo(changesToProcess); + if(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) { + // (Re-)register any modified plugins + $tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins); + // Unregister any deleted plugins + $tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins); + // Unpack the shadow tiddlers + $tw.wiki.unpackPluginTiddlers(); + } + } + }); +}; + +})(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index a4bc7b650..c531440a3 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1450,5 +1450,25 @@ exports.invokeUpgraders = function(titles,tiddlers) { return messages; }; +// Determine whether a plugin by title contains JS modules. +exports.doesPluginContainModules = function(title) { + return this.doesPluginInfoContainModules(this.getPluginInfo(title) || this.getTiddlerDataCached(title)); +}; + +// Determine whether a plugin info structure contains JS modules. +exports.doesPluginInfoContainModules = function(pluginInfo) { + if(pluginInfo) { + var foundModule = false; + $tw.utils.each(pluginInfo.tiddlers,function(tiddler) { + if(tiddler.type === "application/javascript" && $tw.utils.hop(tiddler,"module-type")) { + foundModule = true; + } + }); + return foundModule; + } else { + return null; + } +}; + })(); diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index b7f84a3c6..0fe8af20d 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -7,6 +7,7 @@ subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/ <$list filter="[<assetInfo>get[original-title]get[version]]" variable="installedVersion" emptyMessage="""{{$:/language/ControlPanel/Plugins/Install/Caption}}"""> {{$:/language/ControlPanel/Plugins/Reinstall/Caption}} </$list> +<$reveal stateTitle=<<assetInfo>> stateField="contains-javascript" type="match" text="yes">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal> </$button> \end @@ -35,7 +36,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$list> </div> <div class="tc-plugin-info-chunk"> -<h1><$view tiddler=<<assetInfo>> field="description"/></h1> +<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field="description"/></h1> <h2><$view tiddler=<<assetInfo>> field="original-title"/></h2> <div><em><$view tiddler=<<assetInfo>> field="version"/></em></div> </div> diff --git a/core/ui/PageTemplate/pluginreloadwarning.tid b/core/ui/PageTemplate/pluginreloadwarning.tid index d7aa21fe4..4ac44ddc9 100644 --- a/core/ui/PageTemplate/pluginreloadwarning.tid +++ b/core/ui/PageTemplate/pluginreloadwarning.tid @@ -3,7 +3,7 @@ tags: $:/tags/PageTemplate \define lingo-base() $:/language/ -<$list filter="[has[plugin-type]haschanged[]!plugin-type[import]limit[1]]"> +<$list filter="[{$:/status/RequireReloadDueToPluginChange}match[yes]]"> <$reveal type="nomatch" state="$:/temp/HidePluginWarning" text="yes"> diff --git a/core/wiki/config/RegisterPluginTypes.multids b/core/wiki/config/RegisterPluginTypes.multids new file mode 100644 index 000000000..d2113728b --- /dev/null +++ b/core/wiki/config/RegisterPluginTypes.multids @@ -0,0 +1,7 @@ +title: $:/config/RegisterPluginType/ + +plugin: yes +theme: yes +language: yes +info: no +import: no From 0017d441d9c74bc96bfe73131239e77e130d72cc Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 16 Sep 2019 12:21:20 +0100 Subject: [PATCH 0327/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.22.tid | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 78c9407c3..d41f5faac 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -7,8 +7,25 @@ type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.21...v5.1.22]]// +! Major Improvements + +Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded or deleted dynamically, without requiring a reload -- as long as they don't contain any ~JavaScript modules. Plugins that require a reload are indicated in the plugin chooser in $:/ControlPanel. + +! Translation Improvements + +* Improved Dutch translation + +! Hackability Improvements + +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/68163684a2e57108e160295e445c194268b873c5]] usage of `publishFilter` in save templates -- see SavingMechanism + +! Bug Fixes + +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4243]] problem with the [[GitLab saver|Saving to a Git service]] + ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: -* \ No newline at end of file +* [[@gernert|https://github.com/gernert]] +* [[@Janno|https://github.com/Janno]] From 7f9823c5b2ed1ef11e47d94d13fa54c98dd8b023 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 16 Sep 2019 13:17:09 +0100 Subject: [PATCH 0328/2376] Dynamic plugins: Fix registration of themes and languages --- core/modules/pluginswitcher.js | 2 ++ core/wiki/config/RegisterPluginTypes.multids | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/modules/pluginswitcher.js b/core/modules/pluginswitcher.js index ab82be933..395dc8b20 100644 --- a/core/modules/pluginswitcher.js +++ b/core/modules/pluginswitcher.js @@ -60,6 +60,8 @@ PluginSwitcher.prototype.switchPlugins = function() { } }; accumulatePlugin(selectedPluginTitle); + // Read the plugin info for the incoming plugins + var changes = $tw.wiki.readPluginInfo(plugins); // Unregister any existing theme tiddlers var unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType); // Register any new theme tiddlers diff --git a/core/wiki/config/RegisterPluginTypes.multids b/core/wiki/config/RegisterPluginTypes.multids index d2113728b..f0e52acd5 100644 --- a/core/wiki/config/RegisterPluginTypes.multids +++ b/core/wiki/config/RegisterPluginTypes.multids @@ -1,7 +1,7 @@ title: $:/config/RegisterPluginType/ plugin: yes -theme: yes -language: yes +theme: no +language: no info: no import: no From 36498867d5e95f70c472af227321254d4e44c695 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Mon, 16 Sep 2019 21:02:11 +0800 Subject: [PATCH 0329/2376] Update chinese translations for Dynamic loading/unloading of plugins (#4264) * Add `Plugins/PluginWillRequireReload` to ControlPanel.multids * Improve `PluginReloadWarning` in Misc.multids --- languages/zh-Hans/ControlPanel.multids | 1 + languages/zh-Hans/Misc.multids | 2 +- languages/zh-Hant/ControlPanel.multids | 1 + languages/zh-Hant/Misc.multids | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 108946d94..c771a8a3c 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -74,6 +74,7 @@ Plugins/NoInformation/Hint: 未提供信息 Plugins/NotInstalled/Hint: 尚未安装此插件 Plugins/OpenPluginLibrary: 开启插件程式库 Plugins/ClosePluginLibrary: 关闭插件程式库 +Plugins/PluginWillRequireReload: (需要重新加载) Plugins/Plugins/Caption: 插件 Plugins/Plugins/Hint: 插件 Plugins/Reinstall/Caption: 重新安装 diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 84f927808..00b5799bf 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -59,7 +59,7 @@ MissingTiddler/Hint: 佚失条目 "<$text text=<<currentTiddler>>/>" - 点击 {{ No: 否 OfficialPluginLibrary: ~TiddlyWiki 官方插件程式库 OfficialPluginLibrary/Hint: 此为在 tiddlywiki.com 的 ~TiddlyWiki 官方插件程式库。由核心团队维护的插件、主题和语言包。 -PluginReloadWarning: 请保存 {{$:/core/ui/Buttons/save-wiki}} 并刷新页面 {{$:/core/ui/Buttons/refresh}} 允许更改插件才能生效 +PluginReloadWarning: 请保存 {{$:/core/ui/Buttons/save-wiki}} 并刷新页面 {{$:/core/ui/Buttons/refresh}} ,使 ~JavaScript 插件的更改生效 RecentChanges/DateFormat: YYYY年0MM月0DD日 SystemTiddler/Tooltip: 此为系统条目 SystemTiddlers/Include/Prompt: 包括系统条目 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 888f8b4bf..f94406edb 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -74,6 +74,7 @@ Plugins/NoInformation/Hint: 未提供資訊 Plugins/NotInstalled/Hint: 尚未安裝此插件 Plugins/OpenPluginLibrary: 開啟插件程式庫 Plugins/ClosePluginLibrary: 關閉插件程式庫 +Plugins/PluginWillRequireReload: (需要重新載入) Plugins/Plugins/Caption: 插件 Plugins/Plugins/Hint: 插件 Plugins/Reinstall/Caption: 重新安裝 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index c583a2ed1..31569388b 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -59,7 +59,7 @@ MissingTiddler/Hint: 佚失條目 "<$text text=<<currentTiddler>>/>" - 點擊 {{ No: 否 OfficialPluginLibrary: ~TiddlyWiki 官方插件程式庫 OfficialPluginLibrary/Hint: 此為在 tiddlywiki.com 的 ~TiddlyWiki 官方插件程式庫。由核心團隊維護的插件、主題和語言包。 -PluginReloadWarning: 請儲存 {{$:/core/ui/Buttons/save-wiki}} 並刷新頁面 {{$:/core/ui/Buttons/refresh}} 允許更改插件才能生效 +PluginReloadWarning: 請儲存 {{$:/core/ui/Buttons/save-wiki}} 並刷新頁面 {{$:/core/ui/Buttons/refresh}} ,使 ~JavaScript 插件的更改生效 RecentChanges/DateFormat: YYYY年0MM月0DD日 SystemTiddler/Tooltip: 此為系統條目 SystemTiddlers/Include/Prompt: 包括系統條目 From 1150c87edb7478af6cc943eb0ef52fdf3051c121 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 16 Sep 2019 16:15:26 +0100 Subject: [PATCH 0330/2376] Add [is[binary]] operator --- core/modules/wiki.js | 10 ++++++++++ editions/tw5.com/tiddlers/filters/is.tid | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index c531440a3..e7f84e13c 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -221,6 +221,16 @@ exports.isImageTiddler = function(title) { } }; +exports.isBinaryTiddler = function(title) { + var tiddler = this.getTiddler(title); + if(tiddler) { + var contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/vnd.tiddlywiki"]; + return !!contentTypeInfo && contentTypeInfo.encoding === "base64"; + } else { + return null; + } +}; + /* Like addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported */ diff --git a/editions/tw5.com/tiddlers/filters/is.tid b/editions/tw5.com/tiddlers/filters/is.tid index bec256edf..b18dffe42 100644 --- a/editions/tw5.com/tiddlers/filters/is.tid +++ b/editions/tw5.com/tiddlers/filters/is.tid @@ -1,5 +1,5 @@ created: 20140410103123179 -modified: 20190225130632157 +modified: 20190916151432497 tags: [[Filter Operators]] [[Common Operators]] [[Negatable Operators]] title: is Operator type: text/vnd.tiddlywiki @@ -16,6 +16,7 @@ The parameter <<.place C>> is one of the following fundamental categories: |!Category |!Matches any tiddler title that... | |^`current` |is the [[current tiddler|Current Tiddler]] | |^`image` |has an image ContentType | +|^`binary` |has a binary ContentType | |^`missing` |does not exist (other than possibly as a shadow tiddler), regardless of whether there are any links to it | |^`orphan` |has no [[hard links|Hard and Soft Links]] to it | |^`shadow` |is a [[shadow tiddler|ShadowTiddlers]], regardless of whether it has been overridden with a non-shadow tiddler | From 8c894612914e21cf941a1daa953538c28ce91d8e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 16 Sep 2019 16:16:03 +0100 Subject: [PATCH 0331/2376] Adding [is[binary]] filter -- Missed off 1150c87ed --- core/modules/filters/is/binary.js | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 core/modules/filters/is/binary.js diff --git a/core/modules/filters/is/binary.js b/core/modules/filters/is/binary.js new file mode 100644 index 000000000..01b9aabd3 --- /dev/null +++ b/core/modules/filters/is/binary.js @@ -0,0 +1,36 @@ +/*\ +title: $:/core/modules/filters/is/binary.js +type: application/javascript +module-type: isfilteroperator + +Filter function for [is[binary]] + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.binary = function(source,prefix,options) { + var results = []; + if(prefix === "!") { + source(function(tiddler,title) { + if(!options.wiki.isBinaryTiddler(title)) { + results.push(title); + } + }); + } else { + source(function(tiddler,title) { + if(options.wiki.isBinaryTiddler(title)) { + results.push(title); + } + }); + } + return results; +}; + +})(); From 83954582f465677ebbd2e16dfea504b95b61fffe Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 16 Sep 2019 16:16:18 +0100 Subject: [PATCH 0332/2376] Text-slicer: Only show slice button for text tiddlers --- plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid b/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid index 487ba7cda..1a52ff905 100644 --- a/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid +++ b/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid @@ -10,6 +10,7 @@ description: Slice this text tiddler by headings and lists Slice this text tiddler into chunks \end +<$list filter="[<currentTiddler>!is[image]!is[binary]]" variable="ignore"> <$button tooltip=<<hint>> aria-label=<<hint>> class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-modal" $param="$:/plugins/tiddlywiki/text-slicer/ui/slice-modal" currentTiddler=<<currentTiddler>>/> <$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> @@ -18,4 +19,5 @@ Slice this text tiddler into chunks <$list filter="[<tv-config-toolbar-text>prefix[yes]]"> <span class="tc-btn-text"> Slice tiddler</span> </$list> -</$button> \ No newline at end of file +</$button> +</$list> From 336f1ceae32904a9a7118230d9bab91b98883926 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 17 Sep 2019 08:49:39 +0100 Subject: [PATCH 0333/2376] Indicate in import listing whether a plugin contains JS modules --- core/modules/upgraders/plugins.js | 37 +++++++++++++++++-------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/core/modules/upgraders/plugins.js b/core/modules/upgraders/plugins.js index acd8f6db7..d1e699762 100644 --- a/core/modules/upgraders/plugins.js +++ b/core/modules/upgraders/plugins.js @@ -39,26 +39,29 @@ exports.upgrade = function(wiki,titles,tiddlers) { $tw.utils.each(titles,function(title) { var incomingTiddler = tiddlers[title]; // Check if we're dealing with a plugin - if(incomingTiddler && incomingTiddler["plugin-type"] && incomingTiddler.version) { - // Upgrade the incoming plugin if it is in the upgrade library - var libraryTiddler = getLibraryTiddler(title); - if(libraryTiddler && libraryTiddler["plugin-type"] && libraryTiddler.version) { - tiddlers[title] = libraryTiddler; - messages[title] = $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}}); - return; - } - // Suppress the incoming plugin if it is older than the currently installed one - var existingTiddler = wiki.getTiddler(title); - if(existingTiddler && existingTiddler.hasField("plugin-type") && existingTiddler.hasField("version")) { - // Reject the incoming plugin by blanking all its fields - if($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) { - tiddlers[title] = Object.create(null); - messages[title] = $tw.language.getString("Import/Upgrader/Plugins/Suppressed/Version",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}}); + if(incomingTiddler && incomingTiddler["plugin-type"]) { + // Check whether the plugin contains JS modules + var doesContainJavaScript = $tw.wiki.doesPluginInfoContainModules(JSON.parse(incomingTiddler.text)) ? ($tw.wiki.getTiddlerText("$:/language/ControlPanel/Plugins/PluginWillRequireReload") + " ") : ""; + messages[title] = doesContainJavaScript; + if(incomingTiddler.version) { + // Upgrade the incoming plugin if it is in the upgrade library + var libraryTiddler = getLibraryTiddler(title); + if(libraryTiddler && libraryTiddler["plugin-type"] && libraryTiddler.version) { + tiddlers[title] = libraryTiddler; + messages[title] = doesContainJavaScript + $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}}); return; } + // Suppress the incoming plugin if it is older than the currently installed one + var existingTiddler = wiki.getTiddler(title); + if(existingTiddler && existingTiddler.hasField("plugin-type") && existingTiddler.hasField("version")) { + // Reject the incoming plugin by blanking all its fields + if($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) { + tiddlers[title] = Object.create(null); + messages[title] = doesContainJavaScript + $tw.language.getString("Import/Upgrader/Plugins/Suppressed/Version",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}}); + return; + } + } } - } - if(incomingTiddler && incomingTiddler["plugin-type"]) { // Check whether the plugin is on the blocked list var blockInfo = BLOCKED_PLUGINS[title]; if(blockInfo) { From 1dbab6fd0e9179b89f8002ab5061583c3df3b6f2 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 18 Sep 2019 21:10:21 +0100 Subject: [PATCH 0334/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.22.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index d41f5faac..ea0cfdfec 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -9,7 +9,7 @@ type: text/vnd.tiddlywiki ! Major Improvements -Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded or deleted dynamically, without requiring a reload -- as long as they don't contain any ~JavaScript modules. Plugins that require a reload are indicated in the plugin chooser in $:/ControlPanel. +Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded or deleted dynamically, without requiring a reload -- as long as they don't contain any ~JavaScript modules. Plugins that require a reload are indicated in the plugin chooser in [[$:/ControlPanel]]. ! Translation Improvements @@ -17,6 +17,7 @@ Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded ! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1150c87edb7478af6cc943eb0ef52fdf3051c121]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/8c894612914e21cf941a1daa953538c28ce91d8e]]) new `[is[binary]]` operand for the [[is Operator]] * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/68163684a2e57108e160295e445c194268b873c5]] usage of `publishFilter` in save templates -- see SavingMechanism ! Bug Fixes From bf9aeb5755b693977ad48c0a820faa3105887b7b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 19 Sep 2019 13:04:10 +0100 Subject: [PATCH 0335/2376] Improve plugin metadata, and add a "name" field The "name" is optional, but makes the library listing much clearer. --- plugins/tiddlywiki/async/plugin.info | 6 +++--- plugins/tiddlywiki/aws/plugin.info | 5 ++--- plugins/tiddlywiki/bibtex/plugin.info | 4 ++-- plugins/tiddlywiki/blog/plugin.info | 5 ++--- plugins/tiddlywiki/browser-sniff/plugin.info | 5 ++--- plugins/tiddlywiki/browser-storage/plugin.info | 5 ++--- plugins/tiddlywiki/cecily/plugin.info | 3 +-- plugins/tiddlywiki/classictools/plugin.info | 5 ++--- plugins/tiddlywiki/codemirror-autocomplete/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-closebrackets/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-closetag/plugin.info | 4 ++-- .../tiddlywiki/codemirror-fullscreen-editing/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info | 4 ++-- .../tiddlywiki/codemirror-keymap-sublime-text/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-keymap-vim/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-mode-css/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-mode-javascript/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-mode-markdown/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-mode-xml/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror-search-replace/plugin.info | 4 ++-- plugins/tiddlywiki/codemirror/plugin.info | 4 ++-- plugins/tiddlywiki/comments/plugin.info | 5 ++--- plugins/tiddlywiki/d3/plugin.info | 5 ++--- plugins/tiddlywiki/dynaview/plugin.info | 3 +-- plugins/tiddlywiki/evernote/plugin.info | 3 +-- plugins/tiddlywiki/external-attachments/plugin.info | 5 ++--- plugins/tiddlywiki/filesystem/plugin.info | 5 ++--- plugins/tiddlywiki/github-fork-ribbon/plugin.info | 3 ++- plugins/tiddlywiki/googleanalytics/plugin.info | 5 ++--- plugins/tiddlywiki/hammerjs/plugin.info | 6 +++--- plugins/tiddlywiki/help/plugin.info | 5 ++--- plugins/tiddlywiki/highlight/plugin.info | 6 +++--- plugins/tiddlywiki/innerwiki/plugin.info | 5 ++--- plugins/tiddlywiki/internals/plugin.info | 3 +-- plugins/tiddlywiki/jasmine/plugin.info | 5 ++--- plugins/tiddlywiki/jszip/plugin.info | 6 +++--- plugins/tiddlywiki/katex/plugin.info | 5 ++--- plugins/tiddlywiki/markdown/plugin.info | 5 ++--- plugins/tiddlywiki/mobiledragdrop/plugin.info | 4 ++-- plugins/tiddlywiki/nodewebkitsaver/plugin.info | 5 ++--- plugins/tiddlywiki/pluginlibrary/plugin.info | 3 +-- plugins/tiddlywiki/powered-by-tiddlywiki/plugin.info | 5 ++--- plugins/tiddlywiki/qrcode/plugin.info | 4 ++-- plugins/tiddlywiki/railroad/plugin.info | 4 ++-- plugins/tiddlywiki/savetrail/plugin.info | 5 ++--- plugins/tiddlywiki/sax/plugin.info | 4 ++-- plugins/tiddlywiki/stacked-view/plugin.info | 3 +-- plugins/tiddlywiki/tahoelafs/plugin.info | 3 +-- plugins/tiddlywiki/text-slicer/plugin.info | 3 +-- plugins/tiddlywiki/tiddlyweb/plugin.info | 5 ++--- plugins/tiddlywiki/translators/plugin.info | 3 +-- plugins/tiddlywiki/tw2parser/plugin.info | 4 ++-- plugins/tiddlywiki/tw5.com-docs/plugin.info | 3 +-- plugins/tiddlywiki/twitter/plugin.info | 5 ++--- plugins/tiddlywiki/upgrade/plugin.info | 3 +-- plugins/tiddlywiki/xlsx-utils/plugin.info | 3 +-- plugins/tiddlywiki/xmldom/plugin.info | 5 ++--- 60 files changed, 112 insertions(+), 144 deletions(-) diff --git a/plugins/tiddlywiki/async/plugin.info b/plugins/tiddlywiki/async/plugin.info index 701c3bd41..971160d1f 100644 --- a/plugins/tiddlywiki/async/plugin.info +++ b/plugins/tiddlywiki/async/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/async", - "description": "Wrapper for async.js by Caolan McMahon", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Async", + "description": "async.js library", + "author": "Caolan McMahon", "list": "readme license" } diff --git a/plugins/tiddlywiki/aws/plugin.info b/plugins/tiddlywiki/aws/plugin.info index 08ee1fd44..89f248824 100644 --- a/plugins/tiddlywiki/aws/plugin.info +++ b/plugins/tiddlywiki/aws/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/aws", - "description": "Tools for working with Amazon Web Services", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "AWS", + "description": "Amazon Web Services extensions and tools", "list": "readme setup commands lambda" } diff --git a/plugins/tiddlywiki/bibtex/plugin.info b/plugins/tiddlywiki/bibtex/plugin.info index 4b88be21e..d21b48844 100644 --- a/plugins/tiddlywiki/bibtex/plugin.info +++ b/plugins/tiddlywiki/bibtex/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/bibtex", + "name": "BibTeX", "description": "BibTeX importer", - "author": "Henrik Muehe and Mikola Lysenko, adapted by Jeremy Ruston", - "plugin-type": "plugin", + "author": "Henrik Muehe and Mikola Lysenko", "list": "readme license" } diff --git a/plugins/tiddlywiki/blog/plugin.info b/plugins/tiddlywiki/blog/plugin.info index a1b079ccc..cdc82558a 100644 --- a/plugins/tiddlywiki/blog/plugin.info +++ b/plugins/tiddlywiki/blog/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/blog", - "description": "Tools for using TiddlyWiki to publish blogs", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Blog", + "description": "Blog publishing tools", "list": "readme docs" } diff --git a/plugins/tiddlywiki/browser-sniff/plugin.info b/plugins/tiddlywiki/browser-sniff/plugin.info index 5ec4eefac..06e43726a 100644 --- a/plugins/tiddlywiki/browser-sniff/plugin.info +++ b/plugins/tiddlywiki/browser-sniff/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/browser-sniff", - "description": "Browser sniffing", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Browser Sniff", + "description": "Browser feature detection", "list": "readme usage" } diff --git a/plugins/tiddlywiki/browser-storage/plugin.info b/plugins/tiddlywiki/browser-storage/plugin.info index 68dd147d2..772236e44 100644 --- a/plugins/tiddlywiki/browser-storage/plugin.info +++ b/plugins/tiddlywiki/browser-storage/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/browser-storage", - "description": "Browser-based local storage", - "author": "Jeremy Ruston ", - "core-version": ">=5.0.0", + "name": "Browser Storage", + "description": "Local storage in the browser", "list": "readme settings" } diff --git a/plugins/tiddlywiki/cecily/plugin.info b/plugins/tiddlywiki/cecily/plugin.info index f18a47103..664e3bcba 100644 --- a/plugins/tiddlywiki/cecily/plugin.info +++ b/plugins/tiddlywiki/cecily/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/cecily", + "name": "Cecily", "description": "Zoomable storyview (Cecily)", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme" } diff --git a/plugins/tiddlywiki/classictools/plugin.info b/plugins/tiddlywiki/classictools/plugin.info index 0e63bdfcf..5a07f8106 100644 --- a/plugins/tiddlywiki/classictools/plugin.info +++ b/plugins/tiddlywiki/classictools/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/classictools", - "description": "TiddlyWiki Classic manipulation tools", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Classic Tools", + "description": "TiddlyWiki Classic tools", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-autocomplete/plugin.info b/plugins/tiddlywiki/codemirror-autocomplete/plugin.info index aae66a787..f46e5bdac 100755 --- a/plugins/tiddlywiki/codemirror-autocomplete/plugin.info +++ b/plugins/tiddlywiki/codemirror-autocomplete/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-autocomplete", - "description": "CodeMirror AddOn: Autocompletion", - "author": "JeremyRuston", + "name": "CodeMirror Autocomplete", + "description": "Autocompletion for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-closebrackets/plugin.info b/plugins/tiddlywiki/codemirror-closebrackets/plugin.info index c308d1045..a4eb8cac1 100755 --- a/plugins/tiddlywiki/codemirror-closebrackets/plugin.info +++ b/plugins/tiddlywiki/codemirror-closebrackets/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-closebrackets", - "description": "CodeMirror AddOn: Close Brackets", - "author": "JeremyRuston", + "name": "CodeMirror Close Brackets", + "description": "Close brackets for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-closetag/plugin.info b/plugins/tiddlywiki/codemirror-closetag/plugin.info index 81d404892..c8ec68505 100755 --- a/plugins/tiddlywiki/codemirror-closetag/plugin.info +++ b/plugins/tiddlywiki/codemirror-closetag/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-closetag", - "description": "CodeMirror AddOn: Auto-Close Tags", - "author": "JeremyRuston", + "name": "CodeMirror Close Tag", + "description": "Close tags automatically for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info b/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info index e95e5cc29..89ba08df1 100755 --- a/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info +++ b/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-fullscreen", - "description": "CodeMirror AddOn: Fullscreen Editing", - "author": "JeremyRuston", + "name": "CodeMirror Fullscreen", + "description": "Fullscreen editing for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info b/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info index 7844a4932..519472a6c 100755 --- a/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-keymap-emacs", - "description": "CodeMirror Keymap: Emacs", - "author": "JeremyRuston", + "name": "CodeMirror Keymap Emacs", + "description": "Keymap compatible with Emacs for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info b/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info index 5be49fd36..6f7ba6067 100755 --- a/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-keymap-sublime-text", - "description": "CodeMirror Keymap: Sublime Text", - "author": "JeremyRuston", + "name": "CodeMirror Keymap Sublime Text", + "description": "Keymap compatible with Sublime Text for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info b/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info index 17770299c..0f5387d5c 100755 --- a/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-keymap-vim", - "description": "CodeMirror Keymap: Vim", - "author": "JeremyRuston", + "name": "CodeMirror Keymap Vim", + "description": "Keymap compatible with Vim for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-css/plugin.info b/plugins/tiddlywiki/codemirror-mode-css/plugin.info index 115afed8c..e304dd256 100755 --- a/plugins/tiddlywiki/codemirror-mode-css/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-css/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-mode-css", - "description": "CodeMirror Mode: CSS Highlighting", - "author": "JeremyRuston", + "name": "CodeMirror Mode CSS", + "description": "CSS highlighting mode for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info b/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info index a7eef49c6..a0f2f0528 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-mode-htmlembedded", - "description": "CodeMirror Mode: Embedded-HTML Highlighting", - "author": "JeremyRuston", + "name": "CodeMirror Mode HTML Embedded", + "description": "Embedded HTML highlighting mode for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info b/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info index 99d12fde9..a99c6e623 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-mode-htmlmixed", - "description": "CodeMirror Mode: HTML Highlighting", - "author": "JeremyRuston", + "name": "CodeMirror Mode HTML Mixed", + "description": "HTML mixed highlighting mode for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info b/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info index 6bbc03273..c4d39ee7b 100755 --- a/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-mode-javascript", - "description": "CodeMirror Mode: Javascript Highlighting", - "author": "JeremyRuston", + "name": "CodeMirror Mode JavaScript", + "description": "JavaScript highlighting mode for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info b/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info index a9c8f1fd1..05593c4a1 100755 --- a/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-mode-markdown", - "description": "CodeMirror Mode: Markdown Highlighting", - "author": "JeremyRuston", + "name": "CodeMirror Mode Markdown", + "description": "Markdown highlighting mode for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info b/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info index e58c0bab0..1d6244a81 100755 --- a/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki", - "description": "CodeMirror Mode: Tiddlywiki Classic Highlighting", - "author": "JeremyRuston", + "name": "CodeMirror Mode TiddlyWiki Classic", + "description": "Tiddlywiki Classic highlighting mode for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-xml/plugin.info b/plugins/tiddlywiki/codemirror-mode-xml/plugin.info index 29ff6c7bc..35065d0cf 100755 --- a/plugins/tiddlywiki/codemirror-mode-xml/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-xml/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-mode-xml", - "description": "CodeMirror Mode: XML Highlighting", - "author": "JeremyRuston", + "name": "CodeMirror Mode XML", + "description": "XML highlighting mode for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-search-replace/plugin.info b/plugins/tiddlywiki/codemirror-search-replace/plugin.info index 6f31daa04..15f10dfa5 100755 --- a/plugins/tiddlywiki/codemirror-search-replace/plugin.info +++ b/plugins/tiddlywiki/codemirror-search-replace/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror-search-replace", - "description": "CodeMirror AddOn: Search and Replace", - "author": "JeremyRuston", + "name": "CodeMirror Search and Replace", + "description": "Search and replace for CodeMirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror/plugin.info b/plugins/tiddlywiki/codemirror/plugin.info index bbe17c5af..739b9042f 100755 --- a/plugins/tiddlywiki/codemirror/plugin.info +++ b/plugins/tiddlywiki/codemirror/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/codemirror", - "description": "CodeMirror _Editor", - "author": "JeremyRuston", + "name": "CodeMirror", + "description": "CodeMirror editor", "list": "readme usage keyboard license" } diff --git a/plugins/tiddlywiki/comments/plugin.info b/plugins/tiddlywiki/comments/plugin.info index 8be289f4b..8e99b6546 100644 --- a/plugins/tiddlywiki/comments/plugin.info +++ b/plugins/tiddlywiki/comments/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/comments", - "description": "Comments", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Comments", + "description": "Threaded tiddler comments", "list": "readme config" } diff --git a/plugins/tiddlywiki/d3/plugin.info b/plugins/tiddlywiki/d3/plugin.info index d6fc739eb..1c0b7095d 100644 --- a/plugins/tiddlywiki/d3/plugin.info +++ b/plugins/tiddlywiki/d3/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/d3", - "description": "D3: data visualisation", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "D3", + "description": "D3 data visualisation demo", "list": "readme" } diff --git a/plugins/tiddlywiki/dynaview/plugin.info b/plugins/tiddlywiki/dynaview/plugin.info index 7c90e3a53..e47f5ca9b 100644 --- a/plugins/tiddlywiki/dynaview/plugin.info +++ b/plugins/tiddlywiki/dynaview/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/dynaview", + "name": "DynaView", "description": "Dynamic scrolling and zooming effects", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme docs examples config" } diff --git a/plugins/tiddlywiki/evernote/plugin.info b/plugins/tiddlywiki/evernote/plugin.info index baf35156e..5aa63932c 100644 --- a/plugins/tiddlywiki/evernote/plugin.info +++ b/plugins/tiddlywiki/evernote/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/evernote", + "name": "Evernote", "description": "Evernote migration tools", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme docs" } diff --git a/plugins/tiddlywiki/external-attachments/plugin.info b/plugins/tiddlywiki/external-attachments/plugin.info index a2d4f9bea..5a294abcc 100644 --- a/plugins/tiddlywiki/external-attachments/plugin.info +++ b/plugins/tiddlywiki/external-attachments/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/external-attachments", - "description": "External attachment support for TiddlyDesktop et al.", - "author": "Jeremy Ruston", - "core-version": ">=5.0.0", + "name": "External Attachments", + "description": "External attachments for TiddlyDesktop", "list": "readme settings" } diff --git a/plugins/tiddlywiki/filesystem/plugin.info b/plugins/tiddlywiki/filesystem/plugin.info index d98a42139..17cfe96c9 100644 --- a/plugins/tiddlywiki/filesystem/plugin.info +++ b/plugins/tiddlywiki/filesystem/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/filesystem", - "description": "Local filesystem syncadaptor", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Filesystem", + "description": "Synchronise changes to the local filesystem", "list": "readme" } diff --git a/plugins/tiddlywiki/github-fork-ribbon/plugin.info b/plugins/tiddlywiki/github-fork-ribbon/plugin.info index 12853a48f..fdef00d7e 100644 --- a/plugins/tiddlywiki/github-fork-ribbon/plugin.info +++ b/plugins/tiddlywiki/github-fork-ribbon/plugin.info @@ -1,6 +1,7 @@ { "title": "$:/plugins/tiddlywiki/github-fork-ribbon", - "description": "Corner ribbon", + "name": "GitHub Fork Ribbon", + "description": "GitHub-inspired corner ribbon", "author": "Simon Whitaker, adapted for TiddlyWiki by JeremyRuston", "list": "readme usage" } diff --git a/plugins/tiddlywiki/googleanalytics/plugin.info b/plugins/tiddlywiki/googleanalytics/plugin.info index 4754bca2a..7a23112c1 100644 --- a/plugins/tiddlywiki/googleanalytics/plugin.info +++ b/plugins/tiddlywiki/googleanalytics/plugin.info @@ -1,8 +1,7 @@ { "title": "$:/plugins/tiddlywiki/googleanalytics", - "description": "Google Analytics: website statistics", - "author": "JeremyRuston", + "name": "Google Analytics", + "description": "Website visitor statistics from Google", "contributor": "Sylvain Comte", - "core-version": ">=5.0.0", "list": "readme settings usage" } diff --git a/plugins/tiddlywiki/hammerjs/plugin.info b/plugins/tiddlywiki/hammerjs/plugin.info index 3aa05269c..77a4be4ad 100644 --- a/plugins/tiddlywiki/hammerjs/plugin.info +++ b/plugins/tiddlywiki/hammerjs/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/hammerjs", - "description": "HammerJS library by Jorik Tangelder (Eight Media)", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "HammerJS", + "description": "HammerJS touch gesture library", + "author": "Jorik Tangelder (Eight Media)", "list": "readme license" } diff --git a/plugins/tiddlywiki/help/plugin.info b/plugins/tiddlywiki/help/plugin.info index f43237a07..6e75aa3bc 100644 --- a/plugins/tiddlywiki/help/plugin.info +++ b/plugins/tiddlywiki/help/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/help", - "description": "Help panel for TiddlyWiki", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Help", + "description": "Floating help panel", "list": "readme" } diff --git a/plugins/tiddlywiki/highlight/plugin.info b/plugins/tiddlywiki/highlight/plugin.info index bcc1ffa69..663b0dc5f 100644 --- a/plugins/tiddlywiki/highlight/plugin.info +++ b/plugins/tiddlywiki/highlight/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/highlight", - "description": "Highlight.js: syntax highlighting", - "author": "JoaoBolila", - "core-version": ">=5.0.0", + "name": "Highlight", + "description": "Highlight.js syntax highlighting", + "author": "Joao Bolila", "list": "readme usage howto license" } diff --git a/plugins/tiddlywiki/innerwiki/plugin.info b/plugins/tiddlywiki/innerwiki/plugin.info index 07b1e550d..d574d4923 100644 --- a/plugins/tiddlywiki/innerwiki/plugin.info +++ b/plugins/tiddlywiki/innerwiki/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/innerwiki", - "description": "Innerwiki: programmable screenshots", - "author": "Jeremy Ruston", - "plugin-type": "plugin", + "name": "Innerwiki", + "description": "Innerwikis for screenshots and hacking", "list": "readme docs examples" } diff --git a/plugins/tiddlywiki/internals/plugin.info b/plugins/tiddlywiki/internals/plugin.info index 78634903c..e64ded56a 100644 --- a/plugins/tiddlywiki/internals/plugin.info +++ b/plugins/tiddlywiki/internals/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/internals", + "name": "Internals", "description": "Tools for exploring the internals of TiddlyWiki", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme" } diff --git a/plugins/tiddlywiki/jasmine/plugin.info b/plugins/tiddlywiki/jasmine/plugin.info index fdbb836dd..f46a8e1e9 100644 --- a/plugins/tiddlywiki/jasmine/plugin.info +++ b/plugins/tiddlywiki/jasmine/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/jasmine", - "description": "Jasmine: testing framework", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Jasmine", + "description": "Jasmine testing framework", "list": "readme" } diff --git a/plugins/tiddlywiki/jszip/plugin.info b/plugins/tiddlywiki/jszip/plugin.info index f3cf1789f..ee0d00145 100644 --- a/plugins/tiddlywiki/jszip/plugin.info +++ b/plugins/tiddlywiki/jszip/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/jszip", - "description": "Wrapper for JSZip by Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "JSZip", + "description": "JSZip library", + "author": "Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso", "list": "readme license" } diff --git a/plugins/tiddlywiki/katex/plugin.info b/plugins/tiddlywiki/katex/plugin.info index bf57322a1..13df252d8 100644 --- a/plugins/tiddlywiki/katex/plugin.info +++ b/plugins/tiddlywiki/katex/plugin.info @@ -1,8 +1,7 @@ { "title": "$:/plugins/tiddlywiki/katex", - "description": "KaTeX: mathematical typography", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "KaTeX", + "description": "KaTeX library for mathematical typography", "list": "readme usage", "library-version": "v0.10.2" } diff --git a/plugins/tiddlywiki/markdown/plugin.info b/plugins/tiddlywiki/markdown/plugin.info index 293d26359..b95685831 100755 --- a/plugins/tiddlywiki/markdown/plugin.info +++ b/plugins/tiddlywiki/markdown/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/markdown", - "description": "Markdown parser", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Markdown", + "description": "Markdown parser based on markdown-js", "list": "readme usage" } diff --git a/plugins/tiddlywiki/mobiledragdrop/plugin.info b/plugins/tiddlywiki/mobiledragdrop/plugin.info index a8fff1e6b..cb8824d82 100644 --- a/plugins/tiddlywiki/mobiledragdrop/plugin.info +++ b/plugins/tiddlywiki/mobiledragdrop/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/mobiledragdrop", + "name": "Mobile Drag Drop", "description": "Mobile drag and drop shim", - "author": "Tim Ruffles, adapted by Jeremy Ruston ", - "core-version": ">=5.0.0", + "author": "Tim Ruffles", "list": "readme license" } diff --git a/plugins/tiddlywiki/nodewebkitsaver/plugin.info b/plugins/tiddlywiki/nodewebkitsaver/plugin.info index c2a64d8fe..d292c9e85 100644 --- a/plugins/tiddlywiki/nodewebkitsaver/plugin.info +++ b/plugins/tiddlywiki/nodewebkitsaver/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/nodewebkitsaver", - "description": "NW.js saver", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "nw.js Saver", + "description": "Saver for nw.js", "list": "readme" } diff --git a/plugins/tiddlywiki/pluginlibrary/plugin.info b/plugins/tiddlywiki/pluginlibrary/plugin.info index 07918d663..a86c01eb8 100644 --- a/plugins/tiddlywiki/pluginlibrary/plugin.info +++ b/plugins/tiddlywiki/pluginlibrary/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/pluginlibrary", + "name": "Plugin Library", "description": "Plugin library builder", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme" } diff --git a/plugins/tiddlywiki/powered-by-tiddlywiki/plugin.info b/plugins/tiddlywiki/powered-by-tiddlywiki/plugin.info index 674ee850e..e34f059ae 100644 --- a/plugins/tiddlywiki/powered-by-tiddlywiki/plugin.info +++ b/plugins/tiddlywiki/powered-by-tiddlywiki/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/powered-by-tiddlywiki", - "description": "Powered by TiddlyWiki Banner", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Powered By TiddlyWiki", + "description": "Powered by TiddlyWiki banner", "list": "readme" } diff --git a/plugins/tiddlywiki/qrcode/plugin.info b/plugins/tiddlywiki/qrcode/plugin.info index 1be38b1a3..976bb2b3b 100644 --- a/plugins/tiddlywiki/qrcode/plugin.info +++ b/plugins/tiddlywiki/qrcode/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/qrcode", + "name": "QR Code", "description": "QR Code generator", - "author": "Zeno Zeng, adapted by Jeremy Ruston", - "plugin-type": "plugin", + "author": "Zeno Zeng", "list": "readme usage examples license" } diff --git a/plugins/tiddlywiki/railroad/plugin.info b/plugins/tiddlywiki/railroad/plugin.info index f561c7bd3..95d3f65cc 100644 --- a/plugins/tiddlywiki/railroad/plugin.info +++ b/plugins/tiddlywiki/railroad/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/railroad", + "name": "Railroad", "description": "Railroad diagram generator", - "author": "AstridElocson", - "plugin-type": "plugin", + "author": "Astrid Elocson", "list": "readme usage syntax example" } diff --git a/plugins/tiddlywiki/savetrail/plugin.info b/plugins/tiddlywiki/savetrail/plugin.info index 6e7206434..67cd4c20f 100644 --- a/plugins/tiddlywiki/savetrail/plugin.info +++ b/plugins/tiddlywiki/savetrail/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/savetrail", - "description": "Auto-download modified tiddlers", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Save Trail", + "description": "Automatically download modified tiddlers", "list": "readme settings" } diff --git a/plugins/tiddlywiki/sax/plugin.info b/plugins/tiddlywiki/sax/plugin.info index 033f1a875..257f2abb3 100644 --- a/plugins/tiddlywiki/sax/plugin.info +++ b/plugins/tiddlywiki/sax/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/sax", - "description": "Wrapper for sax.js library by Isaac Z. Schlueter", + "name": "sax js", + "description": "sax.js library", "author": "Isaac Z. Schlueter", - "core-version": ">=5.0.0", "list": "readme license" } diff --git a/plugins/tiddlywiki/stacked-view/plugin.info b/plugins/tiddlywiki/stacked-view/plugin.info index 2872a79d3..0b2ae3c02 100644 --- a/plugins/tiddlywiki/stacked-view/plugin.info +++ b/plugins/tiddlywiki/stacked-view/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/stacked-view", + "name": "Stacked View", "description": "Stacked card storyview", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme" } diff --git a/plugins/tiddlywiki/tahoelafs/plugin.info b/plugins/tiddlywiki/tahoelafs/plugin.info index f44937540..7b522e937 100644 --- a/plugins/tiddlywiki/tahoelafs/plugin.info +++ b/plugins/tiddlywiki/tahoelafs/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/tahoelafs", + "name": "TahoeLAFS", "description": "Tahoe-LAFS saver", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme" } diff --git a/plugins/tiddlywiki/text-slicer/plugin.info b/plugins/tiddlywiki/text-slicer/plugin.info index 97c06fd5c..937014060 100644 --- a/plugins/tiddlywiki/text-slicer/plugin.info +++ b/plugins/tiddlywiki/text-slicer/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/text-slicer", + "name": "Text Slicer", "description": "Tools for slicing text into tiddlers", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme docs" } diff --git a/plugins/tiddlywiki/tiddlyweb/plugin.info b/plugins/tiddlywiki/tiddlyweb/plugin.info index b0e27db3e..0ba3464ec 100644 --- a/plugins/tiddlywiki/tiddlyweb/plugin.info +++ b/plugins/tiddlywiki/tiddlyweb/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/tiddlyweb", - "description": "TiddlyWeb and TiddlySpace components", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "TiddlyWeb", + "description": "Sync changes to TW5 server or TiddlyWeb server", "list": "readme" } diff --git a/plugins/tiddlywiki/translators/plugin.info b/plugins/tiddlywiki/translators/plugin.info index c2a12e4da..e77ea9b3f 100644 --- a/plugins/tiddlywiki/translators/plugin.info +++ b/plugins/tiddlywiki/translators/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/translators", + "name": "Translators", "description": "Translation editing tools", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme" } diff --git a/plugins/tiddlywiki/tw2parser/plugin.info b/plugins/tiddlywiki/tw2parser/plugin.info index 57fbcec5c..409ae1447 100644 --- a/plugins/tiddlywiki/tw2parser/plugin.info +++ b/plugins/tiddlywiki/tw2parser/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/tw2parser", + "name": "TW2 Parser", "description": "TiddlyWiki Classic parser", - "authors": "JeremyRuston, JeffreyWilkinson", - "core-version": ">=5.0.15", + "author": "Jeffrey Wilkinson", "list": "readme" } diff --git a/plugins/tiddlywiki/tw5.com-docs/plugin.info b/plugins/tiddlywiki/tw5.com-docs/plugin.info index 10eaa3c98..d0b0de318 100644 --- a/plugins/tiddlywiki/tw5.com-docs/plugin.info +++ b/plugins/tiddlywiki/tw5.com-docs/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/tw5.com-docs", + "name": "TW5.com Docs", "description": "Documentation from tiddlywiki.com", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "" } diff --git a/plugins/tiddlywiki/twitter/plugin.info b/plugins/tiddlywiki/twitter/plugin.info index a56edfeb4..28b66f5fa 100644 --- a/plugins/tiddlywiki/twitter/plugin.info +++ b/plugins/tiddlywiki/twitter/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/twitter", - "description": "Twitter for TiddlyWiki", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "Twitter", + "description": "Twitter embedding tools", "list": "readme usage" } diff --git a/plugins/tiddlywiki/upgrade/plugin.info b/plugins/tiddlywiki/upgrade/plugin.info index 4f4664fe6..a3e6d6409 100644 --- a/plugins/tiddlywiki/upgrade/plugin.info +++ b/plugins/tiddlywiki/upgrade/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/upgrade", + "name": "Upgrade", "description": "Upgrade system for TiddlyWiki versions", - "author": "JeremyRuston", - "core-version": ">=5.0.0", "list": "readme" } diff --git a/plugins/tiddlywiki/xlsx-utils/plugin.info b/plugins/tiddlywiki/xlsx-utils/plugin.info index 93a4202f7..1fe58b75e 100644 --- a/plugins/tiddlywiki/xlsx-utils/plugin.info +++ b/plugins/tiddlywiki/xlsx-utils/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/xlsx-utils", + "name": "XLSX Utils", "description": "XLSX spreadsheet utilities", - "author": "Jeremy Ruston and SheetJS", - "core-version": ">=5.0.0", "list": "readme controls license" } diff --git a/plugins/tiddlywiki/xmldom/plugin.info b/plugins/tiddlywiki/xmldom/plugin.info index d28b438a7..b741d3e68 100644 --- a/plugins/tiddlywiki/xmldom/plugin.info +++ b/plugins/tiddlywiki/xmldom/plugin.info @@ -1,7 +1,6 @@ { "title": "$:/plugins/tiddlywiki/xmldom", - "description": "Wrapper for xmldom", - "author": "JeremyRuston", - "core-version": ">=5.0.0", + "name": "xmldom", + "description": "xmldom library", "list": "readme license" } From d91fcd990e24390e6c33ea6624812eee7efc9bf2 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 19 Sep 2019 13:20:07 +0100 Subject: [PATCH 0336/2376] Improve appearance of plugin chooser --- core/ui/ControlPanel/Modals/AddPlugins.tid | 19 +++--- themes/tiddlywiki/vanilla/base.tid | 71 ++++++++++++++++------ 2 files changed, 64 insertions(+), 26 deletions(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 0fe8af20d..c1cb387d2 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -2,13 +2,18 @@ title: $:/core/ui/ControlPanel/Modals/AddPlugins subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}} \define install-plugin-button() -<$button> +<div> +<$button class={{{ [<assetInfo>get[original-title]get[version]then[tc-reinstall]] tc-btn-invisible tc-install-plugin +[join[ ]] }}}> <$action-sendmessage $message="tm-load-plugin-from-library" url={{!!url}} title={{$(assetInfo)$!!original-title}}/> +{{$:/core/images/download-button}} <$list filter="[<assetInfo>get[original-title]get[version]]" variable="installedVersion" emptyMessage="""{{$:/language/ControlPanel/Plugins/Install/Caption}}"""> {{$:/language/ControlPanel/Plugins/Reinstall/Caption}} </$list> -<$reveal stateTitle=<<assetInfo>> stateField="contains-javascript" type="match" text="yes">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal> </$button> +<div> +</div> +<$reveal stateTitle=<<assetInfo>> stateField="contains-javascript" type="match" text="yes">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal> +</div> \end \define popup-state-macro() @@ -18,7 +23,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ \define display-plugin-info(type) <$set name="popup-state" value=<<popup-state-macro>>> <div class="tc-plugin-info"> -<div class="tc-plugin-info-chunk tc-small-icon"> +<div class="tc-plugin-info-chunk tc-plugin-info-toggle"> <$reveal type="nomatch" state=<<popup-state>> text="yes"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="yes"> {{$:/core/images/right-arrow}} @@ -30,17 +35,17 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$button> </$reveal> </div> -<div class="tc-plugin-info-chunk"> +<div class="tc-plugin-info-chunk tc-plugin-info-icon"> <$list filter="[<assetInfo>has[icon]]" emptyMessage="""<$transclude tiddler="$:/core/images/plugin-generic-$type$"/>"""> <img src={{$(assetInfo)$!!icon}}/> </$list> </div> -<div class="tc-plugin-info-chunk"> +<div class="tc-plugin-info-chunk tc-plugin-info-description"> <h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field="description"/></h1> <h2><$view tiddler=<<assetInfo>> field="original-title"/></h2> <div><em><$view tiddler=<<assetInfo>> field="version"/></em></div> </div> -<div class="tc-plugin-info-chunk"> +<div class="tc-plugin-info-chunk tc-plugin-info-buttons"> <<install-plugin-button>> </div> </div> @@ -77,7 +82,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$button> </$reveal> <div class="tc-plugin-library-listing"> -<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[description]]" variable="assetInfo"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]sort[name]]" variable="assetInfo"> <<display-plugin-info "$type$">> </$list> </div> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index e6a19d013..6b4920637 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2070,11 +2070,13 @@ html body.tc-body.tc-single-tiddler-window { } .tc-plugin-info { - display: block; + display: flex; border: 1px solid <<colour muted-foreground>>; + fill: <<colour muted-foreground>>; background-colour: <<colour background>>; margin: 0.5em 0 0.5em 0; padding: 4px; + align-items: center; } .tc-plugin-info-disabled { @@ -2099,40 +2101,57 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s } .tc-plugin-info-chunk { - display: inline-block; - vertical-align: middle; + margin: 2px; } -.tc-plugin-info-chunk h1 { - font-size: 1em; - margin: 2px 0 2px 0; +.tc-plugin-info-chunk.tc-plugin-info-toggle { + flex-grow: 0; + flex-shrink: 0; } -.tc-plugin-info-chunk h2 { +.tc-plugin-info-chunk.tc-plugin-info-icon { + flex-grow: 0; + flex-shrink: 0; +} + +.tc-plugin-info-chunk.tc-plugin-info-description { + flex-grow: 1; +} + +.tc-plugin-info-chunk.tc-plugin-info-buttons { font-size: 0.8em; + line-height: 1.2; + flex-grow: 0; + flex-shrink: 0; + text-align: right; +} + +.tc-plugin-info-chunk.tc-plugin-info-description h1 { + font-size: 1em; + line-height: 1.2; margin: 2px 0 2px 0; } -.tc-plugin-info-chunk div { +.tc-plugin-info-chunk.tc-plugin-info-description h2 { + font-size: 0.8em; + line-height: 1.2; + margin: 2px 0 2px 0; +} + +.tc-plugin-info-chunk.tc-plugin-info-description div { font-size: 0.7em; + line-height: 1.2; margin: 2px 0 2px 0; } -.tc-plugin-info:hover > .tc-plugin-info-chunk > img, .tc-plugin-info:hover > .tc-plugin-info-chunk > svg { - width: 2em; - height: 2em; - fill: <<colour foreground>>; +.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg { + width: 1.5em; + height: 1.5em; } -.tc-plugin-info > .tc-plugin-info-chunk > img, .tc-plugin-info > .tc-plugin-info-chunk > svg { +.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg { width: 2em; height: 2em; - fill: <<colour muted-foreground>>; -} - -.tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > img, .tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > svg { - width: 1em; - height: 1em; } .tc-plugin-info-dropdown { @@ -2151,6 +2170,20 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s padding: 1em 1em 1em 1em; } +.tc-plugin-library-listing .tc-install-plugin { + font-weight: bold; + background: green; + color: white; + fill: white; + border-radius: 4px; + padding: 3px; +} + +.tc-plugin-library-listing .tc-install-plugin.tc-reinstall { + background: blue; +} + + .tc-check-list { line-height: 2em; } From db2ed63e547293602521cec9698b8f65a0d2b471 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 20 Sep 2019 14:30:52 +0100 Subject: [PATCH 0337/2376] Fix formatting of plugin listing in control panel And make some minor tweaks across the plugin chooser too --- core/ui/Components/plugin-info.tid | 10 +++++----- core/ui/ControlPanel/Modals/AddPlugins.tid | 4 ++-- themes/tiddlywiki/vanilla/base.tid | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/ui/Components/plugin-info.tid b/core/ui/Components/plugin-info.tid index 7f548e1aa..54e394d82 100644 --- a/core/ui/Components/plugin-info.tid +++ b/core/ui/Components/plugin-info.tid @@ -19,24 +19,24 @@ $:/config/Plugins/Disabled/$(currentTiddler)$ \end \define plugin-table-body(type,disabledMessage,default-popup-state) -<div class="tc-plugin-info-chunk tc-small-icon"> +<div class="tc-plugin-info-chunk tc-plugin-info-toggle"> <$reveal type="nomatch" state=<<popup-state>> text="yes" default="""$default-popup-state$"""> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="yes"> -{{$:/core/images/right-arrow}} +{{$:/core/images/chevron-right}} </$button> </$reveal> <$reveal type="match" state=<<popup-state>> text="yes" default="""$default-popup-state$"""> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="no"> -{{$:/core/images/down-arrow}} +{{$:/core/images/chevron-down}} </$button> </$reveal> </div> -<div class="tc-plugin-info-chunk"> +<div class="tc-plugin-info-chunk tc-plugin-info-icon"> <$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>> <$transclude tiddler="$:/core/images/plugin-generic-$type$"/> </$transclude> </div> -<div class="tc-plugin-info-chunk"> +<div class="tc-plugin-info-chunk tc-plugin-info-description"> <h1> ''<$view field="description"><$view field="title"/></$view>'' $disabledMessage$ </h1> diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index c1cb387d2..3287819cf 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -26,12 +26,12 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <div class="tc-plugin-info-chunk tc-plugin-info-toggle"> <$reveal type="nomatch" state=<<popup-state>> text="yes"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="yes"> -{{$:/core/images/right-arrow}} +{{$:/core/images/chevron-right}} </$button> </$reveal> <$reveal type="match" state=<<popup-state>> text="yes"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="no"> -{{$:/core/images/down-arrow}} +{{$:/core/images/chevron-down}} </$button> </$reveal> </div> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 6b4920637..e02a8c10c 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2107,11 +2107,13 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s .tc-plugin-info-chunk.tc-plugin-info-toggle { flex-grow: 0; flex-shrink: 0; + line-height: 1; } .tc-plugin-info-chunk.tc-plugin-info-icon { flex-grow: 0; flex-shrink: 0; + line-height: 1; } .tc-plugin-info-chunk.tc-plugin-info-description { @@ -2145,8 +2147,8 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s } .tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg { - width: 1.5em; - height: 1.5em; + width: 1em; + height: 1em; } .tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg { From 7428f17551b97523aa93b956e3e508230332833d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 20 Sep 2019 16:17:55 +0100 Subject: [PATCH 0338/2376] Docs typo --- .../tw5.com/tiddlers/features/Performance Instrumentation.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid index 702782883..65296c033 100644 --- a/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid +++ b/editions/tw5.com/tiddlers/features/Performance Instrumentation.tid @@ -22,7 +22,7 @@ The information above should be interpreted as follows: As an example, try switching between the sidebar tabs to compare how long they take to render. -More detailed information on filter execution timings is also available. With performance instrumentation enabled, ype the following JavaScript command in the browser developer console: +More detailed information on filter execution timings is also available. With performance instrumentation enabled, type the following JavaScript command in the browser developer console: ``` $tw.perf.log() From f460b2caa1f5c19529215f429dccb570c693ce8b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 24 Sep 2019 13:23:21 +0100 Subject: [PATCH 0339/2376] Include empty.html in the quick build --- bin/quick-bld.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/quick-bld.sh b/bin/quick-bld.sh index bc11208f2..63da9aacc 100755 --- a/bin/quick-bld.sh +++ b/bin/quick-bld.sh @@ -4,5 +4,5 @@ tiddlywiki editions/prerelease \ --verbose \ - --build favicon index \ + --build favicon index empty \ || exit 1 From 92340d81ccca94cb3a866ab44c605e7d3e448779 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 25 Sep 2019 16:16:28 +0100 Subject: [PATCH 0340/2376] Introduce "parent-plugin" field to control how plugins are displayed in the chooser "Sub-plugins" are displayed within the dropdown of their parent plugin. This is a more elaborate version of #4109. It doesn't address dependent plugins (yet), this is just about grouping addon plugins under their parent. --- core/ui/ControlPanel/Modals/AddPlugins.tid | 9 +++++++++ .../tiddlywiki/codemirror-autocomplete/plugin.info | 1 + .../tiddlywiki/codemirror-closebrackets/plugin.info | 1 + plugins/tiddlywiki/codemirror-closetag/plugin.info | 1 + .../codemirror-fullscreen-editing/plugin.info | 1 + .../tiddlywiki/codemirror-keymap-emacs/plugin.info | 1 + .../codemirror-keymap-sublime-text/plugin.info | 1 + .../tiddlywiki/codemirror-keymap-vim/plugin.info | 1 + plugins/tiddlywiki/codemirror-mode-css/plugin.info | 1 + .../codemirror-mode-htmlembedded/plugin.info | 1 + .../codemirror-mode-htmlmixed/plugin.info | 1 + .../codemirror-mode-javascript/plugin.info | 1 + .../tiddlywiki/codemirror-mode-markdown/plugin.info | 1 + .../codemirror-mode-x-tiddlywiki/plugin.info | 1 + plugins/tiddlywiki/codemirror-mode-xml/plugin.info | 1 + .../codemirror-search-replace/plugin.info | 1 + plugins/tiddlywiki/codemirror/readme.tid | 13 +------------ themes/tiddlywiki/vanilla/base.tid | 7 ++++++- 18 files changed, 31 insertions(+), 13 deletions(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 3287819cf..95159bc9b 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -61,6 +61,13 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <div class="tc-plugin-info-dropdown-body"> <$transclude tiddler=<<assetInfo>> field="readme" mode="block"/> </div> +<div class="tc-plugin-info-sub-plugins"> +<$set name="original-title" value={{{ [<assetInfo>get[original-title]] }}}> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]sort[name]]" variable="assetInfo"> +<<display-plugin-info "$type$">> +</$list> +</$set> +</div> </div> </$reveal> </$set> @@ -83,8 +90,10 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$reveal> <div class="tc-plugin-library-listing"> <$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]sort[name]]" variable="assetInfo"> +<$list filter="[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]" variable="ignore"><!-- Hide sub-plugins if we're not searching --> <<display-plugin-info "$type$">> </$list> +</$list> </div> \end diff --git a/plugins/tiddlywiki/codemirror-autocomplete/plugin.info b/plugins/tiddlywiki/codemirror-autocomplete/plugin.info index f46e5bdac..b8696e4ca 100755 --- a/plugins/tiddlywiki/codemirror-autocomplete/plugin.info +++ b/plugins/tiddlywiki/codemirror-autocomplete/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-autocomplete", "name": "CodeMirror Autocomplete", "description": "Autocompletion for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-closebrackets/plugin.info b/plugins/tiddlywiki/codemirror-closebrackets/plugin.info index a4eb8cac1..4f51acccf 100755 --- a/plugins/tiddlywiki/codemirror-closebrackets/plugin.info +++ b/plugins/tiddlywiki/codemirror-closebrackets/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-closebrackets", "name": "CodeMirror Close Brackets", "description": "Close brackets for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-closetag/plugin.info b/plugins/tiddlywiki/codemirror-closetag/plugin.info index c8ec68505..4fa5b74c3 100755 --- a/plugins/tiddlywiki/codemirror-closetag/plugin.info +++ b/plugins/tiddlywiki/codemirror-closetag/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-closetag", "name": "CodeMirror Close Tag", "description": "Close tags automatically for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info b/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info index 89ba08df1..fc3c6f879 100755 --- a/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info +++ b/plugins/tiddlywiki/codemirror-fullscreen-editing/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-fullscreen", "name": "CodeMirror Fullscreen", "description": "Fullscreen editing for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info b/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info index 519472a6c..efdd03ce8 100755 --- a/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-emacs/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-keymap-emacs", "name": "CodeMirror Keymap Emacs", "description": "Keymap compatible with Emacs for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info b/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info index 6f7ba6067..ad278481e 100755 --- a/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-keymap-sublime-text", "name": "CodeMirror Keymap Sublime Text", "description": "Keymap compatible with Sublime Text for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info b/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info index 0f5387d5c..54b882bd0 100755 --- a/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-keymap-vim", "name": "CodeMirror Keymap Vim", "description": "Keymap compatible with Vim for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-css/plugin.info b/plugins/tiddlywiki/codemirror-mode-css/plugin.info index e304dd256..d7f5ab397 100755 --- a/plugins/tiddlywiki/codemirror-mode-css/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-css/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-mode-css", "name": "CodeMirror Mode CSS", "description": "CSS highlighting mode for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info b/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info index a0f2f0528..09eaaae98 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-mode-htmlembedded", "name": "CodeMirror Mode HTML Embedded", "description": "Embedded HTML highlighting mode for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info b/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info index a99c6e623..8e94358e2 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-mode-htmlmixed", "name": "CodeMirror Mode HTML Mixed", "description": "HTML mixed highlighting mode for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info b/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info index c4d39ee7b..6be77d42f 100755 --- a/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-javascript/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-mode-javascript", "name": "CodeMirror Mode JavaScript", "description": "JavaScript highlighting mode for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info b/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info index 05593c4a1..140ba5326 100755 --- a/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-mode-markdown", "name": "CodeMirror Mode Markdown", "description": "Markdown highlighting mode for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info b/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info index 1d6244a81..60e5ac81d 100755 --- a/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki", "name": "CodeMirror Mode TiddlyWiki Classic", "description": "Tiddlywiki Classic highlighting mode for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-xml/plugin.info b/plugins/tiddlywiki/codemirror-mode-xml/plugin.info index 35065d0cf..b249a0c26 100755 --- a/plugins/tiddlywiki/codemirror-mode-xml/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-xml/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-mode-xml", "name": "CodeMirror Mode XML", "description": "XML highlighting mode for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-search-replace/plugin.info b/plugins/tiddlywiki/codemirror-search-replace/plugin.info index 15f10dfa5..a78d7a343 100755 --- a/plugins/tiddlywiki/codemirror-search-replace/plugin.info +++ b/plugins/tiddlywiki/codemirror-search-replace/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/codemirror-search-replace", "name": "CodeMirror Search and Replace", "description": "Search and replace for CodeMirror", + "parent-plugin": "$:/plugins/tiddlywiki/codemirror", "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror/readme.tid b/plugins/tiddlywiki/codemirror/readme.tid index 15b668346..c254a047f 100755 --- a/plugins/tiddlywiki/codemirror/readme.tid +++ b/plugins/tiddlywiki/codemirror/readme.tid @@ -1,17 +1,6 @@ title: $:/plugins/tiddlywiki/codemirror/readme -This plugin provides an enhanced text editor component based on [[CodeMirror|http://codemirror.net]]. -The basic configuration is designed to be as lightweight as possible and is just around 235kb of size. -Additional features can be installed with ~CodeMirror ~AddOns from the plugin library: - -* Code colouring for many languages (see [[the official documentation here|http://codemirror.net/mode/index.html]]) -* Auto closing brackets and tags -* Folding brackets, comments, and tags -* Auto-completion -* Search and Replace -* Fullscreen Editing -* Optional Emacs, Sublime Text or Vim Keymaps - +This plugin provides an enhanced text editor component based on [[CodeMirror|http://codemirror.net]]. The basic configuration is designed to be as lightweight as possible and is just around 235kb of size. Additional features can be installed with ~CodeMirror ~AddOns from the plugin library. [[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/codemirror]] diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index e02a8c10c..bd202604e 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2073,12 +2073,17 @@ html body.tc-body.tc-single-tiddler-window { display: flex; border: 1px solid <<colour muted-foreground>>; fill: <<colour muted-foreground>>; - background-colour: <<colour background>>; + background-color: <<colour background>>; margin: 0.5em 0 0.5em 0; padding: 4px; align-items: center; } +.tc-plugin-info-sub-plugins .tc-plugin-info { + margin: 0.5em 1em 0.5em 1em; + background: rgba(255,255,0,0.05); +} + .tc-plugin-info-disabled { background: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px); background: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px); From 58f1eb77bd4faf9376b33e9ba02f92205111be73 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 25 Sep 2019 21:56:54 +0100 Subject: [PATCH 0341/2376] Fix sub-plugin dropdown display --- themes/tiddlywiki/vanilla/base.tid | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index bd202604e..054a0a536 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2084,6 +2084,11 @@ html body.tc-body.tc-single-tiddler-window { background: rgba(255,255,0,0.05); } +.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown { + margin-left: 1em; + margin-right: 1em; +} + .tc-plugin-info-disabled { background: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px); background: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px); From e752ba7c6abcdde229258aa1562e6de518c3556e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 25 Sep 2019 21:57:22 +0100 Subject: [PATCH 0342/2376] Use the dependents and parent-plugin fields to automatically install dependencies --- core/ui/ControlPanel/Modals/AddPlugins.tid | 17 +++++++++++++++++ plugins/tiddlywiki/aws/plugin.info | 3 ++- plugins/tiddlywiki/text-slicer/plugin.info | 3 ++- plugins/tiddlywiki/xlsx-utils/plugin.info | 3 ++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 95159bc9b..f5b35b53c 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -5,6 +5,13 @@ subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/ <div> <$button class={{{ [<assetInfo>get[original-title]get[version]then[tc-reinstall]] tc-btn-invisible tc-install-plugin +[join[ ]] }}}> <$action-sendmessage $message="tm-load-plugin-from-library" url={{!!url}} title={{$(assetInfo)$!!original-title}}/> +<$set name="url" value={{!!url}}> +<$set name="currentTiddler" value=<<assetInfo>>> +<$list filter="[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]" variable="dependency"> +<$action-sendmessage $message="tm-load-plugin-from-library" url=<<url>> title=<<dependency>>/> +</$list> +</$set> +</$set> {{$:/core/images/download-button}} <$list filter="[<assetInfo>get[original-title]get[version]]" variable="installedVersion" emptyMessage="""{{$:/language/ControlPanel/Plugins/Install/Caption}}"""> {{$:/language/ControlPanel/Plugins/Reinstall/Caption}} @@ -57,6 +64,16 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ {{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}} </em> </$list> +<$set name="currentTiddler" value=<<assetInfo>>> +<$list filter="[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]" variable="ignore"> +<div> +Also requires: +<$list filter="[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]" variable="dependency"> +<$text text=<<dependency>>/> +</$list> +</div> +</$list> +</$set> </div> <div class="tc-plugin-info-dropdown-body"> <$transclude tiddler=<<assetInfo>> field="readme" mode="block"/> diff --git a/plugins/tiddlywiki/aws/plugin.info b/plugins/tiddlywiki/aws/plugin.info index 89f248824..e01c82d7c 100644 --- a/plugins/tiddlywiki/aws/plugin.info +++ b/plugins/tiddlywiki/aws/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/aws", "name": "AWS", "description": "Amazon Web Services extensions and tools", - "list": "readme setup commands lambda" + "list": "readme setup commands lambda", + "dependents": ["$:/plugins/tiddlywiki/async","$:/plugins/tiddlywiki/jszip"] } diff --git a/plugins/tiddlywiki/text-slicer/plugin.info b/plugins/tiddlywiki/text-slicer/plugin.info index 937014060..a05456570 100644 --- a/plugins/tiddlywiki/text-slicer/plugin.info +++ b/plugins/tiddlywiki/text-slicer/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/text-slicer", "name": "Text Slicer", "description": "Tools for slicing text into tiddlers", - "list": "readme docs" + "list": "readme docs", + "dependents": ["$:/plugins/tiddlywiki/sax"] } diff --git a/plugins/tiddlywiki/xlsx-utils/plugin.info b/plugins/tiddlywiki/xlsx-utils/plugin.info index 1fe58b75e..b269439a2 100644 --- a/plugins/tiddlywiki/xlsx-utils/plugin.info +++ b/plugins/tiddlywiki/xlsx-utils/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/xlsx-utils", "name": "XLSX Utils", "description": "XLSX spreadsheet utilities", - "list": "readme controls license" + "list": "readme controls license", + "dependents": ["$:/plugins/tiddlywiki/jszip"] } From cb3bec65a1c634f80f62de9251f4fa85c96d72f3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 26 Sep 2019 08:51:35 +0100 Subject: [PATCH 0343/2376] Don't crash for edit enginges that don't support cancelPopups --- core/modules/editor/engines/framed.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index c807ffde9..7984eff4f 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -158,7 +158,9 @@ FramedEngine.prototype.focus = function() { Handle the focus event */ FramedEngine.prototype.handleFocusEvent = function(event) { - this.widget.cancelPopups(); + if(this.widget.cancelPopups) { + this.widget.cancelPopups(); + } return true; }; From 93e01435d1e1b622134b3aca2fe41ca905d3c9b3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 27 Sep 2019 16:47:55 +0100 Subject: [PATCH 0344/2376] Dynamic plugins: Change "contains JavaScript" to "requires reload" We might in the future offer support for certain types of JS module to be hot loaded. --- core/modules/commands/savelibrarytiddlers.js | 4 ++-- core/modules/startup/plugins.js | 4 ++-- core/modules/upgraders/plugins.js | 8 ++++---- core/modules/wiki.js | 10 +++++----- core/ui/ControlPanel/Modals/AddPlugins.tid | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/modules/commands/savelibrarytiddlers.js b/core/modules/commands/savelibrarytiddlers.js index b1874c9b5..58030d3d8 100644 --- a/core/modules/commands/savelibrarytiddlers.js +++ b/core/modules/commands/savelibrarytiddlers.js @@ -69,7 +69,7 @@ Command.prototype.execute = function() { // Collect the skinny list data var pluginTiddlers = JSON.parse(tiddler.text), readmeContent = (pluginTiddlers.tiddlers[title + "/readme"] || {}).text, - doesContainJavaScript = !!$tw.wiki.doesPluginInfoContainModules(pluginTiddlers), + doesRequireReload = !!$tw.wiki.doesPluginInfoRequireReload(pluginTiddlers), iconTiddler = pluginTiddlers.tiddlers[title + "/icon"] || {}, iconType = iconTiddler.type, iconText = iconTiddler.text, @@ -80,7 +80,7 @@ Command.prototype.execute = function() { skinnyList.push($tw.utils.extend({},tiddler,{ text: undefined, readme: readmeContent, - "contains-javascript": doesContainJavaScript ? "yes" : "no", + "requires-reload": doesRequireReload ? "yes" : "no", icon: iconContent })); }); diff --git a/core/modules/startup/plugins.js b/core/modules/startup/plugins.js index 5dd03bbf1..907579dbe 100644 --- a/core/modules/startup/plugins.js +++ b/core/modules/startup/plugins.js @@ -28,8 +28,8 @@ exports.startup = function() { requireReloadDueToPluginChange = false; $tw.utils.each(Object.keys(changes),function(title) { var tiddler = $tw.wiki.getTiddler(title), - containsModules = $tw.wiki.doesPluginContainModules(title); - if(containsModules) { + requiresReload = $tw.wiki.doesPluginRequireReload(title); + if(requiresReload) { requireReloadDueToPluginChange = true; } else if(tiddler) { var pluginType = tiddler.fields["plugin-type"]; diff --git a/core/modules/upgraders/plugins.js b/core/modules/upgraders/plugins.js index d1e699762..68aa62fb2 100644 --- a/core/modules/upgraders/plugins.js +++ b/core/modules/upgraders/plugins.js @@ -41,14 +41,14 @@ exports.upgrade = function(wiki,titles,tiddlers) { // Check if we're dealing with a plugin if(incomingTiddler && incomingTiddler["plugin-type"]) { // Check whether the plugin contains JS modules - var doesContainJavaScript = $tw.wiki.doesPluginInfoContainModules(JSON.parse(incomingTiddler.text)) ? ($tw.wiki.getTiddlerText("$:/language/ControlPanel/Plugins/PluginWillRequireReload") + " ") : ""; - messages[title] = doesContainJavaScript; + var requiresReload = $tw.wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? ($tw.wiki.getTiddlerText("$:/language/ControlPanel/Plugins/PluginWillRequireReload") + " ") : ""; + messages[title] = requiresReload; if(incomingTiddler.version) { // Upgrade the incoming plugin if it is in the upgrade library var libraryTiddler = getLibraryTiddler(title); if(libraryTiddler && libraryTiddler["plugin-type"] && libraryTiddler.version) { tiddlers[title] = libraryTiddler; - messages[title] = doesContainJavaScript + $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}}); + messages[title] = requiresReload + $tw.language.getString("Import/Upgrader/Plugins/Upgraded",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}}); return; } // Suppress the incoming plugin if it is older than the currently installed one @@ -57,7 +57,7 @@ exports.upgrade = function(wiki,titles,tiddlers) { // Reject the incoming plugin by blanking all its fields if($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) { tiddlers[title] = Object.create(null); - messages[title] = doesContainJavaScript + $tw.language.getString("Import/Upgrader/Plugins/Suppressed/Version",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}}); + messages[title] = requiresReload + $tw.language.getString("Import/Upgrader/Plugins/Suppressed/Version",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}}); return; } } diff --git a/core/modules/wiki.js b/core/modules/wiki.js index e7f84e13c..b505f50da 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1460,13 +1460,13 @@ exports.invokeUpgraders = function(titles,tiddlers) { return messages; }; -// Determine whether a plugin by title contains JS modules. -exports.doesPluginContainModules = function(title) { - return this.doesPluginInfoContainModules(this.getPluginInfo(title) || this.getTiddlerDataCached(title)); +// Determine whether a plugin by title is dynamically loadable +exports.doesPluginRequireReload = function(title) { + return this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title)); }; -// Determine whether a plugin info structure contains JS modules. -exports.doesPluginInfoContainModules = function(pluginInfo) { +// Determine whether a plugin info structure is dynamically loadable +exports.doesPluginInfoRequireReload = function(pluginInfo) { if(pluginInfo) { var foundModule = false; $tw.utils.each(pluginInfo.tiddlers,function(tiddler) { diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index f5b35b53c..3c650fcc3 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -19,7 +19,7 @@ subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/ </$button> <div> </div> -<$reveal stateTitle=<<assetInfo>> stateField="contains-javascript" type="match" text="yes">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal> +<$reveal stateTitle=<<assetInfo>> stateField="requires-reload" type="match" text="yes">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal> </div> \end From 0193bfd5e939919fba9b52c80d316f33e642c114 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 27 Sep 2019 21:57:46 +0100 Subject: [PATCH 0345/2376] Plugin docs updates --- .../tiddlers/mechanisms/PluginMechanism.tid | 31 ++++++++++++------- ...lling a plugin from the plugin library.tid | 5 +-- .../plugins/Manually installing a plugin.tid | 5 +-- .../tiddlers/plugins/PluginFolders.tid | 3 +- .../tiddlers/plugins/Plugin_Fields.tid | 21 +++++++------ .../plugins/Uninstalling a plugin.tid | 12 ++++--- 6 files changed, 46 insertions(+), 31 deletions(-) diff --git a/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid index 5b1a4ef27..a2505a188 100644 --- a/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid @@ -1,27 +1,36 @@ created: 20130826122000000 -modified: 20161015122959346 +modified: 20190927172137277 tags: Mechanisms title: PluginMechanism type: text/vnd.tiddlywiki ! Introduction -[[Plugins]] are bundles of tiddlers that are distributed and managed as a single unit by being packed into a single JSON tiddler. Users can install them with drag and drop, or using the [[plugin library|Installing a plugin from the plugin library]]. +[[Plugins]] are bundles of tiddlers that are distributed and managed as a single unit. Users can install them with drag and drop, or using the [[plugin library|Installing a plugin from the plugin library]]. -The tiddlers within registered plugins behave as ShadowTiddlers: they can be freely overwritten by creating a tiddler with the same title, but deleting that tiddler restores the underlying tiddler value from the plugin. +<<.from-version "5.1.22">> Plugins that contain JavaScript modules require a reload of the wiki before they will work. Plugins that do not contain JavaScript modules are automatically dynamically loaded and unloaded. -Plugins have a `plugin-type` field that may take the following values: +Plugins can be used to package any tiddler content, including JavaScript [[modules|Modules]] that extend and enhance the core TiddlyWiki5 functionality. The tiddlers within registered plugins are ShadowTiddlers: they can be freely overwritten by creating a tiddler with the same title, but deleting that tiddler restores the underlying tiddler value from the plugin. -* `plugin` //(default)// - a plain plugin -* `theme` - a theme plugin (see ThemeMechanism) -* `language` - for translations only - -Plugins can be used to package ordinary content, or can include JavaScript [[modules|Modules]] that extend and enhance the core TiddlyWiki5 functionality. - -Plugins conventionally have a title of the form `$:/plugins/publisher/name`. Plugins that are part of the core TiddlyWiki distribution have titles of the form `$:/plugins/tiddlywiki/name`. +By convention, plugin titles have the form `$:/plugins/<publisher>/<name>`. Plugins that are part of the core TiddlyWiki distribution have titles of the form `$:/plugins/tiddlywiki/<name>`. When [[running TiddlyWiki under Node.js|TiddlyWiki on Node.js]], plugins can also be stored as individual tiddler files in [[PluginFolders]]. +Plugins have a `plugin-type` field that determines how it is treated. The following values are defined by the core: + +* `plugin` - an ordinary plugin +* `theme` - a theme plugin (see ThemeMechanism). Only the theme plugin named in the tiddler $:/theme is activated at any one time (along with any dependent theme plugins) +* `language` - a language plugin (see TranslationMechanism). Only the language plugin named in the tiddler $:/language is activated at any one time (along with any dependent language plugins) + +The following plugin types are used internally by the core: + +* `import` - for the special $:/Import plugin created while importing is in progress +* `info` - for the special $:/temp/info-plugin tiddler created by the InfoMechanism + +Custom plugin types can also be used. They will automatically receive the same behaviour as plain plugins but can display a custom user interface using an appropriate [[view template segment|SystemTag: $:/tags/ViewTemplate]]. + +See [[Plugin Fields]] for details of the other fields used by plugins. + ! More information <<list-links "[tag[PluginMechanism]]">> diff --git a/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid b/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid index 6edc5ad13..d4e2fef3b 100644 --- a/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid +++ b/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid @@ -1,5 +1,5 @@ created: 20160107222352710 -modified: 20160720145836265 +modified: 20190927205622498 tags: Plugins title: Installing a plugin from the plugin library type: text/vnd.tiddlywiki @@ -17,7 +17,8 @@ Follow these instructions when using TiddlyWiki as a standalone HTML file: ## Use the ''search'' box to search the plugin details # Click the ''install'' button to install a plugin # Save your TiddlyWiki {{$:/core/images/save-button}} -# ''Refresh the page so that TiddlyWiki loads the new plugin'' {{$:/core/images/refresh-button}} +# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completes installation of the plugin {{$:/core/images/refresh-button}} +#* <<.from-version "5.1.22">> It is no longer necessary to refresh TiddlyWiki when deleting plugins that support dynamic loading. See PluginMechanism for more details # The plugin should now be available for use ! Client-Server Configuration diff --git a/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid b/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid index 6b52fe33c..426615b3c 100644 --- a/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid +++ b/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid @@ -1,5 +1,5 @@ created: 20160107222430613 -modified: 20160617104949358 +modified: 20190927205631648 tags: Plugins title: Manually installing a plugin type: text/vnd.tiddlywiki @@ -9,5 +9,6 @@ type: text/vnd.tiddlywiki # In another browser window, find a link to the plugin, e.g. [[$:/plugins/tiddlywiki/example]]. You will typically find these links on the home page of the plugin (for example, https://tiddlywiki.com/plugins/tiddlywiki/katex/) # Drag the link [[$:/plugins/tiddlywiki/example]] to the browser window containing your TiddlyWiki # Save your TiddlyWiki ({{$:/core/images/save-button}}) -# ''Refresh the page so that TiddlyWiki loads the new plugin'' ({{$:/core/images/refresh-button}}) +# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completes installation of the plugin {{$:/core/images/refresh-button}} +#* <<.from-version "5.1.22">> It is no longer necessary to refresh TiddlyWiki when deleting plugins that support dynamic loading. See PluginMechanism for more details # The plugin should now be available for use \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/plugins/PluginFolders.tid b/editions/tw5.com/tiddlers/plugins/PluginFolders.tid index d842affc1..393f1ef40 100644 --- a/editions/tw5.com/tiddlers/plugins/PluginFolders.tid +++ b/editions/tw5.com/tiddlers/plugins/PluginFolders.tid @@ -1,5 +1,5 @@ created: 20161015113519246 -modified: 20161015113833256 +modified: 20190927172743140 tags: PluginMechanism title: PluginFolders type: text/vnd.tiddlywiki @@ -13,6 +13,7 @@ The JSON structure for plugin tiddlers is as follows: ``` { "title": "$:/plugins/publisher/name", + "name": "name", "description": "An exemplary plugin for demonstration purposes", "author": "JeremyRuston", "version": "1.2.3-alpha3", diff --git a/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid b/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid index 86636179e..f4d7e6d0a 100644 --- a/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid +++ b/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid @@ -1,5 +1,5 @@ created: 20161015122718559 -modified: 20161015122719647 +modified: 20190927172655698 tags: PluginMechanism title: Plugin Fields type: text/vnd.tiddlywiki @@ -9,14 +9,15 @@ type: text/vnd.tiddlywiki Plugins are stored as tiddlers with the following fields: |!Field |!Description | -|title |Title of plugin | +|author |//(optional)// Author of plugin | +|dependents |List of dependencies: plugins that should be installed in order for this one to work | |description |Description of plugin | -|author |Author of plugin | -|version |Version string (must conform to [ext[SemanticVersioning|http://semver.org/]] convention) | -|source |Source URL of plugin | -|type |Must be ''application/json'' | -|plugin-type |Can be ''plugin'' (default), ''language'' or ''theme'' | -|text |JSON encoding of the list of tiddlers comprising the plugin | |list |Names of exposed plugin information tiddlers (see below) | -|name |Name of the theme (only for themes) | -|dependents |List of dependent plugins (currently only implemented for themes) | \ No newline at end of file +|name |Brief name of the plugin | +|plugin-type |Generally ''plugin'', ''language'' or ''theme''; see PluginMechanism for details | +|parent-plugin |//(optional)// <<.from-version "5.1.22">> Title of the plugin under which this plugin should be displayed as a sub-plugin in the control panel plugin chooser | +|source |//(optional)// Source URL of plugin | +|text |JSON encoding of the list of tiddlers comprising the plugin | +|title |Title of plugin | +|type |Must be ''application/json'' | +|version |//(optional)// Version string (should conform to [ext[SemanticVersioning|http://semver.org/]] convention) | \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid b/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid index f2b0e633e..096183bfb 100644 --- a/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid +++ b/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid @@ -1,5 +1,5 @@ created: 20160107222504269 -modified: 20160720145839711 +modified: 20190927205509760 tags: Plugins title: Uninstalling a plugin type: text/vnd.tiddlywiki @@ -9,12 +9,14 @@ type: text/vnd.tiddlywiki Follow these instructions when using TiddlyWiki as a standalone HTML file: # Create a backup of your current TiddlyWiki HTML file ([[just in case|The First Rule of Using TiddlyWiki]]) -# Open the [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}} and go to the ''Plugins'' tab -# Click on the plugin you want to delete to open its tiddler +# Open the [[control panel|$:/ControlPanel]] and go to the ''Plugins'' tab +# Click on the plugin you want to delete to open it as a standalone tiddler # Click the {{$:/core/images/down-arrow}} ''more'' button and {{$:/core/images/delete-button}} ''delete'' the tiddler # Save your TiddlyWiki {{$:/core/images/save-button}} -# ''Refresh the window so that TiddlyWiki completely removes the plugin'' {{$:/core/images/refresh-button}} -# The plugin should now be deleted +# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completely removes the plugin {{$:/core/images/refresh-button}} +#* <<.from-version "5.1.22">> It is no longer necessary to refresh TiddlyWiki when deleting plugins that support dynamic loading. See PluginMechanism for more details +# The plugin should no longer be active or available + ! Client-Server Configuration From ded9d4074c82b61006fc4887c2ab8b958907f719 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 28 Sep 2019 10:06:18 +0100 Subject: [PATCH 0346/2376] Plugin library chooser improvements * Make "Also requires:" translatable * Clearer styling for sub-plugins * Documentation tweaks --- core/language/en-GB/ControlPanel.multids | 1 + core/ui/ControlPanel/Modals/AddPlugins.tid | 2 +- .../tw5.com/tiddlers/Plugin Dependencies.tid | 13 ++++++++++++ editions/tw5.com/tiddlers/Plugin Types.tid | 18 ++++++++++++++++ .../tiddlers/mechanisms/PluginMechanism.tid | 21 ++++++++++--------- .../tiddlers/plugins/Plugin_Fields.tid | 5 ++--- themes/tiddlywiki/vanilla/base.tid | 7 ++++++- 7 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 editions/tw5.com/tiddlers/Plugin Dependencies.tid create mode 100644 editions/tw5.com/tiddlers/Plugin Types.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index d1fd8f374..c7ff155c0 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -63,6 +63,7 @@ Parsing/Pragma/Caption: Pragma Parse Rules Plugins/Add/Caption: Get more plugins Plugins/Add/Hint: Install plugins from the official library Plugins/AlreadyInstalled/Hint: This plugin is already installed at version <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: Also requires: Plugins/Caption: Plugins Plugins/Disable/Caption: disable Plugins/Disable/Hint: Disable this plugin when reloading page diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 3c650fcc3..d25dc93ef 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -67,7 +67,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <$set name="currentTiddler" value=<<assetInfo>>> <$list filter="[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]" variable="ignore"> <div> -Also requires: +{{$:/language/ControlPanel/Plugins/AlsoRequires}} <$list filter="[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]" variable="dependency"> <$text text=<<dependency>>/> </$list> diff --git a/editions/tw5.com/tiddlers/Plugin Dependencies.tid b/editions/tw5.com/tiddlers/Plugin Dependencies.tid new file mode 100644 index 000000000..5fa9c2f75 --- /dev/null +++ b/editions/tw5.com/tiddlers/Plugin Dependencies.tid @@ -0,0 +1,13 @@ +created: 20190928081852771 +modified: 20190928082758674 +tags: PluginMechanism +title: Plugin Dependencies +type: text/vnd.tiddlywiki + +The simplest form of dependency between plugins is that one plugin can declare itself to be a sub-plugin of another plugin by specifying that plugin in the `parent-plugin` [[field|Plugin Fields]]. Sub-plugins are displayed in the control panel plugin chooser within the expandable area of their parent plugin. For example, the official plugin library includes the [[CodeMirror Plugin]] and also more than a dozen sub-plugins that extend the CodeMirror plugin with optional functionality. Note that sub-plugins cannot themselves have further sub-plugins. + +Plugins can also use their `dependents` [[field|Plugin Fields]] to list the titles of any other plugins that should also be installed. Note that the list is not resolved recursively: dependents of dependents will not be installed. + +When installing a plugin from the plugin library, both the `parent-plugin` and `dependents` fields are used to determine any additional plugins to be installed. + +Note that the `dependents` field is also used by the ThemeMechanism and the LanguageMechanism to switch in dependent theme/language plugins. diff --git a/editions/tw5.com/tiddlers/Plugin Types.tid b/editions/tw5.com/tiddlers/Plugin Types.tid new file mode 100644 index 000000000..c496fdbd0 --- /dev/null +++ b/editions/tw5.com/tiddlers/Plugin Types.tid @@ -0,0 +1,18 @@ +created: 20190928081810311 +modified: 20190928081811355 +tags: +title: Plugin Types +type: text/vnd.tiddlywiki + +Plugins have a `plugin-type` field that determines how it is treated. The following values are defined by the core: + +* `plugin` - an ordinary plugin +* `theme` - a theme plugin (see ThemeMechanism). Only the theme plugin named in the tiddler $:/theme is activated at any one time (along with any dependent theme plugins) +* `language` - a language plugin (see TranslationMechanism). Only the language plugin named in the tiddler $:/language is activated at any one time (along with any dependent language plugins) + +The following plugin types are used internally by the core: + +* `import` - for the special $:/Import plugin created while importing is in progress +* `info` - for the special $:/temp/info-plugin tiddler created by the InfoMechanism + +While not supported by the plugin library, it is also possible to use custom plugin types to build plugin-like behaviour with a custom user interface. Plugins with a custom type will automatically receive the same behaviour as plain plugins but can display a custom user interface using an appropriate [[view template segment|SystemTag: $:/tags/ViewTemplate]]. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid index a2505a188..c51417887 100644 --- a/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/PluginMechanism.tid @@ -1,5 +1,5 @@ created: 20130826122000000 -modified: 20190927172137277 +modified: 20190928082000464 tags: Mechanisms title: PluginMechanism type: text/vnd.tiddlywiki @@ -16,20 +16,21 @@ By convention, plugin titles have the form `$:/plugins/<publisher>/<name>`. Plug When [[running TiddlyWiki under Node.js|TiddlyWiki on Node.js]], plugins can also be stored as individual tiddler files in [[PluginFolders]]. -Plugins have a `plugin-type` field that determines how it is treated. The following values are defined by the core: +! Plugin Types -* `plugin` - an ordinary plugin -* `theme` - a theme plugin (see ThemeMechanism). Only the theme plugin named in the tiddler $:/theme is activated at any one time (along with any dependent theme plugins) -* `language` - a language plugin (see TranslationMechanism). Only the language plugin named in the tiddler $:/language is activated at any one time (along with any dependent language plugins) +{{Plugin Types}} -The following plugin types are used internally by the core: +! Plugin Dependencies -* `import` - for the special $:/Import plugin created while importing is in progress -* `info` - for the special $:/temp/info-plugin tiddler created by the InfoMechanism +{{Plugin Dependencies}} -Custom plugin types can also be used. They will automatically receive the same behaviour as plain plugins but can display a custom user interface using an appropriate [[view template segment|SystemTag: $:/tags/ViewTemplate]]. +! Plugin Ordering -See [[Plugin Fields]] for details of the other fields used by plugins. +{{Plugin Ordering}} + +! Plugin Fields + +{{Plugin Fields}} ! More information diff --git a/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid b/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid index f4d7e6d0a..5c2bb6fdf 100644 --- a/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid +++ b/editions/tw5.com/tiddlers/plugins/Plugin_Fields.tid @@ -1,11 +1,9 @@ created: 20161015122718559 -modified: 20190927172655698 +modified: 20190928083018378 tags: PluginMechanism title: Plugin Fields type: text/vnd.tiddlywiki -! Plugin fields - Plugins are stored as tiddlers with the following fields: |!Field |!Description | @@ -14,6 +12,7 @@ Plugins are stored as tiddlers with the following fields: |description |Description of plugin | |list |Names of exposed plugin information tiddlers (see below) | |name |Brief name of the plugin | +|plugin-priority |//(optional)// Numerical priority (higher numbers install later, the core plugin has a priority of zero | |plugin-type |Generally ''plugin'', ''language'' or ''theme''; see PluginMechanism for details | |parent-plugin |//(optional)// <<.from-version "5.1.22">> Title of the plugin under which this plugin should be displayed as a sub-plugin in the control panel plugin chooser | |source |//(optional)// Source URL of plugin | diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 054a0a536..11d5b3cfc 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2179,7 +2179,12 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s } .tc-plugin-info-dropdown-body { - padding: 1em 1em 1em 1em; + padding: 1em 1em 0 1em; +} + +.tc-plugin-info-sub-plugins { + padding-top: 0.5em; + background: <<colour message-background>>; } .tc-plugin-library-listing .tc-install-plugin { From 55e3b8d66d4114e3f8021c99c254af7989281940 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 28 Sep 2019 11:49:09 +0100 Subject: [PATCH 0347/2376] Plugin improvements * Improve docs * Improve styling of subplugins --- core/ui/ControlPanel/Modals/AddPlugins.tid | 6 ++++-- editions/tw5.com/tiddlers/Plugin Types.tid | 6 ++++-- themes/tiddlywiki/vanilla/base.tid | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index d25dc93ef..70235d498 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -78,13 +78,15 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <div class="tc-plugin-info-dropdown-body"> <$transclude tiddler=<<assetInfo>> field="readme" mode="block"/> </div> -<div class="tc-plugin-info-sub-plugins"> <$set name="original-title" value={{{ [<assetInfo>get[original-title]] }}}> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]" variable="ignore"> +<div class="tc-plugin-info-sub-plugins"> <$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]sort[name]]" variable="assetInfo"> <<display-plugin-info "$type$">> </$list> -</$set> </div> +</$list> +</$set> </div> </$reveal> </$set> diff --git a/editions/tw5.com/tiddlers/Plugin Types.tid b/editions/tw5.com/tiddlers/Plugin Types.tid index c496fdbd0..8afb91a66 100644 --- a/editions/tw5.com/tiddlers/Plugin Types.tid +++ b/editions/tw5.com/tiddlers/Plugin Types.tid @@ -1,5 +1,5 @@ created: 20190928081810311 -modified: 20190928081811355 +modified: 20190928103750812 tags: title: Plugin Types type: text/vnd.tiddlywiki @@ -15,4 +15,6 @@ The following plugin types are used internally by the core: * `import` - for the special $:/Import plugin created while importing is in progress * `info` - for the special $:/temp/info-plugin tiddler created by the InfoMechanism -While not supported by the plugin library, it is also possible to use custom plugin types to build plugin-like behaviour with a custom user interface. Plugins with a custom type will automatically receive the same behaviour as plain plugins but can display a custom user interface using an appropriate [[view template segment|SystemTag: $:/tags/ViewTemplate]]. \ No newline at end of file +While not supported by the plugin library, it is also possible to use custom plugin types to build plugin-like behaviour with a custom user interface. Plugins with a custom type will automatically receive the same behaviour as plain plugins but can display a custom user interface using an appropriate [[view template segment|SystemTag: $:/tags/ViewTemplate]]. + +By default, tiddlers within plugins with custom plugin types will not be registered as shadow tiddlers (the constituent tiddlers can still be addressed as subtiddlers by the TranscludeWidget, ViewWidget or the [[plugintiddlers Operator]]). Setting a configuration tiddler `$:/config/RegisterPluginType/<plugin-type>` to `yes` will cause the tiddlers within the plugin to be registered as shadow tiddlers. diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 11d5b3cfc..1213fe7ab 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2168,6 +2168,7 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s .tc-plugin-info-dropdown { border: 1px solid <<colour muted-foreground>>; + background: <<colour background>>; margin-top: -8px; } @@ -2180,6 +2181,7 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s .tc-plugin-info-dropdown-body { padding: 1em 1em 0 1em; + background: <<colour background>>; } .tc-plugin-info-sub-plugins { From 66435b49923ab15fce7b6c2d695f93e8b61f2395 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 28 Sep 2019 11:50:53 +0100 Subject: [PATCH 0348/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.22.tid | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index ea0cfdfec..8a734e4e9 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -11,6 +11,12 @@ type: text/vnd.tiddlywiki Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded or deleted dynamically, without requiring a reload -- as long as they don't contain any ~JavaScript modules. Plugins that require a reload are indicated in the plugin chooser in [[$:/ControlPanel]]. +The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser|$:/core/ui/ControlPanel/Modals/AddPlugins]] in the control panel feature several improvements: + +* The plugin chooser now displays plugins that provide add-on functionality to another plugin as nested "sub-plugins", making the main listing easier to navigate +* Plugins may now declare dependencies that are automatically installed without user intervention +* All plugins now feature a concise, informal name (in addition to the description and title) + ! Translation Improvements * Improved Dutch translation From 916d006ed531d0dc77fd18a1a63f178e214d0fc3 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sun, 29 Sep 2019 22:55:25 +0800 Subject: [PATCH 0349/2376] Add chinese translations for `Plugins/AlsoRequires` (#4277) --- languages/zh-Hans/ControlPanel.multids | 1 + languages/zh-Hant/ControlPanel.multids | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index c771a8a3c..a46206f13 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -58,6 +58,7 @@ Palette/ShowEditor/Caption: 显示编辑器 Plugins/Add/Hint: 从官方插件库安装插件 Plugins/Add/Caption: 获取更多插件 Plugins/AlreadyInstalled/Hint: 此插件已经安装版本 <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: 还需要: Plugins/Caption: 插件 Plugins/Disable/Caption: 禁用 Plugins/Disable/Hint: 重新加载页面时禁用此插件 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index f94406edb..e27bb6ac7 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -58,6 +58,7 @@ Palette/ShowEditor/Caption: 顯示編輯器 Plugins/Add/Hint: 從官方插件庫安裝插件 Plugins/Add/Caption: 獲取更多插件 Plugins/AlreadyInstalled/Hint: 此插件已經安裝版本 <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: 還需要: Plugins/Caption: 插件 Plugins/Disable/Caption: 停用 Plugins/Disable/Hint: 重新載入頁面時停用此插件 From 0e771e24193eb7eaf56434fc0a6efc3209ad29f3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 3 Oct 2019 12:13:29 +0100 Subject: [PATCH 0350/2376] Fix currentTiddler in pagecontrol buttons Bug introduced in 8db893b9c99744e02797aa1837657f33b9222d62 Fixes #4283 --- core/ui/PageControls.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/PageControls.tid b/core/ui/PageControls.tid index 31df286fe..93a7bc224 100644 --- a/core/ui/PageControls.tid +++ b/core/ui/PageControls.tid @@ -7,7 +7,7 @@ $:/config/PageControlButtons/Visibility/$(listItem)$ <div class="tc-page-controls"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem"> <$set name="hidden" value=<<config-title>>> -<$list filter="[<hidden>!text[hide]]" storyview="pop"> +<$list filter="[<hidden>!text[hide]]" storyview="pop" variable="ignore"> <$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"> <$transclude tiddler=<<listItem>> mode="inline"/> </$set> From a054d100e73db95071299e92c4321c2aa8e42382 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 4 Oct 2019 11:23:17 +0100 Subject: [PATCH 0351/2376] Fix usage of tm-edit-text-operation count parameter Fixes #3912 --- core/modules/editor/operations/text/prefix-lines.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/editor/operations/text/prefix-lines.js b/core/modules/editor/operations/text/prefix-lines.js index ad67232fc..fd483a983 100644 --- a/core/modules/editor/operations/text/prefix-lines.js +++ b/core/modules/editor/operations/text/prefix-lines.js @@ -13,12 +13,13 @@ Text editor operation to add a prefix to the selected lines "use strict"; exports["prefix-lines"] = function(event,operation) { + var targetCount = parseInt(event.paramObject.count + "",10); // Cut just past the preceding line break, or the start of the text operation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart); // Cut to just past the following line break, or to the end of the text operation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd); // Compose the required prefix - var prefix = $tw.utils.repeat(event.paramObject.character,event.paramObject.count); + var prefix = $tw.utils.repeat(event.paramObject.character,targetCount); // Process each line var lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\r?\n/mg); $tw.utils.each(lines,function(line,index) { @@ -33,7 +34,7 @@ exports["prefix-lines"] = function(event,operation) { line = line.substring(1); } // We're done if we removed the exact required prefix, otherwise add it - if(count !== event.paramObject.count) { + if(count !== targetCount) { // Apply the prefix line = prefix + " " + line; } From fb9ea69ad265abf787daeab968d2a19758c61a5c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 4 Oct 2019 11:40:22 +0100 Subject: [PATCH 0352/2376] Selective expandable TOC: use "sort" filter when determining whether node is expandable Fixes #4284 --- core/wiki/macros/toc.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index 7602793f1..512a5e569 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -106,7 +106,7 @@ tags: $:/tags/Macro <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item" > <li class=<<toc-item-class>>> <$link> - <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> + <$list filter="[all[current]tagging[]$sort$limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> <$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep"> {{$:/core/images/right-arrow}} @@ -132,7 +132,7 @@ tags: $:/tags/Macro <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item"> <li class=<<toc-item-class>>> - <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>"> + <$list filter="[all[current]tagging[]$sort$limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>"> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> <$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep"> {{$:/core/images/right-arrow}} From 81867a75cd9911104e12103a595637a088f72d22 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 4 Oct 2019 12:37:04 +0100 Subject: [PATCH 0353/2376] Add docs for tm-unload-plugin-library message Fixes #4281 --- editions/tw5.com/tiddlers/$__StoryList.tid | 5 +++++ ...WidgetMessage_ tm-unload-plugin-library.tid | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 editions/tw5.com/tiddlers/$__StoryList.tid create mode 100644 editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unload-plugin-library.tid diff --git a/editions/tw5.com/tiddlers/$__StoryList.tid b/editions/tw5.com/tiddlers/$__StoryList.tid new file mode 100644 index 000000000..80d265c4e --- /dev/null +++ b/editions/tw5.com/tiddlers/$__StoryList.tid @@ -0,0 +1,5 @@ +created: 20191004112211823 +list: [[WidgetMessage: tm-unload-plugin-library]] [[WidgetMessage: tm-load-plugin-library]] [[WidgetMessage: tm-load-plugin-from-library]] HelloThere GettingStarted Community +modified: 20191004113621710 +title: $:/StoryList +type: text/vnd.tiddlywiki \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unload-plugin-library.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unload-plugin-library.tid new file mode 100644 index 000000000..f5b9e6ae9 --- /dev/null +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unload-plugin-library.tid @@ -0,0 +1,18 @@ +caption: tm-unload-plugin-library +created: 20191004112527669 +modified: 20191004113621714 +tags: Messages +title: WidgetMessage: tm-unload-plugin-library +type: text/vnd.tiddlywiki + +The `tm-unload-plugin-library` message unloads the specified plugin library and deletes associated temporary tiddlers. + +|!Name |!Description | +|url |Url specifying the plugin library to be unloaded | + +Unloading a plugin library deletes the following tiddlers: + +* The tiddler titled `$:/temp/ServerConnection/` + `<url>` +* All tiddlers with the prefix `$:/temp/RemoteAssetInfo/` + `<url>` + `/` + +The `tm-unload-plugin-library` message is usually generated with the ButtonWidget and is handled by the core itself. From a9cc292dc92716cb03f60de39500ae7fb67ad5b6 Mon Sep 17 00:00:00 2001 From: Matt Lauber <github@mklauber.com> Date: Fri, 4 Oct 2019 10:50:00 -0400 Subject: [PATCH 0354/2376] Add an example to the $fieldmangler widget (#4287) Add an example to the field mangler widget demonstrating the `tiddler` param. --- .../widgets/FieldMangler Widget (Examples).tid | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/editions/tw5.com/tiddlers/widgets/FieldMangler Widget (Examples).tid b/editions/tw5.com/tiddlers/widgets/FieldMangler Widget (Examples).tid index 54c4fb621..9fffb64db 100644 --- a/editions/tw5.com/tiddlers/widgets/FieldMangler Widget (Examples).tid +++ b/editions/tw5.com/tiddlers/widgets/FieldMangler Widget (Examples).tid @@ -12,3 +12,13 @@ Add tag ''example'' to this tiddler (current)<$button message="tm-add-tag" param Remove tag ''example'' to this tiddler (current)<$button message="tm-remove-tag" param="example">{{$:/core/images/delete-button}}</$button> </$fieldmangler> """/> + + +<$macrocall $name=".example" n="2" +eg=""" +<$fieldmangler tiddler="Hello World"> +Add tag ''example'' to the Hello World tiddler<$button message="tm-add-tag" param="example">{{$:/core/images/new-button}}</$button> +<br> +Remove tag ''example'' to the Hello World tiddler<$button message="tm-remove-tag" param="example">{{$:/core/images/delete-button}}</$button> +</$fieldmangler> +"""/> From 6e57f16517eb392a51c090e736fa01d3c29dbf8d Mon Sep 17 00:00:00 2001 From: Matt Lauber <github@mklauber.com> Date: Fri, 4 Oct 2019 10:50:32 -0400 Subject: [PATCH 0355/2376] Documentation: typo in Range widget documentation (#4288) The documentation for the range widget refers to radio buttons, instead of range sliders. --- editions/tw5.com/tiddlers/widgets/RangeWidget.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid index dcb793f29..ddf406ccc 100644 --- a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki ! Introduction -The range widget displays an HTML `<input type="range">` that reflects a given tiddler field numeric value. Adjusting the radio button sets the tiddler field to the value. +The range widget displays an HTML `<input type="range">` that reflects a given tiddler field numeric value. Adjusting the range slider sets the tiddler field to the value. ! Content and Attributes @@ -15,12 +15,12 @@ The content of the `<$range>` widget is ignored. |!Attribute |!Description | |tiddler |Title of the tiddler to manipulate (defaults to the [[current tiddler|Current Tiddler]]) | -|field |The field of the //tiddler// bound to the radio button| +|field |The field of the //tiddler// bound to the range slider| |min |The minimum value to be able to be set by the `<$range>` widget.| |max |The maximum value to be able to be set by the `<$range>` widget.| |increment |The minimum amount by which a value may be changed. Defaults to 1.| |default |The default value displayed if the field is missing or empty.| -|class |CSS classes to be assigned to the label around the radio button | +|class |CSS classes to be assigned to the label around the range slider | ! Examples From 124efb31ea250b06eb6d0546900e74feb65dc6c8 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 4 Oct 2019 17:47:37 +0100 Subject: [PATCH 0356/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.22.tid | 3 +++ 1 file changed, 3 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 8a734e4e9..e7b47d2c7 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -29,6 +29,9 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| ! Bug Fixes * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4243]] problem with the [[GitLab saver|Saving to a Git service]] +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4237]] bug with permaview button when placed above the search box +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/a054d100e73db95071299e92c4321c2aa8e42382]] usage of ''count'' parameter of [[WidgetMessage: tm-edit-text-operation]] +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4284]] bug with toc-selective-expandable macro still showing disclosure arrow despite excluding tiddlers ! Contributors From 89716bb81d68b9c68d3c0fd2f2de96afad1b086a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 6 Oct 2019 14:58:45 +0100 Subject: [PATCH 0357/2376] Add class identifying the tiddler body editor See https://groups.google.com/d/msgid/tiddlywiki/13fb3572-4259-46c3-9cc7-6ed85b636177%40googlegroups.com --- core/ui/EditTemplate/body-editor.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/body-editor.tid b/core/ui/EditTemplate/body-editor.tid index 48d51b104..9920b03c5 100644 --- a/core/ui/EditTemplate/body-editor.tid +++ b/core/ui/EditTemplate/body-editor.tid @@ -3,7 +3,7 @@ title: $:/core/ui/EditTemplate/body/editor <$edit field="text" - class="tc-edit-texteditor" + class="tc-edit-texteditor tc-edit-texteditor-body" placeholder={{$:/language/EditTemplate/Body/Placeholder}} tabindex={{$:/config/EditTabIndex}} From 1010ca01cce7d084c5991e086813081d0e10f3b3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 6 Oct 2019 14:59:08 +0100 Subject: [PATCH 0358/2376] Stylesheet cleanup --- editions/tw5.com/tiddlers/system/tw5.com-styles.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/tw5.com/tiddlers/system/tw5.com-styles.tid b/editions/tw5.com/tiddlers/system/tw5.com-styles.tid index 5164f84e3..4671d3894 100644 --- a/editions/tw5.com/tiddlers/system/tw5.com-styles.tid +++ b/editions/tw5.com/tiddlers/system/tw5.com-styles.tid @@ -1,6 +1,8 @@ title: $:/_tw5.com-styles tags: $:/tags/Stylesheet +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock + .tc-double-spaced-list li { padding-bottom: .5em; padding-top: .5em; From cb2640669be50f6ca957b459446f19f32f8a323a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 6 Oct 2019 17:34:50 +0100 Subject: [PATCH 0359/2376] HTTP Server: should include bag in returned tiddlers The bag field is included in the tiddlers baked into the HTML file, but is also needed on tiddlers read from the server dynamically. Fixes #4291 --- core/modules/server/routes/get-tiddler.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/modules/server/routes/get-tiddler.js b/core/modules/server/routes/get-tiddler.js index 9088aa49d..e125d7055 100644 --- a/core/modules/server/routes/get-tiddler.js +++ b/core/modules/server/routes/get-tiddler.js @@ -34,6 +34,7 @@ exports.handler = function(request,response,state) { } }); tiddlerFields.revision = state.wiki.getChangeCount(title); + tiddlerFields.bag = "default"; tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; response.writeHead(200, {"Content-Type": "application/json"}); response.end(JSON.stringify(tiddlerFields),"utf8"); From 8efd0ace343f6c5a3232c1ef9f3f06e81c7fefff Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 7 Oct 2019 16:13:56 +0200 Subject: [PATCH 0360/2376] Missing whitespace trim in PageControls (#4293) * add whitespace trim to advanced search button * add whitespace trim to new tiddler * add whitespace trim to new journal * add whitespace trim to new image * add whitespace trim to control panel button * add whitespace trim to tiddler manager button * add whitespace trim to language button * add whitespace trim to palette button * add whitespace trim to theme button * add whitespace trim to storyview button * add whitespace trim to timestamp button * add whitespace trim to encryption button * add whitespace trim to tag-manager button --- core/ui/PageControls/advanced-search.tid | 1 + core/ui/PageControls/controlpanel.tid | 1 + core/ui/PageControls/encryption.tid | 3 ++- core/ui/PageControls/language.tid | 3 ++- core/ui/PageControls/manager.tid | 1 + core/ui/PageControls/new-image.tid | 1 + core/ui/PageControls/new-journal.tid | 1 + core/ui/PageControls/newtiddler.tid | 1 + core/ui/PageControls/palette.tid | 3 ++- core/ui/PageControls/storyview.tid | 3 ++- core/ui/PageControls/tag-button.tid | 1 + core/ui/PageControls/theme.tid | 3 ++- core/ui/PageControls/timestamp.tid | 3 ++- 13 files changed, 19 insertions(+), 6 deletions(-) diff --git a/core/ui/PageControls/advanced-search.tid b/core/ui/PageControls/advanced-search.tid index c2962c9c4..caeaaebb8 100644 --- a/core/ui/PageControls/advanced-search.tid +++ b/core/ui/PageControls/advanced-search.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}} description: {{$:/language/Buttons/AdvancedSearch/Hint}} +\whitespace trim \define control-panel-button(class) <$button to="$:/AdvancedSearch" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> diff --git a/core/ui/PageControls/controlpanel.tid b/core/ui/PageControls/controlpanel.tid index 056f77263..82fac7398 100644 --- a/core/ui/PageControls/controlpanel.tid +++ b/core/ui/PageControls/controlpanel.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}} description: {{$:/language/Buttons/ControlPanel/Hint}} +\whitespace trim \define control-panel-button(class) <$button to="$:/ControlPanel" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> diff --git a/core/ui/PageControls/encryption.tid b/core/ui/PageControls/encryption.tid index 80d473152..b4b5e553f 100644 --- a/core/ui/PageControls/encryption.tid +++ b/core/ui/PageControls/encryption.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}} description: {{$:/language/Buttons/Encryption/Hint}} +\whitespace trim <$reveal type="match" state="$:/isEncrypted" text="yes"> <$button message="tm-clear-password" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> @@ -22,4 +23,4 @@ description: {{$:/language/Buttons/Encryption/Hint}} <span class="tc-btn-text"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span> </$list> </$button> -</$reveal> \ No newline at end of file +</$reveal> diff --git a/core/ui/PageControls/language.tid b/core/ui/PageControls/language.tid index 5591a768b..623c71004 100644 --- a/core/ui/PageControls/language.tid +++ b/core/ui/PageControls/language.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}} description: {{$:/language/Buttons/Language/Hint}} +\whitespace trim \define flag-title() $(languagePluginTitle)$/icon \end @@ -24,4 +25,4 @@ $(languagePluginTitle)$/icon <div class="tc-drop-down"> {{$:/snippets/languageswitcher}} </div> -</$reveal> \ No newline at end of file +</$reveal> diff --git a/core/ui/PageControls/manager.tid b/core/ui/PageControls/manager.tid index 09b3b05fc..7255747f4 100644 --- a/core/ui/PageControls/manager.tid +++ b/core/ui/PageControls/manager.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}} description: {{$:/language/Buttons/Manager/Hint}} +\whitespace trim \define manager-button(class) <$button to="$:/Manager" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> diff --git a/core/ui/PageControls/new-image.tid b/core/ui/PageControls/new-image.tid index 71b401ad8..fab7df573 100644 --- a/core/ui/PageControls/new-image.tid +++ b/core/ui/PageControls/new-image.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}} description: {{$:/language/Buttons/NewImage/Hint}} +\whitespace trim <$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-image-button}} diff --git a/core/ui/PageControls/new-journal.tid b/core/ui/PageControls/new-journal.tid index 797b65b49..914352e1b 100644 --- a/core/ui/PageControls/new-journal.tid +++ b/core/ui/PageControls/new-journal.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}} description: {{$:/language/Buttons/NewJournal/Hint}} +\whitespace trim \define journalButton() <$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> diff --git a/core/ui/PageControls/newtiddler.tid b/core/ui/PageControls/newtiddler.tid index 1896d827f..7ea1994ff 100644 --- a/core/ui/PageControls/newtiddler.tid +++ b/core/ui/PageControls/newtiddler.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}} description: {{$:/language/Buttons/NewTiddler/Hint}} +\whitespace trim <$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-button}} diff --git a/core/ui/PageControls/palette.tid b/core/ui/PageControls/palette.tid index d0a2ca60b..6fdbdb439 100644 --- a/core/ui/PageControls/palette.tid +++ b/core/ui/PageControls/palette.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}} description: {{$:/language/Buttons/Palette/Hint}} +\whitespace trim <span class="tc-popup-keep"> <$button popup=<<qualify "$:/state/popup/palette">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> @@ -17,4 +18,4 @@ description: {{$:/language/Buttons/Palette/Hint}} <div class="tc-drop-down" style="font-size:0.7em;"> {{$:/snippets/paletteswitcher}} </div> -</$reveal> \ No newline at end of file +</$reveal> diff --git a/core/ui/PageControls/storyview.tid b/core/ui/PageControls/storyview.tid index f84c0d2f9..c4d0b7365 100644 --- a/core/ui/PageControls/storyview.tid +++ b/core/ui/PageControls/storyview.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}} description: {{$:/language/Buttons/StoryView/Hint}} +\whitespace trim \define icon() $:/core/images/storyview-$(storyview)$ \end @@ -22,4 +23,4 @@ $:/core/images/storyview-$(storyview)$ <div class="tc-drop-down"> {{$:/snippets/viewswitcher}} </div> -</$reveal> \ No newline at end of file +</$reveal> diff --git a/core/ui/PageControls/tag-button.tid b/core/ui/PageControls/tag-button.tid index 808a3bfd6..e7e6bdc89 100644 --- a/core/ui/PageControls/tag-button.tid +++ b/core/ui/PageControls/tag-button.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}} description: {{$:/language/Buttons/TagManager/Hint}} +\whitespace trim \define control-panel-button(class) <$button to="$:/TagManager" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> diff --git a/core/ui/PageControls/theme.tid b/core/ui/PageControls/theme.tid index b859beb68..2d8eadc7b 100644 --- a/core/ui/PageControls/theme.tid +++ b/core/ui/PageControls/theme.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}} description: {{$:/language/Buttons/Theme/Hint}} +\whitespace trim <span class="tc-popup-keep"> <$button popup=<<qualify "$:/state/popup/theme">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> @@ -19,4 +20,4 @@ description: {{$:/language/Buttons/Theme/Hint}} {{$:/snippets/themeswitcher}} </$linkcatcher> </div> -</$reveal> \ No newline at end of file +</$reveal> diff --git a/core/ui/PageControls/timestamp.tid b/core/ui/PageControls/timestamp.tid index b25a1af05..abf89b70c 100644 --- a/core/ui/PageControls/timestamp.tid +++ b/core/ui/PageControls/timestamp.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}} description: {{$:/language/Buttons/Timestamp/Hint}} +\whitespace trim <$reveal type="nomatch" state="$:/config/TimestampDisable" text="yes"> <$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>> <$action-setfield $tiddler="$:/config/TimestampDisable" $value="yes"/> @@ -24,4 +25,4 @@ description: {{$:/language/Buttons/Timestamp/Hint}} <span class="tc-btn-text"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span> </$list> </$button> -</$reveal> \ No newline at end of file +</$reveal> From d8fd2f75d60760dd56ca0d4730994d63179f4b83 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 7 Oct 2019 19:50:30 +0200 Subject: [PATCH 0361/2376] Two missing whitespace trims for PageControls (#4296) * add whitespace trim to help button * add whitespace trim to new markdown button * Update help.tid --- plugins/tiddlywiki/help/help.tid | 2 ++ plugins/tiddlywiki/markdown/new-markdown.tid | 1 + 2 files changed, 3 insertions(+) diff --git a/plugins/tiddlywiki/help/help.tid b/plugins/tiddlywiki/help/help.tid index 2cdc12649..599ccf6a2 100644 --- a/plugins/tiddlywiki/help/help.tid +++ b/plugins/tiddlywiki/help/help.tid @@ -3,7 +3,9 @@ tags: $:/tags/PageControls caption: {{$:/core/images/help}} {{$:/language/Buttons/Help/Caption}} description: {{$:/language/Buttons/Help/Hint}} +\whitespace trim \define help-inner() +\whitespace trim <$reveal type="match" state="$:/config/ShowHelp" text="yes"> <$button set="$:/config/ShowHelp" setTo="no" tooltip={{$:/language/Buttons/Help/Hint}} aria-label={{$:/language/Buttons/Help/Caption}} class="""$(tv-config-toolbar-class)$ tc-selected"""> <$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> diff --git a/plugins/tiddlywiki/markdown/new-markdown.tid b/plugins/tiddlywiki/markdown/new-markdown.tid index 688ea9709..ff6d40c82 100755 --- a/plugins/tiddlywiki/markdown/new-markdown.tid +++ b/plugins/tiddlywiki/markdown/new-markdown.tid @@ -4,6 +4,7 @@ caption: {{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}} {{$:/lang description: {{$:/language/Buttons/NewMarkdown/Hint}} list-after: $:/core/ui/Buttons/new-tiddler +\whitespace trim <$button tooltip={{$:/language/Buttons/NewMarkdown/Hint}} aria-label={{$:/language/Buttons/NewMarkdown/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-new-tiddler" type="text/x-markdown"/> <$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> From e9211b0eee8e0b081f9f1597bde6673bf4c55d5c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 11 Oct 2019 10:57:29 +0100 Subject: [PATCH 0362/2376] Allow sidebar tabs to be independently targeted via CSS --- core/ui/SideBar/More.tid | 2 +- core/ui/SideBarSegments/tabs.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/SideBar/More.tid b/core/ui/SideBar/More.tid index 624a3ae4a..1c21f9d68 100644 --- a/core/ui/SideBar/More.tid +++ b/core/ui/SideBar/More.tid @@ -3,5 +3,5 @@ tags: $:/tags/SideBar caption: {{$:/language/SideBar/More/Caption}} <div class="tc-more-sidebar"> -<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]" default={{$:/config/DefaultMoreSidebarTab}} state="$:/state/tab/moresidebar" class="tc-vertical" /> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]" default={{$:/config/DefaultMoreSidebarTab}} state="$:/state/tab/moresidebar" class="tc-vertical tc-sidebar-tabs-more" /> </div> \ No newline at end of file diff --git a/core/ui/SideBarSegments/tabs.tid b/core/ui/SideBarSegments/tabs.tid index 8247ecf83..24037e8e0 100644 --- a/core/ui/SideBarSegments/tabs.tid +++ b/core/ui/SideBarSegments/tabs.tid @@ -3,6 +3,6 @@ tags: $:/tags/SideBarSegment <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" /> +<$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"/> </div> From 81f1e6af4e5920c6ff41e7f08171bfddc1b26dfc Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 11 Oct 2019 15:34:57 +0100 Subject: [PATCH 0363/2376] Vertical tabs: remove word break setting See discussion here: https://groups.google.com/d/msgid/tiddlywiki/467c887e-edf6-4187-9727-bf806fdeb711%40googlegroups.com --- themes/tiddlywiki/vanilla/base.tid | 1 - 1 file changed, 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 1213fe7ab..4fb297615 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1806,7 +1806,6 @@ html body.tc-body.tc-single-tiddler-window { } .tc-tab-content.tc-vertical { - word-break: break-word; display: inline-block; vertical-align: top; padding-top: 0; From d30eacc6520971c95bdabf24f4c4122534d9414a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 11 Oct 2019 17:46:30 +0100 Subject: [PATCH 0364/2376] Select widget: fix bug with deselecting entries programmatically Previously, it was not possible to deselect entries by editing the tiddler $:/generated-list-demo-state used in the final example of the SelectWidget docs --- core/modules/widgets/select.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/modules/widgets/select.js b/core/modules/widgets/select.js index d860d42cf..6efeb588f 100644 --- a/core/modules/widgets/select.js +++ b/core/modules/widgets/select.js @@ -96,11 +96,8 @@ SelectWidget.prototype.setSelectValue = function() { var select = this.getSelectDomNode(); var values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value); for(var i=0; i < select.children.length; i++){ - if(values.indexOf(select.children[i].value) != -1) { - select.children[i].selected = true; - } + select.children[i].selected = values.indexOf(select.children[i].value) !== -1 } - } else { var domNode = this.getSelectDomNode(); if(domNode.value !== value) { From 9ed45cfaadff162fa56b578d9238a3ead691fe99 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 10:24:05 +0200 Subject: [PATCH 0365/2376] Add whitespace trim to SideBarSegments search (#4302) --- core/ui/SideBarSegments/search.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 529ce74aa..f0ab71a98 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -1,6 +1,7 @@ title: $:/core/ui/SideBarSegments/search tags: $:/tags/SideBarSegment +\whitespace trim <div class="tc-sidebar-lists tc-sidebar-search"> <$set name="searchTiddler" value="$:/temp/search"> From 74172b35ceae84f254e20d6d7ec4dff2cca692b1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 11:01:27 +0200 Subject: [PATCH 0366/2376] Fix: make tag-picker "add-tag" button more consistent (#4199) * make tag-picker add-button compliant with enter-actions ... the `$actions$` way throws a filter syntax error in some cases, the `<<add-tag-actions>>` way is more solid * Update tags.tid remove tag-picker-actions --- core/ui/EditTemplate/tags.tid | 10 +--------- core/wiki/macros/tag-picker.tid | 6 ++---- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index d368ce491..0bc581592 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -25,14 +25,6 @@ color:$(foregroundColor)$; <$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon="""$icon$"""/> \end -\define tag-picker-actions() -<$action-listops - $tiddler=<<currentTiddler>> - $field="tags" - $subfilter="[<tag>] [all[current]tags[]]" -/> -\end - <div class="tc-edit-tags"> <$fieldmangler> <$list filter="[all[current]tags[]sort[title]]" storyview="pop"> @@ -40,6 +32,6 @@ color:$(foregroundColor)$; </$list> </$fieldmangler> <$set name="tabIndex" value={{$:/config/EditTabIndex}}> -<$macrocall $name="tag-picker" actions=<<tag-picker-actions>>/> +<$macrocall $name="tag-picker"/> </$set> </div> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 52b19bb4b..9f29c3665 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -14,8 +14,7 @@ $(actions)$ </$button> \end -\define tag-picker(actions) -<$set name="actions" value="""$actions$"""> +\define tag-picker() <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> @@ -24,7 +23,7 @@ $(actions)$ </span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> <$set name="tag" value={{$:/temp/NewTagName}}> <$button set="$:/temp/NewTagName" setTo="" class=""> -$actions$ +<<add-tag-actions>> <$action-deletetiddler $tiddler="$:/temp/NewTagName"/> {{$:/language/EditTemplate/Tags/Add/Button}} </$button> @@ -46,5 +45,4 @@ $actions$ </div> </$reveal> </div> -</$set> \end From 66b68f4a58f2e7e24954d6f59c3791deaf0025e6 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 13:04:10 +0200 Subject: [PATCH 0367/2376] Allow configuration of default focus field of new tiddlers (#4238) * add editFocus attribute to edit widget * add focus condition to title editTemplate * add focus condition to body-editor editTemplate * add focus attribute to type editTemplate * add focus attribute to fields editTemplate * add focus attribute to tag-picker * add $:/config/AutoFocus tiddler ... default focus is title * Update Basics.tid * Update ControlPanel.multids * Create minifocusswitcher.tid * Update minifocusswitcher.tid * Update Basics.tid * Update body-editor.tid --- core/language/en-GB/ControlPanel.multids | 1 + core/modules/widgets/edit.js | 4 +++- core/ui/ControlPanel/Basics.tid | 1 + core/ui/EditTemplate/body-editor.tid | 1 + core/ui/EditTemplate/fields.tid | 2 +- core/ui/EditTemplate/title.tid | 2 +- core/ui/EditTemplate/type.tid | 2 +- core/wiki/config/AutoFocus.tid | 2 ++ core/wiki/macros/tag-picker.tid | 2 +- core/wiki/minifocusswitcher.tid | 7 +++++++ 10 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 core/wiki/config/AutoFocus.tid create mode 100644 core/wiki/minifocusswitcher.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index c7ff155c0..90884aa60 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -5,6 +5,7 @@ Advanced/Hint: Internal information about this TiddlyWiki Appearance/Caption: Appearance Appearance/Hint: Ways to customise the appearance of your TiddlyWiki. Basics/AnimDuration/Prompt: Animation duration: +Basics/AutoFocus/Prompt: Default AutoFocus field: Basics/Caption: Basics Basics/DefaultTiddlers/BottomHint: Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">retain story ordering</$button> Basics/DefaultTiddlers/Prompt: Default tiddlers: diff --git a/core/modules/widgets/edit.js b/core/modules/widgets/edit.js index 678297ab2..92ac0e1be 100644 --- a/core/modules/widgets/edit.js +++ b/core/modules/widgets/edit.js @@ -47,6 +47,7 @@ EditWidget.prototype.execute = function() { this.editClass = this.getAttribute("class"); this.editPlaceholder = this.getAttribute("placeholder"); this.editTabIndex = this.getAttribute("tabindex"); + this.editFocus = this.getAttribute("focus",""); // Choose the appropriate edit widget this.editorType = this.getEditorType(); // Make the child widgets @@ -58,7 +59,8 @@ EditWidget.prototype.execute = function() { index: {type: "string", value: this.editIndex}, "class": {type: "string", value: this.editClass}, "placeholder": {type: "string", value: this.editPlaceholder}, - "tabindex": {type: "string", value: this.editTabIndex} + "tabindex": {type: "string", value: this.editTabIndex}, + "focus": {type: "string", value: this.editFocus} }, children: this.parseTreeNode.children }]); diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 11563a3bc..a4fc82e5f 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -24,6 +24,7 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | |<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Tags" default="" tag="input"/> | +|<<lingo Autofocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | |<<lingo Tags/Prompt>> |<<show-filter-count "[tags[]sort[title]]">> | diff --git a/core/ui/EditTemplate/body-editor.tid b/core/ui/EditTemplate/body-editor.tid index 9920b03c5..a299d063d 100644 --- a/core/ui/EditTemplate/body-editor.tid +++ b/core/ui/EditTemplate/body-editor.tid @@ -6,6 +6,7 @@ title: $:/core/ui/EditTemplate/body/editor class="tc-edit-texteditor tc-edit-texteditor-body" placeholder={{$:/language/EditTemplate/Body/Placeholder}} tabindex={{$:/config/EditTabIndex}} + focus={{{ [{$:/config/Autofocus}match[text]then[true]] ~[[false]] }}} ><$set diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 4b5ab5d4b..ad0c78214 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -40,7 +40,7 @@ $value={{$:/temp/newfieldvalue}}/> <td class="tc-edit-field-name"> <$text text=<<currentField>>/>:</td> <td class="tc-edit-field-value"> -<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/> +<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/> </td> <td class="tc-edit-field-remove"> <$button class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}> diff --git a/core/ui/EditTemplate/title.tid b/core/ui/EditTemplate/title.tid index 6496db075..0f3632ad1 100644 --- a/core/ui/EditTemplate/title.tid +++ b/core/ui/EditTemplate/title.tid @@ -1,7 +1,7 @@ title: $:/core/ui/EditTemplate/title tags: $:/tags/EditTemplate -<$edit-text field="draft.title" class="tc-titlebar tc-edit-texteditor" focus="true" tabindex={{$:/config/EditTabIndex}}/> +<$edit-text field="draft.title" class="tc-titlebar tc-edit-texteditor" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}}/> <$vars pattern="""[\|\[\]{}]""" bad-chars="""`| [ ] { }`"""> diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 8bf206d74..64c941037 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditTemplate \define lingo-base() $:/language/EditTemplate/ <div class="tc-type-selector"><$fieldmangler> -<em class="tc-edit"><<lingo Type/Prompt>></em> <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}}/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> +<em class="tc-edit"><<lingo Type/Prompt>></em> <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> </$fieldmangler></div> <div class="tc-block-dropdown-wrapper"> diff --git a/core/wiki/config/AutoFocus.tid b/core/wiki/config/AutoFocus.tid new file mode 100644 index 000000000..a1a9f71b1 --- /dev/null +++ b/core/wiki/config/AutoFocus.tid @@ -0,0 +1,2 @@ +title: $:/config/AutoFocus +text: title diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 9f29c3665..b0c1543cb 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -18,7 +18,7 @@ $(actions)$ <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> -<$edit-text tiddler="$:/temp/NewTagName" tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>>/> +<$edit-text tiddler="$:/temp/NewTagName" tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/> </$keyboard> </span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> <$set name="tag" value={{$:/temp/NewTagName}}> diff --git a/core/wiki/minifocusswitcher.tid b/core/wiki/minifocusswitcher.tid new file mode 100644 index 000000000..ca9e1d4a0 --- /dev/null +++ b/core/wiki/minifocusswitcher.tid @@ -0,0 +1,7 @@ +title: $:/snippets/minifocusswitcher + +<$select tiddler="$:/config/Autofocus"> +<$list filter="title tags text type fields"> +<option value=<<currentTiddler>>><<currentTiddler>></option> +</$list> +</$select> From d01b781283115f32eac345f92e483741918a65a7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 15:08:52 +0200 Subject: [PATCH 0368/2376] Restore previous popup mechanism (no cancelling when focusing inputs) (#4305) * remove cancelpopups from factory.js * remove handleFocusEvent from framed engine * remove cancelPopups from simple engine * Update popup.js --- core/modules/editor/engines/framed.js | 11 ------- core/modules/editor/engines/simple.js | 1 - core/modules/editor/factory.js | 7 ----- core/modules/utils/dom/popup.js | 41 ++++++--------------------- 4 files changed, 8 insertions(+), 52 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 7984eff4f..6e7da24da 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -79,7 +79,6 @@ function FramedEngine(options) { // Add event listeners $tw.utils.addEventListeners(this.domNode,[ {name: "click",handlerObject: this,handlerMethod: "handleClickEvent"}, - {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"}, {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"} ]); @@ -153,16 +152,6 @@ FramedEngine.prototype.focus = function() { this.domNode.select(); } }; - -/* -Handle the focus event -*/ -FramedEngine.prototype.handleFocusEvent = function(event) { - if(this.widget.cancelPopups) { - this.widget.cancelPopups(); - } - return true; -}; /* Handle a click diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index acd4bc3d2..bb77893d7 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -122,7 +122,6 @@ SimpleEngine.prototype.handleInputEvent = function(event) { Handle a dom "focus" event */ SimpleEngine.prototype.handleFocusEvent = function(event) { - this.widget.cancelPopups(); if(this.widget.editFocusPopup) { $tw.popup.triggerPopup({ domNode: this.domNode, diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index 82b4484c6..8dfc88037 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -248,13 +248,6 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { } }; - /* - Cancel Popups - */ - EditTextWidget.prototype.cancelPopups = function() { - $tw.popup.cancel(0,this.engine.domNode); - }; - /* Handle a dom "keydown" event, which we'll bubble up to our container for the keyboard widgets benefit */ diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index aa89d705c..4ae1a44cd 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -149,46 +149,21 @@ Popup.prototype.show = function(options) { } }; -/* -Detect if a Popup contains an input field that has focus -Returns true or false -*/ -Popup.prototype.detectInputWithinPopup = function(node) { - var withinPopup = false, - currNode = node; - for(var i=0; i<this.popups.length; i++) { - var popup = (this.popups[i] && this.popups[i].domNode) ? this.popups[i].domNode : null; - while(node && popup) { - if(node === popup || (node.classList && (node.classList.contains("tc-popup-keep") || (node !== currNode && node.classList.contains("tc-popup-handle"))))) { - withinPopup = true; - } - node = node.parentNode; - } - } - return withinPopup; -}; - /* Cancel all popups at or above a specified level or DOM node level: popup level to cancel (0 cancels all popups) */ -Popup.prototype.cancel = function(level,focusedInputNode) { +Popup.prototype.cancel = function(level) { var numPopups = this.popups.length; level = Math.max(0,Math.min(level,numPopups)); for(var t=level; t<numPopups; t++) { - var inputWithinPopup; - if(focusedInputNode) { - inputWithinPopup = this.detectInputWithinPopup(focusedInputNode); - } - if(!inputWithinPopup) { - var popup = this.popups.pop(); - if(popup.title) { - if(popup.noStateReference) { - popup.wiki.deleteTiddler(popup.title); - } else { - popup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title); - } - } + var popup = this.popups.pop(); + if(popup.title) { + if(popup.noStateReference) { + popup.wiki.deleteTiddler(popup.title); + } else { + popup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title); + } } } if(this.popups.length === 0) { From bfa3ddd077404ad4627b9161bcadf3d5a539c1dc Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 15:10:06 +0200 Subject: [PATCH 0369/2376] Add two missing tooltips: add-tag button and add-field button (#4306) * add tooltip to field add button * Update EditTemplate.multids * Update EditTemplate.multids * add tooltip to tag-picker add button --- core/language/en-GB/EditTemplate.multids | 2 ++ core/ui/EditTemplate/fields.tid | 2 +- core/wiki/macros/tag-picker.tid | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/language/en-GB/EditTemplate.multids b/core/language/en-GB/EditTemplate.multids index 9a80300f0..90ee4975f 100644 --- a/core/language/en-GB/EditTemplate.multids +++ b/core/language/en-GB/EditTemplate.multids @@ -8,6 +8,7 @@ Field/Remove/Hint: Remove field Field/Dropdown/Caption: field list Field/Dropdown/Hint: Show field list Fields/Add/Button: add +Fields/Add/Button/Hint: add field Fields/Add/Name/Placeholder: field name Fields/Add/Prompt: Add a new field: Fields/Add/Value/Placeholder: field value @@ -16,6 +17,7 @@ Fields/Add/Dropdown/User: User fields Shadow/Warning: This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>> Shadow/OverriddenWarning: This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler Tags/Add/Button: add +Tags/Add/Button/Hint: add tag Tags/Add/Placeholder: tag name Tags/Dropdown/Caption: tag list Tags/Dropdown/Hint: Show tag list diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index ad0c78214..6923fac17 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -13,7 +13,7 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ \define new-field() <$vars name={{$:/temp/newfieldname}}> <$reveal type="nomatch" text="" default=<<name>>> -<$button> +<$button tooltip=<<lingo Fields/Add/Button/Hint>>> <$action-sendmessage $message="tm-add-field" $name=<<name>> $value={{$:/temp/newfieldvalue}}/> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index b0c1543cb..952aaf0c5 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -7,7 +7,7 @@ tags: $:/tags/Macro \end \define tag-button() -<$button class="tc-btn-invisible" tag="a"> +<$button class="tc-btn-invisible" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> $(actions)$ <$action-deletetiddler $tiddler="$:/temp/NewTagName"/> <$macrocall $name="tag-pill" tag=<<tag>>/> From ea6113b255796bbc621519c45ec279f1151758b1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 16:10:24 +0200 Subject: [PATCH 0370/2376] Fix CamelCase AutoFocus in ControlPanel (#4308) * from AutoFocus to ~AutoFocus * Update minifocusswitcher.tid * Update Basics.tid * Update body-editor.tid --- core/language/en-GB/ControlPanel.multids | 2 +- core/ui/ControlPanel/Basics.tid | 2 +- core/ui/EditTemplate/body-editor.tid | 2 +- core/wiki/minifocusswitcher.tid | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 90884aa60..3b086e851 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -5,7 +5,7 @@ Advanced/Hint: Internal information about this TiddlyWiki Appearance/Caption: Appearance Appearance/Hint: Ways to customise the appearance of your TiddlyWiki. Basics/AnimDuration/Prompt: Animation duration: -Basics/AutoFocus/Prompt: Default AutoFocus field: +Basics/AutoFocus/Prompt: Default ~AutoFocus field: Basics/Caption: Basics Basics/DefaultTiddlers/BottomHint: Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">retain story ordering</$button> Basics/DefaultTiddlers/Prompt: Default tiddlers: diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index a4fc82e5f..4a4379e82 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -24,7 +24,7 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | |<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Tags" default="" tag="input"/> | -|<<lingo Autofocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | +|<<lingo AutoFocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | |<<lingo Tags/Prompt>> |<<show-filter-count "[tags[]sort[title]]">> | diff --git a/core/ui/EditTemplate/body-editor.tid b/core/ui/EditTemplate/body-editor.tid index a299d063d..fe2a034c6 100644 --- a/core/ui/EditTemplate/body-editor.tid +++ b/core/ui/EditTemplate/body-editor.tid @@ -6,7 +6,7 @@ title: $:/core/ui/EditTemplate/body/editor class="tc-edit-texteditor tc-edit-texteditor-body" placeholder={{$:/language/EditTemplate/Body/Placeholder}} tabindex={{$:/config/EditTabIndex}} - focus={{{ [{$:/config/Autofocus}match[text]then[true]] ~[[false]] }}} + focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}} ><$set diff --git a/core/wiki/minifocusswitcher.tid b/core/wiki/minifocusswitcher.tid index ca9e1d4a0..979db1f6c 100644 --- a/core/wiki/minifocusswitcher.tid +++ b/core/wiki/minifocusswitcher.tid @@ -1,6 +1,6 @@ title: $:/snippets/minifocusswitcher -<$select tiddler="$:/config/Autofocus"> +<$select tiddler="$:/config/AutoFocus"> <$list filter="title tags text type fields"> <option value=<<currentTiddler>>><<currentTiddler>></option> </$list> From 007fc8239bd87026a308b8dfc0be12b5bc202294 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 17:30:59 +0200 Subject: [PATCH 0371/2376] Add default new tiddler tags mechanism and interface (#4307) * Update ControlPanel.multids * Update Basics.tid * Update new-tiddler.tid * Update new-journal.tid * Update new-image.tid * Update new-here.tid * Update new-journal-here.tid * Update new-tiddler.tid * Update new-image.tid * Update new-journal.tid * Update new-tiddler.tid * Update new-image.tid * Update new-here.tid * Update new-journal-here.tid * Update Basics.tid * Update Basics.tid --- core/language/en-GB/ControlPanel.multids | 1 + core/ui/Actions/new-image.tid | 2 +- core/ui/Actions/new-journal.tid | 2 +- core/ui/Actions/new-tiddler.tid | 2 +- core/ui/ControlPanel/Basics.tid | 5 +++-- core/ui/ViewToolbar/new-here.tid | 4 ++-- core/ui/ViewToolbar/new-journal-here.tid | 4 ++-- 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 3b086e851..051b26296 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -14,6 +14,7 @@ Basics/Language/Prompt: Hello! Current language: Basics/NewJournal/Title/Prompt: Title of new journal tiddlers Basics/NewJournal/Text/Prompt: Text for new journal tiddlers Basics/NewJournal/Tags/Prompt: Tags for new journal tiddlers +Basics/NewTiddler/Tags/Prompt: Tags for new tiddlers Basics/NewTiddler/Title/Prompt: Title of new tiddlers Basics/OverriddenShadowTiddlers/Prompt: Number of overridden shadow tiddlers: Basics/ShadowTiddlers/Prompt: Number of shadow tiddlers: diff --git a/core/ui/Actions/new-image.tid b/core/ui/Actions/new-image.tid index 372933e90..1e46ebcdb 100644 --- a/core/ui/Actions/new-image.tid +++ b/core/ui/Actions/new-image.tid @@ -6,5 +6,5 @@ description: create a new image tiddler image/$(imageType)$ \end <$vars imageType={{$:/config/NewImageType}}> -<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>>/> +<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!tags}}/> </$vars> diff --git a/core/ui/Actions/new-journal.tid b/core/ui/Actions/new-journal.tid index 4c5082f78..5cb7eeade 100644 --- a/core/ui/Actions/new-journal.tid +++ b/core/ui/Actions/new-journal.tid @@ -2,7 +2,7 @@ title: $:/core/ui/Actions/new-journal tags: $:/tags/Actions description: create a new journal tiddler -<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} journalText={{$:/config/NewJournal/Text}}> +<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}> <$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>"""> <$reveal type="nomatch" state=<<journalTitle>> text=""> <$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/> diff --git a/core/ui/Actions/new-tiddler.tid b/core/ui/Actions/new-tiddler.tid index 272b61007..e176f0ab3 100644 --- a/core/ui/Actions/new-tiddler.tid +++ b/core/ui/Actions/new-tiddler.tid @@ -2,4 +2,4 @@ title: $:/core/ui/Actions/new-tiddler tags: $:/tags/Actions description: create a new empty tiddler -<$action-sendmessage $message="tm-new-tiddler"/> +<$action-sendmessage $message="tm-new-tiddler" tags={{$:/config/NewTiddler/Tags!!tags}}/> diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 4a4379e82..72a1ca9f3 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -22,9 +22,10 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag="textarea" tiddler="$:/DefaultTiddlers" class="tc-edit-texteditor"/><br>//<<lingo DefaultTiddlers/BottomHint>>// | |<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | +|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |{{$:/config/NewTiddler/Tags||$:/core/ui/EditTemplate/tags}} | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | -|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Tags" default="" tag="input"/> | -|<<lingo AutoFocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | +|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |{{$:/config/NewJournal/Tags||$:/core/ui/EditTemplate/tags}} | +|<<lingo Autofocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | |<<lingo Tags/Prompt>> |<<show-filter-count "[tags[]sort[title]]">> | diff --git a/core/ui/ViewToolbar/new-here.tid b/core/ui/ViewToolbar/new-here.tid index 7b3f96c32..87f73e267 100644 --- a/core/ui/ViewToolbar/new-here.tid +++ b/core/ui/ViewToolbar/new-here.tid @@ -5,7 +5,7 @@ description: {{$:/language/Buttons/NewHere/Hint}} \whitespace trim \define newHereActions() -<$set name="tags" filter="[<currentTiddler>]"> +<$set name="tags" filter="[<currentTiddler>addsuffix[ ]addsuffix{$:/config/NewTiddler/Tags!!tags}]"> <$action-sendmessage $message="tm-new-tiddler" tags=<<tags>>/> </$set> \end @@ -21,4 +21,4 @@ description: {{$:/language/Buttons/NewHere/Hint}} </$list> </$button> \end -<<newHereButton>> \ No newline at end of file +<<newHereButton>> diff --git a/core/ui/ViewToolbar/new-journal-here.tid b/core/ui/ViewToolbar/new-journal-here.tid index e41fd4063..b540185ca 100644 --- a/core/ui/ViewToolbar/new-journal-here.tid +++ b/core/ui/ViewToolbar/new-journal-here.tid @@ -23,9 +23,9 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}} </$button> \end <$set name="journalTitleTemplate" value={{$:/config/NewJournal/Title}}> -<$set name="journalTags" value={{$:/config/NewJournal/Tags}}> +<$set name="journalTags" value={{$:/config/NewJournal/Tags!!tags}}> <$set name="currentTiddlerTag" value=<<currentTiddler>>> <<journalButton>> </$set> </$set> -</$set> \ No newline at end of file +</$set> From 920f0869c4f0931067944fbb23b4cd084f341a0f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 12 Oct 2019 17:40:51 +0200 Subject: [PATCH 0372/2376] Fix: remove cancelPopups from codemirror engine (#4310) --- plugins/tiddlywiki/codemirror/engine.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/tiddlywiki/codemirror/engine.js b/plugins/tiddlywiki/codemirror/engine.js index 5fa4686cf..630482d7d 100755 --- a/plugins/tiddlywiki/codemirror/engine.js +++ b/plugins/tiddlywiki/codemirror/engine.js @@ -125,9 +125,6 @@ function CodeMirrorEngine(options) { event.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event return false; }); - this.cm.on("focus",function() { - self.widget.cancelPopups(); - }); this.cm.on("keydown",function(cm,event) { return self.widget.handleKeydownEvent.call(self.widget,event); }); From f0779b58ac8f516382cfe45c0a6a6fd1cd2caf45 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 13 Oct 2019 11:19:07 +0200 Subject: [PATCH 0373/2376] Revert "Add default new tiddler tags mechanism and interface (#4307)" (#4312) This reverts commit 007fc8239bd87026a308b8dfc0be12b5bc202294. --- core/language/en-GB/ControlPanel.multids | 1 - core/ui/Actions/new-image.tid | 2 +- core/ui/Actions/new-journal.tid | 2 +- core/ui/Actions/new-tiddler.tid | 2 +- core/ui/ControlPanel/Basics.tid | 5 ++--- core/ui/ViewToolbar/new-here.tid | 4 ++-- core/ui/ViewToolbar/new-journal-here.tid | 4 ++-- 7 files changed, 9 insertions(+), 11 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 051b26296..3b086e851 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -14,7 +14,6 @@ Basics/Language/Prompt: Hello! Current language: Basics/NewJournal/Title/Prompt: Title of new journal tiddlers Basics/NewJournal/Text/Prompt: Text for new journal tiddlers Basics/NewJournal/Tags/Prompt: Tags for new journal tiddlers -Basics/NewTiddler/Tags/Prompt: Tags for new tiddlers Basics/NewTiddler/Title/Prompt: Title of new tiddlers Basics/OverriddenShadowTiddlers/Prompt: Number of overridden shadow tiddlers: Basics/ShadowTiddlers/Prompt: Number of shadow tiddlers: diff --git a/core/ui/Actions/new-image.tid b/core/ui/Actions/new-image.tid index 1e46ebcdb..372933e90 100644 --- a/core/ui/Actions/new-image.tid +++ b/core/ui/Actions/new-image.tid @@ -6,5 +6,5 @@ description: create a new image tiddler image/$(imageType)$ \end <$vars imageType={{$:/config/NewImageType}}> -<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!tags}}/> +<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>>/> </$vars> diff --git a/core/ui/Actions/new-journal.tid b/core/ui/Actions/new-journal.tid index 5cb7eeade..4c5082f78 100644 --- a/core/ui/Actions/new-journal.tid +++ b/core/ui/Actions/new-journal.tid @@ -2,7 +2,7 @@ title: $:/core/ui/Actions/new-journal tags: $:/tags/Actions description: create a new journal tiddler -<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}> +<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} journalText={{$:/config/NewJournal/Text}}> <$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>"""> <$reveal type="nomatch" state=<<journalTitle>> text=""> <$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/> diff --git a/core/ui/Actions/new-tiddler.tid b/core/ui/Actions/new-tiddler.tid index e176f0ab3..272b61007 100644 --- a/core/ui/Actions/new-tiddler.tid +++ b/core/ui/Actions/new-tiddler.tid @@ -2,4 +2,4 @@ title: $:/core/ui/Actions/new-tiddler tags: $:/tags/Actions description: create a new empty tiddler -<$action-sendmessage $message="tm-new-tiddler" tags={{$:/config/NewTiddler/Tags!!tags}}/> +<$action-sendmessage $message="tm-new-tiddler"/> diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 72a1ca9f3..4a4379e82 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -22,10 +22,9 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag="textarea" tiddler="$:/DefaultTiddlers" class="tc-edit-texteditor"/><br>//<<lingo DefaultTiddlers/BottomHint>>// | |<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | -|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |{{$:/config/NewTiddler/Tags||$:/core/ui/EditTemplate/tags}} | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | -|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |{{$:/config/NewJournal/Tags||$:/core/ui/EditTemplate/tags}} | -|<<lingo Autofocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | +|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Tags" default="" tag="input"/> | +|<<lingo AutoFocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | |<<lingo Tags/Prompt>> |<<show-filter-count "[tags[]sort[title]]">> | diff --git a/core/ui/ViewToolbar/new-here.tid b/core/ui/ViewToolbar/new-here.tid index 87f73e267..7b3f96c32 100644 --- a/core/ui/ViewToolbar/new-here.tid +++ b/core/ui/ViewToolbar/new-here.tid @@ -5,7 +5,7 @@ description: {{$:/language/Buttons/NewHere/Hint}} \whitespace trim \define newHereActions() -<$set name="tags" filter="[<currentTiddler>addsuffix[ ]addsuffix{$:/config/NewTiddler/Tags!!tags}]"> +<$set name="tags" filter="[<currentTiddler>]"> <$action-sendmessage $message="tm-new-tiddler" tags=<<tags>>/> </$set> \end @@ -21,4 +21,4 @@ description: {{$:/language/Buttons/NewHere/Hint}} </$list> </$button> \end -<<newHereButton>> +<<newHereButton>> \ No newline at end of file diff --git a/core/ui/ViewToolbar/new-journal-here.tid b/core/ui/ViewToolbar/new-journal-here.tid index b540185ca..e41fd4063 100644 --- a/core/ui/ViewToolbar/new-journal-here.tid +++ b/core/ui/ViewToolbar/new-journal-here.tid @@ -23,9 +23,9 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}} </$button> \end <$set name="journalTitleTemplate" value={{$:/config/NewJournal/Title}}> -<$set name="journalTags" value={{$:/config/NewJournal/Tags!!tags}}> +<$set name="journalTags" value={{$:/config/NewJournal/Tags}}> <$set name="currentTiddlerTag" value=<<currentTiddler>>> <<journalButton>> </$set> </$set> -</$set> +</$set> \ No newline at end of file From 4cf96e7339b3b7d8e84a5b73d9871cdad50c5a84 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 13 Oct 2019 11:19:44 +0200 Subject: [PATCH 0374/2376] Revert "Fix: make tag-picker "add-tag" button more consistent (#4199)" (#4311) This reverts commit 74172b35ceae84f254e20d6d7ec4dff2cca692b1. --- core/ui/EditTemplate/tags.tid | 10 +++++++++- core/wiki/macros/tag-picker.tid | 6 ++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index 0bc581592..d368ce491 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -25,6 +25,14 @@ color:$(foregroundColor)$; <$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon="""$icon$"""/> \end +\define tag-picker-actions() +<$action-listops + $tiddler=<<currentTiddler>> + $field="tags" + $subfilter="[<tag>] [all[current]tags[]]" +/> +\end + <div class="tc-edit-tags"> <$fieldmangler> <$list filter="[all[current]tags[]sort[title]]" storyview="pop"> @@ -32,6 +40,6 @@ color:$(foregroundColor)$; </$list> </$fieldmangler> <$set name="tabIndex" value={{$:/config/EditTabIndex}}> -<$macrocall $name="tag-picker"/> +<$macrocall $name="tag-picker" actions=<<tag-picker-actions>>/> </$set> </div> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 952aaf0c5..8d58748f2 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -14,7 +14,8 @@ $(actions)$ </$button> \end -\define tag-picker() +\define tag-picker(actions) +<$set name="actions" value="""$actions$"""> <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> @@ -23,7 +24,7 @@ $(actions)$ </span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> <$set name="tag" value={{$:/temp/NewTagName}}> <$button set="$:/temp/NewTagName" setTo="" class=""> -<<add-tag-actions>> +$actions$ <$action-deletetiddler $tiddler="$:/temp/NewTagName"/> {{$:/language/EditTemplate/Tags/Add/Button}} </$button> @@ -45,4 +46,5 @@ $(actions)$ </div> </$reveal> </div> +</$set> \end From 9395d7567179c436d0e8ac26fc976d717eae7f50 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 13 Oct 2019 15:35:36 +0100 Subject: [PATCH 0375/2376] Fix sizes of SVG icons in documentation Fixes #4153 --- .../tw5.com/tiddlers/concepts/ColourPalettes.tid | 2 +- editions/tw5.com/tiddlers/concepts/InfoPanel.tid | 2 +- editions/tw5.com/tiddlers/concepts/Modules.tid | 2 +- editions/tw5.com/tiddlers/concepts/PermaLinks.tid | 4 ++-- editions/tw5.com/tiddlers/features/AutoSave.tid | 4 ++-- .../tiddlers/features/Importing Tiddlers.tid | 2 +- editions/tw5.com/tiddlers/features/SafeMode.tid | 2 +- .../tiddlers/features/Searching in TiddlyWiki.tid | 2 +- .../Adding_a_table_of_contents_to_the_sidebar.tid | 4 ++-- .../howtos/How to create keyboard shortcuts.tid | 2 +- .../tiddlers/howtos/How to export tiddlers.tid | 8 ++++---- ... put the last modification date in a banner.tid | 2 +- editions/tw5.com/tiddlers/howtos/Insert link.tid | 2 +- .../tw5.com/tiddlers/howtos/Insert picture.tid | 2 +- .../tw5.com/tiddlers/howtos/KeyboardShortcuts.tid | 2 +- editions/tw5.com/tiddlers/howtos/More actions.tid | 2 +- .../howtos/Setting a page background image.tid | 2 +- editions/tw5.com/tiddlers/howtos/Tagging.tid | 4 ++-- editions/tw5.com/tiddlers/howtos/Upgrading.tid | 2 +- editions/tw5.com/tiddlers/howtos/Using Excise.tid | 4 ++-- editions/tw5.com/tiddlers/howtos/Using Stamp.tid | 12 ++++++------ .../tw5.com/tiddlers/howtos/Using Stylesheets.tid | 2 +- .../tw5.com/tiddlers/mechanisms/AlertMechanism.tid | 2 +- .../nodejs/Installing TiddlyWiki on Node.js.tid | 2 +- ...Installing a plugin from the plugin library.tid | 8 ++++---- .../plugins/Manually installing a plugin.tid | 4 ++-- .../tiddlers/plugins/Uninstalling a plugin.tid | 6 +++--- .../tiddlers/saving/Emergency Tiddler Export.tid | 2 +- editions/tw5.com/tiddlers/saving/Encryption.tid | 6 +++--- .../tw5.com/tiddlers/saving/Saving on Android.tid | 4 ++-- .../tiddlers/saving/Saving on TiddlySpot.tid | 4 ++-- .../tiddlers/saving/Saving on a PHP Server.tid | 2 +- .../tiddlers/saving/Saving on iPad_iPhone.tid | 6 +++--- .../saving/Saving with TiddlyFox on Android.tid | 4 ++-- .../tiddlers/saving/Saving with TiddlyFox.tid | 4 ++-- .../tiddlers/saving/Saving with TiddlyIE.tid | 4 ++-- .../Saving with the HTML5 fallback saver.tid | 4 ++-- editions/tw5.com/tiddlers/system/doc-macros.tid | 2 ++ editions/tw5.com/tiddlers/system/doc-styles.tid | 6 ++++++ .../tiddlers/wikitext/Block Quotes in WikiText.tid | 2 +- .../tiddlers/wikitext/Code Blocks in WikiText.tid | 2 +- .../tiddlers/wikitext/Formatting in WikiText.tid | 14 +++++++------- .../tiddlers/wikitext/Images in WikiText.tid | 2 +- .../tiddlers/wikitext/Linking in WikiText.tid | 2 +- .../tiddlers/wikitext/Lists in WikiText.tid | 4 ++-- .../Creating and editing tiddlers.tid | 12 ++++++------ .../workingwithtw/Creating journal tiddlers.tid | 6 +++--- .../Navigating between open tiddlers.tid | 2 +- .../tw5.com/tiddlers/workingwithtw/Performance.tid | 2 +- .../Sharing your tiddlers with others.tid | 6 +++--- 50 files changed, 101 insertions(+), 93 deletions(-) diff --git a/editions/tw5.com/tiddlers/concepts/ColourPalettes.tid b/editions/tw5.com/tiddlers/concepts/ColourPalettes.tid index 75faa41e2..ad1ab780f 100644 --- a/editions/tw5.com/tiddlers/concepts/ColourPalettes.tid +++ b/editions/tw5.com/tiddlers/concepts/ColourPalettes.tid @@ -12,7 +12,7 @@ table-border: #ccc ... ``` -Several palettes form part of the core. The system tiddler [[$:/palette]] always contains the title of the currently selected palette tiddler. You can change a palette using the {{$:/core/images/palette}} ''palette'' button, found on the "Tools" tab in the sidebar. +Several palettes form part of the core. The system tiddler [[$:/palette]] always contains the title of the currently selected palette tiddler. You can change a palette using the <<.icon $:/core/images/palette>> ''palette'' button, found on the "Tools" tab in the sidebar. To retrieve the value of a named colour from the current palette, e.g. for use in a stylesheet tiddler, use the <<.mlink colour>> macro: diff --git a/editions/tw5.com/tiddlers/concepts/InfoPanel.tid b/editions/tw5.com/tiddlers/concepts/InfoPanel.tid index 21b21ae74..8c422a5c5 100644 --- a/editions/tw5.com/tiddlers/concepts/InfoPanel.tid +++ b/editions/tw5.com/tiddlers/concepts/InfoPanel.tid @@ -4,7 +4,7 @@ tags: Features title: InfoPanel type: text/vnd.tiddlywiki -Each tiddler has a panel of additional information. To reveal it, click the {{$:/core/images/down-arrow}} button in the tiddler's toolbar and then choose {{$:/core/images/info-button}} ''info'' from the dropdown list. +Each tiddler has a panel of additional information. To reveal it, click the <<.icon $:/core/images/down-arrow>> button in the tiddler's toolbar and then choose <<.icon $:/core/images/info-button>> ''info'' from the dropdown list. The info panel has the following tabs: diff --git a/editions/tw5.com/tiddlers/concepts/Modules.tid b/editions/tw5.com/tiddlers/concepts/Modules.tid index 30630b66f..189d2ae24 100644 --- a/editions/tw5.com/tiddlers/concepts/Modules.tid +++ b/editions/tw5.com/tiddlers/concepts/Modules.tid @@ -6,4 +6,4 @@ type: text/vnd.tiddlywiki A //module// in TiddlyWiki5 is a tiddler containing executable JavaScript, of the type `application/javascript` and with the field `module-type` set to the ModuleType of the module. -See [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}} > ''Info'' > ''Advanced'' > ''Loaded Modules'' for a list of currently loaded modules. +See [[control panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>> > ''Info'' > ''Advanced'' > ''Loaded Modules'' for a list of currently loaded modules. diff --git a/editions/tw5.com/tiddlers/concepts/PermaLinks.tid b/editions/tw5.com/tiddlers/concepts/PermaLinks.tid index 3aeca187e..5127228d6 100644 --- a/editions/tw5.com/tiddlers/concepts/PermaLinks.tid +++ b/editions/tw5.com/tiddlers/concepts/PermaLinks.tid @@ -8,7 +8,7 @@ Permalinks allow direct links to individual tiddlers within a TiddlyWiki. ! Simple Permalinks -The simplest form of permalink ({{$:/core/images/permalink-button}}) is a single target tiddler title appended to the base URL with `#`: +The simplest form of permalink (<<.icon $:/core/images/permalink-button>>) is a single target tiddler title appended to the base URL with `#`: https://tiddlywiki.com/#HelloThere @@ -42,7 +42,7 @@ Both the target tiddler title and the story filter should be URL encoded (but no ! Permalink Behaviour -Two important aspects of TiddlyWiki's behaviour with permalinks can be controlled via options in the [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}} ''Settings'' tab: +Two important aspects of TiddlyWiki's behaviour with permalinks can be controlled via options in the [[control panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>> ''Settings'' tab: * Whether to automatically update the address bar at each navigation, and if so whether to include the story sequence as well as the target tiddler * Whether the updates to the address bar should affect browser history. The default is ''no''; when switched to ''yes'' you can rewind navigation between tiddlers using the browser back and forward buttons diff --git a/editions/tw5.com/tiddlers/features/AutoSave.tid b/editions/tw5.com/tiddlers/features/AutoSave.tid index c8e766098..17a0ef59c 100644 --- a/editions/tw5.com/tiddlers/features/AutoSave.tid +++ b/editions/tw5.com/tiddlers/features/AutoSave.tid @@ -4,8 +4,8 @@ tags: Features title: AutoSave type: text/vnd.tiddlywiki -If there is a SaverModule available that supports it, TiddlyWiki will automatically trigger a save of the current document on clicking {{$:/core/images/done-button}} ''ok'' or {{$:/core/images/delete-button}} ''delete'' when editing a tiddler. +If there is a SaverModule available that supports it, TiddlyWiki will automatically trigger a save of the current document on clicking <<.icon $:/core/images/done-button>> ''ok'' or <<.icon $:/core/images/delete-button>> ''delete'' when editing a tiddler. You should see a yellow notification at the top right of the window to confirm that an automatic save has taken place. -Automatic saving can be enabled or disabled through the ''Settings'' tab of the [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}}. Behind the scenes, it is controlled through the configuration tiddler [[$:/config/AutoSave]], which must have the value ''yes'' to enable automatic saving. +Automatic saving can be enabled or disabled through the ''Settings'' tab of the [[control panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>>. Behind the scenes, it is controlled through the configuration tiddler [[$:/config/AutoSave]], which must have the value ''yes'' to enable automatic saving. diff --git a/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid b/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid index a03082a9f..2e03b4cd1 100644 --- a/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid +++ b/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid @@ -10,7 +10,7 @@ You can import tiddlers into a ~TiddlyWiki from external files or directly from There are several ways to import content from external files: -* Use the {{$:/core/images/import-button}} ''import'' button (under the ''Tools'' tab in the sidebar) to select a local file +* Use the <<.icon $:/core/images/import-button>> ''import'' button (under the ''Tools'' tab in the sidebar) to select a local file * Drag and drop files from Windows Explorer or OS X Finder etc. into the TiddlyWiki browser window * Paste content directly from the clipboard using the menu or keyboard shortcut (<kbd>ctrl-V</kbd> or <kbd>cmd-V</kbd>) ** Currently supported in Chrome, Firefox and Edge (but not Internet Explorer) diff --git a/editions/tw5.com/tiddlers/features/SafeMode.tid b/editions/tw5.com/tiddlers/features/SafeMode.tid index 03fa8f00d..66f55da11 100644 --- a/editions/tw5.com/tiddlers/features/SafeMode.tid +++ b/editions/tw5.com/tiddlers/features/SafeMode.tid @@ -18,7 +18,7 @@ https://tiddlywiki.com/#:safe Safe mode triggers two changes: -* All plugins are temporarily disabled. You can use the [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}} to disable individual plugins +* All plugins are temporarily disabled. You can use the [[control panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>> to disable individual plugins * Any tiddlers that override shadow tiddlers are renamed to give them the prefix `SAFE: `, thus restoring the underlying shadow tiddler * Certain configuration options are ignored, and the default settings used instead: ** WikiParserRuleConfiguration diff --git a/editions/tw5.com/tiddlers/features/Searching in TiddlyWiki.tid b/editions/tw5.com/tiddlers/features/Searching in TiddlyWiki.tid index 98cbf2eb1..2cd7a8bc6 100644 --- a/editions/tw5.com/tiddlers/features/Searching in TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/features/Searching in TiddlyWiki.tid @@ -14,7 +14,7 @@ Typing text into the search box in the sidebar will turn up a list of all the ti ! Advanced searching -Clicking on the magnifying glass icon {{$:/core/images/advanced-search-button}} to the right of the search box will open [[$:/AdvancedSearch]]. This tiddler contains four tabs: +Clicking on the magnifying glass icon <<.icon $:/core/images/advanced-search-button>> to the right of the search box will open [[$:/AdvancedSearch]]. This tiddler contains four tabs: * The ''standard'' tab contains another instance of the search box found in the sidebar * The ''system'' tab allows you to limit your search to system tiddlers diff --git a/editions/tw5.com/tiddlers/howtos/Adding_a_table_of_contents_to_the_sidebar.tid b/editions/tw5.com/tiddlers/howtos/Adding_a_table_of_contents_to_the_sidebar.tid index 5587a8854..4c43d22ce 100644 --- a/editions/tw5.com/tiddlers/howtos/Adding_a_table_of_contents_to_the_sidebar.tid +++ b/editions/tw5.com/tiddlers/howtos/Adding_a_table_of_contents_to_the_sidebar.tid @@ -19,7 +19,7 @@ A customisable [[table of contents|Table-of-Contents Macros]] can be added to th # Add a ''caption'' field with the text ''Contents'' # Add a ''list-after'' field with the text ''~$:/core/ui/SideBar/Open'' -Add entries to the table of contents by creating tiddlers tagged ''~TableOfContents''. An easy way is to choose {{$:/core/images/new-here-button}} ''new here'' from the tiddler toolbar of the ''~TableOfContents'' tiddler. -(if you don't see the "new here" button, click on the down arrow {{$:/core/images/down-arrow}} to see more menu options.) +Add entries to the table of contents by creating tiddlers tagged ''~TableOfContents''. An easy way is to choose <<.icon $:/core/images/new-here-button>> ''new here'' from the tiddler toolbar of the ''~TableOfContents'' tiddler. +(if you don't see the "new here" button, click on the down arrow <<.icon $:/core/images/down-arrow>> to see more menu options.) To create child tiddlers (tiddlers that come below other tiddlers), tag them with the name of the parent tiddler. diff --git a/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid b/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid index cbcbd3ba8..3b82a0a6a 100644 --- a/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid +++ b/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid @@ -14,7 +14,7 @@ A tiddler with the <<.def prefix>> `$:/config/ShortcutInfo/` and a ''unique suff In the [[Keyboard Shortcuts Tab|$:/core/ui/ControlPanel/KeyboardShortcuts]] the ''key combination'' that should trigger the shortcut can be configured: -> Look for the ''unique suffix'' defined for the new shortcut and click the <$button class="tc-btn-invisible">{{$:/core/images/edit-button}}<$action-sendmessage $message="tm-notify" $param="$:/core/images/edit-button"/></$button> button to open a popup that detects ''key combinations'' and shows the detected combination in its input field +> Look for the ''unique suffix'' defined for the new shortcut and click the <$button class="tc-btn-invisible"><<.icon $:/core/images/edit-button>><$action-sendmessage $message="tm-notify" $param="$:/core/images/edit-button"/></$button> button to open a popup that detects ''key combinations'' and shows the detected combination in its input field >The ''add shortcut'' assigns the key-combination to the shortcut diff --git a/editions/tw5.com/tiddlers/howtos/How to export tiddlers.tid b/editions/tw5.com/tiddlers/howtos/How to export tiddlers.tid index de66f05e9..c1c30b880 100644 --- a/editions/tw5.com/tiddlers/howtos/How to export tiddlers.tid +++ b/editions/tw5.com/tiddlers/howtos/How to export tiddlers.tid @@ -6,17 +6,17 @@ type: text/vnd.tiddlywiki ! Selecting All tiddlers for export -To export ''all'' tiddlers click on the "Tools" tab of the Sidebar. Find and click the {{$:/core/images/export-button}} ''export all'' button. A pop-up menu will offer you the chance to export tiddlers in multiple formats. +To export ''all'' tiddlers click on the "Tools" tab of the Sidebar. Find and click the <<.icon $:/core/images/export-button>> ''export all'' button. A pop-up menu will offer you the chance to export tiddlers in multiple formats. ! Exporting a tiddler -If you want to export a particular tiddler, first navigate to that tiddler. Then click on the {{$:/core/images/down-arrow}} ''more'' button that appears above the tiddler. From the list that appears select {{$:/core/images/export-button}} ''export tiddler''. A pop-up menu will offer you the chance to export the tiddler in multiple formats. +If you want to export a particular tiddler, first navigate to that tiddler. Then click on the <<.icon $:/core/images/down-arrow>> ''more'' button that appears above the tiddler. From the list that appears select <<.icon $:/core/images/export-button>> ''export tiddler''. A pop-up menu will offer you the chance to export the tiddler in multiple formats. ! Exporting tiddlers matching a criteria (filter) -To export a selection of tiddlers, click the little magnifying glass {{$:/core/images/advanced-search-button}} next to the search area on the sidebar. This will open the [[Advanced Search|$:/AdvancedSearch]] tiddler. Click on the "Filter" tab of the Advanced Search tiddler. Only the [[Filter|Filters]] tab will allow you to export a selection of tiddlers. [[Filters]] follow a particular syntax. Click on this [[Filters|Filters]] link to learn about how to make filters. +To export a selection of tiddlers, click the little magnifying glass <<.icon $:/core/images/advanced-search-button>> next to the search area on the sidebar. This will open the [[Advanced Search|$:/AdvancedSearch]] tiddler. Click on the "Filter" tab of the Advanced Search tiddler. Only the [[Filter|Filters]] tab will allow you to export a selection of tiddlers. [[Filters]] follow a particular syntax. Click on this [[Filters|Filters]] link to learn about how to make filters. -Once you have written a filter, a list of tiddlers matching the filter will appear. Now you can click on the {{$:/core/images/export-button}} ''export tiddler'' button to the right of the filter input field. A pop-up menu will offer you the chance to export tiddlers in multiple formats. +Once you have written a filter, a list of tiddlers matching the filter will appear. Now you can click on the <<.icon $:/core/images/export-button>> ''export tiddler'' button to the right of the filter input field. A pop-up menu will offer you the chance to export tiddlers in multiple formats. ! Export formats diff --git a/editions/tw5.com/tiddlers/howtos/How to put the last modification date in a banner.tid b/editions/tw5.com/tiddlers/howtos/How to put the last modification date in a banner.tid index ba1d780be..25a5a3128 100644 --- a/editions/tw5.com/tiddlers/howtos/How to put the last modification date in a banner.tid +++ b/editions/tw5.com/tiddlers/howtos/How to put the last modification date in a banner.tid @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki Here's how to display the last modification date of a wiki in a banner in the corner of the window: # [[Install the plugin|Installing a plugin from the plugin library]] <<.def "Corner ribbon">> in your ~TiddlyWiki -# Save ({{$:/core/images/save-button}}) and reload ({{$:/core/images/refresh-button}}) your wiki +# Save (<<.icon $:/core/images/save-button>>) and reload (<<.icon $:/core/images/refresh-button>>) your wiki # Create a new tiddler called [[$:/_MyRibbon]] tagged [[$:/tags/PageControls]] and containing:<div> ``` diff --git a/editions/tw5.com/tiddlers/howtos/Insert link.tid b/editions/tw5.com/tiddlers/howtos/Insert link.tid index 91ef2dc17..d5e8ad5be 100644 --- a/editions/tw5.com/tiddlers/howtos/Insert link.tid +++ b/editions/tw5.com/tiddlers/howtos/Insert link.tid @@ -5,6 +5,6 @@ title: Insert link This will give you a dialog to search for and pick existing tiddlers in the wiki. When you pick a tiddler it will be inserted as a WikiText link where the cursor is in the text field. -Pressing {{$:/core/images/link}} will give you `[[Some link]]` +Pressing <<.icon $:/core/images/link>> will give you `[[Some link]]` It wil ''not'' insert: external web links or [[picture|Insert picture]] links. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/howtos/Insert picture.tid b/editions/tw5.com/tiddlers/howtos/Insert picture.tid index a9c07f56e..7a0b46e48 100644 --- a/editions/tw5.com/tiddlers/howtos/Insert picture.tid +++ b/editions/tw5.com/tiddlers/howtos/Insert picture.tid @@ -6,4 +6,4 @@ title: Insert picture This will give you a dialog to search for and pick existing image tiddlers in the wiki. When you pick a tiddler it will be inserted as a WikiText image link where the cursor is in the text field. -Pressing {{$:/core/images/picture}} will give you `[img[$:/favicon.ico]]` \ No newline at end of file +Pressing <<.icon $:/core/images/picture>> will give you `[img[$:/favicon.ico]]` \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid b/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid index f8deba7f7..9ecece61d 100644 --- a/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid +++ b/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid @@ -24,7 +24,7 @@ Keyboard shortcuts are available for common editing operations within the Text E * Creating a new journal (defaults to <kbd>alt-J</kbd> ) * Creating a new image (defaults to <kbd>alt-I</kbd> ) -The current shortcuts can be inspected and customised in the "Keyboard Shortcuts" tab of the [[Control Panel|$:/ControlPanel]] {{$:/core/images/options-button}}. +The current shortcuts can be inspected and customised in the "Keyboard Shortcuts" tab of the [[Control Panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>>. !! Special Keys diff --git a/editions/tw5.com/tiddlers/howtos/More actions.tid b/editions/tw5.com/tiddlers/howtos/More actions.tid index 102c87711..edb3fb7d1 100644 --- a/editions/tw5.com/tiddlers/howtos/More actions.tid +++ b/editions/tw5.com/tiddlers/howtos/More actions.tid @@ -3,4 +3,4 @@ modified: 20160817110101356 tags: [[Editor toolbar]] title: More actions -Pressing {{$:/core/images/down-arrow}} Gives you a dropdown menu with more editing options. \ No newline at end of file +Pressing <<.icon $:/core/images/down-arrow>> Gives you a dropdown menu with more editing options. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/howtos/Setting a page background image.tid b/editions/tw5.com/tiddlers/howtos/Setting a page background image.tid index 47c8c5b6e..d80e9acf4 100644 --- a/editions/tw5.com/tiddlers/howtos/Setting a page background image.tid +++ b/editions/tw5.com/tiddlers/howtos/Setting a page background image.tid @@ -6,7 +6,7 @@ type: text/vnd.tiddlywiki # Import your image as a tiddler (see [[Images in WikiText]]) #* You can also use an [[external image|ExternalImages]] -# Open the [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}} and switch to the ''Appearance''/''Theme Tweaks'' tab +# Open the [[control panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>> and switch to the ''Appearance''/''Theme Tweaks'' tab # Select your image from the dropdown labelled "Page background image" # Set "Page background image attachment" to "Fixed to window" to have the background stay stationary and the content to scroll over the top of it, or "Scroll with tiddlers" to have it move (note that the iPhone/iPad [[doesn't support the fixed setting|http://stackoverflow.com/a/20444219]] for performance reasons) # Set "Page background image size" as follows: diff --git a/editions/tw5.com/tiddlers/howtos/Tagging.tid b/editions/tw5.com/tiddlers/howtos/Tagging.tid index 46b42e3e8..a023c3222 100644 --- a/editions/tw5.com/tiddlers/howtos/Tagging.tid +++ b/editions/tw5.com/tiddlers/howtos/Tagging.tid @@ -26,10 +26,10 @@ There are two more things you can do with tags: ! Set a tag's colour and icon -You can use the {{$:/core/images/tag-button}} [[tag manager|$:/TagManager]], found on the ''Tags'' tab under ''More'' in the sidebar, to change the colour of a tag's pill or add an icon to the pill. +You can use the <<.icon $:/core/images/tag-button>> [[tag manager|$:/TagManager]], found on the ''Tags'' tab under ''More'' in the sidebar, to change the colour of a tag's pill or add an icon to the pill. * To change the colour, click the button in the ''Colour'' column to select from a colour picker. Alternatively, click the icon in the ''Info'' column, then type a [[CSS]] colour value in the ''Colour'' field -* To change the icon, click the {{$:/core/images/down-arrow}} button in the ''Icon'' column and choose from the list of available icons +* To change the icon, click the <<.icon $:/core/images/down-arrow>> button in the ''Icon'' column and choose from the list of available icons ! Change the order in which tags are listed diff --git a/editions/tw5.com/tiddlers/howtos/Upgrading.tid b/editions/tw5.com/tiddlers/howtos/Upgrading.tid index 45ba13fee..c872ea37e 100644 --- a/editions/tw5.com/tiddlers/howtos/Upgrading.tid +++ b/editions/tw5.com/tiddlers/howtos/Upgrading.tid @@ -27,7 +27,7 @@ This process will work on most desktop browsers. Note that none of your personal #* If the file is encrypted you will be prompted for the password # Review the list of tiddlers that will be upgraded # Click ''Upgrade'' -# Save changes to save the new version ({{$:/core/images/save-button}}) +# Save changes to save the new version (<<.icon $:/core/images/save-button>>) This will download a file called ''upgrade.html'' to your computer. This file is the upgrade of your old file. You may need to open the location where ''upgrade.html'' was downloaded, rename ''upgrade.html'' with the name of the old file you are upgrading, and replace the old file by moving the new file in its place. diff --git a/editions/tw5.com/tiddlers/howtos/Using Excise.tid b/editions/tw5.com/tiddlers/howtos/Using Excise.tid index f0c13125d..ef3be9a96 100644 --- a/editions/tw5.com/tiddlers/howtos/Using Excise.tid +++ b/editions/tw5.com/tiddlers/howtos/Using Excise.tid @@ -6,11 +6,11 @@ type: text/vnd.tiddlywiki ! Excise text -From the EditorToolbar you can export selected text to a new tiddler and insert a [[link|Linking in WikiText]] [[Transclusion]] or [[macro|Macros]] in its place. Click ''Excise text'' ({{$:/core/images/excise}}), input name of the new tiddler, and choose excise method. +From the EditorToolbar you can export selected text to a new tiddler and insert a [[link|Linking in WikiText]] [[Transclusion]] or [[macro|Macros]] in its place. Click ''Excise text'' (<<.icon $:/core/images/excise>>), input name of the new tiddler, and choose excise method. !! How to excise text # Highlight the relevant piece of text -#Click ''Excise text'' ({{$:/core/images/excise}}) +#Click ''Excise text'' (<<.icon $:/core/images/excise>>) # Give the new tiddler a title. # Chosse if the new tiddler will be tagged with the title of the current tiddler''*''. # Choose replacing method. [[link|Linking in WikiText]] [[Transclusion]] or [[macro|Macros]]. diff --git a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid index 07de4d7a0..ce639e087 100644 --- a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid +++ b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid @@ -5,24 +5,24 @@ title: Using Stamp type: text/vnd.tiddlywiki ! Insert snippets -You can insert preconfigured snippets of text to use stamp from toolbar. Click ''stamp'' ({{$:/core/images/stamp}}) and just select a snippet. +You can insert preconfigured snippets of text to use stamp from toolbar. Click ''stamp'' (<<.icon $:/core/images/stamp>>) and just select a snippet. ! Create a snippet -# Click ''stamp'' ({{$:/core/images/stamp}}) +# Click ''stamp'' (<<.icon $:/core/images/stamp>>) # Create a snippet tiddler through the "//Add your own//" menu entry # Type some text as snippet for the tiddler, add a caption for the name as shown in the menu -# Click the {{$:/core/images/done-button}} ''ok'' button +# Click the <<.icon $:/core/images/done-button>> ''ok'' button -<<.tip """''Tip:'' You can also create a snippet tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar, and add tag ''~$:/tags/TextEditor/Snippet''""">> +<<.tip """''Tip:'' You can also create a snippet tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar, and add tag ''~$:/tags/TextEditor/Snippet''""">> !!<<.from-version "5.1.20">> Adding a prefix and/or suffix to a selection -# Click ''stamp'' ({{$:/core/images/stamp}}) +# Click ''stamp'' (<<.icon $:/core/images/stamp>>) # Create a snippet tiddler through the "//Add your own//" menu entry # Add a caption for the name as shown in the menu # Create a tiddler with the same title but add the suffix `/prefix` # Insert the prefix in its text field # Create a tiddler with the same title but add the suffix `/suffix` # Insert the suffix in its text field -# Click the {{$:/core/images/done-button}} ''ok'' button +# Click the <<.icon $:/core/images/done-button>> ''ok'' button diff --git a/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid b/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid index d9cf73041..2a8429c2b 100644 --- a/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid +++ b/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid @@ -18,7 +18,7 @@ The first steps to changing the appearance of ~TiddlyWiki are to choose and appl * One of the available themes: <span class="tc-btn-standard"> {{$:/core/ui/Buttons/theme}} </span> * Modify the colour palette: <span class="tc-btn-standard"> {{$:/core/ui/Buttons/palette}} </span> -* Experiment with the <$button actions=<<openCpTheme>> >{{$:/core/images/options-button}} ControlPanel</$button> +* Experiment with the <$button actions=<<openCpTheme>> ><<.icon $:/core/images/options-button>> ControlPanel</$button> ! Work with Stylesheets diff --git a/editions/tw5.com/tiddlers/mechanisms/AlertMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/AlertMechanism.tid index ff54d1d0d..a8c22dbbf 100644 --- a/editions/tw5.com/tiddlers/mechanisms/AlertMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/AlertMechanism.tid @@ -4,7 +4,7 @@ tags: Mechanisms Features title: AlertMechanism type: text/vnd.tiddlywiki -Alerts are displayed as yellow boxes overlaying the main TiddlyWiki window. Each one corresponds to a tiddler with the tag [[$:/tags/Alert]]. Clicking the {{$:/core/images/delete-button}} delete icon on an alert deletes the corresponding tiddler. +Alerts are displayed as yellow boxes overlaying the main TiddlyWiki window. Each one corresponds to a tiddler with the tag [[$:/tags/Alert]]. Clicking the <<.icon $:/core/images/delete-button>> delete icon on an alert deletes the corresponding tiddler. Here's a demo <$fieldmangler tiddler="SampleAlert"><$set name="currentTiddler" value="SampleAlert"><$button message="tm-add-tag" param="$:/tags/Alert">alert</$button></$set></$fieldmangler>. diff --git a/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid index 47eb9c603..145725966 100644 --- a/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid @@ -24,7 +24,7 @@ type: text/vnd.tiddlywiki ## Visit http://127.0.0.1:8080/ in your browser ## Try editing and creating tiddlers # Optionally, make an offline copy: -#* click the {{$:/core/images/save-button}} ''save changes'' button in the sidebar, ''OR'' +#* click the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar, ''OR'' #* `tiddlywiki mynewwiki --build index` The `-g` flag causes TiddlyWiki to be installed globally. Without it, TiddlyWiki will only be available in the directory where you installed it. diff --git a/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid b/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid index d4e2fef3b..18fe09d76 100644 --- a/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid +++ b/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid @@ -10,14 +10,14 @@ Follow these instructions when using TiddlyWiki as a standalone HTML file: # Create a backup of your current TiddlyWiki HTML file ([[just in case|The First Rule of Using TiddlyWiki]]) # Open your TiddlyWiki in a browser -# Open the [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}}, click on the ''Plugins'' tab and then the {{$:/core/images/download-button}} ''Get more plugins'' button -# Click {{$:/core/images/chevron-right}} ''open plugin library'' to open the official plugin library +# Open the [[control panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>>, click on the ''Plugins'' tab and then the <<.icon $:/core/images/download-button>> ''Get more plugins'' button +# Click <<.icon $:/core/images/chevron-right>> ''open plugin library'' to open the official plugin library # When the library listing is loaded: ## Use the tab to select between ''plugins'', ''themes'' and ''languages'' ## Use the ''search'' box to search the plugin details # Click the ''install'' button to install a plugin -# Save your TiddlyWiki {{$:/core/images/save-button}} -# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completes installation of the plugin {{$:/core/images/refresh-button}} +# Save your TiddlyWiki <<.icon $:/core/images/save-button>> +# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completes installation of the plugin <<.icon $:/core/images/refresh-button>> #* <<.from-version "5.1.22">> It is no longer necessary to refresh TiddlyWiki when deleting plugins that support dynamic loading. See PluginMechanism for more details # The plugin should now be available for use diff --git a/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid b/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid index 426615b3c..5d58cad3a 100644 --- a/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid +++ b/editions/tw5.com/tiddlers/plugins/Manually installing a plugin.tid @@ -8,7 +8,7 @@ type: text/vnd.tiddlywiki # Open your TiddlyWiki in a browser # In another browser window, find a link to the plugin, e.g. [[$:/plugins/tiddlywiki/example]]. You will typically find these links on the home page of the plugin (for example, https://tiddlywiki.com/plugins/tiddlywiki/katex/) # Drag the link [[$:/plugins/tiddlywiki/example]] to the browser window containing your TiddlyWiki -# Save your TiddlyWiki ({{$:/core/images/save-button}}) -# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completes installation of the plugin {{$:/core/images/refresh-button}} +# Save your TiddlyWiki (<<.icon $:/core/images/save-button>>) +# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completes installation of the plugin <<.icon $:/core/images/refresh-button>> #* <<.from-version "5.1.22">> It is no longer necessary to refresh TiddlyWiki when deleting plugins that support dynamic loading. See PluginMechanism for more details # The plugin should now be available for use \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid b/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid index 096183bfb..81bf95739 100644 --- a/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid +++ b/editions/tw5.com/tiddlers/plugins/Uninstalling a plugin.tid @@ -11,9 +11,9 @@ Follow these instructions when using TiddlyWiki as a standalone HTML file: # Create a backup of your current TiddlyWiki HTML file ([[just in case|The First Rule of Using TiddlyWiki]]) # Open the [[control panel|$:/ControlPanel]] and go to the ''Plugins'' tab # Click on the plugin you want to delete to open it as a standalone tiddler -# Click the {{$:/core/images/down-arrow}} ''more'' button and {{$:/core/images/delete-button}} ''delete'' the tiddler -# Save your TiddlyWiki {{$:/core/images/save-button}} -# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completely removes the plugin {{$:/core/images/refresh-button}} +# Click the <<.icon $:/core/images/down-arrow>> ''more'' button and <<.icon $:/core/images/delete-button>> ''delete'' the tiddler +# Save your TiddlyWiki <<.icon $:/core/images/save-button>> +# If a yellow warning bar appears at the top of the window, refresh the window so that TiddlyWiki completely removes the plugin <<.icon $:/core/images/refresh-button>> #* <<.from-version "5.1.22">> It is no longer necessary to refresh TiddlyWiki when deleting plugins that support dynamic loading. See PluginMechanism for more details # The plugin should no longer be active or available diff --git a/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid b/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid index 060fa14c9..15d5478b6 100644 --- a/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid +++ b/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid @@ -21,7 +21,7 @@ This method is useful if, for any reason, you should find your current TiddlyWik ``` * Check the list of tiddlers. * Adjust the number "25" in the filter to make sure you found all your recently modified tiddlers -* Press the bucket with the up arrow [<button class="tc-btn-invisible" disabled>{{$:/core/images/export-button}}</button>] which appears on the right +* Press the bucket with the up arrow [<button class="tc-btn-invisible" disabled><<.icon $:/core/images/export-button>></button>] which appears on the right * A dialogue window will ask for a location to download a file called tiddler.json on your local drive, or depending on browser configuration, just alert you that such a file will be downloaded. Press save. * The `tiddlers.json` file can be imported (tools in sidebar) or drag and drop the file on the top line of the story river of another TW . ** You can (de)select specific tiddlers. diff --git a/editions/tw5.com/tiddlers/saving/Encryption.tid b/editions/tw5.com/tiddlers/saving/Encryption.tid index 65c9abcfc..9b9ba4ee6 100644 --- a/editions/tw5.com/tiddlers/saving/Encryption.tid +++ b/editions/tw5.com/tiddlers/saving/Encryption.tid @@ -7,12 +7,12 @@ type: text/vnd.tiddlywiki When used as a single HTML file, TiddlyWiki5 allows content to be encrypted using the [[Stanford JavaScript Crypto Library]]. # Switch to the ''Tools'' tab in the sidebar and look for the button with a padlock icon -# If the button is labelled {{$:/core/images/unlocked-padlock}} ''set password'' then the current wiki is not encrypted. Clicking the button will prompt for a password that will be used to encrypt subsequent saves -# If the button is labelled {{$:/core/images/locked-padlock}} ''clear password'' then the current wiki is already encrypted. Clicking the button will remove the password so that subsequent saves will be unencrypted +# If the button is labelled <<.icon $:/core/images/unlocked-padlock>> ''set password'' then the current wiki is not encrypted. Clicking the button will prompt for a password that will be used to encrypt subsequent saves +# If the button is labelled <<.icon $:/core/images/locked-padlock>> ''clear password'' then the current wiki is already encrypted. Clicking the button will remove the password so that subsequent saves will be unencrypted # Optionally, open the saved file in a text editor and verify that your data is encrypted # Open the file in your browser. You will be prompted for a password before the content is displayed Note that TiddlyWiki has two other unrelated features concerned with passwords/encryption: -* The ability to set a password when saving to TiddlySpot. This is done in the "Saving" tab of ''control panel'' {{$:/core/images/options-button}}. +* The ability to set a password when saving to TiddlySpot. This is done in the "Saving" tab of ''control panel'' <<.icon $:/core/images/options-button>>. * The ability to use standard HTTP basic authentication with the [[Node.js|TiddlyWiki on Node.js]] server configuration. This is done on the command line with the ServerCommand. Combined with SSL, this gives the same level of transit encryption as you'd get with online services like Google or Dropbox, but there is no encryption of data on disk diff --git a/editions/tw5.com/tiddlers/saving/Saving on Android.tid b/editions/tw5.com/tiddlers/saving/Saving on Android.tid index 6be8d5508..8c6be8ba4 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on Android.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on Android.tid @@ -18,9 +18,9 @@ Instructions for use: # Open AndTidWiki #* Don't use ''Menu''/''new ~TiddlyWiki'' menu option (it only supports the older TiddlyWikiClassic) # Open the file by touching its filename -# Try creating a new tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar. Type some content for the tiddler, and click the {{$:/core/images/done-button}} ''ok'' button +# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar. Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button #* The wiki will be saved, and a confirmation message should appear at the top right of the window -''Note:'' You can save your changes by clicking the {{$:/core/images/save-button}} ''save changes'' button in the sidebar even if you have not clicked the {{$:/core/images/done-button}} ''ok'' button to complete editing a tiddler +''Note:'' You can save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar even if you have not clicked the <<.icon $:/core/images/done-button>> ''ok'' button to complete editing a tiddler //Note that AndTidWiki is published independently of TiddlyWiki// \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid index af1ce8957..9b4b47813 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid @@ -22,8 +22,8 @@ Alternatively, you can upload an existing ~TiddlyWiki5 document from your local # Sign up for a new wiki at http://tiddlyspot.com/, and remember the wiki name and password # Open your locally stored TiddlyWiki document in your browser -# Fill in the TiddlySpot wikiname and password in ''Saving'' tab of the ''control panel'' {{$:/core/images/options-button}} -# Click the {{$:/core/images/save-button}} ''save changes'' button. You should get a confirmation notification at the top right saying ''Saved wiki''. Saving can take several seconds if you're on a slow connection or working with a large wiki. +# Fill in the TiddlySpot wikiname and password in ''Saving'' tab of the ''control panel'' <<.icon $:/core/images/options-button>> +# Click the <<.icon $:/core/images/save-button>> ''save changes'' button. You should get a confirmation notification at the top right saying ''Saved wiki''. Saving can take several seconds if you're on a slow connection or working with a large wiki. # Navigate to your TiddlySpot URL at http://{wikiname}.tiddlyspot.com/ Note that your password is sent unencrypted when using TiddlySpot. From http://faq.tiddlyspot.com/: diff --git a/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid b/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid index e6e78fbfb..7f0cec25d 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid @@ -20,7 +20,7 @@ The built-in `TiddlySpot `saver can also be used to save changes to a simple PHP # Save the file # Using FTP or your web interface, upload ''store.php'' to your server. Make sure that the filename is correct #* If you've uploaded the file correctly you should be able to view it in your browser (eg, http://example.com/store.php) -# In TiddlyWiki, go to the ''Saving'' tab of the ''control panel'' {{$:/core/images/options-button}} and enter the following information: +# In TiddlyWiki, go to the ''Saving'' tab of the ''control panel'' <<.icon $:/core/images/options-button>> and enter the following information: #* Your username as the wiki name #* Your password #* The URL of the ''store.php'' file (//''not'' the URL of the wiki, this must the full URL to the ''store.php'' file//) diff --git a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid index 194e28eea..b04e81929 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid @@ -21,9 +21,9 @@ Instructions for use: # Swipe any file item from the right to see a list of additional "actions" possible for that file # Touch any listed file item or folder to open it - wikis will open in Quine's custom browser # When you have an open TiddlyWiki5: -# Try creating a new tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar -# Type some content for the tiddler, and click the {{$:/core/images/done-button}} ''ok'' button -# Save your changes by clicking the {{$:/core/images/save-button}} ''save changes'' button in the sidebar +# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar +# Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button +# Save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar #* A confirmation message should appear at the top right of the window # Touch "Done" when done editing a wiki diff --git a/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox on Android.tid b/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox on Android.tid index 6b2d3d384..1780fd2bb 100644 --- a/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox on Android.tid +++ b/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox on Android.tid @@ -18,7 +18,7 @@ type: text/vnd.tiddlywiki # When the file has downloaded, click on it within the notification tray or the download manager application # Choose to open the file in Firefox (rather than the default Android viewer) # Click ''OK'' in response to the prompt from TiddlyFox that asks whether to enable saving for this file -# Try creating a new tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar. Type some content for the tiddler, and click the {{$:/core/images/done-button}} ''ok'' button -# Save your changes by clicking the {{$:/core/images/save-button}} ''save changes'' button in the sidebar +# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar. Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button +# Save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar #* Look for the yellow notification ''Saved wiki'' at the top right of the window # Refresh the browser window to verify that your changes have been saved correctly diff --git a/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid b/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid index 90a627c31..092eb29fd 100644 --- a/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid +++ b/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid @@ -22,7 +22,7 @@ If you're using [[Firefox for Android]], see the instructions for [[Saving with #* If you are using TiddlyFox v1.x.x, you will need to click ''OK'' in response to the prompt from TiddlyFox that asks whether to enable saving for this file #* If you are using TiddlyFox v2.x.x you will need to click on the icon of a kitten standing on a blue globe to activate saving. There is no prompt in v2.0.1. #** For TiddlyFox v2.0.1, you can not be using Private Browsing mode nor can you be using "Never Remember History". -# Try creating a new tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar. Type some content for the tiddler, and click the {{$:/core/images/done-button}} ''ok'' button -# Save your changes by clicking the {{$:/core/images/save-button}} ''save changes'' button in the sidebar +# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar. Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button +# Save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar #* Look for the yellow notification ''Saved wiki'' at the top right of the window # Refresh the browser window to verify that your changes have been saved correctly diff --git a/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid b/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid index 3106e6daf..d4e821128 100644 --- a/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid +++ b/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid @@ -17,6 +17,6 @@ type: text/vnd.tiddlywiki # Locate the file you just downloaded #* You may rename it, but be sure to keep the `.html` or `.htm` extension # Open the file in Internet Explorer -# Try creating a new tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar. Type some content for the tiddler, and click the {{$:/core/images/done-button}} ''ok'' button -# Save your changes by clicking the {{$:/core/images/save-button}} ''save changes'' button in the sidebar. Internet Explorer will ask for your consent to save the file locally by presenting a file ''Save As'' dialog. +# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar. Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button +# Save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar. Internet Explorer will ask for your consent to save the file locally by presenting a file ''Save As'' dialog. # Refresh the browser window to verify that your changes have been saved correctly diff --git a/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid b/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid index dae52cdf1..92774cd68 100644 --- a/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid +++ b/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid @@ -17,8 +17,8 @@ This method of saving changes is clunky because it requires manual intervention # Locate the file you just downloaded #* You may rename it, but be sure to keep the `.html` or `.htm` extension # Open the file in your browser -# Try creating a new tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar. Type some content for the tiddler, and click the {{$:/core/images/done-button}} ''ok'' button -# Save your changes by clicking the {{$:/core/images/save-button}} ''save changes'' button in the sidebar +# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar. Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button +# Save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar # Your browser will download a new copy of the wiki incorporating your changes # Locate the newly downloaded file and open it in your browser # Verify that your changes have been saved correctly diff --git a/editions/tw5.com/tiddlers/system/doc-macros.tid b/editions/tw5.com/tiddlers/system/doc-macros.tid index f1c846775..26262d8f9 100644 --- a/editions/tw5.com/tiddlers/system/doc-macros.tid +++ b/editions/tw5.com/tiddlers/system/doc-macros.tid @@ -63,6 +63,8 @@ type: text/vnd.tiddlywiki \define .button(_) <span class="doc-button">{{$:/core/ui/Buttons/$_$!!caption}}</span> +\define .icon(_) <span class="doc-icon">{{$_$}}</span> + \define .tip(_) <div class="doc-icon-block"><div class="doc-block-icon">{{$:/core/images/tip}}</div> $_$</div> \define .warning(_) <div class="doc-icon-block"><div class="doc-block-icon">{{$:/core/images/warning}}</div> $_$</div> diff --git a/editions/tw5.com/tiddlers/system/doc-styles.tid b/editions/tw5.com/tiddlers/system/doc-styles.tid index 101fbe2f6..94e89d5f7 100644 --- a/editions/tw5.com/tiddlers/system/doc-styles.tid +++ b/editions/tw5.com/tiddlers/system/doc-styles.tid @@ -145,6 +145,12 @@ tr.doc-table-subheading { margin-top: 2em; } +.doc-icon svg { + width: 1em; + height: 1em; + vertical-align: middle; +} + .doc-icon-block { border-left: 2px solid <<colour code-border>>; margin-left: 3em; diff --git a/editions/tw5.com/tiddlers/wikitext/Block Quotes in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Block Quotes in WikiText.tid index bdc60b0ed..181779fe9 100644 --- a/editions/tw5.com/tiddlers/wikitext/Block Quotes in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Block Quotes in WikiText.tid @@ -9,7 +9,7 @@ There are two ways to produce HTML block quotes in TiddlyWiki5, one for content ! Multi-line Block Quotes -The syntax for multi-line block quotes ({{$:/core/images/quote}}) is: +The syntax for multi-line block quotes (<<.icon $:/core/images/quote>>) is: <<wikitext-example src:"<<< This is a block quoted paragraph diff --git a/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid index 9bf473e13..91b1c5e1d 100644 --- a/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid @@ -5,7 +5,7 @@ tags: WikiText title: Code Blocks in WikiText type: text/vnd.tiddlywiki -You can use triple backticks <code>```</code> to mark code blocks ({{$:/core/images/mono-block}}): +You can use triple backticks <code>```</code> to mark code blocks (<<.icon $:/core/images/mono-block>>): <pre> ``` diff --git a/editions/tw5.com/tiddlers/wikitext/Formatting in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Formatting in WikiText.tid index b0b500dc6..293e55e95 100644 --- a/editions/tw5.com/tiddlers/wikitext/Formatting in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Formatting in WikiText.tid @@ -7,13 +7,13 @@ type: text/vnd.tiddlywiki Available character formatting includes: -* <code>`backticks`</code> for `code` ({{$:/core/images/mono-line}}) +* <code>`backticks`</code> for `code` (<<.icon $:/core/images/mono-line>>) ** Alternatively, <code>``double backticks allows `embedded` backticks``</code> -* `''bold''` for ''bold text'' ({{$:/core/images/bold}}) -* `//italic//` for //italic text// ({{$:/core/images/italic}}) -* `__underscore__` for __underscored text__ ({{$:/core/images/underline}}) -* `^^superscript^^` for ^^superscripted^^ text ({{$:/core/images/superscript}}) -* `,,subscript,,` for ,,subscripted,, text ({{$:/core/images/subscript}}) -* `~~strikethrough~~` for ~~strikethrough~~ text ({{$:/core/images/strikethrough}}) +* `''bold''` for ''bold text'' (<<.icon $:/core/images/bold>>) +* `//italic//` for //italic text// (<<.icon $:/core/images/italic>>) +* `__underscore__` for __underscored text__ (<<.icon $:/core/images/underline>>) +* `^^superscript^^` for ^^superscripted^^ text (<<.icon $:/core/images/superscript>>) +* `,,subscript,,` for ,,subscripted,, text (<<.icon $:/core/images/subscript>>) +* `~~strikethrough~~` for ~~strikethrough~~ text (<<.icon $:/core/images/strikethrough>>) See also: [[Code Blocks in WikiText]] diff --git a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid index 1bb31e7ad..3e6272d93 100644 --- a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid @@ -14,7 +14,7 @@ Images can be included in WikiText with the following syntax: [img[https://tiddlywiki.com/favicon.ico]] ``` -You can also insert images from the editor toolbar. Click ''picture'' ({{$:/core/images/picture}}) and select a picture file. +You can also insert images from the editor toolbar. Click ''picture'' (<<.icon $:/core/images/picture>>) and select a picture file. If the image source is the title of an image tiddler then that tiddler is directly displayed. Otherwise it is interpreted as a URL and an HTML `<img>` tag is generated with the `src` attribute containing the URL. diff --git a/editions/tw5.com/tiddlers/wikitext/Linking in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Linking in WikiText.tid index 88ae367a5..037daa821 100644 --- a/editions/tw5.com/tiddlers/wikitext/Linking in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Linking in WikiText.tid @@ -21,7 +21,7 @@ To link to a tiddler and specify the text of the link: [[Displayed Link Title|Tiddler Title]] ``` -You can also create a link from the editor toolbar. Click ''link'' ({{$:/core/images/link}}), and search and select a tiddler. +You can also create a link from the editor toolbar. Click ''link'' (<<.icon $:/core/images/link>>), and search and select a tiddler. ! ~CamelCase Links diff --git a/editions/tw5.com/tiddlers/wikitext/Lists in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Lists in WikiText.tid index 2cb46c5d5..feca125ee 100644 --- a/editions/tw5.com/tiddlers/wikitext/Lists in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Lists in WikiText.tid @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki ! Bulleted Lists -You can create bulleted (unordered) lists with `*` characters ({{$:/core/images/list-bullet}}): +You can create bulleted (unordered) lists with `*` characters (<<.icon $:/core/images/list-bullet>>): <<wikitext-example src:"* First list item * Second list item @@ -17,7 +17,7 @@ You can create bulleted (unordered) lists with `*` characters ({{$:/core/images/ ! Numbered Lists -Numbered (ordered) lists use `#` instead of `*` ({{$:/core/images/list-number}}): +Numbered (ordered) lists use `#` instead of `*` (<<.icon $:/core/images/list-number>>): # First item # Second item diff --git a/editions/tw5.com/tiddlers/workingwithtw/Creating and editing tiddlers.tid b/editions/tw5.com/tiddlers/workingwithtw/Creating and editing tiddlers.tid index 9f2d54715..2850030c0 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Creating and editing tiddlers.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Creating and editing tiddlers.tid @@ -6,7 +6,7 @@ type: text/vnd.tiddlywiki ! Creating tiddlers -You create a tiddler either by clicking the {{$:/core/images/new-button}} button in the sidebar, or by clicking on a link to a missing tiddler. Links to missing tiddlers are shown in [[blue italics]]. +You create a tiddler either by clicking the <<.icon $:/core/images/new-button>> button in the sidebar, or by clicking on a link to a missing tiddler. Links to missing tiddlers are shown in [[blue italics]]. See also: @@ -14,7 +14,7 @@ See also: ! Editing tiddlers -To edit an existing tiddler, click the {{$:/core/images/edit-button}} button at the top right of the tiddler. +To edit an existing tiddler, click the <<.icon $:/core/images/edit-button>> button at the top right of the tiddler. !! Draft mode @@ -22,7 +22,7 @@ When you create a new tiddler or edit an existing one, the tiddler will go into *''The title field'' - Use this to change the title of the tiddler *''The tag selector'' - Use this to add or remove tags. As you type a tag name in the box, a dropdown list will show you any existing tags that match. You can pick from this list or create a completely new tag. Then click the ''add'' button or hit the <kbd>Enter</kbd> key to add the tag to the tiddler. Each tag is shown as a coloured pill. Click the "×" on a pill to remove that tag -*''The text area'' - Use this to edit the main content of the tiddler. Click the ''preview'' button ({{$:/core/images/preview-closed}} / {{$:/core/images/preview-open}}) to see what your changes will look like +*''The text area'' - Use this to edit the main content of the tiddler. Click the ''preview'' button (<<.icon $:/core/images/preview-closed>> / <<.icon $:/core/images/preview-open>>) to see what your changes will look like *''The type selector'' - Use this when a tiddler needs to be displayed in a special way, such as an image. See ContentType for a list of the options. The default is `text/vnd.tiddlywiki`, which means the tiddler contains WikiText *''The field selector'' - Use this to add or remove fields on the tiddler. For example, if you are editing a tiddler that's being used to tag other tiddlers, you can add a [[''list'' field|ListField]] to change the order in which those tiddlers will be listed @@ -30,6 +30,6 @@ When you create a new tiddler or edit an existing one, the tiddler will go into When you have finished editing, click a button at the top right of the tiddler: -*The ''ok'' button ({{$:/core/images/done-button}}) stores your changes to this one tiddler and leaves draft mode. If your wiki is configured to [[AutoSave]], your changes will be permanently saved. Otherwise they will only be stored temporarily in your web browser, and you will lose them if you close your ~TiddlyWiki page without first clicking the master ''save changes'' button ({{$:/core/images/save-button}}) in the sidebar. -*The ''cancel'' button ({{$:/core/images/cancel-button}}) discards your changes (after asking you to confirm) and leaves draft mode. -*The ''delete'' button ({{$:/core/images/delete-button}}) deletes the entire tiddler (after asking you to confirm). +*The ''ok'' button (<<.icon $:/core/images/done-button>>) stores your changes to this one tiddler and leaves draft mode. If your wiki is configured to [[AutoSave]], your changes will be permanently saved. Otherwise they will only be stored temporarily in your web browser, and you will lose them if you close your ~TiddlyWiki page without first clicking the master ''save changes'' button (<<.icon $:/core/images/save-button>>) in the sidebar. +*The ''cancel'' button (<<.icon $:/core/images/cancel-button>>) discards your changes (after asking you to confirm) and leaves draft mode. +*The ''delete'' button (<<.icon $:/core/images/delete-button>>) deletes the entire tiddler (after asking you to confirm). diff --git a/editions/tw5.com/tiddlers/workingwithtw/Creating journal tiddlers.tid b/editions/tw5.com/tiddlers/workingwithtw/Creating journal tiddlers.tid index 44860f418..eb41edd52 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Creating journal tiddlers.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Creating journal tiddlers.tid @@ -14,19 +14,19 @@ For example, you might use a journal tiddler called ''10th October 2014'' to rec ! Creating a journal tiddler -The easiest way to create a journal tiddler is to use the ''new journal'' button {{$:/core/images/new-journal-button}} in the ''Tools'' tab of the sidebar. If you find yourself often using the button, click the checkbox next to it to make the button available just above the search box. +The easiest way to create a journal tiddler is to use the ''new journal'' button <<.icon $:/core/images/new-journal-button>> in the ''Tools'' tab of the sidebar. If you find yourself often using the button, click the checkbox next to it to make the button available just above the search box. The ''new journal'' button creates a journal entry as a blank tiddler with the tag ''Journal'' and a title derived from today's date. If a journal tiddler with that title already exists, then this is opened for editing. ! Creating a tagged journal tiddler -A common sequence of actions is to create (or reopen) today's journal entry and tag it with the title of another tiddler. This can be done with the ''new journal here'' button {{$:/core/images/new-journal-button}} in the other tiddler's toolbar. You can find this button in the ''Tools'' tab of the tiddler's InfoPanel. +A common sequence of actions is to create (or reopen) today's journal entry and tag it with the title of another tiddler. This can be done with the ''new journal here'' button <<.icon $:/core/images/new-journal-button>> in the other tiddler's toolbar. You can find this button in the ''Tools'' tab of the tiddler's InfoPanel. For example, you might be reviewing a tiddler called ''Oxford Street'' and realise that it's relevant for planning your shopping trip. Click the ''new journal here'' button on the ''Oxford Street'' tiddler to bring up a journal entry tagged with ''Oxford Street''. ! Customising journal tiddlers -To configure how new journal entries are created, visit the ''Basics'' tab under ''Info'' in the [[control panel|$:/ControlPanel]] {{$:/core/images/options-button}}: +To configure how new journal entries are created, visit the ''Basics'' tab under ''Info'' in the [[control panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>>: * "Title of new journal tiddlers" specifies how these tiddlers should be named, as a [[date format string|DateFormat]]. The default setting of `DDth MMM YYYY` causes new entries to have titles of the form "10th October 2014" * "Tags for new journal tiddlers" [specifies|Title List] tags that will automatically appear on new journal entries. For example: `Journal [[Summer vacation]]` diff --git a/editions/tw5.com/tiddlers/workingwithtw/Navigating between open tiddlers.tid b/editions/tw5.com/tiddlers/workingwithtw/Navigating between open tiddlers.tid index 3f01e6c77..4473530ba 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Navigating between open tiddlers.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Navigating between open tiddlers.tid @@ -8,7 +8,7 @@ In the default "classic" storyview mode, open tiddlers are displayed in a vertic * The best approach is to ''use the Open tab'' in the sidebar to click on the open tiddler to which you wish to navigate. -** The ''Open'' tab contains a list of all the open tiddlers. You can click on any tiddler in the list to jump to it, or click the "×" next to a tiddler link to close it. There is also a handy {{$:/core/images/close-all-button}} ''close all'' button at the bottom of the list of open tiddlers. +** The ''Open'' tab contains a list of all the open tiddlers. You can click on any tiddler in the list to jump to it, or click the "×" next to a tiddler link to close it. There is also a handy <<.icon $:/core/images/close-all-button>> ''close all'' button at the bottom of the list of open tiddlers. * Another way is to simply ''scroll the page up and down'' using the story river scrollbar to the right. diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index d4d660132..4a98ceea8 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -9,7 +9,7 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d * ''Avoid the "Recent" tab''. It is computationally slow to generate and update in response to tiddler changes. * ''Use the "Vanilla" theme''. The default "Snow White" theme includes visual effects like shadows, transparency and blurring that can be slow to render on older devices * ''Avoid large tiddlers''. Large bitmaps can significantly slow TiddlyWiki's performance. For example, an image taken with a modern smartphone will often be 5MB or more. Use ExternalImages whenever possible -* ''Don't have too many tiddlers open at once''. Every tiddler you have open will require processing to keep it up to date as the store changes (for example, while you type into a draft tiddler). It is particularly easy when using zoomin story view to end up with dozens of tiddlers listed in the ''Open'' tab in the sidebar. Get into the habit of periodically closing all open tiddlers with the {{$:/core/images/close-all-button}} ''close all'' button +* ''Don't have too many tiddlers open at once''. Every tiddler you have open will require processing to keep it up to date as the store changes (for example, while you type into a draft tiddler). It is particularly easy when using zoomin story view to end up with dozens of tiddlers listed in the ''Open'' tab in the sidebar. Get into the habit of periodically closing all open tiddlers with the <<.icon $:/core/images/close-all-button>> ''close all'' button * ''Use the built-in performance instrumentation''. Studying the [[performance instrumentation|Performance Instrumentation]] results can help highlight performance problems * Take advantage of indexed filter operators. The following constructions at the start of a filter run will be optimised to run many times faster than otherwise: ** `[all[tiddlers]tag[x]...` diff --git a/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid b/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid index 643b1cb14..a88275448 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid @@ -9,8 +9,8 @@ There are a number of ways that you can share [[tiddlers|Tiddlers]] or your whol *You can attach a ~TiddlyWiki to an e-mail *You can publish your ~TiddlyWiki online and grab a link to send or message to others: **A link to the web address of the whole ~TiddlyWiki file -**A [[permalink|PermaLinks]] ({{$:/core/images/permalink-button}}) to a specific tiddler -**A [[permaview|PermaViews]] ({{$:/core/images/permaview-button}}) link of all the currently open tiddlers +**A [[permalink|PermaLinks]] (<<.icon $:/core/images/permalink-button>>) to a specific tiddler +**A [[permaview|PermaViews]] (<<.icon $:/core/images/permaview-button>>) link of all the currently open tiddlers * You can [[share a Dropbox link to your TiddlyWiki|Sharing a TiddlyWiki on Dropbox]] -* You can [[export tiddlers|How to export tiddlers]] ({{$:/core/images/export-button}}) in a variety of formats including text, static HTML and comma separated values (ie spreadsheet compatible) +* You can [[export tiddlers|How to export tiddlers]] (<<.icon $:/core/images/export-button>>) in a variety of formats including text, static HTML and comma separated values (ie spreadsheet compatible) *You can also share tiddlers merely by making your ~TiddlyWiki accessible to others, for example by publishing it online, so that they can [[import tiddlers|Importing Tiddlers]] from it From 89728d8a9a9fd9b888deb78f420dd5758ee63909 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 13 Oct 2019 17:53:40 +0200 Subject: [PATCH 0376/2376] Make tag-picker add-tag button more consistent II (#4313) * Update tag-picker.tid * Update tags.tid * Update tag-picker.tid --- core/ui/EditTemplate/tags.tid | 12 ++---------- core/wiki/macros/tag-picker.tid | 8 +++----- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index d368ce491..665516b7b 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -25,21 +25,13 @@ color:$(foregroundColor)$; <$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon="""$icon$"""/> \end -\define tag-picker-actions() -<$action-listops - $tiddler=<<currentTiddler>> - $field="tags" - $subfilter="[<tag>] [all[current]tags[]]" -/> -\end - <div class="tc-edit-tags"> <$fieldmangler> <$list filter="[all[current]tags[]sort[title]]" storyview="pop"> <$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/> </$list> -</$fieldmangler> <$set name="tabIndex" value={{$:/config/EditTabIndex}}> -<$macrocall $name="tag-picker" actions=<<tag-picker-actions>>/> +<$macrocall $name="tag-picker"/> </$set> +</$fieldmangler> </div> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 8d58748f2..2d36b2eb3 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -8,14 +8,13 @@ tags: $:/tags/Macro \define tag-button() <$button class="tc-btn-invisible" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> -$(actions)$ +<$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> <$action-deletetiddler $tiddler="$:/temp/NewTagName"/> <$macrocall $name="tag-pill" tag=<<tag>>/> </$button> \end -\define tag-picker(actions) -<$set name="actions" value="""$actions$"""> +\define tag-picker() <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> @@ -24,7 +23,7 @@ $(actions)$ </span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> <$set name="tag" value={{$:/temp/NewTagName}}> <$button set="$:/temp/NewTagName" setTo="" class=""> -$actions$ +<<add-tag-actions>> <$action-deletetiddler $tiddler="$:/temp/NewTagName"/> {{$:/language/EditTemplate/Tags/Add/Button}} </$button> @@ -46,5 +45,4 @@ $actions$ </div> </$reveal> </div> -</$set> \end From daa24a52bdc832ca09e0b9c1335301c8c35c75d1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 13 Oct 2019 17:53:52 +0200 Subject: [PATCH 0377/2376] Add default new-tiddler and new-journal tags mechanism and... (#4314) * Update Basics.tid * Update ControlPanel.multids * Update NewJournal.multids * Create NewJournalTags.tid * Update new-tiddler.tid * Update new-image.tid * Update new-journal.tid * Update new-here.tid * Update new-journal-here.tid --- core/language/en-GB/ControlPanel.multids | 1 + core/language/en-GB/NewJournal.multids | 1 - core/language/en-GB/NewJournalTags.tid | 2 ++ core/ui/Actions/new-image.tid | 2 +- core/ui/Actions/new-journal.tid | 2 +- core/ui/Actions/new-tiddler.tid | 2 +- core/ui/ControlPanel/Basics.tid | 3 ++- core/ui/ViewToolbar/new-here.tid | 4 ++-- core/ui/ViewToolbar/new-journal-here.tid | 4 ++-- 9 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 core/language/en-GB/NewJournalTags.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 3b086e851..802d9284b 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -15,6 +15,7 @@ Basics/NewJournal/Title/Prompt: Title of new journal tiddlers Basics/NewJournal/Text/Prompt: Text for new journal tiddlers Basics/NewJournal/Tags/Prompt: Tags for new journal tiddlers Basics/NewTiddler/Title/Prompt: Title of new tiddlers +Basics/NewTiddler/Tags/Prompt: Tags for new tiddlers Basics/OverriddenShadowTiddlers/Prompt: Number of overridden shadow tiddlers: Basics/ShadowTiddlers/Prompt: Number of shadow tiddlers: Basics/Subtitle/Prompt: Subtitle: diff --git a/core/language/en-GB/NewJournal.multids b/core/language/en-GB/NewJournal.multids index b7a3f5e62..f5c939068 100644 --- a/core/language/en-GB/NewJournal.multids +++ b/core/language/en-GB/NewJournal.multids @@ -2,4 +2,3 @@ title: $:/config/NewJournal/ Title: DDth MMM YYYY Text: -Tags: Journal diff --git a/core/language/en-GB/NewJournalTags.tid b/core/language/en-GB/NewJournalTags.tid new file mode 100644 index 000000000..0534cba33 --- /dev/null +++ b/core/language/en-GB/NewJournalTags.tid @@ -0,0 +1,2 @@ +title: $:/config/NewJournal/Tags +tags: Journal diff --git a/core/ui/Actions/new-image.tid b/core/ui/Actions/new-image.tid index 372933e90..1e46ebcdb 100644 --- a/core/ui/Actions/new-image.tid +++ b/core/ui/Actions/new-image.tid @@ -6,5 +6,5 @@ description: create a new image tiddler image/$(imageType)$ \end <$vars imageType={{$:/config/NewImageType}}> -<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>>/> +<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!tags}}/> </$vars> diff --git a/core/ui/Actions/new-journal.tid b/core/ui/Actions/new-journal.tid index 4c5082f78..9f3453926 100644 --- a/core/ui/Actions/new-journal.tid +++ b/core/ui/Actions/new-journal.tid @@ -2,7 +2,7 @@ title: $:/core/ui/Actions/new-journal tags: $:/tags/Actions description: create a new journal tiddler -<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} journalText={{$:/config/NewJournal/Text}}> +<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}> <$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>"""> <$reveal type="nomatch" state=<<journalTitle>> text=""> <$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/> diff --git a/core/ui/Actions/new-tiddler.tid b/core/ui/Actions/new-tiddler.tid index 272b61007..e176f0ab3 100644 --- a/core/ui/Actions/new-tiddler.tid +++ b/core/ui/Actions/new-tiddler.tid @@ -2,4 +2,4 @@ title: $:/core/ui/Actions/new-tiddler tags: $:/tags/Actions description: create a new empty tiddler -<$action-sendmessage $message="tm-new-tiddler"/> +<$action-sendmessage $message="tm-new-tiddler" tags={{$:/config/NewTiddler/Tags!!tags}}/> diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 4a4379e82..b364c05bb 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -22,8 +22,9 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag="textarea" tiddler="$:/DefaultTiddlers" class="tc-edit-texteditor"/><br>//<<lingo DefaultTiddlers/BottomHint>>// | |<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | +|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |{{$:/config/NewTiddler/Tags||$:/core/ui/EditTemplate/tags}} | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | -|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Tags" default="" tag="input"/> | +|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |{{$:/config/NewJournal/Tags||$:/core/ui/EditTemplate/tags}} | |<<lingo AutoFocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | diff --git a/core/ui/ViewToolbar/new-here.tid b/core/ui/ViewToolbar/new-here.tid index 7b3f96c32..d11750e70 100644 --- a/core/ui/ViewToolbar/new-here.tid +++ b/core/ui/ViewToolbar/new-here.tid @@ -5,7 +5,7 @@ description: {{$:/language/Buttons/NewHere/Hint}} \whitespace trim \define newHereActions() -<$set name="tags" filter="[<currentTiddler>]"> +<$set name="tags" filter="[<currentTiddler>] [{$:/config/NewTiddler/Tags!!tags}]"> <$action-sendmessage $message="tm-new-tiddler" tags=<<tags>>/> </$set> \end @@ -21,4 +21,4 @@ description: {{$:/language/Buttons/NewHere/Hint}} </$list> </$button> \end -<<newHereButton>> \ No newline at end of file +<<newHereButton>> diff --git a/core/ui/ViewToolbar/new-journal-here.tid b/core/ui/ViewToolbar/new-journal-here.tid index e41fd4063..b540185ca 100644 --- a/core/ui/ViewToolbar/new-journal-here.tid +++ b/core/ui/ViewToolbar/new-journal-here.tid @@ -23,9 +23,9 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}} </$button> \end <$set name="journalTitleTemplate" value={{$:/config/NewJournal/Title}}> -<$set name="journalTags" value={{$:/config/NewJournal/Tags}}> +<$set name="journalTags" value={{$:/config/NewJournal/Tags!!tags}}> <$set name="currentTiddlerTag" value=<<currentTiddler>>> <<journalButton>> </$set> </$set> -</$set> \ No newline at end of file +</$set> From e5985566ce29b4689ae972de93f52b4abcf01ce0 Mon Sep 17 00:00:00 2001 From: donmor <donmor3000@hotmail.com> Date: Mon, 14 Oct 2019 00:43:46 +0800 Subject: [PATCH 0378/2376] Update Saving on Android.tid (#4316) --- .../tiddlers/saving/Saving on Android.tid | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving on Android.tid b/editions/tw5.com/tiddlers/saving/Saving on Android.tid index 6be8d5508..7b660198c 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on Android.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on Android.tid @@ -1,26 +1,28 @@ -caption: ~AndTidWiki +caption: Tiddloid and Tiddloid Lite created: 20130825161400000 delivery: App description: Android app for saving changes locally to device storage method: save -modified: 20171113105950965 +modified: 20191013145728306 tags: Saving Android title: Saving on Android type: text/vnd.tiddlywiki -The AndTidWiki app for Android devices makes it possible to edit and save changes to TiddlyWiki5, including working offline without a network connection. [[Download it here|https://play.google.com/store/apps/details?id=de.mgsimon.android.andtidwiki&hl=en]]. +The Tiddloid or Tiddloid Lite app for Android devices makes it possible to edit and save changes to TiddlyWiki. Get it from GitHub: [[Tiddloid|https://github.com/donmor/Tiddloid]] [[Tiddloid Lite|https://github.com/donmor/TiddloidLite]]. -Instructions for use: +''Instructions for use:'' -# [[Download]] an empty TiddlyWiki on another web browser -# Move the file you just downloaded to the directory `/sdcard/andtidwiki` -#* You may rename it, but be sure to keep the `.html` or `.htm` extension -# Open AndTidWiki -#* Don't use ''Menu''/''new ~TiddlyWiki'' menu option (it only supports the older TiddlyWikiClassic) -# Open the file by touching its filename -# Try creating a new tiddler using the ''new tiddler'' {{$:/core/images/new-button}} button in the sidebar. Type some content for the tiddler, and click the {{$:/core/images/done-button}} ''ok'' button -#* The wiki will be saved, and a confirmation message should appear at the top right of the window +* ''Creating new Wiki'' +** Open Tiddloid or Toddloid Lite and use ''Toolbar or Menu/New Wiki'' option. Choose a destination file path and a new TiddlyWiki5 document will be created and opened. +* ''Importing existing Wiki'' +** Open Tiddloid or Toddloid Lite and use ''Toolbar or Menu/Import a file'' option. Choose an existing wiki file and it will be imported and opened. +* ''Opening'' +** You can reopen a wiki created or imported above by clicking its title in the app. +* ''Saving'' +** Try making some changes and click the {{$:/core/images/save-button}} ''save changes'' button. The wiki will be saved, and a confirmation message should appear at the top right of the window. +** The wiki will also be saved when clicking the {{$:/core/images/done-button}} ''ok'' button in a tiddler. -''Note:'' You can save your changes by clicking the {{$:/core/images/save-button}} ''save changes'' button in the sidebar even if you have not clicked the {{$:/core/images/done-button}} ''ok'' button to complete editing a tiddler +''Note:'' -//Note that AndTidWiki is published independently of TiddlyWiki// \ No newline at end of file +* Tiddloid Lite supports new devices better. It also supports files on clouds like GDrive and ~OneDrive, while Tiddloid keeps the compatibility to TiddlyWikiClassic. For more difference between Tiddloid and Tiddloid Lite, please visit [[Tiddloid's homepage|https://github.com/donmor/Tiddloid]]. +* You should keep the `.html` or `.htm` extension of the files to be imported. From 4d3916b0633d14c4d1dc3c5a0c89c87549d87b04 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Mon, 14 Oct 2019 10:23:12 +0200 Subject: [PATCH 0379/2376] Update normalze.css from 3.0.0 to 8.0.1 (#4208) --- themes/tiddlywiki/vanilla/reset.tid | 490 ++++++++++++---------------- 1 file changed, 208 insertions(+), 282 deletions(-) diff --git a/themes/tiddlywiki/vanilla/reset.tid b/themes/tiddlywiki/vanilla/reset.tid index 4d9cb666a..11ccd7244 100644 --- a/themes/tiddlywiki/vanilla/reset.tid +++ b/themes/tiddlywiki/vanilla/reset.tid @@ -1,134 +1,43 @@ title: $:/themes/tiddlywiki/vanilla/reset type: text/plain -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ /** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. */ html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ + line-height: 1.15; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ } +/* Sections + ========================================================================== */ + /** - * Remove default margin. + * Remove the margin in all browsers. */ body { margin: 0; } -/* HTML5 display definitions - ========================================================================== */ - /** - * Correct `block` display not defined in IE 8/9. + * Render the `main` element consistently in IE. */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { +main { display: block; } /** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9. - * Hide the `template` element in IE, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background: transparent; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9, Safari 5, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari 5 and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari 5, and Chrome. + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. */ h1 { @@ -136,17 +45,75 @@ h1 { margin: 0.67em 0; } +/* Grouping content + ========================================================================== */ + /** - * Address styling not present in IE 8/9. + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. */ -mark { - background: #ff0; - color: #000; +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ } /** - * Address inconsistent and variable font size in all browsers. + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. */ small { @@ -154,7 +121,8 @@ small { } /** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. */ sub, @@ -165,87 +133,31 @@ sup { vertical-align: baseline; } -sup { - top: -0.5em; -} - sub { bottom: -0.25em; } +sup { + top: -0.5em; +} + /* Embedded content ========================================================================== */ /** - * Remove border when inside `a` element in IE 8/9. + * Remove the border on images inside links in IE 10. */ img { - border: 0; -} - -/** - * Correct overflow displayed oddly in IE 9. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari 5. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; + border-style: none; } /* Forms ========================================================================== */ /** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. */ button, @@ -253,146 +165,100 @@ input, optgroup, select, textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ } /** - * Address `overflow` set to `hidden` in IE 8/9/10. + * Show the overflow in IE. + * 1. Show the overflow in Edge. */ -button { +button, +input { /* 1 */ overflow: visible; } /** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8+, and Opera - * Correct `select` style inheritance in Firefox. + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. */ button, -select { +select { /* 1 */ text-transform: none; } /** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. + * Correct the inability to style clickable types in iOS and Safari. */ button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; } /** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. + * Remove the inner border and padding in Firefox. */ button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; padding: 0; } /** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. + * Restore the focus styles unset by the previous rule. */ -input { - line-height: normal; +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; } /** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. + * Correct the padding in Firefox. */ fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; + padding: 0.35em 0.75em 0.625em; } /** - * 1. Correct `color` not being inherited in IE 8/9. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. */ legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ } /** - * Remove default vertical scrollbar in IE 8/9. + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. */ textarea { @@ -400,27 +266,87 @@ textarea { } /** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. */ -optgroup { - font-weight: bold; +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ } -/* Tables +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc ========================================================================== */ /** - * Remove most spacing between table cells. + * Add the correct display in IE 10+. */ -table { - border-collapse: collapse; - border-spacing: 0; +template { + display: none; } -td, -th { - padding: 0; +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; } From 03e98d1d62526d81e189fe0343a05cc6ba5782c3 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Mon, 14 Oct 2019 16:33:44 +0800 Subject: [PATCH 0380/2376] Update chinese translations (#4317) * Add chinese translations for default new-tiddler and new-journal tags mechanism * Add chinese translations for tooltips of add-tag button and add-field button --- languages/zh-Hans/ControlPanel.multids | 2 ++ languages/zh-Hans/EditTemplate.multids | 2 ++ languages/zh-Hans/NewJournal.multids | 1 - languages/zh-Hans/NewJournalTags.tid | 2 ++ languages/zh-Hant/ControlPanel.multids | 2 ++ languages/zh-Hant/EditTemplate.multids | 2 ++ languages/zh-Hant/NewJournal.multids | 1 - languages/zh-Hant/NewJournalTags.tid | 2 ++ 8 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 languages/zh-Hans/NewJournalTags.tid create mode 100644 languages/zh-Hant/NewJournalTags.tid diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index a46206f13..69772295c 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -5,6 +5,7 @@ Advanced/Hint: 关于此 TiddlyWiki 的内部信息 Appearance/Caption: 视觉外观 Appearance/Hint: 定制您的 TiddlyWiki 外观。 Basics/AnimDuration/Prompt: 动画持续时间: +Basics/AutoFocus/Prompt: 默认自动停留的栏位: Basics/Caption: 基本 Basics/DefaultTiddlers/BottomHint: 标题含空白时请使用 [[双中括弧]],或者您可用 <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">保留开启中的条目顺序</$button> Basics/DefaultTiddlers/Prompt: 首页: @@ -13,6 +14,7 @@ Basics/Language/Prompt: 您好!当前的语言: Basics/NewJournal/Tags/Prompt: 新日志条目的标签 Basics/NewJournal/Text/Prompt: 新日志条目的内容 Basics/NewJournal/Title/Prompt: 新日志条目的名称 +Basics/NewTiddler/Tags/Prompt: 新条目的标签 Basics/NewTiddler/Title/Prompt: 新条目的名称 Basics/OverriddenShadowTiddlers/Prompt: 被覆写的默认条目数量: Basics/ShadowTiddlers/Prompt: 默认条目数量: diff --git a/languages/zh-Hans/EditTemplate.multids b/languages/zh-Hans/EditTemplate.multids index 6d966e248..7d84f78de 100644 --- a/languages/zh-Hans/EditTemplate.multids +++ b/languages/zh-Hans/EditTemplate.multids @@ -8,6 +8,7 @@ Field/Remove/Hint: 删除字段 Field/Dropdown/Caption: 字段列表 Field/Dropdown/Hint: 显示字段列表 Fields/Add/Button: 添加 +Fields/Add/Button/Hint: 添加字段 Fields/Add/Dropdown/System: 系统字段 Fields/Add/Dropdown/User: 使用者字段 Fields/Add/Name/Placeholder: 字段名称 @@ -16,6 +17,7 @@ Fields/Add/Value/Placeholder: 字段内容 Shadow/Warning: 这是一个默认条目。您做的任何更改将会覆盖来自 <<pluginLink>> 插件的默认版本。 Shadow/OverriddenWarning: 这是一个修改过的默认条目。删除此条目可以还原为 <<pluginLink>> 插件中的默认版本。 Tags/Add/Button: 添加 +Tags/Add/Button/Hint: 添加标签 Tags/Add/Placeholder: 标签名称 Tags/Dropdown/Caption: 标签清单 Tags/Dropdown/Hint: 显示标签清单 diff --git a/languages/zh-Hans/NewJournal.multids b/languages/zh-Hans/NewJournal.multids index fadcc911a..6b6373f1e 100644 --- a/languages/zh-Hans/NewJournal.multids +++ b/languages/zh-Hans/NewJournal.multids @@ -2,4 +2,3 @@ title: $:/config/NewJournal/ Title: YYYY年0MM月0DD日 Text: -Tags: 日志 diff --git a/languages/zh-Hans/NewJournalTags.tid b/languages/zh-Hans/NewJournalTags.tid new file mode 100644 index 000000000..989d4870b --- /dev/null +++ b/languages/zh-Hans/NewJournalTags.tid @@ -0,0 +1,2 @@ +title: $:/config/NewJournal/Tags +tags: 日志 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index e27bb6ac7..c22cfee06 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -5,6 +5,7 @@ Advanced/Hint: 關於此 TiddlyWiki 的內部資訊 Appearance/Caption: 視覺外觀 Appearance/Hint: 自訂您的 TiddlyWiki 外觀。 Basics/AnimDuration/Prompt: 動畫持續時間: +Basics/AutoFocus/Prompt: 預設自動停留的欄位: Basics/Caption: 基本 Basics/DefaultTiddlers/BottomHint: 標題含空白時請使用 [[雙中括弧]],或者您可用 <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">保留開啟中的條目順序</$button> Basics/DefaultTiddlers/Prompt: 首頁: @@ -13,6 +14,7 @@ Basics/Language/Prompt: 您好!當前的語言: Basics/NewJournal/Tags/Prompt: 新日誌條目的標籤 Basics/NewJournal/Text/Prompt: 新日誌條目的內容 Basics/NewJournal/Title/Prompt: 新日誌條目的名稱 +Basics/NewTiddler/Tags/Prompt: 新條目的標籤 Basics/NewTiddler/Title/Prompt: 新條目的名稱 Basics/OverriddenShadowTiddlers/Prompt: 被覆寫的預設條目數量: Basics/ShadowTiddlers/Prompt: 預設條目數量: diff --git a/languages/zh-Hant/EditTemplate.multids b/languages/zh-Hant/EditTemplate.multids index 5b828c5e5..000b45988 100644 --- a/languages/zh-Hant/EditTemplate.multids +++ b/languages/zh-Hant/EditTemplate.multids @@ -8,6 +8,7 @@ Field/Remove/Hint: 刪除欄位 Field/Dropdown/Caption: 欄位列表 Field/Dropdown/Hint: 顯示欄位列表 Fields/Add/Button: 新增 +Fields/Add/Button/Hint: 新增欄位 Fields/Add/Dropdown/System: 系統欄位 Fields/Add/Dropdown/User: 使用者欄位 Fields/Add/Name/Placeholder: 欄位名稱 @@ -16,6 +17,7 @@ Fields/Add/Value/Placeholder: 欄位內容 Shadow/Warning: 這是一個預設條目。您做的任何更改將會覆蓋來自 <<pluginLink>> 插件的預設版本。 Shadow/OverriddenWarning: 這是一個修改過的預設條目。刪除此條目可以還原為 <<pluginLink>> 插件中的預設版本。 Tags/Add/Button: 新增 +Tags/Add/Button/Hint: 新增標籤 Tags/Add/Placeholder: 標籤名稱 Tags/Dropdown/Caption: 標籤清單 Tags/Dropdown/Hint: 顯示標籤清單 diff --git a/languages/zh-Hant/NewJournal.multids b/languages/zh-Hant/NewJournal.multids index 18086683f..6b6373f1e 100644 --- a/languages/zh-Hant/NewJournal.multids +++ b/languages/zh-Hant/NewJournal.multids @@ -2,4 +2,3 @@ title: $:/config/NewJournal/ Title: YYYY年0MM月0DD日 Text: -Tags: 日誌 diff --git a/languages/zh-Hant/NewJournalTags.tid b/languages/zh-Hant/NewJournalTags.tid new file mode 100644 index 000000000..e7205fab4 --- /dev/null +++ b/languages/zh-Hant/NewJournalTags.tid @@ -0,0 +1,2 @@ +title: $:/config/NewJournal/Tags +tags: 日誌 From 6089c4de2921df0f76f605f1830fb2c04548f73c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 14 Oct 2019 10:42:14 +0100 Subject: [PATCH 0381/2376] Extend refresh throttling to tiddlers having a "throttle.refresh" field See discussion here: https://groups.google.com/d/msgid/tiddlywiki/7738644f-b53f-4fb0-b0df-16243fe51795%40googlegroups.com --- core/language/en-GB/Fields.multids | 1 + core/modules/startup/render.js | 14 ++-- .../tiddlers/concepts/TiddlerFields.tid | 67 ++++++++++--------- .../Hidden Setting_ Typin Refresh Delay.tid | 6 +- .../tiddlers/mechanisms/RefreshMechanism.tid | 13 ++++ .../tiddlers/mechanisms/RefreshThrottling.tid | 16 +++++ .../mechanisms/WikificationMechanism.tid | 28 ++++++++ .../{ => plugins}/Plugin Dependencies.tid | 0 .../tiddlers/{ => plugins}/Plugin Types.tid | 0 .../tiddlers/workingwithtw/Performance.tid | 8 ++- 10 files changed, 110 insertions(+), 43 deletions(-) create mode 100644 editions/tw5.com/tiddlers/mechanisms/RefreshMechanism.tid create mode 100644 editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid create mode 100644 editions/tw5.com/tiddlers/mechanisms/WikificationMechanism.tid rename editions/tw5.com/tiddlers/{ => plugins}/Plugin Dependencies.tid (100%) rename editions/tw5.com/tiddlers/{ => plugins}/Plugin Types.tid (100%) diff --git a/core/language/en-GB/Fields.multids b/core/language/en-GB/Fields.multids index 12b46293a..f39ea69d7 100644 --- a/core/language/en-GB/Fields.multids +++ b/core/language/en-GB/Fields.multids @@ -31,6 +31,7 @@ source: The source URL associated with a tiddler subtitle: The subtitle text for a wizard tags: A list of tags associated with a tiddler text: The body text of a tiddler +throttle.refresh: If present, throttles refreshes of this tiddler title: The unique name of a tiddler toc-link: Suppresses the tiddler's link in a Table of Contents tree if set to: ''no'' type: The content type of a tiddler diff --git a/core/modules/startup/render.js b/core/modules/startup/render.js index fe99ed21a..05ba9844d 100644 --- a/core/modules/startup/render.js +++ b/core/modules/startup/render.js @@ -25,7 +25,7 @@ var PAGE_TEMPLATE_TITLE = "$:/core/ui/PageTemplate"; // Time (in ms) that we defer refreshing changes to draft tiddlers var DRAFT_TIDDLER_TIMEOUT_TITLE = "$:/config/Drafts/TypingTimeout"; -var DRAFT_TIDDLER_TIMEOUT = 400; +var THROTTLE_REFRESH_TIMEOUT = 400; exports.startup = function() { // Set up the title @@ -78,12 +78,12 @@ exports.startup = function() { } // Add the change event handler $tw.wiki.addEventListener("change",$tw.perf.report("mainRefresh",function(changes) { - // Check if only drafts have changed - var onlyDraftsHaveChanged = true; + // Check if only tiddlers that are throttled have changed + var onlyThrottledTiddlersHaveChanged = true; for(var title in changes) { var tiddler = $tw.wiki.getTiddler(title); - if(!tiddler || !tiddler.hasField("draft.of")) { - onlyDraftsHaveChanged = false; + if(!tiddler || !(tiddler.hasField("draft.of") || tiddler.hasField("throttle.refresh"))) { + onlyThrottledTiddlersHaveChanged = false; } } // Defer the change if only drafts have changed @@ -91,10 +91,10 @@ exports.startup = function() { clearTimeout(timerId); } timerId = null; - if(onlyDraftsHaveChanged) { + if(onlyThrottledTiddlersHaveChanged) { var timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,""),10); if(isNaN(timeout)) { - timeout = DRAFT_TIDDLER_TIMEOUT; + timeout = THROTTLE_REFRESH_TIMEOUT; } timerId = setTimeout(refresh,timeout); $tw.utils.extend(deferredChanges,changes); diff --git a/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid b/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid index 3d2dd5a84..0a0c07c7e 100644 --- a/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid +++ b/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid @@ -1,5 +1,5 @@ created: 20130825213300000 -modified: 20180104000000000 +modified: 20191013093910961 tags: Concepts title: TiddlerFields type: text/vnd.tiddlywiki @@ -9,43 +9,44 @@ type: text/vnd.tiddlywiki The standard fields are: -|!Field Name |!Reference |!Description | -|`title` |TitleField |<<lingo title>> | -|`text` |TextField |<<lingo text>> | -|`modified` |ModifiedField |<<lingo modified>> | -|`modifier` |ModifierField |<<lingo modifier>> | -|`created` |CreatedField |<<lingo created>> | -|`creator` |CreatorField |<<lingo creator>> | -|`tags` |TagsField |<<lingo tags>> | -|`type` |TypeField |<<lingo type>> | -|`list` |ListField |<<lingo list>> | -|`caption` |CaptionField |<<lingo caption>> | +|!Field Name |!Description | +|`title` |<<lingo title>> | +|`text` |<<lingo text>> | +|`modified` |<<lingo modified>> | +|`modifier` |<<lingo modifier>> | +|`created` |<<lingo created>> | +|`creator` |<<lingo creator>> | +|`tags` |<<lingo tags>> | +|`type` |<<lingo type>> | +|`list` |<<lingo list>> -- see ListField | +|`caption` |<<lingo caption>> | Other fields used by the core are: -|!Field Name |!Reference |!Description | -|`class` |ClassField |<<lingo class>> | -|`color` |ColorField |<<lingo color>> | -|`description` |DescriptionField |<<lingo description>> | -|`draft.of` |DraftOfField |<<lingo draft.of>> | -|`draft.title` |DraftTitleField |<<lingo draft.title>> | -|`footer` |FooterField |<<lingo footer>> | -|`hide-body`|HideBodyField|<<lingo hide-body>>| -|`icon` |IconField |<<lingo icon>> | -|`library` |LibraryField |<<lingo library>> | -|`list-after` |ListAfterField |<<lingo list-after>> | -|`list-before` |ListBeforeField |<<lingo list-before>> | -|`name` |NameField |<<lingo name>> | -|`plugin-priority` |PluginPriorityField |<<lingo plugin-priority>> | -|`plugin-type` |PluginTypeField |<<lingo plugin-type>> | -|`source` |SourceField |<<lingo source>> | -|`subtitle` |SubtitleField |<<lingo subtitle>> | -|`toc-link`|TocLink|<<lingo toc-link>>| +|!Field Name |!Description | +|`class` |<<lingo class>> | +|`color` |<<lingo color>> | +|`description` |<<lingo description>> | +|`draft.of` |<<lingo draft.of>> | +|`draft.title` |<<lingo draft.title>> | +|`footer` |<<lingo footer>> | +|`hide-body`|<<lingo hide-body>>| +|`icon` |<<lingo icon>> | +|`library` |<<lingo library>> | +|`list-after` |<<lingo list-after>> | +|`list-before` |<<lingo list-before>> | +|`name` |<<lingo name>> | +|`plugin-priority` |<<lingo plugin-priority>> | +|`plugin-type` |<<lingo plugin-type>> | +|`source` |<<lingo source>> | +|`subtitle` |<<lingo subtitle>> | +|`throttle.refresh` |<<lingo throttle.refresh>> | +|`toc-link`|<<lingo toc-link>>| The TiddlyWebAdaptor uses a few more fields: -|!Field Name |!Reference |!Description | -|`bag` |BagField |<<lingo bag>> | -|`revision` |RevisionField |<<lingo revision>> | +|!Field Name |!Description | +|`bag` |<<lingo bag>> | +|`revision` |<<lingo revision>> | Details of the fields used in this ~TiddlyWiki are shown in the [[control panel|$:/ControlPanel]] {{$:/core/ui/Buttons/control-panel}} under the <<.controlpanel-tab Info>> tab >> <<.info-tab Advanced>> sub-tab >> Tiddler Fields diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Typin Refresh Delay.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Typin Refresh Delay.tid index 711104529..d47faf476 100644 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Typin Refresh Delay.tid +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Typin Refresh Delay.tid @@ -1,10 +1,12 @@ created: 20150619162409306 -modified: 20150619162511957 +modified: 20191014091803518 tags: [[Hidden Settings]] title: Hidden Setting: Typing Refresh Delay type: text/vnd.tiddlywiki -TiddlyWiki defers processing changes to draft tiddlers until a timeout has elapsed. The default value of 400ms gives a good balance of responsiveness in most cases but isn't always optimal on lower powered mobile devices. +TiddlyWiki defers processing changes to draft tiddlers until a timeout has elapsed (this is called throttling). The mechanism can be extended to other tiddlers by adding a `throttle.refresh` field. See RefreshThrottling for details. + +The default value of 400ms gives a good balance of responsiveness in most cases but isn't always optimal on lower powered mobile devices. The timeout can now be changed by changing this value (in milliseconds): diff --git a/editions/tw5.com/tiddlers/mechanisms/RefreshMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/RefreshMechanism.tid new file mode 100644 index 000000000..e50d333b5 --- /dev/null +++ b/editions/tw5.com/tiddlers/mechanisms/RefreshMechanism.tid @@ -0,0 +1,13 @@ +created: 20191012152414236 +modified: 20191014091753894 +tags: Mechanisms +title: RefreshMechanism +type: text/vnd.tiddlywiki + +The refresh mechanism is the part of the WikificationMechanism concerned with updating a rendering when there are changes in the tiddler store. + +The refresh mechanism is notified of changes to the tiddler store asynchronously. This is done so that multiple consecutive changes can be coalesced into a single change notification. Thus, a series of action widgets modifying several different tiddlers will only trigger a single refresh cycle. + +When changes occur, the rendering is updated by calling the "refresh" method of the root widget. The refresh method determines whether the widget needs to be updated to reflect the incoming changes, and then recursively calls into the refresh methods of each child widget + +The refresh cycle is inherently fairly slow because it involves visiting every node in the render tree. To maintain performance there is a RefreshThrottling mechanism that enables refresh processing to be deferred when rapid changes occur to the same tiddler. diff --git a/editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid b/editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid new file mode 100644 index 000000000..3453bf2b4 --- /dev/null +++ b/editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid @@ -0,0 +1,16 @@ +created: 20191013095916159 +modified: 20191014093837558 +tags: RefreshMechanism +title: RefreshThrottling +type: text/vnd.tiddlywiki + +The RefreshMechanism allows the refresh cycle to be throttled (or deferred) when rapid changes occur to the same tiddler. It is used to maintain responsiveness while editing a draft tiddler, but can also be used on other tiddlers. + +The rules governing refresh throttling are: + +* When a change notification occurs, throttling will only take place if all of the modified tiddlers meet at least one of these criteria: +** Has the field `draft.of` +** Has the field `throttle.refresh` +* If the refresh cycle is to be throttled, a timer is set for the internal specified in [[$:/config/Drafts/TypingTimeout|Hidden Setting: Typing Refresh Delay]] (cancelling any preciously set timer) +** When the timer fires, the refresh cycle is triggered, passing the aggregated titles of all the deferred refresh cycles + diff --git a/editions/tw5.com/tiddlers/mechanisms/WikificationMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/WikificationMechanism.tid new file mode 100644 index 000000000..1683748cf --- /dev/null +++ b/editions/tw5.com/tiddlers/mechanisms/WikificationMechanism.tid @@ -0,0 +1,28 @@ +created: 20191012080221911 +modified: 20191013094002890 +tags: Mechanisms +title: WikificationMechanism +type: text/vnd.tiddlywiki + +"Wikification" is a general term for the dynamic process of converting tiddlers containing WikiText into the HTML DOM representation needed by the browser, and updating that representation if the underlying tiddlers change. + +It is composed of several distinct steps: + +* ParserMechanism: reading the text of tiddlers and scanning for wikitext constructions, outputting a tree representation of the resulting structure. It is an expensive process so parse trees are cached, and only need to be updated if the corresponding tiddler is changed +* WidgetMechanism: starting with a specified root tiddler, recursively instantiate a widget for each parse tree node making a rendering tree. Widgets can optionally also create DOM nodes +* RefreshMechanism: handling changes to the tiddler store by selectively and efficiently updating a rendering tree + +This mechanism is used in the browser to build TiddlyWiki's main interactive page. At startup, the tiddler $:/core/ui/PageTemplate is parsed and rendered to the DOM, recursively pulling in other tiddlers to build the entire user interface. Any user interactions -- following a link, clicking a button, or typing in a text box -- trigger a change in the tiddler store which then automatically propagates through the widget tree. For example, if the user clicks a link to navigate to a new tiddler, the following steps take place: + +# Clicking the link triggers the action of the LinkWidget which by default is to add the target tiddler to the list field of the tiddler $:/StoryList +# The modification to the tiddler store asynchronously triggers the refresh cycle. The asynchronous triggering ensures that the refresh cycle is only run once even if multiple tiddlers were modified in succession +# The refresh cycle recursively visits each node of the render tree giving them the chance to update themselves in the light of the accumulated changes to the tiddler store. In this case, the ListWidget of the main story river notices that a single tiddler needs to be added to the river, and renders that newly displayed tiddler without disturbing the other tiddlers + +The performance of the entire wikification process is critical. If the refresh cycle takes more than about 400ms then the user will notice a delay between their actions and the effects. See [[Performance]] for some discussion of how to optimise performance. + +The rendering process is also aggressively reused in other parts of TiddlyWiki, both in the browser and on the server: + +* Generating TiddlyWiki's standalone HTML representation +* Creating static HTML renderings of tiddlers +* Dynamically rendering CSS stylesheet tiddlers + diff --git a/editions/tw5.com/tiddlers/Plugin Dependencies.tid b/editions/tw5.com/tiddlers/plugins/Plugin Dependencies.tid similarity index 100% rename from editions/tw5.com/tiddlers/Plugin Dependencies.tid rename to editions/tw5.com/tiddlers/plugins/Plugin Dependencies.tid diff --git a/editions/tw5.com/tiddlers/Plugin Types.tid b/editions/tw5.com/tiddlers/plugins/Plugin Types.tid similarity index 100% rename from editions/tw5.com/tiddlers/Plugin Types.tid rename to editions/tw5.com/tiddlers/plugins/Plugin Types.tid diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index 4a98ceea8..83ee7de91 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -1,15 +1,20 @@ created: 20150330155120127 -modified: 20190609154450433 +modified: 20191014091943444 tags: [[Working with TiddlyWiki]] title: Performance type: text/vnd.tiddlywiki TiddlyWiki ships with defaults that are designed to get the best out of modern devices from smartphones to desktop computers. If you need to work on older, less powerful devices, or work with large amounts of content, there are a few steps you can take to improve performance. +!! Usage + * ''Avoid the "Recent" tab''. It is computationally slow to generate and update in response to tiddler changes. * ''Use the "Vanilla" theme''. The default "Snow White" theme includes visual effects like shadows, transparency and blurring that can be slow to render on older devices * ''Avoid large tiddlers''. Large bitmaps can significantly slow TiddlyWiki's performance. For example, an image taken with a modern smartphone will often be 5MB or more. Use ExternalImages whenever possible * ''Don't have too many tiddlers open at once''. Every tiddler you have open will require processing to keep it up to date as the store changes (for example, while you type into a draft tiddler). It is particularly easy when using zoomin story view to end up with dozens of tiddlers listed in the ''Open'' tab in the sidebar. Get into the habit of periodically closing all open tiddlers with the <<.icon $:/core/images/close-all-button>> ''close all'' button + +!! WikiText + * ''Use the built-in performance instrumentation''. Studying the [[performance instrumentation|Performance Instrumentation]] results can help highlight performance problems * Take advantage of indexed filter operators. The following constructions at the start of a filter run will be optimised to run many times faster than otherwise: ** `[all[tiddlers]tag[x]...` @@ -22,4 +27,5 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d ** `[all[shadows+tiddlers]field:y[x]...` ** Note that the field indexer currently defaults to indexing field values of less than 128 characters; longer values can still be searched for, but no index will be constructed ** Also note that the “field” operator is also used when the operator name is a fieldname, so, for example, `[all[shadows+tiddlers]caption[x]...` is optimised. +* Use the [[throttling|RefreshThrottling]] feature of the RefreshMechanism judiciously From 73bb27fd7753f980c27daf7a460401c27b910db7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 14 Oct 2019 13:19:08 +0100 Subject: [PATCH 0382/2376] Tweak autofocus text in control panel Also made the trailing punctuation more consistent --- core/language/en-GB/ControlPanel.multids | 26 ++++++++++++------------ core/ui/ControlPanel/Basics.tid | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 802d9284b..99a526b9f 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -4,27 +4,27 @@ Advanced/Caption: Advanced Advanced/Hint: Internal information about this TiddlyWiki Appearance/Caption: Appearance Appearance/Hint: Ways to customise the appearance of your TiddlyWiki. -Basics/AnimDuration/Prompt: Animation duration: -Basics/AutoFocus/Prompt: Default ~AutoFocus field: +Basics/AnimDuration/Prompt: Animation duration +Basics/AutoFocus/Prompt: Default focus field for new tiddlers Basics/Caption: Basics Basics/DefaultTiddlers/BottomHint: Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">retain story ordering</$button> -Basics/DefaultTiddlers/Prompt: Default tiddlers: -Basics/DefaultTiddlers/TopHint: Choose which tiddlers are displayed at startup: +Basics/DefaultTiddlers/Prompt: Default tiddlers +Basics/DefaultTiddlers/TopHint: Choose which tiddlers are displayed at startup Basics/Language/Prompt: Hello! Current language: Basics/NewJournal/Title/Prompt: Title of new journal tiddlers Basics/NewJournal/Text/Prompt: Text for new journal tiddlers Basics/NewJournal/Tags/Prompt: Tags for new journal tiddlers Basics/NewTiddler/Title/Prompt: Title of new tiddlers Basics/NewTiddler/Tags/Prompt: Tags for new tiddlers -Basics/OverriddenShadowTiddlers/Prompt: Number of overridden shadow tiddlers: -Basics/ShadowTiddlers/Prompt: Number of shadow tiddlers: -Basics/Subtitle/Prompt: Subtitle: -Basics/SystemTiddlers/Prompt: Number of system tiddlers: -Basics/Tags/Prompt: Number of tags: -Basics/Tiddlers/Prompt: Number of tiddlers: -Basics/Title/Prompt: Title of this ~TiddlyWiki: -Basics/Username/Prompt: Username for signing edits: -Basics/Version/Prompt: ~TiddlyWiki version: +Basics/OverriddenShadowTiddlers/Prompt: Number of overridden shadow tiddlers +Basics/ShadowTiddlers/Prompt: Number of shadow tiddlers +Basics/Subtitle/Prompt: Subtitle +Basics/SystemTiddlers/Prompt: Number of system tiddlers +Basics/Tags/Prompt: Number of tags +Basics/Tiddlers/Prompt: Number of tiddlers +Basics/Title/Prompt: Title of this ~TiddlyWiki +Basics/Username/Prompt: Username for signing edits +Basics/Version/Prompt: ~TiddlyWiki version EditorTypes/Caption: Editor Types EditorTypes/Editor/Caption: Editor EditorTypes/Hint: These tiddlers determine which editor is used to edit specific tiddler types. diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index b364c05bb..0e90ca427 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -25,7 +25,7 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |{{$:/config/NewTiddler/Tags||$:/core/ui/EditTemplate/tags}} | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | |<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |{{$:/config/NewJournal/Tags||$:/core/ui/EditTemplate/tags}} | -|<<lingo AutoFocus/Prompt>> |{{$:/snippets/minifocusswitcher}} | +|<$link to="$:/config/AutoFocus"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | |<<lingo Tags/Prompt>> |<<show-filter-count "[tags[]sort[title]]">> | From ac66d863aab3dfc2f9f760e6bda64e9b6bee4ced Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 14 Oct 2019 13:19:27 +0100 Subject: [PATCH 0383/2376] Simplify GitHub fork ribbon plugin metadata --- plugins/tiddlywiki/github-fork-ribbon/plugin.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/github-fork-ribbon/plugin.info b/plugins/tiddlywiki/github-fork-ribbon/plugin.info index fdef00d7e..0e8df69d5 100644 --- a/plugins/tiddlywiki/github-fork-ribbon/plugin.info +++ b/plugins/tiddlywiki/github-fork-ribbon/plugin.info @@ -2,6 +2,6 @@ "title": "$:/plugins/tiddlywiki/github-fork-ribbon", "name": "GitHub Fork Ribbon", "description": "GitHub-inspired corner ribbon", - "author": "Simon Whitaker, adapted for TiddlyWiki by JeremyRuston", + "author": "Simon Whitaker", "list": "readme usage" } From 00974be82d85be51ba62307f64f22db38bb577ab Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 14 Oct 2019 13:19:40 +0100 Subject: [PATCH 0384/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.22.tid | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index e7b47d2c7..b1d91e7fa 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -21,17 +21,31 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * Improved Dutch translation +! Usability Improvements + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4238]] support for specifying the field that should receive focus when editing or creating a tiddler +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4293]] ([[and here|https://github.com/Jermolene/TiddlyWiki5/pull/4296]]) spacing for page control buttons +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/9395d7567179c436d0e8ac26fc976d717eae7f50]] display of icons in documentation +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4314]] support in control panel for specifying the tags for new tiddlers and journals + ! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6089c4de2921df0f76f605f1830fb2c04548f73c]] support for RefreshThrottling via the `throttle.refresh` field * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1150c87edb7478af6cc943eb0ef52fdf3051c121]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/8c894612914e21cf941a1daa953538c28ce91d8e]]) new `[is[binary]]` operand for the [[is Operator]] * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/68163684a2e57108e160295e445c194268b873c5]] usage of `publishFilter` in save templates -- see SavingMechanism +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/89716bb81d68b9c68d3c0fd2f2de96afad1b086a]] CSS class identifying the tiddler body editor +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e9211b0eee8e0b081f9f1597bde6673bf4c55d5c]] CSS classes to identify sidebar tabsets +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4208]] normalize.css from v3.0.0 to v8.0.1 ! Bug Fixes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4291]] bug with deletes failing when lazy loading used under Node.js * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4243]] problem with the [[GitLab saver|Saving to a Git service]] * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4237]] bug with permaview button when placed above the search box * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/a054d100e73db95071299e92c4321c2aa8e42382]] usage of ''count'' parameter of [[WidgetMessage: tm-edit-text-operation]] * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4284]] bug with toc-selective-expandable macro still showing disclosure arrow despite excluding tiddlers +* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/81f1e6af4e5920c6ff41e7f08171bfddc1b26dfc]] erroneous word break setting for vertical tabs +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/d30eacc6520971c95bdabf24f4c4122534d9414a]] problem with programmatically deselecting entries from the SelectWidget in multiple selection mode ! Contributors From 7af24d217a0f32f3da30edd692a919f846354a6f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 14 Oct 2019 14:57:28 +0200 Subject: [PATCH 0385/2376] Make tags in controlpanel animate (#4320) --- core/ui/ControlPanel/Basics.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 0e90ca427..77256ba88 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -22,9 +22,9 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag="textarea" tiddler="$:/DefaultTiddlers" class="tc-edit-texteditor"/><br>//<<lingo DefaultTiddlers/BottomHint>>// | |<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | -|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |{{$:/config/NewTiddler/Tags||$:/core/ui/EditTemplate/tags}} | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | -|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |{{$:/config/NewJournal/Tags||$:/core/ui/EditTemplate/tags}} | +|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$list filter="[[$:/config/NewTiddler/Tags]]" template="$:/core/ui/EditTemplate/tags"/> | +|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$list filter="[[$:/config/NewJournal/Tags]]" template="$:/core/ui/EditTemplate/tags"/> | |<$link to="$:/config/AutoFocus"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | From 45def4def441554a06c3e17742adc29a17d2a13c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 14 Oct 2019 14:57:45 +0200 Subject: [PATCH 0386/2376] Fix focus in fields editTemplate (#4321) the focus was set to the wrong field --- core/ui/EditTemplate/fields.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 6923fac17..f65454a17 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -40,7 +40,7 @@ $value={{$:/temp/newfieldvalue}}/> <td class="tc-edit-field-name"> <$text text=<<currentField>>/>:</td> <td class="tc-edit-field-value"> -<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/> +<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/> </td> <td class="tc-edit-field-remove"> <$button class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}> @@ -61,7 +61,7 @@ $value={{$:/temp/newfieldvalue}}/> <<lingo Fields/Add/Prompt>>  </em> <span class="tc-edit-field-add-name"> -<$edit-text tiddler="$:/temp/newfieldname" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}}/> +<$edit-text tiddler="$:/temp/newfieldname" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/> </span>  <$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> From 3c365a2567ebfe12d78b0aed77a40969cd38563e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 14 Oct 2019 15:31:57 +0200 Subject: [PATCH 0387/2376] EditTemplate optimizations (#4104) #4093 and #4100 are bundled in this PR * qualified state-tiddlers for the tags input and fieldname + fieldvalue inputs * newTagName, newFieldNameTiddler and newFieldValueTiddler variables defined in EditTemplate (all qualified through `qualify` macro) * save-tiddler-actions macro in the EditTemplate (reused by the save-tiddler button) * enter (configurable) in the fieldvalue field adds the field and sets focus to the next fieldname input Edit: * storyview="pop" for fields list --- core/language/en-GB/EditTemplate.multids | 2 +- core/ui/EditTemplate.tid | 18 +++++------ core/ui/EditTemplate/fields.tid | 33 +++++++++++++++----- core/ui/EditToolbar/save.tid | 10 +++--- core/wiki/config/ShortcutInfo.multids | 1 + core/wiki/config/shortcuts/shortcuts.multids | 1 + core/wiki/macros/tag-picker.tid | 22 +++++++------ 7 files changed, 53 insertions(+), 34 deletions(-) diff --git a/core/language/en-GB/EditTemplate.multids b/core/language/en-GB/EditTemplate.multids index 90ee4975f..31f18765a 100644 --- a/core/language/en-GB/EditTemplate.multids +++ b/core/language/en-GB/EditTemplate.multids @@ -8,7 +8,7 @@ Field/Remove/Hint: Remove field Field/Dropdown/Caption: field list Field/Dropdown/Hint: Show field list Fields/Add/Button: add -Fields/Add/Button/Hint: add field +Fields/Add/Button/Hint: Add the new field to the tiddler Fields/Add/Name/Placeholder: field name Fields/Add/Prompt: Add a new field: Fields/Add/Value/Placeholder: field value diff --git a/core/ui/EditTemplate.tid b/core/ui/EditTemplate.tid index 273f06c0e..f3e82fa8f 100644 --- a/core/ui/EditTemplate.tid +++ b/core/ui/EditTemplate.tid @@ -1,11 +1,11 @@ title: $:/core/ui/EditTemplate -\define actions() -<$action-sendmessage $message="tm-add-tag" $param={{$:/temp/NewTagName}}/> -<$action-deletetiddler $tiddler="$:/temp/NewTagName"/> -<$action-sendmessage $message="tm-add-field" $name={{$:/temp/newfieldname}} $value={{$:/temp/newfieldvalue}}/> -<$action-deletetiddler $tiddler="$:/temp/newfieldname"/> -<$action-deletetiddler $tiddler="$:/temp/newfieldvalue"/> +\define save-tiddler-actions() +<$action-sendmessage $message="tm-add-tag" $param={{{ [<newTagNameTiddler>get[text]] }}}/> +<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> +<$action-sendmessage $message="tm-add-field" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/> +<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/> +<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/> <$action-sendmessage $message="tm-save-tiddler"/> \end \define frame-classes() @@ -13,9 +13,9 @@ tc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerCl \end <div class=<<frame-classes>> data-tiddler-title=<<currentTiddler>>> <$fieldmangler> -<$set name="storyTiddler" value=<<currentTiddler>>> +<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify "$:/temp/NewTagName">> newFieldNameTiddler=<<qualify "$:/temp/NewFieldName">> newFieldValueTiddler=<<qualify "$:/temp/NewFieldValue">>> <$keyboard key="((cancel-edit-tiddler))" message="tm-cancel-tiddler"> -<$keyboard key="((save-tiddler))" actions=<<actions>>> +<$keyboard key="((save-tiddler))" actions=<<save-tiddler-actions>>> <$list filter="[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]" variable="listItem"> <$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"> <$transclude tiddler=<<listItem>>/> @@ -23,6 +23,6 @@ tc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerCl </$list> </$keyboard> </$keyboard> -</$set> +</$vars> </$fieldmangler> </div> diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index f65454a17..5368404a3 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -10,15 +10,26 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ [[hide]] -[title{$(config-title)$}] \end +\define current-tiddler-new-field-selector() +[data-tiddler-title="$(currentTiddlerCSSescaped)$"] .tc-edit-field-add-name input +\end + +\define new-field-actions() +<$action-sendmessage $message="tm-add-field" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/> +<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/> +<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/> +<$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/> +\end + \define new-field() -<$vars name={{$:/temp/newfieldname}}> +<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}> <$reveal type="nomatch" text="" default=<<name>>> <$button tooltip=<<lingo Fields/Add/Button/Hint>>> <$action-sendmessage $message="tm-add-field" $name=<<name>> -$value={{$:/temp/newfieldvalue}}/> -<$action-deletetiddler $tiddler="$:/temp/newfieldname"/> -<$action-deletetiddler $tiddler="$:/temp/newfieldvalue"/> +$value={{{ [<newFieldValueTiddler>get[text]] }}}/> +<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/> +<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/> <<lingo Fields/Add/Button>> </$button> </$reveal> @@ -67,11 +78,12 @@ $value={{$:/temp/newfieldvalue}}/> <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> <div class="tc-block-dropdown tc-edit-type-dropdown"> <$set name="tv-show-missing-links" value="yes"> -<$linkcatcher to="$:/temp/newfieldname"> +<$linkcatcher to=<<newFieldNameTiddler>>> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/User>> </div> -<$list filter="[!is[shadow]!is[system]fields[]search:title{$:/temp/newfieldname}sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField"> +<$set name="newFieldName" value={{{ [<newFieldNameTiddler>get[text]] }}}> +<$list filter="[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField"> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> @@ -79,17 +91,22 @@ $value={{$:/temp/newfieldvalue}}/> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/System>> </div> -<$list filter="[fields[]search:title{$:/temp/newfieldname}sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField"> +<$list filter="[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField"> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> </$list> +</$set> </$linkcatcher> </$set> </div> </$reveal> <span class="tc-edit-field-add-value"> -<$edit-text tiddler="$:/temp/newfieldvalue" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}}/> +<$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}> +<$keyboard key="((add-field))" actions=<<new-field-actions>>> +<$edit-text tiddler=<<newFieldValueTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}}/> +</$keyboard> +</$set> </span>  <span class="tc-edit-field-add-button"> <$macrocall $name="new-field"/> diff --git a/core/ui/EditToolbar/save.tid b/core/ui/EditToolbar/save.tid index 8c5a81b01..cd69d7686 100644 --- a/core/ui/EditToolbar/save.tid +++ b/core/ui/EditToolbar/save.tid @@ -3,13 +3,9 @@ tags: $:/tags/EditToolbar caption: {{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}} description: {{$:/language/Buttons/Save/Hint}} +\define save-tiddler-button() <$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>> -<$action-sendmessage $message="tm-add-tag" $param={{$:/temp/NewTagName}}/> -<$action-deletetiddler $tiddler="$:/temp/NewTagName"/> -<$action-sendmessage $message="tm-add-field" $name={{$:/temp/newfieldname}} $value={{$:/temp/newfieldvalue}}/> -<$action-deletetiddler $tiddler="$:/temp/newfieldname"/> -<$action-deletetiddler $tiddler="$:/temp/newfieldvalue"/> -<$action-sendmessage $message="tm-save-tiddler"/> +<<save-tiddler-actions>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/done-button}} </$list> @@ -17,3 +13,5 @@ description: {{$:/language/Buttons/Save/Hint}} <span class="tc-btn-text"><$text text={{$:/language/Buttons/Save/Caption}}/></span> </$list> </$button></$fieldmangler> +\end +<<save-tiddler-button>> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 2c67ec29e..e1dd4e179 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -1,5 +1,6 @@ title: $:/config/ShortcutInfo/ +add-field: {{$:/language/EditTemplate/Fields/Add/Button/Hint}} advanced-search: {{$:/language/Buttons/AdvancedSearch/Hint}} bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 1d192df9a..1fbb9576b 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -1,5 +1,6 @@ title: $:/config/shortcuts/ +add-field: enter advanced-search: ctrl-shift-A cancel-edit-tiddler: escape excise: ctrl-E diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 2d36b2eb3..ce7738df0 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -2,14 +2,14 @@ title: $:/core/macros/tag-picker tags: $:/tags/Macro \define add-tag-actions() -<$action-sendmessage $message="tm-add-tag" $param={{$:/temp/NewTagName}}/> -<$action-deletetiddler $tiddler="$:/temp/NewTagName"/> +<$action-sendmessage $message="tm-add-tag" $param={{{ [<newTagNameTiddler>get[text]] }}}/> +<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> \end \define tag-button() <$button class="tc-btn-invisible" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> -<$action-deletetiddler $tiddler="$:/temp/NewTagName"/> +<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> <$macrocall $name="tag-pill" tag=<<tag>>/> </$button> \end @@ -18,13 +18,13 @@ tags: $:/tags/Macro <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> -<$edit-text tiddler="$:/temp/NewTagName" tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/> +<$edit-text tiddler=<<newTagNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/> </$keyboard> </span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> -<$set name="tag" value={{$:/temp/NewTagName}}> +<$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> <$button set="$:/temp/NewTagName" setTo="" class=""> <<add-tag-actions>> -<$action-deletetiddler $tiddler="$:/temp/NewTagName"/> +<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> {{$:/language/EditTemplate/Tags/Add/Button}} </$button> </$set> @@ -33,15 +33,17 @@ tags: $:/tags/Macro <div class="tc-block-dropdown-wrapper"> <$reveal state=<<qualify "$:/state/popup/tags-auto-complete">> type="nomatch" text="" default=""> <div class="tc-block-dropdown"> -<$list filter="[{$:/temp/NewTagName}minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$list filter="[tags[]!is[system]search:title{$:/temp/NewTagName}sort[]]" variable="tag"> +<$set name="newTagName" value={{{ [<newTagNameTiddler>get[text]] }}}> +<$list filter="[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$list filter="[tags[]!is[system]search:title<newTagName>sort[]]" variable="tag"> <<tag-button>> </$list></$list> <hr> -<$list filter="[{$:/temp/NewTagName}minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$list filter="[tags[]is[system]search:title{$:/temp/NewTagName}sort[]]" variable="tag"> +<$list filter="[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$list filter="[tags[]is[system]search:title<newTagName>sort[]]" variable="tag"> <<tag-button>> </$list></$list> +</$set> </div> </$reveal> </div> From 1cf2d0799d7027d58f4bdca857bc342dd778a330 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 14 Oct 2019 15:54:47 +0200 Subject: [PATCH 0388/2376] Fix field-name input (#4322) --- core/ui/EditTemplate/fields.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 5368404a3..3a6613cb4 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -72,7 +72,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <<lingo Fields/Add/Prompt>>  </em> <span class="tc-edit-field-add-name"> -<$edit-text tiddler="$:/temp/newfieldname" tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/> +<$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/> </span>  <$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> From 1bf8821bd84ac66de4c1623a63103cb6f0b73efb Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 17 Oct 2019 15:04:00 +0100 Subject: [PATCH 0389/2376] System icon: remove extraneous closing tag --- core/images/new-here-button.tid | 1 - 1 file changed, 1 deletion(-) diff --git a/core/images/new-here-button.tid b/core/images/new-here-button.tid index ce8fd31bd..333265220 100755 --- a/core/images/new-here-button.tid +++ b/core/images/new-here-button.tid @@ -10,5 +10,4 @@ tags: $:/tags/Image <rect x="96" y="80" width="16" height="48" rx="8"></rect> <rect x="80" y="96" width="48" height="16" rx="8"></rect> </g> - </g> </svg> \ No newline at end of file From 05a3e1ad36c2fb383dd4975a578f95e8a6c3f325 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 17 Oct 2019 18:07:13 +0100 Subject: [PATCH 0390/2376] Add language attribute to HTML tag --- core/templates/external-js/tiddlywiki5-external-js.html.tid | 2 +- core/templates/tiddlywiki5.html.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/templates/external-js/tiddlywiki5-external-js.html.tid b/core/templates/external-js/tiddlywiki5-external-js.html.tid index f4747e308..31e583c6c 100644 --- a/core/templates/external-js/tiddlywiki5-external-js.html.tid +++ b/core/templates/external-js/tiddlywiki5-external-js.html.tid @@ -2,7 +2,7 @@ title: $:/core/templates/tiddlywiki5-external-js.html \rules only filteredtranscludeinline transcludeinline <!doctype html> -{{$:/core/templates/MOTW.html}}<html> +{{$:/core/templates/MOTW.html}}<html lang="`<$text text={{{ [{$:/language}get[name]] }}}/>`"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <!--~~ Raw markup for the top of the head section ~~--> diff --git a/core/templates/tiddlywiki5.html.tid b/core/templates/tiddlywiki5.html.tid index 377e4fef5..ef5a7e1ea 100644 --- a/core/templates/tiddlywiki5.html.tid +++ b/core/templates/tiddlywiki5.html.tid @@ -2,7 +2,7 @@ title: $:/core/templates/tiddlywiki5.html <$set name="saveTiddlerAndShadowsFilter" filter="[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]"> `<!doctype html> -`{{$:/core/templates/MOTW.html}}`<html> +`{{$:/core/templates/MOTW.html}}`<html lang="`<$text text={{{ [{$:/language}get[name]] }}}/>`"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <!--~~ Raw markup for the top of the head section ~~--> From 6ca1e906591d4c6f63ad56d9d4931a012a346b17 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Fri, 18 Oct 2019 12:01:10 +0200 Subject: [PATCH 0391/2376] Fix #4327 table formatting problem introduced with normalize css 8.0.1 (#4328) --- themes/tiddlywiki/vanilla/base.tid | 3 +++ 1 file changed, 3 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 4fb297615..5d96d1cc9 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -237,6 +237,9 @@ table { caption-side: bottom; margin-top: 1em; margin-bottom: 1em; + /* next 2 elements needed, since normalize 8.0.1 */ + border-collapse: collapse; + border-spacing: 0; } table th, table td { From 588af44d4c2da1ae7596f180de5c0a511ff398be Mon Sep 17 00:00:00 2001 From: donmor <donmor3000@hotmail.com> Date: Sat, 19 Oct 2019 18:44:18 +0800 Subject: [PATCH 0392/2376] Scale embedded videos and audios to fit their container (#3943) * Update videoparser.js * Update audioparser.js * Update videoparser.js * Update audioparser.js --- core/modules/parsers/audioparser.js | 3 ++- core/modules/parsers/videoparser.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/modules/parsers/audioparser.js b/core/modules/parsers/audioparser.js index a34a49398..95380bf80 100644 --- a/core/modules/parsers/audioparser.js +++ b/core/modules/parsers/audioparser.js @@ -17,7 +17,8 @@ var AudioParser = function(type,text,options) { type: "element", tag: "audio", attributes: { - controls: {type: "string", value: "controls"} + controls: {type: "string", value: "controls"}, + style: {type: "string", value: "width: 100%; object-fit: contain"} } }, src; diff --git a/core/modules/parsers/videoparser.js b/core/modules/parsers/videoparser.js index c0ab2d603..cbc56381f 100644 --- a/core/modules/parsers/videoparser.js +++ b/core/modules/parsers/videoparser.js @@ -17,7 +17,8 @@ var VideoParser = function(type,text,options) { type: "element", tag: "video", attributes: { - controls: {type: "string", value: "controls"} + controls: {type: "string", value: "controls"}, + style: {type: "string", value: "width: 100%; object-fit: contain"} } }, src; From 46c90af308015242fa0314d85f1524727e2aa7e5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 20 Oct 2019 10:45:27 +0100 Subject: [PATCH 0393/2376] 2nd attempt to fix overflowing content in vertical tabs Previously we'd tried to fix it with word-break: break-word, but that broke other things (see 81f1e6af4e5920c6ff41e7f08171bfddc1b26dfc). This overflow: auto approach appears to be best practice. --- themes/tiddlywiki/vanilla/base.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 5d96d1cc9..d747f7073 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1816,6 +1816,7 @@ html body.tc-body.tc-single-tiddler-window { border-left: 1px solid <<colour tab-border>>; -webkit-flex: 1 0 70%; flex: 1 0 70%; + overflow: auto; } .tc-sidebar-lists .tc-tab-buttons { From 423a942a8f0dd5c25138bcb3a2a622fab0d490cb Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 20 Oct 2019 18:00:08 +0200 Subject: [PATCH 0394/2376] Fix newTagNameTiddler being undefined in ControlPanel (#4326) * fix newTagNameTiddler being undefined in ControlPanel * Update Basics.tid * prevent newTagNameTiddler being undefined * Update Basics.tid * Update tag-picker.tid * Update tag-picker.tid --- core/wiki/macros/tag-picker.tid | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index ce7738df0..67194a147 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -14,7 +14,7 @@ tags: $:/tags/Macro </$button> \end -\define tag-picker() +\define tag-picker-inner() <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> @@ -48,3 +48,10 @@ tags: $:/tags/Macro </$reveal> </div> \end +\define tag-picker() +<$list filter="[<newTagNameTiddler>match[]]" emptyMessage=<<tag-picker>>> +<$set name="newTagNameTiddler" value=<<qualify "$:/temp/NewTagName">>> +<<tag-picker>> +</$set> +</$list> +\end From 793d84bcb1bc52ee77c49090268dd242017cdaa9 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 20 Oct 2019 19:08:19 +0200 Subject: [PATCH 0395/2376] Fix typos in tag-picker (#4336) ... sorry @Jermolene --- core/wiki/macros/tag-picker.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 67194a147..ac125f068 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -49,9 +49,9 @@ tags: $:/tags/Macro </div> \end \define tag-picker() -<$list filter="[<newTagNameTiddler>match[]]" emptyMessage=<<tag-picker>>> +<$list filter="[<newTagNameTiddler>match[]]" emptyMessage=<<tag-picker-inner>>> <$set name="newTagNameTiddler" value=<<qualify "$:/temp/NewTagName">>> -<<tag-picker>> +<<tag-picker-inner>> </$set> </$list> \end From e114fed3f9e12fb7c25b1369d7d132a47a0b8db8 Mon Sep 17 00:00:00 2001 From: Nils-Hero Lindemann <nilsherolindemann@gmail.com> Date: Sun, 20 Oct 2019 19:22:22 +0200 Subject: [PATCH 0396/2376] Replace div with span in colour picker (#4333) --- core/wiki/macros/colour-picker.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/macros/colour-picker.tid b/core/wiki/macros/colour-picker.tid index af74577e3..04f0c4b6f 100644 --- a/core/wiki/macros/colour-picker.tid +++ b/core/wiki/macros/colour-picker.tid @@ -15,7 +15,7 @@ $(colour-picker-update-recent)$ $actions$ -<div style="background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;"/> +<span style="display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;"/> </$button> \end @@ -44,7 +44,7 @@ $actions$ --- -<$edit-text tiddler="$:/config/ColourPicker/New" tag="input" default="" placeholder=""/> +<$edit-text tiddler="$:/config/ColourPicker/New" tag="input" default="" placeholder=""/> <$edit-text tiddler="$:/config/ColourPicker/New" type="color" tag="input"/> <$set name="colour-picker-value" value={{$:/config/ColourPicker/New}}> <$macrocall $name="colour-picker-inner" actions="""$actions$"""/> From 6fa3e21116338e5fc7b59db2a327eedb04ba9288 Mon Sep 17 00:00:00 2001 From: Nils-Hero Lindemann <nilsherolindemann@gmail.com> Date: Thu, 24 Oct 2019 10:15:52 +0200 Subject: [PATCH 0397/2376] Replace '<<...>>' with a macrocall widget (#4346) ... because there is another macrocall inside. This was introduced by the commit 'Fix sizes of SVG icons in documentation' (SHA: 9395d7567179c436d0e8ac26fc976d717eae7f50) where this probably slipped through in a regular expression replacement session. I searched through the codebase and the other replacements of this type are ok. --- editions/tw5.com/tiddlers/howtos/Using Stamp.tid | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid index ce639e087..dc9cebfe4 100644 --- a/editions/tw5.com/tiddlers/howtos/Using Stamp.tid +++ b/editions/tw5.com/tiddlers/howtos/Using Stamp.tid @@ -13,8 +13,7 @@ You can insert preconfigured snippets of text to use stamp from toolbar. Click ' # Type some text as snippet for the tiddler, add a caption for the name as shown in the menu # Click the <<.icon $:/core/images/done-button>> ''ok'' button -<<.tip """''Tip:'' You can also create a snippet tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar, and add tag ''~$:/tags/TextEditor/Snippet''""">> - +<$macrocall $name=".tip" _="""''Tip:'' You can also create a snippet tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar, and add tag ''~$:/tags/TextEditor/Snippet''""" /> !!<<.from-version "5.1.20">> Adding a prefix and/or suffix to a selection From 9e9944b76d9e71ea08d504b864f17ef25f48a6be Mon Sep 17 00:00:00 2001 From: Matt Lauber <github@mklauber.com> Date: Thu, 24 Oct 2019 05:02:20 -0400 Subject: [PATCH 0398/2376] Correct the jsonstringify documentation (#4344) The jsonstringify substitution table does not list all substitutions, and it listed `'` as being replaced when it's not. This updates the table based on the code at https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/utils/utils.js#L537 --- .../tw5.com/tiddlers/filters/jsonstringify Operator.tid | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid b/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid index 9031b158f..d9fd288b7 100644 --- a/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid +++ b/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid @@ -15,10 +15,12 @@ The following substitutions are made: |!Character |!Replacement | |`\` |`\\` | -|`"` |`\\` | -|`'` |`\\` | +|`"` |`\\"` | |`\r` (carriage return) |`\\r` | |`\n` (line feed) |`\\n` | +|`\x08` (backpsace) |`\\b` | +|`\x0c` (formfield) |`\\f` | +|`\t` (tab) |`\\t` | |Characters from 0x00 to 0x1f |`\\x##` where ## is two hex digits | |Characters from 0x80 to 0xffff |`\\u####` where #### is four hex digits | From 14e799d36b5e5e6908db92e20d7a0b91157c70b1 Mon Sep 17 00:00:00 2001 From: Matt Lauber <github@mklauber.com> Date: Thu, 24 Oct 2019 05:03:05 -0400 Subject: [PATCH 0399/2376] Add discord to forums tiddler. (#4343) --- editions/tw5.com/tiddlers/community/Forums.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/community/Forums.tid b/editions/tw5.com/tiddlers/community/Forums.tid index cd10ffe20..41bbc5210 100644 --- a/editions/tw5.com/tiddlers/community/Forums.tid +++ b/editions/tw5.com/tiddlers/community/Forums.tid @@ -13,7 +13,8 @@ The ~TiddlyWiki discussion groups are mailing lists for talking about ~TiddlyWik ** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywiki@googlegroups.com/]] * Watch recordings of our regular [[TiddlyWiki Hangouts]] * Follow [[@TiddlyWiki on Twitter|http://twitter.com/TiddlyWiki]] for the latest news -* ''New: Join us on our live chat at https://gitter.im/TiddlyWiki/public !'' +* New: Join us on our live chat at https://gitter.im/TiddlyWiki/public ! +* There is also a discord available at https://discord.gg/HFFZVQ8 ! Developers From 43d18e74d596356b8badf7bb3d55ba7fe655562a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 25 Oct 2019 10:02:57 +0100 Subject: [PATCH 0400/2376] Syncer: add hidden setting for disabling lazy loading --- core/modules/syncer.js | 3 ++- .../Hidden Setting_ Disable Lazy Loading.tid | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Lazy Loading.tid diff --git a/core/modules/syncer.js b/core/modules/syncer.js index e32fd0b9d..0b84be750 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -21,6 +21,7 @@ Syncer.prototype.titleIsReadOnly = "$:/status/IsReadOnly"; Syncer.prototype.titleUserName = "$:/status/UserName"; Syncer.prototype.titleSyncFilter = "$:/config/SyncFilter"; Syncer.prototype.titleSyncPollingInterval = "$:/config/SyncPollingInterval"; +Syncer.prototype.titleSyncDisableLazyLoading = "$:/config/SyncDisableLazyLoading"; Syncer.prototype.titleSavedNotification = "$:/language/Notifications/Save/Done"; Syncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer Syncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s... @@ -87,7 +88,7 @@ function Syncer(options) { }); } // Listen out for lazyLoad events - if(!this.disableUI) { + if(!this.disableUI && $tw.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== "yes") { this.wiki.addEventListener("lazyLoad",function(title) { self.handleLazyLoadEvent(title); }); diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Lazy Loading.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Lazy Loading.tid new file mode 100644 index 000000000..800fea083 --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Lazy Loading.tid @@ -0,0 +1,9 @@ +created: 20191025100113266 +modified: 20191025100113266 +tags: [[Hidden Settings]] +title: Hidden Setting: Disable Lazy Loading +type: text/vnd.tiddlywiki + +LazyLoading can be disabled by setting this value to `yes` + +$:/config/SyncDisableLazyLoading From e84c422e5091c02f55db4027faa9ba840e2aee6c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 2 Nov 2019 09:31:15 +0000 Subject: [PATCH 0401/2376] Range widget: fix refreshing The range widget wasn't refreshing correctly when the underlying tiddler value changed --- core/modules/widgets/range.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/core/modules/widgets/range.js b/core/modules/widgets/range.js index 591dab482..eee536487 100644 --- a/core/modules/widgets/range.js +++ b/core/modules/widgets/range.js @@ -47,11 +47,9 @@ RangeWidget.prototype.render = function(parent,nextSibling) { this.inputDomNode.setAttribute("step", this.increment); } this.inputDomNode.value = this.getValue(); - - // Add a click event handler $tw.utils.addEventListeners(this.inputDomNode,[ - {name: "input", handlerObject: this, handlerMethod: "handleChangeEvent"} + {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"} ]); // Insert the label into the DOM and render any children parent.insertBefore(this.inputDomNode,nextSibling); @@ -60,10 +58,11 @@ RangeWidget.prototype.render = function(parent,nextSibling) { RangeWidget.prototype.getValue = function() { var tiddler = this.wiki.getTiddler(this.tiddlerTitle), + fieldName = this.tiddlerField || "text", value = this.defaultValue; if(tiddler) { - if($tw.utils.hop(tiddler.fields,this.tiddlerField)) { - value = tiddler.fields[this.tiddlerField] || ""; + if($tw.utils.hop(tiddler.fields,fieldName)) { + value = tiddler.fields[fieldName] || ""; } else { value = this.defaultValue || ""; } @@ -71,8 +70,10 @@ RangeWidget.prototype.getValue = function() { return value; }; -RangeWidget.prototype.handleChangeEvent = function(event) { - this.wiki.setText(this.tiddlerTitle ,this.tiddlerField, null,this.inputDomNode.value); +RangeWidget.prototype.handleInputEvent = function(event) { + if(this.getValue() !== this.inputDomNode.value) { + this.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value); + } }; /* @@ -102,7 +103,10 @@ RangeWidget.prototype.refresh = function(changedTiddlers) { } else { var refreshed = false; if(changedTiddlers[this.tiddlerTitle]) { - this.inputDomNode.checked = this.getValue(); + var value = this.getValue(); + if(this.inputDomNode.value !== value) { + this.inputDomNode.value = value; + } refreshed = true; } return this.refreshChildren(changedTiddlers) || refreshed; From 16c1cbee292604b2b8be36a15d5828893d132b20 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 2 Nov 2019 09:31:36 +0000 Subject: [PATCH 0402/2376] Comment plugin: Add link to top post --- .../comments/header-view-template-segment.tid | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/comments/header-view-template-segment.tid b/plugins/tiddlywiki/comments/header-view-template-segment.tid index 09f45d01d..2569b7947 100644 --- a/plugins/tiddlywiki/comments/header-view-template-segment.tid +++ b/plugins/tiddlywiki/comments/header-view-template-segment.tid @@ -2,15 +2,39 @@ title: $:/plugins/tiddlywiki/comments/header-view-template-segment tags: $:/tags/ViewTemplate list-before: $:/core/ui/ViewTemplate/body +\define display-original-comment() +<$link><$text text=<<currentTiddler>>/></$link> +\end + +\define find-original-comment(exclude) +<$list filter="[<currentTiddler>role[comment]]" emptyMessage=<<display-original-comment>> variable="ignore"> +<$list filter="[list<currentTiddler>sort[title]] -[enlist<__exclude__>]"> +<$set name="newExclude" filter="[enlist<__exclude__>] [<currentTiddler>]"> +<$macrocall $name="find-original-comment" exclude=<<newExclude>>/> +</$set> +</$list> +</$list> +\end + <$list filter="[all[current]role[comment]]" variable="ignore"> <div class="tc-is-comment-header"> -This tiddler is a comment on: -<ul> +<p> +This tiddler a comment on <$list filter="[list<currentTiddler>sort[title]]"> +<<find-original-comment>>  +</$list> +</p> +<$list filter="[list<currentTiddler>role[comment]sort[title]limit[1]]" variable="ignore"> +<p> +Parent comments: +</p> +<ul> +<$list filter="[list<currentTiddler>role[comment]sort[title]]"> <li> <$link to=<<currentTiddler>>><$text text=<<currentTiddler>>/></$link> </li> </$list> </ul> +</$list> </div> </$list> From 7beee4f9ce04dbdac37032610056a0042d3987ec Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 2 Nov 2019 12:37:07 +0000 Subject: [PATCH 0403/2376] Fix comment plugin typo --- plugins/tiddlywiki/comments/header-view-template-segment.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/comments/header-view-template-segment.tid b/plugins/tiddlywiki/comments/header-view-template-segment.tid index 2569b7947..8dd503955 100644 --- a/plugins/tiddlywiki/comments/header-view-template-segment.tid +++ b/plugins/tiddlywiki/comments/header-view-template-segment.tid @@ -19,7 +19,7 @@ list-before: $:/core/ui/ViewTemplate/body <$list filter="[all[current]role[comment]]" variable="ignore"> <div class="tc-is-comment-header"> <p> -This tiddler a comment on +This tiddler is a comment on <$list filter="[list<currentTiddler>sort[title]]"> <<find-original-comment>>  </$list> From df85281420cccc06870e7dce2aafddf2327708a1 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 2 Nov 2019 13:19:00 +0000 Subject: [PATCH 0404/2376] Improve docs on installing plugins under Node.js --- ...nstalling TiddlyWiki Prerelease on Node.js.tid | 4 ++-- .../Installing custom plugins on Node.js.tid | 15 +++++++++++++++ .../tiddlers/nodejs/TiddlyWiki on Node.js.tid | 6 ++---- ...nstalling a plugin from the plugin library.tid | 6 ++++-- 4 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid diff --git a/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki Prerelease on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki Prerelease on Node.js.tid index 827681e21..2b77569b6 100644 --- a/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki Prerelease on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki Prerelease on Node.js.tid @@ -1,6 +1,6 @@ created: 20150926162849519 -modified: 20180701185329863 -tags: [[Installing TiddlyWiki on Node.js]] +modified: 20191022095509822 +tags: [[TiddlyWiki on Node.js]] title: Installing TiddlyWiki Prerelease on Node.js type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid new file mode 100644 index 000000000..44e49d772 --- /dev/null +++ b/editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid @@ -0,0 +1,15 @@ +created: 20191022095653896 +modified: 20191102131824766 +tags: [[TiddlyWiki on Node.js]] +title: Installing custom plugins on Node.js +type: text/vnd.tiddlywiki + +There are several ways in which custom plugins that are not part of TiddlyWiki's plugin library can be installed when using TiddlyWiki under Node.js. (See [[Installing a plugin from the plugin library]] for instructions on installing plugins from the library). + +* Arrange the PluginFolders containing the plugins in a convenient shared location and then use [[environment variables|Environment Variables on Node.js]] to tell TiddlyWiki to search those folders. The plugins can be referenced in `tiddlywiki.info` by their name (e.g. `tiddlytools/magic`) +* Place the PluginFolders containing the plugins in a `plugins` folder within the [[wiki folder|TiddlyWikiFolders]] +* Depending on how TiddlyWiki itself has been installed, plugins can also be installed by copying the plugin folders into the `plugins` folder of the repository. This is only recommended if working with a forked copy of the repo. It is not recommended if TiddlyWiki has been installed with npm because npm is liable to overwrite the installation when performing an update + +Note that including a plugin as an ordinary tiddler (e.g. by dragging and dropping a plugin into the browser) will result in the plugin only being active in the browser, and not available under Node.js. + + diff --git a/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid index fe4615a3a..6966debcc 100644 --- a/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid @@ -1,5 +1,5 @@ created: 20131129094353704 -modified: 20150412185457193 +modified: 20191022095309607 tags: Platforms title: TiddlyWiki on Node.js type: text/vnd.tiddlywiki @@ -18,6 +18,4 @@ There are a few file system limitations you should be aware of that are related For more information see: -* [[Installing TiddlyWiki on Node.js]] -* [[Using TiddlyWiki on Node.js]] -* [[Upgrading TiddlyWiki on Node.js]] +<<list-links "[tag[TiddlyWiki on Node.js]]">> diff --git a/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid b/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid index 6edc5ad13..baf9bdbe1 100644 --- a/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid +++ b/editions/tw5.com/tiddlers/plugins/Installing a plugin from the plugin library.tid @@ -1,6 +1,6 @@ created: 20160107222352710 -modified: 20160720145836265 -tags: Plugins +modified: 20191022095637710 +tags: [[TiddlyWiki on Node.js]] Plugins title: Installing a plugin from the plugin library type: text/vnd.tiddlywiki @@ -46,3 +46,5 @@ Follow these instructions when using TiddlyWiki under Node.js: ] } ``` + +See also [[Installing custom plugins on Node.js]]. \ No newline at end of file From bfbd886a8bbf2f6ce147ea526eec2098357d3ae7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 4 Nov 2019 18:56:22 +0000 Subject: [PATCH 0405/2376] Add "index" attribute to range widget --- core/modules/widgets/range.js | 21 +++++++++++++------ .../tw5.com/tiddlers/widgets/RangeWidget.tid | 13 ++++++------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/core/modules/widgets/range.js b/core/modules/widgets/range.js index eee536487..d5ab2c785 100644 --- a/core/modules/widgets/range.js +++ b/core/modules/widgets/range.js @@ -61,10 +61,14 @@ RangeWidget.prototype.getValue = function() { fieldName = this.tiddlerField || "text", value = this.defaultValue; if(tiddler) { - if($tw.utils.hop(tiddler.fields,fieldName)) { - value = tiddler.fields[fieldName] || ""; + if(this.tiddlerIndex) { + value = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue || ""); } else { - value = this.defaultValue || ""; + if($tw.utils.hop(tiddler.fields,fieldName)) { + value = tiddler.fields[fieldName] || ""; + } else { + value = this.defaultValue || ""; + } } } return value; @@ -72,7 +76,11 @@ RangeWidget.prototype.getValue = function() { RangeWidget.prototype.handleInputEvent = function(event) { if(this.getValue() !== this.inputDomNode.value) { - this.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value); + if(this.tiddlerIndex) { + this.wiki.setText(this.tiddlerTitle,"",this.tiddlerIndex,this.inputDomNode.value); + } else { + this.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value); + } } }; @@ -83,6 +91,7 @@ RangeWidget.prototype.execute = function() { // Get the parameters from the attributes this.tiddlerTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler")); this.tiddlerField = this.getAttribute("field"); + this.tiddlerIndex = this.getAttribute("index"); this.minValue = this.getAttribute("min"); this.maxValue = this.getAttribute("max"); this.increment = this.getAttribute("increment"); @@ -97,7 +106,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ RangeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes["default"] || changedAttributes["class"]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes["default"] || changedAttributes["class"]) { this.refreshSelf(); return true; } else { @@ -115,4 +124,4 @@ RangeWidget.prototype.refresh = function(changedTiddlers) { exports.range = RangeWidget; -})(); +})(); \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid index dcb793f29..8449449e5 100644 --- a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid @@ -1,6 +1,6 @@ caption: range created: 20171102134825376 -modified: 20180425132848231 +modified: 20191104185454972 tags: Widgets title: RangeWidget type: text/vnd.tiddlywiki @@ -15,11 +15,12 @@ The content of the `<$range>` widget is ignored. |!Attribute |!Description | |tiddler |Title of the tiddler to manipulate (defaults to the [[current tiddler|Current Tiddler]]) | -|field |The field of the //tiddler// bound to the radio button| -|min |The minimum value to be able to be set by the `<$range>` widget.| -|max |The maximum value to be able to be set by the `<$range>` widget.| -|increment |The minimum amount by which a value may be changed. Defaults to 1.| -|default |The default value displayed if the field is missing or empty.| +|field |The field of the //tiddler// bound to the radio button | +|index|<<.from-version "5.1.22">> The index of the //tiddler//, a [[DataTiddler|DataTiddlers]], to which the radio button is bound<<.tip "be sure to set the //tiddler// correctly">> | +|min |The minimum value to be able to be set by the `<$range>` widget | +|max |The maximum value to be able to be set by the `<$range>` widget | +|increment |The minimum amount by which a value may be changed. Defaults to 1 | +|default |The default value displayed if the field is missing or empty | |class |CSS classes to be assigned to the label around the radio button | ! Examples From 2deed528bc6476a4a20c496d4cf3e8d7a777dee8 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 7 Nov 2019 13:39:14 +0100 Subject: [PATCH 0406/2376] Remove   from tag pill in edit mode (#4366) * remove   from tag pill in edit mode PR: fix missing space between edittemplate tags #3585 introduced an unbreakable space ... The ` ` isn't needed and **causes problems**, if users copy&paste the tag text, because the "new" tag in the text input field now contains an space in front of the tag. This space invalidates the tag, so it doesn't function anymore. see [comment in GG](https://groups.google.com/d/msg/tiddlywiki/RQEyqPQIZSM/uaU7lgJJAAAJ) .. I also had a problem like this some time ago, which costed me several hours of debugging. * Update base.tid * Update tag.tid --- core/ui/EditTemplate/tags.tid | 2 +- core/wiki/macros/tag.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index 665516b7b..8ab36bf0d 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -15,7 +15,7 @@ color:$(foregroundColor)$; \whitespace trim <$vars foregroundColor=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">> backgroundColor="""$colour$"""> <span style=<<tag-styles>> class="tc-tag-label tc-tag-list-item"> -<$transclude tiddler="""$icon$"""/> <$view field="title" format="text" /> +<$transclude tiddler="""$icon$"""/><$view field="title" format="text" /> <$button message="tm-remove-tag" param={{!!title}} class="tc-btn-invisible tc-remove-tag-button">{{$:/core/images/close-button}}</$button> </span> </$vars> diff --git a/core/wiki/macros/tag.tid b/core/wiki/macros/tag.tid index aa0934072..131d62cb4 100644 --- a/core/wiki/macros/tag.tid +++ b/core/wiki/macros/tag.tid @@ -10,7 +10,7 @@ color:$(foregroundColor)$; \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="title" format="text" /> +$actions$<$transclude tiddler="""$icon$"""/><$view tiddler=<<__tag__>> field="title" format="text" /> </$element-tag$> </$vars> \end diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index d747f7073..221800ffd 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -672,6 +672,8 @@ button.tc-untagged-label { .tc-tag-label svg, .tc-tag-label img { height: 1em; width: 1em; + margin-right: 3px; + margin-bottom: 1px; vertical-align: text-bottom; } From 337135d1bba4cf3a5975083b0b15fa6d36255d21 Mon Sep 17 00:00:00 2001 From: Xavier Maysonnave <x.maysonnave@gmail.com> Date: Wed, 13 Nov 2019 02:47:45 +0530 Subject: [PATCH 0407/2376] Signing the CLA (#4367) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 60c397c11..423b2501c 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -373,3 +373,5 @@ Nils-Hero Lindemann, @heronils, 2019/08/26 Mark Stegeman, @markstegeman, 2019/08/31 Jan-Oliver Kaiser, @janno, 2019/09/06 + +Xavier Maysonnave, @xmaysonnave, 2019/11/08 From 7387ca78f892028a159b6ce9d71a5432fb5665ae Mon Sep 17 00:00:00 2001 From: Marica Odagaki <ento.entotto@gmail.com> Date: Tue, 12 Nov 2019 13:41:46 -0800 Subject: [PATCH 0408/2376] Sign the CLA as ento (#4222) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 423b2501c..126f9b6af 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -370,6 +370,8 @@ Stefan Schuster-Teupke, @StefanSTFG, 2019/08/26 Nils-Hero Lindemann, @heronils, 2019/08/26 +Marica Odagaki, @ento, 2019/08/30 + Mark Stegeman, @markstegeman, 2019/08/31 Jan-Oliver Kaiser, @janno, 2019/09/06 From 613f0b25590166177f317dc15027cac175005340 Mon Sep 17 00:00:00 2001 From: Marica Odagaki <ento.entotto@gmail.com> Date: Tue, 12 Nov 2019 13:42:38 -0800 Subject: [PATCH 0409/2376] Upgrade to Jasmine 3 (#4226) * process.exit() only exist in a node.js environment * updateInterval has been removed from upstream From upstream commit: https://github.com/jasmine/jasmine/commit/b6eb9a4d5e7ea886e3ec1c270930b6098e75efc0 * Update Jasmine to 3.4.0 * Reuse the evalInContext helper * Fix expected parse result to match the actual result * 'describe' cannot be nested inside 'it' blocks Jasmine started to explicitly raise an error in these cases since: https://github.com/jasmine/jasmine/pull/1411 * Be consistent about how to refer to library files * Update link to Jasmine's official website --- .../test/tiddlers/tests/test-html-parser.js | 2 +- editions/test/tiddlers/tests/test-widget.js | 269 +- .../files/{ => jasmine-core}/MIT.LICENSE | 2 +- .../files/jasmine-core/lib/jasmine-core.js | 37 + .../jasmine-core/lib/jasmine-core/boot.js | 158 + .../lib/jasmine-core/jasmine-html.js | 620 ++ .../jasmine-core/lib/jasmine-core/jasmine.css | 128 + .../jasmine-core/lib/jasmine-core/jasmine.js | 7033 +++++++++++++++++ .../jasmine-core/lib/jasmine-core/json2.js | 489 ++ .../lib/jasmine-core/node_boot.js | 38 + .../tiddlywiki/jasmine/files/jasmine-html.js | 681 -- plugins/tiddlywiki/jasmine/files/jasmine.css | 82 - plugins/tiddlywiki/jasmine/files/jasmine.js | 2600 ------ .../jasmine/files/jasmine/MIT.LICENSE | 20 + .../jasmine/files/jasmine/lib/command.js | 283 + .../lib/filters/console_spec_filter.js | 10 + .../jasmine/files/jasmine/lib/jasmine.js | 263 + .../lib/reporters/completion_reporter.js | 29 + .../jasmine/lib/reporters/console_reporter.js | 232 + plugins/tiddlywiki/jasmine/files/reporter.js | 276 - .../tiddlywiki/jasmine/files/tiddlywiki.files | 69 +- plugins/tiddlywiki/jasmine/jasmine-plugin.js | 144 +- plugins/tiddlywiki/jasmine/readme.tid | 2 +- plugins/tiddlywiki/jasmine/update-packages.sh | 30 + 24 files changed, 9626 insertions(+), 3871 deletions(-) rename plugins/tiddlywiki/jasmine/files/{ => jasmine-core}/MIT.LICENSE (96%) create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/boot.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine-html.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.css create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/json2.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/node_boot.js delete mode 100644 plugins/tiddlywiki/jasmine/files/jasmine-html.js delete mode 100644 plugins/tiddlywiki/jasmine/files/jasmine.css delete mode 100644 plugins/tiddlywiki/jasmine/files/jasmine.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine/MIT.LICENSE create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine/lib/command.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine/lib/filters/console_spec_filter.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine/lib/jasmine.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/completion_reporter.js create mode 100644 plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/console_reporter.js delete mode 100644 plugins/tiddlywiki/jasmine/files/reporter.js create mode 100755 plugins/tiddlywiki/jasmine/update-packages.sh diff --git a/editions/test/tiddlers/tests/test-html-parser.js b/editions/test/tiddlers/tests/test-html-parser.js index e4c195cf1..bbe4f1573 100644 --- a/editions/test/tiddlers/tests/test-html-parser.js +++ b/editions/test/tiddlers/tests/test-html-parser.js @@ -156,7 +156,7 @@ describe("HTML tag new parser tests", function() { null ); expect(parser.parseTag("<mytag>",0)).toEqual( - { type : 'element', start : 0, attributes : [ ], tag : 'mytag', end : 7 } + { type : 'element', start : 0, attributes : { }, tag : 'mytag', end : 7 } ); expect(parser.parseTag("<mytag attrib1>",0)).toEqual( { type : 'element', start : 0, attributes : { attrib1 : { type : 'string', value : 'true', start : 6, name : 'attrib1', end : 14 } }, tag : 'mytag', end : 15 } diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index a1ad79823..5875a3b44 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -67,18 +67,16 @@ describe("Widget module", function() { var widgetNode = createWidgetNode(parseTreeNode,wiki); // Render the widget node to the DOM var wrapper = renderWidgetNode(widgetNode); - describe("should render", function() { - // Test the rendering - expect(wrapper.innerHTML).toBe("A text node<div class=\"myClass\" title=\"myTitle\"> and the content of a DIV<div> and an inner DIV</div> and back in the outer DIV</div>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[1].sequenceNumber).toBe(2); - expect(wrapper.children[1].children[0].sequenceNumber).toBe(3); - expect(wrapper.children[1].children[1].sequenceNumber).toBe(4); - expect(wrapper.children[1].children[1].children[0].sequenceNumber).toBe(5); - expect(wrapper.children[1].children[2].sequenceNumber).toBe(6); - }); + // Test the rendering + expect(wrapper.innerHTML).toBe("A text node<div class=\"myClass\" title=\"myTitle\"> and the content of a DIV<div> and an inner DIV</div> and back in the outer DIV</div>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[1].sequenceNumber).toBe(2); + expect(wrapper.children[1].children[0].sequenceNumber).toBe(3); + expect(wrapper.children[1].children[1].sequenceNumber).toBe(4); + expect(wrapper.children[1].children[1].children[0].sequenceNumber).toBe(5); + expect(wrapper.children[1].children[2].sequenceNumber).toBe(6); }); it("should deal with transclude widgets and indirect attributes", function() { @@ -111,38 +109,34 @@ describe("Widget module", function() { var widgetNode = createWidgetNode(parseTreeNode,wiki); // Render the widget node to the DOM var wrapper = renderWidgetNode(widgetNode); - describe("should render", function() { - // Test the rendering - expect(wrapper.innerHTML).toBe("A text node<div class=\"myClass\" title=\"the quick brown fox\"> and the content of a DIV<div> and an inner DIV</div> and back in the outer DIVthe quick brown fox</div>the quick brown fox"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[1].sequenceNumber).toBe(2); - expect(wrapper.children[1].children[0].sequenceNumber).toBe(3); - expect(wrapper.children[1].children[1].sequenceNumber).toBe(4); - expect(wrapper.children[1].children[1].children[0].sequenceNumber).toBe(5); - expect(wrapper.children[1].children[2].sequenceNumber).toBe(6); - expect(wrapper.children[1].children[3].sequenceNumber).toBe(7); - expect(wrapper.children[2].sequenceNumber).toBe(8); - }); + // Test the rendering + expect(wrapper.innerHTML).toBe("A text node<div class=\"myClass\" title=\"the quick brown fox\"> and the content of a DIV<div> and an inner DIV</div> and back in the outer DIVthe quick brown fox</div>the quick brown fox"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[1].sequenceNumber).toBe(2); + expect(wrapper.children[1].children[0].sequenceNumber).toBe(3); + expect(wrapper.children[1].children[1].sequenceNumber).toBe(4); + expect(wrapper.children[1].children[1].children[0].sequenceNumber).toBe(5); + expect(wrapper.children[1].children[2].sequenceNumber).toBe(6); + expect(wrapper.children[1].children[3].sequenceNumber).toBe(7); + expect(wrapper.children[2].sequenceNumber).toBe(8); // Change the transcluded tiddler wiki.addTiddler({title: "TiddlerOne", text: "jumps over the lazy dog"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerOne"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("A text node<div class=\"myClass\" title=\"jumps over the lazy dog\"> and the content of a DIV<div> and an inner DIV</div> and back in the outer DIVjumps over the lazy dog</div>jumps over the lazy dog"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[1].sequenceNumber).toBe(2); - expect(wrapper.children[1].children[0].sequenceNumber).toBe(3); - expect(wrapper.children[1].children[1].sequenceNumber).toBe(4); - expect(wrapper.children[1].children[1].children[0].sequenceNumber).toBe(5); - expect(wrapper.children[1].children[2].sequenceNumber).toBe(6); - expect(wrapper.children[1].children[3].sequenceNumber).toBe(9); - expect(wrapper.children[2].sequenceNumber).toBe(10); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("A text node<div class=\"myClass\" title=\"jumps over the lazy dog\"> and the content of a DIV<div> and an inner DIV</div> and back in the outer DIVjumps over the lazy dog</div>jumps over the lazy dog"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[1].sequenceNumber).toBe(2); + expect(wrapper.children[1].children[0].sequenceNumber).toBe(3); + expect(wrapper.children[1].children[1].sequenceNumber).toBe(4); + expect(wrapper.children[1].children[1].children[0].sequenceNumber).toBe(5); + expect(wrapper.children[1].children[2].sequenceNumber).toBe(6); + expect(wrapper.children[1].children[3].sequenceNumber).toBe(9); + expect(wrapper.children[2].sequenceNumber).toBe(10); }); it("should detect recursion of the transclude macro", function() { @@ -161,11 +155,8 @@ describe("Widget module", function() { var widgetNode = createWidgetNode(parseTreeNode,wiki); // Render the widget node to the DOM var wrapper = renderWidgetNode(widgetNode); - describe("should detect the recursion", function() { - // Test the rendering - expect(wrapper.innerHTML).toBe("<span class=\"tc-error\">Recursive transclusion error in transclude widget</span>\n"); - }); - + // Test the rendering + expect(wrapper.innerHTML).toBe("<span class=\"tc-error\">Recursive transclusion error in transclude widget</span>\n"); }); it("should deal with SVG elements", function() { @@ -218,14 +209,12 @@ describe("Widget module", function() { wiki.addTiddler({title: "TiddlerOne", text: "World-wide Jelly"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerOne"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>World-wide Jelly</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(3); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>World-wide Jelly</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(3); }); it("should deal with the set widget", function() { @@ -248,16 +237,14 @@ describe("Widget module", function() { wiki.addTiddler({title: "TiddlerFour", text: "TiddlerOne"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerFour"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>My Jolly Old World is Jolly</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(5); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(4); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>My Jolly Old World is Jolly</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(5); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(4); }); it("should deal with attributes specified as macro invocations", function() { @@ -306,49 +293,43 @@ describe("Widget module", function() { wiki.addTiddler({title: "TiddlerFive", text: "Jalapeno Peppers"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerFive"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(6); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); - expect(wrapper.children[0].children[3].sequenceNumber).toBe(4); - expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(6); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(4); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); // Remove a tiddler wiki.deleteTiddler("TiddlerThree"); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerTwo</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(6); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); - expect(wrapper.children[0].children[3].sequenceNumber).toBe(5); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerTwo</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(6); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(5); // Add it back a tiddler wiki.addTiddler({title: "TiddlerThree", text: "Something"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(6); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); - expect(wrapper.children[0].children[3].sequenceNumber).toBe(7); - expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwo</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(6); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(7); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); }); it("should deal with the list widget followed by other widgets", function() { @@ -373,65 +354,57 @@ describe("Widget module", function() { wiki.addTiddler({title: "TiddlerFive", text: "Jalapeno Peppers"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerFive"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); - expect(wrapper.children[0].children[3].sequenceNumber).toBe(4); - expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(4); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); // Remove a tiddler wiki.deleteTiddler("TiddlerThree"); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerTwoSomething</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); - expect(wrapper.children[0].children[3].sequenceNumber).toBe(5); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerTwoSomething</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(5); // Add it back a tiddler wiki.addTiddler({title: "TiddlerThree", text: "Something"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); - expect(wrapper.children[0].children[3].sequenceNumber).toBe(8); - expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoSomething</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(8); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); // Add another a tiddler to the end of the list wiki.addTiddler({title: "YetAnotherTiddler", text: "Something"}); // Refresh refreshWidgetNode(widgetNode,wrapper,["YetAnotherTiddler"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoYetAnotherTiddlerSomething</p>"); - // Test the sequence numbers in the DOM - expect(wrapper.sequenceNumber).toBe(0); - expect(wrapper.children[0].sequenceNumber).toBe(1); - expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); - expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); - expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); - expect(wrapper.children[0].children[3].sequenceNumber).toBe(8); - expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>TiddlerFiveTiddlerFourTiddlerOneTiddlerThreeTiddlerTwoYetAnotherTiddlerSomething</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(7); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(8); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); }); it("should deal with the list widget and external templates", function() { @@ -488,10 +461,8 @@ describe("Widget module", function() { wiki.deleteTiddler("TiddlerFour"); // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerOne","TiddlerTwo","TiddlerThree","TiddlerFour"]); - describe("should refresh", function() { - // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>nothing</p>"); - }); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>nothing</p>"); }); }); diff --git a/plugins/tiddlywiki/jasmine/files/MIT.LICENSE b/plugins/tiddlywiki/jasmine/files/jasmine-core/MIT.LICENSE similarity index 96% rename from plugins/tiddlywiki/jasmine/files/MIT.LICENSE rename to plugins/tiddlywiki/jasmine/files/jasmine-core/MIT.LICENSE index 7c435baae..db12c9292 100644 --- a/plugins/tiddlywiki/jasmine/files/MIT.LICENSE +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/MIT.LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2008-2011 Pivotal Labs +Copyright (c) 2008-2017 Pivotal Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core.js b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core.js new file mode 100644 index 000000000..fe0ecd8d2 --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core.js @@ -0,0 +1,37 @@ +module.exports = require("./jasmine-core/jasmine.js"); +module.exports.boot = require('./jasmine-core/node_boot.js'); + +var path = require('path'), + fs = require('fs'); + +var rootPath = path.join(__dirname, "jasmine-core"), + bootFiles = ['boot.js'], + nodeBootFiles = ['node_boot.js'], + cssFiles = [], + jsFiles = [], + jsFilesToSkip = ['jasmine.js'].concat(bootFiles, nodeBootFiles); + +fs.readdirSync(rootPath).forEach(function(file) { + if(fs.statSync(path.join(rootPath, file)).isFile()) { + switch(path.extname(file)) { + case '.css': + cssFiles.push(file); + break; + case '.js': + if (jsFilesToSkip.indexOf(file) < 0) { + jsFiles.push(file); + } + break; + } + } +}); + +module.exports.files = { + path: rootPath, + bootDir: rootPath, + bootFiles: bootFiles, + nodeBootFiles: nodeBootFiles, + cssFiles: cssFiles, + jsFiles: ['jasmine.js'].concat(jsFiles), + imagesDir: path.join(__dirname, '../images') +}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/boot.js b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/boot.js new file mode 100644 index 000000000..aa5011809 --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/boot.js @@ -0,0 +1,158 @@ +/* +Copyright (c) 2008-2019 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/** + Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. + + If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. + + The location of `boot.js` can be specified and/or overridden in `jasmine.yml`. + + [jasmine-gem]: http://github.com/pivotal/jasmine-gem + */ + +(function() { + + /** + * ## Require & Instantiate + * + * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference. + */ + window.jasmine = jasmineRequire.core(jasmineRequire); + + /** + * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference. + */ + jasmineRequire.html(jasmine); + + /** + * Create the Jasmine environment. This is used to run all specs in a project. + */ + var env = jasmine.getEnv(); + + /** + * ## The Global Interface + * + * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged. + */ + var jasmineInterface = jasmineRequire.interface(jasmine, env); + + /** + * Add all of the Jasmine global/public interface to the global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. + */ + extend(window, jasmineInterface); + + /** + * ## Runner Parameters + * + * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. + */ + + var queryString = new jasmine.QueryString({ + getWindowLocation: function() { return window.location; } + }); + + var filterSpecs = !!queryString.getParam("spec"); + + var config = { + failFast: queryString.getParam("failFast"), + oneFailurePerSpec: queryString.getParam("oneFailurePerSpec"), + hideDisabled: queryString.getParam("hideDisabled") + }; + + var random = queryString.getParam("random"); + + if (random !== undefined && random !== "") { + config.random = random; + } + + var seed = queryString.getParam("seed"); + if (seed) { + config.seed = seed; + } + + /** + * ## Reporters + * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). + */ + var htmlReporter = new jasmine.HtmlReporter({ + env: env, + navigateWithNewParam: function(key, value) { return queryString.navigateWithNewParam(key, value); }, + addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, + getContainer: function() { return document.body; }, + createElement: function() { return document.createElement.apply(document, arguments); }, + createTextNode: function() { return document.createTextNode.apply(document, arguments); }, + timer: new jasmine.Timer(), + filterSpecs: filterSpecs + }); + + /** + * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript. + */ + env.addReporter(jasmineInterface.jsApiReporter); + env.addReporter(htmlReporter); + + /** + * Filter which specs will be run by matching the start of the full name against the `spec` query param. + */ + var specFilter = new jasmine.HtmlSpecFilter({ + filterString: function() { return queryString.getParam("spec"); } + }); + + config.specFilter = function(spec) { + return specFilter.matches(spec.getFullName()); + }; + + env.configure(config); + + /** + * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack. + */ + window.setTimeout = window.setTimeout; + window.setInterval = window.setInterval; + window.clearTimeout = window.clearTimeout; + window.clearInterval = window.clearInterval; + + /** + * ## Execution + * + * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded. + */ + var currentWindowOnload = window.onload; + + window.onload = function() { + if (currentWindowOnload) { + currentWindowOnload(); + } + htmlReporter.initialize(); + env.execute(); + }; + + /** + * Helper function for readability above. + */ + function extend(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; + } + +}()); diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine-html.js b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine-html.js new file mode 100644 index 000000000..72aa851c1 --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine-html.js @@ -0,0 +1,620 @@ +/* +Copyright (c) 2008-2019 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +jasmineRequire.html = function(j$) { + j$.ResultsNode = jasmineRequire.ResultsNode(); + j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); + j$.QueryString = jasmineRequire.QueryString(); + j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); +}; + +jasmineRequire.HtmlReporter = function(j$) { + function ResultsStateBuilder() { + this.topResults = new j$.ResultsNode({}, '', null); + this.currentParent = this.topResults; + this.specsExecuted = 0; + this.failureCount = 0; + this.pendingSpecCount = 0; + } + + ResultsStateBuilder.prototype.suiteStarted = function(result) { + this.currentParent.addChild(result, 'suite'); + this.currentParent = this.currentParent.last(); + }; + + ResultsStateBuilder.prototype.suiteDone = function(result) { + this.currentParent.updateResult(result); + if (this.currentParent !== this.topResults) { + this.currentParent = this.currentParent.parent; + } + + if (result.status === 'failed') { + this.failureCount++; + } + }; + + ResultsStateBuilder.prototype.specStarted = function(result) { + }; + + ResultsStateBuilder.prototype.specDone = function(result) { + this.currentParent.addChild(result, 'spec'); + + if (result.status !== 'excluded') { + this.specsExecuted++; + } + + if (result.status === 'failed') { + this.failureCount++; + } + + if (result.status == 'pending') { + this.pendingSpecCount++; + } + }; + + + + function HtmlReporter(options) { + var config = function() { return (options.env && options.env.configuration()) || {}; }, + getContainer = options.getContainer, + createElement = options.createElement, + createTextNode = options.createTextNode, + navigateWithNewParam = options.navigateWithNewParam || function() {}, + addToExistingQueryString = options.addToExistingQueryString || defaultQueryString, + filterSpecs = options.filterSpecs, + timer = options.timer || j$.noopTimer, + htmlReporterMain, + symbols, + deprecationWarnings = []; + + this.initialize = function() { + clearPrior(); + htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'}, + createDom('div', {className: 'jasmine-banner'}, + createDom('a', {className: 'jasmine-title', href: 'http://jasmine.github.io/', target: '_blank'}), + createDom('span', {className: 'jasmine-version'}, j$.version) + ), + createDom('ul', {className: 'jasmine-symbol-summary'}), + createDom('div', {className: 'jasmine-alert'}), + createDom('div', {className: 'jasmine-results'}, + createDom('div', {className: 'jasmine-failures'}) + ) + ); + getContainer().appendChild(htmlReporterMain); + }; + + var totalSpecsDefined; + this.jasmineStarted = function(options) { + totalSpecsDefined = options.totalSpecsDefined || 0; + timer.start(); + }; + + var summary = createDom('div', {className: 'jasmine-summary'}); + + var stateBuilder = new ResultsStateBuilder(); + + this.suiteStarted = function(result) { + stateBuilder.suiteStarted(result); + }; + + this.suiteDone = function(result) { + stateBuilder.suiteDone(result); + + if (result.status === 'failed') { + failures.push(failureDom(result)); + } + addDeprecationWarnings(result); + }; + + this.specStarted = function(result) { + stateBuilder.specStarted(result); + }; + + var failures = []; + this.specDone = function(result) { + stateBuilder.specDone(result); + + if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') { + console.error('Spec \'' + result.fullName + '\' has no expectations.'); + } + + if (!symbols){ + symbols = find('.jasmine-symbol-summary'); + } + + symbols.appendChild(createDom('li', { + className: this.displaySpecInCorrectFormat(result), + id: 'spec_' + result.id, + title: result.fullName + } + )); + + if (result.status === 'failed') { + failures.push(failureDom(result)); + } + + addDeprecationWarnings(result); + }; + + this.displaySpecInCorrectFormat = function(result) { + return noExpectations(result) ? 'jasmine-empty' : this.resultStatus(result.status); + }; + + this.resultStatus = function(status) { + if(status === 'excluded') { + return config().hideDisabled ? 'jasmine-excluded-no-display' : 'jasmine-excluded'; + } + return 'jasmine-' + status; + }; + + this.jasmineDone = function(doneResult) { + var banner = find('.jasmine-banner'); + var alert = find('.jasmine-alert'); + var order = doneResult && doneResult.order; + var i; + alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); + + banner.appendChild(optionsMenu(config())); + + if (stateBuilder.specsExecuted < totalSpecsDefined) { + var skippedMessage = 'Ran ' + stateBuilder.specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; + var skippedLink = addToExistingQueryString('spec', ''); + alert.appendChild( + createDom('span', {className: 'jasmine-bar jasmine-skipped'}, + createDom('a', {href: skippedLink, title: 'Run all specs'}, skippedMessage) + ) + ); + } + var statusBarMessage = ''; + var statusBarClassName = 'jasmine-overall-result jasmine-bar '; + var globalFailures = (doneResult && doneResult.failedExpectations) || []; + var failed = stateBuilder.failureCount + globalFailures.length > 0; + + if (totalSpecsDefined > 0 || failed) { + statusBarMessage += pluralize('spec', stateBuilder.specsExecuted) + ', ' + pluralize('failure', stateBuilder.failureCount); + if (stateBuilder.pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', stateBuilder.pendingSpecCount); } + } + + if (doneResult.overallStatus === 'passed') { + statusBarClassName += ' jasmine-passed '; + } else if (doneResult.overallStatus === 'incomplete') { + statusBarClassName += ' jasmine-incomplete '; + statusBarMessage = 'Incomplete: ' + doneResult.incompleteReason + ', ' + statusBarMessage; + } else { + statusBarClassName += ' jasmine-failed '; + } + + var seedBar; + if (order && order.random) { + seedBar = createDom('span', {className: 'jasmine-seed-bar'}, + ', randomized with seed ', + createDom('a', {title: 'randomized with seed ' + order.seed, href: seedHref(order.seed)}, order.seed) + ); + } + + alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage, seedBar)); + + var errorBarClassName = 'jasmine-bar jasmine-errored'; + var afterAllMessagePrefix = 'AfterAll '; + + for(i = 0; i < globalFailures.length; i++) { + alert.appendChild(createDom('span', {className: errorBarClassName}, globalFailureMessage(globalFailures[i]))); + } + + function globalFailureMessage(failure) { + if (failure.globalErrorType === 'load') { + var prefix = 'Error during loading: ' + failure.message; + + if (failure.filename) { + return prefix + ' in ' + failure.filename + ' line ' + failure.lineno; + } else { + return prefix; + } + } else { + return afterAllMessagePrefix + failure.message; + } + } + + addDeprecationWarnings(doneResult); + + var warningBarClassName = 'jasmine-bar jasmine-warning'; + for(i = 0; i < deprecationWarnings.length; i++) { + var warning = deprecationWarnings[i]; + alert.appendChild(createDom('span', {className: warningBarClassName}, 'DEPRECATION: ' + warning)); + } + + var results = find('.jasmine-results'); + results.appendChild(summary); + + summaryList(stateBuilder.topResults, summary); + + if (failures.length) { + alert.appendChild( + createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-spec-list'}, + createDom('span', {}, 'Spec List | '), + createDom('a', {className: 'jasmine-failures-menu', href: '#'}, 'Failures'))); + alert.appendChild( + createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-failure-list'}, + createDom('a', {className: 'jasmine-spec-list-menu', href: '#'}, 'Spec List'), + createDom('span', {}, ' | Failures '))); + + find('.jasmine-failures-menu').onclick = function() { + setMenuModeTo('jasmine-failure-list'); + }; + find('.jasmine-spec-list-menu').onclick = function() { + setMenuModeTo('jasmine-spec-list'); + }; + + setMenuModeTo('jasmine-failure-list'); + + var failureNode = find('.jasmine-failures'); + for (i = 0; i < failures.length; i++) { + failureNode.appendChild(failures[i]); + } + } + }; + + return this; + + function failureDom(result) { + var failure = + createDom('div', {className: 'jasmine-spec-detail jasmine-failed'}, + failureDescription(result, stateBuilder.currentParent), + createDom('div', {className: 'jasmine-messages'}) + ); + var messages = failure.childNodes[1]; + + for (var i = 0; i < result.failedExpectations.length; i++) { + var expectation = result.failedExpectations[i]; + messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message)); + messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack)); + } + + return failure; + } + + function summaryList(resultsTree, domParent) { + var specListNode; + for (var i = 0; i < resultsTree.children.length; i++) { + var resultNode = resultsTree.children[i]; + if (filterSpecs && !hasActiveSpec(resultNode)) { + continue; + } + if (resultNode.type === 'suite') { + var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id}, + createDom('li', {className: 'jasmine-suite-detail jasmine-' + resultNode.result.status}, + createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) + ) + ); + + summaryList(resultNode, suiteListNode); + domParent.appendChild(suiteListNode); + } + if (resultNode.type === 'spec') { + if (domParent.getAttribute('class') !== 'jasmine-specs') { + specListNode = createDom('ul', {className: 'jasmine-specs'}); + domParent.appendChild(specListNode); + } + var specDescription = resultNode.result.description; + if(noExpectations(resultNode.result)) { + specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; + } + if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { + specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; + } + specListNode.appendChild( + createDom('li', { + className: 'jasmine-' + resultNode.result.status, + id: 'spec-' + resultNode.result.id + }, + createDom('a', {href: specHref(resultNode.result)}, specDescription) + ) + ); + } + } + } + + function optionsMenu(config) { + var optionsMenuDom = createDom('div', { className: 'jasmine-run-options' }, + createDom('span', { className: 'jasmine-trigger' }, 'Options'), + createDom('div', { className: 'jasmine-payload' }, + createDom('div', { className: 'jasmine-stop-on-failure' }, + createDom('input', { + className: 'jasmine-fail-fast', + id: 'jasmine-fail-fast', + type: 'checkbox' + }), + createDom('label', { className: 'jasmine-label', 'for': 'jasmine-fail-fast' }, 'stop execution on spec failure')), + createDom('div', { className: 'jasmine-throw-failures' }, + createDom('input', { + className: 'jasmine-throw', + id: 'jasmine-throw-failures', + type: 'checkbox' + }), + createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')), + createDom('div', { className: 'jasmine-random-order' }, + createDom('input', { + className: 'jasmine-random', + id: 'jasmine-random-order', + type: 'checkbox' + }), + createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order')), + createDom('div', { className: 'jasmine-hide-disabled' }, + createDom('input', { + className: 'jasmine-disabled', + id: 'jasmine-hide-disabled', + type: 'checkbox' + }), + createDom('label', { className: 'jasmine-label', 'for': 'jasmine-hide-disabled' }, 'hide disabled tests')) + ) + ); + + var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast'); + failFastCheckbox.checked = config.failFast; + failFastCheckbox.onclick = function() { + navigateWithNewParam('failFast', !config.failFast); + }; + + var throwCheckbox = optionsMenuDom.querySelector('#jasmine-throw-failures'); + throwCheckbox.checked = config.oneFailurePerSpec; + throwCheckbox.onclick = function() { + navigateWithNewParam('throwFailures', !config.oneFailurePerSpec); + }; + + var randomCheckbox = optionsMenuDom.querySelector('#jasmine-random-order'); + randomCheckbox.checked = config.random; + randomCheckbox.onclick = function() { + navigateWithNewParam('random', !config.random); + }; + + var hideDisabled = optionsMenuDom.querySelector('#jasmine-hide-disabled'); + hideDisabled.checked = config.hideDisabled; + hideDisabled.onclick = function() { + navigateWithNewParam('hideDisabled', !config.hideDisabled); + }; + + var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'), + optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'), + isOpen = /\bjasmine-open\b/; + + optionsTrigger.onclick = function() { + if (isOpen.test(optionsPayload.className)) { + optionsPayload.className = optionsPayload.className.replace(isOpen, ''); + } else { + optionsPayload.className += ' jasmine-open'; + } + }; + + return optionsMenuDom; + } + + function failureDescription(result, suite) { + var wrapper = createDom('div', {className: 'jasmine-description'}, + createDom('a', {title: result.description, href: specHref(result)}, result.description) + ); + var suiteLink; + + while (suite && suite.parent) { + wrapper.insertBefore(createTextNode(' > '), wrapper.firstChild); + suiteLink = createDom('a', {href: suiteHref(suite)}, suite.result.description); + wrapper.insertBefore(suiteLink, wrapper.firstChild); + + suite = suite.parent; + } + + return wrapper; + } + + function suiteHref(suite) { + var els = []; + + while (suite && suite.parent) { + els.unshift(suite.result.description); + suite = suite.parent; + } + + return addToExistingQueryString('spec', els.join(' ')); + } + + function addDeprecationWarnings(result) { + if (result && result.deprecationWarnings) { + for(var i = 0; i < result.deprecationWarnings.length; i++) { + var warning = result.deprecationWarnings[i].message; + if (!j$.util.arrayContains(warning)) { + deprecationWarnings.push(warning); + } + } + } + } + + function find(selector) { + return getContainer().querySelector('.jasmine_html-reporter ' + selector); + } + + function clearPrior() { + // return the reporter + var oldReporter = find(''); + + if(oldReporter) { + getContainer().removeChild(oldReporter); + } + } + + function createDom(type, attrs, childrenVarArgs) { + var el = createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(createTextNode(child)); + } else { + if (child) { + el.appendChild(child); + } + } + } + + for (var attr in attrs) { + if (attr == 'className') { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; + } + + function pluralize(singular, count) { + var word = (count == 1 ? singular : singular + 's'); + + return '' + count + ' ' + word; + } + + function specHref(result) { + return addToExistingQueryString('spec', result.fullName); + } + + function seedHref(seed) { + return addToExistingQueryString('seed', seed); + } + + function defaultQueryString(key, value) { + return '?' + key + '=' + value; + } + + function setMenuModeTo(mode) { + htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); + } + + function noExpectations(result) { + return (result.failedExpectations.length + result.passedExpectations.length) === 0 && + result.status === 'passed'; + } + + function hasActiveSpec(resultNode) { + if (resultNode.type == 'spec' && resultNode.result.status != 'excluded') { + return true; + } + + if (resultNode.type == 'suite') { + for (var i = 0, j = resultNode.children.length; i < j; i++) { + if (hasActiveSpec(resultNode.children[i])) { + return true; + } + } + } + } + } + + return HtmlReporter; +}; + +jasmineRequire.HtmlSpecFilter = function() { + function HtmlSpecFilter(options) { + var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + var filterPattern = new RegExp(filterString); + + this.matches = function(specName) { + return filterPattern.test(specName); + }; + } + + return HtmlSpecFilter; +}; + +jasmineRequire.ResultsNode = function() { + function ResultsNode(result, type, parent) { + this.result = result; + this.type = type; + this.parent = parent; + + this.children = []; + + this.addChild = function(result, type) { + this.children.push(new ResultsNode(result, type, this)); + }; + + this.last = function() { + return this.children[this.children.length - 1]; + }; + + this.updateResult = function(result) { + this.result = result; + }; + } + + return ResultsNode; +}; + +jasmineRequire.QueryString = function() { + function QueryString(options) { + + this.navigateWithNewParam = function(key, value) { + options.getWindowLocation().search = this.fullStringWithNewParam(key, value); + }; + + this.fullStringWithNewParam = function(key, value) { + var paramMap = queryStringToParamMap(); + paramMap[key] = value; + return toQueryString(paramMap); + }; + + this.getParam = function(key) { + return queryStringToParamMap()[key]; + }; + + return this; + + function toQueryString(paramMap) { + var qStrPairs = []; + for (var prop in paramMap) { + qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop])); + } + return '?' + qStrPairs.join('&'); + } + + function queryStringToParamMap() { + var paramStr = options.getWindowLocation().search.substring(1), + params = [], + paramMap = {}; + + if (paramStr.length > 0) { + params = paramStr.split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + var value = decodeURIComponent(p[1]); + if (value === 'true' || value === 'false') { + value = JSON.parse(value); + } + paramMap[decodeURIComponent(p[0])] = value; + } + } + + return paramMap; + } + + } + + return QueryString; +}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.css b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.css new file mode 100644 index 000000000..6543aab4e --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.css @@ -0,0 +1,128 @@ +@charset "UTF-8"; +body { overflow-y: scroll; } + +.jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; } + +.jasmine_html-reporter a { text-decoration: none; } + +.jasmine_html-reporter a:hover { text-decoration: underline; } + +.jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; } + +.jasmine_html-reporter .jasmine-banner, .jasmine_html-reporter .jasmine-symbol-summary, .jasmine_html-reporter .jasmine-summary, .jasmine_html-reporter .jasmine-result-message, .jasmine_html-reporter .jasmine-spec .jasmine-description, .jasmine_html-reporter .jasmine-spec-detail .jasmine-description, .jasmine_html-reporter .jasmine-alert .jasmine-bar, .jasmine_html-reporter .jasmine-stack-trace { padding-left: 9px; padding-right: 9px; } + +.jasmine_html-reporter .jasmine-banner { position: relative; } + +.jasmine_html-reporter .jasmine-banner .jasmine-title { background: url("data:image/png;base64,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") no-repeat; background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=") no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; } + +.jasmine_html-reporter .jasmine-banner .jasmine-version { margin-left: 14px; position: relative; top: 6px; } + +.jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; } + +.jasmine_html-reporter .jasmine-version { color: #aaa; } + +.jasmine_html-reporter .jasmine-banner { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-duration { color: #fff; float: right; line-height: 28px; padding-right: 9px; } + +.jasmine_html-reporter .jasmine-symbol-summary { overflow: hidden; margin: 14px 0; } + +.jasmine_html-reporter .jasmine-symbol-summary li { display: inline-block; height: 10px; width: 14px; font-size: 16px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed { font-size: 14px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed:before { color: #007069; content: "•"; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed { line-height: 9px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "×"; font-weight: bold; margin-left: -1px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded { font-size: 14px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before { color: #bababa; content: "•"; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded-no-display { font-size: 14px; display: none; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending { line-height: 17px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before { color: #ba9d37; content: "*"; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty { font-size: 14px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty:before { color: #ba9d37; content: "•"; } + +.jasmine_html-reporter .jasmine-run-options { float: right; margin-right: 5px; border: 1px solid #8a4182; color: #8a4182; position: relative; line-height: 20px; } + +.jasmine_html-reporter .jasmine-run-options .jasmine-trigger { cursor: pointer; padding: 8px 16px; } + +.jasmine_html-reporter .jasmine-run-options .jasmine-payload { position: absolute; display: none; right: -1px; border: 1px solid #8a4182; background-color: #eee; white-space: nowrap; padding: 4px 8px; } + +.jasmine_html-reporter .jasmine-run-options .jasmine-payload.jasmine-open { display: block; } + +.jasmine_html-reporter .jasmine-bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } + +.jasmine_html-reporter .jasmine-bar.jasmine-failed, .jasmine_html-reporter .jasmine-bar.jasmine-errored { background-color: #ca3a11; border-bottom: 1px solid #eee; } + +.jasmine_html-reporter .jasmine-bar.jasmine-passed { background-color: #007069; } + +.jasmine_html-reporter .jasmine-bar.jasmine-incomplete { background-color: #bababa; } + +.jasmine_html-reporter .jasmine-bar.jasmine-skipped { background-color: #bababa; } + +.jasmine_html-reporter .jasmine-bar.jasmine-warning { background-color: #ba9d37; color: #333; } + +.jasmine_html-reporter .jasmine-bar.jasmine-menu { background-color: #fff; color: #aaa; } + +.jasmine_html-reporter .jasmine-bar.jasmine-menu a { color: #333; } + +.jasmine_html-reporter .jasmine-bar a { color: white; } + +.jasmine_html-reporter.jasmine-spec-list .jasmine-bar.jasmine-menu.jasmine-failure-list, .jasmine_html-reporter.jasmine-spec-list .jasmine-results .jasmine-failures { display: none; } + +.jasmine_html-reporter.jasmine-failure-list .jasmine-bar.jasmine-menu.jasmine-spec-list, .jasmine_html-reporter.jasmine-failure-list .jasmine-summary { display: none; } + +.jasmine_html-reporter .jasmine-results { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-summary { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; } + +.jasmine_html-reporter .jasmine-summary ul.jasmine-suite { margin-top: 7px; margin-bottom: 7px; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-passed a { color: #007069; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-failed a { color: #ca3a11; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-empty a { color: #ba9d37; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-pending a { color: #ba9d37; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-excluded a { color: #bababa; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-passed a:before { content: "• "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-failed a:before { content: "× "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-empty a:before { content: "* "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-pending a:before { content: "• "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-excluded a:before { content: "• "; } + +.jasmine_html-reporter .jasmine-description + .jasmine-suite { margin-top: 0; } + +.jasmine_html-reporter .jasmine-suite { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-suite a { color: #333; } + +.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail { margin-bottom: 28px; } + +.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description { background-color: #ca3a11; color: white; } + +.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description a { color: white; } + +.jasmine_html-reporter .jasmine-result-message { padding-top: 14px; color: #333; white-space: pre-wrap; } + +.jasmine_html-reporter .jasmine-result-message span.jasmine-result { display: block; } + +.jasmine_html-reporter .jasmine-stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; } diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.js b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.js new file mode 100644 index 000000000..4c034469e --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/jasmine.js @@ -0,0 +1,7033 @@ +/* +Copyright (c) 2008-2019 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +var getJasmineRequireObj = (function (jasmineGlobal) { + /* globals exports, global, module, window */ + var jasmineRequire; + + if (typeof module !== 'undefined' && module.exports && typeof exports !== 'undefined') { + if (typeof global !== 'undefined') { + jasmineGlobal = global; + } else { + jasmineGlobal = {}; + } + jasmineRequire = exports; + } else { + if (typeof window !== 'undefined' && typeof window.toString === 'function' && window.toString() === '[object GjsGlobal]') { + jasmineGlobal = window; + } + jasmineRequire = jasmineGlobal.jasmineRequire = {}; + } + + function getJasmineRequire() { + return jasmineRequire; + } + + getJasmineRequire().core = function(jRequire) { + var j$ = {}; + + jRequire.base(j$, jasmineGlobal); + j$.util = jRequire.util(j$); + j$.errors = jRequire.errors(); + j$.formatErrorMsg = jRequire.formatErrorMsg(); + j$.Any = jRequire.Any(j$); + j$.Anything = jRequire.Anything(j$); + j$.CallTracker = jRequire.CallTracker(j$); + j$.MockDate = jRequire.MockDate(); + j$.getClearStack = jRequire.clearStack(j$); + j$.Clock = jRequire.Clock(); + j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(j$); + j$.Env = jRequire.Env(j$); + j$.StackTrace = jRequire.StackTrace(j$); + j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$); + j$.ExpectationFilterChain = jRequire.ExpectationFilterChain(); + j$.Expector = jRequire.Expector(j$); + j$.Expectation = jRequire.Expectation(j$); + j$.buildExpectationResult = jRequire.buildExpectationResult(); + j$.noopTimer = jRequire.noopTimer(); + j$.JsApiReporter = jRequire.JsApiReporter(j$); + j$.matchersUtil = jRequire.matchersUtil(j$); + j$.ObjectContaining = jRequire.ObjectContaining(j$); + j$.ArrayContaining = jRequire.ArrayContaining(j$); + j$.ArrayWithExactContents = jRequire.ArrayWithExactContents(j$); + j$.pp = jRequire.pp(j$); + j$.QueueRunner = jRequire.QueueRunner(j$); + j$.ReportDispatcher = jRequire.ReportDispatcher(j$); + j$.Spec = jRequire.Spec(j$); + j$.Spy = jRequire.Spy(j$); + j$.SpyFactory = jRequire.SpyFactory(j$); + j$.SpyRegistry = jRequire.SpyRegistry(j$); + j$.SpyStrategy = jRequire.SpyStrategy(j$); + j$.StringMatching = jRequire.StringMatching(j$); + j$.UserContext = jRequire.UserContext(j$); + j$.Suite = jRequire.Suite(j$); + j$.Timer = jRequire.Timer(); + j$.TreeProcessor = jRequire.TreeProcessor(); + j$.version = jRequire.version(); + j$.Order = jRequire.Order(); + j$.DiffBuilder = jRequire.DiffBuilder(j$); + j$.NullDiffBuilder = jRequire.NullDiffBuilder(j$); + j$.ObjectPath = jRequire.ObjectPath(j$); + j$.GlobalErrors = jRequire.GlobalErrors(j$); + + j$.Truthy = jRequire.Truthy(j$); + j$.Falsy = jRequire.Falsy(j$); + j$.Empty = jRequire.Empty(j$); + j$.NotEmpty = jRequire.NotEmpty(j$); + + j$.matchers = jRequire.requireMatchers(jRequire, j$); + j$.asyncMatchers = jRequire.requireAsyncMatchers(jRequire, j$); + + return j$; + }; + + return getJasmineRequire; +})(this); + +getJasmineRequireObj().requireMatchers = function(jRequire, j$) { + var availableMatchers = [ + 'nothing', + 'toBe', + 'toBeCloseTo', + 'toBeDefined', + 'toBeFalsy', + 'toBeGreaterThan', + 'toBeGreaterThanOrEqual', + 'toBeLessThan', + 'toBeLessThanOrEqual', + 'toBeNaN', + 'toBeNegativeInfinity', + 'toBeNull', + 'toBePositiveInfinity', + 'toBeTruthy', + 'toBeUndefined', + 'toContain', + 'toEqual', + 'toHaveBeenCalled', + 'toHaveBeenCalledBefore', + 'toHaveBeenCalledTimes', + 'toHaveBeenCalledWith', + 'toHaveClass', + 'toMatch', + 'toThrow', + 'toThrowError', + 'toThrowMatching', + ], + matchers = {}; + + for (var i = 0; i < availableMatchers.length; i++) { + var name = availableMatchers[i]; + matchers[name] = jRequire[name](j$); + } + + return matchers; +}; + +getJasmineRequireObj().base = function(j$, jasmineGlobal) { + j$.unimplementedMethod_ = function() { + throw new Error('unimplemented method'); + }; + + /** + * Maximum object depth the pretty printer will print to. + * Set this to a lower value to speed up pretty printing if you have large objects. + * @name jasmine.MAX_PRETTY_PRINT_DEPTH + */ + j$.MAX_PRETTY_PRINT_DEPTH = 8; + /** + * Maximum number of array elements to display when pretty printing objects. + * This will also limit the number of keys and values displayed for an object. + * Elements past this number will be ellipised. + * @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH + */ + j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 50; + /** + * Maximum number of characters to display when pretty printing objects. + * Characters past this number will be ellipised. + * @name jasmine.MAX_PRETTY_PRINT_CHARS + */ + j$.MAX_PRETTY_PRINT_CHARS = 1000; + /** + * Default number of milliseconds Jasmine will wait for an asynchronous spec to complete. + * @name jasmine.DEFAULT_TIMEOUT_INTERVAL + */ + j$.DEFAULT_TIMEOUT_INTERVAL = 5000; + + j$.getGlobal = function() { + return jasmineGlobal; + }; + + /** + * Get the currently booted Jasmine Environment. + * + * @name jasmine.getEnv + * @function + * @return {Env} + */ + j$.getEnv = function(options) { + var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options); + //jasmine. singletons in here (setTimeout blah blah). + return env; + }; + + j$.isArray_ = function(value) { + return j$.isA_('Array', value); + }; + + j$.isObject_ = function(value) { + return !j$.util.isUndefined(value) && value !== null && j$.isA_('Object', value); + }; + + j$.isString_ = function(value) { + return j$.isA_('String', value); + }; + + j$.isNumber_ = function(value) { + return j$.isA_('Number', value); + }; + + j$.isFunction_ = function(value) { + return j$.isA_('Function', value); + }; + + j$.isAsyncFunction_ = function(value) { + return j$.isA_('AsyncFunction', value); + }; + + j$.isTypedArray_ = function(value) { + return j$.isA_('Float32Array', value) || + j$.isA_('Float64Array', value) || + j$.isA_('Int16Array', value) || + j$.isA_('Int32Array', value) || + j$.isA_('Int8Array', value) || + j$.isA_('Uint16Array', value) || + j$.isA_('Uint32Array', value) || + j$.isA_('Uint8Array', value) || + j$.isA_('Uint8ClampedArray', value); + }; + + j$.isA_ = function(typeName, value) { + return j$.getType_(value) === '[object ' + typeName + ']'; + }; + + j$.isError_ = function(value) { + if (value instanceof Error) { + return true; + } + if (value && value.constructor && value.constructor.constructor) { + var valueGlobal = value.constructor.constructor('return this'); + if (j$.isFunction_(valueGlobal)) { + valueGlobal = valueGlobal(); + } + + if (valueGlobal.Error && value instanceof valueGlobal.Error) { + return true; + } + } + return false; + }; + + j$.getType_ = function(value) { + return Object.prototype.toString.apply(value); + }; + + j$.isDomNode = function(obj) { + // Node is a function, because constructors + return typeof jasmineGlobal.Node !== 'undefined' ? + obj instanceof jasmineGlobal.Node : + obj !== null && + typeof obj === 'object' && + typeof obj.nodeType === 'number' && + typeof obj.nodeName === 'string'; + // return obj.nodeType > 0; + }; + + j$.isMap = function(obj) { + return typeof jasmineGlobal.Map !== 'undefined' && obj.constructor === jasmineGlobal.Map; + }; + + j$.isSet = function(obj) { + return typeof jasmineGlobal.Set !== 'undefined' && obj.constructor === jasmineGlobal.Set; + }; + + j$.isPromise = function(obj) { + return typeof jasmineGlobal.Promise !== 'undefined' && !!obj && obj.constructor === jasmineGlobal.Promise; + }; + + j$.isPromiseLike = function(obj) { + return !!obj && j$.isFunction_(obj.then); + }; + + j$.fnNameFor = function(func) { + if (func.name) { + return func.name; + } + + var matches = func.toString().match(/^\s*function\s*(\w+)\s*\(/) || + func.toString().match(/^\s*\[object\s*(\w+)Constructor\]/); + + return matches ? matches[1] : '<anonymous>'; + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is an instance of the specified class/constructor. + * @name jasmine.any + * @function + * @param {Constructor} clazz - The constructor to check against. + */ + j$.any = function(clazz) { + return new j$.Any(clazz); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is not `null` and not `undefined`. + * @name jasmine.anything + * @function + */ + j$.anything = function() { + return new j$.Anything(); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is `true` or anything truthy. + * @name jasmine.truthy + * @function + */ + j$.truthy = function() {return new j$.Truthy();}; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is `null`, `undefined`, `0`, `false` or anything falsey. + * @name jasmine.falsy + * @function + */ + j$.falsy = function() {return new j$.Falsy();}; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is empty. + * @name jasmine.empty + * @function + */ + j$.empty = function() {return new j$.Empty();}; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is not empty. + * @name jasmine.notEmpty + * @function + */ + j$.notEmpty = function() {return new j$.NotEmpty();}; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared contains at least the keys and values. + * @name jasmine.objectContaining + * @function + * @param {Object} sample - The subset of properties that _must_ be in the actual. + */ + j$.objectContaining = function(sample) { + return new j$.ObjectContaining(sample); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is a `String` that matches the `RegExp` or `String`. + * @name jasmine.stringMatching + * @function + * @param {RegExp|String} expected + */ + j$.stringMatching = function(expected) { + return new j$.StringMatching(expected); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is an `Array` that contains at least the elements in the sample. + * @name jasmine.arrayContaining + * @function + * @param {Array} sample + */ + j$.arrayContaining = function(sample) { + return new j$.ArrayContaining(sample); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is an `Array` that contains all of the elements in the sample in any order. + * @name jasmine.arrayWithExactContents + * @function + * @param {Array} sample + */ + j$.arrayWithExactContents = function(sample) { + return new j$.ArrayWithExactContents(sample); + }; + + j$.isSpy = function(putativeSpy) { + if (!putativeSpy) { + return false; + } + return putativeSpy.and instanceof j$.SpyStrategy && + putativeSpy.calls instanceof j$.CallTracker; + }; +}; + +getJasmineRequireObj().util = function(j$) { + + var util = {}; + + util.inherit = function(childClass, parentClass) { + var Subclass = function() { + }; + Subclass.prototype = parentClass.prototype; + childClass.prototype = new Subclass(); + }; + + util.htmlEscape = function(str) { + if (!str) { + return str; + } + return str.replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>'); + }; + + util.argsToArray = function(args) { + var arrayOfArgs = []; + for (var i = 0; i < args.length; i++) { + arrayOfArgs.push(args[i]); + } + return arrayOfArgs; + }; + + util.isUndefined = function(obj) { + return obj === void 0; + }; + + util.arrayContains = function(array, search) { + var i = array.length; + while (i--) { + if (array[i] === search) { + return true; + } + } + return false; + }; + + util.clone = function(obj) { + if (Object.prototype.toString.apply(obj) === '[object Array]') { + return obj.slice(); + } + + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + + return cloned; + }; + + util.cloneArgs = function(args) { + var clonedArgs = []; + var argsAsArray = j$.util.argsToArray(args); + for(var i = 0; i < argsAsArray.length; i++) { + var str = Object.prototype.toString.apply(argsAsArray[i]), + primitives = /^\[object (Boolean|String|RegExp|Number)/; + + // All falsey values are either primitives, `null`, or `undefined. + if (!argsAsArray[i] || str.match(primitives)) { + clonedArgs.push(argsAsArray[i]); + } else { + clonedArgs.push(j$.util.clone(argsAsArray[i])); + } + } + return clonedArgs; + }; + + util.getPropertyDescriptor = function(obj, methodName) { + var descriptor, + proto = obj; + + do { + descriptor = Object.getOwnPropertyDescriptor(proto, methodName); + proto = Object.getPrototypeOf(proto); + } while (!descriptor && proto); + + return descriptor; + }; + + util.objectDifference = function(obj, toRemove) { + var diff = {}; + + for (var key in obj) { + if (util.has(obj, key) && !util.has(toRemove, key)) { + diff[key] = obj[key]; + } + } + + return diff; + }; + + util.has = function(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + }; + + function anyMatch(pattern, lines) { + var i; + + for (i = 0; i < lines.length; i++) { + if (lines[i].match(pattern)) { + return true; + } + } + + return false; + } + + util.errorWithStack = function errorWithStack () { + // Don't throw and catch if we don't have to, because it makes it harder + // for users to debug their code with exception breakpoints. + var error = new Error(); + + if (error.stack) { + return error; + } + + // But some browsers (e.g. Phantom) only provide a stack trace if we throw. + try { + throw new Error(); + } catch (e) { + return e; + } + }; + + function callerFile() { + var trace = new j$.StackTrace(util.errorWithStack()); + return trace.frames[2].file; + } + + util.jasmineFile = (function() { + var result; + + return function() { + var trace; + + if (!result) { + result = callerFile(); + } + + return result; + }; + }()); + + return util; +}; + +getJasmineRequireObj().Spec = function(j$) { + function Spec(attrs) { + this.expectationFactory = attrs.expectationFactory; + this.asyncExpectationFactory = attrs.asyncExpectationFactory; + this.resultCallback = attrs.resultCallback || function() {}; + this.id = attrs.id; + this.description = attrs.description || ''; + this.queueableFn = attrs.queueableFn; + this.beforeAndAfterFns = attrs.beforeAndAfterFns || function() { return {befores: [], afters: []}; }; + this.userContext = attrs.userContext || function() { return {}; }; + this.onStart = attrs.onStart || function() {}; + this.getSpecName = attrs.getSpecName || function() { return ''; }; + this.expectationResultFactory = attrs.expectationResultFactory || function() { }; + this.queueRunnerFactory = attrs.queueRunnerFactory || function() {}; + this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + this.timer = attrs.timer || j$.noopTimer; + + if (!this.queueableFn.fn) { + this.pend(); + } + + /** + * @typedef SpecResult + * @property {Int} id - The unique id of this spec. + * @property {String} description - The description passed to the {@link it} that created this spec. + * @property {String} fullName - The full description including all ancestors of this spec. + * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec. + * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec. + * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec. + * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason. + * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec. + * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach. + */ + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [], + passedExpectations: [], + deprecationWarnings: [], + pendingReason: '', + duration: null, + }; + } + + Spec.prototype.addExpectationResult = function(passed, data, isError) { + var expectationResult = this.expectationResultFactory(data); + if (passed) { + this.result.passedExpectations.push(expectationResult); + } else { + this.result.failedExpectations.push(expectationResult); + + if (this.throwOnExpectationFailure && !isError) { + throw new j$.errors.ExpectationFailed(); + } + } + }; + + Spec.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Spec.prototype.expectAsync = function(actual) { + return this.asyncExpectationFactory(actual, this); + }; + + Spec.prototype.execute = function(onComplete, excluded) { + var self = this; + + var onStart = { + fn: function(done) { + self.timer.start(); + self.onStart(self, done); + } + }; + + var complete = { + fn: function(done) { + self.queueableFn.fn = null; + self.result.status = self.status(excluded); + self.resultCallback(self.result, done); + } + }; + + var fns = this.beforeAndAfterFns(); + var regularFns = fns.befores.concat(this.queueableFn); + + var runnerConfig = { + isLeaf: true, + queueableFns: regularFns, + cleanupFns: fns.afters, + onException: function () { + self.onException.apply(self, arguments); + }, + onComplete: function() { + self.result.duration = self.timer.elapsed(); + onComplete(self.result.status === 'failed' && new j$.StopExecutionError('spec failed')); + }, + userContext: this.userContext() + }; + + if (this.markedPending || excluded === true) { + runnerConfig.queueableFns = []; + runnerConfig.cleanupFns = []; + } + + runnerConfig.queueableFns.unshift(onStart); + runnerConfig.cleanupFns.push(complete); + + this.queueRunnerFactory(runnerConfig); + }; + + Spec.prototype.onException = function onException(e) { + if (Spec.isPendingSpecException(e)) { + this.pend(extractCustomPendingMessage(e)); + return; + } + + if (e instanceof j$.errors.ExpectationFailed) { + return; + } + + this.addExpectationResult(false, { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: e + }, true); + }; + + Spec.prototype.pend = function(message) { + this.markedPending = true; + if (message) { + this.result.pendingReason = message; + } + }; + + Spec.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Spec.prototype.status = function(excluded) { + if (excluded === true) { + return 'excluded'; + } + + if (this.markedPending) { + return 'pending'; + } + + if (this.result.failedExpectations.length > 0) { + return 'failed'; + } else { + return 'passed'; + } + }; + + Spec.prototype.getFullName = function() { + return this.getSpecName(this); + }; + + Spec.prototype.addDeprecationWarning = function(deprecation) { + if (typeof deprecation === 'string') { + deprecation = { message: deprecation }; + } + this.result.deprecationWarnings.push(this.expectationResultFactory(deprecation)); + }; + + var extractCustomPendingMessage = function(e) { + var fullMessage = e.toString(), + boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage), + boilerplateEnd = boilerplateStart + Spec.pendingSpecExceptionMessage.length; + + return fullMessage.substr(boilerplateEnd); + }; + + Spec.pendingSpecExceptionMessage = '=> marked Pending'; + + Spec.isPendingSpecException = function(e) { + return !!(e && e.toString && e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1); + }; + + return Spec; +}; + +if (typeof window == void 0 && typeof exports == 'object') { + /* globals exports */ + exports.Spec = jasmineRequire.Spec; +} + +/*jshint bitwise: false*/ + +getJasmineRequireObj().Order = function() { + function Order(options) { + this.random = 'random' in options ? options.random : true; + var seed = this.seed = options.seed || generateSeed(); + this.sort = this.random ? randomOrder : naturalOrder; + + function naturalOrder(items) { + return items; + } + + function randomOrder(items) { + var copy = items.slice(); + copy.sort(function(a, b) { + return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id); + }); + return copy; + } + + function generateSeed() { + return String(Math.random()).slice(-5); + } + + // Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function + // used to get a different output when the key changes slightly. + // We use your return to sort the children randomly in a consistent way when + // used in conjunction with a seed + + function jenkinsHash(key) { + var hash, i; + for(hash = i = 0; i < key.length; ++i) { + hash += key.charCodeAt(i); + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; + } + + } + + return Order; +}; + +getJasmineRequireObj().Env = function(j$) { + /** + * _Note:_ Do not construct this directly, Jasmine will make one during booting. + * @name Env + * @classdesc The Jasmine environment + * @constructor + */ + function Env(options) { + options = options || {}; + + var self = this; + var global = options.global || j$.getGlobal(); + + var totalSpecsDefined = 0; + + var realSetTimeout = global.setTimeout; + var realClearTimeout = global.clearTimeout; + var clearStack = j$.getClearStack(global); + this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global)); + + var runnableResources = {}; + + var currentSpec = null; + var currentlyExecutingSuites = []; + var currentDeclarationSuite = null; + var hasFailures = false; + + /** + * This represents the available options to configure Jasmine. + * Options that are not provided will use their default values + * @interface Configuration + */ + var config = { + /** + * Whether to randomize spec execution order + * @name Configuration#random + * @type Boolean + * @default true + */ + random: true, + /** + * Seed to use as the basis of randomization. + * Null causes the seed to be determined randomly at the start of execution. + * @name Configuration#seed + * @type function + * @default null + */ + seed: null, + /** + * Whether to stop execution of the suite after the first spec failure + * @name Configuration#failFast + * @type Boolean + * @default false + */ + failFast: false, + /** + * Whether to cause specs to only have one expectation failure. + * @name Configuration#oneFailurePerSpec + * @type Boolean + * @default false + */ + oneFailurePerSpec: false, + /** + * Function to use to filter specs + * @name Configuration#specFilter + * @type function + * @default true + */ + specFilter: function() { + return true; + }, + /** + * Whether or not reporters should hide disabled specs from their output. + * Currently only supported by Jasmine's HTMLReporter + * @name Configuration#hideDisabled + * @type Boolean + * @default false + */ + hideDisabled: false + }; + + var currentSuite = function() { + return currentlyExecutingSuites[currentlyExecutingSuites.length - 1]; + }; + + var currentRunnable = function() { + return currentSpec || currentSuite(); + }; + + var globalErrors = null; + + var installGlobalErrors = function() { + if (globalErrors) { + return; + } + + globalErrors = new j$.GlobalErrors(); + globalErrors.install(); + }; + + if (!options.suppressLoadErrors) { + installGlobalErrors(); + globalErrors.pushListener(function(message, filename, lineno, colNo, err) { + topSuite.result.failedExpectations.push({ + passed: false, + globalErrorType: 'load', + message: message, + stack: err && err.stack, + filename: filename, + lineno: lineno + }); + }); + } + + /** + * Configure your jasmine environment + * @name Env#configure + * @argument {Configuration} configuration + * @function + */ + this.configure = function(configuration) { + if (configuration.specFilter) { + config.specFilter = configuration.specFilter; + } + + if (configuration.hasOwnProperty('random')) { + config.random = !!configuration.random; + } + + if (configuration.hasOwnProperty('seed')) { + config.seed = configuration.seed; + } + + if (configuration.hasOwnProperty('failFast')) { + config.failFast = configuration.failFast; + } + + if (configuration.hasOwnProperty('oneFailurePerSpec')) { + config.oneFailurePerSpec = configuration.oneFailurePerSpec; + } + + if (configuration.hasOwnProperty('hideDisabled')) { + config.hideDisabled = configuration.hideDisabled; + } + }; + + /** + * Get the current configuration for your jasmine environment + * @name Env#configuration + * @function + * @returns {Configuration} + */ + this.configuration = function() { + var result = {}; + for (var property in config) { + result[property] = config[property]; + } + return result; + }; + + Object.defineProperty(this, 'specFilter', { + get: function() { + self.deprecated('Getting specFilter directly from Env is deprecated, please check the specFilter option from `configuration`'); + return config.specFilter; + }, + set: function(val) { + self.deprecated('Setting specFilter directly on Env is deprecated, please use the specFilter option in `configure`'); + config.specFilter = val; + } + }); + + this.addSpyStrategy = function(name, fn) { + if(!currentRunnable()) { + throw new Error('Custom spy strategies must be added in a before function or a spec'); + } + runnableResources[currentRunnable().id].customSpyStrategies[name] = fn; + }; + + this.addCustomEqualityTester = function(tester) { + if(!currentRunnable()) { + throw new Error('Custom Equalities must be added in a before function or a spec'); + } + runnableResources[currentRunnable().id].customEqualityTesters.push(tester); + }; + + this.addMatchers = function(matchersToAdd) { + if(!currentRunnable()) { + throw new Error('Matchers must be added in a before function or a spec'); + } + var customMatchers = runnableResources[currentRunnable().id].customMatchers; + for (var matcherName in matchersToAdd) { + customMatchers[matcherName] = matchersToAdd[matcherName]; + } + }; + + j$.Expectation.addCoreMatchers(j$.matchers); + j$.Expectation.addAsyncCoreMatchers(j$.asyncMatchers); + + var nextSpecId = 0; + var getNextSpecId = function() { + return 'spec' + nextSpecId++; + }; + + var nextSuiteId = 0; + var getNextSuiteId = function() { + return 'suite' + nextSuiteId++; + }; + + var expectationFactory = function(actual, spec) { + return j$.Expectation.factory({ + util: j$.matchersUtil, + customEqualityTesters: runnableResources[spec.id].customEqualityTesters, + customMatchers: runnableResources[spec.id].customMatchers, + actual: actual, + addExpectationResult: addExpectationResult + }); + + function addExpectationResult(passed, result) { + return spec.addExpectationResult(passed, result); + } + }; + + var asyncExpectationFactory = function(actual, spec) { + return j$.Expectation.asyncFactory({ + util: j$.matchersUtil, + customEqualityTesters: runnableResources[spec.id].customEqualityTesters, + actual: actual, + addExpectationResult: addExpectationResult + }); + + function addExpectationResult(passed, result) { + return spec.addExpectationResult(passed, result); + } + }; + + var defaultResourcesForRunnable = function(id, parentRunnableId) { + var resources = {spies: [], customEqualityTesters: [], customMatchers: {}, customSpyStrategies: {}}; + + if(runnableResources[parentRunnableId]){ + resources.customEqualityTesters = j$.util.clone(runnableResources[parentRunnableId].customEqualityTesters); + resources.customMatchers = j$.util.clone(runnableResources[parentRunnableId].customMatchers); + } + + runnableResources[id] = resources; + }; + + var clearResourcesForRunnable = function(id) { + spyRegistry.clearSpies(); + delete runnableResources[id]; + }; + + var beforeAndAfterFns = function(suite) { + return function() { + var befores = [], + afters = []; + + while(suite) { + befores = befores.concat(suite.beforeFns); + afters = afters.concat(suite.afterFns); + + suite = suite.parentSuite; + } + + return { + befores: befores.reverse(), + afters: afters + }; + }; + }; + + var getSpecName = function(spec, suite) { + var fullName = [spec.description], + suiteFullName = suite.getFullName(); + + if (suiteFullName !== '') { + fullName.unshift(suiteFullName); + } + return fullName.join(' '); + }; + + // TODO: we may just be able to pass in the fn instead of wrapping here + var buildExpectationResult = j$.buildExpectationResult, + exceptionFormatter = new j$.ExceptionFormatter(), + expectationResultFactory = function(attrs) { + attrs.messageFormatter = exceptionFormatter.message; + attrs.stackFormatter = exceptionFormatter.stack; + + return buildExpectationResult(attrs); + }; + + var maximumSpecCallbackDepth = 20; + var currentSpecCallbackDepth = 0; + + /** + * Sets whether Jasmine should throw an Error when an expectation fails. + * This causes a spec to only have one expectation failure. + * @name Env#throwOnExpectationFailure + * @function + * @param {Boolean} value Whether to throw when a expectation fails + * @deprecated Use the `oneFailurePerSpec` option with {@link Env#configure} + */ + this.throwOnExpectationFailure = function(value) { + this.deprecated('Setting throwOnExpectationFailure directly on Env is deprecated, please use the oneFailurePerSpec option in `configure`'); + this.configure({oneFailurePerSpec: !!value}); + }; + + this.throwingExpectationFailures = function() { + this.deprecated('Getting throwingExpectationFailures directly from Env is deprecated, please check the oneFailurePerSpec option from `configuration`'); + return config.oneFailurePerSpec; + }; + + /** + * Set whether to stop suite execution when a spec fails + * @name Env#stopOnSpecFailure + * @function + * @param {Boolean} value Whether to stop suite execution when a spec fails + * @deprecated Use the `failFast` option with {@link Env#configure} + */ + this.stopOnSpecFailure = function(value) { + this.deprecated('Setting stopOnSpecFailure directly is deprecated, please use the failFast option in `configure`'); + this.configure({failFast: !!value}); + }; + + this.stoppingOnSpecFailure = function() { + this.deprecated('Getting stoppingOnSpecFailure directly from Env is deprecated, please check the failFast option from `configuration`'); + return config.failFast; + }; + + /** + * Set whether to randomize test execution order + * @name Env#randomizeTests + * @function + * @param {Boolean} value Whether to randomize execution order + * @deprecated Use the `random` option with {@link Env#configure} + */ + this.randomizeTests = function(value) { + this.deprecated('Setting randomizeTests directly is deprecated, please use the random option in `configure`'); + config.random = !!value; + }; + + this.randomTests = function() { + this.deprecated('Getting randomTests directly from Env is deprecated, please check the random option from `configuration`'); + return config.random; + }; + + /** + * Set the random number seed for spec randomization + * @name Env#seed + * @function + * @param {Number} value The seed value + * @deprecated Use the `seed` option with {@link Env#configure} + */ + this.seed = function(value) { + this.deprecated('Setting seed directly is deprecated, please use the seed option in `configure`'); + if (value) { + config.seed = value; + } + return config.seed; + }; + + this.hidingDisabled = function(value) { + this.deprecated('Getting hidingDisabled directly from Env is deprecated, please check the hideDisabled option from `configuration`'); + return config.hideDisabled; + }; + + /** + * @name Env#hideDisabled + * @function + */ + this.hideDisabled = function(value) { + this.deprecated('Setting hideDisabled directly is deprecated, please use the hideDisabled option in `configure`'); + config.hideDisabled = !!value; + }; + + this.deprecated = function(deprecation) { + var runnable = currentRunnable() || topSuite; + runnable.addDeprecationWarning(deprecation); + if(typeof console !== 'undefined' && typeof console.error === 'function') { + console.error('DEPRECATION:', deprecation); + } + }; + + var queueRunnerFactory = function(options, args) { + var failFast = false; + if (options.isLeaf) { + failFast = config.oneFailurePerSpec; + } else if (!options.isReporter) { + failFast = config.failFast; + } + options.clearStack = options.clearStack || clearStack; + options.timeout = {setTimeout: realSetTimeout, clearTimeout: realClearTimeout}; + options.fail = self.fail; + options.globalErrors = globalErrors; + options.completeOnFirstError = failFast; + options.onException = options.onException || function(e) { + (currentRunnable() || topSuite).onException(e); + }; + options.deprecated = self.deprecated; + + new j$.QueueRunner(options).execute(args); + }; + + var topSuite = new j$.Suite({ + env: this, + id: getNextSuiteId(), + description: 'Jasmine__TopLevel__Suite', + expectationFactory: expectationFactory, + asyncExpectationFactory: asyncExpectationFactory, + expectationResultFactory: expectationResultFactory + }); + defaultResourcesForRunnable(topSuite.id); + currentDeclarationSuite = topSuite; + + this.topSuite = function() { + return topSuite; + }; + + /** + * This represents the available reporter callback for an object passed to {@link Env#addReporter}. + * @interface Reporter + * @see custom_reporter + */ + var reporter = new j$.ReportDispatcher([ + /** + * `jasmineStarted` is called after all of the specs have been loaded, but just before execution starts. + * @function + * @name Reporter#jasmineStarted + * @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'jasmineStarted', + /** + * When the entire suite has finished execution `jasmineDone` is called + * @function + * @name Reporter#jasmineDone + * @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running. + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'jasmineDone', + /** + * `suiteStarted` is invoked when a `describe` starts to run + * @function + * @name Reporter#suiteStarted + * @param {SuiteResult} result Information about the individual {@link describe} being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'suiteStarted', + /** + * `suiteDone` is invoked when all of the child specs and suites for a given suite have been run + * + * While jasmine doesn't require any specific functions, not defining a `suiteDone` will make it impossible for a reporter to know when a suite has failures in an `afterAll`. + * @function + * @name Reporter#suiteDone + * @param {SuiteResult} result + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'suiteDone', + /** + * `specStarted` is invoked when an `it` starts to run (including associated `beforeEach` functions) + * @function + * @name Reporter#specStarted + * @param {SpecResult} result Information about the individual {@link it} being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'specStarted', + /** + * `specDone` is invoked when an `it` and its associated `beforeEach` and `afterEach` functions have been run. + * + * While jasmine doesn't require any specific functions, not defining a `specDone` will make it impossible for a reporter to know when a spec has failed. + * @function + * @name Reporter#specDone + * @param {SpecResult} result + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'specDone' + ], queueRunnerFactory); + + this.execute = function(runnablesToRun) { + var self = this; + installGlobalErrors(); + + if(!runnablesToRun) { + if (focusedRunnables.length) { + runnablesToRun = focusedRunnables; + } else { + runnablesToRun = [topSuite.id]; + } + } + + var order = new j$.Order({ + random: config.random, + seed: config.seed + }); + + var processor = new j$.TreeProcessor({ + tree: topSuite, + runnableIds: runnablesToRun, + queueRunnerFactory: queueRunnerFactory, + nodeStart: function(suite, next) { + currentlyExecutingSuites.push(suite); + defaultResourcesForRunnable(suite.id, suite.parentSuite.id); + reporter.suiteStarted(suite.result, next); + suite.startTimer(); + }, + nodeComplete: function(suite, result, next) { + if (suite !== currentSuite()) { + throw new Error('Tried to complete the wrong suite'); + } + + clearResourcesForRunnable(suite.id); + currentlyExecutingSuites.pop(); + + if (result.status === 'failed') { + hasFailures = true; + } + suite.endTimer(); + reporter.suiteDone(result, next); + }, + orderChildren: function(node) { + return order.sort(node.children); + }, + excludeNode: function(spec) { + return !config.specFilter(spec); + } + }); + + if(!processor.processTree().valid) { + throw new Error('Invalid order: would cause a beforeAll or afterAll to be run multiple times'); + } + + /** + * Information passed to the {@link Reporter#jasmineStarted} event. + * @typedef JasmineStartedInfo + * @property {Int} totalSpecsDefined - The total number of specs defined in this suite. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + */ + reporter.jasmineStarted({ + totalSpecsDefined: totalSpecsDefined, + order: order + }, function() { + currentlyExecutingSuites.push(topSuite); + + processor.execute(function () { + clearResourcesForRunnable(topSuite.id); + currentlyExecutingSuites.pop(); + var overallStatus, incompleteReason; + + if (hasFailures || topSuite.result.failedExpectations.length > 0) { + overallStatus = 'failed'; + } else if (focusedRunnables.length > 0) { + overallStatus = 'incomplete'; + incompleteReason = 'fit() or fdescribe() was found'; + } else if (totalSpecsDefined === 0) { + overallStatus = 'incomplete'; + incompleteReason = 'No specs found'; + } else { + overallStatus = 'passed'; + } + + /** + * Information passed to the {@link Reporter#jasmineDone} event. + * @typedef JasmineDoneInfo + * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'. + * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level. + * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level. + */ + reporter.jasmineDone({ + overallStatus: overallStatus, + incompleteReason: incompleteReason, + order: order, + failedExpectations: topSuite.result.failedExpectations, + deprecationWarnings: topSuite.result.deprecationWarnings + }, function() {}); + }); + }); + }; + + /** + * Add a custom reporter to the Jasmine environment. + * @name Env#addReporter + * @function + * @param {Reporter} reporterToAdd The reporter to be added. + * @see custom_reporter + */ + this.addReporter = function(reporterToAdd) { + reporter.addReporter(reporterToAdd); + }; + + /** + * Provide a fallback reporter if no other reporters have been specified. + * @name Env#provideFallbackReporter + * @function + * @param {Reporter} reporterToAdd The reporter + * @see custom_reporter + */ + this.provideFallbackReporter = function(reporterToAdd) { + reporter.provideFallbackReporter(reporterToAdd); + }; + + /** + * Clear all registered reporters + * @name Env#clearReporters + * @function + */ + this.clearReporters = function() { + reporter.clearReporters(); + }; + + var spyFactory = new j$.SpyFactory(function() { + var runnable = currentRunnable(); + + if (runnable) { + return runnableResources[runnable.id].customSpyStrategies; + } + + return {}; + }); + + var spyRegistry = new j$.SpyRegistry({ + currentSpies: function() { + if(!currentRunnable()) { + throw new Error('Spies must be created in a before function or a spec'); + } + return runnableResources[currentRunnable().id].spies; + }, + createSpy: function(name, originalFn) { + return self.createSpy(name, originalFn); + } + }); + + this.allowRespy = function(allow){ + spyRegistry.allowRespy(allow); + }; + + this.spyOn = function() { + return spyRegistry.spyOn.apply(spyRegistry, arguments); + }; + + this.spyOnProperty = function() { + return spyRegistry.spyOnProperty.apply(spyRegistry, arguments); + }; + + this.spyOnAllFunctions = function() { + return spyRegistry.spyOnAllFunctions.apply(spyRegistry, arguments); + }; + + this.createSpy = function(name, originalFn) { + if (arguments.length === 1 && j$.isFunction_(name)) { + originalFn = name; + name = originalFn.name; + } + + return spyFactory.createSpy(name, originalFn); + }; + + this.createSpyObj = function(baseName, methodNames) { + return spyFactory.createSpyObj(baseName, methodNames); + }; + + var ensureIsFunction = function(fn, caller) { + if (!j$.isFunction_(fn)) { + throw new Error(caller + ' expects a function argument; received ' + j$.getType_(fn)); + } + }; + + var ensureIsFunctionOrAsync = function(fn, caller) { + if (!j$.isFunction_(fn) && !j$.isAsyncFunction_(fn)) { + throw new Error(caller + ' expects a function argument; received ' + j$.getType_(fn)); + } + }; + + function ensureIsNotNested(method) { + var runnable = currentRunnable(); + if (runnable !== null && runnable !== undefined) { + throw new Error('\'' + method + '\' should only be used in \'describe\' function'); + } + } + + var suiteFactory = function(description) { + var suite = new j$.Suite({ + env: self, + id: getNextSuiteId(), + description: description, + parentSuite: currentDeclarationSuite, + expectationFactory: expectationFactory, + asyncExpectationFactory: asyncExpectationFactory, + expectationResultFactory: expectationResultFactory, + throwOnExpectationFailure: config.oneFailurePerSpec + }); + + return suite; + }; + + this.describe = function(description, specDefinitions) { + ensureIsNotNested('describe'); + ensureIsFunction(specDefinitions, 'describe'); + var suite = suiteFactory(description); + if (specDefinitions.length > 0) { + throw new Error('describe does not expect any arguments'); + } + if (currentDeclarationSuite.markedPending) { + suite.pend(); + } + addSpecsToSuite(suite, specDefinitions); + return suite; + }; + + this.xdescribe = function(description, specDefinitions) { + ensureIsNotNested('xdescribe'); + ensureIsFunction(specDefinitions, 'xdescribe'); + var suite = suiteFactory(description); + suite.pend(); + addSpecsToSuite(suite, specDefinitions); + return suite; + }; + + var focusedRunnables = []; + + this.fdescribe = function(description, specDefinitions) { + ensureIsNotNested('fdescribe'); + ensureIsFunction(specDefinitions, 'fdescribe'); + var suite = suiteFactory(description); + suite.isFocused = true; + + focusedRunnables.push(suite.id); + unfocusAncestor(); + addSpecsToSuite(suite, specDefinitions); + + return suite; + }; + + function addSpecsToSuite(suite, specDefinitions) { + var parentSuite = currentDeclarationSuite; + parentSuite.addChild(suite); + currentDeclarationSuite = suite; + + var declarationError = null; + try { + specDefinitions.call(suite); + } catch (e) { + declarationError = e; + } + + if (declarationError) { + suite.onException(declarationError); + } + + currentDeclarationSuite = parentSuite; + } + + function findFocusedAncestor(suite) { + while (suite) { + if (suite.isFocused) { + return suite.id; + } + suite = suite.parentSuite; + } + + return null; + } + + function unfocusAncestor() { + var focusedAncestor = findFocusedAncestor(currentDeclarationSuite); + if (focusedAncestor) { + for (var i = 0; i < focusedRunnables.length; i++) { + if (focusedRunnables[i] === focusedAncestor) { + focusedRunnables.splice(i, 1); + break; + } + } + } + } + + var specFactory = function(description, fn, suite, timeout) { + totalSpecsDefined++; + var spec = new j$.Spec({ + id: getNextSpecId(), + beforeAndAfterFns: beforeAndAfterFns(suite), + expectationFactory: expectationFactory, + asyncExpectationFactory: asyncExpectationFactory, + resultCallback: specResultCallback, + getSpecName: function(spec) { + return getSpecName(spec, suite); + }, + onStart: specStarted, + description: description, + expectationResultFactory: expectationResultFactory, + queueRunnerFactory: queueRunnerFactory, + userContext: function() { return suite.clonedSharedUserContext(); }, + queueableFn: { + fn: fn, + timeout: timeout || 0 + }, + throwOnExpectationFailure: config.oneFailurePerSpec, + timer: new j$.Timer(), + }); + return spec; + + function specResultCallback(result, next) { + clearResourcesForRunnable(spec.id); + currentSpec = null; + + if (result.status === 'failed') { + hasFailures = true; + } + + reporter.specDone(result, next); + } + + function specStarted(spec, next) { + currentSpec = spec; + defaultResourcesForRunnable(spec.id, suite.id); + reporter.specStarted(spec.result, next); + } + }; + + this.it = function(description, fn, timeout) { + ensureIsNotNested('it'); + // it() sometimes doesn't have a fn argument, so only check the type if + // it's given. + if (arguments.length > 1 && typeof fn !== 'undefined') { + ensureIsFunctionOrAsync(fn, 'it'); + } + var spec = specFactory(description, fn, currentDeclarationSuite, timeout); + if (currentDeclarationSuite.markedPending) { + spec.pend(); + } + currentDeclarationSuite.addChild(spec); + return spec; + }; + + this.xit = function(description, fn, timeout) { + ensureIsNotNested('xit'); + // xit(), like it(), doesn't always have a fn argument, so only check the + // type when needed. + if (arguments.length > 1 && typeof fn !== 'undefined') { + ensureIsFunctionOrAsync(fn, 'xit'); + } + var spec = this.it.apply(this, arguments); + spec.pend('Temporarily disabled with xit'); + return spec; + }; + + this.fit = function(description, fn, timeout){ + ensureIsNotNested('fit'); + ensureIsFunctionOrAsync(fn, 'fit'); + var spec = specFactory(description, fn, currentDeclarationSuite, timeout); + currentDeclarationSuite.addChild(spec); + focusedRunnables.push(spec.id); + unfocusAncestor(); + return spec; + }; + + this.expect = function(actual) { + if (!currentRunnable()) { + throw new Error('\'expect\' was used when there was no current spec, this could be because an asynchronous test timed out'); + } + + return currentRunnable().expect(actual); + }; + + this.expectAsync = function(actual) { + if (!currentRunnable()) { + throw new Error('\'expectAsync\' was used when there was no current spec, this could be because an asynchronous test timed out'); + } + + return currentRunnable().expectAsync(actual); + }; + + this.beforeEach = function(beforeEachFunction, timeout) { + ensureIsNotNested('beforeEach'); + ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach'); + currentDeclarationSuite.beforeEach({ + fn: beforeEachFunction, + timeout: timeout || 0 + }); + }; + + this.beforeAll = function(beforeAllFunction, timeout) { + ensureIsNotNested('beforeAll'); + ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll'); + currentDeclarationSuite.beforeAll({ + fn: beforeAllFunction, + timeout: timeout || 0 + }); + }; + + this.afterEach = function(afterEachFunction, timeout) { + ensureIsNotNested('afterEach'); + ensureIsFunctionOrAsync(afterEachFunction, 'afterEach'); + afterEachFunction.isCleanup = true; + currentDeclarationSuite.afterEach({ + fn: afterEachFunction, + timeout: timeout || 0 + }); + }; + + this.afterAll = function(afterAllFunction, timeout) { + ensureIsNotNested('afterAll'); + ensureIsFunctionOrAsync(afterAllFunction, 'afterAll'); + currentDeclarationSuite.afterAll({ + fn: afterAllFunction, + timeout: timeout || 0 + }); + }; + + this.pending = function(message) { + var fullMessage = j$.Spec.pendingSpecExceptionMessage; + if(message) { + fullMessage += message; + } + throw fullMessage; + }; + + this.fail = function(error) { + if (!currentRunnable()) { + throw new Error('\'fail\' was used when there was no current spec, this could be because an asynchronous test timed out'); + } + + var message = 'Failed'; + if (error) { + message += ': '; + if (error.message) { + message += error.message; + } else if (j$.isString_(error)) { + message += error; + } else { + // pretty print all kind of objects. This includes arrays. + message += j$.pp(error); + } + } + + currentRunnable().addExpectationResult(false, { + matcherName: '', + passed: false, + expected: '', + actual: '', + message: message, + error: error && error.message ? error : null + }); + + if (config.oneFailurePerSpec) { + throw new Error(message); + } + }; + } + + return Env; +}; + +getJasmineRequireObj().JsApiReporter = function(j$) { + /** + * @name jsApiReporter + * @classdesc {@link Reporter} added by default in `boot.js` to record results for retrieval in javascript code. An instance is made available as `jsApiReporter` on the global object. + * @class + * @hideconstructor + */ + function JsApiReporter(options) { + var timer = options.timer || j$.noopTimer, + status = 'loaded'; + + this.started = false; + this.finished = false; + this.runDetails = {}; + + this.jasmineStarted = function() { + this.started = true; + status = 'started'; + timer.start(); + }; + + var executionTime; + + this.jasmineDone = function(runDetails) { + this.finished = true; + this.runDetails = runDetails; + executionTime = timer.elapsed(); + status = 'done'; + }; + + /** + * Get the current status for the Jasmine environment. + * @name jsApiReporter#status + * @function + * @return {String} - One of `loaded`, `started`, or `done` + */ + this.status = function() { + return status; + }; + + var suites = [], + suites_hash = {}; + + this.suiteStarted = function(result) { + suites_hash[result.id] = result; + }; + + this.suiteDone = function(result) { + storeSuite(result); + }; + + /** + * Get the results for a set of suites. + * + * Retrievable in slices for easier serialization. + * @name jsApiReporter#suiteResults + * @function + * @param {Number} index - The position in the suites list to start from. + * @param {Number} length - Maximum number of suite results to return. + * @return {SuiteResult[]} + */ + this.suiteResults = function(index, length) { + return suites.slice(index, index + length); + }; + + function storeSuite(result) { + suites.push(result); + suites_hash[result.id] = result; + } + + /** + * Get all of the suites in a single object, with their `id` as the key. + * @name jsApiReporter#suites + * @function + * @return {Object} - Map of suite id to {@link SuiteResult} + */ + this.suites = function() { + return suites_hash; + }; + + var specs = []; + + this.specDone = function(result) { + specs.push(result); + }; + + /** + * Get the results for a set of specs. + * + * Retrievable in slices for easier serialization. + * @name jsApiReporter#specResults + * @function + * @param {Number} index - The position in the specs list to start from. + * @param {Number} length - Maximum number of specs results to return. + * @return {SpecResult[]} + */ + this.specResults = function(index, length) { + return specs.slice(index, index + length); + }; + + /** + * Get all spec results. + * @name jsApiReporter#specs + * @function + * @return {SpecResult[]} + */ + this.specs = function() { + return specs; + }; + + /** + * Get the number of milliseconds it took for the full Jasmine suite to run. + * @name jsApiReporter#executionTime + * @function + * @return {Number} + */ + this.executionTime = function() { + return executionTime; + }; + + } + + return JsApiReporter; +}; + +getJasmineRequireObj().Any = function(j$) { + + function Any(expectedObject) { + if (typeof expectedObject === 'undefined') { + throw new TypeError( + 'jasmine.any() expects to be passed a constructor function. ' + + 'Please pass one or use jasmine.anything() to match any object.' + ); + } + this.expectedObject = expectedObject; + } + + Any.prototype.asymmetricMatch = function(other) { + if (this.expectedObject == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedObject == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedObject == Function) { + return typeof other == 'function' || other instanceof Function; + } + + if (this.expectedObject == Object) { + return other !== null && typeof other == 'object'; + } + + if (this.expectedObject == Boolean) { + return typeof other == 'boolean'; + } + + /* jshint -W122 */ + /* global Symbol */ + if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) { + return typeof other == 'symbol'; + } + /* jshint +W122 */ + + return other instanceof this.expectedObject; + }; + + Any.prototype.jasmineToString = function() { + return '<jasmine.any(' + j$.fnNameFor(this.expectedObject) + ')>'; + }; + + return Any; +}; + +getJasmineRequireObj().Anything = function(j$) { + + function Anything() {} + + Anything.prototype.asymmetricMatch = function(other) { + return !j$.util.isUndefined(other) && other !== null; + }; + + Anything.prototype.jasmineToString = function() { + return '<jasmine.anything>'; + }; + + return Anything; +}; + +getJasmineRequireObj().ArrayContaining = function(j$) { + function ArrayContaining(sample) { + this.sample = sample; + } + + ArrayContaining.prototype.asymmetricMatch = function(other, customTesters) { + if (!j$.isArray_(this.sample)) { + throw new Error('You must provide an array to arrayContaining, not ' + j$.pp(this.sample) + '.'); + } + + for (var i = 0; i < this.sample.length; i++) { + var item = this.sample[i]; + if (!j$.matchersUtil.contains(other, item, customTesters)) { + return false; + } + } + + return true; + }; + + ArrayContaining.prototype.jasmineToString = function () { + return '<jasmine.arrayContaining(' + j$.pp(this.sample) +')>'; + }; + + return ArrayContaining; +}; + +getJasmineRequireObj().ArrayWithExactContents = function(j$) { + + function ArrayWithExactContents(sample) { + this.sample = sample; + } + + ArrayWithExactContents.prototype.asymmetricMatch = function(other, customTesters) { + if (!j$.isArray_(this.sample)) { + throw new Error('You must provide an array to arrayWithExactContents, not ' + j$.pp(this.sample) + '.'); + } + + if (this.sample.length !== other.length) { + return false; + } + + for (var i = 0; i < this.sample.length; i++) { + var item = this.sample[i]; + if (!j$.matchersUtil.contains(other, item, customTesters)) { + return false; + } + } + + return true; + }; + + ArrayWithExactContents.prototype.jasmineToString = function() { + return '<jasmine.arrayWithExactContents ' + j$.pp(this.sample) + '>'; + }; + + return ArrayWithExactContents; +}; + +getJasmineRequireObj().Empty = function (j$) { + + function Empty() {} + + Empty.prototype.asymmetricMatch = function (other) { + if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) { + return other.length === 0; + } + + if (j$.isMap(other) || j$.isSet(other)) { + return other.size === 0; + } + + if (j$.isObject_(other)) { + return Object.keys(other).length === 0; + } + return false; + }; + + Empty.prototype.jasmineToString = function () { + return '<jasmine.empty>'; + }; + + return Empty; +}; + +getJasmineRequireObj().Falsy = function(j$) { + + function Falsy() {} + + Falsy.prototype.asymmetricMatch = function(other) { + return !other; + }; + + Falsy.prototype.jasmineToString = function() { + return '<jasmine.falsy>'; + }; + + return Falsy; +}; + +getJasmineRequireObj().NotEmpty = function (j$) { + + function NotEmpty() {} + + NotEmpty.prototype.asymmetricMatch = function (other) { + if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) { + return other.length !== 0; + } + + if (j$.isMap(other) || j$.isSet(other)) { + return other.size !== 0; + } + + if (j$.isObject_(other)) { + return Object.keys(other).length !== 0; + } + + return false; + }; + + NotEmpty.prototype.jasmineToString = function () { + return '<jasmine.notEmpty>'; + }; + + return NotEmpty; +}; + +getJasmineRequireObj().ObjectContaining = function(j$) { + + function ObjectContaining(sample) { + this.sample = sample; + } + + function getPrototype(obj) { + if (Object.getPrototypeOf) { + return Object.getPrototypeOf(obj); + } + + if (obj.constructor.prototype == obj) { + return null; + } + + return obj.constructor.prototype; + } + + function hasProperty(obj, property) { + if (!obj) { + return false; + } + + if (Object.prototype.hasOwnProperty.call(obj, property)) { + return true; + } + + return hasProperty(getPrototype(obj), property); + } + + ObjectContaining.prototype.asymmetricMatch = function(other, customTesters) { + if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); } + + for (var property in this.sample) { + if (!hasProperty(other, property) || + !j$.matchersUtil.equals(this.sample[property], other[property], customTesters)) { + return false; + } + } + + return true; + }; + + ObjectContaining.prototype.jasmineToString = function() { + return '<jasmine.objectContaining(' + j$.pp(this.sample) + ')>'; + }; + + return ObjectContaining; +}; + +getJasmineRequireObj().StringMatching = function(j$) { + + function StringMatching(expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error('Expected is not a String or a RegExp'); + } + + this.regexp = new RegExp(expected); + } + + StringMatching.prototype.asymmetricMatch = function(other) { + return this.regexp.test(other); + }; + + StringMatching.prototype.jasmineToString = function() { + return '<jasmine.stringMatching(' + this.regexp + ')>'; + }; + + return StringMatching; +}; + +getJasmineRequireObj().Truthy = function(j$) { + + function Truthy() {} + + Truthy.prototype.asymmetricMatch = function(other) { + return !!other; + }; + + Truthy.prototype.jasmineToString = function() { + return '<jasmine.truthy>'; + }; + + return Truthy; +}; + +getJasmineRequireObj().CallTracker = function(j$) { + + /** + * @namespace Spy#calls + */ + function CallTracker() { + var calls = []; + var opts = {}; + + this.track = function(context) { + if(opts.cloneArgs) { + context.args = j$.util.cloneArgs(context.args); + } + calls.push(context); + }; + + /** + * Check whether this spy has been invoked. + * @name Spy#calls#any + * @function + * @return {Boolean} + */ + this.any = function() { + return !!calls.length; + }; + + /** + * Get the number of invocations of this spy. + * @name Spy#calls#count + * @function + * @return {Integer} + */ + this.count = function() { + return calls.length; + }; + + /** + * Get the arguments that were passed to a specific invocation of this spy. + * @name Spy#calls#argsFor + * @function + * @param {Integer} index The 0-based invocation index. + * @return {Array} + */ + this.argsFor = function(index) { + var call = calls[index]; + return call ? call.args : []; + }; + + /** + * Get the raw calls array for this spy. + * @name Spy#calls#all + * @function + * @return {Spy.callData[]} + */ + this.all = function() { + return calls; + }; + + /** + * Get all of the arguments for each invocation of this spy in the order they were received. + * @name Spy#calls#allArgs + * @function + * @return {Array} + */ + this.allArgs = function() { + var callArgs = []; + for(var i = 0; i < calls.length; i++){ + callArgs.push(calls[i].args); + } + + return callArgs; + }; + + /** + * Get the first invocation of this spy. + * @name Spy#calls#first + * @function + * @return {ObjecSpy.callData} + */ + this.first = function() { + return calls[0]; + }; + + /** + * Get the most recent invocation of this spy. + * @name Spy#calls#mostRecent + * @function + * @return {ObjecSpy.callData} + */ + this.mostRecent = function() { + return calls[calls.length - 1]; + }; + + /** + * Reset this spy as if it has never been called. + * @name Spy#calls#reset + * @function + */ + this.reset = function() { + calls = []; + }; + + /** + * Set this spy to do a shallow clone of arguments passed to each invocation. + * @name Spy#calls#saveArgumentsByValue + * @function + */ + this.saveArgumentsByValue = function() { + opts.cloneArgs = true; + }; + + } + + return CallTracker; +}; + +getJasmineRequireObj().clearStack = function(j$) { + var maxInlineCallCount = 10; + + function messageChannelImpl(global, setTimeout) { + var channel = new global.MessageChannel(), + head = {}, + tail = head; + + var taskRunning = false; + channel.port1.onmessage = function() { + head = head.next; + var task = head.task; + delete head.task; + + if (taskRunning) { + global.setTimeout(task, 0); + } else { + try { + taskRunning = true; + task(); + } finally { + taskRunning = false; + } + } + }; + + var currentCallCount = 0; + return function clearStack(fn) { + currentCallCount++; + + if (currentCallCount < maxInlineCallCount) { + tail = tail.next = { task: fn }; + channel.port2.postMessage(0); + } else { + currentCallCount = 0; + setTimeout(fn); + } + }; + } + + function getClearStack(global) { + var currentCallCount = 0; + var realSetTimeout = global.setTimeout; + var setTimeoutImpl = function clearStack(fn) { + Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]); + }; + + if (j$.isFunction_(global.setImmediate)) { + var realSetImmediate = global.setImmediate; + return function(fn) { + currentCallCount++; + + if (currentCallCount < maxInlineCallCount) { + realSetImmediate(fn); + } else { + currentCallCount = 0; + + setTimeoutImpl(fn); + } + }; + } else if (!j$.util.isUndefined(global.MessageChannel)) { + return messageChannelImpl(global, setTimeoutImpl); + } else { + return setTimeoutImpl; + } + } + + return getClearStack; +}; + +getJasmineRequireObj().Clock = function() { + + /* global process */ + var NODE_JS = typeof process !== 'undefined' && process.versions && typeof process.versions.node === 'string'; + + /** + * _Note:_ Do not construct this directly, Jasmine will make one during booting. You can get the current clock with {@link jasmine.clock}. + * @class Clock + * @classdesc Jasmine's mock clock is used when testing time dependent code. + */ + function Clock(global, delayedFunctionSchedulerFactory, mockDate) { + var self = this, + realTimingFunctions = { + setTimeout: global.setTimeout, + clearTimeout: global.clearTimeout, + setInterval: global.setInterval, + clearInterval: global.clearInterval + }, + fakeTimingFunctions = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setInterval: setInterval, + clearInterval: clearInterval + }, + installed = false, + delayedFunctionScheduler, + timer; + + self.FakeTimeout = FakeTimeout; + + /** + * Install the mock clock over the built-in methods. + * @name Clock#install + * @function + * @return {Clock} + */ + self.install = function() { + if(!originalTimingFunctionsIntact()) { + throw new Error('Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?'); + } + replace(global, fakeTimingFunctions); + timer = fakeTimingFunctions; + delayedFunctionScheduler = delayedFunctionSchedulerFactory(); + installed = true; + + return self; + }; + + /** + * Uninstall the mock clock, returning the built-in methods to their places. + * @name Clock#uninstall + * @function + */ + self.uninstall = function() { + delayedFunctionScheduler = null; + mockDate.uninstall(); + replace(global, realTimingFunctions); + + timer = realTimingFunctions; + installed = false; + }; + + /** + * Execute a function with a mocked Clock + * + * The clock will be {@link Clock#install|install}ed before the function is called and {@link Clock#uninstall|uninstall}ed in a `finally` after the function completes. + * @name Clock#withMock + * @function + * @param {Function} closure The function to be called. + */ + self.withMock = function(closure) { + this.install(); + try { + closure(); + } finally { + this.uninstall(); + } + }; + + /** + * Instruct the installed Clock to also mock the date returned by `new Date()` + * @name Clock#mockDate + * @function + * @param {Date} [initialDate=now] The `Date` to provide. + */ + self.mockDate = function(initialDate) { + mockDate.install(initialDate); + }; + + self.setTimeout = function(fn, delay, params) { + return Function.prototype.apply.apply(timer.setTimeout, [global, arguments]); + }; + + self.setInterval = function(fn, delay, params) { + return Function.prototype.apply.apply(timer.setInterval, [global, arguments]); + }; + + self.clearTimeout = function(id) { + return Function.prototype.call.apply(timer.clearTimeout, [global, id]); + }; + + self.clearInterval = function(id) { + return Function.prototype.call.apply(timer.clearInterval, [global, id]); + }; + + /** + * Tick the Clock forward, running any enqueued timeouts along the way + * @name Clock#tick + * @function + * @param {int} millis The number of milliseconds to tick. + */ + self.tick = function(millis) { + if (installed) { + delayedFunctionScheduler.tick(millis, function(millis) { mockDate.tick(millis); }); + } else { + throw new Error('Mock clock is not installed, use jasmine.clock().install()'); + } + }; + + return self; + + function originalTimingFunctionsIntact() { + return global.setTimeout === realTimingFunctions.setTimeout && + global.clearTimeout === realTimingFunctions.clearTimeout && + global.setInterval === realTimingFunctions.setInterval && + global.clearInterval === realTimingFunctions.clearInterval; + } + + function replace(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + } + + function setTimeout(fn, delay) { + if (!NODE_JS) { + return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2)); + } + + var timeout = new FakeTimeout(); + + delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2), false, timeout); + + return timeout; + } + + function clearTimeout(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function setInterval(fn, interval) { + if (!NODE_JS) { + return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true); + } + + var timeout = new FakeTimeout(); + + delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true, timeout); + + return timeout; + } + + function clearInterval(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function argSlice(argsObj, n) { + return Array.prototype.slice.call(argsObj, n); + } + } + + /** + * Mocks Node.js Timeout class + */ + function FakeTimeout() {} + + FakeTimeout.prototype.ref = function () { + return this; + }; + + FakeTimeout.prototype.unref = function () { + return this; + }; + + return Clock; +}; + +getJasmineRequireObj().DelayedFunctionScheduler = function(j$) { + function DelayedFunctionScheduler() { + var self = this; + var scheduledLookup = []; + var scheduledFunctions = {}; + var currentTime = 0; + var delayedFnCount = 0; + var deletedKeys = []; + + self.tick = function(millis, tickDate) { + millis = millis || 0; + var endTime = currentTime + millis; + + runScheduledFunctions(endTime, tickDate); + currentTime = endTime; + }; + + self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { + var f; + if (typeof(funcToCall) === 'string') { + /* jshint evil: true */ + f = function() { return eval(funcToCall); }; + /* jshint evil: false */ + } else { + f = funcToCall; + } + + millis = millis || 0; + timeoutKey = timeoutKey || ++delayedFnCount; + runAtMillis = runAtMillis || (currentTime + millis); + + var funcToSchedule = { + runAtMillis: runAtMillis, + funcToCall: f, + recurring: recurring, + params: params, + timeoutKey: timeoutKey, + millis: millis + }; + + if (runAtMillis in scheduledFunctions) { + scheduledFunctions[runAtMillis].push(funcToSchedule); + } else { + scheduledFunctions[runAtMillis] = [funcToSchedule]; + scheduledLookup.push(runAtMillis); + scheduledLookup.sort(function (a, b) { + return a - b; + }); + } + + return timeoutKey; + }; + + self.removeFunctionWithId = function(timeoutKey) { + deletedKeys.push(timeoutKey); + + for (var runAtMillis in scheduledFunctions) { + var funcs = scheduledFunctions[runAtMillis]; + var i = indexOfFirstToPass(funcs, function (func) { + return func.timeoutKey === timeoutKey; + }); + + if (i > -1) { + if (funcs.length === 1) { + delete scheduledFunctions[runAtMillis]; + deleteFromLookup(runAtMillis); + } else { + funcs.splice(i, 1); + } + + // intervals get rescheduled when executed, so there's never more + // than a single scheduled function with a given timeoutKey + break; + } + } + }; + + return self; + + function indexOfFirstToPass(array, testFn) { + var index = -1; + + for (var i = 0; i < array.length; ++i) { + if (testFn(array[i])) { + index = i; + break; + } + } + + return index; + } + + function deleteFromLookup(key) { + var value = Number(key); + var i = indexOfFirstToPass(scheduledLookup, function (millis) { + return millis === value; + }); + + if (i > -1) { + scheduledLookup.splice(i, 1); + } + } + + function reschedule(scheduledFn) { + self.scheduleFunction(scheduledFn.funcToCall, + scheduledFn.millis, + scheduledFn.params, + true, + scheduledFn.timeoutKey, + scheduledFn.runAtMillis + scheduledFn.millis); + } + + function forEachFunction(funcsToRun, callback) { + for (var i = 0; i < funcsToRun.length; ++i) { + callback(funcsToRun[i]); + } + } + + function runScheduledFunctions(endTime, tickDate) { + tickDate = tickDate || function() {}; + if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) { + tickDate(endTime - currentTime); + return; + } + + do { + deletedKeys = []; + var newCurrentTime = scheduledLookup.shift(); + tickDate(newCurrentTime - currentTime); + + currentTime = newCurrentTime; + + var funcsToRun = scheduledFunctions[currentTime]; + + delete scheduledFunctions[currentTime]; + + forEachFunction(funcsToRun, function(funcToRun) { + if (funcToRun.recurring) { + reschedule(funcToRun); + } + }); + + forEachFunction(funcsToRun, function(funcToRun) { + if (j$.util.arrayContains(deletedKeys, funcToRun.timeoutKey)) { + // skip a timeoutKey deleted whilst we were running + return; + } + funcToRun.funcToCall.apply(null, funcToRun.params || []); + }); + deletedKeys = []; + } while (scheduledLookup.length > 0 && + // checking first if we're out of time prevents setTimeout(0) + // scheduled in a funcToRun from forcing an extra iteration + currentTime !== endTime && + scheduledLookup[0] <= endTime); + + // ran out of functions to call, but still time left on the clock + if (currentTime !== endTime) { + tickDate(endTime - currentTime); + } + } + } + + return DelayedFunctionScheduler; +}; + +getJasmineRequireObj().errors = function() { + function ExpectationFailed() {} + + ExpectationFailed.prototype = new Error(); + ExpectationFailed.prototype.constructor = ExpectationFailed; + + return { + ExpectationFailed: ExpectationFailed + }; +}; +getJasmineRequireObj().ExceptionFormatter = function(j$) { + + var ignoredProperties = ['name', 'message', 'stack', 'fileName', 'sourceURL', 'line', 'lineNumber', 'column', 'description', 'jasmineMessage']; + + function ExceptionFormatter(options) { + var jasmineFile = (options && options.jasmineFile) || j$.util.jasmineFile(); + this.message = function(error) { + var message = ''; + + if (error.jasmineMessage) { + message += error.jasmineMessage; + } else if (error.name && error.message) { + message += error.name + ': ' + error.message; + } else if (error.message) { + message += error.message; + } else { + message += error.toString() + ' thrown'; + } + + if (error.fileName || error.sourceURL) { + message += ' in ' + (error.fileName || error.sourceURL); + } + + if (error.line || error.lineNumber) { + message += ' (line ' + (error.line || error.lineNumber) + ')'; + } + + return message; + }; + + this.stack = function(error) { + if (!error || !error.stack) { + return null; + } + + var stackTrace = new j$.StackTrace(error); + var lines = filterJasmine(stackTrace); + var result = ''; + + if (stackTrace.message) { + lines.unshift(stackTrace.message); + } + + result += formatProperties(error); + result += lines.join('\n'); + + return result; + }; + + function filterJasmine(stackTrace) { + var result = [], + jasmineMarker = stackTrace.style === 'webkit' ? '<Jasmine>' : ' at <Jasmine>'; + + stackTrace.frames.forEach(function(frame) { + if (frame.file && frame.file !== jasmineFile) { + result.push(frame.raw); + } else if (result[result.length - 1] !== jasmineMarker) { + result.push(jasmineMarker); + } + }); + + return result; + } + + function formatProperties(error) { + if (!(error instanceof Object)) { + return; + } + + var result = {}; + var empty = true; + + for (var prop in error) { + if (j$.util.arrayContains(ignoredProperties, prop)) { + continue; + } + result[prop] = error[prop]; + empty = false; + } + + if (!empty) { + return 'error properties: ' + j$.pp(result) + '\n'; + } + + return ''; + } + } + + return ExceptionFormatter; +}; + +getJasmineRequireObj().Expectation = function(j$) { + var promiseForMessage = { + jasmineToString: function() { return 'a promise'; } + }; + + /** + * Matchers that come with Jasmine out of the box. + * @namespace matchers + */ + function Expectation(options) { + this.expector = new j$.Expector(options); + + var customMatchers = options.customMatchers || {}; + for (var matcherName in customMatchers) { + this[matcherName] = wrapSyncCompare(matcherName, customMatchers[matcherName]); + } + } + + /** + * Add some context for an {@link expect} + * @function + * @name matchers#withContext + * @param {String} message - Additional context to show when the matcher fails + * @return {matchers} + */ + Expectation.prototype.withContext = function withContext(message) { + return addFilter(this, new ContextAddingFilter(message)); + }; + + /** + * Invert the matcher following this {@link expect} + * @member + * @name matchers#not + * @type {matchers} + * @example + * expect(something).not.toBe(true); + */ + Object.defineProperty(Expectation.prototype, 'not', { + get: function() { + return addFilter(this, syncNegatingFilter); + } + }); + + /** + * Asynchronous matchers. + * @namespace async-matchers + */ + function AsyncExpectation(options) { + var global = options.global || j$.getGlobal(); + this.expector = new j$.Expector(options); + + if (!global.Promise) { + throw new Error('expectAsync is unavailable because the environment does not support promises.'); + } + + if (!j$.isPromiseLike(this.expector.actual)) { + throw new Error('Expected expectAsync to be called with a promise.'); + } + } + + /** + * Add some context for an {@link expectAsync} + * @function + * @name async-matchers#withContext + * @param {String} message - Additional context to show when the async matcher fails + * @return {async-matchers} + */ + AsyncExpectation.prototype.withContext = function withContext(message) { + return addFilter(this, new ContextAddingFilter(message)); + }; + + /** + * Invert the matcher following this {@link expectAsync} + * @member + * @name async-matchers#not + * @type {async-matchers} + * @example + * await expectAsync(myPromise).not.toBeResolved(); + * @example + * return expectAsync(myPromise).not.toBeResolved(); + */ + Object.defineProperty(AsyncExpectation.prototype, 'not', { + get: function() { + return addFilter(this, asyncNegatingFilter); + } + }); + + function wrapSyncCompare(name, matcherFactory) { + return function() { + var result = this.expector.compare(name, matcherFactory, arguments); + this.expector.processResult(result); + }; + } + + function wrapAsyncCompare(name, matcherFactory) { + return function() { + var self = this; + + // Capture the call stack here, before we go async, so that it will contain + // frames that are relevant to the user instead of just parts of Jasmine. + var errorForStack = j$.util.errorWithStack(); + + return this.expector.compare(name, matcherFactory, arguments).then(function(result) { + self.expector.processResult(result, errorForStack, promiseForMessage); + }); + }; + } + + function addCoreMatchers(prototype, matchers, wrapper) { + for (var matcherName in matchers) { + var matcher = matchers[matcherName]; + prototype[matcherName] = wrapper(matcherName, matcher); + } + } + + function addFilter(source, filter) { + var result = Object.create(source); + result.expector = source.expector.addFilter(filter); + return result; + } + + function negatedFailureMessage(result, matcherName, args, util) { + if (result.message) { + if (j$.isFunction_(result.message)) { + return result.message(); + } else { + return result.message; + } + } + + args = args.slice(); + args.unshift(true); + args.unshift(matcherName); + return util.buildFailureMessage.apply(null, args); + } + + function negate(result) { + result.pass = !result.pass; + return result; + } + + var syncNegatingFilter = { + selectComparisonFunc: function(matcher) { + function defaultNegativeCompare() { + return negate(matcher.compare.apply(null, arguments)); + } + + return matcher.negativeCompare || defaultNegativeCompare; + }, + buildFailureMessage: negatedFailureMessage + }; + + var asyncNegatingFilter = { + selectComparisonFunc: function(matcher) { + function defaultNegativeCompare() { + return matcher.compare.apply(this, arguments).then(negate); + } + + return defaultNegativeCompare; + }, + buildFailureMessage: negatedFailureMessage + }; + + function ContextAddingFilter(message) { + this.message = message; + } + + ContextAddingFilter.prototype.modifyFailureMessage = function(msg) { + return this.message + ': ' + msg; + }; + + return { + factory: function(options) { + return new Expectation(options || {}); + }, + addCoreMatchers: function(matchers) { + addCoreMatchers(Expectation.prototype, matchers, wrapSyncCompare); + }, + asyncFactory: function(options) { + return new AsyncExpectation(options || {}); + }, + addAsyncCoreMatchers: function(matchers) { + addCoreMatchers(AsyncExpectation.prototype, matchers, wrapAsyncCompare); + } + }; +}; + +getJasmineRequireObj().ExpectationFilterChain = function() { + function ExpectationFilterChain(maybeFilter, prev) { + this.filter_ = maybeFilter; + this.prev_ = prev; + } + + ExpectationFilterChain.prototype.addFilter = function(filter) { + return new ExpectationFilterChain(filter, this); + }; + + ExpectationFilterChain.prototype.selectComparisonFunc = function(matcher) { + return this.callFirst_('selectComparisonFunc', arguments).result; + }; + + ExpectationFilterChain.prototype.buildFailureMessage = function(result, matcherName, args, util) { + return this.callFirst_('buildFailureMessage', arguments).result; + }; + + ExpectationFilterChain.prototype.modifyFailureMessage = function(msg) { + var result = this.callFirst_('modifyFailureMessage', arguments).result; + return result || msg; + }; + + ExpectationFilterChain.prototype.callFirst_ = function(fname, args) { + var prevResult; + + if (this.prev_) { + prevResult = this.prev_.callFirst_(fname, args); + + if (prevResult.found) { + return prevResult; + } + } + + if (this.filter_ && this.filter_[fname]) { + return { + found: true, + result: this.filter_[fname].apply(this.filter_, args) + }; + } + + return {found: false}; + }; + + return ExpectationFilterChain; +}; + +//TODO: expectation result may make more sense as a presentation of an expectation. +getJasmineRequireObj().buildExpectationResult = function() { + function buildExpectationResult(options) { + var messageFormatter = options.messageFormatter || function() {}, + stackFormatter = options.stackFormatter || function() {}; + + /** + * @typedef Expectation + * @property {String} matcherName - The name of the matcher that was executed for this expectation. + * @property {String} message - The failure message for the expectation. + * @property {String} stack - The stack trace for the failure if available. + * @property {Boolean} passed - Whether the expectation passed or failed. + * @property {Object} expected - If the expectation failed, what was the expected value. + * @property {Object} actual - If the expectation failed, what actual value was produced. + */ + var result = { + matcherName: options.matcherName, + message: message(), + stack: stack(), + passed: options.passed + }; + + if(!result.passed) { + result.expected = options.expected; + result.actual = options.actual; + } + + return result; + + function message() { + if (options.passed) { + return 'Passed.'; + } else if (options.message) { + return options.message; + } else if (options.error) { + return messageFormatter(options.error); + } + return ''; + } + + function stack() { + if (options.passed) { + return ''; + } + + var error = options.error; + if (!error) { + if (options.errorForStack) { + error = options.errorForStack; + } else if (options.stack) { + error = options; + } else { + try { + throw new Error(message()); + } catch (e) { + error = e; + } + } + } + return stackFormatter(error); + } + } + + return buildExpectationResult; +}; + +getJasmineRequireObj().Expector = function(j$) { + function Expector(options) { + this.util = options.util || { buildFailureMessage: function() {} }; + this.customEqualityTesters = options.customEqualityTesters || []; + this.actual = options.actual; + this.addExpectationResult = options.addExpectationResult || function(){}; + this.filters = new j$.ExpectationFilterChain(); + } + + Expector.prototype.instantiateMatcher = function(matcherName, matcherFactory, args) { + this.matcherName = matcherName; + this.args = Array.prototype.slice.call(args, 0); + this.expected = this.args.slice(0); + + this.args.unshift(this.actual); + + var matcher = matcherFactory(this.util, this.customEqualityTesters); + var comparisonFunc = this.filters.selectComparisonFunc(matcher); + return comparisonFunc || matcher.compare; + }; + + Expector.prototype.buildMessage = function(result) { + var self = this; + + if (result.pass) { + return ''; + } + + var msg = this.filters.buildFailureMessage(result, this.matcherName, this.args, this.util, defaultMessage); + return this.filters.modifyFailureMessage(msg || defaultMessage()); + + function defaultMessage() { + if (!result.message) { + var args = self.args.slice(); + args.unshift(false); + args.unshift(self.matcherName); + return self.util.buildFailureMessage.apply(null, args); + } else if (j$.isFunction_(result.message)) { + return result.message(); + } else { + return result.message; + } + } + }; + + Expector.prototype.compare = function(matcherName, matcherFactory, args) { + var matcherCompare = this.instantiateMatcher(matcherName, matcherFactory, args); + return matcherCompare.apply(null, this.args); + }; + + Expector.prototype.addFilter = function(filter) { + var result = Object.create(this); + result.filters = this.filters.addFilter(filter); + return result; + }; + + Expector.prototype.processResult = function(result, errorForStack, actualOverride) { + this.args[0] = actualOverride || this.args[0]; + var message = this.buildMessage(result); + + if (this.expected.length === 1) { + this.expected = this.expected[0]; + } + + this.addExpectationResult( + result.pass, + { + matcherName: this.matcherName, + passed: result.pass, + message: message, + error: errorForStack ? undefined : result.error, + errorForStack: errorForStack || undefined, + actual: this.actual, + expected: this.expected // TODO: this may need to be arrayified/sliced + } + ); + }; + + return Expector; +}; + +getJasmineRequireObj().formatErrorMsg = function() { + function generateErrorMsg(domain, usage) { + var usageDefinition = usage ? '\nUsage: ' + usage : ''; + + return function errorMsg(msg) { + return domain + ' : ' + msg + usageDefinition; + }; + } + + return generateErrorMsg; +}; + +getJasmineRequireObj().GlobalErrors = function(j$) { + function GlobalErrors(global) { + var handlers = []; + global = global || j$.getGlobal(); + + var onerror = function onerror() { + var handler = handlers[handlers.length - 1]; + + if (handler) { + handler.apply(null, Array.prototype.slice.call(arguments, 0)); + } else { + throw arguments[0]; + } + }; + + this.originalHandlers = {}; + this.jasmineHandlers = {}; + this.installOne_ = function installOne_(errorType, jasmineMessage) { + function taggedOnError(error) { + error.jasmineMessage = jasmineMessage + ': ' + error; + + var handler = handlers[handlers.length - 1]; + + if (handler) { + handler(error); + } else { + throw error; + } + } + + this.originalHandlers[errorType] = global.process.listeners(errorType); + this.jasmineHandlers[errorType] = taggedOnError; + + global.process.removeAllListeners(errorType); + global.process.on(errorType, taggedOnError); + + this.uninstall = function uninstall() { + var errorTypes = Object.keys(this.originalHandlers); + for (var iType = 0; iType < errorTypes.length; iType++) { + var errorType = errorTypes[iType]; + global.process.removeListener(errorType, this.jasmineHandlers[errorType]); + for (var i = 0; i < this.originalHandlers[errorType].length; i++) { + global.process.on(errorType, this.originalHandlers[errorType][i]); + } + delete this.originalHandlers[errorType]; + delete this.jasmineHandlers[errorType]; + } + }; + }; + + this.install = function install() { + if (global.process && global.process.listeners && j$.isFunction_(global.process.on)) { + this.installOne_('uncaughtException', 'Uncaught exception'); + this.installOne_('unhandledRejection', 'Unhandled promise rejection'); + } else { + var originalHandler = global.onerror; + global.onerror = onerror; + + this.uninstall = function uninstall() { + global.onerror = originalHandler; + }; + } + }; + + this.pushListener = function pushListener(listener) { + handlers.push(listener); + }; + + this.popListener = function popListener() { + handlers.pop(); + }; + } + + return GlobalErrors; +}; + +getJasmineRequireObj().toBeRejected = function(j$) { + /** + * Expect a promise to be rejected. + * @function + * @async + * @name async-matchers#toBeRejected + * @example + * await expectAsync(aPromise).toBeRejected(); + * @example + * return expectAsync(aPromise).toBeRejected(); + */ + return function toBeResolved(util) { + return { + compare: function(actual) { + return actual.then( + function() { return {pass: false}; }, + function() { return {pass: true}; } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeRejectedWith = function(j$) { + /** + * Expect a promise to be rejected with a value equal to the expected, using deep equality comparison. + * @function + * @async + * @name async-matchers#toBeRejectedWith + * @param {Object} expected - Value that the promise is expected to be rejected with + * @example + * await expectAsync(aPromise).toBeRejectedWith({prop: 'value'}); + * @example + * return expectAsync(aPromise).toBeRejectedWith({prop: 'value'}); + */ + return function toBeRejectedWith(util, customEqualityTesters) { + return { + compare: function(actualPromise, expectedValue) { + function prefix(passed) { + return 'Expected a promise ' + + (passed ? 'not ' : '') + + 'to be rejected with ' + j$.pp(expectedValue); + } + + return actualPromise.then( + function() { + return { + pass: false, + message: prefix(false) + ' but it was resolved.' + }; + }, + function(actualValue) { + if (util.equals(actualValue, expectedValue, customEqualityTesters)) { + return { + pass: true, + message: prefix(true) + '.' + }; + } else { + return { + pass: false, + message: prefix(false) + ' but it was rejected with ' + j$.pp(actualValue) + '.' + }; + } + } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeResolved = function(j$) { + /** + * Expect a promise to be resolved. + * @function + * @async + * @name async-matchers#toBeResolved + * @example + * await expectAsync(aPromise).toBeResolved(); + * @example + * return expectAsync(aPromise).toBeResolved(); + */ + return function toBeResolved(util) { + return { + compare: function(actual) { + return actual.then( + function() { return {pass: true}; }, + function() { return {pass: false}; } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeResolvedTo = function(j$) { + /** + * Expect a promise to be resolved to a value equal to the expected, using deep equality comparison. + * @function + * @async + * @name async-matchers#toBeResolvedTo + * @param {Object} expected - Value that the promise is expected to resolve to + * @example + * await expectAsync(aPromise).toBeResolvedTo({prop: 'value'}); + * @example + * return expectAsync(aPromise).toBeResolvedTo({prop: 'value'}); + */ + return function toBeResolvedTo(util, customEqualityTesters) { + return { + compare: function(actualPromise, expectedValue) { + function prefix(passed) { + return 'Expected a promise ' + + (passed ? 'not ' : '') + + 'to be resolved to ' + j$.pp(expectedValue); + } + + return actualPromise.then( + function(actualValue) { + if (util.equals(actualValue, expectedValue, customEqualityTesters)) { + return { + pass: true, + message: prefix(true) + '.' + }; + } else { + return { + pass: false, + message: prefix(false) + ' but it was resolved to ' + j$.pp(actualValue) + '.' + }; + } + }, + function() { + return { + pass: false, + message: prefix(false) + ' but it was rejected.' + }; + } + ); + } + }; + }; +}; + +getJasmineRequireObj().DiffBuilder = function(j$) { + return function DiffBuilder() { + var path = new j$.ObjectPath(), + mismatches = []; + + return { + record: function (actual, expected, formatter) { + formatter = formatter || defaultFormatter; + mismatches.push(formatter(actual, expected, path)); + }, + + getMessage: function () { + return mismatches.join('\n'); + }, + + withPath: function (pathComponent, block) { + var oldPath = path; + path = path.add(pathComponent); + block(); + path = oldPath; + } + }; + + function defaultFormatter (actual, expected, path) { + return 'Expected ' + + path + (path.depth() ? ' = ' : '') + + j$.pp(actual) + + ' to equal ' + + j$.pp(expected) + + '.'; + } + }; +}; + +getJasmineRequireObj().matchersUtil = function(j$) { + // TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter? + + return { + equals: equals, + + contains: function(haystack, needle, customTesters) { + customTesters = customTesters || []; + + if ((Object.prototype.toString.apply(haystack) === '[object Set]')) { + return haystack.has(needle); + } + + if ((Object.prototype.toString.apply(haystack) === '[object Array]') || + (!!haystack && !haystack.indexOf)) + { + for (var i = 0; i < haystack.length; i++) { + if (equals(haystack[i], needle, customTesters)) { + return true; + } + } + return false; + } + + return !!haystack && haystack.indexOf(needle) >= 0; + }, + + buildFailureMessage: function() { + var args = Array.prototype.slice.call(arguments, 0), + matcherName = args[0], + isNot = args[1], + actual = args[2], + expected = args.slice(3), + englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); + + var message = 'Expected ' + + j$.pp(actual) + + (isNot ? ' not ' : ' ') + + englishyPredicate; + + if (expected.length > 0) { + for (var i = 0; i < expected.length; i++) { + if (i > 0) { + message += ','; + } + message += ' ' + j$.pp(expected[i]); + } + } + + return message + '.'; + } + }; + + function isAsymmetric(obj) { + return obj && j$.isA_('Function', obj.asymmetricMatch); + } + + function asymmetricMatch(a, b, customTesters, diffBuilder) { + var asymmetricA = isAsymmetric(a), + asymmetricB = isAsymmetric(b), + result; + + if (asymmetricA && asymmetricB) { + return undefined; + } + + if (asymmetricA) { + result = a.asymmetricMatch(b, customTesters); + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + + if (asymmetricB) { + result = b.asymmetricMatch(a, customTesters); + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + } + + function equals(a, b, customTesters, diffBuilder) { + customTesters = customTesters || []; + diffBuilder = diffBuilder || j$.NullDiffBuilder(); + + return eq(a, b, [], [], customTesters, diffBuilder); + } + + // Equality function lovingly adapted from isEqual in + // [Underscore](http://underscorejs.org) + function eq(a, b, aStack, bStack, customTesters, diffBuilder) { + var result = true, i; + + var asymmetricResult = asymmetricMatch(a, b, customTesters, diffBuilder); + if (!j$.util.isUndefined(asymmetricResult)) { + return asymmetricResult; + } + + for (i = 0; i < customTesters.length; i++) { + var customTesterResult = customTesters[i](a, b); + if (!j$.util.isUndefined(customTesterResult)) { + if (!customTesterResult) { + diffBuilder.record(a, b); + } + return customTesterResult; + } + } + + if (a instanceof Error && b instanceof Error) { + result = a.message == b.message; + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) { + result = a !== 0 || 1 / a == 1 / b; + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + // A strict comparison is necessary because `null == undefined`. + if (a === null || b === null) { + result = a === b; + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + var className = Object.prototype.toString.call(a); + if (className != Object.prototype.toString.call(b)) { + diffBuilder.record(a, b); + return false; + } + switch (className) { + // Strings, numbers, dates, and booleans are compared by value. + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + result = a == String(b); + if (!result) { + diffBuilder.record(a, b); + } + return result; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for + // other numeric values. + result = a != +a ? b != +b : (a === 0 ? 1 / a == 1 / b : a == +b); + if (!result) { + diffBuilder.record(a, b); + } + return result; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + result = +a == +b; + if (!result) { + diffBuilder.record(a, b); + } + return result; + // RegExps are compared by their source patterns and flags. + case '[object RegExp]': + return a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase; + } + if (typeof a != 'object' || typeof b != 'object') { + diffBuilder.record(a, b); + return false; + } + + var aIsDomNode = j$.isDomNode(a); + var bIsDomNode = j$.isDomNode(b); + if (aIsDomNode && bIsDomNode) { + // At first try to use DOM3 method isEqualNode + result = a.isEqualNode(b); + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + if (aIsDomNode || bIsDomNode) { + diffBuilder.record(a, b); + return false; + } + + var aIsPromise = j$.isPromise(a); + var bIsPromise = j$.isPromise(b); + if (aIsPromise && bIsPromise) { + return a === b; + } + + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] == a) { return bStack[length] == b; } + } + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + var size = 0; + // Recursively compare objects and arrays. + // Compare array lengths to determine if a deep comparison is necessary. + if (className == '[object Array]') { + var aLength = a.length; + var bLength = b.length; + + diffBuilder.withPath('length', function() { + if (aLength !== bLength) { + diffBuilder.record(aLength, bLength); + result = false; + } + }); + + for (i = 0; i < aLength || i < bLength; i++) { + var formatter = false; + diffBuilder.withPath(i, function() { + if (i >= bLength) { + diffBuilder.record(a[i], void 0, actualArrayIsLongerFormatter); + result = false; + } else { + result = eq(i < aLength ? a[i] : void 0, i < bLength ? b[i] : void 0, aStack, bStack, customTesters, diffBuilder) && result; + } + }); + } + if (!result) { + return false; + } + } else if (j$.isMap(a) && j$.isMap(b)) { + if (a.size != b.size) { + diffBuilder.record(a, b); + return false; + } + + var keysA = []; + var keysB = []; + a.forEach( function( valueA, keyA ) { + keysA.push( keyA ); + }); + b.forEach( function( valueB, keyB ) { + keysB.push( keyB ); + }); + + // For both sets of keys, check they map to equal values in both maps. + // Keep track of corresponding keys (in insertion order) in order to handle asymmetric obj keys. + var mapKeys = [keysA, keysB]; + var cmpKeys = [keysB, keysA]; + var mapIter, mapKey, mapValueA, mapValueB; + var cmpIter, cmpKey; + for (i = 0; result && i < mapKeys.length; i++) { + mapIter = mapKeys[i]; + cmpIter = cmpKeys[i]; + + for (var j = 0; result && j < mapIter.length; j++) { + mapKey = mapIter[j]; + cmpKey = cmpIter[j]; + mapValueA = a.get(mapKey); + + // Only use the cmpKey when one of the keys is asymmetric and the corresponding key matches, + // otherwise explicitly look up the mapKey in the other Map since we want keys with unique + // obj identity (that are otherwise equal) to not match. + if (isAsymmetric(mapKey) || isAsymmetric(cmpKey) && + eq(mapKey, cmpKey, aStack, bStack, customTesters, j$.NullDiffBuilder())) { + mapValueB = b.get(cmpKey); + } else { + mapValueB = b.get(mapKey); + } + result = eq(mapValueA, mapValueB, aStack, bStack, customTesters, j$.NullDiffBuilder()); + } + } + + if (!result) { + diffBuilder.record(a, b); + return false; + } + } else if (j$.isSet(a) && j$.isSet(b)) { + if (a.size != b.size) { + diffBuilder.record(a, b); + return false; + } + + var valuesA = []; + a.forEach( function( valueA ) { + valuesA.push( valueA ); + }); + var valuesB = []; + b.forEach( function( valueB ) { + valuesB.push( valueB ); + }); + + // For both sets, check they are all contained in the other set + var setPairs = [[valuesA, valuesB], [valuesB, valuesA]]; + var stackPairs = [[aStack, bStack], [bStack, aStack]]; + var baseValues, baseValue, baseStack; + var otherValues, otherValue, otherStack; + var found; + var prevStackSize; + for (i = 0; result && i < setPairs.length; i++) { + baseValues = setPairs[i][0]; + otherValues = setPairs[i][1]; + baseStack = stackPairs[i][0]; + otherStack = stackPairs[i][1]; + // For each value in the base set... + for (var k = 0; result && k < baseValues.length; k++) { + baseValue = baseValues[k]; + found = false; + // ... test that it is present in the other set + for (var l = 0; !found && l < otherValues.length; l++) { + otherValue = otherValues[l]; + prevStackSize = baseStack.length; + // compare by value equality + found = eq(baseValue, otherValue, baseStack, otherStack, customTesters, j$.NullDiffBuilder()); + if (!found && prevStackSize !== baseStack.length) { + baseStack.splice(prevStackSize); + otherStack.splice(prevStackSize); + } + } + result = result && found; + } + } + + if (!result) { + diffBuilder.record(a, b); + return false; + } + } else { + + // Objects with different constructors are not equivalent, but `Object`s + // or `Array`s from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && + isFunction(aCtor) && isFunction(bCtor) && + a instanceof aCtor && b instanceof bCtor && + !(aCtor instanceof aCtor && bCtor instanceof bCtor)) { + + diffBuilder.record(a, b, constructorsAreDifferentFormatter); + return false; + } + } + + // Deep compare objects. + var aKeys = keys(a, className == '[object Array]'), key; + size = aKeys.length; + + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b, className == '[object Array]').length !== size) { + diffBuilder.record(a, b, objectKeysAreDifferentFormatter); + return false; + } + + for (i = 0; i < size; i++) { + key = aKeys[i]; + // Deep compare each member + if (!j$.util.has(b, key)) { + diffBuilder.record(a, b, objectKeysAreDifferentFormatter); + result = false; + continue; + } + + diffBuilder.withPath(key, function() { + if(!eq(a[key], b[key], aStack, bStack, customTesters, diffBuilder)) { + result = false; + } + }); + } + + if (!result) { + return false; + } + + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + + return result; + } + + function keys(obj, isArray) { + var allKeys = Object.keys ? Object.keys(obj) : + (function(o) { + var keys = []; + for (var key in o) { + if (j$.util.has(o, key)) { + keys.push(key); + } + } + return keys; + })(obj); + + if (!isArray) { + return allKeys; + } + + if (allKeys.length === 0) { + return allKeys; + } + + var extraKeys = []; + for (var i = 0; i < allKeys.length; i++) { + if (!/^[0-9]+$/.test(allKeys[i])) { + extraKeys.push(allKeys[i]); + } + } + + return extraKeys; + } + + function has(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + } + + function isFunction(obj) { + return typeof obj === 'function'; + } + + function objectKeysAreDifferentFormatter(actual, expected, path) { + var missingProperties = j$.util.objectDifference(expected, actual), + extraProperties = j$.util.objectDifference(actual, expected), + missingPropertiesMessage = formatKeyValuePairs(missingProperties), + extraPropertiesMessage = formatKeyValuePairs(extraProperties), + messages = []; + + if (!path.depth()) { + path = 'object'; + } + + if (missingPropertiesMessage.length) { + messages.push('Expected ' + path + ' to have properties' + missingPropertiesMessage); + } + + if (extraPropertiesMessage.length) { + messages.push('Expected ' + path + ' not to have properties' + extraPropertiesMessage); + } + + return messages.join('\n'); + } + + function constructorsAreDifferentFormatter(actual, expected, path) { + if (!path.depth()) { + path = 'object'; + } + + return 'Expected ' + + path + ' to be a kind of ' + + j$.fnNameFor(expected.constructor) + + ', but was ' + j$.pp(actual) + '.'; + } + + function actualArrayIsLongerFormatter(actual, expected, path) { + return 'Unexpected ' + + path + (path.depth() ? ' = ' : '') + + j$.pp(actual) + + ' in array.'; + } + + function formatKeyValuePairs(obj) { + var formatted = ''; + for (var key in obj) { + formatted += '\n ' + key + ': ' + j$.pp(obj[key]); + } + return formatted; + } +}; + +getJasmineRequireObj().nothing = function() { + /** + * {@link expect} nothing explicitly. + * @function + * @name matchers#nothing + * @example + * expect().nothing(); + */ + function nothing() { + return { + compare: function() { + return { + pass: true + }; + } + }; + } + + return nothing; +}; + +getJasmineRequireObj().NullDiffBuilder = function(j$) { + return function() { + return { + withPath: function(_, block) { + block(); + }, + record: function() {} + }; + }; +}; + +getJasmineRequireObj().ObjectPath = function(j$) { + function ObjectPath(components) { + this.components = components || []; + } + + ObjectPath.prototype.toString = function() { + if (this.components.length) { + return '$' + map(this.components, formatPropertyAccess).join(''); + } else { + return ''; + } + }; + + ObjectPath.prototype.add = function(component) { + return new ObjectPath(this.components.concat([component])); + }; + + ObjectPath.prototype.depth = function() { + return this.components.length; + }; + + function formatPropertyAccess(prop) { + if (typeof prop === 'number') { + return '[' + prop + ']'; + } + + if (isValidIdentifier(prop)) { + return '.' + prop; + } + + return '[\'' + prop + '\']'; + } + + function map(array, fn) { + var results = []; + for (var i = 0; i < array.length; i++) { + results.push(fn(array[i])); + } + return results; + } + + function isValidIdentifier(string) { + return /^[A-Za-z\$_][A-Za-z0-9\$_]*$/.test(string); + } + + return ObjectPath; +}; + +getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) { + var availableMatchers = [ + 'toBeResolved', + 'toBeRejected', + 'toBeResolvedTo', + 'toBeRejectedWith' + ], + matchers = {}; + + for (var i = 0; i < availableMatchers.length; i++) { + var name = availableMatchers[i]; + matchers[name] = jRequire[name](j$); + } + + return matchers; +}; + +getJasmineRequireObj().toBe = function(j$) { + /** + * {@link expect} the actual value to be `===` to the expected value. + * @function + * @name matchers#toBe + * @param {Object} expected - The expected value to compare against. + * @example + * expect(thing).toBe(realThing); + */ + function toBe(util) { + var tip = ' Tip: To check for deep equality, use .toEqual() instead of .toBe().'; + + return { + compare: function(actual, expected) { + var result = { + pass: actual === expected, + }; + + if (typeof expected === 'object') { + result.message = util.buildFailureMessage('toBe', result.pass, actual, expected) + tip; + } + + return result; + } + }; + } + + return toBe; +}; + +getJasmineRequireObj().toBeCloseTo = function() { + /** + * {@link expect} the actual value to be within a specified precision of the expected value. + * @function + * @name matchers#toBeCloseTo + * @param {Object} expected - The expected value to compare against. + * @param {Number} [precision=2] - The number of decimal points to check. + * @example + * expect(number).toBeCloseTo(42.2, 3); + */ + function toBeCloseTo() { + return { + compare: function(actual, expected, precision) { + if (precision !== 0) { + precision = precision || 2; + } + + if (expected === null || actual === null) { + throw new Error('Cannot use toBeCloseTo with null. Arguments evaluated to: ' + + 'expect(' + actual + ').toBeCloseTo(' + expected + ').' + ); + } + + var pow = Math.pow(10, precision + 1); + var delta = Math.abs(expected - actual); + var maxDelta = Math.pow(10, -precision) / 2; + + return { + pass: Math.round(delta * pow) / pow <= maxDelta + }; + } + }; + } + + return toBeCloseTo; +}; + +getJasmineRequireObj().toBeDefined = function() { + /** + * {@link expect} the actual value to be defined. (Not `undefined`) + * @function + * @name matchers#toBeDefined + * @example + * expect(result).toBeDefined(); + */ + function toBeDefined() { + return { + compare: function(actual) { + return { + pass: (void 0 !== actual) + }; + } + }; + } + + return toBeDefined; +}; + +getJasmineRequireObj().toBeFalsy = function() { + /** + * {@link expect} the actual value to be falsy + * @function + * @name matchers#toBeFalsy + * @example + * expect(result).toBeFalsy(); + */ + function toBeFalsy() { + return { + compare: function(actual) { + return { + pass: !!!actual + }; + } + }; + } + + return toBeFalsy; +}; + +getJasmineRequireObj().toBeGreaterThan = function() { + /** + * {@link expect} the actual value to be greater than the expected value. + * @function + * @name matchers#toBeGreaterThan + * @param {Number} expected - The value to compare against. + * @example + * expect(result).toBeGreaterThan(3); + */ + function toBeGreaterThan() { + return { + compare: function(actual, expected) { + return { + pass: actual > expected + }; + } + }; + } + + return toBeGreaterThan; +}; + + +getJasmineRequireObj().toBeGreaterThanOrEqual = function() { + /** + * {@link expect} the actual value to be greater than or equal to the expected value. + * @function + * @name matchers#toBeGreaterThanOrEqual + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeGreaterThanOrEqual(25); + */ + function toBeGreaterThanOrEqual() { + return { + compare: function(actual, expected) { + return { + pass: actual >= expected + }; + } + }; + } + + return toBeGreaterThanOrEqual; +}; + +getJasmineRequireObj().toBeLessThan = function() { + /** + * {@link expect} the actual value to be less than the expected value. + * @function + * @name matchers#toBeLessThan + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeLessThan(0); + */ + function toBeLessThan() { + return { + + compare: function(actual, expected) { + return { + pass: actual < expected + }; + } + }; + } + + return toBeLessThan; +}; + +getJasmineRequireObj().toBeLessThanOrEqual = function() { + /** + * {@link expect} the actual value to be less than or equal to the expected value. + * @function + * @name matchers#toBeLessThanOrEqual + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeLessThanOrEqual(123); + */ + function toBeLessThanOrEqual() { + return { + + compare: function(actual, expected) { + return { + pass: actual <= expected + }; + } + }; + } + + return toBeLessThanOrEqual; +}; + +getJasmineRequireObj().toBeNaN = function(j$) { + /** + * {@link expect} the actual value to be `NaN` (Not a Number). + * @function + * @name matchers#toBeNaN + * @example + * expect(thing).toBeNaN(); + */ + function toBeNaN() { + return { + compare: function(actual) { + var result = { + pass: (actual !== actual) + }; + + if (result.pass) { + result.message = 'Expected actual not to be NaN.'; + } else { + result.message = function() { return 'Expected ' + j$.pp(actual) + ' to be NaN.'; }; + } + + return result; + } + }; + } + + return toBeNaN; +}; + +getJasmineRequireObj().toBeNegativeInfinity = function(j$) { + /** + * {@link expect} the actual value to be `-Infinity` (-infinity). + * @function + * @name matchers#toBeNegativeInfinity + * @example + * expect(thing).toBeNegativeInfinity(); + */ + function toBeNegativeInfinity() { + return { + compare: function(actual) { + var result = { + pass: (actual === Number.NEGATIVE_INFINITY) + }; + + if (result.pass) { + result.message = 'Expected actual to be -Infinity.'; + } else { + result.message = function() { return 'Expected ' + j$.pp(actual) + ' not to be -Infinity.'; }; + } + + return result; + } + }; + } + + return toBeNegativeInfinity; +}; + +getJasmineRequireObj().toBeNull = function() { + /** + * {@link expect} the actual value to be `null`. + * @function + * @name matchers#toBeNull + * @example + * expect(result).toBeNull(); + */ + function toBeNull() { + return { + compare: function(actual) { + return { + pass: actual === null + }; + } + }; + } + + return toBeNull; +}; + +getJasmineRequireObj().toBePositiveInfinity = function(j$) { + /** + * {@link expect} the actual value to be `Infinity` (infinity). + * @function + * @name matchers#toBePositiveInfinity + * @example + * expect(thing).toBePositiveInfinity(); + */ + function toBePositiveInfinity() { + return { + compare: function(actual) { + var result = { + pass: (actual === Number.POSITIVE_INFINITY) + }; + + if (result.pass) { + result.message = 'Expected actual to be Infinity.'; + } else { + result.message = function() { return 'Expected ' + j$.pp(actual) + ' not to be Infinity.'; }; + } + + return result; + } + }; + } + + return toBePositiveInfinity; +}; + +getJasmineRequireObj().toBeTruthy = function() { + /** + * {@link expect} the actual value to be truthy. + * @function + * @name matchers#toBeTruthy + * @example + * expect(thing).toBeTruthy(); + */ + function toBeTruthy() { + return { + compare: function(actual) { + return { + pass: !!actual + }; + } + }; + } + + return toBeTruthy; +}; + +getJasmineRequireObj().toBeUndefined = function() { + /** + * {@link expect} the actual value to be `undefined`. + * @function + * @name matchers#toBeUndefined + * @example + * expect(result).toBeUndefined(): + */ + function toBeUndefined() { + return { + compare: function(actual) { + return { + pass: void 0 === actual + }; + } + }; + } + + return toBeUndefined; +}; + +getJasmineRequireObj().toContain = function() { + /** + * {@link expect} the actual value to contain a specific value. + * @function + * @name matchers#toContain + * @param {Object} expected - The value to look for. + * @example + * expect(array).toContain(anElement); + * expect(string).toContain(substring); + */ + function toContain(util, customEqualityTesters) { + customEqualityTesters = customEqualityTesters || []; + + return { + compare: function(actual, expected) { + + return { + pass: util.contains(actual, expected, customEqualityTesters) + }; + } + }; + } + + return toContain; +}; + +getJasmineRequireObj().toEqual = function(j$) { + /** + * {@link expect} the actual value to be equal to the expected, using deep equality comparison. + * @function + * @name matchers#toEqual + * @param {Object} expected - Expected value + * @example + * expect(bigObject).toEqual({"foo": ['bar', 'baz']}); + */ + function toEqual(util, customEqualityTesters) { + customEqualityTesters = customEqualityTesters || []; + + return { + compare: function(actual, expected) { + var result = { + pass: false + }, + diffBuilder = j$.DiffBuilder(); + + result.pass = util.equals(actual, expected, customEqualityTesters, diffBuilder); + + // TODO: only set error message if test fails + result.message = diffBuilder.getMessage(); + + return result; + } + }; + } + + return toEqual; +}; + +getJasmineRequireObj().toHaveBeenCalled = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalled>', 'expect(<spyObj>).toHaveBeenCalled()'); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called. + * @function + * @name matchers#toHaveBeenCalled + * @example + * expect(mySpy).toHaveBeenCalled(); + * expect(mySpy).not.toHaveBeenCalled(); + */ + function toHaveBeenCalled() { + return { + compare: function(actual) { + var result = {}; + + if (!j$.isSpy(actual)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); + } + + if (arguments.length > 1) { + throw new Error(getErrorMsg('Does not take arguments, use toHaveBeenCalledWith')); + } + + result.pass = actual.calls.any(); + + result.message = result.pass ? + 'Expected spy ' + actual.and.identity + ' not to have been called.' : + 'Expected spy ' + actual.and.identity + ' to have been called.'; + + return result; + } + }; + } + + return toHaveBeenCalled; +}; + +getJasmineRequireObj().toHaveBeenCalledBefore = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledBefore>', 'expect(<spyObj>).toHaveBeenCalledBefore(<spyObj>)'); + + /** + * {@link expect} the actual value (a {@link Spy}) to have been called before another {@link Spy}. + * @function + * @name matchers#toHaveBeenCalledBefore + * @param {Spy} expected - {@link Spy} that should have been called after the `actual` {@link Spy}. + * @example + * expect(mySpy).toHaveBeenCalledBefore(otherSpy); + */ + function toHaveBeenCalledBefore() { + return { + compare: function(firstSpy, latterSpy) { + if (!j$.isSpy(firstSpy)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(firstSpy) + '.')); + } + if (!j$.isSpy(latterSpy)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(latterSpy) + '.')); + } + + var result = { pass: false }; + + if (!firstSpy.calls.count()) { + result.message = 'Expected spy ' + firstSpy.and.identity + ' to have been called.'; + return result; + } + if (!latterSpy.calls.count()) { + result.message = 'Expected spy ' + latterSpy.and.identity + ' to have been called.'; + return result; + } + + var latest1stSpyCall = firstSpy.calls.mostRecent().invocationOrder; + var first2ndSpyCall = latterSpy.calls.first().invocationOrder; + + result.pass = latest1stSpyCall < first2ndSpyCall; + + if (result.pass) { + result.message = 'Expected spy ' + firstSpy.and.identity + ' to not have been called before spy ' + latterSpy.and.identity + ', but it was'; + } else { + var first1stSpyCall = firstSpy.calls.first().invocationOrder; + var latest2ndSpyCall = latterSpy.calls.mostRecent().invocationOrder; + + if(first1stSpyCall < first2ndSpyCall) { + result.message = 'Expected latest call to spy ' + firstSpy.and.identity + ' to have been called before first call to spy ' + latterSpy.and.identity + ' (no interleaved calls)'; + } else if (latest2ndSpyCall > latest1stSpyCall) { + result.message = 'Expected first call to spy ' + latterSpy.and.identity + ' to have been called after latest call to spy ' + firstSpy.and.identity + ' (no interleaved calls)'; + } else { + result.message = 'Expected spy ' + firstSpy.and.identity + ' to have been called before spy ' + latterSpy.and.identity; + } + } + + return result; + } + }; + } + + return toHaveBeenCalledBefore; +}; + +getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledTimes>', 'expect(<spyObj>).toHaveBeenCalledTimes(<Number>)'); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called the specified number of times. + * @function + * @name matchers#toHaveBeenCalledTimes + * @param {Number} expected - The number of invocations to look for. + * @example + * expect(mySpy).toHaveBeenCalledTimes(3); + */ + function toHaveBeenCalledTimes() { + return { + compare: function(actual, expected) { + if (!j$.isSpy(actual)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); + } + + var args = Array.prototype.slice.call(arguments, 0), + result = { pass: false }; + + if (!j$.isNumber_(expected)){ + throw new Error(getErrorMsg('The expected times failed is a required argument and must be a number.')); + } + + actual = args[0]; + var calls = actual.calls.count(); + var timesMessage = expected === 1 ? 'once' : expected + ' times'; + result.pass = calls === expected; + result.message = result.pass ? + 'Expected spy ' + actual.and.identity + ' not to have been called ' + timesMessage + '. It was called ' + calls + ' times.' : + 'Expected spy ' + actual.and.identity + ' to have been called ' + timesMessage + '. It was called ' + calls + ' times.'; + return result; + } + }; + } + + return toHaveBeenCalledTimes; +}; + +getJasmineRequireObj().toHaveBeenCalledWith = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledWith>', 'expect(<spyObj>).toHaveBeenCalledWith(...arguments)'); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called with particular arguments at least once. + * @function + * @name matchers#toHaveBeenCalledWith + * @param {...Object} - The arguments to look for + * @example + * expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2); + */ + function toHaveBeenCalledWith(util, customEqualityTesters) { + return { + compare: function() { + var args = Array.prototype.slice.call(arguments, 0), + actual = args[0], + expectedArgs = args.slice(1), + result = { pass: false }; + + if (!j$.isSpy(actual)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); + } + + if (!actual.calls.any()) { + result.message = function() { return 'Expected spy ' + actual.and.identity + ' to have been called with ' + j$.pp(expectedArgs) + ' but it was never called.'; }; + return result; + } + + if (util.contains(actual.calls.allArgs(), expectedArgs, customEqualityTesters)) { + result.pass = true; + result.message = function() { return 'Expected spy ' + actual.and.identity + ' not to have been called with ' + j$.pp(expectedArgs) + ' but it was.'; }; + } else { + result.message = function() { return 'Expected spy ' + actual.and.identity + ' to have been called with ' + j$.pp(expectedArgs) + ' but actual calls were ' + j$.pp(actual.calls.allArgs()).replace(/^\[ | \]$/g, '') + '.'; }; + } + + return result; + } + }; + } + + return toHaveBeenCalledWith; +}; + +getJasmineRequireObj().toHaveClass = function(j$) { + /** + * {@link expect} the actual value to be a DOM element that has the expected class + * @function + * @name matchers#toHaveClass + * @param {Object} expected - The class name to test for + * @example + * var el = document.createElement('div'); + * el.className = 'foo bar baz'; + * expect(el).toHaveClass('bar'); + */ + function toHaveClass(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + if (!isElement(actual)) { + throw new Error(j$.pp(actual) + ' is not a DOM element'); + } + + return { + pass: actual.classList.contains(expected) + }; + } + }; + } + + function isElement(maybeEl) { + return maybeEl && + maybeEl.classList && + j$.isFunction_(maybeEl.classList.contains); + } + + return toHaveClass; +}; + +getJasmineRequireObj().toMatch = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<toMatch>', 'expect(<expectation>).toMatch(<string> || <regexp>)'); + + /** + * {@link expect} the actual value to match a regular expression + * @function + * @name matchers#toMatch + * @param {RegExp|String} expected - Value to look for in the string. + * @example + * expect("my string").toMatch(/string$/); + * expect("other string").toMatch("her"); + */ + function toMatch() { + return { + compare: function(actual, expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error(getErrorMsg('Expected is not a String or a RegExp')); + } + + var regexp = new RegExp(expected); + + return { + pass: regexp.test(actual) + }; + } + }; + } + + return toMatch; +}; + +getJasmineRequireObj().toThrow = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<toThrow>', 'expect(function() {<expectation>}).toThrow()'); + + /** + * {@link expect} a function to `throw` something. + * @function + * @name matchers#toThrow + * @param {Object} [expected] - Value that should be thrown. If not provided, simply the fact that something was thrown will be checked. + * @example + * expect(function() { return 'things'; }).toThrow('foo'); + * expect(function() { return 'stuff'; }).toThrow(); + */ + function toThrow(util) { + return { + compare: function(actual, expected) { + var result = { pass: false }, + threw = false, + thrown; + + if (typeof actual != 'function') { + throw new Error(getErrorMsg('Actual is not a Function')); + } + + try { + actual(); + } catch (e) { + threw = true; + thrown = e; + } + + if (!threw) { + result.message = 'Expected function to throw an exception.'; + return result; + } + + if (arguments.length == 1) { + result.pass = true; + result.message = function() { return 'Expected function not to throw, but it threw ' + j$.pp(thrown) + '.'; }; + + return result; + } + + if (util.equals(thrown, expected)) { + result.pass = true; + result.message = function() { return 'Expected function not to throw ' + j$.pp(expected) + '.'; }; + } else { + result.message = function() { return 'Expected function to throw ' + j$.pp(expected) + ', but it threw ' + j$.pp(thrown) + '.'; }; + } + + return result; + } + }; + } + + return toThrow; +}; + +getJasmineRequireObj().toThrowError = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<toThrowError>', 'expect(function() {<expectation>}).toThrowError(<ErrorConstructor>, <message>)'); + + /** + * {@link expect} a function to `throw` an `Error`. + * @function + * @name matchers#toThrowError + * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used. + * @param {RegExp|String} [message] - The message that should be set on the thrown `Error` + * @example + * expect(function() { return 'things'; }).toThrowError(MyCustomError, 'message'); + * expect(function() { return 'things'; }).toThrowError(MyCustomError, /bar/); + * expect(function() { return 'stuff'; }).toThrowError(MyCustomError); + * expect(function() { return 'other'; }).toThrowError(/foo/); + * expect(function() { return 'other'; }).toThrowError(); + */ + function toThrowError () { + return { + compare: function(actual) { + var errorMatcher = getMatcher.apply(null, arguments), + thrown; + + if (typeof actual != 'function') { + throw new Error(getErrorMsg('Actual is not a Function')); + } + + try { + actual(); + return fail('Expected function to throw an Error.'); + } catch (e) { + thrown = e; + } + + if (!j$.isError_(thrown)) { + return fail(function() { return 'Expected function to throw an Error, but it threw ' + j$.pp(thrown) + '.'; }); + } + + return errorMatcher.match(thrown); + } + }; + + function getMatcher() { + var expected, errorType; + + if (arguments[2]) { + errorType = arguments[1]; + expected = arguments[2]; + if (!isAnErrorType(errorType)) { + throw new Error(getErrorMsg('Expected error type is not an Error.')); + } + + return exactMatcher(expected, errorType); + } else if (arguments[1]) { + expected = arguments[1]; + + if (isAnErrorType(arguments[1])) { + return exactMatcher(null, arguments[1]); + } else { + return exactMatcher(arguments[1], null); + } + } else { + return anyMatcher(); + } + } + + function anyMatcher() { + return { + match: function(error) { + return pass('Expected function not to throw an Error, but it threw ' + j$.fnNameFor(error) + '.'); + } + }; + } + + function exactMatcher(expected, errorType) { + if (expected && !isStringOrRegExp(expected)) { + if (errorType) { + throw new Error(getErrorMsg('Expected error message is not a string or RegExp.')); + } else { + throw new Error(getErrorMsg('Expected is not an Error, string, or RegExp.')); + } + } + + function messageMatch(message) { + if (typeof expected == 'string') { + return expected == message; + } else { + return expected.test(message); + } + } + + var errorTypeDescription = errorType ? j$.fnNameFor(errorType) : 'an exception'; + + function thrownDescription(thrown) { + var thrownName = errorType ? j$.fnNameFor(thrown.constructor) : 'an exception', + thrownMessage = ''; + + if (expected) { + thrownMessage = ' with message ' + j$.pp(thrown.message); + } + + return thrownName + thrownMessage; + } + + function messageDescription() { + if (expected === null) { + return ''; + } else if (expected instanceof RegExp) { + return ' with a message matching ' + j$.pp(expected); + } else { + return ' with message ' + j$.pp(expected); + } + } + + function matches(error) { + return (errorType === null || error instanceof errorType) && + (expected === null || messageMatch(error.message)); + } + + return { + match: function(thrown) { + if (matches(thrown)) { + return pass(function() { + return 'Expected function not to throw ' + errorTypeDescription + messageDescription() + '.'; + }); + } else { + return fail(function() { + return 'Expected function to throw ' + errorTypeDescription + messageDescription() + + ', but it threw ' + thrownDescription(thrown) + '.'; + }); + } + } + }; + } + + function isStringOrRegExp(potential) { + return potential instanceof RegExp || (typeof potential == 'string'); + } + + function isAnErrorType(type) { + if (typeof type !== 'function') { + return false; + } + + var Surrogate = function() {}; + Surrogate.prototype = type.prototype; + return j$.isError_(new Surrogate()); + } + } + + function pass(message) { + return { + pass: true, + message: message + }; + } + + function fail(message) { + return { + pass: false, + message: message + }; + } + + return toThrowError; +}; + +getJasmineRequireObj().toThrowMatching = function(j$) { + var usageError = j$.formatErrorMsg('<toThrowMatching>', 'expect(function() {<expectation>}).toThrowMatching(<Predicate>)'); + + /** + * {@link expect} a function to `throw` something matching a predicate. + * @function + * @name matchers#toThrowMatching + * @param {Function} predicate - A function that takes the thrown exception as its parameter and returns true if it matches. + * @example + * expect(function() { throw new Error('nope'); }).toThrowMatching(function(thrown) { return thrown.message === 'nope'; }); + */ + function toThrowMatching() { + return { + compare: function(actual, predicate) { + var thrown; + + if (typeof actual !== 'function') { + throw new Error(usageError('Actual is not a Function')); + } + + if (typeof predicate !== 'function') { + throw new Error(usageError('Predicate is not a Function')); + } + + try { + actual(); + return fail('Expected function to throw an exception.'); + } catch (e) { + thrown = e; + } + + if (predicate(thrown)) { + return pass('Expected function not to throw an exception matching a predicate.'); + } else { + return fail(function() { + return 'Expected function to throw an exception matching a predicate, ' + + 'but it threw ' + thrownDescription(thrown) + '.'; + }); + } + } + }; + } + + function thrownDescription(thrown) { + if (thrown && thrown.constructor) { + return j$.fnNameFor(thrown.constructor) + ' with message ' + + j$.pp(thrown.message); + } else { + return j$.pp(thrown); + } + } + + function pass(message) { + return { + pass: true, + message: message + }; + } + + function fail(message) { + return { + pass: false, + message: message + }; + } + + return toThrowMatching; +}; + +getJasmineRequireObj().MockDate = function() { + function MockDate(global) { + var self = this; + var currentTime = 0; + + if (!global || !global.Date) { + self.install = function() {}; + self.tick = function() {}; + self.uninstall = function() {}; + return self; + } + + var GlobalDate = global.Date; + + self.install = function(mockDate) { + if (mockDate instanceof GlobalDate) { + currentTime = mockDate.getTime(); + } else { + currentTime = new GlobalDate().getTime(); + } + + global.Date = FakeDate; + }; + + self.tick = function(millis) { + millis = millis || 0; + currentTime = currentTime + millis; + }; + + self.uninstall = function() { + currentTime = 0; + global.Date = GlobalDate; + }; + + createDateProperties(); + + return self; + + function FakeDate() { + switch(arguments.length) { + case 0: + return new GlobalDate(currentTime); + case 1: + return new GlobalDate(arguments[0]); + case 2: + return new GlobalDate(arguments[0], arguments[1]); + case 3: + return new GlobalDate(arguments[0], arguments[1], arguments[2]); + case 4: + return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3]); + case 5: + return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], + arguments[4]); + case 6: + return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], + arguments[4], arguments[5]); + default: + return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], + arguments[4], arguments[5], arguments[6]); + } + } + + function createDateProperties() { + FakeDate.prototype = GlobalDate.prototype; + + FakeDate.now = function() { + if (GlobalDate.now) { + return currentTime; + } else { + throw new Error('Browser does not support Date.now()'); + } + }; + + FakeDate.toSource = GlobalDate.toSource; + FakeDate.toString = GlobalDate.toString; + FakeDate.parse = GlobalDate.parse; + FakeDate.UTC = GlobalDate.UTC; + } + } + + return MockDate; +}; + +getJasmineRequireObj().pp = function(j$) { + + function PrettyPrinter() { + this.ppNestLevel_ = 0; + this.seen = []; + this.length = 0; + this.stringParts = []; + } + + function hasCustomToString(value) { + // value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g. + // iframe, web worker) + return j$.isFunction_(value.toString) && value.toString !== Object.prototype.toString && (value.toString() !== Object.prototype.toString.call(value)); + } + + PrettyPrinter.prototype.format = function(value) { + this.ppNestLevel_++; + try { + if (j$.util.isUndefined(value)) { + this.emitScalar('undefined'); + } else if (value === null) { + this.emitScalar('null'); + } else if (value === 0 && 1/value === -Infinity) { + this.emitScalar('-0'); + } else if (value === j$.getGlobal()) { + this.emitScalar('<global>'); + } else if (value.jasmineToString) { + this.emitScalar(value.jasmineToString()); + } else if (typeof value === 'string') { + this.emitString(value); + } else if (j$.isSpy(value)) { + this.emitScalar('spy on ' + value.and.identity); + } else if (value instanceof RegExp) { + this.emitScalar(value.toString()); + } else if (typeof value === 'function') { + this.emitScalar('Function'); + } else if (j$.isDomNode(value)) { + if (value.tagName) { + this.emitDomElement(value); + } else { + this.emitScalar('HTMLNode'); + } + } else if (value instanceof Date) { + this.emitScalar('Date(' + value + ')'); + } else if (j$.isSet(value)) { + this.emitSet(value); + } else if (j$.isMap(value)) { + this.emitMap(value); + } else if (j$.isTypedArray_(value)) { + this.emitTypedArray(value); + } else if (value.toString && typeof value === 'object' && !j$.isArray_(value) && hasCustomToString(value)) { + this.emitScalar(value.toString()); + } else if (j$.util.arrayContains(this.seen, value)) { + this.emitScalar('<circular reference: ' + (j$.isArray_(value) ? 'Array' : 'Object') + '>'); + } else if (j$.isArray_(value) || j$.isA_('Object', value)) { + this.seen.push(value); + if (j$.isArray_(value)) { + this.emitArray(value); + } else { + this.emitObject(value); + } + this.seen.pop(); + } else { + this.emitScalar(value.toString()); + } + } catch (e) { + if (this.ppNestLevel_ > 1 || !(e instanceof MaxCharsReachedError)) { + throw e; + } + } finally { + this.ppNestLevel_--; + } + }; + + PrettyPrinter.prototype.iterateObject = function(obj, fn) { + var objKeys = keys(obj, j$.isArray_(obj)); + var isGetter = function isGetter(prop) {}; + + if (obj.__lookupGetter__) { + isGetter = function isGetter(prop) { + var getter = obj.__lookupGetter__(prop); + return !j$.util.isUndefined(getter) && getter !== null; + }; + + } + var length = Math.min(objKeys.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + for (var i = 0; i < length; i++) { + var property = objKeys[i]; + fn(property, isGetter(property)); + } + + return objKeys.length > length; + }; + + PrettyPrinter.prototype.emitScalar = function(value) { + this.append(value); + }; + + PrettyPrinter.prototype.emitString = function(value) { + this.append('\'' + value + '\''); + }; + + PrettyPrinter.prototype.emitArray = function(array) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Array'); + return; + } + var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + this.append('[ '); + for (var i = 0; i < length; i++) { + if (i > 0) { + this.append(', '); + } + this.format(array[i]); + } + if(array.length > length){ + this.append(', ...'); + } + + var self = this; + var first = array.length === 0; + var truncated = this.iterateObject(array, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.formatProperty(array, property, isGetter); + }); + + if (truncated) { this.append(', ...'); } + + this.append(' ]'); + }; + + PrettyPrinter.prototype.emitSet = function(set) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Set'); + return; + } + this.append('Set( '); + var size = Math.min(set.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + var i = 0; + set.forEach( function( value, key ) { + if (i >= size) { + return; + } + if (i > 0) { + this.append(', '); + } + this.format(value); + + i++; + }, this ); + if (set.size > size){ + this.append(', ...'); + } + this.append(' )'); + }; + + PrettyPrinter.prototype.emitMap = function(map) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Map'); + return; + } + this.append('Map( '); + var size = Math.min(map.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + var i = 0; + map.forEach( function( value, key ) { + if (i >= size) { + return; + } + if (i > 0) { + this.append(', '); + } + this.format([key,value]); + + i++; + }, this ); + if (map.size > size){ + this.append(', ...'); + } + this.append(' )'); + }; + + PrettyPrinter.prototype.emitObject = function(obj) { + var ctor = obj.constructor, + constructorName; + + constructorName = typeof ctor === 'function' && obj instanceof ctor ? + j$.fnNameFor(obj.constructor) : + 'null'; + + this.append(constructorName); + + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + return; + } + + var self = this; + this.append('({ '); + var first = true; + + var truncated = this.iterateObject(obj, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.formatProperty(obj, property, isGetter); + }); + + if (truncated) { this.append(', ...'); } + + this.append(' })'); + }; + + PrettyPrinter.prototype.emitTypedArray = function(arr) { + var constructorName = j$.fnNameFor(arr.constructor), + limitedArray = Array.prototype.slice.call(arr, 0, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH), + itemsString = Array.prototype.join.call(limitedArray, ', '); + + if (limitedArray.length !== arr.length) { + itemsString += ', ...'; + } + + this.append(constructorName + ' [ ' + itemsString + ' ]'); + }; + + PrettyPrinter.prototype.emitDomElement = function(el) { + var tagName = el.tagName.toLowerCase(), + attrs = el.attributes, + i, + len = attrs.length, + out = '<' + tagName, + attr; + + for (i = 0; i < len; i++) { + attr = attrs[i]; + out += ' ' + attr.name; + + if (attr.value !== '') { + out += '="' + attr.value + '"'; + } + } + + out += '>'; + + if (el.childElementCount !== 0 || el.textContent !== '') { + out += '...</' + tagName + '>'; + } + + this.append(out); + }; + + PrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) { + this.append(property); + this.append(': '); + if (isGetter) { + this.append('<getter>'); + } else { + this.format(obj[property]); + } + }; + + PrettyPrinter.prototype.append = function(value) { + var result = truncate(value, j$.MAX_PRETTY_PRINT_CHARS - this.length); + this.length += result.value.length; + this.stringParts.push(result.value); + + if (result.truncated) { + throw new MaxCharsReachedError(); + } + }; + + + function truncate(s, maxlen) { + if (s.length <= maxlen) { + return { value: s, truncated: false }; + } + + s = s.substring(0, maxlen - 4) + ' ...'; + return { value: s, truncated: true }; + } + + function MaxCharsReachedError() { + this.message = 'Exceeded ' + j$.MAX_PRETTY_PRINT_CHARS + + ' characters while pretty-printing a value'; + } + + MaxCharsReachedError.prototype = new Error(); + + function keys(obj, isArray) { + var allKeys = Object.keys ? Object.keys(obj) : + (function(o) { + var keys = []; + for (var key in o) { + if (j$.util.has(o, key)) { + keys.push(key); + } + } + return keys; + })(obj); + + if (!isArray) { + return allKeys; + } + + if (allKeys.length === 0) { + return allKeys; + } + + var extraKeys = []; + for (var i = 0; i < allKeys.length; i++) { + if (!/^[0-9]+$/.test(allKeys[i])) { + extraKeys.push(allKeys[i]); + } + } + + return extraKeys; + } + return function(value) { + var prettyPrinter = new PrettyPrinter(); + prettyPrinter.format(value); + return prettyPrinter.stringParts.join(''); + }; +}; + +getJasmineRequireObj().QueueRunner = function(j$) { + function StopExecutionError() {} + StopExecutionError.prototype = new Error(); + j$.StopExecutionError = StopExecutionError; + + function once(fn) { + var called = false; + return function(arg) { + if (!called) { + called = true; + // Direct call using single parameter, because cleanup/next does not need more + fn(arg); + } + return null; + }; + } + + function emptyFn() {} + + function QueueRunner(attrs) { + var queueableFns = attrs.queueableFns || []; + this.queueableFns = queueableFns.concat(attrs.cleanupFns || []); + this.firstCleanupIx = queueableFns.length; + this.onComplete = attrs.onComplete || emptyFn; + this.clearStack = attrs.clearStack || function(fn) {fn();}; + this.onException = attrs.onException || emptyFn; + this.userContext = attrs.userContext || new j$.UserContext(); + this.timeout = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout}; + this.fail = attrs.fail || emptyFn; + this.globalErrors = attrs.globalErrors || { pushListener: emptyFn, popListener: emptyFn }; + this.completeOnFirstError = !!attrs.completeOnFirstError; + this.errored = false; + + if (typeof(this.onComplete) !== 'function') { + throw new Error('invalid onComplete ' + JSON.stringify(this.onComplete)); + } + this.deprecated = attrs.deprecated; + } + + QueueRunner.prototype.execute = function() { + var self = this; + this.handleFinalError = function(error) { + self.onException(error); + }; + this.globalErrors.pushListener(this.handleFinalError); + this.run(0); + }; + + QueueRunner.prototype.skipToCleanup = function(lastRanIndex) { + if (lastRanIndex < this.firstCleanupIx) { + this.run(this.firstCleanupIx); + } else { + this.run(lastRanIndex + 1); + } + }; + + QueueRunner.prototype.clearTimeout = function(timeoutId) { + Function.prototype.apply.apply(this.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]); + }; + + QueueRunner.prototype.setTimeout = function(fn, timeout) { + return Function.prototype.apply.apply(this.timeout.setTimeout, [j$.getGlobal(), [fn, timeout]]); + }; + + QueueRunner.prototype.attempt = function attempt(iterativeIndex) { + var self = this, completedSynchronously = true, + handleError = function handleError(error) { + onException(error); + next(error); + }, + cleanup = once(function cleanup() { + if (timeoutId !== void 0) { + self.clearTimeout(timeoutId); + } + self.globalErrors.popListener(handleError); + }), + next = once(function next(err) { + cleanup(); + + if (j$.isError_(err)) { + if (!(err instanceof StopExecutionError) && !err.jasmineMessage) { + self.fail(err); + } + self.errored = errored = true; + } + + function runNext() { + if (self.completeOnFirstError && errored) { + self.skipToCleanup(iterativeIndex); + } else { + self.run(iterativeIndex + 1); + } + } + + if (completedSynchronously) { + self.setTimeout(runNext); + } else { + runNext(); + } + }), + errored = false, + queueableFn = self.queueableFns[iterativeIndex], + timeoutId; + + next.fail = function nextFail() { + self.fail.apply(null, arguments); + self.errored = errored = true; + next(); + }; + + self.globalErrors.pushListener(handleError); + + if (queueableFn.timeout !== undefined) { + var timeoutInterval = queueableFn.timeout || j$.DEFAULT_TIMEOUT_INTERVAL; + timeoutId = self.setTimeout(function() { + var error = new Error( + 'Timeout - Async callback was not invoked within ' + timeoutInterval + 'ms ' + + (queueableFn.timeout ? '(custom timeout)' : '(set by jasmine.DEFAULT_TIMEOUT_INTERVAL)') + ); + onException(error); + next(); + }, timeoutInterval); + } + + try { + if (queueableFn.fn.length === 0) { + var maybeThenable = queueableFn.fn.call(self.userContext); + + if (maybeThenable && j$.isFunction_(maybeThenable.then)) { + maybeThenable.then(next, onPromiseRejection); + completedSynchronously = false; + return { completedSynchronously: false }; + } + } else { + queueableFn.fn.call(self.userContext, next); + completedSynchronously = false; + return { completedSynchronously: false }; + } + } catch (e) { + onException(e); + self.errored = errored = true; + } + + cleanup(); + return { completedSynchronously: true, errored: errored }; + + function onException(e) { + self.onException(e); + self.errored = errored = true; + } + + function onPromiseRejection(e) { + onException(e); + next(); + } + }; + + QueueRunner.prototype.run = function(recursiveIndex) { + var length = this.queueableFns.length, + self = this, + iterativeIndex; + + + for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) { + var result = this.attempt(iterativeIndex); + + if (!result.completedSynchronously) { + return; + } + + self.errored = self.errored || result.errored; + + if (this.completeOnFirstError && result.errored) { + this.skipToCleanup(iterativeIndex); + return; + } + } + + this.clearStack(function() { + self.globalErrors.popListener(self.handleFinalError); + self.onComplete(self.errored && new StopExecutionError()); + }); + + }; + + return QueueRunner; +}; + +getJasmineRequireObj().ReportDispatcher = function(j$) { + function ReportDispatcher(methods, queueRunnerFactory) { + + var dispatchedMethods = methods || []; + + for (var i = 0; i < dispatchedMethods.length; i++) { + var method = dispatchedMethods[i]; + this[method] = (function(m) { + return function() { + dispatch(m, arguments); + }; + }(method)); + } + + var reporters = []; + var fallbackReporter = null; + + this.addReporter = function(reporter) { + reporters.push(reporter); + }; + + this.provideFallbackReporter = function(reporter) { + fallbackReporter = reporter; + }; + + this.clearReporters = function() { + reporters = []; + }; + + return this; + + function dispatch(method, args) { + if (reporters.length === 0 && fallbackReporter !== null) { + reporters.push(fallbackReporter); + } + var onComplete = args[args.length - 1]; + args = j$.util.argsToArray(args).splice(0, args.length - 1); + var fns = []; + for (var i = 0; i < reporters.length; i++) { + var reporter = reporters[i]; + addFn(fns, reporter, method, args); + } + + queueRunnerFactory({ + queueableFns: fns, + onComplete: onComplete, + isReporter: true + }); + } + + function addFn(fns, reporter, method, args) { + var fn = reporter[method]; + if (!fn) { + return; + } + + var thisArgs = j$.util.cloneArgs(args); + if (fn.length <= 1) { + fns.push({ + fn: function () { + return fn.apply(reporter, thisArgs); + } + }); + } else { + fns.push({ + fn: function (done) { + return fn.apply(reporter, thisArgs.concat([done])); + } + }); + } + } + } + + return ReportDispatcher; +}; + + +getJasmineRequireObj().interface = function(jasmine, env) { + var jasmineInterface = { + /** + * Callback passed to parts of the Jasmine base interface. + * + * By default Jasmine assumes this function completes synchronously. + * If you have code that you need to test asynchronously, you can declare that you receive a `done` callback, return a Promise, or use the `async` keyword if it is supported in your environment. + * @callback implementationCallback + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + */ + + /** + * Create a group of specs (often called a suite). + * + * Calls to `describe` can be nested within other calls to compose your suite as a tree. + * @name describe + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + describe: function(description, specDefinitions) { + return env.describe(description, specDefinitions); + }, + + /** + * A temporarily disabled [`describe`]{@link describe} + * + * Specs within an `xdescribe` will be marked pending and not executed + * @name xdescribe + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + xdescribe: function(description, specDefinitions) { + return env.xdescribe(description, specDefinitions); + }, + + /** + * A focused [`describe`]{@link describe} + * + * If suites or specs are focused, only those that are focused will be executed + * @see fit + * @name fdescribe + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + fdescribe: function(description, specDefinitions) { + return env.fdescribe(description, specDefinitions); + }, + + /** + * Define a single spec. A spec should contain one or more {@link expect|expectations} that test the state of the code. + * + * A spec whose expectations all succeed will be passing and a spec with any failures will fail. + * @name it + * @function + * @global + * @param {String} description Textual description of what this spec is checking + * @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. + * @see async + */ + it: function() { + return env.it.apply(env, arguments); + }, + + /** + * A temporarily disabled [`it`]{@link it} + * + * The spec will report as `pending` and will not be executed. + * @name xit + * @function + * @global + * @param {String} description Textual description of what this spec is checking. + * @param {implementationCallback} [testFunction] Function that contains the code of your test. Will not be executed. + */ + xit: function() { + return env.xit.apply(env, arguments); + }, + + /** + * A focused [`it`]{@link it} + * + * If suites or specs are focused, only those that are focused will be executed. + * @name fit + * @function + * @global + * @param {String} description Textual description of what this spec is checking. + * @param {implementationCallback} testFunction Function that contains the code of your test. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. + * @see async + */ + fit: function() { + return env.fit.apply(env, arguments); + }, + + /** + * Run some shared setup before each of the specs in the {@link describe} in which it is called. + * @name beforeEach + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to setup your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach. + * @see async + */ + beforeEach: function() { + return env.beforeEach.apply(env, arguments); + }, + + /** + * Run some shared teardown after each of the specs in the {@link describe} in which it is called. + * @name afterEach + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to teardown your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach. + * @see async + */ + afterEach: function() { + return env.afterEach.apply(env, arguments); + }, + + /** + * Run some shared setup once before all of the specs in the {@link describe} are run. + * + * _Note:_ Be careful, sharing the setup from a beforeAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. + * @name beforeAll + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to setup your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll. + * @see async + */ + beforeAll: function() { + return env.beforeAll.apply(env, arguments); + }, + + /** + * Run some shared teardown once after all of the specs in the {@link describe} are run. + * + * _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. + * @name afterAll + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to teardown your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll. + * @see async + */ + afterAll: function() { + return env.afterAll.apply(env, arguments); + }, + + /** + * Create an expectation for a spec. + * @name expect + * @function + * @global + * @param {Object} actual - Actual computed value to test expectations against. + * @return {matchers} + */ + expect: function(actual) { + return env.expect(actual); + }, + + /** + * Create an asynchronous expectation for a spec. Note that the matchers + * that are provided by an asynchronous expectation all return promises + * which must be either returned from the spec or waited for using `await` + * in order for Jasmine to associate them with the correct spec. + * @name expectAsync + * @function + * @global + * @param {Object} actual - Actual computed value to test expectations against. + * @return {async-matchers} + * @example + * await expectAsync(somePromise).toBeResolved(); + * @example + * return expectAsync(somePromise).toBeResolved(); + */ + expectAsync: function(actual) { + return env.expectAsync(actual); + }, + + /** + * Mark a spec as pending, expectation results will be ignored. + * @name pending + * @function + * @global + * @param {String} [message] - Reason the spec is pending. + */ + pending: function() { + return env.pending.apply(env, arguments); + }, + + /** + * Explicitly mark a spec as failed. + * @name fail + * @function + * @global + * @param {String|Error} [error] - Reason for the failure. + */ + fail: function() { + return env.fail.apply(env, arguments); + }, + + /** + * Install a spy onto an existing object. + * @name spyOn + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy}. + * @param {String} methodName - The name of the method to replace with a {@link Spy}. + * @returns {Spy} + */ + spyOn: function(obj, methodName) { + return env.spyOn(obj, methodName); + }, + + /** + * Install a spy on a property installed with `Object.defineProperty` onto an existing object. + * @name spyOnProperty + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy} + * @param {String} propertyName - The name of the property to replace with a {@link Spy}. + * @param {String} [accessType=get] - The access type (get|set) of the property to {@link Spy} on. + * @returns {Spy} + */ + spyOnProperty: function(obj, methodName, accessType) { + return env.spyOnProperty(obj, methodName, accessType); + }, + + /** + * Installs spies on all writable and configurable properties of an object. + * @name spyOnAllFunctions + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy}s + * @returns {Object} the spied object + */ + spyOnAllFunctions: function(obj) { + return env.spyOnAllFunctions(obj); + }, + + jsApiReporter: new jasmine.JsApiReporter({ + timer: new jasmine.Timer() + }), + + /** + * @namespace jasmine + */ + jasmine: jasmine + }; + + /** + * Add a custom equality tester for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addCustomEqualityTester + * @function + * @param {Function} tester - A function which takes two arguments to compare and returns a `true` or `false` comparison result if it knows how to compare them, and `undefined` otherwise. + * @see custom_equality + */ + jasmine.addCustomEqualityTester = function(tester) { + env.addCustomEqualityTester(tester); + }; + + /** + * Add custom matchers for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addMatchers + * @function + * @param {Object} matchers - Keys from this object will be the new matcher names. + * @see custom_matcher + */ + jasmine.addMatchers = function(matchers) { + return env.addMatchers(matchers); + }; + + /** + * Get the currently booted mock {Clock} for this Jasmine environment. + * @name jasmine.clock + * @function + * @returns {Clock} + */ + jasmine.clock = function() { + return env.clock; + }; + + /** + * Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it. + * @name jasmine.createSpy + * @function + * @param {String} [name] - Name to give the spy. This will be displayed in failure messages. + * @param {Function} [originalFn] - Function to act as the real implementation. + * @return {Spy} + */ + jasmine.createSpy = function(name, originalFn) { + return env.createSpy(name, originalFn); + }; + + /** + * Create an object with multiple {@link Spy}s as its members. + * @name jasmine.createSpyObj + * @function + * @param {String} [baseName] - Base name for the spies in the object. + * @param {String[]|Object} methodNames - Array of method names to create spies for, or Object whose keys will be method names and values the {@link Spy#and#returnValue|returnValue}. + * @return {Object} + */ + jasmine.createSpyObj = function(baseName, methodNames) { + return env.createSpyObj(baseName, methodNames); + }; + + /** + * Add a custom spy strategy for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addSpyStrategy + * @function + * @param {String} name - The name of the strategy (i.e. what you call from `and`) + * @param {Function} factory - Factory function that returns the plan to be executed. + */ + jasmine.addSpyStrategy = function(name, factory) { + return env.addSpyStrategy(name, factory); + }; + + return jasmineInterface; +}; + +getJasmineRequireObj().Spy = function (j$) { + + var nextOrder = (function() { + var order = 0; + + return function() { + return order++; + }; + })(); + + /** + * _Note:_ Do not construct this directly, use {@link spyOn}, {@link spyOnProperty}, {@link jasmine.createSpy}, or {@link jasmine.createSpyObj} + * @constructor + * @name Spy + */ + function Spy(name, originalFn, customStrategies) { + var numArgs = (typeof originalFn === 'function' ? originalFn.length : 0), + wrapper = makeFunc(numArgs, function () { + return spy.apply(this, Array.prototype.slice.call(arguments)); + }), + strategyDispatcher = new SpyStrategyDispatcher({ + name: name, + fn: originalFn, + getSpy: function () { + return wrapper; + }, + customStrategies: customStrategies + }), + callTracker = new j$.CallTracker(), + spy = function () { + /** + * @name Spy.callData + * @property {object} object - `this` context for the invocation. + * @property {number} invocationOrder - Order of the invocation. + * @property {Array} args - The arguments passed for this invocation. + */ + var callData = { + object: this, + invocationOrder: nextOrder(), + args: Array.prototype.slice.apply(arguments) + }; + + callTracker.track(callData); + var returnValue = strategyDispatcher.exec(this, arguments); + callData.returnValue = returnValue; + + return returnValue; + }; + + function makeFunc(length, fn) { + switch (length) { + case 1 : return function (a) { return fn.apply(this, arguments); }; + case 2 : return function (a,b) { return fn.apply(this, arguments); }; + case 3 : return function (a,b,c) { return fn.apply(this, arguments); }; + case 4 : return function (a,b,c,d) { return fn.apply(this, arguments); }; + case 5 : return function (a,b,c,d,e) { return fn.apply(this, arguments); }; + case 6 : return function (a,b,c,d,e,f) { return fn.apply(this, arguments); }; + case 7 : return function (a,b,c,d,e,f,g) { return fn.apply(this, arguments); }; + case 8 : return function (a,b,c,d,e,f,g,h) { return fn.apply(this, arguments); }; + case 9 : return function (a,b,c,d,e,f,g,h,i) { return fn.apply(this, arguments); }; + default : return function () { return fn.apply(this, arguments); }; + } + } + + for (var prop in originalFn) { + if (prop === 'and' || prop === 'calls') { + throw new Error('Jasmine spies would overwrite the \'and\' and \'calls\' properties on the object being spied upon'); + } + + wrapper[prop] = originalFn[prop]; + } + + /** + * @member {SpyStrategy} - Accesses the default strategy for the spy. This strategy will be used + * whenever the spy is called with arguments that don't match any strategy + * created with {@link Spy#withArgs}. + * @name Spy#and + * @example + * spyOn(someObj, 'func').and.returnValue(42); + */ + wrapper.and = strategyDispatcher.and; + /** + * Specifies a strategy to be used for calls to the spy that have the + * specified arguments. + * @name Spy#withArgs + * @function + * @param {...*} args - The arguments to match + * @type {SpyStrategy} + * @example + * spyOn(someObj, 'func').withArgs(1, 2, 3).and.returnValue(42); + * someObj.func(1, 2, 3); // returns 42 + */ + wrapper.withArgs = function() { + return strategyDispatcher.withArgs.apply(strategyDispatcher, arguments); + }; + wrapper.calls = callTracker; + + return wrapper; + } + + + function SpyStrategyDispatcher(strategyArgs) { + var baseStrategy = new j$.SpyStrategy(strategyArgs); + var argsStrategies = new StrategyDict(function() { + return new j$.SpyStrategy(strategyArgs); + }); + + this.and = baseStrategy; + + this.exec = function(spy, args) { + var strategy = argsStrategies.get(args); + + if (!strategy) { + if (argsStrategies.any() && !baseStrategy.isConfigured()) { + throw new Error('Spy \'' + strategyArgs.name + '\' received a call with arguments ' + j$.pp(Array.prototype.slice.call(args)) + ' but all configured strategies specify other arguments.'); + } else { + strategy = baseStrategy; + } + } + + return strategy.exec(spy, args); + }; + + this.withArgs = function() { + return { and: argsStrategies.getOrCreate(arguments) }; + }; + } + + function StrategyDict(strategyFactory) { + this.strategies = []; + this.strategyFactory = strategyFactory; + } + + StrategyDict.prototype.any = function() { + return this.strategies.length > 0; + }; + + StrategyDict.prototype.getOrCreate = function(args) { + var strategy = this.get(args); + + if (!strategy) { + strategy = this.strategyFactory(); + this.strategies.push({ + args: args, + strategy: strategy + }); + } + + return strategy; + }; + + StrategyDict.prototype.get = function(args) { + var i; + + for (i = 0; i < this.strategies.length; i++) { + if (j$.matchersUtil.equals(args, this.strategies[i].args)) { + return this.strategies[i].strategy; + } + } + }; + + return Spy; +}; + +getJasmineRequireObj().SpyFactory = function(j$) { + + function SpyFactory(getCustomStrategies) { + var self = this; + + this.createSpy = function(name, originalFn) { + return j$.Spy(name, originalFn, getCustomStrategies()); + }; + + this.createSpyObj = function(baseName, methodNames) { + var baseNameIsCollection = j$.isObject_(baseName) || j$.isArray_(baseName); + + if (baseNameIsCollection && j$.util.isUndefined(methodNames)) { + methodNames = baseName; + baseName = 'unknown'; + } + + var obj = {}; + var spiesWereSet = false; + + if (j$.isArray_(methodNames)) { + for (var i = 0; i < methodNames.length; i++) { + obj[methodNames[i]] = self.createSpy(baseName + '.' + methodNames[i]); + spiesWereSet = true; + } + } else if (j$.isObject_(methodNames)) { + for (var key in methodNames) { + if (methodNames.hasOwnProperty(key)) { + obj[key] = self.createSpy(baseName + '.' + key); + obj[key].and.returnValue(methodNames[key]); + spiesWereSet = true; + } + } + } + + if (!spiesWereSet) { + throw 'createSpyObj requires a non-empty array or object of method names to create spies for'; + } + + return obj; + }; + } + + return SpyFactory; +}; + +getJasmineRequireObj().SpyRegistry = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('<spyOn>', 'spyOn(<object>, <methodName>)'); + + function SpyRegistry(options) { + options = options || {}; + var global = options.global || j$.getGlobal(); + var createSpy = options.createSpy; + var currentSpies = options.currentSpies || function() { return []; }; + + this.allowRespy = function(allow){ + this.respy = allow; + }; + + this.spyOn = function(obj, methodName) { + + if (j$.util.isUndefined(obj) || obj === null) { + throw new Error(getErrorMsg('could not find an object to spy upon for ' + methodName + '()')); + } + + if (j$.util.isUndefined(methodName) || methodName === null) { + throw new Error(getErrorMsg('No method name supplied')); + } + + if (j$.util.isUndefined(obj[methodName])) { + throw new Error(getErrorMsg(methodName + '() method does not exist')); + } + + if (obj[methodName] && j$.isSpy(obj[methodName]) ) { + if ( !!this.respy ){ + return obj[methodName]; + }else { + throw new Error(getErrorMsg(methodName + ' has already been spied upon')); + } + } + + var descriptor = Object.getOwnPropertyDescriptor(obj, methodName); + + if (descriptor && !(descriptor.writable || descriptor.set)) { + throw new Error(getErrorMsg(methodName + ' is not declared writable or has no setter')); + } + + var originalMethod = obj[methodName], + spiedMethod = createSpy(methodName, originalMethod), + restoreStrategy; + + if (Object.prototype.hasOwnProperty.call(obj, methodName) || (obj === global && methodName === 'onerror')) { + restoreStrategy = function() { + obj[methodName] = originalMethod; + }; + } else { + restoreStrategy = function() { + if (!delete obj[methodName]) { + obj[methodName] = originalMethod; + } + }; + } + + currentSpies().push({ + restoreObjectToOriginalState: restoreStrategy + }); + + obj[methodName] = spiedMethod; + + return spiedMethod; + }; + + this.spyOnProperty = function (obj, propertyName, accessType) { + accessType = accessType || 'get'; + + if (j$.util.isUndefined(obj)) { + throw new Error('spyOn could not find an object to spy upon for ' + propertyName + ''); + } + + if (j$.util.isUndefined(propertyName)) { + throw new Error('No property name supplied'); + } + + var descriptor = j$.util.getPropertyDescriptor(obj, propertyName); + + if (!descriptor) { + throw new Error(propertyName + ' property does not exist'); + } + + if (!descriptor.configurable) { + throw new Error(propertyName + ' is not declared configurable'); + } + + if(!descriptor[accessType]) { + throw new Error('Property ' + propertyName + ' does not have access type ' + accessType); + } + + if (j$.isSpy(descriptor[accessType])) { + //TODO?: should this return the current spy? Downside: may cause user confusion about spy state + throw new Error(propertyName + ' has already been spied upon'); + } + + var originalDescriptor = j$.util.clone(descriptor), + spy = createSpy(propertyName, descriptor[accessType]), + restoreStrategy; + + if (Object.prototype.hasOwnProperty.call(obj, propertyName)) { + restoreStrategy = function() { + Object.defineProperty(obj, propertyName, originalDescriptor); + }; + } else { + restoreStrategy = function() { + delete obj[propertyName]; + }; + } + + currentSpies().push({ + restoreObjectToOriginalState: restoreStrategy + }); + + descriptor[accessType] = spy; + + Object.defineProperty(obj, propertyName, descriptor); + + return spy; + }; + + this.spyOnAllFunctions = function(obj) { + if (j$.util.isUndefined(obj)) { + throw new Error('spyOnAllFunctions could not find an object to spy upon'); + } + + for (var prop in obj) { + if (Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] instanceof Function) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + if ((descriptor.writable || descriptor.set) && descriptor.configurable) { + this.spyOn(obj, prop); + } + } + } + + return obj; + }; + + this.clearSpies = function() { + var spies = currentSpies(); + for (var i = spies.length - 1; i >= 0; i--) { + var spyEntry = spies[i]; + spyEntry.restoreObjectToOriginalState(); + } + }; + } + + return SpyRegistry; +}; + +getJasmineRequireObj().SpyStrategy = function(j$) { + + /** + * @interface SpyStrategy + */ + function SpyStrategy(options) { + options = options || {}; + + /** + * Get the identifying information for the spy. + * @name SpyStrategy#identity + * @member + * @type {String} + */ + this.identity = options.name || 'unknown'; + this.originalFn = options.fn || function() {}; + this.getSpy = options.getSpy || function() {}; + this.plan = this._defaultPlan = function() {}; + + var k, cs = options.customStrategies || {}; + for (k in cs) { + if (j$.util.has(cs, k) && !this[k]) { + this[k] = createCustomPlan(cs[k]); + } + } + } + + function createCustomPlan(factory) { + return function() { + var plan = factory.apply(null, arguments); + + if (!j$.isFunction_(plan)) { + throw new Error('Spy strategy must return a function'); + } + + this.plan = plan; + return this.getSpy(); + }; + } + + /** + * Execute the current spy strategy. + * @name SpyStrategy#exec + * @function + */ + SpyStrategy.prototype.exec = function(context, args) { + return this.plan.apply(context, args); + }; + + /** + * Tell the spy to call through to the real implementation when invoked. + * @name SpyStrategy#callThrough + * @function + */ + SpyStrategy.prototype.callThrough = function() { + this.plan = this.originalFn; + return this.getSpy(); + }; + + /** + * Tell the spy to return the value when invoked. + * @name SpyStrategy#returnValue + * @function + * @param {*} value The value to return. + */ + SpyStrategy.prototype.returnValue = function(value) { + this.plan = function() { + return value; + }; + return this.getSpy(); + }; + + /** + * Tell the spy to return one of the specified values (sequentially) each time the spy is invoked. + * @name SpyStrategy#returnValues + * @function + * @param {...*} values - Values to be returned on subsequent calls to the spy. + */ + SpyStrategy.prototype.returnValues = function() { + var values = Array.prototype.slice.call(arguments); + this.plan = function () { + return values.shift(); + }; + return this.getSpy(); + }; + + /** + * Tell the spy to throw an error when invoked. + * @name SpyStrategy#throwError + * @function + * @param {Error|String} something Thing to throw + */ + SpyStrategy.prototype.throwError = function(something) { + var error = (something instanceof Error) ? something : new Error(something); + this.plan = function() { + throw error; + }; + return this.getSpy(); + }; + + /** + * Tell the spy to call a fake implementation when invoked. + * @name SpyStrategy#callFake + * @function + * @param {Function} fn The function to invoke with the passed parameters. + */ + SpyStrategy.prototype.callFake = function(fn) { + if(!(j$.isFunction_(fn) || j$.isAsyncFunction_(fn))) { + throw new Error('Argument passed to callFake should be a function, got ' + fn); + } + this.plan = fn; + return this.getSpy(); + }; + + /** + * Tell the spy to do nothing when invoked. This is the default. + * @name SpyStrategy#stub + * @function + */ + SpyStrategy.prototype.stub = function(fn) { + this.plan = function() {}; + return this.getSpy(); + }; + + SpyStrategy.prototype.isConfigured = function() { + return this.plan !== this._defaultPlan; + }; + + return SpyStrategy; +}; + +getJasmineRequireObj().StackTrace = function(j$) { + function StackTrace(error) { + var lines = error.stack + .split('\n') + .filter(function(line) { return line !== ''; }); + + var extractResult = extractMessage(error.message, lines); + + if (extractResult) { + this.message = extractResult.message; + lines = extractResult.remainder; + } + + var parseResult = tryParseFrames(lines); + this.frames = parseResult.frames; + this.style = parseResult.style; + } + + var framePatterns = [ + // PhantomJS on Linux, Node, Chrome, IE, Edge + // e.g. " at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)" + // Note that the "function name" can include a surprisingly large set of + // characters, including angle brackets and square brackets. + { re: /^\s*at ([^\)]+) \(([^\)]+)\)$/, fnIx: 1, fileLineColIx: 2, style: 'v8' }, + + // NodeJS alternate form, often mixed in with the Chrome style + // e.g. " at /some/path:4320:20 + { re: /\s*at (.+)$/, fileLineColIx: 1, style: 'v8' }, + + // PhantomJS on OS X, Safari, Firefox + // e.g. "run@http://localhost:8888/__jasmine__/jasmine.js:4320:27" + // or "http://localhost:8888/__jasmine__/jasmine.js:4320:27" + { re: /^(([^@\s]+)@)?([^\s]+)$/, fnIx: 2, fileLineColIx: 3, style: 'webkit' } + ]; + + // regexes should capture the function name (if any) as group 1 + // and the file, line, and column as group 2. + function tryParseFrames(lines) { + var style = null; + var frames = lines.map(function(line) { + var convertedLine = first(framePatterns, function(pattern) { + var overallMatch = line.match(pattern.re), + fileLineColMatch; + if (!overallMatch) { return null; } + + fileLineColMatch = overallMatch[pattern.fileLineColIx].match( + /^(.*):(\d+):\d+$/); + if (!fileLineColMatch) { return null; } + + style = style || pattern.style; + return { + raw: line, + file: fileLineColMatch[1], + line: parseInt(fileLineColMatch[2], 10), + func: overallMatch[pattern.fnIx] + }; + }); + + return convertedLine || { raw: line }; + }); + + return { + style: style, + frames: frames + }; + } + + function first(items, fn) { + var i, result; + + for (i = 0; i < items.length; i++) { + result = fn(items[i]); + + if (result) { + return result; + } + } + } + + function extractMessage(message, stackLines) { + var len = messagePrefixLength(message, stackLines); + + if (len > 0) { + return { + message: stackLines.slice(0, len).join('\n'), + remainder: stackLines.slice(len) + }; + } + } + + function messagePrefixLength(message, stackLines) { + if (!stackLines[0].match(/^Error/)) { + return 0; + } + + var messageLines = message.split('\n'); + var i; + + for (i = 1; i < messageLines.length; i++) { + if (messageLines[i] !== stackLines[i]) { + return 0; + } + } + + return messageLines.length; + } + + return StackTrace; +}; + +getJasmineRequireObj().Suite = function(j$) { + function Suite(attrs) { + this.env = attrs.env; + this.id = attrs.id; + this.parentSuite = attrs.parentSuite; + this.description = attrs.description; + this.expectationFactory = attrs.expectationFactory; + this.asyncExpectationFactory = attrs.asyncExpectationFactory; + this.expectationResultFactory = attrs.expectationResultFactory; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + + this.beforeFns = []; + this.afterFns = []; + this.beforeAllFns = []; + this.afterAllFns = []; + + this.timer = attrs.timer || j$.noopTimer; + + this.children = []; + + /** + * @typedef SuiteResult + * @property {Int} id - The unique id of this suite. + * @property {String} description - The description text passed to the {@link describe} that made this suite. + * @property {String} fullName - The full description including all ancestors of this suite. + * @property {Expectation[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite. + * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite. + * @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite. + * @property {number} duration - The time in ms for Suite execution, including any before/afterAll, before/afterEach. + */ + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [], + deprecationWarnings: [], + duration: null, + }; + } + + Suite.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Suite.prototype.expectAsync = function(actual) { + return this.asyncExpectationFactory(actual, this); + }; + + Suite.prototype.getFullName = function() { + var fullName = []; + for (var parentSuite = this; parentSuite; parentSuite = parentSuite.parentSuite) { + if (parentSuite.parentSuite) { + fullName.unshift(parentSuite.description); + } + } + return fullName.join(' '); + }; + + Suite.prototype.pend = function() { + this.markedPending = true; + }; + + Suite.prototype.beforeEach = function(fn) { + this.beforeFns.unshift(fn); + }; + + Suite.prototype.beforeAll = function(fn) { + this.beforeAllFns.push(fn); + }; + + Suite.prototype.afterEach = function(fn) { + this.afterFns.unshift(fn); + }; + + Suite.prototype.afterAll = function(fn) { + this.afterAllFns.unshift(fn); + }; + + Suite.prototype.startTimer = function() { + this.timer.start(); + }; + + Suite.prototype.endTimer = function() { + this.result.duration = this.timer.elapsed(); + }; + + function removeFns(queueableFns) { + for(var i = 0; i < queueableFns.length; i++) { + queueableFns[i].fn = null; + } + } + + Suite.prototype.cleanupBeforeAfter = function() { + removeFns(this.beforeAllFns); + removeFns(this.afterAllFns); + removeFns(this.beforeFns); + removeFns(this.afterFns); + }; + + Suite.prototype.addChild = function(child) { + this.children.push(child); + }; + + Suite.prototype.status = function() { + if (this.markedPending) { + return 'pending'; + } + + if (this.result.failedExpectations.length > 0) { + return 'failed'; + } else { + return 'passed'; + } + }; + + Suite.prototype.canBeReentered = function() { + return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0; + }; + + Suite.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Suite.prototype.sharedUserContext = function() { + if (!this.sharedContext) { + this.sharedContext = this.parentSuite ? this.parentSuite.clonedSharedUserContext() : new j$.UserContext(); + } + + return this.sharedContext; + }; + + Suite.prototype.clonedSharedUserContext = function() { + return j$.UserContext.fromExisting(this.sharedUserContext()); + }; + + Suite.prototype.onException = function() { + if (arguments[0] instanceof j$.errors.ExpectationFailed) { + return; + } + + var data = { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: arguments[0] + }; + var failedExpectation = this.expectationResultFactory(data); + + if (!this.parentSuite) { + failedExpectation.globalErrorType = 'afterAll'; + } + + this.result.failedExpectations.push(failedExpectation); + }; + + Suite.prototype.addExpectationResult = function () { + if(isFailure(arguments)) { + var data = arguments[1]; + this.result.failedExpectations.push(this.expectationResultFactory(data)); + if(this.throwOnExpectationFailure) { + throw new j$.errors.ExpectationFailed(); + } + } + }; + + Suite.prototype.addDeprecationWarning = function(deprecation) { + if (typeof deprecation === 'string') { + deprecation = { message: deprecation }; + } + this.result.deprecationWarnings.push(this.expectationResultFactory(deprecation)); + }; + + function isFailure(args) { + return !args[0]; + } + + return Suite; +}; + +if (typeof window == void 0 && typeof exports == 'object') { + /* globals exports */ + exports.Suite = jasmineRequire.Suite; +} + +getJasmineRequireObj().Timer = function() { + var defaultNow = (function(Date) { + return function() { return new Date().getTime(); }; + })(Date); + + function Timer(options) { + options = options || {}; + + var now = options.now || defaultNow, + startTime; + + this.start = function() { + startTime = now(); + }; + + this.elapsed = function() { + return now() - startTime; + }; + } + + return Timer; +}; + +getJasmineRequireObj().noopTimer = function() { + return { + start: function() {}, + elapsed: function() { return 0; } + }; +}; +getJasmineRequireObj().TreeProcessor = function() { + function TreeProcessor(attrs) { + var tree = attrs.tree, + runnableIds = attrs.runnableIds, + queueRunnerFactory = attrs.queueRunnerFactory, + nodeStart = attrs.nodeStart || function() {}, + nodeComplete = attrs.nodeComplete || function() {}, + orderChildren = attrs.orderChildren || function(node) { return node.children; }, + excludeNode = attrs.excludeNode || function(node) { return false; }, + stats = { valid: true }, + processed = false, + defaultMin = Infinity, + defaultMax = 1 - Infinity; + + this.processTree = function() { + processNode(tree, true); + processed = true; + return stats; + }; + + this.execute = function(done) { + if (!processed) { + this.processTree(); + } + + if (!stats.valid) { + throw 'invalid order'; + } + + var childFns = wrapChildren(tree, 0); + + queueRunnerFactory({ + queueableFns: childFns, + userContext: tree.sharedUserContext(), + onException: function() { + tree.onException.apply(tree, arguments); + }, + onComplete: done + }); + }; + + function runnableIndex(id) { + for (var i = 0; i < runnableIds.length; i++) { + if (runnableIds[i] === id) { + return i; + } + } + } + + function processNode(node, parentExcluded) { + var executableIndex = runnableIndex(node.id); + + if (executableIndex !== undefined) { + parentExcluded = false; + } + + if (!node.children) { + var excluded = parentExcluded || excludeNode(node); + stats[node.id] = { + excluded: excluded, + willExecute: !excluded && !node.markedPending, + segments: [{ + index: 0, + owner: node, + nodes: [node], + min: startingMin(executableIndex), + max: startingMax(executableIndex) + }] + }; + } else { + var hasExecutableChild = false; + + var orderedChildren = orderChildren(node); + + for (var i = 0; i < orderedChildren.length; i++) { + var child = orderedChildren[i]; + + processNode(child, parentExcluded); + + if (!stats.valid) { + return; + } + + var childStats = stats[child.id]; + + hasExecutableChild = hasExecutableChild || childStats.willExecute; + } + + stats[node.id] = { + excluded: parentExcluded, + willExecute: hasExecutableChild + }; + + segmentChildren(node, orderedChildren, stats[node.id], executableIndex); + + if (!node.canBeReentered() && stats[node.id].segments.length > 1) { + stats = { valid: false }; + } + } + } + + function startingMin(executableIndex) { + return executableIndex === undefined ? defaultMin : executableIndex; + } + + function startingMax(executableIndex) { + return executableIndex === undefined ? defaultMax : executableIndex; + } + + function segmentChildren(node, orderedChildren, nodeStats, executableIndex) { + var currentSegment = { index: 0, owner: node, nodes: [], min: startingMin(executableIndex), max: startingMax(executableIndex) }, + result = [currentSegment], + lastMax = defaultMax, + orderedChildSegments = orderChildSegments(orderedChildren); + + function isSegmentBoundary(minIndex) { + return lastMax !== defaultMax && minIndex !== defaultMin && lastMax < minIndex - 1; + } + + for (var i = 0; i < orderedChildSegments.length; i++) { + var childSegment = orderedChildSegments[i], + maxIndex = childSegment.max, + minIndex = childSegment.min; + + if (isSegmentBoundary(minIndex)) { + currentSegment = {index: result.length, owner: node, nodes: [], min: defaultMin, max: defaultMax}; + result.push(currentSegment); + } + + currentSegment.nodes.push(childSegment); + currentSegment.min = Math.min(currentSegment.min, minIndex); + currentSegment.max = Math.max(currentSegment.max, maxIndex); + lastMax = maxIndex; + } + + nodeStats.segments = result; + } + + function orderChildSegments(children) { + var specifiedOrder = [], + unspecifiedOrder = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i], + segments = stats[child.id].segments; + + for (var j = 0; j < segments.length; j++) { + var seg = segments[j]; + + if (seg.min === defaultMin) { + unspecifiedOrder.push(seg); + } else { + specifiedOrder.push(seg); + } + } + } + + specifiedOrder.sort(function(a, b) { + return a.min - b.min; + }); + + return specifiedOrder.concat(unspecifiedOrder); + } + + function executeNode(node, segmentNumber) { + if (node.children) { + return { + fn: function(done) { + var onStart = { + fn: function(next) { + nodeStart(node, next); + } + }; + + queueRunnerFactory({ + onComplete: function () { + var args = Array.prototype.slice.call(arguments, [0]); + node.cleanupBeforeAfter(); + nodeComplete(node, node.getResult(), function() { + done.apply(undefined, args); + }); + }, + queueableFns: [onStart].concat(wrapChildren(node, segmentNumber)), + userContext: node.sharedUserContext(), + onException: function () { + node.onException.apply(node, arguments); + } + }); + } + }; + } else { + return { + fn: function(done) { node.execute(done, stats[node.id].excluded); } + }; + } + } + + function wrapChildren(node, segmentNumber) { + var result = [], + segmentChildren = stats[node.id].segments[segmentNumber].nodes; + + for (var i = 0; i < segmentChildren.length; i++) { + result.push(executeNode(segmentChildren[i].owner, segmentChildren[i].index)); + } + + if (!stats[node.id].willExecute) { + return result; + } + + return node.beforeAllFns.concat(result).concat(node.afterAllFns); + } + } + + return TreeProcessor; +}; + +getJasmineRequireObj().UserContext = function(j$) { + function UserContext() { + } + + UserContext.fromExisting = function(oldContext) { + var context = new UserContext(); + + for (var prop in oldContext) { + if (oldContext.hasOwnProperty(prop)) { + context[prop] = oldContext[prop]; + } + } + + return context; + }; + + return UserContext; +}; + +getJasmineRequireObj().version = function() { + return '3.4.0'; +}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/json2.js b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/json2.js new file mode 100644 index 000000000..deb88ec9a --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/json2.js @@ -0,0 +1,489 @@ +/* + json2.js + 2014-02-04 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, regexp: true */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +if (typeof JSON !== 'object') { + JSON = {}; +} + +(function () { + 'use strict'; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function () { + + return isFinite(this.valueOf()) + ? this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' + : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function () { + return this.valueOf(); + }; + } + + var cx, + escapable, + gap, + indent, + meta, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' + ? c + : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 + ? '[]' + : gap + ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' + : '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 + ? '{}' + : gap + ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' + : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' + ? walk({'': j}, '') + : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}()); diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/node_boot.js b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/node_boot.js new file mode 100644 index 000000000..921d3434d --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine-core/lib/jasmine-core/node_boot.js @@ -0,0 +1,38 @@ +/* +Copyright (c) 2008-2019 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +module.exports = function(jasmineRequire) { + var jasmine = jasmineRequire.core(jasmineRequire); + + var env = jasmine.getEnv({suppressLoadErrors: true}); + + var jasmineInterface = jasmineRequire.interface(jasmine, env); + + extend(global, jasmineInterface); + + function extend(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; + } + + return jasmine; +}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine-html.js b/plugins/tiddlywiki/jasmine/files/jasmine-html.js deleted file mode 100644 index 543d56963..000000000 --- a/plugins/tiddlywiki/jasmine/files/jasmine-html.js +++ /dev/null @@ -1,681 +0,0 @@ -jasmine.HtmlReporterHelpers = {}; - -jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { - el.appendChild(child); - } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { - var results = child.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - - return status; -}; - -jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { - var parentDiv = this.dom.summary; - var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; - var parent = child[parentSuite]; - - if (parent) { - if (typeof this.views.suites[parent.id] == 'undefined') { - this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); - } - parentDiv = this.views.suites[parent.id].element; - } - - parentDiv.appendChild(childElement); -}; - - -jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { - for(var fn in jasmine.HtmlReporterHelpers) { - ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; - } -}; - -jasmine.HtmlReporter = function(_doc) { - var self = this; - var doc = _doc || window.document; - - var reporterView; - - var dom = {}; - - // Jasmine Reporter Public Interface - self.logRunningSpecs = false; - - self.reportRunnerStarting = function(runner) { - var specs = runner.specs() || []; - - if (specs.length == 0) { - return; - } - - createReporterDom(runner.env.versionString()); - doc.body.appendChild(dom.reporter); - setExceptionHandling(); - - reporterView = new jasmine.HtmlReporter.ReporterView(dom); - reporterView.addSpecs(specs, self.specFilter); - }; - - self.reportRunnerResults = function(runner) { - reporterView && reporterView.complete(); - }; - - self.reportSuiteResults = function(suite) { - reporterView.suiteComplete(suite); - }; - - self.reportSpecStarting = function(spec) { - if (self.logRunningSpecs) { - self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } - }; - - self.reportSpecResults = function(spec) { - reporterView.specComplete(spec); - }; - - self.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } - }; - - self.specFilter = function(spec) { - if (!focusedSpecName()) { - return true; - } - - return spec.getFullName().indexOf(focusedSpecName()) === 0; - }; - - return self; - - function focusedSpecName() { - var specName; - - (function memoizeFocusedSpec() { - if (specName) { - return; - } - - var paramMap = []; - var params = jasmine.HtmlReporter.parameters(doc); - - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - specName = paramMap.spec; - })(); - - return specName; - } - - function createReporterDom(version) { - dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, - dom.banner = self.createDom('div', { className: 'banner' }, - self.createDom('span', { className: 'title' }, "Jasmine "), - self.createDom('span', { className: 'version' }, version)), - - dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), - dom.alert = self.createDom('div', {className: 'alert'}, - self.createDom('span', { className: 'exceptions' }, - self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'), - self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))), - dom.results = self.createDom('div', {className: 'results'}, - dom.summary = self.createDom('div', { className: 'summary' }), - dom.details = self.createDom('div', { id: 'details' })) - ); - } - - function noTryCatch() { - return window.location.search.match(/catch=false/); - } - - function searchWithCatch() { - var params = jasmine.HtmlReporter.parameters(window.document); - var removed = false; - var i = 0; - - while (!removed && i < params.length) { - if (params[i].match(/catch=/)) { - params.splice(i, 1); - removed = true; - } - i++; - } - if (jasmine.CATCH_EXCEPTIONS) { - params.push("catch=false"); - } - - return params.join("&"); - } - - function setExceptionHandling() { - var chxCatch = document.getElementById('no_try_catch'); - - if (noTryCatch()) { - chxCatch.setAttribute('checked', true); - jasmine.CATCH_EXCEPTIONS = false; - } - chxCatch.onclick = function() { - window.location.search = searchWithCatch(); - }; - } -}; -jasmine.HtmlReporter.parameters = function(doc) { - var paramStr = doc.location.search.substring(1); - var params = []; - - if (paramStr.length > 0) { - params = paramStr.split('&'); - } - return params; -} -jasmine.HtmlReporter.sectionLink = function(sectionName) { - var link = '?'; - var params = []; - - if (sectionName) { - params.push('spec=' + encodeURIComponent(sectionName)); - } - if (!jasmine.CATCH_EXCEPTIONS) { - params.push("catch=false"); - } - if (params.length > 0) { - link += params.join("&"); - } - - return link; -}; -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter); -jasmine.HtmlReporter.ReporterView = function(dom) { - this.startedAt = new Date(); - this.runningSpecCount = 0; - this.completeSpecCount = 0; - this.passedCount = 0; - this.failedCount = 0; - this.skippedCount = 0; - - this.createResultsMenu = function() { - this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, - this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), - ' | ', - this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); - - this.summaryMenuItem.onclick = function() { - dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); - }; - - this.detailsMenuItem.onclick = function() { - showDetails(); - }; - }; - - this.addSpecs = function(specs, specFilter) { - this.totalSpecCount = specs.length; - - this.views = { - specs: {}, - suites: {} - }; - - for (var i = 0; i < specs.length; i++) { - var spec = specs[i]; - this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); - if (specFilter(spec)) { - this.runningSpecCount++; - } - } - }; - - this.specComplete = function(spec) { - this.completeSpecCount++; - - if (isUndefined(this.views.specs[spec.id])) { - this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); - } - - var specView = this.views.specs[spec.id]; - - switch (specView.status()) { - case 'passed': - this.passedCount++; - break; - - case 'failed': - this.failedCount++; - break; - - case 'skipped': - this.skippedCount++; - break; - } - - specView.refresh(); - this.refresh(); - }; - - this.suiteComplete = function(suite) { - var suiteView = this.views.suites[suite.id]; - if (isUndefined(suiteView)) { - return; - } - suiteView.refresh(); - }; - - this.refresh = function() { - - if (isUndefined(this.resultsMenu)) { - this.createResultsMenu(); - } - - // currently running UI - if (isUndefined(this.runningAlert)) { - this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" }); - dom.alert.appendChild(this.runningAlert); - } - this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); - - // skipped specs UI - if (isUndefined(this.skippedAlert)) { - this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" }); - } - - this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - - if (this.skippedCount === 1 && isDefined(dom.alert)) { - dom.alert.appendChild(this.skippedAlert); - } - - // passing specs UI - if (isUndefined(this.passedAlert)) { - this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" }); - } - this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); - - // failing specs UI - if (isUndefined(this.failedAlert)) { - this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); - } - this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); - - if (this.failedCount === 1 && isDefined(dom.alert)) { - dom.alert.appendChild(this.failedAlert); - dom.alert.appendChild(this.resultsMenu); - } - - // summary info - this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); - this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; - }; - - this.complete = function() { - dom.alert.removeChild(this.runningAlert); - - this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - - if (this.failedCount === 0) { - dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); - } else { - showDetails(); - } - - dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); - }; - - return this; - - function showDetails() { - if (dom.reporter.className.search(/showDetails/) === -1) { - dom.reporter.className += " showDetails"; - } - } - - function isUndefined(obj) { - return typeof obj === 'undefined'; - } - - function isDefined(obj) { - return !isUndefined(obj); - } - - function specPluralizedFor(count) { - var str = count + " spec"; - if (count > 1) { - str += "s" - } - return str; - } - -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); - - -jasmine.HtmlReporter.SpecView = function(spec, dom, views) { - this.spec = spec; - this.dom = dom; - this.views = views; - - this.symbol = this.createDom('li', { className: 'pending' }); - this.dom.symbolSummary.appendChild(this.symbol); - - this.summary = this.createDom('div', { className: 'specSummary' }, - this.createDom('a', { - className: 'description', - href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()), - title: this.spec.getFullName() - }, this.spec.description) - ); - - this.detail = this.createDom('div', { className: 'specDetail' }, - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(this.spec.getFullName()), - title: this.spec.getFullName() - }, this.spec.getFullName()) - ); -}; - -jasmine.HtmlReporter.SpecView.prototype.status = function() { - return this.getSpecStatus(this.spec); -}; - -jasmine.HtmlReporter.SpecView.prototype.refresh = function() { - this.symbol.className = this.status(); - - switch (this.status()) { - case 'skipped': - break; - - case 'passed': - this.appendSummaryToSuiteDiv(); - break; - - case 'failed': - this.appendSummaryToSuiteDiv(); - this.appendFailureDetail(); - break; - } -}; - -jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { - this.summary.className += ' ' + this.status(); - this.appendToSummary(this.spec, this.summary); -}; - -jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { - this.detail.className += ' ' + this.status(); - - var resultItems = this.spec.results().getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && result.passed && !result.passed()) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - this.detail.appendChild(messagesDiv); - this.dom.details.appendChild(this.detail); - } -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { - this.suite = suite; - this.dom = dom; - this.views = views; - - this.element = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description) - ); - - this.appendToSummary(this.suite, this.element); -}; - -jasmine.HtmlReporter.SuiteView.prototype.status = function() { - return this.getSpecStatus(this.suite); -}; - -jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { - this.element.className += " " + this.status(); -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); - -/* @deprecated Use jasmine.HtmlReporter instead - */ -jasmine.TrivialReporter = function(doc) { - this.document = doc || document; - this.suiteDivs = {}; - this.logRunningSpecs = false; -}; - -jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { el.appendChild(child); } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { - var showPassed, showSkipped; - - this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, - this.createDom('div', { className: 'banner' }, - this.createDom('div', { className: 'logo' }, - this.createDom('span', { className: 'title' }, "Jasmine"), - this.createDom('span', { className: 'version' }, runner.env.versionString())), - this.createDom('div', { className: 'options' }, - "Show ", - showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), - showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") - ) - ), - - this.runnerDiv = this.createDom('div', { className: 'runner running' }, - this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), - this.runnerMessageSpan = this.createDom('span', {}, "Running..."), - this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) - ); - - this.document.body.appendChild(this.outerDiv); - - var suites = runner.suites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - var suiteDiv = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), - this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); - this.suiteDivs[suite.id] = suiteDiv; - var parentDiv = this.outerDiv; - if (suite.parentSuite) { - parentDiv = this.suiteDivs[suite.parentSuite.id]; - } - parentDiv.appendChild(suiteDiv); - } - - this.startedAt = new Date(); - - var self = this; - showPassed.onclick = function(evt) { - if (showPassed.checked) { - self.outerDiv.className += ' show-passed'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); - } - }; - - showSkipped.onclick = function(evt) { - if (showSkipped.checked) { - self.outerDiv.className += ' show-skipped'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); - } - }; -}; - -jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { - var results = runner.results(); - var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; - this.runnerDiv.setAttribute("class", className); - //do it twice for IE - this.runnerDiv.setAttribute("className", className); - var specs = runner.specs(); - var specCount = 0; - for (var i = 0; i < specs.length; i++) { - if (this.specFilter(specs[i])) { - specCount++; - } - } - var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); - message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; - this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); - - this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); -}; - -jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { - var results = suite.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.totalCount === 0) { // todo: change this to check results.skipped - status = 'skipped'; - } - this.suiteDivs[suite.id].className += " " + status; -}; - -jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { - if (this.logRunningSpecs) { - this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } -}; - -jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { - var results = spec.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - var specDiv = this.createDom('div', { className: 'spec ' + status }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(spec.getFullName()), - title: spec.getFullName() - }, spec.description)); - - - var resultItems = results.getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && result.passed && !result.passed()) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - specDiv.appendChild(messagesDiv); - } - - this.suiteDivs[spec.suite.id].appendChild(specDiv); -}; - -jasmine.TrivialReporter.prototype.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } -}; - -jasmine.TrivialReporter.prototype.getLocation = function() { - return this.document.location; -}; - -jasmine.TrivialReporter.prototype.specFilter = function(spec) { - var paramMap = {}; - var params = this.getLocation().search.substring(1).split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - if (!paramMap.spec) { - return true; - } - return spec.getFullName().indexOf(paramMap.spec) === 0; -}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine.css b/plugins/tiddlywiki/jasmine/files/jasmine.css deleted file mode 100644 index 8c008dc72..000000000 --- a/plugins/tiddlywiki/jasmine/files/jasmine.css +++ /dev/null @@ -1,82 +0,0 @@ -body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } - -#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } -#HTMLReporter a { text-decoration: none; } -#HTMLReporter a:hover { text-decoration: underline; } -#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } -#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } -#HTMLReporter #jasmine_content { position: fixed; right: 100%; } -#HTMLReporter .version { color: #aaaaaa; } -#HTMLReporter .banner { margin-top: 14px; } -#HTMLReporter .duration { color: #aaaaaa; float: right; } -#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } -#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } -#HTMLReporter .symbolSummary li.passed { font-size: 14px; } -#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } -#HTMLReporter .symbolSummary li.failed { line-height: 9px; } -#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } -#HTMLReporter .symbolSummary li.skipped { font-size: 14px; } -#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } -#HTMLReporter .symbolSummary li.pending { line-height: 11px; } -#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } -#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; } -#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } -#HTMLReporter .runningAlert { background-color: #666666; } -#HTMLReporter .skippedAlert { background-color: #aaaaaa; } -#HTMLReporter .skippedAlert:first-child { background-color: #333333; } -#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } -#HTMLReporter .passingAlert { background-color: #a6b779; } -#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } -#HTMLReporter .failingAlert { background-color: #cf867e; } -#HTMLReporter .failingAlert:first-child { background-color: #b03911; } -#HTMLReporter .results { margin-top: 14px; } -#HTMLReporter #details { display: none; } -#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } -#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } -#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } -#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter.showDetails .summary { display: none; } -#HTMLReporter.showDetails #details { display: block; } -#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter .summary { margin-top: 14px; } -#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } -#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } -#HTMLReporter .summary .specSummary.failed a { color: #b03911; } -#HTMLReporter .description + .suite { margin-top: 0; } -#HTMLReporter .suite { margin-top: 14px; } -#HTMLReporter .suite a { color: #333333; } -#HTMLReporter #details .specDetail { margin-bottom: 28px; } -#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } -#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } -#HTMLReporter .resultMessage span.result { display: block; } -#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } - -#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } -#TrivialReporter a:visited, #TrivialReporter a { color: #303; } -#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } -#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } -#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } -#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } -#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } -#TrivialReporter .runner.running { background-color: yellow; } -#TrivialReporter .options { text-align: right; font-size: .8em; } -#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } -#TrivialReporter .suite .suite { margin: 5px; } -#TrivialReporter .suite.passed { background-color: #dfd; } -#TrivialReporter .suite.failed { background-color: #fdd; } -#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } -#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } -#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } -#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } -#TrivialReporter .spec.skipped { background-color: #bbb; } -#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } -#TrivialReporter .passed { background-color: #cfc; display: none; } -#TrivialReporter .failed { background-color: #fbb; } -#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } -#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } -#TrivialReporter .resultMessage .mismatch { color: black; } -#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } -#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } -#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } -#TrivialReporter #jasmine_content { position: fixed; right: 100%; } -#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/plugins/tiddlywiki/jasmine/files/jasmine.js b/plugins/tiddlywiki/jasmine/files/jasmine.js deleted file mode 100644 index 6b3459b91..000000000 --- a/plugins/tiddlywiki/jasmine/files/jasmine.js +++ /dev/null @@ -1,2600 +0,0 @@ -var isCommonJS = typeof window == "undefined" && typeof exports == "object"; - -/** - * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. - * - * @namespace - */ -var jasmine = {}; -if (isCommonJS) exports.jasmine = jasmine; -/** - * @private - */ -jasmine.unimplementedMethod_ = function() { - throw new Error("unimplemented method"); -}; - -/** - * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just - * a plain old variable and may be redefined by somebody else. - * - * @private - */ -jasmine.undefined = jasmine.___undefined___; - -/** - * Show diagnostic messages in the console if set to true - * - */ -jasmine.VERBOSE = false; - -/** - * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. - * - */ -jasmine.DEFAULT_UPDATE_INTERVAL = 250; - -/** - * Maximum levels of nesting that will be included when an object is pretty-printed - */ -jasmine.MAX_PRETTY_PRINT_DEPTH = 40; - -/** - * Default timeout interval in milliseconds for waitsFor() blocks. - */ -jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; - -/** - * By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite. - * Set to false to let the exception bubble up in the browser. - * - */ -jasmine.CATCH_EXCEPTIONS = true; - -jasmine.getGlobal = function() { - function getGlobal() { - return this; - } - - return getGlobal(); -}; - -/** - * Allows for bound functions to be compared. Internal use only. - * - * @ignore - * @private - * @param base {Object} bound 'this' for the function - * @param name {Function} function to find - */ -jasmine.bindOriginal_ = function(base, name) { - var original = base[name]; - if (original.apply) { - return function() { - return original.apply(base, arguments); - }; - } else { - // IE support - return jasmine.getGlobal()[name]; - } -}; - -jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); -jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); -jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); -jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); - -jasmine.MessageResult = function(values) { - this.type = 'log'; - this.values = values; - this.trace = new Error(); // todo: test better -}; - -jasmine.MessageResult.prototype.toString = function() { - var text = ""; - for (var i = 0; i < this.values.length; i++) { - if (i > 0) text += " "; - if (jasmine.isString_(this.values[i])) { - text += this.values[i]; - } else { - text += jasmine.pp(this.values[i]); - } - } - return text; -}; - -jasmine.ExpectationResult = function(params) { - this.type = 'expect'; - this.matcherName = params.matcherName; - this.passed_ = params.passed; - this.expected = params.expected; - this.actual = params.actual; - this.message = this.passed_ ? 'Passed.' : params.message; - - var trace = (params.trace || new Error(this.message)); - this.trace = this.passed_ ? '' : trace; -}; - -jasmine.ExpectationResult.prototype.toString = function () { - return this.message; -}; - -jasmine.ExpectationResult.prototype.passed = function () { - return this.passed_; -}; - -/** - * Getter for the Jasmine environment. Ensures one gets created - */ -jasmine.getEnv = function() { - var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); - return env; -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isArray_ = function(value) { - return jasmine.isA_("Array", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isString_ = function(value) { - return jasmine.isA_("String", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isNumber_ = function(value) { - return jasmine.isA_("Number", value); -}; - -/** - * @ignore - * @private - * @param {String} typeName - * @param value - * @returns {Boolean} - */ -jasmine.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; -}; - -/** - * Pretty printer for expecations. Takes any object and turns it into a human-readable string. - * - * @param value {Object} an object to be outputted - * @returns {String} - */ -jasmine.pp = function(value) { - var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; -}; - -/** - * Returns true if the object is a DOM Node. - * - * @param {Object} obj object to check - * @returns {Boolean} - */ -jasmine.isDomNode = function(obj) { - return obj.nodeType > 0; -}; - -/** - * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. - * - * @example - * // don't care about which function is passed in, as long as it's a function - * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); - * - * @param {Class} clazz - * @returns matchable object of the type clazz - */ -jasmine.any = function(clazz) { - return new jasmine.Matchers.Any(clazz); -}; - -/** - * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the - * attributes on the object. - * - * @example - * // don't care about any other attributes than foo. - * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); - * - * @param sample {Object} sample - * @returns matchable object for the sample - */ -jasmine.objectContaining = function (sample) { - return new jasmine.Matchers.ObjectContaining(sample); -}; - -/** - * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. - * - * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine - * expectation syntax. Spies can be checked if they were called or not and what the calling params were. - * - * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). - * - * Spies are torn down at the end of every spec. - * - * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. - * - * @example - * // a stub - * var myStub = jasmine.createSpy('myStub'); // can be used anywhere - * - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // actual foo.not will not be called, execution stops - * spyOn(foo, 'not'); - - // foo.not spied upon, execution will continue to implementation - * spyOn(foo, 'not').andCallThrough(); - * - * // fake example - * var foo = { - * not: function(bool) { return !bool; } - * } - * - * // foo.not(val) will return val - * spyOn(foo, 'not').andCallFake(function(value) {return value;}); - * - * // mock example - * foo.not(7 == 7); - * expect(foo.not).toHaveBeenCalled(); - * expect(foo.not).toHaveBeenCalledWith(true); - * - * @constructor - * @see spyOn, jasmine.createSpy, jasmine.createSpyObj - * @param {String} name - */ -jasmine.Spy = function(name) { - /** - * The name of the spy, if provided. - */ - this.identity = name || 'unknown'; - /** - * Is this Object a spy? - */ - this.isSpy = true; - /** - * The actual function this spy stubs. - */ - this.plan = function() { - }; - /** - * Tracking of the most recent call to the spy. - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy.mostRecentCall.args = [1, 2]; - */ - this.mostRecentCall = {}; - - /** - * Holds arguments for each call to the spy, indexed by call count - * @example - * var mySpy = jasmine.createSpy('foo'); - * mySpy(1, 2); - * mySpy(7, 8); - * mySpy.mostRecentCall.args = [7, 8]; - * mySpy.argsForCall[0] = [1, 2]; - * mySpy.argsForCall[1] = [7, 8]; - */ - this.argsForCall = []; - this.calls = []; -}; - -/** - * Tells a spy to call through to the actual implemenatation. - * - * @example - * var foo = { - * bar: function() { // do some stuff } - * } - * - * // defining a spy on an existing property: foo.bar - * spyOn(foo, 'bar').andCallThrough(); - */ -jasmine.Spy.prototype.andCallThrough = function() { - this.plan = this.originalValue; - return this; -}; - -/** - * For setting the return value of a spy. - * - * @example - * // defining a spy from scratch: foo() returns 'baz' - * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); - * - * // defining a spy on an existing property: foo.bar() returns 'baz' - * spyOn(foo, 'bar').andReturn('baz'); - * - * @param {Object} value - */ -jasmine.Spy.prototype.andReturn = function(value) { - this.plan = function() { - return value; - }; - return this; -}; - -/** - * For throwing an exception when a spy is called. - * - * @example - * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' - * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); - * - * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' - * spyOn(foo, 'bar').andThrow('baz'); - * - * @param {String} exceptionMsg - */ -jasmine.Spy.prototype.andThrow = function(exceptionMsg) { - this.plan = function() { - throw exceptionMsg; - }; - return this; -}; - -/** - * Calls an alternate implementation when a spy is called. - * - * @example - * var baz = function() { - * // do some stuff, return something - * } - * // defining a spy from scratch: foo() calls the function baz - * var foo = jasmine.createSpy('spy on foo').andCall(baz); - * - * // defining a spy on an existing property: foo.bar() calls an anonymnous function - * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); - * - * @param {Function} fakeFunc - */ -jasmine.Spy.prototype.andCallFake = function(fakeFunc) { - this.plan = fakeFunc; - return this; -}; - -/** - * Resets all of a spy's the tracking variables so that it can be used again. - * - * @example - * spyOn(foo, 'bar'); - * - * foo.bar(); - * - * expect(foo.bar.callCount).toEqual(1); - * - * foo.bar.reset(); - * - * expect(foo.bar.callCount).toEqual(0); - */ -jasmine.Spy.prototype.reset = function() { - this.wasCalled = false; - this.callCount = 0; - this.argsForCall = []; - this.calls = []; - this.mostRecentCall = {}; -}; - -jasmine.createSpy = function(name) { - - var spyObj = function() { - spyObj.wasCalled = true; - spyObj.callCount++; - var args = jasmine.util.argsToArray(arguments); - spyObj.mostRecentCall.object = this; - spyObj.mostRecentCall.args = args; - spyObj.argsForCall.push(args); - spyObj.calls.push({object: this, args: args}); - return spyObj.plan.apply(this, arguments); - }; - - var spy = new jasmine.Spy(name); - - for (var prop in spy) { - spyObj[prop] = spy[prop]; - } - - spyObj.reset(); - - return spyObj; -}; - -/** - * Determines whether an object is a spy. - * - * @param {jasmine.Spy|Object} putativeSpy - * @returns {Boolean} - */ -jasmine.isSpy = function(putativeSpy) { - return putativeSpy && putativeSpy.isSpy; -}; - -/** - * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something - * large in one call. - * - * @param {String} baseName name of spy class - * @param {Array} methodNames array of names of methods to make spies - */ -jasmine.createSpyObj = function(baseName, methodNames) { - if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { - throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); - } - return obj; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the current spec's output. - * - * Be careful not to leave calls to <code>jasmine.log</code> in production code. - */ -jasmine.log = function() { - var spec = jasmine.getEnv().currentSpec; - spec.log.apply(spec, arguments); -}; - -/** - * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. - * - * @example - * // spy example - * var foo = { - * not: function(bool) { return !bool; } - * } - * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops - * - * @see jasmine.createSpy - * @param obj - * @param methodName - * @return {jasmine.Spy} a Jasmine spy that can be chained with all spy methods - */ -var spyOn = function(obj, methodName) { - return jasmine.getEnv().currentSpec.spyOn(obj, methodName); -}; -if (isCommonJS) exports.spyOn = spyOn; - -/** - * Creates a Jasmine spec that will be added to the current suite. - * - * // TODO: pending tests - * - * @example - * it('should be true', function() { - * expect(true).toEqual(true); - * }); - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var it = function(desc, func) { - return jasmine.getEnv().it(desc, func); -}; -if (isCommonJS) exports.it = it; - -/** - * Creates a <em>disabled</em> Jasmine spec. - * - * A convenience method that allows existing specs to be disabled temporarily during development. - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var xit = function(desc, func) { - return jasmine.getEnv().xit(desc, func); -}; -if (isCommonJS) exports.xit = xit; - -/** - * Starts a chain for a Jasmine expectation. - * - * It is passed an Object that is the actual value and should chain to one of the many - * jasmine.Matchers functions. - * - * @param {Object} actual Actual value to test against and expected value - * @return {jasmine.Matchers} - */ -var expect = function(actual) { - return jasmine.getEnv().currentSpec.expect(actual); -}; -if (isCommonJS) exports.expect = expect; - -/** - * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. - * - * @param {Function} func Function that defines part of a jasmine spec. - */ -var runs = function(func) { - jasmine.getEnv().currentSpec.runs(func); -}; -if (isCommonJS) exports.runs = runs; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -var waits = function(timeout) { - jasmine.getEnv().currentSpec.waits(timeout); -}; -if (isCommonJS) exports.waits = waits; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); -}; -if (isCommonJS) exports.waitsFor = waitsFor; - -/** - * A function that is called before each spec in a suite. - * - * Used for spec setup, including validating assumptions. - * - * @param {Function} beforeEachFunction - */ -var beforeEach = function(beforeEachFunction) { - jasmine.getEnv().beforeEach(beforeEachFunction); -}; -if (isCommonJS) exports.beforeEach = beforeEach; - -/** - * A function that is called after each spec in a suite. - * - * Used for restoring any state that is hijacked during spec execution. - * - * @param {Function} afterEachFunction - */ -var afterEach = function(afterEachFunction) { - jasmine.getEnv().afterEach(afterEachFunction); -}; -if (isCommonJS) exports.afterEach = afterEach; - -/** - * Defines a suite of specifications. - * - * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared - * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization - * of setup in some tests. - * - * @example - * // TODO: a simple suite - * - * // TODO: a simple suite with a nested describe block - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var describe = function(description, specDefinitions) { - return jasmine.getEnv().describe(description, specDefinitions); -}; -if (isCommonJS) exports.describe = describe; - -/** - * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var xdescribe = function(description, specDefinitions) { - return jasmine.getEnv().xdescribe(description, specDefinitions); -}; -if (isCommonJS) exports.xdescribe = xdescribe; - - -// Provide the XMLHttpRequest class for IE 5.x-6.x: -jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { - function tryIt(f) { - try { - return f(); - } catch(e) { - } - return null; - } - - var xhr = tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.6.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP.3.0"); - }) || - tryIt(function() { - return new ActiveXObject("Msxml2.XMLHTTP"); - }) || - tryIt(function() { - return new ActiveXObject("Microsoft.XMLHTTP"); - }); - - if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); - - return xhr; -} : XMLHttpRequest; -/** - * @namespace - */ -jasmine.util = {}; - -/** - * Declare that a child class inherit it's prototype from the parent class. - * - * @private - * @param {Function} childClass - * @param {Function} parentClass - */ -jasmine.util.inherit = function(childClass, parentClass) { - /** - * @private - */ - var subclass = function() { - }; - subclass.prototype = parentClass.prototype; - childClass.prototype = new subclass(); -}; - -jasmine.util.formatException = function(e) { - var lineNumber; - if (e.line) { - lineNumber = e.line; - } - else if (e.lineNumber) { - lineNumber = e.lineNumber; - } - - var file; - - if (e.sourceURL) { - file = e.sourceURL; - } - else if (e.fileName) { - file = e.fileName; - } - - var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); - - if (file && lineNumber) { - message += ' in ' + file + ' (line ' + lineNumber + ')'; - } - - return message; -}; - -jasmine.util.htmlEscape = function(str) { - if (!str) return str; - return str.replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>'); -}; - -jasmine.util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); - return arrayOfArgs; -}; - -jasmine.util.extend = function(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; -}; - -/** - * Environment for Jasmine - * - * @constructor - */ -jasmine.Env = function() { - this.currentSpec = null; - this.currentSuite = null; - this.currentRunner_ = new jasmine.Runner(this); - - this.reporter = new jasmine.MultiReporter(); - - this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; - this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; - this.lastUpdate = 0; - this.specFilter = function() { - return true; - }; - - this.nextSpecId_ = 0; - this.nextSuiteId_ = 0; - this.equalityTesters_ = []; - - // wrap matchers - this.matchersClass = function() { - jasmine.Matchers.apply(this, arguments); - }; - jasmine.util.inherit(this.matchersClass, jasmine.Matchers); - - jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); -}; - - -jasmine.Env.prototype.setTimeout = jasmine.setTimeout; -jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; -jasmine.Env.prototype.setInterval = jasmine.setInterval; -jasmine.Env.prototype.clearInterval = jasmine.clearInterval; - -/** - * @returns an object containing jasmine version build info, if set. - */ -jasmine.Env.prototype.version = function () { - if (jasmine.version_) { - return jasmine.version_; - } else { - throw new Error('Version not set'); - } -}; - -/** - * @returns string containing jasmine version build info, if set. - */ -jasmine.Env.prototype.versionString = function() { - if (!jasmine.version_) { - return "version unknown"; - } - - var version = this.version(); - var versionString = version.major + "." + version.minor + "." + version.build; - if (version.release_candidate) { - versionString += ".rc" + version.release_candidate; - } - versionString += " revision " + version.revision; - return versionString; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSpecId = function () { - return this.nextSpecId_++; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSuiteId = function () { - return this.nextSuiteId_++; -}; - -/** - * Register a reporter to receive status updates from Jasmine. - * @param {jasmine.Reporter} reporter An object which will receive status updates. - */ -jasmine.Env.prototype.addReporter = function(reporter) { - this.reporter.addReporter(reporter); -}; - -jasmine.Env.prototype.execute = function() { - this.currentRunner_.execute(); -}; - -jasmine.Env.prototype.describe = function(description, specDefinitions) { - var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); - - var parentSuite = this.currentSuite; - if (parentSuite) { - parentSuite.add(suite); - } else { - this.currentRunner_.add(suite); - } - - this.currentSuite = suite; - - var declarationError = null; - try { - specDefinitions.call(suite); - } catch(e) { - declarationError = e; - } - - if (declarationError) { - this.it("encountered a declaration exception", function() { - throw declarationError; - }); - } - - this.currentSuite = parentSuite; - - return suite; -}; - -jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { - if (this.currentSuite) { - this.currentSuite.beforeEach(beforeEachFunction); - } else { - this.currentRunner_.beforeEach(beforeEachFunction); - } -}; - -jasmine.Env.prototype.currentRunner = function () { - return this.currentRunner_; -}; - -jasmine.Env.prototype.afterEach = function(afterEachFunction) { - if (this.currentSuite) { - this.currentSuite.afterEach(afterEachFunction); - } else { - this.currentRunner_.afterEach(afterEachFunction); - } - -}; - -jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { - return { - execute: function() { - } - }; -}; - -jasmine.Env.prototype.it = function(description, func) { - var spec = new jasmine.Spec(this, this.currentSuite, description); - this.currentSuite.add(spec); - this.currentSpec = spec; - - if (func) { - spec.runs(func); - } - - return spec; -}; - -jasmine.Env.prototype.xit = function(desc, func) { - return { - id: this.nextSpecId(), - runs: function() { - } - }; -}; - -jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.source != b.source) - mismatchValues.push("expected pattern /" + b.source + "/ is not equal to the pattern /" + a.source + "/"); - - if (a.ignoreCase != b.ignoreCase) - mismatchValues.push("expected modifier i was" + (b.ignoreCase ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.global != b.global) - mismatchValues.push("expected modifier g was" + (b.global ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.multiline != b.multiline) - mismatchValues.push("expected modifier m was" + (b.multiline ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.sticky != b.sticky) - mismatchValues.push("expected modifier y was" + (b.sticky ? " " : " not ") + "set and does not equal the origin modifier"); - - return (mismatchValues.length === 0); -}; - -jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { - return true; - } - - a.__Jasmine_been_here_before__ = b; - b.__Jasmine_been_here_before__ = a; - - var hasKey = function(obj, keyName) { - return obj !== null && obj[keyName] !== jasmine.undefined; - }; - - for (var property in b) { - if (!hasKey(a, property) && hasKey(b, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - } - for (property in a) { - if (!hasKey(b, property) && hasKey(a, property)) { - mismatchKeys.push("expected missing key '" + property + "', but present in actual."); - } - } - for (property in b) { - if (property == '__Jasmine_been_here_before__') continue; - if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); - } - } - - if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { - mismatchValues.push("arrays were not the same length"); - } - - delete a.__Jasmine_been_here_before__; - delete b.__Jasmine_been_here_before__; - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - for (var i = 0; i < this.equalityTesters_.length; i++) { - var equalityTester = this.equalityTesters_[i]; - var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); - if (result !== jasmine.undefined) return result; - } - - if (a === b) return true; - - if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { - return (a == jasmine.undefined && b == jasmine.undefined); - } - - if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { - return a === b; - } - - if (a instanceof Date && b instanceof Date) { - return a.getTime() == b.getTime(); - } - - if (a.jasmineMatches) { - return a.jasmineMatches(b); - } - - if (b.jasmineMatches) { - return b.jasmineMatches(a); - } - - if (a instanceof jasmine.Matchers.ObjectContaining) { - return a.matches(b); - } - - if (b instanceof jasmine.Matchers.ObjectContaining) { - return b.matches(a); - } - - if (jasmine.isString_(a) && jasmine.isString_(b)) { - return (a == b); - } - - if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { - return (a == b); - } - - if (a instanceof RegExp && b instanceof RegExp) { - return this.compareRegExps_(a, b, mismatchKeys, mismatchValues); - } - - if (typeof a === "object" && typeof b === "object") { - return this.compareObjects_(a, b, mismatchKeys, mismatchValues); - } - - //Straight check - return (a === b); -}; - -jasmine.Env.prototype.contains_ = function(haystack, needle) { - if (jasmine.isArray_(haystack)) { - for (var i = 0; i < haystack.length; i++) { - if (this.equals_(haystack[i], needle)) return true; - } - return false; - } - return haystack.indexOf(needle) >= 0; -}; - -jasmine.Env.prototype.addEqualityTester = function(equalityTester) { - this.equalityTesters_.push(equalityTester); -}; -/** No-op base class for Jasmine reporters. - * - * @constructor - */ -jasmine.Reporter = function() { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerResults = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecStarting = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecResults = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.log = function(str) { -}; - -/** - * Blocks are functions with executable code that make up a spec. - * - * @constructor - * @param {jasmine.Env} env - * @param {Function} func - * @param {jasmine.Spec} spec - */ -jasmine.Block = function(env, func, spec) { - this.env = env; - this.func = func; - this.spec = spec; -}; - -jasmine.Block.prototype.execute = function(onComplete) { - if (!jasmine.CATCH_EXCEPTIONS) { - this.func.apply(this.spec); - } - else { - try { - this.func.apply(this.spec); - } catch (e) { - this.spec.fail(e); - } - } - onComplete(); -}; -/** JavaScript API reporter. - * - * @constructor - */ -jasmine.JsApiReporter = function() { - this.started = false; - this.finished = false; - this.suites_ = []; - this.results_ = {}; -}; - -jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { - this.started = true; - var suites = runner.topLevelSuites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - this.suites_.push(this.summarize_(suite)); - } -}; - -jasmine.JsApiReporter.prototype.suites = function() { - return this.suites_; -}; - -jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { - var isSuite = suiteOrSpec instanceof jasmine.Suite; - var summary = { - id: suiteOrSpec.id, - name: suiteOrSpec.description, - type: isSuite ? 'suite' : 'spec', - children: [] - }; - - if (isSuite) { - var children = suiteOrSpec.children(); - for (var i = 0; i < children.length; i++) { - summary.children.push(this.summarize_(children[i])); - } - } - return summary; -}; - -jasmine.JsApiReporter.prototype.results = function() { - return this.results_; -}; - -jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { - return this.results_[specId]; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { - this.finished = true; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { - this.results_[spec.id] = { - messages: spec.results().getItems(), - result: spec.results().failedCount > 0 ? "failed" : "passed" - }; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.log = function(str) { -}; - -jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ - var results = {}; - for (var i = 0; i < specIds.length; i++) { - var specId = specIds[i]; - results[specId] = this.summarizeResult_(this.results_[specId]); - } - return results; -}; - -jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ - var summaryMessages = []; - var messagesLength = result.messages.length; - for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { - var resultMessage = result.messages[messageIndex]; - summaryMessages.push({ - text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, - passed: resultMessage.passed ? resultMessage.passed() : true, - type: resultMessage.type, - message: resultMessage.message, - trace: { - stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined - } - }); - } - - return { - result : result.result, - messages : summaryMessages - }; -}; - -/** - * @constructor - * @param {jasmine.Env} env - * @param actual - * @param {jasmine.Spec} spec - */ -jasmine.Matchers = function(env, actual, spec, opt_isNot) { - this.env = env; - this.actual = actual; - this.spec = spec; - this.isNot = opt_isNot || false; - this.reportWasCalled_ = false; -}; - -// todo: @deprecated as of Jasmine 0.11, remove soon [xw] -jasmine.Matchers.pp = function(str) { - throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); -}; - -// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] -jasmine.Matchers.prototype.report = function(result, failing_message, details) { - throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); -}; - -jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { - for (var methodName in prototype) { - if (methodName == 'report') continue; - var orig = prototype[methodName]; - matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); - } -}; - -jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { - return function() { - var matcherArgs = jasmine.util.argsToArray(arguments); - var result = matcherFunction.apply(this, arguments); - - if (this.isNot) { - result = !result; - } - - if (this.reportWasCalled_) return result; - - var message; - if (!result) { - if (this.message) { - message = this.message.apply(this, arguments); - if (jasmine.isArray_(message)) { - message = message[this.isNot ? 1 : 0]; - } - } else { - var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; - if (matcherArgs.length > 0) { - for (var i = 0; i < matcherArgs.length; i++) { - if (i > 0) message += ","; - message += " " + jasmine.pp(matcherArgs[i]); - } - } - message += "."; - } - } - var expectationResult = new jasmine.ExpectationResult({ - matcherName: matcherName, - passed: result, - expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], - actual: this.actual, - message: message - }); - this.spec.addMatcherResult(expectationResult); - return jasmine.undefined; - }; -}; - - - - -/** - * toBe: compares the actual to the expected using === - * @param expected - */ -jasmine.Matchers.prototype.toBe = function(expected) { - return this.actual === expected; -}; - -/** - * toNotBe: compares the actual to the expected using !== - * @param expected - * @deprecated as of 1.0. Use not.toBe() instead. - */ -jasmine.Matchers.prototype.toNotBe = function(expected) { - return this.actual !== expected; -}; - -/** - * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. - * - * @param expected - */ -jasmine.Matchers.prototype.toEqual = function(expected) { - return this.env.equals_(this.actual, expected); -}; - -/** - * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual - * @param expected - * @deprecated as of 1.0. Use not.toEqual() instead. - */ -jasmine.Matchers.prototype.toNotEqual = function(expected) { - return !this.env.equals_(this.actual, expected); -}; - -/** - * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes - * a pattern or a String. - * - * @param expected - */ -jasmine.Matchers.prototype.toMatch = function(expected) { - return new RegExp(expected).test(this.actual); -}; - -/** - * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch - * @param expected - * @deprecated as of 1.0. Use not.toMatch() instead. - */ -jasmine.Matchers.prototype.toNotMatch = function(expected) { - return !(new RegExp(expected).test(this.actual)); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeDefined = function() { - return (this.actual !== jasmine.undefined); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeUndefined = function() { - return (this.actual === jasmine.undefined); -}; - -/** - * Matcher that compares the actual to null. - */ -jasmine.Matchers.prototype.toBeNull = function() { - return (this.actual === null); -}; - -/** - * Matcher that compares the actual to NaN. - */ -jasmine.Matchers.prototype.toBeNaN = function() { - this.message = function() { - return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ]; - }; - - return (this.actual !== this.actual); -}; - -/** - * Matcher that boolean not-nots the actual. - */ -jasmine.Matchers.prototype.toBeTruthy = function() { - return !!this.actual; -}; - - -/** - * Matcher that boolean nots the actual. - */ -jasmine.Matchers.prototype.toBeFalsy = function() { - return !this.actual; -}; - - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called. - */ -jasmine.Matchers.prototype.toHaveBeenCalled = function() { - if (arguments.length > 0) { - throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to have been called.", - "Expected spy " + this.actual.identity + " not to have been called." - ]; - }; - - return this.actual.wasCalled; -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ -jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was not called. - * - * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead - */ -jasmine.Matchers.prototype.wasNotCalled = function() { - if (arguments.length > 0) { - throw new Error('wasNotCalled does not take arguments'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to not have been called.", - "Expected spy " + this.actual.identity + " to have been called." - ]; - }; - - return !this.actual.wasCalled; -}; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. - * - * @example - * - */ -jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - this.message = function() { - var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."; - var positiveMessage = ""; - if (this.actual.callCount === 0) { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called."; - } else { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, '') - } - return [positiveMessage, invertedMessage]; - }; - - return this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; - -/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasNotCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", - "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" - ]; - }; - - return !this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** - * Matcher that checks that the expected item is an element in the actual Array. - * - * @param {Object} expected - */ -jasmine.Matchers.prototype.toContain = function(expected) { - return this.env.contains_(this.actual, expected); -}; - -/** - * Matcher that checks that the expected item is NOT an element in the actual Array. - * - * @param {Object} expected - * @deprecated as of 1.0. Use not.toContain() instead. - */ -jasmine.Matchers.prototype.toNotContain = function(expected) { - return !this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toBeLessThan = function(expected) { - return this.actual < expected; -}; - -jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { - return this.actual > expected; -}; - -/** - * Matcher that checks that the expected item is equal to the actual item - * up to a given level of decimal precision (default 2). - * - * @param {Number} expected - * @param {Number} precision, as number of decimal places - */ -jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { - if (!(precision === 0)) { - precision = precision || 2; - } - return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); -}; - -/** - * Matcher that checks that the expected exception was thrown by the actual. - * - * @param {String} [expected] - */ -jasmine.Matchers.prototype.toThrow = function(expected) { - var result = false; - var exception; - if (typeof this.actual != 'function') { - throw new Error('Actual is not a function'); - } - try { - this.actual(); - } catch (e) { - exception = e; - } - if (exception) { - result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); - } - - var not = this.isNot ? "not " : ""; - - this.message = function() { - if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { - return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); - } else { - return "Expected function to throw an exception."; - } - }; - - return result; -}; - -jasmine.Matchers.Any = function(expectedClass) { - this.expectedClass = expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { - if (this.expectedClass == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedClass == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedClass == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedClass == Object) { - return typeof other == 'object'; - } - - return other instanceof this.expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineToString = function() { - return '<jasmine.any(' + this.expectedClass + ')>'; -}; - -jasmine.Matchers.ObjectContaining = function (sample) { - this.sample = sample; -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - var env = jasmine.getEnv(); - - var hasKey = function(obj, keyName) { - return obj != null && obj[keyName] !== jasmine.undefined; - }; - - for (var property in this.sample) { - if (!hasKey(other, property) && hasKey(this.sample, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); - } - } - - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () { - return "<jasmine.objectContaining(" + jasmine.pp(this.sample) + ")>"; -}; -// Mock setTimeout, clearTimeout -// Contributed by Pivotal Computer Systems, www.pivotalsf.com - -jasmine.FakeTimer = function() { - this.reset(); - - var self = this; - self.setTimeout = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); - return self.timeoutsMade; - }; - - self.setInterval = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); - return self.timeoutsMade; - }; - - self.clearTimeout = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - - self.clearInterval = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = jasmine.undefined; - }; - -}; - -jasmine.FakeTimer.prototype.reset = function() { - this.timeoutsMade = 0; - this.scheduledFunctions = {}; - this.nowMillis = 0; -}; - -jasmine.FakeTimer.prototype.tick = function(millis) { - var oldMillis = this.nowMillis; - var newMillis = oldMillis + millis; - this.runFunctionsWithinRange(oldMillis, newMillis); - this.nowMillis = newMillis; -}; - -jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { - var scheduledFunc; - var funcsToRun = []; - for (var timeoutKey in this.scheduledFunctions) { - scheduledFunc = this.scheduledFunctions[timeoutKey]; - if (scheduledFunc != jasmine.undefined && - scheduledFunc.runAtMillis >= oldMillis && - scheduledFunc.runAtMillis <= nowMillis) { - funcsToRun.push(scheduledFunc); - this.scheduledFunctions[timeoutKey] = jasmine.undefined; - } - } - - if (funcsToRun.length > 0) { - funcsToRun.sort(function(a, b) { - return a.runAtMillis - b.runAtMillis; - }); - for (var i = 0; i < funcsToRun.length; ++i) { - try { - var funcToRun = funcsToRun[i]; - this.nowMillis = funcToRun.runAtMillis; - funcToRun.funcToCall(); - if (funcToRun.recurring) { - this.scheduleFunction(funcToRun.timeoutKey, - funcToRun.funcToCall, - funcToRun.millis, - true); - } - } catch(e) { - } - } - this.runFunctionsWithinRange(oldMillis, nowMillis); - } -}; - -jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { - this.scheduledFunctions[timeoutKey] = { - runAtMillis: this.nowMillis + millis, - funcToCall: funcToCall, - recurring: recurring, - timeoutKey: timeoutKey, - millis: millis - }; -}; - -/** - * @namespace - */ -jasmine.Clock = { - defaultFakeTimer: new jasmine.FakeTimer(), - - reset: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.reset(); - }, - - tick: function(millis) { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.tick(millis); - }, - - runFunctionsWithinRange: function(oldMillis, nowMillis) { - jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); - }, - - scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { - jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); - }, - - useMock: function() { - if (!jasmine.Clock.isInstalled()) { - var spec = jasmine.getEnv().currentSpec; - spec.after(jasmine.Clock.uninstallMock); - - jasmine.Clock.installMock(); - } - }, - - installMock: function() { - jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; - }, - - uninstallMock: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.installed = jasmine.Clock.real; - }, - - real: { - setTimeout: jasmine.getGlobal().setTimeout, - clearTimeout: jasmine.getGlobal().clearTimeout, - setInterval: jasmine.getGlobal().setInterval, - clearInterval: jasmine.getGlobal().clearInterval - }, - - assertInstalled: function() { - if (!jasmine.Clock.isInstalled()) { - throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); - } - }, - - isInstalled: function() { - return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; - }, - - installed: null -}; -jasmine.Clock.installed = jasmine.Clock.real; - -//else for IE support -jasmine.getGlobal().setTimeout = function(funcToCall, millis) { - if (jasmine.Clock.installed.setTimeout.apply) { - return jasmine.Clock.installed.setTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.setTimeout(funcToCall, millis); - } -}; - -jasmine.getGlobal().setInterval = function(funcToCall, millis) { - if (jasmine.Clock.installed.setInterval.apply) { - return jasmine.Clock.installed.setInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.setInterval(funcToCall, millis); - } -}; - -jasmine.getGlobal().clearTimeout = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearTimeout.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearTimeout(timeoutKey); - } -}; - -jasmine.getGlobal().clearInterval = function(timeoutKey) { - if (jasmine.Clock.installed.clearTimeout.apply) { - return jasmine.Clock.installed.clearInterval.apply(this, arguments); - } else { - return jasmine.Clock.installed.clearInterval(timeoutKey); - } -}; - -/** - * @constructor - */ -jasmine.MultiReporter = function() { - this.subReporters_ = []; -}; -jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); - -jasmine.MultiReporter.prototype.addReporter = function(reporter) { - this.subReporters_.push(reporter); -}; - -(function() { - var functionNames = [ - "reportRunnerStarting", - "reportRunnerResults", - "reportSuiteResults", - "reportSpecStarting", - "reportSpecResults", - "log" - ]; - for (var i = 0; i < functionNames.length; i++) { - var functionName = functionNames[i]; - jasmine.MultiReporter.prototype[functionName] = (function(functionName) { - return function() { - for (var j = 0; j < this.subReporters_.length; j++) { - var subReporter = this.subReporters_[j]; - if (subReporter[functionName]) { - subReporter[functionName].apply(subReporter, arguments); - } - } - }; - })(functionName); - } -})(); -/** - * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults - * - * @constructor - */ -jasmine.NestedResults = function() { - /** - * The total count of results - */ - this.totalCount = 0; - /** - * Number of passed results - */ - this.passedCount = 0; - /** - * Number of failed results - */ - this.failedCount = 0; - /** - * Was this suite/spec skipped? - */ - this.skipped = false; - /** - * @ignore - */ - this.items_ = []; -}; - -/** - * Roll up the result counts. - * - * @param result - */ -jasmine.NestedResults.prototype.rollupCounts = function(result) { - this.totalCount += result.totalCount; - this.passedCount += result.passedCount; - this.failedCount += result.failedCount; -}; - -/** - * Adds a log message. - * @param values Array of message parts which will be concatenated later. - */ -jasmine.NestedResults.prototype.log = function(values) { - this.items_.push(new jasmine.MessageResult(values)); -}; - -/** - * Getter for the results: message & results. - */ -jasmine.NestedResults.prototype.getItems = function() { - return this.items_; -}; - -/** - * Adds a result, tracking counts (total, passed, & failed) - * @param {jasmine.ExpectationResult|jasmine.NestedResults} result - */ -jasmine.NestedResults.prototype.addResult = function(result) { - if (result.type != 'log') { - if (result.items_) { - this.rollupCounts(result); - } else { - this.totalCount++; - if (result.passed()) { - this.passedCount++; - } else { - this.failedCount++; - } - } - } - this.items_.push(result); -}; - -/** - * @returns {Boolean} True if <b>everything</b> below passed - */ -jasmine.NestedResults.prototype.passed = function() { - return this.passedCount === this.totalCount; -}; -/** - * Base class for pretty printing for expectation results. - */ -jasmine.PrettyPrinter = function() { - this.ppNestLevel_ = 0; -}; - -/** - * Formats a value in a nice, human-readable string. - * - * @param value - */ -jasmine.PrettyPrinter.prototype.format = function(value) { - this.ppNestLevel_++; - try { - if (value === jasmine.undefined) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === jasmine.getGlobal()) { - this.emitScalar('<global>'); - } else if (value.jasmineToString) { - this.emitScalar(value.jasmineToString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (jasmine.isSpy(value)) { - this.emitScalar("spy on " + value.identity); - } else if (value instanceof RegExp) { - this.emitScalar(value.toString()); - } else if (typeof value === 'function') { - this.emitScalar('Function'); - } else if (typeof value.nodeType === 'number') { - this.emitScalar('HTMLNode'); - } else if (value instanceof Date) { - this.emitScalar('Date(' + value + ')'); - } else if (value.__Jasmine_been_here_before__) { - this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>'); - } else if (jasmine.isArray_(value) || typeof value == 'object') { - value.__Jasmine_been_here_before__ = true; - if (jasmine.isArray_(value)) { - this.emitArray(value); - } else { - this.emitObject(value); - } - delete value.__Jasmine_been_here_before__; - } else { - this.emitScalar(value.toString()); - } - } finally { - this.ppNestLevel_--; - } -}; - -jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (!obj.hasOwnProperty(property)) continue; - if (property == '__Jasmine_been_here_before__') continue; - fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && - obj.__lookupGetter__(property) !== null) : false); - } -}; - -jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; - -jasmine.StringPrettyPrinter = function() { - jasmine.PrettyPrinter.call(this); - - this.string = ''; -}; -jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); - -jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); -}; - -jasmine.StringPrettyPrinter.prototype.emitString = function(value) { - this.append("'" + value + "'"); -}; - -jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Array"); - return; - } - - this.append('[ '); - for (var i = 0; i < array.length; i++) { - if (i > 0) { - this.append(', '); - } - this.format(array[i]); - } - this.append(' ]'); -}; - -jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Object"); - return; - } - - var self = this; - this.append('{ '); - var first = true; - - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); - } - - self.append(property); - self.append(' : '); - if (isGetter) { - self.append('<getter>'); - } else { - self.format(obj[property]); - } - }); - - this.append(' }'); -}; - -jasmine.StringPrettyPrinter.prototype.append = function(value) { - this.string += value; -}; -jasmine.Queue = function(env) { - this.env = env; - - // parallel to blocks. each true value in this array means the block will - // get executed even if we abort - this.ensured = []; - this.blocks = []; - this.running = false; - this.index = 0; - this.offset = 0; - this.abort = false; -}; - -jasmine.Queue.prototype.addBefore = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.blocks.unshift(block); - this.ensured.unshift(ensure); -}; - -jasmine.Queue.prototype.add = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.blocks.push(block); - this.ensured.push(ensure); -}; - -jasmine.Queue.prototype.insertNext = function(block, ensure) { - if (ensure === jasmine.undefined) { - ensure = false; - } - - this.ensured.splice((this.index + this.offset + 1), 0, ensure); - this.blocks.splice((this.index + this.offset + 1), 0, block); - this.offset++; -}; - -jasmine.Queue.prototype.start = function(onComplete) { - this.running = true; - this.onComplete = onComplete; - this.next_(); -}; - -jasmine.Queue.prototype.isRunning = function() { - return this.running; -}; - -jasmine.Queue.LOOP_DONT_RECURSE = true; - -jasmine.Queue.prototype.next_ = function() { - var self = this; - var goAgain = true; - - while (goAgain) { - goAgain = false; - - if (self.index < self.blocks.length && !(this.abort && !this.ensured[self.index])) { - var calledSynchronously = true; - var completedSynchronously = false; - - var onComplete = function () { - if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { - completedSynchronously = true; - return; - } - - if (self.blocks[self.index].abort) { - self.abort = true; - } - - self.offset = 0; - self.index++; - - var now = new Date().getTime(); - if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { - self.env.lastUpdate = now; - self.env.setTimeout(function() { - self.next_(); - }, 0); - } else { - if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { - goAgain = true; - } else { - self.next_(); - } - } - }; - self.blocks[self.index].execute(onComplete); - - calledSynchronously = false; - if (completedSynchronously) { - onComplete(); - } - - } else { - self.running = false; - if (self.onComplete) { - self.onComplete(); - } - } - } -}; - -jasmine.Queue.prototype.results = function() { - var results = new jasmine.NestedResults(); - for (var i = 0; i < this.blocks.length; i++) { - if (this.blocks[i].results) { - results.addResult(this.blocks[i].results()); - } - } - return results; -}; - - -/** - * Runner - * - * @constructor - * @param {jasmine.Env} env - */ -jasmine.Runner = function(env) { - var self = this; - self.env = env; - self.queue = new jasmine.Queue(env); - self.before_ = []; - self.after_ = []; - self.suites_ = []; -}; - -jasmine.Runner.prototype.execute = function() { - var self = this; - if (self.env.reporter.reportRunnerStarting) { - self.env.reporter.reportRunnerStarting(this); - } - self.queue.start(function () { - self.finishCallback(); - }); -}; - -jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.splice(0,0,beforeEachFunction); -}; - -jasmine.Runner.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.splice(0,0,afterEachFunction); -}; - - -jasmine.Runner.prototype.finishCallback = function() { - this.env.reporter.reportRunnerResults(this); -}; - -jasmine.Runner.prototype.addSuite = function(suite) { - this.suites_.push(suite); -}; - -jasmine.Runner.prototype.add = function(block) { - if (block instanceof jasmine.Suite) { - this.addSuite(block); - } - this.queue.add(block); -}; - -jasmine.Runner.prototype.specs = function () { - var suites = this.suites(); - var specs = []; - for (var i = 0; i < suites.length; i++) { - specs = specs.concat(suites[i].specs()); - } - return specs; -}; - -jasmine.Runner.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Runner.prototype.topLevelSuites = function() { - var topLevelSuites = []; - for (var i = 0; i < this.suites_.length; i++) { - if (!this.suites_[i].parentSuite) { - topLevelSuites.push(this.suites_[i]); - } - } - return topLevelSuites; -}; - -jasmine.Runner.prototype.results = function() { - return this.queue.results(); -}; -/** - * Internal representation of a Jasmine specification, or test. - * - * @constructor - * @param {jasmine.Env} env - * @param {jasmine.Suite} suite - * @param {String} description - */ -jasmine.Spec = function(env, suite, description) { - if (!env) { - throw new Error('jasmine.Env() required'); - } - if (!suite) { - throw new Error('jasmine.Suite() required'); - } - var spec = this; - spec.id = env.nextSpecId ? env.nextSpecId() : null; - spec.env = env; - spec.suite = suite; - spec.description = description; - spec.queue = new jasmine.Queue(env); - - spec.afterCallbacks = []; - spec.spies_ = []; - - spec.results_ = new jasmine.NestedResults(); - spec.results_.description = description; - spec.matchersClass = null; -}; - -jasmine.Spec.prototype.getFullName = function() { - return this.suite.getFullName() + ' ' + this.description + '.'; -}; - - -jasmine.Spec.prototype.results = function() { - return this.results_; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the spec's output. - * - * Be careful not to leave calls to <code>jasmine.log</code> in production code. - */ -jasmine.Spec.prototype.log = function() { - return this.results_.log(arguments); -}; - -jasmine.Spec.prototype.runs = function (func) { - var block = new jasmine.Block(this.env, func, this); - this.addToQueue(block); - return this; -}; - -jasmine.Spec.prototype.addToQueue = function (block) { - if (this.queue.isRunning()) { - this.queue.insertNext(block); - } else { - this.queue.add(block); - } -}; - -/** - * @param {jasmine.ExpectationResult} result - */ -jasmine.Spec.prototype.addMatcherResult = function(result) { - this.results_.addResult(result); -}; - -jasmine.Spec.prototype.expect = function(actual) { - var positive = new (this.getMatchersClass_())(this.env, actual, this); - positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); - return positive; -}; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -jasmine.Spec.prototype.waits = function(timeout) { - var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); - this.addToQueue(waitsFunc); - return this; -}; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { - var latchFunction_ = null; - var optional_timeoutMessage_ = null; - var optional_timeout_ = null; - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - switch (typeof arg) { - case 'function': - latchFunction_ = arg; - break; - case 'string': - optional_timeoutMessage_ = arg; - break; - case 'number': - optional_timeout_ = arg; - break; - } - } - - var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); - this.addToQueue(waitsForFunc); - return this; -}; - -jasmine.Spec.prototype.fail = function (e) { - var expectationResult = new jasmine.ExpectationResult({ - passed: false, - message: e ? jasmine.util.formatException(e) : 'Exception', - trace: { stack: e.stack } - }); - this.results_.addResult(expectationResult); -}; - -jasmine.Spec.prototype.getMatchersClass_ = function() { - return this.matchersClass || this.env.matchersClass; -}; - -jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { - var parent = this.getMatchersClass_(); - var newMatchersClass = function() { - parent.apply(this, arguments); - }; - jasmine.util.inherit(newMatchersClass, parent); - jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); - this.matchersClass = newMatchersClass; -}; - -jasmine.Spec.prototype.finishCallback = function() { - this.env.reporter.reportSpecResults(this); -}; - -jasmine.Spec.prototype.finish = function(onComplete) { - this.removeAllSpies(); - this.finishCallback(); - if (onComplete) { - onComplete(); - } -}; - -jasmine.Spec.prototype.after = function(doAfter) { - if (this.queue.isRunning()) { - this.queue.add(new jasmine.Block(this.env, doAfter, this), true); - } else { - this.afterCallbacks.unshift(doAfter); - } -}; - -jasmine.Spec.prototype.execute = function(onComplete) { - var spec = this; - if (!spec.env.specFilter(spec)) { - spec.results_.skipped = true; - spec.finish(onComplete); - return; - } - - this.env.reporter.reportSpecStarting(this); - - spec.env.currentSpec = spec; - - spec.addBeforesAndAftersToQueue(); - - spec.queue.start(function () { - spec.finish(onComplete); - }); -}; - -jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { - var runner = this.env.currentRunner(); - var i; - - for (var suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); - } - } - for (i = 0; i < runner.before_.length; i++) { - this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); - } - for (i = 0; i < this.afterCallbacks.length; i++) { - this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this), true); - } - for (suite = this.suite; suite; suite = suite.parentSuite) { - for (i = 0; i < suite.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, suite.after_[i], this), true); - } - } - for (i = 0; i < runner.after_.length; i++) { - this.queue.add(new jasmine.Block(this.env, runner.after_[i], this), true); - } -}; - -jasmine.Spec.prototype.explodes = function() { - throw 'explodes function should not have been called'; -}; - -jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { - if (obj == jasmine.undefined) { - throw "spyOn could not find an object to spy upon for " + methodName + "()"; - } - - if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { - throw methodName + '() method does not exist'; - } - - if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { - throw new Error(methodName + ' has already been spied upon'); - } - - var spyObj = jasmine.createSpy(methodName); - - this.spies_.push(spyObj); - spyObj.baseObj = obj; - spyObj.methodName = methodName; - spyObj.originalValue = obj[methodName]; - - obj[methodName] = spyObj; - - return spyObj; -}; - -jasmine.Spec.prototype.removeAllSpies = function() { - for (var i = 0; i < this.spies_.length; i++) { - var spy = this.spies_[i]; - spy.baseObj[spy.methodName] = spy.originalValue; - } - this.spies_ = []; -}; - -/** - * Internal representation of a Jasmine suite. - * - * @constructor - * @param {jasmine.Env} env - * @param {String} description - * @param {Function} specDefinitions - * @param {jasmine.Suite} parentSuite - */ -jasmine.Suite = function(env, description, specDefinitions, parentSuite) { - var self = this; - self.id = env.nextSuiteId ? env.nextSuiteId() : null; - self.description = description; - self.queue = new jasmine.Queue(env); - self.parentSuite = parentSuite; - self.env = env; - self.before_ = []; - self.after_ = []; - self.children_ = []; - self.suites_ = []; - self.specs_ = []; -}; - -jasmine.Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; - } - return fullName; -}; - -jasmine.Suite.prototype.finish = function(onComplete) { - this.env.reporter.reportSuiteResults(this); - this.finished = true; - if (typeof(onComplete) == 'function') { - onComplete(); - } -}; - -jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { - beforeEachFunction.typeName = 'beforeEach'; - this.before_.unshift(beforeEachFunction); -}; - -jasmine.Suite.prototype.afterEach = function(afterEachFunction) { - afterEachFunction.typeName = 'afterEach'; - this.after_.unshift(afterEachFunction); -}; - -jasmine.Suite.prototype.results = function() { - return this.queue.results(); -}; - -jasmine.Suite.prototype.add = function(suiteOrSpec) { - this.children_.push(suiteOrSpec); - if (suiteOrSpec instanceof jasmine.Suite) { - this.suites_.push(suiteOrSpec); - this.env.currentRunner().addSuite(suiteOrSpec); - } else { - this.specs_.push(suiteOrSpec); - } - this.queue.add(suiteOrSpec); -}; - -jasmine.Suite.prototype.specs = function() { - return this.specs_; -}; - -jasmine.Suite.prototype.suites = function() { - return this.suites_; -}; - -jasmine.Suite.prototype.children = function() { - return this.children_; -}; - -jasmine.Suite.prototype.execute = function(onComplete) { - var self = this; - this.queue.start(function () { - self.finish(onComplete); - }); -}; -jasmine.WaitsBlock = function(env, timeout, spec) { - this.timeout = timeout; - jasmine.Block.call(this, env, null, spec); -}; - -jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); - -jasmine.WaitsBlock.prototype.execute = function (onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); - } - this.env.setTimeout(function () { - onComplete(); - }, this.timeout); -}; -/** - * A block which waits for some condition to become true, with timeout. - * - * @constructor - * @extends jasmine.Block - * @param {jasmine.Env} env The Jasmine environment. - * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. - * @param {Function} latchFunction A function which returns true when the desired condition has been met. - * @param {String} message The message to display if the desired condition hasn't been met within the given time period. - * @param {jasmine.Spec} spec The Jasmine spec. - */ -jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { - this.timeout = timeout || env.defaultTimeoutInterval; - this.latchFunction = latchFunction; - this.message = message; - this.totalTimeSpentWaitingForLatch = 0; - jasmine.Block.call(this, env, null, spec); -}; -jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); - -jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; - -jasmine.WaitsForBlock.prototype.execute = function(onComplete) { - if (jasmine.VERBOSE) { - this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); - } - var latchFunctionResult; - try { - latchFunctionResult = this.latchFunction.apply(this.spec); - } catch (e) { - this.spec.fail(e); - onComplete(); - return; - } - - if (latchFunctionResult) { - onComplete(); - } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { - var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); - this.spec.fail({ - name: 'timeout', - message: message - }); - - this.abort = true; - onComplete(); - } else { - this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; - var self = this; - this.env.setTimeout(function() { - self.execute(onComplete); - }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); - } -}; - -jasmine.version_= { - "major": 1, - "minor": 3, - "build": 1, - "revision": 1354556913 -}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine/MIT.LICENSE b/plugins/tiddlywiki/jasmine/files/jasmine/MIT.LICENSE new file mode 100644 index 000000000..efbd6dc78 --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine/MIT.LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014-2016 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/plugins/tiddlywiki/jasmine/files/jasmine/lib/command.js b/plugins/tiddlywiki/jasmine/files/jasmine/lib/command.js new file mode 100644 index 000000000..9397372ec --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine/lib/command.js @@ -0,0 +1,283 @@ +var path = require('path'), + fs = require('fs'); + +exports = module.exports = Command; + +var subCommands = { + init: { + description: 'initialize jasmine', + action: initJasmine + }, + examples: { + description: 'install examples', + action: installExamples + }, + help: { + description: 'show help', + action: help, + alias: '-h' + }, + version: { + description: 'show jasmine and jasmine-core versions', + action: version, + alias: '-v' + } +}; + +function Command(projectBaseDir, examplesDir, print) { + this.projectBaseDir = projectBaseDir; + this.specDir = path.join(projectBaseDir, 'spec'); + + var command = this; + + this.run = function(jasmine, commands) { + setEnvironmentVariables(commands); + + var commandToRun; + Object.keys(subCommands).forEach(function(cmd) { + var commandObject = subCommands[cmd]; + if (commands.indexOf(cmd) >= 0) { + commandToRun = commandObject; + } else if(commandObject.alias && commands.indexOf(commandObject.alias) >= 0) { + commandToRun = commandObject; + } + }); + + if (commandToRun) { + commandToRun.action({jasmine: jasmine, projectBaseDir: command.projectBaseDir, specDir: command.specDir, examplesDir: examplesDir, print: print}); + } else { + var env = parseOptions(commands); + if (env.unknownOptions.length > 0) { + process.exitCode = 1; + print('Unknown options: ' + env.unknownOptions.join(', ')); + print(''); + help({print: print}); + } else { + runJasmine(jasmine, env, print); + } + } + }; +} + +function isFileArg(arg) { + return arg.indexOf('--') !== 0 && !isEnvironmentVariable(arg); +} + +function parseOptions(argv) { + var files = [], + helpers = [], + requires = [], + unknownOptions = [], + color = process.stdout.isTTY || false, + reporter, + configPath, + filter, + stopOnFailure, + failFast, + random, + seed; + + argv.forEach(function(arg) { + if (arg === '--no-color') { + color = false; + } else if (arg === '--color') { + color = true; + } else if (arg.match("^--filter=")) { + filter = arg.match("^--filter=(.*)")[1]; + } else if (arg.match("^--helper=")) { + helpers.push(arg.match("^--helper=(.*)")[1]); + } else if (arg.match("^--require=")) { + requires.push(arg.match("^--require=(.*)")[1]); + } else if (arg.match("^--stop-on-failure=")) { + stopOnFailure = arg.match("^--stop-on-failure=(.*)")[1] === 'true'; + } else if (arg.match("^--fail-fast=")) { + failFast = arg.match("^--fail-fast=(.*)")[1] === 'true'; + } else if (arg.match("^--random=")) { + random = arg.match("^--random=(.*)")[1] === 'true'; + } else if (arg.match("^--seed=")) { + seed = arg.match("^--seed=(.*)")[1]; + } else if (arg.match("^--config=")) { + configPath = arg.match("^--config=(.*)")[1]; + } else if (arg.match("^--reporter=")) { + reporter = arg.match("^--reporter=(.*)")[1]; + } else if (isFileArg(arg)) { + files.push(arg); + } else if (!isEnvironmentVariable(arg)) { + unknownOptions.push(arg); + } + }); + return { + color: color, + configPath: configPath, + filter: filter, + stopOnFailure: stopOnFailure, + failFast: failFast, + helpers: helpers, + requires: requires, + reporter: reporter, + files: files, + random: random, + seed: seed, + unknownOptions: unknownOptions + }; +} + +function runJasmine(jasmine, env, print) { + jasmine.loadConfigFile(env.configPath || process.env.JASMINE_CONFIG_PATH); + if (env.stopOnFailure !== undefined) { + jasmine.stopSpecOnExpectationFailure(env.stopOnFailure); + } + if (env.failFast !== undefined) { + jasmine.stopOnSpecFailure(env.failFast); + } + if (env.seed !== undefined) { + jasmine.seed(env.seed); + } + if (env.random !== undefined) { + jasmine.randomizeTests(env.random); + } + if (env.helpers !== undefined && env.helpers.length) { + jasmine.addHelperFiles(env.helpers); + } + if (env.requires !== undefined && env.requires.length) { + jasmine.addRequires(env.requires); + } + if (env.reporter !== undefined) { + try { + var Report = require(env.reporter); + var reporter = new Report(); + jasmine.clearReporters(); + jasmine.addReporter(reporter); + } catch(e) { + print('failed to register reporter "' + env.reporter + '"'); + print(e.message); + print(e.stack); + } + } + jasmine.showColors(env.color); + jasmine.execute(env.files, env.filter); +} + +function initJasmine(options) { + var print = options.print; + var specDir = options.specDir; + makeDirStructure(path.join(specDir, 'support/')); + if(!fs.existsSync(path.join(specDir, 'support/jasmine.json'))) { + fs.writeFileSync(path.join(specDir, 'support/jasmine.json'), fs.readFileSync(path.join(__dirname, '../lib/examples/jasmine.json'), 'utf-8')); + } + else { + print('spec/support/jasmine.json already exists in your project.'); + } +} + +function installExamples(options) { + var specDir = options.specDir; + var projectBaseDir = options.projectBaseDir; + var examplesDir = options.examplesDir; + + makeDirStructure(path.join(specDir, 'support')); + makeDirStructure(path.join(specDir, 'jasmine_examples')); + makeDirStructure(path.join(specDir, 'helpers', 'jasmine_examples')); + makeDirStructure(path.join(projectBaseDir, 'lib', 'jasmine_examples')); + + copyFiles( + path.join(examplesDir, 'spec', 'helpers', 'jasmine_examples'), + path.join(specDir, 'helpers', 'jasmine_examples'), + new RegExp(/[Hh]elper\.js/) + ); + + copyFiles( + path.join(examplesDir, 'lib', 'jasmine_examples'), + path.join(projectBaseDir, 'lib', 'jasmine_examples'), + new RegExp(/\.js/) + ); + + copyFiles( + path.join(examplesDir, 'spec', 'jasmine_examples'), + path.join(specDir, 'jasmine_examples'), + new RegExp(/[Ss]pec.js/) + ); +} + +function help(options) { + var print = options.print; + print('Usage: jasmine [command] [options] [files]'); + print(''); + print('Commands:'); + Object.keys(subCommands).forEach(function(cmd) { + var commandNameText = cmd; + if(subCommands[cmd].alias) { + commandNameText = commandNameText + ',' + subCommands[cmd].alias; + } + print('%s\t%s', lPad(commandNameText, 10), subCommands[cmd].description); + }); + print(''); + print('If no command is given, jasmine specs will be run'); + print(''); + print(''); + + print('Options:'); + print('%s\tturn off color in spec output', lPad('--no-color', 18)); + print('%s\tforce turn on color in spec output', lPad('--color', 18)); + print('%s\tfilter specs to run only those that match the given string', lPad('--filter=', 18)); + print('%s\tload helper files that match the given string', lPad('--helper=', 18)); + print('%s\tload module that match the given string', lPad('--require=', 18)); + print('%s\t[true|false] stop spec execution on expectation failure', lPad('--stop-on-failure=', 18)); + print('%s\t[true|false] stop Jasmine execution on spec failure', lPad('--fail-fast=', 18)); + print('%s\tpath to your optional jasmine.json', lPad('--config=', 18)); + print('%s\tpath to reporter to use instead of the default Jasmine reporter', lPad('--reporter=', 18)); + print(''); + print('The given arguments take precedence over options in your jasmine.json'); + print('The path to your optional jasmine.json can also be configured by setting the JASMINE_CONFIG_PATH environment variable'); +} + +function version(options) { + var print = options.print; + print('jasmine v' + require('../package.json').version); + print('jasmine-core v' + options.jasmine.coreVersion()); +} + +function lPad(str, length) { + if (str.length >= length) { + return str; + } else { + return lPad(' ' + str, length); + } +} + +function copyFiles(srcDir, destDir, pattern) { + var srcDirFiles = fs.readdirSync(srcDir); + srcDirFiles.forEach(function(file) { + if (file.search(pattern) !== -1) { + fs.writeFileSync(path.join(destDir, file), fs.readFileSync(path.join(srcDir, file))); + } + }); +} + +function makeDirStructure(absolutePath) { + var splitPath = absolutePath.split(path.sep); + splitPath.forEach(function(dir, index) { + if(index > 1) { + var fullPath = path.join(splitPath.slice(0, index).join('/'), dir); + if (!fs.existsSync(fullPath)) { + fs.mkdirSync(fullPath); + } + } + }); +} + +function isEnvironmentVariable(command) { + var envRegExp = /(.*)=(.*)/; + return command.match(envRegExp); +} + +function setEnvironmentVariables(commands) { + commands.forEach(function (command) { + var regExpMatch = isEnvironmentVariable(command); + if(regExpMatch) { + var key = regExpMatch[1]; + var value = regExpMatch[2]; + process.env[key] = value; + } + }); +} diff --git a/plugins/tiddlywiki/jasmine/files/jasmine/lib/filters/console_spec_filter.js b/plugins/tiddlywiki/jasmine/files/jasmine/lib/filters/console_spec_filter.js new file mode 100644 index 000000000..0b92ad9ab --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine/lib/filters/console_spec_filter.js @@ -0,0 +1,10 @@ +module.exports = exports = ConsoleSpecFilter; + +function ConsoleSpecFilter(options) { + var filterString = options && options.filterString; + var filterPattern = new RegExp(filterString); + + this.matches = function(specName) { + return filterPattern.test(specName); + }; +} diff --git a/plugins/tiddlywiki/jasmine/files/jasmine/lib/jasmine.js b/plugins/tiddlywiki/jasmine/files/jasmine/lib/jasmine.js new file mode 100644 index 000000000..b09002497 --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine/lib/jasmine.js @@ -0,0 +1,263 @@ +var path = require('path'), + util = require('util'), + glob = require('glob'), + CompletionReporter = require('./reporters/completion_reporter'), + ConsoleSpecFilter = require('./filters/console_spec_filter'); + +module.exports = Jasmine; +module.exports.ConsoleReporter = require('./reporters/console_reporter'); + +function Jasmine(options) { + options = options || {}; + var jasmineCore = options.jasmineCore || require('jasmine-core'); + this.jasmineCorePath = path.join(jasmineCore.files.path, 'jasmine.js'); + this.jasmine = jasmineCore.boot(jasmineCore); + this.projectBaseDir = options.projectBaseDir || path.resolve(); + this.specDir = ''; + this.specFiles = []; + this.helperFiles = []; + this.requires = []; + this.env = this.jasmine.getEnv({suppressLoadErrors: true}); + this.reportersCount = 0; + this.completionReporter = new CompletionReporter(); + this.onCompleteCallbackAdded = false; + this.exit = process.exit; + this.showingColors = true; + this.reporter = new module.exports.ConsoleReporter(); + this.addReporter(this.reporter); + this.defaultReporterConfigured = false; + + var jasmineRunner = this; + this.completionReporter.onComplete(function(passed) { + jasmineRunner.exitCodeCompletion(passed); + }); + this.checkExit = checkExit(this); + + this.coreVersion = function() { + return jasmineCore.version(); + }; +} + +Jasmine.prototype.randomizeTests = function(value) { + this.env.configure({random: value}); +}; + +Jasmine.prototype.seed = function(value) { + this.env.configure({seed: value}); +}; + +Jasmine.prototype.showColors = function(value) { + this.showingColors = value; +}; + +Jasmine.prototype.addSpecFile = function(filePath) { + this.specFiles.push(filePath); +}; + +Jasmine.prototype.addReporter = function(reporter) { + this.env.addReporter(reporter); + this.reportersCount++; +}; + +Jasmine.prototype.clearReporters = function() { + this.env.clearReporters(); + this.reportersCount = 0; +}; + +Jasmine.prototype.provideFallbackReporter = function(reporter) { + this.env.provideFallbackReporter(reporter); +}; + +Jasmine.prototype.configureDefaultReporter = function(options) { + options.timer = options.timer || new this.jasmine.Timer(); + options.print = options.print || function() { + process.stdout.write(util.format.apply(this, arguments)); + }; + options.showColors = options.hasOwnProperty('showColors') ? options.showColors : true; + options.jasmineCorePath = options.jasmineCorePath || this.jasmineCorePath; + + this.reporter.setOptions(options); + this.defaultReporterConfigured = true; +}; + +Jasmine.prototype.addMatchers = function(matchers) { + this.env.addMatchers(matchers); +}; + +Jasmine.prototype.loadSpecs = function() { + this.specFiles.forEach(function(file) { + require(file); + }); +}; + +Jasmine.prototype.loadHelpers = function() { + this.helperFiles.forEach(function(file) { + require(file); + }); +}; + +Jasmine.prototype.loadRequires = function() { + this.requires.forEach(function(r) { + require(r); + }); +}; + +Jasmine.prototype.loadConfigFile = function(configFilePath) { + try { + var absoluteConfigFilePath = path.resolve(this.projectBaseDir, configFilePath || 'spec/support/jasmine.json'); + var config = require(absoluteConfigFilePath); + this.loadConfig(config); + } catch (e) { + if(configFilePath || e.code != 'MODULE_NOT_FOUND') { throw e; } + } +}; + +Jasmine.prototype.loadConfig = function(config) { + this.specDir = config.spec_dir || this.specDir; + + var configuration = {}; + + if (config.stopSpecOnExpectationFailure !== undefined) { + configuration.oneFailurePerSpec = config.stopSpecOnExpectationFailure; + } + + if (config.stopOnSpecFailure !== undefined) { + configuration.failFast = config.stopOnSpecFailure; + } + + if (config.random !== undefined) { + configuration.random = config.random; + } + + if (Object.keys(configuration).length > 0) { + this.env.configure(configuration); + } + + if(config.helpers) { + this.addHelperFiles(config.helpers); + } + + if(config.requires) { + this.addRequires(config.requires); + } + + if(config.spec_files) { + this.addSpecFiles(config.spec_files); + } +}; + +Jasmine.prototype.addHelperFiles = addFiles('helperFiles'); +Jasmine.prototype.addSpecFiles = addFiles('specFiles'); + +Jasmine.prototype.addRequires = function(requires) { + var jasmineRunner = this; + requires.forEach(function(r) { + jasmineRunner.requires.push(r); + }); +}; + +function addFiles(kind) { + return function (files) { + var jasmineRunner = this; + var fileArr = this[kind]; + + var includeFiles = []; + var excludeFiles = []; + files.forEach(function(file) { + if (file.startsWith('!')) { + var excludeFile = file.substring(1); + if(!(path.isAbsolute && path.isAbsolute(excludeFile))) { + excludeFile = path.join(jasmineRunner.projectBaseDir, jasmineRunner.specDir, excludeFile); + } + + excludeFiles.push(excludeFile); + } else { + includeFiles.push(file); + } + }); + + includeFiles.forEach(function(file) { + if(!(path.isAbsolute && path.isAbsolute(file))) { + file = path.join(jasmineRunner.projectBaseDir, jasmineRunner.specDir, file); + } + var filePaths = glob.sync(file, { ignore: excludeFiles }); + filePaths.forEach(function(filePath) { + // glob will always output '/' as a segment separator but the fileArr may use \ on windows + // fileArr needs to be checked for both versions + if(fileArr.indexOf(filePath) === -1 && fileArr.indexOf(path.normalize(filePath)) === -1) { + fileArr.push(filePath); + } + }); + }); + }; +} + +Jasmine.prototype.onComplete = function(onCompleteCallback) { + this.completionReporter.onComplete(onCompleteCallback); +}; + +Jasmine.prototype.stopSpecOnExpectationFailure = function(value) { + this.env.configure({oneFailurePerSpec: value}); +}; + +Jasmine.prototype.stopOnSpecFailure = function(value) { + this.env.configure({failFast: value}); +}; + +Jasmine.prototype.exitCodeCompletion = function(passed) { + var jasmineRunner = this; + var streams = [process.stdout, process.stderr]; + var writesToWait = streams.length; + streams.forEach(function(stream) { + stream.write('', null, exitIfAllStreamsCompleted); + }); + function exitIfAllStreamsCompleted() { + writesToWait--; + if (writesToWait === 0) { + if(passed) { + jasmineRunner.exit(0); + } + else { + jasmineRunner.exit(1); + } + } + } +}; + +var checkExit = function(jasmineRunner) { + return function() { + if (!jasmineRunner.completionReporter.isComplete()) { + process.exitCode = 4; + } + }; +}; + +Jasmine.prototype.execute = function(files, filterString) { + this.completionReporter.exitHandler = this.checkExit; + + this.loadRequires(); + this.loadHelpers(); + if (!this.defaultReporterConfigured) { + this.configureDefaultReporter({ showColors: this.showingColors }); + } + + if(filterString) { + var specFilter = new ConsoleSpecFilter({ + filterString: filterString + }); + this.env.configure({specFilter: function(spec) { + return specFilter.matches(spec.getFullName()); + }}); + } + + if (files && files.length > 0) { + this.specDir = ''; + this.specFiles = []; + this.addSpecFiles(files); + } + + this.loadSpecs(); + + this.addReporter(this.completionReporter); + this.env.execute(); +}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/completion_reporter.js b/plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/completion_reporter.js new file mode 100644 index 000000000..ff1098272 --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/completion_reporter.js @@ -0,0 +1,29 @@ +module.exports = function() { + var onCompleteCallback = function() {}; + var completed = false; + + this.onComplete = function(callback) { + onCompleteCallback = callback; + }; + + this.jasmineStarted = function() { + if (this.exitHandler) { + process.on('exit', this.exitHandler); + } + }; + + this.jasmineDone = function(result) { + completed = true; + if (this.exitHandler) { + process.removeListener('exit', this.exitHandler); + } + + onCompleteCallback(result.overallStatus === 'passed'); + }; + + this.isComplete = function() { + return completed; + }; + + this.exitHandler = null; +}; diff --git a/plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/console_reporter.js b/plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/console_reporter.js new file mode 100644 index 000000000..1119c20be --- /dev/null +++ b/plugins/tiddlywiki/jasmine/files/jasmine/lib/reporters/console_reporter.js @@ -0,0 +1,232 @@ +module.exports = exports = ConsoleReporter; + +var noopTimer = { + start: function(){}, + elapsed: function(){ return 0; } +}; + +function ConsoleReporter() { + var print = function() {}, + showColors = false, + timer = noopTimer, + jasmineCorePath = null, + specCount, + executableSpecCount, + failureCount, + failedSpecs = [], + pendingSpecs = [], + ansi = { + green: '\x1B[32m', + red: '\x1B[31m', + yellow: '\x1B[33m', + none: '\x1B[0m' + }, + failedSuites = [], + stackFilter = defaultStackFilter; + + this.setOptions = function(options) { + if (options.print) { + print = options.print; + } + showColors = options.showColors || false; + if (options.timer) { + timer = options.timer; + } + if (options.jasmineCorePath) { + jasmineCorePath = options.jasmineCorePath; + } + if (options.stackFilter) { + stackFilter = options.stackFilter; + } + }; + + this.jasmineStarted = function(options) { + specCount = 0; + executableSpecCount = 0; + failureCount = 0; + if (options && options.order && options.order.random) { + print('Randomized with seed ' + options.order.seed); + printNewline(); + } + print('Started'); + printNewline(); + timer.start(); + }; + + this.jasmineDone = function(result) { + printNewline(); + printNewline(); + if(failedSpecs.length > 0) { + print('Failures:'); + } + for (var i = 0; i < failedSpecs.length; i++) { + specFailureDetails(failedSpecs[i], i + 1); + } + + for(i = 0; i < failedSuites.length; i++) { + suiteFailureDetails(failedSuites[i]); + } + + if (result && result.failedExpectations && result.failedExpectations.length > 0) { + suiteFailureDetails(result); + } + + if (pendingSpecs.length > 0) { + print("Pending:"); + } + for(i = 0; i < pendingSpecs.length; i++) { + pendingSpecDetails(pendingSpecs[i], i + 1); + } + + if(specCount > 0) { + printNewline(); + + if(executableSpecCount !== specCount) { + print('Ran ' + executableSpecCount + ' of ' + specCount + plural(' spec', specCount)); + printNewline(); + } + var specCounts = executableSpecCount + ' ' + plural('spec', executableSpecCount) + ', ' + + failureCount + ' ' + plural('failure', failureCount); + + if (pendingSpecs.length) { + specCounts += ', ' + pendingSpecs.length + ' pending ' + plural('spec', pendingSpecs.length); + } + + print(specCounts); + } else { + print('No specs found'); + } + + printNewline(); + var seconds = timer.elapsed() / 1000; + print('Finished in ' + seconds + ' ' + plural('second', seconds)); + printNewline(); + + if (result && result.overallStatus === 'incomplete') { + print('Incomplete: ' + result.incompleteReason); + printNewline(); + } + + if (result && result.order && result.order.random) { + print('Randomized with seed ' + result.order.seed); + print(' (jasmine --random=true --seed=' + result.order.seed + ')'); + printNewline(); + } + }; + + this.specDone = function(result) { + specCount++; + + if (result.status == 'pending') { + pendingSpecs.push(result); + executableSpecCount++; + print(colored('yellow', '*')); + return; + } + + if (result.status == 'passed') { + executableSpecCount++; + print(colored('green', '.')); + return; + } + + if (result.status == 'failed') { + failureCount++; + failedSpecs.push(result); + executableSpecCount++; + print(colored('red', 'F')); + } + }; + + this.suiteDone = function(result) { + if (result.failedExpectations && result.failedExpectations.length > 0) { + failureCount++; + failedSuites.push(result); + } + }; + + return this; + + function printNewline() { + print('\n'); + } + + function colored(color, str) { + return showColors ? (ansi[color] + str + ansi.none) : str; + } + + function plural(str, count) { + return count == 1 ? str : str + 's'; + } + + function repeat(thing, times) { + var arr = []; + for (var i = 0; i < times; i++) { + arr.push(thing); + } + return arr; + } + + function indent(str, spaces) { + var lines = (str || '').split('\n'); + var newArr = []; + for (var i = 0; i < lines.length; i++) { + newArr.push(repeat(' ', spaces).join('') + lines[i]); + } + return newArr.join('\n'); + } + + function defaultStackFilter(stack) { + if (!stack) { + return ''; + } + + var filteredStack = stack.split('\n').filter(function(stackLine) { + return stackLine.indexOf(jasmineCorePath) === -1; + }).join('\n'); + return filteredStack; + } + + function specFailureDetails(result, failedSpecNumber) { + printNewline(); + print(failedSpecNumber + ') '); + print(result.fullName); + printFailedExpectations(result); + } + + function suiteFailureDetails(result) { + printNewline(); + print('Suite error: ' + result.fullName); + printFailedExpectations(result); + } + + function printFailedExpectations(result) { + for (var i = 0; i < result.failedExpectations.length; i++) { + var failedExpectation = result.failedExpectations[i]; + printNewline(); + print(indent('Message:', 2)); + printNewline(); + print(colored('red', indent(failedExpectation.message, 4))); + printNewline(); + print(indent('Stack:', 2)); + printNewline(); + print(indent(stackFilter(failedExpectation.stack), 4)); + } + + printNewline(); + } + + function pendingSpecDetails(result, pendingSpecNumber) { + printNewline(); + printNewline(); + print(pendingSpecNumber + ') '); + print(result.fullName); + printNewline(); + var pendingReason = "No reason given"; + if (result.pendingReason && result.pendingReason !== '') { + pendingReason = result.pendingReason; + } + print(indent(colored('yellow', pendingReason), 2)); + printNewline(); + } +} diff --git a/plugins/tiddlywiki/jasmine/files/reporter.js b/plugins/tiddlywiki/jasmine/files/reporter.js deleted file mode 100644 index 619fcae10..000000000 --- a/plugins/tiddlywiki/jasmine/files/reporter.js +++ /dev/null @@ -1,276 +0,0 @@ -(function() { - // - // Imports - // - var util; - try { - util = require('util') - } catch(e) { - util = require('sys') - } - - var jasmineNode = {}; - // - // Helpers - // - function noop() {} - - - jasmineNode.TerminalReporter = function(config) { - this.print_ = config.print || util.print; - this.color_ = config.color ? this.ANSIColors : this.NoColors; - - this.started_ = false; - this.finished_ = false; - - this.callback_ = config.onComplete || false - - this.suites_ = []; - this.specResults_ = {}; - this.failures_ = []; - this.includeStackTrace_ = config.includeStackTrace === false ? false : true; - } - - - jasmineNode.TerminalReporter.prototype = { - reportRunnerStarting: function(runner) { - this.started_ = true; - this.startedAt = new Date(); - var suites = runner.topLevelSuites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - this.suites_.push(this.summarize_(suite)); - } - }, - - ANSIColors: { - pass: function() { return '\033[32m'; }, // Green - fail: function() { return '\033[31m'; }, // Red - neutral: function() { return '\033[0m'; } // Normal - }, - - NoColors: { - pass: function() { return ''; }, - fail: function() { return ''; }, - neutral: function() { return ''; } - }, - - summarize_: function(suiteOrSpec) { - var isSuite = suiteOrSpec instanceof jasmine.Suite; - - // We could use a separate object for suite and spec - var summary = { - id: suiteOrSpec.id, - name: suiteOrSpec.description, - type: isSuite? 'suite' : 'spec', - suiteNestingLevel: 0, - children: [] - }; - - if (isSuite) { - var calculateNestingLevel = function(examinedSuite) { - var nestingLevel = 0; - while (examinedSuite.parentSuite !== null) { - nestingLevel += 1; - examinedSuite = examinedSuite.parentSuite; - } - return nestingLevel; - }; - - summary.suiteNestingLevel = calculateNestingLevel(suiteOrSpec); - - var children = suiteOrSpec.children(); - for (var i = 0; i < children.length; i++) { - summary.children.push(this.summarize_(children[i])); - } - } - - return summary; - }, - - // This is heavily influenced by Jasmine's Html/Trivial Reporter - reportRunnerResults: function(runner) { - this.reportFailures_(); - - var results = runner.results(); - var resultColor = (results.failedCount > 0) ? this.color_.fail() : this.color_.pass(); - - var specs = runner.specs(); - var specCount = specs.length; - - var message = "\n\nFinished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + " seconds"; - this.printLine_(message); - - // This is what jasmine-html.js has - //message = "" + specCount + " spec" + ( specCount === 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount === 1) ? "" : "s"); - - this.printLine_(this.stringWithColor_(this.printRunnerResults_(runner), resultColor)); - - this.finished_ = true; - if(this.callback_) { this.callback_(runner); } - }, - - reportFailures_: function() { - if (this.failures_.length === 0) { - return; - } - - var indent = ' ', failure; - this.printLine_('\n'); - - this.print_('Failures:'); - - for (var i = 0; i < this.failures_.length; i++) { - failure = this.failures_[i]; - this.printLine_('\n'); - this.printLine_(' ' + (i + 1) + ') ' + failure.spec); - this.printLine_(' Message:'); - this.printLine_(' ' + this.stringWithColor_(failure.message, this.color_.fail())); - if (this.includeStackTrace_) { - this.printLine_(' Stacktrace:'); - this.print_(' ' + failure.stackTrace); - } - } - }, - - reportSuiteResults: function(suite) { - // Not used in this context - }, - - reportSpecResults: function(spec) { - var result = spec.results(); - var msg = ''; - if (result.passed()) { - msg = this.stringWithColor_('.', this.color_.pass()); - // } else if (result.skipped) { TODO: Research why "result.skipped" returns false when "xit" is called on a spec? - // msg = (colors) ? (ansi.yellow + '*' + ansi.none) : '*'; - } else { - msg = this.stringWithColor_('F', this.color_.fail()); - this.addFailureToFailures_(spec); - } - this.spec_results += msg; - this.print_(msg); - }, - - addFailureToFailures_: function(spec) { - var result = spec.results(); - var failureItem = null; - - var items_length = result.items_.length; - for (var i = 0; i < items_length; i++) { - if (result.items_[i].passed_ === false) { - failureItem = result.items_[i]; - - var failure = { - spec: spec.suite.getFullName() + " " + spec.description, - message: failureItem.message, - stackTrace: failureItem.trace.stack - } - - this.failures_.push(failure); - } - } - }, - - printRunnerResults_: function(runner){ - var results = runner.results(); - var specs = runner.specs(); - var msg = ''; - msg += specs.length + ' test' + ((specs.length === 1) ? '' : 's') + ', '; - msg += results.totalCount + ' assertion' + ((results.totalCount === 1) ? '' : 's') + ', '; - msg += results.failedCount + ' failure' + ((results.failedCount === 1) ? '' : 's') + '\n'; - return msg; - }, - - // Helper Methods // - stringWithColor_: function(stringValue, color) { - return (color || this.color_.neutral()) + stringValue + this.color_.neutral(); - }, - - printLine_: function(stringValue) { - this.print_(stringValue); - this.print_('\n'); - } - }; - - // *************************************************************** - // TerminalVerboseReporter uses the TerminalReporter's constructor - // *************************************************************** - jasmineNode.TerminalVerboseReporter = function(config) { - jasmineNode.TerminalReporter.call(this, config); - // The extra field in this object - this.indent_ = 0; - } - - - jasmineNode.TerminalVerboseReporter.prototype = { - reportSpecResults: function(spec) { - if (spec.results().failedCount > 0) { - this.addFailureToFailures_(spec); - } - - this.specResults_[spec.id] = { - messages: spec.results().getItems(), - result: spec.results().failedCount > 0 ? 'failed' : 'passed' - }; - }, - - reportRunnerResults: function(runner) { - var messages = new Array(); - this.buildMessagesFromResults_(messages, this.suites_); - - var messages_length = messages.length; - for (var i = 0; i < messages_length-1; i++) { - this.printLine_(messages[i]); - } - - this.print_(messages[messages_length-1]); - - // Call the parent object's method - jasmineNode.TerminalReporter.prototype.reportRunnerResults.call(this, runner); - }, - - buildMessagesFromResults_: function(messages, results, depth) { - var element, specResult, specIndentSpaces, msg = ''; - depth = (depth === undefined) ? 0 : depth; - - var results_length = results.length; - for (var i = 0; i < results_length; i++) { - element = results[i]; - - if (element.type === 'spec') { - specResult = this.specResults_[element.id.toString()]; - - if (specResult.result === 'passed') { - msg = this.stringWithColor_(this.indentMessage_(element.name, depth), this.color_.pass()); - } else { - msg = this.stringWithColor_(this.indentMessage_(element.name, depth), this.color_.fail()); - } - - messages.push(msg); - } else { - messages.push(''); - messages.push(this.indentMessage_(element.name, depth)); - } - - this.buildMessagesFromResults_(messages, element.children, depth + 2); - } - }, - - indentMessage_: function(message, indentCount) { - var _indent = ''; - for (var i = 0; i < indentCount; i++) { - _indent += ' '; - } - return (_indent + message); - } - }; - - // Inherit from TerminalReporter - jasmineNode.TerminalVerboseReporter.prototype.__proto__ = jasmineNode.TerminalReporter.prototype; - - // - // Exports - // - exports.jasmineNode = jasmineNode; -})(); diff --git a/plugins/tiddlywiki/jasmine/files/tiddlywiki.files b/plugins/tiddlywiki/jasmine/files/tiddlywiki.files index 7ad85c79d..23e03edd2 100644 --- a/plugins/tiddlywiki/jasmine/files/tiddlywiki.files +++ b/plugins/tiddlywiki/jasmine/files/tiddlywiki.files @@ -1,35 +1,58 @@ { - "tiddlers": [ + "directories": [ { - "file": "jasmine-html.js", + "path": "jasmine/lib", + "filesRegExp": "^.*\\.js$", "fields": { "type": "application/javascript", - "title": "$:/plugins/tiddlywiki/jasmine/jasmine-html.js", - "module-type": "library", - "global-module": "true" + "title": {"source": "filename", "prefix": "$:/plugins/tiddlywiki/jasmine/jasmine/"}, + "module-type": "library" } - },{ - "file": "jasmine.css", + }, + { + "path": "jasmine/lib/filters", + "filesRegExp": "^.*\\.js$", + "fields": { + "type": "application/javascript", + "title": {"source": "filename", "prefix": "$:/plugins/tiddlywiki/jasmine/jasmine/filters/"}, + "module-type": "library" + } + }, + { + "path": "jasmine/lib/reporters", + "filesRegExp": "^.*\\.js$", + "fields": { + "type": "application/javascript", + "title": {"source": "filename", "prefix": "$:/plugins/tiddlywiki/jasmine/jasmine/reporters/"}, + "module-type": "library" + } + }, + { + "path": "jasmine-core/lib", + "filesRegExp": "^.*\\.js$", + "fields": { + "type": "application/javascript", + "title": {"source": "filename", "prefix": "$:/plugins/tiddlywiki/jasmine/jasmine-core/"}, + "module-type": "library" + } + }, + { + "path": "jasmine-core/lib/jasmine-core", + "filesRegExp": "^.*\\.js$", + "fields": { + "type": "application/javascript", + "title": {"source": "filename", "prefix": "$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/"}, + "module-type": "library" + } + }, + { + "path": "jasmine-core/lib/jasmine-core", + "filesRegExp": "^.*\\.css$", "fields": { "type": "text/css", - "title": "$:/plugins/tiddlywiki/jasmine/jasmine.css", + "title": {"source": "filename", "prefix": "$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/"}, "tags": "[[$:/tags/Stylesheet]]" } - },{ - "file": "jasmine.js", - "fields": { - "type": "application/javascript", - "title": "$:/plugins/tiddlywiki/jasmine/jasmine.js", - "module-type": "library" - }, - "prefix": "var window = undefined; /* Prepended to the main jasmine source file to force it into commonjs mode */\n" - },{ - "file": "reporter.js", - "fields": { - "type": "application/javascript", - "title": "$:/plugins/tiddlywiki/jasmine/reporter.js", - "module-type": "library" - } } ] } diff --git a/plugins/tiddlywiki/jasmine/jasmine-plugin.js b/plugins/tiddlywiki/jasmine/jasmine-plugin.js index 986db467e..2fb4a8ec5 100644 --- a/plugins/tiddlywiki/jasmine/jasmine-plugin.js +++ b/plugins/tiddlywiki/jasmine/jasmine-plugin.js @@ -18,69 +18,99 @@ var TEST_TIDDLER_FILTER = "[type[application/javascript]tag[$:/tags/test-spec]]" Startup function for running tests */ exports.startup = function() { - // Get the Jasmine exports - var jasmine = $tw.modules.execute("$:/plugins/tiddlywiki/jasmine/jasmine.js"); - // Add our other context variables - var context = $tw.utils.extend({},jasmine,{ - console: console, - setInterval: setInterval, - clearInterval: clearInterval, - setTimeout: setTimeout, - clearTimeout: clearTimeout, - exports: {}, - $tw: $tw - }); - // Prepare the Jasmine environment - var jasmineEnv = jasmine.jasmine.getEnv(); - jasmineEnv.updateInterval = 1000; - // Execute the appropriate reporter - var reporterTitle = $tw.browser ? "$:/plugins/tiddlywiki/jasmine/jasmine-html.js" : "$:/plugins/tiddlywiki/jasmine/reporter.js"; - context.require = function(moduleTitle) { - return $tw.modules.execute(moduleTitle,reporterTitle); + // Set up a shared context object. + var context = { + console: console, + setInterval: setInterval, + clearInterval: clearInterval, + setTimeout: setTimeout, + clearTimeout: clearTimeout, + $tw: $tw }; - var code = $tw.wiki.getTiddlerText(reporterTitle,""), - reporterExports = $tw.utils.evalSandboxed(code,context,reporterTitle); - // Link the reporter into jasmine - if($tw.browser) { - var htmlReporter = new jasmine.jasmine.HtmlReporter(); - jasmineEnv.addReporter(htmlReporter); - jasmineEnv.specFilter = function(spec) { - return htmlReporter.specFilter(spec); - }; - } else { - // The HTMLReporter links itself into the jasmine object automatically, but we have to manually add the node reporter - jasmine.jasmine.TerminalVerboseReporter = reporterExports.jasmineNode.TerminalVerboseReporter; - jasmine.jasmine.TerminalReporter = reporterExports.jasmineNode.TerminalReporter; - jasmineEnv.addReporter(new jasmine.jasmine.TerminalVerboseReporter({ - print: require("util").print, - color: true, - includeStackTrace: true - })); - } - // Add a reporter that exits with an error code if any tests failed - jasmineEnv.addReporter({ - reportRunnerResults: function(runner) { - var c = runner.results().failedCount; - if(c > 0) { - console.log("Exitting with test failure count: ",c); - process.exit(1); - } - } - }); - // Iterate through all the test modules - var tests = $tw.wiki.filterTiddlers(TEST_TIDDLER_FILTER); - $tw.utils.each(tests,function(title,index) { - // Get the test specification code + // The `global` property is needed in two places: + // 1. jasmine-core/node_boot.js: extends the global object with jasmine interface. + // 2. jasmine-core/jasmine.js: when it's loaded, if it determines that it's + // running in a commonjs environment and `global` is undefined, it will set + // `jasmineGlobal`, its internal reference to the global object, to {}, + // which is not what we want. Alternatively, the `jasmine.getEnv()` API allows + // you to pass in a `global` object, but the boot scripts we use don't allow + // the caller to customize the `.getEnv()` call. We'd rather use the boot scripts + // as-is than duplicating them in order to do minor tweaks. + // + // We need this `$tw.browser ?` conditional because: + // 1. In a browser environment, 'jasmine-core/jasmine.js' calls `setTimeout` like + // `setTimeout.apply(jasmineGlobal, ...)`; the browser throws an "illegal invocation" + // unless `jasmineGlobal` is the right context object, which is `window`. + // 2. In Node.js, there is no `window` object. + // Further more, we don't have access to the `global` object when this code + // is executed, so we use the `context` object instead. + context.global = $tw.browser ? window : context; + + function evalInContext(title) { var code = $tw.wiki.getTiddlerText(title,""); - // Add a require handler + var _exports = {}; + context.exports = _exports; + context.module = {exports: _exports}; context.require = function(moduleTitle) { + // mock out the 'glob' module required in + // "$:/plugins/tiddlywiki/jasmine/jasmine/jasmine.js" + if (moduleTitle === "glob") { + return {}; + } return $tw.modules.execute(moduleTitle,title); }; - // Execute the test code with the context variables - $tw.utils.evalSandboxed(code,context,title); + var contextExports = $tw.utils.evalSandboxed(code,context,title); + // jasmine/jasmine.js assigns directly to `module.exports`: check + // for it first. + return context.module.exports || contextExports; + } + + // Get the core Jasmine exports + var jasmineCore = evalInContext("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/jasmine.js"); + // Get the Jasmine instance and configure reporters + var jasmine; + if($tw.browser) { + window.jasmineRequire = jasmineCore; + $tw.modules.execute("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/jasmine-html.js"); + $tw.modules.execute("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/boot.js"); + jasmine = window.jasmine; + } else { + // We load 'jasmine-core/jasmine.js' above instead of the + // main script 'jasmine-core/jasmine-core.js', which is what's loaded + // when you run `require('jasmine-core')` in a Node.js environment. + // We load 'jasmine-core/jasmine.js' because we want to factor out + // code paths that are common between browser and Node.js environments. + // As a result, the `jasmineCore` object is missing some properties that + // 'jasmine/jasmine.js' expects, so we manually populate what we need. + + // 'jasmine/jasmine.js' calls `.boot()` + jasmineCore.boot = evalInContext("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/node_boot.js"); + // 'jasmine/jasmine.js' references `.files.path` + jasmineCore.files = { + path: "$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core" + }; + // 'jasmine/jasmine.js' references `process.exit` + context.process = process; + + var JasmineNode = evalInContext("$:/plugins/tiddlywiki/jasmine/jasmine/jasmine.js"); + var jasmineRunner = new JasmineNode({jasmineCore: jasmineCore}); + jasmineRunner.configureDefaultReporter({}); + jasmine = jasmineRunner.jasmine; + } + // Add Jasmine's DSL to our context + var env = jasmine.getEnv(); + var jasmineInterface = jasmineCore.interface(jasmine,env) + context = $tw.utils.extend({},jasmineInterface,context); + // Iterate through all the test modules + var tests = $tw.wiki.filterTiddlers(TEST_TIDDLER_FILTER); + $tw.utils.each(tests,function(title) { + evalInContext(title); }); - // Execute the tests - jasmineEnv.execute(); + // In a browser environment, jasmine-core/boot.js calls `execute()` for us. + // In Node.js, we call it manually. + if(!$tw.browser) { + env.execute(); + } }; })(); diff --git a/plugins/tiddlywiki/jasmine/readme.tid b/plugins/tiddlywiki/jasmine/readme.tid index 9956b3410..3411d3cb0 100644 --- a/plugins/tiddlywiki/jasmine/readme.tid +++ b/plugins/tiddlywiki/jasmine/readme.tid @@ -1,5 +1,5 @@ title: $:/plugins/tiddlywiki/jasmine/readme -This plugin provides a framework for running tests in the browser and under Node.js. It is based on [[Jasmine|http://pivotal.github.io/jasmine/]] test framework. +This plugin provides a framework for running tests in the browser and under Node.js. It is based on [[Jasmine|https://jasmine.github.io/]] test framework. [[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/jasmine]] diff --git a/plugins/tiddlywiki/jasmine/update-packages.sh b/plugins/tiddlywiki/jasmine/update-packages.sh new file mode 100755 index 000000000..6c738f0ab --- /dev/null +++ b/plugins/tiddlywiki/jasmine/update-packages.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Download jasmine packages from npm and unpack relevant files +# into files/. + +set -exuo pipefail + +JASMINE_VERSION=3.4.0 +JASMINE_CORE_VERSION=3.4.0 + +rm -rf files/jasmine +mkdir -p files/jasmine +if [ ! -f "jasmine-$JASMINE_VERSION.tgz" ]; then + npm pack jasmine@$JASMINE_VERSION +fi +tar xfzv jasmine-$JASMINE_VERSION.tgz \ + -C files/jasmine \ + --strip-components=1 \ + --wildcards "*/lib/*.js" "*/*.LICENSE" \ + --exclude "example" + +rm -rf files/jasmine-core +mkdir -p files/jasmine-core +if [ ! -f "jasmine-core-$JASMINE_CORE_VERSION.tgz" ]; then + npm pack jasmine-core@$JASMINE_CORE_VERSION +fi +tar xfzv jasmine-core-$JASMINE_CORE_VERSION.tgz \ + -C files/jasmine-core \ + --strip-components=1 \ + --wildcards "*/lib/*.js" "*/lib/*.css" "*/*.LICENSE" \ + --exclude "example" From afb7435a8872270058c26b148a826e6bfca4ce8b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 14 Nov 2019 09:23:17 +0000 Subject: [PATCH 0410/2376] Remove "hack-to-give-us-something-to-compare-against" It looked messy in the control panel listing. --- core/language/en-GB/Fields.multids | 1 - editions/de-AT/tiddlers/system/static.content.tid | 4 ++-- editions/dev/tiddlers/system/static.content.tid | 4 ++-- editions/ko-KR/tiddlers/system/static.content.tid | 4 ++-- editions/tw5.com/tiddlers/system/static.content.tid | 4 ++-- languages/ca-ES/Fields.multids | 1 - languages/cs-CZ/Fields.multids | 1 - languages/da-DK/Fields.multids | 1 - languages/de-DE/Fields.multids | 1 - languages/el-GR/Fields.multids | 1 - languages/es-ES/Fields.multids | 1 - languages/fr-FR/Fields.multids | 1 - languages/he-IL/Fields.multids | 1 - languages/hi-IN/Fields.multids | 1 - languages/ia-IA/Fields.multids | 1 - languages/it-IT/Fields.multids | 1 - languages/ja-JP/Fields.multids | 1 - languages/ko-KR/Fields.multids | 1 - languages/nl-NL/Fields.multids | 1 - languages/pa-IN/Fields.multids | 1 - languages/pt-BR/Fields.multids | 1 - languages/pt-PT/Fields.multids | 1 - languages/ru-RU/Docs/Fields.multids | 1 - languages/sk-SK/Fields.multids | 1 - languages/sl-SI/Fields.multids | 1 - languages/sv-SE/Fields.multids | 1 - languages/zh-Hans/Fields.multids | 1 - languages/zh-Hant/Fields.multids | 1 - 28 files changed, 8 insertions(+), 32 deletions(-) diff --git a/core/language/en-GB/Fields.multids b/core/language/en-GB/Fields.multids index f39ea69d7..6b4823c02 100644 --- a/core/language/en-GB/Fields.multids +++ b/core/language/en-GB/Fields.multids @@ -13,7 +13,6 @@ 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.title: For draft tiddlers, contains the proposed new title of the tiddler footer: The footer text for a wizard -hack-to-give-us-something-to-compare-against: A temporary storage field used in [[$:/core/templates/static.content]] 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 library: Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes'' diff --git a/editions/de-AT/tiddlers/system/static.content.tid b/editions/de-AT/tiddlers/system/static.content.tid index 9dcc4ef52..c688de416 100644 --- a/editions/de-AT/tiddlers/system/static.content.tid +++ b/editions/de-AT/tiddlers/system/static.content.tid @@ -1,11 +1,11 @@ title: $:/core/templates/static.content type: text/vnd.tiddlywiki -hack-to-give-us-something-to-compare-against: yes \define tv-wikilink-template() https://tiddlywiki.com/static/$uri_doubleencoded$.html <!-- For Google, and people without JavaScript--> -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<<savingEmpty>>> + +<$reveal default="yes" text=<<savingEmpty>> type="nomatch"> Es scheint, dass bei diesem Browser JavaScript deaktiviert wurde. Sie können die statische HTML Version verwenden: diff --git a/editions/dev/tiddlers/system/static.content.tid b/editions/dev/tiddlers/system/static.content.tid index fff4fca0e..2c7979867 100644 --- a/editions/dev/tiddlers/system/static.content.tid +++ b/editions/dev/tiddlers/system/static.content.tid @@ -1,11 +1,11 @@ title: $:/core/templates/static.content type: text/vnd.tiddlywiki -hack-to-give-us-something-to-compare-against: yes \define tv-wikilink-template() https://tiddlywiki.com/dev/static/$uri_doubleencoded$.html <!-- For Google, and people without JavaScript--> -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<<savingEmpty>>> + +<$reveal default="yes" text=<<savingEmpty>> type="nomatch"> It looks like this browser doesn't run JavaScript. You can use one of these static HTML versions to browse the same content: diff --git a/editions/ko-KR/tiddlers/system/static.content.tid b/editions/ko-KR/tiddlers/system/static.content.tid index 31de0c79b..45c28b49f 100644 --- a/editions/ko-KR/tiddlers/system/static.content.tid +++ b/editions/ko-KR/tiddlers/system/static.content.tid @@ -1,11 +1,11 @@ title: $:/core/templates/static.content type: text/vnd.tiddlywiki -hack-to-give-us-something-to-compare-against: yes \define tv-wikilink-template() https://tiddlywiki.com/languages/ko-KR/static/$uri_doubleencoded$.html <!-- For Google, and people without JavaScript--> -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<<savingEmpty>>> + +<$reveal default="yes" text=<<savingEmpty>> type="nomatch"> 이 브라우저는 자바스크립트를 실행하지 않은 것으로 보입니다. 같은 내용을 찾아보려면 정적 HTML 버전 중 하나를 사용할 수 있습니다: diff --git a/editions/tw5.com/tiddlers/system/static.content.tid b/editions/tw5.com/tiddlers/system/static.content.tid index f815deeb7..50889f0a3 100644 --- a/editions/tw5.com/tiddlers/system/static.content.tid +++ b/editions/tw5.com/tiddlers/system/static.content.tid @@ -1,10 +1,10 @@ title: $:/core/templates/static.content -hack-to-give-us-something-to-compare-against: yes \define tv-wikilink-template() https://tiddlywiki.com/static/$uri_doubleencoded$.html <!-- For Google, and people without JavaScript--> -<$reveal state="!!hack-to-give-us-something-to-compare-against" type="nomatch" text=<<savingEmpty>>> + +<$reveal default="yes" text=<<savingEmpty>> type="nomatch"> It looks like this browser doesn't run JavaScript. You can use one of these static HTML versions to browse the same content: diff --git a/languages/ca-ES/Fields.multids b/languages/ca-ES/Fields.multids index 5577d0c8a..e27319d73 100644 --- a/languages/ca-ES/Fields.multids +++ b/languages/ca-ES/Fields.multids @@ -13,7 +13,6 @@ description: El text que descriu un connector, o un diàleg modal draft.of: Per als tiddlers esborranys, conté el títol del tiddler del qual és un esborrany draft.title: Per als tiddlers esborranys, conté el títol proposat per al tiddler footer: El text del peu d'un assistent -hack-to-give-us-something-to-compare-against: Un camp on desar temporalment utilitzat a [[$:/core/templates/static.content]] hide-body: El valor de la plantilla de vista amaga el cos dels tiddlers és: ''sí'' icon: El títol del tiddler que conté la icona associada amb el tiddler library: Si està a "si" indica que un tiddler s'ha de sar com una biblioteca de JavaScript diff --git a/languages/cs-CZ/Fields.multids b/languages/cs-CZ/Fields.multids index 55a74ae58..5c5e9cd92 100644 --- a/languages/cs-CZ/Fields.multids +++ b/languages/cs-CZ/Fields.multids @@ -13,7 +13,6 @@ description: Popis pluginu nebo dialogu draft.of: Pro rozepsané tiddlery, obsahuje titulek s popisem, že se jedná o rozepsané tiddlery draft.title: Pro rozepsané tiddlery, obsahuje návrhy názvů pro nový tiddler footer: Patička -hack-to-give-us-something-to-compare-against: Dočasné pole v [[$:/core/templates/static.content]] icon: Název tiddleru obsahujícím ikonu library: Je-li nastaveno na "ano", pak se tiddler bude ukládán jako JavaScriptový soubor list: Seřazený seznam názvu tiddleru diff --git a/languages/da-DK/Fields.multids b/languages/da-DK/Fields.multids index 394735953..4406b26df 100644 --- a/languages/da-DK/Fields.multids +++ b/languages/da-DK/Fields.multids @@ -13,7 +13,6 @@ description: Den beskrivende tekst for en udvidelse, eller en modal dialog draft.of: For kladdetiddlere, indeholder titlen på den tiddler som denne er en kladde til draft.title: For kladdetiddlere, indeholder forslag til ny titel på tiddleren footer: fodnotetekst i en guide -hack-to-give-us-something-to-compare-against: Et midlertidigt lagerfelt brugt i [[$:/core/templates/static.content]] icon: Titlen på den tiddler som indeholder et ikon, der er knyttet til en tiddler library: Hvis sat til "ja" indikeres at en tiddler bør gemmes som et JavaScript library list: En ordnet liste af tiddlertitler som er knyttet til en tiddler diff --git a/languages/de-DE/Fields.multids b/languages/de-DE/Fields.multids index 7ba2e94ec..38b32d4c2 100755 --- a/languages/de-DE/Fields.multids +++ b/languages/de-DE/Fields.multids @@ -13,7 +13,6 @@ description: Die Beschreibung für ein "plugin" oder einen "modalen" Dialog. draft.of: Entwurf von - enthält den Titel des Tiddlers, zu dem dieser Entwurf-Tiddler gehört. draft.title: Entwurf Titel - enthält den neuen Titel, wenn der Entwurf-Tiddler gespeichert wird. footer: Der Fußnoten Text bei einem "~Wizard-Dialog" -hack-to-give-us-something-to-compare-against: Ein temporäres Feld, verwendet in [[$:/core/templates/static.content]] hide-body: Der Textbereich eines Tiddlers wird verborgen, wenn dieses Feld auf ''"yes"'' gesetzt wird icon: Der Titel eines ~Icon-Tiddlers, der mit diesem Tiddler verbunden ist. library: Wenn dieses Feld="yes" ist, dann soll der Tiddler als JavaScript Bibliothek gespeichert werden. diff --git a/languages/el-GR/Fields.multids b/languages/el-GR/Fields.multids index 6629dda86..6c9861166 100644 --- a/languages/el-GR/Fields.multids +++ b/languages/el-GR/Fields.multids @@ -13,7 +13,6 @@ description: Το κείμενο που περιγράφει ένα πρόσθε draft.of: Για πρόχειρα tiddlers, περιέχει τον τίτλο από το tiddler για το οποίο αυτό είναι μια πρόχειρη έκδοση draft.title: Για πρόχειρα tiddlers, περιέχει τον προτεινόμενο νέο τίτλο από το tiddler footer: Το κείμενο του υποσέλιδου για έναν οδηγό -hack-to-give-us-something-to-compare-against: Ένα προσωρινό πεδίο που χρησιμοποιείται στο [[$:/core/templates/static.content]] icon: Ο τίτλος του tiddler που περιέχει το εικονίδιο που σχετίζεται με ένα tiddler library: Αν οριστεί σε "yes" υποδεικνύει πως το tiddler θα πρέπει να αποθηκευτεί ως μια βιβλιοθήκη της JavaScript list: Μια διατεταγμένη λίστα από τίτλους tiddler που σχετίζεται με ένα tiddler diff --git a/languages/es-ES/Fields.multids b/languages/es-ES/Fields.multids index 5b405ea22..6e8992542 100644 --- a/languages/es-ES/Fields.multids +++ b/languages/es-ES/Fields.multids @@ -13,7 +13,6 @@ description: Descripción de un complemento, extensión, o diálogo modal draft.of: Título del tiddler del que el actual es borrador draft.title: Nuevo título propuesto para el presente borrador footer: Texto al pie que figurará en un asistente -hack-to-give-us-something-to-compare-against: Campo de almacenamiento temporal usado en [[$:/core/templates/static.content]] icon: Nombre del tiddler que contiene el icono que se quiere asociar al presente tiddler library: Si su valor es "Sí", indica que el tiddler debe guardarse como librería de JavaScript list: Lista ordenada de tiddlers asociados al presente tiddler diff --git a/languages/fr-FR/Fields.multids b/languages/fr-FR/Fields.multids index b326141ea..1c58305d8 100644 --- a/languages/fr-FR/Fields.multids +++ b/languages/fr-FR/Fields.multids @@ -13,7 +13,6 @@ description: Texte de description d'un plugin, ou d'une boîte de dialogue draft.of: Pour les tiddlers en cours d'édition, contient le titre du tiddler initial draft.title: Pour les tiddlers en cours d'édition, contient le nouveau titre prévu pour le tiddler footer: Texte de bas de page dans le cas d'un wizard -hack-to-give-us-something-to-compare-against: Champ de stockage temporaire utilisé dans [[$:/core/templates/static.content]] icon: Titre du tiddler contenant l'icone associée à un tiddler library: Avec une valeur à <q>yes</q>, indique qu'un tiddler doit être sauvegardé comme bibliothèque JavaScript list: Liste ordonnée de titres de tiddlers associée à un tiddler diff --git a/languages/he-IL/Fields.multids b/languages/he-IL/Fields.multids index ddc1418d0..89a13c8f2 100644 --- a/languages/he-IL/Fields.multids +++ b/languages/he-IL/Fields.multids @@ -13,7 +13,6 @@ description: התיאור של פלאגין או דיאלוג מודאלי draft.of: עבור טידלרי טיוטה, מכיל את כותרת הטידלר שעבורו הוא טיוטה draft.title: עבור טידלרי טיוטה, מכיל את הכותרת החדשה לטידלר המוצע footer: כותרת תחתונה לוויזארד -hack-to-give-us-something-to-compare-against: שדה אחסון זמני המשמש ב [[$:/core/templates/static.content]] icon: שם הטידלר המכיל את הצלמית המקושרת לטידלר library: אם "yes" מציין שהטידלר צריך להישמר כספריית ג'אווהסקריפט list: רשימה סדורה של שמות טידלרים המקושרים לטידלר diff --git a/languages/hi-IN/Fields.multids b/languages/hi-IN/Fields.multids index 5bb4a81fd..7145b18b1 100644 --- a/languages/hi-IN/Fields.multids +++ b/languages/hi-IN/Fields.multids @@ -15,7 +15,6 @@ description: एक प्लगइन के लिए वर्णनात् draft.of: tiddler के शीर्षक में शामिल,जिसमें से यह एक ड्राफ्ट है,ड्राफ्ट tiddlers के लिए draft.title: ड्राफ्ट tiddlers के लिए, tiddler के प्रस्तावित नए शीर्षक में शामिल footer: एक विज़ार्ड के के लिए footer टेक्स्ट -hack-to-give-us-something-to-compare-against: एक अस्थायी भंडारण क्षेत्र में इस्तेमाल [[$: / कोर / टेम्पलेट्स / static.content]] icon: एक tiddler के साथ जुड़े चिह्न युक्त tiddler का खिताब library: अगर"हाँ" सेट किया है, तो यह संकेत करता है की एक tiddler किसी JavaScript लाइब्रेरी के रूप सेव की जानी चाहिए list: एक tiddler के साथ जुड़े tiddler खिताब के एक आदेश सूची diff --git a/languages/ia-IA/Fields.multids b/languages/ia-IA/Fields.multids index 4ad7d16b9..39d8f3d01 100644 --- a/languages/ia-IA/Fields.multids +++ b/languages/ia-IA/Fields.multids @@ -13,7 +13,6 @@ description: Le texto descriptive de un extension o un dialogo modal draft.of: Pro notas de schizzo, contine le titulo del nota del qual isto es un schizzo draft.title: Pro notas de schizzo, contine le proponite nove titulo del nota footer: Le texto de pede de un guida -hack-to-give-us-something-to-compare-against: Un quadro pro salvar temporarimente usate in [[$:/core/templates/static.content]] icon: Le titulo del nota con le icone associate con un nota library: Quando fixate a "si" illo indica que un nota debe esser salvate como un bibliotheca de JavaScript list: Un lista arrangiate de titulos de notas associate con un nota diff --git a/languages/it-IT/Fields.multids b/languages/it-IT/Fields.multids index 44c2f5942..cc1e28a5f 100644 --- a/languages/it-IT/Fields.multids +++ b/languages/it-IT/Fields.multids @@ -13,7 +13,6 @@ description: Il testo descrittivo per un plugin o per una modalità a dial draft.of: Per i frammenti bozza, contiene il titolo del frammento di cui questo è una bozza draft.title: Per i frammenti bozza, contiene la proposta di nuovo titolo per il frammento footer: Il testo del footer per un wizard -hack-to-give-us-something-to-compare-against: Un campo di memoria temporanea utilizzato in [[$:/core/templates/static.content]] icon: Il titolo del frammento che contiene l'icona associata con il frammento library: Se impostato su "yes" indica che il frammento deve essere salvato come una libreria ~JavaScript list: Una lista ordinata di titoli di frammenti associati con un frammento diff --git a/languages/ja-JP/Fields.multids b/languages/ja-JP/Fields.multids index 5e8cac805..46c81ff49 100644 --- a/languages/ja-JP/Fields.multids +++ b/languages/ja-JP/Fields.multids @@ -13,7 +13,6 @@ description: プラグインなどの説明文 draft.of: それがドラフト tiddler であるときのタイトル draft.title: ドラフト tiddler が正式版になったときに使用される予定のタイトル footer: ウィザードのフッタ部テキスト -hack-to-give-us-something-to-compare-against: [[$:/core/templates/static.content]] で使用される一時保管用フィールド icon: 紐付けられているアイコン tiddler のタイトル library: "yes" となっている場合、その tiddler は JavaScript ライブラリとして保存されなければならない list: そのtiddlerに紐付くtiddler名の順序付きリスト diff --git a/languages/ko-KR/Fields.multids b/languages/ko-KR/Fields.multids index d5e7ab880..cfc92510b 100644 --- a/languages/ko-KR/Fields.multids +++ b/languages/ko-KR/Fields.multids @@ -13,7 +13,6 @@ description: 플러그인에 대한 설명문, 또는 모달 대화 상자 draft.of: 초안 티들러에 대해, 초안인 티들러의 제목을 포함 draft.title: 초안 티들러에 대해, 티들러의 제안된 새 제목을 포함 footer: 마법사를 위한 바닥글 텍스트 -hack-to-give-us-something-to-compare-against: [[$:/core/templates/static.content]]에 사용되는 임시 저장 필드 icon: 티들러와 연관된 아이콘을 포함하는 티들러의 제목 library: "yes"로 설정하면 티들러가 자바스크립트 라이브러리로 저장해야하는지 나타냄 list: 티들러와 연관된 티들러 제목의 정렬된 목록 diff --git a/languages/nl-NL/Fields.multids b/languages/nl-NL/Fields.multids index 16b2f41d1..cd5649974 100644 --- a/languages/nl-NL/Fields.multids +++ b/languages/nl-NL/Fields.multids @@ -13,7 +13,6 @@ description: De beschrijvende tekst voor een plugin of een modale dialoog draft.of: Voor concepttiddlers; bevat de titel van de te maken tiddler draft.title: Voor concepttiddlers; bevat de voorgestelde titel van de tiddler footer: De voettekst van een 'wizard' -hack-to-give-us-something-to-compare-against: Een tijdelijk opslagveld dat in [[$:/core/templates/static.content]] gebruikt wordt hide-body: Als 'yes' ingevuld is, wordt de tekst van de tiddler niet weergegeven icon: De titel van de pictogramtiddler die met deze tiddler gekoppeld is library: Als 'yes' ingevuld is, dient de tiddler als JavaScript-bibliotheek opgeslagen te worden diff --git a/languages/pa-IN/Fields.multids b/languages/pa-IN/Fields.multids index 4df5e990c..0c687edb3 100644 --- a/languages/pa-IN/Fields.multids +++ b/languages/pa-IN/Fields.multids @@ -13,7 +13,6 @@ description: ਇੱਕ ਪਲੱਗਇਨ ਲਈ ਟੈਕਸਟ ਜਾਣਕ draft.of: ਡਰਾਫਟ tiddlers ਲਈ, tiddler ਦਾ ਸਿਰਲੇਖ ਸ਼ਾਮਿਲ ਹੈ ਜੋ ਕਿ ਇੱਕ ਡਰਾਫਟ ਹੈ draft.title: ਡਰਾਫਟ tiddlers ਲਈ, tiddler ਦੇ ਪ੍ਰਸਤਾਵਿਤ ਸਿਰਲੇਖ ਸ਼ਾਮਿਲ ਹੈ footer: ਪਦਲੇਖ ਪਾਠ ਲਈ ਇੱਕ ਸਹਾਇਕ -hack-to-give-us-something-to-compare-against: ਆਰਜੀ ਸਟੋਰੇਜ਼ ਖੇਤਰ ਵਿੱਚ ਵਰਤੇ ਗਏ [[$: / core / ਖਾਕੇ / static.content]] icon: ਨੂੰ ਇੱਕ tiddler ਨਾਲ ਸਬੰਧਤ ਆਈਕਾਨ ਰੱਖਣ ਵਾਲੀ tiddler ਦਾ ਸਿਰਲੇਖ library: ਜੇਕਰ "yes" ਇੱਕ tiddler ਨੂੰ ਇੱਕ ਜਾਵਾਸਕ੍ਰਿਪਟ ਲਾਇਬ੍ਰੇਰੀ ਦੇ ਤੌਰ ਤੇ ਸੰਭਾਲਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ, ਜੋ ਕਿ ਦਰਸਾਉਦਾ ਹੈ list: ਇੱਕ tiddler ਨਾਲ ਸਬੰਧਤ tiddler ਦੇ ਟਾਇਟਲ ਦੀ ਇੱਕ ਸੂਚੀ, ਦਾ ਹੁਕਮ diff --git a/languages/pt-BR/Fields.multids b/languages/pt-BR/Fields.multids index 40858179d..19603666d 100644 --- a/languages/pt-BR/Fields.multids +++ b/languages/pt-BR/Fields.multids @@ -13,7 +13,6 @@ description: O texto descritivo de uma extensão, ou diálogo modal draft.of: Para tiddlers rascunho, contém o título do tiddler do qual este é rascunho draft.title: Para tiddlers rascunho, contém o título proposto para o novo tiddler footer: O texto de rodapé para um assistente -hack-to-give-us-something-to-compare-against: Um campo temporário utilizado em [[$:/core/templates/static.content]] icon: O título do tiddler que contém o ícone associado com determinado tiddler library: Se definido como "yes" indica que o tiddler deve ser gravado como uma biblioteca JavaScript list: Uma lista ordenada de títulos de tiddlers associados com um determinado tiddler diff --git a/languages/pt-PT/Fields.multids b/languages/pt-PT/Fields.multids index 17a8e9a48..e07bf64f7 100644 --- a/languages/pt-PT/Fields.multids +++ b/languages/pt-PT/Fields.multids @@ -13,7 +13,6 @@ description: O texto descritivo de uma extensão, ou diálogo modal draft.of: Para tiddlers rascunho, contém o título do tiddler do qual este é rascunho draft.title: Para tiddlers rascunho, contém o título proposto para o novo tiddler footer: O texto de rodapé para um assistente -hack-to-give-us-something-to-compare-against: Um campo temporário utilizado em [[$:/core/templates/static.content]] icon: O título do tiddler que contém o ícone associado com determinado tiddler library: Se definido como "yes" indica que o tiddler deve ser gravado como uma biblioteca JavaScript list: Uma lista ordenada de títulos de tiddlers associados com um determinado tiddler diff --git a/languages/ru-RU/Docs/Fields.multids b/languages/ru-RU/Docs/Fields.multids index f1c70a211..0f171fd0f 100644 --- a/languages/ru-RU/Docs/Fields.multids +++ b/languages/ru-RU/Docs/Fields.multids @@ -13,7 +13,6 @@ description: Описание плагина или модального окн draft.of: Для черновиков, содержит название редактируемой заметки draft.title: Для черновиков, содержит новое название заметки footer: Текст "подвала" мастера -hack-to-give-us-something-to-compare-against: Временное поле используемое в [[$:/core/templates/static.content]] icon: Название заметки, содержащей значок заметки library: Если "yes", то заметка сохраняется как библиотека JavaScript list: Упорядоченный список названий связанных заметок diff --git a/languages/sk-SK/Fields.multids b/languages/sk-SK/Fields.multids index ce2847481..4bed42b6e 100644 --- a/languages/sk-SK/Fields.multids +++ b/languages/sk-SK/Fields.multids @@ -13,7 +13,6 @@ description: Popisný text pre plugin, alebo modálny dialóg draft.of: Pre pracovné tiddlery, obsahuje názov tiddlera, pre ktorý je to pracovný tiddler draft.title: Pre pracovné tiddlery, obsahuje navrhovaný nový názov pre tiddler footer: Text pre pätu stránky do wizardu -hack-to-give-us-something-to-compare-against: Dočasné úložné pole používané v [[$:/core/templates/static.content]] icon: Názov tiddlera obsahujúceho icomu priradenú tiddlera library: Ak nastavené ako "yes" signalizuje, že tiddler by sa mal uložiť ako JavaScript knižnica list: Zotriedený zoznam názvov tiddlerov priradených tiddlera diff --git a/languages/sl-SI/Fields.multids b/languages/sl-SI/Fields.multids index 7ab36cc37..83aabd6ab 100644 --- a/languages/sl-SI/Fields.multids +++ b/languages/sl-SI/Fields.multids @@ -13,7 +13,6 @@ description: Opisno besedilo za vtičnik ali modalni dialog draft.of: Osnutek od - vsebuje naslov tiddlerja, h kateremu spada ta osnutek draft.title: Za osnutek tiddlerja vsebuje predlagani novi naslov tiddlerja footer: Besedilo noge za čarovnika -hack-to-give-us-something-to-compare-against: Polje za začasno shranjevanje, uporabljeno v [[$:/core/templates/static.content]] icon: Naslov tiddlerja, ki vsebuje ikono, povezano s tem tiddlerjem library: Če je nastavljeno na "da", bo tiddler shranjen kot knjižnica JavaScript list: Urejen seznam naslovov tiddlerjev, povezanih s tem tiddlerjem diff --git a/languages/sv-SE/Fields.multids b/languages/sv-SE/Fields.multids index d9527327c..dfb17398b 100755 --- a/languages/sv-SE/Fields.multids +++ b/languages/sv-SE/Fields.multids @@ -13,7 +13,6 @@ description: Den beskrivande texten för ett insticksprogram, eller en modal-dia draft.of: För utkast-tiddlers, innehåller rubriken av tiddlern som det är ett utkast för draft.title: For draft tiddlers, contains the proposed new title of the tiddler footer: Sidfotens text för en guide -hack-to-give-us-something-to-compare-against: Ett temporärt lagringsfält som används i [[$:/core/templates/static.content]] icon: Tiddlerns rubrik innehållande ikonen som är associerad med en tiddler library: Om satt till "Ja" innebär att tiddlern ska sparas som ett Javaskriptbibliotek list: En ordnad lista över tiddler-rubriker som är associerade med en tiddler diff --git a/languages/zh-Hans/Fields.multids b/languages/zh-Hans/Fields.multids index 7882d4bab..36ba015d0 100644 --- a/languages/zh-Hans/Fields.multids +++ b/languages/zh-Hans/Fields.multids @@ -13,7 +13,6 @@ description: 插件的说明、描述 draft.of: 草稿条目,包含条目的标题、标签、栏位 ... draft.title: 草稿条目的标题 footer: wizard 的注脚 -hack-to-give-us-something-to-compare-against: 于 [[$:/core/templates/static.content]] 使用的临时保存栏位 icon: 条目的标题含有与条目关联的图标 library: 若设为 "yes",表示条目应该被保存为一个 JavaScript 程序库 list: 条目的列表,指定一些条目的标题清单 diff --git a/languages/zh-Hant/Fields.multids b/languages/zh-Hant/Fields.multids index e0418983b..905e03248 100644 --- a/languages/zh-Hant/Fields.multids +++ b/languages/zh-Hant/Fields.multids @@ -13,7 +13,6 @@ description: 插件的說明、描述 draft.of: 草稿條目,包含條目的標題、標籤、欄位 ... draft.title: 草稿條目的標題 footer: wizard 的註腳 -hack-to-give-us-something-to-compare-against: 於 [[$:/core/templates/static.content]] 使用的臨時儲存欄位 icon: 條目的標題含有與條目關聯的圖示 library: 若設為 "yes",表示條目應該被儲存為一個 JavaScript 程式庫 list: 條目的列表,指定一些條目的標題清單 From e4eaae14faa1bf867c0f8168e221cf30ac6e2e0d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 14 Nov 2019 11:00:07 +0000 Subject: [PATCH 0411/2376] Ensure splash screen isn't shown when JS is disabled --- core/templates/static.area.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/templates/static.area.tid b/core/templates/static.area.tid index d235ab4ed..16c7150e6 100644 --- a/core/templates/static.area.tid +++ b/core/templates/static.area.tid @@ -7,3 +7,7 @@ title: $:/core/templates/static.area <$reveal type="match" state="$:/isEncrypted" text="yes"> This file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted. </$reveal> +<!-- ensure splash screen isn't shown when JS is disabled --> +`<style> +.tc-remove-when-wiki-loaded {display: none;} +</style>` From cd8ab13b55eec0550ed1812cc742392d5310d542 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 18 Nov 2019 13:22:10 +0000 Subject: [PATCH 0412/2376] Fix bug with millisecond 0XXX date format --- core/modules/utils/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 316797337..ac9f273e1 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -280,7 +280,7 @@ exports.formatDateString = function(date,template) { return $tw.utils.pad(date.getSeconds()); }], [/^0XXX/, function() { - return $tw.utils.pad(date.getMilliseconds()); + return $tw.utils.pad(date.getMilliseconds(),4); }], [/^0DD/, function() { return $tw.utils.pad(date.getDate()); From 8f3da69f818940eb5f517da850fb3766b72c7d7d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 18 Nov 2019 13:24:47 +0000 Subject: [PATCH 0413/2376] Correct fix for bug with millisecond 0XXX date format Milliseconds need 3 digits, not 4... --- core/modules/utils/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index ac9f273e1..2495be49f 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -280,7 +280,7 @@ exports.formatDateString = function(date,template) { return $tw.utils.pad(date.getSeconds()); }], [/^0XXX/, function() { - return $tw.utils.pad(date.getMilliseconds(),4); + return $tw.utils.pad(date.getMilliseconds(),3); }], [/^0DD/, function() { return $tw.utils.pad(date.getDate()); From 7b66df688ae745537929a25799ef4a72d4437fcd Mon Sep 17 00:00:00 2001 From: donmor <donmor3000@hotmail.com> Date: Wed, 20 Nov 2019 17:45:42 +0800 Subject: [PATCH 0414/2376] Refactor andtidwiki.js (The saver for Android apps including AndTidWiki, Tiddloid and Tiddloid Lite) (#4276) * Create tiddloid.js * Update andtidwiki.js * Delete tiddloid.js * Update andtidwiki.js * Update andtidwiki.js * Update andtidwiki.js * Update andtidwiki.js * Update andtidwiki.js * Update andtidwiki.js --- core/modules/savers/andtidwiki.js | 62 ++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/core/modules/savers/andtidwiki.js b/core/modules/savers/andtidwiki.js index 33e776977..df2b0ceaa 100644 --- a/core/modules/savers/andtidwiki.js +++ b/core/modules/savers/andtidwiki.js @@ -15,24 +15,50 @@ Handles saving changes via the AndTidWiki Android app var AndTidWiki = function(wiki) { }; -AndTidWiki.prototype.save = function(text,method,callback) { - // Get the pathname of this document - var pathname = decodeURIComponent(document.location.toString().split("#")[0]); - // Strip the file:// - if(pathname.indexOf("file://") === 0) { - pathname = pathname.substr(7); +AndTidWiki.prototype.save = function(text,method,callback,options) { + var filename = options && options.variables ? options.variables.filename : null; + if (method === "download") { + // Support download + if (window.twi.saveDownload) { + try { + window.twi.saveDownload(text,filename); + } catch(err) { + if (err.message === "Method not found") { + window.twi.saveDownload(text); + } + } + } else { + var link = document.createElement("a"); + link.setAttribute("href","data:text/plain," + encodeURIComponent(text)); + if (filename) { + link.setAttribute("download",filename); + } + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } else if (window.twi.saveWiki) { + // Direct save in Tiddloid + window.twi.saveWiki(text); + } else { + // Get the pathname of this document + var pathname = decodeURIComponent(document.location.toString().split("#")[0]); + // Strip the file:// + if(pathname.indexOf("file://") === 0) { + pathname = pathname.substr(7); + } + // Strip any query or location part + var p = pathname.indexOf("?"); + if(p !== -1) { + pathname = pathname.substr(0,p); + } + p = pathname.indexOf("#"); + if(p !== -1) { + pathname = pathname.substr(0,p); + } + // Save the file + window.twi.saveFile(pathname,text); } - // Strip any query or location part - var p = pathname.indexOf("?"); - if(p !== -1) { - pathname = pathname.substr(0,p); - } - p = pathname.indexOf("#"); - if(p !== -1) { - pathname = pathname.substr(0,p); - } - // Save the file - window.twi.saveFile(pathname,text); // Call the callback callback(null); return true; @@ -44,7 +70,7 @@ Information about this saver AndTidWiki.prototype.info = { name: "andtidwiki", priority: 1600, - capabilities: ["save", "autosave"] + capabilities: ["save", "autosave", "download"] }; /* From d2323cb1f47db14b50557f510f3c0a2766e9b6d7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 20 Nov 2019 09:51:00 +0000 Subject: [PATCH 0415/2376] Add Elixir to languages supported by Highlight plugin Fixes #4378 --- plugins/tiddlywiki/highlight/readme.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/tiddlywiki/highlight/readme.tid b/plugins/tiddlywiki/highlight/readme.tid index 0e642eda6..0b5c490d4 100644 --- a/plugins/tiddlywiki/highlight/readme.tid +++ b/plugins/tiddlywiki/highlight/readme.tid @@ -37,6 +37,7 @@ The plugin includes support for the following languages (referred to as "brushes * diff * dockerfile * erlang +* elixir * fortran * go * gradle From a65cfe98d55e357d3ea50a19f0fd0f571708ea8b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 20 Nov 2019 17:38:28 +0000 Subject: [PATCH 0416/2376] Slight optimisation of $tw.utils.addClass() --- core/modules/utils/dom/dom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/dom/dom.js b/core/modules/utils/dom/dom.js index b01ea3ac1..c90dc8009 100644 --- a/core/modules/utils/dom/dom.js +++ b/core/modules/utils/dom/dom.js @@ -36,8 +36,8 @@ exports.addClass = function(el,className) { var c = el.className.split(" "); if(c.indexOf(className) === -1) { c.push(className); + el.className = c.join(" "); } - el.className = c.join(" "); }; exports.removeClass = function(el,className) { From 54fc9327408a8e0bb355bbebe9e4679ef76eaf2c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 20 Nov 2019 17:38:59 +0000 Subject: [PATCH 0417/2376] Fix wiki referenced by navigator widget's rename tiddler handler --- core/modules/widgets/navigator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 4825e7a02..7a19ed9e0 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -612,7 +612,7 @@ NavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) { var paramObject = event.paramObject || {}, from = paramObject.from || event.tiddlerTitle, to = paramObject.to; - $tw.wiki.renameTiddler(from,to); + this.wiki.renameTiddler(from,to); }; exports.navigator = NavigatorWidget; From 174a36cda63127d19230bcfbe9a5fdde46e5b0ea Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 20 Nov 2019 18:01:06 +0000 Subject: [PATCH 0418/2376] Make the single window template compatible with the page template The tv-* variables were missing, making toolbar buttons appear incorrectly. There was also no tc-page-container class. Fixes #4372 --- core/templates/single.tiddler.window.tid | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/core/templates/single.tiddler.window.tid b/core/templates/single.tiddler.window.tid index a0a8b078e..a790878a7 100644 --- a/core/templates/single.tiddler.window.tid +++ b/core/templates/single.tiddler.window.tid @@ -1,16 +1,24 @@ title: $:/core/templates/single.tiddler.window -<$set name="themeTitle" value={{$:/view}}> +\whitespace trim +\define containerClasses() +tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ +\end +\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] -<$set name="tempCurrentTiddler" value=<<currentTiddler>>> +<$set name="tv-config-toolbar-icons" value={{$:/config/Toolbar/Icons}}> -<$set name="currentTiddler" value={{$:/language}}> +<$set name="tv-config-toolbar-text" value={{$:/config/Toolbar/Text}}> -<$set name="languageTitle" value={{!!name}}> +<$set name="tv-config-toolbar-class" value={{$:/config/Toolbar/ButtonClass}}> -<$set name="currentTiddler" value=<<tempCurrentTiddler>>> +<$set name="tv-show-missing-links" value={{$:/config/MissingLinks}}> -<$importvariables filter="[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]"> +<$set name="storyviewTitle" value={{$:/view}}> + +<$set name="languageTitle" value={{{ [{$:/language}get[name]] }}}> + +<div class=<<containerClasses>>> <$navigator story="$:/StoryList" history="$:/HistoryList"> @@ -18,7 +26,7 @@ title: $:/core/templates/single.tiddler.window </$navigator> -</$importvariables> +</div> </$set> @@ -30,3 +38,4 @@ title: $:/core/templates/single.tiddler.window </$set> +</$set> From 668ca00a8866066b10ef5f5b762641c67702ea31 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 22 Nov 2019 12:08:53 +0000 Subject: [PATCH 0419/2376] Avoid setting an explicit colour in the new-journal-button icon This change means that the colour for the date on the new journal button icon will change according to the current colour palette, and simplifies things for #4379 --- core/images/new-journal-button.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/images/new-journal-button.tid b/core/images/new-journal-button.tid index 86c3c589c..b5be9066f 100755 --- a/core/images/new-journal-button.tid +++ b/core/images/new-journal-button.tid @@ -7,7 +7,7 @@ tags: $:/tags/Image <g transform="translate(59.816987, 64.316987) rotate(30.000000) translate(-59.816987, -64.316987) translate(20.316987, 12.816987)"> <g transform="translate(0.000000, 0.000000)"> <path d="M9.99631148,0 C4.4755011,0 -2.27373675e-13,4.48070044 -2.27373675e-13,9.99759461 L-2.27373675e-13,91.6128884 C-2.27373675e-13,97.1344074 4.46966773,101.610483 9.99631148,101.610483 L68.9318917,101.610483 C74.4527021,101.610483 78.9282032,97.1297826 78.9282032,91.6128884 L78.9282032,9.99759461 C78.9282032,4.47607557 74.4585355,0 68.9318917,0 L9.99631148,0 Z M20.8885263,26 C24.2022348,26 26.8885263,23.3137085 26.8885263,20 C26.8885263,16.6862915 24.2022348,14 20.8885263,14 C17.5748178,14 14.8885263,16.6862915 14.8885263,20 C14.8885263,23.3137085 17.5748178,26 20.8885263,26 Z M57.3033321,25.6783342 C60.6170406,25.6783342 63.3033321,22.9920427 63.3033321,19.6783342 C63.3033321,16.3646258 60.6170406,13.6783342 57.3033321,13.6783342 C53.9896236,13.6783342 51.3033321,16.3646258 51.3033321,19.6783342 C51.3033321,22.9920427 53.9896236,25.6783342 57.3033321,25.6783342 Z"></path> - <text font-family="Helvetica" font-size="47.1724138" font-weight="bold" fill="#FFFFFF"> + <text class="tc-fill-background" font-family="Helvetica" font-size="47.1724138" font-weight="bold"> <tspan x="42" y="77.4847912" text-anchor="middle"><<now "DD">></tspan> </text> </g> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 221800ffd..8df02e788 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2670,3 +2670,10 @@ select { background: <<colour select-tag-background>>; } +/* +** Utility classes for SVG icons +*/ + +.tc-fill-background { + fill: <<colour background>>; +} \ No newline at end of file From d785a605e4dcc62afa486fd1d4d7941f01e7d094 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 22 Nov 2019 12:21:03 +0000 Subject: [PATCH 0420/2376] Add script to optimise SVGs Fixes #4379. Optimised SVGs in the next commit --- bin/optimise-svgs.js | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 bin/optimise-svgs.js diff --git a/bin/optimise-svgs.js b/bin/optimise-svgs.js new file mode 100755 index 000000000..28f4f715d --- /dev/null +++ b/bin/optimise-svgs.js @@ -0,0 +1,77 @@ +#!/usr/bin/env node + +/* +Optimise the SVGs in ./core/images using SVGO from https://github.com/svg/svgo + +Install SVGO with the following command in the root of the repo: + +npm install svgo +*/ + +"use strict"; + +var fs = require("fs"), + path = require("path"), + SVGO = require("svgo"), + svgo = new SVGO({ + plugins: [ + {cleanupAttrs: true}, + {removeDoctype: true}, + {removeXMLProcInst: true}, + {removeComments: true}, + {removeMetadata: true}, + {removeTitle: true}, + {removeDesc: true}, + {removeUselessDefs: true}, + {removeEditorsNSData: true}, + {removeEmptyAttrs: true}, + {removeHiddenElems: true}, + {removeEmptyText: true}, + {removeEmptyContainers: true}, + {removeViewBox: false}, + {cleanupEnableBackground: true}, + {convertStyleToAttrs: true}, + {convertColors: true}, + {convertPathData: true}, + {convertTransform: true}, + {removeUnknownsAndDefaults: true}, + {removeNonInheritableGroupAttrs: true}, + {removeUselessStrokeAndFill: true}, + {removeUnusedNS: true}, + {cleanupIDs: true}, + {cleanupNumericValues: true}, + {moveElemsAttrsToGroup: true}, + {moveGroupAttrsToElems: true}, + {collapseGroups: true}, + {removeRasterImages: false}, + {mergePaths: true}, + {convertShapeToPath: true}, + {sortAttrs: true}, + {removeDimensions: false}, + {removeAttrs: {attrs: "(stroke|fill)"}} + ] + }); + +var basepath = "./core/images/", + files = fs.readdirSync(basepath).sort(); + +files.forEach(function(filename) { + if(filename.slice(-4) === ".tid") { + var filepath = path.resolve(basepath,filename), + data = fs.readFileSync(filepath,"utf8"), + lines = data.split("\n"), + blankLine = lines.indexOf(""), + header = lines.slice(0,blankLine), + body = lines.slice(blankLine + 1), + fakeSVG = body.join("\n"); + // A hack to make the new-journal-button work + fakeSVG = fakeSVG.replace("<<now \"DD\">>","<<now "DD">>"); + svgo.optimize(fakeSVG, {path: filepath}).then(function(result) { + var newSVG = header.join("\n") + "\n\n" + result.data.replace("<<now "DD">>","<<now \"DD\">>"); + fs.writeFileSync(filepath,newSVG); + },function(err) { + console.log("Error " + err + " with " + filename) + process.exit(); + }); + } +}); From 18f5333e01eb62ece65a86c457bf8a398f156930 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 22 Nov 2019 12:21:54 +0000 Subject: [PATCH 0421/2376] Optimised SVG icons --- core/images/add-comment.tid | 2 +- core/images/advanced-search-button.tid | 9 +-------- core/images/auto-height.tid | 4 +--- core/images/blank.tid | 2 +- core/images/bold.tid | 6 +----- core/images/cancel-button.tid | 6 +----- core/images/chevron-down.tid | 7 +------ core/images/chevron-left.tid | 7 +------ core/images/chevron-right.tid | 7 +------ core/images/chevron-up.tid | 7 +------ core/images/clone-button.tid | 7 +------ core/images/close-all-button.tid | 9 +-------- core/images/close-button.tid | 6 +----- core/images/close-others-button.tid | 6 +----- core/images/copy-clipboard.tid | 13 +------------ core/images/delete-button.tid | 12 +----------- core/images/done-button.tid | 6 +----- core/images/down-arrow.tid | 4 +--- core/images/download-button.tid | 2 +- core/images/edit-button.tid | 7 +------ core/images/erase.tid | 6 +----- core/images/excise.tid | 6 +----- core/images/export-button.tid | 6 +----- core/images/file.tid | 12 +----------- core/images/fixed-height.tid | 6 +----- core/images/fold-all-button.tid | 9 +-------- core/images/fold-button.tid | 8 +------- core/images/fold-others-button.tid | 8 +------- core/images/folder.tid | 7 +------ core/images/full-screen-button.tid | 17 +---------------- core/images/github.tid | 6 +----- core/images/gitter.tid | 7 +------ core/images/globe.tid | 8 +------- core/images/heading-1.tid | 6 +----- core/images/heading-2.tid | 6 +----- core/images/heading-3.tid | 6 +----- core/images/heading-4.tid | 6 +----- core/images/heading-5.tid | 6 +----- core/images/heading-6.tid | 6 +----- core/images/help.tid | 6 +----- core/images/home-button.tid | 6 +----- core/images/import-button.tid | 6 +----- core/images/info-button.tid | 10 +--------- core/images/italic.tid | 6 +----- core/images/left-arrow.tid | 4 +--- core/images/line-width.tid | 7 +------ core/images/link.tid | 7 +------ core/images/linkify.tid | 2 +- core/images/list-bullet.tid | 6 +----- core/images/list-number.tid | 6 +----- core/images/list.tid | 7 +------ core/images/locked-padlock.tid | 6 +----- core/images/mail.tid | 6 +----- core/images/menu-button.tid | 6 +----- core/images/mono-block.tid | 6 +----- core/images/mono-line.tid | 6 +----- core/images/new-button.tid | 6 +----- core/images/new-here-button.tid | 11 +---------- core/images/new-image-button.tid | 6 +----- core/images/new-journal-button.tid | 14 +------------- core/images/opacity.tid | 8 +------- core/images/open-window.tid | 7 +------ core/images/options-button.tid | 6 +----- core/images/paint.tid | 6 +----- core/images/palette.tid | 6 +----- core/images/permalink-button.tid | 6 +----- core/images/permaview-button.tid | 6 +----- core/images/picture.tid | 6 +----- core/images/plugin-generic-language.tid | 6 +----- core/images/plugin-generic-plugin.tid | 6 +----- core/images/plugin-generic-theme.tid | 6 +----- core/images/preview-closed.tid | 13 +------------ core/images/preview-open.tid | 7 +------ core/images/print-button.tid | 10 +--------- core/images/quote.tid | 6 +----- core/images/refresh-button.tid | 6 +----- core/images/right-arrow.tid | 4 +--- core/images/rotate-left.tid | 2 +- core/images/save-button.tid | 6 +----- core/images/size.tid | 4 +--- core/images/spiral.tid | 6 +----- core/images/stamp.tid | 6 +----- core/images/star-filled.tid | 6 +----- core/images/storyview-classic.tid | 6 +----- core/images/storyview-pop.tid | 6 +----- core/images/storyview-zoomin.tid | 6 +----- core/images/strikethrough.tid | 7 +------ core/images/subscript.tid | 6 +----- core/images/superscript.tid | 6 +----- core/images/tag-button.tid | 7 +------ core/images/theme-button.tid | 7 +------ core/images/timestamp-off.tid | 6 +----- core/images/timestamp-on.tid | 6 +----- core/images/tip.tid | 6 +----- core/images/transcludify.tid | 2 +- core/images/twitter.tid | 6 +----- core/images/underline.tid | 6 +----- core/images/unfold-all-button.tid | 9 +-------- core/images/unfold-button.tid | 8 +------- core/images/unlocked-padlock.tid | 6 +----- core/images/up-arrow.tid | 5 +---- core/images/video.tid | 6 +----- core/images/warning.tid | 6 +----- 103 files changed, 103 insertions(+), 576 deletions(-) diff --git a/core/images/add-comment.tid b/core/images/add-comment.tid index 3e77ed518..178221806 100644 --- a/core/images/add-comment.tid +++ b/core/images/add-comment.tid @@ -1,4 +1,4 @@ title: $:/core/images/add-comment tags: $:/tags/Image -<svg class="tc-image-add-comment tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"><path d="M56 56H36a8 8 0 1 0 0 16h20v20a8 8 0 1 0 16 0V72h20a8 8 0 1 0 0-16H72V36a8 8 0 1 0-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z" fill-rule="evenodd"/></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-add-comment tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z"/></svg> \ No newline at end of file diff --git a/core/images/advanced-search-button.tid b/core/images/advanced-search-button.tid index 5579193ac..6fda3fe8b 100755 --- a/core/images/advanced-search-button.tid +++ b/core/images/advanced-search-button.tid @@ -1,11 +1,4 @@ title: $:/core/images/advanced-search-button tags: $:/tags/Image -<svg class="tc-image-advanced-search-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M74.5651535,87.9848361 C66.9581537,93.0488876 57.8237115,96 48,96 C21.490332,96 0,74.509668 0,48 C0,21.490332 21.490332,0 48,0 C74.509668,0 96,21.490332 96,48 C96,57.8541369 93.0305793,67.0147285 87.9377231,74.6357895 L122.284919,108.982985 C125.978897,112.676963 125.973757,118.65366 122.284271,122.343146 C118.593975,126.033442 112.613238,126.032921 108.92411,122.343793 L74.5651535,87.9848361 Z M48,80 C65.673112,80 80,65.673112 80,48 C80,30.326888 65.673112,16 48,16 C30.326888,16 16,30.326888 16,48 C16,65.673112 30.326888,80 48,80 Z"></path> - <circle cx="48" cy="48" r="8"></circle> - <circle cx="28" cy="48" r="8"></circle> - <circle cx="68" cy="48" r="8"></circle> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-advanced-search-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z"/><circle cx="48" cy="48" r="8"/><circle cx="28" cy="48" r="8"/><circle cx="68" cy="48" r="8"/></g></svg> \ No newline at end of file diff --git a/core/images/auto-height.tid b/core/images/auto-height.tid index e65b9c5b6..78f95418b 100755 --- a/core/images/auto-height.tid +++ b/core/images/auto-height.tid @@ -1,6 +1,4 @@ title: $:/core/images/auto-height tags: $:/tags/Image -<svg class="tc-image-auto-height tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <path d="M67.9867828,114.356363 L67.9579626,99.8785426 C67.9550688,98.4248183 67.1636987,97.087107 65.8909901,96.3845863 L49.9251455,87.5716209 L47.992126,95.0735397 L79.8995411,95.0735397 C84.1215894,95.0735397 85.4638131,89.3810359 81.686497,87.4948823 L49.7971476,71.5713518 L48.0101917,79.1500092 L79.992126,79.1500092 C84.2093753,79.1500092 85.5558421,73.4676733 81.7869993,71.5753162 L49.805065,55.517008 L48.0101916,63.0917009 L79.9921259,63.0917015 C84.2035118,63.0917016 85.5551434,57.4217887 81.7966702,55.5218807 L65.7625147,47.4166161 L67.9579705,50.9864368 L67.9579705,35.6148245 L77.1715737,44.8284272 C78.7336709,46.3905243 81.2663308,46.3905243 82.8284279,44.8284271 C84.390525,43.2663299 84.390525,40.7336699 82.8284278,39.1715728 L66.8284271,23.1715728 C65.2663299,21.6094757 62.73367,21.6094757 61.1715729,23.1715729 L45.1715729,39.1715729 C43.6094757,40.73367 43.6094757,43.26633 45.1715729,44.8284271 C46.73367,46.3905243 49.26633,46.3905243 50.8284271,44.8284271 L59.9579705,35.6988837 L59.9579705,50.9864368 C59.9579705,52.495201 60.806922,53.8755997 62.1534263,54.5562576 L78.1875818,62.6615223 L79.9921261,55.0917015 L48.0101917,55.0917009 C43.7929424,55.0917008 42.4464755,60.7740368 46.2153183,62.6663939 L78.1972526,78.7247021 L79.992126,71.1500092 L48.0101917,71.1500092 C43.7881433,71.1500092 42.4459197,76.842513 46.2232358,78.7286665 L78.1125852,94.6521971 L79.8995411,87.0735397 L47.992126,87.0735397 C43.8588276,87.0735397 42.4404876,92.5780219 46.0591064,94.5754586 L62.024951,103.388424 L59.9579785,99.8944677 L59.9867142,114.32986 L50.8284271,105.171573 C49.26633,103.609476 46.73367,103.609476 45.1715729,105.171573 C43.6094757,106.73367 43.6094757,109.26633 45.1715729,110.828427 L61.1715729,126.828427 C62.73367,128.390524 65.2663299,128.390524 66.8284271,126.828427 L82.8284278,110.828427 C84.390525,109.26633 84.390525,106.73367 82.8284279,105.171573 C81.2663308,103.609476 78.7336709,103.609476 77.1715737,105.171573 L67.9867828,114.356363 L67.9867828,114.356363 Z M16,20 L112,20 C114.209139,20 116,18.209139 116,16 C116,13.790861 114.209139,12 112,12 L16,12 C13.790861,12 12,13.790861 12,16 C12,18.209139 13.790861,20 16,20 L16,20 Z"></path> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-auto-height tc-image-button" viewBox="0 0 128 128"><path d="M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z"/></svg> \ No newline at end of file diff --git a/core/images/blank.tid b/core/images/blank.tid index 17cd2e65a..731b55a5a 100755 --- a/core/images/blank.tid +++ b/core/images/blank.tid @@ -1,4 +1,4 @@ title: $:/core/images/blank tags: $:/tags/Image -<svg class="tc-image-blank tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-blank tc-image-button" viewBox="0 0 128 128"/> \ No newline at end of file diff --git a/core/images/bold.tid b/core/images/bold.tid index 0e5d9d8d6..67a00f894 100755 --- a/core/images/bold.tid +++ b/core/images/bold.tid @@ -1,8 +1,4 @@ title: $:/core/images/bold tags: $:/tags/Image -<svg class="tc-image-bold tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M41.1456583,51.8095238 L41.1456583,21.8711485 L67.4985994,21.8711485 C70.0084159,21.8711485 72.4285598,22.0802967 74.7591036,22.4985994 C77.0896475,22.9169022 79.1512515,23.6638602 80.9439776,24.7394958 C82.7367036,25.8151314 84.170863,27.3090474 85.2464986,29.2212885 C86.3221342,31.1335296 86.859944,33.5835518 86.859944,36.5714286 C86.859944,41.9496067 85.2465147,45.8337882 82.0196078,48.2240896 C78.792701,50.614391 74.6694929,51.8095238 69.6498599,51.8095238 L41.1456583,51.8095238 Z M13,0 L13,128 L75.0280112,128 C80.7647346,128 86.3519803,127.28292 91.789916,125.848739 C97.2278517,124.414559 102.068139,122.203563 106.310924,119.215686 C110.553709,116.22781 113.929959,112.373506 116.439776,107.652661 C118.949592,102.931816 120.204482,97.3445701 120.204482,90.8907563 C120.204482,82.8832466 118.262391,76.0411115 114.378151,70.3641457 C110.493911,64.6871798 104.607883,60.7133634 96.719888,58.442577 C102.456611,55.6937304 106.788968,52.1680887 109.717087,47.8655462 C112.645206,43.5630037 114.109244,38.1849062 114.109244,31.7310924 C114.109244,25.7553389 113.123259,20.7357813 111.151261,16.6722689 C109.179262,12.6087565 106.400578,9.35201972 102.815126,6.90196078 C99.2296739,4.45190185 94.927196,2.68908101 89.907563,1.61344538 C84.8879301,0.537809748 79.3305627,0 73.2352941,0 L13,0 Z M41.1456583,106.128852 L41.1456583,70.9915966 L71.8011204,70.9915966 C77.896389,70.9915966 82.7964334,72.3958776 86.5014006,75.2044818 C90.2063677,78.0130859 92.0588235,82.7039821 92.0588235,89.2773109 C92.0588235,92.6237329 91.4911355,95.3725383 90.3557423,97.5238095 C89.2203491,99.6750808 87.6965548,101.378145 85.7843137,102.633053 C83.8720726,103.887961 81.661077,104.784311 79.1512605,105.322129 C76.641444,105.859947 74.0121519,106.128852 71.2633053,106.128852 L41.1456583,106.128852 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-bold tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z"/></svg> \ No newline at end of file diff --git a/core/images/cancel-button.tid b/core/images/cancel-button.tid index 2bca34874..c55620b06 100755 --- a/core/images/cancel-button.tid +++ b/core/images/cancel-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/cancel-button tags: $:/tags/Image -<svg class="tc-image-cancel-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M64,76.3137085 L47.0294734,93.2842351 C43.9038742,96.4098343 38.8399231,96.4084656 35.7157288,93.2842712 C32.5978915,90.166434 32.5915506,85.0947409 35.7157649,81.9705266 L52.6862915,65 L35.7157649,48.0294734 C32.5901657,44.9038742 32.5915344,39.8399231 35.7157288,36.7157288 C38.833566,33.5978915 43.9052591,33.5915506 47.0294734,36.7157649 L64,53.6862915 L80.9705266,36.7157649 C84.0961258,33.5901657 89.1600769,33.5915344 92.2842712,36.7157288 C95.4021085,39.833566 95.4084494,44.9052591 92.2842351,48.0294734 L75.3137085,65 L92.2842351,81.9705266 C95.4098343,85.0961258 95.4084656,90.1600769 92.2842712,93.2842712 C89.166434,96.4021085 84.0947409,96.4084494 80.9705266,93.2842351 L64,76.3137085 Z M64,129 C99.346224,129 128,100.346224 128,65 C128,29.653776 99.346224,1 64,1 C28.653776,1 1.13686838e-13,29.653776 1.13686838e-13,65 C1.13686838e-13,100.346224 28.653776,129 64,129 Z M64,113 C90.509668,113 112,91.509668 112,65 C112,38.490332 90.509668,17 64,17 C37.490332,17 16,38.490332 16,65 C16,91.509668 37.490332,113 64,113 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-cancel-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z"/></svg> \ No newline at end of file diff --git a/core/images/chevron-down.tid b/core/images/chevron-down.tid index a20539d7a..f1b363dfc 100755 --- a/core/images/chevron-down.tid +++ b/core/images/chevron-down.tid @@ -1,9 +1,4 @@ title: $:/core/images/chevron-down tags: $:/tags/Image -<svg class="tc-image-chevron-down tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd" transform="translate(64.000000, 40.500000) rotate(-270.000000) translate(-64.000000, -40.500000) translate(-22.500000, -26.500000)"> - <path d="M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z" transform="translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) "></path> - <path d="M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z" transform="translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-chevron-down tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z"/><path d="M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z"/></g></svg> \ No newline at end of file diff --git a/core/images/chevron-left.tid b/core/images/chevron-left.tid index 379db701e..e4c69d95a 100755 --- a/core/images/chevron-left.tid +++ b/core/images/chevron-left.tid @@ -1,9 +1,4 @@ title: $:/core/images/chevron-left tags: $:/tags/Image -<svg class="tc-image-chevron-left tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128" version="1.1"> - <g fill-rule="evenodd" transform="translate(92.500000, 64.000000) rotate(-180.000000) translate(-92.500000, -64.000000) translate(6.000000, -3.000000)"> - <path d="M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z" transform="translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) "></path> - <path d="M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z" transform="translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-chevron-left tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z"/><path d="M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z"/></g></svg> \ No newline at end of file diff --git a/core/images/chevron-right.tid b/core/images/chevron-right.tid index 2d379867e..6ff5b6c0d 100755 --- a/core/images/chevron-right.tid +++ b/core/images/chevron-right.tid @@ -1,9 +1,4 @@ title: $:/core/images/chevron-right tags: $:/tags/Image -<svg class="tc-image-chevron-right tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd" transform="translate(-48.000000, -3.000000)"> - <path d="M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z" transform="translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) "></path> - <path d="M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z" transform="translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-chevron-right tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z"/><path d="M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z"/></g></svg> \ No newline at end of file diff --git a/core/images/chevron-up.tid b/core/images/chevron-up.tid index 29824211a..9acbdec40 100755 --- a/core/images/chevron-up.tid +++ b/core/images/chevron-up.tid @@ -1,9 +1,4 @@ title: $:/core/images/chevron-up tags: $:/tags/Image -<svg class="tc-image-chevron-up tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd" transform="translate(64.000000, 89.500000) rotate(-90.000000) translate(-64.000000, -89.500000) translate(-22.500000, 22.500000)"> - <path d="M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z" transform="translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) "></path> - <path d="M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z" transform="translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-chevron-up tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z"/><path d="M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z"/></g></svg> \ No newline at end of file diff --git a/core/images/clone-button.tid b/core/images/clone-button.tid index 4aa1c9362..9ff4903ad 100755 --- a/core/images/clone-button.tid +++ b/core/images/clone-button.tid @@ -1,9 +1,4 @@ title: $:/core/images/clone-button tags: $:/tags/Image -<svg class="tc-clone-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M32.2650915,96 L32.2650915,120.002359 C32.2650915,124.419334 35.8432884,128 40.2627323,128 L120.002359,128 C124.419334,128 128,124.421803 128,120.002359 L128,40.2627323 C128,35.8457573 124.421803,32.2650915 120.002359,32.2650915 L96,32.2650915 L96,48 L108.858899,48 C110.519357,48 111.853018,49.3405131 111.853018,50.9941198 L111.853018,108.858899 C111.853018,110.519357 110.512505,111.853018 108.858899,111.853018 L50.9941198,111.853018 C49.333661,111.853018 48,110.512505 48,108.858899 L48,96 L32.2650915,96 Z"></path> - <path d="M40,56 L32.0070969,56 C27.5881712,56 24,52.418278 24,48 C24,43.5907123 27.5848994,40 32.0070969,40 L40,40 L40,32.0070969 C40,27.5881712 43.581722,24 48,24 C52.4092877,24 56,27.5848994 56,32.0070969 L56,40 L63.9929031,40 C68.4118288,40 72,43.581722 72,48 C72,52.4092877 68.4151006,56 63.9929031,56 L56,56 L56,63.9929031 C56,68.4118288 52.418278,72 48,72 C43.5907123,72 40,68.4151006 40,63.9929031 L40,56 Z M7.9992458,0 C3.58138434,0 0,3.5881049 0,7.9992458 L0,88.0007542 C0,92.4186157 3.5881049,96 7.9992458,96 L88.0007542,96 C92.4186157,96 96,92.4118951 96,88.0007542 L96,7.9992458 C96,3.58138434 92.4118951,0 88.0007542,0 L7.9992458,0 Z M19.0010118,16 C17.3435988,16 16,17.336731 16,19.0010118 L16,76.9989882 C16,78.6564012 17.336731,80 19.0010118,80 L76.9989882,80 C78.6564012,80 80,78.663269 80,76.9989882 L80,19.0010118 C80,17.3435988 78.663269,16 76.9989882,16 L19.0010118,16 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-clone-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z"/><path d="M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z"/></g></svg> \ No newline at end of file diff --git a/core/images/close-all-button.tid b/core/images/close-all-button.tid index d998e68e9..3334c5dbc 100755 --- a/core/images/close-all-button.tid +++ b/core/images/close-all-button.tid @@ -1,11 +1,4 @@ title: $:/core/images/close-all-button tags: $:/tags/Image -<svg class="tc-close-all-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd" transform="translate(-23.000000, -23.000000)"> - <path d="M43,131 L22.9976794,131 C18.5827987,131 15,127.418278 15,123 C15,118.590712 18.5806831,115 22.9976794,115 L43,115 L43,94.9976794 C43,90.5827987 46.581722,87 51,87 C55.4092877,87 59,90.5806831 59,94.9976794 L59,115 L79.0023206,115 C83.4172013,115 87,118.581722 87,123 C87,127.409288 83.4193169,131 79.0023206,131 L59,131 L59,151.002321 C59,155.417201 55.418278,159 51,159 C46.5907123,159 43,155.419317 43,151.002321 L43,131 Z" transform="translate(51.000000, 123.000000) rotate(-45.000000) translate(-51.000000, -123.000000) "></path> - <path d="M43,59 L22.9976794,59 C18.5827987,59 15,55.418278 15,51 C15,46.5907123 18.5806831,43 22.9976794,43 L43,43 L43,22.9976794 C43,18.5827987 46.581722,15 51,15 C55.4092877,15 59,18.5806831 59,22.9976794 L59,43 L79.0023206,43 C83.4172013,43 87,46.581722 87,51 C87,55.4092877 83.4193169,59 79.0023206,59 L59,59 L59,79.0023206 C59,83.4172013 55.418278,87 51,87 C46.5907123,87 43,83.4193169 43,79.0023206 L43,59 Z" transform="translate(51.000000, 51.000000) rotate(-45.000000) translate(-51.000000, -51.000000) "></path> - <path d="M115,59 L94.9976794,59 C90.5827987,59 87,55.418278 87,51 C87,46.5907123 90.5806831,43 94.9976794,43 L115,43 L115,22.9976794 C115,18.5827987 118.581722,15 123,15 C127.409288,15 131,18.5806831 131,22.9976794 L131,43 L151.002321,43 C155.417201,43 159,46.581722 159,51 C159,55.4092877 155.419317,59 151.002321,59 L131,59 L131,79.0023206 C131,83.4172013 127.418278,87 123,87 C118.590712,87 115,83.4193169 115,79.0023206 L115,59 Z" transform="translate(123.000000, 51.000000) rotate(-45.000000) translate(-123.000000, -51.000000) "></path> - <path d="M115,131 L94.9976794,131 C90.5827987,131 87,127.418278 87,123 C87,118.590712 90.5806831,115 94.9976794,115 L115,115 L115,94.9976794 C115,90.5827987 118.581722,87 123,87 C127.409288,87 131,90.5806831 131,94.9976794 L131,115 L151.002321,115 C155.417201,115 159,118.581722 159,123 C159,127.409288 155.419317,131 151.002321,131 L131,131 L131,151.002321 C131,155.417201 127.418278,159 123,159 C118.590712,159 115,155.419317 115,151.002321 L115,131 Z" transform="translate(123.000000, 123.000000) rotate(-45.000000) translate(-123.000000, -123.000000) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-close-all-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z"/></g></svg> \ No newline at end of file diff --git a/core/images/close-button.tid b/core/images/close-button.tid index da83fd5fb..c462c9bac 100755 --- a/core/images/close-button.tid +++ b/core/images/close-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/close-button tags: $:/tags/Image -<svg class="tc-image-close-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M65.0864256,75.4091629 L14.9727349,125.522854 C11.8515951,128.643993 6.78104858,128.64922 3.65685425,125.525026 C0.539017023,122.407189 0.5336324,117.334539 3.65902635,114.209145 L53.7727171,64.0954544 L3.65902635,13.9817637 C0.537886594,10.8606239 0.532659916,5.79007744 3.65685425,2.6658831 C6.77469148,-0.451954124 11.8473409,-0.457338747 14.9727349,2.66805521 L65.0864256,52.7817459 L115.200116,2.66805521 C118.321256,-0.453084553 123.391803,-0.458311231 126.515997,2.6658831 C129.633834,5.78372033 129.639219,10.8563698 126.513825,13.9817637 L76.4001341,64.0954544 L126.513825,114.209145 C129.634965,117.330285 129.640191,122.400831 126.515997,125.525026 C123.39816,128.642863 118.32551,128.648248 115.200116,125.522854 L65.0864256,75.4091629 L65.0864256,75.4091629 Z"></path> - </g> -</svg> +<svg width="22pt" height="22pt" class="tc-image-close-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z"/></svg> \ No newline at end of file diff --git a/core/images/close-others-button.tid b/core/images/close-others-button.tid index 78a163299..1cd54d797 100755 --- a/core/images/close-others-button.tid +++ b/core/images/close-others-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/close-others-button tags: $:/tags/Image -<svg class="tc-image-close-others-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z M64,96 C81.673112,96 96,81.673112 96,64 C96,46.326888 81.673112,32 64,32 C46.326888,32 32,46.326888 32,64 C32,81.673112 46.326888,96 64,96 Z M64,80 C72.836556,80 80,72.836556 80,64 C80,55.163444 72.836556,48 64,48 C55.163444,48 48,55.163444 48,64 C48,72.836556 55.163444,80 64,80 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-close-others-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z"/></svg> \ No newline at end of file diff --git a/core/images/copy-clipboard.tid b/core/images/copy-clipboard.tid index 583808bd4..e4e55b6e9 100644 --- a/core/images/copy-clipboard.tid +++ b/core/images/copy-clipboard.tid @@ -1,15 +1,4 @@ title: $:/core/images/copy-clipboard tags: $:/tags/Image -<svg class="tc-image-copy-clipboard tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <rect x="40" y="40" width="33" height="8" rx="4"></rect> - <rect x="40" y="82" width="17" height="8" rx="4"></rect> - <rect x="40" y="54" width="17" height="8" rx="4"></rect> - <rect x="40" y="96" width="33" height="8" rx="4"></rect> - <rect x="40" y="68" width="12" height="8" rx="4"></rect> - <path d="M40,16 L23.9992458,16 C19.5813843,16 16,19.5907123 16,24 C16,24.0016363 16.0000005,24.0032725 16.0000015,24.0049086 C16.0000005,24.0065441 16,24.0081803 16,24.0098166 L16,119.990183 C16,119.99182 16.0000005,119.993456 16.0000015,119.995092 C16.0000005,119.996727 16,119.998364 16,120 C16,124.409288 19.5813843,128 23.9992458,128 L104.000754,128 C106.205061,128 108.203844,127.105595 109.652065,125.659342 C111.102424,124.21251 112,122.214511 112,120.007595 L112,103.992405 C112,99.5776607 108.418278,96 104,96 C99.5907123,96 96,99.5783218 96,103.992405 L96,112 L32,112 L32,32 L96,32 L96,40.0075946 C96,44.4223393 99.581722,48 104,48 C108.409288,48 112,44.4216782 112,40.0075946 L112,23.9924054 C112,21.7851587 111.104671,19.7871591 109.657101,18.3409203 C108.203844,16.8944047 106.205061,16 104.000754,16 L88,16 C88,11.5907123 84.4151006,8 79.9929031,8 L48.0070969,8 C43.5881712,8 40,11.581722 40,16 Z M44,14.9958262 C44,12.7889923 45.7964248,11 48.0000255,11 L79.9999745,11 C82.2091276,11 84,12.7965212 84,14.9958262 L84,19.0041738 C84,21.2110077 82.2035752,23 79.9999745,23 L48.0000255,23 C45.7908724,23 44,21.2034788 44,19.0041738 L44,14.9958262 Z"></path> - <rect x="62" y="64" width="66" height="16" rx="8"></rect> - <path d="M60.6568542,85.6568542 L76.6568542,69.6568543 L65.3431458,69.6568542 L81.3431458,85.6568542 C84.4673401,88.7810486 89.5326599,88.7810486 92.6568542,85.6568542 C95.7810486,82.5326599 95.7810486,77.4673401 92.6568542,74.3431458 L76.6568542,58.3431458 C73.5326599,55.2189514 68.4673401,55.2189514 65.3431458,58.3431457 L49.3431458,74.3431457 C46.2189514,77.4673401 46.2189514,82.5326599 49.3431457,85.6568542 C52.4673401,88.7810486 57.5326599,88.7810486 60.6568542,85.6568542 L60.6568542,85.6568542 Z" transform="translate(71.000000, 72.000000) rotate(-90.000000) translate(-71.000000, -72.000000) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-copy-clipboard tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="33" height="8" x="40" y="40" rx="4"/><rect width="17" height="8" x="40" y="82" rx="4"/><rect width="17" height="8" x="40" y="54" rx="4"/><rect width="33" height="8" x="40" y="96" rx="4"/><rect width="12" height="8" x="40" y="68" rx="4"/><path d="M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z"/><rect width="66" height="16" x="62" y="64" rx="8"/><path d="M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z"/></g></svg> \ No newline at end of file diff --git a/core/images/delete-button.tid b/core/images/delete-button.tid index 5dde6fe03..e8c9b6108 100755 --- a/core/images/delete-button.tid +++ b/core/images/delete-button.tid @@ -1,14 +1,4 @@ title: $:/core/images/delete-button tags: $:/tags/Image -<svg class="tc-image-delete-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd" transform="translate(12.000000, 0.000000)"> - <rect x="0" y="11" width="105" height="16" rx="8"></rect> - <rect x="28" y="0" width="48" height="16" rx="8"></rect> - <rect x="8" y="16" width="16" height="112" rx="8"></rect> - <rect x="8" y="112" width="88" height="16" rx="8"></rect> - <rect x="80" y="16" width="16" height="112" rx="8"></rect> - <rect x="56" y="16" width="16" height="112" rx="8"></rect> - <rect x="32" y="16" width="16" height="112" rx="8"></rect> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-delete-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd" transform="translate(12)"><rect width="105" height="16" y="11" rx="8"/><rect width="48" height="16" x="28" rx="8"/><rect width="16" height="112" x="8" y="16" rx="8"/><rect width="88" height="16" x="8" y="112" rx="8"/><rect width="16" height="112" x="80" y="16" rx="8"/><rect width="16" height="112" x="56" y="16" rx="8"/><rect width="16" height="112" x="32" y="16" rx="8"/></g></svg> \ No newline at end of file diff --git a/core/images/done-button.tid b/core/images/done-button.tid index 069adafe9..265528d06 100755 --- a/core/images/done-button.tid +++ b/core/images/done-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/done-button tags: $:/tags/Image -<svg class="tc-image-done-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M3.52445141,76.8322939 C2.07397484,75.3828178 1.17514421,73.3795385 1.17514421,71.1666288 L1.17514421,23.1836596 C1.17514421,18.7531992 4.75686621,15.1751442 9.17514421,15.1751442 C13.5844319,15.1751442 17.1751442,18.7606787 17.1751442,23.1836596 L17.1751442,63.1751442 L119.173716,63.1751442 C123.590457,63.1751442 127.175144,66.7568662 127.175144,71.1751442 C127.175144,75.5844319 123.592783,79.1751442 119.173716,79.1751442 L9.17657227,79.1751442 C6.96796403,79.1751442 4.9674142,78.279521 3.51911285,76.8315312 Z" id="Rectangle-285" transform="translate(64.175144, 47.175144) rotate(-45.000000) translate(-64.175144, -47.175144) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-done-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z"/></svg> \ No newline at end of file diff --git a/core/images/down-arrow.tid b/core/images/down-arrow.tid index 8315c8e49..4cac65a00 100755 --- a/core/images/down-arrow.tid +++ b/core/images/down-arrow.tid @@ -1,6 +1,4 @@ title: $:/core/images/down-arrow tags: $:/tags/Image -<svg class="tc-image-down-arrow tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <path d="M109.35638,81.3533152 C107.923899,82.7869182 105.94502,83.6751442 103.759224,83.6751442 L24.5910645,83.6751442 C20.225873,83.6751442 16.6751442,80.1307318 16.6751442,75.7584775 C16.6751442,71.3951199 20.2192225,67.8418109 24.5910645,67.8418109 L95.8418109,67.8418109 L95.8418109,-3.40893546 C95.8418109,-7.77412698 99.3862233,-11.3248558 103.758478,-11.3248558 C108.121835,-11.3248558 111.675144,-7.78077754 111.675144,-3.40893546 L111.675144,75.7592239 C111.675144,77.9416955 110.789142,79.9205745 109.356651,81.3538862 Z" transform="translate(64.175144, 36.175144) rotate(45.000000) translate(-64.175144, -36.175144) "></path> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-down-arrow tc-image-button" viewBox="0 0 128 128"><path d="M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z"/></svg> \ No newline at end of file diff --git a/core/images/download-button.tid b/core/images/download-button.tid index 0c524b28f..e3a549639 100755 --- a/core/images/download-button.tid +++ b/core/images/download-button.tid @@ -1,4 +1,4 @@ title: $:/core/images/download-button tags: $:/tags/Image -<svg class="tc-image-download-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"><g fill-rule="evenodd"><path class="tc-image-download-button-ring" d="M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z"/><path d="M34.3496823,66.4308767 L61.2415823,93.634668 C63.0411536,95.4551107 65.9588502,95.4551107 67.7584215,93.634668 L94.6503215,66.4308767 C96.4498928,64.610434 96.4498928,61.6588981 94.6503215,59.8384554 C93.7861334,58.9642445 92.6140473,58.4731195 91.3919019,58.4731195 L82.9324098,58.4731195 C80.3874318,58.4731195 78.3243078,56.3860674 78.3243078,53.8115729 L78.3243078,38.6615466 C78.3243078,36.0870521 76.2611837,34 73.7162058,34 L55.283798,34 C52.7388201,34 50.675696,36.0870521 50.675696,38.6615466 L50.675696,38.6615466 L50.675696,53.8115729 C50.675696,56.3860674 48.612572,58.4731195 46.0675941,58.4731195 L37.608102,58.4731195 C35.063124,58.4731195 33,60.5601716 33,63.134666 C33,64.3709859 33.4854943,65.5566658 34.3496823,66.4308767 L34.3496823,66.4308767 Z"/></g></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-download-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z" class="tc-image-download-button-ring"/><path d="M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z"/></g></svg> \ No newline at end of file diff --git a/core/images/edit-button.tid b/core/images/edit-button.tid index d65f94903..190dffc41 100755 --- a/core/images/edit-button.tid +++ b/core/images/edit-button.tid @@ -1,9 +1,4 @@ title: $:/core/images/edit-button tags: $:/tags/Image -<svg class="tc-image-edit-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M116.870058,45.3431458 L108.870058,45.3431458 L108.870058,45.3431458 L108.870058,61.3431458 L116.870058,61.3431458 L116.870058,45.3431458 Z M124.870058,45.3431458 L127.649881,45.3431458 C132.066101,45.3431458 135.656854,48.9248678 135.656854,53.3431458 C135.656854,57.7524334 132.07201,61.3431458 127.649881,61.3431458 L124.870058,61.3431458 L124.870058,45.3431458 Z M100.870058,45.3431458 L15.6638275,45.3431458 C15.5064377,45.3431458 15.3501085,45.3476943 15.1949638,45.3566664 L15.1949638,45.3566664 C15.0628002,45.3477039 14.928279,45.3431458 14.7913977,45.3431458 C6.68160973,45.3431458 -8.34314575,53.3431458 -8.34314575,53.3431458 C-8.34314575,53.3431458 6.85614548,61.3431458 14.7913977,61.3431458 C14.9266533,61.3431458 15.0596543,61.3384973 15.190398,61.3293588 C15.3470529,61.3385075 15.5049057,61.3431458 15.6638275,61.3431458 L100.870058,61.3431458 L100.870058,45.3431458 L100.870058,45.3431458 Z" transform="translate(63.656854, 53.343146) rotate(-45.000000) translate(-63.656854, -53.343146) "></path> - <path d="M35.1714596,124.189544 C41.9594858,123.613403 49.068777,121.917633 58.85987,118.842282 C60.6854386,118.268877 62.4306907,117.705515 65.1957709,116.802278 C81.1962861,111.575575 87.0734839,109.994907 93.9414474,109.655721 C102.29855,109.242993 107.795169,111.785371 111.520478,118.355045 C112.610163,120.276732 115.051363,120.951203 116.97305,119.861518 C118.894737,118.771832 119.569207,116.330633 118.479522,114.408946 C113.146151,105.003414 104.734907,101.112919 93.5468356,101.66546 C85.6716631,102.054388 79.4899908,103.716944 62.7116783,109.197722 C59.9734132,110.092199 58.2519873,110.64787 56.4625698,111.20992 C37.002649,117.322218 25.6914684,118.282267 16.8654804,112.957098 C14.9739614,111.815848 12.5154166,112.424061 11.3741667,114.31558 C10.2329168,116.207099 10.84113,118.665644 12.7326489,119.806894 C19.0655164,123.627836 26.4866335,124.926678 35.1714596,124.189544 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-edit-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z"/></g></svg> \ No newline at end of file diff --git a/core/images/erase.tid b/core/images/erase.tid index ba18f5bd0..22b31e7cc 100755 --- a/core/images/erase.tid +++ b/core/images/erase.tid @@ -1,8 +1,4 @@ title: $:/core/images/erase tags: $:/tags/Image -<svg class="tc-image-erase tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M60.0870401,127.996166 L123.102318,64.980888 C129.636723,58.4464827 129.629513,47.8655877 123.098967,41.3350425 L99.4657866,17.7018617 C92.927448,11.1635231 82.3486358,11.1698163 75.8199411,17.698511 L4.89768189,88.6207702 C-1.63672343,95.1551755 -1.6295126,105.736071 4.90103262,112.266616 L20.6305829,127.996166 L60.0870401,127.996166 Z M25.1375576,120.682546 L10.812569,106.357558 C7.5455063,103.090495 7.54523836,97.793808 10.8048093,94.5342371 L46.2691086,59.0699377 L81.7308914,94.5317205 L55.5800654,120.682546 L25.1375576,120.682546 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-erase tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z"/></svg> \ No newline at end of file diff --git a/core/images/excise.tid b/core/images/excise.tid index 2360cb5a7..e6c2c9404 100755 --- a/core/images/excise.tid +++ b/core/images/excise.tid @@ -1,8 +1,4 @@ title: $:/core/images/excise tags: $:/tags/Image -<svg class="tc-image-excise tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M56,107.313709 L53.6568542,109.656854 C50.5326599,112.781049 45.4673401,112.781049 42.3431457,109.656854 C39.2189514,106.53266 39.2189514,101.46734 42.3431458,98.3431457 L58.3431458,82.3431457 C61.4673401,79.2189514 66.5326599,79.2189514 69.6568542,82.3431458 L85.6568542,98.3431458 C88.7810486,101.46734 88.7810486,106.53266 85.6568542,109.656854 C82.5326599,112.781049 77.4673401,112.781049 74.3431458,109.656854 L72,107.313708 L72,121.597798 C72,125.133636 68.418278,128 64,128 C59.581722,128 56,125.133636 56,121.597798 L56,107.313709 Z M0,40.0070969 C0,35.5848994 3.59071231,32 8,32 C12.418278,32 16,35.5881712 16,40.0070969 L16,71.9929031 C16,76.4151006 12.4092877,80 8,80 C3.581722,80 0,76.4118288 0,71.9929031 L0,40.0070969 Z M32,40.0070969 C32,35.5848994 35.5907123,32 40,32 C44.418278,32 48,35.5881712 48,40.0070969 L48,71.9929031 C48,76.4151006 44.4092877,80 40,80 C35.581722,80 32,76.4118288 32,71.9929031 L32,40.0070969 Z M80,40.0070969 C80,35.5848994 83.5907123,32 88,32 C92.418278,32 96,35.5881712 96,40.0070969 L96,71.9929031 C96,76.4151006 92.4092877,80 88,80 C83.581722,80 80,76.4118288 80,71.9929031 L80,40.0070969 Z M56,8.00709688 C56,3.58489938 59.5907123,0 64,0 C68.418278,0 72,3.58817117 72,8.00709688 L72,39.9929031 C72,44.4151006 68.4092877,48 64,48 C59.581722,48 56,44.4118288 56,39.9929031 L56,8.00709688 Z M112,40.0070969 C112,35.5848994 115.590712,32 120,32 C124.418278,32 128,35.5881712 128,40.0070969 L128,71.9929031 C128,76.4151006 124.409288,80 120,80 C115.581722,80 112,76.4118288 112,71.9929031 L112,40.0070969 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-excise tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z"/></svg> \ No newline at end of file diff --git a/core/images/export-button.tid b/core/images/export-button.tid index 940ffe7d5..eb3284c80 100755 --- a/core/images/export-button.tid +++ b/core/images/export-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/export-button tags: $:/tags/Image -<svg class="tc-image-export-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M8.00348646,127.999999 C8.00464867,128 8.00581094,128 8.00697327,128 L119.993027,128 C122.205254,128 124.207939,127.101378 125.657096,125.651198 L125.656838,125.65759 C127.104563,124.210109 128,122.21009 128,119.999949 L128,56.0000511 C128,51.5817449 124.409288,48 120,48 C115.581722,48 112,51.5797863 112,56.0000511 L112,112 L16,112 L16,56.0000511 C16,51.5817449 12.4092877,48 8,48 C3.581722,48 7.10542736e-15,51.5797863 7.10542736e-15,56.0000511 L7.10542736e-15,119.999949 C7.10542736e-15,124.418255 3.59071231,128 8,128 C8.00116233,128 8.0023246,128 8.00348681,127.999999 Z M56.6235633,27.3113724 L47.6580188,36.2769169 C44.5333664,39.4015692 39.4634864,39.4061295 36.339292,36.2819351 C33.2214548,33.1640979 33.2173444,28.0901742 36.3443103,24.9632084 L58.9616908,2.34582788 C60.5248533,0.782665335 62.5748436,0.000361191261 64.624516,2.38225238e-14 L64.6193616,0.00151809229 C66.6695374,0.000796251595 68.7211167,0.781508799 70.2854358,2.34582788 L92.9028163,24.9632084 C96.0274686,28.0878607 96.0320289,33.1577408 92.9078345,36.2819351 C89.7899973,39.3997724 84.7160736,39.4038827 81.5891078,36.2769169 L72.6235633,27.3113724 L72.6235633,88.5669606 C72.6235633,92.9781015 69.0418413,96.5662064 64.6235633,96.5662064 C60.2142756,96.5662064 56.6235633,92.984822 56.6235633,88.5669606 L56.6235633,27.3113724 L56.6235633,27.3113724 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-export-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z"/></svg> \ No newline at end of file diff --git a/core/images/file.tid b/core/images/file.tid index d66b19e50..67ebc22ac 100755 --- a/core/images/file.tid +++ b/core/images/file.tid @@ -1,14 +1,4 @@ title: $:/core/images/file tags: $:/tags/Image -<svg class="tc-image-file tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="nonzero"> - <path d="M111.96811,30.5 L112,30.5 L112,119.999079 C112,124.417866 108.419113,128 104.000754,128 L23.9992458,128 C19.5813843,128 16,124.417687 16,119.999079 L16,8.00092105 C16,3.58213437 19.5808867,0 23.9992458,0 L81,0 L81,0.0201838424 C83.1589869,-0.071534047 85.3482153,0.707077645 86.9982489,2.35711116 L109.625176,24.9840387 C111.151676,26.510538 111.932942,28.4998414 111.96811,30.5 L111.96811,30.5 Z M81,8 L24,8 L24,120 L104,120 L104,30.5 L89.0003461,30.5 C84.5818769,30.5 81,26.9216269 81,22.4996539 L81,8 Z"></path> - <rect x="32" y="36" width="64" height="8" rx="4"></rect> - <rect x="32" y="52" width="64" height="8" rx="4"></rect> - <rect x="32" y="68" width="64" height="8" rx="4"></rect> - <rect x="32" y="84" width="64" height="8" rx="4"></rect> - <rect x="32" y="100" width="64" height="8" rx="4"></rect> - <rect x="32" y="20" width="40" height="8" rx="4"></rect> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-file tc-image-button" viewBox="0 0 128 128"><path d="M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z"/><rect width="64" height="8" x="32" y="36" rx="4"/><rect width="64" height="8" x="32" y="52" rx="4"/><rect width="64" height="8" x="32" y="68" rx="4"/><rect width="64" height="8" x="32" y="84" rx="4"/><rect width="64" height="8" x="32" y="100" rx="4"/><rect width="40" height="8" x="32" y="20" rx="4"/></svg> \ No newline at end of file diff --git a/core/images/fixed-height.tid b/core/images/fixed-height.tid index 3b53256ab..c15162267 100755 --- a/core/images/fixed-height.tid +++ b/core/images/fixed-height.tid @@ -1,8 +1,4 @@ title: $:/core/images/fixed-height tags: $:/tags/Image -<svg class="tc-image-fixed-height tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M60,35.6568542 L50.8284271,44.8284271 C49.26633,46.3905243 46.73367,46.3905243 45.1715729,44.8284271 C43.6094757,43.26633 43.6094757,40.73367 45.1715729,39.1715729 L61.1715729,23.1715729 C62.73367,21.6094757 65.2663299,21.6094757 66.8284271,23.1715728 L82.8284278,39.1715728 C84.390525,40.7336699 84.390525,43.2663299 82.8284279,44.8284271 C81.2663308,46.3905243 78.7336709,46.3905243 77.1715737,44.8284272 L68,35.6568539 L68,93.3431461 L77.1715737,84.1715728 C78.7336709,82.6094757 81.2663308,82.6094757 82.8284279,84.1715729 C84.390525,85.7336701 84.390525,88.2663301 82.8284278,89.8284272 L66.8284271,105.828427 C65.2663299,107.390524 62.73367,107.390524 61.1715729,105.828427 L45.1715729,89.8284271 C43.6094757,88.26633 43.6094757,85.73367 45.1715729,84.1715729 C46.73367,82.6094757 49.26633,82.6094757 50.8284271,84.1715729 L60,93.3431458 L60,35.6568542 L60,35.6568542 Z M16,116 L112,116 C114.209139,116 116,114.209139 116,112 C116,109.790861 114.209139,108 112,108 L16,108 C13.790861,108 12,109.790861 12,112 C12,114.209139 13.790861,116 16,116 L16,116 Z M16,20 L112,20 C114.209139,20 116,18.209139 116,16 C116,13.790861 114.209139,12 112,12 L16,12 C13.790861,12 12,13.790861 12,16 C12,18.209139 13.790861,20 16,20 L16,20 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-fixed-height tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z"/></svg> \ No newline at end of file diff --git a/core/images/fold-all-button.tid b/core/images/fold-all-button.tid index c74ae421a..edff8b22b 100755 --- a/core/images/fold-all-button.tid +++ b/core/images/fold-all-button.tid @@ -1,11 +1,4 @@ title: $:/core/images/fold-all-button tags: $:/tags/Image -<svg class="tc-image-fold-all tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <rect x="0" y="0" width="128" height="16" rx="8"></rect> - <rect x="0" y="64" width="128" height="16" rx="8"></rect> - <path d="M64.0292774,58.6235628 C61.9791013,58.6242848 59.9275217,57.8435723 58.3632024,56.279253 L35.7458219,33.6618725 C32.6211696,30.5372202 32.6166093,25.4673401 35.7408036,22.3431458 C38.8586409,19.2253085 43.9325646,19.2211982 47.0595304,22.348164 L64.0250749,39.3137085 L80.9906194,22.348164 C84.1152717,19.2235117 89.1851518,19.2189514 92.3093461,22.3431458 C95.4271834,25.460983 95.4312937,30.5349067 92.3043279,33.6618725 L69.6869474,56.279253 C68.1237851,57.8424153 66.0737951,58.6247195 64.0241231,58.6250809 Z" transform="translate(64.024316, 39.313708) scale(1, -1) translate(-64.024316, -39.313708) "></path> - <path d="M64.0292774,123.621227 C61.9791013,123.621949 59.9275217,122.841236 58.3632024,121.276917 L35.7458219,98.6595365 C32.6211696,95.5348842 32.6166093,90.4650041 35.7408036,87.3408098 C38.8586409,84.2229725 43.9325646,84.2188622 47.0595304,87.345828 L64.0250749,104.311373 L80.9906194,87.345828 C84.1152717,84.2211757 89.1851518,84.2166154 92.3093461,87.3408098 C95.4271834,90.458647 95.4312937,95.5325707 92.3043279,98.6595365 L69.6869474,121.276917 C68.1237851,122.840079 66.0737951,123.622383 64.0241231,123.622745 Z" transform="translate(64.024316, 104.311372) scale(1, -1) translate(-64.024316, -104.311372) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-fold-all tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="128" height="16" rx="8"/><rect width="128" height="16" y="64" rx="8"/><path d="M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z"/></g></svg> \ No newline at end of file diff --git a/core/images/fold-button.tid b/core/images/fold-button.tid index 190e61d64..f0b2b474d 100755 --- a/core/images/fold-button.tid +++ b/core/images/fold-button.tid @@ -1,10 +1,4 @@ title: $:/core/images/fold-button tags: $:/tags/Image -<svg class="tc-image-fold tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <rect x="0" y="0" width="128" height="16" rx="8"></rect> - <path d="M64.0292774,63.6235628 C61.9791013,63.6242848 59.9275217,62.8435723 58.3632024,61.279253 L35.7458219,38.6618725 C32.6211696,35.5372202 32.6166093,30.4673401 35.7408036,27.3431458 C38.8586409,24.2253085 43.9325646,24.2211982 47.0595304,27.348164 L64.0250749,44.3137085 L80.9906194,27.348164 C84.1152717,24.2235117 89.1851518,24.2189514 92.3093461,27.3431458 C95.4271834,30.460983 95.4312937,35.5349067 92.3043279,38.6618725 L69.6869474,61.279253 C68.1237851,62.8424153 66.0737951,63.6247195 64.0241231,63.6250809 Z" transform="translate(64.024316, 44.313708) scale(1, -1) translate(-64.024316, -44.313708) "></path> - <path d="M64.0049614,105.998482 C61.9547853,105.999204 59.9032057,105.218491 58.3388864,103.654172 L35.7215059,81.0367916 C32.5968535,77.9121393 32.5922933,72.8422592 35.7164876,69.7180649 C38.8343248,66.6002276 43.9082485,66.5961173 47.0352144,69.7230831 L64.0007589,86.6886276 L80.9663034,69.7230831 C84.0909557,66.5984308 89.1608358,66.5938705 92.2850301,69.7180649 C95.4028673,72.8359021 95.4069777,77.9098258 92.2800119,81.0367916 L69.6626314,103.654172 C68.099469,105.217334 66.0494791,105.999639 63.999807,106 Z" transform="translate(64.000000, 86.688628) scale(1, -1) translate(-64.000000, -86.688628) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-fold tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="128" height="16" rx="8"/><path d="M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z"/></g></svg> \ No newline at end of file diff --git a/core/images/fold-others-button.tid b/core/images/fold-others-button.tid index d19505cea..5cb086f85 100755 --- a/core/images/fold-others-button.tid +++ b/core/images/fold-others-button.tid @@ -1,10 +1,4 @@ title: $:/core/images/fold-others-button tags: $:/tags/Image -<svg class="tc-image-fold-others tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <rect x="0" y="56.0314331" width="128" height="16" rx="8"></rect> - <path d="M101.657101,104.948818 C100.207918,103.498614 98.2051847,102.599976 95.9929031,102.599976 L72,102.599976 L72,78.6070725 C72,76.3964271 71.1036108,74.3936927 69.6545293,72.9441002 L69.6571005,72.9488183 C68.2079177,71.4986143 66.2051847,70.5999756 63.9929031,70.5999756 L32.0070969,70.5999756 C27.5881712,70.5999756 24,74.1816976 24,78.5999756 C24,83.0092633 27.5848994,86.5999756 32.0070969,86.5999756 L56,86.5999756 L56,110.592879 C56,112.803524 56.8963895,114.806259 58.3454713,116.255852 L58.3429,116.251133 C59.7920828,117.701337 61.7948156,118.599976 64.0070969,118.599976 L88,118.599976 L88,142.592879 C88,147.011804 91.581722,150.599976 96,150.599976 C100.409288,150.599976 104,147.015076 104,142.592879 L104,110.607072 C104,108.396427 103.103611,106.393693 101.654529,104.9441 Z" transform="translate(64.000000, 110.599976) rotate(-45.000000) translate(-64.000000, -110.599976) "></path> - <path d="M101.725643,11.7488671 C100.27646,10.2986632 98.2737272,9.40002441 96.0614456,9.40002441 L72.0685425,9.40002441 L72.0685425,-14.5928787 C72.0685425,-16.8035241 71.1721533,-18.8062584 69.7230718,-20.255851 L69.725643,-20.2511329 C68.2764602,-21.7013368 66.2737272,-22.5999756 64.0614456,-22.5999756 L32.0756394,-22.5999756 C27.6567137,-22.5999756 24.0685425,-19.0182536 24.0685425,-14.5999756 C24.0685425,-10.1906879 27.6534419,-6.59997559 32.0756394,-6.59997559 L56.0685425,-6.59997559 L56.0685425,17.3929275 C56.0685425,19.6035732 56.964932,21.6063078 58.4140138,23.0559004 L58.4114425,23.0511823 C59.8606253,24.5013859 61.8633581,25.4000244 64.0756394,25.4000244 L88.0685425,25.4000244 L88.0685425,49.3929275 C88.0685425,53.8118532 91.6502645,57.4000244 96.0685425,57.4000244 C100.47783,57.4000244 104.068542,53.815125 104.068542,49.3929275 L104.068542,17.4071213 C104.068542,15.1964759 103.172153,13.1937416 101.723072,11.744149 Z" transform="translate(64.068542, 17.400024) scale(1, -1) rotate(-45.000000) translate(-64.068542, -17.400024) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-fold-others tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="128" height="16" y="56.031" rx="8"/><path d="M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z"/></g></svg> \ No newline at end of file diff --git a/core/images/folder.tid b/core/images/folder.tid index 354e6e633..4b89418ff 100755 --- a/core/images/folder.tid +++ b/core/images/folder.tid @@ -1,9 +1,4 @@ title: $:/core/images/folder tags: $:/tags/Image -<svg class="tc-image-folder tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M55.6943257,128.000004 L7.99859666,128.000004 C3.5810937,128.000004 0,124.413822 0,119.996384 L0,48.0036243 C0,43.5833471 3.58387508,40.0000044 7.99859666,40.0000044 L16,40.0000044 L16,31.9999914 C16,27.5817181 19.5783731,24 24.0003461,24 L55.9996539,24 C60.4181231,24 64,27.5800761 64,31.9999914 L64,40.0000044 L104.001403,40.0000044 C108.418906,40.0000044 112,43.5861868 112,48.0036243 L112,59.8298353 L104,59.7475921 L104,51.9994189 C104,49.7887607 102.207895,48.0000044 99.9972215,48.0000044 L56,48.0000044 L56,36.0000255 C56,33.7898932 54.2072328,32 51.9957423,32 L28.0042577,32 C25.7890275,32 24,33.7908724 24,36.0000255 L24,48.0000044 L12.0027785,48.0000044 C9.78987688,48.0000044 8,49.7906032 8,51.9994189 L8,116.00059 C8,118.211248 9.79210499,120.000004 12.0027785,120.000004 L58.7630167,120.000004 L55.6943257,128.000004 L55.6943257,128.000004 Z"></path> - <path d="M23.8728955,55.5 L119.875702,55.5 C124.293205,55.5 126.87957,59.5532655 125.650111,64.5630007 L112.305967,118.936999 C111.077582,123.942356 106.497904,128 102.083183,128 L6.08037597,128 C1.66287302,128 -0.923492342,123.946735 0.305967145,118.936999 L13.650111,64.5630007 C14.878496,59.5576436 19.4581739,55.5 23.8728955,55.5 L23.8728955,55.5 L23.8728955,55.5 Z M25.6530124,64 L113.647455,64 C115.858129,64 117.151473,66.0930612 116.538306,68.6662267 L105.417772,115.333773 C104.803671,117.910859 102.515967,120 100.303066,120 L12.3086228,120 C10.0979492,120 8.8046054,117.906939 9.41777189,115.333773 L20.5383062,68.6662267 C21.1524069,66.0891409 23.4401107,64 25.6530124,64 L25.6530124,64 L25.6530124,64 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-folder tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z"/><path d="M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z"/></g></svg> \ No newline at end of file diff --git a/core/images/full-screen-button.tid b/core/images/full-screen-button.tid index acc6edbd6..8572ff646 100755 --- a/core/images/full-screen-button.tid +++ b/core/images/full-screen-button.tid @@ -1,19 +1,4 @@ title: $:/core/images/full-screen-button tags: $:/tags/Image -<svg class="tc-image-full-screen-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g> - <g> - <path d="M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z"></path> - </g> - <g transform="translate(104.000000, 104.000000) rotate(-180.000000) translate(-104.000000, -104.000000) translate(80.000000, 80.000000)"> - <path d="M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z"></path> - </g> - <g transform="translate(24.000000, 104.000000) rotate(-90.000000) translate(-24.000000, -104.000000) translate(0.000000, 80.000000)"> - <path d="M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z"></path> - </g> - <g transform="translate(104.000000, 24.000000) rotate(90.000000) translate(-104.000000, -24.000000) translate(80.000000, 0.000000)"> - <path d="M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z"></path> - </g> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-full-screen-button tc-image-button" viewBox="0 0 128 128"><path d="M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z"/></svg> \ No newline at end of file diff --git a/core/images/github.tid b/core/images/github.tid index 98d9aeef3..6389f5cdc 100755 --- a/core/images/github.tid +++ b/core/images/github.tid @@ -1,8 +1,4 @@ title: $:/core/images/github tags: $:/tags/Image -<svg class="tc-image-github tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M63.9383506,1.60695328 C28.6017227,1.60695328 -0.055756057,30.2970814 -0.055756057,65.6906208 C-0.055756057,94.003092 18.2804728,118.019715 43.7123154,126.493393 C46.9143781,127.083482 48.0812647,125.104717 48.0812647,123.405261 C48.0812647,121.886765 48.02626,117.85449 47.9948287,112.508284 C30.1929317,116.379268 26.4368926,103.916587 26.4368926,103.916587 C23.5255693,96.5129372 19.3294921,94.5420399 19.3294921,94.5420399 C13.5186324,90.5687739 19.7695302,90.6474524 19.7695302,90.6474524 C26.1933001,91.099854 29.5721638,97.2525155 29.5721638,97.2525155 C35.2808718,107.044059 44.5531024,104.215566 48.1991321,102.575118 C48.7806109,98.4366275 50.4346826,95.612068 52.2616263,94.0109598 C38.0507543,92.3941159 23.1091047,86.8944862 23.1091047,62.3389152 C23.1091047,55.3443933 25.6039634,49.6205298 29.6978889,45.1437211 C29.0378318,43.5229433 26.8415704,37.0044266 30.3265147,28.1845627 C30.3265147,28.1845627 35.6973364,26.4615028 47.9241083,34.7542205 C53.027764,33.330139 58.5046663,32.6220321 63.9462084,32.5944947 C69.3838216,32.6220321 74.856795,33.330139 79.9683085,34.7542205 C92.1872225,26.4615028 97.5501864,28.1845627 97.5501864,28.1845627 C101.042989,37.0044266 98.8467271,43.5229433 98.190599,45.1437211 C102.292382,49.6205298 104.767596,55.3443933 104.767596,62.3389152 C104.767596,86.9574291 89.8023734,92.3744463 75.5482834,93.9598188 C77.8427675,95.9385839 79.8897303,99.8489072 79.8897303,105.828476 C79.8897303,114.392635 79.8111521,121.304544 79.8111521,123.405261 C79.8111521,125.120453 80.966252,127.114954 84.2115327,126.489459 C109.623731,117.996111 127.944244,93.9952241 127.944244,65.6906208 C127.944244,30.2970814 99.2867652,1.60695328 63.9383506,1.60695328"></path> - </g> - </svg> +<svg width="22pt" height="22pt" class="tc-image-github tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084"/></svg> \ No newline at end of file diff --git a/core/images/gitter.tid b/core/images/gitter.tid index 0ac6deb4d..876fc3da1 100644 --- a/core/images/gitter.tid +++ b/core/images/gitter.tid @@ -1,9 +1,4 @@ title: $:/core/images/gitter tags: $:/tags/Image -<svg class="tc-image-gitter tc-image-button" width="22pt" height="22pt" viewBox="0 0 18 25"> - <rect x="15" y="5" width="2" height="10"></rect> - <rect x="10" y="5" width="2" height="20"></rect> - <rect x="5" y="5" width="2" height="20"></rect> - <rect width="2" height="15"></rect> -</svg> +<svg width="22pt" height="22pt" class="tc-image-gitter tc-image-button" viewBox="0 0 18 25"><path d="M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z"/></svg> \ No newline at end of file diff --git a/core/images/globe.tid b/core/images/globe.tid index 02b58e219..9448ed7a4 100755 --- a/core/images/globe.tid +++ b/core/images/globe.tid @@ -1,10 +1,4 @@ title: $:/core/images/globe tags: $:/tags/Image -<svg class="tc-image-globe tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M72.8111354,37.1275855 C72.8111354,37.9789875 72.8111354,38.8303894 72.8111354,39.6817913 C72.8111354,41.8784743 73.7885604,46.5631866 72.8111354,48.5143758 C71.3445471,51.4420595 68.1617327,52.0543531 66.4170946,54.3812641 C65.2352215,55.9575873 61.7987417,64.9821523 62.7262858,67.3005778 C66.6959269,77.2228204 74.26087,70.4881886 80.6887657,76.594328 C81.5527211,77.415037 83.5758191,78.8666631 83.985137,79.8899578 C87.2742852,88.1128283 76.4086873,94.8989524 87.7419325,106.189751 C88.9872885,107.430443 91.555495,102.372895 91.8205061,101.575869 C92.6726866,99.0129203 98.5458765,96.1267309 100.908882,94.5234439 C102.928056,93.1534443 105.782168,91.8557166 107.236936,89.7775886 C109.507391,86.5342557 108.717505,82.2640435 110.334606,79.0328716 C112.473794,74.7585014 114.163418,69.3979002 116.332726,65.0674086 C120.230862,57.2857361 121.054075,67.1596684 121.400359,67.5059523 C121.757734,67.8633269 122.411167,67.5059523 122.916571,67.5059523 C123.011132,67.5059523 124.364019,67.6048489 124.432783,67.5059523 C125.0832,66.5705216 123.390209,49.5852316 123.114531,48.2089091 C121.710578,41.1996597 116.17083,32.4278331 111.249523,27.7092761 C104.975994,21.6942076 104.160516,11.5121686 92.9912146,12.7547535 C92.7872931,12.7774397 87.906794,22.9027026 85.2136766,26.2672064 C81.486311,30.9237934 82.7434931,22.1144904 78.6876623,22.1144904 C78.6065806,22.1144904 77.5045497,22.0107615 77.4353971,22.1144904 C76.8488637,22.9942905 75.9952305,26.0101404 75.1288269,26.5311533 C74.8635477,26.6906793 73.4071369,26.2924966 73.2826811,26.5311533 C71.0401728,30.8313939 81.5394677,28.7427264 79.075427,34.482926 C76.7225098,39.9642538 72.747373,32.4860199 72.747373,43.0434079"></path> - <path d="M44.4668556,7.01044608 C54.151517,13.1403033 45.1489715,19.2084878 47.1611905,23.2253896 C48.8157833,26.5283781 51.4021933,28.6198851 48.8753629,33.038878 C46.8123257,36.6467763 42.0052989,37.0050492 39.251679,39.7621111 C36.2115749,42.8060154 33.7884281,48.7028116 32.4624592,52.6732691 C30.8452419,57.5158356 47.0088721,59.5388126 44.5246867,63.6811917 C43.1386839,65.9923513 37.7785192,65.1466282 36.0880227,63.8791519 C34.9234453,63.0059918 32.4946425,63.3331166 31.6713597,62.0997342 C29.0575851,58.1839669 29.4107339,54.0758543 28.0457962,49.9707786 C27.1076833,47.1493864 21.732611,47.8501656 20.2022714,49.3776393 C19.6790362,49.8998948 19.8723378,51.1703278 19.8723378,51.8829111 C19.8723378,57.1682405 26.9914913,55.1986414 26.9914913,58.3421973 C26.9914913,72.9792302 30.9191897,64.8771867 38.1313873,69.6793121 C48.1678018,76.3618966 45.9763926,76.981595 53.0777543,84.0829567 C56.7511941,87.7563965 60.8192437,87.7689005 62.503478,93.3767069 C64.1046972,98.7081071 53.1759798,98.7157031 50.786754,100.825053 C49.663965,101.816317 47.9736094,104.970571 46.5680513,105.439676 C44.7757187,106.037867 43.334221,105.93607 41.6242359,107.219093 C39.1967302,109.040481 37.7241465,112.151588 37.6034934,112.030935 C35.4555278,109.88297 34.0848666,96.5511248 33.7147244,93.7726273 C33.1258872,89.3524817 28.1241923,88.2337027 26.7275443,84.7420826 C25.1572737,80.8164061 28.2518481,75.223612 25.599097,70.9819941 C19.0797019,60.557804 13.7775712,56.4811506 10.2493953,44.6896152 C9.3074899,41.5416683 13.5912267,38.1609942 15.1264825,35.8570308 C17.0029359,33.0410312 17.7876232,30.0028946 19.8723378,27.2224065 C22.146793,24.1888519 40.8551166,9.46076832 43.8574051,8.63490613 L44.4668556,7.01044608 Z"></path> - <path d="M64,126 C98.2416545,126 126,98.2416545 126,64 C126,29.7583455 98.2416545,2 64,2 C29.7583455,2 2,29.7583455 2,64 C2,98.2416545 29.7583455,126 64,126 Z M64,120 C94.927946,120 120,94.927946 120,64 C120,33.072054 94.927946,8 64,8 C33.072054,8 8,33.072054 8,64 C8,94.927946 33.072054,120 64,120 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-globe tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z"/><path d="M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z"/></g></svg> \ No newline at end of file diff --git a/core/images/heading-1.tid b/core/images/heading-1.tid index 94d57dee9..f8a98123b 100755 --- a/core/images/heading-1.tid +++ b/core/images/heading-1.tid @@ -1,8 +1,4 @@ title: $:/core/images/heading-1 tags: $:/tags/Image -<svg class="tc-image-heading-1 tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M14,30 L27.25,30 L27.25,60.104 L61.7,60.104 L61.7,30 L74.95,30 L74.95,105.684 L61.7,105.684 L61.7,71.552 L27.25,71.552 L27.25,105.684 L14,105.684 L14,30 Z M84.3350766,43.78 C86.8790893,43.78 89.3523979,43.5680021 91.7550766,43.144 C94.1577553,42.7199979 96.3307336,42.0133383 98.2740766,41.024 C100.21742,40.0346617 101.87807,38.7626744 103.256077,37.208 C104.634084,35.6533256 105.535075,33.7453446 105.959077,31.484 L115.817077,31.484 L115.817077,105.684 L102.567077,105.684 L102.567077,53.32 L84.3350766,53.32 L84.3350766,43.78 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-heading-1 tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z"/></svg> \ No newline at end of file diff --git a/core/images/heading-2.tid b/core/images/heading-2.tid index 65b2e3750..ef0022cc6 100755 --- a/core/images/heading-2.tid +++ b/core/images/heading-2.tid @@ -1,8 +1,4 @@ title: $:/core/images/heading-2 tags: $:/tags/Image -<svg class="tc-image-heading-2 tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M125.519077,105.684 L74.8510766,105.684 C74.9217436,99.5359693 76.4057288,94.1653563 79.3030766,89.572 C82.2004244,84.9786437 86.1577182,80.986017 91.1750766,77.594 C93.5777553,75.8273245 96.0863969,74.113675 98.7010766,72.453 C101.315756,70.792325 103.718399,69.0080095 105.909077,67.1 C108.099754,65.1919905 109.901736,63.1250111 111.315077,60.899 C112.728417,58.6729889 113.47041,56.1113478 113.541077,53.214 C113.541077,51.8713266 113.382078,50.4403409 113.064077,48.921 C112.746075,47.4016591 112.127748,45.9883399 111.209077,44.681 C110.290405,43.3736601 109.018418,42.2783377 107.393077,41.395 C105.767735,40.5116622 103.647756,40.07 101.033077,40.07 C98.6303979,40.07 96.6340846,40.5469952 95.0440766,41.501 C93.4540687,42.4550048 92.1820814,43.762325 91.2280766,45.423 C90.2740719,47.083675 89.5674123,49.0446554 89.1080766,51.306 C88.648741,53.5673446 88.3837436,56.0053203 88.3130766,58.62 L76.2290766,58.62 C76.2290766,54.5213128 76.7767378,50.7230175 77.8720766,47.225 C78.9674154,43.7269825 80.610399,40.7060127 82.8010766,38.162 C84.9917542,35.6179873 87.6593942,33.6216739 90.8040766,32.173 C93.948759,30.7243261 97.6057224,30 101.775077,30 C106.297766,30 110.078395,30.7419926 113.117077,32.226 C116.155758,33.7100074 118.611401,35.5826554 120.484077,37.844 C122.356753,40.1053446 123.681739,42.5609868 124.459077,45.211 C125.236414,47.8610133 125.625077,50.3873213 125.625077,52.79 C125.625077,55.7580148 125.165748,58.4433213 124.247077,60.846 C123.328405,63.2486787 122.091751,65.4569899 120.537077,67.471 C118.982402,69.4850101 117.215753,71.3399915 115.237077,73.036 C113.2584,74.7320085 111.209087,76.3219926 109.089077,77.806 C106.969066,79.2900074 104.849087,80.7033266 102.729077,82.046 C100.609066,83.3886734 98.6480856,84.7313266 96.8460766,86.074 C95.0440676,87.4166734 93.47175,88.8123261 92.1290766,90.261 C90.7864032,91.7096739 89.8677458,93.2466585 89.3730766,94.872 L125.519077,94.872 L125.519077,105.684 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-heading-2 tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z"/></svg> \ No newline at end of file diff --git a/core/images/heading-3.tid b/core/images/heading-3.tid index 6899440a7..d706d067b 100755 --- a/core/images/heading-3.tid +++ b/core/images/heading-3.tid @@ -1,8 +1,4 @@ title: $:/core/images/heading-3 tags: $:/tags/Image -<svg class="tc-image-heading-3 tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M94.8850766,62.224 C96.8637532,62.294667 98.8424001,62.1533351 100.821077,61.8 C102.799753,61.4466649 104.566402,60.8283378 106.121077,59.945 C107.675751,59.0616623 108.930072,57.8426744 109.884077,56.288 C110.838081,54.7333256 111.315077,52.8253446 111.315077,50.564 C111.315077,47.3839841 110.237421,44.8400095 108.082077,42.932 C105.926733,41.0239905 103.153094,40.07 99.7610766,40.07 C97.641066,40.07 95.8037511,40.4939958 94.2490766,41.342 C92.6944022,42.1900042 91.4047484,43.3383261 90.3800766,44.787 C89.3554048,46.2356739 88.5957458,47.860991 88.1010766,49.663 C87.6064075,51.465009 87.3944096,53.3199905 87.4650766,55.228 L75.3810766,55.228 C75.5224107,51.623982 76.1937373,48.2850154 77.3950766,45.211 C78.596416,42.1369846 80.2393995,39.4693446 82.3240766,37.208 C84.4087537,34.9466554 86.9350618,33.1800064 89.9030766,31.908 C92.8710915,30.6359936 96.2277246,30 99.9730766,30 C102.870424,30 105.714729,30.4239958 108.506077,31.272 C111.297424,32.1200042 113.806065,33.3566585 116.032077,34.982 C118.258088,36.6073415 120.042403,38.6743208 121.385077,41.183 C122.72775,43.6916792 123.399077,46.5713171 123.399077,49.822 C123.399077,53.5673521 122.551085,56.8356527 120.855077,59.627 C119.159068,62.4183473 116.509095,64.4499936 112.905077,65.722 L112.905077,65.934 C117.145098,66.7820042 120.448731,68.8843166 122.816077,72.241 C125.183422,75.5976835 126.367077,79.6786426 126.367077,84.484 C126.367077,88.017351 125.660417,91.1796527 124.247077,93.971 C122.833736,96.7623473 120.925755,99.129657 118.523077,101.073 C116.120398,103.016343 113.329093,104.517995 110.149077,105.578 C106.969061,106.638005 103.612428,107.168 100.079077,107.168 C95.7683884,107.168 92.005426,106.549673 88.7900766,105.313 C85.5747272,104.076327 82.8894207,102.327345 80.7340766,100.066 C78.5787325,97.8046554 76.9357489,95.0840159 75.8050766,91.904 C74.6744043,88.7239841 74.0737436,85.1906861 74.0030766,81.304 L86.0870766,81.304 C85.9457426,85.8266893 87.0587315,89.5896517 89.4260766,92.593 C91.7934218,95.5963483 95.3443863,97.098 100.079077,97.098 C104.107097,97.098 107.481396,95.9496782 110.202077,93.653 C112.922757,91.3563219 114.283077,88.0880212 114.283077,83.848 C114.283077,80.9506522 113.717749,78.6540085 112.587077,76.958 C111.456404,75.2619915 109.972419,73.9723378 108.135077,73.089 C106.297734,72.2056623 104.230755,71.6580011 101.934077,71.446 C99.6373985,71.2339989 97.2877553,71.163333 94.8850766,71.234 L94.8850766,62.224 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-heading-3 tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z"/></svg> \ No newline at end of file diff --git a/core/images/heading-4.tid b/core/images/heading-4.tid index c30a44692..16d4440db 100755 --- a/core/images/heading-4.tid +++ b/core/images/heading-4.tid @@ -1,8 +1,4 @@ title: $:/core/images/heading-4 tags: $:/tags/Image -<svg class="tc-image-heading-4 tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M8,30 L21.25,30 L21.25,60.104 L55.7,60.104 L55.7,30 L68.95,30 L68.95,105.684 L55.7,105.684 L55.7,71.552 L21.25,71.552 L21.25,105.684 L8,105.684 L8,30 Z M84.5890766,78.548 L107.061077,78.548 L107.061077,45.9 L106.849077,45.9 L84.5890766,78.548 Z M128.049077,88.088 L118.509077,88.088 L118.509077,105.684 L107.061077,105.684 L107.061077,88.088 L75.2610766,88.088 L75.2610766,76.11 L107.061077,31.484 L118.509077,31.484 L118.509077,78.548 L128.049077,78.548 L128.049077,88.088 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-heading-4 tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z"/></svg> \ No newline at end of file diff --git a/core/images/heading-5.tid b/core/images/heading-5.tid index 8e0a7fdc8..8f34b7058 100755 --- a/core/images/heading-5.tid +++ b/core/images/heading-5.tid @@ -1,8 +1,4 @@ title: $:/core/images/heading-5 tags: $:/tags/Image -<svg class="tc-image-heading-5 tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M83.7550766,31.484 L122.127077,31.484 L122.127077,42.296 L92.7650766,42.296 L88.9490766,61.164 L89.1610766,61.376 C90.7864181,59.5386575 92.8533974,58.1430048 95.3620766,57.189 C97.8707558,56.2349952 100.361731,55.758 102.835077,55.758 C106.509762,55.758 109.795729,56.3763272 112.693077,57.613 C115.590424,58.8496729 118.0284,60.5809889 120.007077,62.807 C121.985753,65.0330111 123.487405,67.6653181 124.512077,70.704 C125.536748,73.7426819 126.049077,77.028649 126.049077,80.562 C126.049077,83.5300148 125.572081,86.5863176 124.618077,89.731 C123.664072,92.8756824 122.144754,95.7376538 120.060077,98.317 C117.9754,100.896346 115.30776,103.016325 112.057077,104.677 C108.806394,106.337675 104.919766,107.168 100.397077,107.168 C96.7930586,107.168 93.454092,106.691005 90.3800766,105.737 C87.3060613,104.782995 84.6030883,103.35201 82.2710766,101.444 C79.939065,99.5359905 78.0840835,97.1863473 76.7060766,94.395 C75.3280697,91.6036527 74.5684107,88.3353521 74.4270766,84.59 L86.5110766,84.59 C86.8644117,88.6180201 88.2423979,91.7096559 90.6450766,93.865 C93.0477553,96.0203441 96.2277235,97.098 100.185077,97.098 C102.729089,97.098 104.884401,96.6740042 106.651077,95.826 C108.417752,94.9779958 109.848738,93.8120074 110.944077,92.328 C112.039415,90.8439926 112.816741,89.1126766 113.276077,87.134 C113.735412,85.1553234 113.965077,83.0353446 113.965077,80.774 C113.965077,78.7246564 113.682413,76.763676 113.117077,74.891 C112.55174,73.018324 111.703749,71.3753404 110.573077,69.962 C109.442404,68.5486596 107.976086,67.4180042 106.174077,66.57 C104.372068,65.7219958 102.269755,65.298 99.8670766,65.298 C97.3230639,65.298 94.9380878,65.7749952 92.7120766,66.729 C90.4860655,67.6830048 88.8784149,69.4673203 87.8890766,72.082 L75.8050766,72.082 L83.7550766,31.484 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-heading-5 tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z"/></svg> \ No newline at end of file diff --git a/core/images/heading-6.tid b/core/images/heading-6.tid index 93f7bcfd7..b348c70af 100755 --- a/core/images/heading-6.tid +++ b/core/images/heading-6.tid @@ -1,8 +1,4 @@ title: $:/core/images/heading-6 tags: $:/tags/Image -<svg class="tc-image-heading-6 tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M112.587077,50.246 C112.304409,47.2073181 111.226753,44.751676 109.354077,42.879 C107.481401,41.006324 104.955093,40.07 101.775077,40.07 C99.584399,40.07 97.6940846,40.4763293 96.1040766,41.289 C94.5140687,42.1016707 93.1714154,43.1793266 92.0760766,44.522 C90.9807378,45.8646734 90.0974133,47.401658 89.4260766,49.133 C88.7547399,50.864342 88.2070787,52.6839905 87.7830766,54.592 C87.3590745,56.5000095 87.0587442,58.390324 86.8820766,60.263 C86.7054091,62.135676 86.5464107,63.8846585 86.4050766,65.51 L86.6170766,65.722 C88.2424181,62.7539852 90.4860623,60.5456739 93.3480766,59.097 C96.2100909,57.6483261 99.3017267,56.924 102.623077,56.924 C106.297762,56.924 109.583729,57.5599936 112.481077,58.832 C115.378424,60.1040064 117.834067,61.8529889 119.848077,64.079 C121.862087,66.3050111 123.399071,68.9373181 124.459077,71.976 C125.519082,75.0146819 126.049077,78.300649 126.049077,81.834 C126.049077,85.438018 125.466082,88.7769846 124.300077,91.851 C123.134071,94.9250154 121.455754,97.6103219 119.265077,99.907 C117.074399,102.203678 114.459758,103.987994 111.421077,105.26 C108.382395,106.532006 105.025762,107.168 101.351077,107.168 C95.9097161,107.168 91.4400941,106.16101 87.9420766,104.147 C84.4440591,102.13299 81.6880867,99.3770175 79.6740766,95.879 C77.6600666,92.3809825 76.2644138,88.2823568 75.4870766,83.583 C74.7097394,78.8836432 74.3210766,73.8133605 74.3210766,68.372 C74.3210766,63.9199777 74.7980719,59.4326893 75.7520766,54.91 C76.7060814,50.3873107 78.278399,46.2710186 80.4690766,42.561 C82.6597542,38.8509815 85.5393921,35.8300117 89.1080766,33.498 C92.6767611,31.1659883 97.0757171,30 102.305077,30 C105.273091,30 108.064397,30.4946617 110.679077,31.484 C113.293756,32.4733383 115.608067,33.8513245 117.622077,35.618 C119.636087,37.3846755 121.27907,39.5046543 122.551077,41.978 C123.823083,44.4513457 124.529743,47.2073181 124.671077,50.246 L112.587077,50.246 Z M100.927077,97.098 C103.117754,97.098 105.025735,96.6563378 106.651077,95.773 C108.276418,94.8896623 109.636738,93.7413404 110.732077,92.328 C111.827415,90.9146596 112.640074,89.271676 113.170077,87.399 C113.700079,85.526324 113.965077,83.6006766 113.965077,81.622 C113.965077,79.6433234 113.700079,77.7353425 113.170077,75.898 C112.640074,74.0606575 111.827415,72.4530069 110.732077,71.075 C109.636738,69.6969931 108.276418,68.5840042 106.651077,67.736 C105.025735,66.8879958 103.117754,66.464 100.927077,66.464 C98.736399,66.464 96.8107516,66.8703293 95.1500766,67.683 C93.4894017,68.4956707 92.0937489,69.5909931 90.9630766,70.969 C89.8324043,72.3470069 88.9844128,73.9546575 88.4190766,75.792 C87.8537405,77.6293425 87.5710766,79.5726564 87.5710766,81.622 C87.5710766,83.6713436 87.8537405,85.6146575 88.4190766,87.452 C88.9844128,89.2893425 89.8324043,90.9323261 90.9630766,92.381 C92.0937489,93.8296739 93.4894017,94.9779958 95.1500766,95.826 C96.8107516,96.6740042 98.736399,97.098 100.927077,97.098 L100.927077,97.098 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-heading-6 tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z"/></svg> \ No newline at end of file diff --git a/core/images/help.tid b/core/images/help.tid index 33f924bc4..07167ae93 100755 --- a/core/images/help.tid +++ b/core/images/help.tid @@ -1,8 +1,4 @@ title: $:/core/images/help tags: $:/tags/Image -<svg class="tc-image-help tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M36.0548906,111.44117 C30.8157418,115.837088 20.8865444,118.803477 9.5,118.803477 C7.86465619,118.803477 6.25937294,118.742289 4.69372699,118.624467 C12.612543,115.984876 18.7559465,110.02454 21.0611049,102.609942 C8.74739781,92.845129 1.04940554,78.9359851 1.04940554,63.5 C1.04940554,33.9527659 29.2554663,10 64.0494055,10 C98.8433448,10 127.049406,33.9527659 127.049406,63.5 C127.049406,93.0472341 98.8433448,117 64.0494055,117 C53.9936953,117 44.48824,114.999337 36.0548906,111.44117 L36.0548906,111.44117 Z M71.4042554,77.5980086 C71.406883,77.2865764 71.4095079,76.9382011 71.4119569,76.5610548 C71.4199751,75.3262169 71.4242825,74.0811293 71.422912,72.9158546 C71.4215244,71.736154 71.4143321,70.709635 71.4001396,69.8743525 C71.4078362,68.5173028 71.9951951,67.7870427 75.1273009,65.6385471 C75.2388969,65.5619968 76.2124091,64.8981068 76.5126553,64.6910879 C79.6062455,62.5580654 81.5345849,60.9050204 83.2750652,58.5038955 C85.6146327,55.2762841 86.8327108,51.426982 86.8327108,46.8554323 C86.8327108,33.5625756 76.972994,24.9029551 65.3778484,24.9029551 C54.2752771,24.9029551 42.8794554,34.5115163 41.3121702,47.1975534 C40.9043016,50.4989536 43.2499725,53.50591 46.5513726,53.9137786 C49.8527728,54.3216471 52.8597292,51.9759763 53.2675978,48.6745761 C54.0739246,42.1479456 60.2395837,36.9492759 65.3778484,36.9492759 C70.6427674,36.9492759 74.78639,40.5885487 74.78639,46.8554323 C74.78639,50.4892974 73.6853224,52.008304 69.6746221,54.7736715 C69.4052605,54.9593956 68.448509,55.6118556 68.3131127,55.7047319 C65.6309785,57.5445655 64.0858213,58.803255 62.6123358,60.6352315 C60.5044618,63.2559399 59.3714208,66.3518252 59.3547527,69.9487679 C59.3684999,70.8407274 59.3752803,71.8084521 59.3765995,72.9300232 C59.3779294,74.0607297 59.3737237,75.2764258 59.36589,76.482835 C59.3634936,76.8518793 59.3609272,77.1924914 59.3583633,77.4963784 C59.3568319,77.6778944 59.3556368,77.8074256 59.3549845,77.8730928 C59.3219814,81.1994287 61.9917551,83.9227111 65.318091,83.9557142 C68.644427,83.9887173 71.3677093,81.3189435 71.4007124,77.9926076 C71.4014444,77.9187458 71.402672,77.7856841 71.4042554,77.5980086 Z M65.3778489,102.097045 C69.5359735,102.097045 72.9067994,98.7262189 72.9067994,94.5680944 C72.9067994,90.4099698 69.5359735,87.0391439 65.3778489,87.0391439 C61.2197243,87.0391439 57.8488984,90.4099698 57.8488984,94.5680944 C57.8488984,98.7262189 61.2197243,102.097045 65.3778489,102.097045 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-help tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z"/></svg> \ No newline at end of file diff --git a/core/images/home-button.tid b/core/images/home-button.tid index 5eabf6a98..10c00626a 100755 --- a/core/images/home-button.tid +++ b/core/images/home-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/home-button tags: $:/tags/Image -<svg class="tc-image-home-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M112.9847,119.501583 C112.99485,119.336814 113,119.170705 113,119.003406 L113,67.56802 C116.137461,70.5156358 121.076014,70.4518569 124.133985,67.3938855 C127.25818,64.2696912 127.260618,59.2068102 124.131541,56.0777326 L70.3963143,2.34250601 C68.8331348,0.779326498 66.7828947,-0.000743167069 64.7337457,1.61675364e-05 C62.691312,-0.00409949529 60.6426632,0.777559815 59.077717,2.34250601 L33,28.420223 L33,28.420223 L33,8.00697327 C33,3.58484404 29.4092877,0 25,0 C20.581722,0 17,3.59075293 17,8.00697327 L17,44.420223 L5.3424904,56.0777326 C2.21694607,59.2032769 2.22220878,64.2760483 5.34004601,67.3938855 C8.46424034,70.5180798 13.5271213,70.5205187 16.6561989,67.3914411 L17,67.04764 L17,119.993027 C17,119.994189 17.0000002,119.995351 17.0000007,119.996514 C17.0000002,119.997675 17,119.998838 17,120 C17,124.418278 20.5881049,128 24.9992458,128 L105.000754,128 C109.418616,128 113,124.409288 113,120 C113,119.832611 112.99485,119.666422 112.9847,119.501583 Z M97,112 L97,51.5736087 L97,51.5736087 L64.7370156,19.3106244 L33,51.04764 L33,112 L97,112 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-home-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z"/></svg> \ No newline at end of file diff --git a/core/images/import-button.tid b/core/images/import-button.tid index 54534bb6c..6850513ef 100755 --- a/core/images/import-button.tid +++ b/core/images/import-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/import-button tags: $:/tags/Image -<svg class="tc-image-import-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M105.449437,94.2138951 C105.449437,94.2138951 110.049457,94.1897106 110.049457,99.4026111 C110.049457,104.615512 105.163246,104.615511 105.163246,104.615511 L45.0075072,105.157833 C45.0075072,105.157833 0.367531803,106.289842 0.367532368,66.6449212 C0.367532934,27.0000003 45.0428249,27.0000003 45.0428249,27.0000003 L105.532495,27.0000003 C105.532495,27.0000003 138.996741,25.6734987 138.996741,55.1771866 C138.996741,84.6808745 105.727102,82.8457535 105.727102,82.8457535 L56.1735087,82.8457535 C56.1735087,82.8457535 22.6899229,85.1500223 22.6899229,66.0913753 C22.6899229,47.0327282 56.1735087,49.3383013 56.1735087,49.3383013 L105.727102,49.3383013 C105.727102,49.3383013 111.245209,49.3383024 111.245209,54.8231115 C111.245209,60.3079206 105.727102,60.5074524 105.727102,60.5074524 L56.1735087,60.5074524 C56.1735087,60.5074524 37.48913,60.5074528 37.48913,66.6449195 C37.48913,72.7823862 56.1735087,71.6766023 56.1735087,71.6766023 L105.727102,71.6766029 C105.727102,71.6766029 127.835546,73.1411469 127.835546,55.1771866 C127.835546,35.5304025 105.727102,38.3035317 105.727102,38.3035317 L45.0428249,38.3035317 C45.0428249,38.3035317 11.5287276,38.3035313 11.5287276,66.6449208 C11.5287276,94.9863103 45.0428244,93.9579678 45.0428244,93.9579678 L105.449437,94.2138951 Z" transform="translate(69.367532, 66.000000) rotate(-45.000000) translate(-69.367532, -66.000000) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-import-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z"/></svg> \ No newline at end of file diff --git a/core/images/info-button.tid b/core/images/info-button.tid index 263fe9056..2679a135a 100755 --- a/core/images/info-button.tid +++ b/core/images/info-button.tid @@ -1,12 +1,4 @@ title: $:/core/images/info-button tags: $:/tags/Image -<svg class="tc-image-info-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <g transform="translate(0.049406, 0.000000)"> - <path d="M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z"></path> - <circle cx="64" cy="32" r="8"></circle> - <rect x="56" y="48" width="16" height="56" rx="8"></rect> - </g> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-info-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd" transform="translate(.05)"><path d="M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z"/><circle cx="64" cy="32" r="8"/><rect width="16" height="56" x="56" y="48" rx="8"/></g></svg> \ No newline at end of file diff --git a/core/images/italic.tid b/core/images/italic.tid index f7c46b55c..06aada589 100755 --- a/core/images/italic.tid +++ b/core/images/italic.tid @@ -1,8 +1,4 @@ title: $:/core/images/italic tags: $:/tags/Image -<svg class="tc-image-italic tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <polygon points="66.7114846 0 89.1204482 0 62.4089636 128 40 128"></polygon> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-italic tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M66.711 0h22.41L62.408 128H40z"/></svg> \ No newline at end of file diff --git a/core/images/left-arrow.tid b/core/images/left-arrow.tid index 461aec452..a418581cd 100755 --- a/core/images/left-arrow.tid +++ b/core/images/left-arrow.tid @@ -3,6 +3,4 @@ modified: 20150315235324760 tags: $:/tags/Image title: $:/core/images/left-arrow -<svg class="tc-image-left-arrow tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <path transform="rotate(135, 63.8945, 64.1752)" d="m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25075c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056z"/> -</svg> +<svg width="22pt" height="22pt" class="tc-image-left-arrow tc-image-button" viewBox="0 0 128 128"><path d="M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z"/></svg> \ No newline at end of file diff --git a/core/images/line-width.tid b/core/images/line-width.tid index 1e8854c4e..eb1ad21df 100755 --- a/core/images/line-width.tid +++ b/core/images/line-width.tid @@ -1,9 +1,4 @@ title: $:/core/images/line-width tags: $:/tags/Image -<svg class="tc-image-line-width tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M128,-97 L112.992786,-97 C112.452362,-97 112,-96.5522847 112,-96 C112,-95.4438648 112.444486,-95 112.992786,-95 L128,-95 L128,-97 Z M128,-78.6794919 L111.216185,-88.3696322 C110.748163,-88.6398444 110.132549,-88.4782926 109.856406,-88 C109.578339,-87.5183728 109.741342,-86.9117318 110.216185,-86.6375814 L128,-76.3700908 L128,-78.6794919 Z M78.6794919,-128 L88.3696322,-111.216185 C88.6437826,-110.741342 88.4816272,-110.134474 88,-109.856406 C87.5217074,-109.580264 86.9077936,-109.748163 86.6375814,-110.216185 L76.3700908,-128 L78.6794919,-128 Z M97,-128 L97,-112.992786 C97,-112.444486 96.5561352,-112 96,-112 C95.4477153,-112 95,-112.452362 95,-112.992786 L95,-128 L97,-128 Z M115.629909,-128 L105.362419,-110.216185 C105.088268,-109.741342 104.481627,-109.578339 104,-109.856406 C103.521707,-110.132549 103.360156,-110.748163 103.630368,-111.216185 L113.320508,-128 L115.629909,-128 Z M128,-113.320508 L111.216185,-103.630368 C110.741342,-103.356217 110.134474,-103.518373 109.856406,-104 C109.580264,-104.478293 109.748163,-105.092206 110.216185,-105.362419 L128,-115.629909 L128,-113.320508 Z M48,-96 C48,-96.5522847 48.4523621,-97 48.9927864,-97 L79.0072136,-97 C79.5555144,-97 80,-96.5561352 80,-96 C80,-95.4477153 79.5476379,-95 79.0072136,-95 L48.9927864,-95 C48.4444856,-95 48,-95.4438648 48,-96 Z M54.4307806,-120 C54.706923,-120.478293 55.3225377,-120.639844 55.7905589,-120.369632 L81.7838153,-105.362419 C82.2586577,-105.088268 82.4216611,-104.481627 82.1435935,-104 C81.8674512,-103.521707 81.2518365,-103.360156 80.7838153,-103.630368 L54.7905589,-118.637581 C54.3157165,-118.911732 54.152713,-119.518373 54.4307806,-120 Z M104,-82.1435935 C104.478293,-82.4197359 105.092206,-82.2518365 105.362419,-81.7838153 L120.369632,-55.7905589 C120.643783,-55.3157165 120.481627,-54.7088482 120,-54.4307806 C119.521707,-54.1546382 118.907794,-54.3225377 118.637581,-54.7905589 L103.630368,-80.7838153 C103.356217,-81.2586577 103.518373,-81.865526 104,-82.1435935 Z M96,-80 C96.5522847,-80 97,-79.5476379 97,-79.0072136 L97,-48.9927864 C97,-48.4444856 96.5561352,-48 96,-48 C95.4477153,-48 95,-48.4523621 95,-48.9927864 L95,-79.0072136 C95,-79.5555144 95.4438648,-80 96,-80 Z M88,-82.1435935 C88.4782926,-81.8674512 88.6398444,-81.2518365 88.3696322,-80.7838153 L73.3624186,-54.7905589 C73.0882682,-54.3157165 72.4816272,-54.152713 72,-54.4307806 C71.5217074,-54.706923 71.3601556,-55.3225377 71.6303678,-55.7905589 L86.6375814,-81.7838153 C86.9117318,-82.2586577 87.5183728,-82.4216611 88,-82.1435935 Z M82.1435935,-88 C82.4197359,-87.5217074 82.2518365,-86.9077936 81.7838153,-86.6375814 L55.7905589,-71.6303678 C55.3157165,-71.3562174 54.7088482,-71.5183728 54.4307806,-72 C54.1546382,-72.4782926 54.3225377,-73.0922064 54.7905589,-73.3624186 L80.7838153,-88.3696322 C81.2586577,-88.6437826 81.865526,-88.4816272 82.1435935,-88 Z M1.30626177e-08,-41.9868843 L15.0170091,-57.9923909 L20.7983821,-52.9749272 L44.7207091,-81.2095939 L73.4260467,-42.1002685 L85.984793,-56.6159488 L104.48741,-34.0310661 L127.969109,-47.4978019 L127.969109,7.99473128e-07 L1.30626177e-08,7.99473128e-07 L1.30626177e-08,-41.9868843 Z M96,-84 C102.627417,-84 108,-89.372583 108,-96 C108,-102.627417 102.627417,-108 96,-108 C89.372583,-108 84,-102.627417 84,-96 C84,-89.372583 89.372583,-84 96,-84 Z"></path> - <path d="M16,18 L112,18 C113.104569,18 114,17.1045695 114,16 C114,14.8954305 113.104569,14 112,14 L16,14 C14.8954305,14 14,14.8954305 14,16 C14,17.1045695 14.8954305,18 16,18 L16,18 Z M16,35 L112,35 C114.209139,35 116,33.209139 116,31 C116,28.790861 114.209139,27 112,27 L16,27 C13.790861,27 12,28.790861 12,31 C12,33.209139 13.790861,35 16,35 L16,35 Z M16,56 L112,56 C115.313708,56 118,53.3137085 118,50 C118,46.6862915 115.313708,44 112,44 L16,44 C12.6862915,44 10,46.6862915 10,50 C10,53.3137085 12.6862915,56 16,56 L16,56 Z M16,85 L112,85 C117.522847,85 122,80.5228475 122,75 C122,69.4771525 117.522847,65 112,65 L16,65 C10.4771525,65 6,69.4771525 6,75 C6,80.5228475 10.4771525,85 16,85 L16,85 Z M16,128 L112,128 C120.836556,128 128,120.836556 128,112 C128,103.163444 120.836556,96 112,96 L16,96 C7.163444,96 0,103.163444 0,112 C0,120.836556 7.163444,128 16,128 L16,128 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-line-width tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M128-97h-15.007c-.54 0-.993.448-.993 1 0 .556.444 1 .993 1H128v-2zm0 18.32l-16.784-9.69a1.002 1.002 0 00-1.36.37.994.994 0 00.36 1.362L128-76.37v-2.31zM78.68-128l9.69 16.784a.994.994 0 01-.37 1.36 1.002 1.002 0 01-1.362-.36L76.37-128h2.31zM97-128v15.007a.994.994 0 01-1 .993c-.552 0-1-.452-1-.993V-128h2zm18.63 0l-10.268 17.784a.994.994 0 01-1.362.36 1.002 1.002 0 01-.37-1.36L113.32-128h2.31zM128-113.32l-16.784 9.69a.994.994 0 01-1.36-.37 1.002 1.002 0 01.36-1.362L128-115.63v2.31zM48-96c0-.552.452-1 .993-1h30.014c.549 0 .993.444.993 1 0 .552-.452 1-.993 1H48.993A.994.994 0 0148-96zm6.43-24c.277-.478.893-.64 1.36-.37l25.994 15.008c.475.274.638.88.36 1.362-.277.478-.892.64-1.36.37L54.79-118.638a.994.994 0 01-.36-1.362zM104-82.144a1.002 1.002 0 011.362.36L120.37-55.79a.994.994 0 01-.37 1.36 1.002 1.002 0 01-1.362-.36L103.63-80.784a.994.994 0 01.37-1.36zM96-80c.552 0 1 .452 1 .993v30.014A.994.994 0 0196-48c-.552 0-1-.452-1-.993v-30.014A.994.994 0 0196-80zm-8-2.144c.478.277.64.892.37 1.36L73.362-54.79a.994.994 0 01-1.362.36 1.002 1.002 0 01-.37-1.36l15.008-25.993a.994.994 0 011.362-.36zM82.144-88a1.002 1.002 0 01-.36 1.362L55.79-71.63a.994.994 0 01-1.36-.37 1.002 1.002 0 01.36-1.362L80.784-88.37a.994.994 0 011.36.37zM0-41.987l15.017-16.005 5.781 5.017L44.721-81.21 73.426-42.1l12.559-14.516 18.502 22.585 23.482-13.467V0H0v-41.987zM96-84c6.627 0 12-5.373 12-12s-5.373-12-12-12-12 5.373-12 12 5.373 12 12 12zM16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z"/></g></svg> \ No newline at end of file diff --git a/core/images/link.tid b/core/images/link.tid index 1e094a9b0..395307c42 100644 --- a/core/images/link.tid +++ b/core/images/link.tid @@ -1,9 +1,4 @@ title: $:/core/images/link tags: $:/tags/Image -<svg class="tc-image-link tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M128.719999,57.568543 C130.219553,53.8628171 131.045202,49.8121445 131.045202,45.5685425 C131.045202,27.8915447 116.718329,13.5685425 99.0452364,13.5685425 L67.0451674,13.5685425 C49.3655063,13.5685425 35.0452019,27.8954305 35.0452019,45.5685425 C35.0452019,63.2455403 49.3720745,77.5685425 67.0451674,77.5685425 L99.0452364,77.5685425 C100.406772,77.5685425 101.748384,77.4835732 103.065066,77.3186499 C96.4792444,73.7895096 91.1190212,68.272192 87.7873041,61.5685425 L67.0506214,61.5685425 C58.2110723,61.5685425 51.0452019,54.4070414 51.0452019,45.5685425 C51.0452019,36.7319865 58.2005234,29.5685425 67.0506214,29.5685425 L99.0397824,29.5685425 C107.879331,29.5685425 115.045202,36.7300436 115.045202,45.5685425 C115.045202,48.9465282 113.99957,52.0800164 112.21335,54.6623005 C114.314383,56.4735917 117.050039,57.5685425 120.041423,57.5685425 L128.720003,57.5685425 Z" transform="translate(83.045202, 45.568542) rotate(-225.000000) translate(-83.045202, -45.568542)"></path> - <path d="M-0.106255113,71.0452019 C-1.60580855,74.7509276 -2.43145751,78.8016001 -2.43145751,83.0452019 C-2.43145751,100.7222 11.8954151,115.045202 29.568508,115.045202 L61.568577,115.045202 C79.2482381,115.045202 93.5685425,100.718314 93.5685425,83.0452019 C93.5685425,65.3682041 79.2416699,51.0452019 61.568577,51.0452019 L29.568508,51.0452019 C28.206973,51.0452019 26.8653616,51.1301711 25.5486799,51.2950943 C32.1345,54.8242347 37.4947231,60.3415524 40.8264403,67.0452019 L61.563123,67.0452019 C70.4026721,67.0452019 77.5685425,74.206703 77.5685425,83.0452019 C77.5685425,91.8817579 70.413221,99.0452019 61.563123,99.0452019 L29.573962,99.0452019 C20.7344129,99.0452019 13.5685425,91.8837008 13.5685425,83.0452019 C13.5685425,79.6672162 14.6141741,76.533728 16.4003949,73.9514439 C14.2993609,72.1401527 11.5637054,71.0452019 8.5723215,71.0452019 L-0.106255113,71.0452019 Z" transform="translate(45.568542, 83.045202) rotate(-225.000000) translate(-45.568542, -83.045202)"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-link tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z"/><path d="M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z"/></g></svg> \ No newline at end of file diff --git a/core/images/linkify.tid b/core/images/linkify.tid index 368d27490..40acdc19a 100644 --- a/core/images/linkify.tid +++ b/core/images/linkify.tid @@ -1,4 +1,4 @@ title: $:/core/images/linkify tags: $:/tags/Image -<svg class="tc-linkify-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"><path d="M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z" fill-rule="evenodd"/></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-linkify-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z"/></svg> \ No newline at end of file diff --git a/core/images/list-bullet.tid b/core/images/list-bullet.tid index 7951ad229..322dd4ae6 100755 --- a/core/images/list-bullet.tid +++ b/core/images/list-bullet.tid @@ -1,8 +1,4 @@ title: $:/core/images/list-bullet tags: $:/tags/Image -<svg class="tc-image-list-bullet tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M11.6363636,40.2727273 C18.0629498,40.2727273 23.2727273,35.0629498 23.2727273,28.6363636 C23.2727273,22.2097775 18.0629498,17 11.6363636,17 C5.20977746,17 0,22.2097775 0,28.6363636 C0,35.0629498 5.20977746,40.2727273 11.6363636,40.2727273 Z M11.6363636,75.1818182 C18.0629498,75.1818182 23.2727273,69.9720407 23.2727273,63.5454545 C23.2727273,57.1188684 18.0629498,51.9090909 11.6363636,51.9090909 C5.20977746,51.9090909 0,57.1188684 0,63.5454545 C0,69.9720407 5.20977746,75.1818182 11.6363636,75.1818182 Z M11.6363636,110.090909 C18.0629498,110.090909 23.2727273,104.881132 23.2727273,98.4545455 C23.2727273,92.0279593 18.0629498,86.8181818 11.6363636,86.8181818 C5.20977746,86.8181818 0,92.0279593 0,98.4545455 C0,104.881132 5.20977746,110.090909 11.6363636,110.090909 Z M34.9090909,22.8181818 L128,22.8181818 L128,34.4545455 L34.9090909,34.4545455 L34.9090909,22.8181818 Z M34.9090909,57.7272727 L128,57.7272727 L128,69.3636364 L34.9090909,69.3636364 L34.9090909,57.7272727 Z M34.9090909,92.6363636 L128,92.6363636 L128,104.272727 L34.9090909,104.272727 L34.9090909,92.6363636 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-list-bullet tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z"/></svg> \ No newline at end of file diff --git a/core/images/list-number.tid b/core/images/list-number.tid index 768f16d25..161917823 100755 --- a/core/images/list-number.tid +++ b/core/images/list-number.tid @@ -1,8 +1,4 @@ title: $:/core/images/list-number tags: $:/tags/Image -<svg class="tc-image-list-number tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M33.8390805,22.3563218 L128,22.3563218 L128,34.1264368 L33.8390805,34.1264368 L33.8390805,22.3563218 Z M33.8390805,57.6666667 L128,57.6666667 L128,69.4367816 L33.8390805,69.4367816 L33.8390805,57.6666667 Z M33.8390805,92.9770115 L128,92.9770115 L128,104.747126 L33.8390805,104.747126 L33.8390805,92.9770115 Z M0.379509711,42.6307008 L0.379509711,40.4082314 L1.37821948,40.4082314 C2.20382368,40.4082314 2.82301754,40.268077 3.23581964,39.9877642 C3.64862174,39.7074513 3.85501969,39.0400498 3.85501969,37.9855395 L3.85501969,22.7686318 C3.85501969,21.3270228 3.66193774,20.4327047 3.27576803,20.0856507 C2.88959832,19.7385967 1.79768657,19.5650723 0,19.5650723 L0,17.4226919 C3.50215975,17.2758613 6.25191314,16.4683055 8.24934266,15 L10.3666074,15 L10.3666074,37.865406 C10.3666074,38.786434 10.5164123,39.4404875 10.8160268,39.8275862 C11.1156412,40.2146849 11.764796,40.4082314 12.7635108,40.4082314 L13.7622206,40.4082314 L13.7622206,42.6307008 L0.379509711,42.6307008 Z M0.0798967812,77.9873934 L0.0798967812,76.0852799 C7.27064304,69.5312983 10.8659622,63.5046623 10.8659622,58.005191 C10.8659622,56.4434479 10.5397203,55.195407 9.88722667,54.2610308 C9.23473303,53.3266546 8.36253522,52.8594735 7.27060709,52.8594735 C6.3784219,52.8594735 5.61608107,53.1764892 4.98356173,53.8105302 C4.35104238,54.4445712 4.03478745,55.1753759 4.03478745,56.0029663 C4.03478745,56.9773871 4.28113339,57.8316611 4.77383268,58.5658139 C4.88036225,58.7259926 4.93362624,58.8461249 4.93362624,58.9262143 C4.93362624,59.0730449 4.77383427,59.2065252 4.45424555,59.3266593 C4.2411864,59.4067486 3.70188852,59.6336652 2.83633573,60.0074156 C1.99741533,60.3811661 1.47809145,60.5680386 1.2783485,60.5680386 C1.03865696,60.5680386 0.765679018,60.1976307 0.459406492,59.4568039 C0.153133966,58.715977 0,57.9184322 0,57.0641453 C0,55.1153036 0.848894811,53.5202138 2.5467099,52.2788283 C4.24452499,51.0374428 6.34512352,50.4167594 8.84856852,50.4167594 C11.3120649,50.4167594 13.3793735,51.0874979 15.0505562,52.4289952 C16.7217389,53.7704924 17.5573177,55.5224215 17.5573177,57.684835 C17.5573177,58.9662652 17.2743527,60.2076321 16.7084144,61.4089729 C16.142476,62.6103138 14.7875733,64.4623531 12.6436656,66.9651465 C10.4997579,69.4679398 8.40914641,71.7804862 6.3717683,73.902855 L17.8169822,73.902855 L16.7982982,79.6292176 L14.6810335,79.6292176 C14.7609307,79.3489048 14.8008787,79.0952922 14.8008787,78.8683723 C14.8008787,78.4812736 14.7010087,78.237672 14.5012658,78.1375603 C14.3015228,78.0374485 13.9020429,77.9873934 13.3028141,77.9873934 L0.0798967812,77.9873934 Z M12.2042333,97.1935484 C13.9486551,97.2335931 15.4400468,97.8309175 16.6784531,98.9855395 C17.9168594,100.140162 18.5360532,101.75861 18.5360532,103.840934 C18.5360532,106.830938 17.4041935,109.233584 15.14044,111.048943 C12.8766866,112.864303 10.1402492,113.771969 6.93104577,113.771969 C4.92030005,113.771969 3.26245842,113.388213 1.95747114,112.62069 C0.652483855,111.853166 0,110.848727 0,109.607341 C0,108.833144 0.26964894,108.209124 0.808954909,107.735261 C1.34826088,107.261399 1.93749375,107.024472 2.57667119,107.024472 C3.21584864,107.024472 3.73850152,107.224692 4.14464552,107.625139 C4.55078953,108.025586 4.92696644,108.67964 5.27318756,109.587319 C5.73925445,110.855401 6.51158227,111.489433 7.59019421,111.489433 C8.85523291,111.489433 9.87723568,111.012241 10.6562332,110.057842 C11.4352307,109.103444 11.8247236,107.371536 11.8247236,104.862069 C11.8247236,103.153495 11.7048796,101.838714 11.4651881,100.917686 C11.2254966,99.9966584 10.6728827,99.5361513 9.80732989,99.5361513 C9.22141723,99.5361513 8.62219737,99.843156 8.00965231,100.457175 C7.51695303,100.951059 7.07752513,101.197998 6.69135542,101.197998 C6.3584505,101.197998 6.08880156,101.051169 5.88240051,100.757508 C5.67599946,100.463847 5.57280049,100.183539 5.57280049,99.916574 C5.57280049,99.5962164 5.67599946,99.3225818 5.88240051,99.0956618 C6.08880156,98.8687419 6.57150646,98.5016711 7.33052967,97.9944383 C10.2068282,96.0722929 11.6449559,93.9766521 11.6449559,91.7074527 C11.6449559,90.5194601 11.3386879,89.615131 10.7261429,88.9944383 C10.1135978,88.3737455 9.37455999,88.0634038 8.5090072,88.0634038 C7.71003539,88.0634038 6.98431355,88.3270274 6.33181991,88.8542825 C5.67932627,89.3815377 5.35308434,90.0122321 5.35308434,90.7463849 C5.35308434,91.3871 5.60608828,91.9810874 6.11210376,92.5283648 C6.28521432,92.7285883 6.3717683,92.8954387 6.3717683,93.028921 C6.3717683,93.1490551 5.80250943,93.4560598 4.6639746,93.9499444 C3.52543978,94.4438289 2.80970494,94.6907675 2.51674861,94.6907675 C2.10394651,94.6907675 1.76771758,94.3570667 1.50805174,93.6896552 C1.24838591,93.0222436 1.11855494,92.4082342 1.11855494,91.8476085 C1.11855494,90.0989901 2.04734573,88.6240327 3.90495518,87.4226919 C5.76256463,86.2213511 7.86982116,85.6206897 10.226788,85.6206897 C12.2907985,85.6206897 14.0784711,86.0678487 15.5898594,86.9621802 C17.1012478,87.8565117 17.8569306,89.0778566 17.8569306,90.6262514 C17.8569306,91.987771 17.2876717,93.2491599 16.1491369,94.4104561 C15.0106021,95.5717522 13.6956474,96.4994404 12.2042333,97.1935484 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-list-number tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z"/></svg> \ No newline at end of file diff --git a/core/images/list.tid b/core/images/list.tid index c27a51647..41fdb1894 100644 --- a/core/images/list.tid +++ b/core/images/list.tid @@ -1,9 +1,4 @@ title: $:/core/images/list tags: $:/tags/Image -<svg class="tc-image-list tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M0.719999312,185.568543 C2.21955287,181.862817 3.0452019,177.812144 3.0452019,173.568542 C3.0452019,155.891545 -11.2816707,141.568542 -28.9547636,141.568542 L-60.9548326,141.568542 C-78.6344937,141.568542 -92.9547981,155.895431 -92.9547981,173.568542 C-92.9547981,191.24554 -78.6279255,205.568542 -60.9548326,205.568542 L-28.9547636,205.568542 C-27.593228,205.568542 -26.2516158,205.483573 -24.9349335,205.31865 C-31.5207556,201.78951 -36.8809788,196.272192 -40.2126959,189.568542 L-60.9493786,189.568542 C-69.7889277,189.568542 -76.9547981,182.407041 -76.9547981,173.568542 C-76.9547981,164.731986 -69.7994766,157.568542 -60.9493786,157.568542 L-28.9602176,157.568542 C-20.1206685,157.568542 -12.9547981,164.730044 -12.9547981,173.568542 C-12.9547981,176.946528 -14.0004297,180.080016 -15.7866505,182.6623 C-13.6856165,184.473592 -10.949961,185.568542 -7.9585771,185.568542 L0.720002586,185.568542 Z" transform="translate(-44.954798, 173.568542) rotate(-225.000000) translate(44.954798, -173.568542) "></path> - <path d="M87.7480315,128 L23.9992458,128 C19.5813843,128 16,124.409247 16,119.993027 L16,8.00697327 C16,3.58484404 19.5881049,0 23.9992458,0 L104.000754,0 C108.418616,0 112,3.59075293 112,8.00697327 L112,104 L91.2492027,104 C90.2848199,104 89.410573,104.391703 88.7768998,105.025201 C88.1373658,105.661376 87.7480315,106.53563 87.7480315,107.501171 L87.7480315,128 Z M95.7480315,127.879386 L111.627417,112 L95.7480315,112 L95.7480315,127.879386 Z M40,15.5089165 C40,13.5709954 41.5636015,12 43.4998101,12 L98.5001899,12 C100.433082,12 102,13.5614718 102,15.5089165 L102,16.4910835 C102,18.4290046 100.436399,20 98.5001899,20 L43.4998101,20 C41.5669183,20 40,18.4385282 40,16.4910835 L40,15.5089165 Z M32,22 C35.3137085,22 38,19.3137085 38,16 C38,12.6862915 35.3137085,10 32,10 C28.6862915,10 26,12.6862915 26,16 C26,19.3137085 28.6862915,22 32,22 Z M40,31.5089165 C40,29.5709954 41.5636015,28 43.4998101,28 L98.5001899,28 C100.433082,28 102,29.5614718 102,31.5089165 L102,32.4910835 C102,34.4290046 100.436399,36 98.5001899,36 L43.4998101,36 C41.5669183,36 40,34.4385282 40,32.4910835 L40,31.5089165 Z M40,47.5089165 C40,45.5709954 41.5636015,44 43.4998101,44 L98.5001899,44 C100.433082,44 102,45.5614718 102,47.5089165 L102,48.4910835 C102,50.4290046 100.436399,52 98.5001899,52 L43.4998101,52 C41.5669183,52 40,50.4385282 40,48.4910835 L40,47.5089165 Z M40,63.5089165 C40,61.5709954 41.5636015,60 43.4998101,60 L98.5001899,60 C100.433082,60 102,61.5614718 102,63.5089165 L102,64.4910835 C102,66.4290046 100.436399,68 98.5001899,68 L43.4998101,68 C41.5669183,68 40,66.4385282 40,64.4910835 L40,63.5089165 Z M40,79.5089165 C40,77.5709954 41.5636015,76 43.4998101,76 L98.5001899,76 C100.433082,76 102,77.5614718 102,79.5089165 L102,80.4910835 C102,82.4290046 100.436399,84 98.5001899,84 L43.4998101,84 C41.5669183,84 40,82.4385282 40,80.4910835 L40,79.5089165 Z M40,95.5089165 C40,93.5709954 41.5636015,92 43.4998101,92 L98.5001899,92 C100.433082,92 102,93.5614718 102,95.5089165 L102,96.4910835 C102,98.4290046 100.436399,100 98.5001899,100 L43.4998101,100 C41.5669183,100 40,98.4385282 40,96.4910835 L40,95.5089165 Z M40,111.508916 C40,109.570995 41.5680474,108 43.4972017,108 L76.5027983,108 C78.4342495,108 80,109.561472 80,111.508916 L80,112.491084 C80,114.429005 78.4319526,116 76.5027983,116 L43.4972017,116 C41.5657505,116 40,114.438528 40,112.491084 L40,111.508916 Z M32,38 C35.3137085,38 38,35.3137085 38,32 C38,28.6862915 35.3137085,26 32,26 C28.6862915,26 26,28.6862915 26,32 C26,35.3137085 28.6862915,38 32,38 Z M32,54 C35.3137085,54 38,51.3137085 38,48 C38,44.6862915 35.3137085,42 32,42 C28.6862915,42 26,44.6862915 26,48 C26,51.3137085 28.6862915,54 32,54 Z M32,70 C35.3137085,70 38,67.3137085 38,64 C38,60.6862915 35.3137085,58 32,58 C28.6862915,58 26,60.6862915 26,64 C26,67.3137085 28.6862915,70 32,70 Z M32,86 C35.3137085,86 38,83.3137085 38,80 C38,76.6862915 35.3137085,74 32,74 C28.6862915,74 26,76.6862915 26,80 C26,83.3137085 28.6862915,86 32,86 Z M32,102 C35.3137085,102 38,99.3137085 38,96 C38,92.6862915 35.3137085,90 32,90 C28.6862915,90 26,92.6862915 26,96 C26,99.3137085 28.6862915,102 32,102 Z M32,118 C35.3137085,118 38,115.313708 38,112 C38,108.686292 35.3137085,106 32,106 C28.6862915,106 26,108.686292 26,112 C26,115.313708 28.6862915,118 32,118 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-list tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M-85.737 197.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0l-22.628 22.628a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137zM87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z"/></g></svg> \ No newline at end of file diff --git a/core/images/locked-padlock.tid b/core/images/locked-padlock.tid index 28a6ea986..14d95560c 100755 --- a/core/images/locked-padlock.tid +++ b/core/images/locked-padlock.tid @@ -1,8 +1,4 @@ title: $:/core/images/locked-padlock tags: $:/tags/Image -<svg class="tc-image-locked-padlock tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M96.4723753,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L32.0000269,64 C32.0028554,48.2766389 32.3030338,16.2688026 64.1594984,16.2688041 C95.9543927,16.2688056 96.4648869,48.325931 96.4723753,64 Z M80.5749059,64 L48.4413579,64 C48.4426205,47.71306 48.5829272,31.9999996 64.1595001,31.9999996 C79.8437473,31.9999996 81.1369461,48.1359182 80.5749059,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-locked-padlock tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z"/></svg> \ No newline at end of file diff --git a/core/images/mail.tid b/core/images/mail.tid index 50d39f35f..cf0f4eab7 100755 --- a/core/images/mail.tid +++ b/core/images/mail.tid @@ -1,8 +1,4 @@ title: $:/core/images/mail tags: $:/tags/Image -<svg class="tc-image-mail tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M122.826782,104.894066 C121.945525,105.22777 120.990324,105.41043 119.993027,105.41043 L8.00697327,105.41043 C7.19458381,105.41043 6.41045219,105.289614 5.67161357,105.064967 L5.67161357,105.064967 L39.8346483,70.9019325 L60.6765759,91.7438601 C61.6118278,92.679112 62.8865166,93.0560851 64.0946097,92.8783815 C65.2975108,93.0473238 66.5641085,92.6696979 67.4899463,91.7438601 L88.5941459,70.6396605 C88.6693095,70.7292352 88.7490098,70.8162939 88.8332479,70.9005321 L122.826782,104.894066 Z M127.903244,98.6568194 C127.966933,98.2506602 128,97.8343714 128,97.4103789 L128,33.410481 C128,32.7414504 127.917877,32.0916738 127.763157,31.4706493 L94.2292399,65.0045665 C94.3188145,65.0797417 94.4058701,65.1594458 94.4901021,65.2436778 L127.903244,98.6568194 Z M0.205060636,99.2178117 C0.0709009529,98.6370366 0,98.0320192 0,97.4103789 L0,33.410481 C0,32.694007 0.0944223363,31.9995312 0.27147538,31.3387595 L0.27147538,31.3387595 L34.1777941,65.2450783 L0.205060636,99.2178117 L0.205060636,99.2178117 Z M5.92934613,25.6829218 C6.59211333,25.5051988 7.28862283,25.4104299 8.00697327,25.4104299 L119.993027,25.4104299 C120.759109,25.4104299 121.500064,25.5178649 122.201605,25.7184927 L122.201605,25.7184927 L64.0832611,83.8368368 L5.92934613,25.6829218 L5.92934613,25.6829218 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-mail tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z"/></svg> \ No newline at end of file diff --git a/core/images/menu-button.tid b/core/images/menu-button.tid index b2a9162d6..6d1872e4c 100755 --- a/core/images/menu-button.tid +++ b/core/images/menu-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/menu-button tags: $:/tags/Image -<svg class="tc-image-menu-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <rect x="0" y="16" width="128" height="16" rx="8"></rect> - <rect x="0" y="56" width="128" height="16" rx="8"></rect> - <rect x="0" y="96" width="128" height="16" rx="8"></rect> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-menu-button tc-image-button" viewBox="0 0 128 128"><rect width="128" height="16" y="16" rx="8"/><rect width="128" height="16" y="56" rx="8"/><rect width="128" height="16" y="96" rx="8"/></svg> \ No newline at end of file diff --git a/core/images/mono-block.tid b/core/images/mono-block.tid index 1675e3854..f8695302b 100755 --- a/core/images/mono-block.tid +++ b/core/images/mono-block.tid @@ -1,8 +1,4 @@ title: $:/core/images/mono-block tags: $:/tags/Image -<svg class="tc-image-mono-block tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M23.9653488,32.9670593 L24.3217888,32.9670593 C25.0766067,32.9670593 25.6497006,33.1592554 26.0410876,33.5436534 C26.4324747,33.9280514 26.6281653,34.4906619 26.6281653,35.2315017 C26.6281653,36.0562101 26.4219913,36.6502709 26.009637,37.0137017 C25.5972828,37.3771326 24.9158602,37.5588453 23.9653488,37.5588453 L17.6542639,37.5588453 C16.6897744,37.5588453 16.0048573,37.380627 15.5994921,37.0241852 C15.1941269,36.6677435 14.9914474,36.0701882 14.9914474,35.2315017 C14.9914474,34.4207713 15.1941269,33.8406885 15.5994921,33.4912358 C16.0048573,33.141783 16.6897744,32.9670593 17.6542639,32.9670593 L18.388111,32.9670593 L17.5284616,30.5139133 L8.47069195,30.5139133 L7.5691084,32.9670593 L8.30295547,32.9670593 C9.25346691,32.9670593 9.93488953,33.1452775 10.3472438,33.5017193 C10.759598,33.8581611 10.965772,34.4347494 10.965772,35.2315017 C10.965772,36.0562101 10.759598,36.6502709 10.3472438,37.0137017 C9.93488953,37.3771326 9.25346691,37.5588453 8.30295547,37.5588453 L2.89345418,37.5588453 C1.92896463,37.5588453 1.24404754,37.3771326 0.838682371,37.0137017 C0.433317198,36.6502709 0.230637652,36.0562101 0.230637652,35.2315017 C0.230637652,34.4906619 0.426328248,33.9280514 0.817715312,33.5436534 C1.20910238,33.1592554 1.78219626,32.9670593 2.53701417,32.9670593 L2.89345418,32.9670593 L8.51262607,17.3256331 L6.83526132,17.3256331 C5.88474988,17.3256331 5.20332727,17.1439204 4.79097304,16.7804895 C4.37861882,16.4170587 4.1724448,15.8299869 4.1724448,15.0192565 C4.1724448,14.1945481 4.37861882,13.6004873 4.79097304,13.2370565 C5.20332727,12.8736257 5.88474988,12.691913 6.83526132,12.691913 L14.6979086,12.691913 C15.9419603,12.691913 16.815579,13.3628521 17.318791,14.7047506 L17.318791,14.7676518 L23.9653488,32.9670593 Z M12.9786097,17.3256331 L9.9383861,26.1737321 L16.0188333,26.1737321 L12.9786097,17.3256331 Z M35.3809383,26.6979086 L35.3809383,33.0928616 L38.5259972,33.0928616 C40.7485166,33.0928616 42.3140414,32.8482484 43.2226185,32.3590146 C44.1311956,31.8697807 44.5854773,31.0520736 44.5854773,29.9058686 C44.5854773,28.7456855 44.1521624,27.9209895 43.2855197,27.4317556 C42.4188769,26.9425218 40.9022748,26.6979086 38.7356678,26.6979086 L35.3809383,26.6979086 Z M46.0741385,24.370565 C47.5977525,24.9296893 48.7159844,25.6949794 49.428868,26.666458 C50.1417516,27.6379366 50.498188,28.8784752 50.498188,30.388111 C50.498188,31.6601189 50.1906743,32.8202846 49.5756374,33.8686428 C48.9606006,34.917001 48.0799929,35.7766419 46.933788,36.4475911 C46.2628387,36.8389782 45.5115266,37.1220307 44.6798291,37.296757 C43.8481316,37.4714834 42.6704935,37.5588453 41.1468796,37.5588453 L39.3856466,37.5588453 L30.2020747,37.5588453 C29.2795194,37.5588453 28.6190637,37.3771326 28.2206876,37.0137017 C27.8223114,36.6502709 27.6231264,36.0562101 27.6231264,35.2315017 C27.6231264,34.4906619 27.811828,33.9280514 28.189237,33.5436534 C28.5666459,33.1592554 29.118773,32.9670593 29.8456347,32.9670593 L30.2020747,32.9670593 L30.2020747,17.3256331 L29.8456347,17.3256331 C29.118773,17.3256331 28.5666459,17.1299425 28.189237,16.7385554 C27.811828,16.3471683 27.6231264,15.7740744 27.6231264,15.0192565 C27.6231264,14.2085262 27.8258059,13.6179599 28.2311711,13.24754 C28.6365363,12.8771201 29.2934976,12.691913 30.2020747,12.691913 L39.8469219,12.691913 C42.796303,12.691913 45.0362615,13.2650068 46.5668644,14.4112118 C48.0974674,15.5574168 48.8627574,17.2347648 48.8627574,19.443306 C48.8627574,20.5335986 48.6286276,21.4945792 48.1603609,22.3262767 C47.6920943,23.1579742 46.9966938,23.8393968 46.0741385,24.370565 L46.0741385,24.370565 Z M35.3809383,17.1998307 L35.3809383,22.4835296 L38.2114913,22.4835296 C39.9307988,22.4835296 41.1433816,22.2808501 41.8492761,21.8754849 C42.5551706,21.4701197 42.9081126,20.7852027 42.9081126,19.8207131 C42.9081126,18.912136 42.5901154,18.2481858 41.9541114,17.8288425 C41.3181074,17.4094992 40.2872373,17.1998307 38.8614701,17.1998307 L35.3809383,17.1998307 Z M71.244119,13.3838259 C71.5236812,12.880614 71.8102281,12.5241775 72.1037684,12.3145059 C72.3973087,12.1048342 72.7677231,12 73.2150226,12 C73.8999499,12 74.3856819,12.1817127 74.6722332,12.5451435 C74.9587844,12.9085744 75.1020579,13.5305909 75.1020579,14.4112118 L75.143992,19.8626472 C75.143992,20.8271368 74.9867406,21.4771091 74.6722332,21.8125837 C74.3577257,22.1480584 73.7881263,22.3157932 72.9634178,22.3157932 C72.3763372,22.3157932 71.92555,22.1760142 71.6110425,21.896452 C71.2965351,21.6168898 71.0274605,21.0997075 70.8038107,20.3448896 C70.4403799,19.0169692 69.8602971,18.0629775 69.0635448,17.482886 C68.2667926,16.9027945 67.1625385,16.612753 65.7507494,16.612753 C63.5981206,16.612753 61.9487284,17.3396038 60.8025235,18.7933272 C59.6563185,20.2470506 59.0832246,22.3507245 59.0832246,25.104412 C59.0832246,27.8441215 59.6633074,29.9477954 60.8234905,31.4154969 C61.9836736,32.8831984 63.6400547,33.6170381 65.7926836,33.6170381 C67.2603851,33.6170381 68.878327,33.1278116 70.6465578,32.149344 C72.4147886,31.1708763 73.5295261,30.6816498 73.9908037,30.6816498 C74.53595,30.6816498 74.9937262,30.9122852 75.3641461,31.3735628 C75.734566,31.8348404 75.9197732,32.4079343 75.9197732,33.0928616 C75.9197732,34.3229353 74.836486,35.4831009 72.669879,36.5733935 C70.5032721,37.663686 68.0641285,38.2088241 65.3523753,38.2088241 C61.6901107,38.2088241 58.7267959,36.9997358 56.4623422,34.5815228 C54.1978885,32.1633099 53.0656786,29.0043046 53.0656786,25.104412 C53.0656786,21.3443006 54.2118664,18.22024 56.5042763,15.7321366 C58.7966863,13.2440331 61.7040894,12 65.226573,12 C66.2190187,12 67.1974717,12.1118232 68.1619613,12.3354729 C69.1264508,12.5591227 70.1538264,12.9085702 71.244119,13.3838259 L71.244119,13.3838259 Z M81.4645862,32.9670593 L81.4645862,17.3256331 L81.1081461,17.3256331 C80.3533282,17.3256331 79.7802344,17.1299425 79.3888473,16.7385554 C78.9974602,16.3471683 78.8017696,15.7740744 78.8017696,15.0192565 C78.8017696,14.2085262 79.0114381,13.6179599 79.4307814,13.24754 C79.8501247,12.8771201 80.5280528,12.691913 81.4645862,12.691913 L85.4063933,12.691913 L86.6434498,12.691913 C89.5648747,12.691913 91.7034933,12.8177141 93.0593699,13.06932 C94.4152465,13.320926 95.5684233,13.740263 96.5189347,14.3273436 C98.210286,15.3337675 99.5067362,16.7699967 100.408324,18.6360743 C101.309912,20.5021519 101.7607,22.6582429 101.7607,25.104412 C101.7607,27.6903623 101.247012,29.9512876 100.219621,31.8872557 C99.1922296,33.8232239 97.7350336,35.2874089 95.8479888,36.2798546 C94.9953241,36.7271541 93.9959043,37.0521403 92.8496993,37.2548229 C91.7034944,37.4575055 89.9981906,37.5588453 87.7337369,37.5588453 L85.4063933,37.5588453 L81.4645862,37.5588453 C80.5000966,37.5588453 79.8151795,37.380627 79.4098143,37.0241852 C79.0044492,36.6677435 78.8017696,36.0701882 78.8017696,35.2315017 C78.8017696,34.4906619 78.9974602,33.9280514 79.3888473,33.5436534 C79.7802344,33.1592554 80.3533282,32.9670593 81.1081461,32.9670593 L81.4645862,32.9670593 Z M86.8740874,17.2417648 L86.8740874,32.9670593 L88.0692098,32.9670593 C90.7110725,32.9670593 92.6609895,32.3205814 93.9190194,31.0276063 C95.1770492,29.7346312 95.8060547,27.7462749 95.8060547,25.0624779 C95.8060547,22.4206153 95.1665658,20.4497314 93.8875688,19.1497672 C92.6085718,17.849803 90.6831161,17.1998307 88.1111439,17.1998307 C87.7756693,17.1998307 87.5205727,17.2033252 87.3458463,17.2103142 C87.1711199,17.2173033 87.0138685,17.2277867 86.8740874,17.2417648 L86.8740874,17.2417648 Z M121.94052,17.1159625 L112.190837,17.1159625 L112.190837,22.4835296 L115.88104,22.4835296 L115.88104,22.2319249 C115.88104,21.4351727 116.055763,20.841112 116.405216,20.4497249 C116.754669,20.0583378 117.285829,19.8626472 117.998713,19.8626472 C118.627728,19.8626472 119.141415,20.0408655 119.539792,20.3973072 C119.938168,20.753749 120.137353,21.2045363 120.137353,21.7496826 C120.137353,21.7776388 120.144342,21.8684951 120.15832,22.0222543 C120.172298,22.1760135 120.179287,22.3297704 120.179287,22.4835296 L120.179287,26.8237109 C120.179287,27.7602442 120.011552,28.4311834 119.676077,28.8365486 C119.340603,29.2419138 118.795465,29.4445933 118.040647,29.4445933 C117.327763,29.4445933 116.789614,29.2558917 116.426183,28.8784827 C116.062752,28.5010738 115.88104,27.9419578 115.88104,27.201118 L115.88104,26.8237109 L112.190837,26.8237109 L112.190837,33.0928616 L121.94052,33.0928616 L121.94052,30.5977816 C121.94052,29.6612482 122.118738,28.9903091 122.47518,28.5849439 C122.831622,28.1795787 123.415199,27.9768992 124.225929,27.9768992 C125.022682,27.9768992 125.592281,28.1760842 125.934745,28.5744604 C126.277208,28.9728365 126.448438,29.6472701 126.448438,30.5977816 L126.448438,35.6718099 C126.448438,36.4266278 126.30167,36.9298322 126.008129,37.1814382 C125.714589,37.4330442 125.134506,37.5588453 124.267863,37.5588453 L107.095842,37.5588453 C106.173287,37.5588453 105.512831,37.3771326 105.114455,37.0137017 C104.716079,36.6502709 104.516894,36.0562101 104.516894,35.2315017 C104.516894,34.4906619 104.705595,33.9280514 105.083004,33.5436534 C105.460413,33.1592554 106.01254,32.9670593 106.739402,32.9670593 L107.095842,32.9670593 L107.095842,17.3256331 L106.739402,17.3256331 C106.026518,17.3256331 105.477886,17.126448 105.093488,16.7280719 C104.70909,16.3296957 104.516894,15.7600963 104.516894,15.0192565 C104.516894,14.2085262 104.719573,13.6179599 105.124938,13.24754 C105.530304,12.8771201 106.187265,12.691913 107.095842,12.691913 L124.267863,12.691913 C125.120528,12.691913 125.697116,12.8212085 125.997646,13.0798036 C126.298175,13.3383986 126.448438,13.8520864 126.448438,14.6208824 L126.448438,19.3175037 C126.448438,20.2680151 126.273714,20.9494377 125.924261,21.361792 C125.574808,21.7741462 125.008703,21.9803202 124.225929,21.9803202 C123.415199,21.9803202 122.831622,21.7706517 122.47518,21.3513084 C122.118738,20.9319652 121.94052,20.254037 121.94052,19.3175037 L121.94052,17.1159625 Z M19.7719369,47.6405477 C20.037521,47.1373358 20.3205734,46.7808993 20.6211028,46.5712277 C20.9216322,46.361556 21.295541,46.2567218 21.7428405,46.2567218 C22.4277678,46.2567218 22.9134998,46.4384345 23.2000511,46.8018653 C23.4866023,47.1652962 23.6298758,47.7873127 23.6298758,48.6679336 L23.6718099,54.119369 C23.6718099,55.0838586 23.5145586,55.7338309 23.2000511,56.0693055 C22.8855436,56.4047802 22.3089553,56.572515 21.4702687,56.572515 C20.8831881,56.572515 20.4254119,56.4292415 20.0969263,56.1426902 C19.7684407,55.856139 19.4993662,55.3424512 19.2896945,54.6016114 C18.9122856,53.2597129 18.3322027,52.3022267 17.5494286,51.7291243 C16.7666545,51.1560218 15.6693894,50.8694748 14.2576003,50.8694748 C12.1049715,50.8694748 10.4590738,51.5963256 9.31985785,53.050049 C8.18064193,54.5037724 7.61104252,56.6074463 7.61104252,59.3611338 C7.61104252,62.1148214 8.20859773,64.2429566 9.40372609,65.7456034 C10.5988544,67.2482501 12.2936748,67.9995623 14.488238,67.9995623 C14.9914499,67.9995623 15.5645438,67.9401562 16.2075368,67.8213423 C16.8505299,67.7025283 17.6053364,67.5173212 18.4719792,67.2657152 L18.4719792,63.9529198 L16.1027015,63.9529198 C15.1521901,63.9529198 14.4777564,63.7781961 14.0793803,63.4287433 C13.6810042,63.0792906 13.4818191,62.4992078 13.4818191,61.6884774 C13.4818191,60.8497908 13.6810042,60.2522356 14.0793803,59.8957938 C14.4777564,59.5393521 15.1521901,59.3611338 16.1027015,59.3611338 L23.6718099,59.3611338 C24.6502776,59.3611338 25.3386891,59.5358576 25.7370653,59.8853103 C26.1354414,60.2347631 26.3346265,60.8218348 26.3346265,61.6465433 C26.3346265,62.3873831 26.1354414,62.9569825 25.7370653,63.3553586 C25.3386891,63.7537347 24.7621008,63.9529198 24.0072829,63.9529198 L23.6718099,63.9529198 L23.6718099,68.9430799 L23.6718099,69.1946846 C23.6718099,69.6419841 23.6228873,69.9529924 23.5250405,70.1277188 C23.4271937,70.3024451 23.2315031,70.4806634 22.9379628,70.6623788 C22.1412106,71.1376345 20.8762107,71.5569715 19.1429251,71.9204023 C17.4096396,72.2838332 15.6554131,72.4655459 13.8801932,72.4655459 C10.2179286,72.4655459 7.25461383,71.2564576 4.99016011,68.8382446 C2.72570638,66.4200317 1.59349651,63.2610264 1.59349651,59.3611338 C1.59349651,55.6010224 2.73968428,52.4769618 5.03209423,49.9888583 C7.32450417,47.5007549 10.2319073,46.2567218 13.7543909,46.2567218 C14.7328585,46.2567218 15.7078171,46.368545 16.6792957,46.5921947 C17.6507743,46.8158445 18.6816444,47.165292 19.7719369,47.6405477 L19.7719369,47.6405477 Z M35.611576,51.5823548 L35.611576,56.4047785 L42.4678043,56.4047785 L42.4678043,51.5823548 L42.1323314,51.5823548 C41.3775135,51.5823548 40.8009251,51.3866642 40.402549,50.9952772 C40.0041729,50.6038901 39.8049878,50.0307962 39.8049878,49.2759783 C39.8049878,48.4512699 40.0111618,47.8572091 40.4235161,47.4937783 C40.8358703,47.1303474 41.5172929,46.9486347 42.4678043,46.9486347 L47.8773056,46.9486347 C48.8278171,46.9486347 49.5022507,47.1303474 49.9006269,47.4937783 C50.299003,47.8572091 50.498188,48.4512699 50.498188,49.2759783 C50.498188,50.0307962 50.3059919,50.6038901 49.9215939,50.9952772 C49.5371959,51.3866642 48.9745854,51.5823548 48.2337456,51.5823548 L47.8773056,51.5823548 L47.8773056,67.2237811 L48.2337456,67.2237811 C48.9885636,67.2237811 49.5616574,67.4159772 49.9530445,67.8003752 C50.3444316,68.1847732 50.5401222,68.7473837 50.5401222,69.4882235 C50.5401222,70.3129319 50.3374426,70.9069927 49.9320774,71.2704235 C49.5267123,71.6338543 48.8417952,71.815567 47.8773056,71.815567 L42.4678043,71.815567 C41.5033148,71.815567 40.8183977,71.6373488 40.4130325,71.280907 C40.0076674,70.9244652 39.8049878,70.32691 39.8049878,69.4882235 C39.8049878,68.7473837 40.0041729,68.1847732 40.402549,67.8003752 C40.8009251,67.4159772 41.3775135,67.2237811 42.1323314,67.2237811 L42.4678043,67.2237811 L42.4678043,61.0384986 L35.611576,61.0384986 L35.611576,67.2237811 L35.9470489,67.2237811 C36.7018668,67.2237811 37.2784552,67.4159772 37.6768313,67.8003752 C38.0752074,68.1847732 38.2743925,68.7473837 38.2743925,69.4882235 C38.2743925,70.3129319 38.0682185,70.9069927 37.6558642,71.2704235 C37.24351,71.6338543 36.5620874,71.815567 35.611576,71.815567 L30.2020747,71.815567 C29.2375851,71.815567 28.552668,71.6373488 28.1473029,71.280907 C27.7419377,70.9244652 27.5392581,70.32691 27.5392581,69.4882235 C27.5392581,68.7473837 27.7349487,68.1847732 28.1263358,67.8003752 C28.5177229,67.4159772 29.0908168,67.2237811 29.8456347,67.2237811 L30.2020747,67.2237811 L30.2020747,51.5823548 L29.8456347,51.5823548 C29.1047949,51.5823548 28.5421844,51.3866642 28.1577864,50.9952772 C27.7733884,50.6038901 27.5811923,50.0307962 27.5811923,49.2759783 C27.5811923,48.4512699 27.7803773,47.8572091 28.1787534,47.4937783 C28.5771296,47.1303474 29.2515632,46.9486347 30.2020747,46.9486347 L35.611576,46.9486347 C36.5481093,46.9486347 37.2260374,47.1303474 37.6453807,47.4937783 C38.064724,47.8572091 38.2743925,48.4512699 38.2743925,49.2759783 C38.2743925,50.0307962 38.0752074,50.6038901 37.6768313,50.9952772 C37.2784552,51.3866642 36.7018668,51.5823548 35.9470489,51.5823548 L35.611576,51.5823548 Z M67.365213,51.5823548 L67.365213,67.2237811 L70.887679,67.2237811 C71.8381904,67.2237811 72.519613,67.4019993 72.9319673,67.7584411 C73.3443215,68.1148829 73.5504955,68.6914712 73.5504955,69.4882235 C73.5504955,70.2989538 73.340827,70.8895201 72.9214837,71.25994 C72.5021404,71.6303599 71.8242123,71.815567 70.887679,71.815567 L58.4332458,71.815567 C57.4827343,71.815567 56.8013117,71.6338543 56.3889575,71.2704235 C55.9766033,70.9069927 55.7704292,70.3129319 55.7704292,69.4882235 C55.7704292,68.6774931 55.9731088,68.0974103 56.378474,67.7479575 C56.7838391,67.3985048 57.4687562,67.2237811 58.4332458,67.2237811 L61.9557117,67.2237811 L61.9557117,51.5823548 L58.4332458,51.5823548 C57.4827343,51.5823548 56.8013117,51.4006421 56.3889575,51.0372113 C55.9766033,50.6737805 55.7704292,50.0867087 55.7704292,49.2759783 C55.7704292,48.4512699 55.9731088,47.8641981 56.378474,47.5147453 C56.7838391,47.1652926 57.4687562,46.9905689 58.4332458,46.9905689 L70.887679,46.9905689 C71.8801247,46.9905689 72.5720308,47.1652926 72.9634178,47.5147453 C73.3548049,47.8641981 73.5504955,48.4512699 73.5504955,49.2759783 C73.5504955,50.0867087 73.347816,50.6737805 72.9424508,51.0372113 C72.5370856,51.4006421 71.8521685,51.5823548 70.887679,51.5823548 L67.365213,51.5823548 Z M97.8608265,51.5823548 L97.8608265,63.1771386 L97.8608265,63.5755127 C97.8608265,65.4485794 97.7385199,66.8044357 97.493903,67.6431222 C97.2492861,68.4818088 96.8404325,69.2296264 96.26733,69.8865976 C95.5264902,70.7392623 94.4991146,71.3822457 93.1851723,71.815567 C91.87123,72.2488884 90.2917273,72.4655459 88.4466169,72.4655459 C87.1466527,72.4655459 85.8921362,72.3397448 84.6830298,72.0881388 C83.4739233,71.8365328 82.3102631,71.4591296 81.1920144,70.9559176 C80.5769776,70.6763554 80.175113,70.31293 79.9864085,69.8656305 C79.797704,69.418331 79.7033532,68.6914802 79.7033532,67.6850564 L79.7033532,63.3658422 C79.7033532,62.1637247 79.8780769,61.3250508 80.2275297,60.849795 C80.5769824,60.3745393 81.185021,60.136915 82.0516638,60.136915 C83.2957156,60.136915 83.9806326,61.0524675 84.1064356,62.8835998 C84.1204137,63.2050963 84.1413806,63.4497096 84.1693368,63.6174469 C84.3370741,65.2389076 84.7144774,66.3466561 85.301558,66.9407258 C85.8886386,67.5347954 86.8251579,67.8318258 88.1111439,67.8318258 C89.7046484,67.8318258 90.8263749,67.4089943 91.476357,66.5633187 C92.126339,65.7176431 92.4513252,64.1765796 92.4513252,61.9400821 L92.4513252,51.5823548 L88.9288593,51.5823548 C87.9783478,51.5823548 87.2969252,51.4006421 86.884571,51.0372113 C86.4722168,50.6737805 86.2660427,50.0867087 86.2660427,49.2759783 C86.2660427,48.4512699 86.4652278,47.8641981 86.8636039,47.5147453 C87.26198,47.1652926 87.9503916,46.9905689 88.9288593,46.9905689 L99.6220595,46.9905689 C100.600527,46.9905689 101.288939,47.1652926 101.687315,47.5147453 C102.085691,47.8641981 102.284876,48.4512699 102.284876,49.2759783 C102.284876,50.0867087 102.078702,50.6737805 101.666348,51.0372113 C101.253994,51.4006421 100.572571,51.5823548 99.6220595,51.5823548 L97.8608265,51.5823548 Z M112.505343,51.5823548 L112.505343,57.9353738 L118.984165,51.4565525 C118.257303,51.3726838 117.747109,51.1665098 117.453569,50.8380242 C117.160029,50.5095387 117.013261,49.9888619 117.013261,49.2759783 C117.013261,48.4512699 117.212446,47.8572091 117.610822,47.4937783 C118.009198,47.1303474 118.683632,46.9486347 119.634143,46.9486347 L124.771073,46.9486347 C125.721584,46.9486347 126.396018,47.1303474 126.794394,47.4937783 C127.19277,47.8572091 127.391955,48.4512699 127.391955,49.2759783 C127.391955,50.0447743 127.19277,50.6213627 126.794394,51.0057607 C126.396018,51.3901587 125.812441,51.5823548 125.043645,51.5823548 L124.561402,51.5823548 L118.459988,57.641835 C119.592215,58.4805215 120.626579,59.5812811 121.563113,60.9441468 C122.499646,62.3070125 123.596911,64.400203 124.854941,67.2237811 L125.127513,67.2237811 L125.546854,67.2237811 C126.371563,67.2237811 126.98659,67.4124827 127.391955,67.7898917 C127.79732,68.1673006 128,68.7334056 128,69.4882235 C128,70.3129319 127.793826,70.9069927 127.381472,71.2704235 C126.969118,71.6338543 126.287695,71.815567 125.337183,71.815567 L122.758235,71.815567 C121.626008,71.815567 120.710456,71.0537715 120.01155,69.5301576 C119.885747,69.2505954 119.787902,69.026949 119.718012,68.8592117 C118.795456,66.9022764 117.949793,65.3926632 117.180997,64.3303269 C116.412201,63.2679906 115.510627,62.2965265 114.476247,61.4159056 L112.505343,63.302941 L112.505343,67.2237811 L112.840816,67.2237811 C113.595634,67.2237811 114.172222,67.4159772 114.570599,67.8003752 C114.968975,68.1847732 115.16816,68.7473837 115.16816,69.4882235 C115.16816,70.3129319 114.961986,70.9069927 114.549631,71.2704235 C114.137277,71.6338543 113.455855,71.815567 112.505343,71.815567 L107.095842,71.815567 C106.131352,71.815567 105.446435,71.6373488 105.04107,71.280907 C104.635705,70.9244652 104.433025,70.32691 104.433025,69.4882235 C104.433025,68.7473837 104.628716,68.1847732 105.020103,67.8003752 C105.41149,67.4159772 105.984584,67.2237811 106.739402,67.2237811 L107.095842,67.2237811 L107.095842,51.5823548 L106.739402,51.5823548 C105.998562,51.5823548 105.435952,51.3866642 105.051554,50.9952772 C104.667156,50.6038901 104.474959,50.0307962 104.474959,49.2759783 C104.474959,48.4512699 104.674145,47.8572091 105.072521,47.4937783 C105.470897,47.1303474 106.14533,46.9486347 107.095842,46.9486347 L112.505343,46.9486347 C113.441877,46.9486347 114.119805,47.1303474 114.539148,47.4937783 C114.958491,47.8572091 115.16816,48.4512699 115.16816,49.2759783 C115.16816,50.0307962 114.968975,50.6038901 114.570599,50.9952772 C114.172222,51.3866642 113.595634,51.5823548 112.840816,51.5823548 L112.505343,51.5823548 Z M13.439885,96.325622 L17.4445933,84.4372993 C17.6961993,83.6545252 18.0456468,83.0849258 18.4929463,82.728484 C18.9402458,82.3720422 19.5343065,82.193824 20.2751463,82.193824 L23.5460076,82.193824 C24.496519,82.193824 25.1779416,82.3755367 25.5902958,82.7389675 C26.0026501,83.1023984 26.2088241,83.6964591 26.2088241,84.5211676 C26.2088241,85.2759855 26.009639,85.8490794 25.6112629,86.2404664 C25.2128868,86.6318535 24.6362984,86.8275441 23.8814805,86.8275441 L23.5460076,86.8275441 L24.1330852,102.46897 L24.4895252,102.46897 C25.2443431,102.46897 25.8104481,102.661166 26.187857,103.045564 C26.565266,103.429962 26.7539676,103.992573 26.7539676,104.733413 C26.7539676,105.558121 26.5547826,106.152182 26.1564064,106.515613 C25.7580303,106.879044 25.0835967,107.060756 24.1330852,107.060756 L19.4154969,107.060756 C18.4649855,107.060756 17.7905518,106.882538 17.3921757,106.526096 C16.9937996,106.169654 16.7946145,105.572099 16.7946145,104.733413 C16.7946145,103.992573 16.9868106,103.429962 17.3712086,103.045564 C17.7556066,102.661166 18.325206,102.46897 19.0800239,102.46897 L19.4154969,102.46897 L19.1219581,89.6790642 L16.0607674,99.1981091 C15.8371177,99.9109927 15.5191204,100.42468 15.1067662,100.739188 C14.694412,101.053695 14.1248126,101.210947 13.3979509,101.210947 C12.6710892,101.210947 12.0945008,101.053695 11.6681685,100.739188 C11.2418362,100.42468 10.91685,99.9109927 10.6932002,99.1981091 L7.65297664,89.6790642 L7.35943781,102.46897 L7.69491075,102.46897 C8.44972866,102.46897 9.01932808,102.661166 9.40372609,103.045564 C9.78812409,103.429962 9.98032022,103.992573 9.98032022,104.733413 C9.98032022,105.558121 9.77764067,106.152182 9.3722755,106.515613 C8.96691032,106.879044 8.29597114,107.060756 7.35943781,107.060756 L2.62088241,107.060756 C1.68434908,107.060756 1.01340989,106.879044 0.608044719,106.515613 C0.202679546,106.152182 0,105.558121 0,104.733413 C0,103.992573 0.192196121,103.429962 0.57659413,103.045564 C0.960992139,102.661166 1.53059155,102.46897 2.28540946,102.46897 L2.62088241,102.46897 L3.22892713,86.8275441 L2.89345418,86.8275441 C2.13863627,86.8275441 1.56204791,86.6318535 1.16367179,86.2404664 C0.765295672,85.8490794 0.5661106,85.2759855 0.5661106,84.5211676 C0.5661106,83.6964591 0.772284622,83.1023984 1.18463885,82.7389675 C1.59699308,82.3755367 2.27841569,82.193824 3.22892713,82.193824 L6.49978838,82.193824 C7.22665007,82.193824 7.81022738,82.3685477 8.25053783,82.7180005 C8.69084827,83.0674532 9.05077919,83.6405471 9.33034138,84.4372993 L13.439885,96.325622 Z M43.8935644,98.3803938 L43.8935644,86.8275441 L42.7403761,86.8275441 C41.8178209,86.8275441 41.1573651,86.6458314 40.758989,86.2824006 C40.3606129,85.9189697 40.1614278,85.3318979 40.1614278,84.5211676 C40.1614278,83.7104372 40.3606129,83.119871 40.758989,82.7494511 C41.1573651,82.3790312 41.8178209,82.193824 42.7403761,82.193824 L48.6950209,82.193824 C49.6035981,82.193824 50.2605593,82.3790312 50.6659245,82.7494511 C51.0712897,83.119871 51.2739692,83.7104372 51.2739692,84.5211676 C51.2739692,85.2620074 51.0817731,85.8316068 50.6973751,86.2299829 C50.3129771,86.628359 49.7643445,86.8275441 49.051461,86.8275441 L48.6950209,86.8275441 L48.6950209,105.865634 C48.6950209,106.522605 48.6251315,106.934953 48.4853504,107.10269 C48.3455693,107.270428 48.0310665,107.354295 47.5418327,107.354295 L45.4451268,107.354295 C44.7741775,107.354295 44.3024234,107.284406 44.0298503,107.144625 C43.7572771,107.004843 43.5231473,106.76023 43.3274538,106.410777 L34.6051571,91.0838571 L34.6051571,102.46897 L35.8212466,102.46897 C36.7298237,102.46897 37.379796,102.643694 37.7711831,102.993147 C38.1625701,103.3426 38.3582607,103.922682 38.3582607,104.733413 C38.3582607,105.558121 38.1590757,106.152182 37.7606995,106.515613 C37.3623234,106.879044 36.7158456,107.060756 35.8212466,107.060756 L29.8037005,107.060756 C28.8951234,107.060756 28.2381621,106.879044 27.832797,106.515613 C27.4274318,106.152182 27.2247522,105.558121 27.2247522,104.733413 C27.2247522,103.992573 27.4134539,103.429962 27.7908629,103.045564 C28.1682718,102.661166 28.7273878,102.46897 29.4682276,102.46897 L29.8037005,102.46897 L29.8037005,86.8275441 L29.4682276,86.8275441 C28.755344,86.8275441 28.203217,86.628359 27.8118299,86.2299829 C27.4204428,85.8316068 27.2247522,85.2620074 27.2247522,84.5211676 C27.2247522,83.7104372 27.4309263,83.119871 27.8432805,82.7494511 C28.2556347,82.3790312 28.9091015,82.193824 29.8037005,82.193824 L33.2422983,82.193824 C34.0670067,82.193824 34.6261227,82.3021527 34.919663,82.5188134 C35.2132033,82.7354741 35.5416839,83.1722835 35.9051148,83.8292546 L43.8935644,98.3803938 Z M64.6604624,86.3662688 C62.8572863,86.3662688 61.4420239,87.0931196 60.4146329,88.546843 C59.3872418,90.0005663 58.873554,92.0203728 58.873554,94.6063231 C58.873554,97.1922733 59.3907363,99.2190688 60.4251164,100.68677 C61.4594965,102.154472 62.8712644,102.888312 64.6604624,102.888312 C66.4636385,102.888312 67.8823953,102.157966 68.9167754,100.697254 C69.9511555,99.2365414 70.4683378,97.2062514 70.4683378,94.6063231 C70.4683378,92.0203728 69.95465,90.0005663 68.9272589,88.546843 C67.8998679,87.0931196 66.4776166,86.3662688 64.6604624,86.3662688 L64.6604624,86.3662688 Z M64.6604624,81.501911 C68.0990773,81.501911 70.929602,82.7319662 73.1521214,85.1921135 C75.3746408,87.6522607 76.4858838,90.7902992 76.4858838,94.6063231 C76.4858838,98.4503032 75.3816297,101.595331 73.1730884,104.0415 C70.9645471,106.487669 68.1270335,107.710735 64.6604624,107.710735 C61.2358256,107.710735 58.4053009,106.477185 56.1688034,104.010049 C53.9323059,101.542913 52.8140739,98.4083688 52.8140739,94.6063231 C52.8140739,90.7763211 53.9218224,87.6347881 56.1373528,85.1816299 C58.3528831,82.7284717 61.1938912,81.501911 64.6604624,81.501911 L64.6604624,81.501911 Z M87.4611651,98.1707232 L87.4611651,102.46897 L89.6207722,102.46897 C90.5293493,102.46897 91.1758272,102.643694 91.5602252,102.993147 C91.9446232,103.3426 92.1368193,103.922682 92.1368193,104.733413 C92.1368193,105.558121 91.9411287,106.152182 91.5497417,106.515613 C91.1583546,106.879044 90.5153712,107.060756 89.6207722,107.060756 L82.3661697,107.060756 C81.4436145,107.060756 80.7831587,106.879044 80.3847826,106.515613 C79.9864065,106.152182 79.7872214,105.558121 79.7872214,104.733413 C79.7872214,103.992573 79.9759231,103.429962 80.353332,103.045564 C80.730741,102.661166 81.282868,102.46897 82.0097297,102.46897 L82.3661697,102.46897 L82.3661697,86.8275441 L82.0097297,86.8275441 C81.2968461,86.8275441 80.7482136,86.628359 80.3638155,86.2299829 C79.9794175,85.8316068 79.7872214,85.2620074 79.7872214,84.5211676 C79.7872214,83.7104372 79.989901,83.119871 80.3952661,82.7494511 C80.8006313,82.3790312 81.4575926,82.193824 82.3661697,82.193824 L91.0255652,82.193824 C94.450202,82.193824 97.0396079,82.8507853 98.7938606,84.1647276 C100.548113,85.4786699 101.425227,87.414609 101.425227,89.972603 C101.425227,92.6703781 100.551608,94.7111515 98.8043442,96.0949843 C97.0570805,97.4788171 94.4641801,98.1707232 91.0255652,98.1707232 L87.4611651,98.1707232 Z M87.4611651,86.8275441 L87.4611651,93.4531348 L90.4384875,93.4531348 C92.0879044,93.4531348 93.328443,93.1735768 94.1601405,92.6144525 C94.9918381,92.0553281 95.4076806,91.2166541 95.4076806,90.0984053 C95.4076806,89.0500471 94.9778602,88.2428234 94.1182064,87.67671 C93.2585527,87.1105966 92.031992,86.8275441 90.4384875,86.8275441 L87.4611651,86.8275441 Z M114.727851,107.396229 L113.092421,109.03166 C113.69348,108.835966 114.284046,108.689198 114.864137,108.591352 C115.444229,108.493505 116.013828,108.444582 116.572953,108.444582 C117.677223,108.444582 118.840883,108.608823 120.063968,108.937308 C121.287053,109.265794 122.031376,109.430034 122.29696,109.430034 C122.744259,109.430034 123.327837,109.279772 124.047709,108.979242 C124.767582,108.678713 125.253314,108.52845 125.50492,108.52845 C126.02211,108.52845 126.45193,108.727636 126.794394,109.126012 C127.136858,109.524388 127.308087,110.024098 127.308087,110.625156 C127.308087,111.421909 126.836333,112.099837 125.892811,112.658961 C124.949288,113.218086 123.792617,113.497643 122.422762,113.497643 C121.486229,113.497643 120.28413,113.277492 118.816428,112.837181 C117.348727,112.396871 116.286406,112.176719 115.629435,112.176719 C114.636989,112.176719 113.518757,112.449288 112.274706,112.994434 C111.030654,113.53958 110.261869,113.812149 109.968329,113.812149 C109.36727,113.812149 108.857077,113.612964 108.437734,113.214588 C108.01839,112.816212 107.808722,112.337469 107.808722,111.778345 C107.808722,111.386958 107.941512,110.971115 108.207096,110.530805 C108.47268,110.090494 108.94094,109.520895 109.611889,108.821989 L111.729562,106.683349 C109.395218,105.830685 107.536157,104.29661 106.152324,102.08108 C104.768491,99.8655494 104.076585,97.3180772 104.076585,94.4385866 C104.076585,90.6365409 105.180839,87.5299526 107.389381,85.1187288 C109.597922,82.7075049 112.442425,81.501911 115.922974,81.501911 C119.389545,81.501911 122.227059,82.7109994 124.4356,85.1292123 C126.644141,87.5474252 127.748395,90.650519 127.748395,94.4385866 C127.748395,98.2126762 126.65113,101.322759 124.456567,103.768928 C122.262004,106.215097 119.480402,107.438163 116.111677,107.438163 C115.888028,107.438163 115.660887,107.434669 115.430248,107.42768 C115.199609,107.420691 114.965479,107.410207 114.727851,107.396229 L114.727851,107.396229 Z M115.922974,86.3662688 C114.119798,86.3662688 112.704535,87.0931196 111.677144,88.546843 C110.649753,90.0005663 110.136065,92.0203728 110.136065,94.6063231 C110.136065,97.1922733 110.653248,99.2190688 111.687628,100.68677 C112.722008,102.154472 114.133776,102.888312 115.922974,102.888312 C117.72615,102.888312 119.144907,102.157966 120.179287,100.697254 C121.213667,99.2365414 121.730849,97.2062514 121.730849,94.6063231 C121.730849,92.0203728 121.217161,90.0005663 120.18977,88.546843 C119.162379,87.0931196 117.740128,86.3662688 115.922974,86.3662688 L115.922974,86.3662688 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-mono-block tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z"/></svg> \ No newline at end of file diff --git a/core/images/mono-line.tid b/core/images/mono-line.tid index 81d0faf3f..09cfe513e 100755 --- a/core/images/mono-line.tid +++ b/core/images/mono-line.tid @@ -1,8 +1,4 @@ title: $:/core/images/mono-line tags: $:/tags/Image -<svg class="tc-image-mono-line tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M60.4374591,84.522627 L61.3450888,84.522627 C63.2671377,84.522627 64.7264493,85.0120303 65.7230673,85.9908515 C66.7196852,86.9696727 67.2179868,88.4022896 67.2179868,90.288745 C67.2179868,92.3887615 66.6929905,93.9014625 65.6429823,94.8268935 C64.5929741,95.7523244 62.857817,96.215033 60.4374591,96.215033 L44.3670747,96.215033 C41.9111232,96.215033 40.1670679,95.7612227 39.1348565,94.8535884 C38.102645,93.9459542 37.586547,92.424355 37.586547,90.288745 C37.586547,88.2243221 38.102645,86.747214 39.1348565,85.8573766 C40.1670679,84.9675391 41.9111232,84.522627 44.3670747,84.522627 L46.235724,84.522627 L44.0467348,78.2759992 L20.9822627,78.2759992 L18.6864935,84.522627 L20.5551429,84.522627 C22.9755008,84.522627 24.7106579,84.9764373 25.7606661,85.8840716 C26.8106743,86.7917058 27.3356705,88.2599156 27.3356705,90.288745 C27.3356705,92.3887615 26.8106743,93.9014625 25.7606661,94.8268935 C24.7106579,95.7523244 22.9755008,96.215033 20.5551429,96.215033 L6.78052766,96.215033 C4.32457622,96.215033 2.58052094,95.7523244 1.54830946,94.8268935 C0.516097994,93.9014625 0,92.3887615 0,90.288745 C0,88.4022896 0.498301511,86.9696727 1.49491948,85.9908515 C2.49153745,85.0120303 3.95084902,84.522627 5.87289797,84.522627 L6.78052766,84.522627 L21.0890427,44.6937008 L16.8178442,44.6937008 C14.3974863,44.6937008 12.6623292,44.2309922 11.612321,43.3055613 C10.5623128,42.3801303 10.0373165,40.8852258 10.0373165,38.8208028 C10.0373165,36.7207864 10.5623128,35.2080854 11.612321,34.2826544 C12.6623292,33.3572234 14.3974863,32.8945149 16.8178442,32.8945149 L36.8390873,32.8945149 C40.0069087,32.8945149 42.231469,34.6029772 43.512835,38.0199531 L43.512835,38.180123 L60.4374591,84.522627 Z M32.4611088,44.6937008 L24.7195615,67.224273 L40.2026561,67.224273 L32.4611088,44.6937008 Z M89.5058233,68.5590225 L89.5058233,84.8429669 L97.5143205,84.8429669 C103.173687,84.8429669 107.160099,84.22009 109.473676,82.9743176 C111.787254,81.7285451 112.944025,79.6463566 112.944025,76.7276897 C112.944025,73.7734293 111.840643,71.6734444 109.633846,70.4276719 C107.427049,69.1818994 103.565213,68.5590225 98.0482204,68.5590225 L89.5058233,68.5590225 Z M116.734714,62.6327346 C120.614405,64.0564746 123.461842,66.0051894 125.277111,68.4789376 C127.092379,70.9526857 128,74.1115614 128,77.9556593 C128,81.1946677 127.216955,84.1488838 125.650841,86.8183962 C124.084727,89.4879087 121.84237,91.676876 118.923703,93.385364 C117.215215,94.3819819 115.302093,95.1027395 113.18428,95.5476582 C111.066467,95.9925769 108.06776,96.215033 104.188068,96.215033 L99.7033098,96.215033 L76.3184979,96.215033 C73.9693269,96.215033 72.2875593,95.7523244 71.2731446,94.8268935 C70.2587299,93.9014625 69.7515301,92.3887615 69.7515301,90.288745 C69.7515301,88.4022896 70.2320352,86.9696727 71.1930596,85.9908515 C72.1540841,85.0120303 73.5600062,84.522627 75.4108682,84.522627 L76.3184979,84.522627 L76.3184979,44.6937008 L75.4108682,44.6937008 C73.5600062,44.6937008 72.1540841,44.1953993 71.1930596,43.1987813 C70.2320352,42.2021633 69.7515301,40.7428518 69.7515301,38.8208028 C69.7515301,36.7563799 70.2676281,35.2525771 71.2998396,34.3093494 C72.3320511,33.3661217 74.0049204,32.8945149 76.3184979,32.8945149 L100.877889,32.8945149 C108.388118,32.8945149 114.09189,34.3538264 117.989378,37.2724934 C121.886867,40.1911603 123.835581,44.4623161 123.835581,50.0860889 C123.835581,52.8623819 123.239399,55.3093982 122.047017,57.4272114 C120.854635,59.5450246 119.083885,61.2801816 116.734714,62.6327346 L116.734714,62.6327346 Z M89.5058233,44.3733609 L89.5058233,57.8276363 L96.7134708,57.8276363 C101.091471,57.8276363 104.179161,57.3115383 105.976633,56.2793268 C107.774104,55.2471153 108.672827,53.50306 108.672827,51.0471086 C108.672827,48.7335312 107.863087,47.0428653 106.243583,45.9750604 C104.624078,44.9072554 101.999097,44.3733609 98.3685602,44.3733609 L89.5058233,44.3733609 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-mono-line tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z"/></svg> \ No newline at end of file diff --git a/core/images/new-button.tid b/core/images/new-button.tid index 560d15350..6e592ada9 100755 --- a/core/images/new-button.tid +++ b/core/images/new-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/new-button tags: $:/tags/Image -<svg class="tc-image-new-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M56,72 L8.00697327,72 C3.59075293,72 0,68.418278 0,64 C0,59.5907123 3.58484404,56 8.00697327,56 L56,56 L56,8.00697327 C56,3.59075293 59.581722,0 64,0 C68.4092877,0 72,3.58484404 72,8.00697327 L72,56 L119.993027,56 C124.409247,56 128,59.581722 128,64 C128,68.4092877 124.415156,72 119.993027,72 L72,72 L72,119.993027 C72,124.409247 68.418278,128 64,128 C59.5907123,128 56,124.415156 56,119.993027 L56,72 L56,72 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-new-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z"/></svg> \ No newline at end of file diff --git a/core/images/new-here-button.tid b/core/images/new-here-button.tid index 333265220..ab0f7a6f3 100755 --- a/core/images/new-here-button.tid +++ b/core/images/new-here-button.tid @@ -1,13 +1,4 @@ title: $:/core/images/new-here-button tags: $:/tags/Image -<svg class="tc-image-new-here-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <g transform="translate(52.233611, 64.389922) rotate(75.000000) translate(-52.233611, -64.389922) translate(-7.734417, 3.702450)"> - <path d="M18.9270186,45.959338 L18.9080585,49.6521741 C18.8884833,53.4648378 21.0574548,58.7482162 23.7526408,61.4434022 L78.5671839,116.257945 C81.2617332,118.952495 85.6348701,118.950391 88.3334363,116.251825 L115.863237,88.7220241 C118.555265,86.0299959 118.564544,81.6509578 115.869358,78.9557717 L61.0548144,24.1412286 C58.3602652,21.4466794 53.0787224,19.2788426 49.2595808,19.3006519 L25.9781737,19.4336012 C22.1633003,19.4553862 19.0471195,22.5673232 19.0275223,26.3842526 L18.9871663,34.2443819 C19.0818862,34.255617 19.1779758,34.2665345 19.2754441,34.2771502 C22.6891275,34.6489512 27.0485594,34.2348566 31.513244,33.2285542 C31.7789418,32.8671684 32.075337,32.5211298 32.4024112,32.1940556 C34.8567584,29.7397084 38.3789778,29.0128681 41.4406288,30.0213822 C41.5958829,29.9543375 41.7503946,29.8866669 41.9041198,29.8183808 L42.1110981,30.2733467 C43.1114373,30.6972371 44.0473796,31.3160521 44.8614145,32.1300869 C48.2842088,35.5528813 48.2555691,41.130967 44.7974459,44.5890903 C41.4339531,47.952583 36.0649346,48.0717177 32.6241879,44.9262969 C27.8170558,45.8919233 23.0726921,46.2881596 18.9270186,45.959338 Z"></path> - <path d="M45.4903462,38.8768094 C36.7300141,42.6833154 26.099618,44.7997354 18.1909048,43.9383587 C7.2512621,42.7468685 1.50150083,35.8404432 4.66865776,24.7010202 C7.51507386,14.6896965 15.4908218,6.92103848 24.3842626,4.38423012 C34.1310219,1.60401701 42.4070208,6.15882777 42.4070209,16.3101169 L34.5379395,16.310117 C34.5379394,11.9285862 31.728784,10.3825286 26.5666962,11.8549876 C20.2597508,13.6540114 14.3453742,19.4148216 12.2444303,26.8041943 C10.4963869,32.9523565 12.6250796,35.5092726 19.0530263,36.2093718 C25.5557042,36.9176104 35.0513021,34.9907189 42.7038419,31.5913902 L42.7421786,31.6756595 C44.3874154,31.5384763 47.8846101,37.3706354 45.9274416,38.6772897 L45.9302799,38.6835285 C45.9166992,38.6895612 45.9031139,38.6955897 45.8895238,38.7016142 C45.8389288,38.7327898 45.7849056,38.7611034 45.7273406,38.7863919 C45.6506459,38.8200841 45.571574,38.8501593 45.4903462,38.8768094 Z"></path> - </g> - <rect x="96" y="80" width="16" height="48" rx="8"></rect> - <rect x="80" y="96" width="48" height="16" rx="8"></rect> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-new-here-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z"/><path d="M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z"/><rect width="16" height="48" x="96" y="80" rx="8"/><rect width="48" height="16" x="80" y="96" rx="8"/></g></svg> \ No newline at end of file diff --git a/core/images/new-image-button.tid b/core/images/new-image-button.tid index 5109bf98d..16b63c3c3 100755 --- a/core/images/new-image-button.tid +++ b/core/images/new-image-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/new-image-button tags: $:/tags/Image -<svg class="tc-image-new-image-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M81.3619177,73.6270062 L97.1875317,46.2162388 C97.91364,44.9585822 97.4824378,43.3533085 96.2260476,42.6279312 L46.2162388,13.7547547 C44.9585822,13.0286463 43.3533085,13.4598485 42.6279312,14.7162388 L30.0575956,36.4886988 L40.0978909,31.2276186 C43.1404959,29.6333041 46.8692155,31.3421319 47.6479264,34.6877101 L51.2545483,52.3903732 L61.1353556,53.2399953 C63.2899974,53.4346096 65.1046382,54.9309951 65.706105,57.0091178 C65.7395572,57.1246982 65.8069154,57.3539875 65.9047035,57.6813669 C66.0696435,58.2335608 66.2581528,58.852952 66.4667073,59.5238092 C67.0618822,61.4383079 67.6960725,63.3742727 68.3393254,65.2021174 C68.5462918,65.7902259 68.7511789,66.3583016 68.953259,66.9034738 C69.5777086,68.5881157 70.1617856,70.0172008 70.6783305,71.110045 C70.9334784,71.6498566 71.1627732,72.0871602 71.4035746,72.5373068 C71.6178999,72.7492946 71.9508843,72.9623307 72.4151452,73.1586945 C73.5561502,73.6412938 75.1990755,73.899146 77.0720271,73.9171651 C77.9355886,73.9254732 78.7819239,73.8832103 79.5638842,73.8072782 C80.0123946,73.7637257 80.3172916,73.7224469 80.4352582,73.7027375 C80.7503629,73.6500912 81.0598053,73.6256267 81.3619177,73.6270062 L81.3619177,73.6270062 L81.3619177,73.6270062 L81.3619177,73.6270062 Z M37.4707881,2.64867269 C38.9217993,0.135447653 42.1388058,-0.723707984 44.6486727,0.725364314 L108.293614,37.4707881 C110.806839,38.9217993 111.665994,42.1388058 110.216922,44.6486727 L73.4714982,108.293614 C72.0204871,110.806839 68.8034805,111.665994 66.2936136,110.216922 L2.64867269,73.4714982 C0.135447653,72.0204871 -0.723707984,68.8034805 0.725364314,66.2936136 L37.4707881,2.64867269 L37.4707881,2.64867269 L37.4707881,2.64867269 L37.4707881,2.64867269 Z M80.3080975,53.1397764 C82.8191338,54.5895239 86.0299834,53.7291793 87.4797308,51.218143 C88.9294783,48.7071068 88.0691338,45.4962571 85.5580975,44.0465097 C83.0470612,42.5967622 79.8362116,43.4571068 78.3864641,45.968143 C76.9367166,48.4791793 77.7970612,51.6900289 80.3080975,53.1397764 L80.3080975,53.1397764 L80.3080975,53.1397764 L80.3080975,53.1397764 Z M96,112 L88.0070969,112 C83.5881712,112 80,108.418278 80,104 C80,99.5907123 83.5848994,96 88.0070969,96 L96,96 L96,88.0070969 C96,83.5881712 99.581722,80 104,80 C108.409288,80 112,83.5848994 112,88.0070969 L112,96 L119.992903,96 C124.411829,96 128,99.581722 128,104 C128,108.409288 124.415101,112 119.992903,112 L112,112 L112,119.992903 C112,124.411829 108.418278,128 104,128 C99.5907123,128 96,124.415101 96,119.992903 L96,112 L96,112 Z M33.3471097,51.7910932 C40.7754579,59.7394511 42.3564368,62.4818351 40.7958321,65.1848818 C39.2352273,67.8879286 26.9581062,62.8571718 24.7019652,66.7649227 C22.4458242,70.6726735 23.7947046,70.0228006 22.2648667,72.6725575 L41.9944593,84.0634431 C41.9944593,84.0634431 36.3904568,75.8079231 37.7602356,73.4353966 C40.2754811,69.0788636 46.5298923,72.1787882 48.1248275,69.4162793 C50.538989,65.234829 43.0222016,59.7770885 33.3471097,51.7910932 L33.3471097,51.7910932 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-new-image-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z"/></svg> \ No newline at end of file diff --git a/core/images/new-journal-button.tid b/core/images/new-journal-button.tid index b5be9066f..fb67c8007 100755 --- a/core/images/new-journal-button.tid +++ b/core/images/new-journal-button.tid @@ -1,16 +1,4 @@ title: $:/core/images/new-journal-button tags: $:/tags/Image -<svg class="tc-image-new-journal-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M102.545455,112.818182 L102.545455,124.636364 L102.545455,124.636364 L102.545455,124.636364 C102.545455,125.941761 103.630828,127 104.969697,127 L111.030303,127 C112.369172,127 113.454545,125.941761 113.454545,124.636364 L113.454545,112.818182 L125.575758,112.818182 C126.914626,112.818182 128,111.759982 128,110.454545 L128,104.545455 C128,103.240018 126.914626,102.181818 125.575758,102.181818 L113.454545,102.181818 L113.454545,90.3636364 C113.454545,89.0582 112.369172,88 111.030303,88 L104.969697,88 L104.969697,88 C103.630828,88 102.545455,89.0582 102.545455,90.3636364 L102.545455,102.181818 L90.4242424,102.181818 L90.4242424,102.181818 C89.0853705,102.181818 88,103.240018 88,104.545455 L88,110.454545 L88,110.454545 L88,110.454545 C88,111.759982 89.0853705,112.818182 90.4242424,112.818182 L102.545455,112.818182 Z"></path> - <g transform="translate(59.816987, 64.316987) rotate(30.000000) translate(-59.816987, -64.316987) translate(20.316987, 12.816987)"> - <g transform="translate(0.000000, 0.000000)"> - <path d="M9.99631148,0 C4.4755011,0 -2.27373675e-13,4.48070044 -2.27373675e-13,9.99759461 L-2.27373675e-13,91.6128884 C-2.27373675e-13,97.1344074 4.46966773,101.610483 9.99631148,101.610483 L68.9318917,101.610483 C74.4527021,101.610483 78.9282032,97.1297826 78.9282032,91.6128884 L78.9282032,9.99759461 C78.9282032,4.47607557 74.4585355,0 68.9318917,0 L9.99631148,0 Z M20.8885263,26 C24.2022348,26 26.8885263,23.3137085 26.8885263,20 C26.8885263,16.6862915 24.2022348,14 20.8885263,14 C17.5748178,14 14.8885263,16.6862915 14.8885263,20 C14.8885263,23.3137085 17.5748178,26 20.8885263,26 Z M57.3033321,25.6783342 C60.6170406,25.6783342 63.3033321,22.9920427 63.3033321,19.6783342 C63.3033321,16.3646258 60.6170406,13.6783342 57.3033321,13.6783342 C53.9896236,13.6783342 51.3033321,16.3646258 51.3033321,19.6783342 C51.3033321,22.9920427 53.9896236,25.6783342 57.3033321,25.6783342 Z"></path> - <text class="tc-fill-background" font-family="Helvetica" font-size="47.1724138" font-weight="bold"> - <tspan x="42" y="77.4847912" text-anchor="middle"><<now "DD">></tspan> - </text> - </g> - </g> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-new-journal-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z"/><text class="tc-fill-background" font-family="Helvetica" font-size="47.172" font-weight="bold" transform="rotate(30 25.742 95.82)"><tspan x="42" y="77.485" text-anchor="middle"><<now "DD">></tspan></text></g></svg> \ No newline at end of file diff --git a/core/images/opacity.tid b/core/images/opacity.tid index e9bb732e1..e9a29aea2 100755 --- a/core/images/opacity.tid +++ b/core/images/opacity.tid @@ -1,10 +1,4 @@ title: $:/core/images/opacity tags: $:/tags/Image -<svg class="tc-image-opacity tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M102.361773,65 C101.833691,67.051742 101.183534,69.0544767 100.419508,71 L82.5835324,71 C83.7602504,69.1098924 84.7666304,67.1027366 85.581205,65 L102.361773,65 Z M102.834311,63 C103.256674,61.0388326 103.568427,59.0365486 103.762717,57 L87.6555706,57 C87.3692052,59.0609452 86.9083652,61.0660782 86.2884493,63 L102.834311,63 Z M99.5852583,73 C98.6682925,75.0747721 97.6196148,77.0783056 96.4498253,79 L75.8124196,79 C77.8387053,77.2115633 79.6621163,75.1985844 81.2437158,73 L99.5852583,73 Z M95.1689122,81 C93.7449202,83.1155572 92.1695234,85.1207336 90.458251,87 L60.4614747,87 C65.1836162,85.86248 69.5430327,83.794147 73.3347255,81 L95.1689122,81 Z M87.6555706,47 L103.762717,47 C101.246684,20.6269305 79.0321807,0 52,0 C23.281193,0 0,23.281193 0,52 C0,77.2277755 17.9651296,98.2595701 41.8000051,103 L62.1999949,103 C67.8794003,101.870444 73.2255333,99.8158975 78.074754,97 L39,97 L39,95 L81.2493857,95 C83.8589242,93.2215015 86.2981855,91.2116653 88.5376609,89 L39,89 L39,87 L43.5385253,87 C27.7389671,83.1940333 16,68.967908 16,52 C16,32.117749 32.117749,16 52,16 C70.1856127,16 85.2217929,29.4843233 87.6555706,47 Z M87.8767787,49 L103.914907,49 C103.971379,49.9928025 104,50.9930589 104,52 C104,53.0069411 103.971379,54.0071975 103.914907,55 L87.8767787,55 C87.958386,54.0107999 88,53.0102597 88,52 C88,50.9897403 87.958386,49.9892001 87.8767787,49 Z"></path> - <path d="M76,128 C104.718807,128 128,104.718807 128,76 C128,47.281193 104.718807,24 76,24 C47.281193,24 24,47.281193 24,76 C24,104.718807 47.281193,128 76,128 L76,128 Z M76,112 C95.882251,112 112,95.882251 112,76 C112,56.117749 95.882251,40 76,40 C56.117749,40 40,56.117749 40,76 C40,95.882251 56.117749,112 76,112 L76,112 Z"></path> - <path d="M37,58 L90,58 L90,62 L37,62 L37,58 L37,58 Z M40,50 L93,50 L93,54 L40,54 L40,50 L40,50 Z M40,42 L93,42 L93,46 L40,46 L40,42 L40,42 Z M32,66 L85,66 L85,70 L32,70 L32,66 L32,66 Z M30,74 L83,74 L83,78 L30,78 L30,74 L30,74 Z M27,82 L80,82 L80,86 L27,86 L27,82 L27,82 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-opacity tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z"/><path d="M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z"/><path d="M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z"/></g></svg> \ No newline at end of file diff --git a/core/images/open-window.tid b/core/images/open-window.tid index 337c582a1..14b556484 100755 --- a/core/images/open-window.tid +++ b/core/images/open-window.tid @@ -1,9 +1,4 @@ title: $:/core/images/open-window tags: $:/tags/Image -<svg class="tc-image-open-window tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M16,112 L104.993898,112 C108.863261,112 112,115.590712 112,120 C112,124.418278 108.858091,128 104.993898,128 L7.00610161,128 C3.13673853,128 0,124.409288 0,120 C0,119.998364 4.30952878e-07,119.996727 1.29273572e-06,119.995091 C4.89579306e-07,119.993456 0,119.99182 0,119.990183 L0,24.0098166 C0,19.586117 3.59071231,16 8,16 C12.418278,16 16,19.5838751 16,24.0098166 L16,112 Z"></path> - <path d="M96,43.1959595 L96,56 C96,60.418278 99.581722,64 104,64 C108.418278,64 112,60.418278 112,56 L112,24 C112,19.5907123 108.415101,16 103.992903,16 L72.0070969,16 C67.5881712,16 64,19.581722 64,24 C64,28.4092877 67.5848994,32 72.0070969,32 L84.5685425,32 L48.2698369,68.2987056 C45.1421332,71.4264093 45.1434327,76.4904296 48.267627,79.614624 C51.3854642,82.7324612 56.4581306,82.7378289 59.5835454,79.6124141 L96,43.1959595 Z M32,7.9992458 C32,3.58138434 35.5881049,0 39.9992458,0 L120.000754,0 C124.418616,0 128,3.5881049 128,7.9992458 L128,88.0007542 C128,92.4186157 124.411895,96 120.000754,96 L39.9992458,96 C35.5813843,96 32,92.4118951 32,88.0007542 L32,7.9992458 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-open-window tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z"/><path d="M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z"/></g></svg> \ No newline at end of file diff --git a/core/images/options-button.tid b/core/images/options-button.tid index 6b00b23f9..bd0ffcb1a 100755 --- a/core/images/options-button.tid +++ b/core/images/options-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/options-button tags: $:/tags/Image -<svg class="tc-image-options-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M110.48779,76.0002544 C109.354214,80.4045063 107.611262,84.5641217 105.354171,88.3838625 L105.354171,88.3838625 L112.07833,95.1080219 C115.20107,98.2307613 115.210098,103.299824 112.089164,106.420759 L106.420504,112.089418 C103.301049,115.208874 98.2346851,115.205502 95.1077675,112.078585 L88.3836082,105.354425 C84.5638673,107.611516 80.4042519,109.354468 76,110.488045 L76,110.488045 L76,119.993281 C76,124.409501 72.4220153,128.000254 68.0083475,128.000254 L59.9916525,128.000254 C55.5800761,128.000254 52,124.41541 52,119.993281 L52,110.488045 C47.5957481,109.354468 43.4361327,107.611516 39.6163918,105.354425 L32.8922325,112.078585 C29.7694931,115.201324 24.7004301,115.210353 21.5794957,112.089418 L15.9108363,106.420759 C12.7913807,103.301303 12.7947522,98.2349395 15.9216697,95.1080219 L22.6458291,88.3838625 C20.3887383,84.5641217 18.6457859,80.4045063 17.5122098,76.0002544 L8.00697327,76.0002544 C3.59075293,76.0002544 2.19088375e-16,72.4222697 4.89347582e-16,68.0086019 L9.80228577e-16,59.9919069 C1.25035972e-15,55.5803305 3.58484404,52.0002544 8.00697327,52.0002544 L17.5122098,52.0002544 C18.6457859,47.5960025 20.3887383,43.4363871 22.6458291,39.6166462 L15.9216697,32.8924868 C12.7989304,29.7697475 12.7899019,24.7006845 15.9108363,21.5797501 L21.5794957,15.9110907 C24.6989513,12.7916351 29.7653149,12.7950065 32.8922325,15.9219241 L39.6163918,22.6460835 C43.4361327,20.3889927 47.5957481,18.6460403 52,17.5124642 L52,8.00722764 C52,3.5910073 55.5779847,0.000254375069 59.9916525,0.000254375069 L68.0083475,0.000254375069 C72.4199239,0.000254375069 76,3.58509841 76,8.00722764 L76,17.5124642 C80.4042519,18.6460403 84.5638673,20.3889927 88.3836082,22.6460835 L95.1077675,15.9219241 C98.2305069,12.7991848 103.29957,12.7901562 106.420504,15.9110907 L112.089164,21.5797501 C115.208619,24.6992057 115.205248,29.7655693 112.07833,32.8924868 L105.354171,39.6166462 L105.354171,39.6166462 C107.611262,43.4363871 109.354214,47.5960025 110.48779,52.0002544 L119.993027,52.0002544 C124.409247,52.0002544 128,55.5782391 128,59.9919069 L128,68.0086019 C128,72.4201783 124.415156,76.0002544 119.993027,76.0002544 L110.48779,76.0002544 L110.48779,76.0002544 Z M64,96.0002544 C81.673112,96.0002544 96,81.6733664 96,64.0002544 C96,46.3271424 81.673112,32.0002544 64,32.0002544 C46.326888,32.0002544 32,46.3271424 32,64.0002544 C32,81.6733664 46.326888,96.0002544 64,96.0002544 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-options-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z"/></svg> \ No newline at end of file diff --git a/core/images/paint.tid b/core/images/paint.tid index c6dcab834..bb536b53a 100755 --- a/core/images/paint.tid +++ b/core/images/paint.tid @@ -1,8 +1,4 @@ title: $:/core/images/paint tags: $:/tags/Image -<svg class="tc-image-paint tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M83.5265806,76.1907935 C90.430962,69.2864121 91.8921169,59.0000433 87.9100453,50.6642209 L125.812763,12.7615036 C128.732035,9.84223095 128.72611,5.10322984 125.812796,2.18991592 C122.893542,-0.729338085 118.161775,-0.730617045 115.241209,2.18994966 L77.3384914,40.092667 C69.002669,36.1105954 58.7163002,37.5717503 51.8119188,44.4761317 L83.5265806,76.1907935 L83.5265806,76.1907935 L83.5265806,76.1907935 L83.5265806,76.1907935 Z M80.8836921,78.8336819 L49.1690303,47.1190201 C49.1690303,47.1190201 8.50573364,81.242543 0,80.2820711 C0,80.2820711 3.78222974,85.8744423 6.82737483,88.320684 C20.8514801,82.630792 44.1526049,63.720771 44.1526049,63.720771 L44.8144806,64.3803375 C44.8144806,64.3803375 19.450356,90.2231043 9.18040433,92.0477601 C10.4017154,93.4877138 13.5343883,96.1014812 15.4269991,97.8235871 C20.8439164,96.3356979 50.1595367,69.253789 50.1595367,69.253789 L50.8214124,69.9133555 L18.4136144,100.936036 L23.6993903,106.221812 L56.1060358,75.2002881 L56.7679115,75.8598546 C56.7679115,75.8598546 28.9040131,106.396168 28.0841366,108.291555 C28.0841366,108.291555 34.1159238,115.144621 35.6529617,116.115796 C36.3545333,113.280171 63.5365402,82.6307925 63.5365402,82.6307925 L64.1984159,83.290359 C64.1984159,83.290359 43.6013016,107.04575 39.2343772,120.022559 C42.443736,123.571575 46.7339155,125.159692 50.1595362,126.321151 C47.9699978,114.504469 80.8836921,78.8336819 80.8836921,78.8336819 L80.8836921,78.8336819 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-paint tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z"/></svg> \ No newline at end of file diff --git a/core/images/palette.tid b/core/images/palette.tid index 083769bb6..d605fd853 100755 --- a/core/images/palette.tid +++ b/core/images/palette.tid @@ -1,8 +1,4 @@ title: $:/core/images/palette tags: $:/tags/Image -<svg class="tc-image-palette tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M80.2470434,39.1821571 C75.0645698,38.2680897 69.6261555,37.7814854 64.0193999,37.7814854 C28.6624616,37.7814854 0,57.1324214 0,81.0030106 C0,90.644534 4.67604329,99.5487133 12.5805659,106.738252 C23.5031767,91.1899067 26.3405471,72.3946229 36.8885698,63.5622337 C52.0716764,50.8486559 63.4268694,55.7343343 63.4268694,55.7343343 L80.2470434,39.1821571 Z M106.781666,48.8370714 C119.830962,56.749628 128.0388,68.229191 128.0388,81.0030106 C128.0388,90.3534932 128.557501,98.4142085 116.165191,106.082518 C105.367708,112.763955 112.341384,99.546808 104.321443,95.1851533 C96.3015017,90.8234987 84.3749007,96.492742 86.1084305,103.091059 C89.3087234,115.272303 105.529892,114.54645 92.4224435,119.748569 C79.3149955,124.950687 74.2201582,124.224536 64.0193999,124.224536 C56.1979176,124.224536 48.7040365,123.277578 41.7755684,121.544216 C51.620343,117.347916 69.6563669,109.006202 75.129737,102.088562 C82.7876655,92.4099199 87.3713218,80.0000002 83.3235694,72.4837191 C83.1303943,72.1250117 94.5392656,60.81569 106.781666,48.8370714 Z M1.13430476,123.866563 C0.914084026,123.867944 0.693884185,123.868637 0.473712455,123.868637 C33.9526848,108.928928 22.6351223,59.642592 59.2924543,59.6425917 C59.6085574,61.0606542 59.9358353,62.5865065 60.3541977,64.1372318 C34.4465025,59.9707319 36.7873124,112.168427 1.13429588,123.866563 L1.13430476,123.866563 Z M1.84669213,123.859694 C40.7185279,123.354338 79.9985412,101.513051 79.9985401,79.0466836 C70.7284906,79.0466835 65.9257264,75.5670082 63.1833375,71.1051511 C46.585768,64.1019718 32.81846,116.819636 1.84665952,123.859695 L1.84669213,123.859694 Z M67.1980193,59.8524981 C62.748213,63.9666823 72.0838429,76.2846822 78.5155805,71.1700593 C89.8331416,59.8524993 112.468264,37.2173758 123.785825,25.8998146 C135.103386,14.5822535 123.785825,3.26469247 112.468264,14.5822535 C101.150703,25.8998144 78.9500931,48.9868127 67.1980193,59.8524981 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-palette tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z"/></svg> \ No newline at end of file diff --git a/core/images/permalink-button.tid b/core/images/permalink-button.tid index 28f1223a0..e8fd0aecd 100755 --- a/core/images/permalink-button.tid +++ b/core/images/permalink-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/permalink-button tags: $:/tags/Image -<svg class="tc-image-permalink-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M80.4834582,48 L73.0956761,80 L73.0956761,80 L47.5165418,80 L54.9043239,48 L80.4834582,48 Z M84.1773493,32 L89.8007299,7.64246248 C90.7941633,3.33942958 95.0918297,0.64641956 99.3968675,1.64031585 C103.693145,2.63218977 106.385414,6.93288901 105.390651,11.2416793 L100.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L96.9043239,48 L89.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L85.8226507,96 L80.1992701,120.357538 C79.2058367,124.66057 74.9081703,127.35358 70.6031325,126.359684 C66.3068546,125.36781 63.6145865,121.067111 64.6093491,116.758321 L69.401785,96 L43.8226507,96 L38.1992701,120.357538 C37.2058367,124.66057 32.9081703,127.35358 28.6031325,126.359684 C24.3068546,125.36781 21.6145865,121.067111 22.6093491,116.758321 L27.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L31.0956761,80 L38.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L42.1773493,32 L47.8007299,7.64246248 C48.7941633,3.33942958 53.0918297,0.64641956 57.3968675,1.64031585 C61.6931454,2.63218977 64.3854135,6.93288901 63.3906509,11.2416793 L58.598215,32 L84.1773493,32 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-permalink-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z"/></svg> \ No newline at end of file diff --git a/core/images/permaview-button.tid b/core/images/permaview-button.tid index a501f6f6f..b2ad9a408 100755 --- a/core/images/permaview-button.tid +++ b/core/images/permaview-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/permaview-button tags: $:/tags/Image -<svg class="tc-image-permaview-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M81.4834582,48 L79.6365127,56 L79.6365127,56 L74.0573784,56 L75.9043239,48 L81.4834582,48 Z M85.1773493,32 L90.8007299,7.64246248 C91.7941633,3.33942958 96.0918297,0.64641956 100.396867,1.64031585 C104.693145,2.63218977 107.385414,6.93288901 106.390651,11.2416793 L101.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L97.9043239,48 L96.0573784,56 L104.000754,56 C108.411895,56 112,59.581722 112,64 C112,68.4092877 108.418616,72 104.000754,72 L92.3634873,72 L90.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L86.8226507,96 L81.1992701,120.357538 C80.2058367,124.66057 75.9081703,127.35358 71.6031325,126.359684 C67.3068546,125.36781 64.6145865,121.067111 65.6093491,116.758321 L70.401785,96 L64.8226507,96 L59.1992701,120.357538 C58.2058367,124.66057 53.9081703,127.35358 49.6031325,126.359684 C45.3068546,125.36781 42.6145865,121.067111 43.6093491,116.758321 L48.401785,96 L42.8226507,96 L37.1992701,120.357538 C36.2058367,124.66057 31.9081703,127.35358 27.6031325,126.359684 C23.3068546,125.36781 20.6145865,121.067111 21.6093491,116.758321 L26.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L30.0956761,80 L31.9426216,72 L23.9992458,72 C19.5881049,72 16,68.418278 16,64 C16,59.5907123 19.5813843,56 23.9992458,56 L35.6365127,56 L37.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L41.1773493,32 L46.8007299,7.64246248 C47.7941633,3.33942958 52.0918297,0.64641956 56.3968675,1.64031585 C60.6931454,2.63218977 63.3854135,6.93288901 62.3906509,11.2416793 L57.598215,32 L63.1773493,32 L68.8007299,7.64246248 C69.7941633,3.33942958 74.0918297,0.64641956 78.3968675,1.64031585 C82.6931454,2.63218977 85.3854135,6.93288901 84.3906509,11.2416793 L79.598215,32 L85.1773493,32 Z M53.9043239,48 L52.0573784,56 L57.6365127,56 L59.4834582,48 L53.9043239,48 Z M75.9426216,72 L74.0956761,80 L74.0956761,80 L68.5165418,80 L70.3634873,72 L75.9426216,72 L75.9426216,72 Z M48.3634873,72 L46.5165418,80 L52.0956761,80 L53.9426216,72 L48.3634873,72 L48.3634873,72 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-permaview-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z"/></svg> \ No newline at end of file diff --git a/core/images/picture.tid b/core/images/picture.tid index 71d2bf1a6..7d035e2fc 100755 --- a/core/images/picture.tid +++ b/core/images/picture.tid @@ -1,8 +1,4 @@ title: $:/core/images/picture tags: $:/tags/Image -<svg class="tc-image-picture tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M112,68.2332211 L112,20.0027785 C112,17.7898769 110.207895,16 107.997221,16 L20.0027785,16 C17.7898769,16 16,17.792105 16,20.0027785 L16,58.312373 L25.2413115,43.7197989 C28.041793,39.297674 34.2643908,38.7118128 37.8410347,42.5335275 L56.0882845,63.1470817 L69.7748997,56.7400579 C72.766567,55.3552503 76.3013751,55.9473836 78.678437,58.2315339 C78.8106437,58.3585731 79.0742301,58.609836 79.4527088,58.9673596 C80.0910923,59.570398 80.8117772,60.2441563 81.598127,60.9705595 C83.8422198,63.043576 86.1541548,65.1151944 88.3956721,67.0372264 C89.1168795,67.6556396 89.8200801,68.2492007 90.5021258,68.8146755 C92.6097224,70.5620551 94.4693308,72.0029474 95.9836366,73.0515697 C96.7316295,73.5695379 97.3674038,73.9719282 98.0281481,74.3824999 C98.4724987,74.4989557 99.0742374,74.5263881 99.8365134,74.4317984 C101.709944,74.1993272 104.074502,73.2878514 106.559886,71.8846196 C107.705822,71.2376318 108.790494,70.5370325 109.764561,69.8410487 C110.323259,69.4418522 110.694168,69.1550757 110.834827,69.0391868 C111.210545,68.7296319 111.600264,68.4615815 112,68.2332211 L112,68.2332211 Z M0,8.00697327 C0,3.58484404 3.59075293,0 8.00697327,0 L119.993027,0 C124.415156,0 128,3.59075293 128,8.00697327 L128,119.993027 C128,124.415156 124.409247,128 119.993027,128 L8.00697327,128 C3.58484404,128 0,124.409247 0,119.993027 L0,8.00697327 L0,8.00697327 Z M95,42 C99.418278,42 103,38.418278 103,34 C103,29.581722 99.418278,26 95,26 C90.581722,26 87,29.581722 87,34 C87,38.418278 90.581722,42 95,42 L95,42 Z M32,76 C47.8587691,80.8294182 52.0345556,83.2438712 52.0345556,88 C52.0345556,92.7561288 32,95.4712486 32,102.347107 C32,109.222965 33.2849191,107.337637 33.2849191,112 L67.999999,112 C67.999999,112 54.3147136,105.375255 54.3147136,101.200691 C54.3147136,93.535181 64.9302432,92.860755 64.9302432,88 C64.9302432,80.6425555 50.8523779,79.167282 32,76 L32,76 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-picture tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z"/></svg> \ No newline at end of file diff --git a/core/images/plugin-generic-language.tid b/core/images/plugin-generic-language.tid index 1c5aa3ce5..64b310872 100755 --- a/core/images/plugin-generic-language.tid +++ b/core/images/plugin-generic-language.tid @@ -1,8 +1,4 @@ title: $:/core/images/plugin-generic-language tags: $:/tags/Image -<svg width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M61.2072232,68.1369825 C56.8829239,70.9319564 54.2082892,74.793177 54.2082892,79.0581634 C54.2082892,86.9638335 63.3980995,93.4821994 75.2498076,94.3940006 C77.412197,98.2964184 83.8475284,101.178858 91.5684735,101.403106 C86.4420125,100.27851 82.4506393,97.6624107 80.9477167,94.3948272 C92.8046245,93.4861461 102,86.9662269 102,79.0581634 C102,70.5281905 91.3014611,63.6132813 78.1041446,63.6132813 C71.5054863,63.6132813 65.5315225,65.3420086 61.2072232,68.1369825 Z M74.001066,53.9793443 C69.6767667,56.7743182 63.7028029,58.5030456 57.1041446,58.5030456 C54.4851745,58.5030456 51.9646095,58.2307276 49.6065315,57.7275105 C46.2945155,59.9778212 41.2235699,61.4171743 35.5395922,61.4171743 C35.4545771,61.4171743 35.3696991,61.4168523 35.2849622,61.4162104 C39.404008,60.5235193 42.7961717,58.6691298 44.7630507,56.286533 C37.8379411,53.5817651 33.2082892,48.669413 33.2082892,43.0581634 C33.2082892,34.5281905 43.9068281,27.6132812 57.1041446,27.6132812 C70.3014611,27.6132812 81,34.5281905 81,43.0581634 C81,47.3231498 78.3253653,51.1843704 74.001066,53.9793443 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg> \ No newline at end of file diff --git a/core/images/plugin-generic-plugin.tid b/core/images/plugin-generic-plugin.tid index 6f56da7a3..94988e2ca 100755 --- a/core/images/plugin-generic-plugin.tid +++ b/core/images/plugin-generic-plugin.tid @@ -1,8 +1,4 @@ title: $:/core/images/plugin-generic-plugin tags: $:/tags/Image -<svg width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M40.3972881,76.4456988 L40.3972881,95.3404069 L54.5170166,95.3404069 L54.5170166,95.3404069 C54.5165526,95.3385183 54.516089,95.3366295 54.515626,95.3347404 C54.6093153,95.3385061 54.7034848,95.3404069 54.7980982,95.3404069 C58.6157051,95.3404069 61.710487,92.245625 61.710487,88.4280181 C61.710487,86.6197822 61.01617,84.9737128 59.8795929,83.7418666 L59.8795929,83.7418666 C59.8949905,83.7341665 59.9104102,83.7265043 59.925852,83.7188798 C58.8840576,82.5086663 58.2542926,80.9336277 58.2542926,79.2114996 C58.2542926,75.3938927 61.3490745,72.2991108 65.1666814,72.2991108 C68.9842884,72.2991108 72.0790703,75.3938927 72.0790703,79.2114996 C72.0790703,81.1954221 71.2432806,82.9841354 69.9045961,84.2447446 L69.9045961,84.2447446 C69.9333407,84.2629251 69.9619885,84.281245 69.9905383,84.2997032 L69.9905383,84.2997032 C69.1314315,85.4516923 68.6228758,86.8804654 68.6228758,88.4280181 C68.6228758,91.8584969 71.1218232,94.7053153 74.3986526,95.2474079 C74.3913315,95.2784624 74.3838688,95.3094624 74.3762652,95.3404069 L95.6963988,95.3404069 L95.6963988,75.5678578 L95.6963988,75.5678578 C95.6466539,75.5808558 95.5967614,75.5934886 95.5467242,75.6057531 C95.5504899,75.5120637 95.5523907,75.4178943 95.5523907,75.3232809 C95.5523907,71.505674 92.4576088,68.4108921 88.6400019,68.4108921 C86.831766,68.4108921 85.1856966,69.105209 83.9538504,70.2417862 L83.9538504,70.2417862 C83.9461503,70.2263886 83.938488,70.2109688 83.9308636,70.1955271 C82.7206501,71.2373215 81.1456115,71.8670865 79.4234834,71.8670865 C75.6058765,71.8670865 72.5110946,68.7723046 72.5110946,64.9546976 C72.5110946,61.1370907 75.6058765,58.0423088 79.4234834,58.0423088 C81.4074059,58.0423088 83.1961192,58.8780985 84.4567284,60.2167829 L84.4567284,60.2167829 C84.4749089,60.1880383 84.4932288,60.1593906 84.511687,60.1308407 L84.511687,60.1308407 C85.6636761,60.9899475 87.0924492,61.4985032 88.6400019,61.4985032 C92.0704807,61.4985032 94.9172991,58.9995558 95.4593917,55.7227265 C95.538755,55.7414363 95.6177614,55.761071 95.6963988,55.7816184 L95.6963988,40.0412962 L74.3762652,40.0412962 L74.3762652,40.0412962 C74.3838688,40.0103516 74.3913315,39.9793517 74.3986526,39.9482971 L74.3986526,39.9482971 C71.1218232,39.4062046 68.6228758,36.5593862 68.6228758,33.1289073 C68.6228758,31.5813547 69.1314315,30.1525815 69.9905383,29.0005925 C69.9619885,28.9821342 69.9333407,28.9638143 69.9045961,28.9456339 C71.2432806,27.6850247 72.0790703,25.8963113 72.0790703,23.9123888 C72.0790703,20.0947819 68.9842884,17 65.1666814,17 C61.3490745,17 58.2542926,20.0947819 58.2542926,23.9123888 C58.2542926,25.6345169 58.8840576,27.2095556 59.925852,28.419769 L59.925852,28.419769 C59.9104102,28.4273935 59.8949905,28.4350558 59.8795929,28.4427558 C61.01617,29.674602 61.710487,31.3206715 61.710487,33.1289073 C61.710487,36.9465143 58.6157051,40.0412962 54.7980982,40.0412962 C54.7034848,40.0412962 54.6093153,40.0393953 54.515626,40.0356296 L54.515626,40.0356296 C54.516089,40.0375187 54.5165526,40.0394075 54.5170166,40.0412962 L40.3972881,40.0412962 L40.3972881,52.887664 L40.3972881,52.887664 C40.4916889,53.3430132 40.5412962,53.8147625 40.5412962,54.2980982 C40.5412962,58.1157051 37.4465143,61.210487 33.6289073,61.210487 C32.0813547,61.210487 30.6525815,60.7019313 29.5005925,59.8428245 C29.4821342,59.8713744 29.4638143,59.9000221 29.4456339,59.9287667 C28.1850247,58.5900823 26.3963113,57.7542926 24.4123888,57.7542926 C20.5947819,57.7542926 17.5,60.8490745 17.5,64.6666814 C17.5,68.4842884 20.5947819,71.5790703 24.4123888,71.5790703 C26.134517,71.5790703 27.7095556,70.9493053 28.919769,69.9075109 L28.919769,69.9075109 C28.9273935,69.9229526 28.9350558,69.9383724 28.9427558,69.95377 C30.174602,68.8171928 31.8206715,68.1228758 33.6289073,68.1228758 C37.4465143,68.1228758 40.5412962,71.2176578 40.5412962,75.0352647 C40.5412962,75.5186004 40.4916889,75.9903496 40.3972881,76.4456988 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg> \ No newline at end of file diff --git a/core/images/plugin-generic-theme.tid b/core/images/plugin-generic-theme.tid index 1f4224b10..34dccf18f 100755 --- a/core/images/plugin-generic-theme.tid +++ b/core/images/plugin-generic-theme.tid @@ -1,8 +1,4 @@ title: $:/core/images/plugin-generic-theme tags: $:/tags/Image -<svg width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M29.4078519,91.4716406 L51.4693474,69.4101451 L51.4646675,69.4054652 C50.5969502,68.5377479 50.5929779,67.1348725 51.4693474,66.2585029 C52.3396494,65.3882009 53.7499654,65.3874786 54.6163097,66.2538229 L64.0805963,75.7181095 C64.9483136,76.5858268 64.9522859,77.9887022 64.0759163,78.8650718 C63.2056143,79.7353737 61.7952984,79.736096 60.9289541,78.8697517 L60.9242741,78.8650718 L60.9242741,78.8650718 L38.8627786,100.926567 C36.2518727,103.537473 32.0187578,103.537473 29.4078519,100.926567 C26.796946,98.3156614 26.796946,94.0825465 29.4078519,91.4716406 Z M60.8017407,66.3810363 C58.3659178,63.6765806 56.3370667,61.2899536 54.9851735,59.5123615 C48.1295381,50.4979488 44.671561,55.2444054 40.7586738,59.5123614 C36.8457866,63.7803174 41.789473,67.2384487 38.0759896,70.2532832 C34.3625062,73.2681177 34.5917646,74.3131575 28.3243876,68.7977024 C22.0570105,63.2822473 21.6235306,61.7636888 24.5005999,58.6166112 C27.3776691,55.4695337 29.7823103,60.4247912 35.6595047,54.8320442 C41.5366991,49.2392972 36.5996215,44.2825646 36.5996215,44.2825646 C36.5996215,44.2825646 48.8365511,19.267683 65.1880231,21.1152173 C81.5394952,22.9627517 59.0022276,18.7228947 53.3962199,38.3410355 C50.9960082,46.7405407 53.8429162,44.7613399 58.3941742,48.3090467 C59.7875202,49.3951602 64.4244828,52.7100463 70.1884353,56.9943417 L90.8648751,36.3179019 L92.4795866,31.5515482 L100.319802,26.8629752 L103.471444,30.0146174 L98.782871,37.8548326 L94.0165173,39.4695441 L73.7934912,59.6925702 C86.4558549,69.2403631 102.104532,81.8392557 102.104532,86.4016913 C102.104533,93.6189834 99.0337832,97.9277545 92.5695848,95.5655717 C87.8765989,93.8506351 73.8015497,80.3744087 63.8173444,69.668717 L60.9242741,72.5617873 L57.7726319,69.4101451 L60.8017407,66.3810363 L60.8017407,66.3810363 Z M63.9533761,1.42108547e-13 L118.512977,32 L118.512977,96 L63.9533761,128 L9.39377563,96 L9.39377563,32 L63.9533761,1.42108547e-13 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z"/></svg> \ No newline at end of file diff --git a/core/images/preview-closed.tid b/core/images/preview-closed.tid index 1ca8f24ba..5986d8966 100755 --- a/core/images/preview-closed.tid +++ b/core/images/preview-closed.tid @@ -1,15 +1,4 @@ title: $:/core/images/preview-closed tags: $:/tags/Image -<svg class="tc-image-preview-closed tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M0.0881363238,64 C-0.210292223,65.8846266 0.249135869,67.8634737 1.4664206,69.4579969 C16.2465319,88.8184886 39.1692554,100.414336 64,100.414336 C88.8307446,100.414336 111.753468,88.8184886 126.533579,69.4579969 C127.750864,67.8634737 128.210292,65.8846266 127.911864,64 C110.582357,78.4158332 88.3036732,87.0858436 64,87.0858436 C39.6963268,87.0858436 17.4176431,78.4158332 0.0881363238,64 Z"></path> - <rect x="62" y="96" width="4" height="16" rx="4"></rect> - <rect transform="translate(80.000000, 101.000000) rotate(-5.000000) translate(-80.000000, -101.000000) " x="78" y="93" width="4" height="16" rx="4"></rect> - <rect transform="translate(48.000000, 101.000000) rotate(-355.000000) translate(-48.000000, -101.000000) " x="46" y="93" width="4" height="16" rx="4"></rect> - <rect transform="translate(32.000000, 96.000000) rotate(-350.000000) translate(-32.000000, -96.000000) " x="30" y="88" width="4" height="16" rx="4"></rect> - <rect transform="translate(96.000000, 96.000000) rotate(-10.000000) translate(-96.000000, -96.000000) " x="94" y="88" width="4" height="16" rx="4"></rect> - <rect transform="translate(112.000000, 88.000000) rotate(-20.000000) translate(-112.000000, -88.000000) " x="110" y="80" width="4" height="16" rx="4"></rect> - <rect transform="translate(16.000000, 88.000000) rotate(-340.000000) translate(-16.000000, -88.000000) " x="14" y="80" width="4" height="16" rx="4"></rect> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-preview-closed tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z"/><rect width="4" height="16" x="62" y="96" rx="4"/><rect width="4" height="16" x="78" y="93" rx="4" transform="rotate(-5 80 101)"/><rect width="4" height="16" x="46" y="93" rx="4" transform="rotate(5 48 101)"/><rect width="4" height="16" x="30" y="88" rx="4" transform="rotate(10 32 96)"/><rect width="4" height="16" x="94" y="88" rx="4" transform="rotate(-10 96 96)"/><rect width="4" height="16" x="110" y="80" rx="4" transform="rotate(-20 112 88)"/><rect width="4" height="16" x="14" y="80" rx="4" transform="rotate(20 16 88)"/></g></svg> \ No newline at end of file diff --git a/core/images/preview-open.tid b/core/images/preview-open.tid index 17f2319e1..4664990b4 100755 --- a/core/images/preview-open.tid +++ b/core/images/preview-open.tid @@ -1,9 +1,4 @@ title: $:/core/images/preview-open tags: $:/tags/Image -<svg class="tc-image-preview-open tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M64.1099282,99.5876785 C39.2791836,99.5876785 16.3564602,87.9918313 1.57634884,68.6313396 C-0.378878622,66.070184 -0.378878622,62.5174945 1.57634884,59.9563389 C16.3564602,40.5958472 39.2791836,29 64.1099282,29 C88.9406729,29 111.863396,40.5958472 126.643508,59.9563389 C128.598735,62.5174945 128.598735,66.070184 126.643508,68.6313396 C111.863396,87.9918313 88.9406729,99.5876785 64.1099282,99.5876785 Z M110.213805,67.5808331 C111.654168,66.0569335 111.654168,63.9430665 110.213805,62.4191669 C99.3257042,50.8995835 82.4391647,44 64.1470385,44 C45.8549124,44 28.9683729,50.8995835 18.0802717,62.4191669 C16.6399094,63.9430665 16.6399094,66.0569335 18.0802717,67.5808331 C28.9683729,79.1004165 45.8549124,86 64.1470385,86 C82.4391647,86 99.3257042,79.1004165 110.213805,67.5808331 Z"></path> - <path d="M63.5,88 C76.4786916,88 87,77.4786916 87,64.5 C87,51.5213084 76.4786916,41 63.5,41 C50.5213084,41 40,51.5213084 40,64.5 C40,77.4786916 50.5213084,88 63.5,88 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-preview-open tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z"/><path d="M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z"/></g></svg> \ No newline at end of file diff --git a/core/images/print-button.tid b/core/images/print-button.tid index 5e7c1d8e0..55b33c896 100644 --- a/core/images/print-button.tid +++ b/core/images/print-button.tid @@ -1,12 +1,4 @@ title: $:/core/images/print-button tags: $:/tags/Image -<svg class="tc-image-print-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M112,71 L112,30.5 L111.96811,30.5 L111.96811,30.5 C111.932942,28.4998414 111.151676,26.510538 109.625176,24.9840387 L86.9982489,2.35711116 C85.3482153,0.707077645 83.1589869,-0.071534047 81,0.0201838424 L81,0 L23.9992458,0 C19.5808867,0 16,3.58213437 16,8.00092105 L16,71 L24,71 L24,8 L81,8 L81,22.4996539 C81,26.9216269 84.5818769,30.5 89.0003461,30.5 L104,30.5 L104,71 L112,71 Z"></path> - <rect x="32" y="36" width="64" height="8" rx="4"></rect> - <rect x="32" y="52" width="64" height="8" rx="4"></rect> - <rect x="32" y="20" width="40" height="8" rx="4"></rect> - <path d="M0,80.0054195 C0,71.1658704 7.15611005,64 16.0008841,64 L111.999116,64 C120.83616,64 128,71.1553215 128,80.0054195 L128,111.99458 C128,120.83413 120.84389,128 111.999116,128 L16.0008841,128 C7.16383982,128 0,120.844679 0,111.99458 L0,80.0054195 Z M104,96 C108.418278,96 112,92.418278 112,88 C112,83.581722 108.418278,80 104,80 C99.581722,80 96,83.581722 96,88 C96,92.418278 99.581722,96 104,96 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-print-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z"/><rect width="64" height="8" x="32" y="36" rx="4"/><rect width="64" height="8" x="32" y="52" rx="4"/><rect width="40" height="8" x="32" y="20" rx="4"/><path d="M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z"/></g></svg> \ No newline at end of file diff --git a/core/images/quote.tid b/core/images/quote.tid index 882b1debc..7134306a6 100755 --- a/core/images/quote.tid +++ b/core/images/quote.tid @@ -1,8 +1,4 @@ title: $:/core/images/quote tags: $:/tags/Image -<svg class="tc-image-quote tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M51.2188077,117.712501 L51.2188077,62.1993386 L27.4274524,62.1993386 C27.4274524,53.3075754 29.1096526,45.797753 32.4741035,39.669646 C35.8385544,33.541539 42.0867267,28.9154883 51.2188077,25.7913554 L51.2188077,2 C43.7689521,2.96127169 36.8599155,5.18417913 30.4914905,8.668789 C24.1230656,12.1533989 18.6559149,16.5391352 14.0898743,21.8261295 C9.52383382,27.1131238 5.97919764,33.2411389 3.45585945,40.2103586 C0.932521268,47.1795784 -0.208971741,54.6293222 0.0313461819,62.5598136 L0.0313461819,117.712501 L51.2188077,117.712501 Z M128,117.712501 L128,62.1993386 L104.208645,62.1993386 C104.208645,53.3075754 105.890845,45.797753 109.255296,39.669646 C112.619747,33.541539 118.867919,28.9154883 128,25.7913554 L128,2 C120.550144,2.96127169 113.641108,5.18417913 107.272683,8.668789 C100.904258,12.1533989 95.4371072,16.5391352 90.8710666,21.8261295 C86.3050261,27.1131238 82.7603899,33.2411389 80.2370517,40.2103586 C77.7137136,47.1795784 76.5722206,54.6293222 76.8125385,62.5598136 L76.8125385,117.712501 L128,117.712501 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-quote tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z"/></svg> \ No newline at end of file diff --git a/core/images/refresh-button.tid b/core/images/refresh-button.tid index c28c7af32..2422b0679 100755 --- a/core/images/refresh-button.tid +++ b/core/images/refresh-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/refresh-button tags: $:/tags/Image -<svg class="tc-image-refresh-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M106.369002,39.4325143 C116.529932,60.3119371 112.939592,86.1974934 95.5979797,103.539105 C73.7286194,125.408466 38.2713806,125.408466 16.4020203,103.539105 C-5.46734008,81.6697449 -5.46734008,46.2125061 16.4020203,24.3431458 C19.5262146,21.2189514 24.5915344,21.2189514 27.7157288,24.3431458 C30.8399231,27.4673401 30.8399231,32.5326599 27.7157288,35.6568542 C12.0947571,51.2778259 12.0947571,76.6044251 27.7157288,92.2253967 C43.3367004,107.846368 68.6632996,107.846368 84.2842712,92.2253967 C97.71993,78.7897379 99.5995262,58.1740623 89.9230597,42.729491 L83.4844861,54.9932839 C81.4307001,58.9052072 76.5945372,60.4115251 72.682614,58.3577391 C68.7706907,56.3039532 67.2643728,51.4677903 69.3181587,47.555867 L84.4354914,18.7613158 C86.4966389,14.8353707 91.3577499,13.3347805 95.273202,15.415792 L124.145886,30.7612457 C128.047354,32.8348248 129.52915,37.6785572 127.455571,41.5800249 C125.381992,45.4814927 120.53826,46.9632892 116.636792,44.8897102 L106.369002,39.4325143 Z M98.1470904,27.0648707 C97.9798954,26.8741582 97.811187,26.6843098 97.6409651,26.4953413 L98.6018187,26.1987327 L98.1470904,27.0648707 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-refresh-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z"/></svg> \ No newline at end of file diff --git a/core/images/right-arrow.tid b/core/images/right-arrow.tid index 14095b3b1..42e7dea56 100755 --- a/core/images/right-arrow.tid +++ b/core/images/right-arrow.tid @@ -1,6 +1,4 @@ title: $:/core/images/right-arrow tags: $:/tags/Image -<svg class="tc-image-right-arrow tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <path d="M80.3563798,109.353315 C78.9238993,110.786918 76.9450203,111.675144 74.7592239,111.675144 L-4.40893546,111.675144 C-8.77412698,111.675144 -12.3248558,108.130732 -12.3248558,103.758478 C-12.3248558,99.3951199 -8.78077754,95.8418109 -4.40893546,95.8418109 L66.8418109,95.8418109 L66.8418109,24.5910645 C66.8418109,20.225873 70.3862233,16.6751442 74.7584775,16.6751442 C79.1218352,16.6751442 82.6751442,20.2192225 82.6751442,24.5910645 L82.6751442,103.759224 C82.6751442,105.941695 81.7891419,107.920575 80.3566508,109.353886 Z" transform="translate(35.175144, 64.175144) rotate(-45.000000) translate(-35.175144, -64.175144) "></path> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-right-arrow tc-image-button" viewBox="0 0 128 128"><path d="M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z"/></svg> \ No newline at end of file diff --git a/core/images/rotate-left.tid b/core/images/rotate-left.tid index 7530aedde..188d3b45c 100644 --- a/core/images/rotate-left.tid +++ b/core/images/rotate-left.tid @@ -1,4 +1,4 @@ title: $:/core/images/rotate-left tags: $:/tags/Image -<svg class="tc-image-rotate-left tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="32" height="80" rx="8"/><rect x="48" y="96" width="80" height="32" rx="8"/><path d="M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 0 1-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 1 1-5.657 5.657L49.172 43.142a4 4 0 0 1 0-5.657l11.313-11.313a4 4 0 1 1 5.657 5.656l-4.821 4.822z"/></g></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-rotate-left tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="32" height="80" rx="8"/><rect width="80" height="32" x="48" y="96" rx="8"/><path d="M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z"/></g></svg> \ No newline at end of file diff --git a/core/images/save-button.tid b/core/images/save-button.tid index dd57a92e5..a66756616 100755 --- a/core/images/save-button.tid +++ b/core/images/save-button.tid @@ -1,8 +1,4 @@ title: $:/core/images/save-button tags: $:/tags/Image -<svg class="tc-image-save-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"> - <g fill-rule="evenodd"> - <path d="M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-save-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z"/></svg> \ No newline at end of file diff --git a/core/images/size.tid b/core/images/size.tid index 4822dbb50..db84ecf9b 100755 --- a/core/images/size.tid +++ b/core/images/size.tid @@ -1,6 +1,4 @@ title: $:/core/images/size tags: $:/tags/Image -<svg class="tc-image-size tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <path d="M92.3431458,26 L83.1715729,35.1715729 C81.6094757,36.73367 81.6094757,39.26633 83.1715729,40.8284271 C84.73367,42.3905243 87.26633,42.3905243 88.8284271,40.8284271 L104.828427,24.8284271 C106.390524,23.26633 106.390524,20.73367 104.828427,19.1715729 L88.8284271,3.17157288 C87.26633,1.60947571 84.73367,1.60947571 83.1715729,3.17157288 C81.6094757,4.73367004 81.6094757,7.26632996 83.1715729,8.82842712 L92.3431457,18 L22,18 C19.790861,18 18,19.790861 18,22 L18,92.3431458 L8.82842712,83.1715729 C7.26632996,81.6094757 4.73367004,81.6094757 3.17157288,83.1715729 C1.60947571,84.73367 1.60947571,87.26633 3.17157288,88.8284271 L19.1715729,104.828427 C20.73367,106.390524 23.26633,106.390524 24.8284271,104.828427 L40.8284271,88.8284271 C42.3905243,87.26633 42.3905243,84.73367 40.8284271,83.1715729 C39.26633,81.6094757 36.73367,81.6094757 35.1715729,83.1715729 L26,92.3431458 L26,22 L22,26 L92.3431458,26 L92.3431458,26 Z M112,52 L112,116 L116,112 L52,112 C49.790861,112 48,113.790861 48,116 C48,118.209139 49.790861,120 52,120 L116,120 C118.209139,120 120,118.209139 120,116 L120,52 C120,49.790861 118.209139,48 116,48 C113.790861,48 112,49.790861 112,52 L112,52 Z"></path> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-size tc-image-button" viewBox="0 0 128 128"><path d="M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z"/></svg> \ No newline at end of file diff --git a/core/images/spiral.tid b/core/images/spiral.tid index 5ad004f46..ca4684cab 100755 --- a/core/images/spiral.tid +++ b/core/images/spiral.tid @@ -1,8 +1,4 @@ title: $:/core/images/spiral tags: $:/tags/Image -<svg class="tc-image-spiral tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="nonzero"> - <path d="M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074.14-2.64-1.89-4.89-4.52-5.03-2.64-.14-4.89 1.88-5.03 4.52-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01-.02-.015-.054-.045-.094-.088-.06-.064-.12-.145-.17-.244-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-spiral tc-image-button" viewBox="0 0 128 128"><path d="M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z"/></svg> \ No newline at end of file diff --git a/core/images/stamp.tid b/core/images/stamp.tid index ab8949c1d..ba385aaae 100755 --- a/core/images/stamp.tid +++ b/core/images/stamp.tid @@ -1,8 +1,4 @@ title: $:/core/images/stamp tags: $:/tags/Image -<svg class="tc-image-stamp tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M49.7334301,64 L16.0098166,64 C11.5838751,64 8,67.5829053 8,72.002643 L8,74.4986785 L8,97 L120,97 L120,74.4986785 L120,72.002643 C120,67.5737547 116.413883,64 111.990183,64 L78.2665699,64 C76.502049,60.7519149 75.5,57.0311962 75.5,53.0769231 C75.5,46.6017951 78.1869052,40.7529228 82.5087769,36.5800577 C85.3313113,32.7688808 87,28.0549983 87,22.952183 C87,10.2760423 76.7025492,0 64,0 C51.2974508,0 41,10.2760423 41,22.952183 C41,28.0549983 42.6686887,32.7688808 45.4912231,36.5800577 C49.8130948,40.7529228 52.5,46.6017951 52.5,53.0769231 C52.5,57.0311962 51.497951,60.7519149 49.7334301,64 Z M8,104 L120,104 L120,112 L8,112 L8,104 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-stamp tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z"/></svg> \ No newline at end of file diff --git a/core/images/star-filled.tid b/core/images/star-filled.tid index 3199c14db..10b8f1c3d 100755 --- a/core/images/star-filled.tid +++ b/core/images/star-filled.tid @@ -1,8 +1,4 @@ title: $:/core/images/star-filled tags: $:/tags/Image -<svg class="tc-image-star-filled tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="nonzero"> - <path d="M61.8361286,96.8228569 L99.1627704,124.110219 C101.883827,126.099427 105.541968,123.420868 104.505636,120.198072 L90.2895569,75.9887263 L89.0292911,79.8977279 L126.314504,52.5528988 C129.032541,50.5595011 127.635256,46.2255025 124.273711,46.2229134 L78.1610486,46.1873965 L81.4604673,48.6032923 L67.1773543,4.41589688 C66.1361365,1.19470104 61.6144265,1.19470104 60.5732087,4.41589688 L46.2900957,48.6032923 L49.5895144,46.1873965 L3.47685231,46.2229134 C0.115307373,46.2255025 -1.28197785,50.5595011 1.43605908,52.5528988 L38.7212719,79.8977279 L37.4610061,75.9887263 L23.2449266,120.198072 C22.2085954,123.420868 25.8667356,126.099427 28.5877926,124.110219 L65.9144344,96.8228569 L61.8361286,96.8228569 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-star-filled tc-image-button" viewBox="0 0 128 128"><path d="M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z"/></svg> \ No newline at end of file diff --git a/core/images/storyview-classic.tid b/core/images/storyview-classic.tid index a0f7b7af0..86872817b 100755 --- a/core/images/storyview-classic.tid +++ b/core/images/storyview-classic.tid @@ -1,8 +1,4 @@ title: $:/core/images/storyview-classic tags: $:/tags/Image -<svg class="tc-image-storyview-classic tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-storyview-classic tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z"/></svg> \ No newline at end of file diff --git a/core/images/storyview-pop.tid b/core/images/storyview-pop.tid index f56cb58bc..a610c89d5 100755 --- a/core/images/storyview-pop.tid +++ b/core/images/storyview-pop.tid @@ -1,8 +1,4 @@ title: $:/core/images/storyview-pop tags: $:/tags/Image -<svg class="tc-image-storyview-pop tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M16.0098166,56 C11.586117,56 8,59.5776607 8,63.9924054 L8,80.0075946 C8,84.4216782 11.5838751,88 16.0098166,88 L111.990183,88 C116.413883,88 120,84.4223393 120,80.0075946 L120,63.9924054 C120,59.5783218 116.416125,56 111.990183,56 L16.0098166,56 L16.0098166,56 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-storyview-pop tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z"/></svg> \ No newline at end of file diff --git a/core/images/storyview-zoomin.tid b/core/images/storyview-zoomin.tid index 949f535e2..61b7ff273 100755 --- a/core/images/storyview-zoomin.tid +++ b/core/images/storyview-zoomin.tid @@ -1,8 +1,4 @@ title: $:/core/images/storyview-zoomin tags: $:/tags/Image -<svg class="tc-image-storyview-zoomin tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.578055 16,24.0085154 L16,71.9914846 C16,76.4144655 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.421945 112,71.9914846 L112,24.0085154 C112,19.5855345 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-storyview-zoomin tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z"/></svg> \ No newline at end of file diff --git a/core/images/strikethrough.tid b/core/images/strikethrough.tid index 80898c870..1f7a1c202 100755 --- a/core/images/strikethrough.tid +++ b/core/images/strikethrough.tid @@ -1,9 +1,4 @@ title: $:/core/images/strikethrough tags: $:/tags/Image -<svg class="tc-image-strikethrough tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M92.793842,38.7255689 L108.215529,38.7255689 C107.987058,31.985687 106.70193,26.1883331 104.360107,21.3333333 C102.018284,16.4783336 98.8197436,12.4516001 94.7643909,9.25301205 C90.7090382,6.05442399 85.9969032,3.71263572 80.6278447,2.22757697 C75.2587862,0.742518233 69.4328739,0 63.1499331,0 C57.552404,0 52.0977508,0.713959839 46.7858099,2.14190094 C41.473869,3.56984203 36.7331757,5.74027995 32.5635877,8.65327979 C28.3939997,11.5662796 25.0526676,15.2788708 22.5394913,19.7911647 C20.026315,24.3034585 18.7697456,29.6438781 18.7697456,35.8125837 C18.7697456,41.4101128 19.883523,46.0651309 22.1111111,49.7777778 C24.3386992,53.4904246 27.3087722,56.5176144 31.021419,58.8594378 C34.7340659,61.2012612 38.9321497,63.0861151 43.6157965,64.5140562 C48.2994433,65.9419973 53.068695,67.1985666 57.9236948,68.2838019 C62.7786945,69.3690371 67.5479462,70.4256977 72.231593,71.4538153 C76.9152398,72.4819329 81.1133237,73.8241773 84.8259705,75.480589 C88.5386174,77.1370007 91.5086903,79.2788802 93.7362784,81.9062918 C95.9638666,84.5337035 97.0776439,87.9607107 97.0776439,92.1874163 C97.0776439,96.6425926 96.1637753,100.298067 94.3360107,103.153949 C92.5082461,106.009831 90.109341,108.265944 87.1392236,109.922356 C84.1691061,111.578768 80.827774,112.749662 77.1151272,113.435074 C73.4024803,114.120485 69.7184476,114.463186 66.0629183,114.463186 C61.4935068,114.463186 57.0383974,113.892018 52.6974565,112.749665 C48.3565156,111.607312 44.5582492,109.836692 41.3025435,107.437751 C38.0468378,105.03881 35.4194656,101.983062 33.4203481,98.270415 C31.4212305,94.5577681 30.4216867,90.1312171 30.4216867,84.9906292 L15,84.9906292 C15,92.4159229 16.3422445,98.8415614 19.0267738,104.267738 C21.711303,109.693914 25.3667774,114.149023 29.9933066,117.633199 C34.6198357,121.117376 39.9888137,123.71619 46.1004016,125.429719 C52.2119895,127.143248 58.6947448,128 65.5488621,128 C71.1463912,128 76.7723948,127.343157 82.4270415,126.029451 C88.0816882,124.715745 93.1936407,122.602424 97.7630522,119.689424 C102.332464,116.776425 106.073613,113.006717 108.986613,108.380187 C111.899613,103.753658 113.356091,98.1847715 113.356091,91.6733601 C113.356091,85.6188899 112.242314,80.5926126 110.014726,76.5943775 C107.787137,72.5961424 104.817065,69.2833688 101.104418,66.6559572 C97.3917708,64.0285455 93.193687,61.9437828 88.5100402,60.4016064 C83.8263934,58.85943 79.0571416,57.5171855 74.2021419,56.3748327 C69.3471422,55.2324798 64.5778904,54.1758192 59.8942436,53.2048193 C55.2105968,52.2338193 51.012513,51.0058084 47.2998661,49.5207497 C43.5872193,48.0356909 40.6171463,46.1222786 38.3895582,43.7804552 C36.1619701,41.4386318 35.0481928,38.3828836 35.0481928,34.6131191 C35.0481928,30.6148841 35.8192694,27.273552 37.3614458,24.5890228 C38.9036222,21.9044935 40.9598265,19.762614 43.5301205,18.1633199 C46.1004145,16.5640259 49.041929,15.4216902 52.3547523,14.7362784 C55.6675757,14.0508667 59.0374661,13.708166 62.4645248,13.708166 C70.9179361,13.708166 77.8576257,15.6786952 83.2838019,19.6198126 C88.709978,23.56093 91.8799597,29.9294518 92.793842,38.7255689 L92.793842,38.7255689 Z"></path> - <rect x="5" y="54" width="118" height="16"></rect> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-strikethrough tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z"/><path d="M5 54h118v16H5z"/></g></svg> \ No newline at end of file diff --git a/core/images/subscript.tid b/core/images/subscript.tid index a56aa2f1d..96548bdb5 100755 --- a/core/images/subscript.tid +++ b/core/images/subscript.tid @@ -1,8 +1,4 @@ title: $:/core/images/subscript tags: $:/tags/Image -<svg class="tc-image-subscript tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M2.27170276,16 L22.1825093,16 L43.8305003,49.6746527 L66.4138983,16 L85.1220387,16 L53.5854592,61.9685735 L87.3937414,111.411516 L67.0820462,111.411516 L43.295982,74.9306422 L19.1090291,111.411516 L0,111.411516 L33.8082822,61.9685735 L2.27170276,16 Z M127.910914,128.411516 L85.3276227,128.411516 C85.3870139,123.24448 86.6342108,118.730815 89.0692508,114.870386 C91.5042907,111.009956 94.8301491,107.654403 99.0469256,104.803624 C101.066227,103.318844 103.174584,101.878629 105.372059,100.482935 C107.569534,99.0872413 109.588805,97.5876355 111.429933,95.9840726 C113.271061,94.3805097 114.785514,92.6433426 115.973338,90.7725192 C117.161163,88.9016958 117.784761,86.7487964 117.844152,84.3137564 C117.844152,83.1853233 117.710524,81.9826691 117.443264,80.7057579 C117.176003,79.4288467 116.656338,78.2410402 115.884252,77.1423026 C115.112166,76.0435651 114.04314,75.123015 112.677142,74.3806248 C111.311144,73.6382345 109.529434,73.267045 107.331959,73.267045 C105.312658,73.267045 103.634881,73.6679297 102.298579,74.4697112 C100.962276,75.2714926 99.8932503,76.3702137 99.0914688,77.7659073 C98.2896874,79.161601 97.6957841,80.8096826 97.3097412,82.7102016 C96.9236982,84.6107206 96.7009845,86.6596869 96.6415933,88.857162 L86.4857457,88.857162 C86.4857457,85.4124713 86.9460207,82.2202411 87.8665846,79.2803758 C88.7871485,76.3405105 90.1679736,73.801574 92.0091014,71.6634901 C93.8502292,69.5254062 96.092214,67.8476295 98.7351233,66.6301095 C101.378033,65.4125895 104.451482,64.8038386 107.955564,64.8038386 C111.756602,64.8038386 114.933984,65.4274371 117.487807,66.6746527 C120.041629,67.9218683 122.105443,69.4957119 123.67931,71.3962309 C125.253178,73.2967499 126.366746,75.3605638 127.02005,77.5877345 C127.673353,79.8149053 128,81.9381095 128,83.9574109 C128,86.4518421 127.613963,88.7086746 126.841877,90.727976 C126.069791,92.7472774 125.03046,94.6032252 123.723854,96.2958749 C122.417247,97.9885247 120.932489,99.5475208 119.269534,100.97291 C117.60658,102.398299 115.884261,103.734582 114.102524,104.981797 C112.320788,106.229013 110.539078,107.416819 108.757341,108.545253 C106.975605,109.673686 105.327523,110.802102 103.813047,111.930535 C102.298571,113.058968 100.977136,114.231927 99.8487031,115.449447 C98.7202699,116.666967 97.9481956,117.958707 97.5324571,119.324705 L127.910914,119.324705 L127.910914,128.411516 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-subscript tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z"/></svg> \ No newline at end of file diff --git a/core/images/superscript.tid b/core/images/superscript.tid index ca48636e0..149e44893 100755 --- a/core/images/superscript.tid +++ b/core/images/superscript.tid @@ -1,8 +1,4 @@ title: $:/core/images/superscript tags: $:/tags/Image -<svg class="tc-image-superscript tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M2.27170276,16 L22.1825093,16 L43.8305003,49.6746527 L66.4138983,16 L85.1220387,16 L53.5854592,61.9685735 L87.3937414,111.411516 L67.0820462,111.411516 L43.295982,74.9306422 L19.1090291,111.411516 L0,111.411516 L33.8082822,61.9685735 L2.27170276,16 Z M127.910914,63.4115159 L85.3276227,63.4115159 C85.3870139,58.2444799 86.6342108,53.7308149 89.0692508,49.8703857 C91.5042907,46.0099565 94.8301491,42.654403 99.0469256,39.8036245 C101.066227,38.318844 103.174584,36.8786285 105.372059,35.4829349 C107.569534,34.0872413 109.588805,32.5876355 111.429933,30.9840726 C113.271061,29.3805097 114.785514,27.6433426 115.973338,25.7725192 C117.161163,23.9016958 117.784761,21.7487964 117.844152,19.3137564 C117.844152,18.1853233 117.710524,16.9826691 117.443264,15.7057579 C117.176003,14.4288467 116.656338,13.2410402 115.884252,12.1423026 C115.112166,11.0435651 114.04314,10.123015 112.677142,9.38062477 C111.311144,8.63823453 109.529434,8.26704499 107.331959,8.26704499 C105.312658,8.26704499 103.634881,8.6679297 102.298579,9.46971115 C100.962276,10.2714926 99.8932503,11.3702137 99.0914688,12.7659073 C98.2896874,14.161601 97.6957841,15.8096826 97.3097412,17.7102016 C96.9236982,19.6107206 96.7009845,21.6596869 96.6415933,23.857162 L86.4857457,23.857162 C86.4857457,20.4124713 86.9460207,17.2202411 87.8665846,14.2803758 C88.7871485,11.3405105 90.1679736,8.80157397 92.0091014,6.6634901 C93.8502292,4.52540622 96.092214,2.84762946 98.7351233,1.63010947 C101.378033,0.412589489 104.451482,-0.196161372 107.955564,-0.196161372 C111.756602,-0.196161372 114.933984,0.427437071 117.487807,1.67465266 C120.041629,2.92186826 122.105443,4.49571195 123.67931,6.39623095 C125.253178,8.29674995 126.366746,10.3605638 127.02005,12.5877345 C127.673353,14.8149053 128,16.9381095 128,18.9574109 C128,21.4518421 127.613963,23.7086746 126.841877,25.727976 C126.069791,27.7472774 125.03046,29.6032252 123.723854,31.2958749 C122.417247,32.9885247 120.932489,34.5475208 119.269534,35.97291 C117.60658,37.3982993 115.884261,38.7345816 114.102524,39.9817972 C112.320788,41.2290128 110.539078,42.4168194 108.757341,43.5452525 C106.975605,44.6736857 105.327523,45.8021019 103.813047,46.9305351 C102.298571,48.0589682 100.977136,49.2319272 99.8487031,50.4494472 C98.7202699,51.6669672 97.9481956,52.9587068 97.5324571,54.3247048 L127.910914,54.3247048 L127.910914,63.4115159 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-superscript tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z"/></svg> \ No newline at end of file diff --git a/core/images/tag-button.tid b/core/images/tag-button.tid index 9eb2a70d7..9f6cad8b4 100755 --- a/core/images/tag-button.tid +++ b/core/images/tag-button.tid @@ -1,9 +1,4 @@ title: $:/core/images/tag-button tags: $:/tags/Image -<svg class="tc-image-tag-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M18.1643182,47.6600756 L18.1677196,51.7651887 C18.1708869,55.5878829 20.3581578,60.8623899 23.0531352,63.5573673 L84.9021823,125.406414 C87.5996731,128.103905 91.971139,128.096834 94.6717387,125.396234 L125.766905,94.3010679 C128.473612,91.5943612 128.472063,87.2264889 125.777085,84.5315115 L63.9280381,22.6824644 C61.2305472,19.9849735 55.9517395,17.801995 52.1318769,17.8010313 L25.0560441,17.7942007 C21.2311475,17.7932358 18.1421354,20.8872832 18.1452985,24.7049463 L18.1535504,34.6641936 C18.2481119,34.6754562 18.3439134,34.6864294 18.4409623,34.6971263 C22.1702157,35.1081705 26.9295004,34.6530132 31.806204,33.5444844 C32.1342781,33.0700515 32.5094815,32.6184036 32.9318197,32.1960654 C35.6385117,29.4893734 39.5490441,28.718649 42.94592,29.8824694 C43.0432142,29.8394357 43.1402334,29.7961748 43.2369683,29.7526887 L43.3646982,30.0368244 C44.566601,30.5115916 45.6933052,31.2351533 46.6655958,32.2074439 C50.4612154,36.0030635 50.4663097,42.1518845 46.6769742,45.94122 C43.0594074,49.5587868 37.2914155,49.7181264 33.4734256,46.422636 C28.1082519,47.5454734 22.7987486,48.0186448 18.1643182,47.6600756 Z"></path> - <path d="M47.6333528,39.5324628 L47.6562932,39.5834939 C37.9670934,43.9391617 26.0718874,46.3819521 17.260095,45.4107025 C5.27267473,44.0894301 -1.02778744,36.4307276 2.44271359,24.0779512 C5.56175386,12.9761516 14.3014034,4.36129832 24.0466405,1.54817001 C34.7269254,-1.53487574 43.7955833,3.51606438 43.7955834,14.7730751 L35.1728168,14.7730752 C35.1728167,9.91428944 32.0946059,8.19982862 26.4381034,9.83267419 C19.5270911,11.8276553 13.046247,18.2159574 10.7440788,26.4102121 C8.82861123,33.2280582 11.161186,36.0634845 18.2047888,36.8398415 C25.3302805,37.6252244 35.7353482,35.4884477 44.1208333,31.7188498 L44.1475077,31.7781871 C44.159701,31.7725635 44.1718402,31.7671479 44.1839238,31.7619434 C45.9448098,31.0035157 50.4503245,38.3109156 47.7081571,39.5012767 C47.6834429,39.512005 47.6585061,39.5223987 47.6333528,39.5324628 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-tag-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z"/><path d="M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z"/></g></svg> \ No newline at end of file diff --git a/core/images/theme-button.tid b/core/images/theme-button.tid index 8e14a45d5..d80a0e82a 100755 --- a/core/images/theme-button.tid +++ b/core/images/theme-button.tid @@ -1,9 +1,4 @@ title: $:/core/images/theme-button tags: $:/tags/Image -<svg class="tc-image-theme-button tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M55.854113,66.9453198 C54.3299482,65.1432292 53.0133883,63.518995 51.9542746,62.1263761 C40.8899947,47.578055 35.3091807,55.2383404 28.9941893,62.1263758 C22.6791979,69.0144112 30.6577916,74.5954741 24.6646171,79.4611023 C18.6714426,84.3267304 19.0414417,86.0133155 8.92654943,77.1119468 C-1.18834284,68.2105781 -1.88793412,65.7597832 2.7553553,60.6807286 C7.39864472,55.601674 11.2794845,63.5989423 20.7646627,54.5728325 C30.2498409,45.5467226 22.2819131,37.5470737 22.2819131,37.5470737 C22.2819131,37.5470737 42.0310399,-2.82433362 68.4206088,0.157393922 C94.8101776,3.13912147 58.4373806,-3.70356506 49.3898693,27.958066 C45.5161782,41.5139906 50.1107906,38.3197672 57.4560458,44.0453955 C59.1625767,45.3756367 63.8839488,48.777453 70.127165,53.3625321 C63.9980513,59.2416709 58.9704753,64.0315459 55.854113,66.9453198 Z M67.4952439,79.8919946 C83.5082212,96.9282402 105.237121,117.617674 112.611591,120.312493 C123.044132,124.12481 128.000001,117.170903 128,105.522947 C127.999999,98.3705516 104.170675,78.980486 84.0760493,63.7529565 C76.6683337,70.9090328 70.7000957,76.7055226 67.4952439,79.8919946 Z"></path> - <path d="M58.2852966,138.232794 L58.2852966,88.3943645 C56.318874,88.3923153 54.7254089,86.7952906 54.7254089,84.8344788 C54.7254089,82.8684071 56.3175932,81.2745911 58.2890859,81.2745911 L79.6408336,81.2745911 C81.608998,81.2745911 83.2045105,82.8724076 83.2045105,84.8344788 C83.2045105,86.7992907 81.614366,88.3923238 79.6446228,88.3943645 L79.6446228,88.3943646 L79.6446228,138.232794 C79.6446228,144.131009 74.8631748,148.912457 68.9649597,148.912457 C63.0667446,148.912457 58.2852966,144.131009 58.2852966,138.232794 Z M65.405072,-14.8423767 L72.5248474,-14.8423767 L76.0847351,-0.690681892 L72.5248474,6.51694947 L72.5248474,81.2745911 L65.405072,81.2745911 L65.405072,6.51694947 L61.8451843,-0.690681892 L65.405072,-14.8423767 Z" transform="translate(68.964960, 67.035040) rotate(45.000000) translate(-68.964960, -67.035040) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-theme-button tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z"/><path d="M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z"/></g></svg> \ No newline at end of file diff --git a/core/images/timestamp-off.tid b/core/images/timestamp-off.tid index 132dfc127..0d20f28d6 100644 --- a/core/images/timestamp-off.tid +++ b/core/images/timestamp-off.tid @@ -1,8 +1,4 @@ title: $:/core/images/timestamp-off tags: $:/tags/Image -<svg class="tc-image-timestamp-off tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10c-2.762 0-5-2.24-5-5-.004-2.756 2.238-5 5-5H66.69c2.762 0 5.002 2.24 5 5 .006 2.757-2.238 5-5 5H49.705z"/><path d="M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z"/> - </g> -</svg> +<svg width="22pt" height="22pt" class="tc-image-timestamp-off tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z"/><path d="M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z"/></g></svg> \ No newline at end of file diff --git a/core/images/timestamp-on.tid b/core/images/timestamp-on.tid index 292181b49..3a16df7eb 100644 --- a/core/images/timestamp-on.tid +++ b/core/images/timestamp-on.tid @@ -1,8 +1,4 @@ title: $:/core/images/timestamp-on tags: $:/tags/Image -<svg class="tc-image-timestamp-on tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10c-2.762 0-5-2.24-5-5-.004-2.756 2.238-5 5-5H66.69c2.762 0 5.002 2.24 5 5 .006 2.757-2.238 5-5 5H49.705z"/><path d="M13.41 27.178c-2.116 1.775-5.27 1.498-7.045-.613-1.772-2.11-1.498-5.27.616-7.047l9.95-8.348c2.115-1.774 5.27-1.5 7.045.618 1.775 2.108 1.498 5.27-.616 7.043l-9.95 8.348zM102.983 27.178c2.116 1.775 5.27 1.498 7.045-.613 1.772-2.11 1.498-5.27-.616-7.047l-9.95-8.348c-2.114-1.774-5.27-1.5-7.044.618-1.775 2.108-1.498 5.27.616 7.043l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z"/> - </g> -</svg> +<svg width="22pt" height="22pt" class="tc-image-timestamp-on tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z"/><path d="M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z"/></g></svg> \ No newline at end of file diff --git a/core/images/tip.tid b/core/images/tip.tid index 88a622ab0..f8109ada4 100755 --- a/core/images/tip.tid +++ b/core/images/tip.tid @@ -1,8 +1,4 @@ title: $:/core/images/tip tags: $:/tags/Image -<svg class="tc-image-tip tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M64,128.241818 C99.346224,128.241818 128,99.5880417 128,64.2418177 C128,28.8955937 99.346224,0.241817675 64,0.241817675 C28.653776,0.241817675 0,28.8955937 0,64.2418177 C0,99.5880417 28.653776,128.241818 64,128.241818 Z M75.9358659,91.4531941 C75.3115438,95.581915 70.2059206,98.8016748 64,98.8016748 C57.7940794,98.8016748 52.6884562,95.581915 52.0641341,91.4531941 C54.3299053,94.0502127 58.8248941,95.8192805 64,95.8192805 C69.1751059,95.8192805 73.6700947,94.0502127 75.9358659,91.4531941 L75.9358659,91.4531941 Z M75.9358659,95.9453413 C75.3115438,100.074062 70.2059206,103.293822 64,103.293822 C57.7940794,103.293822 52.6884562,100.074062 52.0641341,95.9453413 C54.3299053,98.5423599 58.8248941,100.311428 64,100.311428 C69.1751059,100.311428 73.6700947,98.5423599 75.9358659,95.9453413 L75.9358659,95.9453413 Z M75.9358659,100.40119 C75.3115438,104.529911 70.2059206,107.74967 64,107.74967 C57.7940794,107.74967 52.6884562,104.529911 52.0641341,100.40119 C54.3299053,102.998208 58.8248941,104.767276 64,104.767276 C69.1751059,104.767276 73.6700947,102.998208 75.9358659,100.40119 L75.9358659,100.40119 Z M75.9358659,104.893337 C75.3115438,109.022058 70.2059206,112.241818 64,112.241818 C57.7940794,112.241818 52.6884562,109.022058 52.0641341,104.893337 C54.3299053,107.490356 58.8248941,109.259423 64,109.259423 C69.1751059,109.259423 73.6700947,107.490356 75.9358659,104.893337 L75.9358659,104.893337 Z M64.3010456,24.2418177 C75.9193117,24.2418188 88.0000013,32.0619847 88,48.4419659 C87.9999987,64.8219472 75.9193018,71.7540963 75.9193021,83.5755932 C75.9193022,89.4486648 70.0521957,92.8368862 63.9999994,92.8368862 C57.947803,92.8368862 51.9731007,89.8295115 51.9731007,83.5755932 C51.9731007,71.1469799 39.9999998,65.4700602 40,48.4419647 C40.0000002,31.4138691 52.6827796,24.2418166 64.3010456,24.2418177 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-tip tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z"/></svg> \ No newline at end of file diff --git a/core/images/transcludify.tid b/core/images/transcludify.tid index 33f7e0af1..0579feb10 100644 --- a/core/images/transcludify.tid +++ b/core/images/transcludify.tid @@ -1,4 +1,4 @@ title: $:/core/images/transcludify tags: $:/tags/Image -<svg class="tc-transcludify-button tc-image-button" viewBox="0 0 128 128" width="22pt" height="22pt"><path d="M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 0 0 2.75-.932 6.762 6.762 0 0 0 2.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 0 0-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 0 0-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 0 0 2.75-.932 6.762 6.762 0 0 0 2.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 0 0-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 0 0-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 0 0-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 0 0 .71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 0 0-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 0 0 2.262 2.084 8.868 8.868 0 0 0 2.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 0 0-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 0 0 .71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 0 0-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 0 0 2.262 2.084 8.868 8.868 0 0 0 2.75 1.02c.946.177 1.745.266 2.395.266v7.806z" fill-rule="evenodd"/></svg> +<svg width="22pt" height="22pt" class="tc-transcludify-button tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z"/></svg> \ No newline at end of file diff --git a/core/images/twitter.tid b/core/images/twitter.tid index 614cf762c..28cfccdbd 100755 --- a/core/images/twitter.tid +++ b/core/images/twitter.tid @@ -1,8 +1,4 @@ title: $:/core/images/twitter tags: $:/tags/Image -<svg class="tc-image-twitter tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M41.6263422,115.803477 C27.0279663,115.803477 13.4398394,111.540813 1.99987456,104.234833 C4.02221627,104.472643 6.08004574,104.594302 8.16644978,104.594302 C20.277456,104.594302 31.4238403,100.47763 40.270894,93.5715185 C28.9590538,93.3635501 19.4123842,85.9189246 16.1230832,75.6885328 C17.7011365,75.9892376 19.320669,76.1503787 20.9862896,76.1503787 C23.344152,76.1503787 25.6278127,75.8359011 27.7971751,75.247346 C15.9709927,72.8821073 7.06079851,62.4745062 7.06079851,49.9982394 C7.06079851,49.8898938 7.06079851,49.7820074 7.06264203,49.67458 C10.5482779,51.6032228 14.5339687,52.7615103 18.7717609,52.8951059 C11.8355159,48.277565 7.2714207,40.3958845 7.2714207,31.4624258 C7.2714207,26.7434257 8.54621495,22.3200804 10.7713439,18.5169676 C23.5211299,34.0957738 42.568842,44.3472839 64.0532269,45.4210985 C63.6126256,43.5365285 63.3835682,41.5711584 63.3835682,39.5529928 C63.3835682,25.3326379 74.95811,13.8034766 89.2347917,13.8034766 C96.6697089,13.8034766 103.387958,16.930807 108.103682,21.9353619 C113.991886,20.780288 119.52429,18.6372496 124.518847,15.6866694 C122.588682,21.6993889 118.490075,26.7457211 113.152623,29.9327334 C118.381769,29.3102055 123.363882,27.926045 127.999875,25.8780385 C124.534056,31.0418981 120.151087,35.5772616 115.100763,39.2077561 C115.150538,40.3118708 115.175426,41.4224128 115.175426,42.538923 C115.175426,76.5663154 89.1744164,115.803477 41.6263422,115.803477"></path> - </g> -</svg> +<svg width="22pt" height="22pt" class="tc-image-twitter tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265"/></svg> \ No newline at end of file diff --git a/core/images/underline.tid b/core/images/underline.tid index 22465748b..768d2a199 100755 --- a/core/images/underline.tid +++ b/core/images/underline.tid @@ -1,8 +1,4 @@ title: $:/core/images/underline tags: $:/tags/Image -<svg class="tc-image-underline tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M7,117.421488 L121.247934,117.421488 L121.247934,128 L7,128 L7,117.421488 Z M104.871212,98.8958333 L104.871212,0 L88.6117424,0 L88.6117424,55.8560606 C88.6117424,60.3194668 88.0060035,64.432115 86.7945076,68.1941288 C85.5830116,71.9561425 83.7657949,75.239885 81.342803,78.0454545 C78.9198111,80.8510241 75.8911167,83.0189317 72.2566288,84.5492424 C68.6221409,86.0795531 64.3182067,86.844697 59.344697,86.844697 C53.0959284,86.844697 48.1862552,85.0593613 44.6155303,81.4886364 C41.0448054,77.9179114 39.2594697,73.0720003 39.2594697,66.9507576 L39.2594697,0 L23,0 L23,65.0378788 C23,70.3939662 23.5419769,75.2717583 24.625947,79.6714015 C25.709917,84.0710447 27.5908957,87.864883 30.2689394,91.0530303 C32.9469831,94.2411776 36.4538925,96.6960141 40.7897727,98.4176136 C45.125653,100.139213 50.545422,101 57.0492424,101 C64.3182182,101 70.630655,99.5653553 75.9867424,96.6960227 C81.3428298,93.8266902 85.742407,89.33147 89.1856061,83.2102273 L89.5681818,83.2102273 L89.5681818,98.8958333 L104.871212,98.8958333 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-underline tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z"/></svg> \ No newline at end of file diff --git a/core/images/unfold-all-button.tid b/core/images/unfold-all-button.tid index 29f217b94..e496bdd89 100755 --- a/core/images/unfold-all-button.tid +++ b/core/images/unfold-all-button.tid @@ -1,11 +1,4 @@ title: $:/core/images/unfold-all-button tags: $:/tags/Image -<svg class="tc-image-unfold-all tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <rect x="0" y="0" width="128" height="16" rx="8"></rect> - <rect x="0" y="64" width="128" height="16" rx="8"></rect> - <path d="M85.598226,8.34884273 C84.1490432,6.89863875 82.1463102,6 79.9340286,6 L47.9482224,6 C43.5292967,6 39.9411255,9.581722 39.9411255,14 C39.9411255,18.4092877 43.5260249,22 47.9482224,22 L71.9411255,22 L71.9411255,45.9929031 C71.9411255,50.4118288 75.5228475,54 79.9411255,54 C84.3504132,54 87.9411255,50.4151006 87.9411255,45.9929031 L87.9411255,14.0070969 C87.9411255,11.7964515 87.0447363,9.79371715 85.5956548,8.34412458 Z" transform="translate(63.941125, 30.000000) scale(1, -1) rotate(-45.000000) translate(-63.941125, -30.000000) "></path> - <path d="M85.6571005,72.2899682 C84.2079177,70.8397642 82.2051847,69.9411255 79.9929031,69.9411255 L48.0070969,69.9411255 C43.5881712,69.9411255 40,73.5228475 40,77.9411255 C40,82.3504132 43.5848994,85.9411255 48.0070969,85.9411255 L72,85.9411255 L72,109.934029 C72,114.352954 75.581722,117.941125 80,117.941125 C84.4092877,117.941125 88,114.356226 88,109.934029 L88,77.9482224 C88,75.737577 87.1036108,73.7348426 85.6545293,72.2852501 Z" transform="translate(64.000000, 93.941125) scale(1, -1) rotate(-45.000000) translate(-64.000000, -93.941125) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-unfold-all tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="128" height="16" rx="8"/><rect width="128" height="16" y="64" rx="8"/><path d="M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z"/></g></svg> \ No newline at end of file diff --git a/core/images/unfold-button.tid b/core/images/unfold-button.tid index bd4e9036d..cfad70570 100755 --- a/core/images/unfold-button.tid +++ b/core/images/unfold-button.tid @@ -1,10 +1,4 @@ title: $:/core/images/unfold-button tags: $:/tags/Image -<svg class="tc-image-unfold tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <rect x="0" y="0" width="128" height="16" rx="8"></rect> - <path d="M85.598226,11.3488427 C84.1490432,9.89863875 82.1463102,9 79.9340286,9 L47.9482224,9 C43.5292967,9 39.9411255,12.581722 39.9411255,17 C39.9411255,21.4092877 43.5260249,25 47.9482224,25 L71.9411255,25 L71.9411255,48.9929031 C71.9411255,53.4118288 75.5228475,57 79.9411255,57 C84.3504132,57 87.9411255,53.4151006 87.9411255,48.9929031 L87.9411255,17.0070969 C87.9411255,14.7964515 87.0447363,12.7937171 85.5956548,11.3441246 Z" transform="translate(63.941125, 33.000000) scale(1, -1) rotate(-45.000000) translate(-63.941125, -33.000000) "></path> - <path d="M85.6571005,53.4077172 C84.2079177,51.9575133 82.2051847,51.0588745 79.9929031,51.0588745 L48.0070969,51.0588745 C43.5881712,51.0588745 40,54.6405965 40,59.0588745 C40,63.4681622 43.5848994,67.0588745 48.0070969,67.0588745 L72,67.0588745 L72,91.0517776 C72,95.4707033 75.581722,99.0588745 80,99.0588745 C84.4092877,99.0588745 88,95.4739751 88,91.0517776 L88,59.0659714 C88,56.855326 87.1036108,54.8525917 85.6545293,53.4029991 Z" transform="translate(64.000000, 75.058875) scale(1, -1) rotate(-45.000000) translate(-64.000000, -75.058875) "></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-unfold tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><rect width="128" height="16" rx="8"/><path d="M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z"/></g></svg> \ No newline at end of file diff --git a/core/images/unlocked-padlock.tid b/core/images/unlocked-padlock.tid index 6e24bb3b3..c5367c085 100755 --- a/core/images/unlocked-padlock.tid +++ b/core/images/unlocked-padlock.tid @@ -1,8 +1,4 @@ title: $:/core/images/unlocked-padlock tags: $:/tags/Image -<svg class="tc-image-unlocked-padlock tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M48.6266053,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L30.136303,64 C19.6806213,51.3490406 2.77158986,28.2115132 25.8366966,8.85759246 C50.4723026,-11.8141335 71.6711028,13.2108337 81.613302,25.0594855 C91.5555012,36.9081373 78.9368488,47.4964439 69.1559674,34.9513593 C59.375086,22.4062748 47.9893192,10.8049522 35.9485154,20.9083862 C23.9077117,31.0118202 34.192312,43.2685325 44.7624679,55.8655518 C47.229397,58.805523 48.403443,61.5979188 48.6266053,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-unlocked-padlock tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z"/></svg> \ No newline at end of file diff --git a/core/images/up-arrow.tid b/core/images/up-arrow.tid index b680b69df..a1bd132bf 100755 --- a/core/images/up-arrow.tid +++ b/core/images/up-arrow.tid @@ -3,7 +3,4 @@ modified: 20150316000831867 tags: $:/tags/Image title: $:/core/images/up-arrow -<svg class="tc-image-up-arrow tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> -<path transform="rotate(-135, 63.8945, 64.1752)" d="m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25074c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056l0.00001,-0.00001z" /> -</svg> - +<svg width="22pt" height="22pt" class="tc-image-up-arrow tc-image-button" viewBox="0 0 128 128"><path d="M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z"/></svg> \ No newline at end of file diff --git a/core/images/video.tid b/core/images/video.tid index 6ae9fd46a..3bf0bb259 100755 --- a/core/images/video.tid +++ b/core/images/video.tid @@ -1,8 +1,4 @@ title: $:/core/images/video tags: $:/tags/Image -<svg class="tc-image-video tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M64,12 C29.0909091,12 8.72727273,14.9166667 5.81818182,17.8333333 C2.90909091,20.75 1.93784382e-15,41.1666667 0,64.5 C1.93784382e-15,87.8333333 2.90909091,108.25 5.81818182,111.166667 C8.72727273,114.083333 29.0909091,117 64,117 C98.9090909,117 119.272727,114.083333 122.181818,111.166667 C125.090909,108.25 128,87.8333333 128,64.5 C128,41.1666667 125.090909,20.75 122.181818,17.8333333 C119.272727,14.9166667 98.9090909,12 64,12 Z M54.9161194,44.6182253 C51.102648,42.0759111 48.0112186,43.7391738 48.0112186,48.3159447 L48.0112186,79.6840553 C48.0112186,84.2685636 51.109784,85.9193316 54.9161194,83.3817747 L77.0838806,68.6032672 C80.897352,66.0609529 80.890216,61.9342897 77.0838806,59.3967328 L54.9161194,44.6182253 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-video tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z"/></svg> \ No newline at end of file diff --git a/core/images/warning.tid b/core/images/warning.tid index 1a34233dc..53bff59ec 100755 --- a/core/images/warning.tid +++ b/core/images/warning.tid @@ -1,8 +1,4 @@ title: $:/core/images/warning tags: $:/tags/Image -<svg class="tc-image-warning tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"> - <g fill-rule="evenodd"> - <path d="M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z"></path> - </g> -</svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-warning tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z"/></svg> \ No newline at end of file From 015306dfc9099f4d5d9415b64266d328a154b119 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 25 Nov 2019 12:15:24 +0000 Subject: [PATCH 0422/2376] Remove extraneous paths from line-width and list icons Fixes #4369 and #4368 --- core/images/line-width.tid | 2 +- core/images/list.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/images/line-width.tid b/core/images/line-width.tid index eb1ad21df..f77763ce6 100755 --- a/core/images/line-width.tid +++ b/core/images/line-width.tid @@ -1,4 +1,4 @@ title: $:/core/images/line-width tags: $:/tags/Image -<svg width="22pt" height="22pt" class="tc-image-line-width tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M128-97h-15.007c-.54 0-.993.448-.993 1 0 .556.444 1 .993 1H128v-2zm0 18.32l-16.784-9.69a1.002 1.002 0 00-1.36.37.994.994 0 00.36 1.362L128-76.37v-2.31zM78.68-128l9.69 16.784a.994.994 0 01-.37 1.36 1.002 1.002 0 01-1.362-.36L76.37-128h2.31zM97-128v15.007a.994.994 0 01-1 .993c-.552 0-1-.452-1-.993V-128h2zm18.63 0l-10.268 17.784a.994.994 0 01-1.362.36 1.002 1.002 0 01-.37-1.36L113.32-128h2.31zM128-113.32l-16.784 9.69a.994.994 0 01-1.36-.37 1.002 1.002 0 01.36-1.362L128-115.63v2.31zM48-96c0-.552.452-1 .993-1h30.014c.549 0 .993.444.993 1 0 .552-.452 1-.993 1H48.993A.994.994 0 0148-96zm6.43-24c.277-.478.893-.64 1.36-.37l25.994 15.008c.475.274.638.88.36 1.362-.277.478-.892.64-1.36.37L54.79-118.638a.994.994 0 01-.36-1.362zM104-82.144a1.002 1.002 0 011.362.36L120.37-55.79a.994.994 0 01-.37 1.36 1.002 1.002 0 01-1.362-.36L103.63-80.784a.994.994 0 01.37-1.36zM96-80c.552 0 1 .452 1 .993v30.014A.994.994 0 0196-48c-.552 0-1-.452-1-.993v-30.014A.994.994 0 0196-80zm-8-2.144c.478.277.64.892.37 1.36L73.362-54.79a.994.994 0 01-1.362.36 1.002 1.002 0 01-.37-1.36l15.008-25.993a.994.994 0 011.362-.36zM82.144-88a1.002 1.002 0 01-.36 1.362L55.79-71.63a.994.994 0 01-1.36-.37 1.002 1.002 0 01.36-1.362L80.784-88.37a.994.994 0 011.36.37zM0-41.987l15.017-16.005 5.781 5.017L44.721-81.21 73.426-42.1l12.559-14.516 18.502 22.585 23.482-13.467V0H0v-41.987zM96-84c6.627 0 12-5.373 12-12s-5.373-12-12-12-12 5.373-12 12 5.373 12 12 12zM16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z"/></g></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-line-width tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z"/></svg> \ No newline at end of file diff --git a/core/images/list.tid b/core/images/list.tid index 41fdb1894..22b784bfe 100644 --- a/core/images/list.tid +++ b/core/images/list.tid @@ -1,4 +1,4 @@ title: $:/core/images/list tags: $:/tags/Image -<svg width="22pt" height="22pt" class="tc-image-list tc-image-button" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M-85.737 197.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0l-22.628 22.628a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137zM87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z"/></g></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-list tc-image-button" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z"/></svg> \ No newline at end of file From e33d519ce0d78974d7cef80521abe63c131927cc Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 9 Dec 2019 09:05:21 +0000 Subject: [PATCH 0423/2376] Update docs for "each" filter --- editions/tw5.com/tiddlers/filters/each.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/each.tid b/editions/tw5.com/tiddlers/filters/each.tid index 0216b065d..6bcc88340 100644 --- a/editions/tw5.com/tiddlers/filters/each.tid +++ b/editions/tw5.com/tiddlers/filters/each.tid @@ -1,5 +1,5 @@ created: 20140410103123179 -modified: 20170103175939836 +modified: 20191209085901849 tags: [[Filter Operators]] [[Group Operators]] title: each Operator type: text/vnd.tiddlywiki @@ -20,6 +20,6 @@ Each input title is processed in turn. The value of field <<.place F>> in the co ;each:value :As long as the title is unique it is appended to the output whether or not the corresponding tiddler exists. -If a tiddler does not contain field <<.place F>>, it is treated as if the value of the field were empty. +Note that if a tiddler does not contain field <<.place F>>, it is treated as if the value of the field were empty. Thus, a filter expression such as `[each[color]]` will return one tiddler that doesn't have a `color` field. To obtain just the tiddlers that have a non-blank value for the `color` field one can use `[each[color]has[color]]`. <<.operator-examples "each">> From e3fd14d6e71e247677c6da476ee59aaaa98fbf24 Mon Sep 17 00:00:00 2001 From: Will Atwood Mitchell <wam@users.noreply.github.com> Date: Thu, 12 Dec 2019 11:45:55 -0500 Subject: [PATCH 0424/2376] Signing the CLA (#4387) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 126f9b6af..8bb836e60 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -377,3 +377,5 @@ Mark Stegeman, @markstegeman, 2019/08/31 Jan-Oliver Kaiser, @janno, 2019/09/06 Xavier Maysonnave, @xmaysonnave, 2019/11/08 + +Will Atwood Mitchell, @wam, 2019/12/11 From d23545de1f375eac2581d0f3ace4e97c725e8dbb Mon Sep 17 00:00:00 2001 From: Will Atwood Mitchell <wam@users.noreply.github.com> Date: Thu, 12 Dec 2019 11:48:38 -0500 Subject: [PATCH 0425/2376] Update links to Json Mangler plugin github pages (#4388) The plugin's repo appears to have been renamed. --- .../resources/Json Mangler plugin by Joshua Fontany.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid b/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid index a02972a63..548e0685c 100644 --- a/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid +++ b/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid @@ -7,6 +7,6 @@ Extend tiddlywiki to parse complex ("nested") json data tiddlers. Json Mangler introduces a new path syntax for indexes of json data tiddlers , and includes many supporting tools, filters, widgets, etc. -Example Wiki: https://joshuafontany.github.io/TW5-JsonManglerPlugin/ +Example Wiki: https://joshuafontany.github.io/TW5-JsonMangler/ -Source: https://github.com/joshuafontany/TW5-JsonManglerPlugin \ No newline at end of file +Source: https://github.com/joshuafontany/TW5-JsonMangler From 0671bc5afd252d0043dccfd898ec7ee3a186884a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 12 Dec 2019 17:39:23 +0000 Subject: [PATCH 0426/2376] Tweak docs for each filter --- editions/tw5.com/tiddlers/filters/each.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/each.tid b/editions/tw5.com/tiddlers/filters/each.tid index 6bcc88340..c6140b791 100644 --- a/editions/tw5.com/tiddlers/filters/each.tid +++ b/editions/tw5.com/tiddlers/filters/each.tid @@ -20,6 +20,6 @@ Each input title is processed in turn. The value of field <<.place F>> in the co ;each:value :As long as the title is unique it is appended to the output whether or not the corresponding tiddler exists. -Note that if a tiddler does not contain field <<.place F>>, it is treated as if the value of the field were empty. Thus, a filter expression such as `[each[color]]` will return one tiddler that doesn't have a `color` field. To obtain just the tiddlers that have a non-blank value for the `color` field one can use `[each[color]has[color]]`. +Note that if a tiddler does not contain field <<.place F>>, it is treated as if the value of the field were empty. Thus, a filter expression such as `[each[motovun]]` will return one tiddler that doesn't have a `motovun` field, as well as one tiddler with each distinct value of that field, if any. To obtain just the tiddlers that have a non-blank value for the `motovun` field one can use `[each[motovun]has[motovun]]`. <<.operator-examples "each">> From 55ed290e18d6abd3bb64efb3b4db2346cb11c214 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 12 Dec 2019 18:02:21 +0000 Subject: [PATCH 0427/2376] Fix tests in tiddlywiki-com branch by forcing an older version of node.js --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d7f1a5566..35c645056 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js - - "node" + - "8" stages: - name: test From 28b91613019d9470eecd2c0a6d847922ab32fac9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 12 Dec 2019 18:05:31 +0000 Subject: [PATCH 0428/2376] Another attempt to force Travis to use an old Node.js Another attempt at 55ed290e1 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 35c645056..2de1ce8a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: node_js +node_js: - "8" stages: From 144ec28552035d1519adfd0edcbd148bcc1d33a5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 17 Dec 2019 12:01:59 +0000 Subject: [PATCH 0429/2376] Update class settings in edit template to match view template @pmario this adds the tc-tagged- classes to the edit template, do you think that's useful? --- core/ui/EditTemplate.tid | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/ui/EditTemplate.tid b/core/ui/EditTemplate.tid index f3e82fa8f..1d342ef7b 100644 --- a/core/ui/EditTemplate.tid +++ b/core/ui/EditTemplate.tid @@ -8,10 +8,7 @@ title: $:/core/ui/EditTemplate <$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/> <$action-sendmessage $message="tm-save-tiddler"/> \end -\define frame-classes() -tc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ -\end -<div class=<<frame-classes>> data-tiddler-title=<<currentTiddler>>> +<div data-tiddler-title=<<currentTiddler>> 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[ ]] }}}> <$fieldmangler> <$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify "$:/temp/NewTagName">> newFieldNameTiddler=<<qualify "$:/temp/NewFieldName">> newFieldValueTiddler=<<qualify "$:/temp/NewFieldValue">>> <$keyboard key="((cancel-edit-tiddler))" message="tm-cancel-tiddler"> From 3aa5198c3ef603030bfe7507ca37989db55cc321 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 19 Dec 2019 14:38:09 +0100 Subject: [PATCH 0430/2376] Update tests (#4392) add 3 new tiddlers, add 1 "enlist" test, fix all tests that failed, because 3 new tiddlers where added. stopped ESLint to complain about global vars, fix some mixed-tab-space indent typos. --- editions/test/tiddlers/tests/test-filters.js | 184 +++++++++++-------- 1 file changed, 103 insertions(+), 81 deletions(-) diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 13e939c4d..d63f9d893 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -9,7 +9,7 @@ Tests the filtering mechanism. (function(){ /*jslint node: true, browser: true */ -/*global $tw: false */ +/*global $tw: false, describe: false, it: false, expect: false, require: false*/ "use strict"; describe("Filter tests", function() { @@ -29,14 +29,14 @@ describe("Filter tests", function() { [ { prefix : '', operators : [ { operator : 'search', suffix : ' one, two ,three : four, , five,, six ', suffixes : [ [ 'one', 'two', 'three' ], [ 'four', 'five', 'six' ] ], operand : 'operand' } ] } ] ); expect($tw.wiki.parseFilter("[search: , : [operand]]")).toEqual( - [ { prefix : '', operators : [ { operator : 'search', suffix : ' , : ', suffixes : [ [ ], [ ] ], operand : 'operand' } ] } ] + [ { prefix : '', operators : [ { operator : 'search', suffix : ' , : ', suffixes : [ [ ], [ ] ], operand : 'operand' } ] } ] ); }); describe("With no indexers", function() { var wiki = setupWiki({enableIndexers: []}); it("should not create indexes when requested not to",function() { - expect(wiki.getIndexer("FieldIndexer")).toBe(null); + expect(wiki.getIndexer("FieldIndexer")).toBe(null); }); runTests(wiki); }); @@ -44,7 +44,7 @@ describe("Filter tests", function() { describe("With all indexers", function() { var wiki = setupWiki(); if(wiki.getIndexer("FieldIndexer")) { - wiki.getIndexer("FieldIndexer").setMaxIndexedValueLength(8); // Note that JoeBloggs is 9, and JohnDoe is 7 + wiki.getIndexer("FieldIndexer").setMaxIndexedValueLength(8); // Note that JoeBloggs is 9, and John is 5 } runTests(wiki); }); @@ -63,6 +63,7 @@ function setupWiki(wikiOptions) { "TiddlerSix": { title: "TiddlerSix", text: "Missing inaction from TiddlerOne", + filter: "[[one]] [[a a]] [subfilter{hasList!!list}]", tags: [] }, "TiddlerSeventh": { @@ -76,7 +77,7 @@ function setupWiki(wikiOptions) { text: "Tidd", tags: ["one"], "test-field": "JoeBloggs" - } + } } }; wiki.addTiddler({ @@ -97,26 +98,41 @@ function setupWiki(wikiOptions) { text: "The rain in Spain\nfalls mainly on the plain and [[a fourth tiddler]]", tags: ["two"], authors: "[[John Doe]]", - modifier: "JohnDoe", + modifier: "John", modified: "201304152211"}); wiki.addTiddler({ title: "Tiddler Three", text: "The speed of sound in light\n\nThere is no TiddlerZero but TiddlerSix", tags: ["one","two"], - modifier: "JohnDoe", + modifier: "John", modified: "201304162202"}); wiki.addTiddler({ title: "a fourth tiddler", text: "The quality of mercy is not drained by [[Tiddler Three]]", tags: [], empty: "not", - modifier: "JohnDoe"}); + modifier: "John"}); wiki.addTiddler({ title: "one", text: "This is the text of tiddler [[one]]", list: "[[Tiddler Three]] [[TiddlerOne]]", empty: "", - modifier: "JohnDoe"}); + modifier: "John"}); + wiki.addTiddler({ + title: "hasList", + text: "This is the text of tiddler [[hasList]]", + list: "[[Tiddler Three]] [[TiddlerOne]]", + modifier: "PMario"}); + wiki.addTiddler({ + title: "has filter", + text: "This is the text of tiddler [[has filter]]", + filter: "[[Tiddler Three]] [[TiddlerOne]] [subfilter{hasList!!list}]", + modifier: "PMario"}); + wiki.addTiddler({ + title: "filter regexp test", + text: "Those strings have been used to create the `regexp = /[+|\-|~]?([[](?:[^\]])*\]+)|([+|-|~|\S]\S*)/;`", + filter: "+aaa -bbb ~ccc aaaaaabbbbbbbbaa \"bb'b\" 'cc\"c' [[abc]] [[tiddler with spaces]] [is[test]] [is[te st]] a s df [enlist<hugo>] +[enlist:raw{test with spaces}] [enlist:raw{test with spaces}] [[a a]] [[ ] [ ]] [[ [hugo]] [subfilter{Story/Tower of Hanoi/A-C Sequence}]", + modifier: "PMario"}); // Unpack plugin tiddlers wiki.readPluginInfo(); wiki.registerPluginTiddlers("plugin"); @@ -128,18 +144,22 @@ function setupWiki(wikiOptions) { // Our tests function runTests(wiki) { + it("should handle the enlist operator", function() { + expect(wiki.filterTiddlers("[enlist[one two three]addsuffix[!]]").join(",")).toBe("one!,two!,three!"); + }); + it("should handle the then and else operators", function() { - expect(wiki.filterTiddlers("[modifier[JoeBloggs]then[JaneBloggs]]").join(",")).toBe("JaneBloggs"); - expect(wiki.filterTiddlers("[!modifier[JoeBloggs]then[JaneBloggs]]").join(",")).toBe("JaneBloggs,JaneBloggs,JaneBloggs,JaneBloggs,JaneBloggs"); - expect(wiki.filterTiddlers("[modifier[DaveBloggs]then[JaneBloggs]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[modifier[JoeBloggs]else[JaneBloggs]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[!modifier[JoeBloggs]else[JaneBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[modifier[DaveBloggs]else[JaneBloggs]]").join(",")).toBe("JaneBloggs"); + expect(wiki.filterTiddlers("[modifier[JoeBloggs]then[Susi]]").join(",")).toBe("Susi"); + expect(wiki.filterTiddlers("[!modifier[JoeBloggs]then[Susi]]").join(",")).toBe("Susi,Susi,Susi,Susi,Susi,Susi,Susi,Susi"); + expect(wiki.filterTiddlers("[modifier[DaveBloggs]then[Susi]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[modifier[JoeBloggs]else[Susi]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!modifier[JoeBloggs]else[Susi]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[modifier[DaveBloggs]else[Susi]]").join(",")).toBe("Susi"); }); it("should handle the ~ prefix", function() { expect(wiki.filterTiddlers("[modifier[JoeBloggs]] ~[[No such tiddler]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[modifier[JaneBloggs]] ~[[No such tiddler]]").join(",")).toBe("No such tiddler"); + expect(wiki.filterTiddlers("[modifier[Susi]] ~[[No such tiddler]]").join(",")).toBe("No such tiddler"); expect(wiki.filterTiddlers("~[[No such tiddler]]").join(",")).toBe("No such tiddler"); expect(wiki.filterTiddlers("[my-field[present]] ~[[No such tiddler]]").join(",")).toBe("No such tiddler"); }); @@ -155,33 +175,35 @@ function runTests(wiki) { it("should handle the title operator", function() { expect(wiki.filterTiddlers("TiddlerOne [title[$:/TiddlerTwo]] [[Tiddler Three]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three"); - expect(wiki.filterTiddlers("[!title[Tiddler Three]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!title[Tiddler Three]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,a fourth tiddler,one,hasList,has filter,filter regexp test"); expect(wiki.filterTiddlers("TiddlerOne [title[$:/TiddlerTwo]] [[Tiddler Three]] [[A Missing Tiddler]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,A Missing Tiddler"); }); it("should handle the field operator", function() { expect(wiki.filterTiddlers("[modifier[JoeBloggs]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[!modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!is[system]!modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[!is[system]!modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); expect(wiki.filterTiddlers("[field:modifier[JoeBloggs]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[!field:modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!is[system]!field:modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[modifier[JohnDoe]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!modifier[JohnDoe]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne"); - expect(wiki.filterTiddlers("[!is[system]!modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[field:modifier[JohnDoe]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!field:modifier[JohnDoe]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne"); - expect(wiki.filterTiddlers("[!is[system]!field:modifier[JohnDoe]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[!field:modifier[JoeBloggs]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[!is[system]!field:modifier[JoeBloggs]]").join(",")).toBe("Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[modifier[John]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!modifier[John]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[!is[system]!modifier[John]]").join(",")).toBe("TiddlerOne,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[field:modifier[John]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!field:modifier[John]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[!is[system]!field:modifier[John]]").join(",")).toBe("TiddlerOne,hasList,has filter,filter regexp test"); }); it("should handle the regexp operator", function() { expect(wiki.filterTiddlers("[regexp[id]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler"); - expect(wiki.filterTiddlers("[!regexp[id]]").join(",")).toBe("$:/ShadowPlugin,one"); + expect(wiki.filterTiddlers("[!regexp[id]]").join(",")).toBe("$:/ShadowPlugin,one,hasList,has filter,filter regexp test"); expect(wiki.filterTiddlers("[regexp[Tid]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three"); expect(wiki.filterTiddlers("[regexp[(?i)Tid]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler"); - expect(wiki.filterTiddlers("[!regexp[Tid(?i)]]").join(",")).toBe("$:/ShadowPlugin,one"); + expect(wiki.filterTiddlers("[!regexp[Tid(?i)]]").join(",")).toBe("$:/ShadowPlugin,one,hasList,has filter,filter regexp test"); }); + // The following 2 tests should write a log -> WARNING: Filter modifier has a deprecated regexp operand XXXX + // The test should pass anyway. it("should handle the field operator with a regular expression operand", function() { expect(wiki.filterTiddlers("[modifier/JoeBloggs/]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[modifier/Jo/]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); @@ -193,8 +215,8 @@ function runTests(wiki) { }); it("should handle the sort and sortcs operators", function() { - expect(wiki.filterTiddlers("[sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[!sort[title]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!sort[title]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,hasList,has filter,filter regexp test,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); // Temporarily commenting out the following two lines because of platform differences for localeCompare between the browser and Node.js // expect(wiki.filterTiddlers("[sortcs[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler,one"); // expect(wiki.filterTiddlers("[!sortcs[title]]").join(",")).toBe("one,a fourth tiddler,TiddlerOne,Tiddler Three,$:/TiddlerTwo"); @@ -203,31 +225,31 @@ function runTests(wiki) { it("should handle the reverse, first, last, butfirst, butlast, rest and nth operators", function() { expect(wiki.filterTiddlers("[sort[title]first[]]").join(",")).toBe("$:/ShadowPlugin"); expect(wiki.filterTiddlers("[sort[title]first[2]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[sort[title]first[8]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]first[8]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three"); expect(wiki.filterTiddlers("[sort[title]first[x]]").join(",")).toBe("$:/ShadowPlugin"); expect(wiki.filterTiddlers("[sort[title]last[]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[sort[title]last[2]]").join(",")).toBe("Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]last[8]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]last[8]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[sort[title]last[x]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]reverse[]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); - expect(wiki.filterTiddlers("[sort[title]reverse[x]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); - expect(wiki.filterTiddlers("[sort[title]butlast[]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); - expect(wiki.filterTiddlers("[sort[title]butlast[2]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[sort[title]butlast[8]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[sort[title]butlast[x]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); - expect(wiki.filterTiddlers("[sort[title]rest[]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]rest[2]]").join(",")).toBe("a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[sort[title]rest[8]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[sort[title]rest[x]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]reverse[]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,hasList,has filter,filter regexp test,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[sort[title]reverse[x]]").join(",")).toBe("TiddlerOne,Tiddler Three,one,hasList,has filter,filter regexp test,a fourth tiddler,$:/TiddlerTwo,$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[sort[title]butlast[]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three"); + expect(wiki.filterTiddlers("[sort[title]butlast[2]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one"); + expect(wiki.filterTiddlers("[sort[title]butlast[11]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[sort[title]butlast[x]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three"); + expect(wiki.filterTiddlers("[sort[title]rest[]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]rest[2]]").join(",")).toBe("a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[sort[title]rest[11]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[sort[title]rest[x]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[sort[title]nth[]]").join(",")).toBe("$:/ShadowPlugin"); expect(wiki.filterTiddlers("[sort[title]nth[2]]").join(",")).toBe("$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[sort[title]nth[8]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[sort[title]nth[11]]").join(",")).toBe(""); expect(wiki.filterTiddlers("[sort[title]nth[x]]").join(",")).toBe("$:/ShadowPlugin"); }); it("should handle the tag operator", function() { expect(wiki.filterTiddlers("[tag[one]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[!tag[one]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!tag[one]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one"); expect(wiki.filterTiddlers("[prefix[Tidd]tag[one]sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[!is[shadow]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three"); expect(wiki.filterTiddlers("[all[shadows]tag[two]sort[title]]").join(",")).toBe("$:/TiddlerFive"); @@ -237,8 +259,8 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[all[shadows]tag[two]]").join(",")).toBe("$:/TiddlerFive"); expect(wiki.filterTiddlers("[all[shadows+tiddlers]tag[two]]").join(",")).toBe("$:/TiddlerFive,$:/TiddlerTwo,Tiddler Three"); expect(wiki.filterTiddlers("[all[tiddlers+shadows]tag[two]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,$:/TiddlerFive"); - expect(wiki.filterTiddlers("[all[shadows+tiddlers]]").join(",")).toBe("$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8,$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - expect(wiki.filterTiddlers("[all[tiddlers+shadows]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8"); + expect(wiki.filterTiddlers("[all[shadows+tiddlers]]").join(",")).toBe("$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8,$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); + expect(wiki.filterTiddlers("[all[tiddlers+shadows]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test,$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8"); expect(wiki.filterTiddlers("[all[tiddlers]tag[two]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three"); }); @@ -250,11 +272,11 @@ function runTests(wiki) { it("should handle the match operator", function() { expect(wiki.filterTiddlers("[match[TiddlerOne]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("TiddlerOne TiddlerOne =[match[TiddlerOne]]").join(",")).toBe("TiddlerOne,TiddlerOne"); - expect(wiki.filterTiddlers("[!match[TiddlerOne]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!match[TiddlerOne]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); expect(wiki.filterTiddlers("[match:casesensitive[tiddlerone]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[!match:casesensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!match:casesensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); expect(wiki.filterTiddlers("[match:caseinsensitive[tiddlerone]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[!match:caseinsensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!match:caseinsensitive[tiddlerone]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); }); it("should handle the tagging operator", function() { @@ -266,33 +288,33 @@ function runTests(wiki) { }); it("should handle the untagged operator", function() { - expect(wiki.filterTiddlers("[untagged[]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[untagged[]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,filter regexp test,has filter,hasList,one"); expect(wiki.filterTiddlers("[!untagged[]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); }); it("should handle the links operator", function() { - expect(wiki.filterTiddlers("[!is[shadow]links[]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerSix,TiddlerZero"); + expect(wiki.filterTiddlers("[!is[shadow]links[]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,has filter,hasList,one,Tiddler Three,TiddlerSix,TiddlerZero"); expect(wiki.filterTiddlers("[all[shadows]links[]sort[title]]").join(",")).toBe("TiddlerOne"); }); it("should handle the backlinks operator", function() { - expect(wiki.filterTiddlers("[!is[shadow]backlinks[]sort[title]]").join(",")).toBe("a fourth tiddler,one,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[shadow]backlinks[]sort[title]]").join(",")).toBe("a fourth tiddler,has filter,hasList,one,TiddlerOne"); expect(wiki.filterTiddlers("[all[shadows]backlinks[]sort[title]]").join(",")).toBe("Tiddler Three"); }); it("should handle the has operator", function() { expect(wiki.filterTiddlers("[has[modified]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[!has[modified]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!has[modified]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,filter regexp test,has filter,hasList,one"); }); it("should handle the has:field operator", function() { expect(wiki.filterTiddlers("[has:field[empty]sort[title]]").join(",")).toBe("a fourth tiddler,one"); - expect(wiki.filterTiddlers("[!has:field[empty]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!has:field[empty]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,filter regexp test,has filter,hasList,Tiddler Three,TiddlerOne"); }); it("should handle the limit operator", function() { - expect(wiki.filterTiddlers("[!is[system]sort[title]limit[2]]").join(",")).toBe("a fourth tiddler,one"); + expect(wiki.filterTiddlers("[!is[system]sort[title]limit[2]]").join(",")).toBe("a fourth tiddler,filter regexp test"); expect(wiki.filterTiddlers("[prefix[Tid]sort[title]limit[1]]").join(",")).toBe("Tiddler Three"); expect(wiki.filterTiddlers("[prefix[Tid]sort[title]!limit[1]]").join(",")).toBe("TiddlerOne"); }); @@ -302,26 +324,26 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[tag[one]list[TiddlerSeventh]sort[title]]").join(",")).toBe("a fourth tiddler,MissingTiddler,Tiddler Three,TiddlerOne"); }); - it("should handle the next operator", function() { - expect(wiki.filterTiddlers("[[Tiddler Three]next[TiddlerSeventh]]").join(",")).toBe("a fourth tiddler"); - expect(wiki.filterTiddlers("[[MissingTiddler]next[TiddlerSeventh]]").join(",")).toBe(""); - }); + it("should handle the next operator", function() { + expect(wiki.filterTiddlers("[[Tiddler Three]next[TiddlerSeventh]]").join(",")).toBe("a fourth tiddler"); + expect(wiki.filterTiddlers("[[MissingTiddler]next[TiddlerSeventh]]").join(",")).toBe(""); + }); - it("should handle the previous operator", function() { - expect(wiki.filterTiddlers("[[Tiddler Three]previous[TiddlerSeventh]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[[TiddlerOne]previous[TiddlerSeventh]]").join(",")).toBe(""); - }); + it("should handle the previous operator", function() { + expect(wiki.filterTiddlers("[[Tiddler Three]previous[TiddlerSeventh]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[[TiddlerOne]previous[TiddlerSeventh]]").join(",")).toBe(""); + }); it("should handle the search operator", function() { - expect(wiki.filterTiddlers("[search[the]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[search{Tiddler8}sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[search[the]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[search{Tiddler8}sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,has filter,hasList,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[search:modifier[og]sort[title]]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[search:modifier,authors:casesensitive[Do]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); + expect(wiki.filterTiddlers("[search:modifier,authors:casesensitive[Do]sort[title]]").join(",")).toBe("$:/TiddlerTwo"); expect(wiki.filterTiddlers("[search:modifier,authors:casesensitive[do]sort[title]]").join(",")).toBe(""); expect(wiki.filterTiddlers("[search:authors:casesensitive,whitespace[John Doe]sort[title]]").join(",")).toBe("$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[search:modifier:regexp[(d|bl)o(ggs|e)]sort[title]]").join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); - expect(wiki.filterTiddlers("[search:-modifier,authors:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,Tiddler Three"); - expect(wiki.filterTiddlers("[search:*:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[search:modifier:regexp[(d|bl)o(ggs|e)]sort[title]]").join(",")).toBe("TiddlerOne"); + expect(wiki.filterTiddlers("[search:-modifier,authors:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,Tiddler Three"); + expect(wiki.filterTiddlers("[search:*:[g]sort[title]]").join(",")).toBe("$:/ShadowPlugin,filter regexp test,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[search:text:anchored[the]]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler"); }); @@ -330,7 +352,7 @@ function runTests(wiki) { }); it("should handle the each operator", function() { - expect(wiki.filterTiddlers("[each[modifier]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,TiddlerOne"); + expect(wiki.filterTiddlers("[each[modifier]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,hasList,TiddlerOne"); expect(wiki.filterTiddlers("[each:list-item[tags]sort[title]]").join(",")).toBe("one,two"); expect(wiki.filterTiddlers("[each:list-item[authors]sort[title]]").join(",")).toBe("Bloggs,Joe,John Doe"); }); @@ -350,36 +372,36 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[is[current]]",fakeWidget).join(",")).toBe("Tiddler Three"); expect(wiki.filterTiddlers("[[Tiddler Three]is[current]]",fakeWidget).join(",")).toBe("Tiddler Three"); expect(wiki.filterTiddlers("[[$:/TiddlerTwo]is[current]]",fakeWidget).join(",")).toBe(""); - expect(wiki.filterTiddlers("[!is[current]sort[title]]",fakeWidget).join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[current]sort[title]]",fakeWidget).join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,TiddlerOne"); }); it("should handle the '[is[system]]' operator", function() { expect(wiki.filterTiddlers("[is[system]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo"); - expect(wiki.filterTiddlers("[!is[system]sort[title]]").join(",")).toBe("a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[system]sort[title]]").join(",")).toBe("a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); }); it("should handle the '[is[shadow]]' operator", function() { expect(wiki.filterTiddlers("[all[shadows]sort[title]]").join(",")).toBe("$:/TiddlerFive,Tiddler8,TiddlerSeventh,TiddlerSix"); - expect(wiki.filterTiddlers("[!is[shadow]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[shadow]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); }); it("should handle the '[is[missing]]' operator", function() { - expect(wiki.filterTiddlers("[all[]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(wiki.filterTiddlers("[all[]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); expect(wiki.filterTiddlers("[all[missing]]").join(",")).toBe("TiddlerZero"); - expect(wiki.filterTiddlers("[!is[missing]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[missing]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[[TiddlerOne]is[missing]]").join(",")).toBe(""); expect(wiki.filterTiddlers("[[TiddlerZero]is[missing]]").join(",")).toBe("TiddlerZero"); expect(wiki.filterTiddlers("[!title[Tiddler Three]is[missing]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[missing]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,one,TiddlerOne"); + expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[missing]sort[title]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,a fourth tiddler,filter regexp test,has filter,hasList,one,TiddlerOne"); }); it("should handle the '[is[orphan]]' operator", function() { - expect(wiki.filterTiddlers("[is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,TiddlerOne"); - expect(wiki.filterTiddlers("[!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,one"); + expect(wiki.filterTiddlers("[is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,filter regexp test,TiddlerOne"); + expect(wiki.filterTiddlers("[!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,one,hasList,has filter"); expect(wiki.filterTiddlers("[[TiddlerOne]is[orphan]]").join(",")).toBe("TiddlerOne"); expect(wiki.filterTiddlers("[[TiddlerOne]!is[orphan]]").join(",")).toBe(""); - expect(wiki.filterTiddlers("[!title[Tiddler Three]is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,TiddlerOne"); - expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,one"); + expect(wiki.filterTiddlers("[!title[Tiddler Three]is[orphan]sort[title]]").join(",")).toBe("a fourth tiddler,filter regexp test,TiddlerOne"); + expect(wiki.filterTiddlers("[!title[Tiddler Three]!is[orphan]]").join(",")).toBe("$:/ShadowPlugin,$:/TiddlerTwo,one,hasList,has filter"); }); }); From dd62efd459ced5f39807d4d64d3049487d74bdeb Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 22 Dec 2019 12:37:30 +0000 Subject: [PATCH 0431/2376] Updated Portuguese Translation See https://groups.google.com/d/msg/tiddlywiki/esj5IB935oo/xS-F9n5FBAAJ --- languages/pt-PT/Buttons.multids | 23 ++++++-- languages/pt-PT/ControlPanel.multids | 47 +++++++++++++-- languages/pt-PT/Dates.multids | 64 +++++++++++---------- languages/pt-PT/Docs/ModuleTypes.multids | 5 +- languages/pt-PT/Docs/PaletteColours.multids | 14 +++-- languages/pt-PT/EditTemplate.multids | 7 ++- languages/pt-PT/Fields.multids | 5 +- languages/pt-PT/Filters.multids | 2 + languages/pt-PT/GettingStarted.tid | 2 +- languages/pt-PT/Help/build.tid | 5 +- languages/pt-PT/Help/clearpassword.tid | 2 +- languages/pt-PT/Help/default.tid | 2 +- languages/pt-PT/Help/deletetiddlers.tid | 8 +++ languages/pt-PT/Help/editions.tid | 2 +- languages/pt-PT/Help/fetch.tid | 38 ++++++++++++ languages/pt-PT/Help/help.tid | 2 +- languages/pt-PT/Help/import.tid | 24 ++++++++ languages/pt-PT/Help/init.tid | 2 +- languages/pt-PT/Help/listen.tid | 34 +++++++++++ languages/pt-PT/Help/load.tid | 2 +- languages/pt-PT/Help/makelibrary.tid | 2 +- languages/pt-PT/Help/output.tid | 3 +- languages/pt-PT/Help/password.tid | 3 +- languages/pt-PT/Help/render.tid | 34 +++++++++++ languages/pt-PT/Help/rendertiddlers.tid | 2 +- languages/pt-PT/Help/save.tid | 25 ++++++++ languages/pt-PT/Help/savetiddler.tid | 2 +- languages/pt-PT/Help/savetiddlers.tid | 2 +- languages/pt-PT/Help/savewikifolder.tid | 19 ++++++ languages/pt-PT/Help/server.tid | 2 +- languages/pt-PT/Help/setfield.tid | 2 +- languages/pt-PT/Help/unpackplugin.tid | 4 +- languages/pt-PT/Help/verbose.tid | 2 +- languages/pt-PT/Help/version.tid | 2 +- languages/pt-PT/Import.multids | 8 +++ languages/pt-PT/Misc.multids | 11 +++- languages/pt-PT/NewJournal.multids | 1 + languages/pt-PT/Notifications.multids | 2 + languages/pt-PT/Search.multids | 14 ++--- languages/pt-PT/SideBar.multids | 1 + languages/pt-PT/SiteSubtitle.tid | 2 +- languages/pt-PT/SiteTitle.tid | 2 +- languages/pt-PT/ThemeTweaks.multids | 3 +- 43 files changed, 351 insertions(+), 87 deletions(-) create mode 100644 languages/pt-PT/Help/deletetiddlers.tid create mode 100644 languages/pt-PT/Help/fetch.tid create mode 100644 languages/pt-PT/Help/import.tid create mode 100644 languages/pt-PT/Help/listen.tid create mode 100644 languages/pt-PT/Help/render.tid create mode 100644 languages/pt-PT/Help/save.tid create mode 100644 languages/pt-PT/Help/savewikifolder.tid diff --git a/languages/pt-PT/Buttons.multids b/languages/pt-PT/Buttons.multids index 44fb59913..80336411b 100644 --- a/languages/pt-PT/Buttons.multids +++ b/languages/pt-PT/Buttons.multids @@ -18,6 +18,8 @@ CloseOthers/Caption: Fechar outros CloseOthers/Hint: Fechar os outros tiddlers ControlPanel/Caption: painel de controlo ControlPanel/Hint: Abrir o painel de controlo +CopyToClipboard/Caption: copy to clipboard +CopyToClipboard/Hint: Copy this text to the clipboard Delete/Caption: eliminar Delete/Hint: eliminar este tiddler Edit/Caption: editar @@ -38,8 +40,9 @@ Excise/Caption/MacroName: Nome da Macro: Excise/Caption/NewTitle: Título do novo tiddler: Excise/Caption/Replace: Substituir texto separado por: Excise/Caption/Replace/Link: ligação +Excise/Caption/Replace/Macro: macro Excise/Caption/Replace/Transclusion: transclusão -Excise/Caption/Tag: Etiquetar novo tiddler com o título deste tiddler +Excise/Caption/Tag: Etiquetar novo tiddler com o título deste tiddle Excise/Caption/TiddlerExists: Atenção: tiddler já existente Excise/Hint: Separar o texto seleccionado para um novo tiddler ExportPage/Caption: exportar tudo @@ -88,6 +91,8 @@ LineWidth/Caption: espessura da linha LineWidth/Hint: Definir espessura de linha para desenhar Link/Caption: ligação Link/Hint: Criar ligação em wikitext +Linkify/Caption: wikilink +Linkify/Hint: Envolver selecção em parentesis rectos ListBullet/Caption: Lista com marcadores ListBullet/Hint: Aplicar formatação de lista com marcadores às linhas contendo selecção ListNumber/Caption: lista numerada @@ -97,7 +102,7 @@ Manager/Hint: Abrir gestor de tiddlers MonoBlock/Caption: bloco mono-espaçado MonoBlock/Hint: Aplicar formatação de bloco mono-espaçado às linhas contendo selecção MonoLine/Caption: mono-espaçado -MonoLine/Hint: Aplicar formatação mono-espaçado à selecção +MonoLine/Hint: Aplicar formatação mono-espaçada à selecção More/Caption: mais More/Hint: Mais acções NewHere/Caption: derivar @@ -131,17 +136,20 @@ Preview/Hint: Mostrar o painel de pré-visualização PreviewType/Caption: tipo de pré-visualização PreviewType/Hint: Escolher o tipo de pré-visualização Print/Caption: imprimir página -Print/Hint: Imprimir página atual +Print/Hint: Imprimir página actual Quote/Caption: citação Quote/Hint: Aplicar formatação de citação às linhas contendo selecção Refresh/Caption: actualizar Refresh/Hint: Recarregar totalmente a wiki actual +RotateLeft/Caption: rodar para a esquerda +RotateLeft/Hint: Rodar imagens para a esquerda 90 graus Save/Caption: guardar Save/Hint: Guardar este tiddler SaveWiki/Caption: guardar alterações SaveWiki/Hint: Guardar as alterações ShowSideBar/Caption: Mostrar barra lateral ShowSideBar/Hint: Mostrar a barra lateral +SidebarSearch/Hint: Seleccionar o campo de pesquisa da barra lateral Size/Caption: tamanho da imagem Size/Caption/Height: Altura: Size/Caption/Resize: Redimensionar imagem @@ -155,7 +163,7 @@ Stamp/New/Title: Nome a exibir no menu StoryView/Caption: Vista principal StoryView/Hint: Escolher a visualização principal Strikethrough/Caption: rasurado -Strikethrough/Hint: Aplicar formatação rasurado à selecção +Strikethrough/Hint: Aplicar formatação rasurada à selecção Subscript/Caption: subscrita Subscript/Hint: Aplicar formatação subscrita à selecção Superscript/Caption: sobrescrita @@ -165,11 +173,14 @@ TagManager/Hint: Abrir o gestor de etiquetas Theme/Caption: tema Theme/Hint: Escolher o tema de exibição Timestamp/Caption: marcações de data/hora -Timestamp/Hint: Escolha se as modificações atualizam as marcações de data/hora +Timestamp/Hint: Escolha se as modificações actualizam as marcações de data/hora Timestamp/Off/Caption: Marcações de data/hora estão desligadas -Timestamp/Off/Hint: Não atualizar as marcações de data/hora quando as tiddlers são modificadas +Timestamp/Off/Hint: Não actualizar as marcações de data/hora quando as tiddlers são modificadas Timestamp/On/Caption: Marcações de data/hora estão ligadas Timestamp/On/Hint: Atualizar as marcações de data/hora quando as tiddlers são modificadas +ToggleSidebar/Hint: Alternar visibilidade da Barra Lateral +Transcludify/Caption: transclusão +Transcludify/Hint: Envolver selecção em chavetas Underline/Caption: sublinhar Underline/Hint: Aplicar formatação sublinhada à selecção Unfold/Caption: desdobrar tiddler diff --git a/languages/pt-PT/ControlPanel.multids b/languages/pt-PT/ControlPanel.multids index eb046645d..070223550 100644 --- a/languages/pt-PT/ControlPanel.multids +++ b/languages/pt-PT/ControlPanel.multids @@ -11,7 +11,9 @@ Basics/DefaultTiddlers/Prompt: Tiddlers pré definidos: Basics/DefaultTiddlers/TopHint: Escolha que tiddlers são exibidos ao iniciar: Basics/Language/Prompt: Olá! Linguagem actual: Basics/NewJournal/Tags/Prompt: Etiquetas para novos tiddlers-diário +Basics/NewJournal/Text/Prompt: Texto para novos tiddlers-diário Basics/NewJournal/Title/Prompt: Título de novos tiddlers-diário +Basics/NewTiddler/Title/Prompt: Título de novos tiddlers Basics/OverriddenShadowTiddlers/Prompt: Número de tiddlers-sombra sobrescritos: Basics/ShadowTiddlers/Prompt: Número de tiddlers-sombra: Basics/Subtitle/Prompt: Subtítulo: @@ -45,6 +47,8 @@ LoadedModules/Hint: Estes são os módulos tiddler actualmente carregados conect Palette/Caption: Paleta Palette/Editor/Clone/Caption: clonar Palette/Editor/Clone/Prompt: Recomenda-se que clone esta paleta-sombra antes de a editar +Palette/Editor/Delete/Hint: apagar esta entrada da paleta actual +Palette/Editor/Names/External/Show: Mostrar nomes das cores que não fazem parte da paleta actual Palette/Editor/Prompt: Edição Palette/Editor/Prompt/Modified: Esta paleta-sombra foi modificada Palette/Editor/Reset/Caption: repor @@ -53,13 +57,18 @@ Palette/Prompt: Paleta actual: Palette/ShowEditor/Caption: mostrar editor Parsing/Block/Caption: Regras de análise de blocos Parsing/Caption: Análise -Parsing/Hint: Aqui pode desactivar globalmente regras individuais do analisador de wiki. Tenha em atenção que desactivar certas regras de análise pode impedir a ~TiddlyWiki de funcionar correctamente (pode repor o funcionamento normal com o [[modo de segurança|https://tiddlywiki.com/#SafeMode]] ) +Parsing/Hint: Aqui pode activar/desactivar globalmente regras individuais do analisador de wiki. para que as alterações tomem efeito tem de recarregar a wiki. Desactivar certas regras de análise pode impedir a <$text text="TiddlyWiki"/> de funcionar correctamente. Utilize o [[modo seguro|https://tiddlywiki.com/#SafeMode]] + para repor o normal funcionamento. + +Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text="TiddlyWiki"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation. + Parsing/Inline/Caption: Regras de Análise em Linha Parsing/Pragma/Caption: Regras de Análise Pragma Plugins/Add/Caption: Obter mais extensões Plugins/Add/Hint: Instalar extensões da biblioteca de extensões oficial Plugins/AlreadyInstalled/Hint: Esta extensão já se encontra instalada com a versão<$text text=<<installedVersion>>/> Plugins/Caption: Extensões +Plugins/ClosePluginLibrary: fechar biblioteca de extensões Plugins/Disable/Caption: desactivar Plugins/Disable/Hint: Desactivar esta extensão quando recarregar a página Plugins/Disabled/Status: (inactivo) @@ -82,15 +91,35 @@ Plugins/Theme/Prompt: Temas Plugins/Themes/Caption: Temas Plugins/Themes/Hint: Extensões de Temas Saving/Caption: A gravar +Saving/DownloadSaver/AutoSave/Description: Permitir gravação automática para módulo de gravação por transferência +Saving/DownloadSaver/AutoSave/Hint: Activar Gravação automática para o Módulo de Gravação por Transferência +Saving/DownloadSaver/Caption: Módulo de Gravação por Transferência +Saving/DownloadSaver/Hint: Estas definições aplicam-se ao módulo de gravação por transferência compatível com HTML5 +Saving/General/Caption: Geral +Saving/General/Hint: Estas definições aplicam-se a todos os módulos de gravação carregados +Saving/GitService/Branch: Ramo alvo para gravação +Saving/GitService/CommitMessage: Guardado por TiddlyWiki +Saving/GitService/Description: Estas definições serão apenas utilizadas quando gravar para <<service-name>> +Saving/GitService/Filename: Nome de ficheiro do ficheiro alvo (p.e. `index.html`) +Saving/GitService/GitHub/Caption: Módulo de Gravação ~GitHub +Saving/GitService/GitHub/Password: Palavra Passe, token OAUTH, ou token de acesso pessoal (ver [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] para mais detalhes) +Saving/GitService/GitLab/Caption: Módulo de Gravação ~GitLab +Saving/GitService/GitLab/Password: Token de acesso pessoal para a API (ver [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] para mais detalhes) +Saving/GitService/Path: Caminho para o ficheiro alvo (p.e. `/wiki/`) +Saving/GitService/Repo: Repositório Alvo (p.e. `Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: URL da API do Servidor +Saving/GitService/UserName: Nome de Utilizador Saving/Heading: A gravar +Saving/Hint: Definições utilizadas para guardar a TiddlyWiki inteira como um só ficheiro através de um módulo de gravação Saving/TiddlySpot/Advanced/Heading: Definições Avançadas Saving/TiddlySpot/BackupDir: Directoria de cópias de segurança Saving/TiddlySpot/Backups: Cópias de Segurança +Saving/TiddlySpot/Caption: ~TiddlySpot Saver Saving/TiddlySpot/Description: Estas definições só serão utilizadas quando gravar para http://tiddlyspot.com ou um servidor remoto compatível Saving/TiddlySpot/Filename: Nome do ficheiro para envio Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //O URL por defeito será `http://<wikiname>.tiddlyspot.com/store.cgi` e pode ser alterado para utilizar um endereço de servidor personalizado// -Saving/TiddlySpot/Password: Palavra passe +Saving/TiddlySpot/Password: Palavra Passe Saving/TiddlySpot/ServerURL: URL do Servidor Saving/TiddlySpot/UploadDir: Directoria de Envio Saving/TiddlySpot/UserName: Nome da Wiki @@ -102,6 +131,8 @@ Settings/CamelCase/Caption: Ligações Wiki em Camel Case Settings/CamelCase/Description: Activar ligações em frases ~CamelCase automaticamente Settings/CamelCase/Hint: Pode desactivar a criação automática de ligações em frases em ~CamelCase. Requer recarregar o texto para que tome efeito Settings/Caption: Definições +Settings/DefaultMoreSidebarTab/Caption: Separador Mais da Barra Lateral pré Definido +Settings/DefaultMoreSidebarTab/Hint: Especificar que separador Mais é exibido por defeito Settings/DefaultSidebarTab/Caption: Separador da barra lateral pré-definido Settings/DefaultSidebarTab/Hint: Definir que separador da barra lateral é exibido por defeito Settings/EditorToolbar/Caption: Barra de Ferramentas do Editor @@ -131,9 +162,13 @@ Settings/NavigationHistory/Caption: Histórico de Navegação Settings/NavigationHistory/Hint: Actualizar o histórico do navegador quando navegar para um tiddler Settings/NavigationHistory/No/Description: Não actualizar o histórico Settings/NavigationHistory/Yes/Description: Actualizar o histórico +Settings/NavigationPermalinkviewMode/Caption: Modo Permalink/permaview +Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Copiar URL permalink/permaview para a area de trabalho +Settings/NavigationPermalinkviewMode/Hint: Escolher como a permalink/permaview é processada: +Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Actualizar a barra de endereço com URL permalink/permaview Settings/PerformanceInstrumentation/Caption: Instrumentação de Performance Settings/PerformanceInstrumentation/Description: Activar instrumentação de performance -Settings/PerformanceInstrumentation/Hint: Exibe estatísticas de performance na consola de desenvolvimento do navegador. Requer recarregamento para que tome efeito +Settings/PerformanceInstrumentation/Hint: Exibe estatísticas de performance na consola de desenvolvimento do navegador. Requer recarregar para que tome efeito. Settings/TitleLinks/Caption: Títulos dos Tiddlers Settings/TitleLinks/Hint: Exibir opcionalmente títulos dos tiddlers como ligações Settings/TitleLinks/No/Description: Não exibir títulos dos tiddlers como ligações @@ -149,13 +184,17 @@ Settings/ToolbarButtonStyle/Styles/Boxed: Caixa Settings/ToolbarButtonStyle/Styles/Rounded: Arredondados StoryView/Caption: Vista principal StoryView/Prompt: Vista actual: +Stylesheets/Caption: Folhas de Estilos +Stylesheets/Expand/Caption: Expandir Tudo +Stylesheets/Hint: This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag "$:/tags/Stylesheet">> +Stylesheets/Restore/Caption: Restore Theme/Caption: Tema Theme/Prompt: Tema Actual TiddlerFields/Caption: Campos dos Tiddlers TiddlerFields/Hint: Esta é uma lista completa dos campos dos tiddlers em utilização nesta wiki (incluindo tiddlers de sistema mas excluindo tiddlers-sombra). Toolbars/Caption: Barras de Ferramentas Toolbars/EditorToolbar/Caption: Barra de Ferramentas do Editor -Toolbars/EditorToolbar/Hint: Escolha que botões devem ser exibidos na barra de ferramentas do editor. Alguns botões só serão exibidos enquanto edita tiddlers de certo tipo +Toolbars/EditorToolbar/Hint: Escolha que botões devem ser exibidos na barra de ferramentas do editor. Alguns botões só serão exibidos enquanto edita tiddlers de certo tipo. Arraste para mudar a ordem. Toolbars/EditToolbar/Caption: Barra de Ferramentas de Edição Toolbars/EditToolbar/Hint: Escolher que botões são exibidos para tiddlers em modo de edição Toolbars/Hint: Seleccionar que botões da barra de ferramentas são exibidos diff --git a/languages/pt-PT/Dates.multids b/languages/pt-PT/Dates.multids index 340d7818e..6e298cf64 100644 --- a/languages/pt-PT/Dates.multids +++ b/languages/pt-PT/Dates.multids @@ -1,36 +1,36 @@ title: $:/language/ -Date/DaySuffix/1: -Date/DaySuffix/10: -Date/DaySuffix/11: -Date/DaySuffix/12: -Date/DaySuffix/13: -Date/DaySuffix/14: -Date/DaySuffix/15: -Date/DaySuffix/16: -Date/DaySuffix/17: -Date/DaySuffix/18: -Date/DaySuffix/19: -Date/DaySuffix/2: -Date/DaySuffix/20: -Date/DaySuffix/21: -Date/DaySuffix/22: -Date/DaySuffix/23: -Date/DaySuffix/24: -Date/DaySuffix/25: -Date/DaySuffix/26: -Date/DaySuffix/27: -Date/DaySuffix/28: -Date/DaySuffix/29: -Date/DaySuffix/3: -Date/DaySuffix/30: -Date/DaySuffix/31: -Date/DaySuffix/4: -Date/DaySuffix/5: -Date/DaySuffix/6: -Date/DaySuffix/7: -Date/DaySuffix/8: -Date/DaySuffix/9: +Date/DaySuffix/1: º +Date/DaySuffix/10: º +Date/DaySuffix/11: º +Date/DaySuffix/12: º +Date/DaySuffix/13: º +Date/DaySuffix/14: º +Date/DaySuffix/15: º +Date/DaySuffix/16: º +Date/DaySuffix/17: º +Date/DaySuffix/18: º +Date/DaySuffix/19: º +Date/DaySuffix/2: º +Date/DaySuffix/20: º +Date/DaySuffix/21: º +Date/DaySuffix/22: º +Date/DaySuffix/23: º +Date/DaySuffix/24: º +Date/DaySuffix/25: º +Date/DaySuffix/26: º +Date/DaySuffix/27: º +Date/DaySuffix/28: º +Date/DaySuffix/29: º +Date/DaySuffix/3: º +Date/DaySuffix/30: º +Date/DaySuffix/31: º +Date/DaySuffix/4: º +Date/DaySuffix/5: º +Date/DaySuffix/6: º +Date/DaySuffix/7: º +Date/DaySuffix/8: º +Date/DaySuffix/9: º Date/Long/Day/0: Domingo Date/Long/Day/1: Segunda Date/Long/Day/2: Terça @@ -69,6 +69,8 @@ Date/Short/Month/6: Jun Date/Short/Month/7: Jul Date/Short/Month/8: Ago Date/Short/Month/9: Set +Date/Period/am: am +Date/Period/pm: pm RelativeDate/Future/Days: Dentro de <<period>> dias RelativeDate/Future/Hours: Dentro de <<period>> horas RelativeDate/Future/Minutes: Dentro de <<period>> minutos diff --git a/languages/pt-PT/Docs/ModuleTypes.multids b/languages/pt-PT/Docs/ModuleTypes.multids index 8a2209c32..16aaff406 100644 --- a/languages/pt-PT/Docs/ModuleTypes.multids +++ b/languages/pt-PT/Docs/ModuleTypes.multids @@ -2,6 +2,8 @@ title: $:/language/Docs/ModuleTypes/ allfilteroperator: Um sub-operador para o operador de filtro "All". animation: Animações que podem ser utilizadas com a RevealWidget. +authenticator: Define como os pedidos são autenticados pelo servidor HTTP integrado. +bitmapeditoroperation: A bitmap editor toolbar operation. command: Comandos que podem ser executados no Node.js. config: Informação a ser inserida em `$tw.config`. filteroperator: Métodos de filtragem individuais. @@ -10,7 +12,8 @@ info: Publica a informação do sistema através da [[$:/temp/info-plugin]] pseu isfilteroperator: Operandos para o operador de filtragem ''is''. library: Tipo de módulo genérico para módulos de JavaScript de usos gerais. macro: Definições de macros JavaScript. -parser: Interpretadores para diferentes tipos de conteúdo. +parser: Interpretadores para diferentes tipos de conteúdo.« +route: Define como são processados padrões individuais de URL pelo servidor integrado. saver: Os savers controlam diferentes métodos para guardar ficheiros a partir do navegador. startup: Funções de arranque. storyview: As story views personalizam as animações e comportamento das ferramentas de listagem. diff --git a/languages/pt-PT/Docs/PaletteColours.multids b/languages/pt-PT/Docs/PaletteColours.multids index 459a626ea..b7bd3cb84 100644 --- a/languages/pt-PT/Docs/PaletteColours.multids +++ b/languages/pt-PT/Docs/PaletteColours.multids @@ -3,7 +3,7 @@ title: $:/language/Docs/PaletteColours/ alert-background: Fundo de alertas alert-border: Margem de alertas alert-highlight: Realce de alertas -alert-muted-foreground: Fundo de alertas silenciados +alert-muted-foreground: Fundo de alertas suavizados background: Fundo geral blockquote-bar: Barra de citação button-background: Fundo de botão pré-definido @@ -18,7 +18,7 @@ download-foreground: Primeiro plano do botão de transferências dragger-background: Fundo da zona de arrasto dragger-foreground: Primeiro plano da zona de arrasto dropdown-background: Fundo de menu suspenso -dropdown-border: Margem de menu suspenso +dropdown-border: Margem de menu suspenso dropdown-tab-background: Fundo de separador suspenso dropdown-tab-background-selected: Fundo para separador suspenso seleccionado dropzone-background: Fundo de zona de largada @@ -38,20 +38,22 @@ modal-border: Margem de modal modal-footer-background: Fundo do rodapé modal modal-footer-border: Margem do rodapé modal modal-header-border: Margem do cabeçalho modal -muted-foreground: Primeiro plano silenciado geral +muted-foreground: Primeiro plano suavizado geral notification-background: Fundo de notificação notification-border: Margem de notificação page-background: Fundo de página pre-background: Fundo de código pré formatado pre-border: Margem de código pré formatado primary: Primário geral +select-tag-background: `<select>` element background +select-tag-foreground: `<select>` element text sidebar-button-foreground: Fundo de botões da barra lateral sidebar-controls-foreground: Primeiro plano de controles da barra lateral sidebar-controls-foreground-hover: Primeiro plano de controles da barra lateral sob cursor sidebar-foreground: Primeiro plano da barra lateral sidebar-foreground-shadow: Sombra de primeiro plano da barra lateral -sidebar-muted-foreground: Primeiro plano silenciado da barra lateral -sidebar-muted-foreground-hover: Primeiro plano silenciado da barra lateral sob cursor +sidebar-muted-foreground: Primeiro plano suavizado da barra lateral +sidebar-muted-foreground-hover: Primeiro plano suavizado da barra lateral sob cursor sidebar-tab-background: Fundo de separador da barra lateral sidebar-tab-background-selected: Fundo de separador seleccionado da barra lateral sidebar-tab-border: Margem de separador da barra lateral @@ -102,4 +104,4 @@ toolbar-new-button: Botão 'novo tiddler' da barra de ferramentas toolbar-options-button: Botão 'opções' da barra de ferramentas toolbar-save-button: Botão 'guardar' da barra de ferramentas untagged-background: Fundo de cápsula sem etiqueta -very-muted-foreground: Fundo muito silenciado +very-muted-foreground: Fundo muito suavizado diff --git a/languages/pt-PT/EditTemplate.multids b/languages/pt-PT/EditTemplate.multids index d5e06d001..fab8cf18b 100644 --- a/languages/pt-PT/EditTemplate.multids +++ b/languages/pt-PT/EditTemplate.multids @@ -1,8 +1,10 @@ title: $:/language/EditTemplate/ -Body/External/Hint: Este é um tiddler armazenado fora do ficheiro principal da Tiddlywiki. Pode mudar as etiquetas mas não pode editar o seu conteúdo +Body/External/Hint: Este é um tiddler armazenado fora do ficheiro principal da TiddlyWiki. Pode mudar as etiquetas mas não pode editar o seu conteúdo Body/Placeholder: Escreva o texto para este tiddler Body/Preview/Type/Output: resultado +Field/Dropdown/Caption: lista de campos +Field/Dropdown/Hint: Mostrar lista de campos Field/Remove/Caption: remover campo Field/Remove/Hint: Remover campo Fields/Add/Button: adicionar @@ -18,6 +20,9 @@ Tags/Add/Placeholder: nome da etiqueta Tags/Dropdown/Caption: lista de etiquetas Tags/Dropdown/Hint: Mostrar a lista de etiquetas Title/BadCharacterWarning: Atenção: Evite utilizar os caracteres <<bad-chars>> no título de tiddlers +Title/Exists/Prompt: Tiddler alvo já existente +Title/References/Prompt: As seguintes referências a este tiddler não serão automaticamente actualizadas: +Title/Relink/Prompt: Actualizar ''<$text text=<<fromTitle>>/>'' para ''<$text text=<<toTitle>>/>'' nas //etiquetas// e nos campos //list// de outros tiddlers Type/Delete/Caption: apagar tipo de conteúdo Type/Delete/Hint: Apagar tipo de conteúdo Type/Dropdown/Caption: Lista de tipo de conteúdo diff --git a/languages/pt-PT/Fields.multids b/languages/pt-PT/Fields.multids index e07bf64f7..64ce52508 100644 --- a/languages/pt-PT/Fields.multids +++ b/languages/pt-PT/Fields.multids @@ -13,11 +13,13 @@ description: O texto descritivo de uma extensão, ou diálogo modal draft.of: Para tiddlers rascunho, contém o título do tiddler do qual este é rascunho draft.title: Para tiddlers rascunho, contém o título proposto para o novo tiddler footer: O texto de rodapé para um assistente +hack-to-give-us-something-to-compare-against: Um campo temporário utilizado em [[$:/core/templates/static.content]] +hide-body: O modelo de visualização esconderá o corpo dos tiddlers se definido como: ''yes'' icon: O título do tiddler que contém o ícone associado com determinado tiddler library: Se definido como "yes" indica que o tiddler deve ser gravado como uma biblioteca JavaScript list: Uma lista ordenada de títulos de tiddlers associados com um determinado tiddler list-after: Se definido, o título do tiddler a seguir ao qual este tiddler deve ser adicionado numa lista ordenada de títulos de tiddlers -list-before: Se definido, o título do tiddler a antes do qual este tiddler deve ser adicionado numa lista ordenada de títulos de tiddlers, ou no início da lista se este campo estiver presente mas vazio +list-before: Se definido, o título do tiddler antes do qual este tiddler deve ser adicionado numa lista ordenada de títulos de tiddlers, ou no início da lista se este campo estiver presente mas vazio modified: A data e hora da última modificação de um tiddler modifier: Título do tiddler associado à última pessoa que modificou o tiddler name: O nome humanamente legível associado a um tiddler extensão @@ -30,5 +32,6 @@ subtitle: O texto do subtítulo de um assistente tags: Lista de etiquetas associadas a um tiddler text: O texto do corpo de um tiddler title: O nome único de um tiddler +toc-link: Suprime a ligação do tiddler numa árvore de Tabela de Conteúdos se definido como: ''no'' type: O tipo de conteúdo de um tiddler version: Informação de versão de uma extensão diff --git a/languages/pt-PT/Filters.multids b/languages/pt-PT/Filters.multids index 36e0d1cf1..bc83a0d04 100644 --- a/languages/pt-PT/Filters.multids +++ b/languages/pt-PT/Filters.multids @@ -8,7 +8,9 @@ Orphans: Tiddlers órfãos OverriddenShadowTiddlers: Tiddlers-sombra substituídos RecentSystemTiddlers: Tiddlers recentemente modificados, incluindo tiddlers de sistema RecentTiddlers: Tiddlers modificados recentemente +SessionTiddlers: Tiddlers modificados desde que a wiki foi carregada ShadowTiddlers: Tiddlers-sombra +StoryList: Tiddlers no rol, excluindo <$text text="$:/AdvancedSearch"/> SystemTags: Etiquetas de sistema SystemTiddlers: Tiddlers de sistema TypedTiddlers: Tiddlers sem texto wiki diff --git a/languages/pt-PT/GettingStarted.tid b/languages/pt-PT/GettingStarted.tid index 98f91f2ae..5bc3a6c37 100644 --- a/languages/pt-PT/GettingStarted.tid +++ b/languages/pt-PT/GettingStarted.tid @@ -14,4 +14,4 @@ Antes de começar a armazenar informação importante na ~TiddlyWiki é importan |<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag="textarea" tiddler="$:/DefaultTiddlers"/><br>//<<lingo DefaultTiddlers/BottomHint>>// | </div> -Veja o [[painel de controlo|$:/ControlPanel]] para mais opções. +Veja o [[painel de controlo|$:/ControlPanel]] para mais opções. \ No newline at end of file diff --git a/languages/pt-PT/Help/build.tid b/languages/pt-PT/Help/build.tid index 912e7e8cc..1c15e1fa8 100644 --- a/languages/pt-PT/Help/build.tid +++ b/languages/pt-PT/Help/build.tid @@ -1,5 +1,5 @@ title: $:/language/Help/build -description: Correr comandos configurados automaticamente +description: Correr automaticamente comandos configurados Construir os alvos de construção especificados para a wiki actual. Se nenhum alvo for especificado todos os alvos disponíveis serão construídos. @@ -7,5 +7,4 @@ Construir os alvos de construção especificados para a wiki actual. Se nenhum a --build <alvo> [<alvo> ...] ``` -Os alvos de construção são definidos no ficheiro `tiddlywiki.info` na pasta da wiki. - +Os alvos de construção são definidos no ficheiro `tiddlywiki.info` na pasta da wiki. \ No newline at end of file diff --git a/languages/pt-PT/Help/clearpassword.tid b/languages/pt-PT/Help/clearpassword.tid index 8d8fa3124..6ce2b8b41 100644 --- a/languages/pt-PT/Help/clearpassword.tid +++ b/languages/pt-PT/Help/clearpassword.tid @@ -5,4 +5,4 @@ Remover a palavra passe para as operações criptográficas subsequentes ``` --clearpassword -``` +``` \ No newline at end of file diff --git a/languages/pt-PT/Help/default.tid b/languages/pt-PT/Help/default.tid index 4e3c5ad48..988668726 100644 --- a/languages/pt-PT/Help/default.tid +++ b/languages/pt-PT/Help/default.tid @@ -20,4 +20,4 @@ Para obter ajuda detalhada sobre um comando: ``` tiddlywiki --help <command> -``` +``` \ No newline at end of file diff --git a/languages/pt-PT/Help/deletetiddlers.tid b/languages/pt-PT/Help/deletetiddlers.tid new file mode 100644 index 000000000..af887a937 --- /dev/null +++ b/languages/pt-PT/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: Apaga um grupo de tiddlers + +<<.from-version "5.1.20">> Apaga um grupo de tiddlers identificados por um filtro. + +``` +--deletetiddlers <filter> +``` diff --git a/languages/pt-PT/Help/editions.tid b/languages/pt-PT/Help/editions.tid index c19d885d0..751462d0f 100644 --- a/languages/pt-PT/Help/editions.tid +++ b/languages/pt-PT/Help/editions.tid @@ -5,4 +5,4 @@ Lista os nomes e descrições das edições disponíveis. Pode criar uma nova wi ``` --editions -``` +``` \ No newline at end of file diff --git a/languages/pt-PT/Help/fetch.tid b/languages/pt-PT/Help/fetch.tid new file mode 100644 index 000000000..6e7198c3b --- /dev/null +++ b/languages/pt-PT/Help/fetch.tid @@ -0,0 +1,38 @@ +title: $:/language/Help/fetch +description: Fetch tiddlers from wiki by URL + +Obter um ou mais ficheiros por HTTP/HTTPS, e importar os tiddlers correspondentes a um filtro, opcionalmente transformando os títulos de chegada. + +``` +--fetch file <url> <import-filter> <transform-filter> +--fetch files <url-filter> <import-filter> <transform-filter> +--fetch raw-file <url> <transform-filter> +--fetch raw-files <url-filter> <transform-filter> +``` + +As variantes "file" e "files" obtém os ficheiros especificados e tentam importar os tiddlers neles contidos (o mesmo processamento que receberiam se fossem arrastados para dentro da janela do browser). As variantes "raw-file" e "raw-files" obtém os ficheiros especificados e armazenam a informação bruta em tiddlers, sem aplicar a lógica de importação. + +Com as variantes "file" e "raw-file" apenas um único ficheiro é obtido e o primeiro parâmetro é o URL do ficheiro a ser lido. + +Com as variantes "files" e "raw-files", são obtidos múltiplos ficheiros e o primeiro parâmetro é um filtro que formula uma lista de URLs dos ficheiros a ler. Por exemplo dada uma lista de tiddlers etiquetados "servidor-remoto" que contém um campo "url" o filtro `[tag[servidor-remoto]get[url]]` irá buscar todos os URLs disponíveis. + +Para as variantes "file" e "files", o parâmetro `<import-filter>` especifica um filtro determinando que tiddlers são importados. Por defeito definido como `[all[tiddlers]]` se omisso. + +Para todas as variantes o parâmetro `<transform-filter>` especifica um filtro opcional que transforma os títulos dos tiddlers importados. Por exemplo `[addprefix[$:/minhasimportações/]]` adicionaria o prefixo `$:/minhasimportações/` a cada título. + +Precedendo o comando `--fetch` com `--verbose` irá mostrar o progresso durante a importação. + +Atenção que a TiddlyWiki não obterá uma versão anterior de uma extensão já carregada. + +O seguinte exemplo obtém todos os tiddlers que não são de sistema de https://tiddlywiki.com e grava-os para um ficheiro JSON: + +``` +tiddlywiki --verbose --fetch file "https://tiddlywiki.com/" "[!is[system]]" "" --rendertiddler "$:/core/templates/exporters/JsonFile" output.json text/plain "" exportFilter "[!is[system]]" +``` + +O seguinte exemplo obtém o ficheiro "favicon" de tiddlywiki.com e grava-o num ficheiro chamado "output.ico". Atenção que o tiddler intermédio "Icon Tiddler" está entre aspas no comando "--fetch" porque eestá a ser empregue como como filtro de transformação para substituir o título pré definido, enquanto que não há aspas para o comando "--savetiddler" porque está a ser usado directamente como título. + +``` +tiddlywiki --verbose --fetch raw-file "https://tiddlywiki.com/favicon.ico" "[[Icon Tiddler]]" --savetiddler "Icon Tiddler" output.ico +``` + diff --git a/languages/pt-PT/Help/help.tid b/languages/pt-PT/Help/help.tid index 9e4b97687..d309571bf 100644 --- a/languages/pt-PT/Help/help.tid +++ b/languages/pt-PT/Help/help.tid @@ -7,4 +7,4 @@ Mostra a ajuda para um comando: --help [<command>] ``` -Se o comando for omitido será exibida uma lista de comandos disponíveis. +Se o comando for omitido será exibida uma lista de comandos disponíveis. \ No newline at end of file diff --git a/languages/pt-PT/Help/import.tid b/languages/pt-PT/Help/import.tid new file mode 100644 index 000000000..c4fe30a1c --- /dev/null +++ b/languages/pt-PT/Help/import.tid @@ -0,0 +1,24 @@ +title: $:/language/Help/import +description: Importar tiddlers de um ficheiro + +Importar tiddlers de uma TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` ou outros ficheiros locais. O desserializador deve ser explicitamente especificado, ao contrário do comando `load` que infere o desserializador a partir da extensão do ficheiro. + +``` +--import <filepath> <deserializer> [<title>] [<encoding>] +``` + +Os desserializadores incluídos de origem: + +* application/javascript +* application/json +* application/x-tiddler +* application/x-tiddler-html-div +* application/x-tiddlers +* text/html +* text/plain + +O título dos tiddlers importados é por defeito o nome do ficheiro. + +A codificação é por defeito "utf8", mas pode ser "base64" para importar ficheiros binários. + +Atenção que a TiddlyWiki não importará uma versão anterior de uma extensão já carregada. \ No newline at end of file diff --git a/languages/pt-PT/Help/init.tid b/languages/pt-PT/Help/init.tid index 1c0a05a84..b673377a4 100644 --- a/languages/pt-PT/Help/init.tid +++ b/languages/pt-PT/Help/init.tid @@ -20,4 +20,4 @@ Nota: * O comando init irá falhar se a pasta especificada não estiver vazia * O comando init remove quaisquer definições de `includeWikis` no ficheiro `tiddlywiki.info` da edição * Quando múltiplas edições são especificadas, as edições inicializadas posteriormente substituem quaisquer ficheiros partilhados com edições anteriores (de modo que o ficheiro `tiddlywiki.info` final será copiado da última edição) -* `--editions` mostra uma lista de edições disponíveis +* `--editions` mostra uma lista de edições disponíveis \ No newline at end of file diff --git a/languages/pt-PT/Help/listen.tid b/languages/pt-PT/Help/listen.tid new file mode 100644 index 000000000..9ae52abda --- /dev/null +++ b/languages/pt-PT/Help/listen.tid @@ -0,0 +1,34 @@ +title: $:/language/Help/listen +description: Fornece à TiddlyWiki um interface por servidor HTTP + +Serve uma wiki por HTTP. + +Os comandos de escuta utilizam NamedCommandParameters: + +``` +--listen [<name>=<value>]... +``` + +Todos os parâmetros são opcionais com predefinições seguras, e podem ser especificados por qualquer ordem. Parâmetros reconhecidos são: + +* ''host'' - nome do hospede opcional a partir do qual servir (por defeito "127.0.0.1" aka "localhost") +* ''path-prefix'' - prefixo opcional para caminhos +* ''port'' - número de porta onde escutar; valores não numéricos são interpretados como variáveis ambientais de sistema da qual o número da porta é extraído(por defeito "8080") +* ''credentials'' - caminho para o ficheiro CSV das credenciais (relativo à pasta da wiki) +* ''anon-username'' - o nome de utilizador para assinar edições para utilizadores anónimos +* ''username'' - nome de utilizador optional para autenticação básica +* ''password'' - palavra passe optional para autenticação básica +* ''authenticated-user-header'' - nome do cabeçalho optional a ser utilizador para autenticação de confiança +* ''readers'' - lista separada por vírgulas dos utilizadores com permissão para ler desta wiki +* ''writers'' - lista separada por vírgulas dos utilizadores com permissão para escrever nesta wiki +* ''csrf-disable'' - defina como "yes" para desactivar verificação CSRF (por defeito "no") +* ''root-tiddler'' - o tiddler para servir como raiz (por defeito "$:/core/save/all") +* ''root-render-type'' - o tipo de conteúdo para o qual o tiddler de raiz deve ser representado (por defeito "text/plain") +* ''root-serve-type'' - o tipo de conteúdo com o qual o tiddler de raiz deve ser servido (por defeito "text/html") +* ''tls-cert'' - caminho do ficheiro de certificado TLS (relativo à pasta da wiki) +* ''tls-key'' - caminho do ficheiro da chave TLS (relativo à pasta da wiki) +* ''debug-level'' - nível de depuração opcional; defina como "debug" para ver detalhes de pedidos (por defeito "none") +* ''gzip'' - defina como "yes" para activar compressão gzip para alguns endpoints http (por defeito "no") + +Para obter informação sobre como abrir a sua instância à rede local inteira, e possíveis problemas com segurança, veja o tiddler WebServer em TiddlyWiki.com. + diff --git a/languages/pt-PT/Help/load.tid b/languages/pt-PT/Help/load.tid index 49a5bd593..b816c55df 100644 --- a/languages/pt-PT/Help/load.tid +++ b/languages/pt-PT/Help/load.tid @@ -13,4 +13,4 @@ Para carregar tiddlers de um ficheiro TiddlyWiki encriptado deve primeiro especi tiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html ``` -A TiddlyWiki não carregará uma versão anterior de um plugin já carregado. +A TiddlyWiki não carregará uma versão anterior de uma extensão já carregada. diff --git a/languages/pt-PT/Help/makelibrary.tid b/languages/pt-PT/Help/makelibrary.tid index a0fbe297b..188faa6b7 100644 --- a/languages/pt-PT/Help/makelibrary.tid +++ b/languages/pt-PT/Help/makelibrary.tid @@ -11,4 +11,4 @@ Este comando é para uso interno; apenas relevante para utilizadores que criem u --makelibrary <title> ``` -Por omissão o argumento será `$:/UpgradeLibrary`. +Por omissão o argumento será `$:/UpgradeLibrary`. \ No newline at end of file diff --git a/languages/pt-PT/Help/output.tid b/languages/pt-PT/Help/output.tid index 6870d030e..b043c1bad 100644 --- a/languages/pt-PT/Help/output.tid +++ b/languages/pt-PT/Help/output.tid @@ -7,5 +7,4 @@ Define a directoria base de destino para os comandos subsequentes. A pasta de de --output <caminho> ``` -Se o caminho especificado é relativo este será resolvido em relação à actual pasta de trabalho. Por exemplo `--output .` define a directoria de destino para a actual pasta de trabalho. - +Se o caminho especificado é relativo este será resolvido em relação à actual pasta de trabalho. Por exemplo `--output .` define a directoria de destino para a actual pasta de trabalho. \ No newline at end of file diff --git a/languages/pt-PT/Help/password.tid b/languages/pt-PT/Help/password.tid index 9ae7c32c2..39f64072e 100644 --- a/languages/pt-PT/Help/password.tid +++ b/languages/pt-PT/Help/password.tid @@ -5,5 +5,4 @@ Define a palavra passe para as operações criptográficas subsequentes ``` --password <password> -``` - +``` \ No newline at end of file diff --git a/languages/pt-PT/Help/render.tid b/languages/pt-PT/Help/render.tid new file mode 100644 index 000000000..9b0acb85b --- /dev/null +++ b/languages/pt-PT/Help/render.tid @@ -0,0 +1,34 @@ +title: $:/language/Help/render +description: Representa tiddlers individuais em ficheiros + +Apresenta tiddlers individuais identificados por um filtro e guarda os resultados para os ficheiros especificados + +Opcionalmente o título de um tiddler pode ser especificado. Neste caso, em vez de representar indirectamente cada tiddler, o o tiddler modelo é apresentado com a variável "currentTiddler" definida como o título do tiddler a ser apresentado. + +Pode ser opcionalmente definido um nome e um valor para uma variável adicional. + +``` +--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>] +``` + +* ''tiddler-filter'': Um filtro a identificar os tiddler(s) a serem apresentados +* ''filename-filter'': Filtro opcional que transforma títulos em caminhos de ficheiros. Se omisso, por defeito `[is[tiddler]addsuffix[.html]]`, que utiliza o título do tiddler inalterado como nome de ficheiro +* ''render-type'': Tipo de representação opcional: `text/html` (pré definição) representa o texto HTML completo e `text/plain` apenas retorna o conteúdo de texto (ie ignora etiquetas HTML e outro conteúdo não legível) +* ''template'': Modelo opcional a partir do qual cada tiddler é representado +* ''name'': Nome opcional de uma variável +* ''value'': Valor opcional de uma variável + +Por pré definição o nome de ficheiro é resolvido relativamente à sub-pasta `output` da pasta de edição. O comando `--output` pode ser utilizado para redireccionar a saída para uma pasta diferente. + +Notas: + +* Não são eliminados quaisquer ficheiros existentes da pasta de saída. +* Todas as sub-pastas em falta na pasta de saída são automaticamente criadas. +* Quando referente a um tiddler com espaços no título, tenha o cuidado de utilizar tanto as aspas requeridas pela sua shell como também os duplos parêntesis rectos da TiddlyWiki: `--render "[[Motovun Jack.jpg]]"` +* O filtro do nome de ficheiro é avaliado com os itens seleccionados definidos como título do tiddler a ser actualmente representado, permitindo utilizar o título como base para computar o nome do ficheiro. Por exemplo `[encodeuricomponent[]addprefix[static/]]` aplica codificação de URI a cada título, adicionando posteriormente o prefixo `static/` +* O comando `--render` é um substituto mais flexível de ambos os comandos `--rendertiddler` e `--rendertiddlers`, que serão reformados. + +Exemplos: + +* `--render "[!is[system]]" "[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]"` -- representa todos os tiddlers que não são de sistema, numa sub-pasta "tiddlers" com títulos codificados como URL e a extensão HTML + diff --git a/languages/pt-PT/Help/rendertiddlers.tid b/languages/pt-PT/Help/rendertiddlers.tid index efd6941b3..04c2e5f5d 100644 --- a/languages/pt-PT/Help/rendertiddlers.tid +++ b/languages/pt-PT/Help/rendertiddlers.tid @@ -15,4 +15,4 @@ Por exemplo: Por defeito, o caminho é resolvido relativamente à sub-pasta `output` da directoria de edição. O comando `--output` pode ser utilizado para redireccionar para uma directoria de destino diferente. -Quaisquer ficheiros na directoria de destino serão apagados. Quaisquer pastas em falta nos caminhos de destino serão automaticamente criadas se em falta. +Quaisquer ficheiros na directoria de destino serão apagados. Quaisquer pastas em falta nos caminhos de destino serão automaticamente criadas se em falta. \ No newline at end of file diff --git a/languages/pt-PT/Help/save.tid b/languages/pt-PT/Help/save.tid new file mode 100644 index 000000000..4408880f6 --- /dev/null +++ b/languages/pt-PT/Help/save.tid @@ -0,0 +1,25 @@ +title: $:/language/Help/save +description: Guarda tiddlers individuais em bruto em ficheiros + +Guarda tiddlers individuais identificados por um filtro no seu formato bruto de texto ou binário em ficheiros especificados. + +``` +--save <tiddler-filter> <filename-filter> +``` + +* ''tiddler-filter'': Um filtro a identificar os tiddler(s) a serem gravados +* ''filename-filter'': Filtro opcional que transforma títulos em caminhos de ficheiros. Se omisso, por defeito `[is[tiddler]]`, que utiliza o título do tiddler inalterado como nome de ficheiro. + +Por pré definição o nome de ficheiro é resolvido relativamente à sub-pasta `output` da pasta de edição. O comando `--output` pode ser utilizado para redireccionar a saída para uma pasta diferente. + +Notas: + +* Não são eliminados quaisquer ficheiros existentes da pasta de saída. +* Todas as sub-pastas em falta na pasta de saída são automaticamente criadas. +* Quando referente a um tiddler com espaços no título, tenha o cuidado de utilizar tanto as aspas requeridas pela sua shell como também os duplos parêntesis rectos da TiddlyWiki: `--render "[[Motovun Jack.jpg]]"` +* O filtro do nome de ficheiro é avaliado com os itens seleccionados definidos como título do tiddler a ser actualmente gravado, permitindo utilizar o título como base para computar o nome do ficheiro. Por exemplo `[encodeuricomponent[]addprefix[static/]]` aplica codificação de URI a cada título, adicionando posteriormente o prefixo `static/` +* O comando `--save` é um substituto mais flexível de ambos os comandos `--savetiddler` e `--savetiddlers` commands, que serão reformados. + +Exemplos: + +* `--save "[!is[system]is[image]]" "[encodeuricomponent[]addprefix[tiddlers/]]"` -- guarda todos os tiddlers imagem que não são de sistema como ficheiros numa sub-pasta "tiddlers" com títulos codificados como URL diff --git a/languages/pt-PT/Help/savetiddler.tid b/languages/pt-PT/Help/savetiddler.tid index 60a999db6..aece3eb69 100644 --- a/languages/pt-PT/Help/savetiddler.tid +++ b/languages/pt-PT/Help/savetiddler.tid @@ -9,4 +9,4 @@ Guarda um tiddler individual no seu formato bruto texto ou binário para o camin Por defeito, o caminho é resolvido relativamente à sub-pasta `output` da directoria de edição. O comando `--output` pode ser utilizado para redireccionar para uma directoria de destino diferente. -Quaisquer pastas em falta no caminho de destino serão automaticamente criadas. +Quaisquer pastas em falta no caminho de destino serão automaticamente criadas. \ No newline at end of file diff --git a/languages/pt-PT/Help/savetiddlers.tid b/languages/pt-PT/Help/savetiddlers.tid index aade6edf6..efef21018 100644 --- a/languages/pt-PT/Help/savetiddlers.tid +++ b/languages/pt-PT/Help/savetiddlers.tid @@ -9,4 +9,4 @@ Guarda um conjunto de tiddlers no seu formato bruto texto ou binário para o cam Por defeito, o caminho é resolvido relativamente à sub-pasta `output` da directoria de edição. O comando `--output` pode ser utilizado para redireccionar para uma directoria de destino diferente. -Quaisquer pastas em falta no caminho de destino serão automaticamente criadas. +Quaisquer pastas em falta no caminho de destino serão automaticamente criadas. \ No newline at end of file diff --git a/languages/pt-PT/Help/savewikifolder.tid b/languages/pt-PT/Help/savewikifolder.tid new file mode 100644 index 000000000..33696d4e5 --- /dev/null +++ b/languages/pt-PT/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: Saves a wiki to a new wiki folder + +<<.from-version "5.1.20">> Guarda a wiki actual como uma pasta wiki, incluindo tiddlers, extensões e configurações: + +``` +--savewikifolder <wikifolderpath> [<filter>] +``` + +* A pasta wiki alvo deve estar vazia ou ser não existente +* O filtro especifica que tiddlers devem ser incluídos. Opcional, se omisso reverte para `[all[tiddlers]]` +* Extensões da biblioteca oficial são substituídas por referências às mesmas no ficheiro `tiddlywiki.info` +* Extensões customizadas são descompactadas na sua própria pasta + +Usado frequentemente para converter um ficheiro TiddlyWiki HTML numa pasta wiki: + +``` +tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder +``` \ No newline at end of file diff --git a/languages/pt-PT/Help/server.tid b/languages/pt-PT/Help/server.tid index 187c7cb8b..dae6fc53f 100644 --- a/languages/pt-PT/Help/server.tid +++ b/languages/pt-PT/Help/server.tid @@ -34,4 +34,4 @@ O nome de utilizador e a palavra passe podem ser vazios se necessitar de definir --server 8080 $:/core/save/all text/plain text/html "" "" 192.168.0.245 ``` -Para correr servidores TiddlyWiki múltiplos ao mesmo tempo é necessário colocar cada um numa porta diferente. +Para correr servidores TiddlyWiki múltiplos ao mesmo tempo é necessário colocar cada um numa porta diferente. \ No newline at end of file diff --git a/languages/pt-PT/Help/setfield.tid b/languages/pt-PT/Help/setfield.tid index 20e73b52f..f641c5408 100644 --- a/languages/pt-PT/Help/setfield.tid +++ b/languages/pt-PT/Help/setfield.tid @@ -14,4 +14,4 @@ Os parâmetros são: * ''filter'' - filtro que selecciona os tiddlers a ser afectados * ''fieldname'' - nome do campo a modificar (por defeito "texto") * ''templatetitle'' - o tiddler a interpretar para o campo especificado. Se for deixado em branco ou estiver em falta o campo especificado será eliminado -* ''rendertype'' - O tipo de texto a interpretar (por defeito "text/plain"; "text/html" pode ser utilizado para incluir etiquetas HTML) +* ''rendertype'' - O tipo de texto a interpretar (por defeito "text/plain"; "text/html" pode ser utilizado para incluir etiquetas HTML) \ No newline at end of file diff --git a/languages/pt-PT/Help/unpackplugin.tid b/languages/pt-PT/Help/unpackplugin.tid index b9d3b2c5c..f57f41295 100644 --- a/languages/pt-PT/Help/unpackplugin.tid +++ b/languages/pt-PT/Help/unpackplugin.tid @@ -1,8 +1,8 @@ title: $:/language/Help/unpackplugin description: Extrair tiddlers de conteúdo de uma extensão -Extrai o conteúdo de uma extensão, recriando-o como tiddlers vulgares: +Extrai o conteúdo de uma extensão, recriando-a como tiddlers vulgares: ``` --unpackplugin <título> -``` +``` \ No newline at end of file diff --git a/languages/pt-PT/Help/verbose.tid b/languages/pt-PT/Help/verbose.tid index 16dbbe13b..4926b9ecb 100644 --- a/languages/pt-PT/Help/verbose.tid +++ b/languages/pt-PT/Help/verbose.tid @@ -1,7 +1,7 @@ title: $:/language/Help/verbose description: Activa o modo de exibição relatório verboso -Activa a exibição relatório verboso, útil para correcção de erros +Activa a exibição do relatório verboso, útil para correcção de erros ``` --verbose diff --git a/languages/pt-PT/Help/version.tid b/languages/pt-PT/Help/version.tid index 3fff49b95..a658f727e 100644 --- a/languages/pt-PT/Help/version.tid +++ b/languages/pt-PT/Help/version.tid @@ -5,4 +5,4 @@ Mostra o numero da versão da TiddlyWiki. ``` --version -``` +``` \ No newline at end of file diff --git a/languages/pt-PT/Import.multids b/languages/pt-PT/Import.multids index 9de568800..d059482af 100644 --- a/languages/pt-PT/Import.multids +++ b/languages/pt-PT/Import.multids @@ -4,6 +4,12 @@ Imported/Hint: Os seguintes tiddlers foram importados: Listing/Cancel/Caption: Cancelar Listing/Hint: Estes tiddlers estão prontos a importar: Listing/Import/Caption: Importar +Listing/Preview: Pré Visualização: +Listing/Preview/Diff: Diff +Listing/Preview/DiffFields: Diff (Campos) +Listing/Preview/Fields: Campos +Listing/Preview/Text: Texto +Listing/Preview/TextRaw: Texto (Simples) Listing/Select/Caption: Seleccionar Listing/Status/Caption: Estado Listing/Title/Caption: Título @@ -11,5 +17,7 @@ Upgrader/Plugins/Suppressed/Incompatible: Extensões bloqueadas, incompatíveis Upgrader/Plugins/Suppressed/Version: Extensão bloqueada (devido a <<incoming>> ser anterior à <<existing>> existente) Upgrader/Plugins/Upgraded: Extensão actualizada de <<incoming>> para <<upgraded>> Upgrader/State/Suppressed: Tiddler de estado temporário bloqueado +Upgrader/System/Alert: Está prestes a importar um tiddler que irá subscrever um tiddler do módulo de núcleo. Esta acção não é recomendada por poder tornar o sistema instável Upgrader/System/Suppressed: Tiddler de sistema bloqueado +Upgrader/System/Warning: Tiddler do módulo de núcleo Upgrader/ThemeTweaks/Created: Tema migrado ajustado de <$text text=<<from>>/> diff --git a/languages/pt-PT/Misc.multids b/languages/pt-PT/Misc.multids index d0730b5a1..fc6d9ec08 100644 --- a/languages/pt-PT/Misc.multids +++ b/languages/pt-PT/Misc.multids @@ -12,6 +12,7 @@ ConfirmEditShadowTiddler: Está prestes a editar um Tiddler-Sombra. Quaisquer al ConfirmOverwriteTiddler: Pretende substituir o tiddler "<$text text=<<title>>/>"? Count: contagem DefaultNewTiddlerTitle: Novo Tiddler +Diffs/CountMessage: <<diff-count>> diferenças DropMessage: Largue aqui (ou carregue no Escape para cancelar) Encryption/Cancel: Cancelar Encryption/ConfirmClearPassword: Pretende remover a palavra-passe? Esta acção removerá a encriptação aplicada quando guardar esta wiki @@ -22,6 +23,7 @@ Encryption/RepeatPassword: Repetir palavra passe Encryption/SetPassword: Definir palavra passe Encryption/Username: Nome de utilizador Error/Caption: Erro +Error/EditConflict: File changed on server Error/Filter: Erro de filtro Error/FilterSyntax: Erro de sintaxe na expressão do filtro Error/IsFilterOperator: Erro de Filtro: Operando desconhecido para o operador de filtro 'is' @@ -36,17 +38,20 @@ InternalJavaScriptError/Title: Erro interno JavaScript InvalidFieldName: Caracteres ilegais no nome do ficheiro "<$text text=<<fieldName>>/>". Os campos apenas podem conter letras minúsculas, dígitos e os caracteres subtraço (`_`), hífen (`-`) e ponto final (`.`) LazyLoadingWarning: <p>A carregar texto externo de ''<$text text={{!!_canonical_uri}}/>''</p><p>Se esta mensagem não desaparecer pode estar a utilizar um navegador que não suporta texto remoto nesta configuração. Veja https://tiddlywiki.com/#ExternalText</p> LoginToTiddlySpace: Entrar em TiddlySpace +Manager/Controls/FilterByTag/None: (none) Manager/Controls/FilterByTag/Prompt: Filtrar por etiqueta: Manager/Controls/Order/Prompt: Ordem inversa -Manager/Controls/Search/Placeholder: Procurar +Manager/Controls/Search/Placeholder: Procurar Manager/Controls/Search/Prompt: Procurar: Manager/Controls/Show/Option/Tags: etiquetas +Manager/Controls/Show/Option/Tiddlers: tiddlers Manager/Controls/Show/Prompt: Mostrar: Manager/Controls/Sort/Prompt: Ordenar por: Manager/Item/Colour: Cor Manager/Item/Fields: Campos Manager/Item/Icon: Ícone -Manager/Item/RawText: Código-fonte +Manager/Item/Icon/None: (none) +Manager/Item/RawText: Texto simples Manager/Item/Tags: Etiquetas Manager/Item/Tools: Ferramentas Manager/Item/WikifiedText: Texto formatado @@ -65,4 +70,4 @@ TagManager/Info/Heading: Informação TagManager/Tag/Heading: Etiqueta Tiddler/DateFormat: DD de MMM de YYYY às hh12:0mmam UnsavedChangesWarning: Têm alterações não guardadas na TiddlyWiki -Yes: Sim +Yes: Sim« diff --git a/languages/pt-PT/NewJournal.multids b/languages/pt-PT/NewJournal.multids index a5badbb3b..29b247fc3 100644 --- a/languages/pt-PT/NewJournal.multids +++ b/languages/pt-PT/NewJournal.multids @@ -1,4 +1,5 @@ title: $:/config/NewJournal/ Tags: Diário +Text: Title: DD de MMM de YYYY diff --git a/languages/pt-PT/Notifications.multids b/languages/pt-PT/Notifications.multids index 796649b73..a8e8005fb 100644 --- a/languages/pt-PT/Notifications.multids +++ b/languages/pt-PT/Notifications.multids @@ -1,4 +1,6 @@ title: $:/language/Notifications/ +CopiedToClipboard/Failed: Copia para a área de trabalho Falhou! +CopiedToClipboard/Succeeded: Copiado para a Área de Trabalho! Save/Done: Wiki gravada Save/Starting: A iniciar processo de gravação da wiki diff --git a/languages/pt-PT/Search.multids b/languages/pt-PT/Search.multids index dbca8934e..f466f50f7 100644 --- a/languages/pt-PT/Search.multids +++ b/languages/pt-PT/Search.multids @@ -3,18 +3,18 @@ title: $:/language/Search/ DefaultResults/Caption: Lista Filter/Caption: Filtro Filter/Hint: Procurar através de [[expressão de filtros|https://tiddlywiki.com/static/Filters.html]] -Filter/Matches: //<small><<resultCount>> resultados</small>// -Matches: //<small><<resultCount>> resultados</small>// +Filter/Matches: //<small><<resultCount>> correspondências</small>// +Matches: //<small><<resultCount>> correspondências</small>// Matches/All: Todas as correspondências: Matches/Title: Correspondências em títulos: -Search: Pesquisar -Search/TooShort: Texto da procura demasiado pequeno +Search: Procurar +Search/TooShort: Texto da procura demasiado curto Shadows/Caption: Sombras Shadows/Hint: Procurar tiddlers-sombra -Shadows/Matches: //<small><<resultCount>> resultados</small>// +Shadows/Matches: //<small><<resultCount>> correspondências</small>// Standard/Caption: Padrão Standard/Hint: Procurar tiddlers normais -Standard/Matches: //<small><<resultCount>> resultados</small>// +Standard/Matches: //<small><<resultCount>> correspondências</small>// System/Caption: Sistema System/Hint: Procurar tiddlers de sistema -System/Matches: //<small><<resultCount>> resultados</small>// +System/Matches: //<small><<resultCount>> correspondências</small>// diff --git a/languages/pt-PT/SideBar.multids b/languages/pt-PT/SideBar.multids index f00fcf648..174d8aa68 100644 --- a/languages/pt-PT/SideBar.multids +++ b/languages/pt-PT/SideBar.multids @@ -3,6 +3,7 @@ title: $:/language/SideBar/ All/Caption: Todos Contents/Caption: Conteúdos Drafts/Caption: Rascunhos +Explorer/Caption: Explorer Missing/Caption: Em Falta More/Caption: Mais Open/Caption: Abertos diff --git a/languages/pt-PT/SiteSubtitle.tid b/languages/pt-PT/SiteSubtitle.tid index 3134de483..d3741ba5b 100644 --- a/languages/pt-PT/SiteSubtitle.tid +++ b/languages/pt-PT/SiteSubtitle.tid @@ -1,3 +1,3 @@ title: $:/SiteSubtitle -Tradução de Português Europeu para ~TiddlyWiki 5 \ No newline at end of file +Tradução de Português Europeu para ~TiddlyWiki 5« \ No newline at end of file diff --git a/languages/pt-PT/SiteTitle.tid b/languages/pt-PT/SiteTitle.tid index 1412dfe0e..a2484841a 100644 --- a/languages/pt-PT/SiteTitle.tid +++ b/languages/pt-PT/SiteTitle.tid @@ -1,3 +1,3 @@ title: $:/SiteTitle -Tradução para Português da ~TiddlyWiki \ No newline at end of file +Tradução para Português da ~TiddlyWiki« \ No newline at end of file diff --git a/languages/pt-PT/ThemeTweaks.multids b/languages/pt-PT/ThemeTweaks.multids index 761bf6f3f..24b2d734f 100644 --- a/languages/pt-PT/ThemeTweaks.multids +++ b/languages/pt-PT/ThemeTweaks.multids @@ -25,7 +25,7 @@ Options/SidebarLayout: Esquema da barra lateral Options/SidebarLayout/Fixed-Fluid: Rol fixo, barra fluida Options/SidebarLayout/Fluid-Fixed: Rol fluido, barra lateral fixa Options/StickyTitles: Títulos persistentes -Options/StickyTitles/Hint: Torna as barras de título dos tiddlers sempre visíveis como se ficassem coladas no topo da janela do navegador. Atenção, não funciona de todo com o Chrome, e pode causar problemas de apresentação no Firefox +Options/StickyTitles/Hint: Torna as barras de título dos tiddlers sempre visíveis como se ficassem coladas no topo da janela do navegador. Settings: Definições Settings/BackgroundImage: Imagem de fundo da página Settings/BackgroundImageAttachment: Anexo de imagem de fundo da página @@ -36,6 +36,7 @@ Settings/BackgroundImageSize/Auto: Automática Settings/BackgroundImageSize/Contain: Conter Settings/BackgroundImageSize/Cover: Cobrir Settings/CodeFontFamily: Família da fonte de código +Settings/EditorFontFamily: Família da fonte do editor Settings/FontFamily: Família da fonte ThemeTweaks: Afinações dos Temas ThemeTweaks/Hint: Pode ajustar alguns parâmetros do tema ''Vanilla''. From 136dbf1a60fca5e7d77e0644cbbf773bca6ce99a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 3 Jan 2020 10:39:37 +0000 Subject: [PATCH 0432/2376] Fix bug with importvariables and empty set widgets A self-closing set widget doesn't have a "children" property. --- core/modules/widgets/importvariables.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/importvariables.js b/core/modules/widgets/importvariables.js index cdb351f8d..86559ef25 100644 --- a/core/modules/widgets/importvariables.js +++ b/core/modules/widgets/importvariables.js @@ -66,7 +66,7 @@ ImportVariablesWidget.prototype.execute = function(tiddlerList) { params: parseTreeNode.params, isMacroDefinition: parseTreeNode.isMacroDefinition }); - parseTreeNode = parseTreeNode.children[0]; + parseTreeNode = parseTreeNode.children && parseTreeNode.children[0]; } } }); From 5a5c967a3943beb6a4fa513cb34d231e46304452 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 3 Jan 2020 10:40:11 +0000 Subject: [PATCH 0433/2376] Add support for $:/tags/Macro/View macros that are only visible within view templates --- core/ui/EditTemplate/Preview/output.tid | 1 + core/ui/ViewTemplate.tid | 1 + editions/tw5.com/tiddlers/concepts/Macros.tid | 4 ++-- .../systemtags/SystemTag_ $__tags_Macro_View.tid | 9 +++++++++ 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid diff --git a/core/ui/EditTemplate/Preview/output.tid b/core/ui/EditTemplate/Preview/output.tid index fa330b8c0..985fae64d 100644 --- a/core/ui/EditTemplate/Preview/output.tid +++ b/core/ui/EditTemplate/Preview/output.tid @@ -2,6 +2,7 @@ title: $:/core/ui/EditTemplate/body/preview/output tags: $:/tags/EditPreview caption: {{$:/language/EditTemplate/Body/Preview/Type/Output}} +\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]] <$set name="tv-tiddler-preview" value="yes"> <$transclude /> diff --git a/core/ui/ViewTemplate.tid b/core/ui/ViewTemplate.tid index 54765fbde..077fb79b8 100644 --- a/core/ui/ViewTemplate.tid +++ b/core/ui/ViewTemplate.tid @@ -3,6 +3,7 @@ title: $:/core/ui/ViewTemplate \define folded-state() $:/state/folded/$(currentTiddler)$ \end +\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]] <$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[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"><$transclude tiddler=<<listItem>>/></$list> </div> </$vars> diff --git a/editions/tw5.com/tiddlers/concepts/Macros.tid b/editions/tw5.com/tiddlers/concepts/Macros.tid index c7e824b76..239045d56 100644 --- a/editions/tw5.com/tiddlers/concepts/Macros.tid +++ b/editions/tw5.com/tiddlers/concepts/Macros.tid @@ -1,5 +1,5 @@ created: 20140211171341271 -modified: 20150228114909000 +modified: 20200103092706002 tags: Concepts Reference title: Macros type: text/vnd.tiddlywiki @@ -20,7 +20,7 @@ Within a snippet itself, the only markup detected is `$name$` (a placeholder for The <<.mlink dumpvariables>> macro lists all variables (including macros) that are available at that position in the widget tree. -An <<.wlink ImportVariablesWidget>> widget can be used to copy macro definitions to another branch of the [[widget tree|Widgets]]. ~TiddlyWiki uses this technique internally to implement global macros -- namely any macros defined in tiddlers with the <<.tag $:/tags/Macro>> tag. +An <<.wlink ImportVariablesWidget>> widget can be used to copy macro definitions to another branch of the [[widget tree|Widgets]]. ~TiddlyWiki uses this technique internally to implement global macros -- namely any macros defined in tiddlers with the <<.tag $:/tags/Macro>> tag. (The tag <<.tag $:/tags/Macro/View>> is used to define macros that should only be available within the main view template and the preview panel). For maximum flexibility, macros can also be <<.js-macro-link "written as JavaScript modules">>. diff --git a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid new file mode 100644 index 000000000..81a6f9cae --- /dev/null +++ b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid @@ -0,0 +1,9 @@ +caption: $:/tags/Macro +created: 20200103092530990 +description: marks global macros +modified: 20200103092606462 +tags: SystemTags +title: SystemTag: $:/tags/Macro/View +type: text/vnd.tiddlywiki + +The [[system tag|SystemTags]] `$:/tags/Macro/View` marks macros that are only made available within the main view templates and the preview panel. \ No newline at end of file From 447cd56da9db2ee169607f32923081ac47e78354 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 3 Jan 2020 10:40:35 +0000 Subject: [PATCH 0434/2376] Initial commit of freelinks plugin --- .../freelinks/config-Freelinks-Enable.tid | 2 + plugins/tiddlywiki/freelinks/macros-view.tid | 4 + plugins/tiddlywiki/freelinks/plain-text.js | 62 ++++++++ plugins/tiddlywiki/freelinks/plugin.info | 6 + plugins/tiddlywiki/freelinks/readme.tid | 12 ++ plugins/tiddlywiki/freelinks/settings.tid | 3 + plugins/tiddlywiki/freelinks/text.js | 148 ++++++++++++++++++ 7 files changed, 237 insertions(+) create mode 100644 plugins/tiddlywiki/freelinks/config-Freelinks-Enable.tid create mode 100644 plugins/tiddlywiki/freelinks/macros-view.tid create mode 100644 plugins/tiddlywiki/freelinks/plain-text.js create mode 100644 plugins/tiddlywiki/freelinks/plugin.info create mode 100644 plugins/tiddlywiki/freelinks/readme.tid create mode 100644 plugins/tiddlywiki/freelinks/settings.tid create mode 100755 plugins/tiddlywiki/freelinks/text.js diff --git a/plugins/tiddlywiki/freelinks/config-Freelinks-Enable.tid b/plugins/tiddlywiki/freelinks/config-Freelinks-Enable.tid new file mode 100644 index 000000000..dfbd771dc --- /dev/null +++ b/plugins/tiddlywiki/freelinks/config-Freelinks-Enable.tid @@ -0,0 +1,2 @@ +title: $:/config/Freelinks/Enable +text: yes diff --git a/plugins/tiddlywiki/freelinks/macros-view.tid b/plugins/tiddlywiki/freelinks/macros-view.tid new file mode 100644 index 000000000..20d85b088 --- /dev/null +++ b/plugins/tiddlywiki/freelinks/macros-view.tid @@ -0,0 +1,4 @@ +title: $:/plugins/tiddlywiki/freelinks/macros/view +tags: $:/tags/Macro/View + +<$set name="tv-freelinks" value={{$:/config/Freelinks/Enable}}/> diff --git a/plugins/tiddlywiki/freelinks/plain-text.js b/plugins/tiddlywiki/freelinks/plain-text.js new file mode 100644 index 000000000..2e7e0d707 --- /dev/null +++ b/plugins/tiddlywiki/freelinks/plain-text.js @@ -0,0 +1,62 @@ +/*\ +title: $:/core/modules/widgets/plain-text.js +type: application/javascript +module-type: widget + +A copy of the core text widget under a different name + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var PlainTextNodeWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +PlainTextNodeWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +PlainTextNodeWidget.prototype.render = function(parent,nextSibling) { + this.parentDomNode = parent; + this.computeAttributes(); + this.execute(); + var text = this.getAttribute("text",this.parseTreeNode.text || ""); + text = text.replace(/\r/mg,""); + var textNode = this.document.createTextNode(text); + parent.insertBefore(textNode,nextSibling); + this.domNodes.push(textNode); +}; + +/* +Compute the internal state of the widget +*/ +PlainTextNodeWidget.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 +*/ +PlainTextNodeWidget.prototype.refresh = function(changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if(changedAttributes.text) { + this.refreshSelf(); + return true; + } else { + return false; + } +}; + +exports["plain-text"] = PlainTextNodeWidget; + +})(); diff --git a/plugins/tiddlywiki/freelinks/plugin.info b/plugins/tiddlywiki/freelinks/plugin.info new file mode 100644 index 000000000..300edf75e --- /dev/null +++ b/plugins/tiddlywiki/freelinks/plugin.info @@ -0,0 +1,6 @@ +{ + "title": "$:/plugins/tiddlywiki/freelinks", + "name": "Freelinks", + "description": "Freelinking of tiddler titles", + "list": "readme settings" +} diff --git a/plugins/tiddlywiki/freelinks/readme.tid b/plugins/tiddlywiki/freelinks/readme.tid new file mode 100644 index 000000000..6ea98963b --- /dev/null +++ b/plugins/tiddlywiki/freelinks/readme.tid @@ -0,0 +1,12 @@ +title: $:/plugins/tiddlywiki/freelinks/readme + +This plugin adds automatic generation of links to tiddler titles. + +''Note that automatic link generation can be very slow when there are a large number of tiddlers''. + +Freelinking is activated for runs of text that have the following variables set: + +* `tv-wikilinks` is NOT equal to `no` +* `tv-freelinks` is set to `yes` + +Within view templates, the variable `tv-freelinks` is automatically set to the content of $:/config/Freelinks/Enable, which can be set via the settings panel of this plugin. diff --git a/plugins/tiddlywiki/freelinks/settings.tid b/plugins/tiddlywiki/freelinks/settings.tid new file mode 100644 index 000000000..0b6cb247c --- /dev/null +++ b/plugins/tiddlywiki/freelinks/settings.tid @@ -0,0 +1,3 @@ +title: $:/plugins/tiddlywiki/freelinks/settings + +<$checkbox tiddler="$:/config/Freelinks/Enable" field="text" checked="yes" unchecked="no" default="no"> <$link to="$:/config/Freelinks/Enable">Enable freelinking within tiddler view templates</$link> </$checkbox> diff --git a/plugins/tiddlywiki/freelinks/text.js b/plugins/tiddlywiki/freelinks/text.js new file mode 100755 index 000000000..8803c8cd2 --- /dev/null +++ b/plugins/tiddlywiki/freelinks/text.js @@ -0,0 +1,148 @@ +/*\ +title: $:/core/modules/widgets/text.js +type: application/javascript +module-type: widget + +An override of the core text widget that automatically linkifies the text + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var TextNodeWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +TextNodeWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +TextNodeWidget.prototype.render = function(parent,nextSibling) { + this.parentDomNode = parent; + this.computeAttributes(); + this.execute(); + this.renderChildren(parent,nextSibling); +}; + +/* +Compute the internal state of the widget +*/ +TextNodeWidget.prototype.execute = function() { + var self = this; + // Get our parameters + var childParseTree = [{ + type: "plain-text", + text: this.getAttribute("text",this.parseTreeNode.text || "") + }]; + // Only process links if not disabled + if(this.getVariable("tv-wikilinks",{defaultValue:"yes"}).trim() !== "no" && this.getVariable("tv-freelinks",{defaultValue:"no"}).trim() === "yes") { + // Get the information about the current tiddler titles, and construct a regexp + this.tiddlerTitleInfo = this.wiki.getGlobalCache("tiddler-title-info",function() { + var titles = [], + reparts = [], + sortedTitles = self.wiki.allTitles().sort(function(a,b) { + var lenA = a.length, + lenB = b.length; + // First sort by length, so longer titles are first + if(lenA !== lenB) { + if(lenA < lenB) { + return +1; + } else { + return -1; + } + } else { + // Then sort alphabetically within titles of the same length + if(a < b) { + return -1; + } else if(a > b) { + return +1; + } else { + return 0; + } + } + }); + $tw.utils.each(sortedTitles,function(title) { + if(title.substring(0,3) !== "$:/") { + titles.push(title); + reparts.push("(\\b" + $tw.utils.escapeRegExp(title) + "\\b)"); + } + }); + return { + titles: titles, + regexp: new RegExp(reparts.join("|"),"") + }; + }); + // Repeatedly linkify + if(this.tiddlerTitleInfo.titles.length > 0) { + var index,text,match,matchEnd; + do { + index = childParseTree.length - 1; + text = childParseTree[index].text; + match = this.tiddlerTitleInfo.regexp.exec(text); + if(match) { + // Make a text node for any text before the match + if(match.index > 0) { + childParseTree[index].text = text.substring(0,match.index); + index += 1; + } + // Make a link node for the match + childParseTree[index] = { + type: "link", + attributes: { + to: {type: "string", value: match[0]} + }, + children: [{ + type: "plain-text", text: match[0] + }] + }; + index += 1; + // Make a text node for any text after the match + matchEnd = match.index + match[0].length; + if(matchEnd < text.length) { + childParseTree[index] = { + type: "plain-text", + text: text.substring(matchEnd) + }; + } + } + } while(match && childParseTree[childParseTree.length - 1].type === "plain-text"); + } + } + // Make the child widgets + this.makeChildWidgets(childParseTree); +}; + +/* +Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering +*/ +TextNodeWidget.prototype.refresh = function(changedTiddlers) { + var self = this, + changedAttributes = this.computeAttributes(), + titlesHaveChanged = false; + $tw.utils.each(changedTiddlers,function(change,title) { + if(change.isDeleted) { + titlesHaveChanged = true + } else { + titlesHaveChanged = titlesHaveChanged || !self.tiddlerTitleInfo || self.tiddlerTitleInfo.titles.indexOf(title) === -1; + } + }); + if(changedAttributes.text || titlesHaveChanged) { + this.refreshSelf(); + return true; + } else { + return false; + } +}; + +exports.text = TextNodeWidget; + +})(); From ae3ca9bccd2a3907d066571482ee4038c0148743 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 3 Jan 2020 11:34:26 +0000 Subject: [PATCH 0435/2376] It's 2020! --- core/copyright.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/copyright.tid b/core/copyright.tid index 21470e3c4..ffc8c4ac0 100644 --- a/core/copyright.tid +++ b/core/copyright.tid @@ -4,7 +4,7 @@ type: text/plain TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com) Copyright (c) 2004-2007, Jeremy Ruston -Copyright (c) 2007-2018, UnaMesa Association +Copyright (c) 2007-2020, UnaMesa Association All rights reserved. Redistribution and use in source and binary forms, with or without From 429d38e75da0c2816771266a06e33efc535d160d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 4 Jan 2020 11:20:17 +0000 Subject: [PATCH 0436/2376] Update TiddlyFox docs Fixes #4399 --- editions/tw5.com/tiddlers/definitions/TiddlyFox.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/definitions/TiddlyFox.tid b/editions/tw5.com/tiddlers/definitions/TiddlyFox.tid index e96057783..83fa3c444 100644 --- a/editions/tw5.com/tiddlers/definitions/TiddlyFox.tid +++ b/editions/tw5.com/tiddlers/definitions/TiddlyFox.tid @@ -1,12 +1,12 @@ created: 20130825161100000 -modified: 20171110094548887 +modified: 20200104111952539 tags: Definitions title: TiddlyFox type: text/vnd.tiddlywiki TiddlyFox is an extension for older versions of Firefox that allows standalone TiddlyWiki files to save their changes directly to the file system. TiddlyFox works on both desktop and smartphone versions of [[Firefox]]. See [[Saving with TiddlyFox]] or [[Saving with TiddlyFox on Android]] for detailed instructions. -TiddlyFox is now obsolete due to its incompatibility with the latest versions of Firefox - see [[Firefox Apocalypse]]. There are many alternatives to TiddlyFox, but none that work in precisely the same way -- see GettingStarted for details. +TiddlyFox is now obsolete due to its incompatibility with the latest versions of Firefox - see [[TiddlyFox Apocalypse]]. There are many alternatives to TiddlyFox, but none that work in precisely the same way -- see GettingStarted for details. TiddlyFox can be downloaded from the Mozilla Addons site: From 75ba862a7e13d11be764947c01b137c53ba2b3c3 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 4 Jan 2020 12:25:43 +0100 Subject: [PATCH 0437/2376] Fix "remove" tooltip in keyboard shortcuts (#4405) this PR just fixes the tooltip of the small "remove" button in the keyboard-shortcut dropdown --- core/ui/ControlPanel/KeyboardShortcuts.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ControlPanel/KeyboardShortcuts.tid b/core/ui/ControlPanel/KeyboardShortcuts.tid index 8aec8b3fc..6855901ab 100644 --- a/core/ui/ControlPanel/KeyboardShortcuts.tid +++ b/core/ui/ControlPanel/KeyboardShortcuts.tid @@ -42,7 +42,7 @@ caption: {{$:/language/ControlPanel/KeyboardShortcuts/Caption}} </div> """> <div class="tc-dropdown-item-plain"> -<$button class="tc-btn-invisible" tooltip=<<lingo Remove/Hint>>> +<$button class="tc-btn-invisible" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}> <$action-listops $tiddler="$(shortcutTitle)$" $field="text" From 9c1882dce6720c8abe822361945dcae93655f930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Kr=C3=BCger?= <git@s-light.eu> Date: Sat, 4 Jan 2020 12:26:08 +0100 Subject: [PATCH 0438/2376] Signing the CLA (#4403) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 8bb836e60..bf375697f 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -379,3 +379,5 @@ Jan-Oliver Kaiser, @janno, 2019/09/06 Xavier Maysonnave, @xmaysonnave, 2019/11/08 Will Atwood Mitchell, @wam, 2019/12/11 + +Stefan Krüger, @s-light, 2020/01/04 From 1ed884cef4da98c24ce5cd35cfaa4674eb4d60fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Kr=C3=BCger?= <git@s-light.eu> Date: Sat, 4 Jan 2020 12:27:13 +0100 Subject: [PATCH 0439/2376] Add support for file type webm & ogg theora (#4404) --- boot/boot.js | 2 ++ core/modules/parsers/videoparser.js | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/boot/boot.js b/boot/boot.js index 9f867c48a..d2663837c 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2256,6 +2256,8 @@ $tw.boot.startup = function(options) { $tw.utils.registerFileType("application/font-woff","base64",".woff"); $tw.utils.registerFileType("application/x-font-ttf","base64",".woff"); $tw.utils.registerFileType("audio/ogg","base64",".ogg"); + $tw.utils.registerFileType("video/ogg","base64",[".ogm",".ogv",".ogg"]); + $tw.utils.registerFileType("video/webm","base64",".webm"); $tw.utils.registerFileType("video/mp4","base64",".mp4"); $tw.utils.registerFileType("audio/mp3","base64",".mp3"); $tw.utils.registerFileType("audio/mp4","base64",[".mp4",".m4a"]); diff --git a/core/modules/parsers/videoparser.js b/core/modules/parsers/videoparser.js index cbc56381f..f1c281c7c 100644 --- a/core/modules/parsers/videoparser.js +++ b/core/modules/parsers/videoparser.js @@ -30,8 +30,9 @@ var VideoParser = function(type,text,options) { this.tree = [element]; }; +exports["video/ogg"] = VideoParser; +exports["video/webm"] = VideoParser; exports["video/mp4"] = VideoParser; exports["video/quicktime"] = VideoParser; })(); - From 1c91f72baa5b5980f683db7dcc0d2a59ec9f20be Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 4 Jan 2020 16:33:52 +0000 Subject: [PATCH 0440/2376] Add a faint background to freelinks --- plugins/tiddlywiki/freelinks/styles.tid | 8 ++++++++ plugins/tiddlywiki/freelinks/text.js | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 plugins/tiddlywiki/freelinks/styles.tid diff --git a/plugins/tiddlywiki/freelinks/styles.tid b/plugins/tiddlywiki/freelinks/styles.tid new file mode 100644 index 000000000..61faa521b --- /dev/null +++ b/plugins/tiddlywiki/freelinks/styles.tid @@ -0,0 +1,8 @@ +title: $:/plugins/tiddlywiki/freelinks/styles +tags: [[$:/tags/Stylesheet]] + +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline + +button.tc-tiddlylink.tc-freelink, a.tc-tiddlylink.tc-freelink { + background-color: #5777d91c; +} diff --git a/plugins/tiddlywiki/freelinks/text.js b/plugins/tiddlywiki/freelinks/text.js index 8803c8cd2..409f40086 100755 --- a/plugins/tiddlywiki/freelinks/text.js +++ b/plugins/tiddlywiki/freelinks/text.js @@ -98,7 +98,8 @@ TextNodeWidget.prototype.execute = function() { childParseTree[index] = { type: "link", attributes: { - to: {type: "string", value: match[0]} + to: {type: "string", value: match[0]}, + "class": {type: "string", value: "tc-freelink"} }, children: [{ type: "plain-text", text: match[0] From 870c34ab0a9a7834b5f168f74dc9d71f8fed20ab Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 4 Jan 2020 16:34:34 +0000 Subject: [PATCH 0441/2376] Don't freelink within links and buttons --- plugins/tiddlywiki/freelinks/text.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/plugins/tiddlywiki/freelinks/text.js b/plugins/tiddlywiki/freelinks/text.js index 409f40086..6769419d6 100755 --- a/plugins/tiddlywiki/freelinks/text.js +++ b/plugins/tiddlywiki/freelinks/text.js @@ -12,7 +12,9 @@ An override of the core text widget that automatically linkifies the text /*global $tw: false */ "use strict"; -var Widget = require("$:/core/modules/widgets/widget.js").widget; +var Widget = require("$:/core/modules/widgets/widget.js").widget, + LinkWidget = require("$:/core/modules/widgets/link.js").link, + ButtonWidget = require("$:/core/modules/widgets/button.js").button; var TextNodeWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); @@ -43,8 +45,8 @@ TextNodeWidget.prototype.execute = function() { type: "plain-text", text: this.getAttribute("text",this.parseTreeNode.text || "") }]; - // Only process links if not disabled - if(this.getVariable("tv-wikilinks",{defaultValue:"yes"}).trim() !== "no" && this.getVariable("tv-freelinks",{defaultValue:"no"}).trim() === "yes") { + // Only process links if not disabled and we're not within a button or link widget + if(this.getVariable("tv-wikilinks",{defaultValue:"yes"}).trim() !== "no" && this.getVariable("tv-freelinks",{defaultValue:"no"}).trim() === "yes" && !this.isWithinButtonOrLink()) { // Get the information about the current tiddler titles, and construct a regexp this.tiddlerTitleInfo = this.wiki.getGlobalCache("tiddler-title-info",function() { var titles = [], @@ -122,6 +124,16 @@ TextNodeWidget.prototype.execute = function() { this.makeChildWidgets(childParseTree); }; +TextNodeWidget.prototype.isWithinButtonOrLink = function() { + var withinButtonOrLink = false, + widget = this.parentWidget; + while(!withinButtonOrLink && widget) { + withinButtonOrLink = widget instanceof ButtonWidget || widget instanceof LinkWidget; + widget = widget.parentWidget; + } + return withinButtonOrLink; +}; + /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ From e3835c64da61e7d0d7466164644e69ef2a2de813 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 4 Jan 2020 16:44:33 +0000 Subject: [PATCH 0442/2376] Restore whitespace for page control buttons Even with whitespace trim, we need a single space between the icon and text --- core/ui/PageControls/language.tid | 1 + core/ui/PageControls/palette.tid | 1 + core/ui/PageControls/storyview.tid | 1 + core/ui/PageControls/theme.tid | 1 + 4 files changed, 4 insertions(+) diff --git a/core/ui/PageControls/language.tid b/core/ui/PageControls/language.tid index 623c71004..ffae7449a 100644 --- a/core/ui/PageControls/language.tid +++ b/core/ui/PageControls/language.tid @@ -16,6 +16,7 @@ $(languagePluginTitle)$/icon </$set> </span> </$list> +<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Language/Caption}}/></span> </$list> diff --git a/core/ui/PageControls/palette.tid b/core/ui/PageControls/palette.tid index 6fdbdb439..569b7e8ca 100644 --- a/core/ui/PageControls/palette.tid +++ b/core/ui/PageControls/palette.tid @@ -9,6 +9,7 @@ description: {{$:/language/Buttons/Palette/Hint}} <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/palette}} </$list> +<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Palette/Caption}}/></span> </$list> diff --git a/core/ui/PageControls/storyview.tid b/core/ui/PageControls/storyview.tid index c4d0b7365..a426b91aa 100644 --- a/core/ui/PageControls/storyview.tid +++ b/core/ui/PageControls/storyview.tid @@ -14,6 +14,7 @@ $:/core/images/storyview-$(storyview)$ <$transclude tiddler=<<icon>>/> </$set> </$list> +<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span> </$list> diff --git a/core/ui/PageControls/theme.tid b/core/ui/PageControls/theme.tid index 2d8eadc7b..be3dbb0f9 100644 --- a/core/ui/PageControls/theme.tid +++ b/core/ui/PageControls/theme.tid @@ -9,6 +9,7 @@ description: {{$:/language/Buttons/Theme/Hint}} <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/theme-button}} </$list> +<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Theme/Caption}}/></span> </$list> From 338f3bad32b8f257d9b0dc0190a9c0e86a6e6ab3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 4 Jan 2020 17:02:00 +0000 Subject: [PATCH 0443/2376] Freelinks: Add note about customising within which tiddlers are freelinked --- plugins/tiddlywiki/freelinks/readme.tid | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/plugins/tiddlywiki/freelinks/readme.tid b/plugins/tiddlywiki/freelinks/readme.tid index 6ea98963b..61e39a4f5 100644 --- a/plugins/tiddlywiki/freelinks/readme.tid +++ b/plugins/tiddlywiki/freelinks/readme.tid @@ -9,4 +9,34 @@ Freelinking is activated for runs of text that have the following variables set: * `tv-wikilinks` is NOT equal to `no` * `tv-freelinks` is set to `yes` +Freelinks are case sensitive. + Within view templates, the variable `tv-freelinks` is automatically set to the content of $:/config/Freelinks/Enable, which can be set via the settings panel of this plugin. + +!! Notes + +To change within which tiddlers freelinking occurs requires customising the shadow tiddler $:/plugins/tiddlywiki/freelinks/macros/view. This tiddler is tagged $:/tags/Macro/View which means that it will be included as a local macro in each view template. By default, its content is: + +``` +<$set name="tv-freelinks" value={{$:/config/Freelinks/Enable}}/> +``` + +That means that for each tiddler the variable tv-freelinks will be set to the tiddler $:/config/Freelinks/Enable, which is set to "yes" or "no" by the settings in control panel. + +Instead, we can use a filter expression to, say, only freelink within the tiddler with the title "HelloThere": + +``` +<$set name="tv-freelinks" value={{{ [<currentTiddler>match[HelloThere]then[yes]else[no]] }}}/> +``` + +Or, we can make a filter that will only freelink within tiddlers with the tag "MyTag": + +``` +<$set name="tv-freelinks" value={{{ [<currentTiddler>tag[MyTags]then[yes]else[no]] }}}/> +``` + +Or we can combine both approaches: + +``` +<$set name="tv-freelinks" value={{{ [<currentTiddler>match[HelloThere]] ~[<currentTiddler>tag[MyTag]] +[then[yes]else[no]] }}}/> +``` From f59d044a8c785ad4a5a75689af1b594b8f4f3ecf Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 5 Jan 2020 14:13:39 +0100 Subject: [PATCH 0444/2376] Replace "×" with close-button in keyboard-shortcuts (#4406) this PR replaces the `×` in the keyboard-shortcuts dropdown with the `$:/core/images/close-button` --- core/ui/ControlPanel/KeyboardShortcuts.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ControlPanel/KeyboardShortcuts.tid b/core/ui/ControlPanel/KeyboardShortcuts.tid index 6855901ab..764d69b05 100644 --- a/core/ui/ControlPanel/KeyboardShortcuts.tid +++ b/core/ui/ControlPanel/KeyboardShortcuts.tid @@ -48,7 +48,7 @@ caption: {{$:/language/ControlPanel/KeyboardShortcuts/Caption}} $field="text" $subfilter="+[remove<shortcut>]" /> -× +<small>{{$:/core/images/close-button}}</small> </$button> <kbd> <$macrocall $name="displayshortcuts" $output="text/html" shortcuts=<<shortcut>>/> From 6732b3c0d963eb64f01627fdcf1002e2aae6d235 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 5 Jan 2020 13:54:06 +0000 Subject: [PATCH 0445/2376] Use match operator instead of prefix Fixes #4407 --- .../Page_and_tiddler_layout_customisation.tid | 4 ++-- .../Page and tiddler layout customisation.tid | 4 ++-- .../Page and tiddler layout customisation.tid | 4 ++-- plugins/tiddlywiki/help/help.tid | 8 ++++---- plugins/tiddlywiki/markdown/new-markdown.tid | 4 ++-- .../qrcode/ViewToolbarButton/Button.tid | 4 ++-- .../templates/interactive/tiddler.tid | 4 ++-- .../text-slicer/templates/plain/tiddler.tid | 20 +++++++++---------- .../text-slicer/templates/static/tiddler.tid | 20 +++++++++---------- .../text-slicer/ui/slice-toolbar-button.tid | 4 ++-- 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/editions/es-ES/tiddlers/Page_and_tiddler_layout_customisation.tid b/editions/es-ES/tiddlers/Page_and_tiddler_layout_customisation.tid index bdfa4f0ef..4e28c453e 100644 --- a/editions/es-ES/tiddlers/Page_and_tiddler_layout_customisation.tid +++ b/editions/es-ES/tiddlers/Page_and_tiddler_layout_customisation.tid @@ -40,10 +40,10 @@ Digamos que tienes un tiddler llamado <<.tid "Plantilla Recetas">> y quieres un $param="TÍTULO DE LA PLANTILLA QUE QUIERES QUE ABRA" title="New tiddler" tags=<<newHereButtonTags>> /> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{NOMBRE DE LA IMAGEN DEL BOTÓN}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text="NOMBRE DEL BOTÓN PARA MOSTRAR EN PANTALLA"/></span> </$list> </$button> diff --git a/editions/fr-FR/tiddlers/Page and tiddler layout customisation.tid b/editions/fr-FR/tiddlers/Page and tiddler layout customisation.tid index 5622f0d38..b30932517 100644 --- a/editions/fr-FR/tiddlers/Page and tiddler layout customisation.tid +++ b/editions/fr-FR/tiddlers/Page and tiddler layout customisation.tid @@ -39,10 +39,10 @@ Imaginons que vous ayez un tiddler squelette appelé 'Modèle Recette', et que v $param="TITLE DE VOTRE BOUTON SQUELETTE" title="New tiddler" tags=<<newHereButtonTags>> /> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{TITRE DE VOTRE TIDDLER IMAGE SVG}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text="CAPTION DE VOTRE BOUTON"/></span> </$list> </$button> diff --git a/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid b/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid index a783a59f0..7a233d396 100644 --- a/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid +++ b/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid @@ -37,10 +37,10 @@ Let's say you have a skeleton tiddler called 'Recipe template', and you want to $param="TITLE OF YOUR SKELETON BUTTON" title="New tiddler" tags=<<newHereButtonTags>> /> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{TITLE OF YOUR SVG IMAGE TIDDLER}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text="CAPTION FOR YOUR BUTTON"/></span> </$list> </$button> diff --git a/plugins/tiddlywiki/help/help.tid b/plugins/tiddlywiki/help/help.tid index 599ccf6a2..e2e7e9f0b 100644 --- a/plugins/tiddlywiki/help/help.tid +++ b/plugins/tiddlywiki/help/help.tid @@ -8,20 +8,20 @@ description: {{$:/language/Buttons/Help/Hint}} \whitespace trim <$reveal type="match" state="$:/config/ShowHelp" text="yes"> <$button set="$:/config/ShowHelp" setTo="no" tooltip={{$:/language/Buttons/Help/Hint}} aria-label={{$:/language/Buttons/Help/Caption}} class="""$(tv-config-toolbar-class)$ tc-selected"""> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/help}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Help/Caption}}/></span> </$list> </$button> </$reveal> <$reveal type="nomatch" state="$:/config/ShowHelp" text="yes"> <$button set="$:/config/ShowHelp" setTo="yes" tooltip={{$:/language/Buttons/Help/Hint}} aria-label={{$:/language/Buttons/Help/Caption}} class=<<tv-config-toolbar-class>>> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/help}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Help/Caption}}/></span> </$list> </$button> diff --git a/plugins/tiddlywiki/markdown/new-markdown.tid b/plugins/tiddlywiki/markdown/new-markdown.tid index ff6d40c82..50e4065b5 100755 --- a/plugins/tiddlywiki/markdown/new-markdown.tid +++ b/plugins/tiddlywiki/markdown/new-markdown.tid @@ -7,10 +7,10 @@ list-after: $:/core/ui/Buttons/new-tiddler \whitespace trim <$button tooltip={{$:/language/Buttons/NewMarkdown/Hint}} aria-label={{$:/language/Buttons/NewMarkdown/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-new-tiddler" type="text/x-markdown"/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/NewMarkdown/Caption}}/></span> </$list> </$button> diff --git a/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid b/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid index 7b496d812..20339b22e 100644 --- a/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid +++ b/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid @@ -8,10 +8,10 @@ description: Generate QR code for this tiddler \whitespace trim <span class="tc-popup-keep"> <$button popup=<<qualify "$:/state/popup/qrcode">> tooltip={{$:/plugins/tiddlywiki/qrcode/ViewToolbarButton!!description}} aria-label={{$:/plugins/tiddlywiki/qrcode/ViewToolbarButton!!short-caption}} class=<<tv-config-toolbar-class>> class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/plugins/tiddlywiki/qrcode/icon}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> <$text text=" "/> <$text text={{$:/plugins/tiddlywiki/qrcode/ViewToolbarButton!!short-caption}}/> diff --git a/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler.tid b/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler.tid index 54dbb7354..95253a13f 100644 --- a/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler.tid +++ b/plugins/tiddlywiki/text-slicer/templates/interactive/tiddler.tid @@ -7,12 +7,12 @@ $then$ \end \define include-component(type) -<<if "[{!!toc-type}prefix[$type$]]" """ +<<if "[{!!toc-type}match[$type$]]" """ <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/interactive/$type$" mode="block"/> """>> \end -<$list filter="[<tv-show-toolbar>prefix[yes]]" variable="hasToolbar"> +<$list filter="[<tv-show-toolbar>match[yes]]" variable="hasToolbar"> {{||$:/plugins/tiddlywiki/text-slicer/ui/tiddler/toolbar}} </$list> diff --git a/plugins/tiddlywiki/text-slicer/templates/plain/tiddler.tid b/plugins/tiddlywiki/text-slicer/templates/plain/tiddler.tid index f2b67200a..65f947c07 100644 --- a/plugins/tiddlywiki/text-slicer/templates/plain/tiddler.tid +++ b/plugins/tiddlywiki/text-slicer/templates/plain/tiddler.tid @@ -2,43 +2,43 @@ title: $:/plugins/tiddlywiki/text-slicer/templates/plain/tiddler <$vars toc-type={{!!toc-type}}> -<$list filter="[<toc-type>prefix[document]]" variable="item"> +<$list filter="[<toc-type>match[document]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/document" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[heading]]" variable="item"> +<$list filter="[<toc-type>match[heading]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/heading" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[paragraph]]" variable="item"> +<$list filter="[<toc-type>match[paragraph]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/paragraph" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[note]]" variable="item"> +<$list filter="[<toc-type>match[note]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/note" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[list]]" variable="item"> +<$list filter="[<toc-type>match[list]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/list" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[item]]" variable="item"> +<$list filter="[<toc-type>match[item]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/item" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[image]]" variable="item"> +<$list filter="[<toc-type>match[image]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/image" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[def-list]]" variable="item"> +<$list filter="[<toc-type>match[def-list]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/def-list" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[term]]" variable="item"> +<$list filter="[<toc-type>match[term]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/term" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[definition]]" variable="item"> +<$list filter="[<toc-type>match[definition]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/plain/definition" mode="block"/> </$list> diff --git a/plugins/tiddlywiki/text-slicer/templates/static/tiddler.tid b/plugins/tiddlywiki/text-slicer/templates/static/tiddler.tid index 8f4c6fe59..c46c55c69 100644 --- a/plugins/tiddlywiki/text-slicer/templates/static/tiddler.tid +++ b/plugins/tiddlywiki/text-slicer/templates/static/tiddler.tid @@ -2,61 +2,61 @@ title: $:/plugins/tiddlywiki/text-slicer/templates/static/tiddler <$vars toc-type={{!!toc-type}}> -<$list filter="[<toc-type>prefix[document]]" variable="item"> +<$list filter="[<toc-type>match[document]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/document" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[heading]]" variable="item"> +<$list filter="[<toc-type>match[heading]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/heading" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[paragraph]]" variable="item"> +<$list filter="[<toc-type>match[paragraph]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/paragraph" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[note]]" variable="item"> +<$list filter="[<toc-type>match[note]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/note" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[list]]" variable="item"> +<$list filter="[<toc-type>match[list]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/list" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[item]]" variable="item"> +<$list filter="[<toc-type>match[item]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/item" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[image]]" variable="item"> +<$list filter="[<toc-type>match[image]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/image" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[def-list]]" variable="item"> +<$list filter="[<toc-type>match[def-list]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/def-list" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[term]]" variable="item"> +<$list filter="[<toc-type>match[term]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/term" mode="block"/> </$list> -<$list filter="[<toc-type>prefix[definition]]" variable="item"> +<$list filter="[<toc-type>match[definition]]" variable="item"> <$transclude tiddler="$:/plugins/tiddlywiki/text-slicer/templates/static/definition" mode="block"/> diff --git a/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid b/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid index 1a52ff905..42ef547b1 100644 --- a/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid +++ b/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid @@ -13,10 +13,10 @@ Slice this text tiddler into chunks <$list filter="[<currentTiddler>!is[image]!is[binary]]" variable="ignore"> <$button tooltip=<<hint>> aria-label=<<hint>> class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-modal" $param="$:/plugins/tiddlywiki/text-slicer/ui/slice-modal" currentTiddler=<<currentTiddler>>/> -<$list filter="[<tv-config-toolbar-icons>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/plugins/tiddlywiki/text-slicer/images/text-slicer-icon}} </$list> -<$list filter="[<tv-config-toolbar-text>prefix[yes]]"> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> Slice tiddler</span> </$list> </$button> From 8145caa10428bd6e23d7abb389d7845731133ebb Mon Sep 17 00:00:00 2001 From: TonyM <31584658+AnthonyMuscio@users.noreply.github.com> Date: Wed, 15 Jan 2020 02:55:53 +1000 Subject: [PATCH 0446/2376] Add a new example that shows using all before to determine the nummeric position of a title in a list. (#4412) See discussion https://groups.google.com/forum/?hl=en#!topic/tiddlywiki/wY6haW2cYMA --- editions/tw5.com/tiddlers/filters/examples/allbefore.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/filters/examples/allbefore.tid b/editions/tw5.com/tiddlers/filters/examples/allbefore.tid index 01313dbec..92fc9f914 100644 --- a/editions/tw5.com/tiddlers/filters/examples/allbefore.tid +++ b/editions/tw5.com/tiddlers/filters/examples/allbefore.tid @@ -8,3 +8,4 @@ type: text/vnd.tiddlywiki <<.operator-example 1 "[list[Days of the Week]allbefore[Wednesday]]">> <<.operator-example 2 "[list[Days of the Week]allbefore:include[Wednesday]]">> +<<.operator-example 3 "A B C D E +[allbefore:include[C]count[]]">> From 7795ed92300b6ed73062363484eff68de4c141f6 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Jan 2020 20:29:13 +0000 Subject: [PATCH 0447/2376] Fix stamp dropdown not transcluding caption field --- core/ui/EditorToolbar/stamp-dropdown.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/ui/EditorToolbar/stamp-dropdown.tid b/core/ui/EditorToolbar/stamp-dropdown.tid index a22a3e800..761e05fc9 100644 --- a/core/ui/EditorToolbar/stamp-dropdown.tid +++ b/core/ui/EditorToolbar/stamp-dropdown.tid @@ -29,11 +29,11 @@ suffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}} $tiddler=<<dropdown-state>> /> -<$view tiddler=<<snippetTitle>> field="caption" mode="inline"> +<$transclude tiddler=<<snippetTitle>> field="caption" mode="inline"> -<$view tiddler=<<snippetTitle>> field="title" mode="inline"/> +<$view tiddler=<<snippetTitle>> field="title" /> -</$view> +</$transclude> </$button> \end From b258afea0dc564b737409d88c72ca4180f967799 Mon Sep 17 00:00:00 2001 From: Brooks Boyd <MidnightLightning@users.noreply.github.com> Date: Mon, 20 Jan 2020 07:13:36 -0600 Subject: [PATCH 0448/2376] Replace Markdown parsing library with Remarkable (#3876) * Replace Markdown parsing library with Remarkable * Fix handling of block-level elements * Update documentation * Add config options for Parser actions * Add Config options for Remarkable library * Match code style * Update documentation * Handle ordered lists and horizontal rules * Update to v2.0.0 of Remarkable library --- editions/markdowndemo/tiddlers/HelloThere.tid | 31 +- .../markdowndemo/tiddlers/MarkdownExample.tid | 41 +- plugins/tiddlywiki/markdown/config_breaks.tid | 3 + .../markdown/config_linkNewWindow.tid | 3 + .../tiddlywiki/markdown/config_linkify.tid | 3 + plugins/tiddlywiki/markdown/config_quotes.tid | 3 + .../markdown/config_renderWikiText.tid | 3 + .../markdown/config_renderWikiTextPragma.tid | 3 + .../markdown/config_typographer.tid | 3 + plugins/tiddlywiki/markdown/dialect.tid | 3 - plugins/tiddlywiki/markdown/files/markdown.js | 1725 ----------------- .../tiddlywiki/markdown/files/remarkable.js | 1 + .../markdown/files/tiddlywiki.files | 4 +- plugins/tiddlywiki/markdown/readme.tid | 2 +- plugins/tiddlywiki/markdown/usage.tid | 24 +- plugins/tiddlywiki/markdown/wrapper.js | 265 ++- 16 files changed, 261 insertions(+), 1856 deletions(-) create mode 100644 plugins/tiddlywiki/markdown/config_breaks.tid create mode 100644 plugins/tiddlywiki/markdown/config_linkNewWindow.tid create mode 100644 plugins/tiddlywiki/markdown/config_linkify.tid create mode 100644 plugins/tiddlywiki/markdown/config_quotes.tid create mode 100644 plugins/tiddlywiki/markdown/config_renderWikiText.tid create mode 100644 plugins/tiddlywiki/markdown/config_renderWikiTextPragma.tid create mode 100644 plugins/tiddlywiki/markdown/config_typographer.tid delete mode 100755 plugins/tiddlywiki/markdown/dialect.tid delete mode 100755 plugins/tiddlywiki/markdown/files/markdown.js create mode 100644 plugins/tiddlywiki/markdown/files/remarkable.js diff --git a/editions/markdowndemo/tiddlers/HelloThere.tid b/editions/markdowndemo/tiddlers/HelloThere.tid index b3b4aea0b..e818ddb59 100644 --- a/editions/markdowndemo/tiddlers/HelloThere.tid +++ b/editions/markdowndemo/tiddlers/HelloThere.tid @@ -1,6 +1,6 @@ title: HelloThere -This is a demo of TiddlyWiki5 incorporating a plugin for the [[markdown-js|https://github.com/evilstreak/markdown-js]] Markdown parser from Dominic Baggott. The MarkdownExample tiddler below is written in Markdown. +This is a demo of TiddlyWiki5 incorporating a plugin for parsing tiddlers written in the Markdown language. The plugin uses the [[Remarkable|https://github.com/jonschlinkert/remarkable]] Markdown parser internally. The MarkdownExample tiddler below is written in Markdown. ! Installation @@ -8,31 +8,4 @@ To add the plugin to your own TiddlyWiki5, just drag this link to the browser wi [[$:/plugins/tiddlywiki/markdown]] -! Markdown Dialects - -By default the markdown parser recognises the original dialect of Markdown [[as described by John Gruber|http://daringfireball.net/projects/markdown/]]. An extended dialect called "Maruku" is also included that provides table support and other advanced features. The syntax extensions are modelled on those of [[PHP Markdown Extra|https://michelf.ca/projects/php-markdown/extra/]]. - -The configuration tiddler [[$:/config/markdown/dialect]] determines which dialect is used: - -|!Dialect |!Description | -|Gruber |Standard Markdown | -|Maruku |Extended Maruku Markdown | - - -! Creating ~WikiLinks - -Create wiki links with the usual Markdown link syntax targeting `#` and the target tiddler title: - -``` -[link text](#TiddlerTitle) -``` - -! Images - -Markdown image syntax can be used to reference images by tiddler title or an external URI. For example: - -``` -![alt text](/path/to/img.jpg "Title") - -![alt text](Motovun Jack.jpg "Title") -``` +{{$:/plugins/tiddlywiki/markdown/usage}} \ No newline at end of file diff --git a/editions/markdowndemo/tiddlers/MarkdownExample.tid b/editions/markdowndemo/tiddlers/MarkdownExample.tid index ce6553d53..9d8144c5f 100644 --- a/editions/markdowndemo/tiddlers/MarkdownExample.tid +++ b/editions/markdowndemo/tiddlers/MarkdownExample.tid @@ -19,11 +19,10 @@ web application that allows you type your own Markdown-formatted text and translate it to XHTML. **Note:** This document is itself written using Markdown; you -can [see the source for it by adding '.text' to the URL] [src]. +can see the source for it by editing this tiddler. - [s]: /projects/markdown/syntax "Markdown Syntax" - [d]: /projects/markdown/dingus "Markdown Dingus" - [src]: /projects/markdown/basics.text + [s]: https://daringfireball.net/projects/markdown/syntax "Markdown Syntax" + [d]: https://daringfireball.net/projects/markdown/dingus "Markdown Dingus" ## Paragraphs, Headers, Blockquotes ## @@ -47,7 +46,7 @@ Markdown: A First Level Header ==================== - + A Second Level Header --------------------- @@ -57,11 +56,11 @@ Markdown: The quick brown fox jumped over the lazy dog's back. - + ### Header 3 > This is a blockquote. - > + > > This is the second paragraph in the blockquote. > > ## This is an H2 in a blockquote @@ -70,23 +69,23 @@ Markdown: Output: <h1>A First Level Header</h1> - + <h2>A Second Level Header</h2> - + <p>Now is the time for all good men to come to the aid of their country. This is just a regular paragraph.</p> - + <p>The quick brown fox jumped over the lazy dog's back.</p> - + <h3>Header 3</h3> - + <blockquote> <p>This is a blockquote.</p> - + <p>This is the second paragraph in the blockquote.</p> - + <h2>This is an H2 in a blockquote</h2> </blockquote> @@ -100,7 +99,7 @@ Markdown: Some of these words *are emphasized*. Some of these words _are emphasized also_. - + Use two asterisks for **strong emphasis**. Or, if you prefer, __use two underscores instead__. @@ -108,10 +107,10 @@ Output: <p>Some of these words <em>are emphasized</em>. Some of these words <em>are emphasized also</em>.</p> - + <p>Use two asterisks for <strong>strong emphasis</strong>. Or, if you prefer, <strong>use two underscores instead</strong>.</p> - + ## Lists ## @@ -164,7 +163,7 @@ list item text. You can create multi-paragraph list items by indenting the paragraphs by 4 spaces or 1 tab: * A list item. - + With multiple paragraphs. * Another item in the list. @@ -176,7 +175,7 @@ Output: <p>With multiple paragraphs.</p></li> <li><p>Another item in the list.</p></li> </ul> - + ### Links ### @@ -271,7 +270,7 @@ Output: <p>I strongly recommend against using any <code><blink></code> tags.</p> - + <p>I wish SmartyPants used named entities like <code>&mdash;</code> instead of decimal-encoded entites like <code>&#8212;</code>.</p> @@ -294,7 +293,7 @@ Output: <p>If you want your page to validate under XHTML 1.0 Strict, you've got to put paragraph tags in your blockquotes:</p> - + <pre><code><blockquote> <p>For example.</p> </blockquote> diff --git a/plugins/tiddlywiki/markdown/config_breaks.tid b/plugins/tiddlywiki/markdown/config_breaks.tid new file mode 100644 index 000000000..18fc90690 --- /dev/null +++ b/plugins/tiddlywiki/markdown/config_breaks.tid @@ -0,0 +1,3 @@ +title: $:/config/markdown/breaks + +false \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/config_linkNewWindow.tid b/plugins/tiddlywiki/markdown/config_linkNewWindow.tid new file mode 100644 index 000000000..274776a7a --- /dev/null +++ b/plugins/tiddlywiki/markdown/config_linkNewWindow.tid @@ -0,0 +1,3 @@ +title: $:/config/markdown/linkNewWindow + +true \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/config_linkify.tid b/plugins/tiddlywiki/markdown/config_linkify.tid new file mode 100644 index 000000000..eddaff730 --- /dev/null +++ b/plugins/tiddlywiki/markdown/config_linkify.tid @@ -0,0 +1,3 @@ +title: $:/config/markdown/linkify + +false \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/config_quotes.tid b/plugins/tiddlywiki/markdown/config_quotes.tid new file mode 100644 index 000000000..68baf5602 --- /dev/null +++ b/plugins/tiddlywiki/markdown/config_quotes.tid @@ -0,0 +1,3 @@ +title: $:/config/markdown/quotes + +“”‘’ \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/config_renderWikiText.tid b/plugins/tiddlywiki/markdown/config_renderWikiText.tid new file mode 100644 index 000000000..2e0001d51 --- /dev/null +++ b/plugins/tiddlywiki/markdown/config_renderWikiText.tid @@ -0,0 +1,3 @@ +title: $:/config/markdown/renderWikiText + +true \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/config_renderWikiTextPragma.tid b/plugins/tiddlywiki/markdown/config_renderWikiTextPragma.tid new file mode 100644 index 000000000..c3cd6d482 --- /dev/null +++ b/plugins/tiddlywiki/markdown/config_renderWikiTextPragma.tid @@ -0,0 +1,3 @@ +title: $:/config/markdown/renderWikiTextPragma + +\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/config_typographer.tid b/plugins/tiddlywiki/markdown/config_typographer.tid new file mode 100644 index 000000000..b7a8bbca9 --- /dev/null +++ b/plugins/tiddlywiki/markdown/config_typographer.tid @@ -0,0 +1,3 @@ +title: $:/config/markdown/typographer + +false \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/dialect.tid b/plugins/tiddlywiki/markdown/dialect.tid deleted file mode 100755 index 342ace8ff..000000000 --- a/plugins/tiddlywiki/markdown/dialect.tid +++ /dev/null @@ -1,3 +0,0 @@ -title: $:/config/markdown/dialect - -Gruber \ No newline at end of file diff --git a/plugins/tiddlywiki/markdown/files/markdown.js b/plugins/tiddlywiki/markdown/files/markdown.js deleted file mode 100755 index d365cfa07..000000000 --- a/plugins/tiddlywiki/markdown/files/markdown.js +++ /dev/null @@ -1,1725 +0,0 @@ -// Released under MIT license -// Copyright (c) 2009-2010 Dominic Baggott -// Copyright (c) 2009-2010 Ash Berlin -// Copyright (c) 2011 Christoph Dorn <christoph@christophdorn.com> (http://www.christophdorn.com) - -/*jshint browser:true, devel:true */ - -(function( expose ) { - -/** - * class Markdown - * - * Markdown processing in Javascript done right. We have very particular views - * on what constitutes 'right' which include: - * - * - produces well-formed HTML (this means that em and strong nesting is - * important) - * - * - has an intermediate representation to allow processing of parsed data (We - * in fact have two, both as [JsonML]: a markdown tree and an HTML tree). - * - * - is easily extensible to add new dialects without having to rewrite the - * entire parsing mechanics - * - * - has a good test suite - * - * This implementation fulfills all of these (except that the test suite could - * do with expanding to automatically run all the fixtures from other Markdown - * implementations.) - * - * ##### Intermediate Representation - * - * *TODO* Talk about this :) Its JsonML, but document the node names we use. - * - * [JsonML]: http://jsonml.org/ "JSON Markup Language" - **/ -var Markdown = expose.Markdown = function(dialect) { - switch (typeof dialect) { - case "undefined": - this.dialect = Markdown.dialects.Gruber; - break; - case "object": - this.dialect = dialect; - break; - default: - if ( dialect in Markdown.dialects ) { - this.dialect = Markdown.dialects[dialect]; - } - else { - throw new Error("Unknown Markdown dialect '" + String(dialect) + "'"); - } - break; - } - this.em_state = []; - this.strong_state = []; - this.debug_indent = ""; -}; - -/** - * parse( markdown, [dialect] ) -> JsonML - * - markdown (String): markdown string to parse - * - dialect (String | Dialect): the dialect to use, defaults to gruber - * - * Parse `markdown` and return a markdown document as a Markdown.JsonML tree. - **/ -expose.parse = function( source, dialect ) { - // dialect will default if undefined - var md = new Markdown( dialect ); - return md.toTree( source ); -}; - -/** - * toHTML( markdown, [dialect] ) -> String - * toHTML( md_tree ) -> String - * - markdown (String): markdown string to parse - * - md_tree (Markdown.JsonML): parsed markdown tree - * - * Take markdown (either as a string or as a JsonML tree) and run it through - * [[toHTMLTree]] then turn it into a well-formated HTML fragment. - **/ -expose.toHTML = function toHTML( source , dialect , options ) { - var input = expose.toHTMLTree( source , dialect , options ); - - return expose.renderJsonML( input ); -}; - -/** - * toHTMLTree( markdown, [dialect] ) -> JsonML - * toHTMLTree( md_tree ) -> JsonML - * - markdown (String): markdown string to parse - * - dialect (String | Dialect): the dialect to use, defaults to gruber - * - md_tree (Markdown.JsonML): parsed markdown tree - * - * Turn markdown into HTML, represented as a JsonML tree. If a string is given - * to this function, it is first parsed into a markdown tree by calling - * [[parse]]. - **/ -expose.toHTMLTree = function toHTMLTree( input, dialect , options ) { - // convert string input to an MD tree - if ( typeof input ==="string" ) input = this.parse( input, dialect ); - - // Now convert the MD tree to an HTML tree - - // remove references from the tree - var attrs = extract_attr( input ), - refs = {}; - - if ( attrs && attrs.references ) { - refs = attrs.references; - } - - var html = convert_tree_to_html( input, refs , options ); - merge_text_nodes( html ); - return html; -}; - -// For Spidermonkey based engines -function mk_block_toSource() { - return "Markdown.mk_block( " + - uneval(this.toString()) + - ", " + - uneval(this.trailing) + - ", " + - uneval(this.lineNumber) + - " )"; -} - -// node -function mk_block_inspect() { - var util = require("util"); - return "Markdown.mk_block( " + - util.inspect(this.toString()) + - ", " + - util.inspect(this.trailing) + - ", " + - util.inspect(this.lineNumber) + - " )"; - -} - -var mk_block = Markdown.mk_block = function(block, trail, line) { - // Be helpful for default case in tests. - if ( arguments.length == 1 ) trail = "\n\n"; - - var s = new String(block); - s.trailing = trail; - // To make it clear its not just a string - s.inspect = mk_block_inspect; - s.toSource = mk_block_toSource; - - if ( line != undefined ) - s.lineNumber = line; - - return s; -}; - -function count_lines( str ) { - var n = 0, i = -1; - while ( ( i = str.indexOf("\n", i + 1) ) !== -1 ) n++; - return n; -} - -// Internal - split source into rough blocks -Markdown.prototype.split_blocks = function splitBlocks( input, startLine ) { - input = input.replace(/(\r\n|\n|\r)/g, "\n"); - // [\s\S] matches _anything_ (newline or space) - // [^] is equivalent but doesn't work in IEs. - var re = /([\s\S]+?)($|\n#|\n(?:\s*\n|$)+)/g, - blocks = [], - m; - - var line_no = 1; - - if ( ( m = /^(\s*\n)/.exec(input) ) != null ) { - // skip (but count) leading blank lines - line_no += count_lines( m[0] ); - re.lastIndex = m[0].length; - } - - while ( ( m = re.exec(input) ) !== null ) { - if (m[2] == "\n#") { - m[2] = "\n"; - re.lastIndex--; - } - blocks.push( mk_block( m[1], m[2], line_no ) ); - line_no += count_lines( m[0] ); - } - - return blocks; -}; - -/** - * Markdown#processBlock( block, next ) -> undefined | [ JsonML, ... ] - * - block (String): the block to process - * - next (Array): the following blocks - * - * Process `block` and return an array of JsonML nodes representing `block`. - * - * It does this by asking each block level function in the dialect to process - * the block until one can. Succesful handling is indicated by returning an - * array (with zero or more JsonML nodes), failure by a false value. - * - * Blocks handlers are responsible for calling [[Markdown#processInline]] - * themselves as appropriate. - * - * If the blocks were split incorrectly or adjacent blocks need collapsing you - * can adjust `next` in place using shift/splice etc. - * - * If any of this default behaviour is not right for the dialect, you can - * define a `__call__` method on the dialect that will get invoked to handle - * the block processing. - */ -Markdown.prototype.processBlock = function processBlock( block, next ) { - var cbs = this.dialect.block, - ord = cbs.__order__; - - if ( "__call__" in cbs ) { - return cbs.__call__.call(this, block, next); - } - - for ( var i = 0; i < ord.length; i++ ) { - //D:this.debug( "Testing", ord[i] ); - var res = cbs[ ord[i] ].call( this, block, next ); - if ( res ) { - //D:this.debug(" matched"); - if ( !isArray(res) || ( res.length > 0 && !( isArray(res[0]) ) ) ) - this.debug(ord[i], "didn't return a proper array"); - //D:this.debug( "" ); - return res; - } - } - - // Uhoh! no match! Should we throw an error? - return []; -}; - -Markdown.prototype.processInline = function processInline( block ) { - return this.dialect.inline.__call__.call( this, String( block ) ); -}; - -/** - * Markdown#toTree( source ) -> JsonML - * - source (String): markdown source to parse - * - * Parse `source` into a JsonML tree representing the markdown document. - **/ -// custom_tree means set this.tree to `custom_tree` and restore old value on return -Markdown.prototype.toTree = function toTree( source, custom_root ) { - var blocks = source instanceof Array ? source : this.split_blocks( source ); - - // Make tree a member variable so its easier to mess with in extensions - var old_tree = this.tree; - try { - this.tree = custom_root || this.tree || [ "markdown" ]; - - blocks: - while ( blocks.length ) { - var b = this.processBlock( blocks.shift(), blocks ); - - // Reference blocks and the like won't return any content - if ( !b.length ) continue blocks; - - this.tree.push.apply( this.tree, b ); - } - return this.tree; - } - finally { - if ( custom_root ) { - this.tree = old_tree; - } - } -}; - -// Noop by default -Markdown.prototype.debug = function () { - var args = Array.prototype.slice.call( arguments); - args.unshift(this.debug_indent); - if ( typeof print !== "undefined" ) - print.apply( print, args ); - if ( typeof console !== "undefined" && typeof console.log !== "undefined" ) - console.log.apply( null, args ); -} - -Markdown.prototype.loop_re_over_block = function( re, block, cb ) { - // Dont use /g regexps with this - var m, - b = block.valueOf(); - - while ( b.length && (m = re.exec(b) ) != null ) { - b = b.substr( m[0].length ); - cb.call(this, m); - } - return b; -}; - -/** - * Markdown.dialects - * - * Namespace of built-in dialects. - **/ -Markdown.dialects = {}; - -/** - * Markdown.dialects.Gruber - * - * The default dialect that follows the rules set out by John Gruber's - * markdown.pl as closely as possible. Well actually we follow the behaviour of - * that script which in some places is not exactly what the syntax web page - * says. - **/ -Markdown.dialects.Gruber = { - block: { - atxHeader: function atxHeader( block, next ) { - var m = block.match( /^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/ ); - - if ( !m ) return undefined; - - var header = [ "header", { level: m[ 1 ].length } ]; - Array.prototype.push.apply(header, this.processInline(m[ 2 ])); - - if ( m[0].length < block.length ) - next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) ); - - return [ header ]; - }, - - setextHeader: function setextHeader( block, next ) { - var m = block.match( /^(.*)\n([-=])\2\2+(?:\n|$)/ ); - - if ( !m ) return undefined; - - var level = ( m[ 2 ] === "=" ) ? 1 : 2; - var header = [ "header", { level : level }, m[ 1 ] ]; - - if ( m[0].length < block.length ) - next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) ); - - return [ header ]; - }, - - code: function code( block, next ) { - // | Foo - // |bar - // should be a code block followed by a paragraph. Fun - // - // There might also be adjacent code block to merge. - - var ret = [], - re = /^(?: {0,3}\t| {4})(.*)\n?/, - lines; - - // 4 spaces + content - if ( !block.match( re ) ) return undefined; - - block_search: - do { - // Now pull out the rest of the lines - var b = this.loop_re_over_block( - re, block.valueOf(), function( m ) { ret.push( m[1] ); } ); - - if ( b.length ) { - // Case alluded to in first comment. push it back on as a new block - next.unshift( mk_block(b, block.trailing) ); - break block_search; - } - else if ( next.length ) { - // Check the next block - it might be code too - if ( !next[0].match( re ) ) break block_search; - - // Pull how how many blanks lines follow - minus two to account for .join - ret.push ( block.trailing.replace(/[^\n]/g, "").substring(2) ); - - block = next.shift(); - } - else { - break block_search; - } - } while ( true ); - - return [ [ "code_block", ret.join("\n") ] ]; - }, - - horizRule: function horizRule( block, next ) { - // this needs to find any hr in the block to handle abutting blocks - var m = block.match( /^(?:([\s\S]*?)\n)?[ \t]*([-_*])(?:[ \t]*\2){2,}[ \t]*(?:\n([\s\S]*))?$/ ); - - if ( !m ) { - return undefined; - } - - var jsonml = [ [ "hr" ] ]; - - // if there's a leading abutting block, process it - if ( m[ 1 ] ) { - jsonml.unshift.apply( jsonml, this.processBlock( m[ 1 ], [] ) ); - } - - // if there's a trailing abutting block, stick it into next - if ( m[ 3 ] ) { - next.unshift( mk_block( m[ 3 ] ) ); - } - - return jsonml; - }, - - // There are two types of lists. Tight and loose. Tight lists have no whitespace - // between the items (and result in text just in the <li>) and loose lists, - // which have an empty line between list items, resulting in (one or more) - // paragraphs inside the <li>. - // - // There are all sorts weird edge cases about the original markdown.pl's - // handling of lists: - // - // * Nested lists are supposed to be indented by four chars per level. But - // if they aren't, you can get a nested list by indenting by less than - // four so long as the indent doesn't match an indent of an existing list - // item in the 'nest stack'. - // - // * The type of the list (bullet or number) is controlled just by the - // first item at the indent. Subsequent changes are ignored unless they - // are for nested lists - // - lists: (function( ) { - // Use a closure to hide a few variables. - var any_list = "[*+-]|\\d+\\.", - bullet_list = /[*+-]/, - number_list = /\d+\./, - // Capture leading indent as it matters for determining nested lists. - is_list_re = new RegExp( "^( {0,3})(" + any_list + ")[ \t]+" ), - indent_re = "(?: {0,3}\\t| {4})"; - - // TODO: Cache this regexp for certain depths. - // Create a regexp suitable for matching an li for a given stack depth - function regex_for_depth( depth ) { - - return new RegExp( - // m[1] = indent, m[2] = list_type - "(?:^(" + indent_re + "{0," + depth + "} {0,3})(" + any_list + ")\\s+)|" + - // m[3] = cont - "(^" + indent_re + "{0," + (depth-1) + "}[ ]{0,4})" - ); - } - function expand_tab( input ) { - return input.replace( / {0,3}\t/g, " " ); - } - - // Add inline content `inline` to `li`. inline comes from processInline - // so is an array of content - function add(li, loose, inline, nl) { - if ( loose ) { - li.push( [ "para" ].concat(inline) ); - return; - } - // Hmmm, should this be any block level element or just paras? - var add_to = li[li.length -1] instanceof Array && li[li.length - 1][0] == "para" - ? li[li.length -1] - : li; - - // If there is already some content in this list, add the new line in - if ( nl && li.length > 1 ) inline.unshift(nl); - - for ( var i = 0; i < inline.length; i++ ) { - var what = inline[i], - is_str = typeof what == "string"; - if ( is_str && add_to.length > 1 && typeof add_to[add_to.length-1] == "string" ) { - add_to[ add_to.length-1 ] += what; - } - else { - add_to.push( what ); - } - } - } - - // contained means have an indent greater than the current one. On - // *every* line in the block - function get_contained_blocks( depth, blocks ) { - - var re = new RegExp( "^(" + indent_re + "{" + depth + "}.*?\\n?)*$" ), - replace = new RegExp("^" + indent_re + "{" + depth + "}", "gm"), - ret = []; - - while ( blocks.length > 0 ) { - if ( re.exec( blocks[0] ) ) { - var b = blocks.shift(), - // Now remove that indent - x = b.replace( replace, ""); - - ret.push( mk_block( x, b.trailing, b.lineNumber ) ); - } - else { - break; - } - } - return ret; - } - - // passed to stack.forEach to turn list items up the stack into paras - function paragraphify(s, i, stack) { - var list = s.list; - var last_li = list[list.length-1]; - - if ( last_li[1] instanceof Array && last_li[1][0] == "para" ) { - return; - } - if ( i + 1 == stack.length ) { - // Last stack frame - // Keep the same array, but replace the contents - last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ) ); - } - else { - var sublist = last_li.pop(); - last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ), sublist ); - } - } - - // The matcher function - return function( block, next ) { - var m = block.match( is_list_re ); - if ( !m ) return undefined; - - function make_list( m ) { - var list = bullet_list.exec( m[2] ) - ? ["bulletlist"] - : ["numberlist"]; - - stack.push( { list: list, indent: m[1] } ); - return list; - } - - - var stack = [], // Stack of lists for nesting. - list = make_list( m ), - last_li, - loose = false, - ret = [ stack[0].list ], - i; - - // Loop to search over block looking for inner block elements and loose lists - loose_search: - while ( true ) { - // Split into lines preserving new lines at end of line - var lines = block.split( /(?=\n)/ ); - - // We have to grab all lines for a li and call processInline on them - // once as there are some inline things that can span lines. - var li_accumulate = ""; - - // Loop over the lines in this block looking for tight lists. - tight_search: - for ( var line_no = 0; line_no < lines.length; line_no++ ) { - var nl = "", - l = lines[line_no].replace(/^\n/, function(n) { nl = n; return ""; }); - - // TODO: really should cache this - var line_re = regex_for_depth( stack.length ); - - m = l.match( line_re ); - //print( "line:", uneval(l), "\nline match:", uneval(m) ); - - // We have a list item - if ( m[1] !== undefined ) { - // Process the previous list item, if any - if ( li_accumulate.length ) { - add( last_li, loose, this.processInline( li_accumulate ), nl ); - // Loose mode will have been dealt with. Reset it - loose = false; - li_accumulate = ""; - } - - m[1] = expand_tab( m[1] ); - var wanted_depth = Math.floor(m[1].length/4)+1; - //print( "want:", wanted_depth, "stack:", stack.length); - if ( wanted_depth > stack.length ) { - // Deep enough for a nested list outright - //print ( "new nested list" ); - list = make_list( m ); - last_li.push( list ); - last_li = list[1] = [ "listitem" ]; - } - else { - // We aren't deep enough to be strictly a new level. This is - // where Md.pl goes nuts. If the indent matches a level in the - // stack, put it there, else put it one deeper then the - // wanted_depth deserves. - var found = false; - for ( i = 0; i < stack.length; i++ ) { - if ( stack[ i ].indent != m[1] ) continue; - list = stack[ i ].list; - stack.splice( i+1, stack.length - (i+1) ); - found = true; - break; - } - - if (!found) { - //print("not found. l:", uneval(l)); - wanted_depth++; - if ( wanted_depth <= stack.length ) { - stack.splice(wanted_depth, stack.length - wanted_depth); - //print("Desired depth now", wanted_depth, "stack:", stack.length); - list = stack[wanted_depth-1].list; - //print("list:", uneval(list) ); - } - else { - //print ("made new stack for messy indent"); - list = make_list(m); - last_li.push(list); - } - } - - //print( uneval(list), "last", list === stack[stack.length-1].list ); - last_li = [ "listitem" ]; - list.push(last_li); - } // end depth of shenegains - nl = ""; - } - - // Add content - if ( l.length > m[0].length ) { - li_accumulate += nl + l.substr( m[0].length ); - } - } // tight_search - - if ( li_accumulate.length ) { - add( last_li, loose, this.processInline( li_accumulate ), nl ); - // Loose mode will have been dealt with. Reset it - loose = false; - li_accumulate = ""; - } - - // Look at the next block - we might have a loose list. Or an extra - // paragraph for the current li - var contained = get_contained_blocks( stack.length, next ); - - // Deal with code blocks or properly nested lists - if ( contained.length > 0 ) { - // Make sure all listitems up the stack are paragraphs - forEach( stack, paragraphify, this); - - last_li.push.apply( last_li, this.toTree( contained, [] ) ); - } - - var next_block = next[0] && next[0].valueOf() || ""; - - if ( next_block.match(is_list_re) || next_block.match( /^ / ) ) { - block = next.shift(); - - // Check for an HR following a list: features/lists/hr_abutting - var hr = this.dialect.block.horizRule( block, next ); - - if ( hr ) { - ret.push.apply(ret, hr); - break; - } - - // Make sure all listitems up the stack are paragraphs - forEach( stack, paragraphify, this); - - loose = true; - continue loose_search; - } - break; - } // loose_search - - return ret; - }; - })(), - - blockquote: function blockquote( block, next ) { - if ( !block.match( /^>/m ) ) - return undefined; - - var jsonml = []; - - // separate out the leading abutting block, if any. I.e. in this case: - // - // a - // > b - // - if ( block[ 0 ] != ">" ) { - var lines = block.split( /\n/ ), - prev = [], - line_no = block.lineNumber; - - // keep shifting lines until you find a crotchet - while ( lines.length && lines[ 0 ][ 0 ] != ">" ) { - prev.push( lines.shift() ); - line_no++; - } - - var abutting = mk_block( prev.join( "\n" ), "\n", block.lineNumber ); - jsonml.push.apply( jsonml, this.processBlock( abutting, [] ) ); - // reassemble new block of just block quotes! - block = mk_block( lines.join( "\n" ), block.trailing, line_no ); - } - - - // if the next block is also a blockquote merge it in - while ( next.length && next[ 0 ][ 0 ] == ">" ) { - var b = next.shift(); - block = mk_block( block + block.trailing + b, b.trailing, block.lineNumber ); - } - - // Strip off the leading "> " and re-process as a block. - var input = block.replace( /^> ?/gm, "" ), - old_tree = this.tree, - processedBlock = this.toTree( input, [ "blockquote" ] ), - attr = extract_attr( processedBlock ); - - // If any link references were found get rid of them - if ( attr && attr.references ) { - delete attr.references; - // And then remove the attribute object if it's empty - if ( isEmpty( attr ) ) { - processedBlock.splice( 1, 1 ); - } - } - - jsonml.push( processedBlock ); - return jsonml; - }, - - referenceDefn: function referenceDefn( block, next) { - var re = /^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/; - // interesting matches are [ , ref_id, url, , title, title ] - - if ( !block.match(re) ) - return undefined; - - // make an attribute node if it doesn't exist - if ( !extract_attr( this.tree ) ) { - this.tree.splice( 1, 0, {} ); - } - - var attrs = extract_attr( this.tree ); - - // make a references hash if it doesn't exist - if ( attrs.references === undefined ) { - attrs.references = {}; - } - - var b = this.loop_re_over_block(re, block, function( m ) { - - if ( m[2] && m[2][0] == "<" && m[2][m[2].length-1] == ">" ) - m[2] = m[2].substring( 1, m[2].length - 1 ); - - var ref = attrs.references[ m[1].toLowerCase() ] = { - href: m[2] - }; - - if ( m[4] !== undefined ) - ref.title = m[4]; - else if ( m[5] !== undefined ) - ref.title = m[5]; - - } ); - - if ( b.length ) - next.unshift( mk_block( b, block.trailing ) ); - - return []; - }, - - para: function para( block, next ) { - // everything's a para! - return [ ["para"].concat( this.processInline( block ) ) ]; - } - } -}; - -Markdown.dialects.Gruber.inline = { - - __oneElement__: function oneElement( text, patterns_or_re, previous_nodes ) { - var m, - res, - lastIndex = 0; - - patterns_or_re = patterns_or_re || this.dialect.inline.__patterns__; - var re = new RegExp( "([\\s\\S]*?)(" + (patterns_or_re.source || patterns_or_re) + ")" ); - - m = re.exec( text ); - if (!m) { - // Just boring text - return [ text.length, text ]; - } - else if ( m[1] ) { - // Some un-interesting text matched. Return that first - return [ m[1].length, m[1] ]; - } - - var res; - if ( m[2] in this.dialect.inline ) { - res = this.dialect.inline[ m[2] ].call( - this, - text.substr( m.index ), m, previous_nodes || [] ); - } - // Default for now to make dev easier. just slurp special and output it. - res = res || [ m[2].length, m[2] ]; - return res; - }, - - __call__: function inline( text, patterns ) { - - var out = [], - res; - - function add(x) { - //D:self.debug(" adding output", uneval(x)); - if ( typeof x == "string" && typeof out[out.length-1] == "string" ) - out[ out.length-1 ] += x; - else - out.push(x); - } - - while ( text.length > 0 ) { - res = this.dialect.inline.__oneElement__.call(this, text, patterns, out ); - text = text.substr( res.shift() ); - forEach(res, add ) - } - - return out; - }, - - // These characters are intersting elsewhere, so have rules for them so that - // chunks of plain text blocks don't include them - "]": function () {}, - "}": function () {}, - - __escape__ : /^\\[\\`\*_{}\[\]()#\+.!\-]/, - - "\\": function escaped( text ) { - // [ length of input processed, node/children to add... ] - // Only esacape: \ ` * _ { } [ ] ( ) # * + - . ! - if ( this.dialect.inline.__escape__.exec( text ) ) - return [ 2, text.charAt( 1 ) ]; - else - // Not an esacpe - return [ 1, "\\" ]; - }, - - "![": function image( text ) { - - // Unlike images, alt text is plain text only. no other elements are - // allowed in there - - // ![Alt text](/path/to/img.jpg "Optional title") - // 1 2 3 4 <--- captures - var m = text.match( /^!\[(.*?)\][ \t]*\([ \t]*([^")]*?)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/ ); - - if ( m ) { - if ( m[2] && m[2][0] == "<" && m[2][m[2].length-1] == ">" ) - m[2] = m[2].substring( 1, m[2].length - 1 ); - - m[2] = this.dialect.inline.__call__.call( this, m[2], /\\/ )[0]; - - var attrs = { alt: m[1], href: m[2] || "" }; - if ( m[4] !== undefined) - attrs.title = m[4]; - - return [ m[0].length, [ "img", attrs ] ]; - } - - // ![Alt text][id] - m = text.match( /^!\[(.*?)\][ \t]*\[(.*?)\]/ ); - - if ( m ) { - // We can't check if the reference is known here as it likely wont be - // found till after. Check it in md tree->hmtl tree conversion - return [ m[0].length, [ "img_ref", { alt: m[1], ref: m[2].toLowerCase(), original: m[0] } ] ]; - } - - // Just consume the '![' - return [ 2, "![" ]; - }, - - "[": function link( text ) { - - var orig = String(text); - // Inline content is possible inside `link text` - var res = Markdown.DialectHelpers.inline_until_char.call( this, text.substr(1), "]" ); - - // No closing ']' found. Just consume the [ - if ( !res ) return [ 1, "[" ]; - - var consumed = 1 + res[ 0 ], - children = res[ 1 ], - link, - attrs; - - // At this point the first [...] has been parsed. See what follows to find - // out which kind of link we are (reference or direct url) - text = text.substr( consumed ); - - // [link text](/path/to/img.jpg "Optional title") - // 1 2 3 <--- captures - // This will capture up to the last paren in the block. We then pull - // back based on if there a matching ones in the url - // ([here](/url/(test)) - // The parens have to be balanced - var m = text.match( /^\s*\([ \t]*([^"']*)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/ ); - if ( m ) { - var url = m[1]; - consumed += m[0].length; - - if ( url && url[0] == "<" && url[url.length-1] == ">" ) - url = url.substring( 1, url.length - 1 ); - - // If there is a title we don't have to worry about parens in the url - if ( !m[3] ) { - var open_parens = 1; // One open that isn't in the capture - for ( var len = 0; len < url.length; len++ ) { - switch ( url[len] ) { - case "(": - open_parens++; - break; - case ")": - if ( --open_parens == 0) { - consumed -= url.length - len; - url = url.substring(0, len); - } - break; - } - } - } - - // Process escapes only - url = this.dialect.inline.__call__.call( this, url, /\\/ )[0]; - - attrs = { href: url || "" }; - if ( m[3] !== undefined) - attrs.title = m[3]; - - link = [ "link", attrs ].concat( children ); - return [ consumed, link ]; - } - - // [Alt text][id] - // [Alt text] [id] - m = text.match( /^\s*\[(.*?)\]/ ); - - if ( m ) { - - consumed += m[ 0 ].length; - - // [links][] uses links as its reference - attrs = { ref: ( m[ 1 ] || String(children) ).toLowerCase(), original: orig.substr( 0, consumed ) }; - - link = [ "link_ref", attrs ].concat( children ); - - // We can't check if the reference is known here as it likely wont be - // found till after. Check it in md tree->hmtl tree conversion. - // Store the original so that conversion can revert if the ref isn't found. - return [ consumed, link ]; - } - - // [id] - // Only if id is plain (no formatting.) - if ( children.length == 1 && typeof children[0] == "string" ) { - - attrs = { ref: children[0].toLowerCase(), original: orig.substr( 0, consumed ) }; - link = [ "link_ref", attrs, children[0] ]; - return [ consumed, link ]; - } - - // Just consume the "[" - return [ 1, "[" ]; - }, - - - "<": function autoLink( text ) { - var m; - - if ( ( m = text.match( /^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\.[a-zA-Z]+))>/ ) ) != null ) { - if ( m[3] ) { - return [ m[0].length, [ "link", { href: "mailto:" + m[3] }, m[3] ] ]; - - } - else if ( m[2] == "mailto" ) { - return [ m[0].length, [ "link", { href: m[1] }, m[1].substr("mailto:".length ) ] ]; - } - else - return [ m[0].length, [ "link", { href: m[1] }, m[1] ] ]; - } - - return [ 1, "<" ]; - }, - - "`": function inlineCode( text ) { - // Inline code block. as many backticks as you like to start it - // Always skip over the opening ticks. - var m = text.match( /(`+)(([\s\S]*?)\1)/ ); - - if ( m && m[2] ) - return [ m[1].length + m[2].length, [ "inlinecode", m[3] ] ]; - else { - // TODO: No matching end code found - warn! - return [ 1, "`" ]; - } - }, - - " \n": function lineBreak( text ) { - return [ 3, [ "linebreak" ] ]; - } - -}; - -// Meta Helper/generator method for em and strong handling -function strong_em( tag, md ) { - - var state_slot = tag + "_state", - other_slot = tag == "strong" ? "em_state" : "strong_state"; - - function CloseTag(len) { - this.len_after = len; - this.name = "close_" + md; - } - - return function ( text, orig_match ) { - - if ( this[state_slot][0] == md ) { - // Most recent em is of this type - //D:this.debug("closing", md); - this[state_slot].shift(); - - // "Consume" everything to go back to the recrusion in the else-block below - return[ text.length, new CloseTag(text.length-md.length) ]; - } - else { - // Store a clone of the em/strong states - var other = this[other_slot].slice(), - state = this[state_slot].slice(); - - this[state_slot].unshift(md); - - //D:this.debug_indent += " "; - - // Recurse - var res = this.processInline( text.substr( md.length ) ); - //D:this.debug_indent = this.debug_indent.substr(2); - - var last = res[res.length - 1]; - - //D:this.debug("processInline from", tag + ": ", uneval( res ) ); - - var check = this[state_slot].shift(); - if ( last instanceof CloseTag ) { - res.pop(); - // We matched! Huzzah. - var consumed = text.length - last.len_after; - return [ consumed, [ tag ].concat(res) ]; - } - else { - // Restore the state of the other kind. We might have mistakenly closed it. - this[other_slot] = other; - this[state_slot] = state; - - // We can't reuse the processed result as it could have wrong parsing contexts in it. - return [ md.length, md ]; - } - } - }; // End returned function -} - -Markdown.dialects.Gruber.inline["**"] = strong_em("strong", "**"); -Markdown.dialects.Gruber.inline["__"] = strong_em("strong", "__"); -Markdown.dialects.Gruber.inline["*"] = strong_em("em", "*"); -Markdown.dialects.Gruber.inline["_"] = strong_em("em", "_"); - - -// Build default order from insertion order. -Markdown.buildBlockOrder = function(d) { - var ord = []; - for ( var i in d ) { - if ( i == "__order__" || i == "__call__" ) continue; - ord.push( i ); - } - d.__order__ = ord; -}; - -// Build patterns for inline matcher -Markdown.buildInlinePatterns = function(d) { - var patterns = []; - - for ( var i in d ) { - // __foo__ is reserved and not a pattern - if ( i.match( /^__.*__$/) ) continue; - var l = i.replace( /([\\.*+?|()\[\]{}])/g, "\\$1" ) - .replace( /\n/, "\\n" ); - patterns.push( i.length == 1 ? l : "(?:" + l + ")" ); - } - - patterns = patterns.join("|"); - d.__patterns__ = patterns; - //print("patterns:", uneval( patterns ) ); - - var fn = d.__call__; - d.__call__ = function(text, pattern) { - if ( pattern != undefined ) { - return fn.call(this, text, pattern); - } - else - { - return fn.call(this, text, patterns); - } - }; -}; - -Markdown.DialectHelpers = {}; -Markdown.DialectHelpers.inline_until_char = function( text, want ) { - var consumed = 0, - nodes = []; - - while ( true ) { - if ( text.charAt( consumed ) == want ) { - // Found the character we were looking for - consumed++; - return [ consumed, nodes ]; - } - - if ( consumed >= text.length ) { - // No closing char found. Abort. - return null; - } - - var res = this.dialect.inline.__oneElement__.call(this, text.substr( consumed ) ); - consumed += res[ 0 ]; - // Add any returned nodes. - nodes.push.apply( nodes, res.slice( 1 ) ); - } -} - -// Helper function to make sub-classing a dialect easier -Markdown.subclassDialect = function( d ) { - function Block() {} - Block.prototype = d.block; - function Inline() {} - Inline.prototype = d.inline; - - return { block: new Block(), inline: new Inline() }; -}; - -Markdown.buildBlockOrder ( Markdown.dialects.Gruber.block ); -Markdown.buildInlinePatterns( Markdown.dialects.Gruber.inline ); - -Markdown.dialects.Maruku = Markdown.subclassDialect( Markdown.dialects.Gruber ); - -Markdown.dialects.Maruku.processMetaHash = function processMetaHash( meta_string ) { - var meta = split_meta_hash( meta_string ), - attr = {}; - - for ( var i = 0; i < meta.length; ++i ) { - // id: #foo - if ( /^#/.test( meta[ i ] ) ) { - attr.id = meta[ i ].substring( 1 ); - } - // class: .foo - else if ( /^\./.test( meta[ i ] ) ) { - // if class already exists, append the new one - if ( attr["class"] ) { - attr["class"] = attr["class"] + meta[ i ].replace( /./, " " ); - } - else { - attr["class"] = meta[ i ].substring( 1 ); - } - } - // attribute: foo=bar - else if ( /\=/.test( meta[ i ] ) ) { - var s = meta[ i ].split( /\=/ ); - attr[ s[ 0 ] ] = s[ 1 ]; - } - } - - return attr; -} - -function split_meta_hash( meta_string ) { - var meta = meta_string.split( "" ), - parts = [ "" ], - in_quotes = false; - - while ( meta.length ) { - var letter = meta.shift(); - switch ( letter ) { - case " " : - // if we're in a quoted section, keep it - if ( in_quotes ) { - parts[ parts.length - 1 ] += letter; - } - // otherwise make a new part - else { - parts.push( "" ); - } - break; - case "'" : - case '"' : - // reverse the quotes and move straight on - in_quotes = !in_quotes; - break; - case "\\" : - // shift off the next letter to be used straight away. - // it was escaped so we'll keep it whatever it is - letter = meta.shift(); - default : - parts[ parts.length - 1 ] += letter; - break; - } - } - - return parts; -} - -Markdown.dialects.Maruku.block.document_meta = function document_meta( block, next ) { - // we're only interested in the first block - if ( block.lineNumber > 1 ) return undefined; - - // document_meta blocks consist of one or more lines of `Key: Value\n` - if ( ! block.match( /^(?:\w+:.*\n)*\w+:.*$/ ) ) return undefined; - - // make an attribute node if it doesn't exist - if ( !extract_attr( this.tree ) ) { - this.tree.splice( 1, 0, {} ); - } - - var pairs = block.split( /\n/ ); - for ( p in pairs ) { - var m = pairs[ p ].match( /(\w+):\s*(.*)$/ ), - key = m[ 1 ].toLowerCase(), - value = m[ 2 ]; - - this.tree[ 1 ][ key ] = value; - } - - // document_meta produces no content! - return []; -}; - -Markdown.dialects.Maruku.block.block_meta = function block_meta( block, next ) { - // check if the last line of the block is an meta hash - var m = block.match( /(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/ ); - if ( !m ) return undefined; - - // process the meta hash - var attr = this.dialect.processMetaHash( m[ 2 ] ); - - var hash; - - // if we matched ^ then we need to apply meta to the previous block - if ( m[ 1 ] === "" ) { - var node = this.tree[ this.tree.length - 1 ]; - hash = extract_attr( node ); - - // if the node is a string (rather than JsonML), bail - if ( typeof node === "string" ) return undefined; - - // create the attribute hash if it doesn't exist - if ( !hash ) { - hash = {}; - node.splice( 1, 0, hash ); - } - - // add the attributes in - for ( a in attr ) { - hash[ a ] = attr[ a ]; - } - - // return nothing so the meta hash is removed - return []; - } - - // pull the meta hash off the block and process what's left - var b = block.replace( /\n.*$/, "" ), - result = this.processBlock( b, [] ); - - // get or make the attributes hash - hash = extract_attr( result[ 0 ] ); - if ( !hash ) { - hash = {}; - result[ 0 ].splice( 1, 0, hash ); - } - - // attach the attributes to the block - for ( a in attr ) { - hash[ a ] = attr[ a ]; - } - - return result; -}; - -Markdown.dialects.Maruku.block.definition_list = function definition_list( block, next ) { - // one or more terms followed by one or more definitions, in a single block - var tight = /^((?:[^\s:].*\n)+):\s+([\s\S]+)$/, - list = [ "dl" ], - i, m; - - // see if we're dealing with a tight or loose block - if ( ( m = block.match( tight ) ) ) { - // pull subsequent tight DL blocks out of `next` - var blocks = [ block ]; - while ( next.length && tight.exec( next[ 0 ] ) ) { - blocks.push( next.shift() ); - } - - for ( var b = 0; b < blocks.length; ++b ) { - var m = blocks[ b ].match( tight ), - terms = m[ 1 ].replace( /\n$/, "" ).split( /\n/ ), - defns = m[ 2 ].split( /\n:\s+/ ); - - // print( uneval( m ) ); - - for ( i = 0; i < terms.length; ++i ) { - list.push( [ "dt", terms[ i ] ] ); - } - - for ( i = 0; i < defns.length; ++i ) { - // run inline processing over the definition - list.push( [ "dd" ].concat( this.processInline( defns[ i ].replace( /(\n)\s+/, "$1" ) ) ) ); - } - } - } - else { - return undefined; - } - - return [ list ]; -}; - -// splits on unescaped instances of @ch. If @ch is not a character the result -// can be unpredictable - -Markdown.dialects.Maruku.block.table = function table (block, next) { - - var _split_on_unescaped = function(s, ch) { - ch = ch || '\\s'; - if (ch.match(/^[\\|\[\]{}?*.+^$]$/)) { ch = '\\' + ch; } - var res = [ ], - r = new RegExp('^((?:\\\\.|[^\\\\' + ch + '])*)' + ch + '(.*)'), - m; - while(m = s.match(r)) { - res.push(m[1]); - s = m[2]; - } - res.push(s); - return res; - } - - var leading_pipe = /^ {0,3}\|(.+)\n {0,3}\|\s*([\-:]+[\-| :]*)\n((?:\s*\|.*(?:\n|$))*)(?=\n|$)/, - // find at least an unescaped pipe in each line - no_leading_pipe = /^ {0,3}(\S(?:\\.|[^\\|])*\|.*)\n {0,3}([\-:]+\s*\|[\-| :]*)\n((?:(?:\\.|[^\\|])*\|.*(?:\n|$))*)(?=\n|$)/, - i, m; - if (m = block.match(leading_pipe)) { - // remove leading pipes in contents - // (header and horizontal rule already have the leading pipe left out) - m[3] = m[3].replace(/^\s*\|/gm, ''); - } else if (! ( m = block.match(no_leading_pipe))) { - return undefined; - } - - var table = [ "table", [ "thead", [ "tr" ] ], [ "tbody" ] ]; - - // remove trailing pipes, then split on pipes - // (no escaped pipes are allowed in horizontal rule) - m[2] = m[2].replace(/\|\s*$/, '').split('|'); - - // process alignment - var html_attrs = [ ]; - forEach (m[2], function (s) { - if (s.match(/^\s*-+:\s*$/)) html_attrs.push({align: "right"}); - else if (s.match(/^\s*:-+\s*$/)) html_attrs.push({align: "left"}); - else if (s.match(/^\s*:-+:\s*$/)) html_attrs.push({align: "center"}); - else html_attrs.push({}); - }); - - // now for the header, avoid escaped pipes - m[1] = _split_on_unescaped(m[1].replace(/\|\s*$/, ''), '|'); - for (i = 0; i < m[1].length; i++) { - table[1][1].push(['th', html_attrs[i] || {}].concat( - this.processInline(m[1][i].trim()))); - } - - // now for body contents - forEach (m[3].replace(/\|\s*$/mg, '').split('\n'), function (row) { - var html_row = ['tr']; - row = _split_on_unescaped(row, '|'); - for (i = 0; i < row.length; i++) { - html_row.push(['td', html_attrs[i] || {}].concat(this.processInline(row[i].trim()))); - } - table[2].push(html_row); - }, this); - - return [table]; -} - -Markdown.dialects.Maruku.inline[ "{:" ] = function inline_meta( text, matches, out ) { - if ( !out.length ) { - return [ 2, "{:" ]; - } - - // get the preceeding element - var before = out[ out.length - 1 ]; - - if ( typeof before === "string" ) { - return [ 2, "{:" ]; - } - - // match a meta hash - var m = text.match( /^\{:\s*((?:\\\}|[^\}])*)\s*\}/ ); - - // no match, false alarm - if ( !m ) { - return [ 2, "{:" ]; - } - - // attach the attributes to the preceeding element - var meta = this.dialect.processMetaHash( m[ 1 ] ), - attr = extract_attr( before ); - - if ( !attr ) { - attr = {}; - before.splice( 1, 0, attr ); - } - - for ( var k in meta ) { - attr[ k ] = meta[ k ]; - } - - // cut out the string and replace it with nothing - return [ m[ 0 ].length, "" ]; -}; - -Markdown.dialects.Maruku.inline.__escape__ = /^\\[\\`\*_{}\[\]()#\+.!\-|:]/; - -Markdown.buildBlockOrder ( Markdown.dialects.Maruku.block ); -Markdown.buildInlinePatterns( Markdown.dialects.Maruku.inline ); - -var isArray = Array.isArray || function(obj) { - return Object.prototype.toString.call(obj) == "[object Array]"; -}; - -var forEach; -// Don't mess with Array.prototype. Its not friendly -if ( Array.prototype.forEach ) { - forEach = function( arr, cb, thisp ) { - return arr.forEach( cb, thisp ); - }; -} -else { - forEach = function(arr, cb, thisp) { - for (var i = 0; i < arr.length; i++) { - cb.call(thisp || arr, arr[i], i, arr); - } - } -} - -var isEmpty = function( obj ) { - for ( var key in obj ) { - if ( hasOwnProperty.call( obj, key ) ) { - return false; - } - } - - return true; -} - -function extract_attr( jsonml ) { - return isArray(jsonml) - && jsonml.length > 1 - && typeof jsonml[ 1 ] === "object" - && !( isArray(jsonml[ 1 ]) ) - ? jsonml[ 1 ] - : undefined; -} - - - -/** - * renderJsonML( jsonml[, options] ) -> String - * - jsonml (Array): JsonML array to render to XML - * - options (Object): options - * - * Converts the given JsonML into well-formed XML. - * - * The options currently understood are: - * - * - root (Boolean): wether or not the root node should be included in the - * output, or just its children. The default `false` is to not include the - * root itself. - */ -expose.renderJsonML = function( jsonml, options ) { - options = options || {}; - // include the root element in the rendered output? - options.root = options.root || false; - - var content = []; - - if ( options.root ) { - content.push( render_tree( jsonml ) ); - } - else { - jsonml.shift(); // get rid of the tag - if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) { - jsonml.shift(); // get rid of the attributes - } - - while ( jsonml.length ) { - content.push( render_tree( jsonml.shift() ) ); - } - } - - return content.join( "\n\n" ); -}; - -function escapeHTML( text ) { - return text.replace( /&/g, "&" ) - .replace( /</g, "<" ) - .replace( />/g, ">" ) - .replace( /"/g, """ ) - .replace( /'/g, "'" ); -} - -function render_tree( jsonml ) { - // basic case - if ( typeof jsonml === "string" ) { - return escapeHTML( jsonml ); - } - - var tag = jsonml.shift(), - attributes = {}, - content = []; - - if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) { - attributes = jsonml.shift(); - } - - while ( jsonml.length ) { - content.push( render_tree( jsonml.shift() ) ); - } - - var tag_attrs = ""; - for ( var a in attributes ) { - tag_attrs += " " + a + '="' + escapeHTML( attributes[ a ] ) + '"'; - } - - // be careful about adding whitespace here for inline elements - if ( tag == "img" || tag == "br" || tag == "hr" ) { - return "<"+ tag + tag_attrs + "/>"; - } - else { - return "<"+ tag + tag_attrs + ">" + content.join( "" ) + "</" + tag + ">"; - } -} - -function convert_tree_to_html( tree, references, options ) { - var i; - options = options || {}; - - // shallow clone - var jsonml = tree.slice( 0 ); - - if ( typeof options.preprocessTreeNode === "function" ) { - jsonml = options.preprocessTreeNode(jsonml, references); - } - - // Clone attributes if they exist - var attrs = extract_attr( jsonml ); - if ( attrs ) { - jsonml[ 1 ] = {}; - for ( i in attrs ) { - jsonml[ 1 ][ i ] = attrs[ i ]; - } - attrs = jsonml[ 1 ]; - } - - // basic case - if ( typeof jsonml === "string" ) { - return jsonml; - } - - // convert this node - switch ( jsonml[ 0 ] ) { - case "header": - jsonml[ 0 ] = "h" + jsonml[ 1 ].level; - delete jsonml[ 1 ].level; - break; - case "bulletlist": - jsonml[ 0 ] = "ul"; - break; - case "numberlist": - jsonml[ 0 ] = "ol"; - break; - case "listitem": - jsonml[ 0 ] = "li"; - break; - case "para": - jsonml[ 0 ] = "p"; - break; - case "markdown": - jsonml[ 0 ] = "html"; - if ( attrs ) delete attrs.references; - break; - case "code_block": - jsonml[ 0 ] = "pre"; - i = attrs ? 2 : 1; - var code = [ "code" ]; - code.push.apply( code, jsonml.splice( i, jsonml.length - i ) ); - jsonml[ i ] = code; - break; - case "inlinecode": - jsonml[ 0 ] = "code"; - break; - case "img": - jsonml[ 1 ].src = jsonml[ 1 ].href; - delete jsonml[ 1 ].href; - break; - case "linebreak": - jsonml[ 0 ] = "br"; - break; - case "link": - jsonml[ 0 ] = "a"; - break; - case "link_ref": - jsonml[ 0 ] = "a"; - - // grab this ref and clean up the attribute node - var ref = references[ attrs.ref ]; - - // if the reference exists, make the link - if ( ref ) { - delete attrs.ref; - - // add in the href and title, if present - attrs.href = ref.href; - if ( ref.title ) { - attrs.title = ref.title; - } - - // get rid of the unneeded original text - delete attrs.original; - } - // the reference doesn't exist, so revert to plain text - else { - return attrs.original; - } - break; - case "img_ref": - jsonml[ 0 ] = "img"; - - // grab this ref and clean up the attribute node - var ref = references[ attrs.ref ]; - - // if the reference exists, make the link - if ( ref ) { - delete attrs.ref; - - // add in the href and title, if present - attrs.src = ref.href; - if ( ref.title ) { - attrs.title = ref.title; - } - - // get rid of the unneeded original text - delete attrs.original; - } - // the reference doesn't exist, so revert to plain text - else { - return attrs.original; - } - break; - } - - // convert all the children - i = 1; - - // deal with the attribute node, if it exists - if ( attrs ) { - // if there are keys, skip over it - for ( var key in jsonml[ 1 ] ) { - i = 2; - break; - } - // if there aren't, remove it - if ( i === 1 ) { - jsonml.splice( i, 1 ); - } - } - - for ( ; i < jsonml.length; ++i ) { - jsonml[ i ] = convert_tree_to_html( jsonml[ i ], references, options ); - } - - return jsonml; -} - - -// merges adjacent text nodes into a single node -function merge_text_nodes( jsonml ) { - // skip the tag name and attribute hash - var i = extract_attr( jsonml ) ? 2 : 1; - - while ( i < jsonml.length ) { - // if it's a string check the next item too - if ( typeof jsonml[ i ] === "string" ) { - if ( i + 1 < jsonml.length && typeof jsonml[ i + 1 ] === "string" ) { - // merge the second string into the first and remove it - jsonml[ i ] += jsonml.splice( i + 1, 1 )[ 0 ]; - } - else { - ++i; - } - } - // if it's not a string recurse - else { - merge_text_nodes( jsonml[ i ] ); - ++i; - } - } -} - -} )( (function() { - if ( typeof exports === "undefined" ) { - window.markdown = {}; - return window.markdown; - } - else { - return exports; - } -} )() ); diff --git a/plugins/tiddlywiki/markdown/files/remarkable.js b/plugins/tiddlywiki/markdown/files/remarkable.js new file mode 100644 index 000000000..cebb38f56 --- /dev/null +++ b/plugins/tiddlywiki/markdown/files/remarkable.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).remarkable={})}(this,function(e){"use strict";var t={Aacute:"Á",aacute:"á",Abreve:"Ă",abreve:"ă",ac:"∾",acd:"∿",acE:"∾̳",Acirc:"Â",acirc:"â",acute:"´",Acy:"А",acy:"а",AElig:"Æ",aelig:"æ",af:"⁡",Afr:"𝔄",afr:"𝔞",Agrave:"À",agrave:"à",alefsym:"ℵ",aleph:"ℵ",Alpha:"Α",alpha:"α",Amacr:"Ā",amacr:"ā",amalg:"⨿",AMP:"&",amp:"&",And:"⩓",and:"∧",andand:"⩕",andd:"⩜",andslope:"⩘",andv:"⩚",ang:"∠",ange:"⦤",angle:"∠",angmsd:"∡",angmsdaa:"⦨",angmsdab:"⦩",angmsdac:"⦪",angmsdad:"⦫",angmsdae:"⦬",angmsdaf:"⦭",angmsdag:"⦮",angmsdah:"⦯",angrt:"∟",angrtvb:"⊾",angrtvbd:"⦝",angsph:"∢",angst:"Å",angzarr:"⍼",Aogon:"Ą",aogon:"ą",Aopf:"𝔸",aopf:"𝕒",ap:"≈",apacir:"⩯",apE:"⩰",ape:"≊",apid:"≋",apos:"'",ApplyFunction:"⁡",approx:"≈",approxeq:"≊",Aring:"Å",aring:"å",Ascr:"𝒜",ascr:"𝒶",Assign:"≔",ast:"*",asymp:"≈",asympeq:"≍",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",awconint:"∳",awint:"⨑",backcong:"≌",backepsilon:"϶",backprime:"‵",backsim:"∽",backsimeq:"⋍",Backslash:"∖",Barv:"⫧",barvee:"⊽",Barwed:"⌆",barwed:"⌅",barwedge:"⌅",bbrk:"⎵",bbrktbrk:"⎶",bcong:"≌",Bcy:"Б",bcy:"б",bdquo:"„",becaus:"∵",Because:"∵",because:"∵",bemptyv:"⦰",bepsi:"϶",bernou:"ℬ",Bernoullis:"ℬ",Beta:"Β",beta:"β",beth:"ℶ",between:"≬",Bfr:"𝔅",bfr:"𝔟",bigcap:"⋂",bigcirc:"◯",bigcup:"⋃",bigodot:"⨀",bigoplus:"⨁",bigotimes:"⨂",bigsqcup:"⨆",bigstar:"★",bigtriangledown:"▽",bigtriangleup:"△",biguplus:"⨄",bigvee:"⋁",bigwedge:"⋀",bkarow:"⤍",blacklozenge:"⧫",blacksquare:"▪",blacktriangle:"▴",blacktriangledown:"▾",blacktriangleleft:"◂",blacktriangleright:"▸",blank:"␣",blk12:"▒",blk14:"░",blk34:"▓",block:"█",bne:"=⃥",bnequiv:"≡⃥",bNot:"⫭",bnot:"⌐",Bopf:"𝔹",bopf:"𝕓",bot:"⊥",bottom:"⊥",bowtie:"⋈",boxbox:"⧉",boxDL:"╗",boxDl:"╖",boxdL:"╕",boxdl:"┐",boxDR:"╔",boxDr:"╓",boxdR:"╒",boxdr:"┌",boxH:"═",boxh:"─",boxHD:"╦",boxHd:"╤",boxhD:"╥",boxhd:"┬",boxHU:"╩",boxHu:"╧",boxhU:"╨",boxhu:"┴",boxminus:"⊟",boxplus:"⊞",boxtimes:"⊠",boxUL:"╝",boxUl:"╜",boxuL:"╛",boxul:"┘",boxUR:"╚",boxUr:"╙",boxuR:"╘",boxur:"└",boxV:"║",boxv:"│",boxVH:"╬",boxVh:"╫",boxvH:"╪",boxvh:"┼",boxVL:"╣",boxVl:"╢",boxvL:"╡",boxvl:"┤",boxVR:"╠",boxVr:"╟",boxvR:"╞",boxvr:"├",bprime:"‵",Breve:"˘",breve:"˘",brvbar:"¦",Bscr:"ℬ",bscr:"𝒷",bsemi:"⁏",bsim:"∽",bsime:"⋍",bsol:"\\",bsolb:"⧅",bsolhsub:"⟈",bull:"•",bullet:"•",bump:"≎",bumpE:"⪮",bumpe:"≏",Bumpeq:"≎",bumpeq:"≏",Cacute:"Ć",cacute:"ć",Cap:"⋒",cap:"∩",capand:"⩄",capbrcup:"⩉",capcap:"⩋",capcup:"⩇",capdot:"⩀",CapitalDifferentialD:"ⅅ",caps:"∩︀",caret:"⁁",caron:"ˇ",Cayleys:"ℭ",ccaps:"⩍",Ccaron:"Č",ccaron:"č",Ccedil:"Ç",ccedil:"ç",Ccirc:"Ĉ",ccirc:"ĉ",Cconint:"∰",ccups:"⩌",ccupssm:"⩐",Cdot:"Ċ",cdot:"ċ",cedil:"¸",Cedilla:"¸",cemptyv:"⦲",cent:"¢",CenterDot:"·",centerdot:"·",Cfr:"ℭ",cfr:"𝔠",CHcy:"Ч",chcy:"ч",check:"✓",checkmark:"✓",Chi:"Χ",chi:"χ",cir:"○",circ:"ˆ",circeq:"≗",circlearrowleft:"↺",circlearrowright:"↻",circledast:"⊛",circledcirc:"⊚",circleddash:"⊝",CircleDot:"⊙",circledR:"®",circledS:"Ⓢ",CircleMinus:"⊖",CirclePlus:"⊕",CircleTimes:"⊗",cirE:"⧃",cire:"≗",cirfnint:"⨐",cirmid:"⫯",cirscir:"⧂",ClockwiseContourIntegral:"∲",CloseCurlyDoubleQuote:"”",CloseCurlyQuote:"’",clubs:"♣",clubsuit:"♣",Colon:"∷",colon:":",Colone:"⩴",colone:"≔",coloneq:"≔",comma:",",commat:"@",comp:"∁",compfn:"∘",complement:"∁",complexes:"ℂ",cong:"≅",congdot:"⩭",Congruent:"≡",Conint:"∯",conint:"∮",ContourIntegral:"∮",Copf:"ℂ",copf:"𝕔",coprod:"∐",Coproduct:"∐",COPY:"©",copy:"©",copysr:"℗",CounterClockwiseContourIntegral:"∳",crarr:"↵",Cross:"⨯",cross:"✗",Cscr:"𝒞",cscr:"𝒸",csub:"⫏",csube:"⫑",csup:"⫐",csupe:"⫒",ctdot:"⋯",cudarrl:"⤸",cudarrr:"⤵",cuepr:"⋞",cuesc:"⋟",cularr:"↶",cularrp:"⤽",Cup:"⋓",cup:"∪",cupbrcap:"⩈",CupCap:"≍",cupcap:"⩆",cupcup:"⩊",cupdot:"⊍",cupor:"⩅",cups:"∪︀",curarr:"↷",curarrm:"⤼",curlyeqprec:"⋞",curlyeqsucc:"⋟",curlyvee:"⋎",curlywedge:"⋏",curren:"¤",curvearrowleft:"↶",curvearrowright:"↷",cuvee:"⋎",cuwed:"⋏",cwconint:"∲",cwint:"∱",cylcty:"⌭",Dagger:"‡",dagger:"†",daleth:"ℸ",Darr:"↡",dArr:"⇓",darr:"↓",dash:"‐",Dashv:"⫤",dashv:"⊣",dbkarow:"⤏",dblac:"˝",Dcaron:"Ď",dcaron:"ď",Dcy:"Д",dcy:"д",DD:"ⅅ",dd:"ⅆ",ddagger:"‡",ddarr:"⇊",DDotrahd:"⤑",ddotseq:"⩷",deg:"°",Del:"∇",Delta:"Δ",delta:"δ",demptyv:"⦱",dfisht:"⥿",Dfr:"𝔇",dfr:"𝔡",dHar:"⥥",dharl:"⇃",dharr:"⇂",DiacriticalAcute:"´",DiacriticalDot:"˙",DiacriticalDoubleAcute:"˝",DiacriticalGrave:"`",DiacriticalTilde:"˜",diam:"⋄",Diamond:"⋄",diamond:"⋄",diamondsuit:"♦",diams:"♦",die:"¨",DifferentialD:"ⅆ",digamma:"ϝ",disin:"⋲",div:"÷",divide:"÷",divideontimes:"⋇",divonx:"⋇",DJcy:"Ђ",djcy:"ђ",dlcorn:"⌞",dlcrop:"⌍",dollar:"$",Dopf:"𝔻",dopf:"𝕕",Dot:"¨",dot:"˙",DotDot:"⃜",doteq:"≐",doteqdot:"≑",DotEqual:"≐",dotminus:"∸",dotplus:"∔",dotsquare:"⊡",doublebarwedge:"⌆",DoubleContourIntegral:"∯",DoubleDot:"¨",DoubleDownArrow:"⇓",DoubleLeftArrow:"⇐",DoubleLeftRightArrow:"⇔",DoubleLeftTee:"⫤",DoubleLongLeftArrow:"⟸",DoubleLongLeftRightArrow:"⟺",DoubleLongRightArrow:"⟹",DoubleRightArrow:"⇒",DoubleRightTee:"⊨",DoubleUpArrow:"⇑",DoubleUpDownArrow:"⇕",DoubleVerticalBar:"∥",DownArrow:"↓",Downarrow:"⇓",downarrow:"↓",DownArrowBar:"⤓",DownArrowUpArrow:"⇵",DownBreve:"̑",downdownarrows:"⇊",downharpoonleft:"⇃",downharpoonright:"⇂",DownLeftRightVector:"⥐",DownLeftTeeVector:"⥞",DownLeftVector:"↽",DownLeftVectorBar:"⥖",DownRightTeeVector:"⥟",DownRightVector:"⇁",DownRightVectorBar:"⥗",DownTee:"⊤",DownTeeArrow:"↧",drbkarow:"⤐",drcorn:"⌟",drcrop:"⌌",Dscr:"𝒟",dscr:"𝒹",DScy:"Ѕ",dscy:"ѕ",dsol:"⧶",Dstrok:"Đ",dstrok:"đ",dtdot:"⋱",dtri:"▿",dtrif:"▾",duarr:"⇵",duhar:"⥯",dwangle:"⦦",DZcy:"Џ",dzcy:"џ",dzigrarr:"⟿",Eacute:"É",eacute:"é",easter:"⩮",Ecaron:"Ě",ecaron:"ě",ecir:"≖",Ecirc:"Ê",ecirc:"ê",ecolon:"≕",Ecy:"Э",ecy:"э",eDDot:"⩷",Edot:"Ė",eDot:"≑",edot:"ė",ee:"ⅇ",efDot:"≒",Efr:"𝔈",efr:"𝔢",eg:"⪚",Egrave:"È",egrave:"è",egs:"⪖",egsdot:"⪘",el:"⪙",Element:"∈",elinters:"⏧",ell:"ℓ",els:"⪕",elsdot:"⪗",Emacr:"Ē",emacr:"ē",empty:"∅",emptyset:"∅",EmptySmallSquare:"◻",emptyv:"∅",EmptyVerySmallSquare:"▫",emsp:" ",emsp13:" ",emsp14:" ",ENG:"Ŋ",eng:"ŋ",ensp:" ",Eogon:"Ę",eogon:"ę",Eopf:"𝔼",eopf:"𝕖",epar:"⋕",eparsl:"⧣",eplus:"⩱",epsi:"ε",Epsilon:"Ε",epsilon:"ε",epsiv:"ϵ",eqcirc:"≖",eqcolon:"≕",eqsim:"≂",eqslantgtr:"⪖",eqslantless:"⪕",Equal:"⩵",equals:"=",EqualTilde:"≂",equest:"≟",Equilibrium:"⇌",equiv:"≡",equivDD:"⩸",eqvparsl:"⧥",erarr:"⥱",erDot:"≓",Escr:"ℰ",escr:"ℯ",esdot:"≐",Esim:"⩳",esim:"≂",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",excl:"!",exist:"∃",Exists:"∃",expectation:"ℰ",ExponentialE:"ⅇ",exponentiale:"ⅇ",fallingdotseq:"≒",Fcy:"Ф",fcy:"ф",female:"♀",ffilig:"ffi",fflig:"ff",ffllig:"ffl",Ffr:"𝔉",ffr:"𝔣",filig:"fi",FilledSmallSquare:"◼",FilledVerySmallSquare:"▪",fjlig:"fj",flat:"♭",fllig:"fl",fltns:"▱",fnof:"ƒ",Fopf:"𝔽",fopf:"𝕗",ForAll:"∀",forall:"∀",fork:"⋔",forkv:"⫙",Fouriertrf:"ℱ",fpartint:"⨍",frac12:"½",frac13:"⅓",frac14:"¼",frac15:"⅕",frac16:"⅙",frac18:"⅛",frac23:"⅔",frac25:"⅖",frac34:"¾",frac35:"⅗",frac38:"⅜",frac45:"⅘",frac56:"⅚",frac58:"⅝",frac78:"⅞",frasl:"⁄",frown:"⌢",Fscr:"ℱ",fscr:"𝒻",gacute:"ǵ",Gamma:"Γ",gamma:"γ",Gammad:"Ϝ",gammad:"ϝ",gap:"⪆",Gbreve:"Ğ",gbreve:"ğ",Gcedil:"Ģ",Gcirc:"Ĝ",gcirc:"ĝ",Gcy:"Г",gcy:"г",Gdot:"Ġ",gdot:"ġ",gE:"≧",ge:"≥",gEl:"⪌",gel:"⋛",geq:"≥",geqq:"≧",geqslant:"⩾",ges:"⩾",gescc:"⪩",gesdot:"⪀",gesdoto:"⪂",gesdotol:"⪄",gesl:"⋛︀",gesles:"⪔",Gfr:"𝔊",gfr:"𝔤",Gg:"⋙",gg:"≫",ggg:"⋙",gimel:"ℷ",GJcy:"Ѓ",gjcy:"ѓ",gl:"≷",gla:"⪥",glE:"⪒",glj:"⪤",gnap:"⪊",gnapprox:"⪊",gnE:"≩",gne:"⪈",gneq:"⪈",gneqq:"≩",gnsim:"⋧",Gopf:"𝔾",gopf:"𝕘",grave:"`",GreaterEqual:"≥",GreaterEqualLess:"⋛",GreaterFullEqual:"≧",GreaterGreater:"⪢",GreaterLess:"≷",GreaterSlantEqual:"⩾",GreaterTilde:"≳",Gscr:"𝒢",gscr:"ℊ",gsim:"≳",gsime:"⪎",gsiml:"⪐",GT:">",Gt:"≫",gt:">",gtcc:"⪧",gtcir:"⩺",gtdot:"⋗",gtlPar:"⦕",gtquest:"⩼",gtrapprox:"⪆",gtrarr:"⥸",gtrdot:"⋗",gtreqless:"⋛",gtreqqless:"⪌",gtrless:"≷",gtrsim:"≳",gvertneqq:"≩︀",gvnE:"≩︀",Hacek:"ˇ",hairsp:" ",half:"½",hamilt:"ℋ",HARDcy:"Ъ",hardcy:"ъ",hArr:"⇔",harr:"↔",harrcir:"⥈",harrw:"↭",Hat:"^",hbar:"ℏ",Hcirc:"Ĥ",hcirc:"ĥ",hearts:"♥",heartsuit:"♥",hellip:"…",hercon:"⊹",Hfr:"ℌ",hfr:"𝔥",HilbertSpace:"ℋ",hksearow:"⤥",hkswarow:"⤦",hoarr:"⇿",homtht:"∻",hookleftarrow:"↩",hookrightarrow:"↪",Hopf:"ℍ",hopf:"𝕙",horbar:"―",HorizontalLine:"─",Hscr:"ℋ",hscr:"𝒽",hslash:"ℏ",Hstrok:"Ħ",hstrok:"ħ",HumpDownHump:"≎",HumpEqual:"≏",hybull:"⁃",hyphen:"‐",Iacute:"Í",iacute:"í",ic:"⁣",Icirc:"Î",icirc:"î",Icy:"И",icy:"и",Idot:"İ",IEcy:"Е",iecy:"е",iexcl:"¡",iff:"⇔",Ifr:"ℑ",ifr:"𝔦",Igrave:"Ì",igrave:"ì",ii:"ⅈ",iiiint:"⨌",iiint:"∭",iinfin:"⧜",iiota:"℩",IJlig:"IJ",ijlig:"ij",Im:"ℑ",Imacr:"Ī",imacr:"ī",image:"ℑ",ImaginaryI:"ⅈ",imagline:"ℐ",imagpart:"ℑ",imath:"ı",imof:"⊷",imped:"Ƶ",Implies:"⇒",in:"∈",incare:"℅",infin:"∞",infintie:"⧝",inodot:"ı",Int:"∬",int:"∫",intcal:"⊺",integers:"ℤ",Integral:"∫",intercal:"⊺",Intersection:"⋂",intlarhk:"⨗",intprod:"⨼",InvisibleComma:"⁣",InvisibleTimes:"⁢",IOcy:"Ё",iocy:"ё",Iogon:"Į",iogon:"į",Iopf:"𝕀",iopf:"𝕚",Iota:"Ι",iota:"ι",iprod:"⨼",iquest:"¿",Iscr:"ℐ",iscr:"𝒾",isin:"∈",isindot:"⋵",isinE:"⋹",isins:"⋴",isinsv:"⋳",isinv:"∈",it:"⁢",Itilde:"Ĩ",itilde:"ĩ",Iukcy:"І",iukcy:"і",Iuml:"Ï",iuml:"ï",Jcirc:"Ĵ",jcirc:"ĵ",Jcy:"Й",jcy:"й",Jfr:"𝔍",jfr:"𝔧",jmath:"ȷ",Jopf:"𝕁",jopf:"𝕛",Jscr:"𝒥",jscr:"𝒿",Jsercy:"Ј",jsercy:"ј",Jukcy:"Є",jukcy:"є",Kappa:"Κ",kappa:"κ",kappav:"ϰ",Kcedil:"Ķ",kcedil:"ķ",Kcy:"К",kcy:"к",Kfr:"𝔎",kfr:"𝔨",kgreen:"ĸ",KHcy:"Х",khcy:"х",KJcy:"Ќ",kjcy:"ќ",Kopf:"𝕂",kopf:"𝕜",Kscr:"𝒦",kscr:"𝓀",lAarr:"⇚",Lacute:"Ĺ",lacute:"ĺ",laemptyv:"⦴",lagran:"ℒ",Lambda:"Λ",lambda:"λ",Lang:"⟪",lang:"⟨",langd:"⦑",langle:"⟨",lap:"⪅",Laplacetrf:"ℒ",laquo:"«",Larr:"↞",lArr:"⇐",larr:"←",larrb:"⇤",larrbfs:"⤟",larrfs:"⤝",larrhk:"↩",larrlp:"↫",larrpl:"⤹",larrsim:"⥳",larrtl:"↢",lat:"⪫",lAtail:"⤛",latail:"⤙",late:"⪭",lates:"⪭︀",lBarr:"⤎",lbarr:"⤌",lbbrk:"❲",lbrace:"{",lbrack:"[",lbrke:"⦋",lbrksld:"⦏",lbrkslu:"⦍",Lcaron:"Ľ",lcaron:"ľ",Lcedil:"Ļ",lcedil:"ļ",lceil:"⌈",lcub:"{",Lcy:"Л",lcy:"л",ldca:"⤶",ldquo:"“",ldquor:"„",ldrdhar:"⥧",ldrushar:"⥋",ldsh:"↲",lE:"≦",le:"≤",LeftAngleBracket:"⟨",LeftArrow:"←",Leftarrow:"⇐",leftarrow:"←",LeftArrowBar:"⇤",LeftArrowRightArrow:"⇆",leftarrowtail:"↢",LeftCeiling:"⌈",LeftDoubleBracket:"⟦",LeftDownTeeVector:"⥡",LeftDownVector:"⇃",LeftDownVectorBar:"⥙",LeftFloor:"⌊",leftharpoondown:"↽",leftharpoonup:"↼",leftleftarrows:"⇇",LeftRightArrow:"↔",Leftrightarrow:"⇔",leftrightarrow:"↔",leftrightarrows:"⇆",leftrightharpoons:"⇋",leftrightsquigarrow:"↭",LeftRightVector:"⥎",LeftTee:"⊣",LeftTeeArrow:"↤",LeftTeeVector:"⥚",leftthreetimes:"⋋",LeftTriangle:"⊲",LeftTriangleBar:"⧏",LeftTriangleEqual:"⊴",LeftUpDownVector:"⥑",LeftUpTeeVector:"⥠",LeftUpVector:"↿",LeftUpVectorBar:"⥘",LeftVector:"↼",LeftVectorBar:"⥒",lEg:"⪋",leg:"⋚",leq:"≤",leqq:"≦",leqslant:"⩽",les:"⩽",lescc:"⪨",lesdot:"⩿",lesdoto:"⪁",lesdotor:"⪃",lesg:"⋚︀",lesges:"⪓",lessapprox:"⪅",lessdot:"⋖",lesseqgtr:"⋚",lesseqqgtr:"⪋",LessEqualGreater:"⋚",LessFullEqual:"≦",LessGreater:"≶",lessgtr:"≶",LessLess:"⪡",lesssim:"≲",LessSlantEqual:"⩽",LessTilde:"≲",lfisht:"⥼",lfloor:"⌊",Lfr:"𝔏",lfr:"𝔩",lg:"≶",lgE:"⪑",lHar:"⥢",lhard:"↽",lharu:"↼",lharul:"⥪",lhblk:"▄",LJcy:"Љ",ljcy:"љ",Ll:"⋘",ll:"≪",llarr:"⇇",llcorner:"⌞",Lleftarrow:"⇚",llhard:"⥫",lltri:"◺",Lmidot:"Ŀ",lmidot:"ŀ",lmoust:"⎰",lmoustache:"⎰",lnap:"⪉",lnapprox:"⪉",lnE:"≨",lne:"⪇",lneq:"⪇",lneqq:"≨",lnsim:"⋦",loang:"⟬",loarr:"⇽",lobrk:"⟦",LongLeftArrow:"⟵",Longleftarrow:"⟸",longleftarrow:"⟵",LongLeftRightArrow:"⟷",Longleftrightarrow:"⟺",longleftrightarrow:"⟷",longmapsto:"⟼",LongRightArrow:"⟶",Longrightarrow:"⟹",longrightarrow:"⟶",looparrowleft:"↫",looparrowright:"↬",lopar:"⦅",Lopf:"𝕃",lopf:"𝕝",loplus:"⨭",lotimes:"⨴",lowast:"∗",lowbar:"_",LowerLeftArrow:"↙",LowerRightArrow:"↘",loz:"◊",lozenge:"◊",lozf:"⧫",lpar:"(",lparlt:"⦓",lrarr:"⇆",lrcorner:"⌟",lrhar:"⇋",lrhard:"⥭",lrm:"‎",lrtri:"⊿",lsaquo:"‹",Lscr:"ℒ",lscr:"𝓁",Lsh:"↰",lsh:"↰",lsim:"≲",lsime:"⪍",lsimg:"⪏",lsqb:"[",lsquo:"‘",lsquor:"‚",Lstrok:"Ł",lstrok:"ł",LT:"<",Lt:"≪",lt:"<",ltcc:"⪦",ltcir:"⩹",ltdot:"⋖",lthree:"⋋",ltimes:"⋉",ltlarr:"⥶",ltquest:"⩻",ltri:"◃",ltrie:"⊴",ltrif:"◂",ltrPar:"⦖",lurdshar:"⥊",luruhar:"⥦",lvertneqq:"≨︀",lvnE:"≨︀",macr:"¯",male:"♂",malt:"✠",maltese:"✠",Map:"⤅",map:"↦",mapsto:"↦",mapstodown:"↧",mapstoleft:"↤",mapstoup:"↥",marker:"▮",mcomma:"⨩",Mcy:"М",mcy:"м",mdash:"—",mDDot:"∺",measuredangle:"∡",MediumSpace:" ",Mellintrf:"ℳ",Mfr:"𝔐",mfr:"𝔪",mho:"℧",micro:"µ",mid:"∣",midast:"*",midcir:"⫰",middot:"·",minus:"−",minusb:"⊟",minusd:"∸",minusdu:"⨪",MinusPlus:"∓",mlcp:"⫛",mldr:"…",mnplus:"∓",models:"⊧",Mopf:"𝕄",mopf:"𝕞",mp:"∓",Mscr:"ℳ",mscr:"𝓂",mstpos:"∾",Mu:"Μ",mu:"μ",multimap:"⊸",mumap:"⊸",nabla:"∇",Nacute:"Ń",nacute:"ń",nang:"∠⃒",nap:"≉",napE:"⩰̸",napid:"≋̸",napos:"ʼn",napprox:"≉",natur:"♮",natural:"♮",naturals:"ℕ",nbsp:" ",nbump:"≎̸",nbumpe:"≏̸",ncap:"⩃",Ncaron:"Ň",ncaron:"ň",Ncedil:"Ņ",ncedil:"ņ",ncong:"≇",ncongdot:"⩭̸",ncup:"⩂",Ncy:"Н",ncy:"н",ndash:"–",ne:"≠",nearhk:"⤤",neArr:"⇗",nearr:"↗",nearrow:"↗",nedot:"≐̸",NegativeMediumSpace:"​",NegativeThickSpace:"​",NegativeThinSpace:"​",NegativeVeryThinSpace:"​",nequiv:"≢",nesear:"⤨",nesim:"≂̸",NestedGreaterGreater:"≫",NestedLessLess:"≪",NewLine:"\n",nexist:"∄",nexists:"∄",Nfr:"𝔑",nfr:"𝔫",ngE:"≧̸",nge:"≱",ngeq:"≱",ngeqq:"≧̸",ngeqslant:"⩾̸",nges:"⩾̸",nGg:"⋙̸",ngsim:"≵",nGt:"≫⃒",ngt:"≯",ngtr:"≯",nGtv:"≫̸",nhArr:"⇎",nharr:"↮",nhpar:"⫲",ni:"∋",nis:"⋼",nisd:"⋺",niv:"∋",NJcy:"Њ",njcy:"њ",nlArr:"⇍",nlarr:"↚",nldr:"‥",nlE:"≦̸",nle:"≰",nLeftarrow:"⇍",nleftarrow:"↚",nLeftrightarrow:"⇎",nleftrightarrow:"↮",nleq:"≰",nleqq:"≦̸",nleqslant:"⩽̸",nles:"⩽̸",nless:"≮",nLl:"⋘̸",nlsim:"≴",nLt:"≪⃒",nlt:"≮",nltri:"⋪",nltrie:"⋬",nLtv:"≪̸",nmid:"∤",NoBreak:"⁠",NonBreakingSpace:" ",Nopf:"ℕ",nopf:"𝕟",Not:"⫬",not:"¬",NotCongruent:"≢",NotCupCap:"≭",NotDoubleVerticalBar:"∦",NotElement:"∉",NotEqual:"≠",NotEqualTilde:"≂̸",NotExists:"∄",NotGreater:"≯",NotGreaterEqual:"≱",NotGreaterFullEqual:"≧̸",NotGreaterGreater:"≫̸",NotGreaterLess:"≹",NotGreaterSlantEqual:"⩾̸",NotGreaterTilde:"≵",NotHumpDownHump:"≎̸",NotHumpEqual:"≏̸",notin:"∉",notindot:"⋵̸",notinE:"⋹̸",notinva:"∉",notinvb:"⋷",notinvc:"⋶",NotLeftTriangle:"⋪",NotLeftTriangleBar:"⧏̸",NotLeftTriangleEqual:"⋬",NotLess:"≮",NotLessEqual:"≰",NotLessGreater:"≸",NotLessLess:"≪̸",NotLessSlantEqual:"⩽̸",NotLessTilde:"≴",NotNestedGreaterGreater:"⪢̸",NotNestedLessLess:"⪡̸",notni:"∌",notniva:"∌",notnivb:"⋾",notnivc:"⋽",NotPrecedes:"⊀",NotPrecedesEqual:"⪯̸",NotPrecedesSlantEqual:"⋠",NotReverseElement:"∌",NotRightTriangle:"⋫",NotRightTriangleBar:"⧐̸",NotRightTriangleEqual:"⋭",NotSquareSubset:"⊏̸",NotSquareSubsetEqual:"⋢",NotSquareSuperset:"⊐̸",NotSquareSupersetEqual:"⋣",NotSubset:"⊂⃒",NotSubsetEqual:"⊈",NotSucceeds:"⊁",NotSucceedsEqual:"⪰̸",NotSucceedsSlantEqual:"⋡",NotSucceedsTilde:"≿̸",NotSuperset:"⊃⃒",NotSupersetEqual:"⊉",NotTilde:"≁",NotTildeEqual:"≄",NotTildeFullEqual:"≇",NotTildeTilde:"≉",NotVerticalBar:"∤",npar:"∦",nparallel:"∦",nparsl:"⫽⃥",npart:"∂̸",npolint:"⨔",npr:"⊀",nprcue:"⋠",npre:"⪯̸",nprec:"⊀",npreceq:"⪯̸",nrArr:"⇏",nrarr:"↛",nrarrc:"⤳̸",nrarrw:"↝̸",nRightarrow:"⇏",nrightarrow:"↛",nrtri:"⋫",nrtrie:"⋭",nsc:"⊁",nsccue:"⋡",nsce:"⪰̸",Nscr:"𝒩",nscr:"𝓃",nshortmid:"∤",nshortparallel:"∦",nsim:"≁",nsime:"≄",nsimeq:"≄",nsmid:"∤",nspar:"∦",nsqsube:"⋢",nsqsupe:"⋣",nsub:"⊄",nsubE:"⫅̸",nsube:"⊈",nsubset:"⊂⃒",nsubseteq:"⊈",nsubseteqq:"⫅̸",nsucc:"⊁",nsucceq:"⪰̸",nsup:"⊅",nsupE:"⫆̸",nsupe:"⊉",nsupset:"⊃⃒",nsupseteq:"⊉",nsupseteqq:"⫆̸",ntgl:"≹",Ntilde:"Ñ",ntilde:"ñ",ntlg:"≸",ntriangleleft:"⋪",ntrianglelefteq:"⋬",ntriangleright:"⋫",ntrianglerighteq:"⋭",Nu:"Ν",nu:"ν",num:"#",numero:"№",numsp:" ",nvap:"≍⃒",nVDash:"⊯",nVdash:"⊮",nvDash:"⊭",nvdash:"⊬",nvge:"≥⃒",nvgt:">⃒",nvHarr:"⤄",nvinfin:"⧞",nvlArr:"⤂",nvle:"≤⃒",nvlt:"<⃒",nvltrie:"⊴⃒",nvrArr:"⤃",nvrtrie:"⊵⃒",nvsim:"∼⃒",nwarhk:"⤣",nwArr:"⇖",nwarr:"↖",nwarrow:"↖",nwnear:"⤧",Oacute:"Ó",oacute:"ó",oast:"⊛",ocir:"⊚",Ocirc:"Ô",ocirc:"ô",Ocy:"О",ocy:"о",odash:"⊝",Odblac:"Ő",odblac:"ő",odiv:"⨸",odot:"⊙",odsold:"⦼",OElig:"Œ",oelig:"œ",ofcir:"⦿",Ofr:"𝔒",ofr:"𝔬",ogon:"˛",Ograve:"Ò",ograve:"ò",ogt:"⧁",ohbar:"⦵",ohm:"Ω",oint:"∮",olarr:"↺",olcir:"⦾",olcross:"⦻",oline:"‾",olt:"⧀",Omacr:"Ō",omacr:"ō",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",omid:"⦶",ominus:"⊖",Oopf:"𝕆",oopf:"𝕠",opar:"⦷",OpenCurlyDoubleQuote:"“",OpenCurlyQuote:"‘",operp:"⦹",oplus:"⊕",Or:"⩔",or:"∨",orarr:"↻",ord:"⩝",order:"ℴ",orderof:"ℴ",ordf:"ª",ordm:"º",origof:"⊶",oror:"⩖",orslope:"⩗",orv:"⩛",oS:"Ⓢ",Oscr:"𝒪",oscr:"ℴ",Oslash:"Ø",oslash:"ø",osol:"⊘",Otilde:"Õ",otilde:"õ",Otimes:"⨷",otimes:"⊗",otimesas:"⨶",Ouml:"Ö",ouml:"ö",ovbar:"⌽",OverBar:"‾",OverBrace:"⏞",OverBracket:"⎴",OverParenthesis:"⏜",par:"∥",para:"¶",parallel:"∥",parsim:"⫳",parsl:"⫽",part:"∂",PartialD:"∂",Pcy:"П",pcy:"п",percnt:"%",period:".",permil:"‰",perp:"⊥",pertenk:"‱",Pfr:"𝔓",pfr:"𝔭",Phi:"Φ",phi:"φ",phiv:"ϕ",phmmat:"ℳ",phone:"☎",Pi:"Π",pi:"π",pitchfork:"⋔",piv:"ϖ",planck:"ℏ",planckh:"ℎ",plankv:"ℏ",plus:"+",plusacir:"⨣",plusb:"⊞",pluscir:"⨢",plusdo:"∔",plusdu:"⨥",pluse:"⩲",PlusMinus:"±",plusmn:"±",plussim:"⨦",plustwo:"⨧",pm:"±",Poincareplane:"ℌ",pointint:"⨕",Popf:"ℙ",popf:"𝕡",pound:"£",Pr:"⪻",pr:"≺",prap:"⪷",prcue:"≼",prE:"⪳",pre:"⪯",prec:"≺",precapprox:"⪷",preccurlyeq:"≼",Precedes:"≺",PrecedesEqual:"⪯",PrecedesSlantEqual:"≼",PrecedesTilde:"≾",preceq:"⪯",precnapprox:"⪹",precneqq:"⪵",precnsim:"⋨",precsim:"≾",Prime:"″",prime:"′",primes:"ℙ",prnap:"⪹",prnE:"⪵",prnsim:"⋨",prod:"∏",Product:"∏",profalar:"⌮",profline:"⌒",profsurf:"⌓",prop:"∝",Proportion:"∷",Proportional:"∝",propto:"∝",prsim:"≾",prurel:"⊰",Pscr:"𝒫",pscr:"𝓅",Psi:"Ψ",psi:"ψ",puncsp:" ",Qfr:"𝔔",qfr:"𝔮",qint:"⨌",Qopf:"ℚ",qopf:"𝕢",qprime:"⁗",Qscr:"𝒬",qscr:"𝓆",quaternions:"ℍ",quatint:"⨖",quest:"?",questeq:"≟",QUOT:'"',quot:'"',rAarr:"⇛",race:"∽̱",Racute:"Ŕ",racute:"ŕ",radic:"√",raemptyv:"⦳",Rang:"⟫",rang:"⟩",rangd:"⦒",range:"⦥",rangle:"⟩",raquo:"»",Rarr:"↠",rArr:"⇒",rarr:"→",rarrap:"⥵",rarrb:"⇥",rarrbfs:"⤠",rarrc:"⤳",rarrfs:"⤞",rarrhk:"↪",rarrlp:"↬",rarrpl:"⥅",rarrsim:"⥴",Rarrtl:"⤖",rarrtl:"↣",rarrw:"↝",rAtail:"⤜",ratail:"⤚",ratio:"∶",rationals:"ℚ",RBarr:"⤐",rBarr:"⤏",rbarr:"⤍",rbbrk:"❳",rbrace:"}",rbrack:"]",rbrke:"⦌",rbrksld:"⦎",rbrkslu:"⦐",Rcaron:"Ř",rcaron:"ř",Rcedil:"Ŗ",rcedil:"ŗ",rceil:"⌉",rcub:"}",Rcy:"Р",rcy:"р",rdca:"⤷",rdldhar:"⥩",rdquo:"”",rdquor:"”",rdsh:"↳",Re:"ℜ",real:"ℜ",realine:"ℛ",realpart:"ℜ",reals:"ℝ",rect:"▭",REG:"®",reg:"®",ReverseElement:"∋",ReverseEquilibrium:"⇋",ReverseUpEquilibrium:"⥯",rfisht:"⥽",rfloor:"⌋",Rfr:"ℜ",rfr:"𝔯",rHar:"⥤",rhard:"⇁",rharu:"⇀",rharul:"⥬",Rho:"Ρ",rho:"ρ",rhov:"ϱ",RightAngleBracket:"⟩",RightArrow:"→",Rightarrow:"⇒",rightarrow:"→",RightArrowBar:"⇥",RightArrowLeftArrow:"⇄",rightarrowtail:"↣",RightCeiling:"⌉",RightDoubleBracket:"⟧",RightDownTeeVector:"⥝",RightDownVector:"⇂",RightDownVectorBar:"⥕",RightFloor:"⌋",rightharpoondown:"⇁",rightharpoonup:"⇀",rightleftarrows:"⇄",rightleftharpoons:"⇌",rightrightarrows:"⇉",rightsquigarrow:"↝",RightTee:"⊢",RightTeeArrow:"↦",RightTeeVector:"⥛",rightthreetimes:"⋌",RightTriangle:"⊳",RightTriangleBar:"⧐",RightTriangleEqual:"⊵",RightUpDownVector:"⥏",RightUpTeeVector:"⥜",RightUpVector:"↾",RightUpVectorBar:"⥔",RightVector:"⇀",RightVectorBar:"⥓",ring:"˚",risingdotseq:"≓",rlarr:"⇄",rlhar:"⇌",rlm:"‏",rmoust:"⎱",rmoustache:"⎱",rnmid:"⫮",roang:"⟭",roarr:"⇾",robrk:"⟧",ropar:"⦆",Ropf:"ℝ",ropf:"𝕣",roplus:"⨮",rotimes:"⨵",RoundImplies:"⥰",rpar:")",rpargt:"⦔",rppolint:"⨒",rrarr:"⇉",Rrightarrow:"⇛",rsaquo:"›",Rscr:"ℛ",rscr:"𝓇",Rsh:"↱",rsh:"↱",rsqb:"]",rsquo:"’",rsquor:"’",rthree:"⋌",rtimes:"⋊",rtri:"▹",rtrie:"⊵",rtrif:"▸",rtriltri:"⧎",RuleDelayed:"⧴",ruluhar:"⥨",rx:"℞",Sacute:"Ś",sacute:"ś",sbquo:"‚",Sc:"⪼",sc:"≻",scap:"⪸",Scaron:"Š",scaron:"š",sccue:"≽",scE:"⪴",sce:"⪰",Scedil:"Ş",scedil:"ş",Scirc:"Ŝ",scirc:"ŝ",scnap:"⪺",scnE:"⪶",scnsim:"⋩",scpolint:"⨓",scsim:"≿",Scy:"С",scy:"с",sdot:"⋅",sdotb:"⊡",sdote:"⩦",searhk:"⤥",seArr:"⇘",searr:"↘",searrow:"↘",sect:"§",semi:";",seswar:"⤩",setminus:"∖",setmn:"∖",sext:"✶",Sfr:"𝔖",sfr:"𝔰",sfrown:"⌢",sharp:"♯",SHCHcy:"Щ",shchcy:"щ",SHcy:"Ш",shcy:"ш",ShortDownArrow:"↓",ShortLeftArrow:"←",shortmid:"∣",shortparallel:"∥",ShortRightArrow:"→",ShortUpArrow:"↑",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sigmav:"ς",sim:"∼",simdot:"⩪",sime:"≃",simeq:"≃",simg:"⪞",simgE:"⪠",siml:"⪝",simlE:"⪟",simne:"≆",simplus:"⨤",simrarr:"⥲",slarr:"←",SmallCircle:"∘",smallsetminus:"∖",smashp:"⨳",smeparsl:"⧤",smid:"∣",smile:"⌣",smt:"⪪",smte:"⪬",smtes:"⪬︀",SOFTcy:"Ь",softcy:"ь",sol:"/",solb:"⧄",solbar:"⌿",Sopf:"𝕊",sopf:"𝕤",spades:"♠",spadesuit:"♠",spar:"∥",sqcap:"⊓",sqcaps:"⊓︀",sqcup:"⊔",sqcups:"⊔︀",Sqrt:"√",sqsub:"⊏",sqsube:"⊑",sqsubset:"⊏",sqsubseteq:"⊑",sqsup:"⊐",sqsupe:"⊒",sqsupset:"⊐",sqsupseteq:"⊒",squ:"□",Square:"□",square:"□",SquareIntersection:"⊓",SquareSubset:"⊏",SquareSubsetEqual:"⊑",SquareSuperset:"⊐",SquareSupersetEqual:"⊒",SquareUnion:"⊔",squarf:"▪",squf:"▪",srarr:"→",Sscr:"𝒮",sscr:"𝓈",ssetmn:"∖",ssmile:"⌣",sstarf:"⋆",Star:"⋆",star:"☆",starf:"★",straightepsilon:"ϵ",straightphi:"ϕ",strns:"¯",Sub:"⋐",sub:"⊂",subdot:"⪽",subE:"⫅",sube:"⊆",subedot:"⫃",submult:"⫁",subnE:"⫋",subne:"⊊",subplus:"⪿",subrarr:"⥹",Subset:"⋐",subset:"⊂",subseteq:"⊆",subseteqq:"⫅",SubsetEqual:"⊆",subsetneq:"⊊",subsetneqq:"⫋",subsim:"⫇",subsub:"⫕",subsup:"⫓",succ:"≻",succapprox:"⪸",succcurlyeq:"≽",Succeeds:"≻",SucceedsEqual:"⪰",SucceedsSlantEqual:"≽",SucceedsTilde:"≿",succeq:"⪰",succnapprox:"⪺",succneqq:"⪶",succnsim:"⋩",succsim:"≿",SuchThat:"∋",Sum:"∑",sum:"∑",sung:"♪",Sup:"⋑",sup:"⊃",sup1:"¹",sup2:"²",sup3:"³",supdot:"⪾",supdsub:"⫘",supE:"⫆",supe:"⊇",supedot:"⫄",Superset:"⊃",SupersetEqual:"⊇",suphsol:"⟉",suphsub:"⫗",suplarr:"⥻",supmult:"⫂",supnE:"⫌",supne:"⊋",supplus:"⫀",Supset:"⋑",supset:"⊃",supseteq:"⊇",supseteqq:"⫆",supsetneq:"⊋",supsetneqq:"⫌",supsim:"⫈",supsub:"⫔",supsup:"⫖",swarhk:"⤦",swArr:"⇙",swarr:"↙",swarrow:"↙",swnwar:"⤪",szlig:"ß",Tab:"\t",target:"⌖",Tau:"Τ",tau:"τ",tbrk:"⎴",Tcaron:"Ť",tcaron:"ť",Tcedil:"Ţ",tcedil:"ţ",Tcy:"Т",tcy:"т",tdot:"⃛",telrec:"⌕",Tfr:"𝔗",tfr:"𝔱",there4:"∴",Therefore:"∴",therefore:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thetav:"ϑ",thickapprox:"≈",thicksim:"∼",ThickSpace:"  ",thinsp:" ",ThinSpace:" ",thkap:"≈",thksim:"∼",THORN:"Þ",thorn:"þ",Tilde:"∼",tilde:"˜",TildeEqual:"≃",TildeFullEqual:"≅",TildeTilde:"≈",times:"×",timesb:"⊠",timesbar:"⨱",timesd:"⨰",tint:"∭",toea:"⤨",top:"⊤",topbot:"⌶",topcir:"⫱",Topf:"𝕋",topf:"𝕥",topfork:"⫚",tosa:"⤩",tprime:"‴",TRADE:"™",trade:"™",triangle:"▵",triangledown:"▿",triangleleft:"◃",trianglelefteq:"⊴",triangleq:"≜",triangleright:"▹",trianglerighteq:"⊵",tridot:"◬",trie:"≜",triminus:"⨺",TripleDot:"⃛",triplus:"⨹",trisb:"⧍",tritime:"⨻",trpezium:"⏢",Tscr:"𝒯",tscr:"𝓉",TScy:"Ц",tscy:"ц",TSHcy:"Ћ",tshcy:"ћ",Tstrok:"Ŧ",tstrok:"ŧ",twixt:"≬",twoheadleftarrow:"↞",twoheadrightarrow:"↠",Uacute:"Ú",uacute:"ú",Uarr:"↟",uArr:"⇑",uarr:"↑",Uarrocir:"⥉",Ubrcy:"Ў",ubrcy:"ў",Ubreve:"Ŭ",ubreve:"ŭ",Ucirc:"Û",ucirc:"û",Ucy:"У",ucy:"у",udarr:"⇅",Udblac:"Ű",udblac:"ű",udhar:"⥮",ufisht:"⥾",Ufr:"𝔘",ufr:"𝔲",Ugrave:"Ù",ugrave:"ù",uHar:"⥣",uharl:"↿",uharr:"↾",uhblk:"▀",ulcorn:"⌜",ulcorner:"⌜",ulcrop:"⌏",ultri:"◸",Umacr:"Ū",umacr:"ū",uml:"¨",UnderBar:"_",UnderBrace:"⏟",UnderBracket:"⎵",UnderParenthesis:"⏝",Union:"⋃",UnionPlus:"⊎",Uogon:"Ų",uogon:"ų",Uopf:"𝕌",uopf:"𝕦",UpArrow:"↑",Uparrow:"⇑",uparrow:"↑",UpArrowBar:"⤒",UpArrowDownArrow:"⇅",UpDownArrow:"↕",Updownarrow:"⇕",updownarrow:"↕",UpEquilibrium:"⥮",upharpoonleft:"↿",upharpoonright:"↾",uplus:"⊎",UpperLeftArrow:"↖",UpperRightArrow:"↗",Upsi:"ϒ",upsi:"υ",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",UpTee:"⊥",UpTeeArrow:"↥",upuparrows:"⇈",urcorn:"⌝",urcorner:"⌝",urcrop:"⌎",Uring:"Ů",uring:"ů",urtri:"◹",Uscr:"𝒰",uscr:"𝓊",utdot:"⋰",Utilde:"Ũ",utilde:"ũ",utri:"▵",utrif:"▴",uuarr:"⇈",Uuml:"Ü",uuml:"ü",uwangle:"⦧",vangrt:"⦜",varepsilon:"ϵ",varkappa:"ϰ",varnothing:"∅",varphi:"ϕ",varpi:"ϖ",varpropto:"∝",vArr:"⇕",varr:"↕",varrho:"ϱ",varsigma:"ς",varsubsetneq:"⊊︀",varsubsetneqq:"⫋︀",varsupsetneq:"⊋︀",varsupsetneqq:"⫌︀",vartheta:"ϑ",vartriangleleft:"⊲",vartriangleright:"⊳",Vbar:"⫫",vBar:"⫨",vBarv:"⫩",Vcy:"В",vcy:"в",VDash:"⊫",Vdash:"⊩",vDash:"⊨",vdash:"⊢",Vdashl:"⫦",Vee:"⋁",vee:"∨",veebar:"⊻",veeeq:"≚",vellip:"⋮",Verbar:"‖",verbar:"|",Vert:"‖",vert:"|",VerticalBar:"∣",VerticalLine:"|",VerticalSeparator:"❘",VerticalTilde:"≀",VeryThinSpace:" ",Vfr:"𝔙",vfr:"𝔳",vltri:"⊲",vnsub:"⊂⃒",vnsup:"⊃⃒",Vopf:"𝕍",vopf:"𝕧",vprop:"∝",vrtri:"⊳",Vscr:"𝒱",vscr:"𝓋",vsubnE:"⫋︀",vsubne:"⊊︀",vsupnE:"⫌︀",vsupne:"⊋︀",Vvdash:"⊪",vzigzag:"⦚",Wcirc:"Ŵ",wcirc:"ŵ",wedbar:"⩟",Wedge:"⋀",wedge:"∧",wedgeq:"≙",weierp:"℘",Wfr:"𝔚",wfr:"𝔴",Wopf:"𝕎",wopf:"𝕨",wp:"℘",wr:"≀",wreath:"≀",Wscr:"𝒲",wscr:"𝓌",xcap:"⋂",xcirc:"◯",xcup:"⋃",xdtri:"▽",Xfr:"𝔛",xfr:"𝔵",xhArr:"⟺",xharr:"⟷",Xi:"Ξ",xi:"ξ",xlArr:"⟸",xlarr:"⟵",xmap:"⟼",xnis:"⋻",xodot:"⨀",Xopf:"𝕏",xopf:"𝕩",xoplus:"⨁",xotime:"⨂",xrArr:"⟹",xrarr:"⟶",Xscr:"𝒳",xscr:"𝓍",xsqcup:"⨆",xuplus:"⨄",xutri:"△",xvee:"⋁",xwedge:"⋀",Yacute:"Ý",yacute:"ý",YAcy:"Я",yacy:"я",Ycirc:"Ŷ",ycirc:"ŷ",Ycy:"Ы",ycy:"ы",yen:"¥",Yfr:"𝔜",yfr:"𝔶",YIcy:"Ї",yicy:"ї",Yopf:"𝕐",yopf:"𝕪",Yscr:"𝒴",yscr:"𝓎",YUcy:"Ю",yucy:"ю",Yuml:"Ÿ",yuml:"ÿ",Zacute:"Ź",zacute:"ź",Zcaron:"Ž",zcaron:"ž",Zcy:"З",zcy:"з",Zdot:"Ż",zdot:"ż",zeetrf:"ℨ",ZeroWidthSpace:"​",Zeta:"Ζ",zeta:"ζ",Zfr:"ℨ",zfr:"𝔷",ZHcy:"Ж",zhcy:"ж",zigrarr:"⇝",Zopf:"ℤ",zopf:"𝕫",Zscr:"𝒵",zscr:"𝓏",zwj:"‍",zwnj:"‌"},r=Object.prototype.hasOwnProperty;function n(e){return o=e,(n=t)&&r.call(n,o)?t[e]:e;var n,o}var o=Object.prototype.hasOwnProperty;function s(e,t){return!!e&&o.call(e,t)}function i(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach(function(r){e[r]=t[r]})}}),e}var a=/\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;function u(e){return e.indexOf("\\")<0?e:e.replace(a,"$1")}function l(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function c(e){if(e>65535){var t=55296+((e-=65536)>>10),r=56320+(1023&e);return String.fromCharCode(t,r)}return String.fromCharCode(e)}var p=/&([a-z#][a-z0-9]{1,31});/gi,h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function f(e,t){var r=0,o=n(t);return t!==o?o:35===t.charCodeAt(0)&&h.test(t)&&l(r="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?c(r):e}function g(e){return e.indexOf("&")<0?e:e.replace(p,f)}var d=/[&<>"]/,m=/[&<>"]/g,b={"&":"&","<":"<",">":">",'"':"""};function v(e){return b[e]}function k(e){return d.test(e)?e.replace(m,v):e}var A=Object.freeze({isString:function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},has:s,assign:i,unescapeMd:u,isValidEntityCode:l,fromCodePoint:c,replaceEntities:g,escapeHtml:k}),y={};y.blockquote_open=function(){return"<blockquote>\n"},y.blockquote_close=function(e,t){return"</blockquote>"+x(e,t)},y.code=function(e,t){return e[t].block?"<pre><code>"+k(e[t].content)+"</code></pre>"+x(e,t):"<code>"+k(e[t].content)+"</code>"},y.fence=function(e,t,r,n,o){var i,a,l=e[t],c="",p=r.langPrefix;if(l.params){if(a=(i=l.params.split(/\s+/g)).join(" "),s(o.rules.fence_custom,i[0]))return o.rules.fence_custom[i[0]](e,t,r,n,o);c=' class="'+p+k(g(u(a)))+'"'}return"<pre><code"+c+">"+(r.highlight&&r.highlight.apply(r.highlight,[l.content].concat(i))||k(l.content))+"</code></pre>"+x(e,t)},y.fence_custom={},y.heading_open=function(e,t){return"<h"+e[t].hLevel+">"},y.heading_close=function(e,t){return"</h"+e[t].hLevel+">\n"},y.hr=function(e,t,r){return(r.xhtmlOut?"<hr />":"<hr>")+x(e,t)},y.bullet_list_open=function(){return"<ul>\n"},y.bullet_list_close=function(e,t){return"</ul>"+x(e,t)},y.list_item_open=function(){return"<li>"},y.list_item_close=function(){return"</li>\n"},y.ordered_list_open=function(e,t){var r=e[t];return"<ol"+(r.order>1?' start="'+r.order+'"':"")+">\n"},y.ordered_list_close=function(e,t){return"</ol>"+x(e,t)},y.paragraph_open=function(e,t){return e[t].tight?"":"<p>"},y.paragraph_close=function(e,t){var r=!(e[t].tight&&t&&"inline"===e[t-1].type&&!e[t-1].content);return(e[t].tight?"":"</p>")+(r?x(e,t):"")},y.link_open=function(e,t,r){var n=e[t].title?' title="'+k(g(e[t].title))+'"':"",o=r.linkTarget?' target="'+r.linkTarget+'"':"";return'<a href="'+k(e[t].href)+'"'+n+o+">"},y.link_close=function(){return"</a>"},y.image=function(e,t,r){var n=' src="'+k(e[t].src)+'"',o=e[t].title?' title="'+k(g(e[t].title))+'"':"";return"<img"+n+(' alt="'+(e[t].alt?k(g(u(e[t].alt))):"")+'"')+o+(r.xhtmlOut?" /":"")+">"},y.table_open=function(){return"<table>\n"},y.table_close=function(){return"</table>\n"},y.thead_open=function(){return"<thead>\n"},y.thead_close=function(){return"</thead>\n"},y.tbody_open=function(){return"<tbody>\n"},y.tbody_close=function(){return"</tbody>\n"},y.tr_open=function(){return"<tr>"},y.tr_close=function(){return"</tr>\n"},y.th_open=function(e,t){var r=e[t];return"<th"+(r.align?' style="text-align:'+r.align+'"':"")+">"},y.th_close=function(){return"</th>"},y.td_open=function(e,t){var r=e[t];return"<td"+(r.align?' style="text-align:'+r.align+'"':"")+">"},y.td_close=function(){return"</td>"},y.strong_open=function(){return"<strong>"},y.strong_close=function(){return"</strong>"},y.em_open=function(){return"<em>"},y.em_close=function(){return"</em>"},y.del_open=function(){return"<del>"},y.del_close=function(){return"</del>"},y.ins_open=function(){return"<ins>"},y.ins_close=function(){return"</ins>"},y.mark_open=function(){return"<mark>"},y.mark_close=function(){return"</mark>"},y.sub=function(e,t){return"<sub>"+k(e[t].content)+"</sub>"},y.sup=function(e,t){return"<sup>"+k(e[t].content)+"</sup>"},y.hardbreak=function(e,t,r){return r.xhtmlOut?"<br />\n":"<br>\n"},y.softbreak=function(e,t,r){return r.breaks?r.xhtmlOut?"<br />\n":"<br>\n":"\n"},y.text=function(e,t){return k(e[t].content)},y.htmlblock=function(e,t){return e[t].content},y.htmltag=function(e,t){return e[t].content},y.abbr_open=function(e,t){return'<abbr title="'+k(g(e[t].title))+'">'},y.abbr_close=function(){return"</abbr>"},y.footnote_ref=function(e,t){var r=Number(e[t].id+1).toString(),n="fnref"+r;return e[t].subId>0&&(n+=":"+e[t].subId),'<sup class="footnote-ref"><a href="#fn'+r+'" id="'+n+'">['+r+"]</a></sup>"},y.footnote_block_open=function(e,t,r){return(r.xhtmlOut?'<hr class="footnotes-sep" />\n':'<hr class="footnotes-sep">\n')+'<section class="footnotes">\n<ol class="footnotes-list">\n'},y.footnote_block_close=function(){return"</ol>\n</section>\n"},y.footnote_open=function(e,t){return'<li id="fn'+Number(e[t].id+1).toString()+'" class="footnote-item">'},y.footnote_close=function(){return"</li>\n"},y.footnote_anchor=function(e,t){var r="fnref"+Number(e[t].id+1).toString();return e[t].subId>0&&(r+=":"+e[t].subId),' <a href="#'+r+'" class="footnote-backref">↩</a>'},y.dl_open=function(){return"<dl>\n"},y.dt_open=function(){return"<dt>"},y.dd_open=function(){return"<dd>"},y.dl_close=function(){return"</dl>\n"},y.dt_close=function(){return"</dt>\n"},y.dd_close=function(){return"</dd>\n"};var x=y.getBreak=function(e,t){return(t=function e(t,r){return++r>=t.length-2?r:"paragraph_open"===t[r].type&&t[r].tight&&"inline"===t[r+1].type&&0===t[r+1].content.length&&"paragraph_close"===t[r+2].type&&t[r+2].tight?e(t,r+2):r}(e,t))<e.length&&"list_item_close"===e[t].type?"":"\n"};function w(){this.rules=i({},y),this.getBreak=y.getBreak}function C(){this.__rules__=[],this.__cache__=null}function E(e,t,r,n,o){this.src=e,this.env=n,this.options=r,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent="",this.labelUnmatchedScopes=0}function D(e,t){var r,n,o,s=-1,i=e.posMax,a=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,r=1;e.pos<i;){if(91===(o=e.src.charCodeAt(e.pos)))r++;else if(93===o&&0===--r){n=!0;break}e.parser.skipToken(e)}return n?(s=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=r-1,e.pos=a,e.isInLabel=u,s}function _(e,t,r,n){var o,s,i,a,u,l;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(-1===e.indexOf("]:"))return-1;if((s=D(o=new E(e,t,r,n,[]),1))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&10!==o.src.charCodeAt(i);i++);return u=e.slice(2,s),0===(l=e.slice(s+2,i).trim()).length?-1:(n.abbreviations||(n.abbreviations={}),void 0===n.abbreviations[":"+u]&&(n.abbreviations[":"+u]=l),i)}function B(e){var t=g(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}function q(e,t){var r,n,o,s=t,i=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<i;){if(10===(r=e.src.charCodeAt(t)))return!1;if(62===r)return o=B(u(e.src.slice(s+1,t))),!!e.parser.validateLink(o)&&(e.pos=t+1,e.linkContent=o,!0);92===r&&t+1<i?t+=2:t++}return!1}for(n=0;t<i&&32!==(r=e.src.charCodeAt(t))&&!(r<32||127===r);)if(92===r&&t+1<i)t+=2;else{if(40===r&&++n>1)break;if(41===r&&--n<0)break;t++}return s!==t&&(o=u(e.src.slice(s,t)),!!e.parser.validateLink(o)&&(e.linkContent=o,e.pos=t,!0))}function F(e,t){var r,n=t,o=e.posMax,s=e.src.charCodeAt(t);if(34!==s&&39!==s&&40!==s)return!1;for(t++,40===s&&(s=41);t<o;){if((r=e.src.charCodeAt(t))===s)return e.pos=t+1,e.linkContent=u(e.src.slice(n+1,t)),!0;92===r&&t+1<o?t+=2:t++}return!1}function M(e){return e.trim().replace(/\s+/g," ").toUpperCase()}function S(e,t,r,n){var o,s,i,a,u,l,c,p,h;if(91!==e.charCodeAt(0))return-1;if(-1===e.indexOf("]:"))return-1;if((s=D(o=new E(e,t,r,n,[]),0))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);if(!q(o,i))return-1;for(c=o.linkContent,l=i=o.pos,i+=1;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);for(i<a&&l!==i&&F(o,i)?(p=o.linkContent,i=o.pos):(p="",i=l);i<a&&32===o.src.charCodeAt(i);)i++;return i<a&&10!==o.src.charCodeAt(i)?-1:(h=M(e.slice(1,s)),void 0===n.references[h]&&(n.references[h]={title:p,href:c}),i)}w.prototype.renderInline=function(e,t,r){for(var n=this.rules,o=e.length,s=0,i="";o--;)i+=n[e[s].type](e,s++,t,r,this);return i},w.prototype.render=function(e,t,r){for(var n=this.rules,o=e.length,s=-1,i="";++s<o;)"inline"===e[s].type?i+=this.renderInline(e[s].children,t,r):i+=n[e[s].type](e,s,t,r,this);return i},C.prototype.__find__=function(e){for(var t=this.__rules__.length,r=-1;t--;)if(this.__rules__[++r].name===e)return r;return-1},C.prototype.__compile__=function(){var e=this,t=[""];e.__rules__.forEach(function(e){e.enabled&&e.alt.forEach(function(e){t.indexOf(e)<0&&t.push(e)})}),e.__cache__={},t.forEach(function(t){e.__cache__[t]=[],e.__rules__.forEach(function(r){r.enabled&&(t&&r.alt.indexOf(t)<0||e.__cache__[t].push(r.fn))})})},C.prototype.at=function(e,t,r){var n=this.__find__(e),o=r||{};if(-1===n)throw new Error("Parser rule not found: "+e);this.__rules__[n].fn=t,this.__rules__[n].alt=o.alt||[],this.__cache__=null},C.prototype.before=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error("Parser rule not found: "+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.after=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error("Parser rule not found: "+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.push=function(e,t,r){var n=r||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:n.alt||[]}),this.__cache__=null},C.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach(function(e){e.enabled=!1}),e.forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error("Rules manager: invalid rule name "+e);this.__rules__[t].enabled=!0},this),this.__cache__=null},C.prototype.disable=function(e){(e=Array.isArray(e)?e:[e]).forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error("Rules manager: invalid rule name "+e);this.__rules__[t].enabled=!1},this),this.__cache__=null},C.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},E.prototype.pushPending=function(){this.tokens.push({type:"text",content:this.pending,level:this.pendingLevel}),this.pending=""},E.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},E.prototype.cacheSet=function(e,t){for(var r=this.cache.length;r<=e;r++)this.cache.push(0);this.cache[e]=t},E.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0};var T=" \n()[]'\".,!?-";function L(e){return e.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1")}var R=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,N=/\((c|tm|r|p)\)/gi,z={c:"©",r:"®",p:"§",tm:"™"};var P=/['"]/,j=/['"]/g,I=/[-\s()\[\]]/,O="’";function U(e,t){return!(t<0||t>=e.length)&&!I.test(e[t])}function H(e,t,r){return e.substr(0,t)+r+e.substr(t+1)}var V=[["block",function(e){e.inlineMode?e.tokens.push({type:"inline",content:e.src.replace(/\n/g," ").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}],["abbr",function(e){var t,r,n,o,s=e.tokens;if(!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if("paragraph_open"===s[t-1].type&&"inline"===s[t].type&&"paragraph_close"===s[t+1].type){for(n=s[t].content;n.length&&!((o=_(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],["references",function(e){var t,r,n,o,s=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if("inline"===s[t].type&&"paragraph_open"===s[t-1].type&&"paragraph_close"===s[t+1].type){for(n=s[t].content;n.length&&!((o=S(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],["inline",function(e){var t,r,n,o=e.tokens;for(r=0,n=o.length;r<n;r++)"inline"===(t=o[r]).type&&e.inline.parse(t.content,e.options,e.env,t.children)}],["footnote_tail",function(e){var t,r,n,o,s,i,a,u,l,c=0,p=!1,h={};if(e.env.footnotes&&(e.tokens=e.tokens.filter(function(e){return"footnote_reference_open"===e.type?(p=!0,u=[],l=e.label,!1):"footnote_reference_close"===e.type?(p=!1,h[":"+l]=u,!1):(p&&u.push(e),!p)}),e.env.footnotes.list)){for(i=e.env.footnotes.list,e.tokens.push({type:"footnote_block_open",level:c++}),t=0,r=i.length;t<r;t++){for(e.tokens.push({type:"footnote_open",id:t,level:c++}),i[t].tokens?((a=[]).push({type:"paragraph_open",tight:!1,level:c++}),a.push({type:"inline",content:"",level:c,children:i[t].tokens}),a.push({type:"paragraph_close",tight:!1,level:--c})):i[t].label&&(a=h[":"+i[t].label]),e.tokens=e.tokens.concat(a),s="paragraph_close"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,o=i[t].count>0?i[t].count:1,n=0;n<o;n++)e.tokens.push({type:"footnote_anchor",id:t,subId:n,level:c});s&&e.tokens.push(s),e.tokens.push({type:"footnote_close",level:--c})}e.tokens.push({type:"footnote_block_close",level:--c})}}],["abbr2",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(h="(^|["+T.split("").map(L).join("")+"])("+Object.keys(e.env.abbreviations).map(function(e){return e.substr(1)}).sort(function(e,t){return t.length-e.length}).map(L).join("|")+")($|["+T.split("").map(L).join("")+"])",e.env.abbrRegExp=new RegExp(h,"g")),c=e.env.abbrRegExp,r=0,n=f.length;r<n;r++)if("inline"===f[r].type)for(t=(o=f[r].children).length-1;t>=0;t--)if("text"===(s=o[t]).type){for(u=0,i=s.content,c.lastIndex=0,l=s.level,a=[];p=c.exec(i);)c.lastIndex>u&&a.push({type:"text",content:i.slice(u,p.index+p[1].length),level:l}),a.push({type:"abbr_open",title:e.env.abbreviations[":"+p[2]],level:l++}),a.push({type:"text",content:p[2],level:l}),a.push({type:"abbr_close",level:--l}),u=c.lastIndex-p[3].length;a.length&&(u<i.length&&a.push({type:"text",content:i.slice(u),level:l}),f[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1)))}}],["replacements",function(e){var t,r,n,o,s,i;if(e.options.typographer)for(s=e.tokens.length-1;s>=0;s--)if("inline"===e.tokens[s].type)for(t=(o=e.tokens[s].children).length-1;t>=0;t--)"text"===(r=o[t]).type&&(n=r.content,n=(i=n).indexOf("(")<0?i:i.replace(N,function(e,t){return z[t.toLowerCase()]}),R.test(n)&&(n=n.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),r.content=n)}],["smartquotes",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(e.options.typographer)for(b=[],d=e.tokens.length-1;d>=0;d--)if("inline"===e.tokens[d].type)for(m=e.tokens[d].children,b.length=0,t=0;t<m.length;t++)if("text"===(r=m[t]).type&&!P.test(r.text)){for(a=m[t].level,f=b.length-1;f>=0&&!(b[f].level<=a);f--);b.length=f+1,s=0,i=(n=r.content).length;e:for(;s<i&&(j.lastIndex=s,o=j.exec(n));)if(u=!U(n,o.index-1),s=o.index+1,g="'"===o[0],(l=!U(n,s))||u){if(p=!l,h=!u)for(f=b.length-1;f>=0&&(c=b[f],!(b[f].level<a));f--)if(c.single===g&&b[f].level===a){c=b[f],g?(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[2]),r.content=H(r.content,o.index,e.options.quotes[3])):(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[0]),r.content=H(r.content,o.index,e.options.quotes[1])),b.length=f;continue e}p?b.push({token:t,pos:o.index,single:g,level:a}):h&&g&&(r.content=H(r.content,o.index,O))}else g&&(r.content=H(r.content,o.index,O))}}]];function G(){this.options={},this.ruler=new C;for(var e=0;e<V.length;e++)this.ruler.push(V[e][0],V[e][1])}function $(e,t,r,n,o){var s,i,a,u,l,c,p;for(this.src=e,this.parser=t,this.options=r,this.env=n,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType="root",this.ddIndent=-1,this.level=0,this.result="",c=0,p=!1,a=u=c=0,l=(i=this.src).length;u<l;u++){if(s=i.charCodeAt(u),!p){if(32===s){c++;continue}p=!0}10!==s&&u!==l-1||(10!==s&&u++,this.bMarks.push(a),this.eMarks.push(u),this.tShift.push(c),p=!1,c=0,a=u+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function Z(e,t){var r,n,o;return(n=e.bMarks[t]+e.tShift[t])>=(o=e.eMarks[t])?-1:42!==(r=e.src.charCodeAt(n++))&&45!==r&&43!==r?-1:n<o&&32!==e.src.charCodeAt(n)?-1:n}function W(e,t){var r,n=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(n+1>=o)return-1;if((r=e.src.charCodeAt(n++))<48||r>57)return-1;for(;;){if(n>=o)return-1;if(!((r=e.src.charCodeAt(n++))>=48&&r<=57)){if(41===r||46===r)break;return-1}}return n<o&&32!==e.src.charCodeAt(n)?-1:n}G.prototype.process=function(e){var t,r,n;for(t=0,r=(n=this.ruler.getRules("")).length;t<r;t++)n[t](e)},$.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},$.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},$.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},$.prototype.skipChars=function(e,t){for(var r=this.src.length;e<r&&this.src.charCodeAt(e)===t;e++);return e},$.prototype.skipCharsBack=function(e,t,r){if(e<=r)return e;for(;e>r;)if(t!==this.src.charCodeAt(--e))return e+1;return e},$.prototype.getLines=function(e,t,r,n){var o,s,i,a,u,l=e;if(e>=t)return"";if(l+1===t)return s=this.bMarks[l]+Math.min(this.tShift[l],r),i=n?this.eMarks[l]+1:this.eMarks[l],this.src.slice(s,i);for(a=new Array(t-e),o=0;l<t;l++,o++)(u=this.tShift[l])>r&&(u=r),u<0&&(u=0),s=this.bMarks[l]+u,i=l+1<t||n?this.eMarks[l]+1:this.eMarks[l],a[o]=this.src.slice(s,i);return a.join("")};var J={};["article","aside","button","blockquote","body","canvas","caption","col","colgroup","dd","div","dl","dt","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","iframe","li","map","object","ol","output","p","pre","progress","script","section","style","table","tbody","td","textarea","tfoot","th","tr","thead","ul","video"].forEach(function(e){J[e]=!0});var Y=/^<([a-zA-Z]{1,15})[\s\/>]/,K=/^<\/([a-zA-Z]{1,15})[\s>]/;function Q(e,t){var r=e.bMarks[t]+e.blkIndent,n=e.eMarks[t];return e.src.substr(r,n-r)}function X(e,t){var r,n,o=e.bMarks[t]+e.tShift[t],s=e.eMarks[t];return o>=s?-1:126!==(n=e.src.charCodeAt(o++))&&58!==n?-1:o===(r=e.skipSpaces(o))?-1:r>=s?-1:r}var ee=[["code",function(e,t,r){var n,o;if(e.tShift[t]-e.blkIndent<4)return!1;for(o=n=t+1;n<r;)if(e.isEmpty(n))n++;else{if(!(e.tShift[n]-e.blkIndent>=4))break;o=++n}return e.line=n,e.tokens.push({type:"code",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}],["fences",function(e,t,r,n){var o,s,i,a,u,l=!1,c=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(c+3>p)return!1;if(126!==(o=e.src.charCodeAt(c))&&96!==o)return!1;if(u=c,(s=(c=e.skipChars(c,o))-u)<3)return!1;if((i=e.src.slice(c,p).trim()).indexOf("`")>=0)return!1;if(n)return!0;for(a=t;!(++a>=r||(c=u=e.bMarks[a]+e.tShift[a])<(p=e.eMarks[a])&&e.tShift[a]<e.blkIndent);)if(e.src.charCodeAt(c)===o&&!(e.tShift[a]-e.blkIndent>=4||(c=e.skipChars(c,o))-u<s||(c=e.skipSpaces(c))<p)){l=!0;break}return s=e.tShift[t],e.line=a+(l?1:0),e.tokens.push({type:"fence",params:i,content:e.getLines(t+1,a,s,!0),lines:[t,e.line],level:e.level}),!0},["paragraph","blockquote","list"]],["blockquote",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d=e.bMarks[t]+e.tShift[t],m=e.eMarks[t];if(d>m)return!1;if(62!==e.src.charCodeAt(d++))return!1;if(e.level>=e.options.maxNesting)return!1;if(n)return!0;for(32===e.src.charCodeAt(d)&&d++,u=e.blkIndent,e.blkIndent=0,a=[e.bMarks[t]],e.bMarks[t]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i=[e.tShift[t]],e.tShift[t]=d-e.bMarks[t],p=e.parser.ruler.getRules("blockquote"),o=t+1;o<r&&!((d=e.bMarks[o]+e.tShift[o])>=(m=e.eMarks[o]));o++)if(62!==e.src.charCodeAt(d++)){if(s)break;for(g=!1,h=0,f=p.length;h<f;h++)if(p[h](e,o,r,!0)){g=!0;break}if(g)break;a.push(e.bMarks[o]),i.push(e.tShift[o]),e.tShift[o]=-1337}else 32===e.src.charCodeAt(d)&&d++,a.push(e.bMarks[o]),e.bMarks[o]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i.push(e.tShift[o]),e.tShift[o]=d-e.bMarks[o];for(l=e.parentType,e.parentType="blockquote",e.tokens.push({type:"blockquote_open",lines:c=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:"blockquote_close",level:--e.level}),e.parentType=l,c[1]=e.line,h=0;h<i.length;h++)e.bMarks[h+t]=a[h],e.tShift[h+t]=i[h];return e.blkIndent=u,!0},["paragraph","blockquote","list"]],["hr",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t];if((a+=e.tShift[t])>u)return!1;if(42!==(o=e.src.charCodeAt(a++))&&45!==o&&95!==o)return!1;for(s=1;a<u;){if((i=e.src.charCodeAt(a++))!==o&&32!==i)return!1;i===o&&s++}return!(s<3||!n&&(e.line=t+1,e.tokens.push({type:"hr",lines:[t,e.line],level:e.level}),0))},["paragraph","blockquote","list"]],["list",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b,v,k,A,y,x,w,C,E=!0;if((p=W(e,t))>=0)d=!0;else{if(!((p=Z(e,t))>=0))return!1;d=!1}if(e.level>=e.options.maxNesting)return!1;if(g=e.src.charCodeAt(p-1),n)return!0;for(b=e.tokens.length,d?(c=e.bMarks[t]+e.tShift[t],f=Number(e.src.substr(c,p-c-1)),e.tokens.push({type:"ordered_list_open",order:f,lines:k=[t,0],level:e.level++})):e.tokens.push({type:"bullet_list_open",lines:k=[t,0],level:e.level++}),o=t,v=!1,y=e.parser.ruler.getRules("list");!(!(o<r)||((h=(m=e.skipSpaces(p))>=e.eMarks[o]?1:m-p)>4&&(h=1),h<1&&(h=1),s=p-e.bMarks[o]+h,e.tokens.push({type:"list_item_open",lines:A=[t,0],level:e.level++}),a=e.blkIndent,u=e.tight,i=e.tShift[t],l=e.parentType,e.tShift[t]=m-e.bMarks[t],e.blkIndent=s,e.tight=!0,e.parentType="list",e.parser.tokenize(e,t,r,!0),e.tight&&!v||(E=!1),v=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=a,e.tShift[t]=i,e.tight=u,e.parentType=l,e.tokens.push({type:"list_item_close",level:--e.level}),o=t=e.line,A[1]=o,m=e.bMarks[t],o>=r)||e.isEmpty(o)||e.tShift[o]<e.blkIndent);){for(C=!1,x=0,w=y.length;x<w;x++)if(y[x](e,o,r,!0)){C=!0;break}if(C)break;if(d){if((p=W(e,o))<0)break}else if((p=Z(e,o))<0)break;if(g!==e.src.charCodeAt(p-1))break}return e.tokens.push({type:d?"ordered_list_close":"bullet_list_close",level:--e.level}),k[1]=o,e.line=o,E&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&"paragraph_open"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,b),!0},["paragraph","blockquote"]],["footnote",function(e,t,r,n){var o,s,i,a,u,l=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(l+4>c)return!1;if(91!==e.src.charCodeAt(l))return!1;if(94!==e.src.charCodeAt(l+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(a=l+2;a<c;a++){if(32===e.src.charCodeAt(a))return!1;if(93===e.src.charCodeAt(a))break}return!(a===l+2||a+1>=c||58!==e.src.charCodeAt(++a)||!n&&(a++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(l+2,a-2),e.env.footnotes.refs[":"+u]=-1,e.tokens.push({type:"footnote_reference_open",label:u,level:e.level++}),o=e.bMarks[t],s=e.tShift[t],i=e.parentType,e.tShift[t]=e.skipSpaces(a)-a,e.bMarks[t]=a,e.blkIndent+=4,e.parentType="footnote",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,r,!0),e.parentType=i,e.blkIndent-=4,e.tShift[t]=s,e.bMarks[t]=o,e.tokens.push({type:"footnote_reference_close",level:--e.level}),0))},["paragraph"]],["heading",function(e,t,r,n){var o,s,i,a=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(a>=u)return!1;if(35!==(o=e.src.charCodeAt(a))||a>=u)return!1;for(s=1,o=e.src.charCodeAt(++a);35===o&&a<u&&s<=6;)s++,o=e.src.charCodeAt(++a);return!(s>6||a<u&&32!==o||!n&&(u=e.skipCharsBack(u,32,a),(i=e.skipCharsBack(u,35,a))>a&&32===e.src.charCodeAt(i-1)&&(u=i),e.line=t+1,e.tokens.push({type:"heading_open",hLevel:s,lines:[t,e.line],level:e.level}),a<u&&e.tokens.push({type:"inline",content:e.src.slice(a,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:"heading_close",hLevel:s,level:e.level}),0))},["paragraph","blockquote"]],["lheading",function(e,t,r){var n,o,s,i=t+1;return!(i>=r||e.tShift[i]<e.blkIndent||e.tShift[i]-e.blkIndent>3||(o=e.bMarks[i]+e.tShift[i])>=(s=e.eMarks[i])||45!==(n=e.src.charCodeAt(o))&&61!==n||(o=e.skipChars(o,n),(o=e.skipSpaces(o))<s||(o=e.bMarks[t]+e.tShift[t],e.line=i+1,e.tokens.push({type:"heading_open",hLevel:61===n?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:"inline",content:e.src.slice(o,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:"heading_close",hLevel:61===n?1:2,level:e.level}),0)))}],["htmlblock",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t],l=e.tShift[t];if(a+=l,!e.options.html)return!1;if(l>3||a+2>=u)return!1;if(60!==e.src.charCodeAt(a))return!1;if(33===(o=e.src.charCodeAt(a+1))||63===o){if(n)return!0}else{if(47!==o&&!function(e){var t=32|e;return t>=97&&t<=122}(o))return!1;if(47===o){if(!(s=e.src.slice(a,u).match(K)))return!1}else if(!(s=e.src.slice(a,u).match(Y)))return!1;if(!0!==J[s[1].toLowerCase()])return!1;if(n)return!0}for(i=t+1;i<e.lineMax&&!e.isEmpty(i);)i++;return e.line=i,e.tokens.push({type:"htmlblock",level:e.level,lines:[t,e.line],content:e.getLines(t,i,0,!0)}),!0},["paragraph","blockquote"]],["table",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g;if(t+2>r)return!1;if(u=t+1,e.tShift[u]<e.blkIndent)return!1;if((i=e.bMarks[u]+e.tShift[u])>=e.eMarks[u])return!1;if(124!==(o=e.src.charCodeAt(i))&&45!==o&&58!==o)return!1;if(s=Q(e,t+1),!/^[-:| ]+$/.test(s))return!1;if((l=s.split("|"))<=2)return!1;for(p=[],a=0;a<l.length;a++){if(!(h=l[a].trim())){if(0===a||a===l.length-1)continue;return!1}if(!/^:?-+:?$/.test(h))return!1;58===h.charCodeAt(h.length-1)?p.push(58===h.charCodeAt(0)?"center":"right"):58===h.charCodeAt(0)?p.push("left"):p.push("")}if(-1===(s=Q(e,t).trim()).indexOf("|"))return!1;if(l=s.replace(/^\||\|$/g,"").split("|"),p.length!==l.length)return!1;if(n)return!0;for(e.tokens.push({type:"table_open",lines:f=[t,0],level:e.level++}),e.tokens.push({type:"thead_open",lines:[t,t+1],level:e.level++}),e.tokens.push({type:"tr_open",lines:[t,t+1],level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:"th_open",align:p[a],lines:[t,t+1],level:e.level++}),e.tokens.push({type:"inline",content:l[a].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:"th_close",level:--e.level});for(e.tokens.push({type:"tr_close",level:--e.level}),e.tokens.push({type:"thead_close",level:--e.level}),e.tokens.push({type:"tbody_open",lines:g=[t+2,0],level:e.level++}),u=t+2;u<r&&!(e.tShift[u]<e.blkIndent)&&-1!==(s=Q(e,u).trim()).indexOf("|");u++){for(l=s.replace(/^\||\|$/g,"").split("|"),e.tokens.push({type:"tr_open",level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:"td_open",align:p[a],level:e.level++}),c=l[a].substring(124===l[a].charCodeAt(0)?1:0,124===l[a].charCodeAt(l[a].length-1)?l[a].length-1:l[a].length).trim(),e.tokens.push({type:"inline",content:c,level:e.level,children:[]}),e.tokens.push({type:"td_close",level:--e.level});e.tokens.push({type:"tr_close",level:--e.level})}return e.tokens.push({type:"tbody_close",level:--e.level}),e.tokens.push({type:"table_close",level:--e.level}),f[1]=g[1]=u,e.line=u,!0},["paragraph"]],["deflist",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(n)return!(e.ddIndent<0)&&X(e,t)>=0;if(c=t+1,e.isEmpty(c)&&++c>r)return!1;if(e.tShift[c]<e.blkIndent)return!1;if((o=X(e,c))<0)return!1;if(e.level>=e.options.maxNesting)return!1;l=e.tokens.length,e.tokens.push({type:"dl_open",lines:u=[t,0],level:e.level++}),i=t,s=c;e:for(;;){for(b=!0,m=!1,e.tokens.push({type:"dt_open",lines:[i,i],level:e.level++}),e.tokens.push({type:"inline",content:e.getLines(i,i+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[i,i],children:[]}),e.tokens.push({type:"dt_close",level:--e.level});;){if(e.tokens.push({type:"dd_open",lines:a=[c,0],level:e.level++}),d=e.tight,h=e.ddIndent,p=e.blkIndent,g=e.tShift[s],f=e.parentType,e.blkIndent=e.ddIndent=e.tShift[s]+2,e.tShift[s]=o-e.bMarks[s],e.tight=!0,e.parentType="deflist",e.parser.tokenize(e,s,r,!0),e.tight&&!m||(b=!1),m=e.line-s>1&&e.isEmpty(e.line-1),e.tShift[s]=g,e.tight=d,e.parentType=f,e.blkIndent=p,e.ddIndent=h,e.tokens.push({type:"dd_close",level:--e.level}),a[1]=c=e.line,c>=r)break e;if(e.tShift[c]<e.blkIndent)break e;if((o=X(e,c))<0)break;s=c}if(c>=r)break;if(i=c,e.isEmpty(i))break;if(e.tShift[i]<e.blkIndent)break;if((s=i+1)>=r)break;if(e.isEmpty(s)&&s++,s>=r)break;if(e.tShift[s]<e.blkIndent)break;if((o=X(e,s))<0)break}return e.tokens.push({type:"dl_close",level:--e.level}),u[1]=c,e.line=c,b&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&"paragraph_open"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,l),!0},["paragraph"]],["paragraph",function(e,t){var r,n,o,s,i,a,u=t+1;if(u<(r=e.lineMax)&&!e.isEmpty(u))for(a=e.parser.ruler.getRules("paragraph");u<r&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(o=!1,s=0,i=a.length;s<i;s++)if(a[s](e,u,r,!0)){o=!0;break}if(o)break}return n=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,n.length&&(e.tokens.push({type:"paragraph_open",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:"inline",content:n,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:"paragraph_close",tight:!1,level:e.level})),!0}]];function te(){this.ruler=new C;for(var e=0;e<ee.length;e++)this.ruler.push(ee[e][0],ee[e][1],{alt:(ee[e][2]||[]).slice()})}te.prototype.tokenize=function(e,t,r){for(var n,o=this.ruler.getRules(""),s=o.length,i=t,a=!1;i<r&&(e.line=i=e.skipEmptyLines(i),!(i>=r))&&!(e.tShift[i]<e.blkIndent);){for(n=0;n<s&&!o[n](e,i,r,!1);n++);if(e.tight=!a,e.isEmpty(e.line-1)&&(a=!0),(i=e.line)<r&&e.isEmpty(i)){if(a=!0,++i<r&&"list"===e.parentType&&e.isEmpty(i))break;e.line=i}}};var re=/[\n\t]/g,ne=/\r[\n\u0085]|[\u2424\u2028\u0085]/g,oe=/\u00a0/g;function se(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}te.prototype.parse=function(e,t,r,n){var o,s=0,i=0;if(!e)return[];(e=(e=e.replace(oe," ")).replace(ne,"\n")).indexOf("\t")>=0&&(e=e.replace(re,function(t,r){var n;return 10===e.charCodeAt(r)?(s=r+1,i=0,t):(n=" ".slice((r-s-i)%4),i=r-s+1,n)})),o=new $(e,this,t,r,n),this.tokenize(o,o.line,o.lineMax)};for(var ie=[],ae=0;ae<256;ae++)ie.push(0);function ue(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function le(e,t){var r,n,o,s=t,i=!0,a=!0,u=e.posMax,l=e.src.charCodeAt(t);for(r=t>0?e.src.charCodeAt(t-1):-1;s<u&&e.src.charCodeAt(s)===l;)s++;return s>=u&&(i=!1),(o=s-t)>=4?i=a=!1:(32!==(n=s<u?e.src.charCodeAt(s):-1)&&10!==n||(i=!1),32!==r&&10!==r||(a=!1),95===l&&(ue(r)&&(i=!1),ue(n)&&(a=!1))),{can_open:i,can_close:a,delims:o}}"\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(e){ie[e.charCodeAt(0)]=1});var ce=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var pe=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var he=["coap","doi","javascript","aaa","aaas","about","acap","cap","cid","crid","data","dav","dict","dns","file","ftp","geo","go","gopher","h323","http","https","iax","icap","im","imap","info","ipp","iris","iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid","msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp","opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve","sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet","tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon","xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s","adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin","bolo","callto","chrome","chrome-extension","com-eventbrite-attendee","content","cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb","ed2k","facetime","feed","finger","fish","gg","git","gizmoproject","gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms","keyparc","lastfm","ldaps","magnet","maps","market","message","mms","ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi","platform","proxy","psyc","query","res","resource","rmi","rsync","rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify","ssh","steam","svn","teamspeak","things","udp","unreal","ut2004","ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri","ymsgr"],fe=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,ge=/^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/;function de(e,t){return e=e.source,t=t||"",function r(n,o){return n?(o=o.source||o,e=e.replace(n,o),r):new RegExp(e,t)}}var me=de(/(?:unquoted|single_quoted|double_quoted)/)("unquoted",/[^"'=<>`\x00-\x20]+/)("single_quoted",/'[^']*'/)("double_quoted",/"[^"]*"/)(),be=de(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)("attr_name",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)("attr_value",me)(),ve=de(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)("attribute",be)(),ke=de(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)("open_tag",ve)("close_tag",/<\/[A-Za-z][A-Za-z0-9]*\s*>/)("comment",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)("processing",/<[?].*?[?]>/)("declaration",/<![A-Z]+\s+[^>]*>/)("cdata",/<!\[CDATA\[[\s\S]*?\]\]>/)();var Ae=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,ye=/^&([a-z][a-z0-9]{1,31});/i;var xe=[["text",function(e,t){for(var r=e.pos;r<e.posMax&&!se(e.src.charCodeAt(r));)r++;return r!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,r)),e.pos=r,!0)}],["newline",function(e,t){var r,n,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(r=e.pending.length-1,n=e.posMax,!t)if(r>=0&&32===e.pending.charCodeAt(r))if(r>=1&&32===e.pending.charCodeAt(r-1)){for(var s=r-2;s>=0;s--)if(32!==e.pending.charCodeAt(s)){e.pending=e.pending.substring(0,s+1);break}e.push({type:"hardbreak",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:"softbreak",level:e.level});else e.push({type:"softbreak",level:e.level});for(o++;o<n&&32===e.src.charCodeAt(o);)o++;return e.pos=o,!0}],["escape",function(e,t){var r,n=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(n))return!1;if(++n<o){if((r=e.src.charCodeAt(n))<256&&0!==ie[r])return t||(e.pending+=e.src[n]),e.pos+=2,!0;if(10===r){for(t||e.push({type:"hardbreak",level:e.level}),n++;n<o&&32===e.src.charCodeAt(n);)n++;return e.pos=n,!0}}return t||(e.pending+="\\"),e.pos++,!0}],["backticks",function(e,t){var r,n,o,s,i,a=e.pos;if(96!==e.src.charCodeAt(a))return!1;for(r=a,a++,n=e.posMax;a<n&&96===e.src.charCodeAt(a);)a++;for(o=e.src.slice(r,a),s=i=a;-1!==(s=e.src.indexOf("`",i));){for(i=s+1;i<n&&96===e.src.charCodeAt(i);)i++;if(i-s===o.length)return t||e.push({type:"code",content:e.src.slice(a,s).replace(/[ \n]+/g," ").trim(),block:!1,level:e.level}),e.pos=i,!0}return t||(e.pending+=o),e.pos+=o.length,!0}],["del",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),126===s)return!1;if(126===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&126===e.src.charCodeAt(n);)n++;if(n>u+3)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),126!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&126!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:"del_open",level:e.level++}),e.parser.tokenize(e),e.push({type:"del_close",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],["ins",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),43===s)return!1;if(43===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&43===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),43!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&43!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:"ins_open",level:e.level++}),e.parser.tokenize(e),e.push({type:"ins_close",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],["mark",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),61===s)return!1;if(61===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&61===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),61!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&61!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:"mark_open",level:e.level++}),e.parser.tokenize(e),e.push({type:"mark_close",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],["emphasis",function(e,t){var r,n,o,s,i,a,u,l=e.posMax,c=e.pos,p=e.src.charCodeAt(c);if(95!==p&&42!==p)return!1;if(t)return!1;if(r=(u=le(e,c)).delims,!u.can_open)return e.pos+=r,t||(e.pending+=e.src.slice(c,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=c+r,a=[r];e.pos<l;)if(e.src.charCodeAt(e.pos)!==p)e.parser.skipToken(e);else{if(n=(u=le(e,e.pos)).delims,u.can_close){for(s=a.pop(),i=n;s!==i;){if(i<s){a.push(s-i);break}if(i-=s,0===a.length)break;e.pos+=s,s=a.pop()}if(0===a.length){r=s,o=!0;break}e.pos+=n;continue}u.can_open&&a.push(n),e.pos+=n}return o?(e.posMax=e.pos,e.pos=c+r,t||(2!==r&&3!==r||e.push({type:"strong_open",level:e.level++}),1!==r&&3!==r||e.push({type:"em_open",level:e.level++}),e.parser.tokenize(e),1!==r&&3!==r||e.push({type:"em_close",level:--e.level}),2!==r&&3!==r||e.push({type:"strong_close",level:--e.level})),e.pos=e.posMax+r,e.posMax=l,!0):(e.pos=c,!1)}],["sub",function(e,t){var r,n,o=e.posMax,s=e.pos;if(126!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\])(\\\\)*\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:"sub",level:e.level,content:n.replace(ce,"$1")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],["sup",function(e,t){var r,n,o=e.posMax,s=e.pos;if(94!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\])(\\\\)*\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:"sup",level:e.level,content:n.replace(pe,"$1")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],["links",function(e,t){var r,n,o,s,i,a,u,l,c=!1,p=e.pos,h=e.posMax,f=e.pos,g=e.src.charCodeAt(f);if(33===g&&(c=!0,g=e.src.charCodeAt(++f)),91!==g)return!1;if(e.level>=e.options.maxNesting)return!1;if(r=f+1,(n=D(e,f))<0)return!1;if((a=n+1)<h&&40===e.src.charCodeAt(a)){for(a++;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a>=h)return!1;for(f=a,q(e,a)?(s=e.linkContent,a=e.pos):s="",f=a;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&f!==a&&F(e,a))for(i=e.linkContent,a=e.pos;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);else i="";if(a>=h||41!==e.src.charCodeAt(a))return e.pos=p,!1;a++}else{if(e.linkLevel>0)return!1;for(;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&91===e.src.charCodeAt(a)&&(f=a+1,(a=D(e,a))>=0?o=e.src.slice(f,a++):a=f-1),o||(void 0===o&&(a=n+1),o=e.src.slice(r,n)),!(u=e.env.references[M(o)]))return e.pos=p,!1;s=u.href,i=u.title}return t||(e.pos=r,e.posMax=n,c?e.push({type:"image",src:s,title:i,alt:e.src.substr(r,n-r),level:e.level}):(e.push({type:"link_open",href:s,title:i,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:"link_close",level:--e.level}))),e.pos=a,e.posMax=h,!0}],["footnote_inline",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;return!(a+2>=i||94!==e.src.charCodeAt(a)||91!==e.src.charCodeAt(a+1)||e.level>=e.options.maxNesting||(r=a+2,(n=D(e,a+1))<0||(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=r,e.posMax=n,e.push({type:"footnote_ref",id:o,level:e.level}),e.linkLevel++,s=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(s)},e.linkLevel--),e.pos=n+1,e.posMax=i,0)))}],["footnote_ref",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;if(a+3>i)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(a))return!1;if(94!==e.src.charCodeAt(a+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(n=a+2;n<i;n++){if(32===e.src.charCodeAt(n))return!1;if(10===e.src.charCodeAt(n))return!1;if(93===e.src.charCodeAt(n))break}return!(n===a+2||n>=i||(n++,r=e.src.slice(a+2,n-1),void 0===e.env.footnotes.refs[":"+r]||(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[":"+r]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:r,count:0},e.env.footnotes.refs[":"+r]=o):o=e.env.footnotes.refs[":"+r],s=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:"footnote_ref",id:o,subId:s,level:e.level})),e.pos=n,e.posMax=i,0)))}],["autolink",function(e,t){var r,n,o,s,i,a=e.pos;return!(60!==e.src.charCodeAt(a)||(r=e.src.slice(a)).indexOf(">")<0||((n=r.match(ge))?he.indexOf(n[1].toLowerCase())<0||(i=B(s=n[0].slice(1,-1)),!e.parser.validateLink(s)||(t||(e.push({type:"link_open",href:i,level:e.level}),e.push({type:"text",content:s,level:e.level+1}),e.push({type:"link_close",level:e.level})),e.pos+=n[0].length,0)):!(o=r.match(fe))||(i=B("mailto:"+(s=o[0].slice(1,-1))),!e.parser.validateLink(i)||(t||(e.push({type:"link_open",href:i,level:e.level}),e.push({type:"text",content:s,level:e.level+1}),e.push({type:"link_close",level:e.level})),e.pos+=o[0].length,0))))}],["htmltag",function(e,t){var r,n,o,s=e.pos;return!(!e.options.html||(o=e.posMax,60!==e.src.charCodeAt(s)||s+2>=o||33!==(r=e.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(e){var t=32|e;return t>=97&&t<=122}(r)||!(n=e.src.slice(s).match(ke))||(t||e.push({type:"htmltag",content:e.src.slice(s,s+n[0].length),level:e.level}),e.pos+=n[0].length,0)))}],["entity",function(e,t){var r,o,s=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(s))return!1;if(s+1<i)if(35===e.src.charCodeAt(s+1)){if(o=e.src.slice(s).match(Ae))return t||(r="x"===o[1][0].toLowerCase()?parseInt(o[1].slice(1),16):parseInt(o[1],10),e.pending+=l(r)?c(r):c(65533)),e.pos+=o[0].length,!0}else if(o=e.src.slice(s).match(ye)){var a=n(o[1]);if(o[1]!==a)return t||(e.pending+=a),e.pos+=o[0].length,!0}return t||(e.pending+="&"),e.pos++,!0}]];function we(){this.ruler=new C;for(var e=0;e<xe.length;e++)this.ruler.push(xe[e][0],xe[e][1]);this.validateLink=Ce}function Ce(e){var t=e.trim().toLowerCase();return-1===(t=g(t)).indexOf(":")||-1===["vbscript","javascript","file","data"].indexOf(t.split(":")[0])}we.prototype.skipToken=function(e){var t,r,n=this.ruler.getRules(""),o=n.length,s=e.pos;if((r=e.cacheGet(s))>0)e.pos=r;else{for(t=0;t<o;t++)if(n[t](e,!0))return void e.cacheSet(s,e.pos);e.pos++,e.cacheSet(s,e.pos)}},we.prototype.tokenize=function(e){for(var t,r,n=this.ruler.getRules(""),o=n.length,s=e.posMax;e.pos<s;){for(r=0;r<o&&!(t=n[r](e,!1));r++);if(t){if(e.pos>=s)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},we.prototype.parse=function(e,t,r,n){var o=new E(e,this,t,r,n);this.tokenize(o)};var Ee={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","replacements","smartquotes","references","abbr2","footnote_tail"]},block:{rules:["blockquote","code","fences","footnote","heading","hr","htmlblock","lheading","list","paragraph","table"]},inline:{rules:["autolink","backticks","del","emphasis","entity","escape","footnote_ref","htmltag","links","newline","text"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","abbr2"]},block:{rules:["blockquote","code","fences","heading","hr","htmlblock","lheading","list","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","htmltag","links","newline","text"]}}}};function De(e,t,r){this.src=t,this.env=r,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function _e(e,t){"string"!=typeof e&&(t=e,e="default"),t&&null!=t.linkify&&console.warn("linkify option is removed. Use linkify plugin instead:\n\nimport Remarkable from 'remarkable';\nimport linkify from 'remarkable/linkify';\nnew Remarkable().use(linkify)\n"),this.inline=new we,this.block=new te,this.core=new G,this.renderer=new w,this.ruler=new C,this.options={},this.configure(Ee[e]),this.set(t||{})}function Be(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}function qe(e,t){for(var r=e.length-1;r>=0;r--)!0===t(e[r])&&e.splice(r,1)}function Fe(e){throw new Error("Unhandled case for value: '"+e+"'")}_e.prototype.set=function(e){i(this.options,e)},_e.prototype.configure=function(e){var t=this;if(!e)throw new Error("Wrong `remarkable` preset, check name/content");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(r){e.components[r].rules&&t[r].ruler.enable(e.components[r].rules,!0)})},_e.prototype.use=function(e,t){return e(this,t),this},_e.prototype.parse=function(e,t){var r=new De(this,e,t);return this.core.process(r),r.tokens},_e.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},_e.prototype.parseInline=function(e,t){var r=new De(this,e,t);return r.inlineMode=!0,this.core.process(r),r.tokens},_e.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var Me=function(){function e(e){void 0===e&&(e={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=e.tagName||"",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||""}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||""},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr("class",e)},e.prototype.addClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);t=s.shift();)-1===Be(o,t)&&o.push(t);return this.getAttrs().class=o.join(" "),this},e.prototype.removeClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);o.length&&(t=s.shift());){var i=Be(o,t);-1!==i&&o.splice(i,1)}return this.getAttrs().class=o.join(" "),this},e.prototype.getClass=function(){return this.getAttrs().class||""},e.prototype.hasClass=function(e){return-1!==(" "+this.getClass()+" ").indexOf(" "+e+" ")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||""},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return["<",e,t=t?" "+t:"",">",this.getInnerHtml(),"</",e,">"].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var e=this.getAttrs(),t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r+'="'+e[r]+'"');return t.join(" ")},e}();var Se=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||""}return e.prototype.build=function(e){return new Me({tagName:"a",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},r=this.createCssClass(e);return r&&(t.class=r),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var r=[t],n=e.getCssClassSuffixes(),o=0,s=n.length;o<s;o++)r.push(t+"-"+n[o]);return r.join(" ")}return""},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var r=t.length,n=t.location;return"smart"===n?function(e,t,r){var n,o;null==r?(r="…",o=3,n=8):(o=r.length,n=r.length);var s=function(e){var t="";return e.scheme&&e.host&&(t+=e.scheme+"://"),e.host&&(t+=e.host),e.path&&(t+="/"+e.path),e.query&&(t+="?"+e.query),e.fragment&&(t+="#"+e.fragment),t},i=function(e,t){var n=t/2,o=Math.ceil(n),s=-1*Math.floor(n),i="";return s<0&&(i=e.substr(s)),e.substr(0,o)+r+i};if(e.length<=t)return e;var a=t-o,u=function(e){var t={},r=e,n=r.match(/^([a-z]+):\/\//i);return n&&(t.scheme=n[1],r=r.substr(n[0].length)),(n=r.match(/^(.*?)(?=(\?|#|\/|$))/i))&&(t.host=n[1],r=r.substr(n[0].length)),(n=r.match(/^\/(.*?)(?=(\?|#|$))/i))&&(t.path=n[1],r=r.substr(n[0].length)),(n=r.match(/^\?(.*?)(?=(#|$))/i))&&(t.query=n[1],r=r.substr(n[0].length)),(n=r.match(/^#(.*?)$/i))&&(t.fragment=n[1]),t}(e);if(u.query){var l=u.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i);l&&(u.query=u.query.substr(0,l[1].length),e=s(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\./,""),e=s(u)),e.length<=t)return e;var c="";if(u.host&&(c+=u.host),c.length>=a)return u.host.length==t?(u.host.substr(0,t-o)+r).substr(0,a+n):i(c,a).substr(0,a+n);var p="";if(u.path&&(p+="/"+u.path),u.query&&(p+="?"+u.query),p){if((c+p).length>=a)return(c+p).length==t?(c+p).substr(0,t):(c+i(p,a-c.length)).substr(0,a+n);c+=p}if(u.fragment){var h="#"+u.fragment;if((c+h).length>=a)return(c+h).length==t?(c+h).substr(0,t):(c+i(h,a-c.length)).substr(0,a+n);c+=h}if(u.scheme&&u.host){var f=u.scheme+"://";if((c+f).length<a)return(f+c).substr(0,t)}if(c.length<=t)return c;var g="";return a>0&&(g=c.substr(-1*Math.floor(a/2))),(c.substr(0,Math.ceil(a/2))+r+g).substr(0,a+n)}(e,r):"middle"===n?function(e,t,r){if(e.length<=t)return e;var n,o;null==r?(r="…",n=8,o=3):(n=r.length,o=r.length);var s=t-o,i="";return s>0&&(i=e.substr(-1*Math.floor(s/2))),(e.substr(0,Math.ceil(s/2))+r+i).substr(0,s+n)}(e,r):function(e,t,r){return function(e,t,r){var n;return e.length>t&&(null==r?(r="…",n=3):n=r.length,e=e.substring(0,t-n)+r),e}(e,t,r)}(e,r)},e}(),Te=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),Le=function(e,t){return(Le=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function Re(e,t){function r(){this.constructor=e}Le(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var Ne=function(){return(Ne=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},ze=function(e){function t(t){var r=e.call(this,t)||this;return r.email="",r.email=t.email,r}return Re(t,e),t.prototype.getType=function(){return"email"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return"mailto:"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(Te),Pe=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName="",r.hashtag="",r.serviceName=t.serviceName,r.hashtag=t.hashtag,r}return Re(t,e),t.prototype.getType=function(){return"hashtag"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case"twitter":return"https://twitter.com/hashtag/"+t;case"facebook":return"https://www.facebook.com/hashtag/"+t;case"instagram":return"https://instagram.com/explore/tags/"+t;default:throw new Error("Unknown service name to point hashtag to: "+e)}},t.prototype.getAnchorText=function(){return"#"+this.hashtag},t}(Te),je=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName="twitter",r.mention="",r.mention=t.mention,r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.getType=function(){return"mention"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case"twitter":return"https://twitter.com/"+this.mention;case"instagram":return"https://instagram.com/"+this.mention;case"soundcloud":return"https://soundcloud.com/"+this.mention;default:throw new Error("Unknown service name to point mention to: "+this.serviceName)}},t.prototype.getAnchorText=function(){return"@"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),r=this.getServiceName();return r&&t.push(r),t},t}(Te),Ie=function(e){function t(t){var r=e.call(this,t)||this;return r.number="",r.plusSign=!1,r.number=t.number,r.plusSign=t.plusSign,r}return Re(t,e),t.prototype.getType=function(){return"phone"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return"tel:"+(this.plusSign?"+":"")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(Te),Oe=function(e){function t(t){var r=e.call(this,t)||this;return r.url="",r.urlMatchType="scheme",r.protocolUrlMatch=!1,r.protocolRelativeMatch=!1,r.stripPrefix={scheme:!0,www:!0},r.stripTrailingSlash=!0,r.decodePercentEncoding=!0,r.schemePrefixRegex=/^(https?:\/\/)?/i,r.wwwPrefixRegex=/^(https?:\/\/)?(www\.)?/i,r.protocolRelativeRegex=/^\/\//,r.protocolPrepended=!1,r.urlMatchType=t.urlMatchType,r.url=t.url,r.protocolUrlMatch=t.protocolUrlMatch,r.protocolRelativeMatch=t.protocolRelativeMatch,r.stripPrefix=t.stripPrefix,r.stripTrailingSlash=t.stripTrailingSlash,r.decodePercentEncoding=t.decodePercentEncoding,r}return Re(t,e),t.prototype.getType=function(){return"url"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url="http://"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&/g,"&")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,"")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,"$1")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,"")},t.prototype.removeTrailingSlash=function(e){return"/"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,""").replace(/%26/gi,"&").replace(/%27/gi,"'").replace(/%3C/gi,"<").replace(/%3E/gi,">");try{return decodeURIComponent(t)}catch(e){return t}},t}(Te),Ue=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},He=/[A-Za-z]/,Ve=/[0-9]/,Ge=/\s/,$e=/['"]/,Ze=/[\x00-\x1F\x7F]/,We=/A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source,Je=We+/\u00a9\u00ae\u2000-\u3300\ud83c\ud000-\udfff\ud83d\ud000-\udfff\ud83e\ud000-\udfff/.source+/\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source,Ye=/0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source,Ke=Je+Ye,Qe=Je+Ye,Xe="(?:["+Ye+"]{1,3}\\.){3}["+Ye+"]{1,3}",et="["+Qe+"](?:["+Qe+"\\-]{0,61}["+Qe+"])?",tt=function(e){return"(?=("+et+"))\\"+e},rt=function(e){return"(?:"+tt(e)+"(?:\\."+tt(e+1)+"){0,126}|"+Xe+")"},nt=new RegExp("["+Qe+"]"),ot=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,st=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=new RegExp("["+Qe+"!#$%&'*+/=?^_`{|}~-]"),t.strictTldRegex=new RegExp("^"+ot.source+"$"),t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,r=this.localPartCharRegex,n=this.strictTldRegex,o=[],s=e.length,i=new it,a={m:"a",a:"i",i:"l",l:"t",t:"o",o:":"},u=0,l=0,c=i;u<s;){var p=e.charAt(u);switch(l){case 0:h(p);break;case 1:f(e.charAt(u-1),p);break;case 2:g(p);break;case 3:d(p);break;case 4:m(p);break;case 5:b(p);break;case 6:v(p);break;case 7:k(p);break;default:Fe(l)}u++}return x(),o;function h(e){"m"===e?A(1):r.test(e)&&A()}function f(e,t){":"===e?r.test(t)?(l=2,c=new it(Ne({},c,{hasMailtoPrefix:!0}))):y():a[e]===t||(r.test(t)?l=2:"."===t?l=3:"@"===t?l=4:y())}function g(e){"."===e?l=3:"@"===e?l=4:r.test(e)||y()}function d(e){"."===e?y():"@"===e?y():r.test(e)?l=2:y()}function m(e){nt.test(e)?l=5:y()}function b(e){"."===e?l=7:"-"===e?l=6:nt.test(e)||x()}function v(e){"-"===e||"."===e?x():nt.test(e)?l=5:x()}function k(e){"."===e||"-"===e?x():nt.test(e)?(l=5,c=new it(Ne({},c,{hasDomainDot:!0}))):x()}function A(e){void 0===e&&(e=2),l=e,c=new it({idx:u})}function y(){l=0,c=i}function x(){if(c.hasDomainDot){var r=e.slice(c.idx,u);/[-.]$/.test(r)&&(r=r.slice(0,-1));var s=c.hasMailtoPrefix?r.slice("mailto:".length):r;(function(e){var t=(e.split(".").pop()||"").toLowerCase();return n.test(t)})(s)&&o.push(new ze({tagBuilder:t,matchedText:r,offset:c.idx,email:s}))}y()}},t}(Ue),it=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},at=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split("://")[1]),t.split("/")[0].indexOf("..")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),r=t&&t[0].toLowerCase();return"javascript:"!==r&&"vbscript:"!==r},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf("."))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&!this.hasWordCharAfterProtocolRegex.test(e)},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+We+"]"),e.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,e}(),ut=function(e){function t(t){var r,n=e.call(this,t)||this;return n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.matcherRegex=(r=new RegExp("[/?#](?:["+Qe+"\\-+&@#/%=~_()|'$*\\[\\]?!:,.;✓]*["+Qe+"\\-+&@#/%=~_()|'$*\\[\\]✓])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,rt(2),")","|","(","(//)?",/(?:www\.)/.source,rt(6),")","|","(","(//)?",rt(10)+"\\.",ot.source,"(?![-"+Ke+"])",")",")","(?::[0-9]+)?","(?:"+r.source+")?"].join(""),"gi")),n.wordCharRegExp=new RegExp("["+Qe+"]"),n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.stripPrefix,o=this.stripTrailingSlash,s=this.decodePercentEncoding,i=this.tagBuilder,a=[],u=function(){var r=t[0],u=t[1],c=t[4],p=t[5],h=t[9],f=t.index,g=p||h,d=e.charAt(f-1);if(!at.isValid(r,u))return"continue";if(f>0&&"@"===d)return"continue";if(f>0&&g&&l.wordCharRegExp.test(d))return"continue";if(/\?$/.test(r)&&(r=r.substr(0,r.length-1)),l.matchHasUnbalancedClosingParen(r))r=r.substr(0,r.length-1);else{var m=l.matchHasInvalidCharAfterTld(r,u);m>-1&&(r=r.substr(0,m))}var b=["http://","https://"].find(function(e){return!!u&&-1!==u.indexOf(e)});if(b){var v=r.indexOf(b);r=r.substr(v),u=u.substr(v),f+=v}var k=u?"scheme":c?"www":"tld",A=!!u;a.push(new Oe({tagBuilder:i,matchedText:r,offset:f,urlMatchType:k,url:r,protocolUrlMatch:A,protocolRelativeMatch:!!g,stripPrefix:n,stripTrailingSlash:o,decodePercentEncoding:s}))},l=this;null!==(t=r.exec(e));)u();return a},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,r=e.charAt(e.length-1);if(")"===r)t="(";else{if("]"!==r)return!1;t="["}for(var n=0,o=0,s=e.length-1;o<s;o++){var i=e.charAt(o);i===t?n++:i===r&&(n=Math.max(n-1,0))}return 0===n},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var r=0;t&&(r=e.indexOf(":"),e=e.slice(r));var n=new RegExp("^((.?//)?[-."+Qe+"]*[-"+Qe+"]\\.[-"+Qe+"]+)").exec(e);return null===n?-1:(r+=n[1].length,e=e.slice(n[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(e)?r:-1)},t}(Ue),lt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName="twitter",r.matcherRegex=new RegExp("#[_"+Qe+"]{1,139}(?![_"+Qe+"])","g"),r.nonWordCharRegex=new RegExp("[^"+Qe+"]"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.nonWordCharRegex,o=this.serviceName,s=this.tagBuilder,i=[];null!==(t=r.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||n.test(u)){var l=t[0],c=t[0].slice(1);i.push(new Pe({tagBuilder:s,matchedText:l,offset:a,serviceName:o,hashtag:c}))}}return i},t}(Ue),ct=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/g,t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.tagBuilder,o=[];null!==(t=r.exec(e));){var s=t[0],i=s.replace(/[^0-9,;#]/g,""),a=!(!t[1]&&!t[2]),u=0==t.index?"":e.substr(t.index-1,1),l=e.substr(t.index+s.length,1),c=!u.match(/\d/)&&!l.match(/\d/);this.testMatch(t[3])&&this.testMatch(s)&&c&&o.push(new Ie({tagBuilder:n,matchedText:s,offset:t.index,number:i,plusSign:a}))}return o},t.prototype.testMatch=function(e){return/\D/.test(e)},t}(Ue),pt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName="twitter",r.matcherRegexes={twitter:new RegExp("@[_"+Qe+"]{1,50}(?![_"+Qe+"])","g"),instagram:new RegExp("@[_."+Qe+"]{1,30}(?![_"+Qe+"])","g"),soundcloud:new RegExp("@[-_."+Qe+"]{1,50}(?![-_"+Qe+"])","g")},r.nonWordCharRegex=new RegExp("[^"+Qe+"]"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){var t,r=this.serviceName,n=this.matcherRegexes[this.serviceName],o=this.nonWordCharRegex,s=this.tagBuilder,i=[];if(!n)return i;for(;null!==(t=n.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||o.test(u)){var l=t[0].replace(/\.+$/g,""),c=l.slice(1);i.push(new je({tagBuilder:s,matchedText:l,offset:a,serviceName:r,mention:c}))}}return i},t}(Ue);function ht(e,t){for(var r=t.onOpenTag,n=t.onCloseTag,o=t.onText,s=t.onComment,i=t.onDoctype,a=new ft,u=0,l=e.length,c=0,p=0,h=a;u<l;){var f=e.charAt(u);switch(c){case 0:g(f);break;case 1:d(f);break;case 2:b(f);break;case 3:m(f);break;case 4:v(f);break;case 5:k(f);break;case 6:A(f);break;case 7:y(f);break;case 8:x(f);break;case 9:w(f);break;case 10:C(f);break;case 11:E(f);break;case 12:D(f);break;case 13:_();break;case 14:B(f);break;case 15:q(f);break;case 16:F(f);break;case 17:M(f);break;case 18:S(f);break;case 19:T(f);break;case 20:L(f);break;default:Fe(c)}u++}function g(e){"<"===e&&N()}function d(e){"!"===e?c=13:"/"===e?(c=2,h=new ft(Ne({},h,{isClosing:!0}))):"<"===e?N():He.test(e)?(c=3,h=new ft(Ne({},h,{isOpening:!0}))):(c=0,h=a)}function m(e){Ge.test(e)?(h=new ft(Ne({},h,{name:P()})),c=4):"<"===e?N():"/"===e?(h=new ft(Ne({},h,{name:P()})),c=12):">"===e?(h=new ft(Ne({},h,{name:P()})),z()):He.test(e)||Ve.test(e)||":"===e||R()}function b(e){">"===e?R():He.test(e)?c=3:R()}function v(e){Ge.test(e)||("/"===e?c=12:">"===e?z():"<"===e?N():"="===e||$e.test(e)||Ze.test(e)?R():c=5)}function k(e){Ge.test(e)?c=6:"/"===e?c=12:"="===e?c=7:">"===e?z():"<"===e?N():$e.test(e)&&R()}function A(e){Ge.test(e)||("/"===e?c=12:"="===e?c=7:">"===e?z():"<"===e?N():$e.test(e)?R():c=5)}function y(e){Ge.test(e)||('"'===e?c=8:"'"===e?c=9:/[>=`]/.test(e)?R():"<"===e?N():c=10)}function x(e){'"'===e&&(c=11)}function w(e){"'"===e&&(c=11)}function C(e){Ge.test(e)?c=4:">"===e?z():"<"===e&&N()}function E(e){Ge.test(e)?c=4:"/"===e?c=12:">"===e?z():"<"===e?N():(c=4,u--)}function D(e){">"===e?(h=new ft(Ne({},h,{isClosing:!0})),z()):c=4}function _(t){"--"===e.substr(u,2)?(u+=2,h=new ft(Ne({},h,{type:"comment"})),c=14):"DOCTYPE"===e.substr(u,7).toUpperCase()?(u+=7,h=new ft(Ne({},h,{type:"doctype"})),c=20):R()}function B(e){"-"===e?c=15:">"===e?R():c=16}function q(e){"-"===e?c=18:">"===e?R():c=16}function F(e){"-"===e&&(c=17)}function M(e){c="-"===e?18:16}function S(e){">"===e?z():"!"===e?c=19:"-"===e||(c=16)}function T(e){"-"===e?c=17:">"===e?z():c=16}function L(e){">"===e?z():"<"===e&&N()}function R(){c=0,h=a}function N(){c=1,h=new ft({idx:u})}function z(){var t=e.slice(p,h.idx);t&&o(t,p),"comment"===h.type?s(h.idx):"doctype"===h.type?i(h.idx):(h.isOpening&&r(h.name,h.idx),h.isClosing&&n(h.name,h.idx)),R(),p=u+1}function P(){var t=h.idx+(h.isClosing?2:1);return e.slice(t,u).toLowerCase()}p<u&&function(){var t=e.slice(p,u);o(t,p),p=u+1}()}var ft=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||"tag",this.name=e.name||"",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},gt=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email="boolean"==typeof t.email?t.email:this.email,this.phone="boolean"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow="boolean"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash="boolean"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding="boolean"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding;var r=this.mention;if(!1!==r&&"twitter"!==r&&"instagram"!==r&&"soundcloud"!==r)throw new Error("invalid `mention` cfg - see docs");var n=this.hashtag;if(!1!==n&&"twitter"!==n&&"facebook"!==n&&"instagram"!==n)throw new Error("invalid `hashtag` cfg - see docs");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,r){return new e(r).link(t)},e.parse=function(t,r){return new e(r).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),"boolean"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:"boolean"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:"boolean"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:"boolean"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),"boolean"==typeof e?{scheme:e,www:e}:{scheme:"boolean"!=typeof e.scheme||e.scheme,www:"boolean"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return"number"==typeof e?{length:e,location:"end"}:function(e,t){for(var r in t)t.hasOwnProperty(r)&&void 0===e[r]&&(e[r]=t[r]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:"end"})},e.prototype.parse=function(e){var t=this,r=["a","style","script"],n=0,o=[];return ht(e,{onOpenTag:function(e){r.indexOf(e)>=0&&n++},onText:function(e,r){if(0===n){var s=function(e,t){if(!t.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var r,n=[],o=0;r=t.exec(e);)n.push(e.substring(o,r.index)),n.push(r[0]),o=r.index+r[0].length;return n.push(e.substring(o)),n}(e,/( | |<|<|>|>|"|"|')/gi),i=r;s.forEach(function(e,r){if(r%2==0){var n=t.parseText(e,i);o.push.apply(o,n)}i+=e.length})}},onCloseTag:function(e){r.indexOf(e)>=0&&(n=Math.max(n-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort(function(e,t){return e.getOffset()-t.getOffset()});for(var t=0;t<e.length-1;t++){var r=e[t],n=r.getOffset(),o=r.getMatchedText().length,s=n+o;if(t+1<e.length){if(e[t+1].getOffset()===n){var i=e[t+1].getMatchedText().length>o?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()<s&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||qe(e,function(e){return"hashtag"===e.getType()}),this.email||qe(e,function(e){return"email"===e.getType()}),this.phone||qe(e,function(e){return"phone"===e.getType()}),this.mention||qe(e,function(e){return"mention"===e.getType()}),this.urls.schemeMatches||qe(e,function(e){return"url"===e.getType()&&"scheme"===e.getUrlMatchType()}),this.urls.wwwMatches||qe(e,function(e){return"url"===e.getType()&&"www"===e.getUrlMatchType()}),this.urls.tldMatches||qe(e,function(e){return"url"===e.getType()&&"tld"===e.getUrlMatchType()}),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var r=this.getMatchers(),n=[],o=0,s=r.length;o<s;o++){for(var i=r[o].parseMatches(e),a=0,u=i.length;a<u;a++)i[a].setOffset(t+i[a].getOffset());n.push.apply(n,i)}return n},e.prototype.link=function(e){if(!e)return"";for(var t=this.parse(e),r=[],n=0,o=0,s=t.length;o<s;o++){var i=t[o];r.push(e.substring(n,i.getOffset())),r.push(this.createMatchReturnVal(i)),n=i.getOffset()+i.getMatchedText().length}return r.push(e.substring(n)),r.join("")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),"string"==typeof t?t:!1===t?e.getMatchedText():t instanceof Me?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new lt({tagBuilder:e,serviceName:this.hashtag}),new st({tagBuilder:e}),new ct({tagBuilder:e}),new pt({tagBuilder:e,serviceName:this.mention}),new ut({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new Se({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version="3.11.0",e.AnchorTagBuilder=Se,e.HtmlTag=Me,e.matcher={Email:st,Hashtag:lt,Matcher:Ue,Mention:pt,Phone:ct,Url:ut},e.match={Email:ze,Hashtag:Pe,Match:Te,Mention:je,Phone:Ie,Url:Oe},e}(),dt=/www|@|\:\/\//;function mt(e){return/^<\/a\s*>/i.test(e)}function bt(){var e=[],t=new gt({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case"url":e.push({text:t.matchedText,url:t.getUrl()});break;case"email":e.push({text:t.matchedText,url:"mailto:"+t.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:e,autolinker:t}}function vt(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d=e.tokens,m=null;for(r=0,n=d.length;r<n;r++)if("inline"===d[r].type)for(p=0,t=(o=d[r].children).length-1;t>=0;t--)if("link_close"!==(s=o[t]).type){if("htmltag"===s.type&&(g=s.content,/^<a[>\s]/i.test(g)&&p>0&&p--,mt(s.content)&&p++),!(p>0)&&"text"===s.type&&dt.test(s.content)){if(m||(h=(m=bt()).links,f=m.autolinker),i=s.content,h.length=0,f.link(i),!h.length)continue;for(a=[],c=s.level,u=0;u<h.length;u++)e.inline.validateLink(h[u].url)&&((l=i.indexOf(h[u].text))&&a.push({type:"text",content:i.slice(0,l),level:c}),a.push({type:"link_open",href:h[u].url,title:"",level:c++}),a.push({type:"text",content:h[u].text,level:c}),a.push({type:"link_close",level:--c}),i=i.slice(l+h[u].text.length));i.length&&a.push({type:"text",content:i,level:c}),d[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1))}}else for(t--;o[t].level!==s.level&&"link_open"!==o[t].type;)t--}e.Remarkable=_e,e.linkify=function(e){e.core.ruler.push("linkify",vt)},e.utils=A,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/plugins/tiddlywiki/markdown/files/tiddlywiki.files b/plugins/tiddlywiki/markdown/files/tiddlywiki.files index 3d3c84ebc..b6bb6fc7d 100755 --- a/plugins/tiddlywiki/markdown/files/tiddlywiki.files +++ b/plugins/tiddlywiki/markdown/files/tiddlywiki.files @@ -1,10 +1,10 @@ { "tiddlers": [ { - "file": "markdown.js", + "file": "remarkable.js", "fields": { "type": "application/javascript", - "title": "$:/plugins/tiddlywiki/markdown/markdown.js", + "title": "$:/plugins/tiddlywiki/markdown/remarkable.js", "module-type": "library" } } diff --git a/plugins/tiddlywiki/markdown/readme.tid b/plugins/tiddlywiki/markdown/readme.tid index 328361807..ef3a4df46 100755 --- a/plugins/tiddlywiki/markdown/readme.tid +++ b/plugins/tiddlywiki/markdown/readme.tid @@ -1,6 +1,6 @@ title: $:/plugins/tiddlywiki/markdown/readme -This is a TiddlyWiki plugin for parsing Markdown text, based on the [[markdown-js|https://github.com/evilstreak/markdown-js]] project from Dominic Baggott. +This is a TiddlyWiki plugin for parsing Markdown text, using the [[Remarkable|https://github.com/jonschlinkert/remarkable]] library. It is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js. diff --git a/plugins/tiddlywiki/markdown/usage.tid b/plugins/tiddlywiki/markdown/usage.tid index 089ac438f..90724878a 100755 --- a/plugins/tiddlywiki/markdown/usage.tid +++ b/plugins/tiddlywiki/markdown/usage.tid @@ -1,15 +1,15 @@ title: $:/plugins/tiddlywiki/markdown/usage -! Markdown Dialects - -By default the markdown parser recognises the original dialect of Markdown [[as described by John Gruber|http://daringfireball.net/projects/markdown/]]. An extended dialect called "Maruku" is also included that provides table support and other advanced features. The syntax extensions are modelled on those of [[PHP Markdown Extra|https://michelf.ca/projects/php-markdown/extra/]]. - -The configuration tiddler [[$:/config/markdown/dialect]] determines which dialect is used: - -|!Dialect |!Description | -|Gruber |Standard Markdown | -|Maruku |Extended Maruku Markdown | +! Plugin Configuration +|!Config |!Default |!Description | +| <code>[[breaks|$:/config/markdown/breaks]]</code>| ``false``|Remarkable library config: Convert '\n' in paragraphs into ``<br>`` | +| <code>[[linkify|$:/config/markdown/linkify]]</code>| ``false``|Remarkable library config: Autoconvert URL-like text to links | +| <code>[[linkNewWindow|$:/config/markdown/linkNewWindow]]</code>| ``true``|For external links, should clicking on them open a new window/tab automatically? | +| <code>[[quotes|$:/config/markdown/quotes]]</code>| ``“”‘’``|Remarkable library config: Double + single quotes replacement pairs, when ``typographer`` enabled | +| <code>[[renderWikiText|$:/config/markdown/renderWikiText]]</code>| ``true``|After Markdown is parsed, should any text elements be handed off to the ~WikiText parser for further processing? | +| <code>[[renderWikiTextPragma|$:/config/markdown/renderWikiTextPragma]]</code>| ``\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock``|When handing off to the ~WikiText parser, what pragma rules should it follow? | +| <code>[[typographer|$:/config/markdown/typographer]]</code>| ``false``|Remarkable library config: Enable some language-neutral replacement + quotes beautification | ! Creating ~WikiLinks @@ -19,6 +19,12 @@ Create wiki links with the usual Markdown link syntax targeting `#` and the targ [link text](#TiddlerTitle) ``` +If the target tiddler has a space in its name, that name must be URL-escaped to be detected as a URL: + +``` +[link text](#Test%20Tiddler) +``` + ! Images Markdown image syntax can be used to reference images by tiddler title or an external URI. For example: diff --git a/plugins/tiddlywiki/markdown/wrapper.js b/plugins/tiddlywiki/markdown/wrapper.js index 0eab2e200..5c048f6d6 100755 --- a/plugins/tiddlywiki/markdown/wrapper.js +++ b/plugins/tiddlywiki/markdown/wrapper.js @@ -3,7 +3,7 @@ title: $:/plugins/tiddlywiki/markdown/wrapper.js type: application/javascript module-type: parser -Wraps up the markdown-js parser for use in TiddlyWiki5 +Wraps up the remarkable parser for use as a Parser in TiddlyWiki \*/ (function(){ @@ -12,78 +12,211 @@ Wraps up the markdown-js parser for use in TiddlyWiki5 /*global $tw: false */ "use strict"; -var markdown = require("$:/plugins/tiddlywiki/markdown/markdown.js"); +const { Remarkable, linkify, utils } = require("$:/plugins/tiddlywiki/markdown/remarkable.js"); -var CONFIG_DIALECT_TIDDLER = "$:/config/markdown/dialect", - DEFAULT_DIALECT = "Gruber"; - -function transformNodes(nodes) { - var results = []; - for(var index=0; index<nodes.length; index++) { - results.push(transformNode(nodes[index])); - } - return results; +///// Set up configuration options ///// +function parseAsBoolean(tiddlerName) { + return $tw.wiki.getTiddlerText(tiddlerName).toLowerCase() === "true"; } - -function transformNode(node) { - if($tw.utils.isArray(node)) { - var p = 0, - widget = {type: "element", tag: node[p++]}; - if(!$tw.utils.isArray(node[p]) && typeof(node[p]) === "object") { - widget.attributes = {}; - $tw.utils.each(node[p++],function(value,name) { - widget.attributes[name] = {type: "string", value: value}; - }); - } - widget.children = transformNodes(node.slice(p++)); - // Massage images into the image widget - if(widget.tag === "img") { - widget.type = "image"; - if(widget.attributes.alt) { - widget.attributes.tooltip = widget.attributes.alt; - delete widget.attributes.alt; - } - if(widget.attributes.src) { - widget.attributes.source = widget.attributes.src; - delete widget.attributes.src; - } - } - // Convert internal links to proper wikilinks - if (widget.tag === "a" && widget.attributes.href.value[0] === "#") { - widget.type = "link"; - widget.attributes.to = widget.attributes.href; - if (widget.attributes.to.type === "string") { - //Remove '#' before conversion to wikilink - widget.attributes.to.value = widget.attributes.to.value.substr(1); - } - //Children is fine - delete widget.tag; - delete widget.attributes.href; - } - return widget; - } else { - return {type: "text", text: node}; - } -} - -var MarkdownParser = function(type,text,options) { - var dialect = options.wiki.getTiddlerText(CONFIG_DIALECT_TIDDLER,DEFAULT_DIALECT), - markdownTree = markdown.toHTMLTree(text,dialect), - node = $tw.utils.isArray(markdownTree[1]) ? markdownTree.slice(1) : markdownTree.slice(2); - this.tree = transformNodes(node); +var pluginOpts = { + linkNewWindow: parseAsBoolean("$:/config/markdown/linkNewWindow"), + renderWikiText: parseAsBoolean("$:/config/markdown/renderWikiText"), + renderWikiTextPragma: $tw.wiki.getTiddlerText("$:/config/markdown/renderWikiTextPragma").trim() +}; +var remarkableOpts = { + breaks: parseAsBoolean("$:/config/markdown/breaks"), + quotes: $tw.wiki.getTiddlerText("$:/config/markdown/quotes"), + typographer: parseAsBoolean("$:/config/markdown/typographer") }; -/* +var md = new Remarkable(remarkableOpts); -[ 'html', - [ 'p', 'something' ], - [ 'h1', - 'heading and ', - [ 'strong', 'other' ] ] ] +if (parseAsBoolean("$:/config/markdown/linkify")) { + md = md.use(linkify); +} -*/ +function findTagWithType(nodes, startPoint, type, level) { + for (var i = startPoint; i < nodes.length; i++) { + if (nodes[i].type === type && nodes[i].level === level) { + return i; + } + } + return false; +} + +/** + * Remarkable creates nodes that look like: + * [ + * { type: 'paragraph_open'}, + * { type: 'inline', content: 'Hello World', children:[{type: 'text', content: 'Hello World'}]}, + * { type: 'paragraph_close'} + * ] + * + * But TiddlyWiki wants the Parser (https://tiddlywiki.com/dev/static/Parser.html) to emit nodes like: + * + * [ + * { type: 'element', tag: 'p', children: [{type: 'text', text: 'Hello World'}]} + * ] + */ +function convertNodes(remarkableTree, isStartOfInline) { + let out = []; + + function wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) { + var j = findTagWithType(nodes, currentIndex + 1, closingType, currentLevel); + if (j === false) { + console.error("Failed to find a " + closingType + " node after position " + currentIndex); + console.log(nodes); + return currentIndex + 1; + } + let children = convertNodes(nodes.slice(currentIndex + 1, j)); + + out.push({ + type: "element", + tag: elementTag, + children: children + }); + return j; + } + + for (var i = 0; i < remarkableTree.length; i++) { + var currentNode = remarkableTree[i]; + if (currentNode.type === "paragraph_open") { + i = wrappedElement("p", i, currentNode.level, "paragraph_close", remarkableTree); + } else if (currentNode.type === "heading_open") { + i = wrappedElement("h" + currentNode.hLevel, i, currentNode.level, "heading_close", remarkableTree); + } else if (currentNode.type === "bullet_list_open") { + i = wrappedElement("ul", i, currentNode.level, "bullet_list_close", remarkableTree); + } else if (currentNode.type == 'ordered_list_open') { + i = wrappedElement('ol', i, currentNode.level,'ordered_list_close', remarkableTree); + } else if (currentNode.type === "list_item_open") { + i = wrappedElement("li", i, currentNode.level, "list_item_close", remarkableTree); + } else if (currentNode.type === "link_open") { + var j = findTagWithType(remarkableTree, i + 1, "link_close", currentNode.level); + + if (currentNode.href[0] !== "#") { + // External link + var attributes = { + href: { type: "string", value: currentNode.href } + }; + if (pluginOpts.linkNewWindow) { + attributes.target = { type: "string", value: "_blank" }; + } + out.push({ + type: "element", + tag: "a", + attributes: attributes, + children: convertNodes(remarkableTree.slice(i + 1, j)) + }); + } else { + // Internal link + out.push({ + type: "link", + attributes: { + to: { type: "string", value: decodeURI(currentNode.href.substr(1)) } + }, + children: convertNodes(remarkableTree.slice(i + 1, j)) + }); + } + i = j; + } else if (currentNode.type.substr(currentNode.type.length - 5) === "_open") { + var tagName = currentNode.type.substr(0, currentNode.type.length - 5); + i = wrappedElement(tagName, i, currentNode.level, tagName + "_close", remarkableTree); + } else if (currentNode.type === "code") { + out.push({ + type: "element", + tag: currentNode.block ? "pre" : "code", + children: [{ type: "text", text: currentNode.content }] + }); + } else if (currentNode.type === "fence") { + out.push({ + type: "codeblock", + attributes: { + language: { type: "string", value: currentNode.params }, + code: { type: "string", value: currentNode.content } + } + }); + } else if (currentNode.type === "image") { + out.push({ + type: "image", + attributes: { + tooltip: { type: "string", value: currentNode.alt }, + source: { type: "string", value: currentNode.src } + } + }); + } else if (currentNode.type === "softbreak") { + out.push({ + type: "element", + tag: "br", + }); + } else if (currentNode.type == 'hr') { + out.push({ + type: 'element', + tag: 'hr', + }); + } else if (currentNode.type === "inline") { + out = out.concat(convertNodes(currentNode.children, true)); + } else if (currentNode.type === "text") { + if (!pluginOpts.renderWikiText) { + out.push({ + type: "text", + text: currentNode.content + }); + } else { + // The Markdown compiler thinks this is just text. + // Hand off to the WikiText parser to see if there's more to render + + // If we're inside a block element (div, p, td, h1), and this is the first child in the tree, + // handle as a block-level parse. Otherwise not. + var parseAsInline = !(isStartOfInline && i === 0); + var textToParse = currentNode.content; + if (pluginOpts.renderWikiTextPragma !== "") { + textToParse = pluginOpts.renderWikiTextPragma + "\n" + textToParse; + } + var wikiParser = $tw.wiki.parseText("text/vnd.tiddlywiki", textToParse, { + parseAsInline: parseAsInline + }); + var rs = wikiParser.tree; + + // If we parsed as a block, but the root element the WikiText parser gave is a paragraph, + // we should discard the paragraph, since the way Remarkable nests its nodes, this "inline" + // node is always inside something else that's a block-level element + if (!parseAsInline + && rs.length === 1 + && rs[0].type === "element" + && rs[0].tag === "p" + ) { + rs = rs[0].children; + } + + // If the original text element started with a space, add it back in + if (rs.length > 0 + && rs[0].type === "text" + && currentNode.content[0] === " " + ) { + rs[0].text = " " + rs[0].text; + } + out = out.concat(rs); + } + } else { + console.error("Unknown node type: " + currentNode.type, currentNode); + out.push({ + type: "text", + text: currentNode.content + }); + } + } + return out; +} + +var MarkdownParser = function(type, text, options) { + var tree = md.parse(text, {}); + //console.debug(tree); + tree = convertNodes(tree); + //console.debug(tree); + + this.tree = tree; +}; exports["text/x-markdown"] = MarkdownParser; })(); - From 29461403ed5868500ac8e9917e1428a5809ed0d3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 27 Jan 2020 17:59:13 +0000 Subject: [PATCH 0449/2376] Fix bug with navigating via location hash Introduced in 8159c4a8655c4c565baf6078074d1a791b5b81e5, the problem was that it is actually valid for storyTitle and/or historyTitle to be falsey in the Story constructor. --- core/modules/wiki.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index b505f50da..76bb056b3 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1398,10 +1398,8 @@ fromPageRect: page coordinates of the origin of the navigation historyTitle: title of history tiddler (defaults to $:/HistoryList) */ exports.addToHistory = function(title,fromPageRect,historyTitle) { - if(historyTitle) { - var story = new $tw.Story({wiki: this, historyTitle: historyTitle}); - story.addToHistory(title,fromPageRect); - } + var story = new $tw.Story({wiki: this, historyTitle: historyTitle}); + story.addToHistory(title,fromPageRect); }; /* @@ -1412,10 +1410,8 @@ storyTitle: title of story tiddler (defaults to $:/StoryList) options: see story.js */ exports.addToStory = function(title,fromTitle,storyTitle,options) { - if(storyTitle) { - var story = new $tw.Story({wiki: this, storyTitle: storyTitle}); - story.addToStory(title,fromTitle,options); - } + var story = new $tw.Story({wiki: this, storyTitle: storyTitle}); + story.addToStory(title,fromTitle,options); }; /* From 17fb43bd6fadf83b622b8f33ca148c77cebaa76c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 29 Jan 2020 17:09:28 +0000 Subject: [PATCH 0450/2376] Introduction edition: fix some display issues Two of the tiddlers incorporate content dynamically drawn from the core, and so the size of the tiddlers has increased as the core has grown. --- editions/introduction/tiddlers/slides/Translations.tid | 10 ++++------ editions/introduction/tiddlers/system/styles.tid | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/editions/introduction/tiddlers/slides/Translations.tid b/editions/introduction/tiddlers/slides/Translations.tid index 588b400e9..269f2c171 100644 --- a/editions/introduction/tiddlers/slides/Translations.tid +++ b/editions/introduction/tiddlers/slides/Translations.tid @@ -6,14 +6,9 @@ $(languagePluginTitle)$/icon TiddlyWiki is currently available in <$count filter="[[$:/languages/en-GB]] [plugin-type[language]sort[title]] -[[$:/languages/de-AT]]"/> languages: -<div class="tc-drop-down-language-chooser" style="font-size: 10px; line-height: 12px; -moz-columns:2; -webkit-columns:2; columns:2;"> +<div class="tc-drop-down-language-chooser" style="font-size: 7px; line-height: 8px; -moz-columns:6; -webkit-columns:6; columns:6;"> <$list filter="[[$:/languages/en-GB]] [plugin-type[language]sort[title]] -[[$:/languages/de-AT]]"> <div class="tc-language-list"> -<span class="tc-language-list-greeting"> -<$view subtiddler="$:/language/ControlPanel/Basics/Language/Prompt"> -<$view tiddler="$:/language/ControlPanel/Basics/Language/Prompt"/> -</$view> -</span> <span class="tc-language-list-name tc-image-button"> <$set name="languagePluginTitle" value=<<currentTiddler>>> <$transclude subtiddler=<<flag-title>>> @@ -27,6 +22,9 @@ TiddlyWiki is currently available in <$count filter="[[$:/languages/en-GB]] [plu <$view field="title"/> </$view> </$view> +<$view subtiddler="$:/language/ControlPanel/Basics/Language/Prompt"> +<$view tiddler="$:/language/ControlPanel/Basics/Language/Prompt"/> +</$view> </span> </div> </$list> diff --git a/editions/introduction/tiddlers/system/styles.tid b/editions/introduction/tiddlers/system/styles.tid index c5568b835..2f2ef6d6c 100644 --- a/editions/introduction/tiddlers/system/styles.tid +++ b/editions/introduction/tiddlers/system/styles.tid @@ -19,7 +19,8 @@ html body .tc-subtitle { } .tc-view-toolbar-tools { - font-size: 0.7em; + font-size: 0.5em; + line-height: 1.1; } .tc-view-toolbar-tools p { From 35178f41b0fac6384b294b0d13462b988376f85a Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Wed, 29 Jan 2020 18:14:02 +0100 Subject: [PATCH 0451/2376] Docs: Update length Operator.tid (#4428) --- editions/tw5.com/tiddlers/filters/length Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/length Operator.tid b/editions/tw5.com/tiddlers/filters/length Operator.tid index d9cd66b85..c5c034e90 100644 --- a/editions/tw5.com/tiddlers/filters/length Operator.tid +++ b/editions/tw5.com/tiddlers/filters/length Operator.tid @@ -3,7 +3,7 @@ created: 20190613153225735 modified: 20190613153321546 op-input: a [[selection of titles|Title Selection]] op-output: replaces each input title with its length as an integer -op-purpose: returns the lengths of each item in the list +op-purpose: returns the number of characters of each item in the list tags: [[Filter Operators]] title: length Operator type: text/vnd.tiddlywiki From cead051c73a1783714bcc3375ab75010c087921c Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Wed, 29 Jan 2020 18:18:33 +0100 Subject: [PATCH 0452/2376] Docs: Update sign Operator.tid (#4426) --- editions/tw5.com/tiddlers/filters/sign Operator.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/sign Operator.tid b/editions/tw5.com/tiddlers/filters/sign Operator.tid index e25783f92..f44a21b59 100644 --- a/editions/tw5.com/tiddlers/filters/sign Operator.tid +++ b/editions/tw5.com/tiddlers/filters/sign Operator.tid @@ -2,8 +2,8 @@ caption: sign created: 20190613084919354 modified: 20190613085044655 op-input: a [[selection of titles|Title Selection]] -op-output: replaces each input number with -1, 0 or +1 according to whether the number is negative, zero, or positive -op-purpose: return -1, 0 or +1 for a list of numbers according to whether each number is negative, zero, or positive +op-output: replaces each input number with -1, 0 or 1 according to whether the number is negative, zero, or positive +op-purpose: return -1, 0 or 1 for a list of numbers according to whether each number is negative, zero, or positive tags: [[Unary Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] title: sign Operator type: text/vnd.tiddlywiki From 152125f53b9979bfd5511973038b4358d1ef48c4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 30 Jan 2020 12:16:29 +0000 Subject: [PATCH 0453/2376] Railroad plugin: Use message box colours so that they change with the palette --- .../railroad/files/railroad-diagrams.css | 14 ++++++++++---- plugins/tiddlywiki/railroad/files/tiddlywiki.files | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/tiddlywiki/railroad/files/railroad-diagrams.css b/plugins/tiddlywiki/railroad/files/railroad-diagrams.css index 20c720a50..b7bc23f28 100644 --- a/plugins/tiddlywiki/railroad/files/railroad-diagrams.css +++ b/plugins/tiddlywiki/railroad/files/railroad-diagrams.css @@ -1,25 +1,31 @@ +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock + /* CSS modified for TiddlyWiki */ + svg.railroad-diagram { - background-color: hsl(30,20%,98%); + background-color: <<colour background>>; border-radius: 5px; } +/* svg.railroad-diagram:hover { background-color: hsl(30,20%,96%); } +*/ svg.railroad-diagram path, svg.railroad-diagram rect { stroke-width: 2; - stroke: #333; + stroke: <<colour message-border>>; } svg.railroad-diagram path { - fill: rgba(0,0,0,0); + fill: <<colour background>>; } svg.railroad-diagram rect { - fill: hsl(120,100%,90%); + fill: <<colour message-background>>; } svg.railroad-diagram text { font: 14px monospace; text-anchor: middle; + fill: <<colour message-foreground>>; } svg.railroad-diagram text.label { text-anchor: start; diff --git a/plugins/tiddlywiki/railroad/files/tiddlywiki.files b/plugins/tiddlywiki/railroad/files/tiddlywiki.files index f479f394d..3a25325e5 100644 --- a/plugins/tiddlywiki/railroad/files/tiddlywiki.files +++ b/plugins/tiddlywiki/railroad/files/tiddlywiki.files @@ -3,7 +3,7 @@ { "file": "railroad-diagrams.css", "fields": { - "type": "text/css", + "type": "text/vnd.tiddlywiki", "title": "$:/plugins/tiddlywiki/railroad/railroad-diagrams.css", "tags": "$:/tags/Stylesheet" } From 151eed5c819f847c4fa65c6a46e8ae54dece322c Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 30 Jan 2020 13:49:37 +0100 Subject: [PATCH 0454/2376] Docs: fix typos and font-size (#2795) --- editions/tw5.com/tiddlers/License.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/License.tid b/editions/tw5.com/tiddlers/License.tid index 056819430..11a0022bf 100644 --- a/editions/tw5.com/tiddlers/License.tid +++ b/editions/tw5.com/tiddlers/License.tid @@ -6,14 +6,14 @@ tags: About TiddlyWiki is published under a [[permissive BSD 3-Clause License|https://opensource.org/licenses/BSD-3-Clause]] stored in the [[shadow tiddler|ShadowTiddlers]] [[$:/core/copyright.txt]]: -<div style="font-size: 0.5em;line-height:1.4;"> +<div style="font-size: 0.7em;line-height:1.4;"> {{$:/core/copyright.txt}} </div> -In layman's terms, the license says that you can take TiddlyWiki and do anything you want with it without any license fee payment or other legal obligation to the creators of TiddlyWiki or anyone else. The quid pro quo is that there is no warranty or guarantee with open source projects like TiddlyWiki. You can't sue the contributors to TiddlyWiki for any loss or damage due to the use of TiddlyWiki: even if your data is lost due to a tragic chain of circumstances that involves TiddlyWiki. +In layman's terms, the license says that you can take TiddlyWiki and do anything you want with it without any license fee payment or other legal obligation to the creators of ~TiddlyWiki or anyone else. The quid pro quo is that there is no warranty or guarantee with open source projects like ~TiddlyWiki. You can't sue the contributors to ~TiddlyWiki for any loss or damage due to the use of ~TiddlyWiki: even if your data is lost due to a tragic chain of circumstances that involves ~TiddlyWiki. You are respectfully requested that to make an attribution to the project, but there's no obligation to do so. -For the avoidance of doubt, any information that you choose to store within your own copy of TiddlyWiki remains yours; using TiddlyWiki to publish content doesn't change whatever rights you may have to that content. +For the avoidance of doubt, any information that you choose to store within your own copy of ~TiddlyWiki remains yours; using ~TiddlyWiki to publish content doesn't change whatever rights you may have to that content. From ba10b4fb0071aee24168cfaa95b86058b2654123 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 30 Jan 2020 13:50:19 +0100 Subject: [PATCH 0455/2376] Docs: bring tm-fold-xxx message docs on par with the code, that is executed. (#4353) --- .../WidgetMessage_ tm-fold-all-tiddlers.tid | 2 +- .../WidgetMessage_ tm-fold-other-tiddlers.tid | 6 +++--- .../WidgetMessage_ tm-fold-tiddler.tid | 18 +++++++++++++----- .../WidgetMessage_ tm-unfold-all-tiddlers.tid | 8 ++++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-all-tiddlers.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-all-tiddlers.tid index bb2d4a576..d29183a0a 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-all-tiddlers.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-all-tiddlers.tid @@ -1,6 +1,6 @@ caption: tm-fold-all-tiddlers created: 20160424230908388 -modified: 20190205154007291 +modified: 20191028113838596 tags: Messages title: WidgetMessage: tm-fold-all-tiddlers type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-other-tiddlers.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-other-tiddlers.tid index 09fd8a751..af5a3b4eb 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-other-tiddlers.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-other-tiddlers.tid @@ -1,6 +1,6 @@ caption: tm-fold-other-tiddlers created: 20160424232355215 -modified: 20160424233338710 +modified: 20191028113932268 tags: Messages title: WidgetMessage: tm-fold-other-tiddlers type: text/vnd.tiddlywiki @@ -11,8 +11,8 @@ The `tm-fold-other-tiddlers` message folds all tiddlers in the current story lis |param|Title of the tiddler that should be ignored by the fold operation. | |foldedStatePrefix |Prefix for the state tiddler in which the fold state is stored. | -<<.tip "The core uses a foldStatePrefix of '$:/state/folded/' to store the fold states for the default story view.">> -<<.warning "The state tiddlers title is computed as 'foldStatePrefix + TiddlerTitle'. If the foldStatePrefix is not set, it will overwrite the text of the tiddler(s) itself, resulting in data loss. ">> +<<.tip "The core uses a foldStatePrefix of `$:/state/folded/` to store the fold states for the default story view.">> +<<.warning "The state tiddlers title is computed as `foldStatePrefix + TiddlerTitle`. If the foldStatePrefix is not set, it will overwrite the text of the tiddler(s) itself, resulting in data loss. ">> The `tm-fold-other-tiddlers` message is usually generated with the ButtonWidget and is handled by the surrounding NavigatorWidget. diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-tiddler.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-tiddler.tid index 872272128..6d6eee517 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-tiddler.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-fold-tiddler.tid @@ -1,16 +1,24 @@ caption: tm-fold-tiddler created: 20160424232749223 -modified: 20160424233102003 +modified: 20191028113537119 tags: Messages title: WidgetMessage: tm-fold-tiddler type: text/vnd.tiddlywiki -The `tm-fold-tiddler` message folds the tiddler specified in the `param` parameter. It does so by setting the text of a state tiddler to either "<<.value "show">>" or "<<.value "hide">>", according to the fold state. +The `tm-fold-tiddler` message toggles the value of a state tiddler. It does so by setting the text of a state tiddler to either "<<.value "show">>" or "<<.value "hide">>", according to the fold state. |!Name |!Description | -|param|Title of the tiddler that should be folded. If the tiddler is already folded, it will be unfolded instead. | -|foldedStatePrefix |Prefix for the state tiddler in which the fold state is stored. If no state prefix is provided, `tm-fold-tiddler` will do nothing. | +|param |ignored ... foldedState must be used | +|foldedState |State tiddler in which the fold state is stored | -<<.tip "The core uses a foldStatePrefix of '$:/state/folded/' to store the fold states for the default story view.">> +<<.tip "The core uses a foldState prefix of `$:/state/folded/` + `tiddler title` to store the fold states for the default story view.">> The `tm-fold-tiddler` message is usually generated with the ButtonWidget and is handled by the surrounding NavigatorWidget. + +The core $:/core/ui/ViewTemplate defines a global variable `folded-state`, that is used with every tiddler. It's created like this: + +``` +\define folded-state() +$:/state/folded/$(currentTiddler)$ +\end +``` diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unfold-all-tiddlers.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unfold-all-tiddlers.tid index 906d8fabe..db324699e 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unfold-all-tiddlers.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-unfold-all-tiddlers.tid @@ -1,16 +1,16 @@ caption: tm-unfold-all-tiddlers created: 20160424233133261 -modified: 20160424233427308 +modified: 20191028113810219 tags: Messages title: WidgetMessage: tm-unfold-all-tiddlers type: text/vnd.tiddlywiki -The `tm-unfold-all-tiddlers` message unfolds all tiddlers in the current story list. It does so by setting the text of a state tiddler to either "<<.value "show">>" or "<<.value "hide">>", according to the fold state. +The `tm-unfold-all-tiddlers` message unfolds all tiddlers in the current story list. It does so by setting the text of all state tiddlers to: "<<.value "show">>". |!Name |!Description | |foldedStatePrefix |Prefix for the state tiddler in which the fold state is stored. | -<<.tip "The core uses a foldStatePrefix of '$:/state/folded/' to store the fold states for the default story view.">> -<<.warning "The state tiddlers title is computed as 'foldStatePrefix + TiddlerTitle'. If the foldStatePrefix is not set, it will overwrite the text of the tiddler(s) itself, resulting in data loss. ">> +<<.tip "The core uses a foldStatePrefix of `$:/state/folded/` to store the fold states for the default story view.">> +<<.warning "The state tiddlers title is computed as `foldStatePrefix + TiddlerTitle`. If the foldStatePrefix is not set, it will overwrite the text of the tiddler(s) itself, resulting in data loss. ">> The `tm-unfold-all-tiddlers` message is usually generated with the ButtonWidget and is handled by the surrounding NavigatorWidget. From aa817f66d2851206d79dff415a46b9cadb927fd8 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 30 Jan 2020 07:53:26 -0500 Subject: [PATCH 0456/2376] Changed importVariable to store its own variables (#4108) * Changed importVariable to store its ownvariables Before, importVariables was creating a setWidget for every single variable it would find in its tiddlers, and it would create a long-ass call tree. Now, instead, it just accumulates the variables in itself. * Can't use Object.assign Learned the hardway while working on tw5-relink that Object.assign doesn't exist in IE11. Using $tw.utils.extend instead. * Retaining setWidget transclusion flexibility * One more test to verify mixing sets and macros --- core/modules/widgets/importvariables.js | 44 ++++++++--------- editions/test/tiddlers/tests/test-widget.js | 52 +++++++++++++++++++++ 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/core/modules/widgets/importvariables.js b/core/modules/widgets/importvariables.js index 86559ef25..e720dc07b 100644 --- a/core/modules/widgets/importvariables.js +++ b/core/modules/widgets/importvariables.js @@ -37,49 +37,45 @@ ImportVariablesWidget.prototype.render = function(parent,nextSibling) { Compute the internal state of the widget */ ImportVariablesWidget.prototype.execute = function(tiddlerList) { - var self = this; + var widgetPointer = this; // Get our parameters this.filter = this.getAttribute("filter"); // Compute the filter this.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this); // Accumulate the <$set> widgets from each tiddler - var widgetStackStart,widgetStackEnd; - function addWidgetNode(widgetNode) { - if(widgetNode) { - if(!widgetStackStart && !widgetStackEnd) { - widgetStackStart = widgetNode; - widgetStackEnd = widgetNode; - } else { - widgetStackEnd.children = [widgetNode]; - widgetStackEnd = widgetNode; - } - } - } $tw.utils.each(this.tiddlerList,function(title) { - var parser = self.wiki.parseTiddler(title); + var parser = widgetPointer.wiki.parseTiddler(title); if(parser) { var parseTreeNode = parser.tree[0]; while(parseTreeNode && parseTreeNode.type === "set") { - addWidgetNode({ + var node = { type: "set", attributes: parseTreeNode.attributes, params: parseTreeNode.params, isMacroDefinition: parseTreeNode.isMacroDefinition - }); + }; + if (parseTreeNode.isMacroDefinition) { + // Macro definitions can be folded into + // current widget instead of adding + // another link to the chain. + var widget = widgetPointer.makeChildWidget(node); + widget.computeAttributes(); + widget.execute(); + $tw.utils.extend(widgetPointer.variables,widget.variables); + } else { + widgetPointer.makeChildWidgets([node]); + widgetPointer = widgetPointer.children[0]; + } parseTreeNode = parseTreeNode.children && parseTreeNode.children[0]; } } }); - // Add our own children to the end of the pile - var parseTreeNodes; - if(widgetStackStart && widgetStackEnd) { - parseTreeNodes = [widgetStackStart]; - widgetStackEnd.children = this.parseTreeNode.children; + + if (widgetPointer != this) { + widgetPointer.parseTreeNode.children = this.parseTreeNode.children; } else { - parseTreeNodes = this.parseTreeNode.children; + widgetPointer.makeChildWidgets(); } - // Construct the child widgets - this.makeChildWidgets(parseTreeNodes); }; /* diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index 5875a3b44..5983b97dd 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -465,6 +465,58 @@ describe("Widget module", function() { expect(wrapper.innerHTML).toBe("<p>nothing</p>"); }); + /**This test confirms that imported set variables properly refresh + * if they use transclusion for their value. This relates to PR #4108. + */ + it("should refresh imported <$set> widgets", function() { + var wiki = new $tw.Wiki(); + // Add some tiddlers + wiki.addTiddlers([ + {title: "Raw", text: "Initial value"}, + {title: "Macro", text: "<$set name='test' value={{Raw}}>\n\ndummy text</$set>"}, + {title: "Caller", text: text} + ]); + var text = "\\import Macro\n<<test>>"; + var widgetNode = createWidgetNode(parseText(text,wiki),wiki); + // Render the widget node to the DOM + var wrapper = renderWidgetNode(widgetNode); + // Test the rendering + expect(wrapper.innerHTML).toBe("<p>Initial value</p>"); + wiki.addTiddler({title: "Raw", text: "New value"}); + // Refresh + refreshWidgetNode(widgetNode,wrapper,["Raw"]); + expect(wrapper.innerHTML).toBe("<p>New value</p>"); + }); + + it("should can mix setWidgets and macros when importing", function() { + var wiki = new $tw.Wiki(); + // Add some tiddlers + wiki.addTiddlers([ + {title: "A", text: "\\define A() Aval"}, + {title: "B", text: "<$set name='B' value='Bval'>\n\ndummy text</$set>"}, + {title: "C", text: "\\define C() Cval"} + ]); + var text = "\\import A B C\n<<A>> <<B>> <<C>>"; + var widgetNode = createWidgetNode(parseText(text,wiki),wiki); + // Render the widget node to the DOM + var wrapper = renderWidgetNode(widgetNode); + // Test the rendering + expect(wrapper.innerHTML).toBe("<p>Aval Bval Cval</p>"); + }); + + /** Special case. <$importvariables> has different handling if + * it doesn't end up importing any variables. Make sure it + * doesn't forget its childrenNodes. + */ + it("should work when import widget imports nothing", function() { + var wiki = new $tw.Wiki(); + var text = "\\import [prefix[XXX]]\nDon't forget me."; + var widgetNode = createWidgetNode(parseText(text,wiki),wiki); + // Render the widget node to the DOM + var wrapper = renderWidgetNode(widgetNode); + // Test the rendering + expect(wrapper.innerHTML).toBe("<p>Don't forget me.</p>"); + }); }); })(); From 18151cc193e8c0d613663d3ecf6437c63e540c2d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 30 Jan 2020 16:39:38 +0100 Subject: [PATCH 0457/2376] Make "type" input look consistent with "fields" input (#4358) * add class tc-edit-texteditor to type field, trim ... ... whitespace, make look consistent * define width 20% for type input field * add second nbsp; for consistency with type input --- core/ui/EditTemplate/fields.tid | 2 +- core/ui/EditTemplate/type.tid | 3 ++- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 3a6613cb4..15132f585 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -69,7 +69,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <$fieldmangler> <div class="tc-edit-field-add"> <em class="tc-edit"> -<<lingo Fields/Add/Prompt>>  +<<lingo Fields/Add/Prompt>>   </em> <span class="tc-edit-field-add-name"> <$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/> diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 64c941037..ec7ea499d 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -2,8 +2,9 @@ title: $:/core/ui/EditTemplate/type tags: $:/tags/EditTemplate \define lingo-base() $:/language/EditTemplate/ +\whitespace trim <div class="tc-type-selector"><$fieldmangler> -<em class="tc-edit"><<lingo Type/Prompt>></em> <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> +<em class="tc-edit"><<lingo Type/Prompt>></em>  <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> </$fieldmangler></div> <div class="tc-block-dropdown-wrapper"> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 8df02e788..91e2e6b61 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1278,6 +1278,10 @@ html body.tc-body.tc-single-tiddler-window { font-style: normal; } +.tc-type-selector .tc-edit-typeeditor { + width: 20%; +} + .tc-edit-tags { border: 1px solid <<colour tiddler-editor-border>>; padding: 4px 8px 4px 8px; From 69bcb1609a774dd60a106a8d00f10305b0a45ac7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 30 Jan 2020 16:41:21 +0100 Subject: [PATCH 0458/2376] Add whitespace trims to tag-picker macro (#4360) --- core/wiki/macros/tag-picker.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index ac125f068..5358da52a 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -15,12 +15,13 @@ tags: $:/tags/Macro \end \define tag-picker-inner() +\whitespace trim <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> <$edit-text tiddler=<<newTagNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/> </$keyboard> -</span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> +</span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> <$button set="$:/temp/NewTagName" setTo="" class=""> <<add-tag-actions>> @@ -49,6 +50,7 @@ tags: $:/tags/Macro </div> \end \define tag-picker() +\whitespace trim <$list filter="[<newTagNameTiddler>match[]]" emptyMessage=<<tag-picker-inner>>> <$set name="newTagNameTiddler" value=<<qualify "$:/temp/NewTagName">>> <<tag-picker-inner>> From 1bcb381570637a6e02ba6396abb39c46a068e979 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 30 Jan 2020 16:43:02 +0100 Subject: [PATCH 0459/2376] Add optional storyview to list-tagged-draggable macro (#4329) * add optional storyview to list-tagged-draggable macro * Update list.tid --- core/wiki/macros/list.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/macros/list.tid b/core/wiki/macros/list.tid index f6d4b8442..9e8a2ac20 100644 --- a/core/wiki/macros/list.tid +++ b/core/wiki/macros/list.tid @@ -74,11 +74,11 @@ tags: $:/tags/Macro </$set> \end -\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:"div") +\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__>>> +<$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__>>/>"""> <$elementTag$ class="tc-droppable-placeholder"/> From 5d0e4732b22ce4770d1f29dcc1d38c8ba41060eb Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 30 Jan 2020 16:52:33 +0100 Subject: [PATCH 0460/2376] Add "none" as an option in the icon dropdown in tag manager (#4361) * add no-icon option to tagmanager and add ... ... whitespace trims * Update Misc.multids --- core/language/en-GB/Misc.multids | 1 + core/ui/TagManager.tid | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 599b575eb..ee1d0320e 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -66,6 +66,7 @@ SystemTiddlers/Include/Prompt: Include system tiddlers TagManager/Colour/Heading: Colour TagManager/Count/Heading: Count TagManager/Icon/Heading: Icon +TagManager/Icons/None: None TagManager/Info/Heading: Info TagManager/Tag/Heading: Tag Tiddler/DateFormat: DDth MMM YYYY at hh12:0mmam diff --git a/core/ui/TagManager.tid b/core/ui/TagManager.tid index 3f9631e80..3f972a157 100644 --- a/core/ui/TagManager.tid +++ b/core/ui/TagManager.tid @@ -4,6 +4,8 @@ color: #bbb \define lingo-base() $:/language/TagManager/ \define iconEditorTab(type) +\whitespace trim +<$link to=""><<lingo Icons/None>></$link> <$list filter="[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]"> <$link to={{!!title}}> <$transclude/> <$view field="title"/> @@ -11,6 +13,7 @@ color: #bbb </$list> \end \define iconEditor(title) +\whitespace trim <div class="tc-drop-down-wrapper"> <$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class="tc-btn-invisible tc-btn-dropdown">{{$:/core/images/down-arrow}}</$button> <$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type="popup" position="belowleft" text="" default=""> @@ -25,6 +28,7 @@ color: #bbb </div> \end \define toggleButton(state) +\whitespace trim <$reveal stateTitle=<<__state__>> type="match" text="closed" default="closed"> <$button setTitle=<<__state__>> setTo="open" class="tc-btn-invisible tc-btn-dropdown" selectedClass="tc-selected"> {{$:/core/images/info-button}} @@ -36,6 +40,7 @@ color: #bbb </$button> </$reveal> \end +\whitespace trim <table class="tc-tag-manager-table"> <tbody> <tr> From 5bfc66b8e35a07815d1d2a30aaa1d81e484614a3 Mon Sep 17 00:00:00 2001 From: Lee Sheng Long <github@sll.ee> Date: Fri, 31 Jan 2020 03:18:09 +1100 Subject: [PATCH 0461/2376] Signing the CLA (#4424) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index bf375697f..a68b8c1e5 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -381,3 +381,5 @@ Xavier Maysonnave, @xmaysonnave, 2019/11/08 Will Atwood Mitchell, @wam, 2019/12/11 Stefan Krüger, @s-light, 2020/01/04 + +Lee Sheng Long, @s-l-lee, 2020/01/25 From 3eacdc19fdb4ed7ce864a04dd87a5e1c6492daac Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 30 Jan 2020 17:02:14 +0000 Subject: [PATCH 0462/2376] Ensure GitHub and GitLab savers use a default path of `/` if empty The empty string gets a slash appended further down this method. --- core/modules/savers/github.js | 2 +- core/modules/savers/gitlab.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index 08f809d19..a93b9e5ba 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -24,7 +24,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { username = this.wiki.getTiddlerText("$:/GitHub/Username"), password = $tw.utils.getPassword("github"), repo = this.wiki.getTiddlerText("$:/GitHub/Repo"), - path = this.wiki.getTiddlerText("$:/GitHub/Path"), + path = this.wiki.getTiddlerText("$:/GitHub/Path",""), filename = this.wiki.getTiddlerText("$:/GitHub/Filename"), branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "master", endpoint = this.wiki.getTiddlerText("$:/GitHub/ServerURL") || "https://api.github.com", diff --git a/core/modules/savers/gitlab.js b/core/modules/savers/gitlab.js index cce69099c..915545afe 100644 --- a/core/modules/savers/gitlab.js +++ b/core/modules/savers/gitlab.js @@ -25,7 +25,7 @@ GitLabSaver.prototype.save = function(text,method,callback) { username = this.wiki.getTiddlerText("$:/GitLab/Username"), password = $tw.utils.getPassword("gitlab"), repo = this.wiki.getTiddlerText("$:/GitLab/Repo"), - path = this.wiki.getTiddlerText("$:/GitLab/Path"), + path = this.wiki.getTiddlerText("$:/GitLab/Path",""), filename = this.wiki.getTiddlerText("$:/GitLab/Filename"), branch = this.wiki.getTiddlerText("$:/GitLab/Branch") || "master", endpoint = this.wiki.getTiddlerText("$:/GitLab/ServerURL") || "https://gitlab.com/api/v4", From 96eca32b1105416c317101aa91dd284f835a8ba8 Mon Sep 17 00:00:00 2001 From: Lee Sheng Long <github@sll.ee> Date: Fri, 31 Jan 2020 20:13:28 +1100 Subject: [PATCH 0463/2376] Add download button/link to binary tiddler warning banners in view and edit mode (#4423) --- core/modules/parsers/binaryparser.js | 55 +++++++++++++++++++++++++--- core/modules/widgets/edit-binary.js | 55 +++++++++++++++++++++++++--- core/ui/BinaryWarning.tid | 4 -- 3 files changed, 98 insertions(+), 16 deletions(-) diff --git a/core/modules/parsers/binaryparser.js b/core/modules/parsers/binaryparser.js index ebfd2beec..fb3d38678 100644 --- a/core/modules/parsers/binaryparser.js +++ b/core/modules/parsers/binaryparser.js @@ -3,7 +3,7 @@ title: $:/core/modules/parsers/binaryparser.js type: application/javascript module-type: parser -The video parser parses a video tiddler into an embeddable HTML element +The binary parser parses a binary tiddler into a warning message and download link \*/ (function(){ @@ -13,14 +13,57 @@ The video parser parses a video tiddler into an embeddable HTML element "use strict"; var BINARY_WARNING_MESSAGE = "$:/core/ui/BinaryWarning"; +var EXPORT_BUTTON_IMAGE = "$:/core/images/export-button"; var BinaryParser = function(type,text,options) { - this.tree = [{ - type: "transclude", + // Transclude the binary data tiddler warning message + var warn = { + type: "element", + tag: "p", + children: [{ + type: "transclude", + attributes: { + tiddler: {type: "string", value: BINARY_WARNING_MESSAGE} + } + }] + }; + // Create download link based on binary tiddler title + var link = { + type: "element", + tag: "a", attributes: { - tiddler: {type: "string", value: BINARY_WARNING_MESSAGE} - } - }]; + title: {type: "indirect", textReference: "!!title"}, + download: {type: "indirect", textReference: "!!title"} + }, + children: [{ + type: "transclude", + attributes: { + tiddler: {type: "string", value: EXPORT_BUTTON_IMAGE} + } + }] + }; + // Set the link href to external or internal data URI + if(options._canonical_uri) { + link.attributes.href = { + type: "string", + value: options._canonical_uri + }; + } else if(text) { + link.attributes.href = { + type: "string", + value: "data:" + type + ";base64," + text + }; + } + // Combine warning message and download link in a div + var element = { + type: "element", + tag: "div", + attributes: { + class: {type: "string", value: "tc-binary-warning"} + }, + children: [warn, link] + } + this.tree = [element]; }; exports["application/octet-stream"] = BinaryParser; diff --git a/core/modules/widgets/edit-binary.js b/core/modules/widgets/edit-binary.js index cf2e2ad2c..a4a18f63d 100644 --- a/core/modules/widgets/edit-binary.js +++ b/core/modules/widgets/edit-binary.js @@ -13,6 +13,7 @@ Edit-binary widget; placeholder for editing binary tiddlers "use strict"; var BINARY_WARNING_MESSAGE = "$:/core/ui/BinaryWarning"; +var EXPORT_BUTTON_IMAGE = "$:/core/images/export-button"; var Widget = require("$:/core/modules/widgets/widget.js").widget; @@ -43,13 +44,55 @@ EditBinaryWidget.prototype.render = function(parent,nextSibling) { Compute the internal state of the widget */ EditBinaryWidget.prototype.execute = function() { - // Construct the child widgets - this.makeChildWidgets([{ - type: "transclude", + // Get our parameters + var editTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler")); + var tiddler = this.wiki.getTiddler(editTitle); + var type = tiddler.fields.type; + var text = tiddler.fields.text; + // Transclude the binary data tiddler warning message + var warn = { + type: "element", + tag: "p", + children: [{ + type: "transclude", + attributes: { + tiddler: {type: "string", value: BINARY_WARNING_MESSAGE} + } + }] + }; + // Create download link based on draft tiddler title + var link = { + type: "element", + tag: "a", attributes: { - tiddler: {type: "string", value: BINARY_WARNING_MESSAGE} - } - }]); + title: {type: "indirect", textReference: "!!draft.title"}, + download: {type: "indirect", textReference: "!!draft.title"} + }, + children: [{ + type: "transclude", + attributes: { + tiddler: {type: "string", value: EXPORT_BUTTON_IMAGE} + } + }] + }; + // Set the link href to internal data URI (no external) + if(text) { + link.attributes.href = { + type: "string", + value: "data:" + type + ";base64," + text + }; + } + // Combine warning message and download link in a div + var element = { + type: "element", + tag: "div", + attributes: { + class: {type: "string", value: "tc-binary-warning"} + }, + children: [warn, link] + } + // Construct the child widgets + this.makeChildWidgets([element]); }; /* diff --git a/core/ui/BinaryWarning.tid b/core/ui/BinaryWarning.tid index c6e8d3139..bbf7aef66 100644 --- a/core/ui/BinaryWarning.tid +++ b/core/ui/BinaryWarning.tid @@ -1,8 +1,4 @@ title: $:/core/ui/BinaryWarning \define lingo-base() $:/language/BinaryWarning/ -<div class="tc-binary-warning"> - <<lingo Prompt>> - -</div> From 80b066f4092a317d8cf5cd1f496e30d1e18249ff Mon Sep 17 00:00:00 2001 From: Lee Sheng Long <github@sll.ee> Date: Sat, 1 Feb 2020 01:08:28 +1100 Subject: [PATCH 0464/2376] Fix support for zip files in some environments (#4432) In some environments (at least on my own machine), TiddlyWiki detects zip files as type `"application/x-zip-compressed"` instead of `"application/zip"`. This commit adds support for zip files with type `"application/x-zip-compressed"` so that they are encoded in `"base64"` like other zip files with type `"application/zip"`. --- boot/boot.js | 1 + 1 file changed, 1 insertion(+) diff --git a/boot/boot.js b/boot/boot.js index d2663837c..ff9e4d62c 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2245,6 +2245,7 @@ $tw.boot.startup = function(options) { $tw.utils.registerFileType("application/json","utf8",".json"); $tw.utils.registerFileType("application/pdf","base64",".pdf",{flags:["image"]}); $tw.utils.registerFileType("application/zip","base64",".zip"); + $tw.utils.registerFileType("application/x-zip-compressed","base64",".zip"); $tw.utils.registerFileType("image/jpeg","base64",[".jpg",".jpeg"],{flags:["image"]}); $tw.utils.registerFileType("image/png","base64",".png",{flags:["image"]}); $tw.utils.registerFileType("image/gif","base64",".gif",{flags:["image"]}); From db13e49724af87e2f8c227fb5e879d8dccafb8c4 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Fri, 31 Jan 2020 15:09:06 +0100 Subject: [PATCH 0465/2376] More listops tests (#4409) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * make eslint happy * add more listops tests * new listops filter tests * remove new-line * make eslint happier. * revert eslint settings --- editions/test/tiddlers/tests/test-filters.js | 175 ++++++++++++++++++- 1 file changed, 166 insertions(+), 9 deletions(-) diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index d63f9d893..b0de6f5f0 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -8,8 +8,10 @@ Tests the filtering mechanism. \*/ (function(){ -/*jslint node: true, browser: true */ -/*global $tw: false, describe: false, it: false, expect: false, require: false*/ +/* jslint node: true, browser: true */ +/* eslint-env node, browser, jasmine */ +/* eslint no-mixed-spaces-and-tabs: ["error", "smart-tabs"]*/ +/* global $tw, require */ "use strict"; describe("Filter tests", function() { @@ -421,13 +423,8 @@ function runTests(wiki) { 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: wiki, - document: $tw.document - }); + var rootWidget = new widget.widget({ type:"widget", children:[ {type:"widget", children:[]} ] }, + { wiki:wiki, document:$tw.document}); rootWidget.makeChildWidgets(); var anchorWidget = rootWidget.children[0]; rootWidget.setVariable("myVar","Tidd"); @@ -470,6 +467,8 @@ function runTests(wiki) { expect(wiki.filterTiddlers("1 2 3 4 +[min[2]]").join(",")).toBe("1,2,2,2"); }); +/* listops filters */ + it("should handle the allafter operator", function() { expect(wiki.filterTiddlers("1 2 3 4 +[allafter[]]").join(",")).toBe(""); expect(wiki.filterTiddlers("1 2 3 4 +[allafter:include[]]").join(",")).toBe(""); @@ -500,6 +499,164 @@ function runTests(wiki) { expect(wiki.filterTiddlers("1 2 3 4 +[allbefore:include[5]]").join(",")).toBe(""); }); + it("should handle the append operator", function() { + expect(wiki.filterTiddlers("a b c +[append[d e]]").join(",")).toBe("a,b,c,d,e"); + expect(wiki.filterTiddlers("a b c +[append:1[d e]]").join(",")).toBe("a,b,c,d"); + expect(wiki.filterTiddlers("a b c +[append{TiddlerSeventh!!list}]").join(",")).toBe("a,b,c,TiddlerOne,Tiddler Three,a fourth tiddler,MissingTiddler"); + expect(wiki.filterTiddlers("a b c +[append:2{TiddlerSeventh!!list}]").join(",")).toBe("a,b,c,TiddlerOne,Tiddler Three"); + + expect(wiki.filterTiddlers("a [[b c]] +[append{TiddlerSix!!filter}]").join(",")).toBe("a,b c,one,a a,[subfilter{hasList!!list}]"); + }); + + it("should handle the insertbefore operator", function() { + var widget = require("$:/core/modules/widgets/widget.js"); + var rootWidget = new widget.widget({ type:"widget", children:[ {type:"widget", children:[]} ] }, + { wiki:wiki, document:$tw.document}); + rootWidget.makeChildWidgets(); + var anchorWidget = rootWidget.children[0]; + rootWidget.setVariable("myVar","c"); + rootWidget.setVariable("tidTitle","e"); + rootWidget.setVariable("tidList","one tid with spaces"); + + expect(wiki.filterTiddlers("a b c d e f +[insertbefore:myVar[f]]",anchorWidget).join(",")).toBe("a,b,f,c,d,e"); + expect(wiki.filterTiddlers("a b c d e f +[insertbefore:myVar<tidTitle>]",anchorWidget).join(",")).toBe("a,b,e,c,d,f"); + expect(wiki.filterTiddlers("a b c d e f +[insertbefore:myVar[gg gg]]",anchorWidget).join(",")).toBe("a,b,gg gg,c,d,e,f"); + + expect(wiki.filterTiddlers("a b c d e +[insertbefore:myVar<tidList>]",anchorWidget).join(",")).toBe("a,b,one tid with spaces,c,d,e"); + expect(wiki.filterTiddlers("a b c d e f +[insertbefore:tidTitle{TiddlerOne!!tags}]",anchorWidget).join(",")).toBe("a,b,c,d,one,e,f"); + + // Next 2 tests do weired things, but will pass - there for compatibility reasons + expect(wiki.filterTiddlers("a b c [[with space]] +[insertbefore[b]]").join(",")).toBe("a,c,with space,b"); + expect(wiki.filterTiddlers("a b c d e +[insertbefore:2[b]]").join(",")).toBe("a,c,d,e,b"); + }); + + it("should handle the move operator", function() { + expect(wiki.filterTiddlers("a b c d e +[move[c]]").join(",")).toBe("a,b,d,c,e"); + expect(wiki.filterTiddlers("a b c d e +[move:2[c]]").join(",")).toBe("a,b,d,e,c"); + expect(wiki.filterTiddlers("a b c d e +[move:10[c]]").join(",")).toBe("a,b,d,e,c"); + expect(wiki.filterTiddlers("a b c d e +[move:-1[c]]").join(",")).toBe("a,c,b,d,e"); + expect(wiki.filterTiddlers("a b c d e +[move:-5[c]]").join(",")).toBe("c,a,b,d,e"); + }); + + it("should handle the prepend operator", function() { + expect(wiki.filterTiddlers("a b c +[prepend[dd ee]]").join(",")).toBe("dd,ee,a,b,c"); + expect(wiki.filterTiddlers("a b c +[prepend:3[ff gg]]").join(",")).toBe("ff,gg,a,b,c"); + expect(wiki.filterTiddlers("a b c +[prepend:1[hh ii]]").join(",")).toBe("hh,a,b,c"); + expect(wiki.filterTiddlers("a b c +[prepend:0[jj kk]]").join(",")).toBe("a,b,c"); + + expect(wiki.filterTiddlers("a b c +[prepend:-0[ll mm]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[prepend:-1[nn oo pp qq]]").join(",")).toBe("nn,oo,pp,a,b,c"); + expect(wiki.filterTiddlers("a b c +[prepend:-2[rr ss tt uu]]").join(",")).toBe("rr,ss,a,b,c"); + expect(wiki.filterTiddlers("a b c +[prepend:-4[rr ss tt uu]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[prepend:-5[vv ww xx yy]]").join(",")).toBe("a,b,c"); + }); + + it("should handle the putafter operator", function() { + expect(wiki.filterTiddlers("a b c dd ee +[putafter[b]]").join(",")).toBe("a,b,ee,c,dd"); + expect(wiki.filterTiddlers("a b c dd ee +[putafter:1[b]]").join(",")).toBe("a,b,ee,c,dd"); + expect(wiki.filterTiddlers("a b c dd ee +[putafter:2[b]]").join(",")).toBe("a,b,dd,ee,c"); + expect(wiki.filterTiddlers("a b c dd ee +[putafter:3[b]]").join(",")).toBe("a,b,c,dd,ee"); + // It starts to duplicate elements + expect(wiki.filterTiddlers("a b c dd ee +[putafter:4[b]]").join(",")).toBe("a,b,b,c,dd,ee"); + expect(wiki.filterTiddlers("a b c dd ee +[putafter:5[b]]").join(",")).toBe("a,b,a,b,c,dd,ee"); + // There are only 5 elements in the input + expect(wiki.filterTiddlers("a b c ff gg +[putafter:6[b]]").join(",")).toBe("a,b,a,b,c,ff,gg"); + + // -1 starts to "eat" elements for the left and duplicates b + expect(wiki.filterTiddlers("a b c hh ii +[putafter:-1[b]]").join(",")).toBe("a,b,b,c,hh,ii"); + // -2 moves c, hh, ii behind b, which is not visible + expect(wiki.filterTiddlers("a b c hh ii +[putafter:-2[b]]").join(",")).toBe("a,b,c,hh,ii"); + // only ii is used from input and it's moved behind b + expect(wiki.filterTiddlers("a b c hh ii +[putafter:-4[b]]").join(",")).toBe("a,b,ii,c,hh"); + // wasting time, because there are only 5 elements + expect(wiki.filterTiddlers("a b c hh ii +[putafter:-5[b]]").join(",")).toBe("a,b,c,hh,ii"); + // there are only 5 elements + expect(wiki.filterTiddlers("a b c hh ii +[putafter:-10[b]]").join(",")).toBe("a,b,c,hh,ii"); + + // use NAN uses default = 1 + expect(wiki.filterTiddlers("a b c jj kk +[putafter:NAN[b]]").join(",")).toBe("a,b,kk,c,jj"); + }); + + it("should handle the putbefore operator", function() { + expect(wiki.filterTiddlers("a b c dd +[putbefore[b]]").join(",")).toBe("a,dd,b,c"); + expect(wiki.filterTiddlers("a b c ff +[putbefore:1[b]]").join(",")).toBe("a,ff,b,c"); + expect(wiki.filterTiddlers("a b c gg +[putbefore:2[b]]").join(",")).toBe("a,c,gg,b"); + + expect(wiki.filterTiddlers("a b c [[g g]] +[putbefore:2[b]]").join(",")).toBe("a,c,g g,b"); + + // this one is strange + expect(wiki.filterTiddlers("a b c ee +[putbefore:0[b]]").join(",")).toBe("a,a,b,c,ee"); + + // b is not part of the list anymore, so it will be appended at the end ??? + expect(wiki.filterTiddlers("a b c hh +[putbefore:3[b]]").join(",")).toBe("a,b,c,hh"); + expect(wiki.filterTiddlers("a b c ii +[putbefore:4[b]]").join(",")).toBe("a,a,b,c,ii"); + + // ???? + expect(wiki.filterTiddlers("a b c ii +[putbefore:10[b]]").join(",")).toBe("a,a,b,c,ii"); + + expect(wiki.filterTiddlers("a b c kk +[putbefore:-1[b]]").join(",")).toBe("a,b,c,kk"); + expect(wiki.filterTiddlers("a b c ll +[putbefore:-2[b]]").join(",")).toBe("a,c,ll,b"); + + expect(wiki.filterTiddlers("a b c mm +[putbefore:-3[b]]").join(",")).toBe("a,mm,b,c"); + + expect(wiki.filterTiddlers("a b c nn +[putbefore:-10[b]]").join(",")).toBe("a,b,c,nn"); + }); + + it("should handle the putfirst operator", function() { + expect(wiki.filterTiddlers("a b c +[putfirst[a b]]").join(",")).toBe("c,a,b"); + expect(wiki.filterTiddlers("a b c +[putfirst[]]").join(",")).toBe("c,a,b"); + expect(wiki.filterTiddlers("a b c +[putfirst:2[]]").join(",")).toBe("b,c,a"); + expect(wiki.filterTiddlers("a b c +[putfirst:3[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[putfirst:4[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[putfirst:-0[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[putfirst:-1[]]").join(",")).toBe("b,c,a"); + expect(wiki.filterTiddlers("a b c +[putfirst:-2[]]").join(",")).toBe("c,a,b"); + expect(wiki.filterTiddlers("a b c +[putfirst:-4[]]").join(",")).toBe("a,b,c"); + }); + + it("should handle the putlast operator", function() { + expect(wiki.filterTiddlers("a b c +[putlast[d e]]").join(",")).toBe("b,c,a"); + expect(wiki.filterTiddlers("a b c +[putlast[]]").join(",")).toBe("b,c,a"); + expect(wiki.filterTiddlers("a b c +[putlast:1[]]").join(",")).toBe("b,c,a"); + expect(wiki.filterTiddlers("a b c +[putlast:2[]]").join(",")).toBe("c,a,b"); + expect(wiki.filterTiddlers("a b c +[putlast:3[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[putlast:4[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[putlast:-0[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[putlast:0[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[putlast:-1[]]").join(",")).toBe("c,a,b"); + expect(wiki.filterTiddlers("a b c +[putlast:-2[]]").join(",")).toBe("b,c,a"); + expect(wiki.filterTiddlers("a b c +[putlast:-4[]]").join(",")).toBe("a,b,c"); + }); + + it("should handle the remove operator", function() { + expect(wiki.filterTiddlers("a b c +[remove[d e]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[remove[a]]").join(",")).toBe("b,c"); + expect(wiki.filterTiddlers("a b c +[remove[c b a]]").join(",")).toBe(""); + }); + + it("should handle the replace operator", function() { + expect(wiki.filterTiddlers("a b c dd +[replace[a]]").join(",")).toBe("dd,b,c"); + expect(wiki.filterTiddlers("a b c dd ee +[replace:2[a]]").join(",")).toBe("dd,ee,b,c"); + expect(wiki.filterTiddlers("a b c dd ee +[replace:5[c]]").join(",")).toBe("a,b,a,b,c,dd,ee"); + + // strange things happen. + expect(wiki.filterTiddlers("a b c dd ee +[replace:-1[c]]").join(",")).toBe("a,b,b,c,dd,ee"); + expect(wiki.filterTiddlers("a b c dd ee +[replace:-2[c]]").join(",")).toBe("a,b,c,dd,ee"); + expect(wiki.filterTiddlers("a b c dd ee +[replace:-2[ee]]").join(",")).toBe("a,b,c,dd,c,dd,ee"); + }); + + it("should handle the sortby operator", function() { + expect(wiki.filterTiddlers("a b c +[sortby[d e]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("a b c +[sortby[b c a]]").join(",")).toBe("b,c,a"); + expect(wiki.filterTiddlers("aa a b c +[sortby[b c a cc]]").join(",")).toBe("aa,b,c,a"); + expect(wiki.filterTiddlers("a bb b c +[sortby[b c a cc]]").join(",")).toBe("bb,b,c,a"); + expect(wiki.filterTiddlers("a bb cc b c +[sortby[b c a cc]]").join(",")).toBe("bb,b,c,a,cc"); + + expect(wiki.filterTiddlers("b a b c +[sortby[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("b a b c +[sortby[a b b c]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("b a b c +[sortby[b a c b]]").join(",")).toBe("b,a,c"); + }); + } }); From b454e809f35679ff3547ea5c45f2bf44c7bf0661 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 31 Jan 2020 17:15:09 +0000 Subject: [PATCH 0466/2376] Docs: Fix typos in button widget docs --- .../tw5.com/tiddlers/widgets/ButtonWidget.tid | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid index a2052295e..7c3166a3d 100644 --- a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid @@ -1,6 +1,6 @@ caption: button created: 20131024141900000 -modified: 20170406085706139 +modified: 20200131171028279 tags: Widgets title: ButtonWidget type: text/vnd.tiddlywiki @@ -30,11 +30,11 @@ The content of the `<$button>` widget is displayed within the button. |param |The optional parameter to the message | |set |A TextReference to which a new value will be assigned | |setTitle |A title to which a new value will be assigned, ''without'' TextReference. Gets preferred over <<.attr state>> | -|setField |A ''field name'' to which the new value will be assigned, if the attribute <<.attr stateTitle>> is present. Defaults to the ''text'' field | -|setIndex |An ''index'' to which the new value will be assigned, if the attribute <<.attr stateTitle>> is present | -|setTo |The new value to assign to the TextReference identified in the `set` attribute or the text field / the field specified through `setField` / the index specified through `setIndex` of the title given through `setTitle` | -|selectedClass |An optional additional CSS class to be assigned if the popup is triggered or the tiddler specified in `set` already has the value specified in `setTo` | -|default |Default value if `set` tiddler is missing for testing against `setTo` to determine `selectedClass` | +|setField |A ''field name'' to which the new value will be assigned, if the attribute <<.attr setTitle>> is present. Defaults to the ''text'' field | +|setIndex |An ''index'' to which the new value will be assigned, if the attribute <<.attr setTitle>> is present | +|setTo |The new value to assign to the TextReference identified in the `set` attribute or the text field / the field specified through <<.attr setField>> / the index specified through <<.attr setIndex>> of the title given through <<.attr setTitle>> | +|selectedClass |An optional additional CSS class to be assigned if the popup is triggered or the tiddler specified in <<.attr set>> already has the value specified in <<.attr setTo>> | +|default |Default value if <<.attr set>> tiddler is missing for testing against <<.attr setTo>> to determine <<.attr selectedClass>> | |popup |Title of a state tiddler for a popup that is toggled when the button is clicked. See PopupMechanism for details | |popupTitle |Title of a state tiddler for a popup that is toggled when the button is clicked. In difference to the <<.attr popup>> attribute, ''no'' TextReference is used. See PopupMechanism for details | |aria-label |Optional [[Accessibility]] label | @@ -45,9 +45,9 @@ The content of the `<$button>` widget is displayed within the button. |dragTiddler |An optional tiddler title making the button draggable and identifying the payload tiddler. See DraggableWidget for details | |dragFilter |An optional filter making the button draggable and identifying the list of payload tiddlers. See DraggableWidget for details | -''Note:'' In almost all other cases where a TextReference is used as a widget attribute, it will be placed between curly brackets, to [[transclude|Transclusion in WikiText]] the value currently stored there. However, when we use a TextReference as the value of a button widget's `set` attribute, we are referencing //the storage location itself//, rather than the value stored there, so we do ''not'' use curly brackets there. //Example:// we could code a button widget that sets the `caption` field of TiddlerA to be the same as that of TiddlerB as: +''Note:'' In almost all other cases where a TextReference is used as a widget attribute, it will be placed between curly brackets, to [[transclude|Transclusion in WikiText]] the value currently stored there. However, when we use a TextReference as the value of a button widget's <<.attr set>> attribute, we are referencing //the storage location itself//, rather than the value stored there, so we do ''not'' use curly brackets there. //Example:// we could code a button widget that sets the `caption` field of TiddlerA to be the same as that of TiddlerB as: -<<.tip """<$macrocall $name=".from-version" version="5.1.18"/> <$macrocall $name=".attr" _="stateTitle"/>, <$macrocall $name=".attr" _="stateField"/> and <$macrocall $name=".attr" _="stateIndex"/> attributes allow specifying Tiddler states ''directly'', without interpreting them as [[TextReferences|TextReference]]. +<<.tip """<$macrocall $name=".from-version" version="5.1.18"/> <$macrocall $name=".attr" _="setTitle"/>, <$macrocall $name=".attr" _="setField"/> and <$macrocall $name=".attr" _="setIndex"/> attributes allow specifying Tiddler states ''directly'', without interpreting them as [[TextReferences|TextReference]]. This is useful for edge-cases where titles may contain characters that are used to denote Tiddler fields or indices (`!!`, `##`)""">> ``` From 9d2eff61ca0e93c4d5250c3fcddaa84cf4594296 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 1 Feb 2020 14:41:43 +0100 Subject: [PATCH 0467/2376] Docs: Update ViewWidget.tid (#4437) --- editions/tw5.com/tiddlers/widgets/ViewWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid index 6702c2e15..bba220247 100644 --- a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid @@ -27,7 +27,7 @@ The content of the `<$view>` widget is displayed if the field or property is mis The following formats can be specified in the `format` attribute: |!Format |!Description | -|''text'' |Plain text | +|''text'' |Plain text (default) | |''htmlencoded'' |The field is displayed with HTML encoding | |''urlencoded'' |The field is displayed with URL encoding | |''doubleurlencoded'' |The field is displayed with double URL encoding | From a4593b8e3d6c8fc2902e08fe40a34acf43730760 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sun, 2 Feb 2020 16:50:18 +0800 Subject: [PATCH 0468/2376] Update chinese translations (#4325) * Update chinese translations * Imporve chinese translations for UI of basic tab in controlpanel * Add chinese translations for description of throttle.refresh field * Add chinese translations for the `none` option of icon dropdown in tag manager --- languages/zh-Hans/ControlPanel.multids | 26 +++++++++++++------------- languages/zh-Hans/EditTemplate.multids | 2 +- languages/zh-Hans/Fields.multids | 1 + languages/zh-Hans/Misc.multids | 5 +++-- languages/zh-Hant/ControlPanel.multids | 26 +++++++++++++------------- languages/zh-Hant/EditTemplate.multids | 2 +- languages/zh-Hant/Fields.multids | 1 + languages/zh-Hant/Misc.multids | 1 + 8 files changed, 34 insertions(+), 30 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 69772295c..bf77d3e78 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -4,27 +4,27 @@ Advanced/Caption: 高级 Advanced/Hint: 关于此 TiddlyWiki 的内部信息 Appearance/Caption: 视觉外观 Appearance/Hint: 定制您的 TiddlyWiki 外观。 -Basics/AnimDuration/Prompt: 动画持续时间: -Basics/AutoFocus/Prompt: 默认自动停留的栏位: +Basics/AnimDuration/Prompt: 动画持续时间 +Basics/AutoFocus/Prompt: 編輯條目時的默认自动停留栏位 Basics/Caption: 基本 Basics/DefaultTiddlers/BottomHint: 标题含空白时请使用 [[双中括弧]],或者您可用 <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">保留开启中的条目顺序</$button> -Basics/DefaultTiddlers/Prompt: 首页: -Basics/DefaultTiddlers/TopHint: 默认开启的条目: +Basics/DefaultTiddlers/Prompt: 首页 +Basics/DefaultTiddlers/TopHint: 默认开启的条目 Basics/Language/Prompt: 您好!当前的语言: Basics/NewJournal/Tags/Prompt: 新日志条目的标签 Basics/NewJournal/Text/Prompt: 新日志条目的内容 Basics/NewJournal/Title/Prompt: 新日志条目的名称 Basics/NewTiddler/Tags/Prompt: 新条目的标签 Basics/NewTiddler/Title/Prompt: 新条目的名称 -Basics/OverriddenShadowTiddlers/Prompt: 被覆写的默认条目数量: -Basics/ShadowTiddlers/Prompt: 默认条目数量: -Basics/Subtitle/Prompt: 副标题: -Basics/SystemTiddlers/Prompt: 系统条目数量: -Basics/Tags/Prompt: 标签数量: -Basics/Tiddlers/Prompt: 一般条目数量: -Basics/Title/Prompt: 标题: -Basics/Username/Prompt: 编辑者署名: -Basics/Version/Prompt: ~TiddlyWiki 版本: +Basics/OverriddenShadowTiddlers/Prompt: 被覆写的默认条目数量 +Basics/ShadowTiddlers/Prompt: 默认条目数量 +Basics/Subtitle/Prompt: 副标题 +Basics/SystemTiddlers/Prompt: 系统条目数量 +Basics/Tags/Prompt: 标签数量 +Basics/Tiddlers/Prompt: 一般条目数量 +Basics/Title/Prompt: 标题 +Basics/Username/Prompt: 编辑者署名 +Basics/Version/Prompt: ~TiddlyWiki 版本 EditorTypes/Caption: 编辑器类型 EditorTypes/Editor/Caption: 编辑器 EditorTypes/Hint: 这些条目决定使用哪个编辑器来编辑特定条目类型。 diff --git a/languages/zh-Hans/EditTemplate.multids b/languages/zh-Hans/EditTemplate.multids index 7d84f78de..8c837725e 100644 --- a/languages/zh-Hans/EditTemplate.multids +++ b/languages/zh-Hans/EditTemplate.multids @@ -8,7 +8,7 @@ Field/Remove/Hint: 删除字段 Field/Dropdown/Caption: 字段列表 Field/Dropdown/Hint: 显示字段列表 Fields/Add/Button: 添加 -Fields/Add/Button/Hint: 添加字段 +Fields/Add/Button/Hint: 添加字段至条目 Fields/Add/Dropdown/System: 系统字段 Fields/Add/Dropdown/User: 使用者字段 Fields/Add/Name/Placeholder: 字段名称 diff --git a/languages/zh-Hans/Fields.multids b/languages/zh-Hans/Fields.multids index 36ba015d0..90c8286ea 100644 --- a/languages/zh-Hans/Fields.multids +++ b/languages/zh-Hans/Fields.multids @@ -29,6 +29,7 @@ source: 条目的网址 subtitle: 一个 wizard 的副标题 tags: 条目的标签清单 text: 条目的内文 +throttle.refresh: 如果存在,则限制此条目的刷新 title: 条目的唯一名称 toc-link: 若设为: "no",则抑制目录树中的条目链接。 type: 条目的内容类型 diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 00b5799bf..f1717f19e 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -8,8 +8,8 @@ CloseAll/Button: 全部关闭 ColourPicker/Recent: 最近︰ ConfirmCancelTiddler: 您确定要放弃对条目 "<$text text=<<title>>/>" 的更改? ConfirmDeleteTiddler: 您确定要删除条目 "<$text text=<<title>>/>"? -ConfirmOverwriteTiddler: 您确定要覆写条目 "<$text text=<<title>>/>"? -ConfirmEditShadowTiddler: 您即将要编辑默认条目,任何更改将会覆盖默认的系统,使未来的升级不寻常。您确定要编辑 "<$text text=<<title>>/>"? +ConfirmOverwriteTiddler: 您确定要复写条目 "<$text text=<<title>>/>"? +ConfirmEditShadowTiddler: 您即将要编辑默认条目,任何更改将会复盖默认的系统,使未来的升级不寻常。您确定要编辑 "<$text text=<<title>>/>"? Count: 计数 DefaultNewTiddlerTitle: 新条目 Diffs/CountMessage: <<diff-count>> 个差异 @@ -66,6 +66,7 @@ SystemTiddlers/Include/Prompt: 包括系统条目 TagManager/Colour/Heading: 颜色 TagManager/Count/Heading: 计数 TagManager/Icon/Heading: 图标 +TagManager/Icons/None: 无 TagManager/Info/Heading: 信息 TagManager/Tag/Heading: 标签 Tiddler/DateFormat: YYYY年0MM月0DD日 0hh:0mm diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index c22cfee06..e6b4391c2 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -4,27 +4,27 @@ Advanced/Caption: 進階 Advanced/Hint: 關於此 TiddlyWiki 的內部資訊 Appearance/Caption: 視覺外觀 Appearance/Hint: 自訂您的 TiddlyWiki 外觀。 -Basics/AnimDuration/Prompt: 動畫持續時間: -Basics/AutoFocus/Prompt: 預設自動停留的欄位: +Basics/AnimDuration/Prompt: 動畫持續時間 +Basics/AutoFocus/Prompt: 編輯條目時的預設自動停留欄位 Basics/Caption: 基本 Basics/DefaultTiddlers/BottomHint: 標題含空白時請使用 [[雙中括弧]],或者您可用 <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">保留開啟中的條目順序</$button> -Basics/DefaultTiddlers/Prompt: 首頁: -Basics/DefaultTiddlers/TopHint: 預設開啟的條目: +Basics/DefaultTiddlers/Prompt: 首頁 +Basics/DefaultTiddlers/TopHint: 預設開啟的條目 Basics/Language/Prompt: 您好!當前的語言: Basics/NewJournal/Tags/Prompt: 新日誌條目的標籤 Basics/NewJournal/Text/Prompt: 新日誌條目的內容 Basics/NewJournal/Title/Prompt: 新日誌條目的名稱 Basics/NewTiddler/Tags/Prompt: 新條目的標籤 Basics/NewTiddler/Title/Prompt: 新條目的名稱 -Basics/OverriddenShadowTiddlers/Prompt: 被覆寫的預設條目數量: -Basics/ShadowTiddlers/Prompt: 預設條目數量: -Basics/Subtitle/Prompt: 副標題: -Basics/SystemTiddlers/Prompt: 系統條目數量: -Basics/Tags/Prompt: 標籤數量: -Basics/Tiddlers/Prompt: 一般條目數量: -Basics/Title/Prompt: 標題: -Basics/Username/Prompt: 編輯者署名: -Basics/Version/Prompt: ~TiddlyWiki 版本: +Basics/OverriddenShadowTiddlers/Prompt: 被覆寫的預設條目數量 +Basics/ShadowTiddlers/Prompt: 預設條目數量 +Basics/Subtitle/Prompt: 副標題 +Basics/SystemTiddlers/Prompt: 系統條目數量 +Basics/Tags/Prompt: 標籤數量 +Basics/Tiddlers/Prompt: 一般條目數量 +Basics/Title/Prompt: 標題 +Basics/Username/Prompt: 編輯者署名 +Basics/Version/Prompt: ~TiddlyWiki 版本 EditorTypes/Caption: 編輯器類型 EditorTypes/Editor/Caption: 編輯器 EditorTypes/Hint: 這些條目決定使用哪個編輯器來編輯特定條目類型。 diff --git a/languages/zh-Hant/EditTemplate.multids b/languages/zh-Hant/EditTemplate.multids index 000b45988..9b339eff7 100644 --- a/languages/zh-Hant/EditTemplate.multids +++ b/languages/zh-Hant/EditTemplate.multids @@ -8,7 +8,7 @@ Field/Remove/Hint: 刪除欄位 Field/Dropdown/Caption: 欄位列表 Field/Dropdown/Hint: 顯示欄位列表 Fields/Add/Button: 新增 -Fields/Add/Button/Hint: 新增欄位 +Fields/Add/Button/Hint: 新增欄位至條目 Fields/Add/Dropdown/System: 系統欄位 Fields/Add/Dropdown/User: 使用者欄位 Fields/Add/Name/Placeholder: 欄位名稱 diff --git a/languages/zh-Hant/Fields.multids b/languages/zh-Hant/Fields.multids index 905e03248..462895653 100644 --- a/languages/zh-Hant/Fields.multids +++ b/languages/zh-Hant/Fields.multids @@ -29,6 +29,7 @@ source: 條目的網址 subtitle: 一個 wizard 的副標題 tags: 條目的標籤清單 text: 條目的內文 +throttle.refresh: 如果存在,則限制此條目的刷新 title: 條目的唯一名稱 toc-link: 若設爲: "no",則抑制目錄樹中的條目鏈接。 type: 條目的內容類型 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index 31569388b..21aafb6d2 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -66,6 +66,7 @@ SystemTiddlers/Include/Prompt: 包括系統條目 TagManager/Colour/Heading: 顏色 TagManager/Count/Heading: 計數 TagManager/Icon/Heading: 圖示 +TagManager/Icons/None: 無 TagManager/Info/Heading: 資訊 TagManager/Tag/Heading: 標籤 Tiddler/DateFormat: YYYY年0MM月0DD日 0hh:0mm From 3df1f9c9d0cc92b596262c0220ecf529c7fbb858 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 13:57:24 +0000 Subject: [PATCH 0469/2376] Extend jsontiddlers macro to generate unformatted output --- core/modules/macros/jsontiddlers.js | 7 ++++--- core/modules/wiki.js | 5 +++-- editions/tw5.com/tiddlers/macros/JsonTiddlersMacro.tid | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/core/modules/macros/jsontiddlers.js b/core/modules/macros/jsontiddlers.js index d26d6f61f..735f02693 100644 --- a/core/modules/macros/jsontiddlers.js +++ b/core/modules/macros/jsontiddlers.js @@ -19,14 +19,15 @@ Information about this macro exports.name = "jsontiddlers"; exports.params = [ - {name: "filter"} + {name: "filter"}, + {name: "spaces"} ]; /* Run the macro */ -exports.run = function(filter) { - return this.wiki.getTiddlersAsJson(filter); +exports.run = function(filter,spaces) { + return this.wiki.getTiddlersAsJson(filter,spaces); }; })(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 76bb056b3..fc8b42eda 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -660,8 +660,9 @@ exports.getTiddlerAsJson = function(title) { } }; -exports.getTiddlersAsJson = function(filter) { +exports.getTiddlersAsJson = function(filter,spaces) { var tiddlers = this.filterTiddlers(filter), + spaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces, data = []; for(var t=0;t<tiddlers.length; t++) { var tiddler = this.getTiddler(tiddlers[t]); @@ -673,7 +674,7 @@ exports.getTiddlersAsJson = function(filter) { data.push(fields); } } - return JSON.stringify(data,null,$tw.config.preferences.jsonSpaces); + return JSON.stringify(data,null,spaces); }; /* diff --git a/editions/tw5.com/tiddlers/macros/JsonTiddlersMacro.tid b/editions/tw5.com/tiddlers/macros/JsonTiddlersMacro.tid index 627ccfbac..5005e9e9c 100644 --- a/editions/tw5.com/tiddlers/macros/JsonTiddlersMacro.tid +++ b/editions/tw5.com/tiddlers/macros/JsonTiddlersMacro.tid @@ -1,5 +1,5 @@ created: 20150221152226000 -modified: 20150221154213000 +modified: 20200204135513721 tags: Macros [[Core Macros]] title: jsontiddlers Macro type: text/vnd.tiddlywiki @@ -13,3 +13,5 @@ An example can be seen in the [[template tiddler for JSON exports|$:/core/templa ;filter : A [[filter|Filters]] selecting which tiddlers to include +;spaces +: An optional number of spaces to use for formatting the JSON. Defaults to 4, with blank or zero resulting in packed JSON with no formatting spaces From 005c584d85505b9477169ef822752eed39dde66a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 14:06:59 +0000 Subject: [PATCH 0470/2376] First attempt at sharing plugin/edition --- editions/share/tiddlywiki.info | 14 ++++ plugins/tiddlywiki/share/DefaultTiddlers.tid | 3 + plugins/tiddlywiki/share/SiteSubtitle.tid | 3 + plugins/tiddlywiki/share/SiteTitle.tid | 3 + plugins/tiddlywiki/share/above-story.tid | 4 ++ plugins/tiddlywiki/share/base-url.tid | 2 + plugins/tiddlywiki/share/exclusions.tid | 2 + plugins/tiddlywiki/share/filter.tid | 2 + plugins/tiddlywiki/share/plugin.info | 6 ++ .../tiddlywiki/share/pluginreloadwarning.tid | 3 + plugins/tiddlywiki/share/rawmarkup.js | 35 +++++++++ plugins/tiddlywiki/share/rawmarkup.tid | 6 ++ plugins/tiddlywiki/share/readme.tid | 6 ++ plugins/tiddlywiki/share/settings.tid | 7 ++ plugins/tiddlywiki/share/styles.tid | 17 +++++ plugins/tiddlywiki/share/wizard.tid | 71 +++++++++++++++++++ 16 files changed, 184 insertions(+) create mode 100644 editions/share/tiddlywiki.info create mode 100644 plugins/tiddlywiki/share/DefaultTiddlers.tid create mode 100644 plugins/tiddlywiki/share/SiteSubtitle.tid create mode 100644 plugins/tiddlywiki/share/SiteTitle.tid create mode 100644 plugins/tiddlywiki/share/above-story.tid create mode 100644 plugins/tiddlywiki/share/base-url.tid create mode 100644 plugins/tiddlywiki/share/exclusions.tid create mode 100644 plugins/tiddlywiki/share/filter.tid create mode 100644 plugins/tiddlywiki/share/plugin.info create mode 100644 plugins/tiddlywiki/share/pluginreloadwarning.tid create mode 100644 plugins/tiddlywiki/share/rawmarkup.js create mode 100644 plugins/tiddlywiki/share/rawmarkup.tid create mode 100644 plugins/tiddlywiki/share/readme.tid create mode 100644 plugins/tiddlywiki/share/settings.tid create mode 100644 plugins/tiddlywiki/share/styles.tid create mode 100644 plugins/tiddlywiki/share/wizard.tid diff --git a/editions/share/tiddlywiki.info b/editions/share/tiddlywiki.info new file mode 100644 index 000000000..56c0ee84b --- /dev/null +++ b/editions/share/tiddlywiki.info @@ -0,0 +1,14 @@ +{ + "description": "Sharing tiddlers via URLs", + "plugins": [ + "tiddlywiki/share" + ], + "themes": [ + "tiddlywiki/vanilla", + "tiddlywiki/snowwhite" + ], + "build": { + "share": [ + "--rendertiddler","$:/core/save/all","share.html","text/plain"] + } +} diff --git a/plugins/tiddlywiki/share/DefaultTiddlers.tid b/plugins/tiddlywiki/share/DefaultTiddlers.tid new file mode 100644 index 000000000..614dde9d0 --- /dev/null +++ b/plugins/tiddlywiki/share/DefaultTiddlers.tid @@ -0,0 +1,3 @@ +title: $:/DefaultTiddlers + +[list[$:/StoryList]] \ No newline at end of file diff --git a/plugins/tiddlywiki/share/SiteSubtitle.tid b/plugins/tiddlywiki/share/SiteSubtitle.tid new file mode 100644 index 000000000..b7570f469 --- /dev/null +++ b/plugins/tiddlywiki/share/SiteSubtitle.tid @@ -0,0 +1,3 @@ +title: $:/SiteSubtitle + +tools to share tiddlers via URLs \ No newline at end of file diff --git a/plugins/tiddlywiki/share/SiteTitle.tid b/plugins/tiddlywiki/share/SiteTitle.tid new file mode 100644 index 000000000..79014b426 --- /dev/null +++ b/plugins/tiddlywiki/share/SiteTitle.tid @@ -0,0 +1,3 @@ +title: $:/SiteTitle + +Share \ No newline at end of file diff --git a/plugins/tiddlywiki/share/above-story.tid b/plugins/tiddlywiki/share/above-story.tid new file mode 100644 index 000000000..db3fb07bf --- /dev/null +++ b/plugins/tiddlywiki/share/above-story.tid @@ -0,0 +1,4 @@ +title: $:/plugins/tiddlywiki/share/above-story +tags: $:/tags/AboveStory + +<$transclude tiddler="$:/plugins/tiddlywiki/share/wizard" mode="block"/> diff --git a/plugins/tiddlywiki/share/base-url.tid b/plugins/tiddlywiki/share/base-url.tid new file mode 100644 index 000000000..5c363e05e --- /dev/null +++ b/plugins/tiddlywiki/share/base-url.tid @@ -0,0 +1,2 @@ +title: $:/config/plugins/share/base-url +text: diff --git a/plugins/tiddlywiki/share/exclusions.tid b/plugins/tiddlywiki/share/exclusions.tid new file mode 100644 index 000000000..d6f42f455 --- /dev/null +++ b/plugins/tiddlywiki/share/exclusions.tid @@ -0,0 +1,2 @@ +title: $:/config/plugins/share/exclusions +text: $:/library/sjcl.js $:/boot/bootprefix.js $:/boot/boot.js $:/boot/boot.css $:/core $:/isEncrypted $:/plugins/tiddlywiki/share $:/status/RequireReloadDueToPluginChange $:/temp/info-plugin $:/themes/tiddlywiki/snowwhite $:/themes/tiddlywiki/vanilla $:/HistoryList [prefix[$:/temp/]] diff --git a/plugins/tiddlywiki/share/filter.tid b/plugins/tiddlywiki/share/filter.tid new file mode 100644 index 000000000..85fb7c7b5 --- /dev/null +++ b/plugins/tiddlywiki/share/filter.tid @@ -0,0 +1,2 @@ +title: $:/config/plugins/share/filter +text: [all[tiddlers]] -[subfilter{$:/config/plugins/share/exclusions}] diff --git a/plugins/tiddlywiki/share/plugin.info b/plugins/tiddlywiki/share/plugin.info new file mode 100644 index 000000000..f2abe0929 --- /dev/null +++ b/plugins/tiddlywiki/share/plugin.info @@ -0,0 +1,6 @@ +{ + "title": "$:/plugins/tiddlywiki/share", + "name": "Share", + "description": "Sharing tiddlers via URLs", + "list": "readme wizard settings" +} diff --git a/plugins/tiddlywiki/share/pluginreloadwarning.tid b/plugins/tiddlywiki/share/pluginreloadwarning.tid new file mode 100644 index 000000000..f2c2c1f92 --- /dev/null +++ b/plugins/tiddlywiki/share/pluginreloadwarning.tid @@ -0,0 +1,3 @@ +title: $:/core/ui/PageTemplate/pluginreloadwarning + +<!-- Disable plugin reload warnings --> diff --git a/plugins/tiddlywiki/share/rawmarkup.js b/plugins/tiddlywiki/share/rawmarkup.js new file mode 100644 index 000000000..b604e5c17 --- /dev/null +++ b/plugins/tiddlywiki/share/rawmarkup.js @@ -0,0 +1,35 @@ +/*\ +title: $:/plugins/tiddlywiki/share/rawmarkup.js +type: application/javascript +module-type: library + +Read tiddlers from the browser location hash + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +// Get the hash +var rawHash = document.location.hash.substring(1); +if(rawHash.charAt(0) === "#") { + var hash = decodeURIComponent(rawHash.substring(1)); + // Try to parse the hash as JSON + var tiddlers; + try { + tiddlers= JSON.parse(hash); + } catch(ex) { + } + if(tiddlers) { + // Need to initialise these because we run before bootprefix.js and boot.js + window.$tw = window.$tw || {}; + $tw.boot = $tw.boot || {}; + $tw.preloadTiddlers = $tw.preloadTiddlers || []; + // Load our tiddlers + $tw.preloadTiddlers = $tw.preloadTiddlers.concat(tiddlers); + } +} + +})(); diff --git a/plugins/tiddlywiki/share/rawmarkup.tid b/plugins/tiddlywiki/share/rawmarkup.tid new file mode 100644 index 000000000..8130757ad --- /dev/null +++ b/plugins/tiddlywiki/share/rawmarkup.tid @@ -0,0 +1,6 @@ +title: $:/plugins/tiddlywiki/share/rawmarkup +tags: $:/tags/RawMarkupWikified + +`<script>` +{{$:/plugins/tiddlywiki/share/rawmarkup.js}} +`</script>` diff --git a/plugins/tiddlywiki/share/readme.tid b/plugins/tiddlywiki/share/readme.tid new file mode 100644 index 000000000..b5d9cc299 --- /dev/null +++ b/plugins/tiddlywiki/share/readme.tid @@ -0,0 +1,6 @@ +title: $:/plugins/tiddlywiki/share/readme + +This plugin provides tools to share tiddlers via URLs, comprising: + +* The ability to load a group of tiddlers from the browser location hash at startup +* Wizard and templates to create URLs from group of tiddlers diff --git a/plugins/tiddlywiki/share/settings.tid b/plugins/tiddlywiki/share/settings.tid new file mode 100644 index 000000000..9f3cc0e1b --- /dev/null +++ b/plugins/tiddlywiki/share/settings.tid @@ -0,0 +1,7 @@ +title: $:/plugins/tiddlywiki/share/settings + +!! Base sharing URL + +//Defaults to the current location// + +<$edit-text tiddler="$:/config/plugins/share/base-url" tag="input" class="tc-sharing-wizard-editor"/> diff --git a/plugins/tiddlywiki/share/styles.tid b/plugins/tiddlywiki/share/styles.tid new file mode 100644 index 000000000..a96da5d6d --- /dev/null +++ b/plugins/tiddlywiki/share/styles.tid @@ -0,0 +1,17 @@ +title: $:/plugins/tiddlywiki/share/styles +tags: [[$:/tags/Stylesheet]] + +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline + +.tc-sharing-wizard-wrapper { + width: 100%; + padding: 1em 1em; + margin-bottom: 1em; + border-radius: 4px; + background: <<colour background>>; + <<box-shadow "inset 0px 2px 3px 2px rgba(0,0,0,0.4)">> +} + +input.tc-sharing-wizard-editor { + width: 100%; +} \ No newline at end of file diff --git a/plugins/tiddlywiki/share/wizard.tid b/plugins/tiddlywiki/share/wizard.tid new file mode 100644 index 000000000..ac90f0292 --- /dev/null +++ b/plugins/tiddlywiki/share/wizard.tid @@ -0,0 +1,71 @@ +title: $:/plugins/tiddlywiki/share/wizard + +\define generate-json() +<$text text=<<jsontiddlers filter:"""$(share-filter)$""" spaces:"">>/> +\end + +\define inner-share-actions() +<$wikify name="json" text=<<generate-json>>> +<$action-sendmessage $message="tm-copy-to-clipboard" $param={{{ [<json>encodeuricomponent[]addprefix[##]addprefix<base-url>] }}}/> +</$wikify> +\end + +\define share-actions() +<$set name="base-url" value={{$:/config/plugins/share/base-url}} emptyValue={{$:/info/url/full}}> +<$set name="share-filter" value={{$:/config/plugins/share/filter}}> +<<inner-share-actions>> +</$set> +</$set> +\end + +<div class="tc-sharing-wizard-wrapper"> + +! Welcome to the sharing edition of ~TiddlyWiki + +This edition of ~TiddlyWiki allows users to create links to wikis with the special capability of containing embedded tiddlers that are loaded into the target wiki at startup. Most browsers allow tens of kilobytes of data to be loaded in this way, making it possible to conveniently share groups of tiddlers as a fully functional wiki. See the [[readme|$:/plugins/tiddlywiki/share]] for more details. + +!! 1 - Import or create the tiddlers that are to be shared + +The first step to create a sharing URL is to import or otherwise create the tiddlers that are to be shared. + +!! 2 - Check that the sharing filter is correct + +The tiddlers that are included in the sharing URL are determined by the combination of two filters. + +The sharing filter specifies the tiddlers to be shared: + +<$edit-text tiddler="$:/config/plugins/share/filter" tag="input" class="tc-sharing-wizard-editor"/> + +The exclusion subfilter is used to exclude the system tiddlers comprising this wiki: + +<$edit-text tiddler="$:/config/plugins/share/exclusions" tag="input" class="tc-sharing-wizard-editor"/> + +!! 3 - Review the tiddlers to be shared + +Tiddlers to be shared (<$count filter={{$:/config/plugins/share/filter}}/>): + +<ul> +<$list filter={{$:/config/plugins/share/filter}}> +<li> +<$link> +<$view field="title"/> +</$link> +</li> +</$list> +</ul> + +!! 3 - Generate the sharing link + +<$button> +<<share-actions>> +Generate sharing link +</$button> (the link will be copied to the clipboard) + +!! 5 - Export the shared tiddlers + +<$button> +<$action-sendmessage $message="tm-download-file" $param="$:/core/templates/exporters/JsonFile" exportFilter={{$:/config/plugins/share/filter}} filename="tiddlers.json"/> +Export as JSON +</$button> + +</div> \ No newline at end of file From aaae1d1bbb4bbbef8220f4ce084d495241068ce9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 14:07:28 +0000 Subject: [PATCH 0471/2376] Include share.html in the main build --- bin/build-site.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bin/build-site.sh b/bin/build-site.sh index ba2fd80ec..94d77203a 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -136,6 +136,15 @@ node $TW5_BUILD_TIDDLYWIKI \ --build index favicon static \ || exit 1 +# /share.html Custom edition for sharing via the URL +node $TW5_BUILD_TIDDLYWIKI \ + ./editions/share \ + --verbose \ + --load $TW5_BUILD_OUTPUT/build.tid \ + --output $TW5_BUILD_OUTPUT \ + --build share \ + || exit 1 + # /upgrade.html Custom edition for performing upgrades node $TW5_BUILD_TIDDLYWIKI \ ./editions/upgrade \ From 9dd719ba3272dfc88bfda168fb3f834368fb790e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 14:24:57 +0000 Subject: [PATCH 0472/2376] Fix path.posix.sep which appears to be undefined on Travis CI --- boot/boot.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index ff9e4d62c..63b4ac76c 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2080,9 +2080,9 @@ $tw.loadWikiTiddlers = function(wikiPath,options) { for(var title in $tw.boot.files) { relativePath = path.relative(resolvedWikiPath,$tw.boot.files[title].filepath); output[title] = - path.sep === path.posix.sep ? + path.sep === "/" ? relativePath : - relativePath.split(path.sep).join(path.posix.sep); + relativePath.split(path.sep).join("/"); } $tw.wiki.addTiddler({title: "$:/config/OriginalTiddlerPaths", type: "application/json", text: JSON.stringify(output)}); } From 8eb2ec9357078f726672b85ce96f94164d8ee161 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 14:35:21 +0000 Subject: [PATCH 0473/2376] Fix Travis CI syntax error We were getting "SyntaxError: Use of const in strict mode." --- plugins/tiddlywiki/markdown/wrapper.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/markdown/wrapper.js b/plugins/tiddlywiki/markdown/wrapper.js index 5c048f6d6..9cdd8a74b 100755 --- a/plugins/tiddlywiki/markdown/wrapper.js +++ b/plugins/tiddlywiki/markdown/wrapper.js @@ -12,7 +12,11 @@ Wraps up the remarkable parser for use as a Parser in TiddlyWiki /*global $tw: false */ "use strict"; -const { Remarkable, linkify, utils } = require("$:/plugins/tiddlywiki/markdown/remarkable.js"); +var r = require("$:/plugins/tiddlywiki/markdown/remarkable.js"); + +var Remarkable = r.Remarkable, + linkify = r.linkify, + utils = r.utils; ///// Set up configuration options ///// function parseAsBoolean(tiddlerName) { From dbd2a340e0e7baedce03471c5ec6d8390346c2e3 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 14:44:01 +0000 Subject: [PATCH 0474/2376] Temporarily remove markdown plugin from prerelease It's giving errors under Travis CI --- editions/prerelease/tiddlywiki.info | 1 - 1 file changed, 1 deletion(-) diff --git a/editions/prerelease/tiddlywiki.info b/editions/prerelease/tiddlywiki.info index 7cfc207af..6398a6ec7 100644 --- a/editions/prerelease/tiddlywiki.info +++ b/editions/prerelease/tiddlywiki.info @@ -8,7 +8,6 @@ "tiddlywiki/powered-by-tiddlywiki", "tiddlywiki/internals", "tiddlywiki/highlight", - "tiddlywiki/markdown", "tiddlywiki/bibtex", "tiddlywiki/savetrail", "tiddlywiki/external-attachments", From f1b4d2d24d431cec83be67d2219b4c4a552fa52c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 15:06:30 +0000 Subject: [PATCH 0475/2376] Travis CI: Move to Node.js 12 Apparently the default Node 10 doesn't include Math.trunc() --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index d7f1a5566..0a9e783f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: node_js - - "node" + - 12 stages: - name: test @@ -20,8 +20,8 @@ jobs: - export TW5_BUILD_DETAILS="Prerelease built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - export TW5_BUILD_MAIN_EDITION='./editions/prerelease' - export TW5_BUILD_OUTPUT='./output/prerelease' - - ./bin/build-site.sh - - ./bin/travis-push.sh + - ./bin/build-site.sh || travis_terminate 1 + - ./bin/travis-push.sh || travis_terminate 1 - stage: build-tiddlywiki-com script: - ./bin/travis-pre-build.sh @@ -30,5 +30,5 @@ jobs: - export TW5_BUILD_DETAILS="Built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - export TW5_BUILD_MAIN_EDITION='./editions/tw5.com' - export TW5_BUILD_OUTPUT='./output' - - ./bin/build-site.sh - - ./bin/travis-push.sh + - ./bin/build-site.sh || travis_terminate 1 + - ./bin/travis-push.sh || travis_terminate 1 From 74135c2f3889c5fc4107ebbe3bf9d01d75e29524 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 15:16:49 +0000 Subject: [PATCH 0476/2376] Travis CI: Try deleting and recreating .travis.yml It appears to have worked for some people c.f. stackoverflow --- .travis.yml | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0a9e783f9..000000000 --- a/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ -language: node_js - - 12 - -stages: - - name: test - - name: build-prerelease - if: branch = "master" - - name: build-tiddlywiki-com - if: branch = "tiddlywiki-com" - -jobs: - include: - - stage: test - script: ./bin/test.sh - - stage: build-prerelease - script: - - ./bin/travis-pre-build.sh - - export TW5_BUILD_TIDDLYWIKI='./tiddlywiki.js' - - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) - - export TW5_BUILD_DETAILS="Prerelease built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - - export TW5_BUILD_MAIN_EDITION='./editions/prerelease' - - export TW5_BUILD_OUTPUT='./output/prerelease' - - ./bin/build-site.sh || travis_terminate 1 - - ./bin/travis-push.sh || travis_terminate 1 - - stage: build-tiddlywiki-com - script: - - ./bin/travis-pre-build.sh - - export TW5_BUILD_TIDDLYWIKI='./node_modules/tiddlywiki/tiddlywiki.js' - - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) - - export TW5_BUILD_DETAILS="Built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - - export TW5_BUILD_MAIN_EDITION='./editions/tw5.com' - - export TW5_BUILD_OUTPUT='./output' - - ./bin/build-site.sh || travis_terminate 1 - - ./bin/travis-push.sh || travis_terminate 1 From 6bf625d20ef8e41096a98d806a7867503caf9760 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 15:17:33 +0000 Subject: [PATCH 0477/2376] Travis CI: Add .travis.yml back again --- .travis.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..0a9e783f9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,34 @@ +language: node_js + - 12 + +stages: + - name: test + - name: build-prerelease + if: branch = "master" + - name: build-tiddlywiki-com + if: branch = "tiddlywiki-com" + +jobs: + include: + - stage: test + script: ./bin/test.sh + - stage: build-prerelease + script: + - ./bin/travis-pre-build.sh + - export TW5_BUILD_TIDDLYWIKI='./tiddlywiki.js' + - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) + - export TW5_BUILD_DETAILS="Prerelease built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" + - export TW5_BUILD_MAIN_EDITION='./editions/prerelease' + - export TW5_BUILD_OUTPUT='./output/prerelease' + - ./bin/build-site.sh || travis_terminate 1 + - ./bin/travis-push.sh || travis_terminate 1 + - stage: build-tiddlywiki-com + script: + - ./bin/travis-pre-build.sh + - export TW5_BUILD_TIDDLYWIKI='./node_modules/tiddlywiki/tiddlywiki.js' + - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) + - export TW5_BUILD_DETAILS="Built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" + - export TW5_BUILD_MAIN_EDITION='./editions/tw5.com' + - export TW5_BUILD_OUTPUT='./output' + - ./bin/build-site.sh || travis_terminate 1 + - ./bin/travis-push.sh || travis_terminate 1 From 33087ccee9018519ed35839cf832c32af86bde84 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 15:25:34 +0000 Subject: [PATCH 0478/2376] Travis CI: Another attempt to fix things Seems that I don't understand YAML --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0a9e783f9..076db966d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: node_js - - 12 +node_js: + - "12.4.0" stages: - name: test From 90366e9b3b83320c53304d9dd8de4f11b3a8947e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 16:05:14 +0000 Subject: [PATCH 0479/2376] Share: Exclude the $:/build tiddler --- plugins/tiddlywiki/share/exclusions.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/share/exclusions.tid b/plugins/tiddlywiki/share/exclusions.tid index d6f42f455..13649133d 100644 --- a/plugins/tiddlywiki/share/exclusions.tid +++ b/plugins/tiddlywiki/share/exclusions.tid @@ -1,2 +1,2 @@ title: $:/config/plugins/share/exclusions -text: $:/library/sjcl.js $:/boot/bootprefix.js $:/boot/boot.js $:/boot/boot.css $:/core $:/isEncrypted $:/plugins/tiddlywiki/share $:/status/RequireReloadDueToPluginChange $:/temp/info-plugin $:/themes/tiddlywiki/snowwhite $:/themes/tiddlywiki/vanilla $:/HistoryList [prefix[$:/temp/]] +text: $:/library/sjcl.js $:/boot/bootprefix.js $:/boot/boot.js $:/boot/boot.css $:/core $:/isEncrypted $:/plugins/tiddlywiki/share $:/status/RequireReloadDueToPluginChange $:/temp/info-plugin $:/themes/tiddlywiki/snowwhite $:/themes/tiddlywiki/vanilla $:/HistoryList [prefix[$:/temp/]] [[$:/build]] From b9d20f1868610caa8b62e028b6c4b26f4e1d7c83 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 4 Feb 2020 16:20:16 +0000 Subject: [PATCH 0480/2376] Share plugin: Improve startup error handling --- plugins/tiddlywiki/share/rawmarkup.js | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/plugins/tiddlywiki/share/rawmarkup.js b/plugins/tiddlywiki/share/rawmarkup.js index b604e5c17..697e949ed 100644 --- a/plugins/tiddlywiki/share/rawmarkup.js +++ b/plugins/tiddlywiki/share/rawmarkup.js @@ -15,20 +15,28 @@ Read tiddlers from the browser location hash // Get the hash var rawHash = document.location.hash.substring(1); if(rawHash.charAt(0) === "#") { - var hash = decodeURIComponent(rawHash.substring(1)); - // Try to parse the hash as JSON - var tiddlers; - try { - tiddlers= JSON.parse(hash); + var hash; + try{ + hash = decodeURIComponent(rawHash.substring(1)); } catch(ex) { + console.log("Error decoding location hash",ex); } - if(tiddlers) { - // Need to initialise these because we run before bootprefix.js and boot.js - window.$tw = window.$tw || {}; - $tw.boot = $tw.boot || {}; - $tw.preloadTiddlers = $tw.preloadTiddlers || []; - // Load our tiddlers - $tw.preloadTiddlers = $tw.preloadTiddlers.concat(tiddlers); + // Try to parse the hash as JSON + if(hash) { + var tiddlers; + try { + tiddlers= JSON.parse(hash); + } catch(ex) { + console.log("Error parsing JSON from location hash",ex); + } + if(tiddlers) { + // Need to initialise these because we run before bootprefix.js and boot.js + window.$tw = window.$tw || {}; + $tw.boot = $tw.boot || {}; + $tw.preloadTiddlers = $tw.preloadTiddlers || []; + // Load our tiddlers + $tw.preloadTiddlers = $tw.preloadTiddlers.concat(tiddlers); + } } } From 04c28ba5f23dc62c0be68c45e403fb7ebd497984 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Wed, 5 Feb 2020 13:14:38 +0100 Subject: [PATCH 0481/2376] Add tabindex support to button widgets (#4442) This pull request adds support for specifying a tabindex for button widgets following the same pattern as the LinkWidget. --- core/modules/widgets/button.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 34472309f..592e4c722 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -64,6 +64,10 @@ ButtonWidget.prototype.render = function(parent,nextSibling) { if(this["aria-label"]) { domNode.setAttribute("aria-label",this["aria-label"]); } + // Set the tabindex + if(this.tabIndex) { + domNode.setAttribute("tabindex",this.tabIndex); + } // Add a click event handler domNode.addEventListener("click",function (event) { var handled = false; @@ -205,6 +209,7 @@ ButtonWidget.prototype.execute = function() { this.setField = this.getAttribute("setField"); this.setIndex = this.getAttribute("setIndex"); this.popupTitle = this.getAttribute("popupTitle"); + this.tabIndex = this.getAttribute("tabindex"); // Make child widgets this.makeChildWidgets(); }; From 0b1887e677a9e881d03a493d2edc398f53a58a70 Mon Sep 17 00:00:00 2001 From: lucible <45129600+lucible@users.noreply.github.com> Date: Wed, 5 Feb 2020 15:44:55 -0600 Subject: [PATCH 0482/2376] Signing the CLA (#4447) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index a68b8c1e5..f5cc01e4f 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -383,3 +383,5 @@ Will Atwood Mitchell, @wam, 2019/12/11 Stefan Krüger, @s-light, 2020/01/04 Lee Sheng Long, @s-l-lee, 2020/01/25 + +@lucible, 2020/02/05 From 07c2c21dbf9bc6411b1f8d05c9243522f50b2ca5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 14 Feb 2020 15:01:45 +0000 Subject: [PATCH 0483/2376] Share plugin: Add warning prompt --- plugins/tiddlywiki/share/rawmarkup.js | 81 +++++++++++++++-- plugins/tiddlywiki/share/rawmarkup.tid | 2 + plugins/tiddlywiki/share/startup-warning.css | 87 +++++++++++++++++++ .../tiddlywiki/share/startup-warning.css.meta | 2 + plugins/tiddlywiki/share/startup-warning.html | 47 ++++++++++ .../share/startup-warning.html.meta | 2 + 6 files changed, 216 insertions(+), 5 deletions(-) create mode 100644 plugins/tiddlywiki/share/startup-warning.css create mode 100644 plugins/tiddlywiki/share/startup-warning.css.meta create mode 100644 plugins/tiddlywiki/share/startup-warning.html create mode 100644 plugins/tiddlywiki/share/startup-warning.html.meta diff --git a/plugins/tiddlywiki/share/rawmarkup.js b/plugins/tiddlywiki/share/rawmarkup.js index 697e949ed..c0ab77659 100644 --- a/plugins/tiddlywiki/share/rawmarkup.js +++ b/plugins/tiddlywiki/share/rawmarkup.js @@ -19,7 +19,7 @@ if(rawHash.charAt(0) === "#") { try{ hash = decodeURIComponent(rawHash.substring(1)); } catch(ex) { - console.log("Error decoding location hash",ex); + console.log("Share plugin: Error decoding location hash",ex); } // Try to parse the hash as JSON if(hash) { @@ -27,17 +27,88 @@ if(rawHash.charAt(0) === "#") { try { tiddlers= JSON.parse(hash); } catch(ex) { - console.log("Error parsing JSON from location hash",ex); + console.log("Share plugin: Error parsing JSON from location hash",ex); } if(tiddlers) { // Need to initialise these because we run before bootprefix.js and boot.js window.$tw = window.$tw || {}; $tw.boot = $tw.boot || {}; $tw.preloadTiddlers = $tw.preloadTiddlers || []; - // Load our tiddlers - $tw.preloadTiddlers = $tw.preloadTiddlers.concat(tiddlers); - } + // Prevent TiddlyWiki from booting + $tw.boot.suppressBoot = true; + // Load our styles + var stylesWrapper = document.createElement("style"); + stylesWrapper.innerHTML = tiddlywikiSharePluginStartupWarningCss; + document.documentElement.appendChild(stylesWrapper); + // Display the warning banner + var warningWrapper = document.createElement("div"); + warningWrapper.innerHTML = tiddlywikiSharePluginStartupWarningHtml; + document.documentElement.appendChild(warningWrapper); + // Add our event handlers + document.getElementById("startup-warning-proceed").addEventListener("click",actionProceed,false); + document.getElementById("startup-warning-cancel").addEventListener("click",actionCancel,false); + // Sort the incoming tiddlers by title + tiddlers = tiddlers.sort(function(a,b) { + if(a.title < b.title) { + return -1; + } else if(a.title > b.title) { + return +1; + } else { + return 0; + } + }); + // Load the tiddler preview + var previewWrapper = document.getElementById("startup-warning-preview"); + for(var index=0; index < tiddlers.length; index++) { + var tiddler = tiddlers[index], + tiddlerWrapper = document.createElement("li"), + titleTextWrapper = document.createElement("span"), + titleText = document.createTextNode(tiddler.title), + fieldsTable = document.createElement("table"), + fieldsTableBody = document.createElement("tbody"); + titleTextWrapper.appendChild(titleText); + titleTextWrapper.className = "tiddler-title"; + tiddlerWrapper.appendChild(titleTextWrapper); + fieldsTable.appendChild(fieldsTableBody); + var fields = Object.keys(tiddler).sort(); + for(var fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) { + var fieldName = fields[fieldIndex], + fieldValue = tiddler[fieldName]; + if(fieldName !== "title") { + var fieldRow = document.createElement("tr"), + fieldRowHeader = document.createElement("th"), + fieldRowValue = document.createElement("td"); + fieldRowHeader.appendChild(document.createTextNode(fieldName)); + fieldRowValue.appendChild(document.createTextNode(fieldValue)); + fieldRow.appendChild(fieldRowHeader); + fieldRow.appendChild(fieldRowValue); + fieldsTableBody.appendChild(fieldRow); + } + } + tiddlerWrapper.appendChild(fieldsTable); + previewWrapper.appendChild(tiddlerWrapper); + } + } } } +function actionProceed() { + // Remove the banner, load our tiddlers, and boot TiddlyWiki + removeWarningBanner(); + $tw.preloadTiddlers = $tw.preloadTiddlers.concat(tiddlers); + $tw.boot.boot(); +} + +function actionCancel() { + // Remove the banner, clear the location hash, and boot TiddlyWiki + removeWarningBanner(); + document.location.hash = "#"; + $tw.boot.boot(); +} + +function removeWarningBanner() { + warningWrapper.parentNode.removeChild(warningWrapper); + stylesWrapper.parentNode.removeChild(stylesWrapper); +} + })(); diff --git a/plugins/tiddlywiki/share/rawmarkup.tid b/plugins/tiddlywiki/share/rawmarkup.tid index 8130757ad..05d8c5d0e 100644 --- a/plugins/tiddlywiki/share/rawmarkup.tid +++ b/plugins/tiddlywiki/share/rawmarkup.tid @@ -2,5 +2,7 @@ title: $:/plugins/tiddlywiki/share/rawmarkup tags: $:/tags/RawMarkupWikified `<script>` +`var tiddlywikiSharePluginStartupWarningHtml = "`<$view tiddler="$:/plugins/tiddlywiki/share/startup-warning.html" format="jsencoded"/>`";` +`var tiddlywikiSharePluginStartupWarningCss = "`<$view tiddler="$:/plugins/tiddlywiki/share/startup-warning.css" format="jsencoded"/>`";` {{$:/plugins/tiddlywiki/share/rawmarkup.js}} `</script>` diff --git a/plugins/tiddlywiki/share/startup-warning.css b/plugins/tiddlywiki/share/startup-warning.css new file mode 100644 index 000000000..87805f399 --- /dev/null +++ b/plugins/tiddlywiki/share/startup-warning.css @@ -0,0 +1,87 @@ + +.startup-warning-wrapper { + font-family: sans-serif; + line-height: 1.4; + width: 50%; + margin: 1em auto 0 auto; + padding: 0 1em; + border: 6px solid transparent; + border-radius: 8px; + background: linear-gradient(white, white) padding-box, repeating-linear-gradient(-45deg, red 0, red 25%, transparent 0, transparent 50%) 0 / .6em .6em; + animation: marching-ants 20s linear infinite; +} + +@media (max-width: 600px) { + .startup-warning-wrapper { + width: 85%; + } +} + +#startup-warning-preview { + list-style-type: none; + padding-left: 0; +} + +#startup-warning-preview .tiddler-title { + font-weight: bold; + font-size: 1.2em; +} + +#startup-warning-preview table { + margin-left: 1em; +} + +#startup-warning-preview th { + vertical-align: top; + font-weight: normal; +} + +#startup-warning-preview td { + font-family: monospace; + white-space: pre-wrap; + background: #f8f8f8; +} + +.startup-warning-wrapper button { + padding: 0.3em; + border-radius: 4px; + font-size: 1.5em; +} + +#startup-warning-cancel { + background: #DB2828; + color: #fff; +} + +#startup-warning-cancel:hover { + background: #E75C60; + color: #fff; +} + +#startup-warning-cancel:active { + background: #ec8d8d; + color: #fff; +} + +#startup-warning-proceed { + background: #24BA4C; + color: #fff; +} + +#startup-warning-proceed:hover { + background: #59e27e; + color: #fff; +} + +#startup-warning-proceed:active { + background: #ABF5BD; + color: #fff; +} + +.startup-warning-wrapper h1, +.startup-warning-wrapper h2 { + font-weight: bold; +} + +@keyframes marching-ants { to { background-position: 100% 100% } } + diff --git a/plugins/tiddlywiki/share/startup-warning.css.meta b/plugins/tiddlywiki/share/startup-warning.css.meta new file mode 100644 index 000000000..5972681f8 --- /dev/null +++ b/plugins/tiddlywiki/share/startup-warning.css.meta @@ -0,0 +1,2 @@ +title: $:/plugins/tiddlywiki/share/startup-warning.css +type: text/css diff --git a/plugins/tiddlywiki/share/startup-warning.html b/plugins/tiddlywiki/share/startup-warning.html new file mode 100644 index 000000000..8be493fee --- /dev/null +++ b/plugins/tiddlywiki/share/startup-warning.html @@ -0,0 +1,47 @@ +<div class="startup-warning-wrapper"> +<h1> +Warning: This site is designed to share untrusted content +</h1> +<h2> +Please do not proceed unless you are certain you understand the warnings below +</h2> +<p> +This is a special site that allows users to share content for <a href="https://tiddlywiki.com/" target="_blank" rel="noopener noreferrer">TiddlyWiki</a> without needing conventional hosting. Instead, the content is encoded in the URL used to access the site. This means that there are no controls or protections on the content that is shared, and as such it may contain malicious links or any kind of content. +</p> +<p> +Viewing links to this site in the browser is generally safe because web pages are designed to run in a sandbox that prevents them from accessing or harming your data. However, please exercise caution before downloading content to your own computer, or importing content into your own TiddlyWiki. +</p> + +<details> +<summary> +Click here to see the tiddlers that are being shared +</summary> +<ul id="startup-warning-preview"> +</ul> +</details> + +<p> +<strong><em>Only continue if you understand the risks</em></strong> +</p> + +<p> +<button id="startup-warning-proceed"> +Proceed +</button> +<button id="startup-warning-cancel"> +Cancel +</button> +</p> + +<h2> +Technical details +</h2> + +<p> +This web page is a <a href="https://tiddlywiki.com/" target="_blank" rel="noopener noreferrer">TiddlyWiki</a> loaded with the <a href="https://github.com/Jermolene/TiddlyWiki5/tree/master/plugins/tiddlywiki/share" target="_blank" rel="noopener noreferrer">Share plugin</a>. It has the special capability that at startup it can load raw tiddlers from a block of JSON encoded into the location hash part of the URL (ie the part after the # character). +</p> +<p> +This is useful because it enables people to share working examples of TiddlyWikis without needing to arrange special hosting. The only restriction is that browsers and other Internet infrastructure frequently limit the length of URLs to a few tens of kilobytes. +</p> + +</div> diff --git a/plugins/tiddlywiki/share/startup-warning.html.meta b/plugins/tiddlywiki/share/startup-warning.html.meta new file mode 100644 index 000000000..b3898d250 --- /dev/null +++ b/plugins/tiddlywiki/share/startup-warning.html.meta @@ -0,0 +1,2 @@ +title: $:/plugins/tiddlywiki/share/startup-warning.html +type: text/html From a339491cc04c7d85d4d0f4bf39d74907012cdec0 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 19 Feb 2020 14:28:27 +0000 Subject: [PATCH 0484/2376] Update release note Better late than never --- .../prerelease/tiddlers/Release 5.1.22.tid | 65 +++++++++++++++++-- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index b1d91e7fa..d934b2fe8 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -1,6 +1,6 @@ caption: 5.1.22 -created: 20190910152413608 -modified: 20190910152413608 +created: 20200219102220589 +modified: 20200219102220589 tags: ReleaseNotes title: Release 5.1.22 type: text/vnd.tiddlywiki @@ -9,6 +9,8 @@ type: text/vnd.tiddlywiki ! Major Improvements +!! Dynamic Plugin Loading + Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded or deleted dynamically, without requiring a reload -- as long as they don't contain any ~JavaScript modules. Plugins that require a reload are indicated in the plugin chooser in [[$:/ControlPanel]]. The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser|$:/core/ui/ControlPanel/Modals/AddPlugins]] in the control panel feature several improvements: @@ -17,25 +19,61 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * Plugins may now declare dependencies that are automatically installed without user intervention * All plugins now feature a concise, informal name (in addition to the description and title) +!! New "Freelinks" Plugin + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/447cd56da9db2ee169607f32923081ac47e78354]] ''freelinks'' plugin to automatically create links from any tiddler title + +!! New "Share" Plugin + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/005c584d85505b9477169ef822752eed39dde66a]] ''share'' plugin for sharing tiddlers via the URL location hash + +! Plugin Improvements + +* Comments plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/16c1cbee292604b2b8be36a15d5828893d132b20]] a link on each comment to the original post +* Markdown plugin +** [[Switched|https://github.com/Jermolene/TiddlyWiki5/pull/3876]] to the newer and improved [[remarkable|https://github.com/jonschlinkert/remarkable]] library +* Railroad plugin +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/152125f53b9979bfd5511973038b4358d1ef48c4]] colour scheme to use standard palette colours + ! Translation Improvements +* Improved Chinese translation * Improved Dutch translation +* Improved Portuguese translation + +! Performance Improvements + +* [[Optimised|https://github.com/Jermolene/TiddlyWiki5/pull/4108]] ImportVariablesWidget to improve performance of global macros +* [[Optimised|https://github.com/Jermolene/TiddlyWiki5/commit/18f5333e01eb62ece65a86c457bf8a398f156930]] core SVG images to save approximately 100KB from the core plugin ! Usability Improvements -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4238]] support for specifying the field that should receive focus when editing or creating a tiddler +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/96eca32b1105416c317101aa91dd284f835a8ba8]] download button for binary tiddlers * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4293]] ([[and here|https://github.com/Jermolene/TiddlyWiki5/pull/4296]]) spacing for page control buttons * [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/9395d7567179c436d0e8ac26fc976d717eae7f50]] display of icons in documentation +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4238]] support in control panel for specifying the field that should receive focus when editing or creating a tiddler * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4314]] support in control panel for specifying the tags for new tiddlers and journals +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/05a3e1ad36c2fb383dd4975a578f95e8a6c3f325]] language attribute to HTML document to improve accessibility +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3943]] scaling of embedded videos +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4361]] "none" option in icon dropdown in $:/TagManager +* Fixed a number of layout issues relating to the edit template and tag picker (see [[18151cc1|https://github.com/Jermolene/TiddlyWiki5/commit/18151cc193e8c0d613663d3ecf6437c63e540c2d]], [[793d84bc|https://github.com/Jermolene/TiddlyWiki5/commit/793d84bcb1bc52ee77c49090268dd242017cdaa9]], [[1cf2d079|https://github.com/Jermolene/TiddlyWiki5/commit/1cf2d0799d7027d58f4bdca857bc342dd778a330]], [[3c365a25|https://github.com/Jermolene/TiddlyWiki5/commit/3c365a2567ebfe12d78b0aed77a40969cd38563e]], [[45def4de|https://github.com/Jermolene/TiddlyWiki5/commit/45def4def441554a06c3e17742adc29a17d2a13c]], [[89728d8a|https://github.com/Jermolene/TiddlyWiki5/commit/89728d8a9a9fd9b888deb78f420dd5758ee63909]], [[4cf96e73|https://github.com/Jermolene/TiddlyWiki5/commit/4cf96e7339b3b7d8e84a5b73d9871cdad50c5a84]], [[bfa3ddd0|https://github.com/Jermolene/TiddlyWiki5/commit/bfa3ddd077404ad4627b9161bcadf3d5a539c1dc]] and [[74172b35|https://github.com/Jermolene/TiddlyWiki5/commit/74172b35ceae84f254e20d6d7ec4dff2cca692b1]]) ! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4442]] ''tabindex'' attribute to the ButtonWidget +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bfbd886a8bbf2f6ce147ea526eec2098357d3ae7]] ''index'' attribute to the RangeWidget enabling it to be used with DataTiddlers * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6089c4de2921df0f76f605f1830fb2c04548f73c]] support for RefreshThrottling via the `throttle.refresh` field * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1150c87edb7478af6cc943eb0ef52fdf3051c121]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/8c894612914e21cf941a1daa953538c28ce91d8e]]) new `[is[binary]]` operand for the [[is Operator]] * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/68163684a2e57108e160295e445c194268b873c5]] usage of `publishFilter` in save templates -- see SavingMechanism * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/89716bb81d68b9c68d3c0fd2f2de96afad1b086a]] CSS class identifying the tiddler body editor * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e9211b0eee8e0b081f9f1597bde6673bf4c55d5c]] CSS classes to identify sidebar tabsets * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4208]] normalize.css from v3.0.0 to v8.0.1 +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4226]] Jasmine to v3 +* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/commit/7b66df688ae745537929a25799ef4a72d4437fcd]] AndTidWiki saver +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5a5c967a3943beb6a4fa513cb34d231e46304452]] new [[SystemTag: $:/tags/Macro/View]] for creating macros that are only available within the view template +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4404]] support for embedding `.webm` and `.ogg` video files +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3df1f9c9d0cc92b596262c0220ecf529c7fbb858]] ''spaces'' parameter to [[jsontiddlers Macro]] for controlling the formatting of the output ! Bug Fixes @@ -44,12 +82,31 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4237]] bug with permaview button when placed above the search box * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/a054d100e73db95071299e92c4321c2aa8e42382]] usage of ''count'' parameter of [[WidgetMessage: tm-edit-text-operation]] * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4284]] bug with toc-selective-expandable macro still showing disclosure arrow despite excluding tiddlers -* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/81f1e6af4e5920c6ff41e7f08171bfddc1b26dfc]] erroneous word break setting for vertical tabs +* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/81f1e6af4e5920c6ff41e7f08171bfddc1b26dfc]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/46c90af308015242fa0314d85f1524727e2aa7e5]]) erroneous word break setting for vertical tabs * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/d30eacc6520971c95bdabf24f4c4122534d9414a]] problem with programmatically deselecting entries from the SelectWidget in multiple selection mode +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4333]] usage of spans in colour picker +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e84c422e5091c02f55db4027faa9ba840e2aee6c]] refreshing of RangeWidget when underlying value changes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e4eaae14faa1bf867c0f8168e221cf30ac6e2e0d]] problem with splash screen being shown when JavaScript is disabled +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8f3da69f818940eb5f517da850fb3766b72c7d7d]] probelm with millisecond 0XXX DateFormat +* [[Improve|https://github.com/Jermolene/TiddlyWiki5/commit/174a36cda63127d19230bcfbe9a5fdde46e5b0ea]] compatibility of single tiddler window vs. main window +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/015306dfc9099f4d5d9415b64266d328a154b119]] problems with some core icons in Internet Explorer +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/3eacdc19fdb4ed7ce864a04dd87a5e1c6492daac]] GitHub and GitLab savers to use default path of `/` if none specified +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4432]] support for embedding ZIP files in some environments ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: +* [[@BramChen|https://github.com/BramChen]] +* [[@BurningTreeC|https://github.com/BurningTreeC]] +* [[@donmor|https://github.com/donmor]] +* [[@ento|https://github.com/ento]] +* [[@flibbles|https://github.com/flibbles]] * [[@gernert|https://github.com/gernert]] +* [[@heronils|https://github.com/heronils]] * [[@Janno|https://github.com/Janno]] +* [[@MidnightLightning|https://github.com/MidnightLightning]] +* [[@pmario|https://github.com/pmario]] +* [[@s-l-lee|https://github.com/s-l-lee]] +* [[@s-light|https://github.com/s-light]] +* [[@saqimtiaz|https://github.com/saqimtiaz]] From 1dfc29c1277c26620ec561300c8688fbc4d88993 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 19 Feb 2020 18:58:13 +0000 Subject: [PATCH 0485/2376] Browser-storage plugin: Don't save popup state by default --- plugins/tiddlywiki/browser-storage/config/SaveFilter.tid | 2 +- plugins/tiddlywiki/browser-storage/settings.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid b/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid index b08b934c0..72c1715eb 100644 --- a/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid +++ b/plugins/tiddlywiki/browser-storage/config/SaveFilter.tid @@ -1,2 +1,2 @@ title: $:/config/BrowserStorage/SaveFilter -text: [prefix[$:/state/]] +text: [prefix[$:/state/]] -[prefix[$:/state/popup/]] diff --git a/plugins/tiddlywiki/browser-storage/settings.tid b/plugins/tiddlywiki/browser-storage/settings.tid index 380a1bbac..b958914ca 100644 --- a/plugins/tiddlywiki/browser-storage/settings.tid +++ b/plugins/tiddlywiki/browser-storage/settings.tid @@ -14,7 +14,7 @@ Click this button to clear browser storage and disable its use: ! Save Filter -This filter determines which tiddlers will be saved to local storage. By default, it contains `[prefix[$:/state/]]` to just save state tiddlers, thus preserving selected tabs, and the open/closed status of table of contents entries. Other useful values include `[all[]]` meaning that it will attempt to save all tiddlers. +This filter determines which tiddlers will be saved to local storage. By default, it contains `[prefix[$:/state/]] -[prefix[$:/state/popup/]]` to just save state tiddlers except popup state tiddlers, thus preserving selected tabs, and the open/closed status of table of contents entries. Other useful values include `[all[]]` meaning that it will attempt to save all tiddlers. <$link to="$:/config/BrowserStorage/SaveFilter">Browser Storage Save Filter</$link>: <$edit-text tiddler="$:/config/BrowserStorage/SaveFilter" default="" tag="input" size="50"/> From 5b3443947e1767858577efdfb49a92942c8e79d5 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 23 Feb 2020 12:27:49 +0100 Subject: [PATCH 0486/2376] Update documentation for tabindex support for ButtonWidget (#4465) Documentation for changes introduced in https://github.com/Jermolene/TiddlyWiki5/pull/4442 --- editions/tw5.com/tiddlers/widgets/ButtonWidget.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid index a2052295e..7bdc4a7ca 100644 --- a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid @@ -44,6 +44,7 @@ The content of the `<$button>` widget is displayed within the button. |tag |An optional html tag to use instead of the default "button" | |dragTiddler |An optional tiddler title making the button draggable and identifying the payload tiddler. See DraggableWidget for details | |dragFilter |An optional filter making the button draggable and identifying the list of payload tiddlers. See DraggableWidget for details | +|tabindex |Sets the `tabindex` attribute of the button to the given value | ''Note:'' In almost all other cases where a TextReference is used as a widget attribute, it will be placed between curly brackets, to [[transclude|Transclusion in WikiText]] the value currently stored there. However, when we use a TextReference as the value of a button widget's `set` attribute, we are referencing //the storage location itself//, rather than the value stored there, so we do ''not'' use curly brackets there. //Example:// we could code a button widget that sets the `caption` field of TiddlerA to be the same as that of TiddlerB as: From 46159bd061ee09e14d01b93381c0bbaa97f733fa Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 14:28:08 +0000 Subject: [PATCH 0487/2376] Share plugin: Add prominent warning in readme --- plugins/tiddlywiki/share/readme.tid | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/share/readme.tid b/plugins/tiddlywiki/share/readme.tid index b5d9cc299..354d6465c 100644 --- a/plugins/tiddlywiki/share/readme.tid +++ b/plugins/tiddlywiki/share/readme.tid @@ -1,6 +1,9 @@ title: $:/plugins/tiddlywiki/share/readme -This plugin provides tools to share tiddlers via URLs, comprising: +<div class="tc-message-box">Do not install this plugin unless you understand exactly what it does</div> + +This experimental plugin provides tools to share tiddlers via URLs, comprising: * The ability to load a group of tiddlers from the browser location hash at startup * Wizard and templates to create URLs from group of tiddlers + From 4afde5a722afc91c826305800ba536c5fe8ef2e5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 14:31:02 +0000 Subject: [PATCH 0488/2376] Enhance colour macro with a fallback to a configuration tiddler --- core/wiki/macros/CSS.tid | 2 +- editions/tw5.com/tiddlers/macros/ColourMacro.tid | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/wiki/macros/CSS.tid b/core/wiki/macros/CSS.tid index a5b68ea07..563f917a9 100644 --- a/core/wiki/macros/CSS.tid +++ b/core/wiki/macros/CSS.tid @@ -2,7 +2,7 @@ title: $:/core/macros/CSS tags: $:/tags/Macro \define colour(name) -<$transclude tiddler={{$:/palette}} index="$name$"><$transclude tiddler="$:/palettes/Vanilla" index="$name$"/></$transclude> +<$transclude tiddler={{$:/palette}} index="$name$"><$transclude tiddler="$:/palettes/Vanilla" index="$name$"><$transclude tiddler="$:/config/DefaultColourMappings/$name$"/></$transclude></$transclude> \end \define color(name) diff --git a/editions/tw5.com/tiddlers/macros/ColourMacro.tid b/editions/tw5.com/tiddlers/macros/ColourMacro.tid index d63bcb3ec..584556fc7 100644 --- a/editions/tw5.com/tiddlers/macros/ColourMacro.tid +++ b/editions/tw5.com/tiddlers/macros/ColourMacro.tid @@ -1,5 +1,5 @@ created: 20150221154058000 -modified: 20150221154522000 +modified: 20200228142855357 tags: Macros [[Core Macros]] title: colour Macro type: text/vnd.tiddlywiki @@ -7,7 +7,7 @@ caption: colour The <<.def colour>> (or <<.def color>>) [[macro|Macros]] returns the [[CSS|Cascading Style Sheets]] value of one the colours in the current [[palette|ColourPalettes]]. -If no such entry exists in the current palette, the [[vanilla palette|$:/palettes/Vanilla]] is used instead. +If no such entry exists in the current palette, the [[vanilla palette|$:/palettes/Vanilla]] is used instead. If no such entry exists in the vanilla palette, the system looks for a configuration tiddler with the title `$:/config/DefaultColourMappings/<colour-name>` and transcludes the colour from the text field. This enables to plugins to ship defaults for colours that are not present in the core palettes. !! Parameters From ad2d4503e584ce9f931dbd1e98f95738b2841e51 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 14:33:15 +0000 Subject: [PATCH 0489/2376] First commit of new Menu Bar plugin --- editions/prerelease/tiddlywiki.info | 3 +- .../tiddlers/menubar/gettingstarted.tid | 6 + .../tw5.com/tiddlers/menubar/tagsMenuBar.tid | 2 + editions/tw5.com/tiddlywiki.info | 3 +- .../config-DefaultColourMappings.multids | 4 + .../config-MenuItemsVisibility.multids | 4 + .../tiddlywiki/menubar/config-breakpoint.tid | 2 + plugins/tiddlywiki/menubar/config.tid | 31 ++++ plugins/tiddlywiki/menubar/items/contents.tid | 11 ++ .../tiddlywiki/menubar/items/hamburger.tid | 17 ++ .../tiddlywiki/menubar/items/pagecontrols.tid | 19 +++ plugins/tiddlywiki/menubar/items/search.tid | 33 ++++ plugins/tiddlywiki/menubar/items/server.tid | 14 ++ .../tiddlywiki/menubar/items/topleftbar.tid | 11 ++ .../tiddlywiki/menubar/items/toprightbar.tid | 11 ++ plugins/tiddlywiki/menubar/menu.tid | 67 ++++++++ .../core-ui-PageTemplate-topleftbar.tid | 3 + .../core-ui-PageTemplate-toprightbar.tid | 3 + plugins/tiddlywiki/menubar/plugin.info | 6 + plugins/tiddlywiki/menubar/readme.tid | 27 +++ plugins/tiddlywiki/menubar/styles.tid | 155 ++++++++++++++++++ plugins/tiddlywiki/menubar/tags-MenuBar.tid | 2 + 22 files changed, 432 insertions(+), 2 deletions(-) create mode 100644 editions/tw5.com/tiddlers/menubar/gettingstarted.tid create mode 100644 editions/tw5.com/tiddlers/menubar/tagsMenuBar.tid create mode 100644 plugins/tiddlywiki/menubar/config-DefaultColourMappings.multids create mode 100644 plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids create mode 100644 plugins/tiddlywiki/menubar/config-breakpoint.tid create mode 100644 plugins/tiddlywiki/menubar/config.tid create mode 100644 plugins/tiddlywiki/menubar/items/contents.tid create mode 100644 plugins/tiddlywiki/menubar/items/hamburger.tid create mode 100644 plugins/tiddlywiki/menubar/items/pagecontrols.tid create mode 100644 plugins/tiddlywiki/menubar/items/search.tid create mode 100644 plugins/tiddlywiki/menubar/items/server.tid create mode 100644 plugins/tiddlywiki/menubar/items/topleftbar.tid create mode 100644 plugins/tiddlywiki/menubar/items/toprightbar.tid create mode 100644 plugins/tiddlywiki/menubar/menu.tid create mode 100644 plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-topleftbar.tid create mode 100644 plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-toprightbar.tid create mode 100644 plugins/tiddlywiki/menubar/plugin.info create mode 100644 plugins/tiddlywiki/menubar/readme.tid create mode 100644 plugins/tiddlywiki/menubar/styles.tid create mode 100644 plugins/tiddlywiki/menubar/tags-MenuBar.tid diff --git a/editions/prerelease/tiddlywiki.info b/editions/prerelease/tiddlywiki.info index 6398a6ec7..6d245f429 100644 --- a/editions/prerelease/tiddlywiki.info +++ b/editions/prerelease/tiddlywiki.info @@ -14,7 +14,8 @@ "tiddlywiki/dynaview", "tiddlywiki/codemirror", "tiddlywiki/comments", - "tiddlywiki/browser-storage" + "tiddlywiki/browser-storage", + "tiddlywiki/menubar" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/tw5.com/tiddlers/menubar/gettingstarted.tid b/editions/tw5.com/tiddlers/menubar/gettingstarted.tid new file mode 100644 index 000000000..ab4ea1294 --- /dev/null +++ b/editions/tw5.com/tiddlers/menubar/gettingstarted.tid @@ -0,0 +1,6 @@ +title: $:/editions/tw5.com/menuitems/gettingstarted +caption: ~GettingStarted +description: Link to ~GettingStarted +tags: $:/tags/MenuBar +target: GettingStarted + diff --git a/editions/tw5.com/tiddlers/menubar/tagsMenuBar.tid b/editions/tw5.com/tiddlers/menubar/tagsMenuBar.tid new file mode 100644 index 000000000..7b6bdddde --- /dev/null +++ b/editions/tw5.com/tiddlers/menubar/tagsMenuBar.tid @@ -0,0 +1,2 @@ +title: $:/tags/MenuBar +list:$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/editions/tw5.com/menuitems/gettingstarted $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar \ No newline at end of file diff --git a/editions/tw5.com/tiddlywiki.info b/editions/tw5.com/tiddlywiki.info index aa3cd5707..ecd1fa636 100644 --- a/editions/tw5.com/tiddlywiki.info +++ b/editions/tw5.com/tiddlywiki.info @@ -4,7 +4,8 @@ "tiddlywiki/nodewebkitsaver", "tiddlywiki/browser-sniff", "tiddlywiki/railroad", - "tiddlywiki/evernote" + "tiddlywiki/evernote", + "tiddlywiki/menubar" ], "themes": [ "tiddlywiki/vanilla", diff --git a/plugins/tiddlywiki/menubar/config-DefaultColourMappings.multids b/plugins/tiddlywiki/menubar/config-DefaultColourMappings.multids new file mode 100644 index 000000000..6e2c1c8a0 --- /dev/null +++ b/plugins/tiddlywiki/menubar/config-DefaultColourMappings.multids @@ -0,0 +1,4 @@ +title: $:/config/DefaultColourMappings/ + +menubar-foreground: #fff +menubar-background: #5778d8 diff --git a/plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids b/plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids new file mode 100644 index 000000000..f355e493a --- /dev/null +++ b/plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids @@ -0,0 +1,4 @@ +title: $:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/ + +pagecontrols: hide +server: hide diff --git a/plugins/tiddlywiki/menubar/config-breakpoint.tid b/plugins/tiddlywiki/menubar/config-breakpoint.tid new file mode 100644 index 000000000..b1022ddd4 --- /dev/null +++ b/plugins/tiddlywiki/menubar/config-breakpoint.tid @@ -0,0 +1,2 @@ +title: $:/config/plugins/menubar/breakpoint +text: 620px \ No newline at end of file diff --git a/plugins/tiddlywiki/menubar/config.tid b/plugins/tiddlywiki/menubar/config.tid new file mode 100644 index 000000000..54132f988 --- /dev/null +++ b/plugins/tiddlywiki/menubar/config.tid @@ -0,0 +1,31 @@ +title: $:/plugins/tiddlywiki/menubar/config +tags: $:/tags/ControlPanel/Toolbars +caption: Top Menu Bar + +\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/ + +! Top Menu Configuration + +!! Menu Items + +Select which menu items will be shown. You can also drag items to reorder them. + +<$set name="tv-config-toolbar-icons" value="yes"> + +<$set name="tv-config-toolbar-text" value="yes"> + +<$macrocall $name="list-tagged-draggable" tag="$:/tags/MenuBar" itemTemplate="$:/core/ui/ControlPanel/Toolbars/ItemTemplate"/> + +</$set> + +</$set> + +!! Breakpoint Position + +The breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`). + +<$edit-text tiddler="$:/config/plugins/menubar/breakpoint" default="" tag="input"/> + +!! Menu Bar Colours + +To change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette diff --git a/plugins/tiddlywiki/menubar/items/contents.tid b/plugins/tiddlywiki/menubar/items/contents.tid new file mode 100644 index 000000000..5753679eb --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/contents.tid @@ -0,0 +1,11 @@ +title: $:/plugins/tiddlywiki/menubar/items/contents +caption: Contents +description: Table of Contents +is-dropdown: yes +tags: $:/tags/MenuBar + +<div class="tc-table-of-contents"> + +<<toc-selective-expandable 'TableOfContents'>> + +</div> diff --git a/plugins/tiddlywiki/menubar/items/hamburger.tid b/plugins/tiddlywiki/menubar/items/hamburger.tid new file mode 100644 index 000000000..cbacb5a26 --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/hamburger.tid @@ -0,0 +1,17 @@ +title: $:/plugins/tiddlywiki/menubar/items/hamburger +tags: $:/tags/MenuBar +caption: Hamburger +description: Show the full menu bar on a narrow screen +custom-menu-content: {{$:/plugins/tiddlywiki/menubar/items/hamburger}} +show-when: narrow + +<$list filter="[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]"> +<$button set="$:/state/popup/menubar/hamburger" setTo="yes"> +{{$:/core/images/menu-button}} +</$button> +</$list> +<$list filter="[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]"> +<$button set="$:/state/popup/menubar/hamburger" setTo="no"> +{{$:/core/images/close-button}} +</$button> +</$list> diff --git a/plugins/tiddlywiki/menubar/items/pagecontrols.tid b/plugins/tiddlywiki/menubar/items/pagecontrols.tid new file mode 100644 index 000000000..833d035f4 --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/pagecontrols.tid @@ -0,0 +1,19 @@ +title: $:/plugins/tiddlywiki/menubar/items/pagecontrols +tags: $:/tags/MenuBar +description: Page controls from the sidebar +caption: Page controls +custom-menu-content: <$transclude tiddler="$:/plugins/tiddlywiki/menubar/items/pagecontrols" mode="inline"/> + +\whitespace trim +\define config-title() +$:/config/PageControlButtons/Visibility/$(listItem)$ +\end +<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem"> +<$set name="hidden" value=<<config-title>>> +<$list filter="[<hidden>!text[hide]]" storyview="pop" variable="ignore"> +<$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"> +<$transclude tiddler=<<listItem>> mode="inline"/> +</$set> +</$list> +</$set> +</$list> diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid new file mode 100644 index 000000000..0ee37b2c2 --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -0,0 +1,33 @@ +title: $:/plugins/tiddlywiki/menubar/items/search +custom-menu-content: {{$:/plugins/tiddlywiki/menubar/items/search}} +description: Search +caption: Search +tags: $:/tags/MenuBar + +<$set name="searchTiddler" value="$:/temp/topmenusearch"> + +<span style="margin: 0 0.5em;"> + +<$edit-text tiddler=<<searchTiddler>> tag="input" type="search" focusPopup="$:/state/popup/menubar-search-dropdown" class="tc-popup-handle tc-menu-show-when-wide" placeholder="Search..." default=""/> + +</span> + +<$reveal tag="div" class="tc-block-dropdown-wrapper" state="$:/state/popup/menubar-search-dropdown" type="nomatch" text="" default=""> + +<div class="tc-block-dropdown tc-search-drop-down"> + +<$list filter="[<searchTiddler>get[text]minlength[1]]" emptyMessage="""<div class="tc-search-results">Type your search terms</div>""" variable="ignore"> + +<$list filter="[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> + +{{$:/core/ui/SearchResults}} + +</$list> + +</$list> + +</div> + +</$reveal> + +</$set> diff --git a/plugins/tiddlywiki/menubar/items/server.tid b/plugins/tiddlywiki/menubar/items/server.tid new file mode 100644 index 000000000..0f0e438ad --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/server.tid @@ -0,0 +1,14 @@ +title: $:/plugins/tiddlywiki/menubar/items/server +tags: $:/tags/MenuBar +description: Server options +caption: Server +custom-menu-content: <$transclude tiddler="$:/plugins/tiddlywiki/menubar/items/server" mode="inline"/> + +<$list filter="[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]" variable="ignore"> +<$transclude tiddler="$:/core/ui/Buttons/save-wiki" mode="inline"/> +</$list> +<$list filter="[[$:/status/IsLoggedIn]get[text]else[no]match[no]]" variable="ignore"> +<$button message="tm-login"> +Login +</$button> +</$list> diff --git a/plugins/tiddlywiki/menubar/items/topleftbar.tid b/plugins/tiddlywiki/menubar/items/topleftbar.tid new file mode 100644 index 000000000..2743848a6 --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/topleftbar.tid @@ -0,0 +1,11 @@ +title: $:/plugins/tiddlywiki/menubar/items/topleftbar +tags: $:/tags/MenuBar +description: Items from $:/tags/TopLeftBar +caption: Legacy Top Left Bar +custom-menu-content: <$transclude tiddler="$:/plugins/tiddlywiki/menubar/items/topleftbar" mode="inline"/> + +<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]" variable="listItem" storyview="pop"> + +<$transclude tiddler=<<listItem>> mode="inline"/> + +</$list> \ No newline at end of file diff --git a/plugins/tiddlywiki/menubar/items/toprightbar.tid b/plugins/tiddlywiki/menubar/items/toprightbar.tid new file mode 100644 index 000000000..38ac3a1cd --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/toprightbar.tid @@ -0,0 +1,11 @@ +title: $:/plugins/tiddlywiki/menubar/items/toprightbar +tags: $:/tags/MenuBar +description: Items from $:/tags/TopRightBar +caption: Legacy Top Right Bar +custom-menu-content: <$transclude tiddler="$:/plugins/tiddlywiki/menubar/items/toprightbar" mode="inline"/> + +<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]" variable="listItem" storyview="pop"> + +<$transclude tiddler=<<listItem>> mode="inline"/> + +</$list> \ No newline at end of file diff --git a/plugins/tiddlywiki/menubar/menu.tid b/plugins/tiddlywiki/menubar/menu.tid new file mode 100644 index 000000000..291d7dc80 --- /dev/null +++ b/plugins/tiddlywiki/menubar/menu.tid @@ -0,0 +1,67 @@ +title: $:/plugins/tiddlywiki/menubar/menu +tags: $:/tags/PageTemplate + +\define menubar-inner(size) +<ul class="tc-menubar-list"> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]]"> +<$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore"> +<$list filter="[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]" variable="ignore"> +<li style={{!!custom-menu-styles}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}> +<$list filter="[<currentTiddler>!is-dropdown[yes]]" variable="listItem" emptyMessage=""" + <!-- Dropdown --> + <$set name="dropdown-state" value=<<qualify "$:/state/popup/topmenu/dropdown/">>> + <$set name="dropdown-state" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}> + <$button popup=<<dropdown-state>> selectedClass="tc-selected"> + <$set name="tv-wikilinks" value="no"> + <$transclude field="caption" mode="inline"/> + <$text text=" "/> + <span class="tc-menubar-dropdown-arrow"> + <$transclude tiddler="$:/core/images/down-arrow" mode="inline"/> + </span> + </$set> + </$button> + </$set> + </$set> +"""> +<$list filter="[<currentTiddler>has[custom-menu-content]]" variable="listItem" emptyMessage=""" + <!-- Link --> + <$link to={{!!target}}> + <$set name="tv-wikilinks" value="no"> + <$transclude field="caption" mode="inline"/> + </$set> + </$link> +"""> +<!-- Custom content --> +<$transclude field="custom-menu-content" mode="inline"/> +</$list> +</$list> +</li> +</$list> +</$list> +</$list> +</ul> +\end + +<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]limit[1]]" variable="listItem"> +<nav class="tc-menubar tc-adjust-top-of-scroll"> +<div class="tc-menubar-narrow"> +<<menubar-inner narrow>> +</div> +<div class="tc-menubar-wide"> +<<menubar-inner wide>> +</div> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]"> +<$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore"> +<$set name="dropdown-state" value=<<qualify "$:/state/popup/topmenu/dropdown/">>> +<$set name="dropdown-state" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}> +<$reveal type="popup" state=<<dropdown-state>> class={{{ [<currentTiddler>get[dropdown]get[class]] }}} tag="div"> +<div class="tc-drop-down"> +<$transclude/> +</div> +</$reveal> +</$set> +</$set> +</$list> +</$list> +</nav> +</$list> diff --git a/plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-topleftbar.tid b/plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-topleftbar.tid new file mode 100644 index 000000000..a4af24d52 --- /dev/null +++ b/plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-topleftbar.tid @@ -0,0 +1,3 @@ +title: $:/core/ui/PageTemplate/topleftbar + +<!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar --> \ No newline at end of file diff --git a/plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-toprightbar.tid b/plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-toprightbar.tid new file mode 100644 index 000000000..a2330fef4 --- /dev/null +++ b/plugins/tiddlywiki/menubar/overrides/core-ui-PageTemplate-toprightbar.tid @@ -0,0 +1,3 @@ +title: $:/core/ui/PageTemplate/toprightbar + +<!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar --> \ No newline at end of file diff --git a/plugins/tiddlywiki/menubar/plugin.info b/plugins/tiddlywiki/menubar/plugin.info new file mode 100644 index 000000000..4fa580198 --- /dev/null +++ b/plugins/tiddlywiki/menubar/plugin.info @@ -0,0 +1,6 @@ +{ + "title": "$:/plugins/tiddlywiki/menubar", + "name": "Menu Bar", + "description": "Menu Bar", + "list": "readme config" +} diff --git a/plugins/tiddlywiki/menubar/readme.tid b/plugins/tiddlywiki/menubar/readme.tid new file mode 100644 index 000000000..fcc6a75c5 --- /dev/null +++ b/plugins/tiddlywiki/menubar/readme.tid @@ -0,0 +1,27 @@ +title: $:/plugins/tiddlywiki/menubar/readme + +!! Introduction + +This plugin provides a menu bar with the following features: + +* Menu items take the form of simple text links, dropdowns, or entirely custom content +* Menu items can be individually enabled via the control panel +* Responds to reduced screen width by abbreviating the menu items to a "hamburger" dropdown + +!! Menu Item Tiddlers + +Menu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by this plugin: + +|!Field Name |!Purpose | +|title |Each menu item must have a unique title (not shown to the user) | +|description |Description for use in listings | +|tags |Must contain `$:/tags/MenuBar` | +|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required | +|target |For simple link menu items specifies a tiddler title as the target of the link | +|is-dropdown |Set to `yes` to indicate a dropdown menu item | +|text |For dropdown menu items, specifies the body of the dropdown | +|custom-menu-content |Optional wikitext to be displayed in place of the caption | +|custom-menu-styles |Optional string of styles to be applied to menu item | + +Custom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element. + diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid new file mode 100644 index 000000000..f53606a31 --- /dev/null +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -0,0 +1,155 @@ +title: $:/plugins/tiddlywiki/menubar/styles +tags: [[$:/tags/Stylesheet]] + +\define breakpoint-plus-one() +<$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] }}} /> +\end + +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline + +nav.tc-menubar { + position: fixed; + z-index: 1100; + display: inline-block; + top: 0; + right: 0; + left: 0; +} + +nav.tc-menubar ul.tc-menubar-list { + position: relative; + list-style-type: none; + margin: 0; + padding: 0 0 0 42px; + background: <<colour background>>; + background: <<colour menubar-background>>; + <<box-shadow "1px 1px 5px rgba(0, 0, 0, 0.3)">> +} + +nav.tc-menubar li.tc-menubar-item { + display: inline-block; + margin: 0; + padding: 0; +} + +nav.tc-menubar .tc-menubar-narrow li.tc-menubar-item { + display: block; +} + +nav.tc-menubar li.tc-menubar-item > a, +nav.tc-menubar li.tc-menubar-item > button { + display: inline-block; +/* text-transform: uppercase; */ + line-height: 1; + font-weight: 700; + color: <<colour foreground>>; + color: <<colour menubar-foreground>>; + fill: <<colour foreground>>; + fill: <<colour menubar-foreground>>; + text-decoration: none; + padding: 0.5em; + margin: 0; + background: none; + border: none; + cursor: pointer; + border-radius: 0; + text-decoration: none; +} + +nav.tc-menubar li.tc-menubar-item > a.tc-selected, +nav.tc-menubar li.tc-menubar-item > button.tc-selected { + background: <<colour foreground>>; + background: <<colour menubar-foreground>>; + color: <<colour background>>; + color: <<colour menubar-background>>; + fill: <<colour background>>; + fill: <<colour menubar-background>>; +} + +nav.tc-menubar li.tc-menubar-item svg { + transition: none; + width: 1em; + height: 1em; + fill: <<colour foreground>>; + fill: <<colour menubar-foreground>>; +} + +nav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg { + width: 0.5em; + height: 0.5em; +} + +nav.tc-menubar li.tc-menubar-item > a.tc-selected svg, +nav.tc-menubar li.tc-menubar-item > button.tc-selected svg { + fill: <<colour background>>; + fill: <<colour menubar-background>>; +} + +nav.tc-menubar li.tc-menubar-item > a:hover, +nav.tc-menubar li.tc-menubar-item > button:hover svg, +nav.tc-menubar li.tc-menubar-item > button:hover { + background: <<colour foreground>>; + background: <<colour menubar-foreground>>; + color: <<colour background>>; + color: <<colour menubar-background>>; + fill: <<colour background>>; + fill: <<colour menubar-background>>; + border-radius: 0; + text-decoration: none; +} + +nav.tc-menubar li.tc-menubar-item > a:active, +nav.tc-menubar li.tc-menubar-item > button:active svg, +nav.tc-menubar li.tc-menubar-item > button:active { + background: <<colour foreground>>; + background: <<colour menubar-foreground>>; + color: <<colour background>>; + color: <<colour menubar-background>>; + fill: <<colour background>>; + fill: <<colour menubar-background>>; + border-radius: 0; + text-decoration: none; +} + +nav.tc-menubar .tc-drop-down, +nav.tc-menubar .tc-block-dropdown { + max-width: 70vw; + max-height: 70vh; + overflow: auto; +} + +nav.tc-menubar .tc-drop-down a { + text-decoration: none; +} + +nav.tc-menubar .tc-drop-down .tc-table-of-contents button { + display: inline-block; + width: auto; +} + +nav.tc-menubar .tc-drop-down ol { + margin: 0; +} + +@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) { + + .tc-menubar-wide { + display: none; + } + + html nav.tc-menubar ul.tc-menubar-list { + padding: 0 0 0 8px; + } + +} + +@media (min-width: <<breakpoint-plus-one>>) { + + nav.tc-menubar li.tc-menubar-item.tc-menubar-narrow, + .tc-menubar-narrow { + display: none; + } + +} + + diff --git a/plugins/tiddlywiki/menubar/tags-MenuBar.tid b/plugins/tiddlywiki/menubar/tags-MenuBar.tid new file mode 100644 index 000000000..ec1fe4035 --- /dev/null +++ b/plugins/tiddlywiki/menubar/tags-MenuBar.tid @@ -0,0 +1,2 @@ +title: $:/tags/MenuBar +list: $:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar From b179a60111f96a4978eb92274a725dfa7b5deb43 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 14:34:06 +0000 Subject: [PATCH 0490/2376] Tweak some system buttons to look better in the new menu bar The reveal widget leaves behind an unnecessary span, which breaks the CSS used to target the button. --- core/ui/TopRightBar/menu.tid | 8 ++++---- plugins/tiddlywiki/help/help.tid | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/ui/TopRightBar/menu.tid b/core/ui/TopRightBar/menu.tid index 73929eee0..318a35b31 100644 --- a/core/ui/TopRightBar/menu.tid +++ b/core/ui/TopRightBar/menu.tid @@ -1,9 +1,9 @@ title: $:/core/ui/TopBar/menu tags: $:/tags/TopRightBar -<$reveal state="$:/state/sidebar" type="nomatch" text="no"> +<$list filter="[[$:/state/sidebar]get[text]!match[no]]" variable="ignore"> <$button set="$:/state/sidebar" setTo="no" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-right}}</$button> -</$reveal> -<$reveal state="$:/state/sidebar" type="match" text="no"> +</$list> +<$list filter="[[$:/state/sidebar]get[text]match[no]]" variable="ignore"> <$button set="$:/state/sidebar" setTo="yes" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-left}}</$button> -</$reveal> +</$list> diff --git a/plugins/tiddlywiki/help/help.tid b/plugins/tiddlywiki/help/help.tid index e2e7e9f0b..345a528fb 100644 --- a/plugins/tiddlywiki/help/help.tid +++ b/plugins/tiddlywiki/help/help.tid @@ -6,7 +6,7 @@ description: {{$:/language/Buttons/Help/Hint}} \whitespace trim \define help-inner() \whitespace trim -<$reveal type="match" state="$:/config/ShowHelp" text="yes"> +<$list filter="[[$:/config/ShowHelp]get[text]match[yes]]" variable="ignore"> <$button set="$:/config/ShowHelp" setTo="no" tooltip={{$:/language/Buttons/Help/Hint}} aria-label={{$:/language/Buttons/Help/Caption}} class="""$(tv-config-toolbar-class)$ tc-selected"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/help}} @@ -15,8 +15,8 @@ description: {{$:/language/Buttons/Help/Hint}} <span class="tc-btn-text"><$text text={{$:/language/Buttons/Help/Caption}}/></span> </$list> </$button> -</$reveal> -<$reveal type="nomatch" state="$:/config/ShowHelp" text="yes"> +</$list> +<$list filter="[[$:/config/ShowHelp]get[text]!match[yes]]" variable="ignore"> <$button set="$:/config/ShowHelp" setTo="yes" tooltip={{$:/language/Buttons/Help/Hint}} aria-label={{$:/language/Buttons/Help/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/help}} @@ -25,6 +25,6 @@ description: {{$:/language/Buttons/Help/Hint}} <span class="tc-btn-text"><$text text={{$:/language/Buttons/Help/Caption}}/></span> </$list> </$button> -</$reveal> +</$list> \end <<help-inner>> From 0247d0d88b06da871486589753a7cd59c8facc59 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 14:36:23 +0000 Subject: [PATCH 0491/2376] Disable sticky titles for the prerelease Sadly, they don't play nicely with the new menu bar --- editions/prerelease/tiddlers/system/stickytitles.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/system/stickytitles.tid b/editions/prerelease/tiddlers/system/stickytitles.tid index 40b187156..90161be7f 100644 --- a/editions/prerelease/tiddlers/system/stickytitles.tid +++ b/editions/prerelease/tiddlers/system/stickytitles.tid @@ -1,2 +1,2 @@ title: $:/themes/tiddlywiki/vanilla/options/stickytitles -text: yes +text: no From e8aafdfb660422b15529f0b1aac00be105e967b8 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 15:56:55 +0000 Subject: [PATCH 0492/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.22.tid | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index d934b2fe8..0c7530c9e 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -1,6 +1,6 @@ caption: 5.1.22 created: 20200219102220589 -modified: 20200219102220589 +modified: 20200228155312587 tags: ReleaseNotes title: Release 5.1.22 type: text/vnd.tiddlywiki @@ -19,6 +19,10 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * Plugins may now declare dependencies that are automatically installed without user intervention * All plugins now feature a concise, informal name (in addition to the description and title) +!! New "Menu Bar" Plugin + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ad2d4503e584ce9f931dbd1e98f95738b2841e51]] ''menubar'' plugin to create a menu bar that is responsive on mobile devices, and supports search, dropdowns and links + !! New "Freelinks" Plugin * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/447cd56da9db2ee169607f32923081ac47e78354]] ''freelinks'' plugin to automatically create links from any tiddler title @@ -74,6 +78,7 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5a5c967a3943beb6a4fa513cb34d231e46304452]] new [[SystemTag: $:/tags/Macro/View]] for creating macros that are only available within the view template * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4404]] support for embedding `.webm` and `.ogg` video files * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3df1f9c9d0cc92b596262c0220ecf529c7fbb858]] ''spaces'' parameter to [[jsontiddlers Macro]] for controlling the formatting of the output +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/4afde5a722afc91c826305800ba536c5fe8ef2e5]] the [[colour Macro]] to add support for specifying a fallback for colours not in the current colour palette ! Bug Fixes From 5644c2ac7b0add97efa9760fa61a6ddc6783a84d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 16:09:26 +0000 Subject: [PATCH 0493/2376] Menubar tweaks * Fix old references to "top menu" to the new "menu bar" terminology * Use vanilla breakpoint for responsive adjustment to menu bar padding --- plugins/tiddlywiki/menubar/config.tid | 4 ++-- plugins/tiddlywiki/menubar/items/search.tid | 2 +- plugins/tiddlywiki/menubar/styles.tid | 12 ++++++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/plugins/tiddlywiki/menubar/config.tid b/plugins/tiddlywiki/menubar/config.tid index 54132f988..9b564ee68 100644 --- a/plugins/tiddlywiki/menubar/config.tid +++ b/plugins/tiddlywiki/menubar/config.tid @@ -1,10 +1,10 @@ title: $:/plugins/tiddlywiki/menubar/config tags: $:/tags/ControlPanel/Toolbars -caption: Top Menu Bar +caption: Menu Bar \define config-base() $:/config/plugins/menubar/MenuItems/Visibility/ -! Top Menu Configuration +! Menu Bar Configuration !! Menu Items diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid index 0ee37b2c2..edbf773ee 100644 --- a/plugins/tiddlywiki/menubar/items/search.tid +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -4,7 +4,7 @@ description: Search caption: Search tags: $:/tags/MenuBar -<$set name="searchTiddler" value="$:/temp/topmenusearch"> +<$set name="searchTiddler" value="$:/temp/menubarsearch"> <span style="margin: 0 0.5em;"> diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index f53606a31..e90bf445e 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -26,6 +26,14 @@ nav.tc-menubar ul.tc-menubar-list { <<box-shadow "1px 1px 5px rgba(0, 0, 0, 0.3)">> } +@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { + + html nav.tc-menubar ul.tc-menubar-list { + padding: 0 0 0 8px; + } + +} + nav.tc-menubar li.tc-menubar-item { display: inline-block; margin: 0; @@ -137,10 +145,6 @@ nav.tc-menubar .tc-drop-down ol { display: none; } - html nav.tc-menubar ul.tc-menubar-list { - padding: 0 0 0 8px; - } - } @media (min-width: <<breakpoint-plus-one>>) { From edf025ebdc7826b18d06cf69222e208e63d8e0e2 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 17:22:47 +0000 Subject: [PATCH 0494/2376] Push top right menu items to the right Looking more backwards compatible --- plugins/tiddlywiki/menubar/items/toprightbar.tid | 1 + plugins/tiddlywiki/menubar/menu.tid | 1 + plugins/tiddlywiki/menubar/readme.tid | 1 + 3 files changed, 3 insertions(+) diff --git a/plugins/tiddlywiki/menubar/items/toprightbar.tid b/plugins/tiddlywiki/menubar/items/toprightbar.tid index 38ac3a1cd..5eaf5791b 100644 --- a/plugins/tiddlywiki/menubar/items/toprightbar.tid +++ b/plugins/tiddlywiki/menubar/items/toprightbar.tid @@ -3,6 +3,7 @@ tags: $:/tags/MenuBar description: Items from $:/tags/TopRightBar caption: Legacy Top Right Bar custom-menu-content: <$transclude tiddler="$:/plugins/tiddlywiki/menubar/items/toprightbar" mode="inline"/> +custom-menu-styles: float: right; <$list filter="[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]" variable="listItem" storyview="pop"> diff --git a/plugins/tiddlywiki/menubar/menu.tid b/plugins/tiddlywiki/menubar/menu.tid index 291d7dc80..58f8ce80c 100644 --- a/plugins/tiddlywiki/menubar/menu.tid +++ b/plugins/tiddlywiki/menubar/menu.tid @@ -50,6 +50,7 @@ tags: $:/tags/PageTemplate <div class="tc-menubar-wide"> <<menubar-inner wide>> </div> +<div style="clear:both;"/> <$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]"> <$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore"> <$set name="dropdown-state" value=<<qualify "$:/state/popup/topmenu/dropdown/">>> diff --git a/plugins/tiddlywiki/menubar/readme.tid b/plugins/tiddlywiki/menubar/readme.tid index fcc6a75c5..b51d24abf 100644 --- a/plugins/tiddlywiki/menubar/readme.tid +++ b/plugins/tiddlywiki/menubar/readme.tid @@ -25,3 +25,4 @@ Menu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by Custom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element. +Note that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`. From 63ba2883a42872d3aabca0579a9e7b16be875e10 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 28 Feb 2020 21:35:45 +0000 Subject: [PATCH 0495/2376] Menubar: Reverse order of top right menu items --- plugins/tiddlywiki/menubar/items/toprightbar.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/menubar/items/toprightbar.tid b/plugins/tiddlywiki/menubar/items/toprightbar.tid index 5eaf5791b..87ba216e3 100644 --- a/plugins/tiddlywiki/menubar/items/toprightbar.tid +++ b/plugins/tiddlywiki/menubar/items/toprightbar.tid @@ -5,7 +5,7 @@ caption: Legacy Top Right Bar custom-menu-content: <$transclude tiddler="$:/plugins/tiddlywiki/menubar/items/toprightbar" mode="inline"/> custom-menu-styles: float: right; -<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]" variable="listItem" storyview="pop"> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]" variable="listItem" storyview="pop"> <$transclude tiddler=<<listItem>> mode="inline"/> From 7ffe3fc91fb994fc62b68a87afb345c44aa188a7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 29 Feb 2020 15:51:42 +0000 Subject: [PATCH 0496/2376] Prerelease: Disable browser storage to make testing less confusing --- editions/prerelease/tiddlywiki.info | 1 - 1 file changed, 1 deletion(-) diff --git a/editions/prerelease/tiddlywiki.info b/editions/prerelease/tiddlywiki.info index 6d245f429..e09b17189 100644 --- a/editions/prerelease/tiddlywiki.info +++ b/editions/prerelease/tiddlywiki.info @@ -14,7 +14,6 @@ "tiddlywiki/dynaview", "tiddlywiki/codemirror", "tiddlywiki/comments", - "tiddlywiki/browser-storage", "tiddlywiki/menubar" ], "themes": [ From 6cdffc4eae9643b5f236598794cf0262d26f4944 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 29 Feb 2020 15:56:22 +0000 Subject: [PATCH 0497/2376] Fix broken filters introduced in b179a6011 The mistake arose because browser local storage was enabled --- core/ui/TopRightBar/menu.tid | 4 ++-- plugins/tiddlywiki/help/help.tid | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/ui/TopRightBar/menu.tid b/core/ui/TopRightBar/menu.tid index 318a35b31..a16111086 100644 --- a/core/ui/TopRightBar/menu.tid +++ b/core/ui/TopRightBar/menu.tid @@ -1,9 +1,9 @@ title: $:/core/ui/TopBar/menu tags: $:/tags/TopRightBar -<$list filter="[[$:/state/sidebar]get[text]!match[no]]" variable="ignore"> +<$list filter="[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]" variable="ignore"> <$button set="$:/state/sidebar" setTo="no" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-right}}</$button> </$list> -<$list filter="[[$:/state/sidebar]get[text]match[no]]" variable="ignore"> +<$list filter="[[$:/state/sidebar]get[text]] +[else[yes]match[no]]" variable="ignore"> <$button set="$:/state/sidebar" setTo="yes" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-left}}</$button> </$list> diff --git a/plugins/tiddlywiki/help/help.tid b/plugins/tiddlywiki/help/help.tid index 345a528fb..eca5ffaa7 100644 --- a/plugins/tiddlywiki/help/help.tid +++ b/plugins/tiddlywiki/help/help.tid @@ -6,7 +6,7 @@ description: {{$:/language/Buttons/Help/Hint}} \whitespace trim \define help-inner() \whitespace trim -<$list filter="[[$:/config/ShowHelp]get[text]match[yes]]" variable="ignore"> +<$list filter="[[$:/config/ShowHelp]get[text]] +[else[no]match[yes]]" variable="ignore"> <$button set="$:/config/ShowHelp" setTo="no" tooltip={{$:/language/Buttons/Help/Hint}} aria-label={{$:/language/Buttons/Help/Caption}} class="""$(tv-config-toolbar-class)$ tc-selected"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/help}} @@ -16,7 +16,7 @@ description: {{$:/language/Buttons/Help/Hint}} </$list> </$button> </$list> -<$list filter="[[$:/config/ShowHelp]get[text]!match[yes]]" variable="ignore"> +<$list filter="[[$:/config/ShowHelp]get[text]] +[else[no]!match[yes]]" variable="ignore"> <$button set="$:/config/ShowHelp" setTo="yes" tooltip={{$:/language/Buttons/Help/Hint}} aria-label={{$:/language/Buttons/Help/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/help}} From a942b161addc57fbabec7dac57070f2860346b72 Mon Sep 17 00:00:00 2001 From: scott willeke <scott@willeke.com> Date: Mon, 2 Mar 2020 01:27:55 -0800 Subject: [PATCH 0498/2376] Signing the CLA (#4440) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index f5cc01e4f..25cc8c2ac 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -384,4 +384,6 @@ Stefan Krüger, @s-light, 2020/01/04 Lee Sheng Long, @s-l-lee, 2020/01/25 +Scott Willeke, @activescott, 2020/02/01 + @lucible, 2020/02/05 From 3fd301a5d2420c8c21f2d601e7dc20852f0ab58e Mon Sep 17 00:00:00 2001 From: scott willeke <scott@willeke.com> Date: Mon, 2 Mar 2020 01:29:16 -0800 Subject: [PATCH 0499/2376] Markdown plugin: Description notes remarkable instead of markdown-js (#4422) --- plugins/tiddlywiki/markdown/plugin.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/markdown/plugin.info b/plugins/tiddlywiki/markdown/plugin.info index b95685831..d26ccf93c 100755 --- a/plugins/tiddlywiki/markdown/plugin.info +++ b/plugins/tiddlywiki/markdown/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/markdown", "name": "Markdown", - "description": "Markdown parser based on markdown-js", + "description": "Markdown parser based on remarkable by Jon Schlinkert", "list": "readme usage" } From 24d2804799b09278c4bb83918d8b75dfa49dbed4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 3 Mar 2020 12:03:32 +0000 Subject: [PATCH 0500/2376] Add action-popup widget Fixes #4185 --- core/modules/widgets/action-popup.js | 79 +++++++++++++++++++ .../tiddlers/widgets/ActionPopupWidget.tid | 29 +++++++ 2 files changed, 108 insertions(+) create mode 100644 core/modules/widgets/action-popup.js create mode 100644 editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid diff --git a/core/modules/widgets/action-popup.js b/core/modules/widgets/action-popup.js new file mode 100644 index 000000000..84fcec821 --- /dev/null +++ b/core/modules/widgets/action-popup.js @@ -0,0 +1,79 @@ +/*\ +title: $:/core/modules/widgets/action-popup.js +type: application/javascript +module-type: widget + +Action widget to trigger a popup. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var ActionPopupWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +ActionPopupWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +ActionPopupWidget.prototype.render = function(parent,nextSibling) { + this.computeAttributes(); + this.execute(); +}; + +/* +Compute the internal state of the widget +*/ +ActionPopupWidget.prototype.execute = function() { + this.actionState = this.getAttribute("$state"); + this.actionCoords = this.getAttribute("$coords"); +}; + +/* +Refresh the widget by ensuring our attributes are up to date +*/ +ActionPopupWidget.prototype.refresh = function(changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if(changedAttributes["$state"] || changedAttributes["$coords"]) { + this.refreshSelf(); + return true; + } + return this.refreshChildren(changedTiddlers); +}; + +/* +Invoke the action associated with this widget +*/ +ActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) { + // Trigger the popup + var popupLocationRegExp = /^\((-?[0-9\.E]+),(-?[0-9\.E]+),(-?[0-9\.E]+),(-?[0-9\.E]+)\)$/, + match = popupLocationRegExp.exec(this.actionCoords); + if(match) { + $tw.popup.triggerPopup({ + domNode: null, + domNodeRect: { + left: parseFloat(match[1]), + top: parseFloat(match[2]), + width: parseFloat(match[3]), + height: parseFloat(match[4]) + }, + title: this.actionState, + wiki: this.wiki + }); + } + return true; // Action was invoked +}; + +exports["action-popup"] = ActionPopupWidget; + +})(); diff --git a/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid new file mode 100644 index 000000000..9aa5b0c47 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid @@ -0,0 +1,29 @@ +caption: action-popup +created: 20200303114556528 +modified: 20200303114556528 +tags: Widgets ActionWidgets +title: ActionPopupWidget +type: text/vnd.tiddlywiki + +! Introduction + +The ''action-popup'' widget is an [[action widget|ActionWidgets]] that triggers the display of a popup defined via a state tiddler. ActionWidgets are used within triggering widgets such as the ButtonWidget. + +! Content and Attributes + +The ''action-popup'' widget is invisible. Any content within it is ignored. + +|!Attribute |!Description | +|$state |The title of the state tiddler for the popup | +|$coords |Optional coordinates for the handle to which popup is positioned (in the format `(x,y,w,h)`) | + +! Examples + +Here is an example of button that triggers the "more" button in the sidebar "Tools" tab + +<$macrocall $name='wikitext-example-without-html' +src='<$button> +<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" $value="$:/core/ui/SideBar/Tools"/> +<$action-popup $state="$:/state/popup/more-435115636" $coords="(0,20,0,0)"/> +Click me! +</$button>'/> From 6091b013864af3d9918df69894f4aa05d1b8ffeb Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 6 Mar 2020 14:52:37 +0000 Subject: [PATCH 0501/2376] Add hidden setting for default tiddler icon --- core/ui/ViewTemplate/title.tid | 4 +++- .../hiddensettings/Hidden Setting Default Tiddler Icon.tid | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Default Tiddler Icon.tid diff --git a/core/ui/ViewTemplate/title.tid b/core/ui/ViewTemplate/title.tid index ad3b42936..f611d71ab 100644 --- a/core/ui/ViewTemplate/title.tid +++ b/core/ui/ViewTemplate/title.tid @@ -16,7 +16,9 @@ $:/config/ViewToolbarButtons/Visibility/$(listItem)$ <$link> <$set name="foregroundColor" value={{!!color}}> <span class="tc-tiddler-title-icon" style=<<title-styles>>> -<$transclude tiddler={{!!icon}}/> +<$transclude tiddler={{!!icon}}> +<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/> +</$transclude> </span> </$set> <$list filter="[all[current]removeprefix[$:/]]"> diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Default Tiddler Icon.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Default Tiddler Icon.tid new file mode 100644 index 000000000..fea6fb469 --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Default Tiddler Icon.tid @@ -0,0 +1,7 @@ +created: 20200306145004925 +modified: 20200306145004925 +tags: [[Hidden Settings]] +title: Hidden Setting: Default Tiddler Icon +type: text/vnd.tiddlywiki + +A default tiddler icon can be specified by creating a tiddler called $:/config/DefaultTiddlerIcon containing the title of the tiddler containing the icon. From a65ec87c53fceee69dac87d1051b46ebb7aaaf75 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 7 Mar 2020 14:00:46 +0000 Subject: [PATCH 0502/2376] Fix test for needing to update text editor DOM Checking the active element is clumsy, and interferes with debugging. Checking the content is clearer, and avoids the Firefox bug. Fixes #4472 --- core/modules/editor/engines/framed.js | 2 +- core/modules/editor/engines/simple.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 6e7da24da..d792309ed 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -106,7 +106,7 @@ Set the text of the engine if it doesn't currently have focus */ FramedEngine.prototype.setText = function(text,type) { if(!this.domNode.isTiddlyWikiFakeDom) { - if(this.domNode.ownerDocument.activeElement !== this.domNode) { + if(this.domNode.value !== text) { this.domNode.value = text; } // Fix the height if needed diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index bb77893d7..b94934810 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -67,7 +67,7 @@ Set the text of the engine if it doesn't currently have focus */ SimpleEngine.prototype.setText = function(text,type) { if(!this.domNode.isTiddlyWikiFakeDom) { - if(this.domNode.ownerDocument.activeElement !== this.domNode || text === "") { + if(this.domNode.value !== text) { this.domNode.value = text; } // Fix the height if needed From 665b63ec38b75dfe62009d2f5514682de60e953f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 8 Mar 2020 17:11:21 +0000 Subject: [PATCH 0503/2376] Fix lack of refresh when button widget actions attribute changes --- core/modules/widgets/button.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 592e4c722..67eaf26b9 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -219,7 +219,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ ButtonWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes["class"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) { + if(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes["class"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) { this.refreshSelf(); return true; } From ae9ce4f01c6048aeb5604a93b57c2f3e4f959162 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 9 Mar 2020 20:31:42 +0000 Subject: [PATCH 0504/2376] ViewTemplate: Add tc-tiddler-overridden-shadow class --- core/ui/ViewTemplate.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ViewTemplate.tid b/core/ui/ViewTemplate.tid index 077fb79b8..71303d3dd 100644 --- a/core/ui/ViewTemplate.tid +++ b/core/ui/ViewTemplate.tid @@ -4,6 +4,6 @@ title: $:/core/ui/ViewTemplate $:/state/folded/$(currentTiddler)$ \end \import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]] -<$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[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"><$transclude tiddler=<<listItem>>/></$list> +<$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[ ]] }}}><$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list> </div> </$vars> From a22438589ee76e4fc9505414bf44786238ae4bfd Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 9 Mar 2020 21:05:50 +0000 Subject: [PATCH 0505/2376] Remove unsafe externalimages build target from server edition See #4484 --- editions/server/tiddlywiki.info | 5 ----- 1 file changed, 5 deletions(-) diff --git a/editions/server/tiddlywiki.info b/editions/server/tiddlywiki.info index 7c623fdc4..5c56d6a8a 100644 --- a/editions/server/tiddlywiki.info +++ b/editions/server/tiddlywiki.info @@ -12,11 +12,6 @@ "build": { "index": [ "--rendertiddler","$:/plugins/tiddlywiki/tiddlyweb/save/offline","index.html","text/plain"], - "externalimages": [ - "--savetiddlers","[is[image]]","images", - "--setfield","[is[image]]","_canonical_uri","$:/core/templates/canonical-uri-external-image","text/plain", - "--setfield","[is[image]]","text","","text/plain", - "--rendertiddler","$:/plugins/tiddlywiki/tiddlyweb/save/offline","externalimages.html","text/plain"], "static": [ "--rendertiddler","$:/core/templates/static.template.html","static.html","text/plain", "--rendertiddler","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", From 8cd1dc36c15b1a413ae178ea987b121d866a2828 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 9 Mar 2020 22:07:34 +0100 Subject: [PATCH 0506/2376] Fix suspected typo that impacts refresh handling (#4464) --- core/modules/widgets/draggable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/draggable.js b/core/modules/widgets/draggable.js index d1bdf2a16..e12f2c693 100644 --- a/core/modules/widgets/draggable.js +++ b/core/modules/widgets/draggable.js @@ -80,7 +80,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ DraggableWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedTiddlers.tag || changedTiddlers["class"]) { + if(changedAttributes.tag || changedAttributes["class"]) { this.refreshSelf(); return true; } From 8b5f38c53ed6f738e6600fd37c7b831a28d0cb6b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 9 Mar 2020 22:08:22 +0100 Subject: [PATCH 0507/2376] Add menubar-background and menubar-foreground to Nord palette (#4482) Nord palette --- core/palettes/Nord.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index 4dc220bf1..592c896c4 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -42,6 +42,8 @@ external-link-foreground-hover: inherit external-link-foreground-visited: #5E81AC external-link-foreground: #8FBCBB foreground: #d8dee9 +menubar-background: #2E3440 +menubar-foreground: #d8dee9 message-background: #2E3440 message-border: #2E3440 message-foreground: #547599 From 0f7e36545030d36007b016479035526645a26fe1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 9 Mar 2020 22:08:48 +0100 Subject: [PATCH 0508/2376] Add color descriptions for menubar-background and ... (#4481) menubar-foreground to PaletteColours.multids --- core/language/en-GB/Docs/PaletteColours.multids | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/language/en-GB/Docs/PaletteColours.multids b/core/language/en-GB/Docs/PaletteColours.multids index 5e13de9f3..98addbf85 100644 --- a/core/language/en-GB/Docs/PaletteColours.multids +++ b/core/language/en-GB/Docs/PaletteColours.multids @@ -29,6 +29,8 @@ external-link-foreground-hover: External link foreground hover external-link-foreground-visited: External link foreground visited external-link-foreground: External link foreground foreground: General foreground +menubar-background: Menu bar background +menubar-foreground: Menu bar foreground message-background: Message box background message-border: Message box border message-foreground: Message box foreground From d950591051dcf91f13f73e2464ecb144c0268484 Mon Sep 17 00:00:00 2001 From: JesseWeinstein <jesse@wefu.org> Date: Mon, 9 Mar 2020 14:34:23 -0700 Subject: [PATCH 0509/2376] Mention importing process more explicitly (#3666) * Mention importing process more explicitly * Explicitly mention "images" So this page shows up in a search for "images". * Apply PR suggestions --- editions/tw5.com/tiddlers/features/Importing Tiddlers.tid | 6 +++--- editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid b/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid index a03082a9f..eef00a5e2 100644 --- a/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid +++ b/editions/tw5.com/tiddlers/features/Importing Tiddlers.tid @@ -8,10 +8,10 @@ You can import tiddlers into a ~TiddlyWiki from external files or directly from !! Importing content from external files -There are several ways to import content from external files: +There are several ways to import content (including text, images, pdf documents, etc.) from external files: -* Use the {{$:/core/images/import-button}} ''import'' button (under the ''Tools'' tab in the sidebar) to select a local file -* Drag and drop files from Windows Explorer or OS X Finder etc. into the TiddlyWiki browser window +* Use the <<.button import>> button (under the <<.sidebar-tab Tools>> tab in the sidebar) to select a local file +* Drag and drop files from Windows Explorer or OS X Finder etc. into the ~TiddlyWiki browser window * Paste content directly from the clipboard using the menu or keyboard shortcut (<kbd>ctrl-V</kbd> or <kbd>cmd-V</kbd>) ** Currently supported in Chrome, Firefox and Edge (but not Internet Explorer) diff --git a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid index 1bb31e7ad..6dd358f1a 100644 --- a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid @@ -51,3 +51,7 @@ Renders as: {{Motovun Jack.jpg}} +! Importing Images + +Use the <<.button import>> button (under the <<.sidebar-tab Tools>> tab in the sidebar), or drag and drop. +See [[ImportingTiddlers]] for details. From 592922d399e9e48b8aae1eb86d3251cc4acbcc1f Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Tue, 10 Mar 2020 18:41:42 +0800 Subject: [PATCH 0510/2376] Add chinese translations for color descriptions for menubar-background and menubar-foreground (#4488) --- languages/zh-Hans/Docs/PaletteColours.multids | 2 ++ languages/zh-Hant/Docs/PaletteColours.multids | 2 ++ 2 files changed, 4 insertions(+) diff --git a/languages/zh-Hans/Docs/PaletteColours.multids b/languages/zh-Hans/Docs/PaletteColours.multids index f996355e7..89cc4009c 100644 --- a/languages/zh-Hans/Docs/PaletteColours.multids +++ b/languages/zh-Hans/Docs/PaletteColours.multids @@ -29,6 +29,8 @@ external-link-foreground-hover: 悬停外部链结前景 external-link-foreground-visited: 已造访过的外部链结前景 external-link-foreground: 外部链结前景 foreground: 一般前景 +menubar-background: 菜单列背景 +menubar-foreground: 菜单列前景 message-background: 信息框背景 message-border: 信息边框 message-foreground: 信息框前景 diff --git a/languages/zh-Hant/Docs/PaletteColours.multids b/languages/zh-Hant/Docs/PaletteColours.multids index 76f9d2ea1..4555627fa 100644 --- a/languages/zh-Hant/Docs/PaletteColours.multids +++ b/languages/zh-Hant/Docs/PaletteColours.multids @@ -29,6 +29,8 @@ external-link-foreground-hover: 懸停外部鏈結前景 external-link-foreground-visited: 已造訪過的外部鏈結前景 external-link-foreground: 外部鏈結前景 foreground: 一般前景 +menubar-background: 選單列背景 +menubar-foreground: 選單列前景 message-background: 訊息框背景 message-border: 訊息邊框 message-foreground: 訊息框前景 From 9b48a1c82955d1050c426fef559f42f4b8ec56e7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 11 Mar 2020 16:55:19 +0000 Subject: [PATCH 0511/2376] Introducing "Dynannotate" plugin for overlaying annotations --- editions/prerelease/tiddlywiki.info | 1 + .../tiddlywiki/dynannotate/docs/history.tid | 33 ++ .../tiddlywiki/dynannotate/docs/readme.tid | 108 +++++ .../dynannotate/examples/combined.tid | 111 +++++ .../examples/example-annotation-1.tid | 5 + .../examples/example-annotation-2.tid | 5 + .../examples/example-annotation-3.tid | 5 + .../examples/example-annotation-4.json | 10 + .../dynannotate/examples/example-text.multids | 19 + .../dynannotate/examples/examples.tid | 4 + .../dynannotate/examples/simple.tid | 100 +++++ .../dynannotate/examples/snippets.tid | 56 +++ .../dynannotate/modules/dynannotate.js | 418 ++++++++++++++++++ .../dynannotate/modules/selection-tracker.js | 116 +++++ .../tiddlywiki/dynannotate/modules/textmap.js | 177 ++++++++ plugins/tiddlywiki/dynannotate/plugin.info | 9 + plugins/tiddlywiki/dynannotate/styles.tid | 44 ++ 17 files changed, 1221 insertions(+) create mode 100644 plugins/tiddlywiki/dynannotate/docs/history.tid create mode 100644 plugins/tiddlywiki/dynannotate/docs/readme.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/combined.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/example-annotation-1.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/example-annotation-2.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/example-annotation-3.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/example-annotation-4.json create mode 100644 plugins/tiddlywiki/dynannotate/examples/example-text.multids create mode 100644 plugins/tiddlywiki/dynannotate/examples/examples.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/simple.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/snippets.tid create mode 100644 plugins/tiddlywiki/dynannotate/modules/dynannotate.js create mode 100644 plugins/tiddlywiki/dynannotate/modules/selection-tracker.js create mode 100644 plugins/tiddlywiki/dynannotate/modules/textmap.js create mode 100644 plugins/tiddlywiki/dynannotate/plugin.info create mode 100644 plugins/tiddlywiki/dynannotate/styles.tid diff --git a/editions/prerelease/tiddlywiki.info b/editions/prerelease/tiddlywiki.info index e09b17189..2dba4aed6 100644 --- a/editions/prerelease/tiddlywiki.info +++ b/editions/prerelease/tiddlywiki.info @@ -12,6 +12,7 @@ "tiddlywiki/savetrail", "tiddlywiki/external-attachments", "tiddlywiki/dynaview", + "tiddlywiki/dynannotate", "tiddlywiki/codemirror", "tiddlywiki/comments", "tiddlywiki/menubar" diff --git a/plugins/tiddlywiki/dynannotate/docs/history.tid b/plugins/tiddlywiki/dynannotate/docs/history.tid new file mode 100644 index 000000000..2bfba30f3 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/docs/history.tid @@ -0,0 +1,33 @@ +title: $:/plugins/tiddlywiki/dynannotate/history + +!! v0.0.5 + +* Added support for displaying search snippets +* Fixed animated popups in the combined demo +* Added minimum length for dynannotate search string +* Added custom classes for search overlays +* Fix crash for malformed regexps + +!! v0.0.4 + +* Fix crash with Chrome search-in-page +* Improve docs + +!! v0.0.3 + +* Add support for showing the selection popup even for a zero length selection (ie clicking within the text without dragging) +* Add support for searching +* Refresh when browser or wrapper resizes +** Note that Dynannotate now requires the core TiddlyWiki plugin Dynaview +* Fixes problem with selections within HTML textareas or inputs +* Improved presentation of examples + +!! v0.0.2 + +* Adds support for Mobile Safari +* Split demo into multiple chunks +* Only show the selection popup when the selection is entirely within a selection container + +!! v0.0.1 + +Initial release diff --git a/plugins/tiddlywiki/dynannotate/docs/readme.tid b/plugins/tiddlywiki/dynannotate/docs/readme.tid new file mode 100644 index 000000000..9142e16c2 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/docs/readme.tid @@ -0,0 +1,108 @@ +title: $:/plugins/tiddlywiki/dynannotate/readme + +The ''Dynannotate'' plugin allows annotations on textual content to be created and displayed. It has three components: + +* The dynannotate widget overlays clickable textual annotations, search highlights and search snippets on the content that it contains +* The selection tracker displays a popup that tracks the selection, and keeps track of the selected text. It also tracks a prefix and suffix that can be used to disambiguate the selected text within the container +* The `<$action-popup>` widget is used for some specialised popup switching in the demo + +''Note that the TiddlyWiki core plugin __Dynaview__ is required for correct operation of __Dynannotate__'' + +!! Dynannotate Widget + +The attributes of the `<$dynannotate>` widget describe annotations to be overlaid over the text contained within its child widgets. A single annotation can be directly applied using the attributes or multiple annotations can be applied by providing a filter identifying the "annotation tiddlers" that specify each annotation. + +The content of the `<$dynannotate>` widget should not contain HTML `<input>` or `<textarea>` text editing elements (and therefore should not contain TiddlyWiki's `<$edit-text>` widget) + +The `<$dynannotate>` widget uses the selection tracker to support a popup that dynamically tracks selected text within it. + +!!! Attributes + +|!Attribute |!Description | +|target |Optional text to be annotated | +|targetPrefix |Optional prefix text to disambiguate the target | +|targetSuffix |Optional suffix text to disambiguate the target | +|filter |Filter identifying the annotation tiddlers applying to this content (see below) | +|actions |Action string to be executed when an annotation is clicked. The variable `annotationTiddler` contains the title of the tiddler corresponding to the annotation that was clicked, and the variable `modifierKey` contains "ctrl", "shift", "ctrl-shift", "normal" according to which modifier keys were pressed | +|popup |Popup state tiddler to be used to trigger a popup when an annotation is clicked | +|search |Search text to be highlighted within the widget | +|searchDisplay |"overlay" or "snippet" (see below) | +|searchMode |"normal" (default), "regexp" or "whitespace" (see below) | +|searchMinLength |Optional minimum length of search string | +|searchCaseSensitive |"no" (default) for a case insensitive search, or "yes" for a case sensitive search | +|searchClass |Optional CSS class to be added to search overlays | +|snippetContextLength |Optional length of search result contextual prefix/suffix | +|selection |Tiddler to which the currently selected text should be dynamically saved | +|selectionPrefix |Tiddler to which up to 50 characters preceding the currently selected text should be dynamically saved | +|selectionSuffix |Tiddler to which up to 50 characters succeeding the currently selected text should be dynamically saved | +|selectionPopup |Popup state tiddler to be used to trigger a popup when text is selected | + +The values supported by the `searchDisplay` attribute are: + +* `overlay` - display search results as overlays over the contained text +* `snippet` - display search results as a sequence of highlighted snippets, and the original text is hidden. Selecting this option therefore disables the annotation functionality + +The search modes supported by the `searchMode` attribute are: + +* `normal` - a literal string of plain text to match +* `regexp` - a JavaScript-style regular expression (without the quoting backslashes and flags) +* `whitespace` - a literal string to match while normalising runs of whitespace. This allows `a. b` to match `a. b` + +When the selection popup is triggered, the currently selected text can be found in the tiddler named in the `selection` attribute, with the disambiguating prefix and suffix in the tiddlers named in the `selectionPrefix` and `selectionPopup` tiddlers. Note that the selection text will be an empty string if the selection popup was triggered in response to a click (ie zero width selection). + +Here's a simple example that highlights the first occurrence of the word "ut" within the text contained within it: + +``` +<$dynannotate target="ut"> +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum +</$dynannotate> +``` + +A prefix and/or suffix can be specified to disambiguate the annotation. For example, here we target the second occurrence of the word "ut": + +``` +<$dynannotate target="ut" targetPrefix="ullamco laboris nisi " targetSuffix=" aliquip ex ea commodo consequat"> +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum +</$dynannotate> +``` + +The widget works by scanning the rendered text of its content, so it works even if the text is built dynamically: + +``` +<$dynannotate target="HelloThere"> +<<list-links "[tag[Work]]">> +</$dynannotate> +``` + +!!! Annotation Tiddlers + +An annotation tiddler is a tiddler describing an annotation to be overlaid over another tiddler. Their fields are used as follows: + +|!Field |!Description | +|title |By convention the prefix `$:/annotations/<username>/` is used, but any title can be used | +|text |The text of the annotation | +|created, creator, modified, modifier |As per TiddlyWiki normal behaviour | +|annotate-tiddler |The title of the target tiddler being annotated (optional, see below) | +|annotate-text |The text being annotated in the target tiddler | +|annotate-prefix |Optional prefix to disambiguate the target annotation | +|annotate-suffix |Optional suffix to disambiguate the target annotation | +|annotate-colour |CSS colour for the annotation (defaults to `rgba(255,255,0,0.3)`) | +|annotate-blend-mode |CSS [[mix blend mode|https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode]] for the annotation (defaults to `multiply`) | + +Note that using the `annotate-tiddler` field to associate an annotation with the annotated tiddler is a lightweight convention employed by the examples; it isn't actually required by any of the JavaScript code. Thus authors can experiment with other techniques for recording the association. + +!! Selection Tracker + +The selection tracker is incorporated within the `<$dynannotate>` widget, but it can be used independently for specialised applications. + +Each selection container is marked with the class `tc-dynannotate-selection-container`, and should contain the following attributes: + +* `data-annotation-selection-save`: title of tiddler to which the selected text should be saved +* `data-annotation-selection-prefix-save`: title of tiddler to which up to 50 characters preceding the currently selected text should be dynamically saved +* `data-annotation-selection-suffix-save`: title of tiddler to which up to 50 characters succeeding the currently selected text should be dynamically saved +* `data-annotation-selection-popup`: title of state tiddler used to trigger the selection popup + +Notes: + +* The selection popup will disappear if the selection is cancelled; this will happen if the user clicks on any other element apart than a button. Thus it is not possible to have any interactive controls within the popup apart from buttons + diff --git a/plugins/tiddlywiki/dynannotate/examples/combined.tid b/plugins/tiddlywiki/dynannotate/examples/combined.tid new file mode 100644 index 000000000..19a60e2da --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/combined.tid @@ -0,0 +1,111 @@ +title: $:/plugins/tiddlywiki/dynannotate/examples/combined +tags: $:/tags/dynannotateExamples +caption: Combined + +\define click-annotation-actions() +<$action-setfield $tiddler="$:/temp/dynannotate/demo/annotation-title" $value=<<annotationTiddler>>/> +\end + +\define create-annotation-actions() +<$action-createtiddler + $basetitle="$:/plugins/tiddlywiki/dynannotate/demo-annotation" + $savetitle={{{ [<chunk>addprefix[$:/state/dynannotate/temp-save-title/]] }}} + annotate-tiddler=<<chunk>> + annotate-text=<<text>> + annotate-prefix=<<prefix>> + annotate-suffix=<<suffix>> + annotate-colour=<<colour>> +/> +<$set name="popup-coords" value={{{ [<chunk>addprefix[$:/state/dynannotate/popup-selection/]get[text]] }}}> +<$action-deletetiddler $tiddler={{{ [<chunk>addprefix[$:/state/dynannotate/popup-selection/]] }}}/> +<$action-setfield $tiddler="$:/temp/dynannotate/demo/annotation-title" $value={{{ [<chunk>addprefix[$:/state/dynannotate/temp-save-title/]get[text]] }}}/> +<$action-popup $state={{{ [<chunk>addprefix[$:/state/dynannotate/popup-annotation/]] }}} $coords=<<popup-coords>>/> +</$set> +\end + +<div class="tc-dynannotation-example-info"> + +This example combines many of the features of the dynannotate plugin: + +* using annotation tiddlers to store the details of each annotation +* triggering actions when the annotations are clicked +* attaching a popup to the annotations +* tracking the selection with another popup + +See the [[source|$:/plugins/tiddlywiki/dynannotate/examples/combined]] for details + +</div> + +Search: <$edit-text tiddler="$:/temp/search" tag="input"/> + +<$list filter="[all[tiddlers+shadows]tag[DynannotateDemo]sort[title]]" variable="chunk"> +<div style="position:relative;"><!-- Needed for the popups to work --> +<$dynannotate + filter="[all[shadows+tiddlers]!has[draft.of]annotate-tiddler<chunk>]" + actions=<<click-annotation-actions>> + popup={{{ [<chunk>addprefix[$:/state/dynannotate/popup-annotation/]] }}} + selection={{{ [<chunk>addprefix[$:/state/dynannotate/selection/]] }}} + selectionPrefix={{{ [<chunk>addprefix[$:/state/dynannotate/selection-prefix/]] }}} + selectionSuffix={{{ [<chunk>addprefix[$:/state/dynannotate/selection-suffix/]] }}} + selectionPopup={{{ [<chunk>addprefix[$:/state/dynannotate/popup-selection/]] }}} + search={{$:/temp/search}} + searchClass="tc-dynannotation-search-overlay-blurred" + searchMinLength={{$:/config/Search/MinLength}} +> +<$transclude tiddler=<<chunk>> mode="block"/> +</$dynannotate> +<$reveal type="popup" state={{{ [<chunk>addprefix[$:/state/dynannotate/popup-annotation/]] }}} position="belowright" animate="yes" retain="yes" style="overflow-y:hidden;"> +<div class="tc-drop-down-wrapper"> +<div class="tc-drop-down tc-popup-keep" style="max-width:550px;white-space: normal;overflow-y:hidden;"> +<$tiddler tiddler={{$:/temp/dynannotate/demo/annotation-title}}> +<p> +<h2> +This is an annotation +</h2> +</p> +<p> +The annotation is stored in the tiddler: +</p> +<p> +<$link><$view field="title"/></$link> +</p> +<p> +The annotated text is ''<$view field="annotate-text"/>''. +</p> +<p> +Annotation Colour: +<$macrocall $name='colour-picker' actions=""" +<$action-setfield $field="annotate-colour" $value=<<colour-picker-value>>/> +"""/> +</p> +</$tiddler> +</div> +</div> +</$reveal> +<$reveal type="popup" state={{{ [<chunk>addprefix[$:/state/dynannotate/popup-selection/]] }}} position="belowright" animate="yes" retain="yes" style="overflow-y:hidden;"> +<div class="tc-drop-down-wrapper"> +<div class="tc-drop-down tc-popup-keep" style="max-width:550px;white-space:normal;"> +<$vars + text={{{ [<chunk>addprefix[$:/state/dynannotate/selection/]get[text]] }}} + prefix={{{ [<chunk>addprefix[$:/state/dynannotate/selection-prefix/]get[text]] }}} + suffix={{{ [<chunk>addprefix[$:/state/dynannotate/selection-suffix/]get[text]] }}} + colour={{{ [<chunk>addprefix[$:/state/dynannotate/annotation-colour/]get[text]] }}} +> +<$button actions=<<create-annotation-actions>>> +Create annotation +</$button> +<p> +Text: <$text text=<<text>>/> +</p> +<p> +Prefix: <$text text=<<prefix>>/> +</p> +<p> +Suffix: <$text text=<<suffix>>/> +</p> +</$vars> +</div> +</div> +</$reveal> +</div> +</$list> diff --git a/plugins/tiddlywiki/dynannotate/examples/example-annotation-1.tid b/plugins/tiddlywiki/dynannotate/examples/example-annotation-1.tid new file mode 100644 index 000000000..4309fdddf --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/example-annotation-1.tid @@ -0,0 +1,5 @@ +title: $:/plugins/tiddlywiki/dynannotate/example-annotation-1 +annotate-tiddler: $:/plugins/tiddlywiki/dynannotate/example-text-1 +annotate-text: memory is transitory. Yet the speed of action +annotate-colour: SkyBlue +annotate-blend-mode: multiply \ No newline at end of file diff --git a/plugins/tiddlywiki/dynannotate/examples/example-annotation-2.tid b/plugins/tiddlywiki/dynannotate/examples/example-annotation-2.tid new file mode 100644 index 000000000..15f77bb9e --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/example-annotation-2.tid @@ -0,0 +1,5 @@ +title: $:/plugins/tiddlywiki/dynannotate/example-annotation-2 +annotate-tiddler: $:/plugins/tiddlywiki/dynannotate/example-text-3 +annotate-text: It needs a name, and to coin one at random, "memex" will do +annotate-colour: rgba(255,0,255,0.45) +annotate-blend-mode: multiply \ No newline at end of file diff --git a/plugins/tiddlywiki/dynannotate/examples/example-annotation-3.tid b/plugins/tiddlywiki/dynannotate/examples/example-annotation-3.tid new file mode 100644 index 000000000..ab9954a7c --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/example-annotation-3.tid @@ -0,0 +1,5 @@ +title: $:/plugins/tiddlywiki/dynannotate/example-annotation-3 +annotate-tiddler: $:/plugins/tiddlywiki/dynannotate/example-text-5 +annotate-text: it would take him hundreds of years to fill the repository +annotate-colour: #fff +annotate-blend-mode: difference \ No newline at end of file diff --git a/plugins/tiddlywiki/dynannotate/examples/example-annotation-4.json b/plugins/tiddlywiki/dynannotate/examples/example-annotation-4.json new file mode 100644 index 000000000..475c7aede --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/example-annotation-4.json @@ -0,0 +1,10 @@ +{ +"title": "$:/plugins/tiddlywiki/dynannotate/example-annotation-4", +"annotate-tiddler": "$:/plugins/tiddlywiki/dynannotate/example-text-1", +"annotate-text": "that", +"annotate-prefix": "It has other characteristics, of course; trails ", +"annotate-suffix": " are not frequently followed are prone to fade", +"annotate-colour": "rgba(255,0,255,0.45)", +"annotate-blend-mode": "difference", +"text": "(This tiddler is in .json format so that we can have field values that start with a whitespace" +} \ No newline at end of file diff --git a/plugins/tiddlywiki/dynannotate/examples/example-text.multids b/plugins/tiddlywiki/dynannotate/examples/example-text.multids new file mode 100644 index 000000000..a37b6a0f3 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/example-text.multids @@ -0,0 +1,19 @@ +title: $:/plugins/tiddlywiki/dynannotate/example-text- +source: https://www.w3.org/History/1945/vbush/vbush.txt +tags: DynannotateDemo + +1: The human mind does not work that way. It operates by association. With one item in its grasp, it snaps instantly to the next that is suggested by the association of thoughts, in accordance with some intricate web of trails carried by the cells of the brain. It has other characteristics, of course; trails that are not frequently followed are prone to fade, items are not fully permanent, memory is ''transitory''. Yet the speed of action, the intricacy of trails, the detail of mental pictures, is awe-inspiring beyond all else in nature. + +2: Man cannot hope fully to duplicate this mental process artificially, but he certainly ought to be able to learn from it. In minor ways he may even improve, for his records have relative permanency. The first idea, however, to be drawn from the analogy concerns selection. Selection by association, rather than by indexing, may yet be mechanized. One cannot hope thus to equal the speed and flexibility with which the mind follows an associative trail, but it should be possible to beat the mind decisively in regard to the permanence and clarity of the items resurrected from storage. + +3: Consider a future device for individual use, which is a sort of mechanized private file and library. It needs a name, and to coin one at random, "memex" will do. A memex is a device in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory. + +4: It consists of a desk, and while it can presumably be operated from a distance, it is primarily the piece of furniture at which he works. On the top are slanting translucent screens, on which material can be projected for convenient reading. There is a keyboard, and sets of buttons and levers. Otherwise it looks like an ordinary desk. + +5: In one end is the stored material. The matter of bulk is well taken care of by improved microfilm. Only a small part of the interior of the memex is devoted to storage, the rest to mechanism. Yet if the user inserted 5000 pages of material a day it would take him hundreds of years to fill the repository, so he can be profligate and enter material freely. + +6: Most of the memex contents are purchased on microfilm ready for insertion. Books of all sorts, pictures, current periodicals, newspapers, are thus obtained and dropped into place. Business correspondence takes the same path. And there is provision for direct entry. On the top of the memex is a transparent platen. On this are placed longhand notes, photographs, memoranda, all sort of things. When one is in place, the depression of a lever causes it to be photographed onto the next blank space in a section of the memex film, dry photography being employed. + +7: There is, of course, provision for consultation of the record by the usual scheme of indexing. If the user wishes to consult a certain book, he taps its code on the keyboard, and the title page of the book promptly appears before him, projected onto one of his viewing positions. Frequently-used codes are mnemonic, so that he seldom consults his code book; but when he does, a single tap of a key projects it for his use. Moreover, he has supplemental levers. On deflecting one of these levers to the right he runs through the book before him, each page in turn being projected at a speed which just allows a recognizing glance at each. If he deflects it further to the right, he steps through the book 10 pages at a time; still further at 100 pages at a time. Deflection to the left gives him the same control backwards. + +8: A special button transfers him immediately to the first page of the index. Any given book of his library can thus be called up and consulted with far greater facility than if it were taken from a shelf. As he has several projection positions, he can leave one item in position while he calls up another. He can add marginal notes and comments, taking advantage of one possible type of dry photography, and it could even be arranged so that he can do this by a stylus scheme, such as is now employed in the telautograph seen in railroad waiting rooms, just as though he had the physical page before him. diff --git a/plugins/tiddlywiki/dynannotate/examples/examples.tid b/plugins/tiddlywiki/dynannotate/examples/examples.tid new file mode 100644 index 000000000..0cde1f033 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/examples.tid @@ -0,0 +1,4 @@ +title: $:/plugins/tiddlywiki/dynannotate/examples + +<<tabs "[all[tiddlers+shadows]tag[$:/tags/dynannotateExamples]!has[draft.of]]" "$:/plugins/tiddlywiki/dynannotate/examples/snippets">> + diff --git a/plugins/tiddlywiki/dynannotate/examples/simple.tid b/plugins/tiddlywiki/dynannotate/examples/simple.tid new file mode 100644 index 000000000..aa1837b78 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/simple.tid @@ -0,0 +1,100 @@ +title: $:/plugins/tiddlywiki/dynannotate/examples/simple +tags: $:/tags/dynannotateExamples +caption: Simple + +\define show-example(example) +<$codeblock code=<<__example__>>/> + +//''Displays as:''// + +$example$ +\end + +<div class="tc-dynannotation-example-info"> + +!! Simple annotation + +We use the `target*` attributes to specify a target string for the annotation and optionally a prefix and suffix for disambiguating multiple occurances. + +</div> + +<<show-example """ +<$dynannotate + target="the" + targetPrefix="Yet " + targetSuffix=" speed" +> +<$transclude tiddler="$:/plugins/tiddlywiki/dynannotate/example-text-1" mode="block"/> +</$dynannotate> +""">> + +<div class="tc-dynannotation-example-info"> + +!! Plain text searching + +We use the `search` attribute to specify a search string for highlighting: + +</div> + +<<show-example """ +<$dynannotate + search="the" +> +<$transclude tiddler="$:/plugins/tiddlywiki/dynannotate/example-text-1" mode="block"/> +</$dynannotate> +""">> + +<div class="tc-dynannotation-example-info"> + +!! Regular expression searching + +We use the `mode` attribute set to `regexp` to highlight matches of a regular expression: + +</div> + +<<show-example """ +<$dynannotate + search="the|an" + searchMode="regexp" + searchClass="tc-dynannotation-search-overlay-blurred" +> +<$transclude tiddler="$:/plugins/tiddlywiki/dynannotate/example-text-1" mode="block"/> +</$dynannotate> +""">> + +<div class="tc-dynannotation-example-info"> + +!! Normalised whitespace searching + +We use the `mode` attribute set to `whitespace` to search for a string with whitespace normalised (ie runs of whitespace are collapsed to a single space for matching purposes): + +</div> + +<<show-example """ +<$dynannotate + search="does not work that way. It operates" + searchMode="whitespace" + searchClass="tc-dynannotation-search-overlay-animated" +> +<$transclude tiddler="$:/plugins/tiddlywiki/dynannotate/example-text-1" mode="block"/> +</$dynannotate> +""">> + +<div class="tc-dynannotation-example-info"> + +!! Using annotation tiddlers + +Annotation tiddlers can be used to describe annotations. This example references the following annotation tiddlers: + +</div> + +<<list-links "[all[shadows+tiddlers]annotate-tiddler[$:/plugins/tiddlywiki/dynannotate/example-text-1]]">> + +<<show-example """ +<$dynannotate + filter="[all[shadows+tiddlers]annotate-tiddler[$:/plugins/tiddlywiki/dynannotate/example-text-1]]" +> +<$transclude tiddler="$:/plugins/tiddlywiki/dynannotate/example-text-1" mode="block"/> +</$dynannotate> +""">> + diff --git a/plugins/tiddlywiki/dynannotate/examples/snippets.tid b/plugins/tiddlywiki/dynannotate/examples/snippets.tid new file mode 100644 index 000000000..5d471e45d --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/snippets.tid @@ -0,0 +1,56 @@ +title: $:/plugins/tiddlywiki/dynannotate/examples/snippets +tags: $:/tags/dynannotateExamples +caption: Snippets + +\define show-example(example) +<$codeblock code=<<__example__>>/> + +//''Displays as:''// + +$example$ +\end + +<div class="tc-dynannotation-example-info"> + +!! Search result snippets + +The `searchDisplay` attribute can be set to `snippet` (instead of the default `overlay`) in order to display contextual snippets around search results. + +</div> + +<<show-example """ +<$dynannotate + search="the" + searchDisplay="snippet" +><$transclude tiddler="$:/plugins/tiddlywiki/dynannotate/example-text-1" mode="block"/> +</$dynannotate> +""">> + +<div class="tc-dynannotation-example-info"> + +!! Multiple search result snippets + +This example searches across multiple tiddlers and shows snippets for those tiddlers that match. + +</div> + +<$macrocall $name="show-example" example=""" +Search: <$edit-text tiddler="$:/temp/search" tag="input"/> +<$list filter="[all[tiddlers+shadows]tag[DynannotateDemo]search:text{$:/temp/search}sort[title]]"> +<dl> +<dt> +<$link> +<$text text=<<currentTiddler>>/> +</$link> +</dt> +<dd> +<$dynannotate + search={{$:/temp/search}} + searchMode="whitespace" + searchDisplay="snippet" +><$transclude tiddler=<<currentTiddler>> mode="block"/> +</$dynannotate> +</dd> +</dl> +</$list> +"""/> diff --git a/plugins/tiddlywiki/dynannotate/modules/dynannotate.js b/plugins/tiddlywiki/dynannotate/modules/dynannotate.js new file mode 100644 index 000000000..f96000c48 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/modules/dynannotate.js @@ -0,0 +1,418 @@ +/*\ +title: $:/plugins/tiddlywiki/dynannotate/dynannotate.js +type: application/javascript +module-type: widget + +Dynannotate widget + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var TextMap = require("$:/plugins/tiddlywiki/dynannotate/textmap.js").TextMap; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var DynannotateWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +DynannotateWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +DynannotateWidget.prototype.render = function(parent,nextSibling) { + var self = this; + this.parentDomNode = parent; + this.computeAttributes(); + this.execute(); + // Create our DOM nodes + var isSnippetMode = this.isSnippetMode(); + this.domContent = $tw.utils.domMaker("div",{ + "class": "tc-dynannotation-selection-container" + }); + if(isSnippetMode) { + this.domContent.setAttribute("hidden","hidden"); + } + this.domAnnotations = $tw.utils.domMaker("div",{ + "class": "tc-dynannotation-annotation-wrapper" + }); + this.domSnippets = $tw.utils.domMaker("div",{ + "class": "tc-dynannotation-snippet-wrapper" + }); + this.domSearches = $tw.utils.domMaker("div",{ + "class": "tc-dynannotation-search-wrapper" + }); + this.domWrapper = $tw.utils.domMaker("div",{ + "class": "tc-dynannotation-wrapper", + children: [this.domContent,this.domAnnotations,this.domSnippets,this.domSearches] + }) + parent.insertBefore(this.domWrapper,nextSibling); + this.domNodes.push(this.domWrapper); + // Apply the selection tracker data to the DOM + if(!isSnippetMode) { + this.applySelectionTrackerData(); + } + // Render our child widgets + this.renderChildren(this.domContent,null); + if(isSnippetMode) { + // Apply search snippets + this.applySnippets(); + } else { + // Get the list of annotation tiddlers + this.getAnnotationTiddlers(); + // Apply annotations + this.applyAnnotations(); + // Apply search overlays + this.applySearch(); + } + // Save the width of the wrapper so that we can tell when it changes + this.wrapperWidth = this.domWrapper.offsetWidth; +}; + +/* +Compute the internal state of the widget +*/ +DynannotateWidget.prototype.execute = function() { + // Make the child widgets + this.makeChildWidgets(); +}; + +DynannotateWidget.prototype.isSnippetMode = function() { + return this.getAttribute("searchDisplay") === "snippet"; +} + +/* +Save the data attributes required by the selection tracker +*/ +DynannotateWidget.prototype.applySelectionTrackerData = function() { + if(this.hasAttribute("selection")) { + this.domContent.setAttribute("data-annotation-selection-save",this.getAttribute("selection")); + } else { + this.domContent.removeAttribute("data-annotation-selection-save"); + } + if(this.hasAttribute("selectionPopup")) { + this.domContent.setAttribute("data-annotation-selection-popup",this.getAttribute("selectionPopup")); + } else { + this.domContent.removeAttribute("data-annotation-selection-popup"); + } + if(this.hasAttribute("selectionPrefix")) { + this.domContent.setAttribute("data-annotation-selection-prefix-save",this.getAttribute("selectionPrefix")); + } else { + this.domContent.removeAttribute("data-annotation-selection-prefix-save"); + } + if(this.hasAttribute("selectionSuffix")) { + this.domContent.setAttribute("data-annotation-selection-suffix-save",this.getAttribute("selectionSuffix")); + } else { + this.domContent.removeAttribute("data-annotation-selection-suffix-save"); + } +}; + +/* +Create overlay dom elements to cover a specified range + +options include: + startNode: Start node of range + startOffset: Start offset of range + endNode: End node of range + endOffset: End offset of range + className: Optional classname for the overlay + wrapper: Wrapper dom node for the overlays + colour: Optional CSS colour for the overlay + blendMode: Optional CSS mix blend mode for the overlay + onclick: Optional click event handler for the overlay +*/ +DynannotateWidget.prototype.createOverlay = function(options) { + var self = this; + // Create a range covering the text + var range = this.document.createRange(); + range.setStart(options.startNode,options.startOffset); + range.setEnd(options.endNode,options.endOffset); + // Get the position of the range + var rects = range.getClientRects(); + if(rects) { + // Paint each rectangle + var parentRect = this.domContent.getBoundingClientRect(); + $tw.utils.each(rects,function(rect) { + var domOverlay = self.document.createElement("div"); + domOverlay.className = (options.className || "") + " tc-dynaview-request-refresh-on-resize"; + domOverlay.style.top = (rect.top - parentRect.top) + "px"; + domOverlay.style.left = (rect.left - parentRect.left) + "px"; + domOverlay.style.width = rect.width + "px"; + domOverlay.style.height = rect.height + "px"; + domOverlay.style.backgroundColor = options.colour; + domOverlay.style.mixBlendMode = options.blendMode; + if(options.onclick) { + domOverlay.addEventListener("click",function(event) { + var modifierKey = event.ctrlKey && !event.shiftKey ? "ctrl" : event.shiftKey && !event.ctrlKey ? "shift" : event.ctrlKey && event.shiftKey ? "ctrl-shift" : "normal"; + options.onclick(event,domOverlay,modifierKey); + },false); + } + options.wrapper.appendChild(domOverlay); + }); + } +}; + +DynannotateWidget.prototype.getAnnotationTiddlers = function() { + this.annotationTiddlers = this.wiki.filterTiddlers(this.getAttribute("filter",""),this); +}; + +DynannotateWidget.prototype.removeAnnotations = function() { + while(this.domAnnotations.hasChildNodes()) { + this.domAnnotations.removeChild(this.domAnnotations.firstChild); + } +}; + +DynannotateWidget.prototype.applyAnnotations = function() { + var self = this; + // Remove any previous annotation overlays + this.removeAnnotations(); + // Don't do anything if there are no annotations to apply + if(this.annotationTiddlers.length === 0 && !this.hasAttribute("target")) { + return; + } + // Build the map of the text content + var textMap = new TextMap(this.domContent); + // We'll dynamically build the click event handler so that we can reuse it + var clickHandlerFn = function(title) { + return function(event,domOverlay,modifierKey) { + self.invokeActionString(self.getAttribute("actions"),self,event,{annotationTiddler: title, modifier: modifierKey}); + if(self.hasAttribute("popup")) { + $tw.popup.triggerPopup({ + domNode: domOverlay, + title: self.getAttribute("popup"), + wiki: self.wiki + }); + } + }; + }; + // Draw the overlay for the "target" attribute + if(this.hasAttribute("target")) { + var result = textMap.findText(this.getAttribute("target"),this.getAttribute("targetPrefix"),this.getAttribute("targetSuffix")); + if(result) { + this.createOverlay({ + startNode: result.startNode, + startOffset: result.startOffset, + endNode: result.endNode, + endOffset: result.endOffset, + wrapper: self.domAnnotations, + className: "tc-dynannotation-annotation-overlay", + onclick: clickHandlerFn(null) + }); + } + } + // Draw the overlays for each annotation tiddler + $tw.utils.each(this.annotationTiddlers,function(title) { + var tiddler = self.wiki.getTiddler(title), + annotateText = tiddler.fields["annotate-text"], + annotatePrefix = tiddler.fields["annotate-prefix"], + annotateSuffix = tiddler.fields["annotate-suffix"]; + if(tiddler && annotateText) { + var result = textMap.findText(annotateText,annotatePrefix,annotateSuffix); + if(result) { + self.createOverlay({ + startNode: result.startNode, + startOffset: result.startOffset, + endNode: result.endNode, + endOffset: result.endOffset, + wrapper: self.domAnnotations, + className: "tc-dynannotation-annotation-overlay", + colour: tiddler.fields["annotate-colour"], + blendMode: tiddler.fields["annotate-blend-mode"], + onclick: clickHandlerFn(title) + }); + } + } + }); +}; + +DynannotateWidget.prototype.removeSearch = function() { + while(this.domSearches.hasChildNodes()) { + this.domSearches.removeChild(this.domSearches.firstChild); + } +}; + +DynannotateWidget.prototype.applySearch = function() { + var self = this; + // Remove any previous search overlays + this.removeSearch(); + // Gather parameters + var searchString = this.getAttribute("search",""), + searchMode = this.getAttribute("searchMode"), + searchCaseSensitive = this.getAttribute("searchCaseSensitive","yes") === "yes", + searchMinLength = parseInt(this.getAttribute("searchMinLength","1"),10) || 1; + // Bail if search string too short + if(searchString.length < searchMinLength) { + return; + } + // Build the map of the text content + var textMap = new TextMap(this.domContent); + // Search for the string + var matches = textMap.search(this.getAttribute("search",""),{ + mode: this.getAttribute("searchMode"), + caseSensitive: this.getAttribute("searchCaseSensitive","yes") === "yes" + }); + // Create overlays for each match + $tw.utils.each(matches,function(match) { + self.createOverlay({ + startNode: match.startNode, + startOffset: match.startOffset, + endNode: match.endNode, + endOffset: match.endOffset, + wrapper: self.domSearches, + className: "tc-dynannotation-search-overlay " + self.getAttribute("searchClass","") + }); + }); +}; + +DynannotateWidget.prototype.removeSnippets = function() { + while(this.domSnippets.hasChildNodes()) { + this.domSnippets.removeChild(this.domSnippets.firstChild); + } +}; + +DynannotateWidget.prototype.applySnippets = function() { + var self = this, + contextLength = parseInt(this.getAttribute("snippetContextLength","33"),10) || 0; + // Build the map of the text content + var textMap = new TextMap(this.domContent); + // Remove any previous snippets + this.removeSnippets(); + // Gather parameters + var searchString = this.getAttribute("search",""), + searchMode = this.getAttribute("searchMode"), + searchCaseSensitive = this.getAttribute("searchCaseSensitive","yes") === "yes", + searchMinLength = parseInt(this.getAttribute("searchMinLength","1"),10) || 1; + // Build the map of the text content + var textMap = new TextMap(this.domContent); + // Search for the string + var matches = textMap.search(this.getAttribute("search",""),{ + mode: this.getAttribute("searchMode"), + caseSensitive: this.getAttribute("searchCaseSensitive","no") === "yes" + }); + // Output a snippet for each match + if(matches && matches.length > 0) { + var merged = false, // Keep track of whether the context of the previous match merges into this one + ellipsis = String.fromCharCode(8230), + container = null; // Track the container so that we can reuse the same container for merged matches + $tw.utils.each(matches,function(match,index) { + // Create a container if we're not reusing it + if(!container) { + container = $tw.utils.domMaker("div",{ + "class": "tc-dynannotate-snippet" + }); + self.domSnippets.appendChild(container); + } + // Output the preceding context if it wasn't merged into the previous match + if(!merged) { + container.appendChild($tw.utils.domMaker("span",{ + text: (match.startPos < contextLength ? "" : ellipsis) + + textMap.string.slice(Math.max(match.startPos - contextLength,0),match.startPos), + "class": "tc-dynannotate-snippet-context" + })); + } + // Output the match + container.appendChild($tw.utils.domMaker("span",{ + text: textMap.string.slice(match.startPos,match.endPos), + "class": "tc-dynannotate-snippet-highlight " + self.getAttribute("searchClass") + })); + // Does the context of this match merge into the next? + merged = index < matches.length - 1 && matches[index + 1].startPos - match.endPos <= 2 * contextLength; + if(merged) { + // If they're merged, use the context up until the next match + container.appendChild($tw.utils.domMaker("span",{ + text: textMap.string.slice(match.endPos,matches[index + 1].startPos), + "class": "tc-dynannotate-snippet-context" + })); + } else { + // If they're not merged, use the context up to the end + container.appendChild($tw.utils.domMaker("span",{ + text: textMap.string.slice(match.endPos,match.endPos + contextLength) + + ((match.endPos + contextLength) >= textMap.string.length ? "" : ellipsis), + "class": "tc-dynannotate-snippet-context" + })); + } + // Reuse the next container if we're merged + if(!merged) { + container = null; + } + }); + } +}; + +/* +Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering +*/ +DynannotateWidget.prototype.refresh = function(changedTiddlers) { + // Get the changed attributes + var changedAttributes = this.computeAttributes(); + // Refresh completely if the "searchDisplay" attribute has changed + if(changedAttributes.searchDisplay) { + this.refreshSelf(); + return true; + } + // Check whether we're in snippet mode + var isSnippetMode = this.isSnippetMode(); + // Refresh the child widgets + var childrenDidRefresh = this.refreshChildren(changedTiddlers); + // Reapply the selection tracker data to the DOM + if(changedAttributes.selection || changedAttributes.selectionPrefix || changedAttributes.selectionSuffix || changedAttributes.selectionPopup) { + this.applySelectionTrackerData(); + } + // Reapply the annotations if the children refreshed or the main wrapper resized + var wrapperWidth = this.domWrapper.offsetWidth, + hasResized = wrapperWidth !== this.wrapperWidth || changedTiddlers["$:/state/DynaView/ViewportDimensions/ResizeCount"], + oldAnnotationTiddlers = this.annotationTiddlers; + this.getAnnotationTiddlers(); + if(!isSnippetMode && ( + childrenDidRefresh || + hasResized || + changedAttributes.target || + changedAttributes.targetPrefix || + changedAttributes.targetSuffix || + changedAttributes.filter || + changedAttributes.actions || + changedAttributes.popup || + !$tw.utils.isArrayEqual(oldAnnotationTiddlers,this.annotationTiddlers) || + this.annotationTiddlers.find(function(title) { + return changedTiddlers[title]; + }) !== undefined + )) { + this.applyAnnotations(); + } + if(!isSnippetMode && ( + childrenDidRefresh || + hasResized || + changedAttributes.search || + changedAttributes.searchMinLength || + changedAttributes.searchClass || + changedAttributes.searchMode || + changedAttributes.searchCaseSensitive + )) { + this.applySearch(); + } + if(isSnippetMode && ( + childrenDidRefresh || + hasResized || + changedAttributes.search || + changedAttributes.searchMinLength || + changedAttributes.searchClass || + changedAttributes.searchMode || + changedAttributes.searchCaseSensitive + )) { + this.applySnippets(); + } + this.wrapperWidth = wrapperWidth; + return childrenDidRefresh; +}; + +exports.dynannotate = DynannotateWidget; + +})(); diff --git a/plugins/tiddlywiki/dynannotate/modules/selection-tracker.js b/plugins/tiddlywiki/dynannotate/modules/selection-tracker.js new file mode 100644 index 000000000..20113b89d --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/modules/selection-tracker.js @@ -0,0 +1,116 @@ +/*\ +title: $:/plugins/tiddlywiki/dynannotate/selection-tracker.js +type: application/javascript +module-type: startup + +Dyannotate background daemon to track the selection + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +// Export name and synchronous status +exports.name = "dyannotate-startup"; +exports.platforms = ["browser"]; +exports.after = ["render"]; +exports.synchronous = true; + +var TextMap = require("$:/plugins/tiddlywiki/dynannotate/textmap.js").TextMap; + +exports.startup = function() { + $tw.dynannotate = { + selectionTracker: new SelectionTracker($tw.wiki,{ + allowBlankSelectionPopup: true + }) + }; +}; + +function SelectionTracker(wiki,options) { + options = options || {}; + var self = this; + this.wiki = wiki; + this.allowBlankSelectionPopup = options.allowBlankSelectionPopup; + this.selectionPopupTitle = null; + document.addEventListener("selectionchange",function(event) { + var selection = document.getSelection(); + if(selection && (selection.type === "Range" || (self.allowBlankSelectionPopup && !self.selectionPopupTitle))) { + // Look for the selection containers for each of the two ends of the selection + var anchorContainer = self.findSelectionContainer(selection.anchorNode), + focusContainer = self.findSelectionContainer(selection.focusNode); + // If either end of the selection then we ignore it + if(!!anchorContainer || !!focusContainer) { + var selectionRange = selection.getRangeAt(0); + // Check for the selection spilling outside the starting container + if((anchorContainer !== focusContainer) || (selectionRange.startContainer.nodeType !== Node.TEXT_NODE && selectionRange.endContainer.nodeType !== Node.TEXT_NODE)) { + if(self.selectionPopupTitle) { + self.wiki.deleteTiddler(self.selectionPopupTitle); + self.selectionPopupTitle = null; + } + } else { + self.selectionSaveTitle = anchorContainer.getAttribute("data-annotation-selection-save"); + self.selectionPrefixSaveTitle = anchorContainer.getAttribute("data-annotation-selection-prefix-save"); + self.selectionSuffixSaveTitle = anchorContainer.getAttribute("data-annotation-selection-suffix-save"); + self.selectionPopupTitle = anchorContainer.getAttribute("data-annotation-selection-popup"); + // The selection is a range so we trigger the popup + if(self.selectionPopupTitle) { + var selectionRectangle = selectionRange.getBoundingClientRect(), + trackingRectangle = anchorContainer.getBoundingClientRect(); + $tw.popup.triggerPopup({ + domNode: null, + domNodeRect: { + left: selectionRectangle.left - trackingRectangle.left, + top: selectionRectangle.top - trackingRectangle.top, + width: selectionRectangle.width, + height: selectionRectangle.height + }, + force: true, + floating: true, + title: self.selectionPopupTitle, + wiki: self.wiki + }); + } + // Write the selection text to the specified tiddler + if(self.selectionSaveTitle) { + // Note that selection.toString() normalizes whitespace but selection.getRangeAt(0).toString() does not + var text = selectionRange.toString(); + self.wiki.addTiddler(new $tw.Tiddler({title: self.selectionSaveTitle, text: text})); + // Build a textmap of the container so that we can find the prefix and suffix + var textMap = new TextMap(anchorContainer); + // Find the selection start in the text map and hence extract the prefix and suffix + var context = textMap.extractContext(selectionRange.startContainer,selectionRange.startOffset,text); + // Save the prefix and suffix + if(context) { + if(self.selectionPrefixSaveTitle) { + self.wiki.addTiddler(new $tw.Tiddler({title: self.selectionPrefixSaveTitle, text: context.prefix})); + } + if(self.selectionSuffixSaveTitle) { + self.wiki.addTiddler(new $tw.Tiddler({title: self.selectionSuffixSaveTitle, text: context.suffix})); + } + } + } + } + } + } else { + // If the selection is a caret we clear any active popup + if(self.selectionPopupTitle) { + self.wiki.deleteTiddler(self.selectionPopupTitle); + self.selectionPopupTitle = null; + } + } + }); +} + +SelectionTracker.prototype.findSelectionContainer = function findSelectionContainer(domNode) { + if(domNode && domNode.nodeType === Node.ELEMENT_NODE && domNode.classList.contains("tc-dynannotation-selection-container")) { + return domNode; + } + if(domNode && domNode.parentNode) { + return findSelectionContainer(domNode.parentNode); + } + return null; +}; + +})(); diff --git a/plugins/tiddlywiki/dynannotate/modules/textmap.js b/plugins/tiddlywiki/dynannotate/modules/textmap.js new file mode 100644 index 000000000..d1a3bdd27 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/modules/textmap.js @@ -0,0 +1,177 @@ +/*\ +title: $:/plugins/tiddlywiki/dynannotate/textmap.js +type: application/javascript +module-type: library + +Structure for modelling mapping between a string and its representation in the DOM + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var PREFIX_SUFFIX_LENGTH = 50; + +/* +Build a map of the text content of a dom node and its descendents: + +string: concatenation of the text content of child nodes +metadata: array of {start,end,domNode} where start and end identify position in the string +*/ +exports.TextMap = function(domNode) { + var self = this, + stringChunks = [], + p = 0; + this.metadata = []; + var processNode = function(domNode) { + // Check for text nodes + if(domNode.nodeType === 3) { + var text = domNode.textContent; + stringChunks.push(text); + self.metadata.push({ + start: p, + end: p + text.length, + domNode: domNode + }); + p += text.length; + } else { + // Otherwise look within the child nodes + if(domNode.childNodes) { + for(var t=0; t<domNode.childNodes.length; t++ ) { + processNode(domNode.childNodes[t]); + } + } + } + }; + // Process our text nodes + processNode(domNode); + this.string = stringChunks.join(""); +}; + +/* +Locate the metadata record corresponding to a given position in the string +*/ +exports.TextMap.prototype.locateMetadata = function(position) { + return this.metadata.find(function(metadata) { + return position >= metadata.start && position < metadata.end; + }); +}; + +/* +Search for the first occurance of a target string within the textmap of a dom node + +Returns an object with the following properties: + startNode: node containing the start of the text + startOffset: offset of the start of the text within the node + endNode: node containing the end of the text + endOffset: offset of the end of the text within the node +*/ +exports.TextMap.prototype.findText = function(targetString,targetPrefix,targetSuffix) { + if(!targetString) { + return null; + } + targetPrefix = targetPrefix || ""; + targetSuffix = targetSuffix || ""; + var startPos = this.string.indexOf(targetPrefix + targetString + targetSuffix); + if(startPos !== -1) { + startPos += targetPrefix.length; + var startMetadata = this.locateMetadata(startPos), + endMetadata = this.locateMetadata(startPos + targetString.length); + if(startMetadata && endMetadata) { + return { + startNode: startMetadata.domNode, + startOffset: startPos - startMetadata.start, + endNode: endMetadata.domNode, + endOffset: (startPos + targetString.length) - endMetadata.start + } + } + } + return null; +}; + +/* +Search for all occurances of a string within the textmap of a dom node + +Options include: + mode: "normal", "regexp" or "whitespace" + caseSensitive: true if the search should be case sensitive + +Returns an array of objects with the following properties: + startPos: start position of the match within the string contained by this TextMap + startNode: node containing the start of the text + startOffset: offset of the start of the text within the node + endPos: end position of the match within the string contained by this TextMap + endNode: node containing the end of the text + endOffset: offset of the end of the text within the node +*/ +exports.TextMap.prototype.search = function(searchString,options) { + if(!searchString) { + return []; + } + options = options || {}; + // Compose the regexp + var regExpString, + flags = options.caseSensitive ? "g" : "gi"; + if(options.mode === "regexp") { + regExpString = "(" + searchString + ")"; + } else if(options.mode === "whitespace") { + // Normalise whitespace + regExpString = "(" + searchString.split(/\s+/g).filter(function(word) { + return !!word + }).map($tw.utils.escapeRegExp).join("\\s+") + ")"; + } else { + // Normal search + regExpString = "(" + $tw.utils.escapeRegExp(searchString) + ")"; + } + // Compile the regular expression + var regExp; + try { + regExp = RegExp(regExpString,flags); + } catch(e) { + } + if(!regExp) { + return []; + } + // Find each match + var results = [], + match; + do { + match = regExp.exec(this.string); + if(match) { + var metadataStart = this.locateMetadata(match.index), + metadataEnd = this.locateMetadata(match.index + match[0].length); + if(metadataStart && metadataEnd) { + results.push({ + startPos: match.index, + startNode: metadataStart.domNode, + startOffset: match.index - metadataStart.start, + endPos: match.index + match[0].length, + endNode: metadataEnd.domNode, + endOffset: match.index + match[0].length - metadataEnd.start + }); + } + } + } while(match); + return results; +}; + +/* +Given a start container and offset and a search string, return a prefix and suffix to disambiguate the text +*/ +exports.TextMap.prototype.extractContext = function(startContainer,startOffset,text) { + var startMetadata = this.metadata.find(function(metadata) { + return metadata.domNode === startContainer + }); + if(!startMetadata) { + return null; + } + var startPos = startMetadata.start + startOffset; + return { + prefix: this.string.slice(Math.max(startPos - PREFIX_SUFFIX_LENGTH, 0), startPos), + suffix: this.string.slice(startPos + text.length, Math.min(startPos + text.length + PREFIX_SUFFIX_LENGTH, this.string.length)) + }; +}; + +})(); diff --git a/plugins/tiddlywiki/dynannotate/plugin.info b/plugins/tiddlywiki/dynannotate/plugin.info new file mode 100644 index 000000000..fc5781062 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/plugin.info @@ -0,0 +1,9 @@ +{ + "title": "$:/plugins/tiddlywiki/dynannotate", + "description": "Dynamic content annotation", + "author": "JeremyRuston", + "core-version": ">=5.0.0", + "version": "0.0.6-prerelease", + "list": "readme examples history", + "dependents": ["$:/plugins/tiddlywiki/dynaview"] +} diff --git a/plugins/tiddlywiki/dynannotate/styles.tid b/plugins/tiddlywiki/dynannotate/styles.tid new file mode 100644 index 000000000..cd635eed5 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/styles.tid @@ -0,0 +1,44 @@ +title: $:/plugins/tiddlywiki/dynannotate/styles +tags: [[$:/tags/Stylesheet]] + +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline + +.tc-dynannotation-wrapper { + position: relative; +} + +.tc-dynannotation-annotation-overlay { + position: absolute; + background: rgba(255,255,0,0.3); + mix-blend-mode: multiply; +} + +.tc-dynannotation-search-overlay { + position: absolute; + pointer-events: none; + background: rgba(255,0,0,0.3); +} + +.tc-dynannotation-search-overlay-blurred { + background: rgba(255,0,0,0.3); + mix-blend-mode: multiply; + border-radius: 4px; + filter: blur(2px); +} + +@keyframes ta-dynannotation-search-overlay-animated { to { background-position: 100% 100% } } + +.tc-dynannotation-search-overlay-animated { + mix-blend-mode: multiply; + background: repeating-linear-gradient(-45deg, #ff8 0, #dd8 25%, transparent 0, transparent 50%) 0 / .6em .6em; + animation: ta-dynannotation-search-overlay-animated 12s linear infinite; +} + +.tc-dynannotate-snippet-highlight { + background: #efef53; +} + +.tc-dynannotation-example-info { + background: #ffa; + padding: 1em; +} From cab9fd11dc89e0a322385009bd60cc1dbf5d42c2 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 11 Mar 2020 17:19:21 +0000 Subject: [PATCH 0512/2376] Clarify docs on the path-prefix subcommand of the listen command --- .../tiddlers/webserver/WebServer Parameter_ path-prefix.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid index ed929c406..9cd2483e7 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid @@ -1,6 +1,6 @@ caption: path-prefix created: 20180630180514893 -modified: 20180702154716090 +modified: 20200311171847360 tags: [[WebServer Parameters]] title: WebServer Parameter: path-prefix type: text/vnd.tiddlywiki @@ -12,3 +12,5 @@ This example causes the server to serve from http://127.0.0.1/MyApp instead of t ``` tiddlywiki mywikifolder --listen "path-prefix=/MyApp" ``` + +Note that further steps are required to configure the client-side components to use the prefix. See [[Using a custom path prefix with the client-server edition]]. \ No newline at end of file From 2ad8d1790b8343060770b1ab21c39451ac338200 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Wed, 11 Mar 2020 18:37:53 +0100 Subject: [PATCH 0513/2376] Update LinkWidget.tid (#4489) --- editions/tw5.com/tiddlers/widgets/LinkWidget.tid | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/LinkWidget.tid b/editions/tw5.com/tiddlers/widgets/LinkWidget.tid index bebebef6a..e7dfef3de 100644 --- a/editions/tw5.com/tiddlers/widgets/LinkWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/LinkWidget.tid @@ -9,9 +9,10 @@ The `link` widget generates links to tiddlers. (Use the HTML `<a>` element to ge ! Content and Attributes -The content of the link widget is rendered within the `<a>` tag representing the link. If the content is empty then the title of the target tiddler is rendered as the default. +The content of the link widget is rendered within the `<a>` tag representing the link. If the content is empty then the title of the target tiddler is rendered as the default, for example: -For example, `<$link to="HelloThere"/>` is equivalent to `<$link to="HelloThere">HelloThere</$link>` and `<$link/>` is equivalent to `<$link to=<<currentTiddler>>><$view field="title"/></$link>`. +* `<$link/>` is equivalent to `<$link to=<<currentTiddler>>><$view field="title"/></$link>` +* `<$link to="HelloThere"/>` is equivalent to `<$link to="HelloThere">HelloThere</$link>` |!Attribute |!Description | |to |The title of the target tiddler for the link (defaults to the [[current tiddler|Current Tiddler]]) | From 3d16745b4b05a964e2476ef5c4cc5dcb7ebe022d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 11 Mar 2020 18:40:22 +0100 Subject: [PATCH 0514/2376] Add german descriptions for menubar-background... (#4483) * add german descriptions for menubar-background... * Update PaletteColours.multids * Update PaletteColours.multids --- languages/de-DE/Docs/PaletteColours.multids | 2 ++ 1 file changed, 2 insertions(+) diff --git a/languages/de-DE/Docs/PaletteColours.multids b/languages/de-DE/Docs/PaletteColours.multids index 820b3c99d..036f002ad 100644 --- a/languages/de-DE/Docs/PaletteColours.multids +++ b/languages/de-DE/Docs/PaletteColours.multids @@ -29,6 +29,8 @@ external-link-foreground-hover: Externer Link Vordergrund (hover) external-link-foreground-visited: Externer Link besucht Vordergrund external-link-foreground: Externer Link Vordergrund foreground: Vordergrund Global +menubar-background: Menü Hintergrund +menubar-foreground: Menü Vordergrund message-background: Meldungs-Box Hintergrund message-border: Meldungs-Box Rahmen message-foreground: Meldungs-Box Vordergrund From 22e6b20f50335f4a26daa114e79cd70af0b62c9b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 12 Mar 2020 14:34:59 +0100 Subject: [PATCH 0515/2376] Better readability for "Community" Tiddler with various ... (#4493) ... color palettes --- editions/tw5.com/tiddlers/system/tw5.com-styles.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/system/tw5.com-styles.tid b/editions/tw5.com/tiddlers/system/tw5.com-styles.tid index 4671d3894..9677fc704 100644 --- a/editions/tw5.com/tiddlers/system/tw5.com-styles.tid +++ b/editions/tw5.com/tiddlers/system/tw5.com-styles.tid @@ -12,7 +12,7 @@ tags: $:/tags/Stylesheet border: 1px solid #ebefcd; padding: 5px 10px; margin-bottom: 10px; - background: #fcfdf3; + background: <<colour code-background>>; font-size: 0.8em; line-height: 1.2; } From d7045070699571a1b35bfffd9bd686c25e696d7a Mon Sep 17 00:00:00 2001 From: Matthias Bilger <matthias@bilger.info> Date: Thu, 12 Mar 2020 16:42:15 +0100 Subject: [PATCH 0516/2376] Signing the CLA (#4492) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 25cc8c2ac..2bfa76cc7 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -387,3 +387,5 @@ Lee Sheng Long, @s-l-lee, 2020/01/25 Scott Willeke, @activescott, 2020/02/01 @lucible, 2020/02/05 + +Matthias Bilger, @m42e, 2020/03/11 From 52a9f928ae3535cfd735ede0f1da740ce25fabda Mon Sep 17 00:00:00 2001 From: Matthias Bilger <matthias@bilger.info> Date: Thu, 12 Mar 2020 16:53:55 +0100 Subject: [PATCH 0517/2376] Added gitea saver (#4491) * added gitea saver * create nonexistent file --- core/language/en-GB/ControlPanel.multids | 2 + core/modules/savers/gitea.js | 136 +++++++++++++++++++++++ core/ui/ControlPanel/Saving/gitea.tid | 16 +++ 3 files changed, 154 insertions(+) create mode 100644 core/modules/savers/gitea.js create mode 100644 core/ui/ControlPanel/Saving/gitea.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 99a526b9f..de19a1229 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -107,6 +107,8 @@ Saving/GitService/GitHub/Caption: ~GitHub Saver Saving/GitService/GitHub/Password: Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details) Saving/GitService/GitLab/Caption: ~GitLab Saver Saving/GitService/GitLab/Password: Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details) +Saving/GitService/gitea/Caption: gitea saver +Saving/GitService/gitea/Password: Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`) Saving/TiddlySpot/Advanced/Heading: Advanced Settings Saving/TiddlySpot/BackupDir: Backup Directory Saving/TiddlySpot/Backups: Backups diff --git a/core/modules/savers/gitea.js b/core/modules/savers/gitea.js new file mode 100644 index 000000000..5e2b57152 --- /dev/null +++ b/core/modules/savers/gitea.js @@ -0,0 +1,136 @@ +/*\ +title: $:/core/modules/savers/gitea.js +type: application/javascript +module-type: saver + +Saves wiki by pushing a commit to the gitea + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Select the appropriate saver module and set it up +*/ +var GiteaSaver = function(wiki) { + this.wiki = wiki; +}; + +GiteaSaver.prototype.save = function(text,method,callback) { + var self = this, + username = this.wiki.getTiddlerText("$:/gitea/Username"), + password = $tw.utils.getPassword("gitea"), + repo = this.wiki.getTiddlerText("$:/gitea/Repo"), + path = this.wiki.getTiddlerText("$:/gitea/Path",""), + filename = this.wiki.getTiddlerText("$:/gitea/Filename"), + branch = this.wiki.getTiddlerText("$:/gitea/Branch") || "master", + endpoint = this.wiki.getTiddlerText("$:/gitea/ServerURL") || "https://gitea", + headers = { + "Accept": "application/json", + "Content-Type": "application/json;charset=UTF-8", + "Authorization": "Basic " + window.btoa(username + ":" + password) + }; + // Bail if we don't have everything we need + if(!username || !password || !repo || !path || !filename) { + return false; + } + // Make sure the path start and ends with a slash + if(path.substring(0,1) !== "/") { + path = "/" + path; + } + if(path.substring(path.length - 1) !== "/") { + path = path + "/"; + } + // Compose the base URI + var uri = endpoint + "/repos/" + repo + "/contents" + path; + // Perform a get request to get the details (inc shas) of files in the same path as our file + $tw.utils.httpRequest({ + url: uri, + type: "GET", + headers: headers, + data: { + ref: branch + }, + callback: function(err,getResponseDataJson,xhr) { + var getResponseData,sha = ""; + if(err && xhr.status !== 404) { + return callback(err); + } + var use_put = true; + if(xhr.status !== 404) { + getResponseData = JSON.parse(getResponseDataJson); + $tw.utils.each(getResponseData,function(details) { + if(details.name === filename) { + sha = details.sha; + } + }); + if(sha === ""){ + use_put = false; + } + } + var data = { + message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"), + content: $tw.utils.base64Encode(text), + sha: sha + }; + $tw.utils.httpRequest({ + url: endpoint + "/repos/" + repo + "/branches/" + branch, + type: "GET", + headers: headers, + callback: function(err,getResponseDataJson,xhr) { + if(xhr.status === 404) { + callback("Please ensure the branch in the gitea repo exists"); + }else{ + data["branch"] = branch; + self.upload(uri + filename, use_put?"PUT":"POST", headers, data, callback); + } + } + }); + } + }); + return true; +}; + +GiteaSaver.prototype.upload = function(uri,method,headers,data,callback) { + $tw.utils.httpRequest({ + url: uri, + type: method, + headers: headers, + data: JSON.stringify(data), + callback: function(err,putResponseDataJson,xhr) { + if(err) { + return callback(err); + } + var putResponseData = JSON.parse(putResponseDataJson); + callback(null); + } + }); +}; + +/* +Information about this saver +*/ +GiteaSaver.prototype.info = { + name: "gitea", + priority: 2000, + capabilities: ["save", "autosave"] +}; + +/* +Static method that returns true if this saver is capable of working +*/ +exports.canSave = function(wiki) { + return true; +}; + +/* +Create an instance of this saver +*/ +exports.create = function(wiki) { + return new GiteaSaver(wiki); +}; + +})(); diff --git a/core/ui/ControlPanel/Saving/gitea.tid b/core/ui/ControlPanel/Saving/gitea.tid new file mode 100644 index 000000000..2bf00396f --- /dev/null +++ b/core/ui/ControlPanel/Saving/gitea.tid @@ -0,0 +1,16 @@ +title: $:/core/ui/ControlPanel/Saving/gitea +tags: $:/tags/ControlPanel/Saving +caption: {{$:/language/ControlPanel/Saving/GitService/gitea/Caption}} + +\define lingo-base() $:/language/ControlPanel/Saving/GitService/ +\define service-name() ~gitea + +<<lingo Description>> + +|<<lingo UserName>> |<$edit-text tiddler="$:/gitea/Username" default="" tag="input"/> | +|<<lingo gitea/Password>> |<$password name="gitea"/> | +|<<lingo Repo>> |<$edit-text tiddler="$:/gitea/Repo" default="" tag="input"/> | +|<<lingo Branch>> |<$edit-text tiddler="$:/gitea/Branch" default="master" tag="input"/> | +|<<lingo Path>> |<$edit-text tiddler="$:/gitea/Path" default="" tag="input"/> | +|<<lingo Filename>> |<$edit-text tiddler="$:/gitea/Filename" default="" tag="input"/> | +|<<lingo ServerURL>> |<$edit-text tiddler="$:/gitea/ServerURL" default="https://gitea/api/v1" tag="input"/> | From 195b3b020923d2b0bbf7efbfe3ec206995ccf326 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 12 Mar 2020 16:54:23 +0100 Subject: [PATCH 0518/2376] Add "Gruvbox Dark" color palette (#4494) * Add "Gruvbox Dark" color palette this adds the "gruvbox dark" color palette (https://github.com/morhetz/gruvbox) which is also available for highlight.js and codemirror * add "credits" field * change "credits" field to "license" field --- core/palettes/GruvBoxDark.tid | 122 ++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 core/palettes/GruvBoxDark.tid diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid new file mode 100644 index 000000000..4edee6557 --- /dev/null +++ b/core/palettes/GruvBoxDark.tid @@ -0,0 +1,122 @@ +title: $:/palettes/GruvboxDark +name: Gruvbox Dark +description: Retro groove color scheme +tags: $:/tags/Palette +type: application/x-tiddler-dictionary +license: https://github.com/morhetz/gruvbox + +alert-background: #cc241d +alert-border: #cc241d +alert-highlight: #d79921 +alert-muted-foreground: #504945 +background: #3c3836 +blockquote-bar: <<colour muted-foreground>> +button-background: #504945 +button-foreground: #fbf1c7 +button-border: transparent +code-background: #504945 +code-border: #504945 +code-foreground: #fb4934 +diff-delete-background: #fb4934 +diff-delete-foreground: <<colour foreground>> +diff-equal-background: +diff-equal-foreground: <<colour foreground>> +diff-insert-background: #b8bb26 +diff-insert-foreground: <<colour foreground>> +diff-invisible-background: +diff-invisible-foreground: <<colour muted-foreground>> +dirty-indicator: #fb4934 +download-background: #b8bb26 +download-foreground: <<colour background>> +dragger-background: <<colour foreground>> +dragger-foreground: <<colour background>> +dropdown-background: #665c54 +dropdown-border: <<colour background>> +dropdown-tab-background-selected: #ebdbb2 +dropdown-tab-background: #665c54 +dropzone-background: #98971a +external-link-background-hover: inherit +external-link-background-visited: inherit +external-link-background: inherit +external-link-foreground-hover: inherit +external-link-foreground-visited: #d3869b +external-link-foreground: #8ec07c +foreground: #fbf1c7 +menubar-background: #504945 +menubar-foreground: <<colour foreground>> +message-background: #83a598 +message-border: #83a598 +message-foreground: #3c3836 +modal-backdrop: <<colour foreground>> +modal-background: <<colour background>> +modal-border: #504945 +modal-footer-background: #3c3836 +modal-footer-border: #3c3836 +modal-header-border: #3c3836 +muted-foreground: #665c54 +notification-background: <<colour primary>> +notification-border: <<colour primary>> +page-background: #282828 +pre-background: #504945 +pre-border: #504945 +primary: #d79921 +select-tag-background: #665c54 +select-tag-foreground: <<colour foreground>> +sidebar-button-foreground: <<colour foreground>> +sidebar-controls-foreground-hover: #7c6f64 +sidebar-controls-foreground: #504945 +sidebar-foreground-shadow: transparent +sidebar-foreground: #fbf1c7 +sidebar-muted-foreground-hover: #7c6f64 +sidebar-muted-foreground: #504945 +sidebar-tab-background-selected: #bdae93 +sidebar-tab-background: #3c3836 +sidebar-tab-border-selected: <<colour tab-border-selected>> +sidebar-tab-border: #bdae93 +sidebar-tab-divider: <<colour page-background>> +sidebar-tab-foreground-selected: #282828 +sidebar-tab-foreground: <<colour tab-foreground>> +sidebar-tiddler-link-foreground-hover: #458588 +sidebar-tiddler-link-foreground: #98971a +site-title-foreground: <<colour tiddler-title-foreground>> +static-alert-foreground: #B48EAD +tab-background-selected: #ebdbb2 +tab-background: #665c54 +tab-border-selected: #665c54 +tab-border: #665c54 +tab-divider: #bdae93 +tab-foreground-selected: #282828 +tab-foreground: #ebdbb2 +table-border: #7c6f64 +table-footer-background: #665c54 +table-header-background: #504945 +tag-background: #d3869b +tag-foreground: #282828 +tiddler-background: <<colour background>> +tiddler-border: <<colour background>> +tiddler-controls-foreground-hover: #7c6f64 +tiddler-controls-foreground-selected: #7c6f64 +tiddler-controls-foreground: #665c54 +tiddler-editor-background: #282828 +tiddler-editor-border-image: #282828 +tiddler-editor-border: #282828 +tiddler-editor-fields-even: #504945 +tiddler-editor-fields-odd: #665c45 +tiddler-info-background: #32302f +tiddler-info-border: #ebdbb2 +tiddler-info-tab-background: #ebdbb2 +tiddler-link-background: <<colour background>> +tiddler-link-foreground: <<colour primary>> +tiddler-subtitle-foreground: #7c6f64 +tiddler-title-foreground: #7c6f64 +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +toolbar-info-button: +toolbar-edit-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-cancel-button: +toolbar-done-button: +untagged-background: #504945 +very-muted-foreground: #32302f From ca6dd9321419b2bb457e6c8abf96425201261d1f Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 12 Mar 2020 17:58:14 +0100 Subject: [PATCH 0519/2376] Add support for a custom class to modal wrapper (#4490) * Add support for a custom class to modal wrapper As per https://github.com/Jermolene/TiddlyWiki5/issues/4485 add support for a custom class to modal wrapper, by means of a field in the modal tiddler. The class is added to the modal wrapper in addition to the default class, allowing for custom styling via css of any part of the modal. * Remove redundant check for tiddler. --- core/modules/utils/dom/modal.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/modules/utils/dom/modal.js b/core/modules/utils/dom/modal.js index 1e77e0361..df6ef5432 100644 --- a/core/modules/utils/dom/modal.js +++ b/core/modules/utils/dom/modal.js @@ -58,6 +58,9 @@ Modal.prototype.display = function(title,options) { this.adjustPageClass(); // Add classes $tw.utils.addClass(wrapper,"tc-modal-wrapper"); + if(tiddler.fields && tiddler.fields.class) { + $tw.utils.addClass(wrapper,tiddler.fields.class); + } $tw.utils.addClass(modalBackdrop,"tc-modal-backdrop"); $tw.utils.addClass(modalWrapper,"tc-modal"); $tw.utils.addClass(modalHeader,"tc-modal-header"); @@ -104,7 +107,7 @@ Modal.prototype.display = function(title,options) { modalBody.appendChild(modalLink); } // Render the footer of the message - if(tiddler && tiddler.fields && tiddler.fields.help) { + if(tiddler.fields && tiddler.fields.help) { var link = this.srcDocument.createElement("a"); link.setAttribute("href",tiddler.fields.help); link.setAttribute("target","_blank"); From 1dc517b151a33990c2e1b38af4b2e3386d4f86c0 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 13 Mar 2020 09:35:37 +0000 Subject: [PATCH 0520/2376] Menubar: Move behind modals in z-order Fixes #4499 --- plugins/tiddlywiki/menubar/styles.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index e90bf445e..ff9035f32 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -9,7 +9,7 @@ tags: [[$:/tags/Stylesheet]] nav.tc-menubar { position: fixed; - z-index: 1100; + z-index: 1050; display: inline-block; top: 0; right: 0; From 0644716f4b702516c9309d968d0f446881855cba Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Fri, 13 Mar 2020 17:41:43 +0800 Subject: [PATCH 0521/2376] Add chinese translations for description of Gitea saver (#4498) --- languages/zh-Hans/ControlPanel.multids | 2 ++ languages/zh-Hant/ControlPanel.multids | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index bf77d3e78..74ec640a9 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -108,6 +108,8 @@ Saving/GitService/GitHub/Caption: ~GitHub 保存模块 Saving/GitService/GitHub/Password: 密码、OAUTH 令牌,或个人存取令牌 (详见 [[GitHub 帮助页面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) Saving/GitService/GitLab/Caption: ~GitLab 保存模块 Saving/GitService/GitLab/Password: 个人存取令牌的 API (详见 [[GitLab 帮助页面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]]) +Saving/GitService/gitea/Caption: Gitea 保存模块 +Saving/GitService/gitea/Password: 个人存取令牌的 API (通过 Gitea 的 Web 界面:`设定 | 应用程序 | 产生新的令牌`) Saving/TiddlySpot/Advanced/Heading: 高级设置 Saving/TiddlySpot/BackupDir: 备份文件夹 Saving/TiddlySpot/Backups: 备份 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index e6b4391c2..6be055c3b 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -105,9 +105,11 @@ Saving/GitService/Repo: 目標存儲庫 (例如,`Jermolene/TiddlyWiki5`) Saving/GitService/ServerURL: 伺服器 API 網址 Saving/GitService/UserName: 使用者名稱 Saving/GitService/GitHub/Caption: ~GitHub 儲存模組 -Saving/GitService/GitHub/Password: 密碼、OAUTH 令牌,或個人存取令牌 (詳見 [[GitHub 說明頁面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) +Saving/GitService/GitHub/Password: 密碼、OAUTH 權杖,或個人存取權杖 (詳見 [[GitHub 說明頁面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) Saving/GitService/GitLab/Caption: ~GitLab 儲存模組 -Saving/GitService/GitLab/Password: 個人存取令牌的 API (詳見 [[GitLab 說明頁面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]]) +Saving/GitService/GitLab/Password: 個人存取權杖的 API (詳見 [[GitLab 說明頁面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]]) +Saving/GitService/gitea/Caption: Gitea 儲存模組 +Saving/GitService/gitea/Password: 個人存取權杖的 API (通過 Gitea 的 Web 介面:`設定 | 應用程式 | 產生新的權杖`) Saving/TiddlySpot/Advanced/Heading: 進階設定 Saving/TiddlySpot/BackupDir: 備份資料夾 Saving/TiddlySpot/Backups: 備份 From ff7fab61754b4f1fda7c5a6a24db98e67b8e1309 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 13 Mar 2020 09:52:24 +0000 Subject: [PATCH 0522/2376] Menubar: Move behind modals in z-order Fixed fix for #4499 --- plugins/tiddlywiki/menubar/styles.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index ff9035f32..3ba23d88b 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -9,7 +9,7 @@ tags: [[$:/tags/Stylesheet]] nav.tc-menubar { position: fixed; - z-index: 1050; + z-index: 850; display: inline-block; top: 0; right: 0; From 62f8c9353e076ca7d9b9e5c1f25df9bca3f8aee6 Mon Sep 17 00:00:00 2001 From: Matthias Bilger <matthias@bilger.info> Date: Fri, 13 Mar 2020 18:36:05 +0100 Subject: [PATCH 0523/2376] Use CamelCase for Gitea (#4496) --- core/language/en-GB/ControlPanel.multids | 4 ++-- core/modules/savers/gitea.js | 18 +++++++++--------- core/ui/ControlPanel/Saving/gitea.tid | 20 ++++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index de19a1229..990f0b1aa 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -107,8 +107,8 @@ Saving/GitService/GitHub/Caption: ~GitHub Saver Saving/GitService/GitHub/Password: Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details) Saving/GitService/GitLab/Caption: ~GitLab Saver Saving/GitService/GitLab/Password: Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details) -Saving/GitService/gitea/Caption: gitea saver -Saving/GitService/gitea/Password: Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`) +Saving/GitService/Gitea/Caption: Gitea Saver +Saving/GitService/Gitea/Password: Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`) Saving/TiddlySpot/Advanced/Heading: Advanced Settings Saving/TiddlySpot/BackupDir: Backup Directory Saving/TiddlySpot/Backups: Backups diff --git a/core/modules/savers/gitea.js b/core/modules/savers/gitea.js index 5e2b57152..c2f56a56d 100644 --- a/core/modules/savers/gitea.js +++ b/core/modules/savers/gitea.js @@ -21,13 +21,13 @@ var GiteaSaver = function(wiki) { GiteaSaver.prototype.save = function(text,method,callback) { var self = this, - username = this.wiki.getTiddlerText("$:/gitea/Username"), - password = $tw.utils.getPassword("gitea"), - repo = this.wiki.getTiddlerText("$:/gitea/Repo"), - path = this.wiki.getTiddlerText("$:/gitea/Path",""), - filename = this.wiki.getTiddlerText("$:/gitea/Filename"), - branch = this.wiki.getTiddlerText("$:/gitea/Branch") || "master", - endpoint = this.wiki.getTiddlerText("$:/gitea/ServerURL") || "https://gitea", + username = this.wiki.getTiddlerText("$:/Gitea/Username"), + password = $tw.utils.getPassword("Gitea"), + repo = this.wiki.getTiddlerText("$:/Gitea/Repo"), + path = this.wiki.getTiddlerText("$:/Gitea/Path",""), + filename = this.wiki.getTiddlerText("$:/Gitea/Filename"), + branch = this.wiki.getTiddlerText("$:/Gitea/Branch") || "master", + endpoint = this.wiki.getTiddlerText("$:/Gitea/ServerURL") || "https://gitea", headers = { "Accept": "application/json", "Content-Type": "application/json;charset=UTF-8", @@ -82,7 +82,7 @@ GiteaSaver.prototype.save = function(text,method,callback) { headers: headers, callback: function(err,getResponseDataJson,xhr) { if(xhr.status === 404) { - callback("Please ensure the branch in the gitea repo exists"); + callback("Please ensure the branch in the Gitea repo exists"); }else{ data["branch"] = branch; self.upload(uri + filename, use_put?"PUT":"POST", headers, data, callback); @@ -114,7 +114,7 @@ GiteaSaver.prototype.upload = function(uri,method,headers,data,callback) { Information about this saver */ GiteaSaver.prototype.info = { - name: "gitea", + name: "Gitea", priority: 2000, capabilities: ["save", "autosave"] }; diff --git a/core/ui/ControlPanel/Saving/gitea.tid b/core/ui/ControlPanel/Saving/gitea.tid index 2bf00396f..48a4c4ca1 100644 --- a/core/ui/ControlPanel/Saving/gitea.tid +++ b/core/ui/ControlPanel/Saving/gitea.tid @@ -1,16 +1,16 @@ -title: $:/core/ui/ControlPanel/Saving/gitea +title: $:/core/ui/ControlPanel/Saving/Gitea tags: $:/tags/ControlPanel/Saving -caption: {{$:/language/ControlPanel/Saving/GitService/gitea/Caption}} +caption: {{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}} \define lingo-base() $:/language/ControlPanel/Saving/GitService/ -\define service-name() ~gitea +\define service-name() ~Gitea <<lingo Description>> -|<<lingo UserName>> |<$edit-text tiddler="$:/gitea/Username" default="" tag="input"/> | -|<<lingo gitea/Password>> |<$password name="gitea"/> | -|<<lingo Repo>> |<$edit-text tiddler="$:/gitea/Repo" default="" tag="input"/> | -|<<lingo Branch>> |<$edit-text tiddler="$:/gitea/Branch" default="master" tag="input"/> | -|<<lingo Path>> |<$edit-text tiddler="$:/gitea/Path" default="" tag="input"/> | -|<<lingo Filename>> |<$edit-text tiddler="$:/gitea/Filename" default="" tag="input"/> | -|<<lingo ServerURL>> |<$edit-text tiddler="$:/gitea/ServerURL" default="https://gitea/api/v1" tag="input"/> | +|<<lingo UserName>> |<$edit-text tiddler="$:/Gitea/Username" default="" tag="input"/> | +|<<lingo Gitea/Password>> |<$password name="Gitea"/> | +|<<lingo Repo>> |<$edit-text tiddler="$:/Gitea/Repo" default="" tag="input"/> | +|<<lingo Branch>> |<$edit-text tiddler="$:/Gitea/Branch" default="master" tag="input"/> | +|<<lingo Path>> |<$edit-text tiddler="$:/Gitea/Path" default="" tag="input"/> | +|<<lingo Filename>> |<$edit-text tiddler="$:/Gitea/Filename" default="" tag="input"/> | +|<<lingo ServerURL>> |<$edit-text tiddler="$:/Gitea/ServerURL" default="https://gitea/api/v1" tag="input"/> | From 061a2c6c948e227525416b79ac0ef757c80c0116 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 14 Mar 2020 12:55:11 +0000 Subject: [PATCH 0524/2376] Menubar: Add an optional dropdown for the sidebar tabs --- .../menubar/config-MenuItemsVisibility.multids | 1 + plugins/tiddlywiki/menubar/items/sidebar.tid | 11 +++++++++++ plugins/tiddlywiki/menubar/styles.tid | 11 +++++++++++ 3 files changed, 23 insertions(+) create mode 100644 plugins/tiddlywiki/menubar/items/sidebar.tid diff --git a/plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids b/plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids index f355e493a..150949b38 100644 --- a/plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids +++ b/plugins/tiddlywiki/menubar/config-MenuItemsVisibility.multids @@ -2,3 +2,4 @@ title: $:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menu pagecontrols: hide server: hide +sidebar: hide \ No newline at end of file diff --git a/plugins/tiddlywiki/menubar/items/sidebar.tid b/plugins/tiddlywiki/menubar/items/sidebar.tid new file mode 100644 index 000000000..3651883f1 --- /dev/null +++ b/plugins/tiddlywiki/menubar/items/sidebar.tid @@ -0,0 +1,11 @@ +title: $:/plugins/tiddlywiki/menubar/items/sidebar +caption: Sidebar +description: Sidebar +is-dropdown: yes +tags: $:/tags/MenuBar + +<div class="tc-popup-keep tc-menubar-dropdown-sidebar"> + +<$transclude tiddler="$:/core/ui/SideBarSegments/tabs" mode="inline"/> + +</div> diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index 3ba23d88b..0ef0c2ccd 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -139,6 +139,17 @@ nav.tc-menubar .tc-drop-down ol { margin: 0; } +nav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a, +nav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button { + display: inline; + width: auto; +} + +nav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button { + display: block; + width: 100%; +} + @media (max-width: {{$:/config/plugins/menubar/breakpoint}}) { .tc-menubar-wide { From f051e0d790d253ef19ea547f023fe79fbc96e52c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 14 Mar 2020 14:06:50 +0100 Subject: [PATCH 0525/2376] Update highlight.js to latest v9.18.1 (#4502) * update highlight.pack.js to latest v9.18.1 * Update readme.tid --- plugins/tiddlywiki/highlight/files/highlight.pack.js | 4 ++-- plugins/tiddlywiki/highlight/readme.tid | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/highlight/files/highlight.pack.js b/plugins/tiddlywiki/highlight/files/highlight.pack.js index 43792b094..a660f395b 100644 --- a/plugins/tiddlywiki/highlight/files/highlight.pack.js +++ b/plugins/tiddlywiki/highlight/files/highlight.pack.js @@ -1,2 +1,2 @@ -/*! highlight.js v9.15.6 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(a){var E=[],u=Object.keys,N={},g={},n=/^(no-?highlight|plain|text)$/i,R=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="</span>",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function d(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function p(e){return n.test(e)}function l(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function M(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),d(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(c){function s(e){return e&&e.source||e}function o(e,n){return new RegExp(s(e),"m"+(c.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){var r={},a=function(t,e){c.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");r[n[0]]=[t,n[1]?Number(n[1]):1]})};"string"==typeof t.k?a("keyword",t.k):u(t.k).forEach(function(e){a(e,t.k[e])}),t.k=r}t.lR=o(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=o(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=o(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=o(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return(n="self"===e?t:e).v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return l(n,{v:null},e)})),n.cached_variants||n.eW&&[l(n)]||[n];var n})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?o(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var c=r,o=s(e[i]);for(0<i&&(a+=n);0<o.length;){var u=t.exec(o);if(null==u){a+=o;break}a+=o.substring(0,u.index),o=o.substring(u.index+u[0].length),"\\"==u[0][0]&&u[1]?a+="\\"+String(Number(u[1])+c):(a+=u[0],"("==u[0]&&r++)}}return a}(i,"|"),!0):{exec:function(){return null}}}}(c)}function C(e,n,o,t){function u(e,n,t,r){var a='<span class="'+(r?"":h.classPrefix);return(a+=e+'">')+n+(t?"":b)}function s(){g+=null!=E.sL?function(){var e="string"==typeof E.sL;if(e&&!N[E.sL])return _(R);var n=e?C(E.sL,R,!0,i[E.sL]):O(R,E.sL.length?E.sL:void 0);return 0<E.r&&(d+=n.r),e&&(i[E.sL]=n.top),u(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,c;if(!E.k)return _(R);for(r="",n=0,E.lR.lastIndex=0,t=E.lR.exec(R);t;)r+=_(R.substring(n,t.index)),a=E,i=t,c=f.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(c)&&a.k[c])?(d+=e[1],r+=u(e[0],_(t[0]))):r+=_(t[0]),n=E.lR.lastIndex,t=E.lR.exec(R);return r+_(R.substr(n))}(),R=""}function l(e){g+=e.cN?u(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function r(e,n){if(R+=e,null==n)return s(),0;var t=function(e,n){var t,r,a;for(t=0,r=n.c.length;t<r;t++)if(v(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=(a=n.c[t].bR.exec(e)[0],new RegExp(a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m"))),n.c[t]}(n,E);if(t)return t.skip?R+=n:(t.eB&&(R+=n),s(),t.rB||t.eB||(R=n)),l(t),t.rB?0:n.length;var r,a,i=function e(n,t){if(v(n.eR,t)){for(;n.endsParent&&n.parent;)n=n.parent;return n}if(n.eW)return e(n.parent,t)}(E,n);if(i){var c=E;for(c.skip?R+=n:(c.rE||c.eE||(R+=n),s(),c.eE&&(R=n));E.cN&&(g+=b),E.skip||E.sL||(d+=E.r),(E=E.parent)!==i.parent;);return i.starts&&(i.endSameAsBegin&&(i.starts.eR=i.eR),l(i.starts)),c.rE?0:n.length}if(r=n,a=E,!o&&v(a.iR,r))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return R+=n,n.length||1}var f=S(e);if(!f)throw new Error('Unknown language: "'+e+'"');m(f);var a,E=t||f,i={},g="";for(a=E;a!==f;a=a.parent)a.cN&&(g=u(a.cN,"",!0)+g);var R="",d=0;try{for(var c,p,M=0;E.t.lastIndex=M,c=E.t.exec(n);)p=r(n.substring(M,c.index),c[0]),M=c.index+p;for(r(n.substr(M)),a=E;a.parent;a=a.parent)a.cN&&(g+=b);return{r:d,value:g,language:e,top:E}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(S).filter(s).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function B(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"<br>":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function c(e){var n,t,r,a,i,c,o,u,s,l,f=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=R.exec(i))return S(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n<r;n++)if(p(a=i[n])||S(a))return a}(e);p(f)||(h.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=e,i=n.textContent,r=f?C(f,i,!0):O(i),(t=M(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function c(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function o(e){a+="<"+d(e)+E.map.call(e.attributes,function(e){return" "+e.nodeName+'="'+_(e.value).replace('"',""")+'"'}).join("")+">"}function u(e){a+="</"+d(e)+">"}function s(e){("start"===e.event?o:u)(e.node)}for(;e.length||n.length;){var l=c();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=c())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(o)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,M(a),i)),r.value=B(r.value),e.innerHTML=r.value,e.className=(c=e.className,o=f,u=r.language,s=o?g[o]:u,l=[c.trim()],c.match(/\bhljs\b/)||l.push("hljs"),-1===c.indexOf(s)&&l.push(s),l.join(" ").trim()),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function o(){if(!o.called){o.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,c)}}function S(e){return e=(e||"").toLowerCase(),N[e]||N[g[e]]}function s(e){var n=S(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=B,a.highlightBlock=c,a.configure=function(e){h=l(h,e)},a.initHighlighting=o,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",o,!1),addEventListener("load",o,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){g[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=S,a.autoDetection=s,a.inherit=l,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="("+t+"[:=]"+t+"|[ \\t\\f]+)",s="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",n="([^\\\\:= \\t\\f\\n]|\\\\.)+",a={e:e,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:s+e,rB:!0,c:[{cN:"attr",b:s,endsParent:!0,r:0}],starts:a},{b:n+e,rB:!0,r:0,c:[{cN:"meta",b:n,endsParent:!0,r:0}],starts:a},{cN:"attr",r:0,b:n+t+"$"}]}});hljs.registerLanguage("typescript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise"},n={cN:"meta",b:"@"+r},a={b:"\\(",e:/\)/,k:t,c:["self",e.QSM,e.ASM,e.NM]},o={cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]};return{aliases:["ts"],k:t,c:[{cN:"meta",b:/^\s*['"]use strict['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+e.IR+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:e.IR},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:["self",e.CLCM,e.CBCM]}]}]}],r:0},{cN:"function",b:"function",e:/[\{;]/,eE:!0,k:t,c:["self",e.inherit(e.TM,{b:r}),o],i:/%/,r:0},{bK:"constructor",e:/\{/,eE:!0,c:["self",o]},{b:/module\./,k:{built_in:"module"},r:0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},n,a]}});hljs.registerLanguage("rust",function(e){var t="([ui](8|16|32|64|128|size)|f(32|64))?",r="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{aliases:["rs"],k:{keyword:"alignof as be box break const continue crate do else enum extern false fn for if impl in let loop match mod mut offsetof once priv proc pub pure ref return self Self sizeof static struct super trait true type typeof unsafe unsized use virtual while where yield move default",literal:"true false Some None Ok Err",built_in:r},l:e.IR+"!?",i:"</",c:[e.CLCM,e.C("/\\*","\\*/",{c:["self"]}),e.inherit(e.QSM,{b:/b?"/,i:null}),{cN:"string",v:[{b:/r(#*)"(.|\n)*?"\1(?!#)/},{b:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{cN:"symbol",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:"number",v:[{b:"\\b0b([01_]+)"+t},{b:"\\b0o([0-7_]+)"+t},{b:"\\b0x([A-Fa-f0-9_]+)"+t},{b:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+t}],r:0},{cN:"function",bK:"fn",e:"(\\(|<)",eE:!0,c:[e.UTM]},{cN:"meta",b:"#\\!?\\[",e:"\\]",c:[{cN:"meta-string",b:/"/,e:/"/}]},{cN:"class",bK:"type",e:";",c:[e.inherit(e.UTM,{endsParent:!0})],i:"\\S"},{cN:"class",bK:"trait enum struct union",e:"{",c:[e.inherit(e.UTM,{endsParent:!0})],i:"[\\w\\d]"},{b:e.IR+"::",k:{built_in:r}},{b:"->"}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("kotlin",function(e){var t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},r={cN:"symbol",b:e.UIR+"@"},a={cN:"subst",b:"\\${",e:"}",c:[e.ASM,e.CNM]},i={cN:"variable",b:"\\$"+e.UIR},n={cN:"string",v:[{b:'"""',e:'"""',c:[i,a]},{b:"'",e:"'",i:/\n/,c:[e.BE]},{b:'"',e:'"',i:/\n/,c:[e.BE,i,a]}]},c={cN:"meta",b:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UIR+")?"},s={cN:"meta",b:"@"+e.UIR,c:[{b:/\(/,e:/\)/,c:[e.inherit(n,{cN:"meta-string"})]}]},l={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",r:0};return{aliases:["kt"],k:t,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,{cN:"keyword",b:/\b(break|continue|return|this)\b/,starts:{c:[{cN:"symbol",b:/@\w+/}]}},r,c,s,{cN:"function",bK:"fun",e:"[(]|$",rB:!0,eE:!0,k:t,i:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b:/</,e:/>/,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,c,s,n,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b:/</,e:/>/,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},c,s]},n,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},l]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("xml",function(s){var e={eW:!0,i:/</,r:0,c:[{cN:"attr",b:"[A-Za-z0-9\\._:-]+",r:0},{b:/=\s*/,r:0,c:[{cN:"string",endsParent:!0,v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("\x3c!--","--\x3e",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{name:"style"},c:[e],starts:{e:"</style>",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{name:"script"},c:[e],starts:{e:"<\/script>",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"name",b:/[^\/><\s]+/,r:0},e]}]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{r:10}),e.C("^//","$",{r:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"section",r:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,r:10},{cN:"meta",b:"^\\[.+?\\]$",r:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("erlang-repl",function(e){return{k:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"meta",b:"^[0-9]+> ",r:10},e.C("%","$"),{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},e.ASM,e.QSM,{b:"\\?(::)?([A-Z]\\w*(::)?)+"},{b:"->"},{b:"ok"},{b:"!"},{b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:s.c=o}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U|L)?"',e:'"',i:"\\n",c:[t.BE]},{b:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"</",c:n.concat([i,{b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e,{b:/\(/,e:/\)/,k:c,r:0,c:["self",t.CLCM,t.CBCM,r,s,e]}]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b:/</,e:/>/,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("arduino",function(e){var t=e.getLanguage("cpp").exports;return{k:{keyword:"boolean byte word string String array "+t.k.keyword,built_in:"setup loop while catch for if do goto try switch case else default break continue return KeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put",literal:"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW"},c:[t.preprocessor,e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:"</?",e:">"},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("cmake",function(e){return{aliases:["cmake.in"],cI:!0,k:{keyword:"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined"},c:[{cN:"variable",b:"\\${",e:"}"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("java",function(e){var a="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",t={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("armasm",function(s){return{cI:!0,aliases:["arm"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},c:[{cN:"keyword",b:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?",e:"\\s"},s.C("[;@]","$",{r:0}),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",r:0},{cN:"number",v:[{b:"[#$=]?0x[0-9a-f]+"},{b:"[#$=]?0b[01]+"},{b:"[#$=]\\d+"},{b:"\\b\\d+"}],r:0},{cN:"symbol",v:[{b:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"[=#]\\w+"}],r:0}]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"</",c:[e.CLCM,e.CBCM,{cN:"string",v:[e.QSM,{b:"'",e:"[^\\\\]'"},{b:"`",e:"`"}]},{cN:"number",v:[{b:e.CNR+"[dflsi]",r:1},e.CNM]},{b:/:=/},{cN:"function",bK:"func",e:/\s*\{/,eE:!0,c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:t,i:/["']/}]}]}});hljs.registerLanguage("mathematica",function(e){return{aliases:["mma"],l:"(\\$|\\b)"+e.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber",c:[{cN:"comment",b:/\(\*/,e:/\*\)/},e.ASM,e.QSM,e.CNM,{b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("haskell",function(e){var i={v:[e.C("--","$"),e.C("{-","-}",{c:["self"]})]},a={cN:"meta",b:"{-#",e:"#-}"},l={cN:"meta",b:"^#",e:"$"},c={cN:"type",b:"\\b[A-Z][\\w']*",r:0},n={b:"\\(",e:"\\)",i:'"',c:[a,l,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TM,{b:"[_a-z][\\w']*"}),i]};return{aliases:["hs"],k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{bK:"module",e:"where",k:"module where",c:[n,i],i:"\\W\\.|;"},{b:"\\bimport\\b",e:"$",k:"import qualified as hiding",c:[n,i],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[c,n,i]},{cN:"class",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[a,c,n,{b:"{",e:"}",c:n.c},i]},{bK:"default",e:"$",c:[c,n,i]},{bK:"infix infixl infixr",e:"$",c:[e.CNM,i]},{b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[c,e.QSM,i]},{cN:"meta",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:"^[_a-z][\\w']*"}),i,{b:"->|<-"}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php","php3","php4","php5","php6","php7"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("autohotkey",function(e){var r={b:"`[\\s\\S]"};return{cI:!0,aliases:["ahk"],k:{keyword:"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group",literal:"A|0 true false NOT AND OR",built_in:"ComSpec Clipboard ClipboardAll ErrorLevel"},c:[{cN:"built_in",b:"A_[a-zA-Z0-9]+"},r,e.inherit(e.QSM,{c:[r]}),e.C(";","$",{r:0}),e.CBCM,{cN:"number",b:e.NR,r:0},{cN:"subst",b:"%(?=[a-zA-Z0-9#_$@])",e:"%",i:"[^a-zA-Z0-9#_$@]"},{cN:"built_in",b:"^\\s*\\w+\\s*,"},{cN:"meta",b:"^\\s*#w+",e:"$",r:0},{cN:"symbol",c:[r],v:[{b:'^[^\\n";]+::(?!=)'},{b:'^[^\\n";]+:(?!=)',r:0}]},{b:",\\s*,"}]}});hljs.registerLanguage("x86asm",function(s){return{cI:!0,l:"[.%]?"+s.IR,k:{keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},c:[s.C(";","$",{r:0}),{cN:"number",v:[{b:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",r:0},{b:"\\$[0-9][0-9A-Fa-f]*",r:0},{b:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{b:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QSM,{cN:"string",v:[{b:"'",e:"[^\\\\]'"},{b:"`",e:"[^\\\\]`"}],r:0},{cN:"symbol",v:[{b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{b:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],r:0},{cN:"subst",b:"%[0-9]+",r:0},{cN:"subst",b:"%!S+",r:0},{cN:"meta",b:/^\s*\.[\w_-]+/}]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},o={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},r={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[t,o,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},n=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]});return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Add-MDTPersistentDrive Disable-MDTMonitorService Enable-MDTMonitorService Get-MDTDeploymentShareStatistics Get-MDTMonitorData Get-MDTOperatingSystemCatalog Get-MDTPersistentDrive Import-MDTApplication Import-MDTDriver Import-MDTOperatingSystem Import-MDTPackage Import-MDTTaskSequence New-MDTDatabase Remove-MDTMonitorData Remove-MDTPersistentDrive Restore-MDTPersistentDrive Set-MDTMonitorData Test-MDTDeploymentShare Test-MDTMonitorData Update-MDTDatabaseSchema Update-MDTDeploymentShare Update-MDTLinkedDS Update-MDTMedia Update-MDTMedia Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[t,e.NM,r,{cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},{cN:"literal",b:/\$(null|true|false)\b/},o,n]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,{cN:"string",b:/'/,e:/'/},t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("css",function(e){var c={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:"[a-zA-Z-][a-zA-Z0-9_-]*",r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,c]}]}});hljs.registerLanguage("vim",function(e){return{l:/[!#@\w]+/,k:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",built_in:"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp"},i:/;/,c:[e.NM,{cN:"string",b:"'",e:"'",i:"\\n"},{cN:"string",b:/"(\\"|\n\\|[^"\n])*"/},e.C('"',"$"),{cN:"variable",b:/[bwtglsav]:[\w\d_]*/},{cN:"function",bK:"function function!",e:"$",r:0,c:[e.TM,{cN:"params",b:"\\(",e:"\\)"}]},{cN:"symbol",b:/<[\w-]+>/}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d;var l=[{b:/^\s*=>/,starts:{e:"$",c:i.c=d}},{cN:"meta",b:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(l).concat(d)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:a+r+":"},{b:a+'"'+r+'":'},{b:a+"'"+r+"':"}]},c={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,{cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]}]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:c.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},e.HCM,{bK:b,k:{literal:b}},e.CNM,c]}});hljs.registerLanguage("fortran",function(e){return{cI:!0,aliases:["f90","f95"],k:{literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data",built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image"},i:/\/\*/,c:[e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{cN:"string",r:0}),{cN:"function",bK:"subroutine function program",i:"[${=\\n]",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)"}]},e.C("!","$",{r:0}),{cN:"number",b:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",r:0}]}});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",b={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},i=e.C("%","$"),n={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a={b:"fun\\s+"+r+"/\\d+"},d={b:c+"\\(",e:"\\)",rB:!0,r:0,c:[{b:c,r:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,r:0}]},o={b:"{",e:"}",r:0},t={b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0},f={b:"[A-Z][a-zA-Z0-9_]*",r:0},l={b:"#"+e.UIR,r:0,rB:!0,c:[{b:"#"+e.UIR,r:0},{b:"{",e:"}",r:0}]},s={bK:"fun receive if try case",e:"end",k:b};s.c=[i,a,e.inherit(e.ASM,{cN:""}),s,d,e.QSM,n,o,t,f,l];var u=[i,a,s,d,e.QSM,n,o,t,f,l];d.c[1].c=u,o.c=u;var h={cN:"params",b:"\\(",e:"\\)",c:l.c[1].c=u};return{aliases:["erl"],k:b,i:"(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+r+"\\s*\\(",e:"->",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%<?\^\+\*]/}]},r={cN:"string",b:/"/,e:/"/,c:[e.BE,i]},a={cN:"variable",b:/\$\([\w-]+\s/,e:/\)/,k:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},c:[i]},n={b:"^"+e.UIR+"\\s*[:+?]?=",i:"\\n",rB:!0,c:[{b:"^"+e.UIR,e:"[:+?]?=",eE:!0}]},t={cN:"section",b:/^[^\s]+:/,e:/$/,c:[i]};return{aliases:["mk","mak"],k:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath",l:/[\w-]+/,c:[e.HCM,i,r,a,n,{cN:"meta",b:/^\.PHONY:/,e:/$/,k:{"meta-keyword":".PHONY"},l:/[\.\w]+/},t]}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_\.-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_\.-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("matlab",function(e){var a="('|\\.')+",s={r:0,c:[{b:a}]};return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell "},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}]}]},{cN:"built_in",b:/true|false/,r:0,starts:s},{b:"[a-zA-Z][a-zA-Z_0-9]*"+a,r:0},{cN:"number",b:e.CNR,r:0,starts:s},{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{b:/\]|}|\)/,r:0,starts:s},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}],starts:s},e.C("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),e.C("\\%","$")]}});hljs.registerLanguage("elixir",function(e){var r="[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?",b="and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0",n={cN:"subst",b:"#\\{",e:"}",l:r,k:b},c={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/}]},i={cN:"function",bK:"def defp defmacro",e:/\B\b/,c:[e.inherit(e.TM,{b:r,endsParent:!0})]},a=e.inherit(i,{cN:"class",bK:"defimpl defmodule defprotocol defrecord",e:/\bdo\b|$|;/}),l=[c,e.HCM,a,i,{b:"::"},{cN:"symbol",b:":(?![\\s:])",c:[c,{b:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}],r:0},{cN:"symbol",b:r+":(?!:)",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"->"},{b:"("+e.RSR+")\\s*",c:[e.HCM,{cN:"regexp",i:"\\n",c:[e.BE,n],v:[{b:"/",e:"/[a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];return{l:r,k:b,c:n.c=l}});hljs.registerLanguage("objectivec",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,_="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:{keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},l:t,i:"</",c:[{cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.CLCM,e.CBCM,e.CNM,e.QSM,{cN:"string",v:[{b:'@"',e:'"',i:"\\n",c:[e.BE]},{b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"}]},{cN:"meta",b:"#",e:"$",c:[{cN:"meta-string",v:[{b:'"',e:'"'},{b:"<",e:">"}]}]},{cN:"class",b:"("+_.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:_,l:t,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},t={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a=e.inherit(t,{i:/\n/}),c={cN:"subst",b:"{",e:"}",k:i},n=e.inherit(c,{i:/\n/}),s={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,n]},b={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},c]},l=e.inherit(b,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},n]});c.c=[b,s,t,e.ASM,e.QSM,r,e.CBCM],n.c=[l,s,a,e.ASM,e.QSM,r,e.inherit(e.CBCM,{i:/\n/})];var o={v:[b,s,t,e.ASM,e.QSM]},d=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp","c#"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:"\x3c!--|--\x3e"},{b:"</?",e:">"}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},o,r,{bK:"class interface",e:/[{;=]/,i:/[^\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+d+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/\s*[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[o,r,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[e.BE,b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[e.BE,b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,c]},{b:/(fr|rf|f)"/,e:/"/,c:[e.BE,c]},e.ASM,e.QSM]},i={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},l={cN:"params",b:/\(/,e:/\)/,c:["self",b,i,a]};return c.c=[a,i,b],{aliases:["py","gyp","ipython"],k:r,i:/(<\/|->|\?)|=>/,c:[b,i,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,l,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b:/</,e:/(\/\w+|\w+\/)>/,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor get set",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]$/,sL:"bash"}}],i:"</"}});hljs.registerLanguage("r",function(e){var r="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[e.HCM,{b:r,l:r,k:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[e.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("awk",function(e){return{k:{keyword:"BEGIN END if else while do for in break continue delete next nextfile function func exit|10"},c:[{cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},{cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,r:10},{b:/(u|b)?r?"""/,e:/"""/,r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}}); +/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],i=Object.keys,_={},c={},C=!0,n=/^(no-?highlight|plain|text)$/i,l=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},m="</span>",O="Could not find the language '{}', did you forget to load/include a language module?",B={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},o="of and for in not or if then".split(" ");function x(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function g(e){return e.nodeName.toLowerCase()}function u(e){return n.test(e)}function s(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function E(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),g(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function d(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){a+="<"+g(e)+f.map.call(e.attributes,function(e){return" "+e.nodeName+'="'+x(e.value).replace(/"/g,""")+'"'}).join("")+">"}function l(e){a+="</"+g(e)+">"}function u(e){("start"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else"start"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function R(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return s(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[s(n,{starts:n.starts?s(n.starts):null})]:Object.isFrozen(n)?[s(n)]:[n]}function p(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(p)}}function v(n,r){var a={};return"string"==typeof n?t("keyword",n):i(n).forEach(function(e){t(e,n[e])}),a;function t(t,e){r&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,function(e,n){return n?Number(n):function(e){return-1!=o.indexOf(e.toLowerCase())}(e)?0:1}(n[0],n[1])]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),"m"+(r.cI?"i":"")+(n?"g":""))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=function(e){return new RegExp(e.toString()+"|").exec("").length-1}(n)+1}for(var r=0;r<a.c.length;r++){n(e=a.c[r],e.bK?"\\.?(?:"+e.b+")\\.?":e.b)}a.tE&&n("end",a.tE),a.i&&n("illegal",a.i);var u=c.map(function(e){return e[1]});return i=f(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var o=r+=1,c=s(e[i]);for(0<i&&(a+=n),a+="(";0<c.length;){var l=t.exec(c);if(null==l){a+=c;break}a+=c.substring(0,l.index),c=c.substring(l.index+l[0].length),"\\"==l[0][0]&&l[1]?a+="\\"+String(Number(l[1])+o):(a+=l[0],"("==l[0]&&r++)}a+=")"}return a}(u,"|"),!0),l.lastIndex=0,l.exec=function(e){var n;if(0===c.length)return null;i.lastIndex=l.lastIndex;var t=i.exec(e);if(!t)return null;for(var r=0;r<t.length;r++)if(null!=t[r]&&null!=o[""+r]){n=o[""+r];break}return"string"==typeof n?(t.type=n,t.extra=[a.i,a.tE]):(t.type="begin",t.rule=n),t},l}if(r.c&&-1!=r.c.indexOf("self")){if(!C)throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");r.c=r.c.filter(function(e){return"self"!=e})}!function n(t,e){t.compiled||(t.compiled=!0,t.k=t.k||t.bK,t.k&&(t.k=v(t.k,r.cI)),t.lR=f(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=f(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=f(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=f(t.i)),null==t.relevance&&(t.relevance=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return R("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e),t.t=a(t))}(r)}function T(n,e,a,t){var i=e;function o(e,n){if(function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.eW)return o(e.parent,n)}function c(e,n,t,r){if(!t&&""===n)return"";if(!e)return n;var a='<span class="'+(r?"":B.classPrefix);return(a+=e+'">')+n+(t?"":m)}function l(){p+=null!=d.sL?function(){var e="string"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0<d.relevance&&(M+=n.relevance),e&&(R[d.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!d.k)return x(v);for(r="",n=0,d.lR.lastIndex=0,t=d.lR.exec(v);t;)r+=x(v.substring(n,t.index)),a=d,i=t,void 0,o=g.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(M+=e[1],r+=c(e[0],x(t[0]))):r+=x(t[0]),n=d.lR.lastIndex,t=d.lR.exec(v);return r+x(v.substr(n))}(),v=""}function u(e){p+=e.cN?c(e.cN,"",!0):"",d=Object.create(e,{parent:{value:d}})}function s(e){var n=e[0],t=e.rule;return t&&t.endSameAsBegin&&(t.eR=function(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(n)),t.skip?v+=n:(t.eB&&(v+=n),l(),t.rB||t.eB||(v=n)),u(t),t.rB?0:n.length}var f={};function r(e,n){var t=n&&n[0];if(v+=e,null==t)return l(),0;if("begin"==f.type&&"end"==n.type&&f.index==n.index&&""===t)return v+=i.slice(n.index,n.index+1),1;if("begin"===(f=n).type)return s(n);if("illegal"===n.type&&!a)throw new Error('Illegal lexeme "'+t+'" for mode "'+(d.cN||"<unnamed>")+'"');if("end"===n.type){var r=function(e){var n=e[0],t=i.substr(e.index),r=o(d,t);if(r){var a=d;for(a.skip?v+=n:(a.rE||a.eE||(v+=n),l(),a.eE&&(v=n));d.cN&&(p+=m),d.skip||d.sL||(M+=d.relevance),(d=d.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}}(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace("{}",n)),new Error('Unknown language: "'+n+'"');S(g);var E,d=t||g,R={},p="";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,"",!0)+p);var v="",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||i(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function M(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&"\n"===e?"<br>":B.tabReplace?n.replace(/\t/g,B.tabReplace):""}):e}function b(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=l.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),o?t[1]:"no-highlight"}for(n=0,r=(i=i.split(/\s+/)).length;n<r;n++)if(u(a=i[n])||D(a))return a}(e);u(o)||(B.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=e,i=n.textContent,r=o?T(o,i,!0):w(i),(t=E(n)).length&&((a=document.createElement("div")).innerHTML=r.value,r.value=d(t,E(a),i)),r.value=M(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,b)}}var N={disableAutodetect:!0};function D(e){return e=(e||"").toLowerCase(),_[e]||_[c[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=M,a.highlightBlock=b,a.configure=function(e){B=s(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener("DOMContentLoaded",h,!1),window.addEventListener("load",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error("Language definition for '{}' could not be registered.".replace("{}",n)),!C)throw e;console.error(e),t=N}p(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return i(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error("The '{}' language is required, but not loaded.".replace("{}",e))},a.autoDetection=L,a.inherit=s,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,relevance:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r="function"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||"object"!=typeof t[e]&&"function"!=typeof t[e]||r&&("caller"===e||"callee"===e||"arguments"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage("swift",function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},t=e.C("/\\*","\\*/",{c:["self"]}),n={cN:"subst",b:/\\\(/,e:"\\)",k:i,c:[]},r={cN:"string",c:[e.BE,n],v:[{b:/"""/,e:/"""/},{b:/"/,e:/"/}]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return n.c=[a],{k:i,c:[r,e.CLCM,t,{cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b:/</,e:/>/},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:i,c:["self",a,r,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:i,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{cN:"meta",b:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)"},{bK:"import",e:/$/,c:[e.CLCM,t]}]}});hljs.registerLanguage("less",function(e){function r(e){return{cN:"string",b:"~?"+e+".*?"+e}}function t(e,r,t){return{cN:e,b:r,relevance:t}}var a="[\\w-]+",c="("+a+"|@{"+a+"})",s=[],n=[],b={b:"\\(",e:"\\)",c:n,relevance:0};n.push(e.CLCM,e.CBCM,r("'"),r('"'),e.CSSNM,{b:"(url|data-uri)\\(",starts:{cN:"string",e:"[\\)\\n]",eE:!0}},t("number","#[0-9A-Fa-f]+\\b"),b,t("variable","@@?"+a,10),t("variable","@{"+a+"}"),t("built_in","~?`[^`]*?`"),{cN:"attribute",b:a+"\\s*:",e:":",rB:!0,eE:!0},{cN:"meta",b:"!important"});var i=n.concat({b:"{",e:"}",c:s}),l={bK:"when",eW:!0,c:[{bK:"and not"}].concat(n)},o={b:c+"\\s*:",rB:!0,e:"[;}]",relevance:0,c:[{cN:"attribute",b:c,e:":",eE:!0,starts:{eW:!0,i:"[<=$]",relevance:0,c:n}}]},u={cN:"keyword",b:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{e:"[;{}]",rE:!0,c:n,relevance:0}},v={cN:"variable",v:[{b:"@"+a+"\\s*:",relevance:15},{b:"@"+a}],starts:{e:"[;}]",rE:!0,c:i}},C={v:[{b:"[\\.#:&\\[>]",e:"[;{}]"},{b:c,e:"{"}],rB:!0,rE:!0,i:"[<='$\"]",relevance:0,c:[e.CLCM,e.CBCM,l,t("keyword","all\\b"),t("variable","@{"+a+"}"),t("selector-tag",c+"%?",0),t("selector-id","#"+c),t("selector-class","\\."+c,0),t("selector-tag","&",0),{cN:"selector-attr",b:"\\[",e:"\\]"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"\\(",e:"\\)",c:i},{b:"!important"}]};return s.push(e.CLCM,e.CBCM,u,v,o,C),{cI:!0,i:"[=>'/<($\"]",c:s}});hljs.registerLanguage("armasm",function(s){return{cI:!0,aliases:["arm"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},c:[{cN:"keyword",b:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?",e:"\\s"},s.C("[;@]","$",{relevance:0}),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",relevance:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",relevance:0},{cN:"number",v:[{b:"[#$=]?0x[0-9a-f]+"},{b:"[#$=]?0b[01]+"},{b:"[#$=]\\d+"},{b:"\\b\\d+"}],relevance:0},{cN:"symbol",v:[{b:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"[=#]\\w+"}],relevance:0}]}});hljs.registerLanguage("ruby",function(e){var c="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",b={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},r={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},n=[e.C("#","$",{c:[r]}),e.C("^\\=begin","^\\=end",{c:[r],relevance:10}),e.C("^__END__","\\n$")],s={cN:"subst",b:"#\\{",e:"}",k:b},t={cN:"string",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:b},l=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(n)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",relevance:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:c}],relevance:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:b},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,s],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\s*=>/,starts:{e:"$",c:i.c=l}},{cN:"meta",b:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{e:"$",c:l}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:b,i:/\/\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage("lua",function(e){var t="\\[=*\\[",a="\\]=*\\]",n={b:t,e:a,c:["self"]},l=[e.C("--(?!"+t+")","$"),e.C("--"+t,a,{c:[n],relevance:10})];return{l:e.UIR,k:{literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},c:l.concat([{cN:"function",bK:"function",e:"\\)",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:!0,c:l}].concat(l)},e.CNM,e.ASM,e.QSM,{cN:"string",b:t,e:a,c:[n],relevance:5}])}});hljs.registerLanguage("matlab",function(e){var a="('|\\.')+",s={relevance:0,c:[{b:a}]};return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell "},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}]}]},{cN:"built_in",b:/true|false/,relevance:0,starts:s},{b:"[a-zA-Z][a-zA-Z_0-9]*"+a,relevance:0},{cN:"number",b:e.CNR,relevance:0,starts:s},{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{b:/\]|}|\)/,relevance:0,starts:s},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}],starts:s},e.C("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),e.C("\\%","$")]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:"</?",e:">"},{cN:"attribute",b:/\w+/,relevance:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,relevance:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a={cN:"string",relevance:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,{cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]}]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[{cN:"attr",v:[{b:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{b:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{b:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{cN:"meta",b:"^---s*$",relevance:10},{cN:"string",b:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,relevance:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"\\-(?=[ ]|$)",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:"number",b:e.CNR+"\\b"},a]}});hljs.registerLanguage("plaintext",function(e){return{disableAutodetect:!0}});hljs.registerLanguage("erlang-repl",function(e){return{k:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"meta",b:"^[0-9]+> ",relevance:10},e.C("%","$"),{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",relevance:0},e.ASM,e.QSM,{b:"\\?(::)?([A-Z]\\w*(::)?)+"},{b:"->"},{b:"ok"},{b:"!"},{b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",relevance:0},{b:"[A-Z][a-zA-Z0-9_']*",relevance:0}]}});hljs.registerLanguage("cmake",function(e){return{aliases:["cmake.in"],cI:!0,k:{keyword:"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined"},c:[{cN:"variable",b:"\\${",e:"}"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage("kotlin",function(e){var t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={cN:"symbol",b:e.UIR+"@"},n={cN:"subst",b:"\\${",e:"}",c:[e.CNM]},c={cN:"variable",b:"\\$"+e.UIR},r={cN:"string",v:[{b:'"""',e:'"""(?=[^"])',c:[c,n]},{b:"'",e:"'",i:/\n/,c:[e.BE]},{b:'"',e:'"',i:/\n/,c:[e.BE,c,n]}]};n.c.push(r);var i={cN:"meta",b:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UIR+")?"},l={cN:"meta",b:"@"+e.UIR,c:[{b:/\(/,e:/\)/,c:[e.inherit(r,{cN:"meta-string"})]}]},s={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0},b=e.C("/\\*","\\*/",{c:[e.CBCM]}),o={v:[{cN:"type",b:e.UIR},{b:/\(/,e:/\)/,c:[]}]},d=o;return d.v[1].c=[o],o.v[1].c=[d],{aliases:["kt"],k:t,c:[e.C("/\\*\\*","\\*/",{relevance:0,c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,b,{cN:"keyword",b:/\b(break|continue|return|this)\b/,starts:{c:[{cN:"symbol",b:/@\w+/}]}},a,i,l,{cN:"function",bK:"fun",e:"[(]|$",rB:!0,eE:!0,k:t,i:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,relevance:0,c:[e.UTM]},{cN:"type",b:/</,e:/>/,k:"reified",relevance:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,relevance:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[o,e.CLCM,b],relevance:0},e.CLCM,b,i,l,r,e.CNM]},b]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b:/</,e:/>/,eB:!0,eE:!0,relevance:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},i,l]},r,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},s]}});hljs.registerLanguage("javascript",function(e){var r="<>",a="</>",t={b:/<[A-Za-z0-9\\._:-]+/,e:/\/[A-Za-z0-9\\._:-]+>|\/>/},c="[A-Za-z$_][0-9A-Za-z$_]*",n={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},s={cN:"number",v:[{b:"\\b(0[bB][01]+)n?"},{b:"\\b(0[oO][0-7]+)n?"},{b:e.CNR+"n?"}],relevance:0},o={cN:"subst",b:"\\$\\{",e:"\\}",k:n,c:[]},i={b:"html`",e:"",starts:{e:"`",rE:!1,c:[e.BE,o],sL:"xml"}},b={b:"css`",e:"",starts:{e:"`",rE:!1,c:[e.BE,o],sL:"css"}},l={cN:"string",b:"`",e:"`",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx","mjs","cjs"],k:n,c:[{cN:"meta",relevance:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C("/\\*\\*","\\*/",{relevance:0,c:[{cN:"doctag",b:"@[A-Za-z]+",c:[{cN:"type",b:"\\{",e:"\\}",relevance:0},{cN:"variable",b:c+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{b:/(?=[^\n])\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\n]\s*/,relevance:0,c:[{b:c+"\\s*:",rB:!0,relevance:0,c:[{cN:"attr",b:c,relevance:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+c+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:c},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:"",b:/\s/,e:/\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:"xml",c:[{b:t.b,e:t.e,skip:!0,c:["self"]}]}],relevance:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:u}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor get set",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("scss",function(e){var t="@[a-z-]+",r={cN:"variable",b:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={cN:"number",b:"#[0-9A-Fa-f]+"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:"[=/|']",c:[e.CLCM,e.CBCM,{cN:"selector-id",b:"\\#[A-Za-z0-9_-]+",relevance:0},{cN:"selector-class",b:"\\.[A-Za-z0-9_-]+",relevance:0},{cN:"selector-attr",b:"\\[",e:"\\]",i:"$"},{cN:"selector-tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{cN:"selector-pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"selector-pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},r,{cN:"attribute",b:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{b:":",e:";",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:"meta",b:"!important"}]},{b:"@(page|font-face)",l:t,k:"@page @font-face"},{b:"@",e:"[{;]",rB:!0,k:"and or not only",c:[{b:t,cN:"keyword"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,relevance:0}]},c=[e.BE,r,n],a=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:c,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",relevance:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",relevance:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",relevance:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",relevance:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",relevance:5},{b:"qw\\s+q",e:"q",relevance:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],relevance:0},{b:"-?\\w+\\s*\\=\\>",c:[],relevance:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",relevance:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],relevance:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,relevance:5,c:[e.TM]},{b:"-\\w\\b",relevance:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=a,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:s.c=a}});hljs.registerLanguage("go",function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:n,i:"</",c:[e.CLCM,e.CBCM,{cN:"string",v:[e.QSM,e.ASM,{b:"`",e:"`"}]},{cN:"number",v:[{b:e.CNR+"[i]",relevance:1},e.CNM]},{b:/:=/},{cN:"function",bK:"func",e:"\\s*(\\{|$)",eE:!0,c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:n,i:/["']/}]}]}});hljs.registerLanguage("x86asm",function(s){return{cI:!0,l:"[.%]?"+s.IR,k:{keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},c:[s.C(";","$",{relevance:0}),{cN:"number",v:[{b:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{b:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{b:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{b:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QSM,{cN:"string",v:[{b:"'",e:"[^\\\\]'"},{b:"`",e:"[^\\\\]`"}],relevance:0},{cN:"symbol",v:[{b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{b:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{cN:"subst",b:"%[0-9]+",relevance:0},{cN:"subst",b:"%!S+",relevance:0},{cN:"meta",b:/^\s*\.[\w_-]+/}]}});hljs.registerLanguage("cpp",function(e){function t(e){return"(?:"+e+")?"}var r="decltype\\(auto\\)",a="[a-zA-Z_]\\w*::",i="("+r+"|"+t(a)+"[a-zA-Z_]\\w*"+t("<.*?>")+")",c={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},s={cN:"string",v:[{b:'(u8?|U|L)?"',e:'"',i:"\\n",c:[e.BE]},{b:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",e:"'",i:"."},{b:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/}]},n={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},o={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},c:[{b:/\\\n/,relevance:0},e.inherit(s,{cN:"meta-string"}),{cN:"meta-string",b:/<.*?>/,e:/$/,i:"\\n"},e.CLCM,e.CBCM]},l={cN:"title",b:t(a)+e.IR,relevance:0},u=t(a)+e.IR+"\\s*\\(",p={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},m=[c,e.CLCM,e.CBCM,n,s],d={v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:p,c:m.concat([{b:/\(/,e:/\)/,k:p,c:m.concat(["self"]),relevance:0}]),relevance:0},b={cN:"function",b:"("+i+"[\\*&\\s]+)+"+u,rB:!0,e:/[{;=]/,eE:!0,k:p,i:/[^\w\s\*&:<>]/,c:[{b:r,k:p,relevance:0},{b:u,rB:!0,c:[l],relevance:0},{cN:"params",b:/\(/,e:/\)/,k:p,relevance:0,c:[e.CLCM,e.CBCM,s,n,c,{b:/\(/,e:/\)/,k:p,relevance:0,c:["self",e.CLCM,e.CBCM,s,n,c]}]},c,e.CLCM,e.CBCM,o]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],k:p,i:"</",c:[].concat(d,b,m,[o,{b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:p,c:["self",c]},{b:e.IR+"::",k:p},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b:/</,e:/>/,c:["self"]},e.TM]}]),exports:{preprocessor:o,strings:s,k:p}}});hljs.registerLanguage("arduino",function(e){var t="boolean byte word String",r="setup loopKeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put",i="DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW",o=e.requireLanguage("cpp").rawDefinition(),a=o.k;return a.keyword+=" "+t,a.literal+=" "+i,a.built_in+=" "+r,o});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],relevance:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],relevance:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("xml",function(e){var c={cN:"symbol",b:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},s={b:"\\s",c:[{cN:"meta-keyword",b:"#?[a-z_][a-z1-9_-]+",i:"\\n"}]},a=e.inherit(s,{b:"\\(",e:"\\)"}),t=e.inherit(e.ASM,{cN:"meta-string"}),l=e.inherit(e.QSM,{cN:"meta-string"}),r={eW:!0,i:/</,relevance:0,c:[{cN:"attr",b:"[A-Za-z0-9\\._:-]+",relevance:0},{b:/=\s*/,relevance:0,c:[{cN:"string",endsParent:!0,v:[{b:/"/,e:/"/,c:[c]},{b:/'/,e:/'/,c:[c]},{b:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],cI:!0,c:[{cN:"meta",b:"<![a-z]",e:">",relevance:10,c:[s,l,t,a,{b:"\\[",e:"\\]",c:[{cN:"meta",b:"<![a-z]",e:">",c:[s,a,l,t]}]}]},e.C("\x3c!--","--\x3e",{relevance:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",relevance:10},c,{cN:"meta",b:/<\?xml/,e:/\?>/,relevance:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"<style(?=\\s|>)",e:">",k:{name:"style"},c:[r],starts:{e:"</style>",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"<script(?=\\s|>)",e:">",k:{name:"script"},c:[r],starts:{e:"<\/script>",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"name",b:/[^\/><\s]+/,relevance:0},r]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",relevance:0},{cN:"bullet",b:"^\\s*([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",relevance:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```\\w*\\s*$",e:"^```[ ]*$"},{b:"`.+?`"},{b:"^( {4}|\\t)",e:"$",relevance:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,relevance:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],relevance:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("properties",function(e){var r="[ \\t\\f]*",t="("+r+"[:=]"+r+"|[ \\t\\f]+)",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",c={e:t,relevance:0,starts:{cN:"string",e:/$/,relevance:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[e.C("^\\s*[!#]","$"),{b:n+t,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:"meta",b:a,endsParent:!0,relevance:0}],starts:c},{cN:"attr",relevance:0,b:a+r+"$"}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},a={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,relevance:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],relevance:0},e.HCM,a,{cN:"",b:/\\"/},{cN:"string",b:/'/,e:/'/},t]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer expose env arg user onbuild stopsignal",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{e:/[^\\]$/,sL:"bash"}}],i:"</"}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={b:/\{\{/,relevance:0},l={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],relevance:10},{b:/(u|b)?r?"""/,e:/"""/,c:[e.BE,b],relevance:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,a,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[e.BE,b,a,c]},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)"/,e:/"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a,c]},{b:/(fr|rf|f)"/,e:/"/,c:[e.BE,a,c]},e.ASM,e.QSM]},n={cN:"number",relevance:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,n,l,e.HCM]};return c.c=[l,n,b],{aliases:["py","gyp","ipython"],k:r,i:/(<\/|->|\?)|=>/,c:[b,n,{bK:"if",relevance:0},l,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("ini",function(e){var b={cN:"number",relevance:0,v:[{b:/([\+\-]+)?[\d]+_[\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},r={cN:"literal",b:/\bon|off|true|false|yes|no\b/},n={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",relevance:10},{b:'"""',e:'"""',relevance:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[a,{cN:"section",b:/\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_\.-]+(?=\s*=\s*)/,cN:"attr",starts:{e:/$/,c:[a,{b:/\[/,e:/\]/,c:[a,r,c,n,b,"self"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",relevance:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/^\*{15}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",relevance:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},c:[{cN:"string",b:"'",e:"'",c:[{b:"''"}]},{cN:"string",b:'"',e:'"',c:[{b:'""'}]},{cN:"string",b:"`",e:"`"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage("vala",function(e){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object Gtk Posix",literal:"false true null"},c:[{cN:"class",bK:"class interface namespace",e:"{",eE:!0,i:"[^,:\\n\\s\\.]",c:[e.UTM]},e.CLCM,e.CBCM,{cN:"string",b:'"""',e:'"""',relevance:5},e.ASM,e.QSM,e.CNM,{cN:"meta",b:"^#",e:"$",relevance:2}]}});hljs.registerLanguage("asciidoc",function(e){return{aliases:["adoc"],c:[e.C("^/{4,}\\n","\\n/{4,}$",{relevance:10}),e.C("^//","$",{relevance:0}),{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",relevance:10},{cN:"section",relevance:10,v:[{b:"^(={1,5}) .+?( \\1)?$"},{b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{cN:"meta",b:"^:.+?:",e:"\\s",eE:!0,relevance:10},{cN:"meta",b:"^\\[.+?\\]$",relevance:0},{cN:"quote",b:"^_{4,}\\n",e:"\\n_{4,}$",relevance:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",relevance:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",relevance:0}],relevance:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",relevance:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",relevance:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",relevance:0}],relevance:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",relevance:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",relevance:0},{cN:"code",b:"^[ \\t]",e:"$",relevance:0},{b:"^'{3,}[ \\t]*$",relevance:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",relevance:0},{cN:"link",b:"\\w",e:"[^\\[]+",relevance:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:c,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})].concat(n),i:"\\S"},a={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:"\\S"}});hljs.registerLanguage("rust",function(e){var t="([ui](8|16|32|64|128|size)|f(32|64))?",r="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{aliases:["rs"],k:{keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:r},l:e.IR+"!?",i:"</",c:[e.CLCM,e.C("/\\*","\\*/",{c:["self"]}),e.inherit(e.QSM,{b:/b?"/,i:null}),{cN:"string",v:[{b:/r(#*)"(.|\n)*?"\1(?!#)/},{b:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{cN:"symbol",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:"number",v:[{b:"\\b0b([01_]+)"+t},{b:"\\b0o([0-7_]+)"+t},{b:"\\b0x([A-Fa-f0-9_]+)"+t},{b:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+t}],relevance:0},{cN:"function",bK:"fn",e:"(\\(|<)",eE:!0,c:[e.UTM]},{cN:"meta",b:"#\\!?\\[",e:"\\]",c:[{cN:"meta-string",b:/"/,e:/"/}]},{cN:"class",bK:"type",e:";",c:[e.inherit(e.UTM,{endsParent:!0})],i:"\\S"},{cN:"class",bK:"trait enum struct union",e:"{",c:[e.inherit(e.UTM,{endsParent:!0})],i:"[\\w\\d]"},{b:e.IR+"::",k:{built_in:r}},{b:"->"}]}});hljs.registerLanguage("awk",function(e){return{k:{keyword:"BEGIN END if else while do for in break continue delete next nextfile function func exit|10"},c:[{cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},{cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,relevance:10},{b:/(u|b)?r?"""/,e:/"""/,relevance:10},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)"/,e:/"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}});hljs.registerLanguage("java",function(e){var a="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",t={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{relevance:0,c:[{b:/\w+@/,relevance:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",relevance:0},{cN:"function",b:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,relevance:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("cs",function(e){var a={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},c={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},r=e.inherit(c,{i:/\n/}),n={cN:"subst",b:"{",e:"}",k:a},t=e.inherit(n,{i:/\n/}),s={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,t]},l={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},n]},b=e.inherit(l,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},t]});n.c=[l,s,c,e.ASM,e.QSM,i,e.CBCM],t.c=[b,s,r,e.ASM,e.QSM,i,e.inherit(e.CBCM,{i:/\n/})];var o={v:[l,s,c,e.ASM,e.QSM]},d=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp","c#"],k:a,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",relevance:0},{b:"\x3c!--|--\x3e"},{b:"</?",e:">"}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},o,i,{bK:"class interface",e:/[{;=]/,i:/[^\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",relevance:0},{cN:"function",b:"("+d+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/\s*[{;=]/,eE:!0,k:a,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],relevance:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:a,relevance:0,c:[o,i,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("mathematica",function(e){return{aliases:["mma","wl"],l:"(\\$|\\b)"+e.IR+"\\b",k:"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID",c:[e.C("\\(\\*","\\*\\)",{c:["self"]}),e.QSM,e.CNM]}});hljs.registerLanguage("vim",function(e){return{l:/[!#@\w]+/,k:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",built_in:"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp"},i:/;/,c:[e.NM,{cN:"string",b:"'",e:"'",i:"\\n"},{cN:"string",b:/"(\\"|\n\\|[^"\n])*"/},e.C('"',"$"),{cN:"variable",b:/[bwtglsav]:[\w\d_]*/},{cN:"function",bK:"function function!",e:"$",relevance:0,c:[e.TM,{cN:"params",b:"\\(",e:"\\)"}]},{cN:"symbol",b:/<[\w-]+>/}]}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%<?\^\+\*]/}]},r={cN:"string",b:/"/,e:/"/,c:[e.BE,i]},a={cN:"variable",b:/\$\([\w-]+\s/,e:/\)/,k:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},c:[i]},n={b:"^"+e.UIR+"\\s*(?=[:+?]?=)"},t={cN:"section",b:/^[^\s]+:/,e:/$/,c:[i]};return{aliases:["mk","mak"],k:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath",l:/[\w-]+/,c:[e.HCM,i,r,a,n,{cN:"meta",b:/^\.PHONY:/,e:/$/,k:{"meta-keyword":".PHONY"},l:/[\.\w]+/},t]}});hljs.registerLanguage("objectivec",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,i="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:{keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},l:t,i:"</",c:[{cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.CLCM,e.CBCM,e.CNM,e.QSM,e.ASM,{cN:"string",v:[{b:'@"',e:'"',i:"\\n",c:[e.BE]}]},{cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,relevance:0},e.inherit(e.QSM,{cN:"meta-string"}),{cN:"meta-string",b:/<.*?>/,e:/$/,i:"\\n"},e.CLCM,e.CBCM]},{cN:"class",b:"("+i.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:i,l:t,c:[e.UTM]},{b:"\\."+e.UIR,relevance:0}]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",n={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},a=e.C("%","$"),b={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",relevance:0},i={b:"fun\\s+"+r+"/\\d+"},l={b:c+"\\(",e:"\\)",rB:!0,relevance:0,c:[{b:c,relevance:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,relevance:0}]},d={b:"{",e:"}",relevance:0},o={b:"\\b_([A-Z][A-Za-z0-9_]*)?",relevance:0},t={b:"[A-Z][a-zA-Z0-9_]*",relevance:0},v={b:"#"+e.UIR,relevance:0,rB:!0,c:[{b:"#"+e.UIR,relevance:0},{b:"{",e:"}",relevance:0}]},f={bK:"fun receive if try case",e:"end",k:n};f.c=[a,i,e.inherit(e.ASM,{cN:""}),f,l,e.QSM,b,d,o,t,v];var s=[a,i,f,l,e.QSM,b,d,o,t,v];l.c[1].c=s,d.c=s;var u={cN:"params",b:"\\(",e:"\\)",c:v.c[1].c=s};return{aliases:["erl"],k:n,i:"(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+r+"\\s*\\(",e:"->",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[u,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:n,c:s}},a,{b:"^-",e:"\\.",relevance:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[u]},b,e.QSM,v,o,t,d,{b:/\.$/}]}});hljs.registerLanguage("powershell",function(e){var t={keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter"},n={b:"`[\\s\\S]",relevance:0},c={cN:"variable",v:[{b:/\$\B/},{cN:"keyword",b:/\$this/},{b:/\$[\w\d][\w\d_:]*/}]},i={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[n,c,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},a={cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},r=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),o={cN:"built_in",v:[{b:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|New|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},l={cN:"class",bK:"class enum",e:/\s*[{]/,eE:!0,relevance:0,c:[e.TM]},s={cN:"function",b:/function\s+/,e:/\s*\{|$/,eE:!0,rB:!0,relevance:0,c:[{b:"function",relevance:0,cN:"keyword"},{cN:"title",b:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{b:/\(/,e:/\)/,cN:"params",relevance:0,c:[c]}]},p={b:/using\s/,e:/$/,rB:!0,c:[i,a,{cN:"keyword",b:/(using|assembly|command|module|namespace|type)/}]},b={v:[{cN:"operator",b:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{cN:"literal",b:/(-)[\w\d]+/,relevance:0}]},d={cN:"function",b:/\[.*\]\s*[\w]+[ ]??\(/,e:/$/,rB:!0,relevance:0,c:[{cN:"keyword",b:"(".concat(t.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},e.inherit(e.TM,{endsParent:!0})]},u=[d,r,n,e.NM,i,a,o,c,{cN:"literal",b:/\$(null|true|false)\b/},{cN:"selector-tag",b:/\@\B/,relevance:0}],m={b:/\[/,e:/\]/,eB:!0,eE:!0,relevance:0,c:[].concat("self",u,{b:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",cN:"built_in",relevance:0},{cN:"type",b:/[\.\w\d]+/,relevance:0})};return d.c.unshift(m),{aliases:["ps","ps1"],l:/-?[A-z\.\-]+/,cI:!0,k:t,c:u.concat(l,s,p,b,m)}});hljs.registerLanguage("typescript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise"},n={cN:"meta",b:"@"+r},a={b:"\\(",e:/\)/,k:t,c:["self",e.QSM,e.ASM,e.NM]},c={cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]},s={cN:"number",v:[{b:"\\b(0[bB][01]+)n?"},{b:"\\b(0[oO][0-7]+)n?"},{b:e.CNR+"n?"}],relevance:0},o={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},i={b:"html`",e:"",starts:{e:"`",rE:!1,c:[e.BE,o],sL:"xml"}},l={b:"css`",e:"",starts:{e:"`",rE:!1,c:[e.BE,o],sL:"css"}},b={cN:"string",b:"`",e:"`",c:[e.BE,o]};return o.c=[e.ASM,e.QSM,i,l,b,s,e.RM],{aliases:["ts"],k:t,c:[{cN:"meta",b:/^\s*['"]use strict['"]/},e.ASM,e.QSM,i,l,b,e.CLCM,e.CBCM,s,{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+e.IR+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:e.IR},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:["self",e.CLCM,e.CBCM]}]}]}],relevance:0},{cN:"function",bK:"function",e:/[\{;]/,eE:!0,k:t,c:["self",e.inherit(e.TM,{b:r}),c],i:/%/,relevance:0},{bK:"constructor",e:/[\{;]/,eE:!0,c:["self",c]},{b:/module\./,k:{built_in:"module"},relevance:0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,relevance:0},n,a]}});hljs.registerLanguage("fortran",function(e){return{cI:!0,aliases:["f90","f95"],k:{literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then block endblock public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data",built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image"},i:/\/\*/,c:[e.inherit(e.ASM,{cN:"string",relevance:0}),e.inherit(e.QSM,{cN:"string",relevance:0}),{cN:"function",bK:"subroutine function program",i:"[${=\\n]",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)"}]},e.C("!","$",{relevance:0}),{cN:"number",b:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",relevance:0}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php","php3","php4","php5","php6","php7"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("haskell",function(e){var i={v:[e.C("--","$"),e.C("{-","-}",{c:["self"]})]},a={cN:"meta",b:"{-#",e:"#-}"},l={cN:"meta",b:"^#",e:"$"},c={cN:"type",b:"\\b[A-Z][\\w']*",relevance:0},n={b:"\\(",e:"\\)",i:'"',c:[a,l,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TM,{b:"[_a-z][\\w']*"}),i]};return{aliases:["hs"],k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{bK:"module",e:"where",k:"module where",c:[n,i],i:"\\W\\.|;"},{b:"\\bimport\\b",e:"$",k:"import qualified as hiding",c:[n,i],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[c,n,i]},{cN:"class",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[a,c,n,{b:"{",e:"}",c:n.c},i]},{bK:"default",e:"$",c:[c,n,i]},{bK:"infix infixl infixr",e:"$",c:[e.CNM,i]},{b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[c,e.QSM,i]},{cN:"meta",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:"^[_a-z][\\w']*"}),i,{b:"->|<-"}]}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",relevance:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]{0,3}(?=\\W)",relevance:0},{b:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{b:"@"+n},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",a={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,a]},{b:/[:\(,=]\s*/,relevance:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[a]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,relevance:0}])}});hljs.registerLanguage("r",function(e){var r="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[e.HCM,{b:r,l:r,k:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{b:"`",e:"`",relevance:0},{cN:"string",c:[e.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("autohotkey",function(e){var a={b:"`[\\s\\S]"};return{cI:!0,aliases:["ahk"],k:{keyword:"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group",literal:"true false NOT AND OR",built_in:"ComSpec Clipboard ClipboardAll ErrorLevel"},c:[a,e.inherit(e.QSM,{c:[a]}),e.C(";","$",{relevance:0}),e.CBCM,{cN:"number",b:e.NR,relevance:0},{cN:"variable",b:"%[a-zA-Z0-9#_$@]+%"},{cN:"built_in",b:"^\\s*\\w+\\s*(,|%)"},{cN:"title",v:[{b:'^[^\\n";]+::(?!=)'},{b:'^[^\\n";]+:(?!=)',relevance:0}]},{cN:"meta",b:"^\\s*#\\w+",e:"$",relevance:0},{cN:"built_in",b:"A_[a-zA-Z0-9]+"},{b:",\\s*,"}]}});hljs.registerLanguage("elixir",function(e){var b="[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?",c="and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0",n={cN:"subst",b:"#\\{",e:"}",l:b,k:c},r="[/|([{<\"']",a={cN:"string",b:"~[a-z](?="+r+")",c:[{endsParent:!0,c:[{c:[e.BE,n],v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/\//,e:/\//},{b:/\|/,e:/\|/},{b:/\(/,e:/\)/},{b:/\[/,e:/\]/},{b:/\{/,e:/\}/},{b:/</,e:/>/}]}]}]},i={cN:"string",b:"~[A-Z](?="+r+")",c:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/\//,e:/\//},{b:/\|/,e:/\|/},{b:/\(/,e:/\)/},{b:/\[/,e:/\]/},{b:/\{/,e:/\}/},{b:/\</,e:/\>/}]},l={cN:"string",c:[e.BE,n],v:[{b:/"""/,e:/"""/},{b:/'''/,e:/'''/},{b:/~S"""/,e:/"""/,c:[]},{b:/~S"/,e:/"/,c:[]},{b:/~S'''/,e:/'''/,c:[]},{b:/~S'/,e:/'/,c:[]},{b:/'/,e:/'/},{b:/"/,e:/"/}]},s={cN:"function",bK:"def defp defmacro",e:/\B\b/,c:[e.inherit(e.TM,{b:b,endsParent:!0})]},t=e.inherit(s,{cN:"class",bK:"defimpl defmodule defprotocol defrecord",e:/\bdo\b|$|;/}),d=[l,i,a,e.HCM,t,s,{b:"::"},{cN:"symbol",b:":(?![\\s:])",c:[l,{b:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}],relevance:0},{cN:"symbol",b:b+":(?!:)",relevance:0},{cN:"number",b:"(\\b0o[0-7_]+)|(\\b0b[01_]+)|(\\b0x[0-9a-fA-F_]+)|(-?\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)",relevance:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"->"},{b:"("+e.RSR+")\\s*",c:[e.HCM,{cN:"regexp",i:"\\n",c:[e.BE,n],v:[{b:"/",e:"/[a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],relevance:0}];return{l:b,k:c,c:n.c=d}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("css",function(e){var c={b:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$",c:[e.ASM,e.QSM]},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(page|font-face)",l:"@[a-z-]+",k:"@page @font-face"},{b:"@",e:"[{;]",i:/:/,rB:!0,c:[{cN:"keyword",b:/@\-?\w[\w]*(\-\w+)*/},{b:/\s/,eW:!0,eE:!0,relevance:0,k:"and or not only",c:[{b:/[a-z-]+:/,cN:"attribute"},e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,c]}]}}); diff --git a/plugins/tiddlywiki/highlight/readme.tid b/plugins/tiddlywiki/highlight/readme.tid index 0b5c490d4..c621bab45 100644 --- a/plugins/tiddlywiki/highlight/readme.tid +++ b/plugins/tiddlywiki/highlight/readme.tid @@ -50,6 +50,8 @@ The plugin includes support for the following languages (referred to as "brushes * javascript * json * kotlin +* less +* lua * makefile * markdown * mathematica @@ -58,13 +60,20 @@ The plugin includes support for the following languages (referred to as "brushes * objectivec * perl * php +* plaintext * powershell +* properties * python * R * ruby * rust +* scss +* shell session * sql +* swift +* toml * typescript +* vala * vim script * xml * yaml From f3ac25585552a5aa79c8ec92d9fd496e1fbece8b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 14 Mar 2020 14:10:39 +0100 Subject: [PATCH 0526/2376] Update GruvBoxDark.tid (#4501) --- core/palettes/GruvBoxDark.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index 4edee6557..a3a43d3ff 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -100,7 +100,7 @@ tiddler-controls-foreground: #665c54 tiddler-editor-background: #282828 tiddler-editor-border-image: #282828 tiddler-editor-border: #282828 -tiddler-editor-fields-even: #504945 +tiddler-editor-fields-even: #7c6f64 tiddler-editor-fields-odd: #665c45 tiddler-info-background: #32302f tiddler-info-border: #ebdbb2 From fa48a592daab1a4d04ca2fc3b570480adf92f6f0 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 14 Mar 2020 17:03:40 +0000 Subject: [PATCH 0527/2376] Menubar: Fix links in sidebar "open" tab Fixes @BurningTreeC's report https://github.com/Jermolene/TiddlyWiki5/commit/061a2c6c948e227525416b79ac0ef757c80c0116#commitcomment-37826117 --- plugins/tiddlywiki/menubar/menu.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/tiddlywiki/menubar/menu.tid b/plugins/tiddlywiki/menubar/menu.tid index 58f8ce80c..caaeec0e2 100644 --- a/plugins/tiddlywiki/menubar/menu.tid +++ b/plugins/tiddlywiki/menubar/menu.tid @@ -44,6 +44,7 @@ tags: $:/tags/PageTemplate <$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]limit[1]]" variable="listItem"> <nav class="tc-menubar tc-adjust-top-of-scroll"> +<$scrollable fallthrough="none"> <div class="tc-menubar-narrow"> <<menubar-inner narrow>> </div> @@ -64,5 +65,6 @@ tags: $:/tags/PageTemplate </$set> </$list> </$list> +</$scrollable> </nav> </$list> From e67485ec54b3432e60980b22c7228daca15e88f7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 14 Mar 2020 18:16:38 +0100 Subject: [PATCH 0528/2376] Highlight Plugin: Update readme to reflect version change (#4503) --- plugins/tiddlywiki/highlight/readme.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/highlight/readme.tid b/plugins/tiddlywiki/highlight/readme.tid index c621bab45..8ac2240cd 100644 --- a/plugins/tiddlywiki/highlight/readme.tid +++ b/plugins/tiddlywiki/highlight/readme.tid @@ -1,6 +1,6 @@ title: $:/plugins/tiddlywiki/highlight/readme -This plugin provides syntax highlighting of code blocks using v9.15.6 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev. +This plugin provides syntax highlighting of code blocks using v9.18.1 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev. ! Usage From a6f6db40d9b894370653fb44ff5ab8fe798e4d53 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 15 Mar 2020 14:23:10 +0000 Subject: [PATCH 0529/2376] Revert "Fix test for needing to update text editor DOM" This reverts commit a65ec87c53fceee69dac87d1051b46ebb7aaaf75. --- core/modules/editor/engines/framed.js | 2 +- core/modules/editor/engines/simple.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index d792309ed..6e7da24da 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -106,7 +106,7 @@ Set the text of the engine if it doesn't currently have focus */ FramedEngine.prototype.setText = function(text,type) { if(!this.domNode.isTiddlyWikiFakeDom) { - if(this.domNode.value !== text) { + if(this.domNode.ownerDocument.activeElement !== this.domNode) { this.domNode.value = text; } // Fix the height if needed diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index b94934810..bb77893d7 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -67,7 +67,7 @@ Set the text of the engine if it doesn't currently have focus */ SimpleEngine.prototype.setText = function(text,type) { if(!this.domNode.isTiddlyWikiFakeDom) { - if(this.domNode.value !== text) { + if(this.domNode.ownerDocument.activeElement !== this.domNode || text === "") { this.domNode.value = text; } // Fix the height if needed From bc687e57834efa312cca126af222613ef241c585 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 15 Mar 2020 14:46:33 +0000 Subject: [PATCH 0530/2376] Add a hidden setting for disabling the page dropzone --- core/modules/widgets/dropzone.js | 24 ++++++++++++------- core/ui/PageTemplate.tid | 2 +- .../Hidden Setting_ Disable Page Dropzone.tid | 9 +++++++ .../tiddlers/widgets/DropzoneWidget.tid | 3 ++- 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index c4cb36262..794cff535 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -37,14 +37,16 @@ DropZoneWidget.prototype.render = function(parent,nextSibling) { var domNode = this.document.createElement("div"); domNode.className = "tc-dropzone"; // Add event handlers - $tw.utils.addEventListeners(domNode,[ - {name: "dragenter", handlerObject: this, handlerMethod: "handleDragEnterEvent"}, - {name: "dragover", handlerObject: this, handlerMethod: "handleDragOverEvent"}, - {name: "dragleave", handlerObject: this, handlerMethod: "handleDragLeaveEvent"}, - {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"}, - {name: "paste", handlerObject: this, handlerMethod: "handlePasteEvent"}, - {name: "dragend", handlerObject: this, handlerMethod: "handleDragEndEvent"} - ]); + if(this.dropzoneEnable) { + $tw.utils.addEventListeners(domNode,[ + {name: "dragenter", handlerObject: this, handlerMethod: "handleDragEnterEvent"}, + {name: "dragover", handlerObject: this, handlerMethod: "handleDragOverEvent"}, + {name: "dragleave", handlerObject: this, handlerMethod: "handleDragLeaveEvent"}, + {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"}, + {name: "paste", handlerObject: this, handlerMethod: "handlePasteEvent"}, + {name: "dragend", handlerObject: this, handlerMethod: "handleDragEndEvent"} + ]); + } domNode.addEventListener("click",function (event) { },false); // Insert element @@ -189,6 +191,7 @@ Compute the internal state of the widget */ DropZoneWidget.prototype.execute = function() { this.dropzoneDeserializer = this.getAttribute("deserializer"); + this.dropzoneEnable = (this.getAttribute("enable") || "yes") === "yes"; // Make child widgets this.makeChildWidgets(); }; @@ -197,6 +200,11 @@ DropZoneWidget.prototype.execute = function() { Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ DropZoneWidget.prototype.refresh = function(changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if(changedAttributes.enable) { + this.refreshSelf(); + return true; + } return this.refreshChildren(changedTiddlers); }; diff --git a/core/ui/PageTemplate.tid b/core/ui/PageTemplate.tid index ecf719f34..590741d9a 100644 --- a/core/ui/PageTemplate.tid +++ b/core/ui/PageTemplate.tid @@ -22,7 +22,7 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ <$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}> -<$dropzone> +<$dropzone enable={{$:/config/PageDropzone/Enable}}> <$list filter="[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]" variable="listItem"> diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid new file mode 100644 index 000000000..56ddd23f6 --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid @@ -0,0 +1,9 @@ +created: 20200315143638556 +modified: 20200315143638556 +tags: [[Hidden Settings]] +title: Hidden Setting: Disable Page Dropzone +type: text/vnd.tiddlywiki + +To disable the main DropzoneWidget, set the following tiddler to "no": + +$:/config/PageDropzone/Enable diff --git a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid index 48fcb9b7d..082feea95 100644 --- a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid @@ -1,6 +1,6 @@ caption: dropzone created: 20131024141900000 -modified: 20170712153850528 +modified: 20200315144454996 tags: Widgets title: DropzoneWidget type: text/vnd.tiddlywiki @@ -15,6 +15,7 @@ It sends a [[WidgetMessage: tm-import-tiddlers]] carrying a JSON representation |!Attribute |!Description | |deserializer |<<.from-version "5.1.15">> Optional name of deserializer to be used (by default the deserializer is derived from the file extension) | +|enable |<<.from-version "5.1.22">> Optional value "no" to disable the dropzone functionality (defaults to "yes") | The list of available deserializers can be inspected by executing `Object.keys($tw.Wiki.tiddlerDeserializerModules).sort().join("\n")` in the browser JavaScript console. From 8f12717935e035a1654680bff57cbe4b99493e87 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 16 Mar 2020 09:11:08 +0000 Subject: [PATCH 0531/2376] Menu bar: Fix search result visibility Fixes #4509 --- plugins/tiddlywiki/menubar/items/sidebar.tid | 4 ++-- plugins/tiddlywiki/menubar/menu.tid | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/tiddlywiki/menubar/items/sidebar.tid b/plugins/tiddlywiki/menubar/items/sidebar.tid index 3651883f1..616195a6a 100644 --- a/plugins/tiddlywiki/menubar/items/sidebar.tid +++ b/plugins/tiddlywiki/menubar/items/sidebar.tid @@ -4,8 +4,8 @@ description: Sidebar is-dropdown: yes tags: $:/tags/MenuBar -<div class="tc-popup-keep tc-menubar-dropdown-sidebar"> +<$scrollable fallthrough="none" class="tc-popup-keep tc-menubar-dropdown-sidebar"> <$transclude tiddler="$:/core/ui/SideBarSegments/tabs" mode="inline"/> -</div> +</$scrollable> diff --git a/plugins/tiddlywiki/menubar/menu.tid b/plugins/tiddlywiki/menubar/menu.tid index caaeec0e2..58f8ce80c 100644 --- a/plugins/tiddlywiki/menubar/menu.tid +++ b/plugins/tiddlywiki/menubar/menu.tid @@ -44,7 +44,6 @@ tags: $:/tags/PageTemplate <$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]limit[1]]" variable="listItem"> <nav class="tc-menubar tc-adjust-top-of-scroll"> -<$scrollable fallthrough="none"> <div class="tc-menubar-narrow"> <<menubar-inner narrow>> </div> @@ -65,6 +64,5 @@ tags: $:/tags/PageTemplate </$set> </$list> </$list> -</$scrollable> </nav> </$list> From c6b109fbde6f1a57859adedd91a1b39ab5f3a3e7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 16 Mar 2020 10:12:35 +0100 Subject: [PATCH 0532/2376] Update GruvBoxDark.tid (#4510) better readability, was wrong the first time --- core/palettes/GruvBoxDark.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index a3a43d3ff..1c334e5d4 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -100,8 +100,8 @@ tiddler-controls-foreground: #665c54 tiddler-editor-background: #282828 tiddler-editor-border-image: #282828 tiddler-editor-border: #282828 -tiddler-editor-fields-even: #7c6f64 -tiddler-editor-fields-odd: #665c45 +tiddler-editor-fields-even: #504945 +tiddler-editor-fields-odd: #7c6f64 tiddler-info-background: #32302f tiddler-info-border: #ebdbb2 tiddler-info-tab-background: #ebdbb2 From 33fb4f5c0d45e1bd48210629a2eb788f1e1950a6 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Mon, 16 Mar 2020 17:14:15 +0800 Subject: [PATCH 0533/2376] Fix the index names of chinese translations for Gitea saver in ControlPanel.multids (#4506) --- languages/zh-Hans/ControlPanel.multids | 4 ++-- languages/zh-Hant/ControlPanel.multids | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 74ec640a9..0ff2c7a1c 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -108,8 +108,8 @@ Saving/GitService/GitHub/Caption: ~GitHub 保存模块 Saving/GitService/GitHub/Password: 密码、OAUTH 令牌,或个人存取令牌 (详见 [[GitHub 帮助页面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) Saving/GitService/GitLab/Caption: ~GitLab 保存模块 Saving/GitService/GitLab/Password: 个人存取令牌的 API (详见 [[GitLab 帮助页面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]]) -Saving/GitService/gitea/Caption: Gitea 保存模块 -Saving/GitService/gitea/Password: 个人存取令牌的 API (通过 Gitea 的 Web 界面:`设定 | 应用程序 | 产生新的令牌`) +Saving/GitService/Gitea/Caption: Gitea 保存模块 +Saving/GitService/Gitea/Password: 个人存取令牌的 API (通过 Gitea 的 Web 界面:`设定 | 应用程序 | 产生新的令牌`) Saving/TiddlySpot/Advanced/Heading: 高级设置 Saving/TiddlySpot/BackupDir: 备份文件夹 Saving/TiddlySpot/Backups: 备份 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 6be055c3b..76c98d6fb 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -108,8 +108,8 @@ Saving/GitService/GitHub/Caption: ~GitHub 儲存模組 Saving/GitService/GitHub/Password: 密碼、OAUTH 權杖,或個人存取權杖 (詳見 [[GitHub 說明頁面|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]]) Saving/GitService/GitLab/Caption: ~GitLab 儲存模組 Saving/GitService/GitLab/Password: 個人存取權杖的 API (詳見 [[GitLab 說明頁面|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]]) -Saving/GitService/gitea/Caption: Gitea 儲存模組 -Saving/GitService/gitea/Password: 個人存取權杖的 API (通過 Gitea 的 Web 介面:`設定 | 應用程式 | 產生新的權杖`) +Saving/GitService/Gitea/Caption: Gitea 儲存模組 +Saving/GitService/Gitea/Password: 個人存取權杖的 API (通過 Gitea 的 Web 介面:`設定 | 應用程式 | 產生新的權杖`) Saving/TiddlySpot/Advanced/Heading: 進階設定 Saving/TiddlySpot/BackupDir: 備份資料夾 Saving/TiddlySpot/Backups: 備份 From c16c2fe5e67cb10d4b0a2834899149c13232485a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 18 Mar 2020 11:57:58 +0000 Subject: [PATCH 0534/2376] Docs: Clarify Node.js docs --- .../tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid index 6966debcc..3175791e9 100644 --- a/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/TiddlyWiki on Node.js.tid @@ -1,5 +1,5 @@ created: 20131129094353704 -modified: 20191022095309607 +modified: 20200318115527226 tags: Platforms title: TiddlyWiki on Node.js type: text/vnd.tiddlywiki @@ -10,11 +10,7 @@ Running TiddlyWiki on [[Node.js]] brings several important benefits over and abo * Individual tiddlers are stored in separate files, which you can organise as you wish * The ability to build multiple wikis that blend different combinations of shared and unique content -There are a few file system limitations you should be aware of that are related to how TiddlyWiki was designed: - -* The best, most general way to interact with a running wiki is via the HTTP or JavaScript API, rather than manipulating the file store directly -* Any modification to the contents of the wiki folder (e.g. images) might thus sometimes require that your restart the node.js server -* TiddlyWiki might support manipulating the file store directly in the future +<<.warning """Note that TiddlyWiki on Node.js doesn't currently support directly modifying the tiddler files via the file system while it is running. The server must be restarted in order to for changes to take effect. The recommended way to interact with a running wiki is via the HTTP or JavaScript APIs.""">> For more information see: From 561662782e99adba98e3e6d33781f3733a34e5ac Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 19 Mar 2020 16:32:51 -0400 Subject: [PATCH 0535/2376] Fixes issue with #4504 and importvariable copying (#4518) * Fixes issue with #4504 and importvariable copying ImportVariables widget was using $tw.utils.extend to copy the variables from temporary set widgets into itself. However, $tw.utils.extend does NOT behave like Object.assign. It not only copies all self-owned variables over, but also all variables in that object's prototype chain. This led to some redundant copying, and a problem where some variables might show up more than once (like transclusion). Fixed now. importvariables widget does its own copying, since it can't rely on $tw.utils.extend to do the right job, and it can't count on Object.assign to be there. * Added test to prevent reversion of #4504 * Slight corrections to new importvariables test --- core/modules/widgets/importvariables.js | 9 +++++- editions/test/tiddlers/tests/test-widget.js | 32 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/importvariables.js b/core/modules/widgets/importvariables.js index e720dc07b..3ea1d1174 100644 --- a/core/modules/widgets/importvariables.js +++ b/core/modules/widgets/importvariables.js @@ -61,7 +61,14 @@ ImportVariablesWidget.prototype.execute = function(tiddlerList) { var widget = widgetPointer.makeChildWidget(node); widget.computeAttributes(); widget.execute(); - $tw.utils.extend(widgetPointer.variables,widget.variables); + // We SHALLOW copy over all variables + // in widget. We can't use + // $tw.utils.assign, because that copies + // up the prototype chain, which we + // don't want. + $tw.utils.each(Object.keys(widget.variables), function(key) { + widgetPointer.variables[key] = widget.variables[key]; + }); } else { widgetPointer.makeChildWidgets([node]); widgetPointer = widgetPointer.children[0]; diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index 5983b97dd..c20305746 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -517,6 +517,38 @@ describe("Widget module", function() { // Test the rendering expect(wrapper.innerHTML).toBe("<p>Don't forget me.</p>"); }); + + /** This test reproduces issue #4504. + * + * The importvariable widget was creating redundant copies into + * itself of variables in widgets higher up in the tree. Normally, + * this caused no errors, but it would mess up qualify-macros. + * They would find multiple instances of the same transclusion + * variable if a transclusion occured higher up in the widget tree + * than an importvariables AND that importvariables was importing + * at least ONE variable. + */ + it("adding imported variables doesn't change qualifyers", function() { + var wiki = new $tw.Wiki(); + function wikiparse(text) { + var tree = parseText(text,wiki); + var widgetNode = createWidgetNode(tree,wiki); + var wrapper = renderWidgetNode(widgetNode); + return wrapper.innerHTML; + }; + wiki.addTiddlers([ + {title: "body", text: "\\import A\n<<qualify this>>"}, + {title: "A", text: "\\define unused() ignored"} + ]); + // This transclude wraps "body", which has an + // importvariable widget in it. + var withA = wikiparse("{{body}}"); + wiki.addTiddler({title: "A", text: ""}); + var withoutA = wikiparse("{{body}}"); + // Importing two different version of "A" shouldn't cause + // the <<qualify>> widget to spit out something different. + expect(withA).toBe(withoutA); + }); }); })(); From cb52d709c2177561a0de8fc808ae2f8f6853a011 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 20 Mar 2020 10:46:17 +0000 Subject: [PATCH 0536/2376] Improve ability to disable drag and drop Now we disable the draggable list macros too. --- core/modules/widgets/droppable.js | 17 ++++++++++------- core/ui/PageTemplate.tid | 6 +++++- core/ui/SideBar/Open.tid | 2 +- core/wiki/macros/list.tid | 8 ++++---- .../Hidden Setting_ Disable Drag and Drop.tid | 19 +++++++++++++++++++ .../Hidden Setting_ Disable Page Dropzone.tid | 9 --------- .../tiddlers/widgets/DroppableWidget.tid | 3 ++- 7 files changed, 41 insertions(+), 23 deletions(-) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid delete mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid diff --git a/core/modules/widgets/droppable.js b/core/modules/widgets/droppable.js index dabb4c259..cf90d2f77 100644 --- a/core/modules/widgets/droppable.js +++ b/core/modules/widgets/droppable.js @@ -43,12 +43,14 @@ DroppableWidget.prototype.render = function(parent,nextSibling) { classes.push("tc-droppable"); domNode.className = classes.join(" "); // Add event handlers - $tw.utils.addEventListeners(domNode,[ - {name: "dragenter", handlerObject: this, handlerMethod: "handleDragEnterEvent"}, - {name: "dragover", handlerObject: this, handlerMethod: "handleDragOverEvent"}, - {name: "dragleave", handlerObject: this, handlerMethod: "handleDragLeaveEvent"}, - {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"} - ]); + if(this.droppableEnable) { + $tw.utils.addEventListeners(domNode,[ + {name: "dragenter", handlerObject: this, handlerMethod: "handleDragEnterEvent"}, + {name: "dragover", handlerObject: this, handlerMethod: "handleDragOverEvent"}, + {name: "dragleave", handlerObject: this, handlerMethod: "handleDragLeaveEvent"}, + {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"} + ]); + } // Insert element parent.insertBefore(domNode,nextSibling); this.renderChildren(domNode,null); @@ -142,6 +144,7 @@ DroppableWidget.prototype.execute = function() { this.droppableEffect = this.getAttribute("effect","copy"); this.droppableTag = this.getAttribute("tag"); this.droppableClass = this.getAttribute("class"); + this.droppableEnable = (this.getAttribute("enable") || "yes") === "yes"; // Make child widgets this.makeChildWidgets(); }; @@ -151,7 +154,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ DroppableWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes["class"] || changedAttributes.tag) { + if(changedAttributes["class"] || changedAttributes.tag || changedAttributes.enable) { this.refreshSelf(); return true; } diff --git a/core/ui/PageTemplate.tid b/core/ui/PageTemplate.tid index 590741d9a..ccb560c69 100644 --- a/core/ui/PageTemplate.tid +++ b/core/ui/PageTemplate.tid @@ -12,6 +12,8 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ <$set name="tv-config-toolbar-class" value={{$:/config/Toolbar/ButtonClass}}> +<$set name="tv-enable-drag-and-drop" value={{$:/config/DragAndDrop/Enable}}> + <$set name="tv-show-missing-links" value={{$:/config/MissingLinks}}> <$set name="storyviewTitle" value={{$:/view}}> @@ -22,7 +24,7 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ <$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}> -<$dropzone enable={{$:/config/PageDropzone/Enable}}> +<$dropzone enable=<<tv-enable-drag-and-drop>>> <$list filter="[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]" variable="listItem"> @@ -47,3 +49,5 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ </$set> </$set> + +</$set> diff --git a/core/ui/SideBar/Open.tid b/core/ui/SideBar/Open.tid index 14e53ed40..0e044ddf8 100644 --- a/core/ui/SideBar/Open.tid +++ b/core/ui/SideBar/Open.tid @@ -15,7 +15,7 @@ caption: {{$:/language/SideBar/Open/Caption}} \define droppable-item(button) \whitespace trim -<$droppable actions=<<drop-actions>>> +<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>> <<placeholder>> <div> $button$ diff --git a/core/wiki/macros/list.tid b/core/wiki/macros/list.tid index 9e8a2ac20..e679f1fde 100644 --- a/core/wiki/macros/list.tid +++ b/core/wiki/macros/list.tid @@ -26,7 +26,7 @@ tags: $:/tags/Macro <$vars targetTiddler="""$tiddler$""" targetField="""$field$"""> <$type$ class="$class$"> <$list filter="[list[$tiddler$!!$field$]]"> -<$droppable actions=<<list-links-draggable-drop-actions>> tag="""$subtype$"""> +<$droppable actions=<<list-links-draggable-drop-actions>> tag="""$subtype$""" enable=<<tv-enable-drag-and-drop>>> <div class="tc-droppable-placeholder"/> <div> <$transclude tiddler="""$itemTemplate$"""> @@ -41,7 +41,7 @@ tags: $:/tags/Macro </$list> </$type$> <$tiddler tiddler=""> -<$droppable actions=<<list-links-draggable-drop-actions>> tag="div"> +<$droppable actions=<<list-links-draggable-drop-actions>> tag="div" enable=<<tv-enable-drag-and-drop>>> <div class="tc-droppable-placeholder">   </div> @@ -80,7 +80,7 @@ tags: $:/tags/Macro <$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__>>/>"""> +<$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$"""> @@ -93,7 +93,7 @@ tags: $:/tags/Macro </$elementTag$> </$list> <$tiddler tiddler=""> -<$droppable actions="""<$macrocall $name="list-tagged-draggable-drop-actions" tag=<<__tag__>>/>"""> +<$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$> diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid new file mode 100644 index 000000000..b59abe3fc --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid @@ -0,0 +1,19 @@ +created: 20200315143638556 +modified: 20200315143638556 +tags: [[Hidden Settings]] +title: Hidden Setting: Disable Drag and Drop +type: text/vnd.tiddlywiki + +To disable all the drag and drop operations that are built into the core, set the following tiddler to "no": + +$:/config/DragAndDrop/Enable + +To selectively re-enable drag and drop for an instance of the [[list-tagged-draggable Macro]] or [[list-links-draggable Macro]] you must ensure that the variable `tv-enable-drag-and-drop` is set to `yes` for the scope of the macro invocation. For example: + +<$macrocall $name="wikitext-example-without-html" src="""<$set name="tv-enable-drag-and-drop" value="yes"> + +<<list-tagged-draggable tag:"Features">> + +</$set>"""/> + +Note that when using the DropzoneWidget and the DroppableWidget directly the ''enable'' attribute works independently of the global setting. diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid deleted file mode 100644 index 56ddd23f6..000000000 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Page Dropzone.tid +++ /dev/null @@ -1,9 +0,0 @@ -created: 20200315143638556 -modified: 20200315143638556 -tags: [[Hidden Settings]] -title: Hidden Setting: Disable Page Dropzone -type: text/vnd.tiddlywiki - -To disable the main DropzoneWidget, set the following tiddler to "no": - -$:/config/PageDropzone/Enable diff --git a/editions/tw5.com/tiddlers/widgets/DroppableWidget.tid b/editions/tw5.com/tiddlers/widgets/DroppableWidget.tid index 3b197790a..b2172a1dc 100644 --- a/editions/tw5.com/tiddlers/widgets/DroppableWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DroppableWidget.tid @@ -1,6 +1,6 @@ caption: droppable created: 20170406082820317 -modified: 20190118084621046 +modified: 20200317142604572 tags: Widgets title: DroppableWidget type: text/vnd.tiddlywiki @@ -30,6 +30,7 @@ See DragAndDropMechanism for an overview. |actions |Actions to be performed when items are dropped | |class |Optional CSS classes to assign to the draggable element. The class `tc-droppable` is added automatically, and the class `tc-dragover` is applied while an item is being dragged over the droppable element | |tag |Optional tag to override the default of a "div" element when the widget is rendered in block mode, or a "span" element when it is rendered in inline mode | +|enable |<<.from-version "5.1.22">> Optional value "no" to disable the droppable functionality (defaults to "yes") | Within the action string, there are two Variables generated by the DroppableWidget: From 6928842bbf350587acdb5ef5f6355abb07154e8f Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 20 Mar 2020 11:02:14 +0000 Subject: [PATCH 0537/2376] Update docs for disabling drag and drop --- .../hiddensettings/Hidden Setting_ Disable Drag and Drop.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid index b59abe3fc..5348a15ea 100644 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid @@ -8,11 +8,11 @@ To disable all the drag and drop operations that are built into the core, set th $:/config/DragAndDrop/Enable -To selectively re-enable drag and drop for an instance of the [[list-tagged-draggable Macro]] or [[list-links-draggable Macro]] you must ensure that the variable `tv-enable-drag-and-drop` is set to `yes` for the scope of the macro invocation. For example: +To selectively re-enable drag and drop for an instance of the [[list-tagged-draggable Macro]] or [[list-links-draggable Macro]] you must ensure that the variable `tv-enable-drag-and-drop` is set to `yes` for the scope of the macro invocation. For example, note how it is still possible to use drag and drop within this list even if $:/config/DragAndDrop/Enable is set to "no": <$macrocall $name="wikitext-example-without-html" src="""<$set name="tv-enable-drag-and-drop" value="yes"> -<<list-tagged-draggable tag:"Features">> +<<list-tagged-draggable tag:"HelloThere">> </$set>"""/> From 10ab83940ace83dcafea7a237b81f36ec946e423 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 20 Mar 2020 13:47:48 +0100 Subject: [PATCH 0538/2376] Update Nord Palette for better readability (#4517) --- core/palettes/Nord.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index 592c896c4..73174a4d6 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -63,8 +63,8 @@ primary: #5E81AC select-tag-background: #3b4252 select-tag-foreground: <<colour foreground>> sidebar-button-foreground: <<colour foreground>> -sidebar-controls-foreground-hover: #4C566A -sidebar-controls-foreground: #3B4252 +sidebar-controls-foreground-hover: #D8DEE9 +sidebar-controls-foreground: #4C566A sidebar-foreground-shadow: transparent sidebar-foreground: #D8DEE9 sidebar-muted-foreground-hover: #4C566A From 4232b402aba43606495c35d48af9c7180bfce5f6 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 20 Mar 2020 19:31:57 +0100 Subject: [PATCH 0539/2376] Update Vanilla.tid (#4515) --- core/palettes/Vanilla.tid | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/palettes/Vanilla.tid b/core/palettes/Vanilla.tid index 6b121fd57..3590cc126 100644 --- a/core/palettes/Vanilla.tid +++ b/core/palettes/Vanilla.tid @@ -117,3 +117,20 @@ toolbar-cancel-button: toolbar-done-button: untagged-background: #999999 very-muted-foreground: #888888 +wikilist-background: #e5e5e5 +wikilist-item: #fff +wikilist-info: #000 +wikilist-title: #666 +wikilist-title-svg: <<colour wikilist-title>> +wikilist-url: #aaa +wikilist-button-open: #4fb82b +wikilist-button-open-hover: green +wikilist-button-reveal: #5778d8 +wikilist-button-reveal-hover: blue +wikilist-button-remove: #d85778 +wikilist-button-remove-hover: red +wikilist-toolbar-background: #d3d3d3 +wikilist-toolbar-foreground: #888 +wikilist-droplink-dragover: rgba(255,192,192,0.5) +wikilist-button-background: #acacac +wikilist-button-foreground: #000 From 2d9a9703cbd2a31e8e229c1fb22a37e475330718 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 24 Mar 2020 10:35:07 +0000 Subject: [PATCH 0540/2376] Menubar: Fix positioning of toprightbar when narrow Fixes #4477 --- plugins/tiddlywiki/menubar/items/toprightbar.tid | 2 +- plugins/tiddlywiki/menubar/menu.tid | 2 +- plugins/tiddlywiki/menubar/readme.tid | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/tiddlywiki/menubar/items/toprightbar.tid b/plugins/tiddlywiki/menubar/items/toprightbar.tid index 87ba216e3..ae59e759b 100644 --- a/plugins/tiddlywiki/menubar/items/toprightbar.tid +++ b/plugins/tiddlywiki/menubar/items/toprightbar.tid @@ -3,7 +3,7 @@ tags: $:/tags/MenuBar description: Items from $:/tags/TopRightBar caption: Legacy Top Right Bar custom-menu-content: <$transclude tiddler="$:/plugins/tiddlywiki/menubar/items/toprightbar" mode="inline"/> -custom-menu-styles: float: right; +custom-menu-styles-wide: float: right; <$list filter="[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]" variable="listItem" storyview="pop"> diff --git a/plugins/tiddlywiki/menubar/menu.tid b/plugins/tiddlywiki/menubar/menu.tid index 58f8ce80c..0c1d0d7cd 100644 --- a/plugins/tiddlywiki/menubar/menu.tid +++ b/plugins/tiddlywiki/menubar/menu.tid @@ -6,7 +6,7 @@ tags: $:/tags/PageTemplate <$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]]"> <$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore"> <$list filter="[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]" variable="ignore"> -<li style={{!!custom-menu-styles}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}> +<li style={{!!custom-menu-styles-$size$}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}> <$list filter="[<currentTiddler>!is-dropdown[yes]]" variable="listItem" emptyMessage=""" <!-- Dropdown --> <$set name="dropdown-state" value=<<qualify "$:/state/popup/topmenu/dropdown/">>> diff --git a/plugins/tiddlywiki/menubar/readme.tid b/plugins/tiddlywiki/menubar/readme.tid index b51d24abf..8677a0cc5 100644 --- a/plugins/tiddlywiki/menubar/readme.tid +++ b/plugins/tiddlywiki/menubar/readme.tid @@ -21,7 +21,8 @@ Menu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by |is-dropdown |Set to `yes` to indicate a dropdown menu item | |text |For dropdown menu items, specifies the body of the dropdown | |custom-menu-content |Optional wikitext to be displayed in place of the caption | -|custom-menu-styles |Optional string of styles to be applied to menu item | +|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide | +|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow | Custom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element. From ae04a425c06f9b6f262b4e6a11aa71cde70f389d Mon Sep 17 00:00:00 2001 From: Rob Hoelz <rob@hoelz.ro> Date: Thu, 26 Mar 2020 08:15:02 -0500 Subject: [PATCH 0541/2376] Add backlinks indexer (#4421) * Add tests for backlinks * Add backlinks indexer * Use backlinks indexer in getTiddlerBacklinks if available * Extract link extraction into its own method This way we can provide an arbitrary parse tree, rather than just a title, which will allow us to compare lists of outgoing links between versions of a single tiddler * Use new extractLinks method in backlinks indexer ...rather than copy-pasting the implementation * Remove ES6-isms TiddlyWiki needs to work with browsers that only support ES5 --- core/modules/indexers/backlinks-index.js | 86 ++++++++++++ core/modules/wiki.js | 61 ++++---- .../test/tiddlers/tests/test-backlinks.js | 132 ++++++++++++++++++ 3 files changed, 255 insertions(+), 24 deletions(-) create mode 100644 core/modules/indexers/backlinks-index.js create mode 100644 editions/test/tiddlers/tests/test-backlinks.js diff --git a/core/modules/indexers/backlinks-index.js b/core/modules/indexers/backlinks-index.js new file mode 100644 index 000000000..5902e2829 --- /dev/null +++ b/core/modules/indexers/backlinks-index.js @@ -0,0 +1,86 @@ +/*\ +title: $:/core/modules/indexers/backlinks-indexer.js +type: application/javascript +module-type: indexer + +Indexes the tiddlers' backlinks + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global modules: false */ +"use strict"; + + +function BacklinksIndexer(wiki) { + this.wiki = wiki; +} + +BacklinksIndexer.prototype.init = function() { + this.index = null; +} + +BacklinksIndexer.prototype.rebuild = function() { + this.index = null; +} + +BacklinksIndexer.prototype._getLinks = function(tiddler) { + var parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {}); + if(parser) { + return this.wiki.extractLinks(parser.tree); + } + return []; +} + +BacklinksIndexer.prototype.update = function(updateDescriptor) { + if(!this.index) { + return; + } + var newLinks = [], + oldLinks = [], + self = this; + if(updateDescriptor.old.exists) { + oldLinks = this._getLinks(updateDescriptor.old.tiddler); + } + if(updateDescriptor.new.exists) { + newLinks = this._getLinks(updateDescriptor.new.tiddler); + } + + $tw.utils.each(oldLinks,function(link) { + if(self.index[link]) { + delete self.index[link][updateDescriptor.old.tiddler.fields.title]; + } + }); + $tw.utils.each(newLinks,function(link) { + if(!self.index[link]) { + self.index[link] = Object.create(null); + } + self.index[link][updateDescriptor.new.tiddler.fields.title] = true; + }); +} + +BacklinksIndexer.prototype.lookup = function(title) { + if(!this.index) { + this.index = Object.create(null); + var self = this; + this.wiki.forEachTiddler(function(title,tiddler) { + var links = self._getLinks(tiddler); + $tw.utils.each(links, function(link) { + if(!self.index[link]) { + self.index[link] = Object.create(null); + } + self.index[link][title] = true; + }); + }); + } + if(this.index[title]) { + return Object.keys(this.index[title]); + } else { + return []; + } +} + +exports.BacklinksIndexer = BacklinksIndexer; + +})(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index fc8b42eda..d44940cb6 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -414,6 +414,30 @@ exports.forEachTiddler = function(/* [options,]callback */) { } }; +/* +Return an array of tiddler titles that are directly linked within the given parse tree + */ +exports.extractLinks = function(parseTreeRoot) { + // Count up the links + var links = [], + checkParseTree = function(parseTree) { + for(var t=0; t<parseTree.length; t++) { + var parseTreeNode = parseTree[t]; + if(parseTreeNode.type === "link" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === "string") { + var value = parseTreeNode.attributes.to.value; + if(links.indexOf(value) === -1) { + links.push(value); + } + } + if(parseTreeNode.children) { + checkParseTree(parseTreeNode.children); + } + } + }; + checkParseTree(parseTreeRoot); + return links; +}; + /* Return an array of tiddler titles that are directly linked from the specified tiddler */ @@ -423,26 +447,10 @@ exports.getTiddlerLinks = function(title) { return this.getCacheForTiddler(title,"links",function() { // Parse the tiddler var parser = self.parseTiddler(title); - // Count up the links - var links = [], - checkParseTree = function(parseTree) { - for(var t=0; t<parseTree.length; t++) { - var parseTreeNode = parseTree[t]; - if(parseTreeNode.type === "link" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === "string") { - var value = parseTreeNode.attributes.to.value; - if(links.indexOf(value) === -1) { - links.push(value); - } - } - if(parseTreeNode.children) { - checkParseTree(parseTreeNode.children); - } - } - }; if(parser) { - checkParseTree(parser.tree); + return self.extractLinks(parser.tree); } - return links; + return []; }); }; @@ -451,13 +459,18 @@ Return an array of tiddler titles that link to the specified tiddler */ exports.getTiddlerBacklinks = function(targetTitle) { var self = this, + backlinksIndexer = this.getIndexer("BacklinksIndexer"), + backlinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle); + + if(!backlinks) { backlinks = []; - this.forEachTiddler(function(title,tiddler) { - var links = self.getTiddlerLinks(title); - if(links.indexOf(targetTitle) !== -1) { - backlinks.push(title); - } - }); + this.forEachTiddler(function(title,tiddler) { + var links = self.getTiddlerLinks(title); + if(links.indexOf(targetTitle) !== -1) { + backlinks.push(title); + } + }); + } return backlinks; }; diff --git a/editions/test/tiddlers/tests/test-backlinks.js b/editions/test/tiddlers/tests/test-backlinks.js new file mode 100644 index 000000000..68ad18bbd --- /dev/null +++ b/editions/test/tiddlers/tests/test-backlinks.js @@ -0,0 +1,132 @@ +/*\ +title: test-backlinks.js +type: application/javascript +tags: [[$:/tags/test-spec]] + +Tests the backlinks mechanism. + +\*/ +(function(){ +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +describe('Backlinks tests', function() { + describe('a tiddler with no links to it', function() { + var wiki = new $tw.Wiki(); + + wiki.addTiddler({ + title: 'TestIncoming', + text: ''}); + + it('should have no backlinks', function() { + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe(''); + }); + }); + + describe('A tiddler added to the wiki with a link to it', function() { + var wiki = new $tw.Wiki(); + + wiki.addTiddler({ + title: 'TestIncoming', + text: ''}); + + wiki.addTiddler({ + title: 'TestOutgoing', + text: 'A link to [[TestIncoming]]'}); + + it('should have a backlink', function() { + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe('TestOutgoing'); + }); + }); + + describe('A tiddler that has a link added to it later', function() { + it('should have an additional backlink', function() { + var wiki = new $tw.Wiki(); + + wiki.addTiddler({ + title: 'TestIncoming', + text: ''}); + + wiki.addTiddler({ + title: 'TestOutgoing', + text: 'A link to [[TestIncoming]]'}); + + wiki.addTiddler({ + title: 'TestOutgoing2', + text: 'Nothing yet!'}); + + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe('TestOutgoing'); + + wiki.addTiddler({ + title: 'TestOutgoing2', + text: 'Updated with link to [[TestIncoming]]'}); + + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe('TestOutgoing,TestOutgoing2'); + }); + }); + + describe('A tiddler that has a link remove from it later', function() { + var wiki = new $tw.Wiki(); + + wiki.addTiddler({ + title: 'TestIncoming', + text: ''}); + + wiki.addTiddler({ + title: 'TestOutgoing', + text: 'A link to [[TestIncoming]]'}); + + it('should have one fewer backlink', function() { + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe('TestOutgoing'); + + wiki.addTiddler({ + title: 'TestOutgoing', + text: 'No link to ~TestIncoming'}); + + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe(''); + }); + }); + + describe('A tiddler linking to another that gets renamed', function() { + var wiki = new $tw.Wiki(); + + wiki.addTiddler({ + title: 'TestIncoming', + text: ''}); + + wiki.addTiddler({ + title: 'TestOutgoing', + text: 'A link to [[TestIncoming]]'}); + + it('should have its name changed in the backlinks', function() { + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe('TestOutgoing'); + + wiki.renameTiddler('TestOutgoing', 'TestExtroverted'); + + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe('TestExtroverted'); + }); + }); + + describe('A tiddler linking to another that gets deleted', function() { + var wiki = new $tw.Wiki(); + + wiki.addTiddler({ + title: 'TestIncoming', + text: ''}); + + wiki.addTiddler({ + title: 'TestOutgoing', + text: 'A link to [[TestIncoming]]'}); + + it('should be removed from backlinks', function() { + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe('TestOutgoing'); + + wiki.deleteTiddler('TestOutgoing'); + + expect(wiki.filterTiddlers('TestIncoming +[backlinks[]]').join(',')).toBe(''); + }); + }); +}); + +})(); From 6f4daa70e1c2463461e336335a82479012d3499e Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Sun, 29 Mar 2020 05:44:09 -0700 Subject: [PATCH 0542/2376] GruvBoxDark palette contrast tweaks (#4522) --- core/palettes/GruvBoxDark.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index 1c334e5d4..ffceeb1e7 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -53,7 +53,7 @@ modal-border: #504945 modal-footer-background: #3c3836 modal-footer-border: #3c3836 modal-header-border: #3c3836 -muted-foreground: #665c54 +muted-foreground: #d5c4a1 notification-background: <<colour primary>> notification-border: <<colour primary>> page-background: #282828 @@ -108,7 +108,7 @@ tiddler-info-tab-background: #ebdbb2 tiddler-link-background: <<colour background>> tiddler-link-foreground: <<colour primary>> tiddler-subtitle-foreground: #7c6f64 -tiddler-title-foreground: #7c6f64 +tiddler-title-foreground: #a89984 toolbar-new-button: toolbar-options-button: toolbar-save-button: @@ -119,4 +119,4 @@ toolbar-delete-button: toolbar-cancel-button: toolbar-done-button: untagged-background: #504945 -very-muted-foreground: #32302f +very-muted-foreground: #bdae93 From 091bcfce7d1a9c09140992e649f41ae17d27f307 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 30 Mar 2020 10:55:37 +0100 Subject: [PATCH 0543/2376] Fix the datauri macro to work with _canonical_uri tiddlers --- core/modules/macros/makedatauri.js | 7 ++++--- core/modules/utils/utils.js | 16 ++++++++++------ core/wiki/macros/CSS.tid | 2 +- .../tw5.com/tiddlers/macros/MakeDataUriMacro.tid | 4 +++- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/core/modules/macros/makedatauri.js b/core/modules/macros/makedatauri.js index a7474bdf0..0ff862df1 100644 --- a/core/modules/macros/makedatauri.js +++ b/core/modules/macros/makedatauri.js @@ -22,14 +22,15 @@ exports.name = "makedatauri"; exports.params = [ {name: "text"}, - {name: "type"} + {name: "type"}, + {name: "_canonical_uri"} ]; /* Run the macro */ -exports.run = function(text,type) { - return $tw.utils.makeDataUri(text,type); +exports.run = function(text,type,_canonical_uri) { + return $tw.utils.makeDataUri(text,type,_canonical_uri); }; })(); diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 2495be49f..26fed0f3c 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -728,16 +728,20 @@ exports.timer = function(base) { /* Convert text and content type to a data URI */ -exports.makeDataUri = function(text,type) { +exports.makeDataUri = function(text,type,_canonical_uri) { type = type || "text/vnd.tiddlywiki"; var typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo["text/plain"], isBase64 = typeInfo.encoding === "base64", parts = []; - parts.push("data:"); - parts.push(type); - parts.push(isBase64 ? ";base64" : ""); - parts.push(","); - parts.push(isBase64 ? text : encodeURIComponent(text)); + if(_canonical_uri) { + parts.push(_canonical_uri); + } else { + parts.push("data:"); + parts.push(type); + parts.push(isBase64 ? ";base64" : ""); + parts.push(","); + parts.push(isBase64 ? text : encodeURIComponent(text)); + } return parts.join(""); }; diff --git a/core/wiki/macros/CSS.tid b/core/wiki/macros/CSS.tid index 563f917a9..9e6239e90 100644 --- a/core/wiki/macros/CSS.tid +++ b/core/wiki/macros/CSS.tid @@ -60,7 +60,7 @@ column-count: $columns$; \end \define datauri(title) -<$macrocall $name="makedatauri" type={{$title$!!type}} text={{$title$}}/> +<$macrocall $name="makedatauri" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/> \end \define if-sidebar(text) diff --git a/editions/tw5.com/tiddlers/macros/MakeDataUriMacro.tid b/editions/tw5.com/tiddlers/macros/MakeDataUriMacro.tid index ba26e4c4d..4ef300af2 100644 --- a/editions/tw5.com/tiddlers/macros/MakeDataUriMacro.tid +++ b/editions/tw5.com/tiddlers/macros/MakeDataUriMacro.tid @@ -1,5 +1,5 @@ created: 20131228163141555 -modified: 20150221223416000 +modified: 20200330105334133 tags: Macros [[Core Macros]] title: makedatauri Macro type: text/vnd.tiddlywiki @@ -15,5 +15,7 @@ The <<.def makedatauri>> [[macro|Macros]] takes a piece of text and an associate : The text to be converted to a data URI ;type : The ContentType of the text +;_canonical_uri +: The optional ''_canonical_uri'' address of the content <<.macro-examples "makedatauri">> From 15b8545d72c9f6f1040f8f2f94506a7c9ab88504 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 30 Mar 2020 14:30:09 +0100 Subject: [PATCH 0544/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.22.tid | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 0c7530c9e..50bc04754 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -1,6 +1,6 @@ caption: 5.1.22 -created: 20200219102220589 -modified: 20200228155312587 +created: 20200330122328344 +modified: 20200330122328344 tags: ReleaseNotes title: Release 5.1.22 type: text/vnd.tiddlywiki @@ -19,26 +19,25 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * Plugins may now declare dependencies that are automatically installed without user intervention * All plugins now feature a concise, informal name (in addition to the description and title) -!! New "Menu Bar" Plugin +!! New Menu Bar Plugin -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ad2d4503e584ce9f931dbd1e98f95738b2841e51]] ''menubar'' plugin to create a menu bar that is responsive on mobile devices, and supports search, dropdowns and links +[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ad2d4503e584ce9f931dbd1e98f95738b2841e51]] new ''menubar'' plugin that creates a menu bar that is responsive on mobile devices, and supports search, dropdowns and links -!! New "Freelinks" Plugin +!! New Freelinks Plugin -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/447cd56da9db2ee169607f32923081ac47e78354]] ''freelinks'' plugin to automatically create links from any tiddler title +[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/447cd56da9db2ee169607f32923081ac47e78354]] new ''freelinks'' plugin to automatically create links from any tiddler title, without having to type double square brackets or use CamelCase. -!! New "Share" Plugin +!! New Dynannotate Plugin -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/005c584d85505b9477169ef822752eed39dde66a]] ''share'' plugin for sharing tiddlers via the URL location hash +[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/9b48a1c82955d1050c426fef559f42f4b8ec56e7]] new ''dynannotate'' plugin containing primitives for overlaying annotations or highlights over other content -! Plugin Improvements +!! New Share Plugin -* Comments plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/16c1cbee292604b2b8be36a15d5828893d132b20]] a link on each comment to the original post -* Markdown plugin -** [[Switched|https://github.com/Jermolene/TiddlyWiki5/pull/3876]] to the newer and improved [[remarkable|https://github.com/jonschlinkert/remarkable]] library -* Railroad plugin -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/152125f53b9979bfd5511973038b4358d1ef48c4]] colour scheme to use standard palette colours +[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/005c584d85505b9477169ef822752eed39dde66a]] new ''share'' plugin for sharing tiddlers via the URL location hash + +!! Improved Markdown Plugin + +[[Switched|https://github.com/Jermolene/TiddlyWiki5/pull/3876]] to the newer and improved [[remarkable|https://github.com/jonschlinkert/remarkable]] library ! Translation Improvements @@ -50,6 +49,7 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * [[Optimised|https://github.com/Jermolene/TiddlyWiki5/pull/4108]] ImportVariablesWidget to improve performance of global macros * [[Optimised|https://github.com/Jermolene/TiddlyWiki5/commit/18f5333e01eb62ece65a86c457bf8a398f156930]] core SVG images to save approximately 100KB from the core plugin +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4421]] indexer for backlinks ! Usability Improvements @@ -62,9 +62,15 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/3943]] scaling of embedded videos * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4361]] "none" option in icon dropdown in $:/TagManager * Fixed a number of layout issues relating to the edit template and tag picker (see [[18151cc1|https://github.com/Jermolene/TiddlyWiki5/commit/18151cc193e8c0d613663d3ecf6437c63e540c2d]], [[793d84bc|https://github.com/Jermolene/TiddlyWiki5/commit/793d84bcb1bc52ee77c49090268dd242017cdaa9]], [[1cf2d079|https://github.com/Jermolene/TiddlyWiki5/commit/1cf2d0799d7027d58f4bdca857bc342dd778a330]], [[3c365a25|https://github.com/Jermolene/TiddlyWiki5/commit/3c365a2567ebfe12d78b0aed77a40969cd38563e]], [[45def4de|https://github.com/Jermolene/TiddlyWiki5/commit/45def4def441554a06c3e17742adc29a17d2a13c]], [[89728d8a|https://github.com/Jermolene/TiddlyWiki5/commit/89728d8a9a9fd9b888deb78f420dd5758ee63909]], [[4cf96e73|https://github.com/Jermolene/TiddlyWiki5/commit/4cf96e7339b3b7d8e84a5b73d9871cdad50c5a84]], [[bfa3ddd0|https://github.com/Jermolene/TiddlyWiki5/commit/bfa3ddd077404ad4627b9161bcadf3d5a539c1dc]] and [[74172b35|https://github.com/Jermolene/TiddlyWiki5/commit/74172b35ceae84f254e20d6d7ec4dff2cca692b1]]) +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4494]] new ''Gruvbox Dark'' palette +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4515]] (and [[https://github.com/Jermolene/TiddlyWiki5/pull/4517|here]])) Vanilla and Nord palettes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/152125f53b9979bfd5511973038b4358d1ef48c4]] Railroad plugin to use standard palette colours +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/16c1cbee292604b2b8be36a15d5828893d132b20]] Comment plugin to add a link on each comment to the original post ! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4491]] new saver for https://gitea.io/ +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/24d2804799b09278c4bb83918d8b75dfa49dbed4]] new ActionPopupWidget for triggering popups * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4442]] ''tabindex'' attribute to the ButtonWidget * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bfbd886a8bbf2f6ce147ea526eec2098357d3ae7]] ''index'' attribute to the RangeWidget enabling it to be used with DataTiddlers * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6089c4de2921df0f76f605f1830fb2c04548f73c]] support for RefreshThrottling via the `throttle.refresh` field @@ -73,12 +79,18 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/89716bb81d68b9c68d3c0fd2f2de96afad1b086a]] CSS class identifying the tiddler body editor * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/e9211b0eee8e0b081f9f1597bde6673bf4c55d5c]] CSS classes to identify sidebar tabsets * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4208]] normalize.css from v3.0.0 to v8.0.1 +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4502]] Highlight plugin to use highlight.js v9.18.1 * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4226]] Jasmine to v3 * [[Refactored|https://github.com/Jermolene/TiddlyWiki5/commit/7b66df688ae745537929a25799ef4a72d4437fcd]] AndTidWiki saver * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5a5c967a3943beb6a4fa513cb34d231e46304452]] new [[SystemTag: $:/tags/Macro/View]] for creating macros that are only available within the view template * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4404]] support for embedding `.webm` and `.ogg` video files * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3df1f9c9d0cc92b596262c0220ecf529c7fbb858]] ''spaces'' parameter to [[jsontiddlers Macro]] for controlling the formatting of the output * [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/4afde5a722afc91c826305800ba536c5fe8ef2e5]] the [[colour Macro]] to add support for specifying a fallback for colours not in the current colour palette +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6091b013864af3d9918df69894f4aa05d1b8ffeb]] new [[Hidden Setting: Default Tiddler Icon]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bc687e57834efa312cca126af222613ef241c585]] new [[Hidden Setting: Disable Drag and Drop]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ae9ce4f01c6048aeb5604a93b57c2f3e4f959162]] new ''tc-tiddler-overridden-shadow'' class to tiddler frames for tiddlers that override a shadow tiddler +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4490]] support for a custom class to modal wrapper +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/091bcfce7d1a9c09140992e649f41ae17d27f307]] [[datauri Macro]] to work with tiddlers with a ''_canonical_uri'' field ! Bug Fixes @@ -92,16 +104,18 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4333]] usage of spans in colour picker * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e84c422e5091c02f55db4027faa9ba840e2aee6c]] refreshing of RangeWidget when underlying value changes * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e4eaae14faa1bf867c0f8168e221cf30ac6e2e0d]] problem with splash screen being shown when JavaScript is disabled -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8f3da69f818940eb5f517da850fb3766b72c7d7d]] probelm with millisecond 0XXX DateFormat +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/8f3da69f818940eb5f517da850fb3766b72c7d7d]] problem with millisecond 0XXX DateFormat * [[Improve|https://github.com/Jermolene/TiddlyWiki5/commit/174a36cda63127d19230bcfbe9a5fdde46e5b0ea]] compatibility of single tiddler window vs. main window * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/015306dfc9099f4d5d9415b64266d328a154b119]] problems with some core icons in Internet Explorer * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/3eacdc19fdb4ed7ce864a04dd87a5e1c6492daac]] GitHub and GitLab savers to use default path of `/` if none specified * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4432]] support for embedding ZIP files in some environments +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/665b63ec38b75dfe62009d2f5514682de60e953f]] lack of refresh when ButtonWidget ''actions'' attribute changes ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: +* [[@activescott|https://github.com/activescott]] * [[@BramChen|https://github.com/BramChen]] * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@donmor|https://github.com/donmor]] @@ -109,7 +123,10 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * [[@flibbles|https://github.com/flibbles]] * [[@gernert|https://github.com/gernert]] * [[@heronils|https://github.com/heronils]] +* [[@hoelzro|https://github.com/hoelzro]] * [[@Janno|https://github.com/Janno]] +* [[@joshuafontany|https://github.com/joshuafontany]] +* [[@m42e|https://github.com/m42e]] * [[@MidnightLightning|https://github.com/MidnightLightning]] * [[@pmario|https://github.com/pmario]] * [[@s-l-lee|https://github.com/s-l-lee]] From b95723a022669371cd139b332cf3a64bc438b73e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 30 Mar 2020 15:24:05 +0100 Subject: [PATCH 0545/2376] Fix syncer to handler errors properly (#4373) * First commit * Add throttling of saves Now we refuse to save a tiddler more often than once per second. * Wait for a timeout before trying again after an error * Modest optimisations of isDirty() method * Synchronise system tiddlers and deletions from the server Fixes two long-standing issues: * Changes to system tiddlers are not synchronised from the server to the browser * Deletions of tiddlers on the server are not propagated to browser clients * Make sure we update the dirty status even if there isn't a task to perform * Replace save-wiki button with popup sync menu * Remove the "Server" control panel tab We don't need it with the enhanced sync dropdown * Add indentation to the save-wiki button * Fix spacing in dropdown menu items * Switch between cloud icons according to dirty status * Add a menu item to copy syncer logs to the clipboard * Improve animated icon * Remove indentation from save-wiki button @pmario the annoying thing is that using `\trim whitespace` trims significant whitespace too, so it means we have to use <$text text=" "/> when we need a space that won't be trimmed. For the moment, I've removed the indentation but will keep thinking about it. * Further icon, UI and copy text tweaks Move the icons and styles from the core into the TiddlyWeb plugin * Clean up PR diff * Tweak animation durations * Break the actions from the syncer dropdown into separate tiddlers @pmario I think this makes things a bit easier to follow * Refactor syncadaptor creation and logging The goal is for the syncadaptor to be able to log to the same logger as the syncer, so that the "copy syncer logs to clipboard" data is more useful. * Don't transition the dirty indicator container colour, just the SVG's colour * Only trigger a sync for changes to tiddlers we're interested in Otherwise it is triggered by the creation of the alert tiddlers used to display errors. * Restore deleting local tiddlers removed from the server (I had commented it out for some testing and accidentally commited it). * Guard against missing adaptor info * We still need to trigger a timeout when there was no task to process * Avoid repeatedly polling for changes Instead we only trigger a timeout call at if there is a pending task (ie a tiddler that has changed but isn't yet old enough to save). * Lazy loading: include skinny versions of lazily loaded tiddlers in the index.html * Introduce _is_skinny field for indicating that a tiddler is subject to lazy loading * Remove savetrail plugin from prerelease It doesn't yet work with the new syncer * Make the savetrail plugin work again * Clear outstanding alerts when synchronisation is restored * Logger: only remove alerts from the same component Missed off 9f5c0de07 * Make the saving throttle interval configurable (#4385) After switching Bob to use the core syncer the throttle interval makes saving feel very sluggish compared to the message queue setup that I had before. The editing lock that I use to prevent conflicts with multiple users doesn't go away until the save is completed, and with the 1 second delay it means that if you edit a tiddler and save it than you have to wait one second before you can edit it again. * Tweaks to appearance of alerts * Exclude temp tiddlers from offline snapshots Otherwise alerts will persist * Tweak appearance of status line in dropdown * Update release note * Web server: Don't include full path in error messages Fixes #3724 * In change event handler check for deletions * Disable the official plugin library when the tiddlyweb plugin is loaded * Hide error details from browser for /files/ route See https://github.com/Jermolene/TiddlyWiki5/issues/3724#issuecomment-565702492 -- thanks @pmario * Revert all the changes to the relationship between the syncer and the syncadaptor Previously we had some major rearrangements to make it possible for the syncadaptor to route it's logging to the logger used by the syncer. The motivation is so that the "copy logs to clipboard" button is more useful. On reflection, changing the interface this drastically is undesirable from a backwards compatibility perspective, so I'm going to investigate other ways to achieve the logger sharing * Make the tiddlyweb adaptor use the syncer's logger So that both are availavble when copying the syncer logs to the clipboard * Update release note * Support setting port=0 to get an OS assigned port Quite useful * Update code comment * UI: Use "Get latest changes from server" instead of "Refresh" * Add getUpdatedTiddlers() method to syncadaptor API See https://github.com/Jermolene/TiddlyWiki5/pull/4373#issuecomment-573579495 * Refactor revision handling within the syncer Thanks @pmario * Fix typo in tiddlywebadaptor * Improve presentation of errors See https://github.com/Jermolene/TiddlyWiki5/pull/4373#issuecomment-573695267 * Add docs for getTiddlerRevision() * Remove unused error animation * Update comment for GET /recipes/default/tiddlers/tiddlers.json * Optimise SVG cloud image * Add optional list of allowed filters for get all tiddlers route An attempt to address @Arlen22's concern here: https://github.com/Jermolene/TiddlyWiki5/pull/4373#pullrequestreview-342146190 * Fix network error alert text translatability * Fix error code and logging for GET /recipes/default/tiddlers/tiddlers.json Thanks @Arlen22 * Flip GET /recipes/default/tiddlers/tiddlers.json allowed filter handling to be secure by default * Validate updates received from getUpdatedTiddlers() * Add syncer method to force loading of a tiddler from the server * Remove the release note update to remove the merge conflict * Fix crash when there's no config section in the tiddlywiki.info file * Use config tiddler title to check filter query (merge into fix-syncer) (#4478) * Use config tiddler title to check filter query * Create config-tiddlers-filter.tid * Add config switch to enable all filters on GET /recipes/default/tiddlers/tiddlers.json And update docs * Fix bug when deleting a tiddler with a shadow Reported by @kookma at https://github.com/Jermolene/TiddlyWiki5/pull/4373#issuecomment-604027528 Co-authored-by: jed <inmysocks@fastmail.com> Co-authored-by: Arlen22 <arlenbee@gmail.com> --- core/language/en-GB/Fields.multids | 1 + core/language/en-GB/Misc.multids | 1 + core/modules/server/routes/get-file.js | 18 +- .../server/routes/get-tiddlers-json.js | 33 +- core/modules/server/server.js | 16 +- core/modules/startup/startup.js | 2 +- core/modules/syncer.js | 584 ++++++++++-------- core/modules/utils/dom/http.js | 9 +- core/modules/utils/logger.js | 50 +- core/modules/utils/utils.js | 18 + core/modules/wiki.js | 4 +- core/templates/html-div-skinny-tiddler.tid | 9 + core/templates/save-lazy-all.tid | 3 + core/templates/save-lazy-images.tid | 3 + core/templates/store.area.template.html.tid | 1 + core/ui/AlertTemplate.tid | 6 +- .../config/ServerExternalFiltersDefault.tid | 2 + .../moduletypes/SyncAdaptorModules.tid | 47 +- .../tiddlers/concepts/TiddlerFields.tid | 4 +- .../WebServer API_ Get All Tiddlers.tid | 18 +- .../webserver/WebServer Parameter_ port.tid | 3 +- .../filesystem/filesystemadaptor.js | 2 + .../tiddlyweb/ServerControlPanel.tid | 20 - .../tiddlyweb/config-tiddlers-filter.tid | 2 + .../tiddlyweb/configOfficialPluginLibrary.tid | 3 + plugins/tiddlywiki/tiddlyweb/css-tiddler.tid | 7 + .../tiddlyweb/html-div-skinny-tiddler.tid | 9 + plugins/tiddlywiki/tiddlyweb/icon-cloud.tid | 4 + .../tiddlyweb/javascript-tiddler.tid | 7 + plugins/tiddlywiki/tiddlyweb/save-offline.tid | 2 +- .../tiddlywiki/tiddlyweb/save-wiki-button.tid | 25 + plugins/tiddlywiki/tiddlyweb/styles.tid | 40 ++ .../tiddlyweb/syncer-actions-copy-logs.tid | 6 + .../tiddlyweb/syncer-actions-login-status.tid | 9 + .../tiddlyweb/syncer-actions-login.tid | 8 + .../tiddlyweb/syncer-actions-logout.tid | 8 + .../tiddlyweb/syncer-actions-refresh.tid | 9 + .../syncer-actions-save-snapshot.tid | 9 + .../tiddlyweb/tags-syncerdropdown.tid | 2 + .../tiddlywiki/tiddlyweb/tiddlywebadaptor.js | 16 +- themes/tiddlywiki/vanilla/base.tid | 26 +- 41 files changed, 722 insertions(+), 324 deletions(-) create mode 100644 core/templates/html-div-skinny-tiddler.tid create mode 100644 core/wiki/config/ServerExternalFiltersDefault.tid delete mode 100644 plugins/tiddlywiki/tiddlyweb/ServerControlPanel.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/css-tiddler.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/html-div-skinny-tiddler.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/icon-cloud.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/javascript-tiddler.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/styles.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/syncer-actions-copy-logs.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/syncer-actions-login-status.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/syncer-actions-login.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/syncer-actions-logout.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/syncer-actions-save-snapshot.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/tags-syncerdropdown.tid diff --git a/core/language/en-GB/Fields.multids b/core/language/en-GB/Fields.multids index 6b4823c02..d1eeabd42 100644 --- a/core/language/en-GB/Fields.multids +++ b/core/language/en-GB/Fields.multids @@ -35,3 +35,4 @@ title: The unique name of a tiddler toc-link: Suppresses the tiddler's link in a Table of Contents tree if set to: ''no'' type: The content type of a tiddler version: Version information for a plugin +_is_skinny: If present, indicates that the tiddler text field must be loaded from the server diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index ee1d0320e..861bb6899 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -28,6 +28,7 @@ Error/Filter: Filter error Error/FilterSyntax: Syntax error in filter expression Error/IsFilterOperator: Filter Error: Unknown operand for the 'is' filter operator Error/LoadingPluginLibrary: Error loading plugin library +Error/NetworkErrorAlert: `<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.` Error/RecursiveTransclusion: Recursive transclusion error in transclude widget Error/RetrievingSkinny: Error retrieving skinny tiddler list Error/SavingToTWEdit: Error saving to TWEdit diff --git a/core/modules/server/routes/get-file.js b/core/modules/server/routes/get-file.js index 3429c4cd2..2a0ef647a 100644 --- a/core/modules/server/routes/get-file.js +++ b/core/modules/server/routes/get-file.js @@ -19,22 +19,16 @@ exports.path = /^\/files\/(.+)$/; exports.handler = function(request,response,state) { var path = require("path"), fs = require("fs"), - util = require("util"); - var filename = path.resolve($tw.boot.wikiPath,"files",decodeURIComponent(state.params[0])), + util = require("util"), + suppliedFilename = decodeURIComponent(state.params[0]), + filename = path.resolve($tw.boot.wikiPath,"files",suppliedFilename), extension = path.extname(filename); fs.readFile(filename,function(err,content) { var status,content,type = "text/plain"; if(err) { - if(err.code === "ENOENT") { - status = 404; - content = "File '" + filename + "' not found"; - } else if(err.code === "EACCES") { - status = 403; - content = "You do not have permission to access the file '" + filename + "'"; - } else { - status = 500; - content = err.toString(); - } + console.log("Error accessing file " + filename + ": " + err.toString()); + status = 404; + content = "File '" + suppliedFilename + "' not found"; } else { status = 200; content = content; diff --git a/core/modules/server/routes/get-tiddlers-json.js b/core/modules/server/routes/get-tiddlers-json.js index 3ece35ce1..8e93733e4 100644 --- a/core/modules/server/routes/get-tiddlers-json.js +++ b/core/modules/server/routes/get-tiddlers-json.js @@ -3,7 +3,7 @@ title: $:/core/modules/server/routes/get-tiddlers-json.js type: application/javascript module-type: route -GET /recipes/default/tiddlers/tiddlers.json +GET /recipes/default/tiddlers/tiddlers.json?filter=<filter> \*/ (function() { @@ -12,23 +12,34 @@ GET /recipes/default/tiddlers/tiddlers.json /*global $tw: false */ "use strict"; +var DEFAULT_FILTER = "[all[tiddlers]!is[system]sort[title]]"; + exports.method = "GET"; exports.path = /^\/recipes\/default\/tiddlers.json$/; exports.handler = function(request,response,state) { + var filter = state.queryParameters.filter || DEFAULT_FILTER; + if($tw.wiki.getTiddlerText("$:/config/Server/AllowAllExternalFilters") !== "yes") { + if($tw.wiki.getTiddlerText("$:/config/Server/ExternalFilters/" + filter) !== "yes") { + console.log("Blocked attempt to GET /recipes/default/tiddlers/tiddlers.json with filter: " + filter); + response.writeHead(403); + response.end(); + return; + } + } + var excludeFields = (state.queryParameters.exclude || "text").split(","), + titles = state.wiki.filterTiddlers(filter); response.writeHead(200, {"Content-Type": "application/json"}); var tiddlers = []; - state.wiki.forEachTiddler({sortField: "title"},function(title,tiddler) { - var tiddlerFields = {}; - $tw.utils.each(tiddler.fields,function(field,name) { - if(name !== "text") { - tiddlerFields[name] = tiddler.getFieldString(name); - } - }); - tiddlerFields.revision = state.wiki.getChangeCount(title); - tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; - tiddlers.push(tiddlerFields); + $tw.utils.each(titles,function(title) { + var tiddler = state.wiki.getTiddler(title); + if(tiddler) { + var tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields}); + tiddlerFields.revision = state.wiki.getChangeCount(title); + tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; + tiddlers.push(tiddlerFields); + } }); var text = JSON.stringify(tiddlers); response.end(text,"utf8"); diff --git a/core/modules/server/server.js b/core/modules/server/server.js index 3225b95f3..3226cacd7 100644 --- a/core/modules/server/server.js +++ b/core/modules/server/server.js @@ -16,7 +16,8 @@ if($tw.node) { var util = require("util"), fs = require("fs"), url = require("url"), - path = require("path"); + path = require("path"), + querystring = require("querystring"); } /* @@ -162,6 +163,7 @@ Server.prototype.requestHandler = function(request,response) { state.wiki = self.wiki; state.server = self; state.urlInfo = url.parse(request.url); + state.queryParameters = querystring.parse(state.urlInfo.query); // Get the principals authorized to access this resource var authorizationType = this.methodMappings[request.method] || "readers"; // Check for the CSRF header if this is a write @@ -236,6 +238,7 @@ host: optional host address (falls back to value of "host" variable) prefix: optional prefix (falls back to value of "path-prefix" variable) */ Server.prototype.listen = function(port,host,prefix) { + var self = this; // Handle defaults for port and host port = port || this.get("port"); host = host || this.get("host"); @@ -244,19 +247,24 @@ Server.prototype.listen = function(port,host,prefix) { if(parseInt(port,10).toString() !== port) { port = process.env[port] || 8080; } - $tw.utils.log("Serving on " + this.protocol + "://" + host + ":" + port + prefix,"brown/orange"); - $tw.utils.log("(press ctrl-C to exit)","red"); // Warn if required plugins are missing if(!$tw.wiki.getTiddler("$:/plugins/tiddlywiki/tiddlyweb") || !$tw.wiki.getTiddler("$:/plugins/tiddlywiki/filesystem")) { $tw.utils.warning("Warning: Plugins required for client-server operation (\"tiddlywiki/filesystem\" and \"tiddlywiki/tiddlyweb\") are missing from tiddlywiki.info file"); } - // Listen + // Create the server var server; if(this.listenOptions) { server = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this)); } else { server = this.transport.createServer(this.requestHandler.bind(this)); } + // 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() { + var address = server.address(); + $tw.utils.log("Serving on " + self.protocol + "://" + address.address + ":" + address.port + prefix,"brown/orange"); + $tw.utils.log("(press ctrl-C to exit)","red"); + }); + // Listen return server.listen(port,host); }; diff --git a/core/modules/startup/startup.js b/core/modules/startup/startup.js index 4cd53dfcd..ad1416bf3 100755 --- a/core/modules/startup/startup.js +++ b/core/modules/startup/startup.js @@ -128,7 +128,7 @@ exports.startup = function() { // Set up the syncer object if we've got a syncadaptor if($tw.syncadaptor) { $tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor}); - } + } // Setup the saver handler $tw.saverHandler = new $tw.SaverHandler({ wiki: $tw.wiki, diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 0b84be750..f39646eac 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -3,7 +3,7 @@ title: $:/core/modules/syncer.js type: application/javascript module-type: global -The syncer tracks changes to the store. If a syncadaptor is used then individual tiddlers are synchronised through it. If there is no syncadaptor then the entire wiki is saved via saver modules. +The syncer tracks changes to the store and synchronises them to a remote data store represented as a "sync adaptor" \*/ (function(){ @@ -23,8 +23,10 @@ Syncer.prototype.titleSyncFilter = "$:/config/SyncFilter"; Syncer.prototype.titleSyncPollingInterval = "$:/config/SyncPollingInterval"; Syncer.prototype.titleSyncDisableLazyLoading = "$:/config/SyncDisableLazyLoading"; Syncer.prototype.titleSavedNotification = "$:/language/Notifications/Save/Done"; +Syncer.prototype.titleSyncThrottleInterval = "$:/config/SyncThrottleInterval"; Syncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer Syncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s... +Syncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error Syncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s Syncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor @@ -36,6 +38,7 @@ wiki: wiki to be synced function Syncer(options) { var self = this; this.wiki = options.wiki; + // Save parameters this.syncadaptor = options.syncadaptor; this.disableUI = !!options.disableUI; this.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn; @@ -43,27 +46,54 @@ function Syncer(options) { this.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter; this.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification; this.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval; - this.throttleInterval = options.throttleInterval || this.throttleInterval; + this.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,""),10) || this.throttleInterval; + this.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval; this.fallbackInterval = options.fallbackInterval || this.fallbackInterval; this.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,""),10) || this.pollTimerInterval; this.logging = "logging" in options ? options.logging : true; // Make a logger this.logger = new $tw.utils.Logger("syncer" + ($tw.browser ? "-browser" : "") + ($tw.node ? "-server" : "") + (this.syncadaptor.name ? ("-" + this.syncadaptor.name) : ""),{ - colour: "cyan", - enable: this.logging - }); + colour: "cyan", + enable: this.logging, + saveHistory: true + }); + if(this.syncadaptor.setLoggerSaveBuffer) { + this.syncadaptor.setLoggerSaveBuffer(this.logger); + } // Compile the dirty tiddler filter this.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter)); // Record information for known tiddlers this.readTiddlerInfo(); - // Tasks are {type: "load"/"save"/"delete", title:, queueTime:, lastModificationTime:} - this.taskQueue = {}; // Hashmap of tasks yet to be performed - this.taskInProgress = {}; // Hash of tasks in progress + this.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server + this.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server + // Timers this.taskTimerId = null; // Timer for task dispatch this.pollTimerId = null; // Timer for polling server + // Number of outstanding requests + this.numTasksInProgress = 0; // Listen out for changes to tiddlers this.wiki.addEventListener("change",function(changes) { - self.syncToServer(changes); + // Filter the changes to just include ones that are being synced + var filteredChanges = self.getSyncedTiddlers(function(callback) { + $tw.utils.each(changes,function(change,title) { + var tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title); + callback(tiddler,title); + }); + }); + if(filteredChanges.length > 0) { + self.processTaskQueue(); + } else { + // Look for deletions of tiddlers we're already syncing + var outstandingDeletion = false + $tw.utils.each(changes,function(change,title,object) { + if(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) { + outstandingDeletion = true; + } + }); + if(outstandingDeletion) { + self.processTaskQueue(); + } + } }); // Browser event handlers if($tw.browser && !this.disableUI) { @@ -86,6 +116,9 @@ function Syncer(options) { $tw.rootWidget.addEventListener("tm-server-refresh",function() { self.handleRefreshEvent(); }); + $tw.rootWidget.addEventListener("tm-copy-syncer-logs-to-clipboard",function() { + $tw.utils.copyToClipboard($tw.utils.getSystemInfo() + "\n\nLog:\n" + self.logger.getBuffer()); + }); } // Listen out for lazyLoad events if(!this.disableUI && $tw.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== "yes") { @@ -100,45 +133,83 @@ function Syncer(options) { }); } +/* +Show a generic network error alert +*/ +Syncer.prototype.showErrorAlert = function() { +console.log($tw.language.getString("Error/NetworkErrorAlert")) + this.logger.alert($tw.language.getString("Error/NetworkErrorAlert")); +}; + +/* +Return an array of the tiddler titles that are subjected to syncing +*/ +Syncer.prototype.getSyncedTiddlers = function(source) { + return this.filterFn.call(this.wiki,source); +}; + +/* +Return an array of the tiddler titles that are subjected to syncing +*/ +Syncer.prototype.getTiddlerRevision = function(title) { + if(this.syncadaptor && this.syncadaptor.getTiddlerRevision) { + return this.syncadaptor.getTiddlerRevision(title); + } else { + return this.wiki.getTiddler(title).fields.revision; + } +}; + /* Read (or re-read) the latest tiddler info from the store */ Syncer.prototype.readTiddlerInfo = function() { // Hashmap by title of {revision:,changeCount:,adaptorInfo:} + // "revision" is the revision of the tiddler last seen on the server, and "changecount" is the corresponding local changecount this.tiddlerInfo = {}; // Record information for known tiddlers var self = this, - tiddlers = this.filterFn.call(this.wiki); + tiddlers = this.getSyncedTiddlers(); $tw.utils.each(tiddlers,function(title) { - var tiddler = self.wiki.getTiddler(title); + var tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title); self.tiddlerInfo[title] = { - revision: tiddler.fields.revision, + revision: self.getTiddlerRevision(title), adaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler), - changeCount: self.wiki.getChangeCount(title), - hasBeenLazyLoaded: false + changeCount: self.wiki.getChangeCount(title) }; }); }; -/* -Create an tiddlerInfo structure if it doesn't already exist -*/ -Syncer.prototype.createTiddlerInfo = function(title) { - if(!$tw.utils.hop(this.tiddlerInfo,title)) { - this.tiddlerInfo[title] = { - revision: null, - adaptorInfo: {}, - changeCount: -1, - hasBeenLazyLoaded: false - }; - } -}; - /* Checks whether the wiki is dirty (ie the window shouldn't be closed) */ Syncer.prototype.isDirty = function() { - return (this.numTasksInQueue() > 0) || (this.numTasksInProgress() > 0); + this.logger.log("Checking dirty status"); + // Check tiddlers that are in the store and included in the filter function + var titles = this.getSyncedTiddlers(); + for(var index=0; index<titles.length; index++) { + var title = titles[index], + tiddlerInfo = this.tiddlerInfo[title]; + if(this.wiki.tiddlerExists(title)) { + if(tiddlerInfo) { + // If the tiddler is known on the server and has been modified locally then it needs to be saved to the server + if($tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount) { + return true; + } + } else { + // If the tiddler isn't known on the server then it needs to be saved to the server + return true; + } + } + } + // Check tiddlers that are known from the server but not currently in the store + titles = Object.keys(this.tiddlerInfo); + for(index=0; index<titles.length; index++) { + if(!this.wiki.tiddlerExists(titles[index])) { + // There must be a pending delete + return true; + } + } + return false; }; /* @@ -146,23 +217,26 @@ Update the document body with the class "tc-dirty" if the wiki has unsaved/unsyn */ Syncer.prototype.updateDirtyStatus = function() { if($tw.browser && !this.disableUI) { - $tw.utils.toggleClass(document.body,"tc-dirty",this.isDirty()); + var dirty = this.isDirty(); + $tw.utils.toggleClass(document.body,"tc-dirty",dirty); + if(!dirty) { + this.logger.clearAlerts(); + } } }; /* Save an incoming tiddler in the store, and updates the associated tiddlerInfo */ -Syncer.prototype.storeTiddler = function(tiddlerFields,hasBeenLazyLoaded) { +Syncer.prototype.storeTiddler = function(tiddlerFields) { // Save the tiddler var tiddler = new $tw.Tiddler(tiddlerFields); this.wiki.addTiddler(tiddler); // Save the tiddler revision and changeCount details this.tiddlerInfo[tiddlerFields.title] = { - revision: tiddlerFields.revision, + revision: this.getTiddlerRevision(tiddlerFields.title), adaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler), - changeCount: this.wiki.getChangeCount(tiddlerFields.title), - hasBeenLazyLoaded: hasBeenLazyLoaded !== undefined ? hasBeenLazyLoaded : true + changeCount: this.wiki.getChangeCount(tiddlerFields.title) }; }; @@ -176,14 +250,14 @@ Syncer.prototype.getStatus = function(callback) { this.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) { if(err) { self.logger.alert(err); - return; - } - // Set the various status tiddlers - self.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? "yes" : "no"}); - self.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? "yes" : "no"}); - self.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? "yes" : "no"}); - if(isLoggedIn) { - self.wiki.addTiddler({title: self.titleUserName,text: username || ""}); + } else { + // Set the various status tiddlers + self.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? "yes" : "no"}); + self.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? "yes" : "no"}); + self.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? "yes" : "no"}); + if(isLoggedIn) { + self.wiki.addTiddler({title: self.titleUserName,text: username || ""}); + } } // Invoke the callback if(callback) { @@ -199,91 +273,112 @@ Syncer.prototype.getStatus = function(callback) { Synchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date */ Syncer.prototype.syncFromServer = function() { - if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) { - this.logger.log("Retrieving skinny tiddler list"); - var self = this; - if(this.pollTimerId) { - clearTimeout(this.pollTimerId); - this.pollTimerId = null; - } - this.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) { - // Trigger the next sync + var self = this, + cancelNextSync = function() { + if(self.pollTimerId) { + clearTimeout(self.pollTimerId); + self.pollTimerId = null; + } + }, + triggerNextSync = function() { self.pollTimerId = setTimeout(function() { self.pollTimerId = null; self.syncFromServer.call(self); },self.pollTimerInterval); - // Check for errors + }; + if(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) { + this.logger.log("Retrieving updated tiddler list"); + cancelNextSync(); + this.syncadaptor.getUpdatedTiddlers(self,function(err,updates) { + triggerNextSync(); if(err) { - self.logger.alert($tw.language.getString("Error/RetrievingSkinny") + ":",err); + self.showErrorAlert(); + self.logger.log($tw.language.getString("Error/RetrievingSkinny") + ":",err); return; } + if(updates) { + $tw.utils.each(updates.modifications,function(title) { + self.titlesToBeLoaded[title] = true; + }); + $tw.utils.each(updates.deletions,function(title) { + delete self.tiddlerInfo[title]; + self.logger.log("Deleting tiddler missing from server:",title); + self.wiki.deleteTiddler(title); + }); + if(updates.modifications.length > 0 || updates.deletions.length > 0) { + self.processTaskQueue(); + } + } + }); + } else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) { + this.logger.log("Retrieving skinny tiddler list"); + cancelNextSync(); + this.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) { + triggerNextSync(); + // Check for errors + if(err) { + self.showErrorAlert(); + self.logger.log($tw.language.getString("Error/RetrievingSkinny") + ":",err); + return; + } + // Keep track of which tiddlers we already know about have been reported this time + var previousTitles = Object.keys(self.tiddlerInfo); // Process each incoming tiddler for(var t=0; t<tiddlers.length; t++) { // Get the incoming tiddler fields, and the existing tiddler var tiddlerFields = tiddlers[t], incomingRevision = tiddlerFields.revision + "", - tiddler = self.wiki.getTiddler(tiddlerFields.title), + tiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title), tiddlerInfo = self.tiddlerInfo[tiddlerFields.title], - currRevision = tiddlerInfo ? tiddlerInfo.revision : null; + currRevision = tiddlerInfo ? tiddlerInfo.revision : null, + indexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title); + if(indexInPreviousTitles !== -1) { + previousTitles.splice(indexInPreviousTitles,1); + } // Ignore the incoming tiddler if it's the same as the revision we've already got if(currRevision !== incomingRevision) { - // Do a full load if we've already got a fat version of the tiddler - if(tiddler && tiddler.fields.text !== undefined) { - // Do a full load of this tiddler - self.enqueueSyncTask({ - type: "load", - title: tiddlerFields.title - }); - } else { - // Load the skinny version of the tiddler - self.storeTiddler(tiddlerFields,false); + // Only load the skinny version if we don't already have a fat version of the tiddler + if(!tiddler || tiddler.fields.text === undefined) { + self.storeTiddler(tiddlerFields); } + // Do a full load of this tiddler + self.titlesToBeLoaded[tiddlerFields.title] = true; } } + // Delete any tiddlers that were previously reported but missing this time + $tw.utils.each(previousTitles,function(title) { + delete self.tiddlerInfo[title]; + self.logger.log("Deleting tiddler missing from server:",title); + self.wiki.deleteTiddler(title); + }); + self.processTaskQueue(); }); } }; /* -Synchronise a set of changes to the server +Force load a tiddler from the server */ -Syncer.prototype.syncToServer = function(changes) { - var self = this, - now = Date.now(), - filteredChanges = this.filterFn.call(this.wiki,function(callback) { - $tw.utils.each(changes,function(change,title) { - var tiddler = self.wiki.getTiddler(title); - callback(tiddler,title); - }); - }); - $tw.utils.each(changes,function(change,title,object) { - // Process the change if it is a deletion of a tiddler we're already syncing, or is on the filtered change list - if((change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) || filteredChanges.indexOf(title) !== -1) { - // Queue a task to sync this tiddler - self.enqueueSyncTask({ - type: change.deleted ? "delete" : "save", - title: title - }); - } - }); +Syncer.prototype.enqueueLoadTiddler = function(title) { + this.titlesToBeLoaded[title] = true; + this.processTaskQueue(); }; /* Lazily load a skinny tiddler if we can */ Syncer.prototype.handleLazyLoadEvent = function(title) { + // Ignore if the syncadaptor doesn't handle it + if(!this.syncadaptor.supportsLazyLoading) { + return; + } // Don't lazy load the same tiddler twice - var info = this.tiddlerInfo[title]; - if(!info || !info.hasBeenLazyLoaded) { + if(!this.titlesHaveBeenLazyLoaded[title]) { // Don't lazy load if the tiddler isn't included in the sync filter - if(this.filterFn.call(this.wiki).indexOf(title) !== -1) { - this.createTiddlerInfo(title); - this.tiddlerInfo[title].hasBeenLazyLoaded = true; - // Queue up a sync task to load this tiddler - this.enqueueSyncTask({ - type: "load", - title: title - }); + if(this.getSyncedTiddlers().indexOf(title) !== -1) { + // Mark the tiddler as needing loading, and having already been lazily loaded + this.titlesToBeLoaded[title] = true; + this.titlesHaveBeenLazyLoaded[title] = true; } } }; @@ -294,7 +389,7 @@ Dispay a password prompt and allow the user to login Syncer.prototype.handleLoginEvent = function() { var self = this; this.getStatus(function(err,isLoggedIn,username) { - if(!isLoggedIn) { + if(!err && !isLoggedIn) { $tw.passwordPrompt.createPrompt({ serviceName: $tw.language.getString("LoginToTiddlySpace"), callback: function(data) { @@ -324,7 +419,7 @@ Syncer.prototype.login = function(username,password,callback) { } self.getStatus(function(err,isLoggedIn,username) { if(callback) { - callback(null,isLoggedIn); + callback(err,isLoggedIn); } }); }); @@ -358,189 +453,180 @@ Syncer.prototype.handleRefreshEvent = function() { }; /* -Queue up a sync task. If there is already a pending task for the tiddler, just update the last modification time +Process the next task */ -Syncer.prototype.enqueueSyncTask = function(task) { - var self = this, - now = Date.now(); - // Set the timestamps on this task - task.queueTime = now; - task.lastModificationTime = now; - // Fill in some tiddlerInfo if the tiddler is one we haven't seen before - this.createTiddlerInfo(task.title); - // Bail if this is a save and the tiddler is already at the changeCount that the server has - if(task.type === "save" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) { - return; - } - // Check if this tiddler is already in the queue - if($tw.utils.hop(this.taskQueue,task.title)) { - // this.logger.log("Re-queueing up sync task with type:",task.type,"title:",task.title); - var existingTask = this.taskQueue[task.title]; - // If so, just update the last modification time - existingTask.lastModificationTime = task.lastModificationTime; - // If the new task is a save then we upgrade the existing task to a save. Thus a pending load is turned into a save if the tiddler changes locally in the meantime. But a pending save is not modified to become a load - if(task.type === "save" || task.type === "delete") { - existingTask.type = task.type; +Syncer.prototype.processTaskQueue = function() { + var self = this; + // Only process a task if the sync adaptor is fully initialised and we're not already performing + // a task. If we are already performing a task then we'll dispatch the next one when it completes + if((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) { + // Choose the next task to perform + var task = this.chooseNextTask(); + // Perform the task if we had one + if(typeof task === "object" && task !== null) { + this.numTasksInProgress += 1; + task.run(function(err) { + self.numTasksInProgress -= 1; + if(err) { + self.showErrorAlert(); + self.logger.log("Sync error while processing " + task.type + " of '" + task.title + "':\n" + err); + self.updateDirtyStatus(); + self.triggerTimeout(self.errorRetryInterval); + } else { + self.updateDirtyStatus(); + // Process the next task + self.processTaskQueue.call(self); + } + }); + } else { + // No task is ready so update the status + this.updateDirtyStatus(); + // And trigger a timeout if there is a pending task + if(task === true) { + this.triggerTimeout(); + } } } else { - // this.logger.log("Queuing up sync task with type:",task.type,"title:",task.title); - // If it is not in the queue, insert it - this.taskQueue[task.title] = task; - this.updateDirtyStatus(); + this.updateDirtyStatus(); } - // Process the queue - $tw.utils.nextTick(function() {self.processTaskQueue.call(self);}); }; -/* -Return the number of tasks in progress -*/ -Syncer.prototype.numTasksInProgress = function() { - return $tw.utils.count(this.taskInProgress); -}; - -/* -Return the number of tasks in the queue -*/ -Syncer.prototype.numTasksInQueue = function() { - return $tw.utils.count(this.taskQueue); -}; - -/* -Trigger a timeout if one isn't already outstanding -*/ -Syncer.prototype.triggerTimeout = function() { +Syncer.prototype.triggerTimeout = function(interval) { var self = this; if(!this.taskTimerId) { this.taskTimerId = setTimeout(function() { self.taskTimerId = null; self.processTaskQueue.call(self); - },self.taskTimerInterval); + },interval || self.taskTimerInterval); } }; /* -Process the task queue, performing the next task if appropriate -*/ -Syncer.prototype.processTaskQueue = function() { - var self = this; - // Only process a task if the sync adaptor is fully initialised and we're not already performing a task. If we are already performing a task then we'll dispatch the next one when it completes - if((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress() === 0) { - // Choose the next task to perform - var task = this.chooseNextTask(); - // Perform the task if we had one - if(task) { - // Remove the task from the queue and add it to the in progress list - delete this.taskQueue[task.title]; - this.taskInProgress[task.title] = task; - this.updateDirtyStatus(); - // Dispatch the task - this.dispatchTask(task,function(err) { - if(err) { - self.logger.alert("Sync error while processing '" + task.title + "':\n" + err); - } - // Mark that this task is no longer in progress - delete self.taskInProgress[task.title]; - self.updateDirtyStatus(); - // Process the next task - self.processTaskQueue.call(self); - }); - } else { - // Make sure we've set a time if there wasn't a task to perform, but we've still got tasks in the queue - if(this.numTasksInQueue() > 0) { - this.triggerTimeout(); - } - } - } -}; +Choose the next sync task. We prioritise saves, then deletes, then loads from the server -/* -Choose the next applicable task +Returns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due */ Syncer.prototype.chooseNextTask = function() { - var self = this, - candidateTask = null, - now = Date.now(); - // Select the best candidate task - $tw.utils.each(this.taskQueue,function(task,title) { - // Exclude the task if there's one of the same name in progress - if($tw.utils.hop(self.taskInProgress,title)) { - return; + var thresholdLastSaved = (new Date()) - this.throttleInterval, + havePending = null; + // First we look for tiddlers that have been modified locally and need saving back to the server + var titles = this.getSyncedTiddlers(); + for(var index=0; index<titles.length; index++) { + var title = titles[index], + tiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title), + tiddlerInfo = this.tiddlerInfo[title]; + if(tiddler) { + // If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server + var hasChanged = !tiddlerInfo || $tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount, + isReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved; + if(hasChanged) { + if(isReadyToSave) { + return new SaveTiddlerTask(this,title); + } else { + havePending = true; + } + } } - // Exclude the task if it is a save and the tiddler has been modified recently, but not hit the fallback time - if(task.type === "save" && (now - task.lastModificationTime) < self.throttleInterval && - (now - task.queueTime) < self.fallbackInterval) { - return; + } + // Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server + titles = Object.keys(this.tiddlerInfo); + for(index=0; index<titles.length; index++) { + title = titles[index]; + tiddlerInfo = this.tiddlerInfo[title]; + tiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title); + if(!tiddler) { + return new DeleteTiddlerTask(this,title); } - // Exclude the task if it is newer than the current best candidate - if(candidateTask && candidateTask.queueTime < task.queueTime) { - return; - } - // Now this is our best candidate - candidateTask = task; - }); - return candidateTask; + } + // Check for tiddlers that need loading + title = Object.keys(this.titlesToBeLoaded)[0]; + if(title) { + delete this.titlesToBeLoaded[title]; + return new LoadTiddlerTask(this,title); + } + // No tasks are ready + return havePending; }; -/* -Dispatch a task and invoke the callback -*/ -Syncer.prototype.dispatchTask = function(task,callback) { - var self = this; - if(task.type === "save") { - var changeCount = this.wiki.getChangeCount(task.title), - tiddler = this.wiki.getTiddler(task.title); - this.logger.log("Dispatching 'save' task:",task.title); - if(tiddler) { - this.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) { - if(err) { - return callback(err); - } - // Adjust the info stored about this tiddler - self.tiddlerInfo[task.title] = { - changeCount: changeCount, - adaptorInfo: adaptorInfo, - revision: revision - }; - // Invoke the callback - callback(null); - },{ - tiddlerInfo: self.tiddlerInfo[task.title] - }); - } else { - this.logger.log(" Not Dispatching 'save' task:",task.title,"tiddler does not exist"); - return callback(null); - } - } else if(task.type === "load") { - // Load the tiddler - this.logger.log("Dispatching 'load' task:",task.title); - this.syncadaptor.loadTiddler(task.title,function(err,tiddlerFields) { +function SaveTiddlerTask(syncer,title) { + this.syncer = syncer; + this.title = title; + this.type = "save"; +} + +SaveTiddlerTask.prototype.run = function(callback) { + var self = this, + changeCount = this.syncer.wiki.getChangeCount(this.title), + tiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title); + this.syncer.logger.log("Dispatching 'save' task:",this.title); + if(tiddler) { + this.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) { + // If there's an error, exit without changing any internal state if(err) { return callback(err); } - // Store the tiddler - if(tiddlerFields) { - self.storeTiddler(tiddlerFields,true); - } + // Adjust the info stored about this tiddler + self.syncer.tiddlerInfo[self.title] = { + changeCount: changeCount, + adaptorInfo: adaptorInfo, + revision: revision, + timestampLastSaved: new Date() + }; // Invoke the callback callback(null); }); - } else if(task.type === "delete") { - // Delete the tiddler - this.logger.log("Dispatching 'delete' task:",task.title); - this.syncadaptor.deleteTiddler(task.title,function(err) { - if(err) { - return callback(err); - } - delete self.tiddlerInfo[task.title]; - // Invoke the callback - callback(null); - },{ - tiddlerInfo: self.tiddlerInfo[task.title] - }); + } else { + this.syncer.logger.log(" Not Dispatching 'save' task:",this.title,"tiddler does not exist"); + $tw.utils.nextTick(callback(null)); } }; +function DeleteTiddlerTask(syncer,title) { + this.syncer = syncer; + this.title = title; + this.type = "delete"; +} + +DeleteTiddlerTask.prototype.run = function(callback) { + var self = this; + this.syncer.logger.log("Dispatching 'delete' task:",this.title); + this.syncer.syncadaptor.deleteTiddler(this.title,function(err) { + // If there's an error, exit without changing any internal state + if(err) { + return callback(err); + } + // Remove the info stored about this tiddler + delete self.syncer.tiddlerInfo[self.title]; + // Invoke the callback + callback(null); + },{ + tiddlerInfo: self.syncer.tiddlerInfo[this.title] + }); +}; + +function LoadTiddlerTask(syncer,title) { + this.syncer = syncer; + this.title = title; + this.type = "load"; +} + +LoadTiddlerTask.prototype.run = function(callback) { + var self = this; + this.syncer.logger.log("Dispatching 'load' task:",this.title); + this.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) { + // If there's an error, exit without changing any internal state + if(err) { + return callback(err); + } + // Update the info stored about this tiddler + if(tiddlerFields) { + self.syncer.storeTiddler(tiddlerFields); + } + // Invoke the callback + callback(null); + }); +}; + exports.Syncer = Syncer; })(); diff --git a/core/modules/utils/dom/http.js b/core/modules/utils/dom/http.js index 77cb67c24..2f6439417 100644 --- a/core/modules/utils/dom/http.js +++ b/core/modules/utils/dom/http.js @@ -22,6 +22,7 @@ A quick and dirty HTTP function; to be refactored later. Options are: */ exports.httpRequest = function(options) { var type = options.type || "GET", + url = options.url, headers = options.headers || {accept: "application/json"}, returnProp = options.returnProp || "responseText", request = new XMLHttpRequest(), @@ -36,7 +37,11 @@ exports.httpRequest = function(options) { $tw.utils.each(options.data,function(dataItem,dataItemTitle) { results.push(dataItemTitle + "=" + encodeURIComponent(dataItem)); }); - data = results.join("&"); + if(type === "GET" || type === "HEAD") { + url += "?" + results.join("&"); + } else { + data = results.join("&"); + } } } // Set up the state change handler @@ -52,7 +57,7 @@ exports.httpRequest = function(options) { } }; // Make the request - request.open(type,options.url,true); + request.open(type,url,true); if(headers) { $tw.utils.each(headers,function(header,headerTitle,object) { request.setRequestHeader(headerTitle,header); diff --git a/core/modules/utils/logger.js b/core/modules/utils/logger.js index f194d78b3..b3981986d 100644 --- a/core/modules/utils/logger.js +++ b/core/modules/utils/logger.js @@ -22,15 +22,42 @@ function Logger(componentName,options) { this.componentName = componentName || ""; this.colour = options.colour || "white"; this.enable = "enable" in options ? options.enable : true; + this.save = "save" in options ? options.save : true; + this.saveLimit = options.saveLimit || 100 * 1024; + this.saveBufferLogger = this; + this.buffer = ""; + this.alertCount = 0; } +Logger.prototype.setSaveBuffer = function(logger) { + this.saveBufferLogger = logger; +}; + /* Log a message */ Logger.prototype.log = function(/* args */) { - if(this.enable && console !== undefined && console.log !== undefined) { - 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())); - } + var self = this; + if(this.enable) { + if(this.saveBufferLogger.save) { + this.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),"YYYY MM DD 0hh:0mm:0ss.0XXX") + ":"; + $tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) { + self.saveBufferLogger.buffer += " " + arg; + }); + this.saveBufferLogger.buffer += "\n"; + this.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit); + } + if(console !== undefined && console.log !== undefined) { + 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())); + } + } +}; + +/* +Read the message buffer +*/ +Logger.prototype.getBuffer = function() { + return this.saveBufferLogger.buffer; }; /* @@ -70,6 +97,7 @@ Logger.prototype.alert = function(/* args */) { component: this.componentName }; existingCount = 0; + this.alertCount += 1; } alertFields.modified = new Date(); if(++existingCount > 1) { @@ -87,6 +115,22 @@ Logger.prototype.alert = function(/* args */) { } }; +/* +Clear outstanding alerts +*/ +Logger.prototype.clearAlerts = function() { + var self = this; + if($tw.browser && this.alertCount > 0) { + $tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) { + var tiddler = $tw.wiki.getTiddler(title); + if(tiddler.fields.component === self.componentName) { + $tw.wiki.deleteTiddler(title); + } + }); + this.alertCount = 0; + } +}; + exports.Logger = Logger; })(); diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 26fed0f3c..8d8c294d9 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -783,4 +783,22 @@ exports.strEndsWith = function(str,ending,position) { } }; +/* +Return system information useful for debugging +*/ +exports.getSystemInfo = function(str,ending,position) { + var results = [], + save = function(desc,value) { + results.push(desc + ": " + value); + }; + if($tw.browser) { + save("User Agent",navigator.userAgent); + save("Online Status",window.navigator.onLine); + } + if($tw.node) { + save("Node Version",process.version); + } + return results.join("\n"); +}; + })(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index d44940cb6..f734650de 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1246,9 +1246,9 @@ exports.getTiddlerText = function(title,defaultText) { if(!tiddler) { return defaultText; } - if(tiddler.fields.text !== undefined) { + if(!tiddler.hasField("_is_skinny")) { // Just return the text if we've got it - return tiddler.fields.text; + return tiddler.fields.text || ""; } else { // Tell any listeners about the need to lazily load this tiddler this.dispatchEvent("lazyLoad",title); diff --git a/core/templates/html-div-skinny-tiddler.tid b/core/templates/html-div-skinny-tiddler.tid new file mode 100644 index 000000000..eaf388605 --- /dev/null +++ b/core/templates/html-div-skinny-tiddler.tid @@ -0,0 +1,9 @@ +title: $:/core/templates/html-div-skinny-tiddler + +<!-- + +This template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field) + +-->`<div`<$fields template=' $name$="$encoded_value$"'></$fields>`> +<pre></pre> +</div>` diff --git a/core/templates/save-lazy-all.tid b/core/templates/save-lazy-all.tid index 5f9220e19..bf7f9f606 100644 --- a/core/templates/save-lazy-all.tid +++ b/core/templates/save-lazy-all.tid @@ -3,4 +3,7 @@ title: $:/core/save/lazy-all \define saveTiddlerFilter() [is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \end +\define skinnySaveTiddlerFilter() +[!is[system]] +\end {{$:/core/templates/tiddlywiki5.html}} diff --git a/core/templates/save-lazy-images.tid b/core/templates/save-lazy-images.tid index ff3204729..62334f0db 100644 --- a/core/templates/save-lazy-images.tid +++ b/core/templates/save-lazy-images.tid @@ -3,4 +3,7 @@ title: $:/core/save/lazy-images \define saveTiddlerFilter() [is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \end +\define skinnySaveTiddlerFilter() +[is[image]] +\end {{$:/core/templates/tiddlywiki5.html}} diff --git a/core/templates/store.area.template.html.tid b/core/templates/store.area.template.html.tid index 3563da318..bd9232be3 100644 --- a/core/templates/store.area.template.html.tid +++ b/core/templates/store.area.template.html.tid @@ -3,6 +3,7 @@ title: $:/core/templates/store.area.template.html <$reveal type="nomatch" state="$:/isEncrypted" text="yes"> `<div id="storeArea" style="display:none;">` <$list filter=<<saveTiddlerFilter>> template="$:/core/templates/html-div-tiddler"/> +<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template="$:/core/templates/html-div-skinny-tiddler"/> `</div>` </$reveal> <$reveal type="match" state="$:/isEncrypted" text="yes"> diff --git a/core/ui/AlertTemplate.tid b/core/ui/AlertTemplate.tid index bcfc3c3fa..84b9632f7 100644 --- a/core/ui/AlertTemplate.tid +++ b/core/ui/AlertTemplate.tid @@ -2,10 +2,12 @@ title: $:/core/ui/AlertTemplate <div class="tc-alert"> <div class="tc-alert-toolbar"> -<$button class="tc-btn-invisible"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/delete-button}}</$button> +<$button class="tc-btn-invisible"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button> </div> <div class="tc-alert-subtitle"> -<$view field="component"/> - <$view field="modified" format="date" template="0hh:0mm:0ss DD MM YYYY"/> <$reveal type="nomatch" state="!!count" text=""><span class="tc-alert-highlight">({{$:/language/Count}}: <$view field="count"/>)</span></$reveal> +<$wikify name="format" text=<<lingo Tiddler/DateFormat>>> +<$view field="component"/> - <$view field="modified" format="date" template=<<format>>/> <$reveal type="nomatch" state="!!count" text=""><span class="tc-alert-highlight">({{$:/language/Count}}: <$view field="count"/>)</span></$reveal> +</$wikify> </div> <div class="tc-alert-body"> diff --git a/core/wiki/config/ServerExternalFiltersDefault.tid b/core/wiki/config/ServerExternalFiltersDefault.tid new file mode 100644 index 000000000..7ef93ecf3 --- /dev/null +++ b/core/wiki/config/ServerExternalFiltersDefault.tid @@ -0,0 +1,2 @@ +title: $:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]] +text: yes diff --git a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid index 6fdc6af3c..6f88fb9a5 100644 --- a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid +++ b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid @@ -1,5 +1,5 @@ created: 20130825162100000 -modified: 20140814094907624 +modified: 20200113094126878 tags: dev moduletypes title: SyncAdaptorModules type: text/vnd.tiddlywiki @@ -14,6 +14,8 @@ SyncAdaptorModules encapsulate storage mechanisms that can be used by the SyncMe SyncAdaptorModules are represented as JavaScript tiddlers with the field `module-type` set to `syncadaptor`. +See [[this pull request|https://github.com/Jermolene/TiddlyWiki5/pull/4373]] for background on the evolution of this API. + ! Exports The following properties should be exposed via the `exports` object: @@ -47,12 +49,21 @@ Gets the supplemental information that the adaptor needs to keep track of for a Returns an object storing any additional information required by the adaptor. +!! `getTiddlerRevision(title)` + +Gets the revision ID associated with the specified tiddler title. + +|!Parameter |!Description | +|title |Tiddler title | + +Returns a revision ID. + !! `getStatus(callback)` Retrieves status information from the server. This method is optional. |!Parameter |!Description | -|callback |Callback function invoked with parameters `err,isLoggedIn,username` | +|callback |Callback function invoked with parameters `err,isLoggedIn,username,isReadOnly` | !! `login(username,password,callback)` @@ -70,16 +81,39 @@ Attempts to logout of the server. This method is optional. |!Parameter |!Description | |callback |Callback function invoked with parameter `err` | +!! `getUpdatedTiddlers(syncer,callback)` + +Retrieves the titles of tiddlers that need to be updated from the server. + +This method is optional. If an adaptor doesn't implement it then synchronisation will be unidirectional from the TiddlyWiki store to the adaptor, but not the other way. + +The syncer will use the `getUpdatedTiddlers()` method in preference to the `getSkinnyTiddlers()` method. + +|!Parameter |!Description | +|syncer |Reference to the syncer object making the call | +|callback |Callback function invoked with parameter `err,data` -- see below | + +The data provided by the callback is as follows: + +``` +{ +modifications: [<array of title>], +deletions: [<array of title>], +} +``` + !! `getSkinnyTiddlers(callback)` Retrieves a list of skinny tiddlers from the server. This method is optional. If an adaptor doesn't implement it then synchronisation will be unidirectional from the TiddlyWiki store to the adaptor, but not the other way. +The syncer will use the `getUpdatedTiddlers()` method in preference to the `getSkinnyTiddlers()` method. + |!Parameter |!Description | |callback |Callback function invoked with parameter `err,tiddlers`, where `tiddlers` is an array of tiddler field objects | -!! `saveTiddler(tiddler,callback,tiddlerInfo)` +!! `saveTiddler(tiddler,callback)` Saves a tiddler to the server. @@ -96,11 +130,16 @@ Loads a tiddler from the server. |title |Title of tiddler to be retrieved | |callback |Callback function invoked with parameter `err,tiddlerFields` | -!! `deleteTiddler(title,callback,tiddlerInfo)` +!! `deleteTiddler(title,callback,options)` Delete a tiddler from the server. |!Parameter |!Description | |title |Title of tiddler to be deleted | |callback |Callback function invoked with parameter `err` | +|options |See below | + +The options parameter contains the following properties: + +|!Property |!Description | |tiddlerInfo |The tiddlerInfo maintained by the syncer for this tiddler | diff --git a/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid b/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid index 0a0c07c7e..ced343454 100644 --- a/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid +++ b/editions/tw5.com/tiddlers/concepts/TiddlerFields.tid @@ -1,5 +1,5 @@ created: 20130825213300000 -modified: 20191013093910961 +modified: 20191206152031468 tags: Concepts title: TiddlerFields type: text/vnd.tiddlywiki @@ -42,11 +42,13 @@ Other fields used by the core are: |`subtitle` |<<lingo subtitle>> | |`throttle.refresh` |<<lingo throttle.refresh>> | |`toc-link`|<<lingo toc-link>>| +|`_canonical_uri`|<<lingo _canonical_uri>>| The TiddlyWebAdaptor uses a few more fields: |!Field Name |!Description | |`bag` |<<lingo bag>> | |`revision` |<<lingo revision>> | +|`_is_skinny` |<<lingo _is_skinny>> | Details of the fields used in this ~TiddlyWiki are shown in the [[control panel|$:/ControlPanel]] {{$:/core/ui/Buttons/control-panel}} under the <<.controlpanel-tab Info>> tab >> <<.info-tab Advanced>> sub-tab >> Tiddler Fields diff --git a/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid b/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid index 98119804c..52ca8964f 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer API_ Get All Tiddlers.tid @@ -1,5 +1,5 @@ created: 20181002131215403 -modified: 20190903094711346 +modified: 2020031109590546 tags: [[WebServer API]] title: WebServer API: Get All Tiddlers type: text/vnd.tiddlywiki @@ -12,11 +12,23 @@ GET /recipes/default/tiddlers.json Parameters: -* none +* ''filter'' - filter identifying tiddlers to be returned (optional, defaults to "[all[tiddlers]!is[system]sort[title]]") +* ''exclude'' - comma delimited list of fields to excluded from the returned tiddlers (optional, defaults to "text") + +In order to avoid denial of service attacks with malformed filters in the default configuration the only filter that is accepted is the default filter "[all[tiddlers]!is[system]sort[title]]"; attempts to use any other filter will result in an HTTP 403 error. + +To enable a particular filter, create a tiddler with the title "$:/config/Server/ExternalFilters/" concatenated with the filter text, and the text field set to "yes". For example, the TiddlyWeb plugin includes the following shadow tiddler to enable the filter that it requires: + +``` +title: $:/config/Server/ExternalFilters/[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] +text: yes +``` + +It is also possible to configure the server to accept any filter by creating a tiddler titled $:/config/Server/AllowAllExternalFilters with the text "yes". This should not be done for public facing servers. Response: - * 200 OK *> `Content-Type: application/json` *> Body: array of all non-system tiddlers in [[TiddlyWeb JSON tiddler format]] +* 403 Forbidden diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ port.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ port.tid index f05da08fc..bbfee9906 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ port.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ port.tid @@ -1,6 +1,6 @@ caption: port created: 20180630180552254 -modified: 20180702155017130 +modified: 20191219123751824 tags: [[WebServer Parameters]] title: WebServer Parameter: port type: text/vnd.tiddlywiki @@ -10,6 +10,7 @@ The [[web server configuration parameter|WebServer Parameters]] ''port'' specifi The ''port'' parameter accepts two types of value: * Numerical values are interpreted as a decimal port number +** The special value 0 (zero) causes the operating system to assign an available port * Non-numeric values are interpreted as an environment variable from which the port should be read This example configures the server to listen on port 8090: diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index a346a6606..9e0734814 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -26,6 +26,8 @@ function FileSystemAdaptor(options) { FileSystemAdaptor.prototype.name = "filesystem"; +FileSystemAdaptor.prototype.supportsLazyLoading = false; + FileSystemAdaptor.prototype.isReady = function() { // The file system adaptor is always ready return true; diff --git a/plugins/tiddlywiki/tiddlyweb/ServerControlPanel.tid b/plugins/tiddlywiki/tiddlyweb/ServerControlPanel.tid deleted file mode 100644 index 9ef1e27af..000000000 --- a/plugins/tiddlywiki/tiddlyweb/ServerControlPanel.tid +++ /dev/null @@ -1,20 +0,0 @@ -title: $:/plugins/tiddlywiki/tiddlyweb/ServerControlPanel -caption: Server -tags: $:/tags/ControlPanel - -<$reveal state="$:/status/IsLoggedIn" type="nomatch" text="yes"> -Log in to ~TiddlyWeb: <$button message="tm-login">Login</$button> -</$reveal> -<$reveal state="$:/status/IsLoggedIn" type="match" text="yes"> -Logged in as {{$:/status/UserName}} <$button message="tm-logout">Logout</$button> -</$reveal> - ----- - -Host configuration: <$edit-text tiddler="$:/config/tiddlyweb/host" tag="input" default=""/> - -<blockquote>//for example, `$protocol$//$host$/folder`, where `$protocol$` is replaced by the protocol (typically `http` or `https`), and `$host$` by the host name//</blockquote> - ----- - -<$button message="tm-server-refresh">Refresh</$button> to fetch changes from the server immediately diff --git a/plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid b/plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid new file mode 100644 index 000000000..04bf24613 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid @@ -0,0 +1,2 @@ +title: $:/config/Server/ExternalFilters/[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] +text: yes diff --git a/plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid b/plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid new file mode 100644 index 000000000..9f0e164f4 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid @@ -0,0 +1,3 @@ +title: $:/config/OfficialPluginLibrary + +(This core tiddler is overridden by the tiddlyweb plugin to prevent users from installing official plugins via control panel. Instead they should be installed by editing tiddlywiki.info in the root of the wiki folder) \ No newline at end of file diff --git a/plugins/tiddlywiki/tiddlyweb/css-tiddler.tid b/plugins/tiddlywiki/tiddlyweb/css-tiddler.tid new file mode 100644 index 000000000..2d7367fa9 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/css-tiddler.tid @@ -0,0 +1,7 @@ +title: $:/core/templates/css-tiddler + +<!-- + +This template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields. This version includes the tiddler changecount as the field `revision`. + +-->`<style`<$fields template=' data-tiddler-$name$="$encoded_value$"'></$fields>` data-tiddler-revision="`<<changecount>>`" data-tiddler-bag="default" type="text/css">`<$view field="text" format="text" />`</style>` \ No newline at end of file diff --git a/plugins/tiddlywiki/tiddlyweb/html-div-skinny-tiddler.tid b/plugins/tiddlywiki/tiddlyweb/html-div-skinny-tiddler.tid new file mode 100644 index 000000000..010a603b5 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/html-div-skinny-tiddler.tid @@ -0,0 +1,9 @@ +title: $:/core/templates/html-div-skinny-tiddler + +<!-- + +This template is a variant of the tiddlyweb plugin's overridden version of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field) + +-->`<div`<$fields exclude='text revision bag' template=' $name$="$encoded_value$"'></$fields>` revision="`<<changecount>>`" bag="default" _is_skinny=""> +<pre></pre> +</div>` diff --git a/plugins/tiddlywiki/tiddlyweb/icon-cloud.tid b/plugins/tiddlywiki/tiddlyweb/icon-cloud.tid new file mode 100644 index 000000000..08c5127af --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/icon-cloud.tid @@ -0,0 +1,4 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/icon/cloud +tags: $:/tags/Image + +<svg class="tc-image-cloud tc-image-button" width="22pt" height="22pt" viewBox="0 0 128 128"><g><path d="M24 103C10.745 103 0 92.255 0 79c0-9.697 5.75-18.05 14.027-21.836A24.787 24.787 0 0114 56c0-13.255 10.745-24 24-24 1.373 0 2.718.115 4.028.337C48.628 24.2 58.707 19 70 19c19.882 0 36 16.118 36 36v.082c12.319 1.016 22 11.336 22 23.918 0 12.239-9.16 22.337-20.999 23.814L107 103H24z"/><path class="tc-image-cloud-idle" d="M57.929 84.698a6 6 0 01-8.485 0L35.302 70.556a6 6 0 118.485-8.485l9.9 9.9L81.97 43.686a6 6 0 018.485 8.486L57.929 84.698z"/><path class="tc-image-cloud-progress tc-animate-rotate-slow" d="M44.8 40a3.6 3.6 0 100 7.2h2.06A23.922 23.922 0 0040 64c0 13.122 10.531 23.785 23.603 23.997L64 88l.001-7.2c-9.171 0-16.626-7.348-16.798-16.477L47.2 64c0-5.165 2.331-9.786 5.999-12.868L53.2 55.6a3.6 3.6 0 107.2 0v-12a3.6 3.6 0 00-3.6-3.6h-12zM64 40v7.2c9.278 0 16.8 7.522 16.8 16.8 0 5.166-2.332 9.787-6 12.869V72.4a3.6 3.6 0 10-7.2 0v12a3.6 3.6 0 003.6 3.6h12a3.6 3.6 0 100-7.2l-2.062.001A23.922 23.922 0 0088 64c0-13.255-10.745-24-24-24z"/></g></svg> \ No newline at end of file diff --git a/plugins/tiddlywiki/tiddlyweb/javascript-tiddler.tid b/plugins/tiddlywiki/tiddlyweb/javascript-tiddler.tid new file mode 100644 index 000000000..847873811 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/javascript-tiddler.tid @@ -0,0 +1,7 @@ +title: $:/core/templates/javascript-tiddler + +<!-- + +This template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. This version includes the tiddler changecount as the field `revision`. + +-->`<script`<$fields template=' data-tiddler-$name$="$encoded_value$"'></$fields>` data-tiddler-revision="`<<changecount>>`" data-tiddler-bag="default" type="text/javascript">`<$view field="text" format="text" />`</script>` \ No newline at end of file diff --git a/plugins/tiddlywiki/tiddlyweb/save-offline.tid b/plugins/tiddlywiki/tiddlyweb/save-offline.tid index b2bfdbdd1..76f07fe29 100644 --- a/plugins/tiddlywiki/tiddlyweb/save-offline.tid +++ b/plugins/tiddlywiki/tiddlyweb/save-offline.tid @@ -2,6 +2,6 @@ title: $:/plugins/tiddlywiki/tiddlyweb/save/offline \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() -[is[tiddler]] -[[$:/boot/boot.css]] -[[$:/HistoryList]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] +[sort[title]] $(publishFilter)$ +[is[tiddler]] -[[$:/boot/boot.css]] -[[$:/HistoryList]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[prefix[$:/temp/]] +[sort[title]] $(publishFilter)$ \end {{$:/core/templates/tiddlywiki5.html}} diff --git a/plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid b/plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid new file mode 100644 index 000000000..b0f688349 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid @@ -0,0 +1,25 @@ +title: $:/core/ui/Buttons/save-wiki +tags: $:/tags/PageControls +caption: {{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}} Server status +description: Status of synchronisation with server + +\define config-title() +$:/config/PageControlButtons/Visibility/$(listItem)$ +\end +<$button popup=<<qualify "$:/state/popup/save-wiki">> tooltip="Status of synchronisation with server" aria-label="Server status" class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> +<span class="tc-dirty-indicator"> +<$list filter="[<tv-config-toolbar-icons>match[yes]]"> +{{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}} +</$list> +<$list filter="[<tv-config-toolbar-text>match[yes]]"> +<span class="tc-btn-text"><$text text="Server status"/></span> +</$list> +</span> +</$button> +<$reveal state=<<qualify "$:/state/popup/save-wiki">> type="popup" position="below" animate="yes"> +<div class="tc-drop-down"> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/SyncerDropdown]!has[draft.of]]" variable="listItem"> +<$transclude tiddler=<<listItem>>/> +</$list> +</div> +</$reveal> diff --git a/plugins/tiddlywiki/tiddlyweb/styles.tid b/plugins/tiddlywiki/tiddlyweb/styles.tid new file mode 100644 index 000000000..5d59fa379 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/styles.tid @@ -0,0 +1,40 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/styles +tags: [[$:/tags/Stylesheet]] + +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock + +body.tc-dirty span.tc-dirty-indicator svg { + transition: fill 250ms ease-in-out; +} + +body .tc-image-cloud-idle { + fill: <<colour background>>; + transition: opacity 250ms ease-in-out; + opacity: 1; +} + +body.tc-dirty .tc-image-cloud-idle { + opacity: 0; +} + +body .tc-image-cloud-progress { + transition: opacity 250ms ease-in-out; + transform-origin: 50% 50%; + transform: rotate(359deg); + animation: animation-rotate-slow 2s infinite linear; + fill: <<colour background>>; + opacity: 0; +} + +body.tc-dirty .tc-image-cloud-progress { + opacity: 1; +} + +@keyframes animation-rotate-slow { + from { + transform: rotate(0deg); + } + to { + transform: scale(359deg); + } +} diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-copy-logs.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-copy-logs.tid new file mode 100644 index 000000000..b141670e6 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-copy-logs.tid @@ -0,0 +1,6 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs +tags: $:/tags/SyncerDropdown + +<$button message="tm-copy-syncer-logs-to-clipboard" class="tc-btn-invisible"> +{{$:/core/images/copy-clipboard}} Copy syncer logs to clipboard +</$button> diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-login-status.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-login-status.tid new file mode 100644 index 000000000..11816f1b4 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-login-status.tid @@ -0,0 +1,9 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status +tags: $:/tags/SyncerDropdown + +<$reveal state="$:/status/IsLoggedIn" type="match" text="yes"> +<div class="tc-drop-down-info"> +You are logged in<$reveal state="$:/status/UserName" type="nomatch" text="" default=""> as <strong><$text text={{$:/status/UserName}}/></strong></$reveal><$reveal state="$:/status/IsReadOnly" type="match" text="yes" default="no"> (read-only)</$reveal> +</div> +<hr/> +</$reveal> diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-login.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-login.tid new file mode 100644 index 000000000..cdd95f5a6 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-login.tid @@ -0,0 +1,8 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login +tags: $:/tags/SyncerDropdown + +<$reveal state="$:/status/IsLoggedIn" type="nomatch" text="yes"> +<$button message="tm-login" class="tc-btn-invisible"> +{{$:/core/images/unlocked-padlock}} Login +</$button> +</$reveal> diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-logout.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-logout.tid new file mode 100644 index 000000000..358944d1a --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-logout.tid @@ -0,0 +1,8 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout +tags: $:/tags/SyncerDropdown + +<$reveal state="$:/status/IsLoggedIn" type="match" text="yes"> +<$button message="tm-logout" class="tc-btn-invisible"> +{{$:/core/images/cancel-button}} Logout +</$button> +</$reveal> diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid new file mode 100644 index 000000000..eeb0ddba2 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid @@ -0,0 +1,9 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh +tags: $:/tags/SyncerDropdown + +<$reveal state="$:/status/IsLoggedIn" type="match" text="yes"> +<$button tooltip="Get latest changes from the server" aria-label="Refresh from server" class="tc-btn-invisible"> +<$action-sendmessage $message="tm-server-refresh"/> +{{$:/core/images/refresh-button}} <span clas]s="tc-btn-text"><$text text="Get latest changes from the server"/></span> +</$button> +</$reveal> diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-save-snapshot.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-save-snapshot.tid new file mode 100644 index 000000000..23bb4c914 --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-save-snapshot.tid @@ -0,0 +1,9 @@ +title: $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot +tags: $:/tags/SyncerDropdown + +<$button class="tc-btn-invisible"> +<$wikify name="site-title" text={{$:/config/SaveWikiButton/Filename}}> +<$action-sendmessage $message="tm-download-file" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/> +</$wikify> +{{$:/core/images/download-button}} Save snapshot for offline use +</$button> diff --git a/plugins/tiddlywiki/tiddlyweb/tags-syncerdropdown.tid b/plugins/tiddlywiki/tiddlyweb/tags-syncerdropdown.tid new file mode 100644 index 000000000..07135a75b --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/tags-syncerdropdown.tid @@ -0,0 +1,2 @@ +title: $:/tags/SyncerDropdown +list: $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login-status $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/login $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/refresh $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/logout $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/save-snapshot $:/plugins/tiddlywiki/tiddlyweb/syncer-actions/copy-logs diff --git a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js index 492909324..5bc4e502d 100644 --- a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js +++ b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js @@ -27,6 +27,12 @@ function TiddlyWebAdaptor(options) { TiddlyWebAdaptor.prototype.name = "tiddlyweb"; +TiddlyWebAdaptor.prototype.supportsLazyLoading = true; + +TiddlyWebAdaptor.prototype.setLoggerSaveBuffer = function(loggerForSaving) { + this.logger.setSaveBuffer(loggerForSaving); +}; + TiddlyWebAdaptor.prototype.isReady = function() { return this.hasStatus; }; @@ -50,6 +56,11 @@ TiddlyWebAdaptor.prototype.getTiddlerInfo = function(tiddler) { }; }; +TiddlyWebAdaptor.prototype.getTiddlerRevision = function(title) { + var tiddler = this.wiki.getTiddler(title); + return tiddler.fields.revision; +}; + /* Get the current status of the TiddlyWeb connection */ @@ -147,6 +158,9 @@ TiddlyWebAdaptor.prototype.getSkinnyTiddlers = function(callback) { var self = this; $tw.utils.httpRequest({ url: this.host + "recipes/" + this.recipe + "/tiddlers.json", + data: { + filter: "[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]]" + }, callback: function(err,data) { // Check for errors if(err) { @@ -220,7 +234,7 @@ TiddlyWebAdaptor.prototype.deleteTiddler = function(title,callback,options) { return callback(null); } // If we don't have a bag it means that the tiddler hasn't been seen by the server, so we don't need to delete it - var bag = options.tiddlerInfo.adaptorInfo.bag; + var bag = options.tiddlerInfo.adaptorInfo && options.tiddlerInfo.adaptorInfo.bag; if(!bag) { return callback(null); } diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 91e2e6b61..2541938c1 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1450,6 +1450,10 @@ html body.tc-body.tc-single-tiddler-window { fill: <<colour foreground>>; } +.tc-drop-down .tc-drop-down-info { + padding-left: 14px; +} + .tc-drop-down p { padding: 0 14px 0 14px; } @@ -1978,24 +1982,26 @@ html body.tc-body.tc-single-tiddler-window { .tc-alerts { position: fixed; - top: 0; + top: 28px; left: 0; - max-width: 500px; + right: 0; + max-width: 50%; z-index: 20000; } .tc-alert { position: relative; - margin: 28px; - padding: 14px 14px 14px 14px; - border: 2px solid <<colour alert-border>>; + margin: 14px; + padding: 7px; + border: 1px solid <<colour alert-border>>; background-color: <<colour alert-background>>; } .tc-alert-toolbar { position: absolute; - top: 14px; - right: 14px; + top: 7px; + right: 7px; + line-height: 0; } .tc-alert-toolbar svg { @@ -2005,6 +2011,12 @@ html body.tc-body.tc-single-tiddler-window { .tc-alert-subtitle { color: <<colour alert-muted-foreground>>; font-weight: bold; + font-size: 0.8em; + margin-bottom: 0.5em; +} + +.tc-alert-body > p { + margin: 0; } .tc-alert-highlight { From a4003d4697995ef3485a47bdfa72db2788173e92 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 30 Mar 2020 20:25:24 +0100 Subject: [PATCH 0546/2376] Updates for Dutch translation Thanks @gernert --- languages/nl-NL/Buttons.multids | 3 ++- languages/nl-NL/ControlPanel.multids | 7 +++++-- languages/nl-NL/Docs/PaletteColours.multids | 2 ++ languages/nl-NL/EditTemplate.multids | 2 ++ languages/nl-NL/Fields.multids | 2 ++ languages/nl-NL/Help/deletetiddlers.tid | 2 +- languages/nl-NL/Help/savewikifolder.tid | 2 +- languages/nl-NL/Misc.multids | 4 +++- 8 files changed, 18 insertions(+), 6 deletions(-) diff --git a/languages/nl-NL/Buttons.multids b/languages/nl-NL/Buttons.multids index 16f594dec..e1eac18d3 100644 --- a/languages/nl-NL/Buttons.multids +++ b/languages/nl-NL/Buttons.multids @@ -143,6 +143,7 @@ SaveWiki/Caption: opslaan SaveWiki/Hint: Sla wijzigingen op ShowSideBar/Caption: toon zijpaneel ShowSideBar/Hint: Toon zijpaneel +SidebarSearch/Hint: Kies het zoekvak in het zijpaneel Size/Caption: formaat van de afbeelding Size/Caption/Height: Hoogte: Size/Caption/Resize: Wijzig het formaat van de afbeelding @@ -171,7 +172,7 @@ Timestamp/Off/Caption: tijdstempels zijn uit Timestamp/Off/Hint: Werk tijdstempels niet bij als tiddlers veranderd zijn Timestamp/On/Caption: tijdstempels zijn aan Timestamp/On/Hint: Werk tijdstempels bij als tiddlers veranderd zijn -ToggleSidebar/Hint: 'Toggle' de sideba +ToggleSidebar/Hint: 'Toggle' het zijpaneel Transcludify/Caption: transclusie Transcludify/Hint: Zet selectie tussen accolades Underline/Caption: onderstreept diff --git a/languages/nl-NL/ControlPanel.multids b/languages/nl-NL/ControlPanel.multids index e3fa522fc..6c25eb77d 100644 --- a/languages/nl-NL/ControlPanel.multids +++ b/languages/nl-NL/ControlPanel.multids @@ -5,6 +5,7 @@ Advanced/Hint: Interne informatie over deze TiddlyWiki Appearance/Caption: Uiterlijk Appearance/Hint: Manieren om het uiterlijk van je TiddlyWiki aan te passen Basics/AnimDuration/Prompt: Duur van de animatie: +Basics/AutoFocus/Prompt: Standaard 'focus' veld van een nieuwe tiddler Basics/Caption: Standaard Basics/DefaultTiddlers/BottomHint: Gebruik [[dubbele rechte haken]] voor titels met spaties. Of je kan <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]"> kiezen voor behoud van open tiddlers Basics/DefaultTiddlers/Prompt: Standaard tiddlers: @@ -13,6 +14,7 @@ Basics/Language/Prompt: Hallo! Huidige taal: Basics/NewJournal/Tags/Prompt: Labels voor nieuwe journaaltiddlers Basics/NewJournal/Text/Prompt: Tekst voor nieuwe journaaltiddlers Basics/NewJournal/Title/Prompt: Titel voor nieuwe journaaltiddlers +Basics/NewTiddler/Tags/Prompt: Labels voor nieuwe tiddlers Basics/NewTiddler/Title/Prompt: Titel voor nieuwe tiddlers Basics/OverriddenShadowTiddlers/Prompt: Aantal overschreven schaduwtiddlers: Basics/ShadowTiddlers/Prompt: Aantal schaduwtiddlers: @@ -63,6 +65,7 @@ Parsing/Pragma/Caption: 'Pragma parse' regels Plugins/Add/Caption: Verkrijg meer plugins Plugins/Add/Hint: Installeer plugins van de officiële bibliotheek Plugins/AlreadyInstalled/Hint: Deze plugin is al geïnstalleerd met versie <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: Vereist ook: Plugins/Caption: Plugins Plugins/ClosePluginLibrary: schakel pluginbibliotheek uit Plugins/Disable/Caption: schakel uit @@ -80,6 +83,7 @@ Plugins/NoInfoFound/Hint: ''"<$text text=<<currentTab>>/>"'' niet gevonden Plugins/NotInstalled/Hint: Deze plugin is nu niet geïnstalleerd Plugins/OpenPluginLibrary: open pluginbibliotheek Plugins/Plugin/Prompt: Plugins +Plugins/PluginWillRequireReload: (vereist een 'reload') Plugins/Reinstall/Caption: herinstalleer Plugins/Theme/Prompt: Thema's Plugins/Themes/Caption: Thema's @@ -95,7 +99,6 @@ Saving/GitHub/Branch: 'Tak' (branch) voor opslaan (standaard `master`) Saving/GitHub/Caption: ~GitHub opslagmodule Saving/GitHub/Description: Deze instellingen worden alleen gebruikt voor opslaan bij ~GitHub Saving/GitHub/Filename: Bestandsnaam van doelbestand (b.v. `index.html`) - Saving/GitHub/Password: Wachtwoord, OAUTH token of persoonlijk toegangstoken Saving/GitHub/Path: Pad naar doelbestand (b.v. `/wiki/`) Saving/GitHub/Repo: Opslagplaats (b.v. `Jermolene/TiddlyWiki5`) @@ -105,10 +108,10 @@ Saving/GitService/Branch: Doeltak (branch) voor opslaan Saving/GitService/CommitMessage: Opgeslagen door TiddlyWiki Saving/GitService/Description: Deze instellingen worden alleen gebruikt bij opslaan naar <<service-name>> Saving/GitService/Filename: Bestandsnaam van doelbestand (b.v. `index.html`) +Saving/GitService/Gitea/Password: Persoonlijk toegangs-token voor API (via Gitea’s web interface: `Settings | Applications | Generate New Token`) Saving/GitService/GitHub/Password: Wachtwoord, OAUTH token, of persoonlijk toegangs-token (zie [[GitHub help-pagina|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] voor details) Saving/GitService/GitLab/Caption: ~GitLab opslagmodule Saving/GitService/GitLab/Password: Persoonlijk toegangs-token voor API (zie [[GitLab help-pagina|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] voor details) - Saving/GitService/Path: Pad naar doelbestand (b.v. `/wiki/`) Saving/GitService/Repo: Opslagdoel (b.v. `Jermolene/TiddlyWiki5`) Saving/GitService/UserName: Gebruikersnaam diff --git a/languages/nl-NL/Docs/PaletteColours.multids b/languages/nl-NL/Docs/PaletteColours.multids index b08e80b3b..ff0fb6dc4 100644 --- a/languages/nl-NL/Docs/PaletteColours.multids +++ b/languages/nl-NL/Docs/PaletteColours.multids @@ -29,6 +29,8 @@ external-link-foreground: Voorgrond externe link external-link-foreground-hover: Voorgrond mouseover externe link external-link-foreground-visited: Voorgrond bezochte externe link foreground: Voorgrond algemeen +menubar-background: Menu bar achtergrond +menubar-foreground: Menu bar voorgrond message-background: Achtergrond berichtenpaneel message-border: Rand berichtenpaneel message-foreground: Voorgrond berichtenpaneel diff --git a/languages/nl-NL/EditTemplate.multids b/languages/nl-NL/EditTemplate.multids index 08140b0b2..d8cb1126f 100644 --- a/languages/nl-NL/EditTemplate.multids +++ b/languages/nl-NL/EditTemplate.multids @@ -7,6 +7,7 @@ Field/Dropdown/Hint: Toon veldenlijst Field/Remove/Caption: verwijder veld Field/Remove/Hint: Verwijder veld Fields/Add/Button: + +Fields/Add/Button/Hint: Voeg het nieuwe veld aan de tiddler toe Fields/Add/Dropdown/System: Systeemvelden Fields/Add/Dropdown/User: Gebruikersvelden Fields/Add/Name/Placeholder: veldnaam @@ -15,6 +16,7 @@ Fields/Add/Value/Placeholder: veldwaarde Shadow/OverriddenWarning: Dit is een aangepaste schaduwtiddler. Door deze tiddler te verwijderen wordt de standaard schaduwtiddler weer actief Shadow/Warning: Dit is een schaduwtiddler. Elke verandering overschrijft de standaardversie Tags/Add/Button: + +Tags/Add/Button/Hint: voeg label toe Tags/Add/Placeholder: labelnaam Tags/Dropdown/Caption: labellijst Tags/Dropdown/Hint: Toon labellijst diff --git a/languages/nl-NL/Fields.multids b/languages/nl-NL/Fields.multids index cd5649974..8da48e7fb 100644 --- a/languages/nl-NL/Fields.multids +++ b/languages/nl-NL/Fields.multids @@ -1,6 +1,7 @@ title: $:/language/Docs/Fields/ _canonical_uri: De volledige URI van een externe afbeeldingstiddler +_is_skinny: Indien aanwezig, geeft aan dat het tekstveld van de server geladen moet worden bag: De naam van de 'bag' waaruit de tiddler kwam caption: Tekst die op een tab of een knop getoond wordt color: De CSS-waarde van een kleur gekoppeld aan een tiddler @@ -30,6 +31,7 @@ source: De URL gekoppeld aan de tiddler subtitle: De tekst van de ondertitel van een wizard tags: Een lijst van labels gekoppeld met een tiddler text: De tekst van een tiddler +throttle.refresh: Indien aanwezig wordt verversen van deze tiddler verminderd title: De unieke naam van een tiddler toc-link: Als 'no' ingevuld is, is de tiddler geen link meer in de Inhoudsopgave type: Inhoudstype van een tiddler diff --git a/languages/nl-NL/Help/deletetiddlers.tid b/languages/nl-NL/Help/deletetiddlers.tid index 5c38bcf62..b62854a9e 100644 --- a/languages/nl-NL/Help/deletetiddlers.tid +++ b/languages/nl-NL/Help/deletetiddlers.tid @@ -1,5 +1,5 @@ title: $:/language/Help/deletetiddlers -description: Deletes a group of tiddlers +description: Verwijdert een groep tiddlers <<.from-version "5.1.20">> Verwijdert een gefilterde groep tiddlers. diff --git a/languages/nl-NL/Help/savewikifolder.tid b/languages/nl-NL/Help/savewikifolder.tid index 06ea81fd8..22ac66779 100644 --- a/languages/nl-NL/Help/savewikifolder.tid +++ b/languages/nl-NL/Help/savewikifolder.tid @@ -1,5 +1,5 @@ title: $:/language/Help/savewikifolder -description: Saves a wiki to a new wiki folder +description: Slaat een wiki in een nieuwe wiki-folder op <<.from-version "5.1.20">> Slaat de wiki als een wiki-folder op inclusief tiddlers, plugins en configuratie: diff --git a/languages/nl-NL/Misc.multids b/languages/nl-NL/Misc.multids index 3be185c70..16ad5d126 100644 --- a/languages/nl-NL/Misc.multids +++ b/languages/nl-NL/Misc.multids @@ -16,7 +16,7 @@ DropMessage: 'Drop' hier (of klik escape om te annuleren) Encryption/Cancel: Annuleer Encryption/ConfirmClearPassword: Wil je het wachtwoord verwijderen? Dan wordt de wiki onversleuteld opgeslagen. Encryption/Password: Wachtwoord -Encryption/PasswordNoMatch: Wachtwoorden matchen niet +Encryption/PasswordNoMatch: Wachtwoorden komen niet overeen Encryption/PromptSetPassword: Vul een nieuw wachtwoord in voor deze TiddlyWiki Encryption/RepeatPassword: Herhaal wachtwoord Encryption/SetPassword: Vul wachtwoord in @@ -27,6 +27,7 @@ Error/Filter: Filterfout Error/FilterSyntax: Syntaxfout in filter expressie Error/IsFilterOperator: Filterfout: Onbekende operand voor het 'is' filter Error/LoadingPluginLibrary: Fout bij laden van de pluginbibliotheek +Error/NetworkErrorAlert: `<h2>''Network fout''</h2>De verbinding met de server lijkt verbroken. Mogelijk een probleem met de netwerkverbinding. Herstel de netwerkverbinding voordat verder wordt gegaan.<br><br>''Niet opgeslagen veranderingen worden gesynchroniseerd als de verbinding hersteld is''.` Error/RecursiveTransclusion: Recursieve transclusiefout in 'transclude' widget Error/RetrievingSkinny: Fout bij ophalen van de 'skinny' tiddlerlijst Error/SavingToTWEdit: Fout bij opslaan naar TWEdit @@ -64,6 +65,7 @@ SystemTiddlers/Include/Prompt: Inclusief systeem tiddlers TagManager/Colour/Heading: Kleur TagManager/Count/Heading: Aantal TagManager/Icon/Heading: Pictogram (icon) +TagManager/Icons/None: Geen TagManager/Info/Heading: Info TagManager/Tag/Heading: Label Tiddler/DateFormat: DD MMM YYYY om hh12:0mmam From 010483f705d6248aa01e08792ac6f67472365a32 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 30 Mar 2020 20:43:17 +0100 Subject: [PATCH 0547/2376] Fix ActionPopupWidget example Thanks @twmat The example had been written while there was a bug that changed the state tiddler titles used by the sidebar --- editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid index 9aa5b0c47..c1b7003d3 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid @@ -19,11 +19,11 @@ The ''action-popup'' widget is invisible. Any content within it is ignored. ! Examples -Here is an example of button that triggers the "more" button in the sidebar "Tools" tab +Here is an example of button that triggers the "more" button in the sidebar "Tools" tab. You may need to scroll to see the popup <$macrocall $name='wikitext-example-without-html' src='<$button> -<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" $value="$:/core/ui/SideBar/Tools"/> -<$action-popup $state="$:/state/popup/more-435115636" $coords="(0,20,0,0)"/> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" $value="$:/core/ui/SideBar/Tools"/> +<$action-popup $state="$:/state/popup/more-2053862905" $coords="(0,20,0,0)"/> Click me! </$button>'/> From 1154372a7b1edf24919e2e2cdba1e563f38a13f9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 31 Mar 2020 10:47:17 +0100 Subject: [PATCH 0548/2376] Update syncer to distinguish connection errors from other errors We can automatically remove connection errors when things resume working --- core/modules/syncer.js | 27 ++++++++++++------- .../moduletypes/SyncAdaptorModules.tid | 8 +++++- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/core/modules/syncer.js b/core/modules/syncer.js index f39646eac..903bb0a4b 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -57,6 +57,12 @@ function Syncer(options) { enable: this.logging, saveHistory: true }); + // Make another logger for connection errors + this.loggerConnection = new $tw.utils.Logger("syncer" + ($tw.browser ? "-browser" : "") + ($tw.node ? "-server" : "") + (this.syncadaptor.name ? ("-" + this.syncadaptor.name) : "") + "-connection",{ + colour: "cyan", + enable: this.logging + }); + // Ask the syncadaptor to use the main logger if(this.syncadaptor.setLoggerSaveBuffer) { this.syncadaptor.setLoggerSaveBuffer(this.logger); } @@ -136,9 +142,13 @@ function Syncer(options) { /* Show a generic network error alert */ -Syncer.prototype.showErrorAlert = function() { -console.log($tw.language.getString("Error/NetworkErrorAlert")) - this.logger.alert($tw.language.getString("Error/NetworkErrorAlert")); +Syncer.prototype.displayError = function(msg,err) { + if(err === ($tw.language.getString("Error/XMLHttpRequest") + ": 0")) { + this.loggerConnection.alert($tw.language.getString("Error/NetworkErrorAlert")); + this.logger.log(msg + ":",err); + } else { + this.logger.alert(msg + ":",err); + } }; /* @@ -220,7 +230,7 @@ Syncer.prototype.updateDirtyStatus = function() { var dirty = this.isDirty(); $tw.utils.toggleClass(document.body,"tc-dirty",dirty); if(!dirty) { - this.logger.clearAlerts(); + this.loggerConnection.clearAlerts(); } } }; @@ -292,8 +302,7 @@ Syncer.prototype.syncFromServer = function() { this.syncadaptor.getUpdatedTiddlers(self,function(err,updates) { triggerNextSync(); if(err) { - self.showErrorAlert(); - self.logger.log($tw.language.getString("Error/RetrievingSkinny") + ":",err); + self.displayError($tw.language.getString("Error/RetrievingSkinny"),err); return; } if(updates) { @@ -317,8 +326,7 @@ Syncer.prototype.syncFromServer = function() { triggerNextSync(); // Check for errors if(err) { - self.showErrorAlert(); - self.logger.log($tw.language.getString("Error/RetrievingSkinny") + ":",err); + self.displayError($tw.language.getString("Error/RetrievingSkinny"),err); return; } // Keep track of which tiddlers we already know about have been reported this time @@ -468,8 +476,7 @@ Syncer.prototype.processTaskQueue = function() { task.run(function(err) { self.numTasksInProgress -= 1; if(err) { - self.showErrorAlert(); - self.logger.log("Sync error while processing " + task.type + " of '" + task.title + "':\n" + err); + self.displayError("Sync error while processing " + task.type + " of '" + task.title + "'",err); self.updateDirtyStatus(); self.triggerTimeout(self.errorRetryInterval); } else { diff --git a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid index 6f88fb9a5..a727991a8 100644 --- a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid +++ b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid @@ -27,7 +27,13 @@ Nothing should be exported if the adaptor detects that it isn't capable of opera ! Adaptor Module Methods -Adaptor modules must handle the following methods. +Adaptor modules must handle the methods described below. + +!!! Error Handling + +The syncadaptor must invoke the provided callback with the ''err'' parameter containing a string describing the error. + +The syncer has special handling for connection errors. For backwards compatibilty reasons, the syncer identifies connection errors as the string comprised of the content of the tiddler $:/language/Error/XMLHttpRequest with the string ": 0" appended to the end. For example, in English, the string is "XMLHttpRequest error code: 0" and in Brazilian Portuguese it is "Código de erro XMLHttpRequest: 0". !! `Constructor(options)` From 7d30664b7daeba1367d15d7952f6b2cdbf9c94ac Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Tue, 31 Mar 2020 18:01:09 +0800 Subject: [PATCH 0549/2376] Update chinese translations (#4528) * add description of field `_is_skinny` * add alert message `Error/NetworkErrorAlert` --- languages/zh-Hans/Fields.multids | 1 + languages/zh-Hans/Misc.multids | 1 + languages/zh-Hant/Fields.multids | 1 + languages/zh-Hant/Misc.multids | 1 + 4 files changed, 4 insertions(+) diff --git a/languages/zh-Hans/Fields.multids b/languages/zh-Hans/Fields.multids index 90c8286ea..7b7ba902a 100644 --- a/languages/zh-Hans/Fields.multids +++ b/languages/zh-Hans/Fields.multids @@ -34,3 +34,4 @@ title: 条目的唯一名称 toc-link: 若设为: "no",则抑制目录树中的条目链接。 type: 条目的内容类型 version: 插件的版本信息 +_is_skinny: 如果存在,则表示必须从服务器加载条目的文本字段 diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index f1717f19e..38fadbaf7 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -28,6 +28,7 @@ Error/Filter: 筛选器错误 Error/FilterSyntax: 筛选器运算式中的语法错误 Error/IsFilterOperator: 筛选器错误︰'is' 筛选器运算符的未知操作数 Error/LoadingPluginLibrary: 加载插件程式库时,发生错误 +Error/NetworkErrorAlert: `<h2>''网络错误''</h2>与服务器的连缐似乎已中断。这可能表示您的网络连缐有问题。请尝试恢复网路连缐才能继续。<br><br>''恢复连缐时,所有未保存的更改,将自动同步''。` Error/RecursiveTransclusion: 于 transclude 小部件中的递回嵌入错误 Error/RetrievingSkinny: 简要条目清单撷取错误 Error/SavingToTWEdit: 保存到 TWEdit 时,发生错误 diff --git a/languages/zh-Hant/Fields.multids b/languages/zh-Hant/Fields.multids index 462895653..260f3148a 100644 --- a/languages/zh-Hant/Fields.multids +++ b/languages/zh-Hant/Fields.multids @@ -34,3 +34,4 @@ title: 條目的唯一名稱 toc-link: 若設爲: "no",則抑制目錄樹中的條目鏈接。 type: 條目的內容類型 version: 插件的版本資訊 +_is_skinny: 如果存在,則表示必須從伺服器載入條目的文字欄位 \ No newline at end of file diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index 21aafb6d2..fb5e5feeb 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -28,6 +28,7 @@ Error/Filter: 篩選器錯誤 Error/FilterSyntax: 篩選器運算式中的語法錯誤 Error/IsFilterOperator: 篩選器錯誤︰'is' 篩選器運算子的未知運算元 Error/LoadingPluginLibrary: 載入插件程式庫時,發生錯誤 +Error/NetworkErrorAlert: `<h2>''網路錯誤''</h2>與伺服器的連線似乎已中斷。這可能表示您的網路連線有問題。請嘗試恢復網路連線才能繼續。<br><br>''恢復連線時,所有未儲存的變更,將自動同步''。` Error/RecursiveTransclusion: 於 transclude 小工具中的遞迴嵌入錯誤 Error/RetrievingSkinny: 簡要條目清單擷取錯誤 Error/SavingToTWEdit: 儲存到 TWEdit 時,發生錯誤 From 493a28c396a51cc9a69ac2d6d151ef86ef7b2b92 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 31 Mar 2020 14:54:03 +0100 Subject: [PATCH 0550/2376] TiddlyWebAdaptor: Trim whitespace from save button Fixes #4530 --- plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid b/plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid index b0f688349..307290173 100644 --- a/plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid +++ b/plugins/tiddlywiki/tiddlyweb/save-wiki-button.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/plugins/tiddlywiki/tiddlyweb/icon/cloud}} Server status description: Status of synchronisation with server +\whitespace trim \define config-title() $:/config/PageControlButtons/Visibility/$(listItem)$ \end From 2027bd75822a4e9c7592c7d664321fc34182d0c7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 1 Apr 2020 12:49:35 +0100 Subject: [PATCH 0551/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.22.tid | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 50bc04754..a83ac6949 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -1,6 +1,6 @@ caption: 5.1.22 -created: 20200330122328344 -modified: 20200330122328344 +created: 20200401124910939 +modified: 20200401124910939 tags: ReleaseNotes title: Release 5.1.22 type: text/vnd.tiddlywiki @@ -19,6 +19,25 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * Plugins may now declare dependencies that are automatically installed without user intervention * All plugins now feature a concise, informal name (in addition to the description and title) +! Client-Server Improvements + +This release sees several improvements to the client-server configuration: + +* Improved resilience to connection errors. Errors encountered by the browser are automatically retried, and when they succeed the associated error messages are automatically removed +* Changes to system tiddlers are now synchronised from the server to the browser +* Deletions of tiddlers on the server are now synchronised to the browser +* New "cloud" page control button with a dropdown menu showing status and additional actions: +** "Refresh from server" to force an immediate check for changes from the server +** "Logout" +** "Save snapshot for offline use" to save a copy of the wiki without the client-server components +** "Copy syncer logs to clipboard" to make it easier to ask end users for debugging information +* Added "filter" and "exclude" parameters to the [[GET /recipes/default/tiddlers.json|WebServer API: Get All Tiddlers]] endpoint to allow the returned tiddlers and fields to be filtered +* Enhanced LazyLoading to include skinny versions of tiddlers in the HTML file, and to avoid unnecessary loads from the server +* The official plugin library is now disabled when the tiddlyweb adaptor is active +* Internal file system details are no longer exposed to browsers when a file request fails (see https://github.com/Jermolene/TiddlyWiki5/issues/3724) + +See the [[pull request on GitHub for more details|https://github.com/Jermolene/TiddlyWiki5/pull/4373]]. + !! New Menu Bar Plugin [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ad2d4503e584ce9f931dbd1e98f95738b2841e51]] new ''menubar'' plugin that creates a menu bar that is responsive on mobile devices, and supports search, dropdowns and links From f9638f46caefff991c537cc7e82858ba3dec5291 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 1 Apr 2020 12:54:25 +0100 Subject: [PATCH 0552/2376] Fix release note typo --- editions/prerelease/tiddlers/Release 5.1.22.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index a83ac6949..d8592df33 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -19,7 +19,7 @@ The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser| * Plugins may now declare dependencies that are automatically installed without user intervention * All plugins now feature a concise, informal name (in addition to the description and title) -! Client-Server Improvements +!! Client-Server Improvements This release sees several improvements to the client-server configuration: From bbdebb27ce27bd7893b30ac6c8ab7a4d83974601 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 2 Apr 2020 18:29:24 +0200 Subject: [PATCH 0553/2376] Add TiddlyDesktop's wikilist colours to Gruvbox palette (#4521) --- core/palettes/GruvBoxDark.tid | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index ffceeb1e7..8834f0e70 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -120,3 +120,19 @@ toolbar-cancel-button: toolbar-done-button: untagged-background: #504945 very-muted-foreground: #bdae93 +wikilist-background: <<colour page-background>> +wikilist-button-background: <<colour button-background>> +wikilist-button-foreground: <<colour button-foreground>> +wikilist-item: <<colour background>> +wikilist-toolbar-background: <<colour background>> +wikilist-toolbar-foreground: <<colour foreground>> +wikilist-title: <<colour foreground>> +wikilist-title-svg: <<colour wikilist-title>> +wikilist-url: <<colour muted-foreground>> +wikilist-button-open-hover: <<colour primary>> +wikilist-button-open: <<colour dropzone-background>> +wikilist-button-remove: <<colour dirty-indicator>> +wikilist-button-remove-hover: <<colour alert-background>> +wikilist-droplink-dragover: <<colour dropzone-background>> +wikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>> +wikilist-button-reveal-hover: <<colour message-background>> \ No newline at end of file From bd449a177b89f60215e8853decdacb9f60fa16a2 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 2 Apr 2020 20:49:41 +0200 Subject: [PATCH 0554/2376] Update documentation for Modals (#4495) Update documentation for modals to include the custom class introduced in #4485, as well as the footer and subtitle fields that don't appear to be documented. --- editions/tw5.com/tiddlers/features/Modals.tid | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/features/Modals.tid b/editions/tw5.com/tiddlers/features/Modals.tid index ae4b3f26f..aa87ab68c 100644 --- a/editions/tw5.com/tiddlers/features/Modals.tid +++ b/editions/tw5.com/tiddlers/features/Modals.tid @@ -1,11 +1,18 @@ created: 20160107225427489 -modified: 20160107225651558 +modified: 20200312172056083 tags: Features title: Modals type: text/vnd.tiddlywiki Modals (or "wizards") fade the main TiddlyWiki window to display an isolated tiddler that must be explicitly dismissed by the user. +The tiddler to be displayed can contain the following optional fields that are used to customize the modal: + +|!Field |!Description | +|footer|The footer text for the modal| +|subtitle|The subtitle text for a modal| +|class|An additional class to apply to the modal wrapper| + Modals are displayed with the [[WidgetMessage: tm-modal]]. -<$button message="tm-modal" param="SampleWizard">Open demo modal</$button> \ No newline at end of file +<$button message="tm-modal" param="SampleWizard">Open demo modal</$button> From cf46b6b0ff9e1f7e5af66653a6eb7a7ef92d596d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Fri, 3 Apr 2020 10:33:39 +0100 Subject: [PATCH 0555/2376] Add "class" attribute to dropzone widget --- core/modules/widgets/dropzone.js | 3 ++- editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 794cff535..60d1ca867 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -35,7 +35,7 @@ DropZoneWidget.prototype.render = function(parent,nextSibling) { this.execute(); // Create element var domNode = this.document.createElement("div"); - domNode.className = "tc-dropzone"; + domNode.className = this.dropzoneClass || "tc-dropzone"; // Add event handlers if(this.dropzoneEnable) { $tw.utils.addEventListeners(domNode,[ @@ -190,6 +190,7 @@ DropZoneWidget.prototype.handlePasteEvent = function(event) { Compute the internal state of the widget */ DropZoneWidget.prototype.execute = function() { + this.dropzoneClass = this.getAttribute("class"); this.dropzoneDeserializer = this.getAttribute("deserializer"); this.dropzoneEnable = (this.getAttribute("enable") || "yes") === "yes"; // Make child widgets diff --git a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid index 082feea95..225823ec6 100644 --- a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid @@ -1,6 +1,6 @@ caption: dropzone created: 20131024141900000 -modified: 20200315144454996 +modified: 20200403103224328 tags: Widgets title: DropzoneWidget type: text/vnd.tiddlywiki @@ -16,6 +16,7 @@ It sends a [[WidgetMessage: tm-import-tiddlers]] carrying a JSON representation |!Attribute |!Description | |deserializer |<<.from-version "5.1.15">> Optional name of deserializer to be used (by default the deserializer is derived from the file extension) | |enable |<<.from-version "5.1.22">> Optional value "no" to disable the dropzone functionality (defaults to "yes") | +|class |<<.from-version "5.1.22">> Optional CSS class to be assigned to the dropzone (defaults to "tc-drag-over") | The list of available deserializers can be inspected by executing `Object.keys($tw.Wiki.tiddlerDeserializerModules).sort().join("\n")` in the browser JavaScript console. From 21565f635e284696424ca8a626a97d702cd0bb05 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 3 Apr 2020 14:07:55 +0200 Subject: [PATCH 0556/2376] Fix range widget for IE10/11 (#4534) As detailed in #4519 the range widget currently does not save its value to the state tiddler on IE 10/11 as they do not support the input event, but rather the change event is fired instead of the input event. This has patch has been tested in IE11 and should work in IE10 as well. Note that on Chrome and Firefox, the change event will fire only once after the user stops dragging the range slider (In addition the input event). However this does lead to an extra refresh as the handleInputEvent method already checks to see if the current value of the slider is different from the saved value before saving to the store. --- core/modules/widgets/range.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/range.js b/core/modules/widgets/range.js index d5ab2c785..0d899e891 100644 --- a/core/modules/widgets/range.js +++ b/core/modules/widgets/range.js @@ -49,7 +49,8 @@ RangeWidget.prototype.render = function(parent,nextSibling) { this.inputDomNode.value = this.getValue(); // Add a click event handler $tw.utils.addEventListeners(this.inputDomNode,[ - {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"} + {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"}, + {name: "change", handlerObject: this, handlerMethod: "handleInputEvent"} ]); // Insert the label into the DOM and render any children parent.insertBefore(this.inputDomNode,nextSibling); @@ -124,4 +125,4 @@ RangeWidget.prototype.refresh = function(changedTiddlers) { exports.range = RangeWidget; -})(); \ No newline at end of file +})(); From 06639850ba378582c63ffe6e4f6828340ce5c11d Mon Sep 17 00:00:00 2001 From: Xavier Cazin <xavier@cazin.eu> Date: Sat, 4 Apr 2020 17:55:32 +0200 Subject: [PATCH 0557/2376] fr-FR translations catch up (#4535) * fr-FR translated strings for the Gitea saver * fr-FR translation for the _is_skinny description * fr-FR translation for the Network Error alert * fr-FR translation for Menu Bar colors * fr-FR translation for the hint of the add button in EditTemplate * fr-FR translation for the default focus field hint * fr-FR translation for throttle.refresh field description * fr-FR translation for Icon: None in TagManager * fr-FR translation for Plugins "Also requires:" * Add NewJournalTags.tid in fr-FR directory * fr-FR translations for plugin related strings * fr-FR translation for Sidebar visibility toggle hint * fr-FR translation for the sidebar search hint * fr-FR translation for two Palette Editor hints --- languages/fr-FR/Buttons.multids | 2 ++ languages/fr-FR/ControlPanel.multids | 10 +++++++++- languages/fr-FR/Docs/PaletteColours.multids | 2 ++ languages/fr-FR/EditTemplate.multids | 1 + languages/fr-FR/Fields.multids | 2 ++ languages/fr-FR/Misc.multids | 4 +++- languages/fr-FR/NewJournalTags.tid | 2 ++ 7 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 languages/fr-FR/NewJournalTags.tid diff --git a/languages/fr-FR/Buttons.multids b/languages/fr-FR/Buttons.multids index ae40ab436..448589f4b 100644 --- a/languages/fr-FR/Buttons.multids +++ b/languages/fr-FR/Buttons.multids @@ -30,6 +30,7 @@ ExportTiddler/Caption: exporter ce tiddler ExportTiddler/Hint: Exporte ce tiddler ExportTiddlers/Caption: exporter ces tiddlers ExportTiddlers/Hint: Exporte ces tiddlers +SidebarSearch/Hint: Choisit le champ de recherche dans la barre latérale Fold/Caption: replier le tiddler Fold/Hint: Replie le corps du tiddler Fold/FoldBar/Caption: Barre de repli @@ -179,6 +180,7 @@ Subscript/Caption: indice Subscript/Hint: Met en indice le texte sélectionné Superscript/Caption: exposant Superscript/Hint: Met en exposant le texte sélectionné +ToggleSidebar/Hint: Bascule la visibilité de la barre latérale Transcludify/Caption: transclusion Transcludify/Hint: Encadre la sélection avec des accolades Underline/Caption: souligné diff --git a/languages/fr-FR/ControlPanel.multids b/languages/fr-FR/ControlPanel.multids index d2f61d283..145383a36 100644 --- a/languages/fr-FR/ControlPanel.multids +++ b/languages/fr-FR/ControlPanel.multids @@ -5,6 +5,7 @@ Advanced/Hint: Informations internes sur ce ~TiddlyWiki Appearance/Caption: Apparence Appearance/Hint: Personnalisation de l'apparence de votre ~TiddlyWiki. Basics/AnimDuration/Prompt: Durée de l'animation +Basics/AutoFocus/Prompt: Champ qui recevra le focus par défaut pour les nouveaux tiddlers Basics/Caption: Fondamentaux Basics/DefaultTiddlers/BottomHint: Utilisez les [[crochets doubles]] pour les titres contenant des espaces. Vous pouvez aussi décider de <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">Conserver le déroulé actuel</$button> Basics/DefaultTiddlers/Prompt: Tiddlers par défaut @@ -47,6 +48,8 @@ LoadedModules/Hint: Liste des modules chargés, liés à leurs tiddlers sources. Palette/Caption: Palette Palette/Editor/Clone/Caption: Cloner Palette/Editor/Clone/Prompt: Il est recommandé de cloner cette palette « shadow » avant de l'éditer +Palette/Editor/Delete/Hint: supprime cette entrée dans la palette courante +Palette/Editor/Names/External/Show: Montre les noms de couleur qui ne font pas partie de la palette courante Palette/Editor/Prompt/Modified: Cette palette « shadow » a été modifiée Palette/Editor/Prompt: Édition de Palette/Editor/Reset/Caption: Réinitialiser @@ -61,6 +64,7 @@ Parsing/Pragma/Caption: Règles d'analyse Pragma Plugins/Add/Caption: Ajouter des plugins Plugins/Add/Hint: Installer des plugins à partir de la bibliothèque officielle Plugins/AlreadyInstalled/Hint: Ce plugin est déjà installé dans la version <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: Requiert également : Plugins/Caption: Plugins Plugins/Disable/Caption: désactiver Plugins/Disable/Hint: Désactive ce plugin au prochain rechargement de la page @@ -75,6 +79,8 @@ Plugins/Languages/Hint: Plugins de langue Plugins/NoInfoFound/Hint: ''"<$text text=<<currentTab>>/>"'' non trouvé Plugins/NotInstalled/Hint: Ce plugin n'est pas installé Plugins/OpenPluginLibrary: ouvre la bibliothèque de plugins +Plugins/ClosePluginLibrary: ferme la bibliothèque des plugins +Plugins/PluginWillRequireReload: (rechargement requis) Plugins/Plugins/Caption: Plugins Plugins/Plugins/Hint: Plugins Plugins/Reinstall/Caption: réinstalle @@ -93,13 +99,15 @@ Saving/GitService/CommitMessage: Enregistré depuis TiddlyWiki Saving/GitService/Description: Ces paramètres ne sont utilisés que pour l'enregistrement sur <<service-name>> Saving/GitService/Filename: Nom du fichier cible (par ex. `index.html`) Saving/GitService/Path: Chemin vers le fichier cible (par ex. `/wiki/`) -Saving/GitService/Repo: //Repository// cible (par ex. `Jermolene/TiddlyWiki5`) +Saving/GitService/Repo: //Dépôt// cible (par ex. `Jermolene/TiddlyWiki5`) Saving/GitService/ServerURL: URL du serveur d'API Saving/GitService/UserName: Nom d'utilisateur Saving/GitService/GitHub/Caption: Enregistreur ~GitHub Saving/GitService/GitHub/Password: Mot de passe, jeton OAUTH, ou //personal access token// (voir [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] pour de plus amples détails) Saving/GitService/GitLab/Caption: Enregistreur ~GitLab Saving/GitService/GitLab/Password: //Personal access token// pour cette API (voir [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] pour de plus amples details) +Saving/GitService/Gitea/Caption: Enregistreur Gitea +Saving/GitService/Gitea/Password: //Jeton d'accès// pour cette API (via l'interface web de Gitea : `Configuration | Applications | Générer le nouveau jeton`) Saving/TiddlySpot/Advanced/Heading: Paramètres avancés Saving/TiddlySpot/BackupDir: Dossier des //sauvegardes// Saving/TiddlySpot/Backups: Sauvegardes diff --git a/languages/fr-FR/Docs/PaletteColours.multids b/languages/fr-FR/Docs/PaletteColours.multids index 37344a176..bb9312d06 100644 --- a/languages/fr-FR/Docs/PaletteColours.multids +++ b/languages/fr-FR/Docs/PaletteColours.multids @@ -29,6 +29,8 @@ external-link-foreground-hover: Premier plan lors du passage de la souris sur un external-link-foreground-visited: Premier plan pour un lien externe déjà visité external-link-foreground: Premier plan pour un lien externe foreground: Premier plan +menubar-background: Fond pour la barre de menu +menubar-foreground: Premier plan pour la barre de menu message-background: Fond pour les messages message-border: Bordure pour les messages message-foreground: Premier plan pour les messages diff --git a/languages/fr-FR/EditTemplate.multids b/languages/fr-FR/EditTemplate.multids index bc72ca48c..de7b85368 100644 --- a/languages/fr-FR/EditTemplate.multids +++ b/languages/fr-FR/EditTemplate.multids @@ -6,6 +6,7 @@ Body/Preview/Type/Output: sortie Field/Remove/Caption: supprimer le champ Field/Remove/Hint: Supprime le champ Fields/Add/Button: ajouter +Fields/Add/Button/Hint: Ajoute le nouveau champ au tiddler Fields/Add/Name/Placeholder: nom du champ Fields/Add/Prompt: Ajouter un nouveau champ : Fields/Add/Value/Placeholder: valeur du champ diff --git a/languages/fr-FR/Fields.multids b/languages/fr-FR/Fields.multids index 1c58305d8..71e03e00a 100644 --- a/languages/fr-FR/Fields.multids +++ b/languages/fr-FR/Fields.multids @@ -29,7 +29,9 @@ source: URL source associée à ce tiddler subtitle: Texte du sous-titre pour un wizard tags: Liste des tags associés à un tiddler text: Texte du corps de ce tiddler +throttle.refresh: Si présent, ralentit les rafraîchissements de ce tiddler title: Nom unique du tiddler toc-link: Une valeur à ''no'' supprime le lien vers le tiddler dans l'arborescences des tables des matières type: Type de contenu du tiddler version: S'il s'agit d'un plugin, l'information de version +_is_skinny: Si présent, indique que le champ //text// du tiddler doit être chargé depuis le serveur diff --git a/languages/fr-FR/Misc.multids b/languages/fr-FR/Misc.multids index 4fa120e08..5110bb717 100644 --- a/languages/fr-FR/Misc.multids +++ b/languages/fr-FR/Misc.multids @@ -28,6 +28,7 @@ Error/Filter: Erreur de filtre Error/FilterSyntax: Erreur de syntaxe dans l'expression du filtre Error/IsFilterOperator: Erreur de filtre : Opérande inconnu pour l'opérateur de filtre 'is' Error/LoadingPluginLibrary: Erreur lors du chargement de la bibliothèque de plugins +Error/NetworkErrorAlert: `<h2>''Erreur Réseau''</h2>Il semble que la connexion au serveur soit perdue. Cela peut indiquer un problème avec votre connexion réseau. Essayez de rétablir la connectivité du réseau avant de continuer.<br><br>''Toute modification non enregistrée sera automatiquement synchronisée lorsque la connectivité sera rétablie''.` Error/RecursiveTransclusion: Erreur dans le widget //transclude// : transclusion récursive Error/RetrievingSkinny: Erreur pendant la récupération de la liste des tiddlers partiels Error/SavingToTWEdit: Erreur lors de l'enregistrement vers TWEdit @@ -59,13 +60,14 @@ MissingTiddler/Hint: Le tiddler « <$text text=<<currentTiddler>>/> » est manqu No: Non OfficialPluginLibrary: Bibliothèque officielle des plugins ~TiddlyWiki OfficialPluginLibrary/Hint: La bibliothèque officielle des plugins ~TiddlyWiki sur tiddlywiki.com. Plugins, thèmes et packs pour les différentes langues sont maintenus par l'équipe responsable du noyau. -PluginReloadWarning: Merci d'enregistrer {{$:/core/ui/Buttons/save-wiki}} et de recharger {{$:/core/ui/Buttons/refresh}} pour que les changements apportés aux plugins prennent effet +PluginReloadWarning: Merci d'enregistrer {{$:/core/ui/Buttons/save-wiki}} et de recharger {{$:/core/ui/Buttons/refresh}} pour que les changements apportés aux plugins ~JavaScript prennent effet RecentChanges/DateFormat: DD MMM YYYY SystemTiddler/Tooltip: Ceci est un tiddler système SystemTiddlers/Include/Prompt: Inclure les tiddlers système TagManager/Colour/Heading: Couleur TagManager/Count/Heading: Total TagManager/Icon/Heading: Icône +TagManager/Icons/None: Aucune TagManager/Info/Heading: Info TagManager/Tag/Heading: Tag Tiddler/DateFormat: DD MMM YYYY à hhh0mm diff --git a/languages/fr-FR/NewJournalTags.tid b/languages/fr-FR/NewJournalTags.tid new file mode 100644 index 000000000..0534cba33 --- /dev/null +++ b/languages/fr-FR/NewJournalTags.tid @@ -0,0 +1,2 @@ +title: $:/config/NewJournal/Tags +tags: Journal From 59fd5570678c9a174019a8992e923beafb85592d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 6 Apr 2020 10:15:18 +0100 Subject: [PATCH 0558/2376] Minor tweaks to plugin library listings * Adds a name to the core plugin * Make plugin listings consistently show "name: description" * Make plugin listings consistently sort by title (thus grouping publishers) * Add a missing plugin name See discussion here: https://github.com/Jermolene/TiddlyWiki5/pull/4508#issuecomment-609671970 --- core/plugin.info | 1 + core/ui/Components/plugin-info.tid | 2 +- core/ui/ControlPanel/Modals/AddPlugins.tid | 4 ++-- core/ui/ControlPanel/Plugins.tid | 2 +- .../from tw5.com/How to create plugins in the browser.tid | 2 +- plugins/tiddlywiki/dynannotate/plugin.info | 1 + plugins/tiddlywiki/dynaview/plugin.info | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/plugin.info b/core/plugin.info index a085ac3a7..da319c2e9 100644 --- a/core/plugin.info +++ b/core/plugin.info @@ -1,5 +1,6 @@ { "title": "$:/core", + "name": "Core", "description": "TiddlyWiki5 core", "author": "JeremyRuston", "core-version": ">=5.0.0", diff --git a/core/ui/Components/plugin-info.tid b/core/ui/Components/plugin-info.tid index 54e394d82..c3e03f9b0 100644 --- a/core/ui/Components/plugin-info.tid +++ b/core/ui/Components/plugin-info.tid @@ -38,7 +38,7 @@ $:/config/Plugins/Disabled/$(currentTiddler)$ </div> <div class="tc-plugin-info-chunk tc-plugin-info-description"> <h1> -''<$view field="description"><$view field="title"/></$view>'' $disabledMessage$ +''<$view field="name"/>'': <$view field="description"><$view field="title"/></$view> $disabledMessage$ </h1> <h2> <$view field="title"/> diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 70235d498..e0f8bbcaa 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -81,7 +81,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <$set name="original-title" value={{{ [<assetInfo>get[original-title]] }}}> <$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]" variable="ignore"> <div class="tc-plugin-info-sub-plugins"> -<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]sort[name]]" variable="assetInfo"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]]" variable="assetInfo"> <<display-plugin-info "$type$">> </$list> </div> @@ -108,7 +108,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$button> </$reveal> <div class="tc-plugin-library-listing"> -<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]sort[name]]" variable="assetInfo"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]]" variable="assetInfo"> <$list filter="[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]" variable="ignore"><!-- Hide sub-plugins if we're not searching --> <<display-plugin-info "$type$">> </$list> diff --git a/core/ui/ControlPanel/Plugins.tid b/core/ui/ControlPanel/Plugins.tid index 49ff58e5e..5f9b76146 100644 --- a/core/ui/ControlPanel/Plugins.tid +++ b/core/ui/ControlPanel/Plugins.tid @@ -7,7 +7,7 @@ caption: {{$:/language/ControlPanel/Plugins/Caption}} \define plugin-table(type) <$set name="plugin-type" value="""$type$"""> <$set name="qualified-state" value=<<qualify "$:/state/plugin-info">>> -<$list filter="[!has[draft.of]plugin-type[$type$]sort[description]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/> +<$list filter="[!has[draft.of]plugin-type[$type$]sort[title]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/> </$set> </$set> \end diff --git a/editions/dev/tiddlers/from tw5.com/How to create plugins in the browser.tid b/editions/dev/tiddlers/from tw5.com/How to create plugins in the browser.tid index cce9b3982..dcad80838 100644 --- a/editions/dev/tiddlers/from tw5.com/How to create plugins in the browser.tid +++ b/editions/dev/tiddlers/from tw5.com/How to create plugins in the browser.tid @@ -31,7 +31,7 @@ Click the link to the plugin tiddler to open it. Assuming it doesn't currently e |!Field |!Value | |''dependents'' |Space separated list of dependent plugins (use square brackets for titles containing spaces) | |''description'' |Plugin description | -|''name'' |Plugin name (only needed for themes) | +|''name'' |Plugin name | |''plugin-type'' |Either "plugin" for a regular plugin, "theme" for a theme, or "language" for a language pack | |''type'' |Set to "application/json" | |''version'' |Set to the version number of the plugin (eg "0.0.1") | diff --git a/plugins/tiddlywiki/dynannotate/plugin.info b/plugins/tiddlywiki/dynannotate/plugin.info index fc5781062..a0b947a15 100644 --- a/plugins/tiddlywiki/dynannotate/plugin.info +++ b/plugins/tiddlywiki/dynannotate/plugin.info @@ -1,5 +1,6 @@ { "title": "$:/plugins/tiddlywiki/dynannotate", + "name": "Dynannotate", "description": "Dynamic content annotation", "author": "JeremyRuston", "core-version": ">=5.0.0", diff --git a/plugins/tiddlywiki/dynaview/plugin.info b/plugins/tiddlywiki/dynaview/plugin.info index e47f5ca9b..3ab311621 100644 --- a/plugins/tiddlywiki/dynaview/plugin.info +++ b/plugins/tiddlywiki/dynaview/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/dynaview", - "name": "DynaView", + "name": "Dynaview", "description": "Dynamic scrolling and zooming effects", "list": "readme docs examples config" } From c259aea3bc8df13b3c8710ab5aeee3a325747583 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 6 Apr 2020 11:05:45 +0100 Subject: [PATCH 0559/2376] Travis-CI: Fix nvm failing to install Node.js v12.4.0 Something must have changed on the travis-ci end to cause things to suddenly fail --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 076db966d..cae7500c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "12.4.0" + - "12" stages: - name: test From d1b8cce6bf08e6e1bc4bd7a4158aa51a641bfc42 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Mon, 6 Apr 2020 17:54:13 +0200 Subject: [PATCH 0560/2376] Update German translations (#4539) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * update German translations --- languages/de-DE/ControlPanel.multids | 63 ++++++++++++++---------- languages/de-DE/Docs/ModuleTypes.multids | 2 +- languages/de-DE/EditTemplate.multids | 6 ++- languages/de-DE/Fields.multids | 2 + languages/de-DE/Misc.multids | 4 +- languages/de-DE/NewJournal.multids | 1 - languages/de-DE/NewJournalTags.tid | 2 + languages/de-DE/Search.multids | 2 +- 8 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 languages/de-DE/NewJournalTags.tid diff --git a/languages/de-DE/ControlPanel.multids b/languages/de-DE/ControlPanel.multids index 2c26d2209..205372f86 100644 --- a/languages/de-DE/ControlPanel.multids +++ b/languages/de-DE/ControlPanel.multids @@ -4,25 +4,27 @@ Advanced/Caption: Erweitert Advanced/Hint: Interne Informationen über dieses ~TiddlyWiki. Appearance/Caption: Design Appearance/Hint: Möglichkeiten um das Aussehen Ihres ~TiddlyWikis anzupassen. -Basics/AnimDuration/Prompt: Dauer der Animation: +Basics/AnimDuration/Prompt: Dauer der Animation +Basics/AutoFocus/Prompt: Standard Fokus Feld für neue Tiddler Basics/Caption: Basis Basics/DefaultTiddlers/BottomHint: Verwenden Sie [[doppelte eckige Klammern]] für Titel mit Leerzeichen oder wählen Sie <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">Offene Tiddler beim Laden wiederherstellen.</$button> -Basics/DefaultTiddlers/Prompt: Standard-Tiddler: -Basics/DefaultTiddlers/TopHint: Tiddler, die beim Start geladen werden: -Basics/Language/Prompt: Hallo! Aktuelle Sprache: -Basics/NewJournal/Title/Prompt: Titel des neuen Journal-Tiddlers: -Basics/NewJournal/Text/Prompt: Text des neuen Journal-Tiddlers: -Basics/NewJournal/Tags/Prompt: Tags des neuen Journal-Tiddlers: -Basics/NewTiddler/Title/Prompt: Titel des neuen Tiddlers: -Basics/OverriddenShadowTiddlers/Prompt: Anzahl überschriebener Schatten-Tiddler: -Basics/ShadowTiddlers/Prompt: Anzahl Schatten-Tiddler: -Basics/Subtitle/Prompt: Untertitel: -Basics/SystemTiddlers/Prompt: Anzahl System-Tiddler: -Basics/Tags/Prompt: Anzahl Tags: -Basics/Tiddlers/Prompt: Anzahl Tiddler: -Basics/Title/Prompt: Titel dieses ~TiddlyWikis: -Basics/Username/Prompt: Benutzersignatur zum Editieren: -Basics/Version/Prompt: ~TiddlyWiki Version: +Basics/DefaultTiddlers/Prompt: Standard-Tiddler +Basics/DefaultTiddlers/TopHint: Tiddler, die beim Start geladen werden +Basics/Language/Prompt: Hallo! Aktuelle Sprache +Basics/NewJournal/Title/Prompt: Titel des neuen Journal-Tiddlers +Basics/NewJournal/Text/Prompt: Text des neuen Journal-Tiddlers +Basics/NewJournal/Tags/Prompt: Tags des neuen Journal-Tiddlers +Basics/NewTiddler/Title/Prompt: Titel des neuen Tiddlers +Basics/NewTiddler/Tags/Prompt: Tags des neuen Tiddlers +Basics/OverriddenShadowTiddlers/Prompt: Anzahl überschriebener Schatten-Tiddler +Basics/ShadowTiddlers/Prompt: Anzahl Schatten-Tiddler +Basics/Subtitle/Prompt: Untertitel +Basics/SystemTiddlers/Prompt: Anzahl System-Tiddler +Basics/Tags/Prompt: Anzahl Tags +Basics/Tiddlers/Prompt: Anzahl Tiddler +Basics/Title/Prompt: Titel dieses ~TiddlyWikis +Basics/Username/Prompt: Benutzersignatur zum Editieren +Basics/Version/Prompt: ~TiddlyWiki Version EditorTypes/Caption: Editor Typen EditorTypes/Editor/Caption: Editor EditorTypes/Hint: Diese Tiddler definieren, welcher Editor für bestimmte Tiddler Typen (MIME-Type) verwendet werden soll. @@ -47,6 +49,8 @@ LoadedModules/Hint: Hier werden die geladenen Module und ihre Quelltext-Komponen Palette/Caption: Palette Palette/Editor/Clone/Caption: Palette klonen Palette/Editor/Clone/Prompt: Es wird empfohlen, dass Sie diese Schatten-Palette klonen, bevor Sie sie bearbeiten. Der Name der Palette wird im Tiddler-Feld "description" eingestellt. +Palette/Editor/Delete/Hint: Lösche diesen Eintrag von der Palette +Palette/Editor/Names/External/Show: Zeige Farb-namen, die nicht Tiel der bestehenden Palette sind Palette/Editor/Prompt/Modified: Diese Schatten-Palette wurde bearbeitet. Palette/Editor/Prompt: Bearbeiten Palette/Editor/Reset/Caption: Palette zurücksetzen @@ -61,6 +65,7 @@ Parsing/Pragma/Caption: Pragma Regeln Plugins/Add/Caption: Suche Plugins/Add/Hint: Suche und installiere neue Plugins Plugins/AlreadyInstalled/Hint: Dieses Plugin ist bereits installiert. Version: <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: Benötigt auch: Plugins/Caption: Plugins Plugins/Disable/Caption: deaktivieren Plugins/Disable/Hint: Deaktivieren Sie dieses Plugin beim nächsten Laden der Seite. @@ -76,6 +81,7 @@ Plugins/NoInfoFound/Hint: Kein ''"<$text text=<<currentTab>>/>"'' gefunden Plugins/NotInstalled/Hint: Dieses Plugin ist momentan nicht installiert Plugins/OpenPluginLibrary: Öffne das Plugin-Verzeichnis Plugins/ClosePluginLibrary: Schließe das Plugin-Verzeichnis +Plugins/PluginWillRequireReload: ("reload" ist nötig) Plugins/Plugins/Caption: Plugins Plugins/Plugins/Hint: Erweiterungen Plugins/Reinstall/Caption: erneut installieren @@ -89,15 +95,20 @@ Saving/DownloadSaver/Hint: Diese Einstellungen gelten für den HTML5-compatiblen Saving/General/Caption: Allgemein Saving/General/Hint: Diese Einstellungen gelten für alle Speichermechanismen Saving/Hint: Einstellungen zu den TiddlyWiki Speichermechanismen -Saving/GitHub/Branch: Ziel "branch" zum Speichern (Standard: `master`) -Saving/GitHub/Caption: ~GitHub Saver -Saving/GitHub/Description: Diese Einstellungen werden nur zum Speichern auf GitHub verwendet -Saving/GitHub/ServerURL: Server URL (Standard: `https://api.github.com`) -Saving/GitHub/Filename: Dateiname für Zielpfad (zB: `index.html`) -Saving/GitHub/Password: Password, OAUTH token, oder persönlicher "Zugriffs-Token" -Saving/GitHub/Path: Pfad für Datei (zB: `/wiki/`) -Saving/GitHub/Repo: Ziel "Repository" (zB: `Jermolene/TiddlyWiki5`) -Saving/GitHub/UserName: Benuzername +Saving/GitService/Branch: Ziel "branch" zum Speichern (Standard: `master`) +Saving/GitService/CommitMessage: Gespeichert von TiddlyWiki +Saving/GitService/Description: Diese Einstellungen werden nur zum Speichern auf <<service-name>> verwendet +Saving/GitService/Filename: Dateiname für Zielpfad (zB: `index.html`) +Saving/GitService/Path: Pfad für Datei (zB: `/wiki/`) +Saving/GitService/Repo: Ziel "Repository" (zB: `Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: Server URL (Standard: `https://api.github.com`) +Saving/GitService/UserName: Benuzername +Saving/GitService/GitHub/Caption: ~GitHub Saver +Saving/GitService/GitHub/Password: Password, "OAUTH token", oder persönlicher "Zugriffs-Token". Siehe: [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] +Saving/GitService/GitLab/Caption: ~GitLab Saver +Saving/GitService/GitLab/Password: Persönlicher "Zugriffs-Token". Siehe: [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] +Saving/GitService/Gitea/Caption: Gitea Saver +Saving/GitService/Gitea/Password: Persönlicher "Zugriffs-Token" (siehe: Gitea’s web Seite: `Settings | Applications | Generate New Token`) Saving/TiddlySpot/Advanced/Heading: Erweiterte Einstellungen Saving/TiddlySpot/BackupDir: Verzeichnis für das "Backup" Saving/TiddlySpot/Backups: "Backups" diff --git a/languages/de-DE/Docs/ModuleTypes.multids b/languages/de-DE/Docs/ModuleTypes.multids index 4c5cf8877..6e433d4f2 100644 --- a/languages/de-DE/Docs/ModuleTypes.multids +++ b/languages/de-DE/Docs/ModuleTypes.multids @@ -26,4 +26,4 @@ utils: Methoden werden `$tw.utils` hinzugefügt. utils-node: Erweitert `$tw.utils` mit Methoden aus node.js. widget: Widgets verarbeiten das Rendern und Aktualisieren der Anzeige in der DOM. wikimethod: Methoden werden zu `$tw.Wiki` hinzugefügt. -wikirule: Enthält die individuellen Parser Regeln für den WikiText-Parser. \ No newline at end of file +wikirule: Enthält die individuellen Parser Regeln für den WikiText-Parser. diff --git a/languages/de-DE/EditTemplate.multids b/languages/de-DE/EditTemplate.multids index aa896b945..17c4f8936 100644 --- a/languages/de-DE/EditTemplate.multids +++ b/languages/de-DE/EditTemplate.multids @@ -5,7 +5,10 @@ Body/Placeholder: Geben Sie den Text für diesen Tiddler ein. Body/Preview/Type/Output: Anzeige Field/Remove/Caption: Lösche Feld Field/Remove/Hint: Lösche Feld +Field/Dropdown/Caption: Feld Liste +Field/Dropdown/Hint: Zeige Feld Liste Fields/Add/Button: ok +Fields/Add/Button/Hint: Erzeuge ein neues Feld für diesen Tiddler Fields/Add/Name/Placeholder: Feld Name Fields/Add/Prompt: Feld einfügen: Fields/Add/Value/Placeholder: Feld Text / Wert @@ -14,7 +17,8 @@ Fields/Add/Dropdown/User: Anwender Felder Shadow/Warning: Dies ist ein Schatten-Tiddler. Jede Änderung, die Sie machen, überschreibt die Standardversion des Plugins: <<pluginLink>> Shadow/OverriddenWarning: Dies ist ein veränderter Tiddler. Um zur Standardversion zurückzukehren, löschen Sie diesen Tiddler. Plugin: <<pluginLink>> Tags/Add/Button: ok -Tags/Add/Placeholder: neuer Tag +Tags/Add/Button/Hint: Erzeuge einen neuen Tag +Tags/Add/Placeholder: Neuer Tag Tags/Dropdown/Caption: Tag Liste Tags/Dropdown/Hint: Tag Liste anzeigen Title/BadCharacterWarning: Warnung: Folgende Zeichen im Titel können zu Problemen führen: <<bad-chars>> diff --git a/languages/de-DE/Fields.multids b/languages/de-DE/Fields.multids index 38b32d4c2..afce70fb2 100755 --- a/languages/de-DE/Fields.multids +++ b/languages/de-DE/Fields.multids @@ -30,7 +30,9 @@ source: Eine Quelltext URL, verbunden mit diesem Tiddler. subtitle: Der Untertitel für einen "~Wizard-Dialog". tags: Eine Liste von "Tags" für diesen Tiddler. text: Der Haupttext eines Tiddlers. +throttle.refresh: Wenn es existiert, dann wird der "refresh" Zyklus des Tiddlers verzögert. title: Ein individueller einmaliger Name eines Tiddlers. toc-link: Unterdrückt die Anzeige als Link, wenn der Wert auf ''"no"'' gesetzt wird type: Legt den Typ eines Tiddlers fest (aka MIME-type). version: Versions-Information eines "plugins". +_is_skinny: Wenn es existiert, zeigt diese Feld an, dass das "Text-Feld" dynamisch vom Server geladen wird. diff --git a/languages/de-DE/Misc.multids b/languages/de-DE/Misc.multids index e1ea42824..eb8962857 100644 --- a/languages/de-DE/Misc.multids +++ b/languages/de-DE/Misc.multids @@ -28,6 +28,7 @@ Error/Filter: Filter Fehler Error/FilterSyntax: Syntax Fehler im Filter-Ausdruck Error/IsFilterOperator: Filter Fehler: Unbekannter Operand für den 'is' Filter Operator Error/LoadingPluginLibrary: Fehler beim Laden der "plugin library" +Error/NetworkErrorAlert: `<h2>''Netzwerk Fehler''</h2>Es scheint, die Verbindung zum Server ist ausgefallen. Das weist auf Probleme mit der Netzwerkverbindung hin. Bitte versuchen Sie die Verbingung wider herzustellen, bevor Sie weitermachen.<br><br>''Nicht gespeicherte Änderungen werden automatich synchronisiert, sobald die Verbindung wider hergestellt ist. Error/RecursiveTransclusion: Recursive Transclusion: Fehler im "transclude widget" Error/RetrievingSkinny: Fehler beim Empfangen einer "skinny" Tiddler Liste Error/SavingToTWEdit: Fehler beim Speichern mit "TWEdit" @@ -59,13 +60,14 @@ MissingTiddler/Hint: Fehlender Tiddler "<$text text=<<currentTiddler>>/>" - klic No: Nein OfficialPluginLibrary: Offizielles ~TiddlyWiki Plugin-Verzeichnis OfficialPluginLibrary/Hint: Offizielles ~TiddlyWiki Plugin-Verzeichnis auf tiddlywiki.com. Plugin, Themes und Sprach Dateien werden vom "core team" gewartet. -PluginReloadWarning: Das Wiki muss gespeichert {{$:/core/ui/Buttons/save-wiki}} und neu gladen {{$:/core/ui/Buttons/refresh}} werden, damit die Plugins ausgeführt werden. +PluginReloadWarning: Das Wiki muss gespeichert {{$:/core/ui/Buttons/save-wiki}} und neu gladen {{$:/core/ui/Buttons/refresh}} werden, damit die ~JavaScript Plugins ausgeführt werden. RecentChanges/DateFormat: YYYY MMM DD SystemTiddler/Tooltip: Das ist ein System-Tiddler SystemTiddlers/Include/Prompt: System-Tiddler einschließen TagManager/Colour/Heading: Farbe TagManager/Count/Heading: Anzahl TagManager/Icon/Heading: Symbol +TagManager/Icons/None: Keine TagManager/Info/Heading: Info TagManager/Tag/Heading: Tag Tiddler/DateFormat: DDth MMM YYYY um 0hh:0mm diff --git a/languages/de-DE/NewJournal.multids b/languages/de-DE/NewJournal.multids index 9dfa43f38..b82834420 100644 --- a/languages/de-DE/NewJournal.multids +++ b/languages/de-DE/NewJournal.multids @@ -2,4 +2,3 @@ title: $:/config/NewJournal/ Title: YYYY MMM 0DD Text: -Tags: Journal diff --git a/languages/de-DE/NewJournalTags.tid b/languages/de-DE/NewJournalTags.tid new file mode 100644 index 000000000..0534cba33 --- /dev/null +++ b/languages/de-DE/NewJournalTags.tid @@ -0,0 +1,2 @@ +title: $:/config/NewJournal/Tags +tags: Journal diff --git a/languages/de-DE/Search.multids b/languages/de-DE/Search.multids index a711d3a35..a689f449c 100644 --- a/languages/de-DE/Search.multids +++ b/languages/de-DE/Search.multids @@ -17,4 +17,4 @@ Standard/Hint: Suche in Standard-Tiddlern. Standard/Matches: //<small><<resultCount>> matches</small>// System/Caption: System System/Hint: Suche in System-Tiddlern. -System/Matches: //<small><<resultCount>> Treffer</small>// \ No newline at end of file +System/Matches: //<small><<resultCount>> Treffer</small>// From c7d8492842844d7de12b7a327f978ff114708d84 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 6 Apr 2020 17:35:10 +0100 Subject: [PATCH 0561/2376] Add support for woff2 files --- boot/boot.js | 1 + 1 file changed, 1 insertion(+) diff --git a/boot/boot.js b/boot/boot.js index 63b4ac76c..d2ad69db9 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2256,6 +2256,7 @@ $tw.boot.startup = function(options) { $tw.utils.registerFileType("image/x-icon","base64",".ico",{flags:["image"]}); $tw.utils.registerFileType("application/font-woff","base64",".woff"); $tw.utils.registerFileType("application/x-font-ttf","base64",".woff"); + $tw.utils.registerFileType("application/font-woff2","base64",".woff2"); $tw.utils.registerFileType("audio/ogg","base64",".ogg"); $tw.utils.registerFileType("video/ogg","base64",[".ogm",".ogv",".ogg"]); $tw.utils.registerFileType("video/webm","base64",".webm"); From 9d4c05b6ce1b4136631130cf3303efbc169f638c Mon Sep 17 00:00:00 2001 From: Mohammad Rahmani <830394+kookma@users.noreply.github.com> Date: Tue, 7 Apr 2020 21:18:21 +0430 Subject: [PATCH 0562/2376] Signing the CLA (#4235) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 2bfa76cc7..5d85304cf 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -374,6 +374,8 @@ Marica Odagaki, @ento, 2019/08/30 Mark Stegeman, @markstegeman, 2019/08/31 +Mohammad Rahmani, @kookma, 2019/09/03 + Jan-Oliver Kaiser, @janno, 2019/09/06 Xavier Maysonnave, @xmaysonnave, 2019/11/08 From 291b1e2d33cbbc6a5d825d60a5ad3488fe94d902 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 7 Apr 2020 20:21:49 +0100 Subject: [PATCH 0563/2376] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..a1ad60cc7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve TiddlyWiki 5 +title: "[BUG]" +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..6eb55dd6b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for TiddlyWiki 5 +title: "[IDEA]" +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From fa86a90ef8cfc713f750c3be5fc0c03c43250341 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 7 Apr 2020 20:26:46 +0100 Subject: [PATCH 0564/2376] Add pull request template --- .../pull_request_template.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 000000000..e3d0735c3 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,22 @@ +--- +name: Pull Request +about: Propose a change to TiddlyWiki 5 +title: "" +labels: '' +assignees: '' + +--- + +**Is your PR related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you are proposing** +A clear and concise description of the changes you are proposing. Include images to show visual changes. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. + +If you link to discussions elsewhere then please copy and paste the important text, and don't expect readers to scan the entire discussion to find the relevant part. From e8506813fe90292adba782a2b36d43e90a0c886c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 7 Apr 2020 20:32:40 +0100 Subject: [PATCH 0565/2376] Docs: fix broken link Fixes #4266 --- editions/tw5.com/tiddlers/definitions/GitHub.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/definitions/GitHub.tid b/editions/tw5.com/tiddlers/definitions/GitHub.tid index 28a097a73..adbe968bd 100644 --- a/editions/tw5.com/tiddlers/definitions/GitHub.tid +++ b/editions/tw5.com/tiddlers/definitions/GitHub.tid @@ -10,4 +10,4 @@ The code and documentation of TiddlyWiki is hosted on GitHub at: https://github.com/Jermolene/TiddlyWiki5 -GitHub also offer a free web hosting service called [[GitHub Pages|https://pages.github.com/]] that can be used directly from the single file configuration. See [[Saving to GitHub]]. +GitHub also offer a free web hosting service called [[GitHub Pages|https://pages.github.com/]] that can be used directly from the single file configuration. See [[Saving to a Git service]]. From 338cffd8c708a8706024077b7b149c6f2ef801b6 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 7 Apr 2020 21:33:46 +0200 Subject: [PATCH 0566/2376] Add dependents to codemirror addons (#4278) * use dependents in codemirror-autocomplete * add dependents to codemirror-mode-htmlmixed * add dependents to sublime keymap * add dependents to vim keymap * add dependents to htmlmixed mode * add dependents to htmlembedded mode * add dependents to markdown mode * fix typo in markdown-mode * fix typo in codemirror-mode-htmlembedded * fix typo in codemirror-keymap-sublime * fix typo in codemirror-keymap-vim * fix typo in codemirror-mode-htmlembedded * fix typo in codemirror-mode-markdown --- plugins/tiddlywiki/codemirror-autocomplete/plugin.info | 1 + plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info | 1 + plugins/tiddlywiki/codemirror-keymap-vim/plugin.info | 1 + plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info | 1 + plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info | 1 + plugins/tiddlywiki/codemirror-mode-markdown/plugin.info | 1 + 6 files changed, 6 insertions(+) diff --git a/plugins/tiddlywiki/codemirror-autocomplete/plugin.info b/plugins/tiddlywiki/codemirror-autocomplete/plugin.info index b8696e4ca..1bae60cc6 100755 --- a/plugins/tiddlywiki/codemirror-autocomplete/plugin.info +++ b/plugins/tiddlywiki/codemirror-autocomplete/plugin.info @@ -3,5 +3,6 @@ "name": "CodeMirror Autocomplete", "description": "Autocompletion for CodeMirror", "parent-plugin": "$:/plugins/tiddlywiki/codemirror", + "dependents": ["$:/plugins/tiddlywiki/codemirror-mode-css"], "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info b/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info index ad278481e..9a195a7df 100755 --- a/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-sublime-text/plugin.info @@ -3,5 +3,6 @@ "name": "CodeMirror Keymap Sublime Text", "description": "Keymap compatible with Sublime Text for CodeMirror", "parent-plugin": "$:/plugins/tiddlywiki/codemirror", + "dependents": ["$:/plugins/tiddlywiki/codemirror-search-replace","$:/plugins/tiddlywiki/codemirror-closebrackets"], "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info b/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info index 54b882bd0..36eff38a1 100755 --- a/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info +++ b/plugins/tiddlywiki/codemirror-keymap-vim/plugin.info @@ -3,5 +3,6 @@ "name": "CodeMirror Keymap Vim", "description": "Keymap compatible with Vim for CodeMirror", "parent-plugin": "$:/plugins/tiddlywiki/codemirror", + "dependents": ["$:/plugins/tiddlywiki/codemirror-search-replace","$:/plugins/tiddlywiki/codemirror-closebrackets"], "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info b/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info index 09eaaae98..bc73869aa 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-htmlembedded/plugin.info @@ -3,5 +3,6 @@ "name": "CodeMirror Mode HTML Embedded", "description": "Embedded HTML highlighting mode for CodeMirror", "parent-plugin": "$:/plugins/tiddlywiki/codemirror", + "dependents": ["$:/plugins/tiddlywiki/codemirror-mode-htmlmixed","$:/plugins/tiddlywiki/codemirror-mode-javascript","$:/plugins/tiddlywiki/codemirror-mode-css","$:/plugins/tiddlywiki/codemirror-mode-xml"], "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info b/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info index 8e94358e2..91d54ab61 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-htmlmixed/plugin.info @@ -3,5 +3,6 @@ "name": "CodeMirror Mode HTML Mixed", "description": "HTML mixed highlighting mode for CodeMirror", "parent-plugin": "$:/plugins/tiddlywiki/codemirror", + "dependents": ["$:/plugins/tiddlywiki/codemirror-mode-xml","$:/plugins/tiddlywiki/codemirror-mode-javascript","$:/plugins/tiddlywiki/codemirror-mode-css"], "list": "readme" } diff --git a/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info b/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info index 140ba5326..53d199de8 100755 --- a/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info +++ b/plugins/tiddlywiki/codemirror-mode-markdown/plugin.info @@ -3,5 +3,6 @@ "name": "CodeMirror Mode Markdown", "description": "Markdown highlighting mode for CodeMirror", "parent-plugin": "$:/plugins/tiddlywiki/codemirror", + "dependents": ["$:/plugins/tiddlywiki/codemirror-mode-xml"], "list": "readme" } From 322c37d6935170a431c90bcfb888e444befaab3d Mon Sep 17 00:00:00 2001 From: Nils-Hero Lindemann <nilsherolindemann@gmail.com> Date: Tue, 7 Apr 2020 21:39:13 +0200 Subject: [PATCH 0567/2376] Let chained `>` blockquotes generate valid HTML (#4332) * Replace "p" with "div" in itemTag '>> text' will now be valid html. * Make the new div's behave like p's --- core/modules/parsers/wikiparser/rules/list.js | 2 +- themes/tiddlywiki/vanilla/base.tid | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/modules/parsers/wikiparser/rules/list.js b/core/modules/parsers/wikiparser/rules/list.js index 8ecb91108..17eab6dad 100644 --- a/core/modules/parsers/wikiparser/rules/list.js +++ b/core/modules/parsers/wikiparser/rules/list.js @@ -60,7 +60,7 @@ var listTypes = { "#": {listTag: "ol", itemTag: "li"}, ";": {listTag: "dl", itemTag: "dt"}, ":": {listTag: "dl", itemTag: "dd"}, - ">": {listTag: "blockquote", itemTag: "p"} + ">": {listTag: "blockquote", itemTag: "div"} }; /* diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 2541938c1..9809dcf11 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -130,6 +130,11 @@ blockquote { quotes: "\201C""\201D""\2018""\2019"; } +blockquote > div { + margin-top: 1em; + margin-bottom: 1em; +} + blockquote.tc-big-quote { font-family: Georgia, serif; position: relative; From de5bb823fa78d78a4afd9579d2fc0543f0b49b4e Mon Sep 17 00:00:00 2001 From: Nils-Hero Lindemann <nilsherolindemann@gmail.com> Date: Tue, 7 Apr 2020 21:41:00 +0200 Subject: [PATCH 0568/2376] Enable the internals plugin by default in docs (#4335) * Enable the internals plugin by default in docs 1. Why hide such a useful thing from the users? 2. When playing around with code examples from the docs they may want to know how the resulting html looks. * Improve doc * Typo Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- editions/de-AT-server/tiddlywiki.info | 3 ++- editions/de-AT/tiddlywiki.info | 5 +++-- editions/de-DE/tiddlywiki.info | 5 +++-- editions/dev/tiddlywiki.info | 3 ++- editions/es-ES-server/tiddlywiki.info | 3 ++- editions/es-ES/tiddlywiki.info | 5 +++-- editions/fr-FR-server/tiddlywiki.info | 3 ++- editions/fr-FR/tiddlywiki.info | 5 +++-- editions/ja-JP/tiddlywiki.info | 5 +++-- editions/ko-KR-server/tiddlywiki.info | 3 ++- editions/ko-KR/tiddlywiki.info | 5 +++-- editions/tw5.com-docs/tiddlywiki.info | 3 ++- editions/tw5.com-server/tiddlywiki.info | 3 ++- editions/tw5.com/tiddlers/howtos/Text preview.tid | 10 +++++++++- editions/tw5.com/tiddlywiki.info | 1 + editions/tw5tank/tiddlywiki.info | 5 +++-- editions/zh-Hans/tiddlywiki.info | 5 +++-- editions/zh-Hant/tiddlywiki.info | 5 +++-- 18 files changed, 51 insertions(+), 26 deletions(-) diff --git a/editions/de-AT-server/tiddlywiki.info b/editions/de-AT-server/tiddlywiki.info index 12c109150..c09be1db8 100644 --- a/editions/de-AT-server/tiddlywiki.info +++ b/editions/de-AT-server/tiddlywiki.info @@ -3,7 +3,8 @@ "plugins": [ "tiddlywiki/tiddlyweb", "tiddlywiki/filesystem", - "tiddlywiki/highlight" + "tiddlywiki/highlight", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/de-AT/tiddlywiki.info b/editions/de-AT/tiddlywiki.info index 57d062d9a..7dc946416 100755 --- a/editions/de-AT/tiddlywiki.info +++ b/editions/de-AT/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "en-GB", @@ -30,4 +31,4 @@ "--rendertiddlers","[!is[system]]","$:/core/templates/static.tiddler.html","static","text/plain", "--rendertiddler","$:/core/templates/static.template.css","static/static.css","text/plain"] } -} \ No newline at end of file +} diff --git a/editions/de-DE/tiddlywiki.info b/editions/de-DE/tiddlywiki.info index 6138d40bb..0cabd3f28 100755 --- a/editions/de-DE/tiddlywiki.info +++ b/editions/de-DE/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "en-GB", @@ -33,4 +34,4 @@ "--rendertiddlers","[!is[system]]","$:/core/templates/static.tiddler.html","static","text/plain", "--rendertiddler","$:/core/templates/static.template.css","static/static.css","text/plain"] } -} \ No newline at end of file +} diff --git a/editions/dev/tiddlywiki.info b/editions/dev/tiddlywiki.info index 0a695359f..9ccbb65b0 100644 --- a/editions/dev/tiddlywiki.info +++ b/editions/dev/tiddlywiki.info @@ -3,7 +3,8 @@ "plugins": [ "tiddlywiki/highlight", "tiddlywiki/nodewebkitsaver", - "tiddlywiki/github-fork-ribbon" + "tiddlywiki/github-fork-ribbon", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/es-ES-server/tiddlywiki.info b/editions/es-ES-server/tiddlywiki.info index 93ba8ff12..c53b18a29 100644 --- a/editions/es-ES-server/tiddlywiki.info +++ b/editions/es-ES-server/tiddlywiki.info @@ -3,7 +3,8 @@ "plugins": [ "tiddlywiki/tiddlyweb", "tiddlywiki/filesystem", - "tiddlywiki/highlight" + "tiddlywiki/highlight", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/es-ES/tiddlywiki.info b/editions/es-ES/tiddlywiki.info index 29aa2d4e4..b72f0b5ee 100644 --- a/editions/es-ES/tiddlywiki.info +++ b/editions/es-ES/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "es-ES" @@ -40,4 +41,4 @@ "config": { "retain-original-tiddler-path": true } -} \ No newline at end of file +} diff --git a/editions/fr-FR-server/tiddlywiki.info b/editions/fr-FR-server/tiddlywiki.info index b7460b53f..4129b8854 100644 --- a/editions/fr-FR-server/tiddlywiki.info +++ b/editions/fr-FR-server/tiddlywiki.info @@ -3,7 +3,8 @@ "plugins": [ "tiddlywiki/tiddlyweb", "tiddlywiki/filesystem", - "tiddlywiki/highlight" + "tiddlywiki/highlight", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/fr-FR/tiddlywiki.info b/editions/fr-FR/tiddlywiki.info index f4b37b40d..a710d5775 100644 --- a/editions/fr-FR/tiddlywiki.info +++ b/editions/fr-FR/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "fr-FR" @@ -40,4 +41,4 @@ "config": { "retain-original-tiddler-path": true } -} \ No newline at end of file +} diff --git a/editions/ja-JP/tiddlywiki.info b/editions/ja-JP/tiddlywiki.info index 2fe01f6fd..b6732ac05 100644 --- a/editions/ja-JP/tiddlywiki.info +++ b/editions/ja-JP/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "ja-JP" @@ -40,4 +41,4 @@ "config": { "retain-original-tiddler-path": true } -} \ No newline at end of file +} diff --git a/editions/ko-KR-server/tiddlywiki.info b/editions/ko-KR-server/tiddlywiki.info index 04e6a2f31..a7d97848e 100644 --- a/editions/ko-KR-server/tiddlywiki.info +++ b/editions/ko-KR-server/tiddlywiki.info @@ -3,7 +3,8 @@ "plugins": [ "tiddlywiki/tiddlyweb", "tiddlywiki/filesystem", - "tiddlywiki/highlight" + "tiddlywiki/highlight", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/ko-KR/tiddlywiki.info b/editions/ko-KR/tiddlywiki.info index 95753c164..5caf6a085 100644 --- a/editions/ko-KR/tiddlywiki.info +++ b/editions/ko-KR/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "ko-KR" @@ -40,4 +41,4 @@ "config": { "retain-original-tiddler-path": true } -} \ No newline at end of file +} diff --git a/editions/tw5.com-docs/tiddlywiki.info b/editions/tw5.com-docs/tiddlywiki.info index 1a80ab6a4..bf8f1cac6 100644 --- a/editions/tw5.com-docs/tiddlywiki.info +++ b/editions/tw5.com-docs/tiddlywiki.info @@ -1,7 +1,8 @@ { "description": "Documentation from tw5.com edition", "plugins": [ - "tiddlywiki/tw5.com-docs" + "tiddlywiki/tw5.com-docs", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/tw5.com-server/tiddlywiki.info b/editions/tw5.com-server/tiddlywiki.info index 0c97506fe..7f0ebb215 100644 --- a/editions/tw5.com-server/tiddlywiki.info +++ b/editions/tw5.com-server/tiddlywiki.info @@ -4,7 +4,8 @@ "tiddlywiki/tiddlyweb", "tiddlywiki/filesystem", "tiddlywiki/highlight", - "tiddlywiki/mobiledragdrop" + "tiddlywiki/mobiledragdrop", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", diff --git a/editions/tw5.com/tiddlers/howtos/Text preview.tid b/editions/tw5.com/tiddlers/howtos/Text preview.tid index beade8e64..378157cec 100644 --- a/editions/tw5.com/tiddlers/howtos/Text preview.tid +++ b/editions/tw5.com/tiddlers/howtos/Text preview.tid @@ -3,4 +3,12 @@ modified: 20160817104802841 tags: [[Editor toolbar]] title: Text preview -Pressing the eye icon {{$:/core/ui/EditorToolbar/preview}} will open or close a preview window (and the eye) of the text you are editing. \ No newline at end of file +Pressing the eye icon {{$:/core/ui/EditorToolbar/preview}} will open or close a preview window for your WikiText (The icon-eye will also open or close). + +Right to the eye there is another icon, {{$:/core/images/chevron-down}}, which when clicked, shows you a dropdown which gives you access to six different types of preview: + +* //output// shows you the text as you see it when you do not edit the tiddler. +* //html// shows you the [[source code|https://www.w3schools.com/html/html_intro.asp]] of that output. Your web browser uses this source code to display webpages. +* //parsetree// and //widgettree// show you the two object trees that ~TiddlyWiki internally generates from ~WikiText. The //parsetree// collects basic information about your ~WikiText. From the informations of the parsetree the //widgettree// then generates extended informations and finally the above html (and the widgettree also does other things). +* //differences from current// shows you the differences since the tiddler was last saved. Deleted parts are <span style="color:red;">red</span>, added parts are <span style="color:green;">green</span>. +* //differences from shadow (if any)// does the same, but this time it shows you the differences to the underlying [[shadow-tiddler|ShadowTiddlers]]. diff --git a/editions/tw5.com/tiddlywiki.info b/editions/tw5.com/tiddlywiki.info index ecd1fa636..77a70d71f 100644 --- a/editions/tw5.com/tiddlywiki.info +++ b/editions/tw5.com/tiddlywiki.info @@ -5,6 +5,7 @@ "tiddlywiki/browser-sniff", "tiddlywiki/railroad", "tiddlywiki/evernote", + "tiddlywiki/internals" "tiddlywiki/menubar" ], "themes": [ diff --git a/editions/tw5tank/tiddlywiki.info b/editions/tw5tank/tiddlywiki.info index e1c730f2a..bcb41dc6e 100644 --- a/editions/tw5tank/tiddlywiki.info +++ b/editions/tw5tank/tiddlywiki.info @@ -1,7 +1,8 @@ { "description": "Demo of Tank integration", "plugins": [ - "tiddlywiki/tiddlyweb" + "tiddlywiki/tiddlyweb", + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", @@ -11,4 +12,4 @@ "index": [ "--rendertiddler","$:/core/save/all","tw5tank.html","text/plain"] } -} \ No newline at end of file +} diff --git a/editions/zh-Hans/tiddlywiki.info b/editions/zh-Hans/tiddlywiki.info index 9b05c9e26..1f4ca4cdd 100644 --- a/editions/zh-Hans/tiddlywiki.info +++ b/editions/zh-Hans/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "zh-Hans" @@ -40,4 +41,4 @@ "config": { "retain-original-tiddler-path": true } -} \ No newline at end of file +} diff --git a/editions/zh-Hant/tiddlywiki.info b/editions/zh-Hant/tiddlywiki.info index 37ff75d22..3b80bc084 100644 --- a/editions/zh-Hant/tiddlywiki.info +++ b/editions/zh-Hant/tiddlywiki.info @@ -9,7 +9,8 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly" + "tiddlywiki/readonly", + "tiddlywiki/internals" ], "languages": [ "zh-Hant" @@ -40,4 +41,4 @@ "config": { "retain-original-tiddler-path": true } -} \ No newline at end of file +} From d2f2d7a11b509f6249fa7b593cb13bdf94969d95 Mon Sep 17 00:00:00 2001 From: Matt Lauber <github@mklauber.com> Date: Tue, 7 Apr 2020 15:44:08 -0400 Subject: [PATCH 0569/2376] Update jsonstringify Operator.tid (#4348) --- .../tw5.com/tiddlers/filters/jsonstringify Operator.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid b/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid index d9fd288b7..ff361450e 100644 --- a/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid +++ b/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid @@ -15,11 +15,11 @@ The following substitutions are made: |!Character |!Replacement | |`\` |`\\` | -|`"` |`\\"` | +|`"` |`\"` | |`\r` (carriage return) |`\\r` | |`\n` (line feed) |`\\n` | -|`\x08` (backpsace) |`\\b` | -|`\x0c` (formfield) |`\\f` | +|`\x08` (backspace) |`\\b` | +|`\x0c` (form field) |`\\f` | |`\t` (tab) |`\\t` | |Characters from 0x00 to 0x1f |`\\x##` where ## is two hex digits | |Characters from 0x80 to 0xffff |`\\u####` where #### is four hex digits | From 72159c51188d98ecafc6f9799334bd0d6f4864b6 Mon Sep 17 00:00:00 2001 From: Rob Hoelz <rob@hoelz.ro> Date: Tue, 7 Apr 2020 14:44:26 -0500 Subject: [PATCH 0570/2376] Enable indexers in tag test (#4355) Setting enableIndexers to an empty array ends up disabling all indexers for the wiki --- editions/test/tiddlers/tests/test-tags.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/test/tiddlers/tests/test-tags.js b/editions/test/tiddlers/tests/test-tags.js index 324a1e51a..d4853116e 100644 --- a/editions/test/tiddlers/tests/test-tags.js +++ b/editions/test/tiddlers/tests/test-tags.js @@ -21,7 +21,7 @@ describe("With no indexers", function() { }); describe("With all indexers", function() { - var wikiOptions = {enableIndexers: []}, + var wikiOptions = {}, wiki = setupWiki(); runTests(wiki,wikiOptions); }); From 5393187f66065f89cfea6070ea6fc5481bde8edf Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 8 Apr 2020 11:47:08 +0100 Subject: [PATCH 0571/2376] Fix missing comma in editions/tw5.com/tiddlywiki.info --- editions/tw5.com/tiddlywiki.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlywiki.info b/editions/tw5.com/tiddlywiki.info index 77a70d71f..0fd35f6ae 100644 --- a/editions/tw5.com/tiddlywiki.info +++ b/editions/tw5.com/tiddlywiki.info @@ -5,7 +5,7 @@ "tiddlywiki/browser-sniff", "tiddlywiki/railroad", "tiddlywiki/evernote", - "tiddlywiki/internals" + "tiddlywiki/internals", "tiddlywiki/menubar" ], "themes": [ From 1ed36adab62c117849ee29d9535136eac70d3bc7 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 8 Apr 2020 12:44:35 +0100 Subject: [PATCH 0572/2376] New release banner Congratulations @telmiger --- .../tiddlers/images/New Release Banner.jpg | Bin 143816 -> 0 bytes .../tiddlers/images/New Release Banner.png | Bin 0 -> 10370 bytes ...er.jpg.meta => New Release Banner.png.meta} | 0 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 editions/tw5.com/tiddlers/images/New Release Banner.jpg create mode 100644 editions/tw5.com/tiddlers/images/New Release Banner.png rename editions/tw5.com/tiddlers/images/{New Release Banner.jpg.meta => New Release Banner.png.meta} (100%) diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.jpg b/editions/tw5.com/tiddlers/images/New Release Banner.jpg deleted file mode 100644 index c9a4d7e17cc0ad310d68cf08fff2f3267d75151c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143816 zcmeFa2UJsOyDz>G6$^rjib!)r#6puIos2qyio#e?T0}%dr1zGsqM(AHAfS|F6fuL8 zC{<b_T||fwAWDP)0b&S{gcOpH^54#P&iBoH=bZmK>)x~OI_F-(B6&&ne)oQ#JmvSa z7wH%2D6syx-7z~rMg{<mLO+0X4EXs-l<!plIC&D-3jn|>Kqko-SPqS#Lx642F90n2 zZP~xRv&`@}*?%3&SpE1=It!TpdMz+4F!Wkr&~{^eL%{sdv6IVx%m6+97;FDAT;H#r z@-+=8UrxKZ`sob+5JEb>%;ebN!|-2EJJ}sOapaGiTDH?ODCowIll=q2LQdNs+J51p z%XYajKo0s@2W$bhdwPWi9sKpz6F=ts*VjMh|N9ef@Q-^32zo!}`nWCgwl=u_r1>+Y zf!^uOxBq_Fzdu-W#XHms`bY%*dV2+hgh7P30*$pI!-9T{??K~DA<#`h<GdeZpTCXY z{1{*U+qm_QW6qvF3?1_Y8gKWy<_XOq!-vMYm;dy>&!5Ksa$V>UVC^ryp+Pr1qqqNR z{NvC6+DDjo6toTiI2;%h9pdYAEo}Qih)Ukuj|F(?>uxtP+;0W|KWP59tFll1K}(q} zpZ@V)0vP~oa8jwX{vYoh#{s}w=*%^>|9Ee=IRI=}3jiN#gFHh#|Cmn}dR}%F;<kA- z0Ia(R07{>sb6i8O8XNubxs3cF09Y|1m9lpMfLsOuh#yI%i!Y>7aRC6xeglB_0n+!t zhE+0F%M4{@HUP^u$jEMxk+uSw5P4U~{PFnPjYEGglU=@IrQE93Yt}*sRILY=$;iqs zTQ0j|#Si9`iHAN1mTy?G@u&R<S1O(Il-m)!$>`SO=c}|1y=~fjx|g}r_;SeY)oZpW zZ&lf*y-R2Jp1mff2h7YZED!&3#LoWcvEygXo;&XhE!XRc_f?;3zSl#;!XqN1qGJ;7 z+)YfncmF|p#*@sf?5EFiUKG46e1-nK=yiETWmR>}yV|<ume#iRjt`w5`w0C5gTyai zhsMS!6O&Wa@3d*wJe$MiE${`xAM26<WdF7-==pCe`=@n5M37mwe7Wp$xgYD2Sr++Y z;Tx8(_-X&jjR#N3c?K)(FuJvB)1k-D-!`q*GCs}Rd^x0d&6b@eW7@1AOZ#JG|G9<T z{$E<z-xv0eb&-I>khK5rJ*3bi|9dk)XG@16Wo9QG0_0_7AZC)?0KkCxG(({TD+P$J zjDli<?8w43Qy`&yWI+m8ktbiI36sil;_3o%M=)i?uRAq7rGU;`YASkrn2>#|TMf^q zlNmK(bKJ(+*t_H|xT~4Z$e>?+eFPzht%#vB#4%nva_Hs$7AVe4O`{a(SrA-%;r9xq zpUdd=qgU~c$vp)-XQC-ZAJlCdMnmn5MZ$%}*<q{3z*vv5$a&&m_t%B0oVmH-%5T;! zbm5{D@OawUL~BxY^buR>F+g^s#ASC54c+x>k>etqjZZ%~r8ys~5j7nm=Y%m=>-{7J zY#Swuk&X=45#l>{Q5Cl$B7XL2eSM9;nc`p8O?V~+9J^x4A_kcCU{{^*JPj+}f~|*N zc@&)_LUtf6^KKF7J#r?YFgymt4ioAJ7pmrzLB04J!>HJcWplHnlP#ZYaTpwzmXfED zx1sXSRJ^}L!zCIn@!^szFX_WStjdx;T(T)kc6kZg{I|x3FzII&*)Rsh6glo^+!8p8 zWkPLWqXsP)5Pn#EuwH`mkOBh>iiV0Unw0OB;k3>PN~sziFRCX6VC?<tFaB09!7{pp zpRJpw!4{Tz2Uc#<-k2a+CbC@Ma@OMLT!t7P#0EtBCAJA@k36KKW$!1E6zFQKp5{c5 zs&b%1=0vzs*-sj15lks1b`){;?>F%C(&d+kzr=b=g14l0mXz+2$yqYE|9~6PUe-EE z5_dW#oKj}#gE<ijXDnFG3UF2;OB#)Qc2<+KfI`#zh>{~>zp^HrD27c!$Bj~+o7>DU z%j;rQV<y3*uKAP29uBBiv%Zt@XK3n@^HQMmMIZ-;IYYpx2NP^!ymBmvf!zY~7}3d5 zh`xqJpfC<_fikzOex(#((eVNK?1a=iqYEF_gc`ID;W8zf2Au~=qxBKFRp?Bv)5}PK zs}$IEANN_(=;YWC-f@CUOT9*Q$C**VBzGID>HHT0A)-+aoPZD3&8SL&4vbA*WRHTS zQUZDVo=-T{>k?;v9B$`O)kLi@U=Zm%VEdRn87RuxB?S%(xi*$8qPj8hl|?~*govCk zQ4ixVUPmNTX+lnw6nG4}(BA|~0gVP8jcjiI-BB^_CfZ2kUo3!+&5JUw6Vs`*dY5SU zS)o0ciJQNcD^{fUbLbszVR(<HQ>o!3HX@QAP9R{5h76V{xkSk&o?MddB|W*MCzmYF zlI>nXLH~E*Ntm>c2{RFLXm}^IrlXyuhN2Zn_Su<V(_0gON{|A#8lOq>+yliRoY^!L zE3rpgP|Wdiq&y8{dn5MjKxBMw-;kvKsN!Fzu>bP}PnS+#BHa?(EQ!pLx>!<`f3Y-6 zX5wFL?2?K6|3w!tDM3Juq~isGB)P5h)KU3$IL2KmfH@;R;18asQNxK2(Hy6zW}vV_ zlu9AI<(ON&b)1y~@IiW4m%~bwwiHl6#luD`8J|>f9w7dcxp{|MByh>!S<-m0O6-cx zC%WrVdu=ZbOMz+pyj7ZG$LG<xHme#j=!!AW)7=)AEwYT~NP*h~oMC`CS_;4nM=9#T z-(+r8!G+wFL~Z~w(mkvO^@|`OQVJBqKFrxzX&z3f-!w<&iUS%ND&P3d!<n=Nf@H0u zsHvVy6^U9BQo=ieR<0ZX>HVtkfx777@V=3FrKxpfNr@EDddHcGS5TNaQx6ikb@TIm zP3TUr1x<G1>shf^GKeTPTR~wzQT_c^)pHObeqAEN5*e1bVM!>Kbi<O0T(T7ZcN)wN zX}<u|4a;_nL6~oyfwjDl0*!9?F5zs=E1}DRt0pat%O?xTOh=uk@j<X`Fu?9u(|a3) zTY|l@q>>)XUBnO_{5F8_L8!^#{1<D2AdHHp+)8Z`S?>8H!j+L?0t+$WZy+?$E(Hc5 ztP>11B-|3!FNPR7D#+01C$?FjxM){0W*AZDdLdaTsUZuio2F1*Xd9TCe1zs$ucObT zID$lo*NZJp5+lqcH6o?^Q<`pylVsB4^q?R`c=q-m{R*X)BVq)d+c(q-Cvu^_jDc!J z6N$S8jX&xIU0vZpD9nIfJ(5fF8@>Ufvv6G8Xr7aya1_*+d`rnlxEUj=U76}5_8nZH zFTl&P26sqsr3;eMH__;MD2UY|tDeLUJM&Bcx>s|^4jy!<p9B67x~LRbJ|3M!lodqs zCa&bE$r2|&K&=jR#~K{GP8?SKR+%df#Bu!-{!HM!e^6IZC<+t@@^zFx*}l{4!qsT) z939ob=^reBx++}48--#by|C&Y4nvQJ@ZSv$Ur}8sf%U$_Q=-0U3IQkjH=6Yk>%M?Q z3P=Z=%#ohl_Y!w;t%{Buz!ik7Q^N}hr3~U6&RwtM2n0GAV%JM-r%3`5mAcYOk@+2M zJTIyDr(v@i2U{dKC|&F-S>4K3ER&mO%zo%JH<!b7J-Rjp4(10UaN$Cl|78QZkPJ?f z<Z?j$JdP-6{}(Xnhy^N}OA0*6shX?ST;h}^PFdoVC7rUQQ<kjHlJ)t|;uM&4K#%}c ztG_kxfJ|`F`-%L<AbTig6m5Zth2uTaD*6Uv;^xM4Y9(202^P#0gK}YliRc8Da50=l zluZ?lBB2gY_E#ItE9A3%xY5i~y{(}V5S4A<V8sQ8>kdvSp81mJ1)-Jx(GbUxcUp6K z#6}DiWB--rXJZ=~eA3MVLNl<B5?n%E+`M%YUmRb@q2KC21UXq0JQK_y)5-&1`@)&W z2eVS3BVqWi?81B@Zf<xxTdruvaX*CXrh_bW0^K$&IQoqc*~EewP8AYm_3l-f8ie~$ zlOVil*fv_@k_dqvjtPHH!I|siK{fk4C;P8v111>0wx5F?bR>#8+11x0hA#v>icaX~ z>1>q(^l)>vjGD4li)d4ZpMc)Wi*dm_<$pWltN;@6^Ek}t9LhS)5CMY+G+K@Zlk=2% zu1z6gbqZ#3r*oV|8><Qn6hJ(Cev;;cz%14rg<1+?l~O=%U7o@*5^;GvA!ngV#QnZ# zqvwO}ncGvG1fx?0a3V9(32FZnrirQX$PY4S^sJ^rn9e4nmv@qTa-U?iOJ8pij4BX> za4K-lV$w^EOI(}#?J(i6qukC}`fXcUckGZPh7*s>svuA!Hx0C)xNH%I&bLD2wLWR4 z5lI-wcWRN;<?I{_6teUC;x6H<ObADo`d({6u|=ZVn2Y3M$!wpZVGOdBqA3nQ%ce(g zn>53w8fQV97+bu<MH;*Q!Syk`P#|&Uiqr|z$5V<O^jRX>O~HzNJGvX{rnth1&xk*B z9Kze@D=R(m0tv#cQI|0w1tMs2Pi>qo2d7DD&fMy>iWyC-3-#dPkd2x?g(V!paGPlm zRU9V;_6a2lH1-F!9EHoH6UyY&1x?mdsXo;57~4*4Q6bp0&&9=%3iVyU^gXg7r=>uB z*uUlBe`4Twp-b$$#J)@HyQF=WwC{hp_PxV?qTz~sc?G;lCuEtcQBqEIlh}-}v;cDQ zUu;EsG>tA2TiDjB0Y^XdD1>IY4OZ8ae5Qru$OUablZ?lB0T;5EgF|F2YF(eA1+4MA z({>*grHGQ}PrtqFLEJFTR*cM=<wNFOAF{%IJSSp2C(=WdKb1BgpXwMrA#;oTw*B8A z62TI3_&3PGq^F>E=cPycNo2H6iqiZd%l<!xIXMB&Z+1!nZXLB&P3F=5yp6u0t{8u; zr0)6<y|A?OQ7r_urfp0c7bJ5nM?TCc2FR%_Nc0;m)FOt{p78E-$@uwRzj!P!>lS{& zPaJ3Yok6IsdsjcZ@7sE?$EiO^W+G)?VZS{LBQnDrm?P`y^6uls;3-<^52W|gNDKr< z78j{%S40gI^(a{r!C$fI57UmwUWkW(CEAtxDzNPZHgAdM{{e`E;KdTw`wP~CNe2ZE zk(`AN+^@!;)ixkQ^VX5)7L2Zo>v1i9QedJnY^tVS@`N@e1r+JHu1{tNP0Slvl#>@b zoHB>?7Q;H?VWpO9g;3BEaj;$(OCkTR@?BvS-lAva<fj~50E0Os1q24}7Nv8I*5om9 zq#!zx(Zb~cp|lx9Ktnw76AsO1pt<OSAQU~td@uu@;$pe7HZn~rREziDYBQW?hb5|T zDWFY9n>G^BxguDZ6fiIx<|DB072<8ux`}CZf@~<4t<I5Deuv_Ok}APU291%1_|4}x zb1iGCxoY-bms7`KgGpTS<diB-k@!UhkA5qtV=cgqBq$0NHJHBwstp{(Z66lfuo(UF z9J%E_c~seusgv-UNWMQP$}Y<rT<|~!G9~q*hL*@N;UZwc;la#2Z0S>Qf+&(8B>V=2 zO@+h>RU8^?BfN#YIhw-G8x3&lEauHgfpr)ukj^FKjL-?)5=|nQ{WL%XgI|)fMRrWl zJBH)BgkY)=bP0pvx1ftC;jdp!*E3VZFnO#>3e0=dg}M&MMB`e7jCuAtauR(8pc1}_ zhNBiS&p;;@*@^CWTLRq({L#bhr_zJ@i!m7~l(PNEkahauR~I9}QXG%$=x2MHc3mXG zh_CaqNY{Jno8jvu`$UH;u{eG(6Ep7As=Cf-QnzX?SvE?!O+&BzO+(cAu!@G-&tct% zR9(?E;m@|`51zL>7V-3}3r>qA+ks!vu&3ivIbO-ymD$zut;?txub%DwEwCfbp!w-c z%ZfF4MeD0;S0ksstl>B4`W*`M*l|bu*!dJ%ZD{+cwA|$G`5E~q`!9Ub*9b{7(Q@5z z{7IqaREp2;+I_>mM0=Cr)F+Z2DNxCm0=d`3&sS5>P2hc<8aFA>Y`HQvjG8xvvz7w) z`-Ho|zLW8qP-jyxKT-geIDhBh&J~;E25)3b5--R}fzU8z$z=BAeB?IJ2Q?JurCDJ% zyEbichZNZ8GzuHfw`qJ^|M@g{686GJypwoS(_m|Zl@$1%3~%WUcnM9D3r(Xa+6Sd9 z_M(WL_oaY5d(lY>^j07~*HR?caIFP=_E;Ohk;@D3F=ji798tYyl61fKiXu0J2FN*t zgE?GWE56zZe)qWv-TZ5q=#3NK2Qw50c9%;&fAhM<bR9p{p(Y~*Hc_p^&D+O1C)R*0 zOVlr9;V}#VvVx<ax{Tg6i*+1qlcZvT%rSZoGbrs9Utb0K;D-_<57T%_cun>Zi8dnI zcH4WK`h=eNEzX29-*cn@byu8>fZsMYJ_0HAQ;1?jma-6^0e<d~l>&Ev&;^WioEumC zO6Q?=dhxu(&+Us~D<nH9=!2+rF^C&09Tj|~Kr2nG<c_1fiUXuTTgMpHUJ7_`tmA@F z`Z}EqsNO?u4YzF!Dp^6pit{kZ*0L<KvCh8iap#u6dzuQaZi|7uy?lBTR*U%<at$k1 zpm_HQa`#NcR*OG>0k2(H%P3btbn!^=%FSj67I98YdOLZQ$Thko&VU7LA#Xtb^2Wg0 zZC!huRU2lPgdn8y0(mb!7|X|Y;VQujw&L$4KIIoMzf)|>rsG}e3crt5xG7lRr{9&> z>U^DNzusIl5Ja7tr1C;g`_fbL&eX@1R|&3!Chz)rJB5h*tPoAXt{R>}zy~a{xq=_c z>2NPW2q~Tya}p$fVR~hZ>}}(o&|9^kyD+4B(E*&qf#~QLi*YjJgYFU!&w8df{-&BR zRx=l)8O}DKNvvpM-_MYG6Z_4tBNNCP;-B$92iZmU1exhy8GvLlkqEWx#n8F~!~bXL zS(!NbjFd=vswKNUx<eKjqG0R&PddN8u(<xX1Wuje(FP|U9>D)P7_Mh!*L%YtJRa`c zSVagc)j3i1u0LGQ=~Ux0y^>0?WpkfJ046X{Cu_H!zyDZzY;scS?gF1M7Z!VD$A@=t zolozQ?uX`~lgj0D<>32!j6W?HHBGA6p35G)G<`YvYnFFfaZ=MI!>E|x@O|UK=V+%2 zSL`{Pr=`5d>wM$3O_S#vUBZeEhB_7=Yu_}cZkjjIf4OY1^d+zE8_#pm7|}=7WToQN z>qDi$n&k2I9qNcc#SO@W6xp8GHKL#5jco5RBq7P)nT>J2Oo|kE;VRLzO+txrkHOCr zU5-$q%;upANTuZ6;MKq(w=i)&*6I>Cu!DamigpW<W!CJpDzee8NeoRy<~)JhCqcos zf|fMN{TPv`Pnjn<0<}Y?R7iofOtL6f3M5R{QaucqW@)w>*SFL;wQ4Sp!oANaoP9C9 zB_=YZ!MK#~A(?J^l`|YTTT(^0QcX@i92{ta8}hWf*}a^Vt)FsVm<I6QjwL;Kr;G3z zOS;#vcKm>A=J@klpV$g3#=j*c2VIP?EZlq#ozQW)Tt33fe)WT*L#ImDY@R+-y!Z6O zBdZUh^*`yuWFMZ%QdCZCYtKC%xXvTfd*wi1#+{chh8i*#YR*M!xc=D;GRS{t`RTtI zpnxT*`7=6^k3J-yF4s?03%AfhehZ&ai=WOuz2^Xj3o>CmvUa!6M|VAsApu;X=#DC= zH`Y9}(T()g<%sFzY(LA@<;&L&?e2kr)*h|Ip~0a|>AuuwUr+BYaDF`L{WCgbZr=C= zTmPfs(>#RN!{$-L3znw)%^R*7Z*W+5w|VUQk^a(qt>b>jO|JD8I&LgFU3#oJZ+qdM z%IwB2S7p09-g`doPdO8CI{lcdYyG=o*YgbY*^)eLH{TzM67s|q*gb7N@!rfF%6k{n z3GC59+uhR<$hEQV^~R>;M13rQ^6t4z%WCK5^qucv8Pv^J;A~tQIP{id%B(9hgRIMj zL)Kv4CEB8WW|U{<_`7!Gu4%VQX5LBr=?2B~#lgXuFzySZm*3ps-YRzXAHAZ;I?c6q zrjob28S*CXuCp(%FIJXuhhF91Ks9pmvqc+fcu${2UWaeOuK5asY2RH)t=dVMOEaQ0 z<($&$7aV>py7*BF?76C0<NAJY__mJ?yII*P4h{~6EkSm!Hrz&Q*w(9Wd;J%Q@%d$W zaTlYK@8at3v~_~fr_v@}T;nkFm7%7Ad@bUvGrGxI=#+|G?T0;aqz}Icw%56fNxz#X zesPc5a?-{-bpCl=zrUW~Q~GNe53K!SDB@w%5NEfKhX$XJzIVXWG3wowZz?&L-n@Cz zI6W||aG)S9Y_ux9d6J(qcpiP+f5@eerL=75T+o*fyJo|;oj&F2K2&3tU!Zc#g=RGZ z*ASf%r-RqiZXd{)#%;i^je1RJ;XOJT89olKOIB3nhcvg#%_A3`2Sn=eB_uxLTizx9 z9p4c3@9o=5GR3{4)Y%n69X=(c#anG1#Xuf^Z-4lAPs4Aft<dI-qsZ+YUd1g)<k~%5 zQT1{e=kTlpPDnLdwq<Z|IyJ7sHbJJX*3t6#Cf3;jyP2Ya#?_s;id6%rsNiS_xwMgt z)H8LBEnKnl{0F()t0%5#p5VQwFgCi*VR-&(?v}k%$tPn9C6S95|L}U-to-Yt$A)1L zRFHuXY=)kh-Mye_xwL@TAUUlXYmA%HO}mjYZ!seFhq)v=(ZpopsmT8de?TTK+%}(0 zB5T>me7B^U7ygrx`d7y!^GfY6Dp#Rxb7e`t(Qlg1MSZiPZdNMZ%7vS~;z_DSdb>j& zxJqD=vGGG3EZUbz9YeKgrnppGL#;t*@-ZDbcZ?3IQ$<=iM+Ug5*}TL(%j*U)Z%y(Q zM(hN(#Nv?)E)(hmnKp#gIId5&iM-tC9@RrP>T$E%id)5wjVIKik}R6XjO7W_y=O2E zS|62=!N_snwjzhs8Ke8Z6x$fijVwHS*kfoB=f;Y9ZL+0wZ^rS{)zj;p^CtbHecMm+ z`WFe!n#^OEA!_U3Wwtw*2vbzE+~<qf&AK~S_}c$c=uVKC@ExJo`_=2cJf^sHW@6Kd zV|yfl!MNEs!tFurrlb7Owd0t3oNqq6uQup4eX+*uol0KtJR^?5zk^vM7sa-<XcuqZ ztRJZoQY3n%)vAWftM#>4z7NMAPw`YgAhG@qVc?xy$ByS_q7C(w`Q~i~56G*xQ6$k; zQ6J6UjUvQx#`{t@J6+`!g1$CO;7+{Rs5SKY0cJw`s<AR$tRh!Ge1<e7Zhe=NX;oN$ zAv>~gJae*Bb3>5X!kY^{9<<)ZdeRVS0!7p6YVd}1(kt<sxIOZr*XqC)#=WsyJ_$`D zrVduQ;U`iYG}FQu%iqtP4Os0P9RBW+jP4renK-${Yly@=SC26BB-L@JM7Og2sag-C zc0?y`Y$)`<hHsg{r}{Oo#yVSjD6idGIYGGljGROfWmQx;-)}BUZB)22>j&1?;Te;R zR~=1QOQudM>~2ooHBBXJ#c_<xG+Q^FbTJBZxIfI-z<>Pl^VseK4&U|0`b!%6qp}v9 zvZi~^+pRX1fzuQdvBptwio!`<2>g@RN7<*%KRAPS*!*w|a%J>;DB0tC`|d_vVjsVt zcGAu6TpG_*>vWWSbE>L}qj7T4A!Xa*)j5~mehxQ$nqz)%pL<`C%6v7ZYiI5gZGX3` zPab!5gp}Sc0XRMOjtQ89sWAa_2U`&N+lshOy>$MO!n(dr$g}^z*+iHZ&=%&~$(Zb+ z%AIm4?2b4J`E^?07$c9V?D$t?8o}YtlX|6q1KKtDe*(Uh5(PS+G#a?pDViO!%Q+J) z$)KN@h=XE*E?>i@>+3aXHbgE|orQDH8NOiMB#fcd><sEi9X9WYnaUSJSxI6k?xHdr z@&LQ_8@X&KCC2WbHw4w>l?WLfix&$)wxp_@HV_%H7DJb)BkE1--b5#GxE%pU$I{g6 zg7diDR$K`ExFX8+v637x$32!l1*Pk#MH81K=38~pI%&KLC`m>Y`*{;y&&?>qi6TpJ zgkSh2wj7O~`t5OxhE*8Ff}Rse7lR(v;w$d)ViPG~Qnx_-WZgu^pZU-v3NmzZbkdx? znkfbF!oe=|x#2JRI1E2rI5RliG^I!&s@G~IT1U{@Ly0B~qEOQ4FZ@uqDD;*1hBGiv zqZ5co^y38n=p|$x5;oMm4+@QOOS2t|>)*IT&5?BO*V2K6Pnzg5s}Otns98b^wak}{ z;fiBO+{fVy9D=BiPKFz@<uEo*T5_!SO*R(RU{#JY6l<ls>gPL0UaFJe#)$L^*J8P+ zFekT&iPWtu5?TfCM!>=8LT(Lx2c1Df3kr!?tml-XM-0+Vk#g&HOh}Xz@H4?kz`<&F z%d)wqa530|AzrOHuV{!szMJh-+fS)+G)C5<5jY~39yoY}NG3S39We26pJwewJC>&? z4xivni0up!9%FBjcbsi^ptUV*N>HM8mgHFXxH9ka5y{n^aQk{%X}wUmFP8i{O|+hS zet{RrZ!FoOXN{}Ws4Xy4|EUk5COXiN#7_*}RTG-pqVDu*pX67ZKQ_=+os-X8G{|U_ zm%AN(U~fLR%B>@nFU$-y5g5%_RhJF+j<7@qDfExke#?32#0M@T-2=t3->Z7V;}5)D zJW>NCM6pjfTRpyR?Sa@#HP1x~=s_D94>4%5CUN)tXHg)bNN`KXLT!PgvMB^dvn?CO z#==etekO?^+QLu7$Q#^9@rhT^1G6CS+CP%hm;;bVw$S(tdzoX11>?KX?n$sO-n~AK zhsd43^_L5({rPG#HPujYpCfu|dEP`Q`SX=i5LkLCtd9`Ph|MMysdUNO%uwy>ibZWZ z^jd4UMvWq4D|xgGRxbr?R;kO?eA2*uH{&Us&D8CnS*`Q8w3R=Q9p%*K7eUh*j=6~X zjk)|=@P&!$CqcxTC&fZ?d@0*SGx>a<>{i%JT0p_he_;n}qFC$T;(dX;1RR*<kHE|A zJf=mP7f3zB5mN|vE!BUPnR9;^yuEaYeo64M?tl`FOJbW~Qo6ZUM?jvBO{k+7#Lx%H zCCM1vE7VlBhft98)Fyg5dMhk-<!V|dMO@PN4@I!zzoi=RObaR^rpvKaI_Y16+k-ph zv_e8oImaMypnF8GB*f7-h6j0vzM#u6vWclPs@Rq`<lMe*lzi7#J^p-bL{&W4>O8BL zb|+5DD{^1QmgnOS{q^Qn+&R5U|4P-H>M9)3^lW*<wgVZjyZua#iSV4KLYF90&Y97# z!9EZ2j;I~bQE}R=p)x8e{z7@zlCuBlg*|7RuUPz2{42H4@l1jIRsYn|Tb)Lomkqm& zKD{Bdjy;Dr_k@a8p0ppj{MzGX2G2ak-;#@3IRA02<Ms3^(~7unZ?icAi@Olbs5PK> zzNO9iK~q*on_qoIvNJ!k<V(lq;gZmU6Zk?t%)u}DUBkYDquYXmd9lf*e&^ZGOiQow z+Sge&w@4gppOT&MDw3xbpP0|)^xag(JY<!*sT$0h9qmNqDaWAVxC6dzTN&Po#cj{T z=D+Wa`V_D&(LMWJ_e8YqIqUPbQMk5H?2Zm<CJZ$2x_c+L;Lb~Od7AIpNW{=<`276w z0}YLNo?FJ_YyKiPk}bi0q8hQ4AFgnwcXZ{**9Ea9>gmSN$9VAIWBYxQjOketwSq%_ z0?P&Yx}lrIFR>aa6xi~xGg2U%+^TVqqOu(`ys#z|lG#^M;ES~&ZYS$2OlU5$9^#JW z1`Omg$RBBy6k&GaTyKwA-v#A`5|>3NsBN1xxubKw46L)F@S}fd^Bx6A`C%4vgm7pc zqR1rv0PNgUZ)ChRhtWlb1o$TQpNtF?QTTtrI%uVbKa5l&rBDbvx%BUjRukJ!=RBw< z)HrbILJ~JU<QQDI$gQDF#v(fxO%dI=O)x*yJ@k7}!86UVxAL)XJcX<|{i}mPQp1J< zH;0|UZtkm)%KhB#UrFCu#_;Q0@aj_)p@E?$>9nC;`K9z6dltS=3eYmf(7nnxH8->J zqo*2<<cb63-hY$JA{IK>P~=JL95)s_rcl>>{y1-4MQj<s^OKa0S1a#%4p+3xl<zR_ zn6$9-o`<q$8$9Q8^h4vgKA(R7oKk98E(J)Qs*Buh$MkfmyZ3;na1~}Vr<evj*FL@M z_mXW%&aAGXr{S0f8rru>r&(pCx*yKZ>IFVq?xEV}BllsOW|9}7#QXMIpMEG(j-jAV zK^i+9{*p{M(}61V2!DVXSKNF#NKIAE1(Olw*D~<-V&n?%O|)+7oyFeFB7Cb#;mUmY zEOtB6>*<+dmj<JS>`U4XvWHoDc*~Bd0kyZLg)^8a&(Uw!4v}JW*vCNY$vpuDU7A5c zVjx>2j^F>?u(5o9K39}AP80+RBZ#2G*MiP<jTH=GILvS-RSPLe*pcci))^qx;C*Pg z-KrppN~fhAygU0ih4H)%Gf(EsmPxWJepZe3A#<h?myY$=+lW^lQNswGifaOqcmm>A z5nhaejXuMz2CrG!z}v_QrD2#mxNYkC7(K3d2VurzJqz(_F2FiX^O|McN@H!&taT{A z=14_atD!@<_<2#w_*30d4iv{Gpq_WkTCq^y2cAxd4B7>$f#aBjv(uhIPs_G-v&!39 z_G`S~+-|A+wi@Y0-$O{0Q`~0sytx*;H_pZ*b@QkZjX8Yds+L(2VWQzw+DG)7@V!n- z2`6=q2XOb;|1!L~b2y~5=p$#ibo1KU4na1{C(+u6iEGDd@%>nu2OF3*4@FwPS3fJe zmOUo_=;Y+f&u%0qwRBf9E$3n0;81E>@mGgn^mLv3aM^RO&`_Und8qFH;)oKzqDjLj z$Uq_L{unR*&bZ^o@x0~6@&%?%ACH|)$ooES_$ANgoV=av{`Z$@#P?U9T{X(ojkx%9 z?Ck}4|211*Z{E|wE2%Ml{?wC3e16*a?uDXVsLnQYiO-fiZ{<z>FUGkikN=i=^n*>g zy)1!t+es}0LaT7JI|3J(Kg%!WzNPO%jX^n>QCN1?Ll=iBz$jJ`ek0xda?t+NJSCLN zzXMvku>D@ucIozOHpP0Giwqqt)p*wW`*N_mHeLRfbN*zt(6zpvHmS!u|MsEF$JO=U z>jR{~R`Eitn>b0Fh#P%s2H#XUtVL0r-LtajWt8UW+vHPBu=$HlZC@2`^B2cr)9PBv zx<f;*@eT)>;&1EfPxe*{bh%;|i-LZA?z)ZbtNcyzOk<j0(Pb}li(h_}1;?vx@@tZ^ zcNI$|P&umDBT>_|lkcN`DCGJ5&L}H`*3+%tU*}@)VwB}utUmctjC9MxrbmOGMFc*? zoKZ@bz+2;dEklbEKEBL9TC?q4srH%>7xPoe4L&Awg{O}-TiF=}FeM3bI-`s=e5HeL zm^HT>%%1ZdT3k+>#6;X38`kf#>$}nWrPJWCm*<Mc27i;X`R=`~SCChuC%kl1p~Q)W znroZLwd0w@vn?*T^(#X;_<-MO(@@>T`^Ih&;kgu_ReQrEZ=YV>{MJ0@al!Eog@-o2 zF8W-s>Qup20(zA_d+)&O@x8}OW2*L@%WZglE)Q*CQ}rY_pzBCk@)1AvEq^s(aEm`< zzfT8#R7?;F8VPGjS}Nqj$?!=WjpQyixO(#d509hui{5ACrN#>7A6URSDCYpO4eFKX z`G+X#*urhZE<W_lHA#W>ar>S}b+lNfKaMPjN^q?1zmfBE`p(E-OIvU7V(!-DFuaN` znl?&MwxnFuV&8#Xf#stH>)$b&dvv<^gchV8p1<!wd2Q$=HdgJ^+lyB%H+>sBUAD36 zgvprNRrmwmsYENi_Pqjx=Rt>c4_hu@J0A9s$<MRfSmHP4clNo9=DOpjgVN{y1C@C% z2q{?)O+y8}P)d6=Hz)hOtGY8q@x2t7g>8t_u1a^nY>IN6yI5tgL1bR}>}wC&FRIz$ zVQf>xiRRUFb0hAdExeJFgBaVlm+G==J*B`&SOtNH9%~5y6auag#b-G`imG~mc93h% z^S)bXuRDg{xc}_)ZGO7#mx#Mmw^MFhPsSv+cy88Bx)*FqTKmK^<VN$wtM*S3#Vu}L z+^>gapU$6YJKkI9a^Ru011YoP`neI>KEm(fFS{Mml|-+q8#lf#fAaxghA0AFzgdfe zX8=`@wD%mv1cztNmU0GM{l3@YetGEdl7NFUqp5W;?LgOU4u+mcO6ni(lKJ=50L7v# znFgW|*^<h%SMA?A3#kM=wMz&Ge;WCZ(L&_^X_xew^fR9cqostBGRQYUr4Nkvm<5Mi zB4fHvJX;^`BRm`_4&%($IQ5%>sLA2F$PW{gvdBH37Q+Spe(_}}rfcK4JLI^7U2wkY zO^~paTBCylBs!1Dx9rU@<bm)-Qp9vKLr9~M0#Lt0ObY9&4`V#;>~Nbq^NdHI9~xYA zhmF?6wnDprOMxsL(+o;&zS@rua6-t4oV0MuQUl?**Yt(z*@3%cE`d-z4EuFh0%k|h z$XXexwcpUjv&6}&QeGX{6tHkVQVjW4df;dPl)^pXh5UvT$?}o*h!tuhIPe^i;ZG`t zb_++N{p%3V>mkQZf0lr?*HI6xb@U-&y8K*c!=M7%Va7&=a8UyJZ12CxN}hJu)Y|an zSk|ecH5QEsNik-GRC8V#gf{dfg^3SG3MB5(zM!d&mei0ud<{Hnux5xR1y<CLXp^}M zA}HW`>z$l<e`;(<EK_kjTAjZsG)63ThBwv(l;}%=GGu-=O_<1Fi|T6}1!_>*deQ<F zfYU1ttb&^SBO4rWbcO&b2$2m^6nd%gCKg6DTj#BqyQjE|LMU<<Fnj@`J+u+1KY_cB zOcg{1<j-4})AK)u+72UJUC4fD(H2HjHb^AT6D2FBc2yX<9%Fx1#ch?fp17%CgSSu_ z4IJxm?AJj&j*l6V_;Y8A>jJvBUe>;T8sQ!r9T+fVfIBQSfQYjBXEL)BwoylG8H1O> zYM>*>Y&GI^DyM^DNb94_hpaaGNsfazO2HDbuF)#Agg%O2>p6t&af6Sq)X6R;tw;3; z_f;?hbg~clo%xvOEO9!;b6<?-!F=PYC2<t=)UeHbgU<tKuTz1>Ae}^wCF8q1Ff$@1 z@*+<x7r2ntPc^5%w<v&uF7Rx3&_Mh5wUae$sygfdjgd*QKJ|fD<3Y9>ksw^S;1#7V zTk>zS5|%KJsvae05`v@8(=n41RWg6Mmc^ehbUWII#8JnMz|Q1RFu)XqlMwFVqK2&B zKpQyI{fRdbc0~)~C@hSc0%|sC2+V1>1ed}wLRs;h$9_h_6C5!y0RazeGsD&}%4bGO z7Du4GOAOQjnV={I3eR&HB*t5Q(G7CF#>ax&PGyQ%o2KQI$L(a{A@sgOmI%vm_y~3p zlN;FpUQUj1H<_QGjlGT=E9<@V7r`w4``3Qa`M)0nDn+$BZB+-eSsM8k)4@cjN%P;; z5t+LhkKWRLBZsvSSfwgzq0i(|RZ7qvh9_&P>S*DEgY|<9`v8njw^7l@vJp}w$CVV2 z{3^R&yi5ELHkymt2=j%_;59{d{?21*O~?9%cpbl{uSjSI*XvSS-=bF1h|F$<{1<L6 zDC?-Mi<QXcNqyZbpG{C3NGGF13#Gs#vZKKe`n{$-el}3ST0`=YW!&zf)H*4+>+L=s zrP(5KH{E;AtJVC|=9thPw#YQLFMI8z`D^&;QU@h9DPa7Owe|YN0N7|$Qp)$y_*Y8$ zL9OEh6id`*c`JHE>Fjm1cc=0-)5XqR`Nl$bKAf37w$KF1`Hsl&J;&UQn<SeFX4aMw zxts3J=_AcwpiU2juPrJwRrhhOKl+n$U3+PCbdg8&F<x#_^)9j?lx5bYxL)K<(Iupb zoW>hSDevknin>#}*)hFEyHBT3Pp8Vs+<j4WDWs%$)pU=!e8Ik!(fMyHEG#crn{Ert zf~AiKUr6!x9p8V>$D_(Vy8rh%@|DWt`(5oe9N*w_WM{gK++SqHlxd9-it6ZsXuT6F z=1Br}Dk?W@;Uf#Vdm`2q6PV8cVR|vR^3{{5z|Rp<AWG~Qn%W?nV*%$1!in?qF1JJj z5DK}9a2j$R8;n8Sw)}}R8pR&hB&HpnZAQw11hX0Kg*a{2pb*BtC$g3T?2C;9HFU8t zS5W~r6)Xippmqruoc$efqFD5s6ezdU?5d@aw=WC+GKX2X>p&Iw2ihW$v9AyXf7A5# zf7Pvm|Je$9Jg~zSDWH^DY=^YRGV6tjf5+n3eMf4rbXql)qt1*GZ_nT=MeY>TdYZ;& zCO0kTr_^{?x5gyL^2L)ai4XcdTKH@v!yQi#wL{e%a~Ji-BH=yOXIQF9*1DsPx-7Zm zx45q&v!<^reOoUMYU`YSX{h3%P`0be+H{4vlk&sXy?%<fn)(oAmE@wsYmYcqT|4CA z;hToO)p8zl-tA4H<2h~rnW}OJ*BbB5n;B;QiZc`*T%2dExu_qf!6Y|hR=tcgy3ipm z9LI0WJzI@srKMngt8ou)t(o4L{)_VIgPY5q`RcWG_J!@!Gqy{eo>E<&i5sKR3^=za zPA{p+-yFs<D(8wFqw^zgk2NIGm0CyNIox4}7h7i}83{~}=b{q|U0!La-!D8YUtvw% z{Osz$wbQL$)6KA(SIvcjEd4V5`Zz+w9fPR8SJ*Ydq@$(7jWjc}t6w>qS@F1oBr%0+ z(PPO}@MAjutG-9C!n%UC!31^yQs80Srk3UxKFe-oP$x0Yyu(!ZRs<0&_h})oCr8<L zNP#Nl8Tx48W?E=fS>YJCHSPxAcPwp#FY#Cl34X1Pcz@P(-?7h3mK$m3y{P?V$1r{6 zPAeKNkGs_<<}s;vHMD&Mc6)P5?{<fHtQb!r>b3S|x13J2lFhtqSXG40K%YNFkF{!# zrigkMiPN!8cjL~D!PUPX(Adkgzb~?ZQp(qRD~I6st@o7Bus?kc-+eB{UmsQCYZjRk zK5=~d!<Fi~$FlqOG_CL(tGJP24%KPdokC7tOm)Z^)0tsKU-iG$I{8JUXZNH(*xcIN za_a-5;Pmu|$AdESxpkAi=-0l2QqX`tXQ`;Wh)Aee?3fPC3m;V@=0iRUrmGB>o!)<0 z;4cz%ICa;>PDbH3h1ir5YkC%NsH{f#SH<=;zOLC!rw;|ZbAVi#mT1C6TJw#n-$Xs1 z{b@LK+~Dp|)^j!GH{Wy(9ZXv#YX<@etr4N!!7Iv8zu_s$x!utvqBNc+?_m6HHcZ~y z8?iiirKj0@4}D^>b!zG^oWAN$ELFMN;fAJ6$za2tQ|PwZ2!)F)jUMhbeQQ25p0>s= zx4<z`Ye*cqYKrilQgAm9^``CE&fLEIu*R<j(XK<<o%?ouYee~J_INytsWG(Qk(YQ* zE02|ul2Iv}!cHK_{WdHGoVU76m+tPg`i`1LMP$UM&!6|1<-CqPx<?<IAM3wBaz9=5 zEFe0|M7KlcpiTw}y@1;oJ8R7?ojj8XIdhs0k+E>Fu|8|kJ5p$1bD*je{J5xD0B1VD zzgpsXkNCB(<Ib^oPjb?lVF{LZ6OO!sAKqC9e`ve&MDp*x+ti1wPx}1stD#)6J}RlT zE-d5DyBtQ#wt(l}zh4{bDGb0-;ImhS-dAnq_`$cC2`!&SUb&C^ByUv<+h2=Z*|2BI z`lm6GwzYz9&e-ciCHu|gN%!}Akam0s<`jkg`uy(r3549{Tix>w*tdcX6)L;s^aVAO zZ+_#OYA2N$r=M5m#F*}VIDg3D<#p3e?JeM0>|c-=MsRWxBu*0HU7gnvCk(R4_`EO? z35|75VcBa94adeYVg&-f0r4ZM^~G`gYW~`vaV&Uh+^I4A3cl;{U$W1#bdpUQjazb7 z=BlMW>d=-{6b}#4c)mN!cOG9bTlLEB7Zv>#G0_K(<g+xq6Fd3f?r!66WECBGjdK~7 z_FqJLKgdbWO;nY=RdBD(Ip>bIg<bw0^EL~sBW{Ws%)nWn#l3NM#2L{Z<^nHIj1)zV zKRg~-;VV&P`m}?I5*;F=OaZvvW#4P<5dXXT@neAfa(VIXyvOihB!3S@bM0hRMd~hQ zZYx&(qhW9Oev7i$_jzZYOumcpb3To=(##xtQ~6s}+`!(pYh0K4>>o9TacRGaDrSWW zWQJx@PcZRjC_Lvs13d5gb=wk7SJV->YaRUPYZrZI7$t$15~up+d#1NQFVjPyk!rHv zy`52I+n;Idxg2q9eSu*>ipD<GY%jywMEHZ&(O|yXN%^aCstK4gYg3vih67sgbq|`y zuN^mi!_Tw19#nd$aZhvUwnul5IvS;TE324S?XFQdQe=0^-@I}z$L}m*!1Q%Y0e@Uv z2l~8&>Pb;U&TSgY`gWun$V8<Nkveee8ahv)t}@GTq47%Bt{w}}zlu*ZC9U&nsm4c# z?s^{m%C|0}G-~biZdFMyRM*=VtHj9{S};45gIDg@{B9vJ*p#o_YGJpbkc-{*;msGz zC+rUdwEemxU`egM)o%RTeR7Ak%Io{2eG2)cZ6;rL9QG~<8>-u7fVM2PKB7DmypCJ6 zs-4ic2f<S?jw{YQe)^8fWE{@$@PSdZjlGwUqNAfiC;M9TxGs+5I}{RM*Y_631o}|p z=gQ*4yyGiHi_;P~v-@59=wG~3mwz~7#s9~B!dhuBAJ+~28&oN9forW{kJ(OK%!UF9 z=s<DBxrK;|w~|NDrW<$xKA<p`TDvzCM-zg<(F^3x?a&sv5}eqppBb&ukYH~m$;a`! zori~d-kYL_Y!(%qJS6Y7&KZTGvQi_(FsC^K+eN|7<tKw;vH*ps_l&fn<v&g=ThmqS zPj=6?ClwN7^*EoiO~v4%fv~SD#5hcmrP#{jsyhWtN7+ui4$oR}7@!d#oqq=tyI383 zo9f{{QXf837dgp^IJ)8^HA(Z91WQf8Ppw;1wHVkd9tsSQ#OPmPC=J<5mVx48QQg<C zFAfF`r-B|>ag=PGMlEGm(OK+Be7xmF4m+0Y5c1?D5=A5zN*Hym%{SPnmNa6*AFC_c zB!EKFQlR=ec5X0Yt4ehmqD92Mm0B2zfA?pK?C{Ize{+f-A*w?vsLrePh3nOOWLM$V zIlC7$*6ni0flo?-mH7Gj&uO!V7a^BBo=tDJN@3&OO6pjQKzE!+a*v4E;O`lGR0<&L z5o=kK(=&6A*1i?91XPinjUw#CvTHn6d<;e}HrziR|03{G_>LOF6qHXdIOV(JV93$Y z1fj(G%Hv!8H=`GJ6%Ud97tN?c_!n~vSk$Wi3<=KFpniVHylw*Z-T3YHxD+SHrxRi) zM@98Rl&LbcX6Kgvz*y*C_&V%^vegj_SiG(N`GQkAJh1p$oon%k@PZ^4H<~o$by3nv z@L2!zpu|{Y-w)*&;yq8w+UY7BgdKSFs~Wh{Vs9k)A#m2ey(F@4(WIaooavDnoso5& zXP4lOCP%gq_NUZ|ocnk%nejbv6HM>!rodr~K>wM+PS|0dk|(EwD2EoaKXWM1CNOEa zqK`bkdK_8`gv~_N&;?~Eoqb>ZsAarL1k{prJ1y=gtEO4;OENEspTwlJMq<~q1`|d} z=5Yq&{ucg7De%ic6<O(;hx%>F2ltlH0R88Z!N7`!N5?lFD&OsV#8j-pIm(1;mRMG_ zpT-Q9v39vT9QY6_(azL`P*CiJ&+VgcE_!%98+?AQx7e`&t$o{#b%$sY{o<RKPIuw9 zkk)f(JN=%Le*JngAD`EC4vwXMg=OG&7uakg6nfFXR;6Bq-GC)uDc@tB(b7UA98$3u zMZ~34fdmgZo`3w7{hJCbqO4k!uR{)qDe)v!mE$={#hmoltZQNVRNl@gJ~wPoxiEh| zUXO>FW^^~8sslxv+{6r$()hwbD83YDZME^J&Ox2(Xf+=-s_A!o-Zk;25s3nmC|QwX zApX9O5m>&cryH)n;?-<SRTc^oY&{UxHByeMhKn|ti=j-D@;F~srB$L%MJ+1x#TFKw zvXdjQ3J7TM8q~+Sp*{-}i1WQxOb&DED!j{96bx1cKB<`>Fz98x?%gsjE{BaiS51WG zQKG1*H`Otjc$FTzTaRa(C}qYE`k=Oo@0nn1Q;#}BbYgG>HE&e&4fP6>eU!ON#Wdz! zn#r_Hy+qTdB)#FSwHM2e($VhB<lxj0dQmmwFR>f9y<zra_hma}RvsayW{S&oPu{(I z^VIM8O2-!MbG)b8l~hhO)Ns;n!R<8V5NYY-tNG`eEPPfuJ;0S`f!1{wiX4nC>hO|3 z7PyZGo2M<9<z96}?Le39eVr*DfulRk!F5k8(+hegowJdr{cAcAXOUUQYN{3*2WGr~ znLI1cqu3%F@c~AP%QcKMCF!SqwMlpgYjZ`MKApjh(dZwQ19S~^!Uyiewm60m@<U0c z@JK%^AQ}yY^zwMq&e+&=w3P&fUQkBGi_!tM6NV1$SzzNN_m~dt)&vFBrNE7W_~DWn znJE-o5=tua5X>FVV+awbZyxar^G9X>qM3XDq?g~U@7})}^|PZ*6qlYBl9VtP@oC!j zJWnt}pWNDrdzsy6oV{0ITTS9}{iv~;b!6rV%`Z-)&aG+7ui+|DY1W5-6M6OLp6#z3 zHXEDxwNvMgM1!C7OT#=yw;}rF^m*Pw&O(ab^To}x*v!{on#Qh~44)^uys2WjrxuK% zl-i_#8LmneiZ4>K4tL}^bNoiF(bmj_pSpfJloj2+5wphHz2ob7t99F+1iP6&8{OMq z@Q8_k<&+u(W?g>m!xwm7zZ9zLVQ=meXJOFsuHrt6yZ=I7`E8`aLlw(&=!oLWTV~O! zmSNti=IusPMRJUf`=?%lKf5a0fG`O*K51(If}dy|4^a)J$Y+V!&hs!>Jp(-)?{S}A zRasr?PP@|bPm1K}-_?i}S44Em$egKS6JuRWr`}c9qz|elKi!@qjHr71z?YKh(Dkya z78~pLOZ4VB{Vg9q&ds!}irzBVH#PCwgVh)H&0{joX|Fn)x98y5;@yNNnR^3X?%A8U zE#i*4OQr9g<HsyBJ=d}w*QbY&&SGAb5y`(SzO1YwImft6K1?ELx@n*m@P`R0&|X`% z*Z%!`+SP)GLwtroc?weEhip)#jj+Y=$pO*bNU~F%uu+NV=j-oM-`9!yL=|mGn-mvH z)FL#Q1z{erIRyXCevuYNg+f%D1ZknXE!vu^8$!tvM>9pg8WF)YP%j&mRW~nrKK7}k zB9$?%Fp{PmIE5t%8CTLiOg_4M>U)78d@eTf4DlNj;EbppLAnG&Ww<(I>Xo$q!MX)W z1J2-GWKKK?m%N>hvQG0jSdb5u5Rn(J7SGN4Tv9ZFipbc=;o}SVkh4^fz>$oz8MySH zHGH9FHepB6=)6tzN(c^EfwMW7`l|e!)&vRI6C1vdY}0uLn#hT;n2g6tjzI$SXW6p& zll6sU2&&<;nC-{JEoeLb30Z`Ej6lX8<Gkligqt%MA2t=5`NYGVM41Oruj5T?8eY!i zN+3g7O`WzEZO9lq6vf~nS?D(RL!aGfxaFc%U4?jFn%+#DA8W4zLy=~-WBp>;<&35w zpVoc$@@0>@g8hukKW-nE{Dc^i0$W(trlU#A`Dbpn^|y>$pQEgK`e`KP5?bD8ZP0SV z=(2rlE&L&6UaEqUqxe=*EK1g0(7#rfs+k?kvpiLh)NFU2$JMsXDU1p8zh<Rhk+&1q z^uo16nEEAtKeq`IsyL2~c@uq}G9?9`f>-P7h2Vl?$K=AF&ELr+Bn}0|plw^&TNf*1 zVXiSCkKR=*Si``g!nrXzWrKY~Rgr}muxF6_>oZGc$(~_J3Kx|{Ygrz}qusJU6J|7d zH(BUJgE<q%20vkHqo;q-7t!uM(_*c_(3ep$_(P3v`>mrR3q9g%TF=ne^Npt5tsMH| zE*A1L#Dn52@<Cg5N?h(bP9n=y`+5G@esj?g#dYS9CM{=Ly&okyKPbA>9*lskxY&<= z*k;{+H%{Z=VP*R-qqc?4R%m%goy|`!my^+Bq6ZgChFxC6&!^-?JBu3As|e{a2XD;o z>m0Vy?lO4arFa{mTvKsW$^Pw{-+`4w#-y?-JFs=${@0K-Qs8s7>do>P6D>z`HIvH) z9}8xlzbNnZ(D!h$fH~|!Jab44GNJumVzcQ<#6&{*e4h)6F@L?I1kpoQL+B%#P@76@ z_lY(SU<y8uNZPPF<Md(|@5L!Y4Q3H+#cEniPp;&#w{MyKRpQz)%$CExyD($*U*kwV z?+9h#dPY!Js}jwVW5%S=WZy?;9YJ}UpV$?j*ffrAZg5R%J|p=uR?^$|<aa29Lg{qD z!cSN30evSo@9S9o>{OcWfb~h;13IhcYZun^p&i4SZ_ZA)S-4o*6=LS9UUOng{r$d3 zxN))+8`*LAEo)_#YICHK2j8_rvXM!B*kBs1YquI|8y#=dz`OUBUAg)8+Ld<%OzF#O z_q|jtJYF9GJDik)27Q~YkF~1pL7uwcMo%<uASG3#m|S_SYwMd%VW|Xo9x_$BbA7LQ zgQ?4PUzg+7gAe;)W|7WLc4av+*K<$8-OrW2!Z;UZSPuV_+6q+qS~e#^i3xAun5qAd zyLXR=vTxf*^>mj?aaT6kPIoFHRLGvY+z25GnPDbLLX5q!ok|kf6rpTyF(%neHe+Nr z*@u`IOt!<=491ul3}ehp>w4a`KI`{9@4MD#y}$L>Z>>N5aeY5C<2t|Rah~UK9A{&6 z9>x<>&@?eb5u8ORbN~uJJSbX!^llG|v)2YyW;&J3MYrc5lj;oUqU?6~^+i7h>W^^s zwR;kSs;doBNtdS%bn|3;^q^m|4+c7m1wM3bm7Q-0*J*#qF&hZ)7YxOfe5o|>S)<=y zam-YyqnV8lmmPT%<$HKj)xhX>5;k+9Y51GqQ1h`^lFWm1z3MNEo*FJ9PH*)XDimk@ zd;{AdcD%zTe*N*W@Jgnxr4a_PG6vROT&x`DAJ256cC@v?B`}3Cg@hSz2BPIy;c*|( z!_Ngb=MUNaxL1g|HhtKLo6?%<l?X7}(&<uTfI_l(aTw~f=XSTRbuh2+uY5L%H9WbM ziCs@y^A#NKWhN14ch<a_24<;;GMriP=NFBYI3E@uucFFZkd(hJbE@Y@Ec%9L9z{Zn zQ5-i<_kq$lpQlNk$z+!1)+WnNc3y0_quW-o^S;WR{taW5o&YH^`_TO8t02W$@TjhT zGSirQ=ku3(o&9MPDJ%VpPJxNJb?9>->J(Ml5bF7=QrS(V>aE77TP3?EQ*y(it783w zB3-&o;ExU204U+^ZiC+SOk);6UNpF!U^*fcso4LYQYYaeXPOn>Miw$Y&NJl<vHr2L z#`}Xg**<|z(oQ>9X-3~zVHQ?D%CUmFx=gy#8U-cWk&;h6)jCB!`s$~|=k%rN=j_>u zHXBpK#1XW3L&Le7CSwh8uQr<{Ewjx7Dwc0$seE!|amH_@MAp@;)gG4FP4#>kFH`9F z)jd!*TLJ8#u5vp)*>Umw+uM^c3jptL!l4ig&TssWvBtbGerxQ7Rg;sgSA4l?+h<^8 zTnFPt*hKvIRuPWx+}?Zq&{m<?N(p4b<|8)GsoJ+yDW_e{t26s5Yijkxp+7#?)BzVW zqu2uAZABlPtq>CpNWFdCCG)YmEdL>;kE3r-Xehse5}TP1K5DZ%hI;OZhPs5=AN`A| z=O|NydXfC;4(26>y$ct$J}#mE#(#T=wsU^inY~g;$j6#IyKLqU)va$#`TA+&REWy> zsXwX*Z>5fZ)#fWDGX*&x=r%6hV~dU6J5J%Ylin>Ek&2_3c2=@_k(Vz$W*Y}6W1d=A zlcOxSen4>}E|>-+gV8XGTKKj)hepXa?G9QtKGDR21LTEMoE!m!e6p+L(aCWLB4I8? zP!^%pnDEjsgs;D?aU5}(VK`uVeJG^x<f9F;O%a&mVL61PlD7Zm|BmqLm{Nz$;}XWz z<Pwg(_o}PW_&vz5Ttv?J7VAsqMVrUvuL2tMFQF6qRVdYWBRpMJKdj8v%Ejtj=rI+s zyIh$&uPOHGd%(#yYsg3F#L7|yDSZuBvv&m`cz))3(Bg=K-Q~!@IMQOzfZ$4$_B5IJ zOQ<o-aPnVq*MA%15O#P{;q9!RxnDx#O_ZazI>foi#OUzZrvCW&0|Vdnx8MIwi+p_2 zRYf>`rrYk=D#lMd*+FT<e<5C+pa<W9Zz}}GKbDf_(7qBY!HDR|1ddM9=aF+xFy{`^ zw_3UR3*BR=YXjX9)vqaXt*4UehBNQp3;0|<Afsi!V|Y9%goS9-2`f9|=&+n8H(y!< z{`97~g5lp>p3QV<pZ}hyw|0mCeXnG4S$AiD+&7bsUqY4~pS+<sJe#=oODJ^5XRjsg z=c56w9C{U=DfJgAi%Whz?vf}(r4ez`%aMfv1{>J%e}VPY!y5mS-4+Fa#AZS@YRqI5 zER_B8q!oS_m5e<5<kv7K8)>(h%D3FVwH9>nI%zNEd*dXJj-u0IwAo=_1S!E`txeNp z9tM}mC{K4fi6r7piI|(IkqW$YeXk`w5_*u|oQ+%^d$m+QJ+?l5k;rLo-kaG;Y>wQb zF6*<u@r6BJUy)4p93xZxG~kdGOgXk|V1mmCM{cyvIJZ_=-Yquj{(ARK4<4``n?Egv zHk`u=HH?<`)v;R`p41QPO)izA6@O75Oib`$p1*|PesJe8+x~1eMsOIlryTnoh6U!< z0>!)07D!oBmc|_8rPhl7A3(jHI6M4UBU+XMkrZ?^zZmp0-uA}$X{RW4N;X!!rsJLo z4~e|dUO6Vv5)30tm4@NV#of*OUNQ&K2b`DyF9s=Zo3|;DuFPH1RnVAQ^ASw6k8}<9 z+$*zhyI+$`Jk#a*c6INj+2g-7vC{gwx*LM1E?3i>#Zx(;+aa-)FH4Bqb@`U&SUs?J zAJZvhTG^bH5fmyx7f&PFae|R+u@TcO*C=Fru<sV*@4{#{wJ^65nFC_o#gyvs_)I)N zj!HIN!Sm9FY1sNP+8PhdWfy2*<9C0=<g7T6<LH>q3qbtq#`es={v{*<^zY>$F~V*_ zg;htWatm^R3P<7<_dbIjtuc)pIGG4kp+)QU&}<rNDveDu6g<`t9E!ExC7V^{?2d27 zN+H{>;k}NX+_vEtr9Fv0%grnJ2TLQa*<>Dcu(tw=e6)HQJgB~9<PWsgZb^=PCWMQ< z+%j^aE2bW}<lXopt48V}8MdCV#^&DfLRumB6?e;d^K<ReIN`4}*TpG6J$3EYrW&!4 zS3100)OGefK~y+`Pl20F@;woHgP{-0mk>w$N+Rxm`GX5O>XoS(EsU+2t-e!!2jzGz z$kZ<OL~=xac5R;G*hX^hco5H5Zd@pCMPS@4$32;Ryzrf$fD><at}=t&LJF-H_!3NM z;_J;bT(0j<B$PXCY+pmDJ8@&zLf6nEZ(rU6f&2}2d)eqBSS<!l9P*2a-Wnb-vkkK) zkqG_%xV?2Q*>qiuqhzv%2kw)J&H3z?hHCQ(q*+e*Eb=!fC%ZEn{M#>~`;CQ;t*x~~ zyvrZdKaTC#-?fR-9z<1qymW))R3JB^_QZ{F2AL14^I8e-gqhhL3c5*sqF@Q>G`>XP zDVV;oCtNU$l{%Jr?{h;1>1FME&o`L(f~y6RS)hGy`$ktR#F7Y1MB-+U`AN>YGUdp7 zbIH8V&1n+gI`;$i!DiQ0b4qq&X8gq6i=9HHv@5-1Ckr`>fOak73J=UP4D~U|PDs5x zh}?eciSO*$a~HhB2w(`0D*VP@6xm5ZPrq3x+RvZu^|e)(V3K<ji)Sj}O?+3zTWRja zf<r@l3eUs}S%AD<q{+VpzvM>1BYSimfj8;}_x>^;{{jNoN}Pn*;<t<=QL#A;RJ@>x znzIKOpR9E7eHf+N;dpCBR)*k+CDUR%f}drqj1Zm^ZcB`I4y8o!RD<V1FHa)UI<p#i z;FyBy*pOdBhrGjB;EC~k6Ng7z`N6kG{%*Ogy0RmX|ML8z6!gI_p*7grPp&1P`q|2! zt<qzObX(<Jw)>-~Q&(MjHd4-{gT0~OP+<#+%hE~Glyh@6S3OnzQ{ge;T>r*IgZK5k z%MBMdQeu7T++{$1?eCY|b4-sr%dG?{x91<Q%`Kfw_Ef3K#;al?k0+=`cB9sI?FM7Q z-1+&M`^U~iZtVtLK~O)QR`?<;4ZQrQpWL)ntZZvFmbgL2FHAFrhxd-&A=hLu6fl+e zex6Pv$IpWcMBg)=mDl3{y}&3|WX3FoJA-4z-Tv~m`{Ap3rPQs^-uZB@afa~sFs9Iv zz$}20ho1<1RhGi_;e4_3Yw#S=6+U2rSznwZ9C>(RwbG|ywX8fmdT@;=0!UOJLvw9K z*3nWeW2CT+s3x<*kFqiRD33{b&I*4<^V@GZf<xP}P1}>0O`qW{1}g0g4F_);wNf(~ zprKkA17e(u=e|_~A23)jq;qug4j?Wpc}lR$+MGvs$XW=WUAQuMt(WmcNDo6NjCUo( z!%DNCseEvK-4mFPjCfQa+u?t?)2zH@q|B_+z<}m4+$V>u`<yp%&K`%naL3p2+;Y~$ zD#{o1&F=YP7Q+^|cQ79r*$Pe`|2Z`+TJX8MPm}zcs3;QnX+D3Fv+vmTSIE0OUgh#E zJ;}A9IZR5F8&a-YM=s^l8L`y(9`_=vBe$Q!<x%H`Nz+xiT-t}`aCL3niad)bKkeMS zIse(Lse&7`HZmvEih9>of3~qi?NeQUUJN@a@!Ncrtc1mJiO{h-rDHfd0;)2&Mt98+ zn{uNUw$^Ly=?5;@3qk7KM}(^CJsCgqrssM~&;GpNJTIZ(w!uIs*3j`tu4QySV|cH% zamACW_(8j@-wX3;V})dA(zyJ?Jh3Tm-5@d`K=fd6|AYBbvrzMZNDQoR0^%lMW3)3; zNol^c(pGTgSxnU!y*x@%>QS5Aj>1&n$UGp>IJEF!&ReTV!v^lB0r2IhKf>$#88|j| zcxP<oF3=-H$0nem@8!0PcF%?ozVH6uW!WUgiXf0&b~-jc_0Ml$y=(|FzpkYPUfNnk zlG5>|wE)<#Z!ZGM{c_G-hi|ZDq`&ozTEys8ERFTZkBnwa_J#{8AGP}WP5aY_2TWe| z6IvLEDnTJto|`Vb@^j&6eDV8G-0r0H<QUg?l^*#25)1tIKjnSpSkJF*iiTb|!=tP> z$?V1I<cFmWHes|DMt!b2z)@RiKIu(nZ`DHZ>e(?6<0gI_^0A-wwiai&vHnYNXdqLE zqSY9d$cnQ_5_z>W^x=j1D>F{vhjDNP$;*Wq*zi8I$w*(emuEJ+mjeFk-I&#c=GfGc zH$mHP_##ZaCE+Nlv-#YUBC%7=#_ji6Jmr_K;*aFnWTNP`>PNdtA2XFJ!fUzRmJkVD z)BSnv*?Uf68a+!@_^*Lkf3oUg@h{NP4;79LUbf3Ue%*NU+2ZI3nsvK{!MNU^b0uxt zqSQy<A6M$l9ZUK6bCqjc?cx2&8(ftg4o8-*=J*%EC8kr0(69+>qe^-Ty`tK60tz9h zwRE1a&=O_o0}73A0@eMAUn$k6F8a$JkL$ii8*8U9-+hv}#HmnM64P_&bZ3dHY&aG{ z<L~xm`e?f!c}tbP9$n*LG0*G&unF|_;qn+%I&s(#e^M}x#NpaOKN)68JzylqwpE>$ z6M_>Q=a~JydUd;TlwKX7M#qvRef$n=L4}zQvfo%fZWI)Ig+`QNOVPsdAsQ#4E8xt0 zG#fc&w+y3@hY5-E+03wmE=mU$fA-zcMR&TAMIe0Gx7iVuv5tEbl$DDh`txRrm9+Xn ztez4?#E>A7d5@*VO5dufD3{KqNP-SqHbEwwGDl^8cWVA*qwxyTeYh{!e^oNMBvw|? zQ&^`2w3H`;1xGyh40zW$0~9!Yz-eL=$fq*Q?OZu7@>#PmY8A9!pky6f%u(&waC1AR zFOpU}p^mPAx%nuZCv~M3gz~){Ao50P$e#dlw{S?c-Q)viZD&4KhDkerdw?}%H&@qC zn4)=Os58(){Qh#F`9AYfkJJ=>tE?l>KRF`g$`8n0g*@HPq?#Tn2L=X7zl7X7T@9Xn z+c=`07gMi};2x<`_aSDl2Rg@VM>(LRe6Oq1UHTl-sV1N3t%8<ndMYnOz>r?}hYfOo zRLdsUPa|`kve7XYW1~VRanq|P$-*V}@C*yb=IPH*?G@PBe_dFI68vWh+_Yg?6VtAG z&G@REX}{rVqcih7fY#IIYfG5$n8QT#jt%wB9`)!U|6V<^HJ{d$X8sKr9aw=rj|U;_ z=hKj!mwA8!bkh|YIk^}+0fwOwf%R~->p#dJxa8gGon6ptAit>qWthG~;my<lO>(-$ zO&)nYJ)H<(d_19PcXFC<X*C%UinBIO=e5Ams<^FRLb{BR*Cw_-ryr=v^;hBtC!jMp zBFx!0;s1-*&wu}t>`|UV3*+FX1P2R~n;yTt*17*SpE5ceV@MyH`H$=OWF`?zYhh1r zPS(JiZfudC6=Ln^N_)ya#^>;yeH6ebZ~3a=vi{kEi$l#8vjbvX`u?o~IepyrrG_s} z&&bf~)B){Ed&3sRyTmM5y=HHtSqh1RS+U+yXJ)Us7%OxkG7<=$?*a;>wAvq>TFW)) zUc_GEMhx7Pca6?cP%ni+QQotcQV0@HJ8jILCFQvz`YD`*7e#rt`EXx{Oe_1h9{paD zxlN7XqgvaREqg&RWpf0MI*wjm47Jcm5gZW=DrgfG1DD1*R-i<fSg7?&^D9!0W6_>0 znZCn$|1fO(V142XWvc8Deu*p|+a)GSy^i6QQ3@3n8?s842}VU7<J$^ih)s8<p2@M% zyxYWVT3`lbq!r!iG@I8h6;eKwvz+H8RXS0MThGLlx1^z>PyP}TKIrWn`8+V%mY>=j zKIeBi?=S{nZaXqbow-}r&2NI?FPqhvpQH=rUXt%Tk?dgz^<t>dv;0@Fs<X=jOmq@Y zx!}Hs)Y>w2${;6T`moi^YL=qfcikG4)^v7L{Kw(3;U@b{ulDip@>vQeYH>{t4D0a~ zNnYiUf$B1$gM1Q^&HxPUfZDN8f^F^X#|9;me{c3;{bPMNrWB&g^Ps3%bb`jIk896* z-_scDKIM^hx9G);?uXzL=NViHreX(JK^);cM@<-s$w)iE^g71;{%IJxuF`7rb}ryl zGQ|I_95o4Zz5YDPvi)S4epT?Rypq`3*PiA3o^=cbS_PmKqP!V(d6Pr5?~|iVYYb%M z@<jQdzT9kFoM138&m;Aqt(e|9yq|+**e)4oSC~aWzT_HIP2;vmtVuh_as&V+lZCAt zt_UH+V)WlIo*d$;N3k(^6p$AioVSg;h})VD#d7_kDsv5+iP=AGS9`k{80*;lf~pBR zXx(>PmpM~Dr!fxNhB8~5{31Lm5y<UGj&||tL|D=BXFE4X9vdql!X`GY8sf8b;<x%= zE_}XhRelln@c1{8a!q81&amc{{#r(fRI1*L9Yid#FBmS>d;{RhI7wPnfux^wv0?*Z zhf|B~@4WRo>UrcX%PJt_`6%>}<+Uyl0rB395-2LuMfyY;!$F5#t9IOEaM?MwCO7Ci zY<k+`@OktOf^hnTFAMKQ!}~S<61rNcVavVS{;vpk4f(roq;q`TvEWWFed6w;0{LNW zwJ4X?Y-6{q%#v~Ik3LdCepB5BzSa>-(GMslnYIDbyH0kggPS*N&-Gv0?0V?ZY9gGu z`19^L!pj~H+Hm{ag=_WcnP7GqF=e!cR{sKXzWCI1eYzVYQq4abqQN=b!`l|f+nmk0 z>CoF@ReD{M_<i@YeqcI+`leU<A9x1x`I+U#ci_kkVzE_D6glg165NKQ-s-<opRgrq zmD6z>JozT_F}A*?X?uohNAY!TuFg5PnDlv;Dj%3CH2)^=L0;%UR0LMqxya#iYxR1) z&vX{4wLE0UfK``ob=w}_0`Fa6!EhL7$+xI&sTU@*SS0fnGG6lPgt%nkZ?R{Vxt=Kn znWfj}VJ~ov!7Gh1&o4v3ljDUi1Q$5Sf9ziUYym&@rM@A>L(Zb1T!}-Vc&+7d4Oqs0 zsRK16iiXJj>Yv}CCQ=tOUb(-skb2cMRt9Z({8vMhGUf4K`Bs~mE_;SH%6&obiL;d& z--6Yp^Hc_YB&Yjx`y57_W;Xm*C*U&$l{&sZxw37A%s^_l(fOYpEYocxCNc@`lA)jQ zq*a+V^BXo%{|5P|;16barzQHK?gh~={^H3e#t-1LIJw(;o<z(*d%<O|_fQ2Dr;b1| z;d{Z{;p}mkTYvDNZ2Z}5AZTk>aWRUrIvS#-Hp%F16X9~0aW?Yd_GD&B5DW+6Nf6tS zIE}S0fNPsU8&KQEp5t9)S-gxr%`tIgb=6~|<|^TB6X<8r+Wg|G{PXgW?E<1p!-#P5 zTC;o^1Z*>BZD5{Y-B4h2UHQYav3Yi35qfQEUTj}<OdBV&E84Ez71FV*am?!{6qI%F zMc@+xGtWAgZ>RR+O2k7YVTcAg&eiB8MedvrbFiG0;_4|A!VFa&tc*56XFNb8-k)=* zaIQ^F^o{j;P*>|z8y=3Gsdn;Oa(+>#d+{;lnoQXdgOKjX2Xd)sU0SNGqc4A?@3S~_ z>-1ZPI_JL{)%3}+JCG)9Fq<bSDPGn+<m|M&f>}i6M$vHUY<h|Ld52=zm^66wz0{wI zc?<PskrE%<?@ZJSpwLF|*qoVxNz+o)g$8VYYo$@_-o&<>vl_!o%43beQQUc=?G`RL zqRphjhUm#zFtKI{mUS2Oe5UA$Npn2&A!^pz8>FjVNdd_`3V0$)AzpkUVUF2w-mY8v zVr;o}i;{fsYKix}Zf#P7>L0zQiEmezbRX{>>ynt0kC|~TOwhEd$sPU?uoIDyy=3Ta zo3A1_W;s})cz_zNzB-l+o5-N|han$D{d<l3ODOY~(7#;*yw!ib1?J&2PH4}U9m9g+ zr@d1x1=B5tjXroaY-2-k1kz2raT3)SY1YHsFA$+q`eRJyve%|(KXlLw&Tw)mc=7hj zFRsprGMi;=hNJ}&**#ZHpEaBf2$DulAb(bNuva;?^J3y%Cglsf!*3o)xYao}WV}@H zNU(DbU*kBR7|TIz`^UhA(QNMMiLjJY9Wh3`(=g<M-!gX%X{>(}-;hRvV{S&hA?`1u zy&)Qu3*IwtN5AnV&qcBuC#y(wT9j5S;aaQXM&r!36?b_Zv$=^)P1V_T&SMqEMy%eD z=IN*YIVIU*cFr@#M0N{rizi|S2mQ3@7(cBIdVTgkyQ=@Chz!Qq<?lrRMbv1e)PP@8 z<#eM9niUbT)54G-6M6G^hd=oSa!+5^1*_Np5;E|PiX_{_xK*k9lSolO<&n9)(ZUY0 zYKL>fmm@=0-VjXx10MG1ZvlBIoxukWMUPE3PEVq8kW$%&Q8TPxL=Nn`2`O%i#$FDx zH7*S2<Cg&D=`I|1n=jQU$RJ^M>8;cIfz@bw+k;VZPYf0|m;WrXG+E{QEw=m;nxh9a z^87fH{g`R$!_F&mpdv#M^?yGp<o`J5*8h3R(WsTfDb+o~d2iNlEF(<PboB;(Q=4<+ z>iLE^s5Jx3C`B8YukDP|R&cSoeq$4p(_B-*;kG?Xoweybf1dhiXv($6(IPBkR;wst z)pDUeY3!J0k8{>l?!of#&@czGUCoc?K;Jnx566+5yE7!yn$cnxC)xM$$XsOItF~Um zz?Sd4tEiaBMduR%I!Z5_HBOn=(X8b=bfaB2UFDD54OMAq+$}tMzjm$ZK%D(spCv@{ z(J418ttq4)rSAmhdCtt8oJ!&P&$cUS5dYkd6@Y2qV`L!Io=t7wrrOQ)e5MhC4yp>Q zjM56{ff5McKQ^HVsKfvt<5u^@7=5ls8i7<Kw-=mal-6Gb7@o9mZ|#0=6chqZJcTbo zOjk@?5GQRG)WJxV@vN&^1s&x1@iQ<3zo-0xW7>5Vd6rC(p$+`C7sT#J=Vx1chc;HE zw%L0rxzo9PBtJD)?Uztls~#&n9<k=AuNR(_ry&>SY+F*g>PTrlfN1U!dC_6MnyLMA zF1aTu5K*>KHX`V2>#8r75c@p)9XVPn^X}nrs!G8t$R1cH-O{g8?+)B|qjK9M$3Ud| z?2WDj6|q}Uk<_BS=7oiDISk)uZgsQ$iX9}<Eqb?r>$}lPrHgwFNFbGFR@7!DAhx)b z2QRS(ZQ`Qi-9vyJYqlQwoT|`3i)$M&Ki?RCm4T`1N6&1J8BI<lvBlk0VXYW$*j^pE z4*$`Pb4IEyi|Mu2L=k(%O{p=fj7G4=iaw4{9X{2o^t2T;5H$x9gSbL)+(Zx76~yMP z_%?XmPoMhR7dH9~kbMk#2<v`y)Yj{-2;}oF+bX*`DUrFLi8^pvO@c&V$fahpg8LU7 zU1x?Rt~j^fRjIDo*8Pr?u-RMnF-Z*cH=w!XmY@*s_lo?JO6Yo%QF~SCWD8l};O*c( z<K`WZeed4SZTX1xKf92b&>jK{pe?}`X@18ycK(C1{e9Z&&Tz9q@#@TJQmCwvqUnz< z8r{QX6nnV1?lVy<|H>F-+TvF0m&`0xUjx;<=f5;Gy#8c*)J}2knh))(=iMoi{ImWm zQ)<!v9`7hjj@&^J5nIP<-S7Ta>Mn6y&nqOKraHAmvj4D3xuB$ysdTDz@`hwpzteOD zHhf|Rw?g$tGxq`XyNA_#c7h?;DPxn>_VrV(XAq=YBh5x0k!SXxX|v_~BvWSnL}w>U z0*nR|XX%=M5!KPD+IwyTbtK#0vQHQwC+vm{+U1m<#fosE=ISNv-*P+>m<`dS<E9h( zy6b0ptRf0eEZu1-&%81GJ(%b3nNn=)kX~foqW`<=TX*T$-u4C)_ZKM1`lMFwpzVe) zY{{?Ev$zH~{*@(Hr1fQY!94Ofe+FGdW3)-15?&PKeqShlUgrNMo!pO~Lt*z&?1mnn z6EuJPxlIx@XRRW~<TH$O_CUEQU=+8^&lhJth@)f<UQVuLbmJ4H{(Rb0<kCGHWan_> z6o#|J|B!K)Q0kSEnb9ctF?U4Au1cz7@b`8svn5}$X?dOagSTHVJ<BT@xy1^lAJWk1 zUpKMhVbHLffxFx-#X|pJSeJ3nA_>_s7Zn*jzBG-r0}Qur@^Ak&%<jKR#8&Fqjjky~ z8I)brwpR7s)A>SVsIg^5vapSoe{23+y;_eOyM1cH8Zzk{_0jF&GaYD!q@ry0eZ^P( ztalX$RkT>*9*J%DedYp>qmnvC+wXg;jL7RJ6)1^7>t&ixE><Q~I;A+Ogeo0AJn7|C zH8`!!Q)q>jCS-2WR#Ht&pwENpgTC26d5sKCv<BQRR|EsFj9{cP@TP6uh@bjJZ4rns zO|=0k(xlptsH*h;JM&2Yv97ww*&Jo@8p9yP;%BD*x6I)2Wl3%KFWhI|&EXhAWh#8# zS$DzgOaJ8d2Q8tUQX*Zk%6Fcpzg4oe&x3xlEcu`uR7b1@m*(f-?r<U8DFA(vcqhxZ z^*FuWTCsm{<YyV8J~ihEZz%8=+lQI+FkIu8o5)84CeO{YJu0Waa?+=x?a;J(_mPOK z)c8z%MY9?=n6KKb*fmtyQE-Lj56>o+C4>fv>h+AwSESd=ik%e{S&MaUd=GT7m8rNL z?;Rk}ywKHPxo3Fi{96L#aN)xSJtYfyu+{1o&4yGuj1*IY`rld4SXjt@Sdh+>=YK}d zrjsS{UX?m`IVsHBP9v>aJk{Z0YdXw4tM7t9nPXt>{C=^eg;@79+m2P0frgY^@c|PO z=vplfV#dB@ymNlV-lT~Z{9eM=4Ssp^;rW9eZ<$ibyJ7p=8NX{DCblh(j~;ci<V19i zKhM0-am-XYt^8v6;U(P(V!50sB>#T!#a3KR{HZ`SSEB5*eigyf^uWrCH;Z2Mbh*<k zH@Zt8Au86`MRlJmeoe|>fSwt^Te)Dp@uKH;(yDg4(y_b~`+fu2TEI-x|6IO;*G7K6 z8+}K$%}Py+WWjYI*Km+@I$=oJIpwdM7^B!o|5jS$RaEIYf+C(oRQj>74<OI|c4WoD zj*Evxz>%CN*D)FkHxE|_d_Quf{x#+Q*F^o_OZOfB%N){|eYxUW+ly<zy*6S^MefLL zE~8RB9WLiA6N&Ji&`BnC=ww~irxjjd6uS{e_Eq&E`~W>6GjD55NCAVdJS=8>r)|6O zDkjP^d>i>3e<IpiV;jY2M~e8off{20!bK3J527JapAbDX6K&uYx$39UQ8*Fool}}$ zg|Pec2k!!TQ8*P;Q`=6KF@A%vlVV8^#LCX{mQH?ezA>Ae9@p+nsXE&+idqYNcd;-3 zM$g#}YMm>7EV9AscsJ$K4@C1Z*Q>s{9-7f6)QE(C5WAKz$IY7qI4YGRoes&!$WLFQ z`cfDNj$mf|EgP&>l$8|ho@uMufmsT;3J$tUW~Q1_D1k`g+BkO_pJ#~{2ba?(mQX4^ zvSgn|)LOb5)b@Vrg)=8^4oyN#kD)%9djDo`CV0ox*vCwJ!Mpr60KR`g+Usb*phf%( zG1cCUymN-<#g19(+1hHYTsI!B^r<O>9ETR?Kej!C0<%BaVy)7%r|w<hop*cjLiVtg zR+;Gs+s(+CV5EfQ;6Ptc5Zpgu3eU9O#BcNX`ENt_;9Vv?f{PYihIxT$J*DQ>M~?`E z_?6a$%g#N=!5ZxHj-8!ACm0FJ&*xPlc-bI4$E-MJ#>2vV8++6iU|uxFN@i~x{2PD* zT#zsx8#MeJv!%uOF)xV5MUvR73jdD8E^Hek(|!s006QiikDdW243BxwYXdADE`#XW z%zpCh!(_y%UqbJH2~osIhOE(;hymoV*xI!;rTAE#2u@tb`iyUamNTx<Yn9=##SjHA z4jPd6lLYN`NL8}n6fe@bJ?(EQbI{`Yq5Z9Pr$bIV?<JMw2nw@l)Kz*gTjDGUu7roH zw?sy)c5RBWXZia4NWgvv{m;b^0=(MxsuXNE5}5cK;U@o%D5M&X6FgoEM;F8#5?5B@ z!z!C`c%D&}6f6ZV8xgwKy!JC9fy<1|k8KgP>>;k_{jYmQ_s?mId5)KnXn@JMaJ5{V z<wpO;CVepmT9}LND#qIu#9)T`c#)Pq23#c6QAuxEb22?r;Yr9Tu6wSIZ7v<y$Ke)Q zyNs!69m+n{O4g<As6(fDnH6u#^NlA@@A}xeCW{3{$Tw~YSI>TY+={Vm+GyVkWvtZC zz$i19*Jh`8PlOA+R>s|6i$g0V{^p6lpAzXY^w^I+%PN?*>z{m@IdkMP7=lg5@uaYI zI6qjkx2%S3uQoBJY76Y^PpVl=rLg|E{ym`hO-3>+k4+E?m!=9Uu7Aob{%tZ0$6k!u z;z2B{Z9gQz{dP8J_4r8ZO18<LfRO;G`e6AUln1T>Kw+v@B5@nRfmDIXh%CzblnCf$ zfeJC_n5hjX-2LoOopWPEuy4#fI$lX~Vt-HZ`-_-nOEe6O%mmdHub`eVK^<%GglMUp zp~7U>m`uv0_YW>LykHqhbu^4RA5NJ+3jQ#9Q(fQwZXW1JcTnl-(vN~i#Yyc84bAGR zo2}}E`GgP5kn;uS>-<W$%39<t9_D0^mljU!q(^6EZ%Z$NpiyZb7x-&YqRl&}@8cKk ze(nlP0AW>&-v<+=Mj%oEi&JMJrc{^5k33Gm=@tK1z_Duy=wg!jC2O%lf*xZHW@=%X zsZ=LyLcxF#*D6L79!E9Bh`7}q=h=~RhAp$^LZ(%}l4Mff@XNi$38jea&KYs1M-v-| zPwwHiLpk!vEaZx6+iv`0dGM6RT&m{bo~dg|*hfE74U{{(F^4?`GvfJDiQO!DLxs!t z%B@7C-!8iJV{iN@yRlW1cd;6=sx>^Uc{^itG7}AIbt2lRbHT7)jX1h-SLvkrpR)G4 zynTZfzbROds(xG{15uYgw0#O}9|=~DTv=_Az*KTe)5up=V+mphYAnyD(=nTFYr{22 zwbb@MYmO@Lfvq6aFW>ePjWpjRZNo0s32@f+Wz)!lY$IVWbU!r;IuQ!^jLa;l4Q6=h zoxkxm-O_MBsh~J+Wm0(4U#3AtLOa05=qj1f#0z&C>oHuuozIY$6+qCXIniL$gtblG zC3Qo^QY+hgX@Xt81rpE<Jj57R**q`Un%_ZoR8H?eqK#}_7PrnJ!}Q5xG<Yq@n#>rr zvIZT!>(YRjb5vZKRsN?<O<}#t=UrQcS4+v_Zh&7Q6*t|IUDbhlin5tLTfo&=U7uK` zG?Sb9M=k2l2?gTN{=$K6O8Z-XL@AWEASP7$vDi(1DDQFjIlrsW@K~@at*X$#*iZbC ztI;UEtLl9z*v&`36cq}0FI}mZ+?er^iRUl$`gwVJdOc2`a+`s=TFbX!D=s$^zpuzC zD_&V=ZRSnxd+W)W>bczQ9v~eHi|_OZ<gEFh$&wO&);8yDTdyRQ)a8_~ulx9_OtKPC z*<cl|GIec3Jx?j=Zr-o{9c3H*_N}7$!c=~`eaa+!+VWfrS;ft{X@Czn*tDtR-Cw1R z>&!hw1GAc!SHt>Q1j+)~zlg&5M^~WIQ=ZPlTARN)|CrgbRKYHsa3g%;G)A3I9o}@y znY?+d%!LE98db+H6mKW-)xBesn(aFlreu?<c;}d_RVMq|*^sj9hK_mnJ#DiByR|<L zKR<U={ha&CJ>8%e>L)wrYH}O{H|`#FihAeS0P8@!(s3!(-cu3`T<g=yr_<&6tCcQV z`RUKXePo*S`Y!WtY_#UbT<)RLex$~H89?UG{Er%Aa|cEQV(!*P8pfz+Bq(;<C;=Mv z`m#m!CJ(viyc;?B7hoz3$bkuzJ;4$Fp5=J#4^TY{Acq*LeY{#c3m+#~WzS{S{jfXR z7(?w8#zz68k(|sDyWiCOw6m&m;7>J3JJqhPoRjpios(d<KLO>^El^GISDszGVE-^> zih6(zJ<AHdg6fv=a7cDf>R?vNU1<;S7p<Ff_)uvDv|HBCwc}KRP!@@;mEgCk_MaBH zQitX|ZAB|G^Szbn&1YJ=mhu-hEM3^fr-{ZlZbbs5H@SrvqkVePg8_J2tJL%}w~8$y z+z~w`2s62jDluqL$2K<ZLRfD4TK*-^FYvf~tiq~*AY1*}{Tn-Fs({@RzN2>Bw?11x z!wI&)CVtor*^*yE=IwbIrT!_u5wUgp_P=0Tb-Zls)eYKC#Q5ib%e27K7k(^+KBA5< zVbcUraNM7pCWA4x1wE%lcMZ9}U--W~qW0GaM{|JJ+WeGc65{b%f8UP{WE{T%_y@fa zB!z}YwKzjGdVOi|*AaziXk<93gR|XB-Cwy6g>AvM=7$h%eO=r_CavM(n<g4JH-ruO zKlFP3UXIW+5TkK-g`LBjMnh|OS*`WE(j>)zdr=QIf}cbljsC*3)l9nuktw(4;h_vd zNX6b%UzGM{OC#z7cB`gw#lLLtlQD=TY~x*tdZVNIQ9ZS!yjbl0T{-60*=L7TBGUs# zcX!0^6~F8liA&1<a+YXWT9Bf(o)bQ{I><#ufi&`NQPFA!{4uh(H<4Iw(hQL2yy)lg zSmYX#8BQ5sb76>Y%ObPn#J>q}HA=Jv)81`==MIiJdC}WlDRHSTt~=}M(U;p?okXox zc{k5&fu3<@!Lj}}F@@$oXRS`TxYww-wA^Go$A>zJd$xbsx$2qW&Sa}v1$FjZK!YO= zDxN@H80}fqCB&l-#hy$4oB1=RE-cv-po_)R<QY*)ebYO3QH6efzziw1*<*#+$TT{P zp{98(;_RB%0UIw~N_w^in-AxQ{bb=MKywERS+rTNE@WIz_RnFHmjwq|!Y|e^8kBTj zKP9*3>P((CrrCb|4Y{NB%&VKE(<05U^7YRsA{)r12u;dCgLaUlp%F_{9gz)r)=+z% z5GZ~r^AD?5_sqG#0GB~~nT$G*qw`7y1}c?d8AT}{^NI!tqIr_%?;1iuCuL{iAKmdb z&@<N{C-Cv2k6<6(@I+SH0W+tpO^eaWDlNXVWm6+j+d!ml!@nX__V5C>rS3~gU-Rur z*RG2v%_A(2kG^bk`Xz)@mm6S4bUS7*z4t$#rMdszJtk*ORQ>s=)u{>v^>}^GV>6jV ztiI#NJMrLPu+<3%=f)tx^RM?Mz`y66EkTJBVLs|QHlelPa_|nvK~4Ql6{p{gxdYq_ zp6AOb$Wt_~PJFZ;>RN^|s*01~P(Q2{V=N)8roG5t#5UjC*J$bd^tEdLeAR_Mj>QYz zxFpT*u9x&QL?4V7MCEz-;HT%Vd`BOEUHX1mTejv_hx;XVxlNO|w4cXCqQsF?k)vKp zr`k{EX3o5M9+A6ubuooZepIdwXY9<0b=b(xQrj^Jpu;@FB|oXTo@a)dvz5jxl^?JL z0+8sV?Hs%9{HaSBph>Ky8q9v=>`}1qWO-sqmPO_QK!IRMC2QK9X!s?RVt9S9xIZTl zBTmh;PbreA#n_2J48B)O$F;ey-q{h9Jxd9F-hS<4cY#d2%&qtf*MB!D43t2>#DJRx z`lCt?V4Rm8v~MTOxn`}7_*bMld6QUWMA%%_mCGkft!eWjLnb$fNF#=vT@Q?-My1Qe z9u{;r;yPMH9Ih7V^Gn!)%wp@*i4{KvohQmfdPm!j{&nmmA7fS6Vc#`tV{_t$f)tCN z-1q%cJ02hdKV&>3bZL}?Sr*JQVRz>UA{W%PdaO{wx5aLopdH;COb@P_TmQU2muKZ_ z79X?}e}g%5J~ufc!^k!F2n(@#89RSix!<}R6Ay37ZXwNuxhe9pII1>~WBR{|;C$2( z-9pO|(z}S2<h%!>SinA1PgKJFa~-AF*Ie}hy>vR#7gsf4y^~jygf>6EVYBkd`&?Bo zJ4zMum!LZ#X<@R|_1;!Wn$c%jCKbJ3{@OsO*NOTQpRCvLy~wXl$b>HWT4A4)&I}qK zEWj)7Spx~?uD4AIkY|nY4@I18ULf~DeVPK3Q-Zsor^iN{V%Q`5smatoA`I~JUMn3h z1;bny#9U&_E}~;KWtrU{RDn~+ZjEV(^kvpzbHE!wsk2nIn|c|rYTebyA#Qmsi;|Jh zpR{h{d;`q>A31_M+s2TPy;d3n;82Y#15<Jm8_%A+pU-B$c)#z<2&Q6d&u`MEi~arT z>vhFHZr1iCrtg=N63E4WJ&!GZf=Mh}`#hq0Uj@v2t881bR%e%W#9=Kf-yy6q@bGMw z$VZQc`U2IL=iOL#`%9{Cq_o!snOogRs8#gXU-ny8;+&UN5ZWnkWl${Z4pr)Kx7CD| z`k+R+P0U~$9|-{*@#@b_3L=4Nl_17qe@3Ix3w)YwZY&s1ZJ`|ex33Y~)9+sxJ`JF; zUD<PrTmeqd^jH>2ux;2eA$*(-3fFMQ%o9t=S-HCmM8XCcK+)0sge}6ef<Nj2S<DIV z!=*d})=YDbbC;ONN>+hW?wpw1YHSD>nH2I<?MZ?ib0@hZi9))Kdql6)!bqy&#@Ceq zD}_da9TB-)yX_ovWz*l_tKIS@#mV<JsLN0zvpGEB%eILGA%(z!2$eZ>2P|E!^p3g- zg?HRR*`3UGOtE6Kri|F{#!zMfbXTa!*7{M(kqqQ`L)jPG<E=6!sEU;y3hMmyR2h0e z-hX9NBh++;_qgth%kP&AC4}Ri7(6BC1yBC1G=`sS40b$I0!T|~IKRj5xp`+%@^C)} z#?wE)s^#k9P#-yWHzs0#RqS%l>5%<J3&3~(XY=w~YZW8>6U}p1Eyiy{OmmAyu$|{1 z6~+x`L;u#Q$JOJARXN@RzN%HZ-hPw_d^YK|K6O1gNcc~E1v@5)#NH77U+8)1w}Rz) z%-=nB_C$X2$z{F&`VAPDMD_Pg8W}7EKFwGGfWfZae*y*|pqOY=%MIs=@81rA;#UeK zgrO!2&!cZEZtYM%uF3Mo_!U<Re-KjU$w>|S8EGdM*C*(BCpI*e(S~@&NVf;Cy!$~C z%-%=Zal-46HUB|rBPGY^heL&nw0{XH0o?Nc@rr76n_y^2T74Uiw?#_}=5bSnm4dcq z1V;LPyWaSMotH>;B-2%~b~}&bPB!^RNSZ%#?q2luZp{MWInKVUUqZziKXXA|bMO>P zRaocIIImwqcQ)ATWWO-5uAq3XV<#BNx)-v0A4}UDjRd7CpO=Vv>m{7p=@G}K^-`0U z@RM<DZC}-yX;^+Xr{3Ak7_8g$pWxRM0DQgvpMYK`|Ns7c!6Ug0BF4zz=?|o_t?0o= z$J8nT2U%KaPB6HSRyqMe3^n3!9DhGJYTtbWlvZjf=VAElN`!VMcnBpqIUWmQ&Sbf5 zUn#RUecwA-z8h<eG<eil_`&2eh<6g*V^R;r_yH44z?#q(0oo264i!#fbRO^a(<Uc6 zhe@ePFcO*%kq%w=9^33vOU2J0d;yU+UQrsZD;Wtb_p{W312_E&aqn6~@G>=<!V!C_ z;>ok0w{?FGO!sf!%|k!^{IgL7@tB<CsC<oZsnV+CvYv&gIo8nW{PVJh(r=kAevf~v zwR=i|s-mAJe}3omX<mjM|J(3lCbY^a`Uk4XwI;Lp8;T#y5eB3mamJDyoer{Cs{$w3 znwcGEsER(H`8OiUynatRweVr`#-&>>OATKd8?t<-O>Z^j`10*;eQ6pAl`Su)HRUEE z7k>%8;-C{bK*_XOr8$3-afxDkfg%@rvqNt%*h)Z_PVEAyB!l4F#n)3*LO%aAJg*@B z86hWs)L7&|LWldKTSa2u%ALwzmg|qARWg07bAmIPQR;MFx}}Sm3*d&R&&N~Iu2F^5 zkpMk|R^Ok#oUIkyVyPf%Mz6q|^@_67QTPOT%n-(kq7ag_0B#*;|5xsvM%+v7fj{ei z&d+3Rhe=9S3pb5w=R*a)ZmNI~kmIjy1kjIahwCOGxs%^cXRkIWJ>e8~LREToRpWx9 zZ6iAKuBE&XzStj7Z5yfr*ckXal_|;Gb(K8vTxI?;XO*oy7oe*z!9wKJU9ivVOZL>e z(50iSl@6X37~>axLG5U|+nyt!t7r0yu*ehzWnAlz=Hn;}jTZtj&cUS{+X&UKx7@VG zy0;A?9@gh}6`ae<hj&c?9f0P>WTv-dHfD}5d>vQ!OQ-@~1RL^F<mzyIpUzDg25{Du zzAsu_o%jDEUT@P&nr?OZdD$Ele5uk-sjm$A`2okp;qT&vcvnB4<KKgi#sGe~p91PF z*$5S^2V-zJBSy<lbz{YI+NZuYTu;^P_rH?#57;kTNDm_93eA>F7QD3ibSs6yBdXS_ zu?231t@B$A=T4!BpXw_iOlV^rWYfg9d28Jyfkn?46bAoj`Oi^<erK??MYu*Xe4?Lr z?Fai?F)+HnHafk|c6*FJhpB8ewS<*w<|!COQUBhS+bsC6Vb}g(ztU%RH}bVmA?71h zE7uYU1CpFZBP9~bXZTl<L#w9uCVkgspoLY4Lf2tK)j2oN9Tq5&ckLs@TSoHf2Nzc# za6P7MrtkB_UGFi;Hv_?;!CF;ia+f;4-=+S2F4ilNgFZ7Sm!VBDRvf6|y*kqy;J7I_ zsXGuD5}+3b$)59WY)FP`O1}hJDv{zvQp%&Bh9TY|f%mK5ejY(PU~dr7zb!fhr`tcj zkM)}wvJ9=y*Vsmu{Sx9R!FVUd%=md~Tli$8EWHlki~f+xYNy^D&YT_L88BbSe*FA6 zB;rkJ-I$^O{WnEpJQuj)&y|J#VveolMadmt_5gSsq@lCvM+t)0Kfm{MXdGebC5R!E zo_AWk(2*Q{d@!8i>1uRmE@hz1F5_fYK#9*a$38?*g*T--(Nv3~d%N3OIDG+`%mRr! z4WJCKN;;sPIE>PyDUY|_j-_g0D!j4btUFEKrrRR$-4&7ob(bwCYRlLl{7X=oDEx=a z26KuVvfeCq-FpwD))+$$-2wb~9=}baamieIH3xvs2Y?j&EPDl61L~k*o{<l0zltJH zBvAZcoz=IjN!KH^gO2#P)2ob6(=Jraz+U>_le#Jp8m>B$FzPHg5p!KOA7m~A#RGl8 zElI9|2QOy+Cg>C^*3GH#d9>>L+hy-Q{m9hreqVpQyHZ`|Yk#JmXB~CTCs5%^uKy`z zq^J8Q`|c$X>1?h`*ulGfLpCO!QW40A@~9T>Dw}B5GS7?W2%DuJ%8JU$a#?zq6M+g# z_kQ^1Rqxs1Z{HbbQ(X$oci-<wDqZvyd~ATIybuvF&({w`9|?G_-2Qv=AGXJnlHE^P zOh5la{O$cO4wh%@7EK=XGGn{*La<p`Gh@43F)bR^^zE-IpQ!ShBs7#-Z*<ABSMie| z-ps`hTg(AkYX|xMX=SD9mcE|&Da`b4G`7BCX!G)xeC;>64c)IRlRq|sGbe%QFmG|2 zVK|QUZ-BXz3mWgap;UAr&m`?}L4f`b83<$&vO==aTEb?MZ0hP+hU9+QH~HWlbG`k4 z%Zn*-{&Pb_`2XSgU!yz$nX^aTpr*Fwz7X?x!WN8g;yX5Jz9IF~Q9a(s5Br+99=lZB z>97U<l?zlPbMTkY-hEtE>l0Z(dKoQnWs!&hZEFDvso|X17(f54NeqI1`h`a~;G}e# z^~~;Z@Y8M~y^nccvg%=JsI4@Z1|+5|i%jZg;o!!@6rSlLb+rWt%{JpN-*$vI)J9l& z(KC{sW_QqM$Ex&K@CDnGy{feJ>7d=8eLexPz691*tX~Pv4-BhCGT~^t6riE=>Na_W ztbxDORuoNPncRdYAw|{v{gWUXX@-CJ9!p5xYPs^=Jeq#HOW}}AEG}5n`oy(To@S`A zN8c;hoCW<M6S8M|dX^!*(JXaUC!Ph5<9xuXNR_KA4Ehoz-rQ$7?vl=*yg(>W-Dh?D zIqLSwu7L2QxFudxBGW(fhO<?#&f%t*><Zbi)ZroT^8Bhg2LaZwn!by4<!;Sm6s6DO z+q)7b&9nAm`neN({lN=*S)?_9tYn-6?1-?oUil=Z!JEf`81s7b_{H`@=hf_KWD|3R zLznuViM6A~3Ltb6#4kLUlMcjJIZpxp6ozx|x>Hvl1rv>iLc~%E<TdndH*u+Fn_;JV z6)#*n3{TXzOP-k->Un=KU+vZLGgcY>zl0oNwH{rCoJ5e>pl~~db)+hAZlu~+X6enH zMJuh3%#lmOa}BqXOLpfKM0*0*`VBApZk4}6y|NlkUNL10#J<P0x>$*ZXUTB9y}f+G zwqqk5-k!|NA%~6F777mUWBSEv3#MAd#@MoV{dt;9oenOktHr_KBh@#8-6U3v2ygq{ z?4p5#k!?>`>>tEt=X)9YXR8rT%;RTz7Ig+<M@%GD0;GnD4d!?U&sQF$cJe0GXI)i` z9P$7o^71`ba^j~u&l$?I)q3ZhlfDH4o2)MM8x`@45rbKBUhksh_J2Tm-}jOM8$~!S z-ma<+NK+gZaGl3N6FON&K<QKn%?n-dI7{NSTr{50!cDHj#z-@e!i-=w%($B%1_1D1 zv$BbI6kxkOP!n=@a1XLS-WW5g0Wht@=ZLHcjrXcPg@b$^ZnCO=Vx7tYv}*^F_<;5C zToKZLAowfy>fi9_1AAKDadS>@#5D)b=bNN1<ZHu{B1^)E7m*J})p&nB<{kJHVd_cX zsnV3^BRrJPA%_WTO-vg^%<MyvSG96SiaL#z=d&g6dpV`(-uGtGb?pwf-?ebk%&u?0 z(?6#8@^kdC16oi+dOm;nJc_F%e9veUY7I_zu&H#t8b6I{ts(7VN~_a4wlBZD_t!1q zLzfQD#1Rc&>xUYqewl{RY-NlG5346?7)en-!9)upi`hB$i%IokR@0S$Dr3?HTW#u! z^DVc$FPB~t6QsLaUC>fH62fr(60ZYJrZjd{0=nOn79+LtQJ>;06@}rvV!(}!r^yBw z#Up#_b{tg`ddF;99Pp=LKkr~8Cx!{{0EzHq=kUVg2#gi;Vc|STj@Db`E!h}4x?UDM zzsLeTcek-xm&X2vBO1zkg+B1NY4Qnwb;6dsSQW9SWhg}{JkdbzOx4R453KU;p0dkl zNh+yyQ6;X}g8CJF-;uf<+GjroZ1e}e=iA0x-L-V?qQ1*P6y7VpcwRPt$V9y>;8kT( zrQ^s)KGtPqtWPz^X538OPrbOJ5%va_W%4_R4D3vaVdbb!B42^9QauD2@5s0G;HbH2 zJ4*H|V!NH{x?V!Nq&~JVp8mVAXR54`!l7dG4a#3>NAN?2(p$z%i#VtPMvUY5^*vPe zn61|G{7OK#z2T@CcxtyL`kd=<`OfXPs}!`J6}`_P=xrmDCu>g1gQF+H88d`lnjg+j zvD1Si_IJOcP57hi;BVoU+Jh?(Ge5^ZOt;z4l-oM@lA!cjYR6FLMTF5I^SnzTf7m=K zK4PEj;puzfqgJbB*jP`w=!rISQn4_3+78+uj_HlPFidRyy<@J46PhOCwrVUhRxzWu z#)gae=rkImeYI{XNLONy=|dpz&ZU|ilkK^pum8f~l5~V7@({;Ex81RADMH=t-JI|B zTV?S*v!6K?MmH?M_W4J)Rvq3xs0)1S3MS|5B$c)69yY_8OV#dOjq)#`t>f}4c9FM# z2|WPb0~{T`r-UdrACA>VG<6l$QNLPZieGh3n52eEvc$RwM^{MdW=k!z@RyAM3wE+` zsTf^u7E&P2n!%Jmip<AmZ=cUb&h}!Z4NW}-kNM~E4}rx%ff-9Kg!o-sw>g5`ts;kd zXiXBxVa{+2dn)+$*N5YxCvw~GDLV&-K)up|^+e6uR{c^*9ZSsOqv8UKt8;pD#VQR> zWVK1O+HKf$6xuJdVteQD8-7W&35)O?&}qxIo1BOR(XwLCF)dP?jY<%h_WzBu_l|0E z{klbQTi7-b5vjsfR62-&bh2$AAVj*-A|leH_m(IKDs_t#sSyz(LWtBzON3Aagh&lN zgwR4uLJ1)x@xH%v&pl^*$N28J=lhF)NJhr<KJQv{%{A9txtzowSreGJ$_KYUQL?K# zLe8~J*O>YQh-M8kMrT<4u&WcBqZ2D~A0T_vc;M(rj$4|f%D;M77a|sK=D1$XCn~qg z?mv}udDd=?d-P=}Q+pU;HExTL{aov=qap28>ots!HHYwVM(2QK=L(HA=8P~fkQaW` zHZ8Q25cXieT7+LbFj4$DU;~EmcNW$fv&td91b2DlcRN^f!>9|G>5zItm>wALDAp+D z{**d^QDln^ldB&y<7QKWZVb5(pS|f_!hExCPi?c`-_!j_B;n6Yda!mH?k@n_$_1|U z<PBi&(p=NFr2dSy1)L+=e^iF&h5#lYS1T4<^e$#7xCVZ{|8A&%GgC$u<(B_=Bw)|> ze9(<;)w)NYONYq=aUH!!Ul+YbTt?iexLimuao&!M4hVdK{DG{@uEjnh@;Nt;22>Pf z-KV8X`!7>)WfBEFfgfG}nwNO20h?4dO-WGUy(wVgRU$v^IfBseHW&J<<mm13eWW^h zAV`Ukz3qIY5ovhZe8mEyuUxPbQ_;Lr*I<r-k*V<BLLHW`h<@rpLJfdO`0+^O;A9B( zT*-_$wiHwt70Bxg9=ebk26UML>a$)Ua&`FtmcEN$z@LlJJR#Y2V0j7la%psw;?uaB zI(RT_yK4*Y`}cY`>#+s!b)<q{Jd6%Mrx+ehuE8F=fs868#f{DCOHgTS*2J_D+L=D_ zw=ee{H)8$!xdzbPL~SBl4a*%vuA<%_`Nh*k1ZC@mY)@T@lHe^a;7Y+A97^g}XLRqJ zBo0a8^&1YNWhifqbbs+A0Kacis3l~Z=Qj+t9rP~*#yf+hnc%S8V<-2u(^yf=3Pa$7 z9SKZCzkwAc`7Pn+IpX5(x~)0vW}#XdRBqN_H+1eP-;8P2B+LFgQyG-azF_G~+*B?4 z&%PFr{$PE<)2Z48?$6&L%EAK|#y|;%7|5;1Y)-M=b9|sZ)GZ2%d#DzZ`yOB)`gQ1B zu3Dik*HLZ<S{6gt$MV5b2cmzwiJ&YnQ`xV39~`aN$;-Z<B0WZ@^UevJOM~X<*VHZn zYU-QVsz6CRj$d>H+1J$|h<^MP$_krAbDDvv_aYLGGvik|^i5$W^gcQUO>Nw1DQ130 zW<qwYIpO_AH^1p?14j)oDAqGcAGp|TaLZ)>(u(o4%zXTReSH5d_^JuJ3)5rF^8t38 zw<V}tQGii?YP&=DdGNQJ_aDc}|8?;`9-&gwmI|kyPrlv${vY2z9PpUd6K5J(Jbvt$ zt-YWwh#8Kz>RY5Xk+io{*XZEeLau!_%~54<P5z@B2+cVYgk`$JI8_b=$lnJqYp-tW z$7p|BO?C~OWoQwNblD(-dbFtzp*i%QC(bJt_MOf~JO|#qT~>SZGhOT80+sz&oZ|@H zE7>v6_#%*!Wl%&vv+Qdc-iEn>J`a>pgduOgFoYRD0nC(<VV_=Ym#S@MsdPzA@Zqd! z#BV}bC&4($Q*SnEQ3BDA60cTIPN`Sb3bTZ9P5E*$kEW43kkb<jdb&ylDL*7H#Ib>= z1|7I76>rhUmZ3RF#rHMe3qU@@f6YCX3X-L<0xb~^{N{o-{tYPM0lUO+BPov9izxRz ztByy@BR$f42*Ciqs-V_~@-nZO@}p)Z>em`mS8Os1(+UB)W?^CC9;o7+@b!Ua&0-2v zlD6@-bXn)fOT;)uO!;;3eS1o-;hPfA(SZq1mTyk!xKc|&e0)l+g~NmKiB_SOS^=XI zs$Hk$?bwTp;XitHe+2CH2c&f_j$^!&+ZO?bDCbd?$QthI57o?)SDmf_V^eom<^sZ- zZ6bz|uiFU#>GZijMBY5;t^2~}rv**zzJ9B~41}DviKXv)cN6;Z46=7-%Xbm}8?HQt zTQ4?^!7OlmVip?odc7HTFt{0vcBy20L{gi+N+z`Vjc1e6UKyycJ?RPXS^S~!&?_>S z=4mBHc^Oy&iD1HT6V^veIk5KJ+JCzFvOjqK1C9ypzWDs~#PQc3_QCwk8h{?-%-3?o z+5W@bst>5Ap43Iiy7&*&$)Ayym1nL&FWVM9>-|!dUZ^1cI$zczO+F~7Kuh?~o{wbn zqy3hlCOYU{8J|()q)|;6=#}3jjIqE3%rFiMFth#2yz6(le=>Pzr!Aw>;z7I}gN+Ub z<4CJ61HGsRVt7YpT-p6Tb=j3I3Y2ficO#hpq^Q}_E1=v523LpNf8v(GZEz##xl~Od z@JV=hN}-FV^5wZQ68Bj2&&o}SSdHR!{|9_x&FAGB<nK3=g-i-TsutFPYeyVdU_O6> z%w=goNv~Y}ka_UqxAiSEC@1?`3zCjO&dC=7z;ir&%)lb`+4jaA-u(vA{pLmNK=awN zg<|=xBA-f1U&l;GdDpi%<$}y{11Yj4htlnRu;~LHEz&DHhRc4N{6M@9NdCX`1WcE$ z#8C*YPXY>5<$wN*H}B*xp0vQAy`WTX&Mbgr{a5}SiVvw=ImcY@S9_kntH(EXF(Chs zV+b4M8YYT8^(Z^4X|iU*xMvdRzQ7j{IaRZ;!+<RrF@>#9!;@eMAs|sEwIi$-u?&?O zAR8<DKA9K<2L<R2-t<IxhMpY&$9!HDE9fiCEcP5F*k>Wayj^`Xen1MtQ|2IlhC8)I z5F`R-V9!VxQ4;%NRZgMjJ97(!iSWG=!+0^1N@?-bPTK;-%aH7c%Y-gKFg<+bzJyY= zO{BH^qU)C8wIlI&4KGx9T9rt8nt;uMt8EuE@^)Q?M76IKpP>SCVZV52U?LM>n_@w( z>qn$S!Yj=*yCA@}XT%;r7$y($<{8sc>gKf?X=ogCgB%;>edxq!BmC6{V3hzr{m3xu zoQg@Nx+!cgfaMvZ^>v71Trf&v=PXJn%+A=PFmhy$^?XL8&WVkAW#g9Eu8JD=839_0 zg!*su!{v{z{z#>z$TuVy2&n<e(nNQ*@vDBXua_wgixq~7W88b|Or{!59JFw=i0Y+u zMmk4*vkSez30fUWZBBli%jLZvQ|sx6p28wg&1eI^|6b-2g3Xo@X}0hq+>VLcK&uE9 zhZX~+0#euMFtg;=;yHa&96%(ib1cV9-R9DyDgyT`nX!wb;dT7S!cQ9tXV-5&U?#N- zj4=aO?|=niAsl{gyxz_2XMO(pK&`Gi&i`Ue!l~RfJxlxwS;A1PJS7_OvP5>v=zvMZ zrJEY~55Qx*15iG!%q{u*-3u{e5<+($54%E5KQ6e3QKolCC!9hoxLWI7$p#mgSP1hC zuv<n9o!lHkK50*OqN@OGXNVHFs$vD5vS=0-5p;g~pFePZCtUujMW-G&z4N{{;m>St zcC!|ZdSP}dNshE3*>mNAve8=?+1bD!D3ziU27<gVio|bZiUp)Wy)xy&xg}oJ1(AaV z_HXk6Wm9)`yy2DIv$?^`O`LwlUMF|Ao|5J1BPRc8FM!Dkrr@6zj!7)QeA<3m7oW*C z_3=?3?e=sVH<%dPk5nJNkiPDNm1OCsQ+zHxF8*osjTbA@^?pgZLF@YtgC}+-1ENf% z#prMt`~4l&oTI-(F1vqazPJA!{PbS}0NAfl_U2ajHe;K*awU+5Ow{VM<5U2~yg=U8 z7veZIN-aY`+0e!?t`pT8WQS;z^fLz>>G&myVPlLX$&Z6ez#4V}TYlGR-DjuiI)0^T zXLW$mxH&ixINh!{qp#nh%Sx7brnTFznh6+S!#Ic!*mCsWOPf@J`7fT{mUZ`)ZRRb{ ztEwC$Qu6clvB0SL4M%`)0Ki6l`E*zvdUX9@!TuiLlrdTETU(!x4p6098w>F2t8VBl z9s1|`EFZtKc59_QeK8H5JH&#FE_VhrLl!umP;?mEPZB~RcK8W!`+o79!<>nZp{4&| z;oI;M9vFrFlP$wppvhdblAlTK&LRzsFZQZDXXI&XEJVVNS@F_Pox`WS2YkduqExh6 zubwrHoT9~h?Zw&SiJK>&*5&=l0Ga7dmLCl2*|N7rgyRJ>o&<l%DLlQq&^}8sb+#gf zCmj~sR=8dsB<F`x7%5X`q&E`!oPk=;5OtV|!eLJ}OOe1*;WsVQ9?-H=^)!l@Se#h< zpY+!9@UZp?r_!1aUiU8cyj9eka9gh%HkCJANsmw0c-RZs6eyrE+;I*4ez@`e)AuFF z7y4B9u6f6Pnq7IgrHB%;JDl3qe=q;T(#wu}<tDy-7J+e|<HhuGnWI|W_7*-G<6VY% zlSZ7U!5G^pfmLo`6es3yy~Hg8)I64-Yq~vDver-vsM;}p_0%FZ0|*1HkVEsM21nVK zIUj<P<St^F7Gwp~A!fa|w@5eS2-_&(AYvu5{zJtj({uctI!E3VQ~oi2cbl48c^B$f z)7Z<c;&uaB8*(B%uS-(cwaTL8IT<5W1fQoNUwMI6`Hz~T&}|R>D=kauqFFa{UFlzY zzASvAv2|~o7G6pF!rBn%;y8#p@XL72$(40EKsS?GvQ2wVzlGj|oE=yL%|0U@`bdMX z;mB#J6D1X2R^XD&5tlGY+PRtutKX!KJ6O<0-{|>2Uz{}OUc)k9pTxf-Qm&0QKBk=g zmZs7V9RUFeoB$U88iiv^UJ$CLo(T6+5jDGEQ6PDlEcJPDJXvC@L4ME?6i+g?oQE_Z zt%P`GWMqvb6}l>HUBu*Ow7f!LJDbQ787Q{NI%>0t_#urdoVi0S<XL^*CG(tl!rw@P z3*kVzp~rvm_=fJuY&I?IB>@?7l&H3(GO<dY$=p|h_JKq(1}oh@nrwx%!(L*AuU#V1 zCp{~ey%yo>Du0ASmnXh_O`U8vxHb|ED#GjemQE-z8kAoPRs%Vjkf238%eI{L<MVeO z1s47O;yL=flYrY-@r&*Lv_-CAcczys8xQve-c@!<i`SM}zm#B2{xP3XkFyL<-2T)R z`4%WB&|z=)45?h8Icp%rdktCPxMCnf7vcazASwc0cC3x23NJN{&Z5uWIxWL!R$)m@ zkP2RZVQ0OaplPM5qBz(sEtOLbEH2MJFfSqzceyvP8GY2~K=#5{#mff)e+#P=Jp;kR zu|+4Y2_L_aAK_}Aa_kJrBtzQm&l{?v-#L@#+YD3weDFZ_V?}-aw6wR9y6;Sw;|xli z?14X~GY@;U!@F{wtPL4FQ<2U^Q%ccJGkL3_X{DCcrVvmIu=3L(*lV3H%vMUZ^_=#h z<gK5X)aR}G969YE1r65jrn4z3%INPv%xVh;c4>iFUh5!x)xNA(-aqmm-kbT!>0sB? z9GBk5VjZ37qsA~?=;-uFZCw^>t)nQIh<8Ka7v-lN{t$X_K&0zt+*n{w&_JZ@+VyV} zWZT5(@+>Z@w0rzPFvJu3H{x(L1PaeAObVXK-K?Iw^HM})=da|4lJDo;D<k<G>+c{l z_C4T!5HqLDx&`XUhdpF{!TRdJ^!7$A#k*Fonyl5eCAvFxCH!Do^mbc*H}N(n246im zz5P=h{9%<7Oz_t5W$8+Ey?R>IP?PiE6p0^kS0bb<P+xmKtKY8o$EO>0$MU<qa%%{P z-qJkA7`bCG#U!wCh8yXJX^M>Sc4YytV(gJ{)C0QknsflE&)n*A0S$O{+OY?jE_$_A ze(zV#7M^9kQNq4Eqt~i;o6ZaIn6M2xW1jV?_mIGCVfI(<kn-u?a2Vx!&RjLi0%0IG zyCE{C*nNAy`p1PWNy#9K#X3#Jv)5yTk}qT|_1VmXxJ%Q_&levPEeUV6S6e7sh=AmI zmxQ8FJ(E&(+<%84;O24v6@;2~QGk90Gl_Y=5EHfZOlLNrdlq_7LZDB|ZW9s<a0Ue! zV|L{p0NYTjemUIGnJeg;A&eZ`YN&S9a0sZOUOVem4NYiRgTIV35jL>{#ed)UEF%5t zL)^1tsX!-S{|-%4_;m-<f`pL~?c1p^`oljZ8myjQvc57e8e>8Tw9DWW!_|B@Bb(M> zH~iP~tA7ZFHMNl@scbE*QphTF*UlrUk32Lvg#Fa|9e7}5Q3wH80|T^%z_(#`zAv%( z1!5&o1ZPK0;72I5S5FQ~kO{mp=c<M#KS_{L>J7vlWF6o~(L#uFi1Gay#H!>(Zb$ky z|Bo~$y>HKumabAD%IxEKpJ^F1987c`34_3*_Ec2*CMdU-Hn;yr2BrKbff^lu7SOK` zKBqP|&k1^_7JK!ihUGpC=Zz_MSZTcET}t)H=ayrgTO{*PN=gW&DWkn+cLbt7FvgJY zZ;7ZSksb_Slg}L*fQ(GO584Y`MZgwj7&SYQ(dQSpmkwh8qOb49r1=J{m??*GynSG8 zsF0aaqC>63Z(n-z_p`7AhyesJt{$ntY6|9qDRY9U?53GfC<^>SZzg{>Y+h0yL#<lx z*EcQ!{uAkgV%lspO-!za#=%FzRtd#JAqyq73r(*gnj@nk!*)cpc><{UuJZpn;OD=e zFB}SMmHiH5%0kxW;DAv!1jKZ~$h}Eh%9nBu+5+4->y&~xr?lG6G2zc)d>30M(e6lM z5v}kq*!M&@C;19seeHe<=H+Zhz=R*H<drDoomFj>Ah6NDhi<m>fAoXsA9@uGX##tG zm&JM(aV7?c?o#Y*3c_?eNa258+n1XtptKz45Z6Jp@=y40F$$Hu>|v=_(s6IQT#`fP zPpLw-h4;mZ*4XOwH!#g}k7Kf?4ED8Q_Vv_WsbRJzQ!SpuKF(H!%{Owo=GwaB&HZ^q zwa@7{MoE=P<iCZiP2^QOCv5<cJEU=WreFc3vLZ2Y2?fZc4vs`lOxSN+*!wS!F79^# zcC(Mt&kMayp4`}%oFWhBI#OAq6M%r)d9?+JL3?O(?4T`?`kK!64(1MDUp@H-a0$-S z`<bo%yu6i0B71OPfypl(&t=rg`cG|k)6NiflN$Aa)nXu!Fn=OwNBiKxdcKIYh~s#z z6(OC1Y0Q$JzGce@OR2U6_xrPsU6#VV|89V2;tM~xu-orpqf!Sbv>_WTrDo!tm%rgq z<He;zlDhvGNfqh?H#7MluwJUJ9!s)oq<Z@yC-`7CM3i%y86hicDC__0ApT!>=+%=> zJ^<c=%z3LQ!%KypLD*FXZ>~^OC8M4-{eEf3iM6x5JssicqwPEQ*h{DR+CR1FT7SRK z7yPyonIH5fRd-3=-?AY<>-)XZ1-VO)S?pgtO#`Tr^0Cgk@S!B167MERKZ~u8-lISt zK>vfSG(fZIXpD9qP*~L(t^1L>eVYF&B|KmT&_E9L9+lCSfoL7rYp#svu1Go&cYM>4 z0zKUDT3PSTq5@p#Hh%&+=6DB)v^0cbB!PK3RY18uu&-<RV-l4W0DIlw79t;EZKok& zYu2jO2+oSAZCTNpkuB1;>?y*7FBIGzz1J7$*UijJnl{oq>ts3ESufA;n|kIVIuj#b z75Z|l#v%iTxQ~1kt3^uCND#4jlqm8>I#qVyhS8ZjaCsxKXP-U^2_5-aWGKv*Esz_| zU$M^kY+WX2{&8^+q20Y@5}23w7T73nwxxY-(z6~KOoTQPAsxVMq)cXEdnB*`rx19$ z_xLX$R=B1B^FEI?({b+2ae_ezeT?aC0~-zs_EaSnR%O)IgiQpAhES9`aE=u237T!H z(gxdyF5DjQt@<{J$h*8bb)C`B$%I&pC@<Fh+!i;s-E|m#s+1!M8PyY~>89xglTXMT zp<TA7hks5lu~P3-=nUSBjys^eiC68T`=>x$46kKZ6`5-UyqkCv>~F0w+M*VDMt;t# zGexAKAAGCc*=O}JY7*E<^$I*u&OkC3_G6-LA+KSg$^;`?;Y+0{&~fgm<=vXTS$sm{ zx!y`!V&5I{c1h)7a_S6ND4cw+_N663xj1oRkZ_CE34b5%4pi8s@DJz#sprr%2^CZ2 zZvXPDbBb+e<msTZWdCh)?$X!q3X?__53lAcmRO2DF}qRmg{k9f<89Nqs6ii3RoO9+ zB)xJO_8N5@DaiBjfld$BckgX^>^1M2eTnV)b5P^YGY2~Lb@<-(U-386UQM=RjEbKG zpFAv5?$ApcB)(MXjex#1$&kA(i)_Yn;AV|27B!2mJpQ~z68ydeSNWYk26tCtVCkC_ z%El_faGR<W5w<uP+&H<t=g`t<zj1z%PFbfAhab)#=)wdfm;bA3<o)ek{XeN0<2SAx z?f-+tjiL7&&hX3VtKKYgtAr12I-C6B$sBx*XYCAOFe__yJCRR;zQJM4$!IH13G}iD z@lWo_a9`Nz@S6KS2v^T~#|Yx=C9dKmi{{dVyxQbk2BLLK#9tYVM9J%+h3(EpI%oQP zTD4EjE1l+QlEEqLgR}037Nf)F_(DwOx@ku(a04$dJsr~NlfQwyD{1`3ZNtCp-IK8q zLsS*+hDC{CilQOt9OP*BL;AZ3$;&?Zq`)3Q)T>WLBFkA@`EZT0!4#^Tu9K4D+YE$A znHJCz1RQS(YbR+~hCIz`a(PbWEc-tFQt}n{b!KtQ<9}9k%J_wF;V|46UA)Xo_Bqe6 zGeOr&ZmOA;O*u?@=`3{YjI^YW!Ft06(G=G?{=w`-ZbN}}`5S*pa8kL|3oXIpiJ5o# z?DO3XwJW`CqGT7Rj3E5lR>*fF#bV(m8r}~#dqng!o`OfQ0{t~VY=a<$HU79ZvjJS` zo(pHM1z}NM>0aIJ`gk&XdgkAdjBC!qrn5nNDnsVk)r)lH{|s>M`?7d{FK^WUlm7m9 zaTCVHA~Eh;K=MEA0H960C-%Tbv+=$f^!r3<-W)uwDz8AW3*b$C;!CSYezDmwb>Ru+ zj7qe<-)oHQ*tKPp;-av<aID7R{mV^~C36Z+RycbI3%sqzI{L&}Zls5Oi*9uwsaMY+ zqs%qX{2aWl?Mc3;DKjG=JX_SV-K|;mm2IZj&rHS8pzHfjG2zjN9SvL)cLLYyORoj^ zDp?Iwrb0eLlE!^Yq!#$E(`Jy!6;^g)vt8Lr;d#2|D-DHdKM4Iu3oNAEJ94I`Y^pb^ z%xj{){8OL)MseAS@LO<LOiY9#!Ore<uiloiv@V)+jOKUPZCn!aytjG{do<f^94gEo z_wC^oEibLRlDxd}C1N5^l?6}UIJ4|RV@6&{kyn>(JM(Gqg^T&M<OrB$58%+547o5k z;b0c2oa^%;GMF&Et8}eX!TR<so)e*zJ$MmiN^sbR138+IBKtAjcCeSWMkpAXT-*P& zf9#B_*~QF?dTwLP?%s^<z!#A&o?wZ9R=wcPJDo<DKtqLrBs3V@#G)vKj;)wa>`*u{ z)0Ze!-ajaD&xwbE8T*(nwARk$asa5>PeN$_lXMaK?=d<5M?m6bUKaw5fLX--!z;Ph zc@+ix0x*yUx9xU9mnFDPEDCWitfhkE4F5BtMf)4|yIxcb(RDIE@~!Fbzm*sCnMyzz zm9F-hdiI71{vxoKw)BC-LeMLW(du#(=!4bn+M#zi-V4N<Y}P5shd^gYi>%ER>{P{r zuE#&3z#L#^_S2ld_3$vl4qgUsu1Yu*bbDl-1GC=?Tbt*72kP$E>W96cCkNqwy4-IB zD)%8<H0++dc_3I%pb$$)MI^hUpT<2HCV-m=)NL-L`>lRGc83$TpBJzN67lQ}@w~du zD?3Im6h=XCg+|~!ZAeBx?Q@;zv@>OU#M6gG?Da_#RQ-T32S-&B^Cl6S*n+8IP7r_) z4uCv`nN9l_ykLjwR>>h`mGPtwDO%$D%*sk-1k;_YtpO5<HfU~aD12}M^axW=&yK6z z*S+_K!jgKS9{$5*=!oB5Ij2}sK>0Aeixcq8CG*7Fc6Q4Wf4aJhiG=Cfifc~o)^b*{ zmK=`g{9ga%I&;rQs^gu?Cg3-nQm>ZA+~d2<J`Q^;yA1@DHXywpphBIiqb|-uSNDAI z%n(jM{*uJ5$X~~R6%&~91p=4%Ej0$Zvr(v`2{hmIHT*u<YwZp$?~xg`%)_qx=G;D* z81#>smdsl0>1JM}N2Fv?*>U(9N4WD;dn4jG`+8)(*X~t&W>}{^G``aGj6m<jZiM;` znHfv02`wzOs!%Yz=o|OK!^{ZN`0zO1cdoLenC#JjhTF!bM++Bf-5zx2yXVZm%g3o$ z<t4_o%QZxOwwOHmDod<Ip57Qd-%J(X?;Yv*N@Y~$`}71uYOt*Z3XB-004-@Y>(%Jc z7+VD}Ch|Md!a;r*H$r;ZUwiB0gA7kFb$cY;OqZ-}OlXNVRZoX_sr6orpPpvpPk%*A z&4FJ@xOFw;ey)mkXwRvSkk|0m*=!}z#~L%QXa{@gYFqUBn<pIP!-%-hh5>$AFBau& zvucf0Xt2&N-2o`bas9Q-59t8|k&?X&`P)<qE7BDqZ7`K?H)nuc7^S+ylyePQ*lXiy znw6u(ehLe<((@CPjbdsc7_XmzpF^s+aiO<Z9YgG3W~Kx**jzp3nwec2>|}6ft{gil z&&kwIQfFjG-(cm4cNB^*+?FeYD?;rIG43<<ch-Q;1{?C@%8GUMm{F`&VBmZ{v>`E7 zSYuAl@<rL!ATl0sOMFDSGL{$uiZE5{lhvX~uWH#HqKlxNO3C1<)a+V#iwpxJ@~K0k zh1f_1)EWkjC#xsM+v1*mE(T_>7}ojElO=gAQZu<+x8Y3rdkKlXo5cFukVshMY951q zQAo!>1%uyaI7#`oJoRl}Ni>$`iQJZu@-=#z%$j}FB07A}j>zIRQYIkorIr>zD+Us` zwjT-ihW5c|=ER9!M$OM!yeM0V27g(LO_)G(OG;bmGMzJugWE7Z<YHRTrNSbSA@$Kw zc0lkK=bM*`;9y$8LeW>F<R5=D-DU@nu|sL!;5;=?VaMsdVR?(u?%5<-c;nQ0+yhCq zD}6R6VniNYsmTI~a`JH2=N$F#*fH)Wv$D=x=0Ew=n+p(Ta(Q%LhfM22Nu)_;fU1RW zyjWlcQvD-buR*rFw4lU7H*}cuoT&+zOdX_|rB8Z6YGt}WXPEW$_pzRA1zL?sH7zvB zGcvs#><LPYzEyZ}RPTCev&lfkXrxr^4u8Imo`a~{FCI0(7#BGek!vatM?>I}-zI#S z87<LyKooVY(z~5AiZkI;FCXl#E_=KeYL}8c@ismh_sYM_u+MsN7b+~?#hgG^NQxDR zOqb|vhCCTsDdzpN&D5x(T*V3B(hNkJLr6}#GM6X%E>n|+CP~Gy51^R6IJE5qZ+lde z167DQgyYKAM)_FbCf?BDiN4L(=a}2~>(({zzI7Z3?sFcTv>F7}sxQyITu-?GEKK$9 z8Y-p;$J1S7*>}ib0VX_gb3?q}V@}QBR7q0N8``MPTf6vZKA+fZzQ@7U{gQ<SrFJQu zR=vR1N2gb)*sd5WQ8}A%k51@eNtwRl6x`hE-0G;cmyEo`${Baw@V+Q{lLBR^(Irt6 zVawXug<5PfT!N|61v`TID;#jK?eOCxGH-Tq{~UQTz`kCza>r(_@ULnI$o(m0pB;U1 zo0_N?tLvlNd+tLa1s68(RztqN70T<2+1%V{b-G%-9+)JNmZAmHYFl#DhtGPt`irdT zWmRR89rywJHmjp)t&gOwc;C&c3X}j2T*C?^RqOv4uS=obA}Xb>;H*%FAM$0yOR*w# z4EM9S8P1>Wz%y6l=UjDPR)(p7m`uIdFyO^<7l909dKh36A%uSXg1d^{gb|Q7B6l~6 z@m}b+&gx>$dEP-~UbzK7#GrYl6vmb_aYcByx}+sDC8eOTI|%4<1zf!6;NZ}uxYc(t zpi5BqgWYquyOv^&N(WhWELQ}u+~Ic+Ol+U?w!)FVj76SVvcyOWI#(2%XC6~80tQQl z^Us^)yUEoF$w`Q;ImxS+F35iTFu9msYiZWqJ<$V*gB*~Rus{&)E@V8;o|6G{MI~VQ znq6EZ^XS6P*>=n{`sIE(F;~|)yqIHB`+#ri(hDyG5!w$)aa!r;rwd=JvTc5%d=-6_ zl}ZyyK#jLbc|M2X?F4kwUkS;Z_FL_=j$>cVB}kE5v1y}$cN1dU6hmaY4L`IkiKa19 zgI>gYShicWEuN8`le<x;eFKCa@4Tk9)+P9=bP^#KXt`XV6KQDrdC{{E0*P{P_=m%@ zISHq&vdG%~+8bB?7GihpK$NjGJ$TgWE-H8{q6NAiK`D<pJ<x^8Hqs=kobhl5{E8Br zL*~jyhV)ctQGDKoN_5GO%l)~~I8vYT>itm_Co9EnPsI3?`Hdrwq}yV<7PhOS<D}qE z_H1uwy38o3_17q#waIq*K<;}Dw4FcS2WEMc#$_A?><iS14-{tlUifLt-Zt>mYLnk> z@|)fxZY`%j=LR$$DT*quo2e@U<$PM%4YNmXznJfi`qX!6VfZC)`jF{)yknuEHfsOx z*^0_6W8B^~tLuR-o6R)`vVW%37d>yY#95`m8_bk!S0>;C4f-lBFK~l^Q%7*o$wtFt z`ovA-I<(75<6DaH6fXvLg0+?Gs`b79$`R_9{9&u6x)xnXUvxp!>f^}G^h5$1dk!YE zInuRE9d}^pG57X8nDzTO?2&DSJGJKy7fY%zljd?ZYO#MXtxcu!4kH-|A8%O1r`51m zc54Pw1Bx2@&bQw9`L0)Nhga^H!WQr!A%nO!YBAL8rg&#Vs<d$76N`*$W&ZCZz{@3~ z?ZveAoF}RLk*o_%)J?9md@(0M=48Bi{xYdhMS>Iu?_G*Ei|d|ksV%Xr9SUBytSQq# zt2HgW5VY?P9sgLOAO{`ugwXu5p5;1EhcQa&mpU7l`6q(Y;&a_n-yG^Nv>uygPFl1y zC2ICdcwIBQT1l2Tv<BH6QstnUy{)d=T!kOe3Okw68A+;<RQ^#l9&h4F-C0uxXS<Y{ zn>y$<oq9i=|M^lxv;_NRmo@@?@P;~-){is>xbsPRidHGM74>GXcmD~jRRQL~KlY2~ zb`$fpOZok152ohB9u1gSxc8mrf#{ngk#V14XC|RF$l3d3smG>cpHdyB>BA~Udg#4_ zpC;rjZaoaq8p5gBcH<OrMZ<UVNLrdYy#WSd%;zcDmmSg<$5T$=FXC6wmSc`DUlqOV zEqL13CIAr8T?)ObLQeNBdX{p{MP6I7lG9TBb29I{1f0s^7tob83`(Zhz<SM5O<rjq zW&R9u{u%VvgFRZ`c>2Q^ZC+mOa{w>fO|Ft~MSVhTn`ho1PT6Q;W2NvuHu$FG;jF?I zuJ`R-@6{r|A5!y667Hb3@J{We<txaNL2f-ax2}nmA?c1?Wi7qMBScnXwLh#dfRZn| zi4l14_YYJ!sjT`@${nzucyp*MZo~W*rBi1%)uXWmC?p}uocy@$<J_ZHfkM9ZCJ+n{ z<1drv2pHI0TeOvS7ht<)9yRa2@QX(e<hjX!-zro}vcn4cgSfT#%^1}~O+YZ=^0$k^ z+AbONUcs#q*?a9V6O_h1eK$_^p1Zy-3tIS&@*R)9m<bFJp~@pdn#PH}rD-Ub?lq`F z-)bFts}Wkxs;)iQ>kGr7R+E>smcF*~So}L)M9*Mjnzu(VuRX{_)8ai~>w4@a8(t^e z_8b^S6*T!P_!m#^OZxFGV8)?n9<{%|FIlwKtVNH*r(Olp{X1cTHw(o+wzT3bZaUT1 z6f|p#s_szdIyXjY9HeVp6c@(!=q@pX3cI95mSkw(Pz(*@2OtIP>WKaHHpuGSViXr! z8KK7tNc}3E8}|Q{F#pKB1M#&4C7)P&ujeWe8&ehk;eS;y$i|h84FY&*-M8+f(Y?m{ zFGIDf;t?nnDwTTK6z~OAFbzqc+t}P(m_ygsC1_v%T6l+)s2O_8PgA4MU)%7w@ViB= z=4+7b*()RTcWa?nTNIT6O+?#Z=2LS8!PiJF3ml2I?V?jxZj<3Tgg82!pCK)M!tg?& zWd3LC43|G|_XK66C%Xvs$?1+?I+N#XX?!U(H!OR-Yi$+47gw2+bT!;HXB8%$ezt4Y zG4kVC^o09!;0*cT;^7O5OINeNLhg<~)xk%-jtKY!94R<VO!O-<eOW(>R5vr9m}>=n zCyIf*c@NX-Lz2EnUzq*Oz0h^ovQk{2Bck40S&}sIHPJHBs@p%fnjPw0@bDw2MEen) z|NM&*@B~RZwaunD5x&>}f2CeFoT=D!f-bL2ypPnjL@0o&%vF~%U@bD@EfG!)C2LZr zVY9?_U;M2W3{!vK==x`7>dZwS5DqKQd<xjyRMvkHtf8#uL~3!jYaFz`xu~uieXd-w z=1_tmI%Q@~rSGdSqlGN#nNT!m^g_Mt@s8K#T#fVbxuc_9v!BK%f&&$)M-3BP4Sa26 zdtY505t#{CN>9<IyF}lrEX~q9$ZOVQ67Ko6M_{9DIMB+wrc8YAK@jwKv<WkSE;aiy zZHF3<J<FCU3zzAFiWRsFZ=2n_weaChbg$D*b4+b6*?d$ziD?8cUDdIfp2>q9Jc?9a zyx9O71D|NNn#G>|3RWOH|AGIKe-oEeEAfRnrJ}DrfCS$)Jbvy4>e&4X?3FhBRL8@B zV2`;^X57v6WRf;CGi&jyWB&_PE&Hl+^GGKr6D2><+m#+Yx+Yf>sbRt7ABx{TJ>6MC z%|`TtrO(-w2Bg|;$6x%#Q#rZ1K#^pO?VOlQYAC#~q&S<q!PpE(Dn3O%N}pTVSXmeq z_x5%Ozg6Sth*$V{@1}&0dS%a>;;LIHHTAwL4Nrsxk~`*PN&a8$H3CHP%`a5Ql9ulk z^IFz<?W|}Gl^7OinS{t&2gGX`TIJ_Inu@3rd3EmvLQWRg9b*{^V3>O9<MjIVJ&(5m z+#Kv|4v2P#KAWQlJX7ds?jcR=se|^bkdv4bD_<`4!)feT^jQOW=5r6y?66)ae|EqJ z<|D{8Tr1BdZY8=<-8%~O2kaTdTx#NQDw(o4bDAlYOKA0XT3ui}biI>LFG`+Uo*rs{ zJf&@`SLYwCa;eYsO5X)i(%i)v;iK|;p!Lr{ZzhGVc@`|O^6-mbhJRxlGI(uug(~J} zB<3W6?6Y(0HCe%KD=eTvB*IQ-P=3(V!)FTYWELtL!juHJ?CcX7qd~tF)_OIC1so9g zZt%SOWV#95c5^kX2Agdr<;)Fz>NwNn0MkXRV9OQ$W&`TwSfFXzYGiN})(UDqaJGzW z{I(M$tY_yIOgxS`?lF;kcIFa2=EoD$fC_KnBf41Tt>&XH;T5^~Bx=RR8@;lp>PjFd z!r7A-$h*{HpwG~hg84_!3VfNg0vc~Pa=JxjCoM@eSjI}Jn>JWmVv=#@(=Q&6#SzbI zv>Z42p9RJyLaG|HcbZlLeEF9pOO<Oq2F<CVT#?%?4xTeT-AXn)b(Q!zDY6kj4JJYA z2pt6u<h1pJa~*V<q&iiGnUrz0v10T2S(TF)sTwci^mvPmL;Q1vU#gR(U7Vw)A@^In z3xe8nE78D~4$BcLi~{*4b)Z>~ruM?$QK_}TM^8!2OQ=So_f*+v-`0<gHdR!vyU4;Z z%MMqCz;fBPEb-$;<1SaUo=P4|mEt$u$&b6-_R!_*x=xCWcDJ%SVc^ol%8Z?_wU37W z)d`JTS(ik*?rC*~i^?EGzIC<0Ob0qhpE_i}mMc>t_duC&GoKAkozAvgxtx+vBMSS$ z9+n&Vb@^l@{(VDQ8Y8=KIxJx9A=<eM84U9nn9SARHJyj6u^|P8`4b$k>@5{6i(_9m zliPV~6qz3{cpg8L`cB_SIys<lDpuhR`BU%bZSKd$b+j*LNAb2M<L!1-2)Ay3!_z3R zn&-M?vm`dv7;yDHedJ1uMVY9Q6nqE0uvD7x*%+vuX~H{|dAA4e3V=c8LC=$ynC6C8 z_#y8PJm~R~Ll3dmfWGm>pwFZo2MWt321jMD0Xh=)LrxV&#(}NIyj^ne<oo(&IyzND z1OYk9Jb3+U&YV~!HtO{0T{~y9_Q=ce9)l~5>m$wd@pdJ}9fft!UKd4h`=43<V)PNf zuT-roXpSy*A4emeeE8WiE3AF5K;A!lcymgxWaHlZ70W``96~Vdfty(E%!R;qyH=L~ zn0Db3)3KOu#kOEc;j{Ilp@IjOYHdc+8<+BnJvN3GU&sIrfbWnhbQ^dKPx=V`gXxJ7 z?{l}>SK3X({Iya~lM-SAHY@1FTc*?Yb64B&#zV=w7U6!lYw0kz<+EtvlLCz+A?Lj9 zMqrEll%w0v==_xPog?8*sZ}$0-WTD?n#XCC$B^JP<+DAj=BL9QG0C}%u_?RiVk^yl zg|5|x0xxSDW6N(YR{?)_W`bwlT+LI{_D4@9?5sa^)R`xXHzf;g%&$vE)R*WwQv%yS zcE5uYw)o17lP@D|lTy4&?C&dd{};<6@YbtF_1Nd*YS;dFcEnUwhKK*%k{%!F_VMFk zZsPR}dvwg{>KZ>g0@d!--fxx7rp^Ck-$~t-PE0t%iSwe_X+J&+%g;9BltimVs$M>B zzfvf|l&N^ooseeWmbu$udNdSs3HFk3A_3Q_#H|L@o3SeA92Dr{oyi}zsYX(`8L21g z21+(}4O}{y_GQ!28XmN158Vl=$y&14p2fOb#ACXKv|PugQ&cJyNzg21M21!Gy0VwT zW!h{*1-cZA9^ilc7*p(rJ~EaG(3{WNd#(4J4cSoPpAUa}PABYzbnlsTTa#}4(b37L zg@s{8D-q5PCNCaM7*}?KxW>WMt+3sg#_sjm+sCW`UL3z#SU#O<JfHI3Zu!h5^K^?O zQ}e9##pyaoUkS=RIPKF%O6#SN(sFZnRE@JQV?FfgrR|%~zH#*%fAQ4eOC#0-c{Ik# zJG?_mFwRXdr(GSJTXl_-K))HjQ<-X(Wk~@~yL6HA!w#u-Mg|(*A-~sX_C}0AA;sI9 zYa1S=^^wtl(&IjGvyh&Sss2+^xXu13N!4eOjHSP9dpy|~*oRdF%6mc+z&EJXDwTf& zV9#l1B4G!W4ekFsB95I;2HrxjNS7Yxh)_}q$A_cg9k#>sJB2O$ztG=*O<(`|$sU`D z=`ugMeJ%?6_ZOKmEe$Sy3xeN?(X7WBG)^r4;<?_CjogPiHSVUl4_Y{JnNr_fhsGor z_&~K>6+m6YUf=quoef`zBD(o0`0YB(m@Q2O&%&=0(DTRth<qDoqyaRv?S`Vfw^osr zaXFDh^a3#H%!s)pM5I1vC+O=x$3NYb*8Tt}B+Ov_ME!#~5nQ_#hV3RG3=3&lo_;O5 zBwc0DRT$~7y^pI5dzh#aQoOcH>~(I@EoU7w)9|6zwb-V?2B!;?mv*#X{A{Gh@<aaq zQ{v(FcYST8er*&;nBVhA?kG`V7i_aQ-J)C>KuF9GV{44A_HMLbR@K(<%!~Z%fS~UL zP^%q2$PDo=cdA1?Hvo0Xe1o4YKYA(gq*15vs3lu(<gB!QORd#p^vy4{#mu0xDfOgM zW|$*g;#E%O0Je`hahN1d7yQQktLq_+JES+OQ$>!hHqBBi6jms9mbf0D!O2)L5xRP8 zFF{$v%S%P@-E81;ccpb&?^pC63x*~4QIScE@<9cnIiqfNK|w~zRlFV+m8Y|*y)*<u zZRv$fT-o`>qXV}kAmN3?Q5IIo7wV3m$Lx-Bf;Tb14GqL+j8j>W+Xw$s!;qzuhgc|6 ztP_ZYMTYT(P10jRxHibQRA`d<y>Y@Dyg?2JmP4)_cv-UJ6FI)O&habX93}n!eOWEj z9msfO-_A~7OJ-(4Ga)QHJFv^g+td4ync}Xnu%J%I;pS7triz1&x6j;JTex?+(em2} z%Cg|tl`{J}`+rJI3S=8Iy#OhzeK2JxHUnW9l;Qg4jjI_S2aVAWE&WU*y;$oETU6=p zGNzjw1ghQbYC=scF}^a%`!`K?l|F<Ib%tHz9!^}GnlN*vk=tmkq_md+=l=RhBCtkU zrkG-vJAALnNVzGjY`VtyQg6>Mo*mG(4XrTyMWF!A=&+7|DoC-%^O0Il#=?5B-K!vD z{8hZyjhbXP+t@zU@LVlzbIsIaS!WX$k}nkRs~iI=M?0LQS=6W{+@UA3$rD+aI662% zi3s{9`pt*buM!VW1niJ`PHaxa73O)fMl&;@roLE~i5Vt)X93&7I-@`0L!BfnHO06s zlnlQ@i8kl_F@H+!dFw%M*Pr?R0fkXy4Uw1O>Zs3A5o^0<JFAqaH#XCzVZrM@%IiL7 zmo{MRQwogUA@+H?U>CN^ul=N@lELJh{tlrX6^piemnfblHs)!|aMqz&n)hBzpgPm~ z(@MkhuGd8<Ra}4_W0q>9o7p*6$CBAboKFTvUDaS~QsP&iDz4gm|B}J9OD;B1>Jinr z>-N;}dR~w4J!_hFs;+1j`E!ZRR;qiZlhM)VWjc@~dgW<vffJ9CLK91D0mb!?X>Ev) zcs`_w@g7-H!f{<&{k{ah%f<en6FhJPX2-wo&r<8wo=VFO)=3XliJhuhxE94NY~fid z)d|%4PFClZ4^n|aD!)}HTmgd(ae`%fKi(&P7|PfaWR!8@0n<8wEs?rYSHm2bjc=k$ zW<FsUh%=K&<u$;PZm1|a>}#gdHc{ZZL@%uLw*K_=FjSJRl+{AY#582z(>agnXya05 z5rg6#cpf$RuXw)j+){q!PC}}*1}V8eImleNZ>3ZH{fg_=#yYuX1Nq=(i(<VYg?6_+ z^a$nVafv|OmSuKv_L2y@5>eYaI&U^(T|%{l=YLpt_m+_j?4Jm_SaNXF>H*;N6V4Us zt>{*H3G*br&V?j2vvDQf(BrgvY-N{6Ks_*k>k>t3I_evmFdd8$O}Knf@X5EQepE*+ z;|nv>R4GMbsIC80=abKwh}3WH5uFa%J=Ngde|qR=f*fzj)e|;K@~pFd@n9ThsKdCl zn!|h#NU|oOqb4PHjDGR(KnM0vP)=Us0_RUo252@DTkW@&RyoNewm~Hc2Ir&AYqt3E z=u&f)#V&LDVK{E|y)I4mg<M~FiAUjC+7$6(H(!<Odsv&5P|3nffy%4WFAWW`ka@TS zHwUT{z8hQiCg5^dENSL+<s98nu5~Qh+$M8TIUgbKr`0|eFrMI-+v+S>cwFdRbJ3iv z3;ka2`PU`p6?!M|ueS6C0`1EGv>4o$ExU1gW@^JKW5EXyMt7~-D@hek0u5HM^Ru9# zbJ`M*19G`{|95!OGym_!r))q0#66z9?{Gg_gp-@ch@f?T5u8J;E58j7T^wxNzWs>_ zn_bWBYl^-;y7Q;>gK;3S3V*9&Yt+;>@1Kbr$$k}W6NKmsj8-XgK<qB9ZPTQM=Im0m z!^9Tv%UP48PIwRC6$q%C@RMnCz$DKi#L%Y=bibE=4ZmVtvhI8~BJ@Z>`1L0u5pW}% zX!MrEU?wS2>q)uUs;@`WV9Huu;BF&D++Gge&6mbIzW(8Q=g7H69$k0ezsV?a?B6Js zO{*2d+C{Qkd8WX?URPhSu3?`cCVytIzGu?GA=oZ-Vj2=<-{Aw@TVHp3d;(t^e|<Rr zA&;@&yEi}mjd6ncC}r=I1i_;a0ZYf)Wy=Dubl8(Ka|_y_c#2TW{CeHSkE*&6c^i36 zk4`=_>PH*mCS_V-c^x^F%{l??hSa<SUO6}L_&y2W3OX@4b~IYG$li2r`bp2_lx7EV z-;F;jqakzU4JChUkam3BD#bedoFAz7ojoUW3oYQuvMFhn+B`=Ndp*9JQYb@*yc*|9 z3+m)-xH&D{m)|)<N}m^r=*copCy|a@B8*hN$y=}Jm?#J)hgXF7M%$_h*uwfn6I>jw zblP={W~+Z54ovi$MTD(Ukm>i*6nzM`>oRg(%N#)Ng+TqSO-ap9y{gp*wb^k7MoVBg znEggT5QdnvirPdzg-31M2WHeMDVUGePTw>dRa6Y|k+!XF913w#u&j&SHy_?!U6vf( z1rIA$rh7Z|D)f4mpquI%67S2zKDdx|Hszx&@fiKSgsr%EZ2R1m@E?~VwJI*F9JddT zHWw6nnJ@pdom6$k(Q5#8qe9v?#VaV@#OD0b>t(?DGfQKHaPP&TB(u_jja=xenQjQy zruzw*eSk|K9$tq50d1m&jA~U<)hpm_b=EFuR(MLVBpSQTqJ%sfVJXr4ZUGSi7qf-! zvYh$pk}thu0(6^)raScBUfTqc{R7Bth+x%>O88L{LUJ+l+*7jV_p`!!?K%O)I~Duq zyB;y4bUWqM$;YgVQu?k|ILjC4c%3P0YqrttkY)+SZyj9}H9Rh8GgDEvX%iVWRAOoE zCbMLLD_A{~Upr*=4VTXctJLD=;BWUwNFVgu1`2@6++REem`EwpAI-mb6lV4nA{=0i zGxX;D)O^8Z9R~aPL$Ia4$08QK!t(Qh#)Q=U3{r7mu$w}tlK77wnm9DjKV66~+Ute$ z?&=U01+_Q1^gc)h)U%7}nXx5qpqumXUn#8yaVWp<XAkYj97*-w1GMlA!V<y3iTCOb z)~^?s5np4OfQqm*V?khgTWMeOS-7Uu*?m^@K_;ThxA5z^z@TKiJ<k4JyIPhk-BAg9 znr1fri)W<>r!k<Exf@3Dh98(aUVoc^U&Lh>0Mc4%tBB82+?n5Uk;X3`b*v2q&@Hny zcPf|W@~P-K)+)Q)L1u<?HovF_C0!V!#sV6sT~5XPrYjRWHCvM`qTK=#2k(xdB3YCL z08TByRW^Yx=waF($P4_U5HTy65$VeHl4_R-Tjss~jq&X~c7}gkh~JGwOe%K@CrHPD zmW?hg*0t0R#rQ(YNVO=iR^xv7p}LK#PzquiWf}v=?LdVKuYeAu-CX92RE~P{2F-~E z`v8;mz$7_QU#WrhIlY?rxWx&c9pb~@MmIP8*T>2KFR*>q`0~i=^TNV!F;S00ml~Gk zv^{n?8mmKSys0zgXy1btU}^idZA=rVYu%20s+<9%VLKobf^*<bn9!vCO47c5IIJy& zbnXIcx-=Ff!8Xb3INRu+NEXNRDRsryf_cLe#P9f$Gp>IQkGng%maLPN<QCw^HHMBr zgw-(Ov&tuFDCrKnR!h3LXr3!GTkvIhw<VgN*4rDCWv1!T=ThT{S1Wqe-jn}f#j@wp zi;9x?j!}f&Ch=5_No^Uadd1R9E7fZ(NjJ!<bnu0W4?<JUU?U^ga{@BT=x<Jq*v7B2 z@#jL5^<lA~f8%3|-|_7KPkd}ed&@oEO*?p-?!HDMp(dojgGg68sud>UVQ)}_YJYul z1doGAdP&jJ`aTl%ye<t}c6CL*d_h&e-IOyo00@$r4WGKa-kH7u<m<aYj0L7MAE1vi z$CGG1l{(E#@Al|CRiu$({uFInt2}{bqZWP5?Z)YBrDK`ZijqNbosAaBRiCx}MlWeC zjCmNXF{Q7Tz3j^p%=xU<6Xf`MTE4be{>!JzS}%coH^0{!eZoD(QVSQ3_TFfQzdN|c z*C3-!nTm_ccLj!WZv}r2vchE5jbiFCxghL73~Gu53gwIt-tNOGlb_uwQfz@ioGAe` z`$6j1dYz9Nctm=LtxA`AFhsDdMYlMdgxsa27AY5$jU#^qBI}D?6hxm=T?D4=d!ol4 z+vyV6R8FaAsaq^d&As+2J5=GYMDJ@YcjYdQWs4(dbd$xT^ka^nqFBGIZ+mp^m^nuB zL#F&^)s#Ekmjt(F^xLfwnSnPf6U$zg9Q`<DUF6xD1(^;^^wp$1Stw6q5Nn9rJIlc2 z-q4#)BT>{|!~cd1An~ObtS|wxU_WlKyIi|)vLHfYivlO?73!>uL_+>`2_(3t)EGYk zSYZ{ltGH+OdqM$y-Uh_yTyYk`|M&0Hd)o=G+5HB8Ew;ieo|9>XyeQPCUmcsIyq;4L zi`JrrC2EWe`CR;(J7n$zaU7u59RTKzr-#4T1N*~Um40j*omL+bW>vgR{z^{pA8hp} zh|(ea4-xj^uSr)8F7$0yC{_t3pV!$ede%Xr=+vZW8HU(rEQkfqO`52tw6)m#G+Jd| z+nvw<KzuUc?V|%>UyE*D;r2*XukdFxe3(b#IPf?)zcA`=Rno>0ov6oQsF?63@-f@A zB*{xgL#ba2ARB!bu>6hGypVU~tg&WG2t&|eBqX(|#c!GM76>RA0NmzhX-Yk7!7lz2 zZ6F2S%f_N4P6;ngL+HZnM_6_NTu^C}6E&9t+EUme_Bs>+dVSYlJj<FwfXp9=pCHd& zl*1a1D{936<Z;FR%;Q9^$1ZL|ZAgj^4p`AX_vgGs*)JXeSf@UAPANQRmD@r$#9(Pi zR^%9{7MP*m76nGy+CCE(>*_d>GEcfx){y(EsA*0<_h8xTCi^@Sibb)dyI2e@9s#p( z9QlGL>MYyLNuAs;H?+}L4|J|y+Je^gT76PG5DSTw=q*NWFqZ7CZN%PI47naw<}EH{ zAw9AqOHKj)-l1N$zGV@A+vdQHPn}vK_q@4Z!*#C|{$K39X;f2Lw=PT-me_(ls5GT0 zlp-L4(i3|M5u%`=bP-VjBLt);B(ViWni2$*E-FGq3=wG}T_PexK!^|^LVy4PVhABX z64Gz)_WkZTr|P}qocrGKjr-kkzfphuA-Y+6?KS6o)|}6Lrsekbva|U(w>b2QD8pS5 z?boxnWQMwhy0p90Oz@3{i3XS>mt&uJHq-J#+CHqF9#-}tImIJl@^f+{+@o%<cl&$R zieW*@Dvgf$Hak(fQg>e&?zkKDXgLwQB{bGUjC_P<8?F6!8Heb(ifQQVer9gYA_%*d zoaz=jBP52VO{<Y7yM>LmXXc{`^GJ_*hoS)g5IAyN$J<pxonQH3(JQSwYRT!&Ql^&# zbFjP08Clk5kgH>K;th@U&^RQ71(n`XK9v>*7odz19E;LFo4so=IGr>)L^f=`7=E^F zY@y*7SGBRv?KK*vMIP62x0^ja3syCol^xO85;+}E@$U5**6u#8D~vkie!t+FKx@*_ zs`=~T-0PXA(%%#tY8ggtn3{HN8)$dS%0pm9h(JF_J6WIz2u!O#u1ih^@C0v&JsB@T zgUU^_n4Mx0k&DX`(dF3*B~%QJ{#08?adq6ReFfVW57INgtE^VS-~AJC6RqCY?D2-w zQ|)bQ4?Wq-Gr6|k*z#0O;zIMOH;s4k<ue4liH9??-nl;R(ygh%u^ov)mtrUG7X@#u zDq8XNsxTbXe-9IVJA?DO8^3?2YxRoW7dY4I-Bm+Z-Ai4A&*0qlrHonOG$Zp}V|tiK z#SA{gmRYrjs(O3zpfVGWVKEjjC<}NMv`-Slxk2r~r@F92x~h&%_`{(Uav6GeY=x6o zPO|QHH=<Vp{No?rReB<9(Rxvx&mMfFNsK&h0lcdZc_F#|9WHv#*MdxE2y!#ra=Eoa z%?}#`%FhdBn9mKEa&`5k%gVD@8YvHnrVr2tEzv%4ExU~EDq)3y$8a7dcxvUfXydp& zXVGNwTJPe%>Uy$qUJ7=u16z6UyGmY+WRuNzl}`P+Wvz}Xn2)zh>?x|+?3J*2Ek)o! zZ2fq=08G=rD}yOI7;_@j(n_B;n3B8&%n3D)YhndEQB1#So3Aj*W##~mI3t)dos&3^ zt_9%@Xt;K)F9{5+;y84R37Lh6eOhNKp-Re}P32qB(Y*3zp#QV%iWU=Eeh~r*s`Hv2 zjz3>Cp9HML&J~U6efX{djy$QUAJw}{R=3kAW1_o(b=~Drpz?xVv#wTexdj882-74K z)2@)Zt2%5;uNl<QUe8{t%J3i}AJ_)JxL>H1j46UtZvBW^6PrmP8FfgA=~f;07Y5Pm z0>8e}Qr|wF!nbL1Yi&-6U6EzyyT{~m>PLUh_}F2R!CkwfyIQM)#*KPXdX3Jw$xYNg zS7b%R&wspFv7e(nTy_fYhd;Lq6|l0y<UHqdW`>)S#S30h0<)t9|0!~buGz!eV1=YZ zTa{MW7@>ghFK@|ji>mV)=~#&Ab|@<@M^l#1&=nB0690<RSLAf*lbU@J?IxYDut#Hu z(8&AGNmAyYkd`Jw{2n->Tlk(`gM66Zjp3G%*@(iMe}U5r2nQB!iA=qb{Oh^(z4=?L z32YfDj{(E_hD2(2^ef3GpoC;4=eP3jDhV1BW}F#yWMJ*)PEDW=4n#}8X?IW;8u@RD zSwuOWkNMuM=oFxo68l)0YL|UD=MN+0W5^d3fg?)<!3Ml%S#_zan;%rm<MW%ilrOsB z-1L(-531!t^hy<SUA4`vVPWC9Dt2FxBBA|thZ_PB<=L-SZu|yK^z@O*QQ<-zt8ZZu zxn0j)A^mw=nt;>u(b-$rGvb1_wbxCLs-|w8Z%G;Zg_lqB_8oN68OHZjrLS&j{HVV3 z*7)-0yLPxA+r8&u$5yq}zVpkr{gR-zVX~^?@d@G8p1WRWgS$2cpGhvTrsewty1v+f zx9T!3J?_(fx*H#2`lNHN9lxtAv`|)ppRS(fb&&W0$_<bU&_NI8V!iUA!?J`J<h`Bq zddUg;h!VxYTUvPhv7C>D6`hc~3d|ZB{zW+M{BUg1iQZ~o_5RbV2xG&}jty&CR`-G< zrmz&#Rl8%|$BA3QZ10TSY_E*3erw$ob=79b{_)ExYi(uY?=5uvD&oeZ=8MyYRusLY z7BF$i`K&P9dSv?Xt6tsY^$A4M8?;al`nD&Oxv@Wu{S}GMUj&{|pkbOi@rpjFWnUc( zY;GaD@CGTS7Dxh#NykAS=b?TGLOrCE@|iE227y<gB848VEeZTNSEkhXq$e>3H5B$? z0x@5mDe+71zcj|BlY@}&fL|nDzZG`Rj&(Pj4M2v^8=gIoQ8$#Q<)C+tTeqz5T9Lpa zeNAjmb41)5s(n3Og!_W~kTY(Xrm*zhm=yKaRgJjiN=C-3Qt0|DdXaY0YTh<YDB}zj zejz-4wTI8+hNZB_$Bv)6do+H)K$H9Au2ym9mXNbpWu3BRdWtqlDz&GMdpE^j|N8ad zvxD1?Bct2&=U7kmqnH0mSMHfOcPy#d-NR`Cl#ETN76Nca(2H6!vi;lcGf(jY#<tNh z3*f-Dhu^}jwAnarq4HCg^=8U5l@LOSefp=J+bB~S_J?%R)o!-_-nC3Ey)L&7E>mD9 z#i}4X2*II;m_~H&m%Bv#-dBauj6HI$&(3<Bxe}ZYe@|gPZoguYb+TV*j5%Kaz^z+U zpzl_hVblq6ry+Px8!8&Bvka?iZ&_am8eU5mbR8HwS%3ff>t>_Rb5_@yO+SY{&R2)1 zJ}82&z1w<WJ`#6i<DHME%3O<gOX7R4p2)iDe)|rmt*P~di{n(~>l&@P{rc@MiZ|uf zaB!h==GoA)W6|j|Fkm?d?SILTVC3GxUK;P2gIhhj9kv4fHVFsnT!;)(+cSwHt9ko_ zSP|jp6JD!rnkklh)`~#fqCZnP<m+>wY}6Zd<k*(-hhuuu2^mzWVU^zWnZ9@2Z(UPB z1bKDY*|K|QcfESoK)G{)@p3M%rMAqYozwDew6YbqjF!|V2<~oi*0}eXyuNeas{zz` z`P;})o{{Az;tA+m7<{59*cv^<lSMFOfjai@eWJJm&w0;3oy+u2T`r#};?SlHm>5CY zi|}crczSO%`4s`=<Z~AM!5_;2@}X#@HBV`tRyb;6Ba)V)yo-StrLAye__cQTEJ=>> zD{#0N0^YN&rX6*0WOR`lT=q(d8AW3az@LMhEukiYR>-7Tab|yJ5n#DF|FM9kfB*dn zdU7x`*K`=Iif$tPoZ~IIUv_L9c7JfHz>c{JSRRW8h7%%K+=YcfhR>%&qi18#U%dSs zEx~Tc^!<4rJyoBK%kdUvh&7UDLhQ<`V0&xqHeno#sw2rxbpG&oMb*CCbIIY<cR0=C zMQsav%&Vr`i;r@YF=ko2OkZ6-7f(L_(e+e8;NAD2M%+rq&G+NxTe_bm-p&h&I6=+M z?ODjI<X6*>Mqh!gq<smYk}|owB49p-LQS=)^1`Jy_=jue1o&&$06KF?i8BekU+mU` z6Bf^3L79I5bgKSf3^W_JbOJ?jAZEU|pTTqg7~fh^HUi=Z#0_9&7~xjJ%13jaE5>x} z43_FLwx*Upvun2QgttO`J1cGGQ}=ssPA*--+!Oqz`P5x)-F4Y|YKhHb-_We)Cp-64 zu3i!DnJ0eLiN6XhLs<+MXS|(`c)0i2dw`53xSFSorm*+RKX^DrOEFls80!g+4?)Ai zKgZ_o3VfS?aB}BwJnaW<PRk4|Rh8LI`b)IK(^ALTkI$yQzc}~SGf`i|Bh@A5?$zse zzzYM>dmyCW(q{zi@67O@rqP*qo{FoBHFX@IU7gZuJ)x^I2V^!bL-#UOz=@Qxb7$r- zmlX%+I<t#k20uJWUmqLLvUk^;`J~&`YO(kMk?Hc-T!zP-a^m@p#A$Dhn)6ltnw#kB zzN@rp+%Me9cF>$>ZwS-HoG7+yP83{o{pD<_nyZy!9k!|?!e(s)KB;q`?D4f|-G%F^ zHuHB~y&mT4D;UYo><qToY<W9bdi+Ico4skfFoQXqQT1Gg>*49ji5x0|lOHMmDV$E| zge@0^=75did>S&k;)etNhl76NCR^xme%sJ1GGh4Jx`LcI)9TfSW#e0&jkX&7?gvU$ zG0GCtR>Hl5)}5a<F?e|K*3RG^QAe-W^}Ihr@W@)RVcG-l^<vlQq7&;&J*vGjCve~d zxm~WsCo(~%+wpyma4+0L-{(d<dkkmrF<kx^u<;?Cv6WSj#M>qJPDqdpKkv|?Bq{<~ z_4g9=ksBNOZ=V5`Qmck7-=mlIjr2@y1!ZPM>C0kaM|;ch<<HWlSLT%lyh}M*UiMwZ z9lY#=v^cYo4Y6utge6xV;f@^WxW0=Ok+R>ZHKJ)sap-YCY`R60^#?bc<t@t8*Zl2~ zjN50{KL`(hM1C6UuIBzr=7l+tdnz<=cV+sy6V*;0lgRUwye!6*y5XYtn+|H~DBGsv z9Fo$Ww1yqD>csr6cgpmCf-0C8w1yuDD$;%8FRf5fZU6~IM`|#mMVQKqVgX<p#U{Mh zOCGjnYe(eY2!pE7=RA4($)&>c<Bz|q^f@(Q6H$q14;tNfCPD9>DX=C0BhwmFkSF`M zq2Wj+9rCV|?25#kWZ~YeOlw4gcAu|N7D@ggB7n|gRHuKeEgD8G0*y8a9~pcgyf@7r zidG(1r;E;l$oIX{;iPrZFxWTz4YLzA2WuuS;v~ly5S7SgiWX$9!r|9BSM@_yI+{AJ zGjw^T+<+rD)o3{HtG9Wg05k1)I!-L)!H1OI%^r=}2)6rAHL^YKHMwQXI{Gn095(TR zX}em2I-53cr*57<db10zyb5vG>=cVfMXYZcRw7Et!Kce6!rD=XM50*@wG<U~+tE?I zM;EVhKqw$@^kC0|c{n2$;jY~;@`DK%Bs$~Xk7xG7()~8gWtWaRGwv(u;rw+V_Spiv z>aaf1Y<*R3dF>c>^EBz#$_%Fqw~U~w(_u?9W*6I+V?L!17L6q$3g;*)v3c2F3iW?# zdfdR!AOEfA4sMUZ%KL`d&^@20+bl}Qf~GcO7EzwTPUGf2x({#VQ`_y1Hl4|Anp*oH zl2bZX7PXkr!!9;dl#*g=czi2DbsWaq_RpAx0c=x(SC}~nG!tSnl^&(Uz@FCs85#AG z@Zi1O7ATM*Li^Qr?@;EFY$LjWt;@`K+BS16w}n91$WP4~ZzWwNlTRmRS4U)DBs zbYK#(>Y`;0?l0l=?RLsU>x4M}(E`hpntq;(F9C)P5~@rp-J$o5IMX*rHXAq9o*ZBG zCM(-<Y|1&;<;v>o-QWnPHKP@q4OafN+!pDTzN?k3mD`Smyh+{Sz!*@%)!8D&#yf?E z*0_7gXsX(Z%zWPSg5Pbz9?+t3yS(Omj4dnE7Xq)HIDFfF4cb~e@HSoV(APCaK;o`o z*THYqauTe7?j3~Y{}M!ia;enIWZyFw7f`1>8O)O?HpGmT>NG5$huO;{`xJo{5TvS= zz7^|dau<2fThsj;`|&XzKnx>veSLk5+=h@*1cWs(g#is|itpi;yeUJ_p9>m!dOY@D zA}N`jGd*l7Aaj@{i@bpO*?-$ivjcL_5~B3e-I?Umx2yl{d;HjJx=6P2FK*EJKb~*_ z{9Iy&Ovn+eN06lyH!G37T%=_S>+=MOxT-?w-hcgb{_kDEGvJb+b~Ny%zY;55b@ikC zAtr)4C*pj$`E|`wzDzWy{I1e!`zRXdY>N7>@-p6;3Q`O(&#!9&Z70O!N|$nRddJyN zWn^`ED0e|MAk3DBR>&qIc_08)SKnvEt<(gl`;|-qd9<Nk>P&C3J&i@0*29{S9D1p; z3PdUEmhvSArZc^$PzNhL#aF_E{PonQoD}r0bOi-v9TcJ5r8tulpRa?LgE{jDmpRPY zDp25b8(bc!g9P!9H>M-mLjl1<`%oZph^_NGt5?kLy}$!p{tY+9HvG%L>Hjov`>%fg zk+~y)x?zOojQ?EfqfsKycQlGcRCt-Dx!e|C-&a&J6g4qHmzm1Vg6kY0;da@?xjg$c zIWr}8H7`^?Th(oZWO_G6)F5mj(%YrT=tT(vWVCu?+d{KUzOC<l$)}b(y51&})G-f$ z+hG~XA-zZvQX1#SOm`RW))2#s>YQaG)DTm0-f3nU>=80vw*h5Ng}Oc-TI$&_?aFQA zDnq0wy53YeWg6o^x!D??udRLMhK41Rd7Ga8)Q&~hee&}S4GT2HUAhQ*@s!a~mc>us zdlXGf$=d0NuQDFU^im9T?Pbp3Y`H|RUN1YI1Hz;lK`nR!OPGbZ2wVpOYOs|;(EAik z2}rp;8=h@F><Gbt_OyfMEEai)Q*HUmXn{Ag+gGslyUNdC^Mao5JB2wm&$?BMjf(y; zk?nWTT`n$;#H>D`5YkW%-tlpJN9<#PBQ>_#m-Hf1D!QhvL34*m4RT@RSHy;3CWcGQ z9RZU0kN;_zl)o<WT`-YdlE+zK(AxfJe{TXR_xm$+B5ok%*Bw9iObpkTi9lIL`PX7N z#Dc8GnIg-5C)>Hv7pF%Kr6_RPmxRA!4z-R<%zj!qaYZZ2D?f_}E#h)fp1%0ND~omt zm;G+5<Kh5Jw)}iZtTI);2GisTQhPNdhLD?f$hl^)oYhSIIl*}jk<xIb(6)-EfIBo^ z0k+I<knJx_Dt9Rv`sSJamb$b)phyx4g~xhrb*jQtdA)YKs!4!I<-%0iwlHGqkW<$D zasNE_W_5V><n^{6mm`0pBYWRBZ}ir@of><wv}<qa9l`_3^|K}8)6MIioo=@XT0nba z!xmaR&t^W_sr8O@2EV^EYSFK=`gxDMUhe`?p)HVm{d`cF4J^5U>4lGLVoF}e>NtK$ zGfxJBF_n3DH}YB=KvK*sbhlr+#LHJ$RnS+Sz?2a^_#>s_<KSFD$gzc;4*>NDCH~R{ zjhX7XZH_PdN!#=YhUcuUWGSPo0{4e0^An5?5L$;k2#s&zpnlAE0s-gJ%pa`g{dv{X z@CmYXqfCaU-o%8YGrp^^9Kra}idoeForit^2^^bJ=PD2NN0L`bAWaKbiC%}Vk_>x8 z5O$8^yJn+G%S{=l`tTO%t2u~ej|aUOL3^E+I2-q|oRv?6mu36H_&2_uTr51D_SrlI zu{PjMY<{zO=dLffd$Jne<M=&GVXlQ+))sHEy814^c`dbrcNMzzx8AAL-B%&-<^+gH z)4FDIcbaj#m+dj%V?kA(nT=UeqS!6xcJTbYZAZ1VPT7Xjv=oBWhC+N7Tn=0Pi|g9- zg<@PZd2UC;YZA8{))RE>_^uFKh7c7atf{FaH@?Q-OuG}o{i?JHAfT@=(<&#$&=Fu3 zM3`#&T?G-sjwo^=+gmW9*&~G~eOdJM3EO~*)<a^e4(-_@EE&8?X9O3^Wo5|L0x?h@ zhv$DQmzGi2flL{-fyTY@@$up%Y^%*)UBNE<jm~r6en6d3@U$%Mp;hY%Dh@qN^gX~S zt`g@bl(nFLe%rqm+p%)HqHX)6pQU^4`EzU9+Yj!3pZ@sg<*ic^1wS#YHp{v-^4U(S zHVcu<{#U`JzHq#l;XLTDG~m(cmg7F%p5a77fr!@a9l{R~k{5kIxJv_=*teHSPsSh{ z;9CND$L5I6LB`{A>{i<XCk3*YbE;!U<#|cO_;5;w<YC|w9b;bc{4n;Tx6bY!En|zu zeO-eVH!)P0Cg}!x^E^JmFSuFarC3?uxtJN7ri*jBym5YA^6AnCW3rm2mo2zm&AaiL zy?8hG(t8At7kN4C&Df>YyP)d%dS~?#`BhQG=SVRvZ?R}BMxos(-vM9rLXlgcw=jCZ z8cAB9e`&$i6JX(2LzVL_`c7<uQwbN?Iv?^~W&VjLu(7l9c-iLrS4^g{&332d4t9R+ zMs%R5(<<=ZT$tzcX%EV!fvnK!b2bt?zn{~lnRAt=W5TO8FJwtD`<@Rj`fwW%n0iE= zmlUqbEkj655sG!$LEEwsgK+nX+;iO%Z)=r51fe`@t7Ckm>-VRBFk&3YFwY8r$JklB zzx6zlt$2m|!sM)7k#TEo7Ju|bPrg;=oj8N+<kL~+5*Ner%sZFghS#<(G<@KpJj#TV zbX4`iEXgrhaR@BLq<}~aJF+Qzobg`f$WxuqK6bvPn19Pb(_0er`@1LZ;-ztbQ7m?B ziU1GXb9YH)c~V5g666c-<-<qK!Ku2+pY7tQ_W2c$)pf?cwzc%8h2(dv^;i=kxK7#e z;fgTOZMULgasEzmkUR)SRexoz9(=x7+dMhCKV&B%mn@<mFP1{(hcHbaVAbpvhAmbD z-NjsGw^?rXjrfOjorLVs_<*I>qVnO}Ct~gfS=ZgC2@Z4Pz5{owYTxuK*0P+-F4BC0 z2YHQ6#8^m$oryBHVOP%hZvl$q<Jy$u$rZ_%fz7C06V^w^M|0k`oGHFX$Q_T{ZRxgu zuS8L^@5J7+!{P1@Sd-ECzRQ~fb`M$tI{V>xQ6|&1Uy)DNGEKVQ5HOw^NFlFLxQ|11 zCESlhBh)x3yG-@!O>i1Vh4Qu~FDvQW-*{!3f2!fY;`|Z#wT#ZmLB^3^@O8&RR-HDK zg*W->g)x^*TG{0!E?leM(LQI9WoM#h{NZ%d*vr;gw~6B8Yw!55L6xUk?N_dD`9m*; zsI+|znJaJH3GOahwzJRplCU2dcR<#tSK8CErS;jt!KG&Wo6K@6p}t|bLzZl#MQPd2 zk~~cF3Hpx^%RzR03)r~v@?}XJXF+O`x36{1W^MWx_4m<MpM-6#=h#NLKZn^eS1?5S zHuQ^yo(X-kr(Cw~61Lh*fDB<pEceq+a+1x1L4$&78lc`5g@P4MxEO9Cm&L`IQnH6P z3&k@r@@Sx&`35Zb`Z|x!;)-LF-s|q_z0lhbF^6m|L&l6^*7>!p+5{y8XPkqEl*T%? z-gdsV+5xgYs7Gqq?Zq*REpwbdj(r{+A4OO&>@okA^Iq@wRmR#Lh!Z5|mM3W4a|wjx zg_k|&WM{lftuBNMU%5wC+P&RBHT~Kc?NznYhX2!prZX)Ucb}DnZX2_6xTdVqd(%>U z*<<&#ld-<r0iO<Enp<jBbV!FdpqV)rF8**|0og$^Q9dG>2921mt$pA)M@~stJx*9r z_0D!3bko(ISfg{v+nb-bH|?u4`90C^G`TZ{vgj|tIqo~Nk7PMI6YVjTL$9bZPpIGW z4Dlcr~0^toCLsp=u6dFlP+@Jm;KrB=skE0E&%g2nKIT~f%TL0B_sk~{>{1S1Ef zGc22lpbWTBV|DO%l}Zpa8~f>1O0XaNbmmvnlkEao9T(lZXm$atS_`UrD``{hTFQ=* z4IrB@De@jcKbL=U-k@?kb@$~O=nT0C`$gkc!uGB(pUW+^nXIn89c7N|AN78`;D6)O z^^+%!L2dL+p1a=-K2B-BlV7k3ZM)H912|$Zf743U<f0Yqz6os&sG677>x6!Tsx4W& z!&6_<ax2~AiPpyyCLYQ0F9kdG7l59PH-9Gl6wXOgQ@NyZZB$)qSd4jIb+Po=4*WzF z5y*lQ7T#7<X}g*ZA7CIdh#k+RaRYA`=ed*xor<rlU*-9i(_%b^K;TDEWV)C#`@BbJ ze>!wv>-zh2_d*Ii6tapv)fJv-&Gc;mH>k>ZXC}H2+78vrPAc{J~43Y*rg$?TM&M zLxa3{z^NpMKaJ;ai2+B(O%ch@>!&P%CGq)-4)x)ZK*)iJ6tgZFZ;}i=EC$O5yoT8= zAyQ6>ETKlY5Lg3rLi7|+`5r~ooF;|5^jn?AJ;kw6wRv;SpymCvXUhArcBe<lYb6Fe zgnCv?00v0)ABX4FW44dm)3X;xf`XjE#V5zgNBezQ%tR?R$+|ou^;6iBY{+g($G-Qc zK+=wT;n~#U)Vuo~*Iso?4R&9=9wIpAoO>W>F80CBG}MiAyF6o&9=P*oQqG8QU9~>m zo-SvQ_Pkoz1Y~rSFnDbq)U$LPwOSmWSG|Fm4IW(u%Hrjx(C79kA1PMj6=%oG;x5%5 z!N_8W&QjZf6OgswO}<?xBADQ_2R6nF=#ep_dPe4$U=-q6L8k60mdX+(w>e+28_VO< z-m!J=TYOg;2cPs^#nCgFJlFBalujphIIfjkhL(g_f~<Lvi7-hn<Mq7*;J^U029y3> z1&n$3NLrvyf!c>cjX991g;?q>F=%gY!ZIKO;w>l=u^j$<mMxDs)mwgS;2quYj?{d| zQmyUEuVJ7#%2)DnSkZB3VeltOo_?Do$70;e$0g6-+)E_bW1_j-&SLH{<kjJ<-Lam( zwVS(ix#gD^JkK1Gk+zJzn-iLyK395CcX#BAq0(1A$&apNI7J+o<n4?eZX7nQU2qsx zX&OaaX|cX&hsB$??u+ZhKqJHedBMekj5&)yPFL~4G1Z+2%(0ly_5bpX!ffTL0DbV1 z((0<dPlK*!ere->a;M0xim@roDh<w^N_urQeiQlG)p&I6Q|_R_vzTIdye{#@@UfS{ zHvOruzIGrm#nXen%Ie0&f|p;14n<v#TN1Nr;YGK;X%hBQoafp}>on(r3wxiGxaazt zS!q*DD5nw))l!<qOWV`*SKn{$PkGt@3}nQB6`A`VPCt5->C)<RZfK{r?~2FqUs6x( zzc^-f!e+m5KVdc)Uw2N)Q|5y)el-1opX!%L>IyUsriMrFBjvyG!X`VY^uM-S&vIt` zw(V$egVSgpZy#bgSY}$da=zML<NTa@_9@485@eUTZwGKfLXhvBvl^mm=Egd=%zc`R zz294=t~GvDD+R5w((T3MPDj;3|EYQ5n=|7e?Q;I>9@@IslXlmXU$L1}Xg$wVr!yVl zYa%CRUwYPsaXYp=h`RD9?m07>>MN-Qh443@cP<(^kEUWO)f<3cYpY{t>>THbEn7VD zih^<|!D&<cCO?%rIwIlpm3Nm8oQjoySnn{(Mdx`LN=%k3a}vDoQ@XMDv{9Lp1HLw2 zvJF>$c<gf}Aid=jOvh$(Vo1_^|GABqNL#A+4YjU~w^{dgYWzdk(m=Q8=U(*&xw}Ll zEq7-U{rrLs8@ap~;`JM2sd_D@$;=G^MDaTvFip5RpH{@e-g7XBJqA>u-!K^Gzj~={ z3BCK2<8fa-?`dqziL~?UUBODeH{8n4`$6dvx|m2L>TzT4>aL$d+_Bqra}-$7{@Wzj z7M}aMM>%Vxmr~YVu{kjy`Q@bd=G2exc6zS$aCv#SV8!X;ByftYY46)>IV&HHv67mP zWJ5Mgi3*(R{m$-ec)`1*?AsW0`~cC^EZ<;+rAB|sV?L#jtvRsL((~R$JaT!d5GC_= z9+ItISH0N7cd;XKY8q_@3aRqF=$;V^Wjfj_2&PNYlLR(9n9dvAERv)jtNEhvHYroT zzn^^HqBOFsv^dkTzM8b&yBU(Fmb3lY9~u_>%r+|I!sIzeRTeWzB+)SItaxIeTLaIY z!uq{G{miQ&Fz0N+@9t;jm(wQ7c-og{Cb#;Yle+F~!_<VqSG}@vJL`Ye$?=JUYlv|a z*+DGmpHV_G0d->~q4y7LC2mF%2NA51q|$242q{Rk{r!~y#(B{<tOt?v(QgNwYTRKu zN!ZQpVWOzi;`dsQ>-TuU0g#8g2$n>%??(RsvgB*qzN;Ky$?d=t_9y80K^|9GH!|#M z#ried2RlO=qspuj9J$JZY_#rpJgft3Kbk_^n1=~B>M1mLO5h_Si0YYxm{Asnu_jQj zGG<1^16B1P_mpzXr>Ngsms&55uCKS0?~RRtNxs@S!TCyTwyCliR}2I}Z_GOb7d@fU zXaE(^9V4%vx(Qkwi^<p=kM4w24v19GO46}P`;1tM-(!AT5T<f{QjUVIa5O!+6l|IJ z<cq+4%dzmEGcm(-NO+1=z(tB_s=R&&1P7lmHT&3rS<WKL9zBbn*8*8)MmOeXY*~eH zL-{_dxL|-3uK!)7c27kdhDvDbfWt~PZkfRyeGwrS=%T4bBk<auB@g(Gz38vR%Gq0} zAN|zrMNcDW722!9B2IxsH<*Sa+GgBOcHu3dSq$}sot><1OW2qKTM$9yF(NWY%pAT? z9-Y)<Y{X2_Nh+*DNDX?sss!_qrK-gupk2+tH)t`J#F<J>tiWr^vIPQg1`o1_pK06< zzyFVUE;|A83m+P|BNNoY>G8{HTo6yKUbkLg;YIzp-O=?B%15<{dPH)GethfVmAOWz z*8T6e$<H>4!kR8?RwB;Eo0gDJrtprdcA9?IPZXbTai~b9gQ=fMlg_K@AMrn16McqH zK3GL0dTL%jUY`=)`1$S0_Pp9<C5Ov;vwSMo-(Yevt0$QQPog!K<%Ku<fBWK=QTZtN z&>_n@m*Q8RzV;ml&`sI?Bf2TOzN_qUqdV`YXI3*m;NOPQ_g4pfuIYI?u@UhpO{I%p zryhTSsA}&y*wWHh{2ODYibn_MrXt92QF`>wh(qOE*HWo{m6YtF(ajvl16GE}52IVi zmEs%ZK*&#u<&v{3sCt5ZW~&A+_V!0v&I6vP;9xA7;%7KN`L+ImQ?Kz%=1dI9u=Xu+ z@5g$4$g|*|vR)7bpt{vlvbqF64qX@fAa%TJdq>64F}qUw`wL;UQ6~*_CeIsqKkQjF z#~+WvRu^T{2&Y}$zyjOpt9GyS9tP%{+8wtc?cQ%taQ@i41)SEx;SD`5+$#4Na#nVQ zhz%M}E;#<GdWXgUeAH40GafOoAqD>;f1WFxSl1`1SLP}9Vinm#X9e#k{V+mS|48n& z^q=NxcEUz-iZc<jM7DShR$|?}*q|qXLw+K!1`|V@LCe_|rBvZ0Q-NL0A3%F-4QX*P zmECG5OWpWy$=Ku0V<{)Nrix!oJINdePFvECq)>SxhP4T;dc)dK9yqRt!$|U#HrNvD zQV?TZ4<q|oj1v?)+6fHcW)93yK+DGTy%P6PzpMQ8UFC+N4%Muo(B{j1Od{mQ32Lf9 zGh|KDBzXEl3m@wirSxK2tlyo-bOyIzBu-gy!J^S@B^jiv^}S+ty3fKC=~PVfh!$p) zO&$D#>3pqN#;18nl6Z8$0ARh;CvX0Nlkyct^i(SXI1OOmT?tY%l%ed`lo35cgE=5& zxX-i`ID#2B1bZ4jV><B(%k;!sCAV9Vm{0!k(X2Vu{d)7Rg&Vl7LuV24pW7S2{V~a5 zbCJvECeQX`q^2S!!8JFd1&o3Y=)SHd*rJbQ-P6Kwe8M3rM65M!1?-8@`)Kq#x+`sM zW+f|hj~{&bqxfI|Ea!~|BhQ<aYrhmf0xg1wIo7WfHj2JV>lfR=3`>2&CGgL?35Iio z50HD9Wez$C4m}NK^X86{C-AaZ2XHzc-Ro{wagoHk)nQYTORoKu#i`*vm#gQqhCALm zvhUCEdM&eiiZCvyE$Dj*wxga~SQ7eg<JaWYEmL;Z55`_SKG~D_bM}_Pt($W%4ZNt> zo4qOJsyy~g+smF5pIU9BGj(pK1N-Nu4!_YN-e1goRD9x$&!y)XDLB`n?Ccoja0VF- z@SEeK-F7<M2>cTMM`K-Jsg_~>L$EY-IP5|8T0hvF9lp3fPZ%nOoGN+_ZG(?=R2LAZ z@q{B$dXqZ$L~J@;i}SSxeJwMY=YEww5PX@0T?7yHPRS6rXBb<UH_dCT8l>X9)&D6o zobc!Sh{b;(Lxf_P$a)3^ezPw0HMUkjfr!z8QR+K`-FJ+*Aq$3p<|34aa3-2#MJ%cM z*O~A?P+j{d;7nS+5;Kt-j0Rqf%;QjCv&aY>DKjD=zS9&{0;raqGJYbS#n7RI7d`+e z%uY-W;6j_k80j&6r~+>>vHTT7w9tPzE=iFespF`3GMsX_S@k+Om+s3CCHWy6W9poT zeW(kVm~3+H!eJ>cMHk(8-9DU`#(GCR79)UxM?EuA3Ttnk!sId=8>2j!gzUHLKSL&1 zPp7S90ckdyw6<m``s?_}s0G0=x3R}>dJ2;%Z>Uz#Gc-HxE(k>2hurjQF*>dBMr6<- zm@4vc?SO}#xuRdm<G!j<CRG1%w{1zFh?6#oKF3PCGiPbUt>cqj053~sUALFf69789 zKo|J^Ui#~*We`7dIX~xDq5h<5P1uUb{hdf2?G>Mt!z5=^-^(Dk%gJ1ry`9{-prIRI ze&2LU1~i;ocs!;85~F9bG|qlYL%U?fS;kZ{8cOx!42p*xI0Fm$XZH%HLmL*sdoZn> zDbf6JIeq0hwu9UHCOMgKG9ta>Mr>#Jca;EtzG8pL2pg1r(?T6iU%-#x{eV|sYx#A4 zU{&CQ<^w-`y!*7uk_%BPf`>N~e_f-laV13m(HKp#9pB$Cs1|k)OcP0+1`p2dHo7bU zfyI0BBGa)d=9*BByl~)GA57#0EG5H!Z>+G@%r8}Yzm3r_C^t8ZyHrhfE-KH``Y`mW z<7`ZMo)<l}pl^{`@g_-YX6Z83l+h?{cFL+Sn^CY`ekj+=$kb9&5A()HO)ik;Ij)1o zo6`TWf4S@9{`zstq=W^K`B9fZnDiGwIuRoybzsr6<NWd|y@l{EQQ9aoiq6VatJ?v% zZ%kvIG;UTj!ZD4CfV3$`ya0IH%BjM=aWc^-5v9g9jb*>_KaQTp69A506!m$dNnW3V zFAV9T1fNFJZ1he>QI34sk`q|mUnj1vUZ??Ln3w%6Q3{e@9s}6Y|Mi)D{(9wv2i0#W z^qKun+9+!)?aA=6!&ygXpDW|zm@t~JX2dS{lsZ#vBN<R-c+ydpW}$YL{s&^bpS8vl z2yV+aTebdV`$oedi{0BkM+>nDN0+e&zGZhZd-_jL6|Q(hh@}V=TWSi)sEpq*AGQ?- z#tal0rX3(a2<Uv_%vMPpsQx^6pE>Y>!<jWUR>G0dvy<tIA$k+e6J#exK6kP#JByt3 zdRyz)^>e4cIclrttGI^Q$mnP7h^t*Vu13UTOdQmfBs1u4*c<r_e$13MStI+#lIUMG z3VN=3aW_kstrJ0+Y}1-H@2ThX;B?j{J6AU*;LBo&-iV4mt>d;v!3gfGR5Y-u_pSn> zesFpzv_{?Po6~!Im6t&dtOHdS$0gmxg=~7@D2{_m2`*~?M=bW?){umWRbZ99nQS$Y zX0z_S0;FVimJ>h*2+o-gcH}LOpRGsh*(Q*jbApddwB(Nl{#pp}Tc*v@*=wuXgUis_ zB7aW8Y#^JGfayu!dO{W+F7;+lzIycP75V0lfJuep4tB|MnV!dsBAwS&n39@-Ag1St ze4)Bz7^JsJ^ukRa$2KXEYlVxH@S(uxeF|^_?ZmKy=R(E*JzlTSAJjM2Q9DhcX@`G# z^L~ghRZT}S2swp(-`NbYr?~<<JV}^p_=6P8Qo|B_(tVHt?`F-regFMk-$=1jL_Wgz zERj3;`i?+DYW2+~&EYXC?QY`INzDH8`jO#;25~$;GN-N<I|1;GG5aU({xxJI^QXui z-&G7a3*@Y%&)-${lacY$crwiRlHp@a8|6@MxR9b9xo5AXkrW>_vdEoe*VB<N8vDS1 zYWR->xWhCzwu#N9>(h0=&f2C3Ju%=6C8;GeOYzzvP>Po`=x0M@QusEzX28`(y(qoJ ziuKI@W-Y7}UM?oWOzlVNhj-4F2TCFJ9k9;0U-t#-d{@zplU-N@=5$))y#BKQwEeON z_qJ#=uQ$>G+f2KicFZ}&FO6x!;5}DFF^>+I`V}A;BBBUq%rkf$q<-9njkCAaEh@2j z$jNs*b*s+{jN=IVou+kzyr`GwO|Ypl?+#x}#iD@+gC-r#UlmwuU-7;*>~~-{<0w6+ zqXTNoEf+f>@wOo)%p@>S3U&T9=a*VT9#K`q^77>YH&aG4|L8L|EP|KOeL>Wxo=xKW z3QzPved!2@0H~>ceYE>{{7+vWa`~+z?<hVoTHk0hW97_9i~}NThU^604JI3%y%)Se zxjO20$gCk(nifIPvSL|TbDam8+vT8Of)vQ{bAIf)ODX0{zmeE9$4k0L9SiP3)oPV! z*vV+hT$+>nKod7;7;{$!r@`u{v>z%&-F(E(SH$B4=J5&am86Cs48*mFue*0|cxzaM zV&6B~x1wqho$hPnT|)ABQ>!nH^mPb{Q$P&isq#G#L8q;*tz7wekz%M?GkbvG?=t%o z91>##0)4sn(Zz6NnREaScu1LL@fC?5RQoo71^Wt0TPA~8!ODht7FR!GhSVvC6K3Tr z2b$l?i<B6@Bd*wM;R^<_c0W;TKctuJJE&u>FzhRJ_(O_;$_5#?i`8gF-X`Rj(Dd1N zWjIDDHTzEbQ{YZvv(=|>5&3V=T{VmU4Tf=T%*i64#p{YU(&oJ4jUj4cO%_9IE9OYr zGTuTaV>2YtapRXq7puU)ZrmW}!ntqbefp5EI%o@`8oB`G@!He2RYS_sStbjhSy_#} zjE(`DjYq^pCOlNe?Jl0HnSH%TqauEoRMkF18otCj(!<_0j!L_$#qC|ocvEik_^LS~ z*DOoM0Q3l0=3*`TxcRUliO_9aw?9P5FI=FaR(!&WmKVm~z-*)I->~koVr~4qFl0-f z9akbkqBx|kLBJ!;bU9SIX&7XJGBE0m)*%;{e%S*(cWRV<=cF=%S*T&fPDwdqN6-K{ zjpKl`qrlf*^Hb8DB1OF~8ru%Y`DIYoAn)erC774c(v_TEy+@hvTOE%iwz|#~x+lhn z^~DAxwwsLLE!}z1Pd!s^RMOB$^7V8!&dMb2@@+7^7`FzeWvAi<vT*Fpz6LyHM;&S3 z3r@1B_u$OJWoTHGav*k#>2o<@A)Z1+AyK7AN7lcAEVO7SKsgka6{}<)7`r~b9&t`W zj6(ZD#5;29kc_@-j*BSW4xDoWsUKYTpilY8S}+}4X!KPG1B~ogYWb_?->G<7W{l<4 z;WUgjJ0crosBwT=q$mS>Gh%)x_+nWX&Bj*#is_|D0_OFn+P;}(v7T{rvoic?<jPb4 zMzEY@BITu*d$Vi2ghYk<eO_^$Wx)03W5lYaqbhT;6o(0Mmpy2fcVS0X-@qLosyH#6 z1Ea75W00IzHoN?vIbWV+3!;6ih)CO@qTZti?yAVyw3JIfe~x9TG1aWMqGE#-jnUjj zY+y;wY|IA^tXm3d*M3*Ii2&95Y0L`UdQ=5xNVPlaPl(sz&j4CuF9@sCZog!4(yYFn zyAbLr@ZvV|=pEFUAAY9n-!U)D0@SFamphi*R}95${#Fja7376btdaCw!v8wDcl_R~ zcqwqC<J@_L@3gG6gm!ElO=S`|i3bAZBBnnBi)@!TnM~?fIb9!&h!xm_edVn-fx5~# zEA}5jb$n&K;!8v%O+c%cc*yv#P$sqM7O40rhXL-*+c(pXbcJ_2moHWdLFv)g%?10} zT<)YU^%bwUk@fjUca9b(A1Rt(6&`xdC5yO%L!C4z)s;Wy%_Wrz>!$3wMVwxFVEIz@ zrS=-ulw&6KgH)P~A*)o6q+<z$M@WaVnrv~pIa5`-Dxf5sPtQz?TlxSz4<M~r&C&&8 zZ%e+5C<i&m+$SqbbsKF8^L4?n20m;#H|>#c%mNC6Cu<mJa|jR^>^G2Y8Dh*oevo>~ zY$jHZU09ZZYO($CtUS<fc`dI-7dGY~h5el|-k}DX-&OkU4^3aUrho&uv^RRf(s2q0 zX3`&x{WVHUGB&eDY2m4JmwK8`d#ZFKhla&{dd}@2i^K}CPT!*UH}PA39XF6v$_a0J zbbTpQ#}#=gB44%DirW=)>6e6#Mm!E7L7^}!j|oZ|l&FNF0TFoW8u)*G&n!BIOP{)( zSAs1pV16LdQSO|m&v8XuTInLyXO;G<c-@G!WZ#%-EDnr$SN`&nx`8CM1ue=+7L#D8 zy|7x-7c7>+a@9j~(eW{u6--|dw3u!-l}>QQG3>+khM9ef>$2GeP7On2`<Z=@BmTUo zxWXSYR65|?_J;h3PZqv0KqETHx-MAC8CDpfV)`6%d?=v)y$$x7=zY_B$}_grw_-Xt zUJB!l@$m1;6^KL&>4AOGJtOl|$WhF;l*lf7*+Mw=*X}5$OeB3e#lf+0F>`nk^Nh?l zLN`bzoJLjBRn=5=lk!>5b9{M$98hxWe3A{EN~gEmW6v_2k(4Jt<gCnSR$^`&#qRd8 zzxV0yefs-6{cU%D`=|f6e%uTUF4TbD(F?5qC$JM}zF-6`+xusP5NEl|UPU3%QFAL| z;tV$%8ojIIv!zkeq`$`FTE8Oudbyrk*za0niLMcj`}mU}CWiSo;Me~dB}_;onke*q z^^x05$@MVTeX9QvkylL1O${4!P;_s5k+<J?LPG>iuUD3$Ya7#M^=WrGS+@@Cu=**M z5mGfW%;c0TBG~J%3O}iGzF_pF<+1FC$LQJQIZJuJ{K4=Hc{GOCm^)kLo$_n+W)4#q zS9n8r2yH!jI;y;e1Fj2EfdAsh_4c01m=@E~K(6trJdDQ2Fxx1WRJF<eOa%@@5pd|` zV?iMGv2jnepb~m4`th6!+o2$if`+!6x7xBZqUXV#m@F@Z**EYPs=UI7jT2@v8ixr{ zs48;y;JbD$^`G9$*lD-rMMDv7!0hpHZXM77z-1La!xjqREU=MOKaF)Rzx+>FZNtAK zHEWt5nnXH1BP$>D9<ihT=vPjALLvLPT2E{-0VxQ6WDD)TJSw15&#wSl6F+)kG~kOM zKhlj04s7}#KIp#!`N-e<6!|0ZvIx4p?Zi)QcGp$d+q}qMx03iWx&Ww#G(_<U1W})u z#QW;PWJ?S0<X^ae^+P7Ehs$`<B&wqnQBzPOCq%aV^D`d&_b04Ia=FSV6u&-teT)<c zd}gSnWk@d^yE6#Xqx}WlfHw~pLgEga#T1hAMO0U*%5|vr4eL)H&-wL0wF10+9`Tcb zbs=9Ea(4L6Fo1dT&8c<iauNHT{{eD2^KpU@<VOcH5Ov~{zH9={K7vL%sGUjqRsH(L zm-XP)29JSoPti#vG9An}5&bPO*s1t+;Wuxg;%2p62wdWnp1s~AX)u~G+ep)l<8r7z zLjE6WJLW&B=HI<)@+1FDmG$obdk_BJgTK$g-?s3#Kls}x{v8+oFO7}g`xSo(>M$~y zEW;6kO-M6RCa}TjJAP2Vf{<dYr8r5X#K0cMk+8io8B0L%3EW`4C`H@K8)e*(*E3&z z!8T`vK*JUXrd$Z6J0hgwPvdErj(O39h|@oKUZ6)8DbfB@GK@Qyn@-gU&p*XxOiK8( zVlKX>veF-H<MkzfwwuKQB+`qAR5nvT*%~aLQ|Os=oOf{GXYlDFX;L0X2_=+6?4nx3 zk6;lwEOI@wyk@Yg^Dg*su*AIg&+Gr~PpdZrmrkG3Mc_mZq<4yW`sNmO6bY6F@X>V) zxa|Q=@Zk(aa~J2k3YR<Wqz#}JtctJ;3RIkZd{j+#0_E>l|NE=|ec=DL^}pTR-yZ(& z;P(G{TsH@YXWtpIkCO>RiZI8sZ0zHo>XngfxPk!oeZ9XN5>nF0ugnoc%^BbXD5I#U zI#9a#<A^<qEMrYlaaY84-P8q75k_{R5kE=JX^>(;T7hqTBn@M{=XR`!&85=kn{+%2 z(HEAo3J43NA7t39>Y7|Jsmu8Zulu`7R-M2%0Z@)3bV*EQ_yU_&i7X6aOO0e?<xao; z1!l)c0u>K(6&r1W$=TV58sY`uLnWhWWmL#s)$lI56cz}QYug7IE=XqJ&d-bB$dmTr zxN;H(J#U!~Ljdoj5uAZWszrn%O9=xq2=F+>B;O$rtQXV$z+s&o&cFWk<=_3&t7l9h zBQcYq4RjcU9GgcWfNfts3AMtR5q7RMZ~_3iwoaba4a5a8)|`vsf)rWAWbq#e-3Dcx z46xFFC7^y*8H%U|JO@A??7o^BnxA-}EyBJIvOx5MgVp>77Z#lXzMg}REE*BfsSVOe zFrMF4UX%@vcuSGgCnB)_6z5{O(DMmwEkidbG1_bU;@DFvq1J=o=K#Bv<~DnK2NRGp z6SalIdQxw~ema#uVldAI>AQ426O^rG?Nk~jgIor7tDWT`jKMMBpJhxLmsXM|4ZZ}5 z8$kTf<g{he4FZ9Rr8W<fwTO|d!sDyxjf>ZPsG;c!JUy4o7W3D~iWWfxm!9KLkT)c7 zgtWo>zN>I{FA}o>Kfx3Vp^W0tTohGrSF^w(D+ESa66F^sy|Fbd8e~#J6iYq&2jL@f zYm-2tBjCa9j1tJj_Z#Bn7!jod>)JURSA?A)OoMIXSxD~=jA@*}fe6$IIVFJC`K9yV z5yFCc`!)nS#rxG1Ti7HD3#b~wL-zAg`8of)kL9E~>$kM`;aRJit=I*P@9Yx61JBzi z3O4EFPA;BZoF(=z`cN!mlrVH*o~S1K@Y}l7&l$hzoGVjjEh&6rnAQkAz9htt)*0`M z2<6zD_E3+ZOlR|lZKYxtO#Ji+%7RqB=g-ze`%jPlk(+zMo;^+rs|{$H4qLw2F8-3x z|Mrmr;@brTfkSX^-0wN$(;3WE;6vgFIIL@Z%ZLwI&<>T4DQ$#?I#N9!wngLfSv(rt z=3D*!vqU-~b_&c=mT?&hTkt42HpJ&E<GA$c|Lz281q=m&-YC6XEQ6O2`>eIQMxfMo z=13ibz(oFw4&eR)r>2Do(I*e~mkCumuEaIYZ!_{}9l;r|r+^%vkTFk3MDp3g`<2|X zIAM?MUE%+*V&t)5FC}==e!=615#=NEox|XS7dlZA0~!Q8^dw@{3*pc*Lmj2kCPg<+ zZ37Z&p~&=d5TA~R;X*<Q7p9^Y&}a`p)IW@tkL+G|_@}j>4yi6NT60L}P!sDJN7Nd$ zm@I!m=;MMG$A!nF$?$6;VlaIo9-srB<+Vfu%d&Fh8+|MGynS6t)P(kFo*iw$B}hJe zjDs$yu4}vvy0Ar5AGt9~AS9I=|BD~;QKjA^^R;b^Z2MS4m4_K-UjyaMza-frE>D2W zRKJ|~tAuy8xiqrWYfu1#Iuyh_XsE@oA7RDKvZ!yawhIomUBUm=z8r7{RbeMt%4`w$ zy}d-1zhD(GXu|E`3V7(;dLz*ZLrYfxMT3ph5wR|&We+xFOV4b&7P;B*W}BW#nAP;w zApsOy7X3puXr>I<Dn(Mvxk|L}4_CR(`+7ip9lQQ#^EAwQ#!HIdp%&BNDQpJZab()m zS;)ip&1i!@qjDCn<PxyOqVUka_#y0n>NRv#-?SIKQOkIiuCMdE8n$CI_4A8OuF>&T z4S8H<k8=M)s94j|RcQ+P;jVrGr&ydUz5ZQ=x(mWj5^}%f$4sCi^1FGOQE;)RVp9z< zid2vMhf(@5$9{NtqwSzks#xzin}l9&rJqST-8Q?dXfO^uhrD6KV%hm`gkmKv4~KE! z5cs~{)RLUOR{OuWWrzRNgIdQ}OOKdo7d)-tHrXC({hea98JL^=FFt1S0rx~u(RtOf z9T9?6x56bzZMMZO9A4O14>&*fl?mmJ<|3e)*TV$^=s(5fe-2F#{}S!a49!$LudILj zeEY4>GZd9ySDefEsG@SwNrkN+%v)C<+U-3&L#!8j+&3)G{>T1!)`%PN!=RUy2bUz_ zHEv*Z(vpFldcQcB=&659-BTx#gtPRYQ?~4SIGK5Ni&@3dGj20Ho98b_oDSvAgIt!A zw;8WZ7pI`2Ck|&5f!-!$jPdJIr03}oj}r&TS7y^RcnOt*NDbZ|wd%~C9C{c)^Idmp zF`qhzG#;LuxLcEf+ua`h$Mt3UxBIT|MXvd3xBe5sABq>sfq3IcUzrp+JPpOP0U%v4 zkN5n|oX(BQPRoFWGVM{(CpVj0_UXRO8w#B5y`a_osc0`@NIg8}Dd<jm!1(f+hj7S+ z#S(H%6$_bw1f=jSr=T6_)}6ZDF&^Y7OcNX)<IN>D{MpuTzwFR|saEP{EfcnJ=maZ& zG4vlt8*2Nq(UiuHLaP1MZ2kf+q<<rU|KB5lzX9t11fYV$2%`iV<(Lvw*Ir~;V{Pj} zg6KUkH6?|UlwLr2jtAjNbDSPPM(_Q7Q8e*KEU=v`^Y7&1vFH)6*&L`NCi1WU`>8d_ zi%<3-mlgMw4ZIm~1e2f4ly&xvaXWM&_v(Ph5%JtWCNaCdnAXi4wrl2MIoOC4-67M^ z@IQW2M`YLY`v}vVsH=<DEFXf%Rm@tFj_`9*OCL8OmuQdF4TyP@<(x=ij2OCC#+C&R zvDAnw8Tpr1sOC+U%SCWmov&A8-s%aAOety7XV5bau_O-&oFvQg8k9T^UgvACqojRy zs0E>(tfr7TKGBzVY{~{x5#jN_jZg+<DCv<Bv@yFGlOyfLY>8w@1MX5P?aE2R6%G zFl}*<K$Uv^8(<@37aC(JdC&j&PEWqpA0vX83l$_5k36UftQe550=giZ6TId2ifi-q zdqRz^l0yyl8p$C!W8?=7PEXIbjAK^?6`J-8@T*+(&p3a(^rhiY$&in6abribQOC7z zi}`(~ALhh&wBtV3nykO~)^6$6wKrS$oP3i3(3-|7HtMe52va-1J8HT+a-wW(y455i zIpc)W%TLk<!cD6j%Z`^<YNNNL`W(<7tkd8=`mHas$g5lzp7COIT#4UY+-YTyC32mL z;jNZ00Y1X!PV;Yu$5KH(6$$dcvG<-~O{MGmC^HsRL_~TK#zA_C^cKl)bN~SX=~5#y zh=71J2@sMQX;L%NdqyFIP?g>zgrXpzR4Eb?nlwo$VL^&#?cbNP_qop3bDjT({ROUY zC5x4Jz2$lC=YH-xpbD|u>tBUbWWPp9Jk}8p?DB%XDj$b5oez88n2)q6onIVOO>d(> z1QQCTq#fVHBVklQ3nnijv`@-_He-ZP@sL-~mOQKZWo<z>pQ_|Q8ddsSV^vVOSuGp+ zTV<Adp3|^S#boaEjj`FWyZB^8W}K#OVx6mq62gTub~VdOX*8@XCtKzW>~V#CuwPi! zr)QarP}Cfz4YuyjId^SoB$PsA2`*EyB&>j`q|tR6cP~6m>H_`rWn$q)adLe3HH7r7 zsfWq%+>hyoTRd@Ty=trX1|{CY!R-EyWcbC2-tAJ2-WC-d&!Ru_wxMM;@`?ScttSVC z?h<%gRYu_8mXX3kf)_&bOiF2lsR(BHt(NQO_HbHj<=+8efmf_XAj)&=pqixzXAu;m zN!->KAsrJR!!84{|AV1EDN#u2^|?hWe@hJw<M6@xn%fw!%K8=GUd9M)NSU?Hsa>pp z(XjHN<@k1NCyeT07@162Fp{{u*A#~!R(mN>^o4b|j7XXD+B=X#mxTo)pHf#_CWh+F z&9la`IBd$c#W`(y^vp1tHa@SOkSYlw`z)t0pJ+vwx$lv95-bTuvl;`GeEx#Eg2vSF z1gun8@z2zunE@C1ROnB^Wr&I1h^R&<?5xu&^mgfnl;Y==$zK~MMa=1@iGkB%e>6=7 zJP8jC_d%cbDEG+$UQ$dvV-W?%c)saAlh7U~P`b71`M|BLS33kU51c=)mM|3d^@*I^ zC5w`xO&gmcd83by1X2+4LcdKBQinDj>=03TNEbq4op_+pxCqV`C!T!ChLPphGhc8e zY{C01S`<!mKz~77vSW#UhGU6R{FA%k=mZZv+7!MIn^3<Qaz5N$hBR0Ewt7QXN^mMj zSDn~No347jICs0^{o9d>4UG+v8FPqFn=xmWR+zpSe01Tq#sFv#r}ge3KIc(#ZijiZ zT$;FcX$p>4Nbh0Ablj?0bYqp$r+A8}=84R6y#l0l#-P}XIN#-`Q@GdxCI1D2W09hz z6JA2?{xsfEV};meW1ku%B*0t))dit9X-A9zS{;Vvj+}$XL-}a1+w{bwL)oUz?f^s5 zq8Lr6wy6fLnvOj)#a?#tZFbWAd3s=uy0<jAGXI;_=*yPl!?Yf1sFYm)Dqw(`5y6c4 zFVPx{DAscigPr5P-NWxFnQKwT9Lv1MY;EF#B0m`GO0RaBNYz60>f&EXMFB-awNk12 zrBYE%Z>@^;_RT5=3qn9mT4Rr$vO*XPG~zjd(e6s0=z#zWOA`j-H^(5HQ*zT7l?dwG zfbtwCa^Rju*#%`E*73)YxVA$WomX#y6VDGyC?+_ArXU3@3;fnF3q)6X!qI`~Sq$S- zCp%A$UC8;>dKutIx+4F;4Djm4B7-TXaIlm=0Jjq^IADp?r!1oxQ?%)NvkAv-7j~vd z!l~dV@|<Lvz+ZZ$&prE<lS00%?rP?k)6Df2&T7u9h>tj4BN844OO4HTI`C2VLPMEF zpvNa0PEwN?MTF>&kKRZ*M-Lh9u6tr4!9V&2B!4-CksND=hqmm1g~&R@*IRcvc=S>} zb`LZ5g~@p@PugW`^uULV6wn{~mLW_9O=&hvhHj)WliYAb*6K%Z3~n693=W_8u!MIx z=L?quP|~OTi9(QrY~p0X-$zDJ08V8FT`-NBXsYCOvdjH_Qfo)&qvf6@VH4{!zD<49 z+TGREWcJ9KP_^Wf1V|bVQuYeMiw!(xO(7#sZ3hgHm6o4hSB(>Fk?oaQID-b%j<#Zx z7*iXnw=AhGpNxN=dVFn1HGY8d73B(FcwS`{nw|4EenemUaj$KCZYntB;8C-bg>6_L zK>rE5VgyAB({$sFM3DhN5Cwi2Y2|MHF3JS^>Kj@xEQs&%k<0fE3TTP+?ZkRk%e4mX zI8h_t@u|~}w=)XQ7;@>aSoHACZTT4z)N3saq+F*;HvBTC4s_1^`jL)6){K8twy%RL z)xD^>Ac`~*Z}Ksqm6}v9OPUCM_{@;p!&?b?ia;#>YTeQq4!tYooJaLv4q0%I($l@@ zU^Z3t7s2s0&Z<T{bB!P#wtBttQ%D%Qc;T8@FO*z>rad7A0u-jzei2fU7D2&^xS>y4 zPnAcGiX80X_*gGMU4hAY3E;spCx)}X4fT!~4hdpj>O*g&po(ol-yc(K<1S0kj&X~f zj&%J8A;EY7;6j(I1%Ogg3Ux%lD)AkfAL`f=#p4$-r`M(1eTi01^m=0Ts@$W8;a`;( zIGDYb2hD#N!SSO6UD6v&r6E$$m%Q%{Ql7SAE1d``B-P%Khc~m7LqfcQ^CE|j!mp`4 z9=JEXFk`#IN|d8OLA@pghrU%kq2yANmNx|5<lcL$RUgjp?SbwvSzU8~M<i#3H)HaS zt2oji3Vpf<^s7oCf(uBK{xSRrw6hA@0m5$jgA0ucnhb(M>R(~3n=3HZKHF&d3rd_0 zHjC%~j;1Z=M4>-<fw;!cj80<V7@+%-xa?_j3AXYA2|_00M4n~Iuz}DqeK1Dk<er$I zKeVG6H-|t}GS!*MopOmK$J&>a0Q;Q%jw6qw44FhcnilFB0Q|;Okv<{7E^~ujm>S(_ z3kN^AWLoQnjZ(;a2Gph>T(+G=T0e+4gHi^ObQG_l*M7?nu6qb;_DwrHeB%IyasQ7X zlh^<Ts3>q___xS7f*B3QNr9Kpp0FfoM%W@aU{kI%r}VEz*c?kVPmCOFrF$5?oiz;l zC;Jy;M;0OAZCZocEN|r`XoHU|hFe%h>kC9N;!+Ly4P={5H|!^Jqg0Rq9kj7N*eQ>B z-$nUPr2w2B<YsBGw`*BHRYMhTNo4U>KA!n&TbswMb6A3zH#xj&SpEJRkvju%o65)U zjeu?`yr(1&2h)o0s$E-ayUA^PnP8w1m@Xr2(x_^iHC1UB>+3ErT#g)tzbmpUcu?_3 zRPwE3@56`dx2gt~6x#+g!{!;`!8Qcx7;WEM5Q{l7-#RF_EyKA$2cI$r*kX!sK9SFH zM37HA>C%0CR{{P5IM3rCS_}1iazRenTyy@j=AFu|#WNFH(U%`I=d-q$%*Q4p36|Rx zAfg9^FCD#z<ddMS1sAN`BY6WCqw11t8{A4daAr1DQr_kXMmWEcgN!DF(5S^Z%`Jr8 zpFou|RRu4dKI~<BKE6NN{1DZVJGJsW{tkI|yx*#<_G?D!A4k4gg|L*E|9ogI;6p<j z|3^x~SqJwP^4P2oM-aRHS17%u&n03O8pO2l=LgE=TT_PH>j6(nY)lz&;d9G#$D1yZ zEYsz4<w+TaUzPh@l+7+j+iSBV4ic$jJEI!urU`_RKPkzObCd2AJFWg`gV}gvpGV&Y z^qvS<-*+H6wJ2rdSf8ook!&1xP_@+PiH@b^CuA)>N2f)FZaeF5siYSnQmtfDndxUa z{2ZK3Noemnz?s-!9Y^$qUD{YgC;#B`=|bEGN-Pi!!4b5M!Q31J?}N-pzejCS67(oU z2xC@M%K%kag(zUpiT0C-uMVD4$F^(b2cC|~)qyed8_vW9oboNPTKI+R2ifc|Y@f4q zt(A#2f@8XHf$g)^O<FGWBq#XAhb^l~O+U9uyE(lD6(2p^=jbPfH6lKdqs5{w)|t6L z@qgxlb>C%9bpJgmgLOavnIM)x^wRn}*z7zdafg2ye&L&xCP1gh_Iii|rQFFZi?WTm zA}lXdn;M{`8qr(8{oLrQ&=^Z*=JPj$G~8}d_^_RSHQcYo$x*<qJRg65t{;@@v`)&O zxg0F#Ps)?@kU91DA74H?I;hAAH<?>#^-=r{L_1AjF9)}7Ad*88gyW7YCUEB_Q?I&Y zD_I=p_Nm?YsOdH@kwvMRBCSToM17IJm1frCrEF7(_o$W6&7C)%iYqlKY9kEr+nSAr zzWfZf4)=iTe5piNT0pH^%7Pk{lw;t~{g$03((hl#l?eDmk^PzSjI^eaoR)}Xt<Oh% zFs8|V&$Hl|O!jq*a=~iu=iR=?t4}}Xh$s^r?PEHIJoC`KWg_yhhAf|3CFiFbRvBUR z@myF(X`^>srz*8|X&UlnX;s&H4tg=zalq7KPj4uL)LyJFlN6Ni>{s|NZN8;WY@_M6 z8Qo%#BTB<;A1~E$fyRV7nW2}u=(>y~AST@VQX0B^(<QiIum^&s3|dN1t(tC>kQ^pE ztt*<#kjhuPS`r((Zux(`-6!k<`Htdxx+}Trj8c~9yT481&TvS5a}4KQQ!lKusxiQJ z4k{t)$g5#8!?xKfvf6w#ZNmbN{CI0VgMTex&+K41ZXQ?u0%|Y<+5S50jkAf8M)sXi zA$^~udzD?amkN-d;>D4b9a&ZO$*BsXbq8S6_i1C0-Sixe8Xn{ncSF#dEC7GNfoG!) zf%UrNA_oo>OQWy|k!bfLm?B+<W8t>Ty3faUSh6ru1wRLBK=tT?YMVp>K)&w>mvmj& z?iIkW&tNRR^ESS&7m}u%;#rG8+qRE~`>RKK(HLt38v%7YYQKo+MCb}P#9f&mQ&CI* z980t4>qH6gr1#R;2CZ&^QV9?~n{_eCo4AX{3e%;!=htkCBnhJ$!9|{WJ9@_WVJ)a3 zm1TKBuR!0nSkhQ2{M*>p@sr36hd3WAxB7m9+T&5R@#KuzvI!d&*u(oAv~KIM{=xMy zXs&^wJ!K?-JO>cNm#wAUSSB<%;-w@A37f<bH63sCJv^_ijNO3?BMg5ZzdT<?=RXDK zNs16kP(1el)IZRq1WD3z#m7hXSp}k!-THx^iP_=#-uKHZXVPTNjfT&s)j99$HGL%P z4Mv(9gvO8)SrUDbB9}?h1rKBrdI!%Zmu<3x&bTwplhxy5N~HN6@tqShx!KOmJJrO@ zwEx^BYiq%iZR_6;w*Nvt|3$a{6UYPo@B+xkhnq0$#!R}^0&<Ge_;n`+1cZi9K5<so zwmK~8a@t|fW}>5Ozp9Z{(w12q{hL3r_+--Wyu*#Gfl9XMcf_FUq<mKnZ}Y5QQ$tkH zjH!PDSS_lvVg2B;>I`|dyoQfx0#!F5TmSRl>-~59{*Rh3#FijHr*WMj0)V6!AFt(C zphyRL$@-1Vw~!d1jzTW$AYNUCa0n`Vlp>$^oTu~{a?(>6<5v=T6Xk=q-s-9i1~0+7 z+(4Dy$!0!8+OSJi(2u3hB2M)Z`B!P@+^=l)xR774ZkP5`q!YR?&}3KQJ*UIm4NhFE zFgy#J!f$z)zh7P;ovv3&-g6522|>@L!OyNDb&aG3)<mnD9*NXl48N!&)iLns{sL0y ztN4^+g{jbmP-NybZ$(G{Rj4NQkw{|w#Y=W7Rs6|yvG?m1tBnopD-D1JD<z#SgG`K4 zooMs2>ccsrcIn9uZLF7g8Vow}!Biz85vfYWfN~D3>ufAk0<F`sj1i2qfp507mo!!Q zpLBf`55N|TZ=z)B9>hrQM5sDGrk!C?eB0{N6ZpOMy_Hs0tXBVei5$IFUL^jVQa+L2 z%ePWgQguP`R`!MaQR>+s9GD|<J~8gCUP0|;8@yxZ@h`Yx8e;AkBTDD>J9t`&*q-4R zvgW<@U2xf|NYT#9c24lIZAz6(Aiqsq<%fPG>?7#6%}q6Bslfnc_}~w&6s%W_9?K3i zzT%@xZj2k4$zoXY(!$Vd)S$QT>71R#8K&L)N4GB5Un%uHL##js4-?;Z%22kk*g2J| ztE9G|MyDq03UASm5QA=lnQgl@=%I_5Mc(OU-~KD4np+n(87yYSSNs@v_~h)bDH&bG zWt6ajXPkg1sCCeigSeEx_^+5H)fIUzwwEjfHKe^~{n83#YwvGyq$WXog`Jnnt*o;- zy`OyN;uB}Bib3s5<XVv4kUaCrt(zrwyDa72Ab~d}62nG0%1V7}*m?e88S71;;6B>( zkQ)=S&d90^Wx{Js7HXlL8C}PikyeS+il><$zan{`_{>c6n$9}LLwpY5HSWVDS8Uf# z`U2*&n{jyXrT{rOO8}g7G|L!1YHrfuSc(r7mS%Kq_VHVwurKpl4(B`#6W^&$f$g{g z+Xqa;8lU^Ee}4!jxO;55aH=YMPXFz^L3i1RvYq!>@Ux+!lkXD+lvnS&h?z11xz&mz z;z=f*Z(Bb)DvN9r+9r!0+ax#og37dl1aot{ignvMZ9Ur(jb(F|r`;)&67J1B<n_vE zar4r?hsx7+A4C*C*p+2x3Hpx5%S~j>6O104NP`nk<P?JlL^7RGU+!7ZGM$^~Fj8GC z>hv4HyBuh-D%=r=r67O1)KZH`>^Jxx8^Uii_4;;XwJY#!-~^&E=3pe9>pcFw_Mq5& zhzj4dKBaeCog&4XF;X$iled2VBp>H?_0HZ*4`uaMg2egT{1PqV-v#Ag6p5#PV|#sZ zO!XTl2r$sRdn%5`f5YnRvQ<1hlXG;!<h^a<A>LNm7s5r%({9fVsfOAyx<`Z8<J!<I zHx1tjOACQTlP$jZ_L{@B+;XHjyF?ZFQ^jUfRPWJAcw#C_!jv*Uyd~6TraHGbPPWOQ z&ia_fjfkJO`MZ9G#=hHIZr9(W>0(cDtaa_P{irxzF^9J;=hH;w*%hX&-76v}eCQ`< zcNorMNA3D8PL)_oocos_-FW}4D@2vm#DVDh1C9-=na{088FO>e2{8J_^=*))V=6)? zVou@_JRrqSn&re9hIgR*M(Mh2fqZEWFSv9-#kjo*(>XXOdfw+X0veOs<bWH&M{7&s z>aN8`Sq*!KuLlk&9c_y&Sp)K81DHh6MCHsfMi|(&q+?0vkdcuUK=-^!GqJHdw;y$# zc3j`=E<QJXw(;`gzemOGed8vEGv6q{$xu1^sT*`2*^dn>q*HP49C{vMe!76rcg!~U z`~F=cnG%n=(2U}(AstJ#`-9Ig6Rpz8!BB@>D!sK@`=S;N7>rMStUsjj{FQl&X883v zthPnKAFrzm12s6)u%&!c7|puw3kdm4odUoprTjh$%MLu=g7+=T8v^kIFvh({u=vQR ze<d5mh<<W1NUCItKLjPyF%u`dZGbwZ4$ujLcheiAuzf*uRi<$6ks7m#%@g!<js#iy z3fy<!Ln0;3(0a0ocqL8Otg}S;@wKU1t*?O+iuc`&(xNH?R@p}a2gR?ff8Ox!RD^FO zC*#e_bu|*FUfJBv(N?m3mB46vC0x5<Qp2s)=5XKe4%?_DHEcOyrT34}lio7IM2U=u zwAXosS*v?^6U~aO4Ah8K_PDRT6Osrbz%)C|+#rQ}+leU#idjcQF$x2giDE3J86!cY zFc5w9#0`<_&@m0whs4%sH@#)=%mEQS%}%g+m&FF8>b5LrG{rRiz~7~|&_5iQNsyE; z3a%6P23jebV?V`?R6Lqpe7Mm{spw6Y^^!N91W*lWMKNg?w2n6+ep`A<f|aAvSX!Vd zhAMTfcP350Q%Cx$_0>G;f~pBW-f8O!Zlo-x`Bxi8*hYVwT7*r%UEB&v2;Ea(gH4Aw zf<(|to27ja?$boF)<HmN>k<!Y_W;}iUy6W}^2@v!XfGBFdO4x;mnFJgGtplHV$k2+ z(eYcgMePwzjl@7=5V(z9$M<3Z1xO$EEYgC0)DL;#aeA^-WGRfMT~fTngzzrRdN|8< zRr^yJtA|w*Rq-8~TLQl|3-d?b=zAuj=1=G2>vSJsL5J1b9>KG{znt9P4jmjV*FfY= z#w|*vOJ^vh-7(G0N%fAXS(S}`j0){th)AcnNy&4^_jm^1>wAc5Ql!edXry*!8@Ro- zUl*ME2UnTdG5Zbk(His@56s;@qRmkF`r$85BEUtJI+tF$#FxO)r#B^FqstN3RCeo- z%9J!~_ojwUgjU76tAGBsOv1B--$ArieH*Eb!e++E02qytz3OH>-^%31Be9%QXKc%q zmfI*79p!SQLZ4^*nii-N5c_JbWd#`kY79aT(jM@l-FIGfMtUXpQ{Idh`6Pv;`a8z! zDli!#=1xx54z!L|Y!Q|g#N)%cAR@wk$(MvZaiE~0P63iHx8P+lzv9rB7F)WbbKoAI z`q@lZ{05|&?qNnNgdb}3uxi9l!j4hx@7Xs&oT@P0h>ruJungPoU(lP7*FU(hfvtM7 zXvoQp4j)O!x^CxOFs`4g!ip`;H+vQnPhxv_K}W4h7}4^usX6dH2dazN2UZTaY0z|i znV*So+d9cuI0O*cS;=P}X|%8;0_vyyA03cu(?Ls0K0s%3opA-oKyPlaqRFs*3!@95 zO>N7bDoghu8}uvM2hX;8ClFtqDh~t8(Ve?}Uvxo?_b!A}zGh^x#~httfIHfAJ|r)@ z5(Pt=vHwBZ&^xGu3E@AulA@Z@>j;ls&K55nH>Mf5^72`HT23BtH@#bMxC}m>axZB8 zn;hq#i~r(B0Ct0&%s2q8O4(L3%c8zH_EyRwIQ7{NC`}2OANsdwTUGmhHE&2>wK;Mq zp1<({Y6VJ4S8-?C3_sN-JfJAts&S?YnGqZaj(av0rD2;|H4@h|8yjJAM9{yJ_B#fI z0N?s-W0$dW0zG6gBLxHrPAhL%O4FJ7jjo*-w{wtE0s6`8$dFnz+$?Y#%}1{-{9{Zk zQqXGNb{fCDyc<nIwNQxZ`s?EKN2d~l+jN{_Nz`x4m80Fl<*L&uy$`k?{`$IdDq9Dy z<fqZzo<8#|m|1d#E~8FW+2_rsYOsVZI1nECC^h;xPkQvmZ5hkz>oLclThTxJ3(h}g z8L%_ZKI{kvfnA2;L;gfNnv-b-Fv~Y}&8EV6?D^D^C>GYbPIUZ>UP135z?3DA-!d2) z{N-1t`a7Zdw!{$XcbQkco!Uk8v)2fwsy+5q=0#t#k#0M;&m?wlZHcyLJq}gPnxB;} z^J(i+$&?>l%eHsv^;|ay4jjTo_#ylZ(Ze5&&Fv>PK9alq2bti}^t_Q3{0S6q1x?T( zX^ql9or6LufGSdy$o4!9V==L!L!K2b;H0S~MYX$Dv0r}zd?+O^sTMUF-&LAwOTEhZ zbmVjNGXdA$yXi!6#LK_>9!Y+wM7TMiWJfk9-8gfIsG-iAm8fk_Q~osRR<-n?Rk(Xu zrs+QX=hY^?*p#PJ!A^A-gerYRk4MMm%(IPcp+}A0J8!cU27>)SC(zO+j4eC4TLIz9 zxxfd4U|Y1S;K9mU@(YF<(d+I*;U4feeQCMCk)P1oA}4YTT5}@`rgfthn)eWRi$`Sb zrrL&b_kr!6>p{wC^_@<M-7;Pqt23m|I^EKuKN`&TOnGgqH7}la94b>#RFQQT^f3^6 zNX-n^LnLy;;}H!4l92BnJXfuybIp+IrTT+H3Fc%$-|~tPWxP^o%Hn6R{4s_BwWFcd zOhZ-xP)fT!aL4ooM-(yRPD|Sv%zBVwpLn<HrPj!^aa|RX75!}1lkhI}{G=F|O>-8e zFdY2~3M;0xrpOF6d=w<kHn<5(i=EpKHL$I+G-!?Nf<-1&;%`+pXDgcddY#~vKY~Zg zGae1nmbF*{&O>pwRlnaLYu>G@B-_d_)U7V(UUn^6h1dq-$PqhRv{*(4JJ;w6OQe<l zD6@=(03b_Oc_=MOMp9cYX`LVv`Jz$!=M9|_>Cez0N~@ZS7}T_MGfJqW<YeMLu75GU zn%z9+WZY6{F?k551c@PdbSd3RBl{H;WyklS)g=CWN`tu8x{8rBKc>dukaj;;qFUSU zev-YtgQ=)f=?4R+j4G?defSGWb<B`v^)oMVA^Ds~qLr;fdX@JwaVE8LWmWbhM?cO0 z&Y-@a9QSw<KdcmzX%}bY%dQ|UedU{-rv`A^s35<CD)NH!Ga|*VwSCgAXAYNzG639i z?K;L7s!F34Y4ZKuA`K-G-V5Eo(66TFpHElS{Gar>(~al~N>Ca4ig(yIPdyBT6ns`Z z%hPgM(Q--CNwn4@s^MN$T)&mNg>{wZx<l1e?YbI*=?qDU?7pB?@#u@WK2FK+#z~*- z;gcXGrd@`Ef@6kRkV#hg)VfXc3R+3JX?@#=PG(#K@`x9W41kb%t8QXLj8kv7;-^}& z1I;Jx;7+a7oVzPYeAsnv_-W351z3r=J6U}&5@8-0U`4<=4@UkmBR#bsJuoXG=^do? z{;ekAoTY6)CHS)a+g9;Cj0P_GADp&`0;q*qqm=#F!3Nt<V`QEz-SP+2G$&Y!XR9s1 z%=|{Kte=p*FZIThejs5QABhXwJ>Tn~I6A(PwcrDO^eLA1y9^ePUEgkx3E)7E##l4t z<l-&Be^C0^z|D@M0vZR{i`lTgQemu|{2BMB(kE5#K;^<<`dD8bpliX126E{VgJk|g z2!<>cwqrWT(WX14?H(|%LV9?;J)@~z&%ly;dqZR70lwAW)p>W3=UIMPUhj)P9<Ij6 zlsF$?sL%%0;k`K|EYlvByYwbcJY30PP;n9;N17lFgsxVXj_FO<<|-vS`8sRi4)kEc z4Q^6=Jh2H5xuc?Y!C=)#ks67Uys0prit|ef)t2Zm`LK=q0|onE_r|3R;sx{)7IwB< zl699R(hqy#VK~|8OE-Z1yy&|KX`oFtr4?raPJJ%NUClA#1Jjh+{(-cMToy97S4NaY zW8=cviM>H04d}}a)q~0(H99+fvf$3{L@GU4Ps%pW7FOm>WP~_WT0x7lS5>cMFAG%~ z9sLFDU+s5JfSgb6@x1Yg^q{*z>{GU{xvj&7-70F_Qr0hRamG?vK0*w|6C}M(|L~1( zDN-`T<P7Tg|3>o0Cfc%zOY;FaRj#__?67C8L9CNQ>9K>YLHR%<zldl!dTWo<cqy=> zvHjS;^e7;rrG007XYc(YY-~C6lk~eiy_M7pZi_)<b-64a#@=21|6c9C<M#jC3~2)$ zXg$cgU%ck)xUg<sf3^-9Wpmz!M(hI5tmyT#zCZxvJKxp`hj@cLZ-h<6>r3*z8vTtL zuLcI3#Zz6{<8=2wb(suN#@0Le8PO#*^)Z~}S0?9bX6KV;7nH;u4zX@)pO@XR0Yrtq ze0L(bBBfxv%Xa?iI^hlx`f>_Q^uz>q{u~pW{`0criOmR^NSQSp81}|f8ZrO<um7iy z@c*VKMe7V9pl%estil2%tLZ-7r-M0Bhr94TxEW}YGlbsGeD{NEbJ>W~*s=v#hlvnZ zaNr-lV0eFU5sveZLH^R22VgW?#aV<m;CIOMqa}C`HXYvsyV&^)k!OO`eo>mY`-;Da z%LBT64>l2{I*lY=1~T8Z559QhKZ16j3Uahavx-zT9-FNZ=eeW06ng-<099U6`*rDV z?9I`7NbMS;CBM@$@{x0w=+sGbXdXp@%$G2Dk7Rr+{(?Pw&c86X#N00A<)IsYkDF%U z(`o1YM`A(K!P$$N^Y)03G1@S%yocZHx|H+^!kko<o~C8l=Bloa$jhP5BO}<=pvx#^ zE`&344>+RZ2Z;iO)}C_3ctna@9uQ%c>3<D-ht`Gp(y3jxa3|F<y4cXHrR19s^LI>> z4(IT1S{?7xeto<5A#P`#ceJYPcyB2SIJj$7QrAb4ssyM1Cb-z7(;J?!byYrSq?TMs zaLT1T^^39!Bh>k8$5cAzYWtQ=zbrOWIDomrmKL6ku>?<ftjlo3Ca4f_V1?kMboLJ} zF7@=#&uG~b6GH%f3#1R(tWLv^6!V{)s5Z6)R3mj$V0#vz6Uy6W0Wi)1v7kC2l!4~( z6f++qBiSjPrc8cdY>Ak9c$Lq366#C8?La?@UCt5wWF)g8#fPQHuC^p}T4lJ7Df{N? z%+)sG8*{oHrW&J~`WWMbA%DNerUDW@`FvuOR`QwR2ZR}d^_lGPcV6N_{5jJDDsxx* zJzau5rmx^kUZ?J!H?T>aNXf`uUzDJ6ocjb@Q~2^cDUSC@OO*INL*`vs^R25Qj%fvM z8@)w4%Kh!W+Wy#5tU#v(EtYd3k$K*IBTBA83E*KQ0Ks?!rl&+EK8Z-fBzrz?vOK$W z@A>otR~wMVskJ)Ja(b0C>1I@11EAK7&2ZkVb>)FIjtG50+3|HZku;lqS4a2aK?3B$ zt_A;vkOD`1YR_c&jiwz$WmYhMN2+yZ4^^Ed*7ufRTW~V%kW#E-EJB<4XZOO}l<cmL zCQ`@)rFmn6@Qi17esJldQ(!!-Aet%FCmqF)yfZHQ2^mV;?Q6%zcUt0xTg$}Lb3;C9 zF*551S_-_kZ>iokoAkULQ0bfdEGoWAyXm7E`CGS5;e*i5hEs*!Q#mrH@+gFdZ>Aj6 zCMvSB{>Vg)*65B{)hOz<JIEM>G%m}WkWQtM9^HrPz|Pw^kRE>PZ4#?}ThLY3{c&mc z!r#xH7I~k)PW{ZuEYbME6-VTV>h_~)b!dt#_=?F96LAB7gBHHz9T;#IMggIPcwG=I zI5)%k75gP`8hjsTjw!;BX8gvP;7l?hU(_R3osL_cpI}dp<2avAS|(xB+pwALw(V~G zA#5j)?X%@UK7u(ipd9i%YHKz$+B!6kV@hK39Tp@`voTZX7GLl^k|m@s=*N(N9X9?u z8`H4H=$=?uSz9{_L|+DxvFD(gOwawB0J{!kvwmM-=)Z?vQf3Cjem<!?|ATAa`g`-t zjCHu{nB574qus*32l8J3GO}djSm2wgzDen`-y*e{PUo+}C<3&WRJ3o51eNye&dAzZ z@QaQ9MU_r|HtT&`?iFZRY}wH(27#otlA&pbMW9W)|HB*5t4S0?#h4(WSV}>gQSM6V zVZnh0VPK|7$!M-DaOS#Tc9!?|l|vwK>gfW^^?E&Ov0GZ6@MjZQ6&B!_bN>5|XtY^P zfGGKQ%)!s#R{{OVhKyidMCLDWKJ>vb_wiBP5<~#KvP4g0WA^{WSv`(Ug{=_Az>Y`X zlpkCZ)vQGDV>0L-%kFE)U;s~#X1IVj#4nph+Vqi8LJhFKG?)yv&~ET6NY5{Q+eAl` zK0|NJ^W=_)F)f0G5vZR8TVM}T2CQ$sYnj-71)qUFp^ZV_?{$_YBZ46K=kErxFJ20b zCn-iNIrv9^fs(S@^pvLLRpfqky2rqrE|u~fHT?>t^Z<7|&ipxApQ>^L@V<a}(wlbu z_?kgVL4wlU9@EV1bLIEaQQC&FzUA=B7@$|k5GK;_>0#LU#CJNnPDVoX?RHqKk+#dg zqY@Y|Fg`G(YS=5K;xJs3lSb{58&&1LH<!bBRw6f{b?jkw$R`qSU3+3kUr@g<zQC7f zrQWwB<Q8ZlKP>j}sU2Y_7-7Mz4S$pEqhhSJfQM?kB!x`$G%V2YNnWmec8Th?$u$WM z>SAHVnN^8dMOB{yhYN7$KTIX|E7}xgG%C1_f=HfM;lKFNzTeSnnFvFSHBc?TOP=^s zJ)JGg$+S9_z9|2L>-G~b5BN5S%KkND5#EMUN55~81D#a1O*y4?Tj=ifNi@xE89c$R z{NPH62TWjIub7X2aP@*`+XX)vDh7D;l0L}chXLkeX)NasCW56V18xX$agUcR7qq#; zWy%XLQYT$!J|e_fU|R3gfIj^2)O8U3gjo55tD5`;?RtWre1rZD;)yvmhiLyDbOJlK zaeWRsm_i|*;Mv*f95VQ^?gsWhYz$+N5!Awvc6`Nx)N=M`qpi@f3+ro4w?WEi6$k<L z1ZsbU*nT=3(d1kxt^U?NijBniiyKvWGhO|}J*se<I^!;W;(<8NNXhA3hRAfLg@2?^ z=*65PoxS0U^bZ2{PCJwS2${qxt1j^pA)7jrYGs=$6E|6_8l}e7G0<1@O>nXPM3I+* z6{JMN+$Pw6kqx>yu4PedvjC-H^U&0d$+&twtD>dJS9<2E=9;M)S$`DxmQ6Ue9S~U( zt2n<oZkAyB53c{2X&kw2JfmeDOBN0*_BWZ@t_}O@bZ08;t2N2dB_W@%arCk$(zC+% z=&7Y|w0HRF2%Q=A4;SgCzZyVB*uPYb_aTC;x-K+seX1$))~=Yw=}qEX(#-GYk5`$O z$tqYCQDha&d3*2q*#sE*A~=fnc&9i|NANbY@1oA)46;`67yd3%HrI?>9uYIK@w3T5 z*7y~+!ydwxD7%0D;F9PzL@Kij!^qFk=Q!6{pr<vAerix;ZU;lcoJGVAI7QveUQg7@ zQ&l@OMDu-t4|@fLLv3%LKH`xK8N!IGKbS{LpFr1-<!%?yW!<)PhwBRvsb|j$%I7WL z0Q9Dd)P=nDY_p@XCRarpS6<Jjy3hFy!MQ1pKDpj`3yaR_hUfo^cT*GBT21M*B@L97 zItJRrR#I`-3j*X{FV47;hrHKW;5p9NoY+yT+XeAK;+)^;z`&ya@ceMya~S{5PK~On zS7fbPpqeag)AXY7r-8j;<?P>$HT2WY`k&NdU%2tu-oszIK_QHmm7cpLw&=F1Z*F$$ zhQ;Oi%qWE_j}zw(3q~v5n%CT1eQYn%+|oon-77vMtFYcoDL0@w!@}{v^sw*;*V&mO zPR|dnE7ojxYYh6(fhDlqvd4Pkf2_N4eRnW2h@J6;kL|J!pRxWhO#8tl0$aiLqQB&V zr4T|}(s2a1sFYze$2uU;dQOA`o&X#vWpGtRbFQR`a4w?(I}#&Dnit(bq+F!U%z-Tp zf<`<+fH9{}8@|KW2!8L_pC&CSxgti0x(SvxiXSYluwa}wb(e_EMpdp`<az1MF$T8r z<hy+47Tg`}!YCQc%$*M*dVdH|8LOx89g47Bhlow+DcBC5m)#a@PI?xUEI8>8ga;jB z$f40j7SWcG`T;o1NKkS&Sn+(`4h+8Y_;sA43;1&`+@#jUGoD#e`GkGRLSdjQy(>+q z97`brB}Oe&Ww=OBFy-5m1L?PD|888x>)&uO80K&I*!LRv4QDIOUKL>&pOZ`<5F9rm zZ{tbJ)+p#yzkQ?luJw0RT>>Gt7<#)z2K$AnWI0p^YcO|Ps6S!xqE3^j1Z&lrUVHWW z-1=8g-n%6wN_I6&qK~<~q+grE8Uy)v2Ub_Lcn2~E*7)ie4*RkIk@*lPv>NJ_SR(d* z2z;owFX?*%qO>v3KAG#O_k%}cOJW$?{LAHDw6O1hP0EXTdQcfwh}j0?_N??HGp7As zpFn&QhZW3fa}k}!=C+?hC`x5rv(hC%NAbp=?-j<-z`cQr?uE%WS-2qZEW8)(61V-m z2p#!@%a3>t+>?yDp&pMpKeKB(EohKF@mx~jR>zKE59cP(gGX4{(iTgpyfEtw|H6?= z^8+ZUPK&CqAlloMY2T7PKCnFUcJCizel3ifa@XgD*hOV8z=E&Db7SpBnnB)2q5>fW zpM*~&*eLXNzR7#BH&MA(PB2#-)geTjtKj%#I8lq5wbh-4B!{xpgHwH8^e*{$2$h<L zG<rEus*Eef^38t3eXLP#Eyc038X;d2mpCsgkiW2BA}wiwB&(^zfZGE{i>HAIx}7z> zX7Z%)i?53Zp>7aIOo18`{wHDZ?zn2*qvrcHpuxOv)}5aD!eqK+P?00PDEOI#KEXCk z2_fpWFIiiDLA|Wfp~~XYX0@DDQH?Fm*DkdPw`*zK*tHPaUSx_X3O?SE><x{RNk~@~ zd0ui=LDA}I*=CGKs;h0*f_>M{AKBx6un|+1WIj^`-K$JDr3CFnP`V6<KXc?a=qxqh zW$<awhbe<4SKj38_O#<xIzo<0WNCLr3bY>Ryx&1d-_CZ-%jIO9=mx{5Lpmqog0+L3 zlq>h|HmfdL|CCZunvS#dfW9Fu<E$Fn+txIEYh5i4$>;Wo0kH!s4tVBA$wl3Bg;SKO z4=TU^+OBjzQ5<73-yh`tm}87E<eVokgSLnb9>w5Plc1O;1+ji^Z+CnAZ1HL|11Jss zXYR#XEY&BGb<K;LvAP@kYqykfa|2FmuJ9Zj-ZCLUy4>B3tzCv%EG0{t*~Pv+t`!$O zvdHCEG5vLD*~8kcfj_k<`<&NR!?t@B%f_K9&`P#1+l|?2D*AL)Wij%syo9-EiIq!z z)rUh_M<;7;$Ib%0<n8p@BKAm3VL>%JpZOD5oPe>L(M$h$=&|uEecGwPsP#T{D)wjG zXO=xOnt(K~pX$6#V9B~mki^Sh{p0tU_1n~|7*tOk(%9=YU@Lvef3Ay@AAG5n?%VE; z+cb{x2Yzs+v4q}<s)_c|&z?<i&-AJ67T6T5pB*QSk90N56{!oBz|Frzm5lM(HY-wZ z91x~bUKg9!m#<o(xv9E*Pn)IXstP=PDL2G22)8#s^$ZEVN@rxh5`Tkm2>`QCMf=(< zJG>a)>QHX^yTz_Gpl>wR3t<YfZcJ)F1~XEMS|j^4Qa6CYldzXip3~BOn$9Ybdw%x1 zH9PlaS5Bc?S%vsnV$-LOz)RIMr1a<Jay6)b{scIytdKX8N;DLkEQd;9kdsCnBc|Hh zAh~$K`-8#svrr?iUVSGw<J5Rvh^I<rLv45ea#Al-_#_l0xkwl}+c&41!@*>}hc6wy zlnbk$J!}TRwwS6TDt_V^<v{0vmB|mEsTewFv3c^(5Qe7@eXO#Nb>rq#(&YEKnYXZj zsx%8iPKVKA(WFmk3Rvol@1a9Dm%+lfG53xe6fAb0YhlS1kXbSy86fTIHDW#b&Dl(b z^)`C@P1rJC!p=JduHbaA&Idb#exqSsSI5KYV86^^hi;)avD2KULj&piCu7a1nJuXq z>^#%MnQ0Y>Ms2fGl)$P=Bs({U?Zdu%GB$YweV+lM6eZ+&wg<L}vA_W>2pL6-6Ik*( zQK!X79bi-7fa3ZKD7Q`>(-!b&?9CX7B6RlVJz6I@uy5o>VcZhzf}bugJJGj#B!(_L zhvs`6(ZW~7D^9lYRrPt<1lb1GLZer8=bmyjNf&i)+EAWY|MY1@{cZNSamq>OO>5~C zywJ}2E%jlai^hJz_A%9j+CQ>xmYUtVdm>p&JUiZ38L1j5hD+@;9=|uV>HV~CCYilL zsGzu1*(ztw>B(Mi(=TqbGvfUZ;I5l)K|J&c53&sFbn@DW{V)FZU##)}f#!nltG4^Z zlXV%aRn(#A0Ag!Qh*KNN067iJ-;WMIf8Ft7KH6;=_6B{DP*y`9%A|r0cDJo3ms6jf z8#VCETjz9J*FmDg_NI@dH9<I!OkCTYo_q73R}}pB>v_5}j-L=gzn%}X&RVe}oMLv; zNl|e6Phx|2HNpIB=ELFYZeWSa;__Nd2gmS;_4Q=lQ3{L?-Bv<3#ym<z$F4?F(@|uw z9QL?`({9*Rt=vsk%>~Vujt!ON{*EM05Z}V=($(L|=xro;ff$8RXV=ceu<HVHtOY#? zHoO!PUHwR4KDbqs9;3fC=_R&Y2elcS-v`->0^}Lfh^F|6`PF)M#1u^4`;T!x-IEB0 z{ATcg-f5q!H$H}f)DHQX+^+UW|7c7;V;9&Z??-F}+>a!)Ltl>JZ$_nhLBrRR^_eI% z`*rlmx9^NMwM=9)95i%V*{&}5Z4IP=bNbj;dV^f4%jII}=&hBLy`vUu)u7;gqpv@> zt};1+?0_mhLr{|~ME_vD&L-6-y_0SV3j)!BMr*YD)x~Kca!}4NXfDJm&d$68C2x?w zU<rewOZ-J)B=s>i66@i?*jTOkZsaphTqdGN$Tdx#>*&K#Q=_88P4!gzOo_t!&M}xW zB<*gMcFgs5?Ci~=K%0il`g&jPLbf4O;1FzI1vQrP9_fSNVCL5F;#X)>*WgEH1S?|q zxZ|+78oJAAd%r$W(q*DvVzA#Y$tJ=$pKr3mBBJj*#dNzuKwqc5XO5P??4$AMhbX+H z*PkZA6Bh?zhkG%R(ewD6meylz;18~Uft9+b=BdPD@UiPlf=&z-1Db;#h*E6JI+y~> z6Km6V{V)7~H~BE%#yID}-2DuSUGRhJ0c^HmfXt0j2V|BpNl0rdJYDKKkn0&k8zXuA zJRPRcc-8A2j28;=_l*drVw1WrPTDzP?$HAAS`6BT-JEREN%UZag;vXD*B@Mlh&GBY zKmCY*DKxcIBE$2|mnWILIg|MOhrtK_?FYffIZAeMPum`;6~5kBR#f;fmAbHOV-TF` zWkAdh9y_(RU|r}*2P940P0}RWbFSF*PxbYd608MMs#k?fc|D-%dM~ao92aGM&q;@8 z6KS@5bD{6B&3rqr=(&s(z`G1+xlJ?eg8@$HFYWO3Ct(4a{f=Z>64;&#`Kw8K$3pd# z2i+u-8(WQd$cg6ntzA4W2%8QaWBBLGHMFoTNF`SXpC+DNSuo6Z=ye)cCC?cx)}F=r z<(aXAv<JNiOfZOP^&6dhtF>$tb-Bq{tF2UY2=3DxX(fN{{S7fkwJ;^>4WbJplQb0a z3KEpoNA-HYX@|3!D}FqH{FGK!mc8sN&G(;cHK^s^_7bCiTU^d3;Ho=az;5am=Jdjv zE)nQ;RK{N*48spN9#KqFpgcl}q!<XPVC;p6(@Z$=yq{x)h6{l0_qa5XP%J6VyApAw zwsuBQE2q~`|K&;sWCZH8#2QNn9_CnNIlZI2y*KhSZ{1G4>IE(_?D4&RyCQqq7pMdL z@v4U!e^{2AePMyG2^_5cpVdtYL3jh=d4AfZX|Iw(`oRt|x2%nsxQsAgr^3Q;FYlpJ z|IO;xF<{to1|(}eFJ_$qe<p&B!3`t$9_#Z+cUm9zd>u+*0Z3)pd_qdRmfc3_w9rmR z-TBNH$3ibZYm0tHtNkbZOgF}I&oNr_$&tqskcWR<$Bon(L*69x35*6uS}8vIG%S<o z?2h#I;eH+&TeZV!$$fBa-`!#{%hYvbHQ3o4iLE^4JGbVh3>|llNAiZJr(e>_xrB?{ zW4lwk@Qn;0N)bK}Ccp)ZTwT>n!yw=~C|qXULw<uNp`}=Y?0=y8^xK2dytUz9z<cgw z=}vU2*KSD(Og9-LIz3C>=YWm@6mMe+sesgj_jf$+iB|ryMV!y<N*(klpw1-r6VC-B z!}A}6R>$(^JP1|zgt$A#G$~g~lXMq%L>PQ35jc}l*k@x^BgQnhS%0;CrK0P3Y8$Zp zmoi-r!kg!v{S@)U&9_~2tj4^_Abf-5BJ}Gw+iG@`;b>7?sjnTw%v>oWt~&-C+&0uK z`R(A&XF5+0OakpQb{gqNgY@5TBm%}L1<Z>@0h(~qKfv&B;}q^*mlfUaD?s)#&kWr$ zE+OXZ%HoD!0XDJF^v_Ml6iSDMEBPN<E~v}#S3N7x0=pdY<eB{@+h2t<+P}Qz)H72_ zp8lryaPOn4c6{xz|6m4g<Drnx_WEJIRW9M(v2Y9t;bsEQ2dQO_=f~zBaH?Dd4DzC~ zrFS=4XL`pmZ>w;|!?2LLMr7T*)jjqE0Jc<f|AHbd3erTLLzOF7D(ouxNu)M~kN2_2 z{(V52BG_!_@$E!4r#Mu#tbrBQRAAvN-~6m4vSult`iJi?@hP$>iM*JrtusQH0V-jw zNQD5lDHhP|2G%zHgsQB{>?cF?jm=EV%oNS!qjlSk2b6nDuGJ;=Ii~B%+SGV7-6uE= zDk@A86wAinH5P!>f4KiQ5csDHaBqX9f#0!=CJ@>bSlTT|f9v9Vf03=h8-ng@p%1co z5q3Ygcp5OAU=%Spk#)-o49@@A&II8abx?((7j+v<3Ba^qshZeO#}edQ+U+GK63;@# z=v5?_nZLSa$Cgz+wx~ggNZ!{Q5#ny$!czyow@lz^b$w{@uNG*=Fd*3<?&BM%I_)H4 zVtfaCNIZvBp-S`Z7fsw4Rd3T#O4n7ruVgc<F1k78<?yg#X076_bKoVV!Ze*aF>|*O z4`HMAzw{v56eLPl2-D|%NT5DV;X4yol~go2<rfZ-b>%ftQoG@AW=6K~N3e&PSJ6Fa zv=?@EpWzIg2dQCLUbJtTbw8E|C5mwELH#lbg)EWdTe_t>r?e~$3|%|Y#CIKlk=L6M z2GQ^1=08N2`Oa9yi3NDd^Ux*XOE3{Sx1i7LBA*7O{l43TX1~{CyS`=3I}fj!cbV!9 zH2VHAMHqN(HGZ$gR@dbwrf95FbFAU+y5`5HK<8`0;MO4^`CbiNymCNDZYA6J;?+BZ z>xVW)xxP1@Sxqc`V1^2U*+hv>b@~LQq*Nyje0d5u;k$}>xM}mQwQ<UYqs(h{?h#KY z-p_GFExX3I{8=+`BCzg>x5oT}UeM;nLB*bRF**5PKN2dx+ztF`DcHu{%RuQ8PF}&d z7pISNjJF82BZ%5NW?jkMZtdi~h=RMS_V?J6s5i!VU6hZ#FFEPmbSZ)pt)6vWFI6ZT z2k}4pZO$cba5+9hq5w@QG4=<Sn9*s}WG+V<$X;se)Lu>#xJ$$I8Zwog50ynn7P_UT zAt=p_nV`^Do3FI_c>Tw}%{_Y+fcC`uZFzb{Ub!u@m+rhI|3d##Xxzx&lcNMhs>Xs} z-;%$5|Jvlb!g%4z{p1@TDt|NSQl9Ah<WM=0C2xy?{&S22a`;GUio=>0L|JFOGfip* zE?0SOS~VMJWW;q%Ir8^_a1h_KCT;zGP&8&lp?Pc&23*Im1eF>8+DxL54}l{p@kN33 z08AW!3@%Deupmp3ED=i3=@DvT<2ckNoZ##yrTqDDEJ<8Av(#<T*D`QM$HnwTr|H%5 z*Ap)N;o*KDX>eOgg(e(B6}I`C5^{2E!XuGO^?UesSS)#<8glcAisER=l_tshCcn4w z4zgm?q)#FEVR=!@R?}TQa)PFn;ydrg8%;MvqX3ujnime6R3Rz9EPGjTO%UC(^|fMT zZA`4i7pB77q!)vLq*w-6jd*R%bOCXI^R$Qw*nvml%2`zYSt3{|OA1=XoQTu#91$OB z7L|=!-iHHmMW#Qvew&r&2zr5Kvp5)4j_->_OD}qEk_`nf01}+Zb&}Zk0;Vhrv?Th| zOgxO%p$F>6Tw!%DfmyRzANt^G2AX051AD`)*XJ4H;K=>Ol3?c(mtK=aesKBMNg@2H zkLqai)HCaY5@{m8)6&x@{y(@RT}|nl1HROor~RTHy<LX!eN(@QOFnja(?pkDpZ$)> zeH4Dqdd}&Hqq}r>ISFYvq-T06Y1sFXGg3oux+bM2IpKn}N)J>U?c<n!sVh=(WZ!0u zG(ZQA-7ynDO2XUY!3#?oD%x&Wp&r8eA;sqVHIjxW<<hebE7=ADRl8>LJmV>T-_7~V z(7(a{cbA(7yMO#pC8q%}+#cJVNw;1(U-u41bp@6=37v`{7%@BegG(=W^+-Ao-FKY| zJGt}$Mk|&6!SzvIeK`owmtaWJA+b<*$~<2@y6K7299S08W(yCw5>FworB55yIGJ_S zw`8nRfDPz}z>Lu}P2(V~D$$28@60>2zk!>2Xp_8d<Rz_js!(nV-D+IE_$+X3*}Pg_ zR!AjTJ;YDdWUuLHb<x$6r9f4>pDg5^_QB295oc?zO`i#lTb9eF>2z3FY{Z;k3(>SY zL_kGkdxCk2Gh(C$Xwy@Aq$ODv)HL+6Q&P9gESaT6oB1=m7&N7Ip*fL=mt0)jz5;k^ zP^|XpsSIYXL25&faPH05b7K$bWD6BAh~;3Y<hV}L!A^^~(U8<YvxMGHAD*^_ZLHld ziV^?bB^l`XqG(xC%{irfL+{~6#gK!HuEL0cpL**0VNvkA*%pCE2kOAZe?_n=-RW2E z^-uOqRBYPyJ**tEv448Fw6yG@sH@QJE&DzrC3h3f`n`vF9{pLKU4y2@0frmc6Ugno zQ?R?S@ZA5GLx)bJpVz~1V(YD03g9E!Kfi*NCN5E7U#h5e?=Wd-9+n}E#3*f;;mEMA z1DGY%OZ(0=r{3roshRuq#MmY*pKq=~%}DORjyZ!@hiAv+JfysFV)y&&W@nGZp|yK| z!)pF!OCyGr$3PWo{(M^BH}BbIcTC*{y@hE9yeW5T=?j9mO^Jp16@r3YMmgT#X^5}+ zQ>U!x`Z1o?*faUwz)<VQ68krK+j4Sco^bJXr7(5D&CwgSJtk^_H~f@rQ(c?poP2nh z;9LS_mzGM%^%2{jY0(VSCzK#(%1N2F-ZO3Rtc5TOa8ph{I{`Z@g67<P1{QyPVL_i( z{!6%vI%0Z%>X&o`iy7@&p<4K>(EQha&N=!IF5zIcpgz&mnRx2H<R6<hI4CM`HL+*H zJe}v#&dZR+ge%43mi>D}_p%z-d`zM#V}d@B-7u}Hv=5p6R9S<kIWm%8mG~QP92CFN z=~B9kKRb~<7kGjlb{ZT@U6f(}gVJW%1M}48pq(FF$wr2B`83Es`>CHdKGbZ6e*N-o zy8gz3N|*(A)91!-92?%Wv_`*I_s(!$y$|Ws<y&cUG>e0`4$<_U2+9V+{kIiOG;3si z{IWL*juqc`4KgwtkofKVM;HFD_P#x=scYL8%T}sY*t=Ts5s2N|O|4bLM<GCn)}vHW zqV+)wLbPZR5h4VLBqU2qTUw<-r9zdEXc3}Phz}q@NEVh#L`tGWh!T=W1H=$QAW!mI z-06OtWBc`-bMO7`x%a#K@CW}avgVp|%sI#NH^wNADS38#cqa8-|3wV{z%(dn`ocZu zWvZ%G$(^d0<-{vm=oU`D{yK6WstdRa_s;rp<@-hujd{1e<Q`>9@xkC;+eu4ljyVwZ zy!hPyzTS^Jp=&4Nc6a}|YqNPgRz3_0`q@5gM?dY#G=<3WuaA>o)1Yv>q+e{O&yRX- zA1C-PXur)jCKgH4^Dc4lzT3`JjmW~v^#{r$(smbpm2pke_#SQr``yD|m%sHs310c` zcGS`S8(XW|x4faf`*<*ec}0S*l|0Y40t$VmqTfZ=qenpPif5V7Yq;byf%8({doR}3 zT9)z?>>V+OaD?LfQ{gPaM(&B=ojq?t--NbhhL!DWUq^iXd+nk-eJ2w4_N3x&TmI0P zvZ7EUoG}*1n82N0^Rvmh`^({j*Y=dnZeuJC62F-sj63uB&4~w@huwwmcdNIh)h}$S zZA{;DP13u2P?JB{9NceseE`!oH^?!%>z#Fj?|jshdF!Kz$5o$meer*Kb$wpGVcuK% z<#c0N)%(mw^@FE<^mg=E2EKLrSP3Y(;QYw-=W(CUn>Upw_tF`{u!*3`<XGNkmXLQ- zm+}}6XA8)Y{rdU@_Fs11c(1I#F?ZMDq4$m*tE~!r=YcB!Oa$X%Nl%qJWcPbl&RmJD z*e3C0KCX&dxNUby@LS=TZ}(Ib@YA}3R?Jxke;q1~zS?*Po)wfP*uN!;Q4xD#tC-V$ zXJ+&p&jt(~sO_|?DZ@zUt@0JQX&<I#IDOlITR1(^HCNRdyYimx3(iFA_~MV|e;Ac? z<p{xN*`wJd{KX?yaxc4J{f<|};^1%p+!qg+baGD6+Ne1K>17^t_AU*5V$x%7?CPIH zZ+AR5RfJkh(?5QjpkyxZe_O`96f^jFBZ|e?iT`fwCNh5<d-U}BVz1Zm7nkq3etIuf zdAs24cWxKe>F56<k8P;zgTCcXyv=jXqyEBi%?tj8aq$<)8`|s72>B6n>KdfT;@o$n zbvbq4gthJ>EEwpntH$p>FNt1cJ8cnt*1g_ue=_CRu8%%W?oGW=@JD&L4E-4Ko1k4d zLA~(!$Nr<?*@*?rqo00Uv29oR?$@7Py}qkrN2suMX5_`D%*NrZkIP~&1O&Woq(Azx zdF5yQ$5787mh_~5^!4&j#_xQ7Ftm@ilk;i<=XUvy_xg8;cZhd`nA2P6r|gM<0GDsD zb-Vj4h@l4N;qLH$;^xD((T!?i{;m__>jk@8l&?=DU!RD54x|P2O>PQj(&I1zNORxZ zpsMIMyIflni8<EJ*YAt2ZO)qaXX>FZM<G$}<}v)~27bXE)}K2_-u_oU`#E9S!-{Y2 z4ec4<>8Sbmv%7n&H?MsAOY*9t4apBs7dVuRGr8w8KBt4iIbmW`AE<kBsXyrBz3)b> z>@N%XWW^`_u@NG#{8kBT-OUThRpJ6>PEuf2)l+4Foc$k|E4ldJXfVDy8yXAh;uU=b z@;$?r0rRE+0<ERki=ew3;b(mGZJhp~)6aFx&5l61!rbMV#6`K0UAgNIUKysZ8!K$Z zhW%*0a|FSR!C%+J?G-*m0w;?0@)%KbULRddO8#EOPuNOCoon@MPxpN?=JgpW=11ni z^W!rPem7>x^^c32`=KCwe&E{cUtg*|b?;y~K<2#N`eEuGuJ0<!&26)Gkk(xZguZZL z#K!H;z|NqLez;MIo*CM8eKz*k{;I7Y1LON|m+qb!?W4R_I>e+s?&aUceM|V2d$QBL z_az4)z5AcfWjEz7p7IxWvnL<BB2|Th1!@$9%{exE?8F~}9o3z*eJXBRsrC`Eq8C^1 znH|ASV3mosYYGN#sw;qkPr!yjcX<H5uC^zJi2ONPxo5clwAqc^8*+<YN()_S=5JVh z%j__lM?;gsliterTds20K_}%oO(WA_bjQNB5DPB)$--x2uO5E+TONu+j*P=emtxeI zcSE$%z?UtFR*j{~4$PTAJ`x9st~;_@Bwi;stx6fLcT+P}(PwC@9?lq{MF_BAjEj<m z?FU8M$cT^v(sT0C_#Q-&u`Qi}#Y^jFoCtqqA&Ib;r;}GYGUK$_Cxa8U7Ol1~Q+z@k z<sG^kwwR<Kfi&xhCmmP3wjh0&UUqZs-DiL7xa6pY6BNPH?^RK?)A(pS7ay&zB(-IH zl->n=?OawF$Y`l)Sv>B##Y`;RZPuS+`FMP}U)G)Kuxf>6^BwV*=R9%HC={~aTGrb0 zt&DFC?p!m_XJ#m}r&aC@b0&r}u;Yb4Q%I+O_0nQZ;>i$;!k%;r5Cg?>EqZBLtaK1y z^~Na|Xc;~Ut8riaYF*)7*dU9mQC+$5IcACJ(o3)9h~!eO$l2=koHBmOwYHO%Nx-$H z=r~UWr4!Yor!@Y|M7N<sdPQ@2KyxW=YnD@(z^6wL4$T#(HM-W!2pPfSFGu`TAF)>~ zh?w+fa`B$m)hmAZ&g&8-P0b~?8pFq8mLcm%H8y*k87fg6pDV^G{X!2NO4rFb#~j%| za+3!^bl-ZWV;lrtWG|{c#^ZhtS4)q(KpT+b6wA`;h%60wYAwV0xfNIA$%GR*V7i>` z1q>`TQ_qfmvR5Atqmf5B^swH$Sqk80kl{@}A?7~ZdOd>j7kr?@m*u!8J=`3;2qGu@ z#><rc>ByK?x^!t_f+8$QTK@(W9|(+`+5`f_dJ}vAvPeNgLu{~5Cl$)~;(iz^)g(Yb zjwMUSRf^utV3PSvs5vzA{(ZHK7yZ<%{~|%!0W1T(Z;4v)1NeZ-o%y1nV&RTf6X;NJ zSNE7vYnQQAAmoziBHOahfm!xz&<5|aHETk^)u^Y19gL|px*+Ff(A6<z`V<xZ*{Bed zD}A`yB|?{6i6}2NbQ3~NP7wZ$W;2k{E;0eP(-eoMT2SChj5$z@H$XHdX3}Gn7GL68 z{p)+Qe!mXxCz=2s8>F7hsV)>a7~lX+(7YpOHOe?D8==@ezg}Kf<YD??G|1A14Nbb@ zn9a(sjySByGU|*xU6b&u=_W=Pl#e!~Pt4UK!$ZQRKz4tfMLMGFbnUZkFnwSa$&4Dt zMX$>PdE%qoe`8CzqfBa6TZo=L@an>61F!7;6@MXL5;pj2aM7idx$OP{hG6f%a`sog zp0UOobhQ!*kDt&pPGEzgUgn*zjEbZ>skA}M9A_4zGC7b=!vO`7bT?<Xpm&oNs2{t- z4kYEZyjil|5=R#_5jmTMB}b-2&wr8V@to{-g_{5eMQJc<t`{@0W}1d|0l7wy5T!8i zg7q?Aw3Wp-4%h3H#wX#*?{FHw$Xv51H@)i&;?I_`)qHPSNk=?a=@P`VOUTrpemmH= ze;+Cz*D)>~rBpZBn(KXnD}C&uT`Fvl3YGc&q(?r-qL~<NWgj-mQfzQwOwyo2IUcTp zL>Tc2-CfNB-N_tHg|A6&HmK-VBt}=JlU0=_Fs#h$)aD`SkI9nlWRc(7aKF}_gM{7G zJk71^1rn_Lshv!2#s{m$#UxhfSWa8$GyfdzW|!3+W>Z}wxnREt%?&x1+Ht@{0kIWk zmY+%LH!j*1I6;9DAjSyBN?4f<Q;n8vdc49gx6|e#F*S^4|8z!!7mKnB!otyR+c3aa z{GTV#T(O5wDNl3iv3H}kFwN)a?@wvI`wI1S>bNRmLNcb7;*@QBV3vwQcUrum5;dpK z5|?GjIkviQZUMT3kr$qYX$xvgzk7daI@Bt4m|Wz8lH2x_I;X0n>W*>LaDvyVYq#jm zlSb3q+d|b54X+fPk0n@~HbXbf`tpFmo#6+NNOmiu!Me=b`)EAABU<H%B0kWjaCd67 za{Q_$?c(7P{RE#k&lKkr0R{lMPu!heYHmg82nj$cSLzZj*}ZT@&K}i-r;N_+6#Qhu zPI`#O)HPv6s_?|2{kk!8%rN3DsO6EN?3_V&iesfa)70?gF0iXic57vNVe=EcG}Zr6 zie1G)JnCiKzQ7~qZV<|;)2a-2=8F9}V*xr*uCt%vvwcxQmx^pg&_7OkytnF8vyGqN zpr;t=H>}`iLN^V1H}me|hLEL8PDS-%fxZ~{V=raZsBFFfMo&NzLxVKbQ7DmzL-XlX z%;Th%@-q3LJ9w1Kue4<!p#aA|VS+}@@AY*mT_iT>Q?a0JgBR*tR4<eR4O|ZBjgfJ0 zNw$x-W3<ERcf$wq$?m}ks1+oQZ{z~JNGuX)@Tm>l&rS$4`_aZ99`Mu^UZ4^T^jGNh z2wWq)K{y=I1xT~1IU5sz4Kiv_$0Lp=NS%^#q`A)W{70R=q)a*KQCuzORMeo8{qE>2 z5^0FGAZekFRZGPia3TkUi@uWO>KKCt>pKkOy3d^-*bojwVcdd^4ta)pq{lS_&w#Fj zkWjD+zL+yy=i<>5iuu0!r79VBzk98gx3G<(Sy&F%gW#lgN7ifHAp!_Rt*j?d1wRDz zM#7fxY{U7W;dGJ5P+_uL12nsYScmx__@-npcaU#1*FAxg{W-D%5?dloTU+3;l=lV> zL4{`I#c%#GuRQQUqfV4~o+L%DN*8$!{q2jgVxeF`JhaBdR~ftcndZ7y{fc24^~F#N z#A|gug-76vFXr`y%oGTa^2PE%fwIS^mVv>Q@Y1#haQ33oSsOWjU!+6WpOs|@P{o7k z#~HO1HG#dpHF&O{Nsjw+^{XP`7Af#!QOD2{hf_#kzsLB!-7~a05WzGRf_50($I!_H z0zJ&yMjMwd^{Pxa!eDnnJ(-iV3L3?UGD}cJEEWefSG>o{Rub}EILp8y8^X8f6z+cO z1&d7$A4^jCtyxV;LN5nXgpE7FSx9ub*NSr09*2@p{*AkPwF2OcL+c#IIUu$j@34#_ z<MfBH(q@p<)5aOAr)ked?Ec4D^Sy<D!bigNlWW#8eD+`0XM&?K;bU><%m9PbxG6U1 z1bl>GpxQL@hzZdG5A*$he0Q$?wI`Dvxb5Srkd}oDMP4;~tW8A7<>f${^T3Uj(FIhv znNS;O6F5zJc5Y&U2j!5@w=Y&@e|x6&ixG%jdBVUvFuOpVCwqq)9}FX&ZU`K4NCzhf zRLU^PZr3JRSd*r3Be);Oecq=$(xX9G{5<f~Bm5&R;TDS*GJRtFu?97};Muc**?Xy5 zifAR4M>LsH$otA*GJRrim8rPgLB@AW$zFdr^vC7Y$Qsq)L>zvzqPL$5YISjO+I%J! zKSXaPi^KXE-ml)nC389)kXJva${DZ@7U&@4DMC2@{Vo|9uE7&GtS!h|lC3>Wf0XN{ zg=VC{HVUEPv5IVpapTZ{3#{-qt?ff!(Kt*DjTh5&8v8x3qvkYdtS~`{9#!u}XCj72 zQ4T})FW>KeTIgTq7TjsknLRyr@0~9c)?4=1r{?q`aqT9dsu1AxElQ=WihBC3aFW9` zk%bYd86n~$RyG!krFW<*PXh#=MsDeKBmP!1;KL13qx42GsYSzRSjt7sWq~d(0vsAv z$VPRQXOtL(z+jWQQ)Pm|o8M;yeThS^u)+q$pP-JX--}t_ZB7|<uL3Zz-v}??Gwj`> zYc`koL|brTh_2_1UGE?p;GG&fJ(MQd%S*5o|9IvLHCy{I+bMdOvBnGa*{l*57RSYj zvQf^!Vm?7&r|@yBMr~()x@;!?gwlj(EijArd$voq1!{O&mC(J3JvgDYVfQJh$~do5 zsh3NA&A|H3zzE&-`{IU0gw;$i%rjF#R!g|4>vyJfcgPGbb;xj-rZP;;_?9qcMgX_+ zdqNr!#_H*|!Ql}XpRWukHB4wQ62BASYQN(?;pXoVD!t5Uc>FS@as;a(aVW#CWlX3m ze1CUgUk^DEjF==!@CgCyl3?Hd9a-v6+>SOe%7v6fVTg9~q=ye)CmC1dM|2F<$PDy^ z8c7FV@Jo&m(4WK{m*t6rWFDsf_XNUC_PAE7CK3zgN>u^c0`HmP4?I($>%nvgvdCN# zy@$#mGK!*uv!7WsjmKOSDvbtq;dBo@p?=0{JU*9QxjG~Ovt&+fyxk3$0m1bD(F-$b zzgq|_k$@0eyPv>g33K4&d$-6hoD1>L&##g-FnYgwfhe7M$p5Jtquu<Uu6$bMepEKf zqUQLQpOQ2Voa?zF?yM&2REVO4EF;TC@^bs=errgl3Xcb|4^RgVq+SVA4Vr|#nK1s| z$^mwV#=TNyHou?4(x_OhvJEJobbb8|P^F>yp^&QWvI=$ODmZ=~(eUQC4mFx1%;1bI z-e_Q*DJ>R!81slIkCXRE>LodIp2q6{0B&|qX{v31n#-ovF*Cs;lCZZw2*57K=u^?E z!3uCu$cC#G-sI=55!dJsdUVI5>OJ3eos$+&m};%a?{>ri3U!Z)PvZ^O3l&bmUj6lL zvG2KGk0Hp4<!N<?=m&B4+GwOg{3v6sR-7Yu?Ho?|UX=<>A0<@94O@tDMUp|GHCrcD zm}F_gvLgi@d8$GKdb?Ry*t(Rf^qfbHtVZ^w67KL;)HjW~3|UJw^tfJ|NzbXYneZED zbNtzb+cVo}UY~5C4D2Dnf#BNY|Jj8YbJ#Q_hCkY@QXl3oIvmlUmvJ<CcHkacolFA1 zx#FFAL=KIGrgUnm&2nXm;vmx+;Negg>KK>*Wa&gn91zl@8q*tIcN}%3B-uaC5&}JP zRn2zi#sve6zWQ|8lf=r9WpmG_pNhJO0I}@L+lP;E!WUrf-HK}I?elhx%+sx&pnojE zv=3N*WGaYu3O(4aG^CTXcVI3QMrSc_uc|_vvnf^=Nwghx$p5<q<ri)GiPQ<Wlst?A zhW=eS@2T+)9rC_A#NO%UXDUeayVaMiX?Xtj5Y5nQHS3g<9@y|ac89=X60)I^BF3%L zIX_W+u8VR0il8>qeeAT|FO6uZ7RJaxTWVe>pG-*3l@5CVF<+2aAI9jj`AtVj1kMCy z8C9j>oF&=GLLpgdFdEZ)g2I2n;{4NP!Y$a4`yophb5IhP*h;+Tk^{yMjmch&Sm%z5 zUqn>y3iF=uKUL_@>N|wqq^d^!>za>iq}(_i@sbMhid<~`$+^jU;yEU*3~EIs1uU`7 zB1O32Ik2xO%^fLu;nZs>R981uR=;JE)Oa~XW3D?aQc=6^3rv&BXm$}z0_86nX%dux zWV^8_`kx{mwhBYN<2Zyd(Zcro*w2^}BS;gL*9eL6#DgX~uE<sUkMZ1+7ZxUCEjuGe z7a8WXs2m3QK8xTXiHqxSz%`|u#m4;JS4Sh$qSHmfAfQ9$NV*tF3ae^xkgHQ2*O+uJ zL7?11+^o1oe@HtXA@CyBtYy7#lH~6C*=f+IT($Kq9y$~ux=IkQ1UP?HO=Pc6O^|3A zissY7C=>YLn?!3zokXKiW-&C7xI;P@chrqr?c8W-ahUyt4dR^FB-ruDwFa0C8M}HZ zeHfVu8i2<_EiOz}M#Mu<p9Ql-{hYo(Q~#Vo>%p+ea;T&j=F(crpkTrvMAq8#!56(` zm-QB~{|PyU(-=0*1<q1&v9zaO43~mF;xCe@x&0kg=d5|Ug7nA#-rNWiuMt)WOX^w2 z2({F+IG<LdIMUBK#7I&>5tAN+6}6TIlKuwGMsTL6k~kH45_13}EZrT6&vnvzG3*y^ z%Q-p(O1_RA6%dKV5?cME<f<KKH0%$(jBcOka)&wT=SdF`wA7~p|Fd#Dw=0TjvsIhq z)fU(5{BPrjnBLG@>9}5sN@}p}F0;9&>lZ!Z+29GfJGZWB-Zt6^pl64ehp(o~Dt+pg z-zaQH(9UBp4j$<$tuM^dQr-F#O~pu!+_!V-m?c6~na)tm2pvFua(#~h0+>jBOdM?N z*-V1F06VD^1jC=!`@hw$`zvE(X6j@`?V@?^a%r|Z)0MaqBu}|Z^zRwc5Nh=@xTAvG z;cLH2)}G2^;85)Ce+*?BkCulSAYGC*i!b0(hYi+CESqaF;R`r;(t{YO|KN7gliB`_ z3-pD2sZO#`v?aGQ1rqJZtwrjE1%4%<#D{H1u0>}Y<bP#Y%^1iYFzZxHjb4AyU|Mbr z8Ol{Vh{oGb`F1OH<_<f=Mxr>K4>~UQziClFF&oSwy7v9fjE~!5p90(UJ#ZmkaoR4} zs{=JPT-pT-G;rab=>r$mnQ`L2gH)I>=g1<P&S)NStQ1<qI$c4A77;!nk4=*K9o?_D zktaP)0wuo4xz`QF0RdM(Z|e)0&!nK3f0B-#l4N+ucWf2H70$36Lyugcd=>_Q5R6}l zLY^mM4c;+!|3msse?9SRIs<gdAV@uzFdYY@z|J^y$N@YI0z?dEn*Od%lJV3Y1xrA3 zDkQr+1GH^I9bmESxa|jyM`vtUe1!kP*;xY*P5UQ*13d{UdMNSGCX0cc@B|l}v1KHc zYnjV7Ngv2*WyDF3G^+`B$6lhbS7@tcd(-M0h~c!*Bv2@ZD8uGppPIOxIVs&$nV|AU za~i6{VTK2q;dukZ0Qic-CgC1Kmo_fVey>a8G8^kvNnlgug67tXbm&sTB}LXgUCNgx zk+c$W&Uce!MGAJPOI9q1<wd2^sBQf}!`vt&s$)EQi;?O;b8{WmyLSHh;KbBbkOaRX z)tUvn`SPDJ|9n$>pL)PZ`41P`su%GlvaA|rk{}|>&Rt2VODpbm*uH7K2ql!bN=klV zmcQF#F=PCk11O*EX#V4~KHK(Bdazjg<Rd!BN#=b=3Y3_lq;WMj6shTaQ{lK~%t0Bj z+!fC})LRml37ff<0-NIKOB)&?%pa!FnTgE8%^}z3rVzE6rmZ?!cT@Ey@`O47m%oge z9dchBLHs3Go+>Yg2^|Dc_I*lfO|Q1D)Tp8r-*E790=~o2#8?`s4an-@pi|r2P>qT< z=~2B^$j=Ew==f37@W78MMTkL6>Kn_^7bKliWp6w}aa(t!WLmmYsBzVNOT(ANSP<H^ zwOb@u;Og3R_Xt0pQte-wqDhnNAW%;uc!%9$NyvU&U=?|R!*vDw6^=#e;_C-1s}P@l zRdyfau$w|KQ|05$rDD=qDtljqAk3^YNXD*25H9He{{E1(-kJMERVtnI@YjrKnb{E& zn6@KtltiY)#Sx+iJaK2_UYfgq4gQ!J>q8(&QHbC2*hvpsPifpJ!jAtsCBcyb#SuR( z>c*{9>bEv~mva-@(sNR6+i~(IXXs6tP61AGty){b`bPEXq(@1VL)71W^vh>i!yBv^ zGxiqSc1y*mZ6r`##cX?E)gzH~CofA^J!(y}K2p>$<oqW)&dBrZX7gSDKK4(j!zCd3 zs8SF!P~F=l+b5@w6CatSTU@+4SM$i((k;M_W4WA~dOF81N4z(q-rzoBQ;}hbKH(7| zK*LdKKkcqJ^%{4aBu5BvCCiXh*|qQ)x!fi_506D73Pr6vBLcDMVU56`sm?nfQ3e#a zl^hvnX%P~#pmSA>!mX$?@Re@ckl_0fp<$&X;!;>0F<-Lxz!R@*i&oMv<20&;8Np0$ zS8r+)$o&=SqT<tP?1gZ-j#i&wh&N=VWZgb^Gs!Twjc(YjW1edVzWmvrGJZAk$24V} znYNC6ROQ3E(elUH88iy??jfYv|MGbAAe3F22BVw0WC=guu;}=8@_wCCm!dm#uXim| zQ()7muy-sWI&lVP1;{V!DWut`E~H!khLKL8A;qb2L@amd5kCoc6T5XNal$&vS!X9? z$<x?lp?|4R)T^3lZi5_>P*sw+8IORyp9DwP^&q(}fplSiH6OS@u{MRl<cz7s7n!66 z^PQve9DUB>4Wl#)3PG<$i+EWW&I4zS9E4X-JzBp?U+-2M40Jg{RU(upJG~No{7w!y z5ZulP!Ja!hBkc!UufqUeXkzqedF*yw^`+F6wTiy|fgGdc8B`O|I4miVq`nuI;Lry0 z345!~f!!8%$}6}j_ME3nT6B-q4>PF#c?*Gl(w8_9v%*lVY)a-%Pz>dap86kFrj@SD z(%q58eOy~FB_IFM0lkZOIn+AV5B6NE^l+V_=Df4c65BZ6jgA^oG{suslCtx&y#>)& zuYg<6gV;7f8}5q?p+ljoyabG$8b^pe<>-$++S{@OJ~peaG%7WiJo~?7svh26=wirI zwQxAn-`)`sqw1)vk|;_P+?wk9yyp(Wr}{40Ur#*zbvTvu9P%&Q;IMosvBQDLW`ZI9 z!l?aBid`qGg13|=l-^vhz+eeSyq0pVqsWT8NyIP%9A`_2uQT*KS~>XCz>R?~$ttRo z9<`HHc@L3@M%U^S2m5C2hiPWuS^H84(=39|dVt|;)1}&vv8n`3N~@oVg4Rut<TBnS z{sN#`dO4h@6RyYhP|a`}|LHY(u~T?(W1<7S9mHu442;XecZ0HsTIAfj+$!yaO7KIO z!c0$7C2uhtptXaY_MeH$#I(F?AnKqvt(`veLD6Yvv2Y)(rIpk4*T!YbG^ZwjiZatp zzlba)v_mB+gm#6lzI=$l1`QW@@q3$k2Tn;2I*dUw-orvrQDfeyQokZuHKvnRjdGJ7 z5F8fdg`|GgH^6$@0u*EFp>e&eZa<+&wa@IP@b$8&qfbNzwELJz8lH&_J(N`cYD*Pf z>aYL{C&+|rQgK~g(s*)eJDE*@xbQ<YYJjr5Wfp<kG43+h1h(bigmSp9wR~Mln&HMd zzDvVy8O36$NnY7+$69V1+yulY?r6u3x6)LDRK%}bd&5I>3pAeG@34w?>CXo3yLz6- za;EYkp{N=~<j*j!GjK;*Q&m>oJ>?1HV~ri<B&q&jJE|dEGRms<fp%xy6MdKxixxEJ zrY~=Axi!Gd1nng=fpzN`NLo-Kv1<oYg<{^M2alSQzs5D`u}-kQX}G#a_7~*|M<z(5 z{X|tmF;egR{($#?qa*zX<IT|&a=<2AS2{G@0RF!tpT8NfnQ;kri$2dpUY6F@`|nEU z<5RQyt!@KPK6Lq-BH*vBYSwDVJDPNgpf!X_x%4uaABdX>u7z#`2QpU&+w(6La*QZ7 zBY%PVTu}iJlUSAw04sZC?Z|wOUkwoX^6OEs&S5|f4kc<``622nZ6O1P)GNgwY2pE5 zr#s6CeQ`2e!u^HTpeaDN7BQdg64&Zf9O7t)1ev3M-QYlgO!zM6I|uZpIOI97nHPq1 zkcu%fB0%fZ#pkm75BRLrO|a82YOk>YO~^b_b*N1%ciw&hkf8nx9|X-NJ%;>0jbPs= zF+x#^j4jb?`UV+U@)ua07(&3rN1i`BkN`R3#9bE#Bc6`ZMGG9+$Ov#NKT|&XuU>Zx z&5^ZKT2OR~g~ed*W8c=qW*MYB+hGkrfmy#MyP<fH26J$Qc#RifzjxnUNp$F;bM2A` zq?*4*5t{6{A6wQHJ<)J>kEB07>El-zfN6XG`tQ;2i?1YJp6vaz(?`-R3q!;ivuX~@ z$7NO82R5T+aGLM{5|8Jhm?ZNsC9kVO9u<tlrQUEUucuh^K$%+Z&+m6gG%}7?{RlmO z8KZGt-E&oq1ZER(!8DJw{<hcBfp?qim(D1=Q^d5~^94F6nq5NB_CEVdI&-d08nWOS zP0g;sgtUjJZTO49B;)lvvIdw1vjRa(h|u%dZJ_7iSaNxlz9G%_oZeve+Yo|sOYbiX zA37E16j+2{3mM!UR@$n^yU8-U)rD>H&LHuZrf0b!g6#exIli&C7j$8ABoC}I(DQYL z8y|a~k|@GY6^W1dz7uVQXmX`HQ&9cXL@Tadrm!G1*e5NI$sE1kM}X~6Jalz_Y;xcZ zz`NiMeM(ob?Hi>VhobmwIwg5b;$wF1zhU^rGHinfiD8_I>Sg!Mh(I8ba)jihSp)}c z(b#glR`qs_)-@qyqd@4lhk=DxvGTYfC=-t@J_!PVzFeBY9w*jnQ$F}_`0`eAqFf4d zVZWv<O<2S4lk7JX$3XXVDk`$i)I^Ex3Z_A9VypbJCLru~urI=O=eU&{JL+#ctJB~z z7nhj7cPSahi~RE*J|kIBqvAc@gmH=u_){-5kFttuzflo1@-gdkOuKmGn|m?~I5SHI z<sZ{}cmy#L!)pbyRK-yjZhU?m<6w}J-tl^eKOvw9{;^@dcU(~XxKbmJU_uT<gWVq} z4AODYWivRkkzsc(cwUHiB?uC1u4)a4PG3!PfUXFteBMTJH2F|kpvnc;z+LEf_D!(+ z(}V<PHrzp-VW6`aSg$KBnqiEBd2PiCrNm`}EA(l+54FS-zxVyHmFr3>dvqzPL2I3M zv9s;h1E6j=aVDh!sIbI4!s0o<T0T&5N-Q$RrrZ0Z<MJAZi+5+3=Szk+SwxqIr?qHC zSsU6l>k^a%K&B=2u#cq2=4v+6)^BWJ<miW~>DoNA?z8AE(>-}9bb^eaJ;NsHq?bjW z271GQ8iNGfkehfGo+X_zdqya$EbdBMWMwEifx<cynM$zdm~|TIWp9&*ghSwP{JevP z*JKYicC3?;ZN2Vnfo;U0bgo9BSSPK+GzKPYM!J^C78HKFe)(G|fzo;vnpNf;^@U^> zl}nVQIwe5|`!$^n(YLg}lMyn{{*pXE&2qBJK2YZ|Kqs2j0bKNo-{t8HrI#lsA<Vlk z(QAQvbU@!hy7W&XRQ~@Jrk<cN=&U)0=TLN`e}ibL=gng=j^ofLB!GpK^Pb4?V^-4~ zl?L}E#gm!n#Y|!iozytFJ-}7KOa553_qlN4G=bYkD_bgCFmNDy&S_7!L#Pn8H9`5j z@6tfYVAtA*DD{GHb+~Pv7fwOvIraQ)Vh4Bg*!^F9b0-SaVYlk7>!mJib1T^{>1UnP zECAWun#Ri*L}!6jslEHi-ITyDHxQvsj;#BZHp~LQyiZPQ5H62+tA^dLA6g8Hq1k4y zkT#zX3AS^Z#73w_oM~NmgjJ7n*LVW|o3tjfCg^_4$l`fkI17zW`v#b^KE%}ugfx+K z8Pm2pr!8mnh&R;aCfelL7s@ONXZp`BRy{<@GO+24EnWwnTn2Sxs`T=a6wU-S=Szc$ z-HM$i4$2d+m5?@&+%ix|RbKmp;f9$o`=k=dH|x&n3NluQ&A2yB;wGf2660~L@}Gkt zCbICkcY1+;I*WSAlRXN@xvh$dBwEb(6NhF1jheH+aDU>tQ%~M|+Z!5oW;+*Y5r5@D zV0(;7HjoMqm<mjN4*|8Z94bS-enr@@z_)c-pU-}Opt0#hH9->3ddjtzsrgeFg>2D` zFRj6E@Sd?YPxqUdo}F$9xZ)U>ol^Cwr6KkWFA;QsKgVU!GtC~Xi+8cle@&S4iEb{P zrF^23vb=V&`5Rt7FSDr#8!2ZV@XTX;Zu~7ly_^a89A15>8Q|)YMqjMt-}W7>0a%^a zGz&bQsjq}zicNLoB5}x-U+<&`NW^|<wpv9A%(2h{ckjE+a5aQ8y-ch^NIL29m{j0# zJpCbS$D*lWUOGrqw3#|L|LL7N_!7ff9mejkYiiO@h8RBEGV?dwc-t$EqKEDix)#GI zP#tnF|B4Ox>_#Y7F~tMF{Ta*rYwq8^MTzs2as5s#94I(27B=5=@MXc#=vnC{EwD;z zC<j;<H5I>M<vahc^42B6@D+FH07Z=|@V<NNSA1?tF8(jeMR>9cftsZ(A-m(TS)3!f z(vAU$;L31`!=$aK=0$QYNJdt0+vS~sVHUwC;_Sn(8`m4`-evr;8I)&>Fl-Aa4uQx& z$H?(I4q*j$eVl4b;3bkwYNxO+N<z$-fRNo60r-`+uCD&M+1M}&2N2ga8+vSfry)ID zD&oNdq1lF(g}ReRhM=A@qTQ_uBBbJK%5r}&cN1v~gvk;DesGwQ6s~?a!0eAsa_5-4 zdgSHO2kItQS#y^Oj#C;804k052gc4>tsM49s+m>}J{g+@YizmqXthXFmhp~sufY6? zor9&}O0H{}rov6<Nne1;Yot+eX@&R|44pCC6eV^Osj$#Cw=<kdMK*ELT+>($GZ;zk zWT0NL6{a_=QioRdK(b?>?a`Sbrp1gTa4Jb+toK&&ydg-&-mx;Z2^(G$Hbt%}a!sAC zsmnOUyQWzElw_QejQ`ygiKIy>lFKU`WI+xQvjAG6Sm9ni1hEON+ztZv7(`Iubg;sm zT>XRp0X57C(aQ%To&?;|EL=yz;qig6qqlvTFF`h_q1IGsns=z}No?enW-0o9@HPxv zBOB8hWs<n*Qc#Xv)pM!$?vQtwgTzn>ck4f+`llB~t~HyDz~fu}!}*O_Zh8W_X;?`8 zNr@}Y0fm|UGlE=sndKJ|8srVH%(dK%pPI@PRi@6$)D4>AD^uKdN(N1d!+$0v0h)Y_ z<m9&66HyvJN7-e6uK~)T70}h@VI^G%D?l@ioY*d;5g?5M1Eb|o?AOgmS>g5jq7J!g zVMzEaOgBhgC^g3zyCM1AzoT*ptC5dH7!jRw#OsvZ|KcoBD38tM+NhR#*1p;^u+eDN z^DNg&CE6zrW<jn%FkX}gN(B%cT6i<GGREEfw@CIqlh0rQ0M86(pFDv+r#<@vsVc_- zAOmDLE_pEJgQ*F*rYJOZhNf=W6d#&mj8mdxO1Ms`AOF(|+GID9ovWm1IJtC;Xko-v z_2WE{V-uP4H>4n;P!VuAP<JX^Wnw)MQ>f{8u?$jUbe3EKI(_K(!4QFb`L!XF3>&5% z7l*W40{pL{9*OyMoco50t_@rMN)D{S-eQ`q>d&YsO$JlPW8VX{9jobx(6GU`Q&U4B zi`2~YqTy)l2bl7|;p8XWUD+T0!32q^i5RV3^am?OJP0s{xHACB9_x0~lqUmACHu{W zLQ#l1;4zbOmJ}JP2RZcCs&VJlk*hO7Uo)n)jU<&bW{!}`018|Q`GR6Hbxwy<;6Vsx zHELC8MtU3mdWdDo&_5vVYTMSQAI$9p@Hc&dhQmY6eWD5bRukWh1R~ujHj9noAtYi+ zQXvkdE?|F{KD@CLrQ@l=Qn;egqT6Q!N)eKLp#+~65^zgQUM}Y6xCrhWGJ|f^JngsC z{X2g0ucTdq4|Zwl*RoiB$MK2G(cNX)CeRsoFIOc~Jb%UBY>`AyxJZmOw5_7+UZ67Q zU-9f9=Pdfc1{TpSIhKUQHaugAFnyd*y=EM;RuNz>|KW5~j*e9}KA}M!augMQ=zZjG zIRtcEX4$t>J2|zJQ+IOePEK*x{|4L@n(RSHCIpg1Lz37@k1amBFusdx8bkz?ukc<^ z(BNOyo_M87zm?X3*VT;d2dEsAlx^xc6|WkE*nt+^<M&TQw7hugKC*~z1yVF>G!}{{ zf1+`LynZJ5tDQ9pioUt*5I5obxp%Ez;5l2jL2BbUKO|&G9Xh@*4pd>#xGa}r$aaFJ z!%eaLk>zs}JOucw8EgUEd)`^hmc>751SL2$9Gs^56+Zj`B!duivTL7@(N4X1?0C4& ztw$c0^Z}&S=sk%Y)BwVOzawubkQh5i3{4RHOF-U;4|tC2ImIy$tyhJE9E&U)lx(nT zC3fA08iNs*lsGKIZ-%1}fQLx!92^y@d&{;GSHr(W`a6ZDlc5VpE-d5jn)wX$E`lVM q%gIi;`+8twvO7z0hHXM9B!u#C#S{&vXgGBar|$Cq7C*#IKK&o}ZMYTy diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.png b/editions/tw5.com/tiddlers/images/New Release Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f727e54bd939eb88267c8c26582a4ea2c1ce8b GIT binary patch literal 10370 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 literal 0 HcmV?d00001 diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.jpg.meta b/editions/tw5.com/tiddlers/images/New Release Banner.png.meta similarity index 100% rename from editions/tw5.com/tiddlers/images/New Release Banner.jpg.meta rename to editions/tw5.com/tiddlers/images/New Release Banner.png.meta From c80f580833d37d669321b37f44027db452f5f1a4 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 9 Apr 2020 10:58:32 +0100 Subject: [PATCH 0573/2376] Remove internal version number info from dynnannotate plugin --- .../tiddlywiki/dynannotate/docs/history.tid | 33 ------------------- plugins/tiddlywiki/dynannotate/plugin.info | 3 +- 2 files changed, 1 insertion(+), 35 deletions(-) delete mode 100644 plugins/tiddlywiki/dynannotate/docs/history.tid diff --git a/plugins/tiddlywiki/dynannotate/docs/history.tid b/plugins/tiddlywiki/dynannotate/docs/history.tid deleted file mode 100644 index 2bfba30f3..000000000 --- a/plugins/tiddlywiki/dynannotate/docs/history.tid +++ /dev/null @@ -1,33 +0,0 @@ -title: $:/plugins/tiddlywiki/dynannotate/history - -!! v0.0.5 - -* Added support for displaying search snippets -* Fixed animated popups in the combined demo -* Added minimum length for dynannotate search string -* Added custom classes for search overlays -* Fix crash for malformed regexps - -!! v0.0.4 - -* Fix crash with Chrome search-in-page -* Improve docs - -!! v0.0.3 - -* Add support for showing the selection popup even for a zero length selection (ie clicking within the text without dragging) -* Add support for searching -* Refresh when browser or wrapper resizes -** Note that Dynannotate now requires the core TiddlyWiki plugin Dynaview -* Fixes problem with selections within HTML textareas or inputs -* Improved presentation of examples - -!! v0.0.2 - -* Adds support for Mobile Safari -* Split demo into multiple chunks -* Only show the selection popup when the selection is entirely within a selection container - -!! v0.0.1 - -Initial release diff --git a/plugins/tiddlywiki/dynannotate/plugin.info b/plugins/tiddlywiki/dynannotate/plugin.info index a0b947a15..7b4d0c586 100644 --- a/plugins/tiddlywiki/dynannotate/plugin.info +++ b/plugins/tiddlywiki/dynannotate/plugin.info @@ -4,7 +4,6 @@ "description": "Dynamic content annotation", "author": "JeremyRuston", "core-version": ">=5.0.0", - "version": "0.0.6-prerelease", - "list": "readme examples history", + "list": "readme examples", "dependents": ["$:/plugins/tiddlywiki/dynaview"] } From bdc5ac592f17b5ed3bb5ae782e56ced62406d653 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 9 Apr 2020 11:04:50 +0100 Subject: [PATCH 0574/2376] Fix count widget to return "0" for an empty filter string instead of undefined --- core/modules/widgets/count.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/count.js b/core/modules/widgets/count.js index 7522a40cd..b7ee45452 100644 --- a/core/modules/widgets/count.js +++ b/core/modules/widgets/count.js @@ -45,7 +45,7 @@ CountWidget.prototype.execute = function() { if(this.filter) { this.currentCount = this.wiki.filterTiddlers(this.filter,this).length; } else { - this.currentCount = undefined; + this.currentCount = "0"; } }; From bc8859b5501a1f0b7d6421909ad2cb61c5c623e5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 9 Apr 2020 11:06:54 +0100 Subject: [PATCH 0575/2376] AddPlugins: Add a clearer prompt for plugins that have subplugins --- core/language/en-GB/ControlPanel.multids | 1 + core/ui/ControlPanel/Modals/AddPlugins.tid | 22 ++++++++++++++----- themes/tiddlywiki/vanilla/base.tid | 25 ++++++++++++++++------ 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 990f0b1aa..7bdace795 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -87,6 +87,7 @@ Plugins/Plugins/Hint: Plugins Plugins/Reinstall/Caption: reinstall Plugins/Themes/Caption: Themes Plugins/Themes/Hint: Theme plugins +Plugins/SubPluginPrompt: With <<count>> sub-plugins available Saving/Caption: Saving Saving/DownloadSaver/AutoSave/Description: Permit automatic saving for the download saver Saving/DownloadSaver/AutoSave/Hint: Enable Autosave for Download Saver diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index e0f8bbcaa..8fea4e522 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -1,9 +1,7 @@ title: $:/core/ui/ControlPanel/Modals/AddPlugins subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}} -\define install-plugin-button() -<div> -<$button class={{{ [<assetInfo>get[original-title]get[version]then[tc-reinstall]] tc-btn-invisible tc-install-plugin +[join[ ]] }}}> +\define install-plugin-actions() <$action-sendmessage $message="tm-load-plugin-from-library" url={{!!url}} title={{$(assetInfo)$!!original-title}}/> <$set name="url" value={{!!url}}> <$set name="currentTiddler" value=<<assetInfo>>> @@ -12,6 +10,11 @@ subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/ </$list> </$set> </$set> +\end + +\define install-plugin-button() +<div> +<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]get[version]then[tc-reinstall]] tc-btn-invisible tc-install-plugin +[join[ ]] }}}> {{$:/core/images/download-button}} <$list filter="[<assetInfo>get[original-title]get[version]]" variable="installedVersion" emptyMessage="""{{$:/language/ControlPanel/Plugins/Install/Caption}}"""> {{$:/language/ControlPanel/Plugins/Reinstall/Caption}} @@ -56,6 +59,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <<install-plugin-button>> </div> </div> +<$set name="original-title" value={{{ [<assetInfo>get[original-title]] }}}> <$reveal type="match" text="yes" state=<<popup-state>>> <div class="tc-plugin-info-dropdown"> <div class="tc-plugin-info-dropdown-message"> @@ -78,7 +82,6 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <div class="tc-plugin-info-dropdown-body"> <$transclude tiddler=<<assetInfo>> field="readme" mode="block"/> </div> -<$set name="original-title" value={{{ [<assetInfo>get[original-title]] }}}> <$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]" variable="ignore"> <div class="tc-plugin-info-sub-plugins"> <$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]]" variable="assetInfo"> @@ -86,9 +89,18 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$list> </div> </$list> -</$set> </div> </$reveal> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]" variable="ignore"> +<$reveal type="nomatch" text="yes" state=<<popup-state>> tag="div" class="tc-plugin-info-sub-plugin-indicator"> +<$wikify name="count" text="""<$count filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]"/>"""> +<$button class="tc-btn-invisible" set=<<popup-state>> setTo="yes"> +{{$:/language/ControlPanel/Plugins/SubPluginPrompt}} +</$button> +</$wikify> +</$reveal> +</$list> +</$set> </$set> \end diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 9809dcf11..07e9d2046 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2106,8 +2106,20 @@ html body.tc-body.tc-single-tiddler-window { } .tc-plugin-info-sub-plugins .tc-plugin-info { - margin: 0.5em 1em 0.5em 1em; - background: rgba(255,255,0,0.05); + margin: 0.5em; + background: <<colour background>>; +} + +.tc-plugin-info-sub-plugin-indicator { + margin: -16px 1em 0 2em; +} + +.tc-plugin-info-sub-plugin-indicator button { + color: <<colour background>>; + background: <<colour foreground>>; + border-radius: 8px; + padding: 2px 7px; + font-size: 0.75em; } .tc-plugin-info-sub-plugins .tc-plugin-info-dropdown { @@ -2211,11 +2223,12 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s } .tc-plugin-info-sub-plugins { - padding-top: 0.5em; - background: <<colour message-background>>; + padding: 0.5em; + margin: 0 1em 1em 1em; + background: <<colour notification-background>>; } -.tc-plugin-library-listing .tc-install-plugin { +.tc-install-plugin { font-weight: bold; background: green; color: white; @@ -2224,7 +2237,7 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s padding: 3px; } -.tc-plugin-library-listing .tc-install-plugin.tc-reinstall { +.tc-install-plugin.tc-reinstall { background: blue; } From 308ac8c5b05a6732fa80b676c34319ff51f59638 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Thu, 9 Apr 2020 11:07:13 +0100 Subject: [PATCH 0576/2376] AddPlugins: Add new "updates" tab --- core/language/en-GB/ControlPanel.multids | 3 + core/ui/ControlPanel/Modals/AddPlugins.tid | 2 +- core/ui/ControlPanel/Plugins/Add/Updates.tid | 66 ++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 core/ui/ControlPanel/Plugins/Add/Updates.tid diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 7bdace795..dc42ac156 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -87,6 +87,9 @@ Plugins/Plugins/Hint: Plugins Plugins/Reinstall/Caption: reinstall Plugins/Themes/Caption: Themes Plugins/Themes/Hint: Theme plugins +Plugins/Updates/Caption: Updates +Plugins/Updates/Hint: Available updates to installed plugins +Plugins/Updates/UpdateAll/Caption: Update <<upgrade-count>> plugins Plugins/SubPluginPrompt: With <<count>> sub-plugins available Saving/Caption: Saving Saving/DownloadSaver/AutoSave/Description: Permit automatic saving for the download saver diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 8fea4e522..d1d0bd093 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -131,7 +131,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ \define display-server-connection() <$list filter="[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]" variable="connectionTiddler" emptyMessage=<<load-plugin-library-button>>> -<<tabs "[[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]" "$:/core/ui/ControlPanel/Plugins/Add/Plugins">> +<<tabs "[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]" "$:/core/ui/ControlPanel/Plugins/Add/Plugins">> </$list> \end diff --git a/core/ui/ControlPanel/Plugins/Add/Updates.tid b/core/ui/ControlPanel/Plugins/Add/Updates.tid new file mode 100644 index 000000000..7976f3f49 --- /dev/null +++ b/core/ui/ControlPanel/Plugins/Add/Updates.tid @@ -0,0 +1,66 @@ +title: $:/core/ui/ControlPanel/Plugins/Add/Updates +caption: <$importvariables filter="$:/core/ui/ControlPanel/Plugins/Add/Updates">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<upgrade-count>>)</$importvariables> + +\define each-upgradeable-plugin(body) +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]" variable="assetInfo"> +<$set name="libraryVersion" value={{{ [<assetInfo>get[version]] }}}> +<$list filter="[<assetInfo>get[original-title]has[version]!version<libraryVersion>]" variable="ignore"> +<$set name="installedVersion" value={{{ [<assetInfo>get[original-title]get[version]] }}}> +<$list filter="[<installedversion>!match<libraryVersion>]" variable="ignore"> +$body$ +</$list> +</$set> +</$list> +</$set> +</$list> +\end + +\define upgrade-all-actions() +<$macrocall $name="each-upgradeable-plugin" body=""" +<<install-plugin-actions>> +"""/> +\end + +\define upgrade-count() +<$wikify name="count-filter" text=<<each-upgradeable-plugin "[[<$text text=<<assetInfo>>/>]]">>><$count filter=<<count-filter>>/></$wikify> +\end + +<$button actions=<<upgrade-all-actions>> class="tc-btn-invisible tc-install-plugin"> +{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}} +</$button> + +<table class="tc-plugin-library-listing"> +<tbody> +<tr> +<th> +Plugin +</th> +<th> +Installed +</th> +<th> +Available +</th> +<th> +Install +</th> +</tr> +<$macrocall $name="each-upgradeable-plugin" body="""<tr> +<td> +<strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field="description"/> +<br> +<$text text={{{ [<assetInfo>get[original-title]] }}}/> +</td> +<td> +<$text text=<<installedVersion>>/> +</td> +<td> +<$text text=<<libraryVersion>>/> +</td> +<td> +<<install-plugin-button>> +</td> +</tr> +"""/> +</tbody> +</table> From 3733f8b4aedbeb630dc0033b94334cc095392f3a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 12 Apr 2020 17:59:31 +0100 Subject: [PATCH 0577/2376] Release note update --- .../prerelease/tiddlers/Release 5.1.22.tid | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index d8592df33..6730b044d 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -15,6 +15,7 @@ Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser|$:/core/ui/ControlPanel/Modals/AddPlugins]] in the control panel feature several improvements: +* A new "Updates" tab listing all upgrades available from a plugin library, and a button to update all of them with one click * The plugin chooser now displays plugins that provide add-on functionality to another plugin as nested "sub-plugins", making the main listing easier to navigate * Plugins may now declare dependencies that are automatically installed without user intervention * All plugins now feature a concise, informal name (in addition to the description and title) @@ -38,30 +39,20 @@ This release sees several improvements to the client-server configuration: See the [[pull request on GitHub for more details|https://github.com/Jermolene/TiddlyWiki5/pull/4373]]. -!! New Menu Bar Plugin +!! New Plugins -[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ad2d4503e584ce9f931dbd1e98f95738b2841e51]] new ''menubar'' plugin that creates a menu bar that is responsive on mobile devices, and supports search, dropdowns and links - -!! New Freelinks Plugin - -[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/447cd56da9db2ee169607f32923081ac47e78354]] new ''freelinks'' plugin to automatically create links from any tiddler title, without having to type double square brackets or use CamelCase. - -!! New Dynannotate Plugin - -[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/9b48a1c82955d1050c426fef559f42f4b8ec56e7]] new ''dynannotate'' plugin containing primitives for overlaying annotations or highlights over other content - -!! New Share Plugin - -[[Added|https://github.com/Jermolene/TiddlyWiki5/commit/005c584d85505b9477169ef822752eed39dde66a]] new ''share'' plugin for sharing tiddlers via the URL location hash - -!! Improved Markdown Plugin - -[[Switched|https://github.com/Jermolene/TiddlyWiki5/pull/3876]] to the newer and improved [[remarkable|https://github.com/jonschlinkert/remarkable]] library +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ad2d4503e584ce9f931dbd1e98f95738b2841e51]] new ''menubar'' plugin that creates a menu bar that is responsive on mobile devices, and supports search, dropdowns and links +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/447cd56da9db2ee169607f32923081ac47e78354]] new ''freelinks'' plugin to automatically create links from any tiddler title, without having to type double square brackets or use CamelCase. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/9b48a1c82955d1050c426fef559f42f4b8ec56e7]] new ''dynannotate'' plugin containing primitives for overlaying annotations or highlights over other content +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/005c584d85505b9477169ef822752eed39dde66a]] new ''share'' plugin for sharing tiddlers via the URL location hash +* [[Switched|https://github.com/Jermolene/TiddlyWiki5/pull/3876]] the ''markdown'' plugin to the newer and improved [[remarkable|https://github.com/jonschlinkert/remarkable]] library ! Translation Improvements * Improved Chinese translation * Improved Dutch translation +* Improved French translation +* Improved German translations * Improved Portuguese translation ! Performance Improvements @@ -103,6 +94,7 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Refactored|https://github.com/Jermolene/TiddlyWiki5/commit/7b66df688ae745537929a25799ef4a72d4437fcd]] AndTidWiki saver * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5a5c967a3943beb6a4fa513cb34d231e46304452]] new [[SystemTag: $:/tags/Macro/View]] for creating macros that are only available within the view template * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4404]] support for embedding `.webm` and `.ogg` video files +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c7d8492842844d7de12b7a327f978ff114708d84]] support for embedding `.woff2` font files * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3df1f9c9d0cc92b596262c0220ecf529c7fbb858]] ''spaces'' parameter to [[jsontiddlers Macro]] for controlling the formatting of the output * [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/4afde5a722afc91c826305800ba536c5fe8ef2e5]] the [[colour Macro]] to add support for specifying a fallback for colours not in the current colour palette * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6091b013864af3d9918df69894f4aa05d1b8ffeb]] new [[Hidden Setting: Default Tiddler Icon]] @@ -110,6 +102,7 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ae9ce4f01c6048aeb5604a93b57c2f3e4f959162]] new ''tc-tiddler-overridden-shadow'' class to tiddler frames for tiddlers that override a shadow tiddler * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4490]] support for a custom class to modal wrapper * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/091bcfce7d1a9c09140992e649f41ae17d27f307]] [[datauri Macro]] to work with tiddlers with a ''_canonical_uri'' field +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4332]] invaldi HTML produced in ">" in blockquote lists ! Bug Fixes @@ -129,6 +122,8 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/3eacdc19fdb4ed7ce864a04dd87a5e1c6492daac]] GitHub and GitLab savers to use default path of `/` if none specified * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4432]] support for embedding ZIP files in some environments * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/665b63ec38b75dfe62009d2f5514682de60e953f]] lack of refresh when ButtonWidget ''actions'' attribute changes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4534]] the RangeWidget to work in Internet Explorer 10/11 +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/bdc5ac592f17b5ed3bb5ae782e56ced62406d653]] CountWidget to display "0" for an empty filter, instead of "undefined" ! Contributors From 7b53f5724c51b413ffcc98e6cfae93add3158119 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 10:03:01 +0100 Subject: [PATCH 0578/2376] Add new compare filter operator Fixes #4554 --- boot/boot.js | 46 ++++++---- core/modules/filters/compare.js | 76 +++++++++++++++++ core/modules/filters/math.js | 16 +--- core/modules/utils/utils.js | 12 +++ .../tiddlers/tests/test-compare-filter.js | 84 +++++++++++++++++++ editions/test/tiddlers/tests/test-utils.js | 24 ++++++ .../tiddlers/filters/compare Operator.tid | 51 +++++++++++ .../examples/compare Operator (Examples).tid | 11 +++ 8 files changed, 291 insertions(+), 29 deletions(-) create mode 100644 core/modules/filters/compare.js create mode 100644 editions/test/tiddlers/tests/test-compare-filter.js create mode 100644 editions/tw5.com/tiddlers/filters/compare Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/compare Operator (Examples).tid diff --git a/boot/boot.js b/boot/boot.js index d2ad69db9..6b472cb61 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -409,10 +409,10 @@ $tw.utils.resolvePath = function(sourcepath,rootpath) { }; /* -Parse a semantic version string into its constituent parts +Parse a semantic version string into its constituent parts -- see https://semver.org */ $tw.utils.parseVersion = function(version) { - var match = /^((\d+)\.(\d+)\.(\d+))(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?$/.exec(version); + var match = /^v?((\d+)\.(\d+)\.(\d+))(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?$/.exec(version); if(match) { return { version: match[1], @@ -427,25 +427,37 @@ $tw.utils.parseVersion = function(version) { } }; +/* +Returns +1 if the version string A is greater than the version string B, 0 if they are the same, and +1 if B is greater than A. +Missing or malformed version strings are parsed as 0.0.0 +*/ +$tw.utils.compareVersions = function(versionStringA,versionStringB) { + var defaultVersion = { + major: 0, + minor: 0, + patch: 0 + }, + versionA = $tw.utils.parseVersion(versionStringA) || defaultVersion, + versionB = $tw.utils.parseVersion(versionStringB) || defaultVersion, + diff = [ + versionA.major - versionB.major, + versionA.minor - versionB.minor, + versionA.patch - versionB.patch + ]; + if((diff[0] > 0) || (diff[0] === 0 && diff[1] > 0) || (diff[0] === 0 & diff[1] === 0 & diff[2] > 0)) { + return +1; + } else if((diff[0] < 0) || (diff[0] === 0 && diff[1] < 0) || (diff[0] === 0 & diff[1] === 0 & diff[2] < 0)) { + return -1; + } else { + return 0; + } +}; + /* Returns true if the version string A is greater than the version string B. Returns true if the versions are the same */ $tw.utils.checkVersions = function(versionStringA,versionStringB) { - var defaultVersion = { - major: 0, - minor: 0, - patch: 0 - }, - versionA = $tw.utils.parseVersion(versionStringA) || defaultVersion, - versionB = $tw.utils.parseVersion(versionStringB) || defaultVersion, - diff = [ - versionA.major - versionB.major, - versionA.minor - versionB.minor, - versionA.patch - versionB.patch - ]; - return (diff[0] > 0) || - (diff[0] === 0 && diff[1] > 0) || - (diff[0] === 0 && diff[1] === 0 && diff[2] >= 0); + return $tw.utils.compareVersions(versionStringA,versionStringB) !== -1; }; /* diff --git a/core/modules/filters/compare.js b/core/modules/filters/compare.js new file mode 100644 index 000000000..186dfa27b --- /dev/null +++ b/core/modules/filters/compare.js @@ -0,0 +1,76 @@ +/*\ +title: $:/core/modules/filters/compare.js +type: application/javascript +module-type: filteroperator + +General purpose comparison operator + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.compare = function(source,operator,options) { + var suffixes = operator.suffixes || [], + type = (suffixes[0] || [])[0], + mode = (suffixes[1] || [])[0], + typeFn = types[type] || types.number, + modeFn = modes[mode] || modes.eq, + invert = operator.prefix === "!", + results = []; + source(function(tiddler,title) { + if(modeFn(typeFn(title,operator.operand)) !== invert) { + results.push(title); + } + }); + return results; +}; + +var types = { + "number": function(a,b) { + return compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b)); + }, + "integer": function(a,b) { + return compare($tw.utils.parseInt(a),$tw.utils.parseInt(b)); + }, + "string": function(a,b) { + return compare("" + a,"" +b); + }, + "date": function(a,b) { + var dateA = $tw.utils.parseDate(a), + dateB = $tw.utils.parseDate(b); + if(!isFinite(dateA)) { + dateA = new Date(0); + } + if(!isFinite(dateB)) { + dateB = new Date(0); + } + return compare(dateA,dateB); + }, + "version": function(a,b) { + return $tw.utils.compareVersions(a,b); + } +}; + +function compare(a,b) { + if(a > b) { + return +1; + } else if(a < b) { + return -1; + } else { + return 0; + } +}; + +var modes = { + "eq": function(value) {return value === 0;}, + "ne": function(value) {return value !== 0;}, + "gteq": function(value) {return value >= 0;}, + "gt": function(value) {return value > 0;}, + "lteq": function(value) {return value <= 0;}, + "lt": function(value) {return value < 0;} +} + +})(); diff --git a/core/modules/filters/math.js b/core/modules/filters/math.js index c3f6d3b45..ac2b40117 100644 --- a/core/modules/filters/math.js +++ b/core/modules/filters/math.js @@ -114,9 +114,9 @@ exports.minall = makeNumericReducingOperator( function makeNumericBinaryOperator(fnCalc) { return function(source,operator,options) { var result = [], - numOperand = parseNumber(operator.operand); + numOperand = $tw.utils.parseNumber(operator.operand); source(function(tiddler,title) { - result.push(stringifyNumber(fnCalc(parseNumber(title),numOperand))); + result.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand))); }); return result; }; @@ -129,18 +129,10 @@ function makeNumericReducingOperator(fnCalc,initialValue) { source(function(tiddler,title) { result.push(title); }); - return [stringifyNumber(result.reduce(function(accumulator,currentValue) { - return fnCalc(accumulator,parseNumber(currentValue)); + return [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) { + return fnCalc(accumulator,$tw.utils.parseNumber(currentValue)); },initialValue))]; }; } -function parseNumber(str) { - return parseFloat(str) || 0; -} - -function stringifyNumber(num) { - return num + ""; -} - })(); diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 8d8c294d9..dfb70aa0c 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -801,4 +801,16 @@ exports.getSystemInfo = function(str,ending,position) { return results.join("\n"); }; +exports.parseNumber = function(str) { + return parseFloat(str) || 0; +}; + +exports.parseInt = function(str) { + return parseInt(str) || 0; +}; + +exports.stringifyNumber = function(num) { + return num + ""; +}; + })(); diff --git a/editions/test/tiddlers/tests/test-compare-filter.js b/editions/test/tiddlers/tests/test-compare-filter.js new file mode 100644 index 000000000..b146fcc18 --- /dev/null +++ b/editions/test/tiddlers/tests/test-compare-filter.js @@ -0,0 +1,84 @@ +/*\ +title: test-compare-filters.js +type: application/javascript +tags: [[$:/tags/test-spec]] + +Tests the compare filter. + +\*/ +(function(){ + +/* jslint node: true, browser: true */ +/* eslint-env node, browser, jasmine */ +/* eslint no-mixed-spaces-and-tabs: ["error", "smart-tabs"]*/ +/* global $tw, require */ +"use strict"; + +describe("'compare' filter tests", function() { + + var wiki = new $tw.Wiki(); + + it("should compare numerical equality", function() { + expect(wiki.filterTiddlers("[[2]compare:number:eq[0003]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]compare:number:ne[000003]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]compare:number:eq[3]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]compare:number:ne[3]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]compare:number:eq[2]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]compare:number:ne[2]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]compare:number:eq[x]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]compare:number:ne[x]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]!compare:number:eq[3]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]!compare:number:ne[3]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]!compare:number:eq[2]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]!compare:number:ne[2]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]!compare:number:eq[x]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]!compare:number:ne[x]]").join(",")).toBe(""); + }); + + it("should compare numerical magnitude", function() { + expect(wiki.filterTiddlers("[[2]compare:number:gt[3]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]compare:number:lt[3]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]compare:number:gt[2]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]compare:number:lt[2]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]compare:number:gt[x]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]compare:number:lt[x]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]!compare:number:gt[3]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]!compare:number:lt[3]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]!compare:number:gt[2]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]!compare:number:lt[2]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]!compare:number:gt[x]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[2]!compare:number:lt[x]]").join(",")).toBe("2"); + }); + + it("should compare string", function() { + expect(wiki.filterTiddlers("[[Monday]compare:string:lt[M]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[Monday]compare:string:lt[W]]").join(",")).toBe("Monday"); + expect(wiki.filterTiddlers("Monday Tuesday Wednesday Thursday Friday Saturday Sunday +[compare:string:gt[M]sort[]]").join(",")).toBe("Monday,Saturday,Sunday,Thursday,Tuesday,Wednesday"); + expect(wiki.filterTiddlers("Monday Tuesday Wednesday Thursday Friday Saturday Sunday +[compare:string:gt[M]compare:string:lt[W]sort[]]").join(",")).toBe("Monday,Saturday,Sunday,Thursday,Tuesday"); + }); + + it("should compare dates", function() { + expect(wiki.filterTiddlers("[[20200101]compare:date:gt[201912311852]]").join(",")).toBe("20200101"); + }); + + it("should compare version numbers", function() { + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:eq[v1.1.0]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:eq[v1.2.2]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:eq[v1.2.3]]").join(",")).toBe("v1.2.3"); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:eq[v1.2.4]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:eq[v2.0.0]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:gt[v1.1.0]]").join(",")).toBe("v1.2.3"); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:gt[v1.2.2]]").join(",")).toBe("v1.2.3"); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:gt[v1.2.3]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:gt[v1.2.4]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:gt[v2.0.0]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:lt[v1.1.0]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:lt[v1.2.2]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:lt[v1.2.3]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:lt[v1.2.4]]").join(",")).toBe("v1.2.3"); + expect(wiki.filterTiddlers("[[v1.2.3]compare:version:lt[v2.0.0]]").join(",")).toBe("v1.2.3"); + }); + +}); + +})(); diff --git a/editions/test/tiddlers/tests/test-utils.js b/editions/test/tiddlers/tests/test-utils.js index 860cc4d51..a79c6ccee 100644 --- a/editions/test/tiddlers/tests/test-utils.js +++ b/editions/test/tiddlers/tests/test-utils.js @@ -107,6 +107,30 @@ describe("Utility tests", function() { }); + it("should compare versions", function() { + var cv = $tw.utils.compareVersions; + expect(cv("v0.0.0","v0.0.0")).toEqual(0); + expect(cv("0.0.0","v0.0.0")).toEqual(0); + expect(cv("v0.0.0","0.0.0")).toEqual(0); + expect(cv("v0.0.0","not a version")).toEqual(0); + expect(cv("v0.0.0",undefined)).toEqual(0); + expect(cv("not a version","v0.0.0")).toEqual(0); + expect(cv(undefined,"v0.0.0")).toEqual(0); + expect(cv("v1.0.0","v1.0.0")).toEqual(0); + expect(cv("v1.0.0","1.0.0")).toEqual(0); + + expect(cv("v1.0.1",undefined)).toEqual(+1); + expect(cv("v1.0.1","v1.0.0")).toEqual(+1); + expect(cv("v1.1.1","v1.1.0")).toEqual(+1); + expect(cv("v1.1.2","v1.1.1")).toEqual(+1); + expect(cv("1.1.2","v1.1.1")).toEqual(+1); + + expect(cv("v1.0.0","v1.0.1")).toEqual(-1); + expect(cv("v1.1.0","v1.1.1")).toEqual(-1); + expect(cv("v1.1.1","v1.1.2")).toEqual(-1); + expect(cv("1.1.1","1.1.2")).toEqual(-1); + }); + }); })(); diff --git a/editions/tw5.com/tiddlers/filters/compare Operator.tid b/editions/tw5.com/tiddlers/filters/compare Operator.tid new file mode 100644 index 000000000..a882914ae --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/compare Operator.tid @@ -0,0 +1,51 @@ +created: 20200412181551706 +modified: 20200412181551706 +tags: [[Filter Operators]] [[Mathematics Operators]] [[String Operators]] [[Negatable Operators]] +title: compare Operator +type: text/vnd.tiddlywiki +caption: compare +op-purpose: filter the input by comparing each item against the operand +op-input: a [[selection of titles|Title Selection]] +op-suffix: the <<.op compare>> operator uses a rich suffix, see below for details +op-parameter: the value to compare +op-output: those input titles matching the specified comparison +op-neg-output: those input titles <<.em not>> matching the specified comparison + +<<.from-version "5.1.22">>The <<.op compare>> filter allows numerical, string and date comparisons to be performed. + +The <<.op compare>> operator uses an extended syntax to specify all the options: + +``` +[compare:<type>:<mode>[<operand>]] +``` + +The ''type'' can be: + +* "number" - invalid numbers are interpreted as zero +* "integer" - invalid integers are interpreted as zero +* "string" +* "date" - invalid dates are interpreted as 1st January 1970 +* "version" - invalid versions are interpreted as "v0.0.0" + +The ''mode'' can be: + +* "eq" - equal to +* "ne" - not equal ot +* "gteq" - greater than or equal to +* "gt" - greater than +* "lteq" - less than or equal to +* "lt" - less than + +The operator compares each item in the selection against the value of the parameter, retaining only those items that pass the specified condition. + +For example: + +``` +[[2]compare:number:eq[3]] returns nothing +[[2]compare:number:lt[3]] returns "2" +[[2]compare:number:eq[2]] returns "2" +``` + +Note that several of the variants of the <<.op compare>> operator are synonyms for existing operators, and are provided in the interests of consistency. For example, `compare:string:eq[x]` is a synonym for `match[x]`. + +<<.operator-examples "compare">> diff --git a/editions/tw5.com/tiddlers/filters/examples/compare Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/compare Operator (Examples).tid new file mode 100644 index 000000000..f729dc5d2 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/compare Operator (Examples).tid @@ -0,0 +1,11 @@ +created: 20200412212935849 +modified: 20200412212935849 +tags: [[compare Operator]] [[Operator Examples]] +title: compare Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[20200101]compare:date:gt[201912311852]]" "compares two partial dates">> +<<.operator-example 2 "[[202001011852]compare:integer:gt[20191231]]" "compares the same two strings as integers">> +<<.operator-example 3 "[list[Days of the Week]compare:string:gt[M]compare:string:lt[W]]">> +<<.operator-example 4 "[[v5.1.23-prerelease]compare:version:gt[v5.1.22]]">> +<<.operator-example 5 "[[1]compare:number:gt[2]then[yes]else[no]]">> From 245dab0c8c2ee10ca08f0790633d437f10ebd44d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 10:03:24 +0100 Subject: [PATCH 0579/2376] Plugin Chooser: Include currently installed version --- core/ui/ControlPanel/Modals/AddPlugins.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index d1d0bd093..6b267f6b9 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -54,6 +54,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field="description"/></h1> <h2><$view tiddler=<<assetInfo>> field="original-title"/></h2> <div><em><$view tiddler=<<assetInfo>> field="version"/></em></div> +<$list filter="[<assetInfo>get[original-title]get[version]]" variable="installedVersion"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list> </div> <div class="tc-plugin-info-chunk tc-plugin-info-buttons"> <<install-plugin-button>> From 86296b67aabf15804f48da58c74e3c2d5dd5ceb5 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 10:04:14 +0100 Subject: [PATCH 0580/2376] Plugin Chooser: Distinguish between install, reinstall, update and downgrade --- core/language/en-GB/ControlPanel.multids | 4 +++- core/ui/ControlPanel/Modals/AddPlugins.tid | 18 +++++++++++++++--- core/ui/ControlPanel/Plugins/Add/Updates.tid | 16 ++++++++-------- themes/tiddlywiki/vanilla/base.tid | 7 +++++++ 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index dc42ac156..86d352202 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -70,6 +70,7 @@ Plugins/Caption: Plugins Plugins/Disable/Caption: disable Plugins/Disable/Hint: Disable this plugin when reloading page Plugins/Disabled/Status: (disabled) +Plugins/Downgrade/Caption: downgrade Plugins/Empty/Hint: None Plugins/Enable/Caption: enable Plugins/Enable/Hint: Enable this plugin when reloading page @@ -87,9 +88,10 @@ Plugins/Plugins/Hint: Plugins Plugins/Reinstall/Caption: reinstall Plugins/Themes/Caption: Themes Plugins/Themes/Hint: Theme plugins +Plugins/Update/Caption: update Plugins/Updates/Caption: Updates Plugins/Updates/Hint: Available updates to installed plugins -Plugins/Updates/UpdateAll/Caption: Update <<upgrade-count>> plugins +Plugins/Updates/UpdateAll/Caption: Update <<update-count>> plugins Plugins/SubPluginPrompt: With <<count>> sub-plugins available Saving/Caption: Saving Saving/DownloadSaver/AutoSave/Description: Permit automatic saving for the download saver diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 6b267f6b9..dfbde44e3 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -14,15 +14,27 @@ subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/ \define install-plugin-button() <div> -<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]get[version]then[tc-reinstall]] tc-btn-invisible tc-install-plugin +[join[ ]] }}}> +<$set name="libraryVersion" value={{{ [<assetInfo>get[version]] }}}> +<$set name="installedVersion" value={{{ [<assetInfo>get[original-title]get[version]] }}}> +<$set name="reinstall-type" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}> +<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}> {{$:/core/images/download-button}} -<$list filter="[<assetInfo>get[original-title]get[version]]" variable="installedVersion" emptyMessage="""{{$:/language/ControlPanel/Plugins/Install/Caption}}"""> -{{$:/language/ControlPanel/Plugins/Reinstall/Caption}} +<$list filter="[<assetInfo>get[original-title]get[version]]" variable="ignore" emptyMessage="{{$:/language/ControlPanel/Plugins/Install/Caption}}"> +<$list filter="[<libraryVersion>compare:version:gt<installedVersion>]" variable="ignore" emptyMessage=""" +<$list filter="[<libraryVersion>compare:version:lt<installedVersion>]" variable="ignore" emptyMessage="{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}"> +{{$:/language/ControlPanel/Plugins/Downgrade/Caption}} +</$list> +"""> +{{$:/language/ControlPanel/Plugins/Update/Caption}} +</$list> </$list> </$button> <div> </div> <$reveal stateTitle=<<assetInfo>> stateField="requires-reload" type="match" text="yes">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal> +</$set> +</$set> +</$set> </div> \end diff --git a/core/ui/ControlPanel/Plugins/Add/Updates.tid b/core/ui/ControlPanel/Plugins/Add/Updates.tid index 7976f3f49..218f1552e 100644 --- a/core/ui/ControlPanel/Plugins/Add/Updates.tid +++ b/core/ui/ControlPanel/Plugins/Add/Updates.tid @@ -1,7 +1,7 @@ title: $:/core/ui/ControlPanel/Plugins/Add/Updates -caption: <$importvariables filter="$:/core/ui/ControlPanel/Plugins/Add/Updates">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<upgrade-count>>)</$importvariables> +caption: <$importvariables filter="$:/core/ui/ControlPanel/Plugins/Add/Updates">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables> -\define each-upgradeable-plugin(body) +\define each-updateable-plugin(body) <$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]" variable="assetInfo"> <$set name="libraryVersion" value={{{ [<assetInfo>get[version]] }}}> <$list filter="[<assetInfo>get[original-title]has[version]!version<libraryVersion>]" variable="ignore"> @@ -15,17 +15,17 @@ $body$ </$list> \end -\define upgrade-all-actions() -<$macrocall $name="each-upgradeable-plugin" body=""" +\define update-all-actions() +<$macrocall $name="each-updateable-plugin" body=""" <<install-plugin-actions>> """/> \end -\define upgrade-count() -<$wikify name="count-filter" text=<<each-upgradeable-plugin "[[<$text text=<<assetInfo>>/>]]">>><$count filter=<<count-filter>>/></$wikify> +\define update-count() +<$wikify name="count-filter" text=<<each-updateable-plugin "[[<$text text=<<assetInfo>>/>]]">>><$count filter=<<count-filter>>/></$wikify> \end -<$button actions=<<upgrade-all-actions>> class="tc-btn-invisible tc-install-plugin"> +<$button actions=<<update-all-actions>> class="tc-btn-invisible tc-install-plugin"> {{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}} </$button> @@ -45,7 +45,7 @@ Available Install </th> </tr> -<$macrocall $name="each-upgradeable-plugin" body="""<tr> +<$macrocall $name="each-updateable-plugin" body="""<tr> <td> <strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field="description"/> <br> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 07e9d2046..0ca784c76 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2237,10 +2237,17 @@ a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > s padding: 3px; } +.tc-install-plugin.tc-reinstall-downgrade { + background: red; +} + .tc-install-plugin.tc-reinstall { background: blue; } +.tc-install-plugin.tc-reinstall-upgrade { + background: orange; +} .tc-check-list { line-height: 2em; From fd9938f2ccfd37765c0f17419f398e429aa5e004 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 10:04:37 +0100 Subject: [PATCH 0581/2376] Release note update --- editions/prerelease/tiddlers/Release 5.1.22.tid | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 6730b044d..04234c6f6 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -39,6 +39,17 @@ This release sees several improvements to the client-server configuration: See the [[pull request on GitHub for more details|https://github.com/Jermolene/TiddlyWiki5/pull/4373]]. +!! New [[compare Operator]] + +[[Added|https://github.com/Jermolene/TiddlyWiki5/issues/4554]] a new filter operator for comparing numbers, strings, dates and version numbers. For example: + +``` +[[2]compare:number:eq[3]] returns nothing +[[2]compare:number:lt[3]] returns "2" +[[2]compare:number:eq[2]] returns "2" +[[1]compare:number:gt[2]then[yes]else[no]] +``` + !! New Plugins * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/ad2d4503e584ce9f931dbd1e98f95738b2841e51]] new ''menubar'' plugin that creates a menu bar that is responsive on mobile devices, and supports search, dropdowns and links From dc98432fa051efe2e3929029f842c282d255d25d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 11:11:16 +0100 Subject: [PATCH 0582/2376] Plugin Chooser: Use existing template for updates tab --- core/ui/ControlPanel/Plugins/Add/Updates.tid | 38 +++----------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/core/ui/ControlPanel/Plugins/Add/Updates.tid b/core/ui/ControlPanel/Plugins/Add/Updates.tid index 218f1552e..82ac9bbc3 100644 --- a/core/ui/ControlPanel/Plugins/Add/Updates.tid +++ b/core/ui/ControlPanel/Plugins/Add/Updates.tid @@ -29,38 +29,8 @@ $body$ {{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}} </$button> -<table class="tc-plugin-library-listing"> -<tbody> -<tr> -<th> -Plugin -</th> -<th> -Installed -</th> -<th> -Available -</th> -<th> -Install -</th> -</tr> -<$macrocall $name="each-updateable-plugin" body="""<tr> -<td> -<strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field="description"/> -<br> -<$text text={{{ [<assetInfo>get[original-title]] }}}/> -</td> -<td> -<$text text=<<installedVersion>>/> -</td> -<td> -<$text text=<<libraryVersion>>/> -</td> -<td> -<<install-plugin-button>> -</td> -</tr> +<div class="tc-plugin-library-listing"> +<$macrocall $name="each-updateable-plugin" body=""" +<$macrocall $name="display-plugin-info" type={{{ [<assetInfo>get[original-plugin-type]] }}}/> """/> -</tbody> -</table> +</div> From 4cc98e361c0bcb0f46e2bed157ae9c036f7035dc Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 11:11:24 +0100 Subject: [PATCH 0583/2376] Release note update --- .../prerelease/tiddlers/Release 5.1.22.tid | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 04234c6f6..986fb1fc8 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -15,10 +15,10 @@ Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser|$:/core/ui/ControlPanel/Modals/AddPlugins]] in the control panel feature several improvements: -* A new "Updates" tab listing all upgrades available from a plugin library, and a button to update all of them with one click -* The plugin chooser now displays plugins that provide add-on functionality to another plugin as nested "sub-plugins", making the main listing easier to navigate -* Plugins may now declare dependencies that are automatically installed without user intervention -* All plugins now feature a concise, informal name (in addition to the description and title) +* A new ''"Updates" tab'' listing all upgrades available from a plugin library, and a button to update all of them with one click +* The plugin chooser now displays plugins that provide add-on functionality to another plugin as nested ''"sub-plugins"'', making the main listing easier to navigate +* Plugins may now declare dependencies that are ''automatically installed'' without user intervention +* All plugins are now displayed more consistently, including a concise, informal name (in addition to the description and title) !! Client-Server Improvements @@ -43,12 +43,16 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T [[Added|https://github.com/Jermolene/TiddlyWiki5/issues/4554]] a new filter operator for comparing numbers, strings, dates and version numbers. For example: -``` -[[2]compare:number:eq[3]] returns nothing -[[2]compare:number:lt[3]] returns "2" -[[2]compare:number:eq[2]] returns "2" -[[1]compare:number:gt[2]then[yes]else[no]] -``` +:`[[2]compare:number:eq[3]]` +;returns nothing +:`[[2]compare:number:lt[3]]` +; returns "2" +:`[[2]compare:number:eq[2]]` +; returns "2" +:`=1.2 =1.8 =2.3 =3.4 =7.2 +[compare:number:gt[1.5]compare:number:lt[2.5]]` +; returns "1.8" "2.3" +:`[[1]compare:number:gt[2]then[yes]else[no]]` +; returns "no" !! New Plugins From 8310af068c2fe1bbcd068aed95d49a586de3de80 Mon Sep 17 00:00:00 2001 From: Xavier Cazin <xavier@cazin.eu> Date: Mon, 13 Apr 2020 12:15:20 +0200 Subject: [PATCH 0584/2376] Additional fr-FR translation for Control Panel (#4555) * fr-FR translation for strings relative to plugin updates * Missing fr-FR translation for a string in ControlPanel * Missing fr-FR translation for Copy to Clipboard caption & hint * Missing fr-FR translations for the Edit Template * fr-FR translations for updates/upgrades in plugin chooser --- languages/fr-FR/Buttons.multids | 2 ++ languages/fr-FR/ControlPanel.multids | 7 +++++++ languages/fr-FR/EditTemplate.multids | 3 +++ 3 files changed, 12 insertions(+) diff --git a/languages/fr-FR/Buttons.multids b/languages/fr-FR/Buttons.multids index 448589f4b..058cf8041 100644 --- a/languages/fr-FR/Buttons.multids +++ b/languages/fr-FR/Buttons.multids @@ -14,6 +14,8 @@ CloseOthers/Caption: fermer les autres tiddlers CloseOthers/Hint: Ferme les autres tiddlers ControlPanel/Caption: panneau de contrôle ControlPanel/Hint: Ouvre le panneau de contrôle +CopyToClipboard/Caption: copier dans le presse-papier +CopyToClipboard/Hint: Copie ce texte dans le presse-papier Delete/Caption: supprimer Delete/Hint: Supprime ce tiddler Edit/Caption: éditer diff --git a/languages/fr-FR/ControlPanel.multids b/languages/fr-FR/ControlPanel.multids index 145383a36..89298c459 100644 --- a/languages/fr-FR/ControlPanel.multids +++ b/languages/fr-FR/ControlPanel.multids @@ -15,6 +15,7 @@ Basics/NewJournal/Title/Prompt: Modèle pour les titres des tiddlers journaux Basics/NewJournal/Text/Prompt: Texte pour les nouveaux tiddlers journaux Basics/NewJournal/Tags/Prompt: Tags pour les nouveaux tiddlers journaux Basics/NewTiddler/Title/Prompt: Modèle pour les titres des nouveaux tiddlers +Basics/NewTiddler/Tags/Prompt: Tags pour les nouveaux tiddlers Basics/OverriddenShadowTiddlers/Prompt: Nombre de tiddlers //shadow// modifiés Basics/ShadowTiddlers/Prompt: Nombre de tiddlers //shadow// Basics/Subtitle/Prompt: Sous-titre @@ -69,6 +70,7 @@ Plugins/Caption: Plugins Plugins/Disable/Caption: désactiver Plugins/Disable/Hint: Désactive ce plugin au prochain rechargement de la page Plugins/Disabled/Status: (désactivé) +Plugins/Downgrade/Caption: version antérieure Plugins/Empty/Hint: Aucun Plugins/Enable/Caption: activer Plugins/Enable/Hint: Active ce plugin au prochain rechargement de la page @@ -86,6 +88,11 @@ Plugins/Plugins/Hint: Plugins Plugins/Reinstall/Caption: réinstalle Plugins/Themes/Caption: Thèmes Plugins/Themes/Hint: Plugins de thème +Plugins/Update/Caption: mise à jour +Plugins/Updates/Caption: Mises à jour +Plugins/Updates/Hint: Mises à jour disponibles pour les plugins installés +Plugins/Updates/UpdateAll/Caption: Mettre à jour <<update-count>> plugins +Plugins/SubPluginPrompt: Avec <<count>> sous-plugins disponibles Saving/Caption: Sauvegarde Saving/DownloadSaver/AutoSave/Description: Permet l'enregistrement automatique pour l'enregistreur de téléchargement Saving/DownloadSaver/AutoSave/Hint: Active l'auto-enregistrement pour l'enregistreur de téléchargement diff --git a/languages/fr-FR/EditTemplate.multids b/languages/fr-FR/EditTemplate.multids index de7b85368..30def0d81 100644 --- a/languages/fr-FR/EditTemplate.multids +++ b/languages/fr-FR/EditTemplate.multids @@ -5,6 +5,8 @@ Body/Placeholder: Entrez le texte ici Body/Preview/Type/Output: sortie Field/Remove/Caption: supprimer le champ Field/Remove/Hint: Supprime le champ +Field/Dropdown/Caption: liste des champs +Field/Dropdown/Hint: Montre la liste des champs Fields/Add/Button: ajouter Fields/Add/Button/Hint: Ajoute le nouveau champ au tiddler Fields/Add/Name/Placeholder: nom du champ @@ -15,6 +17,7 @@ Fields/Add/Dropdown/User: Champs utilisateur Shadow/OverriddenWarning: Ce tiddler est une version modifiée d'un tiddler « shadow ». Pour revenir à la version par défaut du plugin <<pluginLink>>, il vous suffit de supprimer ce tiddler. Shadow/Warning: Ceci est un tiddler « shadow ». Toute modification supplantera la version issue du plugin <<pluginLink>> Tags/Add/Button: ajouter +Tags/Add/Button/Hint: ajoute un tag Tags/Add/Placeholder: nom du tag Tags/Dropdown/Caption: liste des tags Tags/Dropdown/Hint: Montre la liste des tags From bd0b9d5f8197307ff4ddbe0c7584db8cbc02e3c1 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Mon, 13 Apr 2020 18:17:25 +0800 Subject: [PATCH 0585/2376] Add chinese translations for AddPlugins things (#4546) * Add chinese translations for AddPlugins things * "updates" tab * prompt for plugins that have subplugins * Improve chinese wording * Update chinese translations for AddPlugins * add Plugins/Downgrade/Caption * add Plugins/Update/Caption * update Plugins/Updates/UpdateAll/Caption --- languages/zh-Hans/ControlPanel.multids | 10 ++++++++-- languages/zh-Hant/ControlPanel.multids | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 0ff2c7a1c..446a45b07 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -5,7 +5,7 @@ Advanced/Hint: 关于此 TiddlyWiki 的内部信息 Appearance/Caption: 视觉外观 Appearance/Hint: 定制您的 TiddlyWiki 外观。 Basics/AnimDuration/Prompt: 动画持续时间 -Basics/AutoFocus/Prompt: 編輯條目時的默认自动停留栏位 +Basics/AutoFocus/Prompt: 编辑条目时的默认自动停留栏位 Basics/Caption: 基本 Basics/DefaultTiddlers/BottomHint: 标题含空白时请使用 [[双中括弧]],或者您可用 <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">保留开启中的条目顺序</$button> Basics/DefaultTiddlers/Prompt: 首页 @@ -16,7 +16,7 @@ Basics/NewJournal/Text/Prompt: 新日志条目的内容 Basics/NewJournal/Title/Prompt: 新日志条目的名称 Basics/NewTiddler/Tags/Prompt: 新条目的标签 Basics/NewTiddler/Title/Prompt: 新条目的名称 -Basics/OverriddenShadowTiddlers/Prompt: 被覆写的默认条目数量 +Basics/OverriddenShadowTiddlers/Prompt: 被覆盖的默认条目数量 Basics/ShadowTiddlers/Prompt: 默认条目数量 Basics/Subtitle/Prompt: 副标题 Basics/SystemTiddlers/Prompt: 系统条目数量 @@ -65,6 +65,7 @@ Plugins/Caption: 插件 Plugins/Disable/Caption: 禁用 Plugins/Disable/Hint: 重新加载页面时禁用此插件 Plugins/Disabled/Status: (已禁用) +Plugins/Downgrade/Caption: 降级 Plugins/Empty/Hint: 无 Plugins/Enable/Caption: 启用 Plugins/Enable/Hint: 重新加载页面时启用此插件 @@ -83,6 +84,11 @@ Plugins/Plugins/Hint: 插件 Plugins/Reinstall/Caption: 重新安装 Plugins/Themes/Caption: 布景主题 Plugins/Themes/Hint: 布景主题插件 +Plugins/Update/Caption: 更新 +Plugins/Updates/Caption: 更新 +Plugins/Updates/Hint: 已安装插件的可用更新 +Plugins/Updates/UpdateAll/Caption: 更新 <<update-count>> 个插件 +Plugins/SubPluginPrompt: 提供 <<count>> 个可用的附加插件 Parsing/Caption: 解析 Parsing/Hint: 在此您可以全域禁用或启用维基解析规则。要使更改生效,请保存并重新加载您的维基。禁用某些解析规则,会妨碍 <$text text="TiddlyWiki"/> 正常运作。可使用[[安全模式|https://tiddlywiki.com/#SafeMode]]恢复正常操作。 Parsing/Block/Caption: 区块解析规则 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 76c98d6fb..81b987ff1 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -65,6 +65,7 @@ Plugins/Caption: 插件 Plugins/Disable/Caption: 停用 Plugins/Disable/Hint: 重新載入頁面時停用此插件 Plugins/Disabled/Status: (已停用) +Plugins/Downgrade/Caption: 降級 Plugins/Empty/Hint: 無 Plugins/Enable/Caption: 啟用 Plugins/Enable/Hint: 重新載入頁面時啟用此插件 @@ -83,6 +84,11 @@ Plugins/Plugins/Hint: 插件 Plugins/Reinstall/Caption: 重新安裝 Plugins/Themes/Caption: 佈景主題 Plugins/Themes/Hint: 佈景主題插件 +Plugins/Update/Caption: 更新 +Plugins/Updates/Caption: 更新 +Plugins/Updates/Hint: 已安裝插件的可用更新 +Plugins/Updates/UpdateAll/Caption: 更新 <<update-count>> 個插件 +Plugins/SubPluginPrompt: 提供 <<count>> 個可用的附加插件 Parsing/Caption: 解析 Parsing/Hint: 在此您可以全域停用或啟用維基解析規則。要使更改生效,請儲存並重新載入您的維基。停用某些解析規則,會妨礙 <$text text="TiddlyWiki"/> 正常運作。可使用[[安全模式|https://tiddlywiki.com/#SafeMode]]恢復正常操作。 Parsing/Block/Caption: 區塊解析規則 From 63dee16611a9738d71d1a8937ac59424a8be2c89 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 11:28:24 +0100 Subject: [PATCH 0586/2376] Plugin Chooser: Use separate tab state for each plugin library Fixing the third issue at https://github.com/Jermolene/TiddlyWiki5/issues/4486#issuecomment-612841838 from @kookma --- core/ui/ControlPanel/Modals/AddPlugins.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index dfbde44e3..01463c275 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -144,8 +144,12 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ \define display-server-connection() <$list filter="[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]" variable="connectionTiddler" emptyMessage=<<load-plugin-library-button>>> +<$set name="transclusion" value=<<connectionTiddler>>> + <<tabs "[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]" "$:/core/ui/ControlPanel/Plugins/Add/Plugins">> +</$set> + </$list> \end From 0d0698ea6e81d4842bec62a4120ac5bc680c4a9a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 11:35:52 +0100 Subject: [PATCH 0587/2376] Plugin Chooser: Don't display the "already installed" message twice Fixing the first issue here https://github.com/Jermolene/TiddlyWiki5/issues/4486#issuecomment-612841838 by @kookma --- core/ui/ControlPanel/Modals/AddPlugins.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 01463c275..f41d17ad1 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -75,11 +75,10 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <$set name="original-title" value={{{ [<assetInfo>get[original-title]] }}}> <$reveal type="match" text="yes" state=<<popup-state>>> <div class="tc-plugin-info-dropdown"> +<$list filter="[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]" variable="ignore"> <div class="tc-plugin-info-dropdown-message"> -<$list filter="[<assetInfo>get[original-title]get[version]]" variable="installedVersion" emptyMessage="""{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}"""> -<em> -{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}} -</em> +<$list filter="[<assetInfo>get[original-title]!is[tiddler]]"> +{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}} </$list> <$set name="currentTiddler" value=<<assetInfo>>> <$list filter="[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]" variable="ignore"> @@ -92,6 +91,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$list> </$set> </div> +</$list> <div class="tc-plugin-info-dropdown-body"> <$transclude tiddler=<<assetInfo>> field="readme" mode="block"/> </div> From 4529123777815d143b0117a879879bb88608284d Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 11:38:53 +0100 Subject: [PATCH 0588/2376] Plugin Chooser: Colour of update all button should match individual update buttons Fixes the final issue mentioned by @kookma at https://github.com/Jermolene/TiddlyWiki5/issues/4486#issuecomment-612841838 --- core/ui/ControlPanel/Plugins/Add/Updates.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ControlPanel/Plugins/Add/Updates.tid b/core/ui/ControlPanel/Plugins/Add/Updates.tid index 82ac9bbc3..239889fd2 100644 --- a/core/ui/ControlPanel/Plugins/Add/Updates.tid +++ b/core/ui/ControlPanel/Plugins/Add/Updates.tid @@ -25,7 +25,7 @@ $body$ <$wikify name="count-filter" text=<<each-updateable-plugin "[[<$text text=<<assetInfo>>/>]]">>><$count filter=<<count-filter>>/></$wikify> \end -<$button actions=<<update-all-actions>> class="tc-btn-invisible tc-install-plugin"> +<$button actions=<<update-all-actions>> class="tc-btn-invisible tc-install-plugin tc-reinstall-upgrade"> {{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}} </$button> From 4bbc58dd242bc81e9e0095e2c065929b2a585ada Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Mon, 13 Apr 2020 11:45:06 +0100 Subject: [PATCH 0589/2376] Plugin Chooser: Ensure official plugin library is shown first --- core/wiki/tags/PluginLibrary.tid | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core/wiki/tags/PluginLibrary.tid diff --git a/core/wiki/tags/PluginLibrary.tid b/core/wiki/tags/PluginLibrary.tid new file mode 100644 index 000000000..4c534d035 --- /dev/null +++ b/core/wiki/tags/PluginLibrary.tid @@ -0,0 +1,2 @@ +title: $:/tags/PluginLibrary +list: $:/config/OfficialPluginLibrary \ No newline at end of file From 84eaee8210c806afe400c66566ac68982b288d16 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 14 Apr 2020 11:52:01 +0100 Subject: [PATCH 0590/2376] Control Panel Plugin Listing: Fallback to last component of title if name field is missing --- core/ui/Components/plugin-info.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/Components/plugin-info.tid b/core/ui/Components/plugin-info.tid index c3e03f9b0..8c51404e3 100644 --- a/core/ui/Components/plugin-info.tid +++ b/core/ui/Components/plugin-info.tid @@ -38,7 +38,7 @@ $:/config/Plugins/Disabled/$(currentTiddler)$ </div> <div class="tc-plugin-info-chunk tc-plugin-info-description"> <h1> -''<$view field="name"/>'': <$view field="description"><$view field="title"/></$view> $disabledMessage$ +''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field="description"><$view field="title"/></$view> $disabledMessage$ </h1> <h2> <$view field="title"/> From 4146a04a9ec9d4226b98c5917789683672617b74 Mon Sep 17 00:00:00 2001 From: jed <inmysocks@fastmail.com> Date: Tue, 14 Apr 2020 13:03:12 +0200 Subject: [PATCH 0591/2376] Fix makelibrary.js to use enviroment variable paths (#4559) This makes makelibrary.js use environment variables to find paths for plugins, themes and languages instead of just using the paths hardcoded in boot.js --- core/modules/commands/makelibrary.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/core/modules/commands/makelibrary.js b/core/modules/commands/makelibrary.js index ce7150f0c..ae5977844 100644 --- a/core/modules/commands/makelibrary.js +++ b/core/modules/commands/makelibrary.js @@ -51,9 +51,20 @@ Command.prototype.execute = function() { } } }; - collectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.pluginsPath)); - collectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.themesPath)); - collectPlugins(path.resolve($tw.boot.corePath,$tw.config.languagesPath)); + var pluginsPaths = $tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar); + for(var u=0; u<pluginsPaths.length; u++) { + collectPublisherPlugins(pluginsPaths[u]); + } + + var themesPaths = $tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar); + for(var u=0; u<themesPaths.length; u++) { + collectPublisherPlugins(themesPaths[u]); + } + + var languagesPaths = $tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar); + for(var u=0; u<languagesPaths.length; u++) { + collectPlugins(languagesPaths[u]); + } // Save the upgrade library tiddler var pluginFields = { title: upgradeLibraryTitle, From 0836fb7184638fd4af9cb0fde1ce9d7989c1c5e9 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 14 Apr 2020 12:08:15 +0100 Subject: [PATCH 0592/2376] Makelibrary.js: Minor refactoring --- core/modules/commands/makelibrary.js | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/core/modules/commands/makelibrary.js b/core/modules/commands/makelibrary.js index ae5977844..c2e15ef37 100644 --- a/core/modules/commands/makelibrary.js +++ b/core/modules/commands/makelibrary.js @@ -51,20 +51,9 @@ Command.prototype.execute = function() { } } }; - var pluginsPaths = $tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar); - for(var u=0; u<pluginsPaths.length; u++) { - collectPublisherPlugins(pluginsPaths[u]); - } - - var themesPaths = $tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar); - for(var u=0; u<themesPaths.length; u++) { - collectPublisherPlugins(themesPaths[u]); - } - - var languagesPaths = $tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar); - for(var u=0; u<languagesPaths.length; u++) { - collectPlugins(languagesPaths[u]); - } + $tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins); + $tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins); + $tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins); // Save the upgrade library tiddler var pluginFields = { title: upgradeLibraryTitle, From dc82365956c804630646720a5af4b9ce8e64c292 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 14 Apr 2020 15:19:03 +0100 Subject: [PATCH 0593/2376] Update copyright date in license --- license | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/license b/license index 1aea47592..25ae1f1a4 100644 --- a/license +++ b/license @@ -1,7 +1,7 @@ TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com) Copyright (c) 2004-2007, Jeremy Ruston -Copyright (c) 2007-2018, UnaMesa Association +Copyright (c) 2007-2020, UnaMesa Association All rights reserved. Redistribution and use in source and binary forms, with or without From 69c8058b72acf2955cbba9205725316e35502110 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Tue, 14 Apr 2020 08:52:56 -0700 Subject: [PATCH 0594/2376] Add has:index (#4540) * has:index * has:index * has:index docs * has op examples * has op examples * operator macros typo missing </div> * possible mistake --- core/modules/filters/has.js | 20 +++++++++++++++++-- .../tw5.com/tiddlers/filters/examples/has.tid | 4 +++- editions/tw5.com/tiddlers/filters/has.tid | 7 ++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/core/modules/filters/has.js b/core/modules/filters/has.js index de24ab67b..192daac70 100644 --- a/core/modules/filters/has.js +++ b/core/modules/filters/has.js @@ -3,7 +3,7 @@ title: $:/core/modules/filters/has.js type: application/javascript module-type: filteroperator -Filter operator for checking if a tiddler has the specified field +Filter operator for checking if a tiddler has the specified field or index \*/ (function(){ @@ -33,7 +33,23 @@ exports.has = function(source,operator,options) { } }); } - } else { + } + else if(operator.suffix === "index") { + if(invert) { + source(function(tiddler,title) { + if(!tiddler || (tiddler && (!$tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) { + results.push(title); + } + }); + } else { + source(function(tiddler,title) { + if(tiddler && $tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) { + results.push(title); + } + }); + } + } + else { if(invert) { source(function(tiddler,title) { if(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand] === "")) { diff --git a/editions/tw5.com/tiddlers/filters/examples/has.tid b/editions/tw5.com/tiddlers/filters/examples/has.tid index 57941bd94..4f9654bd1 100644 --- a/editions/tw5.com/tiddlers/filters/examples/has.tid +++ b/editions/tw5.com/tiddlers/filters/examples/has.tid @@ -8,4 +8,6 @@ type: text/vnd.tiddlywiki <<.operator-example 1 "[has[color]]">> <<.operator-example 2 "[tag[Concepts]!has[modified]]">> <<.operator-example 3 "[has:field[emptyfield]]">> -<<.operator-example 4 "[all[current]!has:field[doesntexist]]">> \ No newline at end of file +<<.operator-example 4 "[all[current]!has:field[doesntexist]]">> +<<.operator-example 5 "[all[tiddlers+shadows]has:index[foreground]]">> +<<.operator-example 6 "[all[current]!has:index[doesntexist]]">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/has.tid b/editions/tw5.com/tiddlers/filters/has.tid index ed9a536d1..cccb152ae 100644 --- a/editions/tw5.com/tiddlers/filters/has.tid +++ b/editions/tw5.com/tiddlers/filters/has.tid @@ -2,12 +2,13 @@ caption: has created: 20140410103123179 modified: 20190518145446047 op-input: a [[selection of titles|Title Selection]] -op-neg-output: ''without suffix''<br>» those input tiddlers in which field <<.place F>> does <<.em not>> exist or has an empty value<br>''suffix `field`''<br>» those input tiddlers in which field <<.place F>> does <<.em not>> exist +op-neg-output: ''without suffix''<br>» those input tiddlers in which field <<.place F>> does <<.em not>> exist or has an empty value<br>''suffix `field`''<br>» those input tiddlers in which field <<.place F>> does <<.em not>> exist<br>''suffix `index`''<br>» those input tiddlers in which index <<.place F>> does <<.em not>> exist op-output: ''without suffix''<br>» those input tiddlers in which field <<.place F>> has a non-empty value<br>''suffix `field`''<br>» those input tiddlers in which field <<.place F>> exists -op-parameter: the name of a [[field|TiddlerFields]] +op-parameter: the name of a [[field|TiddlerFields]]<br>''suffix `index`''<br>» those input tiddlers in which index <<.place F>> exists +op-parameter: the name of a [[field|TiddlerFields]] or, optionally an [[index|TextReference]] op-parameter-name: F op-purpose: filter the input by field existence -op-suffix: <<.from-version "5.1.14">> optionally, the keyword `field` +op-suffix: <<.from-version "5.1.14">> optionally, the keyword `field` or <<.from-version "5.1.22">> optionally, the keyword `index` op-suffix-name: S tags: [[Filter Operators]] [[Common Operators]] [[Field Operators]] [[Negatable Operators]] title: has Operator From 5c3a19f298c2361993f2e1a77560b3cda4f64ccc Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Tue, 14 Apr 2020 18:14:59 +0200 Subject: [PATCH 0595/2376] Update RangeWidget.tid (#4453) --- editions/tw5.com/tiddlers/widgets/RangeWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid index ddf406ccc..934b28f6e 100644 --- a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid @@ -19,7 +19,7 @@ The content of the `<$range>` widget is ignored. |min |The minimum value to be able to be set by the `<$range>` widget.| |max |The maximum value to be able to be set by the `<$range>` widget.| |increment |The minimum amount by which a value may be changed. Defaults to 1.| -|default |The default value displayed if the field is missing or empty.| +|default |If the field is missing or empty this is the default position for the widget handle relative to the min and max values.| |class |CSS classes to be assigned to the label around the range slider | ! Examples From 9313d9427d64d6185f4976e4cef886f0f2c9e767 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Tue, 14 Apr 2020 18:15:26 +0200 Subject: [PATCH 0596/2376] Update RevealWidget.tid (#4451) --- editions/tw5.com/tiddlers/widgets/RevealWidget.tid | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid index 754f05598..4716648a3 100644 --- a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid @@ -10,13 +10,13 @@ type: text/vnd.tiddlywiki The reveal widget hides or shows its content depending upon the value of a [[state tiddler|StateTiddlers]]. The type of the widget determines the condition for the content being displayed: -* type=''match'': the content is displayed if the state tiddler matches a specified value -* type=''nomatch'': the content is displayed if the state tiddler doesn't match a specified value +* type=''match'': the content is displayed if the state tiddler matches the text attribute value +* type=''nomatch'': the content is displayed if the state tiddler doesn't match the text attribute value * type=''popup'': the content is displayed as a popup as described in the PopupMechanism -* type=''lt'': the content is displayed if the state tiddler contains an integer with a value ''less than'' a specified value -* type=''gt'': the content is displayed if the state tiddler contains an integer with a value ''greater than'' a specified value -* type=''lteq'': the content is displayed if the state tiddler contains an integer with a value ''less than or equal to'' a specified value -* type=''gteq'': the content is displayed if the state tiddler contains an integer with a value ''greater than or equal to'' a specified value +* type=''lt'': the content is displayed if the state tiddler contains an integer with a value ''less than'' the text attribute value +* type=''gt'': the content is displayed if the state tiddler contains an integer with a value ''greater than'' the text attribute value +* type=''lteq'': the content is displayed if the state tiddler contains an integer with a value ''less than or equal to'' the text attribute value +* type=''gteq'': the content is displayed if the state tiddler contains an integer with a value ''greater than or equal to'' the text attribute value ! Content and Attributes From a8c55781fafb2c27d21aaacc64879cb8123f48e8 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Tue, 14 Apr 2020 18:16:07 +0200 Subject: [PATCH 0597/2376] Update ViewWidget.tid (#4441) ref https://github.com/Jermolene/TiddlyWiki5/issues/4438 --- editions/tw5.com/tiddlers/widgets/ViewWidget.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid index bba220247..3efdb98cb 100644 --- a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid @@ -39,6 +39,10 @@ The following formats can be specified in the `format` attribute: |''stripcomments'' |The field is interpreted as JavaScript source code and any lines beginning `\\#` are stripped | |''jsencoded'' |The field is displayed as a JavaScript encoded string | +!! "WikiText format" + +To display the field content as regular WikiText, for example with working links, use the [[TranscludeWidget]] instead. + ! SubTiddler Access The view widget allows access to the individual tiddlers stored within a [[plugin|Plugins]]. From 4873e9447af8c0e1b2ce880e80848b6af395a586 Mon Sep 17 00:00:00 2001 From: scott willeke <scott@willeke.com> Date: Tue, 14 Apr 2020 09:47:46 -0700 Subject: [PATCH 0598/2376] fix the example path (#4419) --- .../tiddlers/webserver/WebServer Parameter_ path-prefix.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid index 9cd2483e7..365407a65 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki The [[web server configuration parameter|WebServer Parameters]] ''path-prefix'' can be used to set an optional prefix for all paths served. -This example causes the server to serve from http://127.0.0.1/MyApp instead of the default http://127.0.0.1/MyApp. +This example causes the server to serve from http://127.0.0.1/MyApp instead of the default http://127.0.0.1/. ``` tiddlywiki mywikifolder --listen "path-prefix=/MyApp" From 43fdb553b778b1b1f1ab38ab4f5218ddbede2562 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Tue, 14 Apr 2020 12:49:10 -0400 Subject: [PATCH 0599/2376] Reduced indexOf calls in wiki.sortByList (#4275) (#4397) Examined the tests in test-tag. They already cover all the use cases I could think of. --- core/modules/wiki.js | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index f734650de..16f9e12f5 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -580,7 +580,9 @@ Sorts an array of tiddler titles according to an ordered list exports.sortByList = function(array,listTitle) { var self = this, replacedTitles = Object.create(null); - function replaceItem(title) { + // Given a title, this function will place it in the correct location + // within titles. + function moveItemInList(title) { if(!$tw.utils.hop(replacedTitles, title)) { replacedTitles[title] = true; var newPos = -1, @@ -593,26 +595,37 @@ exports.sortByList = function(array,listTitle) { } else if(afterTitle === "") { newPos = titles.length; } else if(beforeTitle) { - replaceItem(beforeTitle); + // if this title is placed relative + // to another title, make sure that + // title is placed before we place + // this one. + moveItemInList(beforeTitle); newPos = titles.indexOf(beforeTitle); } else if(afterTitle) { - replaceItem(afterTitle); + // Same deal + moveItemInList(afterTitle); newPos = titles.indexOf(afterTitle); if(newPos >= 0) { ++newPos; } } - // We get the currPos //after// figuring out the newPos, because recursive replaceItem calls might alter title's currPos - var currPos = titles.indexOf(title); - if(newPos === -1) { - newPos = currPos; - } - if(currPos >= 0 && newPos !== currPos) { - titles.splice(currPos,1); - if(newPos >= currPos) { - newPos--; + // If a new position is specified, let's move it + if (newPos !== -1) { + // get its current Pos, and make sure + // sure that it's _actually_ in the list + // and that it would _actually_ move + // (#4275) We don't bother calling + // indexOf unless we have a new + // position to work with + var currPos = titles.indexOf(title); + if(currPos >= 0 && newPos !== currPos) { + // move it! + titles.splice(currPos,1); + if(newPos >= currPos) { + newPos--; + } + titles.splice(newPos,0,title); } - titles.splice(newPos,0,title); } } } @@ -640,7 +653,7 @@ exports.sortByList = function(array,listTitle) { var sortedTitles = titles.slice(0); for(t=0; t<sortedTitles.length; t++) { title = sortedTitles[t]; - replaceItem(title); + moveItemInList(title); } return titles; } From 65347ae8588efe3a397e8131e47c85c7edb96053 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Tue, 14 Apr 2020 12:49:38 -0400 Subject: [PATCH 0600/2376] Fixed join filter operator to never returns null (#4396) If the operator were passed an empty list, it would return null which could cause some proceeding operators to crash. --- core/modules/filters/strings.js | 2 +- editions/test/tiddlers/tests/test-filters.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 27273ca41..947dad2f5 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -70,7 +70,7 @@ function makeStringReducingOperator(fnCalc,initialValue) { }); return [result.reduce(function(accumulator,currentValue) { return fnCalc(accumulator,currentValue,operator.operand || ""); - },initialValue)]; + },initialValue) || ""]; }; } diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index b0de6f5f0..929abe93d 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -450,6 +450,10 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[[John. Paul. George. Ringo.]] +[split[.]trim[]]").join(",")).toBe("John,Paul,George,Ringo,"); expect(wiki.filterTiddlers("John Paul George Ringo +[split[e]]").join(",")).toBe("John,Paul,G,org,,Ringo"); expect(wiki.filterTiddlers("John Paul George Ringo +[join[ ]split[e]join[ee]split[ ]]").join(",")).toBe("John,Paul,Geeorgee,Ringo"); + // Ensure that join doesn't return null if passed empty list + expect(wiki.filterTiddlers("Test +[butlast[]join[ ]]")).toEqual([""]); + // Ensure that join correctly handles empty strings in source + expect(wiki.filterTiddlers("[[]] Paul +[join[-]]").join(",")).toBe("-Paul"); expect(wiki.filterTiddlers("[[ John ]] [[Paul ]] [[ George]] Ringo +[trim[]join[-]]").join(",")).toBe("John-Paul-George-Ringo"); }); From 7900412fd03fb2a9f2cddad2e2f6da05fffa7866 Mon Sep 17 00:00:00 2001 From: Mandar Vaze <mandarvaze@gmail.com> Date: Tue, 14 Apr 2020 22:32:28 +0530 Subject: [PATCH 0601/2376] Add Mandar Vaze to Individual Contrib. Agreement (#4543) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 5d85304cf..8478285a9 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -391,3 +391,5 @@ Scott Willeke, @activescott, 2020/02/01 @lucible, 2020/02/05 Matthias Bilger, @m42e, 2020/03/11 + +Mandar Vaze, @mandarvaze, 2020/04/08 From bc3e5cda9ec7c34078655934cfdd9c3788e1ee5d Mon Sep 17 00:00:00 2001 From: Mandar Vaze <mandarvaze@gmail.com> Date: Tue, 14 Apr 2020 22:32:50 +0530 Subject: [PATCH 0602/2376] Add details about special tag in usage for ribbon (#4544) Resolve #2581 --- plugins/tiddlywiki/github-fork-ribbon/usage.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/tiddlywiki/github-fork-ribbon/usage.tid b/plugins/tiddlywiki/github-fork-ribbon/usage.tid index 6cb531f22..c6d5311e0 100644 --- a/plugins/tiddlywiki/github-fork-ribbon/usage.tid +++ b/plugins/tiddlywiki/github-fork-ribbon/usage.tid @@ -1,5 +1,7 @@ title: $:/plugins/tiddlywiki/github-fork-ribbon/usage +Copy appropriate chunks on a new tiddler and tag it `$:/tags/PageControls`. Name of the new tiddler does not matter. Only the tag matters. + ``` <!-- TOP RIGHT RIBBON: START COPYING HERE --> <div class="github-fork-ribbon-wrapper right"><div class="github-fork-ribbon"><a href="https://github.com/simonwhitaker/github-fork-ribbon-css">Fork me on ~GitHub</a></div> From 1f313e8555b2604e3ce77bf77891031098fe28eb Mon Sep 17 00:00:00 2001 From: lin onetwo <linonetwo012@gmail.com> Date: Wed, 15 Apr 2020 04:52:11 +0800 Subject: [PATCH 0603/2376] Signing the CLA to start contributing (#4562) My Chinese name is Lin Dongwu, I will use that to sign it. --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 8478285a9..15abe6d3d 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -393,3 +393,5 @@ Scott Willeke, @activescott, 2020/02/01 Matthias Bilger, @m42e, 2020/03/11 Mandar Vaze, @mandarvaze, 2020/04/08 + +Lin Dongwu, @linonetwo, 2020/04/15 From 161643c5da250cb59a6d0247b3475b0588052256 Mon Sep 17 00:00:00 2001 From: lin onetwo <linonetwo012@gmail.com> Date: Wed, 15 Apr 2020 04:53:18 +0800 Subject: [PATCH 0604/2376] Fix: z-index for codemirror hint not large enough (#4551) It is currently covered by other tiddler. --- .../codemirror-autocomplete/files/addon/hint/show-hint.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css index 5617ccca2..91d74dfc9 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css @@ -1,6 +1,6 @@ .CodeMirror-hints { position: absolute; - z-index: 10; + z-index: 999; overflow: hidden; list-style: none; From 69e6da9f5c18d3484a2a9c18bcef828b58378d3b Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 14 Apr 2020 22:02:40 +0100 Subject: [PATCH 0605/2376] Fix link --- .../demonstrations/Tasks/TaskManagementExampleDraggable.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid index 503b1fcaf..7b0928ff6 100644 --- a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid +++ b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid @@ -4,7 +4,7 @@ tags: Learning title: TaskManagementExample (Draggable) type: text/vnd.tiddlywiki -This is a version of the TaskManagementDemo enhanced with the ability to drag and drop the task list to re-order them. +This is a version of the TaskManagementExample enhanced with the ability to drag and drop the task list to re-order them. ! Outstanding tasks From 6507397343e5493c68cb2923c5bba3f056988424 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 14 Apr 2020 22:02:51 +0100 Subject: [PATCH 0606/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.22.tid | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 986fb1fc8..8f071b01f 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -75,6 +75,7 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Optimised|https://github.com/Jermolene/TiddlyWiki5/pull/4108]] ImportVariablesWidget to improve performance of global macros * [[Optimised|https://github.com/Jermolene/TiddlyWiki5/commit/18f5333e01eb62ece65a86c457bf8a398f156930]] core SVG images to save approximately 100KB from the core plugin * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4421]] indexer for backlinks +* [[Optimised|https://github.com/Jermolene/TiddlyWiki5/pull/4397]] [[sort Operator]] ! Usability Improvements @@ -118,6 +119,7 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4490]] support for a custom class to modal wrapper * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/091bcfce7d1a9c09140992e649f41ae17d27f307]] [[datauri Macro]] to work with tiddlers with a ''_canonical_uri'' field * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4332]] invaldi HTML produced in ">" in blockquote lists +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4540]] new "index" option to the [[has Operator]] for detecting the presence of data tiddler items ! Bug Fixes @@ -139,12 +141,16 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/665b63ec38b75dfe62009d2f5514682de60e953f]] lack of refresh when ButtonWidget ''actions'' attribute changes * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4534]] the RangeWidget to work in Internet Explorer 10/11 * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/bdc5ac592f17b5ed3bb5ae782e56ced62406d653]] CountWidget to display "0" for an empty filter, instead of "undefined" +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4559]] MakeLibraryCommand to respect environment variables +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4396]] not to return "null" for an empty list +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4551]] z-index for CodeMirror autocomplete dropdowns ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: * [[@activescott|https://github.com/activescott]] +* [[@Arlen22|https://github.com/Arlen22]] * [[@BramChen|https://github.com/BramChen]] * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@donmor|https://github.com/donmor]] @@ -155,9 +161,14 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[@hoelzro|https://github.com/hoelzro]] * [[@Janno|https://github.com/Janno]] * [[@joshuafontany|https://github.com/joshuafontany]] +* [[@inmysocks|https://github.com/inmysocks]] +* [[@kookma|https://github.com/kookma]] +* [[@linonetwo|https://github.com/linonetwo]] * [[@m42e|https://github.com/m42e]] * [[@MidnightLightning|https://github.com/MidnightLightning]] +* [[@mklauber|https://github.com/mklauber]] * [[@pmario|https://github.com/pmario]] * [[@s-l-lee|https://github.com/s-l-lee]] * [[@s-light|https://github.com/s-light]] * [[@saqimtiaz|https://github.com/saqimtiaz]] +* [[@xcazin|https://github.com/xcazin]] From 2f3a95a0b8baf194945da889315c5389eb7f2199 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 10:20:17 +0100 Subject: [PATCH 0607/2376] Plugin Chooser: Display libraries as separate tabs Suggested by @kookma --- core/ui/ControlPanel/Modals/AddPlugins.tid | 29 +++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index f41d17ad1..59ce0cd91 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -164,22 +164,33 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ \end \define plugin-library-listing() +<div class="tc-tab-set"> +<$set name="defaultTab" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}> +<div class="tc-tab-buttons"> <$list filter="[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]"> -<div class="tc-plugin-library"> - -!! <$link><$transclude field="caption"><$view field="title"/></$transclude></$link> - +<$button set=<<qualify "$:/state/addplugins/tab">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass="tc-tab-selected"> +<$set name="tv-wikilinks" value="no"> +<$transclude field="caption"/> +</$set> +</$button> +</$list> +</div> +<div class="tc-tab-divider"/> +<div class="tc-tab-content"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]"> +<$reveal type="match" state=<<qualify "$:/state/addplugins/tab">> text=<<currentTiddler>> default=<<defaultTab>>> +<h2><$link><$transclude field="caption"><$view field="title"/></$transclude></$link></h2> //<$view field="url"/>// - -<$transclude/> - +<$transclude mode="block"/> <$set name=PluginLibraryURL value={{!!url}}> <<close-library-button>> </$set> - <<display-server-connection>> -</div> +</$reveal> </$list> +</div> +</$set> +</div> \end \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] From 01226fbe9079929363ce4b1373ede85f771c5384 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 15 Apr 2020 17:24:46 +0800 Subject: [PATCH 0608/2376] Fix wrong configurations in `tiddlywiki.info` for editions `zh-Hant` and `zh-Hans` (#4564) --- editions/zh-Hans/tiddlywiki.info | 4 ++-- editions/zh-Hant/tiddlywiki.info | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/editions/zh-Hans/tiddlywiki.info b/editions/zh-Hans/tiddlywiki.info index 1f4ca4cdd..d01c467d3 100644 --- a/editions/zh-Hans/tiddlywiki.info +++ b/editions/zh-Hans/tiddlywiki.info @@ -1,6 +1,7 @@ { "description": "Chinese (Simplified) edition", "plugins": [ + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", @@ -9,8 +10,7 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly", - "tiddlywiki/internals" + "tiddlywiki/readonly" ], "languages": [ "zh-Hans" diff --git a/editions/zh-Hant/tiddlywiki.info b/editions/zh-Hant/tiddlywiki.info index 3b80bc084..908c75fbf 100644 --- a/editions/zh-Hant/tiddlywiki.info +++ b/editions/zh-Hant/tiddlywiki.info @@ -1,6 +1,7 @@ { "description": "Chinese (Traditional) edition", "plugins": [ + "tiddlywiki/internals" ], "themes": [ "tiddlywiki/vanilla", @@ -9,8 +10,7 @@ "tiddlywiki/seamless", "tiddlywiki/centralised", "tiddlywiki/tight", - "tiddlywiki/readonly", - "tiddlywiki/internals" + "tiddlywiki/readonly" ], "languages": [ "zh-Hant" From 2b6c87fb4b6bbf3c9ffeff9fceeddf9469d50bf0 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Wed, 15 Apr 2020 13:35:35 +0200 Subject: [PATCH 0609/2376] Remove unwanted whitespace from sidebar links (#4552) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * fix 4532. Links should not add unwanted whitespace, since this causes problems with CSS styling * remove whitespace from tiddler title and add a little bit of margin-right to the tiddler icon. * use default parameters for link handling, which results in less code * introduce tc-viewswitcher class to be able to style icon distance to text --- core/ui/ListItemTemplate.tid | 4 +--- core/ui/PluginInfoDefaultContents.tid | 4 +--- core/ui/PluginListItemTemplate.tid | 6 +----- core/ui/ViewTemplate/subtitle.tid | 6 +++--- core/ui/ViewTemplate/title.tid | 1 + core/wiki/macros/timeline.tid | 5 ++--- core/wiki/viewswitcher.tid | 7 ++----- themes/tiddlywiki/tight/base.tid | 4 ++++ themes/tiddlywiki/vanilla/base.tid | 9 +++++++++ 9 files changed, 24 insertions(+), 22 deletions(-) diff --git a/core/ui/ListItemTemplate.tid b/core/ui/ListItemTemplate.tid index 637864e2e..3887e1263 100644 --- a/core/ui/ListItemTemplate.tid +++ b/core/ui/ListItemTemplate.tid @@ -1,7 +1,5 @@ title: $:/core/ui/ListItemTemplate <div class="tc-menu-list-item"> -<$link to={{!!title}}> -<$view field="title"/> -</$link> +<$link /> </div> \ No newline at end of file diff --git a/core/ui/PluginInfoDefaultContents.tid b/core/ui/PluginInfoDefaultContents.tid index f006d0c60..b5685f327 100644 --- a/core/ui/PluginInfoDefaultContents.tid +++ b/core/ui/PluginInfoDefaultContents.tid @@ -5,9 +5,7 @@ title: $:/core/ui/PluginInfo/Default/contents <ul> <$list filter="[all[current]plugintiddlers[]sort[title]]" emptyMessage=<<lingo Empty/Hint>>> <li> -<$link to={{!!title}}> -<$view field="title"/> -</$link> +<$link /> </li> </$list> </ul> diff --git a/core/ui/PluginListItemTemplate.tid b/core/ui/PluginListItemTemplate.tid index f781bca92..66a2e64b4 100644 --- a/core/ui/PluginListItemTemplate.tid +++ b/core/ui/PluginListItemTemplate.tid @@ -1,9 +1,5 @@ title: $:/core/ui/PluginListItemTemplate <div class="tc-menu-list-item"> -<$link to={{!!title}}> -<$view field="description"> -<$view field="title"/> -</$view> -</$link> +<$link to={{!!title}}><$view field="description"><$view field="title"/></$view></$link> </div> \ No newline at end of file diff --git a/core/ui/ViewTemplate/subtitle.tid b/core/ui/ViewTemplate/subtitle.tid index c3511c4f7..a23026861 100644 --- a/core/ui/ViewTemplate/subtitle.tid +++ b/core/ui/ViewTemplate/subtitle.tid @@ -1,10 +1,10 @@ title: $:/core/ui/ViewTemplate/subtitle tags: $:/tags/ViewTemplate +\whitespace trim <$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes"> <div class="tc-subtitle"> -<$link to={{!!modifier}}> -<$view field="modifier"/> -</$link> <$view field="modified" format="date" template={{$:/language/Tiddler/DateFormat}}/> +<$link to={{!!modifier}} /> +<$view field="modified" format="date" template={{$:/language/Tiddler/DateFormat}}/> </div> </$reveal> diff --git a/core/ui/ViewTemplate/title.tid b/core/ui/ViewTemplate/title.tid index f611d71ab..6abacf18c 100644 --- a/core/ui/ViewTemplate/title.tid +++ b/core/ui/ViewTemplate/title.tid @@ -1,6 +1,7 @@ title: $:/core/ui/ViewTemplate/title tags: $:/tags/ViewTemplate +\whitespace trim \define title-styles() fill:$(foregroundColor)$; \end diff --git a/core/wiki/macros/timeline.tid b/core/wiki/macros/timeline.tid index ecc0c7e7a..b949d0432 100644 --- a/core/wiki/macros/timeline.tid +++ b/core/wiki/macros/timeline.tid @@ -4,6 +4,7 @@ tags: $:/tags/Macro title: $:/core/macros/timeline \define timeline-title() +\whitespace trim <!-- Override this macro with a global macro of the same name if you need to change how titles are displayed on the timeline @@ -17,9 +18,7 @@ title: $:/core/macros/timeline <$view field="$dateField$" format="date" template="$format$"/> <$list filter="[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]"> <div class="tc-menu-list-subitem"> -<$link to={{!!title}}> -<<timeline-title>> -</$link> +<$link to={{!!title}}><<timeline-title>></$link> </div> </$list> </div> diff --git a/core/wiki/viewswitcher.tid b/core/wiki/viewswitcher.tid index 73544ed30..0586aade5 100644 --- a/core/wiki/viewswitcher.tid +++ b/core/wiki/viewswitcher.tid @@ -4,13 +4,10 @@ title: $:/snippets/viewswitcher $:/core/images/storyview-$(storyview)$ \end <$linkcatcher to="$:/view"> -<div class="tc-chooser"> +<div class="tc-chooser tc-viewswitcher"> <$list filter="[storyviews[]]" variable="storyview"> <$set name="cls" filter="[<storyview>prefix{$:/view}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item"><div class=<<cls>>> -<$link to=<<storyview>>> -<$transclude tiddler=<<icon>>/> -<$text text=<<storyview>>/> -</$link> +<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link> </div> </$set> </$list> diff --git a/themes/tiddlywiki/tight/base.tid b/themes/tiddlywiki/tight/base.tid index 62ec25541..347927e9c 100644 --- a/themes/tiddlywiki/tight/base.tid +++ b/themes/tiddlywiki/tight/base.tid @@ -43,6 +43,10 @@ tags: [[$:/tags/Stylesheet]] font-weight: 700; } + html body.tc-body .tc-tiddler-frame .tc-subtitle .tc-tiddlylink { + margin-right: .3em; + } + html body.tc-body .tc-tiddler-frame .tc-tags-wrapper { margin: 0; } diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 0ca784c76..28d551966 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -970,6 +970,7 @@ button.tc-btn-invisible.tc-remove-tag-button { .tc-tiddler-title-icon { vertical-align: middle; + margin-right: .1em; } .tc-system-title-prefix { @@ -991,6 +992,10 @@ button.tc-btn-invisible.tc-remove-tag-button { font-weight: 300; } +.tc-subtitle .tc-tiddlylink { + margin-right: .3em; +} + .tc-tiddler-missing .tc-title { font-style: italic; font-weight: normal; @@ -1400,6 +1405,10 @@ html body.tc-body.tc-single-tiddler-window { ** Storyview Classes */ +.tc-viewswitcher .tc-image-button { + margin-right: .3em; +} + .tc-storyview-zoomin-tiddler { position: absolute; display: block; From de5b0062b5546a03e825f51c08afb07a8a99d24a Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Wed, 15 Apr 2020 13:36:48 +0200 Subject: [PATCH 0610/2376] Add new parameters to fields-widget and fields-operator. (#4433) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * extend fields-widget with include/exclude/sort/reverse and fields-filter with include and exclude params plus DOCS * remove new-line * remove eslint settings * restore old eslint settings * remove typo --- core/modules/filters/fields.js | 25 +++++-- core/modules/widgets/fields.js | 69 +++++++++++-------- .../tiddlers/filters/examples/fields.tid | 8 ++- editions/tw5.com/tiddlers/filters/fields.tid | 17 +++-- .../tw5.com/tiddlers/widgets/FieldsWidget.tid | 3 + 5 files changed, 79 insertions(+), 43 deletions(-) diff --git a/core/modules/filters/fields.js b/core/modules/filters/fields.js index 3cf0047de..671a1e200 100644 --- a/core/modules/filters/fields.js +++ b/core/modules/filters/fields.js @@ -16,13 +16,28 @@ Filter operator for returning the names of the fields on the selected tiddlers Export our filter function */ exports.fields = function(source,operator,options) { - var results = []; + var results = [], + fieldName, + suffixes = (operator.suffixes || [])[0] || [], + operand = $tw.utils.parseStringArray(operator.operand); + source(function(tiddler,title) { if(tiddler) { - for(var fieldName in tiddler.fields) { - $tw.utils.pushTop(results,fieldName); - } - } + if(suffixes.indexOf("include") !== -1) { + for(fieldName in tiddler.fields) { + (operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : ""; + } + } else if (suffixes.indexOf("exclude") !== -1) { + for(fieldName in tiddler.fields) { + (operand.indexOf(fieldName) !== -1) ? "" : $tw.utils.pushTop(results,fieldName); + } + } // else if + else { + for(fieldName in tiddler.fields) { + $tw.utils.pushTop(results,fieldName); + } + } // else + } // if (tiddler) }); return results; }; diff --git a/core/modules/widgets/fields.js b/core/modules/widgets/fields.js index d75a3b6e9..0e32443ad 100755 --- a/core/modules/widgets/fields.js +++ b/core/modules/widgets/fields.js @@ -42,44 +42,53 @@ FieldsWidget.prototype.execute = function() { // Get parameters from our attributes this.tiddlerTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler")); this.template = this.getAttribute("template"); + this.sort = this.getAttribute("sort","yes") === "yes"; + this.sortReverse = this.getAttribute("sortReverse","no") === "yes"; this.exclude = this.getAttribute("exclude"); + this.include = this.getAttribute("include",null); this.stripTitlePrefix = this.getAttribute("stripTitlePrefix","no") === "yes"; // Get the value to display var tiddler = this.wiki.getTiddler(this.tiddlerTitle); - // Get the exclusion list - var exclude; - if(this.exclude) { - exclude = this.exclude.split(" "); - } else { - exclude = ["text"]; - } + + // Get the inclusion and exclusion list + var excludeArr = (this.exclude) ? this.exclude.split(" ") : ["text"]; + // Include takes precedence + var includeArr = (this.include) ? this.include.split(" ") : null; + // Compose the template var text = []; if(this.template && tiddler) { var fields = []; - for(var fieldName in tiddler.fields) { - if(exclude.indexOf(fieldName) === -1) { - fields.push(fieldName); + if (includeArr) { // Include takes precedence + for(var i=0; i<includeArr.length; i++) { + if(tiddler.fields[includeArr[i]]) { + fields.push(includeArr[i]); + } + } + } else { + for(var fieldName in tiddler.fields) { + if(excludeArr.indexOf(fieldName) === -1) { + fields.push(fieldName); + } } } - fields.sort(); - for(var f=0; f<fields.length; f++) { + if (this.sort) fields.sort(); + if (this.sortReverse) fields.reverse(); + for(var f=0, fmax=fields.length; f<fmax; f++) { fieldName = fields[f]; - if(exclude.indexOf(fieldName) === -1) { - var row = this.template, - value = tiddler.getFieldString(fieldName); - if(this.stripTitlePrefix && fieldName === "title") { - var reStrip = /^\{[^\}]+\}(.+)/mg, - reMatch = reStrip.exec(value); - if(reMatch) { - value = reMatch[1]; - } + var row = this.template, + value = tiddler.getFieldString(fieldName); + if(this.stripTitlePrefix && fieldName === "title") { + var reStrip = /^\{[^\}]+\}(.+)/mg, + reMatch = reStrip.exec(value); + if(reMatch) { + value = reMatch[1]; } - row = $tw.utils.replaceString(row,"$name$",fieldName); - row = $tw.utils.replaceString(row,"$value$",value); - row = $tw.utils.replaceString(row,"$encoded_value$",$tw.utils.htmlEncode(value)); - text.push(row); } + row = $tw.utils.replaceString(row,"$name$",fieldName); + row = $tw.utils.replaceString(row,"$value$",value); + row = $tw.utils.replaceString(row,"$encoded_value$",$tw.utils.htmlEncode(value)); + text.push(row); } } this.text = text.join(""); @@ -90,11 +99,13 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ FieldsWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || changedAttributes.stripTitlePrefix || changedTiddlers[this.tiddlerTitle]) { - this.refreshSelf(); - return true; + if( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || + changedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse || + changedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) { + this.refreshSelf(); + return true; } else { - return false; + return false; } }; diff --git a/editions/tw5.com/tiddlers/filters/examples/fields.tid b/editions/tw5.com/tiddlers/filters/examples/fields.tid index decfec7ca..dedf3879c 100644 --- a/editions/tw5.com/tiddlers/filters/examples/fields.tid +++ b/editions/tw5.com/tiddlers/filters/examples/fields.tid @@ -1,8 +1,12 @@ created: 20150118134611000 -modified: 20150118183206000 +modified: 20200129165627964 tags: [[fields Operator]] [[Operator Examples]] title: fields Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[[HelloThere]fields[]]" "fields of HelloThere">> -<<.operator-example 2 "[tag[Common Operators]fields[]]" "fields of all tiddlers tagged as [[Common Operators]]">> +<<.operator-example 2 "[[HelloThere]fields:include[list title text non-existing]]" """fields of HelloThere using a "short list" of fields. Fields are only shown, if they exist""">> +<<.operator-example 3 "[[HelloThere]fields:include[list title text]sortby[title list text]]" "fields of HelloThere special sorting">> +<<.operator-example 4 "[[HelloThere]fields:exclude[list title text]]" "fields of HelloThere using the exclude suffix">> +<<.operator-example 5 "[[HelloThere]fields[]] -list -title -text" "fields of HelloThere, using several filter runs instead of exclude suffix">> +<<.operator-example 6 "[tag[Common Operators]fields[]]" "fields of all tiddlers tagged as [[Common Operators]]">> diff --git a/editions/tw5.com/tiddlers/filters/fields.tid b/editions/tw5.com/tiddlers/filters/fields.tid index dd4404ac3..e2f16d348 100644 --- a/editions/tw5.com/tiddlers/filters/fields.tid +++ b/editions/tw5.com/tiddlers/filters/fields.tid @@ -1,14 +1,17 @@ +caption: fields created: 20140924115616653 -modified: 20150203184828000 +modified: 20200129165038748 +op-input: a [[selection of titles|Title Selection]] +op-output: all the field names contained in the input tiddlers +op-parameter: <<.from-version "5.1.22">> optional: a [[list of field names|TiddlerFields]] +op-purpose: select all field names of the input titles +op-suffix: <<.from-version "5.1.22">> optional: `include`, `exclude` parameter list tags: [[Filter Operators]] [[Field Operators]] title: fields Operator type: text/vnd.tiddlywiki -caption: fields -op-purpose: select all field names of the input titles -op-input: a [[selection of titles|Title Selection]] -op-parameter: none -op-output: all the field names contained in the input tiddlers -Each input title is processed in turn. Its list of field names is retrieved (in no particular order) and then [[dominantly appended|Dominant Append]] to the operator's output. +Each input title is processed in turn. Its list of field names is retrieved (in no particular order) and then [[dominantly appended|Dominant Append]] to the operator's output. + +<<.from-version "5.1.22">> If the `include` suffix is used, fields are only included, if they exist. It doesn't matter, if fields have a value. The `exclude` suffix is there for convenience, since it would be possible to use a second filter run. For more info see the examples. <<.operator-examples "fields">> diff --git a/editions/tw5.com/tiddlers/widgets/FieldsWidget.tid b/editions/tw5.com/tiddlers/widgets/FieldsWidget.tid index b96c72aef..62402a5cc 100644 --- a/editions/tw5.com/tiddlers/widgets/FieldsWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/FieldsWidget.tid @@ -25,6 +25,9 @@ The content of the `<$fields>` widget is ignored. |tiddler |Title of the tiddler from which the fields are to be displayed (defaults to the [[current tiddler|Current Tiddler]]) | |template |Text of the template (see above) | |exclude |Lists of fields to be excluded (defaults to "text") | +|include |Lists of fields to be included, if the field exists. This parameter takes precedence over "exclude" | +|sort |Sorts the fields by name (defaults to "yes"). Set to "no", if "include" order should be retained! | +|sortReverse |Reverses the sort order| |stripTitlePrefix |If set to "yes" then curly bracketed prefixes are removed from titles (for example `{prefix}HelloThere` converts to `HelloThere`) | The `stripTitlePrefix` attribute is used when building TiddlyWiki Classic; see `editions/tw2` in the TiddlyWiki5 repo. From f21d01324192ccebb5f42b3d799b4d2b3a083d7e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 15:27:53 +0100 Subject: [PATCH 0611/2376] jsontiddlers macro: parse "spaces" parameter as integer --- core/modules/macros/jsontiddlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/macros/jsontiddlers.js b/core/modules/macros/jsontiddlers.js index 735f02693..eeaf70d3a 100644 --- a/core/modules/macros/jsontiddlers.js +++ b/core/modules/macros/jsontiddlers.js @@ -27,7 +27,7 @@ exports.params = [ Run the macro */ exports.run = function(filter,spaces) { - return this.wiki.getTiddlersAsJson(filter,spaces); + return this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces)); }; })(); From 7cbe766bde0c3abe17e27e618e869b275e177101 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 15:28:03 +0100 Subject: [PATCH 0612/2376] Utils: ParseInt should specify a radix Thanks @pmario --- core/modules/utils/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index dfb70aa0c..7f00f05bb 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -806,7 +806,7 @@ exports.parseNumber = function(str) { }; exports.parseInt = function(str) { - return parseInt(str) || 0; + return parseInt(str,10) || 0; }; exports.stringifyNumber = function(num) { From 22802b4be869392bb4b952ba24a3716e1d24d720 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Wed, 15 Apr 2020 16:51:21 +0200 Subject: [PATCH 0613/2376] Action create tiddler improvements (#4436) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * add $template and $overwrite parameter * documentation for new parameters + 4 new examples * remove unwanted files --- core/modules/widgets/action-createtiddler.js | 27 ++++++++++++-- .../ActionCreateTiddlerWidget Example 1.tid | 26 ++++++++++++++ .../ActionCreateTiddlerWidget Example 2.tid | 28 +++++++++++++++ .../ActionCreateTiddlerWidget Example 3.tid | 28 +++++++++++++++ .../ActionCreateTiddlerWidget Example 4.tid | 28 +++++++++++++++ .../ActionCreateTiddlerWidget Template.tid | 8 +++++ .../widgets/ActionCreateTiddlerWidget.tid | 35 +++++++++++++++++-- 7 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid create mode 100644 editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid create mode 100644 editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid create mode 100644 editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid create mode 100644 editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Template.tid diff --git a/core/modules/widgets/action-createtiddler.js b/core/modules/widgets/action-createtiddler.js index 879f0d68d..d1d1786f7 100644 --- a/core/modules/widgets/action-createtiddler.js +++ b/core/modules/widgets/action-createtiddler.js @@ -9,7 +9,7 @@ Action widget to create a new tiddler with a unique name and specified fields. (function(){ /*jslint node: true, browser: true */ -/*global $tw: false */ +/*global $tw:false, require:false, exports:false */ "use strict"; var Widget = require("$:/core/modules/widgets/widget.js").widget; @@ -36,9 +36,15 @@ Compute the internal state of the widget */ CreateTiddlerWidget.prototype.execute = function() { this.actionBaseTitle = this.getAttribute("$basetitle"); + this.hasBase = !!this.actionBaseTitle; this.actionSaveTitle = this.getAttribute("$savetitle"); this.actionSaveDraftTitle = this.getAttribute("$savedrafttitle"); this.actionTimestamp = this.getAttribute("$timestamp","yes") === "yes"; + //Following params are new since 5.1.22 + this.actionTemplate = this.getAttribute("$template"); + this.useTemplate = !!this.actionTemplate; + this.actionOverwrite = this.getAttribute("$overwrite","no"); + }; /* @@ -57,7 +63,7 @@ CreateTiddlerWidget.prototype.refresh = function(changedTiddlers) { Invoke the action associated with this widget */ CreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) { - var title = this.wiki.generateNewTitle(this.actionBaseTitle), + var title = this.wiki.getTiddlerText("$:/language/DefaultNewTiddlerTitle"), // Get the initial new-tiddler title fields = {}, creationFields, modificationFields; @@ -70,7 +76,22 @@ CreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) { creationFields = this.wiki.getCreationFields(); modificationFields = this.wiki.getModificationFields(); } - var tiddler = this.wiki.addTiddler(new $tw.Tiddler(creationFields,fields,modificationFields,{title: title})); + if(this.hasBase && this.actionOverwrite === "no") { + title = this.wiki.generateNewTitle(this.actionBaseTitle); + } else if (this.hasBase && this.actionOverwrite === "yes") { + title = this.actionBaseTitle + } + // NO $basetitle BUT $template parameter is available + // the title MUST be unique, otherwise the template would be overwritten + if (!this.hasBase && this.useTemplate) { + title = this.wiki.generateNewTitle(this.actionTemplate); + } else if (!this.hasBase && !this.useTemplate) { + // If NO $basetitle AND NO $template use initial title + // DON'T overwrite any stuff + title = this.wiki.generateNewTitle(title); + } + var templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {}; + var tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title})); if(this.actionSaveTitle) { this.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable("currentTiddler")); } diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid new file mode 100644 index 000000000..5e4e84432 --- /dev/null +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid @@ -0,0 +1,26 @@ +created: 20200131142401129 +modified: 20200131152023958 +tags: ActionCreateTiddlerWidget +title: ActionCreateTiddlerWidget Example 1 +type: text/vnd.tiddlywiki + +\define testCreate() +<$action-createtiddler /> +\end + +This example will create "New Tiddler", "New Tiddler 1", " New Tiddler 2" and so on + +``` +\define testCreate() +<$action-createtiddler /> +\end + +<$button actions=<<testCreate>> > +Create Tiddler +</$button> +``` + +<$button actions=<<testCreate>> > +<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +Create Tiddler +</$button> - Clicking this button, will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid new file mode 100644 index 000000000..089ab4763 --- /dev/null +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid @@ -0,0 +1,28 @@ +created: 20200131144828713 +modified: 20200131152102232 +tags: ActionCreateTiddlerWidget +title: ActionCreateTiddlerWidget Example 2 +type: text/vnd.tiddlywiki + +\define testCreate() +<$action-createtiddler $basetitle={{$:/language/DefaultNewTiddlerTitle}} $overwrite="yes"/> +\end + +This example will use the base title defined in [[$:/language/DefaultNewTiddlerTitle]]. + +It will overwrite the tiddler, if the button is clicked several times. + +``` +\define testCreate() +<$action-createtiddler $basetitle={{$:/language/DefaultNewTiddlerTitle}} $overwrite="yes"/> +\end + +<$button actions=<<testCreate>> > +Create Tiddler +</$button> +``` + +<$button actions=<<testCreate>> > +<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +Create Tiddler +</$button> - Clicking this button, will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid new file mode 100644 index 000000000..325499fc0 --- /dev/null +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid @@ -0,0 +1,28 @@ +created: 20200131145355658 +modified: 20200131152045990 +tags: ActionCreateTiddlerWidget +title: ActionCreateTiddlerWidget Example 3 +type: text/vnd.tiddlywiki + +\define testCreate() +<$action-createtiddler $basetitle="base" $template="ActionCreateTiddlerWidget Template"/> +\end + +This example will uses a base-title and a template: [[ActionCreateTiddlerWidget Template]] + +It will create: "base", "base 1", "base 2" and so on + +``` +\define testCreate() +<$action-createtiddler $basetitle="base" $template="ActionCreateTiddlerWidget Template"/> +\end + +<$button actions=<<testCreate>> > +Create Tiddler +</$button> +``` + +<$button actions=<<testCreate>> > +<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +Create Tiddler +</$button> - Clicking this button, will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid new file mode 100644 index 000000000..b116ee5e7 --- /dev/null +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid @@ -0,0 +1,28 @@ +created: 20200131150229551 +modified: 20200131152051626 +tags: ActionCreateTiddlerWidget +title: ActionCreateTiddlerWidget Example 4 +type: text/vnd.tiddlywiki + +\define testCreate() +<$action-createtiddler $basetitle="base" $template="ActionCreateTiddlerWidget Template" aa="new field aa" bb="new field bb" /> +\end + +This example will uses a base-title: "base" and a template: [[ActionCreateTiddlerWidget Template]]. + +There will be new fields "aa" and "bb" which are added to the new tiddlers. + +``` +\define testCreate() +<$action-createtiddler $basetitle="base" $template="ActionCreateTiddlerWidget Template" aa="new field aa" bb="new field bb" /> +\end + +<$button actions=<<testCreate>> > +Create Tiddler +</$button> +``` + +<$button actions=<<testCreate>> > +<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +Create Tiddler +</$button> - Clicking this button, will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Template.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Template.tid new file mode 100644 index 000000000..d737f5677 --- /dev/null +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Template.tid @@ -0,0 +1,8 @@ +created: 20200131145608087 +modified: 20200131150801682 +tags: test +title: ActionCreateTiddlerWidget Template +type: text/vnd.tiddlywiki +x: x + +This is a tiddler used as a template in: [[ActionCreateTiddlerWidget Example 3]] \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid index ed2ffbb90..ca02c2285 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid @@ -1,6 +1,6 @@ caption: action-createtiddler created: 20161020152745942 -modified: 20190604113017742 +modified: 20200131151847266 tags: Widgets ActionWidgets title: ActionCreateTiddlerWidget type: text/vnd.tiddlywiki @@ -23,9 +23,38 @@ The ''action-createtiddler'' widget is invisible. Any content within it is ignor |$savetitle |A text reference identifying a field or index into which the title of the newly created tiddler will be stored after it is created | |$savedrafttitle |<<.from-version "5.1.20">> A text reference identifying a field or index into which the draft title associated with the newly created tiddler will be stored after it is created. This is useful when using a sequence of action widgets to create a new tiddler, put it into edit mode, and position it within the list of its parent tag | |$timestamp |Specifies whether the timestamp(s) of the target tiddler will be updated (''modified'' and ''modifier'', plus ''created'' and ''creator'' for newly created tiddlers). Can be "yes" (the default) or "no" | +|$template |<<.from-version "5.1.22">> The title of a template tiddler, that will be used to create a new tiddler | +|$overwrite |<<.from-version "5.1.22">> If set to "yes", it will overwrite existing tiddlers. ''Be careful!'' | |//{any attributes not starting with $}// |Each attribute name specifies a field to be created in the new tiddler | ! Examples -<$macrocall $name='wikitext-example-without-html' -src={{ActionCreateTiddlerWidget Example}}/> +<<< +<$macrocall $name='wikitext-example-without-html' src={{ActionCreateTiddlerWidget Example}}/> +<<< + +--- + +<<< +<$transclude tiddler="ActionCreateTiddlerWidget Example 1" mode=block/> +<<< + +--- + +<<< +{{ActionCreateTiddlerWidget Example 2}} +<<< + +--- + +<<< +{{ActionCreateTiddlerWidget Example 3}} +<<< + +--- + +<<< +{{ActionCreateTiddlerWidget Example 4}} +<<< + + From 74eb7e8031bb76c586286213f774a108f01a26a8 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 15:58:02 +0100 Subject: [PATCH 0614/2376] Release note update --- editions/prerelease/tiddlers/Release 5.1.22.tid | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/prerelease/tiddlers/Release 5.1.22.tid index 8f071b01f..201b52179 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/prerelease/tiddlers/Release 5.1.22.tid @@ -16,6 +16,7 @@ Plugins [[can now|https://github.com/Jermolene/TiddlyWiki5/pull/4259]] be loaded The [[plugin listing|$:/core/ui/ControlPanel/Plugins]] and the [[plugin chooser|$:/core/ui/ControlPanel/Modals/AddPlugins]] in the control panel feature several improvements: * A new ''"Updates" tab'' listing all upgrades available from a plugin library, and a button to update all of them with one click +* Tabs are now used to display plugin libraries within the plugin chooser * The plugin chooser now displays plugins that provide add-on functionality to another plugin as nested ''"sub-plugins"'', making the main listing easier to navigate * Plugins may now declare dependencies that are ''automatically installed'' without user intervention * All plugins are now displayed more consistently, including a concise, informal name (in addition to the description and title) @@ -119,7 +120,9 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4490]] support for a custom class to modal wrapper * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/091bcfce7d1a9c09140992e649f41ae17d27f307]] [[datauri Macro]] to work with tiddlers with a ''_canonical_uri'' field * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4332]] invaldi HTML produced in ">" in blockquote lists -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4540]] new "index" option to the [[has Operator]] for detecting the presence of data tiddler items +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4540]] new "index" option to the [[has Operator]] for detecting the presence of data tiddler items +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4433]] the FieldsWidget with an "include" attribute and more sorting options, and the [[fields Operator]] with new "include" and "exclude" suffixes +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4436]] ActionCreateTiddlerWidget with attributes for specifying a template and for controlling overwriting existing tiddlers ! Bug Fixes @@ -144,6 +147,7 @@ See the [[pull request on GitHub for more details|https://github.com/Jermolene/T * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4559]] MakeLibraryCommand to respect environment variables * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4396]] not to return "null" for an empty list * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4551]] z-index for CodeMirror autocomplete dropdowns +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4552]] unwanted whitespace within sidebar links ! Contributors From 8dd13bdb205e57917a2a95545f54f280c3a5ee10 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 16:10:54 +0100 Subject: [PATCH 0615/2376] Preparing for v5.1.22 release --- .../Releasing a new version of TiddlyWiki.tid | 2 +- .../prerelease/tiddlers/Release 5.1.23.tid | 37 +++++++++++++++++++ .../tiddlers/hellothere/HelloThere.tid | 2 +- .../tiddlers/releasenotes}/Release 5.1.22.tid | 5 ++- 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 editions/prerelease/tiddlers/Release 5.1.23.tid rename editions/{prerelease/tiddlers => tw5.com/tiddlers/releasenotes}/Release 5.1.22.tid (99%) diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index 1bfabebd2..c745fae33 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki # Ensure the new release banner image is up to date # Update ''master'' with changes from ''tiddlywiki-com'' -# Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `editions/tw5.com` +# Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `core/wiki/config/OfficialPluginLibrary.tid` # Move the latest release note from the prerelease edition into the tw5.com edition # Adjust the release date and the ''released'' field of the latest release tiddler (eg, [[Release 5.1.3]]) # Ensure [[TiddlyWiki Releases]] has the new version as the default tab diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid new file mode 100644 index 000000000..9bb68bfd8 --- /dev/null +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -0,0 +1,37 @@ +caption: 5.1.23 +created: 20200401124910939 +modified: 20200401124910939 +tags: ReleaseNotes +title: Release 5.1.23 +type: text/vnd.tiddlywiki + +//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...v5.1.23]]// + +! Major Improvements + + +! Translation Improvements + +* + +! Performance Improvements + +* + +! Usability Improvements + +* + +! Hackability Improvements + +* + +! Bug Fixes + +* + +! Contributors + +[[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: + +* diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid index 8eb1a6672..b5f33311a 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid @@ -1,6 +1,6 @@ created: 20130822170200000 list: [[A Gentle Guide to TiddlyWiki]] [[Discover TiddlyWiki]] [[Some of the things you can do with TiddlyWiki]] [[Ten reasons to switch to TiddlyWiki]] Examples [[What happened to the original TiddlyWiki?]] [[HelloThumbnail - TWEUM2017]] -modified: 20190910152313608 +modified: 20200415160825341 tags: TableOfContents title: HelloThere type: text/vnd.tiddlywiki diff --git a/editions/prerelease/tiddlers/Release 5.1.22.tid b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.22.tid similarity index 99% rename from editions/prerelease/tiddlers/Release 5.1.22.tid rename to editions/tw5.com/tiddlers/releasenotes/Release 5.1.22.tid index 201b52179..fa2cb78df 100644 --- a/editions/prerelease/tiddlers/Release 5.1.22.tid +++ b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.22.tid @@ -1,6 +1,7 @@ caption: 5.1.22 -created: 20200401124910939 -modified: 20200401124910939 +created: 20200415160825341 +modified: 20200415160825341 +released: 20200415160825341 tags: ReleaseNotes title: Release 5.1.22 type: text/vnd.tiddlywiki From efb121e016ac7d822e8135c83959ef1ab93b828c Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 16:11:52 +0100 Subject: [PATCH 0616/2376] Update readme for v5.1.22 --- readme.md | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/readme.md b/readme.md index d7f266e90..8e64f085c 100644 --- a/readme.md +++ b/readme.md @@ -1,20 +1,8 @@ <p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is a complete interactive wiki in <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/JavaScript.html">JavaScript</a>. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h1 class="">Join the Community</h1><p> -<h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWiki</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li><strong>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</strong></li></ul><h2 class="">Developers</h2><ul><li>The <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiDev.html">TiddlyWikiDev</a> group for developers: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWikiDev</a><blockquote><p>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</p></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/tiddlywikidocs</a> +<h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWiki</a><blockquote><div>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</div></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</li><li>There is also a discord available at <a class="tc-tiddlylink-external" href="https://discord.gg/HFFZVQ8" rel="noopener noreferrer" target="_blank">https://discord.gg/HFFZVQ8</a></li></ul><h2 class="">Developers</h2><ul><li>The <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiDev.html">TiddlyWikiDev</a> group for developers: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWikiDev</a><blockquote><div>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</div></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/tiddlywikidocs</a> </p> -</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><p><code>npm install -g tiddlywiki</code></p><p>If it fails with an error you may need to re-run the command as an administrator:</p><p><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</p></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><p><code>tiddlywiki --version</code></p></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.21"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> - <g fill-rule="evenodd"> - <path d="M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z"></path> - </g> -</svg> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><p>npm install -g tiddlywiki@5.1.13</p></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> - <g fill-rule="evenodd"> - <path d="M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z"></path> - </g> -</svg> New in: 5.1.20</span> First, there can be zero or more plugin references identified by the prefix <code>+</code> for plugin names or <code>++</code> for a path to a plugin folder. These plugins are loaded in addition to any specified in the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a>.</p><p>The next argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p>For example:</p><pre><code>tiddlywiki --version +</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><div><code>npm install -g tiddlywiki</code></div><div>If it fails with an error you may need to re-run the command as an administrator:</div><div><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</div></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><div><code>tiddlywiki --version</code></div></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.22"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <span class="doc-icon"><svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z" fill-rule="evenodd"></path></svg></span> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><div>npm install -g tiddlywiki@5.1.13</div></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.20</span> First, there can be zero or more plugin references identified by the prefix <code>+</code> for plugin names or <code>++</code> for a path to a plugin folder. These plugins are loaded in addition to any specified in the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a>.</p><p>The next argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p>For example:</p><pre><code>tiddlywiki --version tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen -tiddlywiki ++./mygreatplugin mywiki --listen</code></pre><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"> - <g fill-rule="evenodd"> - <path d="M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z"></path> - </g> -</svg> New in: 5.1.18</span> Commands such as the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ListenCommand.html">ListenCommand</a> that support large numbers of parameters can use <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/NamedCommandParameters.html">NamedCommandParameters</a> to make things less unwieldy. For example:</p><pre><code>tiddlywiki wikipath --listen username=jeremy port=8090</code></pre><p>See <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for a full listing of the available commands. -</p><h1 class="">Upgrading <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p>If you've installed <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html">TiddlyWiki on Node.js</a> on the usual way, when a new version is released you can upgrade it with this command:</p><pre><code>npm update -g tiddlywiki</code></pre><p>On Mac or Linux you'll need to add <strong>sudo</strong> like this:</p><pre><code>sudo npm update -g tiddlywiki</code></pre><h1 class="">Also see</h1><p><ul class=""><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFileSyntax.html">MultiTiddlerFileSyntax</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFiles.html">MultiTiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Generating%2520Static%2520Sites%2520with%2520TiddlyWiki.html">Generating Static Sites with TiddlyWiki</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/How%2520to%2520build%2520a%2520TiddlyWiki5%2520from%2520individual%2520tiddlers.html">How to build a TiddlyWiki5 from individual tiddlers</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520TiddlyWiki%2520for%2520GitHub%2520project%2520documentation.html">Using TiddlyWiki for GitHub project documentation</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520a%2520custom%2520path%2520prefix%2520with%2520the%2520client-server%2520edition.html">Using a custom path prefix with the client-server edition</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Building%2520TiddlyWikiClassic.html">Building TiddlyWikiClassic</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Customising%2520Tiddler%2520File%2520Naming.html">Customising Tiddler File Naming</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Environment%2520Variables%2520on%2520Node.js.html">Environment Variables on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Scripts%2520for%2520TiddlyWiki%2520on%2520Node.js.html">Scripts for TiddlyWiki on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Serving TW5 from Android</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Working%2520with%2520the%2520TiddlyWiki5%2520repository.html">Working with the TiddlyWiki5 repository</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Microsoft%2520Internet%2520Information%2520Server.html">Internet Information Services</a></li></ul></p><p><em>This readme file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></em> +tiddlywiki ++./mygreatplugin mywiki --listen</code></pre><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.18</span> Commands such as the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ListenCommand.html">ListenCommand</a> that support large numbers of parameters can use <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/NamedCommandParameters.html">NamedCommandParameters</a> to make things less unwieldy. For example:</p><pre><code>tiddlywiki wikipath --listen username=jeremy port=8090</code></pre><p>See <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for a full listing of the available commands. +</p><h1 class="">Upgrading <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p>If you've installed <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html">TiddlyWiki on Node.js</a> on the usual way, when a new version is released you can upgrade it with this command:</p><pre><code>npm update -g tiddlywiki</code></pre><p>On Mac or Linux you'll need to add <strong>sudo</strong> like this:</p><pre><code>sudo npm update -g tiddlywiki</code></pre><h1 class="">Also see</h1><p><ul class=""><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFileSyntax.html">MultiTiddlerFileSyntax</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFiles.html">MultiTiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Generating%2520Static%2520Sites%2520with%2520TiddlyWiki.html">Generating Static Sites with TiddlyWiki</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/How%2520to%2520build%2520a%2520TiddlyWiki5%2520from%2520individual%2520tiddlers.html">How to build a TiddlyWiki5 from individual tiddlers</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520TiddlyWiki%2520for%2520GitHub%2520project%2520documentation.html">Using TiddlyWiki for GitHub project documentation</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520a%2520custom%2520path%2520prefix%2520with%2520the%2520client-server%2520edition.html">Using a custom path prefix with the client-server edition</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Building%2520TiddlyWikiClassic.html">Building TiddlyWikiClassic</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Customising%2520Tiddler%2520File%2520Naming.html">Customising Tiddler File Naming</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Environment%2520Variables%2520on%2520Node.js.html">Environment Variables on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520Prerelease%2520on%2520Node.js.html">Installing TiddlyWiki Prerelease on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520custom%2520plugins%2520on%2520Node.js.html">Installing custom plugins on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Scripts%2520for%2520TiddlyWiki%2520on%2520Node.js.html">Scripts for TiddlyWiki on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Serving TW5 from Android</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Working%2520with%2520the%2520TiddlyWiki5%2520repository.html">Working with the TiddlyWiki5 repository</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520a%2520plugin%2520from%2520the%2520plugin%2520library.html">Installing a plugin from the plugin library</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Microsoft%2520Internet%2520Information%2520Server.html">Internet Information Services</a></li></ul></p><p><em>This readme file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></em> </p> \ No newline at end of file From 1a6be5ae09de1289727e9a981560d295cf8f361a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 16:13:55 +0100 Subject: [PATCH 0617/2376] Version number update for 5.1.22 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2fc00f9ee..c1d927700 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.22-prerelease", + "version": "5.1.22", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From 00686fc0022d1beefaabcf2ffca2d440e9ff1b59 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Wed, 15 Apr 2020 16:23:19 +0100 Subject: [PATCH 0618/2376] Preparing for v5.1.23-prerelease --- bin/build-site.sh | 2 +- core/wiki/config/OfficialPluginLibrary.tid | 2 +- .../prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid | 2 +- .../tiddlers/system/PrereleaseOfficialPluginLibrary.tid | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/build-site.sh b/bin/build-site.sh index 94d77203a..cdb3292aa 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -5,7 +5,7 @@ # Default to the current version number for building the plugin library if [ -z "$TW5_BUILD_VERSION" ]; then - TW5_BUILD_VERSION=v5.1.21 + TW5_BUILD_VERSION=v5.1.23 fi echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]" diff --git a/core/wiki/config/OfficialPluginLibrary.tid b/core/wiki/config/OfficialPluginLibrary.tid index 39717937d..1a0f47d2c 100644 --- a/core/wiki/config/OfficialPluginLibrary.tid +++ b/core/wiki/config/OfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/library/v5.1.22/index.html +url: https://tiddlywiki.com/library/v5.1.23/index.html caption: {{$:/language/OfficialPluginLibrary}} {{$:/language/OfficialPluginLibrary/Hint}} diff --git a/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid b/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid index d32a95711..145d7959f 100644 --- a/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid +++ b/editions/prerelease/tiddlers/system/PrereleaseLocalPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/LocalPluginLibrary tags: $:/tags/PluginLibrary -url: http://127.0.0.1:8080/prerelease/library/v5.1.22/index.html +url: http://127.0.0.1:8080/prerelease/library/v5.1.23/index.html caption: {{$:/language/OfficialPluginLibrary}} (Prerelease Local) A locally installed version of the official ~TiddlyWiki plugin library at tiddlywiki.com for testing and debugging. //Requires a local web server to share the library// diff --git a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid index 9b2794ef0..7d517f8c7 100644 --- a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid +++ b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/prerelease/library/v5.1.22/index.html +url: https://tiddlywiki.com/prerelease/library/v5.1.23/index.html caption: {{$:/language/OfficialPluginLibrary}} (Prerelease) The prerelease version of the official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. From 90469679a564d26d1188b7784800d8cb9e2bb228 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 18 Apr 2020 15:52:15 +0100 Subject: [PATCH 0619/2376] Placeholder banner for v5.1.23 We'll have another competition --- .../tiddlers/images/New Release Banner.png | Bin 10370 -> 44302 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.png b/editions/tw5.com/tiddlers/images/New Release Banner.png index c2f727e54bd939eb88267c8c26582a4ea2c1ce8b..924f12b6dfc4f8cf3e80fec4ef1e4d759d21fe63 100644 GIT binary patch literal 44302 zcmeEu^-~-{w>B(`ySuwD?(XjH?jBqh3+@^$xD$d02rTXr+#M1;c<_(+-nw;v`2K~v zRa4vB(=$8O=k$5HpY!y@s;kPOA`u}$K|!G^$V+QNK><KeP|!jMa33`TTU{I<KP()i zq|}|H<fPo3-8{A2Ev#&$9lYF~E&SEFpr9C1t<23e6<8QXEiBB<N2iz>kvx4hV`36C z%|k~aXp!A0mMBQEV?(e>(9ojdv?w4V+@P*u2to<_Y51fdEl;aLt0`pJvf}Sz{5R=5 z&|)c6L&n0MHN`7@j8-~woFV}MfmWFF;dL4SqYGvfj}ah<G+GE_St+$bEPh6V@Qk3Z zBA>#Q5)3n{D?cp{{L=RiW^_qG5=%|aQtBKQ+BJJ}FFb!xF$&5G&_D~5QKp*_X8-#o ze7t1xHUSG(&YYo~$?u5v^q7Hwkl+g!D6F5P<jISIpM`K}nqu(FB^PMr;{D^}8kw^k z0vDYqUSKSQX-R~Kf)c)gf<o_uM}tQj9+d;mVPs7N@6LO|!EMRI!R;c8i~JgL7?w5n zmnEZzgIfxGe-G9D=%}Je$Y0<7_xE1>*Y|f{4)q&SxM&!EC|pXL3!af*&mVoxZ=<hZ ztD*wM^if8Dg8u9P1^g&Me;h;~$A@{o0{*840Qw5^KV@j4|D2Sl9QkM|4y7P1q3s8K z_7gtCTF;;D$=6rsH)vBtL;&7F)}f5hh7yrdoG$0g4rHD;@v|-amCZC{B4lM^qQ`V1 zq-Q7U8;5b@H<xhMCJ>f_d>94{*4Ko+1L65}!QTxhCn4JpmtHkBwY6RaUNr%4B3i+! z1%ehuZk2BD4%x3qpNonxl%m5Z%@GIy|MiuD0XU@1(3`0F-zow?To@)nEyDjcQ};w5 z05kreYDOXc@2mcE@kbMw|7-Gp{qkR)^ncDk`G14tf5OWD=M002Y$I6~QV@(767ZB0 z(ZRLKMAJ1#YHM%DW~#IzS@21MZ+g@1)c82(^KnEQHWNVS%CovQQ7ITzjH9|bNr6R| z4foInt9A$edFA?fWu=4WpF)z7CrkOdG-p(>Z$d9B8m*1FpYnF!xLz6AimslnJgykz zi&4n8gf7<JX2P;zdYVk4hc;}^=-{@z;#3YoB2~*gK!d_i{tlatb0Q>i?d9Ae8Zsxo z^TfPn{aW)RZfa}JK$-lq*Wr7~x%`-=p|1?s4}J(~RRJLkN+{~KER4n-Ic~OD^!_MT z^y{9DEvu+?lkN<ZE5}|>y1*3h4uKE{kvf>f!MJ<tMAey^GCTd<^}!XTVTw|Ypx`L@ zNj(>Z-hPe`cW5~iqx>hR^!7UsKx=djYv<?Ex4Mam5_)45l)qy`!KYmIDfx*kLud{9 zslQn~NKdTX9VF9YB{CS{l!C@5n98~VCOQIkMWU&Q7suHr1=&2><4fL&PX_b4^oJ=W zk*WOl-yG}bli!8!oqh|#9S*LB2yAW9+p(cp&fbmH_TJ5~C9=|LXBak^8L&I8Ioc2+ zSj<+VrE!Mv);Y?HIdXH*RZ3u}<)5bq%XQfhY;$2p%=IrJD0k||2mUVbbwjL|VsxdU z`+ZS#87Ki4J!~zxh#azi)1E%l>J}woPA|Aifk+MiEwz};9lwTp@1M59kaW5B;Oy?{ zSI5X!5bg0!x2043+17XCEcRNq1sD8a@}+N!E_Y8q9=|Nk@qw7sdV^F=`4=cLR_tGI z#+*~UJ$|u=6LT*N9j;9n9-g?cYMS7_rWolErq`clAOB7gIX!@USM_&&ml0U!DC<x) zPul^pzJ+iHa3gC-W&IQ3$3}AE)pk^`NTZ%@r7zYOFC7Tei(VCMr^>JY%oV}HGl`eC zO`6y2VulykUcIcQEM6qGLTQuIIcT|v6~Byhl**J?Jv-g{*D;~`hyI$}N|AAEtAT5` zXB7969^UH&?~>k_lj|BoyJ@>_$dC7Y;hS;)75}fBrJ^0s%Zss=jyFzv3yd6P+O_)6 zZfh(iKk8M)eha}J7?^jx>+?A~ikr5Odt=R5_VaW#5rM~KOXVLTW`*#NYo~>bN=s)m zlWArp)Tb~;;JLg}d|fLpW@wIrjk?T<fDBKrP7S$7%K%b1Fd^Al<Y2j`<`q#D+Hh+S zV`3^|P$W_ibtSSy-f*j)1eW`Lrb`M6j+n<-@Q9;4x@(VZ!G`-Gk^kW+tp9bnSK~Rs zkU6my=l+RIOIif)3hK|dBk!iBR$jhmnb+XM>j3|O+O{zhzJxKgA`!-!i>|NdY<V<z z#Hkzrtp%NN8#c7f>hc$a1hfb7P0)!p>Xl=xRonD|?aAO&qn0?*?eF_jUHm_)^V`u( zWxrBIX+hZg6zmji92mJ*S2&}}yWIs9GktR}Q81@Q7aKGxv=kn>^*|;HfsUspofML~ z47nm<CbgfRbQMre<A|+GQ%TfyK8+MEo+R?D3*nqzYJ2^>$YO2s@Qw)by_6s%Erp|~ zu#WbzKhuhj8vQ`*CBuwN_D)8_@np!TdL=ceF}aGwZPq}au$;r*U9~0uT~J6c6xdeh zf)O_qq2`XMf+jT!;L|{n->;_eQ7|38`h!TzQ9+t-#%SDDtZ?zeJD9>$`es7GVy43J z=pwJZpP@~)C!&uxlSHdOFLgAMI;uSIMx?zi-Q_e7={X#8>%2+DC538n;#Dk2VT~Ql zB26FBnetc@OUk&EJUam*tuJx(WUoc3lDzQ8og87Zagf<bfPGe0)=G_UMJ2T0l`|A* ziW`0#^`j)iCMZaGe3&_Z0alZMRgHuXaq?y2yv>C9u%cFP`n?~k)AIL{PE+>})r-JC z0>>94=JBH9I!S^na8BrQ_<#5|dnAaI)M@#QF!^{EM%{Y6lh1;$Q-t3(6sp5$GCDlN z5t^mS?8`ZRX;rOav}`LGk`R8nN~DFiVG)R&X)GJYa<4veF5vQ})8gYN!F%_enRfrF zEw7zX=k9da@fC0|_`CkwR?ERyJi4lpQbf>SllIXz?>kO7zL)RcHPiy&*=6J}!zp_6 zC^KK~mfcL!4u(crNrt<9H-mn3KMg0Qk({eNwC-2$xZf3ttS=!<IwRorUDAPbdoWgF z<c+Ircj^ibU~ha?_bYoxLvrx}37vr>7dtLyN12R5{<6TY1{&9r=s8M^Iy%FL%UgaT z;R8AW5$6b0OHFQJmps+((9cmz6-@r~wY=g)9u6z3KOJXm)KhsN4kc!3IouVRrGMN? zX*p!g6~B5DfBb7ozGL51!-n!^%*3tz)O$AGr#UxidJ`7ez?;wrrJJ}eSN-@Mn?7kp zHXrE;3yQl2z72}+O_&OPSP>qoo=EbRju<izF1{{oeg_+tBliWpp6T2RmW&7~Ip2Zu zC}qYPX#~`uAycaqF|IvUu%uzQfiaw0X1fHe1dNPQc?6UTXT$22rXV32MP=e$>$MXF z$Jp*xH;pYva@pXa-sJ}}cK<kvhoLpT3_LyOOtt)nq*joj7&iD%_WtJQ{@yenpqc+g z^2gdnl@xfDEG-IxCcPfKo!9mm>q7YSds~-0@K1sFL!y(4B^*h+n<>5TMu!O&=vIxw zbYW#hK1pu99};q|;`BXZxSVm5%945A@ZkJguY?pSLj&RpdD>uAL8@D52gvz%U?yhH zBNblXBON#v>Q?DC)%aVKL`M}b(`~<JHbYr)&pq29<t|l1775^6*FKy{J2S@`d|nQ8 zm9V%ao<;k24{s4F0<*O_R;sS&lZo#gb|{(zJ15m?oV#fKTKmLcMsSuZFNjuMp0-e? zAt7*nk@+CPZM`_vQ0c{+ZR~7WcjTbWq?T>Wx9Fn0`oe#cw9ETzc?$%!jWBa0C^5jz zbnoKN{BF+Wzxw4%^*fTWVmI{ta22@yt4wxuJa{^CCK(@=q^k5R6fgyb`6u1!wQnnP z&KFM-P$YXI$Bef3idxXU&J(io$V}ySjb<?4Iih3PaK5zK?=I9<kQpT7t_&a^@ZYTt z`5g?OHe|Vpyl7=QI{>YLKW<<)1xnv{el{mSaIB_A$Fx}Rf@DVh%Yscx5N7YvpPujj zsv9I%b@Jr28ZiX}JJPrnsy;&LM!>7i_0*-<1+2yX7YAcc2)a98ySX!;S#wJS^pTwF zQ|Y3Pj^}>E#Nk!t1GHM5#E8y5VZC1ISFg!0#0~Re7WZa#4_`=2M`vP2CXs2bB^mlr zW=*3`WY*+8bPPfs+G*$#P}cPEXPkF+tbJHz^iyC*=X_Xj%^d=Ou00{yK{vZ{i#gd5 zEci&Yv5e%Oxn*fLxYV#1{S879i7!+?pB1!kGKjrBa%mP;4F=d43v9`V`zQ%0`|9i_ zeOQYm3%tqbij@OtWIZJAJ#97mgqoun0zVOGfw9u|Hix9oXSU$z<hbzn_V_ot0v3#m z3|53oo#C*E_nh-wc%B8htpgK)c|B|5=#KgDV3jO!Rw!#w69$rbFk3H!e|E5*z+91~ z@QZY}ZY}M<R<e&6J1284Q@;YqXwwx0Laxh%ANr9!FJ7X83=(fwrUHGcnePZTL(-`` zFT)$B&Uogb80qwElQ;`p-LmaM9=nC_HoWFS?pcJZ`@QuFk2m@1&1#{~H$2%&Pc-W# zU|<Y;D23SR{u`gCkgMg9hns8=aG(K3)LA_wA|b{-w|DOu)N;w=euCPexeLpSV~cvm zl)ZO_X4ypY;w7rYOCDcU{L;cLViOmSIbmA1a}*3QY^3*#L>|k6o{K-1lLFyng~Dc6 zGY9uGn}SdA9(SHYqzsKpyid0}Tv6R$1>9j72kD1-swkpzzZRr6Sn)OoxN_X}BTQP( zA|D%4gD9b0k~x5i7~u2M(&o^|p?S3lvCyODEzdj><B6YYQ3(l2V_LmI8mdKI459yo z-euOZ+GXQhRlHkUTG`SsL>0{_80FdTW4zNE9q$H#H=^E+iE)sZ=j>h<v9)JxIpZMX z?~PQ6$s_dR2Ro_Q*URM3a*vzaA-!ka&PLWNu4|2^FhDG|#OBfo-h|^hREhQe99OC) z%cAFqM93s5v(P+7M+U~u7vYatC$;}!#OLJE-k^IghigqVtgl-PIl&`LPPC>v?3p^K zbE{l5<gW*I2a<AjG>?-Zf1+D!BTuP3zApAHnE`oO1;$0!&*db{$yU4gR7~ZOVqIWq zh+5WT^_CbK26;JjDT`hvv%hu<iSX=Gk{Un@<<!)4$XUkJw<G-n##lfcX+C-j_u7)o zD%B4^qR_+%fyD&K3*n_MTA=vDXA9NA9(3-MHV5uihSw)@9o{1`J}s~5)TnXFEAMQ8 zUB^>UXbpOPPKGV0H@H;e!J@wMjB>0=Cje|GPfje>cwrBqEi4Xtp~F7~`}yhjTo-Mt zkHsst$eUW~C?YY}5|`Cf7}NwgpBmmhKad4;&I(WY+$1_JL&=#V347nU?Fc~&6+FTr z<(~`u=*>f7#80JqaRr~nHL9~HMT=un%+BfKDzFs>+#3i$N0>-Q-i*e3l_u&fNl2=H z?pyLNRd*EcN<^F-MlU!^jV}<X8IGly_xn?UdaB*p*ZA;8-~8peqo%j%1~2N0?c5YA zHqz3lA`L$UA7h|{esM1ZC9(nqyw44mF68H9fQcAr6p9;OvZr<z@jJ67(n{+e8+5O6 zWF!6^bwLa^VDO|g#m@p(<glzuMJ|)sAY`xrrZ6#cip1`;4J9EEn}m0XObs2K(m_hv zDqw7NSQlrg7JzzRu!EF8gi;gG>~rTxtF_N4Z$ZJKj#bLcsI|#aj1}P=tBZ3|`f-yM z%UUJ@OXMc3Z#7!gy0kP#G%-XYvfpjm=x;@m3Qtm;eCm?R*xFm$ss^LB<T3^s{I7JY zY~QYP@Nj90WX+KPR*ig!18}yN`^gh_7q5ULMft+ku65LC0emEmIDJM_8+&)LARc8z zWbeSPWJ>h~1dw#diUZCZ7~d=eHo2fia1YAJU?06nM-weV>z=+-lf(9qe(m{CC$N9o z<H-Lu!LueYLpf~Fng*7F{Yf_0>qonw^)r<!m0CVO^k_Z@cf`f7!WhRN<0o{q951Q> zDJxSI8W7~(_;-r&ep2LHHr!lBlg5|w94w<&FlCLFj#t#Uc^@K*l%brBHg6VDc6Rb7 zwSKxh6}2aeFYF1`5L~%Z#gSi-KzIt#TdbQIgj$KpzCOz2ZhopAK8m;)t}?nm#*^=F z&V#t$JMgJUoIJ!2YHY}G4vRwZ&XJ@jK){j|2nm0rxx1B>U|3CD#64ln-VTM*vC_|w zW%t({eS6JgS&~ys8RFhDlE>mc2Sr-g!Y>hNfS|wd22-;H_gy?Xu;f&Bb;y-7EdwB5 zWm>)49gTH-a-$RiMavg)kGIG~e>U>u35dJ9w8gOUzFg;+)|?~><L0=$`L$A;ZP&JO zD7)XWyGYXMH~YNP8{_~o=%B}083bklz8&&68yL@?8)0svweAWDQ?LECRaNA(hio+8 z(FZcI;s?76=Eej_kiv>2Cm%O=nO|xL1ETpp`0Wd+w(V3()P}%{6L&8+*<f8{0mDxU z&c{VV3}?8ri)e9agpUzPWk6K&dM41#@uZysT@&*nk>$hg98n`^Sru|FL;}{}0l=+& za0MNpWGU7?%shm~+NhSVZtmK&aH@wKM>Ns|Voh2r!(BnVFiV(5NhZbwscCp}XeRHn z*LzPkEZ`I#g**o0>^I7ks2D72QW)tB5UTIhm3(m;5ea$?JsUsRp_d;4p_CHDGTV9L zaePcJ1M5!3&kN$^RtGD<ikb-UNdmBK1cMulU|6qA_%ZZ`BAA}W+yoE+rJDFYia17` z8@zV9_8@LNuSDAXZsqCK$?c&2q3EeqMDHuXoB3<@o|owt-uqfgkne|?dqBQ+GX?W+ zP*Qb#qk@RaEV2V8?RcuZ{<}OO?|q1vV^T_5+`|=<$mOs<VW?BE_%lDFb(~zBcH0J- zs+$ovJYe1|&94uj!UgfAesVpAWOO{0&1Q3+=3byb_oWV61G4VCcDi_Y)G1TDXK!LU zGz+99)3Y3HXpEvJm7#!eT#pD^COV4KW@q!c(D0mi0a0NY8D1c-lhoWMIb6+*<IyXw zGy*d1G58xZQ|xJF8~2>UXxmbzTtyz7QVlZJZ60!p@Ry%|u$l&iyP9m}PL_7fBigJH zSZsh_h)b@-slXOy;+&eMs&}mTa<_2$1!s-thnLLq)@dma>D*6^D%f~wcn5OuYhyo3 zBAL$?=GXIb<)2nONgyMzQF&zR3x1z~va}$mcuoR(Fl9pq0&HGocs7Piq{&Ze^OZ%5 z?4P2^SUIVEY;wk+oFV!X_ikmTIj-v$)QK5qtKffi>!G}xJF11ENl0hmcp5e8(fmLQ z8hWrr<w0!Zd|%qh{1(s^4_DUp=n;k0Xd3R<Y-*_M6;;RBq>ac-<;roixCSL8bGTGK z7zRcaFyK>pKGiCa=~H@Xxt`bajRK75qn?L~&9_2@-V-U_ei3*dW<>7!f`8Q2)y|G= zgf-~w{Ht;*>|Fm75ly=`(EXNUO1@RzKAib79Gd{IKNlG$6*FgeEe8eNyXGV!Yn>oX z1JPK<{nP~XdA_pZ$sIwehlE5RL{Sz_P(#jShe}a=+{U0s3pvCY;Q)~pex~A28cj4N zxe2#QD{CLen`xcGqFKoP(z$Yh{r8@z!wHNWA%IS1A^!LVJL72Xt)$`uZc4{LY<N3% zKCdq7?_+h@+9_v~&vYCsxSil7)CR#7!PUO9Kp9FfA!*bjjAo};Y3JxWj>o%^$>Fey zoUXjS@Lb73`5?li14d45JNt4t!n2x}7OOVsCnuS2VqLzhIwKnkY(U&Fua@O!byAH= zNYJ^EpStYlz!s^m8cfWtD8mL8WzcJozvQ;+K@C=KIH+Cdz5Aa*O-(y?9R@|z2J<se z_(6ePvlt9aK&Jg)7&+2ZxyQ`2^o?%r!Eom&cG*F?G8t~Ye{(|l%J#k~npH`Tleur^ zY7kt_bt#Qe(p#*dV{3)1@XaWr4Is4dTIF=9^xY59rb+f6gNFD-lr6D=?_d0-XQmEG zdW(LDOKsU}I(enjU|&2gOn7c0dmop$rRnMda?R2(GUb=#9Jk+s)0EK^hJgED%sn_d zN{^lU#3&*40hEm3D`&-*;nD(ZA%^V~K8W&4Ju0-6`80y|P-(6@KO>k}*&%coyf_qC z97i3x{pD5DqKnQ>EbqA#k^a!VEUJ_>`C9GXJbtl-8nmZEw_BJLI;b)B6^qdF9DCsS zDlu*r>nA2lXo@Z_qyMh^sl3V)zZ#1>QW@;+Exoll1NKB2#J}*$X95#befh^M4`Cx) zge+`Xt3YC$F>JvFoCeWfPPB=!d4!<^adD#butY@fR!%a6k$fPuM=@%GlC$u}zHVNc z?*{Kjx=39aLAqR$NJ-*LeK5=ud{utI!V)IYxu7j{b%o$RQI`sqe~v_j13hZ*9?qkL z<eD+ecs@kLN_(l&zc2~ty|2b5CV#|g0=R&HfrI4lJqNV-^SRsRZ@qAu=?uI4!6D*4 z&aSzkNqGLS)U3MH>X^g^YxpLco%)0d=KsdFCrfBR@W~{)?LF5>Ba9}MVf^SieStEG z2?_iQuc`_%nGI6c3X`8SnSCve*mc}n|9o|{=rc=tPNdN!dbS`K-qbK0v-7kM{0~)3 z5l7fAChmY9cYh9N*uEH&85~14lgtq@AR{o#saIO+>RCW$ePgFX_Oz<NA6kadZmTUT z_p~4o$@Dg8PcCVaU>;=gLXbosr6j_=rz0dyzj}?BU?~XGFezapjU^zuP7m7f?O<X( zSQgi!07m2HMt5sq5R@z~tudYd7Sj09!4@HBO)>qYzDb4<<_J<eFe*SxMuDcjTt&&+ z?NGDVhfQGi#Hm%8VT4RfVY=DbputPw$RShjO~d+6+YiX{5EMcVn@gEWNTlG{vTGG1 z7}Wh!Em|)4#(%0Wfz-U`d5uGAM^pN14JQWllkivRz{9U6!7G7NStYvU9HBi(4s9=U zrCCn2sdWhylY<Cl3)B%XX#|9``X(7!_{RNEnfb$kV5d$Zx#thC@Z<ed>RC%)@tfUv zhwc^!1ME>KU)-DcAkN0(ePj%Of+ru(9;{J;q8oGmNxH3?&94bWN(YZdx&Y2oHu_ny zK+8`S2edT@t=l4^Mm_18A*C-me~|DD4wN3dZ$a2HTQ4jFfKN`kF=rd$un={!|4`k3 za!rGt4uVEf_}w^o^^R=XY=yRsSqg4?Z|3*EcEvcyq50rMpHfS0{xKGiB1yrqP1Md4 zjNO0P`tid*_obKo>GGy)bQ+Bm%s>NLWglxhj@Ajydv$tyjgB$yZT8|4-dlzE!EXxf zC~ft?y`n!!7N}FPA;SbF>Gi8d@x}?Z;phTNU&Z8+MZ|b=7-CThWnzVI__RV-;%tIS z6f4(fPD=4L>G9HkizA?z?OCD^x{l${AnY2Avzu+5q~a@@G$Pf=!hTAHwgWIT;bQ6V zkEj*M9+uq>JwSQ(#WU^qjRgEf^_xeHbkQYlz8F2s`*NtW+>lB^6?!dDyMA)#wchGf z-sL9!kza`<5m>Aw{mhGi#YD}eRpa_@jwMYCU3y1}K`@Q>EMfU1ZvMnYb-}1N6+*#d zQRd;3Q6fei*Tcg)wDbl|aBz#;T-;x7SfczIV=?fSh3Q&(@5^S_aJk=e`o6->6(puG z#6OIE|BG=&|4FtcDu_Idkyh#Nn>7I{ss-4t@_C<-Y>7y7vN6bje?EjRT`tM0irke- znCp1l_uC^0awMb!B|{={o;`0l3VVd+xx89ZQzf4re1+;K!l-=zWA$01It7hX1W9L^ zpNS2b%y~PxKFozcwz~(3v8#`Yy2&Ouej|7S&7d{E4{AVRDsk~Tsf&H2rd8y+ls<VP zitQ8c38D;^l{8&D&WZ+qEa^g0LUc_Zu?c;bIwH#cyFOD0@LtqQ){$vq!NJ1WS$bI9 zdL(UtDOk%c%;2djs(ZJZi=@g}$eMij(rQ`hnDiY|c8(|SR;t`nL!GXq2^VrBnv4I- zx%2*TXs9OqmMj>PmO7pG88(R8@<hdw@!SIlciJ_z2RrWk%{WZETU|iR<4Kw5+t>l^ zil~q}z>DZ&Ar&L%a6*Ttn5nGg78Z+OCR5O?_*V!u(>`az#W>vHv^X;p6EmTh_t(r! zXuMSTNHz18JxcOZy>A)q8(yECH#<1VwTnsCJ8W}b?u~rMkm0Atw<^`fL1!1*8F9ld z(!=b4TSG%Tf*(H=VbDwLyqkwIj7afN`^5aG*K1Df;d2G-Zn4C!a)b3d@Y2E#{!ln` zciQ+hVq<l%RbhU3h`sf=sN3727;#-saG@$o%bS0sZ5A?NMM=H?Tg`6+SD|l3GiKd6 zqGr!VX&gy!G-!&Jb7K1#3aE>6f4nF#H8>+g{Vg|)`~{$#A3xc_AD4+5*MPANix_M@ z`TX4mY6AFGf$a4~FWL|1ldH{hzgDaFGxrd><@-6WoMNm%jI+N|KjI%vCgkhB4=<>Y zG=V<K!pp}8lrE8|7%UxhPcB@R7?GKgC^Lr4%od|8jAxJOaHSq~K;)F$eLrn<=;G#w zS~#W3xHc$!zV=<V&DB1WJ>=QoI6Qz+=!9MfKl{@DhVXE{Rcq0}0=H93+I1;7rjx@j zb&|yzsy3RwsC-Wj;?`^r{CD|;+Mpzj2py`0I|4vBb9Pf@C&aQ<L?CcdicLV%Pk&z6 zc%JoPJ2{{MjaH^%9}Ev9l~D#eYtn&Pw^SI3K(_Ctj@(J?&=@(~v2#Hll6mKe+#)?f ze0*x--Z^H4fxEDP<2Pt(z9bHxoOy=7d=HF44FF=&)v#%AG>PspLW_<FN~^wqOf+`y zduQe=#ijR$G8{~I8UTwQ$pymIQAt?7i9_i<DZwLBjg*!+rqSVVZoPLQt3OXqy8lW0 zH}<qCZoOx1UPrl!!mcv`p9Y*`1f2^Ai@{F&S3+eBTtwH+n^41o1MU~tSaPqsP_hrI zCnuG)r_DCaM74K@OsGJ8czFurLFb0iq(iM)Isyn60x@by2@K8?gDi6LkP{b8^y@PB zdCKQ+8+al5i5r^AwJF@+azH0xN`OD<FrlXn2OemIOoa3{x#pqip(ta)OM5+CK^;Lh zzuituj$u24rREpNB?YfHZrJ%>!W;y|s*-6IT!lzESd@<d)SyW+{A|Hx0R|_%NT&|m z&$~`qTBUIFR@6RyyZI8|YJ=*+(wQB#v2v(KlBuU5Ie5JA)_9%lyax}84eOZhj;@Yr zy)S>sCr&bdRVUa64y}D*dYo$CW_Z|o=Mq@wiCHxp_s;J~;dh`<zlgN$TGxEqT!l39 zGNWywcyL7M2}iC-DOCeY0`bwDT_In&txK4qz-`9objAr-0mZnYSGi1Au~IIGfC0Pa z?f!wQ#<AC$_gg1+r%YVT+T@(<0lDO3^V&;sL~uwDqg+Tyii&I8_jv!;sZ%Ph(4FxE zxg=7l?|}rKC^ydh3S|cLF=lX5y|OsA#0+4I3c^`7XMmKwt~e4G$PcesV;D^7?_nzM z!2Cq=Qer3@c0$b?u>3VYX0BSHBPalt$@VYs$lG@_GeXuQq<$FkWOUh~auK}4QLjf* zW@XKmF=|{w6Yb)BjgoqhPwv`X|IGWlmt)7FS{j1_+!qFhg8d^aZmZ#A93Giwr-zEC z3ttf$h=KE>HwIgT99xtg^W;OM_3fY}rv1W@=k9Y#vT@j}lAIp?-|+evv>K96n~;gi zCrirT4&Rfz-r{&yaf<Dh+j|~Tbh+SIZOE0KTUE{TvLMP*j`+_P-J<G%0VK@DPI(v5 zfrw`bX)ym#2o1X`V82bvs!y60EPw!GI-<@Pazg`R32M^E%0Vb)#w!WOeIm=u^zgql za!XGRJrZJrA{*CZzM@sNB$=k^hZWCnc2JT@4$E6iQ-Qq6*jvZ3BBIbaTeHurEa5#{ zzIhcSMw~VW1;Rh9AJBIP%n&8Mb3fYu+cw<_g+iAh-W9{b-#H3hS@y&-V4{gWf8pV) z%QQ)GmdTVy2z@(9N7EWguW?Q?>51D;w0Jy`F1{wQR~t%bHzQey#yL<rfQj${CDr}= z<tJg@VsUd;-JHgNfTAP!Ihjl*M4gz?@kZKhI%fG8bHH$tgFJdDAR#S>Z_~Rz=-5b1 z3Eze{mN8ScO8<%#2+y?SYvlN-h~9Z<qY0K+;RAVJ3bYn6Pd*3o0AIUKmw$NIgl|00 zyF6X1?0%jbor3SZ6mo|gW@|Esgk@{3mOemyUve&+N(6@w0Sy~-b%W*QjGYi~;Njb4 zke-~TSs=tCUUqYuEFO!XQWB|23@rolmsSpI|ATmCnaCSRWR*ZfA&9ROz1Eg@FQuy< zQ>kl5#gyJHzjCD-c^mRA(!C<SZN5rD{p$6dap_X;a)WBUXq*1C>Zh)Iuw=q_DVyk4 z_C4qEG|I+XOp4gA(%^%r;9Mn%RQ&h1V|W409rEclPQ!;h(^kq;`A=O5&38x$C_>0X zN@MZqpK5WUfeF2~P$;a;#$v9E*JJzC%^HNv%Xf(cKf7VCzOQ|$jr!$dB?F=pew=K+ zZl*7UGKZk<XVh>|zRs`kw8Vzv$f6d(40E}EIGBV`&MYEI_^Jc8F4n%1MZOcGVdwIS z33c7)_aInXkVWMyJbKgE*I$iT*44@OLy4Edu1saeN{8oe9VTxV^JWqo$UefZaHCJM z!F2;XFPsIU?f3DN7%YHv_-*@BQ5U4`kmZWe1SPN3khk*eNDaRN6F40?ZC^ho^cu0* z&>iy&o8ln)Ux6b|yq~Y@B!we=q>Enr@mG$STn95;?{F#DI$xkS{uSW$?F#-d#iN4H z4UAN`qyQn<<NG)ccmfo)g{zf@(clhf>A5tjl5?UW^dTC^_^5K{W^+$cc901;8?2oC z{_&?Z6t(8Si;a44SDOC2Txp8s70)&t#i{l>4-f^Mg7I~5=bRwrlnSXX>yjt*Hoa&M zBu`4upF?6xv)S<Nj$Zt+q1B2Ih&5Ig^t3G+A>%J6d@adB7&r<$r@b7Ihzc~$#DG&O zgP{kJd@V(=Z%1k9Ya!R5HocR+{+aq!Qj<qBdRQ70CYow0LN3X^bZ$7^>V0p7K1L$J z{v)Au(c$0Dy*TpemAnBlqrX4eSb{g^BMmzf^=kQ{CX)_JJ8R$ip<zhfHZ#hGs)%A5 z^k`GSqPbY%!~Vx@ev31QUvsY>NdGLkUK9zXFfk(fs373Eu<GKuQBo5#kv+(Cx&ePG z<KQl}GlA%rGKX)=mhtO*sJ-$N9Njl4LBw3B9*mBqC0h&vyN5K7@}mb7|J~Bk6i7b5 zx1y}9Tx(bXM=l@p-vzmU5~0j+!FEtXT8&1WmVXOt+2`F)GWu!KQ40BMQtgA2o5MvW zU9CSJd7erg?fSab*Ez$R`Lt4mK8`%(WqxFCxMFR&B2fiXCg*@Q63iR-z;?g|4+no( zO8(wKV!ncoh5tnus*9kEH33%p12K3Oxaly?&2Z*-j%EI;LB-KvSAK7_T5*8I_tp-? z@6-^|a|{{jQ=p+kLY#!IN*?{!`qhB&(-bmMrogF-ZVJc}5@|vwA$&Q!sb?i~Btgqz z6>9;6qXC0)=;Y?`2Aj_dKNjGS4iJ@FPjH0vPkk#_gV~G2)SrPK{8r!k^aUK7!QiD! zx6RAG8X?acU8ZfdLQ&TD?U6UrBvLWx9O3KmSl)9JOC1Wfm^YGdj!@ugEr$dz@#0sd zzkYD8gQrMit9{1baSJ6VD-O923iwNSF^!3bt8uU8&CT8MeAYt$d}TJ*MTq06mb_jP zD*+QS$6@CD$W$aYKH{r4qO6?0Q<UkipOL%*5zj?V1CM;jg(fgSz@ucSk?Iejf<{|? zGF$%Zryp-?ujr$*e?d=%L>Ge9;F_d`&1Itzg+#vya_7nks|H!~&YOPG!pNT!zGNZ# zJ+C_tG()kWc>dL4H4LT(?3om7#xJc{G||j<^KCJv3N(=xWhn>=@_|5PAy18w79>P0 z0$Psz%s@>7@|{K<`MO5#9UIC@T2MxJ<6jBupj2D!TC3-djJf-Y&E?VWZXx8+-BSM+ z#L44_xi3<4Vt2g1mq%tEE@Cj?0BG3Vx?QBooUW7~*gl{=yGZ!01FieyBpwmfDx>Nk ztdMiXcP{)d+{W>>A<KvWFDZYJzDZe8c<n95ndt_<3_$)Ec|jJEG?%4_kzI2_7puqj zwRg%Co0;SonFBcrqMotvD=%znga8i}<uKKdd@alB3WO7rMnEw2<VbTTrHQqlFx^3* zn{)grunWaf_v^5=AhY`%{_lXJ&j)PGMEHZC?*@OG?~MangYLla5~i{=Jke@cjx>`^ z!@qV2c9`o3`y_ANmI(pn(NJR(#I7c0+~AX@tJ3tr-q6Ph`}@KZ1WmlVtXK=r0aykO zgf4wr5@(lisk5HPortD~?<3{dvNMA&SRNXz&|}C~wb1?!>HsM$EkuQc=3tNES&OQq zmnO7Cl`7K7sE`=K0i*l8zOzw=0-WfN3GQq>DbLBC8;UtT-45^#Dhu5`GXizwyCHo5 zb!xFlf>k3O_^S5!Y`t^M@Q3FJum9r?;%`+{EUv<u)Yu%oBc^jCxjKPB*K-u9ueX>T zzq9U|ti1eQAA>NSIpFrN5pWb+KO?t9$D$YqGv+Qz=ttBG1WMfxWr@q0JqWJ0`8Rj} z8yEF=cn=Yn4?$b`Wi;UcpMOxJ>tb3ZSh5y#&#q{y{RQ_;nu8lKpy+w@V%`CamhCR= zYfv+tyJ#&0(mCH@5+mWeYtNM>PBe!~&|WE^5R+ap(E$bsr=sFXJumuUK^Gl$2Ca&J zYD|@no9gopqV&+D09-ZE-HaVtdI?tLmxz-nb;(Q>B~9HK{D6mzCe;RU`DaUI?v2+c z81%2mcX$Nai<l90eM-@VoZ9SxC)Bk3O9J*By2JaPhtma5yI?K5wZlI0H~qrUM~uHE zwcOo_@`isr4pzHUP-GntNU6Z7v-^Du3k&itCW$nS`Cu*TME^O0l|Ft#Wg4~xLPQke z9J}s3m-q0E)EyitlpHI1)lvM*=S~u_5aTpPY0jm=pzMi;+J?0DpT~(!4g&#~el2<4 zPP(-Z8jdWx3-Y(JmdXSKw}Mut(-<s-fM|#%hTo=&)8Tl%`V789C;EYnyFJ22WSX<s zEYUeHg$QJaID$w4pJZWMz@Q}q9en4sJbL-I<Yqp%#+WR8U)SwdMani$!wyM->k`nc zYvduE^s)y=v->v0vo-7&qfNT7vU)x_!^a>e_*Dy*@L{$8#}fD_&A(@;=~U^;T9NHg zv7|T(3<pXjs)4dpnGhN*#K+<GUTXB$zn>NF7%(-JLNZF{39~2SpV7v8q>9qELuS5> zvGSdbEyGEQ48!pi5=oH|U=aj09{Oep7#daifB#GfP{IUvxfwI-xm8+s@y}~0w}f2t z<N23=A|^K}{e01*XqsP%QaY@;<}#Q4BXhR~xBhy|w_7!-poii?<X;_)CPj3PpWQl| zjD%^<v-&Z83&z|Q2Z(P0=~I>)ycF&zZ~-x?n;#KHL0M}wo?kOqnlo(f;mjmI<kt{5 z*O<`~_t&vVkKcCi^-uB_@v->k`72`#os2)yF*x+PgN}z=-$LQDPDhZmEs=Xs&&{)V zmTDJlHmEt+$WRnc4_3sGL*q;w5RAVdY<Le4nZW+g-!7~vRim5~p$<OYsi~n3ApLc? zT%D9Z9)XN1xW8!`oNYO|Y#UkgZ}VY;lG(_~gnZ(Pn-yaxhbROo6OvM1(AS@2QIWvh zn%<otg$1)foem+1gl6}UAE7m;o)1%`U?;2935Q83X#xubA0-%;rdtbKOFl?7c<<KD z96y+utg|e7*Z*sg*HMWNx_TqGx84O!@NPFReKRS)xNZq8eu}{&=$vVuELa0=>-bE5 zpoFdD&SIeMgm?C5;t{8cmxH(A99r`C%Fwi=B(#^v5M(A-MFSH5zDVRkP8trPBT>14 zltA`pQ4xR&YU?%FcY`I{#Xf_BWwS&=s=7iAn{aOAuV&Q;?aF)>Me3~~=jk~O(LvhR zR(P3)W_70CdUZgjnR$z<p$@s`uBpnx{I|E<TUa<$m57Fbhq}X5yYpbytn4Um?0B+P z*4Crq_;;6=!<2fadvt~O7u{N4RT*kC3@yl1dds=hqD7#kk{D1P1tIOyo46=&ktsM1 zeNGNM{F_=zVEJcJK}~i0Fx!-i1{8yZeEi)j17X{!qN*>??x<sUXWh)VzJ)uB^2xvV z=IOvX6<a2Oq{n|)*sbg9ywnF|3Fn^^48})~%*mVQKZR-H%Ue{9lmOvswMU9es_W5a zc=s&jDnH%bS}T~_Kku#f{+q*J+!S2Yz`-J53%Vcgd96||ydBCLQa33(C~u=>^{*Zd zLGATI*1VaVI7hCDjOw<3U2A3d?V)xpd5k=iuT3i0Z#ZhV`V$3Qo&>3FFrr;H)7UtO zY76M~J7N4}&||oT>^0*@`{}_ZAB#t@UQy{sY167c(_IwJ(ek!mL`EXI1?46*EysSN z5K7))q@uaLU+h7o@fjIXJ;{%JDA{k^{vUx9zNHb>??+G=U2m~XI=&ix-ezM71qh!p z{7zer2nOmR8t13uf{eVGyyd@NP_oAFlKapdUuA;_4(EQ6HpGG2sp^fIhcO8z;WE1Y zm}t_7mSFy~D+a^|bX{-N{1EdFZKx*wsVfq>Dhs;l+P-^Yu`?d0@LscXcn4lfKI4;U z9V;yXIZ9aAb4S{E`Nr4HdW}9ZPvVyOG;|*ieN|G7O@KCADb*6;5QUFL7W*BU6F-2; z!~EvVyq|YRg?$HM-C^;U<Ye_pDGM$ZEqO?sWYoe3=ap<H@V!s#Oc9fX7DNO?G4Wmm zF0RsAg3=I1w_M}GWLZ1jA99hB`kB>AT{HbQ#J8bKn2?&|+~K^9F&YnHU9QW>YcS1y zXtxyb`}-I3aq{Ow1--GhZ&x|MxREEiV_8(m#ca}@FUGU$<a(;f=A2Uj<$=-|@nb-U zFSN%ZhV&B%f_I^UkNV9q^pAep)s;wo$>uq(+d#EeO&ok}qy@pFc|yyvbJC0=FN@Sr z#1=mx$l9&W;rA%xVCA4y{oqa}5?mv^)O;bbdI8QLOrrzJ?>TDRd}=^gh4=Bh3d`5H ze%?BnT9}%N2MQJpvBhh%G@wU}W~*q3HPE%wF)9Uu<JIYYRYG*0M9Hf&{0rhwa%`=H zPjIU%-|!dTC4X%M??xy~amzID*_%^vj(IFKM1c;DCxzkJly3`8$+Djd>Pj&p;x;#a zw}$Xf?815|kyVbGDZ)i0i&GU!ebOiIhf!F0zKlB17BXB2ExW@pGRlPKVBTl7J9#To zUG1g56)r^`E5<c%exX9iUWf*;!HZ^sE3$N*Tg>zfsF?8L2U?vu;`uaw`G<5$l;kOd z<QL7v#DwwwuWQ>}p)q0tl<NUC*>T(exO4D_I)~bQAk)Qjy|p%u|MMTK+2oL0a<SsR zla;JZrg^O~C0d%1&Lhl)ouM<{f^d~Tv+|l<bZfRXKgphgTpuNT>AbzY|M<o?Z?AP* z)H@q&$MJJ)LI~3hUita%I8kA-jC-W$LC%B`1B}NP#HmNaC+b8<sQ&1rLb-$s`U0RT zo+Ya`GEG6hoGY^wb;Q?JfuOt8?G8`oKdJM<o`0nAQOcsNfdRuGIqe`po!>diXj1(U zMKizX)Ab(pxjoVRzOW8;%?zog4W-A>32P`DV(*%UhO}Rib`R16E^1FD>s4HKGkm}} z9I%K`_Qd&eJ=@&I4`+?*Yq9s;{kd{vG}}NDjYU)*K3et~!G5GM?u{t;a@B@7zd6ao z!OEVea9MP6(u>U0Vm3muKkl#H^uKlnoo$Tr>I{EK>ekz*FEZ<m-*tV%j(%s4{xnm- zH$gA<;BDsvQ4pZ-EVPwSuoXXG#sUn0pSYcA`>8<O2RghHxg7yi{#ZE}hzaBnG@ok< zm<(6z?&N&!=(TR+ij&Y09qnVk<=LZ1<zNy_%n129KaQ0)d-$FDwVEwWNBgti4kzgb z4G{w^LVb1M`REu;Zyg@XIg|jK>0A`im)}$N07oUvpY<Y382ZA1E?<^xp@%wymqb7} zOleN&0r{ImK)~~?PQWVzf+C4@)V=SC$3b-xr>R^a&DT-lpQo%M4ryY%VL*4lm<J_n zY~b@F+AF`tRAkWeuG~R825j)iy$f`SXuFZycBjIL6O%Q;cZ&s+g0|EIw_%P_s_hlt z_UCCIT^e9CtmKma-M#z9jjlKVCN-WfOyC$fQ8<sN{{w2nfYC7B&E8j|@d1>F?V$?z z`M#)xtjt{Xrve08R3*_h8EiP*KmKvExfk>v!7@|TAT3I3$uAvzz9EH=PFD|(sw~XQ zhe<tQste}k2t$uWp4j{`{kza^`y=fve(;}t7mLgIeEuKvVqMYet7Ij!P_ej4uWZ>O z`OA`o1K2tI05bo!fO&<s_@>F#ne>e6^Wu1m0e;<}&v66^md(%pZd6N~LNxDxXNuDG zHaq0D9<%u5S(o18IZeEVc>T|+v&*Ua#@M@i{u5A#hc<Ut)c@dMf)RZ!<T4=`0%-P3 zQH0qw<48gM{;xefq7GudrV3E!a-V|Hh%QT@1&@)>&Gf;Qc#Uaf-!#3liVt9y%bBqK z@YAv-Yg0(Zr~)hAayW4GF$<pT9p5T+M>*xihN);lJd4hw5E<f5t}RsYdEUFl^B78X zO9bQQpE4cN;vALfm1+}mVsFWuAo<_P&ewZG{^0SdnhFI1$_;w<Gpn1`6Wsm4rsSfW zzX%CwO+=)X^7fYcDY`Cvtwp}UKUF7JiY<gozn@{xkY`-HQ9jOw2Ah?A^W9w38{H}r zp|<*NQ5+k=4m;1mM!~4ePwj_R$I^K5MzesbP+f~?`uQWIOPYIuZfy7KFeZrlzxVFe zlJk2GQi`Vm+)7)R?9)sT%Zby|sktwL(h%r4uW_U+46B<B9uJi8?^Mo>M_&{y8IWkw zqk*!?zbOq?(X9$cG^6NrR@HKXdpn8d$cw%+BwK`h8ga4fjViD}VDSg~xSG-#=l{Cn z8hY#;+0p*%3tAy1B9ny+zLtzIQEniJh&w3nRB$oN&$hnHf3C3%u*w1}8qNMz9UN)> zX488L@aRAIpbb6iOqhF)tx15k{Q|xuV)M*u!p~_NEzdQhrcTdUQ<_@1=|JOZtuajR z>ZEc<Ym%}_g#o0ZR{4*dXawwV4rR6rQi#F*uxuRe?v&IFX$pRgX+I5Ueyz6(IDBls z%6~)u%`%=#wzRhCvZUhoGmQ6J{O`~OY6hn1vbVG+{WSbDwW5)+WQB61`lT;H@2fpJ zdP1HxyzGj`Rf?YPwp~jhd_Xo>Aa7kw_VRX9Pu18&s@2GWRnb2h;ZL&aG=$eByzGvR zA50{2jlyvY*V-NYL^XE*9@{btBFdAw;%|kyPm^D`HE8`Qldpz36YOXN7^VAOSG_({ z(}E6j^4*Mk4e!YXP_H@b{1q)UHscV*T4Z)NSE#8$bt%U9j3|JCxb^5TpWi|ObCW#E zfOG>$Y9{ycTNKb%@EVYD%f~JI@(uC^9F>NJ-{<zwP&9?K9bcEsL?LMPdejyj-{cm6 zt7t)!@lsK&o78L}^eMxvLL+T%2*!d4Ej)S?ANyxwKxkf0Ga3|LJAW-6&5B;OIn(5K zt{y)i+{P;{dybx6>)BtGs9;mc$E=7k_SP*YBONkpT4Cod&E|8jVB}<VG??<R)L_c^ zjYRlp6nVjHG8>yn`76#UGk)8&jJ$b&YlH<$ju(EH1|x};i)#&PxjlSwyU5}e8bI73 zx;gYi4w%`)FTxsf8>9HfQm&AI6(@<E^)fR_;*IM{mzF88e9qDEv7s$BEKmS@3^_Lb zn&4>cF#f<z^s@A!Nh}(ICH}RTjm@psiEG0x;>w%_DE*CupW^**wVKr`A;I^6^h(bv zUCuQ8_9~V|IVEuSznsI<-(1)_?<}rA-*le&mPb+tXUFz;Vw2<%QSj#%Wj;~*D}W*D z0IsA%V>-))Aor%iSF-r+<OE1#BikqR(zFUm2jz)uEuE<T3L?Y^LoF+Q;1R`{*(b=L z^GLN#J}_G1EZ?Fo-E~qoBNw_I!eibBpS^QgTFRC~rfB4K>861ZFo?m@C)vuvP6RE; z*1gY@SKh<x*EJAjdq1RSni~328Jcyll0(g2$V#>-MZ>ImvPXEvsZJX1d_wd=7e}0B z1dN~mwj=uMZQO_KC0yEd%`aN;bL)VWibCEzrwE6JJwdC&8ty=mRFz41PY2R1W4w2W zAVRLHy~Rs#jivvfKnbV954630lAA7+CMGednoo3fK&{qLs*sZ{=7KlyKwQ5Kfi_Co z9LHdw1oC6_;5wErRs7AzKSG{iHw)4beLD^vS2H!gX<8VY2)d$L-IW``Tw{_{T!i_Z z!;qfT+`?7vf+n9p%}D`D=si+MK+5fnK~(lb7SfCw1S=z=l!2yH?xF@g)&fZ(NDHgD zQ$JLnFXp589KY~VQ@*9-%0&K~t&>Yk(sXkj`&hmO{b%N_xKxi)IdfAaP;@>&^QtL& zHS-Qnmf-3_y-h7g%TB}om%F5oO#uZz+r%*~`_Vk}(wJ{Jqt@50XL~?US4Y7PTSE?8 zhxC`|XDk8)bpAIyK^bLp={1W{V%a@UKoWG4k`!q;`B3;WbTTC1?O*jg)0*}(zRg(3 z3x1`frGuQv4n9$+?heCz715haE=*t>rMfUeotXi>@qU&5Jhqw`b<xvu=%RhI;|*Yp zTZ(^hul0oKd{k-Je0fyqE$x6G5RW1+QgRQFDf63I(jG&m<)i`CK-gJgV>2KafA7)i zOc7({XJboP0rFTBwZWbL^Dcn-raH<$Bge1k9~y`I<1LkQGwy3PM3kXm?wvz<@+*6C zC@fr}7KSk5nX4>C^Dx$T#-6z5F2Cbq5jpj<79}k3Nez<!fD3V)PulH2Y_(Cb;3KXW zJIR3n`LfJzP#W_X@)ECQSSO2~L!uHaJVIeRj<YF}31h5+C(FO9PZdFWdcR!0Sk-IM zJ{qEL;^`w{GlD4*tjrVe1wY&Nms0d<v@Fg-VKU{Id&vVoltxmcLbNQ-ISJ(eeER_M zYWOs#FeR0z{{FZ%5w2arD^B)7z4z2XKWSS=%W2<MYlH(T_ZimH_$7Pa|LCrJL*BLv zEM94@!x6fSQ#49XHLv#qiCI}AHaD7>79K_sQSjzf((weR{ICd+(2)wLZX~bGA|u9* zZ(y1_S^ZwmJO{%C{Exa@ct7vc&p`PIhLw2C%_@!|XJb(0_HlrSASq^a5Qf}9pQE^7 zWHaa&&%f<~MGo2Nznf5NP2P^U{>UkqGhCIx!=SE_SbXS*)~}KS@!w5cK4kwkz>eWx zOWwP;-Zw*6AH?{fSkDWtOQ~!4$lG_tY{1T%ERjk3aJ`GPLV_$z<w2CR-1F3<sK>?c z5vK8jDPQNoy~rP1hJE+FuTl#BJHM<92)$nygPu$ah48*3RRf^U^IM`)!y`Dh?j+*! zA@1q|!4~4Kf4y*avf>2``Ge7b6^xL|4kLQ=&mLz7W84}V#5pauQK+d{1d4Xo=rw14 zx-F5t{CYOdk`Wj`g8U!n(IQCY-nx&%36o{$S8mSDx+^XP<+1R^F5h_h=I=K#^d%8y zb)N1wYvZpI$wCg~uFIb<l+y84|8P$u<5?(wV?e#$TjDM0YiMWqx@-scs@b~8vD(BN zw5O+aZdvKBywIaNMij`&_p89^otRs+c~cBl>g<!IPMY0&306*j8sx)V$mOq={L$T= zRn*$@tdto4m3YtRq=9zMPwDBXw|kd-Wz}b5cKl8YN3KW*_bV)aVbn}fd>!L$vK&)} zkY*wodVgQ>4wKeo<D}<ZYPzj~jxO8HnD@9Uo`~yMU7{D|{{eGBjJ{yTb?`**q<hW< z-$@tPmp~9$zN}gpZa+H(T^}xXkI1P>(oc@@3+p3Zb?quRDnvJt$i^*u|GN)=U%qz# z{d_U6kAYep1cly4N?w$>WYk7slNaVSsz97E#GgoxVk`tUY1e3P{NMx_KV(BW?fydR z%(OS0=MNnBoDB?H3<-<Bo#&0_aC+nfhIt$w9hZ)tAz8jG*w`%eM4}DM^5*6_K(n}0 z((4~_@FaoBmcEd{q}g@;=M<Kw=6^=Mqshd8j1F~68H|jzV?pO45bc(0hr<Rmdn1an z;~X6F?5X_xBD=0Z>rTE`)?<xzmGbKA!(Em4G}Z#!f3!n8EJYQ0F16X#w1AfQ4{O?L zL$43d?Y|%=&U9zh2Y-^o!Cq^~oKRiaS|e0J7hC%FLl4Q<ANZzwKb;_Dkr&#$U^Quf zVMe#AG!|x5X9p*(4(okV5iLer0oB#WF#29dnrLpo$hs9Ec7k>A*#82!In{&mhy!ua z72YL`VwAdgpCBdxML}TLIM19P428f@^3l93c=2Fn{Ub;+P$8X|G$VnT$^JzPKOzQ` z937D1p-wa)xG_ScJAvqzQi+B`y{3{buWnAWVLPjgM>q33f8hdhmfhL=4d2gj_HX{N zXtvZ7k73z)9h|g7r)18vkD8;jE1I0!Q-eT&E~kEda7&MH@-zSX@ajEl<}}a+@eb47 z^TF@`U`F!dY+fLF!3xuixa%Y@eD`q43-ce94M_~4J%$H5l(g~vi32S8v@D(16$gdc z`>!Z%5Q*QgF22b<mnIPxRU`SoEPh)Q1crq|JD6RU=Nhdp{spt|z+iUGO^q0wgN*@0 z5!&ISNAYM>HV*pgHVsBiDU5bVu2If3s~Sy03>QTjACZy4E*0r=)oV(MNM<Hz6kE<n z#(19@W`orTS3cA4LBG=3bLYKB5PNUNqHTWmh97j^a_`RpYjmVnF)oL3cSVeK#OeE~ zvSa6M>C!=f>RZ+aU*+ru@d=gQx;8a?9lmU1ldN5VNk<VS+Pr-A8{hESBURI$<V9^> ze1qNMATNY1Diso?EEO_@31kZEK0zA+zTzbJki=Bbj%05AL6iiBwx3-8k7I_P&<p#! z1>Y74fnh+qY|od1zo*`?1*)S}D}p6Sd=QOy6FK%T8TV<-D&}DSGCb;w;ex?py1SOk zm?TE~HF_dhKXua@j0nrO&n3|SF3NQF{COo%?C@1hr;-e115sux@3R@Ha%8Y`Qinbf zpO6?kGJIwui+OKq2TK-#RC3hS2UQ<9kDM6l1MBhxK41X4Kiv!Rl-sW>F2mg){`kjJ z40csD?HTMcvM!}Bak@%l(2i2_;^RsoL0D__`OoyX^|ck!+uMV-kM)f(p^1&v$OLe4 zUOlV}{+ZKnqqITn>h8(P7&4oi;oR?8XD?(oI$3{KZrMP42gjs;FxU|A<sc51Z{M2r z<Y0F9A3TT~djlx#Uohivv0q4DD502Hioslsj7B4Yp&oWDIij9O<6KG93j?iDjOPGX zQ+<Yc&*AifpK=Za#wFL;lPo$SGjr!(@QlpihFmLTc(4OAt}dN<Q+>x-_=I8}kq&VV z`MwlRDX^q_PLNT3Gz>yJ0voi%NI#6}hg>^^BorgqtoNYjV$|&~JCl$8^f9^jD_@-| zdGQQ(Cy|$k)kfL*=Kjz~H2v?ghB}nF*Z+<s=N&_Z_J>j0z;t$ZO@b1=t|KuR<8^=1 zuZ#au6a<E^K@vlw#-P*A%PtH05pwX*VSOK}kJSD}4R~RQg)IpTkK@mb`G`saQ(p(h zuYrfSh6R22y)e*o=s@{G&5bbnjWAIH!{j6|B#VwPVuwdvx#$_We`X&ba<5qIcU2(` z_hPW>gVbw4?H_dcc@9{f_5Na?Vb_-q0;v>KNM3!QF+B+lSM>E~-?P05<GvJ2+IQd} z;=FvB4H5sd)J7yPkhV-AFHku|VX!+LUW3EYEQ&}ES)DXu5;H#G))3MFaN7UQ-bZo8 z@hDSQ7mUz7(!xI2?P3z?bm9fiTG0>~zUi3|)JR)5Zz?#5**9b$wSz~F;E-#$x%Mw4 zG;VO6jle`R1E8xp2T#{t&|uhReDdONvtKx8KS~1AKQJHz(7*bfrb=E^0y8(MSI(;h z{*?n0XW1O6Qj~f@;uU1n%D`X99<V3`s8VEIaP?sntNFTx@K7mmUu}rf-k<GmeU97r zv?mArLuXf){BNvnl)XFv<GiS=G|3AWX7trYl)Mxfc_BQ5!_oA=n>TFG{#GU4=x?<@ zfck!tA?yt0SA(S^qD)<B2@J`L8w1_e&(+N1o`2R{w?#x?1ctmAd`di>ICTo@pHU?# z&KS>+!0XgUEKHJ{*-}(0q!qeml*^rKH2gbr=b8O3Q4$!ZK0>3R-3y5e)ph!DY9xpI z?AT|&PoVqgpg6;(D#^{dXe9018WD3#ml6Ujd%rIDvv5ux<`RPan(Zyx=M)28|AOTK z1~8dmdt>`kk48^zL|17p5ui3NMM_?XVN?>BZCf^LZ%fkZCNn61Um`n)y3pJZtpvQY zn{MDFE{?o7a|zIlIhai>r0y0Cf#C~x^gx7~h=%zt1iXCL9Dw>r8!ihBjhEgfnHVtq z?j$hzuFXEi*f>$7RV!B_kE|9LK()ajAG+(4nCS;ra<euB0E;TMpF8I|aW)>$c(=Ta zu9ze+u2DsmxBSobG0wpjxLdju5#Ut8ky!5OKdlQh*9V5azjA9!Q2@pTY}E!()kd!W zi^Zzl!i;{L7rIK*V7CY*FFuIfeWU(vsM{57ZPHLzr}cpSFV#psiJiF?xNI(qScUH! z@%qFid+Wx<!cHKgbs5R28XRP}F4ETZ#TSGrC#%zb-GAtyH;DT7FO0<NxlhBGmrRre zIa^|s*70$;P=*|osHVDFwrtuc$4;H~I#6FKFnjZ%`(|}jbX6)XfgxE@^5{IiR0>0v z<f0@ov(*Iq-4K`=fh{oJW%z<(NUiYn{N4ZZ0c6EZ7}SA5ofzN>46hohk~EY=dLlP_ zUs&k(dUpRsIo~<#-PS#yV^4PK=pD)a8tVRa*IXq(d-{1#Dx1RAt?EpvjLs%!7(ZH@ zqLsj$#Uzsbtm|tzadhhYpa6_+w8{HM&JLzj2@FNOG~jiO*OS1g0WXYqHKOF)B>`Mf z^nBNltX>{|Ooywl*a27Yb|=E*YNA;Sa`7E=+IqSqqh2`fmHh`aFKO1#PLf21q){_H zxsys~+;$9s5=LNi1nc%p2Ny$C+<N1U)BRi&#}6Lwl(SIVvY&PXE&ByGvGj>dM^AJF z=BDeflgFQYR{LF&my99z>{9uS5!yj9h-e3lco{Mz(+6irjE`+0D*;QbsM47dwu3p{ z-VWWVi>#{lFAQME0A(aGn1!%Vwb9HG@snqR_sYtbl{;>|1<`b4Xh5DG)|&xj>@%ib zMSie-eejE9PJOaFa<QXRj>G<ljYJy{)L?!<uqdK=PM1$RZU___fz4|g3Vq8ZeLs48 zrH$tiw!qmPId4nf-e?$Z)I%fDcp_cCZJVrUYgNgMZxiK*R+y;|=JFS{Q&!LpuP9%9 z<rVK?PWq;jZ=FPv#Q0-hVJDGAMPNAioa=;FM#Rg3FSN)H96E$cy#W*j=93q<AmZHZ zU-*1taq?U=1g5F6QQq*{SE~eu#)SGwyHislGgX~L7tY2AW57K1+_Q>3fb$3p$s<W4 zr7*4m1u+9)Sy?g!qC#L5);)?kcw|)XzR>3;M~5=*>R3FHv6n~`GAbJ0xlGQ6w8(Jo zd(Z~){r}fHkSFxLH1NkKg-?dWOznSpkKH?#=iVyR?=QamijG^Z4|d~S&^CxgMPP_F zxy!kZ()32+0**RJg1o5eB5Mf&k{BGs8_u19(ycrd5t)1QJ+G6u{K{Qk<3T{XF}nCN zE&&_Q<OakJ^p<N@viKrPPe1#dV()t(DS1)+9f@(c&mH^7Uc?@32+RY4Vp1Q?BioUl zni%axus{S1#KMV*(LR;NI7tVkFqyvXL_`vBg0o}$HhI(Q?$FQ*DfGQAf9QXGkE9#~ zH?M7w%Qi-5JIVzd_hkog^~OLQ2fc};BQ}NYgNu&9kN|`c&@QL^3-UE1fx$3}Li0V4 z()KTS%6y~%V~A(gelhqZ7N&doH{5-veBeEA#tIy%OhY1xp-RbX=rkI8&#!EY)OfcG zu6sw09V5CbZSirhNE=U60#n$AGaY7j+z<#80S;W2=7&IHWI)$@8y)V^Wm7cn4r4H- zjbvRv9hC&!f16*u=Wh9px4&Mhu$;u0M(6dzEoAy%o_p2SW_k1N8~w{7*&aH41Rlf* z?Pqh%CrDyQUf4euIu)4_FJF%fJC>dVh7n-<5c|MaTQI7m`@sIix5QQn%-oBRgYGG) zk=CyYe)a6>a&_&Mm&=Z=n?NeNAW|KWuD+zy*VW3Z)&^P8S}UzhSn@t(PpRCzKK<Nt z+CYex;t%quc1Ku_-Y*X}AR{rk$l3Q&Mu6_qE1GLc`4u9``&bexBt*ZCjn|-0C>OeU zYup_Y7);DKIb&bJupR?L38}A*Zh4ejuD@2U-*uI|u>ZK6?HH0Fcz2hVS4v%NwY0U= z3O&$T8lwwc;TNE@f0^EVLhTZPX`xfm5g1mSvloZbm8j4!9Mt`&K2nB>{5#`Ox(w2I zms@ARJO2T+OkO$GEjM4Y2KOm^;m;L|>gp=lwsAE+bG;(m^Qb-|_Re_M1rF3j;U-~U zbi&4PL9(YUIRx53UZU(5N)=G5WGHoEf1KiCwXii&)eM~$@KSzH%imu<(kVAx9qj^{ zaX3`$xq4gC!p-ROPd)RD;z=_J)jsG1o~vkc`5cUYl)|KuE!?XVWv@P(9G8pTzMp>K zUN*=(9fScdE4(urr2!MA0N(l@EI^gM_)TMOIpO_!`V+G6Xvf?xxCGDY>Fw2}8yxno z@l;Uq0_?dBvhiGkaN8>v5dt*ewKRVONLGC31ZUUh+>=ROCZ{racHafqWzO!tJo&my z>)YeMctS38cH*VINu*C+v>%SkSYkv5dJ&d`1W_ei+~#)%nJ;ohCxPJ$a4@1B%nFFe zN+s=2dmwrCFO<Gyxli+*7M9B7=g+sx6<e1pE(^QI(!J_|?|fHhO^o%T-d-dw6;(=J zGVbdO#eV7HW^Y#d2vCJ<Y5oW>!ZAirT*xi2_rFiQ7uQ63<w%EIy?w>hAMFTiBUAFg zgAalbB5H7IP=*FBLb^4itErD-RrSHXvp9A^T2}6qH~!`q)DZ*&8IU8{amBFku~DQb z2@GG3@nClEER7n%7$jXiJt}o^5|}Le7hn3q0d@f-hSzlWC((#5%9Y!!5oOniqbE+t zj~{!?YYdRSfccZOQ1U_&qtX|}ePP&VKg;$Ffnq~oRf|brf-DpEy%Xp^o_gt=5f~5X zp`k%Jed>rDKfYg%9osKYKKYou^2&4Y=<0FgWSRo$>pBj1^@RRPT-i4>c%T~+7e2u( zN&>?dETw>UTt2`n8ITyLk5q(4`xmGCTbuzCnQECl{>w9v!n7@j1i8#Dt-sW}{`;4{ ztP`k=?F-dLl)hA_B``thUY8b{_BN%401bFsA`Tm0YM3n~zwCQEdq?Hy=`I+|7RP#1 z3we+ETthWaN5?ri4uV3Ga{TxK>>rR5*q%9aY(BS2pG%vgzU~uJQ@30-6BQL$CWrPh zT;gRBsVE5y-)8`#yWaj0X=;ex!g@A*(+fCyt01fUZjK6xQl*6?HXzOdXbbc5;R|xr z_Gsg+EaV-6xMuI;kIQjLU_j;ZpVAj6d5OiVg&*1<ISI_da1SESc27f~PzW?3Xe9dv zOF<*x>^h!&v3<!AnBn0eB_zj=?o)E&la-@KUXkJ9!g~UDo!ciX*Y9z}rP58zCs2o- zedxl<v1kbl8|Nu3>{uEEh6cReKnl+n#(gPd3=(2Nruu_l9FsL|_0qB|{PmF*R=t9` zsvqv^_uc;h$cyjsMb%Lih)a!roD_yG)NUa$>*#|i2fJ%@2sG41=h_?HTZjK-_8pu+ zo;(ND$@yMcw=%lrQWpC5ot+mTN%2U^QBR@*X$n<AVW#ejhore}yTmH%oTh?mr1Fg0 z`a<$jv;@Z4!3@Y%+oBDRJR7K7KKw#Qhf^16*m}6}s{5{|LZXO_<OU64;Ryr=QicSg zU4QMN7v;C#z6XKh;tRiBiC=l&0}sgH&=4>oL804prAl35@me$vd?10L`?_QHi^09b zfwJr`Sp*vEF5UJYcA@$c$Oj%dAiwq2YowvB__P9}qa$f)ic|TJs2r4|M_!h}!DyDG z$t|b8t`oY11C6M4a;YX3ke=%VePL8&VOQnmETHeDU<Y&XFyp@<u@F2}hI$`SzgHj$ zfFnQ7MYwxlM85v;bMhN+z8;mJD81kv9s&J*Y2QBC``F_iDfA3?sWt*}iG$h4L1Hup z45VNVe<Lsf6@}e4LIfIWjlhHlzw6rvvB2Yf55Fkyf6H!(#};S1vCzDCcXtR?KG`IN zwkoGi9ab0Rh2A%e>*$e`7zLTaSjj$`6HPy&`$C^zv;>BOc2{3QR|KuCF5brK2e5-O zLs_K@;^U+*YQzia3rcLE<&$-tN07i;Pn;c;hkyFAyy4EPvwmOtyN8Y(kx%{0zdEuA zTs78?HiR0G7fN4hq=M2HwSNgFaMIF8+1{`e5HJ-|c%_s*fjr+iEZ=(M1$pN^*9De= z1VZw+!&uhYq(G7a16mT6BZps>fq~w@o*VRyhX*@!Nrc#Vt+yNvo=A6gb!lJN(~FkC z@O4;m&cF_4`^M&ly<G@b9e@Oe`E)BD(|wxpUz{7YJ5~tt;;^9GnHsBNW$33~Zig2_ zjoftYwh-Pj`bRwZ%(L<@pZlC75qE&9A@%lxyEIw6N?t1KmBgs@g`&wttL>tHXUl;h zFdYJ>LYfYlppIuG?E8*&$=)aS%bhpvSk%LMd%GM-p{I{WQYcM1dGZkAsw}<Wc?m4v zkV;}L1Q3?&b*B~sVo?(qN-j=gMdo59FnxV}(thr|N&;w$p>as2*uS9SgWwb<@m?If z<4~2<$U{Fp0Q;M6dE;HXVFwb8NV72SHS=8_{J{_8tN;0pwB&`VAt!>Q<fUFJt3Y0= z>Of{7f$>y#tUHzrfu)K-Rpruc@5NYV*-{wxJ$s)%F3TEgWY^A(GiEoLOv>4_Cnl?X zKvs^xHl?qxd&X;*;*XTV)HWcVnMY!14+9wtzPk0N=KIb?PGGPaa}h7>cmOI5O`ZhC zS0B-cH#>;hd<$i|^D~X8LMCXq3bo18FQ1i@?GMX)-+H?&Yg$?>({dJa?^nMjKia!@ zGI{Yljw(rBsvAIFKwxP5g5$p0u5hGry3(-YhCp-(#40X5`?u)O_MhyeFq|Y!K=OP4 z4_=T%$J*shui1_0vm-8Uif5m4%!`|H;=}=sR_ov4Qs0umfUda3GqI$DN@7%nL>e>y zNoP?L7!E?`yM`n=mWs@1YNiS|t^EttNS*=jLJDQ3XX?O=d$aqhz<Lt#$`ml_mrs1| zJMzvq+$2|CzGbG%OXjy;NVh(7?-%6x7hm+q3)h#*lDvSlRMs?tz%(j>QO_e!`eNjz zWQy4`x<CYCvH5rQ3w)Ga<{>bS0e7(Xtn_pqmfnt|($jH7e){d>@^}B^q=wEnpk_xv zml_xw#j*oQ5WA#C@AcP3T8N^es0j?=7@sJE6lOp+t|>nM`^*B4RPE&2ztF`us7}Vk zKM_b_q*4WNXh0M4AK%!EI5AJlJ+Hn&c5K@`du=MhGq^b8gWvywJo=NLNMdXZ<i**$ zP@=_|52a328IibDRW~{H5u`6>xLbsUX;}&kfw)Ov0>gF`wi*N7r=%C*?|VCsA%g62 z>FdM?-?<26sU@yh-qKVp!=vK}Kf!SR95bRxBapyw_3u<F0W6dFcv6@J=Belj3`xM5 zA|x<_gM)Iay&WV4M1>L&fB68FzR-viI%?!S2ol44QtGC*AOaE-r%{xvknJ6P@_)YY zZCSsnS>AZ}ZL(u~X-H&9T)zA8_vO)_{uB~7b`r#n*pk42yr{Pk$xEG*7ZRAtDyWY@ zXx!@4X1E(omt;?k0)be}R7i`#o$Be4p&l$YctOTa56UR_`_D-~h>KHmEavXTb1g${ zT(+r2-g(ywNl2r7_Wpg+*%h59)9_#?#wtfzCTOS(ErKS00GlUtMNeQjkex0<JD7v8 ze^J9Duv=$X>m)Ei*}vqLt0P9}#B^|XzpB885(`L!&Rpn|Pk;VDWkqYf?7H$Yx%R4^ zvVQHF+}lL{{rts?^8Ft@Dtk#>;9-;|E_j)=O%cfphzh-pNLnV@z2G;JM<qK7K;*Av z888F_N5E`g<_7V=K%bmCc~~RSGO!zCs6745&!ng8oDQUOyG!YwwQ5C^eCRi>kayf! zg9!1J(mymRU-|Aq>FF!{QUP;8i7Ql-xHz>Di411m3nVXmUeOa64%BBmhUA5V7o6S< z`m?dI5nb7mdNjx8D1Pun5OYDX0OvgW{0mB4IB@#X7hQjcl9+((UvjfOg~X`qu(K6W zcWYGG&fXz;c<)p4;17QatNB_GnH{q0sw-s6#tl+g8Gbl&F28>0=u!FQ3optqVc&B0 z{CV%SvLr5wDb_YZ{wv~ci2!w#rm?Pi9XXF9s*MUoUOIY4<b^{W8lPYs;?2~QddAs8 zVe1%4Fe(xLQ`P8yxEqw}F}DWg|2{mLLVE)im?=@rODs|_QXKPi*BQgR{MRq`=(!6Q z6cbJi6rTkc_boOLrxCv4MbrnX3@GlV`zQOIabn<$y$f6)o_+pB${i>FOV^FbZ}j9# z=cO9!$!Pwjl#e$sgxn`i&S7}pC{5|@xhUt(o{$UYPssUmCv|(_{7LEQz8GFcitI`8 zcwAn8^E!F^T@BK_9OFXSg#6#{-XI;_Bl6Hsj>*8#Na#6ceI3Qh)z!5Kje_>0L}n57 zwCD*85l)Ux$U~1GlVoBDV!tjK8N>(M#Au&de^0POSp*0REk(LB(=LPFFH~c=eLn(k zID^n65~BnrYjH#7jVm)Jt7Qz>^$(B8kAME0{OGYKbf9i+X_B?8R?6Bnt7P5k)!43< z6>V)2D}YNjJC&Z^K8Pzj<>cwpa`Mz^IdSTgoQB#hqat!r7UJ*JMUD(oilxLQ=GHcH z(ibOzQCDe@n#^L2i(RI{m3|^QF5myz2_2*vuYmQ7qT~_G7>FI0f`{$=LaR#N>o`=Y z*A%2^Zi{!pKbQP%-b({Lm>dHZzc{IbHX~<dW04#k2n37V7gFgPRkNH7Kn$KHGa-?? zuD(%ui1h)h=q84HQ5QOaL#Kv9XFo)eTj)MVsY|*pIMp->T)y;^XWKOo36uwCwXUwB zPaNr2!Z{A|xzy4a+F$~MAKN4cLDoxu%Q3)GHUed`e)TfB=k^s+4ww6~%9!?Emu(rB zKX}guke4xe^cTlvl<U)koM;Er)Vc}e#TPudmb4I8>XINZ9HgC^#(AMI+A0S!&JHmI z=q#kroylCvl!LBsSn38=e+{1C>|gTb%O^346HeeZt$ra^$r>4hp({J%v9Vztm^iEK zK_}hSb3~qh<)9K8C4#6_@puetEmcZQb+uGiSK(8Q{VM%lQ(Yrf_>Gl~M1*k;+y~4$ znUG%CvUK<KN?(7!p5yYyT(b;aXH4l3%T4p^Nvl+fMdCstNR<)E3nJ_4`bOR&jWG}x zCw0N~K3SWlgU^T4tjAc-G@l$eX*3L1br3+jh}s*e<YCsE%>4v?7T%xl>+E>4-S6`c zTywvB0nQ{Iz}eL$S1zn0w7n`c7P+}qk29SZxH9*{5@gq-+-rjP?$=Q#(PTMQ>AR0Z z(pqQ?SRb_Bq0MT2Kzk^s9T+81_|1K?-_n(jv%&KwQgIAOEVB|NFr4@#69ef<>WC6Y zZ^DX+g{8S6z;3Y&5|{DuGHGotlQGsI@P&zrGP&`pD*2=LZ<dapVfiJ(aEz(yes1?I z#92ciFiwpG!2`<MS0k}KaZH_0DhUF^hN}aX4k}e@xH&;<aFkLiHtGgn-xz2<Z@-vx zz0O?;49Edh931Ri$K!W8i+RBOu65)9wH7ux<*2MqqTvQ%e;^(kt8wZ8h@2U>z`3%) z8XT%PiuPz7?i*MQVcn0xVUiFUe6i*`^@;n-L;jw>&CV}7Vl4l_R)nN~HBVkSa$jfF zjwocvizmq<>GGs6P7>o07oDAYGgGY-?*7?NUg$pY(^tZl`SFd0*}(YSVN+NM4Dn&T z=Cc^bhVNVva}qocwS~S;0j^`-92VsumCPU89En9BSY+qe#|1>!C$O$vIYaI2Q-j=R z?E(TyDq<+36zs4lg=2eSdnq)5VSONBVV&3h1noe{J}~ER*-42N&nE%)i1s)P+<D%3 zjH>kl*VXKY7hs>#6q1wS!HY6HfDZ;WZs}&r{>ake5QxVsWb4KzxpPm0Okl<5a=6_q z5yn0_!fW<S$p84gtK~x<LHwFiG_1|nk1s9{(_KA0&><<Rrm31mSyM%=#2sV8d{apf z7#&>D(eoua3!j)kLq%faRy!EgNrzVe`f&6otPl!3h>Nbp14%*Ds~{6AE;&#JrtN$1 z=<E?4a4ZD^!%BnB!?*L$3WQ@miJ1V2@jGWFGs=)XmOP2b5O2u6^1$x;T0EcB1z)t` zcv~Mcoi&n>fE=hQ4*63R9JlEYZCvp2hzn<yyxzT|mO?@QxV%w~#euU%2LTQcv6LIU zgOKu(Xlfnu1}&=m_}#tZ<Uy;TFFVW4_<TQaBvunum>r>mA)z3V2?C4kEcx|>c<35e zs1sr0!uOwGT_Zu@k`+o`Fc6T;Rx*A?FluXJu7rdn-uJLW9`e?C&7ULNaTvF2UU8k1 zq|#<98_{U?>FF~B?;d*i4E3GYE%!-YECq)EmznwR@7*bD+ftH1{bfo~%|-zo{*711 z<nBEp?|$PB`Q#U##TrXP!DS}r&Lpd9S4Z0|e8d~ib55Jn*ODMGd=oZc4knC18%KHQ zz(O^WN)0&M2)nhigU1JXQi6bdao}YKhl6thKd6&jXUD-0`9r)2pU8}3V6K>`Qp|k9 zqFb_HFk+v)sF5NndxprcGbCAYIHyH^KIYjh2AD9hkpLk4ccg>+Dh?-J?2whXIP#(- zhIu1d(XCUZghgC5!+x%jUlJ)n-D2KZriufIT;b~&@xdpz4uQZ#U5B&;L0FW`p}jGm z9LR&iB2x<bY_IO5+m@;i!^I_2He7Ryq0T{O1MPEMdtv*~_Xggyuk+Psu3h^$`R8&{ z2Q{ab4~RF&cBZZR=LWkSgMsr<|9KhcJ&n&98R%)(ZGX>c3{c@4iU#|(#ea9!lUr}t zE_dxJlLY$z!NC;PZaOc&c)n8-iE(-Nn>NU`yILfMKJ5d)x=aqA+$P`p;mfdx3CE6z zwo92h>P><<hGdT;bA-8M2#o7cF+0JF>7a;Co{?xd+bI0NGDq|{Oml$FQir&G4%*Sp zp8edrJY*9YphwIq#xW4lQ-L~25*2PKdCB_j{YKK_e_W;G+}l+)HEPYr8_8Xiz&IQn ziJ|Jpkr|yy`$R?q0FuZ!)sUO@bH)i0NNn{J9+pZb2p~kR%xA@fo6!bW$5@B_dPE!` zeerOLvJSatI|(C8Q&k&*W8v3aw{>NYIsi;E^~2#c`OKicxpE<yARgSNr5iqZFZiSV zy1=^cq;uL9*q*YID<9^`N$Ys-ILLO~Yp+?S7HpTsvwhtsG*(Jq_etIM_ngw`w86EH zf@MF{8_~ma+qP{|TU#ryyz+_+4TUG+Xl`zl|Mu3^Qige0MRi<G9q*NY``S@?@|Rue zxpv!it?)!`kqH>~ZdjF)558>;0>+NXLwk=R&|UC^la2r+y>1v;+{CbC2n-u637QTt z7}VIIIlW!J5j4!Y%F){IRK3mz--{{vogK3^F@cT|HHU+Ok{N*N6BK{T<0LZ#+#Msv zZr^S3oxiaLGO=L%<h?tP$lyW}GRbI{IQfKzWX1c=Ytw{<$HK)iw~k?SfH9<dcmMT* z*=At{q{1d`)4vn)LJUwQ;bD=T8xI#A(t5!`J-j;Mp5>l7f#;H3hSTR{>Vr>S^1rvM zD<~kT06r@BMcZ9WqHPMLD2zJW-*rNx(UPq6AtG%u5l!rn#k^0L*Z#?${E6Ig#~rd` z#}3)Nc{8MEoNkMJ@rz%S_r33Zp=IUH8#l_@6)CBxf)O}O3C7WfjUozf-vDgb8e`In zZ6cWhnSldLO{Ls=9mmtPk{nIQw;w&?)$w4nJ2KQEb&V_CI6~45+cNEGk=OinJ%4^m zhQKiU?#0-F;Z@n8={sc&p87qCKQ1Tp0X~Xc@|iw{90z<d!{a0>_~R%Ex7rbM>*1@v zX%)+y=Pu;m$;lgJ6cy}~yx_rlPG)ds=Zj-{+}qc|+nqQ0hT(nl@xe=mT*rKTqJ95t zq@%-PQZCY8Tz=ADL)pn-z`Dx+Vf8n&*N05r=3iGSO>trJK~fklA7q83WdLd)*Y-n! zcS${D`SRuR<~P52$~(RHz3-JLo_In&`N>aC`K{0g>S}9b^Xdv|YoQt*<OLx}+FGh* z_f^gE+{-=iIGT`e|EOJVyQvKkdK(2AC8?~7$&J_4$p2HmNxBDP^4OCHGW~v`Gw9uq zhP+Pt4|_UF{yEO*Si|-;_dc+s2#k;A<c@6aFY8}#TZcfV14NYpA!H@WpqWKpvO8_9 zWIDXNn|R+RVd|3=|DgAs6*E(Ivv<(`<xy-i`Q+0xs6>&MsGn(AuzmP-z~4q)Dw*eJ z^2TGC{Lxr{ptl`T6c7}w<)d4W6fQ)__&$~ji@;y}#b3xh_uM19cI}#S<G=s=zn5p9 zeO4ZS{P8Kj74kr1eOz{KT_z26=)WO7O^r`TV`HUUy<?fQwp7ZolY@}NBn6?K+}u(5 zLb+7e$8b)y{QkRE%Kjr4<zh#$M%F_E7u4>OHkgZ9)UhN9Od$*0?v+6xw<ApV*_l&x zZ!*!z`7!6~<a_4)XkQHhLtxPej3Ce+r6-i6IBAMoc#!M*(9X?LI0z&X2~`z6{q)m_ zl~pzAp^S?Am9Kn7cJAB>kDq}_zZL2W7j4|Kp+)Yz79OYYG9s0wAicJxLbhzKlbR~n zN#Q#KRbsxHnT6s+PGIYnA#(36_40e~xkf(vFFyy#4bC2hfg$ODL$BDyEb3?krckx# z61tC(l1r$t?Ny5c0nSnfd(V2(6c7~<7GJ8uXtb7!1A&)bdP)BL&;MLL_OXvm$<VrW z>*TNg>aXOF|M-um{8oqqRh4mh%U$bb^-5ar!d{Cv#h(fgo5qGp1Sc(5iHveu9D_Mz zIypg1xio^r{QBKh^7u0w<guq9sY?d4`ZlBK`!UBDYfG6HrTO_J`srLw-7x|)6%#vR z2p9r}KqLr^Qknu!AC;u2+Q&&#Xh^HUJ0r=JJ#;<@eBu+IkU#i?KakCvH&40j5C8BF z<@2BaypZS=I;~r~T<*NC7M@2i9?obIl@r8au-n{(Z~%-C1`o@g{scUMNL%<}a@Jkr zU<4c2Rl+lAot(vjz=w`sMD+H;OYugB^DOG<GBU5fMquUzmz`_~7y^dC;t)tdbUxU3 z4r-sHYCP+!eJEA20B?)KwivGF(kg%b*MBXa{p@F_WG5Dj$)`X4Y4ui`^5Y^7R6yeL zuGejnP3!1+1ks9$RQwxGAShy)G&RJf0k$sck<<qQ1Ib4P>;zN-QU)mq(!@lW)YO&9 zT{l!iT639v>ASV^*mLI!9_Wtoq)1{GyQrfP7{82dYX}$uhCl%k7{$VhX;)+z()wy2 zN?2&TXsL7%*tBVr+;r1TDphH1ZH3*&xO8-M$o==<FNY5wp7J91-g~e7*`NKHY~Q|p z%5S&de!JX#_ucZyBack^ZJ`G?t#6av+hbB!?|FP;9V9<Zz>v4Owo+boOPf6VGGh6F zyc|C{AU7eHT>}<+Oi_j7_={dbrO|Szq27E)y)@OXhl{nygL{wTXx2%3=HmX)6RD|n zGf0y!34-A<ZmBkw(-~mqJkkhE4j}f`5HJJ`fw>~Ucu7v0;=FvEGzBinFsNn7bW5d+ zKwVv({QmF%zWmPb{Eh~t%l9T9`N&7)JKy<^{LSC|jXd?#Q|VL2u+Z(_{_Wq&=RWtj z^s($6s+bBzV7PwTm0KHR&B_{yLp>y(G{x5rjlpQQy1GnuZf}&;Z8fs*aG#t!H7H5O z`l2;&9@`VF0V(wj<#OAu8tLv^BTv8FDHl4pE?(gh+lO1skpWa0Fck!bF4f2r<Alv6 z8G)G#N_LJRU<h2&2qZ=a5qb6`Y*UV=B`MA=nbMTRC5_EeeEDU|mdS$;J}9@`a?6ab zR}S&STi)^(RS8{t?X_~^#EJCz_uY4&eCku5(rCQtgWe9WS-*b0oH}(X_osP(Z>WpQ zhP4f{5%FItVB<p9=}aOiD3dsjx3yJCGXmKS4TE$KGX4sK#(~77B_NrrNPfn_Z5o=& z<?ici<+Zo2m#=-#Edrc%)}nT~Dz(3;V=_5}MNHi~aLCY{?`s5R&QRHjhJYcklo6m> zfNT2ndFq~C7}0W{LEd=WQfVQ;F#fN9{p*#4Tyez}7{J@4si{dWT(}@djvSG_d-uv0 zzVHRO@=i8V<#`W3{IFbi-F0(*VG^D%ed$X|Wc>RL4i3t<zV$76_q*Rc<vxtk`+L9l zd+M<?<;Qs(phxKP<~n)jtCz{jRs^oYYSRe4JNXXyN}^I%T@F`jtc?T$Lp73H3Wkyn zsD|{Coa=ZOFocz>%H_YlZI$dhbU~g!Fbefqp7SO@aZcYxxGJ@`pkvw-X--#WPBH?M z!NT?o0Yl&tKp>eIf~SuQkMGA%AxWW)iY-1kwF0bNyH+m0{BpJbph|>9ub2}JW&iRo z|585mp${ox$;~T6{WIkM2R`rt`S6E7Ebn^PyL7!G|GYo_(?6XTdGW8i_10VEkN)V7 zCb>|5`O9C<OJI1-JKph*MH3hr-ELXmD7&^J?o1p8xp}22ARG{<G}M;M=JhqQqBSPV zmtp9KYH2)$vLqp)%}gF%qE;zTC*5*oxxD`^mrK_dQ*x@ks~{w%5Q{pN{pN?C&y#Jx zNNj5e7y^bsX(BM#cOImK5)>EY&4tT9rZy|3`9{I#x}~K>?LIijleF;D(9n>6Fc&DK z^diheLc%cp3<h`Z+&Q6_&vc1oi==^uvU5!b4jhmhZn#1E`(1S6ef#$5dPcd|Q?f#v zmsP7)$p=69!Q7wqJFlg*$4^|;@#4jch=$wfADXnKw1>vP3r%gyo8+(mV7L7CuY$nT zApQ$kh>qx!hjpr!hCx^kAMKZ(zA;(9x(4<zRjP7Qd*3|7N68CrLn%)=)=ui^DwqHH z`P1^1hmK2E_pmemU1-L=>u$LF!&2Y0Mr!Jp!~1EuR8}?Us`p$tbuP&yFmpl4&M^cG zfuckpnHUzXh^%TK#!X4D>vIfoE{2OT&&8an=H_N~0iG_8Bs4)27<%r!^PTUMyY9M6 z_UzdsBvpR!%#o21HI{wop@-z7AN}Yg^$+b)Xt(nJw|6E`a+GDie`cS_WM(pxooq8f z!j-TY5u>7nRS>xmMHJllf_@;MdcBBv4(bulmCtkCQG|mmM?n<D^(e?yt_Vcn3knDX zxGYH|2{AzS%)Z^{_g23>)zwu!-7`H)XPy_jtNN|C-m3anrt9DTXFKx9Ba==)wx4T4 zt-12bD`n}@rLp9N9k0FiTKU2kzTnQ~EpK^C>^L&*@`A|F$j(b0q*G2g#eI&x9e3Pu z@|)lMCfc3X=kkhbS$X&zIpKBs7_Y(^H)RTnQB(T0CX&`tmt{+*Yn5t>f9fH61N8-> zqS;|m+$WRxa3Yv@1{B+wGY91J|2AKi9MmY^`SH`T^<R5Zicemr8#@R`-ulLQdJsJe z&9GN!QAZ;%v9MaFAz%nhCImY6y%La=w3<TH&nB0h)_wC%rjsq<bJ?_MlY8i*9K<!0 z8A!rdH2g@u^rbJkBygxLajmwt)~PEfEI8P{?|tu+j*bpDl=VW%i$4ZVwGbFgOG&M> zGa$s6Y4DK&i@3IO<;paHVf#Z5Jv1f+X13NgI&o!-w9G&yae7H`I?hKWlZbedLP#`u zVEWZ`RI4G>S^+Px9=YPZp{vQ<T}SDEs>C#@kaX^<8hLipBDqbSdiU-h-H(JW7m3ub zCMleXgGeOEOz<}i%gWu1z~siqwi*J4z&Ih$*W0aXiu$IcNJ=_yihl0xX&<MvnA(TI zO!C}w&&l%T%VU8+t;nYxeDJ}tY}qoIGiQ$G5h<75yLY=nhB(m1HHgXDwQCcP8@CUY zpKrYJMmhJ~bKPcqT9O*uP&#m`jWaJ{Lc-~n^GIqdR;+NQBZv#m!AXs|!r{{>FiCBs zgsVa^UAnMYmMyB0rh0W_QPSd^a`ixQY6?_9>4ChmqepJPbF)0~=q@?_n3?jfw=a-+ zv#VvGn-MA25+N@Ep-5eUGKQHm%4N;!x$^v$cDd)Fjc!BWdy^Vdz@mMWMIDX66acmj zH3STS(Ie2Ye}_|3JW+8=B`N!NZ`H}8-=3pCp3P7g0{Da^5tt;^fg|wX{`ki~E)WZR zJEE<-yIXF(^;Y@zx4)g0N}rr5Nym)N6aIY8Ip?^9aVSS&U!Cw6)~NywiQ?G!ut3tD zdFC1S;(A#}$$@MoHImQq8m=92#1R=o)~#EY@j3i~sHl;&a<u_zZaR6*!dk6qq|}7y zqtu_yU{p;>9e@%74?VI&zIvUim;3tUPk-Gdvs!B8-Dezx0m+3`$DT|0Pm;r^xoSn* zfLwUiLfN{#T{djqp?*mttC`fL-vy&7>SzQe_KsPnAz%oM27&&*9#vDeq^l$QoGIi{ z>FpkyYP_R4U)y&G0UqW_ElGj7?6S+8PfF5$^i!dE&6+iG-g)QAvBw@OPdxF28_t}c z{`994cg5!hMJKL7I3N`$F(@cW4U^B0e)J<3I*kIeef##<p}8D{V|R$@jADcn@7}$8 zV;y<P>N}EFRaqfttXd=o&+V694as(qL}8-gC-r?=yis)6u06f7V|PF{_O%bl&Yc=g ztx@FV=rew--<KtQA#uiS(z*H-_f<z$%0=&Klk0xbBhPHy<u(=iMkG?WsACXLtp|-g zne5q(z+_`$J%)fGkS79N9lM4|iaO9bvrkG*;fu*y=^=n3k<{kSoh$gNpl0|+-5;D= z^KF=EZoBO^Ip&yS1ium-S-q2Pcn-`G#~**Z+<*W5a@}>;xs15s?S7pU{}7n{`;&=r zTU(o4am5vW7Z-7aGJ-SkuYUC_*|1@Q+qQKpD&WZ4mMvQZ?AEVepEUu|Q*n_<BPB5N z=QPS$$JI$6b&qK3kDG2W4}bi62l~q7pxL!@>YJNo{qy_f(6(uE*r5$F*rVnr-R^h_ zgeB5Qc<0p}zo|?Wpr(d0dDG$ba?iT@krNnS)Y19B@O=?;0{);eOCvBbpjek7U<eE$ z(64oSFz+}O#Yg(=BH~9KKD&yWUVP}NwpMHeNS=oI#QUY}+O<nCy+rf6<WgWbC(KAV zrqa$h<BWpHi`z-x2sI`ond;0$8O1dS0px{7ntoFH$2FpUXn*<3UxZvN`83Q;-XsJ8 zBMRyI>#rA%nX7>nm88MQo1R$mf<S?7U0q$)6x+6Kb3Q@Q4VaL)FFyHQbbH+AN-f-Y z%F2VJr9p`Y{G~tUp&#kON2WqE@~&9kB>#EIq4LZ>_e<MB)8w^n4WbsPAb=@Cd>}M5 z7iP`UeG0@8JZ^Tk56b`B(k<IYCce1YC>?+bGt#1tMqpAm#TJIZR7aqzV|U;{s|t#* zkc@u{rl3KM60lZ!2=EL4BOm#Q^Gm@;W%~5#85e<h=Blf%a!#jS!Qf$>t6?JX1O|VX zqz37r(4lv-jgG^ymZWie_GFS^NCGMOz4I$!)zl73YTjh?gCG3BC6bFH5J~&ek0Qjr z<hVhlflNRu;@ZbP_OW!8X^#7@cfHF+7_knqBMcp18i=CLE5ke}FmVm#iSzZ?$Bl{h zEtuaZ?>=FsRBAXhWsfwMU1o#4I5{QMt$hPM12S`ZmCUHGlp|i#B$etD)29(h1DYR( z79}b^$6cQaBR%?J3CAImZ+nL(wEI_={OC9Tl&4<Eynmsi=Cw*u#~HJh>fD@o@N)0^ zIZl}iPih1vjE1cn0tYw({r!Eif6rD&R46#;BYpO$qSCGAAZw+C0A`7^&N@p7-9@b+ zoxN{ldc|orS7Z&oCExw-cO8)+bv{u-5DFf+JcQ#~*pc@g?|4Vt5PAIZ$Aw%e_>^FB zI{oz1v&Nx<(9b!eM4$$tY~Wx^z89QfsU>v&`RC{KZ^2<06$jGu;SYb<k+CRI%Q|>W z$EBBE>ilHL;d1!lhsTTv)F;1zFm6<&Xu}sL8ipPwGvV=EXCdUJTnil@w_={AeNmF7 z>pbYQtS;K=%s!z5r8$mn<Drl8(buJ<MnC&kr<U~c>u`ye)jwvtMlC)0Lc2Wi+<w`v zpXsC4QopJ`o!x!1<)wYnO+J}Xw9byqqK;H*FE7`uHF*?uGy*dU;B8k!V6r06-L*Fz zj_lIpy995lrf3R%axPdaJp@n%+SHeW7nO`L-%!iP`&OW~cmngG4}Hiz$di<W=+z%| z&_VLUAO6tI$uD7uL=u7ViU(oRix)4BPUSxD*g<4UkTI9=<v0SvKu8WgC}02j*VFT0 z2BNw%iR|)ioYR93J}AHV#V?!>%FQ?5?0jtU-Jfwd1VaW<j*<urDwc0VRpr}oV2*1^ z%1qo?`WhPQoEm!Yf@)_z!ju#CfAK^mmzttUbsbSbVR34TDk>0_+y2jXxAc7wmCmj{ z+1K8y`CfXZM|bSWAS-(8A~X~jiaL@ip|X0KE9w|TQVl=95tt&}0Gq-Pm<R+0^jFmW zJ=>J1Y|xk1@<CC7sO<WubhYo8h*Pp-77+oWb$F0^^8_Xi|I7ZUqmB|D(w@9<Sg(u_ zWkbZxaPoWfR3RCk{NyK{B7+%e)v8s|A?~w3PWaf-fjIl3=rA@e?}{IfBd>2LHMiVy zi!*omzI>M)2LeMwL4jzXE}ePinJ(cSI6}B6OOUIP`4<wHlv4(B#k{CJn2+Kb1dt58 z;g+O=6-r=Q=hw<vtLDq>Mr9#ol~R`Se{mKgxC}2PCY{P1!)gkoWW$zDc~YHsQB)u- zVKoJE0!i7iyUVF7nH8<MlHtij_<9RjCmSzC9U(1+7In;hHw!rn8*2y{0%L+ePuKoH zO;LZ8AZ30~A(?`N1O1s_lw)!NHtB>QK+Y1JLgN}~^m*Wi8@?i_2&CapA}=q!^pfDb zo0M~faOm%S?|V*x3C|r~=K+qglPhNmPP&gg@<@2M*mZ~)4RaC^K|~adq<K{+yf6Me z-}%mW93jE41x4uXZ-2Y<a|zcg3h&d`*XPcI=%_ef8VDr5IVemJqPTYV-FIjBzc40l zF8aA2g|yxKx}>HG^Nms#Whky1fD)DrHAT%lKPy;G;Vj0Eq~yBB(G+zw0+S0_+hz!i z69PCcw(mtv3H(yhHGNc3;TMXvsfPf*AV~z~w9`(@0)$`rOO`B=B)^nrpMBPuY<BM4 z>BxmA58;U@hKOR4%aNCdI5mR`iJS=^BfO693#KX}jFQL;I8Y`4GuQ8b|NHRn>2<FP zq3E1^^2uq{3Sxs}Eu;-BZ@>L^=VSBeqmQQd4X@y<f=>!z+ex`;FxBM>f5ss=+8}*# zEmxAexba)Icgj__zbr5Bnl3xEpyE@TR8860o291gn;<nM?wp6~>(lD+)HJKrG(O&R z<V<73?Wo(0z~ljv4KW0Yg+Nbthf`C6?6az*5SFZ@1>Y28RBNSy015{WM_!mqFinsf z1vAFRjT?({5%{6tBT`7i?1K^$*Km^cm5(u##1R<wBlilvHMtsu;qQO{d#)kFZi7^C zjSw$Xqojs2GNH@frzUQkCoq_GKL7d8XAObGkgJAzM{(rO?|`yG!#Vf;?|*-yACMm( zT|$te#Tg-dN%w@%??M_ijP8Bt1$per3a#2)rV&s0rS!*`eI`atDdbwhW2uQWy=lHP zAqDxP0t$mUE=f&fe<Ltq6m8uQ7()b}c<@Gf^uF(o;Sox6Y93&G!9xak5V8EzpZ?^0 zJSN)}kwNz2i!T<6|M5_aHdKk<{`R->jc<G-?UNB5lkaC9?uE9boGQ%2gA`{{u#TFa z!pFgXga<tlGD*H0+#`xQ<_bAxPPRknP;|H+zhs>ZwG?fHn4st+HA1mzxg3(&9}-Ee zqc{S?{uGKN(x|>(iwDIt&I9FzMy6iK5Kh4h7cPt$o!NzQgX!&yU;JWLULCNC^Sx<r zZyyl}?CZl<C2)|=Jd4u()Y1Nmi;Qwvc~y;eA=QLJIkT2`P0qePBQV*RSdSr4bOiW= zoYpY6=<}BPgztUtdtFx6s6R!az5&I;0abz~iLD9%04oehL_t)%DVS02z4u=C!1HsH zbPd0hT)zl;$f6jmUcK5y(fCAcevU$xxy(3z9wK3Q=t3r*dg>`>Lh{?9OVpX+>iw_} z&bOE}G2KM#`uI5^nvfGR*e0n9s5lo~aDj7ZCA1hdiTyAKvE+p*2EqhcN(y~O2_ZrX z@|e^hLin{1L9}`EW?8goQS8tp^1|R7Zn#14oAC`_7fe4N{NM)#-yn#HZ(KXc>HhY& zzX?7sI8-NvN+<anQJ)E)8*A!xtdU4WM-oEauP^dWIj3Hyz$7DN1ST09+hPb56@jLf zB}JWYq?1ucrKzD>9RbzvrUNJ7iIbaoz(vUm*M$^6mJO#$oG^Ka^6UNDYp-<=R`QPc zU;5#P3+4whw&vTIgB&anB1|PCX~QWnoF7p!VQ1N-ux5Y!IIR6PzeI6>OmO@p0^=X% z96O1?%$hYT9gPFlfBfSg{UI`z_}!pJFg~u~u#8_1WH(nMf{6Sxmt1m*{Oo5xi~V<% zv_ItKGoSfP)@GuKZo26v_rlQ_<q8srACXfDvi8XCc-!0Fmffj6s5?`+m1&-r>e@#2 zeQA-p>9ZVR86Xl#OOOza<o#iCVPpg*7dp1h5GW!7jV-N3oNZ)N@c>)(#>MjQ|9zgU zdv;K6`t{SYW9R5HX^!knM0jxFa2aj*YVgap*zL<-{<2H>#>1BfeOO7Mu;ACe_O z;n@Bm%>$?q^5V}M72xWtua*yd-~+xZafx|{Flmknse%}g>jkq0>Ox%m-S2*vL0%X` zBD&EwlmwE)<x+q+M;iADMJ28see}`kZi*S^YPr-SoNtFCFU)=7i6^?;HxPqQeBu)> z310Xf#~q*AN1y%dXXU3q{b}6hj6QHlQdu$vhCXn7)VOFP$_bJ+6<S4Qjnvf5aODCZ zE0hhWspB<6%Jln)q;*wQb-Jt+67?0*jKCCvmW?$8Mu7lHn(FFjO=winyg5yB)(MNW zpj(~1?G4qkucKRTyW?5ev#%rXUzDSOAY)ggd9QYaHx&BI6b0b&%P)5(2A`1?d7c7) zJQ#h$ZzcRt_5CbKq!!I<f{zOi&s^#9AsR%IkYYaWTFyD=99L(@JBLCHJV^;JQGvqy zqux+K8UGJo>nD7^tVdJu)0b~CLev9HEm6M|NQ<8%mjZ-Z0@j2+hm+884!#jxghKSd z0}te^QG_|>4}bVWVzN6w-*8K?#?*sp2Sx4AfBv((FPLypl_2l<-9YlVZ<zNeiNNv4 zs$upbdMesT-Zvbni|#Y2KclA9G^EH0WF;Ufwe^%dsMX2___64_BP=P}q2!ML$}6fh zfnA+@l`GjPuc*>-75W2Xcrs%IW>WvFu#-Db5a5>>K53{h6BQQCFZokfE>r^3AT=|q zWSSN?`NaDd%d5M(<gWWR%Ki?`Ek2Gd>6be`1#yiBBES53@bki96P4qdYp%)gpI{sz zxog&}an82h4}}ME5`poGLiD&CCn+o${}0m1V`jj&g6y}^hVv%bU2%p*0m|iM8{U`W z((QfsTT@%mu7m&q=|t%@2@p_vM`@uY5?Uxq=TL;8(h-!7^bP?ebO@mdDoRJ1(wj69 zMUXDV0s<l+-0ivdJok_IzWkCWJG-pC)~s1G@4Pch0Ez~a8yaSkX*(Skx+t;+Dw}mV zWKzhF%ua~c`EVH>ORGa2mDDXzj&)b{0a_)v^3p$a@JZoKyD~Qop*We=<plAVUK)E2 zFUHL4V^sWH!2wd{nhtLH>a()xSCMnPvnB}u+$}09n6V7KGz~@Ynts#A+~Neoy*m80 z!S$t*)0g#(=M|3q+B>T8TjkXcT2+X%HLqW=^65E5er@prfZvO}z|s%pjObhMtq<|t z9fiFva?QO$R7WkGy;C-|t3?m&-zc-s8O}Z&4$E)5Ie4RJ{@0Jh$q8k(lKCT6c=YZ+ zW4m7gh_LeH(kNv?zTi>}r6^<JWBX;Uehoo^1GUc9*oOlBqur8U;35W4<|6M)GMDrm z9#5TAt=_PE-_Q2gMogb|Q>Y(pS}8?N?B{!!gi_k0qKNmXw0fPptE6`*a!kFk-W+qR zp}R!VRZ<MH4AfLA6C7CjV>}gi0T!G$(mHSSRKPLd&2C`5`~bW|eaUw%|J9KE+?b+L zk<0;hf?wGYD2EW7Pb|g6Ptx&{zf0p2>RAvuGp*Pc;0pbV&N0-;h;}p4c;r;Vhmn;& zw=kC(xsWQlGCVfALrO$>dF9X`R2Gz(lzbO3A`&iyJxP|ePE@(wk+~aHQC(`#xjO9Z z`of~b92E8aTewOd-^0M<({ZMT!J0PJwfNhOH|~$Wk9A{BXWcMPc<rGCqP5Q=ePN^f z#V{KeDk#V)Otx_rxW_lbpyr904<OJH_~NwdTCZ!*t*$t+s8KVPT|4znmmmm_*qPwK zOh<4KTfk5+i@YU@cggNeuEzUuHqp{zwSy`nTJ7g)ee;e#*_Jl6HB3r~HgY!HaPL3I z2Znds&W^VWCL`@ls^nxSeiD-yWFjOnwJ<T{BGepbd~?qnCm`0nDD4a+7;9+opiLsn z*r>F1W(8%|0ETNFOtiK4?yU4$8i)Mzle@w1cw?eRf$h|p=Psa%10iw^&_jg%6PTsB z`G6qJc-o5nVzJI=>T;V*hZad5+YOq@_^12?Nn1Z4E^@c!+TQBA^sm?@ic7Onh)32X zBv|`X`whzz%g*DOeCMvzHFnt`ZK;N5g#?Mh-D~fq!{}$FD578c#&UmeLNUj*h4yK` zX!$4d#!z%mVEuvVFipi0X&rV)>C6jEZBBD8WT4X`GaZu}jnUp~b(>V57BrLh=+)Ag zArLn?@t9;7Qg-H!>}dK$7rG&s01Hwj+-G?}r;)har-fmihU(L3Qx#?Vblf!cl`iz( zs7wT*)I&bpj2!@fGz*#tZL&RaJGJ(6ny(m9gh}NFz866`(6bm*xkd`5TM@Tb)fYMq zE|0t$Daf)Kw3uOMud4(q1*cQv#n(u)iFeet9p;+-Q)A*&?mDw}z`U;>ccp};e7xPP zW?-a5pIHN&%@Jf#7q_f~j<9rGdfm+y#=ttjB9<@C6t6D)hIWmLKg))Wenomkn|1`i zPi?;h*pyyB?3SbwnH&%K<{LbMU(Mciz4k+-RirLRmi?nZVQp=#&r&pdtJJ#EWYn_H zV#u$ScKI}3k6zS;MFO#v3^hS3zh&JlbEcYkZNjQYpAmvvo`w!+XA$oUD5WJi6vh!t zwR`_?{L==5xoq{9lF8GpmaaFcS08y(DAUH#l0*cg@6m79Q4Kp7T(i)1SoVHyhjK7r zuAKFodmndlGT14jmMj^r*tx_Uw7uklu^T$j{2=+O?%^%I2Rr6jUmmV4j@`>FOU0*S z4g{5cCm-zXC&mskh1MHl(N63I>4Z;&*nsAxJ1RD>ji~wAOLH<#9rX?LoaxdP(JiJB zYsO6Wlx<$ESk+k4*TSS{1s>hnT2WV69Ko7#$9l#Y0`tv{B%=O85*wdUD2GqZn>Bey z9^tEY=&w1Qr{&@n1BW)?1h{9KtkK>Nr{4g>V^gbt*Q9$R*0&p~H?wB5-c0g+er5o! z&L>9ZimYkp2_cW3Xh;xTl<Lz1N@qGlW}gmMdM0q^30-nuBoL}Z1fZ?AlZeZ42AJpF z$eibP*rhwyO?DH;m?<1P1T)xdZt<Yww=e4IEdo^*Se}o^ba4oNK6`tR`bv{G=zb>` zNsqq_<zn!0eqNN{`nvs)T!Fq0w&Bh~v-Q2Bxr_DRo)?%}+X{<xxTo;=2PV>6SPm@* z{qZ^D9Nn8dM6K05RCFtCdme9qNyrc+!si1;@6FXCqzg`_jMTsOl+SH!sGqmsta?sP z{CV8nucc)|lK8ppv?_lLqfKQw5@C|UrBa-`+i5JPUXN*dquk()jw-YwLl^mFTgU!t z9ShB#lO=1d2<>2ZI`{kyAW~VoFTwLsF^+Bn%P;wCpDe5%gP<F8+lEJP<l(o+6w4KG zSlSV_tMT{*nJ77BFOpE7BEkaey-L|hAb4Vuh#;1T(<3J@b->PmpvlCHg*x9CsT~t* zR*y%VfBh~z&Czw(>mSnP0_kX6ke$r%Mo9JZw`pG<*|gl#g1|c3qK?xz(_WpNklLS{ z9##pVG@Czc`EXWF_4w9??5U60!e4#5zSs89E-pkrnHrKWJNSruHt<M?n`tN*n)erD zi3d}6GL3Lu3p7$*BYY8@-+&h}6EaDdLG97}ki$8{=<xh}ze)7i6I6`j02Li=sNm75 z@uE9CdE01covWhDi=M#G`o%lcdu-BsL$i)6_*Ty<B|rbMfSahU+LqY8ux)Yr2r&lE zfH&|pZSE(EH~ej#iixYnI04Wlq%2m0&J?VB-sM|`WWLlx;N^_CsYKOxQUu0hcuY8% z<jbY@BPVnnbR&shoghh|h~53Dsv--K*anN?oy&iG#4PP|Iy7@<Y(&HvJ+t*@zh`%x zY5x9H)HGzhpmZa<K>?GhTWT?DIW#e>Bk|jzW(WV2(6GH6=AH_TgdarzUQVFVQW2o` zzPjVVazGWIq8A-O4{vB}RJa|PphiMJ$kujPA1^9WDDkpYI`3<MgDxv7eCR(Ak=M6; z56mb%vfbW7@#$v{?$Ltf{^d?BI7<uKxV<MCBC`HmK?WT7!?OQ~oc5)*-Sk|T7u_A} zJfPUi28oNe#N8Y>R$UIpaYXI0n&Ki`Onuva*Uv!f=qEF!J5vsZ&~KUMIJcaN!j)R& z7i_q<eqMKK10cA@qYpbV8q}cEh}7F~)0KU(TcP?d<fd!BmD)e}Lm9<YXob-0XuRdx zcqc1avayD>jB1+D-27d{|J$17Eq~kcl&Y-6@j~(O_8$rDds`_<+Z>}br|KD8CEXL* ziGEUilTn+rIJS~*^lyt40E)3JmR9LJAE7Kf6?ybE#=0(8^ytA+!q7x)SYXP;la1EU z{3vT{Yqqj{uRfr7{Hp(>2TpXa{i5v|#28G}Uq|Co*XJvSIv!o13Bt+nx_RKuu@jvl zf66A+#ZT2^2EeP)>M9*<31spYn>3d1d8{MfvDb19U!t6&d`0U#hXOy{he@qOzvS&_ z))$nrYjGGd_rBHItdpW_2BVc5iX%5nI$POBU%5L~Pc46m$gazaIoVJCt~79QG~{Xa zjX(6G^C#p@pNST|q4TrusL82<%_3HMiPKLNGpQeCQ@U171&&zza;GyHvz2!G<jvA- zoWnz;PL5hmc}V+433fu&U-qYr?gwEqMy`#l@Y?>#kG|q-tNt^M>VC7--C)a7!Qp72 zwo~-1hup0<ioGu7=JMrQuoE7^iC-F{8ntiNAs7utpDN@IuF8G?_iop<)3z}^EbY4U zSvbjSz|<V4^h+y`<*^pai`|&6N@im!a?oI<>%jdD;+9y@25q9t*}NF%G~uugiLNsK zXR3InQcy-z#_H6(^Wf!l_uKo$D>A`I1+n;`MYR0hY^P*)1Cyt*eQrlEQ;|{%*!{8l zvQW%2WW<X^>C&6Y$T!&npri~K+L`PXt9+wDAh1?oKOo)D!`752E}#!)Lr^Yrg#x@c zU!!?)`*B>-Ka2#nQ*Qw|hvl552S!0yw<sSW4c(j5&|p&_J%kj3GsAk*z7yamGXo5# zI<FF#l4fMnl||?$1y=d!#9;$4ds>xXZ#0W{$bOE6EC^@yYk2JNf=00^n?5#AO;6=8 zwZq3tLg})^V}wY1ouL>$>XAw46=jF&>LHgHVuqN!s%Nfn!^c-o^^PC-qx55zro!)8 z*FUq82%OcLJKVDiTI#jT3Qj6~<Iorf6ZdA(dZfn2i;^?4DT7Ch`*AZwF{bv<YppB+ zI?iJ<?{PMC#&^cta`0-?JnM^CrA+fW{NU2F)%Ub9o7%6sXJg{X&6P!t0ZpUQ5Qm{E z3$0~w*zCK^^z0wb=D2EnK3xw=?FJT|o})DbC2&;BsA`q=GZJzIeOWtXfS{|oP<v^Q z3mE<;Gxgb=Ncj<|zj>m)B^zxQ?71nK+(kIM{!$#Mj(H>$p&{o6p9D4?+p5MZpAanE zZS_~vG2+kC_wUaayAE9eibPyxm=ceQBfY{nOc$DU|8}$#o61obYpClmFbqW1R?82s zirhEIq&eHICqEtcJM@dX7zon|=7}f?WeF99uK!GqRUp0IFy8$WiZ)}}+;Fc{MURHX zZwN_w)6xIbOdF`lFr$~*e0)R<UK6)Rf5^YDUNZlVPOn%Cc5kwmW_w1xHyxV1Z-Pt1 znUwa@94xAzQ-M*mN$bj-Lei}|v{YpHanI&n89o6fhQUO(fJ#~R5qihXExGpNf^OYD z)s@KTMOzk_6ijpUP#UZoeIcd&hVw}xQz|~&Mpe>E3TMG*fjF4TYX1>^lRAp_LoqR# zSYbY#C%^aQyU~uB%p@$&ZeG%J+BtxM3-gI7g7zr!BgHG1Y+}j6@5aqZxx4AI*Z*v# zO1gQv8B6&ud}k)W8=~$sJAz)5S|B3{m&C!clPjs}g_#aV%wKKP5a^9ZbXqQsGJ}0p z+TQFbQCEiOm-^rJF;eiIRw6ljX>41Ar=hiX=mnRqX9bTIpc5*=A=+O|t}#dUh#OzI zZW4b?{_%@YPHz59=~6BwAN^wKF`3+aV)_}Fyda7fOEFz;ET3=GJJSDg5R<#+`@5S# zCd{zbtcrG^1{vY+W*mZ~mh-7FuzRRqHd16OVsyRJ(r$iU;uYl<eVIL}6nuMt0JW)o z7f#q@Sli1k+j5>=XxZy3BibHhjU+vf{#+mM)hcL1b&<2}qTsNJFIHl*8~#XA{q)D{ z`UeMF@0B<AC$!T_NV;<r1VNd8UG9S@<5*FlpgEVEmV;(#8}4YD@2`F>d~rRwMh6yP zFv-x8)-wHqQZSSBh9h`4%lacZG?b3=5^*@C0=M06pfA=(L~Pai8LXc9Y3szBxfb!G zp7OJQyTQ<;a~Y)TP%rSD5#_MM;zpcPaHVmte45dF@g;G0hwe}L&2=9CSVpp8n^?Ya z?t{Y}E_s+aM(=iKHv5;U&;;_*1b5jJ(F)GD-#_(ny7){=PpwX`Tpl(GT`Uikg(Vua zo}Zn>8Y1i0U#!Qp`KB}WUA1~S@T%uTdsguB%cTKkF#{f8XZHM5&*mlSoa#l9DpY}> zt(xQD#L(Lvr`ii(V;r6<W<+f(Gm;jv2&DsyU78r&zpjgoFw>q|)0=_bKAgCQ99bEl zI?)cn&7ZQ!>-1}81V_bz$>rfmkKz-mkbLFO?YSa2A0~Z;#Atvi4D@T$JC=i26a6fF zU$x(!q0d#tvCTTF_#|N5Lcc~<PS?=kEXx|w30)4lT#uUR_Yk#|`{$K(sPS-J@zDZH z3I2z_uH8DH4+z??y2sEP5H**7AH^Ve|Ax)7O0X@2Vd0r0>OsenzTN|e9=bOx5j1>W z*3w1{mAO|WP*+zn_68nRxP~R3(ZWpMtMt-Lbs*g{B8f6EPkBV$5kP$K)<#^CCK&#R zY0*EQq6EqzS0ST6bq>mWfQ&e|um$kp=px*cf9~fLsq`Ht8+7Y~JiMM6WJ}-)WsDPX zdDR5eJwK_!7O@Jscb57eOI31ZYfN27-#!J&Uu8&}VAKNb#;+l&KYzJ@E<LP0X8&h# zbp{9!{w^<|%H)UxmGs}v_txFtncw(1rYiaRch-+3lFgOpY}zWbPj0Q?xh6i%%^{i8 zj*4N@qN-`IPB{HTIc001*n(yL;c3NkO*Gndx7*5}jM&YCu^4`Zn9iv_Ggjeg8L+_R z?}0WUsuQ}?P$)Zr=)=Fcvd(XZ_4XBeUV^AW-t%xaFfHPC^>j+on2S~amHPf^m9$zN z))Qjj4yL9)UQOXI5NWeBJnZM7)$qMNo+fF3s-k>ufROUHdL^xitukgatzgaGP~6G< z^zdXg4RJ6zPfEY^$oyw=cmZ;f(AvCt6e&6T0p0eCFnr$Xoj4ybD?HayBkOgRypy>N zqx}pp#m3$XR&o#LcwCP%eoceOp}d=49l7#tEyuplq*zL>y!J8$#WZvyFQa;Mg>Y#^ ztrA)2@VTs%)RRd$a^<)?<WO)hLP*zs=t|j%nK^Qz`!;xac>q$4PE+jFIcQeKee_pb zAJM}u)kpbu!+TZUh$_{E`h;k9+W)%IY5yRu)<6J6?lKTK3iwi$6n@!%x_Y`7E_F>m z#a7MQFevKmmPaAGo)%D^2aoA|r#-nJP=9CBuhz8I{uo}rZF0_TZhw>-tJ7uqSl|VV z>-A#$L#!<IYNE&ba7Gl@nyPxJRpXh5k!BF)TkEz2dkLGR_U^OSjJ_>aJ<(Jqm<-4W zKq_0BTq_D(j=x7A<P-;LJ^9v#uv}jp5r1Jc2&p8R%3c=`Ll!}EK4WKVUM~K5xOCm6 z&U^JjWKSo|RyPDEKuh61K#w-e<T*6=VKv9`q)#}JU?CjryI5&?#BT{cH|wM>9=H3` zbrsIcqK&ZcJK1<;fY_z7zPI*$KjXs1jj{~1_BHg9-t8s}@;9?7lNL34JdSR}!7O5M z{!@CsChy`~0iXX^U0<0#Sy@)edY($t+WL;l$8SLn9ztvn8Dz(+DhjvMU9Wgo0&uq8 zCvm5!5K#z)8N)O|;6uOa+vU8;Cx$i1joCONNYmR{JBJD|<|<tCUjFO2nf&XxNf#c0 z`{~UxugL3cxbnwkc-sAm|NgV=&Mjac-w0%Ro6E+7E`hEbcWG3WI3fOu?fWakmuK`* z1+6P82!s^nrjyVO?2^YTd-s7F)d#DGs)`;r_a$xxIlpNCKB6Pz8PGuQCo9xz)w4=< zp6fN`nU=lobL+)}x@(;cw%>xh%03c3``&YVwogRE`w<N=`0;zE)Jyg*DmgGu509EO z_t}jHv_+-0w_)M<3{6vro`pPB(WPJCqkn<rqr=*C#ML-VaLaLY@R-ZO0)<jk@ZP)0 zN$4%#*E?S?Xm&wHD12aFWiU(;|A<KusNc@}?Gd9Jtft&F>@jktHZZ^*($t}ih~=9T zw10Ikb7yW=B<y%w;#P5s(?ZBPXta_gt@x(dYo3^cA)i|l3IgXH4@!vXA6!<}d4pyR zgm#W5Z%AhGpC9!<k8K55jnM{eFKtSu%`*C+YaT+qh6=qZK|cVs?Rn@e*p)(ZJ|+i( zC~p10(`|F&_3}OGoP_WgDa)bny`wp`WUm|ZEuW*7L+t&YSfXX(>HcV5%*@?UTXY(x z<fVW~(H!$OZs(C8U^S^;m6i`5#FU+8gp>pCb?$GywmE)%1?C4`tW}d7GF`o7?hxPx zXSr*C5>5;^%Q3O!5K6vA;lurh`$Vs4)8^0djpIjUVlE#aepqb<YC6br|1=5-+pcXI zqGGoZ5Xtw7RL49B+8Y#U(?<l`_#mZr!a3c=SRYq!9h-G`b4u6`8SiQW5|88%k*CTi z6&BSC77#q<5<(~qYPo_+S%n31;nAvt>QVtr+22ri?4R{6R7e1;F8SN5Ch;N%u$M6q z{WDTIbh#aJb$^=CZd&Lzucb)H^!3u9Qr6(f@myYs$;wUxMtcQY!w}yWPr^bwc|Is$ zU;KPmBl|REX7`$!P+Q9!wbOt}?(vwMJYg`8@oCP(cQfqT4v+VN2x<1;AlLIt)t*4y z%2Lds#v*#m9IaACAFjH|8ix8LuySX52ld7%$faRH{F{Y_z$DWdG~%<bggn(G3pS@H zmB>1xOv=CTyb6gpW2${)xCk+b|0JdQiIS3nPi*y$`<+|Y@E}~(SeEBaHQc%!aw)v? z4RexcNjE@p+NR`bd4fLsnSol%4f~eU7)9uMDIaH59C?8ZdAQpd%lmuc_0c%}_7p%X z^qA<q`l<eE*e)VO*2GexWtFw%c&lbAB-CXrU)ks9sN%4DMZx-rK01qp4z=7$J{3(N zrKuv!f}detOtqGV8fTdtlfQtsp4FZk^K{c{Wr)j*q@Rq~`il(?OhbP(Ek~7~J$>dk z2DE>3UR-sGk~u<mbl~J^SRMCF)_>$A!lu2f4yoXG|M-_^_V+RNxAW?l_UZKtj-T?p z`yim#PDY1C=b(#p;S6q}99EAjHB2F{%QF?i<hliif>4>?jraF~Qk?c#>gThJL0i$+ z@11KccAWqDu3BM>XVBrE&^sFXOoJjXVDl7Q;KgO<gCa#q-xQGQPME3*`~WAwVnIF* z)%Pf>B$Ebil;G*!z{PDl5|1LD6py*V(=2Qm<4iE!xK*jIfjU$IlrAF0wYjcE#hz|S z)+?h8FNIcB@3=#tw7~Sx0Zo#n!E`#|k^ztrH?B@nDqx39b?n#NNNiouji<{LA1od- zX)fni{xAyjFy8*127RANxaXf3QF%0el2xo>)>tz>k}3Iem<=E;GFYqH+IKQ;S<Y-^ z6%-KX>u$6@qy$0L>^ipDZT-?^+5e3m+IsEll(^r!mwi#P-T2*;TR7GU-7Ite6q1I) zmYnTbnkU9d<1+NO4M0*65@4RM?J9b+reu<tTC-V(p~s`mu#Wut@i48{g0S0~MHx`r zS;ar<0%9p~@FTJpkb8$dmwlOqjtggbj1I)@5Xg)m?A5zvt?xNy0q=Exu=`?l!S4Z< zEN099h(T3CpHFRp0Ezb6`Pr<Y9>9m`c&ZnVPGwwZ>$KzzeOUgYMzY3uwNgU&zVPUI z?(IV4Ut(@Fi-|?!-H!?%-23l@K{Ohwk(;e*?k|iIEtL680moR4=RHf@O?j$+SfKR# z+K8>Zo{n4iggo&KiN)O97#uDfp_63#CT6^Y0V(1g5=ywr5D||8H18WnPrbrDNaf1* z$UBpgXE$FLj$6swyDExZG~qVQtrk4<UKv&Ug#Q*%46i~ORa1VCxtfa~O8I1)QmJv% z*wXk`j8$MrWz$U$>&81Qc9~TsO=5YZG{thH9d;t~zE~_y6(sVZlGt;glgPAQM%MUe z51qr05QzA&jK=<W>g+~;n{8IFQy%5uBjf;f^;uw7twBb1y^K*dtvawfexR!B*Q@#~ z0F9j~_R9z~e6ewecV;0Mz4WBR549H5+l{J4S0VGq-m_-0*#5ZrjfBTw?>Y@BMuQ${ z3V-0TwXm2eHUBbk02t@qLvgN2hzB&L%<VFNP4wNlJGcZrJ3QUbs@#6XIDL(nc1}?N zzHjq>c`(FCkq~@GQQPeFy;o7uTy~6xyPyM@{PJ5)!B>h$7nm-^QK##xHmS>&ihn%z zsR&-F__(?@MO-z%T6wfj4miMW4*kGt>IAtzjFmliu0iqy;8`x|qdsdSuG~pHt^il< z(c)r6EA5u`F|87*LO@)|=CQPzC^Hv=;bkSU)OzwK32-EWaef=6z}uk+mGmL5HS(y> zU0T41Mfj_K#bX#LSU+6ll#bY(<<ez3y_@+YjI0#`8zP|!?h0Nxs&NKN$(RaUo~b4~ z99Ch=2k&oJB8g!%K1&07h4=&!u?0nhAvRuI?F)eof!x&Rw@s}^-ZMlfycFyyS&^BB zHp$BfSB*2gP(*zW*ZaFbhb4XmiKv2-%l4x-x3_2Rv;t{pRC$&_T1Lh$c6XhN-6a#_ z{*+@47-F&N>6fuB`ineEyDTVoc?9{$L9GKhPY$mHuk+}c<r7yLf2{vs+?mgs3xs0_ z6a((p!pAHl5I9gjS%KA^)uxZ52!zK(5kr35pq*TMXkK1TRzqRYc_GFs#<%>?@+;3g z69TBWVltq?=wN-Hz7C9`F@7kX4l{n~akc@LbLHdRDQ-{@AXCCd#djVHN?AbUl4RIN zZWhc2j$7Ah!v?heMi|IS=LAlSTx7ejD9pVSP|p&k<jX~$Yp*TmvDT2E6%p?OxEk}N zfmC%}FD3mEV{B2eq?BHH)AsyMnWtZiD?UN52at|kW+@Qv+LgP)C<id45;WDW|7*oj zQU27dTK;Os{ZhnaKOzuUYHBXad-sjw(y08mZl<~7qVf(gv6)yz1LM62THz)l$Yc<c zQv?v_-so*yT>q7Rox)_d#kvRlhE2GS=ITwx<Pya?N%{H90GZkt3I@0eRJwU@m^qX| z+E1qy$1)FJWhy#amsrNSQ)gtX<&}m=fH{`aV~MQHmk?}K`bEJrgzzNNsU5-XO%>86 zlS$8T{JVa<2tSYIEGlG2R@*GnJ2xb_-W8zStwaFYY*%A0#SsD*=z1+By46gA)6!R? zsnKYiQ?oL%(j<jR1cW}F_A9!ISH}zo)f>>4kVhCBnv&jpN+mqV6h`_z*ptyVTs~pF zSLx3Uq%t%E6UcSGxRH_*GzgJvypn!5j}OBq6=7{GS&C11x{b4|I`E%IsS7Z>`)i>! zH8_mbMWJ8V+Fh!VX(?{4r$Fq-kf0f^ROB#L(h}Z3O`tv1`zKZbEPMfw9<~duypzlj zSQo1Ed5iqKyx_L^%z=BwoY$_V*=5UVrfM0CypG6#nA&5YV*-=3u@rLRYD$9Vemli6 zU5^BSmT5UOMR9?0A#$U4hIcs1jE>T@XQ2EUHYQa|eP}!;p&eRHE-rK~A7;wU%$SBw zb3d)Tpi{gP_|tHRp5*)R=h$10roKE6cb$Rz?<ax0K}HT>gm|QyCM8IIEF2*w{a+d^ zEsQP(;|2;c>e38IKy|}X04xya^jeKB?+_59h=Axv%F-ZzmyB;<<8e698XOYj+Lq@5 z?m*h4Rv{<a@I^q9u0RqnGE!WP_aFw$Apfb`7lrc|3J=@IFZAEs`sJ)N(b|q2waTdw zt_7yO=BC$G9ka-eXP$I#5HF4#rWJK)09|C5OPlfP5}E9!z%w;X_}urt4dAIm6M*~v z3lM9hvuKnTS2{)2#P6HE+cB#NaOEG>;y%Qdyi5Iwj;}_lP`<g)lTIRgr2!z$-oBdX zRd^7rS_Fr691EUY^PMk_9#O-PWKK>w9{g$cvd1@H1#;cGnBxF5-+*59oeLyM9poYt zHu&7MVx4dLG4TVZL{^B7%hh~MYMRL9Bmm>2Ed7i6VQhB0uPhRj0Dq^?v#%*|5!y&3 zE=$*!|IM6W0xZ=&n%k-gf>KvNdYuRVY<~SpD6D%m`RTcJtIGYBgR_o%=5EKI&KBYo zh!X16WYGf1G^hN<<XB?Qpi7MenN0t1>TdYoTX6vL1B)38kOL>ghRedLXlXJTIz%Y9 z9;r&b-AJH4Jn*NcOR5%h7qPPEh6GV(X~$z;9u?yZ-}i4|9c{F+OR^u`9YGnJdCQHu zeei=8$HTu<D5mQ%3=pdk!A43B&~JeYv=Mi}>1tV4F1Z$(rA=q<t-1wph{2Ge4(*N4 z8#1flyi`v*UutcHu^x{}{1KTx+1sPNMM2vuIQ1$p>|M-{l>m7%;5iI%MhQe}6qAgz zIA?F=<9BhK99_XAaNjfmVs|(J2p(DHuMxlZsmY^A4ni_#F-M8P^~b+Yb0DPf>ZbgU zH7lAO_Gm{`JMc0Xj6T*RgK}aw#O8CF4{Or!&Pt{{@GL1Xh6(7D^84dENlZ7vpk)fp z?pYne06{#6wkf<lFrz0soIsyWAa(q>0!ZTDT;EOLWy$;BOKiI-9)-h%-~^a-QsZ7d zrlRBM29J;!nH*>Un1CE09NS-A|Fh$xxseta<fCP(I--*cMw|w*7Pb~-0K)+&pA<k8 zy<_JY-5{&FT?3eV!FOu@{X^ih??Y}bK>PhY>)$T|J@BrWb&I)pAX)0a<G^Z_^j9hW z_gm0d=C6mGYwaR}|L;N$5FgMEK3ZV)`R_c9K|l?Vo$qB8RQ~@51OlBN2>-X`|L;6R z6wtbi7W078|1Jy{{LCT+T1kKQS1|v#VgF-$>@@6o;DPB~CkxaC;DgpN)UMNVi2OgQ Cj!BpR literal 10370 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 From d89798996540d86b7ee3d2e094c0d029fe07fc1b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 19 Apr 2020 12:45:35 +0100 Subject: [PATCH 0620/2376] Add Product Hunt badge --- editions/tw5.com/tiddlers/hellothere/HelloThere.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid index b5f33311a..59ce4293a 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid @@ -46,3 +46,7 @@ It's well worth spending an hour or so playing with it to see how it can help yo Finding code that works flawlessly after just two or three years is magical enough but after seven years?! <<< [[Mark Gibbs, Network World|http://www.networkworld.com/article/3028098/open-source-tools/tiddlywiki-a-free-open-source-wiki-revisited.html]] + +<div style="font-size:0.7em;text-align:center;margin:3em auto;"> +<a href="https://www.producthunt.com/posts/tiddlywiki-2?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-tiddlywiki-2" target="_blank" rel="noopener noreferrer"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=193414&theme=dark&period=daily" alt="TiddlyWiki - The open source non-linear notebook | Product Hunt Embed" style="width: 250px; height: 54px;" width="250px" height="54px" /></a> +</div> \ No newline at end of file From e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 19 Apr 2020 12:57:56 +0100 Subject: [PATCH 0621/2376] Fix link widget to work within SVG elements --- core/modules/widgets/link.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/link.js b/core/modules/widgets/link.js index 6d3ffe093..4732db928 100755 --- a/core/modules/widgets/link.js +++ b/core/modules/widgets/link.js @@ -60,7 +60,8 @@ LinkWidget.prototype.renderLink = function(parent,nextSibling) { tag = "a"; } // Create our element - var domNode = this.document.createElement(tag); + var namespace = this.getVariable("namespace",{defaultValue: "http://www.w3.org/1999/xhtml"}), + domNode = this.document.createElementNS(namespace,tag); // Assign classes var classes = []; if(this.overrideClasses === undefined) { @@ -102,7 +103,8 @@ LinkWidget.prototype.renderLink = function(parent,nextSibling) { // Override with the value of tv-get-export-link if defined wikiLinkText = this.getVariable("tv-get-export-link",{params: [{name: "to",value: this.to}],defaultValue: wikiLinkText}); if(tag === "a") { - domNode.setAttribute("href",wikiLinkText); + var namespaceHref = (namespace === "http://www.w3.org/2000/svg") ? "http://www.w3.org/1999/xlink" : undefined; + domNode.setAttributeNS(namespaceHref,"href",wikiLinkText); } // Set the tabindex if(this.tabIndex) { From 4ea79cb0c34fa488dfa3e6782f1f3c3fa57237f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rodr=C3=ADguez=20Rivero?= <rdanielo@gmail.com> Date: Mon, 20 Apr 2020 12:17:27 +0200 Subject: [PATCH 0622/2376] fix(syncer): restore tiddlerInfo param to saveTiddler (#4584) This was added on a159b5baf3ad91d8defc68cbf81c78d01b69c416 and lost in #4373. Will be a good idea to introduce tests against this kind of changes --- core/modules/syncer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 903bb0a4b..a11f91a0a 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -581,6 +581,8 @@ SaveTiddlerTask.prototype.run = function(callback) { }; // Invoke the callback callback(null); + },{ + tiddlerInfo: self.tiddlerInfo[task.title] }); } else { this.syncer.logger.log(" Not Dispatching 'save' task:",this.title,"tiddler does not exist"); From 05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 20 Apr 2020 11:26:37 +0100 Subject: [PATCH 0623/2376] Freelinks Plugin: Don't autolink within HTML <a> links --- plugins/tiddlywiki/freelinks/text.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/freelinks/text.js b/plugins/tiddlywiki/freelinks/text.js index 6769419d6..64776f4c6 100755 --- a/plugins/tiddlywiki/freelinks/text.js +++ b/plugins/tiddlywiki/freelinks/text.js @@ -14,7 +14,8 @@ An override of the core text widget that automatically linkifies the text var Widget = require("$:/core/modules/widgets/widget.js").widget, LinkWidget = require("$:/core/modules/widgets/link.js").link, - ButtonWidget = require("$:/core/modules/widgets/button.js").button; + ButtonWidget = require("$:/core/modules/widgets/button.js").button, + ElementWidget = require("$:/core/modules/widgets/element.js").element; var TextNodeWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); @@ -128,7 +129,7 @@ TextNodeWidget.prototype.isWithinButtonOrLink = function() { var withinButtonOrLink = false, widget = this.parentWidget; while(!withinButtonOrLink && widget) { - withinButtonOrLink = widget instanceof ButtonWidget || widget instanceof LinkWidget; + withinButtonOrLink = widget instanceof ButtonWidget || widget instanceof LinkWidget || ((widget instanceof ElementWidget) && widget.parseTreeNode.tag === "a"); widget = widget.parentWidget; } return withinButtonOrLink; From 15d7255728d776171ed6dfc4b5764aa2fc8544ff Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 20 Apr 2020 11:35:11 +0100 Subject: [PATCH 0624/2376] Syncer: Should not call syncadaptor for missing tiddlers Fixes #4580 --- core/modules/syncer.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/modules/syncer.js b/core/modules/syncer.js index a11f91a0a..18f3d7a7b 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -180,12 +180,14 @@ Syncer.prototype.readTiddlerInfo = function() { var self = this, tiddlers = this.getSyncedTiddlers(); $tw.utils.each(tiddlers,function(title) { - var tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title); - self.tiddlerInfo[title] = { - revision: self.getTiddlerRevision(title), - adaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler), - changeCount: self.wiki.getChangeCount(title) - }; + var tiddler = self.wiki.getTiddler(title); + if(tiddler) { + self.tiddlerInfo[title] = { + revision: self.getTiddlerRevision(title), + adaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler), + changeCount: self.wiki.getChangeCount(title) + }; + } }); }; From 678e25f510786fbc38f505f8b594f57f39e33a04 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 20 Apr 2020 11:47:54 +0100 Subject: [PATCH 0625/2376] makelibrary command should skip non-directories Fixes #4583 --- core/modules/commands/makelibrary.js | 4 ++-- core/modules/utils/filesystem.js | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/modules/commands/makelibrary.js b/core/modules/commands/makelibrary.js index c2e15ef37..1e0035dab 100644 --- a/core/modules/commands/makelibrary.js +++ b/core/modules/commands/makelibrary.js @@ -33,7 +33,7 @@ Command.prototype.execute = function() { tiddlers = {}; // Collect up the library plugins var collectPlugins = function(folder) { - var pluginFolders = fs.readdirSync(folder); + var pluginFolders = $tw.utils.getSubdirectories(folder); for(var p=0; p<pluginFolders.length; p++) { if(!$tw.boot.excludeRegExp.test(pluginFolders[p])) { pluginFields = $tw.loadPluginFolder(path.resolve(folder,"./" + pluginFolders[p])); @@ -44,7 +44,7 @@ Command.prototype.execute = function() { } }, collectPublisherPlugins = function(folder) { - var publisherFolders = fs.readdirSync(folder); + var publisherFolders = $tw.utils.getSubdirectories(folder); for(var t=0; t<publisherFolders.length; t++) { if(!$tw.boot.excludeRegExp.test(publisherFolders[t])) { collectPlugins(path.resolve(folder,"./" + publisherFolders[t])); diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 999239450..43d6039d5 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -15,6 +15,22 @@ File system utilities var fs = require("fs"), path = require("path"); +/* +Return the subdirectories of a path +*/ +exports.getSubdirectories = function(dirPath) { + if(!$tw.utils.isDirectory(dirPath)) { + return null; + } + var subdirs = []; + $tw.utils.each(fs.readdirSync(dirPath),function(itemPath) { + if($tw.utils.isDirectory(itemPath)) { + subdirs.push(itemPath); + } + }); + return subdirs; +} + /* Recursively (and synchronously) copy a directory and all its content */ From 5688670da67324e7741a48a5445eb80a39005a7f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 20 Apr 2020 12:58:27 +0100 Subject: [PATCH 0626/2376] makelibrary command: Guard against invalid directories --- core/modules/commands/makelibrary.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/commands/makelibrary.js b/core/modules/commands/makelibrary.js index 1e0035dab..36a1399a2 100644 --- a/core/modules/commands/makelibrary.js +++ b/core/modules/commands/makelibrary.js @@ -33,7 +33,7 @@ Command.prototype.execute = function() { tiddlers = {}; // Collect up the library plugins var collectPlugins = function(folder) { - var pluginFolders = $tw.utils.getSubdirectories(folder); + var pluginFolders = $tw.utils.getSubdirectories(folder) || []; for(var p=0; p<pluginFolders.length; p++) { if(!$tw.boot.excludeRegExp.test(pluginFolders[p])) { pluginFields = $tw.loadPluginFolder(path.resolve(folder,"./" + pluginFolders[p])); @@ -44,7 +44,7 @@ Command.prototype.execute = function() { } }, collectPublisherPlugins = function(folder) { - var publisherFolders = $tw.utils.getSubdirectories(folder); + var publisherFolders = $tw.utils.getSubdirectories(folder) || []; for(var t=0; t<publisherFolders.length; t++) { if(!$tw.boot.excludeRegExp.test(publisherFolders[t])) { collectPlugins(path.resolve(folder,"./" + publisherFolders[t])); From d9387cf4f80e7447c5750b245f2ea7dc2b1e13ec Mon Sep 17 00:00:00 2001 From: idotobi <16611056+idotobi@users.noreply.github.com> Date: Mon, 20 Apr 2020 14:06:41 +0200 Subject: [PATCH 0627/2376] Signing the CLA (#4581) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 15abe6d3d..8e5fb5d4c 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -395,3 +395,5 @@ Matthias Bilger, @m42e, 2020/03/11 Mandar Vaze, @mandarvaze, 2020/04/08 Lin Dongwu, @linonetwo, 2020/04/15 + +Tobias Hermann, @idotobi, 2020/04/19 From 154e8868736fe52d8e1950cb6de8e37eb9aae293 Mon Sep 17 00:00:00 2001 From: idotobi <16611056+idotobi@users.noreply.github.com> Date: Mon, 20 Apr 2020 14:07:06 +0200 Subject: [PATCH 0628/2376] Fix Comment in Webserver API route tidlers.json (#4557) This commit fixes the the comment in the route `recipes/default/tiddlers.json` which was inconsistent with the actually used regex. Furthermore, the 403 response was adjusted to also agree with the the new comment and the regex. Co-authored-by: tobidot <post@tobidot.net> --- core/modules/server/routes/get-tiddlers-json.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/server/routes/get-tiddlers-json.js b/core/modules/server/routes/get-tiddlers-json.js index 8e93733e4..80c2a9cf9 100644 --- a/core/modules/server/routes/get-tiddlers-json.js +++ b/core/modules/server/routes/get-tiddlers-json.js @@ -3,7 +3,7 @@ title: $:/core/modules/server/routes/get-tiddlers-json.js type: application/javascript module-type: route -GET /recipes/default/tiddlers/tiddlers.json?filter=<filter> +GET /recipes/default/tiddlers.json?filter=<filter> \*/ (function() { @@ -22,7 +22,7 @@ exports.handler = function(request,response,state) { var filter = state.queryParameters.filter || DEFAULT_FILTER; if($tw.wiki.getTiddlerText("$:/config/Server/AllowAllExternalFilters") !== "yes") { if($tw.wiki.getTiddlerText("$:/config/Server/ExternalFilters/" + filter) !== "yes") { - console.log("Blocked attempt to GET /recipes/default/tiddlers/tiddlers.json with filter: " + filter); + console.log("Blocked attempt to GET /recipes/default/tiddlers.json with filter: " + filter); response.writeHead(403); response.end(); return; From 2649d2f7dc36f9a7d4e473e4238b6beee6be3b3b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 20 Apr 2020 13:19:27 +0100 Subject: [PATCH 0629/2376] Syncer: Fix typos Fixes a bug introduced in #4584 --- core/modules/syncer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 18f3d7a7b..91bd7e701 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -584,7 +584,7 @@ SaveTiddlerTask.prototype.run = function(callback) { // Invoke the callback callback(null); },{ - tiddlerInfo: self.tiddlerInfo[task.title] + tiddlerInfo: self.syncer.tiddlerInfo[self.title] }); } else { this.syncer.logger.log(" Not Dispatching 'save' task:",this.title,"tiddler does not exist"); From 1546a4a1895b93a47b79c9d37b94be039604443a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 20 Apr 2020 13:28:02 +0100 Subject: [PATCH 0630/2376] Client-server: Add message about disabled plugin library Fixes #4570 --- core/ui/ControlPanel/Modals/AddPlugins.tid | 2 ++ .../tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 59ce0cd91..a7fbec1dd 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -118,10 +118,12 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ \end \define load-plugin-library-button() +<$list filter="[<currentTiddler>get[enabled]else[yes]match[yes]]" variable="ignore"> <$button class="tc-btn-big-green"> <$action-sendmessage $message="tm-load-plugin-library" url={{!!url}} infoTitlePrefix="$:/temp/RemoteAssetInfo/"/> {{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}} </$button> +</$list> \end \define display-server-assets(type) diff --git a/plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid b/plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid index 9f0e164f4..d2a07991a 100644 --- a/plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid +++ b/plugins/tiddlywiki/tiddlyweb/configOfficialPluginLibrary.tid @@ -1,3 +1,7 @@ title: $:/config/OfficialPluginLibrary +tags: $:/tags/PluginLibrary +url: https://tiddlywiki.com/library/v5.1.23/index.html +caption: {{$:/language/OfficialPluginLibrary}} +enabled: no -(This core tiddler is overridden by the tiddlyweb plugin to prevent users from installing official plugins via control panel. Instead they should be installed by editing tiddlywiki.info in the root of the wiki folder) \ No newline at end of file +The official plugin library is disabled when using the client-server configuration. Instead, plugins should be installed via the `tiddlywiki.info` file, as described [[here|https://tiddlywiki.com/#Installing%20a%20plugin%20from%20the%20plugin%20library]]. \ No newline at end of file From 4efcad46f38b7ee667e0ad3183e8984e2fad5737 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 20 Apr 2020 16:49:30 +0200 Subject: [PATCH 0631/2376] Make input fields dismiss their popups when the ... (#4579) * Make input fields dismiss their popups when the ... ... fields loose focus (`blur`) * Update simple.js --- core/modules/editor/engines/simple.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index bb77893d7..6f6de6700 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -55,7 +55,8 @@ function SimpleEngine(options) { // Add an input event handler $tw.utils.addEventListeners(this.domNode,[ {name: "focus", handlerObject: this, handlerMethod: "handleFocusEvent"}, - {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"} + {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"}, + {name: "blur", handlerObject: this, handlerMethod: "handleBlurEvent"} ]); // Insert the element into the DOM this.parentNode.insertBefore(this.domNode,this.nextSibling); @@ -133,6 +134,20 @@ SimpleEngine.prototype.handleFocusEvent = function(event) { return true; }; +/* +Handle a dom "blur" event +*/ +SimpleEngine.prototype.handleBlurEvent = function(event) { + if(this.widget.editFocusPopup) { + $tw.popup.triggerPopup({ + domNode: this.domNode, + title: this.widget.editFocusPopup, + wiki: this.widget.wiki + }); + } + return true; +}; + /* Create a blank structure representing a text operation */ From d579ce942c587c72e5c6108085a6f219bdf6bd07 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 20 Apr 2020 15:56:48 +0100 Subject: [PATCH 0632/2376] Fix broken links in static rendering Fixes #4577 --- .../howtos/Generating Static Sites with TiddlyWiki.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid b/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid index 972942c59..d3008c771 100644 --- a/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid @@ -10,7 +10,7 @@ There is much flexibility in how the static HTML is generated. The following sce ! Wiki Snapshots and Tiddler Snapshots -You can explore a static representation of this TiddlyWiki at [ext[static.html]]. That file is a static snapshot of the current DefaultTiddlers. Any tiddlers that it links to are referred to via URLs of the form `/static/HelloThere.html` that point to static snapshots of individual tiddlers. The tiddler HTML files reference a `static.css` stylesheet file. +You can explore a static representation of the main TiddlyWiki site at https://tiddlywiki.com/static.html. That file is a static snapshot of the current DefaultTiddlers. Any tiddlers that it links to are referred to via URLs of the form `/static/HelloThere.html` that point to static snapshots of individual tiddlers. The tiddler HTML files reference a `static.css` stylesheet file. The following commands are used to generate the sample static version of the TiddlyWiki5 site: @@ -26,7 +26,7 @@ The first RenderTiddlersCommand generates the HTML representations of individual It is also possible to produce a single HTML file that contains static representations of tiddlers, and uses standard HTML anchor links to jump between them. -For example: [ext[alltiddlers.html]] +For example: https://tiddlywiki.com/alltiddlers.html The example is built by the following commands: From 86d7564661d28b80ad300aeff1ce1ffbcd4332d3 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 20 Apr 2020 18:13:00 +0200 Subject: [PATCH 0633/2376] Update gruvbox dark for better readability of ... (#4585) ... toolbar buttons --- core/palettes/GruvBoxDark.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index 8834f0e70..c4b1cfc63 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -95,7 +95,7 @@ tag-foreground: #282828 tiddler-background: <<colour background>> tiddler-border: <<colour background>> tiddler-controls-foreground-hover: #7c6f64 -tiddler-controls-foreground-selected: #7c6f64 +tiddler-controls-foreground-selected: <<colour primary>> tiddler-controls-foreground: #665c54 tiddler-editor-background: #282828 tiddler-editor-border-image: #282828 @@ -135,4 +135,4 @@ wikilist-button-remove: <<colour dirty-indicator>> wikilist-button-remove-hover: <<colour alert-background>> wikilist-droplink-dragover: <<colour dropzone-background>> wikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>> -wikilist-button-reveal-hover: <<colour message-background>> \ No newline at end of file +wikilist-button-reveal-hover: <<colour message-background>> From 39d532a4a0c12e6631286b02bb382f2ef21b2876 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 20 Apr 2020 20:26:54 +0200 Subject: [PATCH 0634/2376] Revert "Make input fields dismiss their popups when the ... (#4579)" (#4586) This reverts commit 4efcad46f38b7ee667e0ad3183e8984e2fad5737. --- core/modules/editor/engines/simple.js | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index 6f6de6700..bb77893d7 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -55,8 +55,7 @@ function SimpleEngine(options) { // Add an input event handler $tw.utils.addEventListeners(this.domNode,[ {name: "focus", handlerObject: this, handlerMethod: "handleFocusEvent"}, - {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"}, - {name: "blur", handlerObject: this, handlerMethod: "handleBlurEvent"} + {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"} ]); // Insert the element into the DOM this.parentNode.insertBefore(this.domNode,this.nextSibling); @@ -134,20 +133,6 @@ SimpleEngine.prototype.handleFocusEvent = function(event) { return true; }; -/* -Handle a dom "blur" event -*/ -SimpleEngine.prototype.handleBlurEvent = function(event) { - if(this.widget.editFocusPopup) { - $tw.popup.triggerPopup({ - domNode: this.domNode, - title: this.widget.editFocusPopup, - wiki: this.widget.wiki - }); - } - return true; -}; - /* Create a blank structure representing a text operation */ From 075321932a01855e5b23b78cbfbd9ddd9cddc451 Mon Sep 17 00:00:00 2001 From: Marxsal <throaway@yahoo.com> Date: Tue, 21 Apr 2020 03:41:50 -0700 Subject: [PATCH 0635/2376] Make commands for static generation more complete (#4588) * Make commands for static generation more complete * Added message about installing on node.js --- .../howtos/Generating Static Sites with TiddlyWiki.tid | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid b/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid index d3008c771..e9da4ae08 100644 --- a/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid @@ -1,10 +1,12 @@ created: 20130828190200000 -modified: 20160622111343603 +modified: 20200421003440463 tags: [[TiddlyWiki on Node.js]] title: Generating Static Sites with TiddlyWiki type: text/vnd.tiddlywiki TiddlyWiki5 can be used to generate static HTML representations of a TiddlyWiki that doesn't need JavaScript. +This process requires that TiddlyWiki be installed on Node.js on your local system. See [[Installing TiddlyWiki on Node.js]] for +details. There is much flexibility in how the static HTML is generated. The following scenarios are all illustrated on https://tiddlywiki.com. @@ -15,9 +17,9 @@ You can explore a static representation of the main TiddlyWiki site at https://t The following commands are used to generate the sample static version of the TiddlyWiki5 site: ``` ---rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html static text/plain ---rendertiddler $:/core/templates/static.template.html static.html text/plain ---rendertiddler $:/core/templates/static.template.css static/static.css text/plain +tiddlywiki wikipath --rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html static text/plain +tiddlywiki wikipath --rendertiddler $:/core/templates/static.template.html static.html text/plain +tiddlywiki wikipath --rendertiddler $:/core/templates/static.template.css static/static.css text/plain ``` The first RenderTiddlersCommand generates the HTML representations of individual tiddlers, the second RenderTiddlerCommand saves the static version of the DefaultTiddlers, and the final RenderTiddlerCommand saves the stylesheet. (All the files are placed in the `output` folder of the wiki folder). From c87f4a1e94d5abfdd818fe740f768d17a24a65c5 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 21 Apr 2020 15:12:43 +0100 Subject: [PATCH 0636/2376] Update prerelease version number Whoops --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c1d927700..5d93e5274 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.22", + "version": "5.1.23-prerelease", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From d6ee700bcae316d83e786fe52061bdf1c1ee8cd6 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 21 Apr 2020 21:21:38 +0100 Subject: [PATCH 0637/2376] Fix $tw.utils.getSubdirectories() --- core/modules/utils/filesystem.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 43d6039d5..8ec1554f7 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -23,9 +23,9 @@ exports.getSubdirectories = function(dirPath) { return null; } var subdirs = []; - $tw.utils.each(fs.readdirSync(dirPath),function(itemPath) { - if($tw.utils.isDirectory(itemPath)) { - subdirs.push(itemPath); + $tw.utils.each(fs.readdirSync(dirPath),function(item) { + if($tw.utils.isDirectory(path.resolve(dirPath,item))) { + subdirs.push(item); } }); return subdirs; From 3a20fb1e3a41a032574d227a8c770a11ae0a5d58 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 21 Apr 2020 21:22:13 +0100 Subject: [PATCH 0638/2376] Twitter Plugin: Add warning if the wiki needs to be saved and reloaded --- plugins/tiddlywiki/twitter/startup.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 plugins/tiddlywiki/twitter/startup.js diff --git a/plugins/tiddlywiki/twitter/startup.js b/plugins/tiddlywiki/twitter/startup.js new file mode 100644 index 000000000..48d106541 --- /dev/null +++ b/plugins/tiddlywiki/twitter/startup.js @@ -0,0 +1,27 @@ +/*\ +title: $:/plugins/tiddlywiki/twitter/startup.js +type: application/javascript +module-type: startup + +Twitter initialisation + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +// Export name and synchronous status +exports.name = "twitter"; +exports.before = ["startup"]; +exports.synchronous = true; + +exports.startup = function() { + var logger = new $tw.utils.Logger("twitter-plugin"); + if($tw.browser && !window.twttr) { + logger.alert("The plugin 'tiddlywiki/twitter' is disabled until this wiki is saved and reloaded again"); + } +}; + +})(); From c86a621d5d205e1ae0ce999b90ebe09addc45a9f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 21 Apr 2020 22:18:34 +0100 Subject: [PATCH 0639/2376] BrowseWidget: Add "accepts" attribute And add docs for the 'message' and 'param' attributes --- core/modules/widgets/browse.js | 4 ++++ editions/tw5.com/tiddlers/widgets/BrowseWidget.tid | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/browse.js b/core/modules/widgets/browse.js index ed57e4c33..de3c91fb8 100644 --- a/core/modules/widgets/browse.js +++ b/core/modules/widgets/browse.js @@ -46,6 +46,9 @@ BrowseWidget.prototype.render = function(parent,nextSibling) { if(this.nwsaveas) { domNode.setAttribute("nwsaveas",this.nwsaveas); } + if(this.accept) { + domNode.setAttribute("accept",this.accept); + } // Nw.js supports "webkitdirectory" and "nwdirectory" to allow a directory to be selected if(this.webkitdirectory) { domNode.setAttribute("webkitdirectory",this.webkitdirectory); @@ -83,6 +86,7 @@ BrowseWidget.prototype.execute = function() { this.param = this.getAttribute("param"); this.tooltip = this.getAttribute("tooltip"); this.nwsaveas = this.getAttribute("nwsaveas"); + this.accept = this.getAttribute("accept"); this.webkitdirectory = this.getAttribute("webkitdirectory"); this.nwdirectory = this.getAttribute("nwdirectory"); }; diff --git a/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid b/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid index 0f2544fb3..b241abeb1 100644 --- a/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid @@ -1,6 +1,6 @@ caption: browse created: 20131024141900000 -modified: 20170718142410367 +modified: 20200421221304177 tags: Widgets title: BrowseWidget type: text/vnd.tiddlywiki @@ -17,7 +17,9 @@ The content of the `<$browse>` widget is ignored. |multiple |Set to "multiple" to select multiple file upload | |deserializer |<<.from-version "5.1.15">> Optional name of deserializer to be used (by default the deserializer is derived from the file extension or type) | |tooltip |Optional tooltip text | -|message |Optional override of widget message to be generated. The parameter for the message will be the JavaScript object `event.target.files` | +|accepts |<<.from-version "5.1.23">> Optional comma delimited [[list of file accepted extensions|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#Unique_file_type_specifiers]] and/or MIME types | +|message |Optional override of widget message to be generated. The files will be passed in the JavaScript object `event.target.files` | +|param |Optional parameter to be passed with the custom message | On iPhone/iPad choosing the multiple option will remove the ability to take photographs/videos directly into TiddlyWiki. From 77a929faa3a33768e52cf2a34ecbef9c554a6a7b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 21 Apr 2020 22:19:03 +0100 Subject: [PATCH 0640/2376] ActionPopup widget: Add ability to cancel all popups --- core/modules/widgets/action-popup.js | 4 +++- editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/modules/widgets/action-popup.js b/core/modules/widgets/action-popup.js index 84fcec821..af17b3f51 100644 --- a/core/modules/widgets/action-popup.js +++ b/core/modules/widgets/action-popup.js @@ -57,7 +57,7 @@ Invoke the action associated with this widget ActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) { // Trigger the popup var popupLocationRegExp = /^\((-?[0-9\.E]+),(-?[0-9\.E]+),(-?[0-9\.E]+),(-?[0-9\.E]+)\)$/, - match = popupLocationRegExp.exec(this.actionCoords); + match = popupLocationRegExp.exec(this.actionCoords || ""); if(match) { $tw.popup.triggerPopup({ domNode: null, @@ -70,6 +70,8 @@ ActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) { title: this.actionState, wiki: this.wiki }); + } else { + $tw.popup.cancel(0); } return true; // Action was invoked }; diff --git a/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid index c1b7003d3..17fd51531 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid @@ -1,13 +1,13 @@ caption: action-popup created: 20200303114556528 -modified: 20200303114556528 +modified: 20200421221304177 tags: Widgets ActionWidgets title: ActionPopupWidget type: text/vnd.tiddlywiki ! Introduction -The ''action-popup'' widget is an [[action widget|ActionWidgets]] that triggers the display of a popup defined via a state tiddler. ActionWidgets are used within triggering widgets such as the ButtonWidget. +The ''action-popup'' widget is an [[action widget|ActionWidgets]] that triggers the display of a popup defined via a state tiddler, or clears all displayed popups. ActionWidgets are used within triggering widgets such as the ButtonWidget. ! Content and Attributes @@ -17,6 +17,8 @@ The ''action-popup'' widget is invisible. Any content within it is ignored. |$state |The title of the state tiddler for the popup | |$coords |Optional coordinates for the handle to which popup is positioned (in the format `(x,y,w,h)`) | +<<.from-version "5.1.23">> If the ''$coords'' attribute is missing or empty then all popups are cancelled. + ! Examples Here is an example of button that triggers the "more" button in the sidebar "Tools" tab. You may need to scroll to see the popup From cae937f1077b8a8f55f8603a3f7f1d2746d48daf Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 22 Apr 2020 11:46:36 +0200 Subject: [PATCH 0641/2376] Make selections follow palette colors (#4590) --- themes/tiddlywiki/vanilla/base.tid | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 28d551966..336ba6e6f 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -225,6 +225,16 @@ kbd { box-shadow: inset 0 -1px 0 <<colour muted-foreground>>; } +::selection { + background-color: <<colour primary>>; + color: <<colour page-background>>; +} + +::-moz-selection { + background-color: <<colour primary>>; + color: <<colour page-background>>; +} + /* Markdown likes putting code elements inside pre elements */ @@ -2726,4 +2736,4 @@ select { .tc-fill-background { fill: <<colour background>>; -} \ No newline at end of file +} From a4fb57bf15af7f9786ceb41625d82d57cb99dba8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 22 Apr 2020 12:10:34 +0100 Subject: [PATCH 0642/2376] Fix typo in BrowseWidget docs --- editions/tw5.com/tiddlers/widgets/BrowseWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid b/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid index b241abeb1..83953c26b 100644 --- a/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/BrowseWidget.tid @@ -17,7 +17,7 @@ The content of the `<$browse>` widget is ignored. |multiple |Set to "multiple" to select multiple file upload | |deserializer |<<.from-version "5.1.15">> Optional name of deserializer to be used (by default the deserializer is derived from the file extension or type) | |tooltip |Optional tooltip text | -|accepts |<<.from-version "5.1.23">> Optional comma delimited [[list of file accepted extensions|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#Unique_file_type_specifiers]] and/or MIME types | +|accept |<<.from-version "5.1.23">> Optional comma delimited [[list of file accepted extensions|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#Unique_file_type_specifiers]] and/or MIME types | |message |Optional override of widget message to be generated. The files will be passed in the JavaScript object `event.target.files` | |param |Optional parameter to be passed with the custom message | From 5f98e7d7b39366fb63b3bc22b63525991a2f62eb Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 22 Apr 2020 15:32:20 +0100 Subject: [PATCH 0643/2376] Ensure $tw.utils.hasClass/addClass/removeClass work with SVG elements These docs make clear that .className isn't recommended for SVG elements: https://developer.mozilla.org/en-US/docs/Web/API/Element/className#Notes --- core/modules/utils/dom/dom.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/modules/utils/dom/dom.js b/core/modules/utils/dom/dom.js index c90dc8009..df4c93b73 100644 --- a/core/modules/utils/dom/dom.js +++ b/core/modules/utils/dom/dom.js @@ -29,23 +29,23 @@ exports.removeChildren = function(node) { }; exports.hasClass = function(el,className) { - return el && el.className && el.className.toString().split(" ").indexOf(className) !== -1; + return el && el.hasAttribute && el.hasAttribute("class") && el.getAttribute("class").split(" ").indexOf(className) !== -1; }; exports.addClass = function(el,className) { - var c = el.className.split(" "); + var c = (el.getAttribute("class") || "").split(" "); if(c.indexOf(className) === -1) { c.push(className); - el.className = c.join(" "); + el.setAttribute("class",c.join(" ")); } }; exports.removeClass = function(el,className) { - var c = el.className.split(" "), + var c = (el.getAttribute("class") || "").split(" "), p = c.indexOf(className); if(p !== -1) { c.splice(p,1); - el.className = c.join(" "); + el.setAttribute("class",c.join(" ")); } }; From 2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 22 Apr 2020 16:40:02 +0100 Subject: [PATCH 0644/2376] Add support for _canonical_uri field of $:/favicon.ico --- core/modules/startup/favicon.js | 6 +++++- editions/tw5.com/tiddlers/howtos/Setting a favicon.tid | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/modules/startup/favicon.js b/core/modules/startup/favicon.js index 0d1792ea7..5adcec646 100644 --- a/core/modules/startup/favicon.js +++ b/core/modules/startup/favicon.js @@ -36,7 +36,11 @@ function setFavicon() { var tiddler = $tw.wiki.getTiddler(FAVICON_TITLE); if(tiddler) { var faviconLink = document.getElementById("faviconLink"); - faviconLink.setAttribute("href","data:" + tiddler.fields.type + ";base64," + tiddler.fields.text); + if(tiddler.fields._canonical_uri) { + faviconLink.setAttribute("href",tiddler.fields._canonical_uri); + } else { + faviconLink.setAttribute("href","data:" + tiddler.fields.type + ";base64," + tiddler.fields.text); + } } } diff --git a/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid b/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid index 7f83bb825..a18dbfd55 100644 --- a/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid +++ b/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid @@ -1,5 +1,5 @@ created: 20131224074240979 -modified: 20140912142228347 +modified: 20200422163752597 tags: [[Customise TiddlyWiki]] title: Setting a favicon type: text/vnd.tiddlywiki @@ -10,6 +10,8 @@ type: text/vnd.tiddlywiki When TiddlyWiki starts up in the browser it looks for a tiddler called [[$:/favicon.ico]] and dynamically uses it as the favicon for the page. If you modify the image then the favicon changes instantly to reflect it. +<<.from-version "5.1.23">> To set an external image as the favicon, assign the URL to the ''_canonical_uri'' field of the [[$:/favicon.ico]] tiddler. + ! favicons on the Server On the server, the ServerCommand will serve the tiddler [[$:/favicon.ico]] at the path `/favicon.ico`. From 1cc5c5e7f09283836c4aebb40bbc8e8aa752b2c2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 22 Apr 2020 17:47:34 +0100 Subject: [PATCH 0645/2376] Update release note And fix the github comparison link so that it works for the prerelease --- .../Releasing a new version of TiddlyWiki.tid | 1 + .../prerelease/tiddlers/Release 5.1.23.tid | 32 +++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid index c745fae33..47ee3115c 100644 --- a/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid +++ b/editions/dev/tiddlers/build/Releasing a new version of TiddlyWiki.tid @@ -10,6 +10,7 @@ type: text/vnd.tiddlywiki # Verify the version numbers in [[$:/config/OfficialPluginLibrary]] in `core/wiki/config/OfficialPluginLibrary.tid` # Move the latest release note from the prerelease edition into the tw5.com edition # Adjust the release date and the ''released'' field of the latest release tiddler (eg, [[Release 5.1.3]]) +# Also adjust the github.com comparison link to point to the tag for the new release # Ensure [[TiddlyWiki Releases]] has the new version as the default tab # Adjust the modified time of HelloThere # Make sure ''master'' is fully committed diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 9bb68bfd8..965df4b58 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,11 +1,11 @@ caption: 5.1.23 -created: 20200401124910939 -modified: 20200401124910939 +created: 20200422173236649 +modified: 20200422173236649 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki -//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...v5.1.23]]// +//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...master]]// ! Major Improvements @@ -14,24 +14,42 @@ type: text/vnd.tiddlywiki * +! Plugin Improvements + +* Freelinks Plugin +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements +* Twitter Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded + ! Performance Improvements * ! Usability Improvements -* +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] Vanilla theme to use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox pallete readability of toolbar buttons + ! Hackability Improvements -* +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f]] ''accept'' attribute to the BrowseWidget +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52]] [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images ! Bug Fixes -* +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4584]] restored missing parameter to `saveTiddler()` method sync adaptors +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04]] MakeLibraryCommand to skip non-directories ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: -* +* [[@BramChen|https://github.com/BramChen]] +* [[@BurningTreeC|https://github.com/BurningTreeC]] +* [[@danielo515|https://github.com/danielo515]] +* [[@idotobi|https://github.com/idotobi]] +* [[@pmario|https://github.com/pmario]] From 2385bd978fd6c12ea651ca678220681d35323b76 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 23 Apr 2020 04:10:52 -0400 Subject: [PATCH 0646/2376] Fix importvariables crash (#4593) * Fixed issue: multi nonMacro imports broke everything * Fixed issue: dead variables in import might linger --- core/modules/widgets/importvariables.js | 11 ++++- editions/test/tiddlers/tests/test-widget.js | 49 +++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/importvariables.js b/core/modules/widgets/importvariables.js index 3ea1d1174..56cc0852c 100644 --- a/core/modules/widgets/importvariables.js +++ b/core/modules/widgets/importvariables.js @@ -38,6 +38,8 @@ Compute the internal state of the widget */ ImportVariablesWidget.prototype.execute = function(tiddlerList) { var widgetPointer = this; + // Got to flush all the accumulated variables + this.variables = new this.variablesConstructor(); // Get our parameters this.filter = this.getAttribute("filter"); // Compute the filter @@ -70,7 +72,14 @@ ImportVariablesWidget.prototype.execute = function(tiddlerList) { widgetPointer.variables[key] = widget.variables[key]; }); } else { - widgetPointer.makeChildWidgets([node]); + widgetPointer.children = [widgetPointer.makeChildWidget(node)]; + // No more regenerating children for + // this widget. If it needs to refresh, + // it'll do so along with the the whole + // importvariable tree. + if (widgetPointer != this) { + widgetPointer.makeChildWidgets = function(){}; + } widgetPointer = widgetPointer.children[0]; } parseTreeNode = parseTreeNode.children && parseTreeNode.children[0]; diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index c20305746..0efc8b126 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -504,6 +504,55 @@ describe("Widget module", function() { expect(wrapper.innerHTML).toBe("<p>Aval Bval Cval</p>"); }); + it("can have more than one macroDef variable imported", function() { + var wiki = new $tw.Wiki(); + wiki.addTiddlers([ + {title: "ABC", text: "<$set name=A value=A>\n\n<$set name=B value=B>\n\n<$set name=C value=C>\n\ndummy text</$set></$set></$set>"}, + {title: "D", text: "\\define D() D"}]); + // A and B shouldn't chew up C just cause it's a macroDef + var text = "\\import ABC D\n<<A>> <<B>> <<C>> <<D>>"; + var widgetNode = createWidgetNode(parseText(text,wiki),wiki); + // Render the widget node to the DOM + var wrapper = renderWidgetNode(widgetNode); + // Test the rendering + expect(wrapper.innerHTML).toBe("<p>A B C D</p>"); + }); + + it("import doesn't hold onto dead variables", function() { + var wiki = new $tw.Wiki(); + wiki.addTiddlers([ + {title: "ABC", text: "\\define A() A\n\\define B() B\n<$set name=C value=C>\n\n</$set>"}, + {title: "DE", text: "\\define D() D\n\\define E() E"}]); + var text = "\\import ABC DE\ncontent"; + var widgetNode = createWidgetNode(parseText(text,wiki),wiki); + // Render the widget node to the DOM + renderWidgetNode(widgetNode); + var childNode = widgetNode; + while (childNode.children.length > 0) { + childNode = childNode.children[0]; + } + // First make sure A and B imported + expect(childNode.getVariable("A")).toBe("A"); + expect(childNode.getVariable("B")).toBe("B"); + expect(childNode.getVariable("C")).toBe("C"); + expect(childNode.getVariable("D")).toBe("D"); + expect(childNode.getVariable("E")).toBe("E"); + // Then change A and remove B + wiki.addTiddler({title: "ABC", text: "\\define A() A2\n<$set name=C value=C2>\n\n</$set>"}); + wiki.addTiddler({title: "DE", text: "\\define D() D2"}); + widgetNode.refresh({"ABC": {modified: true}, "DE": {modified: true}}); + var childNode = widgetNode; + while (childNode.children.length > 0) { + childNode = childNode.children[0]; + } + // Make sure \import recognized changes and deletions + expect(childNode.getVariable("A")).toBe("A2"); + expect(childNode.getVariable("B")).toBe(undefined); + expect(childNode.getVariable("C")).toBe("C2"); + expect(childNode.getVariable("D")).toBe("D2"); + expect(childNode.getVariable("E")).toBe(undefined); + }); + /** Special case. <$importvariables> has different handling if * it doesn't end up importing any variables. Make sure it * doesn't forget its childrenNodes. From bed76b9a32bf5e7d25cfe20c85339945a03e0d8a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 23 Apr 2020 09:41:38 +0100 Subject: [PATCH 0647/2376] Release note: fix typo Thanks @BramChen --- editions/prerelease/tiddlers/Release 5.1.23.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 965df4b58..1e49be8ba 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -29,7 +29,7 @@ type: text/vnd.tiddlywiki * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] Vanilla theme to use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration -* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox pallete readability of toolbar buttons +* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox palette readability of toolbar buttons ! Hackability Improvements From 619c0752bd3c6e71d1fcdb74daa03cfe8257afe4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 25 Apr 2020 11:26:19 +0100 Subject: [PATCH 0648/2376] Add new sortsub operator --- core/modules/filters/compare.js | 38 +--------------- core/modules/filters/sortsub.js | 44 +++++++++++++++++++ core/modules/utils/utils.js | 41 +++++++++++++++++ editions/test/tiddlers/tests/test-filters.js | 18 ++++++++ .../examples/sortsub Operator (Examples).tid | 32 ++++++++++++++ .../tiddlers/filters/sortsub Operator.tid | 28 ++++++++++++ 6 files changed, 164 insertions(+), 37 deletions(-) create mode 100644 core/modules/filters/sortsub.js create mode 100644 editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/sortsub Operator.tid diff --git a/core/modules/filters/compare.js b/core/modules/filters/compare.js index 186dfa27b..fd509a28e 100644 --- a/core/modules/filters/compare.js +++ b/core/modules/filters/compare.js @@ -16,7 +16,7 @@ exports.compare = function(source,operator,options) { var suffixes = operator.suffixes || [], type = (suffixes[0] || [])[0], mode = (suffixes[1] || [])[0], - typeFn = types[type] || types.number, + typeFn = $tw.utils.makeCompareFunction(type,{defaultType: "number"}), modeFn = modes[mode] || modes.eq, invert = operator.prefix === "!", results = []; @@ -28,42 +28,6 @@ exports.compare = function(source,operator,options) { return results; }; -var types = { - "number": function(a,b) { - return compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b)); - }, - "integer": function(a,b) { - return compare($tw.utils.parseInt(a),$tw.utils.parseInt(b)); - }, - "string": function(a,b) { - return compare("" + a,"" +b); - }, - "date": function(a,b) { - var dateA = $tw.utils.parseDate(a), - dateB = $tw.utils.parseDate(b); - if(!isFinite(dateA)) { - dateA = new Date(0); - } - if(!isFinite(dateB)) { - dateB = new Date(0); - } - return compare(dateA,dateB); - }, - "version": function(a,b) { - return $tw.utils.compareVersions(a,b); - } -}; - -function compare(a,b) { - if(a > b) { - return +1; - } else if(a < b) { - return -1; - } else { - return 0; - } -}; - var modes = { "eq": function(value) {return value === 0;}, "ne": function(value) {return value !== 0;}, diff --git a/core/modules/filters/sortsub.js b/core/modules/filters/sortsub.js new file mode 100644 index 000000000..82de59f8f --- /dev/null +++ b/core/modules/filters/sortsub.js @@ -0,0 +1,44 @@ +/*\ +title: $:/core/modules/filters/sortsub.js +type: application/javascript +module-type: filteroperator + +Filter operator for sorting by a subfilter + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.sortsub = function(source,operator,options) { + // Collect the input titles + var inputTitles = []; + source(function(tiddler,title) { + inputTitles.push(title); + }); + // Pass them through the subfilter to get the sort keys + var sortKeys = options.wiki.filterTiddlers(operator.operand,options.widget,options.wiki.makeTiddlerIterator(inputTitles)); + // Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays + var indexes = []; + while(inputTitles.length > indexes.length) { + indexes.push(indexes.length); + } + // Sort the indexes + var compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: "string",invert: operator.prefix === "!"}); + indexes = indexes.sort(function(a,b) { + return compareFn(sortKeys[a],sortKeys[b]); + }); + // Make the results array in order + var results = []; + $tw.utils.each(indexes,function(index) { + results.push(inputTitles[index]); + }); + return results; +}; + +})(); diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 7f00f05bb..a5fb24697 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -813,4 +813,45 @@ exports.stringifyNumber = function(num) { return num + ""; }; +exports.makeCompareFunction = function(type,options) { + options = options || {}; + var gt = options.invert ? -1 : +1, + lt = options.invert ? +1 : -1, + compare = function(a,b) { + if(a > b) { + return gt ; + } else if(a < b) { + return lt; + } else { + return 0; + } + }, + types = { + "number": function(a,b) { + return compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b)); + }, + "integer": function(a,b) { + return compare($tw.utils.parseInt(a),$tw.utils.parseInt(b)); + }, + "string": function(a,b) { + return compare("" + a,"" +b); + }, + "date": function(a,b) { + var dateA = $tw.utils.parseDate(a), + dateB = $tw.utils.parseDate(b); + if(!isFinite(dateA)) { + dateA = new Date(0); + } + if(!isFinite(dateB)) { + dateB = new Date(0); + } + return compare(dateA,dateB); + }, + "version": function(a,b) { + return $tw.utils.compareVersions(a,b); + } + }; + return (types[type] || types[options.defaultType] || types.number); +}; + })(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 929abe93d..0e3ede71b 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -661,6 +661,24 @@ function runTests(wiki) { expect(wiki.filterTiddlers("b a b c +[sortby[b a c b]]").join(",")).toBe("b,a,c"); }); + it("should handle the sortsub operator", function() { + var widget = require("$:/core/modules/widgets/widget.js"); + var rootWidget = new widget.widget({ type:"widget", children:[ {type:"widget", children:[]} ] }, + { wiki:wiki, document:$tw.document}); + rootWidget.makeChildWidgets(); + var anchorWidget = rootWidget.children[0]; + rootWidget.setVariable("sort1","[length[]]"); + rootWidget.setVariable("sort2","[get[text]else[]length[]]"); + expect(wiki.filterTiddlers("[sortsub:number<sort1>]",anchorWidget).join(",")).toBe("one,hasList,TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test"); + expect(wiki.filterTiddlers("[!sortsub:number<sort1>]",anchorWidget).join(",")).toBe("filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne,has filter,hasList,one"); + expect(wiki.filterTiddlers("[sortsub:string<sort1>]",anchorWidget).join(",")).toBe("TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test,one,hasList"); + expect(wiki.filterTiddlers("[!sortsub:string<sort1>]",anchorWidget).join(",")).toBe("hasList,one,filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne,has filter"); + expect(wiki.filterTiddlers("[sortsub:number<sort2>]",anchorWidget).join(",")).toBe("one,TiddlerOne,hasList,has filter,a fourth tiddler,Tiddler Three,$:/TiddlerTwo,filter regexp test,$:/ShadowPlugin"); + expect(wiki.filterTiddlers("[!sortsub:number<sort2>]",anchorWidget).join(",")).toBe("$:/ShadowPlugin,filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,has filter,hasList,TiddlerOne,one"); + expect(wiki.filterTiddlers("[sortsub:string<sort2>]",anchorWidget).join(",")).toBe("one,TiddlerOne,hasList,has filter,$:/ShadowPlugin,a fourth tiddler,Tiddler Three,$:/TiddlerTwo,filter regexp test"); + expect(wiki.filterTiddlers("[!sortsub:string<sort2>]",anchorWidget).join(",")).toBe("filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,$:/ShadowPlugin,has filter,hasList,TiddlerOne,one"); + }); + } }); diff --git a/editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid new file mode 100644 index 000000000..475413155 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid @@ -0,0 +1,32 @@ +created: 20200425110427700 +modified: 20200425110427700 +tags: [[sortsub Operator]] [[Operator Examples]] +title: sortsub Operator (Examples) +type: text/vnd.tiddlywiki + +\define show-variable(name) +<li>''$name$'': <code><$text text=<<$name$>>/></code></li> +\end + + +<$vars + compare-by-title-length="[length[]]" + compare-by-text-length="[get[text]else[]length[]]" + compare-by-newest-of-modified-and-created-dates="[get[modified]else[19700101]]" +> + +These examples make use of the following variables: + +<ul> +<<show-variable compare-by-title-length>> +<<show-variable compare-by-text-length>> +<<show-variable compare-by-newest-of-modified-and-created-dates>> +</ul> + +<<.operator-example 1 "[sortsub:number<compare-by-title-length>limit[10]]">> +<<.operator-example 2 "[!sortsub:number<compare-by-title-length>limit[10]]">> +<<.operator-example 3 "[sortsub:number<compare-by-text-length>limit[10]]">> +<<.operator-example 4 "[!sortsub:number<compare-by-text-length>limit[10]]">> +<<.operator-example 5 "[tag[Field Operators]sortsub:date<compare-by-newest-of-modified-and-created-dates>]">> + +</$vars> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/sortsub Operator.tid b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid new file mode 100644 index 000000000..8a4981f44 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid @@ -0,0 +1,28 @@ +created: 20200424160155182 +modified: 20200424160155182 +tags: [[Filter Operators]] [[Field Operators]] [[Order Operators]] [[Negatable Operators]] +title: sortsub Operator +type: text/vnd.tiddlywiki +caption: sortsub +op-purpose: sort the input by the result of evaluating a subfilter for each item +op-input: a [[selection of titles|Title Selection]] +op-parameter: a subfilter to be evaluated +op-parameter-name: S +op-suffix: the type used for the comparison (string, number, integer, date, version), defaulting to string +op-suffix-name: T +op-output: the input, sorted into ascending order by the result of evaluating subfilter <<.param S>> +op-neg-output: the input, sorted into reverse order by the result of evaluating subfilter <<.param S>> + +The list of input titles are passed to the subfilter. The subfilter transforms the input titles into the form needed for sorting. For example, the subfilter `[length[]]` transforms each input title in the number representing its length, and thus sorts the input titles according to their length. + +The suffix <<.place T>> determines how the items are compared and can be: + +* "string" (the default) +* "number" - invalid numbers are interpreted as zero +* "integer" - invalid integers are interpreted as zero +* "date" - invalid dates are interpreted as 1st January 1970 +* "version" - invalid versions are interpreted as "v0.0.0" + +Note that subfilters should return the same number of items that they are passed. Any missing entries will be treated as zero or the empty string. In particular, when retrieving the value of a field with the [[get Operator]] it is helpful to guard against a missing field value using the [[else Operator]]. For example `[get[myfield]else[default-value]...`. + +<<.operator-examples "sortsub">> From 685157266dca3b4f41bb28f331bfff0f248164a8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 25 Apr 2020 11:27:31 +0100 Subject: [PATCH 0649/2376] Release note update --- editions/prerelease/tiddlers/Release 5.1.23.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 1e49be8ba..8eb37fd60 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -34,6 +34,7 @@ type: text/vnd.tiddlywiki ! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter * [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f]] ''accept'' attribute to the BrowseWidget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed From ad575efdcc4d03f9d09bf72defe0e8146164d34f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 25 Apr 2020 15:22:24 +0100 Subject: [PATCH 0650/2376] Update sortsub to evaluate the subfilter for each item in the list See the discussion here https://groups.google.com/d/msg/tiddlywiki/BqUFQ3v-fZw/U0F04CFFBQAJ --- core/modules/filters/sortsub.js | 27 ++++++++++++++----- editions/test/tiddlers/tests/test-filters.js | 10 +++++++ .../tiddlers/filters/sortsub Operator.tid | 4 ++- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/core/modules/filters/sortsub.js b/core/modules/filters/sortsub.js index 82de59f8f..f556bfafc 100644 --- a/core/modules/filters/sortsub.js +++ b/core/modules/filters/sortsub.js @@ -16,17 +16,30 @@ Filter operator for sorting by a subfilter Export our filter function */ exports.sortsub = function(source,operator,options) { - // Collect the input titles - var inputTitles = []; + // Compile the subfilter + var filterFn = options.wiki.compileFilter(operator.operand); + // Collect the input titles and the corresponding sort keys + var inputTitles = [], + sortKeys = []; source(function(tiddler,title) { inputTitles.push(title); + var r = filterFn.call(options.wiki,function(iterator) { + iterator(options.wiki.getTiddler(title),title); + },{ + getVariable: function(name) { + if(name === "currentTiddler") { + return title; + } else { + return options.widget.getVariable(name); + } + } + }); + sortKeys.push(r[0] || ""); }); - // Pass them through the subfilter to get the sort keys - var sortKeys = options.wiki.filterTiddlers(operator.operand,options.widget,options.wiki.makeTiddlerIterator(inputTitles)); // Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays - var indexes = []; - while(inputTitles.length > indexes.length) { - indexes.push(indexes.length); + var indexes = new Array(inputTitles.length); + for(var t=0; t<inputTitles.length; t++) { + indexes[t] = t; } // Sort the indexes var compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: "string",invert: operator.prefix === "!"}); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 0e3ede71b..61e229540 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -92,6 +92,8 @@ function setupWiki(wikiOptions) { title: "TiddlerOne", text: "The quick brown fox in $:/TiddlerTwo", tags: ["one"], + cost: "123", + value: "120", authors: "Joe Bloggs", modifier: "JoeBloggs", modified: "201304152222"}); @@ -99,6 +101,8 @@ function setupWiki(wikiOptions) { title: "$:/TiddlerTwo", text: "The rain in Spain\nfalls mainly on the plain and [[a fourth tiddler]]", tags: ["two"], + cost: "42", + value: "190", authors: "[[John Doe]]", modifier: "John", modified: "201304152211"}); @@ -106,12 +110,16 @@ function setupWiki(wikiOptions) { title: "Tiddler Three", text: "The speed of sound in light\n\nThere is no TiddlerZero but TiddlerSix", tags: ["one","two"], + cost: "56", + value: "80", modifier: "John", modified: "201304162202"}); wiki.addTiddler({ title: "a fourth tiddler", text: "The quality of mercy is not drained by [[Tiddler Three]]", tags: [], + cost: "82", + value: "72", empty: "not", modifier: "John"}); wiki.addTiddler({ @@ -669,6 +677,7 @@ function runTests(wiki) { var anchorWidget = rootWidget.children[0]; rootWidget.setVariable("sort1","[length[]]"); rootWidget.setVariable("sort2","[get[text]else[]length[]]"); + rootWidget.setVariable("sort3","[{!!value}divide{!!cost}]"); expect(wiki.filterTiddlers("[sortsub:number<sort1>]",anchorWidget).join(",")).toBe("one,hasList,TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test"); expect(wiki.filterTiddlers("[!sortsub:number<sort1>]",anchorWidget).join(",")).toBe("filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne,has filter,hasList,one"); expect(wiki.filterTiddlers("[sortsub:string<sort1>]",anchorWidget).join(",")).toBe("TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test,one,hasList"); @@ -677,6 +686,7 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[!sortsub:number<sort2>]",anchorWidget).join(",")).toBe("$:/ShadowPlugin,filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,has filter,hasList,TiddlerOne,one"); expect(wiki.filterTiddlers("[sortsub:string<sort2>]",anchorWidget).join(",")).toBe("one,TiddlerOne,hasList,has filter,$:/ShadowPlugin,a fourth tiddler,Tiddler Three,$:/TiddlerTwo,filter regexp test"); expect(wiki.filterTiddlers("[!sortsub:string<sort2>]",anchorWidget).join(",")).toBe("filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,$:/ShadowPlugin,has filter,hasList,TiddlerOne,one"); + expect(wiki.filterTiddlers("[[TiddlerOne]] [[$:/TiddlerTwo]] [[Tiddler Three]] [[a fourth tiddler]] +[!sortsub:number<sort3>]",anchorWidget).join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler"); }); } diff --git a/editions/tw5.com/tiddlers/filters/sortsub Operator.tid b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid index 8a4981f44..0e48e29bc 100644 --- a/editions/tw5.com/tiddlers/filters/sortsub Operator.tid +++ b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid @@ -13,7 +13,9 @@ op-suffix-name: T op-output: the input, sorted into ascending order by the result of evaluating subfilter <<.param S>> op-neg-output: the input, sorted into reverse order by the result of evaluating subfilter <<.param S>> -The list of input titles are passed to the subfilter. The subfilter transforms the input titles into the form needed for sorting. For example, the subfilter `[length[]]` transforms each input title in the number representing its length, and thus sorts the input titles according to their length. +Each item in the list of input titles is passed to the subfilter in turn. The subfilter transforms the input titles into the form needed for sorting. For example, the subfilter `[length[]]` transforms each input title in the number representing its length, and thus sorts the input titles according to their length. + +Note that within the subfilter, the "currentTiddler" variable is set to the title of the tiddler being processed. This permits subfilters like `[{!!value}divide{!!cost}]` to be used for computation. The suffix <<.place T>> determines how the items are compared and can be: From 13b8281f6bbe09fcf38b937ebf4e7de37bbea03f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 27 Apr 2020 15:00:06 +0100 Subject: [PATCH 0651/2376] $tw.utils.copyDirectory: Ensure directories don't overlap --- core/modules/utils/filesystem.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 8ec1554f7..df820a63c 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -36,8 +36,12 @@ Recursively (and synchronously) copy a directory and all its content */ exports.copyDirectory = function(srcPath,dstPath) { // Remove any trailing path separators - srcPath = $tw.utils.removeTrailingSeparator(srcPath); - dstPath = $tw.utils.removeTrailingSeparator(dstPath); + srcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath)); + dstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath)); + // Check that neither director is within the other + if(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) { + return "Cannot copy nested directories"; + } // Create the destination directory var err = $tw.utils.createDirectory(dstPath); if(err) { From 7f014459031ef27ab5947f7cdf54ffc19e44c041 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 29 Apr 2020 17:02:17 +0100 Subject: [PATCH 0652/2376] Update information about Quine for iOS --- .../tiddlers/saving/Saving on iPad_iPhone.tid | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid index b04e81929..7348de741 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid @@ -3,28 +3,25 @@ created: 20131129101027725 delivery: App description: iPad/iPhone app for working with TiddlyWiki method: save -modified: 20171113105954683 +modified: 20200428224059031 tags: Saving iOS title: Saving on iPad/iPhone type: text/vnd.tiddlywiki -The iPad/iPhone app ''Quine'' makes it possible to edit and save changes to TiddlyWiki5, including working offline without a network connection. [[Download it here|https://itunes.apple.com/us/app/quine/id1228682923?mt=8]]. +The iPad/iPhone app ''Quine 2'' makes it possible to view, edit and then save changes to TiddlyWiki5 on iOS. [[Download it here|https://itunes.apple.com/us/app/quine/id1228682923?mt=8]]. Instructions for use: -# Open Quine -# On iPad -#* Touch the file button (<) or swipe from the left of the screen to open the file list -# On iPhone -#* The file list will show automatically unless a wiki is already open -# Touch the new file button (+) in the file list window to create a new TiddlyWiki5 file -# Swipe any file item from the right to see a list of additional "actions" possible for that file -# Touch any listed file item or folder to open it - wikis will open in Quine's custom browser -# When you have an open TiddlyWiki5: -# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar -# Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button -# Save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar -#* A confirmation message should appear at the top right of the window -# Touch "Done" when done editing a wiki +# Open Quine 2 +# Tap the + toolbar button to create and open a new TiddlyWiki +# From the file list tap an existing TiddlyWiki file to open it +# Edit the TiddlyWiki as normal, and save as normal using either Autosave or the TiddlyWiki save button <<.icon $:/core/images/save-button>> +# Tap the left hand "Documents" toolbar button to close an open TiddlyWiki + +*Quine 2 works natively in iOS with the local file system and the iCloud file system +*Quine 2 also allows you to open, edit and save TiddlyWiki files stored with cloud file providers +*Quine 2 allows you to follow embedded WikiText links and canonical links to external files for cloud-like file providers which support "folder level sharing". +**This includes the apps "Secure Shellfish" and "Working Copy". Most providers, though, do not allow apps like Quine 2 to access linked files this way. +** If you wish to enable such links for "well behaved" file providers, toggle "on" the "Enable folder selection for out-of-sandbox links" setting in iOS Settings for Quine 2 //Note that Quine is published independently of TiddlyWiki// From 9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 30 Apr 2020 18:00:33 +0100 Subject: [PATCH 0653/2376] Add new favicon for prerelease Fixes #4619 --- .../prerelease/tiddlers/system/favicon.ico | Bin 0 -> 120606 bytes .../tiddlers/system/favicon.ico.meta | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 editions/prerelease/tiddlers/system/favicon.ico create mode 100644 editions/prerelease/tiddlers/system/favicon.ico.meta diff --git a/editions/prerelease/tiddlers/system/favicon.ico b/editions/prerelease/tiddlers/system/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..707c675775ab832d50811114b4bf057ea348dfec GIT binary patch literal 120606 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 literal 0 HcmV?d00001 diff --git a/editions/prerelease/tiddlers/system/favicon.ico.meta b/editions/prerelease/tiddlers/system/favicon.ico.meta new file mode 100644 index 000000000..2f3e81713 --- /dev/null +++ b/editions/prerelease/tiddlers/system/favicon.ico.meta @@ -0,0 +1,2 @@ +title: $:/favicon.ico +type: image/x-icon From 5eee11beedd1b54a733a9ec37734c4d1a94aed19 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 2 May 2020 13:16:52 +0100 Subject: [PATCH 0654/2376] Update Catalan translation --- languages/ca-ES/Buttons.multids | 14 ++-- languages/ca-ES/ControlPanel.multids | 33 ++++++--- languages/ca-ES/Dates.multids | 70 ++++++++++---------- languages/ca-ES/Docs/ModuleTypes.multids | 2 +- languages/ca-ES/Docs/PaletteColours.multids | 2 + languages/ca-ES/EditTemplate.multids | 2 + languages/ca-ES/Fields.multids | 8 ++- languages/ca-ES/Filters.multids | 2 +- languages/ca-ES/Misc.multids | 4 +- languages/ca-ES/Search.multids | 2 +- languages/ca-ES/Snippets/TableOfContents.tid | 4 +- languages/ca-ES/ThemeTweaks.multids | 34 +++++----- 12 files changed, 98 insertions(+), 79 deletions(-) diff --git a/languages/ca-ES/Buttons.multids b/languages/ca-ES/Buttons.multids index 9ef77b819..7ed3e7232 100644 --- a/languages/ca-ES/Buttons.multids +++ b/languages/ca-ES/Buttons.multids @@ -85,7 +85,7 @@ Info/Hint: Mostra la informació d'aquest tiddler Italic/Caption: cursiva Italic/Hint: Aplica el format de cursiva a la selecció Language/Caption: idioma -Language/Hint: Trieu l'idioma de la interfície +Language/Hint: Trieu l'idioma LineWidth/Caption: amplada de la línia LineWidth/Hint: Trieu l'amplada de la línia per pintar Link/Caption: enllaç @@ -127,7 +127,7 @@ Palette/Hint: Trieu el color de la paleta Permalink/Caption: enllaç permanent Permalink/Hint: Fés que la barra d'adreces del navegador mostri un enllaç directe cap aquest tiddler Permaview/Caption: vista permanent -Permaview/Hint: Fés que la barra d'adreces del navegador mostri un enllaç directe cap a tots els tiddlers d'aquesta història +Permaview/Hint: Fés que la barra d'adreces del navegador mostri un enllaç directe cap a tots els tiddlers de la cronologia Picture/Caption: imatge Picture/Hint: Inserta una imatge Preview/Caption: previsualització @@ -154,11 +154,11 @@ Size/Caption/Height: Alçada: Size/Caption/Resize: Mida de la imatge Size/Caption/Width: Amplada: Size/Hint: Trieu la mida de la imatge -Stamp/Caption: marca -Stamp/Caption/New: Afegiu la vostra pròpia -Stamp/Hint: Inserta un fragment de text -Stamp/New/Text: Fragment de text. (Recordeu afegir un títol descriptiu al camp de la llegenda). -Stamp/New/Title: Es mostra el nom al menú +Stamp/Caption: Plantilla +Stamp/Caption/New: Afegeix una nova plantilla +Stamp/Hint: Inserta una plantilla de text +Stamp/New/Text: Plantilla de text. (Recordeu afegir un text descriptiu al camp //caption//). +Stamp/New/Title: Nom que es mostrarà al menú d'afegir una plantilla StoryView/Caption: visualització de la cronologia StoryView/Hint: Trieu la visualització de la cronologia Strikethrough/Caption: ratllat diff --git a/languages/ca-ES/ControlPanel.multids b/languages/ca-ES/ControlPanel.multids index ce761302b..217c0f6fd 100644 --- a/languages/ca-ES/ControlPanel.multids +++ b/languages/ca-ES/ControlPanel.multids @@ -9,10 +9,11 @@ Basics/Caption: Bàsic Basics/DefaultTiddlers/BottomHint: Useu [[claudàtors dobles]] per als títols amb espais. O podeu triar <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">mantenir l'ordre de la cronologia</$button> Basics/DefaultTiddlers/Prompt: Tiddlers per omissió: Basics/DefaultTiddlers/TopHint: Trieu quins tiddlers s'han de mostrar a l'inici: -Basics/Language/Prompt: Hola! Idioma actual: +Basics/Language/Prompt: Bon dia! Trieu l'idioma: Basics/NewJournal/Tags/Prompt: Etiquetes per als nous tiddlers del diari Basics/NewJournal/Text/Prompt: Text dels nous tiddlers del diari Basics/NewJournal/Title/Prompt: Títol dels nous tiddlers del diari +Basics/NewTiddler/Tags/Prompt: Etiquetes dels nous tiddlers Basics/NewTiddler/Title/Prompt: Títol dels nous tiddlers Basics/OverriddenShadowTiddlers/Prompt: Número de tiddlers ombra sobreescrits: Basics/ShadowTiddlers/Prompt: Número de tiddlers ombra: @@ -45,7 +46,7 @@ KeyboardShortcuts/Remove/Hint: suprimeix la drecera del teclat LoadedModules/Caption: Mòduls carregats LoadedModules/Hint: Aquests són els mòduls tiddlers enllaçats als seus tiddlers font. Els mòduls indicats en cursiva no disposen de tiddler font, sovint per que s'han configurat a l'arrencada. Palette/Caption: Paleta -Palette/Editor/Clone/Caption: clona paquets de connectors +Palette/Editor/Clone/Caption: clona Palette/Editor/Clone/Prompt: Es recomana que cloneu aquesta paleta ombra abans d'editar-la Palette/Editor/Delete/Hint: suprimeix aquesta entrada de la paleta actual Palette/Editor/Names/External/Show: Mostra el noms dels colors que no formen part de la paleta actual @@ -63,11 +64,13 @@ Parsing/Pragma/Caption: Regles d'anàlisi Pragma Plugins/Add/Caption: Obtingueu més connectors Plugins/Add/Hint: Instal·leu connectors de la biblioteca oficial Plugins/AlreadyInstalled/Hint: Aquest connector ja té instal·lada la versió <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: També necessita: Plugins/Caption: Connectors Plugins/ClosePluginLibrary: tanca la biblioteca de connectors Plugins/Disable/Caption: desactiva Plugins/Disable/Hint: Desactiva aquest connector quan la pàgina es torni a carregar Plugins/Disabled/Status: (desactivat) +Plugins/Downgrade/Caption: seactualitza Plugins/Empty/Hint: Cap Plugins/Enable/Caption: activa Plugins/Enable/Hint: Activa aquest connector quan la pàgina es torni a carregar @@ -80,9 +83,15 @@ Plugins/NotInstalled/Hint: Aquest connector no està instal·lat Plugins/OpenPluginLibrary: obre la biblioteca de connectors Plugins/Plugins/Caption: Connectors Plugins/Plugins/Hint: Connectors +Plugins/PluginWillRequireReload: (cal tornar-ho a carregar) Plugins/Reinstall/Caption: torna a instal·lar +Plugins/SubPluginPrompt: Amb <<count>> sub-connectors disponibles Plugins/Themes/Caption: Temes Plugins/Themes/Hint: Connectors del tema +Plugins/Update/Caption: actualització +Plugins/Updates/Caption: Actualitzacions +Plugins/Updates/Hint: Actualitzacions disponibles dels connectors instal·lats +Plugins/Updates/UpdateAll/Caption: Actualitza <<update-count>> connectors Saving/Caption: Desa Saving/DownloadSaver/AutoSave/Description: Permet que el gestor de baixades desi automàticament Saving/DownloadSaver/AutoSave/Hint: Activa el desat automàtic pel gestor de baixades @@ -102,6 +111,8 @@ Saving/GitService/Branch: Branca destinació a on desar Saving/GitService/CommitMessage: Desat per TiddlyWiki Saving/GitService/Description: Aquests paràmetres només s'utilitzen quan es desa a <<service-name>> Saving/GitService/Filename: Nom del fitxer destinació (per exemple `index.html`) +Saving/GitService/Gitea/Caption: Gestor de baixades Gitea +Saving/GitService/Gitea/Password: Testimoni d'accès personal de l'API (via la interfície web de Gitea: `Paràmetres | Aplicacions | Genera un Nou Testimoni`) Saving/GitService/GitHub/Caption: Gestor de baixades de ~GitHub Saving/GitService/GitHub/Password: Contrasenya, clau OAUTH o clau d'accés personal (veieu els detalls a la [[pàgina d'ajuda del GitHub|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] ) Saving/GitService/GitLab/Caption: Gestor de baixades de ~GitLab @@ -128,13 +139,13 @@ Settings/AutoSave/Disabled/Description: No desis els canvis de forma automàtica Settings/AutoSave/Enabled/Description: Desa els canvis de forma automàtica Settings/AutoSave/Hint: Desa els canvis de forma automàtica mentre s'està editant Settings/CamelCase/Caption: Enllaços wiki tipus CamelCase -Settings/CamelCase/Description: Activa l'enllaç automàtic de ~CamelCase -Settings/CamelCase/Hint: Podeu desactivar l’enllaç automàtic de les frases ~CamelCase globalment. Cal que es torni a carregar per tenir efecte +Settings/CamelCase/Description: Activa l'enllaç automàtic tipus ~CamelCase +Settings/CamelCase/Hint: Podeu desactivar globalment l’enllaç automàtic de les frases ~CamelCase. Cal que es torni a carregar per tenir efecte Settings/Caption: Paràmetres Settings/DefaultMoreSidebarTab/Caption: Pestanya Més de la barra lateral per omissió -Settings/DefaultMoreSidebarTab/Hint: Indiqueu quina pestanya Més de la barra lateral es mostra per omissió +Settings/DefaultMoreSidebarTab/Hint: Indiqueu la pestanya Més de la barra lateral que es mostra per omissió Settings/DefaultSidebarTab/Caption: Pestanya de la barra lateral que es mostra per omissió -Settings/DefaultSidebarTab/Hint: Indica quina pestanya de la barra lateral es mostra per omissió +Settings/DefaultSidebarTab/Hint: Indiqueu la pestanya de la barra lateral que es mostra per omissió Settings/EditorToolbar/Caption: Barra d'eines de l'editor Settings/EditorToolbar/Description: Mostra la barra d'eines de l'editor Settings/EditorToolbar/Hint: Activa o desactiva la barra d'eines de l'editor: @@ -144,12 +155,12 @@ Settings/InfoPanelMode/Hint: Controla quan es tanca el tauler d'informació del Settings/InfoPanelMode/Popup/Description: El tauler d’informació del Tiddler es tanca automàticament Settings/InfoPanelMode/Sticky/Description: El tauler d’informació del Tiddler roman obert fins que es tanqui explícitament Settings/LinkToBehaviour/Caption: Comportament d'obertura del tiddler -Settings/LinkToBehaviour/InsideRiver/Hint: Navegació des de //dins de// la cronologia +Settings/LinkToBehaviour/InsideRiver/Hint: Navegació des de //dins// de la cronologia Settings/LinkToBehaviour/OpenAbove: Obre per sobre del tiddler actual Settings/LinkToBehaviour/OpenAtBottom: Obre a la part inferior de la cronologia Settings/LinkToBehaviour/OpenAtTop: Obre a la part superior de la cronologia Settings/LinkToBehaviour/OpenBelow: Obre per sota del tiddler actual -Settings/LinkToBehaviour/OutsideRiver/Hint: Navegació des de //fora de//la cronologia +Settings/LinkToBehaviour/OutsideRiver/Hint: Navegació des de //fora// de la cronologia Settings/MissingLinks/Caption: Enllaços Wiki Settings/MissingLinks/Description: Activa els enllaços als tiddlers que falten Settings/MissingLinks/Hint: Escolliu si voleu enllaçar els tiddlers que encara no existeixen @@ -157,11 +168,11 @@ Settings/NavigationAddressBar/Caption: Barra d'adreces de navegació Settings/NavigationAddressBar/Hint: Comportament de la barra d'adreces en navegar cap a un tiddler: Settings/NavigationAddressBar/No/Description: No actualitzis la barra d'adreces Settings/NavigationAddressBar/Permalink/Description: Inclou el tiddler destinació -Settings/NavigationAddressBar/Permaview/Description: Inclou el tiddler destinació i la seqùència actual +Settings/NavigationAddressBar/Permaview/Description: Inclou el tiddler destinació i la cronologia actual Settings/NavigationHistory/Caption: Històrial de navegació Settings/NavigationHistory/Hint: Actualitza l'històrial del navegador en navegar cap a un tiddler: -Settings/NavigationHistory/No/Description: No actualitzis la cronologia -Settings/NavigationHistory/Yes/Description: Actualitza la cronologia +Settings/NavigationHistory/No/Description: No actualitzis l'històrial +Settings/NavigationHistory/Yes/Description: Actualitza l'històrial Settings/NavigationPermalinkviewMode/Caption: Mode enllaç permanent/vista permanent Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Copia l’URL de l'enllaç permanent/vista permanent al portapapers Settings/NavigationPermalinkviewMode/Hint: Trieu com es gestiona l'enllaç permanent/vista permanent diff --git a/languages/ca-ES/Dates.multids b/languages/ca-ES/Dates.multids index 5e26aa023..e8ab0c60d 100644 --- a/languages/ca-ES/Dates.multids +++ b/languages/ca-ES/Dates.multids @@ -1,36 +1,36 @@ title: $:/language/ Date/DaySuffix/1: r -Date/DaySuffix/10: é -Date/DaySuffix/11: é -Date/DaySuffix/12: é -Date/DaySuffix/13: é -Date/DaySuffix/14: é -Date/DaySuffix/15: é -Date/DaySuffix/16: é -Date/DaySuffix/17: é -Date/DaySuffix/18: é -Date/DaySuffix/19: é -Date/DaySuffix/2: n -Date/DaySuffix/20: é -Date/DaySuffix/21: é -Date/DaySuffix/22: é -Date/DaySuffix/23: r -Date/DaySuffix/24: é -Date/DaySuffix/25: é -Date/DaySuffix/26: é -Date/DaySuffix/27: é -Date/DaySuffix/28: é -Date/DaySuffix/29: é -Date/DaySuffix/3: r -Date/DaySuffix/30: é -Date/DaySuffix/31: é -Date/DaySuffix/4: t -Date/DaySuffix/5: é -Date/DaySuffix/6: é -Date/DaySuffix/7: é -Date/DaySuffix/8: é -Date/DaySuffix/9: é +Date/DaySuffix/10: +Date/DaySuffix/11: +Date/DaySuffix/12: +Date/DaySuffix/13: +Date/DaySuffix/14: +Date/DaySuffix/15: +Date/DaySuffix/16: +Date/DaySuffix/17: +Date/DaySuffix/18: +Date/DaySuffix/19: +Date/DaySuffix/2: +Date/DaySuffix/20: +Date/DaySuffix/21: +Date/DaySuffix/22: +Date/DaySuffix/23: +Date/DaySuffix/24: +Date/DaySuffix/25: +Date/DaySuffix/26: +Date/DaySuffix/27: +Date/DaySuffix/28: +Date/DaySuffix/29: +Date/DaySuffix/3: +Date/DaySuffix/30: +Date/DaySuffix/31: +Date/DaySuffix/4: +Date/DaySuffix/5: +Date/DaySuffix/6: +Date/DaySuffix/7: +Date/DaySuffix/8: +Date/DaySuffix/9: Date/Long/Day/0: Diumenge Date/Long/Day/1: Dilluns Date/Long/Day/2: Dimarts @@ -39,16 +39,16 @@ Date/Long/Day/4: Dijous Date/Long/Day/5: Divendres Date/Long/Day/6: Dissabte Date/Long/Month/1: de gener de -Date/Long/Month/10: d'octubre de +Date/Long/Month/10: octubre de Date/Long/Month/11: de novembre de Date/Long/Month/12: de desembre de Date/Long/Month/2: de febrer de Date/Long/Month/3: de març de -Date/Long/Month/4: d'abril de +Date/Long/Month/4: abril de Date/Long/Month/5: de maig de Date/Long/Month/6: de juny de Date/Long/Month/7: de juliol de -Date/Long/Month/8: d'agost de +Date/Long/Month/8: agost de Date/Long/Month/9: de septembre de Date/Short/Day/0: Diu Date/Short/Day/1: Dil @@ -62,8 +62,8 @@ Date/Short/Month/12: Des Date/Short/Month/4: Abr Date/Short/Month/5: Mai Date/Short/Month/8: Ago -Date/Period/am: m. -Date/Period/pm: t. +Date/Period/am: del matí +Date/Period/pm: de la tarda RelativeDate/Future/Days: <<period>> dies des d'ara RelativeDate/Future/Hours: <<period>> hores des d'ara RelativeDate/Future/Minutes: <<period>> minuts des d'ara diff --git a/languages/ca-ES/Docs/ModuleTypes.multids b/languages/ca-ES/Docs/ModuleTypes.multids index 80e66c778..a1b5df69f 100644 --- a/languages/ca-ES/Docs/ModuleTypes.multids +++ b/languages/ca-ES/Docs/ModuleTypes.multids @@ -14,7 +14,7 @@ library: Tipus de mòdul genèric per a mòduls JavaScript de propòsit general. macro: Definicions de macros JavaScript. parser: Analitzadors sintàctics per a diferents tipus de continguts. route: Defineix com el servidor HTTP integrat gestiona els patrons d’URL individuals. -saver: Gestionen diferents mètodes per a desar fitxers des del navegador. +saver: Els gestors de baixades (saver) ofereixen diferents mètodes per a desar fitxers des del navegador. startup: Funcions de l'inici storyview: Les vistes de la cronologia personalitzen l'animació i el comportament dels widgets llista. texteditoroperation: Una operació de la barra d'eines de l'editor de text. diff --git a/languages/ca-ES/Docs/PaletteColours.multids b/languages/ca-ES/Docs/PaletteColours.multids index 83a739405..f8fdcd111 100644 --- a/languages/ca-ES/Docs/PaletteColours.multids +++ b/languages/ca-ES/Docs/PaletteColours.multids @@ -29,6 +29,8 @@ external-link-foreground: Primer plà de l'enllaç extern external-link-foreground-hover: Primer plà de la bafarada de l'enllaç extern external-link-foreground-visited: Primer plà de l'enllaç extern visitat foreground: Primer plà general +menubar-background: Fons de la barra de menús +menubar-foreground: Primer plà de la barra de menús message-background: Fons de la capsa de text message-border: Vora de la capsa de text message-foreground: Primer plà de la capsa de text diff --git a/languages/ca-ES/EditTemplate.multids b/languages/ca-ES/EditTemplate.multids index 452715f03..4b0a5c8b8 100644 --- a/languages/ca-ES/EditTemplate.multids +++ b/languages/ca-ES/EditTemplate.multids @@ -8,6 +8,7 @@ Field/Dropdown/Hint: Mostra la llista de camps Field/Remove/Caption: suprimeix el camp Field/Remove/Hint: Suprimeix el camp Fields/Add/Button: afegeix +Fields/Add/Button/Hint: Afegeix un camp nou al tiddler Fields/Add/Dropdown/System: Camps del sistema Fields/Add/Dropdown/User: Camps de l'usuari Fields/Add/Name/Placeholder: nom del camp @@ -16,6 +17,7 @@ Fields/Add/Value/Placeholder: valors del camp Shadow/OverriddenWarning: Aquest és un tiddler ombra modificat. Podeu restablir la versió per omisió suprimint aquest tiddler Shadow/Warning: Aquest és un tiddler ombra. Qualsevol canvi sobreescriurà la versió per omisió Tags/Add/Button: afegeix +Tags/Add/Button/Hint: afegeix una etiqueta Tags/Add/Placeholder: nom de l'etiqueta Tags/Dropdown/Caption: llista d'etiquetes Tags/Dropdown/Hint: Mostra la llista d'etiquetes diff --git a/languages/ca-ES/Fields.multids b/languages/ca-ES/Fields.multids index e27319d73..b67e5e3fc 100644 --- a/languages/ca-ES/Fields.multids +++ b/languages/ca-ES/Fields.multids @@ -1,13 +1,14 @@ title: $:/language/Docs/Fields/ _canonical_uri: La URI sencera d'una imatge externa al tiddler +_is_skinny: Si està present, indica que el camp de text del tiddler s'ha de carregar des del servidor bag: El nom de la bossa de la que va venir un tiddler caption: El text que es mostrarà en una pestanya o botó color: El valor del color CSS associat amb un tiddler component: El nom del component responsable d'un [[tiddler d'avís|AlertMechanism]] created: La data en que es va generar el tiddler creator: El nom de la persona que va generar el tiddler -current-tiddler: Utilitzat per desar la darrera còpia del tiddler a una [[cronologia|HistoryMechanism]] +current-tiddler: Utilitzat per desar la darrera còpia del tiddler de l'[[històrial|HistoryMechanism]] dependents: Per a un connector, llista els títols que depenen del connector description: El text que descriu un connector, o un diàleg modal draft.of: Per als tiddlers esborranys, conté el títol del tiddler del qual és un esborrany @@ -15,7 +16,7 @@ draft.title: Per als tiddlers esborranys, conté el títol proposat per al tiddl footer: El text del peu d'un assistent hide-body: El valor de la plantilla de vista amaga el cos dels tiddlers és: ''sí'' icon: El títol del tiddler que conté la icona associada amb el tiddler -library: Si està a "si" indica que un tiddler s'ha de sar com una biblioteca de JavaScript +library: Si està a "si" indica que un tiddler s'ha desar com una biblioteca de JavaScript list: Una llista ordenada de títols de tiddlers associats amb un tiddler list-after: Si està activat, el títol del tiddler després del qual aquest tiddler s'hauria d'afegir a la llista ordenada de títols de tiddler list-before: Si està activat, el títol del tiddler abans del qual aquest tiddler s'hauria d'afegir a la llista ordenada de títols de tiddler, o a l'inici de la llista si aquest camp hi és però està buit @@ -30,7 +31,8 @@ source: La URL orígen associada a un tiddler subtitle: El text del subtítol d'un assistent tags: Una llista d'etiquetes associades a un tiddler text: El text del cos d'un tiddler +throttle.refresh: Si està present, l’acceleració actualitza aquest tiddler title: El nom únic d'un tiddler -toc-link: El valor de Suprimeix l'enllaç del tiddler a la Taula de Continguts està a: ''no'' +toc-link: El valor de Suprimeix l'enllaç del tiddler a l'Índex està a: ''no'' type: El tipus de contingut d'un tiddler version: Informació de la versió d'un connector diff --git a/languages/ca-ES/Filters.multids b/languages/ca-ES/Filters.multids index 80e9b119d..5d28cbffe 100644 --- a/languages/ca-ES/Filters.multids +++ b/languages/ca-ES/Filters.multids @@ -10,7 +10,7 @@ RecentSystemTiddlers: Tiddlers que s'han modificat recentment, inclós els tiddl RecentTiddlers: Tiddlers que s'han modificat recentment SessionTiddlers: Tiddlers modificats des que es va carregar el wiki ShadowTiddlers: Tiddlers amb ombra predefinits -StoryList: Tiddlers al riu de la història, a excepció de <$text text="$:/AdvancedSearch"/> +StoryList: Els tiddlers de la cronologia, a excepció de <$text text="$:/AdvancedSearch"/> SystemTags: Etiquetes del sistema SystemTiddlers: Tiddlers del sistema TypedTiddlers: Tiddlers amb text que no és wiki diff --git a/languages/ca-ES/Misc.multids b/languages/ca-ES/Misc.multids index 12e82a572..616b1edb2 100644 --- a/languages/ca-ES/Misc.multids +++ b/languages/ca-ES/Misc.multids @@ -27,6 +27,7 @@ Error/Filter: S'ha produït un error del filtre Error/FilterSyntax: S'ha produït un error de sintaxi en l'expressió del filtre Error/IsFilterOperator: S'ha produït un error del filtre: operant desconegut per a l’operador de filtre "is" Error/LoadingPluginLibrary: S'ha produït un error en carregar la biblioteca del connector +Error/NetworkErrorAlert: `<h2>''Error de la xarxa''</h2>Sembla que s'ha perdut la connexió amb el servidor. Això pot indicar un problema amb la vostra connexió de la xarxa. Intenteu restaurar la connectivitat de xarxa abans de continuar.<br><br>' Qualsevol canvi no guardat es sincronitzarà automàticament quan es restableixi la connectivitat''.' Error/RecursiveTransclusion: S'ha produït un error de transclusió recursiva en el widget de transclusió Error/RetrievingSkinny: S'ha produït un error en recuperar la llista de tiddler parcials Error/SavingToTWEdit: S'ha produït un error en desar a TWEdit @@ -63,8 +64,9 @@ SystemTiddlers/Include/Prompt: Inclou els tiddlers del sistema TagManager/Colour/Heading: Color TagManager/Count/Heading: Compte TagManager/Icon/Heading: Icona +TagManager/Icons/None: Cap TagManager/Info/Heading: Informació TagManager/Tag/Heading: Etiqueta -Tiddler/DateFormat: DDth de MMM de YYYY a les hh12:0mmam +Tiddler/DateFormat: DD MMM YYYY a les hh12:0mm am UnsavedChangesWarning: Teniu canvis sense desar al TiddlyWiki Yes: Sí diff --git a/languages/ca-ES/Search.multids b/languages/ca-ES/Search.multids index 0a212fc4b..254e55501 100644 --- a/languages/ca-ES/Search.multids +++ b/languages/ca-ES/Search.multids @@ -2,7 +2,7 @@ title: $:/language/Search/ DefaultResults/Caption: Llista Filter/Caption: Filtre -Filter/Hint: Cerca amb una [[filter expression|https://tiddlywiki.com/static/Filters.html]] +Filter/Hint: Cerca amb una [[expressió de filtre|https://tiddlywiki.com/static/Filters.html]] Filter/Matches: //<small><<resultCount>> coincidències</small>// Matches: //<small><<resultCount>> coincidències</small>// Matches/All: Totes les coincidències: diff --git a/languages/ca-ES/Snippets/TableOfContents.tid b/languages/ca-ES/Snippets/TableOfContents.tid index 5d5243e69..4818afacd 100644 --- a/languages/ca-ES/Snippets/TableOfContents.tid +++ b/languages/ca-ES/Snippets/TableOfContents.tid @@ -1,9 +1,9 @@ title: $:/language/Snippets/TableOfContents tags: $:/tags/TextEditor/Snippet -caption: Taula de continguts +caption: Índex <div class="tc-table-of-contents"> -<<toc-selective-expandable 'TableOfContents'>> +<<toc-selective-expandable 'Índex'>> </div> \ No newline at end of file diff --git a/languages/ca-ES/ThemeTweaks.multids b/languages/ca-ES/ThemeTweaks.multids index a22ccb012..3b0d09a79 100644 --- a/languages/ca-ES/ThemeTweaks.multids +++ b/languages/ca-ES/ThemeTweaks.multids @@ -5,37 +5,37 @@ Metrics/BodyFontSize: Mida del tipus de lletra per al cos de tiddler Metrics/BodyLineHeight: Alçada de la línia per al cos de tiddler Metrics/FontSize: Mida del tipus de lletra Metrics/LineHeight: Alçada de la línia -Metrics/SidebarBreakpoint: Punt d’interrupció de la barra lateral -Metrics/SidebarBreakpoint/Hint: l’amplada mínima de la pàgina en què apareixeran la cronologia i la barra lateral costat a costat +Metrics/SidebarBreakpoint: Punt de baixada de la cronologia +Metrics/SidebarBreakpoint/Hint: l’amplada mínima de la pàgina en que la cronologia i la barra lateral es mostren una al costat de l'altre Metrics/SidebarWidth: Amplada de la barra lateral Metrics/SidebarWidth/Hint: l'amplada de la barra lateral amb una disposició fluida fixe -Metrics/StoryLeft: Posició esquerra de la cronologia -Metrics/StoryLeft/Hint: distància entre el marge esquerre de la cronologia<br>(àrea del tiddler) fins a l’esquerra de la pàgina -Metrics/StoryRight: Dreta de la cronologia -Metrics/StoryRight/Hint: distància entre el marge esquerre de la barra lateral<br>fins a l’esquerra de la pàgina -Metrics/StoryTop: Posició de la cronologia -Metrics/StoryTop/Hint: distància del marge superior de la cronologia<br>fins a la part superior de la pàgina +Metrics/StoryLeft: Marge esquerra de la cronologia +Metrics/StoryLeft/Hint: marge esquerre entre la cronologia<br>(zona dels tiddlers) i la vora esquerra de la pàgina +Metrics/StoryRight: Marge dret de la cronologia +Metrics/StoryRight/Hint: distància entre el marge esquerre entre la barra lateral<br>i la vora esquerra de la pàgina +Metrics/StoryTop: Posició vertical de la cronologia +Metrics/StoryTop/Hint: distància del marge superior de la cronologia<br>fins a la vora superior de la pàgina Metrics/StoryWidth: Amplada de la cronologia Metrics/StoryWidth/Hint: l'amplada global de la cronologia -Metrics/TiddlerWidth: Amplada del tiddler -Metrics/TiddlerWidth/Hint: dins de la cronologia +Metrics/TiddlerWidth: Amplada dels tiddlers +Metrics/TiddlerWidth/Hint: a la cronologia Options: Opcions -Options/CodeWrapping: Enganxa línies llargues en blocs de codi +Options/CodeWrapping: Divideix les línies llargues dels blocs de codi Options/SidebarLayout: Disposició de la barra lateral -Options/SidebarLayout/Fixed-Fluid: Cronologia fixe, barra lateral fluida -Options/SidebarLayout/Fluid-Fixed: Cronologia fluida, barra lateral fixe +Options/SidebarLayout/Fixed-Fluid: Cronologia fixa, barra lateral fluida +Options/SidebarLayout/Fluid-Fixed: Cronologia fluida, barra lateral fixa Options/StickyTitles: Títols enganxosos Options/StickyTitles/Hint: Fa que els títols del tiddler "s'enganxin" a la part superior de la finestra del navegador Settings: Paràmetres Settings/BackgroundImage: Imatge de fons de la pàgina Settings/BackgroundImageAttachment: Adjunt de la imatge de fons de la pàgina -Settings/BackgroundImageAttachment/Fixed: Fixe a la finestra +Settings/BackgroundImageAttachment/Fixed: Fixa-ho a la finestra Settings/BackgroundImageAttachment/Scroll: Desplaça-ho amb els tiddlers Settings/BackgroundImageSize: Mida de la imatge de fons de la pàgina -Settings/BackgroundImageSize/Contain: Conté -Settings/BackgroundImageSize/Cover: Coberta +Settings/BackgroundImageSize/Contain: Omple +Settings/BackgroundImageSize/Cover: Retalla Settings/CodeFontFamily: Família del tipus de lletra del codi Settings/EditorFontFamily: Família del tipus de lletra de l'editor Settings/FontFamily: Família del tipus de lletra -ThemeTweaks: Retocs del tema +ThemeTweaks: Personalitza el tema ThemeTweaks/Hint: Podeu modificar alguns aspectes del tema ''Vainilla''. From 1f354a972e0217e034d1f59d31577c1fd6b186f3 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 2 May 2020 14:07:39 +0100 Subject: [PATCH 0655/2376] Freelinks plugin: Add support for ignoring case --- plugins/tiddlywiki/freelinks/macros-view.tid | 6 +++++- plugins/tiddlywiki/freelinks/settings.tid | 2 ++ plugins/tiddlywiki/freelinks/text.js | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/freelinks/macros-view.tid b/plugins/tiddlywiki/freelinks/macros-view.tid index 20d85b088..81d6e8851 100644 --- a/plugins/tiddlywiki/freelinks/macros-view.tid +++ b/plugins/tiddlywiki/freelinks/macros-view.tid @@ -1,4 +1,8 @@ title: $:/plugins/tiddlywiki/freelinks/macros/view tags: $:/tags/Macro/View -<$set name="tv-freelinks" value={{$:/config/Freelinks/Enable}}/> +<$set name="tv-freelinks" value={{$:/config/Freelinks/Enable}}> + +<$set name="tv-freelinks-ignore-case" value={{$:/config/Freelinks/IgnoreCase}}/> + +</$set> \ No newline at end of file diff --git a/plugins/tiddlywiki/freelinks/settings.tid b/plugins/tiddlywiki/freelinks/settings.tid index 0b6cb247c..844eb1d26 100644 --- a/plugins/tiddlywiki/freelinks/settings.tid +++ b/plugins/tiddlywiki/freelinks/settings.tid @@ -1,3 +1,5 @@ title: $:/plugins/tiddlywiki/freelinks/settings <$checkbox tiddler="$:/config/Freelinks/Enable" field="text" checked="yes" unchecked="no" default="no"> <$link to="$:/config/Freelinks/Enable">Enable freelinking within tiddler view templates</$link> </$checkbox> + +<$checkbox tiddler="$:/config/Freelinks/IgnoreCase" field="text" checked="yes" unchecked="no" default="no"> <$link to="$:/config/Freelinks/IgnoreCase">Ignore case</$link> </$checkbox> diff --git a/plugins/tiddlywiki/freelinks/text.js b/plugins/tiddlywiki/freelinks/text.js index 64776f4c6..7ea35e090 100755 --- a/plugins/tiddlywiki/freelinks/text.js +++ b/plugins/tiddlywiki/freelinks/text.js @@ -79,9 +79,10 @@ TextNodeWidget.prototype.execute = function() { reparts.push("(\\b" + $tw.utils.escapeRegExp(title) + "\\b)"); } }); + var ignoreCase = self.getVariable("tv-freelinks-ignore-case",{defaultValue:"no"}).trim() === "yes"; return { titles: titles, - regexp: new RegExp(reparts.join("|"),"") + regexp: new RegExp(reparts.join("|"),ignoreCase ? "i" : "") }; }); // Repeatedly linkify From 85fd43a38c644b533932d2d99b0d1800fae6e300 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 2 May 2020 14:09:47 +0100 Subject: [PATCH 0656/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.23.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 8eb37fd60..3586a1ad0 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -12,11 +12,12 @@ type: text/vnd.tiddlywiki ! Translation Improvements -* +* Catalan ! Plugin Improvements * Freelinks Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] support for ignoring case when matching titles ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements * Twitter Plugin ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded @@ -30,6 +31,7 @@ type: text/vnd.tiddlywiki * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] Vanilla theme to use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration * [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox palette readability of toolbar buttons +* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition ! Hackability Improvements From 6a0ff7db1807f45b73061ced82f5a85f1a529bbf Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 2 May 2020 21:22:44 +0100 Subject: [PATCH 0657/2376] JSZip Plugin: Add ability to build and download ZIP files --- editions/prerelease/tiddlywiki.info | 3 +- plugins/tiddlywiki/jszip/docs.tid | 43 +++++++++++ plugins/tiddlywiki/jszip/examples.tid | 24 ++++++ plugins/tiddlywiki/jszip/plugin.info | 2 +- plugins/tiddlywiki/jszip/startup.js | 103 ++++++++++++++++++++++++++ 5 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 plugins/tiddlywiki/jszip/docs.tid create mode 100644 plugins/tiddlywiki/jszip/examples.tid create mode 100644 plugins/tiddlywiki/jszip/startup.js diff --git a/editions/prerelease/tiddlywiki.info b/editions/prerelease/tiddlywiki.info index 2dba4aed6..5d52d5e4a 100644 --- a/editions/prerelease/tiddlywiki.info +++ b/editions/prerelease/tiddlywiki.info @@ -15,7 +15,8 @@ "tiddlywiki/dynannotate", "tiddlywiki/codemirror", "tiddlywiki/comments", - "tiddlywiki/menubar" + "tiddlywiki/menubar", + "tiddlywiki/jszip" ], "themes": [ "tiddlywiki/vanilla", diff --git a/plugins/tiddlywiki/jszip/docs.tid b/plugins/tiddlywiki/jszip/docs.tid new file mode 100644 index 000000000..7e605a9cc --- /dev/null +++ b/plugins/tiddlywiki/jszip/docs.tid @@ -0,0 +1,43 @@ +title: $:/plugins/tiddlywiki/jszip/docs + +The following messages are provided to allow programmatic manipulation of ZIP files stored within tiddlers: + +!! Create ZIP file + +``` +<$action-sendmessage $message="tm-zip-create" $param="MyZipTiddler"/> +``` + +* ''$param'': title of tiddler to contain ZIP file + +!! Add/replace text file within ZIP file + +``` +<$action-sendmessage $message="tm-zip-add-text-file" $param="MyZipTiddler" filename="my/newfilename.txt" text="The content"/> +``` + +* ''$param'': title of tiddler containing ZIP file +* ''filename'': filename of file to be added +* ''text'': text content of file to be added + +!! Render tiddler to ZIP file + +``` +<$action-sendmessage $message="tm-zip-render-file" $param="MyZipTiddler" filename="my/newfilename.txt" tiddler="HelloThere" template="The content" mode="block" output="text/plain"/> +``` + +* ''$param'': title of tiddler containing ZIP file +* ''filename'': filename of output file +* ''tiddler'': optional title of currentTiddler for rendering template +* ''template'': title of template tiddler to be rendered +* ''mode'': optional parsing mode "block" (default) or "inline" +* ''output'': output format: "text/plain" (default) for the text content or "text/html" for the full HTML content, including tags + +!! Download a ZIP file + +``` +<$action-sendmessage $message="tm-zip-download" $param="MyZipTiddler" filename="myzipfile.zip"/> +``` + +* ''$param'': title of tiddler containing ZIP file +* ''filename'': filename to be suggested to browser for downloaded file diff --git a/plugins/tiddlywiki/jszip/examples.tid b/plugins/tiddlywiki/jszip/examples.tid new file mode 100644 index 000000000..681a0c364 --- /dev/null +++ b/plugins/tiddlywiki/jszip/examples.tid @@ -0,0 +1,24 @@ +title: $:/plugins/tiddlywiki/jszip/examples + +\define actions-render-static-site() +<$action-sendmessage $message="tm-zip-create" $param="$:/temp/_ZipTiddler"/> +<$list filter="[all[tiddlers]!is[system]limit[100]]"> +<$action-sendmessage $message="tm-zip-render-file" $param="$:/temp/_ZipTiddler" filename={{{ [<currentTiddler>encodeuricomponent[]addsuffix[.html]] }}} tiddler=<<currentTiddler>> template="$:/core/templates/static.tiddler.html"/> +</$list> +<$action-sendmessage $message="tm-zip-render-file" $param="$:/temp/_ZipTiddler" filename="static.css" template="$:/core/templates/static.template.css"/> +<$action-sendmessage $message="tm-zip-download" $param="$:/temp/_ZipTiddler" filename="myzip.zip"/> +\end + +! Rendering a Static Site to a Zip File + +The actions below create a ZIP file containing a static HTML rendering of the first 100 non-system tiddlers: + +<pre> +<$text text=<<actions-render-static-site>>/> +</pre> + +<$button actions=<<actions-render-static-site>>> +Render site +</$button> + +Temporary zip file: $:/temp/_ZipTiddler diff --git a/plugins/tiddlywiki/jszip/plugin.info b/plugins/tiddlywiki/jszip/plugin.info index ee0d00145..dcf94eeb2 100644 --- a/plugins/tiddlywiki/jszip/plugin.info +++ b/plugins/tiddlywiki/jszip/plugin.info @@ -3,5 +3,5 @@ "name": "JSZip", "description": "JSZip library", "author": "Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso", - "list": "readme license" + "list": "readme docs examples license" } diff --git a/plugins/tiddlywiki/jszip/startup.js b/plugins/tiddlywiki/jszip/startup.js new file mode 100644 index 000000000..588ef1476 --- /dev/null +++ b/plugins/tiddlywiki/jszip/startup.js @@ -0,0 +1,103 @@ +/*\ +title: $:/plugins/tiddlywiki/jszip/startup.js +type: application/javascript +module-type: startup + +Setup the root widget event handlers + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var JSZip = require("$:/plugins/tiddlywiki/jszip/jszip.js"); + +// Export name and synchronous status +exports.name = "jszip"; +exports.platforms = ["browser"]; +exports.after = ["startup"]; +exports.synchronous = true; + +// Install the root widget event handlers +exports.startup = function() { + $tw.rootWidget.addEventListener("tm-zip-create",function(event) { + if(event.param) { + var zip = new JSZip(); + saveZipTiddler(event.param,zip); + } + }); + $tw.rootWidget.addEventListener("tm-zip-add-text-file",function(event) { + var paramObject = event.paramObject || {}; + if(event.param && paramObject.filename && paramObject.text) { + var zip = loadZipTiddler(event.param); + zip.file(paramObject.filename,paramObject.text); + saveZipTiddler(event.param,zip); + } + }); + $tw.rootWidget.addEventListener("tm-zip-render-file",function(event) { + var paramObject = event.paramObject || {}; + if(event.param && paramObject.filename && paramObject.template) { + var zip = loadZipTiddler(event.param), + outputType = paramObject.output || "text/plain", + templateTitle = paramObject.template, + text = $tw.wiki.renderTiddler(outputType,templateTitle,{ + parseAsInline: paramObject.mode === "inline", + variables: { + currentTiddler: paramObject.tiddler + } + }); + zip.file(paramObject.filename,text); + saveZipTiddler(event.param,zip); + } + }); + $tw.rootWidget.addEventListener("tm-zip-download",function(event) { + var paramObject = event.paramObject || {}; + if(event.param) { + downloadZipFile(event.param,paramObject.filename || "file.zip"); + } + }); +}; + +function loadZipTiddler(title) { + return $tw.wiki.getGlobalCache("jszip",function() { + var zip = new JSZip(), + tiddler = $tw.wiki.getTiddler(title); + if(tiddler && tiddler.fields.type === "application/zip") { + try { + zip.load(tiddler.fields.text,{ + base64: true + }); + } catch(e) { + console.log("JSZip error: " + e) + } + } + return zip; + }); +} + +function saveZipTiddler(title,zip) { + var data = zip.generate({ + type: "base64" + }); + $tw.wiki.addTiddler({ + title: title, + type: "application/zip", + text: data + }); +} + +function downloadZipFile(title,filename) { + var tiddler = $tw.wiki.getTiddler(title); + if(tiddler && tiddler.fields.text && tiddler.fields.type === "application/zip") { + var link = document.createElement("a"); + link.setAttribute("href","data:application/zip;base64," + encodeURIComponent(tiddler.fields.text)); + link.setAttribute("download",filename); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } +} + +})(); From 75d65d2694d31688c6e18d6d9ce28826c17a71e8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 2 May 2020 21:31:15 +0100 Subject: [PATCH 0658/2376] JSZip Plugin: Docs update --- plugins/tiddlywiki/jszip/readme.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/jszip/readme.tid b/plugins/tiddlywiki/jszip/readme.tid index f3068f743..fc22727a6 100644 --- a/plugins/tiddlywiki/jszip/readme.tid +++ b/plugins/tiddlywiki/jszip/readme.tid @@ -1,3 +1,3 @@ title: $:/plugins/tiddlywiki/jszip/readme -This plugin packages [[JSZip|https://stuk.github.io/jszip/]] for use by other plugins. It does not provide any end-user visible features. +This plugin provides primitives for working with Zip files. It also makes the [[JSZip|https://stuk.github.io/jszip/]] library available for use by other plugins. From 7ee9003df76f76c3b7e3f13fb46cec9867879e12 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 3 May 2020 19:06:28 +0100 Subject: [PATCH 0659/2376] Release note update --- editions/prerelease/tiddlers/Release 5.1.23.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 3586a1ad0..0606aed80 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -16,6 +16,8 @@ type: text/vnd.tiddlywiki ! Plugin Improvements +* JSZip Plugin +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser * Freelinks Plugin ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] support for ignoring case when matching titles ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements From c9692d7a508cfdb0446e67061201961dca64d8dd Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 5 May 2020 16:38:29 +0100 Subject: [PATCH 0660/2376] Fix case-insensitive freelinks --- plugins/tiddlywiki/freelinks/readme.tid | 2 +- plugins/tiddlywiki/freelinks/text.js | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/tiddlywiki/freelinks/readme.tid b/plugins/tiddlywiki/freelinks/readme.tid index 61e39a4f5..aa81d138f 100644 --- a/plugins/tiddlywiki/freelinks/readme.tid +++ b/plugins/tiddlywiki/freelinks/readme.tid @@ -9,7 +9,7 @@ Freelinking is activated for runs of text that have the following variables set: * `tv-wikilinks` is NOT equal to `no` * `tv-freelinks` is set to `yes` -Freelinks are case sensitive. +Freelinks are case sensitive by default but can be configured to ignore case in the settings tab. Within view templates, the variable `tv-freelinks` is automatically set to the content of $:/config/Freelinks/Enable, which can be set via the settings panel of this plugin. diff --git a/plugins/tiddlywiki/freelinks/text.js b/plugins/tiddlywiki/freelinks/text.js index 7ea35e090..867eb030a 100755 --- a/plugins/tiddlywiki/freelinks/text.js +++ b/plugins/tiddlywiki/freelinks/text.js @@ -40,7 +40,8 @@ TextNodeWidget.prototype.render = function(parent,nextSibling) { Compute the internal state of the widget */ TextNodeWidget.prototype.execute = function() { - var self = this; + var self = this, + ignoreCase = self.getVariable("tv-freelinks-ignore-case",{defaultValue:"no"}).trim() === "yes"; // Get our parameters var childParseTree = [{ type: "plain-text", @@ -49,10 +50,8 @@ TextNodeWidget.prototype.execute = function() { // Only process links if not disabled and we're not within a button or link widget if(this.getVariable("tv-wikilinks",{defaultValue:"yes"}).trim() !== "no" && this.getVariable("tv-freelinks",{defaultValue:"no"}).trim() === "yes" && !this.isWithinButtonOrLink()) { // Get the information about the current tiddler titles, and construct a regexp - this.tiddlerTitleInfo = this.wiki.getGlobalCache("tiddler-title-info",function() { - var titles = [], - reparts = [], - sortedTitles = self.wiki.allTitles().sort(function(a,b) { + this.tiddlerTitleInfo = this.wiki.getGlobalCache("tiddler-title-info-" + (ignoreCase ? "insensitive" : "sensitive"),function() { + var sortedTitles = self.wiki.allTitles().sort(function(a,b) { var lenA = a.length, lenB = b.length; // First sort by length, so longer titles are first @@ -72,14 +71,15 @@ TextNodeWidget.prototype.execute = function() { return 0; } } - }); + }), + titles = [], + reparts = []; $tw.utils.each(sortedTitles,function(title) { if(title.substring(0,3) !== "$:/") { titles.push(title); reparts.push("(\\b" + $tw.utils.escapeRegExp(title) + "\\b)"); } }); - var ignoreCase = self.getVariable("tv-freelinks-ignore-case",{defaultValue:"no"}).trim() === "yes"; return { titles: titles, regexp: new RegExp(reparts.join("|"),ignoreCase ? "i" : "") @@ -102,7 +102,7 @@ TextNodeWidget.prototype.execute = function() { childParseTree[index] = { type: "link", attributes: { - to: {type: "string", value: match[0]}, + to: {type: "string", value: ignoreCase ? this.tiddlerTitleInfo.titles[match.indexOf(match[0],1) - 1] : match[0]}, "class": {type: "string", value: "tc-freelink"} }, children: [{ @@ -145,7 +145,7 @@ TextNodeWidget.prototype.refresh = function(changedTiddlers) { titlesHaveChanged = false; $tw.utils.each(changedTiddlers,function(change,title) { if(change.isDeleted) { - titlesHaveChanged = true + titlesHaveChanged = true; } else { titlesHaveChanged = titlesHaveChanged || !self.tiddlerTitleInfo || self.tiddlerTitleInfo.titles.indexOf(title) === -1; } From b9d02b61b1d951cceb43105e1036cbb014814f4f Mon Sep 17 00:00:00 2001 From: mocsa <13969648+mocsa@users.noreply.github.com> Date: Wed, 6 May 2020 10:33:18 +0200 Subject: [PATCH 0661/2376] Update cla-individual.md (#4607) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 8e5fb5d4c..2e7bea148 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -397,3 +397,5 @@ Mandar Vaze, @mandarvaze, 2020/04/08 Lin Dongwu, @linonetwo, 2020/04/15 Tobias Hermann, @idotobi, 2020/04/19 + +Csaba Molnar, @mocsa, 2020/04/29 From 33e9f88c73487eddf461fc1507c90e9b932af8f7 Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Wed, 6 May 2020 10:34:13 +0200 Subject: [PATCH 0662/2376] Add Nicolas Petton to the list of contributors (#4617) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 2e7bea148..fbb1efb28 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -398,4 +398,6 @@ Lin Dongwu, @linonetwo, 2020/04/15 Tobias Hermann, @idotobi, 2020/04/19 +Nicolas Petton, @NicolasPetton, 2020/04/30 + Csaba Molnar, @mocsa, 2020/04/29 From 31c4fd586b673ab38a720c0e8c48aa0d38142a80 Mon Sep 17 00:00:00 2001 From: Rizwan <ibnishak@live.com> Date: Wed, 6 May 2020 14:10:42 +0530 Subject: [PATCH 0663/2376] Docs updates and fixing broken links (#4628) * Corecting URL of LuckySushi shop * Android-Instructions remained for Andtidwiki * Updating description and feature set of Timimi Updating URL of Widdly Resolving minor camelcase issues in TiddlySpot * Detailed instructions about termux and adding it to save methods * Correcting the words "open source" and "Unix" * Changing link protocols of verified domains to https --- .../tw5.com/tiddlers/about/Developers.tid | 2 +- .../tw5.com/tiddlers/community/Forums.tid | 6 +-- .../tiddlers/community/examples/PETTIL.tid | 2 +- .../resources/Widdly by Opennota.tid | 2 +- .../_Lucky Sushi_ online shop by sini-Kit.tid | 2 +- ...imimi_ Extension and executable by Riz.tid | 30 ++++++++---- .../tw5.com/tiddlers/concepts/Date Fields.tid | 2 +- .../tiddlers/concepts/Transclusion.tid | 2 +- .../tw5.com/tiddlers/definitions/Base64.tid | 2 +- .../definitions/Cascading Style Sheets.tid | 2 +- .../definitions/Comma Separated Values.tid | 2 +- .../tw5.com/tiddlers/definitions/Data URI.tid | 2 +- .../definitions/Document Object Model.tid | 2 +- .../definitions/HyperText Markup Language.tid | 2 +- .../JavaScript Object Notation.tid | 2 +- .../tiddlers/definitions/OpenSource.tid | 2 +- .../tiddlers/definitions/Percent Encoding.tid | 2 +- .../tw5.com/tiddlers/definitions/Quine.tid | 2 +- editions/tw5.com/tiddlers/definitions/URI.tid | 2 +- .../tiddlers/hellothere/HelloThere.tid | 2 +- .../tiddlers/howtos/Windows HTA Hack.tid | 2 +- ...WidgetMessage_ tm-open-external-window.tid | 8 ++-- .../nodejs/Serving TW5 from Android.tid | 47 ++++++++++++++++--- .../tiddlers/releasenotes/Release 5.1.8.tid | 2 +- .../tiddlers/saving/Saving on Android.tid | 33 +++++++------ .../tiddlers/saving/Saving on TiddlySpot.tid | 24 +++++----- .../tw5.com/tiddlers/styleguide/Spelling.tid | 2 +- .../wikitext/Code Blocks in WikiText.tid | 2 +- 28 files changed, 122 insertions(+), 70 deletions(-) diff --git a/editions/tw5.com/tiddlers/about/Developers.tid b/editions/tw5.com/tiddlers/about/Developers.tid index 5df340fcd..9bb7007ac 100644 --- a/editions/tw5.com/tiddlers/about/Developers.tid +++ b/editions/tw5.com/tiddlers/about/Developers.tid @@ -7,5 +7,5 @@ type: text/vnd.tiddlywiki There are several resources for developers to learn more about TiddlyWiki and to discuss and contribute to its development. * [[tiddlywiki.com/dev|https://tiddlywiki.com/dev]] is the official developer documentation -* [[TiddlyWikiDev group|http://groups.google.com/group/TiddlyWikiDev]] for discussions about TiddlyWiki development +* [[TiddlyWikiDev group|https://groups.google.com/group/TiddlyWikiDev]] for discussions about TiddlyWiki development * https://github.com/Jermolene/TiddlyWiki5 for the source code and development activity diff --git a/editions/tw5.com/tiddlers/community/Forums.tid b/editions/tw5.com/tiddlers/community/Forums.tid index 41bbc5210..61e1281dd 100644 --- a/editions/tw5.com/tiddlers/community/Forums.tid +++ b/editions/tw5.com/tiddlers/community/Forums.tid @@ -8,7 +8,7 @@ type: text/vnd.tiddlywiki The ~TiddlyWiki discussion groups are mailing lists for talking about ~TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email. -* The main ~TiddlyWiki group: http://groups.google.com/group/TiddlyWiki +* The main ~TiddlyWiki group: https://groups.google.com/group/TiddlyWiki *> Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to mailto:tiddlywiki+subscribe@googlegroups.com or mailto:tiddlywikidev+subscribe@googlegroups.com. ** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywiki@googlegroups.com/]] * Watch recordings of our regular [[TiddlyWiki Hangouts]] @@ -19,7 +19,7 @@ The ~TiddlyWiki discussion groups are mailing lists for talking about ~TiddlyWik ! Developers -* The TiddlyWikiDev group for developers: http://groups.google.com/group/TiddlyWikiDev +* The TiddlyWikiDev group for developers: https://groups.google.com/group/TiddlyWikiDev *> Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to mailto:tiddlywiki+subscribe@googlegroups.com or mailto:tiddlywikidev+subscribe@googlegroups.com. ** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywikidev@googlegroups.com/]] * Follow [[@TiddlyWiki on Twitter|http://twitter.com/#!/TiddlyWiki]] for the latest news @@ -30,4 +30,4 @@ New releases of TiddlyWiki, TiddlyDesktop and TiddlyFox are announced via the di ! Documentation -There is also a discussion group specifically for discussing TiddlyWiki documentation improvement initiatives: http://groups.google.com/group/tiddlywikidocs +There is also a discussion group specifically for discussing TiddlyWiki documentation improvement initiatives: https://groups.google.com/group/tiddlywikidocs diff --git a/editions/tw5.com/tiddlers/community/examples/PETTIL.tid b/editions/tw5.com/tiddlers/community/examples/PETTIL.tid index b0b43e475..868f363b5 100644 --- a/editions/tw5.com/tiddlers/community/examples/PETTIL.tid +++ b/editions/tw5.com/tiddlers/community/examples/PETTIL.tid @@ -5,7 +5,7 @@ title: "PETTIL - Forth for the Commodore PET" by Charlie Hitselberger type: text/vnd.tiddlywiki url: http://chitselb.com/files/tiddlypettil.html -A fast Forth interpreter for the [[Commodore PET|http://en.wikipedia.org/wiki/Commodore_PET]], written in 6502 assembly language. The TiddlyWiki containing program documentation is automatically generated from the source code: see https://github.com/chitselb/pettil. +A fast Forth interpreter for the [[Commodore PET|https://en.wikipedia.org/wiki/Commodore_PET]], written in 6502 assembly language. The TiddlyWiki containing program documentation is automatically generated from the source code: see https://github.com/chitselb/pettil. {{!!url}} diff --git a/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid b/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid index 91ba0ed16..9ca6b0d87 100644 --- a/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid +++ b/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid @@ -3,7 +3,7 @@ modified: 20180309164105386 tags: Resources title: Widdly by Opennota type: text/vnd.tiddlywiki -url: https://github.com/opennota/widdly +url: https://gitlab.com/opennota/widdly A cross platform server application that can save tiddlers to a local database diff --git a/editions/tw5.com/tiddlers/community/resources/_Lucky Sushi_ online shop by sini-Kit.tid b/editions/tw5.com/tiddlers/community/resources/_Lucky Sushi_ online shop by sini-Kit.tid index 6189c7b89..7e4b11403 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Lucky Sushi_ online shop by sini-Kit.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Lucky Sushi_ online shop by sini-Kit.tid @@ -3,7 +3,7 @@ modified: 20161224181607230 tags: Resources title: "Lucky Sushi" online shop by sini-Kit type: text/vnd.tiddlywiki -url: http://luckysushi.ru/habarovsk/heeg35.html#index +url: http://luckysushi.ru/habarovsk/heeg.html#index A complete online shop made in ~TiddlyWiki! diff --git a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid index e8f2a68c6..47a091380 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid @@ -1,16 +1,30 @@ caption: Timimi created: 20180830194141190 -delivery: Browser Extension & Executable -description: Browser extension & executable for desktops +delivery: Browser Extension & Native host +description: Browser extension & native host for desktops method: save -modified: 20181012165153986 -tags: Windows Linux Chrome Firefox Saving Resources plugins -title: "Timimi" Extension and executable by Riz +modified: 20200501092235061 +tags: Windows Linux Chrome Firefox Saving Resources plugins Mac Opera +title: Timimi: WebExtension and Native Host by Riz type: text/vnd.tiddlywiki -url: https://github.com/ibnishak/Timimi +url: https://ibnishak.github.io/Timimi/ -`Timimi` is a Web Extension and executable for Firefox, Chrome and Chromium that allows it to save standalone ~TiddlyWiki files. +Timimi is a web-extension accompanied by a native host that allows you to save and backup your standalone HTML tiddlywiki files ''anywhere in your hard-drive''. Once installed, you can save the tiddlywiki files without any extra steps, like the original Tiddlyfox addon. {{!!url}} -This is an addon using native messaging, essentially handing over the contents to a webextension host (executable) which does the actual saving. Once installed, you can save the standalone TW from anywhere in your hard drive without any more interactions, like the original Tiddlyfox addon. +As of version 2.1, Timimi supports the following browsers + +* Chrome/Chromium +* Firefox +* Opera +* Microsoft Edge (Chromium) + +It is also reported to work seamlessly in chrome based browsers like Brave and Vivaldi. + +Timimi also provides users with 4 backup strategies, viz: + +* Create a backup Every n^^th^^ save +* Create a backup every n^^th^^ minute +* Customised Tower of Hanoi +* First in First Out \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/concepts/Date Fields.tid b/editions/tw5.com/tiddlers/concepts/Date Fields.tid index 9c1bfa618..b1dcbe82d 100644 --- a/editions/tw5.com/tiddlers/concepts/Date Fields.tid +++ b/editions/tw5.com/tiddlers/concepts/Date Fields.tid @@ -18,7 +18,7 @@ Values of date fields are 17-character strings: * 2 digits for the second * 3 digits for the millisecond -To avoid problems arising from differences of time zone, TiddlyWiki always uses [[UTC|http://en.wikipedia.org/wiki/Coordinated_Universal_Time]]. +To avoid problems arising from differences of time zone, TiddlyWiki always uses [[UTC|https://en.wikipedia.org/wiki/Coordinated_Universal_Time]]. As an example, the <<.field created>> field of this tiddler has the value <<.value """<$view field="created"/>""">>. diff --git a/editions/tw5.com/tiddlers/concepts/Transclusion.tid b/editions/tw5.com/tiddlers/concepts/Transclusion.tid index c7d2af671..94f6015bc 100644 --- a/editions/tw5.com/tiddlers/concepts/Transclusion.tid +++ b/editions/tw5.com/tiddlers/concepts/Transclusion.tid @@ -3,7 +3,7 @@ modified: 20141130195444237 tags: Concepts title: Transclusion -[[Transclusion|http://en.wikipedia.org/wiki/Transclusion]] is the process of referencing one tiddler "A" from another tiddler "B" such that the content of "A" appears to be a part of "B". +[[Transclusion|https://en.wikipedia.org/wiki/Transclusion]] is the process of referencing one tiddler "A" from another tiddler "B" such that the content of "A" appears to be a part of "B". Copying and pasting content creates multiple copies of the same content in several different places. With transclusion, there can be a single copy and a special instruction in "B" which indicates the point at which content should be inserted from tiddler "A". diff --git a/editions/tw5.com/tiddlers/definitions/Base64.tid b/editions/tw5.com/tiddlers/definitions/Base64.tid index 9546bcd66..46ed63ec1 100644 --- a/editions/tw5.com/tiddlers/definitions/Base64.tid +++ b/editions/tw5.com/tiddlers/definitions/Base64.tid @@ -4,4 +4,4 @@ tags: Definitions title: Base64 type: text/vnd.tiddlywiki -<<.dlink-ex Base64 "http://en.wikipedia.org/wiki/Base64">> is a way of representing binary data, such an image, as a string of text. +<<.dlink-ex Base64 "https://en.wikipedia.org/wiki/Base64">> is a way of representing binary data, such an image, as a string of text. diff --git a/editions/tw5.com/tiddlers/definitions/Cascading Style Sheets.tid b/editions/tw5.com/tiddlers/definitions/Cascading Style Sheets.tid index 47c770848..0806cf045 100644 --- a/editions/tw5.com/tiddlers/definitions/Cascading Style Sheets.tid +++ b/editions/tw5.com/tiddlers/definitions/Cascading Style Sheets.tid @@ -4,4 +4,4 @@ tags: Definitions title: Cascading Style Sheets type: text/vnd.tiddlywiki -<<.dlink-ex CSS "http://en.wikipedia.org/wiki/Cascading_Style_Sheets">> is a standard plain-text format used for defining the presentational style of the various elements on a web page. +<<.dlink-ex CSS "https://en.wikipedia.org/wiki/Cascading_Style_Sheets">> is a standard plain-text format used for defining the presentational style of the various elements on a web page. diff --git a/editions/tw5.com/tiddlers/definitions/Comma Separated Values.tid b/editions/tw5.com/tiddlers/definitions/Comma Separated Values.tid index e89ec2c9b..eb60f82fd 100644 --- a/editions/tw5.com/tiddlers/definitions/Comma Separated Values.tid +++ b/editions/tw5.com/tiddlers/definitions/Comma Separated Values.tid @@ -4,7 +4,7 @@ tags: Definitions title: Comma-Separated Values type: text/vnd.tiddlywiki -<<.dlink-ex CSV "http://en.wikipedia.org/wiki/Comma-separated_values">> is a standard plain-text format for storing a table of data. +<<.dlink-ex CSV "https://en.wikipedia.org/wiki/Comma-separated_values">> is a standard plain-text format for storing a table of data. Each row of the table is called a <<.def record>> and occupies one line. diff --git a/editions/tw5.com/tiddlers/definitions/Data URI.tid b/editions/tw5.com/tiddlers/definitions/Data URI.tid index 35878f1cb..6e85b1ed9 100644 --- a/editions/tw5.com/tiddlers/definitions/Data URI.tid +++ b/editions/tw5.com/tiddlers/definitions/Data URI.tid @@ -4,6 +4,6 @@ tags: Definitions title: Data URI type: text/vnd.tiddlywiki -A <<.dlink-ex "data URI" "http://en.wikipedia.org/wiki/Data_URI_scheme">> is a way of storing data (such as an image) in a way that is compatible with the addresses used by web pages and [[stylesheets|Cascading Style Sheets]] to access external resources. +A <<.dlink-ex "data URI" "https://en.wikipedia.org/wiki/Data_URI_scheme">> is a way of storing data (such as an image) in a way that is compatible with the addresses used by web pages and [[stylesheets|Cascading Style Sheets]] to access external resources. The <<.mlink datauri>> macro can be used to generate data URIs within ~TiddlyWiki. diff --git a/editions/tw5.com/tiddlers/definitions/Document Object Model.tid b/editions/tw5.com/tiddlers/definitions/Document Object Model.tid index f2b75b206..f3e9fe0a1 100644 --- a/editions/tw5.com/tiddlers/definitions/Document Object Model.tid +++ b/editions/tw5.com/tiddlers/definitions/Document Object Model.tid @@ -4,7 +4,7 @@ tags: Definitions title: Document Object Model type: text/vnd.tiddlywiki -The <<.dlink-ex DOM "http://en.wikipedia.org/wiki/Document_Object_Model">> of a web page is a tree-shaped model of its content, maintained internally by the web browser as the user interacts with that content. Each point in the tree is called a <<.def node>>. +The <<.dlink-ex DOM "https://en.wikipedia.org/wiki/Document_Object_Model">> of a web page is a tree-shaped model of its content, maintained internally by the web browser as the user interacts with that content. Each point in the tree is called a <<.def node>>. When ~TiddlyWiki is running in a web browser, its [[widgets|Widgets]] are rendered into DOM nodes for display. diff --git a/editions/tw5.com/tiddlers/definitions/HyperText Markup Language.tid b/editions/tw5.com/tiddlers/definitions/HyperText Markup Language.tid index 460d46050..d82dcbc69 100644 --- a/editions/tw5.com/tiddlers/definitions/HyperText Markup Language.tid +++ b/editions/tw5.com/tiddlers/definitions/HyperText Markup Language.tid @@ -4,7 +4,7 @@ tags: Definitions title: HyperText Markup Language type: text/vnd.tiddlywiki -<<.dlink-ex HTML "http://en.wikipedia.org/wiki/HTML">> is a standard plain-text format used for defining the content of a web page. +<<.dlink-ex HTML "https://en.wikipedia.org/wiki/HTML">> is a standard plain-text format used for defining the content of a web page. It consists of a tree of elements expressed using a system of special <<.def tags>> enclosed in angle brackets. diff --git a/editions/tw5.com/tiddlers/definitions/JavaScript Object Notation.tid b/editions/tw5.com/tiddlers/definitions/JavaScript Object Notation.tid index 177c565a8..91e2ff5ac 100644 --- a/editions/tw5.com/tiddlers/definitions/JavaScript Object Notation.tid +++ b/editions/tw5.com/tiddlers/definitions/JavaScript Object Notation.tid @@ -4,7 +4,7 @@ tags: Definitions title: JavaScript Object Notation type: text/vnd.tiddlywiki -<<.dlink-ex JSON "http://en.wikipedia.org/wiki/JSON">> is a standard plain-text format used for modelling hierarchical structures of objects that contain named fields. +<<.dlink-ex JSON "https://en.wikipedia.org/wiki/JSON">> is a standard plain-text format used for modelling hierarchical structures of objects that contain named fields. DataTiddlers can have JSON content. diff --git a/editions/tw5.com/tiddlers/definitions/OpenSource.tid b/editions/tw5.com/tiddlers/definitions/OpenSource.tid index 1d5ec6f84..da8ae16b8 100644 --- a/editions/tw5.com/tiddlers/definitions/OpenSource.tid +++ b/editions/tw5.com/tiddlers/definitions/OpenSource.tid @@ -3,5 +3,5 @@ modified: 201308251307 tags: Definitions title: OpenSource -OpenSource is [[defined by Wikipedia|http://en.wikipedia.org/wiki/Open_source]] as //a philosophy, or pragmatic methodology that promotes free redistribution and access to an end product's design and implementation details//. +OpenSource is [[defined by Wikipedia|https://en.wikipedia.org/wiki/Open_source]] as //a philosophy, or pragmatic methodology that promotes free redistribution and access to an end product's design and implementation details//. diff --git a/editions/tw5.com/tiddlers/definitions/Percent Encoding.tid b/editions/tw5.com/tiddlers/definitions/Percent Encoding.tid index 3fcd8f4a0..f246c18db 100644 --- a/editions/tw5.com/tiddlers/definitions/Percent Encoding.tid +++ b/editions/tw5.com/tiddlers/definitions/Percent Encoding.tid @@ -4,7 +4,7 @@ tags: Definitions title: Percent Encoding type: text/vnd.tiddlywiki -<<.dlink-ex "Percent encoding" "http://en.wikipedia.org/wiki/Percent-encoding">> is a notation that allows otherwise invalid characters to be included in a [[URI]]. +<<.dlink-ex "Percent encoding" "https://en.wikipedia.org/wiki/Percent-encoding">> is a notation that allows otherwise invalid characters to be included in a [[URI]]. Such characters are represented as a percent sign `%` followed by two additional characters. diff --git a/editions/tw5.com/tiddlers/definitions/Quine.tid b/editions/tw5.com/tiddlers/definitions/Quine.tid index e33a5ada8..7bd3a152c 100644 --- a/editions/tw5.com/tiddlers/definitions/Quine.tid +++ b/editions/tw5.com/tiddlers/definitions/Quine.tid @@ -4,7 +4,7 @@ tags: Definitions title: Quine type: text/vnd.tiddlywiki -Wikipedia [[defines a Quine|http://en.wikipedia.org/wiki/Quine_(computing)]] as //a computer program which takes no input and produces a copy of its own source code as its only output//. +Wikipedia [[defines a Quine|https://en.wikipedia.org/wiki/Quine_(computing)]] as //a computer program which takes no input and produces a copy of its own source code as its only output//. TiddlyWiki is an unusual example of a practical quine: it is this ability to produce a copy of its own source code that lies at the heart of TiddlyWiki's ability to independently save changes to itself. diff --git a/editions/tw5.com/tiddlers/definitions/URI.tid b/editions/tw5.com/tiddlers/definitions/URI.tid index e5154c908..4443b2df3 100644 --- a/editions/tw5.com/tiddlers/definitions/URI.tid +++ b/editions/tw5.com/tiddlers/definitions/URI.tid @@ -4,4 +4,4 @@ tags: Definitions title: URI type: text/vnd.tiddlywiki -A <<.dlink-ex "URI" "http://en.wikipedia.org/wiki/Uniform_resource_identifier">> (also often known as a <<.def URL>>) is a string of characters used to specify the location of a resource such as a web page. +A <<.dlink-ex "URI" "https://en.wikipedia.org/wiki/Uniform_resource_identifier">> (also often known as a <<.def URL>>) is a string of characters used to specify the location of a resource such as a web page. diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid index 59ce4293a..24ea95129 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid @@ -18,7 +18,7 @@ Use it to keep your [[to-do list|TaskManagementExample]], to plan an [[essay or Unlike conventional online services, TiddlyWiki lets you choose where to keep your data, guaranteeing that in the decades to come you will [[still be able to use|Future Proof]] the notes you take today. <div style="font-size:0.7em;text-align:center;margin:3em auto;"> -<a href="http://groups.google.com/group/TiddlyWiki" class="tc-btn-big-green" style="border-radius:4px;background-color:#FF8C19;" target="_blank" rel="noopener noreferrer"> +<a href="https://groups.google.com/group/TiddlyWiki" class="tc-btn-big-green" style="border-radius:4px;background-color:#FF8C19;" target="_blank" rel="noopener noreferrer"> {{$:/core/images/help}} Forum </a> <a href="https://www.youtube.com/c/JeremyRuston" class="tc-btn-big-green" style="border-radius:4px;background-color:#e52d27;" target="_blank" rel="noopener noreferrer"> diff --git a/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid b/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid index 803ff4fa4..116bf8741 100644 --- a/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid +++ b/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid @@ -12,4 +12,4 @@ Under Windows it is possible to convert TiddlyWiki into a true local application Note that one disadvantage of this approach is that the TiddlyWiki file is saved in UTF-16 format, making it up to twice as large as it would be with the usual UTF-8 encoding. However, opening and saving the file via another saving method will re-encode the file to UTF-8. -See Wikipedia for more details: http://en.wikipedia.org/wiki/HTML_Application +See Wikipedia for more details: https://en.wikipedia.org/wiki/HTML_Application diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-external-window.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-external-window.tid index 994d5d787..960f94f2f 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-external-window.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-open-external-window.tid @@ -7,10 +7,10 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.14">> -The `tm-open-external-window` message opens an external link eg: "http://tiddlywiki.com" in a new //browser// window. If no parameters are specified, it opens the help tiddler. Any additional parameters passed via the <<.param "paramObject">> are being provided as variables to the new window. +The `tm-open-external-window` message opens an external link eg: "https://tiddlywiki.com" in a new //browser// window. If no parameters are specified, it opens the help tiddler. Any additional parameters passed via the <<.param "paramObject">> are being provided as variables to the new window. |!Name |!Description | -|param |URL of the tiddler to be opened in a new browser window, defaults to the [[TiddlyWiki help|http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window if empty]] | +|param |URL of the tiddler to be opened in a new browser window, defaults to the [[TiddlyWiki help|https://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window if empty]] | |paramObject |Optional: Hashmap of variables that will be provided to the window. see below | ''parmObject'' @@ -25,7 +25,7 @@ The `tm-open-external-window` message is usually generated with the ButtonWidget <$macrocall $name='wikitext-example-without-html' src='<$button> -<$action-sendmessage $message="tm-open-external-window" $param="http://tiddlywiki.com" windowName="_tiddlywiki" windowFeatures="height=500, width=900"/> +<$action-sendmessage $message="tm-open-external-window" $param="https://tiddlywiki.com" windowName="_tiddlywiki" windowFeatures="height=500, width=900"/> Open ~TiddlyWiki - Action </$button> @@ -34,6 +34,6 @@ Open ~TiddlyWiki - Action Open Mozilla Help - Action </$button> -<$button message="tm-open-external-window" param="http://tiddlywiki.com" > +<$button message="tm-open-external-window" param="https://tiddlywiki.com" > Open ~TiddlyWiki - Button </$button>'/> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid b/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid index 13eb60c79..40a675c63 100644 --- a/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid +++ b/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid @@ -1,13 +1,46 @@ -created: 20160602043529506 -modified: 20160602043531313 -tags: [[TiddlyWiki on Node.js]] +caption: Node.js on Termux +created: 20200501120322327 +delivery: App with DIY steps +description: Using Node.js to serve/create flatfile wikis +method: sync +modified: 20200501120801899 +tags: Saving [[TiddlyWiki on Node.js]] Android title: Serving TW5 from Android type: text/vnd.tiddlywiki -[[Termux|https://termux.com/]] is an open source Android application that combines a Linux system and a terminal. +[[Termux|https://termux.com/]] is and open source android application providing limited Unix environment enabling users to install [[Node.js]] and npm modules in android. Users can install and run [[TiddlyWiki on Node.js]] using [[Termux|https://termux.com/]]. -Once you open //Termux// on your Android system, it is straightforward to [[install|Installing TiddlyWiki on Node.js]] and [[run|Using TiddlyWiki on Node.js]] the [[Node.js flavour of TiddlyWiki|TiddlyWiki on Node.js]] from the command line. +!! Instructions -From then on, as long as //Termux// is not closed, you may access your wiki anytime from your favourite Web browser pointing on the expected address and port. +* Download and install Termux from [[Google Play Store|https://play.google.com/store/apps/details?id=com.termux]] or [[Fdroid|https://f-droid.org/en/packages/com.termux/]] +* Open termux and run the following commands one by one -> __note to contributors__: in //Termux//, you may as well install //git//, //emacs// or //vi//, in order to edit and maintain individual tiddler files. This would probably require that you also attach a more powerful keyboard to your Android, like the [[Hacker's Keyboard|https://github.com/klausw/hackerskeyboard/]] application or a Bluetooth external device. \ No newline at end of file + ```bash +apt update +apt upgrade +apt install nodejs +npm install -g tiddlywiki +``` + +* If you need to create/serve ''~TiddlyWiki on Node.js'' from the internal storage, you need to give termux storage permission by running the following command in termux + +``` +termux-setup-storage +``` + +* Now you can create and serve ''~TiddlyWiki on Node.js'' from internal storage. In the example given below, user is creating a new wiki called "mynewwiki" in his internal folder. + +``` +cd storage/shared +tiddlywiki mynewwiki --init server +tiddlywiki mynewwiki --listen +``` +* Visit http://127.0.0.1:8080/ in your browser +* From then on, as long as //Termux// is not closed, you may access your wiki anytime from your favourite Web browser pointing on the expected address and port. + +--- + +* For more information regarding ~TiddlyWiki on Node.js, please see [[Installing TiddlyWiki on Node.js]] +* For more information and tips regarding termux, please refer to [[Termux wiki|https://wiki.termux.com/wiki/Main_Page]] + +<<.tip "In //Termux//, you may as well install //git//, //emacs// or //vi//, in order to edit and maintain individual tiddler files. This would probably require that you also attach a more powerful keyboard to your Android, like the [[Hacker's Keyboard|https://github.com/klausw/hackerskeyboard/]] application or a Bluetooth external device.">> diff --git a/editions/tw5.com/tiddlers/releasenotes/Release 5.1.8.tid b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.8.tid index 647b87787..ec43827aa 100644 --- a/editions/tw5.com/tiddlers/releasenotes/Release 5.1.8.tid +++ b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.8.tid @@ -15,7 +15,7 @@ This release includes many improvements to the documentation for TiddlyWiki. Man * Improvements to French, Danish, Chinese and Japanese translations * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/cb8caf6a01aeeac480bf28661888961657b0dbd8]] Czech translation -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/d6918d737f5d1b663346ad9a35421a5ae0ffb9a7]] [[Interlingua|http://en.wikipedia.org/wiki/Interlingua]] translation +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/d6918d737f5d1b663346ad9a35421a5ae0ffb9a7]] [[Interlingua|https://en.wikipedia.org/wiki/Interlingua]] translation * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6721a5eb1b77935226ccc8559008af3a0a05d0cb]] Portuguese translation * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/b845751d3c549366adb2f6e5c58b0114fa95ba30]] Punjabi and Hindu translations * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/49a9a2c44ca3a71fff3062709f06940aaca4a574]] Slovak translation diff --git a/editions/tw5.com/tiddlers/saving/Saving on Android.tid b/editions/tw5.com/tiddlers/saving/Saving on Android.tid index 903563b24..d5f01dad2 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on Android.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on Android.tid @@ -3,25 +3,30 @@ created: 20130825161400000 delivery: App description: Android app for saving changes locally to device storage method: save -modified: 20191013145728306 +modified: 20200501103500478 tags: Saving Android title: Saving on Android type: text/vnd.tiddlywiki +url: https://github.com/donmor/Tiddloid -The Tiddloid or Tiddloid Lite app for Android devices makes it possible to edit and save changes to TiddlyWiki. Get it from GitHub: [[Tiddloid|https://github.com/donmor/Tiddloid]] [[Tiddloid Lite|https://github.com/donmor/TiddloidLite]]. +The Tiddloid and Tiddloid Lite app are Android apps that makes it possible to edit and save changes to TiddlyWiki HTML files. -''Instructions for use:'' +* For more information: [[Tiddloid|https://github.com/donmor/Tiddloid]] [[Tiddloid Lite|https://github.com/donmor/TiddloidLite]]. +* Download apks: [[Tiddloid|https://github.com/donmor/Tiddloid/releases]], [[TiddloidLite|https://github.com/donmor/TiddloidLite/releases]] -# [[Download]] an empty TiddlyWiki on another web browser -# Move the file you just downloaded to the directory `/sdcard/andtidwiki` -#* You may rename it, but be sure to keep the `.html` or `.htm` extension -# Open AndTidWiki -#* Don't use ''Menu''/''new ~TiddlyWiki'' menu option (it only supports the older TiddlyWikiClassic) -# Open the file by touching its filename -# Try creating a new tiddler using the ''new tiddler'' <<.icon $:/core/images/new-button>> button in the sidebar. Type some content for the tiddler, and click the <<.icon $:/core/images/done-button>> ''ok'' button -#* The wiki will be saved, and a confirmation message should appear at the top right of the window -''Note:'' You can save your changes by clicking the <<.icon $:/core/images/save-button>> ''save changes'' button in the sidebar even if you have not clicked the <<.icon $:/core/images/done-button>> ''ok'' button to complete editing a tiddler +!!! Features -* Tiddloid Lite supports new devices better. It also supports files on clouds like GDrive and ~OneDrive, while Tiddloid keeps the compatibility to TiddlyWikiClassic. For more difference between Tiddloid and Tiddloid Lite, please visit [[Tiddloid's homepage|https://github.com/donmor/Tiddloid]]. -* You should keep the `.html` or `.htm` extension of the files to be imported. +* Create new ~TiddlyWiki importing latest edition from internet +* Import existing ~TiddlyWikis stored on device/internal storage. ([[TiddloidLite|https://github.com/donmor/TiddloidLite/releases]] supports external SD card too) +* Fork interesting ~Tiddlywikis from internet (Supports TW5 only) +* TiddlyWiki detection +* Locally stored ~Tiddlywikis are updated simultaneously on saving changes to ~TiddlyWikis imported to the app +* Backup system that is compatible with TiddlyDesktop, the desktop TiddlyWiki saver +* Creating shortcuts to existing ~TiddlyWiki on Android Homepage +* [[TiddloidLite|https://github.com/donmor/TiddloidLite/releases]] supports cloud storages like GDrive and ~OneDrive + +!!! Please note + +* Tiddloid Lite feature better support for devices running Android Q or later. It also supports cloud storages like GDrive and ~OneDrive, while Tiddloid keeps the compatibility to TiddlyWikiClassic. To know more about differences between Tiddloid and Tiddloid Lite, please visit [[Tiddloid's homepage|https://github.com/donmor/Tiddloid]]. +* You should keep the `.html` or `.htm` extension of the files to be imported. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid index 9b4b47813..6a8a4c1c6 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid @@ -10,11 +10,11 @@ description: Free online service for hosting TiddlyWiki files [[TiddlySpot|http://tiddlyspot.com]] is a free hosting service for TiddlyWiki documents from Simon Baird and Daniel Baird. -! Setting up a TiddlyWiki on TiddlySpot +! Setting up a TiddlyWiki on ~TiddlySpot To set up a [[TiddlyWiki Classic|TiddlyWikiClassic]], you merely create a new wiki at http://tiddlyspot.com -!!TiddlyWiki5 on TiddlySpot -~TiddlyWiki5 also functions well on ~TiddlySpot but this version is not offered directly in the TiddlySpot set-up. +!!TiddlyWiki5 on ~TiddlySpot +~TiddlyWiki5 also functions well on ~TiddlySpot but this version is not offered directly in the ~TiddlySpot set-up. The simplest way to create a new ~TiddlySpot with ~TiddlyWiki5 is probably through the community created site http://tiddlywiki5.tiddlyspot.com @@ -22,11 +22,11 @@ Alternatively, you can upload an existing ~TiddlyWiki5 document from your local # Sign up for a new wiki at http://tiddlyspot.com/, and remember the wiki name and password # Open your locally stored TiddlyWiki document in your browser -# Fill in the TiddlySpot wikiname and password in ''Saving'' tab of the ''control panel'' <<.icon $:/core/images/options-button>> +# Fill in the ~TiddlySpot wikiname and password in ''Saving'' tab of the ''control panel'' <<.icon $:/core/images/options-button>> # Click the <<.icon $:/core/images/save-button>> ''save changes'' button. You should get a confirmation notification at the top right saying ''Saved wiki''. Saving can take several seconds if you're on a slow connection or working with a large wiki. -# Navigate to your TiddlySpot URL at http://{wikiname}.tiddlyspot.com/ +# Navigate to your ~TiddlySpot URL at http://{wikiname}.tiddlyspot.com/ -Note that your password is sent unencrypted when using TiddlySpot. From http://faq.tiddlyspot.com/: +Note that your password is sent unencrypted when using ~TiddlySpot. From http://faq.tiddlyspot.com/: <<< ''Is Tiddlyspot secure?'' @@ -34,9 +34,9 @@ Note that your password is sent unencrypted when using TiddlySpot. From http://f No. Tiddlyspot does not use SSL/https. Your password is sent in clear text when uploading and when authenticating to access a private site. This means that your Tiddlyspot is vulnerable to packet sniffing and your password could be discovered by a malicious third party. Also your data is transmitted unencrypted when you view your site, even if it is a private site. For this reason please don't put sensitive information such as banking details in your Tiddlyspot and don't use a password that you use for other high security sites. <<< -! Problems with saving on TiddlySpot +! Problems with saving on ~TiddlySpot -In case you run into this error when uploading a new or freshly upgraded local TiddlyWiki to TiddlySpot : +In case you run into this error when uploading a new or freshly upgraded local TiddlyWiki to ~TiddlySpot : <<< Error while saving: @@ -46,9 +46,9 @@ Error:NS_ERROR_DOM_BAD_URI: Access to restricted URI denied The upgrade operation falls foul of a security restriction in Firefox. Until this can be resolved, we suggest using Chrome. -*# Use Chrome to open the local TiddlyWiki document you want to upload to TiddlySpot and follow the steps 1 through 5 described above -*# Once you've checked the TiddlySpot-hosted TiddlyWiki loads properly in Chrome, you should be able to access, edit and [[save using TiddlyFox|Saving with TiddlyFox]] again -* After you've uploaded your local document once, further editing and saving of the online version hosted on TiddlySpot should work with any modern browser of your choice. -** Don't forget to fill in the TiddlySpot wikiname and password in your TiddlySpot TiddlyWiki control panel for any new browser you want to use for saving changes +*# Use Chrome to open the local TiddlyWiki document you want to upload to ~TiddlySpot and follow the steps 1 through 5 described above +*# Once you've checked the ~TiddlySpot-hosted TiddlyWiki loads properly in Chrome, you should be able to access, edit and [[save using TiddlyFox|Saving with TiddlyFox]] again +* After you've uploaded your local document once, further editing and saving of the online version hosted on ~TiddlySpot should work with any modern browser of your choice. +** Don't forget to fill in the ~TiddlySpot wikiname and password in your ~TiddlySpot TiddlyWiki control panel for any new browser you want to use for saving changes * //See also : [[Upgrading]]// diff --git a/editions/tw5.com/tiddlers/styleguide/Spelling.tid b/editions/tw5.com/tiddlers/styleguide/Spelling.tid index 92c16086e..e71c6a476 100644 --- a/editions/tw5.com/tiddlers/styleguide/Spelling.tid +++ b/editions/tw5.com/tiddlers/styleguide/Spelling.tid @@ -3,7 +3,7 @@ modified: 20150117152553000 title: Spelling tags: [[Improving TiddlyWiki Documentation]] -Because ~TiddlyWiki is of British origin, its English documentation uses [[British spelling in preference to US spelling|http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences]]. +Because ~TiddlyWiki is of British origin, its English documentation uses [[British spelling in preference to US spelling|https://en.wikipedia.org/wiki/American_and_British_English_spelling_differences]]. Words like <<.word customise>> are spelled <<.word -ise>>, not <<.word -ize>>. Words like <<.word colour>> will also be spelled using UK English unless they are being used for reserved words in code, such as in CSS or JavaScript. diff --git a/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid index 91b1c5e1d..03deca440 100644 --- a/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Code Blocks in WikiText.tid @@ -40,5 +40,5 @@ This will be monospaced ``` </pre> -Note that some keyboard layouts treat the backtick as a [[dead key|http://en.wikipedia.org/wiki/Dead_key]], making it hard to type. The trick is to type three backticks followed by a space. Alternatively, type all six backticks in one go, then a space, and then move the cursor back three characters to type or paste the content. +Note that some keyboard layouts treat the backtick as a [[dead key|https://en.wikipedia.org/wiki/Dead_key]], making it hard to type. The trick is to type three backticks followed by a space. Alternatively, type all six backticks in one go, then a space, and then move the cursor back three characters to type or paste the content. From 86640474b525a7666881fa92f6bb01b08ae8e0fa Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 6 May 2020 10:46:29 +0200 Subject: [PATCH 0664/2376] Fix search dropdown items text color on hover (#4632) --- themes/tiddlywiki/vanilla/base.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 336ba6e6f..49a240b08 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1594,7 +1594,7 @@ html body.tc-body.tc-single-tiddler-window { color: <<colour muted-foreground>>; } -.tc-block-dropdown a:hover { +.tc-block-dropdown a.tc-tiddlylink:hover { color: <<colour tiddler-link-background>>; background-color: <<colour tiddler-link-foreground>>; text-decoration: none; From 71a827eead948c959d3f8e4b243d28ded03db2c5 Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Wed, 6 May 2020 10:51:11 +0200 Subject: [PATCH 0665/2376] Fix mailto links Forums.tid (#4616) To avoid users being mislead when trying to subscribe by email to one of the Google Groups, put only the relevant mailto link in each forum section. Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- editions/tw5.com/tiddlers/community/Forums.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/Forums.tid b/editions/tw5.com/tiddlers/community/Forums.tid index 61e1281dd..b213db329 100644 --- a/editions/tw5.com/tiddlers/community/Forums.tid +++ b/editions/tw5.com/tiddlers/community/Forums.tid @@ -9,7 +9,7 @@ type: text/vnd.tiddlywiki The ~TiddlyWiki discussion groups are mailing lists for talking about ~TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email. * The main ~TiddlyWiki group: https://groups.google.com/group/TiddlyWiki -*> Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to mailto:tiddlywiki+subscribe@googlegroups.com or mailto:tiddlywikidev+subscribe@googlegroups.com. +*> Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to mailto:tiddlywiki+subscribe@googlegroups.com. ** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywiki@googlegroups.com/]] * Watch recordings of our regular [[TiddlyWiki Hangouts]] * Follow [[@TiddlyWiki on Twitter|http://twitter.com/TiddlyWiki]] for the latest news @@ -20,7 +20,7 @@ The ~TiddlyWiki discussion groups are mailing lists for talking about ~TiddlyWik ! Developers * The TiddlyWikiDev group for developers: https://groups.google.com/group/TiddlyWikiDev -*> Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to mailto:tiddlywiki+subscribe@googlegroups.com or mailto:tiddlywikidev+subscribe@googlegroups.com. +*> Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to mailto:tiddlywikidev+subscribe@googlegroups.com. ** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywikidev@googlegroups.com/]] * Follow [[@TiddlyWiki on Twitter|http://twitter.com/#!/TiddlyWiki]] for the latest news * Get involved in the [[development on GitHub|https://github.com/Jermolene/TiddlyWiki5]] From 48dfadd85b8ebd788b44ed2c46108720742546df Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 6 May 2020 11:05:54 +0100 Subject: [PATCH 0666/2376] InfoMechanism: Add $:/info/startup-timestamp --- core/modules/info/platform.js | 1 + editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/modules/info/platform.js b/core/modules/info/platform.js index 94991ea80..29ebdd594 100644 --- a/core/modules/info/platform.js +++ b/core/modules/info/platform.js @@ -18,6 +18,7 @@ exports.getInfoTiddlerFields = function() { // Basics infoTiddlerFields.push({title: "$:/info/browser", text: mapBoolean(!!$tw.browser)}); infoTiddlerFields.push({title: "$:/info/node", text: mapBoolean(!!$tw.node)}); + infoTiddlerFields.push({title: "$:/info/startup-timestamp", text: $tw.utils.stringifyDate(new Date())}); if($tw.browser) { // Document location var setLocationProperty = function(name,value) { diff --git a/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid index d095b5a61..62d907076 100644 --- a/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid @@ -1,5 +1,5 @@ created: 20140720164948099 -modified: 20190307175403915 +modified: 20200506110435897 tags: Mechanisms title: InfoMechanism type: text/vnd.tiddlywiki @@ -13,6 +13,7 @@ System tiddlers in the namespace `$:/info/` are used to expose information about ! Information Tiddlers |!Title |!Description | +|[[$:/info/startup-timestamp]] |<<.from-version "5.1.23">> Startup timestamp in TiddlyWiki date format | |[[$:/info/browser]] |Running in the browser? ("yes" or "no") | |[[$:/info/browser/language]] |<<.from-version "5.1.20">> Language as reported by browser (note that some browsers report two character codes such as `en` while others report full codes such as `en-GB`) | |[[$:/info/browser/screen/width]] |Screen width in pixels | From 81f07cdf852d8dd7c8e8e41984a6193c5d9a9c15 Mon Sep 17 00:00:00 2001 From: Arlen22 <arlenbee@gmail.com> Date: Wed, 6 May 2020 06:27:50 -0400 Subject: [PATCH 0667/2376] Use this.wiki where applicable (#4601) * Use state.wiki * use local wiki where available * fix a couple this vs self cases --- core/modules/commands/fetch.js | 2 +- core/modules/commands/savelibrarytiddlers.js | 2 +- core/modules/filters/has.js | 4 ++-- core/modules/server/routes/get-tiddlers-json.js | 4 ++-- core/modules/server/server.js | 2 +- core/modules/syncer.js | 6 +++--- core/modules/upgraders/plugins.js | 2 +- core/modules/wiki.js | 2 +- plugins/tiddlywiki/innerwiki/innerwiki.js | 3 ++- plugins/tiddlywiki/railroad/wrapper.js | 2 +- plugins/tiddlywiki/tw2parser/wikitextparser.js | 2 +- plugins/tiddlywiki/xlsx-utils/importer.js | 11 ++++++----- plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js | 5 +++-- 13 files changed, 25 insertions(+), 22 deletions(-) diff --git a/core/modules/commands/fetch.js b/core/modules/commands/fetch.js index 8abd0b1bb..8d0997010 100644 --- a/core/modules/commands/fetch.js +++ b/core/modules/commands/fetch.js @@ -71,7 +71,7 @@ Command.prototype.fetchFiles = function(options) { if(options.url) { urls = [options.url] } else if(options.urlFilter) { - urls = $tw.wiki.filterTiddlers(options.urlFilter); + urls = this.commander.wiki.filterTiddlers(options.urlFilter); } else { return "Missing URL"; } diff --git a/core/modules/commands/savelibrarytiddlers.js b/core/modules/commands/savelibrarytiddlers.js index 58030d3d8..a49a3a190 100644 --- a/core/modules/commands/savelibrarytiddlers.js +++ b/core/modules/commands/savelibrarytiddlers.js @@ -69,7 +69,7 @@ Command.prototype.execute = function() { // Collect the skinny list data var pluginTiddlers = JSON.parse(tiddler.text), readmeContent = (pluginTiddlers.tiddlers[title + "/readme"] || {}).text, - doesRequireReload = !!$tw.wiki.doesPluginInfoRequireReload(pluginTiddlers), + doesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers), iconTiddler = pluginTiddlers.tiddlers[title + "/icon"] || {}, iconType = iconTiddler.type, iconText = iconTiddler.text, diff --git a/core/modules/filters/has.js b/core/modules/filters/has.js index 192daac70..7be4cf295 100644 --- a/core/modules/filters/has.js +++ b/core/modules/filters/has.js @@ -37,13 +37,13 @@ exports.has = function(source,operator,options) { else if(operator.suffix === "index") { if(invert) { source(function(tiddler,title) { - if(!tiddler || (tiddler && (!$tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) { + if(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) { results.push(title); } }); } else { source(function(tiddler,title) { - if(tiddler && $tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) { + if(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) { results.push(title); } }); diff --git a/core/modules/server/routes/get-tiddlers-json.js b/core/modules/server/routes/get-tiddlers-json.js index 80c2a9cf9..2c730e066 100644 --- a/core/modules/server/routes/get-tiddlers-json.js +++ b/core/modules/server/routes/get-tiddlers-json.js @@ -20,8 +20,8 @@ exports.path = /^\/recipes\/default\/tiddlers.json$/; exports.handler = function(request,response,state) { var filter = state.queryParameters.filter || DEFAULT_FILTER; - if($tw.wiki.getTiddlerText("$:/config/Server/AllowAllExternalFilters") !== "yes") { - if($tw.wiki.getTiddlerText("$:/config/Server/ExternalFilters/" + filter) !== "yes") { + if(state.wiki.getTiddlerText("$:/config/Server/AllowAllExternalFilters") !== "yes") { + if(state.wiki.getTiddlerText("$:/config/Server/ExternalFilters/" + filter) !== "yes") { console.log("Blocked attempt to GET /recipes/default/tiddlers.json with filter: " + filter); response.writeHead(403); response.end(); diff --git a/core/modules/server/server.js b/core/modules/server/server.js index 3226cacd7..7e3716751 100644 --- a/core/modules/server/server.js +++ b/core/modules/server/server.js @@ -248,7 +248,7 @@ Server.prototype.listen = function(port,host,prefix) { port = process.env[port] || 8080; } // Warn if required plugins are missing - if(!$tw.wiki.getTiddler("$:/plugins/tiddlywiki/tiddlyweb") || !$tw.wiki.getTiddler("$:/plugins/tiddlywiki/filesystem")) { + if(!this.wiki.getTiddler("$:/plugins/tiddlywiki/tiddlyweb") || !this.wiki.getTiddler("$:/plugins/tiddlywiki/filesystem")) { $tw.utils.warning("Warning: Plugins required for client-server operation (\"tiddlywiki/filesystem\" and \"tiddlywiki/tiddlyweb\") are missing from tiddlywiki.info file"); } // Create the server diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 91bd7e701..420e7cea9 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -127,7 +127,7 @@ function Syncer(options) { }); } // Listen out for lazyLoad events - if(!this.disableUI && $tw.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== "yes") { + if(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== "yes") { this.wiki.addEventListener("lazyLoad",function(title) { self.handleLazyLoadEvent(title); }); @@ -204,7 +204,7 @@ Syncer.prototype.isDirty = function() { if(this.wiki.tiddlerExists(title)) { if(tiddlerInfo) { // If the tiddler is known on the server and has been modified locally then it needs to be saved to the server - if($tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount) { + if(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) { return true; } } else { @@ -526,7 +526,7 @@ Syncer.prototype.chooseNextTask = function() { tiddlerInfo = this.tiddlerInfo[title]; if(tiddler) { // If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server - var hasChanged = !tiddlerInfo || $tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount, + var hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount, isReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved; if(hasChanged) { if(isReadyToSave) { diff --git a/core/modules/upgraders/plugins.js b/core/modules/upgraders/plugins.js index 68aa62fb2..83c762897 100644 --- a/core/modules/upgraders/plugins.js +++ b/core/modules/upgraders/plugins.js @@ -41,7 +41,7 @@ exports.upgrade = function(wiki,titles,tiddlers) { // Check if we're dealing with a plugin if(incomingTiddler && incomingTiddler["plugin-type"]) { // Check whether the plugin contains JS modules - var requiresReload = $tw.wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? ($tw.wiki.getTiddlerText("$:/language/ControlPanel/Plugins/PluginWillRequireReload") + " ") : ""; + var requiresReload = wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? (wiki.getTiddlerText("$:/language/ControlPanel/Plugins/PluginWillRequireReload") + " ") : ""; messages[title] = requiresReload; if(incomingTiddler.version) { // Upgrade the incoming plugin if it is in the upgrade library diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 16f9e12f5..ff8bc6287 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1052,7 +1052,7 @@ exports.makeTranscludeWidget = function(title,options) { if(options.children) { parseTreeTransclude.children = options.children; } - return $tw.wiki.makeWidget(parseTreeDiv,options); + return this.makeWidget(parseTreeDiv,options); }; /* diff --git a/plugins/tiddlywiki/innerwiki/innerwiki.js b/plugins/tiddlywiki/innerwiki/innerwiki.js index a297858dc..e1c25f8fa 100644 --- a/plugins/tiddlywiki/innerwiki/innerwiki.js +++ b/plugins/tiddlywiki/innerwiki/innerwiki.js @@ -287,9 +287,10 @@ InnerWikiWidget.prototype.readTiddlerDataWidget = function(dataWidget) { titles = this.wiki.filterTiddlers(dataWidget.getAttribute("$filter")); } if(titles) { + var self = this; var results = []; $tw.utils.each(titles,function(title,index) { - var tiddler = $tw.wiki.getTiddler(title), + var tiddler = self.wiki.getTiddler(title), fields; if(tiddler) { fields = tiddler.getFieldStrings(); diff --git a/plugins/tiddlywiki/railroad/wrapper.js b/plugins/tiddlywiki/railroad/wrapper.js index aeaab3543..311d2f420 100644 --- a/plugins/tiddlywiki/railroad/wrapper.js +++ b/plugins/tiddlywiki/railroad/wrapper.js @@ -40,7 +40,7 @@ RailroadWidget.prototype.render = function(parent,nextSibling) { var div = this.document.createElement("div"); try { // Initialise options from the config tiddler or widget attributes - var config = $tw.wiki.getTiddlerData(RAILROAD_OPTIONS,{}); + var config = this.wiki.getTiddlerData(RAILROAD_OPTIONS,{}); var options = { arrow: this.getAttribute("arrow", config.arrow || "yes") === "yes", debug: this.getAttribute("debug", config.debug || "no") === "yes", diff --git a/plugins/tiddlywiki/tw2parser/wikitextparser.js b/plugins/tiddlywiki/tw2parser/wikitextparser.js index 6a56992f5..947519bb9 100644 --- a/plugins/tiddlywiki/tw2parser/wikitextparser.js +++ b/plugins/tiddlywiki/tw2parser/wikitextparser.js @@ -60,7 +60,7 @@ var WikiTextParser = function(type,text,options) { this.output = null; this.subWikify(this.children); // prepend tw2 macros locally to the content - var parser = $tw.wiki.parseTiddler("$:/plugins/tiddlywiki/tw2parser/macrodefs",{parseAsInline:false}); + var parser = this.wiki.parseTiddler("$:/plugins/tiddlywiki/tw2parser/macrodefs",{parseAsInline:false}); this.tree = [{ type: "element", tag: "div", diff --git a/plugins/tiddlywiki/xlsx-utils/importer.js b/plugins/tiddlywiki/xlsx-utils/importer.js index 34524c9e1..d634ca55d 100644 --- a/plugins/tiddlywiki/xlsx-utils/importer.js +++ b/plugins/tiddlywiki/xlsx-utils/importer.js @@ -18,9 +18,10 @@ var XLSX = require("$:/plugins/tiddlywiki/xlsx-utils/xlsx.js"), JSZip = require("$:/plugins/tiddlywiki/jszip/jszip.js"); var XLSXImporter = function(options) { + this.wiki = options.wiki; this.filename = options.filename; this.text = options.text; - this.importSpec = options.importSpec || $tw.wiki.getTiddlerText(DEFAULT_IMPORT_SPEC_TITLE); + this.importSpec = options.importSpec || this.wiki.getTiddlerText(DEFAULT_IMPORT_SPEC_TITLE); this.logger = new $tw.utils.Logger("xlsx-utils"); this.results = []; if(JSZip) { @@ -40,7 +41,7 @@ XLSXImporter.prototype.processWorkbook = function() { this.workbook = XLSX.read(this.text,{type:"base64"}); } // Read the root import specification - this.rootImportSpec = $tw.wiki.getTiddler(this.importSpec); + this.rootImportSpec = this.wiki.getTiddler(this.importSpec); if(this.rootImportSpec) { // Iterate through the sheets specified in the list field $tw.utils.each(this.rootImportSpec.fields.list || [],this.processSheet.bind(this)); @@ -49,7 +50,7 @@ XLSXImporter.prototype.processWorkbook = function() { XLSXImporter.prototype.processSheet = function(sheetImportSpecTitle) { // Get the sheet import specifier - this.sheetImportSpec = $tw.wiki.getTiddler(sheetImportSpecTitle); + this.sheetImportSpec = this.wiki.getTiddler(sheetImportSpecTitle); if(this.sheetImportSpec) { this.sheetName = this.sheetImportSpec.fields["import-sheet-name"]; this.sheet = this.workbook.Sheets[this.sheetName]; @@ -70,7 +71,7 @@ XLSXImporter.prototype.processSheet = function(sheetImportSpecTitle) { }; XLSXImporter.prototype.processRow = function(rowImportSpecTitle) { - this.rowImportSpec = $tw.wiki.getTiddler(rowImportSpecTitle); + this.rowImportSpec = this.wiki.getTiddler(rowImportSpecTitle); if(this.rowImportSpec) { this.tiddlerFields = {}; this.skipTiddler = false; @@ -116,7 +117,7 @@ XLSXImporter.prototype.processRowByField = function() { }; XLSXImporter.prototype.processField = function(fieldImportSpecTitle) { - var fieldImportSpec = $tw.wiki.getTiddler(fieldImportSpecTitle); + var fieldImportSpec = this.wiki.getTiddler(fieldImportSpecTitle); if(fieldImportSpec) { var fieldName = fieldImportSpec.fields["import-field-name"], value; diff --git a/plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js b/plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js index 091778ce7..98773a3c6 100644 --- a/plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js +++ b/plugins/tiddlywiki/xlsx-utils/xlsx-import-command.js @@ -34,9 +34,10 @@ Command.prototype.execute = function() { XLSXImporter = require("$:/plugins/tiddlywiki/xlsx-utils/importer.js").XLSXImporter, importer = new XLSXImporter({ filename: filename, - importSpec: importSpec + importSpec: importSpec, + wiki: wiki }); - $tw.wiki.addTiddlers(importer.getResults()); + wiki.addTiddlers(importer.getResults()); return null; }; From 33d973fb9191303014ce026a4d49fc68f69fcb1e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 9 May 2020 15:53:38 +0100 Subject: [PATCH 0668/2376] Add originating widget to event objects --- core/modules/widgets/widget.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 7fd868ba1..e0444573d 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -421,6 +421,7 @@ Widget.prototype.addEventListener = function(type,handler) { Dispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget */ Widget.prototype.dispatchEvent = function(event) { + event.widget = event.widget || this; // Dispatch the event if this widget handles it var listener = this.eventListeners[event.type]; if(listener) { From 4966f6ab625c8ce2c9f0812a726ba928d68ea00b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 9 May 2020 15:54:44 +0100 Subject: [PATCH 0669/2376] Add slugify and duplicateslugs operators Fixes #3379 --- core/modules/filters/duplicateslugs.js | 36 +++++++++++++++++++ core/modules/filters/slugify.js | 23 ++++++++++++ core/modules/wiki.js | 25 +++++++++++++ editions/test/tiddlers/tests/test-filters.js | 10 ++++++ .../filters/duplicateslugs Operator.tid | 22 ++++++++++++ .../tiddlers/filters/slugify Operator.tid | 24 +++++++++++++ 6 files changed, 140 insertions(+) create mode 100644 core/modules/filters/duplicateslugs.js create mode 100644 core/modules/filters/slugify.js create mode 100644 editions/tw5.com/tiddlers/filters/duplicateslugs Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/slugify Operator.tid diff --git a/core/modules/filters/duplicateslugs.js b/core/modules/filters/duplicateslugs.js new file mode 100644 index 000000000..dbd2f23e7 --- /dev/null +++ b/core/modules/filters/duplicateslugs.js @@ -0,0 +1,36 @@ +/*\ +title: $:/core/modules/filters/duplicateslugs.js +type: application/javascript +module-type: filteroperator + +Filter function for [duplicateslugs[]] + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.duplicateslugs = function(source,operator,options) { + var slugs = Object.create(null), // Hashmap by slug of title, replaced with "true" if the duplicate title has already been output + results = []; + source(function(tiddler,title) { + var slug = options.wiki.slugify(title); + if(slug in slugs) { + if(slugs[slug] !== true) { + results.push(slugs[slug]); + slugs[slug] = true; + } + results.push(title); + } else { + slugs[slug] = title; + } + }); + return results; +}; + +})(); diff --git a/core/modules/filters/slugify.js b/core/modules/filters/slugify.js new file mode 100644 index 000000000..da091506b --- /dev/null +++ b/core/modules/filters/slugify.js @@ -0,0 +1,23 @@ +/*\ +title: $:/plugins/tiddlywiki/static/filters/slugify.js +type: application/javascript +module-type: filteroperator + +Filter operator for slugifying a tiddler title + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.slugify = function(source,operator,options) { + var results = []; + source(function(tiddler,title) { + results.push(options.wiki.slugify(title)); + }); + return results; +}; + +})(); diff --git a/core/modules/wiki.js b/core/modules/wiki.js index ff8bc6287..80189f7a9 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1503,5 +1503,30 @@ exports.doesPluginInfoRequireReload = function(pluginInfo) { } }; +exports.slugify = function(title,options) { + var tiddler = this.getTiddler(title), + slug; + if(tiddler && tiddler.fields.slug) { + slug = tiddler.fields.slug; + } else { + slug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII + .replace(/\s+/g,"-") // Replace spaces with - + .replace(/[^\w\-\.]+/g,"") // Remove all non-word chars except dash and dot + .replace(/\-\-+/g,"-") // Replace multiple - with single - + .replace(/^-+/,"") // Trim - from start of text + .replace(/-+$/,""); // Trim - from end of text + } + // If the resulting slug is blank (eg because the title is just punctuation characters) + if(!slug) { + // ...then just use the character codes of the title + var result = []; + $tw.utils.each(title.split(""),function(char) { + result.push(char.charCodeAt(0).toString()); + }); + slug = result.join("-"); + } + return slug; +}; + })(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 61e229540..9b6ed25d6 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -94,6 +94,7 @@ function setupWiki(wikiOptions) { tags: ["one"], cost: "123", value: "120", + slug: "tiddler-one", authors: "Joe Bloggs", modifier: "JoeBloggs", modified: "201304152222"}); @@ -103,6 +104,7 @@ function setupWiki(wikiOptions) { tags: ["two"], cost: "42", value: "190", + slug: "tiddler-two", authors: "[[John Doe]]", modifier: "John", modified: "201304152211"}); @@ -669,6 +671,14 @@ function runTests(wiki) { expect(wiki.filterTiddlers("b a b c +[sortby[b a c b]]").join(",")).toBe("b,a,c"); }); + it("should handle the slugify operator", function() { + expect(wiki.filterTiddlers("[[Joe Bloggs]slugify[]]").join(",")).toBe("joe-bloggs"); + expect(wiki.filterTiddlers("[[Joe Bloggs2]slugify[]]").join(",")).toBe("joe-bloggs2"); + expect(wiki.filterTiddlers("[[@£$%^&*((]slugify[]]").join(",")).toBe("64-163-36-37-94-38-42-40-40"); + expect(wiki.filterTiddlers("One one ONE O!N!E +[slugify[]]").join(",")).toBe("one,one,one,one"); + expect(wiki.filterTiddlers("TiddlerOne $:/TiddlerTwo +[slugify[]]").join(",")).toBe("tiddler-one,tiddler-two"); + }); + it("should handle the sortsub operator", function() { var widget = require("$:/core/modules/widgets/widget.js"); var rootWidget = new widget.widget({ type:"widget", children:[ {type:"widget", children:[]} ] }, diff --git a/editions/tw5.com/tiddlers/filters/duplicateslugs Operator.tid b/editions/tw5.com/tiddlers/filters/duplicateslugs Operator.tid new file mode 100644 index 000000000..43c89a02d --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/duplicateslugs Operator.tid @@ -0,0 +1,22 @@ +caption: duplicateslugs +created: 20200509141702846 +modified: 20200509141702846 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles transformed so that they only contain lower case letters, numbers, periods, dashes and underscores +op-purpose: returns each item in the list in a human-readable form for use in URLs or filenames +tags: [[Filter Operators]] +title: duplicateslugs Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> The <<.olink slugify>> can be used to transform arbitrary tiddler titles into human readable strings suitable for use in URLs or filenames. However, itis possible for multiple different titles to slugify to the same string. The <<.olink duplicateslugs>> operator can be used to display a warning. For example: + +<$macrocall $name='wikitext-example-without-html' +src='<$list filter="[!is[system]duplicateslugs[]limit[1]]" emptyMessage="There are no duplicate slugs"> +The following tiddlers have duplicate slugs: + +<ul> +<$list filter="[!is[system]duplicateslugs[]]"> +<li><$link><$text text=<<currentTiddler>>/></$link></li> +</$list> +</ul> +</$list>'/> diff --git a/editions/tw5.com/tiddlers/filters/slugify Operator.tid b/editions/tw5.com/tiddlers/filters/slugify Operator.tid new file mode 100644 index 000000000..09cb8252e --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/slugify Operator.tid @@ -0,0 +1,24 @@ +caption: slugify +created: 20200509141702846 +modified: 20200509141702846 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles transformed so that they only contain lower case letters, numbers, periods, dashes and underscores +op-purpose: returns each item in the list in a human-readable form for use in URLs or filenames +tags: [[Filter Operators]] +title: slugify Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> The transformation applied by the slugify operator follows these steps: + +* If there is a tiddler with the same title that has a ''slug'' field, then return that field instead of running the following steps +* Replace uppercase letters with lowercase equivalents +* Transliterate diacritics to their basic lowercase ASCII equivalents (for example, "Æ" is transliterated to "AE") +* Replace spaces with dashes +* Remove all non-word characters except dashes and periods +* Replace multiple sequential dashes with a single dash +* Trim dashes from start and end +* If the result is the empty string then character codes are used instead (eg. "&£@" transforms to "38-163-64") + +Note that it is possible for more than one title to slugify to the same string. The <<.olink duplicateslugs>> can be used to alert authors to any clashes. + +<<.operator-examples "slugify">> From 2eb11d9a2d8138ec9c0b00021f27011d6a096200 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 9 May 2020 15:56:48 +0100 Subject: [PATCH 0670/2376] Add slugify operator to JSZip static export example --- plugins/tiddlywiki/jszip/examples.tid | 16 ++++++++++++++-- plugins/tiddlywiki/jszip/startup.js | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/jszip/examples.tid b/plugins/tiddlywiki/jszip/examples.tid index 681a0c364..fac50a25c 100644 --- a/plugins/tiddlywiki/jszip/examples.tid +++ b/plugins/tiddlywiki/jszip/examples.tid @@ -2,9 +2,11 @@ title: $:/plugins/tiddlywiki/jszip/examples \define actions-render-static-site() <$action-sendmessage $message="tm-zip-create" $param="$:/temp/_ZipTiddler"/> -<$list filter="[all[tiddlers]!is[system]limit[100]]"> -<$action-sendmessage $message="tm-zip-render-file" $param="$:/temp/_ZipTiddler" filename={{{ [<currentTiddler>encodeuricomponent[]addsuffix[.html]] }}} tiddler=<<currentTiddler>> template="$:/core/templates/static.tiddler.html"/> +<$set name="tv-filter-export-link" value="[slugify[]addsuffix[.html]]"> +<$list filter="[all[tiddlers]!is[system]limit[25]]"> +<$action-sendmessage $message="tm-zip-render-file" $param="$:/temp/_ZipTiddler" filename={{{ [<currentTiddler>slugify[]addsuffix[.html]] }}} tiddler=<<currentTiddler>> template="$:/core/templates/static.tiddler.html"/> </$list> +</$set> <$action-sendmessage $message="tm-zip-render-file" $param="$:/temp/_ZipTiddler" filename="static.css" template="$:/core/templates/static.template.css"/> <$action-sendmessage $message="tm-zip-download" $param="$:/temp/_ZipTiddler" filename="myzip.zip"/> \end @@ -21,4 +23,14 @@ The actions below create a ZIP file containing a static HTML rendering of the fi Render site </$button> +'<$list filter="[!is[system]duplicateslugs[]limit[1]]" emptyMessage="(There are no duplicate slugs)"> +The following tiddlers have duplicate slugs: + +<ul> +<$list filter="[all[tiddlers]!is[system]limit[25]duplicateslugs[]]"> +<li><$link><$text text=<<currentTiddler>>/></$link></li> +</$list> +</ul> +</$list> + Temporary zip file: $:/temp/_ZipTiddler diff --git a/plugins/tiddlywiki/jszip/startup.js b/plugins/tiddlywiki/jszip/startup.js index 588ef1476..26466d74e 100644 --- a/plugins/tiddlywiki/jszip/startup.js +++ b/plugins/tiddlywiki/jszip/startup.js @@ -44,6 +44,7 @@ exports.startup = function() { templateTitle = paramObject.template, text = $tw.wiki.renderTiddler(outputType,templateTitle,{ parseAsInline: paramObject.mode === "inline", + parentWidget: event.widget, variables: { currentTiddler: paramObject.tiddler } From 34181230c7e547de4417fde87b3db33e54fc8212 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 9 May 2020 16:08:46 +0100 Subject: [PATCH 0671/2376] Release note update --- editions/prerelease/tiddlers/Release 5.1.23.tid | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 0606aed80..750607b6e 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20200422173236649 -modified: 20200422173236649 +created: 20200509160320110 +modified: 20200509160320110 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -19,7 +19,7 @@ type: text/vnd.tiddlywiki * JSZip Plugin * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser * Freelinks Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] support for ignoring case when matching titles +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements * Twitter Plugin ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded @@ -38,21 +38,26 @@ type: text/vnd.tiddlywiki ! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b]] new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter * [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f]] ''accept'' attribute to the BrowseWidget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52]] [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df]] support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) ! Bug Fixes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4632]] hover effect for search dropdown items * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4584]] restored missing parameter to `saveTiddler()` method sync adaptors * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04]] MakeLibraryCommand to skip non-directories +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4601]] erroneous use of `$tw.wiki` ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: +* [[@Arlen22|https://github.com/Arlen22]] * [[@BramChen|https://github.com/BramChen]] * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@danielo515|https://github.com/danielo515]] From bf6735420d2f8191f658c556910e7d73c681d5fe Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 10 May 2020 11:58:40 +0100 Subject: [PATCH 0672/2376] Fix SVG favicons --- core/modules/startup/favicon.js | 6 +----- editions/tw5.com/tiddlers/howtos/Setting a favicon.tid | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/core/modules/startup/favicon.js b/core/modules/startup/favicon.js index 5adcec646..0e730905f 100644 --- a/core/modules/startup/favicon.js +++ b/core/modules/startup/favicon.js @@ -36,11 +36,7 @@ function setFavicon() { var tiddler = $tw.wiki.getTiddler(FAVICON_TITLE); if(tiddler) { var faviconLink = document.getElementById("faviconLink"); - if(tiddler.fields._canonical_uri) { - faviconLink.setAttribute("href",tiddler.fields._canonical_uri); - } else { - faviconLink.setAttribute("href","data:" + tiddler.fields.type + ";base64," + tiddler.fields.text); - } + faviconLink.setAttribute("href",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri)); } } diff --git a/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid b/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid index a18dbfd55..6e707656c 100644 --- a/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid +++ b/editions/tw5.com/tiddlers/howtos/Setting a favicon.tid @@ -1,10 +1,10 @@ created: 20131224074240979 -modified: 20200422163752597 +modified: 20200510115704738 tags: [[Customise TiddlyWiki]] title: Setting a favicon type: text/vnd.tiddlywiki -"favicons" are small icons that most browsers display to help users identify websites. +"favicons" are small icons that most browsers display to help users identify websites. Note that all browsers support bitmap images, but only certain modern browsers support SVG format icons. ! favicons in the Browser From d1441d29fde17fd382658d7b541cab513d86a936 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 10 May 2020 11:59:22 +0100 Subject: [PATCH 0673/2376] Release note update --- editions/prerelease/tiddlers/Release 5.1.23.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 750607b6e..e1c3108fa 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -45,6 +45,7 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52]] [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df]] support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe]] support for SVG favicons ! Bug Fixes From 5c0d91c510c117af2afce951e784f25844a7e432 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 14 May 2020 07:53:30 +0100 Subject: [PATCH 0674/2376] Fix title of slugify.js filter module --- core/modules/filters/slugify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters/slugify.js b/core/modules/filters/slugify.js index da091506b..afc12423e 100644 --- a/core/modules/filters/slugify.js +++ b/core/modules/filters/slugify.js @@ -1,5 +1,5 @@ /*\ -title: $:/plugins/tiddlywiki/static/filters/slugify.js +title: $:/core/modules/filters/slugify.js type: application/javascript module-type: filteroperator From 84a4784dee36225d2468448308d584df95ead63f Mon Sep 17 00:00:00 2001 From: Jonas Passerini <passuf@users.noreply.github.com> Date: Thu, 14 May 2020 13:19:16 +0200 Subject: [PATCH 0675/2376] Add Transcludify ShortcutInfo (#4651) * Signing the CLA * Add Transcludify ShortcutInfo --- core/wiki/config/ShortcutInfo.multids | 1 + licenses/cla-individual.md | 3 +++ 2 files changed, 4 insertions(+) diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index e1dd4e179..1bf3c70ad 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -30,4 +30,5 @@ strikethrough: {{$:/language/Buttons/Strikethrough/Hint}} subscript: {{$:/language/Buttons/Subscript/Hint}} superscript: {{$:/language/Buttons/Superscript/Hint}} toggle-sidebar: {{$:/language/Buttons/ToggleSidebar/Hint}} +transcludify: {{$:/language/Buttons/Transcludify/Hint}} underline: {{$:/language/Buttons/Underline/Hint}} diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 15abe6d3d..f1ceccef2 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -395,3 +395,6 @@ Matthias Bilger, @m42e, 2020/03/11 Mandar Vaze, @mandarvaze, 2020/04/08 Lin Dongwu, @linonetwo, 2020/04/15 + +Jonas Passerini, @passuf, 2020/05/14 + From 9c22537b4ed8ee44e5727546297d6302d8cab288 Mon Sep 17 00:00:00 2001 From: Bimba Laszlo <bimbalaszlo@gmail.com> Date: Thu, 14 May 2020 14:55:33 +0200 Subject: [PATCH 0676/2376] Fix the class attribute of Droppable widget (#4647) Even though we passed the `class` attribute, it did not take it into account. For example try to render this: <$droppable class="custom-css-class"> ... content ... </$droppable> Before applying this patch: <span class=" tc-droppable"> ... content ... </span> After applying: <span class="custom-css-class tc-droppable"> ... content ... </span> --- core/modules/widgets/droppable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/droppable.js b/core/modules/widgets/droppable.js index cf90d2f77..066e88cef 100644 --- a/core/modules/widgets/droppable.js +++ b/core/modules/widgets/droppable.js @@ -39,7 +39,7 @@ DroppableWidget.prototype.render = function(parent,nextSibling) { } // Create element and assign classes var domNode = this.document.createElement(tag), - classes = (this["class"] || "").split(" "); + classes = (this.droppableClass || "").split(" "); classes.push("tc-droppable"); domNode.className = classes.join(" "); // Add event handlers From 6570561d4ec31d9e64c3021bb69c20daec8c9eac Mon Sep 17 00:00:00 2001 From: Bimba Laszlo <bimbalaszlo@gmail.com> Date: Thu, 14 May 2020 14:57:12 +0200 Subject: [PATCH 0677/2376] The `!has[tags]` filter didn't work because `tags` field is an array (#4643) * The `!has[tags]` filter didn't work because "tags" is an array The negated `has` filter only considered empty strings, but not empty arrays (such as the `tags` field). * Add tests for `has` filter operator with array-like fields (tags, list) --- core/modules/filters/has.js | 4 ++-- editions/test/tiddlers/tests/test-filters.js | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/modules/filters/has.js b/core/modules/filters/has.js index 7be4cf295..bdc267c70 100644 --- a/core/modules/filters/has.js +++ b/core/modules/filters/has.js @@ -52,13 +52,13 @@ exports.has = function(source,operator,options) { else { if(invert) { source(function(tiddler,title) { - if(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand] === "")) { + if(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) { results.push(title); } }); } else { source(function(tiddler,title) { - if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && !(tiddler.fields[operator.operand] === "" || tiddler.fields[operator.operand].length === 0)) { + if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) { results.push(title); } }); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 9b6ed25d6..f9feed6cf 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -317,6 +317,8 @@ function runTests(wiki) { it("should handle the has operator", function() { expect(wiki.filterTiddlers("[has[modified]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[!has[modified]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,filter regexp test,has filter,hasList,one"); + expect(wiki.filterTiddlers("[has[tags]sort[title]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[!has[tags]sort[title]]").join(",")).toBe("$:/ShadowPlugin,a fourth tiddler,filter regexp test,has filter,hasList,one"); }); it("should handle the has:field operator", function() { From 1812cbbb7cfd5783674d88f8a5b39b98d3d7ca29 Mon Sep 17 00:00:00 2001 From: mocsa <13969648+mocsa@users.noreply.github.com> Date: Thu, 14 May 2020 15:30:48 +0200 Subject: [PATCH 0678/2376] Clarify Introduction to filter notation.tid (#4639) I'm reading the documentation for the first time and I'm trying to clarify parts which are hard to understand for first-time users. --- .../tiddlers/filters/Introduction to filter notation.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid b/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid index e6b785a18..9a23eb84b 100644 --- a/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid +++ b/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid @@ -72,13 +72,13 @@ In a similar way, we can use a `-` sign to <<.em remove>> a run's tiddlers from !Special parameters -The parameter of each step we've seen so far has been in square brackets, meaning that ~TiddlyWiki treats it literally. But two other kinds of bracket are possible: +The parameter of each step we've seen so far has been in square brackets. It means that ~TiddlyWiki will filter for the exact string found between the brackets. But two other kinds of bracket are possible: -<<.def "Curly brackets">> `{}` mean that the parameter is a TextReference, and that its value is to be looked up in a specified tiddler. For example, if we have a tiddler called <<.tid Preference>> whose text happens to be the word <<.value Vegetarian>>, we can say +<<.def "Curly brackets">> `{}` mean that the parameter is a TextReference, and it will be replaced with content from another tiddler. For example, if we have a tiddler with the title <<.tid Preference>> whose content is the single word <<.value Vegetarian>>, we can say > `[tag{Preference}]` -as an alternative to `[tag[Vegetarian]]`. This allows the preference to change over time. +In this simplest form the TextReference will take the full content of the tiddler (in technical terms, the text field of the tiddler) and substitute it in place of the TextReference. This way the tiddler's content will become the filter parameter, just like if you have written `[tag[Vegetarian]]`. But it gives you the added flexibility to change the parameter by changing the content of the Preference tiddler. <<.def "Angle brackets">> `<>` mean that the parameter is the name of a [[variable|Variables]] whose value is to be used instead. Here we use the built-in <<.vlink currentTiddler>> variable in a filter that selects any tiddlers whose text contains the title of the current one: From 72ff1a26fcf3eb8d5eafedcee94c8b3e68e2f7cf Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 14 May 2020 15:31:16 +0200 Subject: [PATCH 0679/2376] Update Generating Static Sites with TiddlyWiki.tid (#4636) --- .../tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid b/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid index e9da4ae08..ce1061431 100644 --- a/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/howtos/Generating Static Sites with TiddlyWiki.tid @@ -17,7 +17,7 @@ You can explore a static representation of the main TiddlyWiki site at https://t The following commands are used to generate the sample static version of the TiddlyWiki5 site: ``` -tiddlywiki wikipath --rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html static text/plain +tiddlywiki wikipath --rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html static text/plain tiddlywiki wikipath --rendertiddler $:/core/templates/static.template.html static.html text/plain tiddlywiki wikipath --rendertiddler $:/core/templates/static.template.css static/static.css text/plain ``` From 5d91c279803b26cc6d2f292068806c888f183780 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 14 May 2020 15:31:32 +0200 Subject: [PATCH 0680/2376] Update rendertiddlers.tid (#4635) --- core/language/en-GB/Help/rendertiddlers.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/language/en-GB/Help/rendertiddlers.tid b/core/language/en-GB/Help/rendertiddlers.tid index a0e76d147..bb7b88423 100644 --- a/core/language/en-GB/Help/rendertiddlers.tid +++ b/core/language/en-GB/Help/rendertiddlers.tid @@ -6,13 +6,13 @@ description: Render tiddlers matching a filter to a specified ContentType Render a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`). ``` ---rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] ["noclean"] +--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] ["noclean"] ``` For example: ``` ---rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain +--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain ``` By default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory. From 79ec21346db0f6d1288ae315d18507eb1359081c Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 14 May 2020 15:31:57 +0200 Subject: [PATCH 0681/2376] Fix 4596 - High cpu consume after upgrade to 5.1.22 (#4634) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * fix high CPU load --- plugins/tiddlywiki/tiddlyweb/styles.tid | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/tiddlyweb/styles.tid b/plugins/tiddlywiki/tiddlyweb/styles.tid index 5d59fa379..20796e6c1 100644 --- a/plugins/tiddlywiki/tiddlyweb/styles.tid +++ b/plugins/tiddlywiki/tiddlyweb/styles.tid @@ -10,11 +10,13 @@ body.tc-dirty span.tc-dirty-indicator svg { body .tc-image-cloud-idle { fill: <<colour background>>; transition: opacity 250ms ease-in-out; - opacity: 1; + opacity: 1; + display: unset; } body.tc-dirty .tc-image-cloud-idle { opacity: 0; + display: none; } body .tc-image-cloud-progress { @@ -23,11 +25,13 @@ body .tc-image-cloud-progress { transform: rotate(359deg); animation: animation-rotate-slow 2s infinite linear; fill: <<colour background>>; + display: none; opacity: 0; } body.tc-dirty .tc-image-cloud-progress { opacity: 1; + display: unset; } @keyframes animation-rotate-slow { From 99a07f80f10d6ffe9ca1ccf1c51a0cbaf3d61434 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 14 May 2020 15:37:17 +0200 Subject: [PATCH 0682/2376] Add missing Linkify ShortcutInfo (#4653) --- core/wiki/config/ShortcutInfo.multids | 1 + 1 file changed, 1 insertion(+) diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 1bf3c70ad..5862f2394 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -13,6 +13,7 @@ heading-5: {{$:/language/Buttons/Heading5/Hint}} heading-6: {{$:/language/Buttons/Heading6/Hint}} italic: {{$:/language/Buttons/Italic/Hint}} link: {{$:/language/Buttons/Link/Hint}} +linkify: {{$:/language/Buttons/Linkify/Hint}} list-bullet: {{$:/language/Buttons/ListBullet/Hint}} list-number: {{$:/language/Buttons/ListNumber/Hint}} mono-block: {{$:/language/Buttons/MonoBlock/Hint}} From b0e40e86413c1769c8be8a84652b66ef6ac8b997 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 16 May 2020 14:56:08 +0100 Subject: [PATCH 0683/2376] Fix dynaview examples --- .../dynaview/examples/reveal-on-scroll.tid | 8 +++--- .../dynaview/examples/unreveal-on-scroll.tid | 28 ------------------- .../dynaview/examples/zoomable-tooltips.tid | 2 +- 3 files changed, 5 insertions(+), 33 deletions(-) delete mode 100644 plugins/tiddlywiki/dynaview/examples/unreveal-on-scroll.tid diff --git a/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll.tid b/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll.tid index 860b71c92..f5cd04f29 100644 --- a/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll.tid +++ b/plugins/tiddlywiki/dynaview/examples/reveal-on-scroll.tid @@ -3,21 +3,21 @@ tags: $:/tags/dynaviewExamples caption: Reveal on Scroll \define indicator(index) -<$reveal state="$:/state/unreveal-on-scroll/example$index$" type="match" text="yes"> +<$reveal state="$:/state/unreveal-on-scroll/example$index$" type="nomatch" text=""> $index$ </$reveal> \end \define lorem-ipsum(index) -<div class="tc-dynaview-set-tiddler-when-visible" style="min-height: 75px;" data-dynaview-set-tiddler="$:/state/unreveal-on-scroll/example$index$" data-dynaview-set-value="yes"> +<div class="tc-dynaview-track-tiddler-when-visible" style="min-height: 75px;" data-dynaview-track-tiddler="$:/state/unreveal-on-scroll/example$index$"> <h1>Heading $index$</h1> -<$reveal state="$:/state/unreveal-on-scroll/example$index$" type="match" text="yes"> +<$reveal state="$:/state/unreveal-on-scroll/example$index$" type="nomatch" text=""> (Rendered at <<now "[UTC]YYYY-0MM-0DD 0hh:0mm:0ss.XXX">>) Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </$reveal> </div> \end -This example renders tiddlers as they are scrolled into view. +This example renders tiddlers as they are scrolled into view, and hides them when they scroll out of view again. Visible: <$list filter="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"> <$macrocall $name="indicator" index=<<currentTiddler>>/> diff --git a/plugins/tiddlywiki/dynaview/examples/unreveal-on-scroll.tid b/plugins/tiddlywiki/dynaview/examples/unreveal-on-scroll.tid deleted file mode 100644 index b0bed8777..000000000 --- a/plugins/tiddlywiki/dynaview/examples/unreveal-on-scroll.tid +++ /dev/null @@ -1,28 +0,0 @@ -title: $:/plugins/tiddlywiki/dynaview/examples/unreveal-on-scroll -tags: $:/tags/dynaviewExamples -caption: Unreveal on Scroll - -\define indicator(index) -<$reveal state="$:/state/reveal-on-scroll/example$index$" type="match" text="yes"> -$index$ -</$reveal> -\end - -\define lorem-ipsum(index) -<div class="tc-dynaview-set-tiddler-when-visible" style="min-height: 75px;" data-dynaview-set-tiddler="$:/state/reveal-on-scroll/example$index$" data-dynaview-set-value="yes" data-dynaview-unset-tiddler="$:/state/reveal-on-scroll/example$index$" data-dynaview-unset-value="no"> -<h1>Heading $index$</h1> -<$reveal state="$:/state/reveal-on-scroll/example$index$" type="match" text="yes"> -(Rendered at <<now "[UTC]YYYY-0MM-0DD 0hh:0mm:0ss.XXX">>) Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -</$reveal> -</div> -\end - -This example renders tiddlers as they are scrolled into view, and hides them when they scroll out of view again. - -Visible: <$list filter="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"> -<$macrocall $name="indicator" index=<<currentTiddler>>/> -</$list> - -<$list filter="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"> -<$macrocall $name="lorem-ipsum" index=<<currentTiddler>>/> -</$list> diff --git a/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips.tid b/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips.tid index 8f5640607..e3dcdb24b 100644 --- a/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips.tid +++ b/plugins/tiddlywiki/dynaview/examples/zoomable-tooltips.tid @@ -48,7 +48,7 @@ caption: Zoomable Tooltips <span class="zoomable-tooltip-demo-item-image"> <$transclude/> </span> -<span class="zoomable-tooltip-demo-item-text tc-dynaview-zoom-visible-3-and-above"> +<span class="zoomable-tooltip-demo-item-text tc-dynaview-zoom-visible-2-and-above"> <$text text=<<currentTiddler>>/> </span> </div> From 75589d78d8d381cc52db4637606cf19f4fb3459d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 16 May 2020 19:52:54 +0100 Subject: [PATCH 0684/2376] Update RoadMap tiddler Fixes #4661 --- editions/tw5.com/tiddlers/roadmap/RoadMap.tid | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/editions/tw5.com/tiddlers/roadmap/RoadMap.tid b/editions/tw5.com/tiddlers/roadmap/RoadMap.tid index 6765c0461..707ed3a0b 100644 --- a/editions/tw5.com/tiddlers/roadmap/RoadMap.tid +++ b/editions/tw5.com/tiddlers/roadmap/RoadMap.tid @@ -1,17 +1,10 @@ created: 20130823203800000 -modified: 20160418123722695 +modified: 2020051619421803 tags: About title: RoadMap type: text/vnd.tiddlywiki -There are still some areas of TiddlyWiki that have not been fully developed beyond the experimental stage: +TiddlyWiki 5 is now a mature, stable project that is relied upon by many people. Simultaneously, it is rapidly evolving in many directions thanks to the broad community of developers and users. This paradoxical situation is possible because the project strictly maintains backwards compatibility, adding new features alongside the existing ones. -* Multiple users with the client-server configuration -* Smartphone user experience -* New tiddler manager, including bulk operations like search and replace -* Federation that can run in the browser or under Node.js -* Improved editions -* Improved support for third party plugin libraries - -Also see the issues list on GitHub: https://github.com/Jermolene/TiddlyWiki5 +There is no formal roadmap, but quite a few areas that have yet to be fully implemented, such as search and replace, and rich text editing. Current work can be found on ~GitHub at https://github.com/Jermolene/TiddlyWiki5/ From 954c9944ade6a052f9a1b23fbc437eb907b616b8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 7 Jun 2020 10:30:39 +0100 Subject: [PATCH 0685/2376] Fix accidental changes in 41a7d98e17470d23164420c0235b10f717a7a009 Put this one down to COVID-19 --- .../prerelease/tiddlers/afc/MySpecialTag.tid | 5 ---- .../prerelease/tiddlers/afc/TagNavigation.tid | 26 ------------------- .../tiddlers/afc/TagNavigationStyles.tid | 23 ---------------- editions/server/tiddlywiki.info | 21 +++++++++++++++ editions/share/tiddlywiki.info | 14 ++++++++++ 5 files changed, 35 insertions(+), 54 deletions(-) delete mode 100644 editions/prerelease/tiddlers/afc/MySpecialTag.tid delete mode 100644 editions/prerelease/tiddlers/afc/TagNavigation.tid delete mode 100644 editions/prerelease/tiddlers/afc/TagNavigationStyles.tid create mode 100644 editions/server/tiddlywiki.info create mode 100644 editions/share/tiddlywiki.info diff --git a/editions/prerelease/tiddlers/afc/MySpecialTag.tid b/editions/prerelease/tiddlers/afc/MySpecialTag.tid deleted file mode 100644 index aced260a9..000000000 --- a/editions/prerelease/tiddlers/afc/MySpecialTag.tid +++ /dev/null @@ -1,5 +0,0 @@ -title: MySpecialTag -show-navigation: yes -description: this is a really special tag! - -And this is lots more information about it diff --git a/editions/prerelease/tiddlers/afc/TagNavigation.tid b/editions/prerelease/tiddlers/afc/TagNavigation.tid deleted file mode 100644 index 559c32b82..000000000 --- a/editions/prerelease/tiddlers/afc/TagNavigation.tid +++ /dev/null @@ -1,26 +0,0 @@ -title: $:/_AFC/TagNavigation -tags: $:/tags/ViewTemplate -list-after: $:/core/ui/ViewTemplate/body - -<div class="tc-tag-nav-slice"> - -<$list filter="[all[current]tags[]sort[]show-navigation[yes]]" variable="tag"> - -<div class="tc-tag-nav-wrapper"> -<$button class="tc-tag-nav-button tc-tag-nav-button-previous"> -<$action-navigate $to={{{ [<tag>tagging[]before<currentTiddler>last[]] }}}/> -{{$:/core/images/chevron-left}} previous -</$button> -<$button class="tc-tag-nav-button tc-tag-nav-button-middle tc-btn-invisible"> -<$action-navigate $to=<<tag>>/> -<$text text=<<tag>>/>: <$text text={{{ [<tag>get[description]] }}}/> -</$button> -<$button class="tc-tag-nav-button tc-tag-nav-button-next"> -<$action-navigate $to={{{ [<tag>tagging[]after<currentTiddler>] }}}/> -next {{$:/core/images/chevron-right}} -</$button> -</div> - -</$list> - -</div> \ No newline at end of file diff --git a/editions/prerelease/tiddlers/afc/TagNavigationStyles.tid b/editions/prerelease/tiddlers/afc/TagNavigationStyles.tid deleted file mode 100644 index edc19dbd4..000000000 --- a/editions/prerelease/tiddlers/afc/TagNavigationStyles.tid +++ /dev/null @@ -1,23 +0,0 @@ -title: $:/_AFC/TagNavigationStyles -tags: $:/tags/Stylesheet - -\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline - -.tc-tag-nav-wrapper { - clear: both; - display: flex; -} - -.tc-tag-nav-button-previous, -.tc-tag-nav-button-next { - cursor: pointer; - font-size: 2em; - border: none; - background: #ddf; - border-radius: 4px; - padding: 5px; -} - -.tc-tag-nav-button-middle { - flex: 1; -} diff --git a/editions/server/tiddlywiki.info b/editions/server/tiddlywiki.info new file mode 100644 index 000000000..a9a3ed3bd --- /dev/null +++ b/editions/server/tiddlywiki.info @@ -0,0 +1,21 @@ +{ + "description": "Basic client-server edition", + "plugins": [ + "tiddlywiki/tiddlyweb", + "tiddlywiki/filesystem", + "tiddlywiki/highlight" + ], + "themes": [ + "tiddlywiki/vanilla", + "tiddlywiki/snowwhite" + ], + "build": { + "index": [ + "--rendertiddler","$:/plugins/tiddlywiki/tiddlyweb/save/offline","index.html","text/plain"], + "static": [ + "--rendertiddler","$:/core/templates/static.template.html","static.html","text/plain", + "--rendertiddler","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", + "--rendertiddlers","[!is[system]]","$:/core/templates/static.tiddler.html","static","text/plain", + "--rendertiddler","$:/core/templates/static.template.css","static/static.css","text/plain"] + } +} \ No newline at end of file diff --git a/editions/share/tiddlywiki.info b/editions/share/tiddlywiki.info new file mode 100644 index 000000000..16a765868 --- /dev/null +++ b/editions/share/tiddlywiki.info @@ -0,0 +1,14 @@ +{ + "description": "Sharing tiddlers via URLs", + "plugins": [ + "tiddlywiki/share" + ], + "themes": [ + "tiddlywiki/vanilla", + "tiddlywiki/snowwhite" + ], + "build": { + "share": [ + "--rendertiddler","$:/core/save/all","share.html","text/plain"] + } +} \ No newline at end of file From 2c24f30cdd8a04b9eadcad69c86e0a8a49a54594 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 11 Jun 2020 11:30:11 +0100 Subject: [PATCH 0686/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.23.tid | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index e1c3108fa..3e91ae6b5 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20200509160320110 -modified: 20200509160320110 +created: 2020061111252696 +modified: 2020061111252696 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -17,12 +17,14 @@ type: text/vnd.tiddlywiki ! Plugin Improvements * JSZip Plugin -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser * Freelinks Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements * Twitter Plugin ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded +* [[Dynaview Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples ! Performance Improvements @@ -53,14 +55,24 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4584]] restored missing parameter to `saveTiddler()` method sync adaptors * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04]] MakeLibraryCommand to skip non-directories * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4601]] erroneous use of `$tw.wiki` +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4647]] ''class'' attribute of DroppableWidget +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac]] [[has Operator]] when used with the ''tags'' field +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4634]] high CPU usage with animated syncing icon introduced in v5.1.22 ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: * [[@Arlen22|https://github.com/Arlen22]] +* [[@bimlas|https://github.com/bimlas]] * [[@BramChen|https://github.com/BramChen]] * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@danielo515|https://github.com/danielo515]] +* [[@flibbles|https://github.com/flibbles]] +* [[@ibnishak|https://github.com/ibnishak]] * [[@idotobi|https://github.com/idotobi]] +* [[@Marxsal|https://github.com/Marxsal]] +* [[@mocsa|https://github.com/mocsa]] +* [[@NicolasPeton|https://github.com/NicolasPeton]] +* [[@passuf|https://github.com/passuf]] * [[@pmario|https://github.com/pmario]] From d32fb6f9007cb39dc4d747d404cf56d218eb2dfd Mon Sep 17 00:00:00 2001 From: Arlen22 <arlenbee@gmail.com> Date: Thu, 11 Jun 2020 06:36:41 -0400 Subject: [PATCH 0687/2376] Allow setting boot, wiki, and pathPrefix for each request (#4649) * Add pathPrefix to state, and options to request handler * use ternary operator instead of default empty object * Fix styling issues * Update server.js * Add boot to server and filesystem adapter --- core/modules/server/authenticators/basic.js | 2 +- core/modules/server/routes/get-file.js | 2 +- core/modules/server/server.js | 19 +++++++++++-------- .../filesystem/filesystemadaptor.js | 15 ++++++++------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/core/modules/server/authenticators/basic.js b/core/modules/server/authenticators/basic.js index 9db9b91ff..cd528c485 100644 --- a/core/modules/server/authenticators/basic.js +++ b/core/modules/server/authenticators/basic.js @@ -31,7 +31,7 @@ BasicAuthenticator.prototype.init = function() { // Read the credentials data this.credentialsFilepath = this.server.get("credentials"); if(this.credentialsFilepath) { - var resolveCredentialsFilepath = path.resolve($tw.boot.wikiPath,this.credentialsFilepath); + var resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath); if(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) { var credentialsText = fs.readFileSync(resolveCredentialsFilepath,"utf8"), credentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText); diff --git a/core/modules/server/routes/get-file.js b/core/modules/server/routes/get-file.js index 2a0ef647a..ac4b01d7e 100644 --- a/core/modules/server/routes/get-file.js +++ b/core/modules/server/routes/get-file.js @@ -21,7 +21,7 @@ exports.handler = function(request,response,state) { fs = require("fs"), util = require("util"), suppliedFilename = decodeURIComponent(state.params[0]), - filename = path.resolve($tw.boot.wikiPath,"files",suppliedFilename), + filename = path.resolve(state.boot.wikiPath,"files",suppliedFilename), extension = path.extname(filename); fs.readFile(filename,function(err,content) { var status,content,type = "text/plain"; diff --git a/core/modules/server/server.js b/core/modules/server/server.js index 7e3716751..6e37e603a 100644 --- a/core/modules/server/server.js +++ b/core/modules/server/server.js @@ -31,6 +31,7 @@ function Server(options) { this.routes = options.routes || []; this.authenticators = options.authenticators || []; this.wiki = options.wiki; + this.boot = options.boot || $tw.boot; this.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText("$:/SiteTitle") || "TiddlyWiki5"); // Initialise the variables this.variables = $tw.utils.extend({},this.defaultVariables); @@ -69,8 +70,8 @@ function Server(options) { tlsCertFilepath = this.get("tls-cert"); if(tlsCertFilepath && tlsKeyFilepath) { this.listenOptions = { - key: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsKeyFilepath),"utf8"), - cert: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsCertFilepath),"utf8") + key: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),"utf8"), + cert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),"utf8") }; this.protocol = "https"; } @@ -112,15 +113,14 @@ Server.prototype.addAuthenticator = function(AuthenticatorClass) { }; Server.prototype.findMatchingRoute = function(request,state) { - var pathprefix = this.get("path-prefix") || ""; for(var t=0; t<this.routes.length; t++) { var potentialRoute = this.routes[t], pathRegExp = potentialRoute.path, pathname = state.urlInfo.pathname, match; - if(pathprefix) { - if(pathname.substr(0,pathprefix.length) === pathprefix) { - pathname = pathname.substr(pathprefix.length) || "/"; + if(state.pathPrefix) { + if(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) { + pathname = pathname.substr(state.pathPrefix.length) || "/"; match = potentialRoute.path.exec(pathname); } else { match = false; @@ -156,14 +156,17 @@ Server.prototype.isAuthorized = function(authorizationType,username) { return principals.indexOf("(anon)") !== -1 || (username && (principals.indexOf("(authenticated)") !== -1 || principals.indexOf(username) !== -1)); } -Server.prototype.requestHandler = function(request,response) { +Server.prototype.requestHandler = function(request,response,options) { + options = options || {}; // Compose the state object var self = this; var state = {}; - state.wiki = self.wiki; + state.wiki = options.wiki || self.wiki; + state.boot = options.boot || self.boot; state.server = self; state.urlInfo = url.parse(request.url); state.queryParameters = querystring.parse(state.urlInfo.query); + state.pathPrefix = options.pathPrefix || this.get("path-prefix") || ""; // Get the principals authorized to access this resource var authorizationType = this.methodMappings[request.method] || "readers"; // Check for the CSRF header if this is a write diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index 9e0734814..84da6236e 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -19,9 +19,10 @@ var fs = $tw.node ? require("fs") : null, function FileSystemAdaptor(options) { var self = this; this.wiki = options.wiki; + this.boot = options.boot || $tw.boot; this.logger = new $tw.utils.Logger("filesystem",{colour: "blue"}); // Create the <wiki>/tiddlers folder if it doesn't exist - $tw.utils.createDirectory($tw.boot.wikiTiddlersPath); + $tw.utils.createDirectory(this.boot.wikiTiddlersPath); } FileSystemAdaptor.prototype.name = "filesystem"; @@ -43,22 +44,22 @@ Return a fileInfo object for a tiddler, creating it if necessary: type: the type of the tiddler file (NOT the type of the tiddler -- see below) hasMetaFile: true if the file also has a companion .meta file -The boot process populates $tw.boot.files for each of the tiddler files that it loads. The type is found by looking up the extension in $tw.config.fileExtensionInfo (eg "application/x-tiddler" for ".tid" files). +The boot process populates this.boot.files for each of the tiddler files that it loads. The type is found by looking up the extension in $tw.config.fileExtensionInfo (eg "application/x-tiddler" for ".tid" files). -It is the responsibility of the filesystem adaptor to update $tw.boot.files for new files that are created. +It is the responsibility of the filesystem adaptor to update this.boot.files for new files that are created. */ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { // See if we've already got information about this file var title = tiddler.fields.title, - fileInfo = $tw.boot.files[title]; + fileInfo = this.boot.files[title]; if(!fileInfo) { // Otherwise, we'll need to generate it fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ - directory: $tw.boot.wikiTiddlersPath, + directory: this.boot.wikiTiddlersPath, pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"), wiki: this.wiki }); - $tw.boot.files[title] = fileInfo; + this.boot.files[title] = fileInfo; } callback(null,fileInfo); }; @@ -91,7 +92,7 @@ Delete a tiddler and invoke the callback with (err) */ FileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) { var self = this, - fileInfo = $tw.boot.files[title]; + fileInfo = this.boot.files[title]; // Only delete the tiddler if we have writable information for the file if(fileInfo) { // Delete the file From 042c8d8a69af3f28681534c4e6072cf09e4348b2 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Thu, 11 Jun 2020 18:39:57 +0800 Subject: [PATCH 0688/2376] Update chinese help texts for `rendertiddlers` command (#4657) --- languages/zh-Hans/Help/rendertiddlers.tid | 4 ++-- languages/zh-Hant/Help/rendertiddlers.tid | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/languages/zh-Hans/Help/rendertiddlers.tid b/languages/zh-Hans/Help/rendertiddlers.tid index 8bb3b43ad..1e6359666 100644 --- a/languages/zh-Hans/Help/rendertiddlers.tid +++ b/languages/zh-Hans/Help/rendertiddlers.tid @@ -6,13 +6,13 @@ description: 呈现符合筛选条件的条目为指定的内容类型 呈现符合筛选条的条目为指定的[[内容类型|ContentType]] (默认为 `text/html`) 与扩展名 (默认为 `.html`). ``` ---rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] ["noclean"] +--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] ["noclean"] ``` 例如: ``` ---rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain +--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain ``` 默认情况下,路径名被解析为相对于版本文件夹的 `output` 子文件夹。 `--output` 命令可以用于将输出指定到一个不同的文件。 diff --git a/languages/zh-Hant/Help/rendertiddlers.tid b/languages/zh-Hant/Help/rendertiddlers.tid index 830085d02..af80dad19 100644 --- a/languages/zh-Hant/Help/rendertiddlers.tid +++ b/languages/zh-Hant/Help/rendertiddlers.tid @@ -6,13 +6,13 @@ description: 呈現符合篩選條件的條目為指定的內容類型 呈現符合篩選條的條目為指定的[[內容類型|ContentType]] (預設為 `text/html`) 與副檔名 (預設為 `.html`). ``` ---rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] ["noclean"] +--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] ["noclean"] ``` 例如: ``` ---rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain +--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain ``` 預設情況下,路徑名被解析為相對於發行版資料夾的 `output` 子資料夾。 `--output` 命令可以用於將輸出指定到一個不同的資料夾。 From e59f606566fd9e06430a01b9d5aaa96c09a8c3f0 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 12:41:35 +0200 Subject: [PATCH 0689/2376] Cancel popups when clicking within an editor (#4658) * Add cancelPopups attribute to edit widget * Add cancelPopups attribute to factory.js * Cancel popups in editor/simple.js * Cancel popups on focus in engines/framed.js * Cancel popups on focus in CodeMirror engine * Add cancelPopups="yes" to tag-picker * Add cancelPopups="yes" to sidebar search * Add cancelPopups="yes" to editor * Add cancelPopups="yes" to fields EditTemplate * Update body.tid * Add cancelPopups="yes" to title EditTemplate * Add cancelPopups="yes" to type EditTemplate * Update EditTextWidget.tid * Update EditWidget.tid * Add cancelPopups="yes" to menubar plugin search * Update tag-picker.tid * Update tags.tid --- core/modules/editor/engines/framed.js | 12 +++++++++++- core/modules/editor/engines/simple.js | 3 +++ core/modules/editor/factory.js | 3 ++- core/modules/widgets/edit.js | 6 ++++-- core/ui/EditTemplate/body-editor.tid | 1 + core/ui/EditTemplate/body.tid | 2 +- core/ui/EditTemplate/fields.tid | 6 +++--- core/ui/EditTemplate/tags.tid | 4 ++-- core/ui/EditTemplate/title.tid | 2 +- core/ui/EditTemplate/type.tid | 2 +- core/ui/SideBarSegments/search.tid | 2 +- core/wiki/macros/tag-picker.tid | 2 +- editions/tw5.com/tiddlers/widgets/EditTextWidget.tid | 1 + editions/tw5.com/tiddlers/widgets/EditWidget.tid | 1 + plugins/tiddlywiki/codemirror/engine.js | 5 +++++ plugins/tiddlywiki/menubar/items/search.tid | 2 +- 16 files changed, 39 insertions(+), 15 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 6e7da24da..bdb83fe8a 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -80,7 +80,8 @@ function FramedEngine(options) { $tw.utils.addEventListeners(this.domNode,[ {name: "click",handlerObject: this,handlerMethod: "handleClickEvent"}, {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, - {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"} + {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"}, + {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"}, ]); // Insert the element into the DOM this.iframeDoc.body.appendChild(this.domNode); @@ -153,6 +154,15 @@ FramedEngine.prototype.focus = function() { } }; +/* +Handle a focus event +*/ +FramedEngine.prototype.handleFocusEvent = function(event) { + if(this.widget.editCancelPopups) { + $tw.popup.cancel(0); + } +}; + /* Handle a click */ diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index bb77893d7..39f1163f6 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -122,6 +122,9 @@ SimpleEngine.prototype.handleInputEvent = function(event) { Handle a dom "focus" event */ SimpleEngine.prototype.handleFocusEvent = function(event) { + if(this.widget.editCancelPopups) { + $tw.popup.cancel(0); + } if(this.widget.editFocusPopup) { $tw.popup.triggerPopup({ domNode: this.domNode, diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index 8dfc88037..98fa599bb 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -177,6 +177,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { this.editFocusPopup = this.getAttribute("focusPopup"); this.editFocus = this.getAttribute("focus"); this.editTabIndex = this.getAttribute("tabindex"); + this.editCancelPopups = this.getAttribute("cancelPopups","") === "yes"; // Get the default editor element tag and type var tag,type; if(this.editField === "text") { @@ -208,7 +209,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { EditTextWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Completely rerender if any of our attributes have changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) { this.refreshSelf(); return true; } else if(changedTiddlers[this.editTitle]) { diff --git a/core/modules/widgets/edit.js b/core/modules/widgets/edit.js index 92ac0e1be..9492952a5 100644 --- a/core/modules/widgets/edit.js +++ b/core/modules/widgets/edit.js @@ -48,6 +48,7 @@ EditWidget.prototype.execute = function() { this.editPlaceholder = this.getAttribute("placeholder"); this.editTabIndex = this.getAttribute("tabindex"); this.editFocus = this.getAttribute("focus",""); + this.editCancelPopups = this.getAttribute("cancelPopups",""); // Choose the appropriate edit widget this.editorType = this.getEditorType(); // Make the child widgets @@ -60,7 +61,8 @@ EditWidget.prototype.execute = function() { "class": {type: "string", value: this.editClass}, "placeholder": {type: "string", value: this.editPlaceholder}, "tabindex": {type: "string", value: this.editTabIndex}, - "focus": {type: "string", value: this.editFocus} + "focus": {type: "string", value: this.editFocus}, + "cancelPopups": {type: "string", value: this.editCancelPopups} }, children: this.parseTreeNode.children }]); @@ -94,7 +96,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of EditWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Refresh if an attribute has changed, or the type associated with the target tiddler has changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) { this.refreshSelf(); return true; } else { diff --git a/core/ui/EditTemplate/body-editor.tid b/core/ui/EditTemplate/body-editor.tid index fe2a034c6..f7e8a3acf 100644 --- a/core/ui/EditTemplate/body-editor.tid +++ b/core/ui/EditTemplate/body-editor.tid @@ -7,6 +7,7 @@ title: $:/core/ui/EditTemplate/body/editor placeholder={{$:/language/EditTemplate/Body/Placeholder}} tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}} + cancelPopups="yes" ><$set diff --git a/core/ui/EditTemplate/body.tid b/core/ui/EditTemplate/body.tid index 50a8f7f88..8369c82e8 100644 --- a/core/ui/EditTemplate/body.tid +++ b/core/ui/EditTemplate/body.tid @@ -13,7 +13,7 @@ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$ <a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a> -<$edit-text field="_canonical_uri" class="tc-edit-fields" tabindex={{$:/config/EditTabIndex}}></$edit-text> +<$edit-text field="_canonical_uri" class="tc-edit-fields" tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"></$edit-text> </div> diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 15132f585..47f582112 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -51,7 +51,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <td class="tc-edit-field-name"> <$text text=<<currentField>>/>:</td> <td class="tc-edit-field-value"> -<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/> +<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"/> </td> <td class="tc-edit-field-remove"> <$button class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}> @@ -72,7 +72,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <<lingo Fields/Add/Prompt>>   </em> <span class="tc-edit-field-add-name"> -<$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/> +<$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes"/> </span>  <$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> @@ -104,7 +104,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <span class="tc-edit-field-add-value"> <$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}> <$keyboard key="((add-field))" actions=<<new-field-actions>>> -<$edit-text tiddler=<<newFieldValueTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}}/> +<$edit-text tiddler=<<newFieldValueTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"/> </$keyboard> </$set> </span>  diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index 8ab36bf0d..15d95d705 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -30,8 +30,8 @@ color:$(foregroundColor)$; <$list filter="[all[current]tags[]sort[title]]" storyview="pop"> <$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/> </$list> -<$set name="tabIndex" value={{$:/config/EditTabIndex}}> +<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups="yes"> <$macrocall $name="tag-picker"/> -</$set> +</$vars> </$fieldmangler> </div> diff --git a/core/ui/EditTemplate/title.tid b/core/ui/EditTemplate/title.tid index 0f3632ad1..8972504d2 100644 --- a/core/ui/EditTemplate/title.tid +++ b/core/ui/EditTemplate/title.tid @@ -1,7 +1,7 @@ title: $:/core/ui/EditTemplate/title tags: $:/tags/EditTemplate -<$edit-text field="draft.title" class="tc-titlebar tc-edit-texteditor" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}}/> +<$edit-text field="draft.title" class="tc-titlebar tc-edit-texteditor" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"/> <$vars pattern="""[\|\[\]{}]""" bad-chars="""`| [ ] { }`"""> diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index ec7ea499d..f9068fa8a 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -4,7 +4,7 @@ tags: $:/tags/EditTemplate \define lingo-base() $:/language/EditTemplate/ \whitespace trim <div class="tc-type-selector"><$fieldmangler> -<em class="tc-edit"><<lingo Type/Prompt>></em>  <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> +<em class="tc-edit"><<lingo Type/Prompt>></em>  <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes"/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> </$fieldmangler></div> <div class="tc-block-dropdown-wrapper"> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index f0ab71a98..9121d5ace 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -6,7 +6,7 @@ tags: $:/tags/SideBarSegment <$set name="searchTiddler" value="$:/temp/search"> <div class="tc-search"> -<$edit-text tiddler="$:/temp/search" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> class="tc-popup-handle"/> +<$edit-text tiddler="$:/temp/search" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> class="tc-popup-handle" cancelPopups="yes"/> <$reveal state="$:/temp/search" type="nomatch" text=""> <$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="tc-btn-invisible"> <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search}}/> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 5358da52a..22f9c22bf 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -19,7 +19,7 @@ tags: $:/tags/Macro <div class="tc-edit-add-tag"> <span class="tc-add-tag-name"> <$keyboard key="ENTER" actions=<<add-tag-actions>>> -<$edit-text tiddler=<<newTagNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/> +<$edit-text tiddler=<<newTagNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} cancelPopups=<<cancelPopups>>/> </$keyboard> </span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> diff --git a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid index c1884f1b3..7b6dc80a7 100644 --- a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid @@ -31,6 +31,7 @@ The content of the `<$edit-text>` widget is ignored. |autoHeight |Either "yes" or "no" to specify whether to automatically resize `textarea` editors to fit their content (defaults to "yes") | |minHeight |Minimum height for automatically resized `textarea` editors, specified in CSS length units such as "px", "em" or "%" | |rows|Sets the rows attribute of a generated textarea | +|cancelPopups |<<.from-version "5.1.23">> if set to "yes", cancels all popups when the input gets focus | ! Notes diff --git a/editions/tw5.com/tiddlers/widgets/EditWidget.tid b/editions/tw5.com/tiddlers/widgets/EditWidget.tid index 04db79002..34250d002 100644 --- a/editions/tw5.com/tiddlers/widgets/EditWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditWidget.tid @@ -18,3 +18,4 @@ The content of the `<$edit>` widget is ignored. |index |The index to edit | |class |A CSS class to be added the generated editing widget | |tabindex |Sets the `tabindex` attribute of the input or textarea to the given value | +|cancelPopups |<<.from-version "5.1.23">> if set to "yes", cancels all popups when the input gets focus | diff --git a/plugins/tiddlywiki/codemirror/engine.js b/plugins/tiddlywiki/codemirror/engine.js index 630482d7d..fe64c1ef5 100755 --- a/plugins/tiddlywiki/codemirror/engine.js +++ b/plugins/tiddlywiki/codemirror/engine.js @@ -128,6 +128,11 @@ function CodeMirrorEngine(options) { this.cm.on("keydown",function(cm,event) { return self.widget.handleKeydownEvent.call(self.widget,event); }); + this.cm.on("focus",function(cm,event) { + if(self.widget.editCancelPopups) { + $tw.popup.cancel(0); + } + }); } /* diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid index edbf773ee..64c45afc4 100644 --- a/plugins/tiddlywiki/menubar/items/search.tid +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -8,7 +8,7 @@ tags: $:/tags/MenuBar <span style="margin: 0 0.5em;"> -<$edit-text tiddler=<<searchTiddler>> tag="input" type="search" focusPopup="$:/state/popup/menubar-search-dropdown" class="tc-popup-handle tc-menu-show-when-wide" placeholder="Search..." default=""/> +<$edit-text tiddler=<<searchTiddler>> tag="input" type="search" focusPopup="$:/state/popup/menubar-search-dropdown" class="tc-popup-handle tc-menu-show-when-wide" placeholder="Search..." default="" cancelPopups="yes"/> </span> From cbff2fb6921ef3873d5d903067bf9164af2adb54 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 12:45:47 +0200 Subject: [PATCH 0690/2376] Fix e.toggleComment being undefined in CM sublime keymap (#4662) * Create comment.js * Update tiddlywiki.files --- .../files/addons/comment/comment.js | 4 ++++ .../codemirror-keymap-sublime-text/files/tiddlywiki.files | 7 +++++++ 2 files changed, 11 insertions(+) create mode 100644 plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js diff --git a/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js new file mode 100644 index 000000000..57775035f --- /dev/null +++ b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js @@ -0,0 +1,4 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";var y={},E=/[^\s\u00a0]/,M=e.Pos;function s(e){var n=e.search(E);return-1==n?0:n}function S(e,n){var t=e.getMode();return!1!==t.useInnerComments&&t.innerMode?e.getModeAt(n):t}e.commands.toggleComment=function(e){e.toggleComment()},e.defineExtension("toggleComment",function(e){e=e||y;for(var n=this,t=1/0,i=this.listSelections(),l=null,o=i.length-1;0<=o;o--){var r=i[o].from(),m=i[o].to();r.line>=t||(m.line>=t&&(m=M(t,0)),t=r.line,null==l?l=n.uncomment(r,m,e)?"un":(n.lineComment(r,m,e),"line"):"un"==l?n.uncomment(r,m,e):n.lineComment(r,m,e))}}),e.defineExtension("lineComment",function(o,e,r){r=r||y;var n,t,m,a,c,g,f=this,i=S(f,o),l=f.getLine(o.line);null!=l&&(n=o,t=l,!/\bstring\b/.test(f.getTokenTypeAt(M(n.line,0)))||/^[\'\"\`]/.test(t))&&((m=r.lineComment||i.lineComment)?(a=Math.min(0!=e.ch||e.line==o.line?e.line+1:e.line,f.lastLine()+1),c=null==r.padding?" ":r.padding,g=r.commentBlankLines||o.line==e.line,f.operation(function(){if(r.indent){for(var e=null,n=o.line;n<a;++n){var t=(i=f.getLine(n)).slice(0,s(i));(null==e||e.length>t.length)&&(e=t)}for(n=o.line;n<a;++n){var i=f.getLine(n),l=e.length;(g||E.test(i))&&(i.slice(0,l)!=e&&(l=s(i)),f.replaceRange(e+m+c,M(n,0),M(n,l)))}}else for(n=o.line;n<a;++n)(g||E.test(f.getLine(n)))&&f.replaceRange(m+c,M(n,0))})):(r.blockCommentStart||i.blockCommentStart)&&(r.fullLines=!0,f.blockComment(o,e,r)))}),e.defineExtension("blockComment",function(i,l,o){o=o||y;var r,m,a=this,c=S(a,i),g=o.blockCommentStart||c.blockCommentStart,f=o.blockCommentEnd||c.blockCommentEnd;g&&f?/\bcomment\b/.test(a.getTokenTypeAt(M(i.line,0)))||((r=Math.min(l.line,a.lastLine()))!=i.line&&0==l.ch&&E.test(a.getLine(r))&&--r,m=null==o.padding?" ":o.padding,i.line>r||a.operation(function(){if(0!=o.fullLines){var e=E.test(a.getLine(r));a.replaceRange(m+f,M(r)),a.replaceRange(g+m,M(i.line,0));var n=o.blockCommentLead||c.blockCommentLead;if(null!=n)for(var t=i.line+1;t<=r;++t)t==r&&!e||a.replaceRange(n+m,M(t,0))}else a.replaceRange(f,l),a.replaceRange(g,i)})):(o.lineComment||c.lineComment)&&0!=o.fullLines&&a.lineComment(i,l,o)}),e.defineExtension("uncomment",function(e,n,t){t=t||y;var l,o=this,i=S(o,e),r=Math.min(0!=n.ch||n.line==e.line?n.line:n.line-1,o.lastLine()),m=Math.min(e.line,r),a=t.lineComment||i.lineComment,c=[],g=null==t.padding?" ":t.padding;e:if(a){for(var f=m;f<=r;++f){var s=o.getLine(f),d=s.indexOf(a);if(-1<d&&!/comment/.test(o.getTokenTypeAt(M(f,d+1)))&&(d=-1),-1==d&&E.test(s))break e;if(-1<d&&E.test(s.slice(0,d)))break e;c.push(s)}if(o.operation(function(){for(var e=m;e<=r;++e){var n=c[e-m],t=n.indexOf(a),i=t+a.length;t<0||(n.slice(i,i+g.length)==g&&(i+=g.length),l=!0,o.replaceRange("",M(e,t),M(e,i)))}}),l)return!0}var u=t.blockCommentStart||i.blockCommentStart,h=t.blockCommentEnd||i.blockCommentEnd;if(!u||!h)return!1;var p=t.blockCommentLead||i.blockCommentLead,C=o.getLine(m),b=C.indexOf(u);if(-1==b)return!1;var v=r==m?C:o.getLine(r),k=v.indexOf(h,r==m?b+u.length:0),L=M(m,b+1),x=M(r,k+1);if(-1==k||!/comment/.test(o.getTokenTypeAt(L))||!/comment/.test(o.getTokenTypeAt(x))||-1<o.getRange(L,x,"\n").indexOf(h))return!1;var R=-1==(T=C.lastIndexOf(u,e.ch))?-1:C.slice(0,e.ch).indexOf(h,T+u.length);if(-1!=T&&-1!=R&&R+h.length!=e.ch)return!1;R=v.indexOf(h,n.ch);var O=v.slice(n.ch).lastIndexOf(u,R-n.ch),T=-1==R||-1==O?-1:n.ch+O;return(-1==R||-1==T||T==n.ch)&&(o.operation(function(){o.replaceRange("",M(r,k-(g&&v.slice(k-g.length,k)==g?g.length:0)),M(r,k+h.length));var e=b+u.length;if(g&&C.slice(e,e+g.length)==g&&(e+=g.length),o.replaceRange("",M(m,b),M(m,e)),p)for(var n=m+1;n<=r;++n){var t,i=o.getLine(n),l=i.indexOf(p);-1==l||E.test(i.slice(0,l))||(t=l+p.length,g&&i.slice(t,t+g.length)==g&&(t+=g.length),o.replaceRange("",M(n,l),M(n,t)))}}),!0)})}); diff --git a/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/tiddlywiki.files b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/tiddlywiki.files index 236899789..f4fbc1c74 100755 --- a/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/tiddlywiki.files +++ b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/tiddlywiki.files @@ -7,6 +7,13 @@ "title": "$:/plugins/tiddlywiki/codemirror/keymap/sublime.js", "module-type": "codemirror" } + },{ + "file": "addons/comment/comment.js", + "fields": { + "type": "application/javascript", + "title": "$:/plugins/tiddlywiki/codemirror/addons/comment/comment.js", + "module-type": "codemirror" + } } ] } From ceb24117945157b0b1049fe1d47348e4e621005e Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Thu, 11 Jun 2020 12:46:22 +0200 Subject: [PATCH 0691/2376] Update How to apply custom styles.tid (#4663) --- editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid b/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid index 9d9c2bc29..7e9053d0f 100644 --- a/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid +++ b/editions/tw5.com/tiddlers/howtos/How to apply custom styles.tid @@ -5,6 +5,6 @@ tags: [[Customise TiddlyWiki]] title: How to apply custom styles type: text/vnd.tiddlywiki -At the moment there are several ways to apply custom styles. +There are several ways to apply custom styles. <<list-links filter:"[tag[How to apply custom styles]]">> From d42b7f173bc16dd2565522b13e72c3c94ff33f2b Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Thu, 11 Jun 2020 12:46:51 +0200 Subject: [PATCH 0692/2376] Update TiddlyWiki in the Sky for TiddlyWeb (#4667) remove refs to TiddlySpace --- .../platforms/TiddlyWiki in the Sky for TiddlyWeb.tid | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/editions/tw5.com/tiddlers/platforms/TiddlyWiki in the Sky for TiddlyWeb.tid b/editions/tw5.com/tiddlers/platforms/TiddlyWiki in the Sky for TiddlyWeb.tid index 44e7a9fc3..5113aaa1c 100644 --- a/editions/tw5.com/tiddlers/platforms/TiddlyWiki in the Sky for TiddlyWeb.tid +++ b/editions/tw5.com/tiddlers/platforms/TiddlyWiki in the Sky for TiddlyWeb.tid @@ -4,16 +4,9 @@ tags: [[Hosting your TiddlyWiki on the web]] Platforms title: TiddlyWiki in the Sky for TiddlyWeb type: text/vnd.tiddlywiki -TiddlyWiki in the Sky for TiddlyWeb allows content to be synchronised between TiddlyWiki running in the browser and a TiddlyWeb (or TiddlySpace) server. Features include: +TiddlyWiki in the Sky for TiddlyWeb allows content to be synchronised between TiddlyWiki running in the browser and a TiddlyWeb server. Features include: * Lazy loading * Two way synchronisation between the browser and the server ** Synchronising from the server is accomplished by polling (currently every 60 seconds) * Throttling so that rapidly changing tiddlers don't overwhelm the server - -To try out TiddlyWiki in the Sky for TiddlyWeb: - -# If necessary, create an account at http://tiddlyspace.com/ -# Create a new space, eg `<myspace>` -# Include the space `tw5tiddlyweb` -# Visit `http://<myspace>.tiddlyspace.com/tw5` From d31d4621a46f9a9c4212e0893a5c57eb644179da Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 11 Jun 2020 12:48:55 +0200 Subject: [PATCH 0693/2376] Incorrect modified field glitches timeline macro (#4676) --- .../tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid index 577cdb016..eff87add7 100644 --- a/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/Using TiddlyWiki on Node.js.tid @@ -1,5 +1,5 @@ created: 20131219100520659 -modified: $tw.loadPluginFolder(name.substring(1)); +modified: 20200523092939199 tags: [[TiddlyWiki on Node.js]] title: Using TiddlyWiki on Node.js type: text/vnd.tiddlywiki From 5b9dbf7b9500f188ba865687bc8797e285c722a6 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 12:49:32 +0200 Subject: [PATCH 0694/2376] Use srcWindow in scrollable widget (#4677) --- core/modules/widgets/scrollable.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/scrollable.js b/core/modules/widgets/scrollable.js index cee4f03ce..ca63db52d 100644 --- a/core/modules/widgets/scrollable.js +++ b/core/modules/widgets/scrollable.js @@ -68,7 +68,8 @@ Scroll an element into view ScrollableWidget.prototype.scrollIntoView = function(element) { var duration = $tw.utils.getAnimationDuration(); this.cancelScroll(); - this.startTime = Date.now(); + this.startTime = Date.now(), + srcWindow = element ? element.ownerDocument.defaultView : window; var scrollPosition = { x: this.outerDomNode.scrollLeft, y: this.outerDomNode.scrollTop @@ -122,7 +123,7 @@ ScrollableWidget.prototype.scrollIntoView = function(element) { self.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t; self.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t; if(t < 1) { - self.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame); + self.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame); } }; drawFrame(); From b0485eef6a5ffd160e9e2a3fb166d261faaf5319 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 11 Jun 2020 07:03:16 -0400 Subject: [PATCH 0695/2376] Corrected incorrect image source for markdown (#4680) --- plugins/tiddlywiki/markdown/wrapper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/markdown/wrapper.js b/plugins/tiddlywiki/markdown/wrapper.js index 9cdd8a74b..d622eec5b 100755 --- a/plugins/tiddlywiki/markdown/wrapper.js +++ b/plugins/tiddlywiki/markdown/wrapper.js @@ -144,7 +144,7 @@ function convertNodes(remarkableTree, isStartOfInline) { type: "image", attributes: { tooltip: { type: "string", value: currentNode.alt }, - source: { type: "string", value: currentNode.src } + source: { type: "string", value: decodeURIComponent(currentNode.src) } } }); } else if (currentNode.type === "softbreak") { From a947a6b6bc7fcde1d096510da6e09dad473abb90 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 13:06:49 +0200 Subject: [PATCH 0696/2376] Fix hover colors of tag dropdown entries in sidebar (#4682) --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 49a240b08..d4091e3d7 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -346,6 +346,10 @@ a.tc-tiddlylink-external:hover { background-color: <<colour external-link-background-hover>>; } +.tc-drop-down a.tc-tiddlylink:hover { + color: <<colour tiddler-link-background>>; +} + /* ** Drag and drop styles */ From 84cd761c8c1e33b0f7786f64641001d10cf73ae9 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 13:07:23 +0200 Subject: [PATCH 0697/2376] Fix alignment of tag-pill icons (#4683) --- themes/tiddlywiki/vanilla/base.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index d4091e3d7..4a1d3a1c8 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -693,7 +693,7 @@ button.tc-untagged-label { width: 1em; margin-right: 3px; margin-bottom: 1px; - vertical-align: text-bottom; + vertical-align: bottom; } .tc-edit-tags button.tc-remove-tag-button svg { From e01b354f7d9e137cb355f7090f5e68661a4ead41 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 11 Jun 2020 07:09:10 -0400 Subject: [PATCH 0698/2376] Corrected issue with markdowns softbreaks AND whitespace between md markup (#4684) * Corrected issue with markdowns softbreaks It wasn't respecting the $:/config/markdown/breaks setting. It was effectively always "true". Also, no more errors when encountering hardbreaks. * Corrected introduced md bug Made it so after each md type, accumulated text may be flushed. * Changed convertNodes to use switch statement It's faster, less text, easier to read, and now debuggers don't play duck-duck-goose with every if-else block. * whitespace text is no longer forgotten * Fixed issue with text after md pattern and \n --- plugins/tiddlywiki/markdown/wrapper.js | 116 ++++++++++++++++++------- 1 file changed, 87 insertions(+), 29 deletions(-) diff --git a/plugins/tiddlywiki/markdown/wrapper.js b/plugins/tiddlywiki/markdown/wrapper.js index d622eec5b..270c6bf6e 100755 --- a/plugins/tiddlywiki/markdown/wrapper.js +++ b/plugins/tiddlywiki/markdown/wrapper.js @@ -32,6 +32,10 @@ var remarkableOpts = { quotes: $tw.wiki.getTiddlerText("$:/config/markdown/quotes"), typographer: parseAsBoolean("$:/config/markdown/typographer") }; +var accumulatingTypes = { + "text": true, + "softbreak": true +}; var md = new Remarkable(remarkableOpts); @@ -64,7 +68,7 @@ function findTagWithType(nodes, startPoint, type, level) { */ function convertNodes(remarkableTree, isStartOfInline) { let out = []; - + var accumulatedText = ''; function wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) { var j = findTagWithType(nodes, currentIndex + 1, closingType, currentLevel); if (j === false) { @@ -84,17 +88,28 @@ function convertNodes(remarkableTree, isStartOfInline) { for (var i = 0; i < remarkableTree.length; i++) { var currentNode = remarkableTree[i]; - if (currentNode.type === "paragraph_open") { + switch (currentNode.type) { + case "paragraph_open": i = wrappedElement("p", i, currentNode.level, "paragraph_close", remarkableTree); - } else if (currentNode.type === "heading_open") { + break; + + case "heading_open": i = wrappedElement("h" + currentNode.hLevel, i, currentNode.level, "heading_close", remarkableTree); - } else if (currentNode.type === "bullet_list_open") { + break; + + case "bullet_list_open": i = wrappedElement("ul", i, currentNode.level, "bullet_list_close", remarkableTree); - } else if (currentNode.type == 'ordered_list_open') { + break; + + case "ordered_list_open": i = wrappedElement('ol', i, currentNode.level,'ordered_list_close', remarkableTree); - } else if (currentNode.type === "list_item_open") { + break; + + case "list_item_open": i = wrappedElement("li", i, currentNode.level, "list_item_close", remarkableTree); - } else if (currentNode.type === "link_open") { + break; + + case "link_open": var j = findTagWithType(remarkableTree, i + 1, "link_close", currentNode.level); if (currentNode.href[0] !== "#") { @@ -122,16 +137,17 @@ function convertNodes(remarkableTree, isStartOfInline) { }); } i = j; - } else if (currentNode.type.substr(currentNode.type.length - 5) === "_open") { - var tagName = currentNode.type.substr(0, currentNode.type.length - 5); - i = wrappedElement(tagName, i, currentNode.level, tagName + "_close", remarkableTree); - } else if (currentNode.type === "code") { + break; + + case "code": out.push({ type: "element", tag: currentNode.block ? "pre" : "code", children: [{ type: "text", text: currentNode.content }] }); - } else if (currentNode.type === "fence") { + break; + + case "fence": out.push({ type: "codeblock", attributes: { @@ -139,7 +155,9 @@ function convertNodes(remarkableTree, isStartOfInline) { code: { type: "string", value: currentNode.content } } }); - } else if (currentNode.type === "image") { + break; + + case "image": out.push({ type: "image", attributes: { @@ -147,32 +165,77 @@ function convertNodes(remarkableTree, isStartOfInline) { source: { type: "string", value: decodeURIComponent(currentNode.src) } } }); - } else if (currentNode.type === "softbreak") { + break; + + case "softbreak": + if (remarkableOpts.breaks) { + out.push({ + type: "element", + tag: "br", + }); + } else { + accumulatedText = accumulatedText + '\n'; + } + break; + + case "hardbreak": out.push({ type: "element", tag: "br", }); - } else if (currentNode.type == 'hr') { + break; + + case "hr": out.push({ type: 'element', tag: 'hr', }); - } else if (currentNode.type === "inline") { + break; + + case "inline": out = out.concat(convertNodes(currentNode.children, true)); - } else if (currentNode.type === "text") { - if (!pluginOpts.renderWikiText) { + break; + + case "text": + // We need to merge this text block with the upcoming text block and parse it all together. + accumulatedText = accumulatedText + currentNode.content; + break; + + default: + if (currentNode.type.substr(currentNode.type.length - 5) === "_open") { + var tagName = currentNode.type.substr(0, currentNode.type.length - 5); + i = wrappedElement(tagName, i, currentNode.level, tagName + "_close", remarkableTree); + } else { + console.error("Unknown node type: " + currentNode.type, currentNode); out.push({ type: "text", text: currentNode.content }); + } + break; + } + // We test to see if we process the block now, or if there's + // more to accumulate first. + if (accumulatedText + && ( + remarkableOpts.breaks || + (i+1) >= remarkableTree.length || + !accumulatingTypes[remarkableTree[i+1].type] + ) + ) { + // The Markdown compiler thinks this is just text. + // Hand off to the WikiText parser to see if there's more to render + // But only if it's configured to, and we have more than whitespace + if (!pluginOpts.renderWikiText || accumulatedText.match(/^\s*$/)) { + out.push({ + type: "text", + text: accumulatedText + }); } else { - // The Markdown compiler thinks this is just text. - // Hand off to the WikiText parser to see if there's more to render - // If we're inside a block element (div, p, td, h1), and this is the first child in the tree, // handle as a block-level parse. Otherwise not. var parseAsInline = !(isStartOfInline && i === 0); - var textToParse = currentNode.content; + var textToParse = accumulatedText; if (pluginOpts.renderWikiTextPragma !== "") { textToParse = pluginOpts.renderWikiTextPragma + "\n" + textToParse; } @@ -195,18 +258,13 @@ function convertNodes(remarkableTree, isStartOfInline) { // If the original text element started with a space, add it back in if (rs.length > 0 && rs[0].type === "text" - && currentNode.content[0] === " " + && (accumulatedText[0] === " " || accumulatedText[0] === "\n") ) { rs[0].text = " " + rs[0].text; } out = out.concat(rs); } - } else { - console.error("Unknown node type: " + currentNode.type, currentNode); - out.push({ - type: "text", - text: currentNode.content - }); + accumulatedText = ''; } } return out; From 1f1fd49d0be3fa98f16c308cdc297733e664c88f Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Thu, 11 Jun 2020 13:11:12 +0200 Subject: [PATCH 0699/2376] Update LinkWidget.tid (#4690) add image link --- editions/tw5.com/tiddlers/widgets/LinkWidget.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/editions/tw5.com/tiddlers/widgets/LinkWidget.tid b/editions/tw5.com/tiddlers/widgets/LinkWidget.tid index e7dfef3de..26e78c422 100644 --- a/editions/tw5.com/tiddlers/widgets/LinkWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/LinkWidget.tid @@ -33,6 +33,8 @@ This means that you can control the text of a link tooltip in several ways: ``` <$link to="HelloThere" tooltip="Custom tooltip">Link 1</$link> +<$link to="HelloThere" tooltip="Another tooltip">{{$:/core/icon}}</$link> + <$set name="tv-wikilink-tooltip" value="I'm a link to {{!!title}}"> <$link to="HelloThere">Link 2</$link> </$set> @@ -43,6 +45,8 @@ Renders as: <$link to="HelloThere" tooltip="Custom tooltip">Link 1</$link> +<$link to="HelloThere" tooltip="Another tooltip">{{$:/core/icon}}</$link> + <$set name="tv-wikilink-tooltip" value="I'm a link to {{!!title}}"> <$link to="HelloThere">Link 2</$link> </$set> From e3ad276dd01e25ab9861c0084ebcf7a3069f23d6 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Thu, 11 Jun 2020 13:11:26 +0200 Subject: [PATCH 0700/2376] Update Images in WikiText.tid (#4691) --- .../tw5.com/tiddlers/wikitext/Images in WikiText.tid | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid index 005e90670..74d25de91 100644 --- a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid @@ -51,6 +51,15 @@ Renders as: {{Motovun Jack.jpg}} +! Images as Links +``` +<$link to="HelloThere" tooltip="Custom tooltip">{{$:/core/icon}}</$link> +``` + +Renders as: + +<$link to="HelloThere" tooltip="Custom tooltip">{{$:/core/icon}}</$link> + ! Importing Images Use the <<.button import>> button (under the <<.sidebar-tab Tools>> tab in the sidebar), or drag and drop. From 25f8b3f9038cc39ff7d13a7cd377814b05b9d4b4 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 11 Jun 2020 13:11:56 +0200 Subject: [PATCH 0701/2376] Check for DOM node existence before removing class. (#4696) Can cause issues if dragstart and dragend actions trigger a refresh. --- core/modules/widgets/droppable.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/droppable.js b/core/modules/widgets/droppable.js index 066e88cef..45f11bf68 100644 --- a/core/modules/widgets/droppable.js +++ b/core/modules/widgets/droppable.js @@ -75,7 +75,9 @@ DroppableWidget.prototype.leaveDrag = function(event) { // Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone if(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) { this.currentlyEntered = []; - $tw.utils.removeClass(this.domNodes[0],"tc-dragover"); + if(this.domNodes[0]) { + $tw.utils.removeClass(this.domNodes[0],"tc-dragover"); + } } }; From b191ee92107bb4c47b95cc492acd717264e3d912 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 13:12:45 +0200 Subject: [PATCH 0702/2376] Fix #4673 - Adding tags in $:/Manager does not work (#4674) * Add fieldmangler to Manager Tags-Sidebar This makes the tm-add-tag messages in the tag-picker work * Add actions parameter back to tag-picker macro * Add div so that tag-dropdown shows below input field * Add missing tc-btn-dropdown class to dropdown button ... ... for consistency with dropdown buttons in EditTemplate * Update tag-picker.tid --- core/ui/Manager/ItemSidebarTags.tid | 7 ++----- core/wiki/macros/tag-picker.tid | 32 +++++++++++++++++------------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/core/ui/Manager/ItemSidebarTags.tid b/core/ui/Manager/ItemSidebarTags.tid index 6a63345c6..af7572bca 100644 --- a/core/ui/Manager/ItemSidebarTags.tid +++ b/core/ui/Manager/ItemSidebarTags.tid @@ -11,11 +11,6 @@ caption: {{$:/language/Manager/Item/Tags}} \define tag-picker-actions() <<tag-checkbox-actions>> -<$action-listops - $tiddler=<<currentTiddler>> - $field="tags" - $subfilter="[<tag>] [all[current]tags[]]" -/> \end <p> @@ -28,5 +23,7 @@ caption: {{$:/language/Manager/Item/Tags}} </$list> </p> <p> +<$fieldmangler> <$macrocall $name="tag-picker" actions=<<tag-picker-actions>>/> +</$fieldmangler> </p> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 22f9c22bf..01b3a091e 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -1,30 +1,35 @@ title: $:/core/macros/tag-picker tags: $:/tags/Macro -\define add-tag-actions() -<$action-sendmessage $message="tm-add-tag" $param={{{ [<newTagNameTiddler>get[text]] }}}/> +\define add-tag-actions(actions) +<$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> +<$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> <$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> +$actions$ +</$set> \end -\define tag-button() +\define tag-button(actions) <$button class="tc-btn-invisible" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> <$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> +$actions$ <$macrocall $name="tag-pill" tag=<<tag>>/> </$button> \end -\define tag-picker-inner() +\define tag-picker-inner(actions) \whitespace trim <div class="tc-edit-add-tag"> +<div> <span class="tc-add-tag-name"> -<$keyboard key="ENTER" actions=<<add-tag-actions>>> -<$edit-text tiddler=<<newTagNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} cancelPopups=<<cancelPopups>>/> +<$keyboard key="ENTER" actions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>>/>"""> +<$edit-text tiddler=<<newTagNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} cancelPopups="yes"/> </$keyboard> -</span> <$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class="tc-add-tag-button"> +</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> <span class="tc-add-tag-button"> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> <$button set="$:/temp/NewTagName" setTo="" class=""> -<<add-tag-actions>> +<$macrocall $name="add-tag-actions" actions=<<__actions__>>/> <$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> {{$:/language/EditTemplate/Tags/Add/Button}} </$button> @@ -37,23 +42,24 @@ tags: $:/tags/Macro <$set name="newTagName" value={{{ [<newTagNameTiddler>get[text]] }}}> <$list filter="[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> <$list filter="[tags[]!is[system]search:title<newTagName>sort[]]" variable="tag"> -<<tag-button>> +<$macrocall $name="tag-button" actions=<<__actions__>>/> </$list></$list> <hr> <$list filter="[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> <$list filter="[tags[]is[system]search:title<newTagName>sort[]]" variable="tag"> -<<tag-button>> +<$macrocall $name="tag-button" actions=<<__actions__>>/> </$list></$list> </$set> </div> </$reveal> </div> +</div> \end -\define tag-picker() +\define tag-picker(actions) \whitespace trim -<$list filter="[<newTagNameTiddler>match[]]" emptyMessage=<<tag-picker-inner>>> +<$list filter="[<newTagNameTiddler>match[]]" emptyMessage="""<$macrocall $name="tag-picker-inner" actions=<<__actions__>>/>"""> <$set name="newTagNameTiddler" value=<<qualify "$:/temp/NewTagName">>> -<<tag-picker-inner>> +<$macrocall $name="tag-picker-inner" actions=<<__actions__>>/> </$set> </$list> \end From 482f7a92ae96c2fed602e0b182322eb7abf4aea7 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 13:14:09 +0200 Subject: [PATCH 0703/2376] Type EditTemplate: show dropdown at correct position ... (#4686) * Refactor type edittemplate for correct positioning... ... of type dropdown * Refactor classes --- core/ui/EditTemplate/type.tid | 5 ++++- themes/tiddlywiki/vanilla/base.tid | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index f9068fa8a..edf4bf982 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -3,8 +3,10 @@ tags: $:/tags/EditTemplate \define lingo-base() $:/language/EditTemplate/ \whitespace trim +<em class="tc-edit"><<lingo Type/Prompt>></em>   +<div class="tc-type-selector-wrapper"> <div class="tc-type-selector"><$fieldmangler> -<em class="tc-edit"><<lingo Type/Prompt>></em>  <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes"/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> +<$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes"/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> </$fieldmangler></div> <div class="tc-block-dropdown-wrapper"> @@ -24,3 +26,4 @@ tags: $:/tags/EditTemplate </$reveal> </$set> </div> +</div> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 4a1d3a1c8..a76a098b9 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1303,7 +1303,11 @@ html body.tc-body.tc-single-tiddler-window { } .tc-type-selector .tc-edit-typeeditor { - width: 20%; + width: auto; +} + +.tc-type-selector-wrapper { + display: inline-block; } .tc-edit-tags { From 17a36726faa836e924b8c6309e83ae8955a9462a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 13:18:31 +0200 Subject: [PATCH 0704/2376] Fields EditTemplate: Correct positioning of dropdown (#4687) * Add wrapper div to fields EditTemplate * Add classes * remove obsolete span * Update base.tid --- core/ui/EditTemplate/fields.tid | 5 +++-- themes/tiddlywiki/vanilla/base.tid | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 47f582112..dd0b49a65 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -71,9 +71,9 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <em class="tc-edit"> <<lingo Fields/Add/Prompt>>   </em> -<span class="tc-edit-field-add-name"> +<div class="tc-edit-field-add-name-wrapper"> <$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes"/> -</span>  +  <$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> <div class="tc-block-dropdown tc-edit-type-dropdown"> @@ -101,6 +101,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> </$set> </div> </$reveal> +</div> <span class="tc-edit-field-add-value"> <$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}> <$keyboard key="((add-field))" actions=<<new-field-actions>>> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index a76a098b9..3b52dfaf6 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1404,9 +1404,12 @@ html body.tc-body.tc-single-tiddler-window { vertical-align: middle; } -.tc-edit-field-add-name { +.tc-edit-field-add-name-wrapper input.tc-edit-texteditor { + width: auto; +} + +.tc-edit-field-add-name-wrapper { display: inline-block; - width: 15%; } .tc-edit-field-add-value { From bbf20f895530f4f7283048c4ff68c47d8238e84d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 13:33:18 +0200 Subject: [PATCH 0705/2376] Scrollable widget: Fix error in variable declaration (#4704) --- core/modules/widgets/scrollable.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/scrollable.js b/core/modules/widgets/scrollable.js index ca63db52d..01a04a7eb 100644 --- a/core/modules/widgets/scrollable.js +++ b/core/modules/widgets/scrollable.js @@ -66,10 +66,10 @@ ScrollableWidget.prototype.handleScrollEvent = function(event) { Scroll an element into view */ ScrollableWidget.prototype.scrollIntoView = function(element) { - var duration = $tw.utils.getAnimationDuration(); + var duration = $tw.utils.getAnimationDuration(), + srcWindow = element ? element.ownerDocument.defaultView : window; this.cancelScroll(); this.startTime = Date.now(), - srcWindow = element ? element.ownerDocument.defaultView : window; var scrollPosition = { x: this.outerDomNode.scrollLeft, y: this.outerDomNode.scrollTop From d832cb93ce48f3cfaefb18809930e2448917bc93 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 11 Jun 2020 14:54:59 +0200 Subject: [PATCH 0706/2376] Fix (again) error in scrollable.js (#4705) --- core/modules/widgets/scrollable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/scrollable.js b/core/modules/widgets/scrollable.js index 01a04a7eb..97f0dcdf1 100644 --- a/core/modules/widgets/scrollable.js +++ b/core/modules/widgets/scrollable.js @@ -69,7 +69,7 @@ ScrollableWidget.prototype.scrollIntoView = function(element) { var duration = $tw.utils.getAnimationDuration(), srcWindow = element ? element.ownerDocument.defaultView : window; this.cancelScroll(); - this.startTime = Date.now(), + this.startTime = Date.now(); var scrollPosition = { x: this.outerDomNode.scrollLeft, y: this.outerDomNode.scrollTop From 38e329edad8bb2a7b8628be9c3c9ad36dad8db0a Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 13 Jun 2020 10:16:33 +0200 Subject: [PATCH 0707/2376] Fixes use of stateTitle instead of state resulting in artifacts during import (#4711) * Fixes use of stateTitle instead of state * Fixed bug with merging --- core/ui/ImportListing.tid | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index 22ad2ace4..ddf49a8ce 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -41,13 +41,13 @@ $(currentTiddler)$!!popup-$(payloadTiddler)$ <$checkbox field=<<selectionField>> checked="checked" unchecked="unchecked" default="checked"/> </td> <td> -<$reveal type="nomatch" stateTitle=<<previewPopupState>> text="yes" tag="div"> -<$button class="tc-btn-invisible tc-btn-dropdown" setTitle=<<previewPopupState>> setTo="yes"> +<$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div"> +<$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="yes"> {{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/> </$button> </$reveal> -<$reveal type="match" stateTitle=<<previewPopupState>> text="yes" tag="div"> -<$button class="tc-btn-invisible tc-btn-dropdown" setTitle=<<previewPopupState>> setTo="no"> +<$reveal type="match" state=<<previewPopupState>> text="yes" tag="div"> +<$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="no"> {{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/> </$button> </$reveal> @@ -58,7 +58,7 @@ $(currentTiddler)$!!popup-$(payloadTiddler)$ </tr> <tr> <td colspan="3"> -<$reveal type="match" text="yes" stateTitle=<<previewPopupState>> tag="div"> +<$reveal type="match" text="yes" state=<<previewPopupState>> tag="div"> <$list filter="[{$:/state/importpreviewtype}has[text]]" variable="listItem" emptyMessage={{$:/core/ui/ImportPreviews/Text}}> <$transclude tiddler={{$:/state/importpreviewtype}}/> </$list> From 2f55a8808c20cfab4f7fa53d6b0abe50025b94a4 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 13 Jun 2020 20:29:38 +0200 Subject: [PATCH 0708/2376] Update KeyboardWidget.tid (#4606) Add railroad for key strings. --- editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid b/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid index b38786f28..70ca38f46 100644 --- a/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid @@ -25,6 +25,15 @@ The content of the `<$keyboard>` widget is rendered normally. The keyboard short Key strings are made up of one or more key specifiers separated by spaces. Each key specifier is zero or more of the modifiers <kbd>alt</kbd>, <kbd>shift</kbd>, <kbd>ctrl</kbd> or <kbd>meta</kbd> followed by the name of a key, all joined with "+" plus or "-" minus symbols. Key names are either the letter or digit printed on the key (eg "a" or "1"), or one of the special keys <kbd>backspace</kbd>, <kbd>tab</kbd>, <kbd>enter</kbd> or <kbd>escape</kbd>. +<$railroad text=""" +[: { + ("alt" | "shift" | "ctrl" |: "meta" ) +("+" | "-") + } + "+" +] +( "<a-z,0-9>" | "backspace" |: "tab" | "enter" | "escape" ) +"""/> + For example: ``` From 881aed879b089460840602206c97f98a6e41ce7a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 14 Jun 2020 10:40:48 +0200 Subject: [PATCH 0709/2376] Fix #4591: Use text field instead of tags field for $:/config/NewJournal/Tags ... (#4600) * Update Basics.tid * Update new-tiddler.tid * Update new-journal.tid * Update new-image.tid * Update new-here.tid * Update new-journal-here.tid * Update NewJournalTags.tid * Update NewJournalTags.tid --- core/language/en-GB/NewJournalTags.tid | 3 ++- core/ui/Actions/new-image.tid | 2 +- core/ui/Actions/new-journal.tid | 2 +- core/ui/Actions/new-tiddler.tid | 2 +- core/ui/ControlPanel/Basics.tid | 4 ++-- core/ui/ViewToolbar/new-here.tid | 2 +- core/ui/ViewToolbar/new-journal-here.tid | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/language/en-GB/NewJournalTags.tid b/core/language/en-GB/NewJournalTags.tid index 0534cba33..d8b40818b 100644 --- a/core/language/en-GB/NewJournalTags.tid +++ b/core/language/en-GB/NewJournalTags.tid @@ -1,2 +1,3 @@ title: $:/config/NewJournal/Tags -tags: Journal + +Journal diff --git a/core/ui/Actions/new-image.tid b/core/ui/Actions/new-image.tid index 1e46ebcdb..d27d5c8c1 100644 --- a/core/ui/Actions/new-image.tid +++ b/core/ui/Actions/new-image.tid @@ -6,5 +6,5 @@ description: create a new image tiddler image/$(imageType)$ \end <$vars imageType={{$:/config/NewImageType}}> -<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!tags}}/> +<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>> tags={{$:/config/NewTiddler/Tags}}/> </$vars> diff --git a/core/ui/Actions/new-journal.tid b/core/ui/Actions/new-journal.tid index 9f3453926..4c5082f78 100644 --- a/core/ui/Actions/new-journal.tid +++ b/core/ui/Actions/new-journal.tid @@ -2,7 +2,7 @@ title: $:/core/ui/Actions/new-journal tags: $:/tags/Actions description: create a new journal tiddler -<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}> +<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} journalText={{$:/config/NewJournal/Text}}> <$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>"""> <$reveal type="nomatch" state=<<journalTitle>> text=""> <$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/> diff --git a/core/ui/Actions/new-tiddler.tid b/core/ui/Actions/new-tiddler.tid index e176f0ab3..4a6eeac7b 100644 --- a/core/ui/Actions/new-tiddler.tid +++ b/core/ui/Actions/new-tiddler.tid @@ -2,4 +2,4 @@ title: $:/core/ui/Actions/new-tiddler tags: $:/tags/Actions description: create a new empty tiddler -<$action-sendmessage $message="tm-new-tiddler" tags={{$:/config/NewTiddler/Tags!!tags}}/> +<$action-sendmessage $message="tm-new-tiddler" tags={{$:/config/NewTiddler/Tags}}/> diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 77256ba88..0820d9e97 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -23,8 +23,8 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | -|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$list filter="[[$:/config/NewTiddler/Tags]]" template="$:/core/ui/EditTemplate/tags"/> | -|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$list filter="[[$:/config/NewJournal/Tags]]" template="$:/core/ui/EditTemplate/tags"/> | +|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewTiddler/Tags" tag="input" default=""/> | +|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Tags" tag="input" default=""/> | |<$link to="$:/config/AutoFocus"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | diff --git a/core/ui/ViewToolbar/new-here.tid b/core/ui/ViewToolbar/new-here.tid index d11750e70..72bd7c3e3 100644 --- a/core/ui/ViewToolbar/new-here.tid +++ b/core/ui/ViewToolbar/new-here.tid @@ -5,7 +5,7 @@ description: {{$:/language/Buttons/NewHere/Hint}} \whitespace trim \define newHereActions() -<$set name="tags" filter="[<currentTiddler>] [{$:/config/NewTiddler/Tags!!tags}]"> +<$set name="tags" filter="[<currentTiddler>] [{$:/config/NewTiddler/Tags}]"> <$action-sendmessage $message="tm-new-tiddler" tags=<<tags>>/> </$set> \end diff --git a/core/ui/ViewToolbar/new-journal-here.tid b/core/ui/ViewToolbar/new-journal-here.tid index b540185ca..0fc55b19f 100644 --- a/core/ui/ViewToolbar/new-journal-here.tid +++ b/core/ui/ViewToolbar/new-journal-here.tid @@ -23,7 +23,7 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}} </$button> \end <$set name="journalTitleTemplate" value={{$:/config/NewJournal/Title}}> -<$set name="journalTags" value={{$:/config/NewJournal/Tags!!tags}}> +<$set name="journalTags" value={{$:/config/NewJournal/Tags}}> <$set name="currentTiddlerTag" value=<<currentTiddler>>> <<journalButton>> </$set> From 09a2db1cfff65cedd222835099326876634dac73 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 14 Jun 2020 11:22:37 +0100 Subject: [PATCH 0710/2376] Update Saving on a PHP Server.tid (#4714) As suggested by @Marxsal --- editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid b/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid index 7f0cec25d..dc74b8f78 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid @@ -10,7 +10,7 @@ type: text/vnd.tiddlywiki The built-in `TiddlySpot `saver can also be used to save changes to a simple PHP script that you can run on most hosting providers. -//These are preliminary instructions that need verification// +//This code hasn't been updated in several years. If you have difficulty with it, consider using [[TW Receiver|Saving with TW Receiver]] instead// # Download a copy of `TiddlyHome_0.1.2.zip` from https://code.google.com/archive/p/bidix/downloads # Unzip. @@ -45,3 +45,4 @@ php_value post_max_size 6M !!! Note about possible error message If you get an error message regarding `split()`, you may need to change references to `split` in ''store.php'' to function `explode` . + From 1e221ddbdbde400fe32a3ba1514d738e5cd39d3f Mon Sep 17 00:00:00 2001 From: Rizwan <ibnishak@live.com> Date: Sun, 14 Jun 2020 16:18:13 +0530 Subject: [PATCH 0711/2376] Visual changes to Saving Tiddler (#4640) * Styles and templates for visual changes to Saving methods listing * Color coding saver methods according to delivery * Changes to tags and few tiddlers - The tag InternetExplorer has been changed to [[Internet Explorer]] - A tag for Edge is added - Reclassified TiddlyServer as DIY instead of App The existing criteriion for classification is unclear. Here is my reasoning for the change. An app is something user can simply install and run. Like TiddlyDesktop or Tiddloid. A DIY is something user has to install additional runtimes for. Thus Nodejs is a DIY. In the same vein, TiddlyServer is a DIY * Adding Twexe * Reversing accidental changes to StoryList * Restyling Download button and Card Size * Removing "Read more" links Entire card is now clickable To give visual clues regarding the clickability of card, title will change color to blue on card hover * Removing margins from elements under link and adding padding instead. Why this change? Margins are not "clickable". Having margins under <a> tag means there are minute dead areas where the mouse pointer will change shape, is not clickable and degrade user experience. Paddings are "clickable" --- editions/tw5.com/tiddlers/$__StoryList.tid | 2 +- ...xe_ Single File Tiddlywiki5 executable.tid | 29 ++++ ...d-on for Google Drive by Joshua Stubbs.tid | 6 +- .../TiddlyServer by Arlen Beiler.tid | 6 +- .../_Noteself_ by Danielo Rodriguez.tid | 6 +- ...imimi_ Extension and executable by Riz.tid | 6 +- ...e-backups_ Extension Firefox by pmario.tid | 6 +- ...nsion for Chrome and Firefox by buggyj.tid | 4 +- .../gettingstarted/GettingStarted.tid | 4 +- .../tiddlers/howtos/Windows HTA Hack.tid | 3 +- .../Installing TiddlyWiki on Node.js.tid | 3 +- .../nodejs/Serving TW5 from Android.tid | 3 +- .../saving/Emergency Tiddler Export.tid | 6 +- ... Microsoft Internet Information Server.tid | 3 +- .../tiddlers/saving/Saving on Android.tid | 4 +- .../saving/Saving on Beaker Browser.tid | 3 +- .../saving/Saving on TiddlyDesktop.tid | 5 +- .../tiddlers/saving/Saving on TiddlySpot.tid | 14 +- .../saving/Saving on a PHP Server.tid | 3 +- .../tiddlers/saving/Saving on iPad_iPhone.tid | 4 +- .../saving/Saving to a Git service.tid | 13 +- .../tiddlers/saving/Saving via WebDAV.tid | 7 +- .../saving/Saving via minimal Ruby server.tid | 6 +- .../tiddlers/saving/Saving with TiddlyFox.tid | 4 +- .../tiddlers/saving/Saving with TiddlyIE.tid | 6 +- .../Saving with the HTML5 fallback saver.tid | 5 +- editions/tw5.com/tiddlers/saving/Saving.tid | 79 +++++++---- .../TiddlyWiki in the Sky for Dropbox.tid | 5 +- .../tiddlers/system/download-empty-button.tid | 5 +- .../tiddlers/system/tw5.com-card-template.tid | 17 +++ .../tiddlers/system/tw5.com-styles.tid | 126 +++++++++++++++++- 31 files changed, 317 insertions(+), 76 deletions(-) create mode 100644 editions/tw5.com/tiddlers/Twexe_ Single File Tiddlywiki5 executable.tid create mode 100644 editions/tw5.com/tiddlers/system/tw5.com-card-template.tid diff --git a/editions/tw5.com/tiddlers/$__StoryList.tid b/editions/tw5.com/tiddlers/$__StoryList.tid index 80d265c4e..4814c7f1a 100644 --- a/editions/tw5.com/tiddlers/$__StoryList.tid +++ b/editions/tw5.com/tiddlers/$__StoryList.tid @@ -1,5 +1,5 @@ created: 20191004112211823 -list: [[WidgetMessage: tm-unload-plugin-library]] [[WidgetMessage: tm-load-plugin-library]] [[WidgetMessage: tm-load-plugin-from-library]] HelloThere GettingStarted Community +list: HelloThere GettingStarted Community modified: 20191004113621710 title: $:/StoryList type: text/vnd.tiddlywiki \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/Twexe_ Single File Tiddlywiki5 executable.tid b/editions/tw5.com/tiddlers/Twexe_ Single File Tiddlywiki5 executable.tid new file mode 100644 index 000000000..8e5294854 --- /dev/null +++ b/editions/tw5.com/tiddlers/Twexe_ Single File Tiddlywiki5 executable.tid @@ -0,0 +1,29 @@ +caption: Twexe +color: #ff8a65 +community-author: ihm4u +created: 20200507214737998 +delivery: App +description: Single File Tiddlywiki5 executable +method: save +modified: 20200507215529213 +tags: Firefox [[Internet Explorer]] Opera Resources Safari Saving Windows Edge Linux +title: Twexe: Single File Tiddlywiki5 executable +type: text/vnd.tiddlywiki +url: https://ihm4u.github.io/twexe/ + +{{!!description}} +{{!!url}} + +!! Features + +* Automatic backups +* Automatic saving +* No browser add-ons needed!! +* Works on Linux and Windows +* Single file executable, can be moved, copied, etc. +* Wiki is compressed, occupying less space on your disk (sometimes even a third of the space!) +* Converts //any// Tiddlywiki5 file to a single file executable <<twexe>>, no need for special tiddlywiki plugins +* Automatically uses the saving tab in the control panel (there you can specify a backup directory if you don't like the default) +* Easily get back the html wiki file from the executable twexe (if you need it for some reason) +* Opens up the possibility to run external executables from your wiki (to draw charts, etc.) - stay tuned!! +* Supports external images (i.e. with _canonical_uri field) \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid index 5fee9c4cf..71de566d0 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid @@ -1,10 +1,12 @@ caption: ~TiddlyDrive +color: #FFEB3B +community-author: Joshua Stubbs created: 20171109172705241 delivery: Google Drive Add-on description: Google Drive add-on to save TiddlyWiki files method: save -modified: 20190531161707260 -tags: Saving plugins Resources Android Chrome Firefox InternetExplorer iOS Linux Mac Opera PHP Safari Windows +modified: 20200507202706013 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Resources Safari Saving Windows iOS plugins Edge title: TiddlyDrive Add-on for Google Drive by Joshua Stubbs type: text/vnd.tiddlywiki url: https://lordratte.gitlab.io/tiddlydrive/#installation-guide diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid index 38d9ee57a..24dd5ed4e 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid @@ -1,9 +1,11 @@ caption: ~TiddlyServer +color: #f06292 +community-author: Arlen Beiler created: 20171109171415540 -delivery: App +delivery: DIY description: An extension to TiddlyWiki's Node.js server method: sync -modified: 20171113134624304 +modified: 20200507203417109 tags: Linux Mac Windows Saving Resources title: TiddlyServer by Arlen Beiler type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_Noteself_ by Danielo Rodriguez.tid b/editions/tw5.com/tiddlers/community/resources/_Noteself_ by Danielo Rodriguez.tid index 47456fda6..bc3ca1827 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Noteself_ by Danielo Rodriguez.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Noteself_ by Danielo Rodriguez.tid @@ -1,10 +1,12 @@ caption: Noteself +color: #29B6F6 +community-author: Danielo Rodríguez created: 20141122093837330 delivery: Web Service description: Free online service that you can also host yourself method: sync -modified: 20171113132811794 -tags: Saving Resources Android Chrome Firefox InternetExplorer iOS Linux Mac Opera PHP Safari Windows +modified: 20200507203026367 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Resources Safari Saving Windows iOS Edge title: "Noteself" by Danielo Rodríguez type: text/vnd.tiddlywiki url: https://noteself.github.io/ diff --git a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid index 47a091380..65859af50 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid @@ -1,10 +1,12 @@ caption: Timimi +color: #4db6ac +community-author: Riz created: 20180830194141190 delivery: Browser Extension & Native host description: Browser extension & native host for desktops method: save -modified: 20200501092235061 -tags: Windows Linux Chrome Firefox Saving Resources plugins Mac Opera +modified: 20200507202633529 +tags: Windows Linux Chrome Firefox Saving Resources plugins Mac Opera Edge title: Timimi: WebExtension and Native Host by Riz type: text/vnd.tiddlywiki url: https://ibnishak.github.io/Timimi/ diff --git a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid index bba4660ec..7d13d39bc 100644 --- a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid +++ b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid @@ -1,9 +1,11 @@ caption: file-backups -created: 201711161655 +color: #4DB6AC +community-author: Mario Pietsch +created: 20171116165500000 delivery: Browser Extension description: Browser extension for Firefox method: save -modified: 201711161655 +modified: 20200507105159105 tags: Firefox Saving Resources plugins title: "file-backups" Extension for Firefox by pmario type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid b/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid index 3a558d283..d09f0e17a 100644 --- a/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid +++ b/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid @@ -1,9 +1,11 @@ caption: savetiddlers +color: #4DB6AC +community-author: Buggyj created: 20171109171935039 delivery: Browser Extension description: Browser extension for Chrome and Firefox method: save -modified: 20171113132624609 +modified: 20200507105459753 tags: Chrome Firefox Saving Resources plugins title: "savetiddlers" Extension for Chrome and Firefox by buggyj type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/gettingstarted/GettingStarted.tid b/editions/tw5.com/tiddlers/gettingstarted/GettingStarted.tid index ad6d00bca..b417943c0 100644 --- a/editions/tw5.com/tiddlers/gettingstarted/GettingStarted.tid +++ b/editions/tw5.com/tiddlers/gettingstarted/GettingStarted.tid @@ -1,5 +1,5 @@ created: 20131129090249275 -modified: 20171113162547685 +modified: 20200507203622933 tags: [[Working with TiddlyWiki]] title: GettingStarted type: text/vnd.tiddlywiki @@ -8,6 +8,6 @@ Click here to download an empty copy of TiddlyWiki: {{$:/editions/tw5.com/snippe The next step is to choose a method for saving changes. There's a wide variety of methods available, with different features and limitations. Click on the badge for a method to see more information about it. You can also click on one of the platform filters to restrict the listing to methods that work with that platform. -<<.warning "Don't attempt to use the browser ''File''/''Save'' menu option to save changes (it doesn't work)">> +<<.warning "Don't attempt to use the browser ''File''/''Save'' menu option to save changes (it doesn't work)">><br/><br/> {{Saving}} diff --git a/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid b/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid index 116bf8741..9305b31bd 100644 --- a/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid +++ b/editions/tw5.com/tiddlers/howtos/Windows HTA Hack.tid @@ -1,9 +1,10 @@ caption: HTA Hack +color: #F06292 created: 20131212223146250 delivery: DIY description: Manual method to let Internet Explorer save changes directly method: save -modified: 20171113160539299 +modified: 20200507110355115 tags: Saving Windows title: Windows HTA Hack type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid index 145725966..5c6b34f13 100644 --- a/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/Installing TiddlyWiki on Node.js.tid @@ -1,9 +1,10 @@ caption: Node.js +color: #F06292 created: 20131219100608529 delivery: DIY description: Flexible hosting on your own machine or in the cloud method: sync -modified: 20180701185303780 +modified: 20200507110222866 tags: Saving [[TiddlyWiki on Node.js]] Windows Mac Linux title: Installing TiddlyWiki on Node.js type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid b/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid index 40a675c63..fae1e0fb5 100644 --- a/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid +++ b/editions/tw5.com/tiddlers/nodejs/Serving TW5 from Android.tid @@ -1,9 +1,10 @@ caption: Node.js on Termux +color: #F06292 created: 20200501120322327 delivery: App with DIY steps description: Using Node.js to serve/create flatfile wikis method: sync -modified: 20200501120801899 +modified: 20200507112915801 tags: Saving [[TiddlyWiki on Node.js]] Android title: Serving TW5 from Android type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid b/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid index 15d5478b6..59a1f4484 100644 --- a/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid +++ b/editions/tw5.com/tiddlers/saving/Emergency Tiddler Export.tid @@ -1,14 +1,14 @@ caption: Emergency Export +color: #7986CB created: 20180309211328412 delivery: Saver description: Awkward but useful emergency technique for saving tiddlers method: save -modified: 20180309221402430 -tags: Mac Android Windows Linux Saving Chrome Safari Firefox Opera InternetExplorer +modified: 20200507202809334 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera Safari Saving Windows Edge title: Emergency Tiddler Export type: text/vnd.tiddlywiki - This method is useful if, for any reason, you should find your current TiddlyWiki instance is not saving (e.g. a plugin or a server has stopped working). It should work on just about any platform. * Go to advanced search {{$:/core/ui/Buttons/advanced-search}} diff --git a/editions/tw5.com/tiddlers/saving/Installing TiddlyWiki on Microsoft Internet Information Server.tid b/editions/tw5.com/tiddlers/saving/Installing TiddlyWiki on Microsoft Internet Information Server.tid index e721e6518..8ca408a68 100644 --- a/editions/tw5.com/tiddlers/saving/Installing TiddlyWiki on Microsoft Internet Information Server.tid +++ b/editions/tw5.com/tiddlers/saving/Installing TiddlyWiki on Microsoft Internet Information Server.tid @@ -1,9 +1,10 @@ caption: Internet Information Services +color: #F06292 created: 20180328120356008 delivery: DIY description: Windows' built-in web server method: sync -modified: 20180701185718671 +modified: 20200507105855400 tags: Saving [[TiddlyWiki on Node.js]] Windows title: Installing TiddlyWiki on Microsoft Internet Information Server type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving on Android.tid b/editions/tw5.com/tiddlers/saving/Saving on Android.tid index d5f01dad2..d86db5ab3 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on Android.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on Android.tid @@ -1,9 +1,11 @@ caption: Tiddloid and Tiddloid Lite +color: #FF8A65 +community-author: donmor created: 20130825161400000 delivery: App description: Android app for saving changes locally to device storage method: save -modified: 20200501103500478 +modified: 20200507103926292 tags: Saving Android title: Saving on Android type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving on Beaker Browser.tid b/editions/tw5.com/tiddlers/saving/Saving on Beaker Browser.tid index d6ea9aa37..ea5777186 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on Beaker Browser.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on Beaker Browser.tid @@ -1,9 +1,10 @@ caption: Beaker Browser +color: #FF8A65 created: 20161229121316912 delivery: App description: Powerful new browser for Mac, Windows and Linux method: save -modified: 20171113110603084 +modified: 20200507104016915 tags: Saving Windows Linux Mac title: Saving on Beaker Browser type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlyDesktop.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlyDesktop.tid index 717190137..fc31284e4 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on TiddlyDesktop.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlyDesktop.tid @@ -1,12 +1,15 @@ caption: ~TiddlyDesktop +color: #FF8A65 +community-author: Jeremy Ruston created: 20171112085137764 delivery: App description: Custom desktop application for working with TiddlyWiki method: save -modified: 20171113105959509 +modified: 20200507104332791 tags: Saving Mac Windows Linux title: Saving on TiddlyDesktop type: text/vnd.tiddlywiki +url: https://github.com/Jermolene/TiddlyDesktop/releases See the [[Introducing TiddlyDesktop Video]] diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid index 6a8a4c1c6..77361f307 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid @@ -1,12 +1,14 @@ +caption: ~TiddlySpot +color: #29B6F6 +community-author: Simon Baird and Daniel Baird created: 20130825213500000 -modified: 20160610082610879 -tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera PHP Safari Windows +delivery: Service +description: Free online service for hosting TiddlyWiki files +method: save +modified: 20200507202953380 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Safari Saving Windows iOS Edge title: Saving on TiddlySpot type: text/vnd.tiddlywiki -delivery: Service -method: save -caption: TiddlySpot -description: Free online service for hosting TiddlyWiki files [[TiddlySpot|http://tiddlyspot.com]] is a free hosting service for TiddlyWiki documents from Simon Baird and Daniel Baird. diff --git a/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid b/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid index dc74b8f78..76090a515 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on a PHP Server.tid @@ -1,9 +1,10 @@ caption: PHP +color: #F06292 created: 20140111091844267 delivery: DIY description: DIY script you can install on your own server method: save -modified: 20171115171431733 +modified: 20200507110314202 tags: Saving PHP title: Saving on a PHP Server type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid index 7348de741..b32116f1a 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid @@ -1,9 +1,11 @@ caption: Quine +color: #FF8A65 +community-author: Chris Hunt created: 20131129101027725 delivery: App description: iPad/iPhone app for working with TiddlyWiki method: save -modified: 20200428224059031 +modified: 20200507104206754 tags: Saving iOS title: Saving on iPad/iPhone type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid index f7ad41918..b6bb269db 100644 --- a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid +++ b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid @@ -1,12 +1,13 @@ +caption: Git Service Saver +color: #29B6F6 created: 20190408173002622 -modified: 20190408173002622 -tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera Safari Windows +delivery: Service +description: Save changes directly to a Git repository (on GitHub, GitLab) +method: save +modified: 20200507203007684 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera Safari Saving Windows iOS Edge title: Saving to a Git service type: text/vnd.tiddlywiki -delivery: Service -method: save -caption: Git Service Saver -description: Save changes directly to a Git repository (on GitHub, GitLab) TiddlyWiki can save changes directly to a GitHub repository in the single file configuration. diff --git a/editions/tw5.com/tiddlers/saving/Saving via WebDAV.tid b/editions/tw5.com/tiddlers/saving/Saving via WebDAV.tid index f11aab12c..1edc2cdf3 100644 --- a/editions/tw5.com/tiddlers/saving/Saving via WebDAV.tid +++ b/editions/tw5.com/tiddlers/saving/Saving via WebDAV.tid @@ -1,10 +1,11 @@ -caption: WebDAV +caption: ~WebDAV +color: #f48fb1 created: 20160216191710789 delivery: Protocol description: Standard web protocol available on products such as Sharepoint method: save -modified: 20171117171334181 -tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera PHP Safari Windows +modified: 20200507202752943 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Safari Saving Windows iOS Edge title: Saving via WebDAV type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving via minimal Ruby server.tid b/editions/tw5.com/tiddlers/saving/Saving via minimal Ruby server.tid index 6b5222013..e8cd585c6 100644 --- a/editions/tw5.com/tiddlers/saving/Saving via minimal Ruby server.tid +++ b/editions/tw5.com/tiddlers/saving/Saving via minimal Ruby server.tid @@ -1,10 +1,12 @@ caption: Ruby Server +color: #78909C +community-author: Jim Foltz created: 20180514011710789 delivery: Server-side Script description: DIY script you can run as a server method: save -modified: 20180513222628883 -tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera Safari Windows +modified: 20200507203129704 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera Safari Saving Windows iOS Edge title: Saving via a Minimal Ruby Server type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid b/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid index 092eb29fd..43019a800 100644 --- a/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid +++ b/editions/tw5.com/tiddlers/saving/Saving with TiddlyFox.tid @@ -1,9 +1,11 @@ caption: ~TiddlyFox +color: #4DB6AC +community-author: Jeremy Ruston created: 20131221085742684 delivery: Browser Extension description: Browser extension for older versions of Firefox method: save -modified: 20171118230504315 +modified: 20200507105421421 tags: Saving Firefox title: Saving with TiddlyFox type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid b/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid index d4e821128..b6907c5ba 100644 --- a/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid +++ b/editions/tw5.com/tiddlers/saving/Saving with TiddlyIE.tid @@ -1,10 +1,12 @@ caption: ~TiddlyIE +color: #4DB6AC +community-author: David Jade created: 20131211220000000 delivery: Browser Extension description: Browser extension for Internet Explorer method: save -modified: 20171113110036278 -tags: Saving InternetExplorer +modified: 20200507201415232 +tags: [[Internet Explorer]] Saving title: Saving with TiddlyIE type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid b/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid index 92774cd68..d1d9a67a8 100644 --- a/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid +++ b/editions/tw5.com/tiddlers/saving/Saving with the HTML5 fallback saver.tid @@ -1,10 +1,11 @@ caption: Download Saver +color: #7986CB created: 20131129092604900 delivery: Saver description: Slightly awkward but universal technique that works on almost every browser method: save -modified: 20171113110022987 -tags: Saving Chrome Safari Firefox Opera InternetExplorer +modified: 20200507202835577 +tags: Chrome Firefox [[Internet Explorer]] Opera Safari Saving Edge title: Saving with the HTML5 fallback saver type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/saving/Saving.tid b/editions/tw5.com/tiddlers/saving/Saving.tid index 4c669c765..9afc8cfb7 100644 --- a/editions/tw5.com/tiddlers/saving/Saving.tid +++ b/editions/tw5.com/tiddlers/saving/Saving.tid @@ -1,37 +1,68 @@ created: 20140912140651119 -list: [[Saving with the HTML5 fallback saver]] [[Installing TiddlyWiki on Node.js]] [[TiddlyServer by Arlen Beiler]] [[Saving on TiddlyDesktop]] [[Saving on Beaker Browser]] [[Saving on iPad/iPhone]] [["savetiddlers" Extension for Chrome and Firefox by buggyj]] [["file-backups" Extension for Firefox by pmario]] [["Noteself" by Danielo Rodríguez]] [[TiddlyDrive Add-on for Google Drive by Joshua Stubbs]] [[TiddlyWiki in the Sky for Dropbox]] [[Saving on a PHP Server]] [[Saving via WebDAV]] [[Saving on Android]] [[Saving with TiddlyFox]] [[Saving with TiddlyIE]] [[Windows HTA Hack]] -modified: 20171113135847405 +list: +modified: 20200507203641230 +saving-browser: Firefox Chrome Edge [[Internet Explorer]] Safari Opera +saving-os: Windows Mac Linux Android iOS tags: [[Working with TiddlyWiki]] title: Saving type: text/vnd.tiddlywiki -\define filter-button(caption,filter) -<$reveal type="nomatch" state="$:/SavingDetailsFilter" text="""$filter$""" tag="span"> -<$button class="tc-btn-invisible tc-btn-unpushed" set="$:/SavingDetailsFilter" setTo="""$filter$"""> -<$text text="""$caption$"""/> -</$button> -</$reveal> -<$reveal type="match" state="$:/SavingDetailsFilter" text="""$filter$""" tag="span"> -<$button class="tc-btn-invisible tc-btn-pushed"> -<$text text="""$caption$"""/> {{$:/core/images/done-button}} -</$button> -</$reveal> +\define alltagsfilter() +<$vars tag1="tag[" tag2="]" lb="[" rb="tag[Saving]sort[delivery]]"> +<$set filter="[list[]addprefix<tag1>addsuffix<tag2>]+[join[]addprefix<lb>addsuffix<rb>]" name="alltags" select=0> +<$text text=<<alltags>>/> +</$set> +</$vars> \end -\define filter-maker() -[tag[Saving]tag[$(currentTiddler)$]] +\define saverssidebaritem(item:"Linux") +<$checkbox tiddler=<<qualify $:/temp/$item$>> field="status" checked="selected" checkactions=<<checkactions "$item$">> uncheckactions=<<uncheckactions "$item$">> default="closed"> $item$</$checkbox><br/> +\end + +\define saverssidebaritemlist(fieldname:"os") +<$list filter="[enlist{!!$fieldname$}]" variable="currentItem"> +<$macrocall $name="saverssidebaritem" item=<<currentItem>>/> +</$list> +\end + +\define uncheckactions(item:"Linux") +<$action-listops $subfilter="-[[$item$]]"/> +\end + +\define checkactions(item:"Linux") +<$action-listops $subfilter="[[$item$]]"/> +\end + +\define uncheckactions(item:"Linux") +<$action-listops $subfilter="-[[$item$]]"/> \end Available methods for saving changes with TiddlyWiki: -<div class="tc-thumbnail-tabs"> -<div style="font-size:0.9em;"> -PLATFORMS: -<<filter-button caption:"All" filter:"[tag[Saving]]">> -<$list filter="Android Chrome Firefox InternetExplorer iOS Linux Mac Opera PHP Safari Windows"> -<$macrocall $name="filter-button" caption=<<currentTiddler>> filter=<<filter-maker>>/> +<div class="tc-wrapper-flex"> +<div class="tc-saving-sidebar"> + <div class="tc-saving-sidebar-category"> + <div class="tc-saving-sidebar-category-title">OS</div> + <div class="tc-saving-sidebar-category-item"> + <<saverssidebaritemlist "saving-os">> + </div> + </div> + <div class="tc-saving-sidebar-category"> + <div class="tc-saving-sidebar-category-title">Browser</div> + <div class="tc-saving-sidebar-category-item"> + <<saverssidebaritemlist "saving-browser">> + </div> + </div> + +</div> + +<!-- Page content --> +<div class="content"> +<$wikify text=<<alltagsfilter>> name="alltagsfilterwikified"> +<$list filter=<<alltagsfilterwikified>>> +{{||$:/_tw5.com-card-template}} </$list> +</$wikify> + </div> -<br/> -<$macrocall $name="tabs" tabsList={{$:/SavingDetailsFilter}} template="$:/SavingDetailsTemplate" buttonTemplate="$:/SavingThumbnailsTemplate"/> -</div> +</div> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid b/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid index 57624dcad..715a1f9c0 100644 --- a/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid +++ b/editions/tw5.com/tiddlers/saving/TiddlyWiki in the Sky for Dropbox.tid @@ -1,10 +1,11 @@ caption: ~TiddlyWiki Cloud Connectors +color: #29B6F6 created: 20171113135053055 delivery: Web Service description: Online service for editing TiddlyWiki documents in Dropbox method: save -modified: 20180410115910048 -tags: Saving Android Chrome Firefox InternetExplorer iOS Linux Mac Opera PHP Safari Windows +modified: 20200507202922556 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Safari Saving Windows iOS Edge title: TiddlyWiki Cloud type: text/vnd.tiddlywiki url: https://twcloud.github.io/tw5-dropbox/ diff --git a/editions/tw5.com/tiddlers/system/download-empty-button.tid b/editions/tw5.com/tiddlers/system/download-empty-button.tid index a55cc844d..635d0b18c 100644 --- a/editions/tw5.com/tiddlers/system/download-empty-button.tid +++ b/editions/tw5.com/tiddlers/system/download-empty-button.tid @@ -1,6 +1,9 @@ +created: 20200507005920476 +modified: 20200507044420793 title: $:/editions/tw5.com/snippets/download-empty-button +type: text/vnd.tiddlywiki -<$button class="tc-btn-big-green"> +<$button class="tc-btn-download"> <$action-sendmessage $message="tm-download-file" $param="$:/editions/tw5.com/download-empty" filename="empty.html"/> Download Empty {{$:/core/images/save-button}} </$button> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/system/tw5.com-card-template.tid b/editions/tw5.com/tiddlers/system/tw5.com-card-template.tid new file mode 100644 index 000000000..4e2e18a56 --- /dev/null +++ b/editions/tw5.com/tiddlers/system/tw5.com-card-template.tid @@ -0,0 +1,17 @@ +created: 20200507002521489 +modified: 20200515012732244 +tags: +title: $:/_tw5.com-card-template +type: text/vnd.tiddlywiki + +\define tw-card-template(bordercolor:"") +<div class="tc-card" style="border-top: 5px solid $bordercolor$;"> +<$link> + <div class="tc-card-title"><$transclude field="caption"><$view field="title"/></$transclude></div> + <div class="tc-card-author"> <$list filter="[is[current]has[community-author]]">by {{!!community-author}}</$list></div> + <p><$view field="description"/></p> + </$link> +</div> +\end + +<$macrocall $name="tw-card-template" bordercolor={{!!color}}/> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/system/tw5.com-styles.tid b/editions/tw5.com/tiddlers/system/tw5.com-styles.tid index 9677fc704..5b32c6238 100644 --- a/editions/tw5.com/tiddlers/system/tw5.com-styles.tid +++ b/editions/tw5.com/tiddlers/system/tw5.com-styles.tid @@ -1,5 +1,8 @@ -title: $:/_tw5.com-styles +created: 20200507002727378 +modified: 20200515024640489 tags: $:/tags/Stylesheet +title: $:/_tw5.com-styles +type: text/vnd.tiddlywiki \rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock @@ -74,3 +77,124 @@ tags: $:/tags/Stylesheet width: 1em; height: 1em; } + + + +.tc-wrapper-flex { + display: flex; +} + +.tc-saving-sidebar { + margin: 0; + padding: 0; + min-width: 200px; + overflow: auto; +} + +.tc-saving-sidebar a { + display: block; +} + +@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { + .tc-wrapper-flex { + flex-direction: column; + } + .tc-saving-sidebar { + width: 100%; + height: auto; + } + .tc-saving-sidebar a { + float: left; + } +} + +.tc-saving-sidebar-category { + margin-bottom: 10px; +} + +.tc-saving-sidebar-category-title { + font-weight: bold; + margin-bottom: 5px; + font-size: 16px; +} + +.tc-saving-sidebar-category-item { + margin-left: 10px; +} + +.tc-card { + margin: 15px; + padding: 10px 20px; + border-radius: 10px; + border-top: 5px solid #45D3D3; + box-shadow: 0 8px 17px -8px #A3A5AE; + background-color: #FFF; + width: 200px; + transition: box-shadow 0.3s ease-in-out; + font-size: 13px; + line-height: 18px; +} + +.tc-card:hover { + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); +} +.tc-card:hover .tc-card-title { + color: #1462ff; +} + +.tc-card-title { + text-align: center; + font-size: 1.2em; + font-weight: 600; + transition: color 0.2s ease-in-out; + padding: 10px 0; +} + +.tc-card-author { + text-align: right; +} + +.tc-card p { + height: 67px; + overflow: hidden; + margin: 0; + padding: 13px 0; +} + +.tc-card a { + color: #222; +} + +.tc-card a:hover { + text-decoration:none; +} + +.tc-card a:active, .tc-card a:focus, .tc-btn-download:active, .tc-btn-download:focus{ + outline: none; +} + +div.content { + padding: 1px 16px; + display: flex; + flex-wrap: wrap; +} + +.tc-btn-download { + width: 250px; + padding: 10px; + border-radius: 5px; + background: #1462ff; + border-radius: 5px; + border: none; + box-shadow: 0 2px 2px 0 #4a74c9; + overflow: hidden; + cursor: pointer; + font-size: 1.2em; + line-height: 1.4em; + color: #fff; + fill: #fff; +} + +.tc-btn-download:active { + background: #1475ff; +} \ No newline at end of file From b8225f6993c79e184794508a4067ce85b2cf6c93 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 14 Jun 2020 17:23:28 +0100 Subject: [PATCH 0712/2376] Create Saving with TW Receiver Fixes #4712 (with 09a2db1cfff65cedd222835099326876634dac73) --- .../tiddlers/saving/Saving with TW Receiver.tid | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 editions/tw5.com/tiddlers/saving/Saving with TW Receiver.tid diff --git a/editions/tw5.com/tiddlers/saving/Saving with TW Receiver.tid b/editions/tw5.com/tiddlers/saving/Saving with TW Receiver.tid new file mode 100644 index 000000000..ed4c00f52 --- /dev/null +++ b/editions/tw5.com/tiddlers/saving/Saving with TW Receiver.tid @@ -0,0 +1,15 @@ +caption: TW Receiver +created: 20200612233356021 +delivery: DIY +description: DIY script you can install on your own server +method: save +modified: 20200612234312631 +tags: Saving PHP +title: Saving with TW Receiver +type: text/vnd.tiddlywiki + +TW Receiver is a ~TiddlyWiki plugin and PHP script used for saving to a PHP based server. + +It's features include simple automated backups, stale Instance Overwrite Protection, challenge digest authentication (enhanced security), and data integrity signing (enhanced security). + +* Visit [[TW-Receiver|https://github.com/sendwheel/tw-receiver]] for more information, plugin, and code. \ No newline at end of file From 5cda5c82e15d2df6b7110fd3c50f1f8e6e6d712a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 14 Jun 2020 17:26:19 +0100 Subject: [PATCH 0713/2376] Add docs for list-thumbnails macro Thanks @Marxsal --- .../list-thumbnails Macro (Examples).tid | 11 +++++++++++ .../tiddlers/macros/list-thumbnails Macro.tid | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 editions/tw5.com/tiddlers/macros/examples/list-thumbnails Macro (Examples).tid create mode 100644 editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid diff --git a/editions/tw5.com/tiddlers/macros/examples/list-thumbnails Macro (Examples).tid b/editions/tw5.com/tiddlers/macros/examples/list-thumbnails Macro (Examples).tid new file mode 100644 index 000000000..5cd9b4fe5 --- /dev/null +++ b/editions/tw5.com/tiddlers/macros/examples/list-thumbnails Macro (Examples).tid @@ -0,0 +1,11 @@ +created: 20200612170734735 +modified: 20200612171403882 +tags: [[Macro Examples]] +title: list-thumbnails Macro (Examples) +type: text/vnd.tiddlywiki + +This example lists all the tiddlers which are tagged with "HelloThumbnail": + +<$macrocall $name=".example" n="1" eg="""<<list-thumbnails filter:"[tag[HelloThumbnail]]" width:"168" height:"95">>"""/> + + diff --git a/editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid b/editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid new file mode 100644 index 000000000..a20859832 --- /dev/null +++ b/editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid @@ -0,0 +1,19 @@ +caption: thumbnail +created: 20200612170158838 +modified: 20200612171804473 +tags: Macros [[Core Macros]] +title: list-thumbnails Macro +type: text/vnd.tiddlywiki + +The <<.def list-thumbnails>> [[macros|Macros]] are used to create lists of linkable thumbnail panels. + +!! Parameters + +;filter +: filter for selecting thumbnails +;width +:Width of thumbnail (default 280 pixels) +;height +:Height of thumbnail (default 157 pixels) + +<<.macro-examples "list-thumbnails">> From 6265be01cd823cf20d663bf4a907749bc947f3d0 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 16 Jun 2020 14:40:49 +0100 Subject: [PATCH 0714/2376] Release note update --- .../prerelease/tiddlers/Release 5.1.23.tid | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 3e91ae6b5..43a9221fc 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 2020061111252696 -modified: 2020061111252696 +created: 20200616141840562 +modified: 20200616141840562 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -13,6 +13,7 @@ type: text/vnd.tiddlywiki ! Translation Improvements * Catalan +* Chinese ! Plugin Improvements @@ -25,6 +26,11 @@ type: text/vnd.tiddlywiki ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded * [[Dynaview Plugin]] ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples +* [[CodeMirror Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap +* [[Markdown Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebraks ! Performance Improvements @@ -58,6 +64,17 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4647]] ''class'' attribute of DroppableWidget * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac]] [[has Operator]] when used with the ''tags'' field * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4634]] high CPU usage with animated syncing icon introduced in v5.1.22 +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4591]] $:/config/NewJournal/Tags appearing in tag dropdowns +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4658]] popups not being cancelled when clicking within a text editor +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4676]] issue with [[timeline Macro]] and invalid date values +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4682]] hover colours of tag dropdowns in the sidebar +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4683]] alignment of tag pill icons +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4696]] crash with droppable widget +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4674]] issue with adding tags in $:/Manager +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4686]] edit template "type" dropdown positioning +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4687]] edit template field dropdown positioning +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4704]] (with [[addendum|https://github.com/Jermolene/TiddlyWiki5/pull/4705]]) syntax error in ScrollableWidget +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4711]] extraneous system tiddlers created during import process ! Contributors @@ -76,3 +93,5 @@ type: text/vnd.tiddlywiki * [[@NicolasPeton|https://github.com/NicolasPeton]] * [[@passuf|https://github.com/passuf]] * [[@pmario|https://github.com/pmario]] +* [[@saqimtias|https://github.com/saqimtias]] +* [[@twMat|https://github.com/twMat]] From 7e1f5b8471c6fdb6ed66b23402b1fd0288f8b3b0 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 16 Jun 2020 14:57:58 +0100 Subject: [PATCH 0715/2376] Add script for updating language plugins from translators edition --- bin/update-translation-from-html-file.sh | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 bin/update-translation-from-html-file.sh diff --git a/bin/update-translation-from-html-file.sh b/bin/update-translation-from-html-file.sh new file mode 100755 index 000000000..3fe3d8967 --- /dev/null +++ b/bin/update-translation-from-html-file.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Process translation updates made via the translators edition + +# ./bin/update-translation-from-html-file.sh <language-code> <path-to-html-file> + +# Assign and check parameters + +LANGUAGE_CODE=$1 +HTML_FILE_PATH=$2 + +if [ -z "$LANGUAGE_CODE" ]; then + echo "Missing parameter: language code" + exit 1 +fi + +if [ -z "$HTML_FILE_PATH" ]; then + echo "Missing parameter: path to HTML file" + exit 1 +fi + +./tiddlywiki.js editions/translators/ --verbose --unpackplugin $:/languages/$LANGUAGE_CODE --load $HTML_FILE_PATH --build output-files || exit 1 + +cp -R ./editions/translators/output/language/. ./languages/$LANGUAGE_CODE/ || exit 1 + From 9a479a95ad289f0b550dc1d3297e0a92a6848441 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 16 Jun 2020 14:58:07 +0100 Subject: [PATCH 0716/2376] Catalan updates --- languages/ca-ES/Buttons.multids | 36 ++++++++++++------------ languages/ca-ES/ControlPanel.multids | 31 ++++++++++---------- languages/ca-ES/Dates.multids | 24 ++++++++-------- languages/ca-ES/Docs/ModuleTypes.multids | 2 +- languages/ca-ES/EditTemplate.multids | 2 +- languages/ca-ES/Fields.multids | 20 ++++++------- languages/ca-ES/Misc.multids | 2 +- languages/ca-ES/SideBar.multids | 2 +- 8 files changed, 60 insertions(+), 59 deletions(-) diff --git a/languages/ca-ES/Buttons.multids b/languages/ca-ES/Buttons.multids index 7ed3e7232..81398e58f 100644 --- a/languages/ca-ES/Buttons.multids +++ b/languages/ca-ES/Buttons.multids @@ -31,8 +31,8 @@ EditorHeight/Hint: Trieu l'alçada de l'editor de text Encryption/Caption: encriptació Encryption/ClearPassword/Caption: neteja la contrasenya Encryption/ClearPassword/Hint: Suprimeix la contrasenya per desar aquest wiki sense encriptació -Encryption/Hint: Estableix o suprimeix la contrasenya per desar aquest wiki -Encryption/SetPassword/Caption: tria la contrasenya +Encryption/Hint: Establiu o suprimiu la contrasenya per desar aquest wiki +Encryption/SetPassword/Caption: trieu la contrasenya Encryption/SetPassword/Hint: Estableix una contrasenya per desar aquest wiki amb encriptació Excise/Caption: extirpa Excise/Caption/Excise: Executa l'extirpació @@ -47,7 +47,7 @@ Excise/Hint: Extirpa el text seleccionat en un nou tiddler ExportPage/Caption: exporta-ho tot ExportPage/Hint: Exporta tots els tiddlers ExportTiddler/Caption: exporta el tiddler -ExportTiddler/Hint: Exporta el tiddler +ExportTiddler/Hint: Exporta aquest tiddler ExportTiddlers/Caption: exporta tiddlers ExportTiddlers/Hint: Exporta els tiddlers Fold/Caption: expandeix el tiddler @@ -87,7 +87,7 @@ Italic/Hint: Aplica el format de cursiva a la selecció Language/Caption: idioma Language/Hint: Trieu l'idioma LineWidth/Caption: amplada de la línia -LineWidth/Hint: Trieu l'amplada de la línia per pintar +LineWidth/Hint: Trieu l'amplada de la línia Link/Caption: enllaç Link/Hint: Genera un enllaç de tipus wikitext Linkify/Caption: wikienllaç @@ -107,11 +107,11 @@ More/Hint: Més accions NewHere/Caption: nou aquí NewHere/Hint: Obre un nou tiddler etiquetat amb aquest NewImage/Caption: nova imatge -NewImage/Hint: Genera un nou tiddler d'imatge +NewImage/Hint: Nova imatge NewJournal/Caption: nou diari NewJournal/Hint: Nou tiddler diari NewJournalHere/Caption: nou diari aquí -NewJournalHere/Hint: Obre un nou tiddler diari etiquetat amb aquest +NewJournalHere/Hint: Obre un nou tiddler de tipus diari etiquetat amb el títol d'aquest tiddler NewMarkdown/Caption: nou tiddler de Markdown NewMarkdown/Hint: Genera un nou tiddler de Markdown NewTiddler/Caption: nou tiddler @@ -122,12 +122,12 @@ OpenWindow/Caption: obre en una nova finestra OpenWindow/Hint: Obre el tiddler en una nova finestra Paint/Caption: color de la tinta Paint/Hint: Trieu el color de la tinta -Palette/Caption: paleta +Palette/Caption: paleta de colors Palette/Hint: Trieu el color de la paleta Permalink/Caption: enllaç permanent -Permalink/Hint: Fés que la barra d'adreces del navegador mostri un enllaç directe cap aquest tiddler +Permalink/Hint: Mostra a la barra d'adreces, l'enllaç directe cap aquest tiddler Permaview/Caption: vista permanent -Permaview/Hint: Fés que la barra d'adreces del navegador mostri un enllaç directe cap a tots els tiddlers de la cronologia +Permaview/Hint: Mostra a la barra d'adreces, l'enllaç directe cap als tiddlers que ara es veuen Picture/Caption: imatge Picture/Hint: Inserta una imatge Preview/Caption: previsualització @@ -142,7 +142,7 @@ Refresh/Caption: actualitza Refresh/Hint: Actualitza tot el wiki RotateLeft/Caption: gira a l'esquerra RotateLeft/Hint: Gira la imatge 90 graus a l'esquerra -Save/Caption: D'acord +Save/Caption: d'acord Save/Hint: Confirma els canvis d'aquest tiddler SaveWiki/Caption: desa els canvis SaveWiki/Hint: Desa els canvis @@ -159,8 +159,8 @@ Stamp/Caption/New: Afegeix una nova plantilla Stamp/Hint: Inserta una plantilla de text Stamp/New/Text: Plantilla de text. (Recordeu afegir un text descriptiu al camp //caption//). Stamp/New/Title: Nom que es mostrarà al menú d'afegir una plantilla -StoryView/Caption: visualització de la cronologia -StoryView/Hint: Trieu la visualització de la cronologia +StoryView/Caption: mode de visualització +StoryView/Hint: mode de visualització Strikethrough/Caption: ratllat Strikethrough/Hint: Aplica el format de ratllat a la selecció Subscript/Caption: subíndex @@ -170,13 +170,13 @@ Superscript/Hint: Aplica el format de superíndex a la selecció TagManager/Caption: gestor d'etiquetes TagManager/Hint: Obre el gestor d'etiquetes Theme/Caption: tema -Theme/Hint: Tria el tema de l'aparença +Theme/Hint: Trieu el tema Timestamp/Caption: marques del temps -Timestamp/Hint: Indiqueu si les modificacions han d'actualitzar les marques del temps -Timestamp/Off/Caption: sense marques del temps -Timestamp/Off/Hint: Les modificacions no actualitzen les marques del temps -Timestamp/On/Caption: amb marques del temps -Timestamp/On/Hint: Les modificacions actualitzen les marques del temps +Timestamp/Hint: Indiqueu si voleu que s'anoti l'hora de modificació dels tiddlers +Timestamp/Off/Caption: no anotis l'hora de modificació +Timestamp/Off/Hint: No s'anota l'hora de modificació dels tiddlers +Timestamp/On/Caption: anota l'hora de modificació +Timestamp/On/Hint: S'anota l'hora de modificació dels tiddlers ToggleSidebar/Hint: Commuta la visibilitat de la barra lateral Transcludify/Caption: transclusió Transcludify/Hint: Posa la selecció entre claus diff --git a/languages/ca-ES/ControlPanel.multids b/languages/ca-ES/ControlPanel.multids index 217c0f6fd..90ef276b4 100644 --- a/languages/ca-ES/ControlPanel.multids +++ b/languages/ca-ES/ControlPanel.multids @@ -5,8 +5,9 @@ Advanced/Hint: Informació interna sobre aquest TiddlyWiki Appearance/Caption: Aparença Appearance/Hint: Formes de personalitzar l'aparença del vostre TiddlyWiki. Basics/AnimDuration/Prompt: Duració de l'animació: +Basics/AutoFocus/Prompt: Focus dels nous tiddlers Basics/Caption: Bàsic -Basics/DefaultTiddlers/BottomHint: Useu [[claudàtors dobles]] per als títols amb espais. O podeu triar <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">mantenir l'ordre de la cronologia</$button> +Basics/DefaultTiddlers/BottomHint: Useu [[claudàtors dobles]] per als títols amb espais. O trieu <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">restaura la sessió anterior en arrencar</$button> Basics/DefaultTiddlers/Prompt: Tiddlers per omissió: Basics/DefaultTiddlers/TopHint: Trieu quins tiddlers s'han de mostrar a l'inici: Basics/Language/Prompt: Bon dia! Trieu l'idioma: @@ -155,12 +156,12 @@ Settings/InfoPanelMode/Hint: Controla quan es tanca el tauler d'informació del Settings/InfoPanelMode/Popup/Description: El tauler d’informació del Tiddler es tanca automàticament Settings/InfoPanelMode/Sticky/Description: El tauler d’informació del Tiddler roman obert fins que es tanqui explícitament Settings/LinkToBehaviour/Caption: Comportament d'obertura del tiddler -Settings/LinkToBehaviour/InsideRiver/Hint: Navegació des de //dins// de la cronologia +Settings/LinkToBehaviour/InsideRiver/Hint: Forma d'obrir els nous tiddlers de la columna principal Settings/LinkToBehaviour/OpenAbove: Obre per sobre del tiddler actual Settings/LinkToBehaviour/OpenAtBottom: Obre a la part inferior de la cronologia Settings/LinkToBehaviour/OpenAtTop: Obre a la part superior de la cronologia Settings/LinkToBehaviour/OpenBelow: Obre per sota del tiddler actual -Settings/LinkToBehaviour/OutsideRiver/Hint: Navegació des de //fora// de la cronologia +Settings/LinkToBehaviour/OutsideRiver/Hint: Forma d'obrir els nous tiddlers fora de la columna principal Settings/MissingLinks/Caption: Enllaços Wiki Settings/MissingLinks/Description: Activa els enllaços als tiddlers que falten Settings/MissingLinks/Hint: Escolliu si voleu enllaçar els tiddlers que encara no existeixen @@ -176,7 +177,7 @@ Settings/NavigationHistory/Yes/Description: Actualitza l'històrial Settings/NavigationPermalinkviewMode/Caption: Mode enllaç permanent/vista permanent Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Copia l’URL de l'enllaç permanent/vista permanent al portapapers Settings/NavigationPermalinkviewMode/Hint: Trieu com es gestiona l'enllaç permanent/vista permanent -Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Actualitzeu la barra d’adreça amb l’URL de l'enllaç permanent/vista permanent +Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Poseu l’URL de l'enllaç permanent/vista permanent a la barra d’adreces Settings/PerformanceInstrumentation/Caption: Instruments del rendiment Settings/PerformanceInstrumentation/Description: Activa els instruments del rendiment Settings/PerformanceInstrumentation/Hint: Mostra les estadístiques de rendiment a la consola del desenvolupador del navegador. Cal tornar-ho a carregar per que tingui efecte @@ -193,8 +194,8 @@ Settings/ToolbarButtonStyle/Hint: Trieu l'estil per als botons de la barra d'ein Settings/ToolbarButtonStyle/Styles/Borderless: Sense vora Settings/ToolbarButtonStyle/Styles/Boxed: En caixa Settings/ToolbarButtonStyle/Styles/Rounded: Arrodonit -StoryView/Caption: Vista de la cronologia -StoryView/Prompt: Vista actual: +StoryView/Caption: Mode de visualització +StoryView/Prompt: Vista actual Stylesheets/Caption: Fulls d'estil Stylesheets/Expand/Caption: Expandeix-ho tot Stylesheets/Hint: Aquest és el CSS generat amb el full d'estils actual etiquetat amb <<tag "$:/tags/Stylesheet">> @@ -204,13 +205,13 @@ Theme/Prompt: Tema actual: TiddlerFields/Caption: Camps del tiddler TiddlerFields/Hint: Aquest és el conjunt complet de CampsDelsTiddlers utilitzats en aquest wiki (inclòs els tiddlers del sistema però sense incloure els tiddlers ombra). Toolbars/Caption: Barres d'eines -Toolbars/EditorToolbar/Caption: Barra d’eines de l’editor -Toolbars/EditorToolbar/Hint: Trieu quins botons es mostren a la barra d’eines de l’editor. Tingueu en compte que alguns botons només apareixeran en editar els tiddlers d’un determinat tipus. Podeu arrossegar i deixar els botons per canviar-ne l'ordre -Toolbars/EditToolbar/Caption: Edita la barra d'eines -Toolbars/EditToolbar/Hint: Trieu quins botons es mostren als tiddlers en mode edició -Toolbars/Hint: Trieu els botons de la barra d'eines que es mostren -Toolbars/PageControls/Caption: Barres d'eines de la pàgina -Toolbars/PageControls/Hint: Trieu quins botons es mostren a la barra d'eines de la pàgina principal -Toolbars/ViewToolbar/Caption: Mostra la barra d'eines -Toolbars/ViewToolbar/Hint: Trieu quins botons es mostren als tiddlers en mode vista +Toolbars/EditorToolbar/Caption: Barra d'eines de l'editor +Toolbars/EditorToolbar/Hint: Trieu quins botons es mostren a la barra d’eines de l’editor. Alguns botons només apareixeran en editar els tiddlers d’un determinat tipus. Podeu arrossegar i deixar anar els botons per canviar-ne l'ordre. +Toolbars/EditToolbar/Caption: Barra d'eines d'edició +Toolbars/EditToolbar/Hint: Trieu quins botons es mostren als tiddlers en mode edició. Podeu arrossegar i deixar anar els botons per canviar-ne l'ordre. +Toolbars/Hint: Trieu els botons de les barres d'eines. +Toolbars/PageControls/Caption: Barra d'eines de la pàgina +Toolbars/PageControls/Hint: Trieu quins botons es mostren a la barra d'eines de la pàgina principal. Podeu arrossegar i deixar anar els botons per canviar-ne l'ordre. +Toolbars/ViewToolbar/Caption: Barra d'eines de vista +Toolbars/ViewToolbar/Hint: Trieu quins botons es mostren als tiddlers en mode vista. Podeu arrossegar i deixar anar els botons per canviar-ne l'ordre. Tools/Download/Full/Caption: Baixa tot el wiki diff --git a/languages/ca-ES/Dates.multids b/languages/ca-ES/Dates.multids index e8ab0c60d..12ec6c8cb 100644 --- a/languages/ca-ES/Dates.multids +++ b/languages/ca-ES/Dates.multids @@ -38,18 +38,18 @@ Date/Long/Day/3: Dimarts Date/Long/Day/4: Dijous Date/Long/Day/5: Divendres Date/Long/Day/6: Dissabte -Date/Long/Month/1: de gener de -Date/Long/Month/10: octubre de -Date/Long/Month/11: de novembre de -Date/Long/Month/12: de desembre de -Date/Long/Month/2: de febrer de -Date/Long/Month/3: de març de -Date/Long/Month/4: abril de -Date/Long/Month/5: de maig de -Date/Long/Month/6: de juny de -Date/Long/Month/7: de juliol de -Date/Long/Month/8: agost de -Date/Long/Month/9: de septembre de +Date/Long/Month/1: de gener +Date/Long/Month/10: d'octubre +Date/Long/Month/11: de novembre +Date/Long/Month/12: de desembre +Date/Long/Month/2: de febrer +Date/Long/Month/3: de març +Date/Long/Month/4: d'abril de +Date/Long/Month/5: de maig +Date/Long/Month/6: de juny +Date/Long/Month/7: de juliol +Date/Long/Month/8: d'agost +Date/Long/Month/9: de septembre Date/Short/Day/0: Diu Date/Short/Day/1: Dil Date/Short/Day/2: Dim diff --git a/languages/ca-ES/Docs/ModuleTypes.multids b/languages/ca-ES/Docs/ModuleTypes.multids index a1b5df69f..4910c3f9f 100644 --- a/languages/ca-ES/Docs/ModuleTypes.multids +++ b/languages/ca-ES/Docs/ModuleTypes.multids @@ -16,7 +16,7 @@ parser: Analitzadors sintàctics per a diferents tipus de continguts. route: Defineix com el servidor HTTP integrat gestiona els patrons d’URL individuals. saver: Els gestors de baixades (saver) ofereixen diferents mètodes per a desar fitxers des del navegador. startup: Funcions de l'inici -storyview: Les vistes de la cronologia personalitzen l'animació i el comportament dels widgets llista. +storyview: El mode de visualització permet personalizar l'animació i el comportament de les llistes texteditoroperation: Una operació de la barra d'eines de l'editor de text. tiddlerdeserializer: Converteix diferents tipus de contingut a tiddlers. tiddlerfield: Defineix el comportament d'un camp individual d'un tiddler. diff --git a/languages/ca-ES/EditTemplate.multids b/languages/ca-ES/EditTemplate.multids index 4b0a5c8b8..705e41175 100644 --- a/languages/ca-ES/EditTemplate.multids +++ b/languages/ca-ES/EditTemplate.multids @@ -2,7 +2,7 @@ title: $:/language/EditTemplate/ Body/External/Hint: Aquest és un tiddler extern desat fora del fitxer del TiddlyWiki principal. Podeu editar les etiquetes i camps però no podeu editar directament el seu contingut Body/Placeholder: Escriviu el text per aquest tiddler -Body/Preview/Type/Output: s +Body/Preview/Type/Output: resultat Field/Dropdown/Caption: llista de camps Field/Dropdown/Hint: Mostra la llista de camps Field/Remove/Caption: suprimeix el camp diff --git a/languages/ca-ES/Fields.multids b/languages/ca-ES/Fields.multids index b67e5e3fc..8557606a7 100644 --- a/languages/ca-ES/Fields.multids +++ b/languages/ca-ES/Fields.multids @@ -2,37 +2,37 @@ title: $:/language/Docs/Fields/ _canonical_uri: La URI sencera d'una imatge externa al tiddler _is_skinny: Si està present, indica que el camp de text del tiddler s'ha de carregar des del servidor -bag: El nom de la bossa de la que va venir un tiddler +bag: El nom del paquet del que prové el tiddler caption: El text que es mostrarà en una pestanya o botó color: El valor del color CSS associat amb un tiddler component: El nom del component responsable d'un [[tiddler d'avís|AlertMechanism]] created: La data en que es va generar el tiddler creator: El nom de la persona que va generar el tiddler current-tiddler: Utilitzat per desar la darrera còpia del tiddler de l'[[històrial|HistoryMechanism]] -dependents: Per a un connector, llista els títols que depenen del connector +dependents: Per a un connector, llista els títols dels connectors que en depenen description: El text que descriu un connector, o un diàleg modal draft.of: Per als tiddlers esborranys, conté el títol del tiddler del qual és un esborrany draft.title: Per als tiddlers esborranys, conté el títol proposat per al tiddler -footer: El text del peu d'un assistent +footer: El peu de text d'un giny hide-body: El valor de la plantilla de vista amaga el cos dels tiddlers és: ''sí'' icon: El títol del tiddler que conté la icona associada amb el tiddler -library: Si està a "si" indica que un tiddler s'ha desar com una biblioteca de JavaScript -list: Una llista ordenada de títols de tiddlers associats amb un tiddler -list-after: Si està activat, el títol del tiddler després del qual aquest tiddler s'hauria d'afegir a la llista ordenada de títols de tiddler -list-before: Si està activat, el títol del tiddler abans del qual aquest tiddler s'hauria d'afegir a la llista ordenada de títols de tiddler, o a l'inici de la llista si aquest camp hi és però està buit +library: Si és ''si'' indica que un tiddler s'ha desar com una biblioteca de JavaScript +list: Una llista ordenada dels títols dels tiddlers associats amb un tiddler +list-after: Si està activat, el títol del tiddler després del qual, aquest tiddler s'hauria d'afegir a la llista ordenada de títols de tiddler, o al final de la llista aquest camp hi és però és buit +list-before: Si està activat, el títol del tiddler abans del qual, aquest tiddler s'hauria d'afegir a la llista ordenada de títols de tiddler, o a l'inici de la llista si aquest camp hi és però està buit modified: La data i hora a la que un tiddler es va modificar per darrer cop modifier: El títol del tiddler associat amb la persona que va modificar per darrer cop un tiddler name: El nom llegible pels humans associat a un tiddler connector plugin-priority: Un valor numèric que indica la prioritat d'un tiddler connector plugin-type: El tipus de connector d'un tiddler connector -released: La data de llançament del TiddlyWiki +released: La data de la versió de TiddlyWiki revision: La revisió del tiddler que es manté al servidor source: La URL orígen associada a un tiddler subtitle: El text del subtítol d'un assistent -tags: Una llista d'etiquetes associades a un tiddler +tags: La llista d'etiquetes associades a un tiddler text: El text del cos d'un tiddler throttle.refresh: Si està present, l’acceleració actualitza aquest tiddler title: El nom únic d'un tiddler -toc-link: El valor de Suprimeix l'enllaç del tiddler a l'Índex està a: ''no'' +toc-link: Si és no, suprimeix l'enllaç del tiddler a l'Índex type: El tipus de contingut d'un tiddler version: Informació de la versió d'un connector diff --git a/languages/ca-ES/Misc.multids b/languages/ca-ES/Misc.multids index 616b1edb2..814270edc 100644 --- a/languages/ca-ES/Misc.multids +++ b/languages/ca-ES/Misc.multids @@ -67,6 +67,6 @@ TagManager/Icon/Heading: Icona TagManager/Icons/None: Cap TagManager/Info/Heading: Informació TagManager/Tag/Heading: Etiqueta -Tiddler/DateFormat: DD MMM YYYY a les hh12:0mm am +Tiddler/DateFormat: DD MMM de YYYY a les hh12:0mm am UnsavedChangesWarning: Teniu canvis sense desar al TiddlyWiki Yes: Sí diff --git a/languages/ca-ES/SideBar.multids b/languages/ca-ES/SideBar.multids index bc1232f56..703d27dc7 100644 --- a/languages/ca-ES/SideBar.multids +++ b/languages/ca-ES/SideBar.multids @@ -6,7 +6,7 @@ Drafts/Caption: Esborranys Explorer/Caption: Explorador Missing/Caption: Falten More/Caption: Més -Open/Caption: Obre +Open/Caption: Obert Orphans/Caption: Orfes Shadows/Caption: Ombres System/Caption: Sistema From f760a2fa796d57e61307a5ea5274d6cd0b6484c7 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 18 Jun 2020 11:49:59 +0100 Subject: [PATCH 0717/2376] Add old tiddler to th-saving-tiddler hook Addresses https://github.com/Jermolene/TiddlyWiki5/pull/4434#issuecomment-645939182 --- core/modules/widgets/navigator.js | 2 +- editions/dev/tiddlers/new/th-saving-tiddler.tid | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 7a19ed9e0..8aff417cf 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -320,7 +320,7 @@ NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) { "draft.title": undefined, "draft.of": undefined },this.wiki.getModificationFields()); - newTiddler = $tw.hooks.invokeHook("th-saving-tiddler",newTiddler); + newTiddler = $tw.hooks.invokeHook("th-saving-tiddler",newTiddler,tiddler); this.wiki.addTiddler(newTiddler); // If enabled, relink references to renamed tiddler var shouldRelink = this.getAttribute("relinkOnRename","no").toLowerCase().trim() === "yes"; diff --git a/editions/dev/tiddlers/new/th-saving-tiddler.tid b/editions/dev/tiddlers/new/th-saving-tiddler.tid index 81b0a54d5..dbcd33eec 100644 --- a/editions/dev/tiddlers/new/th-saving-tiddler.tid +++ b/editions/dev/tiddlers/new/th-saving-tiddler.tid @@ -1,5 +1,5 @@ created: 20150908150314994 -modified: 20170209145506427 +modified: 20200618114855781 tags: HookMechanism title: Hook: th-saving-tiddler type: text/vnd.tiddlywiki @@ -8,7 +8,8 @@ This hook allows plugins to inspect or modify tiddlers before they are saved via Hook function parameters: -* ''tiddler'': tiddler object about to be saved +* ''newTiddler'': tiddler object about to be saved +* ''oldTiddler'': tiddler object of draft tiddler that is being saved (from v5.1.23) Return value: From a689f3197844e52dfaa887234270cff9a0607d0d Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 19 Jun 2020 12:07:03 +0200 Subject: [PATCH 0718/2376] Allow toggling relink in tm-rename-tiddler (#4719) * Allow toggling relink in tm-rename-tiddler * Updated docs for tm-rename-tiddler --- core/modules/widgets/navigator.js | 7 ++++-- .../WidgetMessage_ tm-rename-tiddler.tid | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 8aff417cf..30f2cb633 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -609,10 +609,13 @@ NavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) { }; NavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) { - var paramObject = event.paramObject || {}, + var options = {}, + paramObject = event.paramObject || {}, from = paramObject.from || event.tiddlerTitle, to = paramObject.to; - this.wiki.renameTiddler(from,to); + options.dontRenameInTags = (paramObject.dontRenameInTags === "true" || paramObject.dontRenameInTags === "yes") ? true : false; + options.dontRenameInLists = (paramObject.dontRenameInLists === "true" || paramObject.dontRenameInLists === "yes") ? true : false; + this.wiki.renameTiddler(from,to,options); }; exports.navigator = NavigatorWidget; diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid index f97a9aaee..fa7fa1bc1 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid @@ -10,5 +10,27 @@ The `tm-rename-tiddler` message renames a tiddler by deleting it and recreating |!Name |!Description | |from |Current title of tiddler | |to |New title of tiddler | +|dontRenameInTags |<<.from-version "5.1.23">> Optional value "yes" to disable renaming in tags fields of other tiddlers (defaults to "no") | +|dontRenameInLists |<<.from-version "5.1.23">> Optional value "yes" to disable renaming in list fields of other tiddlers (defaults to "no") | The rename tiddler message is usually generated with the ButtonWidget and is handled by the NavigatorWidget. + +! Examples + +To rename a tiddler called Tiddler1 to Tiddler2 and also renaming Tiddler1 in tags and list fields of other tiddlers: + +``` +<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" /> +``` + +To rename a tiddler called Tiddler1 to Tiddler2 and not rename Tiddler1 in tags and list fields of other tiddlers: + +``` +<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" dontRenameInTags="yes" dontRenameInLists="yes"/> +``` + +To rename a tiddler called Tiddler1 to Tiddler2 and respect the setting $:/config/RelinkOnRename for whether to rename Tiddler1 in tags and list fields of other tiddlers: + +``` +<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" dontRenameInTags={{$:/config/RelinkOnRename}} dontRenameInLists={{$:/config/RelinkOnRename}}/> +``` From 24ef51df01cc0db05b35be85cbfbccf941697c21 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 19 Jun 2020 19:05:08 +0200 Subject: [PATCH 0719/2376] Revert "Allow toggling relink in tm-rename-tiddler (#4719)" (#4722) This reverts commit a689f3197844e52dfaa887234270cff9a0607d0d. --- core/modules/widgets/navigator.js | 7 ++---- .../WidgetMessage_ tm-rename-tiddler.tid | 22 ------------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 30f2cb633..8aff417cf 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -609,13 +609,10 @@ NavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) { }; NavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) { - var options = {}, - paramObject = event.paramObject || {}, + var paramObject = event.paramObject || {}, from = paramObject.from || event.tiddlerTitle, to = paramObject.to; - options.dontRenameInTags = (paramObject.dontRenameInTags === "true" || paramObject.dontRenameInTags === "yes") ? true : false; - options.dontRenameInLists = (paramObject.dontRenameInLists === "true" || paramObject.dontRenameInLists === "yes") ? true : false; - this.wiki.renameTiddler(from,to,options); + this.wiki.renameTiddler(from,to); }; exports.navigator = NavigatorWidget; diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid index fa7fa1bc1..f97a9aaee 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid @@ -10,27 +10,5 @@ The `tm-rename-tiddler` message renames a tiddler by deleting it and recreating |!Name |!Description | |from |Current title of tiddler | |to |New title of tiddler | -|dontRenameInTags |<<.from-version "5.1.23">> Optional value "yes" to disable renaming in tags fields of other tiddlers (defaults to "no") | -|dontRenameInLists |<<.from-version "5.1.23">> Optional value "yes" to disable renaming in list fields of other tiddlers (defaults to "no") | The rename tiddler message is usually generated with the ButtonWidget and is handled by the NavigatorWidget. - -! Examples - -To rename a tiddler called Tiddler1 to Tiddler2 and also renaming Tiddler1 in tags and list fields of other tiddlers: - -``` -<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" /> -``` - -To rename a tiddler called Tiddler1 to Tiddler2 and not rename Tiddler1 in tags and list fields of other tiddlers: - -``` -<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" dontRenameInTags="yes" dontRenameInLists="yes"/> -``` - -To rename a tiddler called Tiddler1 to Tiddler2 and respect the setting $:/config/RelinkOnRename for whether to rename Tiddler1 in tags and list fields of other tiddlers: - -``` -<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" dontRenameInTags={{$:/config/RelinkOnRename}} dontRenameInLists={{$:/config/RelinkOnRename}}/> -``` From 791100797356fec1338f702a0ee83c8ca482fb66 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 19 Jun 2020 19:20:25 +0200 Subject: [PATCH 0720/2376] Revised: toggling relink in tm-rename-tiddler (#4723) * switch boolean logic in new parameters Use renameinTags and renameInLists instead of dontRenameInTags and dontRenameInLists respectively. This avoids users having to think through double negatives, as well as corresponds better to the setting in $:/config/RelinkOnRename * Updated docs for revised parameters for tm-new-tiddler --- core/modules/widgets/navigator.js | 7 ++++-- .../WidgetMessage_ tm-rename-tiddler.tid | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 8aff417cf..4e7a871e0 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -609,10 +609,13 @@ NavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) { }; NavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) { - var paramObject = event.paramObject || {}, + var options = {}, + paramObject = event.paramObject || {}, from = paramObject.from || event.tiddlerTitle, to = paramObject.to; - this.wiki.renameTiddler(from,to); + options.dontRenameInTags = (paramObject.renameInTags === "false" || paramObject.renameInTags === "no") ? true : false; + options.dontRenameInLists = (paramObject.renameInLists === "false" || paramObject.renameInLists === "no") ? true : false; + this.wiki.renameTiddler(from,to,options); }; exports.navigator = NavigatorWidget; diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid index f97a9aaee..d18f523e6 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-rename-tiddler.tid @@ -10,5 +10,27 @@ The `tm-rename-tiddler` message renames a tiddler by deleting it and recreating |!Name |!Description | |from |Current title of tiddler | |to |New title of tiddler | +|renameInTags |<<.from-version "5.1.23">> Optional value "no" to disable renaming in tags fields of other tiddlers (defaults to "yes") | +|renameInLists |<<.from-version "5.1.23">> Optional value "no" to disable renaming in list fields of other tiddlers (defaults to "yes") | The rename tiddler message is usually generated with the ButtonWidget and is handled by the NavigatorWidget. + +! Examples + +To rename a tiddler called Tiddler1 to Tiddler2 and also renaming Tiddler1 in tags and list fields of other tiddlers: + +``` +<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" /> +``` + +To rename a tiddler called Tiddler1 to Tiddler2 and not rename Tiddler1 in tags and list fields of other tiddlers: + +``` +<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" renameInTags="no" renameInLists="no"/> +``` + +To rename a tiddler called Tiddler1 to Tiddler2 and respect the setting in the tiddler $:/config/RelinkOnRename for whether to rename Tiddler1 in tags and list fields of other tiddlers: + +``` +<$action-sendmessage $message="tm-rename-tiddler" from="Tiddler1" to="Tiddler2" renameInTags={{$:/config/RelinkOnRename}} renameInLists={{$:/config/RelinkOnRename}}/> +``` From 3de6c95fd6d4b0b1cd77addcbe3d8b038ec4cabe Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 19 Jun 2020 19:06:21 +0100 Subject: [PATCH 0721/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.23.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 43a9221fc..2c65339ef 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -54,6 +54,8 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52]] [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df]] support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe]] support for SVG favicons +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/f760a2fa796d57e61307a5ea5274d6cd0b6484c7]] `th-saving-tiddler` hook to include information about the draft tiddler (see https://tiddlywiki.com/dev/#Hook%3A%20th-saving-tiddler) +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4723]] [[WidgetMessage: tm-rename-tiddler]] to control whether relinking occurs ! Bug Fixes From 4a84ed0018df7fd67000404bb5ef8a7ca50509c1 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Jun 2020 11:31:54 +0100 Subject: [PATCH 0722/2376] Add new "Consent Banner" plugin, and update Google Analytics plugin to use it --- plugins/tiddlywiki/consent-banner/banner.tid | 28 +++++++ .../consent-banner/buttons/accept.tid | 6 ++ .../consent-banner/buttons/decline.tid | 6 ++ plugins/tiddlywiki/consent-banner/config.tid | 42 ++++++++++ .../consent-banner/config/buttons.multids | 8 ++ .../config/cookie-consent-required.tid | 2 + .../config/greeting-message.tid | 19 +++++ plugins/tiddlywiki/consent-banner/plugin.info | 6 ++ plugins/tiddlywiki/consent-banner/readme.tid | 44 +++++++++++ plugins/tiddlywiki/consent-banner/startup.js | 68 ++++++++++++++++ plugins/tiddlywiki/consent-banner/styles.tid | 79 +++++++++++++++++++ .../consent-banner/youtube-macros.tid | 19 +++++ .../googleanalytics/googleanalytics.js | 50 +++++++++--- plugins/tiddlywiki/googleanalytics/readme.tid | 2 + 14 files changed, 366 insertions(+), 13 deletions(-) create mode 100644 plugins/tiddlywiki/consent-banner/banner.tid create mode 100644 plugins/tiddlywiki/consent-banner/buttons/accept.tid create mode 100644 plugins/tiddlywiki/consent-banner/buttons/decline.tid create mode 100644 plugins/tiddlywiki/consent-banner/config.tid create mode 100644 plugins/tiddlywiki/consent-banner/config/buttons.multids create mode 100644 plugins/tiddlywiki/consent-banner/config/cookie-consent-required.tid create mode 100644 plugins/tiddlywiki/consent-banner/config/greeting-message.tid create mode 100644 plugins/tiddlywiki/consent-banner/plugin.info create mode 100644 plugins/tiddlywiki/consent-banner/readme.tid create mode 100644 plugins/tiddlywiki/consent-banner/startup.js create mode 100644 plugins/tiddlywiki/consent-banner/styles.tid create mode 100644 plugins/tiddlywiki/consent-banner/youtube-macros.tid diff --git a/plugins/tiddlywiki/consent-banner/banner.tid b/plugins/tiddlywiki/consent-banner/banner.tid new file mode 100644 index 000000000..e9fcaba07 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/banner.tid @@ -0,0 +1,28 @@ +title: $:/plugins/tiddlywiki/consent-banner/banner +tags: $:/tags/PageTemplate + +\whitespace trim + +<$reveal state="$:/state/consent-banner/accepted" type="match" text="" tag="div"> + +<div class="tc-consent-backdrop"> + +</div> + +<div class="tc-consent-banner tc-consent-banner-left"> + +<$transclude tiddler="$:/config/plugins/tiddlywiki/consent-banner/greeting-message" mode="block"/> + +<div class="tc-consent-buttons"> + +<$list filter="[all[shadows+tiddlers]tag[$:/tags/ConsentBanner/Button]]"> + +<$transclude tiddler=<<currentTiddler>> mode="inline"/> + +</$list> + +</div> + +</div> + +</$reveal> diff --git a/plugins/tiddlywiki/consent-banner/buttons/accept.tid b/plugins/tiddlywiki/consent-banner/buttons/accept.tid new file mode 100644 index 000000000..69066b8b3 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/buttons/accept.tid @@ -0,0 +1,6 @@ +title: $:/plugins/tiddlywiki/consent-banner/buttons/accept +tags: $:/tags/ConsentBanner/Button + +<$button message="tm-consent-accept" class="tc-consent-button tc-consent-button-default tc-btn-invisible" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint}}> +{{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption}} +</$button> diff --git a/plugins/tiddlywiki/consent-banner/buttons/decline.tid b/plugins/tiddlywiki/consent-banner/buttons/decline.tid new file mode 100644 index 000000000..681512af8 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/buttons/decline.tid @@ -0,0 +1,6 @@ +title: $:/plugins/tiddlywiki/consent-banner/buttons/decline +tags: $:/tags/ConsentBanner/Button + +<$button message="tm-consent-decline" class="tc-consent-button tc-btn-invisible" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint}}> +{{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption}} +</$button> diff --git a/plugins/tiddlywiki/consent-banner/config.tid b/plugins/tiddlywiki/consent-banner/config.tid new file mode 100644 index 000000000..66ede01ce --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config.tid @@ -0,0 +1,42 @@ +title: $:/plugins/tiddlywiki/consent-banner/config + +! [[Greeting Message|$:/config/plugins/tiddlywiki/consent-banner/greeting-message]] + +<div style=""> + +<div style="display:inline-block;vertical-align:top;width:45%;"> + +<$edit-text tiddler="$:/config/plugins/tiddlywiki/consent-banner/greeting-message" tag="textarea" class="tc-edit-texteditor"/> + +</div> + +<div style="display:inline-block;vertical-align:top;width:45%;margin:0.5em;border:1px solid black;padding:0.5em;" class="tc-consent-banner"> + +<$transclude tiddler="$:/config/plugins/tiddlywiki/consent-banner/greeting-message" mode="block"/> + +</div> + +</div> + +! Buttons + +|[[Accept caption|$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption]] |<$edit-text tiddler="$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption" tag="input"/> | +|[[Accept hint|$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint]] |<$edit-text tiddler="$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint" tag="input"/> | +|[[Decline caption|$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption]] |<$edit-text tiddler="$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption" tag="input"/> | +|[[Decline hint|$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint]] |<$edit-text tiddler="$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint" tag="input"/> | + +! [[Consent Accepted Status|$:/state/consent-banner/accepted]] + +Current status: {{$:/state/consent-banner/accepted}} (blank indicates that consent has not yet been granted or declined) + +<$button message="tm-consent-accept" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/hint}}> +{{$:/config/plugins/tiddlywiki/consent-banner/buttons/accept/caption}} +</$button> + +<$button message="tm-consent-decline" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/hint}}> +{{$:/config/plugins/tiddlywiki/consent-banner/buttons/decline/caption}} +</$button> + +<$button message="tm-consent-clear" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint}}> +{{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption}} +</$button> diff --git a/plugins/tiddlywiki/consent-banner/config/buttons.multids b/plugins/tiddlywiki/consent-banner/config/buttons.multids new file mode 100644 index 000000000..14f5a9993 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/buttons.multids @@ -0,0 +1,8 @@ +title: $:/config/plugins/tiddlywiki/consent-banner/buttons/ + +accept/caption: Accept +accept/hint: Accept cookies +clear/caption: Clear +clear/hint: Clear cookies +decline/caption: Decline +decline/hint: Decline cookies diff --git a/plugins/tiddlywiki/consent-banner/config/cookie-consent-required.tid b/plugins/tiddlywiki/consent-banner/config/cookie-consent-required.tid new file mode 100644 index 000000000..4d388bbe3 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/cookie-consent-required.tid @@ -0,0 +1,2 @@ +title: $:/config/cookie-consent-required +text: yes \ No newline at end of file diff --git a/plugins/tiddlywiki/consent-banner/config/greeting-message.tid b/plugins/tiddlywiki/consent-banner/config/greeting-message.tid new file mode 100644 index 000000000..38de3c9b1 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/greeting-message.tid @@ -0,0 +1,19 @@ +title: $:/config/plugins/tiddlywiki/consent-banner/greeting-message + +! Our use of cookies + +We use necessary cookies to make our site work. We’d also like to set optional analytics to help us improve it. We won’t set optional cookies unless you enable them. Using this tool will set a cookie on your device to remember your preferences. + +--- + +!! Necessary cookies + +Necessary cookies enable core functionality such as security, network management, and accessibility. You may disable these by changing your browser settings, but this may affect how the website functions. + +--- + +!! Analytics cookies + +We’d like to set non-essential cookies, such as Google Analytics, to help us to improve our website by collecting and reporting information on how you use it. The cookies collect information in a way that does not directly identify anyone. + +--- diff --git a/plugins/tiddlywiki/consent-banner/plugin.info b/plugins/tiddlywiki/consent-banner/plugin.info new file mode 100644 index 000000000..815290d90 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/plugin.info @@ -0,0 +1,6 @@ +{ + "title": "$:/plugins/tiddlywiki/consent-banner", + "name": "Consent Banner", + "description": "Consent banner for GDPR etc", + "list": "readme youtube config" +} diff --git a/plugins/tiddlywiki/consent-banner/readme.tid b/plugins/tiddlywiki/consent-banner/readme.tid new file mode 100644 index 000000000..16094080b --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/readme.tid @@ -0,0 +1,44 @@ +title: $:/plugins/tiddlywiki/consent-banner/readme + +! Introduction + +The ''consent-banner'' plugin helps make websites that are compliant with "cookie legislation" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]]. + +! Overview + +This plugin presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits. Consent status is also available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies. + +If the same wiki is opened in multiple tabs then once the warning has been accepted or declined in one tab then the other tabs will autonatically follow suit. + +Consent is automatically granted if the user logged in (ie the tiddler [[$:/status/IsLoggedIn]] is set to `yes`). + +Please note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice. + +! ~YouTube macro + +A simple macro for embedding ~YouTube videos is provided to show how to adapt content according to whether consent has been granted. It works by checking the tiddler [[$:/state/consent-banner/accepted]] for the following values: + +* ''empty or missing'' - the user has yet to accept or decline to give their consent +* `yes` - the user has granted consent +* `no` - the user has declined consent + +! Customising banner buttons + +The [["accept"|$:/plugins/tiddlywiki/consent-banner/buttons/accept]] and [["decline"|$:/plugins/tiddlywiki/consent-banner/buttons/decline]] buttons in the banner are individual tiddlers with the tag [[$:/tags/ConsentBanner/Button]], allowing them to be customised and extended. + +A common use case is to add a "login" button allowing users to login directly to bypass the banner. This could be implemented as a tiddler tagged [[$:/tags/ConsentBanner/Button]] with the following text: + +``` +<$button message="tm-login" class="tc-consent-button tc-btn-invisible"> +Login +</$button> +``` + +! Integration with other plugins + +Third party plugins that set cookies can configure themselves to defer setting cookies until the user grants consent. There are several parts to this mechanism: + +* The consent-banner plugin includes a shadow tiddler [[$:/config/cookie-consent-required]] with the text `yes`. The third-party plugin should inspect this tiddler at startup; if it is not set to "yes" then it can proceed to set tiddlers immediately +* Otherwise, the third-party plugin should listen for changes to the tiddler [[$:/state/consent-banner/accepted]] and only start setting cookies when and if the value changes to "yes" + +The [[Google Analytics plugin|https://github.com/Jermolene/TiddlyWiki5/tree/master/plugins/tiddlywiki/googleanalytics]] shows an example of how this mechanism can be implemented. diff --git a/plugins/tiddlywiki/consent-banner/startup.js b/plugins/tiddlywiki/consent-banner/startup.js new file mode 100644 index 000000000..a65db100b --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/startup.js @@ -0,0 +1,68 @@ +/*\ +title: $:/plugins/tiddlywiki/consent-banner/startup.js +type: application/javascript +module-type: startup + +Startup initialisation + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +// Export name and synchronous status +exports.name = "consent-banner"; +exports.platforms = ["browser"]; +exports.after = ["startup"]; +exports.synchronous = true; + +var CHECK_CONSENT_INTERVAL = 1000, // Milliseconds between checking local storage + IS_LOGGED_IN_TITLE = "$:/status/IsLoggedIn", + CONSENT_KEY = "COOKIE_CONSENT", // Local storage keyname + CONSENT_TITLE = "$:/state/consent-banner/accepted"; // "": undeclared, "yes": accepted, "no": declined + +exports.startup = function() { + var self = this, + consentState = "", + setConsentStatus = function(state) { + if(consentState !== state) { + consentState = state; + // Write to local storage + window.localStorage.setItem(CONSENT_KEY,state); + // Write to a state tiddler + $tw.wiki.addTiddler(new $tw.Tiddler({ + title: CONSENT_TITLE, + text: state + })); + } + }, + calculateConsentStatus = function() { + // Consent is implied for logged in users, otherwise we check local storage + return ($tw.wiki.getTiddlerText(IS_LOGGED_IN_TITLE) === "yes" && "yes") || window.localStorage.getItem(CONSENT_KEY) || ""; + }, + checkConsentStatus = function() { + setConsentStatus(calculateConsentStatus()); + if(consentState === "") { + pollConsentStatus(); + } + }, + pollConsentStatus = function() { + setTimeout(checkConsentStatus,CHECK_CONSENT_INTERVAL); + }; + // Set the current constant status + checkConsentStatus(); + // Listen for tm-clear-browser-storage messages + $tw.rootWidget.addEventListener("tm-consent-accept",function(event) { + setConsentStatus("yes"); + }); + $tw.rootWidget.addEventListener("tm-consent-decline",function(event) { + setConsentStatus("no"); + }); + $tw.rootWidget.addEventListener("tm-consent-clear",function(event) { + setConsentStatus(""); + }); +}; + +})(); diff --git a/plugins/tiddlywiki/consent-banner/styles.tid b/plugins/tiddlywiki/consent-banner/styles.tid new file mode 100644 index 000000000..f8c969f14 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/styles.tid @@ -0,0 +1,79 @@ +title: $:/plugins/tiddlywiki/consent-banner/styles +tags: $:/tags/Stylesheet + +.tc-consent-backdrop { + z-index: 1999; + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + background: rgba(0,0,0,0.2); +} + +.tc-consent-banner-left { + z-index: 2000; + position: fixed; + left: 0; + top: 0; + bottom: 0; + max-width: 500px; + overflow-y: auto; +} + +.tc-consent-banner { + padding: 1em; + background: #009677; + color: #fff; + box-shadow: 0 0 20px rgba(0,0,0,.2); +} + +.tc-consent-banner a.tc-tiddlylink-external { + text-decoration: underline; + color: #fff; + background-color: inherit; +} + +.tc-consent-banner a.tc-tiddlylink-external:visited { + color: #fff; + background-color: inherit; +} + +.tc-consent-banner hr { + clear: both; + padding: 0; + width: 100%; + overflow: hidden; + text-align: left; + border: 0 none; + margin: 24px 0; + height: 1px; + max-height: 1px; + background: rgba(255,255,255,.25); +} + +.tc-consent-buttons { + +} + +.tc-consent-button { + border: 1px solid #fff; + margin-right: 1em; + margin-top: 1em; + padding: 0.75em 1.5em; + color: #fff; + background: transparent; + font-weight: bold; +} + +.tc-consent-button:hover { + color: #009577; + border-color: #fff; + background: #fff; + opacity: .6; +} + +.tc-consent-button-default { + color: #009677; + background: #fff; +} \ No newline at end of file diff --git a/plugins/tiddlywiki/consent-banner/youtube-macros.tid b/plugins/tiddlywiki/consent-banner/youtube-macros.tid new file mode 100644 index 000000000..78fced22d --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/youtube-macros.tid @@ -0,0 +1,19 @@ +title: $:/plugins/tiddlywiki/consent-banner/youtube +tags: $:/tags/Macro + +\define embed-video-with-consent(code) +<$reveal state="$:/state/consent-banner/accepted" type="match" text="yes" tag="div"> +<iframe width="560" height="315" src="https://www.youtube.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> +</$reveal> +<$reveal state="$:/state/consent-banner/accepted" type="nomatch" text="yes" tag="div"> +<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> +</$reveal> +\end + +! Macro source + +<$codeblock code={{$:/plugins/tiddlywiki/consent-banner/youtube}}/> + +! Example + +<<embed-video-with-consent KtCUr83XgyE>> diff --git a/plugins/tiddlywiki/googleanalytics/googleanalytics.js b/plugins/tiddlywiki/googleanalytics/googleanalytics.js index a3f48a321..1634e465b 100644 --- a/plugins/tiddlywiki/googleanalytics/googleanalytics.js +++ b/plugins/tiddlywiki/googleanalytics/googleanalytics.js @@ -17,20 +17,44 @@ exports.name = "google-analytics"; exports.platforms = ["browser"]; exports.synchronous = true; +var CONFIG_CONSENT_REQUIRED_TITLE = "$:/config/cookie-consent-required", + CONSENT_TITLE = "$:/state/consent-banner/accepted"; // "": undeclared, "yes": accepted, "no": declined + exports.startup = function() { - // getting parameters - var GA_ACCOUNT = $tw.wiki.getTiddlerText("$:/GoogleAnalyticsAccount","").replace(/\n/g,""), - GA_DOMAIN = $tw.wiki.getTiddlerText("$:/GoogleAnalyticsDomain","").replace(/\n/g,""); - if (GA_DOMAIN == "" || GA_DOMAIN == undefined) GA_DOMAIN = "auto"; - - // using ga "isogram" function - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); - - ga('create', GA_ACCOUNT, GA_DOMAIN); - ga('send', 'pageview'); + var hasInitialised = false, + initialiseGoogleAnalytics = function() { + console.log("Initialising Google Analytics"); + hasInitialised = true; + var gaAccount = $tw.wiki.getTiddlerText("$:/GoogleAnalyticsAccount","").replace(/\n/g,""), + gaDomain = $tw.wiki.getTiddlerText("$:/GoogleAnalyticsDomain","auto").replace(/\n/g,""); + // Using ga "isogram" function + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + ga('create',gaAccount,gaDomain); + ga('send','pageview'); + }; + // Initialise now if consent isn't required + if($tw.wiki.getTiddlerText(CONFIG_CONSENT_REQUIRED_TITLE) !== "yes") { + initialiseGoogleAnalytics(); + } else { + // Or has been granted already + if($tw.wiki.getTiddlerText(CONSENT_TITLE) === "yes") { + initialiseGoogleAnalytics(); + } else { + // Or when our config tiddler changes + $tw.wiki.addEventListener("change",function(changes) { + if(changes[CONSENT_TITLE]) { + if(!hasInitialised && $tw.wiki.getTiddlerText(CONSENT_TITLE) === "yes") { + initialiseGoogleAnalytics(); + } + } + }); + } + } }; + + })(); diff --git a/plugins/tiddlywiki/googleanalytics/readme.tid b/plugins/tiddlywiki/googleanalytics/readme.tid index 8a94012eb..f10803be1 100644 --- a/plugins/tiddlywiki/googleanalytics/readme.tid +++ b/plugins/tiddlywiki/googleanalytics/readme.tid @@ -2,4 +2,6 @@ title: $:/plugins/tiddlywiki/googleanalytics/readme This plugin enables you to use Google Analytics to track access to your online TiddlyWiki document. Based upon the [[official Google code|https://developers.google.com/analytics/devguides/collection/analyticsjs]]. +By default, the user is not asked for permission before initialising Google Analytics. This plugin also optionally integrates with the "Consent Banner" plugin (also found in the official plugin library) so that Google Analytics is not initialised until the user grants explicit permission. + [[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/googleanalytics]] From c57bdc46f4255243df18c323153547745316b3d3 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Jun 2020 11:35:31 +0100 Subject: [PATCH 0723/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.23.tid | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 2c65339ef..38eda873c 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -10,13 +10,10 @@ type: text/vnd.tiddlywiki ! Major Improvements -! Translation Improvements - -* Catalan -* Chinese - -! Plugin Improvements +! New and Improved Plugins +* Consent Banner Plugin +** [[New|https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1]] plugin to help make websites compliant with cookie legislation by displaying a consent banner * JSZip Plugin ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser * Freelinks Plugin @@ -32,6 +29,11 @@ type: text/vnd.tiddlywiki ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebraks +! Translation Improvements + +* Catalan +* Chinese + ! Performance Improvements * From 4d2d6cc81827be29d7b33cd72e83d76b484205f1 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Jun 2020 12:25:55 +0100 Subject: [PATCH 0724/2376] Consent banner: Use palette colours --- .../config/DefaultColourMappings.multids | 15 ++++++++++ plugins/tiddlywiki/consent-banner/readme.tid | 18 +++++++++++ plugins/tiddlywiki/consent-banner/styles.tid | 30 +++++++++---------- 3 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 plugins/tiddlywiki/consent-banner/config/DefaultColourMappings.multids diff --git a/plugins/tiddlywiki/consent-banner/config/DefaultColourMappings.multids b/plugins/tiddlywiki/consent-banner/config/DefaultColourMappings.multids new file mode 100644 index 000000000..221d8488b --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/DefaultColourMappings.multids @@ -0,0 +1,15 @@ +title: $:/config/DefaultColourMappings/ + +consent-banner-backdrop-background: rgba(0,0,0,0.2) +consent-banner-background: #009677 +consent-banner-button-background: transparent +consent-banner-button-border: #fff +consent-banner-button-default-background: #fff +consent-banner-button-default-foreground: #009677 +consent-banner-button-foreground: #fff +consent-banner-button-hover-background: #fff +consent-banner-button-hover-border: #fff +consent-banner-button-hover-foreground: #009577 +consent-banner-foreground: #fff +consent-banner-hr-background: rgba(255,255,255,.25) +consent-banner-link-foreground: #fff \ No newline at end of file diff --git a/plugins/tiddlywiki/consent-banner/readme.tid b/plugins/tiddlywiki/consent-banner/readme.tid index 16094080b..26a526bae 100644 --- a/plugins/tiddlywiki/consent-banner/readme.tid +++ b/plugins/tiddlywiki/consent-banner/readme.tid @@ -14,6 +14,24 @@ Consent is automatically granted if the user logged in (ie the tiddler [[$:/stat Please note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice. +! Consent Banner Palette Entries + +Add these entries to your current colour palette to change the colours used by the consent banner: + +* ''consent-banner-backdrop-background'' - the colour of the backdrop behind the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-backdrop-background}}) +* ''consent-banner-background'' - the background colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-background}}) +* ''consent-banner-button-background'' - the background colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-background}}) +* ''consent-banner-button-border'' - the border colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-border}}) +* ''consent-banner-button-default-background'' - the background colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-background}}) +* ''consent-banner-button-default-foreground'' - the foreground colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-foreground}}) +* ''consent-banner-button-foreground'' - the foreground colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-foreground}}) +* ''consent-banner-button-hover-background'' - the background colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-background}}) +* ''consent-banner-button-hover-border'' - the border colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-border}}) +* ''consent-banner-button-hover-foreground'' - the foreground colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-foreground}}) +* ''consent-banner-foreground'' - the foreground colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-foreground}}) +* ''consent-banner-hr-background'' - the background colour of horizontal rules within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-hr-background}}) +* ''consent-banner-link-foreground'' - the foreground colour of tiddler links within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-link-foreground}}) + ! ~YouTube macro A simple macro for embedding ~YouTube videos is provided to show how to adapt content according to whether consent has been granted. It works by checking the tiddler [[$:/state/consent-banner/accepted]] for the following values: diff --git a/plugins/tiddlywiki/consent-banner/styles.tid b/plugins/tiddlywiki/consent-banner/styles.tid index f8c969f14..ddc0fd858 100644 --- a/plugins/tiddlywiki/consent-banner/styles.tid +++ b/plugins/tiddlywiki/consent-banner/styles.tid @@ -8,7 +8,7 @@ tags: $:/tags/Stylesheet right: 0; top: 0; bottom: 0; - background: rgba(0,0,0,0.2); + background: <<colour consent-banner-backdrop-background>>; } .tc-consent-banner-left { @@ -23,19 +23,19 @@ tags: $:/tags/Stylesheet .tc-consent-banner { padding: 1em; - background: #009677; - color: #fff; + background: <<colour consent-banner-background>>; + color: <<colour consent-banner-foreground>>; box-shadow: 0 0 20px rgba(0,0,0,.2); } .tc-consent-banner a.tc-tiddlylink-external { text-decoration: underline; - color: #fff; + color: <<colour consent-banner-link-foreground>>; background-color: inherit; } .tc-consent-banner a.tc-tiddlylink-external:visited { - color: #fff; + color: <<colour consent-banner-link-foreground>>; background-color: inherit; } @@ -49,7 +49,7 @@ tags: $:/tags/Stylesheet margin: 24px 0; height: 1px; max-height: 1px; - background: rgba(255,255,255,.25); + background: <<colour consent-banner-hr-background>>; } .tc-consent-buttons { @@ -57,23 +57,23 @@ tags: $:/tags/Stylesheet } .tc-consent-button { - border: 1px solid #fff; + border: 1px solid <<colour consent-banner-button-border>>; margin-right: 1em; margin-top: 1em; padding: 0.75em 1.5em; - color: #fff; - background: transparent; + color: <<colour consent-banner-button-foreground>>; + background: <<colour consent-banner-button-background>>; font-weight: bold; } .tc-consent-button:hover { - color: #009577; - border-color: #fff; - background: #fff; + color: <<colour consent-banner-button-hover-foreground>>; + border-color: <<colour consent-banner-button-hover-border>>; + background: <<colour consent-banner-button-hover-background>>; opacity: .6; } .tc-consent-button-default { - color: #009677; - background: #fff; -} \ No newline at end of file + color: <<colour consent-banner-button-default-foreground>>; + background: <<colour consent-banner-button-default-background>>; +} From 64034f4977a8bdad03ef91d2a504f383c4b487d5 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Jun 2020 12:27:58 +0100 Subject: [PATCH 0725/2376] Consent banner: Reorganise readme --- plugins/tiddlywiki/consent-banner/docs.tid | 54 ++++++++++++++++++ plugins/tiddlywiki/consent-banner/plugin.info | 2 +- plugins/tiddlywiki/consent-banner/readme.tid | 56 ------------------- 3 files changed, 55 insertions(+), 57 deletions(-) create mode 100644 plugins/tiddlywiki/consent-banner/docs.tid diff --git a/plugins/tiddlywiki/consent-banner/docs.tid b/plugins/tiddlywiki/consent-banner/docs.tid new file mode 100644 index 000000000..9d334f312 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/docs.tid @@ -0,0 +1,54 @@ +title: $:/plugins/tiddlywiki/consent-banner/docs + +! Features + +If the same wiki is opened in multiple tabs then once the warning has been accepted or declined in one tab then the other tabs will autonatically follow suit. + +Consent is automatically granted if the user logged in (ie the tiddler [[$:/status/IsLoggedIn]] is set to `yes`). + +! Consent Banner Palette Entries + +Add these entries to your current colour palette to change the colours used by the consent banner: + +* ''consent-banner-backdrop-background'' - the colour of the backdrop behind the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-backdrop-background}}) +* ''consent-banner-background'' - the background colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-background}}) +* ''consent-banner-button-background'' - the background colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-background}}) +* ''consent-banner-button-border'' - the border colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-border}}) +* ''consent-banner-button-default-background'' - the background colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-background}}) +* ''consent-banner-button-default-foreground'' - the foreground colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-foreground}}) +* ''consent-banner-button-foreground'' - the foreground colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-foreground}}) +* ''consent-banner-button-hover-background'' - the background colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-background}}) +* ''consent-banner-button-hover-border'' - the border colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-border}}) +* ''consent-banner-button-hover-foreground'' - the foreground colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-foreground}}) +* ''consent-banner-foreground'' - the foreground colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-foreground}}) +* ''consent-banner-hr-background'' - the background colour of horizontal rules within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-hr-background}}) +* ''consent-banner-link-foreground'' - the foreground colour of tiddler links within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-link-foreground}}) + +! ~YouTube macro + +A simple macro for embedding ~YouTube videos is provided to show how to adapt content according to whether consent has been granted. It works by checking the tiddler [[$:/state/consent-banner/accepted]] for the following values: + +* ''empty or missing'' - the user has yet to accept or decline to give their consent +* `yes` - the user has granted consent +* `no` - the user has declined consent + +! Customising banner buttons + +The [["accept"|$:/plugins/tiddlywiki/consent-banner/buttons/accept]] and [["decline"|$:/plugins/tiddlywiki/consent-banner/buttons/decline]] buttons in the banner are individual tiddlers with the tag [[$:/tags/ConsentBanner/Button]], allowing them to be customised and extended. + +A common use case is to add a "login" button allowing users to login directly to bypass the banner. This could be implemented as a tiddler tagged [[$:/tags/ConsentBanner/Button]] with the following text: + +``` +<$button message="tm-login" class="tc-consent-button tc-btn-invisible"> +Login +</$button> +``` + +! Integration with other plugins + +Third party plugins that set cookies can configure themselves to defer setting cookies until the user grants consent. There are several parts to this mechanism: + +* The consent-banner plugin includes a shadow tiddler [[$:/config/cookie-consent-required]] with the text `yes`. The third-party plugin should inspect this tiddler at startup; if it is not set to "yes" then it can proceed to set tiddlers immediately +* Otherwise, the third-party plugin should listen for changes to the tiddler [[$:/state/consent-banner/accepted]] and only start setting cookies when and if the value changes to "yes" + +The [[Google Analytics plugin|https://github.com/Jermolene/TiddlyWiki5/tree/master/plugins/tiddlywiki/googleanalytics]] shows an example of how this mechanism can be implemented. diff --git a/plugins/tiddlywiki/consent-banner/plugin.info b/plugins/tiddlywiki/consent-banner/plugin.info index 815290d90..62659b6f3 100644 --- a/plugins/tiddlywiki/consent-banner/plugin.info +++ b/plugins/tiddlywiki/consent-banner/plugin.info @@ -2,5 +2,5 @@ "title": "$:/plugins/tiddlywiki/consent-banner", "name": "Consent Banner", "description": "Consent banner for GDPR etc", - "list": "readme youtube config" + "list": "readme docs youtube config" } diff --git a/plugins/tiddlywiki/consent-banner/readme.tid b/plugins/tiddlywiki/consent-banner/readme.tid index 26a526bae..331d2458e 100644 --- a/plugins/tiddlywiki/consent-banner/readme.tid +++ b/plugins/tiddlywiki/consent-banner/readme.tid @@ -1,62 +1,6 @@ title: $:/plugins/tiddlywiki/consent-banner/readme -! Introduction - The ''consent-banner'' plugin helps make websites that are compliant with "cookie legislation" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]]. - -! Overview - This plugin presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits. Consent status is also available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies. -If the same wiki is opened in multiple tabs then once the warning has been accepted or declined in one tab then the other tabs will autonatically follow suit. - -Consent is automatically granted if the user logged in (ie the tiddler [[$:/status/IsLoggedIn]] is set to `yes`). - Please note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice. - -! Consent Banner Palette Entries - -Add these entries to your current colour palette to change the colours used by the consent banner: - -* ''consent-banner-backdrop-background'' - the colour of the backdrop behind the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-backdrop-background}}) -* ''consent-banner-background'' - the background colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-background}}) -* ''consent-banner-button-background'' - the background colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-background}}) -* ''consent-banner-button-border'' - the border colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-border}}) -* ''consent-banner-button-default-background'' - the background colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-background}}) -* ''consent-banner-button-default-foreground'' - the foreground colour for the default button within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-default-foreground}}) -* ''consent-banner-button-foreground'' - the foreground colour of buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-foreground}}) -* ''consent-banner-button-hover-background'' - the background colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-background}}) -* ''consent-banner-button-hover-border'' - the border colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-border}}) -* ''consent-banner-button-hover-foreground'' - the foreground colour of hovered buttons within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-button-hover-foreground}}) -* ''consent-banner-foreground'' - the foreground colour of the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-foreground}}) -* ''consent-banner-hr-background'' - the background colour of horizontal rules within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-hr-background}}) -* ''consent-banner-link-foreground'' - the foreground colour of tiddler links within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-link-foreground}}) - -! ~YouTube macro - -A simple macro for embedding ~YouTube videos is provided to show how to adapt content according to whether consent has been granted. It works by checking the tiddler [[$:/state/consent-banner/accepted]] for the following values: - -* ''empty or missing'' - the user has yet to accept or decline to give their consent -* `yes` - the user has granted consent -* `no` - the user has declined consent - -! Customising banner buttons - -The [["accept"|$:/plugins/tiddlywiki/consent-banner/buttons/accept]] and [["decline"|$:/plugins/tiddlywiki/consent-banner/buttons/decline]] buttons in the banner are individual tiddlers with the tag [[$:/tags/ConsentBanner/Button]], allowing them to be customised and extended. - -A common use case is to add a "login" button allowing users to login directly to bypass the banner. This could be implemented as a tiddler tagged [[$:/tags/ConsentBanner/Button]] with the following text: - -``` -<$button message="tm-login" class="tc-consent-button tc-btn-invisible"> -Login -</$button> -``` - -! Integration with other plugins - -Third party plugins that set cookies can configure themselves to defer setting cookies until the user grants consent. There are several parts to this mechanism: - -* The consent-banner plugin includes a shadow tiddler [[$:/config/cookie-consent-required]] with the text `yes`. The third-party plugin should inspect this tiddler at startup; if it is not set to "yes" then it can proceed to set tiddlers immediately -* Otherwise, the third-party plugin should listen for changes to the tiddler [[$:/state/consent-banner/accepted]] and only start setting cookies when and if the value changes to "yes" - -The [[Google Analytics plugin|https://github.com/Jermolene/TiddlyWiki5/tree/master/plugins/tiddlywiki/googleanalytics]] shows an example of how this mechanism can be implemented. From d46872c061c23876ce7e5a5632eea6f863282143 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 27 Jun 2020 13:32:11 +0200 Subject: [PATCH 0726/2376] Extend tm-import-tiddlers message (#4741) * Allow tm-import-tiddlers event to override tv-auto-open-on-import * Add autoOpenOnImport attribute to dropzone * Updated DropZone docs * Updated dropzone to support importTitle attribute * Updated navigator to support importTitle attribute on tm-import-tiddlers * Update dropzone docs for importTitle attribute * Updated docs for tm-import-tiddlers * Fixed formatting --- core/modules/widgets/dropzone.js | 10 ++++++---- core/modules/widgets/navigator.js | 16 +++++++++------- .../WidgetMessage_ tm-import-tiddlers.tid | 2 ++ .../tw5.com/tiddlers/widgets/DropzoneWidget.tid | 2 ++ 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 60d1ca867..08af202bb 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -113,7 +113,7 @@ DropZoneWidget.prototype.handleDragEndEvent = function(event) { DropZoneWidget.prototype.handleDropEvent = function(event) { var self = this, readFileCallback = function(tiddlerFieldsArray) { - self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify(tiddlerFieldsArray)}); + self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle}); }; this.leaveDrag(event); // Check for being over a TEXTAREA or INPUT @@ -149,7 +149,7 @@ DropZoneWidget.prototype.handleDropEvent = function(event) { DropZoneWidget.prototype.handlePasteEvent = function(event) { var self = this, readFileCallback = function(tiddlerFieldsArray) { - self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify(tiddlerFieldsArray)}); + self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle}); }; // Let the browser handle it if we're in a textarea or input box if(["TEXTAREA","INPUT"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) { @@ -176,7 +176,7 @@ DropZoneWidget.prototype.handlePasteEvent = function(event) { if($tw.log.IMPORT) { console.log("Importing string '" + str + "', type: '" + type + "'"); } - self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify([tiddlerFields])}); + self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify([tiddlerFields]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle}); }); } } @@ -193,6 +193,8 @@ DropZoneWidget.prototype.execute = function() { this.dropzoneClass = this.getAttribute("class"); this.dropzoneDeserializer = this.getAttribute("deserializer"); this.dropzoneEnable = (this.getAttribute("enable") || "yes") === "yes"; + this.autoOpenOnImport = this.getAttribute("autoOpenOnImport"); + this.importTitle = this.getAttribute("importTitle"); // Make child widgets this.makeChildWidgets(); }; @@ -202,7 +204,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ DropZoneWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.enable) { + if(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) { this.refreshSelf(); return true; } diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 4e7a871e0..df7e2475b 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -494,10 +494,11 @@ NavigatorWidget.prototype.handleImportTiddlersEvent = function(event) { } catch(e) { } // Get the current $:/Import tiddler - var importTiddler = this.wiki.getTiddler(IMPORT_TITLE), - importData = this.wiki.getTiddlerData(IMPORT_TITLE,{}), + var importTitle = event.importTitle ? event.importTitle : IMPORT_TITLE, + importTiddler = this.wiki.getTiddler(importTitle), + importData = this.wiki.getTiddlerData(importTitle,{}), newFields = new Object({ - title: IMPORT_TITLE, + title: importTitle, type: "application/json", "plugin-type": "import", "status": "pending" @@ -528,15 +529,16 @@ NavigatorWidget.prototype.handleImportTiddlersEvent = function(event) { newFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces); this.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields)); // Update the story and history details - if(this.getVariable("tv-auto-open-on-import") !== "no") { + var autoOpenOnImport = event.autoOpenOnImport ? event.autoOpenOnImport : this.getVariable("tv-auto-open-on-import"); + if(autoOpenOnImport !== "no") { var storyList = this.getStoryList(), history = []; // Add it to the story - if(storyList && storyList.indexOf(IMPORT_TITLE) === -1) { - storyList.unshift(IMPORT_TITLE); + if(storyList && storyList.indexOf(importTitle) === -1) { + storyList.unshift(importTitle); } // And to history - history.push(IMPORT_TITLE); + history.push(importTitle); // Save the updated story and history this.saveStoryList(storyList); this.addToHistory(history); diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-import-tiddlers.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-import-tiddlers.tid index bc7220a50..dd1581322 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-import-tiddlers.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-import-tiddlers.tid @@ -9,6 +9,8 @@ The `tm-import-tiddlers` message inserts a list of tiddlers into the pending imp |!Name |!Description | |param |JSON text of the array of tiddlers to be imported | +|autoOpenOnImport |<<.from-version "5.1.23">> Optional value "no" or "yes" that can override tv-auto-open-on-import | +|importTitle|<<.from-version "5.1.23">> optional tiddler title to use for import process instead of ~$:/Import | The import tiddlers message is usually generated with the DropzoneWidget or the BrowseWidget, and is handled by the NavigatorWidget. diff --git a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid index 225823ec6..1794cf98d 100644 --- a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid @@ -17,6 +17,8 @@ It sends a [[WidgetMessage: tm-import-tiddlers]] carrying a JSON representation |deserializer |<<.from-version "5.1.15">> Optional name of deserializer to be used (by default the deserializer is derived from the file extension) | |enable |<<.from-version "5.1.22">> Optional value "no" to disable the dropzone functionality (defaults to "yes") | |class |<<.from-version "5.1.22">> Optional CSS class to be assigned to the dropzone (defaults to "tc-drag-over") | +|autoOpenOnImport |<<.from-version "5.1.23">> Optional value "no" or "yes" that can override tv-auto-open-on-import | +|importTitle|<<.from-version "5.1.23">> optional tiddler title to use for import process instead of ~$:/Import | The list of available deserializers can be inspected by executing `Object.keys($tw.Wiki.tiddlerDeserializerModules).sort().join("\n")` in the browser JavaScript console. From 35a842ade60369210ba44e654f04db9097ff960d Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 27 Jun 2020 13:33:14 +0200 Subject: [PATCH 0727/2376] EditWidget: Pass attributes from parseTreeNode to child widgets (#4740) --- core/modules/widgets/edit.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/core/modules/widgets/edit.js b/core/modules/widgets/edit.js index 9492952a5..472fc534b 100644 --- a/core/modules/widgets/edit.js +++ b/core/modules/widgets/edit.js @@ -54,16 +54,7 @@ EditWidget.prototype.execute = function() { // Make the child widgets this.makeChildWidgets([{ type: "edit-" + this.editorType, - attributes: { - tiddler: {type: "string", value: this.editTitle}, - field: {type: "string", value: this.editField}, - index: {type: "string", value: this.editIndex}, - "class": {type: "string", value: this.editClass}, - "placeholder": {type: "string", value: this.editPlaceholder}, - "tabindex": {type: "string", value: this.editTabIndex}, - "focus": {type: "string", value: this.editFocus}, - "cancelPopups": {type: "string", value: this.editCancelPopups} - }, + attributes: this.parseTreeNode.attributes, children: this.parseTreeNode.children }]); }; From 7f08025175d90dfa7a42ec5707cffb033d5c61fd Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:11:20 +0200 Subject: [PATCH 0728/2376] Update HistoryMechanism.tid (#4731) --- editions/tw5.com/tiddlers/mechanisms/HistoryMechanism.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/mechanisms/HistoryMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/HistoryMechanism.tid index b5fdc8763..93ab744d7 100644 --- a/editions/tw5.com/tiddlers/mechanisms/HistoryMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/HistoryMechanism.tid @@ -13,7 +13,7 @@ The history list also maintains the field ''current-tiddler'' that contains the ``` <$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop"> -<$button message="tm-close-tiddler" class="tc-btn-invisible tc-btn-mini">×</$button> <$link to={{!!title}}><$view field="title"/> <$reveal type="match" state="$:/HistoryList!!current-tiddler" text=<<currentTiddler>>>✓</$reveal></$link> +<$button message="tm-close-tiddler" class="tc-btn-invisible tc-btn-mini">×</$button> <$link><$view field="title"/> <$reveal type="match" state="$:/HistoryList!!current-tiddler" text=<<currentTiddler>>>✓</$reveal></$link> </$list> ``` @@ -22,7 +22,7 @@ Which renders the same as the "Open" sidebar tab, with the addition of a tick ag <$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop"> -<$button message="tm-close-tiddler" class="tc-btn-invisible tc-btn-mini">×</$button> <$link to={{!!title}}><$view field="title"/> <$reveal type="match" state="$:/HistoryList!!current-tiddler" text=<<currentTiddler>>>✓</$reveal></$link> +<$button message="tm-close-tiddler" class="tc-btn-invisible tc-btn-mini">×</$button> <$link><$view field="title"/> <$reveal type="match" state="$:/HistoryList!!current-tiddler" text=<<currentTiddler>>>✓</$reveal></$link> </$list> @@ -32,4 +32,4 @@ To display content when the story is empty, create $:/config/EmptyStoryMessage a ``` {{GettingStarted||$:/core/ui/ViewTemplate}} -``` \ No newline at end of file +``` From 33ee650fb7fd98d32af090d8c826044792e470a0 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:11:32 +0200 Subject: [PATCH 0729/2376] Update How to create keyboard shortcuts.div (#4732) --- .../tiddlers/howtos/How to create keyboard shortcuts.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid b/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid index 3b82a0a6a..ff59ab253 100644 --- a/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid +++ b/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid @@ -98,7 +98,7 @@ If the tiddler that contains the macro definition is known and - for example - t !!! Messages <$list filter="[tag[navigator-message]]"> -<$link to={{!!title}}><$view field="title"/></$link><br> +<$link/><br> </$list> </$vars> From 6f4f38506e7ee399fa1548e57dd83936096ef66a Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:11:41 +0200 Subject: [PATCH 0730/2376] Update NavigatorWidget.tid (#4733) --- editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid b/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid index 0e0e60ace..11a17edf8 100644 --- a/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid @@ -26,9 +26,7 @@ The following [[Messages]] are handled by the navigator widget: <ul> <$list filter="[tag[navigator-message]]"> <li> -<$link to={{!!title}}> -<$view field="title"/> -</$link> +<$link/> </li> </$list> </ul> From 4127ce8e9ff107559e6601d3a412ad2ef8b0ffea Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:11:50 +0200 Subject: [PATCH 0731/2376] Update StateMechanism.tid (#4734) --- editions/tw5.com/tiddlers/mechanisms/StateMechanism.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/mechanisms/StateMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/StateMechanism.tid index 4d4c933be..5f9d2622c 100644 --- a/editions/tw5.com/tiddlers/mechanisms/StateMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/StateMechanism.tid @@ -28,7 +28,7 @@ Note how this approach makes the ''open'' tab in the sidebar very easy to implem ``` <$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop"> -<$button message="tm-close-tiddler" class="tc-btn-invisible tc-btn-mini">×</$button> <$link to={{!!title}}><$view field="title"/></$link> +<$button message="tm-close-tiddler" class="tc-btn-invisible tc-btn-mini">×</$button> <$link/> </$list> ``` From 2e39b5add530a19a9ec3e1f64087d11c3bfe18f6 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:11:57 +0200 Subject: [PATCH 0732/2376] Update TaskManagementExample.tid (#4735) --- .../tiddlers/demonstrations/Tasks/TaskManagementExample.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExample.tid b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExample.tid index 494b28ac4..4e66bb9fc 100644 --- a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExample.tid +++ b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExample.tid @@ -12,7 +12,7 @@ TiddlyWiki5 can be used as a simple task management system without further custo <$list filter="[!has[draft.of]tag[task]!tag[done]sort[created]]"> -<$checkbox tag="done"> <$link to={{!!title}}><$view field="title"/></$link></$checkbox> +<$checkbox tag="done"> <$link/></$checkbox> </$list> @@ -20,6 +20,6 @@ TiddlyWiki5 can be used as a simple task management system without further custo <$list filter="[!has[draft.of]tag[task]tag[done]sort[created]]"> -<$checkbox tag="done"> ~~<$link to={{!!title}}><$view field="title"/></$link>~~</$checkbox> +<$checkbox tag="done"> ~~<$link/>~~</$checkbox> </$list> From 55109177eecbf2e710631c7781f77be58f8da294 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:12:24 +0200 Subject: [PATCH 0733/2376] Update TaskManagementExampleDraggable.tid (#4736) --- .../demonstrations/Tasks/TaskManagementExampleDraggable.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid index 7b0928ff6..e981edd09 100644 --- a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid +++ b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggable.tid @@ -18,6 +18,6 @@ This is a version of the TaskManagementExample enhanced with the ability to drag <$list filter="[!has[draft.of]tag[task]tag[done]sort[created]]"> <div> -<$checkbox tag="done"> ~~<$link to={{!!title}}><$view field="title"/></$link>~~</$checkbox> +<$checkbox tag="done"> ~~<$link/>~~</$checkbox> </div> </$list> From c0f0aadf09ae942a89000c5a3a58cba420029cc2 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:12:52 +0200 Subject: [PATCH 0734/2376] Update TaskManagementExampleDraggableTemplate.tid (#4737) --- .../Tasks/TaskManagementExampleDraggableTemplate.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggableTemplate.tid b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggableTemplate.tid index 3ccdd98e0..b67312e61 100644 --- a/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggableTemplate.tid +++ b/editions/tw5.com/tiddlers/demonstrations/Tasks/TaskManagementExampleDraggableTemplate.tid @@ -4,4 +4,4 @@ tags: Learning title: TaskManagementExampleDraggableTemplate type: text/vnd.tiddlywiki -<$checkbox tag="done"> <$link to={{!!title}}><$view field="title"/></$link></$checkbox> \ No newline at end of file +<$checkbox tag="done"> <$link/></$checkbox> From 4c39db1f5483519d3564db487f84ff63e623565b Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:13:01 +0200 Subject: [PATCH 0735/2376] Update ActionListopsWidget.tid (#4738) --- editions/tw5.com/tiddlers/widgets/ActionListopsWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/ActionListopsWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionListopsWidget.tid index bba6dafc6..3dfb8fe5f 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionListopsWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionListopsWidget.tid @@ -10,7 +10,7 @@ type: text/vnd.tiddlywiki \define .operator-rows(filter) <$list filter="$filter$"><tr> -<td><$link to={{!!title}}>{{!!caption}}</$link></td> +<td><$link>{{!!caption}}</$link></td> <td>{{!!op-purpose}} <$list filter="[all[current]tag[Common Operators]]">{{$:/core/images/done-button}}</$list></td> <td align="center"><$list filter="[all[current]tag[Negatable Operators]]">`!`</$list></td> </tr></$list> From 8b5a4faa07c5f0f8cd0488f28010ad210b60cb2d Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 27 Jun 2020 14:13:10 +0200 Subject: [PATCH 0736/2376] Update Filter Operators.tid (#4739) --- editions/tw5.com/tiddlers/filters/Filter Operators.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/Filter Operators.tid b/editions/tw5.com/tiddlers/filters/Filter Operators.tid index 393cebfbe..919a49c94 100644 --- a/editions/tw5.com/tiddlers/filters/Filter Operators.tid +++ b/editions/tw5.com/tiddlers/filters/Filter Operators.tid @@ -6,7 +6,7 @@ type: text/vnd.tiddlywiki \define .operator-rows(filter) <$list filter="$filter$"><tr> -<td><$link to={{!!title}}>{{!!caption}}</$link></td> +<td><$link>{{!!caption}}</$link></td> <td>{{!!op-purpose}}</td> <td align="center"><$list filter="[all[current]tag[Common Operators]]">✓</$list></td> <td align="center"><$list filter="[all[current]tag[Negatable Operators]]">`!`</$list></td> From bd2cf5c46498222a32ebda92da3ae50bde33decb Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 2 Jul 2020 13:13:55 +0100 Subject: [PATCH 0737/2376] Extend the element widget with a hook to intercept DOM node creation The element widget is used to render HTML elements in wikitext. --- core/modules/widgets/element.js | 49 +++++++++++-------- .../new/Hook__th-rendering-element.tid | 35 +++++++++++++ 2 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 editions/dev/tiddlers/new/Hook__th-rendering-element.tid diff --git a/core/modules/widgets/element.js b/core/modules/widgets/element.js index b76e37b00..41ed4ebd1 100755 --- a/core/modules/widgets/element.js +++ b/core/modules/widgets/element.js @@ -29,45 +29,47 @@ Render this widget into the DOM ElementWidget.prototype.render = function(parent,nextSibling) { this.parentDomNode = parent; this.computeAttributes(); - this.execute(); // Neuter blacklisted elements - var tag = this.parseTreeNode.tag; - if($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) { - tag = "safe-" + tag; + this.tag = this.parseTreeNode.tag; + if($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) { + this.tag = "safe-" + this.tag; } // Adjust headings by the current base level - var headingLevel = ["h1","h2","h3","h4","h5","h6"].indexOf(tag); + var headingLevel = ["h1","h2","h3","h4","h5","h6"].indexOf(this.tag); if(headingLevel !== -1) { var baseLevel = parseInt(this.getVariable("tv-adjust-heading-level","0"),10) || 0; headingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6); - tag = "h" + headingLevel; + this.tag = "h" + headingLevel; } - // Create the DOM node - var domNode = this.document.createElementNS(this.namespace,tag); - this.assignAttributes(domNode,{excludeEventAttributes: true}); - parent.insertBefore(domNode,nextSibling); - this.renderChildren(domNode,null); - this.domNodes.push(domNode); -}; - -/* -Compute the internal state of the widget -*/ -ElementWidget.prototype.execute = function() { // Select the namespace for the tag var tagNamespaces = { svg: "http://www.w3.org/2000/svg", math: "http://www.w3.org/1998/Math/MathML", body: "http://www.w3.org/1999/xhtml" }; - this.namespace = tagNamespaces[this.parseTreeNode.tag]; + this.namespace = tagNamespaces[this.tag]; if(this.namespace) { this.setVariable("namespace",this.namespace); } else { this.namespace = this.getVariable("namespace",{defaultValue: "http://www.w3.org/1999/xhtml"}); } + // Invoke the th-rendering-element hook + var parseTreeNodes = $tw.hooks.invokeHook("th-rendering-element",null,this); + this.isReplaced = !!parseTreeNodes; + if(parseTreeNodes) { + // Use the parse tree nodes provided by the hook + this.makeChildWidgets(parseTreeNodes); + this.renderChildren(this.parentDomNode,null); + return; + } // Make the child widgets this.makeChildWidgets(); + // Create the DOM node and render children + var domNode = this.document.createElementNS(this.namespace,this.tag); + this.assignAttributes(domNode,{excludeEventAttributes: true}); + parent.insertBefore(domNode,nextSibling); + this.renderChildren(domNode,null); + this.domNodes.push(domNode); }; /* @@ -77,8 +79,13 @@ ElementWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(), hasChangedAttributes = $tw.utils.count(changedAttributes) > 0; if(hasChangedAttributes) { - // Update our attributes - this.assignAttributes(this.domNodes[0],{excludeEventAttributes: true}); + if(!this.isReplaced) { + // Update our attributes + this.assignAttributes(this.domNodes[0],{excludeEventAttributes: true}); + } else { + // If we were replaced then completely refresh ourselves + return this.refreshSelf(); + } } return this.refreshChildren(changedTiddlers) || hasChangedAttributes; }; diff --git a/editions/dev/tiddlers/new/Hook__th-rendering-element.tid b/editions/dev/tiddlers/new/Hook__th-rendering-element.tid new file mode 100644 index 000000000..3aba8d7be --- /dev/null +++ b/editions/dev/tiddlers/new/Hook__th-rendering-element.tid @@ -0,0 +1,35 @@ +created: 20200630121235997 +modified: 20200630121235997 +tags: HookMechanism +title: Hook: th-rendering-element + +This hook provides a notification that a DOM element is about to be rendered by the "element" widget. The hook can optionally provide an alternate parse tree that will be rendered in place of the intended element. + +Note the element widget only renders those HTML elements that were parsed as plain HTML elements within wikitext (i.e. using the `<tagname>` syntax). This means that this hook is not invoked for elements created by other widgets. + +Hook function parameters: + +* ''newParseTreeNodes'': optional parse tree nodes provided by a previously called hook +* ''widget'': instance of the element widget invoking the hook + +Return value: + +* ''newParseTreeNodes'': optionally new parse tree nodes to replace the intended element, or a falsey value to leave the element untouched + +Here is an example of a handler for this hook: + +```js +$tw.hooks.addHook("th-rendering-element",function(parseTreeNodes,widget) { + // Return the previous mapping if there is one + if(parseTreeNodes) { + return parseTreeNodes; + } + // Detect the elements we're interested in + if(someCondition()) { + // Replace them with a parse tree + return generateParseTreeNodes(); + } + // Otherwise do nothing + return null; +}); +``` From a0db3abe993dc9b8d02b5261eafb3286df7c0496 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 2 Jul 2020 13:14:51 +0100 Subject: [PATCH 0738/2376] Consent banner: Add optional blocking of embedded content until consent granted --- .../blocked-embed-message-wrapper.tid | 13 +++++ plugins/tiddlywiki/consent-banner/config.tid | 6 +++ .../config/block-embedded-content.tid | 2 + .../config/blocked-embed-message.tid | 7 +++ .../config/tv-block-embedded-content.tid | 4 ++ plugins/tiddlywiki/consent-banner/docs.tid | 10 ++++ plugins/tiddlywiki/consent-banner/readme.tid | 6 ++- plugins/tiddlywiki/consent-banner/startup.js | 51 ++++++++++++++++--- plugins/tiddlywiki/consent-banner/styles.tid | 34 ++++++++++++- .../consent-banner/youtube-macros.tid | 2 + 10 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper.tid create mode 100644 plugins/tiddlywiki/consent-banner/config/block-embedded-content.tid create mode 100644 plugins/tiddlywiki/consent-banner/config/blocked-embed-message.tid create mode 100644 plugins/tiddlywiki/consent-banner/config/tv-block-embedded-content.tid diff --git a/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper.tid b/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper.tid new file mode 100644 index 000000000..3647f8436 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper.tid @@ -0,0 +1,13 @@ +title: $:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper + +\define styles() +width:$(width)$;height:$(height)$; +\end + +<div class="tc-blocked-embedded-content" style=<<styles>>> +<div class="tc-blocked-embedded-content-inner"> +<div class="tc-blocked-embedded-content-inner-inner"> +<$transclude tiddler="$:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message" mode="inline"/> +</div> +</div> +</div> diff --git a/plugins/tiddlywiki/consent-banner/config.tid b/plugins/tiddlywiki/consent-banner/config.tid index 66ede01ce..a62e0f3f1 100644 --- a/plugins/tiddlywiki/consent-banner/config.tid +++ b/plugins/tiddlywiki/consent-banner/config.tid @@ -40,3 +40,9 @@ Current status: {{$:/state/consent-banner/accepted}} (blank indicates that conse <$button message="tm-consent-clear" tooltip={{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/hint}}> {{$:/config/plugins/tiddlywiki/consent-banner/buttons/clear/caption}} </$button> + +! Embedded Content Blocking + +//Requires page reload// + +<$checkbox tiddler="$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content" field="text" checked="yes" unchecked="no" default="no"> Block all embedded content such as <iframe>, <embed> and <object> unless consent has been granted</$checkbox> diff --git a/plugins/tiddlywiki/consent-banner/config/block-embedded-content.tid b/plugins/tiddlywiki/consent-banner/config/block-embedded-content.tid new file mode 100644 index 000000000..5522006d0 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/block-embedded-content.tid @@ -0,0 +1,2 @@ +title: $:/config/plugins/tiddlywiki/consent-banner/block-embedded-content +text: yes diff --git a/plugins/tiddlywiki/consent-banner/config/blocked-embed-message.tid b/plugins/tiddlywiki/consent-banner/config/blocked-embed-message.tid new file mode 100644 index 000000000..bb9931af0 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/blocked-embed-message.tid @@ -0,0 +1,7 @@ +title: $:/config/plugins/tiddlywiki/consent-banner/blocked-embed-message + +Blocked embedded content from<br/><a href=<<url>> class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer"><$text text=<<url>>/></a> + +<hr/> + +{{$:/plugins/tiddlywiki/consent-banner/buttons/accept}} cookies to unblock \ No newline at end of file diff --git a/plugins/tiddlywiki/consent-banner/config/tv-block-embedded-content.tid b/plugins/tiddlywiki/consent-banner/config/tv-block-embedded-content.tid new file mode 100644 index 000000000..4d9ffd7ec --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/tv-block-embedded-content.tid @@ -0,0 +1,4 @@ +title: $:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content +tags: $:/tags/Macro + +<$set name="tv-block-embedded-content" value={{{ [{$:/config/cookie-consent-required}else[no]match[yes]then{$:/state/consent-banner/accepted}!match[yes]then[yes]] }}}/> diff --git a/plugins/tiddlywiki/consent-banner/docs.tid b/plugins/tiddlywiki/consent-banner/docs.tid index 9d334f312..55ef4a6b7 100644 --- a/plugins/tiddlywiki/consent-banner/docs.tid +++ b/plugins/tiddlywiki/consent-banner/docs.tid @@ -24,6 +24,16 @@ Add these entries to your current colour palette to change the colours used by t * ''consent-banner-hr-background'' - the background colour of horizontal rules within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-hr-background}}) * ''consent-banner-link-foreground'' - the foreground colour of tiddler links within the consent banner (defaults to {{$:/config/DefaultColourMappings/consent-banner-link-foreground}}) +! Embedded Content Blocking + +Unless disabled via the config tab, content embedded via <iframe>, <embed> or <object> is blocked until the user consents to accept cookies. + +!! Implementation Details + +Embedded content is blocked if the variable `tv-block-embedded-content` is set to `yes`. It is set to the current consent status by a [[global macro|$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content]]: + +<$codeblock code={{$:/plugins/tiddlywiki/consent-banner/tv-block-embedded-content}}/> + ! ~YouTube macro A simple macro for embedding ~YouTube videos is provided to show how to adapt content according to whether consent has been granted. It works by checking the tiddler [[$:/state/consent-banner/accepted]] for the following values: diff --git a/plugins/tiddlywiki/consent-banner/readme.tid b/plugins/tiddlywiki/consent-banner/readme.tid index 331d2458e..c3c682b86 100644 --- a/plugins/tiddlywiki/consent-banner/readme.tid +++ b/plugins/tiddlywiki/consent-banner/readme.tid @@ -1,6 +1,10 @@ title: $:/plugins/tiddlywiki/consent-banner/readme The ''consent-banner'' plugin helps make websites that are compliant with "cookie legislation" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]]. -This plugin presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits. Consent status is also available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies. +It presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits. + +By default, content embedded with <iframe>, <embed> and <object> is blocked unless the user consents to accept cookies. + +Consent status is available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies. Please note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice. diff --git a/plugins/tiddlywiki/consent-banner/startup.js b/plugins/tiddlywiki/consent-banner/startup.js index a65db100b..861a03a91 100644 --- a/plugins/tiddlywiki/consent-banner/startup.js +++ b/plugins/tiddlywiki/consent-banner/startup.js @@ -16,16 +16,18 @@ Startup initialisation exports.name = "consent-banner"; exports.platforms = ["browser"]; exports.after = ["startup"]; +exports.before = ["render"]; exports.synchronous = true; var CHECK_CONSENT_INTERVAL = 1000, // Milliseconds between checking local storage IS_LOGGED_IN_TITLE = "$:/status/IsLoggedIn", CONSENT_KEY = "COOKIE_CONSENT", // Local storage keyname - CONSENT_TITLE = "$:/state/consent-banner/accepted"; // "": undeclared, "yes": accepted, "no": declined + CONSENT_TITLE = "$:/state/consent-banner/accepted", // "": undeclared, "yes": accepted, "no": declined + CONFIG_BLOCK_EMBEDDED_CONTENT_TITLE = "$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content", + EMBEDDED_MESSAGE_WRAPPER_TITLE = "$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper"; -exports.startup = function() { - var self = this, - consentState = "", +exports.startup = function() { + var consentState = "", setConsentStatus = function(state) { if(consentState !== state) { consentState = state; @@ -51,9 +53,9 @@ exports.startup = function() { pollConsentStatus = function() { setTimeout(checkConsentStatus,CHECK_CONSENT_INTERVAL); }; - // Set the current constant status + // Set the current consent status checkConsentStatus(); - // Listen for tm-clear-browser-storage messages + // Listen for consent messages $tw.rootWidget.addEventListener("tm-consent-accept",function(event) { setConsentStatus("yes"); }); @@ -63,6 +65,43 @@ exports.startup = function() { $tw.rootWidget.addEventListener("tm-consent-clear",function(event) { setConsentStatus(""); }); + // Add our element rendering hook + if($tw.wiki.getTiddlerText(CONFIG_BLOCK_EMBEDDED_CONTENT_TITLE,"no") === "yes") { + $tw.hooks.addHook("th-rendering-element",function(parseTreeNodes,widget) { + if(parseTreeNodes) { + return parseTreeNodes; + } + if(["iframe","object","embed"].indexOf(widget.tag) !== -1 && widget.getVariable("tv-block-embedded-content","no") === "yes") { + var url = widget.getAttribute("src"), + addUnitsIfMissing = function(str) { + str = "" + str; + return str + (("" + parseInt(str,10)) === str ? "px" : ""); + }, + width = addUnitsIfMissing(widget.getAttribute("width","")), + height = addUnitsIfMissing(widget.getAttribute("height","")); + return [ + { + type: "vars", + attributes: { + url: {type: "string", value: url}, + width: {type: "string", value: width}, + height: {type: "string", value: height} + }, + children: [ + { + type: "transclude", + attributes: { + tiddler: {type: "string", value: EMBEDDED_MESSAGE_WRAPPER_TITLE}, + mode: {type: "string", value: "inline"} + } + } + ] + } + ]; + } + return null; + }); + } }; })(); diff --git a/plugins/tiddlywiki/consent-banner/styles.tid b/plugins/tiddlywiki/consent-banner/styles.tid index ddc0fd858..70fb9205a 100644 --- a/plugins/tiddlywiki/consent-banner/styles.tid +++ b/plugins/tiddlywiki/consent-banner/styles.tid @@ -56,9 +56,12 @@ tags: $:/tags/Stylesheet } +.tc-consent-banner .tc-consent-button { + margin-right: 1em; +} + .tc-consent-button { border: 1px solid <<colour consent-banner-button-border>>; - margin-right: 1em; margin-top: 1em; padding: 0.75em 1.5em; color: <<colour consent-banner-button-foreground>>; @@ -77,3 +80,32 @@ tags: $:/tags/Stylesheet color: <<colour consent-banner-button-default-foreground>>; background: <<colour consent-banner-button-default-background>>; } + +.tc-blocked-embedded-content { + display: inline-block; + overflow: hidden; + color: <<colour background>>; + background: <<colour muted-foreground>>; + border: 1px solid <<colour foreground>>; + <<box-shadow "inset 0 0 8px rgba(0, 0, 0, 0.15)">> +} + +.tc-blocked-embedded-content-inner { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; +} + +.tc-blocked-embedded-content-inner-inner { + display: inline-block; + text-align: center; +} + +.tc-blocked-embedded-content-inner-inner hr { + background: <<colour foreground>>; + height: 1px; + width: 80%; + border: none; +} diff --git a/plugins/tiddlywiki/consent-banner/youtube-macros.tid b/plugins/tiddlywiki/consent-banner/youtube-macros.tid index 78fced22d..67718931f 100644 --- a/plugins/tiddlywiki/consent-banner/youtube-macros.tid +++ b/plugins/tiddlywiki/consent-banner/youtube-macros.tid @@ -2,12 +2,14 @@ title: $:/plugins/tiddlywiki/consent-banner/youtube tags: $:/tags/Macro \define embed-video-with-consent(code) +<$set name="tv-block-embedded-content" value="no"> <$reveal state="$:/state/consent-banner/accepted" type="match" text="yes" tag="div"> <iframe width="560" height="315" src="https://www.youtube.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> </$reveal> <$reveal state="$:/state/consent-banner/accepted" type="nomatch" text="yes" tag="div"> <iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/$code$" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> </$reveal> +</$set> \end ! Macro source From d505eeb2695cf12a1ba41fc5adc74f8e243d7477 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 13 Jul 2020 11:49:21 +0100 Subject: [PATCH 0739/2376] Consent widget Block the raw widget unless consent has been granted. This is helpful because the tw2parser generates <$raw> widgets for content embedded with <html>, and thus this blocks YouTube embeds. --- .../config/blocked-raw-message.tid | 19 +++++ .../tiddlywiki/consent-banner/raw-widget.js | 69 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid create mode 100644 plugins/tiddlywiki/consent-banner/raw-widget.js diff --git a/plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid b/plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid new file mode 100644 index 000000000..494cf879c --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/config/blocked-raw-message.tid @@ -0,0 +1,19 @@ +title: $:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message + +<div class="tc-blocked-embedded-content" style="width:100%;"> + +<div class="tc-blocked-embedded-content-inner"> + +<div class="tc-blocked-embedded-content-inner-inner"> + +Blocked raw content + +<hr/> + +{{$:/plugins/tiddlywiki/consent-banner/buttons/accept}} cookies to unblock + +</div> + +</div> + +</div> diff --git a/plugins/tiddlywiki/consent-banner/raw-widget.js b/plugins/tiddlywiki/consent-banner/raw-widget.js new file mode 100644 index 000000000..a38deee39 --- /dev/null +++ b/plugins/tiddlywiki/consent-banner/raw-widget.js @@ -0,0 +1,69 @@ +/*\ +title: $:/core/modules/widgets/raw.js +type: application/javascript +module-type: widget + +An override of the raw widget that blocks raw content until the user has consented to accept cookies + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var RawWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +RawWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +RawWidget.prototype.render = function(parent,nextSibling) { + this.parentDomNode = parent; + this.execute(); + this.blocked = this.getVariable("tv-block-embedded-content","no") === "yes"; + if(this.blocked) { + this.makeChildWidgets([{ + type: "transclude", + attributes: { + tiddler: {type: "string", value: "$:/config/plugins/tiddlywiki/consent-banner/blocked-raw-message"} + } + }]); + // Render child widgets + this.renderChildren(parent,null); + } else { + var div = this.document.createElement("div"); + div.innerHTML=this.parseTreeNode.html; + parent.insertBefore(div,nextSibling); + this.domNodes.push(div); + } +}; + +/* +Compute the internal state of the widget +*/ +RawWidget.prototype.execute = function() { +}; + +/* +Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering +*/ +RawWidget.prototype.refresh = function(changedTiddlers) { + if(this.blocked) { + return this.refreshChildren(changedTiddlers); + } else { + return false; + } +}; + +exports.raw = RawWidget; + +})(); From 0d2df34c58f02dd9e52fb76a9757daacdab163f2 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 13 Jul 2020 18:42:55 +0200 Subject: [PATCH 0740/2376] Keyboard-driven dropdown inputs (#4725) * Add shortcut descriptions to Misc.multids * Update framed.js * Update simple.js * Add inputActions and refreshTitle to factory.js * Add inputActions and refreshTitle to edit.js * Update DefaultSearchResultList.tid * Update search.tid * Update ShortcutInfo.multids * Update shortcuts.multids * Create keyboard-driven-input.tid * Update tag-picker.tid * Create keyboard-driven-input_Macro.tid * Update EditTextWidget.tid * Update EditWidget.tid * Update engine.js * Update base.tid * Use primaryListFilter, secondaryListFilter, primaryList and secondaryList * Update tag-picker.tid * Update search.tid * Update DefaultSearchResultList.tid * Update keyboard-driven-input_Macro.tid * Fix typo udpate -> update * Update framed.js --- core/language/en-GB/Misc.multids | 5 ++ core/modules/editor/engines/framed.js | 14 +++- core/modules/editor/engines/simple.js | 12 +++- core/modules/editor/factory.js | 6 +- core/modules/widgets/edit.js | 4 +- core/ui/DefaultSearchResultList.tid | 12 +++- core/ui/SideBarSegments/search.tid | 72 ++++++++++++------- core/wiki/config/ShortcutInfo.multids | 5 ++ core/wiki/config/shortcuts/shortcuts.multids | 5 ++ core/wiki/macros/keyboard-driven-input.tid | 51 +++++++++++++ core/wiki/macros/tag-picker.tid | 57 ++++++++++----- .../macros/keyboard-driven-input_Macro.tid | 20 ++++++ .../tiddlers/widgets/EditTextWidget.tid | 2 + .../tw5.com/tiddlers/widgets/EditWidget.tid | 3 + plugins/tiddlywiki/codemirror/engine.js | 12 +++- themes/tiddlywiki/vanilla/base.tid | 13 ++++ 16 files changed, 244 insertions(+), 49 deletions(-) create mode 100644 core/wiki/macros/keyboard-driven-input.tid create mode 100644 editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 861bb6899..62d41adfa 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -62,6 +62,11 @@ OfficialPluginLibrary: Official ~TiddlyWiki Plugin Library OfficialPluginLibrary/Hint: The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. PluginReloadWarning: Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect RecentChanges/DateFormat: DDth MMM YYYY +Shortcuts/Input/Accept/Hint: Accept the selected item +Shortcuts/Input/AcceptVariant/Hint: Accept the selected item (variant) +Shortcuts/Input/Cancel/Hint: Clear the input field +Shortcuts/Input/Down/Hint: Select the next item +Shortcuts/Input/Up/Hint: Select the previous item SystemTiddler/Tooltip: This is a system tiddler SystemTiddlers/Include/Prompt: Include system tiddlers TagManager/Colour/Heading: Colour diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index bdb83fe8a..8413d11df 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -81,7 +81,7 @@ function FramedEngine(options) { {name: "click",handlerObject: this,handlerMethod: "handleClickEvent"}, {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"}, - {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"}, + {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"} ]); // Insert the element into the DOM this.iframeDoc.body.appendChild(this.domNode); @@ -108,13 +108,20 @@ Set the text of the engine if it doesn't currently have focus FramedEngine.prototype.setText = function(text,type) { if(!this.domNode.isTiddlyWikiFakeDom) { if(this.domNode.ownerDocument.activeElement !== this.domNode) { - this.domNode.value = text; + this.updateDomNodeText(text); } // Fix the height if needed this.fixHeight(); } }; +/* +Update the DomNode with the new text +*/ +FramedEngine.prototype.updateDomNodeText = function(text) { + this.domNode.value = text; +}; + /* Get the text of the engine */ @@ -177,6 +184,9 @@ Handle a dom "input" event which occurs when the text has changed FramedEngine.prototype.handleInputEvent = function(event) { this.widget.saveChanges(this.getText()); this.fixHeight(); + if(this.widget.editInputActions) { + this.widget.invokeActionString(this.widget.editInputActions); + } return true; }; diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index 39f1163f6..1c50d28b1 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -68,13 +68,20 @@ Set the text of the engine if it doesn't currently have focus SimpleEngine.prototype.setText = function(text,type) { if(!this.domNode.isTiddlyWikiFakeDom) { if(this.domNode.ownerDocument.activeElement !== this.domNode || text === "") { - this.domNode.value = text; + this.updateDomNodeText(text); } // Fix the height if needed this.fixHeight(); } }; +/* +Update the DomNode with the new text +*/ +SimpleEngine.prototype.updateDomNodeText = function(text) { + this.domNode.value = text; +}; + /* Get the text of the engine */ @@ -115,6 +122,9 @@ Handle a dom "input" event which occurs when the text has changed SimpleEngine.prototype.handleInputEvent = function(event) { this.widget.saveChanges(this.getText()); this.fixHeight(); + if(this.widget.editInputActions) { + this.widget.invokeActionString(this.widget.editInputActions); + } return true; }; diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index 98fa599bb..e7c4ec3d8 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -178,6 +178,8 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { this.editFocus = this.getAttribute("focus"); this.editTabIndex = this.getAttribute("tabindex"); this.editCancelPopups = this.getAttribute("cancelPopups","") === "yes"; + this.editInputActions = this.getAttribute("inputActions"); + this.editRefreshTitle = this.getAttribute("refreshTitle"); // Get the default editor element tag and type var tag,type; if(this.editField === "text") { @@ -209,9 +211,11 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { EditTextWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Completely rerender if any of our attributes have changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) { this.refreshSelf(); return true; + } else if (changedTiddlers[this.editRefreshTitle]) { + this.engine.updateDomNodeText(this.getEditInfo().value); } else if(changedTiddlers[this.editTitle]) { var editInfo = this.getEditInfo(); this.updateEditor(editInfo.value,editInfo.type); diff --git a/core/modules/widgets/edit.js b/core/modules/widgets/edit.js index 472fc534b..6ee918170 100644 --- a/core/modules/widgets/edit.js +++ b/core/modules/widgets/edit.js @@ -49,6 +49,8 @@ EditWidget.prototype.execute = function() { this.editTabIndex = this.getAttribute("tabindex"); this.editFocus = this.getAttribute("focus",""); this.editCancelPopups = this.getAttribute("cancelPopups",""); + this.editInputActions = this.getAttribute("inputActions"); + this.editRefreshTitle = this.getAttribute("refreshTitle"); // Choose the appropriate edit widget this.editorType = this.getEditorType(); // Make the child widgets @@ -87,7 +89,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of EditWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Refresh if an attribute has changed, or the type associated with the target tiddler has changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) { this.refreshSelf(); return true; } else { diff --git a/core/ui/DefaultSearchResultList.tid b/core/ui/DefaultSearchResultList.tid index 331ef8718..1e0b1e403 100644 --- a/core/ui/DefaultSearchResultList.tid +++ b/core/ui/DefaultSearchResultList.tid @@ -5,11 +5,19 @@ caption: {{$:/language/Search/DefaultResults/Caption}} \define searchResultList() //<small>{{$:/language/Search/Matches/Title}}</small>// -<$list filter="[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]" template="$:/core/ui/ListItemTemplate"/> +<$list filter="[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]"> +<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}> +<$transclude tiddler="$:/core/ui/ListItemTemplate"/> +</span> +</$list> //<small>{{$:/language/Search/Matches/All}}</small>// -<$list filter="[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]" template="$:/core/ui/ListItemTemplate"/> +<$list filter="[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]"> +<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}> +<$transclude tiddler="$:/core/ui/ListItemTemplate"/> +</span> +</$list> \end <<searchResultList>> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 9121d5ace..08cbd45f7 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -2,25 +2,12 @@ title: $:/core/ui/SideBarSegments/search tags: $:/tags/SideBarSegment \whitespace trim -<div class="tc-sidebar-lists tc-sidebar-search"> -<$set name="searchTiddler" value="$:/temp/search"> -<div class="tc-search"> -<$edit-text tiddler="$:/temp/search" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> class="tc-popup-handle" cancelPopups="yes"/> -<$reveal state="$:/temp/search" type="nomatch" text=""> -<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="tc-btn-invisible"> -<$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search}}/> -<$action-setfield $tiddler="$:/temp/search" text=""/> -<$action-navigate $to="$:/AdvancedSearch"/> -{{$:/core/images/advanced-search-button}} -</$button> -<$button class="tc-btn-invisible"> -<$action-setfield $tiddler="$:/temp/search" text="" /> -{{$:/core/images/close-button}} -</$button> +\define count-popup-button() +\whitespace trim <$button popup=<<qualify "$:/state/popup/search-dropdown">> class="tc-btn-invisible"> {{$:/core/images/down-arrow}} -<$list filter="[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]" variable="listItem"> +<$list filter="[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]" variable="listItem"> <$set name="searchTerm" value={{{ [<searchTiddler>get[text]] }}}> <$set name="resultCount" value="""<$count filter="[!is[system]search<searchTerm>]"/>"""> {{$:/language/Search/Matches}} @@ -28,28 +15,65 @@ tags: $:/tags/SideBarSegment </$set> </$list> </$button> +\end + +\define search-results-list() +\whitespace trim +<$list filter="[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> + +{{$:/core/ui/SearchResults}} + +</$list> +\end + +\define delete-state-tiddlers() <$action-deletetiddler $filter="[[$:/temp/search]] [<searchTiddler>] [<searchListState>]"/> + +\define cancel-search-actions() <$action-deletetiddler $filter="[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]"/> + +\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> + +\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> + +<div class="tc-sidebar-lists tc-sidebar-search"> + +<$vars searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">> titleSearchFilter="[!is[system]search:title<userInput>sort[title]limit[250]]" allSearchFilter="[!is[system]search<userInput>sort[title]limit[250]]"> +<div class="tc-search"> +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/search" storeTitle=<<searchTiddler>> + selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search" + tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> + class="tc-popup-handle" primaryListFilter=<<titleSearchFilter>> secondaryListFilter=<<allSearchFilter>> + filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> + inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups="yes" /> +<$reveal state=<<searchTiddler>> type="nomatch" text=""> +<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="tc-btn-invisible"> +<$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search}}/> +<<delete-state-tiddlers>> +<$action-navigate $to="$:/AdvancedSearch"/> +{{$:/core/images/advanced-search-button}} +</$button> +<$button class="tc-btn-invisible"> +<<delete-state-tiddlers>> +{{$:/core/images/close-button}} +</$button> +<<count-popup-button>> </$reveal> -<$reveal state="$:/temp/search" type="match" text=""> +<$reveal state=<<searchTiddler>> type="match" text=""> <$button to="$:/AdvancedSearch" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="tc-btn-invisible"> {{$:/core/images/advanced-search-button}} </$button> </$reveal> </div> -<$reveal tag="div" class="tc-block-dropdown-wrapper" state="$:/temp/search" type="nomatch" text=""> +<$reveal tag="div" class="tc-block-dropdown-wrapper" state=<<searchTiddler>> type="nomatch" text=""> <$reveal tag="div" class="tc-block-dropdown tc-search-drop-down tc-popup-handle" state=<<qualify "$:/state/popup/search-dropdown">> type="nomatch" text="" default=""> -<$list filter="[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> - -{{$:/core/ui/SearchResults}} - -</$list> +<<search-results-list>> </$reveal> </$reveal> -</$set> +</$vars> </div> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 5862f2394..f013aa6a4 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -11,6 +11,11 @@ heading-3: {{$:/language/Buttons/Heading3/Hint}} heading-4: {{$:/language/Buttons/Heading4/Hint}} heading-5: {{$:/language/Buttons/Heading5/Hint}} heading-6: {{$:/language/Buttons/Heading6/Hint}} +input-accept: {{$:/language/Shortcuts/Input/Accept/Hint}} +input-accept-variant: {{$:/language/Shortcuts/Input/AcceptVariant/Hint}} +input-cancel: {{$:/language/Shortcuts/Input/Cancel/Hint}} +input-down: {{$:/language/Shortcuts/Input/Down/Hint}} +input-up: {{$:/language/Shortcuts/Input/Up/Hint}} italic: {{$:/language/Buttons/Italic/Hint}} link: {{$:/language/Buttons/Link/Hint}} linkify: {{$:/language/Buttons/Linkify/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 1fbb9576b..3c7b773ed 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -11,6 +11,11 @@ heading-3: ctrl-3 heading-4: ctrl-4 heading-5: ctrl-5 heading-6: ctrl-6 +input-accept: Enter +input-accept-variant: Alt-Enter +input-cancel: Escape +input-down: Down +input-up: Up link: ctrl-L linkify: alt-shift-L list-bullet: ctrl-shift-L diff --git a/core/wiki/macros/keyboard-driven-input.tid b/core/wiki/macros/keyboard-driven-input.tid new file mode 100644 index 000000000..d26776f71 --- /dev/null +++ b/core/wiki/macros/keyboard-driven-input.tid @@ -0,0 +1,51 @@ +title: $:/core/macros/keyboard-driven-input +tags: $:/tags/Macro + +\define keyboard-input-actions() +<$list filter="[<__index__>match[]]"> +<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/> +</$list> +<$list filter="[<__index__>!match[]]"> +<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>getindex<__index__>] }}}/> +</$list> +\end + +\define input-next-actions(afterOrBefore:"after",reverse:"") +<$list filter="[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]" variable="ignore"> +<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}> +<$set name="filteredList" filter="[subfilter<__primaryListFilter__>addsuffix[-primaryList]] =[subfilter<__secondaryListFilter__>addsuffix[-secondaryList]]"> +<$set name="nextItem" value={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}}> +<$list filter="[<nextItem>minlength[1]]"> +<$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/> +<$list filter="[<__index__>match[]]"> +<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/> +</$list> +<$list filter="[<__index__>!match[]]"> +<$action-setfield $tiddler=<<__tiddler__>> $index=<<__index__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/> +</$list> +<$action-setfield $tiddler=<<__refreshTitle__>> text="yes"/> +</$list> +</$set> +</$set> +</$vars> +</$list> +\end + +\define keyboard-driven-input(tiddler,storeTitle,field:"text",index:"",tag:"input",type,focus:"",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:"",default:"",class,primaryListFilter,secondaryListFilter,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:"0",refreshTitle,selectionStateTitle,cancelPopups:"") +<$keyboard key="((input-accept))" actions=<<__inputAcceptActions__>>> +<$keyboard key="((input-accept-variant))" actions=<<__inputAcceptVariantActions__>>> +<$keyboard key="((input-up))" actions=<<input-next-actions "before" "reverse[]">>> +<$keyboard key="((input-down))" actions=<<input-next-actions>>> +<$keyboard key="((input-cancel))" actions=<<__inputCancelActions__>>> +<$edit-text tiddler=<<__tiddler__>> field=<<__field__>> index=<<__index__>> + inputActions=<<keyboard-input-actions>> tag=<<__tag__>> class=<<__class__>> + placeholder=<<__placeholder__>> default=<<__default__>> focusPopup=<<__focusPopup__>> + focus=<<__focus__>> type=<<__type__>> rows=<<__rows__>> minHeight=<<__minHeight__>> + tabindex=<<__tabindex__>> size=<<__size__>> autoHeight=<<__autoHeight__>> + refreshTitle=<<__refreshTitle__>> cancelPopups=<<__cancelPopups__>>/> +</$keyboard> +</$keyboard> +</$keyboard> +</$keyboard> +</$keyboard> +\end diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 01b3a091e..283c81e3b 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -1,36 +1,54 @@ title: $:/core/macros/tag-picker tags: $:/tags/Macro +\define delete-tag-state-tiddlers() <$action-deletetiddler $filter="[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]"/> + \define add-tag-actions(actions) -<$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> +<$set name="tag" value={{{ [<__tiddler__>get[text]] }}}> +<$list filter="[<currentTiddler>!tag<tag>]" variable="ignore" emptyMessage=""" +<$action-sendmessage $message="tm-remove-tag" $param=<<tag>>/> +"""> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> -<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> $actions$ +</$list> </$set> +<<delete-tag-state-tiddlers>> +<$action-setfield $tiddler=<<refreshTitle>> text="yes"/> \end -\define tag-button(actions) -<$button class="tc-btn-invisible" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> +\define tag-button(actions,selectedClass) +<$button class="tc-btn-invisible $selectedClass$" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> -<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> +<<delete-tag-state-tiddlers>> $actions$ <$macrocall $name="tag-pill" tag=<<tag>>/> </$button> \end +\define clear-tags-actions() +<$list filter="[<__storeTitle__>has[text]] [<__tiddler__>has[text]]" variable="ignore" emptyMessage="""<<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> +<<delete-tag-state-tiddlers>> +</$list> +\end + \define tag-picker-inner(actions) \whitespace trim +<$vars tagSelectionState=<<qualify "$:/state/selected-tag">> storeTitle=<<qualify "$:/temp/NewTagName/input">> refreshTitle=<<qualify "$:/temp/NewTagName/refresh">> nonSystemTagsFilter="[tags[]!is[system]search:title<userInput>sort[]]" systemTagsFilter="[tags[]is[system]search:title<userInput>sort[]]"> <div class="tc-edit-add-tag"> <div> <span class="tc-add-tag-name"> -<$keyboard key="ENTER" actions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>>/>"""> -<$edit-text tiddler=<<newTagNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} cancelPopups="yes"/> -</$keyboard> +<$macrocall $name="keyboard-driven-input" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> + selectionStateTitle=<<tagSelectionState>> primaryListFilter=<<nonSystemTagsFilter>> secondaryListFilter=<<systemTagsFilter>> + inputAcceptActions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>>/>""" inputCancelActions=<<clear-tags-actions>> tag="input" + placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> + class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} + filterMinLength={{$:/config/Tags/MinLength}} cancelPopups=<<cancelPopups>> /> </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> <span class="tc-add-tag-button"> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> -<$button set="$:/temp/NewTagName" setTo="" class=""> -<$macrocall $name="add-tag-actions" actions=<<__actions__>>/> -<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> +<$button set=<<newTagNameTiddler>> setTo="" class=""> +<$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> +$actions$ +<<delete-tag-state-tiddlers>> {{$:/language/EditTemplate/Tags/Add/Button}} </$button> </$set> @@ -38,22 +56,27 @@ $actions$ </div> <div class="tc-block-dropdown-wrapper"> <$reveal state=<<qualify "$:/state/popup/tags-auto-complete">> type="nomatch" text="" default=""> -<div class="tc-block-dropdown"> -<$set name="newTagName" value={{{ [<newTagNameTiddler>get[text]] }}}> -<$list filter="[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$list filter="[tags[]!is[system]search:title<newTagName>sort[]]" variable="tag"> +<div class="tc-block-dropdown tc-block-tags-dropdown"> +<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}> +<$list filter="[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$list filter=<<nonSystemTagsFilter>> variable="tag"> +<$list filter="[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$macrocall $name="tag-button" actions=<<__actions__>> selectedClass="tc-tag-button-selected"/>"""> <$macrocall $name="tag-button" actions=<<__actions__>>/> +</$list> </$list></$list> <hr> -<$list filter="[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$list filter="[tags[]is[system]search:title<newTagName>sort[]]" variable="tag"> +<$list filter="[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$list filter=<<systemTagsFilter>> variable="tag"> +<$list filter="[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$macrocall $name="tag-button" actions=<<__actions__>> selectedClass="tc-tag-button-selected"/>"""> <$macrocall $name="tag-button" actions=<<__actions__>>/> +</$list> </$list></$list> </$set> </div> </$reveal> </div> </div> +</$vars> \end \define tag-picker(actions) \whitespace trim diff --git a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid new file mode 100644 index 000000000..45c4c0ec6 --- /dev/null +++ b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid @@ -0,0 +1,20 @@ +title: keyboard-driven-input Macro +tags: Macros [[Core Macros]] + +The <<.def keyboard-driven-input>> [[macro|Macros]] generates an input field or textarea that lets you cycle through a given list of entries with the <kbd>up</kbd> and <kbd>down</kbd> arrow keys. Doing so, an entry gets selected and can be processed with further actions + +!! Parameters + +To create the input field or textarea, the <<.def keyboard-driven-input>> [[macro|Macros]] accepts all parameters of the EditTextWidget + +The additional parameters are: + +| |purpose |h +|storeTitle |the title of the tiddler that stores the user input | +|selectionStateTitle |the title of the tiddler that stores the selected entry with a -list1 or -list2 suffix to make it unique | +|inputAcceptActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept}}</kbd> | +|inputAcceptVariantActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept-variant}}</kbd> | +|inputCancelActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-cancel}}</kbd> | +|primaryListFilter |a filter that specifies the first item-list | +|secondaryListFilter |a second filter that specifies a second item-list | + diff --git a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid index 7b6dc80a7..a73d8bf69 100644 --- a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid @@ -32,6 +32,8 @@ The content of the `<$edit-text>` widget is ignored. |minHeight |Minimum height for automatically resized `textarea` editors, specified in CSS length units such as "px", "em" or "%" | |rows|Sets the rows attribute of a generated textarea | |cancelPopups |<<.from-version "5.1.23">> if set to "yes", cancels all popups when the input gets focus | +|inputActions |<<.from-version 5.1.23>> Optional actions that are triggered every time an input event occurs within the input field or textarea | +|refreshTitle |<<.from-version 5.1.23>> An optional tiddler title that makes the input field update whenever the specified tiddler changes | ! Notes diff --git a/editions/tw5.com/tiddlers/widgets/EditWidget.tid b/editions/tw5.com/tiddlers/widgets/EditWidget.tid index 34250d002..930319d70 100644 --- a/editions/tw5.com/tiddlers/widgets/EditWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditWidget.tid @@ -19,3 +19,6 @@ The content of the `<$edit>` widget is ignored. |class |A CSS class to be added the generated editing widget | |tabindex |Sets the `tabindex` attribute of the input or textarea to the given value | |cancelPopups |<<.from-version "5.1.23">> if set to "yes", cancels all popups when the input gets focus | +|inputActions |<<.from-version 5.1.23>> Optional actions that are triggered every time an input event occurs within the input field or textarea | +|refreshTitle |<<.from-version 5.1.23>> An optional tiddler title that makes the input field update whenever the specified tiddler changes | + diff --git a/plugins/tiddlywiki/codemirror/engine.js b/plugins/tiddlywiki/codemirror/engine.js index fe64c1ef5..fb75fdafe 100755 --- a/plugins/tiddlywiki/codemirror/engine.js +++ b/plugins/tiddlywiki/codemirror/engine.js @@ -120,6 +120,9 @@ function CodeMirrorEngine(options) { // Set up a change event handler this.cm.on("change",function() { self.widget.saveChanges(self.getText()); + if(self.widget.editInputActions) { + self.widget.invokeActionString(self.widget.editInputActions); + } }); this.cm.on("drop",function(cm,event) { event.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event @@ -142,10 +145,17 @@ CodeMirrorEngine.prototype.setText = function(text,type) { var self = this; self.cm.setOption("mode",type); if(!this.cm.hasFocus()) { - this.cm.setValue(text); + this.updateDomNodeText(text); } }; +/* +Update the DomNode with the new text +*/ +CodeMirrorEngine.prototype.updateDomNodeText = function(text) { + this.cm.setValue(text); +}; + /* Get the text of the engine */ diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 3b52dfaf6..bf2b884d4 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -198,6 +198,13 @@ input[type="checkbox"] { vertical-align: middle; } +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + -webkit-appearance:none; +} + .tc-muted { color: <<colour muted-foreground>>; } @@ -713,6 +720,12 @@ button.tc-btn-invisible.tc-remove-tag-button { outline: none; } +.tc-tag-button-selected, +.tc-list-item-selected a.tc-tiddlylink { + background-color: <<colour primary>>; + color: <<colour tiddler-background>>; +} + /* ** Page layout */ From 5b2048fad12857f7505a72d14d9b3f671467aa1e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 13 Jul 2020 17:49:40 +0100 Subject: [PATCH 0741/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.23.tid | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 38eda873c..36d542fd2 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20200616141840562 -modified: 20200616141840562 +created: 20200713174339234 +modified: 20200713174339234 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -9,6 +9,7 @@ type: text/vnd.tiddlywiki ! Major Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4725]] support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns. ! New and Improved Plugins @@ -58,6 +59,9 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe]] support for SVG favicons * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/f760a2fa796d57e61307a5ea5274d6cd0b6484c7]] `th-saving-tiddler` hook to include information about the draft tiddler (see https://tiddlywiki.com/dev/#Hook%3A%20th-saving-tiddler) * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4723]] [[WidgetMessage: tm-rename-tiddler]] to control whether relinking occurs +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4741]] [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4740]] the EditWidget to pass all attributes through to the sub-widget +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation ! Bug Fixes From d66725fd31e0990962cf5682bc7de065c30b3c7b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 14 Jul 2020 13:32:40 +0200 Subject: [PATCH 0742/2376] Integrate keyboard-driven-input in menubar-search (#4752) --- plugins/tiddlywiki/menubar/items/search.tid | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid index 64c45afc4..8e0ba6482 100644 --- a/plugins/tiddlywiki/menubar/items/search.tid +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -4,14 +4,19 @@ description: Search caption: Search tags: $:/tags/MenuBar -<$set name="searchTiddler" value="$:/temp/menubarsearch"> +\define cancel-search-actions() <$action-deletetiddler $filter="[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]"/> +\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> + +\whitespace trim +<$vars searchTiddler="$:/temp/menubarsearch/input" searchListState=<<qualify "$:/state/search-list/selected-item">> titleSearchFilter="[!is[system]search:title<userInput>sort[title]limit[250]]" allSearchFilter="[!is[system]search<userInput>sort[title]limit[250]]"> <span style="margin: 0 0.5em;"> - -<$edit-text tiddler=<<searchTiddler>> tag="input" type="search" focusPopup="$:/state/popup/menubar-search-dropdown" class="tc-popup-handle tc-menu-show-when-wide" placeholder="Search..." default="" cancelPopups="yes"/> - +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/menubarsearch" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> + refreshTitle="$:/temp/menubarsearch/refresh" tag="input" type="search" focusPopup="$:/state/popup/menubar-search-dropdown" + class="tc-popup-handle tc-menu-show-when-wide" placeholder="Search..." default="" cancelPopups="yes" + primaryListFilter=<<titleSearchFilter>> secondaryListFilter=<<allSearchFilter>> inputAcceptActions=<<input-accept-actions>> + inputCancelActions=<<cancel-search-actions>> filterMinLength={{$:/config/Search/MinLength}}/> </span> - <$reveal tag="div" class="tc-block-dropdown-wrapper" state="$:/state/popup/menubar-search-dropdown" type="nomatch" text="" default=""> <div class="tc-block-dropdown tc-search-drop-down"> @@ -30,4 +35,4 @@ tags: $:/tags/MenuBar </$reveal> -</$set> +</$vars> From a0bd93c59639f3eb6606bda3c34f5e84c246a952 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 14 Jul 2020 13:32:51 +0200 Subject: [PATCH 0743/2376] Make tags in tags-dropdown change bg-color on hover (#4753) --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index bf2b884d4..9b7ffe8f4 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -665,6 +665,10 @@ button svg.tc-image-button, button .tc-image-button img { vertical-align: baseline; } +.tc-block-tags-dropdown > .tc-btn-invisible:hover { + background-color: <<colour primary>>; +} + button.tc-tag-label, span.tc-tag-label { display: inline-block; padding: 0.16em 0.7em; From 00ff0d6fa0f54c9b2dc8e47c22d58d9f80113664 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 14 Jul 2020 18:04:06 +0200 Subject: [PATCH 0744/2376] Add modifier variable to button actionstring (#4671) * Add modifier variable to button actionstring * Update ButtonWidget.tid * Update droppable.js * Create getEventModifierKeyDescriptor method in keyboard.js * Update droppable.js * Update button.js --- core/modules/keyboard.js | 10 ++++++++++ core/modules/widgets/button.js | 3 ++- core/modules/widgets/droppable.js | 3 +-- editions/tw5.com/tiddlers/widgets/ButtonWidget.tid | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core/modules/keyboard.js b/core/modules/keyboard.js index a63d48fbe..a58e1685d 100644 --- a/core/modules/keyboard.js +++ b/core/modules/keyboard.js @@ -284,6 +284,16 @@ KeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) { return false; }; +KeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) { + return event.ctrlKey && !event.shiftKey && !event.altKey ? "ctrl" : + event.shiftKey && !event.ctrlKey && !event.altKey? "shift" : + event.ctrlKey && event.shiftKey && !event.altKey ? "ctrl-shift" : + event.altKey && !event.shiftKey && !event.ctrlKey ? "alt" : + event.altKey && event.shiftKey && !event.ctrlKey ? "alt-shift" : + event.altKey && event.ctrlKey && !event.shiftKey ? "ctrl-alt" : + event.altKey && event.shiftKey && event.ctrlKey ? "ctrl-alt-shift" : "normal"; +}; + KeyboardManager.prototype.getShortcutTiddlerList = function() { return $tw.wiki.getTiddlersWithTag("$:/tags/KeyboardShortcut"); }; diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 67eaf26b9..204a7edf4 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -91,7 +91,8 @@ ButtonWidget.prototype.render = function(parent,nextSibling) { handled = true; } if(self.actions) { - self.invokeActionString(self.actions,self,event); + var modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event); + self.invokeActionString(self.actions,self,event,{modifier: modifierKey}); } if(handled) { event.preventDefault(); diff --git a/core/modules/widgets/droppable.js b/core/modules/widgets/droppable.js index 45f11bf68..e6678527b 100644 --- a/core/modules/widgets/droppable.js +++ b/core/modules/widgets/droppable.js @@ -132,8 +132,7 @@ DroppableWidget.prototype.handleDropEvent = function(event) { DroppableWidget.prototype.performActions = function(title,event) { if(this.droppableActions) { - var modifierKey = event.ctrlKey && ! event.shiftKey ? "ctrl" : event.shiftKey && !event.ctrlKey ? "shift" : - event.ctrlKey && event.shiftKey ? "ctrl-shift" : "normal" ; + var modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event); this.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey}); } }; diff --git a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid index 21a0a48a1..fcaf50f1d 100644 --- a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid @@ -24,7 +24,7 @@ The integrated actions are provided as a shortcut for invoking common actions. T The content of the `<$button>` widget is displayed within the button. |!Attribute |!Description | -|actions |A string containing ActionWidgets to be triggered when the key combination is detected | +|actions |A string containing ActionWidgets to be triggered when the key combination is detected. <<.from-version "5.1.23">> the <<.def "modifier">> variable lists the modifier keys that are pressed when the action is invoked. The possible modifiers are ''ctrl'', ''ctrl-alt'', ''ctrl-shift'', ''alt'', ''alt-shift'', ''shift'' and ''ctrl-alt-shift'' | |to |The title of the tiddler to navigate to | |message |The name of the [[widget message|Messages]] to send when the button is clicked | |param |The optional parameter to the message | From 484c9e986fc6f323e30460a88f134da3a4e8a89e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 15 Jul 2020 13:23:13 +0200 Subject: [PATCH 0745/2376] Fix #4755 - Indirect colours not shown in palette switcher (#4757) * Fix #4755 - Indirect colours not shown in palette switcher * Update currpalettepreview.tid * Update currpalettepreview.tid --- core/wiki/currpalettepreview.tid | 35 +++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/core/wiki/currpalettepreview.tid b/core/wiki/currpalettepreview.tid index b80748737..b5f549666 100644 --- a/core/wiki/currpalettepreview.tid +++ b/core/wiki/currpalettepreview.tid @@ -1,11 +1,40 @@ title: $:/snippets/currpalettepreview +\define resolve-colour(macrocall) +\import $:/core/macros/utils +\whitespace trim +<$wikify name="name" text="""$macrocall$"""> +<<name>> +</$wikify> +\end \define swatchStyle() background-color: $(swatchColour)$; \end +\define swatch-inner() +<$set name="swatchColour" value={{##$(colourResolved)$}}> +<$list filter="[<swatchColour>!prefix[<<colour ]!suffix[>>]]" variable="ignore"> +<div class="tc-swatch" style=<<swatchStyle>> title=<<swatchTitle>>/> +</$list> +<$list filter="[<swatchColour>prefix[<<colour ]suffix[>>]]" variable="ignore"> +<$wikify name="colourResolved" text="""<$macrocall $name="resolve-colour" macrocall=<<swatchColour>>/>"""> +<<swatch-inner>> +</$wikify> +</$list> +</$set> +\end \define swatch() -<$set name="swatchColour" value={{##$(colour)$}} -><div class="tc-swatch" style=<<swatchStyle>> title=<<colour>>/></$set> +<$set name="swatchColour" value={{##$(colour)$}}> +<$set name="swatchTitle" value=<<colour>>> +<$list filter="[<swatchColour>!prefix[<<colour ]!suffix[>>]]" variable="ignore"> +<div class="tc-swatch" style=<<swatchStyle>> title=<<swatchTitle>>/> +</$list> +<$list filter="[<swatchColour>prefix[<<colour ]suffix[>>]]" variable="ignore"> +<$wikify name="colourResolved" text="""<$macrocall $name="resolve-colour" macrocall=<<swatchColour>>/>"""> +<<swatch-inner>> +</$wikify> +</$list> +</$set> +</$set> \end <div class="tc-swatches-horiz"><$list filter=" foreground @@ -15,4 +44,4 @@ primary page-background tab-background tiddler-info-background -" variable="colour"><<swatch>></$list></div> \ No newline at end of file +" variable="colour"><<swatch>></$list></div> From 95e30138f0b34135031d50c1606e8b0059ca6653 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 15 Jul 2020 13:27:14 +0200 Subject: [PATCH 0746/2376] Add modifier variable to linkcatcher actionstring (#4758) * Add modifier variable to linkcatcher actionstring * Update LinkCatcherWidget.tid --- core/modules/widgets/linkcatcher.js | 3 ++- editions/tw5.com/tiddlers/widgets/LinkCatcherWidget.tid | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/linkcatcher.js b/core/modules/widgets/linkcatcher.js index ea0629d6e..28b906b80 100644 --- a/core/modules/widgets/linkcatcher.js +++ b/core/modules/widgets/linkcatcher.js @@ -87,7 +87,8 @@ LinkCatcherWidget.prototype.handleNavigateEvent = function(event) { } if(this.catchActions) { this.executingActions = true; - this.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo}); + var modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event); + this.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey}); this.executingActions = false; } } else { diff --git a/editions/tw5.com/tiddlers/widgets/LinkCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/LinkCatcherWidget.tid index 03089da4a..8b9e8642d 100644 --- a/editions/tw5.com/tiddlers/widgets/LinkCatcherWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/LinkCatcherWidget.tid @@ -23,5 +23,5 @@ The content of the `<$linkcatcher>` widget is displayed normally. |message |Optional identifier for a [[widget message|Messages]] to be sent when a navigation is caught | |set |Optional title of the tiddler to be set to a specified value when navigation occurs | |setTo |Value to be assigned by the `set` attribute | -|actions |Actions to be performed when a link is caught. Within the action string, the variable "navigateTo" contains the title of the tiddler being navigated | +|actions |Actions to be performed when a link is caught. Within the action string, the variable "navigateTo" contains the title of the tiddler being navigated. <<.from-version "5.1.23">> the <<.def "modifier">> variable lists the modifier keys that are pressed when the action is invoked. The possible modifiers are ''ctrl'', ''ctrl-alt'', ''ctrl-shift'', ''alt'', ''alt-shift'', ''shift'' and ''ctrl-alt-shift'' | From 4de95a64c1e367993cfea964093d9ad19758fdd6 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 17 Jul 2020 09:48:30 +0200 Subject: [PATCH 0747/2376] Lower width for field-value input field (#4760) --- themes/tiddlywiki/vanilla/base.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 9b7ffe8f4..5f2e13c5b 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1431,7 +1431,7 @@ html body.tc-body.tc-single-tiddler-window { .tc-edit-field-add-value { display: inline-block; - width: 40%; + width: 35%; } .tc-edit-field-add-button { From 792d2859703b9aadb5b0eec282e43af930a8a508 Mon Sep 17 00:00:00 2001 From: Diep Pham <mrfavadi@gmail.com> Date: Fri, 31 Jul 2020 00:23:36 +0700 Subject: [PATCH 0748/2376] Signing the CLA (#4779) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index fbb1efb28..3332d8b72 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -401,3 +401,5 @@ Tobias Hermann, @idotobi, 2020/04/19 Nicolas Petton, @NicolasPetton, 2020/04/30 Csaba Molnar, @mocsa, 2020/04/29 + +Diep Pham, @favadi, 2020/07/30 From a9d79a1a841fb782b955eeeed6fc69a7b4e9136f Mon Sep 17 00:00:00 2001 From: Diep Pham <mrfavadi@gmail.com> Date: Fri, 31 Jul 2020 00:24:28 +0700 Subject: [PATCH 0749/2376] Fix authenticated-user-header is case sensitive in header authenticator (#4780) From RFC 2616 - "Hypertext Transfer Protocol -- HTTP/1.1", Section 4.2, "Message Headers": Each header field consists of a name followed by a colon (":") and the field value. Field names are case-insensitive. --- core/modules/server/authenticators/header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/server/authenticators/header.js b/core/modules/server/authenticators/header.js index 6d21cf023..4d3894f1c 100644 --- a/core/modules/server/authenticators/header.js +++ b/core/modules/server/authenticators/header.js @@ -14,7 +14,7 @@ Authenticator for trusted header authentication function HeaderAuthenticator(server) { this.server = server; - this.header = server.get("authenticated-user-header"); + this.header = server.get("authenticated-user-header").toLowerCase(); } /* From 97d2af7ebd9cd53790cc0baaa88aa916c53eb343 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 30 Jul 2020 19:14:53 +0100 Subject: [PATCH 0750/2376] TiddlySpot Saver: Add link to control panel Thanks @twmat Fixes #4778 --- core/language/en-GB/ControlPanel.multids | 1 + core/ui/ControlPanel/Saving/TiddlySpot.tid | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 86d352202..c75aa5679 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -117,6 +117,7 @@ Saving/GitService/Gitea/Caption: Gitea Saver Saving/GitService/Gitea/Password: Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`) Saving/TiddlySpot/Advanced/Heading: Advanced Settings Saving/TiddlySpot/BackupDir: Backup Directory +Saving/TiddlySpot/ControlPanel: ~TiddlySpot Control Panel Saving/TiddlySpot/Backups: Backups Saving/TiddlySpot/Caption: ~TiddlySpot Saver Saving/TiddlySpot/Description: These settings are only used when saving to http://tiddlyspot.com or a compatible remote server diff --git a/core/ui/ControlPanel/Saving/TiddlySpot.tid b/core/ui/ControlPanel/Saving/TiddlySpot.tid index 0832b92cd..2497b300e 100644 --- a/core/ui/ControlPanel/Saving/TiddlySpot.tid +++ b/core/ui/ControlPanel/Saving/TiddlySpot.tid @@ -4,14 +4,14 @@ caption: {{$:/language/ControlPanel/Saving/TiddlySpot/Caption}} \define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/ -\define backupURL() -http://$(userName)$.tiddlyspot.com/backup/ +\define siteURL(path) +http://$(userName)$.tiddlyspot.com/$path$/ \end -\define backupLink() +\define siteLink(path) <$reveal type="nomatch" state="$:/UploadName" text=""> <$set name="userName" value={{$:/UploadName}}> <$reveal type="match" state="$:/UploadURL" text=""> -<<backupURL>> +<<siteURL $path$>> </$reveal> <$reveal type="nomatch" state="$:/UploadURL" text=""> <$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>> @@ -24,7 +24,8 @@ http://$(userName)$.tiddlyspot.com/backup/ |<<lingo UserName>> |<$edit-text tiddler="$:/UploadName" default="" tag="input"/> | |<<lingo Password>> |<$password name="upload"/> | -|<<lingo Backups>> |<<backupLink>> | +|<<lingo Backups>> |<<siteLink backup>> | +|<<lingo ControlPanel>> |<<siteLink controlpanel>> | ''<<lingo Advanced/Heading>>'' From b32eb49d50903ad804f4c96424ca743ff3659acb Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Fri, 31 Jul 2020 15:14:01 +0800 Subject: [PATCH 0751/2376] Update chinese translations (#4715) * Update NewJournalTags.tid for zh* languages * Add chinese shortcut descriptions to Misc.multids * Add chinese translations for `Saving/TiddlySpot/ControlPanel` --- languages/zh-Hans/ControlPanel.multids | 1 + languages/zh-Hans/Misc.multids | 5 +++++ languages/zh-Hans/NewJournalTags.tid | 3 ++- languages/zh-Hant/ControlPanel.multids | 1 + languages/zh-Hant/Misc.multids | 5 +++++ languages/zh-Hant/NewJournalTags.tid | 3 ++- 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 446a45b07..e40c7b1b7 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -120,6 +120,7 @@ Saving/TiddlySpot/Advanced/Heading: 高级设置 Saving/TiddlySpot/BackupDir: 备份文件夹 Saving/TiddlySpot/Backups: 备份 Saving/TiddlySpot/Caption: ~TiddlySpot 保存模块 +Saving/TiddlySpot/ControlPanel: ~TiddlySpot 控制台 Saving/TiddlySpot/Description: 这些设置只适用于保存到 http://tiddlyspot.com 或兼容的远程服务器时。 Saving/TiddlySpot/Filename: 上传文件名 Saving/TiddlySpot/Heading: ~TiddlySpot diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 38fadbaf7..ade1710ec 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -62,6 +62,11 @@ OfficialPluginLibrary: ~TiddlyWiki 官方插件程式库 OfficialPluginLibrary/Hint: 此为在 tiddlywiki.com 的 ~TiddlyWiki 官方插件程式库。由核心团队维护的插件、主题和语言包。 PluginReloadWarning: 请保存 {{$:/core/ui/Buttons/save-wiki}} 并刷新页面 {{$:/core/ui/Buttons/refresh}} ,使 ~JavaScript 插件的更改生效 RecentChanges/DateFormat: YYYY年0MM月0DD日 +Shortcuts/Input/Accept/Hint: 接受选取的项目 +Shortcuts/Input/AcceptVariant/Hint: 接受选取项目 (变种) +Shortcuts/Input/Cancel/Hint: 清除输入栏位 +Shortcuts/Input/Down/Hint: 选择下一个项目 +Shortcuts/Input/Up/Hint: 选择前一个项目 SystemTiddler/Tooltip: 此为系统条目 SystemTiddlers/Include/Prompt: 包括系统条目 TagManager/Colour/Heading: 颜色 diff --git a/languages/zh-Hans/NewJournalTags.tid b/languages/zh-Hans/NewJournalTags.tid index 989d4870b..d63fea42f 100644 --- a/languages/zh-Hans/NewJournalTags.tid +++ b/languages/zh-Hans/NewJournalTags.tid @@ -1,2 +1,3 @@ title: $:/config/NewJournal/Tags -tags: 日志 + +日志 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 81b987ff1..988ae4c39 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -120,6 +120,7 @@ Saving/TiddlySpot/Advanced/Heading: 進階設定 Saving/TiddlySpot/BackupDir: 備份資料夾 Saving/TiddlySpot/Backups: 備份 Saving/TiddlySpot/Caption: ~TiddlySpot 儲存模組 +Saving/TiddlySpot/ControlPanel: ~TiddlySpot 控制台 Saving/TiddlySpot/Description: 這些設定只適用於儲存到 http://tiddlyspot.com 或相容的遠端伺服器時。 Saving/TiddlySpot/Filename: 上傳檔名 Saving/TiddlySpot/Heading: ~TiddlySpot diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index fb5e5feeb..94703f4aa 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -62,6 +62,11 @@ OfficialPluginLibrary: ~TiddlyWiki 官方插件程式庫 OfficialPluginLibrary/Hint: 此為在 tiddlywiki.com 的 ~TiddlyWiki 官方插件程式庫。由核心團隊維護的插件、主題和語言包。 PluginReloadWarning: 請儲存 {{$:/core/ui/Buttons/save-wiki}} 並刷新頁面 {{$:/core/ui/Buttons/refresh}} ,使 ~JavaScript 插件的更改生效 RecentChanges/DateFormat: YYYY年0MM月0DD日 +Shortcuts/Input/Accept/Hint: 接受選取的項目 +Shortcuts/Input/AcceptVariant/Hint: 接受選取項目 (變種) +Shortcuts/Input/Cancel/Hint: 清除輸入欄位 +Shortcuts/Input/Down/Hint: 選擇下一個項目 +Shortcuts/Input/Up/Hint: 選擇前一個項目 SystemTiddler/Tooltip: 此為系統條目 SystemTiddlers/Include/Prompt: 包括系統條目 TagManager/Colour/Heading: 顏色 diff --git a/languages/zh-Hant/NewJournalTags.tid b/languages/zh-Hant/NewJournalTags.tid index e7205fab4..46771a8a6 100644 --- a/languages/zh-Hant/NewJournalTags.tid +++ b/languages/zh-Hant/NewJournalTags.tid @@ -1,2 +1,3 @@ title: $:/config/NewJournal/Tags -tags: 日誌 + +日誌 From 222821804e0b0d9f3a54fb15c1f856f25b51c579 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Thu, 30 Jul 2020 23:25:15 -0800 Subject: [PATCH 0752/2376] Fix Entity widget not rendering its content without a refresh (#4776) * Expose TEXT_NODE and ELEMENT_NODE constants * Add failing test for initial rendering of entity widget * Compute attributes when rendering --- core/modules/utils/fakedom.js | 24 +++++++++++++++++++-- core/modules/widgets/entity.js | 1 + editions/test/tiddlers/tests/test-widget.js | 18 ++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/core/modules/utils/fakedom.js b/core/modules/utils/fakedom.js index 3100e731d..ed371100e 100755 --- a/core/modules/utils/fakedom.js +++ b/core/modules/utils/fakedom.js @@ -21,14 +21,32 @@ var bumpSequenceNumber = function(object) { } }; +var TW_Node = function (){ + throw TypeError("Illegal constructor"); +}; + +Object.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', { + get: function() { + return 1; + } +}); + +Object.defineProperty(TW_Node.prototype, 'TEXT_NODE', { + get: function() { + return 3; + } +}); + var TW_TextNode = function(text) { bumpSequenceNumber(this); this.textContent = text + ""; }; +TW_TextNode.prototype = Object.create(TW_Node.prototype); + Object.defineProperty(TW_TextNode.prototype, "nodeType", { get: function() { - return 3; + return this.TEXT_NODE; } }); @@ -49,6 +67,8 @@ var TW_Element = function(tag,namespace) { this.namespaceURI = namespace || "http://www.w3.org/1999/xhtml"; }; +TW_Element.prototype = Object.create(TW_Node.prototype); + Object.defineProperty(TW_Element.prototype, "style", { get: function() { return this._style; @@ -69,7 +89,7 @@ Object.defineProperty(TW_Element.prototype, "style", { Object.defineProperty(TW_Element.prototype, "nodeType", { get: function() { - return 1; + return this.ELEMENT_NODE; } }); diff --git a/core/modules/widgets/entity.js b/core/modules/widgets/entity.js index 5c885baea..0b5e68375 100755 --- a/core/modules/widgets/entity.js +++ b/core/modules/widgets/entity.js @@ -28,6 +28,7 @@ Render this widget into the DOM */ EntityWidget.prototype.render = function(parent,nextSibling) { this.parentDomNode = parent; + this.computeAttributes(); this.execute(); var entityString = this.getAttribute("entity",this.parseTreeNode.entity || ""), textNode = this.document.createTextNode($tw.utils.entityDecode(entityString)); diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index 0efc8b126..f3d500489 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -273,6 +273,24 @@ describe("Widget module", function() { expect(wrapper.innerHTML).toBe("<p><a href=\"data:text/vnd.tiddlywiki,Jolly%20Old%20World\">My linky link</a></p>"); }); + /* This test reproduces issue #4693. */ + it("should render the entity widget", function() { + var wiki = new $tw.Wiki(); + // Construct the widget node + var text = "\n\n<$entity entity=' ' />\n\n<$entity entity='✓' />\n"; + var widgetNode = createWidgetNode(parseText(text,wiki),wiki); + // Render the widget node to the DOM + var wrapper = renderWidgetNode(widgetNode); + // Test the rendering + expect(wrapper.innerHTML).toBe(" ✓"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].nodeType).toBe(wrapper.children[0].TEXT_NODE); + expect(wrapper.children[1].sequenceNumber).toBe(2); + expect(wrapper.children[1].nodeType).toBe(wrapper.children[1].TEXT_NODE); + }); + it("should deal with the list widget", function() { var wiki = new $tw.Wiki(); // Add some tiddlers From 5a6e35b4b023de2fa89c88330aae5f6d7afdc536 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 31 Jul 2020 13:54:06 +0200 Subject: [PATCH 0753/2376] Update keyboard-driven-input_Macro.tid (#4781) --- .../tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid index 45c4c0ec6..b32084802 100644 --- a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid +++ b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid @@ -11,7 +11,7 @@ The additional parameters are: | |purpose |h |storeTitle |the title of the tiddler that stores the user input | -|selectionStateTitle |the title of the tiddler that stores the selected entry with a -list1 or -list2 suffix to make it unique | +|selectionStateTitle |the title of the tiddler that stores the selected entry with a -primaryList or -secondaryList suffix to make it unique | |inputAcceptActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept}}</kbd> | |inputAcceptVariantActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept-variant}}</kbd> | |inputCancelActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-cancel}}</kbd> | From 7acb9a255bde99612aa3356946a8683ceee41f92 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Fri, 31 Jul 2020 04:01:21 -0800 Subject: [PATCH 0754/2376] Fix markdown table to honor alignment directives (#4774) * Extract withChildren * Handle table cell alignment * :art: add missing semicolon --- plugins/tiddlywiki/markdown/wrapper.js | 86 ++++++++++++++++---------- 1 file changed, 53 insertions(+), 33 deletions(-) diff --git a/plugins/tiddlywiki/markdown/wrapper.js b/plugins/tiddlywiki/markdown/wrapper.js index 270c6bf6e..47d098cea 100755 --- a/plugins/tiddlywiki/markdown/wrapper.js +++ b/plugins/tiddlywiki/markdown/wrapper.js @@ -69,7 +69,7 @@ function findTagWithType(nodes, startPoint, type, level) { function convertNodes(remarkableTree, isStartOfInline) { let out = []; var accumulatedText = ''; - function wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) { + function withChildren(currentIndex, currentLevel, closingType, nodes, callback) { var j = findTagWithType(nodes, currentIndex + 1, closingType, currentLevel); if (j === false) { console.error("Failed to find a " + closingType + " node after position " + currentIndex); @@ -77,14 +77,18 @@ function convertNodes(remarkableTree, isStartOfInline) { return currentIndex + 1; } let children = convertNodes(nodes.slice(currentIndex + 1, j)); - - out.push({ - type: "element", - tag: elementTag, - children: children - }); + callback(children); return j; } + function wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) { + return withChildren(currentIndex, currentLevel, closingType, nodes, function(children) { + out.push({ + type: "element", + tag: elementTag, + children: children + }); + }); + } for (var i = 0; i < remarkableTree.length; i++) { var currentNode = remarkableTree[i]; @@ -110,33 +114,32 @@ function convertNodes(remarkableTree, isStartOfInline) { break; case "link_open": - var j = findTagWithType(remarkableTree, i + 1, "link_close", currentNode.level); - - if (currentNode.href[0] !== "#") { - // External link - var attributes = { - href: { type: "string", value: currentNode.href } - }; - if (pluginOpts.linkNewWindow) { - attributes.target = { type: "string", value: "_blank" }; + i = withChildren(i, currentNode.level, "link_close", remarkableTree, function(children) { + if (currentNode.href[0] !== "#") { + // External link + var attributes = { + href: { type: "string", value: currentNode.href } + }; + if (pluginOpts.linkNewWindow) { + attributes.target = { type: "string", value: "_blank" }; + } + out.push({ + type: "element", + tag: "a", + attributes: attributes, + children: children + }); + } else { + // Internal link + out.push({ + type: "link", + attributes: { + to: { type: "string", value: decodeURI(currentNode.href.substr(1)) } + }, + children: children + }); } - out.push({ - type: "element", - tag: "a", - attributes: attributes, - children: convertNodes(remarkableTree.slice(i + 1, j)) - }); - } else { - // Internal link - out.push({ - type: "link", - attributes: { - to: { type: "string", value: decodeURI(currentNode.href.substr(1)) } - }, - children: convertNodes(remarkableTree.slice(i + 1, j)) - }); - } - i = j; + }); break; case "code": @@ -185,6 +188,23 @@ function convertNodes(remarkableTree, isStartOfInline) { }); break; + case "th_open": + case "td_open": + var elementTag = currentNode.type.slice(0, 2); + i = withChildren(i, currentNode.level, elementTag + "_close", remarkableTree, function(children) { + var attributes = {}; + if (currentNode.align) { + attributes.style = { type: "string", value: "text-align:" + currentNode.align }; + } + out.push({ + type: "element", + tag: elementTag, + attributes: attributes, + children: children + }); + }); + break; + case "hr": out.push({ type: 'element', From 84b6a8529375d008cbf284fd496cda9c6d9ad714 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 31 Jul 2020 15:49:09 +0200 Subject: [PATCH 0755/2376] Fix css selector for edit template new field (#4783) --- core/ui/EditTemplate/fields.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index dd0b49a65..aa8a87b46 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -11,7 +11,7 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ \end \define current-tiddler-new-field-selector() -[data-tiddler-title="$(currentTiddlerCSSescaped)$"] .tc-edit-field-add-name input +[data-tiddler-title="$(currentTiddlerCSSescaped)$"] .tc-edit-field-add-name-wrapper input \end \define new-field-actions() From 9898e5e2db0852d5c9b2c2afb65620e318658ea9 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Sun, 2 Aug 2020 03:11:11 -0800 Subject: [PATCH 0756/2376] Don't run build-* stages for PRs against master (#4788) --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index cae7500c7..95199ed75 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,9 +5,9 @@ node_js: stages: - name: test - name: build-prerelease - if: branch = "master" + if: branch = "master" AND type = push AND fork = false - name: build-tiddlywiki-com - if: branch = "tiddlywiki-com" + if: branch = "tiddlywiki-com" AND type = push AND fork = false jobs: include: From dd79c096be281fb377cd97e5f47d5d3c08b7f5ac Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 3 Aug 2020 11:41:23 +0200 Subject: [PATCH 0757/2376] Fix #4786 (#4787) * Fix #4786 Fix #4786 * Update header.js --- core/modules/server/authenticators/header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/server/authenticators/header.js b/core/modules/server/authenticators/header.js index 4d3894f1c..78ae6cb0a 100644 --- a/core/modules/server/authenticators/header.js +++ b/core/modules/server/authenticators/header.js @@ -14,7 +14,7 @@ Authenticator for trusted header authentication function HeaderAuthenticator(server) { this.server = server; - this.header = server.get("authenticated-user-header").toLowerCase(); + this.header = server.get("authenticated-user-header") ? server.get("authenticated-user-header").toLowerCase() : undefined; } /* From bbdd12cffdeeaffbcc9cc84dd5d95d9c0346e164 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 3 Aug 2020 12:09:56 +0200 Subject: [PATCH 0758/2376] Add EditTabIndex config (tabindex = 1) (#4791) --- core/wiki/config/EditTabIndex.tid | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 core/wiki/config/EditTabIndex.tid diff --git a/core/wiki/config/EditTabIndex.tid b/core/wiki/config/EditTabIndex.tid new file mode 100644 index 000000000..3822d1e72 --- /dev/null +++ b/core/wiki/config/EditTabIndex.tid @@ -0,0 +1,3 @@ +title: $:/config/EditTabIndex + +1 From 17e2b208e851a610f3e37deb209c757da56f990f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 10 Aug 2020 10:25:14 +0200 Subject: [PATCH 0759/2376] Fix #4794 - tc-type-selector-wrapper not containing tc-edit (#4798) * Update type.tid * Update base.tid --- core/ui/EditTemplate/type.tid | 4 +++- themes/tiddlywiki/vanilla/base.tid | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index edf4bf982..81c190186 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -3,8 +3,9 @@ tags: $:/tags/EditTemplate \define lingo-base() $:/language/EditTemplate/ \whitespace trim +<div class="tc-edit-type-selector-wrapper"> <em class="tc-edit"><<lingo Type/Prompt>></em>   -<div class="tc-type-selector-wrapper"> +<div class="tc-type-selector-dropdown-wrapper"> <div class="tc-type-selector"><$fieldmangler> <$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes"/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> </$fieldmangler></div> @@ -27,3 +28,4 @@ tags: $:/tags/EditTemplate </$set> </div> </div> +</div> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 5f2e13c5b..49ccd1ad8 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1323,7 +1323,7 @@ html body.tc-body.tc-single-tiddler-window { width: auto; } -.tc-type-selector-wrapper { +.tc-type-selector-dropdown-wrapper { display: inline-block; } From 981e3bed457f449ce0bbadc2364da1844f1b2046 Mon Sep 17 00:00:00 2001 From: Adithya Badidey <bmadithya@gmail.com> Date: Mon, 10 Aug 2020 19:26:33 +0530 Subject: [PATCH 0760/2376] Signing the CLA (#4801) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 4134f877f..5fd7055be 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -403,3 +403,5 @@ Nicolas Petton, @NicolasPetton, 2020/04/30 Csaba Molnar, @mocsa, 2020/04/29 Jonas Passerini, @passuf, 2020/05/14 + +Adithya Badidey, @adithya-badidey, 2020/08/10 From 89c0c6157b541b18b8081776283a6f73e2b2e42d Mon Sep 17 00:00:00 2001 From: John Duhamel <john.duhamel@gmail.com> Date: Tue, 11 Aug 2020 01:02:28 +0530 Subject: [PATCH 0761/2376] Add saver for Hyperdrive protocol used in Beaker 1.x (#4777) --- core/modules/savers/hyperdrive.js | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 core/modules/savers/hyperdrive.js diff --git a/core/modules/savers/hyperdrive.js b/core/modules/savers/hyperdrive.js new file mode 100644 index 000000000..232392672 --- /dev/null +++ b/core/modules/savers/hyperdrive.js @@ -0,0 +1,64 @@ +/*\ +title: $:/core/modules/savers/hyperdrive.js +type: application/javascript +module-type: saver + +Saves files using the Hyperdrive Protocol (https://hypercore-protocol.org/#hyperdrive) Beaker browser beta-1.0 and later (https://beakerbrowser.com) +Compatible with beaker >= V1.0.0 + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Set up the saver +*/ +var HyperdriveSaver = function(wiki) { + this.wiki = wiki; +}; + +HyperdriveSaver.prototype.save = function(text,method,callback) { + var dat = beaker.hyperdrive.drive("" + window.location), + pathname = ("" + window.location.pathname).split("#")[0]; + dat.stat(pathname).then(function(value) { + if(value.isDirectory()) { + pathname = pathname + "/index.html"; + } + dat.writeFile(pathname,text,"utf8").then(function(value) { + callback(null); + },function(reason) { + callback("Hyperdrive Saver Write Error: " + reason); + }); + },function(reason) { + callback("Hyperdrive Saver Stat Error: " + reason); + }); + return true; +}; + +/* +Information about this saver +*/ +HyperdriveSaver.prototype.info = { + name: "beaker-1.x", + priority: 3000, + capabilities: ["save", "autosave"] +}; + +/* +Static method that returns true if this saver is capable of working +*/ +exports.canSave = function(wiki) { + return !!window.beaker && !!beaker.hyperdrive && location.protocol==="hyper:"; +}; + +/* +Create an instance of this saver +*/ +exports.create = function(wiki) { + return new HyperdriveSaver(wiki); +}; + +})(); From 7e964e950140d7d245884fec8155a71427a20d7c Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 11 Aug 2020 12:32:39 +0100 Subject: [PATCH 0762/2376] Browser-storage: Fix startup constraints The use of $tw.perf requires the "startup" startup module to be executed first. --- plugins/tiddlywiki/browser-storage/startup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/browser-storage/startup.js b/plugins/tiddlywiki/browser-storage/startup.js index f76e7fc98..605c95daf 100644 --- a/plugins/tiddlywiki/browser-storage/startup.js +++ b/plugins/tiddlywiki/browser-storage/startup.js @@ -15,7 +15,7 @@ Startup initialisation // Export name and synchronous status exports.name = "browser-storage"; exports.platforms = ["browser"]; -exports.after = ["load-modules"]; +exports.after = ["startup"]; exports.synchronous = true; var ENABLED_TITLE = "$:/config/BrowserStorage/Enabled", From fca98793217820b72866159c216f2c4ade046dab Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Tue, 11 Aug 2020 15:08:01 +0200 Subject: [PATCH 0763/2376] Rename savewikifolder.tig to savewikifolder.tid (#4804) --- languages/de-DE/Help/{savewikifolder.tig => savewikifolder.tid} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename languages/de-DE/Help/{savewikifolder.tig => savewikifolder.tid} (100%) diff --git a/languages/de-DE/Help/savewikifolder.tig b/languages/de-DE/Help/savewikifolder.tid similarity index 100% rename from languages/de-DE/Help/savewikifolder.tig rename to languages/de-DE/Help/savewikifolder.tid From 8cf458d3b3f1e38c14a2819529e08dca4a7e297c Mon Sep 17 00:00:00 2001 From: Adithya Badidey <bmadithya@gmail.com> Date: Tue, 11 Aug 2020 23:24:17 +0530 Subject: [PATCH 0764/2376] Adding SolarizedDark Palette, updated SolarizedLight and one tiny UI fix (#4799) * Fixed Overflow svg fill When hovered, the svg should be the same colour as the text it comes alongside. This fixes that. * Fixed the Solarized Palettes as per spec - Added the Solarized Dark palette - Remade the Solarized Light palette with the right contrast ratios as per Solarized Spec. * Sidebar Selected Tab UI Change Changed the selected tab border and foreground from pink to white(base01) because the pink was too distracting and not very readable. * Fixed Hover css for plugin info listing The css was not working so I fixed it. * Fixed the UI for plugin info tiddler (among others) --- core/palettes/SolarizedDark.tid | 112 ++++++++++++++++++ core/palettes/SolarizedLight.tid | 182 ++++++++++++++--------------- themes/tiddlywiki/vanilla/base.tid | 6 +- 3 files changed, 202 insertions(+), 98 deletions(-) create mode 100644 core/palettes/SolarizedDark.tid diff --git a/core/palettes/SolarizedDark.tid b/core/palettes/SolarizedDark.tid new file mode 100644 index 000000000..2a0fd5e8a --- /dev/null +++ b/core/palettes/SolarizedDark.tid @@ -0,0 +1,112 @@ +title: $:/palettes/SolarizedDark +tags: $:/tags/Palette +type: application/x-tiddler-dictionary +description: Precision dark colors for machines and people +license: MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE +name: SolarizedDark + +alert-background: #073642 +alert-border: #93a1a1 +alert-highlight: #d33682 +alert-muted-foreground: #d33682 +background: #073642 +blockquote-bar: #d33682 +button-background: #073642 +button-border: #586e75 +button-foreground: #93a1a1 +code-background: #073642 +code-border: #586e75 +code-foreground: #93a1a1 +dirty-indicator: inherit +download-background: #859900 +download-foreground: #073642 +dragger-background: #073642 +dragger-foreground: #839496 +dropdown-background: #073642 +dropdown-border: #93a1a1 +dropdown-tab-background: #002b36 +dropdown-tab-background-selected: #073642 +dropzone-background: #859900 +external-link-background: inherit +external-link-background-hover: inherit +external-link-background-visited: inherit +external-link-foreground: #268bd2 +external-link-foreground-hover: +external-link-foreground-visited: #268bd2 +foreground: #839496 +message-background: #002b36 +message-border: #586e75 +message-foreground: #839496 +modal-backdrop: #657b83 +modal-background: #002b36 +modal-border: #586e75 +modal-footer-background: #073642 +modal-footer-border: #586e75 +modal-header-border: #586e75 +muted-foreground: #93a1a1 +notification-background: #002b36 +notification-border: #586e75 +page-background: #073642 +pre-background: inherit +pre-border: #657b83 +primary: #859900 +select-tag-background: #002b36 +select-tag-foreground: #839496 +sidebar-button-foreground: #93a1a1 +sidebar-controls-foreground: #93a1a1 +sidebar-controls-foreground-hover: #eee8d5 +sidebar-foreground: #93a1a1 +sidebar-foreground-shadow: transparent +sidebar-muted-foreground: #839496 +sidebar-muted-foreground-hover: #93a1a1 +sidebar-tab-background: #002b36 +sidebar-tab-background-selected: #073642 +sidebar-tab-border: #073642 +sidebar-tab-border-selected: #839496 +sidebar-tab-divider: #002b36 +sidebar-tab-foreground: #657b83 +sidebar-tab-foreground-selected: #93a1a1 +sidebar-tiddler-link-foreground: #2aa198 +sidebar-tiddler-link-foreground-hover: #eee8d5 +site-title-foreground: #d33682 +static-alert-foreground: #93a1a1 +tab-background: #073642 +tab-background-selected: #002b36 +tab-border: #586e75 +tab-border-selected: #93a1a1 +tab-divider: #93a1a1 +tab-foreground: #839496 +tab-foreground-selected: #93a1a1 +table-border: #586e75 +table-footer-background: #073642 +table-header-background: #073642 +tag-background: #b58900 +tag-foreground: #002b36 +tiddler-background: #002b36 +tiddler-border: #586e75 +tiddler-controls-foreground: inherit +tiddler-controls-foreground-hover: #d33682 +tiddler-controls-foreground-selected: #2aa198 +tiddler-editor-background: #002b36 +tiddler-editor-border: #073642 +tiddler-editor-border-image: #002b36 +tiddler-editor-fields-even: #002b36 +tiddler-editor-fields-odd: #073642 +tiddler-info-background: #073642 +tiddler-info-border: #657b83 +tiddler-info-tab-background: #002b36 +tiddler-link-background: #002b36 +tiddler-link-foreground: #2aa198 +tiddler-subtitle-foreground: #839496 +tiddler-title-foreground: #d33682 +toolbar-cancel-button: #839496 +toolbar-close-button: #839496 +toolbar-delete-button: #dc322f +toolbar-done-button: #839496 +toolbar-edit-button: #839496 +toolbar-info-button: #839496 +toolbar-new-button: #839496 +toolbar-options-button: #839496 +toolbar-save-button: inherit +untagged-background: #586e75 +very-muted-foreground: #586e75 diff --git a/core/palettes/SolarizedLight.tid b/core/palettes/SolarizedLight.tid index 13c6b83a5..3c6979ec6 100644 --- a/core/palettes/SolarizedLight.tid +++ b/core/palettes/SolarizedLight.tid @@ -6,115 +6,107 @@ license: MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/ma name: SolarizedLight alert-background: #eee8d5 -alert-border: #073642 -alert-highlight: #cb4b16 -alert-muted-foreground: #586e75 -background: #fdf6e3 -blockquote-bar: <<colour muted-foreground>> -button-background: #cb4b16 -button-foreground: #fdf6e3 -button-border: transparent +alert-border: #586e75 +alert-highlight: #d33682 +alert-muted-foreground: #d33682 +background: #eee8d5 +blockquote-bar: #d33682 +button-background: #eee8d5 +button-border: #93a1a1 +button-foreground: #586e75 code-background: #eee8d5 code-border: #93a1a1 -code-foreground: #d33682 -diff-delete-background: #BF616A -diff-delete-foreground: <<colour foreground>> -diff-equal-background: -diff-equal-foreground: <<colour foreground>> -diff-insert-background: #859900 -diff-insert-foreground: <<colour foreground>> -diff-invisible-background: -diff-invisible-foreground: <<colour muted-foreground>> -dirty-indicator: #D08770 +code-foreground: #586e75 +dirty-indicator: inherit download-background: #859900 -download-foreground: <<colour background>> -dragger-background: <<colour foreground>> -dragger-foreground: <<colour background>> -dropdown-background: <<colour background>> -dropdown-border: <<colour background>> -dropdown-tab-background-selected: #fdf6e3 -dropdown-tab-background: #93a1a1 +download-foreground: #eee8d5 +dragger-background: #eee8d5 +dragger-foreground: #657b83 +dropdown-background: #eee8d5 +dropdown-border: #586e75 +dropdown-tab-background: #fdf6e3 +dropdown-tab-background-selected: #eee8d5 dropzone-background: #859900 +external-link-background: inherit external-link-background-hover: inherit external-link-background-visited: inherit -external-link-background: inherit -external-link-foreground-hover: #d33682 -external-link-foreground-visited: #b58900 -external-link-foreground: #cb4b16 -foreground: #839496 -message-background: #586e75 -message-border: #586e75 -message-foreground: #eee8d5 -modal-backdrop: <<colour foreground>> -modal-background: <<colour background>> -modal-border: #eee8d5 +external-link-foreground: #268bd2 +external-link-foreground-hover: inherit +external-link-foreground-visited: #268bd2 +foreground: #657b83 +message-background: #fdf6e3 +message-border: #93a1a1 +message-foreground: #657b83 +modal-backdrop: #839496 +modal-background: #fdf6e3 +modal-border: #93a1a1 modal-footer-background: #eee8d5 -modal-footer-border: #eee8d5 -modal-header-border: #eee8d5 -muted-foreground: #93a1a1 -notification-background: #EBCB8B -notification-border: #D08770 +modal-footer-border: #93a1a1 +modal-header-border: #93a1a1 +muted-foreground: #586e75 +notification-background: #fdf6e3 +notification-border: #93a1a1 page-background: #eee8d5 pre-background: #eee8d5 -pre-border: #93a1a1 -primary: #2aa198 -select-tag-background: #eee8d5 -select-tag-foreground: <<colour foreground>> -sidebar-button-foreground: #eee8d5 -sidebar-controls-foreground-hover: #268bd2 +pre-border: #839496 +primary: #859900 +select-tag-background: #fdf6e3 +select-tag-foreground: #657b83 +sidebar-button-foreground: #586e75 sidebar-controls-foreground: #586e75 +sidebar-controls-foreground-hover: #d33682 +sidebar-foreground: #586e75 sidebar-foreground-shadow: transparent -sidebar-foreground: #839496 -sidebar-muted-foreground-hover: #657b83 -sidebar-muted-foreground: #93a1a1 +sidebar-muted-foreground: #657b83 +sidebar-muted-foreground-hover: #586e75 +sidebar-tab-background: #fdf6e3 sidebar-tab-background-selected: #eee8d5 -sidebar-tab-background: #839496 -sidebar-tab-border-selected: <<colour tab-border-selected>> -sidebar-tab-border: #657b83 -sidebar-tab-divider: <<colour page-background>> -sidebar-tab-foreground-selected: #839496 -sidebar-tab-foreground: <<colour tab-foreground>> -sidebar-tiddler-link-foreground-hover: #859900 -sidebar-tiddler-link-foreground: #268bd2 -site-title-foreground: <<colour tiddler-title-foreground>> -static-alert-foreground: #dc322f +sidebar-tab-border: #eee8d5 +sidebar-tab-border-selected: #657b83 +sidebar-tab-divider: #fdf6e3 +sidebar-tab-foreground: #839496 +sidebar-tab-foreground-selected: #586e75 +sidebar-tiddler-link-foreground: #2aa198 +sidebar-tiddler-link-foreground-hover: #002b36 +site-title-foreground: #d33682 +static-alert-foreground: #586e75 +tab-background: #eee8d5 tab-background-selected: #fdf6e3 -tab-background: #839496 -tab-border-selected: #93a1a1 tab-border: #93a1a1 -tab-divider: #fdf6e3 -tab-foreground-selected: #839496 -tab-foreground: #eee8d5 -table-border: #657b83 -table-footer-background: #657b83 -table-header-background: #93a1a1 -tag-background: #6c71c4 -tag-foreground: #eee8d5 -tiddler-background: <<colour background>> -tiddler-border: <<colour background>> -tiddler-controls-foreground-hover: #b58900 -tiddler-controls-foreground-selected: #b58900 -tiddler-controls-foreground: #073642 -tiddler-editor-background: #eee8d5 -tiddler-editor-border-image: #eee8d5 +tab-border-selected: #586e75 +tab-divider: #586e75 +tab-foreground: #657b83 +tab-foreground-selected: #586e75 +table-border: #93a1a1 +table-footer-background: #eee8d5 +table-header-background: #eee8d5 +tag-background: #b58900 +tag-foreground: #fdf6e3 +tiddler-background: #fdf6e3 +tiddler-border: #93a1a1 +tiddler-controls-foreground: inherit +tiddler-controls-foreground-hover: #d33682 +tiddler-controls-foreground-selected: #2aa198 +tiddler-editor-background: #fdf6e3 tiddler-editor-border: #eee8d5 -tiddler-editor-fields-even: #eee8d5 -tiddler-editor-fields-odd: #fdf6e3 +tiddler-editor-border-image: #fdf6e3 +tiddler-editor-fields-even: #fdf6e3 +tiddler-editor-fields-odd: #eee8d5 tiddler-info-background: #eee8d5 -tiddler-info-border: #eee8d5 -tiddler-info-tab-background: #586e75 -tiddler-link-background: <<colour background>> -tiddler-link-foreground: <<colour primary>> -tiddler-subtitle-foreground: #586e75 -tiddler-title-foreground: #073642 -toolbar-new-button: -toolbar-options-button: -toolbar-save-button: -toolbar-info-button: -toolbar-edit-button: -toolbar-close-button: -toolbar-delete-button: -toolbar-cancel-button: -toolbar-done-button: -untagged-background: #839496 +tiddler-info-border: #839496 +tiddler-info-tab-background: #fdf6e3 +tiddler-link-background: #fdf6e3 +tiddler-link-foreground: #2aa198 +tiddler-subtitle-foreground: #657b83 +tiddler-title-foreground: #d33682 +toolbar-cancel-button: #657b83 +toolbar-close-button: #657b83 +toolbar-delete-button: #dc322f +toolbar-done-button: #657b83 +toolbar-edit-button: #657b83 +toolbar-info-button: #657b83 +toolbar-new-button: #657b83 +toolbar-options-button: #657b83 +toolbar-save-button: inherit +untagged-background: #586e75 very-muted-foreground: #93a1a1 diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 49ccd1ad8..f3838f2c9 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1499,7 +1499,7 @@ html body.tc-body.tc-single-tiddler-window { } .tc-drop-down button.tc-btn-invisible:hover svg { - fill: <<colour foreground>>; + fill: <<colour background>>; } .tc-drop-down .tc-drop-down-info { @@ -2191,8 +2191,8 @@ a.tc-tiddlylink.tc-plugin-info:hover { fill: <<colour foreground>>; } -a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > svg { - fill: <<colour foreground>>; +a.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg { + fill: <<colour background>>; } .tc-plugin-info-chunk { From f74c49f393da3213abadaa52dd09940d708ea635 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 14 Aug 2020 11:06:08 +0100 Subject: [PATCH 0765/2376] Fix syncing issues with external JS template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #4808 --- .../external-js/tiddlywiki.js.tiddlers.tid | 4 ---- core/wiki/config/SyncFilter.tid | 2 +- editions/server-external-js/tiddlywiki.info | 23 +++++++++++++++++++ ...Using the external JavaScript template.tid | 10 +++++--- .../tiddlyweb/config-tiddlers-filter.tid | 2 +- .../tiddlywiki/tiddlyweb/tiddlywebadaptor.js | 2 +- 6 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 editions/server-external-js/tiddlywiki.info diff --git a/core/templates/external-js/tiddlywiki.js.tiddlers.tid b/core/templates/external-js/tiddlywiki.js.tiddlers.tid index 52b2c293f..322e7ae5e 100644 --- a/core/templates/external-js/tiddlywiki.js.tiddlers.tid +++ b/core/templates/external-js/tiddlywiki.js.tiddlers.tid @@ -2,8 +2,4 @@ title: $:/core/templates/tiddlywiki5.js/tiddlers ` $tw.preloadTiddlerArray(`<$text text=<<jsontiddlers "[[$:/core]]">>/>`); -$tw.preloadTiddlerArray([{ - title: "$:/config/SaveWikiButton/Template", - text: "$:/core/save/all-external-js" -}]); ` diff --git a/core/wiki/config/SyncFilter.tid b/core/wiki/config/SyncFilter.tid index 2c91f6e7b..c2c65e551 100644 --- a/core/wiki/config/SyncFilter.tid +++ b/core/wiki/config/SyncFilter.tid @@ -1,3 +1,3 @@ title: $:/config/SyncFilter -[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] \ No newline at end of file +[is[tiddler]] -[[$:/core]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] \ No newline at end of file diff --git a/editions/server-external-js/tiddlywiki.info b/editions/server-external-js/tiddlywiki.info new file mode 100644 index 000000000..0f627e404 --- /dev/null +++ b/editions/server-external-js/tiddlywiki.info @@ -0,0 +1,23 @@ +{ + "description": "Client-server edition with external tiddlywiki.js", + "plugins": [ + "tiddlywiki/tiddlyweb", + "tiddlywiki/filesystem", + "tiddlywiki/highlight" + ], + "themes": [ + "tiddlywiki/vanilla", + "tiddlywiki/snowwhite" + ], + "build": { + "listen": [ + "--listen","root-tiddler=$:/core/save/all-external-js"], + "index": [ + "--rendertiddler","$:/plugins/tiddlywiki/tiddlyweb/save/offline","index.html","text/plain"], + "static": [ + "--rendertiddler","$:/core/templates/static.template.html","static.html","text/plain", + "--rendertiddler","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain", + "--rendertiddlers","[!is[system]]","$:/core/templates/static.tiddler.html","static","text/plain", + "--rendertiddler","$:/core/templates/static.template.css","static/static.css","text/plain"] + } +} \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid b/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid index 122a30629..be1e8cddd 100644 --- a/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid +++ b/editions/tw5.com/tiddlers/webserver/Using the external JavaScript template.tid @@ -1,18 +1,22 @@ created: 20180905075846391 -modified: 20180905080955513 +modified: 20200814110131083 tags: [[WebServer Guides]] title: Using the external JavaScript template type: text/vnd.tiddlywiki -Setting the [[root-tiddler|WebServer Parameter: root-tiddler]] parameter to `$:/core/save/all-external-js` switches to a special template that externalises TiddlyWiki's core JavaScript into a separate file. For example: +Setting the [[root-tiddler|WebServer Parameter: root-tiddler]] parameter to `$:/core/save/all-external-js` switches to a special template that externalises TiddlyWiki's core ~JavaScript into a separate file. For example: ``` tiddlywiki editions/tw5.com-server/ --listen host=0.0.0.0 "root-tiddler=$:/core/save/all-external-js" ``` +To ensure that the "save changes" button saves a full, standalone wiki, it is also necessary to set the tiddler $:/config/SaveWikiButton/Template to contain `$:/core/save/all-external-js`. + +The provided edition `server-external-js` contains all the configuration necessary to use the external ~JavaScript template. + !! Background -TiddlyWiki in the single file configuration ordinarily packs everything into a single file: your data, and the JavaScript, CSS and HTML comprising TiddlyWiki itself. This lack of dependencies is usually very convenient: it means that it is impossible for the parts of a TiddlyWiki to become separated, and enormously improves the chances of it still functioning in the future. +TiddlyWiki in the single file configuration ordinarily packs everything into a single file: your data, and the ~JavaScript, CSS and HTML comprising TiddlyWiki itself. This lack of dependencies is usually very convenient: it means that it is impossible for the parts of a TiddlyWiki to become separated, and enormously improves the chances of it still functioning in the future. However, there is some inefficiency in this arrangement because the core code is repeatedly loaded and saved every time the content of the wiki is saved. This inefficiency is partially ameliorated when working in the client server configuration because once the wiki is loaded by the browser the synchronisation process only transmits individual tiddlers back and forth to the server. diff --git a/plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid b/plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid index 04bf24613..4e5c951db 100644 --- a/plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid +++ b/plugins/tiddlywiki/tiddlyweb/config-tiddlers-filter.tid @@ -1,2 +1,2 @@ -title: $:/config/Server/ExternalFilters/[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] +title: $:/config/Server/ExternalFilters/[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/library/sjcl.js]] -[[$:/core]] text: yes diff --git a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js index 5bc4e502d..7566b6756 100644 --- a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js +++ b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js @@ -159,7 +159,7 @@ TiddlyWebAdaptor.prototype.getSkinnyTiddlers = function(callback) { $tw.utils.httpRequest({ url: this.host + "recipes/" + this.recipe + "/tiddlers.json", data: { - filter: "[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]]" + filter: "[all[tiddlers]] -[[$:/isEncrypted]] -[prefix[$:/temp/]] -[prefix[$:/status/]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/library/sjcl.js]] -[[$:/core]]" }, callback: function(err,data) { // Check for errors From acd2cbf56a64f72c0b7422b2a35b0e1c79e54bcd Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 14 Aug 2020 15:04:01 +0100 Subject: [PATCH 0766/2376] Docs fixes from @fkohrt See #4815 --- editions/tw5.com/tiddlers/commands/BuildCommand.tid | 2 +- .../tiddlers/howtos/How to create keyboard shortcuts.tid | 2 +- .../tiddlers/howtos/Simple ways to write protect tiddlers.tid | 2 +- editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid | 2 +- .../tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/editions/tw5.com/tiddlers/commands/BuildCommand.tid b/editions/tw5.com/tiddlers/commands/BuildCommand.tid index 62eb32faf..64b41b84a 100644 --- a/editions/tw5.com/tiddlers/commands/BuildCommand.tid +++ b/editions/tw5.com/tiddlers/commands/BuildCommand.tid @@ -7,4 +7,4 @@ caption: build {{$:/language/Help/build}} -See TiddlyWikiFolders for details of defining build targets. +See [[tiddlywiki.info Files]] for details of defining build targets. diff --git a/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid b/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid index ff59ab253..f665bf09b 100644 --- a/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid +++ b/editions/tw5.com/tiddlers/howtos/How to create keyboard shortcuts.tid @@ -34,7 +34,7 @@ In the [[Keyboard Shortcuts Tab|$:/core/ui/ControlPanel/KeyboardShortcuts]] the * $:/config/shortcuts-not-windows/`my-shortcut` * $:/config/shortcuts-not-linux/`my-shortcut` -<<.tip """Note that those platform-specific tiddlers don't have to be created manually if the ''ShortcutInfo'' tiddler as mentioned above is created first and and the shortcut is configured in the ~ControlPanel""">> +<<.tip """Note that those platform-specific tiddlers don't have to be created manually if the ''ShortcutInfo'' tiddler as mentioned above is created first and the shortcut is configured in the ~ControlPanel""">> <br> diff --git a/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid b/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid index 0e2ffc8db..dcdea0257 100644 --- a/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid +++ b/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid @@ -28,4 +28,4 @@ Now any tiddler you tag as "Locked" will have the edit button hidden. To get it * In the title box, type `$:/` and then paste the original title. * Use the defaults to excise and and leave a transclusion -Now you can view the contents of your original tiddler, but to edit them your will have to find the the tiddler with the `$:/` prefix. +Now you can view the contents of your original tiddler, but to edit them you will have to find the the tiddler with the `$:/` prefix. diff --git a/editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid b/editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid index a20859832..e366caa8c 100644 --- a/editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid +++ b/editions/tw5.com/tiddlers/macros/list-thumbnails Macro.tid @@ -1,4 +1,4 @@ -caption: thumbnail +caption: list-thumbnails created: 20200612170158838 modified: 20200612171804473 tags: Macros [[Core Macros]] diff --git a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid index 81a6f9cae..9bcefa85c 100644 --- a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid +++ b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid @@ -1,4 +1,4 @@ -caption: $:/tags/Macro +caption: $:/tags/Macro/View created: 20200103092530990 description: marks global macros modified: 20200103092606462 From ccda93824880ea1421c54acbb23ec15c58d033db Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 14 Aug 2020 15:19:16 +0100 Subject: [PATCH 0767/2376] More docs fixes from @fkohrt See #4815 --- .../tiddlers/howtos/Simple ways to write protect tiddlers.tid | 2 +- plugins/tiddlywiki/freelinks/readme.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid b/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid index dcdea0257..dd5ea6829 100644 --- a/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid +++ b/editions/tw5.com/tiddlers/howtos/Simple ways to write protect tiddlers.tid @@ -26,6 +26,6 @@ Now any tiddler you tag as "Locked" will have the edit button hidden. To get it * Select all the tiddler text. * Click on the excise tool. * In the title box, type `$:/` and then paste the original title. -* Use the defaults to excise and and leave a transclusion +* Use the defaults to excise the text into a new tiddler and replace it with a transclusion Now you can view the contents of your original tiddler, but to edit them you will have to find the the tiddler with the `$:/` prefix. diff --git a/plugins/tiddlywiki/freelinks/readme.tid b/plugins/tiddlywiki/freelinks/readme.tid index 61e39a4f5..39cadcfb7 100644 --- a/plugins/tiddlywiki/freelinks/readme.tid +++ b/plugins/tiddlywiki/freelinks/readme.tid @@ -15,7 +15,7 @@ Within view templates, the variable `tv-freelinks` is automatically set to the c !! Notes -To change within which tiddlers freelinking occurs requires customising the shadow tiddler $:/plugins/tiddlywiki/freelinks/macros/view. This tiddler is tagged $:/tags/Macro/View which means that it will be included as a local macro in each view template. By default, its content is: +To change within which tiddlers freelinking occurs requires customising the shadow tiddler [[$:/plugins/tiddlywiki/freelinks/macros/view]]. This tiddler is tagged $:/tags/Macro/View which means that it will be included as a local macro in each view template. By default, its content is: ``` <$set name="tv-freelinks" value={{$:/config/Freelinks/Enable}}/> From c23eedd0693b68ff42c57f5baf1768f6e63bcceb Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 17 Aug 2020 23:33:46 +0700 Subject: [PATCH 0768/2376] Fix incorrect base64 encoding of astral-plane text (#4813) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most astral-plane text is emojis like U+1F4DA BOOKS (📚), but some languages like Osage have their alphabet entirely in the supplementary multilingual plane as well. For proper support of languages like Osage, and newer emojis, the UTF-8 decode and encode functions need to properly handle codepoints above U+FFFF, which are represented by a surrogate pair in Javascript strings. --- .../utils/base64-utf8/base64-utf8.module.js | 40 ++++++++++++++----- .../base64-utf8/base64-utf8.module.min.js | 2 +- editions/test/tiddlers/tests/test-utils.js | 13 ++++++ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/core/modules/utils/base64-utf8/base64-utf8.module.js b/core/modules/utils/base64-utf8/base64-utf8.module.js index 58bbc8fc0..8bd4e272d 100644 --- a/core/modules/utils/base64-utf8/base64-utf8.module.js +++ b/core/modules/utils/base64-utf8/base64-utf8.module.js @@ -20,15 +20,27 @@ for (i; i < string.length; i++) { charCode = string.charCodeAt(i); - if (charCode < 128) + if (charCode < 128) { output += String.fromCharCode(charCode); - else if ((charCode > 127) && (charCode < 2048)) - output += String.fromCharCode((charCode >> 6) | 192), + } else if ((charCode > 127) && (charCode < 2048)) { + output += String.fromCharCode((charCode >> 6) | 192); output += String.fromCharCode((charCode & 63) | 128); - else - output += String.fromCharCode((charCode >> 12) | 224), - output += String.fromCharCode(((charCode >> 6) & 63) | 128), + } else if ((charCode > 55295) && (charCode < 57344) && string.length > i+1) { + // Surrogate pair + var hiSurrogate = charCode; + var loSurrogate = string.charCodeAt(i+1); + i++; // Skip the low surrogate on the next loop pass + var codePoint = (((hiSurrogate - 55296) << 10) | (loSurrogate - 56320)) + 65536; + output += String.fromCharCode((codePoint >> 18) | 240); + output += String.fromCharCode(((codePoint >> 12) & 63) | 128); + output += String.fromCharCode(((codePoint >> 6) & 63) | 128); + output += String.fromCharCode((codePoint & 63) | 128); + } else { + // Not a surrogate pair, or a dangling surrogate without its partner that we'll just encode as-is + output += String.fromCharCode((charCode >> 12) | 224); + output += String.fromCharCode(((charCode >> 6) & 63) | 128); output += String.fromCharCode((charCode & 63) | 128); + } } return output; @@ -41,15 +53,21 @@ while (i < string.length) { charCode = string.charCodeAt(i); - if (charCode < 128) + if (charCode < 128) { output += String.fromCharCode(charCode), i++; - else if ((charCode > 191) && (charCode < 224)) - output += String.fromCharCode(((charCode & 31) << 6) | (string.charCodeAt(i + 1) & 63)), + } else if ((charCode > 191) && (charCode < 224)) { + output += String.fromCharCode(((charCode & 31) << 6) | (string.charCodeAt(i + 1) & 63)); i += 2; - else - output += String.fromCharCode(((charCode & 15) << 12) | ((string.charCodeAt(i + 1) & 63) << 6) | (string.charCodeAt(i + 2) & 63)), + } else if ((charCode > 223) && (charCode < 240)) { + output += String.fromCharCode(((charCode & 15) << 12) | ((string.charCodeAt(i + 1) & 63) << 6) | (string.charCodeAt(i + 2) & 63)); i += 3; + } else { + var codePoint = ((charCode & 7) << 18) | ((string.charCodeAt(i + 1) & 63) << 12) | ((string.charCodeAt(i + 2) & 63) << 6) | (string.charCodeAt(i + 3) & 63); + // output += String.fromCodePoint(codePoint); // Can't do this because Internet Explorer doesn't have String.fromCodePoint + output += String.fromCharCode(((codePoint - 65536) >> 10) + 55296) + String.fromCharCode(((codePoint - 65536) & 1023) + 56320); // So we do this instead + i += 4; + } } return output; diff --git a/core/modules/utils/base64-utf8/base64-utf8.module.min.js b/core/modules/utils/base64-utf8/base64-utf8.module.min.js index 47f0e50c3..f2f808004 100644 --- a/core/modules/utils/base64-utf8/base64-utf8.module.min.js +++ b/core/modules/utils/base64-utf8/base64-utf8.module.min.js @@ -6,4 +6,4 @@ // // copyright: MIT // author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com -!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&"function"===o.define&&o.define.amd?define("utf8",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if("string"!=typeof r)return r;r=r.replace(/\r\n/g,"\n");for(var e,o="",t=0;t<r.length;t++)(e=r.charCodeAt(t))<128?o+=String.fromCharCode(e):e>127&&e<2048?(o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128)):(o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128));return o},decode:function(r){if("string"!=typeof r)return r;for(var e="",o=0,t=0;o<r.length;)(t=r.charCodeAt(o))<128?(e+=String.fromCharCode(t),o++):t>191&&t<224?(e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2):(e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3);return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var n=0;n<t.length;n++)o[t[n]]=o.require(t[n]);o.module.exports=e.apply(o)}else void 0!==o.define&&"function"===o.define&&o.define.amd?define("base64",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return{encode:function(r){if(void 0===e)throw{error:"MissingMethod",message:"UTF8 Module is missing."};if("string"!=typeof r)return r;r=e.encode(r);for(var t,n,i,d,f,a,h,c="",u=0;u<r.length;)d=(t=r.charCodeAt(u++))>>2,f=(3&t)<<4|(n=r.charCodeAt(u++))>>4,a=(15&n)<<2|(i=r.charCodeAt(u++))>>6,h=63&i,isNaN(n)?a=h=64:isNaN(i)&&(h=64),c+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return c},decode:function(r){if(void 0===e)throw{error:"MissingMethod",message:"UTF8 Module is missing."};if("string"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var t,n,i,d,f,a,h="",c=0;c<r.length;)t=o.indexOf(r.charAt(c++))<<2|(d=o.indexOf(r.charAt(c++)))>>4,n=(15&d)<<4|(f=o.indexOf(r.charAt(c++)))>>2,i=(3&f)<<6|(a=o.indexOf(r.charAt(c++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(n)),64!=a&&(h+=String.fromCharCode(i));return e.decode(h)}}},this,["utf8"]); \ No newline at end of file +!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&"function"===o.define&&o.define.amd?define("utf8",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if("string"!=typeof r)return r;r=r.replace(/\r\n/g,"\n");for(var e,o="",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if("string"!=typeof r)return r;for(var e="",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&"function"===o.define&&o.define.amd?define("base64",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return{encode:function(r){if(void 0===e)throw{error:"MissingMethod",message:"UTF8 Module is missing."};if("string"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C="",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:"MissingMethod",message:"UTF8 Module is missing."};if("string"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var t,i,n,d,f,a,h="",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,["utf8"]); \ No newline at end of file diff --git a/editions/test/tiddlers/tests/test-utils.js b/editions/test/tiddlers/tests/test-utils.js index a79c6ccee..ec60a6691 100644 --- a/editions/test/tiddlers/tests/test-utils.js +++ b/editions/test/tiddlers/tests/test-utils.js @@ -25,6 +25,19 @@ describe("Utility tests", function() { expect(psa(" [[Tidd\u00a0ler8]] two ")).toEqual(["Tidd\u00a0ler8","two"]); }); + it("should handle base64 encoding emojis", function() { + var booksEmoji = "📚"; + expect(booksEmoji).toBe(booksEmoji); + // 📚 is U+1F4DA BOOKS, which is represented by surrogate pair 0xD83D 0xDCDA in Javascript + expect(booksEmoji.length).toBe(2); + expect(booksEmoji.charCodeAt(0)).toBe(55357); // 0xD83D + expect(booksEmoji.charCodeAt(1)).toBe(56538); // 0xDCDA + expect($tw.utils.base64Encode(booksEmoji)).not.toBe("7aC97bOa", "if base64 is 7aC97bOa then surrogate pairs were incorrectly treated as codepoints"); + expect($tw.utils.base64Encode(booksEmoji)).toBe("8J+Tmg==", "if surrogate pairs are correctly treated as a single code unit then base64 should be 8J+Tmg=="); + expect($tw.utils.base64Decode("8J+Tmg==")).toBe(booksEmoji); + expect($tw.utils.base64Decode($tw.utils.base64Encode(booksEmoji))).toBe(booksEmoji, "should round-trip correctly"); + }); + it("should handle stringifying a string array", function() { var str = $tw.utils.stringifyList; expect(str([])).toEqual(""); From a2796d89ab3dbf4a15b63b0f4623387fdc6acd5b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 17 Aug 2020 18:44:36 +0100 Subject: [PATCH 0769/2376] Fix httpRequest() header handling Header names are not case sensitive, so the old code failed if it was called with a "Content-Type" header --- core/modules/utils/dom/http.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/core/modules/utils/dom/http.js b/core/modules/utils/dom/http.js index 2f6439417..952704138 100644 --- a/core/modules/utils/dom/http.js +++ b/core/modules/utils/dom/http.js @@ -24,6 +24,16 @@ exports.httpRequest = function(options) { var type = options.type || "GET", url = options.url, headers = options.headers || {accept: "application/json"}, + hasHeader = function(targetHeader) { + targetHeader = targetHeader.toLowerCase(); + var result = false; + $tw.utils.each(headers,function(header,headerTitle,object) { + if(headerTitle.toLowerCase() === targetHeader) { + result = true; + } + }); + return result; + }, returnProp = options.returnProp || "responseText", request = new XMLHttpRequest(), data = "", @@ -63,10 +73,10 @@ exports.httpRequest = function(options) { request.setRequestHeader(headerTitle,header); }); } - if(data && !$tw.utils.hop(headers,"Content-type")) { - request.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8"); + if(data && !hasHeader("Content-Type")) { + request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); } - if(!$tw.utils.hop(headers,"X-Requested-With")) { + if(!hasHeader("X-Requested-With")) { request.setRequestHeader("X-Requested-With","TiddlyWiki"); } try { From 21f1c163d895a796f0628fc735c89631a7cee6b3 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 27 Aug 2020 16:36:13 +0200 Subject: [PATCH 0770/2376] Update navigator widgets parameter docs (#4828) Update navigator widgets parameter docs --- editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid b/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid index 11a17edf8..a14d99915 100644 --- a/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/NavigatorWidget.tid @@ -18,6 +18,7 @@ The navigator widget displays any contained content, and responds to Messages di |history |Name of the tiddler containing the history list to be manipulated | |openLinkFromInsideRiver |Determines the location for opening new tiddlers from links within the story river: at the ''top'' or ''bottom'' of the story river, or ''above'' or ''below'' the current tiddler | |openLinkFromOutsideRiver|Determines the location for opening new tiddlers from linkes outside the story river: at the ''top'' or ''bottom'' of the story river| +|relinkOnRename|<<.from-version "5.1.14">> Determines if tags in other tiddlers are renamed if the tiddler title changes. ''yes'' or ''no''. default: ''no''| ! Widget Messages From a0509a517001ab46ff43a53daec59e189e0ebf31 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 27 Aug 2020 16:37:18 +0200 Subject: [PATCH 0771/2376] Fix 4800 - remove communication to prodcut hunt on display. (#4812) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * fix #4800 - remove network communication to product hunt --- .../tiddlers/hellothere/HelloThere.tid | 4 +--- .../badges/ProductHunt-Badge.svg.tid | 21 +++++++++++++++++++ .../hellothere/badges/ProductHunt-Link.tid | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Badge.svg.tid create mode 100644 editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Link.tid diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid index 24ea95129..d82e7f413 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid @@ -47,6 +47,4 @@ It's well worth spending an hour or so playing with it to see how it can help yo Finding code that works flawlessly after just two or three years is magical enough but after seven years?! <<< [[Mark Gibbs, Network World|http://www.networkworld.com/article/3028098/open-source-tools/tiddlywiki-a-free-open-source-wiki-revisited.html]] -<div style="font-size:0.7em;text-align:center;margin:3em auto;"> -<a href="https://www.producthunt.com/posts/tiddlywiki-2?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-tiddlywiki-2" target="_blank" rel="noopener noreferrer"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=193414&theme=dark&period=daily" alt="TiddlyWiki - The open source non-linear notebook | Product Hunt Embed" style="width: 250px; height: 54px;" width="250px" height="54px" /></a> -</div> \ No newline at end of file +<div style="font-size:0.7em;text-align:center;margin:3em auto;">{{Product Hunt Link}}</div> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Badge.svg.tid b/editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Badge.svg.tid new file mode 100644 index 000000000..515319ca1 --- /dev/null +++ b/editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Badge.svg.tid @@ -0,0 +1,21 @@ +title: ProductHunt-Badge.svg +type: image/svg+xml + +<?xml version="1.0" encoding="UTF-8"?> +<svg width="250px" height="54px" viewBox="0 0 250 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g transform="translate(-130.000000, -73.000000)"> + <g transform="translate(130.000000, 73.000000)"> + <rect stroke="" fill="#24273f" x="0.5" y="0.5" width="249" height="53" rx="10"></rect> + <text font-family="Helvetica-Bold, Helvetica" font-size="9" font-weight="bold" fill="#FFFFFF"> + <tspan x="53" y="20">Product Hunt</tspan> + </text> + <text font-family="Helvetica-Bold, Helvetica" font-size="16" font-weight="bold" fill="#FFFFFF"> + <tspan x="52" y="40">#2 Product of the Day</tspan> + </text> + + <g transform="translate(17.000000, 13.000000)"><path d="M4.33,16.364 L0.328,24.9 C0.202,25.158 0.335,25.32 0.755,25.24 L4.013,24.532 C4.07755234,24.5094173 4.14861896,24.5149617 4.20888789,24.5472826 C4.26915683,24.5796035 4.31309537,24.6357337 4.33,24.702 L5.797,27.709 C5.937,28.033 6.099,28.099 6.225,27.842 L10.485,18.908 L4.33,16.364 Z M16.67,16.364 L20.672,24.9 C20.805,25.158 20.665,25.32 20.245,25.24 L16.987,24.532 C16.9224353,24.5100506 16.8516562,24.5158869 16.7915589,24.5481157 C16.7314616,24.5803445 16.687439,24.6360738 16.67,24.702 L15.203,27.709 C15.063,28.033 14.908,28.099 14.775,27.842 L10.515,18.908 L16.67,16.364 Z" fill="#DE7818" fill-rule="nonzero"></path><path d="M9.298,21.392 C9.298,21.399 9.284,21.392 9.269,21.392 C7.03578049,21.1442528 4.94208026,20.1826237 3.299,18.65 C3.291,18.642 3.269,18.635 3.276,18.627 L3.46,18.237 C3.468,18.222 3.482,18.259 3.49,18.267 C5.067,19.733 7.257,20.655 9.497,20.927 C9.505,20.927 9.52,20.927 9.52,20.935 L9.298,21.392 Z" fill="#B35454"></path><circle fill="#9B9B9B" cx="10.5" cy="10.489" r="10.489"></circle><circle fill="#949494" cx="10.5" cy="10.489" r="9.045"></circle><circle fill="#B6B6B6" cx="10.75" cy="10.75" r="8.75"></circle><path d="M7.19,9.018 L7.19,9.054 L9.159,9.054 L9.159,9.013 C9.159,8.315 9.663,7.823 10.389,7.823 C11.086,7.823 11.544,8.239 11.544,8.86 C11.544,9.358 11.227,9.786 9.984,10.934 L7.314,13.448 L7.314,14.884 L13.741,14.884 L13.741,13.208 L10.178,13.208 L10.178,13.097 L11.573,11.813 C13.073,10.477 13.623,9.645 13.623,8.708 C13.623,7.214 12.358,6.2 10.465,6.2 C8.503,6.2 7.19,7.337 7.19,9.018 Z" fill="#EFEFEF"></path><path d="M12.97,3.089 C16.3260745,3.89113363 18.7213186,6.85251327 18.8041673,10.3021205 C18.8870161,13.7517278 16.6366978,16.8246793 13.323,17.787 C15.358,16.232 16.707,13.578 16.707,10.563 C16.707,7.379 15.203,4.6 12.969,3.089 L12.97,3.089 Z" fill-opacity="0.2" fill="#FFFFFF"></path><path d="M11.702,21.392 C11.709,21.399 11.724,21.392 11.731,21.392 C14.024,21.104 16.131,20.182 17.717,18.664 C17.724,18.657 17.746,18.65 17.739,18.642 L17.554,18.252 C17.547,18.237 17.532,18.274 17.524,18.281 C15.947,19.748 13.751,20.655 11.503,20.927 C11.495,20.927 11.48,20.927 11.48,20.935 L11.702,21.392 Z" fill="#B35454"></path></g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Link.tid b/editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Link.tid new file mode 100644 index 000000000..817726575 --- /dev/null +++ b/editions/tw5.com/tiddlers/hellothere/badges/ProductHunt-Link.tid @@ -0,0 +1,3 @@ +title: Product Hunt Link + +<a href="https://www.producthunt.com/posts/tiddlywiki-2?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-tiddlywiki-2" alt="Product Hunt: Product of the Day" target="_blank" rel="noopener noreferrer">{{ProductHunt-Badge.svg}}</a> \ No newline at end of file From aa08210e440d8563a24e5ec9e9cdd2b1d42a2592 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 27 Aug 2020 16:40:39 +0200 Subject: [PATCH 0772/2376] Fix #4795 - PaletteManager showing wrong tooltip (#4796) --- core/ui/PaletteManager.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/PaletteManager.tid b/core/ui/PaletteManager.tid index c1a46df3c..f4f0a3ba9 100644 --- a/core/ui/PaletteManager.tid +++ b/core/ui/PaletteManager.tid @@ -46,7 +46,7 @@ title: $:/PaletteManager <tr> <td> <span style="float:right;"> -<$button tooltip=<<lingo Delete/Hint>> aria-label=<<lingo Delete/Hint>> class="tc-btn-invisible" actions=<<delete-colour-index-actions>>> +<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label=<<lingo Delete/Hint>> class="tc-btn-invisible" actions=<<delete-colour-index-actions>>> {{$:/core/images/delete-button}}</$button> </span> ''<$macrocall $name="describePaletteColour" colour=<<colourName>>/>''<br/> From 259b45065a0f6088036c228ae554fc4f7b0431fe Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Thu, 27 Aug 2020 06:45:34 -0800 Subject: [PATCH 0773/2376] Fix server error when saving a new tiddler created by following a tiddler link (#4770) * Initialize draft tiddler with empty text Otherwise, when the tiddler has a meta file, $tw.utils.saveTiddlerToFile will call fs.writeFile with the content to write as `undefined`. Depending on the version of Node, this results in the string "undefined" getting saved or a TypeError. * Remove what seems to be a leftover debug log --- core/modules/widgets/navigator.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index df7e2475b..d61432b60 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -273,7 +273,9 @@ NavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) { var tiddler = this.wiki.getTiddler(targetTitle); // Save the initial value of the draft tiddler draftTitle = this.generateDraftTitle(targetTitle); - var draftTiddler = new $tw.Tiddler( + var draftTiddler = new $tw.Tiddler({ + text: "", + }, tiddler, { title: draftTitle, @@ -325,7 +327,6 @@ NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) { // If enabled, relink references to renamed tiddler var shouldRelink = this.getAttribute("relinkOnRename","no").toLowerCase().trim() === "yes"; if(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) { -console.log("Relinking '" + draftOf + "' to '" + draftTitle + "'"); this.wiki.relinkTiddler(draftOf,draftTitle); } // Remove the draft tiddler From 05de5b4c496f53cc8949b43f18cf13ade22325b3 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Thu, 27 Aug 2020 16:47:05 +0200 Subject: [PATCH 0774/2376] Update fixed Operator (examples).tid (#4763) To clarify it zero pads. --- .../tiddlers/filters/examples/fixed Operator (Examples).tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid index 2f60b72b9..8aa9304e3 100644 --- a/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/fixed Operator (Examples).tid @@ -6,3 +6,4 @@ type: text/vnd.tiddlywiki <<.operator-example 1 "10.123456789 +[fixed[5]]">> <<.operator-example 2 "[[355]divide[113]fixed[7]]">> +<<.operator-example 3 "[[1]divide[2]fixed[3]]">> From 6645afcd15e3adaa05d5e8ca6ec81e4995f3dc36 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 27 Aug 2020 16:48:30 +0200 Subject: [PATCH 0775/2376] Fix #4750 plugin priority for tiddlyweb (#4751) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * fix issue #4750 add plugin-priority of 10 to tiddlyweb plugin. --- plugins/tiddlywiki/tiddlyweb/plugin.info | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/tiddlyweb/plugin.info b/plugins/tiddlywiki/tiddlyweb/plugin.info index 0ba3464ec..987244daf 100644 --- a/plugins/tiddlywiki/tiddlyweb/plugin.info +++ b/plugins/tiddlywiki/tiddlyweb/plugin.info @@ -2,5 +2,6 @@ "title": "$:/plugins/tiddlywiki/tiddlyweb", "name": "TiddlyWeb", "description": "Sync changes to TW5 server or TiddlyWeb server", - "list": "readme" + "list": "readme", + "plugin-priority": 10 } From 7bd719f3f3492b3958927a19f9c8ad0c65d074e5 Mon Sep 17 00:00:00 2001 From: John Xia <john.danger.xia@gmail.com> Date: Thu, 27 Aug 2020 10:50:52 -0400 Subject: [PATCH 0776/2376] Signing the CLA (#4727) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 3332d8b72..183c36bd8 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -402,4 +402,6 @@ Nicolas Petton, @NicolasPetton, 2020/04/30 Csaba Molnar, @mocsa, 2020/04/29 +Dazhong Xia, @jdangerx, 2020/06/23 + Diep Pham, @favadi, 2020/07/30 From 485022797f11a11ed3ed248ec9b32291a632eac3 Mon Sep 17 00:00:00 2001 From: John Xia <john.danger.xia@gmail.com> Date: Thu, 27 Aug 2020 10:51:48 -0400 Subject: [PATCH 0777/2376] Clarifying plugin installation for Node.js (#4728) All thanks go to @matrixbot on the Gitter for explaining what was going on! --- .../Installing custom plugins on Node.js.tid | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid b/editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid index 44e49d772..1f4a12177 100644 --- a/editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid +++ b/editions/tw5.com/tiddlers/nodejs/Installing custom plugins on Node.js.tid @@ -7,7 +7,19 @@ type: text/vnd.tiddlywiki There are several ways in which custom plugins that are not part of TiddlyWiki's plugin library can be installed when using TiddlyWiki under Node.js. (See [[Installing a plugin from the plugin library]] for instructions on installing plugins from the library). * Arrange the PluginFolders containing the plugins in a convenient shared location and then use [[environment variables|Environment Variables on Node.js]] to tell TiddlyWiki to search those folders. The plugins can be referenced in `tiddlywiki.info` by their name (e.g. `tiddlytools/magic`) -* Place the PluginFolders containing the plugins in a `plugins` folder within the [[wiki folder|TiddlyWikiFolders]] +* Place the PluginFolders containing the plugins in a `plugins` folder within the [[wiki folder|TiddlyWikiFolders]]. TiddlyWiki will attempt to include every subfolder as a plugin. Do not add the plugin names to `tiddlywiki.info`. Do not add the PluginFolders under a specific namespace:<br><pre>. +├── plugins +│   ├── relink +│   │   ├── js +│   │   ├── plugin.info +│   │   └── tiddlers +│   └── relink-markdown +│   ├── js +│   ├── plugin.info +│   └── readme.tid +├── tiddlers +└── tiddlywiki.info +</pre> * Depending on how TiddlyWiki itself has been installed, plugins can also be installed by copying the plugin folders into the `plugins` folder of the repository. This is only recommended if working with a forked copy of the repo. It is not recommended if TiddlyWiki has been installed with npm because npm is liable to overwrite the installation when performing an update Note that including a plugin as an ordinary tiddler (e.g. by dragging and dropping a plugin into the browser) will result in the plugin only being active in the browser, and not available under Node.js. From 48c6146ab6f8cd765db664db8afcac78786d1ba4 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 27 Aug 2020 16:52:25 +0200 Subject: [PATCH 0778/2376] Link widget: Include original event in tm-navigate (#4724) --- core/modules/widgets/link.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/link.js b/core/modules/widgets/link.js index 4732db928..76822668b 100755 --- a/core/modules/widgets/link.js +++ b/core/modules/widgets/link.js @@ -158,7 +158,8 @@ LinkWidget.prototype.handleClickEvent = function(event) { metaKey: event.metaKey, ctrlKey: event.ctrlKey, altKey: event.altKey, - shiftKey: event.shiftKey + shiftKey: event.shiftKey, + event: event }); if(this.domNodes[0].hasAttribute("href")) { event.preventDefault(); From b16f5592fcf1776c5679fadf193a6519efba0363 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Fri, 28 Aug 2020 15:44:40 +0200 Subject: [PATCH 0779/2376] Update contains Operator.tid (#4746) --- editions/tw5.com/tiddlers/filters/contains Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/contains Operator.tid b/editions/tw5.com/tiddlers/filters/contains Operator.tid index 608d22def..f55d91f9e 100644 --- a/editions/tw5.com/tiddlers/filters/contains Operator.tid +++ b/editions/tw5.com/tiddlers/filters/contains Operator.tid @@ -7,7 +7,7 @@ op-output: those input tiddlers in which the list field <<.place F>> contains th op-parameter: a possible value to be found in list field <<.place F>> op-parameter-name: S op-purpose: filter the input by searching list fields for a value -op-suffix: the name of a [[field|TiddlerFields]] +op-suffix: the name of a [[field|TiddlerFields]] (defaults to `list`) op-suffix-name: F tags: [[Filter Operators]] [[Field Operators]] [[Negatable Operators]] title: contains Operator From 7de8e1fc97d97838d4403be5662a77d34e2d260f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 28 Aug 2020 14:51:11 +0100 Subject: [PATCH 0780/2376] Remove extraneous CSS property Fixes #4713 --- themes/tiddlywiki/vanilla/base.tid | 1 - 1 file changed, 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index f3838f2c9..e8acda38c 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -100,7 +100,6 @@ h1, h2, h3, h4, h5, h6 { pre { display: block; - padding: 14px; margin-top: 1em; margin-bottom: 1em; word-break: normal; From b86bbf3fc465b61c9e26a2f3bb42c8dba526c6b8 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Fri, 28 Aug 2020 09:53:20 -0400 Subject: [PATCH 0781/2376] Compressing $set chains into one $vars (#4659) --- core/templates/single.tiddler.window.tid | 30 ++++++-------------- core/ui/PageTemplate.tid | 35 ++++++------------------ 2 files changed, 17 insertions(+), 48 deletions(-) diff --git a/core/templates/single.tiddler.window.tid b/core/templates/single.tiddler.window.tid index a790878a7..1efb2b0b9 100644 --- a/core/templates/single.tiddler.window.tid +++ b/core/templates/single.tiddler.window.tid @@ -6,17 +6,13 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ \end \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] -<$set name="tv-config-toolbar-icons" value={{$:/config/Toolbar/Icons}}> - -<$set name="tv-config-toolbar-text" value={{$:/config/Toolbar/Text}}> - -<$set name="tv-config-toolbar-class" value={{$:/config/Toolbar/ButtonClass}}> - -<$set name="tv-show-missing-links" value={{$:/config/MissingLinks}}> - -<$set name="storyviewTitle" value={{$:/view}}> - -<$set name="languageTitle" value={{{ [{$:/language}get[name]] }}}> +<$vars + tv-config-toolbar-icons={{$:/config/Toolbar/Icons}} + tv-config-toolbar-text={{$:/config/Toolbar/Text}} + tv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}} + tv-show-missing-links={{$:/config/MissingLinks}} + storyviewTitle={{$:/view}} + languageTitle={{{ [{$:/language}get[name]] }}}> <div class=<<containerClasses>>> @@ -28,14 +24,4 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ </div> -</$set> - -</$set> - -</$set> - -</$set> - -</$set> - -</$set> +</$vars> diff --git a/core/ui/PageTemplate.tid b/core/ui/PageTemplate.tid index ccb560c69..abb23a104 100644 --- a/core/ui/PageTemplate.tid +++ b/core/ui/PageTemplate.tid @@ -6,19 +6,14 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ \end \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] -<$set name="tv-config-toolbar-icons" value={{$:/config/Toolbar/Icons}}> - -<$set name="tv-config-toolbar-text" value={{$:/config/Toolbar/Text}}> - -<$set name="tv-config-toolbar-class" value={{$:/config/Toolbar/ButtonClass}}> - -<$set name="tv-enable-drag-and-drop" value={{$:/config/DragAndDrop/Enable}}> - -<$set name="tv-show-missing-links" value={{$:/config/MissingLinks}}> - -<$set name="storyviewTitle" value={{$:/view}}> - -<$set name="languageTitle" value={{{ [{$:/language}get[name]] }}}> +<$vars + tv-config-toolbar-icons={{$:/config/Toolbar/Icons}} + tv-config-toolbar-text={{$:/config/Toolbar/Text}} + tv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}} + tv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}} + tv-show-missing-links={{$:/config/MissingLinks}} + storyviewTitle={{$:/view}} + languageTitle={{{ [{$:/language}get[name]] }}}> <div class=<<containerClasses>>> @@ -38,16 +33,4 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$ </div> -</$set> - -</$set> - -</$set> - -</$set> - -</$set> - -</$set> - -</$set> +</$vars> From 8497e5b95d9311e2443c4517752a2befb9b92a72 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 28 Aug 2020 15:28:34 +0100 Subject: [PATCH 0782/2376] GitHub/Gitlab/Gitea savers: Handle empty paths correctly Fixes #4656 --- core/modules/savers/gitea.js | 2 +- core/modules/savers/github.js | 2 +- core/modules/savers/gitlab.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/modules/savers/gitea.js b/core/modules/savers/gitea.js index c2f56a56d..d88800d8c 100644 --- a/core/modules/savers/gitea.js +++ b/core/modules/savers/gitea.js @@ -34,7 +34,7 @@ GiteaSaver.prototype.save = function(text,method,callback) { "Authorization": "Basic " + window.btoa(username + ":" + password) }; // Bail if we don't have everything we need - if(!username || !password || !repo || !path || !filename) { + if(!username || !password || !repo || !filename) { return false; } // Make sure the path start and ends with a slash diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index a93b9e5ba..7585db34e 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -34,7 +34,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { "Authorization": "Basic " + window.btoa(username + ":" + password) }; // Bail if we don't have everything we need - if(!username || !password || !repo || !path || !filename) { + if(!username || !password || !repo || !filename) { return false; } // Make sure the path start and ends with a slash diff --git a/core/modules/savers/gitlab.js b/core/modules/savers/gitlab.js index 915545afe..7796ed743 100644 --- a/core/modules/savers/gitlab.js +++ b/core/modules/savers/gitlab.js @@ -34,7 +34,7 @@ GitLabSaver.prototype.save = function(text,method,callback) { "Private-Token": password }; // Bail if we don't have everything we need - if(!username || !password || !repo || !path || !filename) { + if(!username || !password || !repo || !filename) { return false; } // Make sure the path start and ends with a slash From ba9de17b87f3fb6b832dfccc65868334fabfabf2 Mon Sep 17 00:00:00 2001 From: gernert <ton.gerner@gmail.com> Date: Fri, 28 Aug 2020 16:38:47 +0200 Subject: [PATCH 0783/2376] Update SystemTag_ $__tags_Macro_View.tid (#4604) --- .../tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid index 9bcefa85c..723b0b130 100644 --- a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid +++ b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Macro_View.tid @@ -1,9 +1,9 @@ caption: $:/tags/Macro/View created: 20200103092530990 -description: marks global macros +description: marks global macros only active in View template modified: 20200103092606462 tags: SystemTags title: SystemTag: $:/tags/Macro/View type: text/vnd.tiddlywiki -The [[system tag|SystemTags]] `$:/tags/Macro/View` marks macros that are only made available within the main view templates and the preview panel. \ No newline at end of file +The [[system tag|SystemTags]] `$:/tags/Macro/View` marks macros that are only made available within the main view templates and the preview panel. From 8bfd8f3a261b840cd76c14461c9002735f8ae8cd Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 28 Aug 2020 15:41:33 +0100 Subject: [PATCH 0784/2376] Update $:/tags/TextEditor/Snippet docs Fixes #4603 --- .../systemtags/SystemTag_ $__tags_Texteditor_Snippet.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Texteditor_Snippet.tid b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Texteditor_Snippet.tid index 131eef8b2..7d64c0537 100644 --- a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Texteditor_Snippet.tid +++ b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Texteditor_Snippet.tid @@ -1,9 +1,9 @@ -caption: $:/tags/Texteditor/Snippet +caption: $:/tags/TextEditor/Snippet created: 20180926170345251 description: marks text snippets -modified: 20180926171456546 +modified: 20200828154100425 tags: SystemTags -title: SystemTag: $:/tags/Texteditor/Snippet +title: SystemTag: $:/tags/TextEditor/Snippet type: text/vnd.tiddlywiki -The [[system tag|SystemTags]] `$:/tags/Texteditor/Snippet` marks text snippets \ No newline at end of file +The [[system tag|SystemTags]] `$:/tags/TextEditor/Snippet` marks text snippets \ No newline at end of file From 4f376fba353d635189a3798c75a1b09810acdfaa Mon Sep 17 00:00:00 2001 From: Arlen22 <arlenbee@gmail.com> Date: Fri, 28 Aug 2020 10:43:42 -0400 Subject: [PATCH 0785/2376] Separate $tw.boot.startup into three functions (#4602) * Update boot.js * Update boot.js --- boot/boot.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 6b472cb61..646ddc9c0 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2172,8 +2172,7 @@ $tw.loadTiddlersNode = function() { /* Startup TiddlyWiki */ -$tw.boot.startup = function(options) { - options = options || {}; +$tw.boot.initStartup = function(options) { // Get the URL hash and check for safe mode $tw.locationHash = "#"; if($tw.browser && !$tw.node) { @@ -2306,6 +2305,9 @@ $tw.boot.startup = function(options) { return result; } } +}; +$tw.boot.loadStartup = function(options){ + // Load tiddlers if($tw.boot.tasks.readBrowserTiddlers) { $tw.loadTiddlersBrowser(); @@ -2318,6 +2320,8 @@ $tw.boot.startup = function(options) { } // Give hooks a chance to modify the store $tw.hooks.invokeHook("th-boot-tiddlers-loaded"); +} +$tw.boot.execStartup = function(options){ // Unpack plugin tiddlers $tw.wiki.readPluginInfo(); $tw.wiki.registerPluginTiddlers("plugin",$tw.safeMode ? ["$:/core"] : undefined); @@ -2346,6 +2350,16 @@ $tw.boot.startup = function(options) { $tw.boot.disabledStartupModules = $tw.boot.disabledStartupModules || []; // Repeatedly execute the next eligible task $tw.boot.executeNextStartupTask(options.callback); +} +/* +Startup TiddlyWiki +*/ +$tw.boot.startup = function(options) { + options = options || {}; + // Get the URL hash and check for safe mode + $tw.boot.initStartup(options); + $tw.boot.loadStartup(options); + $tw.boot.execStartup(options); }; /* From 4eda601a32105fef489d521abedf6b3eaaa0df8a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 28 Aug 2020 15:46:29 +0100 Subject: [PATCH 0786/2376] Update "Hidden Setting: Disable Drag and Drop" with version tag Fixes #4573 --- .../hiddensettings/Hidden Setting_ Disable Drag and Drop.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid index 5348a15ea..62c07916a 100644 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid @@ -4,7 +4,7 @@ tags: [[Hidden Settings]] title: Hidden Setting: Disable Drag and Drop type: text/vnd.tiddlywiki -To disable all the drag and drop operations that are built into the core, set the following tiddler to "no": +<.from-version "5.1.22">> To disable all the drag and drop operations that are built into the core, set the following tiddler to "no": $:/config/DragAndDrop/Enable From c187f4b238c307c14e13d55e846cbca6d293badd Mon Sep 17 00:00:00 2001 From: Habash <kamal.habash@gmail.com> Date: Fri, 28 Aug 2020 19:30:00 +0300 Subject: [PATCH 0787/2376] Signing the CLA (#4833) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 183c36bd8..b6446aee2 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -405,3 +405,5 @@ Csaba Molnar, @mocsa, 2020/04/29 Dazhong Xia, @jdangerx, 2020/06/23 Diep Pham, @favadi, 2020/07/30 + +Kamal Habash, @Kamal-Habash, 2020/08/28 From a206dccf0a26a8d5a05a0c7dec35dba3a95f80b2 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Fri, 28 Aug 2020 08:31:57 -0800 Subject: [PATCH 0788/2376] Add GitHub Actions workflow (#4793) * Parameterize strings that mention Travis This is so that the script can be shared with GitHub Actions while we make the transition. * Add GitHub Actions workflow More or less a direct translation of .travis.yml * Rename scripts that mention travis * Fix typo --- .github/workflows/ci.yml | 70 ++++++++++++++++++++ .travis.yml | 10 +-- bin/{travis-pre-build.sh => ci-pre-build.sh} | 0 bin/ci-push.sh | 20 ++++++ bin/travis-push.sh | 20 ------ 5 files changed, 95 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/ci.yml rename bin/{travis-pre-build.sh => ci-pre-build.sh} (100%) create mode 100755 bin/ci-push.sh delete mode 100755 bin/travis-push.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..055007dc7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,70 @@ +on: + pull_request: + push: + branches: + - master + - tiddlywiki-com +env: + COMMIT_CONTEXT: "GitHub build" + COMMIT_EMAIL: "actions@github.com" + COMMIT_NAME: "GitHub Actions" + NODE_VERSION: "12" +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: "${{ env.NODE_VERSION }}" + - run: "./bin/test.sh" + build-prerelease: + runs-on: ubuntu-latest + if: github.ref == "refs/heads/master" + needs: test + env: + TW5_BUILD_TIDDLYWIKI: "./tiddlywiki.js" + TW5_BUILD_MAIN_EDITION: "./editions/prerelease" + TW5_BUILD_OUTPUT: "./output/prerelease" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: "${{ env.NODE_VERSION }}" + - run: "./bin/ci-pre-build.sh" + - name: "Set dynamic environment variables" + run: | + TRAVIS_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') + echo ::set-env name=TRAVIS_BRANCH::${TRAVIS_BRANCH} + echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) + echo ::set-env name=TW5_BUILD_DETAILS::Prerelease built from branch \'$TRAVIS_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + - run: "./bin/build-site.sh" + - run: "./bin/ci-push.sh" + env: + GH_TOKEN: ${{ secrets.GITHUB_PUSH_TOKEN }} + TRAVIS_BUILD_NUMBER: ${{ github.run_number }} + build-tiddlywiki-com: + runs-on: ubuntu-latest + if: github.ref == "refs/heads/tiddlywiki-com" + needs: test + env: + TW5_BUILD_TIDDLYWIKI: "./node_modules/tiddlywiki/tiddlywiki.js" + TW5_BUILD_MAIN_EDITION: "./editions/tw5.com" + TW5_BUILD_OUTPUT: "./output" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: "${{ env.NODE_VERSION }}" + - run: "./bin/ci-pre-build.sh" + - name: "Set dynamic environment variables" + run: | + TRAVIS_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') + echo ::set-env name=TRAVIS_BRANCH::${TRAVIS_BRANCH} + echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) + echo ::set-env name=TW5_BUILD_DETAILS::Built from branch \'$TRAVIS_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + - run: "./bin/build-site.sh" + - run: "./bin/ci-push.sh" + env: + GH_TOKEN: ${{ secrets.GITHUB_PUSH_TOKEN }} + TRAVIS_BUILD_NUMBER: ${{ github.run_number }} diff --git a/.travis.yml b/.travis.yml index 95199ed75..b714cf477 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,27 +9,27 @@ stages: - name: build-tiddlywiki-com if: branch = "tiddlywiki-com" AND type = push AND fork = false -jobs: +jobs: include: - stage: test script: ./bin/test.sh - stage: build-prerelease script: - - ./bin/travis-pre-build.sh + - ./bin/ci-pre-build.sh - export TW5_BUILD_TIDDLYWIKI='./tiddlywiki.js' - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) - export TW5_BUILD_DETAILS="Prerelease built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - export TW5_BUILD_MAIN_EDITION='./editions/prerelease' - export TW5_BUILD_OUTPUT='./output/prerelease' - ./bin/build-site.sh || travis_terminate 1 - - ./bin/travis-push.sh || travis_terminate 1 + - ./bin/ci-push.sh || travis_terminate 1 - stage: build-tiddlywiki-com script: - - ./bin/travis-pre-build.sh + - ./bin/ci-pre-build.sh - export TW5_BUILD_TIDDLYWIKI='./node_modules/tiddlywiki/tiddlywiki.js' - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) - export TW5_BUILD_DETAILS="Built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - export TW5_BUILD_MAIN_EDITION='./editions/tw5.com' - export TW5_BUILD_OUTPUT='./output' - ./bin/build-site.sh || travis_terminate 1 - - ./bin/travis-push.sh || travis_terminate 1 + - ./bin/ci-push.sh || travis_terminate 1 diff --git a/bin/travis-pre-build.sh b/bin/ci-pre-build.sh similarity index 100% rename from bin/travis-pre-build.sh rename to bin/ci-pre-build.sh diff --git a/bin/ci-push.sh b/bin/ci-push.sh new file mode 100755 index 000000000..97a06e64e --- /dev/null +++ b/bin/ci-push.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Push output back to GitHub + + +cd output || exit 1 + +git config --global user.email "${COMMIT_EMAIL:-travis@travis-ci.org}" || exit 1 + +git config --global user.name "${COMMIT_NAME:-Travis CI}" || exit 1 + +git add -A . || exit 1 + +git commit --message "${COMMIT_CONTEXT:-Travis build}: $TRAVIS_BUILD_NUMBER of $TRAVIS_BRANCH ($(date +'%F %T %Z'))" || exit 1 + +git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null || exit 1 + +git push deploy master &>/dev/null || exit 1 + +cd .. || exit 1 diff --git a/bin/travis-push.sh b/bin/travis-push.sh deleted file mode 100755 index aa16cd73c..000000000 --- a/bin/travis-push.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# Push output back to GitHub - - -cd output || exit 1 - -git config --global user.email "travis@travis-ci.org" || exit 1 - -git config --global user.name "Travis CI" || exit 1 - -git add -A . || exit 1 - -git commit --message "Travis build: $TRAVIS_BUILD_NUMBER of $TRAVIS_BRANCH ($(date +'%F %T %Z'))" || exit 1 - -git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null || exit 1 - -git push deploy master &>/dev/null || exit 1 - -cd .. || exit 1 From ae604cd66039718ef0d768242c3cddbe6a5fdfb0 Mon Sep 17 00:00:00 2001 From: Habash <kamal.habash@gmail.com> Date: Fri, 28 Aug 2020 19:47:57 +0300 Subject: [PATCH 0789/2376] Add Arabic (Palestine) translation (#4720) This is my first contribution to Tiddlywiki , which contains an Arabic translation of 603 strings out of the porposed 941 strings in the translator edition. I'll be working soon to finish the translator's edition strings, and I'll create a proper cascading for the arabic tiddlers. --- languages/ar-PS/Buttons.multids | 161 ++++++++++++ languages/ar-PS/ControlPanel.multids | 262 ++++++++++++++++++++ languages/ar-PS/CoreReadMe.tid | 8 + languages/ar-PS/Dates.multids | 90 +++++++ languages/ar-PS/Docs/ModuleTypes.multids | 2 + languages/ar-PS/Docs/PaletteColours.multids | 2 + languages/ar-PS/EditTemplate.multids | 27 ++ languages/ar-PS/Exporters.multids | 5 + languages/ar-PS/Fields.multids | 2 + languages/ar-PS/Filters.multids | 2 + languages/ar-PS/GettingStarted.tid | 17 ++ languages/ar-PS/Import.multids | 17 ++ languages/ar-PS/Misc.multids | 78 ++++++ languages/ar-PS/Modals/Download.tid | 13 + languages/ar-PS/Modals/SaveInstructions.tid | 22 ++ languages/ar-PS/NewJournal.multids | 4 + languages/ar-PS/Notifications.multids | 8 + languages/ar-PS/Search.multids | 23 ++ languages/ar-PS/SideBar.multids | 17 ++ languages/ar-PS/SiteSubtitle.tid | 3 + languages/ar-PS/SiteTitle.tid | 3 + languages/ar-PS/ThemeTweaks.multids | 2 + languages/ar-PS/TiddlerInfo.multids | 26 ++ languages/ar-PS/icon.tid | 7 + languages/ar-PS/plugin.info | 8 + 25 files changed, 809 insertions(+) create mode 100644 languages/ar-PS/Buttons.multids create mode 100644 languages/ar-PS/ControlPanel.multids create mode 100644 languages/ar-PS/CoreReadMe.tid create mode 100644 languages/ar-PS/Dates.multids create mode 100644 languages/ar-PS/Docs/ModuleTypes.multids create mode 100644 languages/ar-PS/Docs/PaletteColours.multids create mode 100644 languages/ar-PS/EditTemplate.multids create mode 100644 languages/ar-PS/Exporters.multids create mode 100644 languages/ar-PS/Fields.multids create mode 100644 languages/ar-PS/Filters.multids create mode 100644 languages/ar-PS/GettingStarted.tid create mode 100644 languages/ar-PS/Import.multids create mode 100644 languages/ar-PS/Misc.multids create mode 100644 languages/ar-PS/Modals/Download.tid create mode 100644 languages/ar-PS/Modals/SaveInstructions.tid create mode 100644 languages/ar-PS/NewJournal.multids create mode 100644 languages/ar-PS/Notifications.multids create mode 100644 languages/ar-PS/Search.multids create mode 100644 languages/ar-PS/SideBar.multids create mode 100644 languages/ar-PS/SiteSubtitle.tid create mode 100644 languages/ar-PS/SiteTitle.tid create mode 100644 languages/ar-PS/ThemeTweaks.multids create mode 100644 languages/ar-PS/TiddlerInfo.multids create mode 100644 languages/ar-PS/icon.tid create mode 100644 languages/ar-PS/plugin.info diff --git a/languages/ar-PS/Buttons.multids b/languages/ar-PS/Buttons.multids new file mode 100644 index 000000000..15c4688e9 --- /dev/null +++ b/languages/ar-PS/Buttons.multids @@ -0,0 +1,161 @@ +title: $:/language/Buttons/ + +AdvancedSearch/Caption: بحث متقدم +AdvancedSearch/Hint: بحث متقدم +Bold/Caption: غامق +Bold/Hint: غامق +Cancel/Caption: الغاء +Cancel/Hint: الغاء +Clear/Caption: مسح +Clone/Caption: إستنسخ +Clone/Hint: إستنسخ هذا التدلر +Close/Caption: إغلاق +Close/Hint: إغلاق +CloseAll/Caption: إغلاق الجميع +CloseAll/Hint: إغلاق جميع التدلرز +CloseOthers/Caption: أغلق الأخريات +CloseOthers/Hint: أغلاق التلرز الأخرى +ControlPanel/Caption: لوحة التحكم +ControlPanel/Hint: فتح لوحة التحكم +CopyToClipboard/Caption: انسخ على لوحة الحفظ +CopyToClipboard/Hint: انسخ هذا النص على لوحة الحفظ +Delete/Caption: إحذف +Delete/Hint: إحذف هذا التدلر +Edit/Caption: تحرير +Edit/Hint: تحرير هذا التدلر +EditorHeight/Caption: ارتفاع المحرر +EditorHeight/Caption/Auto: اضبط الارتفاع تلقائيًا ليلائم المحتوى +Encryption/Caption: التشفير +Encryption/ClearPassword/Caption: مسح كلمة السر +Encryption/ClearPassword/Hint: امسح كلمة المرور واحفظ هذا الويكي بدون تشفير +Encryption/Hint: ضع أو إمسح كلمة مرور لحفظ هذا الويكي +Encryption/SetPassword/Caption: ضع كلمة السر +Encryption/SetPassword/Hint: ضع كلمة مرور لحفظ هذا الويكي باستخدام التشفير +Excise/Caption/NewTitle: عنوان التدلر الجديد +Excise/Caption/Replace/Link: رابط +ExportPage/Caption: تصدير الكل +ExportPage/Hint: تصدير كل التدلرز +ExportTiddler/Caption: تصدير تدلر +ExportTiddler/Hint: تصدير تدلر +ExportTiddlers/Caption: تصدير تدلرز +ExportTiddlers/Hint: تصدير تدلرز +Fold/Caption: طوي تدلر +Fold/Hint: إطوِ نص هذا التدلر +FoldAll/Caption: إطوِ جميع التدلرز +FoldAll/Hint: إطوِ نصوص جميع التدلرز المفتوحة +FoldOthers/Caption: إطوِ جميع التدلرز +FoldOthers/Hint: إطوِ نصوص التدلرز المفتوحة الأخرى +FullScreen/Caption: ملء الشاشة +FullScreen/Hint: ادخل أو غادر وضعية ملء الشاشة +Help/Caption: مساعدة +Help/Hint: إظهار لوحة المساعدة +HideSideBar/Caption: اخفاء الشريط الجانبي +HideSideBar/Hint: اخفاء الشريط الجانبي +Home/Caption: الصفحة الرئيسية +Home/Hint: افتح التدلرز المفترضة +Import/Caption: إستيراد +Import/Hint: استيراد العديد من أنواع الملفات بما في ذلك النص أو الصورة أو TiddlyWiki أو JSON +Info/Caption: معلومات +Info/Hint: عرض معلومات هذا التدلر +Italic/Caption: مائل +Italic/Hint: تطبيق التنسيق المائل على التحديد +Language/Caption: لغة +Language/Hint: اختر لغة واجهة المستخدم +LineWidth/Caption: عرض الخط +Link/Caption: رابط +Link/Hint: إنشاء رابط ويكي +Linkify/Caption: رابط ويكي +Linkify/Hint: غلف التحديد بأقواس مربعة +ListBullet/Caption: قائمة نقطية +ListNumber/Caption: قائمة مرقمة +Manager/Caption: مدير التدلرز +Manager/Hint: إفتح مدير التدلرز +MonoBlock/Caption: كتلة أحادية المسافة +MonoLine/Caption: أحادي المسافة +More/Caption: المزيد +More/Hint: المزيد من الإجراءات +NewHere/Caption: أنشاء جديد هنا +NewHere/Hint: إنشاء تدلر جديد موسوم بهذا +NewImage/Caption: رسم جديد +NewImage/Hint: قم بإنشاء تدلر رسام +NewJournal/Caption: دفتر اليومية جديد +NewJournal/Hint: قم بإنشاء دفتر يوميات جديد +NewJournalHere/Caption: أنشئ دفتر يوميات جديد هنا +NewJournalHere/Hint: قم بإنشاء دفتر يوميات جديد موسوم بهذا +NewMarkdown/Caption: تدلر ماركداون جديد +NewMarkdown/Hint: قم بإنشاء تدلر ماركداون جديد +NewTiddler/Caption: تدلر جديد +NewTiddler/Hint: قم بإنشاء تدلر جديد +Opacity/Caption: تعتيم +OpenWindow/Caption: افتح في نافذة جديدة +OpenWindow/Hint: افتح التدلر في نافذة جديدة +Paint/Caption: لون الطلاء +Palette/Caption: نظام الألوان +Palette/Hint: اختر نظام الألوان +Permalink/Caption: الرابط المباشر +Permalink/Hint: اضبط شريط عنوان المتصفح على رابط مباشر لهذا التدلر + +Permaview/Caption: العرض المباشر +Permaview/Hint: اضبط شريط عنوان المتصفح على رابط مباشر لجميع التدلرز في هذه القصة + +Picture/Caption: صورة +Picture/Hint: إدراج صورة +Preview/Caption: معاينة +Preview/Hint: إظهار شاشة المعاينة + +PreviewType/Caption: نوع المعاينة +PreviewType/Hint: اختر نوع المعاينة +Print/Caption: طباعة الصفحة +Print/Hint: اطبع الصفحة الحالية +Quote/Caption: quote +Refresh/Caption: تحديث +Refresh/Hint: قم بإجراء تحديث كامل للويكي +RotateLeft/Caption: تدوير لليسار +RotateLeft/Hint: تدوير الصورة لليسار بزاوية 90 درجة +Save/Caption: تمام +Save/Hint: تأكيد التغييرات على هذا التدلر +SaveWiki/Caption: حفظ التغييرات +SaveWiki/Hint: حفظ التغييرات +ShowSideBar/Caption: إظهار الشريط الجانبي +ShowSideBar/Hint: إظهار الشريط الجانبي +Size/Caption: حجم الصورة +Size/Caption/Height: ارتفاع: +Size/Caption/Resize: تغيير حجم الصورة +Size/Caption/Width: عرض: +Size/Hint: ضبط حجم الصورة +Stamp/Caption: ختم +Stamp/Caption/New: اضف اشياءك الخاصة +Stamp/Hint: أدخل نصا مقتطفًا تم تكوينه مسبقًا +Stamp/New/Text: نص المقتطف. (تذكر إضافة عنوان وصفي في حقل الشرح). +Stamp/New/Title: الاسم كما هو ظاهر في القائمة +StoryView/Caption: عرض القصة +StoryView/Hint: اختر تصور القصة +Strikethrough/Caption: يتوسطه خط +Strikethrough/Hint: تطبيق تنسيق "يتوسطه خط"على التحديد +Subscript/Caption: نص منخفض +Subscript/Hint: تطبيق تنسيق منخفض على التحديد + +Superscript/Caption: نص مرتفع +Superscript/Hint: تطبيق تنسيق مرتفع على التحديد +TagManager/Caption: ادارة الوسوم +TagManager/Hint: افتح ادارة الوسوم +Theme/Caption: ثيم +Theme/Hint: إختر ثيم العرض +Timestamp/Caption: الطوابع الزمنية +Timestamp/Hint: اختر ما إذا قامت التعديلات بتحديث الطوابع الزمنية + +Timestamp/Off/Caption: الطوابع الزمنية متوقفة +Timestamp/Off/Hint: لا تقم بتحديث الطوابع الزمنية عندما يتم تعديل التدلرز +Timestamp/On/Caption: الطوابع الزمنية مفعّلة +Timestamp/On/Hint: حَدث الطوابع الزمنية عندما يتم تعديل التدلرز + +ToggleSidebar/Hint: تبديل رؤية الشريط الجانبي +Transcludify/Caption: ترانسكلوجن +Transcludify/Hint: غلف التحديد بأقواس مجعدة +Underline/Caption: تسطير +Underline/Hint: تطبيق تنسيق التسطير على التحديد + +Unfold/Caption: بسط التدلر +Unfold/Hint: إبسط نص هذا التدلر +UnfoldAll/Caption: إبسط جميع التدلرز +UnfoldAll/Hint: إبسط نصوص جميع التدلرز المفتوحة diff --git a/languages/ar-PS/ControlPanel.multids b/languages/ar-PS/ControlPanel.multids new file mode 100644 index 000000000..df17cecc4 --- /dev/null +++ b/languages/ar-PS/ControlPanel.multids @@ -0,0 +1,262 @@ +title: $:/language/ControlPanel/ + +<$button set="$: DefaultTiddlers" setTo="[list[$:/StoryList]]"> +Advanced/Caption: متقدم +Advanced/Hint: معلومات داخلية عن هذا الوكي +Appearance/Caption: مظهر خارجي +Appearance/Hint: طرق لتخصيص مظهر وكي خاص بك. + +Basics/AnimDuration/Prompt: مدة الرسوم المتحركة +Basics/AutoFocus/Prompt: موقع مؤشر الماوس الإفتراضي للتدلرز الجددة +Basics/Caption: أساسيات +Basics/DefaultTiddlers/BottomHint: إستخدم [[أقواس مربعة مزدوجة]] للعناوين مع مسافات. أو بإمكانك إختيار +<$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]"> +الإحتفاظ بترتيب القصة +</$button> +Basics/DefaultTiddlers/Prompt: تدلرز مفترضة +Basics/DefaultTiddlers/TopHint: أي تدلرز ستظهر عند التشغيل +Basics/Language/Prompt: مرحبا! اللغة الحالية: +Basics/NewJournal/Tags/Prompt: وسوم لتدلر اليوميات الجديدة + +Basics/NewJournal/Text/Prompt: نص لتدلر اليوميات الجديدة +Basics/NewJournal/Title/Prompt: عنوان لتدلر اليوميات الجديدة +Basics/NewTiddler/Tags/Prompt: وسوم للتدلرز الجديدة +Basics/NewTiddler/Title/Prompt: عنوان للتدلرز الجديدة +Basics/OverriddenShadowTiddlers/Prompt: عدد تدلرز الظل التي تم تجاوزها +Basics/ShadowTiddlers/Prompt: عدد تدلرز الظل +Basics/Subtitle/Prompt: العنوان الفرعي + +Basics/SystemTiddlers/Prompt: عدد تدلرز النظام +Basics/Tags/Prompt: عدد الوسوم +Basics/Tiddlers/Prompt: عدد التدلرز +Basics/Title/Prompt: عنوان هذا الويكي +Basics/Username/Prompt: اسم المستخدم لتوقيع التعديلات +Basics/Version/Prompt: نسخة تدلي ويكي +EditorTypes/Caption: أنواع المحرر +EditorTypes/Editor/Caption: المحرر +EditorTypes/Hint: تحدد هذه التدلرز أي محرر مستخدم لتحرير أنواع معينة من التدلرز +EditorTypes/Type/Caption: نوع +Info/Caption: معلومات +Info/Hint: معلومات عن هذا التدلي ويكي +KeyboardShortcuts/Add/Caption: إضافة اختصار +KeyboardShortcuts/Add/Prompt: اكتب اختصار هنا +KeyboardShortcuts/Caption: اختصارات لوحة المفاتيح +KeyboardShortcuts/Hint: إدارة تعيينات اختصارات لوحة المفاتيح +KeyboardShortcuts/NoShortcuts/Caption: لم يتم تعيين اختصارات لوحة المفاتيح +KeyboardShortcuts/Platform/All: جميع المنصات +KeyboardShortcuts/Platform/Linux: نظام لينكس فقط +KeyboardShortcuts/Platform/Mac: نظام ماكنتوش فقط +KeyboardShortcuts/Platform/NonLinux: انظمة غير نظام لينكس فقط +KeyboardShortcuts/Platform/NonMac: انظمة غير نظام ماكنتوش فقط +KeyboardShortcuts/Platform/NonWindows: انظمة غير نظام ويندوز فقط +KeyboardShortcuts/Platform/Windows: نظام ويندوز فقط +KeyboardShortcuts/Remove/Hint: إزالة اختصار لوحة المفاتيح +LoadedModules/Caption: الوحدات المحملة +LoadedModules/Hint: هذ هي وحدات التدلرز المحملة حاليا والمرتبطة بتدلرز مصدرية. تفتقر أي وحدات بتنسيق مائل إلى تدلر مصدري ، عادة لأن إعدادها تم أثناء عملية التمهيد. + +Palette/Caption: نظام الألوان +Palette/Editor/Clone/Caption: استنساخ + +Palette/Editor/Clone/Prompt: من المستحسن أن تنسخ نظام ألوان الظل هذه قبل تحريره + +Palette/Editor/Delete/Hint: حذف هذا الإدخال من نظام الألوان + +Palette/Editor/Names/External/Show: إظهار أسماء الألوان التي ليست جزءًا من نظام الألوان الحالي + +Palette/Editor/Prompt: التحرير +Palette/Editor/Prompt/Modified: تم تعديل نظام ألوان الظل هذه + +Palette/Editor/Reset/Caption: إعادة تعيين +Palette/HideEditor/Caption: إخفاء محرر + +Palette/Prompt: نظام الألوان الحالي: +Palette/ShowEditor/Caption: إظهار محرر +Parsing/Caption: التحليل النحوي +Parsing/Hint: هنا يمكنك تعطيل / تمكين قواعد محلل ويكي النحوي. لكي تدخل التغييرات حيز التنفيذ ، احفظ موقع الويكي وأعد تحميله. يمكن أن يمنع تعطيل بعض قواعد المحلل النحوي <$text text="تدلي ويكي"/> من العمل بشكل صحيح. استخدم [[الوضع الآمن | https: //tiddlywiki.com/#SafeMode]] لاستعادة التشغيل العادي. +Plugins/Add/Caption: احصل على المزيد من البرامج المساعدة +Plugins/Add/Hint: تثبيت البرامج المساعدة من المكتبة الرسمية +Plugins/AlreadyInstalled/Hint: هذا البرنامج المساعد مثبت بالفعل في الإصدار + <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: يتطلب أيضًا: +Plugins/Caption: البرامج المساعدة +Plugins/ClosePluginLibrary: إغلاق مكتبة البرنامج المساعد +Plugins/Disable/Caption: تعطيل +Plugins/Disable/Hint: قم بتعطيل هذا البرنامج المساعد عند إعادة تحميل الصفحة +Plugins/Disabled/Status: (معطل) +Plugins/Downgrade/Caption: تخفيض +Plugins/Empty/Hint: لا يوجد + +Plugins/Enable/Caption: مَكن +Plugins/Enable/Hint: تمكين هذا البرنامج المساعد عند إعادة تحميل الصفحة +Plugins/Install/Caption: تثبيت +Plugins/Installed/Hint: البرنامج المساعد المثبتة حاليًا: +Plugins/Languages/Caption: اللغات +Plugins/Languages/Hint: برامج مساعدة (حزم لغوية) +Plugins/NotInstalled/Hint: هذا البرنامج المساعد غير مثبت حاليا +Plugins/OpenPluginLibrary: فتح مكتبة البرنامج المساعد +Plugins/Plugins/Caption: البرامج المساعدة +Plugins/Plugins/Hint: البرامج المساعدة +Plugins/PluginWillRequireReload: (يتطلب إعادة التحميل) +Plugins/Reinstall/Caption: إعادة تثبيت +Plugins/Themes/Caption: ثيمات +Plugins/Themes/Hint: برامج مساعدة (ثيمات) +Plugins/Update/Caption: تحديث +Plugins/Updates/Caption: التحديثات +Plugins/Updates/Hint: التحديثات المتاحة للمكونات الإضافية المثبتة +Plugins/Updates/UpdateAll/Caption: تحديث <<update-count>> برامج المساعدة +Saving/Caption: حفظ +Saving/DownloadSaver/AutoSave/Description: السماح بالحفظ التلقائي لحافظ التنزيل +Saving/DownloadSaver/AutoSave/Hint: تمكين الحفظ التلقائي لحافظ التنزيل +Saving/DownloadSaver/Caption: حافظ التنزيل +Saving/DownloadSaver/Hint: تنطبق هذه الإعدادات على خادم التنزيل المتوافق مع HTML5 +Saving/General/Caption: عام +Saving/General/Hint: تنطبق هذه الإعدادات على جميع الخوادم المحملة +Saving/GitService/Branch: الفرع المستهدف للحفظ +Saving/GitService/CommitMessage: حفظ بواسطة تدلي ويكي +Saving/GitService/Description: تُستخدم هذه الإعدادات فقط عند الحفظ في <<service-name>> +Saving/GitService/Filename: اسم الملف الهدف (مثال `index.html`) + +Saving/GitService/Gitea/Caption: حافظ جت تي +Saving/GitService/Gitea/Password: رمز الوصول الشخصي لواجهة برمجة التطبيقات (عبر واجهة الويب لـ Gitea: `الإعدادات | التطبيقات | إنشاء رمز جديد`) +Saving/GitService/GitHub/Caption: حافظ جت هب +Saving/GitService/GitHub/Password: كلمة المرور أو رمز OAUTH أو رمز الوصول الشخصي (انظر [[صفحة مساعدة GitHub | https: //help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] للتفاصيل) +Saving/GitService/GitLab/Caption: حافظ جت لاب +Saving/GitService/GitLab/Password: رمز الدخول الشخصي لواجهة برمجة التطبيقات (انظر [[صفحة مساعدة GitLab | https: //docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] للحصول على التفاصيل) +Saving/GitService/Path: مسار الملف المستهدف (مثال `/wiki/`) +Saving/GitService/Repo: المستودع الهدف (مثال `Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: عنوان URL لواجهة برمجة تطبيقات الخادم + +Saving/GitService/UserName: إسم المستخدم +Saving/Hint: الإعدادات المستخدمة لحفظ تدلي ويكي بالكامل كملف واحد عبر وحدة خادم + +Saving/TiddlySpot/Advanced/Heading: إعدادات متقدمة +Saving/TiddlySpot/BackupDir: مجلد النسخة الاحتياطية +Saving/TiddlySpot/Backups: النسخ الاحتياطية +Saving/TiddlySpot/Caption: حافظ تدلي سبوت +Saving/TiddlySpot/Description: تُستخدم هذه الإعدادات فقط عند الحفظ في http://tiddlyspot.com أو خادم آخر مناسب + +Saving/TiddlySpot/Filename: إسم ملف التحميل +Saving/TiddlySpot/Password: كلمة المرور +Saving/TiddlySpot/UploadDir: مجلد التحميل +Saving/TiddlySpot/UserName: إسم الويكي +Settings/AutoSave/Caption: حفظ تلقائي +Settings/AutoSave/Disabled/Description: لا تقم بحفظ التغييرات تلقائيًا +Settings/AutoSave/Enabled/Description: إحفظ التغييرات تلقائيًا +Settings/CamelCase/Caption: روابط ويكي بنمط كاميلكيس +Settings/CamelCase/Description: تفعيل الربط التلقائي لعبارات كاميلكيس +Settings/CamelCase/Hint: يمكنك تعطيل الربط التلقائي لعبارات كاميلكيس بشكل عام. يتطلب إعادة التحميل لتصبح نافذة المفعول +Settings/Caption: الإعدادات +Settings/DefaultMoreSidebarTab/Caption: القيمة الافتراضية للتبويب "مزيد" في الشريط الجانبي + +Settings/DefaultMoreSidebarTab/Hint: حدد أي قيمة في التبويب "مزيد" سيتم عرضها بشكل افتراضي من الشريط الجانبي +Settings/DefaultSidebarTab/Caption: التبويب الافتراضي في الشريط الجانبي + +Settings/DefaultSidebarTab/Hint: حدد أي تبويب سيتم عرضه بشكل افتراضي في الشريط الجانبي + +Settings/EditorToolbar/Caption: شريط أدوات المحرر + +Settings/EditorToolbar/Description: أظهر شريط أدوات المحرر + +Settings/EditorToolbar/Hint: تمكين أو تعطيل شريط أدوات المحرر: + +Settings/Hint: تتيح لك هذه الإعدادات تخصيص سلوك تدلي ويكي. + +Settings/InfoPanelMode/Caption: وضع لوحة معلومات تدلر +Settings/InfoPanelMode/Hint: تحديد أي ظرف يتم فيه إغلاق لوحة معلومات +Settings/InfoPanelMode/Popup/Description: يتم إغلاق لوحة معلومات تدلر تلقائيًا + +Settings/InfoPanelMode/Sticky/Description: تظل لوحة معلومات تدلر مفتوحة حتى يتم إغلاقها + +Settings/LinkToBehaviour/Caption: سلوك عملية فتح تدلر +Settings/LinkToBehaviour/InsideRiver/Hint: التقل من // داخل // مسار القصة + +Settings/LinkToBehaviour/OpenAbove: فتح فوق التدلر الحالي + +Settings/LinkToBehaviour/OpenAtBottom: فتح في الجزء السفلي من مسار القصة + +Settings/LinkToBehaviour/OpenAtTop: فتح في الجزء العلوي من مسار القصة + +Settings/LinkToBehaviour/OpenBelow: فتح أسفل التدلر الحالي + +Settings/LinkToBehaviour/OutsideRiver/Hint: التقل من // خارج // مسار القصة + +Settings/MissingLinks/Caption: روابط ويكي +Settings/MissingLinks/Description: تمكين الارتباط بتلرز مفقودة + +Settings/MissingLinks/Hint: اختيار إمكانية الارتباط بتدلرز غير موجودين بعد + +Settings/NavigationAddressBar/Caption: شريط عنوان التنقل +Settings/NavigationAddressBar/Hint: سلوك شريط عنوان المتصفح عند الانتقال إلى تدلر + +Settings/NavigationAddressBar/No/Description: لا تقم بتحديث شريط العنوان + +Settings/NavigationAddressBar/Permalink/Description: قم بتضمين التدلر المستهدف + +Settings/NavigationAddressBar/Permaview/Description: قم بتضمين التدلر المستهدف وتسلسل القصة الحالي + +Settings/NavigationHistory/Caption: محفوظات التنقل + +Settings/NavigationHistory/Hint: تحديث محفوظات المتصفح عند الانتقال إلى تدلر: + +Settings/NavigationHistory/No/Description: لا تقم بتحديث محفوظات المتصفح + +Settings/NavigationHistory/Yes/Description: حدث محفوظات المتصفح +Settings/NavigationPermalinkviewMode/Caption: رابط مباشر/ وضع العرض المباشر + +Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: انسخ الرابط المباشر/ رابط العرض المباشر إلى الكليب-بورد + +Settings/NavigationPermalinkviewMode/Hint: اختر كيفية معالجة الرابط المباشر/ العرض المباشر: + +Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: تحديث شريط العنوان باستخدام الرابط المباشر/ رابط العرض المباشر + +Settings/PerformanceInstrumentation/Caption: قياس الأداء +Settings/PerformanceInstrumentation/Description: تمكين قياس الأداء + +Settings/PerformanceInstrumentation/Hint: يعرض إحصائيات الأداء في وحدة تحكم مطور المتصفح. يتطلب إعادة التحميل لتصبح نافذة المفعول +Settings/TitleLinks/Caption: عناوين التدلرز +Settings/TitleLinks/Hint: عرض عناوين التدلرز بشكل اختياري كروابط + +Settings/TitleLinks/No/Description: لا تعرض عناوين التدلرز كروابط + +Settings/TitleLinks/Yes/Description: عرض عناوين التدلرز كروابط + +Settings/ToolbarButtons/Caption: أزرار شريط الأدوات + +Settings/ToolbarButtons/Hint: مظهر زر شريط الأدوات الافتراضي: +Settings/ToolbarButtons/Icons/Description: إدراج أيقونة +Settings/ToolbarButtons/Text/Description: إدراج نص +Settings/ToolbarButtonStyle/Caption: نمط زر شريط الأدوات +Settings/ToolbarButtonStyle/Hint: اختر نمط أزرار شريط الأدوات: + +Settings/ToolbarButtonStyle/Styles/Borderless: بلا حدود + +Settings/ToolbarButtonStyle/Styles/Boxed: وضع في صندوق +Settings/ToolbarButtonStyle/Styles/Rounded: وضع في دائرة +StoryView/Caption: عرض القصة +StoryView/Prompt: العرض الحالي: +Stylesheets/Caption: ستايل شيتس +Stylesheets/Expand/Caption: توسيع الكل +Stylesheets/Hint: هـذه قائمة من ستايل شيت تدلرز فعالة وموسومة بـ <<tag "$:/tags/Stylesheet">> +Stylesheets/Restore/Caption: استعادة +Theme/Caption: ثيم +Theme/Prompt: الثيم الحالي: + +TiddlerFields/Caption: حقول التدلر +TiddlerFields/Hint: هذه هي المجموعة الكاملة من حقول التدلرز المستخدمة في هذا الويكي (بما في ذلك تدلرز النظام ولكن باستثناء تدلرز الظل). +Toolbars/Caption: أشرطة الأدوات +Toolbars/EditorToolbar/Caption: شريط أدوات المحرر + +Toolbars/EditorToolbar/Hint: اختر الأزرار التي يتم عرضها في شريط أدوات المحرر. لاحظ أن بعض الأزرار ستظهر فقط عند تحرير التدلرز من نوع معين. اسحب وأفلت لتغيير الترتيب +Toolbars/EditToolbar/Caption: شريط الأدوات التحرير +Toolbars/EditToolbar/Hint: اختر الأزرار التي يتم عرضها للتدلرز في وضع التحرير. اسحب وأفلت لتغيير الترتيب. + +Toolbars/Hint: حدد أزرار شريط الأدوات التي يتم عرضها + +Toolbars/PageControls/Caption: شريط أدوات الصفحة +Toolbars/PageControls/Hint: اختر الأزرار التي يتم عرضها على شريط أدوات الصفحة الرئيسية. اسحب وأفلت لتغيير الترتيب + +Toolbars/ViewToolbar/Caption: شريط أدوات العرض +Toolbars/ViewToolbar/Hint: اختر الأزرار التي يتم عرضها للتدلرز في وضع العرض. اسحب وأفلت لتغيير الترتيب + +Tools/Download/Full/Caption: تنزيل الويكي بشكل كامل + diff --git a/languages/ar-PS/CoreReadMe.tid b/languages/ar-PS/CoreReadMe.tid new file mode 100644 index 000000000..e1c30ed32 --- /dev/null +++ b/languages/ar-PS/CoreReadMe.tid @@ -0,0 +1,8 @@ +title: $:/core/readme + +يحتوي هذا البرنامج المساعد على مكونات تدلي ويكي الأساسية ، والتي تشمل: + +* وحدات كود جافا سكريبت +* الأيقونات +* النماذج المطلوبة لإنشاء واجهة مستخدم تدلي ويكي +* ترجمات اللغة العربية الفلسطينية ("ar-PS") للأسطر التي يمكن ترجمتها وجعلها محلية والمستخدمة بهذه الوحدة المركزية \ No newline at end of file diff --git a/languages/ar-PS/Dates.multids b/languages/ar-PS/Dates.multids new file mode 100644 index 000000000..765d90677 --- /dev/null +++ b/languages/ar-PS/Dates.multids @@ -0,0 +1,90 @@ +title: $:/language/ + +Date/DaySuffix/1: +Date/DaySuffix/10: +Date/DaySuffix/11: +Date/DaySuffix/12: +Date/DaySuffix/13: +Date/DaySuffix/14: +Date/DaySuffix/15: +Date/DaySuffix/16: +Date/DaySuffix/17: +Date/DaySuffix/18: +Date/DaySuffix/19: +Date/DaySuffix/2: +Date/DaySuffix/20: +Date/DaySuffix/21: +Date/DaySuffix/22: +Date/DaySuffix/23: +Date/DaySuffix/24: +Date/DaySuffix/25: +Date/DaySuffix/26: +Date/DaySuffix/27: +Date/DaySuffix/28: +Date/DaySuffix/29: +Date/DaySuffix/3: +Date/DaySuffix/30: +Date/DaySuffix/31: +Date/DaySuffix/4: +Date/DaySuffix/5: +Date/DaySuffix/6: +Date/DaySuffix/7: +Date/DaySuffix/8: +Date/DaySuffix/9: +Date/Long/Day/0: الأحد +Date/Long/Day/1: الإثنين +Date/Long/Day/2: الثلاثاء +Date/Long/Day/3: الأربعاء +Date/Long/Day/4: الخميس +Date/Long/Day/5: الجمعة +Date/Long/Day/6: السبت +Date/Long/Month/1: كانون الثاني +Date/Long/Month/10: تشرين الأول +Date/Long/Month/11: تشرين الثاني +Date/Long/Month/12: كانون الأول +Date/Long/Month/2: شباط +Date/Long/Month/3: أذار +Date/Long/Month/4: نيسان +Date/Long/Month/5: أيار +Date/Long/Month/6: حزيران +Date/Long/Month/7: تموز +Date/Long/Month/8: آب +Date/Long/Month/9: أيلول +Date/Period/am: ًصباحا +Date/Period/pm: مساءاً +Date/Short/Day/0: الأحد +Date/Short/Day/1: الإثنين +Date/Short/Day/2: الثلاثاء +Date/Short/Day/3: الأربعاء +Date/Short/Day/4: الخميس +Date/Short/Day/5: الجمعة +Date/Short/Day/6: السبت +Date/Short/Month/1: كانون الثاني +Date/Short/Month/10: تشرين الأول +Date/Short/Month/11: تشرين الثاني +Date/Short/Month/12: كانون الأول +Date/Short/Month/2: شباط +Date/Short/Month/3: أذار +Date/Short/Month/4: نيسان +Date/Short/Month/5: أيار +Date/Short/Month/6: حزيران +Date/Short/Month/7: تموز +Date/Short/Month/8: آب +Date/Short/Month/9: أيلول +RelativeDate/Future/Days: <<period>> بعد أيام من الآن + +RelativeDate/Future/Hours: <<period>> ساعات من الآن +RelativeDate/Future/Minutes: <<period>> دقائق من الآن + +RelativeDate/Future/Months: <<period>> بعد أشهر من الآن +RelativeDate/Future/Second: ثانية واحدة من الآن +RelativeDate/Future/Seconds: <<period>> ثواني من الآن +RelativeDate/Future/Years: <<period>> سنوات من الآن +RelativeDate/Past/Days: <<period>> أيام مضت +RelativeDate/Past/Hours: <<period>> منذ ساعات +RelativeDate/Past/Minutes: <<period>> دقائق مضت +RelativeDate/Past/Months: <<period>> منذ اشهر +RelativeDate/Past/Second: منذ ثانية واحدة + +RelativeDate/Past/Seconds: <<period>> منذ ثوانى +RelativeDate/Past/Years: <<period>> سنين مضت diff --git a/languages/ar-PS/Docs/ModuleTypes.multids b/languages/ar-PS/Docs/ModuleTypes.multids new file mode 100644 index 000000000..27adfbfb3 --- /dev/null +++ b/languages/ar-PS/Docs/ModuleTypes.multids @@ -0,0 +1,2 @@ +title: $:/language/Docs/ModuleTypes/ + diff --git a/languages/ar-PS/Docs/PaletteColours.multids b/languages/ar-PS/Docs/PaletteColours.multids new file mode 100644 index 000000000..9796752f4 --- /dev/null +++ b/languages/ar-PS/Docs/PaletteColours.multids @@ -0,0 +1,2 @@ +title: $:/language/Docs/PaletteColours/ + diff --git a/languages/ar-PS/EditTemplate.multids b/languages/ar-PS/EditTemplate.multids new file mode 100644 index 000000000..2ff06db91 --- /dev/null +++ b/languages/ar-PS/EditTemplate.multids @@ -0,0 +1,27 @@ +title: $:/language/EditTemplate/ + +Body/External/Hint: يعرض هذا التدلر محتوى مخزن خارج ملف تدلي ويكي الرئيسي. يمكنك تحرير الوسوم والحقول ولكن لا يمكنك تحرير المحتوى نفسه مباشرة + +Body/Placeholder: اكتب النص لهذا التدلر + +Body/Preview/Type/Output: output +Field/Dropdown/Caption: قائمة الحقول +Fields/Add/Button: أضف +Fields/Add/Button/Hint: أضف الحقل الجديد إلى التدلر +Fields/Add/Dropdown/System: حقول النظام +Fields/Add/Dropdown/User: حقول المستخدم +Fields/Add/Name/Placeholder: اسم الحقل +Fields/Add/Prompt: أضف حقل جديد: +Fields/Add/Value/Placeholder: قيمة الحقل +Tags/Add/Button: أضف +Tags/Add/Button/Hint: أضف وسما +Tags/Add/Placeholder: إسم الوسم +Tags/Dropdown/Caption: قائمة وسوم +Tags/Dropdown/Hint: إظهار قائمة الوسوم +Title/Exists/Prompt: التدلر المستهدف موجود بالفعل +Type/Delete/Caption: حذف نوع المحتوى +Type/Delete/Hint: حذف نوع المحتوى +Type/Dropdown/Caption: قائمة أنواع المحتوى +Type/Dropdown/Hint: إظهار قائمة أنواع المحتوى +Type/Placeholder: نوع المحتوى +Type/Prompt: نوع: diff --git a/languages/ar-PS/Exporters.multids b/languages/ar-PS/Exporters.multids new file mode 100644 index 000000000..6301a856c --- /dev/null +++ b/languages/ar-PS/Exporters.multids @@ -0,0 +1,5 @@ +title: $:/language/Exporters/ + +CsvFile: ملف CSV +JsonFile: ملف JSON +TidFile: ملف ".tid" diff --git a/languages/ar-PS/Fields.multids b/languages/ar-PS/Fields.multids new file mode 100644 index 000000000..8712916de --- /dev/null +++ b/languages/ar-PS/Fields.multids @@ -0,0 +1,2 @@ +title: $:/language/Docs/Fields/ + diff --git a/languages/ar-PS/Filters.multids b/languages/ar-PS/Filters.multids new file mode 100644 index 000000000..356e4fa0c --- /dev/null +++ b/languages/ar-PS/Filters.multids @@ -0,0 +1,2 @@ +title: $:/language/Filters/ + diff --git a/languages/ar-PS/GettingStarted.tid b/languages/ar-PS/GettingStarted.tid new file mode 100644 index 000000000..d9277d101 --- /dev/null +++ b/languages/ar-PS/GettingStarted.tid @@ -0,0 +1,17 @@ +title: GettingStarted + +\define lingo-base() $:/language/ControlPanel/Basics/ +مرحبًا بك في تدلي ويكي ومجتمع تدلي ويكي + +قبل البدء في تخزين المعلومات المهمة في تدلي ويكي ، من الضروري التأكد من أنه يمكنك حفظ التغييرات بشكل موثوق. راجع https://tiddlywiki.com/#GettingStarted للحصول على التفاصيل + +قم بإعداد هذا التدلي ويكي !! + +<div class="tc-control-panel"> + +|<$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="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag="textarea" tiddler="$:/DefaultTiddlers"/><br>//<<lingo DefaultTiddlers/BottomHint>>// | +</div> + +See the [[control panel|$:/ControlPanel]] for more options. diff --git a/languages/ar-PS/Import.multids b/languages/ar-PS/Import.multids new file mode 100644 index 000000000..c766b1fa6 --- /dev/null +++ b/languages/ar-PS/Import.multids @@ -0,0 +1,17 @@ +title: $:/language/Import/ + +Imported/Hint: تم إستيراد التدلرز التالية: +Listing/Cancel/Caption: إلغاء +Listing/Hint: هؤلاء التدلرز جاهزون للإستيراد: + +Listing/Import/Caption: إستيراد +Listing/Preview: معاينة: +Listing/Preview/Fields: حقول +Listing/Preview/Text: Text +Listing/Select/Caption: إختيار +Listing/Status/Caption: الحالة +Listing/Title/Caption: العنوان +Upgrader/Plugins/Suppressed/Incompatible: تم حظر مكون إضافي غير متوافق أو قديم +Upgrader/System/Alert: أنت على وشك إدخال تدلر سيستبدال وحدة تدلر أساسية. لا يُنصح بذلك لأنه قد يجعل النظام غير مستقر +Upgrader/System/Suppressed: Blocked system tiddler +Upgrader/System/Warning: وحدة تدلر أساسية diff --git a/languages/ar-PS/Misc.multids b/languages/ar-PS/Misc.multids new file mode 100644 index 000000000..0a129e710 --- /dev/null +++ b/languages/ar-PS/Misc.multids @@ -0,0 +1,78 @@ +title: $:/language/ + +AboveStory/ClassicPlugin/Warning: It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected: +BinaryWarning/Prompt: يحتوي هذا التدلر على بيانات ثنائية + +ClassicWarning/Hint: تمت كتابة هذا التدلر بتنسيق الوكي النصي الخاص بتدلي ويكي الكلاسيكي ، وهو غير متوافق تمامًا مع الإصدار تدلي ويكي 5. راجع https://tiddlywiki.com/static/Upgrading.html لمزيد من التفاصيل. +ClassicWarning/Upgrade/Caption: ترقية +CloseAll/Button: إغلاق الجميع +ColourPicker/Recent: حديث: +ConfirmCancelTiddler: هل ترغب في تجاهل التغييرات التي تم إجراؤها على التدلر "<$text text=<<title>>/>"? +ConfirmDeleteTiddler: هل ترغب في حذف التدلر"<$text text=<<title>>/>"? +ConfirmOverwriteTiddler: هل ترغب في استبدال التدلر "<$text text=<<title>>/>"? +Count: العد +DefaultNewTiddlerTitle: تدلر جديد +Diffs/CountMessage: <<diff-count>> إختلافات +DropMessage: أفلت هنا (أو استخدم مفتاح "Escape" للإلغاء) +Encryption/Cancel: إلغاء +Encryption/ConfirmClearPassword: هل ترغب/ي في مسح كلمة المرور؟ سيؤدي هذا إلى إزالة التشفير المطبق عند حفظ هذا الويكي +Encryption/Password: كلمة مرور +Encryption/PasswordNoMatch: كلمة المرور غير مطابقة +Encryption/PromptSetPassword: قم بتعيين كلمة مرور جديدة لهذا التدلي ويكي + +Encryption/RepeatPassword: كرر/ي كلمة السر +Encryption/SetPassword: ضبط كلمة السر +Encryption/Username: اسم المستخدم +Error/Caption: خطأ +Error/EditConflict: تم تغيير الملف على الخادم +Error/Filter: خطأ في التصفية +Error/FilterSyntax: خطأ في بناء الجملة في تعبير عامل التصفية +Error/IsFilterOperator: خطأ في التصفية: معامل غير معروف لعامل التصفية 'is' + +Error/LoadingPluginLibrary: خطأ في تحميل مكتبة المكونات الإضافية + +Error/NetworkErrorAlert: `<h2>''خطأ في الشبكة''</h2> يبدو أن الاتصال بالخادم قد انقطع. قد يشير هذا إلى وجود مشكلة في اتصال الشبكة. يرجى محاولة استعادة اتصال الشبكة قبل المتابعة. <br> <br> '' ستتم مزامنة أي تغييرات غير محفوظة تلقائيًا عند استعادة الاتصال ''. +Error/WhileSaving: حدث خطأ أثناء الحفظ + +InternalJavaScriptError/Hint: حسنا، هذا أمر محرج. من المستحسن إعادة تشغيل تدلي ويكي عن طريق إنعاش المتصفح الخاص بك +InternalJavaScriptError/Title: خطأ جافا سكربت داخلي + +InvalidFieldName: أحرف غير صحيحة في اسم الحقل "<$text text=<<fieldName>>/>". يمكن أن تحتوي الحقول فقط على الأحرف الانجليزية الصغيرة والأرقام والأحرف السفلية (`_`) والواصلة (` -`) والنقطة (`.`) +LoginToTiddlySpace: تسجيل الدخول إلى تدلي سبيس + +Manager/Controls/FilterByTag/None: (بلا) +Manager/Controls/FilterByTag/Prompt: فلترة حسب الوسم: +Manager/Controls/Order/Prompt: ترتيب عكسي +Manager/Controls/Search/Placeholder: بحث +Manager/Controls/Search/Prompt: بحث: +Manager/Controls/Show/Option/Tags: وسوم +Manager/Controls/Show/Option/Tiddlers: تدلرز +Manager/Controls/Show/Prompt: إعرض: +Manager/Controls/Sort/Prompt: ترتيب حسب: +Manager/Item/Colour: لون +Manager/Item/Fields: حقول +Manager/Item/Icon: أيقونة +Manager/Item/Icon/None: (بلا) +Manager/Item/RawText: نص خام +Manager/Item/Tags: وسوم +Manager/Item/Tools: أدوات +Manager/Item/WikifiedText: Wikified text +No: لا +OfficialPluginLibrary: المكتبة الرسمية للبرامج المساعدة لتدلي ويكي +OfficialPluginLibrary/Hint: المكتبة الرسمية للبرامج المساعدة لتدلي ويكي على موقع tiddlywiki.com. يتم حفظ، متابعة وصيانة البرامج المساعدة والثيمات وحزم اللغات من قبل الفريق الأساسي. + +RecentChanges/DateFormat: DD MMM YYYY +SystemTiddler/Tooltip: هذا تدلر خاص بالنظام + +SystemTiddlers/Include/Prompt: إعرض تدلرز النظام +TagManager/Colour/Heading: لون +TagManager/Count/Heading: إحصاء +TagManager/Icon/Heading: أيقونة +TagManager/Icons/None: لا يوجد + +TagManager/Info/Heading: معلومات +TagManager/Tag/Heading: وسم +Tiddler/DateFormat: DD MMM YYYY at hh12:0mmam +UnsavedChangesWarning: لديك تغييرات غير محفوظة في تدلي ويكي + +Yes: نعم diff --git a/languages/ar-PS/Modals/Download.tid b/languages/ar-PS/Modals/Download.tid new file mode 100644 index 000000000..d213a4ce9 --- /dev/null +++ b/languages/ar-PS/Modals/Download.tid @@ -0,0 +1,13 @@ +title: $:/language/Modals/Download +type: +subtitle: Download changes +footer: <$button message="tm-close-tiddler">Close</$button> +help: https://tiddlywiki.com/static/DownloadingChanges.html + +متصفحك يدعم فقط الحفظ اليدوي. + +لحفظ ويكي المعدل ، انقر بزر الماوس الأيمن على رابط التنزيل أدناه واختر "تنزيل ملف" أو "حفظ ملف" ، ثم اختر المجلد واسم الملف. + +// يمكنك تسريع الأمور بشكل هامشي عن طريق النقر فوق الارتباط بمفتاح التحكم (Windows) أو مفتاح الخيارات / alt (Mac OS X). لن تتم مطالبتك بالمجلد أو اسم الملف ، ولكن من المحتمل أن يعطيه المستعرض اسمًا لا يمكن التعرف عليه - قد تحتاج إلى إعادة تسمية الملف لتضمين ملحق `.html` قبل أن تتمكن من القيام بأي شيء مفيد معه. // + +على الهواتف الذكية التي لا تسمح بتنزيل الملفات ، يمكنك بدلاً من ذلك وضع إشارة مرجعية على الرابط ، ثم مزامنة إشاراتك المرجعية مع كمبيوتر سطح المكتب حيث يمكن حفظ موقع wiki بشكل طبيعي. \ No newline at end of file diff --git a/languages/ar-PS/Modals/SaveInstructions.tid b/languages/ar-PS/Modals/SaveInstructions.tid new file mode 100644 index 000000000..af2b726a1 --- /dev/null +++ b/languages/ar-PS/Modals/SaveInstructions.tid @@ -0,0 +1,22 @@ +title: $:/language/Modals/SaveInstructions +type: +subtitle: Save your work +footer: <$button message="tm-close-tiddler">Close</$button> +help: https://tiddlywiki.com/static/SavingChanges.html + +يجب حفظ التغييرات التي قمت بها على هذا الويكي كملف تدلي ويكي بامتداد HTML . + +!!! متصفحات سطح المكتب + +# أختر/ي "حفظ باسم" من قائمة "ملف" +# اختر/ي اسم الملف وموقعه +# * تتطلب بعض المتصفحات أيضًا تحديد تنسيق حفظ الملف بشكل صريح كـ "صفحة الويب ، HTML فقط" أو ما شابه +# أغلق علامة التبويب هذه + +!!! متصفحات الهواتف الذكية + +# إنشاء بوك مارك لهذه الصفحة +# * إذا قمت بإعداد iCloud أو Google Sync ، فستتم مزامنة الإشارة المرجعية تلقائيًا إلى سطح المكتب حيث يمكنك فتحه وحفظه كما هو موضح أعلاه +# أغلق علامة التبويب هذه + +// إذا فتحت البوك مارك مرة أخرى في متصفح سفاري للموبايل ، فستظهر لك هذه الرسالة مرة أخرى. إذا كنت تريد المضي قدمًا واستخدام الملف ، فما عليك سوى النقر فوق الزر "إغلاق" أدناه // diff --git a/languages/ar-PS/NewJournal.multids b/languages/ar-PS/NewJournal.multids new file mode 100644 index 000000000..4cd86005b --- /dev/null +++ b/languages/ar-PS/NewJournal.multids @@ -0,0 +1,4 @@ +title: $:/config/NewJournal/ + +Tags: +Title: DD MMM YYYY diff --git a/languages/ar-PS/Notifications.multids b/languages/ar-PS/Notifications.multids new file mode 100644 index 000000000..bc22d78fc --- /dev/null +++ b/languages/ar-PS/Notifications.multids @@ -0,0 +1,8 @@ +title: $:/language/Notifications/ + +CopiedToClipboard/Failed: فشل النسخ إلى الكليب-بورد! + +CopiedToClipboard/Succeeded: تم النسخ على الكليب-بورد! +Save/Done: ويكي محفوظ +Save/Starting: البدء في حفظ ويكي + diff --git a/languages/ar-PS/Search.multids b/languages/ar-PS/Search.multids new file mode 100644 index 000000000..a2c68c8c2 --- /dev/null +++ b/languages/ar-PS/Search.multids @@ -0,0 +1,23 @@ +title: $:/language/Search/ + +DefaultResults/Caption: قائمة +Filter/Caption: فلتر +Filter/Hint: البحث عن طريق [[عبارة فلتر |https://tiddlywiki.com/static/Filters.html]] +Matches: //<small><<resultCount>> تطابقات</small>// +Matches/All: جميع التدلرز المتطابقة: +Matches/Title: العناوين المتطابقة: +Search: بحث +Search/TooShort: نص البحث قصير جدًا + +Shadows/Caption: تدلرز خفية +Shadows/Hint: ابحث عن تدلرز الظل + +Shadows/Matches: //<small><<resultCount>> تطابقات</small>// +Standard/Caption: معيار +Standard/Hint: ابحث عن التدلرز المعيارية + +Standard/Matches: //<small><<resultCount>> تطابقات</small>// +System/Caption: نظام +System/Hint: ابحث عن تدلرز النظام + +System/Matches: //<small><<resultCount>> تطابقات</small>// diff --git a/languages/ar-PS/SideBar.multids b/languages/ar-PS/SideBar.multids new file mode 100644 index 000000000..12df188d9 --- /dev/null +++ b/languages/ar-PS/SideBar.multids @@ -0,0 +1,17 @@ +title: $:/language/SideBar/ + +All/Caption: الكل +Contents/Caption: المحتويات +Drafts/Caption: المسودات +Explorer/Caption: مستكشف +Missing/Caption: مفقود +More/Caption: المزيد +Open/Caption: إفتح +Orphans/Caption: أيتام +Recent/Caption: حديث +Shadows/Caption: تدلرز خفية +System/Caption: نظام +Tags/Caption: وسوم +Tags/Untagged/Caption: غير موسومة +Tools/Caption: أدوات +Types/Caption: أنواع diff --git a/languages/ar-PS/SiteSubtitle.tid b/languages/ar-PS/SiteSubtitle.tid new file mode 100644 index 000000000..549b3bd31 --- /dev/null +++ b/languages/ar-PS/SiteSubtitle.tid @@ -0,0 +1,3 @@ +title: $:/SiteSubtitle + +دفتر ملاحظات شخصي غير خطي diff --git a/languages/ar-PS/SiteTitle.tid b/languages/ar-PS/SiteTitle.tid new file mode 100644 index 000000000..f8df86be9 --- /dev/null +++ b/languages/ar-PS/SiteTitle.tid @@ -0,0 +1,3 @@ +title: $:/SiteTitle + +تدلي ويكي الخاص بي \ No newline at end of file diff --git a/languages/ar-PS/ThemeTweaks.multids b/languages/ar-PS/ThemeTweaks.multids new file mode 100644 index 000000000..b9facc8c8 --- /dev/null +++ b/languages/ar-PS/ThemeTweaks.multids @@ -0,0 +1,2 @@ +title: $:/language/ThemeTweaks/ + diff --git a/languages/ar-PS/TiddlerInfo.multids b/languages/ar-PS/TiddlerInfo.multids new file mode 100644 index 000000000..323c99a0a --- /dev/null +++ b/languages/ar-PS/TiddlerInfo.multids @@ -0,0 +1,26 @@ +title: $:/language/TiddlerInfo/ + +Advanced/Caption: متقدم +Advanced/PluginInfo/Empty/Hint: لا شيء +Advanced/PluginInfo/Heading: تفاصيل البرنامج المساعد +Advanced/PluginInfo/Hint: يحتوي هذا البرنامج المساعد على التدلرز الخفية التالية: + +Advanced/ShadowInfo/Heading: حالة الظل +Advanced/ShadowInfo/NotShadow/Hint: التدلر <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> ليس تدلر خفي +Advanced/ShadowInfo/OverriddenShadow/Hint: يتم تجاوزه من قبل تدلر عادي + +Advanced/ShadowInfo/Shadow/Hint: التدلر <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> هو تدلر خفي +Advanced/ShadowInfo/Shadow/Source: يتم تعريفه في البرنامج المساعد + <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link> +Fields/Caption: حقول +List/Caption: قائمة +List/Empty: هذا التدلر ليس لديه قائمة + +Listed/Caption: مدرج في قائمة +Listed/Empty: لم يتم سرد هذا التدلر في قائمة من قبل أي تدلر اخر + +References/Caption: مراجع +References/Empty: لا يوجد تدلرز مرتبطة بهذا +Tagging/Caption: توسيم +Tagging/Empty: لا يوجد تدلر موسوم بهذا التدلر +Tools/Caption: أدوات diff --git a/languages/ar-PS/icon.tid b/languages/ar-PS/icon.tid new file mode 100644 index 000000000..fecb187cd --- /dev/null +++ b/languages/ar-PS/icon.tid @@ -0,0 +1,7 @@ +created: 20200618172251289 +modified: 20200618172321223 +tags: +title: $:/languages/ar-PS/icon +type: image/svg+xml + +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" viewBox="0 0 6 3"><rect fill="#007A3D" width="6" height="3"/><rect fill="#FFF" width="6" height="2"/><rect width="6" height="1"/><path fill="#CE1126" d="M0,0l2,1.5L0,3Z"/></svg> diff --git a/languages/ar-PS/plugin.info b/languages/ar-PS/plugin.info new file mode 100644 index 000000000..55602323e --- /dev/null +++ b/languages/ar-PS/plugin.info @@ -0,0 +1,8 @@ +{ + "title": "$:/languages/ar-PS", + "name": "ar-PS", + "plugin-type": "language", + "description": "Arabic (Palestine)", + "author": "Kamal-Habash", + "core-version": ">=5.1.23" +} \ No newline at end of file From cbf79b8b90d45cfb08b11b05895efcc4ec6f7612 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 28 Aug 2020 17:50:44 +0100 Subject: [PATCH 0790/2376] Add RTL indicator to Arabic (Palestine) translation --- languages/ar-PS/plugin.info | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/languages/ar-PS/plugin.info b/languages/ar-PS/plugin.info index 55602323e..7ffe34e88 100644 --- a/languages/ar-PS/plugin.info +++ b/languages/ar-PS/plugin.info @@ -4,5 +4,6 @@ "plugin-type": "language", "description": "Arabic (Palestine)", "author": "Kamal-Habash", - "core-version": ">=5.1.23" + "core-version": ">=5.1.23", + "text-direction": "rtl" } \ No newline at end of file From 14573d2c2d1629d2efa180b2e777af620dd2b105 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 28 Aug 2020 17:51:17 +0100 Subject: [PATCH 0791/2376] Add Arabic (Palestine) to the "Full Edition" --- editions/full/tiddlywiki.info | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/full/tiddlywiki.info b/editions/full/tiddlywiki.info index fd270c293..0a716f60e 100644 --- a/editions/full/tiddlywiki.info +++ b/editions/full/tiddlywiki.info @@ -30,6 +30,7 @@ "tiddlywiki/xmldom" ], "languages": [ + "ar-PS", "ca-ES", "cs-CZ", "da-DK", From e332bb172848d470fa8c3ca6235a63439a94e96b Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Sat, 29 Aug 2020 02:57:05 -0800 Subject: [PATCH 0792/2376] Fix 'if' condition syntax in Actions workflow (#4835) Strings in expressions need to be in single quotes: https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#literals --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 055007dc7..26721707f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: - run: "./bin/test.sh" build-prerelease: runs-on: ubuntu-latest - if: github.ref == "refs/heads/master" + if: github.ref == 'refs/heads/master' needs: test env: TW5_BUILD_TIDDLYWIKI: "./tiddlywiki.js" @@ -45,7 +45,7 @@ jobs: TRAVIS_BUILD_NUMBER: ${{ github.run_number }} build-tiddlywiki-com: runs-on: ubuntu-latest - if: github.ref == "refs/heads/tiddlywiki-com" + if: github.ref == 'refs/heads/tiddlywiki-com' needs: test env: TW5_BUILD_TIDDLYWIKI: "./node_modules/tiddlywiki/tiddlywiki.js" From ef29d05ea4df75386afbbd689f9cae6d44376254 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Sat, 29 Aug 2020 02:58:34 -0800 Subject: [PATCH 0793/2376] Finish migration to GitHub Actions (#4836) * Fix 'if' condition syntax in Actions workflow Strings in expressions need to be in single quotes: https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#literals * Delete .travis.yml We moved to GitHub Actions * Inline git-related environment variables * Inline the build number variable * Rename TRAVIS_BRANCH to TW5_BUILD_BRANCH Since we don't use Travis anymore * Update developer documentation regardgin which CI service is used * Document the decision about setting env vars in the workflow file --- .github/workflows/ci.yml | 26 ++++++++------ .travis.yml | 35 ------------------- bin/ci-push.sh | 6 ++-- .../dev/tiddlers/Continuous Deployment.tid | 6 ++-- 4 files changed, 21 insertions(+), 52 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 26721707f..676a32c9b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,9 +5,6 @@ on: - master - tiddlywiki-com env: - COMMIT_CONTEXT: "GitHub build" - COMMIT_EMAIL: "actions@github.com" - COMMIT_NAME: "GitHub Actions" NODE_VERSION: "12" jobs: test: @@ -32,17 +29,23 @@ jobs: with: node-version: "${{ env.NODE_VERSION }}" - run: "./bin/ci-pre-build.sh" + # There's another near-duplicate "Set dynamic environment variables" step in + # the `build-tiddlywiki-com` job. + # These _could_ be extracted as a script (or moved into `ci-pre-build.sh`) to do away with the + # duplication, but, the visibility that comes from having these in the workflow file seems + # valuable. Environment variables are global variables and setting them at the top-level + # makes sense. + # Time to reconsider this decision might be when this setup turns out to be mistake-prone. - name: "Set dynamic environment variables" run: | - TRAVIS_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo ::set-env name=TRAVIS_BRANCH::${TRAVIS_BRANCH} + TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') + echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) - echo ::set-env name=TW5_BUILD_DETAILS::Prerelease built from branch \'$TRAVIS_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + echo ::set-env name=TW5_BUILD_DETAILS::Prerelease built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: GH_TOKEN: ${{ secrets.GITHUB_PUSH_TOKEN }} - TRAVIS_BUILD_NUMBER: ${{ github.run_number }} build-tiddlywiki-com: runs-on: ubuntu-latest if: github.ref == 'refs/heads/tiddlywiki-com' @@ -57,14 +60,15 @@ jobs: with: node-version: "${{ env.NODE_VERSION }}" - run: "./bin/ci-pre-build.sh" + # When making a change here, don't forget to see if it also applies to the step + # with the same name in the `build-prerelease` job. - name: "Set dynamic environment variables" run: | - TRAVIS_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo ::set-env name=TRAVIS_BRANCH::${TRAVIS_BRANCH} + TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') + echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) - echo ::set-env name=TW5_BUILD_DETAILS::Built from branch \'$TRAVIS_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + echo ::set-env name=TW5_BUILD_DETAILS::Built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: GH_TOKEN: ${{ secrets.GITHUB_PUSH_TOKEN }} - TRAVIS_BUILD_NUMBER: ${{ github.run_number }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b714cf477..000000000 --- a/.travis.yml +++ /dev/null @@ -1,35 +0,0 @@ -language: node_js -node_js: - - "12" - -stages: - - name: test - - name: build-prerelease - if: branch = "master" AND type = push AND fork = false - - name: build-tiddlywiki-com - if: branch = "tiddlywiki-com" AND type = push AND fork = false - -jobs: - include: - - stage: test - script: ./bin/test.sh - - stage: build-prerelease - script: - - ./bin/ci-pre-build.sh - - export TW5_BUILD_TIDDLYWIKI='./tiddlywiki.js' - - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) - - export TW5_BUILD_DETAILS="Prerelease built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - - export TW5_BUILD_MAIN_EDITION='./editions/prerelease' - - export TW5_BUILD_OUTPUT='./output/prerelease' - - ./bin/build-site.sh || travis_terminate 1 - - ./bin/ci-push.sh || travis_terminate 1 - - stage: build-tiddlywiki-com - script: - - ./bin/ci-pre-build.sh - - export TW5_BUILD_TIDDLYWIKI='./node_modules/tiddlywiki/tiddlywiki.js' - - export TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number) - - export TW5_BUILD_DETAILS="Built from branch '$TRAVIS_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" - - export TW5_BUILD_MAIN_EDITION='./editions/tw5.com' - - export TW5_BUILD_OUTPUT='./output' - - ./bin/build-site.sh || travis_terminate 1 - - ./bin/ci-push.sh || travis_terminate 1 diff --git a/bin/ci-push.sh b/bin/ci-push.sh index 97a06e64e..670d2acdf 100755 --- a/bin/ci-push.sh +++ b/bin/ci-push.sh @@ -5,13 +5,13 @@ cd output || exit 1 -git config --global user.email "${COMMIT_EMAIL:-travis@travis-ci.org}" || exit 1 +git config --global user.email "actions@github.com" || exit 1 -git config --global user.name "${COMMIT_NAME:-Travis CI}" || exit 1 +git config --global user.name "GitHub Actions" || exit 1 git add -A . || exit 1 -git commit --message "${COMMIT_CONTEXT:-Travis build}: $TRAVIS_BUILD_NUMBER of $TRAVIS_BRANCH ($(date +'%F %T %Z'))" || exit 1 +git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))" || exit 1 git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null || exit 1 diff --git a/editions/dev/tiddlers/Continuous Deployment.tid b/editions/dev/tiddlers/Continuous Deployment.tid index f516b1be5..3ea44245f 100644 --- a/editions/dev/tiddlers/Continuous Deployment.tid +++ b/editions/dev/tiddlers/Continuous Deployment.tid @@ -1,8 +1,8 @@ created: 20190115173727727 -modified: 20190115173903645 +modified: 20200828094535533 title: Continuous Deployment type: text/vnd.tiddlywiki -TiddlyWiki 5 uses [[Travis CI|https://travis-ci.org/]] for continuous deployment. It is driven by the `.travis.yml` file in the root of the repo, along with the scripts in the `bin` folder that it invokes. +TiddlyWiki 5 uses [[GitHub Actions|https://docs.github.com/en/actions]] for continuous deployment. It is driven by the workflow file `.github/workflows/ci.yml` in the repo, along with the scripts in the `bin` folder that it invokes. -The build history can be seen at https://travis-ci.org/Jermolene/TiddlyWiki5 +The build history can be seen at https://github.com/Jermolene/TiddlyWiki5/actions From 520244176963f761aba9de69254869a02ece70ee Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Sat, 29 Aug 2020 18:27:58 +0700 Subject: [PATCH 0794/2376] Add suffix and parameter to trim operator (#4811) * Add suffix and parameter to trim operator Fixes #4809 * Unit tests for new trim operator parameters * Mention trim operator in 5.1.23 release notes * Address review comments * Move regex escaping into utils.js trim functions This way the trimPrefix and trimSuffix functions from utils.js are safe to call without regex-escaping their parameters, which should make them easier to use from other parts of the Javascript code. --- core/modules/filters/strings.js | 28 +++++++++++++++-- core/modules/utils/utils.js | 30 +++++++++++++++++++ .../prerelease/tiddlers/Release 5.1.23.tid | 1 + editions/test/tiddlers/tests/test-filters.js | 12 ++++++++ .../examples/trim Operator (Examples).tid | 8 +++++ .../tw5.com/tiddlers/filters/removeprefix.tid | 2 ++ .../tw5.com/tiddlers/filters/removesuffix.tid | 2 ++ .../tiddlers/filters/trim Operator.tid | 7 +++-- 8 files changed, 85 insertions(+), 5 deletions(-) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 947dad2f5..014284b20 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -34,9 +34,31 @@ exports.titlecase = makeStringBinaryOperator( function(a) {return [$tw.utils.toTitleCase(a)];} ); -exports.trim = makeStringBinaryOperator( - function(a) {return [$tw.utils.trim(a)];} -); +exports.trim = function(source,operator,options) { + var result = [], + suffix = operator.suffix || "", + operand = (operator.operand || ""), + fnCalc; + if(suffix === "prefix") { + fnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];} + } else if(suffix === "suffix") { + fnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];} + } else { + if(operand === "") { + fnCalc = function(a) {return [$tw.utils.trim(a)];} + } else { + fnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];} + } + } + source(function(tiddler,title) { + Array.prototype.push.apply(result,fnCalc(title,operand)); + }); + return result; +}; + +// makeStringBinaryOperator( +// function(a) {return [$tw.utils.trim(a)];} +// ); exports.split = makeStringBinaryOperator( function(a,b) {return ("" + a).split(b);} diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index a5fb24697..9018af3a0 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -94,6 +94,36 @@ exports.trim = function(str) { } }; +exports.trimPrefix = function(str,unwanted) { + if(typeof str === "string" && typeof unwanted === "string") { + if(unwanted === "") { + return str.replace(/^\s\s*/, ''); + } else { + // Safely regexp-escape the unwanted text + unwanted = unwanted.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'); + var regex = new RegExp('^(' + unwanted + ')+'); + return str.replace(regex, ''); + } + } else { + return str; + } +}; + +exports.trimSuffix = function(str,unwanted) { + if(typeof str === "string" && typeof unwanted === "string") { + if(unwanted === "") { + return str.replace(/\s\s*$/, ''); + } else { + // Safely regexp-escape the unwanted text + unwanted = unwanted.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'); + var regex = new RegExp('(' + unwanted + ')+$'); + return str.replace(regex, ''); + } + } else { + return str; + } +}; + /* Convert a string to sentence case (ie capitalise first letter) */ diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 36d542fd2..65827f810 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -62,6 +62,7 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4741]] [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4740]] the EditWidget to pass all attributes through to the sub-widget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim off a prefixing or suffixing string from input tiddler titles ! Bug Fixes diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index f9feed6cf..4c2673d2c 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -467,6 +467,18 @@ function runTests(wiki) { // Ensure that join correctly handles empty strings in source expect(wiki.filterTiddlers("[[]] Paul +[join[-]]").join(",")).toBe("-Paul"); expect(wiki.filterTiddlers("[[ John ]] [[Paul ]] [[ George]] Ringo +[trim[]join[-]]").join(",")).toBe("John-Paul-George-Ringo"); + expect(wiki.filterTiddlers("[[ abc ]] [[def ]] [[ ghi]] +[trim[]]").join(",")).toBe("abc,def,ghi"); + expect(wiki.filterTiddlers("[[ abc ]] [[def ]] [[ ghi]] +[trim:prefix[]]").join(",")).toBe("abc ,def ,ghi"); + expect(wiki.filterTiddlers("[[ abc ]] [[def ]] [[ ghi]] +[trim:suffix[]]").join(",")).toBe(" abc,def, ghi"); + expect(wiki.filterTiddlers("[[ abacus ]] [[ baobab ]] +[trim[ab]]").join(",")).toBe(" abacus , baobab "); + expect(wiki.filterTiddlers("[[ abacus ]] [[ baobab ]] +[trim[a]]").join(",")).toBe(" abacus , baobab "); + expect(wiki.filterTiddlers("abacus baobab +[trim[a]]").join(",")).toBe("bacus,baobab"); + expect(wiki.filterTiddlers("abacus baobab +[trim[ab]]").join(",")).toBe("acus,baob"); + expect(wiki.filterTiddlers("abacus baobab +[trim:prefix[ab]]").join(",")).toBe("acus,baobab"); + expect(wiki.filterTiddlers("abacus baobab +[trim:suffix[ab]]").join(",")).toBe("abacus,baob"); + // Trim doesn't hiccup on regexp special characters + expect(wiki.filterTiddlers("[[.*abacus.*]] [[.+baobab.+]] +[trim[.*]]").join(",")).toBe("abacus,.+baobab.+"); + expect(wiki.filterTiddlers("[[.*abacus.*]] [[.+baobab.+]] +[trim[.+]]").join(",")).toBe(".*abacus.*,baobab"); }); it("should handle the mathematics operators", function() { diff --git a/editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid index 18a1562bd..e47640047 100644 --- a/editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/trim Operator (Examples).tid @@ -5,3 +5,11 @@ title: trim Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[[ a b ]trim[]addprefix[-]addsuffix[-]]">> + +<<.operator-example 2 "[[ abc ]] [[def ]] [[ ghi]] +[trim[]addprefix[-]addsuffix[-]]">> +<<.operator-example 3 "[[ abc ]] [[def ]] [[ ghi]] +[trim:prefix[]addprefix[-]addsuffix[-]]">> +<<.operator-example 4 "[[ abc ]] [[def ]] [[ ghi]] +[trim:suffix[]addprefix[-]addsuffix[-]]">> + +<<.operator-example 5 "abacus baobab +[trim[ab]]">> +<<.operator-example 6 "abacus baobab +[trim:prefix[ab]]">> +<<.operator-example 7 "abacus baobab +[trim:suffix[ab]]">> diff --git a/editions/tw5.com/tiddlers/filters/removeprefix.tid b/editions/tw5.com/tiddlers/filters/removeprefix.tid index 10f8e87eb..262207268 100644 --- a/editions/tw5.com/tiddlers/filters/removeprefix.tid +++ b/editions/tw5.com/tiddlers/filters/removeprefix.tid @@ -12,4 +12,6 @@ op-output: those input titles that start with <<.place S>>, but with those chara <<.s-matching-is-case-sensitive>> +<<.tip " This filters out input titles that do not start with S. For removing S without filtering out input titles that don't start with S, see [[trim|trim Operator]].">> + <<.operator-examples "removeprefix">> diff --git a/editions/tw5.com/tiddlers/filters/removesuffix.tid b/editions/tw5.com/tiddlers/filters/removesuffix.tid index b1ecd495c..0c14a1947 100644 --- a/editions/tw5.com/tiddlers/filters/removesuffix.tid +++ b/editions/tw5.com/tiddlers/filters/removesuffix.tid @@ -12,4 +12,6 @@ op-output: those input titles that end with <<.place S>>, but with those charact <<.s-matching-is-case-sensitive>> +<<.tip " This filters out input titles that do not end with S. For removing S without filtering out input titles that don't end with S, see [[trim|trim Operator]].">> + <<.operator-examples "removesuffix">> diff --git a/editions/tw5.com/tiddlers/filters/trim Operator.tid b/editions/tw5.com/tiddlers/filters/trim Operator.tid index e791c2f87..199c8cd7f 100644 --- a/editions/tw5.com/tiddlers/filters/trim Operator.tid +++ b/editions/tw5.com/tiddlers/filters/trim Operator.tid @@ -1,13 +1,16 @@ caption: trim created: 20190613153740241 modified: 20190613153820282 +op-purpose: returns each item in the list with whitespace, or a given character string, trimmed from the start and/or end op-input: a [[selection of titles|Title Selection]] -op-output: the input titles with whitespace trimmed from the start and end -op-purpose: returns each item in the list with whitespace trimmed from the start and end +op-parameter: <<.from-version "5.1.23">> a string of characters +op-parameter-name: S +op-output: the input titles with <<.place S>>, or whitespace if <<.place S>> is not specified, trimmed from the start and/or end tags: [[Filter Operators]] title: trim Operator type: text/vnd.tiddlywiki <<.from-version "5.1.20">> +<<.from-version "5.1.23">>The <<.op trim>> filter allows a parameter specifying a string to trim. <<.operator-examples "trim">> From a78570c99aab2d0f34fd1a2a628608e22d19bfdb Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 30 Aug 2020 18:27:25 +0100 Subject: [PATCH 0795/2376] Minor change for testing GitHub Actions See https://github.com/Jermolene/TiddlyWiki5/issues/4834#issuecomment-683447272 --- editions/prerelease/tiddlers/Release 5.1.23.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 65827f810..a83d89b23 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20200713174339234 -modified: 20200713174339234 +created: 20200713174339235 +modified: 20200713174339235 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki From 422eb43e50bf659099c9e018d5fa3b2803379725 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 1 Sep 2020 17:08:53 +0100 Subject: [PATCH 0796/2376] CI: Update name of token --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 676a32c9b..9ac889fe9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,7 @@ jobs: - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: - GH_TOKEN: ${{ secrets.GITHUB_PUSH_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }} build-tiddlywiki-com: runs-on: ubuntu-latest if: github.ref == 'refs/heads/tiddlywiki-com' @@ -71,4 +71,4 @@ jobs: - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: - GH_TOKEN: ${{ secrets.GITHUB_PUSH_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }} From c60402b06d62124cc1ac852be6092a9fd339b2b9 Mon Sep 17 00:00:00 2001 From: Devin Weaver <suki@tritarget.org> Date: Tue, 8 Sep 2020 06:34:35 -0400 Subject: [PATCH 0797/2376] Add Reveal.js plugin entry to Resources (#4842) --- .../examples/Reveal.js by Devin Weaver.tid | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/examples/Reveal.js by Devin Weaver.tid diff --git a/editions/tw5.com/tiddlers/community/examples/Reveal.js by Devin Weaver.tid b/editions/tw5.com/tiddlers/community/examples/Reveal.js by Devin Weaver.tid new file mode 100644 index 000000000..bdca5af6f --- /dev/null +++ b/editions/tw5.com/tiddlers/community/examples/Reveal.js by Devin Weaver.tid @@ -0,0 +1,20 @@ +created: 20200907161522189 +modified: 20200907162234327 +tags: Resources +title: "Reveal.js" by Devin Weaver +type: text/vnd.tiddlywiki +url: https://sukima.github.io/tiddlywiki-reveal-js/ + +Embed [[Reveal.js|https://revealjs.com]] presentations inside your [[TiddlyWiki]]. + +{{!!url}} + +<<< +reveal.js enables you to create beautiful interactive slide decks using HTML. + +With the power of TiddlyWiki and Reveal.js one can… + +* …make an interactive tiddler with fancy animations +* …Make it go full screen for professional keynote +* …Distribute the slideshow with examples and additional resources in one HTML file +<<< From 68b455565baec267af76d2a1d198c45e85f2fa77 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 8 Sep 2020 12:55:07 +0100 Subject: [PATCH 0798/2376] Update workflow file --- .github/workflows/ci.yml | 74 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..9ac889fe9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,74 @@ +on: + pull_request: + push: + branches: + - master + - tiddlywiki-com +env: + NODE_VERSION: "12" +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: "${{ env.NODE_VERSION }}" + - run: "./bin/test.sh" + build-prerelease: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/master' + needs: test + env: + TW5_BUILD_TIDDLYWIKI: "./tiddlywiki.js" + TW5_BUILD_MAIN_EDITION: "./editions/prerelease" + TW5_BUILD_OUTPUT: "./output/prerelease" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: "${{ env.NODE_VERSION }}" + - run: "./bin/ci-pre-build.sh" + # There's another near-duplicate "Set dynamic environment variables" step in + # the `build-tiddlywiki-com` job. + # These _could_ be extracted as a script (or moved into `ci-pre-build.sh`) to do away with the + # duplication, but, the visibility that comes from having these in the workflow file seems + # valuable. Environment variables are global variables and setting them at the top-level + # makes sense. + # Time to reconsider this decision might be when this setup turns out to be mistake-prone. + - name: "Set dynamic environment variables" + run: | + TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') + echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} + echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) + echo ::set-env name=TW5_BUILD_DETAILS::Prerelease built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + - run: "./bin/build-site.sh" + - run: "./bin/ci-push.sh" + env: + GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }} + build-tiddlywiki-com: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/tiddlywiki-com' + needs: test + env: + TW5_BUILD_TIDDLYWIKI: "./node_modules/tiddlywiki/tiddlywiki.js" + TW5_BUILD_MAIN_EDITION: "./editions/tw5.com" + TW5_BUILD_OUTPUT: "./output" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: "${{ env.NODE_VERSION }}" + - run: "./bin/ci-pre-build.sh" + # When making a change here, don't forget to see if it also applies to the step + # with the same name in the `build-prerelease` job. + - name: "Set dynamic environment variables" + run: | + TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') + echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} + echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) + echo ::set-env name=TW5_BUILD_DETAILS::Built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + - run: "./bin/build-site.sh" + - run: "./bin/ci-push.sh" + env: + GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }} From 87dc67d0cd55454ff65a90ffa8839b4caef6e3b5 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 8 Sep 2020 12:59:37 +0100 Subject: [PATCH 0799/2376] Update CI scripts --- bin/ci-pre-build.sh | 10 ++++++++++ bin/ci-push.sh | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100755 bin/ci-pre-build.sh create mode 100755 bin/ci-push.sh diff --git a/bin/ci-pre-build.sh b/bin/ci-pre-build.sh new file mode 100755 index 000000000..6f4b0ca78 --- /dev/null +++ b/bin/ci-pre-build.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Install latest current release from npm +# (we need to force because otherwise npm will refuse to install a module of the same name) + +npm --force install tiddlywiki || exit 1 + +# Pull existing GitHub pages content + +git clone --depth=1 --branch=master "https://github.com/Jermolene/jermolene.github.io.git" output diff --git a/bin/ci-push.sh b/bin/ci-push.sh new file mode 100755 index 000000000..670d2acdf --- /dev/null +++ b/bin/ci-push.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Push output back to GitHub + + +cd output || exit 1 + +git config --global user.email "actions@github.com" || exit 1 + +git config --global user.name "GitHub Actions" || exit 1 + +git add -A . || exit 1 + +git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))" || exit 1 + +git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null || exit 1 + +git push deploy master &>/dev/null || exit 1 + +cd .. || exit 1 From af82a95a299dfb216577006af0ca96dda0e991b0 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 14 Sep 2020 11:34:38 +0100 Subject: [PATCH 0800/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.23.tid | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index a83d89b23..50e22c3a2 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20200713174339235 -modified: 20200713174339235 +created: 20200912173852160 +modified: 20200912173852160 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -41,14 +41,17 @@ type: text/vnd.tiddlywiki ! Usability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c]] "Solarized Dark" palette * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] Vanilla theme to use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration * [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox palette readability of toolbar buttons * [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition - +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4791]] a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls ! Hackability Improvements +* [[Adedd|https://github.com/Jermolene/TiddlyWiki5/pull/4777]] new Hyperdrive saver for use with Beaker Browser v1.0 * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b]] new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter * [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements @@ -63,6 +66,7 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4740]] the EditWidget to pass all attributes through to the sub-widget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim off a prefixing or suffixing string from input tiddler titles +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653]] LinkCatcherWidget to pass keyboard modifier status to actions ! Bug Fixes @@ -84,19 +88,26 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4687]] edit template field dropdown positioning * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4704]] (with [[addendum|https://github.com/Jermolene/TiddlyWiki5/pull/4705]]) syntax error in ScrollableWidget * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4711]] extraneous system tiddlers created during import process +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4780]] problem with headers not being treated case insensitively +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4776]] EntityWidget not refreshing correctly +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4774]] [[Markdown Plugin]] to honour alignment directives ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: +* [[@adithya-badidey|https://github.com/adithya-badidey]] * [[@Arlen22|https://github.com/Arlen22]] * [[@bimlas|https://github.com/bimlas]] * [[@BramChen|https://github.com/BramChen]] * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@danielo515|https://github.com/danielo515]] +* [[@ento|https://github.com/ento]] +* [[@favadi|https://github.com/favadi]] * [[@flibbles|https://github.com/flibbles]] * [[@ibnishak|https://github.com/ibnishak]] * [[@idotobi|https://github.com/idotobi]] +* [[@jjduhamel|https://github.com/jjduhamel]] * [[@Marxsal|https://github.com/Marxsal]] * [[@mocsa|https://github.com/mocsa]] * [[@NicolasPeton|https://github.com/NicolasPeton]] From 31c9c23a18de720499f7af144ac9b1f00f2b26f3 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 14 Sep 2020 19:14:10 +0700 Subject: [PATCH 0801/2376] Gitea API wants tokens, not HTTP basic auth (#4854) --- core/modules/savers/gitea.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/savers/gitea.js b/core/modules/savers/gitea.js index d88800d8c..2c0242566 100644 --- a/core/modules/savers/gitea.js +++ b/core/modules/savers/gitea.js @@ -31,7 +31,7 @@ GiteaSaver.prototype.save = function(text,method,callback) { headers = { "Accept": "application/json", "Content-Type": "application/json;charset=UTF-8", - "Authorization": "Basic " + window.btoa(username + ":" + password) + "Authorization": "token " + password }; // Bail if we don't have everything we need if(!username || !password || !repo || !filename) { From 2374fb5104ad962026447c9ac34963d9679dae38 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 14 Sep 2020 13:16:10 +0100 Subject: [PATCH 0802/2376] More release note updates --- editions/prerelease/tiddlers/Release 5.1.23.tid | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 50e22c3a2..4f7184a0f 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -32,12 +32,13 @@ type: text/vnd.tiddlywiki ! Translation Improvements +* New Arabic (Palestine) translation * Catalan * Chinese ! Performance Improvements -* +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4659]] templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging ! Usability Improvements @@ -67,6 +68,8 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim off a prefixing or suffixing string from input tiddler titles * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653]] LinkCatcherWidget to pass keyboard modifier status to actions +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4724]] original event to `tm-navigate` event +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers ! Bug Fixes @@ -89,8 +92,13 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4704]] (with [[addendum|https://github.com/Jermolene/TiddlyWiki5/pull/4705]]) syntax error in ScrollableWidget * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4711]] extraneous system tiddlers created during import process * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4780]] problem with headers not being treated case insensitively +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/a2796d89ab3dbf4a15b63b0f4623387fdc6acd5b]] problem with `Content-Type` HTTP header sent as `Content-type` * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4776]] EntityWidget not refreshing correctly * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4774]] [[Markdown Plugin]] to honour alignment directives +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/f74c49f393da3213abadaa52dd09940d708ea635]] syncing issues with external JS template +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4813]] incorrect base64 encoding of astral plane Unicode text +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4770]] server error when saving a new tiddler created by following a tiddler link +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4751]] a `plugin-priority` field to the TiddlyWeb plugin so that language plugins can override its language strings ! Contributors @@ -107,11 +115,14 @@ type: text/vnd.tiddlywiki * [[@flibbles|https://github.com/flibbles]] * [[@ibnishak|https://github.com/ibnishak]] * [[@idotobi|https://github.com/idotobi]] +* [[@jdangerx|https://github.com/jdangerx]] * [[@jjduhamel|https://github.com/jjduhamel]] +* [[@Kamal-Habash|https://github.com/Kamal-Habash]] * [[@Marxsal|https://github.com/Marxsal]] * [[@mocsa|https://github.com/mocsa]] * [[@NicolasPeton|https://github.com/NicolasPeton]] * [[@passuf|https://github.com/passuf]] * [[@pmario|https://github.com/pmario]] +* [[@rmunn|https://github.com/rmunn]] * [[@saqimtias|https://github.com/saqimtias]] * [[@twMat|https://github.com/twMat]] From 0338f0fee23d176a94de9009492d2e43a916fbfa Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 23 Sep 2020 17:32:38 +0100 Subject: [PATCH 0803/2376] AWS Plugin: Add aws-encodeuricomponent filter that also encodes single quotes Because AWS S3 doesn't allow single quotes in filenames --- plugins/tiddlywiki/aws/docs/help.tid | 4 +-- plugins/tiddlywiki/aws/docs/readme.tid | 1 + plugins/tiddlywiki/aws/modules/encodings.js | 27 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 plugins/tiddlywiki/aws/modules/encodings.js diff --git a/plugins/tiddlywiki/aws/docs/help.tid b/plugins/tiddlywiki/aws/docs/help.tid index dc07f24f3..159f9521a 100644 --- a/plugins/tiddlywiki/aws/docs/help.tid +++ b/plugins/tiddlywiki/aws/docs/help.tid @@ -59,7 +59,7 @@ Save raw tiddlers matching a filter to an S3 bucket. * ''filter'': filter identifying tiddlers to render * ''region'': AWS region * ''bucket'': name of the bucket to save the files -* ''filenamefilter'': filter for converting tiddler titles to filepaths (eg `[encodeuricomponent[]addprefix[files/]addsuffix[.html]]`) +* ''filenamefilter'': filter for converting tiddler titles to filepaths (eg `[aws-encodeuricomponent[]addprefix[files/]addsuffix[.html]]`) * ''savetypefilter'': optional; a filter that is passed the title of the tiddler being saved and should yield the MIME type for the saved file (defaults to a filter that yields the value of the ''type'' field) ! "s3-rendertiddler" subcommand @@ -91,6 +91,6 @@ Save the results of rendering tiddlers identified by a filter to files in an S3 * ''template'': template for rendering each tiddler * ''region'': AWS region * ''bucket'': name of the bucket to save the rendered file -* ''filenamefilter'': filter for converting tiddler titles to filepaths (eg `[encodeuricomponent[]addprefix[files/]addsuffix[.html]]`) +* ''filenamefilter'': filter for converting tiddler titles to filepaths (eg `[aws-encodeuricomponent[]addprefix[files/]addsuffix[.html]]`) * ''type'': optional render type (defaults to "text/html") * ''savetypefilter'': optional; a filter that is passed the title of the tiddler being rendered and should yield the MIME type for the saved file (defaults to the value of the ''type'' field via `[is[tiddler]get[type]]`) diff --git a/plugins/tiddlywiki/aws/docs/readme.tid b/plugins/tiddlywiki/aws/docs/readme.tid index 3677cbb71..402771661 100644 --- a/plugins/tiddlywiki/aws/docs/readme.tid +++ b/plugins/tiddlywiki/aws/docs/readme.tid @@ -4,3 +4,4 @@ This plugin provides several tools for working with Amazon Web Services: * Templates for saving a TiddlyWiki as a single JavaScript file in a ZIP file that can be executed as an AWS Lambda function. In this form, TiddlyWiki is a self contained single file containing both code and data, just like the standalone HTML file configuration * Commands that can be used to interact with AWS services, under both the Node.js and Lambda configurations of TiddlyWiki +* A new "aws-encodeuricomponent" filter that acts like the core "encodeuricomponent" filter except it additionally encodes the single quote character \ No newline at end of file diff --git a/plugins/tiddlywiki/aws/modules/encodings.js b/plugins/tiddlywiki/aws/modules/encodings.js new file mode 100644 index 000000000..f67fded27 --- /dev/null +++ b/plugins/tiddlywiki/aws/modules/encodings.js @@ -0,0 +1,27 @@ +/*\ +title: $:/plugins/tiddlywiki/aws/encodings.js +type: application/javascript +module-type: filteroperator + +Filter operator for applying encodeuricomponent() to each item, with the addition of converting single quotes to %27, as required by AWS + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter functions +*/ + +exports["aws-encodeuricomponent"] = function(source,operator,options) { + var results = []; + source(function(tiddler,title) { + results.push(encodeURIComponent(title).replace(/'/g,"%27")); + }); + return results; +}; + +})(); From f7fe47914e19ba7198b7768ca832ee03c289a2bc Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 23 Sep 2020 17:33:00 +0100 Subject: [PATCH 0804/2376] Dynaview: Fix transclude-when-visible macro --- plugins/tiddlywiki/dynaview/macros.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/tiddlywiki/dynaview/macros.tid b/plugins/tiddlywiki/dynaview/macros.tid index cabe3aa52..89150dc8e 100644 --- a/plugins/tiddlywiki/dynaview/macros.tid +++ b/plugins/tiddlywiki/dynaview/macros.tid @@ -2,13 +2,13 @@ title: $:/plugins/tiddlywiki/dynaview/macros tags: $:/tags/Macro \define transclude-when-visible(tiddler,mode:"block",state,minHeight:"1em",loadingText:"…") -<$reveal state=<<__state__>> type="match" text="visible" tag="div"> -<div class="tc-dynaview-set-tiddler-when-visible" data-dynaview-set-tiddler=<<__state__>> data-dynaview-set-value="visible"> +<$reveal state=<<__state__>> type="nomatch" text="0" tag="div"> +<div class="tc-dynaview-track-tiddler-when-visible" data-dynaview-track-tiddler=<<__state__>> data-dynaview-set-value="visible"> <$transclude tiddler=<<__tiddler__>> mode=<<__mode__>>/> </div> </$reveal> -<$reveal state=<<__state__>> type="nomatch" text="visible" tag="div"> -<div class="tc-dynaview-set-tiddler-when-visible" style="min-height: $minHeight$;" data-dynaview-set-tiddler=<<__state__>> data-dynaview-set-value="visible"> +<$reveal state=<<__state__>> type="match" text="0" tag="div"> +<div class="tc-dynaview-track-tiddler-when-visible" style="min-height: $minHeight$;" data-dynaview-track-tiddler=<<__state__>> data-dynaview-set-value="visible"> $loadingText$ </div> </$reveal> From bdaf3a45025eb9ae2c30cdb521c793c14da91f09 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 24 Sep 2020 19:28:22 +0200 Subject: [PATCH 0805/2376] Change description for Filesystem and TiddlyWeb plugins (#4865) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * Improve the plugin description field to make the dataflow more obvious --- plugins/tiddlywiki/filesystem/plugin.info | 2 +- plugins/tiddlywiki/tiddlyweb/plugin.info | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/filesystem/plugin.info b/plugins/tiddlywiki/filesystem/plugin.info index 17cfe96c9..ffa8bd754 100644 --- a/plugins/tiddlywiki/filesystem/plugin.info +++ b/plugins/tiddlywiki/filesystem/plugin.info @@ -1,6 +1,6 @@ { "title": "$:/plugins/tiddlywiki/filesystem", "name": "Filesystem", - "description": "Synchronise changes to the local filesystem", + "description": "Synchronize changes from the node.js server to the local filesystem", "list": "readme" } diff --git a/plugins/tiddlywiki/tiddlyweb/plugin.info b/plugins/tiddlywiki/tiddlyweb/plugin.info index 987244daf..8dd0266ec 100644 --- a/plugins/tiddlywiki/tiddlyweb/plugin.info +++ b/plugins/tiddlywiki/tiddlyweb/plugin.info @@ -1,7 +1,7 @@ { "title": "$:/plugins/tiddlywiki/tiddlyweb", "name": "TiddlyWeb", - "description": "Sync changes to TW5 server or TiddlyWeb server", + "description": "Sync changes from the browser to TW5 (node.js) or TiddlyWeb server", "list": "readme", "plugin-priority": 10 } From 72c07a3f81233384623ed6293d7f93bdb3104db0 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 24 Sep 2020 19:35:10 +0200 Subject: [PATCH 0806/2376] Format filter to create formatted date strings (#4785) * asdate filter to create formatted date strings * Added format filter operator --- core/language/en-GB/Misc.multids | 1 + core/modules/filters/format.js | 46 +++++++++++++++++++++ core/modules/filters/format/date.js | 26 ++++++++++++ core/modules/filters/format/relativedate.js | 26 ++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 core/modules/filters/format.js create mode 100644 core/modules/filters/format/date.js create mode 100644 core/modules/filters/format/relativedate.js diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 62d41adfa..8fb500364 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -27,6 +27,7 @@ Error/EditConflict: File changed on server Error/Filter: Filter error Error/FilterSyntax: Syntax error in filter expression Error/IsFilterOperator: Filter Error: Unknown operand for the 'is' filter operator +Error/FormatFilterOperator: Filter Error: Unknown suffix for the 'format' filter operator Error/LoadingPluginLibrary: Error loading plugin library Error/NetworkErrorAlert: `<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.` Error/RecursiveTransclusion: Recursive transclusion error in transclude widget diff --git a/core/modules/filters/format.js b/core/modules/filters/format.js new file mode 100644 index 000000000..2fc786d88 --- /dev/null +++ b/core/modules/filters/format.js @@ -0,0 +1,46 @@ +/*\ +title: $:/core/modules/filters/format.js +type: application/javascript +module-type: filteroperator +Filter operator for formatting strings +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var formatFilterOperators; + +function getFormatFilterOperators() { + if(!formatFilterOperators) { + formatFilterOperators = {}; + $tw.modules.applyMethods("formatfilteroperator",formatFilterOperators); + } + return formatFilterOperators; +} + +/* +Export our filter function +*/ +exports.format = function(source,operator,options) { + // Dispatch to the correct formatfilteroperator + var formatFilterOperators = getFormatFilterOperators(); + if(operator.suffix) { + var formatFilterOperator = formatFilterOperators[operator.suffix]; + if(formatFilterOperator) { + return formatFilterOperator(source,operator.operand,options); + } else { + return [$tw.language.getString("Error/FormatFilterOperator")]; + } + } else { + // Return all unchanged if the suffix is missing + var results = []; + source(function(tiddler,title) { + results.push(title); + }); + return results; + } +}; + +})(); \ No newline at end of file diff --git a/core/modules/filters/format/date.js b/core/modules/filters/format/date.js new file mode 100644 index 000000000..1b29c5bfb --- /dev/null +++ b/core/modules/filters/format/date.js @@ -0,0 +1,26 @@ +/*\ +title: $:/core/modules/filters/format/date.js +type: application/javascript +module-type: formatfilteroperator +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.date = function(source,operand,options) { + var results = []; + source(function(tiddler,title) { + var value = $tw.utils.parseDate(title); + if(value && $tw.utils.isDate(value) && value.toString() !== "Invalid Date") { + results.push($tw.utils.formatDateString(value,operand || "YYYY MM DD 0hh:0mm")); + } + }); + return results; +}; + +})(); \ No newline at end of file diff --git a/core/modules/filters/format/relativedate.js b/core/modules/filters/format/relativedate.js new file mode 100644 index 000000000..262aeaaf2 --- /dev/null +++ b/core/modules/filters/format/relativedate.js @@ -0,0 +1,26 @@ +/*\ +title: $:/core/modules/filters/format/relativedate.js +type: application/javascript +module-type: formatfilteroperator +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.relativedate = function(source,operand,options) { + var results = []; + source(function(tiddler,title) { + var value = $tw.utils.parseDate(title); + if(value && $tw.utils.isDate(value) && value.toString() !== "Invalid Date") { + results.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description); + } + }); + return results; +}; + +})(); \ No newline at end of file From d5cf4112fa682efa5b621cf164bd139fc354da36 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Fri, 25 Sep 2020 00:37:51 +0700 Subject: [PATCH 0807/2376] Joining an empty list should return an empty list (#4853) --- core/modules/filters/strings.js | 3 +++ editions/test/tiddlers/tests/test-filters.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 014284b20..625acd9a7 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -90,6 +90,9 @@ function makeStringReducingOperator(fnCalc,initialValue) { source(function(tiddler,title) { result.push(title); }); + if(result.length === 0) { + return []; + } return [result.reduce(function(accumulator,currentValue) { return fnCalc(accumulator,currentValue,operator.operand || ""); },initialValue) || ""]; diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 4c2673d2c..84e17ef83 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -463,7 +463,7 @@ function runTests(wiki) { expect(wiki.filterTiddlers("John Paul George Ringo +[split[e]]").join(",")).toBe("John,Paul,G,org,,Ringo"); expect(wiki.filterTiddlers("John Paul George Ringo +[join[ ]split[e]join[ee]split[ ]]").join(",")).toBe("John,Paul,Geeorgee,Ringo"); // Ensure that join doesn't return null if passed empty list - expect(wiki.filterTiddlers("Test +[butlast[]join[ ]]")).toEqual([""]); + expect(wiki.filterTiddlers("Test +[butlast[]join[ ]]")).toEqual([]); // Ensure that join correctly handles empty strings in source expect(wiki.filterTiddlers("[[]] Paul +[join[-]]").join(",")).toBe("-Paul"); expect(wiki.filterTiddlers("[[ John ]] [[Paul ]] [[ George]] Ringo +[trim[]join[-]]").join(",")).toBe("John-Paul-George-Ringo"); From 773dcce71339a0ae5777e748d5c7efaec3c74e3b Mon Sep 17 00:00:00 2001 From: Florian Kohrt <fkohrt@anche.no> Date: Thu, 24 Sep 2020 20:08:23 +0200 Subject: [PATCH 0808/2376] Signing the CLA (#4845) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index b6446aee2..60618fff2 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -407,3 +407,5 @@ Dazhong Xia, @jdangerx, 2020/06/23 Diep Pham, @favadi, 2020/07/30 Kamal Habash, @Kamal-Habash, 2020/08/28 + +Florian Kohrt, @fkohrt, 2020/09/10 From 4cd6a24431d55d29efe45f6e4646258b68e7b610 Mon Sep 17 00:00:00 2001 From: Florian Kohrt <fkohrt@anche.no> Date: Thu, 24 Sep 2020 20:09:06 +0200 Subject: [PATCH 0809/2376] Mention <tiddler-filter> parameter of savelibrarytiddlers command (#4857) --- core/modules/commands/savelibrarytiddlers.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/modules/commands/savelibrarytiddlers.js b/core/modules/commands/savelibrarytiddlers.js index a49a3a190..a15bd807c 100644 --- a/core/modules/commands/savelibrarytiddlers.js +++ b/core/modules/commands/savelibrarytiddlers.js @@ -5,10 +5,12 @@ module-type: command Command to save the subtiddlers of a bundle tiddler as a series of JSON files ---savelibrarytiddlers <tiddler> <pathname> <skinnylisting> +--savelibrarytiddlers <tiddler> <tiddler-filter> <pathname> <skinnylisting> The tiddler identifies the bundle tiddler that contains the subtiddlers. +The tiddler filter specifies the plugins to be included. + The pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler. The skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed. From 405c618b6bb0470881f48c3e69d49589d3f04da9 Mon Sep 17 00:00:00 2001 From: Gerald <gera2ld@live.com> Date: Fri, 25 Sep 2020 20:07:08 +0800 Subject: [PATCH 0810/2376] Signing the CLA (#4867) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 60618fff2..abddae206 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -409,3 +409,5 @@ Diep Pham, @favadi, 2020/07/30 Kamal Habash, @Kamal-Habash, 2020/08/28 Florian Kohrt, @fkohrt, 2020/09/10 + +Gerald Liu, @gera2ld, 2020/09/25 From 5bf810408ae341675dfed3d91717055b117ea888 Mon Sep 17 00:00:00 2001 From: Gerald <gera2ld@live.com> Date: Fri, 25 Sep 2020 20:07:36 +0800 Subject: [PATCH 0811/2376] Fix: add tc-tiddlylink-external to markdown links (#4862) --- plugins/tiddlywiki/markdown/wrapper.js | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/tiddlywiki/markdown/wrapper.js b/plugins/tiddlywiki/markdown/wrapper.js index 47d098cea..803f1a7ca 100755 --- a/plugins/tiddlywiki/markdown/wrapper.js +++ b/plugins/tiddlywiki/markdown/wrapper.js @@ -118,6 +118,7 @@ function convertNodes(remarkableTree, isStartOfInline) { if (currentNode.href[0] !== "#") { // External link var attributes = { + class: { type: "string", value: "tc-tiddlylink-external" }, href: { type: "string", value: currentNode.href } }; if (pluginOpts.linkNewWindow) { From 543f9107b6a9de5fe13542fa30d9a4483d8b3eb8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 25 Sep 2020 14:06:00 +0100 Subject: [PATCH 0812/2376] Don't override browser selection colours by default Reverts some of #4590 --- core/palettes/Vanilla.tid | 2 ++ themes/tiddlywiki/vanilla/base.tid | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/palettes/Vanilla.tid b/core/palettes/Vanilla.tid index 3590cc126..399bf1ac8 100644 --- a/core/palettes/Vanilla.tid +++ b/core/palettes/Vanilla.tid @@ -57,6 +57,8 @@ page-background: #f4f4f4 pre-background: #f5f5f5 pre-border: #cccccc primary: #5778d8 +selection-background: +selection-foreground: select-tag-background: select-tag-foreground: sidebar-button-foreground: <<colour foreground>> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index e8acda38c..c8345708f 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -232,13 +232,13 @@ kbd { } ::selection { - background-color: <<colour primary>>; - color: <<colour page-background>>; + background-color: <<colour selection-background>>; + color: <<colour selection-foreground>>; } ::-moz-selection { - background-color: <<colour primary>>; - color: <<colour page-background>>; + background-color: <<colour selection-background>>; + color: <<colour selection-foreground>>; } /* From ae13a0fee118c50169b7835c950df1dade33788f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 28 Sep 2020 11:30:28 +0100 Subject: [PATCH 0813/2376] Extend Macro Call Widget to support outputting raw text --- core/modules/widgets/macrocall.js | 2 ++ .../tiddlers/widgets/MacroCallWidget.tid | 29 ++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/core/modules/widgets/macrocall.js b/core/modules/widgets/macrocall.js index 23522629b..2f527cc96 100644 --- a/core/modules/widgets/macrocall.js +++ b/core/modules/widgets/macrocall.js @@ -73,6 +73,8 @@ MacroCallWidget.prototype.execute = function() { attributes: attributes, children: parseTreeNodes }]; + } else if(this.renderOutput === "text/raw") { + parseTreeNodes = [{type: "text", text: text}]; } else { // Otherwise, we'll render the text var plainText = this.wiki.renderText("text/plain",this.parseType,text,{parentWidget: this}); diff --git a/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid b/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid index 35df8e059..5a993564f 100644 --- a/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid @@ -1,23 +1,38 @@ -title: MacroCallWidget -created: 201310241419 -modified: 201310300837 -tags: Widgets caption: macrocall +created: 20131024141900000 +modified: 20200928102843275 +tags: Widgets +title: MacroCallWidget +type: text/vnd.tiddlywiki ! Introduction -The macro call widget provides an alternative syntax for invoking macros. The advantage of the widget form is that it allows macro parameters to be specified as widget attributes, thus allowing indirection and macro values to be set. +The macro call widget provides a more flexible alternative syntax for invoking macros compared to the usual `<<macroname>>` syntax documented in [[Macros in WikiText]]. -For example, a macro called `italicise` that takes a single parameter called `text` can be invoked in any of these ways: +For example, a macro called `italicise` that takes a single parameter called `text` would usually be invoked like this: ``` <<italicise "Text to be made into italics">> <<italicise text:"Text to be made into italics">> +``` + +The same macro can be invoked using the macro call widget like this: + +``` <$macrocall $name="italicise" text="Text to be made into italics"/> <$macrocall $name="italicise" text={{Title of tiddler containing text to be italicised}}/> <$macrocall $name="italicise" text=<<textMaker "Another macro to generate the text to be italicised">>/> ``` +The advantages of the widget formulation are: + +* Macro parameters are specified as widget attributes, thus allowing indirection via `{{title!!field}}`, `<<macroname>>` or `{{{filter}}}` +* The output format can be chosen from several options: +** `text/html` wikifies the text of the macro +** `text/plain` wikifies the text of the macro and then extracts the plain text characters (ie. ignoring HTML tags) +** `text/raw` returns the plain text of the macro, without wikification + + You can see several examples of the macro call widget within the core: * Listing module information: [[$:/snippets/modules]] @@ -31,5 +46,5 @@ The content of the `<$macrocall>` widget is ignored. |!Attribute |!Description | |$name |Name of the macro to invoke | |$type |ContentType with which the macro text should be parsed (defaults to `text/vnd.tiddlywiki`) | -|$output |ContentType for the output rendering (defaults to `text/html`, can also be `text/plain`) | +|$output |ContentType for the output rendering (defaults to `text/html`, can also be `text/plain` or `text/raw`) | |//parameters// |Macro parameters specified as attributes | From 59f233cd46616646fa8889f65aa9cc7d704d8c9a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 28 Sep 2020 11:31:33 +0100 Subject: [PATCH 0814/2376] Fix exporting tiddlers with double quoted titles Fixes #4860 --- core/templates/exporters/CsvFile.tid | 5 +---- core/templates/exporters/JsonFile.tid | 5 +---- core/wiki/macros/export.tid | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/core/templates/exporters/CsvFile.tid b/core/templates/exporters/CsvFile.tid index 63b2e057d..23d3bbd73 100644 --- a/core/templates/exporters/CsvFile.tid +++ b/core/templates/exporters/CsvFile.tid @@ -3,7 +3,4 @@ tags: $:/tags/Exporter description: {{$:/language/Exporters/CsvFile}} extension: .csv -\define renderContent() -<$text text=<<csvtiddlers filter:"""$(exportFilter)$""" format:"quoted-comma-sep">>/> -\end -<<renderContent>> +<$macrocall $name="csvtiddlers" filter=<<exportFilter>> format="quoted-comma-sep" $output="text/raw"/> diff --git a/core/templates/exporters/JsonFile.tid b/core/templates/exporters/JsonFile.tid index f3a5142c2..9008906cc 100644 --- a/core/templates/exporters/JsonFile.tid +++ b/core/templates/exporters/JsonFile.tid @@ -3,7 +3,4 @@ tags: $:/tags/Exporter description: {{$:/language/Exporters/JsonFile}} extension: .json -\define renderContent() -<$text text=<<jsontiddlers filter:"""$(exportFilter)$""">>/> -\end -<<renderContent>> +<$macrocall $name="jsontiddlers" filter=<<exportFilter>> $output="text/raw"/> diff --git a/core/wiki/macros/export.tid b/core/wiki/macros/export.tid index 567f8ff95..c55df3ecb 100644 --- a/core/wiki/macros/export.tid +++ b/core/wiki/macros/export.tid @@ -18,7 +18,7 @@ $baseFilename$$(extension)$ <$list filter="[all[shadows+tiddlers]tag[$:/tags/Exporter]]"> <$set name="extension" value={{!!extension}}> <$button class="tc-btn-invisible"> -<$action-sendmessage $message="tm-download-file" $param=<<currentTiddler>> exportFilter="""$exportFilter$""" filename=<<exportButtonFilename """$baseFilename$""">>/> +<$action-sendmessage $message="tm-download-file" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename """$baseFilename$""">>/> <$action-deletetiddler $tiddler=<<qualify "$:/state/popup/export">>/> <$transclude field="description"/> </$button> From f8961abb8a8d3c2fe7ed6c5a7e7b85bcabfd260a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 28 Sep 2020 11:31:58 +0100 Subject: [PATCH 0815/2376] Share Plugin: Fix problem with sharing double quoted tiddler titles --- plugins/tiddlywiki/share/wizard.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/share/wizard.tid b/plugins/tiddlywiki/share/wizard.tid index ac90f0292..dab3e1e58 100644 --- a/plugins/tiddlywiki/share/wizard.tid +++ b/plugins/tiddlywiki/share/wizard.tid @@ -1,7 +1,7 @@ title: $:/plugins/tiddlywiki/share/wizard \define generate-json() -<$text text=<<jsontiddlers filter:"""$(share-filter)$""" spaces:"">>/> +<$macrocall $name="jsontiddlers" filter=<<share-filter>> spaces="" $output="text/vnd.tiddlywiki"/> \end \define inner-share-actions() From f7a626fef232497ce09dc939b8af1f5169955cd2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 29 Sep 2020 16:40:24 +0100 Subject: [PATCH 0816/2376] Add version tag missed off ae13a0fee118c50169b7835c950df1dade33788f --- editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid b/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid index 5a993564f..e85562aab 100644 --- a/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/MacroCallWidget.tid @@ -28,10 +28,9 @@ The advantages of the widget formulation are: * Macro parameters are specified as widget attributes, thus allowing indirection via `{{title!!field}}`, `<<macroname>>` or `{{{filter}}}` * The output format can be chosen from several options: -** `text/html` wikifies the text of the macro -** `text/plain` wikifies the text of the macro and then extracts the plain text characters (ie. ignoring HTML tags) -** `text/raw` returns the plain text of the macro, without wikification - +** `text/html` wikifies the result of the macro +** `text/plain` wikifies the result of the macro and then extracts the plain text characters (ie. ignoring HTML tags) +** <<.from-version "5.1.23">> `text/raw` returns the result of the macro, without wikification You can see several examples of the macro call widget within the core: From 9716c326952c16f63345a135e73cf36670dca0d8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 30 Sep 2020 17:59:39 +0100 Subject: [PATCH 0817/2376] Fix Firefox bug with selection colours See https://github.com/Jermolene/TiddlyWiki5/commit/543f9107b6a9de5fe13542fa30d9a4483d8b3eb8#commitcomment-42849656 --- themes/tiddlywiki/vanilla/base.tid | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index c8345708f..0d1ebc360 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -232,11 +232,8 @@ kbd { } ::selection { - background-color: <<colour selection-background>>; - color: <<colour selection-foreground>>; -} - -::-moz-selection { + background-color: Highlight; + color: HighlightText; background-color: <<colour selection-background>>; color: <<colour selection-foreground>>; } From 0027b990e45dcc3a92904067ccbfa0af460fa1b2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 4 Oct 2020 17:36:08 +0100 Subject: [PATCH 0818/2376] Move tw5.com docs tiddlers to the correct folders --- ...Twexe_ Single File Tiddlywiki5 executable.tid | 0 .../examples/reduce Operator (Examples).tid | 16 ++++++++++++++++ .../ActionCreateTiddlerWidget Example 1.tid | 0 .../ActionCreateTiddlerWidget Example 2.tid | 0 .../ActionCreateTiddlerWidget Example 3.tid | 0 .../ActionCreateTiddlerWidget Example 4.tid | 0 .../ActionCreateTiddlerWidget Template.tid | 0 7 files changed, 16 insertions(+) rename editions/tw5.com/tiddlers/{ => community/resources}/Twexe_ Single File Tiddlywiki5 executable.tid (100%) create mode 100644 editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid rename editions/tw5.com/tiddlers/{ => widgets}/ActionCreateTiddlerWidget Example 1.tid (100%) rename editions/tw5.com/tiddlers/{ => widgets}/ActionCreateTiddlerWidget Example 2.tid (100%) rename editions/tw5.com/tiddlers/{ => widgets}/ActionCreateTiddlerWidget Example 3.tid (100%) rename editions/tw5.com/tiddlers/{ => widgets}/ActionCreateTiddlerWidget Example 4.tid (100%) rename editions/tw5.com/tiddlers/{ => widgets}/ActionCreateTiddlerWidget Template.tid (100%) diff --git a/editions/tw5.com/tiddlers/Twexe_ Single File Tiddlywiki5 executable.tid b/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid similarity index 100% rename from editions/tw5.com/tiddlers/Twexe_ Single File Tiddlywiki5 executable.tid rename to editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid diff --git a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid new file mode 100644 index 000000000..2c6e8b3d1 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid @@ -0,0 +1,16 @@ +created: 20201004154413968 +modified: 20201004154413968 +tags: [[Operator Examples]] [[reduce Operator]] +title: reduce Operator (Examples) +type: text/vnd.tiddlywiki + +\define add-numbers() [get[text]length[]compare:integer:gteq[1000]] +\define display-variable(name) +''<$text text=<<__name__>>/>'': <code><$text text={{{ [<__name__>getvariable[]] }}}/></code> +\end + +These examples use the following predefined variables: + +* <<display-variable add-numbers>> + +<<.operator-example 1 "[tag[HelloThere]filter<larger-than-1k>]">> diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 1.tid similarity index 100% rename from editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid rename to editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 1.tid diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 2.tid similarity index 100% rename from editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid rename to editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 2.tid diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 3.tid similarity index 100% rename from editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid rename to editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 3.tid diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 4.tid similarity index 100% rename from editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid rename to editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 4.tid diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Template.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Template.tid similarity index 100% rename from editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Template.tid rename to editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Template.tid From 14a28b77796461c9167898793ab9851e029e0354 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 6 Oct 2020 19:20:03 +0100 Subject: [PATCH 0819/2376] Add "reduce" and "filter" operators --- core/modules/filters/filter.js | 31 +++++++++++ core/modules/filters/reduce.js | 54 +++++++++++++++++++ .../tiddlers/filters/examples/Brownies.tid | 9 ++++ .../tiddlers/filters/examples/Chick Peas.tid | 9 ++++ .../tiddlers/filters/examples/Milk.tid | 9 ++++ .../filters/examples/Rice Pudding.tid | 9 ++++ .../examples/filter Operator (Examples).tid | 23 ++++++++ .../examples/reduce Operator (Examples).tid | 26 +++++++-- editions/tw5.com/tiddlers/filters/filter.tid | 33 ++++++++++++ editions/tw5.com/tiddlers/filters/reduce.tid | 27 ++++++++++ .../tiddlers/filters/subfilter Operator.tid | 2 + 11 files changed, 228 insertions(+), 4 deletions(-) create mode 100644 core/modules/filters/filter.js create mode 100644 core/modules/filters/reduce.js create mode 100644 editions/tw5.com/tiddlers/filters/examples/Brownies.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/Chick Peas.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/Milk.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/Rice Pudding.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/filter Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/filter.tid create mode 100644 editions/tw5.com/tiddlers/filters/reduce.tid diff --git a/core/modules/filters/filter.js b/core/modules/filters/filter.js new file mode 100644 index 000000000..2e549672b --- /dev/null +++ b/core/modules/filters/filter.js @@ -0,0 +1,31 @@ +/*\ +title: $:/core/modules/filters/filter.js +type: application/javascript +module-type: filteroperator + +Filter operator returning those input titles that pass a subfilter + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.filter = function(source,operator,options) { + var filterFn = options.wiki.compileFilter(operator.operand), + results = [], + target = operator.prefix !== "!"; + source(function(tiddler,title) { + var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title])); + if((list.length > 0) === target) { + results.push(title); + } + }); + return results; +}; + +})(); diff --git a/core/modules/filters/reduce.js b/core/modules/filters/reduce.js new file mode 100644 index 000000000..cc258af94 --- /dev/null +++ b/core/modules/filters/reduce.js @@ -0,0 +1,54 @@ +/*\ +title: $:/core/modules/filters/reduce.js +type: application/javascript +module-type: filteroperator + +Filter operator evaluats a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index` + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.reduce = function(source,operator,options) { + // Accumulate the list + var results = []; + source(function(tiddler,title) { + results.push(title); + }); + // Run the filter over each item + var filterFn = options.wiki.compileFilter(operator.operand), + accumulator = operator.suffix || ""; + for(var index=0; index<results.length; index++) { + var title = results[index], + list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{ + getVariable: function(name) { + switch(name) { + case "currentTiddler": + return "" + title; + case "accumulator": + return "" + accumulator; + case "index": + return "" + index; + case "revIndex": + return "" + (results.length - 1 - index); + case "length": + return "" + results.length; + default: + return options.widget.getVariable(name); + } + } + }); + if(list.length > 0) { + accumulator = "" + list[0]; + } + } + return [accumulator]; +}; + +})(); diff --git a/editions/tw5.com/tiddlers/filters/examples/Brownies.tid b/editions/tw5.com/tiddlers/filters/examples/Brownies.tid new file mode 100644 index 000000000..c4b5a9af8 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/Brownies.tid @@ -0,0 +1,9 @@ +created: 20201004145650743 +modified: 20201006181234412 +price: 4.99 +quantity: 1 +tags: shopping +title: Brownies +type: text/vnd.tiddlywiki + +//This is a sample shopping list item for the [[Shopping List Example]]// diff --git a/editions/tw5.com/tiddlers/filters/examples/Chick Peas.tid b/editions/tw5.com/tiddlers/filters/examples/Chick Peas.tid new file mode 100644 index 000000000..fa222cc98 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/Chick Peas.tid @@ -0,0 +1,9 @@ +created: 20201004145612358 +modified: 20201006181232439 +price: 1.32 +quantity: 5 +tags: shopping +title: Chick Peas +type: text/vnd.tiddlywiki + +//This is a sample shopping list item for the [[Shopping List Example]]// diff --git a/editions/tw5.com/tiddlers/filters/examples/Milk.tid b/editions/tw5.com/tiddlers/filters/examples/Milk.tid new file mode 100644 index 000000000..9092e6d20 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/Milk.tid @@ -0,0 +1,9 @@ +created: 20201004145636906 +modified: 20201006181233518 +price: 0.46 +quantity: 12 +tags: shopping +title: Milk +type: text/vnd.tiddlywiki + +//This is a sample shopping list item for the [[Shopping List Example]]// diff --git a/editions/tw5.com/tiddlers/filters/examples/Rice Pudding.tid b/editions/tw5.com/tiddlers/filters/examples/Rice Pudding.tid new file mode 100644 index 000000000..d31f660e8 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/Rice Pudding.tid @@ -0,0 +1,9 @@ +created: 20201004145502135 +modified: 20201006181230956 +price: 2.66 +quantity: 4 +tags: shopping +title: Rice Pudding +type: text/vnd.tiddlywiki + +//This is a sample shopping list item for the [[Shopping List Example]]// diff --git a/editions/tw5.com/tiddlers/filters/examples/filter Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/filter Operator (Examples).tid new file mode 100644 index 000000000..c8afe9a0e --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/filter Operator (Examples).tid @@ -0,0 +1,23 @@ +created: 20201004141030951 +modified: 20201004143326056 +tags: [[Operator Examples]] [[filter Operator]] +title: filter Operator (Examples) +type: text/vnd.tiddlywiki + +\define larger-than-1k() [get[text]length[]compare:integer:gteq[1000]] +\define smaller-than-2k() [get[text]length[]compare:integer:lteq[2000]] +\define contains-missing-links() [links[]!is[shadow]is[missing]] +\define display-variable(name) +''<$text text=<<__name__>>/>'': <code><$text text={{{ [<__name__>getvariable[]] }}}/></code> +\end + +These examples use the following predefined variables: + +* <<display-variable larger-than-1k>> +* <<display-variable smaller-than-2k>> +* <<display-variable contains-missing-links>> + +<<.operator-example 1 "[tag[HelloThere]filter<larger-than-1k>]">> +<<.operator-example 2 "[tag[HelloThere]filter<smaller-than-2k>]">> +<<.operator-example 3 "[tag[HelloThere]filter<larger-than-1k>filter<smaller-than-2k>]">> +<<.operator-example 4 "[tag[Features]filter<contains-missing-links>]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid index 2c6e8b3d1..80f62582b 100644 --- a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid @@ -1,16 +1,34 @@ created: 20201004154413968 -modified: 20201004154413968 +modified: 20201006181831622 tags: [[Operator Examples]] [[reduce Operator]] title: reduce Operator (Examples) type: text/vnd.tiddlywiki -\define add-numbers() [get[text]length[]compare:integer:gteq[1000]] +\define add-price() [get[price]multiply{!!quantity}add<accumulator>] +\define num-items() [get[quantity]add<accumulator>] \define display-variable(name) ''<$text text=<<__name__>>/>'': <code><$text text={{{ [<__name__>getvariable[]] }}}/></code> \end These examples use the following predefined variables: -* <<display-variable add-numbers>> +* <<display-variable add-price>> +* <<display-variable num-items>> -<<.operator-example 1 "[tag[HelloThere]filter<larger-than-1k>]">> +They also use the following data tiddlers: + +<ul> +<$list filter="[tag[shopping]!has[draft.of]]"> +<li> +''<$link><$text text=<<currentTiddler>>/></$link>'' quantity: <$text text={{!!quantity}}/>, price: <$text text={{!!price}}/> +</li> +</$list> +</ul> + +Number of items: + +<<.operator-example 1 "[tag[shopping]reduce<num-items>]">> + +Total price: + +<<.operator-example 2 "[tag[shopping]reduce<add-price>]">> diff --git a/editions/tw5.com/tiddlers/filters/filter.tid b/editions/tw5.com/tiddlers/filters/filter.tid new file mode 100644 index 000000000..faca51090 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/filter.tid @@ -0,0 +1,33 @@ +caption: filter +created: 20200929174420821 +modified: 20201006173606828 +op-input: a [[selection of titles|Title Selection]] passed as input to the filter +op-neg-input: a [[selection of titles|Title Selection]] passed as input to the filter +op-neg-output: those input titles that <<.em "do not">> pass the filter <<.place S>> +op-output: the [[selection of titles|Title Selection]] that pass the filter <<.place S>> +op-parameter: a [[filter expression|Filter Expression]] +op-parameter-name: S +op-purpose: apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter +tags: [[Filter Operators]] [[Negatable Operators]] +title: filter Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> The <<.op filter>> operator runs a subfilter for each input title, and returns those input titles for which the subfilter returns a non-empty result (in other words the result is not an empty list). The results of the subfilter are thrown away. + +Simple filter operations can be concatenated together directly (eg `[tag[HelloThere]search[po]]`) but this doesn't work when the filtering operations require intermediate results to be computed. The <<.op filter>> operator can be used to filter on an intermediate result which is discarded. To take the same example but to also filter by those tiddlers whose text field is longer than 1000 characters: + +``` +<$vars myfilter="[get[text]length[]compare:integer:gteq[1000]]"> +<$list filter="[tag[HelloThere]search[po]filter<myfilter>]"> +<div> +<$link> +<$text text=<<currentTiddler>>/> +</$link> +</div> +</$list> +</$vars> +``` + +<<.tip "Compare with the similar [[subfilter|subfilter Operator]] operator which runs a subfilter and directly returns the results">> + +<<.operator-examples "filter">> diff --git a/editions/tw5.com/tiddlers/filters/reduce.tid b/editions/tw5.com/tiddlers/filters/reduce.tid new file mode 100644 index 000000000..fae41a1eb --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/reduce.tid @@ -0,0 +1,27 @@ +caption: reduce +created: 20201004154131193 +modified: 20201006174749170 +op-input: a [[selection of titles|Title Selection]] passed as input to the filter +op-output: the final result of running the subfilter <<.place S>> +op-parameter: a [[filter expression|Filter Expression]] +op-parameter-name: S +op-purpose: apply a subfilter to each input title in turn, accumulating a single value +op-suffix: Initial value for accumulator +op-suffix-name: V +tags: [[Filter Operators]] +title: reduce Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> The <<.op reduce>> operator runs a subfilter for each input title, passing the result of the previous subfilter run as a variable. The initial value of the accumulator can optionally be specified. It returns the result of the final subfilter run. + +The <<.op reduce>> operator is used to flatten a list of items down to a single item by repeatedly applying a formula. A typical use is to add up the values in a given field of a list of tiddlers. + +The following variables are available within the subfilter: + +* ''accumulator'' - the result of the previous subfilter run +* ''currentTiddler'' - the input title +* ''index'' - the numeric index of the current list item (with zero being the first item in the list) +* ''revIndex'' - the reverse numeric index of the current list item (with zero being the last item in the list) +* ''length'' - the total length of the input list + +<<.operator-examples "reduce">> diff --git a/editions/tw5.com/tiddlers/filters/subfilter Operator.tid b/editions/tw5.com/tiddlers/filters/subfilter Operator.tid index ec201fc85..a02c1f125 100644 --- a/editions/tw5.com/tiddlers/filters/subfilter Operator.tid +++ b/editions/tw5.com/tiddlers/filters/subfilter Operator.tid @@ -22,4 +22,6 @@ type: text/vnd.tiddlywiki ... ``` +<<.tip "Compare with the similar [[filter|filter Operator]] operator which runs a subfilter against each title, returning those titles that return a non-empty list (and discards the results of the subfilter)">> + <<.operator-examples "subfilter">> From 5ebd98779a97733e0bf24c12acd9e542bd548ad5 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 8 Oct 2020 16:46:57 +0100 Subject: [PATCH 0820/2376] Update Quine 2 URL --- editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid index b32116f1a..4985f4dc7 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on iPad_iPhone.tid @@ -5,12 +5,12 @@ created: 20131129101027725 delivery: App description: iPad/iPhone app for working with TiddlyWiki method: save -modified: 20200507104206754 +modified: 20201007205336209 tags: Saving iOS title: Saving on iPad/iPhone type: text/vnd.tiddlywiki -The iPad/iPhone app ''Quine 2'' makes it possible to view, edit and then save changes to TiddlyWiki5 on iOS. [[Download it here|https://itunes.apple.com/us/app/quine/id1228682923?mt=8]]. +The iPad/iPhone app ''Quine 2'' makes it possible to view, edit and then save changes to TiddlyWiki5 on iOS. [[Download it here|https://apps.apple.com/us/app/quine-2/id1450128957]]. Instructions for use: From 34a51d2e239c8d200f8b79a85aae1e651f016d79 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 8 Oct 2020 17:21:31 +0100 Subject: [PATCH 0821/2376] Typo in comment Thanks @saqimtiaz --- core/modules/filters/reduce.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters/reduce.js b/core/modules/filters/reduce.js index cc258af94..74d1131eb 100644 --- a/core/modules/filters/reduce.js +++ b/core/modules/filters/reduce.js @@ -3,7 +3,7 @@ title: $:/core/modules/filters/reduce.js type: application/javascript module-type: filteroperator -Filter operator evaluats a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index` +Filter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index` \*/ (function(){ From 651fb777abd11c88e58b4bdfbced01d6db508852 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 14 Oct 2020 12:41:33 +0100 Subject: [PATCH 0822/2376] PasswordPrompt: Return the object so it can be modified --- boot/boot.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/boot/boot.js b/boot/boot.js index 646ddc9c0..24f7c7d79 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -652,11 +652,13 @@ $tw.utils.PasswordPrompt.prototype.createPrompt = function(options) { var promptInfo = { serviceName: options.serviceName, callback: options.callback, - form: form + form: form, + owner: this }; this.passwordPrompts.push(promptInfo); // Make sure the wrapper is displayed this.setWrapperDisplay(); + return promptInfo; }; $tw.utils.PasswordPrompt.prototype.removePrompt = function(promptInfo) { From 69c12618d963c711edd72a60427bd15ec4fa0e6e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 14 Oct 2020 12:41:51 +0100 Subject: [PATCH 0823/2376] Syncer: Allow syncadaptor to customise the login prompt --- core/modules/syncer.js | 6 ++++- .../moduletypes/SyncAdaptorModules.tid | 27 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 420e7cea9..45538e306 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -400,7 +400,7 @@ Syncer.prototype.handleLoginEvent = function() { var self = this; this.getStatus(function(err,isLoggedIn,username) { if(!err && !isLoggedIn) { - $tw.passwordPrompt.createPrompt({ + var promptInfo = $tw.passwordPrompt.createPrompt({ serviceName: $tw.language.getString("LoginToTiddlySpace"), callback: function(data) { self.login(data.username,data.password,function(err,isLoggedIn) { @@ -409,6 +409,10 @@ Syncer.prototype.handleLoginEvent = function() { return true; // Get rid of the password prompt } }); + // Let the sync adaptor adjust the prompt + if(self.syncadaptor && self.syncadaptor.customiseLoginPrompt) { + self.syncadaptor.customiseLoginPrompt(promptInfo); + } } }); }; diff --git a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid index a727991a8..92f124623 100644 --- a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid +++ b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid @@ -1,5 +1,5 @@ created: 20130825162100000 -modified: 20200113094126878 +modified: 20201014124049248 tags: dev moduletypes title: SyncAdaptorModules type: text/vnd.tiddlywiki @@ -80,6 +80,31 @@ Attempts to login to the server with specified credentials. This method is optio |password |Password | |callback |Callback function invoked with parameter `err` | +!! `customiseLoginPrompt(promptInfo)` + +Provides an opportunity to customise the login prompt. + +|!Parameter |!Description | +|promptInfo |The `promptInfo` object returned by `$tw.passwordPrompt.createPrompt()` | + +Here's an example of customising the login prompt to include a "forgotten password" button: + +``` +SyncAdaptor.prototype.customiseLoginPrompt = function(promptInfo) { + promptInfo.form.appendChild($tw.utils.domMaker("button",{ + attributes: {type: "submit"}, + text: "Forgot password", + eventListeners: [{ + name: "click", + handlerFunction: function(event) { + promptInfo.owner.removePrompt(promptInfo); + alert("Forgot password"); + } + }] + })); +}; +``` + !! `logout(callback)` Attempts to logout of the server. This method is optional. From 1446a1e44cd084b0905f3fdcd8b339f23edf2384 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 14 Oct 2020 15:59:27 +0100 Subject: [PATCH 0824/2376] Extend tm-scroll to accept CSS selector to identify the target --- core/modules/utils/dom/scroller.js | 15 ++++++++++++++- core/modules/widgets/scrollable.js | 14 +++++++++++++- .../messages/WidgetMessage_ tm-scroll.tid | 7 +++---- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/core/modules/utils/dom/scroller.js b/core/modules/utils/dom/scroller.js index 167067add..3f4c71cef 100644 --- a/core/modules/utils/dom/scroller.js +++ b/core/modules/utils/dom/scroller.js @@ -49,7 +49,12 @@ Handle an event */ PageScroller.prototype.handleEvent = function(event) { if(event.type === "tm-scroll") { - return this.scrollIntoView(event.target); + if(event.paramObject && event.paramObject.selector) { + this.scrollSelectorIntoView(null,event.paramObject.selector); + } else { + this.scrollIntoView(event.target); + } + return false; // Event was handled } return true; }; @@ -117,6 +122,14 @@ PageScroller.prototype.scrollIntoView = function(element,callback) { drawFrame(); }; +PageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) { + baseElement = baseElement || document.body; + var element = baseElement.querySelector(selector); + if(element) { + this.scrollIntoView(element,callback); + } +}; + exports.PageScroller = PageScroller; })(); diff --git a/core/modules/widgets/scrollable.js b/core/modules/widgets/scrollable.js index 97f0dcdf1..93f81310a 100644 --- a/core/modules/widgets/scrollable.js +++ b/core/modules/widgets/scrollable.js @@ -58,7 +58,11 @@ ScrollableWidget.prototype.handleScrollEvent = function(event) { if(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === "yes") { return true; } - this.scrollIntoView(event.target); + if(event.paramObject && event.paramObject.selector) { + this.scrollSelectorIntoView(null,event.paramObject.selector); + } else { + this.scrollIntoView(event.target); + } return false; // Handled event }; @@ -130,6 +134,14 @@ ScrollableWidget.prototype.scrollIntoView = function(element) { } }; +ScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) { + baseElement = baseElement || document.body; + var element = baseElement.querySelector(selector); + if(element) { + this.scrollIntoView(element,callback); + } +}; + /* Render this widget into the DOM */ diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-scroll.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-scroll.tid index d703d4ac7..99b613422 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-scroll.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-scroll.tid @@ -1,6 +1,6 @@ caption: tm-scroll created: 20160425000906330 -modified: 20160425001655166 +modified: 20201014152456174 tags: Messages title: WidgetMessage: tm-scroll type: text/vnd.tiddlywiki @@ -8,6 +8,5 @@ type: text/vnd.tiddlywiki The `tm-scroll` message causes the surrounding scrollable container to scroll to the specified DOM node into view. The `tm-scroll` is handled in various places in the core itself, but can also be handled by a [[ScrollableWidget]]. |!Name |!Description | -|target |Target DOM node the scrollable container should scroll to. | - -Due to the nature of the parameter, the `tm-scroll` can only be generated within javascript code. +|target |Target DOM node the scrollable container should scroll to (note that this parameter can only be set via JavaScript code) | +|selector |<<.from-version "5.1.23">> Optional string [[CSS selector|https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors]] as an alternate means of identifying the target DOM node | From 5af76c5ea10db2b59cc20f963a836c6a9faa8b10 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 17 Oct 2020 13:44:15 +0100 Subject: [PATCH 0825/2376] Extend TOC macros to allow custom link targets --- core/wiki/macros/toc.tid | 6 +++--- editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/wiki/macros/toc.tid b/core/wiki/macros/toc.tid index 512a5e569..c05d64020 100644 --- a/core/wiki/macros/toc.tid +++ b/core/wiki/macros/toc.tid @@ -16,7 +16,7 @@ tags: $:/tags/Macro <$set name="excluded" filter="""[enlist<__exclude__>] [<__tag__>]"""> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item"> <li class=<<toc-item-class>>> - <$list filter="[all[current]toc-link[no]]" emptyMessage="<$link><$view field='caption'><$view field='title'/></$view></$link>"> + <$list filter="[all[current]toc-link[no]]" emptyMessage="<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><$view field='caption'><$view field='title'/></$view></$link>"> <<toc-caption>> </$list> <$macrocall $name="toc-body" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/> @@ -37,7 +37,7 @@ tags: $:/tags/Macro <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item"> <li class=<<toc-item-class>>> - <$link> + <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> <$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep"> {{$:/core/images/right-arrow}} @@ -105,7 +105,7 @@ tags: $:/tags/Macro <$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}> <$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item" > <li class=<<toc-item-class>>> - <$link> + <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}> <$list filter="[all[current]tagging[]$sort$limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> <$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep"> diff --git a/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid b/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid index f73df5574..3507f2008 100644 --- a/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid +++ b/editions/tw5.com/tiddlers/macros/TableOfContentsMacro.tid @@ -1,5 +1,5 @@ created: 20140919155729620 -modified: 20150221224034000 +modified: 20201017134038305 tags: Macros [[Core Macros]] title: Table-of-Contents Macros type: text/vnd.tiddlywiki @@ -34,6 +34,8 @@ The tree displays the <<.field caption>> field of a tiddler if it has one, or th Each tiddler in the tree is normally displayed as a link. To suppress this, give the tiddler a <<.field toc-link>> field with the the value <<.value no>>. In the [[examples|Table-of-Contents Macros (Examples)]], the SecondThree tiddler is set up like this. Clicking such a tiddler in the tree causes its branch to expand or collapse. +<<.from-version "5.1.23">> By default, the links open the tiddlers making up the table of contents. Alternatively, if the tiddler contains a <<.field target>> field then its contents will be used as the target of the link. + The table of contents is generated as an HTML ordered list. The `<ol>` elements always have the class `tc-toc`. Expandable trees have the additional class `tc-toc-expandable`. Selectively expandable trees (including those in the two-panel browser) have `tc-toc-selective-expandable`. To make a table of contents appear in the sidebar, see [[How to add a new tab to the sidebar]]. From 41931082e6e602266f8a14d54f9e799bfa8f1819 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 18 Oct 2020 14:42:25 +0100 Subject: [PATCH 0826/2376] Update release note --- .../prerelease/tiddlers/Release 5.1.23.tid | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 4f7184a0f..e8151bb60 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20200912173852160 -modified: 20200912173852160 +created: 20201018143621963 +modified: 20201018143621963 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -23,12 +23,15 @@ type: text/vnd.tiddlywiki * Twitter Plugin ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded * [[Dynaview Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) * [[CodeMirror Plugin]] ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap * [[Markdown Plugin]] ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebraks +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links +* [[Amazon Web Services Plugin]] +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes ! Translation Improvements @@ -43,7 +46,7 @@ type: text/vnd.tiddlywiki ! Usability Improvements * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c]] "Solarized Dark" palette -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] Vanilla theme to use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/274a07b4fd2ca2d1b95c8ddf52fe055c44260d9b]]) the Vanilla theme to optionally use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration * [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox palette readability of toolbar buttons * [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition @@ -52,6 +55,11 @@ type: text/vnd.tiddlywiki ! Hackability Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/1446a1e44cd084b0905f3fdcd8b339f23edf2384]] the [[WidgetMessage: tm-scroll]] message to allow the target element to be specified by a CSS selector +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10]] the [[Table-of-Contents Macros]] to support custom link targets +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f]] the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4785]] new [[format Operator]] for formatting dates * [[Adedd|https://github.com/Jermolene/TiddlyWiki5/pull/4777]] new Hyperdrive saver for use with Beaker Browser v1.0 * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b]] new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter @@ -66,15 +74,16 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4741]] [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4740]] the EditWidget to pass all attributes through to the sub-widget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim off a prefixing or suffixing string from input tiddler titles * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653]] LinkCatcherWidget to pass keyboard modifier status to actions * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4724]] original event to `tm-navigate` event * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852]] the password prompt to enable it to be customised +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e]] syncer to enable syncadaptors to customise the login prompt ! Bug Fixes * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4632]] hover effect for search dropdown items -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4584]] restored missing parameter to `saveTiddler()` method sync adaptors +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4584]] restored missing parameter to `saveTiddler()` method of syncadaptors * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04]] MakeLibraryCommand to skip non-directories * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4601]] erroneous use of `$tw.wiki` * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4647]] ''class'' attribute of DroppableWidget @@ -99,6 +108,8 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4813]] incorrect base64 encoding of astral plane Unicode text * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4770]] server error when saving a new tiddler created by following a tiddler link * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4751]] a `plugin-priority` field to the TiddlyWeb plugin so that language plugins can override its language strings +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4853]] bug whereby joining an empty list would not return an empty list +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/59f233cd46616646fa8889f65aa9cc7d704d8c9a]] bug exporting tiddlers with double quoted titles ! Contributors @@ -112,7 +123,9 @@ type: text/vnd.tiddlywiki * [[@danielo515|https://github.com/danielo515]] * [[@ento|https://github.com/ento]] * [[@favadi|https://github.com/favadi]] +* [[@fkohrt|https://github.com/fkohrt]] * [[@flibbles|https://github.com/flibbles]] +* [[@gera2ld|https://github.com/gera2ld]] * [[@ibnishak|https://github.com/ibnishak]] * [[@idotobi|https://github.com/idotobi]] * [[@jdangerx|https://github.com/jdangerx]] From dbda09b9fcec20c0b65908eaed7b3af8027f6994 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Sun, 18 Oct 2020 06:19:52 -0800 Subject: [PATCH 0827/2376] Make test harness exit with a non-zero code when there's test failure (#4889) * Rename variables to better convey what they're about * Refactor comments so that they make more sense * In Node.js, call the wrapper's execute function The function sets up callbacks necessary for exiting the process with the appropriate exit code. https://github.com/jasmine/jasmine-npm/blob/v3.4.0/lib/jasmine.js#L235 * No need to configure the default reporter manually The .execute() function does it * Add note on which path comes from which npm package * Note that other properties of the process object are referenced too --- plugins/tiddlywiki/jasmine/jasmine-plugin.js | 54 ++++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/plugins/tiddlywiki/jasmine/jasmine-plugin.js b/plugins/tiddlywiki/jasmine/jasmine-plugin.js index 2fb4a8ec5..3c79201c6 100644 --- a/plugins/tiddlywiki/jasmine/jasmine-plugin.js +++ b/plugins/tiddlywiki/jasmine/jasmine-plugin.js @@ -16,6 +16,13 @@ var TEST_TIDDLER_FILTER = "[type[application/javascript]tag[$:/tags/test-spec]]" /* Startup function for running tests + +Below, paths like jasmine-core/jasmine.js refer to files in the 'jasmine-core' npm +package, whose repository is https://github.com/jasmine/jasmine. +Paths like jasmine/jasmine.js refer to files in the 'jasmine' npm package, whose +repository is https://github.com/jasmine/jasmine-npm. + +They're all locally checked into the `./files` directory. */ exports.startup = function() { // Set up a shared context object. @@ -65,37 +72,52 @@ exports.startup = function() { return context.module.exports || contextExports; } - // Get the core Jasmine exports + // Get the core Jasmine exports. + // We load 'jasmine-core/jasmine.js' here in order to start with a module + // that is shared between browser and Node.js environments. Browser-specific + // and Node-specific modules are loaded next. var jasmineCore = evalInContext("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/jasmine.js"); - // Get the Jasmine instance and configure reporters + // The core Jasmine instance var jasmine; + // Node.js wrapper for calling `.execute()` + var nodeJasmineWrapper; if($tw.browser) { window.jasmineRequire = jasmineCore; $tw.modules.execute("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/jasmine-html.js"); $tw.modules.execute("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/boot.js"); jasmine = window.jasmine; } else { - // We load 'jasmine-core/jasmine.js' above instead of the - // main script 'jasmine-core/jasmine-core.js', which is what's loaded - // when you run `require('jasmine-core')` in a Node.js environment. - // We load 'jasmine-core/jasmine.js' because we want to factor out - // code paths that are common between browser and Node.js environments. - // As a result, the `jasmineCore` object is missing some properties that - // 'jasmine/jasmine.js' expects, so we manually populate what we need. + // Add missing properties to `jasmineCore` in order to call the Jasmine + // constructor in Node.js. + // + // The constructor loads the `jasmineCore` object automatically, if + // not explicitly specified, by calling `require('jasmine-core')`. + // What happens internally next is... + // + // 1. require('jasmine-core') + // a. loads the package's main script, 'jasmine-core/jasmine-core.js' + // i. requires 'jasmine-core/jasmine.js' + // ii. reads some extra files and returns a `jasmineCore` object + // + // Because we're in TiddlyWiki land, we really don't need step 1.a.ii. + // + // Since the `jasmineCore` variable already holds the result of 1.a.i, + // we'll add a few properties necessary for calling the Jasmine constructor + // and pass it in explicitly. The consructor function can be seen here: + // https://github.com/jasmine/jasmine-npm/blob/v3.4.0/lib/jasmine.js#L10 - // 'jasmine/jasmine.js' calls `.boot()` + // 'jasmine/jasmine.js' requires the `.boot()` function jasmineCore.boot = evalInContext("$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core/node_boot.js"); // 'jasmine/jasmine.js' references `.files.path` jasmineCore.files = { path: "$:/plugins/tiddlywiki/jasmine/jasmine-core/jasmine-core" }; - // 'jasmine/jasmine.js' references `process.exit` + // 'jasmine/jasmine.js' references `process.exit`, among other properties context.process = process; - var JasmineNode = evalInContext("$:/plugins/tiddlywiki/jasmine/jasmine/jasmine.js"); - var jasmineRunner = new JasmineNode({jasmineCore: jasmineCore}); - jasmineRunner.configureDefaultReporter({}); - jasmine = jasmineRunner.jasmine; + var NodeJasmine = evalInContext("$:/plugins/tiddlywiki/jasmine/jasmine/jasmine.js"); + nodeJasmineWrapper = new NodeJasmine({jasmineCore: jasmineCore}); + jasmine = nodeJasmineWrapper.jasmine; } // Add Jasmine's DSL to our context var env = jasmine.getEnv(); @@ -109,7 +131,7 @@ exports.startup = function() { // In a browser environment, jasmine-core/boot.js calls `execute()` for us. // In Node.js, we call it manually. if(!$tw.browser) { - env.execute(); + nodeJasmineWrapper.execute(); } }; From 4ecd885a0c990967df96cbb98b3b7bd6593c1415 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 18 Oct 2020 16:13:38 +0100 Subject: [PATCH 0828/2376] Update GitHub Actions to avoid deprecated "set-env" command Fixes #4885 --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ac889fe9..5a30a5f8d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,9 +39,9 @@ jobs: - name: "Set dynamic environment variables" run: | TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} - echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) - echo ::set-env name=TW5_BUILD_DETAILS::Prerelease built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV + echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV + echo "TW5_BUILD_DETAILS=Prerelease built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: @@ -65,9 +65,9 @@ jobs: - name: "Set dynamic environment variables" run: | TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} - echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) - echo ::set-env name=TW5_BUILD_DETAILS::Built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV + echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV + echo "TW5_BUILD_DETAILS=Built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: From 7e7ecbe7a596bfc44804c4b04fd015ba1ee43584 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 18 Oct 2020 16:51:36 +0100 Subject: [PATCH 0829/2376] Google Actions requires spaces instead of tabs --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a30a5f8d..f377b3921 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,9 +39,9 @@ jobs: - name: "Set dynamic environment variables" run: | TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV - echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV - echo "TW5_BUILD_DETAILS=Prerelease built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV + echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV + echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV + echo "TW5_BUILD_DETAILS=Prerelease built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: @@ -65,9 +65,9 @@ jobs: - name: "Set dynamic environment variables" run: | TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV - echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV - echo "TW5_BUILD_DETAILS=Built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV + echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV + echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV + echo "TW5_BUILD_DETAILS=Built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: From f863acf8ac716dbf892f2d63efa0a130aadfec6a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 18 Oct 2020 17:05:43 +0100 Subject: [PATCH 0830/2376] Update BibTeX parser to use later fork of library https://github.com/ORCID/bibtexParseJs --- plugins/tiddlywiki/bibtex/files/LICENSE | 0 plugins/tiddlywiki/bibtex/files/README.md | 0 .../tiddlywiki/bibtex/files/bibtexParse.js | 68 ++++++++++++------- 3 files changed, 42 insertions(+), 26 deletions(-) mode change 100755 => 100644 plugins/tiddlywiki/bibtex/files/LICENSE mode change 100755 => 100644 plugins/tiddlywiki/bibtex/files/README.md mode change 100755 => 100644 plugins/tiddlywiki/bibtex/files/bibtexParse.js diff --git a/plugins/tiddlywiki/bibtex/files/LICENSE b/plugins/tiddlywiki/bibtex/files/LICENSE old mode 100755 new mode 100644 diff --git a/plugins/tiddlywiki/bibtex/files/README.md b/plugins/tiddlywiki/bibtex/files/README.md old mode 100755 new mode 100644 diff --git a/plugins/tiddlywiki/bibtex/files/bibtexParse.js b/plugins/tiddlywiki/bibtex/files/bibtexParse.js old mode 100755 new mode 100644 index 2e276f9ac..4bac1acca --- a/plugins/tiddlywiki/bibtex/files/bibtexParse.js +++ b/plugins/tiddlywiki/bibtex/files/bibtexParse.js @@ -1,9 +1,12 @@ -/* start bibtexParse 0.0.22 */ +/* start bibtexParse 0.0.24 */ //Original work by Henrik Muehe (c) 2010 // //CommonJS port by Mikola Lysenko 2013 // +//Choice of compact (default) or pretty output from toBibtex: +// Nick Bailey, 2017. +// //Port to Browser lib by ORCID / RCPETERS // //Issues: @@ -24,7 +27,7 @@ (function(exports) { function BibtexParser() { - + this.months = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"]; this.notKey = [',','{','}',' ','=']; this.pos = 0; @@ -52,8 +55,8 @@ if (this.input.substring(this.pos, this.pos + s.length) == s) { this.pos += s.length; } else { - throw "Token mismatch, expected " + s + ", found " - + this.input.substring(this.pos); + throw TypeError("Token mismatch: match", "expected " + s + ", found " + + this.input.substring(this.pos)); }; this.skipWhitespace(canCommentOut); }; @@ -112,7 +115,7 @@ } else if (this.input[this.pos] == '{') { bracecount++; } else if (this.pos >= this.input.length - 1) { - throw "Unterminated value"; + throw TypeError("Unterminated value: value_braces"); }; }; if (this.input[this.pos] == '\\' && escaped == false) @@ -133,7 +136,7 @@ if (this.input[this.pos] == '}') brcktCnt--; if (this.pos >= this.input.length - 1) { - throw "Unterminated value:" + this.input.substring(start); + throw TypeError("Unterminated value: value_comment", + this.input.substring(start)); }; this.pos++; }; @@ -151,7 +154,7 @@ this.match('"', false); return this.input.substring(start, end); } else if (this.pos >= this.input.length - 1) { - throw "Unterminated value:" + this.input.substring(start); + throw TypeError("Unterminated value: value_quotes", this.input.substring(start)); }; } if (this.input[this.pos] == '\\' && escaped == false) @@ -175,8 +178,8 @@ else if (this.months.indexOf(k.toLowerCase()) >= 0) return k.toLowerCase(); else - throw "Value expected:" + this.input.substring(start) + ' for key: ' + k; - + throw "Value expected: single_value" + this.input.substring(start) + ' for key: ' + k; + }; }; @@ -194,7 +197,7 @@ var start = this.pos; while (true) { if (this.pos >= this.input.length) { - throw "Runaway key"; + throw TypeError("Runaway key: key"); }; // а-яА-Я is Cyrillic //console.log(this.input[this.pos]); @@ -206,7 +209,7 @@ return this.input.substring(start, this.pos); } else { this.pos++; - + }; }; }; @@ -216,10 +219,11 @@ if (this.tryMatch("=")) { this.match("="); var val = this.value(); + key = key.trim() return [ key, val ]; } else { - throw "... = value expected, equals sign missing:" - + this.input.substring(this.pos); + throw TypeError("Value expected, equals sign missing: key_equals_value", + this.input.substring(this.pos)); }; }; @@ -243,7 +247,7 @@ this.currentEntry = {}; this.currentEntry['citationKey'] = this.key(true); this.currentEntry['entryType'] = d.substring(1); - if (this.currentEntry['citationKey'] != null) { + if (this.currentEntry['citationKey'] != null) { this.match(","); } this.key_value_list(); @@ -289,11 +293,11 @@ while (this.matchAt()) { var d = this.directive(); this.match("{"); - if (d == "@STRING") { + if (d.toUpperCase() == "@STRING") { this.string(); - } else if (d == "@PREAMBLE") { + } else if (d.toUpperCase() == "@PREAMBLE") { this.preamble(); - } else if (d == "@COMMENT") { + } else if (d.toUpperCase() == "@COMMENT") { this.comment(); } else { this.entry(d); @@ -304,7 +308,7 @@ this.alernativeCitationKey(); }; }; - + exports.toJSON = function(bibtex) { var b = new BibtexParser(); b.setInput(bibtex); @@ -313,28 +317,40 @@ }; /* added during hackathon don't hate on me */ - exports.toBibtex = function(json) { + /* Increased the amount of white-space to make entries + * more attractive to humans. Pass compact as false + * to enable */ + exports.toBibtex = function(json, compact) { + if (compact === undefined) compact = true; var out = ''; + + var entrysep = ','; + var indent = ''; + if (!compact) { + entrysep = ',\n'; + indent = ' '; + } for ( var i in json) { out += "@" + json[i].entryType; out += '{'; if (json[i].citationKey) - out += json[i].citationKey + ', '; + out += json[i].citationKey + entrysep; if (json[i].entry) out += json[i].entry ; if (json[i].entryTags) { - var tags = ''; + var tags = indent; for (var jdx in json[i].entryTags) { - if (tags.length != 0) - tags += ', '; - tags += jdx + '= {' + json[i].entryTags[jdx] + '}'; + if (tags.trim().length != 0) + tags += entrysep + indent; + tags += jdx + (compact ? '={' : ' = {') + + json[i].entryTags[jdx] + '}'; } out += tags; } - out += '}\n\n'; + out += compact ? '}\n' : '\n}\n\n'; } return out; - + }; })(typeof exports === 'undefined' ? this['bibtexParse'] = {} : exports); From c8721b38fd48887838b84e068295518d99918293 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 19 Oct 2020 09:44:55 +0100 Subject: [PATCH 0831/2376] JSZip plugin: Fix example formatting --- plugins/tiddlywiki/jszip/examples.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/tiddlywiki/jszip/examples.tid b/plugins/tiddlywiki/jszip/examples.tid index fac50a25c..942f72b8f 100644 --- a/plugins/tiddlywiki/jszip/examples.tid +++ b/plugins/tiddlywiki/jszip/examples.tid @@ -23,8 +23,8 @@ The actions below create a ZIP file containing a static HTML rendering of the fi Render site </$button> -'<$list filter="[!is[system]duplicateslugs[]limit[1]]" emptyMessage="(There are no duplicate slugs)"> -The following tiddlers have duplicate slugs: +<$list filter="[!is[system]duplicateslugs[]limit[1]]" emptyMessage="''(There are no duplicate slugs)''"> +''The following tiddlers have duplicate slugs:'' <ul> <$list filter="[all[tiddlers]!is[system]limit[25]duplicateslugs[]]"> From d2546128268f21668433436c3a25db749d327252 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 19 Oct 2020 09:51:11 +0100 Subject: [PATCH 0832/2376] Update and rearrange release note --- .../prerelease/tiddlers/Release 5.1.23.tid | 67 ++++++++++--------- .../plugins/Consent Banner Plugin.tid | 14 ++++ .../tw5.com/tiddlers/plugins/JSZip Plugin.tid | 7 ++ 3 files changed, 56 insertions(+), 32 deletions(-) create mode 100644 editions/tw5.com/tiddlers/plugins/Consent Banner Plugin.tid create mode 100644 editions/tw5.com/tiddlers/plugins/JSZip Plugin.tid diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index e8151bb60..a68f92459 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -10,34 +10,16 @@ type: text/vnd.tiddlywiki ! Major Improvements * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4725]] support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns. - -! New and Improved Plugins - -* Consent Banner Plugin -** [[New|https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1]] plugin to help make websites compliant with cookie legislation by displaying a consent banner -* JSZip Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser -* Freelinks Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements -* Twitter Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded -* [[Dynaview Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) -* [[CodeMirror Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap -* [[Markdown Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebraks -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links -* [[Amazon Web Services Plugin]] -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes +* [[New|https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1]] [[Consent Banner Plugin]] to help make websites compliant with cookie legislation by displaying a consent banner +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] [[JSZip Plugin]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/1446a1e44cd084b0905f3fdcd8b339f23edf2384]] the [[WidgetMessage: tm-scroll]] message to allow the target element to be specified by a CSS selector, making it possible to scroll to positions within a tiddler ! Translation Improvements * New Arabic (Palestine) translation -* Catalan -* Chinese +* Improved Catalan translation +* Improved Chinese translation ! Performance Improvements @@ -53,16 +35,18 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4791]] a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls -! Hackability Improvements +! Filter Improvements -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/1446a1e44cd084b0905f3fdcd8b339f23edf2384]] the [[WidgetMessage: tm-scroll]] message to allow the target element to be specified by a CSS selector -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10]] the [[Table-of-Contents Macros]] to support custom link targets -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f]] the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4785]] new [[format Operator]] for formatting dates -* [[Adedd|https://github.com/Jermolene/TiddlyWiki5/pull/4777]] new Hyperdrive saver for use with Beaker Browser v1.0 * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b]] new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4785]] new [[format Operator]] for formatting dates +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers + +! Hackability Improvements + +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10]] the [[Table-of-Contents Macros]] to support custom link targets +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f]] the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) +* [[Adedd|https://github.com/Jermolene/TiddlyWiki5/pull/4777]] new Hyperdrive saver for use with Beaker Browser v1.0 * [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f]] ''accept'' attribute to the BrowseWidget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed @@ -76,7 +60,6 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653]] LinkCatcherWidget to pass keyboard modifier status to actions * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4724]] original event to `tm-navigate` event -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852]] the password prompt to enable it to be customised * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e]] syncer to enable syncadaptors to customise the login prompt @@ -111,6 +94,26 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4853]] bug whereby joining an empty list would not return an empty list * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/59f233cd46616646fa8889f65aa9cc7d704d8c9a]] bug exporting tiddlers with double quoted titles +! Plugin Improvements + +* Freelinks Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements +* Twitter Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded +* [[Dynaview Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) +* [[CodeMirror Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap +* [[Markdown Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebraks +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links +* [[Amazon Web Services Plugin]] +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes +* ~BibTeX Plugin +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/f863acf8ac716dbf892f2d63efa0a130aadfec6a]] to a later fork of the underlying third party ~BibTeX parsing library + ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: diff --git a/editions/tw5.com/tiddlers/plugins/Consent Banner Plugin.tid b/editions/tw5.com/tiddlers/plugins/Consent Banner Plugin.tid new file mode 100644 index 000000000..365f83cc8 --- /dev/null +++ b/editions/tw5.com/tiddlers/plugins/Consent Banner Plugin.tid @@ -0,0 +1,14 @@ +created: 20201019084534263 +modified: 20201019084658478 +tags: OfficialPlugins +title: Consent Banner Plugin +type: text/vnd.tiddlywiki + +The Consent Banner Plugin helps make websites that are compliant with "cookie legislation" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]]. +It presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits. + +By default, content embedded with <iframe>, <embed> and <object> is blocked unless the user consents to accept cookies. + +Consent status is available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies. + +Please note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/plugins/JSZip Plugin.tid b/editions/tw5.com/tiddlers/plugins/JSZip Plugin.tid new file mode 100644 index 000000000..6e555ff89 --- /dev/null +++ b/editions/tw5.com/tiddlers/plugins/JSZip Plugin.tid @@ -0,0 +1,7 @@ +created: 20201019084712096 +modified: 20201019084824422 +tags: OfficialPlugins +title: JSZip Plugin +type: text/vnd.tiddlywiki + +This plugin provides primitives for creating Zip files in the browser. It also makes the [[JSZip|https://stuk.github.io/jszip/]] library available for use by other plugins. \ No newline at end of file From 794dfb96f219292b5074e6f5282e7d6e71bd615d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 23 Oct 2020 15:37:20 +0100 Subject: [PATCH 0833/2376] Don't try to process lazily loaded plugins Fixes #4900 --- boot/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot/boot.js b/boot/boot.js index 24f7c7d79..969a8c567 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1272,7 +1272,7 @@ $tw.Wiki = function(options) { $tw.utils.each(titles || getTiddlerTitles(),function(title) { var tiddler = tiddlers[title]; if(tiddler) { - if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type")) { + if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type") && tiddler.fields.text) { pluginInfo[tiddler.fields.title] = JSON.parse(tiddler.fields.text); results.modifiedPlugins.push(tiddler.fields.title); } From 84479bc403de0dbcee775c5c9921c82f71224906 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 23 Oct 2020 16:58:34 +0200 Subject: [PATCH 0834/2376] Fix #4826 - Keyboard-driven-inputs clashes with customized search results. (#4875) * Update search.tid * Update DefaultSearchResultList.tid * Update tabs.tid * Update SearchResults.tid * Update tabs.tid * Update SearchResults.tid * Update search.tid * Update keyboard-driven-input.tid * Update shortcuts.multids * Update ShortcutInfo.multids * Update Misc.multids * Update keyboard-driven-input.tid * Update search.tid * Update Misc.multids --- core/language/en-GB/Misc.multids | 2 ++ core/ui/DefaultSearchResultList.tid | 10 ++++++++-- core/ui/SearchResults.tid | 2 +- core/ui/SideBarSegments/search.tid | 19 +++++++++++++++++-- core/wiki/config/ShortcutInfo.multids | 2 ++ core/wiki/config/shortcuts/shortcuts.multids | 2 ++ core/wiki/macros/keyboard-driven-input.tid | 11 +++++++++++ core/wiki/macros/tabs.tid | 12 ++++++++---- 8 files changed, 51 insertions(+), 9 deletions(-) diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 8fb500364..3ef0f5dc2 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -67,6 +67,8 @@ Shortcuts/Input/Accept/Hint: Accept the selected item Shortcuts/Input/AcceptVariant/Hint: Accept the selected item (variant) Shortcuts/Input/Cancel/Hint: Clear the input field Shortcuts/Input/Down/Hint: Select the next item +Shortcuts/Input/Tab-Left/Hint: Select the previous Tab +Shortcuts/Input/Tab-Right/Hint: Select the next Tab Shortcuts/Input/Up/Hint: Select the previous item SystemTiddler/Tooltip: This is a system tiddler SystemTiddlers/Include/Prompt: Include system tiddlers diff --git a/core/ui/DefaultSearchResultList.tid b/core/ui/DefaultSearchResultList.tid index 1e0b1e403..3c31c4e48 100644 --- a/core/ui/DefaultSearchResultList.tid +++ b/core/ui/DefaultSearchResultList.tid @@ -1,23 +1,29 @@ title: $:/core/ui/DefaultSearchResultList tags: $:/tags/SearchResults caption: {{$:/language/Search/DefaultResults/Caption}} +first-search-filter: [!is[system]search:title<userInput>sort[title]limit[250]] +second-search-filter: [!is[system]search<userInput>sort[title]limit[250]] \define searchResultList() //<small>{{$:/language/Search/Matches/Title}}</small>// -<$list filter="[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]"> +<$list filter="[<userInput>minlength[1]]" variable="ignore"> +<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}> <span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}> <$transclude tiddler="$:/core/ui/ListItemTemplate"/> </span> </$list> +</$list> //<small>{{$:/language/Search/Matches/All}}</small>// -<$list filter="[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]"> +<$list filter="[<userInput>minlength[1]]" variable="ignore"> +<$list filter={{{ [<configTiddler>get[second-search-filter]] }}}> <span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}> <$transclude tiddler="$:/core/ui/ListItemTemplate"/> </span> </$list> +</$list> \end <<searchResultList>> diff --git a/core/ui/SearchResults.tid b/core/ui/SearchResults.tid index a67d19811..0fc832df4 100644 --- a/core/ui/SearchResults.tid +++ b/core/ui/SearchResults.tid @@ -8,7 +8,7 @@ title: $:/core/ui/SearchResults </$list> """> -<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]" default={{$:/config/SearchResults/Default}}/> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]" default={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<currentTab>>/>""" explicitState="$:/state/tab/search-results/sidebar"/> </$list> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 08cbd45f7..b27755ce2 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -19,11 +19,17 @@ tags: $:/tags/SideBarSegment \define search-results-list() \whitespace trim -<$list filter="[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$set name="userInput" value={{$(searchTiddler)$}}> +<$list filter="[<userInput>minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> + +<$tiddler tiddler="$(configTiddler)$"> {{$:/core/ui/SearchResults}} +</$tiddler> + </$list> +</$set> \end \define delete-state-tiddlers() <$action-deletetiddler $filter="[[$:/temp/search]] [<searchTiddler>] [<searchListState>]"/> @@ -34,16 +40,23 @@ tags: $:/tags/SideBarSegment \define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> + <div class="tc-sidebar-lists tc-sidebar-search"> -<$vars searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">> titleSearchFilter="[!is[system]search:title<userInput>sort[title]limit[250]]" allSearchFilter="[!is[system]search<userInput>sort[title]limit[250]]"> +<$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> +<$vars titleSearchFilter={{{ [<configTiddler>get[first-search-filter]] }}} allSearchFilter={{{ [<configTiddler>get[second-search-filter]] }}}> <div class="tc-search"> +<$keyboard key="((input-tabs-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tabs-left))" actions=<<set-next-input-tab "before">>> <$macrocall $name="keyboard-driven-input" tiddler="$:/temp/search" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> class="tc-popup-handle" primaryListFilter=<<titleSearchFilter>> secondaryListFilter=<<allSearchFilter>> filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups="yes" /> +</$keyboard> +</$keyboard> <$reveal state=<<searchTiddler>> type="nomatch" text=""> <$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="tc-btn-invisible"> <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search}}/> @@ -76,4 +89,6 @@ tags: $:/tags/SideBarSegment </$vars> +</$vars> + </div> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index f013aa6a4..bb892bdff 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -15,6 +15,8 @@ input-accept: {{$:/language/Shortcuts/Input/Accept/Hint}} input-accept-variant: {{$:/language/Shortcuts/Input/AcceptVariant/Hint}} input-cancel: {{$:/language/Shortcuts/Input/Cancel/Hint}} input-down: {{$:/language/Shortcuts/Input/Down/Hint}} +input-tab-left: {{$:/language/Shortcuts/Input/Tab-Left/Hint}} +input-tab-right: {{$:/language/Shortcuts/Input/Tab-Right/Hint}} input-up: {{$:/language/Shortcuts/Input/Up/Hint}} italic: {{$:/language/Buttons/Italic/Hint}} link: {{$:/language/Buttons/Link/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 3c7b773ed..fe6257497 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -15,6 +15,8 @@ input-accept: Enter input-accept-variant: Alt-Enter input-cancel: Escape input-down: Down +input-tab-left: alt-Left +input-tab-right: alt-Right input-up: Up link: ctrl-L linkify: alt-shift-L diff --git a/core/wiki/macros/keyboard-driven-input.tid b/core/wiki/macros/keyboard-driven-input.tid index d26776f71..98167f3ac 100644 --- a/core/wiki/macros/keyboard-driven-input.tid +++ b/core/wiki/macros/keyboard-driven-input.tid @@ -1,6 +1,17 @@ title: $:/core/macros/keyboard-driven-input tags: $:/tags/Macro +\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions) +<$set name="tabsList" filter="[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]"> +<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}> +<$set name="nextTab" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}> +<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/> +$actions$ +</$set> +</$vars> +</$set> +\end + \define keyboard-input-actions() <$list filter="[<__index__>match[]]"> <$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/> diff --git a/core/wiki/macros/tabs.tid b/core/wiki/macros/tabs.tid index 39610d664..0470186b9 100644 --- a/core/wiki/macros/tabs.tid +++ b/core/wiki/macros/tabs.tid @@ -1,10 +1,12 @@ title: $:/core/macros/tabs tags: $:/tags/Macro -\define tabs(tabsList,default,state:"$:/state/tab",class,template,buttonTemplate,retain) +\define tabs(tabsList,default,state:"$:/state/tab",class,template,buttonTemplate,retain,actions,explicitState) +<$set name="qualifiedState" value=<<qualify "$state$">>> +<$set name="tabsState" filter="[<__explicitState__>minlength[1]] ~[<qualifiedState>]"> <div class="tc-tab-set $class$"> <div class="tc-tab-buttons $class$"> -<$list filter="$tabsList$" variable="currentTab" storyview="pop"><$set name="save-currentTiddler" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify "$state$">> setTo=<<currentTab>> default="$default$" selectedClass="tc-tab-selected" tooltip={{!!tooltip}}> +<$list filter="$tabsList$" variable="currentTab" storyview="pop"><$set name="save-currentTiddler" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default="$default$" selectedClass="tc-tab-selected" tooltip={{!!tooltip}}> <$tiddler tiddler=<<save-currentTiddler>>> <$set name="tv-wikilinks" value="no"> <$transclude tiddler="$buttonTemplate$" mode="inline"> @@ -12,13 +14,13 @@ tags: $:/tags/Macro <$macrocall $name="currentTab" $type="text/plain" $output="text/plain"/> </$transclude> </$transclude> -</$set></$tiddler></$button></$tiddler></$set></$list> +</$set></$tiddler>$actions$</$button></$tiddler></$set></$list> </div> <div class="tc-tab-divider $class$"/> <div class="tc-tab-content $class$"> <$list filter="$tabsList$" variable="currentTab"> -<$reveal type="match" state=<<qualify "$state$">> text=<<currentTab>> default="$default$" retain="""$retain$"""> +<$reveal type="match" state=<<tabsState>> text=<<currentTab>> default="$default$" retain="""$retain$"""> <$transclude tiddler="$template$" mode="block"> @@ -31,4 +33,6 @@ tags: $:/tags/Macro </$list> </div> </div> +</$set> +</$set> \end From 7686be7b14cdb3bb6e02ab7bd5a5204a8318942f Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Fri, 23 Oct 2020 17:23:17 +0200 Subject: [PATCH 0835/2376] Fix state tiddlers for action-create-tiddlers examples (#4897) --- .../tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid | 4 ++-- .../tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid | 4 ++-- .../tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid | 4 ++-- .../tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid index 5e4e84432..d5560be3b 100644 --- a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 1.tid @@ -1,5 +1,5 @@ created: 20200131142401129 -modified: 20200131152023958 +modified: 20201020112608874 tags: ActionCreateTiddlerWidget title: ActionCreateTiddlerWidget Example 1 type: text/vnd.tiddlywiki @@ -21,6 +21,6 @@ Create Tiddler ``` <$button actions=<<testCreate>> > -<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> Create Tiddler </$button> - Clicking this button, will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid index 089ab4763..876e5fbba 100644 --- a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 2.tid @@ -1,5 +1,5 @@ created: 20200131144828713 -modified: 20200131152102232 +modified: 20201020112601032 tags: ActionCreateTiddlerWidget title: ActionCreateTiddlerWidget Example 2 type: text/vnd.tiddlywiki @@ -23,6 +23,6 @@ Create Tiddler ``` <$button actions=<<testCreate>> > -<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> Create Tiddler </$button> - Clicking this button, will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid index 325499fc0..54524108a 100644 --- a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 3.tid @@ -1,5 +1,5 @@ created: 20200131145355658 -modified: 20200131152045990 +modified: 20201020112553050 tags: ActionCreateTiddlerWidget title: ActionCreateTiddlerWidget Example 3 type: text/vnd.tiddlywiki @@ -23,6 +23,6 @@ Create Tiddler ``` <$button actions=<<testCreate>> > -<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> Create Tiddler </$button> - Clicking this button, will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid index b116ee5e7..b1eb7275f 100644 --- a/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid +++ b/editions/tw5.com/tiddlers/ActionCreateTiddlerWidget Example 4.tid @@ -1,5 +1,5 @@ created: 20200131150229551 -modified: 20200131152051626 +modified: 20201020112544146 tags: ActionCreateTiddlerWidget title: ActionCreateTiddlerWidget Example 4 type: text/vnd.tiddlywiki @@ -23,6 +23,6 @@ Create Tiddler ``` <$button actions=<<testCreate>> > -<$action-setfield $tiddler="$:/state/tab/sidebar-1206596165" text="$:/core/ui/SideBar/Recent"/> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> Create Tiddler </$button> - Clicking this button, will also open the Right sidebar: Recent tab From ae8ee5b955b799881d0cec84f0e3893911788635 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 23 Oct 2020 17:23:54 +0200 Subject: [PATCH 0836/2376] Update modifier Variable.tid (#4894) * Update modifier Variable.tid This updates the "modifier Variable" tiddler * Update modifier Variable.tid --- .../tw5.com/tiddlers/variables/modifier Variable.tid | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/variables/modifier Variable.tid b/editions/tw5.com/tiddlers/variables/modifier Variable.tid index 44c4c2077..2f1239a3d 100644 --- a/editions/tw5.com/tiddlers/variables/modifier Variable.tid +++ b/editions/tw5.com/tiddlers/variables/modifier Variable.tid @@ -2,13 +2,17 @@ tags: Variables [[Core Variables]] title: modifier Variable type: text/vnd.tiddlywiki -Within the ''action'' string of the DroppableWidget, the <<.def modifier>> [[variable|Variables]] contains the modifier key(s) held during the drag-process. -The possible keys are ''ctrl'', ''shift'' or both ''ctrl'' and ''shift'' +Within the ''action'' string of the DroppableWidget, the ''action'' string of the ButtonWidget and the ''action'' string of the LinkCatcherWidget, the <<.def modifier>> [[variable|Variables]] contains the modifier key(s) held during the drag-process. +The possible keys are ''ctrl'', ''shift'', ''alt'', ''ctrl'' and ''shift'', ''alt'' and ''shift'', ''ctrl'' and ''alt'', ''ctrl'' and ''alt'' and ''shift'' The variable contains a string that identifies the keys: |Modifier Key |Variable Content |h |ctrl |ctrl | +|alt |alt | |shift |shift | |ctrl+shift |ctrl-shift | -|no modifier (normal drag) |normal | +|alt+shift |alt-shift | +|ctrl+alt |ctrl-alt | +|ctrl+alt+shift |ctrl-alt-shift | +|no modifier (normal click / drag) |normal | From fd4cfaeb025b2e1b3ca79425cfaa8635790dcb55 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 23 Oct 2020 17:24:33 +0200 Subject: [PATCH 0837/2376] Typo in username (#4896) --- editions/prerelease/tiddlers/Release 5.1.23.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index a68f92459..f517e73f2 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -140,5 +140,5 @@ type: text/vnd.tiddlywiki * [[@passuf|https://github.com/passuf]] * [[@pmario|https://github.com/pmario]] * [[@rmunn|https://github.com/rmunn]] -* [[@saqimtias|https://github.com/saqimtias]] +* [[@saqimtiaz|https://github.com/saqimtiaz]] * [[@twMat|https://github.com/twMat]] From adf0c1a12adb3622759902d6793c12356de7ab02 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 23 Oct 2020 17:25:05 +0200 Subject: [PATCH 0838/2376] Documentation for format filter operator (#4895) * Documentation for format operator * Examples for format operator --- .../examples/format Operator (Examples).tid | 16 +++++++++++++ editions/tw5.com/tiddlers/filters/format.tid | 23 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/format.tid diff --git a/editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid new file mode 100644 index 000000000..071d4506d --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid @@ -0,0 +1,16 @@ +created: 20201020102735123 +modified: 20201020104004306 +tags: [[Operator Examples]] [[format Operator]] +title: format Operator (Examples) +type: text/vnd.tiddlywiki + +These examples use the tiddler HelloThere. + +Created date with no format string specified: +<<.operator-example 1 "[[HelloThere]get[created]format:date[]]">> + +Created date with a format string supplied as operator parameter: +<<.operator-example 2 "[[HelloThere]get[created]format:date[DDth MMM YYYY]]">> + +Modified date shown as a relative date: +<<.operator-example 3 "[[HelloThere]get[modified]format:relativedate[]]">> diff --git a/editions/tw5.com/tiddlers/filters/format.tid b/editions/tw5.com/tiddlers/filters/format.tid new file mode 100644 index 000000000..8cf6f9826 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/format.tid @@ -0,0 +1,23 @@ +caption: format +created: 20201020100834443 +modified: 20201020104004271 +op-input: a [[selection of titles|Title Selection]] +op-output: input strings formatted according to the specified suffix <<.place B>> +op-parameter: optional format string for the formats +op-parameter-name: C +op-purpose: format the input string according to one of supported formats +op-suffix: one of supported formats +op-suffix-name: B +tags: [[Filter Operators]] [[String Operators]] +title: format Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> + +The suffix <<.place B>> is one of the following supported string formats: + +|!Format |!Description | +|^`date` |The input string is interpreted as a UTC date and displayed according to the DateFormat specified in the optional operator parameter. (Defaults to "YYYY MM DD 0hh:0mm") | +|^`relativedate` |The input string is interpreted as a UTC date and displayed as the interval from the present instant. Any operator parameters are ignored. | + +<<.operator-examples "format">> From 707e9d892635d21e2b0535fcbd2902e599a922b7 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 23 Oct 2020 16:27:17 +0100 Subject: [PATCH 0839/2376] Exclude $:/StoryList from syncing Fixes #4868 --- core/wiki/config/SyncFilter.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/config/SyncFilter.tid b/core/wiki/config/SyncFilter.tid index c2c65e551..11e90d4f2 100644 --- a/core/wiki/config/SyncFilter.tid +++ b/core/wiki/config/SyncFilter.tid @@ -1,3 +1,3 @@ title: $:/config/SyncFilter -[is[tiddler]] -[[$:/core]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] \ No newline at end of file +[is[tiddler]] -[[$:/core]] -[[$:/StoryList]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] \ No newline at end of file From c3a8cc7eb470dfe1ad5fe74cec94ca19ee4f1d23 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 23 Oct 2020 20:32:40 +0200 Subject: [PATCH 0840/2376] fix error in sidebarsegments / search (#4903) --- core/ui/SideBarSegments/search.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index b27755ce2..6064fd69e 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -47,8 +47,8 @@ tags: $:/tags/SideBarSegment <$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> <$vars titleSearchFilter={{{ [<configTiddler>get[first-search-filter]] }}} allSearchFilter={{{ [<configTiddler>get[second-search-filter]] }}}> <div class="tc-search"> -<$keyboard key="((input-tabs-right))" actions=<<set-next-input-tab>>> -<$keyboard key="((input-tabs-left))" actions=<<set-next-input-tab "before">>> +<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$macrocall $name="keyboard-driven-input" tiddler="$:/temp/search" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> From a1b486436e9278078c524c6aa11f7f4de6cbc877 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 23 Oct 2020 20:33:46 +0200 Subject: [PATCH 0841/2376] update TabsMacro.tid with "actions" and "explicitState" attribute (#4902) --- editions/tw5.com/tiddlers/macros/TabsMacro.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/editions/tw5.com/tiddlers/macros/TabsMacro.tid b/editions/tw5.com/tiddlers/macros/TabsMacro.tid index 16b67fa98..b55e43545 100644 --- a/editions/tw5.com/tiddlers/macros/TabsMacro.tid +++ b/editions/tw5.com/tiddlers/macros/TabsMacro.tid @@ -27,6 +27,10 @@ By default the tabs are arranged horizontally above the content. To get vertical : Optionally, the title of a tiddler to use as a [[template|TemplateTiddlers]] for transcluding the content of the button for the selected tab ;retain : Optionally, "yes" specifies that the content of the tabs should be retained when switching to another tab, avoiding re-rendering it (this can be useful to avoid video or audio sources unexpectedly resetting) +;actions +: Optionally, actions can be specified that are triggered when changing a tab +;explicitState +: Optionally, an explicit state title can be specified. It will be preferred over the internally computed (qualified) state title Within the template, the title of the selected tab is available in the <<.var currentTab>> variable. From 4877891980f077c6c31e99cc6a9eb45b5d1230e1 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Fri, 23 Oct 2020 20:39:03 +0200 Subject: [PATCH 0842/2376] Fix tiddler title alignment if no icon is acitve (#4859) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * don't show the span if no icons are active. * title lineheight 1.3 needed for eg: gggggg --- core/ui/ViewTemplate/title.tid | 2 ++ themes/tiddlywiki/vanilla/base.tid | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/ui/ViewTemplate/title.tid b/core/ui/ViewTemplate/title.tid index 6abacf18c..e2f874387 100644 --- a/core/ui/ViewTemplate/title.tid +++ b/core/ui/ViewTemplate/title.tid @@ -16,11 +16,13 @@ $:/config/ViewToolbarButtons/Visibility/$(listItem)$ <$set name="tv-wikilinks" value={{$:/config/Tiddlers/TitleLinks}}> <$link> <$set name="foregroundColor" value={{!!color}}> +<$list filter="[all[current]has[icon]]~[[$:/config/DefaultTiddlerIcon]has[text]]"> <span class="tc-tiddler-title-icon" style=<<title-styles>>> <$transclude tiddler={{!!icon}}> <$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/> </$transclude> </span> +</$list> </$set> <$list filter="[all[current]removeprefix[$:/]]"> <h2 class="tc-title" title={{$:/language/SystemTiddler/Tooltip}}> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 0d1ebc360..51ea4d503 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -986,7 +986,7 @@ button.tc-btn-invisible.tc-remove-tag-button { .tc-titlebar { font-weight: 300; font-size: 2.35em; - line-height: 1.2em; + line-height: 1.3em; color: <<colour tiddler-title-foreground>>; margin: 0; } From 4cdbe6540b4d037bb694605a1454502ee0112d46 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sat, 24 Oct 2020 15:22:39 +0800 Subject: [PATCH 0843/2376] Update chinese translations (#4890) * Add chinese translations for "Error/FormatFilterOperator" * Update Misc.multids --- languages/zh-Hans/Misc.multids | 9 ++++++--- languages/zh-Hant/Misc.multids | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index ade1710ec..126f1b5a5 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -26,6 +26,7 @@ Error/Caption: 错误 Error/EditConflict: 服务器上的文件已更改 Error/Filter: 筛选器错误 Error/FilterSyntax: 筛选器运算式中的语法错误 +Error/FormatFilterOperator: 筛选器错误:`format` 筛选器运算符的未知尾码 Error/IsFilterOperator: 筛选器错误︰'is' 筛选器运算符的未知操作数 Error/LoadingPluginLibrary: 加载插件程式库时,发生错误 Error/NetworkErrorAlert: `<h2>''网络错误''</h2>与服务器的连缐似乎已中断。这可能表示您的网络连缐有问题。请尝试恢复网路连缐才能继续。<br><br>''恢复连缐时,所有未保存的更改,将自动同步''。` @@ -36,7 +37,7 @@ Error/WhileSaving: 保存时,发生错误 Error/XMLHttpRequest: XMLHttpRequest 错误代码 InternalJavaScriptError/Title: 内部的 JavaScript 错误 InternalJavaScriptError/Hint: 喔,真是令人尴尬。建议刷新您的浏览器,重新启动 TiddlyWiki -InvalidFieldName: 栏位名称 "<$text text=<<fieldName>>/>" 包含无效字符,栏位名称只能包含小写字母、数字、底线 (`_`)、 连字号 (`-`) 和小数点 (`.`) +InvalidFieldName: 字段名称 "<$text text=<<fieldName>>/>" 包含无效字符,字段名称只能包含小写字母、数字、底线 (`_`)、 连字号 (`-`) 和小数点 (`.`) LazyLoadingWarning: <p>正在从 ''<$text text={{!!_canonical_uri}}/>'' 加载外部内容 ...</p><p>如果此信息未消失,可能是条目内容类型与外部内容的类型不匹配,或是您可能正在使用的浏览器,不支援单文件式维基的外部内容。请参阅 https://tiddlywiki.com/#ExternalText</p> LoginToTiddlySpace: 登录 TiddlySpace Manager/Controls/FilterByTag/None: (无) @@ -49,7 +50,7 @@ Manager/Controls/Show/Option/Tiddlers: 条目 Manager/Controls/Show/Prompt: 显示︰ Manager/Controls/Sort/Prompt: 排序︰ Manager/Item/Colour: 颜色 -Manager/Item/Fields: 栏位 +Manager/Item/Fields: 字段 Manager/Item/Icon/None: (无) Manager/Item/Icon: 图标 Manager/Item/RawText: 原始文字 @@ -64,8 +65,10 @@ PluginReloadWarning: 请保存 {{$:/core/ui/Buttons/save-wiki}} 并刷新页面 RecentChanges/DateFormat: YYYY年0MM月0DD日 Shortcuts/Input/Accept/Hint: 接受选取的项目 Shortcuts/Input/AcceptVariant/Hint: 接受选取项目 (变种) -Shortcuts/Input/Cancel/Hint: 清除输入栏位 +Shortcuts/Input/Cancel/Hint: 清除输入字段 Shortcuts/Input/Down/Hint: 选择下一个项目 +Shortcuts/Input/Tab-Left/Hint: 选择上一个页签 +Shortcuts/Input/Tab-Right/Hint: 选择下一个页签 Shortcuts/Input/Up/Hint: 选择前一个项目 SystemTiddler/Tooltip: 此为系统条目 SystemTiddlers/Include/Prompt: 包括系统条目 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index 94703f4aa..97c23b278 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -26,6 +26,7 @@ Error/Caption: 錯誤 Error/EditConflict: 伺服器上的檔案已更改 Error/Filter: 篩選器錯誤 Error/FilterSyntax: 篩選器運算式中的語法錯誤 +Error/FormatFilterOperator: 篩選器錯誤:`format` 篩選器運算子的未知尾碼 Error/IsFilterOperator: 篩選器錯誤︰'is' 篩選器運算子的未知運算元 Error/LoadingPluginLibrary: 載入插件程式庫時,發生錯誤 Error/NetworkErrorAlert: `<h2>''網路錯誤''</h2>與伺服器的連線似乎已中斷。這可能表示您的網路連線有問題。請嘗試恢復網路連線才能繼續。<br><br>''恢復連線時,所有未儲存的變更,將自動同步''。` @@ -66,6 +67,8 @@ Shortcuts/Input/Accept/Hint: 接受選取的項目 Shortcuts/Input/AcceptVariant/Hint: 接受選取項目 (變種) Shortcuts/Input/Cancel/Hint: 清除輸入欄位 Shortcuts/Input/Down/Hint: 選擇下一個項目 +Shortcuts/Input/Tab-Left/Hint: 選擇上一個頁籤 +Shortcuts/Input/Tab-Right/Hint: 選擇下一個頁籤 Shortcuts/Input/Up/Hint: 選擇前一個項目 SystemTiddler/Tooltip: 此為系統條目 SystemTiddlers/Include/Prompt: 包括系統條目 From b9234fe238a7769ee1e6fbf27ea6a353e64ed258 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 25 Oct 2020 16:56:41 +0100 Subject: [PATCH 0844/2376] Update syncFilter to allow excluding multiple storyLists (#4906) --- core/wiki/config/SyncFilter.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/config/SyncFilter.tid b/core/wiki/config/SyncFilter.tid index 11e90d4f2..41d71537c 100644 --- a/core/wiki/config/SyncFilter.tid +++ b/core/wiki/config/SyncFilter.tid @@ -1,3 +1,3 @@ title: $:/config/SyncFilter -[is[tiddler]] -[[$:/core]] -[[$:/StoryList]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] \ No newline at end of file +[is[tiddler]] -[[$:/core]] -[prefix[$:/StoryList]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] From 1a91f819766a92ed85d5c118d47a6dc8ccbdb32c Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 25 Oct 2020 16:57:35 +0100 Subject: [PATCH 0845/2376] Update filters for single file to match changes to syncFilter (#4907) * Update saverFilter to match new changes in syncFilter * Update save-all.tid * Update save-all-external-js.tid * Update save-offline.tid --- core/templates/external-js/save-all-external-js.tid | 2 +- core/templates/save-all.tid | 2 +- core/wiki/config/SaverFilter.tid | 2 +- plugins/tiddlywiki/tiddlyweb/save-offline.tid | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/templates/external-js/save-all-external-js.tid b/core/templates/external-js/save-all-external-js.tid index 8eff8b9e6..49b80d390 100644 --- a/core/templates/external-js/save-all-external-js.tid +++ b/core/templates/external-js/save-all-external-js.tid @@ -2,6 +2,6 @@ title: $:/core/save/all-external-js \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() -[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ +[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ \end {{$:/core/templates/tiddlywiki5-external-js.html}} diff --git a/core/templates/save-all.tid b/core/templates/save-all.tid index d622f9c52..cb55922dd 100644 --- a/core/templates/save-all.tid +++ b/core/templates/save-all.tid @@ -2,6 +2,6 @@ title: $:/core/save/all \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() -[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ +[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ \end {{$:/core/templates/tiddlywiki5.html}} diff --git a/core/wiki/config/SaverFilter.tid b/core/wiki/config/SaverFilter.tid index 20554a78d..563b8bea9 100644 --- a/core/wiki/config/SaverFilter.tid +++ b/core/wiki/config/SaverFilter.tid @@ -1,3 +1,3 @@ title: $:/config/SaverFilter -[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]] \ No newline at end of file +[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]] diff --git a/plugins/tiddlywiki/tiddlyweb/save-offline.tid b/plugins/tiddlywiki/tiddlyweb/save-offline.tid index 76f07fe29..798072833 100644 --- a/plugins/tiddlywiki/tiddlyweb/save-offline.tid +++ b/plugins/tiddlywiki/tiddlyweb/save-offline.tid @@ -2,6 +2,6 @@ title: $:/plugins/tiddlywiki/tiddlyweb/save/offline \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() -[is[tiddler]] -[[$:/boot/boot.css]] -[[$:/HistoryList]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[prefix[$:/temp/]] +[sort[title]] $(publishFilter)$ +[is[tiddler]] -[[$:/boot/boot.css]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[prefix[$:/temp/]] +[sort[title]] $(publishFilter)$ \end {{$:/core/templates/tiddlywiki5.html}} From 5cc1600072f5aa50c8ff5f5d2e748d81a7067420 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 25 Oct 2020 16:22:21 +0000 Subject: [PATCH 0846/2376] Introduce post-render startup actions --- core/modules/startup/render.js | 2 ++ core/modules/startup/startup.js | 11 +++------- core/modules/widgets/widget.js | 10 +++++++++ .../tiddlers/features/StartupActions.tid | 21 +++++++++++++------ 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/core/modules/startup/render.js b/core/modules/startup/render.js index 05ba9844d..fc93bcdb3 100644 --- a/core/modules/startup/render.js +++ b/core/modules/startup/render.js @@ -106,6 +106,8 @@ exports.startup = function() { // Fix up the link between the root widget and the page container $tw.rootWidget.domNodes = [$tw.pageContainer]; $tw.rootWidget.children = [$tw.pageWidgetNode]; + // Run any post-render startup actions + $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction/PostRender"); }; })(); diff --git a/core/modules/startup/startup.js b/core/modules/startup/startup.js index ad1416bf3..b7897a5ce 100755 --- a/core/modules/startup/startup.js +++ b/core/modules/startup/startup.js @@ -64,17 +64,12 @@ exports.startup = function() { document: $tw.browser ? document : $tw.fakeDocument }); // Execute any startup actions - var executeStartupTiddlers = function(tag) { - $tw.utils.each($tw.wiki.filterTiddlers("[all[shadows+tiddlers]tag[" + tag + "]!has[draft.of]]"),function(title) { - $tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget); - }); - }; - executeStartupTiddlers("$:/tags/StartupAction"); + $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction"); if($tw.browser) { - executeStartupTiddlers("$:/tags/StartupAction/Browser"); + $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction/Browser"); } if($tw.node) { - executeStartupTiddlers("$:/tags/StartupAction/Node"); + $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction/Node"); } // Kick off the language manager and switcher $tw.language = new $tw.Language(); diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index e0444573d..bd66438e2 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -571,6 +571,16 @@ Widget.prototype.invokeActionString = function(actions,triggeringWidget,event,va return widgetNode.invokeActions(this,event); }; +/* +Execute action tiddlers by tag +*/ +Widget.prototype.executeStartupTiddlers = function(tag) { + var self = this; + $tw.utils.each(self.wiki.filterTiddlers("[all[shadows+tiddlers]tag[" + tag + "]!has[draft.of]]"),function(title) { + self.invokeActionString(self.wiki.getTiddlerText(title),self); + }); +}; + Widget.prototype.allowActionPropagation = function() { return true; }; diff --git a/editions/tw5.com/tiddlers/features/StartupActions.tid b/editions/tw5.com/tiddlers/features/StartupActions.tid index 3b5583f47..79a23b3d9 100644 --- a/editions/tw5.com/tiddlers/features/StartupActions.tid +++ b/editions/tw5.com/tiddlers/features/StartupActions.tid @@ -1,16 +1,21 @@ created: 20180323092308399 -modified: 20190307183936035 +modified: 20201025161723719 tags: Features title: StartupActions type: text/vnd.tiddlywiki TiddlyWiki executes any ActionWidgets found in tiddlers with the following system tags during startup: -* <<tag "$:/tags/StartupAction">> (executed on all platforms) -* <<tag "$:/tags/StartupAction/Browser">> (only executed when running in the browser) -* <<tag "$:/tags/StartupAction/Node">> (only executed when running under Node.js) +* Executed during initial startup: +** <<tag "$:/tags/StartupAction">> (executed on all platforms) +** <<tag "$:/tags/StartupAction/Browser">> (only executed when running in the browser) +** <<tag "$:/tags/StartupAction/Node">> (only executed when running under Node.js) +* Executed after startup rendering: +** <<.from-version "5.1.23">> <<tag "$:/tags/StartupAction/PostRender">> (only executed when running in the browser) -Startup actions are useful for customising TiddlyWiki according to environmental factors such as the screen size. For example, the following action widgets when placed in a tiddler tagged `$:/tags/StartupAction/Browser` will cause the sidebar to be hidden by default when the screen width is less than 1000 pixels: +!! Initial Startup Actions + +The initial startup actions are useful for customising TiddlyWiki according to environmental factors such as the screen size. For example, the following action widgets when placed in a tiddler tagged `$:/tags/StartupAction/Browser` will cause the sidebar to be hidden by default when the screen width is less than 1000 pixels: ``` <$reveal type="lt" state="$:/info/browser/screen/width" text="3000"> @@ -28,8 +33,12 @@ Startup actions are useful for customising TiddlyWiki according to environmental <$action-setfield $tiddler="$:/language" text={{{ [[$:/languages/en-GB]] [plugin-type[language]sort[description]removeprefix[$:/languages/]] +[prefix{$:/info/browser/language}] ~[[en-GB]] +[addprefix[$:/languages/]] }}}/> ``` -Note that global macros are not available within startup action tiddlers by default. If you need to access them then you'll need to explicitly include them with an ''import'' [[pragma|Pragma]] at the top of the tiddler: +Note that global macros are not available within initial startup action tiddlers by default. If you need to access them then you'll need to explicitly include them with an ''import'' [[pragma|Pragma]] at the top of the tiddler: ``` \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] ``` + +!! Post-Render Startup Actions + +<<.from-version "5.1.23">> Post-render startup actions occur after the TiddlyWiki user interface has been rendered. This makes it possible to perform actions that depend on the rendered display (such as displaying modals). From f7f55e8eff8b172d8fd04f095781efa2420b1be6 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 25 Oct 2020 16:33:44 +0000 Subject: [PATCH 0847/2376] Add support for username/password parameters for tm-login message --- core/modules/syncer.js | 44 +++++++++++++------ .../moduletypes/SyncAdaptorModules.tid | 26 +++-------- .../messages/WidgetMessage_ tm-login.tid | 3 +- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 45538e306..1ad9c3474 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -113,8 +113,16 @@ function Syncer(options) { return confirmationMessage; }); // Listen out for login/logout/refresh events in the browser - $tw.rootWidget.addEventListener("tm-login",function() { - self.handleLoginEvent(); + $tw.rootWidget.addEventListener("tm-login",function(event) { + var username = event && event.paramObject && event.paramObject.username, + password = event && event.paramObject && event.paramObject.password; + if(username && password) { + // Login with username and password + self.login(username,password,function() {}); + } else { + // No username and password, so we display a prompt + self.handleLoginEvent(); + } }); $tw.rootWidget.addEventListener("tm-logout",function() { self.handleLogoutEvent(); @@ -400,23 +408,31 @@ Syncer.prototype.handleLoginEvent = function() { var self = this; this.getStatus(function(err,isLoggedIn,username) { if(!err && !isLoggedIn) { - var promptInfo = $tw.passwordPrompt.createPrompt({ - serviceName: $tw.language.getString("LoginToTiddlySpace"), - callback: function(data) { - self.login(data.username,data.password,function(err,isLoggedIn) { - self.syncFromServer(); - }); - return true; // Get rid of the password prompt - } - }); - // Let the sync adaptor adjust the prompt - if(self.syncadaptor && self.syncadaptor.customiseLoginPrompt) { - self.syncadaptor.customiseLoginPrompt(promptInfo); + if(self.syncadaptor && self.syncadaptor.displayLoginPrompt) { + self.syncadaptor.displayLoginPrompt(self); + } else { + self.displayLoginPrompt(); } } }); }; +/* +Dispay a password prompt +*/ +Syncer.prototype.displayLoginPrompt = function() { + var self = this; + var promptInfo = $tw.passwordPrompt.createPrompt({ + serviceName: $tw.language.getString("LoginToTiddlySpace"), + callback: function(data) { + self.login(data.username,data.password,function(err,isLoggedIn) { + self.syncFromServer(); + }); + return true; // Get rid of the password prompt + } + }); +}; + /* Attempt to login to TiddlyWeb. username: username diff --git a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid index 92f124623..b4f150ff0 100644 --- a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid +++ b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid @@ -1,5 +1,5 @@ created: 20130825162100000 -modified: 20201014124049248 +modified: 20201025162413404 tags: dev moduletypes title: SyncAdaptorModules type: text/vnd.tiddlywiki @@ -80,30 +80,14 @@ Attempts to login to the server with specified credentials. This method is optio |password |Password | |callback |Callback function invoked with parameter `err` | -!! `customiseLoginPrompt(promptInfo)` +!! `displayLoginPrompt(syncer)` -Provides an opportunity to customise the login prompt. +Invoked by the syncer to display a custom login promopt. This method is optional. |!Parameter |!Description | -|promptInfo |The `promptInfo` object returned by `$tw.passwordPrompt.createPrompt()` | +|syncer |Reference to the syncer object making the call | -Here's an example of customising the login prompt to include a "forgotten password" button: - -``` -SyncAdaptor.prototype.customiseLoginPrompt = function(promptInfo) { - promptInfo.form.appendChild($tw.utils.domMaker("button",{ - attributes: {type: "submit"}, - text: "Forgot password", - eventListeners: [{ - name: "click", - handlerFunction: function(event) { - promptInfo.owner.removePrompt(promptInfo); - alert("Forgot password"); - } - }] - })); -}; -``` +The custom login prompt should send the widget message `tm-login` with the username and password in parameters ''username'' and ''password''. !! `logout(callback)` diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-login.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-login.tid index 71f45431d..39ed6321e 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-login.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-login.tid @@ -1,5 +1,5 @@ created: 20140811112445887 -modified: 20140811113336694 +modified: 20201025163134940 tags: Messages title: WidgetMessage: tm-login type: text/vnd.tiddlywiki @@ -9,3 +9,4 @@ The login message prompts the user for a username and password and attempts to l The login message is handled by the TiddlyWiki core SyncMechanism which invokes the current [[SyncAdaptorModule|SyncAdaptorModules]] (typically the ''tiddlywiki/tiddlywebadaptor'' plugin). +<<.from-version "5.1.23">> The login message can optionally accept parameters called ''username'' and ''password'' that immediately attempts to login with the specified credentials without displaying the prompt From 15338e60e894064600889ecd0d12d892def6f7f0 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Sun, 25 Oct 2020 23:03:35 +0100 Subject: [PATCH 0848/2376] Get "New Release Banner" from TW5-com edition (#4912) * Fix state tiddlers for action-create-tiddlers examples * Get "New Release Banner" from TW5-com edition --- .../de-AT/tiddlers/bilder/New_Release_Banner.png.tid | 6 ------ editions/de-AT/tiddlers/external/tiddlywiki.files | 12 ++++++++++++ .../intro/HelloThumbnail_-_Latest_Version.tid | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) delete mode 100644 editions/de-AT/tiddlers/bilder/New_Release_Banner.png.tid create mode 100644 editions/de-AT/tiddlers/external/tiddlywiki.files diff --git a/editions/de-AT/tiddlers/bilder/New_Release_Banner.png.tid b/editions/de-AT/tiddlers/bilder/New_Release_Banner.png.tid deleted file mode 100644 index 02a927c13..000000000 --- a/editions/de-AT/tiddlers/bilder/New_Release_Banner.png.tid +++ /dev/null @@ -1,6 +0,0 @@ -created: 20150513150058938 -tags: picture -title: New Release Banner.png -type: image/png - -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 \ No newline at end of file diff --git a/editions/de-AT/tiddlers/external/tiddlywiki.files b/editions/de-AT/tiddlers/external/tiddlywiki.files new file mode 100644 index 000000000..0c59b7bc5 --- /dev/null +++ b/editions/de-AT/tiddlers/external/tiddlywiki.files @@ -0,0 +1,12 @@ +{ + "tiddlers": [ + { + "file": "../../../tw5.com/tiddlers/images/New Release Banner.png", + "fields": { + "type": "image/jpg", + "title": "New Release Banner", + "tags": "picture" + } + } + ] +} diff --git a/editions/de-AT/tiddlers/intro/HelloThumbnail_-_Latest_Version.tid b/editions/de-AT/tiddlers/intro/HelloThumbnail_-_Latest_Version.tid index e453a44db..ecc127e67 100644 --- a/editions/de-AT/tiddlers/intro/HelloThumbnail_-_Latest_Version.tid +++ b/editions/de-AT/tiddlers/intro/HelloThumbnail_-_Latest_Version.tid @@ -1,7 +1,7 @@ caption: Was ist neu in <<version>> color: #fff created: 20150513145829381 -image: New Release Banner.png +image: New Release Banner link: Releases modified: 20150518143526750 tags: HelloThumbnail From 0ce1843070e6ca39126a69f93e1414d0f4342be2 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 26 Oct 2020 23:58:21 +0700 Subject: [PATCH 0849/2376] Simplify ci-push.sh: end script on any error (#4886) Use the bash -e option to exit on any error, so || exit 1 is not needed. As a bonus, this lets us get the actual return code from any failures. --- bin/ci-push.sh | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/bin/ci-push.sh b/bin/ci-push.sh index 670d2acdf..dff297c80 100755 --- a/bin/ci-push.sh +++ b/bin/ci-push.sh @@ -2,19 +2,14 @@ # Push output back to GitHub +# Exit script immediately if any command fails +set -e -cd output || exit 1 - -git config --global user.email "actions@github.com" || exit 1 - -git config --global user.name "GitHub Actions" || exit 1 - -git add -A . || exit 1 - -git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))" || exit 1 - -git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null || exit 1 - -git push deploy master &>/dev/null || exit 1 - -cd .. || exit 1 +cd output +git config --global user.email "actions@github.com" +git config --global user.name "GitHub Actions" +git add -A . +git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))" +git remote add deploy "https://$GH_TOKEN@github.com/Jermolene/jermolene.github.io.git" &>/dev/null +git push deploy master &>/dev/null +cd .. From 3153c588ecddfdc97cc8289720d36b1fb15ef236 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 26 Oct 2020 17:28:57 +0000 Subject: [PATCH 0850/2376] Disable autosave in the upgrade wizard To address @pmario's suggestion here: https://github.com/Jermolene/TiddlyWiki5/issues/4879#issuecomment-704320381 --- core/modules/saver-handler.js | 2 +- plugins/tiddlywiki/upgrade/config.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/saver-handler.js b/core/modules/saver-handler.js index 44dc130ff..a4b7f4a4e 100644 --- a/core/modules/saver-handler.js +++ b/core/modules/saver-handler.js @@ -153,7 +153,7 @@ SaverHandler.prototype.saveWiki = function(options) { var self = this, method = options.method || "save"; // Ignore autosave if disabled - if(method === "autosave" && this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes") { + if(method === "autosave" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,"yes") !== "yes")) { return false; } var variables = options.variables || {}, diff --git a/plugins/tiddlywiki/upgrade/config.js b/plugins/tiddlywiki/upgrade/config.js index 97d71f9cc..0c50f1fa7 100644 --- a/plugins/tiddlywiki/upgrade/config.js +++ b/plugins/tiddlywiki/upgrade/config.js @@ -20,6 +20,7 @@ exports.synchronous = true; exports.startup = function() { // See $tw.utils.decryptStoreAreaInteractive() in $:/core/modules/utils/crypto.js $tw.config.usePasswordVault = true; + $tw.config.disableAutoSave = true; }; })(); From 83f976ea5485f399b5930b4f82fe93b9ac5b4bb6 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 26 Oct 2020 18:36:50 +0100 Subject: [PATCH 0851/2376] Extended tiddlywiki.files to allow optionally saving changes to a tiddler back to the original file location (#4914) --- boot/boot.js | 10 +++++++--- .../tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 969a8c567..456cceb14 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1824,7 +1824,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) { // Read the specification var filesInfo = JSON.parse(fs.readFileSync(filepath + path.sep + "tiddlywiki.files","utf8")); // Helper to process a file - var processFile = function(filename,isTiddlerFile,fields) { + var processFile = function(filename,isTiddlerFile,fields,isEditableFile) { var extInfo = $tw.config.fileExtensionInfo[path.extname(filename)], type = (extInfo || {}).type || fields.type || "text/plain", typeInfo = $tw.config.contentTypeInfo[type] || {}, @@ -1877,7 +1877,11 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) { } }); }); - tiddlers.push({tiddlers: fileTiddlers}); + if(isEditableFile) { + tiddlers.push({filepath: pathname, hasMetaFile: !!metadata && !isTiddlerFile, tiddlers: fileTiddlers}); + } else { + tiddlers.push({tiddlers: fileTiddlers}); + } }; // Process the listed tiddlers $tw.utils.each(filesInfo.tiddlers,function(tidInfo) { @@ -1907,7 +1911,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) { for(var t=0; t<files.length; t++) { var filename = files[t]; if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) { - processFile(dirPath + path.sep + filename,dirSpec.isTiddlerFile,dirSpec.fields); + processFile(dirPath + path.sep + filename,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile); } } } diff --git a/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid b/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid index 294c8f260..59c9a679d 100644 --- a/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid +++ b/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid @@ -51,6 +51,7 @@ Directory specifications in the `directories` array may take the following forms ** ''path'' - (required) the absolute or relative path to the directory containing the tiddler files (relative paths are interpreted relative to the path of the `tiddlywiki.files` file). Note that the directory is not recursively searched; sub-directories are ignored ** ''filesRegExp'' - (optional) a [[regular expression|https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions]] that matches the filenames of the files that should be processed within the directory ** ''isTiddlerFile'' - (required) if `true`, the file will be treated as a [[tiddler file|TiddlerFiles]] and deserialised to extract the tiddlers. Otherwise, the raw content of the file is assigned to the `text` field without any parsing +** ''isEditableFile'' - (optional) if `true`, changes to the tiddler be saved back to the original file. <<.from-version "5.1.23">> ** ''fields'' - (required) an object containing values that override or customise the fields provided in the tiddler file (see above) Fields can be overridden for particular files by creating a file with the same name plus the suffix `.meta` -- see TiddlerFiles. From 4c6de2271124fc3a4b01e4324a0d5e401500cca2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 26 Oct 2020 17:47:19 +0000 Subject: [PATCH 0852/2376] Recognise the image/jpg content type, even though it's not really legal Browsers also respect it. Fixes #4571 --- boot/boot.js | 1 + 1 file changed, 1 insertion(+) diff --git a/boot/boot.js b/boot/boot.js index 456cceb14..80032b4f5 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2264,6 +2264,7 @@ $tw.boot.initStartup = function(options) { $tw.utils.registerFileType("application/zip","base64",".zip"); $tw.utils.registerFileType("application/x-zip-compressed","base64",".zip"); $tw.utils.registerFileType("image/jpeg","base64",[".jpg",".jpeg"],{flags:["image"]}); + $tw.utils.registerFileType("image/jpg","base64",[".jpg",".jpeg"],{flags:["image"]}); $tw.utils.registerFileType("image/png","base64",".png",{flags:["image"]}); $tw.utils.registerFileType("image/gif","base64",".gif",{flags:["image"]}); $tw.utils.registerFileType("image/webp","base64",".webp",{flags:["image"]}); From aa7a00d080da0179c7c6dbf6a1ab1f7de8efa55c Mon Sep 17 00:00:00 2001 From: Rob Hoelz <rob@hoelz.ro> Date: Mon, 26 Oct 2020 12:52:25 -0500 Subject: [PATCH 0853/2376] Add eslint plus very tolerant starting config (#4872) * Add eslint plus very tolerant starting config Addresses GH #1865 This adds eslint as a developer dependency, plus a generated eslint config that doesn't take a very strong stance on much of anything. The goal here to get started using automated style checking, add eslint checking to the testing flow, and gradually introduce stricter checks over time. * eslint: Fix ecmaVersion See https://github.com/Jermolene/TiddlyWiki5/pull/4421#issuecomment-587002325, where @Jermolene declared TiddlyWiki targets EcmaScript 5 --- .eslintignore | 15 +++ .eslintrc.yml | 267 ++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +- 3 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.yml diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..30a0dae7c --- /dev/null +++ b/.eslintignore @@ -0,0 +1,15 @@ +# Known minified files +/boot/sjcl.js +/core/modules/utils/base64-utf8/base64-utf8.module.min.js +/core/modules/utils/diff-match-patch/diff_match_patch.js +/plugins/tiddlywiki/async/files/async.min.v1.5.0.js +/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/anyword-hint.js +/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/css-hint.js +/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/html-hint.js +/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/javascript-hint.js +/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.js +/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/xml-hint.js +/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/closebrackets.js +/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/matchbrackets.js +/plugins/tiddlywiki/codemirror-closetag/files/addon/edit/closetag.js +/plugins/tiddlywiki/codemirror-closetag/files/addon/fold/xml-fold.js diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 000000000..105ca829e --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,267 @@ +env: + browser: true + commonjs: true + es2021: true + node: true +extends: 'eslint:recommended' +globals: + "$tw": "writable" # temporary +parserOptions: + ecmaVersion: 5 +rules: + array-bracket-newline: 'off' + array-bracket-spacing: 'off' + array-callback-return: 'off' + array-element-newline: 'off' + arrow-body-style: error + arrow-parens: + - error + - as-needed + arrow-spacing: + - error + - after: true + before: true + block-scoped-var: 'off' + block-spacing: 'off' + brace-style: 'off' + callback-return: 'off' + camelcase: 'off' + capitalized-comments: 'off' + class-methods-use-this: error + comma-dangle: 'off' + comma-spacing: 'off' + comma-style: 'off' + complexity: 'off' + computed-property-spacing: 'off' + consistent-return: 'off' + consistent-this: 'off' + curly: 'off' + default-case: 'off' + default-case-last: error + default-param-last: error + dot-location: 'off' + dot-notation: 'off' + eol-last: 'off' + eqeqeq: 'off' + func-call-spacing: 'off' + func-name-matching: 'off' + func-names: 'off' + func-style: 'off' + function-call-argument-newline: 'off' + function-paren-newline: 'off' + generator-star-spacing: error + global-require: 'off' + grouped-accessor-pairs: error + guard-for-in: 'off' + handle-callback-err: 'off' + id-blacklist: error + id-denylist: error + id-length: 'off' + id-match: error + implicit-arrow-linebreak: error + indent: 'off' + indent-legacy: 'off' + init-declarations: 'off' + jsx-quotes: error + key-spacing: 'off' + keyword-spacing: 'off' + line-comment-position: 'off' + linebreak-style: 'off' + lines-around-comment: 'off' + lines-around-directive: 'off' + lines-between-class-members: error + max-classes-per-file: error + max-depth: 'off' + max-len: 'off' + max-lines: 'off' + max-lines-per-function: 'off' + max-nested-callbacks: error + max-params: 'off' + max-statements: 'off' + max-statements-per-line: 'off' + multiline-comment-style: 'off' + multiline-ternary: 'off' + new-parens: 'off' + newline-after-var: 'off' + newline-before-return: 'off' + newline-per-chained-call: 'off' + no-alert: 'off' + no-array-constructor: 'off' + no-await-in-loop: error + no-bitwise: 'off' + no-buffer-constructor: 'off' + no-caller: error + no-catch-shadow: 'off' + no-confusing-arrow: error + no-console: 'off' + no-constant-condition: + - error + - checkLoops: false + no-constructor-return: error + no-continue: 'off' + no-div-regex: 'off' + no-duplicate-imports: error + no-else-return: 'off' + no-empty-function: 'off' + no-eq-null: 'off' + no-eval: 'off' + no-extend-native: 'off' + no-extra-bind: 'off' + no-extra-label: 'off' + no-extra-parens: 'off' + no-floating-decimal: 'off' + no-implicit-coercion: + - error + - boolean: false + number: false + string: false + no-implicit-globals: 'off' + no-implied-eval: error + no-inline-comments: 'off' + no-invalid-this: 'off' + no-iterator: error + no-label-var: 'off' + no-labels: 'off' + no-lone-blocks: 'off' + no-lonely-if: 'off' + no-loop-func: 'off' + no-loss-of-precision: error + no-magic-numbers: 'off' + no-mixed-operators: 'off' + no-mixed-requires: 'off' + no-multi-assign: 'off' + no-multi-spaces: 'off' + no-multi-str: error + no-multiple-empty-lines: 'off' + no-native-reassign: 'off' + no-negated-condition: 'off' + no-negated-in-lhs: error + no-nested-ternary: 'off' + no-new: 'off' + no-new-func: 'off' + no-new-object: 'off' + no-new-require: error + no-new-wrappers: error + no-octal-escape: error + no-param-reassign: 'off' + no-path-concat: error + no-plusplus: 'off' + no-process-env: 'off' + no-process-exit: 'off' + no-promise-executor-return: error + no-proto: 'off' + no-restricted-exports: error + no-restricted-globals: error + no-restricted-imports: error + no-restricted-modules: error + no-restricted-properties: error + no-restricted-syntax: error + no-return-assign: 'off' + no-return-await: error + no-script-url: 'off' + no-self-compare: 'off' + no-sequences: 'off' + no-shadow: 'off' + no-spaced-func: 'off' + no-sync: 'off' + no-tabs: 'off' + no-template-curly-in-string: error + no-ternary: 'off' + no-throw-literal: 'off' + no-trailing-spaces: 'off' + no-undef-init: 'off' + no-undefined: 'off' + no-underscore-dangle: 'off' + no-unmodified-loop-condition: 'off' + no-unneeded-ternary: 'off' + no-unreachable-loop: error + no-unused-expressions: 'off' + no-use-before-define: 'off' + no-useless-backreference: error + no-useless-call: 'off' + no-useless-computed-key: error + no-useless-concat: 'off' + no-useless-constructor: error + no-useless-rename: error + no-useless-return: 'off' + no-var: 'off' + no-void: 'off' + no-warning-comments: 'off' + no-whitespace-before-property: error + nonblock-statement-body-position: + - error + - any + object-curly-newline: 'off' + object-curly-spacing: 'off' + object-property-newline: 'off' + object-shorthand: 'off' + one-var: 'off' + one-var-declaration-per-line: 'off' + operator-assignment: 'off' + operator-linebreak: 'off' + padded-blocks: 'off' + padding-line-between-statements: error + prefer-arrow-callback: 'off' + prefer-const: 'off' + prefer-destructuring: 'off' + prefer-exponentiation-operator: 'off' + prefer-named-capture-group: 'off' + prefer-numeric-literals: error + prefer-object-spread: 'off' + prefer-promise-reject-errors: error + prefer-reflect: 'off' + prefer-regex-literals: 'off' + prefer-rest-params: 'off' + prefer-spread: 'off' + prefer-template: 'off' + quote-props: 'off' + quotes: 'off' + radix: 'off' + require-atomic-updates: error + require-await: error + require-jsdoc: 'off' + require-unicode-regexp: 'off' + rest-spread-spacing: error + semi: 'off' + semi-spacing: 'off' + semi-style: 'off' + sort-imports: error + sort-keys: 'off' + sort-vars: 'off' + space-before-blocks: 'off' + space-before-function-paren: 'off' + space-in-parens: 'off' + space-infix-ops: 'off' + space-unary-ops: 'off' + spaced-comment: 'off' + strict: 'off' + switch-colon-spacing: 'off' + symbol-description: error + template-curly-spacing: error + template-tag-spacing: error + unicode-bom: + - error + - never + valid-jsdoc: 'off' + valid-typeof: + - error + - requireStringLiterals: false + vars-on-top: 'off' + wrap-iife: 'off' + wrap-regex: 'off' + yield-star-spacing: error + yoda: 'off' + + # temporary rules + no-useless-escape: 'off' + no-unused-vars: 'off' + no-empty: 'off' + no-extra-semi: 'off' + no-redeclare: 'off' + no-control-regex: "off" + no-mixed-spaces-and-tabs: "off" + no-extra-boolean-cast: "off" + no-prototype-builtins: "off" + no-undef: "off" + no-unreachable: "off" + no-self-assign: "off" diff --git a/package.json b/package.json index 5d93e5274..ff7af3897 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,9 @@ "wiki" ], "dependencies": {}, - "devDependencies": {}, + "devDependencies": { + "eslint": "^7.10.0" + }, "bundleDependencies": [], "license": "BSD", "engines": { From f6938d6abbce6a9b3cd99be96ed549d59891075f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 26 Oct 2020 18:36:46 +0000 Subject: [PATCH 0854/2376] Fix external-attachments plugin relative path bug Fixes #4549 --- .../external-attachments/startup.js | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/plugins/tiddlywiki/external-attachments/startup.js b/plugins/tiddlywiki/external-attachments/startup.js index 4967921c5..9478c6e2a 100644 --- a/plugins/tiddlywiki/external-attachments/startup.js +++ b/plugins/tiddlywiki/external-attachments/startup.js @@ -94,7 +94,7 @@ function makePathRelative(sourcepath,rootpath,options) { return sourcepath; } // Move up a directory for each directory left in the root - for(p = c; p < rootParts.length; p++) { + for(p = c; p < rootParts.length - 1; p++) { outputParts.push(".."); } // Add on the remaining parts of the source path @@ -106,19 +106,22 @@ function makePathRelative(sourcepath,rootpath,options) { function test_makePathRelative() { var test = function(sourcepath,rootpath,result,options) { - if(makePathRelative(sourcepath,rootpath,options) !== result) { - throw "makePathRelative test failed: makePathRelative(" + sourcepath + "," + rootpath + "," + JSON.stringify(options) + ") is not equal to " + result; + var actualResult = makePathRelative(sourcepath,rootpath,options); + if(actualResult !== result) { + console.log("makePathRelative test failed: makePathRelative(" + sourcepath + "," + rootpath + "," + JSON.stringify(options) + ") is " + actualResult + " and not equal to " + result); } }; - test("/Users/me/something/file.png","/Users/you/something","../../me/something/file.png"); - test("/Users/me/something/file.png","/Users/you/something","/Users/me/something/file.png",{useAbsoluteForNonDescendents: true}); - test("/Users/me/something/else/file.png","/Users/me/something","else/file.png"); - test("/Users/me/something/file.png","/Users/me/something/new","../file.png"); - test("/Users/me/something/file.png","/Users/me/something/new","/Users/me/something/file.png",{useAbsoluteForNonDescendents: true}); - test("/Users/me/something/file.png","/Users/me/something","file.png"); - test("C:\\Users\\me\\something\\file.png","/C:/Users/me/something","file.png",{isWindows: true}); - test("\\\\SHARE\\Users\\me\\something\\file.png","/SHARE/Users/me/somethingelse","../something/file.png",{isWindows: true}); - test("\\\\SHARE\\Users\\me\\something\\file.png","/C:/Users/me/something","/SHARE/Users/me/something/file.png",{isWindows: true}); + test("/Users/me/something/file.png","/Users/you/something/index.html","../../me/something/file.png"); + test("/Users/me/something/file.png","/Users/you/something/index.html","/Users/me/something/file.png",{useAbsoluteForNonDescendents: true}); + test("/Users/me/something/else/file.png","/Users/me/something/index.html","else/file.png"); + test("/Users/me/something/file.png","/Users/me/something/new/index.html","../file.png"); + test("/Users/me/something/file.png","/Users/me/something/new/index.html","/Users/me/something/file.png",{useAbsoluteForNonDescendents: true}); + test("/Users/me/something/file.png","/Users/me/something/index.html","file.png"); + test("/Users/jeremyruston/Downloads/Screenshot 2020-10-18 at 15.33.40.png","/Users/jeremyruston/git/Jermolene/TiddlyWiki5/editions/prerelease/output/index.html","../../../../../../Downloads/Screenshot%202020-10-18%20at%2015.33.40.png"); + test("/Users/me/nothing/image.png","/Users/me/something/a/b/c/d/e/index.html","../../../../../../nothing/image.png"); + test("C:\\Users\\me\\something\\file.png","/C:/Users/me/something/index.html","file.png",{isWindows: true}); + test("\\\\SHARE\\Users\\me\\something\\file.png","/SHARE/Users/me/somethingelse/index.html","../something/file.png",{isWindows: true}); + test("\\\\SHARE\\Users\\me\\something\\file.png","/C:/Users/me/something/index.html","/SHARE/Users/me/something/file.png",{isWindows: true}); } From 3843c61132bfe45dfe5ecfbdf77892caa3bb84f9 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 27 Oct 2020 10:03:34 +0100 Subject: [PATCH 0855/2376] Add ability to cycle Advanced-search tabs by keyboard ... (#4909) * Update AdvancedSearch.tid * Update System.tid * Update Standard.tid * Update Filter.tid * Update Shadows.tid * Update search.tid * Update shortcuts.multids * Update ShortcutInfo.multids * Update Misc.multids * Update ShortcutInfo.multids * Update search.tid --- core/language/en-GB/Misc.multids | 1 + core/ui/AdvancedSearch.tid | 2 +- core/ui/AdvancedSearch/Filter.tid | 6 ++++++ core/ui/AdvancedSearch/Shadows.tid | 5 +++++ core/ui/AdvancedSearch/Standard.tid | 5 +++++ core/ui/AdvancedSearch/System.tid | 5 +++++ core/ui/SideBarSegments/search.tid | 8 +++++--- core/wiki/config/ShortcutInfo.multids | 1 + core/wiki/config/shortcuts/shortcuts.multids | 1 + 9 files changed, 30 insertions(+), 4 deletions(-) diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 3ef0f5dc2..14e353689 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -63,6 +63,7 @@ OfficialPluginLibrary: Official ~TiddlyWiki Plugin Library OfficialPluginLibrary/Hint: The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. PluginReloadWarning: Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect RecentChanges/DateFormat: DDth MMM YYYY +Shortcuts/Input/AdvancedSearch/Hint: Open the AdvancedSearch panel from within the sidebar search field Shortcuts/Input/Accept/Hint: Accept the selected item Shortcuts/Input/AcceptVariant/Hint: Accept the selected item (variant) Shortcuts/Input/Cancel/Hint: Clear the input field diff --git a/core/ui/AdvancedSearch.tid b/core/ui/AdvancedSearch.tid index e7b4827e3..38982c002 100644 --- a/core/ui/AdvancedSearch.tid +++ b/core/ui/AdvancedSearch.tid @@ -3,5 +3,5 @@ icon: $:/core/images/advanced-search-button color: #bbb <div class="tc-advanced-search"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]" "$:/core/ui/AdvancedSearch/System">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]" default="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<currentTab>>/>""" explicitState="$:/state/tab/advanced-search-results"/> </div> diff --git a/core/ui/AdvancedSearch/Filter.tid b/core/ui/AdvancedSearch/Filter.tid index 55de251d6..e55e9e03b 100644 --- a/core/ui/AdvancedSearch/Filter.tid +++ b/core/ui/AdvancedSearch/Filter.tid @@ -3,10 +3,16 @@ tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/Filter/Caption}} \define lingo-base() $:/language/Search/ +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> +<$linkcatcher to="$:/temp/advancedsearch"> <<lingo Filter/Hint>> <div class="tc-search tc-advanced-search"> +<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +</$keyboard> +</$keyboard> <$list filter="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]"><$transclude/></$list> </div> diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index 9dcf5d67e..3a220d1a8 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -3,12 +3,17 @@ tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/Shadows/Caption}} \define lingo-base() $:/language/Search/ +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> <$linkcatcher to="$:/temp/advancedsearch"> <<lingo Shadows/Hint>> <div class="tc-search"> +<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +</$keyboard> +</$keyboard> <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> <$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index 99b597205..e88471a3c 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -3,12 +3,17 @@ tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/Standard/Caption}} \define lingo-base() $:/language/Search/ +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> <$linkcatcher to="$:/temp/advancedsearch"> <<lingo Standard/Hint>> <div class="tc-search"> +<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +</$keyboard> +</$keyboard> <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> <$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index c74bb26e4..ef7326699 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -3,12 +3,17 @@ tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/System/Caption}} \define lingo-base() $:/language/Search/ +\define set-next-input-tab(beforeafter:"after",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> <$linkcatcher to="$:/temp/advancedsearch"> <<lingo System/Hint>> <div class="tc-search"> +<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +</$keyboard> +</$keyboard> <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> <$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 6064fd69e..ee2d03928 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -42,6 +42,8 @@ tags: $:/tags/SideBarSegment \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> +\define advanced-search-actions() <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to="$:/AdvancedSearch"/> + <div class="tc-sidebar-lists tc-sidebar-search"> <$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> @@ -49,6 +51,7 @@ tags: $:/tags/SideBarSegment <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> +<$keyboard key="((advanced-search-sidebar))" actions=<<advanced-search-actions>>> <$macrocall $name="keyboard-driven-input" tiddler="$:/temp/search" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> @@ -57,11 +60,10 @@ tags: $:/tags/SideBarSegment inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups="yes" /> </$keyboard> </$keyboard> +</$keyboard> <$reveal state=<<searchTiddler>> type="nomatch" text=""> <$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="tc-btn-invisible"> -<$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search}}/> -<<delete-state-tiddlers>> -<$action-navigate $to="$:/AdvancedSearch"/> +<<advanced-search-actions>> {{$:/core/images/advanced-search-button}} </$button> <$button class="tc-btn-invisible"> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index bb892bdff..59fd4e305 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -2,6 +2,7 @@ title: $:/config/ShortcutInfo/ add-field: {{$:/language/EditTemplate/Fields/Add/Button/Hint}} advanced-search: {{$:/language/Buttons/AdvancedSearch/Hint}} +advanced-search-sidebar: {{$:/language/Shortcuts/Input/AdvancedSearch/Hint}} bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} excise: {{$:/language/Buttons/Excise/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index fe6257497..ca95900f1 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -2,6 +2,7 @@ title: $:/config/shortcuts/ add-field: enter advanced-search: ctrl-shift-A +advanced-search-sidebar: ctrl-Enter cancel-edit-tiddler: escape excise: ctrl-E sidebar-search: ctrl-shift-F From c9efa23f021d68ef0d004a9844caef8dfa02cd1a Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 27 Oct 2020 13:24:18 +0100 Subject: [PATCH 0856/2376] Named filter run prefixes (#4915) * First pass at refactoring filter code to support named filter run prefixes * Remove filter prefix for now * renamed module type and filter run prefixes * Moved inline handling for no filter run prefix to 'or' filter run prefix. * Added error handling for undefined filter run prefixes --- core/language/en-GB/Misc.multids | 1 + core/modules/filterrunprefixes/all.js | 25 +++++++++++ core/modules/filterrunprefixes/and.js | 28 ++++++++++++ core/modules/filterrunprefixes/else.js | 27 +++++++++++ core/modules/filterrunprefixes/except.js | 25 +++++++++++ core/modules/filterrunprefixes/or.js | 24 ++++++++++ core/modules/filters.js | 57 +++++++++++++----------- 7 files changed, 161 insertions(+), 26 deletions(-) create mode 100644 core/modules/filterrunprefixes/all.js create mode 100644 core/modules/filterrunprefixes/and.js create mode 100644 core/modules/filterrunprefixes/else.js create mode 100644 core/modules/filterrunprefixes/except.js create mode 100644 core/modules/filterrunprefixes/or.js diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 14e353689..bc1091910 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -26,6 +26,7 @@ Error/Caption: Error Error/EditConflict: File changed on server Error/Filter: Filter error Error/FilterSyntax: Syntax error in filter expression +Error/FilterRunPrefix: Filter Error: Unknown prefix for filter run Error/IsFilterOperator: Filter Error: Unknown operand for the 'is' filter operator Error/FormatFilterOperator: Filter Error: Unknown suffix for the 'format' filter operator Error/LoadingPluginLibrary: Error loading plugin library diff --git a/core/modules/filterrunprefixes/all.js b/core/modules/filterrunprefixes/all.js new file mode 100644 index 000000000..2e25bbc4d --- /dev/null +++ b/core/modules/filterrunprefixes/all.js @@ -0,0 +1,25 @@ +/*\ +title: $:/core/modules/filterrunprefixes/all.js +type: application/javascript +module-type: filterrunprefix + +Union of sets without de-duplication. +Equivalent to = filter run prefix. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.all = function(operationSubFunction) { + return function(results,source,widget) { + Array.prototype.push.apply(results,operationSubFunction(source,widget)); + }; +}; + +})(); diff --git a/core/modules/filterrunprefixes/and.js b/core/modules/filterrunprefixes/and.js new file mode 100644 index 000000000..29ccf1619 --- /dev/null +++ b/core/modules/filterrunprefixes/and.js @@ -0,0 +1,28 @@ +/*\ +title: $:/core/modules/filterrunprefixes/and.js +type: application/javascript +module-type: filterrunprefix + +Intersection of sets. +Equivalent to + filter run prefix. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.and = function(operationSubFunction) { + return function(results,source,widget) { + // This replaces all the elements of the array, but keeps the actual array so that references to it are preserved + source = $tw.wiki.makeTiddlerIterator(results); + results.splice(0,results.length); + $tw.utils.pushTop(results,operationSubFunction(source,widget)); + }; +}; + +})(); diff --git a/core/modules/filterrunprefixes/else.js b/core/modules/filterrunprefixes/else.js new file mode 100644 index 000000000..c39b9e8fe --- /dev/null +++ b/core/modules/filterrunprefixes/else.js @@ -0,0 +1,27 @@ +/*\ +title: $:/core/modules/filterrunprefixes/else.js +type: application/javascript +module-type: filterrunprefix + +Equivalent to ~ filter run prefix. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.else = function(operationSubFunction) { + return function(results,source,widget) { + if(results.length === 0) { + // Main result so far is empty + $tw.utils.pushTop(results,operationSubFunction(source,widget)); + } + }; +}; + +})(); diff --git a/core/modules/filterrunprefixes/except.js b/core/modules/filterrunprefixes/except.js new file mode 100644 index 000000000..18d649627 --- /dev/null +++ b/core/modules/filterrunprefixes/except.js @@ -0,0 +1,25 @@ +/*\ +title: $:/core/modules/filterrunprefixes/except.js +type: application/javascript +module-type: filterrunprefix + +Difference of sets. +Equivalent to - filter run prefix. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.except = function(operationSubFunction) { + return function(results,source,widget) { + $tw.utils.removeArrayEntries(results,operationSubFunction(source,widget)); + }; +}; + +})(); diff --git a/core/modules/filterrunprefixes/or.js b/core/modules/filterrunprefixes/or.js new file mode 100644 index 000000000..5192f490b --- /dev/null +++ b/core/modules/filterrunprefixes/or.js @@ -0,0 +1,24 @@ +/*\ +title: $:/core/modules/filterrunprefixes/or.js +type: application/javascript +module-type: filterrunprefix + +Equivalent to a filter run with no prefix. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.or = function(operationSubFunction) { + return function(results,source,widget) { + $tw.utils.pushTop(results,operationSubFunction(source,widget)); + }; +}; + +})(); diff --git a/core/modules/filters.js b/core/modules/filters.js index b00082bd1..6784efae1 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -119,7 +119,7 @@ exports.parseFilter = function(filterString) { p = 0, // Current position in the filter string match; var whitespaceRegExp = /(\s+)/mg, - operandRegExp = /((?:\+|\-|~|=)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg; + operandRegExp = /((?:\+|\-|~|=|\:(\w+))?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg; while(p < filterString.length) { // Skip any whitespace whitespaceRegExp.lastIndex = p; @@ -140,16 +140,19 @@ exports.parseFilter = function(filterString) { }; if(match[1]) { operation.prefix = match[1]; - p++; + p = p + operation.prefix.length; + if(match[2]) { + operation.namedPrefix = match[2]; + } } - if(match[2]) { // Opening square bracket + if(match[3]) { // Opening square bracket p = parseFilterOperation(operation.operators,filterString,p); } else { p = match.index + match[0].length; } - if(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title + if(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title operation.operators.push( - {operator: "title", operand: match[3] || match[4] || match[5]} + {operator: "title", operand: match[4] || match[5] || match[6]} ); } results.push(operation); @@ -166,6 +169,14 @@ exports.getFilterOperators = function() { return this.filterOperators; }; +exports.getFilterRunPrefixes = function() { + if(!this.filterPrefixes) { + $tw.Wiki.prototype.filterRunPrefixes = {}; + $tw.modules.applyMethods("filterrunprefix",this.filterRunPrefixes); + } + return this.filterRunPrefixes; +} + exports.filterTiddlers = function(filterString,widget,source) { var fn = this.compileFilter(filterString); return fn.call(this,source,widget); @@ -241,35 +252,29 @@ exports.compileFilter = function(filterString) { return resultArray; } }; + var filterRunPrefixes = self.getFilterRunPrefixes(); // Wrap the operator functions in a wrapper function that depends on the prefix operationFunctions.push((function() { switch(operation.prefix || "") { case "": // No prefix means that the operation is unioned into the result - return function(results,source,widget) { - $tw.utils.pushTop(results,operationSubFunction(source,widget)); - }; + return filterRunPrefixes["or"](operationSubFunction); case "=": // The results of the operation are pushed into the result without deduplication - return function(results,source,widget) { - Array.prototype.push.apply(results,operationSubFunction(source,widget)); - }; + return filterRunPrefixes["all"](operationSubFunction); case "-": // The results of this operation are removed from the main result - return function(results,source,widget) { - $tw.utils.removeArrayEntries(results,operationSubFunction(source,widget)); - }; + return filterRunPrefixes["except"](operationSubFunction); case "+": // This operation is applied to the main results so far - return function(results,source,widget) { - // This replaces all the elements of the array, but keeps the actual array so that references to it are preserved - source = self.makeTiddlerIterator(results); - results.splice(0,results.length); - $tw.utils.pushTop(results,operationSubFunction(source,widget)); - }; + return filterRunPrefixes["and"](operationSubFunction); case "~": // This operation is unioned into the result only if the main result so far is empty - return function(results,source,widget) { - if(results.length === 0) { - // Main result so far is empty - $tw.utils.pushTop(results,operationSubFunction(source,widget)); - } - }; + return filterRunPrefixes["else"](operationSubFunction); + default: + if(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) { + return filterRunPrefixes[operation.namedPrefix](operationSubFunction); + } else { + return function(results,source,widget) { + results.splice(0,results.length); + results.push($tw.language.getString("Error/FilterRunPrefix")); + }; + } } })()); }); From 9eec6ff915a5ad4b961be68867b68a1afad5196c Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 27 Oct 2020 12:32:06 +0000 Subject: [PATCH 0857/2376] Update path-prefix docs Addressing @OblivionSY's comment https://github.com/Jermolene/TiddlyWiki5/issues/4898#issuecomment-717207456 --- .../webserver/WebServer Parameter_ path-prefix.tid | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid index 365407a65..4a0b4dc86 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ path-prefix.tid @@ -1,6 +1,6 @@ caption: path-prefix created: 20180630180514893 -modified: 20200311171847360 +modified: 20201027122943281 tags: [[WebServer Parameters]] title: WebServer Parameter: path-prefix type: text/vnd.tiddlywiki @@ -13,4 +13,7 @@ This example causes the server to serve from http://127.0.0.1/MyApp instead of t tiddlywiki mywikifolder --listen "path-prefix=/MyApp" ``` -Note that further steps are required to configure the client-side components to use the prefix. See [[Using a custom path prefix with the client-server edition]]. \ No newline at end of file +Notes: + +* Further steps are required to configure the client-side components to use the prefix. See [[Using a custom path prefix with the client-server edition]] +* If no path prefix is required then the `path-prefix` parameter should be omitted or set to the empty string, and not to `\` as might be expected From 972456ca072c4f687d7c6e91fce08768ee78063f Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 27 Oct 2020 17:48:40 +0100 Subject: [PATCH 0858/2376] Add new 'filter' prefix for filter runs (#4918) --- core/modules/filterrunprefixes/filter.js | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 core/modules/filterrunprefixes/filter.js diff --git a/core/modules/filterrunprefixes/filter.js b/core/modules/filterrunprefixes/filter.js new file mode 100644 index 000000000..726732c8e --- /dev/null +++ b/core/modules/filterrunprefixes/filter.js @@ -0,0 +1,31 @@ +/*\ +title: $:/core/modules/filterrunprefixes/filter.js +type: application/javascript +module-type: filterrunprefix + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.filter = function(operationSubFunction) { + return function(results,source,widget) { + if(results.length > 0) { + var resultsToRemove = []; + $tw.utils.each(results,function(result) { + var filtered = operationSubFunction($tw.wiki.makeTiddlerIterator([result]),widget); + if(filtered.length === 0) { + resultsToRemove.push(result); + } + }); + $tw.utils.removeArrayEntries(results,resultsToRemove); + } + } +}; + +})(); From d0081a7247af9ecc834b67b8a36c3f4d448a1574 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 27 Oct 2020 17:49:56 +0100 Subject: [PATCH 0859/2376] Updated Filter docs for named filter run prefixes (#4917) --- .../tiddlers/filters/syntax/Filter Expression.tid | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index a01aa56ec..c78066833 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20190610165329062 +modified: 20201027134811701 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -21,15 +21,16 @@ If a run has: * the prefix `-`, output titles are <<.em removed>> from the filter's output (if such tiddlers exist) * the prefix `+`, it receives the filter output so far as its input; its output then <<.em "replaces">> all filter ouput so far and forms the input for the next run * <<.from-version "5.1.18">> the prefix `~`, if the filter output so far is an empty list then the output titles of the run are [[dominantly appended|Dominant Append]] to the filter's output. If the filter output so far is not an empty list then the run is ignored +* <<.from-version "5.1.23">> named prefixes for filter runs are available. In technical / logical terms: -|!Run |!Interpretation |!Output | -|`run` |de-duplicated union of sets |... OR run | -|`=run` |union of sets without de-duplication |... OR run | -|`+run` |intersection of sets |... AND run | -|`-run` |difference of sets |... AND NOT run | -|`~run` |else |... ELSE run | +|!Run |!Equivalent named prefix |!Interpretation |!Output | +|`run` |`:or[run]` |de-duplicated union of sets |... OR run | +|`=run` |`:all[run]` |union of sets without de-duplication |... OR run | +|`+run` |`:and[run]` |intersection of sets |... AND run | +|`-run` |`:except[run]` |difference of sets |... AND NOT run | +|`~run` |`:else[run]` |else |... ELSE run | The input of a run is normally a list of all the non-[[shadow|ShadowTiddlers]] tiddler titles in the wiki (in no particular order). But the `+` prefix can change this: From e43ffe860bb225ca5ccada65fdb757e0b116e128 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 27 Oct 2020 18:33:06 +0100 Subject: [PATCH 0860/2376] Fix #4910 - "Editor link dropdown is broken in pre-release." (#4913) * fix #4910 in sidebarsegments/search * fix #4910 in editortoolbar/link-dropdown * fix #4910 in keyboard-driven-input macro * Update keyboard-driven-input_Macro.tid * Fix #4910 in tag-picker macro * Update tag-picker.tid --- core/ui/EditorToolbar/link-dropdown.tid | 6 +++++- core/ui/SideBarSegments/search.tid | 17 +++++++---------- core/wiki/macros/keyboard-driven-input.tid | 8 ++++++-- core/wiki/macros/tag-picker.tid | 12 +++++++----- .../macros/keyboard-driven-input_Macro.tid | 5 ++--- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/core/ui/EditorToolbar/link-dropdown.tid b/core/ui/EditorToolbar/link-dropdown.tid index c9c1989b6..671796ce4 100644 --- a/core/ui/EditorToolbar/link-dropdown.tid +++ b/core/ui/EditorToolbar/link-dropdown.tid @@ -37,8 +37,12 @@ title: $:/core/ui/EditorToolbar/link-dropdown <$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>> +<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}> + {{$:/core/ui/SearchResults}} +</$vars> + </$linkcatcher> </$reveal> @@ -47,4 +51,4 @@ title: $:/core/ui/EditorToolbar/link-dropdown \end -<$macrocall $name="body" config-title=<<qualify "$:/state/Link/">>/> \ No newline at end of file +<$macrocall $name="body" config-title=<<qualify "$:/state/Link/">>/> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index ee2d03928..a4c645168 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -19,17 +19,17 @@ tags: $:/tags/SideBarSegment \define search-results-list() \whitespace trim -<$set name="userInput" value={{$(searchTiddler)$}}> +<$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}> <$list filter="[<userInput>minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$tiddler tiddler="$(configTiddler)$"> +<$tiddler tiddler=<<configTiddler>>> {{$:/core/ui/SearchResults}} </$tiddler> </$list> -</$set> +</$vars> \end \define delete-state-tiddlers() <$action-deletetiddler $filter="[[$:/temp/search]] [<searchTiddler>] [<searchListState>]"/> @@ -46,8 +46,7 @@ tags: $:/tags/SideBarSegment <div class="tc-sidebar-lists tc-sidebar-search"> -<$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> -<$vars titleSearchFilter={{{ [<configTiddler>get[first-search-filter]] }}} allSearchFilter={{{ [<configTiddler>get[second-search-filter]] }}}> +<$vars searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> @@ -55,9 +54,9 @@ tags: $:/tags/SideBarSegment <$macrocall $name="keyboard-driven-input" tiddler="$:/temp/search" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> - class="tc-popup-handle" primaryListFilter=<<titleSearchFilter>> secondaryListFilter=<<allSearchFilter>> - filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> - inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups="yes" /> + class="tc-popup-handle" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> + inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups="yes" + configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]"/> </$keyboard> </$keyboard> </$keyboard> @@ -91,6 +90,4 @@ tags: $:/tags/SideBarSegment </$vars> -</$vars> - </div> diff --git a/core/wiki/macros/keyboard-driven-input.tid b/core/wiki/macros/keyboard-driven-input.tid index 98167f3ac..a2ce713da 100644 --- a/core/wiki/macros/keyboard-driven-input.tid +++ b/core/wiki/macros/keyboard-driven-input.tid @@ -24,7 +24,9 @@ $actions$ \define input-next-actions(afterOrBefore:"after",reverse:"") <$list filter="[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]" variable="ignore"> <$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}> -<$set name="filteredList" filter="[subfilter<__primaryListFilter__>addsuffix[-primaryList]] =[subfilter<__secondaryListFilter__>addsuffix[-secondaryList]]"> +<$set name="configTiddler" value={{{ [subfilter<__configTiddlerFilter__>] }}}> +<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]] }}}> +<$set name="filteredList" filter="[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]"> <$set name="nextItem" value={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}}> <$list filter="[<nextItem>minlength[1]]"> <$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/> @@ -39,10 +41,12 @@ $actions$ </$set> </$set> </$vars> +</$set> +</$vars> </$list> \end -\define keyboard-driven-input(tiddler,storeTitle,field:"text",index:"",tag:"input",type,focus:"",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:"",default:"",class,primaryListFilter,secondaryListFilter,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:"0",refreshTitle,selectionStateTitle,cancelPopups:"") +\define keyboard-driven-input(tiddler,storeTitle,field:"text",index:"",tag:"input",type,focus:"",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:"",default:"",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:"0",refreshTitle,selectionStateTitle,cancelPopups:"",configTiddlerFilter) <$keyboard key="((input-accept))" actions=<<__inputAcceptActions__>>> <$keyboard key="((input-accept-variant))" actions=<<__inputAcceptVariantActions__>>> <$keyboard key="((input-up))" actions=<<input-next-actions "before" "reverse[]">>> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 283c81e3b..f3d71c642 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -1,5 +1,7 @@ title: $:/core/macros/tag-picker tags: $:/tags/Macro +first-search-filter: [tags[]!is[system]search:title<userInput>sort[]] +second-search-filter: [tags[]is[system]search:title<userInput>sort[]] \define delete-tag-state-tiddlers() <$action-deletetiddler $filter="[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]"/> @@ -38,11 +40,11 @@ $actions$ <div> <span class="tc-add-tag-name"> <$macrocall $name="keyboard-driven-input" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> - selectionStateTitle=<<tagSelectionState>> primaryListFilter=<<nonSystemTagsFilter>> secondaryListFilter=<<systemTagsFilter>> - inputAcceptActions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>>/>""" inputCancelActions=<<clear-tags-actions>> tag="input" - placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> - class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} - filterMinLength={{$:/config/Tags/MinLength}} cancelPopups=<<cancelPopups>> /> + selectionStateTitle=<<tagSelectionState>> inputAcceptActions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>>/>""" + inputCancelActions=<<clear-tags-actions>> tag="input" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} + focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> + focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} + cancelPopups=<<cancelPopups>> configTiddlerFilter="[[$:/core/macros/tag-picker]]"/> </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> <span class="tc-add-tag-button"> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> <$button set=<<newTagNameTiddler>> setTo="" class=""> diff --git a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid index b32084802..fc4bfaa6b 100644 --- a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid +++ b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid @@ -9,12 +9,11 @@ To create the input field or textarea, the <<.def keyboard-driven-input>> [[macr The additional parameters are: -| |purpose |h +|parameter |purpose |h |storeTitle |the title of the tiddler that stores the user input | |selectionStateTitle |the title of the tiddler that stores the selected entry with a -primaryList or -secondaryList suffix to make it unique | |inputAcceptActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept}}</kbd> | |inputAcceptVariantActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept-variant}}</kbd> | |inputCancelActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-cancel}}</kbd> | -|primaryListFilter |a filter that specifies the first item-list | -|secondaryListFilter |a second filter that specifies a second item-list | +|configTiddlerFilter |a ''filter'' that specifies the tiddler that stores the first item-filter in its <<.field first-search-filter>> field and the second item-filter in its <<.field second-search-filter>> field | From 81e3ab0bc5d79a725b73d8dfa125356adac0c204 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 11:53:41 +0100 Subject: [PATCH 0861/2376] Make AdvancedSearch/Standard, AdvancedSearch/System and AdvancedSearch/Shadows navigatable by keyboard (#4925) * Make AdvancedSearch/Shadows navigatable by keyboard * Make AdvancedSearch/System navigatable by keyboard * Make AdvancedSearch/Standard navigatable by keyboard * Update search.tid --- core/ui/AdvancedSearch/Shadows.tid | 33 ++++++++++++++++++--------- core/ui/AdvancedSearch/Standard.tid | 35 ++++++++++++++++++++--------- core/ui/AdvancedSearch/System.tid | 30 +++++++++++++++++-------- core/ui/SideBarSegments/search.tid | 2 +- 4 files changed, 69 insertions(+), 31 deletions(-) diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index 3a220d1a8..0647b45a4 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -1,40 +1,53 @@ title: $:/core/ui/AdvancedSearch/Shadows tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/Shadows/Caption}} +first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] \define lingo-base() $:/language/Search/ + \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -<$linkcatcher to="$:/temp/advancedsearch"> + +\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> + +\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> + +\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> <<lingo Shadows/Hint>> <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch" storeTitle="$:/temp/advancedsearch/input" + refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" + tag="input" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter="[[$:/core/ui/AdvancedSearch/Shadows]]" + inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> + inputAcceptVariantActions=<<input-accept-variant-actions>> /> </$keyboard> </$keyboard> <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> -<$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/> +<<cancel-search-actions>> {{$:/core/images/close-button}} </$button> </$reveal> </div> -</$linkcatcher> +<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> -<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> +<$list filter="[{$:/temp/advancedsearch/input}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$list filter="[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> - -<$set name="resultCount" value="""<$count filter="[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]"/>"""> +<$set name="resultCount" value="""<$count filter="[all[shadows]search{$:/temp/advancedsearch/input}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]"/>"""> <div class="tc-search-results"> <<lingo Shadows/Matches>> -<$list filter="[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]" template="$:/core/ui/ListItemTemplate"/> +<$list filter="[all[shadows]search{$:/temp/advancedsearch/input}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]"> +<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}> +<$transclude tiddler="$:/core/ui/ListItemTemplate"/> +</span> +</$list> </div> @@ -44,6 +57,6 @@ caption: {{$:/language/Search/Shadows/Caption}} </$reveal> -<$reveal state="$:/temp/advancedsearch" type="match" text=""> +<$reveal state="$:/temp/advancedsearch/input" type="match" text=""> </$reveal> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index e88471a3c..5c91bee28 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -4,36 +4,49 @@ caption: {{$:/language/Search/Standard/Caption}} \define lingo-base() $:/language/Search/ \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -<$linkcatcher to="$:/temp/advancedsearch"> + +\define next-search-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/advancedsearch" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/advancedsearch/standard/currentTab" text=<<nextTab>>/>"""/> + +\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> + +\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> + +\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> <<lingo Standard/Hint>> <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +<$keyboard key="shift-alt-Right" actions=<<next-search-tab>>> +<$keyboard key="shift-alt-Left" actions=<<next-search-tab "before">>> +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch" storeTitle="$:/temp/advancedsearch/input" + refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" + tag="input" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> + inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> + configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]"/> </$keyboard> </$keyboard> -<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> +</$keyboard> +</$keyboard> +<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> <$button class="tc-btn-invisible"> -<$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/> +<<cancel-search-actions>> {{$:/core/images/close-button}} </$button> </$reveal> </div> -</$linkcatcher> - -<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> -<$list filter="[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$set name="searchTiddler" value="$:/temp/advancedsearch"> +<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> +<$list filter="[{$:/temp/advancedsearch/input}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$vars userInput={{{ [[$:/temp/advancedsearch/input]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState="$:/temp/advancedsearch/selected-item"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]" emptyMessage=""" <$list filter="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]"> <$transclude/> </$list> """> -<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]" default={{$:/config/SearchResults/Default}}/> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]" default={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/advancedsearch/standard/currentTab" text=<<currentTab>>/>""" explicitState="$:/state/tab/search-results/advancedsearch" /> </$list> -</$set> +</$vars> </$list> </$reveal> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index ef7326699..19877db4f 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -1,40 +1,52 @@ title: $:/core/ui/AdvancedSearch/System tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/System/Caption}} +first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]] \define lingo-base() $:/language/Search/ \define set-next-input-tab(beforeafter:"after",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -<$linkcatcher to="$:/temp/advancedsearch"> + +\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> + +\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> + +\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> <<lingo System/Hint>> <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch" storeTitle="$:/temp/advancedsearch/input" + refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" + type="search" tag="input" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter="[[$:/core/ui/AdvancedSearch/System]]" + inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> + inputAcceptVariantActions=<<input-accept-variant-actions>>/> </$keyboard> </$keyboard> <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> -<$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/> +<<cancel-search-actions>> {{$:/core/images/close-button}} </$button> </$reveal> </div> -</$linkcatcher> +<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> -<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> +<$list filter="[{$:/temp/advancedsearch/input}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$list filter="[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> - -<$set name="resultCount" value="""<$count filter="[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]"/>"""> +<$set name="resultCount" value="""<$count filter="[is[system]search{$:/temp/advancedsearch/input}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]"/>"""> <div class="tc-search-results"> <<lingo System/Matches>> -<$list filter="[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]" template="$:/core/ui/ListItemTemplate"/> +<$list filter="[is[system]search{$:/temp/advancedsearch/input}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]"> +<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}> +<$transclude tiddler="$:/core/ui/ListItemTemplate"/> +</span> +</$list> </div> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index a4c645168..5ed96f1f5 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -42,7 +42,7 @@ tags: $:/tags/SideBarSegment \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> -\define advanced-search-actions() <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to="$:/AdvancedSearch"/> +\define advanced-search-actions() <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search/input}}/><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to="$:/AdvancedSearch"/> <div class="tc-sidebar-lists tc-sidebar-search"> From 6a01ab20a071004013d5e4140ef93a2b0a5149a1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 11:55:16 +0100 Subject: [PATCH 0862/2376] Fix menubar-plugin search (#4922) --- plugins/tiddlywiki/menubar/items/search.tid | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid index 8e0ba6482..e4e386be0 100644 --- a/plugins/tiddlywiki/menubar/items/search.tid +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -8,14 +8,20 @@ tags: $:/tags/MenuBar \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> + \whitespace trim -<$vars searchTiddler="$:/temp/menubarsearch/input" searchListState=<<qualify "$:/state/search-list/selected-item">> titleSearchFilter="[!is[system]search:title<userInput>sort[title]limit[250]]" allSearchFilter="[!is[system]search<userInput>sort[title]limit[250]]"> +<$vars searchTiddler="$:/temp/menubarsearch/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> <span style="margin: 0 0.5em;"> +<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$macrocall $name="keyboard-driven-input" tiddler="$:/temp/menubarsearch" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/menubarsearch/refresh" tag="input" type="search" focusPopup="$:/state/popup/menubar-search-dropdown" class="tc-popup-handle tc-menu-show-when-wide" placeholder="Search..." default="" cancelPopups="yes" - primaryListFilter=<<titleSearchFilter>> secondaryListFilter=<<allSearchFilter>> inputAcceptActions=<<input-accept-actions>> - inputCancelActions=<<cancel-search-actions>> filterMinLength={{$:/config/Search/MinLength}}/> + inputAcceptActions=<<input-accept-actions>> inputCancelActions=<<cancel-search-actions>> + filterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]" /> +</$keyboard> +</$keyboard> </span> <$reveal tag="div" class="tc-block-dropdown-wrapper" state="$:/state/popup/menubar-search-dropdown" type="nomatch" text="" default=""> @@ -25,8 +31,12 @@ tags: $:/tags/MenuBar <$list filter="[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} userInput={{{ [<searchTiddler>get[text]] }}}> + {{$:/core/ui/SearchResults}} +</$vars> + </$list> </$list> From 57ba4c8cba62ba104951b4fc072e77262954e9cf Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 12:57:08 +0100 Subject: [PATCH 0863/2376] Add .tc-small-gap (+left / right) and .tc-big-gap... (#4923) (+left / right) classes that define margins of .5em / 1em --- themes/tiddlywiki/vanilla/base.tid | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 51ea4d503..d6c287c47 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2761,3 +2761,33 @@ select { .tc-fill-background { fill: <<colour background>>; } + +/* +** Other utility classes +*/ + +.tc-small-gap { + margin-left: .5em; + margin-right: .5em; +} + +.tc-small-gap-left { + margin-left: .5em; +} + +.tc-small-gap-right { + margin-right: .5em; +} + +.tc-big-gap { + margin-left: 1em; + margin-right: 1em; +} + +.tc-big-gap-left { + margin-left: 1em; +} + +.tc-big-gap-right { + margin-right: 1em; +} From 651619076af839613a9192749f55bcbd0e5b6f67 Mon Sep 17 00:00:00 2001 From: Ryan Kramer <default.kramer@gmail.com> Date: Wed, 28 Oct 2020 06:58:48 -0500 Subject: [PATCH 0864/2376] add override saver (#4908) * add override saver * rename 'override' to 'custom' and use the global instead of introducing a new one --- core/modules/savers/custom.js | 60 +++++++++++++++++++++++++++++++++++ licenses/cla-individual.md | 2 ++ 2 files changed, 62 insertions(+) create mode 100644 core/modules/savers/custom.js diff --git a/core/modules/savers/custom.js b/core/modules/savers/custom.js new file mode 100644 index 000000000..836691204 --- /dev/null +++ b/core/modules/savers/custom.js @@ -0,0 +1,60 @@ +/*\ +title: $:/core/modules/savers/custom.js +type: application/javascript +module-type: saver + +Looks for `window.$tw.customSaver` first on the current window, then +on the parent window (of an iframe). If present, the saver must define + save: function(text,method,callback) { ... } +and the saver may define + priority: number +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var findSaver = function(window) { + try { + return window && window.$tw && window.$tw.customSaver; + } catch (err) { + // Catching the exception is the most reliable way to detect cross-origin iframe errors. + // For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw + // Uncaught DOMException: Permission denied to access property "$tw" on cross-origin object + console.log({ msg: "custom saver is disabled", reason: err }); + return null; + } +} +var saver = findSaver(window) || findSaver(window.parent) || {}; + +var CustomSaver = function(wiki) { +}; + +CustomSaver.prototype.save = function(text,method,callback) { + return saver.save(text, method, callback); +}; + +/* +Information about this saver +*/ +CustomSaver.prototype.info = { + name: "custom", + priority: saver.priority || 4000, + capabilities: ["save","autosave"] +}; + +/* +Static method that returns true if this saver is capable of working +*/ +exports.canSave = function(wiki) { + return !!(saver.save); +}; + +/* +Create an instance of this saver +*/ +exports.create = function(wiki) { + return new CustomSaver(wiki); +}; +})(); diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index fb4430e2e..32fec886a 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -415,3 +415,5 @@ Kamal Habash, @Kamal-Habash, 2020/08/28 Florian Kohrt, @fkohrt, 2020/09/10 Gerald Liu, @gera2ld, 2020/09/25 + +Ryan Kramer, @default-kramer, 2020/10/24 From 12be7ac7e9c912eb97ac5bffb8a114a3a09e5136 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 12:59:36 +0100 Subject: [PATCH 0865/2376] Add ability to navigate fieldname-dropdown by keyboard (#4921) * make fields EditTemplate navigatable by keyboard * Add configuration tiddler for fieldname-dropdown filters * Update base.tid --- core/ui/EditTemplate/fields.tid | 22 ++++++++++++++++++-- core/wiki/config/EditModeFieldnameFilter.tid | 3 +++ themes/tiddlywiki/vanilla/base.tid | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 core/wiki/config/EditModeFieldnameFilter.tid diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index aa8a87b46..2197aae2b 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -21,6 +21,14 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ <$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/> \end +\define delete-state-tiddlers() <$action-deletetiddler $filter="[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]"/> + +\define cancel-search-actions() +<$list filter="[<__storeTitle__>has[text]] [<__tiddler__>has[text]]" variable="ignore" emptyMessage="""<<delete-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> +<<delete-state-tiddlers>> +</$list> +\end + \define new-field() <$vars name={{{ [<newFieldNameTiddler>get[text]] }}}> <$reveal type="nomatch" text="" default=<<name>>> @@ -72,7 +80,12 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <<lingo Fields/Add/Prompt>>   </em> <div class="tc-edit-field-add-name-wrapper"> -<$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes"/> +<$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<qualify "$:/temp/fieldname/input">> searchListState=<<qualify "$:/temp/fieldname/selected-item">>> +<$macrocall $name="keyboard-driven-input" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> + selectionStateTitle=<<searchListState>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} + focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} + focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes" + configTiddlerFilter="[[$:/config/EditMode/fieldname-filter]]" inputCancelActions=<<cancel-search-actions>> />   <$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> @@ -82,25 +95,30 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/User>> </div> -<$set name="newFieldName" value={{{ [<newFieldNameTiddler>get[text]] }}}> +<$set name="newFieldName" value={{{ [<storeTitle>get[text]] }}}> <$list filter="[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField"> +<$list filter="[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>"""> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> </$list> +</$list> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/System>> </div> <$list filter="[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField"> +<$list filter="[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>"""> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> </$list> +</$list> </$set> </$linkcatcher> </$set> </div> </$reveal> +</$vars> </div> <span class="tc-edit-field-add-value"> <$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}> diff --git a/core/wiki/config/EditModeFieldnameFilter.tid b/core/wiki/config/EditModeFieldnameFilter.tid new file mode 100644 index 000000000..be7d2f586 --- /dev/null +++ b/core/wiki/config/EditModeFieldnameFilter.tid @@ -0,0 +1,3 @@ +title: $:/config/EditMode/fieldname-filter +first-search-filter: [!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type +second-search-filter: [fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]] diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index d6c287c47..5c112c3ab 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -721,7 +721,7 @@ button.tc-btn-invisible.tc-remove-tag-button { } .tc-tag-button-selected, -.tc-list-item-selected a.tc-tiddlylink { +.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected { background-color: <<colour primary>>; color: <<colour tiddler-background>>; } From f5ad5010bc642f7f5a76e492c9fa89fbc607ac28 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Wed, 28 Oct 2020 13:00:18 +0100 Subject: [PATCH 0866/2376] Added documentation for ':filter' prefix for filter runs. (#4920) --- editions/tw5.com/tiddlers/filters/filter.tid | 16 +++++++++++++++- .../filters/syntax/Filter Expression.tid | 7 +++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/filter.tid b/editions/tw5.com/tiddlers/filters/filter.tid index faca51090..62619c20f 100644 --- a/editions/tw5.com/tiddlers/filters/filter.tid +++ b/editions/tw5.com/tiddlers/filters/filter.tid @@ -1,6 +1,6 @@ caption: filter created: 20200929174420821 -modified: 20201006173606828 +modified: 20201027185144953 op-input: a [[selection of titles|Title Selection]] passed as input to the filter op-neg-input: a [[selection of titles|Title Selection]] passed as input to the filter op-neg-output: those input titles that <<.em "do not">> pass the filter <<.place S>> @@ -30,4 +30,18 @@ Simple filter operations can be concatenated together directly (eg `[tag[HelloTh <<.tip "Compare with the similar [[subfilter|subfilter Operator]] operator which runs a subfilter and directly returns the results">> +<<.tip "Compare with the analagous named filter run prefix `:filter`">> + +``` +\define larger-than-1k() [get[text]length[]compare:integer:gteq[1000]] + +{{{ [tag[HelloThere]filter<larger-than-1k>] }}} +``` + +is equivalent to: + +``` +{{{ [tag[HelloThere]] :filter[get[text]length[]compare:integer:gteq[1000]] }}} +``` + <<.operator-examples "filter">> diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index c78066833..1b67a98b8 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20201027134811701 +modified: 20201027185638636 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -19,9 +19,12 @@ If a run has: * no prefix, its output titles are [[dominantly appended|Dominant Append]] to the filter's output * <<.from-version "5.1.20">> the prefix `=`, output titles are appended to the filter's output without de-duplication * the prefix `-`, output titles are <<.em removed>> from the filter's output (if such tiddlers exist) -* the prefix `+`, it receives the filter output so far as its input; its output then <<.em "replaces">> all filter ouput so far and forms the input for the next run +* the prefix `+`, it receives the filter output so far as its input; its output then <<.em "replaces">> all filter output so far and forms the input for the next run * <<.from-version "5.1.18">> the prefix `~`, if the filter output so far is an empty list then the output titles of the run are [[dominantly appended|Dominant Append]] to the filter's output. If the filter output so far is not an empty list then the run is ignored * <<.from-version "5.1.23">> named prefixes for filter runs are available. +* <<.from-version "5.1.23">> named prefix `:filter`, it receives the filter output so far as its input. The next run is evaluated for each title of the input, removing every input title for which the output is an empty list. + +<<.tip "Compare named filter run prefix `:filter` with [[filter Operator]] which applies a subfilter to every input title, removing the titles that return an empty result from the subfilter">> In technical / logical terms: From c985fd63f9799c7ed4598a7449bcdc429d41631c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 13:01:05 +0100 Subject: [PATCH 0867/2376] make link-dropdown navigatable by keyboard (#4919) --- core/ui/EditorToolbar/link-dropdown.tid | 28 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/core/ui/EditorToolbar/link-dropdown.tid b/core/ui/EditorToolbar/link-dropdown.tid index 671796ce4..8daf88530 100644 --- a/core/ui/EditorToolbar/link-dropdown.tid +++ b/core/ui/EditorToolbar/link-dropdown.tid @@ -4,40 +4,48 @@ title: $:/core/ui/EditorToolbar/link-dropdown \define add-link-actions() <$action-sendmessage $message="tm-edit-text-operation" $param="make-link" text={{$(linkTiddler)$}} /> -<$action-deletetiddler $tiddler=<<dropdown-state>> /> -<$action-deletetiddler $tiddler=<<searchTiddler>> /> -<$action-deletetiddler $tiddler=<<linkTiddler>> /> +<$action-deletetiddler $filter="[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]"/> \end +\define cancel-search-actions() <$action-deletetiddler $filter="[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]"/> + \define external-link() <$button class="tc-btn-invisible" style="width: auto; display: inline-block; background-colour: inherit;" actions=<<add-link-actions>>> {{$:/core/images/chevron-right}} </$button> \end +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> + \define body(config-title) ''<<lingo Hint>>'' -<$vars searchTiddler="""$config-title$/search""" linkTiddler="""$config-title$/link""" linktext="" > +<$vars searchTiddler="""$config-title$/search""" linkTiddler="""$config-title$/link""" linktext="" searchListState=<<qualify "$:/temp/link-search/selected-item">> refreshTitle=<<qualify "$:/temp/link-search/refresh">> storeTitle=<<qualify "$:/temp/link-search/input">>> <$vars linkTiddler=<<searchTiddler>>> -<$keyboard key="ENTER" actions=<<add-link-actions>>> -<$edit-text tiddler=<<searchTiddler>> type="search" tag="input" focus="true" placeholder={{$:/language/Search/Search}} default=""/> -<$reveal tag="span" state=<<searchTiddler>> type="nomatch" text=""> +<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> +<$macrocall $name="keyboard-driven-input" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>> + selectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type="search" + tag="input" focus="true" class="tc-popup-handle" inputCancelActions=<<cancel-search-actions>> + inputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default="" + configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]" /> +</$keyboard> +</$keyboard> +<$reveal tag="span" state=<<storeTitle>> type="nomatch" text=""> <<external-link>> <$button class="tc-btn-invisible" style="width: auto; display: inline-block; background-colour: inherit;"> <$action-setfield $tiddler=<<searchTiddler>> text="" /> {{$:/core/images/close-button}} </$button> </$reveal> -</$keyboard> </$vars> -<$reveal tag="div" state=<<searchTiddler>> type="nomatch" text=""> +<$reveal tag="div" state=<<storeTitle>> type="nomatch" text=""> <$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>> -<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}> +<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}> {{$:/core/ui/SearchResults}} From e71bf27dae983177ad09859b9b242bfb9dfe99b5 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 14:13:55 +0100 Subject: [PATCH 0868/2376] Replace various   with tc-small-gap classes (#4926) * replace   by span.tc-small-gap-right * replace   * replace   * replace   * replace   * replace   * replace   * replace   --- core/ui/EditTemplate/fields.tid | 33 ++++--------------- core/ui/EditTemplate/type.tid | 4 +-- core/ui/ImportListing.tid | 4 +-- core/ui/PaletteManager.tid | 6 ++-- core/ui/SideBar/Open.tid | 2 +- core/wiki/macros/list.tid | 2 +- core/wiki/macros/tag-picker.tid | 4 +-- .../comments/header-view-template-segment.tid | 2 +- 8 files changed, 19 insertions(+), 38 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 2197aae2b..22564b5f2 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -21,14 +21,6 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ <$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/> \end -\define delete-state-tiddlers() <$action-deletetiddler $filter="[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]"/> - -\define cancel-search-actions() -<$list filter="[<__storeTitle__>has[text]] [<__tiddler__>has[text]]" variable="ignore" emptyMessage="""<<delete-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> -<<delete-state-tiddlers>> -</$list> -\end - \define new-field() <$vars name={{{ [<newFieldNameTiddler>get[text]] }}}> <$reveal type="nomatch" text="" default=<<name>>> @@ -76,18 +68,12 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <$fieldmangler> <div class="tc-edit-field-add"> -<em class="tc-edit"> -<<lingo Fields/Add/Prompt>>   +<em class="tc-edit tc-big-gap-right"> +<<lingo Fields/Add/Prompt>> </em> <div class="tc-edit-field-add-name-wrapper"> -<$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<qualify "$:/temp/fieldname/input">> searchListState=<<qualify "$:/temp/fieldname/selected-item">>> -<$macrocall $name="keyboard-driven-input" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> - selectionStateTitle=<<searchListState>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} - focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} - focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes" - configTiddlerFilter="[[$:/config/EditMode/fieldname-filter]]" inputCancelActions=<<cancel-search-actions>> /> -  -<$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>  +<$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes"/> +<$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> <div class="tc-block-dropdown tc-edit-type-dropdown"> <$set name="tv-show-missing-links" value="yes"> @@ -95,38 +81,33 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/User>> </div> -<$set name="newFieldName" value={{{ [<storeTitle>get[text]] }}}> +<$set name="newFieldName" value={{{ [<newFieldNameTiddler>get[text]] }}}> <$list filter="[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField"> -<$list filter="[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>"""> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> </$list> -</$list> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/System>> </div> <$list filter="[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField"> -<$list filter="[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>"""> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> </$list> -</$list> </$set> </$linkcatcher> </$set> </div> </$reveal> -</$vars> </div> -<span class="tc-edit-field-add-value"> +<span class="tc-edit-field-add-value tc-small-gap-right"> <$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}> <$keyboard key="((add-field))" actions=<<new-field-actions>>> <$edit-text tiddler=<<newFieldValueTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class="tc-edit-texteditor" tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"/> </$keyboard> </$set> -</span>  +</span> <span class="tc-edit-field-add-button"> <$macrocall $name="new-field"/> </span> diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 81c190186..14b023fd6 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -4,10 +4,10 @@ tags: $:/tags/EditTemplate \define lingo-base() $:/language/EditTemplate/ \whitespace trim <div class="tc-edit-type-selector-wrapper"> -<em class="tc-edit"><<lingo Type/Prompt>></em>   +<em class="tc-edit tc-big-gap-right"><<lingo Type/Prompt>></em> <div class="tc-type-selector-dropdown-wrapper"> <div class="tc-type-selector"><$fieldmangler> -<$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes"/> <$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> +<$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes"/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> </$fieldmangler></div> <div class="tc-block-dropdown-wrapper"> diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index ddf49a8ce..2018014b5 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -43,12 +43,12 @@ $(currentTiddler)$!!popup-$(payloadTiddler)$ <td> <$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="yes"> -{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/> +{{$:/core/images/right-arrow}}<span class="tc-small-gap-left"><$text text=<<payloadTiddler>>/></span> </$button> </$reveal> <$reveal type="match" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="no"> -{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/> +{{$:/core/images/down-arrow}}<span class="tc-small-gap-left"><$text text=<<payloadTiddler>>/></span> </$button> </$reveal> </td> diff --git a/core/ui/PaletteManager.tid b/core/ui/PaletteManager.tid index f4f0a3ba9..eb6968a84 100644 --- a/core/ui/PaletteManager.tid +++ b/core/ui/PaletteManager.tid @@ -25,10 +25,10 @@ title: $:/PaletteManager <$set name="state" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}> <$wikify name="newColourName" text="""<$macrocall $name="resolve-colour" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>"""> <$reveal state=<<state>> type="nomatch" text="show"> -<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class="tc-btn-invisible" set=<<state>> setTo="show">{{$:/core/images/down-arrow}} <$text text=<<newColourName>>/></$button><br> +<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class="tc-btn-invisible" set=<<state>> setTo="show">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class="tc-small-gap-left"/></$button><br> </$reveal> <$reveal state=<<state>> type="match" text="show"> -<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class="tc-btn-invisible" actions="""<$action-deletetiddler $tiddler=<<state>>/>""">{{$:/core/images/up-arrow}} <$text text=<<newColourName>>/></$button><br> +<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class="tc-btn-invisible" actions="""<$action-deletetiddler $tiddler=<<state>>/>""">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class="tc-small-gap-left"/></$button><br> </$reveal> <$reveal state=<<state>> type="match" text="show"> <$set name="colourName" value=<<newColourName>>> @@ -88,6 +88,6 @@ title: $:/PaletteManager <$button message="tm-new-tiddler" param={{$:/palette}}><<lingo Clone/Caption>></$button> -<$checkbox tiddler="$:/state/palettemanager/showexternal" field="text" checked="yes" unchecked="no"> <<lingo Names/External/Show>></$checkbox> +<$checkbox tiddler="$:/state/palettemanager/showexternal" field="text" checked="yes" unchecked="no"><span class="tc-small-gap-left"><<lingo Names/External/Show>></span></$checkbox> <<palette-manager-table>> diff --git a/core/ui/SideBar/Open.tid b/core/ui/SideBar/Open.tid index 0e044ddf8..84d7c396e 100644 --- a/core/ui/SideBar/Open.tid +++ b/core/ui/SideBar/Open.tid @@ -26,7 +26,7 @@ $button$ <div class="tc-sidebar-tab-open"> <$list filter="[list<tv-story-list>]" history=<<tv-history-list>> storyview="pop"> <div class="tc-sidebar-tab-open-item"> -<$macrocall $name="droppable-item" button="""<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field="title"/></$link>"""/> +<$macrocall $name="droppable-item" button="""<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini tc-small-gap-right">{{$:/core/images/close-button}}</$button><$link to={{!!title}}><$view field="title"/></$link>"""/> </div> </$list> <$tiddler tiddler=""> diff --git a/core/wiki/macros/list.tid b/core/wiki/macros/list.tid index e679f1fde..01b527a07 100644 --- a/core/wiki/macros/list.tid +++ b/core/wiki/macros/list.tid @@ -43,7 +43,7 @@ tags: $:/tags/Macro <$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> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index f3d71c642..ac92aa24f 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -38,14 +38,14 @@ $actions$ <$vars tagSelectionState=<<qualify "$:/state/selected-tag">> storeTitle=<<qualify "$:/temp/NewTagName/input">> refreshTitle=<<qualify "$:/temp/NewTagName/refresh">> nonSystemTagsFilter="[tags[]!is[system]search:title<userInput>sort[]]" systemTagsFilter="[tags[]is[system]search:title<userInput>sort[]]"> <div class="tc-edit-add-tag"> <div> -<span class="tc-add-tag-name"> +<span class="tc-add-tag-name tc-small-gap-right"> <$macrocall $name="keyboard-driven-input" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<tagSelectionState>> inputAcceptActions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>>/>""" inputCancelActions=<<clear-tags-actions>> tag="input" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} cancelPopups=<<cancelPopups>> configTiddlerFilter="[[$:/core/macros/tag-picker]]"/> -</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> <span class="tc-add-tag-button"> +</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><span class="tc-add-tag-button tc-small-gap-left"> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> <$button set=<<newTagNameTiddler>> setTo="" class=""> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> diff --git a/plugins/tiddlywiki/comments/header-view-template-segment.tid b/plugins/tiddlywiki/comments/header-view-template-segment.tid index 8dd503955..ca119e581 100644 --- a/plugins/tiddlywiki/comments/header-view-template-segment.tid +++ b/plugins/tiddlywiki/comments/header-view-template-segment.tid @@ -21,7 +21,7 @@ list-before: $:/core/ui/ViewTemplate/body <p> This tiddler is a comment on <$list filter="[list<currentTiddler>sort[title]]"> -<<find-original-comment>>  +<span class="tc-small-gap-right"><<find-original-comment>></span> </$list> </p> <$list filter="[list<currentTiddler>role[comment]sort[title]limit[1]]" variable="ignore"> From 9a4eb1e8351285050854f61d0c8334b3693daa19 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 15:42:41 +0100 Subject: [PATCH 0869/2376] Add meta-S (mac) / ctrl-S shortcuts to save wiki (#4927) * Create save-wiki.tid * Update shortcuts-mac.multids * Update shortcuts.multids * Update ShortcutInfo.multids --- core/ui/KeyboardShortcuts/save-wiki.tid | 7 +++++++ core/wiki/config/ShortcutInfo.multids | 1 + core/wiki/config/shortcuts/shortcuts-mac.multids | 1 + core/wiki/config/shortcuts/shortcuts.multids | 1 + 4 files changed, 10 insertions(+) create mode 100644 core/ui/KeyboardShortcuts/save-wiki.tid diff --git a/core/ui/KeyboardShortcuts/save-wiki.tid b/core/ui/KeyboardShortcuts/save-wiki.tid new file mode 100644 index 000000000..15210e6b5 --- /dev/null +++ b/core/ui/KeyboardShortcuts/save-wiki.tid @@ -0,0 +1,7 @@ +title: $:/core/ui/KeyboardShortcuts/save-wiki +tags: $:/tags/KeyboardShortcut +key: ((save-wiki)) + +<$wikify name="site-title" text={{$:/config/SaveWikiButton/Filename}}> +<$action-sendmessage $message="tm-save-wiki" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/> +</$wikify> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 59fd4e305..000907164 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -33,6 +33,7 @@ picture: {{$:/language/Buttons/Picture/Hint}} preview: {{$:/language/Buttons/Preview/Hint}} quote: {{$:/language/Buttons/Quote/Hint}} save-tiddler: {{$:/language/Buttons/Save/Hint}} +save-wiki: {{$:/language/Buttons/SaveWiki/Hint}} sidebar-search: {{$:/language/Buttons/SidebarSearch/Hint}} stamp: {{$:/language/Buttons/Stamp/Hint}} strikethrough: {{$:/language/Buttons/Strikethrough/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts-mac.multids b/core/wiki/config/shortcuts/shortcuts-mac.multids index f3204e050..fc3fc060f 100644 --- a/core/wiki/config/shortcuts/shortcuts-mac.multids +++ b/core/wiki/config/shortcuts/shortcuts-mac.multids @@ -6,3 +6,4 @@ underline: meta-U new-image: ctrl-I new-journal: ctrl-J new-tiddler: ctrl-N +save-wiki: meta-S diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index ca95900f1..92e9c89e9 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -29,6 +29,7 @@ picture: ctrl-shift-I preview: alt-P quote: ctrl-Q save-tiddler: ctrl+enter +save-wiki: ctrl-S stamp: ctrl-S strikethrough: ctrl-T subscript: ctrl-shift-B From 49b11bc493f089b7be2b0a432088acced5506e55 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 28 Oct 2020 23:59:02 +0800 Subject: [PATCH 0870/2376] Update chinese language files (#4929) * add `Error/FilterRunPrefix` in Misc.multids * add `Shortcuts/Input/AdvancedSearch/Hint` in Misc.multids --- languages/zh-Hans/Misc.multids | 2 ++ languages/zh-Hant/Misc.multids | 2 ++ 2 files changed, 4 insertions(+) diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 126f1b5a5..06796a998 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -25,6 +25,7 @@ Encryption/SetPassword: 设定密码 Error/Caption: 错误 Error/EditConflict: 服务器上的文件已更改 Error/Filter: 筛选器错误 +Error/FilterRunPrefix: 筛选器错误:筛选器 run 的未知首码 Error/FilterSyntax: 筛选器运算式中的语法错误 Error/FormatFilterOperator: 筛选器错误:`format` 筛选器运算符的未知尾码 Error/IsFilterOperator: 筛选器错误︰'is' 筛选器运算符的未知操作数 @@ -65,6 +66,7 @@ PluginReloadWarning: 请保存 {{$:/core/ui/Buttons/save-wiki}} 并刷新页面 RecentChanges/DateFormat: YYYY年0MM月0DD日 Shortcuts/Input/Accept/Hint: 接受选取的项目 Shortcuts/Input/AcceptVariant/Hint: 接受选取项目 (变种) +Shortcuts/Input/AdvancedSearch/Hint: 从侧边栏搜寻字段内打开[[进阶搜寻|$:/AdvancedSearch]]面板 Shortcuts/Input/Cancel/Hint: 清除输入字段 Shortcuts/Input/Down/Hint: 选择下一个项目 Shortcuts/Input/Tab-Left/Hint: 选择上一个页签 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index 97c23b278..6296db34a 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -25,6 +25,7 @@ Encryption/SetPassword: 設定密碼 Error/Caption: 錯誤 Error/EditConflict: 伺服器上的檔案已更改 Error/Filter: 篩選器錯誤 +Error/FilterRunPrefix: 篩選器錯誤:篩選器 run 的未知首碼 Error/FilterSyntax: 篩選器運算式中的語法錯誤 Error/FormatFilterOperator: 篩選器錯誤:`format` 篩選器運算子的未知尾碼 Error/IsFilterOperator: 篩選器錯誤︰'is' 篩選器運算子的未知運算元 @@ -65,6 +66,7 @@ PluginReloadWarning: 請儲存 {{$:/core/ui/Buttons/save-wiki}} 並刷新頁面 RecentChanges/DateFormat: YYYY年0MM月0DD日 Shortcuts/Input/Accept/Hint: 接受選取的項目 Shortcuts/Input/AcceptVariant/Hint: 接受選取項目 (變種) +Shortcuts/Input/AdvancedSearch/Hint: 從側邊欄搜尋欄位內開啟[[進階搜尋|$:/AdvancedSearch]]面板 Shortcuts/Input/Cancel/Hint: 清除輸入欄位 Shortcuts/Input/Down/Hint: 選擇下一個項目 Shortcuts/Input/Tab-Left/Hint: 選擇上一個頁籤 From 9605d94b6ca51b92d32b5bba875eb234ee8b7636 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Wed, 28 Oct 2020 17:03:04 +0100 Subject: [PATCH 0871/2376] Import rename (#4928) * Add UI for renaming tiddlers before import in the import listing * Removed spurious whitespace --- core/language/en-GB/Import.multids | 3 +++ core/modules/widgets/navigator.js | 8 ++++++-- core/ui/ImportListing.tid | 22 +++++++++++++++++++--- themes/tiddlywiki/vanilla/base.tid | 13 +++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/core/language/en-GB/Import.multids b/core/language/en-GB/Import.multids index 10a01d7dd..30a30cf06 100644 --- a/core/language/en-GB/Import.multids +++ b/core/language/en-GB/Import.multids @@ -13,6 +13,9 @@ Listing/Preview/TextRaw: Text (Raw) Listing/Preview/Fields: Fields Listing/Preview/Diff: Diff Listing/Preview/DiffFields: Diff (Fields) +Listing/Rename/Tooltip: Rename tiddler before importing +Listing/Rename/ConfirmRename : Rename tiddler +Listing/Rename/CancelRename : Cancel Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugin Upgrader/Plugins/Suppressed/Version: Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>) Upgrader/Plugins/Upgraded: Upgraded plugin from <<incoming>> to <<upgraded>> diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index d61432b60..bbbb57cb8 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -558,10 +558,14 @@ NavigatorWidget.prototype.handlePerformImportEvent = function(event) { $tw.utils.each(importData.tiddlers,function(tiddlerFields) { var title = tiddlerFields.title; if(title && importTiddler && importTiddler.fields["selection-" + title] !== "unchecked") { - var tiddler = new $tw.Tiddler(tiddlerFields); + if($tw.utils.hop(importTiddler.fields,["rename-" + title])) { + var tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields["rename-" + title]}); + } else { + var tiddler = new $tw.Tiddler(tiddlerFields); + } tiddler = $tw.hooks.invokeHook("th-importing-tiddler",tiddler); self.wiki.addTiddler(tiddler); - importReport.push("# [[" + tiddlerFields.title + "]]"); + importReport.push("# [[" + tiddler.fields.title + "]]"); } }); // Replace the $:/Import tiddler with an import report diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index 2018014b5..f6797489f 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -10,20 +10,30 @@ message-$(payloadTiddler)$ selection-$(payloadTiddler)$ \end +\define renameField() +rename-$(payloadTiddler)$ +\end + +\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$ + \define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$ \end +\define renameFieldState() +$:/state/import-rename-$(payloadTiddler)$ +\end + \define select-all-actions() <$list filter="[all[current]plugintiddlers[]sort[title]]" variable="payloadTiddler"> <$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/> </$list> \end -<table> +<table class="tc-import-table"> <tbody> <tr> -<th> +<th align="left"> <$checkbox tiddler="$:/state/import/select-all" field="text" checked="checked" unchecked="unchecked" default="checked" actions=<<select-all-actions>>> <<lingo Listing/Select/Caption>> </$checkbox> @@ -41,16 +51,22 @@ $(currentTiddler)$!!popup-$(payloadTiddler)$ <$checkbox field=<<selectionField>> checked="checked" unchecked="unchecked" default="checked"/> </td> <td> +<$reveal type="nomatch" stateTitle=<<renameFieldState>> text="yes" tag="div"> <$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="yes"> -{{$:/core/images/right-arrow}}<span class="tc-small-gap-left"><$text text=<<payloadTiddler>>/></span> +{{$:/core/images/right-arrow}}<span class="tc-small-gap-left"><$text text={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}}/></span> </$button> +<$button class="tc-btn-invisible" setTitle=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button> </$reveal> <$reveal type="match" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="no"> {{$:/core/images/down-arrow}}<span class="tc-small-gap-left"><$text text=<<payloadTiddler>>/></span> </$button> </$reveal> +</$reveal> +<$reveal type="match" stateTitle=<<renameFieldState>> text="yes" tag="div"> +<$edit-text tiddler=<<newImportTitleTiddler>> default=<<payloadTiddler>> tag="input" class="tc-import-rename"/><$button class="tc-btn-invisible" setTitle=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button> <$button class="tc-btn-invisible" setTitle=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button> +</$reveal> </td> <td> <$view field=<<messageField>>/> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 5c112c3ab..26aed618a 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2024,6 +2024,19 @@ html body.tc-body.tc-single-tiddler-window { height: auto; } +/* +** Import table +*/ + +.tc-import-table { + width: 100%; +} + +input.tc-import-rename { + width: 85%; + margin-right: 0.5em; +} + /* ** Alerts */ From b8fa6f0f0af4de3f6abc6a537e538c6bec091e3e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 28 Oct 2020 18:16:20 +0100 Subject: [PATCH 0872/2376] Fix keyboard-driven fieldname dropdown (#4930) I've accidentally overwritten the correct file when adding the tc-small-gap classes ... SORRY! --- core/ui/EditTemplate/fields.tid | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 22564b5f2..5c025ec82 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -21,6 +21,14 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ <$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/> \end +\define delete-state-tiddlers() <$action-deletetiddler $filter="[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]"/> + +\define cancel-search-actions() +<$list filter="[<__storeTitle__>has[text]] [<__tiddler__>has[text]]" variable="ignore" emptyMessage="""<<delete-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> +<<delete-state-tiddlers>> +</$list> +\end + \define new-field() <$vars name={{{ [<newFieldNameTiddler>get[text]] }}}> <$reveal type="nomatch" text="" default=<<name>>> @@ -72,7 +80,12 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <<lingo Fields/Add/Prompt>> </em> <div class="tc-edit-field-add-name-wrapper"> -<$edit-text tiddler=<<newFieldNameTiddler>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes"/> +<$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<qualify "$:/temp/fieldname/input">> searchListState=<<qualify "$:/temp/fieldname/selected-item">>> +<$macrocall $name="keyboard-driven-input" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> + selectionStateTitle=<<searchListState>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} + focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} + focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups="yes" + configTiddlerFilter="[[$:/config/EditMode/fieldname-filter]]" inputCancelActions=<<cancel-search-actions>> /> <$button popup=<<qualify "$:/state/popup/field-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$reveal state=<<qualify "$:/state/popup/field-dropdown">> type="nomatch" text="" default=""> <div class="tc-block-dropdown tc-edit-type-dropdown"> @@ -81,25 +94,30 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/User>> </div> -<$set name="newFieldName" value={{{ [<newFieldNameTiddler>get[text]] }}}> +<$set name="newFieldName" value={{{ [<storeTitle>get[text]] }}}> <$list filter="[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type" variable="currentField"> +<$list filter="[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>"""> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> </$list> +</$list> <div class="tc-dropdown-item"> <<lingo Fields/Add/Dropdown/System>> </div> <$list filter="[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]" variable="currentField"> +<$list filter="[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]" emptyMessage="""<$link to=<<currentField>> class="tc-list-item-selected"><$text text=<<currentField>>/></$link>"""> <$link to=<<currentField>>> <$text text=<<currentField>>/> </$link> </$list> +</$list> </$set> </$linkcatcher> </$set> </div> </$reveal> +</$vars> </div> <span class="tc-edit-field-add-value tc-small-gap-right"> <$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}> From 49142080115b8aeb03a9fe2c7700155f4088264a Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Thu, 29 Oct 2020 13:57:11 +0100 Subject: [PATCH 0873/2376] Update Configuring startup tiddlers.tid (#4009) --- .../tiddlers/customising/Configuring startup tiddlers.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/customising/Configuring startup tiddlers.tid b/editions/tw5.com/tiddlers/customising/Configuring startup tiddlers.tid index c1697f55e..752415fd9 100644 --- a/editions/tw5.com/tiddlers/customising/Configuring startup tiddlers.tid +++ b/editions/tw5.com/tiddlers/customising/Configuring startup tiddlers.tid @@ -22,4 +22,6 @@ You can also use [[filter expressions|Filter Expression]] to open more than one will open all tiddlers tagged as <<tag HelloThere>>. -You can also use this technique to [[preserve open tiddlers at startup|Preserving open tiddlers at startup]] \ No newline at end of file +You can also use this technique to [[preserve open tiddlers at startup|Preserving open tiddlers at startup]] + +See also [[StartupActions]] for controlling more advanced startup behaviours. From bc5609820ffa737f55ccc569c40e7fbd2ed35ff4 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Thu, 29 Oct 2020 20:57:54 +0800 Subject: [PATCH 0874/2376] Update chinese translations (#4935) * Update chinese language files * add `Error/FilterRunPrefix` in Misc.multids * add `Shortcuts/Input/AdvancedSearch/Hint` in Misc.multids * Add chinese translations for Listing/Rename/* --- languages/zh-Hans/Import.multids | 3 +++ languages/zh-Hant/Import.multids | 3 +++ 2 files changed, 6 insertions(+) diff --git a/languages/zh-Hans/Import.multids b/languages/zh-Hans/Import.multids index a645a7d3c..7f5a59c8d 100644 --- a/languages/zh-Hans/Import.multids +++ b/languages/zh-Hans/Import.multids @@ -13,6 +13,9 @@ Listing/Preview/TextRaw: 文本 (原始) Listing/Preview/Fields: 字段 Listing/Preview/Diff: 差异 Listing/Preview/DiffFields: 差异 (字段) +Listing/Rename/Tooltip: 导入前重新命名条目 +Listing/Rename/ConfirmRename : 重新命名条目 +Listing/Rename/CancelRename : 取消 Upgrader/Plugins/Suppressed/Incompatible: 封锁的不兼容或过时插件 Upgrader/Plugins/Suppressed/Version: 封锁的插件 (由于传入的 <<incoming>> 较现有版本 <<existing>> 旧) Upgrader/Plugins/Upgraded: 升级插件,从 <<incoming>> 到 <<upgraded>> diff --git a/languages/zh-Hant/Import.multids b/languages/zh-Hant/Import.multids index b39ab3d31..f7ebb74d6 100644 --- a/languages/zh-Hant/Import.multids +++ b/languages/zh-Hant/Import.multids @@ -13,6 +13,9 @@ Listing/Preview/TextRaw: 文字 (原始) Listing/Preview/Fields: 欄位 Listing/Preview/Diff: 差異 Listing/Preview/DiffFields: 差異 (欄位) +Listing/Rename/Tooltip: 導入前重新命名條目 +Listing/Rename/ConfirmRename : 重新命名條目 +Listing/Rename/CancelRename : 取消 Upgrader/Plugins/Suppressed/Incompatible: 封鎖的不相容或過時插件 Upgrader/Plugins/Suppressed/Version: 封鎖的插件 (由於傳入的 <<incoming>> 較現有版本 <<existing>> 舊) Upgrader/Plugins/Upgraded: 升級插件,從 <<incoming>> 到 <<upgraded>> From cae32d39a5cb7791d91a8a66816ec67b015a41d1 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Thu, 29 Oct 2020 20:00:49 +0700 Subject: [PATCH 0875/2376] Improve documentation for reduce operator (#4936) --- .../examples/reduce Operator (Examples).tid | 27 +++++++++++++++++++ editions/tw5.com/tiddlers/filters/reduce.tid | 6 +++++ 2 files changed, 33 insertions(+) diff --git a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid index 80f62582b..9d92ea0c8 100644 --- a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid @@ -6,14 +6,19 @@ type: text/vnd.tiddlywiki \define add-price() [get[price]multiply{!!quantity}add<accumulator>] \define num-items() [get[quantity]add<accumulator>] +\define join-with-commas() [<index>compare:number:gt[0]then<accumulator>addsuffix[, ]addsuffix<currentTiddler>else<currentTiddler>] \define display-variable(name) ''<$text text=<<__name__>>/>'': <code><$text text={{{ [<__name__>getvariable[]] }}}/></code> \end +\define reduce-tip() +Remember that <<.op reduce>> always produces output, so <<.op else>> will never trigger after <<.op reduce>>. +\end These examples use the following predefined variables: * <<display-variable add-price>> * <<display-variable num-items>> +* <<display-variable join-with-commas>> They also use the following data tiddlers: @@ -32,3 +37,25 @@ Number of items: Total price: <<.operator-example 2 "[tag[shopping]reduce<add-price>]">> + +Using `<index>` to act differently on the first item than the rest: + +<<.operator-example 3 "[tag[shopping]reduce<join-with-commas>]">> + +Empty input, no suffix: + +<<.operator-example 4 "[tag[non-existent]reduce<add-price>]">> + +Note how the output contains a single item with no text. This is not "empty output" for the purposes of the <<.op else>> operator. + +<$macrocall $name=".tip" _=<<reduce-tip>> /> + +Empty input, no suffix, followed by <<.op else>>: + +<<.operator-example 5 "[tag[non-existent]reduce<add-price>else[0]]">> + +Note how the output still contains a single item with no text: <<.op else>> did not trigger. If you want the value to be 0 when <<.op reduce>> has no items to process, you need to specify 0 as the initial value by passing it as a suffix to <<.op reduce>>. + +Empty input, suffix provided: + +<<.operator-example 6 "[tag[non-existent]reduce:0<add-price>]">> diff --git a/editions/tw5.com/tiddlers/filters/reduce.tid b/editions/tw5.com/tiddlers/filters/reduce.tid index fae41a1eb..d47955da3 100644 --- a/editions/tw5.com/tiddlers/filters/reduce.tid +++ b/editions/tw5.com/tiddlers/filters/reduce.tid @@ -12,6 +12,10 @@ tags: [[Filter Operators]] title: reduce Operator type: text/vnd.tiddlywiki +\define reduce-tip() +The <<.op reduce>> operator will always produce output, even if its input was empty. If its input is empty, the output of <<.op reduce>> will be the initial value of the accumulator, i.e. the value of the suffix. One result of this fact is that the <<.op else>> operator will never be triggered if it follows a <<.op reduce>>. The "Empty input" examples show what happens when <<.op reduce>> receives no input. +\end + <<.from-version "5.1.23">> The <<.op reduce>> operator runs a subfilter for each input title, passing the result of the previous subfilter run as a variable. The initial value of the accumulator can optionally be specified. It returns the result of the final subfilter run. The <<.op reduce>> operator is used to flatten a list of items down to a single item by repeatedly applying a formula. A typical use is to add up the values in a given field of a list of tiddlers. @@ -24,4 +28,6 @@ The following variables are available within the subfilter: * ''revIndex'' - the reverse numeric index of the current list item (with zero being the last item in the list) * ''length'' - the total length of the input list +<$macrocall $name=".tip" _=<<reduce-tip>> /> + <<.operator-examples "reduce">> From 655501140b21027acc7d368ea54cb657872b6b15 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 29 Oct 2020 14:01:17 +0100 Subject: [PATCH 0876/2376] Improvements for Import UI (#4937) * Fixed bug with old titles used in popup, improved UI for greater rename input size * Added flexbox utility CSS and use it for import UI --- core/language/en-GB/Import.multids | 1 + core/ui/ImportListing.tid | 26 +++++++++++++++++--------- themes/tiddlywiki/vanilla/base.tid | 30 +++++++++++++++++++++++++----- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/core/language/en-GB/Import.multids b/core/language/en-GB/Import.multids index 30a30cf06..1b1c6f219 100644 --- a/core/language/en-GB/Import.multids +++ b/core/language/en-GB/Import.multids @@ -14,6 +14,7 @@ Listing/Preview/Fields: Fields Listing/Preview/Diff: Diff Listing/Preview/DiffFields: Diff (Fields) Listing/Rename/Tooltip: Rename tiddler before importing +Listing/Rename/Prompt: Rename to: Listing/Rename/ConfirmRename : Rename tiddler Listing/Rename/CancelRename : Cancel Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugin diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index f6797489f..7a551def3 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -21,7 +21,7 @@ $(currentTiddler)$!!popup-$(payloadTiddler)$ \end \define renameFieldState() -$:/state/import-rename-$(payloadTiddler)$ +$(currentTiddler)$!!state-rename-$(payloadTiddler)$ \end \define select-all-actions() @@ -51,27 +51,34 @@ $:/state/import-rename-$(payloadTiddler)$ <$checkbox field=<<selectionField>> checked="checked" unchecked="unchecked" default="checked"/> </td> <td> -<$reveal type="nomatch" stateTitle=<<renameFieldState>> text="yes" tag="div"> -<$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div"> -<$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="yes"> -{{$:/core/images/right-arrow}}<span class="tc-small-gap-left"><$text text={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}}/></span> +<$reveal type="nomatch" state=<<renameFieldState>> text="yes" tag="div"> +<$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div" class="tc-flex"> +<$button class="tc-btn-invisible tc-btn-dropdown tc-flex-grow-1" set=<<previewPopupState>> setTo="yes"> +<span class="tc-small-gap-right">{{$:/core/images/right-arrow}}</span><$text text={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}}/> </$button> -<$button class="tc-btn-invisible" setTitle=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button> +<$button class="tc-btn-invisible tc-small-gap-left" set=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button> </$reveal> <$reveal type="match" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="no"> -{{$:/core/images/down-arrow}}<span class="tc-small-gap-left"><$text text=<<payloadTiddler>>/></span> +<span class="tc-small-gap-right">{{$:/core/images/down-arrow}}</span><$text text={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}}/> </$button> </$reveal> </$reveal> -<$reveal type="match" stateTitle=<<renameFieldState>> text="yes" tag="div"> -<$edit-text tiddler=<<newImportTitleTiddler>> default=<<payloadTiddler>> tag="input" class="tc-import-rename"/><$button class="tc-btn-invisible" setTitle=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button> <$button class="tc-btn-invisible" setTitle=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button> +<$reveal type="match" state=<<renameFieldState>> text="yes" tag="div"> +<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/> </$reveal> </td> <td> <$view field=<<messageField>>/> </td> </tr> +<$reveal type="match" state=<<renameFieldState>> text="yes" tag="tr"> +<td colspan="3"> +<div class="tc-flex"> +<$edit-text tiddler=<<newImportTitleTiddler>> default={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}} tag="input" class="tc-import-rename tc-flex-grow-1"/><span class="tc-small-gap-left"><$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class="tc-small-gap-right"/></span><$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button> +</div> +</td> +</$reveal> <tr> <td colspan="3"> <$reveal type="match" text="yes" state=<<previewPopupState>> tag="div"> @@ -84,3 +91,4 @@ $:/state/import-rename-$(payloadTiddler)$ </$list> </tbody> </table> + diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 26aed618a..a5c7af4df 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2032,11 +2032,6 @@ html body.tc-body.tc-single-tiddler-window { width: 100%; } -input.tc-import-rename { - width: 85%; - margin-right: 0.5em; -} - /* ** Alerts */ @@ -2775,6 +2770,31 @@ select { fill: <<colour background>>; } +/* +** Flexbox utility classes +*/ + +.tc-flex { + display: -webkit-flex; + display: flex; +} + +.tc-flex-column { + flex-direction: column; +} + +.tc-flex-row { + flex-direction: row; +} + +.tc-flex-grow-1 { + flex-grow: 1; +} + +.tc-flex-grow-2 { + flex-grow: 2; +} + /* ** Other utility classes */ From c01e9cef12c88acc9c3013c59738604a5cca00d7 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 31 Oct 2020 14:21:28 +0100 Subject: [PATCH 0877/2376] Do not save temp tiddlers in single file (#4938) * Update single file template to exclude temp tiddlers * Update save-all-external-js.tid --- core/templates/external-js/save-all-external-js.tid | 2 +- core/templates/save-all.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/templates/external-js/save-all-external-js.tid b/core/templates/external-js/save-all-external-js.tid index 49b80d390..51f6d6508 100644 --- a/core/templates/external-js/save-all-external-js.tid +++ b/core/templates/external-js/save-all-external-js.tid @@ -2,6 +2,6 @@ title: $:/core/save/all-external-js \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() -[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ +[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ \end {{$:/core/templates/tiddlywiki5-external-js.html}} diff --git a/core/templates/save-all.tid b/core/templates/save-all.tid index cb55922dd..b298ad49f 100644 --- a/core/templates/save-all.tid +++ b/core/templates/save-all.tid @@ -2,6 +2,6 @@ title: $:/core/save/all \import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] \define saveTiddlerFilter() -[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ +[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$ \end {{$:/core/templates/tiddlywiki5.html}} From 4b5d287c9002563ae4d2b31e592b7fa5d11a2d54 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 31 Oct 2020 14:22:05 +0100 Subject: [PATCH 0878/2376] Change input-accept-variant actions shortcut from alt-Enter ... (#4942) ... to ctrl-Enter and advanced-search-sidebar shortcut from ctrl-Enter to alt-Enter the ctrl-Key blocks navigation to the AdvancedSearch tiddler --- core/wiki/config/shortcuts/shortcuts.multids | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 92e9c89e9..4968dbb5c 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -2,7 +2,7 @@ title: $:/config/shortcuts/ add-field: enter advanced-search: ctrl-shift-A -advanced-search-sidebar: ctrl-Enter +advanced-search-sidebar: alt-Enter cancel-edit-tiddler: escape excise: ctrl-E sidebar-search: ctrl-shift-F @@ -13,7 +13,7 @@ heading-4: ctrl-4 heading-5: ctrl-5 heading-6: ctrl-6 input-accept: Enter -input-accept-variant: Alt-Enter +input-accept-variant: ctrl-Enter input-cancel: Escape input-down: Down input-tab-left: alt-Left From f6e485b89737ab123dc7407a85eab08342b039fb Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 31 Oct 2020 14:22:46 +0100 Subject: [PATCH 0879/2376] Avoid editing the wrong tiddlers when input fields are empty (#4943) * Avoid editing the 'undefined' tiddler * Avoid editing the wrong tiddler * Avoid editing the wrong tiddler * Avoid editing the wrong tiddler --- core/ui/AdvancedSearch/Shadows.tid | 2 +- core/ui/AdvancedSearch/Standard.tid | 2 +- core/ui/AdvancedSearch/System.tid | 2 +- core/ui/SideBarSegments/search.tid | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index 0647b45a4..ac9628b09 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -11,7 +11,7 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> -\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> <<lingo Shadows/Hint>> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index 5c91bee28..daf1d9257 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -11,7 +11,7 @@ caption: {{$:/language/Search/Standard/Caption}} \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> -\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> <<lingo Standard/Hint>> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index 19877db4f..8d7bfb274 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -10,7 +10,7 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> -\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> <<lingo System/Hint>> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 5ed96f1f5..3235afc6d 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -38,7 +38,7 @@ tags: $:/tags/SideBarSegment \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> -\define input-accept-variant-actions() <$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> From 77fe6244a29e85e85abc075dd3a2a35e1b8410c7 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Sun, 1 Nov 2020 17:45:18 +0700 Subject: [PATCH 0880/2376] Fix bug with sortan operator called on date fields (#4839) * Add failing unit test that shows the bug * Fix the bug --- core/modules/wiki.js | 4 ++-- editions/test/tiddlers/tests/test-filters.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 80189f7a9..c158e6b38 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -378,10 +378,10 @@ exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,is y = Number(b); if(isNumeric && (!isNaN(x) || !isNaN(y))) { return compareNumbers(x,y); - } else if(isAlphaNumeric) { - return isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"}); } else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) { return isDescending ? b - a : a - b; + } else if(isAlphaNumeric) { + return isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"}); } else { a = String(a); b = String(b); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 84e17ef83..2d486a181 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -685,6 +685,17 @@ function runTests(wiki) { expect(wiki.filterTiddlers("b a b c +[sortby[b a c b]]").join(",")).toBe("b,a,c"); }); + it("should handle the sortan operator", function() { + expect(wiki.filterTiddlers("b a c +[sortan[]]").join(",")).toBe("a,b,c"); + expect(wiki.filterTiddlers("b2 a3 a1 b1 c2 a2 c3 b3 c1 +[sortan[]]").join(",")).toBe("a1,a2,a3,b1,b2,b3,c1,c2,c3"); + expect(wiki.filterTiddlers("b2 a10 c10 a1 b1 c2 a2 b10 c1 +[sortan[]]").join(",")).toBe("a1,a2,a10,b1,b2,b10,c1,c2,c10"); + expect(wiki.filterTiddlers("TiddlerOne $:/TiddlerTwo [[Tiddler Three]] +[sortan[]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne"); + }); + + it("should handle the sortan operator sorting on date fields", function() { + expect(wiki.filterTiddlers("TiddlerOne $:/TiddlerTwo [[Tiddler Three]] +[sortan[modified]]").join(",")).toBe("$:/TiddlerTwo,TiddlerOne,Tiddler Three"); + }); + it("should handle the slugify operator", function() { expect(wiki.filterTiddlers("[[Joe Bloggs]slugify[]]").join(",")).toBe("joe-bloggs"); expect(wiki.filterTiddlers("[[Joe Bloggs2]slugify[]]").join(",")).toBe("joe-bloggs2"); From c6cd4d33e6d643237e04a9ce2928c6a98787104b Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sun, 1 Nov 2020 18:45:48 +0800 Subject: [PATCH 0881/2376] Add chinese translations for Listing/Rename/Prompt (#4946) --- languages/zh-Hans/Import.multids | 5 +++-- languages/zh-Hant/Import.multids | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/languages/zh-Hans/Import.multids b/languages/zh-Hans/Import.multids index 7f5a59c8d..810993fde 100644 --- a/languages/zh-Hans/Import.multids +++ b/languages/zh-Hans/Import.multids @@ -13,9 +13,10 @@ Listing/Preview/TextRaw: 文本 (原始) Listing/Preview/Fields: 字段 Listing/Preview/Diff: 差异 Listing/Preview/DiffFields: 差异 (字段) +Listing/Rename/Prompt: 重新命名为: Listing/Rename/Tooltip: 导入前重新命名条目 -Listing/Rename/ConfirmRename : 重新命名条目 -Listing/Rename/CancelRename : 取消 +Listing/Rename/ConfirmRename: 重新命名条目 +Listing/Rename/CancelRename: 取消 Upgrader/Plugins/Suppressed/Incompatible: 封锁的不兼容或过时插件 Upgrader/Plugins/Suppressed/Version: 封锁的插件 (由于传入的 <<incoming>> 较现有版本 <<existing>> 旧) Upgrader/Plugins/Upgraded: 升级插件,从 <<incoming>> 到 <<upgraded>> diff --git a/languages/zh-Hant/Import.multids b/languages/zh-Hant/Import.multids index f7ebb74d6..e038ff428 100644 --- a/languages/zh-Hant/Import.multids +++ b/languages/zh-Hant/Import.multids @@ -13,9 +13,10 @@ Listing/Preview/TextRaw: 文字 (原始) Listing/Preview/Fields: 欄位 Listing/Preview/Diff: 差異 Listing/Preview/DiffFields: 差異 (欄位) +Listing/Rename/Prompt: 重新命名為: Listing/Rename/Tooltip: 導入前重新命名條目 -Listing/Rename/ConfirmRename : 重新命名條目 -Listing/Rename/CancelRename : 取消 +Listing/Rename/ConfirmRename: 重新命名條目 +Listing/Rename/CancelRename: 取消 Upgrader/Plugins/Suppressed/Incompatible: 封鎖的不相容或過時插件 Upgrader/Plugins/Suppressed/Version: 封鎖的插件 (由於傳入的 <<incoming>> 較現有版本 <<existing>> 舊) Upgrader/Plugins/Upgraded: 升級插件,從 <<incoming>> 到 <<upgraded>> From ecb3c86e7bff8205043f397848355d5cefe7f470 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Sun, 1 Nov 2020 17:47:50 +0700 Subject: [PATCH 0882/2376] Fix bug when location hash contains a # (#4947) The bug fixed in this commit had an interesting side effect when the location hash started with #, e.g. it looked like wiki.html##foo. In that case, TiddlyWiki's navigation processing is not triggered and the browser's navigation processing is used instead, which allows anchors to be used within tiddlers for sub-tiddler navigation. To preserve this unintended but useful side-effect, we check for a location hash that starts with # and ignore it if it does. --- boot/boot.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 80032b4f5..9b742120c 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -267,8 +267,16 @@ $tw.utils.htmlDecode = function(s) { Get the browser location.hash. We don't use location.hash because of the way that Firefox auto-urldecodes it (see http://stackoverflow.com/questions/1703552/encoding-of-window-location-hash) */ $tw.utils.getLocationHash = function() { - var parts = window.location.href.split('#'); - return "#" + (parts.length > 1 ? parts[1] : ""); + var href = window.location.href; + var idx = href.indexOf('#'); + if(idx === -1) { + return "#"; + } else if(idx < href.length-1 && href[idx+1] === '#') { + // Special case: ignore location hash if it itself starts with a # + return "#"; + } else { + return href.substring(idx); + } }; /* From da06b648459fd0974bf5d043d46ca0b52074ee7f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 11:57:13 +0100 Subject: [PATCH 0883/2376] Fix AdvancedSearch Standard, System and Shadows up/down behavior (#4939) * add filterMinLength to AdvancedSearch/Shadows * add filterMinLength to AdvancedSearch/Standard * add filterMinLength to AdvancedSearch/System * Update link-dropdown.tid --- core/ui/AdvancedSearch/Shadows.tid | 2 +- core/ui/AdvancedSearch/Standard.tid | 3 ++- core/ui/AdvancedSearch/System.tid | 2 +- core/ui/EditorToolbar/link-dropdown.tid | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index ac9628b09..b31646dc5 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -22,7 +22,7 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter="[[$:/core/ui/AdvancedSearch/Shadows]]" inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> - inputAcceptVariantActions=<<input-accept-variant-actions>> /> + inputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/> </$keyboard> </$keyboard> <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index daf1d9257..2dbf21ea7 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -24,7 +24,8 @@ caption: {{$:/language/Search/Standard/Caption}} refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> - configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]"/> + configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]" + filterMinLength={{$:/config/Search/MinLength}}/> </$keyboard> </$keyboard> </$keyboard> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index 8d7bfb274..d3f103278 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -21,7 +21,7 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter="[[$:/core/ui/AdvancedSearch/System]]" inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> - inputAcceptVariantActions=<<input-accept-variant-actions>>/> + inputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/> </$keyboard> </$keyboard> <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> diff --git a/core/ui/EditorToolbar/link-dropdown.tid b/core/ui/EditorToolbar/link-dropdown.tid index 8daf88530..58f3a0781 100644 --- a/core/ui/EditorToolbar/link-dropdown.tid +++ b/core/ui/EditorToolbar/link-dropdown.tid @@ -25,7 +25,7 @@ title: $:/core/ui/EditorToolbar/link-dropdown <$vars linkTiddler=<<searchTiddler>>> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$macrocall $name="keyboard-driven-input" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>> +<$macrocall $name="keyboard-driven-input" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>> filterMinLength={{$:/config/Search/MinLength}} selectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type="search" tag="input" focus="true" class="tc-popup-handle" inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default="" From 635ec65d3fd792993a018a27c915f924d28f9294 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 11:58:27 +0100 Subject: [PATCH 0884/2376] Fix alignment of tc-tiddler-edit-title (#4949) --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index a5c7af4df..d8093d8b3 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1143,6 +1143,10 @@ canvas.tc-edit-bitmapeditor { overflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */ } +.tc-tiddler-title.tc-tiddler-edit-title { + line-height: 3em; +} + html body.tc-body.tc-single-tiddler-window { margin: 1em; background: <<colour tiddler-background>>; From c0b021f509f514285ccd556167c844076202b488 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Sun, 1 Nov 2020 18:03:59 +0700 Subject: [PATCH 0885/2376] Typo fix (#4951) --- editions/tw5.com/tiddlers/filters/compare Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/compare Operator.tid b/editions/tw5.com/tiddlers/filters/compare Operator.tid index a882914ae..95bdce2a9 100644 --- a/editions/tw5.com/tiddlers/filters/compare Operator.tid +++ b/editions/tw5.com/tiddlers/filters/compare Operator.tid @@ -30,7 +30,7 @@ The ''type'' can be: The ''mode'' can be: * "eq" - equal to -* "ne" - not equal ot +* "ne" - not equal to * "gteq" - greater than or equal to * "gt" - greater than * "lteq" - less than or equal to From 769ffa19b75050e5f5753b6398be2f47a82c26d5 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 12:10:00 +0100 Subject: [PATCH 0886/2376] Update CodeMirror plugins to v5.58.2 (#4950) * Update codemirror.js to 5.58.2 * Update codemirror.css to 5.58.2 * Update activeline.js to 5.58.2 * Update dialog.js to 5.58.2 * Update jump-to-line.js to 5.58.2 * Update search.js to 5.58.2 * Update searchcursor.js to 5.58.2 * Update xml.js to 5.58.2 * Update show-hint.js to 5.58.2 * Update show-hint.css to 5.58.2 * Update javascript-hint.js to 5.58.2 * Update xml-hint.js to 5.58.2 * Update html-hint.js to 5.58.2 * Update css-hint.js to 5.58.2 * Update anyword-hint.js to 5.58.2 * Update closebrackets.js to 5.58.2 * Update matchbrackets.js to 5.58.2 * Update closetag.js to 5.58.2 * Update xml-fold.js to 5.58.2 * Update fullscreen.js to 5.58.2 * Update emacs.js to 5.58.2 * Update sublime.js to 5.58.2 * Update comment.js to 5.58.2 * Update vim.js to 5.58.2 * Update css.js to 5.58.2 * Update multiplex.js to 5.58.2 * Update htmlembedded.js to 5.58.2 * Update htmlmixed.js to 5.58.2 * Update javascript.js to 5.58.2 * Update markdown.js to 5.58.2 * Update markdown.js * Update readme.tid * Update markdown.js --- .../codemirror-autocomplete/files/addon/hint/anyword-hint.js | 4 ++-- .../codemirror-autocomplete/files/addon/hint/css-hint.js | 4 ++-- .../codemirror-autocomplete/files/addon/hint/html-hint.js | 4 ++-- .../files/addon/hint/javascript-hint.js | 4 ++-- .../codemirror-autocomplete/files/addon/hint/show-hint.css | 2 +- .../codemirror-autocomplete/files/addon/hint/show-hint.js | 4 ++-- .../codemirror-autocomplete/files/addon/hint/xml-hint.js | 4 ++-- .../files/addon/edit/closebrackets.js | 4 ++-- .../files/addon/edit/matchbrackets.js | 4 ++-- .../codemirror-closetag/files/addon/edit/closetag.js | 4 ++-- .../codemirror-closetag/files/addon/fold/xml-fold.js | 4 ++-- .../files/addon/fullscreen/fullscreen.js | 4 ++-- .../tiddlywiki/codemirror-keymap-emacs/files/keymap/emacs.js | 4 ++-- .../files/addons/comment/comment.js | 3 +-- .../codemirror-keymap-sublime-text/files/keymap/sublime.js | 4 ++-- plugins/tiddlywiki/codemirror-keymap-vim/files/keymap/vim.js | 4 ++-- plugins/tiddlywiki/codemirror-mode-css/files/mode/css/css.js | 4 ++-- .../files/addon/mode/multiplex.js | 4 ++-- .../files/mode/htmlembedded/htmlembedded.js | 4 ++-- .../files/mode/htmlmixed/htmlmixed.js | 4 ++-- .../files/mode/javascript/javascript.js | 4 ++-- .../codemirror-mode-markdown/files/mode/markdown/markdown.js | 4 ++-- plugins/tiddlywiki/codemirror-mode-xml/files/mode/xml/xml.js | 4 ++-- .../files/addon/search/jump-to-line.js | 4 ++-- .../codemirror-search-replace/files/addon/search/search.js | 4 ++-- .../files/addon/search/searchcursor.js | 4 ++-- plugins/tiddlywiki/codemirror/files/addon/dialog/dialog.js | 2 +- .../tiddlywiki/codemirror/files/addon/selection/activeline.js | 2 +- plugins/tiddlywiki/codemirror/files/codemirror.css | 2 +- plugins/tiddlywiki/codemirror/files/codemirror.js | 2 +- plugins/tiddlywiki/codemirror/readme.tid | 2 +- 31 files changed, 55 insertions(+), 56 deletions(-) diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/anyword-hint.js b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/anyword-hint.js index 80b384a3e..56e60fb8b 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/anyword-hint.js +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/anyword-hint.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";var r=/[\w$]+/;e.registerHelper("hint","anyword",function(t,o){for(var i=o&&o.word||r,n=o&&o.range||500,f=t.getCursor(),s=t.getLine(f.line),a=f.ch,c=a;c&&i.test(s.charAt(c-1));)--c;for(var l=c!=a&&s.slice(c,a),d=o&&o.list||[],u={},p=new RegExp(i.source,"g"),g=-1;g<=1;g+=2)for(var h=f.line,m=Math.min(Math.max(h+g*n,t.firstLine()),t.lastLine())+g;h!=m;h+=g)for(var y,b=t.getLine(h);y=p.exec(b);)h==f.line&&y[0]===l||l&&0!=y[0].lastIndexOf(l,0)||Object.prototype.hasOwnProperty.call(u,y[0])||(u[y[0]]=!0,d.push(y[0]));return{list:d,from:e.Pos(f.line,c),to:e.Pos(f.line,a)}})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(y){"use strict";var b=/[\w$]+/;y.registerHelper("hint","anyword",function(e,r){for(var t=r&&r.word||b,o=r&&r.range||500,i=e.getCursor(),n=e.getLine(i.line),f=i.ch,s=f;s&&t.test(n.charAt(s-1));)--s;for(var a=s!=f&&n.slice(s,f),c=r&&r.list||[],l={},d=new RegExp(t.source,"g"),u=-1;u<=1;u+=2)for(var p=i.line,g=Math.min(Math.max(p+u*o,e.firstLine()),e.lastLine())+u;p!=g;p+=u)for(var h,m=e.getLine(p);h=d.exec(m);)p==i.line&&h[0]===a||a&&0!=h[0].lastIndexOf(a,0)||Object.prototype.hasOwnProperty.call(l,h[0])||(l[h[0]]=!0,c.push(h[0]));return{list:c,from:y.Pos(i.line,s),to:y.Pos(i.line,f)}})}); diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/css-hint.js b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/css-hint.js index fadd84612..692c52819 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/css-hint.js +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/css-hint.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../../mode/css/css")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../../mode/css/css"],e):e(CodeMirror)}(function(e){"use strict";var r={link:1,visited:1,active:1,hover:1,focus:1,"first-letter":1,"first-line":1,"first-child":1,before:1,after:1,lang:1};e.registerHelper("hint","css",function(t){var o=t.getCursor(),s=t.getTokenAt(o),i=e.innerMode(t.getMode(),s.state);if("css"==i.mode.name){if("keyword"==s.type&&0=="!important".indexOf(s.string))return{list:["!important"],from:e.Pos(o.line,s.start),to:e.Pos(o.line,s.end)};var n=s.start,a=o.ch,d=s.string.slice(0,a-n);/[^\w$_-]/.test(d)&&(d="",n=a=o.ch);var c=e.resolveMode("text/css"),f=[],l=i.state.state;return"pseudo"==l||"variable-3"==s.type?p(r):"block"==l||"maybeprop"==l?p(c.propertyKeywords):"prop"==l||"parens"==l||"at"==l||"params"==l?(p(c.valueKeywords),p(c.colorKeywords)):"media"!=l&&"media_parens"!=l||(p(c.mediaTypes),p(c.mediaFeatures)),f.length?{list:f,from:e.Pos(o.line,n),to:e.Pos(o.line,a)}:void 0}function p(e){for(var r in e)d&&0!=r.lastIndexOf(d,0)||f.push(r)}})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../../mode/css/css")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../../mode/css/css"],e):e(CodeMirror)}(function(f){"use strict";var p={active:1,after:1,before:1,checked:1,default:1,disabled:1,empty:1,enabled:1,"first-child":1,"first-letter":1,"first-line":1,"first-of-type":1,focus:1,hover:1,"in-range":1,indeterminate:1,invalid:1,lang:1,"last-child":1,"last-of-type":1,link:1,not:1,"nth-child":1,"nth-last-child":1,"nth-last-of-type":1,"nth-of-type":1,"only-of-type":1,"only-child":1,optional:1,"out-of-range":1,placeholder:1,"read-only":1,"read-write":1,required:1,root:1,selection:1,target:1,valid:1,visited:1};f.registerHelper("hint","css",function(e){var t=e.getCursor(),r=e.getTokenAt(t),o=f.innerMode(e.getMode(),r.state);if("css"==o.mode.name){if("keyword"==r.type&&0=="!important".indexOf(r.string))return{list:["!important"],from:f.Pos(t.line,r.start),to:f.Pos(t.line,r.end)};var i=r.start,s=t.ch,n=r.string.slice(0,s-i);/[^\w$_-]/.test(n)&&(n="",i=s=t.ch);var a=f.resolveMode("text/css"),d=[],l=o.state.state;return"pseudo"==l||"variable-3"==r.type?c(p):"block"==l||"maybeprop"==l?c(a.propertyKeywords):"prop"==l||"parens"==l||"at"==l||"params"==l?(c(a.valueKeywords),c(a.colorKeywords)):"media"!=l&&"media_parens"!=l||(c(a.mediaTypes),c(a.mediaFeatures)),d.length?{list:d,from:f.Pos(t.line,i),to:f.Pos(t.line,s)}:void 0}function c(e){for(var t in e)n&&0!=t.lastIndexOf(n,0)||d.push(t)}})}); diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/html-hint.js b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/html-hint.js index e3215229a..036fd0fba 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/html-hint.js +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/html-hint.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(l){"object"==typeof exports&&"object"==typeof module?l(require("../../lib/codemirror"),require("./xml-hint")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./xml-hint"],l):l(CodeMirror)}(function(l){"use strict";var t="ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "),e=["_blank","_self","_top","_parent"],a=["ascii","utf-8","utf-16","latin1","latin1"],n=["get","post","put","delete"],r=["application/x-www-form-urlencoded","multipart/form-data","text/plain"],o=["all","screen","print","embossed","braille","handheld","print","projection","screen","tty","tv","speech","3d-glasses","resolution [>][<][=] [X]","device-aspect-ratio: X/Y","orientation:portrait","orientation:landscape","device-height: [X]","device-width: [X]"],s={attrs:{}},u={a:{attrs:{href:null,ping:null,type:null,media:o,target:e,hreflang:t}},abbr:s,acronym:s,address:s,applet:s,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:o,hreflang:t,type:null,shape:["default","rect","circle","poly"]}},article:s,aside:s,audio:{attrs:{src:null,mediagroup:null,crossorigin:["anonymous","use-credentials"],preload:["none","metadata","auto"],autoplay:["","autoplay"],loop:["","loop"],controls:["","controls"]}},b:s,base:{attrs:{href:null,target:e}},basefont:s,bdi:s,bdo:s,big:s,blockquote:{attrs:{cite:null}},body:s,br:s,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:["","autofocus"],disabled:["","autofocus"],formenctype:r,formmethod:n,formnovalidate:["","novalidate"],formtarget:e,type:["submit","reset","button"]}},canvas:{attrs:{width:null,height:null}},caption:s,center:s,cite:s,code:s,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:["command","checkbox","radio"],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:["","disabled"],checked:["","checked"]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:["","disabled"],multiple:["","multiple"]}},datalist:{attrs:{data:null}},dd:s,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:["","open"]}},dfn:s,dir:s,div:s,dl:s,dt:s,em:s,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:["","disabled"],form:null,name:null}},figcaption:s,figure:s,font:s,footer:s,form:{attrs:{action:null,name:null,"accept-charset":a,autocomplete:["on","off"],enctype:r,method:n,novalidate:["","novalidate"],target:e}},frame:s,frameset:s,h1:s,h2:s,h3:s,h4:s,h5:s,h6:s,head:{attrs:{},children:["title","base","link","style","meta","script","noscript","command"]},header:s,hgroup:s,hr:s,html:{attrs:{manifest:null},children:["head","body"]},i:s,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:["allow-top-navigation","allow-same-origin","allow-forms","allow-scripts"],seamless:["","seamless"]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:["anonymous","use-credentials"]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:["audio/*","video/*","image/*"],autocomplete:["on","off"],autofocus:["","autofocus"],checked:["","checked"],disabled:["","disabled"],formenctype:r,formmethod:n,formnovalidate:["","novalidate"],formtarget:e,multiple:["","multiple"],readonly:["","readonly"],required:["","required"],type:["hidden","text","search","tel","url","email","password","datetime","date","month","week","time","datetime-local","number","range","color","checkbox","radio","file","submit","image","reset","button"]}},ins:{attrs:{cite:null,datetime:null}},kbd:s,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:["","autofocus"],disabled:["","disabled"],keytype:["RSA"]}},label:{attrs:{for:null,form:null}},legend:s,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:t,media:o,sizes:["all","16x16","16x16 32x32","16x16 32x32 64x64"]}},map:{attrs:{name:null}},mark:s,menu:{attrs:{label:null,type:["list","context","toolbar"]}},meta:{attrs:{content:null,charset:a,name:["viewport","application-name","author","description","generator","keywords"],"http-equiv":["content-language","content-type","default-style","refresh"]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:s,noframes:s,noscript:s,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:["","typemustmatch"]}},ol:{attrs:{reversed:["","reversed"],start:null,type:["1","a","A","i","I"]}},optgroup:{attrs:{disabled:["","disabled"],label:null}},option:{attrs:{disabled:["","disabled"],label:null,selected:["","selected"],value:null}},output:{attrs:{for:null,form:null,name:null}},p:s,param:{attrs:{name:null,value:null}},pre:s,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:s,rt:s,ruby:s,s:s,samp:s,script:{attrs:{type:["text/javascript"],src:null,async:["","async"],defer:["","defer"],charset:a}},section:s,select:{attrs:{form:null,name:null,size:null,autofocus:["","autofocus"],disabled:["","disabled"],multiple:["","multiple"]}},small:s,source:{attrs:{src:null,type:null,media:null}},span:s,strike:s,strong:s,style:{attrs:{type:["text/css"],media:o,scoped:null}},sub:s,summary:s,sup:s,table:s,tbody:s,td:{attrs:{colspan:null,rowspan:null,headers:null}},textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:["","autofocus"],disabled:["","disabled"],readonly:["","readonly"],required:["","required"],wrap:["soft","hard"]}},tfoot:s,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:["row","col","rowgroup","colgroup"]}},thead:s,time:{attrs:{datetime:null}},title:s,tr:s,track:{attrs:{src:null,label:null,default:null,kind:["subtitles","captions","descriptions","chapters","metadata"],srclang:t}},tt:s,u:s,ul:s,var:s,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:["anonymous","use-credentials"],preload:["auto","metadata","none"],autoplay:["","autoplay"],mediagroup:["movie"],muted:["","muted"],controls:["","controls"]}},wbr:s},i={accesskey:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"],class:null,contenteditable:["true","false"],contextmenu:null,dir:["ltr","rtl","auto"],draggable:["true","false","auto"],dropzone:["copy","move","link","string:","file:"],hidden:["hidden"],id:null,inert:["inert"],itemid:null,itemprop:null,itemref:null,itemscope:["itemscope"],itemtype:null,lang:["en","es"],spellcheck:["true","false"],style:null,tabindex:["1","2","3","4","5","6","7","8","9"],title:null,translate:["yes","no"],onclick:null,rel:["stylesheet","alternate","author","bookmark","help","license","next","nofollow","noreferrer","prefetch","prev","search","tag"]};function d(l){for(var t in i)i.hasOwnProperty(t)&&(l.attrs[t]=i[t])}for(var c in d(s),u)u.hasOwnProperty(c)&&u[c]!=s&&d(u[c]);l.htmlSchema=u,l.registerHelper("hint","html",function(t,e){var a={schemaInfo:u};if(e)for(var n in e)a[n]=e[n];return l.hint.xml(t,a)})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(l){"object"==typeof exports&&"object"==typeof module?l(require("../../lib/codemirror"),require("./xml-hint")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./xml-hint"],l):l(CodeMirror)}(function(n){"use strict";var l="ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "),t=["_blank","_self","_top","_parent"],e=["ascii","utf-8","utf-16","latin1","latin1"],a=["get","post","put","delete"],r=["application/x-www-form-urlencoded","multipart/form-data","text/plain"],o=["all","screen","print","embossed","braille","handheld","print","projection","screen","tty","tv","speech","3d-glasses","resolution [>][<][=] [X]","device-aspect-ratio: X/Y","orientation:portrait","orientation:landscape","device-height: [X]","device-width: [X]"],s={attrs:{}},u={a:{attrs:{href:null,ping:null,type:null,media:o,target:t,hreflang:l}},abbr:s,acronym:s,address:s,applet:s,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:o,hreflang:l,type:null,shape:["default","rect","circle","poly"]}},article:s,aside:s,audio:{attrs:{src:null,mediagroup:null,crossorigin:["anonymous","use-credentials"],preload:["none","metadata","auto"],autoplay:["","autoplay"],loop:["","loop"],controls:["","controls"]}},b:s,base:{attrs:{href:null,target:t}},basefont:s,bdi:s,bdo:s,big:s,blockquote:{attrs:{cite:null}},body:s,br:s,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:["","autofocus"],disabled:["","autofocus"],formenctype:r,formmethod:a,formnovalidate:["","novalidate"],formtarget:t,type:["submit","reset","button"]}},canvas:{attrs:{width:null,height:null}},caption:s,center:s,cite:s,code:s,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:["command","checkbox","radio"],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:["","disabled"],checked:["","checked"]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:["","disabled"],multiple:["","multiple"]}},datalist:{attrs:{data:null}},dd:s,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:["","open"]}},dfn:s,dir:s,div:s,dl:s,dt:s,em:s,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:["","disabled"],form:null,name:null}},figcaption:s,figure:s,font:s,footer:s,form:{attrs:{action:null,name:null,"accept-charset":e,autocomplete:["on","off"],enctype:r,method:a,novalidate:["","novalidate"],target:t}},frame:s,frameset:s,h1:s,h2:s,h3:s,h4:s,h5:s,h6:s,head:{attrs:{},children:["title","base","link","style","meta","script","noscript","command"]},header:s,hgroup:s,hr:s,html:{attrs:{manifest:null},children:["head","body"]},i:s,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:["allow-top-navigation","allow-same-origin","allow-forms","allow-scripts"],seamless:["","seamless"]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:["anonymous","use-credentials"]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:["audio/*","video/*","image/*"],autocomplete:["on","off"],autofocus:["","autofocus"],checked:["","checked"],disabled:["","disabled"],formenctype:r,formmethod:a,formnovalidate:["","novalidate"],formtarget:t,multiple:["","multiple"],readonly:["","readonly"],required:["","required"],type:["hidden","text","search","tel","url","email","password","datetime","date","month","week","time","datetime-local","number","range","color","checkbox","radio","file","submit","image","reset","button"]}},ins:{attrs:{cite:null,datetime:null}},kbd:s,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:["","autofocus"],disabled:["","disabled"],keytype:["RSA"]}},label:{attrs:{for:null,form:null}},legend:s,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:l,media:o,sizes:["all","16x16","16x16 32x32","16x16 32x32 64x64"]}},map:{attrs:{name:null}},mark:s,menu:{attrs:{label:null,type:["list","context","toolbar"]}},meta:{attrs:{content:null,charset:e,name:["viewport","application-name","author","description","generator","keywords"],"http-equiv":["content-language","content-type","default-style","refresh"]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:s,noframes:s,noscript:s,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:["","typemustmatch"]}},ol:{attrs:{reversed:["","reversed"],start:null,type:["1","a","A","i","I"]}},optgroup:{attrs:{disabled:["","disabled"],label:null}},option:{attrs:{disabled:["","disabled"],label:null,selected:["","selected"],value:null}},output:{attrs:{for:null,form:null,name:null}},p:s,param:{attrs:{name:null,value:null}},pre:s,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:s,rt:s,ruby:s,s:s,samp:s,script:{attrs:{type:["text/javascript"],src:null,async:["","async"],defer:["","defer"],charset:e}},section:s,select:{attrs:{form:null,name:null,size:null,autofocus:["","autofocus"],disabled:["","disabled"],multiple:["","multiple"]}},small:s,source:{attrs:{src:null,type:null,media:null}},span:s,strike:s,strong:s,style:{attrs:{type:["text/css"],media:o,scoped:null}},sub:s,summary:s,sup:s,table:s,tbody:s,td:{attrs:{colspan:null,rowspan:null,headers:null}},textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:["","autofocus"],disabled:["","disabled"],readonly:["","readonly"],required:["","required"],wrap:["soft","hard"]}},tfoot:s,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:["row","col","rowgroup","colgroup"]}},thead:s,time:{attrs:{datetime:null}},title:s,tr:s,track:{attrs:{src:null,label:null,default:null,kind:["subtitles","captions","descriptions","chapters","metadata"],srclang:l}},tt:s,u:s,ul:s,var:s,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:["anonymous","use-credentials"],preload:["auto","metadata","none"],autoplay:["","autoplay"],mediagroup:["movie"],muted:["","muted"],controls:["","controls"]}},wbr:s},i={accesskey:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"],class:null,contenteditable:["true","false"],contextmenu:null,dir:["ltr","rtl","auto"],draggable:["true","false","auto"],dropzone:["copy","move","link","string:","file:"],hidden:["hidden"],id:null,inert:["inert"],itemid:null,itemprop:null,itemref:null,itemscope:["itemscope"],itemtype:null,lang:["en","es"],spellcheck:["true","false"],autocorrect:["true","false"],autocapitalize:["true","false"],style:null,tabindex:["1","2","3","4","5","6","7","8","9"],title:null,translate:["yes","no"],onclick:null,rel:["stylesheet","alternate","author","bookmark","help","license","next","nofollow","noreferrer","prefetch","prev","search","tag"]};function d(l){for(var t in i)i.hasOwnProperty(t)&&(l.attrs[t]=i[t])}for(var c in d(s),u)u.hasOwnProperty(c)&&u[c]!=s&&d(u[c]);n.htmlSchema=u,n.registerHelper("hint","html",function(l,t){var e={schemaInfo:u};if(t)for(var a in t)e[a]=t[a];return n.hint.xml(l,e)})}); diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/javascript-hint.js b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/javascript-hint.js index 0e8cc6a6c..f1504e76b 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/javascript-hint.js +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/javascript-hint.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){var e=t.Pos;function r(t,e){for(var r=0,n=t.length;r<n;++r)e(t[r])}function n(n,i,l,f){var c=n.getCursor(),p=l(n,c);if(!/\b(?:string|comment)\b/.test(p.type)){var u=t.innerMode(n.getMode(),p.state);if("json"!==u.mode.helperType){p.state=u.state,/^[\w$_]*$/.test(p.string)?p.end>c.ch&&(p.end=c.ch,p.string=p.string.slice(0,c.ch-p.start)):p={start:c.ch,end:c.ch,string:"",state:p.state,type:"."==p.string?"property":null};for(var d=p;"property"==d.type;){if("."!=(d=l(n,e(c.line,d.start))).string)return;if(d=l(n,e(c.line,d.start)),!g)var g=[];g.push(d)}return{list:function(t,e,n,i){var l=[],f=t.string,c=i&&i.globalScope||window;function p(t){0!=t.lastIndexOf(f,0)||function(t,e){if(!Array.prototype.indexOf){for(var r=t.length;r--;)if(t[r]===e)return!0;return!1}return-1!=t.indexOf(e)}(l,t)||l.push(t)}function u(t){"string"==typeof t?r(o,p):t instanceof Array?r(s,p):t instanceof Function&&r(a,p),function(t,e){if(Object.getOwnPropertyNames&&Object.getPrototypeOf)for(var r=t;r;r=Object.getPrototypeOf(r))Object.getOwnPropertyNames(r).forEach(e);else for(var n in t)e(n)}(t,p)}if(e&&e.length){var d,g=e.pop();for(g.type&&0===g.type.indexOf("variable")?(i&&i.additionalContext&&(d=i.additionalContext[g.string]),i&&!1===i.useGlobalScope||(d=d||c[g.string])):"string"==g.type?d="":"atom"==g.type?d=1:"function"==g.type&&(null==c.jQuery||"$"!=g.string&&"jQuery"!=g.string||"function"!=typeof c.jQuery?null!=c._&&"_"==g.string&&"function"==typeof c._&&(d=c._()):d=c.jQuery());null!=d&&e.length;)d=d[e.pop().string];null!=d&&u(d)}else{for(var y=t.state.localVars;y;y=y.next)p(y.name);for(var y=t.state.globalVars;y;y=y.next)p(y.name);i&&!1===i.useGlobalScope||u(c),r(n,p)}return l}(p,g,i,f),from:e(c.line,p.start),to:e(c.line,p.end)}}}}function i(t,e){var r=t.getTokenAt(e);return e.ch==r.start+1&&"."==r.string.charAt(0)?(r.end=r.start,r.string=".",r.type="property"):/^\.[\w$_]*$/.test(r.string)&&(r.type="property",r.start++,r.string=r.string.replace(/\./,"")),r}t.registerHelper("hint","javascript",function(t,e){return n(t,l,function(t,e){return t.getTokenAt(e)},e)}),t.registerHelper("hint","coffeescript",function(t,e){return n(t,f,i,e)});var o="charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight toUpperCase toLowerCase split concat match replace search".split(" "),s="length concat join splice push pop shift unshift slice reverse sort indexOf lastIndexOf every some filter forEach map reduce reduceRight ".split(" "),a="prototype apply call bind".split(" "),l="break case catch class const continue debugger default delete do else export extends false finally for function if in import instanceof new null return super switch this throw true try typeof var void while with yield".split(" "),f="and break catch class continue delete do else extends false finally for if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes".split(" ")}); +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(f){var c=f.Pos;function g(t,e){for(var r=0,n=t.length;r<n;++r)e(t[r])}function r(t,e,r,n){var i=t.getCursor(),o=r(t,i);if(!/\b(?:string|comment)\b/.test(o.type)){var s=f.innerMode(t.getMode(),o.state);if("json"!==s.mode.helperType){o.state=s.state,/^[\w$_]*$/.test(o.string)?o.end>i.ch&&(o.end=i.ch,o.string=o.string.slice(0,i.ch-o.start)):o={start:i.ch,end:i.ch,string:"",state:o.state,type:"."==o.string?"property":null};for(var a=o;"property"==a.type;){if("."!=(a=r(t,c(i.line,a.start))).string)return;a=r(t,c(i.line,a.start));var l=l||[];l.push(a)}return{list:function(t,e,r,n){var i=[],o=t.string,s=n&&n.globalScope||window;function a(t){0!=t.lastIndexOf(o,0)||function(t,e){if(Array.prototype.indexOf)return-1!=t.indexOf(e);for(var r=t.length;r--;)if(t[r]===e)return 1}(i,t)||i.push(t)}function l(t){"string"==typeof t?g(y,a):t instanceof Array?g(h,a):t instanceof Function&&g(v,a),function(t,e){if(Object.getOwnPropertyNames&&Object.getPrototypeOf)for(var r=t;r;r=Object.getPrototypeOf(r))Object.getOwnPropertyNames(r).forEach(e);else for(var n in t)e(n)}(t,a)}if(e&&e.length){var f,c=e.pop();for(c.type&&0===c.type.indexOf("variable")?(n&&n.additionalContext&&(f=n.additionalContext[c.string]),n&&!1===n.useGlobalScope||(f=f||s[c.string])):"string"==c.type?f="":"atom"==c.type?f=1:"function"==c.type&&(null==s.jQuery||"$"!=c.string&&"jQuery"!=c.string||"function"!=typeof s.jQuery?null!=s._&&"_"==c.string&&"function"==typeof s._&&(f=s._()):f=s.jQuery());null!=f&&e.length;)f=f[e.pop().string];null!=f&&l(f)}else{for(var p=t.state.localVars;p;p=p.next)a(p.name);for(var u=t.state.context;u;u=u.prev)for(p=u.vars;p;p=p.next)a(p.name);for(p=t.state.globalVars;p;p=p.next)a(p.name);if(n&&null!=n.additionalContext)for(var d in n.additionalContext)a(d);n&&!1===n.useGlobalScope||l(s),g(r,a)}return i}(o,l,e,n),from:c(i.line,o.start),to:c(i.line,o.end)}}}}function n(t,e){var r=t.getTokenAt(e);return e.ch==r.start+1&&"."==r.string.charAt(0)?(r.end=r.start,r.string=".",r.type="property"):/^\.[\w$_]*$/.test(r.string)&&(r.type="property",r.start++,r.string=r.string.replace(/\./,"")),r}f.registerHelper("hint","javascript",function(t,e){return r(t,i,function(t,e){return t.getTokenAt(e)},e)}),f.registerHelper("hint","coffeescript",function(t,e){return r(t,o,n,e)});var y="charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight toUpperCase toLowerCase split concat match replace search".split(" "),h="length concat join splice push pop shift unshift slice reverse sort indexOf lastIndexOf every some filter forEach map reduce reduceRight ".split(" "),v="prototype apply call bind".split(" "),i="break case catch class const continue debugger default delete do else export extends false finally for function if in import instanceof new null return super switch this throw true try typeof var void while with yield".split(" "),o="and break catch class continue delete do else extends false finally for if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes".split(" ")}); diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css index 91d74dfc9..5617ccca2 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.css @@ -1,6 +1,6 @@ .CodeMirror-hints { position: absolute; - z-index: 999; + z-index: 10; overflow: hidden; list-style: none; diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.js b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.js index 8c58de461..7981e7b4a 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.js +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";var i="CodeMirror-hint",e="CodeMirror-hint-active";function n(t,i){this.cm=t,this.options=i,this.widget=null,this.debounce=0,this.tick=0,this.startPos=this.cm.getCursor("start"),this.startLen=this.cm.getLine(this.startPos.line).length-this.cm.getSelection().length;var e=this;t.on("cursorActivity",this.activityFunc=function(){e.cursorActivity()})}t.showHint=function(t,i,e){if(!i)return t.showHint(e);e&&e.async&&(i.async=!0);var n={hint:i};if(e)for(var o in e)n[o]=e[o];return t.showHint(n)},t.defineExtension("showHint",function(i){i=function(t,i,e){var n=t.options.hintOptions,o={};for(var s in a)o[s]=a[s];if(n)for(var s in n)void 0!==n[s]&&(o[s]=n[s]);if(e)for(var s in e)void 0!==e[s]&&(o[s]=e[s]);o.hint.resolve&&(o.hint=o.hint.resolve(t,i));return o}(this,this.getCursor("start"),i);var e=this.listSelections();if(!(e.length>1)){if(this.somethingSelected()){if(!i.hint.supportsSelection)return;for(var o=0;o<e.length;o++)if(e[o].head.line!=e[o].anchor.line)return}this.state.completionActive&&this.state.completionActive.close();var s=this.state.completionActive=new n(this,i);s.options.hint&&(t.signal(this,"startCompletion",this),s.update(!0))}});var o=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},s=window.cancelAnimationFrame||clearTimeout;function c(t){return"string"==typeof t?t:t.text}function r(t,i){for(;i&&i!=t;){if("LI"===i.nodeName.toUpperCase()&&i.parentNode==t)return i;i=i.parentNode}}function h(n,o){this.completion=n,this.data=o,this.picked=!1;var s=this,h=n.cm,l=this.hints=document.createElement("ul");l.className="CodeMirror-hints",this.selectedHint=o.selectedHint||0;for(var a=o.list,u=0;u<a.length;++u){var f=l.appendChild(document.createElement("li")),d=a[u],p=i+(u!=this.selectedHint?"":" "+e);null!=d.className&&(p=d.className+" "+p),f.className=p,d.render?d.render(f,o,d):f.appendChild(document.createTextNode(d.displayText||c(d))),f.hintId=u}var m=h.cursorCoords(n.options.alignWithWord?o.from:null),g=m.left,v=m.bottom,y=!0;l.style.left=g+"px",l.style.top=v+"px";var w=window.innerWidth||Math.max(document.body.offsetWidth,document.documentElement.offsetWidth),H=window.innerHeight||Math.max(document.body.offsetHeight,document.documentElement.offsetHeight);(n.options.container||document.body).appendChild(l);var k=l.getBoundingClientRect(),C=k.bottom-H,b=l.scrollHeight>l.clientHeight+1,x=h.getScrollInfo();if(C>0){var A=k.bottom-k.top;if(m.top-(m.bottom-k.top)-A>0)l.style.top=(v=m.top-A)+"px",y=!1;else if(A>H){l.style.height=H-5+"px",l.style.top=(v=m.bottom-k.top)+"px";var S=h.getCursor();o.from.ch!=S.ch&&(m=h.cursorCoords(S),l.style.left=(g=m.left)+"px",k=l.getBoundingClientRect())}}var T,M=k.right-w;if(M>0&&(k.right-k.left>w&&(l.style.width=w-5+"px",M-=k.right-k.left-w),l.style.left=(g=m.left-M)+"px"),b)for(var N=l.firstChild;N;N=N.nextSibling)N.style.paddingRight=h.display.nativeBarWidth+"px";(h.addKeyMap(this.keyMap=function(t,i){var e={Up:function(){i.moveFocus(-1)},Down:function(){i.moveFocus(1)},PageUp:function(){i.moveFocus(1-i.menuSize(),!0)},PageDown:function(){i.moveFocus(i.menuSize()-1,!0)},Home:function(){i.setFocus(0)},End:function(){i.setFocus(i.length-1)},Enter:i.pick,Tab:i.pick,Esc:i.close},n=t.options.customKeys,o=n?{}:e;function s(t,n){var s;s="string"!=typeof n?function(t){return n(t,i)}:e.hasOwnProperty(n)?e[n]:n,o[t]=s}if(n)for(var c in n)n.hasOwnProperty(c)&&s(c,n[c]);var r=t.options.extraKeys;if(r)for(var c in r)r.hasOwnProperty(c)&&s(c,r[c]);return o}(n,{moveFocus:function(t,i){s.changeActive(s.selectedHint+t,i)},setFocus:function(t){s.changeActive(t)},menuSize:function(){return s.screenAmount()},length:a.length,close:function(){n.close()},pick:function(){s.pick()},data:o})),n.options.closeOnUnfocus)&&(h.on("blur",this.onBlur=function(){T=setTimeout(function(){n.close()},100)}),h.on("focus",this.onFocus=function(){clearTimeout(T)}));return h.on("scroll",this.onScroll=function(){var t=h.getScrollInfo(),i=h.getWrapperElement().getBoundingClientRect(),e=v+x.top-t.top,o=e-(window.pageYOffset||(document.documentElement||document.body).scrollTop);if(y||(o+=l.offsetHeight),o<=i.top||o>=i.bottom)return n.close();l.style.top=e+"px",l.style.left=g+x.left-t.left+"px"}),t.on(l,"dblclick",function(t){var i=r(l,t.target||t.srcElement);i&&null!=i.hintId&&(s.changeActive(i.hintId),s.pick())}),t.on(l,"click",function(t){var i=r(l,t.target||t.srcElement);i&&null!=i.hintId&&(s.changeActive(i.hintId),n.options.completeOnSingleClick&&s.pick())}),t.on(l,"mousedown",function(){setTimeout(function(){h.focus()},20)}),t.signal(o,"select",a[this.selectedHint],l.childNodes[this.selectedHint]),!0}function l(t,i,e,n){if(t.async)t(i,n,e);else{var o=t(i,e);o&&o.then?o.then(n):n(o)}}n.prototype={close:function(){this.active()&&(this.cm.state.completionActive=null,this.tick=null,this.cm.off("cursorActivity",this.activityFunc),this.widget&&this.data&&t.signal(this.data,"close"),this.widget&&this.widget.close(),t.signal(this.cm,"endCompletion",this.cm))},active:function(){return this.cm.state.completionActive==this},pick:function(i,e){var n=i.list[e];n.hint?n.hint(this.cm,i,n):this.cm.replaceRange(c(n),n.from||i.from,n.to||i.to,"complete"),t.signal(i,"pick",n),this.close()},cursorActivity:function(){this.debounce&&(s(this.debounce),this.debounce=0);var t=this.cm.getCursor(),i=this.cm.getLine(t.line);if(t.line!=this.startPos.line||i.length-t.ch!=this.startLen-this.startPos.ch||t.ch<this.startPos.ch||this.cm.somethingSelected()||t.ch&&this.options.closeCharacters.test(i.charAt(t.ch-1)))this.close();else{var e=this;this.debounce=o(function(){e.update()}),this.widget&&this.widget.disable()}},update:function(t){if(null!=this.tick){var i=this,e=++this.tick;l(this.options.hint,this.cm,this.options,function(n){i.tick==e&&i.finishUpdate(n,t)})}},finishUpdate:function(i,e){this.data&&t.signal(this.data,"update");var n=this.widget&&this.widget.picked||e&&this.options.completeSingle;this.widget&&this.widget.close(),this.data=i,i&&i.list.length&&(n&&1==i.list.length?this.pick(i,0):(this.widget=new h(this,i),t.signal(i,"shown")))}},h.prototype={close:function(){if(this.completion.widget==this){this.completion.widget=null,this.hints.parentNode.removeChild(this.hints),this.completion.cm.removeKeyMap(this.keyMap);var t=this.completion.cm;this.completion.options.closeOnUnfocus&&(t.off("blur",this.onBlur),t.off("focus",this.onFocus)),t.off("scroll",this.onScroll)}},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var t=this;this.keyMap={Enter:function(){t.picked=!0}},this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(i,n){if(i>=this.data.list.length?i=n?this.data.list.length-1:0:i<0&&(i=n?0:this.data.list.length-1),this.selectedHint!=i){var o=this.hints.childNodes[this.selectedHint];o.className=o.className.replace(" "+e,""),(o=this.hints.childNodes[this.selectedHint=i]).className+=" "+e,o.offsetTop<this.hints.scrollTop?this.hints.scrollTop=o.offsetTop-3:o.offsetTop+o.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=o.offsetTop+o.offsetHeight-this.hints.clientHeight+3),t.signal(this.data,"select",this.data.list[this.selectedHint],o)}},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}},t.registerHelper("hint","auto",{resolve:function(i,e){var n,o=i.getHelpers(e,"hint");if(o.length){var s=function(t,i,e){var n=function(t,i){if(!t.somethingSelected())return i;for(var e=[],n=0;n<i.length;n++)i[n].supportsSelection&&e.push(i[n]);return e}(t,o);!function o(s){if(s==n.length)return i(null);l(n[s],t,e,function(t){t&&t.list.length>0?i(t):o(s+1)})}(0)};return s.async=!0,s.supportsSelection=!0,s}return(n=i.getHelper(i.getCursor(),"hintWords"))?function(i){return t.hint.fromList(i,{words:n})}:t.hint.anyword?function(i,e){return t.hint.anyword(i,e)}:function(){}}}),t.registerHelper("hint","fromList",function(i,e){var n,o=i.getCursor(),s=i.getTokenAt(o),c=t.Pos(o.line,s.start),r=o;s.start<o.ch&&/\w/.test(s.string.charAt(o.ch-s.start-1))?n=s.string.substr(0,o.ch-s.start):(n="",c=o);for(var h=[],l=0;l<e.words.length;l++){var a=e.words[l];a.slice(0,n.length)==n&&h.push(a)}if(h.length)return{list:h,from:c,to:r}}),t.commands.autocomplete=t.showHint;var a={hint:t.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\s()\[\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!0,container:null,customKeys:null,extraKeys:null};t.defineOption("hintOptions",null)}); +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(W){"use strict";var I="CodeMirror-hint-active";function o(t,i){this.cm=t,this.options=i,this.widget=null,this.debounce=0,this.tick=0,this.startPos=this.cm.getCursor("start"),this.startLen=this.cm.getLine(this.startPos.line).length-this.cm.getSelection().length;var e=this;t.on("cursorActivity",this.activityFunc=function(){e.cursorActivity()})}W.showHint=function(t,i,e){if(!i)return t.showHint(e);e&&e.async&&(i.async=!0);var n={hint:i};if(e)for(var o in e)n[o]=e[o];return t.showHint(n)},W.defineExtension("showHint",function(t){t=function(t,i,e){var n=t.options.hintOptions,o={};for(var s in l)o[s]=l[s];if(n)for(var s in n)void 0!==n[s]&&(o[s]=n[s]);if(e)for(var s in e)void 0!==e[s]&&(o[s]=e[s]);o.hint.resolve&&(o.hint=o.hint.resolve(t,i));return o}(this,this.getCursor("start"),t);var i=this.listSelections();if(!(1<i.length)){if(this.somethingSelected()){if(!t.hint.supportsSelection)return;for(var e=0;e<i.length;e++)if(i[e].head.line!=i[e].anchor.line)return}this.state.completionActive&&this.state.completionActive.close();var n=this.state.completionActive=new o(this,t);n.options.hint&&(W.signal(this,"startCompletion",this),n.update(!0))}}),W.defineExtension("closeHint",function(){this.state.completionActive&&this.state.completionActive.close()});var s=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},c=window.cancelAnimationFrame||clearTimeout;function B(t){return"string"==typeof t?t:t.text}function K(t,i){for(;i&&i!=t;){if("LI"===i.nodeName.toUpperCase()&&i.parentNode==t)return i;i=i.parentNode}}function n(o,t){this.completion=o,this.data=t,this.picked=!1;var e=this,s=o.cm,c=s.getInputField().ownerDocument,r=c.defaultView||c.parentWindow,l=this.hints=c.createElement("ul"),i=o.cm.options.theme;l.className="CodeMirror-hints "+i,this.selectedHint=t.selectedHint||0;for(var n=t.list,h=0;h<n.length;++h){var a=l.appendChild(c.createElement("li")),u=n[h],f="CodeMirror-hint"+(h!=this.selectedHint?"":" "+I);null!=u.className&&(f=u.className+" "+f),a.className=f,u.render?u.render(a,t,u):a.appendChild(c.createTextNode(u.displayText||B(u))),a.hintId=h}var p,d,m,g=o.options.container||c.body,v=s.cursorCoords(o.options.alignWithWord?t.from:null),y=v.left,w=v.bottom,H=!0,C=0,b=0;g!==c.body&&(d=(p=-1!==["absolute","relative","fixed"].indexOf(r.getComputedStyle(g).position)?g:g.offsetParent).getBoundingClientRect(),m=c.body.getBoundingClientRect(),C=d.left-m.left-p.scrollLeft,b=d.top-m.top-p.scrollTop),l.style.left=y-C+"px",l.style.top=w-b+"px";var k=r.innerWidth||Math.max(c.body.offsetWidth,c.documentElement.offsetWidth),A=r.innerHeight||Math.max(c.body.offsetHeight,c.documentElement.offsetHeight);g.appendChild(l);var x,T,S=l.getBoundingClientRect(),M=S.bottom-A,N=l.scrollHeight>l.clientHeight+1,F=s.getScrollInfo();0<M&&(x=S.bottom-S.top,0<v.top-(v.bottom-S.top)-x?(l.style.top=(w=v.top-x-b)+"px",H=!1):A<x&&(l.style.height=A-5+"px",l.style.top=(w=v.bottom-S.top-b)+"px",T=s.getCursor(),t.from.ch!=T.ch&&(v=s.cursorCoords(T),l.style.left=(y=v.left-C)+"px",S=l.getBoundingClientRect())));var E,O=S.right-k;if(0<O&&(S.right-S.left>k&&(l.style.width=k-5+"px",O-=S.right-S.left-k),l.style.left=(y=v.left-O-C)+"px"),N)for(var P=l.firstChild;P;P=P.nextSibling)P.style.paddingRight=s.display.nativeBarWidth+"px";return s.addKeyMap(this.keyMap=function(t,n){var o={Up:function(){n.moveFocus(-1)},Down:function(){n.moveFocus(1)},PageUp:function(){n.moveFocus(1-n.menuSize(),!0)},PageDown:function(){n.moveFocus(n.menuSize()-1,!0)},Home:function(){n.setFocus(0)},End:function(){n.setFocus(n.length-1)},Enter:n.pick,Tab:n.pick,Esc:n.close};/Mac/.test(navigator.platform)&&(o["Ctrl-P"]=function(){n.moveFocus(-1)},o["Ctrl-N"]=function(){n.moveFocus(1)});var i=t.options.customKeys,s=i?{}:o;function e(t,i){var e="string"!=typeof i?function(t){return i(t,n)}:o.hasOwnProperty(i)?o[i]:i;s[t]=e}if(i)for(var c in i)i.hasOwnProperty(c)&&e(c,i[c]);var r=t.options.extraKeys;if(r)for(var c in r)r.hasOwnProperty(c)&&e(c,r[c]);return s}(o,{moveFocus:function(t,i){e.changeActive(e.selectedHint+t,i)},setFocus:function(t){e.changeActive(t)},menuSize:function(){return e.screenAmount()},length:n.length,close:function(){o.close()},pick:function(){e.pick()},data:t})),o.options.closeOnUnfocus&&(s.on("blur",this.onBlur=function(){E=setTimeout(function(){o.close()},100)}),s.on("focus",this.onFocus=function(){clearTimeout(E)})),s.on("scroll",this.onScroll=function(){var t=s.getScrollInfo(),i=s.getWrapperElement().getBoundingClientRect(),e=w+F.top-t.top,n=e-(r.pageYOffset||(c.documentElement||c.body).scrollTop);if(H||(n+=l.offsetHeight),n<=i.top||n>=i.bottom)return o.close();l.style.top=e+"px",l.style.left=y+F.left-t.left+"px"}),W.on(l,"dblclick",function(t){var i=K(l,t.target||t.srcElement);i&&null!=i.hintId&&(e.changeActive(i.hintId),e.pick())}),W.on(l,"click",function(t){var i=K(l,t.target||t.srcElement);i&&null!=i.hintId&&(e.changeActive(i.hintId),o.options.completeOnSingleClick&&e.pick())}),W.on(l,"mousedown",function(){setTimeout(function(){s.focus()},20)}),this.scrollToActive(),W.signal(t,"select",n[this.selectedHint],l.childNodes[this.selectedHint]),!0}function r(t,i,e,n){var o;t.async?t(i,n,e):(o=t(i,e))&&o.then?o.then(n):n(o)}o.prototype={close:function(){this.active()&&(this.cm.state.completionActive=null,this.tick=null,this.cm.off("cursorActivity",this.activityFunc),this.widget&&this.data&&W.signal(this.data,"close"),this.widget&&this.widget.close(),W.signal(this.cm,"endCompletion",this.cm))},active:function(){return this.cm.state.completionActive==this},pick:function(t,i){var e=t.list[i],n=this;this.cm.operation(function(){e.hint?e.hint(n.cm,t,e):n.cm.replaceRange(B(e),e.from||t.from,e.to||t.to,"complete"),W.signal(t,"pick",e),n.cm.scrollIntoView()}),this.close()},cursorActivity:function(){this.debounce&&(c(this.debounce),this.debounce=0);var t=this.startPos;this.data&&(t=this.data.from);var i,e=this.cm.getCursor(),n=this.cm.getLine(e.line);e.line!=this.startPos.line||n.length-e.ch!=this.startLen-this.startPos.ch||e.ch<t.ch||this.cm.somethingSelected()||!e.ch||this.options.closeCharacters.test(n.charAt(e.ch-1))?this.close():((i=this).debounce=s(function(){i.update()}),this.widget&&this.widget.disable())},update:function(i){var e,n;null!=this.tick&&(n=++(e=this).tick,r(this.options.hint,this.cm,this.options,function(t){e.tick==n&&e.finishUpdate(t,i)}))},finishUpdate:function(t,i){this.data&&W.signal(this.data,"update");var e=this.widget&&this.widget.picked||i&&this.options.completeSingle;this.widget&&this.widget.close(),(this.data=t)&&t.list.length&&(e&&1==t.list.length?this.pick(t,0):(this.widget=new n(this,t),W.signal(t,"shown")))}},n.prototype={close:function(){var t;this.completion.widget==this&&(this.completion.widget=null,this.hints.parentNode.removeChild(this.hints),this.completion.cm.removeKeyMap(this.keyMap),t=this.completion.cm,this.completion.options.closeOnUnfocus&&(t.off("blur",this.onBlur),t.off("focus",this.onFocus)),t.off("scroll",this.onScroll))},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var t=this;this.keyMap={Enter:function(){t.picked=!0}},this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(t,i){var e;t>=this.data.list.length?t=i?this.data.list.length-1:0:t<0&&(t=i?0:this.data.list.length-1),this.selectedHint!=t&&((e=this.hints.childNodes[this.selectedHint])&&(e.className=e.className.replace(" "+I,"")),(e=this.hints.childNodes[this.selectedHint=t]).className+=" "+I,this.scrollToActive(),W.signal(this.data,"select",this.data.list[this.selectedHint],e))},scrollToActive:function(){var t=this.completion.options.scrollMargin||0,i=this.hints.childNodes[Math.max(0,this.selectedHint-t)],e=this.hints.childNodes[Math.min(this.data.list.length-1,this.selectedHint+t)],n=this.hints.firstChild;i.offsetTop<this.hints.scrollTop?this.hints.scrollTop=i.offsetTop-n.offsetTop:e.offsetTop+e.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=e.offsetTop+e.offsetHeight-this.hints.clientHeight+n.offsetTop)},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}},W.registerHelper("hint","auto",{resolve:function(t,i){var e,c=t.getHelpers(i,"hint");if(c.length){var n=function(t,n,o){var s=function(t,i){if(!t.somethingSelected())return i;for(var e=[],n=0;n<i.length;n++)i[n].supportsSelection&&e.push(i[n]);return e}(t,c);!function i(e){if(e==s.length)return n(null);r(s[e],t,o,function(t){t&&0<t.list.length?n(t):i(e+1)})}(0)};return n.async=!0,n.supportsSelection=!0,n}return(e=t.getHelper(t.getCursor(),"hintWords"))?function(t){return W.hint.fromList(t,{words:e})}:W.hint.anyword?function(t,i){return W.hint.anyword(t,i)}:function(){}}}),W.registerHelper("hint","fromList",function(t,i){var e,n=t.getCursor(),o=t.getTokenAt(n),s=W.Pos(n.line,o.start),c=n;o.start<n.ch&&/\w/.test(o.string.charAt(n.ch-o.start-1))?e=o.string.substr(0,n.ch-o.start):(e="",s=n);for(var r=[],l=0;l<i.words.length;l++){var h=i.words[l];h.slice(0,e.length)==e&&r.push(h)}if(r.length)return{list:r,from:s,to:c}}),W.commands.autocomplete=W.showHint;var l={hint:W.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\s()\[\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!0,container:null,customKeys:null,extraKeys:null};W.defineOption("hintOptions",null)}); diff --git a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/xml-hint.js b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/xml-hint.js index 4b8190141..8db3fbaf2 100644 --- a/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/xml-hint.js +++ b/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/xml-hint.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";var e=t.Pos;t.registerHelper("hint","xml",function(r,s){var n=s&&s.schemaInfo,a=s&&s.quoteChar||'"';if(n){var i=r.getCursor(),o=r.getTokenAt(i);o.end>i.ch&&(o.end=i.ch,o.string=o.string.slice(0,i.ch-o.start));var l=t.innerMode(r.getMode(),o.state);if("xml"==l.mode.name){var f,g,c=[],h=!1,p=/\btag\b/.test(o.type)&&!/>$/.test(o.string),u=p&&/^\w/.test(o.string);if(u){var d=r.getLine(i.line).slice(Math.max(0,o.start-2),o.start),m=/<\/$/.test(d)?"close":/<$/.test(d)?"open":null;m&&(g=o.start-("close"==m?2:1))}else p&&"<"==o.string?m="open":p&&"</"==o.string&&(m="close");if(!p&&!l.state.tagName||m){u&&(f=o.string),h=m;var v=l.state.context,y=v&&n[v.tagName],x=v?y&&y.children:n["!top"];if(x&&"close"!=m)for(var O=0;O<x.length;++O)f&&0!=x[O].lastIndexOf(f,0)||c.push("<"+x[O]);else if("close"!=m)for(var b in n)!n.hasOwnProperty(b)||"!top"==b||"!attrs"==b||f&&0!=b.lastIndexOf(f,0)||c.push("<"+b);v&&(!f||"close"==m&&0==v.tagName.lastIndexOf(f,0))&&c.push("</"+v.tagName+">")}else{var w=(y=n[l.state.tagName])&&y.attrs,I=n["!attrs"];if(!w&&!I)return;if(w){if(I){var P={};for(var A in I)I.hasOwnProperty(A)&&(P[A]=I[A]);for(var A in w)w.hasOwnProperty(A)&&(P[A]=w[A]);w=P}}else w=I;if("string"==o.type||"="==o.string){var M,N=(d=r.getRange(e(i.line,Math.max(0,i.ch-60)),e(i.line,"string"==o.type?o.start:o.end))).match(/([^\s\u00a0=<>\"\']+)=$/);if(!N||!w.hasOwnProperty(N[1])||!(M=w[N[1]]))return;if("function"==typeof M&&(M=M.call(this,r)),"string"==o.type){f=o.string;var $=0;/['"]/.test(o.string.charAt(0))&&(a=o.string.charAt(0),f=o.string.slice(1),$++);var C=o.string.length;/['"]/.test(o.string.charAt(C-1))&&(a=o.string.charAt(C-1),f=o.string.substr($,C-2)),h=!0}for(O=0;O<M.length;++O)f&&0!=M[O].lastIndexOf(f,0)||c.push(a+M[O]+a)}else for(var j in"attribute"==o.type&&(f=o.string,h=!0),w)!w.hasOwnProperty(j)||f&&0!=j.lastIndexOf(f,0)||c.push(j)}return{list:c,from:h?e(i.line,null==g?o.start:g):i,to:h?e(i.line,o.end):i}}}})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(H){"use strict";var R=H.Pos;function z(t,e,r){return r?0<=t.indexOf(e):0==t.lastIndexOf(e,0)}H.registerHelper("hint","xml",function(t,e){var r=e&&e.schemaInfo,n=e&&e.quoteChar||'"',s=e&&e.matchInMiddle;if(r){var i=t.getCursor(),o=t.getTokenAt(i);if(o.end>i.ch&&(o.end=i.ch,o.string=o.string.slice(0,i.ch-o.start)),(p=H.innerMode(t.getMode(),o.state)).mode.xmlCurrentTag){var a,l,g,c=[],f=!1,h=/\btag\b/.test(o.type)&&!/>$/.test(o.string),u=h&&/^\w/.test(o.string);u?(M=t.getLine(i.line).slice(Math.max(0,o.start-2),o.start),(g=/<\/$/.test(M)?"close":/<$/.test(M)?"open":null)&&(l=o.start-("close"==g?2:1))):h&&"<"==o.string?g="open":h&&"</"==o.string&&(g="close");var d=p.mode.xmlCurrentTag(p.state);if(!h&&!d||g){u&&(a=o.string),f=g;var p,m=p.mode.xmlCurrentContext?p.mode.xmlCurrentContext(p.state):[],v=(p=m.length&&m[m.length-1])&&r[p],y=p?v&&v.children:r["!top"];if(y&&"close"!=g)for(var x=0;x<y.length;++x)a&&!z(y[x],a,s)||c.push("<"+y[x]);else if("close"!=g)for(var C in r)!r.hasOwnProperty(C)||"!top"==C||"!attrs"==C||a&&!z(C,a,s)||c.push("<"+C);p&&(!a||"close"==g&&z(p,a,s))&&c.push("</"+p+">")}else{var b=(v=d&&r[d.name])&&v.attrs,O=r["!attrs"];if(!b&&!O)return;if(b){if(O){var w={};for(var A in O)O.hasOwnProperty(A)&&(w[A]=O[A]);for(var A in b)b.hasOwnProperty(A)&&(w[A]=b[A]);b=w}}else b=O;if("string"==o.type||"="==o.string){var M,P,$,I,T,j=(M=t.getRange(R(i.line,Math.max(0,i.ch-60)),R(i.line,"string"==o.type?o.start:o.end))).match(/([^\s\u00a0=<>\"\']+)=$/);if(!j||!b.hasOwnProperty(j[1])||!(P=b[j[1]]))return;"function"==typeof P&&(P=P.call(this,t)),"string"==o.type&&(a=o.string,$=0,/['"]/.test(o.string.charAt(0))&&(n=o.string.charAt(0),a=o.string.slice(1),$++),I=o.string.length,/['"]/.test(o.string.charAt(I-1))&&(n=o.string.charAt(I-1),a=o.string.substr($,I-2)),!$||(T=t.getLine(i.line)).length>o.end&&T.charAt(o.end)==n&&o.end++,f=!0);var q=function(t){if(t)for(var e=0;e<t.length;++e)a&&!z(t[e],a,s)||c.push(n+t[e]+n);return k()};return P&&P.then?P.then(q):q(P)}for(var L in"attribute"==o.type&&(a=o.string,f=!0),b)!b.hasOwnProperty(L)||a&&!z(L,a,s)||c.push(L)}return k()}}function k(){return{list:c,from:f?R(i.line,null==l?o.start:l):i,to:f?R(i.line,o.end):i}}})}); diff --git a/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/closebrackets.js b/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/closebrackets.js index 330fc8d7a..b3957b8da 100644 --- a/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/closebrackets.js +++ b/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/closebrackets.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){var t={pairs:"()[]{}''\"\"",triples:"",explode:"[]{}"},r=e.Pos;function n(e,r){return"pairs"==r&&"string"==typeof e?e:"object"==typeof e&&null!=e[r]?e[r]:t[r]}e.defineOption("autoCloseBrackets",!1,function(t,r,o){o&&o!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),r&&(a(n(r,"pairs")),t.state.closeBrackets=r,t.addKeyMap(i))});var i={Backspace:function(t){var i=s(t);if(!i||t.getOption("disableInput"))return e.Pass;for(var a=n(i,"pairs"),o=t.listSelections(),c=0;c<o.length;c++){if(!o[c].empty())return e.Pass;var f=l(t,o[c].head);if(!f||a.indexOf(f)%2!=0)return e.Pass}for(var c=o.length-1;c>=0;c--){var h=o[c].head;t.replaceRange("",r(h.line,h.ch-1),r(h.line,h.ch+1),"+delete")}},Enter:function(t){var r=s(t),i=r&&n(r,"explode");if(!i||t.getOption("disableInput"))return e.Pass;for(var a=t.listSelections(),o=0;o<a.length;o++){if(!a[o].empty())return e.Pass;var c=l(t,a[o].head);if(!c||i.indexOf(c)%2!=0)return e.Pass}t.operation(function(){var e=t.lineSeparator()||"\n";t.replaceSelection(e+e,null),t.execCommand("goCharLeft"),a=t.listSelections();for(var r=0;r<a.length;r++){var n=a[r].head.line;t.indentLine(n,null,!0),t.indentLine(n+1,null,!0)}})}};function a(e){for(var t=0;t<e.length;t++){var r=e.charAt(t),n="'"+r+"'";i[n]||(i[n]=o(r))}}function o(t){return function(i){return function(t,i){var a=s(t);if(!a||t.getOption("disableInput"))return e.Pass;var o=n(a,"pairs"),l=o.indexOf(i);if(-1==l)return e.Pass;for(var c,f=n(a,"triples"),h=o.charAt(l+1)==i,d=t.listSelections(),u=l%2==0,g=0;g<d.length;g++){var p,v=d[g],m=v.head,b=t.getRange(m,r(m.line,m.ch+1));if(u&&!v.empty())p="surround";else if(!h&&u||b!=i)if(h&&m.ch>1&&f.indexOf(i)>=0&&t.getRange(r(m.line,m.ch-2),m)==i+i){if(m.ch>2&&/\bstring/.test(t.getTokenTypeAt(r(m.line,m.ch-2))))return e.Pass;p="addFour"}else if(h){var C=0==m.ch?" ":t.getRange(r(m.line,m.ch-1),m);if(e.isWordChar(b)||C==i||e.isWordChar(C))return e.Pass;p="both"}else{if(!u||!(t.getLine(m.line).length==m.ch||(x=b,P=o,void 0,k=P.lastIndexOf(x),k>-1&&k%2==1)||/\s/.test(b)))return e.Pass;p="both"}else p=!h||(S=m,void 0,O=(y=t).getTokenAt(r(S.line,S.ch+1)),!/\bstring/.test(O.type)||O.start!=S.ch||0!=S.ch&&/\bstring/.test(y.getTokenTypeAt(S)))?f.indexOf(i)>=0&&t.getRange(m,r(m.line,m.ch+3))==i+i+i?"skipThree":"skip":"both";if(c){if(c!=p)return e.Pass}else c=p}var x,P,k;var y,S,O;var R=l%2?o.charAt(l-1):i,A=l%2?i:o.charAt(l+1);t.operation(function(){if("skip"==c)t.execCommand("goCharRight");else if("skipThree"==c)for(var n=0;n<3;n++)t.execCommand("goCharRight");else if("surround"==c){for(var i=t.getSelections(),n=0;n<i.length;n++)i[n]=R+i[n]+A;t.replaceSelections(i,"around"),i=t.listSelections().slice();for(var n=0;n<i.length;n++)i[n]=(a=i[n],void 0,o=e.cmpPos(a.anchor,a.head)>0,{anchor:new r(a.anchor.line,a.anchor.ch+(o?-1:1)),head:new r(a.head.line,a.head.ch+(o?1:-1))});t.setSelections(i)}else"both"==c?(t.replaceSelection(R+A,null),t.triggerElectric(R+A),t.execCommand("goCharLeft")):"addFour"==c&&(t.replaceSelection(R+R+R+R,"before"),t.execCommand("goCharRight"));var a,o})}(i,t)}}function s(e){var t=e.state.closeBrackets;return!t||t.override?t:e.getModeAt(e.getCursor()).closeBrackets||t}function l(e,t){var n=e.getRange(r(t.line,t.ch-1),r(t.line,t.ch+1));return 2==n.length?n:null}a(t.pairs+"`")}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(C){var r={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},x=C.Pos;function P(e,t){return"pairs"==t&&"string"==typeof e?e:"object"==typeof e&&null!=e[t]?e[t]:r[t]}C.defineOption("autoCloseBrackets",!1,function(e,t,r){r&&r!=C.Init&&(e.removeKeyMap(i),e.state.closeBrackets=null),t&&(n(P(t,"pairs")),e.state.closeBrackets=t,e.addKeyMap(i))});var i={Backspace:function(e){var t=k(e);if(!t||e.getOption("disableInput"))return C.Pass;for(var r=P(t,"pairs"),n=e.listSelections(),i=0;i<n.length;i++){if(!n[i].empty())return C.Pass;var a=s(e,n[i].head);if(!a||r.indexOf(a)%2!=0)return C.Pass}for(i=n.length-1;0<=i;i--){var o=n[i].head;e.replaceRange("",x(o.line,o.ch-1),x(o.line,o.ch+1),"+delete")}},Enter:function(n){var e=k(n),t=e&&P(e,"explode");if(!t||n.getOption("disableInput"))return C.Pass;for(var i=n.listSelections(),r=0;r<i.length;r++){if(!i[r].empty())return C.Pass;var a=s(n,i[r].head);if(!a||t.indexOf(a)%2!=0)return C.Pass}n.operation(function(){var e=n.lineSeparator()||"\n";n.replaceSelection(e+e,null),n.execCommand("goCharLeft"),i=n.listSelections();for(var t=0;t<i.length;t++){var r=i[t].head.line;n.indentLine(r,null,!0),n.indentLine(r+1,null,!0)}})}};function n(e){for(var t=0;t<e.length;t++){var r=e.charAt(t),n="'"+r+"'";i[n]||(i[n]=function(t){return function(e){return function(i,e){var t=k(i);if(!t||i.getOption("disableInput"))return C.Pass;var r=P(t,"pairs"),n=r.indexOf(e);if(-1==n)return C.Pass;for(var a,o=P(t,"closeBefore"),s=P(t,"triples"),l=r.charAt(n+1)==e,c=i.listSelections(),f=n%2==0,h=0;h<c.length;h++){var u,d=c[h],p=d.head,g=i.getRange(p,x(p.line,p.ch+1));if(f&&!d.empty())u="surround";else if(!l&&f||g!=e)if(l&&1<p.ch&&0<=s.indexOf(e)&&i.getRange(x(p.line,p.ch-2),p)==e+e){if(2<p.ch&&/\bstring/.test(i.getTokenTypeAt(x(p.line,p.ch-2))))return C.Pass;u="addFour"}else if(l){var v=0==p.ch?" ":i.getRange(x(p.line,p.ch-1),p);if(C.isWordChar(g)||v==e||C.isWordChar(v))return C.Pass;u="both"}else{if(!f||!(0===g.length||/\s/.test(g)||-1<o.indexOf(g)))return C.Pass;u="both"}else u=l&&function(e,t){var r=e.getTokenAt(x(t.line,t.ch+1));return/\bstring/.test(r.type)&&r.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}(i,p)?"both":0<=s.indexOf(e)&&i.getRange(p,x(p.line,p.ch+3))==e+e+e?"skipThree":"skip";if(a){if(a!=u)return C.Pass}else a=u}var m=n%2?r.charAt(n-1):e,b=n%2?e:r.charAt(n+1);i.operation(function(){if("skip"==a)i.execCommand("goCharRight");else if("skipThree"==a)for(var e=0;e<3;e++)i.execCommand("goCharRight");else if("surround"==a){for(var t=i.getSelections(),e=0;e<t.length;e++)t[e]=m+t[e]+b;i.replaceSelections(t,"around"),t=i.listSelections().slice();for(e=0;e<t.length;e++)t[e]=(r=t[e],n=0<C.cmpPos(r.anchor,r.head),{anchor:new x(r.anchor.line,r.anchor.ch+(n?-1:1)),head:new x(r.head.line,r.head.ch+(n?1:-1))});i.setSelections(t)}else"both"==a?(i.replaceSelection(m+b,null),i.triggerElectric(m+b),i.execCommand("goCharLeft")):"addFour"==a&&(i.replaceSelection(m+m+m+m,"before"),i.execCommand("goCharRight"));var r,n})}(e,t)}}(r))}}function k(e){var t=e.state.closeBrackets;return t&&!t.override&&e.getModeAt(e.getCursor()).closeBrackets||t}function s(e,t){var r=e.getRange(x(t.line,t.ch-1),x(t.line,t.ch+1));return 2==r.length?r:null}n(r.pairs+"`")}); diff --git a/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/matchbrackets.js b/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/matchbrackets.js index 8852ea42f..1e435a4d7 100755 --- a/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/matchbrackets.js +++ b/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/matchbrackets.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){var e=/MSIE \d/.test(navigator.userAgent)&&(null==document.documentMode||document.documentMode<8),n=t.Pos,r={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<"};function i(t,e,i){var c=t.getLineHandle(e.line),o=e.ch-1,l=i&&i.afterCursor;null==l&&(l=/(^| )cm-fat-cursor($| )/.test(t.getWrapperElement().className));var h=!l&&o>=0&&r[c.text.charAt(o)]||r[c.text.charAt(++o)];if(!h)return null;var s=">"==h.charAt(1)?1:-1;if(i&&i.strict&&s>0!=(o==e.ch))return null;var u=t.getTokenTypeAt(n(e.line,o+1)),f=a(t,n(e.line,o+(s>0?1:0)),s,u||null,i);return null==f?null:{from:n(e.line,o),to:f&&f.pos,match:f&&f.ch==h.charAt(0),forward:s>0}}function a(t,e,i,a,c){for(var o=c&&c.maxScanLineLength||1e4,l=c&&c.maxScanLines||1e3,h=[],s=c&&c.bracketRegex?c.bracketRegex:/[(){}[\]]/,u=i>0?Math.min(e.line+l,t.lastLine()+1):Math.max(t.firstLine()-1,e.line-l),f=e.line;f!=u;f+=i){var m=t.getLine(f);if(m){var g=i>0?0:m.length-1,d=i>0?m.length:-1;if(!(m.length>o))for(f==e.line&&(g=e.ch-(i<0?1:0));g!=d;g+=i){var k=m.charAt(g);if(s.test(k)&&(void 0===a||t.getTokenTypeAt(n(f,g+1))==a))if(">"==r[k].charAt(1)==i>0)h.push(k);else{if(!h.length)return{pos:n(f,g),ch:k};h.pop()}}}}return f-i!=(i>0?t.lastLine():t.firstLine())&&null}function c(t,r,a){for(var c=t.state.matchBrackets.maxHighlightLineLength||1e3,o=[],l=t.listSelections(),h=0;h<l.length;h++){var s=l[h].empty()&&i(t,l[h].head,a);if(s&&t.getLine(s.from.line).length<=c){var u=s.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket";o.push(t.markText(s.from,n(s.from.line,s.from.ch+1),{className:u})),s.to&&t.getLine(s.to.line).length<=c&&o.push(t.markText(s.to,n(s.to.line,s.to.ch+1),{className:u}))}}if(o.length){e&&t.state.focused&&t.focus();var f=function(){t.operation(function(){for(var t=0;t<o.length;t++)o[t].clear()})};if(!r)return f;setTimeout(f,800)}}function o(t){t.operation(function(){t.state.matchBrackets.currentlyHighlighted&&(t.state.matchBrackets.currentlyHighlighted(),t.state.matchBrackets.currentlyHighlighted=null),t.state.matchBrackets.currentlyHighlighted=c(t,!1,t.state.matchBrackets)})}t.defineOption("matchBrackets",!1,function(e,n,r){r&&r!=t.Init&&(e.off("cursorActivity",o),e.state.matchBrackets&&e.state.matchBrackets.currentlyHighlighted&&(e.state.matchBrackets.currentlyHighlighted(),e.state.matchBrackets.currentlyHighlighted=null)),n&&(e.state.matchBrackets="object"==typeof n?n:{},e.on("cursorActivity",o))}),t.defineExtension("matchBrackets",function(){c(this,!0)}),t.defineExtension("findMatchingBracket",function(t,e,n){return(n||"boolean"==typeof e)&&(n?(n.strict=e,e=n):e=e?{strict:!0}:null),i(this,t,e)}),t.defineExtension("scanForBracket",function(t,e,n,r){return a(this,t,e,n,r)})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(i){var h=/MSIE \d/.test(navigator.userAgent)&&(null==document.documentMode||document.documentMode<8),k=i.Pos,p={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<","<":">>",">":"<<"};function v(t){return t&&t.bracketRegex||/[(){}[\]]/}function u(t,e,n){var r=t.getLineHandle(e.line),i=e.ch-1,c=n&&n.afterCursor;null==c&&(c=/(^| )cm-fat-cursor($| )/.test(t.getWrapperElement().className));var a=v(n),o=!c&&0<=i&&a.test(r.text.charAt(i))&&p[r.text.charAt(i)]||a.test(r.text.charAt(i+1))&&p[r.text.charAt(++i)];if(!o)return null;var l=">"==o.charAt(1)?1:-1;if(n&&n.strict&&0<l!=(i==e.ch))return null;var s=t.getTokenTypeAt(k(e.line,i+1)),h=f(t,k(e.line,i+(0<l?1:0)),l,s||null,n);return null==h?null:{from:k(e.line,i),to:h&&h.pos,match:h&&h.ch==o.charAt(0),forward:0<l}}function f(t,e,n,r,i){for(var c=i&&i.maxScanLineLength||1e4,a=i&&i.maxScanLines||1e3,o=[],l=v(i),s=0<n?Math.min(e.line+a,t.lastLine()+1):Math.max(t.firstLine()-1,e.line-a),h=e.line;h!=s;h+=n){var u=t.getLine(h);if(u){var f=0<n?0:u.length-1,m=0<n?u.length:-1;if(!(u.length>c))for(h==e.line&&(f=e.ch-(n<0?1:0));f!=m;f+=n){var g=u.charAt(f);if(l.test(g)&&(void 0===r||t.getTokenTypeAt(k(h,f+1))==r)){var d=p[g];if(d&&">"==d.charAt(1)==0<n)o.push(g);else{if(!o.length)return{pos:k(h,f),ch:g};o.pop()}}}}}return h-n!=(0<n?t.lastLine():t.firstLine())&&null}function e(t,e,n){for(var r=t.state.matchBrackets.maxHighlightLineLength||1e3,i=[],c=t.listSelections(),a=0;a<c.length;a++){var o,l=c[a].empty()&&u(t,c[a].head,n);l&&t.getLine(l.from.line).length<=r&&(o=l.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket",i.push(t.markText(l.from,k(l.from.line,l.from.ch+1),{className:o})),l.to&&t.getLine(l.to.line).length<=r&&i.push(t.markText(l.to,k(l.to.line,l.to.ch+1),{className:o})))}if(i.length){h&&t.state.focused&&t.focus();function s(){t.operation(function(){for(var t=0;t<i.length;t++)i[t].clear()})}if(!e)return s;setTimeout(s,800)}}function c(t){t.operation(function(){t.state.matchBrackets.currentlyHighlighted&&(t.state.matchBrackets.currentlyHighlighted(),t.state.matchBrackets.currentlyHighlighted=null),t.state.matchBrackets.currentlyHighlighted=e(t,!1,t.state.matchBrackets)})}i.defineOption("matchBrackets",!1,function(t,e,n){function r(t){t.state.matchBrackets&&t.state.matchBrackets.currentlyHighlighted&&(t.state.matchBrackets.currentlyHighlighted(),t.state.matchBrackets.currentlyHighlighted=null)}n&&n!=i.Init&&(t.off("cursorActivity",c),t.off("focus",c),t.off("blur",r),r(t)),e&&(t.state.matchBrackets="object"==typeof e?e:{},t.on("cursorActivity",c),t.on("focus",c),t.on("blur",r))}),i.defineExtension("matchBrackets",function(){e(this,!0)}),i.defineExtension("findMatchingBracket",function(t,e,n){return!n&&"boolean"!=typeof e||(e=n?(n.strict=e,n):e?{strict:!0}:null),u(this,t,e)}),i.defineExtension("scanForBracket",function(t,e,n,r){return f(this,t,e,n,r)})}); diff --git a/plugins/tiddlywiki/codemirror-closetag/files/addon/edit/closetag.js b/plugins/tiddlywiki/codemirror-closetag/files/addon/edit/closetag.js index a3c34dcbf..fa358014b 100644 --- a/plugins/tiddlywiki/codemirror-closetag/files/addon/edit/closetag.js +++ b/plugins/tiddlywiki/codemirror-closetag/files/addon/edit/closetag.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],e):e(CodeMirror)}(function(e){e.defineOption("autoCloseTags",!1,function(i,s,l){if(l!=e.Init&&l&&i.removeKeyMap("autoCloseTags"),s){var d={name:"autoCloseTags"};("object"!=typeof s||s.whenClosing)&&(d["'/'"]=function(t){return(n=t).getOption("disableInput")?e.Pass:o(n,!0);var n}),("object"!=typeof s||s.whenOpening)&&(d["'>'"]=function(o){return function(o){if(o.getOption("disableInput"))return e.Pass;for(var i=o.listSelections(),s=[],l=o.getOption("autoCloseTags"),d=0;d<i.length;d++){if(!i[d].empty())return e.Pass;var c=i[d].head,f=o.getTokenAt(c),g=e.innerMode(o.getMode(),f.state),u=g.state;if("xml"!=g.mode.name||!u.tagName)return e.Pass;var m="html"==g.mode.configuration,h="object"==typeof l&&l.dontCloseTags||m&&t,p="object"==typeof l&&l.indentTags||m&&n,v=u.tagName;f.end>c.ch&&(v=v.slice(0,v.length-f.end+c.ch));var b=v.toLowerCase();if(!v||"string"==f.type&&(f.end!=c.ch||!/[\"\']/.test(f.string.charAt(f.string.length-1))||1==f.string.length)||"tag"==f.type&&"closeTag"==u.type||f.string.indexOf("/")==f.string.length-1||h&&a(h,b)>-1||r(o,v,c,u,!0))return e.Pass;var y=p&&a(p,b)>-1;s[d]={indent:y,text:">"+(y?"\n\n":"")+"</"+v+">",newPos:y?e.Pos(c.line+1,0):e.Pos(c.line,c.ch+1)}}for(var x="object"==typeof l&&l.dontIndentOnAutoClose,d=i.length-1;d>=0;d--){var P=s[d];o.replaceRange(P.text,i[d].head,i[d].anchor,"+insert");var T=o.listSelections().slice(0);T[d]={head:P.newPos,anchor:P.newPos},o.setSelections(T),!x&&P.indent&&(o.indentLine(P.newPos.line,null,!0),o.indentLine(P.newPos.line+1,null,!0))}}(o)}),i.addKeyMap(d)}});var t=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],n=["applet","blockquote","body","button","div","dl","fieldset","form","frameset","h1","h2","h3","h4","h5","h6","head","html","iframe","layer","legend","object","ol","p","select","table","ul"];function o(t,n){for(var o=t.listSelections(),a=[],i=n?"/":"</",s=t.getOption("autoCloseTags"),l="object"==typeof s&&s.dontIndentOnSlash,d=0;d<o.length;d++){if(!o[d].empty())return e.Pass;var c,f=o[d].head,g=t.getTokenAt(f),u=e.innerMode(t.getMode(),g.state),m=u.state;if(n&&("string"==g.type||"<"!=g.string.charAt(0)||g.start!=f.ch-1))return e.Pass;if("xml"!=u.mode.name)if("htmlmixed"==t.getMode().name&&"javascript"==u.mode.name)c=i+"script";else{if("htmlmixed"!=t.getMode().name||"css"!=u.mode.name)return e.Pass;c=i+"style"}else{if(!m.context||!m.context.tagName||r(t,m.context.tagName,f,m))return e.Pass;c=i+m.context.tagName}">"!=t.getLine(f.line).charAt(g.end)&&(c+=">"),a[d]=c}if(t.replaceSelections(a),o=t.listSelections(),!l)for(d=0;d<o.length;d++)(d==o.length-1||o[d].head.line<o[d+1].head.line)&&t.indentLine(o[d].head.line)}function a(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,o=e.length;n<o;++n)if(e[n]==t)return n;return-1}function r(t,n,o,a,r){if(!e.scanForClosingTag)return!1;var i=Math.min(t.lastLine()+1,o.line+500),s=e.scanForClosingTag(t,o,null,i);if(!s||s.tag!=n)return!1;for(var l=a.context,d=r?1:0;l&&l.tagName==n;l=l.prev)++d;o=s.to;for(var c=1;c<d;c++){var f=e.scanForClosingTag(t,o,null,i);if(!f||f.tag!=n)return!1;o=f.to}return!0}e.commands.closeTag=function(e){return o(e)}}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],e):e(CodeMirror)}(function(y){y.defineOption("autoCloseTags",!1,function(e,t,n){var o;n!=y.Init&&n&&e.removeKeyMap("autoCloseTags"),t&&(o={name:"autoCloseTags"},"object"==typeof t&&!1===t.whenClosing||(o["'/'"]=function(e){return(t=e).getOption("disableInput")?y.Pass:r(t,!0);var t}),"object"==typeof t&&!1===t.whenOpening||(o["'>'"]=function(e){if(e.getOption("disableInput"))return y.Pass;for(var t=e.listSelections(),n=[],o=e.getOption("autoCloseTags"),r=0;r<t.length;r++){if(!t[r].empty())return y.Pass;var a=t[r].head,i=e.getTokenAt(a),l=y.innerMode(e.getMode(),i.state),s=l.state,d=l.mode.xmlCurrentTag&&l.mode.xmlCurrentTag(s),c=d&&d.name;if(!c)return y.Pass;var f="html"==l.mode.configuration,g="object"==typeof o&&o.dontCloseTags||f&&x,u="object"==typeof o&&o.indentTags||f&&P;i.end>a.ch&&(c=c.slice(0,c.length-i.end+a.ch));var m=c.toLowerCase();if(!c||"string"==i.type&&(i.end!=a.ch||!/[\"\']/.test(i.string.charAt(i.string.length-1))||1==i.string.length)||"tag"==i.type&&d.close||i.string.indexOf("/")==a.ch-i.start-1||g&&-1<T(g,m)||j(e,l.mode.xmlCurrentContext&&l.mode.xmlCurrentContext(s)||[],c,a,!0))return y.Pass;var h,p="object"==typeof o&&o.emptyTags;p&&-1<T(p,c)?n[r]={text:"/>",newPos:y.Pos(a.line,a.ch+2)}:(h=u&&-1<T(u,m),n[r]={indent:h,text:">"+(h?"\n\n":"")+"</"+c+">",newPos:h?y.Pos(a.line+1,0):y.Pos(a.line,a.ch+1)})}for(var C="object"==typeof o&&o.dontIndentOnAutoClose,r=t.length-1;0<=r;r--){var b=n[r];e.replaceRange(b.text,t[r].head,t[r].anchor,"+insert");var v=e.listSelections().slice(0);v[r]={head:b.newPos,anchor:b.newPos},e.setSelections(v),!C&&b.indent&&(e.indentLine(b.newPos.line,null,!0),e.indentLine(b.newPos.line+1,null,!0))}}),e.addKeyMap(o))});var x=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],P=["applet","blockquote","body","button","div","dl","fieldset","form","frameset","h1","h2","h3","h4","h5","h6","head","html","iframe","layer","legend","object","ol","p","select","table","ul"];function r(e,t){for(var n=e.listSelections(),o=[],r=t?"/":"</",a=e.getOption("autoCloseTags"),i="object"==typeof a&&a.dontIndentOnSlash,l=0;l<n.length;l++){if(!n[l].empty())return y.Pass;var s=n[l].head,d=e.getTokenAt(s),c=y.innerMode(e.getMode(),d.state),f=c.state;if(t&&("string"==d.type||"<"!=d.string.charAt(0)||d.start!=s.ch-1))return y.Pass;var g,u="xml"!=c.mode.name&&"htmlmixed"==e.getMode().name;if(u&&"javascript"==c.mode.name)g=r+"script";else if(u&&"css"==c.mode.name)g=r+"style";else{var m=c.mode.xmlCurrentContext&&c.mode.xmlCurrentContext(f);if(!m||m.length&&j(e,m,m[m.length-1],s))return y.Pass;g=r+m[m.length-1]}">"!=e.getLine(s.line).charAt(d.end)&&(g+=">"),o[l]=g}if(e.replaceSelections(o),n=e.listSelections(),!i)for(l=0;l<n.length;l++)(l==n.length-1||n[l].head.line<n[l+1].head.line)&&e.indentLine(n[l].head.line)}function T(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,o=e.length;n<o;++n)if(e[n]==t)return n;return-1}function j(e,t,n,o,r){if(y.scanForClosingTag){var a=Math.min(e.lastLine()+1,o.line+500),i=y.scanForClosingTag(e,o,null,a);if(i&&i.tag==n){for(var l=r?1:0,s=t.length-1;0<=s&&t[s]==n;s--)++l;o=i.to;for(s=1;s<l;s++){var d=y.scanForClosingTag(e,o,null,a);if(!d||d.tag!=n)return;o=d.to}return 1}}}y.commands.closeTag=function(e){return r(e)}}); diff --git a/plugins/tiddlywiki/codemirror-closetag/files/addon/fold/xml-fold.js b/plugins/tiddlywiki/codemirror-closetag/files/addon/fold/xml-fold.js index f082e5dd4..b6dc48a92 100644 --- a/plugins/tiddlywiki/codemirror-closetag/files/addon/fold/xml-fold.js +++ b/plugins/tiddlywiki/codemirror-closetag/files/addon/fold/xml-fold.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";var n=e.Pos;function t(e,n){return e.line-n.line||e.ch-n.ch}var i="A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",r=new RegExp("<(/?)(["+i+"][A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*)","g");function u(e,n,t,i){this.line=n,this.ch=t,this.cm=e,this.text=e.getLine(n),this.min=i?Math.max(i.from,e.firstLine()):e.firstLine(),this.max=i?Math.min(i.to-1,e.lastLine()):e.lastLine()}function f(e,t){var i=e.cm.getTokenTypeAt(n(e.line,t));return i&&/\btag\b/.test(i)}function o(e){if(!(e.line>=e.max))return e.ch=0,e.text=e.cm.getLine(++e.line),!0}function l(e){if(!(e.line<=e.min))return e.text=e.cm.getLine(--e.line),e.ch=e.text.length,!0}function c(e){for(;;){var n=e.text.indexOf(">",e.ch);if(-1==n){if(o(e))continue;return}if(f(e,n+1)){var t=e.text.lastIndexOf("/",n),i=t>-1&&!/\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?"selfClose":"regular"}e.ch=n+1}}function a(e){for(;;){var n=e.ch?e.text.lastIndexOf("<",e.ch-1):-1;if(-1==n){if(l(e))continue;return}if(f(e,n+1)){r.lastIndex=n,e.ch=n;var t=r.exec(e.text);if(t&&t.index==n)return t}else e.ch=n}}function s(e){for(;;){r.lastIndex=e.ch;var n=r.exec(e.text);if(!n){if(o(e))continue;return}if(f(e,n.index+1))return e.ch=n.index+n[0].length,n;e.ch=n.index+1}}function h(e){for(;;){var n=e.ch?e.text.lastIndexOf(">",e.ch-1):-1;if(-1==n){if(l(e))continue;return}if(f(e,n+1)){var t=e.text.lastIndexOf("/",n),i=t>-1&&!/\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?"selfClose":"regular"}e.ch=n}}function F(e,t){for(var i=[];;){var r,u=s(e),f=e.line,o=e.ch-(u?u[0].length:0);if(!u||!(r=c(e)))return;if("selfClose"!=r)if(u[1]){for(var l=i.length-1;l>=0;--l)if(i[l]==u[2]){i.length=l;break}if(l<0&&(!t||t==u[2]))return{tag:u[2],from:n(f,o),to:n(e.line,e.ch)}}else i.push(u[2])}}function x(e,t){for(var i=[];;){var r=h(e);if(!r)return;if("selfClose"!=r){var u=e.line,f=e.ch,o=a(e);if(!o)return;if(o[1])i.push(o[2]);else{for(var l=i.length-1;l>=0;--l)if(i[l]==o[2]){i.length=l;break}if(l<0&&(!t||t==o[2]))return{tag:o[2],from:n(e.line,e.ch),to:n(u,f)}}}else a(e)}}e.registerHelper("fold","xml",function(e,i){for(var r=new u(e,i.line,0);;){var f=s(r);if(!f||r.line!=i.line)return;var o=c(r);if(!o)return;if(!f[1]&&"selfClose"!=o){var l=n(r.line,r.ch),a=F(r,f[2]);return a&&t(a.from,l)>0?{from:l,to:a.from}:null}}}),e.findMatchingTag=function(e,i,r){var f=new u(e,i.line,i.ch,r);if(-1!=f.text.indexOf(">")||-1!=f.text.indexOf("<")){var o=c(f),l=o&&n(f.line,f.ch),s=o&&a(f);if(o&&s&&!(t(f,i)>0)){var h={from:n(f.line,f.ch),to:l,tag:s[2]};return"selfClose"==o?{open:h,close:null,at:"open"}:s[1]?{open:x(f,s[2]),close:h,at:"close"}:{open:h,close:F(f=new u(e,l.line,l.ch,r),s[2]),at:"open"}}}},e.findEnclosingTag=function(e,n,t,i){for(var r=new u(e,n.line,n.ch,t);;){var f=x(r,i);if(!f)break;var o=F(new u(e,n.line,n.ch,t),f.tag);if(o)return{open:f,close:o}}},e.scanForClosingTag=function(e,n,t,i){return F(new u(e,n.line,n.ch,i?{from:0,to:i}:null),t)}}); +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";var l=e.Pos;function c(e,n){return e.line-n.line||e.ch-n.ch}var n="A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("<(/?)(["+n+"][A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*)","g");function a(e,n,t,i){this.line=n,this.ch=t,this.cm=e,this.text=e.getLine(n),this.min=i?Math.max(i.from,e.firstLine()):e.firstLine(),this.max=i?Math.min(i.to-1,e.lastLine()):e.lastLine()}function s(e,n){var t=e.cm.getTokenTypeAt(l(e.line,n));return t&&/\btag\b/.test(t)}function r(e){return!(e.line>=e.max)&&(e.ch=0,e.text=e.cm.getLine(++e.line),1)}function h(e){return!(e.line<=e.min)&&(e.text=e.cm.getLine(--e.line),e.ch=e.text.length,1)}function F(e){for(;;){var n=e.text.indexOf(">",e.ch);if(-1==n){if(r(e))continue;return}if(s(e,n+1)){var t=e.text.lastIndexOf("/",n),i=-1<t&&!/\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?"selfClose":"regular"}e.ch=n+1}}function x(e){for(;;){var n=e.ch?e.text.lastIndexOf("<",e.ch-1):-1;if(-1==n){if(h(e))continue;return}if(s(e,n+1)){i.lastIndex=n,e.ch=n;var t=i.exec(e.text);if(t&&t.index==n)return t}else e.ch=n}}function g(e){for(;;){i.lastIndex=e.ch;var n=i.exec(e.text);if(!n){if(r(e))continue;return}if(s(e,n.index+1))return e.ch=n.index+n[0].length,n;e.ch=n.index+1}}function v(e,n){for(var t=[];;){var i,r=g(e),u=e.line,f=e.ch-(r?r[0].length:0);if(!r||!(i=F(e)))return;if("selfClose"!=i)if(r[1]){for(var o=t.length-1;0<=o;--o)if(t[o]==r[2]){t.length=o;break}if(o<0&&(!n||n==r[2]))return{tag:r[2],from:l(u,f),to:l(e.line,e.ch)}}else t.push(r[2])}}function d(e,n){for(var t=[];;){var i=function(e){for(;;){var n=e.ch?e.text.lastIndexOf(">",e.ch-1):-1;if(-1==n){if(h(e))continue;return}if(s(e,n+1)){var t=e.text.lastIndexOf("/",n),i=-1<t&&!/\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?"selfClose":"regular"}e.ch=n}}(e);if(!i)return;if("selfClose"!=i){var r=e.line,u=e.ch,f=x(e);if(!f)return;if(f[1])t.push(f[2]);else{for(var o=t.length-1;0<=o;--o)if(t[o]==f[2]){t.length=o;break}if(o<0&&(!n||n==f[2]))return{tag:f[2],from:l(e.line,e.ch),to:l(r,u)}}}else x(e)}}e.registerHelper("fold","xml",function(e,n){for(var t=new a(e,n.line,0);;){var i=g(t);if(!i||t.line!=n.line)return;var r=F(t);if(!r)return;if(!i[1]&&"selfClose"!=r){var u=l(t.line,t.ch),f=v(t,i[2]);return f&&0<c(f.from,u)?{from:u,to:f.from}:null}}}),e.findMatchingTag=function(e,n,t){var i=new a(e,n.line,n.ch,t);if(-1!=i.text.indexOf(">")||-1!=i.text.indexOf("<")){var r=F(i),u=r&&l(i.line,i.ch),f=r&&x(i);if(r&&f&&!(0<c(i,n))){var o={from:l(i.line,i.ch),to:u,tag:f[2]};return"selfClose"==r?{open:o,close:null,at:"open"}:f[1]?{open:d(i,f[2]),close:o,at:"close"}:{open:o,close:v(i=new a(e,u.line,u.ch,t),f[2]),at:"open"}}}},e.findEnclosingTag=function(e,n,t,i){for(var r=new a(e,n.line,n.ch,t);;){var u=d(r,i);if(!u)break;var f=v(new a(e,n.line,n.ch,t),u.tag);if(f)return{open:u,close:f}}},e.scanForClosingTag=function(e,n,t,i){return v(new a(e,n.line,n.ch,i?{from:0,to:i}:null),t)}}); diff --git a/plugins/tiddlywiki/codemirror-fullscreen-editing/files/addon/fullscreen/fullscreen.js b/plugins/tiddlywiki/codemirror-fullscreen-editing/files/addon/fullscreen/fullscreen.js index a70760d4c..10efd0d5e 100644 --- a/plugins/tiddlywiki/codemirror-fullscreen-editing/files/addon/fullscreen/fullscreen.js +++ b/plugins/tiddlywiki/codemirror-fullscreen-editing/files/addon/fullscreen/fullscreen.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineOption("fullScreen",!1,function(t,l,o){var r,n;(o==e.Init&&(o=!1),!o!=!l)&&(l?(n=(r=t).getWrapperElement(),r.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:n.style.width,height:n.style.height},n.style.width="",n.style.height="auto",n.className+=" CodeMirror-fullscreen",document.documentElement.style.overflow="hidden",r.refresh()):function(e){var t=e.getWrapperElement();t.className=t.className.replace(/\s*CodeMirror-fullscreen\b/,""),document.documentElement.style.overflow="";var l=e.state.fullScreenRestore;t.style.width=l.width,t.style.height=l.height,window.scrollTo(l.scrollLeft,l.scrollTop),e.refresh()}(t))}),e.toggleFullscreen=function(e){e.setOption("fullScreen",!e.getOption("fullScreen"))},e.commands.togglefullscreen=e.toggleFullscreen}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(i){"use strict";i.defineOption("fullScreen",!1,function(e,t,o){var r,l;o==i.Init&&(o=!1),!o!=!t&&(t?(l=(r=e).getWrapperElement(),r.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:l.style.width,height:l.style.height},l.style.width="",l.style.height="auto",l.className+=" CodeMirror-fullscreen",document.documentElement.style.overflow="hidden",r.refresh()):function(e){var t=e.getWrapperElement();t.className=t.className.replace(/\s*CodeMirror-fullscreen\b/,""),document.documentElement.style.overflow="";var o=e.state.fullScreenRestore;t.style.width=o.width,t.style.height=o.height,window.scrollTo(o.scrollLeft,o.scrollTop),e.refresh()}(e))})}); diff --git a/plugins/tiddlywiki/codemirror-keymap-emacs/files/keymap/emacs.js b/plugins/tiddlywiki/codemirror-keymap-emacs/files/keymap/emacs.js index d37e0032f..a1ab4de79 100755 --- a/plugins/tiddlywiki/codemirror-keymap-emacs/files/keymap/emacs.js +++ b/plugins/tiddlywiki/codemirror-keymap-emacs/files/keymap/emacs.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../lib/codemirror")):"function"==typeof define&&define.amd?define(["../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";var e=t.Pos;function n(t,e){return t.line==e.line&&t.ch==e.ch}var r=[];function o(t){r.push(t),r.length>50&&r.shift()}function i(t){return r[r.length-(t?Math.min(t,1):1)]||""}var l=null;function a(t,e,i,a,c){null==c&&(c=t.getRange(e,i)),"grow"==a&&l&&l.cm==t&&n(e,l.pos)&&t.isClean(l.gen)?function(t){if(!r.length)return o(t);r[r.length-1]+=t}(c):!1!==a&&o(c),t.replaceRange("",e,i,"+delete"),l="grow"==a?{cm:t,pos:e,gen:t.changeGeneration()}:null}function c(t,e,n){return t.findPosH(e,n,"char",!0)}function u(t,e,n){return t.findPosH(e,n,"word",!0)}function f(t,e,n){return t.findPosV(e,n,"line",t.doc.sel.goalColumn)}function s(t,e,n){return t.findPosV(e,n,"page",t.doc.sel.goalColumn)}function g(t,n,r){for(var o=n.line,i=t.getLine(o),l=/\S/.test(r<0?i.slice(0,n.ch):i.slice(n.ch)),a=t.firstLine(),c=t.lastLine();;){if((o+=r)<a||o>c)return t.clipPos(e(o-r,r<0?0:null));if(i=t.getLine(o),/\S/.test(i))l=!0;else if(l)return e(o,0)}}function C(t,n,r){for(var o=n.line,i=n.ch,l=t.getLine(n.line),a=!1;;){var c=l.charAt(i+(r<0?-1:0));if(c){if(a&&/[!?.]/.test(c))return e(o,i+(r>0?1:0));a||(a=/\w/.test(c)),i+=r}else{if(o==(r<0?t.firstLine():t.lastLine()))return e(o,i);if(l=t.getLine(o+r),!/\S/.test(l))return e(o,i);o+=r,i=r<0?l.length:0}}}function d(t,r,o){var i;if(t.findMatchingBracket&&(i=t.findMatchingBracket(r,{strict:!0}))&&i.match&&(i.forward?1:-1)==o)return o>0?e(i.to.line,i.to.ch+1):i.to;for(var l=!0;;l=!1){var a=t.getTokenAt(r),c=e(r.line,o<0?a.start:a.end);if(!(l&&o>0&&a.end==r.ch)&&/\w/.test(a.string))return c;var u=t.findPosH(c,o,"char");if(n(c,u))return r;r=u}}function p(t,e){var n=t.state.emacsPrefix;return n?(L(t),"-"==n?-1:Number(n)):e?null:1}function h(t){var e="string"==typeof t?function(e){e.execCommand(t)}:t;return function(t){var n=p(t);e(t);for(var r=1;r<n;++r)e(t)}}function v(t,e,r,o){var i=p(t);i<0&&(o=-o,i=-i);for(var l=0;l<i;++l){var a=r(t,e,o);if(n(a,e))break;e=a}return e}function m(t,e){var n=function(n){n.extendSelection(v(n,n.getCursor(),t,e))};return n.motion=!0,n}function A(t,e,n,r){for(var o,i=t.listSelections(),l=i.length;l--;)a(t,o=i[l].head,v(t,o,e,n),r)}function S(t,e){if(t.somethingSelected()){for(var n,r=t.listSelections(),o=r.length;o--;)a(t,(n=r[o]).anchor,n.head,e);return!0}}function P(t,e){t.state.emacsPrefix?"-"!=e&&(t.state.emacsPrefix+=e):(t.state.emacsPrefix=e,t.on("keyHandled",x),t.on("inputRead",R))}var w={"Alt-G":!0,"Ctrl-X":!0,"Ctrl-Q":!0,"Ctrl-U":!0};function x(t,e){t.state.emacsPrefixMap||w.hasOwnProperty(e)||L(t)}function L(t){t.state.emacsPrefix=null,t.off("keyHandled",x),t.off("inputRead",R)}function R(t,e){var n=p(t);if(n>1&&"+input"==e.origin){for(var r=e.text.join("\n"),o="",i=1;i<n;++i)o+=r;t.replaceSelection(o)}}function y(t,e){("string"!=typeof e||!/^\d$/.test(e)&&"Ctrl-U"!=e)&&(t.removeKeyMap(D),t.state.emacsPrefixMap=!1,t.off("keyHandled",y),t.off("inputRead",y))}function k(t){t.setCursor(t.getCursor()),t.setExtending(!t.getExtending()),t.on("change",function(){t.setExtending(!1)})}function b(t){t.setExtending(!1),t.setCursor(t.getCursor())}function U(t,e){var n=t.getCursor(),r=t.findPosH(n,1,"word");t.replaceRange(e(t.getRange(n,r)),n,r),t.setCursor(r)}t.emacs={kill:a,killRegion:S,repeated:h};var X=t.keyMap.emacs=t.normalizeKeyMap({"Ctrl-W":function(t){a(t,t.getCursor("start"),t.getCursor("end"),!0)},"Ctrl-K":h(function(t){var n=t.getCursor(),r=t.clipPos(e(n.line)),o=t.getRange(n,r);/\S/.test(o)||(o+="\n",r=e(n.line+1,0)),a(t,n,r,"grow",o)}),"Alt-W":function(t){o(t.getSelection()),b(t)},"Ctrl-Y":function(t){var e=t.getCursor();t.replaceRange(i(p(t)),e,e,"paste"),t.setSelection(e,t.getCursor())},"Alt-Y":function(t){t.replaceSelection((r.length>1&&r.pop(),i()),"around","paste")},"Ctrl-Space":k,"Ctrl-Shift-2":k,"Ctrl-F":m(c,1),"Ctrl-B":m(c,-1),Right:m(c,1),Left:m(c,-1),"Ctrl-D":function(t){A(t,c,1,!1)},Delete:function(t){S(t,!1)||A(t,c,1,!1)},"Ctrl-H":function(t){A(t,c,-1,!1)},Backspace:function(t){S(t,!1)||A(t,c,-1,!1)},"Alt-F":m(u,1),"Alt-B":m(u,-1),"Alt-D":function(t){A(t,u,1,"grow")},"Alt-Backspace":function(t){A(t,u,-1,"grow")},"Ctrl-N":m(f,1),"Ctrl-P":m(f,-1),Down:m(f,1),Up:m(f,-1),"Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd",End:"goLineEnd",Home:"goLineStart","Alt-V":m(s,-1),"Ctrl-V":m(s,1),PageUp:m(s,-1),PageDown:m(s,1),"Ctrl-Up":m(g,-1),"Ctrl-Down":m(g,1),"Alt-A":m(C,-1),"Alt-E":m(C,1),"Alt-K":function(t){A(t,C,1,"grow")},"Ctrl-Alt-K":function(t){A(t,d,1,"grow")},"Ctrl-Alt-Backspace":function(t){A(t,d,-1,"grow")},"Ctrl-Alt-F":m(d,1),"Ctrl-Alt-B":m(d,-1),"Shift-Ctrl-Alt-2":function(t){var e=t.getCursor();t.setSelection(v(t,e,d,1),e)},"Ctrl-Alt-T":function(t){var e=d(t,t.getCursor(),-1),n=d(t,e,1),r=d(t,n,1),o=d(t,r,-1);t.replaceRange(t.getRange(o,r)+t.getRange(n,o)+t.getRange(e,n),e,r)},"Ctrl-Alt-U":h(function(t){for(var n=t.getCursor(),r=n.line,o=n.ch,i=[];r>=t.firstLine();){for(var l=t.getLine(r),a=null==o?l.length:o;a>0;)if(")"==(o=l.charAt(--a)))i.push("(");else if("]"==o)i.push("[");else if("}"==o)i.push("{");else if(/[\(\{\[]/.test(o)&&(!i.length||i.pop()!=o))return t.extendSelection(e(r,a));--r,o=null}}),"Alt-Space":function(t){for(var n=t.getCursor(),r=n.ch,o=n.ch,i=t.getLine(n.line);r&&/\s/.test(i.charAt(r-1));)--r;for(;o<i.length&&/\s/.test(i.charAt(o));)++o;t.replaceRange(" ",e(n.line,r),e(n.line,o))},"Ctrl-O":h(function(t){t.replaceSelection("\n","start")}),"Ctrl-T":h(function(t){t.execCommand("transposeChars")}),"Alt-C":h(function(t){U(t,function(t){var e=t.search(/\w/);return-1==e?t:t.slice(0,e)+t.charAt(e).toUpperCase()+t.slice(e+1).toLowerCase()})}),"Alt-U":h(function(t){U(t,function(t){return t.toUpperCase()})}),"Alt-L":h(function(t){U(t,function(t){return t.toLowerCase()})}),"Alt-;":"toggleComment","Ctrl-/":h("undo"),"Shift-Ctrl--":h("undo"),"Ctrl-Z":h("undo"),"Cmd-Z":h("undo"),"Shift-Alt-,":"goDocStart","Shift-Alt-.":"goDocEnd","Ctrl-S":"findPersistentNext","Ctrl-R":"findPersistentPrev","Ctrl-G":function(t){t.execCommand("clearSearch"),b(t)},"Shift-Alt-5":"replace","Alt-/":"autocomplete",Enter:"newlineAndIndent","Ctrl-J":h(function(t){t.replaceSelection("\n","end")}),Tab:"indentAuto","Alt-G G":function(t){var e,n,r,o=p(t,!0);if(null!=o&&o>0)return t.setCursor(o-1);n="Goto line",r=function(e){var n;e&&!isNaN(n=Number(e))&&n==(0|n)&&n>0&&t.setCursor(n-1)},(e=t).openDialog?e.openDialog(n+': <input type="text" style="width: 10em"/>',r,{bottom:!0}):r(prompt(n,""))},"Ctrl-X Tab":function(t){t.indentSelection(p(t,!0)||t.getOption("indentUnit"))},"Ctrl-X Ctrl-X":function(t){t.setSelection(t.getCursor("head"),t.getCursor("anchor"))},"Ctrl-X Ctrl-S":"save","Ctrl-X Ctrl-W":"save","Ctrl-X S":"saveAll","Ctrl-X F":"open","Ctrl-X U":h("undo"),"Ctrl-X K":"close","Ctrl-X Delete":function(t){a(t,t.getCursor(),C(t,t.getCursor(),1),"grow")},"Ctrl-X H":"selectAll","Ctrl-Q Tab":h("insertTab"),"Ctrl-U":function(t){t.state.emacsPrefixMap=!0,t.addKeyMap(D),t.on("keyHandled",y),t.on("inputRead",y)}}),D={"Ctrl-G":L};function E(t){D[t]=function(e){P(e,t)},X["Ctrl-"+t]=function(e){P(e,t)},w["Ctrl-"+t]=!0}for(var H=0;H<10;++H)E(String(H));E("-")}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../lib/codemirror")):"function"==typeof define&&define.amd?define(["../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";var c=t.Pos;function u(t,e){return t.line==e.line&&t.ch==e.ch}var i=[];function l(t){i.push(t),50<i.length&&i.shift()}function n(t){return i[i.length-(t?Math.min(t,1):1)]||""}var a=null;function f(t,e,n,r,o){null==o&&(o=t.getRange(e,n)),"grow"==r&&a&&a.cm==t&&u(e,a.pos)&&t.isClean(a.gen)?function(t){if(!i.length)return l(t);i[i.length-1]+=t}(o):!1!==r&&l(o),t.replaceRange("",e,n,"+delete"),a="grow"==r?{cm:t,pos:e,gen:t.changeGeneration()}:null}function e(t,e,n){return t.findPosH(e,n,"char",!0)}function r(t,e,n){return t.findPosH(e,n,"word",!0)}function o(t,e,n){return t.findPosV(e,n,"line",t.doc.sel.goalColumn)}function s(t,e,n){return t.findPosV(e,n,"page",t.doc.sel.goalColumn)}function g(t,e,n){for(var r=e.line,o=t.getLine(r),i=/\S/.test(n<0?o.slice(0,e.ch):o.slice(e.ch)),l=t.firstLine(),a=t.lastLine();;){if((r+=n)<l||a<r)return t.clipPos(c(r-n,n<0?0:null));o=t.getLine(r);if(/\S/.test(o))i=!0;else if(i)return c(r,0)}}function C(t,e,n){for(var r=e.line,o=e.ch,i=t.getLine(e.line),l=!1;;){var a=i.charAt(o+(n<0?-1:0));if(a){if(l&&/[!?.]/.test(a))return c(r,o+(0<n?1:0));l=l||/\w/.test(a),o+=n}else{if(r==(n<0?t.firstLine():t.lastLine()))return c(r,o);if(i=t.getLine(r+n),!/\S/.test(i))return c(r,o);r+=n,o=n<0?i.length:0}}}function d(t,e,n){var r;if(t.findMatchingBracket&&(r=t.findMatchingBracket(e,{strict:!0}))&&r.match&&(r.forward?1:-1)==n)return 0<n?c(r.to.line,r.to.ch+1):r.to;for(var o=!0;;o=!1){var i=t.getTokenAt(e),l=c(e.line,n<0?i.start:i.end);if(!(o&&0<n&&i.end==e.ch)&&/\w/.test(i.string))return l;var a=t.findPosH(l,n,"char");if(u(l,a))return e;e=a}}function p(t,e){var n=t.state.emacsPrefix;return n?(L(t),"-"==n?-1:Number(n)):e?null:1}function h(e){var r="string"==typeof e?function(t){t.execCommand(e)}:e;return function(t){var e=p(t);r(t);for(var n=1;n<e;++n)r(t)}}function A(t,e,n,r){var o=p(t);o<0&&(r=-r,o=-o);for(var i=0;i<o;++i){var l=n(t,e,r);if(u(l,e))break;e=l}return e}function m(e,n){function t(t){t.extendSelection(A(t,t.getCursor(),e,n))}return t.motion=!0,t}function v(t,e,n,r){for(var o,i=t.listSelections(),l=i.length;l--;)f(t,o=i[l].head,A(t,o,e,n),r)}function S(t,e){if(t.somethingSelected()){for(var n,r=t.listSelections(),o=r.length;o--;)f(t,(n=r[o]).anchor,n.head,e);return!0}}function P(t,e){t.state.emacsPrefix?"-"!=e&&(t.state.emacsPrefix+=e):(t.state.emacsPrefix=e,t.on("keyHandled",x),t.on("inputRead",R))}var w={"Alt-G":!0,"Ctrl-X":!0,"Ctrl-Q":!0,"Ctrl-U":!0};function x(t,e){t.state.emacsPrefixMap||w.hasOwnProperty(e)||L(t)}function L(t){t.state.emacsPrefix=null,t.off("keyHandled",x),t.off("inputRead",R)}function R(t,e){var n=p(t);if(1<n&&"+input"==e.origin){for(var r=e.text.join("\n"),o="",i=1;i<n;++i)o+=r;t.replaceSelection(o)}}function y(t,e){"string"==typeof e&&(/^\d$/.test(e)||"Ctrl-U"==e)||(t.removeKeyMap(D),t.state.emacsPrefixMap=!1,t.off("keyHandled",y),t.off("inputRead",y))}function k(t){t.setCursor(t.getCursor()),t.setExtending(!t.getExtending()),t.on("change",function(){t.setExtending(!1)})}function b(t){t.setExtending(!1),t.setCursor(t.getCursor())}function U(t,e){var n=t.getCursor(),r=t.findPosH(n,1,"word");t.replaceRange(e(t.getRange(n,r)),n,r),t.setCursor(r)}t.emacs={kill:f,killRegion:S,repeated:h};var X=t.keyMap.emacs=t.normalizeKeyMap({"Ctrl-W":function(t){f(t,t.getCursor("start"),t.getCursor("end"),!0)},"Ctrl-K":h(function(t){var e=t.getCursor(),n=t.clipPos(c(e.line)),r=t.getRange(e,n);/\S/.test(r)||(r+="\n",n=c(e.line+1,0)),f(t,e,n,"grow",r)}),"Alt-W":function(t){l(t.getSelection()),b(t)},"Ctrl-Y":function(t){var e=t.getCursor();t.replaceRange(n(p(t)),e,e,"paste"),t.setSelection(e,t.getCursor())},"Alt-Y":function(t){t.replaceSelection((1<i.length&&i.pop(),n()),"around","paste")},"Ctrl-Space":k,"Ctrl-Shift-2":k,"Ctrl-F":m(e,1),"Ctrl-B":m(e,-1),Right:m(e,1),Left:m(e,-1),"Ctrl-D":function(t){v(t,e,1,!1)},Delete:function(t){S(t,!1)||v(t,e,1,!1)},"Ctrl-H":function(t){v(t,e,-1,!1)},Backspace:function(t){S(t,!1)||v(t,e,-1,!1)},"Alt-F":m(r,1),"Alt-B":m(r,-1),"Alt-Right":m(r,1),"Alt-Left":m(r,-1),"Alt-D":function(t){v(t,r,1,"grow")},"Alt-Backspace":function(t){v(t,r,-1,"grow")},"Ctrl-N":m(o,1),"Ctrl-P":m(o,-1),Down:m(o,1),Up:m(o,-1),"Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd",End:"goLineEnd",Home:"goLineStart","Alt-V":m(s,-1),"Ctrl-V":m(s,1),PageUp:m(s,-1),PageDown:m(s,1),"Ctrl-Up":m(g,-1),"Ctrl-Down":m(g,1),"Alt-A":m(C,-1),"Alt-E":m(C,1),"Alt-K":function(t){v(t,C,1,"grow")},"Ctrl-Alt-K":function(t){v(t,d,1,"grow")},"Ctrl-Alt-Backspace":function(t){v(t,d,-1,"grow")},"Ctrl-Alt-F":m(d,1),"Ctrl-Alt-B":m(d,-1),"Shift-Ctrl-Alt-2":function(t){var e=t.getCursor();t.setSelection(A(t,e,d,1),e)},"Ctrl-Alt-T":function(t){var e=d(t,t.getCursor(),-1),n=d(t,e,1),r=d(t,n,1),o=d(t,r,-1);t.replaceRange(t.getRange(o,r)+t.getRange(n,o)+t.getRange(e,n),e,r)},"Ctrl-Alt-U":h(function(t){for(var e=t.getCursor(),n=e.line,r=e.ch,o=[];n>=t.firstLine();){for(var i=t.getLine(n),l=null==r?i.length:r;0<l;){if(")"==(r=i.charAt(--l)))o.push("(");else if("]"==r)o.push("[");else if("}"==r)o.push("{");else if(/[\(\{\[]/.test(r)&&(!o.length||o.pop()!=r))return t.extendSelection(c(n,l))}--n,r=null}}),"Alt-Space":function(t){for(var e=t.getCursor(),n=e.ch,r=e.ch,o=t.getLine(e.line);n&&/\s/.test(o.charAt(n-1));)--n;for(;r<o.length&&/\s/.test(o.charAt(r));)++r;t.replaceRange(" ",c(e.line,n),c(e.line,r))},"Ctrl-O":h(function(t){t.replaceSelection("\n","start")}),"Ctrl-T":h(function(t){t.execCommand("transposeChars")}),"Alt-C":h(function(t){U(t,function(t){var e=t.search(/\w/);return-1==e?t:t.slice(0,e)+t.charAt(e).toUpperCase()+t.slice(e+1).toLowerCase()})}),"Alt-U":h(function(t){U(t,function(t){return t.toUpperCase()})}),"Alt-L":h(function(t){U(t,function(t){return t.toLowerCase()})}),"Alt-;":"toggleComment","Ctrl-/":h("undo"),"Shift-Ctrl--":h("undo"),"Ctrl-Z":h("undo"),"Cmd-Z":h("undo"),"Shift-Ctrl-Z":"redo","Shift-Alt-,":"goDocStart","Shift-Alt-.":"goDocEnd","Ctrl-S":"findPersistentNext","Ctrl-R":"findPersistentPrev","Ctrl-G":function(t){t.execCommand("clearSearch"),b(t)},"Shift-Alt-5":"replace","Alt-/":"autocomplete",Enter:"newlineAndIndent","Ctrl-J":h(function(t){t.replaceSelection("\n","end")}),Tab:"indentAuto","Alt-G G":function(n){var t,e,r,o=p(n,!0);if(null!=o&&0<o)return n.setCursor(o-1);e="Goto line",r=function(t){var e;t&&!isNaN(e=Number(t))&&e==(0|e)&&0<e&&n.setCursor(e-1)},(t=n).openDialog?t.openDialog(e+': <input type="text" style="width: 10em"/>',r,{bottom:!0}):r(prompt(e,""))},"Ctrl-X Tab":function(t){t.indentSelection(p(t,!0)||t.getOption("indentUnit"))},"Ctrl-X Ctrl-X":function(t){t.setSelection(t.getCursor("head"),t.getCursor("anchor"))},"Ctrl-X Ctrl-S":"save","Ctrl-X Ctrl-W":"save","Ctrl-X S":"saveAll","Ctrl-X F":"open","Ctrl-X U":h("undo"),"Ctrl-X K":"close","Ctrl-X Delete":function(t){f(t,t.getCursor(),C(t,t.getCursor(),1),"grow")},"Ctrl-X H":"selectAll","Ctrl-Q Tab":h("insertTab"),"Ctrl-U":function(t){t.state.emacsPrefixMap=!0,t.addKeyMap(D),t.on("keyHandled",y),t.on("inputRead",y)},fallthrough:"default"}),D={"Ctrl-G":L};function E(e){D[e]=function(t){P(t,e)},X["Ctrl-"+e]=function(t){P(t,e)},w["Ctrl-"+e]=!0}for(var H=0;H<10;++H)E(String(H));E("-")}); diff --git a/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js index 57775035f..4e29a8cff 100644 --- a/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js +++ b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/addons/comment/comment.js @@ -1,4 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: https://codemirror.net/LICENSE - -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";var y={},E=/[^\s\u00a0]/,M=e.Pos;function s(e){var n=e.search(E);return-1==n?0:n}function S(e,n){var t=e.getMode();return!1!==t.useInnerComments&&t.innerMode?e.getModeAt(n):t}e.commands.toggleComment=function(e){e.toggleComment()},e.defineExtension("toggleComment",function(e){e=e||y;for(var n=this,t=1/0,i=this.listSelections(),l=null,o=i.length-1;0<=o;o--){var r=i[o].from(),m=i[o].to();r.line>=t||(m.line>=t&&(m=M(t,0)),t=r.line,null==l?l=n.uncomment(r,m,e)?"un":(n.lineComment(r,m,e),"line"):"un"==l?n.uncomment(r,m,e):n.lineComment(r,m,e))}}),e.defineExtension("lineComment",function(o,e,r){r=r||y;var n,t,m,a,c,g,f=this,i=S(f,o),l=f.getLine(o.line);null!=l&&(n=o,t=l,!/\bstring\b/.test(f.getTokenTypeAt(M(n.line,0)))||/^[\'\"\`]/.test(t))&&((m=r.lineComment||i.lineComment)?(a=Math.min(0!=e.ch||e.line==o.line?e.line+1:e.line,f.lastLine()+1),c=null==r.padding?" ":r.padding,g=r.commentBlankLines||o.line==e.line,f.operation(function(){if(r.indent){for(var e=null,n=o.line;n<a;++n){var t=(i=f.getLine(n)).slice(0,s(i));(null==e||e.length>t.length)&&(e=t)}for(n=o.line;n<a;++n){var i=f.getLine(n),l=e.length;(g||E.test(i))&&(i.slice(0,l)!=e&&(l=s(i)),f.replaceRange(e+m+c,M(n,0),M(n,l)))}}else for(n=o.line;n<a;++n)(g||E.test(f.getLine(n)))&&f.replaceRange(m+c,M(n,0))})):(r.blockCommentStart||i.blockCommentStart)&&(r.fullLines=!0,f.blockComment(o,e,r)))}),e.defineExtension("blockComment",function(i,l,o){o=o||y;var r,m,a=this,c=S(a,i),g=o.blockCommentStart||c.blockCommentStart,f=o.blockCommentEnd||c.blockCommentEnd;g&&f?/\bcomment\b/.test(a.getTokenTypeAt(M(i.line,0)))||((r=Math.min(l.line,a.lastLine()))!=i.line&&0==l.ch&&E.test(a.getLine(r))&&--r,m=null==o.padding?" ":o.padding,i.line>r||a.operation(function(){if(0!=o.fullLines){var e=E.test(a.getLine(r));a.replaceRange(m+f,M(r)),a.replaceRange(g+m,M(i.line,0));var n=o.blockCommentLead||c.blockCommentLead;if(null!=n)for(var t=i.line+1;t<=r;++t)t==r&&!e||a.replaceRange(n+m,M(t,0))}else a.replaceRange(f,l),a.replaceRange(g,i)})):(o.lineComment||c.lineComment)&&0!=o.fullLines&&a.lineComment(i,l,o)}),e.defineExtension("uncomment",function(e,n,t){t=t||y;var l,o=this,i=S(o,e),r=Math.min(0!=n.ch||n.line==e.line?n.line:n.line-1,o.lastLine()),m=Math.min(e.line,r),a=t.lineComment||i.lineComment,c=[],g=null==t.padding?" ":t.padding;e:if(a){for(var f=m;f<=r;++f){var s=o.getLine(f),d=s.indexOf(a);if(-1<d&&!/comment/.test(o.getTokenTypeAt(M(f,d+1)))&&(d=-1),-1==d&&E.test(s))break e;if(-1<d&&E.test(s.slice(0,d)))break e;c.push(s)}if(o.operation(function(){for(var e=m;e<=r;++e){var n=c[e-m],t=n.indexOf(a),i=t+a.length;t<0||(n.slice(i,i+g.length)==g&&(i+=g.length),l=!0,o.replaceRange("",M(e,t),M(e,i)))}}),l)return!0}var u=t.blockCommentStart||i.blockCommentStart,h=t.blockCommentEnd||i.blockCommentEnd;if(!u||!h)return!1;var p=t.blockCommentLead||i.blockCommentLead,C=o.getLine(m),b=C.indexOf(u);if(-1==b)return!1;var v=r==m?C:o.getLine(r),k=v.indexOf(h,r==m?b+u.length:0),L=M(m,b+1),x=M(r,k+1);if(-1==k||!/comment/.test(o.getTokenTypeAt(L))||!/comment/.test(o.getTokenTypeAt(x))||-1<o.getRange(L,x,"\n").indexOf(h))return!1;var R=-1==(T=C.lastIndexOf(u,e.ch))?-1:C.slice(0,e.ch).indexOf(h,T+u.length);if(-1!=T&&-1!=R&&R+h.length!=e.ch)return!1;R=v.indexOf(h,n.ch);var O=v.slice(n.ch).lastIndexOf(u,R-n.ch),T=-1==R||-1==O?-1:n.ch+O;return(-1==R||-1==T||T==n.ch)&&(o.operation(function(){o.replaceRange("",M(r,k-(g&&v.slice(k-g.length,k)==g?g.length:0)),M(r,k+h.length));var e=b+u.length;if(g&&C.slice(e,e+g.length)==g&&(e+=g.length),o.replaceRange("",M(m,b),M(m,e)),p)for(var n=m+1;n<=r;++n){var t,i=o.getLine(n),l=i.indexOf(p);-1==l||E.test(i.slice(0,l))||(t=l+p.length,g&&i.slice(t,t+g.length)==g&&(t+=g.length),o.replaceRange("",M(n,l),M(n,t)))}}),!0)})}); +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";var S={},y=/[^\s\u00a0]/,E=e.Pos,u=e.cmpPos;function f(e){var n=e.search(y);return-1==n?0:n}function M(e,n){var t=e.getMode();return!1!==t.useInnerComments&&t.innerMode?e.getModeAt(n):t}e.commands.toggleComment=function(e){e.toggleComment()},e.defineExtension("toggleComment",function(e){e=e||S;for(var n=this,t=1/0,i=this.listSelections(),l=null,o=i.length-1;0<=o;o--){var r=i[o].from(),m=i[o].to();r.line>=t||(m.line>=t&&(m=E(t,0)),t=r.line,null==l?l=n.uncomment(r,m,e)?"un":(n.lineComment(r,m,e),"line"):"un"==l?n.uncomment(r,m,e):n.lineComment(r,m,e))}}),e.defineExtension("lineComment",function(o,e,r){r=r||S;var n,t,m,a,c,g,s=this,i=M(s,o),l=s.getLine(o.line);null!=l&&(n=o,t=l,!/\bstring\b/.test(s.getTokenTypeAt(E(n.line,0)))||/^[\'\"\`]/.test(t))&&((m=r.lineComment||i.lineComment)?(a=Math.min(0!=e.ch||e.line==o.line?e.line+1:e.line,s.lastLine()+1),c=null==r.padding?" ":r.padding,g=r.commentBlankLines||o.line==e.line,s.operation(function(){if(r.indent){for(var e=null,n=o.line;n<a;++n){var t=(i=s.getLine(n)).slice(0,f(i));(null==e||e.length>t.length)&&(e=t)}for(n=o.line;n<a;++n){var i=s.getLine(n),l=e.length;(g||y.test(i))&&(i.slice(0,l)!=e&&(l=f(i)),s.replaceRange(e+m+c,E(n,0),E(n,l)))}}else for(n=o.line;n<a;++n)(g||y.test(s.getLine(n)))&&s.replaceRange(m+c,E(n,0))})):(r.blockCommentStart||i.blockCommentStart)&&(r.fullLines=!0,s.blockComment(o,e,r)))}),e.defineExtension("blockComment",function(o,r,m){m=m||S;var a,c,g=this,s=M(g,o),f=m.blockCommentStart||s.blockCommentStart,d=m.blockCommentEnd||s.blockCommentEnd;f&&d?/\bcomment\b/.test(g.getTokenTypeAt(E(o.line,0)))||((a=Math.min(r.line,g.lastLine()))!=o.line&&0==r.ch&&y.test(g.getLine(a))&&--a,c=null==m.padding?" ":m.padding,o.line>a||g.operation(function(){if(0!=m.fullLines){var e=y.test(g.getLine(a));g.replaceRange(c+d,E(a)),g.replaceRange(f+c,E(o.line,0));var n=m.blockCommentLead||s.blockCommentLead;if(null!=n)for(var t=o.line+1;t<=a;++t)t==a&&!e||g.replaceRange(n+c,E(t,0))}else{var i=0==u(g.getCursor("to"),r),l=!g.somethingSelected();g.replaceRange(d,r),i&&g.setSelection(l?r:g.getCursor("from"),r),g.replaceRange(f,o)}})):(m.lineComment||s.lineComment)&&0!=m.fullLines&&g.lineComment(o,r,m)}),e.defineExtension("uncomment",function(e,n,t){t=t||S;var l,o=this,i=M(o,e),r=Math.min(0!=n.ch||n.line==e.line?n.line:n.line-1,o.lastLine()),m=Math.min(e.line,r),a=t.lineComment||i.lineComment,c=[],g=null==t.padding?" ":t.padding;e:if(a){for(var s=m;s<=r;++s){var f=o.getLine(s),d=f.indexOf(a);if(-1<d&&!/comment/.test(o.getTokenTypeAt(E(s,d+1)))&&(d=-1),-1==d&&y.test(f))break e;if(-1<d&&y.test(f.slice(0,d)))break e;c.push(f)}if(o.operation(function(){for(var e=m;e<=r;++e){var n=c[e-m],t=n.indexOf(a),i=t+a.length;t<0||(n.slice(i,i+g.length)==g&&(i+=g.length),l=!0,o.replaceRange("",E(e,t),E(e,i)))}}),l)return!0}var u=t.blockCommentStart||i.blockCommentStart,h=t.blockCommentEnd||i.blockCommentEnd;if(!u||!h)return!1;var C=t.blockCommentLead||i.blockCommentLead,p=o.getLine(m),v=p.indexOf(u);if(-1==v)return!1;var b=r==m?p:o.getLine(r),k=b.indexOf(h,r==m?v+u.length:0),L=E(m,v+1),x=E(r,k+1);if(-1==k||!/comment/.test(o.getTokenTypeAt(L))||!/comment/.test(o.getTokenTypeAt(x))||-1<o.getRange(L,x,"\n").indexOf(h))return!1;var R=-1==(T=p.lastIndexOf(u,e.ch))?-1:p.slice(0,e.ch).indexOf(h,T+u.length);if(-1!=T&&-1!=R&&R+h.length!=e.ch)return!1;R=b.indexOf(h,n.ch);var O=b.slice(n.ch).lastIndexOf(u,R-n.ch),T=-1==R||-1==O?-1:n.ch+O;return(-1==R||-1==T||T==n.ch)&&(o.operation(function(){o.replaceRange("",E(r,k-(g&&b.slice(k-g.length,k)==g?g.length:0)),E(r,k+h.length));var e=v+u.length;if(g&&p.slice(e,e+g.length)==g&&(e+=g.length),o.replaceRange("",E(m,v),E(m,e)),C)for(var n=m+1;n<=r;++n){var t,i=o.getLine(n),l=i.indexOf(C);-1==l||y.test(i.slice(0,l))||(t=l+C.length,g&&i.slice(t,t+g.length)==g&&(t+=g.length),o.replaceRange("",E(n,l),E(n,t)))}}),!0)})}); diff --git a/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/keymap/sublime.js b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/keymap/sublime.js index fca70db15..ec3105309 100755 --- a/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/keymap/sublime.js +++ b/plugins/tiddlywiki/codemirror-keymap-sublime-text/files/keymap/sublime.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../lib/codemirror"),require("../addon/search/searchcursor"),require("../addon/edit/matchbrackets")):"function"==typeof define&&define.amd?define(["../lib/codemirror","../addon/search/searchcursor","../addon/edit/matchbrackets"],e):e(CodeMirror)}(function(e){"use strict";var t=e.commands,n=e.Pos;function r(t,r){t.extendSelectionsBy(function(o){return t.display.shift||t.doc.extend||o.empty()?function(t,r,o){if(o<0&&0==r.ch)return t.clipPos(n(r.line-1));var i=t.getLine(r.line);if(o>0&&r.ch>=i.length)return t.clipPos(n(r.line+1,0));for(var l,a="start",s=r.ch,c=o<0?0:i.length,f=0;s!=c;s+=o,f++){var u=i.charAt(o<0?s-1:s),d="_"!=u&&e.isWordChar(u)?"w":"o";if("w"==d&&u.toUpperCase()==u&&(d="W"),"start"==a)"o"!=d&&(a="in",l=d);else if("in"==a&&l!=d){if("w"==l&&"W"==d&&o<0&&s--,"W"==l&&"w"==d&&o>0){l="w";continue}break}}return n(r.line,s)}(t.doc,o.head,r):r<0?o.from():o.to()})}function o(t,r){if(t.isReadOnly())return e.Pass;t.operation(function(){for(var e=t.listSelections().length,o=[],i=-1,l=0;l<e;l++){var a=t.listSelections()[l].head;if(!(a.line<=i)){var s=n(a.line+(r?0:1),0);t.replaceRange("\n",s,null,"+insertLine"),t.indentLine(s.line,null,!0),o.push({head:s,anchor:s}),i=a.line+1}}t.setSelections(o)}),t.execCommand("indentAuto")}function i(t,r){for(var o=r.ch,i=o,l=t.getLine(r.line);o&&e.isWordChar(l.charAt(o-1));)--o;for(;i<l.length&&e.isWordChar(l.charAt(i));)++i;return{from:n(r.line,o),to:n(r.line,i),word:l.slice(o,i)}}function l(e,t){for(var n=e.listSelections(),r=[],o=0;o<n.length;o++){var i=n[o],l=e.findPosV(i.anchor,t,"line",i.anchor.goalColumn),a=e.findPosV(i.head,t,"line",i.head.goalColumn);l.goalColumn=null!=i.anchor.goalColumn?i.anchor.goalColumn:e.cursorCoords(i.anchor,"div").left,a.goalColumn=null!=i.head.goalColumn?i.head.goalColumn:e.cursorCoords(i.head,"div").left;var s={anchor:l,head:a};r.push(i),r.push(s)}e.setSelections(r)}t.goSubwordLeft=function(e){r(e,-1)},t.goSubwordRight=function(e){r(e,1)},t.scrollLineUp=function(e){var t=e.getScrollInfo();if(!e.somethingSelected()){var n=e.lineAtHeight(t.top+t.clientHeight,"local");e.getCursor().line>=n&&e.execCommand("goLineUp")}e.scrollTo(null,t.top-e.defaultTextHeight())},t.scrollLineDown=function(e){var t=e.getScrollInfo();if(!e.somethingSelected()){var n=e.lineAtHeight(t.top,"local")+1;e.getCursor().line<=n&&e.execCommand("goLineDown")}e.scrollTo(null,t.top+e.defaultTextHeight())},t.splitSelectionByLine=function(e){for(var t=e.listSelections(),r=[],o=0;o<t.length;o++)for(var i=t[o].from(),l=t[o].to(),a=i.line;a<=l.line;++a)l.line>i.line&&a==l.line&&0==l.ch||r.push({anchor:a==i.line?i:n(a,0),head:a==l.line?l:n(a)});e.setSelections(r,0)},t.singleSelectionTop=function(e){var t=e.listSelections()[0];e.setSelection(t.anchor,t.head,{scroll:!1})},t.selectLine=function(e){for(var t=e.listSelections(),r=[],o=0;o<t.length;o++){var i=t[o];r.push({anchor:n(i.from().line,0),head:n(i.to().line+1,0)})}e.setSelections(r)},t.insertLineAfter=function(e){return o(e,!1)},t.insertLineBefore=function(e){return o(e,!0)},t.selectNextOccurrence=function(t){var r=t.getCursor("from"),o=t.getCursor("to"),l=t.state.sublimeFindFullWord==t.doc.sel;if(0==e.cmpPos(r,o)){var a=i(t,r);if(!a.word)return;t.setSelection(a.from,a.to),l=!0}else{var s=t.getRange(r,o),c=l?new RegExp("\\b"+s+"\\b"):s,f=t.getSearchCursor(c,o),u=f.findNext();if(u||(u=(f=t.getSearchCursor(c,n(t.firstLine(),0))).findNext()),!u||function(e,t,n){for(var r=0;r<e.length;r++)if(e[r].from()==t&&e[r].to()==n)return!0;return!1}(t.listSelections(),f.from(),f.to()))return e.Pass;t.addSelection(f.from(),f.to())}l&&(t.state.sublimeFindFullWord=t.doc.sel)},t.addCursorToPrevLine=function(e){l(e,-1)},t.addCursorToNextLine=function(e){l(e,1)};var a="(){}[]";function s(t){for(var r=t.listSelections(),o=[],i=0;i<r.length;i++){var l=r[i],s=l.head,c=t.scanForBracket(s,-1);if(!c)return!1;for(;;){var f=t.scanForBracket(s,1);if(!f)return!1;if(f.ch==a.charAt(a.indexOf(c.ch)+1)){var u=n(c.pos.line,c.pos.ch+1);if(0!=e.cmpPos(u,l.from())||0!=e.cmpPos(f.pos,l.to())){o.push({anchor:u,head:f.pos});break}if(!(c=t.scanForBracket(c.pos,-1)))return!1}s=n(f.pos.line,f.pos.ch+1)}}return t.setSelections(o),!0}function c(t,r){if(t.isReadOnly())return e.Pass;for(var o,i=t.listSelections(),l=[],a=0;a<i.length;a++){var s=i[a];if(!s.empty()){for(var c=s.from().line,f=s.to().line;a<i.length-1&&i[a+1].from().line==f;)f=i[++a].to().line;i[a].to().ch||f--,l.push(c,f)}}l.length?o=!0:l.push(t.firstLine(),t.lastLine()),t.operation(function(){for(var e=[],i=0;i<l.length;i+=2){var a=l[i],s=l[i+1],c=n(a,0),f=n(s),u=t.getRange(c,f,!1);r?u.sort():u.sort(function(e,t){var n=e.toUpperCase(),r=t.toUpperCase();return n!=r&&(e=n,t=r),e<t?-1:e==t?0:1}),t.replaceRange(u,c,f),o&&e.push({anchor:c,head:n(s+1,0)})}o&&t.setSelections(e,0)})}function f(t,n){t.operation(function(){for(var r=t.listSelections(),o=[],l=[],a=0;a<r.length;a++){(c=r[a]).empty()?(o.push(a),l.push("")):l.push(n(t.getRange(c.from(),c.to())))}t.replaceSelections(l,"around","case");var s;for(a=o.length-1;a>=0;a--){var c=r[o[a]];if(!(s&&e.cmpPos(c.head,s)>0)){var f=i(t,c.head);s=f.from,t.replaceRange(n(f.word),f.from,f.to)}}})}function u(t){var n=t.getCursor("from"),r=t.getCursor("to");if(0==e.cmpPos(n,r)){var o=i(t,n);if(!o.word)return;n=o.from,r=o.to}return{from:n,to:r,query:t.getRange(n,r),word:o}}function d(e,t){var r=u(e);if(r){var o=r.query,i=e.getSearchCursor(o,t?r.to:r.from);(t?i.findNext():i.findPrevious())?e.setSelection(i.from(),i.to()):(i=e.getSearchCursor(o,t?n(e.firstLine(),0):e.clipPos(n(e.lastLine()))),(t?i.findNext():i.findPrevious())?e.setSelection(i.from(),i.to()):r.word&&e.setSelection(r.from,r.to))}}t.selectScope=function(e){s(e)||e.execCommand("selectAll")},t.selectBetweenBrackets=function(t){if(!s(t))return e.Pass},t.goToBracket=function(t){t.extendSelectionsBy(function(r){var o=t.scanForBracket(r.head,1);if(o&&0!=e.cmpPos(o.pos,r.head))return o.pos;var i=t.scanForBracket(r.head,-1);return i&&n(i.pos.line,i.pos.ch+1)||r.head})},t.swapLineUp=function(t){if(t.isReadOnly())return e.Pass;for(var r=t.listSelections(),o=[],i=t.firstLine()-1,l=[],a=0;a<r.length;a++){var s=r[a],c=s.from().line-1,f=s.to().line;l.push({anchor:n(s.anchor.line-1,s.anchor.ch),head:n(s.head.line-1,s.head.ch)}),0!=s.to().ch||s.empty()||--f,c>i?o.push(c,f):o.length&&(o[o.length-1]=f),i=f}t.operation(function(){for(var e=0;e<o.length;e+=2){var r=o[e],i=o[e+1],a=t.getLine(r);t.replaceRange("",n(r,0),n(r+1,0),"+swapLine"),i>t.lastLine()?t.replaceRange("\n"+a,n(t.lastLine()),null,"+swapLine"):t.replaceRange(a+"\n",n(i,0),null,"+swapLine")}t.setSelections(l),t.scrollIntoView()})},t.swapLineDown=function(t){if(t.isReadOnly())return e.Pass;for(var r=t.listSelections(),o=[],i=t.lastLine()+1,l=r.length-1;l>=0;l--){var a=r[l],s=a.to().line+1,c=a.from().line;0!=a.to().ch||a.empty()||s--,s<i?o.push(s,c):o.length&&(o[o.length-1]=c),i=c}t.operation(function(){for(var e=o.length-2;e>=0;e-=2){var r=o[e],i=o[e+1],l=t.getLine(r);r==t.lastLine()?t.replaceRange("",n(r-1),n(r),"+swapLine"):t.replaceRange("",n(r,0),n(r+1,0),"+swapLine"),t.replaceRange(l+"\n",n(i,0),null,"+swapLine")}t.scrollIntoView()})},t.toggleCommentIndented=function(e){e.toggleComment({indent:!0})},t.joinLines=function(e){for(var t=e.listSelections(),r=[],o=0;o<t.length;o++){for(var i=t[o],l=i.from(),a=l.line,s=i.to().line;o<t.length-1&&t[o+1].from().line==s;)s=t[++o].to().line;r.push({start:a,end:s,anchor:!i.empty()&&l})}e.operation(function(){for(var t=0,o=[],i=0;i<r.length;i++){for(var l,a=r[i],s=a.anchor&&n(a.anchor.line-t,a.anchor.ch),c=a.start;c<=a.end;c++){var f=c-t;c==a.end&&(l=n(f,e.getLine(f).length+1)),f<e.lastLine()&&(e.replaceRange(" ",n(f),n(f+1,/^\s*/.exec(e.getLine(f+1))[0].length)),++t)}o.push({anchor:s||l,head:l})}e.setSelections(o,0)})},t.duplicateLine=function(e){e.operation(function(){for(var t=e.listSelections().length,r=0;r<t;r++){var o=e.listSelections()[r];o.empty()?e.replaceRange(e.getLine(o.head.line)+"\n",n(o.head.line,0)):e.replaceRange(e.getRange(o.from(),o.to()),o.from())}e.scrollIntoView()})},t.sortLines=function(e){c(e,!0)},t.sortLinesInsensitive=function(e){c(e,!1)},t.nextBookmark=function(e){var t=e.state.sublimeBookmarks;if(t)for(;t.length;){var n=t.shift(),r=n.find();if(r)return t.push(n),e.setSelection(r.from,r.to)}},t.prevBookmark=function(e){var t=e.state.sublimeBookmarks;if(t)for(;t.length;){t.unshift(t.pop());var n=t[t.length-1].find();if(n)return e.setSelection(n.from,n.to);t.pop()}},t.toggleBookmark=function(e){for(var t=e.listSelections(),n=e.state.sublimeBookmarks||(e.state.sublimeBookmarks=[]),r=0;r<t.length;r++){for(var o=t[r].from(),i=t[r].to(),l=t[r].empty()?e.findMarksAt(o):e.findMarks(o,i),a=0;a<l.length;a++)if(l[a].sublimeBookmark){l[a].clear();for(var s=0;s<n.length;s++)n[s]==l[a]&&n.splice(s--,1);break}a==l.length&&n.push(e.markText(o,i,{sublimeBookmark:!0,clearWhenEmpty:!1}))}},t.clearBookmarks=function(e){var t=e.state.sublimeBookmarks;if(t)for(var n=0;n<t.length;n++)t[n].clear();t.length=0},t.selectBookmarks=function(e){var t=e.state.sublimeBookmarks,n=[];if(t)for(var r=0;r<t.length;r++){var o=t[r].find();o?n.push({anchor:o.from,head:o.to}):t.splice(r--,0)}n.length&&e.setSelections(n,0)},t.smartBackspace=function(t){if(t.somethingSelected())return e.Pass;t.operation(function(){for(var r=t.listSelections(),o=t.getOption("indentUnit"),i=r.length-1;i>=0;i--){var l=r[i].head,a=t.getRange({line:l.line,ch:0},l),s=e.countColumn(a,null,t.getOption("tabSize")),c=t.findPosH(l,-1,"char",!1);if(a&&!/\S/.test(a)&&s%o==0){var f=new n(l.line,e.findColumn(a,s-o,o));f.ch!=l.ch&&(c=f)}t.replaceRange("",c,l,"+delete")}})},t.delLineRight=function(e){e.operation(function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange("",t[r].anchor,n(t[r].to().line),"+delete");e.scrollIntoView()})},t.upcaseAtCursor=function(e){f(e,function(e){return e.toUpperCase()})},t.downcaseAtCursor=function(e){f(e,function(e){return e.toLowerCase()})},t.setSublimeMark=function(e){e.state.sublimeMark&&e.state.sublimeMark.clear(),e.state.sublimeMark=e.setBookmark(e.getCursor())},t.selectToSublimeMark=function(e){var t=e.state.sublimeMark&&e.state.sublimeMark.find();t&&e.setSelection(e.getCursor(),t)},t.deleteToSublimeMark=function(t){var n=t.state.sublimeMark&&t.state.sublimeMark.find();if(n){var r=t.getCursor(),o=n;if(e.cmpPos(r,o)>0){var i=o;o=r,r=i}t.state.sublimeKilled=t.getRange(r,o),t.replaceRange("",r,o)}},t.swapWithSublimeMark=function(e){var t=e.state.sublimeMark&&e.state.sublimeMark.find();t&&(e.state.sublimeMark.clear(),e.state.sublimeMark=e.setBookmark(e.getCursor()),e.setCursor(t))},t.sublimeYank=function(e){null!=e.state.sublimeKilled&&e.replaceSelection(e.state.sublimeKilled,null,"paste")},t.showInCenter=function(e){var t=e.cursorCoords(null,"local");e.scrollTo(null,(t.top+t.bottom)/2-e.getScrollInfo().clientHeight/2)},t.findUnder=function(e){d(e,!0)},t.findUnderPrevious=function(e){d(e,!1)},t.findAllUnder=function(e){var t=u(e);if(t){for(var n=e.getSearchCursor(t.query),r=[],o=-1;n.findNext();)r.push({anchor:n.from(),head:n.to()}),n.from().line<=t.from.line&&n.from().ch<=t.from.ch&&o++;e.setSelections(r,o)}};var m=e.keyMap;m.macSublime={"Cmd-Left":"goLineStartSmart","Shift-Tab":"indentLess","Shift-Ctrl-K":"deleteLine","Alt-Q":"wrapLines","Ctrl-Left":"goSubwordLeft","Ctrl-Right":"goSubwordRight","Ctrl-Alt-Up":"scrollLineUp","Ctrl-Alt-Down":"scrollLineDown","Cmd-L":"selectLine","Shift-Cmd-L":"splitSelectionByLine",Esc:"singleSelectionTop","Cmd-Enter":"insertLineAfter","Shift-Cmd-Enter":"insertLineBefore","Cmd-D":"selectNextOccurrence","Shift-Cmd-Space":"selectScope","Shift-Cmd-M":"selectBetweenBrackets","Cmd-M":"goToBracket","Cmd-Ctrl-Up":"swapLineUp","Cmd-Ctrl-Down":"swapLineDown","Cmd-/":"toggleCommentIndented","Cmd-J":"joinLines","Shift-Cmd-D":"duplicateLine",F9:"sortLines","Cmd-F9":"sortLinesInsensitive",F2:"nextBookmark","Shift-F2":"prevBookmark","Cmd-F2":"toggleBookmark","Shift-Cmd-F2":"clearBookmarks","Alt-F2":"selectBookmarks",Backspace:"smartBackspace","Cmd-K Cmd-K":"delLineRight","Cmd-K Cmd-U":"upcaseAtCursor","Cmd-K Cmd-L":"downcaseAtCursor","Cmd-K Cmd-Space":"setSublimeMark","Cmd-K Cmd-A":"selectToSublimeMark","Cmd-K Cmd-W":"deleteToSublimeMark","Cmd-K Cmd-X":"swapWithSublimeMark","Cmd-K Cmd-Y":"sublimeYank","Cmd-K Cmd-C":"showInCenter","Cmd-K Cmd-G":"clearBookmarks","Cmd-K Cmd-Backspace":"delLineLeft","Cmd-K Cmd-0":"unfoldAll","Cmd-K Cmd-J":"unfoldAll","Ctrl-Shift-Up":"addCursorToPrevLine","Ctrl-Shift-Down":"addCursorToNextLine","Cmd-F3":"findUnder","Shift-Cmd-F3":"findUnderPrevious","Alt-F3":"findAllUnder","Shift-Cmd-[":"fold","Shift-Cmd-]":"unfold","Cmd-I":"findIncremental","Shift-Cmd-I":"findIncrementalReverse","Cmd-H":"replace",F3:"findNext","Shift-F3":"findPrev",fallthrough:"macDefault"},e.normalizeKeyMap(m.macSublime),m.pcSublime={"Shift-Tab":"indentLess","Shift-Ctrl-K":"deleteLine","Alt-Q":"wrapLines","Ctrl-T":"transposeChars","Alt-Left":"goSubwordLeft","Alt-Right":"goSubwordRight","Ctrl-Up":"scrollLineUp","Ctrl-Down":"scrollLineDown","Ctrl-L":"selectLine","Shift-Ctrl-L":"splitSelectionByLine",Esc:"singleSelectionTop","Ctrl-Enter":"insertLineAfter","Shift-Ctrl-Enter":"insertLineBefore","Ctrl-D":"selectNextOccurrence","Shift-Ctrl-Space":"selectScope","Shift-Ctrl-M":"selectBetweenBrackets","Ctrl-M":"goToBracket","Shift-Ctrl-Up":"swapLineUp","Shift-Ctrl-Down":"swapLineDown","Ctrl-/":"toggleCommentIndented","Ctrl-J":"joinLines","Shift-Ctrl-D":"duplicateLine",F9:"sortLines","Ctrl-F9":"sortLinesInsensitive",F2:"nextBookmark","Shift-F2":"prevBookmark","Ctrl-F2":"toggleBookmark","Shift-Ctrl-F2":"clearBookmarks","Alt-F2":"selectBookmarks",Backspace:"smartBackspace","Ctrl-K Ctrl-K":"delLineRight","Ctrl-K Ctrl-U":"upcaseAtCursor","Ctrl-K Ctrl-L":"downcaseAtCursor","Ctrl-K Ctrl-Space":"setSublimeMark","Ctrl-K Ctrl-A":"selectToSublimeMark","Ctrl-K Ctrl-W":"deleteToSublimeMark","Ctrl-K Ctrl-X":"swapWithSublimeMark","Ctrl-K Ctrl-Y":"sublimeYank","Ctrl-K Ctrl-C":"showInCenter","Ctrl-K Ctrl-G":"clearBookmarks","Ctrl-K Ctrl-Backspace":"delLineLeft","Ctrl-K Ctrl-0":"unfoldAll","Ctrl-K Ctrl-J":"unfoldAll","Ctrl-Alt-Up":"addCursorToPrevLine","Ctrl-Alt-Down":"addCursorToNextLine","Ctrl-F3":"findUnder","Shift-Ctrl-F3":"findUnderPrevious","Alt-F3":"findAllUnder","Shift-Ctrl-[":"fold","Shift-Ctrl-]":"unfold","Ctrl-I":"findIncremental","Shift-Ctrl-I":"findIncrementalReverse","Ctrl-H":"replace",F3:"findNext","Shift-F3":"findPrev",fallthrough:"pcDefault"},e.normalizeKeyMap(m.pcSublime);var h=m.default==m.macDefault;m.sublime=h?m.macSublime:m.pcSublime}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../lib/codemirror"),require("../addon/search/searchcursor"),require("../addon/edit/matchbrackets")):"function"==typeof define&&define.amd?define(["../lib/codemirror","../addon/search/searchcursor","../addon/edit/matchbrackets"],e):e(CodeMirror)}(function(u){"use strict";var r=u.commands,d=u.Pos;function t(t,n){t.extendSelectionsBy(function(e){return t.display.shift||t.doc.extend||e.empty()?function(e,t,n){if(n<0&&0==t.ch)return e.clipPos(d(t.line-1));var r=e.getLine(t.line);if(0<n&&t.ch>=r.length)return e.clipPos(d(t.line+1,0));for(var o,i="start",l=t.ch,a=l,s=n<0?0:r.length;a!=s;a+=n,0){var c=r.charAt(n<0?a-1:a),f="_"!=c&&u.isWordChar(c)?"w":"o";if("w"==f&&c.toUpperCase()==c&&(f="W"),"start"==i)"o"!=f?(i="in",o=f):l=a+n;else if("in"==i&&o!=f){if("w"==o&&"W"==f&&n<0&&a--,"W"==o&&"w"==f&&0<n){if(a==l+1){o="w";continue}a--}break}}return d(t.line,a)}(t.doc,e.head,n):n<0?e.from():e.to()})}function n(l,a){if(l.isReadOnly())return u.Pass;l.operation(function(){for(var e=l.listSelections().length,t=[],n=-1,r=0;r<e;r++){var o,i=l.listSelections()[r].head;i.line<=n||(o=d(i.line+(a?0:1),0),l.replaceRange("\n",o,null,"+insertLine"),l.indentLine(o.line,null,!0),t.push({head:o,anchor:o}),n=i.line+1)}l.setSelections(t)}),l.execCommand("indentAuto")}function c(e,t){for(var n=t.ch,r=n,o=e.getLine(t.line);n&&u.isWordChar(o.charAt(n-1));)--n;for(;r<o.length&&u.isWordChar(o.charAt(r));)++r;return{from:d(t.line,n),to:d(t.line,r),word:o.slice(n,r)}}function o(e,t){for(var n=e.listSelections(),r=[],o=0;o<n.length;o++){var i=n[o],l=e.findPosV(i.anchor,t,"line",i.anchor.goalColumn),a=e.findPosV(i.head,t,"line",i.head.goalColumn);l.goalColumn=null!=i.anchor.goalColumn?i.anchor.goalColumn:e.cursorCoords(i.anchor,"div").left,a.goalColumn=null!=i.head.goalColumn?i.head.goalColumn:e.cursorCoords(i.head,"div").left;var s={anchor:l,head:a};r.push(i),r.push(s)}e.setSelections(r)}r.goSubwordLeft=function(e){t(e,-1)},r.goSubwordRight=function(e){t(e,1)},r.scrollLineUp=function(e){var t,n=e.getScrollInfo();e.somethingSelected()||(t=e.lineAtHeight(n.top+n.clientHeight,"local"),e.getCursor().line>=t&&e.execCommand("goLineUp")),e.scrollTo(null,n.top-e.defaultTextHeight())},r.scrollLineDown=function(e){var t,n=e.getScrollInfo();e.somethingSelected()||(t=e.lineAtHeight(n.top,"local")+1,e.getCursor().line<=t&&e.execCommand("goLineDown")),e.scrollTo(null,n.top+e.defaultTextHeight())},r.splitSelectionByLine=function(e){for(var t=e.listSelections(),n=[],r=0;r<t.length;r++)for(var o=t[r].from(),i=t[r].to(),l=o.line;l<=i.line;++l)i.line>o.line&&l==i.line&&0==i.ch||n.push({anchor:l==o.line?o:d(l,0),head:l==i.line?i:d(l)});e.setSelections(n,0)},r.singleSelectionTop=function(e){var t=e.listSelections()[0];e.setSelection(t.anchor,t.head,{scroll:!1})},r.selectLine=function(e){for(var t=e.listSelections(),n=[],r=0;r<t.length;r++){var o=t[r];n.push({anchor:d(o.from().line,0),head:d(o.to().line+1,0)})}e.setSelections(n)},r.insertLineAfter=function(e){return n(e,!1)},r.insertLineBefore=function(e){return n(e,!0)},r.selectNextOccurrence=function(e){var t=e.getCursor("from"),n=e.getCursor("to"),r=e.state.sublimeFindFullWord==e.doc.sel;if(0==u.cmpPos(t,n)){var o=c(e,t);if(!o.word)return;e.setSelection(o.from,o.to),r=!0}else{var i=e.getRange(t,n),l=r?new RegExp("\\b"+i+"\\b"):i,a=e.getSearchCursor(l,n);if(!(a.findNext()||(a=e.getSearchCursor(l,d(e.firstLine(),0))).findNext())||function(e,t,n){for(var r=0;r<e.length;r++)if(0==u.cmpPos(e[r].from(),t)&&0==u.cmpPos(e[r].to(),n))return!0;return!1}(e.listSelections(),a.from(),a.to()))return;e.addSelection(a.from(),a.to())}r&&(e.state.sublimeFindFullWord=e.doc.sel)},r.skipAndSelectNextOccurrence=function(e){var t=e.getCursor("anchor"),n=e.getCursor("head");r.selectNextOccurrence(e),0!=u.cmpPos(t,n)&&e.doc.setSelections(e.doc.listSelections().filter(function(e){return e.anchor!=t||e.head!=n}))},r.addCursorToPrevLine=function(e){o(e,-1)},r.addCursorToNextLine=function(e){o(e,1)};var f="(){}[]";function i(e){for(var t=e.listSelections(),n=[],r=0;r<t.length;r++){var o=t[r],i=o.head,l=e.scanForBracket(i,-1);if(!l)return;for(;;){var a=e.scanForBracket(i,1);if(!a)return;if(a.ch==f.charAt(f.indexOf(l.ch)+1)){var s=d(l.pos.line,l.pos.ch+1);if(0!=u.cmpPos(s,o.from())||0!=u.cmpPos(a.pos,o.to())){n.push({anchor:s,head:a.pos});break}if(!(l=e.scanForBracket(l.pos,-1)))return}i=d(a.pos.line,a.pos.ch+1)}}return e.setSelections(n),1}function l(e){return e?/\bpunctuation\b/.test(e)?e:void 0:null}function a(a,s){if(a.isReadOnly())return u.Pass;for(var c,e=a.listSelections(),f=[],t=0;t<e.length;t++){var n=e[t];if(!n.empty()){for(var r=n.from().line,o=n.to().line;t<e.length-1&&e[t+1].from().line==o;)o=e[++t].to().line;e[t].to().ch||o--,f.push(r,o)}}f.length?c=!0:f.push(a.firstLine(),a.lastLine()),a.operation(function(){for(var e=[],t=0;t<f.length;t+=2){var n=f[t],r=f[t+1],o=d(n,0),i=d(r),l=a.getRange(o,i,!1);s?l.sort():l.sort(function(e,t){var n=e.toUpperCase(),r=t.toUpperCase();return n!=r&&(e=n,t=r),e<t?-1:e==t?0:1}),a.replaceRange(l,o,i),c&&e.push({anchor:o,head:d(r+1,0)})}c&&a.setSelections(e,0)})}function s(a,s){a.operation(function(){for(var e=a.listSelections(),t=[],n=[],r=0;r<e.length;r++){(l=e[r]).empty()?(t.push(r),n.push("")):n.push(s(a.getRange(l.from(),l.to())))}a.replaceSelections(n,"around","case");for(r=t.length-1;0<=r;r--){var o,i,l=e[t[r]];i&&0<u.cmpPos(l.head,i)||(i=(o=c(a,l.head)).from,a.replaceRange(s(o.word),o.from,o.to))}})}function m(e){var t=e.getCursor("from"),n=e.getCursor("to");if(0==u.cmpPos(t,n)){var r=c(e,t);if(!r.word)return;t=r.from,n=r.to}return{from:t,to:n,query:e.getRange(t,n),word:r}}function h(e,t){var n,r,o=m(e);o&&(n=o.query,r=e.getSearchCursor(n,t?o.to:o.from),(t?r.findNext():r.findPrevious())?e.setSelection(r.from(),r.to()):(r=e.getSearchCursor(n,t?d(e.firstLine(),0):e.clipPos(d(e.lastLine()))),(t?r.findNext():r.findPrevious())?e.setSelection(r.from(),r.to()):o.word&&e.setSelection(o.from,o.to)))}r.selectScope=function(e){i(e)||e.execCommand("selectAll")},r.selectBetweenBrackets=function(e){if(!i(e))return u.Pass},r.goToBracket=function(r){r.extendSelectionsBy(function(e){var t=r.scanForBracket(e.head,1,l(r.getTokenTypeAt(e.head)));if(t&&0!=u.cmpPos(t.pos,e.head))return t.pos;var n=r.scanForBracket(e.head,-1,l(r.getTokenTypeAt(d(e.head.line,e.head.ch+1))));return n&&d(n.pos.line,n.pos.ch+1)||e.head})},r.swapLineUp=function(o){if(o.isReadOnly())return u.Pass;for(var e=o.listSelections(),i=[],t=o.firstLine()-1,l=[],n=0;n<e.length;n++){var r=e[n],a=r.from().line-1,s=r.to().line;l.push({anchor:d(r.anchor.line-1,r.anchor.ch),head:d(r.head.line-1,r.head.ch)}),0!=r.to().ch||r.empty()||--s,t<a?i.push(a,s):i.length&&(i[i.length-1]=s),t=s}o.operation(function(){for(var e=0;e<i.length;e+=2){var t=i[e],n=i[e+1],r=o.getLine(t);o.replaceRange("",d(t,0),d(t+1,0),"+swapLine"),n>o.lastLine()?o.replaceRange("\n"+r,d(o.lastLine()),null,"+swapLine"):o.replaceRange(r+"\n",d(n,0),null,"+swapLine")}o.setSelections(l),o.scrollIntoView()})},r.swapLineDown=function(o){if(o.isReadOnly())return u.Pass;for(var e=o.listSelections(),i=[],t=o.lastLine()+1,n=e.length-1;0<=n;n--){var r=e[n],l=r.to().line+1,a=r.from().line;0!=r.to().ch||r.empty()||l--,l<t?i.push(l,a):i.length&&(i[i.length-1]=a),t=a}o.operation(function(){for(var e=i.length-2;0<=e;e-=2){var t=i[e],n=i[e+1],r=o.getLine(t);t==o.lastLine()?o.replaceRange("",d(t-1),d(t),"+swapLine"):o.replaceRange("",d(t,0),d(t+1,0),"+swapLine"),o.replaceRange(r+"\n",d(n,0),null,"+swapLine")}o.scrollIntoView()})},r.toggleCommentIndented=function(e){e.toggleComment({indent:!0})},r.joinLines=function(s){for(var e=s.listSelections(),c=[],t=0;t<e.length;t++){for(var n=e[t],r=n.from(),o=r.line,i=n.to().line;t<e.length-1&&e[t+1].from().line==i;)i=e[++t].to().line;c.push({start:o,end:i,anchor:!n.empty()&&r})}s.operation(function(){for(var e=0,t=[],n=0;n<c.length;n++){for(var r,o=c[n],i=o.anchor&&d(o.anchor.line-e,o.anchor.ch),l=o.start;l<=o.end;l++){var a=l-e;l==o.end&&(r=d(a,s.getLine(a).length+1)),a<s.lastLine()&&(s.replaceRange(" ",d(a),d(1+a,/^\s*/.exec(s.getLine(1+a))[0].length)),++e)}t.push({anchor:i||r,head:r})}s.setSelections(t,0)})},r.duplicateLine=function(r){r.operation(function(){for(var e=r.listSelections().length,t=0;t<e;t++){var n=r.listSelections()[t];n.empty()?r.replaceRange(r.getLine(n.head.line)+"\n",d(n.head.line,0)):r.replaceRange(r.getRange(n.from(),n.to()),n.from())}r.scrollIntoView()})},r.sortLines=function(e){a(e,!0)},r.sortLinesInsensitive=function(e){a(e,!1)},r.nextBookmark=function(e){var t=e.state.sublimeBookmarks;if(t)for(;t.length;){var n=t.shift(),r=n.find();if(r)return t.push(n),e.setSelection(r.from,r.to)}},r.prevBookmark=function(e){var t=e.state.sublimeBookmarks;if(t)for(;t.length;){t.unshift(t.pop());var n=t[t.length-1].find();if(n)return e.setSelection(n.from,n.to);t.pop()}},r.toggleBookmark=function(e){for(var t=e.listSelections(),n=e.state.sublimeBookmarks||(e.state.sublimeBookmarks=[]),r=0;r<t.length;r++){for(var o=t[r].from(),i=t[r].to(),l=t[r].empty()?e.findMarksAt(o):e.findMarks(o,i),a=0;a<l.length;a++)if(l[a].sublimeBookmark){l[a].clear();for(var s=0;s<n.length;s++)n[s]==l[a]&&n.splice(s--,1);break}a==l.length&&n.push(e.markText(o,i,{sublimeBookmark:!0,clearWhenEmpty:!1}))}},r.clearBookmarks=function(e){var t=e.state.sublimeBookmarks;if(t)for(var n=0;n<t.length;n++)t[n].clear();t.length=0},r.selectBookmarks=function(e){var t=e.state.sublimeBookmarks,n=[];if(t)for(var r=0;r<t.length;r++){var o=t[r].find();o?n.push({anchor:o.from,head:o.to}):t.splice(r--,0)}n.length&&e.setSelections(n,0)},r.smartBackspace=function(s){if(s.somethingSelected())return u.Pass;s.operation(function(){for(var e=s.listSelections(),t=s.getOption("indentUnit"),n=e.length-1;0<=n;n--){var r,o=e[n].head,i=s.getRange({line:o.line,ch:0},o),l=u.countColumn(i,null,s.getOption("tabSize")),a=s.findPosH(o,-1,"char",!1);!i||/\S/.test(i)||l%t!=0||(r=new d(o.line,u.findColumn(i,l-t,t))).ch!=o.ch&&(a=r),s.replaceRange("",a,o,"+delete")}})},r.delLineRight=function(n){n.operation(function(){for(var e=n.listSelections(),t=e.length-1;0<=t;t--)n.replaceRange("",e[t].anchor,d(e[t].to().line),"+delete");n.scrollIntoView()})},r.upcaseAtCursor=function(e){s(e,function(e){return e.toUpperCase()})},r.downcaseAtCursor=function(e){s(e,function(e){return e.toLowerCase()})},r.setSublimeMark=function(e){e.state.sublimeMark&&e.state.sublimeMark.clear(),e.state.sublimeMark=e.setBookmark(e.getCursor())},r.selectToSublimeMark=function(e){var t=e.state.sublimeMark&&e.state.sublimeMark.find();t&&e.setSelection(e.getCursor(),t)},r.deleteToSublimeMark=function(e){var t,n,r,o=e.state.sublimeMark&&e.state.sublimeMark.find();o&&(r=e.getCursor(),n=o,0<u.cmpPos(r,n)&&(t=n,n=r,r=t),e.state.sublimeKilled=e.getRange(r,n),e.replaceRange("",r,n))},r.swapWithSublimeMark=function(e){var t=e.state.sublimeMark&&e.state.sublimeMark.find();t&&(e.state.sublimeMark.clear(),e.state.sublimeMark=e.setBookmark(e.getCursor()),e.setCursor(t))},r.sublimeYank=function(e){null!=e.state.sublimeKilled&&e.replaceSelection(e.state.sublimeKilled,null,"paste")},r.showInCenter=function(e){var t=e.cursorCoords(null,"local");e.scrollTo(null,(t.top+t.bottom)/2-e.getScrollInfo().clientHeight/2)},r.findUnder=function(e){h(e,!0)},r.findUnderPrevious=function(e){h(e,!1)},r.findAllUnder=function(e){var t=m(e);if(t){for(var n=e.getSearchCursor(t.query),r=[],o=-1;n.findNext();)r.push({anchor:n.from(),head:n.to()}),n.from().line<=t.from.line&&n.from().ch<=t.from.ch&&o++;e.setSelections(r,o)}};var e=u.keyMap;e.macSublime={"Cmd-Left":"goLineStartSmart","Shift-Tab":"indentLess","Shift-Ctrl-K":"deleteLine","Alt-Q":"wrapLines","Ctrl-Left":"goSubwordLeft","Ctrl-Right":"goSubwordRight","Ctrl-Alt-Up":"scrollLineUp","Ctrl-Alt-Down":"scrollLineDown","Cmd-L":"selectLine","Shift-Cmd-L":"splitSelectionByLine",Esc:"singleSelectionTop","Cmd-Enter":"insertLineAfter","Shift-Cmd-Enter":"insertLineBefore","Cmd-D":"selectNextOccurrence","Shift-Cmd-Space":"selectScope","Shift-Cmd-M":"selectBetweenBrackets","Cmd-M":"goToBracket","Cmd-Ctrl-Up":"swapLineUp","Cmd-Ctrl-Down":"swapLineDown","Cmd-/":"toggleCommentIndented","Cmd-J":"joinLines","Shift-Cmd-D":"duplicateLine",F5:"sortLines","Cmd-F5":"sortLinesInsensitive",F2:"nextBookmark","Shift-F2":"prevBookmark","Cmd-F2":"toggleBookmark","Shift-Cmd-F2":"clearBookmarks","Alt-F2":"selectBookmarks",Backspace:"smartBackspace","Cmd-K Cmd-D":"skipAndSelectNextOccurrence","Cmd-K Cmd-K":"delLineRight","Cmd-K Cmd-U":"upcaseAtCursor","Cmd-K Cmd-L":"downcaseAtCursor","Cmd-K Cmd-Space":"setSublimeMark","Cmd-K Cmd-A":"selectToSublimeMark","Cmd-K Cmd-W":"deleteToSublimeMark","Cmd-K Cmd-X":"swapWithSublimeMark","Cmd-K Cmd-Y":"sublimeYank","Cmd-K Cmd-C":"showInCenter","Cmd-K Cmd-G":"clearBookmarks","Cmd-K Cmd-Backspace":"delLineLeft","Cmd-K Cmd-1":"foldAll","Cmd-K Cmd-0":"unfoldAll","Cmd-K Cmd-J":"unfoldAll","Ctrl-Shift-Up":"addCursorToPrevLine","Ctrl-Shift-Down":"addCursorToNextLine","Cmd-F3":"findUnder","Shift-Cmd-F3":"findUnderPrevious","Alt-F3":"findAllUnder","Shift-Cmd-[":"fold","Shift-Cmd-]":"unfold","Cmd-I":"findIncremental","Shift-Cmd-I":"findIncrementalReverse","Cmd-H":"replace",F3:"findNext","Shift-F3":"findPrev",fallthrough:"macDefault"},u.normalizeKeyMap(e.macSublime),e.pcSublime={"Shift-Tab":"indentLess","Shift-Ctrl-K":"deleteLine","Alt-Q":"wrapLines","Ctrl-T":"transposeChars","Alt-Left":"goSubwordLeft","Alt-Right":"goSubwordRight","Ctrl-Up":"scrollLineUp","Ctrl-Down":"scrollLineDown","Ctrl-L":"selectLine","Shift-Ctrl-L":"splitSelectionByLine",Esc:"singleSelectionTop","Ctrl-Enter":"insertLineAfter","Shift-Ctrl-Enter":"insertLineBefore","Ctrl-D":"selectNextOccurrence","Shift-Ctrl-Space":"selectScope","Shift-Ctrl-M":"selectBetweenBrackets","Ctrl-M":"goToBracket","Shift-Ctrl-Up":"swapLineUp","Shift-Ctrl-Down":"swapLineDown","Ctrl-/":"toggleCommentIndented","Ctrl-J":"joinLines","Shift-Ctrl-D":"duplicateLine",F9:"sortLines","Ctrl-F9":"sortLinesInsensitive",F2:"nextBookmark","Shift-F2":"prevBookmark","Ctrl-F2":"toggleBookmark","Shift-Ctrl-F2":"clearBookmarks","Alt-F2":"selectBookmarks",Backspace:"smartBackspace","Ctrl-K Ctrl-D":"skipAndSelectNextOccurrence","Ctrl-K Ctrl-K":"delLineRight","Ctrl-K Ctrl-U":"upcaseAtCursor","Ctrl-K Ctrl-L":"downcaseAtCursor","Ctrl-K Ctrl-Space":"setSublimeMark","Ctrl-K Ctrl-A":"selectToSublimeMark","Ctrl-K Ctrl-W":"deleteToSublimeMark","Ctrl-K Ctrl-X":"swapWithSublimeMark","Ctrl-K Ctrl-Y":"sublimeYank","Ctrl-K Ctrl-C":"showInCenter","Ctrl-K Ctrl-G":"clearBookmarks","Ctrl-K Ctrl-Backspace":"delLineLeft","Ctrl-K Ctrl-1":"foldAll","Ctrl-K Ctrl-0":"unfoldAll","Ctrl-K Ctrl-J":"unfoldAll","Ctrl-Alt-Up":"addCursorToPrevLine","Ctrl-Alt-Down":"addCursorToNextLine","Ctrl-F3":"findUnder","Shift-Ctrl-F3":"findUnderPrevious","Alt-F3":"findAllUnder","Shift-Ctrl-[":"fold","Shift-Ctrl-]":"unfold","Ctrl-I":"findIncremental","Shift-Ctrl-I":"findIncrementalReverse","Ctrl-H":"replace",F3:"findNext","Shift-F3":"findPrev",fallthrough:"pcDefault"},u.normalizeKeyMap(e.pcSublime);var C=e.default==e.macDefault;e.sublime=C?e.macSublime:e.pcSublime}); diff --git a/plugins/tiddlywiki/codemirror-keymap-vim/files/keymap/vim.js b/plugins/tiddlywiki/codemirror-keymap-vim/files/keymap/vim.js index ad7d48791..d5fe7737f 100755 --- a/plugins/tiddlywiki/codemirror-keymap-vim/files/keymap/vim.js +++ b/plugins/tiddlywiki/codemirror-keymap-vim/files/keymap/vim.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../lib/codemirror"),require("../addon/search/searchcursor"),require("../addon/dialog/dialog"),require("../addon/edit/matchbrackets.js")):"function"==typeof define&&define.amd?define(["../lib/codemirror","../addon/search/searchcursor","../addon/dialog/dialog","../addon/edit/matchbrackets"],e):e(CodeMirror)}(function(e){"use strict";var t=[{keys:"<Left>",type:"keyToKey",toKeys:"h"},{keys:"<Right>",type:"keyToKey",toKeys:"l"},{keys:"<Up>",type:"keyToKey",toKeys:"k"},{keys:"<Down>",type:"keyToKey",toKeys:"j"},{keys:"<Space>",type:"keyToKey",toKeys:"l"},{keys:"<BS>",type:"keyToKey",toKeys:"h",context:"normal"},{keys:"<C-Space>",type:"keyToKey",toKeys:"W"},{keys:"<C-BS>",type:"keyToKey",toKeys:"B",context:"normal"},{keys:"<S-Space>",type:"keyToKey",toKeys:"w"},{keys:"<S-BS>",type:"keyToKey",toKeys:"b",context:"normal"},{keys:"<C-n>",type:"keyToKey",toKeys:"j"},{keys:"<C-p>",type:"keyToKey",toKeys:"k"},{keys:"<C-[>",type:"keyToKey",toKeys:"<Esc>"},{keys:"<C-c>",type:"keyToKey",toKeys:"<Esc>"},{keys:"<C-[>",type:"keyToKey",toKeys:"<Esc>",context:"insert"},{keys:"<C-c>",type:"keyToKey",toKeys:"<Esc>",context:"insert"},{keys:"s",type:"keyToKey",toKeys:"cl",context:"normal"},{keys:"s",type:"keyToKey",toKeys:"c",context:"visual"},{keys:"S",type:"keyToKey",toKeys:"cc",context:"normal"},{keys:"S",type:"keyToKey",toKeys:"VdO",context:"visual"},{keys:"<Home>",type:"keyToKey",toKeys:"0"},{keys:"<End>",type:"keyToKey",toKeys:"$"},{keys:"<PageUp>",type:"keyToKey",toKeys:"<C-b>"},{keys:"<PageDown>",type:"keyToKey",toKeys:"<C-f>"},{keys:"<CR>",type:"keyToKey",toKeys:"j^",context:"normal"},{keys:"<Ins>",type:"action",action:"toggleOverwrite",context:"insert"},{keys:"H",type:"motion",motion:"moveToTopLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"M",type:"motion",motion:"moveToMiddleLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"L",type:"motion",motion:"moveToBottomLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"h",type:"motion",motion:"moveByCharacters",motionArgs:{forward:!1}},{keys:"l",type:"motion",motion:"moveByCharacters",motionArgs:{forward:!0}},{keys:"j",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,linewise:!0}},{keys:"k",type:"motion",motion:"moveByLines",motionArgs:{forward:!1,linewise:!0}},{keys:"gj",type:"motion",motion:"moveByDisplayLines",motionArgs:{forward:!0}},{keys:"gk",type:"motion",motion:"moveByDisplayLines",motionArgs:{forward:!1}},{keys:"w",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!1}},{keys:"W",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!1,bigWord:!0}},{keys:"e",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!0,inclusive:!0}},{keys:"E",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:"b",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1}},{keys:"B",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1,bigWord:!0}},{keys:"ge",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!0,inclusive:!0}},{keys:"gE",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:"{",type:"motion",motion:"moveByParagraph",motionArgs:{forward:!1,toJumplist:!0}},{keys:"}",type:"motion",motion:"moveByParagraph",motionArgs:{forward:!0,toJumplist:!0}},{keys:"(",type:"motion",motion:"moveBySentence",motionArgs:{forward:!1}},{keys:")",type:"motion",motion:"moveBySentence",motionArgs:{forward:!0}},{keys:"<C-f>",type:"motion",motion:"moveByPage",motionArgs:{forward:!0}},{keys:"<C-b>",type:"motion",motion:"moveByPage",motionArgs:{forward:!1}},{keys:"<C-d>",type:"motion",motion:"moveByScroll",motionArgs:{forward:!0,explicitRepeat:!0}},{keys:"<C-u>",type:"motion",motion:"moveByScroll",motionArgs:{forward:!1,explicitRepeat:!0}},{keys:"gg",type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!1,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:"G",type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!0,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:"0",type:"motion",motion:"moveToStartOfLine"},{keys:"^",type:"motion",motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"+",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,toFirstChar:!0}},{keys:"-",type:"motion",motion:"moveByLines",motionArgs:{forward:!1,toFirstChar:!0}},{keys:"_",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,toFirstChar:!0,repeatOffset:-1}},{keys:"$",type:"motion",motion:"moveToEol",motionArgs:{inclusive:!0}},{keys:"%",type:"motion",motion:"moveToMatchedSymbol",motionArgs:{inclusive:!0,toJumplist:!0}},{keys:"f<character>",type:"motion",motion:"moveToCharacter",motionArgs:{forward:!0,inclusive:!0}},{keys:"F<character>",type:"motion",motion:"moveToCharacter",motionArgs:{forward:!1}},{keys:"t<character>",type:"motion",motion:"moveTillCharacter",motionArgs:{forward:!0,inclusive:!0}},{keys:"T<character>",type:"motion",motion:"moveTillCharacter",motionArgs:{forward:!1}},{keys:";",type:"motion",motion:"repeatLastCharacterSearch",motionArgs:{forward:!0}},{keys:",",type:"motion",motion:"repeatLastCharacterSearch",motionArgs:{forward:!1}},{keys:"'<character>",type:"motion",motion:"goToMark",motionArgs:{toJumplist:!0,linewise:!0}},{keys:"`<character>",type:"motion",motion:"goToMark",motionArgs:{toJumplist:!0}},{keys:"]`",type:"motion",motion:"jumpToMark",motionArgs:{forward:!0}},{keys:"[`",type:"motion",motion:"jumpToMark",motionArgs:{forward:!1}},{keys:"]'",type:"motion",motion:"jumpToMark",motionArgs:{forward:!0,linewise:!0}},{keys:"['",type:"motion",motion:"jumpToMark",motionArgs:{forward:!1,linewise:!0}},{keys:"]p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!0,isEdit:!0,matchIndent:!0}},{keys:"[p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!1,isEdit:!0,matchIndent:!0}},{keys:"]<character>",type:"motion",motion:"moveToSymbol",motionArgs:{forward:!0,toJumplist:!0}},{keys:"[<character>",type:"motion",motion:"moveToSymbol",motionArgs:{forward:!1,toJumplist:!0}},{keys:"|",type:"motion",motion:"moveToColumn"},{keys:"o",type:"motion",motion:"moveToOtherHighlightedEnd",context:"visual"},{keys:"O",type:"motion",motion:"moveToOtherHighlightedEnd",motionArgs:{sameLine:!0},context:"visual"},{keys:"d",type:"operator",operator:"delete"},{keys:"y",type:"operator",operator:"yank"},{keys:"c",type:"operator",operator:"change"},{keys:">",type:"operator",operator:"indent",operatorArgs:{indentRight:!0}},{keys:"<",type:"operator",operator:"indent",operatorArgs:{indentRight:!1}},{keys:"g~",type:"operator",operator:"changeCase"},{keys:"gu",type:"operator",operator:"changeCase",operatorArgs:{toLower:!0},isEdit:!0},{keys:"gU",type:"operator",operator:"changeCase",operatorArgs:{toLower:!1},isEdit:!0},{keys:"n",type:"motion",motion:"findNext",motionArgs:{forward:!0,toJumplist:!0}},{keys:"N",type:"motion",motion:"findNext",motionArgs:{forward:!1,toJumplist:!0}},{keys:"x",type:"operatorMotion",operator:"delete",motion:"moveByCharacters",motionArgs:{forward:!0},operatorMotionArgs:{visualLine:!1}},{keys:"X",type:"operatorMotion",operator:"delete",motion:"moveByCharacters",motionArgs:{forward:!1},operatorMotionArgs:{visualLine:!0}},{keys:"D",type:"operatorMotion",operator:"delete",motion:"moveToEol",motionArgs:{inclusive:!0},context:"normal"},{keys:"D",type:"operator",operator:"delete",operatorArgs:{linewise:!0},context:"visual"},{keys:"Y",type:"operatorMotion",operator:"yank",motion:"expandToLine",motionArgs:{linewise:!0},context:"normal"},{keys:"Y",type:"operator",operator:"yank",operatorArgs:{linewise:!0},context:"visual"},{keys:"C",type:"operatorMotion",operator:"change",motion:"moveToEol",motionArgs:{inclusive:!0},context:"normal"},{keys:"C",type:"operator",operator:"change",operatorArgs:{linewise:!0},context:"visual"},{keys:"~",type:"operatorMotion",operator:"changeCase",motion:"moveByCharacters",motionArgs:{forward:!0},operatorArgs:{shouldMoveCursor:!0},context:"normal"},{keys:"~",type:"operator",operator:"changeCase",context:"visual"},{keys:"<C-w>",type:"operatorMotion",operator:"delete",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1},context:"insert"},{keys:"<C-i>",type:"action",action:"jumpListWalk",actionArgs:{forward:!0}},{keys:"<C-o>",type:"action",action:"jumpListWalk",actionArgs:{forward:!1}},{keys:"<C-e>",type:"action",action:"scroll",actionArgs:{forward:!0,linewise:!0}},{keys:"<C-y>",type:"action",action:"scroll",actionArgs:{forward:!1,linewise:!0}},{keys:"a",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"charAfter"},context:"normal"},{keys:"A",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"eol"},context:"normal"},{keys:"A",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"endOfSelectedArea"},context:"visual"},{keys:"i",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"inplace"},context:"normal"},{keys:"I",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"firstNonBlank"},context:"normal"},{keys:"I",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"startOfSelectedArea"},context:"visual"},{keys:"o",type:"action",action:"newLineAndEnterInsertMode",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!0},context:"normal"},{keys:"O",type:"action",action:"newLineAndEnterInsertMode",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!1},context:"normal"},{keys:"v",type:"action",action:"toggleVisualMode"},{keys:"V",type:"action",action:"toggleVisualMode",actionArgs:{linewise:!0}},{keys:"<C-v>",type:"action",action:"toggleVisualMode",actionArgs:{blockwise:!0}},{keys:"<C-q>",type:"action",action:"toggleVisualMode",actionArgs:{blockwise:!0}},{keys:"gv",type:"action",action:"reselectLastSelection"},{keys:"J",type:"action",action:"joinLines",isEdit:!0},{keys:"p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!0,isEdit:!0}},{keys:"P",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!1,isEdit:!0}},{keys:"r<character>",type:"action",action:"replace",isEdit:!0},{keys:"@<character>",type:"action",action:"replayMacro"},{keys:"q<character>",type:"action",action:"enterMacroRecordMode"},{keys:"R",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{replace:!0}},{keys:"u",type:"action",action:"undo",context:"normal"},{keys:"u",type:"operator",operator:"changeCase",operatorArgs:{toLower:!0},context:"visual",isEdit:!0},{keys:"U",type:"operator",operator:"changeCase",operatorArgs:{toLower:!1},context:"visual",isEdit:!0},{keys:"<C-r>",type:"action",action:"redo"},{keys:"m<character>",type:"action",action:"setMark"},{keys:'"<character>',type:"action",action:"setRegister"},{keys:"zz",type:"action",action:"scrollToCursor",actionArgs:{position:"center"}},{keys:"z.",type:"action",action:"scrollToCursor",actionArgs:{position:"center"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"zt",type:"action",action:"scrollToCursor",actionArgs:{position:"top"}},{keys:"z<CR>",type:"action",action:"scrollToCursor",actionArgs:{position:"top"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"z-",type:"action",action:"scrollToCursor",actionArgs:{position:"bottom"}},{keys:"zb",type:"action",action:"scrollToCursor",actionArgs:{position:"bottom"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:".",type:"action",action:"repeatLastEdit"},{keys:"<C-a>",type:"action",action:"incrementNumberToken",isEdit:!0,actionArgs:{increase:!0,backtrack:!1}},{keys:"<C-x>",type:"action",action:"incrementNumberToken",isEdit:!0,actionArgs:{increase:!1,backtrack:!1}},{keys:"<C-t>",type:"action",action:"indent",actionArgs:{indentRight:!0},context:"insert"},{keys:"<C-d>",type:"action",action:"indent",actionArgs:{indentRight:!1},context:"insert"},{keys:"a<character>",type:"motion",motion:"textObjectManipulation"},{keys:"i<character>",type:"motion",motion:"textObjectManipulation",motionArgs:{textObjectInner:!0}},{keys:"/",type:"search",searchArgs:{forward:!0,querySrc:"prompt",toJumplist:!0}},{keys:"?",type:"search",searchArgs:{forward:!1,querySrc:"prompt",toJumplist:!0}},{keys:"*",type:"search",searchArgs:{forward:!0,querySrc:"wordUnderCursor",wholeWordOnly:!0,toJumplist:!0}},{keys:"#",type:"search",searchArgs:{forward:!1,querySrc:"wordUnderCursor",wholeWordOnly:!0,toJumplist:!0}},{keys:"g*",type:"search",searchArgs:{forward:!0,querySrc:"wordUnderCursor",toJumplist:!0}},{keys:"g#",type:"search",searchArgs:{forward:!1,querySrc:"wordUnderCursor",toJumplist:!0}},{keys:":",type:"ex"}],r=[{name:"colorscheme",shortName:"colo"},{name:"map"},{name:"imap",shortName:"im"},{name:"nmap",shortName:"nm"},{name:"vmap",shortName:"vm"},{name:"unmap"},{name:"write",shortName:"w"},{name:"undo",shortName:"u"},{name:"redo",shortName:"red"},{name:"set",shortName:"se"},{name:"set",shortName:"se"},{name:"setlocal",shortName:"setl"},{name:"setglobal",shortName:"setg"},{name:"sort",shortName:"sor"},{name:"substitute",shortName:"s",possiblyAsync:!0},{name:"nohlsearch",shortName:"noh"},{name:"yank",shortName:"y"},{name:"delmarks",shortName:"delm"},{name:"registers",shortName:"reg",excludeFromCommandHistory:!0},{name:"global",shortName:"g"}],n=e.Pos;e.Vim=function(){function o(t,r){var n;this==e.keyMap.vim&&(e.rmClass(t.getWrapperElement(),"cm-fat-cursor"),"contenteditable"==t.getOption("inputStyle")&&null!=document.body.style.caretColor&&(function(e){var t=e.state.fatCursorMarks;if(t)for(var r=0;r<t.length;r++)t[r].clear();e.state.fatCursorMarks=null,e.off("cursorActivity",s)}(t),t.getInputField().style.caretColor="")),r&&r.attach==i||((n=t).setOption("disableInput",!1),n.off("cursorActivity",qe),e.off(n.getInputField(),"paste",h(n)),n.state.vim=null)}function i(t,r){var n,o;this==e.keyMap.vim&&(e.addClass(t.getWrapperElement(),"cm-fat-cursor"),"contenteditable"==t.getOption("inputStyle")&&null!=document.body.style.caretColor&&((n=t).state.fatCursorMarks=a(n),n.on("cursorActivity",s),t.getInputField().style.caretColor="transparent")),r&&r.attach==i||((o=t).setOption("disableInput",!0),o.setOption("showCursorWhenSelecting",!1),e.signal(o,"vim-mode-change",{mode:"normal"}),o.on("cursorActivity",qe),P(o),e.on(o.getInputField(),"paste",h(o)))}function a(e){for(var t=e.listSelections(),r=[],o=0;o<t.length;o++){var i=t[o];if(i.empty())if(i.anchor.ch<e.getLine(i.anchor.line).length)r.push(e.markText(i.anchor,n(i.anchor.line,i.anchor.ch+1),{className:"cm-fat-cursor-mark"}));else{var a=document.createElement("span");a.textContent=" ",a.className="cm-fat-cursor-mark",r.push(e.setBookmark(i.anchor,{widget:a}))}}return r}function s(e){var t=e.state.fatCursorMarks;if(t)for(var r=0;r<t.length;r++)t[r].clear();e.state.fatCursorMarks=a(e)}function l(t,r){if(r){if(this[t])return this[t];var n=function(e){if("'"==e.charAt(0))return e.charAt(1);var t=e.split(/-(?!$)/),r=t[t.length-1];if(1==t.length&&1==t[0].length)return!1;if(2==t.length&&"Shift"==t[0]&&1==r.length)return!1;for(var n=!1,o=0;o<t.length;o++){var i=t[o];i in c?t[o]=c[i]:n=!0,i in u&&(t[o]=u[i])}return!!n&&(x(r)&&(t[t.length-1]=r.toLowerCase()),"<"+t.join("-")+">")}(t);if(!n)return!1;var o=e.Vim.findKey(r,n);return"function"==typeof o&&e.signal(r,"vim-keypress",n),o}}e.defineOption("vimMode",!1,function(t,r,n){r&&"vim"!=t.getOption("keyMap")?t.setOption("keyMap","vim"):!r&&n!=e.Init&&/^vim/.test(t.getOption("keyMap"))&&t.setOption("keyMap","default")});var c={Shift:"S",Ctrl:"C",Alt:"A",Cmd:"D",Mod:"A"},u={Enter:"CR",Backspace:"BS",Delete:"Del",Insert:"Ins"};function h(e){var t=e.state.vim;return t.onPasteFn||(t.onPasteFn=function(){t.insertMode||(e.setCursor(G(e.getCursor(),0,1)),Q.enterInsertMode(e,{},t))}),t.onPasteFn}var p=/[\d]/,f=[e.isWordChar,function(t){return t&&!e.isWordChar(t)&&!/\s/.test(t)}],d=[function(e){return/\S/.test(e)}];function m(e,t){for(var r=[],n=e;n<e+t;n++)r.push(String.fromCharCode(n));return r}var g=m(65,26),v=m(97,26),y=m(48,10),k=[].concat(g,v,y,["<",">"]),C=[].concat(g,v,y,["-",'"',".",":","/"]);function w(e,t){return t>=e.firstLine()&&t<=e.lastLine()}function M(e){return/^[a-z]$/.test(e)}function x(e){return/^[A-Z]$/.test(e)}function S(e){return/^\s*$/.test(e)}function A(e){return-1!=".?!".indexOf(e)}function b(e,t){for(var r=0;r<t.length;r++)if(t[r]==e)return!0;return!1}var L={};function T(e,t,r,n,o){if(void 0===t&&!o)throw Error("defaultValue is required unless callback is provided");if(r||(r="string"),L[e]={type:r,defaultValue:t,callback:o},n)for(var i=0;i<n.length;i++)L[n[i]]=L[e];t&&R(e,t)}function R(e,t,r,n){var o=L[e],i=(n=n||{}).scope;if(!o)return new Error("Unknown option: "+e);if("boolean"==o.type){if(t&&!0!==t)return new Error("Invalid argument: "+e+"="+t);!1!==t&&(t=!0)}o.callback?("local"!==i&&o.callback(t,void 0),"global"!==i&&r&&o.callback(t,r)):("local"!==i&&(o.value="boolean"==o.type?!!t:t),"global"!==i&&r&&(r.state.vim.options[e]={value:t}))}function E(e,t,r){var n=L[e],o=(r=r||{}).scope;if(!n)return new Error("Unknown option: "+e);if(n.callback){var i=t&&n.callback(void 0,t);return"global"!==o&&void 0!==i?i:"local"!==o?n.callback():void 0}return((i="global"!==o&&t&&t.state.vim.options[e])||"local"!==o&&n||{}).value}T("filetype",void 0,"string",["ft"],function(e,t){if(void 0!==t){if(void 0===e)return"null"==(r=t.getOption("mode"))?"":r;var r=""==e?"null":e;t.setOption("mode",r)}});var O,B,I=function(){var e=100,t=-1,r=0,n=0,o=new Array(e);return{cachedCursor:void 0,add:function(i,a,s){var l=o[t%e];function c(r){var n=++t%e,a=o[n];a&&a.clear(),o[n]=i.setBookmark(r)}if(l){var u=l.find();u&&!te(u,a)&&c(a)}else c(a);c(s),r=t,(n=t-e+1)<0&&(n=0)},move:function(i,a){(t+=a)>r?t=r:t<n&&(t=n);var s=o[(e+t)%e];if(s&&!s.find()){var l,c=a>0?1:-1,u=i.getCursor();do{if((s=o[(e+(t+=c))%e])&&(l=s.find())&&!te(u,l))break}while(t<r&&t>n)}return s}}},K=function(e){return e?{changes:e.changes,expectCursorActivityForChange:e.expectCursorActivityForChange}:{changes:[],expectCursorActivityForChange:!1}};function N(){this.latestRegister=void 0,this.isPlaying=!1,this.isRecording=!1,this.replaySearchQueries=[],this.onRecordingDone=void 0,this.lastInsertModeChanges=K()}function P(e){return e.state.vim||(e.state.vim={inputState:new _,lastEditInputState:void 0,lastEditActionCommand:void 0,lastHPos:-1,lastHSPos:-1,lastMotion:null,marks:{},fakeCursor:null,insertMode:!1,insertModeRepeat:void 0,visualMode:!1,visualLine:!1,visualBlock:!1,lastSelection:null,lastPastedText:null,sel:{},options:{}}),e.state.vim}function j(){for(var e in O={searchQuery:null,searchIsReversed:!1,lastSubstituteReplacePart:void 0,jumpList:I(),macroModeState:new N,lastCharacterSearch:{increment:0,forward:!0,selectedCharacter:""},registerController:new V({}),searchHistoryController:new D,exCommandHistoryController:new D},L){var t=L[e];t.value=t.defaultValue}}N.prototype={exitMacroRecordMode:function(){var e=O.macroModeState;e.onRecordingDone&&e.onRecordingDone(),e.onRecordingDone=void 0,e.isRecording=!1},enterMacroRecordMode:function(e,t){var r=O.registerController.getRegister(t);r&&(r.clear(),this.latestRegister=t,e.openDialog&&(this.onRecordingDone=e.openDialog("(recording)["+t+"]",null,{bottom:!0})),this.isRecording=!0)}};var H={buildKeyMap:function(){},getRegisterController:function(){return O.registerController},resetVimGlobalState_:j,getVimGlobalState_:function(){return O},maybeInitVimState_:P,suppressErrorLogging:!1,InsertModeKey:ze,map:function(e,t,r){Ve.map(e,t,r)},unmap:function(e,t){Ve.unmap(e,t)},setOption:R,getOption:E,defineOption:T,defineEx:function(e,t,r){if(t){if(0!==e.indexOf(t))throw new Error('(Vim.defineEx) "'+t+'" is not a prefix of "'+e+'", command not registered')}else t=e;We[e]=r,Ve.commandMap_[t]={name:e,shortName:t,type:"api"}},handleKey:function(e,t,r){var n=this.findKey(e,t,r);if("function"==typeof n)return n()},findKey:function(r,n,o){var i,a=P(r);function s(){var e=O.macroModeState;if(e.isRecording){if("q"==n)return e.exitMacroRecordMode(),F(r),!0;"mapping"!=o&&function(e,t){if(!e.isPlaying){var r=e.latestRegister,n=O.registerController.getRegister(r);n&&n.pushText(t)}}(e,n)}}function l(){if("<Esc>"==n)return F(r),a.visualMode?fe(r):a.insertMode&&De(r),!0}return!1===(i=a.insertMode?function(){if(l())return!0;for(var e=a.inputState.keyBuffer=a.inputState.keyBuffer+n,o=1==n.length,i=U.matchCommand(e,t,a.inputState,"insert");e.length>1&&"full"!=i.type;){e=a.inputState.keyBuffer=e.slice(1);var s=U.matchCommand(e,t,a.inputState,"insert");"none"!=s.type&&(i=s)}if("none"==i.type)return F(r),!1;if("partial"==i.type)return B&&window.clearTimeout(B),B=window.setTimeout(function(){a.insertMode&&a.inputState.keyBuffer&&F(r)},E("insertModeEscKeysTimeout")),!o;if(B&&window.clearTimeout(B),o){for(var c=r.listSelections(),u=0;u<c.length;u++){var h=c[u].head;r.replaceRange("",G(h,0,-(e.length-1)),h,"+input")}O.macroModeState.lastInsertModeChanges.changes.pop()}return F(r),i.command}():function(){if(s()||l())return!0;var e=a.inputState.keyBuffer=a.inputState.keyBuffer+n;if(/^[1-9]\d*$/.test(e))return!0;if(!(o=/^(\d*)(.*)$/.exec(e)))return F(r),!1;var o,i=a.visualMode?"visual":"normal",c=U.matchCommand(o[2]||o[1],t,a.inputState,i);return"none"==c.type?(F(r),!1):"partial"==c.type||(a.inputState.keyBuffer="",(o=/^(\d*)(.*)$/.exec(e))[1]&&"0"!=o[1]&&a.inputState.pushRepeatDigit(o[1]),c.command)}())?a.insertMode||1!==n.length?void 0:function(){return!0}:!0===i?function(){return!0}:function(){return r.operation(function(){r.curOp.isVimOp=!0;try{"keyToKey"==i.type?function(t){for(var o;t;)o=/<\w+-.+?>|<\w+>|./.exec(t),n=o[0],t=t.substring(o.index+n.length),e.Vim.handleKey(r,n,"mapping")}(i.toKeys):U.processCommand(r,a,i)}catch(t){throw r.state.vim=void 0,P(r),e.Vim.suppressErrorLogging||console.log(t),t}return!0})}},handleEx:function(e,t){Ve.processCommand(e,t)},defineMotion:function(e,t){J[e]=t},defineAction:function(e,t){Q[e]=t},defineOperator:function(e,t){q[e]=t},mapCommand:function(e,t,r,n,o){var i={keys:e,type:t};for(var a in i[t]=r,i[t+"Args"]=n,o)i[a]=o[a];Ue(i)},_mapCommand:Ue,defineRegister:function(e,t){var r=O.registerController.registers;if(!e||1!=e.length)throw Error("Register name must be 1 character");if(r[e])throw Error("Register already defined "+e);r[e]=t,C.push(e)},exitVisualMode:fe,exitInsertMode:De};function _(){this.prefixRepeat=[],this.motionRepeat=[],this.operator=null,this.operatorArgs=null,this.motion=null,this.motionArgs=null,this.keyBuffer=[],this.registerName=null}function F(t,r){t.state.vim.inputState=new _,e.signal(t,"vim-command-done",r)}function W(e,t,r){this.clear(),this.keyBuffer=[e||""],this.insertModeChanges=[],this.searchQueries=[],this.linewise=!!t,this.blockwise=!!r}function V(e){this.registers=e,this.unnamedRegister=e['"']=new W,e["."]=new W,e[":"]=new W,e["/"]=new W}function D(){this.historyBuffer=[],this.iterator=0,this.initialPrefix=null}_.prototype.pushRepeatDigit=function(e){this.operator?this.motionRepeat=this.motionRepeat.concat(e):this.prefixRepeat=this.prefixRepeat.concat(e)},_.prototype.getRepeat=function(){var e=0;return(this.prefixRepeat.length>0||this.motionRepeat.length>0)&&(e=1,this.prefixRepeat.length>0&&(e*=parseInt(this.prefixRepeat.join(""),10)),this.motionRepeat.length>0&&(e*=parseInt(this.motionRepeat.join(""),10))),e},W.prototype={setText:function(e,t,r){this.keyBuffer=[e||""],this.linewise=!!t,this.blockwise=!!r},pushText:function(e,t){t&&(this.linewise||this.keyBuffer.push("\n"),this.linewise=!0),this.keyBuffer.push(e)},pushInsertModeChanges:function(e){this.insertModeChanges.push(K(e))},pushSearchQuery:function(e){this.searchQueries.push(e)},clear:function(){this.keyBuffer=[],this.insertModeChanges=[],this.searchQueries=[],this.linewise=!1},toString:function(){return this.keyBuffer.join("")}},V.prototype={pushText:function(e,t,r,n,o){n&&"\n"!==r.charAt(r.length-1)&&(r+="\n");var i=this.isValidRegister(e)?this.getRegister(e):null;if(i)x(e)?i.pushText(r,n):i.setText(r,n,o),this.unnamedRegister.setText(i.toString(),n);else{switch(t){case"yank":this.registers[0]=new W(r,n,o);break;case"delete":case"change":-1==r.indexOf("\n")?this.registers["-"]=new W(r,n):(this.shiftNumericRegisters_(),this.registers[1]=new W(r,n))}this.unnamedRegister.setText(r,n,o)}},getRegister:function(e){return this.isValidRegister(e)?(e=e.toLowerCase(),this.registers[e]||(this.registers[e]=new W),this.registers[e]):this.unnamedRegister},isValidRegister:function(e){return e&&b(e,C)},shiftNumericRegisters_:function(){for(var e=9;e>=2;e--)this.registers[e]=this.getRegister(""+(e-1))}},D.prototype={nextMatch:function(e,t){var r=this.historyBuffer,n=t?-1:1;null===this.initialPrefix&&(this.initialPrefix=e);for(var o=this.iterator+n;t?o>=0:o<r.length;o+=n)for(var i=r[o],a=0;a<=i.length;a++)if(this.initialPrefix==i.substring(0,a))return this.iterator=o,i;return o>=r.length?(this.iterator=r.length,this.initialPrefix):o<0?e:void 0},pushInput:function(e){var t=this.historyBuffer.indexOf(e);t>-1&&this.historyBuffer.splice(t,1),e.length&&this.historyBuffer.push(e)},reset:function(){this.initialPrefix=null,this.iterator=this.historyBuffer.length}};var U={matchCommand:function(e,t,r,n){var o,i=function(e,t,r,n){for(var o,i=[],a=[],s=0;s<t.length;s++){var l=t[s];"insert"==r&&"insert"!=l.context||l.context&&l.context!=r||n.operator&&"action"==l.type||!(o=X(e,l.keys))||("partial"==o&&i.push(l),"full"==o&&a.push(l))}return{partial:i.length&&i,full:a.length&&a}}(e,t,n,r);if(!i.full&&!i.partial)return{type:"none"};if(!i.full&&i.partial)return{type:"partial"};for(var a=0;a<i.full.length;a++){var s=i.full[a];o||(o=s)}if("<character>"==o.keys.slice(-11)){var l=function(e){var t=/^.*(<[^>]+>)$/.exec(e),r=t?t[1]:e.slice(-1);if(r.length>1)switch(r){case"<CR>":r="\n";break;case"<Space>":r=" ";break;default:r=""}return r}(e);if(!l)return{type:"none"};r.selectedCharacter=l}return{type:"full",command:o}},processCommand:function(e,t,r){switch(t.inputState.repeatOverride=r.repeatOverride,r.type){case"motion":this.processMotion(e,t,r);break;case"operator":this.processOperator(e,t,r);break;case"operatorMotion":this.processOperatorMotion(e,t,r);break;case"action":this.processAction(e,t,r);break;case"search":this.processSearch(e,t,r);break;case"ex":case"keyToEx":this.processEx(e,t,r)}},processMotion:function(e,t,r){t.inputState.motion=r.motion,t.inputState.motionArgs=Z(r.motionArgs),this.evalInput(e,t)},processOperator:function(e,t,r){var n=t.inputState;if(n.operator){if(n.operator==r.operator)return n.motion="expandToLine",n.motionArgs={linewise:!0},void this.evalInput(e,t);F(e)}n.operator=r.operator,n.operatorArgs=Z(r.operatorArgs),t.visualMode&&this.evalInput(e,t)},processOperatorMotion:function(e,t,r){var n=t.visualMode,o=Z(r.operatorMotionArgs);o&&n&&o.visualLine&&(t.visualLine=!0),this.processOperator(e,t,r),n||this.processMotion(e,t,r)},processAction:function(e,t,r){var n=t.inputState,o=n.getRepeat(),i=!!o,a=Z(r.actionArgs)||{};n.selectedCharacter&&(a.selectedCharacter=n.selectedCharacter),r.operator&&this.processOperator(e,t,r),r.motion&&this.processMotion(e,t,r),(r.motion||r.operator)&&this.evalInput(e,t),a.repeat=o||1,a.repeatIsExplicit=i,a.registerName=n.registerName,F(e),t.lastMotion=null,r.isEdit&&this.recordLastEdit(t,n,r),Q[r.action](e,a,t)},processSearch:function(t,r,n){if(t.getSearchCursor){var o=n.searchArgs.forward,i=n.searchArgs.wholeWordOnly;Ae(t).setReversed(!o);var a=o?"/":"?",s=Ae(t).getQuery(),l=t.getScrollInfo();switch(n.searchArgs.querySrc){case"prompt":var c=O.macroModeState;c.isPlaying?f(p=c.replaySearchQueries.shift(),!0,!1):Ie(t,{onClose:function(e){t.scrollTo(l.left,l.top),f(e,!0,!0);var r=O.macroModeState;r.isRecording&&function(e,t){if(!e.isPlaying){var r=e.latestRegister,n=O.registerController.getRegister(r);n&&n.pushSearchQuery&&n.pushSearchQuery(t)}}(r,e)},prefix:a,desc:Be,onKeyUp:function(r,n,i){var a,s,c,u=e.keyName(r);"Up"==u||"Down"==u?(a="Up"==u,s=r.target?r.target.selectionEnd:0,i(n=O.searchHistoryController.nextMatch(n,a)||""),s&&r.target&&(r.target.selectionEnd=r.target.selectionStart=Math.min(s,r.target.value.length))):"Left"!=u&&"Right"!=u&&"Ctrl"!=u&&"Alt"!=u&&"Shift"!=u&&O.searchHistoryController.reset();try{c=Ke(t,n,!0,!0)}catch(r){}c?t.scrollIntoView(Pe(t,!o,c),30):(je(t),t.scrollTo(l.left,l.top))},onKeyDown:function(r,n,o){var i=e.keyName(r);"Esc"==i||"Ctrl-C"==i||"Ctrl-["==i||"Backspace"==i&&""==n?(O.searchHistoryController.pushInput(n),O.searchHistoryController.reset(),Ke(t,s),je(t),t.scrollTo(l.left,l.top),e.e_stop(r),F(t),o(),t.focus()):"Up"==i||"Down"==i?e.e_stop(r):"Ctrl-U"==i&&(e.e_stop(r),o(""))}});break;case"wordUnderCursor":var u=me(t,!1,0,!1,!0),h=!0;if(u||(u=me(t,!1,0,!1,!1),h=!1),!u)return;var p=t.getLine(u.start.line).substring(u.start.ch,u.end.ch);p=h&&i?"\\b"+p+"\\b":p.replace(/([.?*+$\[\]\/\\(){}|\-])/g,"\\$1"),O.jumpList.cachedCursor=t.getCursor(),t.setCursor(u.start),f(p,!0,!1)}}function f(e,o,i){O.searchHistoryController.pushInput(e),O.searchHistoryController.reset();try{Ke(t,e,o,i)}catch(r){return Oe(t,"Invalid regex: "+e),void F(t)}U.processMotion(t,r,{type:"motion",motion:"findNext",motionArgs:{forward:!0,toJumplist:n.searchArgs.toJumplist}})}},processEx:function(t,r,n){function o(e){O.exCommandHistoryController.pushInput(e),O.exCommandHistoryController.reset(),Ve.processCommand(t,e)}function i(r,n,o){var i,a,s=e.keyName(r);("Esc"==s||"Ctrl-C"==s||"Ctrl-["==s||"Backspace"==s&&""==n)&&(O.exCommandHistoryController.pushInput(n),O.exCommandHistoryController.reset(),e.e_stop(r),F(t),o(),t.focus()),"Up"==s||"Down"==s?(e.e_stop(r),i="Up"==s,a=r.target?r.target.selectionEnd:0,o(n=O.exCommandHistoryController.nextMatch(n,i)||""),a&&r.target&&(r.target.selectionEnd=r.target.selectionStart=Math.min(a,r.target.value.length))):"Ctrl-U"==s?(e.e_stop(r),o("")):"Left"!=s&&"Right"!=s&&"Ctrl"!=s&&"Alt"!=s&&"Shift"!=s&&O.exCommandHistoryController.reset()}"keyToEx"==n.type?Ve.processCommand(t,n.exArgs.input):r.visualMode?Ie(t,{onClose:o,prefix:":",value:"'<,'>",onKeyDown:i,selectValueOnOpen:!1}):Ie(t,{onClose:o,prefix:":",onKeyDown:i})},evalInput:function(e,t){var r,o,i,a,s=t.inputState,l=s.motion,c=s.motionArgs||{},u=s.operator,h=s.operatorArgs||{},p=s.registerName,f=t.sel,d=ee(t.visualMode?z(e,f.head):e.getCursor("head")),m=ee(t.visualMode?z(e,f.anchor):e.getCursor("anchor")),g=ee(d),v=ee(m);if(u&&this.recordLastEdit(t,s),(i=void 0!==s.repeatOverride?s.repeatOverride:s.getRepeat())>0&&c.explicitRepeat?c.repeatIsExplicit=!0:(c.noRepeat||!c.explicitRepeat&&0===i)&&(i=1,c.repeatIsExplicit=!1),s.selectedCharacter&&(c.selectedCharacter=h.selectedCharacter=s.selectedCharacter),c.repeat=i,F(e),l){var y=J[l](e,d,c,t);if(t.lastMotion=J[l],!y)return;if(c.toJumplist){var k=O.jumpList,C=k.cachedCursor;C?(ge(e,C,y),delete k.cachedCursor):ge(e,d,y)}y instanceof Array?(o=y[0],r=y[1]):r=y,r||(r=ee(d)),t.visualMode?(t.visualBlock&&r.ch===1/0||(r=z(e,r,t.visualBlock)),o&&(o=z(e,o,!0)),o=o||v,f.anchor=o,f.head=r,he(e),Me(e,t,"<",re(o,r)?o:r),Me(e,t,">",re(o,r)?r:o)):u||(r=z(e,r),e.setCursor(r.line,r.ch))}if(u){if(h.lastSel){o=v;var w=h.lastSel,M=Math.abs(w.head.line-w.anchor.line),x=Math.abs(w.head.ch-w.anchor.ch);r=w.visualLine?n(v.line+M,v.ch):w.visualBlock?n(v.line+M,v.ch+x):w.head.line==w.anchor.line?n(v.line,v.ch+x):n(v.line+M,v.ch),t.visualMode=!0,t.visualLine=w.visualLine,t.visualBlock=w.visualBlock,f=t.sel={anchor:o,head:r},he(e)}else t.visualMode&&(h.lastSel={anchor:ee(f.anchor),head:ee(f.head),visualBlock:t.visualBlock,visualLine:t.visualLine});var A,b,L,T,R;if(t.visualMode){if(A=ne(f.head,f.anchor),b=oe(f.head,f.anchor),L=t.visualLine||h.linewise,R=pe(e,{anchor:A,head:b},T=t.visualBlock?"block":L?"line":"char"),L){var E=R.ranges;if("block"==T)for(var B=0;B<E.length;B++)E[B].head.ch=ae(e,E[B].head.line);else"line"==T&&(E[0].head=n(E[0].head.line+1,0))}}else{if(A=ee(o||v),re(b=ee(r||g),A)){var I=A;A=b,b=I}(L=c.linewise||h.linewise)?(a=b,A.ch=0,a.ch=0,a.line++):c.forward&&function(e,t,r){var n=e.getRange(t,r);if(/\n\s*$/.test(n)){var o=n.split("\n");o.pop();for(var i=o.pop();o.length>0&&i&&S(i);i=o.pop())r.line--,r.ch=0;i?(r.line--,r.ch=ae(e,r.line)):r.ch=0}}(e,A,b),R=pe(e,{anchor:A,head:b},T="char",!c.inclusive||L)}e.setSelections(R.ranges,R.primary),t.lastMotion=null,h.repeat=i,h.registerName=p,h.linewise=L;var K=q[u](e,h,R.ranges,v,r);t.visualMode&&fe(e,null!=K),K&&e.setCursor(K)}},recordLastEdit:function(e,t,r){var n=O.macroModeState;n.isPlaying||(e.lastEditInputState=t,e.lastEditActionCommand=r,n.lastInsertModeChanges.changes=[],n.lastInsertModeChanges.expectCursorActivityForChange=!1)}},J={moveToTopLine:function(e,t,r){var o=He(e).top+r.repeat-1;return n(o,de(e.getLine(o)))},moveToMiddleLine:function(e){var t=He(e),r=Math.floor(.5*(t.top+t.bottom));return n(r,de(e.getLine(r)))},moveToBottomLine:function(e,t,r){var o=He(e).bottom-r.repeat+1;return n(o,de(e.getLine(o)))},expandToLine:function(e,t,r){return n(t.line+r.repeat-1,1/0)},findNext:function(e,t,r){var n=Ae(e),o=n.getQuery();if(o){var i=!r.forward;return i=n.isReversed()?!i:i,Ne(e,o),Pe(e,i,o,r.repeat)}},goToMark:function(e,t,r,n){var o=_e(e,n,r.selectedCharacter);return o?r.linewise?{line:o.line,ch:de(e.getLine(o.line))}:o:null},moveToOtherHighlightedEnd:function(e,t,r,o){if(o.visualBlock&&r.sameLine){var i=o.sel;return[z(e,n(i.anchor.line,i.head.ch)),z(e,n(i.head.line,i.anchor.ch))]}return[o.sel.head,o.sel.anchor]},jumpToMark:function(e,t,r,o){for(var i=t,a=0;a<r.repeat;a++){var s=i;for(var l in o.marks)if(M(l)){var c=o.marks[l].find();if(!((r.forward?re(c,s):re(s,c))||r.linewise&&c.line==s.line)){var u=te(s,i),h=r.forward?ie(s,c,i):ie(i,c,s);(u||h)&&(i=c)}}}return r.linewise&&(i=n(i.line,de(e.getLine(i.line)))),i},moveByCharacters:function(e,t,r){var o=t,i=r.repeat,a=r.forward?o.ch+i:o.ch-i;return n(o.line,a)},moveByLines:function(e,t,r,o){var i=t,a=i.ch;switch(o.lastMotion){case this.moveByLines:case this.moveByDisplayLines:case this.moveByScroll:case this.moveToColumn:case this.moveToEol:a=o.lastHPos;break;default:o.lastHPos=a}var s=r.repeat+(r.repeatOffset||0),l=r.forward?i.line+s:i.line-s,c=e.firstLine(),u=e.lastLine();return l<c&&i.line==c?this.moveToStartOfLine(e,t,r,o):l>u&&i.line==u?this.moveToEol(e,t,r,o):(r.toFirstChar&&(a=de(e.getLine(l)),o.lastHPos=a),o.lastHSPos=e.charCoords(n(l,a),"div").left,n(l,a))},moveByDisplayLines:function(e,t,r,o){var i=t;switch(o.lastMotion){case this.moveByDisplayLines:case this.moveByScroll:case this.moveByLines:case this.moveToColumn:case this.moveToEol:break;default:o.lastHSPos=e.charCoords(i,"div").left}var a=r.repeat;if((l=e.findPosV(i,r.forward?a:-a,"line",o.lastHSPos)).hitSide)if(r.forward)var s={top:e.charCoords(l,"div").top+8,left:o.lastHSPos},l=e.coordsChar(s,"div");else{var c=e.charCoords(n(e.firstLine(),0),"div");c.left=o.lastHSPos,l=e.coordsChar(c,"div")}return o.lastHPos=l.ch,l},moveByPage:function(e,t,r){var n=t,o=r.repeat;return e.findPosV(n,r.forward?o:-o,"page")},moveByParagraph:function(e,t,r){var n=r.forward?1:-1;return xe(e,t,r.repeat,n)},moveBySentence:function(e,t,r){var o=r.forward?1:-1;return function(e,t,r,o){function i(e,t){if(t.pos+t.dir<0||t.pos+t.dir>=t.line.length){if(t.ln+=t.dir,!w(e,t.ln))return t.line=null,t.ln=null,void(t.pos=null);t.line=e.getLine(t.ln),t.pos=t.dir>0?0:t.line.length-1}else t.pos+=t.dir}function a(e,t,r,n){var o=e.getLine(t),a=""===o,s={line:o,ln:t,pos:r,dir:n},l={ln:s.ln,pos:s.pos},c=""===s.line;for(i(e,s);null!==s.line;){if(l.ln=s.ln,l.pos=s.pos,""===s.line&&!c)return{ln:s.ln,pos:s.pos};if(a&&""!==s.line&&!S(s.line[s.pos]))return{ln:s.ln,pos:s.pos};!A(s.line[s.pos])||a||s.pos!==s.line.length-1&&!S(s.line[s.pos+1])||(a=!0),i(e,s)}var o=e.getLine(l.ln);l.pos=0;for(var u=o.length-1;u>=0;--u)if(!S(o[u])){l.pos=u;break}return l}function s(e,t,r,n){var o=e.getLine(t),a={line:o,ln:t,pos:r,dir:n},s={ln:a.ln,pos:null},l=""===a.line;for(i(e,a);null!==a.line;){if(""===a.line&&!l)return null!==s.pos?s:{ln:a.ln,pos:a.pos};if(A(a.line[a.pos])&&null!==s.pos&&(a.ln!==s.ln||a.pos+1!==s.pos))return s;""===a.line||S(a.line[a.pos])||(l=!1,s={ln:a.ln,pos:a.pos}),i(e,a)}var o=e.getLine(s.ln);s.pos=0;for(var c=0;c<o.length;++c)if(!S(o[c])){s.pos=c;break}return s}for(var l={ln:t.line,pos:t.ch};r>0;)l=o<0?s(e,l.ln,l.pos,o):a(e,l.ln,l.pos,o),r--;return n(l.ln,l.pos)}(e,t,r.repeat,o)},moveByScroll:function(e,t,r,n){var o=e.getScrollInfo(),i=null,a=r.repeat;a||(a=o.clientHeight/(2*e.defaultTextHeight()));var s=e.charCoords(t,"local");if(r.repeat=a,!(i=J.moveByDisplayLines(e,t,r,n)))return null;var l=e.charCoords(i,"local");return e.scrollTo(null,o.top+l.top-s.top),i},moveByWords:function(e,t,r){return function(e,t,r,o,i,a){var s=ee(t),l=[];(o&&!i||!o&&i)&&r++;for(var c=!(o&&i),u=0;u<r;u++){var h=Ce(e,t,o,a,c);if(!h){var p=ae(e,e.lastLine());l.push(o?{line:e.lastLine(),from:p,to:p}:{line:0,from:0,to:0});break}l.push(h),t=n(h.line,o?h.to-1:h.from)}var f=l.length!=r,d=l[0],m=l.pop();return o&&!i?(f||d.from==s.ch&&d.line==s.line||(m=l.pop()),n(m.line,m.from)):o&&i?n(m.line,m.to-1):!o&&i?(f||d.to==s.ch&&d.line==s.line||(m=l.pop()),n(m.line,m.to)):n(m.line,m.from)}(e,t,r.repeat,!!r.forward,!!r.wordEnd,!!r.bigWord)},moveTillCharacter:function(e,t,r){var n=we(e,r.repeat,r.forward,r.selectedCharacter),o=r.forward?-1:1;return ve(o,r),n?(n.ch+=o,n):null},moveToCharacter:function(e,t,r){var n=r.repeat;return ve(0,r),we(e,n,r.forward,r.selectedCharacter)||t},moveToSymbol:function(e,t,r){return function(e,t,r,o){var i=ee(e.getCursor()),a=r?1:-1,s=r?e.lineCount():-1,l=i.ch,c=i.line,u=e.getLine(c),h={lineText:u,nextCh:u.charAt(l),lastCh:null,index:l,symb:o,reverseSymb:(r?{")":"(","}":"{"}:{"(":")","{":"}"})[o],forward:r,depth:0,curMoveThrough:!1},p=ye[o];if(!p)return i;var f=ke[p].init,d=ke[p].isComplete;for(f&&f(h);c!==s&&t;){if(h.index+=a,h.nextCh=h.lineText.charAt(h.index),!h.nextCh){if(c+=a,h.lineText=e.getLine(c)||"",a>0)h.index=0;else{var m=h.lineText.length;h.index=m>0?m-1:0}h.nextCh=h.lineText.charAt(h.index)}d(h)&&(i.line=c,i.ch=h.index,t--)}return h.nextCh||h.curMoveThrough?n(c,h.index):i}(e,r.repeat,r.forward,r.selectedCharacter)||t},moveToColumn:function(e,t,r,o){var i,a,s,l=r.repeat;return o.lastHPos=l-1,o.lastHSPos=e.charCoords(t,"div").left,a=l,s=(i=e).getCursor().line,z(i,n(s,a-1))},moveToEol:function(e,t,r,o){var i=t;o.lastHPos=1/0;var a=n(i.line+r.repeat-1,1/0),s=e.clipPos(a);return s.ch--,o.lastHSPos=e.charCoords(s,"div").left,a},moveToFirstNonWhiteSpaceCharacter:function(e,t){var r=t;return n(r.line,de(e.getLine(r.line)))},moveToMatchedSymbol:function(e,t){for(var r,o=t,i=o.line,a=o.ch,s=e.getLine(i);a<s.length;a++)if((r=s.charAt(a))&&-1!="()[]{}".indexOf(r)){var l=e.getTokenTypeAt(n(i,a+1));if("string"!==l&&"comment"!==l)break}return a<s.length?e.findMatchingBracket(n(i,a)).to:o},moveToStartOfLine:function(e,t){return n(t.line,0)},moveToLineOrEdgeOfDocument:function(e,t,r){var o=r.forward?e.lastLine():e.firstLine();return r.repeatIsExplicit&&(o=r.repeat-e.getOption("firstLineNumber")),n(o,de(e.getLine(o)))},textObjectManipulation:function(e,t,r,o){var i=r.selectedCharacter;"b"==i?i="(":"B"==i&&(i="{");var a,s,l,c,u,h,p,f,d=!r.textObjectInner;if({"(":")",")":"(","{":"}","}":"{","[":"]","]":"["}[i])a=function(e,t,r,o){var i,a,s=t,l={"(":/[()]/,")":/[()]/,"[":/[[\]]/,"]":/[[\]]/,"{":/[{}]/,"}":/[{}]/}[r],c={"(":"(",")":"(","[":"[","]":"[","{":"{","}":"{"}[r],u=e.getLine(s.line).charAt(s.ch)===c?1:0;if(i=e.scanForBracket(n(s.line,s.ch+u),-1,void 0,{bracketRegex:l}),a=e.scanForBracket(n(s.line,s.ch+u),1,void 0,{bracketRegex:l}),!i||!a)return{start:s,end:s};if(i=i.pos,a=a.pos,i.line==a.line&&i.ch>a.ch||i.line>a.line){var h=i;i=a,a=h}return o?a.ch+=1:i.ch+=1,{start:i,end:a}}(e,t,i,d);else if({"'":!0,'"':!0}[i])a=function(e,t,r,o){var i,a,s,l,c=ee(t),u=e.getLine(c.line).split(""),h=u.indexOf(r);if(c.ch<h?c.ch=h:h<c.ch&&u[c.ch]==r&&(a=c.ch,--c.ch),u[c.ch]!=r||a)for(s=c.ch;s>-1&&!i;s--)u[s]==r&&(i=s+1);else i=c.ch+1;if(i&&!a)for(s=i,l=u.length;s<l&&!a;s++)u[s]==r&&(a=s);return i&&a?(o&&(--i,++a),{start:n(c.line,i),end:n(c.line,a)}):{start:c,end:c}}(e,t,i,d);else if("W"===i)a=me(e,d,0,!0);else if("w"===i)a=me(e,d,0,!1);else{if("p"!==i)return null;if(a=xe(e,t,r.repeat,0,d),r.linewise=!0,o.visualMode)o.visualLine||(o.visualLine=!0);else{var m=o.inputState.operatorArgs;m&&(m.linewise=!0),a.end.line--}}return e.state.vim.visualMode?(s=e,l=a.start,c=a.end,h=s.state.vim.sel,p=h.head,f=h.anchor,re(c,l)&&(u=c,c=l,l=u),re(p,f)?(p=ne(l,p),f=oe(f,c)):(f=ne(l,f),-1==(p=G(p=oe(p,c),0,-1)).ch&&p.line!=s.firstLine()&&(p=n(p.line-1,ae(s,p.line-1)))),[f,p]):[a.start,a.end]},repeatLastCharacterSearch:function(e,t,r){var n=O.lastCharacterSearch,o=r.repeat,i=r.forward===n.forward,a=(n.increment?1:0)*(i?-1:1);e.moveH(-a,"char"),r.inclusive=!!i;var s=we(e,o,i,n.selectedCharacter);return s?(s.ch+=a,s):(e.moveH(a,"char"),t)}};function $(e,t){for(var r=[],n=0;n<t;n++)r.push(e);return r}var q={change:function(t,r,o){var i,a,s=t.state.vim;if(O.macroModeState.lastInsertModeChanges.inVisualBlock=s.visualBlock,s.visualMode){a=t.getSelection();var l=$("",o.length);t.replaceSelections(l),i=ne(o[0].head,o[0].anchor)}else{var c=o[0].anchor,u=o[0].head;a=t.getRange(c,u);var h=s.lastEditInputState||{};if("moveByWords"==h.motion&&!S(a)){var p=/\s+$/.exec(a);p&&h.motionArgs&&h.motionArgs.forward&&(u=G(u,0,-p[0].length),a=a.slice(0,-p[0].length))}var f=new n(c.line-1,Number.MAX_VALUE),d=t.firstLine()==t.lastLine();u.line>t.lastLine()&&r.linewise&&!d?t.replaceRange("",f,u):t.replaceRange("",c,u),r.linewise&&(d||(t.setCursor(f),e.commands.newlineAndIndent(t)),c.ch=Number.MAX_VALUE),i=c}O.registerController.pushText(r.registerName,"change",a,r.linewise,o.length>1),Q.enterInsertMode(t,{head:i},t.state.vim)},delete:function(e,t,r){var o,i,a=e.state.vim;if(a.visualBlock){i=e.getSelection();var s=$("",r.length);e.replaceSelections(s),o=r[0].anchor}else{var l=r[0].anchor,c=r[0].head;t.linewise&&c.line!=e.firstLine()&&l.line==e.lastLine()&&l.line==c.line-1&&(l.line==e.firstLine()?l.ch=0:l=n(l.line-1,ae(e,l.line-1))),i=e.getRange(l,c),e.replaceRange("",l,c),o=l,t.linewise&&(o=J.moveToFirstNonWhiteSpaceCharacter(e,l))}return O.registerController.pushText(t.registerName,"delete",i,t.linewise,a.visualBlock),z(e,o,a.insertMode)},indent:function(e,t,r){var n=e.state.vim,o=r[0].anchor.line,i=n.visualBlock?r[r.length-1].anchor.line:r[0].head.line,a=n.visualMode?t.repeat:1;t.linewise&&i--;for(var s=o;s<=i;s++)for(var l=0;l<a;l++)e.indentLine(s,t.indentRight);return J.moveToFirstNonWhiteSpaceCharacter(e,r[0].anchor)},changeCase:function(e,t,r,n,o){for(var i=e.getSelections(),a=[],s=t.toLower,l=0;l<i.length;l++){var c=i[l],u="";if(!0===s)u=c.toLowerCase();else if(!1===s)u=c.toUpperCase();else for(var h=0;h<c.length;h++){var p=c.charAt(h);u+=x(p)?p.toLowerCase():p.toUpperCase()}a.push(u)}return e.replaceSelections(a),t.shouldMoveCursor?o:!e.state.vim.visualMode&&t.linewise&&r[0].anchor.line+1==r[0].head.line?J.moveToFirstNonWhiteSpaceCharacter(e,n):t.linewise?n:ne(r[0].anchor,r[0].head)},yank:function(e,t,r,n){var o=e.state.vim,i=e.getSelection(),a=o.visualMode?ne(o.sel.anchor,o.sel.head,r[0].head,r[0].anchor):n;return O.registerController.pushText(t.registerName,"yank",i,t.linewise,o.visualBlock),a}};var Q={jumpListWalk:function(e,t,r){if(!r.visualMode){var n=t.repeat,o=t.forward,i=O.jumpList.move(e,o?n:-n),a=i?i.find():void 0;a=a||e.getCursor(),e.setCursor(a)}},scroll:function(e,t,r){if(!r.visualMode){var n=t.repeat||1,o=e.defaultTextHeight(),i=e.getScrollInfo().top,a=o*n,s=t.forward?i+a:i-a,l=ee(e.getCursor()),c=e.charCoords(l,"local");if(t.forward)s>c.top?(l.line+=(s-c.top)/o,l.line=Math.ceil(l.line),e.setCursor(l),c=e.charCoords(l,"local"),e.scrollTo(null,c.top)):e.scrollTo(null,s);else{var u=s+e.getScrollInfo().clientHeight;u<c.bottom?(l.line-=(c.bottom-u)/o,l.line=Math.floor(l.line),e.setCursor(l),c=e.charCoords(l,"local"),e.scrollTo(null,c.bottom-e.getScrollInfo().clientHeight)):e.scrollTo(null,s)}}},scrollToCursor:function(e,t){var r=e.getCursor().line,o=e.charCoords(n(r,0),"local"),i=e.getScrollInfo().clientHeight,a=o.top,s=o.bottom-a;switch(t.position){case"center":a=a-i/2+s;break;case"bottom":a=a-i+s}e.scrollTo(null,a)},replayMacro:function(e,t,r){var n=t.selectedCharacter,o=t.repeat,i=O.macroModeState;for("@"==n&&(n=i.latestRegister);o--;)Je(e,r,i,n)},enterMacroRecordMode:function(e,t){var r=O.macroModeState,n=t.selectedCharacter;O.registerController.isValidRegister(n)&&r.enterMacroRecordMode(e,n)},toggleOverwrite:function(t){t.state.overwrite?(t.toggleOverwrite(!1),t.setOption("keyMap","vim-insert"),e.signal(t,"vim-mode-change",{mode:"insert"})):(t.toggleOverwrite(!0),t.setOption("keyMap","vim-replace"),e.signal(t,"vim-mode-change",{mode:"replace"}))},enterInsertMode:function(t,r,o){if(!t.getOption("readOnly")){o.insertMode=!0,o.insertModeRepeat=r&&r.repeat||1;var i=r?r.insertAt:null,a=o.sel,s=r.head||t.getCursor("head"),l=t.listSelections().length;if("eol"==i)s=n(s.line,ae(t,s.line));else if("charAfter"==i)s=G(s,0,1);else if("firstNonBlank"==i)s=J.moveToFirstNonWhiteSpaceCharacter(t,s);else if("startOfSelectedArea"==i)o.visualBlock?(s=n(Math.min(a.head.line,a.anchor.line),Math.min(a.head.ch,a.anchor.ch)),l=Math.abs(a.head.line-a.anchor.line)+1):s=a.head.line<a.anchor.line?a.head:n(a.anchor.line,0);else if("endOfSelectedArea"==i)o.visualBlock?(s=n(Math.min(a.head.line,a.anchor.line),Math.max(a.head.ch+1,a.anchor.ch)),l=Math.abs(a.head.line-a.anchor.line)+1):s=a.head.line>=a.anchor.line?G(a.head,0,1):n(a.anchor.line,0);else if("inplace"==i&&o.visualMode)return;t.setOption("disableInput",!1),r&&r.replace?(t.toggleOverwrite(!0),t.setOption("keyMap","vim-replace"),e.signal(t,"vim-mode-change",{mode:"replace"})):(t.toggleOverwrite(!1),t.setOption("keyMap","vim-insert"),e.signal(t,"vim-mode-change",{mode:"insert"})),O.macroModeState.isPlaying||(t.on("change",$e),e.on(t.getInputField(),"keydown",Ze)),o.visualMode&&fe(t),ce(t,s,l)}},toggleVisualMode:function(t,r,o){var i,a=r.repeat,s=t.getCursor();o.visualMode?o.visualLine^r.linewise||o.visualBlock^r.blockwise?(o.visualLine=!!r.linewise,o.visualBlock=!!r.blockwise,e.signal(t,"vim-mode-change",{mode:"visual",subMode:o.visualLine?"linewise":o.visualBlock?"blockwise":""}),he(t)):fe(t):(o.visualMode=!0,o.visualLine=!!r.linewise,o.visualBlock=!!r.blockwise,i=z(t,n(s.line,s.ch+a-1),!0),o.sel={anchor:s,head:i},e.signal(t,"vim-mode-change",{mode:"visual",subMode:o.visualLine?"linewise":o.visualBlock?"blockwise":""}),he(t),Me(t,o,"<",ne(s,i)),Me(t,o,">",oe(s,i)))},reselectLastSelection:function(t,r,n){var o=n.lastSelection;if(n.visualMode&&ue(t,n),o){var i=o.anchorMark.find(),a=o.headMark.find();if(!i||!a)return;n.sel={anchor:i,head:a},n.visualMode=!0,n.visualLine=o.visualLine,n.visualBlock=o.visualBlock,he(t),Me(t,n,"<",ne(i,a)),Me(t,n,">",oe(i,a)),e.signal(t,"vim-mode-change",{mode:"visual",subMode:n.visualLine?"linewise":n.visualBlock?"blockwise":""})}},joinLines:function(e,t,r){var o,i;if(r.visualMode){if(o=e.getCursor("anchor"),re(i=e.getCursor("head"),o)){var a=i;i=o,o=a}i.ch=ae(e,i.line)-1}else{var s=Math.max(t.repeat,2);o=e.getCursor(),i=z(e,n(o.line+s-1,1/0))}for(var l=0,c=o.line;c<i.line;c++){l=ae(e,o.line),a=n(o.line+1,ae(e,o.line+1));var u=e.getRange(o,a);u=u.replace(/\n\s*/g," "),e.replaceRange(u,o,a)}var h=n(o.line,l);r.visualMode&&fe(e,!1),e.setCursor(h)},newLineAndEnterInsertMode:function(t,r,o){o.insertMode=!0;var i=ee(t.getCursor());i.line!==t.firstLine()||r.after?(i.line=r.after?i.line:i.line-1,i.ch=ae(t,i.line),t.setCursor(i),(e.commands.newlineAndIndentContinueComment||e.commands.newlineAndIndent)(t)):(t.replaceRange("\n",n(t.firstLine(),0)),t.setCursor(t.firstLine(),0)),this.enterInsertMode(t,{repeat:r.repeat},o)},paste:function(e,t,r){var o,i,a,s,l,c=ee(e.getCursor()),u=O.registerController.getRegister(t.registerName);if(y=u.toString()){if(t.matchIndent){var h=e.getOption("tabSize"),p=function(e){var t=e.split("\t").length-1,r=e.split(" ").length-1;return t*h+1*r},f=e.getLine(e.getCursor().line),d=p(f.match(/^\s*/)[0]),m=y.replace(/\n$/,""),g=y!==m,v=p(y.match(/^\s*/)[0]),y=m.replace(/^\s*/gm,function(t){var r=d+(p(t)-v);if(r<0)return"";if(e.getOption("indentWithTabs")){var n=Math.floor(r/h);return Array(n+1).join("\t")}return Array(r+1).join(" ")});y+=g?"\n":""}t.repeat>1&&(y=Array(t.repeat+1).join(y));var k,C,w,M,x,S,A,b,L,T,R=u.linewise,E=u.blockwise;if(R)r.visualMode?y=r.visualLine?y.slice(0,-1):"\n"+y.slice(0,y.length-1)+"\n":t.after?(y="\n"+y.slice(0,y.length-1),c.ch=ae(e,c.line)):c.ch=0;else{if(E){y=y.split("\n");for(var B=0;B<y.length;B++)y[B]=""==y[B]?" ":y[B]}c.ch+=t.after?1:0}if(r.visualMode){var I;r.lastPastedText=y;var K=(w=e,x=(M=r).lastSelection,M.visualMode?(S=w.listSelections(),A=S[0],b=S[S.length-1],L=re(A.anchor,A.head)?A.anchor:A.head,T=re(b.anchor,b.head)?b.head:b.anchor,[L,T]):function(){var e=w.getCursor(),t=w.getCursor(),r=x.visualBlock;if(r){var o=r.width,i=r.height;t=n(e.line+i,e.ch+o);for(var a=[],s=e.line;s<t.line;s++){var l=n(s,e.ch),c=n(s,t.ch),u={anchor:l,head:c};a.push(u)}w.setSelections(a)}else{var h=x.anchorMark.find(),p=x.headMark.find(),f=p.line-h.line,d=p.ch-h.ch;t={line:t.line+f,ch:f?t.ch:d+t.ch},x.visualLine&&(e=n(e.line,0),t=n(t.line,ae(w,t.line))),w.setSelection(e,t)}return[e,t]}()),N=K[0],P=K[1],j=e.getSelection(),H=e.listSelections(),_=new Array(H.length).join("1").split("1");r.lastSelection&&(I=r.lastSelection.headMark.find()),O.registerController.unnamedRegister.setText(j),E?(e.replaceSelections(_),P=n(N.line+y.length-1,N.ch),e.setCursor(N),le(e,P),e.replaceSelections(y),k=N):r.visualBlock?(e.replaceSelections(_),e.setCursor(N),e.replaceRange(y,N,N),k=N):(e.replaceRange(y,N,P),k=e.posFromIndex(e.indexFromPos(N)+y.length-1)),I&&(r.lastSelection.headMark=e.setBookmark(I)),R&&(k.ch=0)}else if(E){for(e.setCursor(c),B=0;B<y.length;B++){var F=c.line+B;F>e.lastLine()&&e.replaceRange("\n",n(F,0)),ae(e,F)<c.ch&&(o=e,i=F,a=c.ch,void 0,void 0,s=ae(o,i),l=new Array(a-s+1).join(" "),o.setCursor(n(i,s)),o.replaceRange(l,o.getCursor()))}e.setCursor(c),le(e,n(c.line+y.length-1,c.ch)),e.replaceSelections(y),k=c}else e.replaceRange(y,c),R&&t.after?k=n(c.line+1,de(e.getLine(c.line+1))):R&&!t.after?k=n(c.line,de(e.getLine(c.line))):!R&&t.after?(C=e.indexFromPos(c),k=e.posFromIndex(C+y.length-1)):(C=e.indexFromPos(c),k=e.posFromIndex(C+y.length));r.visualMode&&fe(e,!1),e.setCursor(k)}},undo:function(t,r){t.operation(function(){Y(t,e.commands.undo,r.repeat)(),t.setCursor(t.getCursor("anchor"))})},redo:function(t,r){Y(t,e.commands.redo,r.repeat)()},setRegister:function(e,t,r){r.inputState.registerName=t.selectedCharacter},setMark:function(e,t,r){Me(e,r,t.selectedCharacter,e.getCursor())},replace:function(t,r,o){var i,a,s=r.selectedCharacter,l=t.getCursor(),c=t.listSelections();if(o.visualMode)l=t.getCursor("start"),a=t.getCursor("end");else{var u=t.getLine(l.line);(i=l.ch+r.repeat)>u.length&&(i=u.length),a=n(l.line,i)}if("\n"==s)o.visualMode||t.replaceRange("",l,a),(e.commands.newlineAndIndentContinueComment||e.commands.newlineAndIndent)(t);else{var h=t.getRange(l,a);if(h=h.replace(/[^\n]/g,s),o.visualBlock){var p=new Array(t.getOption("tabSize")+1).join(" ");h=(h=t.getSelection()).replace(/\t/g,p).replace(/[^\n]/g,s).split("\n"),t.replaceSelections(h)}else t.replaceRange(h,l,a);o.visualMode?(l=re(c[0].anchor,c[0].head)?c[0].anchor:c[0].head,t.setCursor(l),fe(t,!1)):t.setCursor(G(a,0,-1))}},incrementNumberToken:function(e,t){for(var r,o,i,a,s=e.getCursor(),l=e.getLine(s.line),c=/(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi;null!==(r=c.exec(l))&&(i=(o=r.index)+r[0].length,!(s.ch<i)););if((t.backtrack||!(i<=s.ch))&&r){var u=r[2]||r[4],h=r[3]||r[5],p=t.increase?1:-1,f={"0b":2,0:8,"":10,"0x":16}[u.toLowerCase()];a=(parseInt(r[1]+h,f)+p*t.repeat).toString(f);var d=u?new Array(h.length-a.length+1+r[1].length).join("0"):"";a="-"===a.charAt(0)?"-"+u+d+a.substr(1):u+d+a;var m=n(s.line,o),g=n(s.line,i);e.replaceRange(a,m,g),e.setCursor(n(s.line,o+a.length-1))}},repeatLastEdit:function(e,t,r){if(r.lastEditInputState){var n=t.repeat;n&&t.repeatIsExplicit?r.lastEditInputState.repeatOverride=n:n=r.lastEditInputState.repeatOverride||n,Ge(e,r,n,!1)}},indent:function(e,t){e.indentLine(e.getCursor().line,t.indentRight)},exitInsertMode:De};function z(e,t,r){var o=Math.min(Math.max(e.firstLine(),t.line),e.lastLine()),i=ae(e,o)-1;i=r?i+1:i;var a=Math.min(Math.max(0,t.ch),i);return n(o,a)}function Z(e){var t={};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t}function G(e,t,r){return"object"==typeof t&&(r=t.ch,t=t.line),n(e.line+t,e.ch+r)}function X(e,t){if("<character>"==t.slice(-11)){var r=t.length-11,n=e.slice(0,r),o=t.slice(0,r);return n==o&&e.length>r?"full":0==o.indexOf(n)&&"partial"}return e==t?"full":0==t.indexOf(e)&&"partial"}function Y(e,t,r){return function(){for(var n=0;n<r;n++)t(e)}}function ee(e){return n(e.line,e.ch)}function te(e,t){return e.ch==t.ch&&e.line==t.line}function re(e,t){return e.line<t.line||e.line==t.line&&e.ch<t.ch}function ne(e,t){return arguments.length>2&&(t=ne.apply(void 0,Array.prototype.slice.call(arguments,1))),re(e,t)?e:t}function oe(e,t){return arguments.length>2&&(t=oe.apply(void 0,Array.prototype.slice.call(arguments,1))),re(e,t)?t:e}function ie(e,t,r){var n=re(e,t),o=re(t,r);return n&&o}function ae(e,t){return e.getLine(t).length}function se(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function le(e,t){var r=[],o=e.listSelections(),i=ee(e.clipPos(t)),a=!te(t,i),s=function(e,t,r){for(var n=0;n<e.length;n++){var o="head"!=r&&te(e[n].anchor,t),i="anchor"!=r&&te(e[n].head,t);if(o||i)return n}return-1}(o,e.getCursor("head")),l=te(o[s].head,o[s].anchor),c=o.length-1,u=c-s>s?c:0,h=o[u].anchor,p=Math.min(h.line,i.line),f=Math.max(h.line,i.line),d=h.ch,m=i.ch,g=o[u].head.ch-d,v=m-d;g>0&&v<=0?(d++,a||m--):g<0&&v>=0?(d--,l||m++):g<0&&-1==v&&(d--,m++);for(var y=p;y<=f;y++){var k={anchor:new n(y,d),head:new n(y,m)};r.push(k)}return e.setSelections(r),t.ch=m,h.ch=d,h}function ce(e,t,r){for(var n=[],o=0;o<r;o++){var i=G(t,o,0);n.push({anchor:i,head:i})}e.setSelections(n,0)}function ue(e,t){var r=t.sel.anchor,n=t.sel.head;t.lastPastedText&&(n=e.posFromIndex(e.indexFromPos(r)+t.lastPastedText.length),t.lastPastedText=null),t.lastSelection={anchorMark:e.setBookmark(r),headMark:e.setBookmark(n),anchor:ee(r),head:ee(n),visualMode:t.visualMode,visualLine:t.visualLine,visualBlock:t.visualBlock}}function he(e,t,r){var n=e.state.vim,o=pe(e,t=t||n.sel,r=r||n.visualLine?"line":n.visualBlock?"block":"char");e.setSelections(o.ranges,o.primary),Qe(e)}function pe(e,t,r,o){var i=ee(t.head),a=ee(t.anchor);if("char"==r){var s=o||re(t.head,t.anchor)?0:1,l=re(t.head,t.anchor)?1:0;return i=G(t.head,0,s),{ranges:[{anchor:a=G(t.anchor,0,l),head:i}],primary:0}}if("line"==r){if(re(t.head,t.anchor))i.ch=0,a.ch=ae(e,a.line);else{a.ch=0;var c=e.lastLine();i.line>c&&(i.line=c),i.ch=ae(e,i.line)}return{ranges:[{anchor:a,head:i}],primary:0}}if("block"==r){for(var u=Math.min(a.line,i.line),h=Math.min(a.ch,i.ch),p=Math.max(a.line,i.line),f=Math.max(a.ch,i.ch)+1,d=p-u+1,m=i.line==u?0:d-1,g=[],v=0;v<d;v++)g.push({anchor:n(u+v,h),head:n(u+v,f)});return{ranges:g,primary:m}}}function fe(t,r){var n=t.state.vim;!1!==r&&t.setCursor(z(t,n.sel.head)),ue(t,n),n.visualMode=!1,n.visualLine=!1,n.visualBlock=!1,e.signal(t,"vim-mode-change",{mode:"normal"}),n.fakeCursor&&n.fakeCursor.clear()}function de(e){if(!e)return 0;var t=e.search(/\S/);return-1==t?e.length:t}function me(e,t,r,o,i){for(var a,s,l=(s=(a=e).getCursor("head"),1==a.getSelection().length&&(s=ne(s,a.getCursor("anchor"))),s),c=e.getLine(l.line),u=l.ch,h=i?f[0]:d[0];!h(c.charAt(u));)if(++u>=c.length)return null;o?h=d[0]:(h=f[0])(c.charAt(u))||(h=f[1]);for(var p=u,m=u;h(c.charAt(p))&&p<c.length;)p++;for(;h(c.charAt(m))&&m>=0;)m--;if(m++,t){for(var g=p;/\s/.test(c.charAt(p))&&p<c.length;)p++;if(g==p){for(var v=m;/\s/.test(c.charAt(m-1))&&m>0;)m--;m||(m=v)}}return{start:n(l.line,m),end:n(l.line,p)}}function ge(e,t,r){te(t,r)||O.jumpList.add(e,t,r)}function ve(e,t){O.lastCharacterSearch.increment=e,O.lastCharacterSearch.forward=t.forward,O.lastCharacterSearch.selectedCharacter=t.selectedCharacter}var ye={"(":"bracket",")":"bracket","{":"bracket","}":"bracket","[":"section","]":"section","*":"comment","/":"comment",m:"method",M:"method","#":"preprocess"},ke={bracket:{isComplete:function(e){if(e.nextCh===e.symb){if(e.depth++,e.depth>=1)return!0}else e.nextCh===e.reverseSymb&&e.depth--;return!1}},section:{init:function(e){e.curMoveThrough=!0,e.symb=(e.forward?"]":"[")===e.symb?"{":"}"},isComplete:function(e){return 0===e.index&&e.nextCh===e.symb}},comment:{isComplete:function(e){var t="*"===e.lastCh&&"/"===e.nextCh;return e.lastCh=e.nextCh,t}},method:{init:function(e){e.symb="m"===e.symb?"{":"}",e.reverseSymb="{"===e.symb?"}":"{"},isComplete:function(e){return e.nextCh===e.symb}},preprocess:{init:function(e){e.index=0},isComplete:function(e){if("#"===e.nextCh){var t=e.lineText.match(/#(\w+)/)[1];if("endif"===t){if(e.forward&&0===e.depth)return!0;e.depth++}else if("if"===t){if(!e.forward&&0===e.depth)return!0;e.depth--}if("else"===t&&0===e.depth)return!0}return!1}}};function Ce(e,t,r,n,o){var i=t.line,a=t.ch,s=e.getLine(i),l=r?1:-1,c=n?d:f;if(o&&""==s){if(i+=l,s=e.getLine(i),!w(e,i))return null;a=r?0:s.length}for(;;){if(o&&""==s)return{from:0,to:0,line:i};for(var u=l>0?s.length:-1,h=u,p=u;a!=u;){for(var m=!1,g=0;g<c.length&&!m;++g)if(c[g](s.charAt(a))){for(h=a;a!=u&&c[g](s.charAt(a));)a+=l;if(m=h!=(p=a),h==t.ch&&i==t.line&&p==h+l)continue;return{from:Math.min(h,p+1),to:Math.max(h,p),line:i}}m||(a+=l)}if(!w(e,i+=l))return null;s=e.getLine(i),a=l>0?0:s.length}}function we(e,t,r,o){for(var i,a=e.getCursor(),s=a.ch,l=0;l<t;l++){if(-1==(c=s,u=e.getLine(a.line),h=o,p=!0,f=void 0,r?-1==(f=u.indexOf(h,c+1))||p||(f-=1):-1==(f=u.lastIndexOf(h,c-1))||p||(f+=1),i=f))return null;s=i}var c,u,h,p,f;return n(e.getCursor().line,i)}function Me(e,t,r,n){b(r,k)&&(t.marks[r]&&t.marks[r].clear(),t.marks[r]=e.setBookmark(n))}function xe(e,t,r,o,i){var a,s=t.line,l=e.firstLine(),c=e.lastLine(),u=s;function h(t){return!e.getLine(t)}function p(e,t,r){return r?h(e)!=h(e+t):!h(e)&&h(e+t)}if(o){for(;l<=u&&u<=c&&r>0;)p(u,o)&&r--,u+=o;return new n(u,0)}var f=e.state.vim;if(f.visualLine&&p(s,1,!0)){var d=f.sel.anchor;p(d.line,-1,!0)&&(i&&d.line==s||(s+=1))}var m=h(s);for(u=s;u<=c&&r;u++)p(u,1,!0)&&(i&&h(u)==m||r--);for(a=new n(u,0),u>c&&!m?m=!0:i=!1,u=s;u>l&&(i&&h(u)!=m&&u!=s||!p(u,-1,!0));u--);return{start:new n(u,0),end:a}}function Se(){}function Ae(e){var t=e.state.vim;return t.searchState_||(t.searchState_=new Se)}function be(e,t){var r=Le(e,t)||[];if(!r.length)return[];var n=[];if(0===r[0]){for(var o=0;o<r.length;o++)"number"==typeof r[o]&&n.push(e.substring(r[o]+1,r[o+1]));return n}}function Le(e,t){t||(t="/");for(var r=!1,n=[],o=0;o<e.length;o++){var i=e.charAt(o);r||i!=t||n.push(o),r=!r&&"\\"==i}return n}T("pcre",!0,"boolean"),Se.prototype={getQuery:function(){return O.query},setQuery:function(e){O.query=e},getOverlay:function(){return this.searchOverlay},setOverlay:function(e){this.searchOverlay=e},isReversed:function(){return O.isReversed},setReversed:function(e){O.isReversed=e},getScrollbarAnnotate:function(){return this.annotate},setScrollbarAnnotate:function(e){this.annotate=e}};var Te={"\\n":"\n","\\r":"\r","\\t":"\t"};var Re={"\\/":"/","\\\\":"\\","\\n":"\n","\\r":"\r","\\t":"\t"};function Ee(e,t,r){if(O.registerController.getRegister("/").setText(e),e instanceof RegExp)return e;var n,o,i=Le(e,"/");return i.length?(n=e.substring(0,i[0]),o=-1!=e.substring(i[0]).indexOf("i")):n=e,n?(E("pcre")||(n=function(e){for(var t=!1,r=[],n=-1;n<e.length;n++){var o=e.charAt(n)||"",i=e.charAt(n+1)||"",a=i&&-1!="|(){".indexOf(i);t?("\\"===o&&a||r.push(o),t=!1):"\\"===o?(t=!0,i&&-1!="}".indexOf(i)&&(a=!0),a&&"\\"!==i||r.push(o)):(r.push(o),a&&"\\"!==i&&r.push("\\"))}return r.join("")}(n)),r&&(t=/^[^A-Z]*$/.test(n)),new RegExp(n,t||o?"i":void 0)):null}function Oe(e,t){e.openNotification?e.openNotification('<span style="color: red">'+t+"</span>",{bottom:!0,duration:5e3}):alert(t)}var Be="(Javascript regexp)";function Ie(e,t){var r,n,o,i,a,s,l,c,u=(t.prefix||"")+" "+(t.desc||""),h=(r=t.prefix,n=t.desc,o='<span style="font-family: monospace; white-space: pre">'+(r||"")+'<input type="text"></span>',n&&(o+=' <span style="color: #888">'+n+"</span>"),o);i=e,a=h,s=u,l=t.onClose,c=t,i.openDialog?i.openDialog(a,l,{bottom:!0,value:c.value,onKeyDown:c.onKeyDown,onKeyUp:c.onKeyUp,selectValueOnOpen:!1}):l(prompt(s,""))}function Ke(e,t,r,n){if(t){var o=Ae(e),i=Ee(t,!!r,!!n);if(i)return Ne(e,i),function(e,t){if(e instanceof RegExp&&t instanceof RegExp){for(var r=["global","multiline","ignoreCase","source"],n=0;n<r.length;n++){var o=r[n];if(e[o]!==t[o])return!1}return!0}return!1}(i,o.getQuery())?i:(o.setQuery(i),i)}}function Ne(e,t){var r=Ae(e),n=r.getOverlay();n&&t==n.query||(n&&e.removeOverlay(n),n=function(e){if("^"==e.source.charAt(0))var t=!0;return{token:function(r){if(!t||r.sol()){var n=r.match(e,!1);if(n)return 0==n[0].length?(r.next(),"searching"):r.sol()||(r.backUp(1),e.exec(r.next()+n[0]))?(r.match(e),"searching"):(r.next(),null);for(;!r.eol()&&(r.next(),!r.match(e,!1)););}else r.skipToEnd()},query:e}}(t),e.addOverlay(n),e.showMatchesOnScrollbar&&(r.getScrollbarAnnotate()&&r.getScrollbarAnnotate().clear(),r.setScrollbarAnnotate(e.showMatchesOnScrollbar(t))),r.setOverlay(n))}function Pe(e,t,r,o){return void 0===o&&(o=1),e.operation(function(){for(var i=e.getCursor(),a=e.getSearchCursor(r,i),s=0;s<o;s++){var l=a.find(t);if(0==s&&l&&te(a.from(),i)&&(l=a.find(t)),!l&&!(a=e.getSearchCursor(r,t?n(e.lastLine()):n(e.firstLine(),0))).find(t))return}return a.from()})}function je(e){var t=Ae(e);e.removeOverlay(Ae(e).getOverlay()),t.setOverlay(null),t.getScrollbarAnnotate()&&(t.getScrollbarAnnotate().clear(),t.setScrollbarAnnotate(null))}function He(e){var t=e.getScrollInfo(),r=e.coordsChar({left:0,top:6+t.top},"local"),n=t.clientHeight-10+t.top,o=e.coordsChar({left:0,top:n},"local");return{top:r.line,bottom:o.line}}function _e(e,t,r){if("'"==r){var n=e.doc.history.done,o=n[n.length-2];return o&&o.ranges&&o.ranges[0].head}if("."==r){if(0==e.doc.history.lastModTime)return;var i=e.doc.history.done.filter(function(e){if(void 0!==e.changes)return e});return i.reverse(),i[0].changes[0].to}var a=t.marks[r];return a&&a.find()}var Fe=function(){this.buildCommandMap_()};Fe.prototype={processCommand:function(e,t,r){var n=this;e.operation(function(){e.curOp.isVimOp=!0,n._processCommand(e,t,r)})},_processCommand:function(t,r,n){var o=t.state.vim,i=O.registerController.getRegister(":"),a=i.toString();o.visualMode&&fe(t);var s=new e.StringStream(r);i.setText(r);var l,c,u=n||{};u.input=r;try{this.parseInput_(t,s,u)}catch(e){throw Oe(t,e),e}if(u.commandName){if(l=this.matchCommand_(u.commandName)){if(c=l.name,l.excludeFromCommandHistory&&i.setText(a),this.parseCommandArgs_(s,u,l),"exToKey"==l.type){for(var h=0;h<l.toKeys.length;h++)e.Vim.handleKey(t,l.toKeys[h],"mapping");return}if("exToEx"==l.type)return void this.processCommand(t,l.toInput)}}else void 0!==u.line&&(c="move");if(c)try{We[c](t,u),l&&l.possiblyAsync||!u.callback||u.callback()}catch(e){throw Oe(t,e),e}else Oe(t,'Not an editor command ":'+r+'"')},parseInput_:function(e,t,r){t.eatWhile(":"),t.eat("%")?(r.line=e.firstLine(),r.lineEnd=e.lastLine()):(r.line=this.parseLineSpec_(e,t),void 0!==r.line&&t.eat(",")&&(r.lineEnd=this.parseLineSpec_(e,t)));var n=t.match(/^(\w+)/);return r.commandName=n?n[1]:t.match(/.*/)[0],r},parseLineSpec_:function(e,t){var r=t.match(/^(\d+)/);if(r)return parseInt(r[1],10)-1;switch(t.next()){case".":return this.parseLineSpecOffset_(t,e.getCursor().line);case"$":return this.parseLineSpecOffset_(t,e.lastLine());case"'":var n=t.next(),o=_e(e,e.state.vim,n);if(!o)throw new Error("Mark not set");return this.parseLineSpecOffset_(t,o.line);case"-":case"+":return t.backUp(1),this.parseLineSpecOffset_(t,e.getCursor().line);default:return void t.backUp(1)}},parseLineSpecOffset_:function(e,t){var r=e.match(/^([+-])?(\d+)/);if(r){var n=parseInt(r[2],10);"-"==r[1]?t-=n:t+=n}return t},parseCommandArgs_:function(e,t,r){if(!e.eol()){t.argString=e.match(/.*/)[0];var n=r.argDelimiter||/\s+/,o=se(t.argString).split(n);o.length&&o[0]&&(t.args=o)}},matchCommand_:function(e){for(var t=e.length;t>0;t--){var r=e.substring(0,t);if(this.commandMap_[r]){var n=this.commandMap_[r];if(0===n.name.indexOf(e))return n}}return null},buildCommandMap_:function(){this.commandMap_={};for(var e=0;e<r.length;e++){var t=r[e],n=t.shortName||t.name;this.commandMap_[n]=t}},map:function(e,r,n){if(":"!=e&&":"==e.charAt(0)){if(n)throw Error("Mode not supported for ex mappings");var o=e.substring(1);":"!=r&&":"==r.charAt(0)?this.commandMap_[o]={name:o,type:"exToEx",toInput:r.substring(1),user:!0}:this.commandMap_[o]={name:o,type:"exToKey",toKeys:r,user:!0}}else if(":"!=r&&":"==r.charAt(0)){var i={keys:e,type:"keyToEx",exArgs:{input:r.substring(1)}};n&&(i.context=n),t.unshift(i)}else i={keys:e,type:"keyToKey",toKeys:r},n&&(i.context=n),t.unshift(i)},unmap:function(e,r){if(":"!=e&&":"==e.charAt(0)){if(r)throw Error("Mode not supported for ex mappings");var n=e.substring(1);if(this.commandMap_[n]&&this.commandMap_[n].user)return void delete this.commandMap_[n]}else for(var o=e,i=0;i<t.length;i++)if(o==t[i].keys&&t[i].context===r)return void t.splice(i,1);throw Error("No such mapping.")}};var We={colorscheme:function(e,t){!t.args||t.args.length<1?Oe(e,e.getOption("theme")):e.setOption("theme",t.args[0])},map:function(e,t,r){var n=t.args;!n||n.length<2?e&&Oe(e,"Invalid mapping: "+t.input):Ve.map(n[0],n[1],r)},imap:function(e,t){this.map(e,t,"insert")},nmap:function(e,t){this.map(e,t,"normal")},vmap:function(e,t){this.map(e,t,"visual")},unmap:function(e,t,r){var n=t.args;!n||n.length<1?e&&Oe(e,"No such mapping: "+t.input):Ve.unmap(n[0],r)},move:function(e,t){U.processCommand(e,e.state.vim,{type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!1,explicitRepeat:!0,linewise:!0},repeatOverride:t.line+1})},set:function(e,t){var r=t.args,n=t.setCfg||{};if(!r||r.length<1)e&&Oe(e,"Invalid mapping: "+t.input);else{var o=r[0].split("="),i=o[0],a=o[1],s=!1;if("?"==i.charAt(i.length-1)){if(a)throw Error("Trailing characters: "+t.argString);i=i.substring(0,i.length-1),s=!0}void 0===a&&"no"==i.substring(0,2)&&(i=i.substring(2),a=!1);var l=L[i]&&"boolean"==L[i].type;if(l&&null==a&&(a=!0),!l&&void 0===a||s){var c=E(i,e,n);c instanceof Error?Oe(e,c.message):Oe(e,!0===c||!1===c?" "+(c?"":"no")+i:" "+i+"="+c)}else{var u=R(i,a,e,n);u instanceof Error&&Oe(e,u.message)}}},setlocal:function(e,t){t.setCfg={scope:"local"},this.set(e,t)},setglobal:function(e,t){t.setCfg={scope:"global"},this.set(e,t)},registers:function(e,t){var r=t.args,n=O.registerController.registers,o="----------Registers----------<br><br>";if(r){r=r.join("");for(var i=0;i<r.length;i++)a=r.charAt(i),O.registerController.isValidRegister(a)&&(o+='"'+a+" "+(n[a]||new W).toString()+"<br>")}else for(var a in n){var s=n[a].toString();s.length&&(o+='"'+a+" "+s+"<br>")}Oe(e,o)},sort:function(t,r){var o,i,a,s,l,c=function(){if(r.argString){var t=new e.StringStream(r.argString);if(t.eat("!")&&(o=!0),t.eol())return;if(!t.eatSpace())return"Invalid arguments";var n=t.match(/([dinuox]+)?\s*(\/.+\/)?\s*/);if(!n&&!t.eol())return"Invalid arguments";if(n[1]){i=-1!=n[1].indexOf("i"),a=-1!=n[1].indexOf("u");var c=-1!=n[1].indexOf("d")||-1!=n[1].indexOf("n")&&1,u=-1!=n[1].indexOf("x")&&1,h=-1!=n[1].indexOf("o")&&1;if(c+u+h>1)return"Invalid arguments";s=(c?"decimal":u&&"hex")||h&&"octal"}n[2]&&(l=new RegExp(n[2].substr(1,n[2].length-2),i?"i":""))}}();if(c)Oe(t,c+": "+r.argString);else{var u=r.line||t.firstLine(),h=r.lineEnd||r.line||t.lastLine();if(u!=h){var p=n(u,0),f=n(h,ae(t,h)),d=t.getRange(p,f).split("\n"),m=l||("decimal"==s?/(-?)([\d]+)/:"hex"==s?/(-?)(?:0x)?([0-9a-f]+)/i:"octal"==s?/([0-7]+)/:null),g="decimal"==s?10:"hex"==s?16:"octal"==s?8:null,v=[],y=[];if(s||l)for(var k=0;k<d.length;k++){var C=l?d[k].match(l):null;C&&""!=C[0]?v.push(C):!l&&m.exec(d[k])?v.push(d[k]):y.push(d[k])}else y=d;if(v.sort(l?function(e,t){var r;return o&&(r=e,e=t,t=r),i&&(e[0]=e[0].toLowerCase(),t[0]=t[0].toLowerCase()),e[0]<t[0]?-1:1}:x),l)for(k=0;k<v.length;k++)v[k]=v[k].input;else s||y.sort(x);if(d=o?v.concat(y):y.concat(v),a){var w,M=d;for(d=[],k=0;k<M.length;k++)M[k]!=w&&d.push(M[k]),w=M[k]}t.replaceRange(d.join("\n"),p,f)}}function x(e,t){var r;o&&(r=e,e=t,t=r),i&&(e=e.toLowerCase(),t=t.toLowerCase());var n=s&&m.exec(e),a=s&&m.exec(t);return n?(n=parseInt((n[1]+n[2]).toLowerCase(),g))-(a=parseInt((a[1]+a[2]).toLowerCase(),g)):e<t?-1:1}},global:function(e,t){var r=t.argString;if(r){var n,o=void 0!==t.line?t.line:e.firstLine(),i=t.lineEnd||t.line||e.lastLine(),a=be(r,"/"),s=r;if(a.length&&(s=a[0],n=a.slice(1,a.length).join("/")),s)try{Ke(e,s,!0,!0)}catch(t){return void Oe(e,"Invalid regex: "+s)}for(var l=Ae(e).getQuery(),c=[],u="",h=o;h<=i;h++)l.test(e.getLine(h))&&(c.push(h+1),u+=e.getLine(h)+"<br>");if(n){var p=0,f=function(){if(p<c.length){var t=c[p]+n;Ve.processCommand(e,t,{callback:f})}p++};f()}else Oe(e,u)}else Oe(e,"Regular Expression missing from global")},substitute:function(t,r){if(!t.getSearchCursor)throw new Error("Search feature not available. Requires searchcursor.js or any other getSearchCursor implementation.");var o,i,a,s,l=r.argString,c=l?be(l,l[0]):[],u="",h=!1,f=!1;if(c.length)o=c[0],u=c[1],o&&"$"===o[o.length-1]&&(o=o.slice(0,o.length-1)+"\\n",u=u?u+"\n":"\n"),void 0!==u&&(u=E("pcre")?function(t){for(var r=new e.StringStream(t),n=[];!r.eol();){for(;r.peek()&&"\\"!=r.peek();)n.push(r.next());var o=!1;for(var i in Re)if(r.match(i,!0)){o=!0,n.push(Re[i]);break}o||n.push(r.next())}return n.join("")}(u):function(e){for(var t,r=!1,n=[],o=-1;o<e.length;o++){var i=e.charAt(o)||"",a=e.charAt(o+1)||"";Te[i+a]?(n.push(Te[i+a]),o++):r?(n.push(i),r=!1):"\\"===i?(r=!0,t=a,p.test(t)||"$"===a?n.push("$"):"/"!==a&&"\\"!==a&&n.push("\\")):("$"===i&&n.push("$"),n.push(i),"/"===a&&n.push("\\"))}return n.join("")}(u),O.lastSubstituteReplacePart=u),i=c[2]?c[2].split(" "):[];else if(l&&l.length)return void Oe(t,"Substitutions should be of the form :s/pattern/replace/");if(i&&(a=i[0],s=parseInt(i[1]),a&&(-1!=a.indexOf("c")&&(h=!0,a.replace("c","")),-1!=a.indexOf("g")&&(f=!0,a.replace("g","")),o=o.replace(/\//g,"\\/")+"/"+a)),o)try{Ke(t,o,!0,!0)}catch(e){return void Oe(t,"Invalid regex: "+o)}if(void 0!==(u=u||O.lastSubstituteReplacePart)){var d=Ae(t).getQuery(),m=void 0!==r.line?r.line:t.getCursor().line,g=r.lineEnd||m;m==t.firstLine()&&g==t.lastLine()&&(g=1/0),s&&(g=(m=g)+s-1);var v=z(t,n(m,0)),y=t.getSearchCursor(d,v);!function(t,r,n,o,i,a,s,l,c){t.state.vim.exMode=!0;var u=!1,h=a.from();function p(){t.operation(function(){for(;!u;)f(),d();m()})}function f(){var e=t.getRange(a.from(),a.to()),r=e.replace(s,l);a.replace(r)}function d(){for(;a.findNext()&&(e=a.from(),r=o,s=i,"number"!=typeof e&&(e=e.line),r instanceof Array?b(e,r):s?e>=r&&e<=s:e==r);)if(n||!h||a.from().line!=h.line)return t.scrollIntoView(a.from(),30),t.setSelection(a.from(),a.to()),h=a.from(),void(u=!1);var e,r,s;u=!0}function m(e){if(e&&e(),t.focus(),h){t.setCursor(h);var r=t.state.vim;r.exMode=!1,r.lastHPos=r.lastHSPos=h.ch}c&&c()}if(d(),!u)return r?void Ie(t,{prefix:"replace with <strong>"+l+"</strong> (y/n/a/q/l)",onKeyDown:function(r,n,o){switch(e.e_stop(r),e.keyName(r)){case"Y":f(),d();break;case"N":d();break;case"A":var i=c;c=void 0,t.operation(p),c=i;break;case"L":f();case"Q":case"Esc":case"Ctrl-C":case"Ctrl-[":m(o)}return u&&m(o),!0}}):(p(),void(c&&c()));Oe(t,"No matches for "+s.source)}(t,h,f,m,g,y,d,u,r.callback)}else Oe(t,"No previous substitute regular expression")},redo:e.commands.redo,undo:e.commands.undo,write:function(t){e.commands.save?e.commands.save(t):t.save&&t.save()},nohlsearch:function(e){je(e)},yank:function(e){var t=ee(e.getCursor()).line,r=e.getLine(t);O.registerController.pushText("0","yank",r,!0,!0)},delmarks:function(t,r){if(r.argString&&se(r.argString))for(var n=t.state.vim,o=new e.StringStream(se(r.argString));!o.eol();){o.eatSpace();var i=o.pos;if(!o.match(/[a-zA-Z]/,!1))return void Oe(t,"Invalid argument: "+r.argString.substring(i));var a=o.next();if(o.match("-",!0)){if(!o.match(/[a-zA-Z]/,!1))return void Oe(t,"Invalid argument: "+r.argString.substring(i));var s=a,l=o.next();if(!(M(s)&&M(l)||x(s)&&x(l)))return void Oe(t,"Invalid argument: "+s+"-");var c=s.charCodeAt(0),u=l.charCodeAt(0);if(c>=u)return void Oe(t,"Invalid argument: "+r.argString.substring(i));for(var h=0;h<=u-c;h++){var p=String.fromCharCode(c+h);delete n.marks[p]}}else delete n.marks[a]}else Oe(t,"Argument required")}},Ve=new Fe;function De(t){var r=t.state.vim,n=O.macroModeState,o=O.registerController.getRegister("."),i=n.isPlaying,a=n.lastInsertModeChanges,s=[];if(!i){for(var l=a.inVisualBlock&&r.lastSelection?r.lastSelection.visualBlock.height:1,c=a.changes,u=(s=[],0);u<c.length;)s.push(c[u]),c[u]instanceof ze?u++:u+=l;a.changes=s,t.off("change",$e),e.off(t.getInputField(),"keydown",Ze)}!i&&r.insertModeRepeat>1&&(Ge(t,r,r.insertModeRepeat-1,!0),r.lastEditInputState.repeatOverride=r.insertModeRepeat),delete r.insertModeRepeat,r.insertMode=!1,t.setCursor(t.getCursor().line,t.getCursor().ch-1),t.setOption("keyMap","vim"),t.setOption("disableInput",!0),t.toggleOverwrite(!1),o.setText(a.changes.join("")),e.signal(t,"vim-mode-change",{mode:"normal"}),n.isRecording&&function(e){if(!e.isPlaying){var t=e.latestRegister,r=O.registerController.getRegister(t);r&&r.pushInsertModeChanges&&r.pushInsertModeChanges(e.lastInsertModeChanges)}}(n)}function Ue(e){t.unshift(e)}function Je(t,r,n,o){var i=O.registerController.getRegister(o);if(":"==o)return i.keyBuffer[0]&&Ve.processCommand(t,i.keyBuffer[0]),void(n.isPlaying=!1);var a=i.keyBuffer,s=0;n.isPlaying=!0,n.replaySearchQueries=i.searchQueries.slice(0);for(var l=0;l<a.length;l++)for(var c,u,h=a[l];h;)if(u=(c=/<\w+-.+?>|<\w+>|./.exec(h))[0],h=h.substring(c.index+u.length),e.Vim.handleKey(t,u,"macro"),r.insertMode){var p=i.insertModeChanges[s++].changes;O.macroModeState.lastInsertModeChanges.changes=p,Xe(t,p,1),De(t)}n.isPlaying=!1}function $e(e,t){var r=O.macroModeState,n=r.lastInsertModeChanges;if(!r.isPlaying)for(;t;){if(n.expectCursorActivityForChange=!0,"+input"==t.origin||"paste"==t.origin||void 0===t.origin){var o=t.text.join("\n");n.maybeReset&&(n.changes=[],n.maybeReset=!1),e.state.overwrite&&!/\n/.test(o)?n.changes.push([o]):n.changes.push(o)}t=t.next}}function qe(t){var r=t.state.vim;if(r.insertMode){var n=O.macroModeState;if(n.isPlaying)return;var o=n.lastInsertModeChanges;o.expectCursorActivityForChange?o.expectCursorActivityForChange=!1:o.maybeReset=!0}else t.curOp.isVimOp||function(t,r){var n=t.getCursor("anchor"),o=t.getCursor("head");if(r.visualMode&&!t.somethingSelected()?fe(t,!1):r.visualMode||r.insertMode||!t.somethingSelected()||(r.visualMode=!0,r.visualLine=!1,e.signal(t,"vim-mode-change",{mode:"visual"})),r.visualMode){var i=re(o,n)?0:-1,a=re(o,n)?-1:0;o=G(o,0,i),n=G(n,0,a),r.sel={anchor:n,head:o},Me(t,r,"<",ne(o,n)),Me(t,r,">",oe(o,n))}else r.insertMode||(r.lastHPos=t.getCursor().ch)}(t,r);r.visualMode&&Qe(t)}function Qe(e){var t=e.state.vim,r=z(e,ee(t.sel.head)),n=G(r,0,1);t.fakeCursor&&t.fakeCursor.clear(),t.fakeCursor=e.markText(r,n,{className:"cm-animate-fat-cursor"})}function ze(e){this.keyName=e}function Ze(t){var r=O.macroModeState.lastInsertModeChanges,n=e.keyName(t);n&&(-1==n.indexOf("Delete")&&-1==n.indexOf("Backspace")||e.lookupKey(n,"vim-insert",function(){return r.maybeReset&&(r.changes=[],r.maybeReset=!1),r.changes.push(new ze(n)),!0}))}function Ge(e,t,r,n){var o=O.macroModeState;o.isPlaying=!0;var i=!!t.lastEditActionCommand,a=t.inputState;function s(){i?U.processAction(e,t,t.lastEditActionCommand):U.evalInput(e,t)}function l(r){if(o.lastInsertModeChanges.changes.length>0){r=t.lastEditActionCommand?r:1;var n=o.lastInsertModeChanges;Xe(e,n.changes,r)}}if(t.inputState=t.lastEditInputState,i&&t.lastEditActionCommand.interlaceInsertRepeat)for(var c=0;c<r;c++)s(),l(1);else n||s(),l(r);t.inputState=a,t.insertMode&&!n&&De(e),o.isPlaying=!1}function Xe(t,r,n){function o(r){return"string"==typeof r?e.commands[r](t):r(t),!0}var i,a,s=t.getCursor("head"),l=O.macroModeState.lastInsertModeChanges.inVisualBlock;if(l){var c=t.state.vim.lastSelection,u=(i=c.anchor,{line:(a=c.head).line-i.line,ch:a.line-i.line});ce(t,s,u.line+1),n=t.listSelections().length,t.setCursor(s)}for(var h=0;h<n;h++){l&&t.setCursor(G(s,h,0));for(var p=0;p<r.length;p++){var f=r[p];if(f instanceof ze)e.lookupKey(f.keyName,"vim-insert",o);else if("string"==typeof f){var d=t.getCursor();t.replaceRange(f,d,d)}else{var m=t.getCursor(),g=G(m,0,f[0].length);t.replaceRange(f[0],m,g)}}}l&&t.setCursor(G(s,0,1))}return e.keyMap.vim={attach:i,detach:o,call:l},T("insertModeEscKeysTimeout",200,"number"),e.keyMap["vim-insert"]={fallthrough:["default"],attach:i,detach:o,call:l},e.keyMap["vim-replace"]={Backspace:"goCharLeft",fallthrough:["vim-insert"],attach:i,detach:o,call:l},j(),H}()}); +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../lib/codemirror"),require("../addon/search/searchcursor"),require("../addon/dialog/dialog"),require("../addon/edit/matchbrackets.js")):"function"==typeof define&&define.amd?define(["../lib/codemirror","../addon/search/searchcursor","../addon/dialog/dialog","../addon/edit/matchbrackets"],e):e(CodeMirror)}(function(Ze){"use strict";var Ge=[{keys:"<Left>",type:"keyToKey",toKeys:"h"},{keys:"<Right>",type:"keyToKey",toKeys:"l"},{keys:"<Up>",type:"keyToKey",toKeys:"k"},{keys:"<Down>",type:"keyToKey",toKeys:"j"},{keys:"<Space>",type:"keyToKey",toKeys:"l"},{keys:"<BS>",type:"keyToKey",toKeys:"h",context:"normal"},{keys:"<Del>",type:"keyToKey",toKeys:"x",context:"normal"},{keys:"<C-Space>",type:"keyToKey",toKeys:"W"},{keys:"<C-BS>",type:"keyToKey",toKeys:"B",context:"normal"},{keys:"<S-Space>",type:"keyToKey",toKeys:"w"},{keys:"<S-BS>",type:"keyToKey",toKeys:"b",context:"normal"},{keys:"<C-n>",type:"keyToKey",toKeys:"j"},{keys:"<C-p>",type:"keyToKey",toKeys:"k"},{keys:"<C-[>",type:"keyToKey",toKeys:"<Esc>"},{keys:"<C-c>",type:"keyToKey",toKeys:"<Esc>"},{keys:"<C-[>",type:"keyToKey",toKeys:"<Esc>",context:"insert"},{keys:"<C-c>",type:"keyToKey",toKeys:"<Esc>",context:"insert"},{keys:"s",type:"keyToKey",toKeys:"cl",context:"normal"},{keys:"s",type:"keyToKey",toKeys:"c",context:"visual"},{keys:"S",type:"keyToKey",toKeys:"cc",context:"normal"},{keys:"S",type:"keyToKey",toKeys:"VdO",context:"visual"},{keys:"<Home>",type:"keyToKey",toKeys:"0"},{keys:"<End>",type:"keyToKey",toKeys:"$"},{keys:"<PageUp>",type:"keyToKey",toKeys:"<C-b>"},{keys:"<PageDown>",type:"keyToKey",toKeys:"<C-f>"},{keys:"<CR>",type:"keyToKey",toKeys:"j^",context:"normal"},{keys:"<Ins>",type:"action",action:"toggleOverwrite",context:"insert"},{keys:"H",type:"motion",motion:"moveToTopLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"M",type:"motion",motion:"moveToMiddleLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"L",type:"motion",motion:"moveToBottomLine",motionArgs:{linewise:!0,toJumplist:!0}},{keys:"h",type:"motion",motion:"moveByCharacters",motionArgs:{forward:!1}},{keys:"l",type:"motion",motion:"moveByCharacters",motionArgs:{forward:!0}},{keys:"j",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,linewise:!0}},{keys:"k",type:"motion",motion:"moveByLines",motionArgs:{forward:!1,linewise:!0}},{keys:"gj",type:"motion",motion:"moveByDisplayLines",motionArgs:{forward:!0}},{keys:"gk",type:"motion",motion:"moveByDisplayLines",motionArgs:{forward:!1}},{keys:"w",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!1}},{keys:"W",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!1,bigWord:!0}},{keys:"e",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!0,inclusive:!0}},{keys:"E",type:"motion",motion:"moveByWords",motionArgs:{forward:!0,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:"b",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1}},{keys:"B",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1,bigWord:!0}},{keys:"ge",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!0,inclusive:!0}},{keys:"gE",type:"motion",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!0,bigWord:!0,inclusive:!0}},{keys:"{",type:"motion",motion:"moveByParagraph",motionArgs:{forward:!1,toJumplist:!0}},{keys:"}",type:"motion",motion:"moveByParagraph",motionArgs:{forward:!0,toJumplist:!0}},{keys:"(",type:"motion",motion:"moveBySentence",motionArgs:{forward:!1}},{keys:")",type:"motion",motion:"moveBySentence",motionArgs:{forward:!0}},{keys:"<C-f>",type:"motion",motion:"moveByPage",motionArgs:{forward:!0}},{keys:"<C-b>",type:"motion",motion:"moveByPage",motionArgs:{forward:!1}},{keys:"<C-d>",type:"motion",motion:"moveByScroll",motionArgs:{forward:!0,explicitRepeat:!0}},{keys:"<C-u>",type:"motion",motion:"moveByScroll",motionArgs:{forward:!1,explicitRepeat:!0}},{keys:"gg",type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!1,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:"G",type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!0,explicitRepeat:!0,linewise:!0,toJumplist:!0}},{keys:"0",type:"motion",motion:"moveToStartOfLine"},{keys:"^",type:"motion",motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"+",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,toFirstChar:!0}},{keys:"-",type:"motion",motion:"moveByLines",motionArgs:{forward:!1,toFirstChar:!0}},{keys:"_",type:"motion",motion:"moveByLines",motionArgs:{forward:!0,toFirstChar:!0,repeatOffset:-1}},{keys:"$",type:"motion",motion:"moveToEol",motionArgs:{inclusive:!0}},{keys:"%",type:"motion",motion:"moveToMatchedSymbol",motionArgs:{inclusive:!0,toJumplist:!0}},{keys:"f<character>",type:"motion",motion:"moveToCharacter",motionArgs:{forward:!0,inclusive:!0}},{keys:"F<character>",type:"motion",motion:"moveToCharacter",motionArgs:{forward:!1}},{keys:"t<character>",type:"motion",motion:"moveTillCharacter",motionArgs:{forward:!0,inclusive:!0}},{keys:"T<character>",type:"motion",motion:"moveTillCharacter",motionArgs:{forward:!1}},{keys:";",type:"motion",motion:"repeatLastCharacterSearch",motionArgs:{forward:!0}},{keys:",",type:"motion",motion:"repeatLastCharacterSearch",motionArgs:{forward:!1}},{keys:"'<character>",type:"motion",motion:"goToMark",motionArgs:{toJumplist:!0,linewise:!0}},{keys:"`<character>",type:"motion",motion:"goToMark",motionArgs:{toJumplist:!0}},{keys:"]`",type:"motion",motion:"jumpToMark",motionArgs:{forward:!0}},{keys:"[`",type:"motion",motion:"jumpToMark",motionArgs:{forward:!1}},{keys:"]'",type:"motion",motion:"jumpToMark",motionArgs:{forward:!0,linewise:!0}},{keys:"['",type:"motion",motion:"jumpToMark",motionArgs:{forward:!1,linewise:!0}},{keys:"]p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!0,isEdit:!0,matchIndent:!0}},{keys:"[p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!1,isEdit:!0,matchIndent:!0}},{keys:"]<character>",type:"motion",motion:"moveToSymbol",motionArgs:{forward:!0,toJumplist:!0}},{keys:"[<character>",type:"motion",motion:"moveToSymbol",motionArgs:{forward:!1,toJumplist:!0}},{keys:"|",type:"motion",motion:"moveToColumn"},{keys:"o",type:"motion",motion:"moveToOtherHighlightedEnd",context:"visual"},{keys:"O",type:"motion",motion:"moveToOtherHighlightedEnd",motionArgs:{sameLine:!0},context:"visual"},{keys:"d",type:"operator",operator:"delete"},{keys:"y",type:"operator",operator:"yank"},{keys:"c",type:"operator",operator:"change"},{keys:"=",type:"operator",operator:"indentAuto"},{keys:">",type:"operator",operator:"indent",operatorArgs:{indentRight:!0}},{keys:"<",type:"operator",operator:"indent",operatorArgs:{indentRight:!1}},{keys:"g~",type:"operator",operator:"changeCase"},{keys:"gu",type:"operator",operator:"changeCase",operatorArgs:{toLower:!0},isEdit:!0},{keys:"gU",type:"operator",operator:"changeCase",operatorArgs:{toLower:!1},isEdit:!0},{keys:"n",type:"motion",motion:"findNext",motionArgs:{forward:!0,toJumplist:!0}},{keys:"N",type:"motion",motion:"findNext",motionArgs:{forward:!1,toJumplist:!0}},{keys:"gn",type:"motion",motion:"findAndSelectNextInclusive",motionArgs:{forward:!0}},{keys:"gN",type:"motion",motion:"findAndSelectNextInclusive",motionArgs:{forward:!1}},{keys:"x",type:"operatorMotion",operator:"delete",motion:"moveByCharacters",motionArgs:{forward:!0},operatorMotionArgs:{visualLine:!1}},{keys:"X",type:"operatorMotion",operator:"delete",motion:"moveByCharacters",motionArgs:{forward:!1},operatorMotionArgs:{visualLine:!0}},{keys:"D",type:"operatorMotion",operator:"delete",motion:"moveToEol",motionArgs:{inclusive:!0},context:"normal"},{keys:"D",type:"operator",operator:"delete",operatorArgs:{linewise:!0},context:"visual"},{keys:"Y",type:"operatorMotion",operator:"yank",motion:"expandToLine",motionArgs:{linewise:!0},context:"normal"},{keys:"Y",type:"operator",operator:"yank",operatorArgs:{linewise:!0},context:"visual"},{keys:"C",type:"operatorMotion",operator:"change",motion:"moveToEol",motionArgs:{inclusive:!0},context:"normal"},{keys:"C",type:"operator",operator:"change",operatorArgs:{linewise:!0},context:"visual"},{keys:"~",type:"operatorMotion",operator:"changeCase",motion:"moveByCharacters",motionArgs:{forward:!0},operatorArgs:{shouldMoveCursor:!0},context:"normal"},{keys:"~",type:"operator",operator:"changeCase",context:"visual"},{keys:"<C-w>",type:"operatorMotion",operator:"delete",motion:"moveByWords",motionArgs:{forward:!1,wordEnd:!1},context:"insert"},{keys:"<C-w>",type:"idle",context:"normal"},{keys:"<C-i>",type:"action",action:"jumpListWalk",actionArgs:{forward:!0}},{keys:"<C-o>",type:"action",action:"jumpListWalk",actionArgs:{forward:!1}},{keys:"<C-e>",type:"action",action:"scroll",actionArgs:{forward:!0,linewise:!0}},{keys:"<C-y>",type:"action",action:"scroll",actionArgs:{forward:!1,linewise:!0}},{keys:"a",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"charAfter"},context:"normal"},{keys:"A",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"eol"},context:"normal"},{keys:"A",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"endOfSelectedArea"},context:"visual"},{keys:"i",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"inplace"},context:"normal"},{keys:"gi",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"lastEdit"},context:"normal"},{keys:"I",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"firstNonBlank"},context:"normal"},{keys:"gI",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"bol"},context:"normal"},{keys:"I",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{insertAt:"startOfSelectedArea"},context:"visual"},{keys:"o",type:"action",action:"newLineAndEnterInsertMode",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!0},context:"normal"},{keys:"O",type:"action",action:"newLineAndEnterInsertMode",isEdit:!0,interlaceInsertRepeat:!0,actionArgs:{after:!1},context:"normal"},{keys:"v",type:"action",action:"toggleVisualMode"},{keys:"V",type:"action",action:"toggleVisualMode",actionArgs:{linewise:!0}},{keys:"<C-v>",type:"action",action:"toggleVisualMode",actionArgs:{blockwise:!0}},{keys:"<C-q>",type:"action",action:"toggleVisualMode",actionArgs:{blockwise:!0}},{keys:"gv",type:"action",action:"reselectLastSelection"},{keys:"J",type:"action",action:"joinLines",isEdit:!0},{keys:"gJ",type:"action",action:"joinLines",actionArgs:{keepSpaces:!0},isEdit:!0},{keys:"p",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!0,isEdit:!0}},{keys:"P",type:"action",action:"paste",isEdit:!0,actionArgs:{after:!1,isEdit:!0}},{keys:"r<character>",type:"action",action:"replace",isEdit:!0},{keys:"@<character>",type:"action",action:"replayMacro"},{keys:"q<character>",type:"action",action:"enterMacroRecordMode"},{keys:"R",type:"action",action:"enterInsertMode",isEdit:!0,actionArgs:{replace:!0},context:"normal"},{keys:"R",type:"operator",operator:"change",operatorArgs:{linewise:!0,fullLine:!0},context:"visual",exitVisualBlock:!0},{keys:"u",type:"action",action:"undo",context:"normal"},{keys:"u",type:"operator",operator:"changeCase",operatorArgs:{toLower:!0},context:"visual",isEdit:!0},{keys:"U",type:"operator",operator:"changeCase",operatorArgs:{toLower:!1},context:"visual",isEdit:!0},{keys:"<C-r>",type:"action",action:"redo"},{keys:"m<character>",type:"action",action:"setMark"},{keys:'"<character>',type:"action",action:"setRegister"},{keys:"zz",type:"action",action:"scrollToCursor",actionArgs:{position:"center"}},{keys:"z.",type:"action",action:"scrollToCursor",actionArgs:{position:"center"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"zt",type:"action",action:"scrollToCursor",actionArgs:{position:"top"}},{keys:"z<CR>",type:"action",action:"scrollToCursor",actionArgs:{position:"top"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:"z-",type:"action",action:"scrollToCursor",actionArgs:{position:"bottom"}},{keys:"zb",type:"action",action:"scrollToCursor",actionArgs:{position:"bottom"},motion:"moveToFirstNonWhiteSpaceCharacter"},{keys:".",type:"action",action:"repeatLastEdit"},{keys:"<C-a>",type:"action",action:"incrementNumberToken",isEdit:!0,actionArgs:{increase:!0,backtrack:!1}},{keys:"<C-x>",type:"action",action:"incrementNumberToken",isEdit:!0,actionArgs:{increase:!1,backtrack:!1}},{keys:"<C-t>",type:"action",action:"indent",actionArgs:{indentRight:!0},context:"insert"},{keys:"<C-d>",type:"action",action:"indent",actionArgs:{indentRight:!1},context:"insert"},{keys:"a<character>",type:"motion",motion:"textObjectManipulation"},{keys:"i<character>",type:"motion",motion:"textObjectManipulation",motionArgs:{textObjectInner:!0}},{keys:"/",type:"search",searchArgs:{forward:!0,querySrc:"prompt",toJumplist:!0}},{keys:"?",type:"search",searchArgs:{forward:!1,querySrc:"prompt",toJumplist:!0}},{keys:"*",type:"search",searchArgs:{forward:!0,querySrc:"wordUnderCursor",wholeWordOnly:!0,toJumplist:!0}},{keys:"#",type:"search",searchArgs:{forward:!1,querySrc:"wordUnderCursor",wholeWordOnly:!0,toJumplist:!0}},{keys:"g*",type:"search",searchArgs:{forward:!0,querySrc:"wordUnderCursor",toJumplist:!0}},{keys:"g#",type:"search",searchArgs:{forward:!1,querySrc:"wordUnderCursor",toJumplist:!0}},{keys:":",type:"ex"}],Ye=Ge.length,et=[{name:"colorscheme",shortName:"colo"},{name:"map"},{name:"imap",shortName:"im"},{name:"nmap",shortName:"nm"},{name:"vmap",shortName:"vm"},{name:"unmap"},{name:"write",shortName:"w"},{name:"undo",shortName:"u"},{name:"redo",shortName:"red"},{name:"set",shortName:"se"},{name:"setlocal",shortName:"setl"},{name:"setglobal",shortName:"setg"},{name:"sort",shortName:"sor"},{name:"substitute",shortName:"s",possiblyAsync:!0},{name:"nohlsearch",shortName:"noh"},{name:"yank",shortName:"y"},{name:"delmarks",shortName:"delm"},{name:"registers",shortName:"reg",excludeFromCommandHistory:!0},{name:"global",shortName:"g"}],tt=Ze.Pos;Ze.Vim=function(){function e(e,t){var r,n;this==Ze.keyMap.vim&&(Ze.rmClass(e.getWrapperElement(),"cm-fat-cursor"),"contenteditable"==e.getOption("inputStyle")&&null!=document.body.style.caretColor&&(a(r=e),r.off("cursorActivity",i),r.state.fatCursorMarks=null,e.getInputField().style.caretColor="")),t&&t.attach==o||((n=e).setOption("disableInput",!1),n.off("cursorActivity",Ue),Ze.off(n.getInputField(),"paste",c(n)),n.state.vim=null)}function o(e,t){var r,n;this==Ze.keyMap.vim&&(Ze.addClass(e.getWrapperElement(),"cm-fat-cursor"),"contenteditable"==e.getOption("inputStyle")&&null!=document.body.style.caretColor&&((r=e).state.fatCursorMarks=[],i(r),r.on("cursorActivity",i),e.getInputField().style.caretColor="transparent")),t&&t.attach==o||((n=e).setOption("disableInput",!0),n.setOption("showCursorWhenSelecting",!1),Ze.signal(n,"vim-mode-change",{mode:"normal"}),n.on("cursorActivity",Ue),E(n),Ze.on(n.getInputField(),"paste",c(n)))}function i(e){if(e.state.fatCursorMarks){a(e);for(var t=e.listSelections(),r=[],n=0;n<t.length;n++){var o,i=t[n];i.empty()&&(o=e.getLine(i.anchor.line).length,i.anchor.ch<o?r.push(e.markText(i.anchor,tt(i.anchor.line,i.anchor.ch+1),{className:"cm-fat-cursor-mark"})):r.push(e.markText(tt(i.anchor.line,o-1),tt(i.anchor.line,o),{className:"cm-fat-cursor-mark"})))}e.state.fatCursorMarks=r}}function a(e){var t=e.state.fatCursorMarks;if(t)for(var r=0;r<t.length;r++)t[r].clear()}function t(e,t){if(t){if(this[e])return this[e];var r=function(e){if("'"==e.charAt(0))return e.charAt(1);var t=e.split(/-(?!$)/),r=t[t.length-1];{if(1==t.length&&1==t[0].length)return!1;if(2==t.length&&"Shift"==t[0]&&1==r.length)return!1}for(var n=!1,o=0;o<t.length;o++){var i=t[o];i in s?t[o]=s[i]:n=!0,i in l&&(t[o]=l[i])}if(!n)return!1;k(r)&&(t[t.length-1]=r.toLowerCase());return"<"+t.join("-")+">"}(e);if(!r)return!1;var n=Ze.Vim.findKey(t,r);return"function"==typeof n&&Ze.signal(t,"vim-keypress",r),n}}Ze.defineOption("vimMode",!1,function(e,t,r){t&&"vim"!=e.getOption("keyMap")?e.setOption("keyMap","vim"):!t&&r!=Ze.Init&&/^vim/.test(e.getOption("keyMap"))&&e.setOption("keyMap","default")});var s={Shift:"S",Ctrl:"C",Alt:"A",Cmd:"D",Mod:"A"},l={Enter:"CR",Backspace:"BS",Delete:"Del",Insert:"Ins"};function c(e){var t=e.state.vim;return t.onPasteFn||(t.onPasteFn=function(){t.insertMode||(e.setCursor(q(e.getCursor(),0,1)),U.enterInsertMode(e,{},t))}),t.onPasteFn}var u=/[\d]/,m=[Ze.isWordChar,function(e){return e&&!Ze.isWordChar(e)&&!/\s/.test(e)}],g=[function(e){return/\S/.test(e)}];function r(e,t){for(var r=[],n=e;n<e+t;n++)r.push(String.fromCharCode(n));return r}var n=r(65,26),h=r(97,26),p=r(48,10),f=[].concat(n,h,p,["<",">"]),d=[].concat(n,h,p,["-",'"',".",":","_","/"]);function v(e,t){return t>=e.firstLine()&&t<=e.lastLine()}function y(e){return/^[a-z]$/.test(e)}function k(e){return/^[A-Z]$/.test(e)}function B(e){return/^\s*$/.test(e)}function C(e){return-1!=".?!".indexOf(e)}function w(e,t){for(var r=0;r<t.length;r++)if(t[r]==e)return!0;return!1}var x={};function M(e,t,r,n,o){if(void 0===t&&!o)throw Error("defaultValue is required unless callback is provided");if(r=r||"string",x[e]={type:r,defaultValue:t,callback:o},n)for(var i=0;i<n.length;i++)x[n[i]]=x[e];t&&S(e,t)}function S(e,t,r,n){var o=x[e],i=(n=n||{}).scope;if(!o)return new Error("Unknown option: "+e);if("boolean"==o.type){if(t&&!0!==t)return new Error("Invalid argument: "+e+"="+t);!1!==t&&(t=!0)}o.callback?("local"!==i&&o.callback(t,void 0),"global"!==i&&r&&o.callback(t,r)):("local"!==i&&(o.value="boolean"==o.type?!!t:t),"global"!==i&&r&&(r.state.vim.options[e]={value:t}))}function A(e,t,r){var n=x[e],o=(r=r||{}).scope;if(!n)return new Error("Unknown option: "+e);if(n.callback){var i=t&&n.callback(void 0,t);return"global"!==o&&void 0!==i?i:"local"!==o?n.callback():void 0}return((i="global"!==o&&t&&t.state.vim.options[e])||"local"!==o&&n||{}).value}M("filetype",void 0,"string",["ft"],function(e,t){if(void 0!==t){if(void 0===e)return"null"==(r=t.getOption("mode"))?"":r;var r=""==e?"null":e;t.setOption("mode",r)}});function b(){var a=100,s=-1,l=0,c=0,u=new Array(a);function o(e,t){l<(s+=t)?s=l:s<c&&(s=c);var r=u[(a+s)%a];if(r&&!r.find()){var n,o=0<t?1:-1,i=e.getCursor();do{if((r=u[(a+(s+=o))%a])&&(n=r.find())&&!X(i,n))break}while(s<l&&c<s)}return r}return{cachedCursor:void 0,add:function(n,e,t){var r,o=u[s%a];function i(e){var t=++s%a,r=u[t];r&&r.clear(),u[t]=n.setBookmark(e)}o&&(!(r=o.find())||X(r,e))||i(e),i(t),(c=(l=s)-a+1)<0&&(c=0)},find:function(e,t){var r=s,n=o(e,t);return s=r,n&&n.find()},move:o}}var K,L,T=function(e){return e?{changes:e.changes,expectCursorActivityForChange:e.expectCursorActivityForChange}:{changes:[],expectCursorActivityForChange:!1}};function R(){this.latestRegister=void 0,this.isPlaying=!1,this.isRecording=!1,this.replaySearchQueries=[],this.onRecordingDone=void 0,this.lastInsertModeChanges=T()}function E(e){return e.state.vim||(e.state.vim={inputState:new N,lastEditInputState:void 0,lastEditActionCommand:void 0,lastHPos:-1,lastHSPos:-1,lastMotion:null,marks:{},fakeCursor:null,insertMode:!1,insertModeRepeat:void 0,visualMode:!1,visualLine:!1,visualBlock:!1,lastSelection:null,lastPastedText:null,sel:{},options:{}}),e.state.vim}function O(){for(var e in K={searchQuery:null,searchIsReversed:!1,lastSubstituteReplacePart:void 0,jumpList:b(),macroModeState:new R,lastCharacterSearch:{increment:0,forward:!0,selectedCharacter:""},registerController:new j({}),searchHistoryController:new H,exCommandHistoryController:new H},x){var t=x[e];t.value=t.defaultValue}}var I={buildKeyMap:function(){},getRegisterController:function(){return K.registerController},resetVimGlobalState_:O,getVimGlobalState_:function(){return K},maybeInitVimState_:E,suppressErrorLogging:!(R.prototype={exitMacroRecordMode:function(){var e=K.macroModeState;e.onRecordingDone&&e.onRecordingDone(),e.onRecordingDone=void 0,e.isRecording=!1},enterMacroRecordMode:function(e,t){var r=K.registerController.getRegister(t);r&&(r.clear(),this.latestRegister=t,e.openDialog&&(this.onRecordingDone=e.openDialog("(recording)["+t+"]",null,{bottom:!0})),this.isRecording=!0)}}),InsertModeKey:qe,map:function(e,t,r){Fe.map(e,t,r)},unmap:function(e,t){Fe.unmap(e,t)},noremap:function(e,t,r){function n(e){return e?[e]:["normal","insert","visual"]}for(var o=n(r),i=Ge.length,a=i-Ye;a<i&&o.length;a++){var s=Ge[a];if(!(s.keys!=t||r&&s.context&&s.context!==r||"ex"===s.type.substr(0,2)||"key"===s.type.substr(0,3))){var l={};for(var c in s)l[c]=s[c];l.keys=e,r&&!l.context&&(l.context=r),this._mapCommand(l);var u=n(s.context),o=o.filter(function(e){return-1===u.indexOf(e)})}}},mapclear:function(e){var t=Ge.length,r=Ye,n=Ge.slice(0,t-r);if(Ge=Ge.slice(t-r),e)for(var o=n.length-1;0<=o;o--){var i=n[o];if(e!==i.context)if(i.context)this._mapCommand(i);else{var a=["normal","insert","visual"];for(var s in a)if(a[s]!==e){var l={};for(var c in i)l[c]=i[c];l.context=a[s],this._mapCommand(l)}}}},setOption:S,getOption:A,defineOption:M,defineEx:function(e,t,r){if(t){if(0!==e.indexOf(t))throw new Error('(Vim.defineEx) "'+t+'" is not a prefix of "'+e+'", command not registered')}else t=e;He[e]=r,Fe.commandMap_[t]={name:e,shortName:t,type:"api"}},handleKey:function(e,t,r){var n=this.findKey(e,t,r);if("function"==typeof n)return n()},findKey:function(s,l,t){var e,c=E(s);function o(){var e=K.macroModeState;if(e.isRecording){if("q"==l)return e.exitMacroRecordMode(),P(s),1;"mapping"!=t&&function(e,t){if(e.isPlaying)return;var r=e.latestRegister,n=K.registerController.getRegister(r);n&&n.pushText(t)}(e,l)}}function u(){return"<Esc>"==l&&(P(s),c.visualMode?le(s):c.insertMode&&We(s),1)}return!1===(e=(c.insertMode?function(){if(u())return!0;for(var e=c.inputState.keyBuffer=c.inputState.keyBuffer+l,t=1==l.length,r=F.matchCommand(e,Ge,c.inputState,"insert");1<e.length&&"full"!=r.type;){var e=c.inputState.keyBuffer=e.slice(1),n=F.matchCommand(e,Ge,c.inputState,"insert");"none"!=n.type&&(r=n)}if("none"==r.type)return P(s),!1;if("partial"==r.type)return L&&window.clearTimeout(L),L=window.setTimeout(function(){c.insertMode&&c.inputState.keyBuffer&&P(s)},A("insertModeEscKeysTimeout")),!t;if(L&&window.clearTimeout(L),t){for(var o=s.listSelections(),i=0;i<o.length;i++){var a=o[i].head;s.replaceRange("",q(a,0,-(e.length-1)),a,"+input")}K.macroModeState.lastInsertModeChanges.changes.pop()}return P(s),r.command}:function(){if(o()||u())return!0;var e=c.inputState.keyBuffer=c.inputState.keyBuffer+l;if(/^[1-9]\d*$/.test(e))return!0;var t=/^(\d*)(.*)$/.exec(e);if(!t)return P(s),!1;var r=c.visualMode?"visual":"normal",n=F.matchCommand(t[2]||t[1],Ge,c.inputState,r);return"none"==n.type?(P(s),!1):"partial"==n.type||(c.inputState.keyBuffer="",(t=/^(\d*)(.*)$/.exec(e))[1]&&"0"!=t[1]&&c.inputState.pushRepeatDigit(t[1]),n.command)})())?c.insertMode||1!==l.length?void 0:function(){return!0}:!0===e?function(){return!0}:function(){return s.operation(function(){s.curOp.isVimOp=!0;try{"keyToKey"==e.type?function(e){for(var t;e;)t=/<\w+-.+?>|<\w+>|./.exec(e),l=t[0],e=e.substring(t.index+l.length),Ze.Vim.handleKey(s,l,"mapping")}(e.toKeys):F.processCommand(s,c,e)}catch(e){throw s.state.vim=void 0,E(s),Ze.Vim.suppressErrorLogging||console.log(e),e}return!0})}},handleEx:function(e,t){Fe.processCommand(e,t)},defineMotion:function(e,t){W[e]=t},defineAction:function(e,t){U[e]=t},defineOperator:function(e,t){D[e]=t},mapCommand:function(e,t,r,n,o){var i={keys:e,type:t};for(var a in i[t]=r,i[t+"Args"]=n,o)i[a]=o[a];Ve(i)},_mapCommand:Ve,defineRegister:function(e,t){var r=K.registerController.registers;if(!e||1!=e.length)throw Error("Register name must be 1 character");if(r[e])throw Error("Register already defined "+e);r[e]=t,d.push(e)},exitVisualMode:le,exitInsertMode:We};function N(){this.prefixRepeat=[],this.motionRepeat=[],this.operator=null,this.operatorArgs=null,this.motion=null,this.motionArgs=null,this.keyBuffer=[],this.registerName=null}function P(e,t){e.state.vim.inputState=new N,Ze.signal(e,"vim-command-done",t)}function _(e,t,r){this.clear(),this.keyBuffer=[e||""],this.insertModeChanges=[],this.searchQueries=[],this.linewise=!!t,this.blockwise=!!r}function j(e){this.registers=e,this.unnamedRegister=e['"']=new _,e["."]=new _,e[":"]=new _,e["/"]=new _}function H(){this.historyBuffer=[],this.iterator=0,this.initialPrefix=null}N.prototype.pushRepeatDigit=function(e){this.operator?this.motionRepeat=this.motionRepeat.concat(e):this.prefixRepeat=this.prefixRepeat.concat(e)},N.prototype.getRepeat=function(){var e=0;return(0<this.prefixRepeat.length||0<this.motionRepeat.length)&&(e=1,0<this.prefixRepeat.length&&(e*=parseInt(this.prefixRepeat.join(""),10)),0<this.motionRepeat.length&&(e*=parseInt(this.motionRepeat.join(""),10))),e},_.prototype={setText:function(e,t,r){this.keyBuffer=[e||""],this.linewise=!!t,this.blockwise=!!r},pushText:function(e,t){t&&(this.linewise||this.keyBuffer.push("\n"),this.linewise=!0),this.keyBuffer.push(e)},pushInsertModeChanges:function(e){this.insertModeChanges.push(T(e))},pushSearchQuery:function(e){this.searchQueries.push(e)},clear:function(){this.keyBuffer=[],this.insertModeChanges=[],this.searchQueries=[],this.linewise=!1},toString:function(){return this.keyBuffer.join("")}},j.prototype={pushText:function(e,t,r,n,o){if("_"!==e){n&&"\n"!==r.charAt(r.length-1)&&(r+="\n");var i=this.isValidRegister(e)?this.getRegister(e):null;if(i){k(e)?i.pushText(r,n):i.setText(r,n,o),this.unnamedRegister.setText(i.toString(),n)}else{switch(t){case"yank":this.registers[0]=new _(r,n,o);break;case"delete":case"change":-1==r.indexOf("\n")?this.registers["-"]=new _(r,n):(this.shiftNumericRegisters_(),this.registers[1]=new _(r,n))}this.unnamedRegister.setText(r,n,o)}}},getRegister:function(e){return this.isValidRegister(e)?(e=e.toLowerCase(),this.registers[e]||(this.registers[e]=new _),this.registers[e]):this.unnamedRegister},isValidRegister:function(e){return e&&w(e,d)},shiftNumericRegisters_:function(){for(var e=9;2<=e;e--)this.registers[e]=this.getRegister(""+(e-1))}},H.prototype={nextMatch:function(e,t){var r=this.historyBuffer,n=t?-1:1;null===this.initialPrefix&&(this.initialPrefix=e);for(var o=this.iterator+n;t?0<=o:o<r.length;o+=n)for(var i=r[o],a=0;a<=i.length;a++)if(this.initialPrefix==i.substring(0,a))return this.iterator=o,i;return o>=r.length?(this.iterator=r.length,this.initialPrefix):o<0?e:void 0},pushInput:function(e){var t=this.historyBuffer.indexOf(e);-1<t&&this.historyBuffer.splice(t,1),e.length&&this.historyBuffer.push(e)},reset:function(){this.initialPrefix=null,this.iterator=this.historyBuffer.length}};var F={matchCommand:function(e,t,r,n){var o=function(e,t,r,n){for(var o,i=[],a=[],s=0;s<t.length;s++){var l=t[s];"insert"==r&&"insert"!=l.context||l.context&&l.context!=r||n.operator&&"action"==l.type||!(o=function(e,t){{if("<character>"!=t.slice(-11))return e==t?"full":0==t.indexOf(e)&&"partial";var r=t.length-11,n=e.slice(0,r),o=t.slice(0,r);return n==o&&e.length>r?"full":0==o.indexOf(n)&&"partial"}}(e,l.keys))||("partial"==o&&i.push(l),"full"==o&&a.push(l))}return{partial:i.length&&i,full:a.length&&a}}(e,t,n,r);if(!o.full&&!o.partial)return{type:"none"};if(!o.full&&o.partial)return{type:"partial"};for(var i=0;i<o.full.length;i++)var a=o.full[i],s=s||a;if("<character>"==s.keys.slice(-11)){var l=function(e){var t=/^.*(<[^>]+>)$/.exec(e),r=t?t[1]:e.slice(-1);if(1<r.length)switch(r){case"<CR>":r="\n";break;case"<Space>":r=" ";break;default:r=""}return r}(e);if(!l)return{type:"none"};r.selectedCharacter=l}return{type:"full",command:s}},processCommand:function(e,t,r){switch(t.inputState.repeatOverride=r.repeatOverride,r.type){case"motion":this.processMotion(e,t,r);break;case"operator":this.processOperator(e,t,r);break;case"operatorMotion":this.processOperatorMotion(e,t,r);break;case"action":this.processAction(e,t,r);break;case"search":this.processSearch(e,t,r);break;case"ex":case"keyToEx":this.processEx(e,t,r)}},processMotion:function(e,t,r){t.inputState.motion=r.motion,t.inputState.motionArgs=$(r.motionArgs),this.evalInput(e,t)},processOperator:function(e,t,r){var n=t.inputState;if(n.operator){if(n.operator==r.operator)return n.motion="expandToLine",n.motionArgs={linewise:!0},void this.evalInput(e,t);P(e)}n.operator=r.operator,n.operatorArgs=$(r.operatorArgs),r.exitVisualBlock&&(t.visualBlock=!1,ae(e)),t.visualMode&&this.evalInput(e,t)},processOperatorMotion:function(e,t,r){var n=t.visualMode,o=$(r.operatorMotionArgs);o&&n&&o.visualLine&&(t.visualLine=!0),this.processOperator(e,t,r),n||this.processMotion(e,t,r)},processAction:function(e,t,r){var n=t.inputState,o=n.getRepeat(),i=!!o,a=$(r.actionArgs)||{};n.selectedCharacter&&(a.selectedCharacter=n.selectedCharacter),r.operator&&this.processOperator(e,t,r),r.motion&&this.processMotion(e,t,r),(r.motion||r.operator)&&this.evalInput(e,t),a.repeat=o||1,a.repeatIsExplicit=i,a.registerName=n.registerName,P(e),t.lastMotion=null,r.isEdit&&this.recordLastEdit(t,n,r),U[r.action](e,a,t)},processSearch:function(s,n,o){if(s.getSearchCursor){var l=o.searchArgs.forward,e=o.searchArgs.wholeWordOnly;Ce(s).setReversed(!l);var t=l?"/":"?",i=Ce(s).getQuery(),c=s.getScrollInfo();switch(o.searchArgs.querySrc){case"prompt":var r=K.macroModeState;r.isPlaying?p(h=r.replaySearchQueries.shift(),!0,!1):Re(s,{onClose:function(e){s.scrollTo(c.left,c.top),p(e,!0,!0);var t=K.macroModeState;t.isRecording&&function(e,t){if(e.isPlaying)return;var r=e.latestRegister,n=K.registerController.getRegister(r);n&&n.pushSearchQuery&&n.pushSearchQuery(t)}(t,e)},prefix:t,desc:Te,onKeyUp:function(e,t,r){var n,o,i,a=Ze.keyName(e);"Up"==a||"Down"==a?(n="Up"==a,o=e.target?e.target.selectionEnd:0,r(t=K.searchHistoryController.nextMatch(t,n)||""),o&&e.target&&(e.target.selectionEnd=e.target.selectionStart=Math.min(o,e.target.value.length))):"Left"!=a&&"Right"!=a&&"Ctrl"!=a&&"Alt"!=a&&"Shift"!=a&&K.searchHistoryController.reset();try{i=Ee(s,t,!0,!0)}catch(e){}i?s.scrollIntoView(Ie(s,!l,i),30):(Ke(s),s.scrollTo(c.left,c.top))},onKeyDown:function(e,t,r){var n=Ze.keyName(e);"Esc"==n||"Ctrl-C"==n||"Ctrl-["==n||"Backspace"==n&&""==t?(K.searchHistoryController.pushInput(t),K.searchHistoryController.reset(),Ee(s,i),Ke(s),s.scrollTo(c.left,c.top),Ze.e_stop(e),P(s),r(),s.focus()):"Up"==n||"Down"==n?Ze.e_stop(e):"Ctrl-U"==n&&(Ze.e_stop(e),r(""))}});break;case"wordUnderCursor":var a=ue(s,!1,0,!1,!0),u=!0;if(a||(a=ue(s,!1,0,!1,!1),u=!1),!a)return;var h=s.getLine(a.start.line).substring(a.start.ch,a.end.ch);h=u&&e?"\\b"+h+"\\b":h.replace(/([.?*+$\[\]\/\\(){}|\-])/g,"\\$1"),K.jumpList.cachedCursor=s.getCursor(),s.setCursor(a.start),p(h,!0,!1)}}function p(t,e,r){K.searchHistoryController.pushInput(t),K.searchHistoryController.reset();try{Ee(s,t,e,r)}catch(e){return Le(s,"Invalid regex: "+t),void P(s)}F.processMotion(s,n,{type:"motion",motion:"findNext",motionArgs:{forward:!0,toJumplist:o.searchArgs.toJumplist}})}},processEx:function(a,e,t){function r(e){K.exCommandHistoryController.pushInput(e),K.exCommandHistoryController.reset(),Fe.processCommand(a,e)}function n(e,t,r){var n,o,i=Ze.keyName(e);("Esc"==i||"Ctrl-C"==i||"Ctrl-["==i||"Backspace"==i&&""==t)&&(K.exCommandHistoryController.pushInput(t),K.exCommandHistoryController.reset(),Ze.e_stop(e),P(a),r(),a.focus()),"Up"==i||"Down"==i?(Ze.e_stop(e),n="Up"==i,o=e.target?e.target.selectionEnd:0,r(t=K.exCommandHistoryController.nextMatch(t,n)||""),o&&e.target&&(e.target.selectionEnd=e.target.selectionStart=Math.min(o,e.target.value.length))):"Ctrl-U"==i?(Ze.e_stop(e),r("")):"Left"!=i&&"Right"!=i&&"Ctrl"!=i&&"Alt"!=i&&"Shift"!=i&&K.exCommandHistoryController.reset()}"keyToEx"==t.type?Fe.processCommand(a,t.exArgs.input):e.visualMode?Re(a,{onClose:r,prefix:":",value:"'<,'>",onKeyDown:n,selectValueOnOpen:!1}):Re(a,{onClose:r,prefix:":",onKeyDown:n})},evalInput:function(e,t){var r,n,o,i,a,s,l,c,u,h,p,f,d=t.inputState,m=d.motion,g=d.motionArgs||{},v=d.operator,y=d.operatorArgs||{},k=d.registerName,C=t.sel,w=z(t.visualMode?J(e,C.head):e.getCursor("head")),x=z(t.visualMode?J(e,C.anchor):e.getCursor("anchor")),M=z(w),S=z(x);if(v&&this.recordLastEdit(t,d),0<(n=void 0!==d.repeatOverride?d.repeatOverride:d.getRepeat())&&g.explicitRepeat?g.repeatIsExplicit=!0:(g.noRepeat||!g.explicitRepeat&&0===n)&&(n=1,g.repeatIsExplicit=!1),d.selectedCharacter&&(g.selectedCharacter=y.selectedCharacter=d.selectedCharacter),g.repeat=n,P(e),m){var A,b,L=W[m](e,w,g,t,d);if(t.lastMotion=W[m],!L)return;g.toJumplist&&((b=(A=K.jumpList).cachedCursor)?(he(e,b,L),delete A.cachedCursor):he(e,w,L)),s=(s=L instanceof Array?(r=L[0],L[1]):L)||z(w),t.visualMode?(t.visualBlock&&s.ch===1/0||(s=J(e,s)),r=(r=r&&J(e,r))||S,C.anchor=r,C.head=s,ae(e),ve(e,t,"<",Z(r,s)?r:s),ve(e,t,">",Z(r,s)?s:r)):v||(s=J(e,s),e.setCursor(s.line,s.ch))}if(v){if(y.lastSel?(r=S,o=y.lastSel,i=Math.abs(o.head.line-o.anchor.line),a=Math.abs(o.head.ch-o.anchor.ch),s=o.visualLine?tt(S.line+i,S.ch):o.visualBlock?tt(S.line+i,S.ch+a):o.head.line==o.anchor.line?tt(S.line,S.ch+a):tt(S.line+i,S.ch),t.visualMode=!0,t.visualLine=o.visualLine,t.visualBlock=o.visualBlock,C=t.sel={anchor:r,head:s},ae(e)):t.visualMode&&(y.lastSel={anchor:z(C.anchor),head:z(C.head),visualBlock:t.visualBlock,visualLine:t.visualLine}),t.visualMode){if(h=G(C.head,C.anchor),p=Y(C.head,C.anchor),l=t.visualLine||y.linewise,E=se(e,{anchor:h,head:p},c=t.visualBlock?"block":l?"line":"char"),l){var T=E.ranges;if("block"==c)for(var R=0;R<T.length;R++)T[R].head.ch=te(e,T[R].head.line);else"line"==c&&(T[0].head=tt(T[0].head.line+1,0))}}else{h=z(r||S),Z(p=z(s||M),h)&&(u=h,h=p,p=u),(l=g.linewise||y.linewise)?(f=p,h.ch=0,f.ch=0,f.line++):g.forward&&function(e,t,r){var n=e.getRange(t,r);if(/\n\s*$/.test(n)){var o=n.split("\n");o.pop();for(var i=o.pop();0<o.length&&i&&B(i);i=o.pop())r.line--,r.ch=0;i?(r.line--,r.ch=te(e,r.line)):r.ch=0}}(e,h,p);var E=se(e,{anchor:h,head:p},c="char",!g.inclusive||l)}e.setSelections(E.ranges,E.primary),t.lastMotion=null,y.repeat=n,y.registerName=k,y.linewise=l;var O=D[v](e,y,E.ranges,S,s);t.visualMode&&le(e,null!=O),O&&e.setCursor(O)}},recordLastEdit:function(e,t,r){var n=K.macroModeState;n.isPlaying||(e.lastEditInputState=t,e.lastEditActionCommand=r,n.lastInsertModeChanges.changes=[],n.lastInsertModeChanges.expectCursorActivityForChange=!1,n.lastInsertModeChanges.visualBlock=e.visualBlock?e.sel.head.line-e.sel.anchor.line:0)}},W={moveToTopLine:function(e,t,r){var n=Ne(e).top+r.repeat-1;return tt(n,ce(e.getLine(n)))},moveToMiddleLine:function(e){var t=Ne(e),r=Math.floor(.5*(t.top+t.bottom));return tt(r,ce(e.getLine(r)))},moveToBottomLine:function(e,t,r){var n=Ne(e).bottom-r.repeat+1;return tt(n,ce(e.getLine(n)))},expandToLine:function(e,t,r){return tt(t.line+r.repeat-1,1/0)},findNext:function(e,t,r){var n=Ce(e),o=n.getQuery();if(o){var i=!r.forward,i=n.isReversed()?!i:i;return Be(e,o),Ie(e,i,o,r.repeat)}},findAndSelectNextInclusive:function(e,t,r,n,o){var i=Ce(e),a=i.getQuery();if(a){var s=!r.forward,l=function(o,i,a,s,l){void 0===s&&(s=1);return o.operation(function(){var e=o.getCursor(),t=o.getSearchCursor(a,e),r=t.find(!i);!l.visualMode&&r&&X(t.from(),e)&&t.find(!i);for(var n=0;n<s;n++)if(!(r=t.find(i))&&!(t=o.getSearchCursor(a,i?tt(o.lastLine()):tt(o.firstLine(),0))).find(i))return;return[t.from(),t.to()]})}(e,s=i.isReversed()?!s:s,a,r.repeat,n);if(l){if(o.operator)return l;var c=l[0],u=tt(l[1].line,l[1].ch-1);if(n.visualMode){(n.visualLine||n.visualBlock)&&(n.visualLine=!1,n.visualBlock=!1,Ze.signal(e,"vim-mode-change",{mode:"visual",subMode:""}));var h=n.sel.anchor;if(h)return i.isReversed()?r.forward?[h,c]:[h,u]:r.forward?[h,u]:[h,c]}else n.visualMode=!0,n.visualLine=!1,n.visualBlock=!1,Ze.signal(e,"vim-mode-change",{mode:"visual",subMode:""});return s?[u,c]:[c,u]}}},goToMark:function(e,t,r,n){var o=Pe(e,n,r.selectedCharacter);return o?r.linewise?{line:o.line,ch:ce(e.getLine(o.line))}:o:null},moveToOtherHighlightedEnd:function(e,t,r,n){if(n.visualBlock&&r.sameLine){var o=n.sel;return[J(e,tt(o.anchor.line,o.head.ch)),J(e,tt(o.head.line,o.anchor.ch))]}return[n.sel.head,n.sel.anchor]},jumpToMark:function(e,t,r,n){for(var o=t,i=0;i<r.repeat;i++){var a,s,l,c=o;for(var u in n.marks){y(u)&&(a=n.marks[u].find(),(r.forward?Z(a,c):Z(c,a))||r.linewise&&a.line==c.line||(s=X(c,o),l=r.forward?ee(c,a,o):ee(o,a,c),(s||l)&&(o=a)))}}return r.linewise&&(o=tt(o.line,ce(e.getLine(o.line)))),o},moveByCharacters:function(e,t,r){var n=r.repeat,o=r.forward?t.ch+n:t.ch-n;return tt(t.line,o)},moveByLines:function(e,t,r,n){var o=t,i=o.ch;switch(n.lastMotion){case this.moveByLines:case this.moveByDisplayLines:case this.moveByScroll:case this.moveToColumn:case this.moveToEol:i=n.lastHPos;break;default:n.lastHPos=i}var a=r.repeat+(r.repeatOffset||0),s=r.forward?o.line+a:o.line-a,l=e.firstLine(),c=e.lastLine(),u=e.findPosV(o,r.forward?a:-a,"line",n.lastHSPos);return(r.forward?u.line>s:u.line<s)&&(s=u.line,i=u.ch),s<l&&o.line==l?this.moveToStartOfLine(e,t,r,n):c<s&&o.line==c?me(e,t,r,n,!0):(r.toFirstChar&&(i=ce(e.getLine(s)),n.lastHPos=i),n.lastHSPos=e.charCoords(tt(s,i),"div").left,tt(s,i))},moveByDisplayLines:function(e,t,r,n){var o=t;switch(n.lastMotion){case this.moveByDisplayLines:case this.moveByScroll:case this.moveByLines:case this.moveToColumn:case this.moveToEol:break;default:n.lastHSPos=e.charCoords(o,"div").left}var i,a,s=r.repeat,l=e.findPosV(o,r.forward?s:-s,"line",n.lastHSPos);return l.hitSide&&(l=r.forward?(i={top:e.charCoords(l,"div").top+8,left:n.lastHSPos},e.coordsChar(i,"div")):((a=e.charCoords(tt(e.firstLine(),0),"div")).left=n.lastHSPos,e.coordsChar(a,"div"))),n.lastHPos=l.ch,l},moveByPage:function(e,t,r){var n=r.repeat;return e.findPosV(t,r.forward?n:-n,"page")},moveByParagraph:function(e,t,r){var n=r.forward?1:-1;return ye(e,t,r.repeat,n)},moveBySentence:function(e,t,r){var n=r.forward?1:-1;return function(e,t,r,n){function u(e,t){if(t.pos+t.dir<0||t.pos+t.dir>=t.line.length){if(t.ln+=t.dir,!v(e,t.ln))return t.line=null,t.ln=null,void(t.pos=null);t.line=e.getLine(t.ln),t.pos=0<t.dir?0:t.line.length-1}else t.pos+=t.dir}var o={ln:t.line,pos:t.ch};for(;0<r;)o=(n<0?function(e,t,r,n){var o={line:s=e.getLine(t),ln:t,pos:r,dir:n},i={ln:o.ln,pos:null},a=""===o.line;for(u(e,o);null!==o.line;){if(""===o.line&&!a)return null!==i.pos?i:{ln:o.ln,pos:o.pos};if(C(o.line[o.pos])&&null!==i.pos&&(o.ln!==i.ln||o.pos+1!==i.pos))return i;""===o.line||B(o.line[o.pos])||(a=!1,i={ln:o.ln,pos:o.pos}),u(e,o)}for(var s=e.getLine(i.ln),l=i.pos=0;l<s.length;++l)if(!B(s[l])){i.pos=l;break}return i}:function(e,t,r,n){var o=""===(l=e.getLine(t)),i={line:l,ln:t,pos:r,dir:n},a={ln:i.ln,pos:i.pos},s=""===i.line;for(u(e,i);null!==i.line;){if(a.ln=i.ln,a.pos=i.pos,""===i.line&&!s)return{ln:i.ln,pos:i.pos};if(o&&""!==i.line&&!B(i.line[i.pos]))return{ln:i.ln,pos:i.pos};!C(i.line[i.pos])||o||i.pos!==i.line.length-1&&!B(i.line[i.pos+1])||(o=!0),u(e,i)}var l=e.getLine(a.ln);a.pos=0;for(var c=l.length-1;0<=c;--c)if(!B(l[c])){a.pos=c;break}return a})(e,o.ln,o.pos,n),r--;return tt(o.ln,o.pos)}(e,t,r.repeat,n)},moveByScroll:function(e,t,r,n){var o=e.getScrollInfo(),i=null,a=(a=r.repeat)||o.clientHeight/(2*e.defaultTextHeight()),s=e.charCoords(t,"local");if(r.repeat=a,!(i=W.moveByDisplayLines(e,t,r,n)))return null;var l=e.charCoords(i,"local");return e.scrollTo(null,o.top+l.top-s.top),i},moveByWords:function(e,t,r){return function(e,t,r,n,o,i){var a=z(t),s=[];(n&&!o||!n&&o)&&r++;for(var l=!(n&&o),c=0;c<r;c++){var u=function(e,t,r,n,o){var i=t.line,a=t.ch,s=e.getLine(i),l=r?1:-1,c=n?g:m;if(o&&""==s){if(i+=l,s=e.getLine(i),!v(e,i))return null;a=r?0:s.length}for(;;){if(o&&""==s)return{from:0,to:0,line:i};for(var u=0<l?s.length:-1,h=u,p=u;a!=u;){for(var f=!1,d=0;d<c.length&&!f;++d)if(c[d](s.charAt(a))){for(h=a;a!=u&&c[d](s.charAt(a));)a+=l;if(f=h!=(p=a),h==t.ch&&i==t.line&&p==h+l)continue;return{from:Math.min(h,p+1),to:Math.max(h,p),line:i}}f||(a+=l)}if(!v(e,i+=l))return null;s=e.getLine(i),a=0<l?0:s.length}}(e,t,n,i,l);if(!u){var h=te(e,e.lastLine());s.push(n?{line:e.lastLine(),from:h,to:h}:{line:0,from:0,to:0});break}s.push(u),t=tt(u.line,n?u.to-1:u.from)}var p=s.length!=r,f=s[0],d=s.pop();return n&&!o?(p||f.from==a.ch&&f.line==a.line||(d=s.pop()),tt(d.line,d.from)):n&&o?tt(d.line,d.to-1):!n&&o?(p||f.to==a.ch&&f.line==a.line||(d=s.pop()),tt(d.line,d.to)):tt(d.line,d.from)}(e,t,r.repeat,!!r.forward,!!r.wordEnd,!!r.bigWord)},moveTillCharacter:function(e,t,r){var n=ge(e,r.repeat,r.forward,r.selectedCharacter),o=r.forward?-1:1;return pe(o,r),n?(n.ch+=o,n):null},moveToCharacter:function(e,t,r){var n=r.repeat;return pe(0,r),ge(e,n,r.forward,r.selectedCharacter)||t},moveToSymbol:function(e,t,r){return function(e,t,r,n){var o=z(e.getCursor()),i=r?1:-1,a=r?e.lineCount():-1,s=o.ch,l=o.line,c=e.getLine(l),u={lineText:c,nextCh:c.charAt(s),lastCh:null,index:s,symb:n,reverseSymb:(r?{")":"(","}":"{"}:{"(":")","{":"}"})[n],forward:r,depth:0,curMoveThrough:!1},h=fe[n];if(!h)return o;var p=de[h].init,f=de[h].isComplete;p&&p(u);for(;l!==a&&t;){var d;u.index+=i,u.nextCh=u.lineText.charAt(u.index),u.nextCh||(l+=i,u.lineText=e.getLine(l)||"",0<i?u.index=0:(d=u.lineText.length,u.index=0<d?d-1:0),u.nextCh=u.lineText.charAt(u.index)),f(u)&&(o.line=l,o.ch=u.index,t--)}if(u.nextCh||u.curMoveThrough)return tt(l,u.index);return o}(e,r.repeat,r.forward,r.selectedCharacter)||t},moveToColumn:function(e,t,r,n){var o,i,a,s=r.repeat;return n.lastHPos=s-1,n.lastHSPos=e.charCoords(t,"div").left,i=s,a=(o=e).getCursor().line,J(o,tt(a,i-1))},moveToEol:function(e,t,r,n){return me(e,t,r,n,!1)},moveToFirstNonWhiteSpaceCharacter:function(e,t){return tt(t.line,ce(e.getLine(t.line)))},moveToMatchedSymbol:function(e,t){for(var r,n=t,o=n.line,i=n.ch,a=e.getLine(o);i<a.length;i++)if((r=a.charAt(i))&&-1!="()[]{}".indexOf(r)){var s=e.getTokenTypeAt(tt(o,i+1));if("string"!==s&&"comment"!==s)break}if(i<a.length){var l="<"===i||">"===i?/[(){}[\]<>]/:/[(){}[\]]/;return e.findMatchingBracket(tt(o,i),{bracketRegex:l}).to}return n},moveToStartOfLine:function(e,t){return tt(t.line,0)},moveToLineOrEdgeOfDocument:function(e,t,r){var n=r.forward?e.lastLine():e.firstLine();return r.repeatIsExplicit&&(n=r.repeat-e.getOption("firstLineNumber")),tt(n,ce(e.getLine(n)))},textObjectManipulation:function(e,t,r,n){var o=r.selectedCharacter;"b"==o?o="(":"B"==o&&(o="{");var i=!r.textObjectInner;if({"(":")",")":"(","{":"}","}":"{","[":"]","]":"[","<":">",">":"<"}[o])s=function(e,t,r,n){var o,i,a=t,s={"(":/[()]/,")":/[()]/,"[":/[[\]]/,"]":/[[\]]/,"{":/[{}]/,"}":/[{}]/,"<":/[<>]/,">":/[<>]/}[r],l={"(":"(",")":"(","[":"[","]":"[","{":"{","}":"{","<":"<",">":"<"}[r],c=e.getLine(a.line).charAt(a.ch)===l?1:0;if(o=e.scanForBracket(tt(a.line,a.ch+c),-1,void 0,{bracketRegex:s}),i=e.scanForBracket(tt(a.line,a.ch+c),1,void 0,{bracketRegex:s}),!o||!i)return{start:a,end:a};{var u;o=o.pos,i=i.pos,(o.line==i.line&&o.ch>i.ch||o.line>i.line)&&(u=o,o=i,i=u)}n?i.ch+=1:o.ch+=1;return{start:o,end:i}}(e,t,o,i);else if({"'":!0,'"':!0,"`":!0}[o])s=function(e,t,r,n){var o,i,a,s,l=z(t),c=e.getLine(l.line).split(""),u=c.indexOf(r);l.ch<u?l.ch=u:u<l.ch&&c[l.ch]==r&&(i=l.ch,--l.ch);if(c[l.ch]!=r||i)for(a=l.ch;-1<a&&!o;a--)c[a]==r&&(o=a+1);else o=l.ch+1;if(o&&!i)for(a=o,s=c.length;a<s&&!i;a++)c[a]==r&&(i=a);if(!o||!i)return{start:l,end:l};n&&(--o,++i);return{start:tt(l.line,o),end:tt(l.line,i)}}(e,t,o,i);else if("W"===o)s=ue(e,i,0,!0);else if("w"===o)s=ue(e,i,0,!1);else if("p"===o){var a,s=ye(e,t,r.repeat,0,i);r.linewise=!0,n.visualMode?n.visualLine||(n.visualLine=!0):((a=n.inputState.operatorArgs)&&(a.linewise=!0),s.end.line--)}else{if("t"!==o)return null;s=function(e,t,r){var n=t;if(!Ze.findMatchingTag||!Ze.findEnclosingTag)return{start:n,end:n};var o=Ze.findMatchingTag(e,t)||Ze.findEnclosingTag(e,t);if(!o||!o.open||!o.close)return{start:n,end:n};if(r)return{start:o.open.from,end:o.close.to};return{start:o.open.to,end:o.close.from}}(e,t,i)}return e.state.vim.visualMode?function(e,t,r){var n,o=e.state.vim.sel,i=o.head,a=o.anchor;Z(r,t)&&(n=r,r=t,t=n);Z(i,a)?(i=G(t,i),a=Y(a,r)):(a=G(t,a),-1==(i=q(i=Y(i,r),0,-1)).ch&&i.line!=e.firstLine()&&(i=tt(i.line-1,te(e,i.line-1))));return[a,i]}(e,s.start,s.end):[s.start,s.end]},repeatLastCharacterSearch:function(e,t,r){var n=K.lastCharacterSearch,o=r.repeat,i=r.forward===n.forward,a=(n.increment?1:0)*(i?-1:1);e.moveH(-a,"char");var s=ge(e,o,r.inclusive=i,n.selectedCharacter);return s?(s.ch+=a,s):(e.moveH(a,"char"),t)}};function V(e,t){for(var r=[],n=0;n<t;n++)r.push(e);return r}var D={change:function(e,t,r){var n,o,i,a,s,l,c=e.state.vim,u=r[0].anchor,h=r[0].head,p=c.visualMode?t.fullLine?(h.ch=Number.MAX_VALUE,h.line--,e.setSelection(u,h),n=e.getSelection(),e.replaceSelection(""),u):(n=e.getSelection(),o=V("",r.length),e.replaceSelections(o),G(r[0].head,r[0].anchor)):(n=e.getRange(u,h),"moveByWords"!=(i=c.lastEditInputState||{}).motion||B(n)||(a=/\s+$/.exec(n))&&i.motionArgs&&i.motionArgs.forward&&(h=q(h,0,-a[0].length),n=n.slice(0,-a[0].length)),s=new tt(u.line-1,Number.MAX_VALUE),l=e.firstLine()==e.lastLine(),h.line>e.lastLine()&&t.linewise&&!l?e.replaceRange("",s,h):e.replaceRange("",u,h),t.linewise&&(l||(e.setCursor(s),Ze.commands.newlineAndIndent(e)),u.ch=Number.MAX_VALUE),u);K.registerController.pushText(t.registerName,"change",n,t.linewise,1<r.length),U.enterInsertMode(e,{head:p},e.state.vim)},delete:function(e,t,r){var n,o,i,a,s,l=e.state.vim;return l.visualBlock?(o=e.getSelection(),i=V("",r.length),e.replaceSelections(i),n=r[0].anchor):(a=r[0].anchor,s=r[0].head,t.linewise&&s.line!=e.firstLine()&&a.line==e.lastLine()&&a.line==s.line-1&&(a.line==e.firstLine()?a.ch=0:a=tt(a.line-1,te(e,a.line-1))),o=e.getRange(a,s),e.replaceRange("",a,s),n=a,t.linewise&&(n=W.moveToFirstNonWhiteSpaceCharacter(e,a))),K.registerController.pushText(t.registerName,"delete",o,t.linewise,l.visualBlock),J(e,n)},indent:function(e,t,r){var n=e.state.vim,o=r[0].anchor.line,i=n.visualBlock?r[r.length-1].anchor.line:r[0].head.line,a=n.visualMode?t.repeat:1;t.linewise&&i--;for(var s=o;s<=i;s++)for(var l=0;l<a;l++)e.indentLine(s,t.indentRight);return W.moveToFirstNonWhiteSpaceCharacter(e,r[0].anchor)},indentAuto:function(e,t,r){return e.execCommand("indentAuto"),W.moveToFirstNonWhiteSpaceCharacter(e,r[0].anchor)},changeCase:function(e,t,r,n,o){for(var i=e.getSelections(),a=[],s=t.toLower,l=0;l<i.length;l++){var c=i[l],u="";if(!0===s)u=c.toLowerCase();else if(!1===s)u=c.toUpperCase();else for(var h=0;h<c.length;h++){var p=c.charAt(h);u+=k(p)?p.toLowerCase():p.toUpperCase()}a.push(u)}return e.replaceSelections(a),t.shouldMoveCursor?o:!e.state.vim.visualMode&&t.linewise&&r[0].anchor.line+1==r[0].head.line?W.moveToFirstNonWhiteSpaceCharacter(e,n):t.linewise?n:G(r[0].anchor,r[0].head)},yank:function(e,t,r,n){var o=e.state.vim,i=e.getSelection(),a=o.visualMode?G(o.sel.anchor,o.sel.head,r[0].head,r[0].anchor):n;return K.registerController.pushText(t.registerName,"yank",i,t.linewise,o.visualBlock),a}};var U={jumpListWalk:function(e,t,r){var n,o,i,a;r.visualMode||(n=t.repeat,o=t.forward,a=(a=(i=K.jumpList.move(e,o?n:-n))?i.find():void 0)||e.getCursor(),e.setCursor(a))},scroll:function(e,t,r){var n,o,i,a,s,l,c,u;r.visualMode||(n=t.repeat||1,o=e.defaultTextHeight(),i=e.getScrollInfo().top,a=o*n,s=t.forward?i+a:i-a,l=z(e.getCursor()),c=e.charCoords(l,"local"),t.forward?s>c.top?(l.line+=(s-c.top)/o,l.line=Math.ceil(l.line),e.setCursor(l),c=e.charCoords(l,"local"),e.scrollTo(null,c.top)):e.scrollTo(null,s):(u=s+e.getScrollInfo().clientHeight)<c.bottom?(l.line-=(c.bottom-u)/o,l.line=Math.floor(l.line),e.setCursor(l),c=e.charCoords(l,"local"),e.scrollTo(null,c.bottom-e.getScrollInfo().clientHeight)):e.scrollTo(null,s))},scrollToCursor:function(e,t){var r=e.getCursor().line,n=e.charCoords(tt(r,0),"local"),o=e.getScrollInfo().clientHeight,i=n.top,a=n.bottom-i;switch(t.position){case"center":i=i-o/2+a;break;case"bottom":i=i-o+a}e.scrollTo(null,i)},replayMacro:function(e,t,r){var n=t.selectedCharacter,o=t.repeat,i=K.macroModeState;for("@"==n?n=i.latestRegister:i.latestRegister=n;o--;)!function(e,t,r,n){var o=K.registerController.getRegister(n);if(":"==n)return o.keyBuffer[0]&&Fe.processCommand(e,o.keyBuffer[0]),r.isPlaying=!1;var i=o.keyBuffer,a=0;r.isPlaying=!0,r.replaySearchQueries=o.searchQueries.slice(0);for(var s,l,c=0;c<i.length;c++)for(var u,h=i[c];h;){s=/<\w+-.+?>|<\w+>|./.exec(h),l=s[0],h=h.substring(s.index+l.length),Ze.Vim.handleKey(e,l,"macro"),t.insertMode&&(u=o.insertModeChanges[a++].changes,K.macroModeState.lastInsertModeChanges.changes=u,Xe(e,u,1),We(e))}r.isPlaying=!1}(e,r,i,n)},enterMacroRecordMode:function(e,t){var r=K.macroModeState,n=t.selectedCharacter;K.registerController.isValidRegister(n)&&r.enterMacroRecordMode(e,n)},toggleOverwrite:function(e){e.state.overwrite?(e.toggleOverwrite(!1),e.setOption("keyMap","vim-insert"),Ze.signal(e,"vim-mode-change",{mode:"insert"})):(e.toggleOverwrite(!0),e.setOption("keyMap","vim-replace"),Ze.signal(e,"vim-mode-change",{mode:"replace"}))},enterInsertMode:function(e,t,r){if(!e.getOption("readOnly")){r.insertMode=!0,r.insertModeRepeat=t&&t.repeat||1;var n=t?t.insertAt:null,o=r.sel,i=t.head||e.getCursor("head"),a=e.listSelections().length;if("eol"==n)i=tt(i.line,te(e,i.line));else if("bol"==n)i=tt(i.line,0);else if("charAfter"==n)i=q(i,0,1);else if("firstNonBlank"==n)i=W.moveToFirstNonWhiteSpaceCharacter(e,i);else if("startOfSelectedArea"==n){if(!r.visualMode)return;r.visualBlock?(i=tt(Math.min(o.head.line,o.anchor.line),Math.min(o.head.ch,o.anchor.ch)),a=Math.abs(o.head.line-o.anchor.line)+1):i=o.head.line<o.anchor.line?o.head:tt(o.anchor.line,0)}else if("endOfSelectedArea"==n){if(!r.visualMode)return;r.visualBlock?(i=tt(Math.min(o.head.line,o.anchor.line),Math.max(o.head.ch+1,o.anchor.ch)),a=Math.abs(o.head.line-o.anchor.line)+1):i=o.head.line>=o.anchor.line?q(o.head,0,1):tt(o.anchor.line,0)}else if("inplace"==n){if(r.visualMode)return}else"lastEdit"==n&&(i=_e(e)||i);e.setOption("disableInput",!1),t&&t.replace?(e.toggleOverwrite(!0),e.setOption("keyMap","vim-replace"),Ze.signal(e,"vim-mode-change",{mode:"replace"})):(e.toggleOverwrite(!1),e.setOption("keyMap","vim-insert"),Ze.signal(e,"vim-mode-change",{mode:"insert"})),K.macroModeState.isPlaying||(e.on("change",De),Ze.on(e.getInputField(),"keydown",Qe)),r.visualMode&&le(e),oe(e,i,a)}},toggleVisualMode:function(e,t,r){var n,o=t.repeat,i=e.getCursor();r.visualMode?r.visualLine^t.linewise||r.visualBlock^t.blockwise?(r.visualLine=!!t.linewise,r.visualBlock=!!t.blockwise,Ze.signal(e,"vim-mode-change",{mode:"visual",subMode:r.visualLine?"linewise":r.visualBlock?"blockwise":""}),ae(e)):le(e):(r.visualMode=!0,r.visualLine=!!t.linewise,r.visualBlock=!!t.blockwise,n=J(e,tt(i.line,i.ch+o-1)),r.sel={anchor:i,head:n},Ze.signal(e,"vim-mode-change",{mode:"visual",subMode:r.visualLine?"linewise":r.visualBlock?"blockwise":""}),ae(e),ve(e,r,"<",G(i,n)),ve(e,r,">",Y(i,n)))},reselectLastSelection:function(e,t,r){var n=r.lastSelection;if(r.visualMode&&ie(e,r),n){var o=n.anchorMark.find(),i=n.headMark.find();if(!o||!i)return;r.sel={anchor:o,head:i},r.visualMode=!0,r.visualLine=n.visualLine,r.visualBlock=n.visualBlock,ae(e),ve(e,r,"<",G(o,i)),ve(e,r,">",Y(o,i)),Ze.signal(e,"vim-mode-change",{mode:"visual",subMode:r.visualLine?"linewise":r.visualBlock?"blockwise":""})}},joinLines:function(e,t,r){var n,o,i;r.visualMode?(o=e.getCursor("anchor"),Z(n=e.getCursor("head"),o)&&(l=n,n=o,o=l),n.ch=te(e,n.line)-1):(i=Math.max(t.repeat,2),o=e.getCursor(),n=J(e,tt(o.line+i-1,1/0)));for(var a=0,s=o.line;s<n.line;s++){a=te(e,o.line);var l=tt(o.line+1,te(e,o.line+1)),c=e.getRange(o,l),c=t.keepSpaces?c.replace(/\n\r?/g,""):c.replace(/\n\s*/g," ");e.replaceRange(c,o,l)}var u=tt(o.line,a);r.visualMode&&le(e,!1),e.setCursor(u)},newLineAndEnterInsertMode:function(e,t,r){r.insertMode=!0;var n=z(e.getCursor());n.line!==e.firstLine()||t.after?(n.line=t.after?n.line:n.line-1,n.ch=te(e,n.line),e.setCursor(n),(Ze.commands.newlineAndIndentContinueComment||Ze.commands.newlineAndIndent)(e)):(e.replaceRange("\n",tt(e.firstLine(),0)),e.setCursor(e.firstLine(),0)),this.enterInsertMode(e,{repeat:t.repeat},r)},paste:function(n,e,t){var o,i,r,a,s,l,c,u=z(n.getCursor()),h=K.registerController.getRegister(e.registerName),p=h.toString();if(p){e.matchIndent&&(o=n.getOption("tabSize"),i=function(e){var t=e.split("\t").length-1,r=e.split(" ").length-1;return t*o+r},r=n.getLine(n.getCursor().line),a=i(r.match(/^\s*/)[0]),s=p.replace(/\n$/,""),l=p!==s,c=i(p.match(/^\s*/)[0]),p=s.replace(/^\s*/gm,function(e){var t=a+(i(e)-c);if(t<0)return"";if(n.getOption("indentWithTabs")){var r=Math.floor(t/o);return Array(r+1).join("\t")}return Array(t+1).join(" ")}),p+=l?"\n":""),1<e.repeat&&(p=Array(e.repeat+1).join(p));var f,d,m,g,v,y,k,C,w,x,M,S=h.linewise,A=h.blockwise;if(A){p=p.split("\n"),S&&p.pop();for(var b=0;b<p.length;b++)p[b]=""==p[b]?" ":p[b];u.ch+=e.after?1:0,u.ch=Math.min(te(n,u.line),u.ch)}else S?t.visualMode?p=t.visualLine?p.slice(0,-1):"\n"+p.slice(0,p.length-1)+"\n":e.after?(p="\n"+p.slice(0,p.length-1),u.ch=te(n,u.line)):u.ch=0:u.ch+=e.after?1:0;if(t.visualMode){t.lastPastedText=p;var L=(w=n,M=(x=t).lastSelection,(x.visualMode?function(){var e=w.listSelections(),t=e[0],r=e[e.length-1];return[Z(t.anchor,t.head)?t.anchor:t.head,Z(r.anchor,r.head)?r.head:r.anchor]}:function(){var e=w.getCursor(),t=w.getCursor(),r=M.visualBlock;if(r){for(var n=r.width,o=r.height,t=tt(e.line+o,e.ch+n),i=[],a=e.line;a<t.line;a++){var s={anchor:tt(a,e.ch),head:tt(a,t.ch)};i.push(s)}w.setSelections(i)}else{var l=M.anchorMark.find(),c=M.headMark.find(),u=c.line-l.line,h=c.ch-l.ch;t={line:t.line+u,ch:u?t.ch:h+t.ch},M.visualLine&&(e=tt(e.line,0),t=tt(t.line,te(w,t.line))),w.setSelection(e,t)}return[e,t]})()),T=L[0],R=L[1],E=n.getSelection(),O=n.listSelections(),B=new Array(O.length).join("1").split("1");t.lastSelection&&(m=t.lastSelection.headMark.find()),K.registerController.unnamedRegister.setText(E),f=A?(n.replaceSelections(B),R=tt(T.line+p.length-1,T.ch),n.setCursor(T),ne(n,R),n.replaceSelections(p),T):t.visualBlock?(n.replaceSelections(B),n.setCursor(T),n.replaceRange(p,T,T),T):(n.replaceRange(p,T,R),n.posFromIndex(n.indexFromPos(T)+p.length-1)),m&&(t.lastSelection.headMark=n.setBookmark(m)),S&&(f.ch=0)}else if(A){n.setCursor(u);for(b=0;b<p.length;b++){var I=u.line+b;I>n.lastLine()&&n.replaceRange("\n",tt(I,0)),te(n,I)<u.ch&&(g=n,v=I,y=u.ch,0,k=te(g,v),C=new Array(y-k+1).join(" "),g.setCursor(tt(v,k)),g.replaceRange(C,g.getCursor()))}n.setCursor(u),ne(n,tt(u.line+p.length-1,u.ch)),n.replaceSelections(p),f=u}else n.replaceRange(p,u),f=S&&e.after?tt(u.line+1,ce(n.getLine(u.line+1))):S&&!e.after?tt(u.line,ce(n.getLine(u.line))):!S&&e.after?(d=n.indexFromPos(u),n.posFromIndex(d+p.length-1)):(d=n.indexFromPos(u),n.posFromIndex(d+p.length));t.visualMode&&le(n,!1),n.setCursor(f)}},undo:function(e,t){e.operation(function(){Q(e,Ze.commands.undo,t.repeat)(),e.setCursor(e.getCursor("anchor"))})},redo:function(e,t){Q(e,Ze.commands.redo,t.repeat)()},setRegister:function(e,t,r){r.inputState.registerName=t.selectedCharacter},setMark:function(e,t,r){ve(e,r,t.selectedCharacter,e.getCursor())},replace:function(e,t,r){var n,o,i,a,s=t.selectedCharacter,l=e.getCursor(),c=e.listSelections(),u=r.visualMode?(l=e.getCursor("start"),e.getCursor("end")):(n=e.getLine(l.line),(o=l.ch+t.repeat)>n.length&&(o=n.length),tt(l.line,o));"\n"==s?(r.visualMode||e.replaceRange("",l,u),(Ze.commands.newlineAndIndentContinueComment||Ze.commands.newlineAndIndent)(e)):(a=(a=e.getRange(l,u)).replace(/[^\n]/g,s),r.visualBlock?(i=new Array(e.getOption("tabSize")+1).join(" "),a=(a=e.getSelection()).replace(/\t/g,i).replace(/[^\n]/g,s).split("\n"),e.replaceSelections(a)):e.replaceRange(a,l,u),r.visualMode?(l=Z(c[0].anchor,c[0].head)?c[0].anchor:c[0].head,e.setCursor(l),le(e,!1)):e.setCursor(q(u,0,-1)))},incrementNumberToken:function(e,t){for(var r,n,o,i,a,s,l,c,u,h,p,f=e.getCursor(),d=e.getLine(f.line),m=/(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi;null!==(r=m.exec(d))&&(o=(n=r.index)+r[0].length,!(f.ch<o)););!t.backtrack&&o<=f.ch||r&&(i=r[2]||r[4],a=r[3]||r[5],s=t.increase?1:-1,l={"0b":2,0:8,"":10,"0x":16}[i.toLowerCase()],c=(parseInt(r[1]+a,l)+s*t.repeat).toString(l),u=i?new Array(a.length-c.length+1+r[1].length).join("0"):"",c="-"===c.charAt(0)?"-"+i+u+c.substr(1):i+u+c,h=tt(f.line,n),p=tt(f.line,o),e.replaceRange(c,h,p),e.setCursor(tt(f.line,n+c.length-1)))},repeatLastEdit:function(e,t,r){var n;r.lastEditInputState&&((n=t.repeat)&&t.repeatIsExplicit?r.lastEditInputState.repeatOverride=n:n=r.lastEditInputState.repeatOverride||n,ze(e,r,n,!1))},indent:function(e,t){e.indentLine(e.getCursor().line,t.indentRight)},exitInsertMode:We};function J(e,t){var r=e.state.vim,n=r.insertMode||r.visualMode,o=Math.min(Math.max(e.firstLine(),t.line),e.lastLine()),i=te(e,o)-1+!!n,a=Math.min(Math.max(0,t.ch),i);return tt(o,a)}function $(e){var t={};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t}function q(e,t,r){return"object"==typeof t&&(r=t.ch,t=t.line),tt(e.line+t,e.ch+r)}function Q(t,r,n){return function(){for(var e=0;e<n;e++)r(t)}}function z(e){return tt(e.line,e.ch)}function X(e,t){return e.ch==t.ch&&e.line==t.line}function Z(e,t){return e.line<t.line||e.line==t.line&&e.ch<t.ch}function G(e,t){return 2<arguments.length&&(t=G.apply(void 0,Array.prototype.slice.call(arguments,1))),Z(e,t)?e:t}function Y(e,t){return 2<arguments.length&&(t=Y.apply(void 0,Array.prototype.slice.call(arguments,1))),Z(e,t)?t:e}function ee(e,t,r){var n=Z(e,t),o=Z(t,r);return n&&o}function te(e,t){return e.getLine(t).length}function re(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function ne(e,t){var r=[],n=e.listSelections(),o=z(e.clipPos(t)),i=!X(t,o),a=function(e,t,r){for(var n=0;n<e.length;n++){var o="head"!=r&&X(e[n].anchor,t),i="anchor"!=r&&X(e[n].head,t);if(o||i)return n}return-1}(n,e.getCursor("head")),s=X(n[a].head,n[a].anchor),l=n.length-1,c=a<l-a?l:0,u=n[c].anchor,h=Math.min(u.line,o.line),p=Math.max(u.line,o.line),f=u.ch,d=o.ch,m=n[c].head.ch-f,g=d-f;0<m&&g<=0?(f++,i||d--):m<0&&0<=g?(f--,s||d++):m<0&&-1==g&&(f--,d++);for(var v=h;v<=p;v++){var y={anchor:new tt(v,f),head:new tt(v,d)};r.push(y)}return e.setSelections(r),t.ch=d,u.ch=f,u}function oe(e,t,r){for(var n=[],o=0;o<r;o++){var i=q(t,o,0);n.push({anchor:i,head:i})}e.setSelections(n,0)}function ie(e,t){var r=t.sel.anchor,n=t.sel.head;t.lastPastedText&&(n=e.posFromIndex(e.indexFromPos(r)+t.lastPastedText.length),t.lastPastedText=null),t.lastSelection={anchorMark:e.setBookmark(r),headMark:e.setBookmark(n),anchor:z(r),head:z(n),visualMode:t.visualMode,visualLine:t.visualLine,visualBlock:t.visualBlock}}function ae(e,t,r){var n=e.state.vim,o=se(e,t=t||n.sel,r=r||n.visualLine?"line":n.visualBlock?"block":"char");e.setSelections(o.ranges,o.primary),Je(e)}function se(e,t,r,n){var o,i=z(t.head),a=z(t.anchor);if("char"==r){var s=n||Z(t.head,t.anchor)?0:1,l=Z(t.head,t.anchor)?1:0,i=q(t.head,0,s);return{ranges:[{anchor:a=q(t.anchor,0,l),head:i}],primary:0}}if("line"==r)return Z(t.head,t.anchor)?(i.ch=0,a.ch=te(e,a.line)):(a.ch=0,o=e.lastLine(),i.line>o&&(i.line=o),i.ch=te(e,i.line)),{ranges:[{anchor:a,head:i}],primary:0};if("block"==r){for(var c=Math.min(a.line,i.line),u=Math.min(a.ch,i.ch),h=Math.max(a.line,i.line),p=Math.max(a.ch,i.ch)+1,f=h-c+1,d=i.line==c?0:f-1,m=[],g=0;g<f;g++)m.push({anchor:tt(c+g,u),head:tt(c+g,p)});return{ranges:m,primary:d}}}function le(e,t){var r=e.state.vim;!1!==t&&e.setCursor(J(e,r.sel.head)),ie(e,r),r.visualMode=!1,r.visualLine=!1,r.visualBlock=!1,r.insertMode||Ze.signal(e,"vim-mode-change",{mode:"normal"}),$e(r)}function ce(e){if(!e)return 0;var t=e.search(/\S/);return-1==t?e.length:t}function ue(e,t,r,n,o){for(var i,a,s=(a=(i=e).getCursor("head"),1==i.getSelection().length&&(a=G(a,i.getCursor("anchor"))),a),l=e.getLine(s.line),c=s.ch,u=o?m[0]:g[0];!u(l.charAt(c));)if(++c>=l.length)return null;n?u=g[0]:(u=m[0])(l.charAt(c))||(u=m[1]);for(var h=c,p=c;u(l.charAt(h))&&h<l.length;)h++;for(;u(l.charAt(p))&&0<=p;)p--;if(p++,t){for(var f=h;/\s/.test(l.charAt(h))&&h<l.length;)h++;if(f==h){for(var d=p;/\s/.test(l.charAt(p-1))&&0<p;)p--;p=p||d}}return{start:tt(s.line,p),end:tt(s.line,h)}}function he(e,t,r){X(t,r)||K.jumpList.add(e,t,r)}function pe(e,t){K.lastCharacterSearch.increment=e,K.lastCharacterSearch.forward=t.forward,K.lastCharacterSearch.selectedCharacter=t.selectedCharacter}var fe={"(":"bracket",")":"bracket","{":"bracket","}":"bracket","[":"section","]":"section","*":"comment","/":"comment",m:"method",M:"method","#":"preprocess"},de={bracket:{isComplete:function(e){if(e.nextCh===e.symb){if(e.depth++,1<=e.depth)return!0}else e.nextCh===e.reverseSymb&&e.depth--;return!1}},section:{init:function(e){e.curMoveThrough=!0,e.symb=(e.forward?"]":"[")===e.symb?"{":"}"},isComplete:function(e){return 0===e.index&&e.nextCh===e.symb}},comment:{isComplete:function(e){var t="*"===e.lastCh&&"/"===e.nextCh;return e.lastCh=e.nextCh,t}},method:{init:function(e){e.symb="m"===e.symb?"{":"}",e.reverseSymb="{"===e.symb?"}":"{"},isComplete:function(e){return e.nextCh===e.symb}},preprocess:{init:function(e){e.index=0},isComplete:function(e){if("#"===e.nextCh){var t=e.lineText.match(/#(\w+)/)[1];if("endif"===t){if(e.forward&&0===e.depth)return!0;e.depth++}else if("if"===t){if(!e.forward&&0===e.depth)return!0;e.depth--}if("else"===t&&0===e.depth)return!0}return!1}}};function me(e,t,r,n,o){var i=tt(t.line+r.repeat-1,1/0),a=e.clipPos(i);return a.ch--,o||(n.lastHPos=1/0,n.lastHSPos=e.charCoords(a,"div").left),i}function ge(e,t,r,n){for(var o,i=e.getCursor(),a=i.ch,s=0;s<t;s++){if(-1==(o=function(e,t,r,n,o){var i;n?-1==(i=t.indexOf(r,e+1))||o||--i:-1==(i=t.lastIndexOf(r,e-1))||o||(i+=1);return i}(a,e.getLine(i.line),n,r,!0)))return null;a=o}return tt(e.getCursor().line,o)}function ve(e,t,r,n){w(r,f)&&(t.marks[r]&&t.marks[r].clear(),t.marks[r]=e.setBookmark(n))}function ye(t,e,r,n,o){var i,a=e.line,s=t.firstLine(),l=t.lastLine(),c=a;function u(e){return!t.getLine(e)}function h(e,t,r){return r?u(e)!=u(e+t):!u(e)&&u(e+t)}if(n){for(;s<=c&&c<=l&&0<r;)h(c,n)&&r--,c+=n;return new tt(c,0)}var p,f=t.state.vim;f.visualLine&&h(a,1,!0)&&(h((p=f.sel.anchor).line,-1,!0)&&(o&&p.line==a||(a+=1)));for(var d=u(a),c=a;c<=l&&r;c++)h(c,1,!0)&&(o&&u(c)==d||r--);for(i=new tt(c,0),l<c&&!d?d=!0:o=!1,c=a;s<c&&(o&&u(c)!=d&&c!=a||!h(c,-1,!0));c--);return{start:new tt(c,0),end:i}}function ke(){}function Ce(e){var t=e.state.vim;return t.searchState_||(t.searchState_=new ke)}function we(e,t){var r=xe(e,t)||[];if(!r.length)return[];var n=[];if(0===r[0]){for(var o=0;o<r.length;o++)"number"==typeof r[o]&&n.push(e.substring(r[o]+1,r[o+1]));return n}}function xe(e,t){t=t||"/";for(var r=!1,n=[],o=0;o<e.length;o++){var i=e.charAt(o);r||i!=t||n.push(o),r=!r&&"\\"==i}return n}M("pcre",!0,"boolean"),ke.prototype={getQuery:function(){return K.query},setQuery:function(e){K.query=e},getOverlay:function(){return this.searchOverlay},setOverlay:function(e){this.searchOverlay=e},isReversed:function(){return K.isReversed},setReversed:function(e){K.isReversed=e},getScrollbarAnnotate:function(){return this.annotate},setScrollbarAnnotate:function(e){this.annotate=e}};var Me={"\\n":"\n","\\r":"\r","\\t":"\t"};function Se(e){for(var t,r=!1,n=[],o=-1;o<e.length;o++){var i=e.charAt(o)||"",a=e.charAt(o+1)||"";Me[i+a]?(n.push(Me[i+a]),o++):r?(n.push(i),r=!1):"\\"===i?(r=!0,t=a,u.test(t)||"$"===a?n.push("$"):"/"!==a&&"\\"!==a&&n.push("\\")):("$"===i&&n.push("$"),n.push(i),"/"===a&&n.push("\\"))}return n.join("")}var Ae={"\\/":"/","\\\\":"\\","\\n":"\n","\\r":"\r","\\t":"\t","\\&":"&"};function be(e,t,r){if(K.registerController.getRegister("/").setText(e),e instanceof RegExp)return e;var n,o,i=xe(e,"/");return i.length?(n=e.substring(0,i[0]),o=-1!=e.substring(i[0]).indexOf("i")):n=e,n?(A("pcre")||(n=function(e){for(var t=!1,r=[],n=-1;n<e.length;n++){var o=e.charAt(n)||"",i=e.charAt(n+1)||"",a=i&&-1!="|(){".indexOf(i);t?("\\"===o&&a||r.push(o),t=!1):"\\"===o?(t=!0,i&&-1!="}".indexOf(i)&&(a=!0),a&&"\\"!==i||r.push(o)):(r.push(o),a&&"\\"!==i&&r.push("\\"))}return r.join("")}(n)),r&&(t=/^[^A-Z]*$/.test(n)),new RegExp(n,t||o?"i":void 0)):null}function Le(e,t){e.openNotification?e.openNotification('<span style="color: red">'+t+"</span>",{bottom:!0,duration:5e3}):alert(t)}var Te="(Javascript regexp)";function Re(e,t){var r,n,o,i,a,s,l,c,u=(t.prefix||"")+" "+(t.desc||""),h=(r=t.prefix,n=t.desc,o='<span style="font-family: monospace; white-space: pre">'+(r||"")+'<input type="text" autocorrect="off" autocapitalize="off" spellcheck="false"></span>',n&&(o+=' <span style="color: #888">'+n+"</span>"),o);i=e,a=h,s=u,l=t.onClose,c=t,i.openDialog?i.openDialog(a,l,{bottom:!0,value:c.value,onKeyDown:c.onKeyDown,onKeyUp:c.onKeyUp,selectValueOnOpen:!1}):l(prompt(s,""))}function Ee(e,t,r,n){if(t){var o=Ce(e),i=be(t,!!r,!!n);if(i)return Be(e,i),function(e,t){if(e instanceof RegExp&&t instanceof RegExp){for(var r=["global","multiline","ignoreCase","source"],n=0;n<r.length;n++){var o=r[n];if(e[o]!==t[o])return}return 1}}(i,o.getQuery())||o.setQuery(i),i}}var Oe=0;function Be(o,i){clearTimeout(Oe),Oe=setTimeout(function(){var r,n,e=Ce(o),t=e.getOverlay();t&&i==t.query||(t&&o.removeOverlay(t),"^"==(r=i).source.charAt(0)&&(n=!0),t={token:function(e){if(!n||e.sol()){var t=e.match(r,!1);if(t)return 0==t[0].length?(e.next(),"searching"):e.sol()||(e.backUp(1),r.exec(e.next()+t[0]))?(e.match(r),"searching"):(e.next(),null);for(;!e.eol()&&(e.next(),!e.match(r,!1)););}else e.skipToEnd()},query:r},o.addOverlay(t),o.showMatchesOnScrollbar&&(e.getScrollbarAnnotate()&&e.getScrollbarAnnotate().clear(),e.setScrollbarAnnotate(o.showMatchesOnScrollbar(i))),e.setOverlay(t))},50)}function Ie(o,i,a,s){return void 0===s&&(s=1),o.operation(function(){for(var e=o.getCursor(),t=o.getSearchCursor(a,e),r=0;r<s;r++){var n=t.find(i);if(0==r&&n&&X(t.from(),e)&&(n=t.find(i)),!n&&!(t=o.getSearchCursor(a,i?tt(o.lastLine()):tt(o.firstLine(),0))).find(i))return}return t.from()})}function Ke(e){var t=Ce(e);e.removeOverlay(Ce(e).getOverlay()),t.setOverlay(null),t.getScrollbarAnnotate()&&(t.getScrollbarAnnotate().clear(),t.setScrollbarAnnotate(null))}function Ne(e){var t=e.getScrollInfo(),r=e.coordsChar({left:0,top:6+t.top},"local"),n=t.clientHeight-10+t.top,o=e.coordsChar({left:0,top:n},"local");return{top:r.line,bottom:o.line}}function Pe(e,t,r){if("'"==r||"`"==r)return K.jumpList.find(e,-1)||tt(0,0);if("."==r)return _e(e);var n=t.marks[r];return n&&n.find()}function _e(e){for(var t=e.doc.history.done,r=t.length;r--;)if(t[r].changes)return z(t[r].changes[0].to)}function je(){this.buildCommandMap_()}je.prototype={processCommand:function(e,t,r){var n=this;e.operation(function(){e.curOp.isVimOp=!0,n._processCommand(e,t,r)})},_processCommand:function(t,e,r){var n=t.state.vim,o=K.registerController.getRegister(":"),i=o.toString();n.visualMode&&le(t);var a=new Ze.StringStream(e);o.setText(e);var s,l,c=r||{};c.input=e;try{this.parseInput_(t,a,c)}catch(e){throw Le(t,e),e}if(c.commandName){if(s=this.matchCommand_(c.commandName)){if(l=s.name,s.excludeFromCommandHistory&&o.setText(i),this.parseCommandArgs_(a,c,s),"exToKey"==s.type){for(var u=0;u<s.toKeys.length;u++)Ze.Vim.handleKey(t,s.toKeys[u],"mapping");return}if("exToEx"==s.type)return void this.processCommand(t,s.toInput)}}else void 0!==c.line&&(l="move");if(l)try{He[l](t,c),s&&s.possiblyAsync||!c.callback||c.callback()}catch(e){throw Le(t,e),e}else Le(t,'Not an editor command ":'+e+'"')},parseInput_:function(e,t,r){t.eatWhile(":"),t.eat("%")?(r.line=e.firstLine(),r.lineEnd=e.lastLine()):(r.line=this.parseLineSpec_(e,t),void 0!==r.line&&t.eat(",")&&(r.lineEnd=this.parseLineSpec_(e,t)));var n=t.match(/^(\w+|!!|@@|[!#&*<=>@~])/);return r.commandName=n?n[1]:t.match(/.*/)[0],r},parseLineSpec_:function(e,t){var r=t.match(/^(\d+)/);if(r)return parseInt(r[1],10)-1;switch(t.next()){case".":return this.parseLineSpecOffset_(t,e.getCursor().line);case"$":return this.parseLineSpecOffset_(t,e.lastLine());case"'":var n=t.next(),o=Pe(e,e.state.vim,n);if(!o)throw new Error("Mark not set");return this.parseLineSpecOffset_(t,o.line);case"-":case"+":return t.backUp(1),this.parseLineSpecOffset_(t,e.getCursor().line);default:return void t.backUp(1)}},parseLineSpecOffset_:function(e,t){var r,n=e.match(/^([+-])?(\d+)/);return n&&(r=parseInt(n[2],10),"-"==n[1]?t-=r:t+=r),t},parseCommandArgs_:function(e,t,r){var n,o;e.eol()||(t.argString=e.match(/.*/)[0],n=r.argDelimiter||/\s+/,(o=re(t.argString).split(n)).length&&o[0]&&(t.args=o))},matchCommand_:function(e){for(var t=e.length;0<t;t--){var r=e.substring(0,t);if(this.commandMap_[r]){var n=this.commandMap_[r];if(0===n.name.indexOf(e))return n}}return null},buildCommandMap_:function(){this.commandMap_={};for(var e=0;e<et.length;e++){var t=et[e],r=t.shortName||t.name;this.commandMap_[r]=t}},map:function(e,t,r){if(":"!=e&&":"==e.charAt(0)){if(r)throw Error("Mode not supported for ex mappings");var n=e.substring(1);":"!=t&&":"==t.charAt(0)?this.commandMap_[n]={name:n,type:"exToEx",toInput:t.substring(1),user:!0}:this.commandMap_[n]={name:n,type:"exToKey",toKeys:t,user:!0}}else{var o;o=":"!=t&&":"==t.charAt(0)?{keys:e,type:"keyToEx",exArgs:{input:t.substring(1)}}:{keys:e,type:"keyToKey",toKeys:t},r&&(o.context=r),Ge.unshift(o)}},unmap:function(e,t){if(":"!=e&&":"==e.charAt(0)){if(t)throw Error("Mode not supported for ex mappings");var r=e.substring(1);if(this.commandMap_[r]&&this.commandMap_[r].user)return void delete this.commandMap_[r]}else for(var n=e,o=0;o<Ge.length;o++)if(n==Ge[o].keys&&Ge[o].context===t)return void Ge.splice(o,1);throw Error("No such mapping.")}};var He={colorscheme:function(e,t){!t.args||t.args.length<1?Le(e,e.getOption("theme")):e.setOption("theme",t.args[0])},map:function(e,t,r){var n=t.args;!n||n.length<2?e&&Le(e,"Invalid mapping: "+t.input):Fe.map(n[0],n[1],r)},imap:function(e,t){this.map(e,t,"insert")},nmap:function(e,t){this.map(e,t,"normal")},vmap:function(e,t){this.map(e,t,"visual")},unmap:function(e,t,r){var n=t.args;!n||n.length<1?e&&Le(e,"No such mapping: "+t.input):Fe.unmap(n[0],r)},move:function(e,t){F.processCommand(e,e.state.vim,{type:"motion",motion:"moveToLineOrEdgeOfDocument",motionArgs:{forward:!1,explicitRepeat:!0,linewise:!0},repeatOverride:t.line+1})},set:function(e,t){var r=t.args,n=t.setCfg||{};if(!r||r.length<1)e&&Le(e,"Invalid mapping: "+t.input);else{var o=r[0].split("="),i=o[0],a=o[1],s=!1;if("?"==i.charAt(i.length-1)){if(a)throw Error("Trailing characters: "+t.argString);i=i.substring(0,i.length-1),s=!0}void 0===a&&"no"==i.substring(0,2)&&(i=i.substring(2),a=!1);var l,c,u=x[i]&&"boolean"==x[i].type;u&&null==a&&(a=!0),!u&&void 0===a||s?(l=A(i,e,n))instanceof Error?Le(e,l.message):Le(e,!0===l||!1===l?" "+(l?"":"no")+i:" "+i+"="+l):(c=S(i,a,e,n))instanceof Error&&Le(e,c.message)}},setlocal:function(e,t){t.setCfg={scope:"local"},this.set(e,t)},setglobal:function(e,t){t.setCfg={scope:"global"},this.set(e,t)},registers:function(e,t){var r=t.args,n=K.registerController.registers,o="----------Registers----------<br><br>";if(r)for(var r=r.join(""),i=0;i<r.length;i++){a=r.charAt(i),K.registerController.isValidRegister(a)&&(o+='"'+a+" "+(n[a]||new _).toString()+"<br>")}else for(var a in n){var s=n[a].toString();s.length&&(o+='"'+a+" "+s+"<br>")}Le(e,o)},sort:function(e,i){var a,s,l,c,u;var t=function(){if(i.argString){var e=new Ze.StringStream(i.argString);if(e.eat("!")&&(a=!0),e.eol())return;if(!e.eatSpace())return"Invalid arguments";var t=e.match(/([dinuox]+)?\s*(\/.+\/)?\s*/);if(!t&&!e.eol())return"Invalid arguments";if(t[1]){s=-1!=t[1].indexOf("i"),l=-1!=t[1].indexOf("u");var r=-1!=t[1].indexOf("d")||-1!=t[1].indexOf("n")&&1,n=-1!=t[1].indexOf("x")&&1,o=-1!=t[1].indexOf("o")&&1;if(1<r+n+o)return"Invalid arguments";c=(r?"decimal":n&&"hex")||o&&"octal"}t[2]&&(u=new RegExp(t[2].substr(1,t[2].length-2),s?"i":""))}}();if(t)Le(e,t+": "+i.argString);else{var r=i.line||e.firstLine(),n=i.lineEnd||i.line||e.lastLine();if(r!=n){var o=tt(r,0),h=tt(n,te(e,n)),p=e.getRange(o,h).split("\n"),f=u||("decimal"==c?/(-?)([\d]+)/:"hex"==c?/(-?)(?:0x)?([0-9a-f]+)/i:"octal"==c?/([0-7]+)/:null),d="decimal"==c?10:"hex"==c?16:"octal"==c?8:null,m=[],g=[];if(c||u)for(var v=0;v<p.length;v++){var y=u?p[v].match(u):null;y&&""!=y[0]?m.push(y):!u&&f.exec(p[v])?m.push(p[v]):g.push(p[v])}else g=p;if(m.sort(u?function(e,t){var r;return a&&(r=e,e=t,t=r),s&&(e[0]=e[0].toLowerCase(),t[0]=t[0].toLowerCase()),e[0]<t[0]?-1:1}:w),u)for(v=0;v<m.length;v++)m[v]=m[v].input;else c||g.sort(w);if(p=a?m.concat(g):g.concat(m),l)for(var k,C=p,p=[],v=0;v<C.length;v++)C[v]!=k&&p.push(C[v]),k=C[v];e.replaceRange(p.join("\n"),o,h)}}function w(e,t){var r;a&&(r=e,e=t,t=r),s&&(e=e.toLowerCase(),t=t.toLowerCase());var n=c&&f.exec(e),o=c&&f.exec(t);return n?(n=parseInt((n[1]+n[2]).toLowerCase(),d))-(o=parseInt((o[1]+o[2]).toLowerCase(),d)):e<t?-1:1}},global:function(t,e){var r=e.argString;if(r){var n,o=void 0!==e.line?e.line:t.firstLine(),i=e.lineEnd||e.line||t.lastLine(),a=we(r,"/"),s=r;if(a.length&&(s=a[0],n=a.slice(1,a.length).join("/")),s)try{Ee(t,s,!0,!0)}catch(e){return void Le(t,"Invalid regex: "+s)}for(var l,c,u=Ce(t).getQuery(),h=[],p="",f=o;f<=i;f++){u.test(t.getLine(f))&&(h.push(f+1),p+=t.getLine(f)+"<br>")}n?(l=0,(c=function(){var e;l<h.length&&(e=h[l]+n,Fe.processCommand(t,e,{callback:c})),l++})()):Le(t,p)}else Le(t,"Regular Expression missing from global")},substitute:function(t,e){if(!t.getSearchCursor)throw new Error("Search feature not available. Requires searchcursor.js or any other getSearchCursor implementation.");var r,n,o,i,a,s,l,c,u,h=e.argString,p=h?we(h,h[0]):[],f="",d=!1,m=!1;if(p.length)r=p[0],A("pcre")&&""!==r&&(r=new RegExp(r).source),f=p[1],r&&"$"===r[r.length-1]&&(r=r.slice(0,r.length-1)+"\\n",f=f?f+"\n":"\n"),void 0!==f&&(f=A("pcre")?function(e){for(var t=new Ze.StringStream(e),r=[];!t.eol();){for(;t.peek()&&"\\"!=t.peek();)r.push(t.next());var n=!1;for(var o in Ae)if(t.match(o,!0)){n=!0,r.push(Ae[o]);break}n||r.push(t.next())}return r.join("")}(f.replace(/([^\\])&/g,"$1$$&")):Se(f),K.lastSubstituteReplacePart=f),n=p[2]?p[2].split(" "):[];else if(h&&h.length)return void Le(t,"Substitutions should be of the form :s/pattern/replace/");if(n&&(o=n[0],i=parseInt(n[1]),o&&(-1!=o.indexOf("c")&&(d=!0,o.replace("c","")),-1!=o.indexOf("g")&&(m=!0,o.replace("g","")),r=A("pcre")?r+"/"+o:r.replace(/\//g,"\\/")+"/"+o)),r)try{Ee(t,r,!0,!0)}catch(e){return void Le(t,"Invalid regex: "+r)}void 0!==(f=f||K.lastSubstituteReplacePart)?(a=Ce(t).getQuery(),s=void 0!==e.line?e.line:t.getCursor().line,l=e.lineEnd||s,s==t.firstLine()&&l==t.lastLine()&&(l=1/0),i&&(l=(s=l)+i-1),c=J(t,tt(s,0)),u=t.getSearchCursor(a,c),function(o,e,n,i,a,s,t,r,l){o.state.vim.exMode=!0;var c=!1,u=s.from();function h(){o.operation(function(){for(;!c;)p(),f();d()})}function p(){var e=o.getRange(s.from(),s.to()).replace(t,r);s.replace(e)}function f(){for(;s.findNext()&&(e=s.from(),t=i,r=a,"number"!=typeof e&&(e=e.line),t instanceof Array?w(e,t):r?t<=e&&e<=r:e==t);)if(n||!u||s.from().line!=u.line)return o.scrollIntoView(s.from(),30),o.setSelection(s.from(),s.to()),u=s.from(),void(c=!1);var e,t,r;c=!0}function d(e){var t;e&&e(),o.focus(),u&&(o.setCursor(u),(t=o.state.vim).exMode=!1,t.lastHPos=t.lastHSPos=u.ch),l&&l()}if(f(),c)return Le(o,"No matches for "+t.source);if(!e)return h(),l&&l();Re(o,{prefix:"replace with <strong>"+r+"</strong> (y/n/a/q/l)",onKeyDown:function(e,t,r){switch(Ze.e_stop(e),Ze.keyName(e)){case"Y":p(),f();break;case"N":f();break;case"A":var n=l;l=void 0,o.operation(h),l=n;break;case"L":p();case"Q":case"Esc":case"Ctrl-C":case"Ctrl-[":d(r)}return c&&d(r),!0}})}(t,d,m,s,l,u,a,f,e.callback)):Le(t,"No previous substitute regular expression")},redo:Ze.commands.redo,undo:Ze.commands.undo,write:function(e){Ze.commands.save?Ze.commands.save(e):e.save&&e.save()},nohlsearch:function(e){Ke(e)},yank:function(e){var t=z(e.getCursor()).line,r=e.getLine(t);K.registerController.pushText("0","yank",r,!0,!0)},delmarks:function(e,t){if(t.argString&&re(t.argString))for(var r=e.state.vim,n=new Ze.StringStream(re(t.argString));!n.eol();){n.eatSpace();var o=n.pos;if(!n.match(/[a-zA-Z]/,!1))return void Le(e,"Invalid argument: "+t.argString.substring(o));var i=n.next();if(n.match("-",!0)){if(!n.match(/[a-zA-Z]/,!1))return void Le(e,"Invalid argument: "+t.argString.substring(o));var a=i,s=n.next();if(!(y(a)&&y(s)||k(a)&&k(s)))return void Le(e,"Invalid argument: "+a+"-");var l=a.charCodeAt(0),c=s.charCodeAt(0);if(c<=l)return void Le(e,"Invalid argument: "+t.argString.substring(o));for(var u=0;u<=c-l;u++){var h=String.fromCharCode(l+u);delete r.marks[h]}}else delete r.marks[i]}else Le(e,"Argument required")}},Fe=new je;function We(e){var t=e.state.vim,r=K.macroModeState,n=K.registerController.getRegister("."),o=r.isPlaying,i=r.lastInsertModeChanges;o||(e.off("change",De),Ze.off(e.getInputField(),"keydown",Qe)),!o&&1<t.insertModeRepeat&&(ze(e,t,t.insertModeRepeat-1,!0),t.lastEditInputState.repeatOverride=t.insertModeRepeat),delete t.insertModeRepeat,t.insertMode=!1,e.setCursor(e.getCursor().line,e.getCursor().ch-1),e.setOption("keyMap","vim"),e.setOption("disableInput",!0),e.toggleOverwrite(!1),n.setText(i.changes.join("")),Ze.signal(e,"vim-mode-change",{mode:"normal"}),r.isRecording&&function(e){if(e.isPlaying)return;var t=e.latestRegister,r=K.registerController.getRegister(t);r&&r.pushInsertModeChanges&&r.pushInsertModeChanges(e.lastInsertModeChanges)}(r)}function Ve(e){Ge.unshift(e)}function De(e,t){var r,n,o=K.macroModeState,i=o.lastInsertModeChanges;if(!o.isPlaying)for(;t;){i.expectCursorActivityForChange=!0,1<i.ignoreCount?i.ignoreCount--:"+input"!=t.origin&&"paste"!=t.origin&&void 0!==t.origin||(1<(r=e.listSelections().length)&&(i.ignoreCount=r),n=t.text.join("\n"),i.maybeReset&&(i.changes=[],i.maybeReset=!1),n&&(e.state.overwrite&&!/\n/.test(n)?i.changes.push([n]):i.changes.push(n))),t=t.next}}function Ue(e){var t=e.state.vim;if(t.insertMode){var r=K.macroModeState;if(r.isPlaying)return;var n=r.lastInsertModeChanges;n.expectCursorActivityForChange?n.expectCursorActivityForChange=!1:n.maybeReset=!0}else e.curOp.isVimOp||function(e,t){var r=e.getCursor("anchor"),n=e.getCursor("head");t.visualMode&&!e.somethingSelected()?le(e,!1):t.visualMode||t.insertMode||!e.somethingSelected()||(t.visualMode=!0,t.visualLine=!1,Ze.signal(e,"vim-mode-change",{mode:"visual"}));{var o,i;t.visualMode?(o=Z(n,r)?0:-1,i=Z(n,r)?-1:0,n=q(n,0,o),r=q(r,0,i),t.sel={anchor:r,head:n},ve(e,t,"<",G(n,r)),ve(e,t,">",Y(n,r))):t.insertMode||(t.lastHPos=e.getCursor().ch)}}(e,t);t.visualMode&&Je(e)}function Je(e){var t,r="cm-animate-fat-cursor",n=e.state.vim,o=J(e,z(n.sel.head)),i=q(o,0,1);$e(n),o.ch==e.getLine(o.line).length?((t=document.createElement("span")).textContent=" ",t.className=r,n.fakeCursorBookmark=e.setBookmark(o,{widget:t})):n.fakeCursor=e.markText(o,i,{className:r})}function $e(e){e.fakeCursor&&(e.fakeCursor.clear(),e.fakeCursor=null),e.fakeCursorBookmark&&(e.fakeCursorBookmark.clear(),e.fakeCursorBookmark=null)}function qe(e){this.keyName=e}function Qe(e){var t=K.macroModeState.lastInsertModeChanges,r=Ze.keyName(e);r&&(-1==r.indexOf("Delete")&&-1==r.indexOf("Backspace")||Ze.lookupKey(r,"vim-insert",function(){return t.maybeReset&&(t.changes=[],t.maybeReset=!1),t.changes.push(new qe(r)),!0}))}function ze(r,n,e,t){var o=K.macroModeState;o.isPlaying=!0;var i=!!n.lastEditActionCommand,a=n.inputState;function s(){i?F.processAction(r,n,n.lastEditActionCommand):F.evalInput(r,n)}function l(e){var t;0<o.lastInsertModeChanges.changes.length&&(e=n.lastEditActionCommand?e:1,t=o.lastInsertModeChanges,Xe(r,t.changes,e))}if(n.inputState=n.lastEditInputState,i&&n.lastEditActionCommand.interlaceInsertRepeat)for(var c=0;c<e;c++)s(),l(1);else t||s(),l(e);n.inputState=a,n.insertMode&&!t&&We(r),o.isPlaying=!1}function Xe(t,e,r){function n(e){return"string"==typeof e?Ze.commands[e](t):e(t),!0}var o=t.getCursor("head"),i=K.macroModeState.lastInsertModeChanges.visualBlock;i&&(oe(t,o,i+1),r=t.listSelections().length,t.setCursor(o));for(var a=0;a<r;a++){i&&t.setCursor(q(o,a,0));for(var s=0;s<e.length;s++){var l,c,u,h=e[s];h instanceof qe?Ze.lookupKey(h.keyName,"vim-insert",n):"string"==typeof h?(l=t.getCursor(),t.replaceRange(h,l,l)):(u=q(c=t.getCursor(),0,h[0].length),t.replaceRange(h[0],c,u))}}i&&t.setCursor(q(o,0,1))}return Ze.keyMap.vim={attach:o,detach:e,call:t},M("insertModeEscKeysTimeout",200,"number"),Ze.keyMap["vim-insert"]={fallthrough:["default"],attach:o,detach:e,call:t},Ze.keyMap["vim-replace"]={Backspace:"goCharLeft",fallthrough:["vim-insert"],attach:o,detach:e,call:t},O(),I}()}); diff --git a/plugins/tiddlywiki/codemirror-mode-css/files/mode/css/css.js b/plugins/tiddlywiki/codemirror-mode-css/files/mode/css/css.js index 574b23b5a..51732305f 100755 --- a/plugins/tiddlywiki/codemirror-mode-css/files/mode/css/css.js +++ b/plugins/tiddlywiki/codemirror-mode-css/files/mode/css/css.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function t(e){for(var t={},r=0;r<e.length;++r)t[e[r].toLowerCase()]=!0;return t}e.defineMode("css",function(t,r){var o=r.inline;r.propertyKeywords||(r=e.resolveMode("text/css"));var i,a,n=t.indentUnit,l=r.tokenHooks,s=r.documentTypes||{},c=r.mediaTypes||{},d=r.mediaFeatures||{},p=r.mediaValueKeywords||{},u=r.propertyKeywords||{},m=r.nonStandardPropertyKeywords||{},h=r.fontProperties||{},g=r.counterDescriptors||{},b=r.colorKeywords||{},f=r.valueKeywords||{},y=r.allowNested,w=r.lineComment,k=!0===r.supportsAtComponent;function v(e,t){return i=t,e}function x(e){return function(t,r){for(var o,i=!1;null!=(o=t.next());){if(o==e&&!i){")"==e&&t.backUp(1);break}i=!i&&"\\"==o}return(o==e||!i&&")"!=e)&&(r.tokenize=null),v("string","string")}}function z(e,t){return e.next(),e.match(/\s*[\"\')]/,!1)?t.tokenize=null:t.tokenize=x(")"),v(null,"(")}function j(e,t,r){this.type=e,this.indent=t,this.prev=r}function q(e,t,r,o){return e.context=new j(r,t.indentation()+(!1===o?0:n),e.context),r}function P(e){return e.context.prev&&(e.context=e.context.prev),e.context.type}function K(e,t,r){return T[r.context.type](e,t,r)}function C(e,t,r,o){for(var i=o||1;i>0;i--)r.context=r.context.prev;return K(e,t,r)}function B(e){var t=e.current().toLowerCase();a=f.hasOwnProperty(t)?"atom":b.hasOwnProperty(t)?"keyword":"variable"}var T={top:function(e,t,r){if("{"==e)return q(r,t,"block");if("}"==e&&r.context.prev)return P(r);if(k&&/@component/i.test(e))return q(r,t,"atComponentBlock");if(/^@(-moz-)?document$/i.test(e))return q(r,t,"documentTypes");if(/^@(media|supports|(-moz-)?document|import)$/i.test(e))return q(r,t,"atBlock");if(/^@(font-face|counter-style)/i.test(e))return r.stateArg=e,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(e))return"keyframes";if(e&&"@"==e.charAt(0))return q(r,t,"at");if("hash"==e)a="builtin";else if("word"==e)a="tag";else{if("variable-definition"==e)return"maybeprop";if("interpolation"==e)return q(r,t,"interpolation");if(":"==e)return"pseudo";if(y&&"("==e)return q(r,t,"parens")}return r.context.type},block:function(e,t,r){if("word"==e){var o=t.current().toLowerCase();return u.hasOwnProperty(o)?(a="property","maybeprop"):m.hasOwnProperty(o)?(a="string-2","maybeprop"):y?(a=t.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(a+=" error","maybeprop")}return"meta"==e?"block":y||"hash"!=e&&"qualifier"!=e?T.top(e,t,r):(a="error","block")},maybeprop:function(e,t,r){return":"==e?q(r,t,"prop"):K(e,t,r)},prop:function(e,t,r){if(";"==e)return P(r);if("{"==e&&y)return q(r,t,"propBlock");if("}"==e||"{"==e)return C(e,t,r);if("("==e)return q(r,t,"parens");if("hash"!=e||/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(t.current())){if("word"==e)B(t);else if("interpolation"==e)return q(r,t,"interpolation")}else a+=" error";return"prop"},propBlock:function(e,t,r){return"}"==e?P(r):"word"==e?(a="property","maybeprop"):r.context.type},parens:function(e,t,r){return"{"==e||"}"==e?C(e,t,r):")"==e?P(r):"("==e?q(r,t,"parens"):"interpolation"==e?q(r,t,"interpolation"):("word"==e&&B(t),"parens")},pseudo:function(e,t,r){return"meta"==e?"pseudo":"word"==e?(a="variable-3",r.context.type):K(e,t,r)},documentTypes:function(e,t,r){return"word"==e&&s.hasOwnProperty(t.current())?(a="tag",r.context.type):T.atBlock(e,t,r)},atBlock:function(e,t,r){if("("==e)return q(r,t,"atBlock_parens");if("}"==e||";"==e)return C(e,t,r);if("{"==e)return P(r)&&q(r,t,y?"block":"top");if("interpolation"==e)return q(r,t,"interpolation");if("word"==e){var o=t.current().toLowerCase();a="only"==o||"not"==o||"and"==o||"or"==o?"keyword":c.hasOwnProperty(o)?"attribute":d.hasOwnProperty(o)?"property":p.hasOwnProperty(o)?"keyword":u.hasOwnProperty(o)?"property":m.hasOwnProperty(o)?"string-2":f.hasOwnProperty(o)?"atom":b.hasOwnProperty(o)?"keyword":"error"}return r.context.type},atComponentBlock:function(e,t,r){return"}"==e?C(e,t,r):"{"==e?P(r)&&q(r,t,y?"block":"top",!1):("word"==e&&(a="error"),r.context.type)},atBlock_parens:function(e,t,r){return")"==e?P(r):"{"==e||"}"==e?C(e,t,r,2):T.atBlock(e,t,r)},restricted_atBlock_before:function(e,t,r){return"{"==e?q(r,t,"restricted_atBlock"):"word"==e&&"@counter-style"==r.stateArg?(a="variable","restricted_atBlock_before"):K(e,t,r)},restricted_atBlock:function(e,t,r){return"}"==e?(r.stateArg=null,P(r)):"word"==e?(a="@font-face"==r.stateArg&&!h.hasOwnProperty(t.current().toLowerCase())||"@counter-style"==r.stateArg&&!g.hasOwnProperty(t.current().toLowerCase())?"error":"property","maybeprop"):"restricted_atBlock"},keyframes:function(e,t,r){return"word"==e?(a="variable","keyframes"):"{"==e?q(r,t,"top"):K(e,t,r)},at:function(e,t,r){return";"==e?P(r):"{"==e||"}"==e?C(e,t,r):("word"==e?a="tag":"hash"==e&&(a="builtin"),"at")},interpolation:function(e,t,r){return"}"==e?P(r):"{"==e||";"==e?C(e,t,r):("word"==e?a="variable":"variable"!=e&&"("!=e&&")"!=e&&(a="error"),"interpolation")}};return{startState:function(e){return{tokenize:null,state:o?"block":"top",stateArg:null,context:new j(o?"block":"top",e||0,null)}},token:function(e,t){if(!t.tokenize&&e.eatSpace())return null;var r=(t.tokenize||function(e,t){var r=e.next();if(l[r]){var o=l[r](e,t);if(!1!==o)return o}return"@"==r?(e.eatWhile(/[\w\\\-]/),v("def",e.current())):"="==r||("~"==r||"|"==r)&&e.eat("=")?v(null,"compare"):'"'==r||"'"==r?(t.tokenize=x(r),t.tokenize(e,t)):"#"==r?(e.eatWhile(/[\w\\\-]/),v("atom","hash")):"!"==r?(e.match(/^\s*\w*/),v("keyword","important")):/\d/.test(r)||"."==r&&e.eat(/\d/)?(e.eatWhile(/[\w.%]/),v("number","unit")):"-"!==r?/[,+>*\/]/.test(r)?v(null,"select-op"):"."==r&&e.match(/^-?[_a-z][_a-z0-9-]*/i)?v("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(r)?v(null,r):("u"==r||"U"==r)&&e.match(/rl(-prefix)?\(/i)||("d"==r||"D"==r)&&e.match("omain(",!0,!0)||("r"==r||"R"==r)&&e.match("egexp(",!0,!0)?(e.backUp(1),t.tokenize=z,v("property","word")):/[\w\\\-]/.test(r)?(e.eatWhile(/[\w\\\-]/),v("property","word")):v(null,null):/[\d.]/.test(e.peek())?(e.eatWhile(/[\w.%]/),v("number","unit")):e.match(/^-[\w\\\-]+/)?(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?v("variable-2","variable-definition"):v("variable-2","variable")):e.match(/^\w+-/)?v("meta","meta"):void 0})(e,t);return r&&"object"==typeof r&&(i=r[1],r=r[0]),a=r,"comment"!=i&&(t.state=T[t.state](i,e,t)),a},indent:function(e,t){var r=e.context,o=t&&t.charAt(0),i=r.indent;return"prop"!=r.type||"}"!=o&&")"!=o||(r=r.prev),r.prev&&("}"!=o||"block"!=r.type&&"top"!=r.type&&"interpolation"!=r.type&&"restricted_atBlock"!=r.type?(")"!=o||"parens"!=r.type&&"atBlock_parens"!=r.type)&&("{"!=o||"at"!=r.type&&"atBlock"!=r.type)||(i=Math.max(0,r.indent-n)):i=(r=r.prev).indent),i},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:w,fold:"brace"}});var r=["domain","regexp","url","url-prefix"],o=t(r),i=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],a=t(i),n=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","orientation","device-pixel-ratio","min-device-pixel-ratio","max-device-pixel-ratio","pointer","any-pointer","hover","any-hover"],l=t(n),s=["landscape","portrait","none","coarse","fine","on-demand","hover","interlace","progressive"],c=t(s),d=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-gap","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-gap","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","justify-items","justify-self","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","place-content","place-items","place-self","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","user-select","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],p=t(d),u=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],m=t(u),h=t(["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]),g=t(["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"]),b=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],f=t(b),y=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","auto-flow","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","color","color-burn","color-dodge","column","column-reverse","compact","condensed","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","darken","dashed","decimal","decimal-leading-zero","default","default-button","dense","destination-atop","destination-in","destination-out","destination-over","devanagari","difference","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","exclusion","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","flex-end","flex-start","footnotes","forwards","from","geometricPrecision","georgian","graytext","grid","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hard-light","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","hue","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-grid","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","lighten","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","luminosity","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","multiply","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","opacity","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row","row-resize","row-reverse","rtl","run-in","running","s-resize","sans-serif","saturation","scale","scale3d","scaleX","scaleY","scaleZ","screen","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","self-start","self-end","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","soft-light","solid","somali","source-atop","source-in","source-out","source-over","space","space-around","space-between","space-evenly","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","system-ui","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","transform","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","unset","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","wrap","wrap-reverse","x-large","x-small","xor","xx-large","xx-small"],w=t(y),k=r.concat(i).concat(n).concat(s).concat(d).concat(u).concat(b).concat(y);function v(e,t){for(var r,o=!1;null!=(r=e.next());){if(o&&"/"==r){t.tokenize=null;break}o="*"==r}return["comment","comment"]}e.registerHelper("hintWords","css",k),e.defineMIME("text/css",{documentTypes:o,mediaTypes:a,mediaFeatures:l,mediaValueKeywords:c,propertyKeywords:p,nonStandardPropertyKeywords:m,fontProperties:h,counterDescriptors:g,colorKeywords:f,valueKeywords:w,tokenHooks:{"/":function(e,t){return!!e.eat("*")&&(t.tokenize=v,v(e,t))}},name:"css"}),e.defineMIME("text/x-scss",{mediaTypes:a,mediaFeatures:l,mediaValueKeywords:c,propertyKeywords:p,nonStandardPropertyKeywords:m,colorKeywords:f,valueKeywords:w,fontProperties:h,allowNested:!0,lineComment:"//",tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=v,v(e,t)):["operator","operator"]},":":function(e){return!!e.match(/\s*\{/,!1)&&[null,null]},$:function(e){return e.match(/^[\w-]+/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"]},"#":function(e){return!!e.eat("{")&&[null,"interpolation"]}},name:"css",helperType:"scss"}),e.defineMIME("text/x-less",{mediaTypes:a,mediaFeatures:l,mediaValueKeywords:c,propertyKeywords:p,nonStandardPropertyKeywords:m,colorKeywords:f,valueKeywords:w,fontProperties:h,allowNested:!0,lineComment:"//",tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=v,v(e,t)):["operator","operator"]},"@":function(e){return e.eat("{")?[null,"interpolation"]:!e.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i,!1)&&(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"])},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"}),e.defineMIME("text/x-gss",{documentTypes:o,mediaTypes:a,mediaFeatures:l,propertyKeywords:p,nonStandardPropertyKeywords:m,fontProperties:h,counterDescriptors:g,colorKeywords:f,valueKeywords:w,supportsAtComponent:!0,tokenHooks:{"/":function(e,t){return!!e.eat("*")&&(t.tokenize=v,v(e,t))}},name:"css",helperType:"gss"})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(T){"use strict";function e(e){for(var t={},r=0;r<e.length;++r)t[e[r].toLowerCase()]=!0;return t}T.defineMode("css",function(e,t){var r=t.inline;t.propertyKeywords||(t=T.resolveMode("text/css"));var a,i,n=e.indentUnit,l=t.tokenHooks,o=t.documentTypes||{},s=t.mediaTypes||{},d=t.mediaFeatures||{},c=t.mediaValueKeywords||{},p=t.propertyKeywords||{},u=t.nonStandardPropertyKeywords||{},m=t.fontProperties||{},b=t.counterDescriptors||{},g=t.colorKeywords||{},h=t.valueKeywords||{},f=t.allowNested,k=t.lineComment,y=!0===t.supportsAtComponent,w=!1!==e.highlightNonStandardPropertyKeywords;function v(e,t){return a=t,e}function x(i){return function(e,t){for(var r,o=!1;null!=(r=e.next());){if(r==i&&!o){")"==i&&e.backUp(1);break}o=!o&&"\\"==r}return r!=i&&(o||")"==i)||(t.tokenize=null),a="string"}}function z(e,t){return e.next(),e.match(/\s*[\"\')]/,!1)?t.tokenize=null:t.tokenize=x(")"),a="(",null}function j(e,t,r){this.type=e,this.indent=t,this.prev=r}function P(e,t,r,o){return e.context=new j(r,t.indentation()+(!1===o?0:n),e.context),r}function K(e){return e.context.prev&&(e.context=e.context.prev),e.context.type}function q(e,t,r){return _[r.context.type](e,t,r)}function C(e,t,r,o){for(var i=o||1;0<i;i--)r.context=r.context.prev;return q(e,t,r)}function B(e){var t=e.current().toLowerCase();i=h.hasOwnProperty(t)?"atom":g.hasOwnProperty(t)?"keyword":"variable"}var _={top:function(e,t,r){if("{"==e)return P(r,t,"block");if("}"==e&&r.context.prev)return K(r);if(y&&/@component/i.test(e))return P(r,t,"atComponentBlock");if(/^@(-moz-)?document$/i.test(e))return P(r,t,"documentTypes");if(/^@(media|supports|(-moz-)?document|import)$/i.test(e))return P(r,t,"atBlock");if(/^@(font-face|counter-style)/i.test(e))return r.stateArg=e,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(e))return"keyframes";if(e&&"@"==e.charAt(0))return P(r,t,"at");if("hash"==e)i="builtin";else if("word"==e)i="tag";else{if("variable-definition"==e)return"maybeprop";if("interpolation"==e)return P(r,t,"interpolation");if(":"==e)return"pseudo";if(f&&"("==e)return P(r,t,"parens")}return r.context.type},block:function(e,t,r){if("word"!=e)return"meta"==e?"block":f||"hash"!=e&&"qualifier"!=e?_.top(e,t,r):(i="error","block");var o=t.current().toLowerCase();return p.hasOwnProperty(o)?(i="property","maybeprop"):u.hasOwnProperty(o)?(i=w?"string-2":"property","maybeprop"):f?(i=t.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(i+=" error","maybeprop")},maybeprop:function(e,t,r){return":"==e?P(r,t,"prop"):q(e,t,r)},prop:function(e,t,r){if(";"==e)return K(r);if("{"==e&&f)return P(r,t,"propBlock");if("}"==e||"{"==e)return C(e,t,r);if("("==e)return P(r,t,"parens");if("hash"!=e||/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(t.current())){if("word"==e)B(t);else if("interpolation"==e)return P(r,t,"interpolation")}else i+=" error";return"prop"},propBlock:function(e,t,r){return"}"==e?K(r):"word"==e?(i="property","maybeprop"):r.context.type},parens:function(e,t,r){return"{"==e||"}"==e?C(e,t,r):")"==e?K(r):"("==e?P(r,t,"parens"):"interpolation"==e?P(r,t,"interpolation"):("word"==e&&B(t),"parens")},pseudo:function(e,t,r){return"meta"==e?"pseudo":"word"==e?(i="variable-3",r.context.type):q(e,t,r)},documentTypes:function(e,t,r){return"word"==e&&o.hasOwnProperty(t.current())?(i="tag",r.context.type):_.atBlock(e,t,r)},atBlock:function(e,t,r){return"("==e?P(r,t,"atBlock_parens"):"}"==e||";"==e?C(e,t,r):"{"==e?K(r)&&P(r,t,f?"block":"top"):"interpolation"==e?P(r,t,"interpolation"):("word"==e&&(o=t.current().toLowerCase(),i="only"==o||"not"==o||"and"==o||"or"==o?"keyword":s.hasOwnProperty(o)?"attribute":d.hasOwnProperty(o)?"property":c.hasOwnProperty(o)?"keyword":p.hasOwnProperty(o)?"property":u.hasOwnProperty(o)?w?"string-2":"property":h.hasOwnProperty(o)?"atom":g.hasOwnProperty(o)?"keyword":"error"),r.context.type);var o},atComponentBlock:function(e,t,r){return"}"==e?C(e,t,r):"{"==e?K(r)&&P(r,t,f?"block":"top",!1):("word"==e&&(i="error"),r.context.type)},atBlock_parens:function(e,t,r){return")"==e?K(r):"{"==e||"}"==e?C(e,t,r,2):_.atBlock(e,t,r)},restricted_atBlock_before:function(e,t,r){return"{"==e?P(r,t,"restricted_atBlock"):"word"==e&&"@counter-style"==r.stateArg?(i="variable","restricted_atBlock_before"):q(e,t,r)},restricted_atBlock:function(e,t,r){return"}"==e?(r.stateArg=null,K(r)):"word"==e?(i="@font-face"==r.stateArg&&!m.hasOwnProperty(t.current().toLowerCase())||"@counter-style"==r.stateArg&&!b.hasOwnProperty(t.current().toLowerCase())?"error":"property","maybeprop"):"restricted_atBlock"},keyframes:function(e,t,r){return"word"==e?(i="variable","keyframes"):"{"==e?P(r,t,"top"):q(e,t,r)},at:function(e,t,r){return";"==e?K(r):"{"==e||"}"==e?C(e,t,r):("word"==e?i="tag":"hash"==e&&(i="builtin"),"at")},interpolation:function(e,t,r){return"}"==e?K(r):"{"==e||";"==e?C(e,t,r):("word"==e?i="variable":"variable"!=e&&"("!=e&&")"!=e&&(i="error"),"interpolation")}};return{startState:function(e){return{tokenize:null,state:r?"block":"top",stateArg:null,context:new j(r?"block":"top",e||0,null)}},token:function(e,t){if(!t.tokenize&&e.eatSpace())return null;var r=(t.tokenize||function(e,t){var r=e.next();if(l[r]){var o=l[r](e,t);if(!1!==o)return o}return"@"==r?(e.eatWhile(/[\w\\\-]/),v("def",e.current())):"="==r||("~"==r||"|"==r)&&e.eat("=")?(a="compare",null):'"'==r||"'"==r?(t.tokenize=x(r),t.tokenize(e,t)):"#"==r?(e.eatWhile(/[\w\\\-]/),a="hash","atom"):"!"==r?(e.match(/^\s*\w*/),a="important","keyword"):/\d/.test(r)||"."==r&&e.eat(/\d/)?(e.eatWhile(/[\w.%]/),a="unit","number"):"-"!==r?/[,+>*\/]/.test(r)?(a="select-op",null):"."==r&&e.match(/^-?[_a-z][_a-z0-9-]*/i)?a="qualifier":/[:;{}\[\]\(\)]/.test(r)?v(null,r):e.match(/[\w-.]+(?=\()/)?(/^(url(-prefix)?|domain|regexp)$/.test(e.current().toLowerCase())&&(t.tokenize=z),a="variable","variable callee"):/[\w\\\-]/.test(r)?(e.eatWhile(/[\w\\\-]/),a="word","property"):a=null:/[\d.]/.test(e.peek())?(e.eatWhile(/[\w.%]/),a="unit","number"):e.match(/^-[\w\\\-]*/)?(e.eatWhile(/[\w\\\-]/),a=e.match(/^\s*:/,!1)?"variable-definition":"variable","variable-2"):e.match(/^\w+-/)?a="meta":void 0})(e,t);return r&&"object"==typeof r&&(a=r[1],r=r[0]),i=r,"comment"!=a&&(t.state=_[t.state](a,e,t)),i},indent:function(e,t){var r=e.context,o=t&&t.charAt(0),i=r.indent;return"prop"!=r.type||"}"!=o&&")"!=o||(r=r.prev),r.prev&&("}"!=o||"block"!=r.type&&"top"!=r.type&&"interpolation"!=r.type&&"restricted_atBlock"!=r.type?(")"!=o||"parens"!=r.type&&"atBlock_parens"!=r.type)&&("{"!=o||"at"!=r.type&&"atBlock"!=r.type)||(i=Math.max(0,r.indent-n)):i=(r=r.prev).indent),i},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",blockCommentContinue:" * ",lineComment:k,fold:"brace"}});var t=["domain","regexp","url","url-prefix"],r=e(t),o=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],i=e(o),a=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","orientation","device-pixel-ratio","min-device-pixel-ratio","max-device-pixel-ratio","pointer","any-pointer","hover","any-hover","prefers-color-scheme"],n=e(a),l=["landscape","portrait","none","coarse","fine","on-demand","hover","interlace","progressive","dark","light"],s=e(l),d=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","all","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","binding","bleed","block-size","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-gap","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-gap","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","inset","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","left","letter-spacing","line-break","line-height","line-height-step","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","place-content","place-items","place-self","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotate","rotation","rotation-point","row-gap","ruby-align","ruby-overhang","ruby-position","ruby-span","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-type","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-orientation","text-outline","text-overflow","text-rendering","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","touch-action","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-select","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","paint-order","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],c=e(d),p=["border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","margin-block","margin-block-end","margin-block-start","margin-inline","margin-inline-end","margin-inline-start","padding-block","padding-block-end","padding-block-start","padding-inline","padding-inline-end","padding-inline-start","scroll-snap-stop","scrollbar-3d-light-color","scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-track-color","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","shape-inside","zoom"],u=e(p),m=e(["font-display","font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]),b=e(["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"]),g=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],h=e(g),f=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","auto-flow","avoid","avoid-column","avoid-page","avoid-region","axis-pan","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","color","color-burn","color-dodge","column","column-reverse","compact","condensed","contain","content","contents","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","darken","dashed","decimal","decimal-leading-zero","default","default-button","dense","destination-atop","destination-in","destination-out","destination-over","devanagari","difference","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","exclusion","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fill-box","fixed","flat","flex","flex-end","flex-start","footnotes","forwards","from","geometricPrecision","georgian","graytext","grid","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hard-light","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","hue","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-grid","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","lighten","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","luminosity","malayalam","manipulation","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","multiple_mask_images","multiply","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","opacity","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","pinch-zoom","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row","row-resize","row-reverse","rtl","run-in","running","s-resize","sans-serif","saturation","scale","scale3d","scaleX","scaleY","scaleZ","screen","scroll","scrollbar","scroll-position","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","self-start","self-end","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","soft-light","solid","somali","source-atop","source-in","source-out","source-over","space","space-around","space-between","space-evenly","spell-out","square","square-button","start","static","status-bar","stretch","stroke","stroke-box","sub","subpixel-antialiased","svg_masks","super","sw-resize","symbolic","symbols","system-ui","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","transform","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","unidirectional-pan","unset","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","view-box","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","wrap","wrap-reverse","x-large","x-small","xor","xx-large","xx-small"],k=e(f),y=t.concat(o).concat(a).concat(l).concat(d).concat(p).concat(g).concat(f);function w(e,t){for(var r,o=!1;null!=(r=e.next());){if(o&&"/"==r){t.tokenize=null;break}o="*"==r}return["comment","comment"]}T.registerHelper("hintWords","css",y),T.defineMIME("text/css",{documentTypes:r,mediaTypes:i,mediaFeatures:n,mediaValueKeywords:s,propertyKeywords:c,nonStandardPropertyKeywords:u,fontProperties:m,counterDescriptors:b,colorKeywords:h,valueKeywords:k,tokenHooks:{"/":function(e,t){return!!e.eat("*")&&(t.tokenize=w)(e,t)}},name:"css"}),T.defineMIME("text/x-scss",{mediaTypes:i,mediaFeatures:n,mediaValueKeywords:s,propertyKeywords:c,nonStandardPropertyKeywords:u,colorKeywords:h,valueKeywords:k,fontProperties:m,allowNested:!0,lineComment:"//",tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=w)(e,t):["operator","operator"]},":":function(e){return!!e.match(/\s*\{/,!1)&&[null,null]},$:function(e){return e.match(/^[\w-]+/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"]},"#":function(e){return!!e.eat("{")&&[null,"interpolation"]}},name:"css",helperType:"scss"}),T.defineMIME("text/x-less",{mediaTypes:i,mediaFeatures:n,mediaValueKeywords:s,propertyKeywords:c,nonStandardPropertyKeywords:u,colorKeywords:h,valueKeywords:k,fontProperties:m,allowNested:!0,lineComment:"//",tokenHooks:{"/":function(e,t){return e.eat("/")?(e.skipToEnd(),["comment","comment"]):e.eat("*")?(t.tokenize=w)(e,t):["operator","operator"]},"@":function(e){return e.eat("{")?[null,"interpolation"]:!e.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i,!1)&&(e.eatWhile(/[\w\\\-]/),e.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"])},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"}),T.defineMIME("text/x-gss",{documentTypes:r,mediaTypes:i,mediaFeatures:n,propertyKeywords:c,nonStandardPropertyKeywords:u,fontProperties:m,counterDescriptors:b,colorKeywords:h,valueKeywords:k,supportsAtComponent:!0,tokenHooks:{"/":function(e,t){return!!e.eat("*")&&(t.tokenize=w)(e,t)}},name:"css",helperType:"gss"})}); diff --git a/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/addon/mode/multiplex.js b/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/addon/mode/multiplex.js index 24cd9fc5d..8a1257c83 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/addon/mode/multiplex.js +++ b/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/addon/mode/multiplex.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.multiplexingMode=function(n){var i=Array.prototype.slice.call(arguments,1);function t(e,n,i,t){if("string"==typeof n){var r=e.indexOf(n,i);return t&&r>-1?r+n.length:r}var o=n.exec(i?e.slice(i):e);return o?o.index+i+(t?o[0].length:0):-1}return{startState:function(){return{outer:e.startState(n),innerActive:null,inner:null}},copyState:function(i){return{outer:e.copyState(n,i.outer),innerActive:i.innerActive,inner:i.innerActive&&e.copyState(i.innerActive.mode,i.inner)}},token:function(r,o){if(o.innerActive){var c=o.innerActive;a=r.string;if(!c.close&&r.sol())return o.innerActive=o.inner=null,this.token(r,o);if((v=c.close?t(a,c.close,r.pos,c.parseDelimiters):-1)==r.pos&&!c.parseDelimiters)return r.match(c.close),o.innerActive=o.inner=null,c.delimStyle&&c.delimStyle+" "+c.delimStyle+"-close";v>-1&&(r.string=a.slice(0,v));var l=c.mode.token(r,o.inner);return v>-1&&(r.string=a),v==r.pos&&c.parseDelimiters&&(o.innerActive=o.inner=null),c.innerStyle&&(l=l?l+" "+c.innerStyle:c.innerStyle),l}for(var s=1/0,a=r.string,u=0;u<i.length;++u){var v,d=i[u];if((v=t(a,d.open,r.pos))==r.pos){d.parseDelimiters||r.match(d.open),o.innerActive=d;var f=0;if(n.indent){var m=n.indent(o.outer,"");m!==e.Pass&&(f=m)}return o.inner=e.startState(d.mode,f),d.delimStyle&&d.delimStyle+" "+d.delimStyle+"-open"}-1!=v&&v<s&&(s=v)}s!=1/0&&(r.string=a.slice(0,s));var p=n.token(r,o.outer);return s!=1/0&&(r.string=a),p},indent:function(i,t){var r=i.innerActive?i.innerActive.mode:n;return r.indent?r.indent(i.innerActive?i.inner:i.outer,t):e.Pass},blankLine:function(t){var r=t.innerActive?t.innerActive.mode:n;if(r.blankLine&&r.blankLine(t.innerActive?t.inner:t.outer),t.innerActive)"\n"===t.innerActive.close&&(t.innerActive=t.inner=null);else for(var o=0;o<i.length;++o){var c=i[o];"\n"===c.open&&(t.innerActive=c,t.inner=e.startState(c.mode,r.indent?r.indent(t.outer,""):0))}},electricChars:n.electricChars,innerMode:function(e){return e.inner?{state:e.inner,mode:e.innerActive.mode}:{state:e.outer,mode:n}}}}}); +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(p){"use strict";p.multiplexingMode=function(d){var f=Array.prototype.slice.call(arguments,1);function m(e,n,t,i){if("string"==typeof n){var r=e.indexOf(n,t);return i&&-1<r?r+n.length:r}var o=n.exec(t?e.slice(t):e);return o?o.index+t+(i?o[0].length:0):-1}return{startState:function(){return{outer:p.startState(d),innerActive:null,inner:null}},copyState:function(e){return{outer:p.copyState(d,e.outer),innerActive:e.innerActive,inner:e.innerActive&&p.copyState(e.innerActive.mode,e.inner)}},token:function(e,n){if(n.innerActive){var t=n.innerActive,i=e.string;if(!t.close&&e.sol())return n.innerActive=n.inner=null,this.token(e,n);if((l=t.close?m(i,t.close,e.pos,t.parseDelimiters):-1)==e.pos&&!t.parseDelimiters)return e.match(t.close),n.innerActive=n.inner=null,t.delimStyle&&t.delimStyle+" "+t.delimStyle+"-close";-1<l&&(e.string=i.slice(0,l));var r=t.mode.token(e,n.inner);return-1<l&&(e.string=i),l==e.pos&&t.parseDelimiters&&(n.innerActive=n.inner=null),t.innerStyle&&(r=r?r+" "+t.innerStyle:t.innerStyle),r}for(var o=1/0,i=e.string,c=0;c<f.length;++c){var l,s=f[c];if((l=m(i,s.open,e.pos))==e.pos){s.parseDelimiters||e.match(s.open),n.innerActive=s;var a,u=0;return!d.indent||(a=d.indent(n.outer,"",""))!==p.Pass&&(u=a),n.inner=p.startState(s.mode,u),s.delimStyle&&s.delimStyle+" "+s.delimStyle+"-open"}-1!=l&&l<o&&(o=l)}o!=1/0&&(e.string=i.slice(0,o));var v=d.token(e,n.outer);return o!=1/0&&(e.string=i),v},indent:function(e,n,t){var i=e.innerActive?e.innerActive.mode:d;return i.indent?i.indent(e.innerActive?e.inner:e.outer,n,t):p.Pass},blankLine:function(e){var n=e.innerActive?e.innerActive.mode:d;if(n.blankLine&&n.blankLine(e.innerActive?e.inner:e.outer),e.innerActive)"\n"===e.innerActive.close&&(e.innerActive=e.inner=null);else for(var t=0;t<f.length;++t){var i=f[t];"\n"===i.open&&(e.innerActive=i,e.inner=p.startState(i.mode,n.indent?n.indent(e.outer,"",""):0))}},electricChars:d.electricChars,innerMode:function(e){return e.inner?{state:e.inner,mode:e.innerActive.mode}:{state:e.outer,mode:d}}}}}); diff --git a/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/mode/htmlembedded/htmlembedded.js b/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/mode/htmlembedded/htmlembedded.js index 459c77fc1..4bcb401d7 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/mode/htmlembedded/htmlembedded.js +++ b/plugins/tiddlywiki/codemirror-mode-htmlembedded/files/mode/htmlembedded/htmlembedded.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../htmlmixed/htmlmixed"),require("../../addon/mode/multiplex")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../../addon/mode/multiplex"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("htmlembedded",function(i,t){var d=t.closeComment||"--%>";return e.multiplexingMode(e.getMode(i,"htmlmixed"),{open:t.openComment||"<%--",close:d,delimStyle:"comment",mode:{token:function(e){return e.skipTo(d)||e.skipToEnd(),"comment"}}},{open:t.open||t.scriptStartRegex||"<%",close:t.close||t.scriptEndRegex||"%>",mode:e.getMode(i,t.scriptingModeSpec)})},"htmlmixed"),e.defineMIME("application/x-ejs",{name:"htmlembedded",scriptingModeSpec:"javascript"}),e.defineMIME("application/x-aspx",{name:"htmlembedded",scriptingModeSpec:"text/x-csharp"}),e.defineMIME("application/x-jsp",{name:"htmlembedded",scriptingModeSpec:"text/x-java"}),e.defineMIME("application/x-erb",{name:"htmlembedded",scriptingModeSpec:"ruby"})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../htmlmixed/htmlmixed"),require("../../addon/mode/multiplex")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../htmlmixed/htmlmixed","../../addon/mode/multiplex"],e):e(CodeMirror)}(function(d){"use strict";d.defineMode("htmlembedded",function(e,i){var t=i.closeComment||"--%>";return d.multiplexingMode(d.getMode(e,"htmlmixed"),{open:i.openComment||"<%--",close:t,delimStyle:"comment",mode:{token:function(e){return e.skipTo(t)||e.skipToEnd(),"comment"}}},{open:i.open||i.scriptStartRegex||"<%",close:i.close||i.scriptEndRegex||"%>",mode:d.getMode(e,i.scriptingModeSpec)})},"htmlmixed"),d.defineMIME("application/x-ejs",{name:"htmlembedded",scriptingModeSpec:"javascript"}),d.defineMIME("application/x-aspx",{name:"htmlembedded",scriptingModeSpec:"text/x-csharp"}),d.defineMIME("application/x-jsp",{name:"htmlembedded",scriptingModeSpec:"text/x-java"}),d.defineMIME("application/x-erb",{name:"htmlembedded",scriptingModeSpec:"ruby"})}); diff --git a/plugins/tiddlywiki/codemirror-mode-htmlmixed/files/mode/htmlmixed/htmlmixed.js b/plugins/tiddlywiki/codemirror-mode-htmlmixed/files/mode/htmlmixed/htmlmixed.js index 5fb1173b0..6dd163e3f 100755 --- a/plugins/tiddlywiki/codemirror-mode-htmlmixed/files/mode/htmlmixed/htmlmixed.js +++ b/plugins/tiddlywiki/codemirror-mode-htmlmixed/files/mode/htmlmixed/htmlmixed.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],t):t(CodeMirror)}(function(t){"use strict";var e={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]};var a={};function n(t,e){var n,l=t.match(a[n=e]||(a[n]=new RegExp("\\s+"+n+"\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*")));return l?/^\s*(.*?)\s*$/.exec(l[2])[1]:""}function l(t,e){return new RegExp((e?"^":"")+"</s*"+t+"s*>","i")}function r(t,e){for(var a in t)for(var n=e[a]||(e[a]=[]),l=t[a],r=l.length-1;r>=0;r--)n.unshift(l[r])}t.defineMode("htmlmixed",function(a,o){var c=t.getMode(a,{name:"xml",htmlMode:!0,multilineTagIndentFactor:o.multilineTagIndentFactor,multilineTagIndentPastTag:o.multilineTagIndentPastTag}),i={},s=o&&o.tags,u=o&&o.scriptTypes;if(r(e,i),s&&r(s,i),u)for(var m=u.length-1;m>=0;m--)i.script.unshift(["type",u[m].matches,u[m].mode]);function d(e,r){var o,s=c.token(e,r.htmlState),u=/\btag\b/.test(s);if(u&&!/[<>\s\/]/.test(e.current())&&(o=r.htmlState.tagName&&r.htmlState.tagName.toLowerCase())&&i.hasOwnProperty(o))r.inTag=o+" ";else if(r.inTag&&u&&/>$/.test(e.current())){var m=/^([\S]+) (.*)/.exec(r.inTag);r.inTag=null;var p=">"==e.current()&&function(t,e){for(var a=0;a<t.length;a++){var l=t[a];if(!l[0]||l[1].test(n(e,l[0])))return l[2]}}(i[m[1]],m[2]),f=t.getMode(a,p),g=l(m[1],!0),h=l(m[1],!1);r.token=function(t,e){return t.match(g,!1)?(e.token=d,e.localState=e.localMode=null,null):(a=t,n=h,l=e.localMode.token(t,e.localState),r=a.current(),(o=r.search(n))>-1?a.backUp(r.length-o):r.match(/<\/?$/)&&(a.backUp(r.length),a.match(n,!1)||a.match(r)),l);var a,n,l,r,o},r.localMode=f,r.localState=t.startState(f,c.indent(r.htmlState,""))}else r.inTag&&(r.inTag+=e.current(),e.eol()&&(r.inTag+=" "));return s}return{startState:function(){return{token:d,inTag:null,localMode:null,localState:null,htmlState:t.startState(c)}},copyState:function(e){var a;return e.localState&&(a=t.copyState(e.localMode,e.localState)),{token:e.token,inTag:e.inTag,localMode:e.localMode,localState:a,htmlState:t.copyState(c,e.htmlState)}},token:function(t,e){return e.token(t,e)},indent:function(e,a,n){return!e.localMode||/^\s*<\//.test(a)?c.indent(e.htmlState,a):e.localMode.indent?e.localMode.indent(e.localState,a,n):t.Pass},innerMode:function(t){return{state:t.localState||t.htmlState,mode:t.localMode||c}}}},"xml","javascript","css"),t.defineMIME("text/html","htmlmixed")}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],t):t(CodeMirror)}(function(p){"use strict";var l={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]};var o={};function f(t,e){var a,n=t.match(o[a=e]||(o[a]=new RegExp("\\s+"+a+"\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*")));return n?/^\s*(.*?)\s*$/.exec(n[2])[1]:""}function h(t,e){return new RegExp((e?"^":"")+"</s*"+t+"s*>","i")}function r(t,e){for(var a in t)for(var n=e[a]||(e[a]=[]),l=t[a],o=l.length-1;0<=o;o--)n.unshift(l[o])}p.defineMode("htmlmixed",function(u,t){var m=p.getMode(u,{name:"xml",htmlMode:!0,multilineTagIndentFactor:t.multilineTagIndentFactor,multilineTagIndentPastTag:t.multilineTagIndentPastTag,allowMissingTagName:t.allowMissingTagName}),d={},e=t&&t.tags,a=t&&t.scriptTypes;if(r(l,d),e&&r(e,d),a)for(var n=a.length-1;0<=n;n--)d.script.unshift(["type",a[n].matches,a[n].mode]);function g(t,e){var a,n,l,o,i,c,r=m.token(t,e.htmlState),s=/\btag\b/.test(r);return s&&!/[<>\s\/]/.test(t.current())&&(a=e.htmlState.tagName&&e.htmlState.tagName.toLowerCase())&&d.hasOwnProperty(a)?e.inTag=a+" ":e.inTag&&s&&/>$/.test(t.current())?(n=/^([\S]+) (.*)/.exec(e.inTag),e.inTag=null,l=">"==t.current()&&function(t,e){for(var a=0;a<t.length;a++){var n=t[a];if(!n[0]||n[1].test(f(e,n[0])))return n[2]}}(d[n[1]],n[2]),o=p.getMode(u,l),i=h(n[1],!0),c=h(n[1],!1),e.token=function(t,e){return t.match(i,!1)?(e.token=g,e.localState=e.localMode=null):(a=t,n=c,l=e.localMode.token(t,e.localState),o=a.current(),-1<(r=o.search(n))?a.backUp(o.length-r):o.match(/<\/?$/)&&(a.backUp(o.length),a.match(n,!1)||a.match(o)),l);var a,n,l,o,r},e.localMode=o,e.localState=p.startState(o,m.indent(e.htmlState,"",""))):e.inTag&&(e.inTag+=t.current(),t.eol()&&(e.inTag+=" ")),r}return{startState:function(){return{token:g,inTag:null,localMode:null,localState:null,htmlState:p.startState(m)}},copyState:function(t){var e;return t.localState&&(e=p.copyState(t.localMode,t.localState)),{token:t.token,inTag:t.inTag,localMode:t.localMode,localState:e,htmlState:p.copyState(m,t.htmlState)}},token:function(t,e){return e.token(t,e)},indent:function(t,e,a){return!t.localMode||/^\s*<\//.test(e)?m.indent(t.htmlState,e,a):t.localMode.indent?t.localMode.indent(t.localState,e,a):p.Pass},innerMode:function(t){return{state:t.localState||t.htmlState,mode:t.localMode||m}}}},"xml","javascript","css"),p.defineMIME("text/html","htmlmixed")}); diff --git a/plugins/tiddlywiki/codemirror-mode-javascript/files/mode/javascript/javascript.js b/plugins/tiddlywiki/codemirror-mode-javascript/files/mode/javascript/javascript.js index f5a3db4a5..03073f449 100755 --- a/plugins/tiddlywiki/codemirror-mode-javascript/files/mode/javascript/javascript.js +++ b/plugins/tiddlywiki/codemirror-mode-javascript/files/mode/javascript/javascript.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("javascript",function(t,r){var n,a,i=t.indentUnit,o=r.statementIndent,c=r.jsonld,u=r.json||c,s=r.typescript,f=r.wordCharacters||/[\w$\xa1-\uffff]/,l=function(){function e(e){return{type:e,style:"keyword"}}var t=e("keyword a"),r=e("keyword b"),n=e("keyword c"),a=e("keyword d"),i=e("operator"),o={type:"atom",style:"atom"};return{if:e("if"),while:t,with:t,else:r,do:r,try:r,finally:r,return:a,break:a,continue:a,new:e("new"),delete:n,void:n,throw:n,debugger:e("debugger"),var:e("var"),const:e("var"),let:e("var"),function:e("function"),catch:e("catch"),for:e("for"),switch:e("switch"),case:e("case"),default:e("default"),in:i,typeof:i,instanceof:i,true:o,false:o,null:o,undefined:o,NaN:o,Infinity:o,this:e("this"),class:e("class"),super:e("atom"),yield:n,export:e("export"),import:e("import"),extends:n,await:n}}(),d=/[+\-*&%=<>!?|~^@]/,p=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function m(e,t,r){return n=e,a=r,t}function k(e,t){var r,n=e.next();if('"'==n||"'"==n)return t.tokenize=(r=n,function(e,t){var n,a=!1;if(c&&"@"==e.peek()&&e.match(p))return t.tokenize=k,m("jsonld-keyword","meta");for(;null!=(n=e.next())&&(n!=r||a);)a=!a&&"\\"==n;return a||(t.tokenize=k),m("string","string")}),t.tokenize(e,t);if("."==n&&e.match(/^\d+(?:[eE][+\-]?\d+)?/))return m("number","number");if("."==n&&e.match(".."))return m("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(n))return m(n);if("="==n&&e.eat(">"))return m("=>","operator");if("0"==n&&e.eat(/x/i))return e.eatWhile(/[\da-f]/i),m("number","number");if("0"==n&&e.eat(/o/i))return e.eatWhile(/[0-7]/i),m("number","number");if("0"==n&&e.eat(/b/i))return e.eatWhile(/[01]/i),m("number","number");if(/\d/.test(n))return e.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),m("number","number");if("/"==n)return e.eat("*")?(t.tokenize=v,v(e,t)):e.eat("/")?(e.skipToEnd(),m("comment","comment")):He(e,t,1)?(function(e){for(var t,r=!1,n=!1;null!=(t=e.next());){if(!r){if("/"==t&&!n)return;"["==t?n=!0:n&&"]"==t&&(n=!1)}r=!r&&"\\"==t}}(e),e.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/),m("regexp","string-2")):(e.eat("="),m("operator","operator",e.current()));if("`"==n)return t.tokenize=y,y(e,t);if("#"==n)return e.skipToEnd(),m("error","error");if(d.test(n))return">"==n&&t.lexical&&">"==t.lexical.type||(e.eat("=")?"!"!=n&&"="!=n||e.eat("="):/[<>*+\-]/.test(n)&&(e.eat(n),">"==n&&e.eat(n))),m("operator","operator",e.current());if(f.test(n)){e.eatWhile(f);var a=e.current();if("."!=t.lastType){if(l.propertyIsEnumerable(a)){var i=l[a];return m(i.type,i.style,a)}if("async"==a&&e.match(/^(\s|\/\*.*?\*\/)*[\[\(\w]/,!1))return m("async","keyword",a)}return m("variable","variable",a)}}function v(e,t){for(var r,n=!1;r=e.next();){if("/"==r&&n){t.tokenize=k;break}n="*"==r}return m("comment","comment")}function y(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&("`"==r||"$"==r&&e.eat("{"))){t.tokenize=k;break}n=!n&&"\\"==r}return m("quasi","string-2",e.current())}var b="([{}])";function w(e,t){t.fatArrowAt&&(t.fatArrowAt=null);var r=e.string.indexOf("=>",e.start);if(!(r<0)){if(s){var n=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(e.string.slice(e.start,r));n&&(r=n.index)}for(var a=0,i=!1,o=r-1;o>=0;--o){var c=e.string.charAt(o),u=b.indexOf(c);if(u>=0&&u<3){if(!a){++o;break}if(0==--a){"("==c&&(i=!0);break}}else if(u>=3&&u<6)++a;else if(f.test(c))i=!0;else{if(/["'\/]/.test(c))return;if(i&&!a){++o;break}}}i&&!a&&(t.fatArrowAt=o)}}var x={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,"jsonld-keyword":!0};function h(e,t,r,n,a,i){this.indented=e,this.column=t,this.type=r,this.prev=a,this.info=i,null!=n&&(this.align=n)}function g(e,t){for(var r=e.localVars;r;r=r.next)if(r.name==t)return!0;for(var n=e.context;n;n=n.prev)for(r=n.vars;r;r=r.next)if(r.name==t)return!0}var j={state:null,column:null,marked:null,cc:null};function M(){for(var e=arguments.length-1;e>=0;e--)j.cc.push(arguments[e])}function V(){return M.apply(null,arguments),!0}function A(e){function t(t){for(var r=t;r;r=r.next)if(r.name==e)return!0;return!1}var n=j.state;if(j.marked="def",n.context){if(t(n.localVars))return;n.localVars={name:e,next:n.localVars}}else{if(t(n.globalVars))return;r.globalVars&&(n.globalVars={name:e,next:n.globalVars})}}function E(e){return"public"==e||"private"==e||"protected"==e||"abstract"==e||"readonly"==e}var z={name:"this",next:{name:"arguments"}};function I(){j.state.context={prev:j.state.context,vars:j.state.localVars},j.state.localVars=z}function T(){j.state.localVars=j.state.context.vars,j.state.context=j.state.context.prev}function $(e,t){var r=function(){var r=j.state,n=r.indented;if("stat"==r.lexical.type)n=r.lexical.indented;else for(var a=r.lexical;a&&")"==a.type&&a.align;a=a.prev)n=a.indented;r.lexical=new h(n,j.stream.column(),e,null,r.lexical,t)};return r.lex=!0,r}function C(){var e=j.state;e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function q(e){return function t(r){return r==e?V():";"==e?M():V(t)}}function O(e,t){return"var"==e?V($("vardef",t.length),pe,q(";"),C):"keyword a"==e?V($("form"),W,O,C):"keyword b"==e?V($("form"),O,C):"keyword d"==e?j.stream.match(/^\s*$/,!1)?V():V($("stat"),U,q(";"),C):"debugger"==e?V(q(";")):"{"==e?V($("}"),te,C):";"==e?V():"if"==e?("else"==j.state.lexical.info&&j.state.cc[j.state.cc.length-1]==C&&j.state.cc.pop()(),V($("form"),W,O,C,be)):"function"==e?V(Me):"for"==e?V($("form"),we,O,C):"class"==e||s&&"interface"==t?(j.marked="keyword",V($("form"),Ee,C)):"variable"==e?s&&"declare"==t?(j.marked="keyword",V(O)):s&&("module"==t||"enum"==t||"type"==t)&&j.stream.match(/^\s*\w/,!1)?(j.marked="keyword","enum"==t?V(Ue):"type"==t?V(ie,q("operator"),ie,q(";")):V($("form"),me,q("{"),$("}"),te,C,C)):s&&"namespace"==t?(j.marked="keyword",V($("form"),P,te,C)):s&&"abstract"==t?(j.marked="keyword",V(O)):V($("stat"),Q):"switch"==e?V($("form"),W,q("{"),$("}","switch"),te,C,C):"case"==e?V(P,q(":")):"default"==e?V(q(":")):"catch"==e?V($("form"),I,q("("),Ve,q(")"),O,C,T):"export"==e?V($("stat"),$e,C):"import"==e?V($("stat"),qe,C):"async"==e?V(O):"@"==t?V(P,O):M($("stat"),P,q(";"),C)}function P(e,t){return N(e,t,!1)}function S(e,t){return N(e,t,!0)}function W(e){return"("!=e?M():V($(")"),P,q(")"),C)}function N(e,t,r){if(j.state.fatArrowAt==j.stream.start){var n=r?J:G;if("("==e)return V(I,$(")"),_(Ve,")"),C,q("=>"),n,T);if("variable"==e)return M(I,me,q("=>"),n,T)}var a,i=r?H:B;return x.hasOwnProperty(e)?V(i):"function"==e?V(Me,i):"class"==e||s&&"interface"==t?(j.marked="keyword",V($("form"),Ae,C)):"keyword c"==e||"async"==e?V(r?S:P):"("==e?V($(")"),U,q(")"),C,i):"operator"==e||"spread"==e?V(r?S:P):"["==e?V($("]"),Ne,C,i):"{"==e?ee(X,"}",null,i):"quasi"==e?M(D,i):"new"==e?V((a=r,function(e){return"."==e?V(a?L:K):"variable"==e&&s?V(fe,a?H:B):M(a?S:P)})):"import"==e?V(P):V()}function U(e){return e.match(/[;\}\)\],]/)?M():M(P)}function B(e,t){return","==e?V(P):H(e,t,!1)}function H(e,t,r){var n=0==r?B:H,a=0==r?P:S;return"=>"==e?V(I,r?J:G,T):"operator"==e?/\+\+|--/.test(t)||s&&"!"==t?V(n):s&&"<"==t&&j.stream.match(/^([^>]|<.*?>)*>\s*\(/,!1)?V($(">"),_(ie,">"),C,n):"?"==t?V(P,q(":"),a):V(a):"quasi"==e?M(D,n):";"!=e?"("==e?ee(S,")","call",n):"."==e?V(R,n):"["==e?V($("]"),U,q("]"),C,n):s&&"as"==t?(j.marked="keyword",V(ie,n)):"regexp"==e?(j.state.lastType=j.marked="operator",j.stream.backUp(j.stream.pos-j.stream.start-1),V(a)):void 0:void 0}function D(e,t){return"quasi"!=e?M():"${"!=t.slice(t.length-2)?V(D):V(P,F)}function F(e){if("}"==e)return j.marked="string-2",j.state.tokenize=y,V(D)}function G(e){return w(j.stream,j.state),M("{"==e?O:P)}function J(e){return w(j.stream,j.state),M("{"==e?O:S)}function K(e,t){if("target"==t)return j.marked="keyword",V(B)}function L(e,t){if("target"==t)return j.marked="keyword",V(H)}function Q(e){return":"==e?V(C,O):M(B,q(";"),C)}function R(e){if("variable"==e)return j.marked="property",V()}function X(e,t){if("async"==e)return j.marked="property",V(X);if("variable"==e||"keyword"==j.style){return j.marked="property","get"==t||"set"==t?V(Y):(s&&j.state.fatArrowAt==j.stream.start&&(r=j.stream.match(/^\s*:\s*/,!1))&&(j.state.fatArrowAt=j.stream.pos+r[0].length),V(Z));var r}else{if("number"==e||"string"==e)return j.marked=c?"property":j.style+" property",V(Z);if("jsonld-keyword"==e)return V(Z);if(s&&E(t))return j.marked="keyword",V(X);if("["==e)return V(P,re,q("]"),Z);if("spread"==e)return V(S,Z);if("*"==t)return j.marked="keyword",V(X);if(":"==e)return M(Z)}}function Y(e){return"variable"!=e?M(Z):(j.marked="property",V(Me))}function Z(e){return":"==e?V(S):"("==e?M(Me):void 0}function _(e,t,r){function n(a,i){if(r?r.indexOf(a)>-1:","==a){var o=j.state.lexical;return"call"==o.info&&(o.pos=(o.pos||0)+1),V(function(r,n){return r==t||n==t?M():M(e)},n)}return a==t||i==t?V():V(q(t))}return function(r,a){return r==t||a==t?V():M(e,n)}}function ee(e,t,r){for(var n=3;n<arguments.length;n++)j.cc.push(arguments[n]);return V($(t,r),_(e,t),C)}function te(e){return"}"==e?V():M(O,te)}function re(e,t){if(s){if(":"==e)return V(ie);if("?"==t)return V(re)}}function ne(e){if(s&&":"==e)return j.stream.match(/^\s*\w+\s+is\b/,!1)?V(P,ae,ie):V(ie)}function ae(e,t){if("is"==t)return j.marked="keyword",V()}function ie(e,t){return"keyof"==t||"typeof"==t?(j.marked="keyword",V("keyof"==t?ie:S)):"variable"==e||"void"==t?(j.marked="type",V(se)):"string"==e||"number"==e||"atom"==e?V(se):"["==e?V($("]"),_(ie,"]",","),C,se):"{"==e?V($("}"),_(ce,"}",",;"),C,se):"("==e?V(_(ue,")"),oe):"<"==e?V(_(ie,">"),ie):void 0}function oe(e){if("=>"==e)return V(ie)}function ce(e,t){return"variable"==e||"keyword"==j.style?(j.marked="property",V(ce)):"?"==t?V(ce):":"==e?V(ie):"["==e?V(P,re,q("]"),ce):void 0}function ue(e,t){return"variable"==e&&j.stream.match(/^\s*[?:]/,!1)||"?"==t?V(ue):":"==e?V(ie):M(ie)}function se(e,t){return"<"==t?V($(">"),_(ie,">"),C,se):"|"==t||"."==e||"&"==t?V(ie):"["==e?V(q("]"),se):"extends"==t||"implements"==t?(j.marked="keyword",V(ie)):void 0}function fe(e,t){if("<"==t)return V($(">"),_(ie,">"),C,se)}function le(){return M(ie,de)}function de(e,t){if("="==t)return V(ie)}function pe(e,t){return"enum"==t?(j.marked="keyword",V(Ue)):M(me,re,ve,ye)}function me(e,t){return s&&E(t)?(j.marked="keyword",V(me)):"variable"==e?(A(t),V()):"spread"==e?V(me):"["==e?ee(me,"]"):"{"==e?ee(ke,"}"):void 0}function ke(e,t){return"variable"!=e||j.stream.match(/^\s*:/,!1)?("variable"==e&&(j.marked="property"),"spread"==e?V(me):"}"==e?M():V(q(":"),me,ve)):(A(t),V(ve))}function ve(e,t){if("="==t)return V(S)}function ye(e){if(","==e)return V(pe)}function be(e,t){if("keyword b"==e&&"else"==t)return V($("form","else"),O,C)}function we(e,t){return"await"==t?V(we):"("==e?V($(")"),xe,q(")"),C):void 0}function xe(e){return"var"==e?V(pe,q(";"),ge):";"==e?V(ge):"variable"==e?V(he):M(P,q(";"),ge)}function he(e,t){return"in"==t||"of"==t?(j.marked="keyword",V(P)):V(B,ge)}function ge(e,t){return";"==e?V(je):"in"==t||"of"==t?(j.marked="keyword",V(P)):M(P,q(";"),je)}function je(e){")"!=e&&V(P)}function Me(e,t){return"*"==t?(j.marked="keyword",V(Me)):"variable"==e?(A(t),V(Me)):"("==e?V(I,$(")"),_(Ve,")"),C,ne,O,T):s&&"<"==t?V($(">"),_(le,">"),C,Me):void 0}function Ve(e,t){return"@"==t&&V(P,Ve),"spread"==e?V(Ve):s&&E(t)?(j.marked="keyword",V(Ve)):M(me,re,ve)}function Ae(e,t){return"variable"==e?Ee(e,t):ze(e,t)}function Ee(e,t){if("variable"==e)return A(t),V(ze)}function ze(e,t){return"<"==t?V($(">"),_(le,">"),C,ze):"extends"==t||"implements"==t||s&&","==e?("implements"==t&&(j.marked="keyword"),V(s?ie:P,ze)):"{"==e?V($("}"),Ie,C):void 0}function Ie(e,t){return"async"==e||"variable"==e&&("static"==t||"get"==t||"set"==t||s&&E(t))&&j.stream.match(/^\s+[\w$\xa1-\uffff]/,!1)?(j.marked="keyword",V(Ie)):"variable"==e||"keyword"==j.style?(j.marked="property",V(s?Te:Me,Ie)):"["==e?V(P,re,q("]"),s?Te:Me,Ie):"*"==t?(j.marked="keyword",V(Ie)):";"==e?V(Ie):"}"==e?V():"@"==t?V(P,Ie):void 0}function Te(e,t){return"?"==t?V(Te):":"==e?V(ie,ve):"="==t?V(S):M(Me)}function $e(e,t){return"*"==t?(j.marked="keyword",V(We,q(";"))):"default"==t?(j.marked="keyword",V(P,q(";"))):"{"==e?V(_(Ce,"}"),We,q(";")):M(O)}function Ce(e,t){return"as"==t?(j.marked="keyword",V(q("variable"))):"variable"==e?M(S,Ce):void 0}function qe(e){return"string"==e?V():"("==e?M(P):M(Oe,Pe,We)}function Oe(e,t){return"{"==e?ee(Oe,"}"):("variable"==e&&A(t),"*"==t&&(j.marked="keyword"),V(Se))}function Pe(e){if(","==e)return V(Oe,Pe)}function Se(e,t){if("as"==t)return j.marked="keyword",V(Oe)}function We(e,t){if("from"==t)return j.marked="keyword",V(P)}function Ne(e){return"]"==e?V():M(_(S,"]"))}function Ue(){return M($("form"),me,q("{"),$("}"),_(Be,"}"),C,C)}function Be(){return M(me,ve)}function He(e,t,r){return t.tokenize==k&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(t.lastType)||"quasi"==t.lastType&&/\{\s*$/.test(e.string.slice(0,e.pos-(r||0)))}return C.lex=!0,{startState:function(e){var t={tokenize:k,lastType:"sof",cc:[],lexical:new h((e||0)-i,0,"block",!1),localVars:r.localVars,context:r.localVars&&{vars:r.localVars},indented:e||0};return r.globalVars&&"object"==typeof r.globalVars&&(t.globalVars=r.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),w(e,t)),t.tokenize!=v&&e.eatSpace())return null;var r=t.tokenize(e,t);return"comment"==n?r:(t.lastType="operator"!=n||"++"!=a&&"--"!=a?n:"incdec",function(e,t,r,n,a){var i=e.cc;for(j.state=e,j.stream=a,j.marked=null,j.cc=i,j.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;)if((i.length?i.pop():u?P:O)(r,n)){for(;i.length&&i[i.length-1].lex;)i.pop()();return j.marked?j.marked:"variable"==r&&g(e,n)?"variable-2":t}}(t,r,n,a,e))},indent:function(t,n){if(t.tokenize==v)return e.Pass;if(t.tokenize!=k)return 0;var a,c=n&&n.charAt(0),u=t.lexical;if(!/^\s*else\b/.test(n))for(var s=t.cc.length-1;s>=0;--s){var f=t.cc[s];if(f==C)u=u.prev;else if(f!=be)break}for(;("stat"==u.type||"form"==u.type)&&("}"==c||(a=t.cc[t.cc.length-1])&&(a==B||a==H)&&!/^[,\.=+\-*:?[\(]/.test(n));)u=u.prev;o&&")"==u.type&&"stat"==u.prev.type&&(u=u.prev);var l,p,m=u.type,y=c==m;return"vardef"==m?u.indented+("operator"==t.lastType||","==t.lastType?u.info+1:0):"form"==m&&"{"==c?u.indented:"form"==m?u.indented+i:"stat"==m?u.indented+(p=n,"operator"==(l=t).lastType||","==l.lastType||d.test(p.charAt(0))||/[,.]/.test(p.charAt(0))?o||i:0):"switch"!=u.info||y||0==r.doubleIndentSwitch?u.align?u.column+(y?0:1):u.indented+(y?0:i):u.indented+(/^(?:case|default)\b/.test(n)?i:2*i)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:u?null:"/*",blockCommentEnd:u?null:"*/",blockCommentContinue:u?null:" * ",lineComment:u?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:u?"json":"javascript",jsonldMode:c,jsonMode:u,expressionAllowed:He,skipExpression:function(e){var t=e.cc[e.cc.length-1];t!=P&&t!=S||e.cc.pop()}}}),e.registerHelper("wordChars","javascript",/[\w$]/),e.defineMIME("text/javascript","javascript"),e.defineMIME("text/ecmascript","javascript"),e.defineMIME("application/javascript","javascript"),e.defineMIME("application/x-javascript","javascript"),e.defineMIME("application/ecmascript","javascript"),e.defineMIME("application/json",{name:"javascript",json:!0}),e.defineMIME("application/x-json",{name:"javascript",json:!0}),e.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),e.defineMIME("text/typescript",{name:"javascript",typescript:!0}),e.defineMIME("application/typescript",{name:"javascript",typescript:!0})}); +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(tt){"use strict";tt.defineMode("javascript",function(e,l){var t,r,n,a,i,o,d=e.indentUnit,p=l.statementIndent,c=l.jsonld,s=l.json||c,u=l.typescript,f=l.wordCharacters||/[\w$\xa1-\uffff]/,m=(t=v("keyword a"),r=v("keyword b"),n=v("keyword c"),a=v("keyword d"),i=v("operator"),{if:v("if"),while:t,with:t,else:r,do:r,try:r,finally:r,return:a,break:a,continue:a,new:v("new"),delete:n,void:n,throw:n,debugger:v("debugger"),var:v("var"),const:v("var"),let:v("var"),function:v("function"),catch:v("catch"),for:v("for"),switch:v("switch"),case:v("case"),default:v("default"),in:i,typeof:i,instanceof:i,true:o={type:"atom",style:"atom"},false:o,null:o,undefined:o,NaN:o,Infinity:o,this:v("this"),class:v("class"),super:v("atom"),yield:n,export:v("export"),import:v("import"),extends:n,await:n});function v(e){return{type:e,style:"keyword"}}var k,y,w=/[+\-*&%=<>!?|~^@]/,b=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function x(e,t,r){return k=e,y=r,t}function h(e,t){var a,r=e.next();if('"'==r||"'"==r)return t.tokenize=(a=r,function(e,t){var r,n=!1;if(c&&"@"==e.peek()&&e.match(b))return t.tokenize=h,x("jsonld-keyword","meta");for(;null!=(r=e.next())&&(r!=a||n);)n=!n&&"\\"==r;return n||(t.tokenize=h),x("string","string")}),t.tokenize(e,t);if("."==r&&e.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/))return x("number","number");if("."==r&&e.match(".."))return x("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(r))return x(r);if("="==r&&e.eat(">"))return x("=>","operator");if("0"==r&&e.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/))return x("number","number");if(/\d/.test(r))return e.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/),x("number","number");if("/"==r)return e.eat("*")?(t.tokenize=g)(e,t):e.eat("/")?(e.skipToEnd(),x("comment","comment")):et(e,t,1)?(function(e){for(var t,r=!1,n=!1;null!=(t=e.next());){if(!r){if("/"==t&&!n)return;"["==t?n=!0:n&&"]"==t&&(n=!1)}r=!r&&"\\"==t}}(e),e.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/),x("regexp","string-2")):(e.eat("="),x("operator","operator",e.current()));if("`"==r)return(t.tokenize=j)(e,t);if("#"==r&&"!"==e.peek())return e.skipToEnd(),x("meta","meta");if("#"==r&&e.eatWhile(f))return x("variable","property");if("<"==r&&e.match("!--")||"-"==r&&e.match("->")&&!/\S/.test(e.string.slice(0,e.start)))return e.skipToEnd(),x("comment","comment");if(w.test(r))return">"==r&&t.lexical&&">"==t.lexical.type||(e.eat("=")?"!"!=r&&"="!=r||e.eat("="):/[<>*+\-|&?]/.test(r)&&(e.eat(r),">"==r&&e.eat(r))),"?"==r&&e.eat(".")?x("."):x("operator","operator",e.current());if(f.test(r)){e.eatWhile(f);var n=e.current();if("."!=t.lastType){if(m.propertyIsEnumerable(n)){var i=m[n];return x(i.type,i.style,n)}if("async"==n&&e.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/,!1))return x("async","keyword",n)}return x("variable","variable",n)}}function g(e,t){for(var r,n=!1;r=e.next();){if("/"==r&&n){t.tokenize=h;break}n="*"==r}return x("comment","comment")}function j(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&("`"==r||"$"==r&&e.eat("{"))){t.tokenize=h;break}n=!n&&"\\"==r}return x("quasi","string-2",e.current())}var M="([{}])";function A(e,t){t.fatArrowAt&&(t.fatArrowAt=null);var r,n=e.string.indexOf("=>",e.start);if(!(n<0)){!u||(r=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(e.string.slice(e.start,n)))&&(n=r.index);for(var a=0,i=!1,o=n-1;0<=o;--o){var c=e.string.charAt(o),s=M.indexOf(c);if(0<=s&&s<3){if(!a){++o;break}if(0==--a){"("==c&&(i=!0);break}}else if(3<=s&&s<6)++a;else if(f.test(c))i=!0;else if(/["'\/`]/.test(c))for(;;--o){if(0==o)return;if(e.string.charAt(o-1)==c&&"\\"!=e.string.charAt(o-2)){o--;break}}else if(i&&!a){++o;break}}i&&!a&&(t.fatArrowAt=o)}}var V={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,"jsonld-keyword":!0};function E(e,t,r,n,a,i){this.indented=e,this.column=t,this.type=r,this.prev=a,this.info=i,null!=n&&(this.align=n)}function z(e,t,r,n,a){var i=e.cc;for(I.state=e,I.stream=a,I.marked=null,I.cc=i,I.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;){if((i.length?i.pop():s?J:D)(r,n)){for(;i.length&&i[i.length-1].lex;)i.pop()();return I.marked?I.marked:"variable"==r&&function(e,t){for(var r=e.localVars;r;r=r.next)if(r.name==t)return 1;for(var n=e.context;n;n=n.prev)for(r=n.vars;r;r=r.next)if(r.name==t)return 1}(e,n)?"variable-2":t}}}var I={state:null,column:null,marked:null,cc:null};function T(){for(var e=arguments.length-1;0<=e;e--)I.cc.push(arguments[e])}function $(){return T.apply(null,arguments),!0}function C(e,t){for(var r=t;r;r=r.next)if(r.name==e)return 1}function _(e){var t=I.state;if(I.marked="def",t.context)if("var"==t.lexical.info&&t.context&&t.context.block){var r=function e(t,r){{if(r){if(r.block){var n=e(t,r.prev);return n?n==r.prev?r:new q(n,r.vars,!0):null}return C(t,r.vars)?r:new q(r.prev,new S(t,r.vars),!1)}return null}}(e,t.context);if(null!=r)return void(t.context=r)}else if(!C(e,t.localVars))return void(t.localVars=new S(e,t.localVars));l.globalVars&&!C(e,t.globalVars)&&(t.globalVars=new S(e,t.globalVars))}function O(e){return"public"==e||"private"==e||"protected"==e||"abstract"==e||"readonly"==e}function q(e,t,r){this.prev=e,this.vars=t,this.block=r}function S(e,t){this.name=e,this.next=t}var P=new S("this",new S("arguments",null));function N(){I.state.context=new q(I.state.context,I.state.localVars,!1),I.state.localVars=P}function U(){I.state.context=new q(I.state.context,I.state.localVars,!0),I.state.localVars=null}function W(){I.state.localVars=I.state.context.vars,I.state.context=I.state.context.prev}function B(n,a){function e(){var e=I.state,t=e.indented;if("stat"==e.lexical.type)t=e.lexical.indented;else for(var r=e.lexical;r&&")"==r.type&&r.align;r=r.prev)t=r.indented;e.lexical=new E(t,I.stream.column(),n,null,e.lexical,a)}return e.lex=!0,e}function F(){var e=I.state;e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function H(r){return function e(t){return t==r?$():";"==r||"}"==t||")"==t||"]"==t?T():$(e)}}function D(e,t){return"var"==e?$(B("vardef",t),Ae,H(";"),F):"keyword a"==e?$(B("form"),L,D,F):"keyword b"==e?$(B("form"),D,F):"keyword d"==e?I.stream.match(/^\s*$/,!1)?$():$(B("stat"),R,H(";"),F):"debugger"==e?$(H(";")):"{"==e?$(B("}"),U,de,F,W):";"==e?$():"if"==e?("else"==I.state.lexical.info&&I.state.cc[I.state.cc.length-1]==F&&I.state.cc.pop()(),$(B("form"),L,D,F,$e)):"function"==e?$(qe):"for"==e?$(B("form"),Ce,D,F):"class"==e||u&&"interface"==t?(I.marked="keyword",$(B("form","class"==e?e:t),We,F)):"variable"==e?u&&"declare"==t?(I.marked="keyword",$(D)):u&&("module"==t||"enum"==t||"type"==t)&&I.stream.match(/^\s*\w/,!1)?(I.marked="keyword","enum"==t?$(Ye):"type"==t?$(Pe,H("operator"),ye,H(";")):$(B("form"),Ve,H("{"),B("}"),de,F,F)):u&&"namespace"==t?(I.marked="keyword",$(B("form"),J,D,F)):u&&"abstract"==t?(I.marked="keyword",$(D)):$(B("stat"),ie):"switch"==e?$(B("form"),L,H("{"),B("}","switch"),U,de,F,F,W):"case"==e?$(J,H(":")):"default"==e?$(H(":")):"catch"==e?$(B("form"),N,G,D,F,W):"export"==e?$(B("stat"),De,F):"import"==e?$(B("stat"),Je,F):"async"==e?$(D):"@"==t?$(J,D):T(B("stat"),J,H(";"),F)}function G(e){if("("==e)return $(Ne,H(")"))}function J(e,t){return Q(e,t,!1)}function K(e,t){return Q(e,t,!0)}function L(e){return"("!=e?T():$(B(")"),R,H(")"),F)}function Q(e,t,r){if(I.state.fatArrowAt==I.stream.start){var n=r?re:te;if("("==e)return $(N,B(")"),fe(Ne,")"),F,H("=>"),n,W);if("variable"==e)return T(N,Ve,H("=>"),n,W)}var a,i=r?Y:X;return V.hasOwnProperty(e)?$(i):"function"==e?$(qe,i):"class"==e||u&&"interface"==t?(I.marked="keyword",$(B("form"),Ue,F)):"keyword c"==e||"async"==e?$(r?K:J):"("==e?$(B(")"),R,H(")"),F,i):"operator"==e||"spread"==e?$(r?K:J):"["==e?$(B("]"),Xe,F,i):"{"==e?le(ce,"}",null,i):"quasi"==e?T(Z,i):"new"==e?$((a=r,function(e){return"."==e?$(a?ae:ne):"variable"==e&&u?$(ge,a?Y:X):T(a?K:J)})):"import"==e?$(J):$()}function R(e){return e.match(/[;\}\)\],]/)?T():T(J)}function X(e,t){return","==e?$(R):Y(e,t,!1)}function Y(e,t,r){var n=0==r?X:Y,a=0==r?J:K;return"=>"==e?$(N,r?re:te,W):"operator"==e?/\+\+|--/.test(t)||u&&"!"==t?$(n):u&&"<"==t&&I.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/,!1)?$(B(">"),fe(ye,">"),F,n):"?"==t?$(J,H(":"),a):$(a):"quasi"==e?T(Z,n):";"!=e?"("==e?le(K,")","call",n):"."==e?$(oe,n):"["==e?$(B("]"),R,H("]"),F,n):u&&"as"==t?(I.marked="keyword",$(ye,n)):"regexp"==e?(I.state.lastType=I.marked="operator",I.stream.backUp(I.stream.pos-I.stream.start-1),$(a)):void 0:void 0}function Z(e,t){return"quasi"!=e?T():"${"!=t.slice(t.length-2)?$(Z):$(J,ee)}function ee(e){if("}"==e)return I.marked="string-2",I.state.tokenize=j,$(Z)}function te(e){return A(I.stream,I.state),T("{"==e?D:J)}function re(e){return A(I.stream,I.state),T("{"==e?D:K)}function ne(e,t){if("target"==t)return I.marked="keyword",$(X)}function ae(e,t){if("target"==t)return I.marked="keyword",$(Y)}function ie(e){return":"==e?$(F,D):T(X,H(";"),F)}function oe(e){if("variable"==e)return I.marked="property",$()}function ce(e,t){if("async"==e)return I.marked="property",$(ce);if("variable"==e||"keyword"==I.style){return(I.marked="property","get"==t||"set"==t)?$(se):(u&&I.state.fatArrowAt==I.stream.start&&(r=I.stream.match(/^\s*:\s*/,!1))&&(I.state.fatArrowAt=I.stream.pos+r[0].length),$(ue));var r}else{if("number"==e||"string"==e)return I.marked=c?"property":I.style+" property",$(ue);if("jsonld-keyword"==e)return $(ue);if(u&&O(t))return I.marked="keyword",$(ce);if("["==e)return $(J,pe,H("]"),ue);if("spread"==e)return $(K,ue);if("*"==t)return I.marked="keyword",$(ce);if(":"==e)return T(ue)}}function se(e){return"variable"!=e?T(ue):(I.marked="property",$(qe))}function ue(e){return":"==e?$(K):"("==e?T(qe):void 0}function fe(n,a,i){function o(e,t){if(i?-1<i.indexOf(e):","==e){var r=I.state.lexical;return"call"==r.info&&(r.pos=(r.pos||0)+1),$(function(e,t){return e==a||t==a?T():T(n)},o)}return e==a||t==a?$():i&&-1<i.indexOf(";")?T(n):$(H(a))}return function(e,t){return e==a||t==a?$():T(n,o)}}function le(e,t,r){for(var n=3;n<arguments.length;n++)I.cc.push(arguments[n]);return $(B(t,r),fe(e,t),F)}function de(e){return"}"==e?$():T(D,de)}function pe(e,t){if(u){if(":"==e)return $(ye);if("?"==t)return $(pe)}}function me(e,t){if(u&&(":"==e||"in"==t))return $(ye)}function ve(e){if(u&&":"==e)return I.stream.match(/^\s*\w+\s+is\b/,!1)?$(J,ke,ye):$(ye)}function ke(e,t){if("is"==t)return I.marked="keyword",$()}function ye(e,t){return"keyof"==t||"typeof"==t||"infer"==t?(I.marked="keyword",$("typeof"==t?K:ye)):"variable"==e||"void"==t?(I.marked="type",$(he)):"|"==t||"&"==t?$(ye):"string"==e||"number"==e||"atom"==e?$(he):"["==e?$(B("]"),fe(ye,"]",","),F,he):"{"==e?$(B("}"),fe(be,"}",",;"),F,he):"("==e?$(fe(xe,")"),we,he):"<"==e?$(fe(ye,">"),ye):void 0}function we(e){if("=>"==e)return $(ye)}function be(e,t){return"variable"==e||"keyword"==I.style?(I.marked="property",$(be)):"?"==t||"number"==e||"string"==e?$(be):":"==e?$(ye):"["==e?$(H("variable"),me,H("]"),be):"("==e?T(Se,be):void 0}function xe(e,t){return"variable"==e&&I.stream.match(/^\s*[?:]/,!1)||"?"==t?$(xe):":"==e?$(ye):"spread"==e?$(xe):T(ye)}function he(e,t){return"<"==t?$(B(">"),fe(ye,">"),F,he):"|"==t||"."==e||"&"==t?$(ye):"["==e?$(ye,H("]"),he):"extends"==t||"implements"==t?(I.marked="keyword",$(ye)):"?"==t?$(ye,H(":"),ye):void 0}function ge(e,t){if("<"==t)return $(B(">"),fe(ye,">"),F,he)}function je(){return T(ye,Me)}function Me(e,t){if("="==t)return $(ye)}function Ae(e,t){return"enum"==t?(I.marked="keyword",$(Ye)):T(Ve,pe,Ie,Te)}function Ve(e,t){return u&&O(t)?(I.marked="keyword",$(Ve)):"variable"==e?(_(t),$()):"spread"==e?$(Ve):"["==e?le(ze,"]"):"{"==e?le(Ee,"}"):void 0}function Ee(e,t){return"variable"!=e||I.stream.match(/^\s*:/,!1)?("variable"==e&&(I.marked="property"),"spread"==e?$(Ve):"}"==e?T():"["==e?$(J,H("]"),H(":"),Ee):$(H(":"),Ve,Ie)):(_(t),$(Ie))}function ze(){return T(Ve,Ie)}function Ie(e,t){if("="==t)return $(K)}function Te(e){if(","==e)return $(Ae)}function $e(e,t){if("keyword b"==e&&"else"==t)return $(B("form","else"),D,F)}function Ce(e,t){return"await"==t?$(Ce):"("==e?$(B(")"),_e,F):void 0}function _e(e){return"var"==e?$(Ae,Oe):("variable"==e?$:T)(Oe)}function Oe(e,t){return")"==e?$():";"==e?$(Oe):"in"==t||"of"==t?(I.marked="keyword",$(J,Oe)):T(J,Oe)}function qe(e,t){return"*"==t?(I.marked="keyword",$(qe)):"variable"==e?(_(t),$(qe)):"("==e?$(N,B(")"),fe(Ne,")"),F,ve,D,W):u&&"<"==t?$(B(">"),fe(je,">"),F,qe):void 0}function Se(e,t){return"*"==t?(I.marked="keyword",$(Se)):"variable"==e?(_(t),$(Se)):"("==e?$(N,B(")"),fe(Ne,")"),F,ve,W):u&&"<"==t?$(B(">"),fe(je,">"),F,Se):void 0}function Pe(e,t){return"keyword"==e||"variable"==e?(I.marked="type",$(Pe)):"<"==t?$(B(">"),fe(je,">"),F):void 0}function Ne(e,t){return"@"==t&&$(J,Ne),"spread"==e?$(Ne):u&&O(t)?(I.marked="keyword",$(Ne)):u&&"this"==e?$(pe,Ie):T(Ve,pe,Ie)}function Ue(e,t){return("variable"==e?We:Be)(e,t)}function We(e,t){if("variable"==e)return _(t),$(Be)}function Be(e,t){return"<"==t?$(B(">"),fe(je,">"),F,Be):"extends"==t||"implements"==t||u&&","==e?("implements"==t&&(I.marked="keyword"),$(u?ye:J,Be)):"{"==e?$(B("}"),Fe,F):void 0}function Fe(e,t){return"async"==e||"variable"==e&&("static"==t||"get"==t||"set"==t||u&&O(t))&&I.stream.match(/^\s+[\w$\xa1-\uffff]/,!1)?(I.marked="keyword",$(Fe)):"variable"==e||"keyword"==I.style?(I.marked="property",$(He,Fe)):"number"==e||"string"==e?$(He,Fe):"["==e?$(J,pe,H("]"),He,Fe):"*"==t?(I.marked="keyword",$(Fe)):u&&"("==e?T(Se,Fe):";"==e||","==e?$(Fe):"}"==e?$():"@"==t?$(J,Fe):void 0}function He(e,t){if("?"==t)return $(He);if(":"==e)return $(ye,Ie);if("="==t)return $(K);var r=I.state.lexical.prev;return T(r&&"interface"==r.info?Se:qe)}function De(e,t){return"*"==t?(I.marked="keyword",$(Re,H(";"))):"default"==t?(I.marked="keyword",$(J,H(";"))):"{"==e?$(fe(Ge,"}"),Re,H(";")):T(D)}function Ge(e,t){return"as"==t?(I.marked="keyword",$(H("variable"))):"variable"==e?T(K,Ge):void 0}function Je(e){return"string"==e?$():"("==e?T(J):T(Ke,Le,Re)}function Ke(e,t){return"{"==e?le(Ke,"}"):("variable"==e&&_(t),"*"==t&&(I.marked="keyword"),$(Qe))}function Le(e){if(","==e)return $(Ke,Le)}function Qe(e,t){if("as"==t)return I.marked="keyword",$(Ke)}function Re(e,t){if("from"==t)return I.marked="keyword",$(J)}function Xe(e){return"]"==e?$():T(fe(K,"]"))}function Ye(){return T(B("form"),Ve,H("{"),B("}"),fe(Ze,"}"),F,F)}function Ze(){return T(Ve,Ie)}function et(e,t,r){return t.tokenize==h&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(t.lastType)||"quasi"==t.lastType&&/\{\s*$/.test(e.string.slice(0,e.pos-(r||0)))}return F.lex=W.lex=!0,{startState:function(e){var t={tokenize:h,lastType:"sof",cc:[],lexical:new E((e||0)-d,0,"block",!1),localVars:l.localVars,context:l.localVars&&new q(null,null,!1),indented:e||0};return l.globalVars&&"object"==typeof l.globalVars&&(t.globalVars=l.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),A(e,t)),t.tokenize!=g&&e.eatSpace())return null;var r=t.tokenize(e,t);return"comment"==k?r:(t.lastType="operator"!=k||"++"!=y&&"--"!=y?k:"incdec",z(t,r,k,y,e))},indent:function(e,t){if(e.tokenize==g||e.tokenize==j)return tt.Pass;if(e.tokenize!=h)return 0;var r,n=t&&t.charAt(0),a=e.lexical;if(!/^\s*else\b/.test(t))for(var i=e.cc.length-1;0<=i;--i){var o=e.cc[i];if(o==F)a=a.prev;else if(o!=$e)break}for(;("stat"==a.type||"form"==a.type)&&("}"==n||(r=e.cc[e.cc.length-1])&&(r==X||r==Y)&&!/^[,\.=+\-*:?[\(]/.test(t));)a=a.prev;p&&")"==a.type&&"stat"==a.prev.type&&(a=a.prev);var c,s,u=a.type,f=n==u;return"vardef"==u?a.indented+("operator"==e.lastType||","==e.lastType?a.info.length+1:0):"form"==u&&"{"==n?a.indented:"form"==u?a.indented+d:"stat"==u?a.indented+(s=t,"operator"==(c=e).lastType||","==c.lastType||w.test(s.charAt(0))||/[,.]/.test(s.charAt(0))?p||d:0):"switch"!=a.info||f||0==l.doubleIndentSwitch?a.align?a.column+(f?0:1):a.indented+(f?0:d):a.indented+(/^(?:case|default)\b/.test(t)?d:2*d)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:s?null:"/*",blockCommentEnd:s?null:"*/",blockCommentContinue:s?null:" * ",lineComment:s?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:s?"json":"javascript",jsonldMode:c,jsonMode:s,expressionAllowed:et,skipExpression:function(e){var t=e.cc[e.cc.length-1];t!=J&&t!=K||e.cc.pop()}}}),tt.registerHelper("wordChars","javascript",/[\w$]/),tt.defineMIME("text/javascript","javascript"),tt.defineMIME("text/ecmascript","javascript"),tt.defineMIME("application/javascript","javascript"),tt.defineMIME("application/x-javascript","javascript"),tt.defineMIME("application/ecmascript","javascript"),tt.defineMIME("application/json",{name:"javascript",json:!0}),tt.defineMIME("application/x-json",{name:"javascript",json:!0}),tt.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),tt.defineMIME("text/typescript",{name:"javascript",typescript:!0}),tt.defineMIME("application/typescript",{name:"javascript",typescript:!0})}); diff --git a/plugins/tiddlywiki/codemirror-mode-markdown/files/mode/markdown/markdown.js b/plugins/tiddlywiki/codemirror-mode-markdown/files/mode/markdown/markdown.js index 93d1b593f..f3ca8f029 100755 --- a/plugins/tiddlywiki/codemirror-mode-markdown/files/mode/markdown/markdown.js +++ b/plugins/tiddlywiki/codemirror-mode-markdown/files/mode/markdown/markdown.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("../xml/xml"),require("../tw-meta")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../meta"],t):t(CodeMirror)}(function(t){"use strict";t.defineMode("markdown",function(e,i){var n=t.getMode(e,"text/html"),r="null"==n.name;void 0===i.highlightFormatting&&(i.highlightFormatting=!1),void 0===i.maxBlockquoteDepth&&(i.maxBlockquoteDepth=0),void 0===i.taskLists&&(i.taskLists=!1),void 0===i.strikethrough&&(i.strikethrough=!1),void 0===i.emoji&&(i.emoji=!1),void 0===i.fencedCodeBlockHighlighting&&(i.fencedCodeBlockHighlighting=!0),void 0===i.xml&&(i.xml=!0),void 0===i.tokenTypeOverrides&&(i.tokenTypeOverrides={});var a={header:"header",code:"comment",quote:"quote",list1:"variable-2",list2:"variable-3",list3:"keyword",hr:"hr",image:"image",imageAltText:"image-alt-text",imageMarker:"image-marker",formatting:"formatting",linkInline:"link",linkEmail:"link",linkText:"link",linkHref:"string",em:"em",strong:"strong",strikethrough:"strikethrough",emoji:"builtin"};for(var l in a)a.hasOwnProperty(l)&&i.tokenTypeOverrides[l]&&(a[l]=i.tokenTypeOverrides[l]);var o=/^([*\-_])(?:\s*\1){2,}\s*$/,h=/^(?:[*\-+]|^[0-9]+([.)]))\s+/,g=/^\[(x| )\](?=\s)/i,s=i.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,m=/^ *(?:\={1,}|-{1,})\s*$/,u=/^[^#!\[\]*_\\<>` "'(~:]+/,f=/^(~~~+|```+)[ \t]*([\w+#-]*)[^\n`]*$/,c=/^\s*\[[^\]]+?\]:.*$/,d=/[!\"#$%&\'()*+,\-\.\/:;<=>?@\[\\\]^_`{|}~—]/;function k(t,e,i){return e.f=e.inline=i,i(t,e)}function p(t,e,i){return e.f=e.block=i,i(t,e)}function x(t){return t.linkTitle=!1,t.linkHref=!1,t.linkText=!1,t.em=!1,t.strong=!1,t.strikethrough=!1,t.quote=0,t.indentedCode=!1,t.f==S&&(t.f=M,t.block=v),t.trailingSpace=0,t.trailingSpaceNewLine=!1,t.prevLine=t.thisLine,t.thisLine={stream:null},null}function v(n,r){var l,u=n.column()===r.indentation,d=!(l=r.prevLine.stream)||!/\S/.test(l.string),p=r.indentedCode,x=r.prevLine.hr,v=!1!==r.list,S=(r.listStack[r.listStack.length-1]||0)+3;r.indentedCode=!1;var q=r.indentation;if(null===r.indentationDiff&&(r.indentationDiff=r.indentation,v)){for(r.em=!1,r.strong=!1,r.code=!1,r.strikethrough=!1,r.list=null;q<r.listStack[r.listStack.length-1];)r.listStack.pop(),r.listStack.length?r.indentation=r.listStack[r.listStack.length-1]:r.list=!1;!1!==r.list&&(r.indentationDiff=q-r.listStack[r.listStack.length-1])}var M=!(d||x||r.prevLine.header||v&&p||r.prevLine.fencedCodeEnd),F=(!1===r.list||x||d)&&r.indentation<=S&&n.match(o),b=null;if(r.indentationDiff>=4&&(p||r.prevLine.fencedCodeEnd||r.prevLine.header||d))return n.skipToEnd(),r.indentedCode=!0,a.code;if(n.eatSpace())return null;if(u&&r.indentation<=S&&(b=n.match(s))&&b[1].length<=6)return r.quote=0,r.header=b[1].length,r.thisLine.header=!0,i.highlightFormatting&&(r.formatting="header"),r.f=r.inline,T(r);if(r.indentation<=S&&n.eat(">"))return r.quote=u?1:r.quote+1,i.highlightFormatting&&(r.formatting="quote"),n.eatSpace(),T(r);if(!F&&!r.setext&&u&&r.indentation<=S&&(b=n.match(h))){var E=b[1]?"ol":"ul";return r.indentation=q+n.current().length,r.list=!0,r.quote=0,r.listStack.push(r.indentation),i.taskLists&&n.match(g,!1)&&(r.taskList=!0),r.f=r.inline,i.highlightFormatting&&(r.formatting=["list","list-"+E]),T(r)}return u&&r.indentation<=S&&(b=n.match(f,!0))?(r.quote=0,r.fencedEndRE=new RegExp(b[1]+"+ *$"),r.localMode=i.fencedCodeBlockHighlighting&&function(i){if(t.findModeByName){var n=t.findModeByName(i);n&&(i=n.mime||n.mimes[0])}var r=t.getMode(e,i);return"null"==r.name?null:r}(b[2]),r.localMode&&(r.localState=t.startState(r.localMode)),r.f=r.block=L,i.highlightFormatting&&(r.formatting="code-block"),r.code=-1,T(r)):r.setext||!(M&&v||r.quote||!1!==r.list||r.code||F||c.test(n.string))&&(b=n.lookAhead(1))&&(b=b.match(m))?(r.setext?(r.header=r.setext,r.setext=0,n.skipToEnd(),i.highlightFormatting&&(r.formatting="header")):(r.header="="==b[0].charAt(0)?1:2,r.setext=r.header),r.thisLine.header=!0,r.f=r.inline,T(r)):F?(n.skipToEnd(),r.hr=!0,r.thisLine.hr=!0,a.hr):"["===n.peek()?k(n,r,w):k(n,r,r.inline)}function S(e,i){var a=n.token(e,i.htmlState);if(!r){var l=t.innerMode(n,i.htmlState);("xml"==l.mode.name&&null===l.state.tagStart&&!l.state.context&&l.state.tokenize.isInText||i.md_inside&&e.current().indexOf(">")>-1)&&(i.f=M,i.block=v,i.htmlState=null)}return a}function L(t,e){var n,r=e.listStack[e.listStack.length-1]||0,l=e.indentation<r,o=r+3;return e.fencedEndRE&&e.indentation<=o&&(l||t.match(e.fencedEndRE))?(i.highlightFormatting&&(e.formatting="code-block"),l||(n=T(e)),e.localMode=e.localState=null,e.block=v,e.f=M,e.fencedEndRE=null,e.code=0,e.thisLine.fencedCodeEnd=!0,l?p(t,e,e.block):n):e.localMode?e.localMode.token(t,e.localState):(t.skipToEnd(),a.code)}function T(t){var e=[];if(t.formatting){e.push(a.formatting),"string"==typeof t.formatting&&(t.formatting=[t.formatting]);for(var n=0;n<t.formatting.length;n++)e.push(a.formatting+"-"+t.formatting[n]),"header"===t.formatting[n]&&e.push(a.formatting+"-"+t.formatting[n]+"-"+t.header),"quote"===t.formatting[n]&&(!i.maxBlockquoteDepth||i.maxBlockquoteDepth>=t.quote?e.push(a.formatting+"-"+t.formatting[n]+"-"+t.quote):e.push("error"))}if(t.taskOpen)return e.push("meta"),e.length?e.join(" "):null;if(t.taskClosed)return e.push("property"),e.length?e.join(" "):null;if(t.linkHref?e.push(a.linkHref,"url"):(t.strong&&e.push(a.strong),t.em&&e.push(a.em),t.strikethrough&&e.push(a.strikethrough),t.emoji&&e.push(a.emoji),t.linkText&&e.push(a.linkText),t.code&&e.push(a.code),t.image&&e.push(a.image),t.imageAltText&&e.push(a.imageAltText,"link"),t.imageMarker&&e.push(a.imageMarker)),t.header&&e.push(a.header,a.header+"-"+t.header),t.quote&&(e.push(a.quote),!i.maxBlockquoteDepth||i.maxBlockquoteDepth>=t.quote?e.push(a.quote+"-"+t.quote):e.push(a.quote+"-"+i.maxBlockquoteDepth)),!1!==t.list){var r=(t.listStack.length-1)%3;r?1===r?e.push(a.list2):e.push(a.list3):e.push(a.list1)}return t.trailingSpaceNewLine?e.push("trailing-space-new-line"):t.trailingSpace&&e.push("trailing-space-"+(t.trailingSpace%2?"a":"b")),e.length?e.join(" "):null}function q(t,e){if(t.match(u,!0))return T(e)}function M(e,r){var l=r.text(e,r);if(void 0!==l)return l;if(r.list)return r.list=null,T(r);if(r.taskList)return" "===e.match(g,!0)[1]?r.taskOpen=!0:r.taskClosed=!0,i.highlightFormatting&&(r.formatting="task"),r.taskList=!1,T(r);if(r.taskOpen=!1,r.taskClosed=!1,r.header&&e.match(/^#+$/,!0))return i.highlightFormatting&&(r.formatting="header"),T(r);var o=e.next();if(r.linkTitle){r.linkTitle=!1;var h=o;"("===o&&(h=")");var s="^\\s*(?:[^"+(h=(h+"").replace(/([.?*+^\[\]\\(){}|-])/g,"\\$1"))+"\\\\]+|\\\\\\\\|\\\\.)"+h;if(e.match(new RegExp(s),!0))return a.linkHref}if("`"===o){var m=r.formatting;i.highlightFormatting&&(r.formatting="code"),e.eatWhile("`");var u=e.current().length;if(0!=r.code||r.quote&&1!=u){if(u==r.code){var f=T(r);return r.code=0,f}return r.formatting=m,T(r)}return r.code=u,T(r)}if(r.code)return T(r);if("\\"===o&&(e.next(),i.highlightFormatting)){var c=T(r),k=a.formatting+"-escape";return c?c+" "+k:k}if("!"===o&&e.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return r.imageMarker=!0,r.image=!0,i.highlightFormatting&&(r.formatting="image"),T(r);if("["===o&&r.imageMarker&&e.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/,!1))return r.imageMarker=!1,r.imageAltText=!0,i.highlightFormatting&&(r.formatting="image"),T(r);if("]"===o&&r.imageAltText){i.highlightFormatting&&(r.formatting="image");var c=T(r);return r.imageAltText=!1,r.image=!1,r.inline=r.f=b,c}if("["===o&&!r.image)return r.linkText=!0,i.highlightFormatting&&(r.formatting="link"),T(r);if("]"===o&&r.linkText){i.highlightFormatting&&(r.formatting="link");var c=T(r);return r.linkText=!1,r.inline=r.f=e.match(/\(.*?\)| ?\[.*?\]/,!1)?b:M,c}if("<"===o&&e.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1))return r.f=r.inline=F,i.highlightFormatting&&(r.formatting="link"),(c=T(r))?c+=" ":c="",c+a.linkInline;if("<"===o&&e.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1))return r.f=r.inline=F,i.highlightFormatting&&(r.formatting="link"),(c=T(r))?c+=" ":c="",c+a.linkEmail;if(i.xml&&"<"===o&&e.match(/^(!--|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*>)/i,!1)){var x=e.string.indexOf(">",e.pos);if(-1!=x){var v=e.string.substring(e.start,x);/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(v)&&(r.md_inside=!0)}return e.backUp(1),r.htmlState=t.startState(n),p(e,r,S)}if(i.xml&&"<"===o&&e.match(/^\/\w*?>/))return r.md_inside=!1,"tag";if("*"===o||"_"===o){for(var L=1,q=1==e.pos?" ":e.string.charAt(e.pos-2);L<3&&e.eat(o);)L++;var E=e.peek()||" ",w=!/\s/.test(E)&&(!d.test(E)||/\s/.test(q)||d.test(q)),j=!/\s/.test(q)&&(!d.test(q)||/\s/.test(E)||d.test(E)),y=null,C=null;if(L%2&&(r.em||!w||"*"!==o&&j&&!d.test(q)?r.em!=o||!j||"*"!==o&&w&&!d.test(E)||(y=!1):y=!0),L>1&&(r.strong||!w||"*"!==o&&j&&!d.test(q)?r.strong!=o||!j||"*"!==o&&w&&!d.test(E)||(C=!1):C=!0),null!=C||null!=y){i.highlightFormatting&&(r.formatting=null==y?"strong":null==C?"em":"strong em"),!0===y&&(r.em=o),!0===C&&(r.strong=o);f=T(r);return!1===y&&(r.em=!1),!1===C&&(r.strong=!1),f}}else if(" "===o&&(e.eat("*")||e.eat("_"))){if(" "===e.peek())return T(r);e.backUp(1)}if(i.strikethrough)if("~"===o&&e.eatWhile(o)){if(r.strikethrough){i.highlightFormatting&&(r.formatting="strikethrough");f=T(r);return r.strikethrough=!1,f}if(e.match(/^[^\s]/,!1))return r.strikethrough=!0,i.highlightFormatting&&(r.formatting="strikethrough"),T(r)}else if(" "===o&&e.match(/^~~/,!0)){if(" "===e.peek())return T(r);e.backUp(2)}if(i.emoji&&":"===o&&e.match(/^[a-z_\d+-]+:/)){r.emoji=!0,i.highlightFormatting&&(r.formatting="emoji");var H=T(r);return r.emoji=!1,H}return" "===o&&(e.match(/ +$/,!1)?r.trailingSpace++:r.trailingSpace&&(r.trailingSpaceNewLine=!0)),T(r)}function F(t,e){if(">"===t.next()){e.f=e.inline=M,i.highlightFormatting&&(e.formatting="link");var n=T(e);return n?n+=" ":n="",n+a.linkInline}return t.match(/^[^>]+/,!0),a.linkInline}function b(t,e){if(t.eatSpace())return null;var n,r=t.next();return"("===r||"["===r?(e.f=e.inline=(n="("===r?")":"]",function(t,e){var r=t.next();if(r===n){e.f=e.inline=M,i.highlightFormatting&&(e.formatting="link-string");var a=T(e);return e.linkHref=!1,a}return t.match(E[n]),e.linkHref=!0,T(e)}),i.highlightFormatting&&(e.formatting="link-string"),e.linkHref=!0,T(e)):"error"}var E={")":/^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/,"]":/^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/};function w(t,e){return t.match(/^([^\]\\]|\\.)*\]:/,!1)?(e.f=j,t.next(),i.highlightFormatting&&(e.formatting="link"),e.linkText=!0,T(e)):k(t,e,M)}function j(t,e){if(t.match(/^\]:/,!0)){e.f=e.inline=y,i.highlightFormatting&&(e.formatting="link");var n=T(e);return e.linkText=!1,n}return t.match(/^([^\]\\]|\\.)+/,!0),a.linkText}function y(t,e){return t.eatSpace()?null:(t.match(/^[^\s]+/,!0),void 0===t.peek()?e.linkTitle=!0:t.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/,!0),e.f=e.inline=M,a.linkHref+" url")}var C={startState:function(){return{f:v,prevLine:{stream:null},thisLine:{stream:null},block:v,htmlState:null,indentation:0,inline:M,text:q,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,setext:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,emoji:!1,fencedEndRE:null}},copyState:function(e){return{f:e.f,prevLine:e.prevLine,thisLine:e.thisLine,block:e.block,htmlState:e.htmlState&&t.copyState(n,e.htmlState),indentation:e.indentation,localMode:e.localMode,localState:e.localMode?t.copyState(e.localMode,e.localState):null,inline:e.inline,text:e.text,formatting:!1,linkText:e.linkText,linkTitle:e.linkTitle,linkHref:e.linkHref,code:e.code,em:e.em,strong:e.strong,strikethrough:e.strikethrough,emoji:e.emoji,header:e.header,setext:e.setext,hr:e.hr,taskList:e.taskList,list:e.list,listStack:e.listStack.slice(0),quote:e.quote,indentedCode:e.indentedCode,trailingSpace:e.trailingSpace,trailingSpaceNewLine:e.trailingSpaceNewLine,md_inside:e.md_inside,fencedEndRE:e.fencedEndRE}},token:function(t,e){if(e.formatting=!1,t!=e.thisLine.stream){if(e.header=0,e.hr=!1,t.match(/^\s*$/,!0))return x(e),null;if(e.prevLine=e.thisLine,e.thisLine={stream:t},e.taskList=!1,e.trailingSpace=0,e.trailingSpaceNewLine=!1,!e.localState&&(e.f=e.block,e.f!=S)){var i=t.match(/^\s*/,!0)[0].replace(/\t/g," ").length;if(e.indentation=i,e.indentationDiff=null,i>0)return null}}return e.f(t,e)},innerMode:function(t){return t.block==S?{state:t.htmlState,mode:n}:t.localState?{state:t.localState,mode:t.localMode}:{state:t,mode:C}},indent:function(e,i,r){return e.block==S&&n.indent?n.indent(e.htmlState,i,r):e.localState&&e.localMode.indent?e.localMode.indent(e.localState,i,r):t.Pass},blankLine:x,getType:T,closeBrackets:"()[]{}''\"\"``",fold:"markdown"};return C},"xml"),t.defineMIME("text/markdown","markdown"),t.defineMIME("text/x-markdown","markdown")}); +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("../xml/xml"),require("../tw-meta")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../tw-meta"],t):t(CodeMirror)}(function(j){"use strict";j.defineMode("markdown",function(c,x){var A=j.getMode(c,"text/html"),u="null"==A.name;void 0===x.highlightFormatting&&(x.highlightFormatting=!1),void 0===x.maxBlockquoteDepth&&(x.maxBlockquoteDepth=0),void 0===x.taskLists&&(x.taskLists=!1),void 0===x.strikethrough&&(x.strikethrough=!1),void 0===x.emoji&&(x.emoji=!1),void 0===x.fencedCodeBlockHighlighting&&(x.fencedCodeBlockHighlighting=!0),void 0===x.fencedCodeBlockDefaultMode&&(x.fencedCodeBlockDefaultMode="text/plain"),void 0===x.xml&&(x.xml=!0),void 0===x.tokenTypeOverrides&&(x.tokenTypeOverrides={});var C={header:"header",code:"comment",quote:"quote",list1:"variable-2",list2:"variable-3",list3:"keyword",hr:"hr",image:"image",imageAltText:"image-alt-text",imageMarker:"image-marker",formatting:"formatting",linkInline:"link",linkEmail:"link",linkText:"link",linkHref:"string",em:"em",strong:"strong",strikethrough:"strikethrough",emoji:"builtin"};for(var t in C)C.hasOwnProperty(t)&&x.tokenTypeOverrides[t]&&(C[t]=x.tokenTypeOverrides[t]);var f=/^([*\-_])(?:\s*\1){2,}\s*$/,k=/^(?:[*\-+]|^[0-9]+([.)]))\s+/,S=/^\[(x| )\](?=\s)/i,F=x.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,D=/^ {0,3}(?:\={1,}|-{2,})\s*$/,i=/^[^#!\[\]*_\\<>` "'(~:]+/,p=/^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/,E=/^\s*\[[^\]]+?\]:.*$/,v=/[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/;function B(t,e,i){return(e.f=e.inline=i)(t,e)}function L(t,e,i){return(e.f=e.block=i)(t,e)}function n(t){var e,i;return t.linkTitle=!1,t.linkHref=!1,t.linkText=!1,t.em=!1,t.strong=!1,t.strikethrough=!1,t.quote=0,t.indentedCode=!1,t.f==T&&((i=u)||(i="xml"==(e=j.innerMode(A,t.htmlState)).mode.name&&null===e.state.tagStart&&!e.state.context&&e.state.tokenize.isInText),i&&(t.f=b,t.block=a,t.htmlState=null)),t.trailingSpace=0,t.trailingSpaceNewLine=!1,t.prevLine=t.thisLine,t.thisLine={stream:null},null}function a(t,e){var i,n=t.column()===e.indentation,u=!(i=e.prevLine.stream)||!/\S/.test(i.string),r=e.indentedCode,a=e.prevLine.hr,o=!1!==e.list,l=(e.listStack[e.listStack.length-1]||0)+3;e.indentedCode=!1;var h=e.indentation;if(null===e.indentationDiff&&(e.indentationDiff=e.indentation,o)){for(e.list=null;h<e.listStack[e.listStack.length-1];)e.listStack.pop(),e.listStack.length?e.indentation=e.listStack[e.listStack.length-1]:e.list=!1;!1!==e.list&&(e.indentationDiff=h-e.listStack[e.listStack.length-1])}var s=!(u||a||e.prevLine.header||o&&r||e.prevLine.fencedCodeEnd),g=(!1===e.list||a||u)&&e.indentation<=l&&t.match(f),m=null;if(4<=e.indentationDiff&&(r||e.prevLine.fencedCodeEnd||e.prevLine.header||u))return t.skipToEnd(),e.indentedCode=!0,C.code;if(t.eatSpace())return null;if(n&&e.indentation<=l&&(m=t.match(F))&&m[1].length<=6)return e.quote=0,e.header=m[1].length,e.thisLine.header=!0,x.highlightFormatting&&(e.formatting="header"),e.f=e.inline,q(e);if(e.indentation<=l&&t.eat(">"))return e.quote=n?1:e.quote+1,x.highlightFormatting&&(e.formatting="quote"),t.eatSpace(),q(e);if(!g&&!e.setext&&n&&e.indentation<=l&&(m=t.match(k))){var d=m[1]?"ol":"ul";return e.indentation=h+t.current().length,e.list=!0,e.quote=0,e.listStack.push(e.indentation),e.em=!1,e.strong=!1,e.code=!1,e.strikethrough=!1,x.taskLists&&t.match(S,!1)&&(e.taskList=!0),e.f=e.inline,x.highlightFormatting&&(e.formatting=["list","list-"+d]),q(e)}return n&&e.indentation<=l&&(m=t.match(p,!0))?(e.quote=0,e.fencedEndRE=new RegExp(m[1]+"+ *$"),e.localMode=x.fencedCodeBlockHighlighting&&function(t){var e;!j.findModeByName||(e=j.findModeByName(t))&&(t=e.mime||e.mimes[0]);var i=j.getMode(c,t);return"null"==i.name?null:i}(m[2]||x.fencedCodeBlockDefaultMode),e.localMode&&(e.localState=j.startState(e.localMode)),e.f=e.block=M,x.highlightFormatting&&(e.formatting="code-block"),e.code=-1,q(e)):e.setext||!(s&&o||e.quote||!1!==e.list||e.code||g||E.test(t.string))&&(m=t.lookAhead(1))&&(m=m.match(D))?(e.setext?(e.header=e.setext,e.setext=0,t.skipToEnd(),x.highlightFormatting&&(e.formatting="header")):(e.header="="==m[0].charAt(0)?1:2,e.setext=e.header),e.thisLine.header=!0,e.f=e.inline,q(e)):g?(t.skipToEnd(),e.hr=!0,e.thisLine.hr=!0,C.hr):"["===t.peek()?B(t,e,H):B(t,e,e.inline)}function T(t,e){var i,n=A.token(t,e.htmlState);return u||("xml"==(i=j.innerMode(A,e.htmlState)).mode.name&&null===i.state.tagStart&&!i.state.context&&i.state.tokenize.isInText||e.md_inside&&-1<t.current().indexOf(">"))&&(e.f=b,e.block=a,e.htmlState=null),n}function M(t,e){var i,n=e.listStack[e.listStack.length-1]||0,u=e.indentation<n,r=n+3;return e.fencedEndRE&&e.indentation<=r&&(u||t.match(e.fencedEndRE))?(x.highlightFormatting&&(e.formatting="code-block"),u||(i=q(e)),e.localMode=e.localState=null,e.block=a,e.f=b,e.fencedEndRE=null,e.code=0,e.thisLine.fencedCodeEnd=!0,u?L(t,e,e.block):i):e.localMode?e.localMode.token(t,e.localState):(t.skipToEnd(),C.code)}function q(t){var e,i=[];if(t.formatting){i.push(C.formatting),"string"==typeof t.formatting&&(t.formatting=[t.formatting]);for(var n=0;n<t.formatting.length;n++)i.push(C.formatting+"-"+t.formatting[n]),"header"===t.formatting[n]&&i.push(C.formatting+"-"+t.formatting[n]+"-"+t.header),"quote"===t.formatting[n]&&(!x.maxBlockquoteDepth||x.maxBlockquoteDepth>=t.quote?i.push(C.formatting+"-"+t.formatting[n]+"-"+t.quote):i.push("error"))}return t.taskOpen?i.push("meta"):t.taskClosed?i.push("property"):(t.linkHref?i.push(C.linkHref,"url"):(t.strong&&i.push(C.strong),t.em&&i.push(C.em),t.strikethrough&&i.push(C.strikethrough),t.emoji&&i.push(C.emoji),t.linkText&&i.push(C.linkText),t.code&&i.push(C.code),t.image&&i.push(C.image),t.imageAltText&&i.push(C.imageAltText,"link"),t.imageMarker&&i.push(C.imageMarker)),t.header&&i.push(C.header,C.header+"-"+t.header),t.quote&&(i.push(C.quote),!x.maxBlockquoteDepth||x.maxBlockquoteDepth>=t.quote?i.push(C.quote+"-"+t.quote):i.push(C.quote+"-"+x.maxBlockquoteDepth)),!1!==t.list&&((e=(t.listStack.length-1)%3)?1==e?i.push(C.list2):i.push(C.list3):i.push(C.list1)),t.trailingSpaceNewLine?i.push("trailing-space-new-line"):t.trailingSpace&&i.push("trailing-space-"+(t.trailingSpace%2?"a":"b"))),i.length?i.join(" "):null}function e(t,e){if(t.match(i,!0))return q(e)}function b(t,e){var i=e.text(t,e);if(void 0!==i)return i;if(e.list)return e.list=null,q(e);if(e.taskList)return" "===t.match(S,!0)[1]?e.taskOpen=!0:e.taskClosed=!0,x.highlightFormatting&&(e.formatting="task"),e.taskList=!1,q(e);if(e.taskOpen=!1,e.taskClosed=!1,e.header&&t.match(/^#+$/,!0))return x.highlightFormatting&&(e.formatting="header"),q(e);var n=t.next();if(e.linkTitle){e.linkTitle=!1;var u="("===n?")":n,r="^\\s*(?:[^"+(u=(u+"").replace(/([.?*+^\[\]\\(){}|-])/g,"\\$1"))+"\\\\]+|\\\\\\\\|\\\\.)"+u;if(t.match(new RegExp(r),!0))return C.linkHref}if("`"===n){var a=e.formatting;x.highlightFormatting&&(e.formatting="code"),t.eatWhile("`");var o=t.current().length;if(0!=e.code||e.quote&&1!=o){if(o!=e.code)return e.formatting=a,q(e);var l=q(e);return e.code=0,l}return e.code=o,q(e)}if(e.code)return q(e);if("\\"===n&&(t.next(),x.highlightFormatting)){var h=q(e),s=C.formatting+"-escape";return h?h+" "+s:s}if("!"===n&&t.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return e.imageMarker=!0,e.image=!0,x.highlightFormatting&&(e.formatting="image"),q(e);if("["===n&&e.imageMarker&&t.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/,!1))return e.imageMarker=!1,e.imageAltText=!0,x.highlightFormatting&&(e.formatting="image"),q(e);if("]"===n&&e.imageAltText){x.highlightFormatting&&(e.formatting="image");var h=q(e);return e.imageAltText=!1,e.image=!1,e.inline=e.f=y,h}if("["===n&&!e.image)return e.linkText&&t.match(/^.*?\]/)||(e.linkText=!0,x.highlightFormatting&&(e.formatting="link")),q(e);if("]"===n&&e.linkText){x.highlightFormatting&&(e.formatting="link");var h=q(e);return e.linkText=!1,e.inline=e.f=t.match(/\(.*?\)| ?\[.*?\]/,!1)?y:b,h}if("<"===n&&t.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1))return e.f=e.inline=w,x.highlightFormatting&&(e.formatting="link"),(h=q(e))?h+=" ":h="",h+C.linkInline;if("<"===n&&t.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1))return e.f=e.inline=w,x.highlightFormatting&&(e.formatting="link"),(h=q(e))?h+=" ":h="",h+C.linkEmail;if(x.xml&&"<"===n&&t.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i,!1)){var g,m=t.string.indexOf(">",t.pos);return-1!=m&&(g=t.string.substring(t.start,m),/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(g)&&(e.md_inside=!0)),t.backUp(1),e.htmlState=j.startState(A),L(t,e,T)}if(x.xml&&"<"===n&&t.match(/^\/\w*?>/))return e.md_inside=!1,"tag";if("*"===n||"_"===n){for(var d=1,c=1==t.pos?" ":t.string.charAt(t.pos-2);d<3&&t.eat(n);)d++;var f=t.peek()||" ",k=!/\s/.test(f)&&(!v.test(f)||/\s/.test(c)||v.test(c)),F=!/\s/.test(c)&&(!v.test(c)||/\s/.test(f)||v.test(f)),D=null,p=null;if(d%2&&(e.em||!k||"*"!==n&&F&&!v.test(c)?e.em!=n||!F||"*"!==n&&k&&!v.test(f)||(D=!1):D=!0),1<d&&(e.strong||!k||"*"!==n&&F&&!v.test(c)?e.strong!=n||!F||"*"!==n&&k&&!v.test(f)||(p=!1):p=!0),null!=p||null!=D){x.highlightFormatting&&(e.formatting=null==D?"strong":null==p?"em":"strong em"),!0===D&&(e.em=n),!0===p&&(e.strong=n);l=q(e);return!1===D&&(e.em=!1),!1===p&&(e.strong=!1),l}}else if(" "===n&&(t.eat("*")||t.eat("_"))){if(" "===t.peek())return q(e);t.backUp(1)}if(x.strikethrough)if("~"===n&&t.eatWhile(n)){if(e.strikethrough){x.highlightFormatting&&(e.formatting="strikethrough");l=q(e);return e.strikethrough=!1,l}if(t.match(/^[^\s]/,!1))return e.strikethrough=!0,x.highlightFormatting&&(e.formatting="strikethrough"),q(e)}else if(" "===n&&t.match(/^~~/,!0)){if(" "===t.peek())return q(e);t.backUp(2)}if(x.emoji&&":"===n&&t.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)){e.emoji=!0,x.highlightFormatting&&(e.formatting="emoji");var E=q(e);return e.emoji=!1,E}return" "===n&&(t.match(/^ +$/,!1)?e.trailingSpace++:e.trailingSpace&&(e.trailingSpaceNewLine=!0)),q(e)}function w(t,e){if(">"!==t.next())return t.match(/^[^>]+/,!0),C.linkInline;e.f=e.inline=b,x.highlightFormatting&&(e.formatting="link");var i=q(e);return i?i+=" ":i="",i+C.linkInline}function y(t,e){if(t.eatSpace())return null;var n,i=t.next();return"("===i||"["===i?(e.f=e.inline=(n="("===i?")":"]",function(t,e){if(t.next()!==n)return t.match(r[n]),e.linkHref=!0,q(e);e.f=e.inline=b,x.highlightFormatting&&(e.formatting="link-string");var i=q(e);return e.linkHref=!1,i}),x.highlightFormatting&&(e.formatting="link-string"),e.linkHref=!0,q(e)):"error"}var r={")":/^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/,"]":/^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/};function H(t,e){return t.match(/^([^\]\\]|\\.)*\]:/,!1)?(e.f=o,t.next(),x.highlightFormatting&&(e.formatting="link"),e.linkText=!0,q(e)):B(t,e,b)}function o(t,e){if(t.match(/^\]:/,!0)){e.f=e.inline=l,x.highlightFormatting&&(e.formatting="link");var i=q(e);return e.linkText=!1,i}return t.match(/^([^\]\\]|\\.)+/,!0),C.linkText}function l(t,e){return t.eatSpace()?null:(t.match(/^[^\s]+/,!0),void 0===t.peek()?e.linkTitle=!0:t.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/,!0),e.f=e.inline=b,C.linkHref+" url")}var h={startState:function(){return{f:a,prevLine:{stream:null},thisLine:{stream:null},block:a,htmlState:null,indentation:0,inline:b,text:e,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,setext:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,emoji:!1,fencedEndRE:null}},copyState:function(t){return{f:t.f,prevLine:t.prevLine,thisLine:t.thisLine,block:t.block,htmlState:t.htmlState&&j.copyState(A,t.htmlState),indentation:t.indentation,localMode:t.localMode,localState:t.localMode?j.copyState(t.localMode,t.localState):null,inline:t.inline,text:t.text,formatting:!1,linkText:t.linkText,linkTitle:t.linkTitle,linkHref:t.linkHref,code:t.code,em:t.em,strong:t.strong,strikethrough:t.strikethrough,emoji:t.emoji,header:t.header,setext:t.setext,hr:t.hr,taskList:t.taskList,list:t.list,listStack:t.listStack.slice(0),quote:t.quote,indentedCode:t.indentedCode,trailingSpace:t.trailingSpace,trailingSpaceNewLine:t.trailingSpaceNewLine,md_inside:t.md_inside,fencedEndRE:t.fencedEndRE}},token:function(t,e){if(e.formatting=!1,t!=e.thisLine.stream){if(e.header=0,e.hr=!1,t.match(/^\s*$/,!0))return n(e),null;if(e.prevLine=e.thisLine,e.thisLine={stream:t},e.taskList=!1,e.trailingSpace=0,e.trailingSpaceNewLine=!1,!e.localState&&(e.f=e.block,e.f!=T)){var i=t.match(/^\s*/,!0)[0].replace(/\t/g," ").length;if(e.indentation=i,e.indentationDiff=null,0<i)return null}}return e.f(t,e)},innerMode:function(t){return t.block==T?{state:t.htmlState,mode:A}:t.localState?{state:t.localState,mode:t.localMode}:{state:t,mode:h}},indent:function(t,e,i){return t.block==T&&A.indent?A.indent(t.htmlState,e,i):t.localState&&t.localMode.indent?t.localMode.indent(t.localState,e,i):j.Pass},blankLine:n,getType:q,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",closeBrackets:"()[]{}''\"\"``",fold:"markdown"};return h},"xml"),j.defineMIME("text/markdown","markdown"),j.defineMIME("text/x-markdown","markdown")}); diff --git a/plugins/tiddlywiki/codemirror-mode-xml/files/mode/xml/xml.js b/plugins/tiddlywiki/codemirror-mode-xml/files/mode/xml/xml.js index 8e6c28829..3a3909758 100755 --- a/plugins/tiddlywiki/codemirror-mode-xml/files/mode/xml/xml.js +++ b/plugins/tiddlywiki/codemirror-mode-xml/files/mode/xml/xml.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";var e={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0},n={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,allowMissingTagName:!1,caseFold:!1};t.defineMode("xml",function(r,o){var a,i,l=r.indentUnit,u={},d=o.htmlMode?e:n;for(var c in d)u[c]=d[c];for(var c in o)u[c]=o[c];function s(t,e){function n(n){return e.tokenize=n,n(t,e)}var r=t.next();return"<"==r?t.eat("!")?t.eat("[")?t.match("CDATA[")?n(m("atom","]]>")):null:t.match("--")?n(m("comment","--\x3e")):t.match("DOCTYPE",!0,!0)?(t.eatWhile(/[\w\._\-]/),n(function t(e){return function(n,r){for(var o;null!=(o=n.next());){if("<"==o)return r.tokenize=t(e+1),r.tokenize(n,r);if(">"==o){if(1==e){r.tokenize=s;break}return r.tokenize=t(e-1),r.tokenize(n,r)}}return"meta"}}(1))):null:t.eat("?")?(t.eatWhile(/[\w\._\-]/),e.tokenize=m("meta","?>"),"meta"):(a=t.eat("/")?"closeTag":"openTag",e.tokenize=f,"tag bracket"):"&"==r?(t.eat("#")?t.eat("x")?t.eatWhile(/[a-fA-F\d]/)&&t.eat(";"):t.eatWhile(/[\d]/)&&t.eat(";"):t.eatWhile(/[\w\.\-:]/)&&t.eat(";"))?"atom":"error":(t.eatWhile(/[^&<]/),null)}function f(t,e){var n,r,o=t.next();if(">"==o||"/"==o&&t.eat(">"))return e.tokenize=s,a=">"==o?"endTag":"selfcloseTag","tag bracket";if("="==o)return a="equals",null;if("<"==o){e.tokenize=s,e.state=h,e.tagName=e.tagStart=null;var i=e.tokenize(t,e);return i?i+" tag error":"tag error"}return/[\'\"]/.test(o)?(e.tokenize=(n=o,(r=function(t,e){for(;!t.eol();)if(t.next()==n){e.tokenize=f;break}return"string"}).isInAttribute=!0,r),e.stringStartCol=t.column(),e.tokenize(t,e)):(t.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function m(t,e){return function(n,r){for(;!n.eol();){if(n.match(e)){r.tokenize=s;break}n.next()}return t}}function g(t){t.context&&(t.context=t.context.prev)}function p(t,e){for(var n;;){if(!t.context)return;if(n=t.context.tagName,!u.contextGrabbers.hasOwnProperty(n)||!u.contextGrabbers[n].hasOwnProperty(e))return;g(t)}}function h(t,e,n){return"openTag"==t?(n.tagStart=e.column(),x):"closeTag"==t?b:h}function x(t,e,n){return"word"==t?(n.tagName=e.current(),i="tag",v):u.allowMissingTagName&&"endTag"==t?(i="tag bracket",v(t,e,n)):(i="error",x)}function b(t,e,n){if("word"==t){var r=e.current();return n.context&&n.context.tagName!=r&&u.implicitlyClosed.hasOwnProperty(n.context.tagName)&&g(n),n.context&&n.context.tagName==r||!1===u.matchClosing?(i="tag",k):(i="tag error",w)}return u.allowMissingTagName&&"endTag"==t?(i="tag bracket",k(t,e,n)):(i="error",w)}function k(t,e,n){return"endTag"!=t?(i="error",k):(g(n),h)}function w(t,e,n){return i="error",k(t,0,n)}function v(t,e,n){if("word"==t)return i="attribute",T;if("endTag"==t||"selfcloseTag"==t){var r=n.tagName,o=n.tagStart;return n.tagName=n.tagStart=null,"selfcloseTag"==t||u.autoSelfClosers.hasOwnProperty(r)?p(n,r):(p(n,r),n.context=new function(t,e,n){this.prev=t.context,this.tagName=e,this.indent=t.indented,this.startOfLine=n,(u.doNotIndent.hasOwnProperty(e)||t.context&&t.context.noIndent)&&(this.noIndent=!0)}(n,r,o==n.indented)),h}return i="error",v}function T(t,e,n){return"equals"==t?y:(u.allowMissing||(i="error"),v(t,0,n))}function y(t,e,n){return"string"==t?N:"word"==t&&u.allowUnquoted?(i="string",v):(i="error",v(t,0,n))}function N(t,e,n){return"string"==t?N:v(t,0,n)}return s.isInText=!0,{startState:function(t){var e={tokenize:s,state:h,indented:t||0,tagName:null,tagStart:null,context:null};return null!=t&&(e.baseIndent=t),e},token:function(t,e){if(!e.tagName&&t.sol()&&(e.indented=t.indentation()),t.eatSpace())return null;a=null;var n=e.tokenize(t,e);return(n||a)&&"comment"!=n&&(i=null,e.state=e.state(a||n,t,e),i&&(n="error"==i?n+" error":i)),n},indent:function(e,n,r){var o=e.context;if(e.tokenize.isInAttribute)return e.tagStart==e.indented?e.stringStartCol+1:e.indented+l;if(o&&o.noIndent)return t.Pass;if(e.tokenize!=f&&e.tokenize!=s)return r?r.match(/^(\s*)/)[0].length:0;if(e.tagName)return!1!==u.multilineTagIndentPastTag?e.tagStart+e.tagName.length+2:e.tagStart+l*(u.multilineTagIndentFactor||1);if(u.alignCDATA&&/<!\[CDATA\[/.test(n))return 0;var a=n&&/^<(\/)?([\w_:\.-]*)/.exec(n);if(a&&a[1])for(;o;){if(o.tagName==a[2]){o=o.prev;break}if(!u.implicitlyClosed.hasOwnProperty(o.tagName))break;o=o.prev}else if(a)for(;o;){var i=u.contextGrabbers[o.tagName];if(!i||!i.hasOwnProperty(a[2]))break;o=o.prev}for(;o&&o.prev&&!o.startOfLine;)o=o.prev;return o?o.indent+l:e.baseIndent||0},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",configuration:u.htmlMode?"html":"xml",helperType:u.htmlMode?"html":"xml",skipAttribute:function(t){t.state==y&&(t.state=v)}}}),t.defineMIME("text/xml","xml"),t.defineMIME("application/xml","xml"),t.mimeModes.hasOwnProperty("text/html")||t.defineMIME("text/html",{name:"xml",htmlMode:!0})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(N){"use strict";var y={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0},z={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,allowMissingTagName:!1,caseFold:!1};N.defineMode("xml",function(t,e){var i,a,l=t.indentUnit,u={},n=e.htmlMode?y:z;for(var r in n)u[r]=n[r];for(var r in e)u[r]=e[r];function c(e,n){function t(t){return(n.tokenize=t)(e,n)}var r=e.next();if("<"==r)return e.eat("!")?e.eat("[")?e.match("CDATA[")?t(s("atom","]]>")):null:e.match("--")?t(s("comment","--\x3e")):e.match("DOCTYPE",!0,!0)?(e.eatWhile(/[\w\._\-]/),t(function r(o){return function(t,e){for(var n;null!=(n=t.next());){if("<"==n)return e.tokenize=r(o+1),e.tokenize(t,e);if(">"==n){if(1!=o)return e.tokenize=r(o-1),e.tokenize(t,e);e.tokenize=c;break}}return"meta"}}(1))):null:e.eat("?")?(e.eatWhile(/[\w\._\-]/),n.tokenize=s("meta","?>"),"meta"):(i=e.eat("/")?"closeTag":"openTag",n.tokenize=d,"tag bracket");if("&"!=r)return e.eatWhile(/[^&<]/),null;var o=e.eat("#")?e.eat("x")?e.eatWhile(/[a-fA-F\d]/)&&e.eat(";"):e.eatWhile(/[\d]/)&&e.eat(";"):e.eatWhile(/[\w\.\-:]/)&&e.eat(";");return o?"atom":"error"}function d(t,e){var n=t.next();if(">"==n||"/"==n&&t.eat(">"))return e.tokenize=c,i=">"==n?"endTag":"selfcloseTag","tag bracket";if("="==n)return i="equals",null;if("<"!=n)return/[\'\"]/.test(n)?(e.tokenize=(r=n,a.isInAttribute=!0,a),e.stringStartCol=t.column(),e.tokenize(t,e)):(t.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word");e.tokenize=c,e.state=g,e.tagName=e.tagStart=null;var r,o=e.tokenize(t,e);return o?o+" tag error":"tag error";function a(t,e){for(;!t.eol();)if(t.next()==r){e.tokenize=d;break}return"string"}}function s(n,r){return function(t,e){for(;!t.eol();){if(t.match(r)){e.tokenize=c;break}t.next()}return n}}function f(t,e,n){this.prev=t.context,this.tagName=e||"",this.indent=t.indented,this.startOfLine=n,(u.doNotIndent.hasOwnProperty(e)||t.context&&t.context.noIndent)&&(this.noIndent=!0)}function o(t){t.context&&(t.context=t.context.prev)}function m(t,e){for(var n;;){if(!t.context)return;if(n=t.context.tagName,!u.contextGrabbers.hasOwnProperty(n)||!u.contextGrabbers[n].hasOwnProperty(e))return;o(t)}}function g(t,e,n){return"openTag"==t?(n.tagStart=e.column(),p):"closeTag"==t?h:g}function p(t,e,n){return"word"==t?(n.tagName=e.current(),a="tag",k):u.allowMissingTagName&&"endTag"==t?(a="tag bracket",k(t,0,n)):(a="error",p)}function h(t,e,n){if("word"!=t)return u.allowMissingTagName&&"endTag"==t?(a="tag bracket",x(t,0,n)):(a="error",b);var r=e.current();return n.context&&n.context.tagName!=r&&u.implicitlyClosed.hasOwnProperty(n.context.tagName)&&o(n),n.context&&n.context.tagName==r||!1===u.matchClosing?(a="tag",x):(a="tag error",b)}function x(t,e,n){return"endTag"!=t?(a="error",x):(o(n),g)}function b(t,e,n){return a="error",x(t,0,n)}function k(t,e,n){if("word"==t)return a="attribute",v;if("endTag"!=t&&"selfcloseTag"!=t)return a="error",k;var r=n.tagName,o=n.tagStart;return n.tagName=n.tagStart=null,"selfcloseTag"==t||u.autoSelfClosers.hasOwnProperty(r)?m(n,r):(m(n,r),n.context=new f(n,r,o==n.indented)),g}function v(t,e,n){return"equals"==t?w:(u.allowMissing||(a="error"),k(t,0,n))}function w(t,e,n){return"string"==t?T:"word"==t&&u.allowUnquoted?(a="string",k):(a="error",k(t,0,n))}function T(t,e,n){return"string"==t?T:k(t,0,n)}return c.isInText=!0,{startState:function(t){var e={tokenize:c,state:g,indented:t||0,tagName:null,tagStart:null,context:null};return null!=t&&(e.baseIndent=t),e},token:function(t,e){if(!e.tagName&&t.sol()&&(e.indented=t.indentation()),t.eatSpace())return null;i=null;var n=e.tokenize(t,e);return(n||i)&&"comment"!=n&&(a=null,e.state=e.state(i||n,t,e),a&&(n="error"==a?n+" error":a)),n},indent:function(t,e,n){var r=t.context;if(t.tokenize.isInAttribute)return t.tagStart==t.indented?t.stringStartCol+1:t.indented+l;if(r&&r.noIndent)return N.Pass;if(t.tokenize!=d&&t.tokenize!=c)return n?n.match(/^(\s*)/)[0].length:0;if(t.tagName)return!1!==u.multilineTagIndentPastTag?t.tagStart+t.tagName.length+2:t.tagStart+l*(u.multilineTagIndentFactor||1);if(u.alignCDATA&&/<!\[CDATA\[/.test(e))return 0;var o=e&&/^<(\/)?([\w_:\.-]*)/.exec(e);if(o&&o[1])for(;r;){if(r.tagName==o[2]){r=r.prev;break}if(!u.implicitlyClosed.hasOwnProperty(r.tagName))break;r=r.prev}else if(o)for(;r;){var a=u.contextGrabbers[r.tagName];if(!a||!a.hasOwnProperty(o[2]))break;r=r.prev}for(;r&&r.prev&&!r.startOfLine;)r=r.prev;return r?r.indent+l:t.baseIndent||0},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"\x3c!--",blockCommentEnd:"--\x3e",configuration:u.htmlMode?"html":"xml",helperType:u.htmlMode?"html":"xml",skipAttribute:function(t){t.state==w&&(t.state=k)},xmlCurrentTag:function(t){return t.tagName?{name:t.tagName,close:"closeTag"==t.type}:null},xmlCurrentContext:function(t){for(var e=[],n=t.context;n;n=n.prev)e.push(n.tagName);return e.reverse()}}}),N.defineMIME("text/xml","xml"),N.defineMIME("application/xml","xml"),N.mimeModes.hasOwnProperty("text/html")||N.defineMIME("text/html",{name:"xml",htmlMode:!0})}); diff --git a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js index 5c0e2d945..c4285a645 100644 --- a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js +++ b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../dialog/dialog"],e):e(CodeMirror)}(function(e){"use strict";function o(e,o){var r=Number(o);return/^[-+]/.test(o)?e.getCursor().line+r:r-1}e.commands.jumpToLine=function(e){var r,i,t,s,n,l=e.getCursor();r=e,i='Jump to line: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use line:column or scroll% syntax)</span>',t="Jump to line:",s=l.line+1+":"+l.ch,n=function(r){var i;if(r)if(i=/^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(r))e.setCursor(o(e,i[1]),Number(i[2]));else if(i=/^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(r)){var t=Math.round(e.lineCount()*Number(i[1])/100);/^[-+]/.test(i[1])&&(t=l.line+t+1),e.setCursor(t-1,l.ch)}else(i=/^\s*\:?\s*([\+\-]?\d+)\s*/.exec(r))&&e.setCursor(o(e,i[1]),l.ch)},r.openDialog?r.openDialog(i,n,{value:s,selectValueOnOpen:!0}):n(prompt(t,s))},e.keyMap.default["Alt-G"]="jumpToLine"}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../dialog/dialog"],e):e(CodeMirror)}(function(e){"use strict";function u(e,o){var r=Number(o);return/^[-+]/.test(o)?e.getCursor().line+r:r-1}e.commands.jumpToLine=function(t){var e,o,r,s,i,n,l=t.getCursor();o=(n=e=t).phrase("Jump to line:")+' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+n.phrase("(Use line:column or scroll% syntax)")+"</span>",r=t.phrase("Jump to line:"),s=l.line+1+":"+l.ch,i=function(e){var o,r;e&&((o=/^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(e))?t.setCursor(u(t,o[1]),Number(o[2])):(o=/^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(e))?(r=Math.round(t.lineCount()*Number(o[1])/100),/^[-+]/.test(o[1])&&(r=l.line+r+1),t.setCursor(r-1,l.ch)):(o=/^\s*\:?\s*([\+\-]?\d+)\s*/.exec(e))&&t.setCursor(u(t,o[1]),l.ch))},e.openDialog?e.openDialog(o,i,{value:s,selectValueOnOpen:!0}):i(prompt(r,s))},e.keyMap.default["Alt-G"]="jumpToLine"}); diff --git a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js index f61ca05e5..7efd7994a 100644 --- a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js +++ b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("./searchcursor"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./searchcursor","../dialog/dialog"],e):e(CodeMirror)}(function(e){"use strict";function o(e){return e.state.search||(e.state.search=new function(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null})}function n(e){return"string"==typeof e&&e==e.toLowerCase()}function r(e,o,r){return e.getSearchCursor(o,r,{caseFold:n(o),multiline:!0})}function t(e,o,n,r,t){e.openDialog?e.openDialog(o,t,{value:r,selectValueOnOpen:!0}):t(prompt(n,r))}function i(e){return e.replace(/\\(.)/g,function(e,o){return"n"==o?"\n":"r"==o?"\r":o})}function a(e){var o=e.match(/^\/(.*)\/([a-z]*)$/);if(o)try{e=new RegExp(o[1],-1==o[2].indexOf("i")?"":"i")}catch(e){}else e=i(e);return("string"==typeof e?""==e:e.test(""))&&(e=/x^/),e}var s='<span class="CodeMirror-search-label">Search:</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';function c(e,o,r){var t,i;o.queryText=r,o.query=a(r),e.removeOverlay(o.overlay,n(o.query)),o.overlay=(t=o.query,i=n(o.query),"string"==typeof t?t=new RegExp(t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),i?"gi":"g"):t.global||(t=new RegExp(t.source,t.ignoreCase?"gi":"g")),{token:function(e){t.lastIndex=e.pos;var o=t.exec(e.string);if(o&&o.index==e.pos)return e.pos+=o[0].length||1,"searching";o?e.pos=o.index:e.skipToEnd()}}),e.addOverlay(o.overlay),e.showMatchesOnScrollbar&&(o.annotate&&(o.annotate.clear(),o.annotate=null),o.annotate=e.showMatchesOnScrollbar(o.query,n(o.query)))}function l(n,r,i,a){var l=o(n);if(l.query)return u(n,r);var p,d,y,m,g,h=n.getSelection()||l.lastQuery;if(h instanceof RegExp&&"x^"==h.source&&(h=null),i&&n.openDialog){var v=null,x=function(o,r){e.e_stop(r),o&&(o!=l.queryText&&(c(n,l,o),l.posFrom=l.posTo=n.getCursor()),v&&(v.style.opacity=1),u(n,r.shiftKey,function(e,o){var r;o.line<3&&document.querySelector&&(r=n.display.wrapper.querySelector(".CodeMirror-dialog"))&&r.getBoundingClientRect().bottom-4>n.cursorCoords(o,"window").top&&((v=r).style.opacity=.4)}))};d=s,y=h,m=x,g=function(r,t){var i=e.keyName(r),a=n.getOption("extraKeys"),s=a&&a[i]||e.keyMap[n.getOption("keyMap")][i];"findNext"==s||"findPrev"==s||"findPersistentNext"==s||"findPersistentPrev"==s?(e.e_stop(r),c(n,o(n),t),n.execCommand(s)):"find"!=s&&"findPersistent"!=s||(e.e_stop(r),x(t,r))},(p=n).openDialog(d,m,{value:y,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){f(p)},onKeyDown:g}),a&&h&&(c(n,l,h),u(n,r))}else t(n,s,"Search for:",h,function(e){e&&!l.query&&n.operation(function(){c(n,l,e),l.posFrom=l.posTo=n.getCursor(),u(n,r)})})}function u(n,t,i){n.operation(function(){var a=o(n),s=r(n,a.query,t?a.posFrom:a.posTo);(s.find(t)||(s=r(n,a.query,t?e.Pos(n.lastLine()):e.Pos(n.firstLine(),0))).find(t))&&(n.setSelection(s.from(),s.to()),n.scrollIntoView({from:s.from(),to:s.to()},20),a.posFrom=s.from(),a.posTo=s.to(),i&&i(s.from(),s.to()))})}function f(e){e.operation(function(){var n=o(e);n.lastQuery=n.query,n.query&&(n.query=n.queryText=null,e.removeOverlay(n.overlay),n.annotate&&(n.annotate.clear(),n.annotate=null))})}var p=' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',d='<span class="CodeMirror-search-label">With:</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',y='<span class="CodeMirror-search-label">Replace?</span> <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>';function m(e,o,n){e.operation(function(){for(var t=r(e,o);t.findNext();)if("string"!=typeof o){var i=e.getRange(t.from(),t.to()).match(o);t.replace(n.replace(/\$(\d)/g,function(e,o){return i[o]}))}else t.replace(n)})}function g(e,n){if(!e.getOption("readOnly")){var s=e.getSelection()||o(e).lastQuery,c='<span class="CodeMirror-search-label">'+(n?"Replace all:":"Replace:")+"</span>";t(e,c+p,c,s,function(o){o&&(o=a(o),t(e,d,"Replace with:","",function(t){if(t=i(t),n)m(e,o,t);else{f(e);var a=r(e,o,e.getCursor("from")),s=function(){var n,i,l,u,f,p=a.from();!(n=a.findNext())&&(a=r(e,o),!(n=a.findNext())||p&&a.from().line==p.line&&a.from().ch==p.ch)||(e.setSelection(a.from(),a.to()),e.scrollIntoView({from:a.from(),to:a.to()}),l=y,u="Replace?",f=[function(){c(n)},s,function(){m(e,o,t)}],(i=e).openConfirm?i.openConfirm(l,f):confirm(u)&&f[0]())},c=function(e){a.replace("string"==typeof o?t:t.replace(/\$(\d)/g,function(o,n){return e[n]})),s()};s()}}))})}}e.commands.find=function(e){f(e),l(e)},e.commands.findPersistent=function(e){f(e),l(e,!1,!0)},e.commands.findPersistentNext=function(e){l(e,!1,!0,!0)},e.commands.findPersistentPrev=function(e){l(e,!0,!0,!0)},e.commands.findNext=l,e.commands.findPrev=function(e){l(e,!0)},e.commands.clearSearch=f,e.commands.replace=g,e.commands.replaceAll=function(e){g(e,!0)}}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("./searchcursor"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./searchcursor","../dialog/dialog"],e):e(CodeMirror)}(function(d){"use strict";function n(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null}function y(e){return e.state.search||(e.state.search=new n)}function a(e){return"string"==typeof e&&e==e.toLowerCase()}function m(e,n,o){return e.getSearchCursor(n,o,{caseFold:a(n),multiline:!0})}function h(e,n,o,r,t){e.openDialog?e.openDialog(n,t,{value:r,selectValueOnOpen:!0}):t(prompt(o,r))}function r(e){return e.replace(/\\([nrt\\])/g,function(e,n){return"n"==n?"\n":"r"==n?"\r":"t"==n?"\t":"\\"==n?"\\":e})}function s(e){var n=e.match(/^\/(.*)\/([a-z]*)$/);if(n)try{e=new RegExp(n[1],-1==n[2].indexOf("i")?"":"i")}catch(e){}else e=r(e);return("string"==typeof e?""==e:e.test(""))&&(e=/x^/),e}function g(e,n,o){var r,t;n.queryText=o,n.query=s(o),e.removeOverlay(n.overlay,a(n.query)),n.overlay=(r=n.query,t=a(n.query),"string"==typeof r?r=new RegExp(r.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),t?"gi":"g"):r.global||(r=new RegExp(r.source,r.ignoreCase?"gi":"g")),{token:function(e){r.lastIndex=e.pos;var n=r.exec(e.string);if(n&&n.index==e.pos)return e.pos+=n[0].length||1,"searching";n?e.pos=n.index:e.skipToEnd()}}),e.addOverlay(n.overlay),e.showMatchesOnScrollbar&&(n.annotate&&(n.annotate.clear(),n.annotate=null),n.annotate=e.showMatchesOnScrollbar(n.query,a(n.query)))}function o(a,n,e,o){var r=y(a);if(r.query)return x(a,n);var t,s,i,c,l,u,p,f=a.getSelection()||r.lastQuery;f instanceof RegExp&&"x^"==f.source&&(f=null),e&&a.openDialog?(t=null,s=function(e,n){d.e_stop(n),e&&(e!=r.queryText&&(g(a,r,e),r.posFrom=r.posTo=a.getCursor()),t&&(t.style.opacity=1),x(a,n.shiftKey,function(e,n){var o;n.line<3&&document.querySelector&&(o=a.display.wrapper.querySelector(".CodeMirror-dialog"))&&o.getBoundingClientRect().bottom-4>a.cursorCoords(n,"window").top&&((t=o).style.opacity=.4)}))},c=C(i=a),l=f,u=s,p=function(e,n){var o=d.keyName(e),r=a.getOption("extraKeys"),t=r&&r[o]||d.keyMap[a.getOption("keyMap")][o];"findNext"==t||"findPrev"==t||"findPersistentNext"==t||"findPersistentPrev"==t?(d.e_stop(e),g(a,y(a),n),a.execCommand(t)):"find"!=t&&"findPersistent"!=t||(d.e_stop(e),s(n,e))},i.openDialog(c,u,{value:l,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){v(i)},onKeyDown:p}),o&&f&&(g(a,r,f),x(a,n))):h(a,C(a),"Search for:",f,function(e){e&&!r.query&&a.operation(function(){g(a,r,e),r.posFrom=r.posTo=a.getCursor(),x(a,n)})})}function x(o,r,t){o.operation(function(){var e=y(o),n=m(o,e.query,r?e.posFrom:e.posTo);(n.find(r)||(n=m(o,e.query,r?d.Pos(o.lastLine()):d.Pos(o.firstLine(),0))).find(r))&&(o.setSelection(n.from(),n.to()),o.scrollIntoView({from:n.from(),to:n.to()},20),e.posFrom=n.from(),e.posTo=n.to(),t&&t(n.from(),n.to()))})}function v(n){n.operation(function(){var e=y(n);e.lastQuery=e.query,e.query&&(e.query=e.queryText=null,n.removeOverlay(e.overlay),e.annotate&&(e.annotate.clear(),e.annotate=null))})}function C(e){return'<span class="CodeMirror-search-label">'+e.phrase("Search:")+'</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+e.phrase("(Use /re/ syntax for regexp search)")+"</span>"}function q(n,r,t){n.operation(function(){for(var o,e=m(n,r);e.findNext();){"string"!=typeof r?(o=n.getRange(e.from(),e.to()).match(r),e.replace(t.replace(/\$(\d)/g,function(e,n){return o[n]}))):e.replace(t)}})}function t(f,e){var n,o;f.getOption("readOnly")||(n=f.getSelection()||y(f).lastQuery,o='<span class="CodeMirror-search-label">'+(e?f.phrase("Replace all:"):f.phrase("Replace:"))+"</span>",h(f,o+(' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+f.phrase("(Use /re/ syntax for regexp search)")+"</span>"),o,n,function(p){p&&(p=s(p),h(f,'<span class="CodeMirror-search-label">'+f.phrase("With:")+'</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',f.phrase("Replace with:"),"",function(i){var c,l,u;i=r(i),e?q(f,p,i):(v(f),c=m(f,p,f.getCursor("from")),l=function(){var e,n,o,r,t,a,s=c.from();!(e=c.findNext())&&(c=m(f,p),!(e=c.findNext())||s&&c.from().line==s.line&&c.from().ch==s.ch)||(f.setSelection(c.from(),c.to()),f.scrollIntoView({from:c.from(),to:c.to()}),o='<span class="CodeMirror-search-label">'+(a=n=f).phrase("Replace?")+"</span> <button>"+a.phrase("Yes")+"</button> <button>"+a.phrase("No")+"</button> <button>"+a.phrase("All")+"</button> <button>"+a.phrase("Stop")+"</button> ",r=f.phrase("Replace?"),t=[function(){u(e)},l,function(){q(f,p,i)}],n.openConfirm?n.openConfirm(o,t):confirm(r)&&t[0]())},u=function(o){c.replace("string"==typeof p?i:i.replace(/\$(\d)/g,function(e,n){return o[n]})),l()},l())}))}))}d.commands.find=function(e){v(e),o(e)},d.commands.findPersistent=function(e){v(e),o(e,!1,!0)},d.commands.findPersistentNext=function(e){o(e,!1,!0,!0)},d.commands.findPersistentPrev=function(e){o(e,!0,!0,!0)},d.commands.findNext=o,d.commands.findPrev=function(e){o(e,!0)},d.commands.clearSearch=v,d.commands.replace=t,d.commands.replaceAll=function(e){t(e,!0)}}); diff --git a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/searchcursor.js b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/searchcursor.js index c10445711..a2f62a0f7 100755 --- a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/searchcursor.js +++ b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/searchcursor.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE -!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";var e,n,r=t.Pos;function i(t,e){for(var n,r,i=null!=(r=(n=t).flags)?r:(n.ignoreCase?"i":"")+(n.global?"g":"")+(n.multiline?"m":""),o=i,l=0;l<e.length;l++)-1==o.indexOf(e.charAt(l))&&(o+=e.charAt(l));return i==o?t:new RegExp(t.source,o)}function o(t,e,n){e=i(e,"g");for(var o=n.line,l=n.ch,h=t.lastLine();o<=h;o++,l=0){e.lastIndex=l;var s=t.getLine(o),c=e.exec(s);if(c)return{from:r(o,c.index),to:r(o,c.index+c[0].length),match:c}}}function l(t,e){for(var n,r=0;;){e.lastIndex=r;var i=e.exec(t);if(!i)return n;if((r=(n=i).index+(n[0].length||1))==t.length)return n}}function h(t,e,n,r){if(t.length==e.length)return n;for(var i=0,o=n+Math.max(0,t.length-e.length);;){if(i==o)return i;var l=i+o>>1,h=r(t.slice(0,l)).length;if(h==n)return l;h>n?o=l:i=l+1}}function s(t,s,c,f){var u;this.atOccurrence=!1,this.doc=t,c=c?t.clipPos(c):r(0,0),this.pos={from:c,to:c},"object"==typeof f?u=f.caseFold:(u=f,f=null),"string"==typeof s?(null==u&&(u=!1),this.matches=function(i,o){return(i?function(t,i,o,l){if(!i.length)return null;var s=l?e:n,c=s(i).split(/\r|\n\r?/);t:for(var f=o.line,u=o.ch,a=t.firstLine()-1+c.length;f>=a;f--,u=-1){var g=t.getLine(f);u>-1&&(g=g.slice(0,u));var m=s(g);if(1==c.length){var d=m.lastIndexOf(c[0]);if(-1==d)continue t;return{from:r(f,h(g,m,d,s)),to:r(f,h(g,m,d+c[0].length,s))}}var v=c[c.length-1];if(m.slice(0,v.length)==v){var p=1;for(o=f-c.length+1;p<c.length-1;p++)if(s(t.getLine(o+p))!=c[p])continue t;var x=t.getLine(f+1-c.length),L=s(x);if(L.slice(L.length-c[0].length)==c[0])return{from:r(f+1-c.length,h(x,L,x.length-c[0].length,s)),to:r(f,h(g,m,v.length,s))}}}}:function(t,i,o,l){if(!i.length)return null;var s=l?e:n,c=s(i).split(/\r|\n\r?/);t:for(var f=o.line,u=o.ch,a=t.lastLine()+1-c.length;f<=a;f++,u=0){var g=t.getLine(f).slice(u),m=s(g);if(1==c.length){var d=m.indexOf(c[0]);if(-1==d)continue t;return o=h(g,m,d,s)+u,{from:r(f,h(g,m,d,s)+u),to:r(f,h(g,m,d+c[0].length,s)+u)}}var v=m.length-c[0].length;if(m.slice(v)==c[0]){for(var p=1;p<c.length-1;p++)if(s(t.getLine(f+p))!=c[p])continue t;var x=t.getLine(f+c.length-1),L=s(x),C=c[c.length-1];if(L.slice(0,C.length)==C)return{from:r(f,h(g,m,v,s)+u),to:r(f+c.length-1,h(x,L,C.length,s))}}}})(t,s,o,u)}):(s=i(s,"gm"),f&&!1===f.multiline?this.matches=function(e,n){return(e?function(t,e,n){e=i(e,"g");for(var o=n.line,h=n.ch,s=t.firstLine();o>=s;o--,h=-1){var c=t.getLine(o);h>-1&&(c=c.slice(0,h));var f=l(c,e);if(f)return{from:r(o,f.index),to:r(o,f.index+f[0].length),match:f}}}:o)(t,s,n)}:this.matches=function(e,n){return(e?function(t,e,n){e=i(e,"gm");for(var o,h=1,s=n.line,c=t.firstLine();s>=c;){for(var f=0;f<h;f++){var u=t.getLine(s--);o=null==o?u.slice(0,n.ch):u+"\n"+o}h*=2;var a=l(o,e);if(a){var g=o.slice(0,a.index).split("\n"),m=a[0].split("\n"),d=s+g.length,v=g[g.length-1].length;return{from:r(d,v),to:r(d+m.length-1,1==m.length?v+m[0].length:m[m.length-1].length),match:a}}}}:function(t,e,n){if(!/\\s|\\n|\n|\\W|\\D|\[\^/.test(e.source))return o(t,e,n);e=i(e,"gm");for(var l,h=1,s=n.line,c=t.lastLine();s<=c;){for(var f=0;f<h&&!(s>c);f++){var u=t.getLine(s++);l=null==l?u:l+"\n"+u}h*=2,e.lastIndex=n.ch;var a=e.exec(l);if(a){var g=l.slice(0,a.index).split("\n"),m=a[0].split("\n"),d=n.line+g.length-1,v=g[g.length-1].length;return{from:r(d,v),to:r(d+m.length-1,1==m.length?v+m[0].length:m[m.length-1].length),match:a}}}})(t,s,n)})}String.prototype.normalize?(e=function(t){return t.normalize("NFD").toLowerCase()},n=function(t){return t.normalize("NFD")}):(e=function(t){return t.toLowerCase()},n=function(t){return t}),s.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(e){for(var n=this.matches(e,this.doc.clipPos(e?this.pos.from:this.pos.to));n&&0==t.cmpPos(n.from,n.to);)e?n.from.ch?n.from=r(n.from.line,n.from.ch-1):n=n.from.line==this.doc.firstLine()?null:this.matches(e,this.doc.clipPos(r(n.from.line-1))):n.to.ch<this.doc.getLine(n.to.line).length?n.to=r(n.to.line,n.to.ch+1):n=n.to.line==this.doc.lastLine()?null:this.matches(e,r(n.to.line+1,0));if(n)return this.pos=n,this.atOccurrence=!0,this.pos.match||!0;var i=r(e?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:i,to:i},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(e,n){if(this.atOccurrence){var i=t.splitLines(e);this.doc.replaceRange(i,this.pos.from,this.pos.to,n),this.pos.to=r(this.pos.from.line+i.length-1,i[i.length-1].length+(1==i.length?this.pos.from.ch:0))}}},t.defineExtension("getSearchCursor",function(t,e,n){return new s(this.doc,t,e,n)}),t.defineDocExtension("getSearchCursor",function(t,e,n){return new s(this,t,e,n)}),t.defineExtension("selectMatches",function(e,n){for(var r=[],i=this.getSearchCursor(e,this.getCursor("from"),n);i.findNext()&&!(t.cmpPos(i.to(),this.getCursor("to"))>0);)r.push({anchor:i.from(),head:i.to()});r.length&&this.setSelections(r,0)})}); \ No newline at end of file +// Distributed under an MIT license: https://codemirror.net/LICENSE +!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(i){"use strict";var p,x,L=i.Pos;function d(t,e){for(var n,r,i=null!=(r=(n=t).flags)?r:(n.ignoreCase?"i":"")+(n.global?"g":"")+(n.multiline?"m":""),o=i,l=0;l<e.length;l++)-1==o.indexOf(e.charAt(l))&&(o+=e.charAt(l));return i==o?t:new RegExp(t.source,o)}function v(t){return/\\s|\\n|\n|\\W|\\D|\[\^/.test(t.source)}function m(t,e,n){e=d(e,"g");for(var r=n.line,i=n.ch,o=t.lastLine();r<=o;r++,i=0){e.lastIndex=i;var l=t.getLine(r),h=e.exec(l);if(h)return{from:L(r,h.index),to:L(r,h.index+h[0].length),match:h}}}function C(t,e,n){for(var r,i=0;i<=t.length;){e.lastIndex=i;var o=e.exec(t);if(!o)break;var l=o.index+o[0].length;if(l>t.length-n)break;(!r||l>r.index+r[0].length)&&(r=o),i=o.index+1}return r}function O(t,e,n){e=d(e,"g");for(var r=n.line,i=n.ch,o=t.firstLine();o<=r;r--,i=-1){var l=t.getLine(r),h=C(l,e,i<0?0:l.length-i);if(h)return{from:L(r,h.index),to:L(r,h.index+h[0].length),match:h}}}function b(t,e,n,r){if(t.length==e.length)return n;for(var i=0,o=n+Math.max(0,t.length-e.length);;){if(i==o)return i;var l=i+o>>1,h=r(t.slice(0,l)).length;if(h==n)return l;n<h?o=l:i=1+l}}function r(n,r,t,e){var i;this.atOccurrence=!1,this.doc=n,t=t?n.clipPos(t):L(0,0),this.pos={from:t,to:t},"object"==typeof e?i=e.caseFold:(i=e,e=null),"string"==typeof r?(null==i&&(i=!1),this.matches=function(t,e){return(t?function(t,e,n,r){if(!e.length)return null;var i=r?p:x,o=i(e).split(/\r|\n\r?/);t:for(var l=n.line,h=n.ch,s=t.firstLine()-1+o.length;s<=l;l--,h=-1){var c=t.getLine(l);-1<h&&(c=c.slice(0,h));var f=i(c);if(1==o.length){var u=f.lastIndexOf(o[0]);if(-1==u)continue t;return{from:L(l,b(c,f,u,i)),to:L(l,b(c,f,u+o[0].length,i))}}var g=o[o.length-1];if(f.slice(0,g.length)==g){for(var a=1,n=l-o.length+1;a<o.length-1;a++)if(i(t.getLine(n+a))!=o[a])continue t;var m=t.getLine(l+1-o.length),d=i(m);if(d.slice(d.length-o[0].length)==o[0])return{from:L(l+1-o.length,b(m,d,m.length-o[0].length,i)),to:L(l,b(c,f,g.length,i))}}}}:function(t,e,n,r){if(!e.length)return null;var i=r?p:x,o=i(e).split(/\r|\n\r?/);t:for(var l=n.line,h=n.ch,s=t.lastLine()+1-o.length;l<=s;l++,h=0){var c=t.getLine(l).slice(h),f=i(c);if(1==o.length){var u=f.indexOf(o[0]);if(-1==u)continue t;n=b(c,f,u,i)+h;return{from:L(l,b(c,f,u,i)+h),to:L(l,b(c,f,u+o[0].length,i)+h)}}var g=f.length-o[0].length;if(f.slice(g)==o[0]){for(var a=1;a<o.length-1;a++)if(i(t.getLine(l+a))!=o[a])continue t;var m=t.getLine(l+o.length-1),d=i(m),v=o[o.length-1];if(d.slice(0,v.length)==v)return{from:L(l,b(c,f,g,i)+h),to:L(l+o.length-1,b(m,d,v.length,i))}}}})(n,r,e,i)}):(r=d(r,"gm"),e&&!1===e.multiline?this.matches=function(t,e){return(t?O:m)(n,r,e)}:this.matches=function(t,e){return(t?function(t,e,n){if(!v(e))return O(t,e,n);e=d(e,"gm");for(var r=1,i=t.getLine(n.line).length-n.ch,o=n.line,l=t.firstLine();l<=o;){for(var h=0;h<r&&l<=o;h++)var s=t.getLine(o--),c=null==c?s:s+"\n"+c;r*=2;var f=C(c,e,i);if(f){var u=c.slice(0,f.index).split("\n"),g=f[0].split("\n"),a=o+u.length,m=u[u.length-1].length;return{from:L(a,m),to:L(a+g.length-1,1==g.length?m+g[0].length:g[g.length-1].length),match:f}}}}:function(t,e,n){if(!v(e))return m(t,e,n);e=d(e,"gm");for(var r=1,i=n.line,o=t.lastLine();i<=o;){for(var l=0;l<r&&!(o<i);l++)var h=t.getLine(i++),s=null==s?h:s+"\n"+h;r*=2,e.lastIndex=n.ch;var c=e.exec(s);if(c){var f=s.slice(0,c.index).split("\n"),u=c[0].split("\n"),g=n.line+f.length-1,a=f[f.length-1].length;return{from:L(g,a),to:L(g+u.length-1,1==u.length?a+u[0].length:u[u.length-1].length),match:c}}}})(n,r,e)})}x=String.prototype.normalize?(p=function(t){return t.normalize("NFD").toLowerCase()},function(t){return t.normalize("NFD")}):(p=function(t){return t.toLowerCase()},function(t){return t}),r.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(t){for(var e=this.matches(t,this.doc.clipPos(t?this.pos.from:this.pos.to));e&&0==i.cmpPos(e.from,e.to);)t?e.from.ch?e.from=L(e.from.line,e.from.ch-1):e=e.from.line==this.doc.firstLine()?null:this.matches(t,this.doc.clipPos(L(e.from.line-1))):e.to.ch<this.doc.getLine(e.to.line).length?e.to=L(e.to.line,e.to.ch+1):e=e.to.line==this.doc.lastLine()?null:this.matches(t,L(e.to.line+1,0));if(e)return this.pos=e,this.atOccurrence=!0,this.pos.match||!0;var n=L(t?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:n,to:n},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(t,e){var n;this.atOccurrence&&(n=i.splitLines(t),this.doc.replaceRange(n,this.pos.from,this.pos.to,e),this.pos.to=L(this.pos.from.line+n.length-1,n[n.length-1].length+(1==n.length?this.pos.from.ch:0)))}},i.defineExtension("getSearchCursor",function(t,e,n){return new r(this.doc,t,e,n)}),i.defineDocExtension("getSearchCursor",function(t,e,n){return new r(this,t,e,n)}),i.defineExtension("selectMatches",function(t,e){for(var n=[],r=this.getSearchCursor(t,this.getCursor("from"),e);r.findNext()&&!(0<i.cmpPos(r.to(),this.getCursor("to")));)n.push({anchor:r.from(),head:r.to()});n.length&&this.setSelections(n,0)})}); diff --git a/plugins/tiddlywiki/codemirror/files/addon/dialog/dialog.js b/plugins/tiddlywiki/codemirror/files/addon/dialog/dialog.js index 99cbb0325..8ae323218 100755 --- a/plugins/tiddlywiki/codemirror/files/addon/dialog/dialog.js +++ b/plugins/tiddlywiki/codemirror/files/addon/dialog/dialog.js @@ -1 +1 @@ -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){function o(e,o,n){var t;return(t=e.getWrapperElement().appendChild(document.createElement("div"))).className=n?"CodeMirror-dialog CodeMirror-dialog-bottom":"CodeMirror-dialog CodeMirror-dialog-top","string"==typeof o?t.innerHTML=o:t.appendChild(o),t}function n(e,o){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=o}e.defineExtension("openDialog",function(t,i,r){r||(r={}),n(this,null);var u=o(this,t,r.bottom),l=!1,c=this;function a(e){if("string"==typeof e)s.value=e;else{if(l)return;l=!0,u.parentNode.removeChild(u),c.focus(),r.onClose&&r.onClose(u)}}var f,s=u.getElementsByTagName("input")[0];return s?(s.focus(),r.value&&(s.value=r.value,!1!==r.selectValueOnOpen&&s.select()),r.onInput&&e.on(s,"input",function(e){r.onInput(e,s.value,a)}),r.onKeyUp&&e.on(s,"keyup",function(e){r.onKeyUp(e,s.value,a)}),e.on(s,"keydown",function(o){r&&r.onKeyDown&&r.onKeyDown(o,s.value,a)||((27==o.keyCode||!1!==r.closeOnEnter&&13==o.keyCode)&&(s.blur(),e.e_stop(o),a()),13==o.keyCode&&i(s.value,o))}),!1!==r.closeOnBlur&&e.on(s,"blur",a)):(f=u.getElementsByTagName("button")[0])&&(e.on(f,"click",function(){a(),c.focus()}),!1!==r.closeOnBlur&&e.on(f,"blur",a),f.focus()),a}),e.defineExtension("openConfirm",function(t,i,r){n(this,null);var u=o(this,t,r&&r.bottom),l=u.getElementsByTagName("button"),c=!1,a=this,f=1;function s(){c||(c=!0,u.parentNode.removeChild(u),a.focus())}l[0].focus();for(var d=0;d<l.length;++d){var p=l[d];!function(o){e.on(p,"click",function(n){e.e_preventDefault(n),s(),o&&o(a)})}(i[d]),e.on(p,"blur",function(){--f,setTimeout(function(){f<=0&&s()},200)}),e.on(p,"focus",function(){++f})}}),e.defineExtension("openNotification",function(t,i){n(this,a);var r,u=o(this,t,i&&i.bottom),l=!1,c=i&&void 0!==i.duration?i.duration:5e3;function a(){l||(l=!0,clearTimeout(r),u.parentNode.removeChild(u))}return e.on(u,"click",function(o){e.e_preventDefault(o),a()}),c&&(r=setTimeout(a,c)),a})}); \ No newline at end of file +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(s){function f(e,o,n){var t=e.getWrapperElement(),i=t.appendChild(document.createElement("div"));return i.className=n?"CodeMirror-dialog CodeMirror-dialog-bottom":"CodeMirror-dialog CodeMirror-dialog-top","string"==typeof o?i.innerHTML=o:i.appendChild(o),s.addClass(t,"dialog-opened"),i}function p(e,o){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=o}s.defineExtension("openDialog",function(e,o,n){n=n||{},p(this,null);var t=f(this,e,n.bottom),i=!1,r=this;function u(e){if("string"==typeof e)a.value=e;else{if(i)return;i=!0,s.rmClass(t.parentNode,"dialog-opened"),t.parentNode.removeChild(t),r.focus(),n.onClose&&n.onClose(t)}}var l,a=t.getElementsByTagName("input")[0];return a?(a.focus(),n.value&&(a.value=n.value,!1!==n.selectValueOnOpen&&a.select()),n.onInput&&s.on(a,"input",function(e){n.onInput(e,a.value,u)}),n.onKeyUp&&s.on(a,"keyup",function(e){n.onKeyUp(e,a.value,u)}),s.on(a,"keydown",function(e){n&&n.onKeyDown&&n.onKeyDown(e,a.value,u)||((27==e.keyCode||!1!==n.closeOnEnter&&13==e.keyCode)&&(a.blur(),s.e_stop(e),u()),13==e.keyCode&&o(a.value,e))}),!1!==n.closeOnBlur&&s.on(t,"focusout",function(e){null!==e.relatedTarget&&u()})):(l=t.getElementsByTagName("button")[0])&&(s.on(l,"click",function(){u(),r.focus()}),!1!==n.closeOnBlur&&s.on(l,"blur",u),l.focus()),u}),s.defineExtension("openConfirm",function(e,o,n){p(this,null);var t=f(this,e,n&&n.bottom),i=t.getElementsByTagName("button"),r=!1,u=this,l=1;function a(){r||(r=!0,s.rmClass(t.parentNode,"dialog-opened"),t.parentNode.removeChild(t),u.focus())}i[0].focus();for(var c=0;c<i.length;++c){var d=i[c];!function(o){s.on(d,"click",function(e){s.e_preventDefault(e),a(),o&&o(u)})}(o[c]),s.on(d,"blur",function(){--l,setTimeout(function(){l<=0&&a()},200)}),s.on(d,"focus",function(){++l})}}),s.defineExtension("openNotification",function(e,o){p(this,u);var n,t=f(this,e,o&&o.bottom),i=!1,r=o&&void 0!==o.duration?o.duration:5e3;function u(){i||(i=!0,clearTimeout(n),s.rmClass(t.parentNode,"dialog-opened"),t.parentNode.removeChild(t))}return s.on(t,"click",function(e){s.e_preventDefault(e),u()}),r&&(n=setTimeout(u,r)),u})}); diff --git a/plugins/tiddlywiki/codemirror/files/addon/selection/activeline.js b/plugins/tiddlywiki/codemirror/files/addon/selection/activeline.js index 7b9555681..95a4ef638 100644 --- a/plugins/tiddlywiki/codemirror/files/addon/selection/activeline.js +++ b/plugins/tiddlywiki/codemirror/files/addon/selection/activeline.js @@ -1 +1 @@ -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";var t="CodeMirror-activeline",n="CodeMirror-activeline-background",i="CodeMirror-activeline-gutter";function r(e){for(var r=0;r<e.state.activeLines.length;r++)e.removeLineClass(e.state.activeLines[r],"wrap",t),e.removeLineClass(e.state.activeLines[r],"background",n),e.removeLineClass(e.state.activeLines[r],"gutter",i)}function o(e,o){for(var a=[],s=0;s<o.length;s++){var c=o[s],l=e.getOption("styleActiveLine");if("object"==typeof l&&l.nonEmpty?c.anchor.line==c.head.line:c.empty()){var f=e.getLineHandleVisualStart(c.head.line);a[a.length-1]!=f&&a.push(f)}}(function(e,t){if(e.length!=t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0})(e.state.activeLines,a)||e.operation(function(){r(e);for(var o=0;o<a.length;o++)e.addLineClass(a[o],"wrap",t),e.addLineClass(a[o],"background",n),e.addLineClass(a[o],"gutter",i);e.state.activeLines=a})}function a(e,t){o(e,t.ranges)}e.defineOption("styleActiveLine",!1,function(t,n,i){var s=i!=e.Init&&i;n!=s&&(s&&(t.off("beforeSelectionChange",a),r(t),delete t.state.activeLines),n&&(t.state.activeLines=[],o(t,t.listSelections()),t.on("beforeSelectionChange",a)))})}); +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(r){"use strict";var s="CodeMirror-activeline",c="CodeMirror-activeline-background",l="CodeMirror-activeline-gutter";function f(e){for(var t=0;t<e.state.activeLines.length;t++)e.removeLineClass(e.state.activeLines[t],"wrap",s),e.removeLineClass(e.state.activeLines[t],"background",c),e.removeLineClass(e.state.activeLines[t],"gutter",l)}function o(t,e){for(var n=[],i=0;i<e.length;i++){var r,o=e[i],a=t.getOption("styleActiveLine");("object"==typeof a&&a.nonEmpty?o.anchor.line==o.head.line:o.empty())&&(r=t.getLineHandleVisualStart(o.head.line),n[n.length-1]!=r&&n.push(r))}!function(e,t){if(e.length==t.length){for(var n=0;n<e.length;n++)if(e[n]!=t[n])return;return 1}}(t.state.activeLines,n)&&t.operation(function(){f(t);for(var e=0;e<n.length;e++)t.addLineClass(n[e],"wrap",s),t.addLineClass(n[e],"background",c),t.addLineClass(n[e],"gutter",l);t.state.activeLines=n})}function a(e,t){o(e,t.ranges)}r.defineOption("styleActiveLine",!1,function(e,t,n){var i=n!=r.Init&&n;t!=i&&(i&&(e.off("beforeSelectionChange",a),f(e),delete e.state.activeLines),t&&(e.state.activeLines=[],o(e,e.listSelections()),e.on("beforeSelectionChange",a)))})}); diff --git a/plugins/tiddlywiki/codemirror/files/codemirror.css b/plugins/tiddlywiki/codemirror/files/codemirror.css index 0c3bcf300..37bc49f28 100755 --- a/plugins/tiddlywiki/codemirror/files/codemirror.css +++ b/plugins/tiddlywiki/codemirror/files/codemirror.css @@ -1 +1 @@ -.CodeMirror{font-family:monospace;height:300px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{0%{}50%{background-color:transparent}}@-webkit-keyframes blink{0%{}50%{background-color:transparent}}@keyframes blink{0%{}50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none} +.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,0.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none;outline:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line > span::selection,.CodeMirror-line > span > span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line > span::-moz-selection,.CodeMirror-line > span > span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none} diff --git a/plugins/tiddlywiki/codemirror/files/codemirror.js b/plugins/tiddlywiki/codemirror/files/codemirror.js index 801840569..231e8a0da 100755 --- a/plugins/tiddlywiki/codemirror/files/codemirror.js +++ b/plugins/tiddlywiki/codemirror/files/codemirror.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,r=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),i=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),o=/Edge\/(\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\//.test(e),u=a&&/Qt\/\d+\.\d+/.test(e),c=!o&&/Chrome\//.test(e),h=/Opera\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\bCrOS\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\/(\d*\.\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:"")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,r,n){var i=O(e,t,r,n);return i.setAttribute("role","presentation"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function H(e,t){var r=e.className;L(t).test(r)||(e.className+=(r?" ":"")+t)}function F(e,t){for(var r=e.split(" "),n=0;n<r.length;n++)r[n]&&!L(r[n]).test(t)&&(t+=" "+r[n]);return t}k=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(e){return n}return n.collapse(!0),n.moveEnd("character",r),n.moveStart("character",t),n};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function z(e,t,r){for(var n in t||(t={}),e)!e.hasOwnProperty(n)||!1===r&&t.hasOwnProperty(n)||(t[n]=e[n]);return t}function I(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=n||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||s>=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null};function B(e,t){for(var r=0;r<e.length;++r)if(e[r]==t)return r;return-1}R.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var G=30,U={toString:function(){return"CodeMirror.Pass"}},V={scroll:!1},K={origin:"*mouse"},j={origin:"+move"};function X(e,t,r){for(var n=0,i=0;;){var o=e.indexOf("\t",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push(q(Y)+" ");return Y[e]}function q(e){return e[e.length-1]}function $(e,t){for(var r=[],n=0;n<e.length;n++)r[n]=t(e[n],n);return r}function Z(){}function Q(e,t){var r;return Object.create?r=Object.create(e):(Z.prototype=e,r=new Z),t&&z(t,r),r}var J=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function ee(e){return/\w/.test(e)||e>"€"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf("\\w")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:t<e.length)&&ie(e.charAt(t));)t+=r;return t}function le(e,t,r){for(var n=t>r?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}function se(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t<o){r=i;break}t-=o}return r.lines[t]}function ae(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function ue(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function ce(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function he(e){if(null==e.parent)return null;for(var t=e.parent,r=B(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function fe(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n){var i=e.children[n],o=i.height;if(t<o){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return r+l}function de(e,t){return t>=e.first&&t<e.first+e.size}function pe(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function ge(e,t,r){if(void 0===r&&(r=null),!(this instanceof ge))return new ge(e,t,r);this.line=e,this.ch=t,this.sticky=r}function ve(e,t){return e.line-t.line||e.ch-t.ch}function me(e,t){return e.sticky==t.sticky&&0==ve(e,t)}function ye(e){return ge(e.line,e.ch)}function be(e,t){return ve(e,t)<0?t:e}function we(e,t){return ve(e,t)<0?e:t}function xe(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function Ce(e,t){if(t.line<e.first)return ge(e.first,0);var r,n,i,o=e.first+e.size-1;return t.line>o?ge(o,se(e,o).text.length):(r=t,n=se(e,t.line).text.length,null==(i=r.ch)||i>n?ge(r.line,n):i<0?ge(r.line,0):r)}function Se(e,t){for(var r=[],n=0;n<t.length;n++)r[n]=Ce(e,t[n]);return r}var Le=!1,ke=!1;function Te(e,t,r){this.marker=e,this.from=t,this.to=r}function Me(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker==t)return n}}function Ne(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(e[n]);return r}function Oe(e,t){if(t.full)return null;var r=de(e,t.from.line)&&se(e,t.from.line).markedSpans,n=de(e,t.to.line)&&se(e,t.to.line).markedSpans;if(!r&&!n)return null;var i=t.from.ch,o=t.to.ch,l=0==ve(t.from,t.to),s=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t)||o.from==t&&"bookmark"==l.type&&(!r||!o.marker.insertLeft)){var s=null==o.to||(l.inclusiveRight?o.to>=t:o.to>t);(n||(n=[])).push(new Te(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.to||(l.inclusiveRight?o.to>=t:o.to>t)||o.from==t&&"bookmark"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t);(n||(n=[])).push(new Te(l,s?null:o.from-t,null==o.to?null:o.to-t))}}return n}(n,o,l),u=1==t.text.length,c=q(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var f=s[h];if(null==f.to){var d=Me(a,f.marker);d?u&&(f.to=null==d.to?null:d.to+c):f.to=i}}if(a)for(var p=0;p<a.length;++p){var g=a[p];if(null!=g.to&&(g.to+=c),null==g.from)Me(s,g.marker)||(g.from=c,u&&(s||(s=[])).push(g));else g.from+=c,u&&(s||(s=[])).push(g)}s&&(s=Ae(s)),a&&a!=s&&(a=Ae(a));var v=[s];if(!u){var m,y=t.text.length-2;if(y>0&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(m||(m=[])).push(new Te(s[b].marker,null,null));for(var w=0;w<y;++w)v.push(m);v.push(a)}return v}function Ae(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.from==r.to&&!1!==r.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function De(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r].marker.detachLine(e);e.markedSpans=null}}function We(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine(e);e.markedSpans=t}}function He(e){return e.inclusiveLeft?-1:0}function Fe(e){return e.inclusiveRight?1:0}function Pe(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;var n=e.find(),i=t.find(),o=ve(n.from,i.from)||He(e)-He(t);if(o)return-o;var l=ve(n.to,i.to)||Fe(e)-Fe(t);return l||t.id-e.id}function Ee(e,t){var r,n=ke&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n.length;++o)(i=n[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!r||Pe(r,i.marker)<0)&&(r=i.marker);return r}function ze(e){return Ee(e,!0)}function Ie(e){return Ee(e,!1)}function Re(e,t,r,n,i){var o=se(e,t),l=ke&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=ve(u.from,r)||He(a.marker)-He(i),h=ve(u.to,n)||Fe(a.marker)-Fe(i);if(!(c>=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.to,r)>=0:ve(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.from,n)<=0:ve(u.from,n)<0)))return!0}}}function Be(e){for(var t;t=ze(e);)e=t.find(-1,!0).line;return e}function Ge(e,t){var r=se(e,t),n=Be(r);return r==n?t:he(n)}function Ue(e,t){if(t>e.lastLine())return t;var r,n=se(e,t);if(!Ve(e,n))return t;for(;r=Ie(n);)n=r.find(1,!0).line;return he(n)+1}function Ve(e,t){var r=ke&&t.markedSpans;if(r)for(var n=void 0,i=0;i<r.length;++i)if((n=r[i]).marker.collapsed){if(null==n.from)return!0;if(!n.marker.widgetNode&&0==n.from&&n.marker.inclusiveLeft&&Ke(e,t,n))return!0}}function Ke(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return Ke(e,n.line,Me(n.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if((i=t.markedSpans[o]).marker.collapsed&&!i.marker.widgetNode&&i.from==r.to&&(null==i.to||i.to!=r.from)&&(i.marker.inclusiveLeft||r.marker.inclusiveRight)&&Ke(e,t,i))return!0}function je(e){for(var t=0,r=(e=Be(e)).parent,n=0;n<r.lines.length;++n){var i=r.lines[n];if(i==e)break;t+=i.height}for(var o=r.parent;o;o=(r=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==r)break;t+=s.height}return t}function Xe(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=ze(n);){var i=t.find(0,!0);n=i.from.line,r+=i.from.ch-i.to.ch}for(n=e;t=Ie(n);){var o=t.find(0,!0);r-=n.text.length-o.from.ch,r+=(n=o.to.line).text.length-o.to.ch}return r}function Ye(e){var t=e.display,r=e.doc;t.maxLine=se(r,r.first),t.maxLineLength=Xe(t.maxLine),t.maxLineChanged=!0,r.iter(function(e){var r=Xe(e);r>t.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var _e=null;function qe(e,t,r){var n;_e=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==r?n=i:_e=i),o.from==t&&(o.from!=o.to&&"before"!=r?n=i:_e=i)}return null!=n?n:_e}var $e=function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";var r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c="ltr"==u?"L":"R";if(0==a.length||"ltr"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p<f;++p)d.push((h=a.charCodeAt(p))<=247?e.charAt(h):1424<=h&&h<=1524?"R":1536<=h&&h<=1785?t.charAt(h-1536):1774<=h&&h<=2220?"r":8192<=h&&h<=8203?"w":8204==h?"b":"L");for(var g=0,v=c;g<f;++g){var m=d[g];"m"==m?d[g]=v:v=m}for(var y=0,b=c;y<f;++y){var w=d[y];"1"==w&&"r"==b?d[y]="n":i.test(w)&&(b=w,"r"==w&&(d[y]="R"))}for(var x=1,C=d[0];x<f-1;++x){var S=d[x];"+"==S&&"1"==C&&"1"==d[x+1]?d[x]="1":","!=S||C!=d[x+1]||"1"!=C&&"n"!=C||(d[x]=C),C=S}for(var L=0;L<f;++L){var k=d[L];if(","==k)d[L]="N";else if("%"==k){var T=void 0;for(T=L+1;T<f&&"%"==d[T];++T);for(var M=L&&"!"==d[L-1]||T<f&&"1"==d[T]?"1":"N",N=L;N<T;++N)d[N]=M;L=T-1}}for(var O=0,A=c;O<f;++O){var D=d[O];"L"==A&&"1"==D?d[O]="L":i.test(D)&&(A=D)}for(var W=0;W<f;++W)if(n.test(d[W])){var H=void 0;for(H=W+1;H<f&&n.test(d[H]);++H);for(var F="L"==(W?d[W-1]:c),P=F==("L"==(H<f?d[H]:c))?F?"L":"R":c,E=W;E<H;++E)d[E]=P;W=H-1}for(var z,I=[],R=0;R<f;)if(o.test(d[R])){var B=R;for(++R;R<f&&o.test(d[R]);++R);I.push(new s(0,B,R))}else{var G=R,U=I.length;for(++R;R<f&&"L"!=d[R];++R);for(var V=G;V<R;)if(l.test(d[V])){G<V&&I.splice(U,0,new s(1,G,V));var K=V;for(++V;V<R&&l.test(d[V]);++V);I.splice(U,0,new s(2,K,V)),G=V}else++V;G<R&&I.splice(U,0,new s(1,G,R))}return"ltr"==u&&(1==I[0].level&&(z=a.match(/^\s+/))&&(I[0].from=z[0].length,I.unshift(new s(0,0,z[0].length))),1==q(I).level&&(z=a.match(/\s+$/))&&(q(I).to-=z[0].length,I.push(new s(0,f-z[0].length,f)))),"rtl"==u?I.reverse():I}}();function Ze(e,t){var r=e.order;return null==r&&(r=e.order=$e(e.text,t)),r}var Qe=[],Je=function(e,t,r){if(e.addEventListener)e.addEventListener(t,r,!1);else if(e.attachEvent)e.attachEvent("on"+t,r);else{var n=e._handlers||(e._handlers={});n[t]=(n[t]||Qe).concat(r)}};function et(e,t){return e._handlers&&e._handlers[t]||Qe}function tt(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1);else if(e.detachEvent)e.detachEvent("on"+t,r);else{var n=e._handlers,i=n&&n[t];if(i){var o=B(i,r);o>-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function rt(e,t){var r=et(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i<r.length;++i)r[i].apply(null,n)}function nt(e,t,r){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),rt(e,r||t.type,e,t),ut(t)||t.codemirrorIgnore}function it(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var r=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),n=0;n<t.length;++n)-1==B(r,t[n])&&r.push(t[n])}function ot(e,t){return et(e,t).length>0}function lt(e){e.prototype.on=function(e,t){Je(this,e,t)},e.prototype.off=function(e,t){tt(this,e,t)}}function st(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function at(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function ut(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function ct(e){st(e),at(e)}function ht(e){return e.target||e.srcElement}function ft(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var dt,pt,gt=function(){if(l&&s<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();function vt(e){if(null==dt){var t=O("span","​");N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(dt=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=dt?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return r.setAttribute("cm-text",""),r}function mt(e){if(null!=pt)return pt;var t=N(e,document.createTextNode("AخA")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(pt=n.right-r.right<3)}var yt,bt=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\r\n?|\n/)},wt=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},xt="oncopy"in(yt=O("div"))||(yt.setAttribute("oncopy","return;"),"function"==typeof yt.oncopy),Ct=null;var St={},Lt={};function kt(e){if("string"==typeof e&&Lt.hasOwnProperty(e))e=Lt[e];else if(e&&"string"==typeof e.name&&Lt.hasOwnProperty(e.name)){var t=Lt[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return kt("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return kt("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function Tt(e,t){t=kt(t);var r=St[t.name];if(!r)return Tt(e,"text/plain");var n=r(e,t);if(Mt.hasOwnProperty(t.name)){var i=Mt[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n["_"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Mt={};function Nt(e,t){z(t,Mt.hasOwnProperty(e)?Mt[e]:Mt[e]={})}function Ot(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function At(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Dt(e,t,r){return!e.startState||e.startState(t,r)}var Wt=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};Wt.prototype.eol=function(){return this.pos>=this.string.length},Wt.prototype.sol=function(){return this.pos==this.lineStart},Wt.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Wt.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Wt.prototype.eat=function(e){var t=this.string.charAt(this.pos);if("string"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},Wt.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Wt.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Wt.prototype.skipToEnd=function(){this.pos=this.string.length},Wt.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},Wt.prototype.backUp=function(e){this.pos-=e},Wt.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=I(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.indentation=function(){return I(this.string,null,this.tabSize)-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.match=function(e,t,r){if("string"!=typeof e){var n=this.string.slice(this.pos).match(e);return n&&n.index>0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Wt.prototype.current=function(){return this.string.slice(this.start,this.pos)},Wt.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Wt.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Wt.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var Ht=function(e,t){this.state=e,this.lookAhead=t},Ft=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function Pt(e,t,r,n){var i=[e.state.modeGen],o={};Kt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,Kt(e,t.text,s.mode,r,function(e,t){for(var r=a;u<e;){var n=i[a];n>e&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,"overlay "+t),a=r+2;else for(;r<a;r+=2){var o=i[r+1];i[r+1]=(o?o+" ":"")+"overlay "+t}},o),r.state=l,r.baseTokens=null,r.baseTokenPos=1},a=0;a<e.state.overlays.length;++a)s(a);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function Et(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=zt(e,he(t)),i=t.text.length>e.options.maxHighlightLength&&Ot(e.doc.mode,n.state),o=Pt(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function zt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new Ft(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=se(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof Ht?u.lookAhead:0)<=o.modeFrontier))return s;var c=I(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&se(n,o-1).stateAfter,s=l?Ft.fromSaved(n,l,o):new Ft(n,Dt(n.mode),o);return n.iter(o,t,function(r){It(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&n<i.viewTo?s.save():null,s.nextLine()}),r&&(n.modeFrontier=s.line),s}function It(e,t,r,n){var i=e.doc.mode,o=new Wt(t,e.options.tabSize,r);for(o.start=o.pos=n||0,""==t&&Rt(i,r.state);!o.eol();)Bt(i,o,r.state),o.start=o.pos}function Rt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var r=At(e,t);return r.mode.blankLine?r.mode.blankLine(r.state):void 0}}function Bt(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=At(e,r).mode);var o=e.token(t,r);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}Ft.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},Ft.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},Ft.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Ft.fromSaved=function(e,t,r){return t instanceof Ht?new Ft(e,Ot(e.mode,t.state),r,t.lookAhead):new Ft(e,Ot(e.mode,t),r)},Ft.prototype.save=function(e){var t=!1!==e?Ot(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new Ht(t,this.maxLookAhead):t};var Gt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function Ut(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=se(l,(t=Ce(l,t)).line),u=zt(e,t.line,r),c=new Wt(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Bt(s,c,u.state),n&&o.push(new Gt(c,i,Ot(l.mode,u.state)));return n?o:new Gt(c,i,u.state)}function Vt(e,t){if(e)for(;;){var r=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!r)break;e=e.slice(0,r.index)+e.slice(r.index+r[0].length);var n=r[1]?"bgClass":"textClass";null==t[n]?t[n]=r[2]:new RegExp("(?:^|s)"+r[2]+"(?:$|s)").test(t[n])||(t[n]+=" "+r[2])}return e}function Kt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.flattenSpans);var a,u=0,c=null,h=new Wt(t,e.options.tabSize,n),f=e.options.addModeClass&&[null];for(""==t&&Vt(Rt(r,n.state),o);!h.eol();){if(h.pos>e.options.maxHighlightLength?(s=!1,l&&It(e,t,n,h.pos),h.pos=t.length,a=null):a=Vt(Bt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a="m-"+(a?d+" "+a:d))}if(!s||c!=a){for(;u<h.start;)i(u=Math.min(h.start,u+5e3),c);c=a}h.start=h.pos}for(;u<h.pos;){var p=Math.min(h.pos,u+5e3);i(p,c),u=p}}var jt=function(e,t,r){this.text=e,We(this,t),this.height=r?r(this):1};jt.prototype.lineNo=function(){return he(this)},lt(jt);var Xt={},Yt={};function _t(e,t){if(!e||/^\s*$/.test(e))return null;var r=t.addModeClass?Yt:Xt;return r[e]||(r[e]=e.replace(/\S+/g,"cm-$&"))}function qt(e,t){var r=A("span",null,null,a?"padding-right: .1px":null),n={pre:A("pre",[r],"CodeMirror-line"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:(l||a)&&e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,s=void 0;n.pos=0,n.addToken=Zt,mt(e.display.measure)&&(s=Ze(o,e.doc.direction))&&(n.addToken=Qt(n.addToken,s)),n.map=[],er(o,n,Et(e,o,t!=e.display.externalMeasured&&he(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||"")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||""))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(vt(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var u=n.content.lastChild;(/\bcm-tab\b/.test(u.className)||u.querySelector&&u.querySelector(".cm-tab"))&&(n.content.className="cm-tab-wrap-hack")}return rt(e,"renderLine",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||"")),n}function $t(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Zt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var r=t,n="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!r||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),n+=o,r=" "==o}return n}(t,e.trailingSpace):t,h=e.cm.state.specialChars,f=!1;if(h.test(t)){u=document.createDocumentFragment();for(var d=0;;){h.lastIndex=d;var p=h.exec(t),g=p?p.index-d:t.length-d;if(g){var v=document.createTextNode(c.slice(d,d+g));l&&s<9?u.appendChild(O("span",[v])):u.appendChild(v),e.map.push(e.pos,e.pos+g,v),e.col+=g,e.pos+=g}if(!p)break;d+=g+1;var m=void 0;if("\t"==p[0]){var y=e.cm.options.tabSize,b=y-e.col%y;(m=u.appendChild(O("span",_(b),"cm-tab"))).setAttribute("role","presentation"),m.setAttribute("cm-text","\t"),e.col+=b}else"\r"==p[0]||"\n"==p[0]?((m=u.appendChild(O("span","\r"==p[0]?"␍":"␤","cm-invalidchar"))).setAttribute("cm-text",p[0]),e.col+=1):((m=e.cm.options.specialCharPlaceholder(p[0])).setAttribute("cm-text",p[0]),l&&s<9?u.appendChild(O("span",[m])):u.appendChild(m),e.col+=1);e.map.push(e.pos,e.pos+1,m),e.pos++}}else e.col+=t.length,u=document.createTextNode(c),e.map.push(e.pos,e.pos+t.length,u),l&&s<9&&(f=!0),e.pos+=t.length;if(e.trailingSpace=32==c.charCodeAt(t.length-1),r||n||i||f||a){var w=r||"";n&&(w+=n),i&&(w+=i);var x=O("span",[u],w,a);return o&&(x.title=o),e.content.appendChild(x)}e.content.appendChild(u)}}function Qt(e,t){return function(r,n,i,o,l,s,a){i=i?i+" cm-force-border":"cm-force-border";for(var u=r.pos,c=u+n.length;;){for(var h=void 0,f=0;f<t.length&&!((h=t[f]).to>u&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function Jt(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function er(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v="",m=0;;){if(m==p){a=u=c=h=s="",f=null,m=1/0;for(var y=[],b=void 0,w=0;w<n.length;++w){var x=n[w],C=x.marker;"bookmark"==C.type&&x.from==p&&C.widgetNode?y.push(C):x.from<=p&&(null==x.to||x.to>p||C.collapsed&&x.to==p&&x.from==p)?(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=""),C.className&&(a+=" "+C.className),C.css&&(s=(s?s+";":"")+C.css),C.startStyle&&x.from==p&&(c+=" "+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&!h&&(h=C.title),C.collapsed&&(!f||Pe(f.marker,C)<0)&&(f=x)):x.from>p&&m>x.from&&(m=x.from)}if(b)for(var S=0;S<b.length;S+=2)b[S+1]==m&&(u+=" "+b[S]);if(!f||f.from==p)for(var L=0;L<y.length;++L)Jt(t,0,y[L]);if(f&&(f.from||0)==p){if(Jt(t,(null==f.to?d+1:f.to)-p,f.marker,null==f.from),null==f.to)return;f.to==p&&(f=!1)}}if(p>=d)break;for(var k=Math.min(d,m);;){if(v){var T=p+v.length;if(!f){var M=T>k?v.slice(0,k-p):v;t.addToken(t,M,l?l+a:a,c,p+M.length==m?u:"",h,s)}if(T>=k){v=v.slice(k-p),p=k;break}p=T,c=""}v=i.slice(o,o=r[g++]),l=_t(r[g++],t.cm.options)}}else for(var N=1;N<r.length;N+=2)t.addToken(t,i.slice(o,o=r[N]),_t(r[N+1],t.cm.options))}function tr(e,t,r){this.line=t,this.rest=function(e){for(var t,r;t=Ie(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}(t),this.size=this.rest?he(q(this.rest))-r+1:1,this.node=this.text=null,this.hidden=Ve(e,t)}function rr(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new tr(e.doc,se(e.doc,o),o);n=o+l.size,i.push(l)}return i}var nr=null;var ir=null;function or(e,t){var r=et(e,t);if(r.length){var n,i=Array.prototype.slice.call(arguments,2);nr?n=nr.delayedCallbacks:ir?n=ir:(n=ir=[],setTimeout(lr,0));for(var o=function(e){n.push(function(){return r[e].apply(null,i)})},l=0;l<r.length;++l)o(l)}}function lr(){var e=ir;ir=null;for(var t=0;t<e.length;++t)e[t]()}function sr(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?cr(e,t):"gutter"==o?fr(e,t,r,n):"class"==o?hr(e,t):"widget"==o&&dr(e,t,n)}t.changes=null}function ar(e){return e.node==e.text&&(e.node=O("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),l&&s<8&&(e.node.style.zIndex=2)),e.node}function ur(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):qt(e,t)}function cr(e,t){var r=t.text.className,n=ur(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,hr(e,t)):r&&(t.text.className=r)}function hr(e,t){!function(e,t){var r=t.bgClass?t.bgClass+" "+(t.line.bgClass||""):t.line.bgClass;if(r&&(r+=" CodeMirror-linebackground"),t.background)r?t.background.className=r:(t.background.parentNode.removeChild(t.background),t.background=null);else if(r){var n=ar(t);t.background=n.insertBefore(O("div",null,r),n.firstChild),e.display.input.setUneditable(t.background)}}(e,t),t.line.wrapClass?ar(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var r=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=r||""}function fr(e,t,r,n){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var i=ar(t);t.gutterBackground=O("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+"px; width: "+n.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text)}var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=ar(t),s=t.gutter=O("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+"px");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=" "+t.line.gutterClass),!e.options.lineNumbers||o&&o["CodeMirror-linenumbers"]||(t.lineNumber=s.appendChild(O("div",pe(e.options,r),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+n.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),o)for(var a=0;a<e.options.gutters.length;++a){var u=e.options.gutters[a],c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O("div",[c],"CodeMirror-gutter-elt","left: "+n.gutterLeft[u]+"px; width: "+n.gutterWidth[u]+"px"))}}}function dr(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firstChild,i=void 0;n;n=i)i=n.nextSibling,"CodeMirror-linewidget"==n.className&&t.node.removeChild(n);pr(e,t,r)}function pr(e,t,r){if(gr(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.length;n++)gr(e,t.rest[n],t,r,!1)}function gr(e,t,r,n,i){if(t.widgets)for(var o=ar(r),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O("div",[a.node],"CodeMirror-linewidget");a.handleMouseEvents||u.setAttribute("cm-ignore-events","true"),vr(a,u,r,n),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,r.gutter||r.text):o.appendChild(u),or(a,"redraw")}}function vr(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).push(t);var i=n.wrapperWidth;t.style.left=n.fixedPos+"px",e.coverGutter||(i-=n.gutterTotalWidth,t.style.paddingLeft=n.gutterTotalWidth+"px"),t.style.width=i+"px"}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-n.gutterTotalWidth+"px"))}function mr(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!D(document.body,e.node)){var r="position: relative;";e.coverGutter&&(r+="margin-left: -"+t.display.gutters.offsetWidth+"px;"),e.noHScroll&&(r+="width: "+t.display.wrapper.clientWidth+"px;"),N(t.display.measure,O("div",[e.node],null,r))}return e.height=e.node.parentNode.offsetHeight}function yr(e,t){for(var r=ht(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&"true"==r.getAttribute("cm-ignore-events")||r.parentNode==e.sizer&&r!=e.mover)return!0}function br(e){return e.lineSpace.offsetTop}function wr(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function xr(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O("pre","x")),r=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,n={left:parseInt(r.paddingLeft),right:parseInt(r.paddingRight)};return isNaN(n.left)||isNaN(n.right)||(e.cachedPaddingH=n),n}function Cr(e){return G-e.display.nativeBarWidth}function Sr(e){return e.display.scroller.clientWidth-Cr(e)-e.display.barWidth}function Lr(e){return e.display.scroller.clientHeight-Cr(e)-e.display.barHeight}function kr(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;n<e.rest.length;n++)if(e.rest[n]==t)return{map:e.measure.maps[n],cache:e.measure.caches[n]};for(var i=0;i<e.rest.length;i++)if(he(e.rest[i])>r)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Tr(e,t,r,n){return Or(e,Nr(e,t),r,n)}function Mr(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[on(e,t)];var r=e.display.externalMeasured;return r&&t>=r.lineN&&t<r.lineN+r.size?r:void 0}function Nr(e,t){var r=he(t),n=Mr(e,r);n&&!n.text?n=null:n&&n.changes&&(sr(e,n,r,Jr(e)),e.curOp.forceUpdate=!0),n||(n=function(e,t){var r=he(t=Be(t)),n=e.display.externalMeasured=new tr(e.doc,t,r);n.lineN=r;var i=n.built=qt(e,n);return n.text=i.pre,N(e.display.lineMeasure,i.pre),n}(e,t));var i=kr(n,t,r);return{line:t,view:n,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function Or(e,t,r,n,i){t.before&&(r=-1);var o,a=r+(n||"");return t.cache.hasOwnProperty(a)?o=t.cache[a]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(!function(e,t,r){var n=e.options.lineWrapping,i=n&&Sr(e);if(!t.measure.heights||n&&t.measure.width!=i){var o=t.measure.heights=[];if(n){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];Math.abs(a.bottom-u.bottom)>2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Wr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c<o.coverEnd&&ie(t.line.text.charAt(o.coverStart+c));)++c;if((i=l&&s<9&&0==u&&c==o.coverEnd-o.coverStart?a.parentNode.getBoundingClientRect():Hr(k(a,u,c).getClientRects(),n)).left||i.right||0==u)break;c=u,u-=1,h="right"}l&&s<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ct)return Ct;var t=N(e,O("span","x")),r=t.getBoundingClientRect(),n=k(t,0,1).getBoundingClientRect();return Ct=Math.abs(r.left-n.left)>1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n="right"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d["right"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+Qr(e.display),top:p.top,bottom:p.bottom}:Dr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;b<y.length-1&&!(m<y[b]);b++);var w=b?y[b-1]:0,x=y[b],C={left:("right"==h?i.right:i.left)-t.rect.left,right:("left"==h?i.left:i.right)-t.rect.left,top:w,bottom:x};i.left||i.right||(C.bogus=!0);e.options.singleCursorHeightPerLine||(C.rtop=g,C.rbottom=v);return C}(e,t,r,n)).bogus||(t.cache[a]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Ar,Dr={left:0,right:0,top:0,bottom:0};function Wr(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,t>=a&&(l="right")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?"left":"right")&&(l=r),"left"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l="left";if("right"==r&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)n=e[(u+=3)+2],l="right";break}return{node:n,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Hr(e,t){var r=Dr;if("left"==t)for(var n=0;n<e.length&&(r=e[n]).left==r.right;n++);else for(var i=e.length-1;i>=0&&(r=e[i]).left==r.right;i--);return r}function Fr(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function Pr(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fr(e.display.view[t])}function Er(e){Pr(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function zr(){return c&&v?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Ir(){return c&&v?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function Rr(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e.widgets[r].above&&(t+=mr(e.widgets[r]));return t}function Br(e,t,r,n,i){if(!i){var o=Rr(t);r.top+=o,r.bottom+=o}if("line"==n)return r;n||(n="local");var l=je(t);if("local"==n?l+=br(e.display):l-=e.display.viewOffset,"page"==n||"window"==n){var s=e.display.lineSpace.getBoundingClientRect();l+=s.top+("window"==n?0:Ir());var a=s.left+("window"==n?0:zr());r.left+=a,r.right+=a}return r.top+=l,r.bottom+=l,r}function Gr(e,t,r){if("div"==r)return t;var n=t.left,i=t.top;if("page"==r)n-=zr(),i-=Ir();else if("local"==r||!r){var o=e.display.sizer.getBoundingClientRect();n+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:n-l.left,top:i-l.top}}function Ur(e,t,r,n,i){return n||(n=se(e.doc,t.line)),Br(e,n,Tr(e,n,t.ch,i),r)}function Vr(e,t,r,n,i,o){function l(t,l){var s=Or(e,i,t,l?"right":"left",o);return l?s.left=s.right:s.right=s.left,Br(e,n,s,r)}n=n||se(e.doc,t.line),i||(i=Nr(e,n));var s=Ze(n,e.doc.direction),a=t.ch,u=t.sticky;if(a>=n.text.length?(a=n.text.length,u="before"):a<=0&&(a=0,u="after"),!s)return l("before"==u?a-1:a,"before"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=qe(s,a,u),f=_e,d=c(a,h,"before"==u);return null!=f&&(d.other=c(a,f,"before"!=u)),d}function Kr(e,t){var r=0;t=Ce(e.doc,t),e.options.lineWrapping||(r=Qr(e.display)*t.ch);var n=se(e.doc,t.line),i=je(n)+br(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function jr(e,t,r,n,i){var o=ge(e,t,r);return o.xRel=i,n&&(o.outside=!0),o}function Xr(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return jr(n.first,0,null,!0,-1);var i=fe(n,r),o=n.first+n.size-1;if(i>o)return jr(n.first+n.size-1,se(n,o).text.length,null,!0,1);t<0&&(t=0);for(var l=se(n,i);;){var s=$r(e,l,i,t,r),a=Ie(l),u=a&&a.find(0,!0);if(!a||!(s.ch>u.from.ch||s.ch==u.from.ch&&s.xRel>0))return s;i=he(l=u.to.line)}}function Yr(e,t,r,n){n-=Rr(t);var i=t.text.length,o=le(function(t){return Or(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Or(e,r,t).top>n},o,i)}}function _r(e,t,r,n){return r||(r=Nr(e,t)),Yr(e,t,r,Br(e,t,Or(e,r,n),"line").top)}function qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function $r(e,t,r,n,i){i-=je(t);var o=Nr(e,t),l=Rr(t),s=0,a=t.text.length,u=!0,c=Ze(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=Yr(e,t,n,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f<i.length;f++){var d=i[f];if(!(d.from>=u||d.to<=a)){var p=1!=d.level,g=Or(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=g<o?o-g+1e9:g-o;(!c||h>v)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return qr(Vr(e,ge(r,u?a.to:a.from,u?"before":"after"),"line",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Vr(e,ge(r,u?a.from:a.to,u?"after":"before"),"line",t,n);qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Or(e,o,t);return r.top+=l,r.bottom+=l,!!qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left<g.right-n,b=y==u;v=p+(b?0:1),d=b?"after":"before",f=y?g.left:g.right}else{u||v!=a&&v!=s||v++,d=0==v?"after":v==t.text.length?"before":Or(e,o,v-(u?1:0)).bottom+l<=i==u?"after":"before";var w=Vr(e,ge(r,v,d),"line",t,o);f=w.left,m=i<w.top||i>=w.bottom}return jr(r,v=oe(t.text,v,1),d,m,n-f)}function Zr(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Ar){Ar=O("pre");for(var t=0;t<49;++t)Ar.appendChild(document.createTextNode("x")),Ar.appendChild(O("br"));Ar.appendChild(document.createTextNode("x"))}N(e.measure,Ar);var r=Ar.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function Qr(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),r=O("pre",[t]);N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function Jr(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l)r[e.options.gutters[l]]=o.offsetLeft+o.clientLeft+i,n[e.options.gutters[l]]=o.clientWidth;return{fixedPos:en(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function en(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function tn(e){var t=Zr(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/Qr(e.display)-3);return function(i){if(Ve(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return r?o+(Math.ceil(i.text.length/n)||1)*t:o+t}}function rn(e){var t=e.doc,r=tn(e);t.iter(function(e){var t=r(e);t!=e.height&&ce(e,t)})}function nn(e,t,r,n){var i=e.display;if(!r&&"true"==ht(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=Xr(e,o,l);if(n&&1==u.xRel&&(a=se(e.doc,u.line).text).length==u.ch){var c=I(a,a.length,e.options.tabSize)-a.length;u=ge(u.line,Math.max(0,Math.round((o-xr(e.display).left)/Qr(e.display))-c))}return u}function on(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;n<r.length;n++)if((t-=r[n].size)<0)return n}function ln(e){e.display.input.showSelection(e.display.input.prepareSelection())}function sn(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=document.createDocumentFragment(),o=n.selection=document.createDocumentFragment(),l=0;l<r.sel.ranges.length;l++)if(t||l!=r.sel.primIndex){var s=r.sel.ranges[l];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var a=s.empty();(a||e.options.showCursorWhenSelecting)&&an(e,s.head,i),a||cn(e,s,o)}}return n}function an(e,t,r){var n=Vr(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),i=r.appendChild(O("div"," ","CodeMirror-cursor"));if(i.style.left=n.left+"px",i.style.top=n.top+"px",i.style.height=Math.max(0,n.bottom-n.top)*e.options.cursorHeight+"px",n.other){var o=r.appendChild(O("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"));o.style.display="",o.style.left=n.other.left+"px",o.style.top=n.other.top+"px",o.style.height=.85*(n.other.bottom-n.other.top)+"px"}}function un(e,t){return e.top-t.top||e.left-t.left}function cn(e,t,r){var n=e.display,i=e.doc,o=document.createDocumentFragment(),l=xr(e.display),s=l.left,a=Math.max(n.sizerWidth,Sr(e)-n.sizer.offsetLeft)-l.right,u="ltr"==i.direction;function c(e,t,r,n){t<0&&(t=0),t=Math.round(t),n=Math.round(n),o.appendChild(O("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n top: "+t+"px; width: "+(null==r?a-e:r)+"px;\n height: "+(n-t)+"px"))}function h(t,r,n){var o,l,h=se(i,t),f=h.text.length;function d(r,n){return Ur(e,ge(t,r),"div",h,n)}function p(t,r,n){var i=_r(e,h,null,t),o="ltr"==r==("after"==n)?"left":"right";return d("after"==n?i.begin:i.end-(/\s/.test(h.text.charAt(i.end-1))?2:1),o)[o]}var g=Ze(h,i.direction);return function(e,t,r,n){if(!e)return n(t,r,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<r&&l.to>t||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?"rtl":"ltr",o),i=!0)}i||n(t,r,"ltr")}(g,r||0,null==n?f:n,function(e,t,i,h){var v="ltr"==i,m=d(e,v?"left":"right"),y=d(t-1,v?"right":"left"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,"before"),N=u?s:p(t,i,"after"),O=u&&w&&C?a:y.right):(T=u?p(e,i,"before"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,"after"):a),c(T,m.top,M-T,m.bottom),m.bottom<y.top&&c(s,m.bottom,null,y.top),c(N,y.top,O-N,y.bottom)}(!o||un(m,o)<0)&&(o=m),un(y,o)<0&&(o=y),(!l||un(m,l)<0)&&(l=m),un(y,l)<0&&(l=y)}),{start:o,end:l}}var f=t.from(),d=t.to();if(f.line==d.line)h(f.line,f.ch,d.ch);else{var p=se(i,f.line),g=se(i,d.line),v=Be(p)==Be(g),m=h(f.line,f.ch,v?p.text.length+1:null).end,y=h(d.line,v?0:null,d.ch).start;v&&(m.top<y.top-2?(c(m.right,m.top,null,m.bottom),c(s,y.top,y.left,y.bottom)):c(m.right,m.top,y.left-m.right,m.bottom)),m.bottom<y.top&&c(s,m.bottom,null,y.top)}r.appendChild(o)}function hn(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var r=!0;t.cursorDiv.style.visibility="",e.options.cursorBlinkRate>0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function fn(e){e.state.focused||(e.display.input.focus(),pn(e))}function dn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,gn(e))},100)}function pn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(rt(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),hn(e))}function gn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(rt(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function vn(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n<t.view.length;n++){var i=t.view[n],o=void 0;if(!i.hidden){if(l&&s<8){var a=i.node.offsetTop+i.node.offsetHeight;o=a-r,r=a}else{var u=i.node.getBoundingClientRect();o=u.bottom-u.top}var c=i.line.height-o;if(o<2&&(o=Zr(t)),(c>.005||c<-.005)&&(ce(i.line,o),mn(i.line),i.rest))for(var h=0;h<i.rest.length;h++)mn(i.rest[h])}}}function mn(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var r=e.widgets[t],n=r.node.parentNode;n&&(r.height=n.offsetHeight)}}function yn(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-br(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=fe(t,n),l=fe(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;s<o?(o=s,l=fe(t,je(se(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=l&&(o=fe(t,je(se(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function bn(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=en(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+"px",l=0;l<r.length;l++)if(!r[l].hidden){e.options.fixedGutter&&(r[l].gutter&&(r[l].gutter.style.left=o),r[l].gutterBackground&&(r[l].gutterBackground.style.left=o));var s=r[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=n+i+"px")}}function wn(e){if(!e.options.lineNumbers)return!1;var t=e.doc,r=pe(e.options,t.first+t.size-1),n=e.display;if(r.length!=n.lineNumChars){var i=n.measure.appendChild(O("div",[O("div",r)],"CodeMirror-linenumber CodeMirror-gutter-elt")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return n.lineGutter.style.width="",n.lineNumInnerWidth=Math.max(o,n.lineGutter.offsetWidth-l)+1,n.lineNumWidth=n.lineNumInnerWidth+l,n.lineNumChars=n.lineNumInnerWidth?r.length:-1,n.lineGutter.style.width=n.lineNumWidth+"px",oi(e),!0}return!1}function xn(e,t){var r=e.display,n=Zr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Lr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+wr(r),a=t.top<n,u=t.bottom>s-n;if(t.top<i)l.scrollTop=a?0:t.top;else if(t.bottom>i+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Sr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<h?l.scrollLeft=Math.max(0,t.left-(d?0:10)):t.right>f+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Cn(e,t){null!=t&&(kn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sn(e){kn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Ln(e,t,r){null==t&&null==r||kn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function kn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tn(e,Kr(e,t.from),Kr(e,t.to),t.margin))}function Tn(e,t,r,n){var i=xn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});Ln(e,i.scrollLeft,i.scrollTop)}function Mn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||ii(e,{top:t}),Nn(e,t,!0),r&&ii(e),Jn(e,100))}function Nn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function On(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,bn(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function An(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+wr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+Cr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var Dn=function(e,t,r){this.cm=r;var n=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");e(n),e(i),Je(n,"scroll",function(){n.clientHeight&&t(n.scrollTop,"vertical")}),Je(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};Dn.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display="block",this.vert.style.bottom=t?n+"px":"0";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=r?n+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},Dn.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},Dn.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},Dn.prototype.zeroWidthHack=function(){var e=y&&!d?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new R,this.disableVert=new R},Dn.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents="auto",t.set(1e3,function n(){var i=e.getBoundingClientRect();("vert"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents="none":t.set(1e3,n)})},Dn.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Wn=function(){};function Hn(e,t){t||(t=An(e));var r=e.display.barWidth,n=e.display.barHeight;Fn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&vn(e),Fn(e,An(e)),r=e.display.barWidth,n=e.display.barHeight}function Fn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+"px",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+"px",r.heightForcer.style.borderBottom=n.bottom+"px solid transparent",n.right&&n.bottom?(r.scrollbarFiller.style.display="block",r.scrollbarFiller.style.height=n.bottom+"px",r.scrollbarFiller.style.width=n.right+"px"):r.scrollbarFiller.style.display="",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display="block",r.gutterFiller.style.height=n.bottom+"px",r.gutterFiller.style.width=t.gutterWidth+"px"):r.gutterFiller.style.display=""}Wn.prototype.update=function(){return{bottom:0,right:0}},Wn.prototype.setScrollLeft=function(){},Wn.prototype.setScrollTop=function(){},Wn.prototype.clear=function(){};var Pn={native:Dn,null:Wn};function En(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Pn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Je(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,r){"horizontal"==r?On(e,t):Mn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var zn=0;function In(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++zn},t=e.curOp,nr?nr.ops.push(t):t.ownsGroup=nr={ops:[t],delayedCallbacks:[]}}function Rn(e){!function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r<t.length;r++)t[r].call(null);for(var n=0;n<e.ops.length;n++){var i=e.ops[n];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(r<t.length)}(r)}finally{nr=null,t(r)}}(e.curOp,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,r=0;r<t.length;r++)Bn(t[r]);for(var n=0;n<t.length;n++)(i=t[n]).updatedDisplay=i.mustUpdate&&ri(i.cm,i.update);var i;for(var o=0;o<t.length;o++)Gn(t[o]);for(var l=0;l<t.length;l++)Un(t[l]);for(var s=0;s<t.length;s++)Vn(t[s])}(e)})}function Bn(e){var t,r,n=e.cm,i=n.display;!(r=(t=n).display).scrollbarsClipped&&r.scroller.offsetWidth&&(r.nativeBarWidth=r.scroller.offsetWidth-r.scroller.clientWidth,r.heightForcer.style.height=Cr(t)+"px",r.sizer.style.marginBottom=-r.nativeBarWidth+"px",r.sizer.style.borderRightWidth=Cr(t)+"px",r.scrollbarsClipped=!0),e.updateMaxLine&&Ye(n),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<i.viewFrom||e.scrollToPos.to.line>=i.viewTo)||i.maxLineChanged&&n.options.lineWrapping,e.update=e.mustUpdate&&new ti(n,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Gn(e){var t=e.cm,r=t.display;e.updatedDisplay&&vn(t),e.barMeasure=An(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Tr(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+Cr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Sr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function Un(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&On(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var r=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,r),(e.updatedDisplay||e.startHeight!=t.doc.height)&&Hn(t,e.barMeasure),e.updatedDisplay&&li(t,e.barMeasure),e.selectionChanged&&hn(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),r&&fn(e.cm)}function Vn(e){var t=e.cm,r=t.display,n=t.doc;(e.updatedDisplay&&ni(t,e.update),null==r.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(r.wheelStartX=r.wheelStartY=null),null!=e.scrollTop&&Nn(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&On(t,e.scrollLeft,!0,!0),e.scrollToPos)&&function(e,t){if(!nt(e,"scrollCursorIntoView")){var r=e.display,n=r.sizer.getBoundingClientRect(),i=null;if(t.top+n.top<0?i=!0:t.bottom+n.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O("div","​",null,"position: absolute;\n top: "+(t.top-r.viewOffset-br(e.display))+"px;\n height: "+(t.bottom-t.top+Cr(e)+r.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r="before"==(t=t.ch?ge(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?ge(t.line,t.ch+1,"before"):t);for(var o=0;o<5;o++){var l=!1,s=Vr(e,t),a=r&&r!=t?Vr(e,r):s,u=xn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(On(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,Ce(n,e.scrollToPos.from),Ce(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l<i.length;++l)i[l].lines.length||rt(i[l],"hide");if(o)for(var s=0;s<o.length;++s)o[s].lines.length&&rt(o[s],"unhide");r.wrapper.offsetHeight&&(n.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&rt(t,"changes",t,e.changeObjs),e.update&&e.update.finish()}function Kn(e,t){if(e.curOp)return t();In(e);try{return t()}finally{Rn(e)}}function jn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);In(e);try{return t.apply(e,arguments)}finally{Rn(e)}}}function Xn(e){return function(){if(this.curOp)return e.apply(this,arguments);In(this);try{return e.apply(this,arguments)}finally{Rn(this)}}}function Yn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);In(t);try{return e.apply(this,arguments)}finally{Rn(t)}}}function _n(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&r<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)ke&&Ge(e.doc,t)<i.viewTo&&$n(e);else if(r<=i.viewFrom)ke&&Ue(e.doc,r+n)>i.viewFrom?$n(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)$n(e);else if(t<=i.viewFrom){var o=Zn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):$n(e)}else if(r>=i.viewTo){var l=Zn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):$n(e)}else{var s=Zn(e,t,t,-1),a=Zn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(rr(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):$n(e)}var u=i.externalMeasured;u&&(r<u.lineN?u.lineN+=n:t<u.lineN+u.size&&(i.externalMeasured=null))}function qn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(n.externalMeasured=null),!(t<n.viewFrom||t>=n.viewTo)){var o=n.view[on(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function $n(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Zn(e,t,r,n){var i,o=on(e,t),l=e.display.view;if(!ke||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(n>0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Ge(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function Qn(e){for(var t=e.display.view,r=0,n=0;n<t.length;n++){var i=t[n];i.hidden||i.node&&!i.changes||++r}return r}function Jn(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(ei,e))}function ei(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){var r=+new Date+e.options.workTime,n=zt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ot(t.mode,n.state):null,a=Pt(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&f<l.length;++f)h=l[f]!=o.styles[f];h&&i.push(n.line),o.stateAfter=n.save(),n.nextLine()}else o.text.length<=e.options.maxHighlightLength&&It(e,o.text,n),o.stateAfter=n.line%5==0?n.save():null,n.nextLine();if(+new Date>r)return Jn(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&Kn(e,function(){for(var t=0;t<i.length;t++)qn(e,i[t],"text")})}}var ti=function(e,t,r){var n=e.display;this.viewport=t,this.visible=yn(n,e.doc,t),this.editorIsHidden=!n.wrapper.offsetWidth,this.wrapperHeight=n.wrapper.clientHeight,this.wrapperWidth=n.wrapper.clientWidth,this.oldDisplayWidth=Sr(e),this.force=r,this.dims=Jr(e),this.events=[]};function ri(e,t){var r=e.display,n=e.doc;if(t.editorIsHidden)return $n(e),!1;if(!t.force&&t.visible.from>=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==Qn(e))return!1;wn(e)&&($n(e),t.dims=Jr(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFrom<o&&o-r.viewFrom<20&&(o=Math.max(n.first,r.viewFrom)),r.viewTo>l&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),ke&&(o=Ge(e.doc,o),l=Ue(e.doc,l));var s,u,c,h,f=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;u=o,c=l,0==(h=(s=e).display).view.length||u>=h.viewTo||c<=h.viewFrom?(h.view=rr(s,u,c),h.viewFrom=u):(h.viewFrom>u?h.view=rr(s,u,h.viewFrom).concat(h.view):h.viewFrom<u&&(h.view=h.view.slice(on(s,u))),h.viewFrom=u,h.viewTo<c?h.view=h.view.concat(rr(s,h.viewTo,c)):h.viewTo>c&&(h.view=h.view.slice(0,on(s,c)))),h.viewTo=c,r.viewOffset=je(se(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var d=Qn(e);if(!f&&0==d&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var p=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return d>4&&(r.lineDiv.style.display="none"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h<u.length;h++){var f=u[h];if(f.hidden);else if(f.node&&f.node.parentNode==o){for(;l!=f.node;)l=s(l);var d=i&&null!=t&&t<=c&&f.lineNumber;f.changes&&(B(f.changes,"gutter")>-1&&(d=!1),sr(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(pe(e.options,c)))),l=f.node.nextSibling}else{var p=(m=c,b=r,void 0,w=ur(g=e,v=f),v.text=v.node=w.pre,w.bgClass&&(v.bgClass=w.bgClass),w.textClass&&(v.textClass=w.textClass),hr(g,v),fr(g,v,m,b),pr(g,v,b),v.node);o.insertBefore(p,l)}c+=f.size}var g,v,m,b,w;for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),d>4&&(r.lineDiv.style.display=""),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(p),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,f&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,Jn(e,400)),r.updateLineNumbers=null,!0}function ni(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Sr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+wr(e.display)-Lr(e),r.top)}),t.visible=yn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ri(e,t);n=!1){vn(e);var i=An(e);ln(e),Hn(e,i),li(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function ii(e,t){var r=new ti(e,t);if(ri(e,r)){vn(e),ni(e,r);var n=An(e);ln(e),Hn(e,n),li(e,n),r.finish()}}function oi(e){var t=e.display.gutters.offsetWidth;e.display.sizer.style.marginLeft=t+"px"}function li(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Cr(e)+"px"}function si(e){var t=e.display.gutters,r=e.options.gutters;M(t);for(var n=0;n<r.length;++n){var i=r[n],o=t.appendChild(O("div",null,"CodeMirror-gutter "+i));"CodeMirror-linenumbers"==i&&(e.display.lineGutter=o,o.style.width=(e.display.lineNumWidth||1)+"px")}t.style.display=n?"":"none",oi(e)}function ai(e){var t=B(e.gutters,"CodeMirror-linenumbers");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat(["CodeMirror-linenumbers"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}ti.prototype.signal=function(e,t){ot(e,t)&&this.events.push(arguments)},ti.prototype.finish=function(){for(var e=0;e<this.events.length;e++)rt.apply(null,this.events[e])};var ui=0,ci=null;function hi(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==r&&e.detail&&e.axis==e.VERTICAL_AXIS?r=e.detail:null==r&&(r=e.wheelDelta),{x:t,y:r}}function fi(e){var t=hi(e);return t.x*=ci,t.y*=ci,t}function di(e,t){var n=hi(t),i=n.x,o=n.y,l=e.display,s=l.scroller,u=s.scrollWidth>s.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p<d.length;p++)if(d[p].node==f){e.display.currentWheelTarget=f;break e}if(i&&!r&&!h&&null!=ci)return o&&c&&Mn(e,Math.max(0,s.scrollTop+o*ci)),On(e,Math.max(0,s.scrollLeft+i*ci)),(!o||o&&c)&&st(t),void(l.wheelStartX=null);if(o&&null!=ci){var g=o*ci,v=e.doc.scrollTop,m=v+l.wrapper.clientHeight;g<0?v=Math.max(0,v+g-50):m=Math.min(e.doc.height,m+g+50),ii(e,{top:v,bottom:m})}ui<20&&(null==l.wheelStartX?(l.wheelStartX=s.scrollLeft,l.wheelStartY=s.scrollTop,l.wheelDX=i,l.wheelDY=o,setTimeout(function(){if(null!=l.wheelStartX){var e=s.scrollLeft-l.wheelStartX,t=s.scrollTop-l.wheelStartY,r=t&&l.wheelDY&&t/l.wheelDY||e&&l.wheelDX&&e/l.wheelDX;l.wheelStartX=l.wheelStartY=null,r&&(ci=(ci*ui+r)/(ui+1),++ui)}},200)):(l.wheelDX+=i,l.wheelDY+=o))}}l?ci=-.53:r?ci=15:c?ci=-.7:f&&(ci=-1/3);var pi=function(e,t){this.ranges=e,this.primIndex=t};pi.prototype.primary=function(){return this.ranges[this.primIndex]},pi.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var r=this.ranges[t],n=e.ranges[t];if(!me(r.anchor,n.anchor)||!me(r.head,n.head))return!1}return!0},pi.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new gi(ye(this.ranges[t].anchor),ye(this.ranges[t].head));return new pi(e,this.primIndex)},pi.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},pi.prototype.contains=function(e,t){t||(t=e);for(var r=0;r<this.ranges.length;r++){var n=this.ranges[r];if(ve(t,n.from())>=0&&ve(e,n.to())<=0)return r}return-1};var gi=function(e,t){this.anchor=e,this.head=t};function vi(e,t){var r=e[t];e.sort(function(e,t){return ve(e.from(),t.from())}),t=B(e,r);for(var n=1;n<e.length;n++){var i=e[n],o=e[n-1];if(ve(o.to(),i.from())>=0){var l=we(o.from(),i.from()),s=be(o.to(),i.to()),a=o.empty()?i.from()==i.head:o.from()==o.head;n<=t&&--t,e.splice(--n,2,new gi(a?s:l,a?l:s))}}return new pi(e,t)}function mi(e,t){return new pi([new gi(e,t||e)],0)}function yi(e){return e.text?ge(e.from.line+e.text.length-1,q(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function bi(e,t){if(ve(e,t.from)<0)return e;if(ve(e,t.to)<=0)return yi(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=yi(t).ch-t.to.ch),ge(r,n)}function wi(e,t){for(var r=[],n=0;n<e.sel.ranges.length;n++){var i=e.sel.ranges[n];r.push(new gi(bi(i.anchor,t),bi(i.head,t)))}return vi(r,e.sel.primIndex)}function xi(e,t,r){return e.line==t.line?ge(r.line,e.ch-t.ch+r.ch):ge(r.line+(e.line-t.line),e.ch)}function Ci(e){e.doc.mode=Tt(e.options,e.doc.modeOption),Si(e)}function Si(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Jn(e,100),e.state.modeGen++,e.curOp&&_n(e)}function Li(e,t){return 0==t.from.ch&&0==t.to.ch&&""==q(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function ki(e,t,r,n){function i(e){return r?r[e]:null}function o(e,r,i){!function(e,t,r,n){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),De(e),We(e,r);var i=n?n(e):1;i!=e.height&&ce(e,i)}(e,r,i,n),or(e,"change",e,t)}function l(e,t){for(var r=[],o=e;o<t;++o)r.push(new jt(u[o],i(o),n));return r}var s=t.from,a=t.to,u=t.text,c=se(e,s.line),h=se(e,a.line),f=q(u),d=i(u.length-1),p=a.line-s.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(Li(e,t)){var g=l(0,u.length-1);o(h,h.text,d),p&&e.remove(s.line,p),g.length&&e.insert(s.line,g)}else if(c==h)if(1==u.length)o(c,c.text.slice(0,s.ch)+f+c.text.slice(a.ch),d);else{var v=l(1,u.length-1);v.push(new jt(f+c.text.slice(a.ch),d,n)),o(c,c.text.slice(0,s.ch)+u[0],i(0)),e.insert(s.line+1,v)}else if(1==u.length)o(c,c.text.slice(0,s.ch)+u[0]+h.text.slice(a.ch),i(0)),e.remove(s.line+1,p);else{o(c,c.text.slice(0,s.ch)+u[0],i(0)),o(h,f+h.text.slice(a.ch),d);var m=l(1,u.length-1);p>1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}or(e,"change",e,t)}function Ti(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;l<n.linked.length;++l){var s=n.linked[l];if(s.doc!=i){var a=o&&s.sharedHist;r&&!a||(t(s.doc,a),e(s.doc,n,a))}}}(e,null,!0)}function Mi(e,t){if(t.cm)throw new Error("This document is already in use.");e.doc=t,t.cm=e,rn(e),Ci(e),Ni(e),e.options.lineWrapping||Ye(e),e.options.mode=t.modeOption,_n(e)}function Ni(e){("rtl"==e.doc.direction?H:T)(e.display.lineDiv,"CodeMirror-rtl")}function Oi(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function Ai(e,t){var r={from:ye(t.from),to:yi(t),text:ae(e,t.from,t.to)};return Pi(e,r,t.from.line,t.to.line+1),Ti(e,function(e){return Pi(e,r,t.from.line,t.to.line+1)},!0),r}function Di(e){for(;e.length;){if(!q(e).ranges)break;e.pop()}}function Wi(e,t,r,n){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==n||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(s=i,o=i.lastOp==n?(Di(s.done),q(s.done)):s.done.length&&!q(s.done).ranges?q(s.done):s.done.length>1&&!s.done[s.done.length-2].ranges?(s.done.pop(),q(s.done)):void 0))l=q(o.changes),0==ve(t.from,t.to)&&0==ve(t.from,l.to)?l.to=yi(t):o.changes.push(Ai(e,t));else{var u=q(i.done);for(u&&u.ranges||Fi(e.sel,i.done),o={changes:[Ai(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||rt(e,"historyAdded")}function Hi(e,t,r,n){var i,o,l,s,a,u=e.history,c=n&&n.origin;r==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=q(u.done),s=t,"*"==(a=o.charAt(0))||"+"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Fi(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=r,n&&!1!==n.clearRedo&&Di(u.undone)}function Fi(e,t){var r=q(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Pi(e,t,r,n){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=r.markedSpans),++o})}function Ei(e){if(!e)return null;for(var t,r=0;r<e.length;++r)e[r].marker.explicitlyCleared?t||(t=e.slice(0,r)):t&&t.push(e[r]);return t?t.length?t:null:e}function zi(e,t){var r=function(e,t){var r=t["spans_"+e.id];if(!r)return null;for(var n=[],i=0;i<t.text.length;++i)n.push(Ei(r[i]));return n}(e,t),n=Oe(e,t);if(!r)return n;if(!n)return r;for(var i=0;i<r.length;++i){var o=r[i],l=n[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(r[i]=l)}return r}function Ii(e,t,r){for(var n=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)n.push(r?pi.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];n.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\d+)$/))&&B(t,Number(c[1]))>-1&&(q(s)[h]=u[h],delete u[h])}}}return n}function Ri(e,t,r,n){if(n){var i=e.anchor;if(r){var o=ve(t,i)<0;o!=ve(r,i)<0?(i=t,t=r):o!=ve(t,r)<0&&(t=r)}return new gi(i,t)}return new gi(r||t,t)}function Bi(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),ji(e,new pi([Ri(e.sel.primary(),t,r,i)],0),n)}function Gi(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)n[o]=Ri(e.sel.ranges[o],t[o],null,i);ji(e,vi(n,e.sel.primIndex),r)}function Ui(e,t,r,n){var i=e.sel.ranges.slice(0);i[t]=r,ji(e,vi(i,e.sel.primIndex),n)}function Vi(e,t,r,n){ji(e,mi(t,r),n)}function Ki(e,t,r){var n=e.history.done,i=q(n);i&&i.ranges?(n[n.length-1]=t,Xi(e,t,r)):ji(e,t,r)}function ji(e,t,r){Xi(e,t,r),Hi(e,e.sel,e.cm?e.cm.curOp.id:NaN,r)}function Xi(e,t,r){var n,i,o,l;(ot(e,"beforeSelectionChange")||e.cm&&ot(e.cm,"beforeSelectionChange"))&&(n=e,o=r,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new gi(Ce(n,e[t].anchor),Ce(n,e[t].head))},origin:o&&o.origin},rt(n,"beforeSelectionChange",n,l),n.cm&&rt(n.cm,"beforeSelectionChange",n.cm,l),t=l.ranges!=i.ranges?vi(l.ranges,l.ranges.length-1):i),Yi(e,qi(e,t,r&&r.bias||(ve(t.primary().head,e.sel.primary().head)<0?-1:1),!0)),r&&!1===r.scroll||!e.cm||Sn(e.cm)}function Yi(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=!0,it(e.cm)),or(e,"cursorActivity",e))}function _i(e){Yi(e,qi(e,e.sel,null,!1))}function qi(e,t,r,n){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Zi(e,l.anchor,s&&s.anchor,r,n),u=Zi(e,l.head,s&&s.head,r,n);(i||a!=l.anchor||u!=l.head)&&(i||(i=t.ranges.slice(0,o)),i[o]=new gi(a,u))}return i?vi(i,t.primIndex):t}function $i(e,t,r,n,i){var o=se(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker;if((null==s.from||(a.inclusiveLeft?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(a.inclusiveRight?s.to>=t.ch:s.to>t.ch))){if(i&&(rt(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var u=a.find(n<0?1:-1),c=void 0;if((n<0?a.inclusiveRight:a.inclusiveLeft)&&(u=Qi(e,u,-n,u&&u.line==t.line?o:null)),u&&u.line==t.line&&(c=ve(u,r))&&(n<0?c<0:c>0))return $i(e,u,t,n,i)}var h=a.find(n<0?-1:1);return(n<0?a.inclusiveLeft:a.inclusiveRight)&&(h=Qi(e,h,n,h.line==t.line?o:null)),h?$i(e,h,t,n,i):null}}return t}function Zi(e,t,r,n,i){var o=n||1,l=$i(e,t,r,o,i)||!i&&$i(e,t,r,o,!0)||$i(e,t,r,-o,i)||!i&&$i(e,t,r,-o,!0);return l||(e.cantEdit=!0,ge(e.first,0))}function Qi(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?Ce(e,ge(t.line-1)):null:r>0&&t.ch==(n||se(e,t.line)).text.length?t.line<e.first+e.size-1?ge(t.line+1,0):null:new ge(t.line,t.ch+r)}function Ji(e){e.setSelection(ge(e.firstLine(),0),ge(e.lastLine()),V)}function eo(e,t,r){var n={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){return n.canceled=!0}};return r&&(n.update=function(t,r,i,o){t&&(n.from=Ce(e,t)),r&&(n.to=Ce(e,r)),i&&(n.text=i),void 0!==o&&(n.origin=o)}),rt(e,"beforeChange",e,n),e.cm&&rt(e.cm,"beforeChange",e.cm,n),n.canceled?null:{from:n.from,to:n.to,text:n.text,origin:n.origin}}function to(e,t,r){if(e.cm){if(!e.cm.curOp)return jn(e.cm,to)(e,t,r);if(e.cm.state.suppressEdits)return}if(!(ot(e,"beforeChange")||e.cm&&ot(e.cm,"beforeChange"))||(t=eo(e,t,!0))){var n=Le&&!r&&function(e,t,r){var n=null;if(e.iter(t.line,r.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var r=e.markedSpans[t].marker;!r.readOnly||n&&-1!=B(n,r)||(n||(n=[])).push(r)}}),!n)return null;for(var i=[{from:t,to:r}],o=0;o<n.length;++o)for(var l=n[o],s=l.find(0),a=0;a<i.length;++a){var u=i[a];if(!(ve(u.to,s.from)<0||ve(u.from,s.to)>0)){var c=[a,1],h=ve(u.from,s.from),f=ve(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)ro(e,{from:n[i].from,to:n[i].to,text:i?[""]:t.text,origin:t.origin});else ro(e,t)}}function ro(e,t){if(1!=t.text.length||""!=t.text[0]||0!=ve(t.from,t.to)){var r=wi(e,t);Wi(e,t,r,e.cm?e.cm.curOp.id:NaN),oo(e,t,r,Oe(e,t));var n=[];Ti(e,function(e,r){r||-1!=B(n,e.history)||(uo(e.history,t),n.push(e.history)),oo(e,t,null,Oe(e,t))})}}function no(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s="undo"==t?o.done:o.undone,a="undo"==t?o.undone:o.done,u=0;u<s.length&&(i=s[u],r?!i.ranges||i.equals(e.sel):i.ranges);u++);if(u!=s.length){for(o.lastOrigin=o.lastSelOrigin=null;;){if(!(i=s.pop()).ranges){if(n)return void s.push(i);break}if(Fi(i,a),r&&!i.equals(e.sel))return void ji(e,i,{clearRedo:!1});l=i}var c=[];Fi(l,a),a.push({changes:c,generation:o.generation}),o.generation=i.generation||++o.maxGeneration;for(var h=ot(e,"beforeChange")||e.cm&&ot(e.cm,"beforeChange"),f=function(r){var n=i.changes[r];if(n.origin=t,h&&!eo(e,n,!1))return s.length=0,{};c.push(Ai(e,n));var o=r?wi(e,n):q(s);oo(e,n,o,zi(e,n)),!r&&e.cm&&e.cm.scrollIntoView({from:n.from,to:yi(n)});var l=[];Ti(e,function(e,t){t||-1!=B(l,e.history)||(uo(e.history,n),l.push(e.history)),oo(e,n,null,zi(e,n))})},d=i.changes.length-1;d>=0;--d){var p=f(d);if(p)return p.v}}}}function io(e,t){if(0!=t&&(e.first+=t,e.sel=new pi($(e.sel.ranges,function(e){return new gi(ge(e.anchor.line+t,e.anchor.ch),ge(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){_n(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;n<r.viewTo;n++)qn(e.cm,n,"gutter")}}function oo(e,t,r,n){if(e.cm&&!e.cm.curOp)return jn(e.cm,oo)(e,t,r,n);if(t.to.line<e.first)io(e,t.text.length-1-(t.to.line-t.from.line));else if(!(t.from.line>e.lastLine())){if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);io(e,i),t={from:ge(e.first,0),to:ge(t.to.line+i,t.to.ch),text:[q(t.text)],origin:t.origin}}var o=e.lastLine();t.to.line>o&&(t={from:t.from,to:ge(o,se(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ae(e,t.from,t.to),r||(r=wi(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=he(Be(se(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&it(e);ki(n,t,r,tn(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Xe(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var r=e.first,n=t-1;n>r;n--){var i=se(e,n).stateAfter;if(i&&(!(i instanceof Ht)||n+i.lookAhead<t)){r=n+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,r)}})(n,o.line),Jn(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?_n(e):o.line!=l.line||1!=t.text.length||Li(e.doc,t)?_n(e,o.line,l.line+1,u):qn(e,o.line,"text");var c=ot(e,"changes"),h=ot(e,"change");if(h||c){var f={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin};h&&or(e,"change",e,f),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(f)}e.display.selForContextMenu=null}(e.cm,t,n):ki(e,t,n),Xi(e,r,V)}}function lo(e,t,r,n,i){var o;(n||(n=r),ve(n,r)<0)&&(r=(o=[n,r])[0],n=o[1]);"string"==typeof t&&(t=e.splitLines(t)),to(e,{from:r,to:n,text:t,origin:i})}function so(e,t,r,n){r<e.line?e.line+=n:t<e.line&&(e.line=t,e.ch=0)}function ao(e,t,r,n){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)so(o.ranges[s].anchor,t,r,n),so(o.ranges[s].head,t,r,n)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(r<u.from.line)u.from=ge(u.from.line+n,u.from.ch),u.to=ge(u.to.line+n,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function uo(e,t){var r=t.from.line,n=t.to.line,i=t.text.length-(n-r)-1;ao(e.done,r,n,i),ao(e.undone,r,n,i)}function co(e,t,r,n){var i=t,o=t;return"number"==typeof t?o=se(e,xe(e,t)):i=he(t),null==i?null:(n(o,i)&&e.cm&&qn(e.cm,i,r),o)}function ho(e){this.lines=e,this.parent=null;for(var t=0,r=0;r<e.length;++r)e[r].parent=this,t+=e[r].height;this.height=t}function fo(e){this.children=e;for(var t=0,r=0,n=0;n<e.length;++n){var i=e[n];t+=i.chunkSize(),r+=i.height,i.parent=this}this.size=t,this.height=r,this.parent=null}gi.prototype.from=function(){return we(this.anchor,this.head)},gi.prototype.to=function(){return be(this.anchor,this.head)},gi.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},ho.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var r,n=e,i=e+t;n<i;++n){var o=this.lines[n];this.height-=o.height,(r=o).parent=null,De(r),or(o,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,r){this.height+=r,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var n=0;n<t.length;++n)t[n].parent=this},iterN:function(e,t,r){for(var n=e+t;e<n;++e)if(r(this.lines[e]))return!0}},fo.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var r=0;r<this.children.length;++r){var n=this.children[r],i=n.chunkSize();if(e<i){var o=Math.min(t,i-e),l=n.height;if(n.removeInner(e,o),this.height-=l-n.height,i==o&&(this.children.splice(r--,1),n.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof ho))){var s=[];this.collapse(s),this.children=[new ho(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,r){this.size+=t.length,this.height+=r;for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,r),i.lines&&i.lines.length>50){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new ho(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++n,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=new fo(e.children.splice(e.children.length-5,5));if(e.parent){e.size-=t.size,e.height-=t.height;var r=B(e.parent.children,e);e.parent.children.splice(r+1,0,t)}else{var n=new fo(e.children);n.parent=e,e.children=[n,t],e=n}t.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,r))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var po=function(e,t,r){if(r)for(var n in r)r.hasOwnProperty(n)&&(this[n]=r[n]);this.doc=e,this.node=t};function go(e,t,r){je(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cn(e,r)}po.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,r=this.line,n=he(r);if(null!=n&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(r.widgets=null);var o=mr(this);ce(r,Math.max(0,r.height-o)),e&&(Kn(e,function(){go(e,r,-o),qn(e,n,"widget")}),or(e,"lineWidgetCleared",e,this,n))}},po.prototype.changed=function(){var e=this,t=this.height,r=this.doc.cm,n=this.line;this.height=null;var i=mr(this)-t;i&&(ce(n,n.height+i),r&&Kn(r,function(){r.curOp.forceUpdate=!0,go(r,n,i),or(r,"lineWidgetChanged",r,e,he(n))}))},lt(po);var vo=0,mo=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++vo};function yo(e,t,r,n,i){if(n&&n.shared)return function(e,t,r,n,i){(n=z(n)).shared=!1;var o=[yo(e,t,r,n,i)],l=o[0],s=n.widgetNode;return Ti(e,function(e){s&&(n.widgetNode=s.cloneNode(!0)),o.push(yo(e,Ce(e,t),Ce(e,r),n,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;l=q(o)}),new bo(o,l)}(e,t,r,n,i);if(e.cm&&!e.cm.curOp)return jn(e.cm,yo)(e,t,r,n,i);var o=new mo(e,i),l=ve(t,r);if(n&&z(n,o,!1),l>0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),n.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Re(e,t.line,t,r,o)||t.line!=r.line&&Re(e,r.line,t,r,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");ke=!0}o.addToHistory&&Wi(e,{from:t,to:r,origin:"markText"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){var n,i;u&&o.collapsed&&!u.options.lineWrapping&&Be(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&ce(e,0),n=e,i=new Te(o,a==t.line?t.ch:null,a==r.line?r.ch:null),n.markedSpans=n.markedSpans?n.markedSpans.concat([i]):[i],i.marker.attachLine(n),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Ve(e,t)&&ce(t,0)}),o.clearOnEnter&&Je(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(Le=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++vo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)_n(u,t.line,r.line+1);else if(o.className||o.title||o.startStyle||o.endStyle||o.css)for(var c=t.line;c<=r.line;c++)qn(u,c,"text");o.atomic&&_i(u.doc),or(u,"markerAdded",u,o)}return o}mo.prototype.clear=function(){var e=this;if(!this.explicitlyCleared){var t=this.doc.cm,r=t&&!t.curOp;if(r&&In(t),ot(this,"clear")){var n=this.find();n&&or(this,"clear",n.from,n.to)}for(var i=null,o=null,l=0;l<this.lines.length;++l){var s=e.lines[l],a=Me(s.markedSpans,e);t&&!e.collapsed?qn(t,he(s),"text"):t&&(null!=a.to&&(o=he(s)),null!=a.from&&(i=he(s))),s.markedSpans=Ne(s.markedSpans,a),null==a.from&&e.collapsed&&!Ve(e.doc,s)&&t&&ce(s,Zr(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var u=0;u<this.lines.length;++u){var c=Be(e.lines[u]),h=Xe(c);h>t.display.maxLineLength&&(t.display.maxLine=c,t.display.maxLineLength=h,t.display.maxLineChanged=!0)}null!=i&&t&&this.collapsed&&_n(t,i,o+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&_i(t.doc)),t&&or(t,"markerCleared",t,this,i,o),r&&Rn(t),this.parent&&this.parent.clear()}},mo.prototype.find=function(e,t){var r,n;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Me(o.markedSpans,this);if(null!=l.from&&(r=ge(t?o:he(o),l.from),-1==e))return r;if(null!=l.to&&(n=ge(t?o:he(o),l.to),1==e))return n}return r&&{from:r,to:n}},mo.prototype.changed=function(){var e=this,t=this.find(-1,!0),r=this,n=this.doc.cm;t&&n&&Kn(n,function(){var i=t.line,o=he(t.line),l=Mr(n,o);if(l&&(Fr(l),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0,!Ve(r.doc,i)&&null!=r.height){var s=r.height;r.height=null;var a=mr(r)-s;a&&ce(i,i.height+a)}or(n,"markerChanged",n,e)})},mo.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;t.maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},mo.prototype.detachLine=function(e){if(this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}},lt(mo);var bo=function(e,t){this.markers=e,this.primary=t;for(var r=0;r<e.length;++r)e[r].parent=this};function wo(e){return e.findMarks(ge(e.first,0),e.clipPos(ge(e.lastLine())),function(e){return e.parent})}function xo(e){for(var t=function(t){var r=e[t],n=[r.primary.doc];Ti(r.primary.doc,function(e){return n.push(e)});for(var i=0;i<r.markers.length;i++){var o=r.markers[i];-1==B(n,o.doc)&&(o.parent=null,r.markers.splice(i--,1))}},r=0;r<e.length;r++)t(r)}bo.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();or(this,"clear")}},bo.prototype.find=function(e,t){return this.primary.find(e,t)},lt(bo);var Co=0,So=function(e,t,r,n,i){if(!(this instanceof So))return new So(e,t,r,n,i);null==r&&(r=0),fo.call(this,[new ho([new jt("",null)])]),this.first=r,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=r;var o=ge(r,0);this.sel=mi(o),this.history=new Oi(null),this.id=++Co,this.modeOption=t,this.lineSep=n,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),ki(this,{from:o,to:o,text:e}),ji(this,mi(o),V)};So.prototype=Q(fo.prototype,{constructor:So,iter:function(e,t,r){r?this.iterN(e-this.first,t-e,r):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var r=0,n=0;n<t.length;++n)r+=t[n].height;this.insertInner(e-this.first,t,r)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=ue(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Yn(function(e){var t=ge(this.first,0),r=this.first+this.size-1;to(this,{from:t,to:ge(r,se(this,r).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&Ln(this.cm,0,0),ji(this,mi(t),V)}),replaceRange:function(e,t,r,n){lo(this,e,t=Ce(this,t),r=r?Ce(this,r):t,n)},getRange:function(e,t,r){var n=ae(this,Ce(this,e),Ce(this,t));return!1===r?n:n.join(r||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(de(this,e))return se(this,e)},getLineNumber:function(e){return he(e)},getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=se(this,e)),Be(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return Ce(this,e)},getCursor:function(e){var t=this.sel.primary();return null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Yn(function(e,t,r){Vi(this,Ce(this,"number"==typeof e?ge(e,t||0):e),null,r)}),setSelection:Yn(function(e,t,r){Vi(this,Ce(this,e),Ce(this,t||e),r)}),extendSelection:Yn(function(e,t,r){Bi(this,Ce(this,e),t&&Ce(this,t),r)}),extendSelections:Yn(function(e,t){Gi(this,Se(this,e),t)}),extendSelectionsBy:Yn(function(e,t){Gi(this,Se(this,$(this.sel.ranges,e)),t)}),setSelections:Yn(function(e,t,r){if(e.length){for(var n=[],i=0;i<e.length;i++)n[i]=new gi(Ce(this,e[i].anchor),Ce(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),ji(this,vi(n,t),r)}}),addSelection:Yn(function(e,t,r){var n=this.sel.ranges.slice(0);n.push(new gi(Ce(this,e),Ce(this,t||e))),ji(this,vi(n,n.length-1),r)}),getSelection:function(e){for(var t,r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());t=t?t.concat(i):i}return!1===e?t:t.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[n]=i}return t},replaceSelection:function(e,t,r){for(var n=[],i=0;i<this.sel.ranges.length;i++)n[i]=e;this.replaceSelections(n,t,r||"+input")},replaceSelections:Yn(function(e,t,r){for(var n=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];n[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:r}}for(var s=t&&"end"!=t&&function(e,t,r){for(var n=[],i=ge(e.first,0),o=i,l=0;l<t.length;l++){var s=t[l],a=xi(s.from,i,o),u=xi(yi(s),i,o);if(i=s.to,o=u,"around"==r){var c=e.sel.ranges[l],h=ve(c.head,c.anchor)<0;n[l]=new gi(h?u:a,h?a:u)}else n[l]=new gi(a,a)}return new pi(n,e.sel.primIndex)}(this,n,t),a=n.length-1;a>=0;a--)to(this,n[a]);s?Ki(this,s):this.cm&&Sn(this.cm)}),undo:Yn(function(){no(this,"undo")}),redo:Yn(function(){no(this,"redo")}),undoSelection:Yn(function(){no(this,"undo",!0)}),redoSelection:Yn(function(){no(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n<e.done.length;n++)e.done[n].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++r;return{undo:t,redo:r}},clearHistory:function(){this.history=new Oi(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Ii(this.history.done),undone:Ii(this.history.undone)}},setHistory:function(e){var t=this.history=new Oi(this.history.maxGeneration);t.done=Ii(e.done.slice(0),null,!0),t.undone=Ii(e.undone.slice(0),null,!0)},setGutterMarker:Yn(function(e,t,r){return co(this,e,"gutter",function(e){var n=e.gutterMarkers||(e.gutterMarkers={});return n[t]=r,!r&&re(n)&&(e.gutterMarkers=null),!0})}),clearGutter:Yn(function(e){var t=this;this.iter(function(r){r.gutterMarkers&&r.gutterMarkers[e]&&co(t,r,"gutter",function(){return r.gutterMarkers[e]=null,re(r.gutterMarkers)&&(r.gutterMarkers=null),!0})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!de(this,e))return null;if(t=e,!(e=se(this,e)))return null}else if(null==(t=he(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Yn(function(e,t,r){return co(this,e,"gutter"==t?"gutter":"class",function(e){var n="text"==t?"textClass":"background"==t?"bgClass":"gutter"==t?"gutterClass":"wrapClass";if(e[n]){if(L(r).test(e[n]))return!1;e[n]+=" "+r}else e[n]=r;return!0})}),removeLineClass:Yn(function(e,t,r){return co(this,e,"gutter"==t?"gutter":"class",function(e){var n="text"==t?"textClass":"background"==t?"bgClass":"gutter"==t?"gutterClass":"wrapClass",i=e[n];if(!i)return!1;if(null==r)e[n]=null;else{var o=i.match(L(r));if(!o)return!1;var l=o.index+o[0].length;e[n]=i.slice(0,o.index)+(o.index&&l!=i.length?" ":"")+i.slice(l)||null}return!0})}),addLineWidget:Yn(function(e,t,r){return i=e,o=new po(n=this,t,r),(l=n.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),co(n,i,"widget",function(e){var t=e.widgets||(e.widgets=[]);if(null==o.insertAt?t.push(o):t.splice(Math.min(t.length-1,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!Ve(n,e)){var r=je(e)<n.scrollTop;ce(e,e.height+mr(o)),r&&Cn(l,o.height),l.curOp.forceUpdate=!0}return!0}),l&&or(l,"lineWidgetAdded",l,o,"number"==typeof i?i:he(i)),o;var n,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,r){return yo(this,Ce(this,e),Ce(this,t),r,r&&r.type||"range")},setBookmark:function(e,t){var r={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return yo(this,e=Ce(this,e),e,r,"bookmark")},findMarksAt:function(e){var t=[],r=se(this,(e=Ce(this,e)).line).markedSpans;if(r)for(var n=0;n<r.length;++n){var i=r[n];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=Ce(this,e),t=Ce(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s<l.length;s++){var a=l[s];null!=a.to&&i==e.line&&e.ch>=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;n<r.length;++n)null!=r[n].from&&e.push(r[n].marker)}),e},posFromIndex:function(e){var t,r=this.first,n=this.lineSeparator().length;return this.iter(function(i){var o=i.text.length+n;if(o>e)return t=e,!0;e-=o,++r}),Ce(this,ge(r,t))},indexFromPos:function(e){var t=(e=Ce(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var r=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+r}),t},copy:function(e){var t=new So(ue(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,r=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<r&&(r=e.to);var n=new So(ue(this,t,r),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(n.history=this.history),(this.linked||(this.linked=[])).push({doc:n,sharedHist:e.sharedHist}),n.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r],i=n.find(),o=e.clipPos(i.from),l=e.clipPos(i.to);if(ve(o,l)){var s=yo(e,o,l,n.primary,n.primary.type);n.markers.push(s),s.parent=n}}}(n,wo(this)),n},unlinkDoc:function(e){if(e instanceof wl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),xo(wo(this));break}}if(e.history==this.history){var r=[e.id];Ti(e,function(e){return r.push(e.id)},!0),e.history=new Oi(null),e.history.done=Ii(this.history.done,r),e.history.undone=Ii(this.history.undone,r)}},iterLinkedDocs:function(e){Ti(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):bt(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:Yn(function(e){var t;("rtl"!=e&&(e="ltr"),e!=this.direction)&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Kn(t=this.cm,function(){Ni(t),_n(t)}))})}),So.prototype.eachLine=So.prototype.iter;var Lo=0;function ko(e){var t=this;if(To(t),!nt(t,e)&&!yr(t.display,e)){st(e),l&&(Lo=+new Date);var r=nn(t,e,!0),n=e.dataTransfer.files;if(r&&!t.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),s=0,a=function(e,n){if(!t.options.allowDropFileTypes||-1!=B(t.options.allowDropFileTypes,e.type)){var l=new FileReader;l.onload=jn(t,function(){var e=l.result;if(/[\x00-\x08\x0e-\x1f]{2}/.test(e)&&(e=""),o[n]=e,++s==i){var a={from:r=Ce(t.doc,r),to:r,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:"paste"};to(t.doc,a),Ki(t.doc,mi(r,yi(a)))}}),l.readAsText(e)}},u=0;u<i;++u)a(n[u],u);else{if(t.state.draggingText&&t.doc.sel.contains(r)>-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData("Text");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),Xi(t.doc,mi(r,r)),h)for(var f=0;f<h.length;++f)lo(t.doc,"",h[f].anchor,h[f].head,"drag");t.replaceSelection(c,"around","paste"),t.display.input.focus()}}catch(e){}}}}function To(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function Mo(e){if(document.getElementsByClassName)for(var t=document.getElementsByClassName("CodeMirror"),r=0;r<t.length;r++){var n=t[r].CodeMirror;n&&e(n)}}var No=!1;function Oo(){var e;No||(Je(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,Mo(Ao)},100))}),Je(window,"blur",function(){return Mo(gn)}),No=!0)}function Ao(e){var t=e.display;t.lastWrapHeight==t.wrapper.clientHeight&&t.lastWrapWidth==t.wrapper.clientWidth||(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}for(var Do={3:"Pause",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",127:"Delete",145:"ScrollLock",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},Wo=0;Wo<10;Wo++)Do[Wo+48]=Do[Wo+96]=String(Wo);for(var Ho=65;Ho<=90;Ho++)Do[Ho]=String.fromCharCode(Ho);for(var Fo=1;Fo<=12;Fo++)Do[Fo+111]=Do[Fo+63235]="F"+Fo;var Po={};function Eo(e){var t,r,n,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))r=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error("Unrecognized modifier name: "+s);n=!0}}return t&&(e="Alt-"+e),r&&(e="Ctrl-"+e),i&&(e="Cmd-"+e),n&&(e="Shift-"+e),e}function zo(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];if(/^(name|fallthrough|(de|at)tach)$/.test(r))continue;if("..."==n){delete e[r];continue}for(var i=$(r.split(" "),Eo),o=0;o<i.length;o++){var l=void 0,s=void 0;o==i.length-1?(s=i.join(" "),l=n):(s=i.slice(0,o+1).join(" "),l="...");var a=t[s];if(a){if(a!=l)throw new Error("Inconsistent bindings for "+s)}else t[s]=l}delete e[r]}for(var u in t)e[u]=t[u];return e}function Io(e,t,r,n){var i=(t=Uo(t)).call?t.call(e,n):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&r(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return Io(e,t.fallthrough,r,n);for(var o=0;o<t.fallthrough.length;o++){var l=Io(e,t.fallthrough[o],r,n);if(l)return l}}}function Ro(e){var t="string"==typeof e?e:Do[e.keyCode];return"Ctrl"==t||"Alt"==t||"Shift"==t||"Mod"==t}function Bo(e,t,r){var n=e;return t.altKey&&"Alt"!=n&&(e="Alt-"+e),(C?t.metaKey:t.ctrlKey)&&"Ctrl"!=n&&(e="Ctrl-"+e),(C?t.ctrlKey:t.metaKey)&&"Cmd"!=n&&(e="Cmd-"+e),!r&&t.shiftKey&&"Shift"!=n&&(e="Shift-"+e),e}function Go(e,t){if(h&&34==e.keyCode&&e.char)return!1;var r=Do[e.keyCode];return null!=r&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(r=e.code),Bo(r,e,t))}function Uo(e){return"string"==typeof e?Po[e]:e}function Vo(e,t){for(var r=e.doc.sel.ranges,n=[],i=0;i<r.length;i++){for(var o=t(r[i]);n.length&&ve(o.from,q(n).to)<=0;){var l=n.pop();if(ve(l.from,o.from)<0){o.from=l.from;break}}n.push(o)}Kn(e,function(){for(var t=n.length-1;t>=0;t--)lo(e.doc,"",n[t].from,n[t].to,"+delete");Sn(e)})}function Ko(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function jo(e,t,r){var n=Ko(e,t.ch,r);return null==n?null:new ge(t.line,n,r<0?"after":"before")}function Xo(e,t,r,n,i){if(e){var o=Ze(r,t.doc.direction);if(o){var l,s=i<0?q(o):o[0],a=i<0==(1==s.level)?"after":"before";if(s.level>0||"rtl"==t.doc.direction){var u=Nr(t,r);l=i<0?r.text.length-1:0;var c=Or(t,u,l).top;l=le(function(e){return Or(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),"before"==a&&(l=Ko(r,l,1))}else l=i<0?s.to:s.from;return new ge(n,l,a)}}return new ge(n,i<0?r.text.length:0,i<0?"before":"after")}Po.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Po.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Po.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Po.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Po.default=y?Po.macDefault:Po.pcDefault;var Yo={selectAll:Ji,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(e){return Vo(e,function(t){if(t.empty()){var r=se(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line<e.lastLine()?{from:t.head,to:ge(t.head.line+1,0)}:{from:t.head,to:ge(t.head.line,r)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){return Vo(e,function(t){return{from:ge(t.from().line,0),to:Ce(e.doc,ge(t.to().line+1,0))}})},delLineLeft:function(e){return Vo(e,function(e){return{from:ge(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,"div").top+5;return{from:e.coordsChar({left:0,top:r},"div"),to:t.from()}})},delWrappedLineRight:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,"div").top+5,n=e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},"div");return{from:t.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(ge(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(ge(e.lastLine()))},goLineStart:function(e){return e.extendSelectionsBy(function(t){return _o(e,t.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(e){return e.extendSelectionsBy(function(t){return qo(e,t.head)},{origin:"+move",bias:1})},goLineEnd:function(e){return e.extendSelectionsBy(function(t){return function(e,t){var r=se(e.doc,t),n=function(e){for(var t;t=Ie(e);)e=t.find(1,!0).line;return e}(r);n!=r&&(t=he(n));return Xo(!0,e,r,t,-1)}(e,t.head.line)},{origin:"+move",bias:-1})},goLineRight:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,"div").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},"div")},j)},goLineLeft:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,"div").top+5;return e.coordsChar({left:0,top:r},"div")},j)},goLineLeftSmart:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,"div").top+5,n=e.coordsChar({left:0,top:r},"div");return n.ch<e.getLine(n.line).search(/\S/)?qo(e,t.head):n},j)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"char")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],r=e.listSelections(),n=e.options.tabSize,i=0;i<r.length;i++){var o=r[i].from(),l=I(e.getLine(o.line),o.ch,n);t.push(_(n-l%n))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=[],n=0;n<t.length;n++)if(t[n].empty()){var i=t[n].head,o=se(e.doc,i.line).text;if(o)if(i.ch==o.length&&(i=new ge(i.line,i.ch-1)),i.ch>0)i=new ge(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),ge(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=se(e.doc,i.line-1).text;l&&(i=new ge(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),ge(i.line-1,l.length-1),i,"+transpose"))}r.push(new gi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,"+input");t=e.listSelections();for(var n=0;n<t.length;n++)e.indentLine(t[n].from().line,null,!0);Sn(e)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function _o(e,t){var r=se(e.doc,t),n=Be(r);return n!=r&&(t=he(n)),Xo(!0,e,n,t,1)}function qo(e,t){var r=_o(e,t.line),n=se(e.doc,r.line),i=Ze(n,e.doc.direction);if(!i||0==i[0].level){var o=Math.max(0,n.text.search(/\S/)),l=t.line==r.line&&t.ch<=o&&t.ch;return ge(r.line,l?0:o,r.sticky)}return r}function $o(e,t,r){if("string"==typeof t&&!(t=Yo[t]))return!1;e.display.input.ensurePolled();var n=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),r&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=n,e.state.suppressEdits=!1}return i}var Zo=new R;function Qo(e,t,r,n){var i=e.state.keySeq;if(i){if(Ro(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:Zo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),Jo(e,i+" "+t,r,n))return!0}return Jo(e,t,r,n)}function Jo(e,t,r,n){var i=function(e,t,r){for(var n=0;n<e.state.keyMaps.length;n++){var i=Io(t,e.state.keyMaps[n],r,e);if(i)return i}return e.options.extraKeys&&Io(t,e.options.extraKeys,r,e)||Io(t,e.options.keyMap,r,e)}(e,t,n);return"multi"==i&&(e.state.keySeq=t),"handled"==i&&or(e,"keyHandled",e,t,r),"handled"!=i&&"multi"!=i||(st(r),hn(e)),!!i}function el(e,t){var r=Go(t,!0);return!!r&&(t.shiftKey&&!e.state.keySeq?Qo(e,"Shift-"+r,t,function(t){return $o(e,t,!0)})||Qo(e,r,t,function(t){if("string"==typeof t?/^go[A-Z]/.test(t):t.motion)return $o(e,t)}):Qo(e,r,t,function(t){return $o(e,t)}))}var tl=null;function rl(e){var t=this;if(t.curOp.focus=W(),!nt(t,e)){l&&s<11&&27==e.keyCode&&(e.returnValue=!1);var r=e.keyCode;t.display.shift=16==r||e.shiftKey;var n=el(t,e);h&&(tl=n?r:null,!n&&88==r&&!xt&&(y?e.metaKey:e.ctrlKey)&&t.replaceSelection("",null,"cut")),18!=r||/\bCodeMirror-crosshair\b/.test(t.display.lineDiv.className)||function(e){var t=e.display.lineDiv;function r(e){18!=e.keyCode&&e.altKey||(T(t,"CodeMirror-crosshair"),tt(document,"keyup",r),tt(document,"mouseover",r))}H(t,"CodeMirror-crosshair"),Je(document,"keyup",r),Je(document,"mouseover",r)}(t)}}function nl(e){16==e.keyCode&&(this.doc.sel.shift=!1),nt(this,e)}function il(e){var t=this;if(!(yr(t.display,e)||nt(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var r=e.keyCode,n=e.charCode;if(h&&r==tl)return tl=null,void st(e);if(!h||e.which&&!(e.which<10)||!el(t,e)){var i,o=String.fromCharCode(null==n?r:n);if("\b"!=o)if(!Qo(i=t,"'"+o+"'",e,function(e){return $o(i,e,!0)}))t.display.input.onKeyPress(e)}}}var ol,ll,sl=function(e,t,r){this.time=e,this.pos=t,this.button=r};function al(e){var t=this,r=t.display;if(!(nt(t,e)||r.activeTouch&&r.input.supportsTouch()))if(r.input.ensurePolled(),r.shift=e.shiftKey,yr(r,e))a||(r.scroller.draggable=!1,setTimeout(function(){return r.scroller.draggable=!0},100));else if(!hl(t,e)){var n,i,o,u=nn(t,e),c=ft(e),h=u?(n=u,i=c,o=+new Date,ll&&ll.compare(o,n,i)?(ol=ll=null,"triple"):ol&&ol.compare(o,n,i)?(ll=new sl(o,n,i),ol=null,"double"):(ol=new sl(o,n,i),ll=null,"single")):"single";window.focus(),1==c&&t.state.selectingText&&t.state.selectingText(e),u&&function(e,t,r,n,i){var o="Click";"double"==n?o="Double"+o:"triple"==n&&(o="Triple"+o);return Qo(e,Bo(o=(1==t?"Left":2==t?"Middle":"Right")+o,i),i,function(t){if("string"==typeof t&&(t=Yo[t]),!t)return!1;var n=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n=t(e,r)!=U}finally{e.state.suppressEdits=!1}return n})}(t,c,u,h,e)||(1==c?u?function(e,t,r,n){l?setTimeout(E(fn,e),0):e.curOp.focus=W();var i,o=function(e,t,r){var n=e.getOption("configureMouse"),i=n?n(e,t,r):{};if(null==i.unit){var o=b?r.shiftKey&&r.metaKey:r.altKey;i.unit=o?"rectangle":"single"==t?"char":"double"==t?"word":"line"}(null==i.extend||e.doc.extend)&&(i.extend=e.doc.extend||r.shiftKey);null==i.addNew&&(i.addNew=y?r.metaKey:r.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?r.altKey:r.ctrlKey));return i}(e,r,n),u=e.doc.sel;e.options.dragDrop&>&&!e.isReadOnly()&&"single"==r&&(i=u.contains(t))>-1&&(ve((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(ve(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=jn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,tt(i.wrapper.ownerDocument,"mouseup",u),tt(i.wrapper.ownerDocument,"mousemove",c),tt(i.scroller,"dragstart",h),tt(i.scroller,"drop",u),o||(st(t),n.addNew||Bi(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();Je(i.wrapper.ownerDocument,"mouseup",u),Je(i.wrapper.ownerDocument,"mousemove",c),Je(i.scroller,"dragstart",h),Je(i.scroller,"drop",u),dn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;st(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new gi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if("rectangle"==n.unit)n.addNew||(l=new gi(r,r)),r=nn(e,t,!0,!0),s=-1;else{var c=ul(e,r,n.unit);l=n.extend?Ri(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,ji(o,vi(u.concat([l]),s),{scroll:!1,origin:"*mouse"})):u.length>1&&u[s].empty()&&"char"==n.unit&&!n.extend?(ji(o,vi(u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:"*mouse"}),a=o.sel):Ui(o,s,l,K):(s=0,ji(o,new pi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=ve(h,t))if(h=t,"rectangle"==n.unit){for(var i=[],u=e.options.tabSize,c=I(se(o,r.line).text,r.ch,u),f=I(se(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=se(o,g).text,y=X(m,d,u);d==p?i.push(new gi(ge(g,y),ge(g,y))):m.length>y&&i.push(new gi(ge(g,y),ge(g,X(m,p,u))))}i.length||i.push(new gi(r,r)),ji(o,vi(a.ranges.slice(0,s).concat(i),s),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=ul(e,t,n.unit),C=w.anchor;ve(x.anchor,C)>0?(b=x.head,C=we(w.from(),x.anchor)):(b=x.anchor,C=be(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=se(e.doc,r.line);if(0==ve(r,n)&&r.sticky==n.sticky)return t;var o=Ze(i);if(!o)return t;var l=qe(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*("ltr"==e.doc.direction?1:-1)>0;else{var c=qe(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?"after":"before";return r.ch==p&&r.sticky==g?t:new gi(new ge(r.line,p,g),n)}(e,new gi(Ce(o,C),b)),ji(o,vi(S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,st(t),i.input.focus(),tt(i.wrapper.ownerDocument,"mousemove",v),tt(i.wrapper.ownerDocument,"mouseup",m),o.history.lastSelOrigin=null}var v=jn(e,function(t){ft(t)?function t(r){var l=++p;var s=nn(e,r,!0,"rectangle"==n.unit);if(!s)return;if(0!=ve(s,h)){e.curOp.focus=W(),f(s);var a=yn(i,o);(s.line>=a.to||s.line<a.from)&&setTimeout(jn(e,function(){p==l&&t(r)}),150)}else{var u=r.clientY<d.top?-20:r.clientY>d.bottom?20:0;u&&setTimeout(jn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=jn(e,g);e.state.selectingText=m,Je(i.wrapper.ownerDocument,"mousemove",v),Je(i.wrapper.ownerDocument,"mouseup",m)}(e,n,t,o)}(t,u,h,e):ht(e)==r.scroller&&st(e):2==c?(u&&Bi(t.doc,u),setTimeout(function(){return r.input.focus()},20)):3==c&&(S?fl(t,e):dn(t)))}}function ul(e,t,r){if("char"==r)return new gi(t,t);if("word"==r)return e.findWordAt(t);if("line"==r)return new gi(ge(t.line,0),Ce(e.doc,ge(t.line+1,0)));var n=r(e,t);return new gi(n.from,n.to)}function cl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&st(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ot(e,r))return ut(t);o-=s.top-l.viewOffset;for(var a=0;a<e.options.gutters.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return rt(e,r,e,fe(e.doc,o),e.options.gutters[a],t),ut(t)}}function hl(e,t){return cl(e,t,"gutterClick",!0)}function fl(e,t){yr(e.display,t)||function(e,t){if(!ot(e,"gutterContextMenu"))return!1;return cl(e,t,"gutterContextMenu",!1)}(e,t)||nt(e,t,"contextmenu")||e.display.input.onContextMenu(t)}function dl(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Er(e)}sl.prototype.compare=function(e,t,r){return this.time+400>e&&0==ve(t,this.pos)&&r==this.button};var pl={toString:function(){return"CodeMirror.Init"}},gl={},vl={};function ml(e){si(e),_n(e),bn(e)}function yl(e,t,r){if(!t!=!(r&&r!=pl)){var n=e.display.dragFunctions,i=t?Je:tt;i(e.display.scroller,"dragstart",n.start),i(e.display.scroller,"dragenter",n.enter),i(e.display.scroller,"dragover",n.over),i(e.display.scroller,"dragleave",n.leave),i(e.display.scroller,"drop",n.drop)}}function bl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),Ye(e)),rn(e),_n(e),Er(e),setTimeout(function(){return Hn(e)},100)}function wl(e,t){var n=this;if(!(this instanceof wl))return new wl(e,t);this.options=t=t?z(t):{},z(gl,t,!1),ai(t);var i=t.value;"string"==typeof i&&(i=new So(i,t.mode,null,t.lineSeparator,t.direction)),this.doc=i;var o=new wl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n){var i=this;this.input=n,i.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),i.scrollbarFiller.setAttribute("cm-not-content","true"),i.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),i.gutterFiller.setAttribute("cm-not-content","true"),i.lineDiv=A("div",null,"CodeMirror-code"),i.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),i.cursorDiv=O("div",null,"CodeMirror-cursors"),i.measure=O("div",null,"CodeMirror-measure"),i.lineMeasure=O("div",null,"CodeMirror-measure"),i.lineSpace=A("div",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,"position: relative; outline: none");var o=A("div",[i.lineSpace],"CodeMirror-lines");i.mover=O("div",[o],null,"position: relative"),i.sizer=O("div",[i.mover],"CodeMirror-sizer"),i.sizerWidth=null,i.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),i.gutters=O("div",null,"CodeMirror-gutters"),i.lineGutter=null,i.scroller=O("div",[i.sizer,i.heightForcer,i.gutters],"CodeMirror-scroll"),i.scroller.setAttribute("tabIndex","-1"),i.wrapper=O("div",[i.scrollbarFiller,i.gutterFiller,i.scroller],"CodeMirror"),l&&s<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),a||r&&m||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,n.init(i)}(e,i,o);for(var c in u.wrapper.CodeMirror=this,si(this),dl(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),En(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;Je(t.scroller,"mousedown",jn(e,al)),Je(t.scroller,"dblclick",l&&s<11?jn(e,function(t){if(!nt(e,t)){var r=nn(e,t);if(r&&!hl(e,t)&&!yr(e.display,t)){st(t);var n=e.findWordAt(r);Bi(e.doc,n.anchor,n.head)}}}):function(t){return nt(e,t)||st(t)});S||Je(t.scroller,"contextmenu",function(t){return fl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}Je(t.scroller,"touchstart",function(i){if(!nt(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!hl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),Je(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),Je(t.scroller,"touchend",function(r){var n=t.activeTouch;if(n&&!yr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,"page");l=!n.prev||o(n,n.prev)?new gi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new gi(ge(s.line,0),Ce(e.doc,ge(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),st(r)}i()}),Je(t.scroller,"touchcancel",i),Je(t.scroller,"scroll",function(){t.scroller.clientHeight&&(Mn(e,t.scroller.scrollTop),On(e,t.scroller.scrollLeft,!0),rt(e,"scroll",e))}),Je(t.scroller,"mousewheel",function(t){return di(e,t)}),Je(t.scroller,"DOMMouseScroll",function(t){return di(e,t)}),Je(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){nt(e,t)||ct(t)},over:function(t){nt(e,t)||(!function(e,t){var r=nn(e,t);if(r){var n=document.createDocumentFragment();an(e,r,n),e.display.dragCursor||(e.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),ct(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-Lo<100))ct(t);else if(!nt(e,t)&&!yr(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!f)){var r=O("img",null,null,"position: fixed; left: 0; top: 0;");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:jn(e,ko),leave:function(t){nt(e,t)||To(e)}};var a=t.input.getField();Je(a,"keyup",function(t){return nl.call(e,t)}),Je(a,"keydown",jn(e,rl)),Je(a,"keypress",jn(e,il)),Je(a,"focus",function(t){return pn(e,t)}),Je(a,"blur",function(t){return gn(e,t)})}(this),Oo(),In(this),this.curOp.forceUpdate=!0,Mi(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(pn,this),20):gn(this),vl)vl.hasOwnProperty(c)&&vl[c](n,t[c],pl);wn(this),t.finishInit&&t.finishInit(this);for(var d=0;d<xl.length;++d)xl[d](n);Rn(this),a&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(u.lineDiv).textRendering&&(u.lineDiv.style.textRendering="auto")}wl.defaults=gl,wl.optionHandlers=vl;var xl=[];function Cl(e,t,r,n){var i,o=e.doc;null==r&&(r="add"),"smart"==r&&(o.mode.indent?i=zt(e,t).state:r="prev");var l=e.options.tabSize,s=se(o,t),a=I(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(n||/\S/.test(s.text)){if("smart"==r&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||u>150)){if(!n)return;r="prev"}}else u=0,r="not";"prev"==r?u=t>o.first?I(se(o,t-1).text,null,l):0:"add"==r?u=a+e.options.indentUnit:"subtract"==r?u=a-e.options.indentUnit:"number"==typeof r&&(u=a+r),u=Math.max(0,u);var h="",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+="\t";if(f<u&&(h+=_(u-f)),h!=c)return lo(o,h,ge(t,0),ge(t,c.length),"+input"),s.stateAfter=null,!0;for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var v=ge(t,c.length);Ui(o,p,new gi(v,v));break}}}wl.defineInitHook=function(e){return xl.push(e)};var Sl=null;function Ll(e){Sl=e}function kl(e,t,r,n,i){var o=e.doc;e.display.shift=!1,n||(n=o.sel);var l,s=e.state.pasteIncoming||"paste"==i,a=bt(t),u=null;if(s&&n.ranges.length>1)if(Sl&&Sl.text.join("\n")==t){if(n.ranges.length%Sl.text.length==0){u=[];for(var c=0;c<Sl.text.length;c++)u.push(o.splitLines(Sl.text[c]))}}else a.length==n.ranges.length&&e.options.pasteLinesPerSelection&&(u=$(a,function(e){return[e]}));for(var h=n.ranges.length-1;h>=0;h--){var f=n.ranges[h],d=f.from(),p=f.to();f.empty()&&(r&&r>0?d=ge(d.line,d.ch-r):e.state.overwrite&&!s?p=ge(p.line,Math.min(se(o,p.line).text.length,p.ch+q(a).length)):Sl&&Sl.lineWise&&Sl.text.join("\n")==t&&(d=p=ge(d.line,0))),l=e.curOp.updateInput;var g={from:d,to:p,text:u?u[h%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming?"cut":"+input")};to(e.doc,g),or(e,"inputRead",e,g)}t&&!s&&Ml(e,t),Sn(e),e.curOp.updateInput=l,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Tl(e,t){var r=e.clipboardData&&e.clipboardData.getData("Text");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||Kn(t,function(){return kl(t,r,0,null,"paste")}),!0}function Ml(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(t.indexOf(o.electricChars.charAt(s))>-1){l=Cl(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(se(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Cl(e,i.head.line,"smart"));l&&or(e,"electricInput",e,i.head.line)}}}function Nl(e){for(var t=[],r=[],n=0;n<e.doc.sel.ranges.length;n++){var i=e.doc.sel.ranges[n].head.line,o={anchor:ge(i,0),head:ge(i+1,0)};r.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:r}}function Ol(e,t){e.setAttribute("autocorrect","off"),e.setAttribute("autocapitalize","off"),e.setAttribute("spellcheck",!!t)}function Al(){var e=O("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=O("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return a?e.style.width="1000px":e.setAttribute("wrap","off"),g&&(e.style.border="1px solid black"),Ol(e),t}function Dl(e,t,r,n,i){var o=t,l=r,s=se(e,t.line);function a(n){var o,l;if(null==(o=i?function(e,t,r,n){var i=Ze(t,e.doc.direction);if(!i)return jo(t,r,n);r.ch>=t.text.length?(r.ch=t.text.length,r.sticky="before"):r.ch<=0&&(r.ch=0,r.sticky="after");var o=qe(i,r.ch,r.sticky),l=i[o];if("ltr"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from<r.ch))return jo(t,r,n);var s,a=function(e,r){return Ko(t,e instanceof ge?e.ch:e,r)},u=function(r){return e.options.lineWrapping?(s=s||Nr(e,t),_r(e,t,s,r)):{begin:0,end:t.text.length}},c=u("before"==r.sticky?a(r,-1):r.ch);if("rtl"==e.doc.direction||1==l.level){var h=1==l.level==n<0,f=a(r,h?1:-1);if(null!=f&&(h?f<=l.to&&f<=c.end:f>=l.from&&f>=c.begin)){var d=h?"before":"after";return new ge(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new ge(r.line,a(e,1),"before"):new ge(r.line,e,"after")};e>=0&&e<i.length;e+=t){var l=i[e],s=t>0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u<l.to)return o(u,s);if(u=s?l.from:a(l.to,-1),n.begin<=u&&u<n.end)return o(u,s)}},g=p(o+n,n,c);if(g)return g;var v=n>0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):jo(s,t,r))){if(n||(l=t.line+r)<e.first||l>=e.first+e.size||(t=new ge(l,t.ch,t.sticky),!(s=se(e,l))))return!1;t=Xo(i,e.cm,s,t.line,r)}else t=o;return!0}if("char"==n)a();else if("column"==n)a(!0);else if("word"==n||"group"==n)for(var u=null,c="group"==n,h=e.cm&&e.cm.getHelper(t,"wordChars"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||"\n",p=te(d,h)?"w":c&&"\n"==d?"n":!c||/\s/.test(d)?null:"p";if(!c||f||p||(p="s"),u&&u!=p){r<0&&(r=1,a(),t.sticky="after");break}if(p&&(u=p),r>0&&!a(!f))break}var g=Zi(e,t,o,l,!0);return me(o,g)&&(g.hitSide=!0),g}function Wl(e,t,r,n){var i,o,l=e.doc,s=t.left;if("page"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*Zr(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else"line"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=Xr(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var Hl=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Fl(e,t){var r=Mr(e,t.line);if(!r||r.hidden)return null;var n=se(e.doc,t.line),i=kr(r,n,t.line),o=Ze(n,e.doc.direction),l="left";o&&(l=qe(o,t.ch)%2?"right":"left");var s=Wr(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function Pl(e,t){return t&&(e.bad=!0),e}function El(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return Pl(e.clipPos(ge(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==n)return zl(o,t,r)}}function zl(e,t,r){var n=e.text.firstChild,i=!1;if(!t||!D(n,t))return Pl(ge(he(e.line),0),!0);if(t==n&&(i=!0,t=n.childNodes[r],r=0,!t)){var o=e.rest?q(e.rest):e.line;return Pl(ge(he(o),o.text.length),i)}var l=3==t.nodeType?t:null,s=t;for(l||1!=t.childNodes.length||3!=t.firstChild.nodeType||(l=t.firstChild,r&&(r=l.nodeValue.length));s.parentNode!=n;)s=s.parentNode;var a=e.measure,u=a.maps;function c(t,r,n){for(var i=-1;i<(u?u.length:0);i++)for(var o=i<0?a.map:u[i],l=0;l<o.length;l+=3){var s=o[l+2];if(s==t||s==r){var c=he(i<0?e.line:e.rest[i]),h=o[l]+n;return(n<0||s!=t)&&(h=o[l+(n?1:0)]),ge(c,h)}}}var h=c(l,s,r);if(h)return Pl(h,i);for(var f=s.nextSibling,d=l?l.nodeValue.length-r:0;f;f=f.nextSibling){if(h=c(f,f.firstChild,0))return Pl(ge(h.line,h.ch-d),i);d+=f.textContent.length}for(var p=s.previousSibling,g=r;p;p=p.previousSibling){if(h=c(p,p.firstChild,-1))return Pl(ge(h.line,h.ch+g),i);g+=p.textContent.length}}Hl.prototype.init=function(e){var t=this,r=this,n=r.cm,i=r.div=e.lineDiv;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()}),"cut"==e.type&&n.replaceSelection("",null,"cut");else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),"cut"==e.type&&n.operation(function(){n.setSelections(t.ranges,0,V),n.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var o=Sl.text.join("\n");if(e.clipboardData.setData("Text",o),e.clipboardData.getData("Text")==o)return void e.preventDefault()}var l=Al(),s=l.firstChild;n.display.lineSpace.insertBefore(l,n.display.lineSpace.firstChild),s.value=Sl.text.join("\n");var a=document.activeElement;P(s),setTimeout(function(){n.display.lineSpace.removeChild(l),a.focus(),a==i&&r.showPrimarySelection()},50)}}Ol(i,n.options.spellcheck),Je(i,"paste",function(e){nt(n,e)||Tl(e,n)||s<=11&&setTimeout(jn(n,function(){return t.updateFromDOM()}),20)}),Je(i,"compositionstart",function(e){t.composing={data:e.data,done:!1}}),Je(i,"compositionupdate",function(e){t.composing||(t.composing={data:e.data,done:!1})}),Je(i,"compositionend",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),Je(i,"touchstart",function(){return r.forceCompositionEnd()}),Je(i,"input",function(){t.composing||t.readFromDOMSoon()}),Je(i,"copy",o),Je(i,"cut",o)},Hl.prototype.prepareSelection=function(){var e=sn(this.cm,!1);return e.focus=this.cm.state.focused,e},Hl.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Hl.prototype.showPrimarySelection=function(){var e=window.getSelection(),t=this.cm,n=t.doc.sel.primary(),i=n.from(),o=n.to();if(t.display.viewTo==t.display.viewFrom||i.line>=t.display.viewTo||o.line<t.display.viewFrom)e.removeAllRanges();else{var l=El(t,e.anchorNode,e.anchorOffset),s=El(t,e.focusNode,e.focusOffset);if(!l||l.bad||!s||s.bad||0!=ve(we(l,s),i)||0!=ve(be(l,s),o)){var a=t.display.view,u=i.line>=t.display.viewFrom&&Fl(t,i)||{node:a[0].measure.map[2],offset:0},c=o.line<t.display.viewTo&&Fl(t,o);if(!c){var h=a[a.length-1].measure,f=h.maps?h.maps[h.maps.length-1]:h.map;c={node:f[f.length-1],offset:f[f.length-2]-f[f.length-3]}}if(u&&c){var d,p=e.rangeCount&&e.getRangeAt(0);try{d=k(u.node,u.offset,c.offset,c.node)}catch(e){}d&&(!r&&t.state.focused?(e.collapse(u.node,u.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),p&&null==e.anchorNode?e.addRange(p):r&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Hl.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Hl.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Hl.prototype.rememberSelection=function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Hl.prototype.selectionInEditor=function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Hl.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Hl.prototype.blur=function(){this.div.blur()},Hl.prototype.getField=function(){return this.div},Hl.prototype.supportsTouch=function(){return!0},Hl.prototype.receivedFocus=function(){var e=this;this.selectionInEditor()?this.pollSelection():Kn(this.cm,function(){return e.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function t(){e.cm.state.focused&&(e.pollSelection(),e.polling.set(e.cm.options.pollInterval,t))})},Hl.prototype.selectionChanged=function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Hl.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;if(v&&c&&this.cm.options.gutters.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(e.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var r=El(t,e.anchorNode,e.anchorOffset),n=El(t,e.focusNode,e.focusOffset);r&&n&&Kn(t,function(){ji(t.doc,mi(r,n),V),(r.bad||n.bad)&&(t.curOp.selectionChanged=!0)})}}},Hl.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,r,n=this.cm,i=n.display,o=n.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>n.firstLine()&&(l=ge(l.line-1,se(n.doc,l.line-1).length)),s.ch==se(n.doc,s.line).text.length&&s.line<n.lastLine()&&(s=ge(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;l.line==i.viewFrom||0==(e=on(n,l.line))?(t=he(i.view[0].line),r=i.view[0].node):(t=he(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=on(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=he(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o="",l=!1,s=e.doc.lineSeparator();function a(){l&&(o+=s,l=!1)}function u(e){e&&(a(),o+=e)}function c(t){if(1==t.nodeType){var r=t.getAttribute("cm-text");if(null!=r)return void u(r||t.textContent.replace(/\u200b/g,""));var o,h=t.getAttribute("cm-marker");if(h){var f=e.findMarks(ge(n,0),ge(i+1,0),(g=+h,function(e){return e.id==g}));return void(f.length&&(o=f[0].find(0))&&u(ae(e.doc,o.from,o.to).join(s)))}if("false"==t.getAttribute("contenteditable"))return;var d=/^(pre|div|p)$/i.test(t.nodeName);d&&a();for(var p=0;p<t.childNodes.length;p++)c(t.childNodes[p]);d&&(l=!0)}else 3==t.nodeType&&u(t.nodeValue);var g}for(;c(t),t!=r;)t=t.nextSibling;return o}(n,r,u,t,a)),f=ae(n.doc,ge(t,0),ge(a,se(n.doc,a).text.length));h.length>1&&f.length>1;)if(q(h)==q(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);d<m&&g.charCodeAt(d)==v.charCodeAt(d);)++d;for(var y=q(h),b=q(f),w=Math.min(y.length-(1==h.length?d:0),b.length-(1==f.length?d:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==f.length&&t==l.line)for(;d&&d>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(d).replace(/\u200b+$/,"");var x=ge(t,d),C=ge(a,f.length?q(f).length-p:0);return h.length>1||h[0]||ve(x,C)?(lo(n.doc,h,x,C,"+input"),!0):void 0},Hl.prototype.ensurePolled=function(){this.forceCompositionEnd()},Hl.prototype.reset=function(){this.forceCompositionEnd()},Hl.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Hl.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Hl.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Kn(this.cm,function(){return _n(e.cm)})},Hl.prototype.setUneditable=function(e){e.contentEditable="false"},Hl.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||jn(this.cm,kl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Hl.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Hl.prototype.onContextMenu=function(){},Hl.prototype.resetPosition=function(){},Hl.prototype.needsContentAttribute=!0;var Il,Rl,Bl,Gl=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),"cut"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput="",i.value=t.text.join("\n"),P(i))}"cut"==e.type&&(n.state.cutIncoming=!0)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width="0px"),Je(i,"input",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),Je(i,"paste",function(e){nt(n,e)||Tl(e,n)||(n.state.pasteIncoming=!0,r.fastPoll())}),Je(i,"cut",o),Je(i,"copy",o),Je(e.scroller,"paste",function(t){yr(e,t)||nt(n,t)||(n.state.pasteIncoming=!0,r.focus())}),Je(e.lineSpace,"selectstart",function(t){yr(e,t)||st(t)}),Je(i,"compositionstart",function(){var e=n.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor("to"),{className:"CodeMirror-composing"})}}),Je(i,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Al(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=sn(e);if(e.options.moveInputWithCursor){var i=Vr(e,r.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value="",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||wt(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var a=0,u=Math.min(n.length,i.length);a<u&&n.charCodeAt(a)==i.charCodeAt(a);)++a;return Kn(t,function(){kl(t,i.slice(a),n.length-a,null,e.composing?"*compose":null),i.length>1e3||i.indexOf("\n")>-1?r.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea,o=nn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&jn(r,ji)(r.doc,mi(o),V);var c=i.style.cssText,f=t.wrapper.style.cssText;t.wrapper.style.cssText="position: absolute";var d,p=t.wrapper.getBoundingClientRect();if(i.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-p.top-5)+"px; left: "+(e.clientX-p.left-5)+"px;\n z-index: 1000; background: "+(l?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",a&&(d=window.scrollY),n.input.focus(),a&&window.scrollTo(null,d),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=!0,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){ct(e);var g=function(){tt(window,"mouseup",g),setTimeout(m,20)};Je(window,"mouseup",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o="​"+(e?i.value:"");i.value="⇚",i.value=o,t.prevInput=e?"":"​",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending=!1,t.wrapper.style.cssText=f,i.style.cssText=c,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&"​"==t.prevInput?jn(r,Ji)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=pl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=pl,r("value","",function(e,t){return e.setValue(t)},!0),r("mode",null,function(e,t){e.doc.modeOption=t,Ci(e)},!0),r("indentUnit",2,Ci,!0),r("indentWithTabs",!1),r("smartIndent",!0),r("tabSize",4,function(e){Si(e),Er(e),_n(e)},!0),r("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(ge(n,o))}n++});for(var i=r.length-1;i>=0;i--)lo(e.doc,t,r[i],ge(r[i].line,r[i].ch+t.length))}}),r("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),r!=pl&&e.refresh()}),r("specialCharPlaceholder",$t,function(e){return e.refresh()},!0),r("electricChars",!0),r("inputStyle",m?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),r("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r("rtlMoveVisually",!w),r("wholeLineUpdateBefore",!0),r("theme","default",function(e){dl(e),ml(e)},!0),r("keyMap","default",function(e,t,r){var n=Uo(t),i=r!=pl&&Uo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r("extraKeys",null),r("configureMouse",null),r("lineWrapping",!1,bl,!0),r("gutters",[],function(e){ai(e.options),ml(e)},!0),r("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?en(e.display)+"px":"0",e.refresh()},!0),r("coverGutterNextToScrollbar",!1,function(e){return Hn(e)},!0),r("scrollbarStyle","native",function(e){En(e),Hn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r("lineNumbers",!1,function(e){ai(e.options),ml(e)},!0),r("firstLineNumber",1,ml,!0),r("lineNumberFormatter",function(e){return e},ml,!0),r("showCursorWhenSelecting",!1,ln,!0),r("resetSelectionOnContextMenu",!0),r("lineWiseCopyCut",!0),r("pasteLinesPerSelection",!0),r("readOnly",!1,function(e,t){"nocursor"==t&&(gn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),r("dragDrop",!0,yl),r("allowDropFileTypes",null),r("cursorBlinkRate",530),r("cursorScrollMargin",0),r("cursorHeight",1,ln,!0),r("singleCursorHeightPerLine",!0,ln,!0),r("workTime",100),r("workDelay",100),r("flattenSpans",!0,Si,!0),r("addModeClass",!1,Si,!0),r("pollInterval",100),r("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),r("historyEventDelay",1250),r("viewportMargin",10,function(e){return e.refresh()},!0),r("maxHighlightLength",1e4,Si,!0),r("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),r("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),r("autofocus",null),r("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0)}(wl),Rl=(Il=wl).optionHandlers,Bl=Il.helpers={},Il.prototype={constructor:Il,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var r=this.options,n=r[e];r[e]==t&&"mode"!=e||(r[e]=t,Rl.hasOwnProperty(e)&&jn(this,Rl[e])(this,t,n),rt(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Uo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;r<t.length;++r)if(t[r]==e||t[r].name==e)return t.splice(r,1),!0},addOverlay:Xn(function(e,t){var r=e.token?e:Il.getMode(this.options,e);if(r.startState)throw new Error("Overlays may not be stateful.");!function(e,t,r){for(var n=0,i=r(t);n<e.length&&r(e[n])<=i;)n++;e.splice(n,0,t)}(this.state.overlays,{mode:r,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,_n(this)}),removeOverlay:Xn(function(e){for(var t=this.state.overlays,r=0;r<t.length;++r){var n=t[r].modeSpec;if(n==e||"string"==typeof e&&n.name==e)return t.splice(r,1),this.state.modeGen++,void _n(this)}}),indentLine:Xn(function(e,t,r){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),de(this.doc,e)&&Cl(this,e,t,r)}),indentSelection:Xn(function(e){for(var t=this,r=this.doc.sel.ranges,n=-1,i=0;i<r.length;i++){var o=r[i];if(o.empty())o.head.line>n&&(Cl(t,o.head.line,e,!0),n=o.head.line,i==t.doc.sel.primIndex&&Sn(t));else{var l=o.from(),s=o.to(),a=Math.max(n,l.line);n=Math.min(t.lastLine(),s.line-(s.ch?0:1))+1;for(var u=a;u<n;++u)Cl(t,u,e);var c=t.doc.sel.ranges;0==l.ch&&r.length==c.length&&c[i].from().ch>0&&Ui(t.doc,i,new gi(l,c[i].to()),V)}}}),getTokenAt:function(e,t){return Ut(this,e,t)},getLineTokens:function(e,t){return Ut(this,ge(e),t,!0)},getTokenTypeAt:function(e){e=Ce(this.doc,e);var t,r=Et(this,se(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]<o)){t=r[2*l+2];break}n=l+1}}var s=t?t.indexOf("overlay "):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Il.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var r=[];if(!Bl.hasOwnProperty(t))return r;var n=Bl[t],i=this.getModeAt(e);if("string"==typeof i[t])n[i[t]]&&r.push(n[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=n[i[t][o]];l&&r.push(l)}else i.helperType&&n[i.helperType]?r.push(n[i.helperType]):n[i.name]&&r.push(n[i.name]);for(var s=0;s<n._global.length;s++){var a=n._global[s];a.pred(i,this)&&-1==B(r,a.val)&&r.push(a.val)}return r},getStateAfter:function(e,t){var r=this.doc;return zt(this,(e=xe(r,null==e?r.first+r.size-1:e))+1,t).state},cursorCoords:function(e,t){var r=this.doc.sel.primary();return Vr(this,null==e?r.head:"object"==typeof e?Ce(this.doc,e):e?r.from():r.to(),t||"page")},charCoords:function(e,t){return Ur(this,Ce(this.doc,e),t||"page")},coordsChar:function(e,t){return Xr(this,(e=Gr(this,e,t||"page")).left,e.top)},lineAtHeight:function(e,t){return e=Gr(this,{top:e,left:0},t||"page").top,fe(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,r){var n,i=!1;if("number"==typeof e){var o=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>o&&(e=o,i=!0),n=se(this.doc,e)}else n=e;return Br(this,n,{top:0,left:0},t||"page",r||i).top+(i?this.doc.height-je(n):0)},defaultTextHeight:function(){return Zr(this.display)},defaultCharWidth:function(){return Qr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Vr(this,Ce(this.doc,e))).bottom,c=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),a.sizer.appendChild(t),"over"==n)u=e.top;else if("above"==n||"near"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);("above"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+"px",t.style.left=t.style.right="","right"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?c=0:"middle"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+"px"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=xn(o,l)).scrollTop&&Mn(o,s.scrollTop),null!=s.scrollLeft&&On(o,s.scrollLeft))},triggerOnKeyDown:Xn(rl),triggerOnKeyPress:Xn(il),triggerOnKeyUp:nl,triggerOnMouseDown:Xn(al),execCommand:function(e){if(Yo.hasOwnProperty(e))return Yo[e].call(null,this)},triggerElectric:Xn(function(e){Ml(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=Ce(this.doc,e),l=0;l<t&&!(o=Dl(this.doc,o,i,r,n)).hitSide;++l);return o},moveH:Xn(function(e,t){var r=this;this.extendSelectionsBy(function(n){return r.display.shift||r.doc.extend||n.empty()?Dl(r.doc,n.head,e,t,r.options.rtlMoveVisually):e<0?n.from():n.to()},j)}),deleteH:Xn(function(e,t){var r=this.doc.sel,n=this.doc;r.somethingSelected()?n.replaceSelection("",null,"+delete"):Vo(this,function(r){var i=Dl(n,r.head,e,t,!1);return e<0?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,r,n){var i=1,o=n;t<0&&(i=-1,t=-t);for(var l=Ce(this.doc,e),s=0;s<t;++s){var a=Vr(this,l,"div");if(null==o?o=a.left:a.left=o,(l=Wl(this,a,i,r)).hitSide)break}return l},moveV:Xn(function(e,t){var r=this,n=this.doc,i=[],o=!this.display.shift&&!n.extend&&n.sel.somethingSelected();if(n.extendSelectionsBy(function(l){if(o)return e<0?l.from():l.to();var s=Vr(r,l.head,"div");null!=l.goalColumn&&(s.left=l.goalColumn),i.push(s.left);var a=Wl(r,s,e,t);return"page"==t&&l==n.sel.primary()&&Cn(r,Ur(r,a,"div").top-s.top),a},j),i.length)for(var l=0;l<n.sel.ranges.length;l++)n.sel.ranges[l].goalColumn=i[l]}),findWordAt:function(e){var t=se(this.doc,e.line).text,r=e.ch,n=e.ch;if(t){var i=this.getHelper(e,"wordChars");"before"!=e.sticky&&n!=t.length||!r?++n:--r;for(var o=t.charAt(r),l=te(o,i)?function(e){return te(e,i)}:/\s/.test(o)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!te(e)};r>0&&l(t.charAt(r-1));)--r;for(;n<t.length&&l(t.charAt(n));)++n}return new gi(ge(e.line,r),ge(e.line,n))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?H(this.display.cursorDiv,"CodeMirror-overwrite"):T(this.display.cursorDiv,"CodeMirror-overwrite"),rt(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Xn(function(e,t){Ln(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Cr(this)-this.display.barHeight,width:e.scrollWidth-Cr(this)-this.display.barWidth,clientHeight:Lr(this),clientWidth:Sr(this)}},scrollIntoView:Xn(function(e,t){var r,n;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:ge(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(n=e,kn(r=this),r.curOp.scrollToPos=n):Tn(this,e.from,e.to,e.margin)}),setSize:Xn(function(e,t){var r=this,n=function(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e};null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&Pr(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){qn(r,i,"widget");break}++i}),this.curOp.forceUpdate=!0,rt(this,"refresh",this)}),operation:function(e){return Kn(this,e)},startOperation:function(){return In(this)},endOperation:function(){return Rn(this)},refresh:Xn(function(){var e=this.display.cachedTextHeight;_n(this),this.curOp.forceUpdate=!0,Er(this),Ln(this,this.doc.scrollLeft,this.doc.scrollTop),oi(this),(null==e||Math.abs(e-Zr(this.display))>.5)&&rn(this),rt(this,"refresh",this)}),swapDoc:Xn(function(e){var t=this.doc;return t.cm=null,Mi(this,e),Er(this),this.display.input.reset(),Ln(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,or(this,"swapDoc",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},lt(Il),Il.registerHelper=function(e,t,r){Bl.hasOwnProperty(e)||(Bl[e]=Il[e]={_global:[]}),Bl[e][t]=r},Il.registerGlobalHelper=function(e,t,r,n){Il.registerHelper(e,t,n),Bl[e]._global.push({pred:r,val:n})};var Ul,Vl="iter insert remove copy getEditor constructor".split(" ");for(var Kl in So.prototype)So.prototype.hasOwnProperty(Kl)&&B(Vl,Kl)<0&&(wl.prototype[Kl]=function(e){return function(){return e.apply(this.doc,arguments)}}(So.prototype[Kl]));return lt(So),wl.inputStyles={textarea:Gl,contenteditable:Hl},wl.defineMode=function(e){wl.defaults.mode||"null"==e||(wl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),St[e]=t}.apply(this,arguments)},wl.defineMIME=function(e,t){Lt[e]=t},wl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),wl.defineMIME("text/plain","null"),wl.defineExtension=function(e,t){wl.prototype[e]=t},wl.defineDocExtension=function(e,t){So.prototype[e]=t},wl.fromTextArea=function(e,t){if((t=t?z(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute("autofocus")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(Je(e.form,"submit",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(t){t.save=n,t.getTextArea=function(){return e},t.toTextArea=function(){t.toTextArea=isNaN,n(),e.parentNode.removeChild(t.getWrapperElement()),e.style.display="",e.form&&(tt(e.form,"submit",n),"function"==typeof e.form.submit&&(e.form.submit=i))}},e.style.display="none";var s=wl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},(Ul=wl).off=tt,Ul.on=Je,Ul.wheelEventPixels=fi,Ul.Doc=So,Ul.splitLines=bt,Ul.countColumn=I,Ul.findColumn=X,Ul.isWordChar=ee,Ul.Pass=U,Ul.signal=rt,Ul.Line=jt,Ul.changeEnd=yi,Ul.scrollbarModel=Pn,Ul.Pos=ge,Ul.cmpPos=ve,Ul.modes=St,Ul.mimeModes=Lt,Ul.resolveMode=kt,Ul.getMode=Tt,Ul.modeExtensions=Mt,Ul.extendMode=Nt,Ul.copyState=Ot,Ul.startState=Dt,Ul.innerMode=At,Ul.commands=Yo,Ul.keyMap=Po,Ul.keyName=Go,Ul.isModifierKey=Ro,Ul.lookupKey=Io,Ul.normalizeKeyMap=zo,Ul.StringStream=Wt,Ul.SharedTextMarker=bo,Ul.TextMarker=mo,Ul.LineWidget=po,Ul.e_preventDefault=st,Ul.e_stopPropagation=at,Ul.e_stop=ct,Ul.addClass=H,Ul.contains=D,Ul.rmClass=T,Ul.keyNames=Do,wl.version="5.37.1",wl}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,g=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),r=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),i=/Edge\/(\d+)/.exec(e),x=n||r||i,C=x&&(n?document.documentMode||6:+(i||r)[1]),v=!i&&/WebKit\//.test(e),o=v&&/Qt\/\d+\.\d+/.test(e),l=!i&&/Chrome\//.test(e),m=/Opera\//.test(e),c=/Apple Computer/.test(navigator.vendor),s=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),u=/PhantomJS/.test(e),a=!i&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),h=/Android/.test(e),d=a||h||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=a||/Mac/.test(t),f=/\bCrOS\b/.test(e),p=/win/i.test(t),b=m&&e.match(/Version\/(\d*\.\d*)/);(b=b&&Number(b[1]))&&15<=b&&(v=!(m=!1));var w=y&&(o||m&&(null==b||b<12.11)),S=g||x&&9<=C;function L(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var n,r=e.className,i=L(t).exec(r);i&&(n=r.slice(i.index+i[0].length),e.className=r.slice(0,i.index)+(n?i[1]+n:""))};function M(e){for(var t=e.childNodes.length;0<t;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,n,r){var i=O(e,t,n,r);return i.setAttribute("role","presentation"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var t;try{t=document.activeElement}catch(e){t=document.body||null}for(;t&&t.shadowRoot&&t.shadowRoot.activeElement;)t=t.shadowRoot.activeElement;return t}function H(e,t){var n=e.className;L(t).test(n)||(e.className+=(n?" ":"")+t)}function F(e,t){for(var n=e.split(" "),r=0;r<n.length;r++)n[r]&&!L(n[r]).test(t)&&(t+=" "+n[r]);return t}k=document.createRange?function(e,t,n,r){var i=document.createRange();return i.setEnd(r||e,n),i.setStart(e,t),i}:function(e,t,n){var r=document.body.createTextRange();try{r.moveToElementText(e.parentNode)}catch(e){return r}return r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function I(e,t,n){for(var r in t=t||{},e)!e.hasOwnProperty(r)||!1===n&&t.hasOwnProperty(r)||(t[r]=e[r]);return t}function R(e,t,n,r,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=r||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||t<=s)return l+(t-o);l+=s-o,l+=n-l%n,o=s+1}}a?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:x&&(P=function(e){try{e.select()}catch(e){}});var z=function(){this.id=null,this.f=null,this.time=0,this.handler=E(this.onTimeout,this)};function B(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}z.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-new Date)},z.prototype.set=function(e,t){this.f=t;var n=+new Date+e;(!this.id||n<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,e),this.time=n)};var G=50,U={toString:function(){return"CodeMirror.Pass"}},V={scroll:!1},K={origin:"*mouse"},j={origin:"+move"};function X(e,t,n){for(var r=0,i=0;;){var o=e.indexOf("\t",r);-1==o&&(o=e.length);var l=o-r;if(o==e.length||t<=i+l)return r+Math.min(l,t-i);if(i+=o-r,r=o+1,t<=(i+=n-i%n))return r}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var n=[],r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function Z(){}function Q(e,t){var n=Object.create?Object.create(e):(Z.prototype=e,new Z);return t&&I(t,n),n}var J=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function ee(e){return/\w/.test(e)||"€"<e&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(-1<t.source.indexOf("\\w")&&ee(e))||t.test(e):ee(e)}function ne(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return;return 1}var re=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return 768<=e.charCodeAt(0)&&re.test(e)}function oe(e,t,n){for(;(n<0?0<t:t<e.length)&&ie(e.charAt(t));)t+=n;return t}function le(e,t,n){for(var r=n<t?-1:1;;){if(t==n)return t;var i=(t+n)/2,o=r<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+r}}var se=null;function ae(e,t,n){var r;se=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:se=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:se=i)}return null!=r?r:se}var ue,ce,he,de,fe,pe,ge,me=(ue="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",ce="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",he=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,de=/[stwN]/,fe=/[LRr]/,pe=/[Lb1n]/,ge=/[1n]/,function(e,t){var n="ltr"==t?"L":"R";if(0==e.length||"ltr"==t&&!he.test(e))return!1;for(var r,i=e.length,o=[],l=0;l<i;++l)o.push((r=e.charCodeAt(l))<=247?ue.charAt(r):1424<=r&&r<=1524?"R":1536<=r&&r<=1785?ce.charAt(r-1536):1774<=r&&r<=2220?"r":8192<=r&&r<=8203?"w":8204==r?"b":"L");for(var s=0,a=n;s<i;++s){var u=o[s];"m"==u?o[s]=a:a=u}for(var c=0,h=n;c<i;++c){var d=o[c];"1"==d&&"r"==h?o[c]="n":fe.test(d)&&"r"==(h=d)&&(o[c]="R")}for(var f=1,p=o[0];f<i-1;++f){var g=o[f];"+"==g&&"1"==p&&"1"==o[f+1]?o[f]="1":","!=g||p!=o[f+1]||"1"!=p&&"n"!=p||(o[f]=p),p=g}for(var m=0;m<i;++m){var v=o[m];if(","==v)o[m]="N";else if("%"==v){for(var y=void 0,y=m+1;y<i&&"%"==o[y];++y);for(var b=m&&"!"==o[m-1]||y<i&&"1"==o[y]?"1":"N",w=m;w<y;++w)o[w]=b;m=y-1}}for(var x=0,C=n;x<i;++x){var S=o[x];"L"==C&&"1"==S?o[x]="L":fe.test(S)&&(C=S)}for(var L=0;L<i;++L)if(de.test(o[L])){for(var k=void 0,k=L+1;k<i&&de.test(o[k]);++k);for(var T="L"==(L?o[L-1]:n),M=T==("L"==(k<i?o[k]:n))?T?"L":"R":n,N=L;N<k;++N)o[N]=M;L=k-1}for(var A,O=[],D=0;D<i;)if(pe.test(o[D])){var W=D;for(++D;D<i&&pe.test(o[D]);++D);O.push(new ve(0,W,D))}else{var H=D,F=O.length,P="rtl"==t?1:0;for(++D;D<i&&"L"!=o[D];++D);for(var E=H;E<D;)if(ge.test(o[E])){H<E&&(O.splice(F,0,new ve(1,H,E)),F+=P);var I=E;for(++E;E<D&&ge.test(o[E]);++E);O.splice(F,0,new ve(2,I,E)),F+=P,H=E}else++E;H<D&&O.splice(F,0,new ve(1,H,D))}return"ltr"==t&&(1==O[0].level&&(A=e.match(/^\s+/))&&(O[0].from=A[0].length,O.unshift(new ve(0,0,A[0].length))),1==$(O).level&&(A=e.match(/\s+$/))&&($(O).to-=A[0].length,O.push(new ve(0,i-A[0].length,i)))),"rtl"==t?O.reverse():O});function ve(e,t,n){this.level=e,this.from=t,this.to=n}function ye(e,t){var n=e.order;return null==n&&(n=e.order=me(e.text,t)),n}var be=[],we=function(e,t,n){var r;e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent?e.attachEvent("on"+t,n):(r=e._handlers||(e._handlers={}))[t]=(r[t]||be).concat(n)};function xe(e,t){return e._handlers&&e._handlers[t]||be}function Ce(e,t,n){var r,i,o;e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent?e.detachEvent("on"+t,n):!(i=(r=e._handlers)&&r[t])||-1<(o=B(i,n))&&(r[t]=i.slice(0,o).concat(i.slice(o+1)))}function Se(e,t){var n=xe(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i<n.length;++i)n[i].apply(null,r)}function Le(e,t,n){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),Se(e,n||t.type,e,t),Oe(t)||t.codemirrorIgnore}function ke(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var n=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),r=0;r<t.length;++r)-1==B(n,t[r])&&n.push(t[r])}function Te(e,t){return 0<xe(e,t).length}function Me(e){e.prototype.on=function(e,t){we(this,e,t)},e.prototype.off=function(e,t){Ce(this,e,t)}}function Ne(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Ae(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Oe(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function De(e){Ne(e),Ae(e)}function We(e){return e.target||e.srcElement}function He(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Fe,Pe,Ee=function(){if(x&&C<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();var Ie,Re=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(n.push(o.slice(0,l)),t+=l+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},ze=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Be="oncopy"in(Ie=O("div"))||(Ie.setAttribute("oncopy","return;"),"function"==typeof Ie.oncopy),Ge=null;var Ue={},Ve={};function Ke(e){if("string"==typeof e&&Ve.hasOwnProperty(e))e=Ve[e];else if(e&&"string"==typeof e.name&&Ve.hasOwnProperty(e.name)){var t=Ve[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ke("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ke("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function je(e,t){t=Ke(t);var n=Ue[t.name];if(!n)return je(e,"text/plain");var r=n(e,t);if(Xe.hasOwnProperty(t.name)){var i=Xe[t.name];for(var o in i)i.hasOwnProperty(o)&&(r.hasOwnProperty(o)&&(r["_"+o]=r[o]),r[o]=i[o])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var Xe={};function Ye(e,t){I(t,Xe.hasOwnProperty(e)?Xe[e]:Xe[e]={})}function _e(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function $e(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function qe(e,t,n){return!e.startState||e.startState(t,n)}var Ze=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};function Qe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t<o){n=i;break}t-=o}return n.lines[t]}function Je(e,n,r){var i=[],o=n.line;return e.iter(n.line,r.line+1,function(e){var t=e.text;o==r.line&&(t=t.slice(0,r.ch)),o==n.line&&(t=t.slice(n.ch)),i.push(t),++o}),i}function et(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function tt(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function nt(e){if(null==e.parent)return null;for(var t=e.parent,n=B(t.lines,e),r=t.parent;r;r=(t=r).parent)for(var i=0;r.children[i]!=t;++i)n+=r.children[i].chunkSize();return n+t.first}function rt(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],o=i.height;if(t<o){e=i;continue e}t-=o,n+=i.chunkSize()}return n}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return n+l}function it(e,t){return t>=e.first&&t<e.first+e.size}function ot(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function lt(e,t,n){if(void 0===n&&(n=null),!(this instanceof lt))return new lt(e,t,n);this.line=e,this.ch=t,this.sticky=n}function st(e,t){return e.line-t.line||e.ch-t.ch}function at(e,t){return e.sticky==t.sticky&&0==st(e,t)}function ut(e){return lt(e.line,e.ch)}function ct(e,t){return st(e,t)<0?t:e}function ht(e,t){return st(e,t)<0?e:t}function dt(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function ft(e,t){if(t.line<e.first)return lt(e.first,0);var n,r,i,o=e.first+e.size-1;return t.line>o?lt(o,Qe(e,o).text.length):(r=Qe(e,(n=t).line).text.length,null==(i=n.ch)||r<i?lt(n.line,r):i<0?lt(n.line,0):n)}function pt(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=ft(e,t[r]);return n}Ze.prototype.eol=function(){return this.pos>=this.string.length},Ze.prototype.sol=function(){return this.pos==this.lineStart},Ze.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Ze.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Ze.prototype.eat=function(e){var t=this.string.charAt(this.pos),n="string"==typeof e?t==e:t&&(e.test?e.test(t):e(t));if(n)return++this.pos,t},Ze.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Ze.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Ze.prototype.skipToEnd=function(){this.pos=this.string.length},Ze.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(-1<t)return this.pos=t,!0},Ze.prototype.backUp=function(e){this.pos-=e},Ze.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=R(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.indentation=function(){return R(this.string,null,this.tabSize)-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.match=function(e,t,n){if("string"!=typeof e){var r=this.string.slice(this.pos).match(e);return r&&0<r.index?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}function i(e){return n?e.toLowerCase():e}if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Ze.prototype.current=function(){return this.string.slice(this.start,this.pos)},Ze.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Ze.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Ze.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var gt=function(e,t){this.state=e,this.lookAhead=t},mt=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};function vt(t,n,r,e){var a=[t.state.modeGen],i={};Tt(t,n.text,t.doc.mode,r,function(e,t){return a.push(e,t)},i,e);for(var u=r.state,o=0;o<t.state.overlays.length;++o)!function(e){r.baseTokens=a;var o=t.state.overlays[e],l=1,s=0;r.state=!0,Tt(t,n.text,o.mode,r,function(e,t){for(var n=l;s<e;){var r=a[l];e<r&&a.splice(l,1,e,a[l+1],r),l+=2,s=Math.min(e,r)}if(t)if(o.opaque)a.splice(n,l-n,e,"overlay "+t),l=n+2;else for(;n<l;n+=2){var i=a[n+1];a[n+1]=(i?i+" ":"")+"overlay "+t}},i),r.state=u,r.baseTokens=null,r.baseTokenPos=1}(o);return{styles:a,classes:i.bgClass||i.textClass?i:null}}function yt(e,t,n){var r,i,o;return t.styles&&t.styles[0]==e.state.modeGen||(r=bt(e,nt(t)),i=t.text.length>e.options.maxHighlightLength&&_e(e.doc.mode,r.state),o=vt(e,t,r),i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))),t.styles}function bt(n,r,e){var t=n.doc,i=n.display;if(!t.mode.startState)return new mt(t,!0,r);var o=function(e,t,n){for(var r,i,o=e.doc,l=n?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;l<s;--s){if(s<=o.first)return o.first;var a=Qe(o,s-1),u=a.stateAfter;if(u&&(!n||s+(u instanceof gt?u.lookAhead:0)<=o.modeFrontier))return s;var c=R(a.text,null,e.options.tabSize);(null==i||c<r)&&(i=s-1,r=c)}return i}(n,r,e),l=o>t.first&&Qe(t,o-1).stateAfter,s=l?mt.fromSaved(t,l,o):new mt(t,qe(t.mode),o);return t.iter(o,r,function(e){wt(n,e.text,s);var t=s.line;e.stateAfter=t==r-1||t%5==0||t>=i.viewFrom&&t<i.viewTo?s.save():null,s.nextLine()}),e&&(t.modeFrontier=s.line),s}function wt(e,t,n,r){var i=e.doc.mode,o=new Ze(t,e.options.tabSize,n);for(o.start=o.pos=r||0,""==t&&xt(i,n.state);!o.eol();)Ct(i,o,n.state),o.start=o.pos}function xt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var n=$e(e,t);return n.mode.blankLine?n.mode.blankLine(n.state):void 0}}function Ct(e,t,n,r){for(var i=0;i<10;i++){r&&(r[0]=$e(e,n).mode);var o=e.token(t,n);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}mt.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},mt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},mt.prototype.nextLine=function(){this.line++,0<this.maxLookAhead&&this.maxLookAhead--},mt.fromSaved=function(e,t,n){return t instanceof gt?new mt(e,_e(e.mode,t.state),n,t.lookAhead):new mt(e,_e(e.mode,t),n)},mt.prototype.save=function(e){var t=!1!==e?_e(this.doc.mode,this.state):this.state;return 0<this.maxLookAhead?new gt(t,this.maxLookAhead):t};var St=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function Lt(e,t,n,r){var i,o,l=e.doc,s=l.mode,a=Qe(l,(t=ft(l,t)).line),u=bt(e,t.line,n),c=new Ze(a.text,e.options.tabSize,u);for(r&&(o=[]);(r||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Ct(s,c,u.state),r&&o.push(new St(c,i,_e(l.mode,u.state)));return r?o:new St(c,i,u.state)}function kt(e,t){if(e)for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";null==t[r]?t[r]=n[2]:new RegExp("(?:^|\\s)"+n[2]+"(?:$|\\s)").test(t[r])||(t[r]+=" "+n[2])}return e}function Tt(e,t,n,r,i,o,l){var s=n.flattenSpans;null==s&&(s=e.options.flattenSpans);var a=0,u=null,c=new Ze(t,e.options.tabSize,r),h=e.options.addModeClass&&[null];for(""==t&&kt(xt(n,r.state),o);!c.eol();){var d,f=c.pos>e.options.maxHighlightLength?(s=!1,l&&wt(e,t,r,c.pos),c.pos=t.length,null):kt(Ct(n,c,r.state,h),o);if(!h||(d=h[0].name)&&(f="m-"+(f?d+" "+f:d)),!s||u!=f){for(;a<c.start;)i(a=Math.min(c.start,a+5e3),u);u=f}c.start=c.pos}for(;a<c.pos;){var p=Math.min(c.pos,a+5e3);i(p,u),a=p}}var Mt=!1,Nt=!1;function At(e,t,n){this.marker=e,this.from=t,this.to=n}function Ot(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function Dt(e,t){if(t.full)return null;var n=it(e,t.from.line)&&Qe(e,t.from.line).markedSpans,r=it(e,t.to.line)&&Qe(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,o=t.to.ch,l=0==st(t.from,t.to),s=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t))&&(l.from!=t||"bookmark"!=s.type||n&&l.marker.insertLeft)||(o=null==l.to||(s.inclusiveRight?l.to>=t:l.to>t),(r=r||[]).push(new At(s,l.from,o?null:l.to)))}return r}(n,i,l),a=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.to||(s.inclusiveRight?l.to>=t:l.to>t))&&(l.from!=t||"bookmark"!=s.type||n&&!l.marker.insertLeft)||(o=null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t),(r=r||[]).push(new At(s,o?null:l.from-t,null==l.to?null:l.to-t)))}return r}(r,o,l),u=1==t.text.length,c=$(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var d,f=s[h];null==f.to&&((d=Ot(a,f.marker))?u&&(f.to=null==d.to?null:d.to+c):f.to=i)}if(a)for(var p=0;p<a.length;++p){var g=a[p];null!=g.to&&(g.to+=c),null==g.from?Ot(s,g.marker)||(g.from=c,u&&(s=s||[]).push(g)):(g.from+=c,u&&(s=s||[]).push(g))}s=s&&Wt(s),a&&a!=s&&(a=Wt(a));var m=[s];if(!u){var v,y=t.text.length-2;if(0<y&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(v=v||[]).push(new At(s[b].marker,null,null));for(var w=0;w<y;++w)m.push(v);m.push(a)}return m}function Wt(e){for(var t=0;t<e.length;++t){var n=e[t];null!=n.from&&n.from==n.to&&!1!==n.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function Ht(e){var t=e.markedSpans;if(t){for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}}function Ft(e,t){if(t){for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}}function Pt(e){return e.inclusiveLeft?-1:0}function Et(e){return e.inclusiveRight?1:0}function It(e,t){var n=e.lines.length-t.lines.length;if(0!=n)return n;var r=e.find(),i=t.find(),o=st(r.from,i.from)||Pt(e)-Pt(t);if(o)return-o;var l=st(r.to,i.to)||Et(e)-Et(t);return l||t.id-e.id}function Rt(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=void 0,o=0;o<r.length;++o)(i=r[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!n||It(n,i.marker)<0)&&(n=i.marker);return n}function zt(e){return Rt(e,!0)}function Bt(e){return Rt(e,!1)}function Gt(e,t,n,r,i){var o=Qe(e,t),l=Nt&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=st(u.from,n)||Pt(a.marker)-Pt(i),h=st(u.to,r)||Et(a.marker)-Et(i);if(!(0<=c&&h<=0||c<=0&&0<=h)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?0<=st(u.to,n):0<st(u.to,n))||0<=c&&(a.marker.inclusiveRight&&i.inclusiveLeft?st(u.from,r)<=0:st(u.from,r)<0)))return 1}}}function Ut(e){for(var t;t=zt(e);)e=t.find(-1,!0).line;return e}function Vt(e,t){var n=Qe(e,t),r=Ut(n);return n==r?t:nt(r)}function Kt(e,t){if(t>e.lastLine())return t;var n,r=Qe(e,t);if(!jt(e,r))return t;for(;n=Bt(r);)r=n.find(1,!0).line;return nt(r)+1}function jt(e,t){var n=Nt&&t.markedSpans;if(n)for(var r=void 0,i=0;i<n.length;++i)if((r=n[i]).marker.collapsed){if(null==r.from)return!0;if(!r.marker.widgetNode&&0==r.from&&r.marker.inclusiveLeft&&function e(t,n,r){if(null==r.to){var i=r.marker.find(1,!0);return e(t,i.line,Ot(i.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==n.text.length)return!0;for(var o=void 0,l=0;l<n.markedSpans.length;++l)if((o=n.markedSpans[l]).marker.collapsed&&!o.marker.widgetNode&&o.from==r.to&&(null==o.to||o.to!=r.from)&&(o.marker.inclusiveLeft||r.marker.inclusiveRight)&&e(t,n,o))return!0}(e,t,r))return!0}}function Xt(e){for(var t=0,n=(e=Ut(e)).parent,r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var o=n.parent;o;o=(n=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==n)break;t+=s.height}return t}function Yt(e){if(0==e.height)return 0;for(var t,n=e.text.length,r=e;t=zt(r);){var i=t.find(0,!0),r=i.from.line;n+=i.from.ch-i.to.ch}for(r=e;t=Bt(r);){var o=t.find(0,!0);n-=r.text.length-o.from.ch,n+=(r=o.to.line).text.length-o.to.ch}return n}function _t(e){var n=e.display,t=e.doc;n.maxLine=Qe(t,t.first),n.maxLineLength=Yt(n.maxLine),n.maxLineChanged=!0,t.iter(function(e){var t=Yt(e);t>n.maxLineLength&&(n.maxLineLength=t,n.maxLine=e)})}var $t=function(e,t,n){this.text=e,Ft(this,t),this.height=n?n(this):1};$t.prototype.lineNo=function(){return nt(this)},Me($t);var qt={},Zt={};function Qt(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?Zt:qt;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function Jt(e,t){var n=A("span",null,null,v?"padding-right: .1px":null),r={pre:A("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i,o=0;o<=(t.rest?t.rest.length:0);o++){var l=o?t.rest[o-1]:t.line,s=void 0;r.pos=0,r.addToken=tn,function(e){if(null!=Pe)return Pe;var t=N(e,document.createTextNode("AخA")),n=k(t,0,1).getBoundingClientRect(),r=k(t,1,2).getBoundingClientRect();return M(e),n&&n.left!=n.right&&(Pe=r.right-n.right<3)}(e.display.measure)&&(s=ye(l,e.doc.direction))&&(r.addToken=function(h,d){return function(e,t,n,r,i,o,l){n=n?n+" cm-force-border":"cm-force-border";for(var s=e.pos,a=s+t.length;;){for(var u=void 0,c=0;c<d.length&&!((u=d[c]).to>s&&u.from<=s);c++);if(u.to>=a)return h(e,t,n,r,i,o,l);h(e,t.slice(0,u.to-s),n,r,null,o,l),r=null,t=t.slice(u.to-s),s=u.to}}}(r.addToken,s)),r.map=[],function(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(!r){for(var l=1;l<n.length;l+=2)t.addToken(t,i.slice(o,o=n[l]),Qt(n[l+1],t.cm.options));return}for(var s,a,u,c,h,d,f,p=i.length,g=0,m=1,v="",y=0;;){if(y==g){u=c=h=a="",d=f=null,y=1/0;for(var b=[],w=void 0,x=0;x<r.length;++x){var C=r[x],S=C.marker;if("bookmark"==S.type&&C.from==g&&S.widgetNode)b.push(S);else if(C.from<=g&&(null==C.to||C.to>g||S.collapsed&&C.to==g&&C.from==g)){if(null!=C.to&&C.to!=g&&y>C.to&&(y=C.to,c=""),S.className&&(u+=" "+S.className),S.css&&(a=(a?a+";":"")+S.css),S.startStyle&&C.from==g&&(h+=" "+S.startStyle),S.endStyle&&C.to==y&&(w=w||[]).push(S.endStyle,C.to),S.title&&((f=f||{}).title=S.title),S.attributes)for(var L in S.attributes)(f=f||{})[L]=S.attributes[L];S.collapsed&&(!d||It(d.marker,S)<0)&&(d=C)}else C.from>g&&y>C.from&&(y=C.from)}if(w)for(var k=0;k<w.length;k+=2)w[k+1]==y&&(c+=" "+w[k]);if(!d||d.from==g)for(var T=0;T<b.length;++T)nn(t,0,b[T]);if(d&&(d.from||0)==g){if(nn(t,(null==d.to?p+1:d.to)-g,d.marker,null==d.from),null==d.to)return;d.to==g&&(d=!1)}}if(p<=g)break;for(var M=Math.min(p,y);;){if(v){var N,A=g+v.length;if(d||(N=M<A?v.slice(0,M-g):v,t.addToken(t,N,s?s+u:u,h,g+N.length==y?c:"",a,f)),M<=A){v=v.slice(M-g),g=M;break}g=A,h=""}v=i.slice(o,o=n[m++]),s=Qt(n[m++],t.cm.options)}}}(l,r,yt(e,l,t!=e.display.externalMeasured&&nt(l))),l.styleClasses&&(l.styleClasses.bgClass&&(r.bgClass=F(l.styleClasses.bgClass,r.bgClass||"")),l.styleClasses.textClass&&(r.textClass=F(l.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(function(e){var t;null==Fe&&(t=O("span","​"),N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Fe=t.offsetWidth<=1&&2<t.offsetHeight&&!(x&&C<8)));var n=Fe?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}(e.display.measure))),0==o?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return v&&(i=r.content.lastChild,(/\bcm-tab\b/.test(i.className)||i.querySelector&&i.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")),Se(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=F(r.pre.className,r.textClass||"")),r}function en(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function tn(e,t,n,r,i,o,l){if(t){var s,a=e.splitSpaces?function(e,t){if(1<e.length&&!/ /.test(e))return e;for(var n=t,r="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!n||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),r+=o,n=" "==o}return r}(t,e.trailingSpace):t,u=e.cm.state.specialChars,c=!1;if(u.test(t)){s=document.createDocumentFragment();for(var h=0;;){u.lastIndex=h;var d,f=u.exec(t),p=f?f.index-h:t.length-h;if(p&&(d=document.createTextNode(a.slice(h,h+p)),x&&C<9?s.appendChild(O("span",[d])):s.appendChild(d),e.map.push(e.pos,e.pos+p,d),e.col+=p,e.pos+=p),!f)break;h+=1+p;var g,m,v=void 0;"\t"==f[0]?(m=(g=e.cm.options.tabSize)-e.col%g,(v=s.appendChild(O("span",_(m),"cm-tab"))).setAttribute("role","presentation"),v.setAttribute("cm-text","\t"),e.col+=m):("\r"==f[0]||"\n"==f[0]?(v=s.appendChild(O("span","\r"==f[0]?"␍":"␤","cm-invalidchar"))).setAttribute("cm-text",f[0]):((v=e.cm.options.specialCharPlaceholder(f[0])).setAttribute("cm-text",f[0]),x&&C<9?s.appendChild(O("span",[v])):s.appendChild(v)),e.col+=1),e.map.push(e.pos,e.pos+1,v),e.pos++}}else e.col+=t.length,s=document.createTextNode(a),e.map.push(e.pos,e.pos+t.length,s),x&&C<9&&(c=!0),e.pos+=t.length;if(e.trailingSpace=32==a.charCodeAt(t.length-1),n||r||i||c||o||l){var y=n||"";r&&(y+=r),i&&(y+=i);var b=O("span",[s],y,o);if(l)for(var w in l)l.hasOwnProperty(w)&&"style"!=w&&"class"!=w&&b.setAttribute(w,l[w]);return e.content.appendChild(b)}e.content.appendChild(s)}}function nn(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i=i||e.content.appendChild(document.createElement("span"))).setAttribute("cm-marker",n.id),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rn(e,t,n){this.line=t,this.rest=function(e){for(var t,n;t=Bt(e);)e=t.find(1,!0).line,(n=n||[]).push(e);return n}(t),this.size=this.rest?nt($(this.rest))-n+1:1,this.node=this.text=null,this.hidden=jt(e,t)}function on(e,t,n){for(var r=[],i=t;i<n;i=l){var o=new rn(e.doc,Qe(e.doc,i),i),l=i+o.size;r.push(o)}return r}var ln=null;function sn(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n<t.length;n++)t[n].call(null);for(var r=0;r<e.ops.length;r++){var i=e.ops[r];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(n<t.length)}(n)}finally{ln=null,t(n)}}var an=null;function un(e,t){var n=xe(e,t);if(n.length){var r,i=Array.prototype.slice.call(arguments,2);ln?r=ln.delayedCallbacks:an?r=an:(r=an=[],setTimeout(cn,0));for(var o=0;o<n.length;++o)!function(e){r.push(function(){return n[e].apply(null,i)})}(o)}}function cn(){var e=an;an=null;for(var t=0;t<e.length;++t)e[t]()}function hn(e,t,n,r){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?function(e,t){var n=t.text.className,r=fn(e,t);t.text==t.node&&(t.node=r.pre);t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,pn(e,t)):n&&(t.text.className=n)}(e,t):"gutter"==o?gn(e,t,n,r):"class"==o?pn(e,t):"widget"==o&&function(e,t,n){t.alignable&&(t.alignable=null);for(var r=L("CodeMirror-linewidget"),i=t.node.firstChild,o=void 0;i;i=o)o=i.nextSibling,r.test(i.className)&&t.node.removeChild(i);mn(e,t,n)}(e,t,r)}t.changes=null}function dn(e){return e.node==e.text&&(e.node=O("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),x&&C<8&&(e.node.style.zIndex=2)),e.node}function fn(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):Jt(e,t)}function pn(e,t){var n,r,i,o;n=e,(o=(r=t).bgClass?r.bgClass+" "+(r.line.bgClass||""):r.line.bgClass)&&(o+=" CodeMirror-linebackground"),r.background?o?r.background.className=o:(r.background.parentNode.removeChild(r.background),r.background=null):o&&(i=dn(r),r.background=i.insertBefore(O("div",null,o),i.firstChild),n.display.input.setUneditable(r.background)),t.line.wrapClass?dn(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var l=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=l||""}function gn(e,t,n,r){var i;t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass&&(i=dn(t),t.gutterBackground=O("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px; width: "+r.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text));var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=dn(t),s=t.gutter=O("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=" "+t.line.gutterClass),!e.options.lineNumbers||o&&o["CodeMirror-linenumbers"]||(t.lineNumber=s.appendChild(O("div",ot(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),o)for(var a=0;a<e.display.gutterSpecs.length;++a){var u=e.display.gutterSpecs[a].className,c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O("div",[c],"CodeMirror-gutter-elt","left: "+r.gutterLeft[u]+"px; width: "+r.gutterWidth[u]+"px"))}}}function mn(e,t,n){if(vn(e,t.line,t,n,!0),t.rest)for(var r=0;r<t.rest.length;r++)vn(e,t.rest[r],t,n,!1)}function vn(e,t,n,r,i){if(t.widgets)for(var o=dn(n),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O("div",[a.node],"CodeMirror-linewidget"+(a.className?" "+a.className:""));a.handleMouseEvents||u.setAttribute("cm-ignore-events","true"),function(e,t,n,r){{var i;e.noHScroll&&((n.alignable||(n.alignable=[])).push(t),i=r.wrapperWidth,t.style.left=r.fixedPos+"px",e.coverGutter||(i-=r.gutterTotalWidth,t.style.paddingLeft=r.gutterTotalWidth+"px"),t.style.width=i+"px")}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-r.gutterTotalWidth+"px"))}(a,u,n,r),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,n.gutter||n.text):o.appendChild(u),un(a,"redraw")}}function yn(e){if(null!=e.height)return e.height;var t,n=e.doc.cm;return n?(D(document.body,e.node)||(t="position: relative;",e.coverGutter&&(t+="margin-left: -"+n.display.gutters.offsetWidth+"px;"),e.noHScroll&&(t+="width: "+n.display.wrapper.clientWidth+"px;"),N(n.display.measure,O("div",[e.node],null,t))),e.height=e.node.parentNode.offsetHeight):0}function bn(e,t){for(var n=We(t);n!=e.wrapper;n=n.parentNode)if(!n||1==n.nodeType&&"true"==n.getAttribute("cm-ignore-events")||n.parentNode==e.sizer&&n!=e.mover)return 1}function wn(e){return e.lineSpace.offsetTop}function xn(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Cn(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O("pre","x","CodeMirror-line-like")),n=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,r={left:parseInt(n.paddingLeft),right:parseInt(n.paddingRight)};return isNaN(r.left)||isNaN(r.right)||(e.cachedPaddingH=r),r}function Sn(e){return G-e.display.nativeBarWidth}function Ln(e){return e.display.scroller.clientWidth-Sn(e)-e.display.barWidth}function kn(e){return e.display.scroller.clientHeight-Sn(e)-e.display.barHeight}function Tn(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var i=0;i<e.rest.length;i++)if(nt(e.rest[i])>n)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Mn(e,t,n,r){return On(e,An(e,t),n,r)}function Nn(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[rr(e,t)];var n=e.display.externalMeasured;return n&&t>=n.lineN&&t<n.lineN+n.size?n:void 0}function An(e,t){var n=nt(t),r=Nn(e,n);r&&!r.text?r=null:r&&r.changes&&(hn(e,r,n,Qn(e)),e.curOp.forceUpdate=!0);var i=Tn(r=r||function(e,t){var n=nt(t=Ut(t)),r=e.display.externalMeasured=new rn(e.doc,t,n);r.lineN=n;var i=r.built=Jt(e,r);return r.text=i.pre,N(e.display.lineMeasure,i.pre),r}(e,t),t,n);return{line:t,view:r,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function On(e,t,n,r,i){t.before&&(n=-1);var o,l=n+(r||"");return t.cache.hasOwnProperty(l)?o=t.cache[l]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(function(e,t,n){var r=e.options.lineWrapping,i=r&&Ln(e);if(!t.measure.heights||r&&t.measure.width!=i){var o=t.measure.heights=[];if(r){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];2<Math.abs(a.bottom-u.bottom)&&o.push((a.bottom+u.top)/2-n.top)}}o.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,n,r){var i,o,l=Hn(t.map,n,r),s=l.node,a=l.start,u=l.end,c=l.collapse;if(3==s.nodeType){for(var h=0;h<4;h++){for(;a&&ie(t.line.text.charAt(l.coverStart+a));)--a;for(;l.coverStart+u<l.coverEnd&&ie(t.line.text.charAt(l.coverStart+u));)++u;if((i=x&&C<9&&0==a&&u==l.coverEnd-l.coverStart?s.parentNode.getBoundingClientRect():function(e,t){var n=Wn;if("left"==t)for(var r=0;r<e.length&&(n=e[r]).left==n.right;r++);else for(var i=e.length-1;0<=i&&(n=e[i]).left==n.right;i--);return n}(k(s,a,u).getClientRects(),r)).left||i.right||0==a)break;u=a,--a,c="right"}x&&C<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ge)return Ge;var t=N(e,O("span","x")),n=t.getBoundingClientRect(),r=k(t,0,1).getBoundingClientRect();return Ge=1<Math.abs(n.left-r.left)}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,r=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*r,bottom:t.bottom*r}}(e.display.measure,i))}else 0<a&&(c=r="right"),i=e.options.lineWrapping&&1<(o=s.getClientRects()).length?o["right"==r?o.length-1:0]:s.getBoundingClientRect();{var d;!(x&&C<9)||a||i&&(i.left||i.right)||(d=s.parentNode.getClientRects()[0],i=d?{left:d.left,right:d.left+Zn(e.display),top:d.top,bottom:d.bottom}:Wn)}for(var f=i.top-t.rect.top,p=i.bottom-t.rect.top,g=(f+p)/2,m=t.view.measure.heights,v=0;v<m.length-1&&!(g<m[v]);v++);var y=v?m[v-1]:0,b=m[v],w={left:("right"==c?i.right:i.left)-t.rect.left,right:("left"==c?i.left:i.right)-t.rect.left,top:y,bottom:b};i.left||i.right||(w.bogus=!0);e.options.singleCursorHeightPerLine||(w.rtop=f,w.rbottom=p);return w}(e,t,n,r)).bogus||(t.cache[l]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Dn,Wn={left:0,right:0,top:0,bottom:0};function Hn(e,t,n){for(var r,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,a<=t&&(l="right")),null!=i){if(r=e[u+2],s==a&&n==(r.insertLeft?"left":"right")&&(l=n),"left"==n&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)r=e[2+(u-=3)],l="left";if("right"==n&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)r=e[(u+=3)+2],l="right";break}return{node:r,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Fn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function Pn(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fn(e.display.view[t])}function En(e){Pn(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function In(){return l&&h?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Rn(){return l&&h?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function zn(e){var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;++n)e.widgets[n].above&&(t+=yn(e.widgets[n]));return t}function Bn(e,t,n,r,i){var o;if(i||(o=zn(t),n.top+=o,n.bottom+=o),"line"==r)return n;r=r||"local";var l,s,a=Xt(t);return"local"==r?a+=wn(e.display):a-=e.display.viewOffset,"page"!=r&&"window"!=r||(a+=(l=e.display.lineSpace.getBoundingClientRect()).top+("window"==r?0:Rn()),s=l.left+("window"==r?0:In()),n.left+=s,n.right+=s),n.top+=a,n.bottom+=a,n}function Gn(e,t,n){if("div"==n)return t;var r,i=t.left,o=t.top;"page"==n?(i-=In(),o-=Rn()):"local"!=n&&n||(i+=(r=e.display.sizer.getBoundingClientRect()).left,o+=r.top);var l=e.display.lineSpace.getBoundingClientRect();return{left:i-l.left,top:o-l.top}}function Un(e,t,n,r,i){return Bn(e,r=r||Qe(e.doc,t.line),Mn(e,r,t.ch,i),n)}function Vn(r,e,i,o,l,s){function a(e,t){var n=On(r,l,e,t?"right":"left",s);return t?n.left=n.right:n.right=n.left,Bn(r,o,n,i)}o=o||Qe(r.doc,e.line),l=l||An(r,o);var u=ye(o,r.doc.direction),t=e.ch,n=e.sticky;if(t>=o.text.length?(t=o.text.length,n="before"):t<=0&&(t=0,n="after"),!u)return a("before"==n?t-1:t,"before"==n);function c(e,t,n){return a(n?e-1:e,1==u[t].level!=n)}var h=ae(u,t,n),d=se,f=c(t,h,"before"==n);return null!=d&&(f.other=c(t,d,"before"!=n)),f}function Kn(e,t){var n=0;t=ft(e.doc,t),e.options.lineWrapping||(n=Zn(e.display)*t.ch);var r=Qe(e.doc,t.line),i=Xt(r)+wn(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function jn(e,t,n,r,i){var o=lt(e,t,n);return o.xRel=i,r&&(o.outside=r),o}function Xn(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return jn(r.first,0,null,-1,-1);var i=rt(r,n),o=r.first+r.size-1;if(o<i)return jn(r.first+r.size-1,Qe(r,o).text.length,null,1,1);t<0&&(t=0);for(var l=Qe(r,i);;){var s=function(n,e,t,r,i){i-=Xt(e);var o=An(n,e),l=zn(e),s=0,a=e.text.length,u=!0,c=ye(e,n.doc.direction);{var h;c&&(h=(n.options.lineWrapping?function(e,t,n,r,i,o,l){var s=Yn(e,t,r,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,d=0;d<i.length;d++){var f,p,g,m=i[d];m.from>=u||m.to<=a||(f=1!=m.level,p=On(e,r,f?Math.min(u,m.to)-1:Math.max(a,m.from)).right,g=p<o?o-p+1e9:p-o,(!c||g<h)&&(c=m,h=g))}c=c||i[i.length-1];c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(r,i,o,l,s,a,u){var e=le(function(e){var t=s[e],n=1!=t.level;return $n(Vn(r,lt(o,n?t.to:t.from,n?"before":"after"),"line",i,l),a,u,!0)},0,s.length-1),t=s[e];{var n,c;0<e&&(n=1!=t.level,$n(c=Vn(r,lt(o,n?t.from:t.to,n?"after":"before"),"line",i,l),a,u,!0)&&c.top>u&&(t=s[e-1]))}return t})(n,e,t,o,c,r,i),u=1!=h.level,s=u?h.from:h.to-1,a=u?h.to:h.from-1)}var d,f,p=null,g=null,m=le(function(e){var t=On(n,o,e);return t.top+=l,t.bottom+=l,$n(t,r,i,!1)&&(t.top<=i&&t.left<=r&&(p=e,g=t),1)},s,a),v=!1;{var y,b,w;g?(y=r-g.left<g.right-r,m=p+((b=y==u)?0:1),f=b?"after":"before",d=y?g.left:g.right):(u||m!=a&&m!=s||m++,f=0==m||m!=e.text.length&&On(n,o,m-(u?1:0)).bottom+l<=i==u?"after":"before",w=Vn(n,lt(t,m,f),"line",e,o),d=w.left,v=i<w.top?-1:i>=w.bottom?1:0)}return m=oe(e.text,m,1),jn(t,m,f,v,r-d)}(e,l,i,t,n),a=function(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=0;i<r.length;++i){var o=r[i];o.marker.collapsed&&(null==o.from||o.from<t)&&(null==o.to||o.to>t)&&(!n||It(n,o.marker)<0)&&(n=o.marker)}return n}(l,s.ch+(0<s.xRel||0<s.outside?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Qe(r,i=u.line)}}function Yn(t,e,n,r){r-=zn(e);var i=e.text.length,o=le(function(e){return On(t,n,e-1).bottom<=r},i,0);return{begin:o,end:i=le(function(e){return On(t,n,e).top>r},o,i)}}function _n(e,t,n,r){return Yn(e,t,n=n||An(e,t),Bn(e,t,On(e,n,r),"line").top)}function $n(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function qn(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Dn){Dn=O("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Dn.appendChild(document.createTextNode("x")),Dn.appendChild(O("br"));Dn.appendChild(document.createTextNode("x"))}N(e.measure,Dn);var n=Dn.offsetHeight/50;return 3<n&&(e.cachedTextHeight=n),M(e.measure),n||1}function Zn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),n=O("pre",[t],"CodeMirror-line-like");N(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return 2<i&&(e.cachedCharWidth=i),i||10}function Qn(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;n[s]=o.offsetLeft+o.clientLeft+i,r[s]=o.clientWidth}return{fixedPos:Jn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function Jn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function er(r){var i=qn(r.display),o=r.options.lineWrapping,l=o&&Math.max(5,r.display.scroller.clientWidth/Zn(r.display)-3);return function(e){if(jt(r.doc,e))return 0;var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;n++)e.widgets[n].height&&(t+=e.widgets[n].height);return o?t+(Math.ceil(e.text.length/l)||1)*i:t+i}}function tr(e){var t=e.doc,n=er(e);t.iter(function(e){var t=n(e);t!=e.height&&tt(e,t)})}function nr(e,t,n,r){var i=e.display;if(!n&&"true"==We(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(e){return null}var a,u,c=Xn(e,o,l);return r&&0<c.xRel&&(a=Qe(e.doc,c.line).text).length==c.ch&&(u=R(a,a.length,e.options.tabSize)-a.length,c=lt(c.line,Math.max(0,Math.round((o-Cn(e.display).left)/Zn(e.display))-u))),c}function rr(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;r<n.length;r++)if((t-=n[r].size)<0)return r}function ir(e,t,n,r){null==t&&(t=e.doc.first),null==n&&(n=e.doc.first+e.doc.size),r=r||0;var i,o,l,s,a=e.display;r&&n<a.viewTo&&(null==a.updateLineNumbers||a.updateLineNumbers>t)&&(a.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=a.viewTo?Nt&&Vt(e.doc,t)<a.viewTo&&lr(e):n<=a.viewFrom?Nt&&Kt(e.doc,n+r)>a.viewFrom?lr(e):(a.viewFrom+=r,a.viewTo+=r):t<=a.viewFrom&&n>=a.viewTo?lr(e):t<=a.viewFrom?(i=sr(e,n,n+r,1))?(a.view=a.view.slice(i.index),a.viewFrom=i.lineN,a.viewTo+=r):lr(e):n>=a.viewTo?(o=sr(e,t,t,-1))?(a.view=a.view.slice(0,o.index),a.viewTo=o.lineN):lr(e):(l=sr(e,t,t,-1),s=sr(e,n,n+r,1),l&&s?(a.view=a.view.slice(0,l.index).concat(on(e,l.lineN,s.lineN)).concat(a.view.slice(s.index)),a.viewTo+=r):lr(e));var u=a.externalMeasured;u&&(n<u.lineN?u.lineN+=r:t<u.lineN+u.size&&(a.externalMeasured=null))}function or(e,t,n){e.curOp.viewChanged=!0;var r,i,o=e.display,l=e.display.externalMeasured;l&&t>=l.lineN&&t<l.lineN+l.size&&(o.externalMeasured=null),t<o.viewFrom||t>=o.viewTo||(null==(r=o.view[rr(e,t)]).node||-1==B(i=r.changes||(r.changes=[]),n)&&i.push(n))}function lr(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function sr(e,t,n,r){var i,o=rr(e,t),l=e.display.view;if(!Nt||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(0<r){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;Vt(e.doc,n)!=n;){if(o==(r<0?0:l.length-1))return null;n+=r*l[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function ar(e){for(var t=e.display.view,n=0,r=0;r<t.length;r++){var i=t[r];i.hidden||i.node&&!i.changes||++n}return n}function ur(e){e.display.input.showSelection(e.display.input.prepareSelection())}function cr(e,t){void 0===t&&(t=!0);for(var n,r,i=e.doc,o={},l=o.cursors=document.createDocumentFragment(),s=o.selection=document.createDocumentFragment(),a=0;a<i.sel.ranges.length;a++){!t&&a==i.sel.primIndex||((n=i.sel.ranges[a]).from().line>=e.display.viewTo||n.to().line<e.display.viewFrom||(((r=n.empty())||e.options.showCursorWhenSelecting)&&hr(e,n.head,l),r||function(l,e,t){var n=l.display,r=l.doc,i=document.createDocumentFragment(),o=Cn(l.display),T=o.left,M=Math.max(n.sizerWidth,Ln(l)-n.sizer.offsetLeft)-o.right,N="ltr"==r.direction;function A(e,t,n,r){t<0&&(t=0),t=Math.round(t),r=Math.round(r),i.appendChild(O("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n top: "+t+"px; width: "+(null==n?M-e:n)+"px;\n height: "+(r-t)+"px"))}function s(n,y,b){var w,x,o=Qe(r,n),C=o.text.length;function S(e,t){return Un(l,lt(n,e),"div",o,t)}function L(e,t,n){var r=_n(l,o,null,e),i="ltr"==t==("after"==n)?"left":"right";return S("after"==n?r.begin:r.end-(/\s/.test(o.text.charAt(r.end-1))?2:1),i)[i]}var k=ye(o,r.direction);return function(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<n&&l.to>t||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),1==l.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(k,y||0,null==b?C:b,function(e,t,n,r){var i,o,l,s,a,u,c,h="ltr"==n,d=S(e,h?"left":"right"),f=S(t-1,h?"right":"left"),p=null==y&&0==e,g=null==b&&t==C,m=0==r,v=!k||r==k.length-1;f.top-d.top<=3?(i=(N?g:p)&&v,o=(N?p:g)&&m?T:(h?d:f).left,l=i?M:(h?f:d).right,A(o,d.top,l-o,d.bottom)):(c=h?(s=N&&p&&m?T:d.left,a=N?M:L(e,n,"before"),u=N?T:L(t,n,"after"),N&&g&&v?M:f.right):(s=N?L(e,n,"before"):T,a=!N&&p&&m?M:d.right,u=!N&&g&&v?T:f.left,N?L(t,n,"after"):M),A(s,d.top,a-s,d.bottom),d.bottom<f.top&&A(T,d.bottom,null,f.top),A(u,f.top,c-u,f.bottom)),(!w||dr(d,w)<0)&&(w=d),dr(f,w)<0&&(w=f),(!x||dr(d,x)<0)&&(x=d),dr(f,x)<0&&(x=f)}),{start:w,end:x}}var a=e.from(),u=e.to();{var c,h,d,f,p;a.line==u.line?s(a.line,a.ch,u.ch):(c=Qe(r,a.line),h=Qe(r,u.line),d=Ut(c)==Ut(h),f=s(a.line,a.ch,d?c.text.length+1:null).end,p=s(u.line,d?0:null,u.ch).start,d&&(f.top<p.top-2?(A(f.right,f.top,null,f.bottom),A(T,p.top,p.left,p.bottom)):A(f.right,f.top,p.left-f.right,f.bottom)),f.bottom<p.top&&A(T,f.bottom,null,p.top))}t.appendChild(i)}(e,n,s)))}return o}function hr(e,t,n){var r,i=Vn(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),o=n.appendChild(O("div"," ","CodeMirror-cursor"));o.style.left=i.left+"px",o.style.top=i.top+"px",o.style.height=Math.max(0,i.bottom-i.top)*e.options.cursorHeight+"px",i.other&&((r=n.appendChild(O("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"))).style.display="",r.style.left=i.other.left+"px",r.style.top=i.other.top+"px",r.style.height=.85*(i.other.bottom-i.other.top)+"px")}function dr(e,t){return e.top-t.top||e.left-t.left}function fr(e){var t,n;e.state.focused&&(t=e.display,clearInterval(t.blinker),n=!0,t.cursorDiv.style.visibility="",0<e.options.cursorBlinkRate?t.blinker=setInterval(function(){e.hasFocus()||vr(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden"))}function pr(e){e.state.focused||(e.display.input.focus(),mr(e))}function gr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,vr(e))},100)}function mr(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(Se(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),v&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),fr(e))}function vr(e,t){e.state.delayingBlurEvent||(e.state.focused&&(Se(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function yr(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r<t.view.length;r++){var i,o,l=t.view[r],s=e.options.lineWrapping,a=void 0,u=0;if(!l.hidden){x&&C<8?(a=(i=l.node.offsetTop+l.node.offsetHeight)-n,n=i):(a=(o=l.node.getBoundingClientRect()).bottom-o.top,!s&&l.text.firstChild&&(u=l.text.firstChild.getBoundingClientRect().right-o.left-1));var c,h=l.line.height-a;if((.005<h||h<-.005)&&(tt(l.line,a),br(l.line),l.rest))for(var d=0;d<l.rest.length;d++)br(l.rest[d]);u>e.display.sizerWidth&&((c=Math.ceil(u/Zn(e.display)))>e.display.maxLineLength&&(e.display.maxLineLength=c,e.display.maxLine=l.line,e.display.maxLineChanged=!0))}}}function br(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var n=e.widgets[t],r=n.node.parentNode;r&&(n.height=r.offsetHeight)}}function wr(e,t,n){var r,i,o=n&&null!=n.top?Math.max(0,n.top):e.scroller.scrollTop,o=Math.floor(o-wn(e)),l=n&&null!=n.bottom?n.bottom:o+e.wrapper.clientHeight,s=rt(t,o),a=rt(t,l);return n&&n.ensure&&(r=n.ensure.from.line,i=n.ensure.to.line,r<s?a=rt(t,Xt(Qe(t,s=r))+e.wrapper.clientHeight):Math.min(i,t.lastLine())>=a&&(s=rt(t,Xt(Qe(t,i))-e.wrapper.clientHeight),a=i)),{from:s,to:Math.max(a,s+1)}}function xr(e,t){var n=e.display,r=qn(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:n.scroller.scrollTop,o=kn(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s,a=e.doc.height+xn(n),u=t.top<r,c=t.bottom>a-r;t.top<i?l.scrollTop=u?0:t.top:t.bottom>i+o&&((s=Math.min(t.top,(c?a:t.bottom)-o))!=i&&(l.scrollTop=s));var h=e.options.fixedGutter?0:n.gutters.offsetWidth,d=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft-h,f=Ln(e)-n.gutters.offsetWidth,p=t.right-t.left>f;return p&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<d?l.scrollLeft=Math.max(0,t.left+h-(p?0:10)):t.right>f+d-3&&(l.scrollLeft=t.right+(p?0:10)-f),l}function Cr(e,t){null!=t&&(kr(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sr(e){kr(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Lr(e,t,n){null==t&&null==n||kr(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function kr(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tr(e,Kn(e,t.from),Kn(e,t.to),t.margin))}function Tr(e,t,n,r){var i=xr(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Lr(e,i.scrollLeft,i.scrollTop)}function Mr(e,t){Math.abs(e.doc.scrollTop-t)<2||(g||$r(e,{top:t}),Nr(e,t,!0),g&&$r(e),Kr(e,100))}function Nr(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),e.display.scroller.scrollTop==t&&!n||(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Ar(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,Qr(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Or(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+xn(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+Sn(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}function Dr(e,t,n){this.cm=n;var r=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),we(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),we(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,x&&C<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}Dr.prototype.update=function(e){var t,n,r=e.scrollWidth>e.clientWidth+1,i=e.scrollHeight>e.clientHeight+1,o=e.nativeBarWidth;return i?(this.vert.style.display="block",this.vert.style.bottom=r?o+"px":"0",t=e.viewHeight-(r?o:0),this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+t)+"px"):(this.vert.style.display="",this.vert.firstChild.style.height="0"),r?(this.horiz.style.display="block",this.horiz.style.right=i?o+"px":"0",this.horiz.style.left=e.barLeft+"px",n=e.viewWidth-e.barLeft-(i?o:0),this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+n)+"px"):(this.horiz.style.display="",this.horiz.firstChild.style.width="0"),!this.checkedZeroWidth&&0<e.clientHeight&&(0==o&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:i?o:0,bottom:r?o:0}},Dr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},Dr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},Dr.prototype.zeroWidthHack=function(){var e=y&&!s?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new z,this.disableVert=new z},Dr.prototype.enableZeroWidthBar=function(n,r,i){n.style.pointerEvents="auto",r.set(1e3,function e(){var t=n.getBoundingClientRect();("vert"==i?document.elementFromPoint(t.right-1,(t.top+t.bottom)/2):document.elementFromPoint((t.right+t.left)/2,t.bottom-1))!=n?n.style.pointerEvents="none":r.set(1e3,e)})},Dr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};function Wr(){}function Hr(e,t){t=t||Or(e);var n=e.display.barWidth,r=e.display.barHeight;Fr(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&yr(e),Fr(e,Or(e)),n=e.display.barWidth,r=e.display.barHeight}function Fr(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}Wr.prototype.update=function(){return{bottom:0,right:0}},Wr.prototype.setScrollLeft=function(){},Wr.prototype.setScrollTop=function(){},Wr.prototype.clear=function(){};var Pr={native:Dr,null:Wr};function Er(n){n.display.scrollbars&&(n.display.scrollbars.clear(),n.display.scrollbars.addClass&&T(n.display.wrapper,n.display.scrollbars.addClass)),n.display.scrollbars=new Pr[n.options.scrollbarStyle](function(e){n.display.wrapper.insertBefore(e,n.display.scrollbarFiller),we(e,"mousedown",function(){n.state.focused&&setTimeout(function(){return n.display.input.focus()},0)}),e.setAttribute("cm-not-content","true")},function(e,t){("horizontal"==t?Ar:Mr)(n,e)},n),n.display.scrollbars.addClass&&H(n.display.wrapper,n.display.scrollbars.addClass)}var Ir=0;function Rr(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ir},t=e.curOp,ln?ln.ops.push(t):t.ownsGroup=ln={ops:[t],delayedCallbacks:[]}}function zr(e){var t=e.curOp;t&&sn(t,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,n=0;n<t.length;n++)!function(e){var t=e.cm,n=t.display;(function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=Sn(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=Sn(e)+"px",t.scrollbarsClipped=!0)})(t),e.updateMaxLine&&_t(t);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<n.viewFrom||e.scrollToPos.to.line>=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new Xr(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}(t[n]);for(var r=0;r<t.length;r++)!function(e){e.updatedDisplay=e.mustUpdate&&Yr(e.cm,e.update)}(t[r]);for(var i=0;i<t.length;i++)!function(e){var t=e.cm,n=t.display;e.updatedDisplay&&yr(t);e.barMeasure=Or(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Mn(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+Sn(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Ln(t)));(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}(t[i]);for(var o=0;o<t.length;o++)!function(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&Ar(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var n=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,n);!e.updatedDisplay&&e.startHeight==t.doc.height||Hr(t,e.barMeasure);e.updatedDisplay&&Zr(t,e.barMeasure);e.selectionChanged&&fr(t);t.state.focused&&e.updateInput&&t.display.input.reset(e.typing);n&&pr(e.cm)}(t[o]);for(var l=0;l<t.length;l++)!function(e){var t=e.cm,n=t.display,r=t.doc;e.updatedDisplay&&_r(t,e.update);null==n.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(n.wheelStartX=n.wheelStartY=null);null!=e.scrollTop&&Nr(t,e.scrollTop,e.forceScroll);null!=e.scrollLeft&&Ar(t,e.scrollLeft,!0,!0);{var i;e.scrollToPos&&(i=function(e,t,n,r){null==r&&(r=0),e.options.lineWrapping||t!=n||(n="before"==(t=t.ch?lt(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?lt(t.line,t.ch+1,"before"):t);for(var i=0;i<5;i++){var o,l=!1,s=Vn(e,t),a=n&&n!=t?Vn(e,n):s,u=xr(e,o={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-r,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+r}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mr(e,u.scrollTop),1<Math.abs(e.doc.scrollTop-c)&&(l=!0)),null!=u.scrollLeft&&(Ar(e,u.scrollLeft),1<Math.abs(e.doc.scrollLeft-h)&&(l=!0)),!l)break}return o}(t,ft(r,e.scrollToPos.from),ft(r,e.scrollToPos.to),e.scrollToPos.margin),function(e,t){var n,r,i,o;Le(e,"scrollCursorIntoView")||(r=(n=e.display).sizer.getBoundingClientRect(),i=null,t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null==i||u||(o=O("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-wn(e.display))+"px;\n height: "+(t.bottom-t.top+Sn(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;"),e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)))}(t,i))}var o=e.maybeHiddenMarkers,l=e.maybeUnhiddenMarkers;if(o)for(var s=0;s<o.length;++s)o[s].lines.length||Se(o[s],"hide");if(l)for(var a=0;a<l.length;++a)l[a].lines.length&&Se(l[a],"unhide");n.wrapper.offsetHeight&&(r.scrollTop=t.display.scroller.scrollTop);e.changeObjs&&Se(t,"changes",t,e.changeObjs);e.update&&e.update.finish()}(t[l])}(e)})}function Br(e,t){if(e.curOp)return t();Rr(e);try{return t()}finally{zr(e)}}function Gr(e,t){return function(){if(e.curOp)return t.apply(e,arguments);Rr(e);try{return t.apply(e,arguments)}finally{zr(e)}}}function Ur(e){return function(){if(this.curOp)return e.apply(this,arguments);Rr(this);try{return e.apply(this,arguments)}finally{zr(this)}}}function Vr(t){return function(){var e=this.cm;if(!e||e.curOp)return t.apply(this,arguments);Rr(e);try{return t.apply(this,arguments)}finally{zr(e)}}}function Kr(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(jr,e))}function jr(a){var u,c,h,d=a.doc;d.highlightFrontier>=a.display.viewTo||(u=+new Date+a.options.workTime,c=bt(a,d.highlightFrontier),h=[],d.iter(c.line,Math.min(d.first+d.size,a.display.viewTo+500),function(e){if(c.line>=a.display.viewFrom){var t=e.styles,n=e.text.length>a.options.maxHighlightLength?_e(d.mode,c.state):null,r=vt(a,e,c,!0);n&&(c.state=n),e.styles=r.styles;var i=e.styleClasses,o=r.classes;o?e.styleClasses=o:i&&(e.styleClasses=null);for(var l=!t||t.length!=e.styles.length||i!=o&&(!i||!o||i.bgClass!=o.bgClass||i.textClass!=o.textClass),s=0;!l&&s<t.length;++s)l=t[s]!=e.styles[s];l&&h.push(c.line),e.stateAfter=c.save(),c.nextLine()}else e.text.length<=a.options.maxHighlightLength&&wt(a,e.text,c),e.stateAfter=c.line%5==0?c.save():null,c.nextLine();if(+new Date>u)return Kr(a,a.options.workDelay),!0}),d.highlightFrontier=c.line,d.modeFrontier=Math.max(d.modeFrontier,c.line),h.length&&Br(a,function(){for(var e=0;e<h.length;e++)or(a,h[e],"text")}))}var Xr=function(e,t,n){var r=e.display;this.viewport=t,this.visible=wr(r,e.doc,t),this.editorIsHidden=!r.wrapper.offsetWidth,this.wrapperHeight=r.wrapper.clientHeight,this.wrapperWidth=r.wrapper.clientWidth,this.oldDisplayWidth=Ln(e),this.force=n,this.dims=Qn(e),this.events=[]};function Yr(e,t){var n=e.display,r=e.doc;if(t.editorIsHidden)return lr(e),!1;if(!t.force&&t.visible.from>=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==ar(e))return!1;Jr(e)&&(lr(e),t.dims=Qn(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFrom<o&&o-n.viewFrom<20&&(o=Math.max(r.first,n.viewFrom)),n.viewTo>l&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),Nt&&(o=Vt(e.doc,o),l=Kt(e.doc,l));var s,a,u,c,h=o!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;a=o,u=l,0==(c=(s=e).display).view.length||a>=c.viewTo||u<=c.viewFrom?(c.view=on(s,a,u),c.viewFrom=a):(c.viewFrom>a?c.view=on(s,a,c.viewFrom).concat(c.view):c.viewFrom<a&&(c.view=c.view.slice(rr(s,a))),c.viewFrom=a,c.viewTo<u?c.view=c.view.concat(on(s,c.viewTo,u)):c.viewTo>u&&(c.view=c.view.slice(0,rr(s,u)))),c.viewTo=u,n.viewOffset=Xt(Qe(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var d=ar(e);if(!h&&0==d&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var f,p,g,m=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var n,r={activeElt:t};return!window.getSelection||(n=window.getSelection()).anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset),r}(e);return 4<d&&(n.lineDiv.style.display="none"),function(n,e,t){var r=n.display,i=n.options.lineNumbers,o=r.lineDiv,l=o.firstChild;function s(e){var t=e.nextSibling;return v&&y&&n.display.currentWheelTarget==e?e.style.display="none":e.parentNode.removeChild(e),t}for(var a=r.view,u=r.viewFrom,c=0;c<a.length;c++){var h=a[c];if(!h.hidden)if(h.node&&h.node.parentNode==o){for(;l!=h.node;)l=s(l);var d=i&&null!=e&&e<=u&&h.lineNumber;h.changes&&(-1<B(h.changes,"gutter")&&(d=!1),hn(n,h,u,t)),d&&(M(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(ot(n.options,u)))),l=h.node.nextSibling}else{var f=function(e,t,n,r){var i=fn(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),pn(e,t),gn(e,t,n,r),mn(e,t,r),t.node}(n,h,u,t);o.insertBefore(f,l)}u+=h.size}for(;l;)l=s(l)}(e,n.updateLineNumbers,t.dims),4<d&&(n.lineDiv.style.display=""),n.renderedView=n.view,(f=m)&&f.activeElt&&f.activeElt!=W()&&(f.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(f.activeElt.nodeName)&&f.anchorNode&&D(document.body,f.anchorNode)&&D(document.body,f.focusNode)&&(p=window.getSelection(),(g=document.createRange()).setEnd(f.anchorNode,f.anchorOffset),g.collapse(!1),p.removeAllRanges(),p.addRange(g),p.extend(f.focusNode,f.focusOffset))),M(n.cursorDiv),M(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,h&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,Kr(e,400)),!(n.updateLineNumbers=null)}function _r(e,t){for(var n=t.viewport,r=!0;;r=!1){if(r&&e.options.lineWrapping&&t.oldDisplayWidth!=Ln(e))r&&(t.visible=wr(e.display,e.doc,n));else if(n&&null!=n.top&&(n={top:Math.min(e.doc.height+xn(e.display)-kn(e),n.top)}),t.visible=wr(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break;if(!Yr(e,t))break;yr(e);var i=Or(e);ur(e),Hr(e,i),Zr(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function $r(e,t){var n,r=new Xr(e,t);Yr(e,r)&&(yr(e),_r(e,r),n=Or(e),ur(e),Hr(e,n),Zr(e,n),r.finish())}function qr(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function Zr(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Sn(e)+"px"}function Qr(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=Jn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",l=0;l<n.length;l++)if(!n[l].hidden){e.options.fixedGutter&&(n[l].gutter&&(n[l].gutter.style.left=o),n[l].gutterBackground&&(n[l].gutterBackground.style.left=o));var s=n[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}}function Jr(e){if(e.options.lineNumbers){var t=e.doc,n=ot(e.options,t.first+t.size-1),r=e.display;if(n.length!=r.lineNumChars){var i=r.measure.appendChild(O("div",[O("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return r.lineGutter.style.width="",r.lineNumInnerWidth=Math.max(o,r.lineGutter.offsetWidth-l)+1,r.lineNumWidth=r.lineNumInnerWidth+l,r.lineNumChars=r.lineNumInnerWidth?n.length:-1,r.lineGutter.style.width=r.lineNumWidth+"px",qr(e.display),1}}}function ei(e,t){for(var n=[],r=!1,i=0;i<e.length;i++){var o=e[i],l=null;if("string"!=typeof o&&(l=o.style,o=o.className),"CodeMirror-linenumbers"==o){if(!t)continue;r=!0}n.push({className:o,style:l})}return t&&!r&&n.push({className:"CodeMirror-linenumbers",style:null}),n}function ti(e){var t=e.gutters,n=e.gutterSpecs;M(t),e.lineGutter=null;for(var r=0;r<n.length;++r){var i=n[r],o=i.className,l=i.style,s=t.appendChild(O("div",null,"CodeMirror-gutter "+o));l&&(s.style.cssText=l),"CodeMirror-linenumbers"==o&&((e.lineGutter=s).style.width=(e.lineNumWidth||1)+"px")}t.style.display=n.length?"":"none",qr(e)}function ni(e){ti(e.display),ir(e),Qr(e)}function ri(e,t,n,r){var i=this;this.input=n,i.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),i.scrollbarFiller.setAttribute("cm-not-content","true"),i.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),i.gutterFiller.setAttribute("cm-not-content","true"),i.lineDiv=A("div",null,"CodeMirror-code"),i.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),i.cursorDiv=O("div",null,"CodeMirror-cursors"),i.measure=O("div",null,"CodeMirror-measure"),i.lineMeasure=O("div",null,"CodeMirror-measure"),i.lineSpace=A("div",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,"position: relative; outline: none");var o=A("div",[i.lineSpace],"CodeMirror-lines");i.mover=O("div",[o],null,"position: relative"),i.sizer=O("div",[i.mover],"CodeMirror-sizer"),i.sizerWidth=null,i.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),i.gutters=O("div",null,"CodeMirror-gutters"),i.lineGutter=null,i.scroller=O("div",[i.sizer,i.heightForcer,i.gutters],"CodeMirror-scroll"),i.scroller.setAttribute("tabIndex","-1"),i.wrapper=O("div",[i.scrollbarFiller,i.gutterFiller,i.scroller],"CodeMirror"),x&&C<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),v||g&&d||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,i.gutterSpecs=ei(r.gutters,r.lineNumbers),ti(i),n.init(i)}Xr.prototype.signal=function(e,t){Te(e,t)&&this.events.push(arguments)},Xr.prototype.finish=function(){for(var e=0;e<this.events.length;e++)Se.apply(null,this.events[e])};var ii=0,oi=null;function li(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==n&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:null==n&&(n=e.wheelDelta),{x:t,y:n}}function si(e){var t=li(e);return t.x*=oi,t.y*=oi,t}function ai(e,t){var n,r,i,o=li(t),l=o.x,s=o.y,a=e.display,u=a.scroller,c=u.scrollWidth>u.clientWidth,h=u.scrollHeight>u.clientHeight;if(l&&c||s&&h){if(s&&y&&v)e:for(var d=t.target,f=a.view;d!=u;d=d.parentNode)for(var p=0;p<f.length;p++)if(f[p].node==d){e.display.currentWheelTarget=d;break e}if(l&&!g&&!m&&null!=oi)return s&&h&&Mr(e,Math.max(0,u.scrollTop+s*oi)),Ar(e,Math.max(0,u.scrollLeft+l*oi)),(!s||s&&h)&&Ne(t),void(a.wheelStartX=null);s&&null!=oi&&(n=s*oi,i=(r=e.doc.scrollTop)+a.wrapper.clientHeight,n<0?r=Math.max(0,r+n-50):i=Math.min(e.doc.height,i+n+50),$r(e,{top:r,bottom:i})),ii<20&&(null==a.wheelStartX?(a.wheelStartX=u.scrollLeft,a.wheelStartY=u.scrollTop,a.wheelDX=l,a.wheelDY=s,setTimeout(function(){var e,t,n;null!=a.wheelStartX&&(e=u.scrollLeft-a.wheelStartX,n=(t=u.scrollTop-a.wheelStartY)&&a.wheelDY&&t/a.wheelDY||e&&a.wheelDX&&e/a.wheelDX,a.wheelStartX=a.wheelStartY=null,n&&(oi=(oi*ii+n)/(ii+1),++ii))},200)):(a.wheelDX+=l,a.wheelDY+=s))}}x?oi=-.53:g?oi=15:l?oi=-.7:c&&(oi=-1/3);var ui=function(e,t){this.ranges=e,this.primIndex=t};ui.prototype.primary=function(){return this.ranges[this.primIndex]},ui.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(!at(n.anchor,r.anchor)||!at(n.head,r.head))return!1}return!0},ui.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new ci(ut(this.ranges[t].anchor),ut(this.ranges[t].head));return new ui(e,this.primIndex)},ui.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},ui.prototype.contains=function(e,t){t=t||e;for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(0<=st(t,r.from())&&st(e,r.to())<=0)return n}return-1};var ci=function(e,t){this.anchor=e,this.head=t};function hi(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(e,t){return st(e.from(),t.from())}),n=B(t,i);for(var o=1;o<t.length;o++){var l,s,a,u=t[o],c=t[o-1],h=st(c.to(),u.from());(r&&!u.empty()?0<h:0<=h)&&(l=ht(c.from(),u.from()),s=ct(c.to(),u.to()),a=c.empty()?u.from()==u.head:c.from()==c.head,o<=n&&--n,t.splice(--o,2,new ci(a?s:l,a?l:s)))}return new ui(t,n)}function di(e,t){return new ui([new ci(e,t||e)],0)}function fi(e){return e.text?lt(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function pi(e,t){if(st(e,t.from)<0)return e;if(st(e,t.to)<=0)return fi(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=fi(t).ch-t.to.ch),lt(n,r)}function gi(e,t){for(var n=[],r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new ci(pi(i.anchor,t),pi(i.head,t)))}return hi(e.cm,n,e.sel.primIndex)}function mi(e,t,n){return e.line==t.line?lt(n.line,e.ch-t.ch+n.ch):lt(n.line+(e.line-t.line),e.ch)}function vi(e){e.doc.mode=je(e.options,e.doc.modeOption),yi(e)}function yi(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Kr(e,100),e.state.modeGen++,e.curOp&&ir(e)}function bi(e,t){return 0==t.from.ch&&0==t.to.ch&&""==$(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function wi(e,r,t,i){function o(e){return t?t[e]:null}function n(e,t,n){!function(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),Ht(e),Ft(e,n);var i=r?r(e):1;i!=e.height&&tt(e,i)}(e,t,n,i),un(e,"change",e,r)}function l(e,t){for(var n=[],r=e;r<t;++r)n.push(new $t(d[r],o(r),i));return n}var s,a,u,c=r.from,h=r.to,d=r.text,f=Qe(e,c.line),p=Qe(e,h.line),g=$(d),m=o(d.length-1),v=h.line-c.line;r.full?(e.insert(0,l(0,d.length)),e.remove(d.length,e.size-d.length)):bi(e,r)?(s=l(0,d.length-1),n(p,p.text,m),v&&e.remove(c.line,v),s.length&&e.insert(c.line,s)):f==p?1==d.length?n(f,f.text.slice(0,c.ch)+g+f.text.slice(h.ch),m):((a=l(1,d.length-1)).push(new $t(g+f.text.slice(h.ch),m,i)),n(f,f.text.slice(0,c.ch)+d[0],o(0)),e.insert(c.line+1,a)):1==d.length?(n(f,f.text.slice(0,c.ch)+d[0]+p.text.slice(h.ch),o(0)),e.remove(c.line+1,v)):(n(f,f.text.slice(0,c.ch)+d[0],o(0)),n(p,g+p.text.slice(h.ch),m),u=l(1,d.length-1),1<v&&e.remove(c.line+1,v-1),e.insert(c.line+1,u)),un(e,"change",e,r)}function xi(e,s,a){!function e(t,n,r){if(t.linked)for(var i=0;i<t.linked.length;++i){var o,l=t.linked[i];l.doc!=n&&(o=r&&l.sharedHist,a&&!o||(s(l.doc,o),e(l.doc,t,o)))}}(e,null,!0)}function Ci(e,t){if(t.cm)throw new Error("This document is already in use.");tr((e.doc=t).cm=e),vi(e),Si(e),e.options.lineWrapping||_t(e),e.options.mode=t.modeOption,ir(e)}function Si(e){("rtl"==e.doc.direction?H:T)(e.display.lineDiv,"CodeMirror-rtl")}function Li(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function ki(e,t){var n={from:ut(t.from),to:fi(t),text:Je(e,t.from,t.to)};return Oi(e,n,t.from.line,t.to.line+1),xi(e,function(e){return Oi(e,n,t.from.line,t.to.line+1),0},!0),n}function Ti(e){for(;e.length;){if(!$(e).ranges)break;e.pop()}}function Mi(e,t,n,r){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=(s=i).lastOp==r?(Ti(s.done),$(s.done)):s.done.length&&!$(s.done).ranges?$(s.done):1<s.done.length&&!s.done[s.done.length-2].ranges?(s.done.pop(),$(s.done)):void 0))l=$(o.changes),0==st(t.from,t.to)&&0==st(t.from,l.to)?l.to=fi(t):o.changes.push(ki(e,t));else{var u=$(i.done);for(u&&u.ranges||Ai(e.sel,i.done),o={changes:[ki(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,l||Se(e,"historyAdded")}function Ni(e,t,n,r){var i,o,l,s,a,u=e.history,c=r&&r.origin;n==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=$(u.done),s=t,"*"==(a=o.charAt(0))||"+"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Ai(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=n,r&&!1!==r.clearRedo&&Ti(u.undone)}function Ai(e,t){var n=$(t);n&&n.ranges&&n.equals(e)||t.push(e)}function Oi(t,n,e,r){var i=n["spans_"+t.id],o=0;t.iter(Math.max(t.first,e),Math.min(t.first+t.size,r),function(e){e.markedSpans&&((i=i||(n["spans_"+t.id]={}))[o]=e.markedSpans),++o})}function Di(e,t){var n=t["spans_"+e.id];if(!n)return null;for(var r=[],i=0;i<t.text.length;++i)r.push(function(e){if(!e)return null;for(var t,n=0;n<e.length;++n)e[n].marker.explicitlyCleared?t=t||e.slice(0,n):t&&t.push(e[n]);return t?t.length?t:null:e}(n[i]));return r}function Wi(e,t){var n=Di(e,t),r=Dt(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var o=n[i],l=r[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(n[i]=l)}return n}function Hi(e,t,n){for(var r=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)r.push(n?ui.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];r.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\d+)$/))&&-1<B(t,Number(c[1]))&&($(s)[h]=u[h],delete u[h])}}}return r}function Fi(e,t,n,r){if(r){var i,o=e.anchor;return n&&((i=st(t,o)<0)!=st(n,o)<0?(o=t,t=n):i!=st(t,n)<0&&(t=n)),new ci(o,t)}return new ci(n||t,t)}function Pi(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),Bi(e,new ui([Fi(e.sel.primary(),t,n,i)],0),r)}function Ei(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)r[o]=Fi(e.sel.ranges[o],t[o],null,i);Bi(e,hi(e.cm,r,e.sel.primIndex),n)}function Ii(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,Bi(e,hi(e.cm,i,e.sel.primIndex),r)}function Ri(e,t,n,r){Bi(e,di(t,n),r)}function zi(e,t,n){var r=e.history.done,i=$(r);i&&i.ranges?Gi(e,r[r.length-1]=t,n):Bi(e,t,n)}function Bi(e,t,n){Gi(e,t,n),Ni(e,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function Gi(e,t,n){var r,i,o,l;(Te(e,"beforeSelectionChange")||e.cm&&Te(e.cm,"beforeSelectionChange"))&&(r=e,o=n,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new ci(ft(r,e[t].anchor),ft(r,e[t].head))},origin:o&&o.origin},Se(r,"beforeSelectionChange",r,l),r.cm&&Se(r.cm,"beforeSelectionChange",r.cm,l),t=l.ranges!=i.ranges?hi(r.cm,l.ranges,l.ranges.length-1):i);var s=n&&n.bias||(st(t.primary().head,e.sel.primary().head)<0?-1:1);Ui(e,Ki(e,t,s,!0)),n&&!1===n.scroll||!e.cm||Sr(e.cm)}function Ui(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=1,e.cm.curOp.selectionChanged=!0,ke(e.cm)),un(e,"cursorActivity",e))}function Vi(e){Ui(e,Ki(e,e.sel,null,!1))}function Ki(e,t,n,r){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Xi(e,l.anchor,s&&s.anchor,n,r),u=Xi(e,l.head,s&&s.head,n,r);!i&&a==l.anchor&&u==l.head||((i=i||t.ranges.slice(0,o))[o]=new ci(a,u))}return i?hi(e.cm,i,t.primIndex):t}function ji(e,t,n,r,i){var o=Qe(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker,u="selectLeft"in a?!a.selectLeft:a.inclusiveLeft,c="selectRight"in a?!a.selectRight:a.inclusiveRight;if((null==s.from||(u?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(c?s.to>=t.ch:s.to>t.ch))){if(i&&(Se(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(n){var h=a.find(r<0?1:-1),d=void 0;if((r<0?c:u)&&(h=Yi(e,h,-r,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(d=st(h,n))&&(r<0?d<0:0<d))return ji(e,h,t,r,i)}var f=a.find(r<0?-1:1);return(r<0?u:c)&&(f=Yi(e,f,r,f.line==t.line?o:null)),f?ji(e,f,t,r,i):null}}return t}function Xi(e,t,n,r,i){var o=r||1,l=ji(e,t,n,o,i)||!i&&ji(e,t,n,o,!0)||ji(e,t,n,-o,i)||!i&&ji(e,t,n,-o,!0);return l||(e.cantEdit=!0,lt(e.first,0))}function Yi(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?ft(e,lt(t.line-1)):null:0<n&&t.ch==(r||Qe(e,t.line)).text.length?t.line<e.first+e.size-1?lt(t.line+1,0):null:new lt(t.line,t.ch+n)}function _i(e){e.setSelection(lt(e.firstLine(),0),lt(e.lastLine()),V)}function $i(i,e,t){var o={canceled:!1,from:e.from,to:e.to,text:e.text,origin:e.origin,cancel:function(){return o.canceled=!0}};return t&&(o.update=function(e,t,n,r){e&&(o.from=ft(i,e)),t&&(o.to=ft(i,t)),n&&(o.text=n),void 0!==r&&(o.origin=r)}),Se(i,"beforeChange",i,o),i.cm&&Se(i.cm,"beforeChange",i.cm,o),o.canceled?(i.cm&&(i.cm.curOp.updateInput=2),null):{from:o.from,to:o.to,text:o.text,origin:o.origin}}function qi(e,t,n){if(e.cm){if(!e.cm.curOp)return Gr(e.cm,qi)(e,t,n);if(e.cm.state.suppressEdits)return}if(!(Te(e,"beforeChange")||e.cm&&Te(e.cm,"beforeChange"))||(t=$i(e,t,!0))){var r=Mt&&!n&&function(e,t,n){var r=null;if(e.iter(t.line,n.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;!n.readOnly||r&&-1!=B(r,n)||(r=r||[]).push(n)}}),!r)return null;for(var i=[{from:t,to:n}],o=0;o<r.length;++o)for(var l=r[o],s=l.find(0),a=0;a<i.length;++a){var u,c,h,d=i[a];st(d.to,s.from)<0||0<st(d.from,s.to)||(u=[a,1],c=st(d.from,s.from),h=st(d.to,s.to),(c<0||!l.inclusiveLeft&&!c)&&u.push({from:d.from,to:s.from}),(0<h||!l.inclusiveRight&&!h)&&u.push({from:s.to,to:d.to}),i.splice.apply(i,u),a+=u.length-3)}return i}(e,t.from,t.to);if(r)for(var i=r.length-1;0<=i;--i)Zi(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else Zi(e,t)}}function Zi(e,n){var t,r;1==n.text.length&&""==n.text[0]&&0==st(n.from,n.to)||(t=gi(e,n),Mi(e,n,t,e.cm?e.cm.curOp.id:NaN),eo(e,n,t,Dt(e,n)),r=[],xi(e,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Dt(e,n))}))}function Qi(i,o,e){var t=i.cm&&i.cm.state.suppressEdits;if(!t||e){for(var l,n=i.history,r=i.sel,s="undo"==o?n.done:n.undone,a="undo"==o?n.undone:n.done,u=0;u<s.length&&(l=s[u],e?!l.ranges||l.equals(i.sel):l.ranges);u++);if(u!=s.length){for(n.lastOrigin=n.lastSelOrigin=null;;){if(!(l=s.pop()).ranges){if(t)return void s.push(l);break}if(Ai(l,a),e&&!l.equals(i.sel))return void Bi(i,l,{clearRedo:!1});r=l}var c=[];Ai(r,a),a.push({changes:c,generation:n.generation}),n.generation=l.generation||++n.maxGeneration;for(var h=Te(i,"beforeChange")||i.cm&&Te(i.cm,"beforeChange"),d=l.changes.length-1;0<=d;--d){var f=function(e){var n=l.changes[e];if(n.origin=o,h&&!$i(i,n,!1))return s.length=0,{};c.push(ki(i,n));var t=e?gi(i,n):$(s);eo(i,n,t,Wi(i,n)),!e&&i.cm&&i.cm.scrollIntoView({from:n.from,to:fi(n)});var r=[];xi(i,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Wi(e,n))})}(d);if(f)return f.v}}}}function Ji(e,t){if(0!=t&&(e.first+=t,e.sel=new ui(q(e.sel.ranges,function(e){return new ci(lt(e.anchor.line+t,e.anchor.ch),lt(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){ir(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;r<n.viewTo;r++)or(e.cm,r,"gutter")}}function eo(e,t,n,r){if(e.cm&&!e.cm.curOp)return Gr(e.cm,eo)(e,t,n,r);var i,o;t.to.line<e.first?Ji(e,t.text.length-1-(t.to.line-t.from.line)):t.from.line>e.lastLine()||(t.from.line<e.first&&(Ji(e,i=t.text.length-1-(e.first-t.from.line)),t={from:lt(e.first,0),to:lt(t.to.line+i,t.to.ch),text:[$(t.text)],origin:t.origin}),o=e.lastLine(),t.to.line>o&&(t={from:t.from,to:lt(o,Qe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Je(e,t.from,t.to),n=n||gi(e,t),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=nt(Ut(Qe(r,o.line))),r.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0}));-1<r.sel.contains(t.from,t.to)&&ke(e);wi(r,t,n,er(e)),e.options.lineWrapping||(r.iter(a,o.line+t.text.length,function(e){var t=Yt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var n=e.first,r=t-1;n<r;r--){var i=Qe(e,r).stateAfter;if(i&&(!(i instanceof gt)||r+i.lookAhead<t)){n=r+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,n)}})(r,o.line),Kr(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?ir(e):o.line!=l.line||1!=t.text.length||bi(e.doc,t)?ir(e,o.line,l.line+1,u):or(e,o.line,"text");var c=Te(e,"changes"),h=Te(e,"change");{var d;(h||c)&&(d={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin},h&&un(e,"change",e,d),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(d))}e.display.selForContextMenu=null}(e.cm,t,r):wi(e,t,r),Gi(e,n,V),e.cantEdit&&Xi(e,lt(e.firstLine(),0))&&(e.cantEdit=!1))}function to(e,t,n,r,i){var o;st(r=r||n,n)<0&&(n=(o=[r,n])[0],r=o[1]),"string"==typeof t&&(t=e.splitLines(t)),qi(e,{from:n,to:r,text:t,origin:i})}function no(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function ro(e,t,n,r){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)no(o.ranges[s].anchor,t,n,r),no(o.ranges[s].head,t,n,r)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(n<u.from.line)u.from=lt(u.from.line+r,u.from.ch),u.to=lt(u.to.line+r,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function io(e,t){var n=t.from.line,r=t.to.line,i=t.text.length-(r-n)-1;ro(e.done,n,r,i),ro(e.undone,n,r,i)}function oo(e,t,n,r){var i=t,o=t;return"number"==typeof t?o=Qe(e,dt(e,t)):i=nt(t),null==i?null:(r(o,i)&&e.cm&&or(e.cm,i,n),o)}function lo(e){this.lines=e,this.parent=null;for(var t=0,n=0;n<e.length;++n)e[n].parent=this,t+=e[n].height;this.height=t}function so(e){this.children=e;for(var t=0,n=0,r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}ci.prototype.from=function(){return ht(this.anchor,this.head)},ci.prototype.to=function(){return ct(this.anchor,this.head)},ci.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},lo.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n,r=e,i=e+t;r<i;++r){var o=this.lines[r];this.height-=o.height,(n=o).parent=null,Ht(n),un(o,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},so.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n,r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e),s=i.height;if(i.removeInner(e,l),this.height-=s-i.height,o==l&&(this.children.splice(r--,1),i.parent=null),0==(t-=l))break;e=0}else e-=o}this.size-t<25&&(1<this.children.length||!(this.children[0]instanceof lo))&&(n=[],this.collapse(n),this.children=[new lo(n)],this.children[0].parent=this)},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,n),i.lines&&50<i.lines.length){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new lo(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++r,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t,n,r=new so(e.children.splice(e.children.length-5,5));e.parent?(e.size-=r.size,e.height-=r.height,t=B(e.parent.children,e),e.parent.children.splice(t+1,0,r)):(((n=new so(e.children)).parent=e).children=[n,r],e=n),r.parent=e.parent}while(10<e.children.length);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,n))return!0;if(0==(t-=l))break;e=0}else e-=o}}};function ao(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.doc=e,this.node=t}function uo(e,t,n){Xt(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cr(e,n)}ao.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,n=this.line,r=nt(n);if(null!=r&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var o=yn(this);tt(n,Math.max(0,n.height-o)),e&&(Br(e,function(){uo(e,n,-o),or(e,r,"widget")}),un(e,"lineWidgetCleared",e,this,r))}},ao.prototype.changed=function(){var e=this,t=this.height,n=this.doc.cm,r=this.line;this.height=null;var i=yn(this)-t;i&&(jt(this.doc,r)||tt(r,r.height+i),n&&Br(n,function(){n.curOp.forceUpdate=!0,uo(n,r,i),un(n,"lineWidgetChanged",n,e,nt(r))}))},Me(ao);var co=0,ho=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++co};function fo(t,r,i,e,n){if(e&&e.shared)return function(e,n,r,i,o){(i=I(i)).shared=!1;var l=[fo(e,n,r,i,o)],s=l[0],a=i.widgetNode;return xi(e,function(e){a&&(i.widgetNode=a.cloneNode(!0)),l.push(fo(e,ft(e,n),ft(e,r),i,o));for(var t=0;t<e.linked.length;++t)if(e.linked[t].isParent)return;s=$(l)}),new po(l,s)}(t,r,i,e,n);if(t.cm&&!t.cm.curOp)return Gr(t.cm,fo)(t,r,i,e,n);var o=new ho(t,n),l=st(r,i);if(e&&I(e,o,!1),0<l||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),e.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),e.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Gt(t,r.line,r,i,o)||r.line!=i.line&&Gt(t,i.line,r,i,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Nt=!0}o.addToHistory&&Mi(t,{from:r,to:i,origin:"markText"},t.sel,NaN);var s,a=r.line,u=t.cm;if(t.iter(a,i.line+1,function(e){var t,n;u&&o.collapsed&&!u.options.lineWrapping&&Ut(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=r.line&&tt(e,0),t=e,n=new At(o,a==r.line?r.ch:null,a==i.line?i.ch:null),t.markedSpans=t.markedSpans?t.markedSpans.concat([n]):[n],n.marker.attachLine(t),++a}),o.collapsed&&t.iter(r.line,i.line+1,function(e){jt(t,e)&&tt(e,0)}),o.clearOnEnter&&we(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(Mt=!0,(t.history.done.length||t.history.undone.length)&&t.clearHistory()),o.collapsed&&(o.id=++co,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)ir(u,r.line,i.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=r.line;c<=i.line;c++)or(u,c,"text");o.atomic&&Vi(u.doc),un(u,"markerAdded",u,o)}return o}ho.prototype.clear=function(){if(!this.explicitlyCleared){var e,t=this.doc.cm,n=t&&!t.curOp;n&&Rr(t),!Te(this,"clear")||(e=this.find())&&un(this,"clear",e.from,e.to);for(var r=null,i=null,o=0;o<this.lines.length;++o){var l=this.lines[o],s=Ot(l.markedSpans,this);t&&!this.collapsed?or(t,nt(l),"text"):t&&(null!=s.to&&(i=nt(l)),null!=s.from&&(r=nt(l))),l.markedSpans=function(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n=n||[]).push(e[r]);return n}(l.markedSpans,s),null==s.from&&this.collapsed&&!jt(this.doc,l)&&t&&tt(l,qn(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var a=0;a<this.lines.length;++a){var u=Ut(this.lines[a]),c=Yt(u);c>t.display.maxLineLength&&(t.display.maxLine=u,t.display.maxLineLength=c,t.display.maxLineChanged=!0)}null!=r&&t&&this.collapsed&&ir(t,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&Vi(t.doc)),t&&un(t,"markerCleared",t,this,r,i),n&&zr(t),this.parent&&this.parent.clear()}},ho.prototype.find=function(e,t){var n,r;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Ot(o.markedSpans,this);if(null!=l.from&&(n=lt(t?o:nt(o),l.from),-1==e))return n;if(null!=l.to&&(r=lt(t?o:nt(o),l.to),1==e))return r}return n&&{from:n,to:r}},ho.prototype.changed=function(){var o=this,l=this.find(-1,!0),s=this,a=this.doc.cm;l&&a&&Br(a,function(){var e,t,n=l.line,r=nt(l.line),i=Nn(a,r);i&&(Fn(i),a.curOp.selectionChanged=a.curOp.forceUpdate=!0),a.curOp.updateMaxLine=!0,jt(s.doc,n)||null==s.height||(e=s.height,s.height=null,(t=yn(s)-e)&&tt(n,n.height+t)),un(a,"markerChanged",a,o)})},ho.prototype.attachLine=function(e){var t;!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)),this.lines.push(e)},ho.prototype.detachLine=function(e){var t;this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)},Me(ho);var po=function(e,t){this.markers=e,this.primary=t;for(var n=0;n<e.length;++n)e[n].parent=this};function go(e){return e.findMarks(lt(e.first,0),e.clipPos(lt(e.lastLine())),function(e){return e.parent})}po.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();un(this,"clear")}},po.prototype.find=function(e,t){return this.primary.find(e,t)},Me(po);var mo=0,vo=function(e,t,n,r,i){if(!(this instanceof vo))return new vo(e,t,n,r,i);null==n&&(n=0),so.call(this,[new lo([new $t("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1;var o=lt(this.modeFrontier=this.highlightFrontier=n,0);this.sel=di(o),this.history=new Li(null),this.id=++mo,this.modeOption=t,this.lineSep=r,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),wi(this,{from:o,to:o,text:e}),Bi(this,di(o),V)};vo.prototype=Q(so.prototype,{constructor:vo,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var n=0,r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=et(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Vr(function(e){var t=lt(this.first,0),n=this.first+this.size-1;qi(this,{from:t,to:lt(n,Qe(this,n).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&Lr(this.cm,0,0),Bi(this,di(t),V)}),replaceRange:function(e,t,n,r){to(this,e,t=ft(this,t),n=n?ft(this,n):t,r)},getRange:function(e,t,n){var r=Je(this,ft(this,e),ft(this,t));return!1===n?r:r.join(n||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(it(this,e))return Qe(this,e)},getLineNumber:nt,getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=Qe(this,e)),Ut(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return ft(this,e)},getCursor:function(e){var t=this.sel.primary(),n=null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from();return n},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Vr(function(e,t,n){Ri(this,ft(this,"number"==typeof e?lt(e,t||0):e),null,n)}),setSelection:Vr(function(e,t,n){Ri(this,ft(this,e),ft(this,t||e),n)}),extendSelection:Vr(function(e,t,n){Pi(this,ft(this,e),t&&ft(this,t),n)}),extendSelections:Vr(function(e,t){Ei(this,pt(this,e),t)}),extendSelectionsBy:Vr(function(e,t){Ei(this,pt(this,q(this.sel.ranges,e)),t)}),setSelections:Vr(function(e,t,n){if(e.length){for(var r=[],i=0;i<e.length;i++)r[i]=new ci(ft(this,e[i].anchor),ft(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),Bi(this,hi(this.cm,r,t),n)}}),addSelection:Vr(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new ci(ft(this,e),ft(this,t||e))),Bi(this,hi(this.cm,r,r.length-1),n)}),getSelection:function(e){for(var t=this.sel.ranges,n=0;n<t.length;n++)var r=Je(this,t[n].from(),t[n].to()),i=i?i.concat(r):r;return!1===e?i:i.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],n=this.sel.ranges,r=0;r<n.length;r++){var i=Je(this,n[r].from(),n[r].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[r]=i}return t},replaceSelection:function(e,t,n){for(var r=[],i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")},replaceSelections:Vr(function(e,t,n){for(var r=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];r[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:n}}for(var s=t&&"end"!=t&&function(e,t,n){for(var r=[],i=h=lt(e.first,0),o=0;o<t.length;o++){var l,s,a=t[o],u=mi(a.from,h,i),c=mi(fi(a),h,i),h=a.to,i=c;"around"==n?(s=st((l=e.sel.ranges[o]).head,l.anchor)<0,r[o]=new ci(s?c:u,s?u:c)):r[o]=new ci(u,u)}return new ui(r,e.sel.primIndex)}(this,r,t),a=r.length-1;0<=a;a--)qi(this,r[a]);s?zi(this,s):this.cm&&Sr(this.cm)}),undo:Vr(function(){Qi(this,"undo")}),redo:Vr(function(){Qi(this,"redo")}),undoSelection:Vr(function(){Qi(this,"undo",!0)}),redoSelection:Vr(function(){Qi(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){var t=this;this.history=new Li(this.history.maxGeneration),xi(this,function(e){return e.history=t.history},!0)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Hi(this.history.done),undone:Hi(this.history.undone)}},setHistory:function(e){var t=this.history=new Li(this.history.maxGeneration);t.done=Hi(e.done.slice(0),null,!0),t.undone=Hi(e.undone.slice(0),null,!0)},setGutterMarker:Vr(function(e,n,r){return oo(this,e,"gutter",function(e){var t=e.gutterMarkers||(e.gutterMarkers={});return!(t[n]=r)&&ne(t)&&(e.gutterMarkers=null),1})}),clearGutter:Vr(function(t){var n=this;this.iter(function(e){e.gutterMarkers&&e.gutterMarkers[t]&&oo(n,e,"gutter",function(){return e.gutterMarkers[t]=null,ne(e.gutterMarkers)&&(e.gutterMarkers=null),1})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!it(this,e))return null;if(!(e=Qe(this,t=e)))return null}else if(null==(t=nt(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Vr(function(e,n,r){return oo(this,e,"gutter"==n?"gutter":"class",function(e){var t="text"==n?"textClass":"background"==n?"bgClass":"gutter"==n?"gutterClass":"wrapClass";if(e[t]){if(L(r).test(e[t]))return;e[t]+=" "+r}else e[t]=r;return 1})}),removeLineClass:Vr(function(e,o,l){return oo(this,e,"gutter"==o?"gutter":"class",function(e){var t="text"==o?"textClass":"background"==o?"bgClass":"gutter"==o?"gutterClass":"wrapClass",n=e[t];if(n){if(null==l)e[t]=null;else{var r=n.match(L(l));if(!r)return;var i=r.index+r[0].length;e[t]=n.slice(0,r.index)+(r.index&&i!=n.length?" ":"")+n.slice(i)||null}return 1}})}),addLineWidget:Vr(function(e,t,n){return i=e,o=new ao(r=this,t,n),(l=r.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),oo(r,i,"widget",function(e){var t,n=e.widgets||(e.widgets=[]);return null==o.insertAt?n.push(o):n.splice(Math.min(n.length-1,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!jt(r,e)&&(t=Xt(e)<r.scrollTop,tt(e,e.height+yn(o)),t&&Cr(l,o.height),l.curOp.forceUpdate=!0),1}),l&&un(l,"lineWidgetAdded",l,o,"number"==typeof i?i:nt(i)),o;var r,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,n){return fo(this,ft(this,e),ft(this,t),n,n&&n.type||"range")},setBookmark:function(e,t){var n={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return fo(this,e=ft(this,e),e,n,"bookmark")},findMarksAt:function(e){var t=[],n=Qe(this,(e=ft(this,e)).line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(i,o,l){i=ft(this,i),o=ft(this,o);var s=[],a=i.line;return this.iter(i.line,o.line+1,function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;n++){var r=t[n];null!=r.to&&a==i.line&&i.ch>=r.to||null==r.from&&a!=i.line||null!=r.from&&a==o.line&&r.from>=o.ch||l&&!l(r.marker)||s.push(r.marker.parent||r.marker)}++a}),s},getAllMarks:function(){var r=[];return this.iter(function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;++n)null!=t[n].from&&r.push(t[n].marker)}),r},posFromIndex:function(n){var r,i=this.first,o=this.lineSeparator().length;return this.iter(function(e){var t=e.text.length+o;if(n<t)return r=n,!0;n-=t,++i}),ft(this,lt(i,r))},indexFromPos:function(e){var t=(e=ft(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var n=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+n}),t},copy:function(e){var t=new vo(et(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e=e||{};var t=this.first,n=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<n&&(n=e.to);var r=new vo(et(this,t,n),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(r.history=this.history),(this.linked||(this.linked=[])).push({doc:r,sharedHist:e.sharedHist}),r.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var n=0;n<t.length;n++){var r,i=t[n],o=i.find(),l=e.clipPos(o.from),s=e.clipPos(o.to);st(l,s)&&(r=fo(e,l,s,i.primary,i.primary.type),i.markers.push(r),r.parent=i)}}(r,go(this)),r},unlinkDoc:function(e){if(e instanceof pl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),function(o){for(var e=0;e<o.length;e++)!function(e){var t=o[e],n=[t.primary.doc];xi(t.primary.doc,function(e){return n.push(e)});for(var r=0;r<t.markers.length;r++){var i=t.markers[r];-1==B(n,i.doc)&&(i.parent=null,t.markers.splice(r--,1))}}(e)}(go(this));break}}var n;e.history==this.history&&(n=[e.id],xi(e,function(e){return n.push(e.id)},!0),e.history=new Li(null),e.history.done=Hi(this.history.done,n),e.history.undone=Hi(this.history.undone,n))},iterLinkedDocs:function(e){xi(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):Re(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:Vr(function(e){var t;"rtl"!=e&&(e="ltr"),e!=this.direction&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Br(t=this.cm,function(){Si(t),ir(t)}))})}),vo.prototype.eachLine=vo.prototype.iter;var yo=0;function bo(e){var r=this;if(wo(r),!Le(r,e)&&!bn(r.display,e)){Ne(e),x&&(yo=+new Date);var t=nr(r,e,!0),n=e.dataTransfer.files;if(t&&!r.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),l=0,s=function(){++l==i&&Gr(r,function(){var e={from:t=ft(r.doc,t),to:t,text:r.doc.splitLines(o.filter(function(e){return null!=e}).join(r.doc.lineSeparator())),origin:"paste"};qi(r.doc,e),zi(r.doc,di(ft(r.doc,t),ft(r.doc,fi(e))))})()},a=0;a<n.length;a++)!function(e,t){var n;r.options.allowDropFileTypes&&-1==B(r.options.allowDropFileTypes,e.type)?s():((n=new FileReader).onerror=s,n.onload=function(){var e=n.result;/[\x00-\x08\x0e-\x1f]{2}/.test(e)||(o[t]=e),s()},n.readAsText(e))}(n[a],a);else{if(r.state.draggingText&&-1<r.doc.sel.contains(t))return r.state.draggingText(e),void setTimeout(function(){return r.display.input.focus()},20);try{var u,c=e.dataTransfer.getData("Text");if(c){if(r.state.draggingText&&!r.state.draggingText.copy&&(u=r.listSelections()),Gi(r.doc,di(t,t)),u)for(var h=0;h<u.length;++h)to(r.doc,"",u[h].anchor,u[h].head,"drag");r.replaceSelection(c,"around","paste"),r.display.input.focus()}}catch(e){}}}}function wo(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function xo(t){if(document.getElementsByClassName){for(var e=document.getElementsByClassName("CodeMirror"),n=[],r=0;r<e.length;r++){var i=e[r].CodeMirror;i&&n.push(i)}n.length&&n[0].operation(function(){for(var e=0;e<n.length;e++)t(n[e])})}}var Co=!1;function So(){var e;Co||(we(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,xo(Lo)},100))}),we(window,"blur",function(){return xo(vr)}),Co=!0)}function Lo(e){var t=e.display;t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize()}for(var ko={3:"Pause",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",145:"ScrollLock",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",224:"Mod",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},To=0;To<10;To++)ko[To+48]=ko[To+96]=String(To);for(var Mo=65;Mo<=90;Mo++)ko[Mo]=String.fromCharCode(Mo);for(var No=1;No<=12;No++)ko[No+111]=ko[No+63235]="F"+No;var Ao={};function Oo(e){var t,n,r,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))n=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error("Unrecognized modifier name: "+s);r=!0}}return t&&(e="Alt-"+e),n&&(e="Ctrl-"+e),i&&(e="Cmd-"+e),r&&(e="Shift-"+e),e}function Do(e){var t={};for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(/^(name|fallthrough|(de|at)tach)$/.test(n))continue;if("..."==r){delete e[n];continue}for(var i=q(n.split(" "),Oo),o=0;o<i.length;o++){var l=void 0,s=void 0,l=o==i.length-1?(s=i.join(" "),r):(s=i.slice(0,o+1).join(" "),"..."),a=t[s];if(a){if(a!=l)throw new Error("Inconsistent bindings for "+s)}else t[s]=l}delete e[n]}for(var u in t)e[u]=t[u];return e}function Wo(e,t,n,r){var i=(t=Eo(t)).call?t.call(e,r):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&n(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return Wo(e,t.fallthrough,n,r);for(var o=0;o<t.fallthrough.length;o++){var l=Wo(e,t.fallthrough[o],n,r);if(l)return l}}}function Ho(e){var t="string"==typeof e?e:ko[e.keyCode];return"Ctrl"==t||"Alt"==t||"Shift"==t||"Mod"==t}function Fo(e,t,n){var r=e;return t.altKey&&"Alt"!=r&&(e="Alt-"+e),(w?t.metaKey:t.ctrlKey)&&"Ctrl"!=r&&(e="Ctrl-"+e),(w?t.ctrlKey:t.metaKey)&&"Mod"!=r&&(e="Cmd-"+e),!n&&t.shiftKey&&"Shift"!=r&&(e="Shift-"+e),e}function Po(e,t){if(m&&34==e.keyCode&&e.char)return!1;var n=ko[e.keyCode];return null!=n&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(n=e.code),Fo(n,e,t))}function Eo(e){return"string"==typeof e?Ao[e]:e}function Io(t,e){for(var n=t.doc.sel.ranges,r=[],i=0;i<n.length;i++){for(var o=e(n[i]);r.length&&st(o.from,$(r).to)<=0;){var l=r.pop();if(st(l.from,o.from)<0){o.from=l.from;break}}r.push(o)}Br(t,function(){for(var e=r.length-1;0<=e;e--)to(t.doc,"",r[e].from,r[e].to,"+delete");Sr(t)})}function Ro(e,t,n){var r=oe(e.text,t+n,n);return r<0||r>e.text.length?null:r}function zo(e,t,n){var r=Ro(e,t.ch,n);return null==r?null:new lt(t.line,r,n<0?"after":"before")}function Bo(e,t,n,r,i){if(e){"rtl"==t.doc.direction&&(i=-i);var o=ye(n,t.doc.direction);if(o){var l,s,a,u=i<0?$(o):o[0],c=i<0==(1==u.level)?"after":"before";return 0<u.level||"rtl"==t.doc.direction?(l=An(t,n),s=i<0?n.text.length-1:0,a=On(t,l,s).top,s=le(function(e){return On(t,l,e).top==a},i<0==(1==u.level)?u.from:u.to-1,s),"before"==c&&(s=Ro(n,s,1))):s=i<0?u.to:u.from,new lt(r,s,c)}}return new lt(r,i<0?n.text.length:0,i<0?"before":"after")}function Go(t,n,s,e){var a=ye(n,t.doc.direction);if(!a)return zo(n,s,e);s.ch>=n.text.length?(s.ch=n.text.length,s.sticky="before"):s.ch<=0&&(s.ch=0,s.sticky="after");var r=ae(a,s.ch,s.sticky),i=a[r];if("ltr"==t.doc.direction&&i.level%2==0&&(0<e?i.to>s.ch:i.from<s.ch))return zo(n,s,e);function u(e,t){return Ro(n,e instanceof lt?e.ch:e,t)}function o(e){return t.options.lineWrapping?(l=l||An(t,n),_n(t,n,l,e)):{begin:0,end:n.text.length}}var l,c=o("before"==s.sticky?u(s,-1):s.ch);if("rtl"==t.doc.direction||1==i.level){var h=1==i.level==e<0,d=u(s,h?1:-1);if(null!=d&&(h?d<=i.to&&d<=c.end:d>=i.from&&d>=c.begin)){var f=h?"before":"after";return new lt(s.line,d,f)}}function p(e,t,n){for(var r=function(e,t){return t?new lt(s.line,u(e,1),"before"):new lt(s.line,e,"after")};0<=e&&e<a.length;e+=t){var i=a[e],o=0<t==(1!=i.level),l=o?n.begin:u(n.end,-1);if(i.from<=l&&l<i.to)return r(l,o);if(l=o?i.from:u(i.to,-1),n.begin<=l&&l<n.end)return r(l,o)}}var g=p(r+e,e,c);if(g)return g;var m=0<e?c.end:u(c.begin,-1);return null==m||0<e&&m==n.text.length||!(g=p(0<e?0:a.length-1,e,o(m)))?null:g}Ao.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Ao.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Ao.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Ao.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Ao.default=y?Ao.macDefault:Ao.pcDefault;var Uo={selectAll:_i,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(n){return Io(n,function(e){if(e.empty()){var t=Qe(n.doc,e.head.line).text.length;return e.head.ch==t&&e.head.line<n.lastLine()?{from:e.head,to:lt(e.head.line+1,0)}:{from:e.head,to:lt(e.head.line,t)}}return{from:e.from(),to:e.to()}})},deleteLine:function(t){return Io(t,function(e){return{from:lt(e.from().line,0),to:ft(t.doc,lt(e.to().line+1,0))}})},delLineLeft:function(e){return Io(e,function(e){return{from:lt(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(n){return Io(n,function(e){var t=n.charCoords(e.head,"div").top+5;return{from:n.coordsChar({left:0,top:t},"div"),to:e.from()}})},delWrappedLineRight:function(r){return Io(r,function(e){var t=r.charCoords(e.head,"div").top+5,n=r.coordsChar({left:r.display.lineDiv.offsetWidth+100,top:t},"div");return{from:e.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(lt(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(lt(e.lastLine()))},goLineStart:function(t){return t.extendSelectionsBy(function(e){return Vo(t,e.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(t){return t.extendSelectionsBy(function(e){return Ko(t,e.head)},{origin:"+move",bias:1})},goLineEnd:function(t){return t.extendSelectionsBy(function(e){return function(e,t){var n=Qe(e.doc,t),r=function(e){for(var t;t=Bt(e);)e=t.find(1,!0).line;return e}(n);r!=n&&(t=nt(r));return Bo(!0,e,n,t,-1)}(t,e.head.line)},{origin:"+move",bias:-1})},goLineRight:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:n.display.lineDiv.offsetWidth+100,top:t},"div")},j)},goLineLeft:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:0,top:t},"div")},j)},goLineLeftSmart:function(r){return r.extendSelectionsBy(function(e){var t=r.cursorCoords(e.head,"div").top+5,n=r.coordsChar({left:0,top:t},"div");return n.ch<r.getLine(n.line).search(/\S/)?Ko(r,e.head):n},j)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"codepoint")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],n=e.listSelections(),r=e.options.tabSize,i=0;i<n.length;i++){var o=n[i].from(),l=R(e.getLine(o.line),o.ch,r);t.push(_(r-l%r))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(l){return Br(l,function(){for(var e,t,n,r=l.listSelections(),i=[],o=0;o<r.length;o++){r[o].empty()&&(e=r[o].head,(t=Qe(l.doc,e.line).text)&&(e.ch==t.length&&(e=new lt(e.line,e.ch-1)),0<e.ch?(e=new lt(e.line,e.ch+1),l.replaceRange(t.charAt(e.ch-1)+t.charAt(e.ch-2),lt(e.line,e.ch-2),e,"+transpose")):e.line>l.doc.first&&((n=Qe(l.doc,e.line-1).text)&&(e=new lt(e.line,1),l.replaceRange(t.charAt(0)+l.doc.lineSeparator()+n.charAt(n.length-1),lt(e.line-1,n.length-1),e,"+transpose")))),i.push(new ci(e,e)))}l.setSelections(i)})},newlineAndIndent:function(r){return Br(r,function(){for(var e=r.listSelections(),t=e.length-1;0<=t;t--)r.replaceRange(r.doc.lineSeparator(),e[t].anchor,e[t].head,"+input");e=r.listSelections();for(var n=0;n<e.length;n++)r.indentLine(e[n].from().line,null,!0);Sr(r)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function Vo(e,t){var n=Qe(e.doc,t),r=Ut(n);return r!=n&&(t=nt(r)),Bo(!0,e,r,t,1)}function Ko(e,t){var n=Vo(e,t.line),r=Qe(e.doc,n.line),i=ye(r,e.doc.direction);if(i&&0!=i[0].level)return n;var o=Math.max(n.ch,r.text.search(/\S/)),l=t.line==n.line&&t.ch<=o&&t.ch;return lt(n.line,l?0:o,n.sticky)}function jo(e,t,n){if("string"==typeof t&&!(t=Uo[t]))return!1;e.display.input.ensurePolled();var r=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}var Xo=new z;function Yo(e,t,n,r){var i=e.state.keySeq;if(i){if(Ho(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:Xo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),_o(e,i+" "+t,n,r))return!0}return _o(e,t,n,r)}function _o(e,t,n,r){var i=function(e,t,n){for(var r=0;r<e.state.keyMaps.length;r++){var i=Wo(t,e.state.keyMaps[r],n,e);if(i)return i}return e.options.extraKeys&&Wo(t,e.options.extraKeys,n,e)||Wo(t,e.options.keyMap,n,e)}(e,t,r);return"multi"==i&&(e.state.keySeq=t),"handled"==i&&un(e,"keyHandled",e,t,n),"handled"!=i&&"multi"!=i||(Ne(n),fr(e)),!!i}function $o(t,e){var n=Po(e,!0);return!!n&&(e.shiftKey&&!t.state.keySeq?Yo(t,"Shift-"+n,e,function(e){return jo(t,e,!0)})||Yo(t,n,e,function(e){if("string"==typeof e?/^go[A-Z]/.test(e):e.motion)return jo(t,e)}):Yo(t,n,e,function(e){return jo(t,e)}))}var qo=null;function Zo(e){var t,n,r,i=this;function o(e){18!=e.keyCode&&e.altKey||(T(r,"CodeMirror-crosshair"),Ce(document,"keyup",o),Ce(document,"mouseover",o))}e.target&&e.target!=i.display.input.getField()||(i.curOp.focus=W(),Le(i,e)||(x&&C<11&&27==e.keyCode&&(e.returnValue=!1),t=e.keyCode,i.display.shift=16==t||e.shiftKey,n=$o(i,e),m&&(qo=n?t:null,!n&&88==t&&!Be&&(y?e.metaKey:e.ctrlKey)&&i.replaceSelection("",null,"cut")),g&&!y&&!n&&46==t&&e.shiftKey&&!e.ctrlKey&&document.execCommand&&document.execCommand("cut"),18!=t||/\bCodeMirror-crosshair\b/.test(i.display.lineDiv.className)||(H(r=i.display.lineDiv,"CodeMirror-crosshair"),we(document,"keyup",o),we(document,"mouseover",o))))}function Qo(e){16==e.keyCode&&(this.doc.sel.shift=!1),Le(this,e)}function Jo(e){var t=this;if(!(e.target&&e.target!=t.display.input.getField()||bn(t.display,e)||Le(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var n,r,i=e.keyCode,o=e.charCode;if(m&&i==qo)return qo=null,void Ne(e);m&&(!e.which||e.which<10)&&$o(t,e)||"\b"!=(n=String.fromCharCode(null==o?i:o))&&(Yo(r=t,"'"+n+"'",e,function(e){return jo(r,e,!0)})||t.display.input.onKeyPress(e))}}var el,tl,nl=function(e,t,n){this.time=e,this.pos=t,this.button=n};function rl(e){var t,n,r,i,o,l,s=this,a=s.display;Le(s,e)||a.activeTouch&&a.input.supportsTouch()||(a.input.ensurePolled(),a.shift=e.shiftKey,bn(a,e)?v||(a.scroller.draggable=!1,setTimeout(function(){return a.scroller.draggable=!0},100)):ll(s,e)||(t=nr(s,e),n=He(e),r=t?(i=t,o=n,l=+new Date,tl&&tl.compare(l,i,o)?(el=tl=null,"triple"):el&&el.compare(l,i,o)?(tl=new nl(l,i,o),el=null,"double"):(el=new nl(l,i,o),tl=null,"single")):"single",window.focus(),1==n&&s.state.selectingText&&s.state.selectingText(e),t&&function(n,e,r,t,i){var o="Click";"double"==t?o="Double"+o:"triple"==t&&(o="Triple"+o);return Yo(n,Fo(o=(1==e?"Left":2==e?"Middle":"Right")+o,i),i,function(e){if("string"==typeof e&&(e=Uo[e]),!e)return!1;var t=!1;try{n.isReadOnly()&&(n.state.suppressEdits=!0),t=e(n,r)!=U}finally{n.state.suppressEdits=!1}return t})}(s,n,t,r,e)||(1==n?t?function(e,t,n,r){x?setTimeout(E(pr,e),0):e.curOp.focus=W();var i,o=function(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};{var o;null==i.unit&&(o=f?n.shiftKey&&n.metaKey:n.altKey,i.unit=o?"rectangle":"single"==t?"char":"double"==t?"word":"line")}null!=i.extend&&!e.doc.extend||(i.extend=e.doc.extend||n.shiftKey);null==i.addNew&&(i.addNew=y?n.metaKey:n.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?n.altKey:n.ctrlKey));return i}(e,n,r),l=e.doc.sel;(e.options.dragDrop&&Ee&&!e.isReadOnly()&&"single"==n&&-1<(i=l.contains(t))&&(st((i=l.ranges[i]).from(),t)<0||0<t.xRel)&&(0<st(i.to(),t)||t.xRel<0)?function(t,n,r,i){var o=t.display,l=!1,s=Gr(t,function(e){v&&(o.scroller.draggable=!1),t.state.draggingText=!1,Ce(o.wrapper.ownerDocument,"mouseup",s),Ce(o.wrapper.ownerDocument,"mousemove",a),Ce(o.scroller,"dragstart",u),Ce(o.scroller,"drop",s),l||(Ne(e),i.addNew||Pi(t.doc,r,null,null,i.extend),v&&!c||x&&9==C?setTimeout(function(){o.wrapper.ownerDocument.body.focus({preventScroll:!0}),o.input.focus()},20):o.input.focus())}),a=function(e){l=l||10<=Math.abs(n.clientX-e.clientX)+Math.abs(n.clientY-e.clientY)},u=function(){return l=!0};v&&(o.scroller.draggable=!0);(t.state.draggingText=s).copy=!i.moveOnDrag,o.scroller.dragDrop&&o.scroller.dragDrop();we(o.wrapper.ownerDocument,"mouseup",s),we(o.wrapper.ownerDocument,"mousemove",a),we(o.scroller,"dragstart",u),we(o.scroller,"drop",s),gr(t),setTimeout(function(){return o.input.focus()},20)}:function(m,e,v,y){var l=m.display,b=m.doc;Ne(e);var w,x,C=b.sel,t=C.ranges;y.addNew&&!y.extend?(x=b.sel.contains(v),w=-1<x?t[x]:new ci(v,v)):(w=b.sel.primary(),x=b.sel.primIndex);{var n;"rectangle"==y.unit?(y.addNew||(w=new ci(v,v)),v=nr(m,e,!0,!0),x=-1):(n=il(m,v,y.unit),w=y.extend?Fi(w,n.anchor,n.head,y.extend):n)}y.addNew?-1==x?(x=t.length,Bi(b,hi(m,t.concat([w]),x),{scroll:!1,origin:"*mouse"})):1<t.length&&t[x].empty()&&"char"==y.unit&&!y.extend?(Bi(b,hi(m,t.slice(0,x).concat(t.slice(x+1)),0),{scroll:!1,origin:"*mouse"}),C=b.sel):Ii(b,x,w,K):(Bi(b,new ui([w],x=0),K),C=b.sel);var S=v;function s(e){if(0!=st(S,e))if(S=e,"rectangle"==y.unit){for(var t=[],n=m.options.tabSize,r=R(Qe(b,v.line).text,v.ch,n),i=R(Qe(b,e.line).text,e.ch,n),o=Math.min(r,i),l=Math.max(r,i),s=Math.min(v.line,e.line),a=Math.min(m.lastLine(),Math.max(v.line,e.line));s<=a;s++){var u=Qe(b,s).text,c=X(u,o,n);o==l?t.push(new ci(lt(s,c),lt(s,c))):u.length>c&&t.push(new ci(lt(s,c),lt(s,X(u,l,n))))}t.length||t.push(new ci(v,v)),Bi(b,hi(m,C.ranges.slice(0,x).concat(t),x),{origin:"*mouse",scroll:!1}),m.scrollIntoView(e)}else{var h,d=w,f=il(m,e,y.unit),p=d.anchor,p=0<st(f.anchor,p)?(h=f.head,ht(d.from(),f.anchor)):(h=f.anchor,ct(d.to(),f.head)),g=C.ranges.slice(0);g[x]=function(e,t){var n=t.anchor,r=t.head,i=Qe(e.doc,n.line);if(0==st(n,r)&&n.sticky==r.sticky)return t;var o=ye(i);if(!o)return t;var l=ae(o,n.ch,n.sticky),s=o[l];if(s.from!=n.ch&&s.to!=n.ch)return t;var a,u=l+(s.from==n.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;{var c,h;a=r.line!=n.line?0<(r.line-n.line)*("ltr"==e.doc.direction?1:-1):(c=ae(o,r.ch,r.sticky),h=c-l||(r.ch-n.ch)*(1==s.level?-1:1),c==u-1||c==u?h<0:0<h)}var d=o[u+(a?-1:0)],f=a==(1==d.level),p=f?d.from:d.to,g=f?"after":"before";return n.ch==p&&n.sticky==g?t:new ci(new lt(n.line,p,g),r)}(m,new ci(ft(b,p),h)),Bi(b,hi(m,g,x),K)}}var a=l.wrapper.getBoundingClientRect(),u=0;function r(e){m.state.selectingText=!1,u=1/0,e&&(Ne(e),l.input.focus()),Ce(l.wrapper.ownerDocument,"mousemove",i),Ce(l.wrapper.ownerDocument,"mouseup",o),b.history.lastSelOrigin=null}var i=Gr(m,function(e){(0!==e.buttons&&He(e)?function e(t){var n,r,i=++u,o=nr(m,t,!0,"rectangle"==y.unit);o&&(0!=st(o,S)?(m.curOp.focus=W(),s(o),n=wr(l,b),(o.line>=n.to||o.line<n.from)&&setTimeout(Gr(m,function(){u==i&&e(t)}),150)):(r=t.clientY<a.top?-20:t.clientY>a.bottom?20:0)&&setTimeout(Gr(m,function(){u==i&&(l.scroller.scrollTop+=r,e(t))}),50))}:r)(e)}),o=Gr(m,r);m.state.selectingText=o,we(l.wrapper.ownerDocument,"mousemove",i),we(l.wrapper.ownerDocument,"mouseup",o)})(e,r,t,o)}(s,t,r,e):We(e)==a.scroller&&Ne(e):2==n?(t&&Pi(s.doc,t),setTimeout(function(){return a.input.focus()},20)):3==n&&(S?s.display.input.onContextMenu(e):gr(s)))))}function il(e,t,n){if("char"==n)return new ci(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new ci(lt(t.line,0),ft(e.doc,lt(t.line+1,0)));var r=n(e,t);return new ci(r.from,r.to)}function ol(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(e){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Ne(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!Te(e,n))return Oe(t);o-=s.top-l.viewOffset;for(var a=0;a<e.display.gutterSpecs.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return Se(e,n,e,rt(e.doc,o),e.display.gutterSpecs[a].className,t),Oe(t)}}function ll(e,t){return ol(e,t,"gutterClick",!0)}function sl(e,t){var n,r;bn(e.display,t)||(r=t,Te(n=e,"gutterContextMenu")&&ol(n,r,"gutterContextMenu",!1))||Le(e,t,"contextmenu")||S||e.display.input.onContextMenu(t)}function al(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),En(e)}nl.prototype.compare=function(e,t,n){return this.time+400>e&&0==st(t,this.pos)&&n==this.button};var ul={toString:function(){return"CodeMirror.Init"}},cl={},hl={};function dl(e,t,n){var r,i;!t!=!(n&&n!=ul)&&(r=e.display.dragFunctions,(i=t?we:Ce)(e.display.scroller,"dragstart",r.start),i(e.display.scroller,"dragenter",r.enter),i(e.display.scroller,"dragover",r.over),i(e.display.scroller,"dragleave",r.leave),i(e.display.scroller,"drop",r.drop))}function fl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),_t(e)),tr(e),ir(e),En(e),setTimeout(function(){return Hr(e)},100)}function pl(e,t){var n=this;if(!(this instanceof pl))return new pl(e,t);this.options=t=t?I(t):{},I(cl,t,!1);var r=t.value;"string"==typeof r?r=new vo(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new pl.inputStyles[t.inputStyle](this),o=this.display=new ri(e,r,i,t);for(var l in al(o.wrapper.CodeMirror=this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Er(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new z,keySeq:null,specialChars:null},t.autofocus&&!d&&o.input.focus(),x&&C<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(i){var o=i.display;we(o.scroller,"mousedown",Gr(i,rl)),we(o.scroller,"dblclick",x&&C<11?Gr(i,function(e){var t,n;Le(i,e)||(!(t=nr(i,e))||ll(i,e)||bn(i.display,e)||(Ne(e),n=i.findWordAt(t),Pi(i.doc,n.anchor,n.head)))}):function(e){return Le(i,e)||Ne(e)});we(o.scroller,"contextmenu",function(e){return sl(i,e)}),we(o.input.getField(),"contextmenu",function(e){o.scroller.contains(e.target)||sl(i,e)});var n,r={end:0};function l(){o.activeTouch&&(n=setTimeout(function(){return o.activeTouch=null},1e3),(r=o.activeTouch).end=+new Date)}function s(e,t){if(null==t.left)return 1;var n=t.left-e.left,r=t.top-e.top;return 400<n*n+r*r}we(o.scroller,"touchstart",function(e){var t;Le(i,e)||function(e){if(1==e.touches.length){var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}}(e)||ll(i,e)||(o.input.ensurePolled(),clearTimeout(n),t=+new Date,o.activeTouch={start:t,moved:!1,prev:t-r.end<=300?r:null},1==e.touches.length&&(o.activeTouch.left=e.touches[0].pageX,o.activeTouch.top=e.touches[0].pageY))}),we(o.scroller,"touchmove",function(){o.activeTouch&&(o.activeTouch.moved=!0)}),we(o.scroller,"touchend",function(e){var t,n,r=o.activeTouch;r&&!bn(o,e)&&null!=r.left&&!r.moved&&new Date-r.start<300&&(t=i.coordsChar(o.activeTouch,"page"),n=!r.prev||s(r,r.prev)?new ci(t,t):!r.prev.prev||s(r,r.prev.prev)?i.findWordAt(t):new ci(lt(t.line,0),ft(i.doc,lt(t.line+1,0))),i.setSelection(n.anchor,n.head),i.focus(),Ne(e)),l()}),we(o.scroller,"touchcancel",l),we(o.scroller,"scroll",function(){o.scroller.clientHeight&&(Mr(i,o.scroller.scrollTop),Ar(i,o.scroller.scrollLeft,!0),Se(i,"scroll",i))}),we(o.scroller,"mousewheel",function(e){return ai(i,e)}),we(o.scroller,"DOMMouseScroll",function(e){return ai(i,e)}),we(o.wrapper,"scroll",function(){return o.wrapper.scrollTop=o.wrapper.scrollLeft=0}),o.dragFunctions={enter:function(e){Le(i,e)||De(e)},over:function(e){var t,n,r;Le(i,e)||((r=nr(t=i,e))&&(hr(t,r,n=document.createDocumentFragment()),t.display.dragCursor||(t.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),t.display.lineSpace.insertBefore(t.display.dragCursor,t.display.cursorDiv)),N(t.display.dragCursor,n)),De(e))},start:function(e){return t=i,n=e,void(x&&(!t.state.draggingText||new Date-yo<100)?De(n):Le(t,n)||bn(t.display,n)||(n.dataTransfer.setData("Text",t.getSelection()),n.dataTransfer.effectAllowed="copyMove",n.dataTransfer.setDragImage&&!c&&((r=O("img",null,null,"position: fixed; left: 0; top: 0;")).src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",m&&(r.width=r.height=1,t.display.wrapper.appendChild(r),r._top=r.offsetTop),n.dataTransfer.setDragImage(r,0,0),m&&r.parentNode.removeChild(r))));var t,n,r},drop:Gr(i,bo),leave:function(e){Le(i,e)||wo(i)}};var e=o.input.getField();we(e,"keyup",function(e){return Qo.call(i,e)}),we(e,"keydown",Gr(i,Zo)),we(e,"keypress",Gr(i,Jo)),we(e,"focus",function(e){return mr(i,e)}),we(e,"blur",function(e){return vr(i,e)})}(this),So(),Rr(this),this.curOp.forceUpdate=!0,Ci(this,r),t.autofocus&&!d||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&mr(n)},20):vr(this),hl)hl.hasOwnProperty(l)&&hl[l](this,t[l],ul);Jr(this),t.finishInit&&t.finishInit(this);for(var s=0;s<gl.length;++s)gl[s](this);zr(this),v&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(o.lineDiv).textRendering&&(o.lineDiv.style.textRendering="auto")}pl.defaults=cl,pl.optionHandlers=hl;var gl=[];function ml(e,t,n,r){var i,o=e.doc;null==n&&(n="add"),"smart"==n&&(o.mode.indent?i=bt(e,t).state:n="prev");var l=e.options.tabSize,s=Qe(o,t),a=R(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(r||/\S/.test(s.text)){if("smart"==n&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||150<u)){if(!r)return;n="prev"}}else u=0,n="not";"prev"==n?u=t>o.first?R(Qe(o,t-1).text,null,l):0:"add"==n?u=a+e.options.indentUnit:"subtract"==n?u=a-e.options.indentUnit:"number"==typeof n&&(u=a+n),u=Math.max(0,u);var h="",d=0;if(e.options.indentWithTabs)for(var f=Math.floor(u/l);f;--f)d+=l,h+="\t";if(d<u&&(h+=_(u-d)),h!=c)return to(o,h,lt(t,0),lt(t,c.length),"+input"),!(s.stateAfter=null);for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var m=lt(t,c.length);Ii(o,p,new ci(m,m));break}}}pl.defineInitHook=function(e){return gl.push(e)};var vl=null;function yl(e){vl=e}function bl(e,t,n,r,i){var o=e.doc;e.display.shift=!1,r=r||o.sel;var l=new Date-200,s="paste"==i||e.state.pasteIncoming>l,a=Re(t),u=null;if(s&&1<r.ranges.length)if(vl&&vl.text.join("\n")==t){if(r.ranges.length%vl.text.length==0){u=[];for(var c=0;c<vl.text.length;c++)u.push(o.splitLines(vl.text[c]))}}else a.length==r.ranges.length&&e.options.pasteLinesPerSelection&&(u=q(a,function(e){return[e]}));for(var h=e.curOp.updateInput,d=r.ranges.length-1;0<=d;d--){var f=r.ranges[d],p=f.from(),g=f.to();f.empty()&&(n&&0<n?p=lt(p.line,p.ch-n):e.state.overwrite&&!s?g=lt(g.line,Math.min(Qe(o,g.line).text.length,g.ch+$(a).length)):s&&vl&&vl.lineWise&&vl.text.join("\n")==a.join("\n")&&(p=g=lt(p.line,0)));var m={from:p,to:g,text:u?u[d%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};qi(e.doc,m),un(e,"inputRead",e,m)}t&&!s&&xl(e,t),Sr(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function wl(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");return n&&(e.preventDefault(),t.isReadOnly()||t.options.disableInput||Br(t,function(){return bl(t,n,0,null,"paste")}),1)}function xl(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;0<=r;r--){var i=n.ranges[r];if(!(100<i.head.ch||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(-1<t.indexOf(o.electricChars.charAt(s))){l=ml(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Qe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=ml(e,i.head.line,"smart"));l&&un(e,"electricInput",e,i.head.line)}}}function Cl(e){for(var t=[],n=[],r=0;r<e.doc.sel.ranges.length;r++){var i=e.doc.sel.ranges[r].head.line,o={anchor:lt(i,0),head:lt(i+1,0)};n.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:n}}function Sl(e,t,n,r){e.setAttribute("autocorrect",n?"":"off"),e.setAttribute("autocapitalize",r?"":"off"),e.setAttribute("spellcheck",!!t)}function Ll(){var e=O("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=O("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return v?e.style.width="1000px":e.setAttribute("wrap","off"),a&&(e.style.border="1px solid black"),Sl(e),t}function kl(i,o,l,s,a){var e=o,t=l,u=Qe(i,o.line),c=a&&"rtl"==i.direction?-l:l;function n(e){var t,n,r;if(null==(n="codepoint"==s?(t=u.text.charCodeAt(o.ch+(0<s?0:-1)),isNaN(t)?null:new lt(o.line,Math.max(0,Math.min(u.text.length,o.ch+l*(55296<=t&&t<56320?2:1))),-l)):a?Go(i.cm,u,o,l):zo(u,o,l))){if(e||(r=o.line+c)<i.first||r>=i.first+i.size||(o=new lt(r,o.ch,o.sticky),!(u=Qe(i,r))))return;o=Bo(a,i.cm,u,o.line,c)}else o=n;return 1}if("char"==s||"codepoint"==s)n();else if("column"==s)n(!0);else if("word"==s||"group"==s)for(var r=null,h="group"==s,d=i.cm&&i.cm.getHelper(o,"wordChars"),f=!0;!(l<0)||n(!f);f=!1){var p=u.text.charAt(o.ch)||"\n",g=te(p,d)?"w":h&&"\n"==p?"n":!h||/\s/.test(p)?null:"p";if(!h||f||g||(g="s"),r&&r!=g){l<0&&(l=1,n(),o.sticky="after");break}if(g&&(r=g),0<l&&!n(!f))break}var m=Xi(i,o,e,t,!0);return at(e,m)&&(m.hitSide=!0),m}function Tl(e,t,n,r){var i,o,l,s,a=e.doc,u=t.left;for("page"==r?(i=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),o=Math.max(i-.5*qn(e.display),3),l=(0<n?t.bottom:t.top)+n*o):"line"==r&&(l=0<n?t.bottom+3:t.top-3);(s=Xn(e,u,l)).outside;){if(n<0?l<=0:l>=a.height){s.hitSide=!0;break}l+=5*n}return s}function Ml(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new z,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null}function Nl(e,t){var n=Nn(e,t.line);if(!n||n.hidden)return null;var r=Qe(e.doc,t.line),i=Tn(n,r,t.line),o=ye(r,e.doc.direction),l="left";o&&(l=ae(o,t.ch)%2?"right":"left");var s=Hn(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function Al(e,t){return t&&(e.bad=!0),e}function Ol(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Al(e.clipPos(lt(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==r)return function(u,e,t){var n=u.text.firstChild,r=!1;if(!e||!D(n,e))return Al(lt(nt(u.line),0),!0);if(e==n&&(r=!0,e=n.childNodes[t],t=0,!e)){var i=u.rest?$(u.rest):u.line;return Al(lt(nt(i),i.text.length),r)}var o=3==e.nodeType?e:null,l=e;o||1!=e.childNodes.length||3!=e.firstChild.nodeType||(o=e.firstChild,t=t&&o.nodeValue.length);for(;l.parentNode!=n;)l=l.parentNode;var c=u.measure,h=c.maps;function s(e,t,n){for(var r=-1;r<(h?h.length:0);r++)for(var i=r<0?c.map:h[r],o=0;o<i.length;o+=3){var l=i[o+2];if(l==e||l==t){var s=nt(r<0?u.line:u.rest[r]),a=i[o]+n;return(n<0||l!=e)&&(a=i[o+(n?1:0)]),lt(s,a)}}}var a=s(o,l,t);if(a)return Al(a,r);for(var d=l.nextSibling,f=o?o.nodeValue.length-t:0;d;d=d.nextSibling){if(a=s(d,d.firstChild,0))return Al(lt(a.line,a.ch-f),r);f+=d.textContent.length}for(var p=l.previousSibling,g=t;p;p=p.previousSibling){if(a=s(p,p.firstChild,-1))return Al(lt(a.line,a.ch+g),r);g+=p.textContent.length}}(o,t,n)}}Ml.prototype.init=function(e){var t=this,l=this,s=l.cm,a=l.div=e.lineDiv;function u(e){for(var t=e.target;t;t=t.parentNode){if(t==a)return 1;if(/\bCodeMirror-(?:line)?widget\b/.test(t.className))break}}function n(e){if(u(e)&&!Le(s,e)){if(s.somethingSelected())yl({lineWise:!1,text:s.getSelections()}),"cut"==e.type&&s.replaceSelection("",null,"cut");else{if(!s.options.lineWiseCopyCut)return;var t=Cl(s);yl({lineWise:!0,text:t.text}),"cut"==e.type&&s.operation(function(){s.setSelections(t.ranges,0,V),s.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var n=vl.text.join("\n");if(e.clipboardData.setData("Text",n),e.clipboardData.getData("Text")==n)return void e.preventDefault()}var r=Ll(),i=r.firstChild;s.display.lineSpace.insertBefore(r,s.display.lineSpace.firstChild),i.value=vl.text.join("\n");var o=document.activeElement;P(i),setTimeout(function(){s.display.lineSpace.removeChild(r),o.focus(),o==a&&l.showPrimarySelection()},50)}}Sl(a,s.options.spellcheck,s.options.autocorrect,s.options.autocapitalize),we(a,"paste",function(e){!u(e)||Le(s,e)||wl(e,s)||C<=11&&setTimeout(Gr(s,function(){return t.updateFromDOM()}),20)}),we(a,"compositionstart",function(e){t.composing={data:e.data,done:!1}}),we(a,"compositionupdate",function(e){t.composing||(t.composing={data:e.data,done:!1})}),we(a,"compositionend",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),we(a,"touchstart",function(){return l.forceCompositionEnd()}),we(a,"input",function(){t.composing||t.readFromDOMSoon()}),we(a,"copy",n),we(a,"cut",n)},Ml.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},Ml.prototype.prepareSelection=function(){var e=cr(this.cm,!1);return e.focus=document.activeElement==this.div,e},Ml.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Ml.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},Ml.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line<t.display.viewFrom)e.removeAllRanges();else{var o=Ol(t,e.anchorNode,e.anchorOffset),l=Ol(t,e.focusNode,e.focusOffset);if(!o||o.bad||!l||l.bad||0!=st(ht(o,l),r)||0!=st(ct(o,l),i)){var s,a,u=t.display.view,c=r.line>=t.display.viewFrom&&Nl(t,r)||{node:u[0].measure.map[2],offset:0},h=i.line<t.display.viewTo&&Nl(t,i);if(h||(h={node:(a=(s=u[u.length-1].measure).maps?s.maps[s.maps.length-1]:s.map)[a.length-1],offset:a[a.length-2]-a[a.length-3]}),c&&h){var d,f=e.rangeCount&&e.getRangeAt(0);try{d=k(c.node,c.offset,h.offset,h.node)}catch(e){}d&&(!g&&t.state.focused?(e.collapse(c.node,c.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),f&&null==e.anchorNode?e.addRange(f):g&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Ml.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Ml.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Ml.prototype.rememberSelection=function(){var e=this.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Ml.prototype.selectionInEditor=function(){var e=this.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Ml.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()&&document.activeElement==this.div||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Ml.prototype.blur=function(){this.div.blur()},Ml.prototype.getField=function(){return this.div},Ml.prototype.supportsTouch=function(){return!0},Ml.prototype.receivedFocus=function(){var t=this;this.selectionInEditor()?this.pollSelection():Br(this.cm,function(){return t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))})},Ml.prototype.selectionChanged=function(){var e=this.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Ml.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e,t,n=this.getSelection(),r=this.cm;if(h&&l&&this.cm.display.gutterSpecs.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(n.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();this.composing||(this.rememberSelection(),e=Ol(r,n.anchorNode,n.anchorOffset),t=Ol(r,n.focusNode,n.focusOffset),e&&t&&Br(r,function(){Bi(r.doc,di(e,t),V),(e.bad||t.bad)&&(r.curOp.selectionChanged=!0)}))}},Ml.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,n,r=this.cm,i=r.display,o=r.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>r.firstLine()&&(l=lt(l.line-1,Qe(r.doc,l.line-1).length)),s.ch==Qe(r.doc,s.line).text.length&&s.line<r.lastLine()&&(s=lt(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;n=l.line==i.viewFrom||0==(e=rr(r,l.line))?(t=nt(i.view[0].line),i.view[0].node):(t=nt(i.view[e].line),i.view[e-1].node.nextSibling);var a,u=rr(r,s.line),c=u==i.view.length-1?(a=i.viewTo-1,i.lineDiv.lastChild):(a=nt(i.view[u+1].line)-1,i.view[u+1].node.previousSibling);if(!n)return!1;for(var h=r.doc.splitLines(function(u,e,t,c,h){var n="",d=!1,f=u.doc.lineSeparator(),p=!1;function g(){d&&(n+=f,p&&(n+=f),d=p=!1)}function m(e){e&&(g(),n+=e)}for(;!function e(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)return void m(n);var r,i=t.getAttribute("cm-marker");if(i){var o=u.findMarks(lt(c,0),lt(h+1,0),(a=+i,function(e){return e.id==a}));return void(o.length&&(r=o[0].find(0))&&m(Je(u.doc,r.from,r.to).join(f)))}if("false"==t.getAttribute("contenteditable"))return;var l=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;l&&g();for(var s=0;s<t.childNodes.length;s++)e(t.childNodes[s]);/^(pre|p)$/i.test(t.nodeName)&&(p=!0),l&&(d=!0)}else 3==t.nodeType&&m(t.nodeValue.replace(/\u200b/g,"").replace(/\u00a0/g," "));var a}(e),e!=t;)e=e.nextSibling,p=!1;return n}(r,n,c,t,a)),d=Je(r.doc,lt(t,0),lt(a,Qe(r.doc,a).text.length));1<h.length&&1<d.length;)if($(h)==$(d))h.pop(),d.pop(),a--;else{if(h[0]!=d[0])break;h.shift(),d.shift(),t++}for(var f=0,p=0,g=h[0],m=d[0],v=Math.min(g.length,m.length);f<v&&g.charCodeAt(f)==m.charCodeAt(f);)++f;for(var y=$(h),b=$(d),w=Math.min(y.length-(1==h.length?f:0),b.length-(1==d.length?f:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==d.length&&t==l.line)for(;f&&f>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)f--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(f).replace(/\u200b+$/,"");var x=lt(t,f),C=lt(a,d.length?$(d).length-p:0);return 1<h.length||h[0]||st(x,C)?(to(r.doc,h,x,C,"+input"),!0):void 0},Ml.prototype.ensurePolled=function(){this.forceCompositionEnd()},Ml.prototype.reset=function(){this.forceCompositionEnd()},Ml.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Ml.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Ml.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Br(this.cm,function(){return ir(e.cm)})},Ml.prototype.setUneditable=function(e){e.contentEditable="false"},Ml.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Gr(this.cm,bl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Ml.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Ml.prototype.onContextMenu=function(){},Ml.prototype.resetPosition=function(){},Ml.prototype.needsContentAttribute=!0;function Dl(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new z,this.hasSelection=!1,this.composing=null}var Wl,Hl,Fl,Pl,El;function Il(e,t,r,n){Wl.defaults[e]=t,r&&(Hl[e]=n?function(e,t,n){n!=ul&&r(e,t,n)}:r)}Dl.prototype.init=function(n){var e=this,r=this,i=this.cm;this.createField(n);var o=this.textarea;function t(e){if(!Le(i,e)){if(i.somethingSelected())yl({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=Cl(i);yl({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,V):(r.prevInput="",o.value=t.text.join("\n"),P(o))}"cut"==e.type&&(i.state.cutIncoming=+new Date)}}n.wrapper.insertBefore(this.wrapper,n.wrapper.firstChild),a&&(o.style.width="0px"),we(o,"input",function(){x&&9<=C&&e.hasSelection&&(e.hasSelection=null),r.poll()}),we(o,"paste",function(e){Le(i,e)||wl(e,i)||(i.state.pasteIncoming=+new Date,r.fastPoll())}),we(o,"cut",t),we(o,"copy",t),we(n.scroller,"paste",function(e){if(!bn(n,e)&&!Le(i,e)){if(!o.dispatchEvent)return i.state.pasteIncoming=+new Date,void r.focus();var t=new Event("paste");t.clipboardData=e.clipboardData,o.dispatchEvent(t)}}),we(n.lineSpace,"selectstart",function(e){bn(n,e)||Ne(e)}),we(o,"compositionstart",function(){var e=i.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}}),we(o,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Dl.prototype.createField=function(e){this.wrapper=Ll(),this.textarea=this.wrapper.firstChild},Dl.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},Dl.prototype.prepareSelection=function(){var e,t,n,r=this.cm,i=r.display,o=r.doc,l=cr(r);return r.options.moveInputWithCursor&&(e=Vn(r,o.sel.primary().head,"div"),t=i.wrapper.getBoundingClientRect(),n=i.lineDiv.getBoundingClientRect(),l.teTop=Math.max(0,Math.min(i.wrapper.clientHeight-10,e.top+n.top-t.top)),l.teLeft=Math.max(0,Math.min(i.wrapper.clientWidth-10,e.left+n.left-t.left))),l},Dl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Dl.prototype.reset=function(e){var t,n;this.contextMenuPending||this.composing||((t=this.cm).somethingSelected()?(this.prevInput="",n=t.getSelection(),this.textarea.value=n,t.state.focused&&P(this.textarea),x&&9<=C&&(this.hasSelection=n)):e||(this.prevInput=this.textarea.value="",x&&9<=C&&(this.hasSelection=null)))},Dl.prototype.getField=function(){return this.textarea},Dl.prototype.supportsTouch=function(){return!1},Dl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!d||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Dl.prototype.blur=function(){this.textarea.blur()},Dl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Dl.prototype.receivedFocus=function(){this.slowPoll()},Dl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Dl.prototype.fastPoll=function(){var t=!1,n=this;n.pollingFast=!0,n.polling.set(20,function e(){n.poll()||t?(n.pollingFast=!1,n.slowPoll()):(t=!0,n.polling.set(60,e))})},Dl.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||ze(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(x&&9<=C&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,s=Math.min(r.length,i.length);l<s&&r.charCodeAt(l)==i.charCodeAt(l);)++l;return Br(t,function(){bl(t,i.slice(l),r.length-l,null,e.composing?"*compose":null),1e3<i.length||-1<i.indexOf("\n")?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Dl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Dl.prototype.onKeyPress=function(){x&&9<=C&&(this.hasSelection=null),this.fastPoll()},Dl.prototype.onContextMenu=function(e){var n=this,r=n.cm,i=r.display,o=n.textarea;n.contextMenuPending&&n.contextMenuPending();var l,s,t,a,u,c=nr(r,e),h=i.scroller.scrollTop;function d(){var e,t;null!=o.selectionStart&&(t="​"+((e=r.somethingSelected())?o.value:""),o.value="⇚",o.value=t,n.prevInput=e?"":"​",o.selectionStart=1,o.selectionEnd=t.length,i.selForContextMenu=r.doc.sel)}function f(){var e,t;n.contextMenuPending==f&&(n.contextMenuPending=!1,n.wrapper.style.cssText=s,o.style.cssText=l,x&&C<9&&i.scrollbars.setScrollTop(i.scroller.scrollTop=h),null!=o.selectionStart&&((!x||x&&C<9)&&d(),e=0,t=function(){i.selForContextMenu==r.doc.sel&&0==o.selectionStart&&0<o.selectionEnd&&"​"==n.prevInput?Gr(r,_i)(r):e++<10?i.detectingSelectAll=setTimeout(t,500):(i.selForContextMenu=null,i.input.reset())},i.detectingSelectAll=setTimeout(t,200)))}c&&!m&&(r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(c)&&Gr(r,Bi)(r.doc,di(c),V),l=o.style.cssText,s=n.wrapper.style.cssText,t=n.wrapper.offsetParent.getBoundingClientRect(),n.wrapper.style.cssText="position: static",o.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-t.top-5)+"px; left: "+(e.clientX-t.left-5)+"px;\n z-index: 1000; background: "+(x?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",v&&(a=window.scrollY),i.input.focus(),v&&window.scrollTo(null,a),i.input.reset(),r.somethingSelected()||(o.value=n.prevInput=" "),n.contextMenuPending=f,i.selForContextMenu=r.doc.sel,clearTimeout(i.detectingSelectAll),x&&9<=C&&d(),S?(De(e),u=function(){Ce(window,"mouseup",u),setTimeout(f,20)},we(window,"mouseup",u)):setTimeout(f,50))},Dl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e,this.textarea.readOnly=!!e},Dl.prototype.setUneditable=function(){},Dl.prototype.needsContentAttribute=!1,Hl=(Wl=pl).optionHandlers,Wl.defineOption=Il,Wl.Init=ul,Il("value","",function(e,t){return e.setValue(t)},!0),Il("mode",null,function(e,t){e.doc.modeOption=t,vi(e)},!0),Il("indentUnit",2,vi,!0),Il("indentWithTabs",!1),Il("smartIndent",!0),Il("tabSize",4,function(e){yi(e),En(e),ir(e)},!0),Il("lineSeparator",null,function(e,r){if(e.doc.lineSep=r){var i=[],o=e.doc.first;e.doc.iter(function(e){for(var t=0;;){var n=e.text.indexOf(r,t);if(-1==n)break;t=n+r.length,i.push(lt(o,n))}o++});for(var t=i.length-1;0<=t;t--)to(e.doc,r,i[t],lt(i[t].line,i[t].ch+r.length))}}),Il("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=ul&&e.refresh()}),Il("specialCharPlaceholder",en,function(e){return e.refresh()},!0),Il("electricChars",!0),Il("inputStyle",d?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Il("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),Il("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),Il("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),Il("rtlMoveVisually",!p),Il("wholeLineUpdateBefore",!0),Il("theme","default",function(e){al(e),ni(e)},!0),Il("keyMap","default",function(e,t,n){var r=Eo(t),i=n!=ul&&Eo(n);i&&i.detach&&i.detach(e,r),r.attach&&r.attach(e,i||null)}),Il("extraKeys",null),Il("configureMouse",null),Il("lineWrapping",!1,fl,!0),Il("gutters",[],function(e,t){e.display.gutterSpecs=ei(t,e.options.lineNumbers),ni(e)},!0),Il("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?Jn(e.display)+"px":"0",e.refresh()},!0),Il("coverGutterNextToScrollbar",!1,function(e){return Hr(e)},!0),Il("scrollbarStyle","native",function(e){Er(e),Hr(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),Il("lineNumbers",!1,function(e,t){e.display.gutterSpecs=ei(e.options.gutters,t),ni(e)},!0),Il("firstLineNumber",1,ni,!0),Il("lineNumberFormatter",function(e){return e},ni,!0),Il("showCursorWhenSelecting",!1,ur,!0),Il("resetSelectionOnContextMenu",!0),Il("lineWiseCopyCut",!0),Il("pasteLinesPerSelection",!0),Il("selectionsMayTouch",!1),Il("readOnly",!1,function(e,t){"nocursor"==t&&(vr(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),Il("screenReaderLabel",null,function(e,t){t=""===t?null:t,e.display.input.screenReaderLabelChanged(t)}),Il("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),Il("dragDrop",!0,dl),Il("allowDropFileTypes",null),Il("cursorBlinkRate",530),Il("cursorScrollMargin",0),Il("cursorHeight",1,ur,!0),Il("singleCursorHeightPerLine",!0,ur,!0),Il("workTime",100),Il("workDelay",100),Il("flattenSpans",!0,yi,!0),Il("addModeClass",!1,yi,!0),Il("pollInterval",100),Il("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),Il("historyEventDelay",1250),Il("viewportMargin",10,function(e){return e.refresh()},!0),Il("maxHighlightLength",1e4,yi,!0),Il("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),Il("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),Il("autofocus",null),Il("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),Il("phrases",null),Pl=(Fl=pl).optionHandlers,El=Fl.helpers={},Fl.prototype={constructor:Fl,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var n=this.options,r=n[e];n[e]==t&&"mode"!=e||(n[e]=t,Pl.hasOwnProperty(e)&&Gr(this,Pl[e])(this,t,r),Se(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Eo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;n<t.length;++n)if(t[n]==e||t[n].name==e)return t.splice(n,1),!0},addOverlay:Ur(function(e,t){var n=e.token?e:Fl.getMode(this.options,e);if(n.startState)throw new Error("Overlays may not be stateful.");!function(e,t,n){for(var r=0,i=n(t);r<e.length&&n(e[r])<=i;)r++;e.splice(r,0,t)}(this.state.overlays,{mode:n,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,ir(this)}),removeOverlay:Ur(function(e){for(var t=this.state.overlays,n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||"string"==typeof e&&r.name==e)return t.splice(n,1),this.state.modeGen++,void ir(this)}}),indentLine:Ur(function(e,t,n){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),it(this.doc,e)&&ml(this,e,t,n)}),indentSelection:Ur(function(e){for(var t=this.doc.sel.ranges,n=-1,r=0;r<t.length;r++){var i=t[r];if(i.empty())i.head.line>n&&(ml(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Sr(this));else{for(var o=i.from(),l=i.to(),s=Math.max(n,o.line),n=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1,a=s;a<n;++a)ml(this,a,e);var u=this.doc.sel.ranges;0==o.ch&&t.length==u.length&&0<u[r].from().ch&&Ii(this.doc,r,new ci(o,u[r].to()),V)}}}),getTokenAt:function(e,t){return Lt(this,e,t)},getLineTokens:function(e,t){return Lt(this,lt(e),t,!0)},getTokenTypeAt:function(e){e=ft(this.doc,e);var t,n=yt(this,Qe(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var l=r+i>>1;if((l?n[2*l-1]:0)>=o)i=l;else{if(!(n[2*l+1]<o)){t=n[2*l+2];break}r=1+l}}var s=t?t.indexOf("overlay "):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Fl.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!El.hasOwnProperty(t))return n;var r=El[t],i=this.getModeAt(e);if("string"==typeof i[t])r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=r[i[t][o]];l&&n.push(l)}else i.helperType&&r[i.helperType]?n.push(r[i.helperType]):r[i.name]&&n.push(r[i.name]);for(var s=0;s<r._global.length;s++){var a=r._global[s];a.pred(i,this)&&-1==B(n,a.val)&&n.push(a.val)}return n},getStateAfter:function(e,t){var n=this.doc;return bt(this,(e=dt(n,null==e?n.first+n.size-1:e))+1,t).state},cursorCoords:function(e,t){var n=this.doc.sel.primary(),r=null==e?n.head:"object"==typeof e?ft(this.doc,e):e?n.from():n.to();return Vn(this,r,t||"page")},charCoords:function(e,t){return Un(this,ft(this.doc,e),t||"page")},coordsChar:function(e,t){return Xn(this,(e=Gn(this,e,t||"page")).left,e.top)},lineAtHeight:function(e,t){return e=Gn(this,{top:e,left:0},t||"page").top,rt(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,n){var r,i=!1,o="number"==typeof e?(r=this.doc.first+this.doc.size-1,e<this.doc.first?e=this.doc.first:r<e&&(e=r,i=!0),Qe(this.doc,e)):e;return Bn(this,o,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-Xt(o):0)},defaultTextHeight:function(){return qn(this.display)},defaultCharWidth:function(){return Zn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o,l,s,a,u,c=this.display,h=(e=Vn(this,ft(this.doc,e))).bottom,d=e.left;t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),c.sizer.appendChild(t),"over"==r?h=e.top:"above"!=r&&"near"!=r||(o=Math.max(c.wrapper.clientHeight,this.doc.height),l=Math.max(c.sizer.clientWidth,c.lineSpace.clientWidth),("above"==r||e.bottom+t.offsetHeight>o)&&e.top>t.offsetHeight?h=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=o&&(h=e.bottom),d+t.offsetWidth>l&&(d=l-t.offsetWidth)),t.style.top=h+"px",t.style.left=t.style.right="","right"==i?(d=c.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?d=0:"middle"==i&&(d=(c.sizer.clientWidth-t.offsetWidth)/2),t.style.left=d+"px"),n&&(s=this,a={left:d,top:h,right:d+t.offsetWidth,bottom:h+t.offsetHeight},null!=(u=xr(s,a)).scrollTop&&Mr(s,u.scrollTop),null!=u.scrollLeft&&Ar(s,u.scrollLeft))},triggerOnKeyDown:Ur(Zo),triggerOnKeyPress:Ur(Jo),triggerOnKeyUp:Qo,triggerOnMouseDown:Ur(rl),execCommand:function(e){if(Uo.hasOwnProperty(e))return Uo[e].call(null,this)},triggerElectric:Ur(function(e){xl(this,e)}),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=ft(this.doc,e),l=0;l<t&&!(o=kl(this.doc,o,i,n,r)).hitSide;++l);return o},moveH:Ur(function(t,n){var r=this;this.extendSelectionsBy(function(e){return r.display.shift||r.doc.extend||e.empty()?kl(r.doc,e.head,t,n,r.options.rtlMoveVisually):t<0?e.from():e.to()},j)}),deleteH:Ur(function(n,r){var e=this.doc.sel,i=this.doc;e.somethingSelected()?i.replaceSelection("",null,"+delete"):Io(this,function(e){var t=kl(i,e.head,n,r,!1);return n<0?{from:t,to:e.head}:{from:e.head,to:t}})}),findPosV:function(e,t,n,r){var i=1,o=r;t<0&&(i=-1,t=-t);for(var l=ft(this.doc,e),s=0;s<t;++s){var a=Vn(this,l,"div");if(null==o?o=a.left:a.left=o,(l=Tl(this,a,i,n)).hitSide)break}return l},moveV:Ur(function(r,i){var o=this,l=this.doc,s=[],a=!this.display.shift&&!l.extend&&l.sel.somethingSelected();if(l.extendSelectionsBy(function(e){if(a)return r<0?e.from():e.to();var t=Vn(o,e.head,"div");null!=e.goalColumn&&(t.left=e.goalColumn),s.push(t.left);var n=Tl(o,t,r,i);return"page"==i&&e==l.sel.primary()&&Cr(o,Un(o,n,"div").top-t.top),n},j),s.length)for(var e=0;e<l.sel.ranges.length;e++)l.sel.ranges[e].goalColumn=s[e]}),findWordAt:function(e){var t=Qe(this.doc,e.line).text,n=e.ch,r=e.ch;if(t){var i=this.getHelper(e,"wordChars");"before"!=e.sticky&&r!=t.length||!n?++r:--n;for(var o=t.charAt(n),l=te(o,i)?function(e){return te(e,i)}:/\s/.test(o)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!te(e)};0<n&&l(t.charAt(n-1));)--n;for(;r<t.length&&l(t.charAt(r));)++r}return new ci(lt(e.line,n),lt(e.line,r))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||(((this.state.overwrite=!this.state.overwrite)?H:T)(this.display.cursorDiv,"CodeMirror-overwrite"),Se(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Ur(function(e,t){Lr(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Sn(this)-this.display.barHeight,width:e.scrollWidth-Sn(this)-this.display.barWidth,clientHeight:kn(this),clientWidth:Ln(this)}},scrollIntoView:Ur(function(e,t){var n,r;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:lt(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(r=e,kr(n=this),n.curOp.scrollToPos=r):Tr(this,e.from,e.to,e.margin)}),setSize:Ur(function(e,t){function n(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e}var r=this;null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&Pn(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){or(r,i,"widget");break}++i}),this.curOp.forceUpdate=!0,Se(this,"refresh",this)}),operation:function(e){return Br(this,e)},startOperation:function(){return Rr(this)},endOperation:function(){return zr(this)},refresh:Ur(function(){var e=this.display.cachedTextHeight;ir(this),this.curOp.forceUpdate=!0,En(this),Lr(this,this.doc.scrollLeft,this.doc.scrollTop),qr(this.display),(null==e||.5<Math.abs(e-qn(this.display))||this.options.lineWrapping)&&tr(this),Se(this,"refresh",this)}),swapDoc:Ur(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Ci(this,e),En(this),this.display.input.reset(),Lr(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,un(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Me(Fl),Fl.registerHelper=function(e,t,n){El.hasOwnProperty(e)||(El[e]=Fl[e]={_global:[]}),El[e][t]=n},Fl.registerGlobalHelper=function(e,t,n,r){Fl.registerHelper(e,t,r),El[e]._global.push({pred:n,val:r})};var Rl,zl="iter insert remove copy getEditor constructor".split(" ");for(var Bl in vo.prototype)vo.prototype.hasOwnProperty(Bl)&&B(zl,Bl)<0&&(pl.prototype[Bl]=function(e){return function(){return e.apply(this.doc,arguments)}}(vo.prototype[Bl]));return Me(vo),pl.inputStyles={textarea:Dl,contenteditable:Ml},pl.defineMode=function(e){pl.defaults.mode||"null"==e||(pl.defaults.mode=e),function(e,t){2<arguments.length&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ue[e]=t}.apply(this,arguments)},pl.defineMIME=function(e,t){Ve[e]=t},pl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),pl.defineMIME("text/plain","null"),pl.defineExtension=function(e,t){pl.prototype[e]=t},pl.defineDocExtension=function(e,t){vo.prototype[e]=t},pl.fromTextArea=function(t,n){var e;function r(){t.value=s.getValue()}if((n=n?I(n):{}).value=t.value,!n.tabindex&&t.tabIndex&&(n.tabindex=t.tabIndex),!n.placeholder&&t.placeholder&&(n.placeholder=t.placeholder),null==n.autofocus&&(e=W(),n.autofocus=e==t||null!=t.getAttribute("autofocus")&&e==document.body),t.form&&(we(t.form,"submit",r),!n.leaveSubmitMethodAlone)){var i=t.form,o=i.submit;try{var l=i.submit=function(){r(),i.submit=o,i.submit(),i.submit=l}}catch(e){}}n.finishInit=function(e){e.save=r,e.getTextArea=function(){return t},e.toTextArea=function(){e.toTextArea=isNaN,r(),t.parentNode.removeChild(e.getWrapperElement()),t.style.display="",t.form&&(Ce(t.form,"submit",r),n.leaveSubmitMethodAlone||"function"!=typeof t.form.submit||(t.form.submit=o))}},t.style.display="none";var s=pl(function(e){return t.parentNode.insertBefore(e,t.nextSibling)},n);return s},(Rl=pl).off=Ce,Rl.on=we,Rl.wheelEventPixels=si,Rl.Doc=vo,Rl.splitLines=Re,Rl.countColumn=R,Rl.findColumn=X,Rl.isWordChar=ee,Rl.Pass=U,Rl.signal=Se,Rl.Line=$t,Rl.changeEnd=fi,Rl.scrollbarModel=Pr,Rl.Pos=lt,Rl.cmpPos=st,Rl.modes=Ue,Rl.mimeModes=Ve,Rl.resolveMode=Ke,Rl.getMode=je,Rl.modeExtensions=Xe,Rl.extendMode=Ye,Rl.copyState=_e,Rl.startState=qe,Rl.innerMode=$e,Rl.commands=Uo,Rl.keyMap=Ao,Rl.keyName=Po,Rl.isModifierKey=Ho,Rl.lookupKey=Wo,Rl.normalizeKeyMap=Do,Rl.StringStream=Ze,Rl.SharedTextMarker=po,Rl.TextMarker=ho,Rl.LineWidget=ao,Rl.e_preventDefault=Ne,Rl.e_stopPropagation=Ae,Rl.e_stop=De,Rl.addClass=H,Rl.contains=D,Rl.rmClass=T,Rl.keyNames=ko,pl.version="5.58.2",pl}); diff --git a/plugins/tiddlywiki/codemirror/readme.tid b/plugins/tiddlywiki/codemirror/readme.tid index c254a047f..bc899c1dc 100755 --- a/plugins/tiddlywiki/codemirror/readme.tid +++ b/plugins/tiddlywiki/codemirror/readme.tid @@ -4,4 +4,4 @@ This plugin provides an enhanced text editor component based on [[CodeMirror|htt [[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/codemirror]] -Based on ~CodeMirror version 5.37.0 +Based on ~CodeMirror version 5.58.2 From 4de0dc301bd8188f802ba975e930b6a200bd4ba8 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 12:15:53 +0100 Subject: [PATCH 0887/2376] Rename $:/core/ui/KeyboardShortcut/toggle-sidebar... (#4953) ... to $:/core/ui/KeyboardShortcuts/toggle-sidebar for consistency --- core/ui/KeyboardShortcuts/toggle-sidebar.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/KeyboardShortcuts/toggle-sidebar.tid b/core/ui/KeyboardShortcuts/toggle-sidebar.tid index 09216f470..ab9ef8583 100644 --- a/core/ui/KeyboardShortcuts/toggle-sidebar.tid +++ b/core/ui/KeyboardShortcuts/toggle-sidebar.tid @@ -1,4 +1,4 @@ -title: $:/core/ui/KeyboardShortcut/toggle-sidebar +title: $:/core/ui/KeyboardShortcuts/toggle-sidebar tags: $:/tags/KeyboardShortcut key: ((toggle-sidebar)) From ec70e5c1798e0782c59fb579d8cad49266a2f59e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 12:22:34 +0100 Subject: [PATCH 0888/2376] AdvancedSearch keyboard shortcut: Let the navigator widget handle scrolling (#4955) --- core/ui/KeyboardShortcuts/advanced-search.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/KeyboardShortcuts/advanced-search.tid b/core/ui/KeyboardShortcuts/advanced-search.tid index 997538ecb..6b98006bf 100644 --- a/core/ui/KeyboardShortcuts/advanced-search.tid +++ b/core/ui/KeyboardShortcuts/advanced-search.tid @@ -4,5 +4,5 @@ key: ((advanced-search)) <$navigator story="$:/StoryList" history="$:/HistoryList"> <$action-navigate $to="$:/AdvancedSearch"/> -<$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/AdvancedSearch"] .tc-search input"""/> +<$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/AdvancedSearch"] .tc-search input""" preventScroll="true"/> </$navigator> From ef1b7d619ad450fddc00657a39be5e031aa18c33 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 12:23:18 +0100 Subject: [PATCH 0889/2376] Make ctrl-Enter in sidebar search also focus the AdvancedSearch input (#4941) * Update search.tid * Update Misc.multids * Update search.tid * Update search.tid * Update search.tid * Update search.tid --- core/language/en-GB/Misc.multids | 2 +- core/ui/SideBarSegments/search.tid | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index bc1091910..65d9bfaeb 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -64,7 +64,7 @@ OfficialPluginLibrary: Official ~TiddlyWiki Plugin Library OfficialPluginLibrary/Hint: The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. PluginReloadWarning: Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect RecentChanges/DateFormat: DDth MMM YYYY -Shortcuts/Input/AdvancedSearch/Hint: Open the AdvancedSearch panel from within the sidebar search field +Shortcuts/Input/AdvancedSearch/Hint: Open the ~AdvancedSearch panel from within the sidebar search field Shortcuts/Input/Accept/Hint: Accept the selected item Shortcuts/Input/AcceptVariant/Hint: Accept the selected item (variant) Shortcuts/Input/Cancel/Hint: Clear the input field diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 3235afc6d..bd71b3fcd 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -42,7 +42,7 @@ tags: $:/tags/SideBarSegment \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> -\define advanced-search-actions() <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search/input}}/><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to="$:/AdvancedSearch"/> +\define advanced-search-actions() <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search/input}}/><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to="$:/AdvancedSearch"/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/><$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/AdvancedSearch"] .tc-search input""" preventScroll="true"/> <div class="tc-sidebar-lists tc-sidebar-search"> @@ -66,7 +66,7 @@ tags: $:/tags/SideBarSegment {{$:/core/images/advanced-search-button}} </$button> <$button class="tc-btn-invisible"> -<<delete-state-tiddlers>> +<<delete-state-tiddlers>><$action-sendmessage $message="tm-focus-selector" $param=".tc-search input"/> {{$:/core/images/close-button}} </$button> <<count-popup-button>> From 9fbcdeb29e329cb57cc192f570af5155d0154404 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 1 Nov 2020 12:33:02 +0100 Subject: [PATCH 0890/2376] Import UI: add warning about tiddlers that already exist (#4956) * Added message when tiddler being imported already exists * Refactored some filters into a shared subfilter, optimized macro definitions --- core/language/en-GB/Import.multids | 5 +++-- core/ui/ImportListing.tid | 32 +++++++++++++----------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/core/language/en-GB/Import.multids b/core/language/en-GB/Import.multids index 1b1c6f219..cc2c6c143 100644 --- a/core/language/en-GB/Import.multids +++ b/core/language/en-GB/Import.multids @@ -15,8 +15,9 @@ Listing/Preview/Diff: Diff Listing/Preview/DiffFields: Diff (Fields) Listing/Rename/Tooltip: Rename tiddler before importing Listing/Rename/Prompt: Rename to: -Listing/Rename/ConfirmRename : Rename tiddler -Listing/Rename/CancelRename : Cancel +Listing/Rename/ConfirmRename: Rename tiddler +Listing/Rename/CancelRename: Cancel +Listing/Rename/OverwriteWarning: A tiddler with this title already exists. Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugin Upgrader/Plugins/Suppressed/Version: Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>) Upgrader/Plugins/Upgraded: Upgraded plugin from <<incoming>> to <<upgraded>> diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index 7a551def3..d66cc5d2c 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -2,27 +2,23 @@ title: $:/core/ui/ImportListing \define lingo-base() $:/language/Import/ -\define messageField() -message-$(payloadTiddler)$ +\define messageField() message-$(payloadTiddler)$ + +\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>] + +\define overWriteWarning() +<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/> \end -\define selectionField() -selection-$(payloadTiddler)$ -\end +\define selectionField() selection-$(payloadTiddler)$ -\define renameField() -rename-$(payloadTiddler)$ -\end +\define renameField() rename-$(payloadTiddler)$ \define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$ -\define previewPopupState() -$(currentTiddler)$!!popup-$(payloadTiddler)$ -\end +\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$ -\define renameFieldState() -$(currentTiddler)$!!state-rename-$(payloadTiddler)$ -\end +\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$ \define select-all-actions() <$list filter="[all[current]plugintiddlers[]sort[title]]" variable="payloadTiddler"> @@ -54,13 +50,13 @@ $(currentTiddler)$!!state-rename-$(payloadTiddler)$ <$reveal type="nomatch" state=<<renameFieldState>> text="yes" tag="div"> <$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div" class="tc-flex"> <$button class="tc-btn-invisible tc-btn-dropdown tc-flex-grow-1" set=<<previewPopupState>> setTo="yes"> -<span class="tc-small-gap-right">{{$:/core/images/right-arrow}}</span><$text text={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}}/> +<span class="tc-small-gap-right">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/> </$button> <$button class="tc-btn-invisible tc-small-gap-left" set=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button> </$reveal> <$reveal type="match" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="no"> -<span class="tc-small-gap-right">{{$:/core/images/down-arrow}}</span><$text text={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}}/> +<span class="tc-small-gap-right">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/> </$button> </$reveal> </$reveal> @@ -70,12 +66,13 @@ $(currentTiddler)$!!state-rename-$(payloadTiddler)$ </td> <td> <$view field=<<messageField>>/> +<<overWriteWarning>> </td> </tr> <$reveal type="match" state=<<renameFieldState>> text="yes" tag="tr"> <td colspan="3"> <div class="tc-flex"> -<$edit-text tiddler=<<newImportTitleTiddler>> default={{{[<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]}}} tag="input" class="tc-import-rename tc-flex-grow-1"/><span class="tc-small-gap-left"><$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class="tc-small-gap-right"/></span><$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button> +<$edit-text tiddler=<<newImportTitleTiddler>> default={{{[subfilter<payloadTitleFilter>]}}} tag="input" class="tc-import-rename tc-flex-grow-1"/><span class="tc-small-gap-left"><$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class="tc-small-gap-right"/></span><$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="no" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button> </div> </td> </$reveal> @@ -91,4 +88,3 @@ $(currentTiddler)$!!state-rename-$(payloadTiddler)$ </$list> </tbody> </table> - From a6efc14a7c103d67fca6ad7b8ed577d25881852d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 18:10:19 +0100 Subject: [PATCH 0891/2376] Add keyboard shortcut to change the sidebar layout (#4952) * Create change-sidebar-layout keyboard shortcut * Update shortcuts.multids * Update ShortcutInfo.multids * Update Misc.multids --- core/language/en-GB/Misc.multids | 1 + core/ui/KeyboardShortcuts/change-sidebar-layout.tid | 8 ++++++++ core/wiki/config/ShortcutInfo.multids | 1 + core/wiki/config/shortcuts/shortcuts.multids | 1 + 4 files changed, 11 insertions(+) create mode 100644 core/ui/KeyboardShortcuts/change-sidebar-layout.tid diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 65d9bfaeb..61570f2af 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -72,6 +72,7 @@ Shortcuts/Input/Down/Hint: Select the next item Shortcuts/Input/Tab-Left/Hint: Select the previous Tab Shortcuts/Input/Tab-Right/Hint: Select the next Tab Shortcuts/Input/Up/Hint: Select the previous item +Shortcuts/SidebarLayout/Hint: Change the sidebar layout SystemTiddler/Tooltip: This is a system tiddler SystemTiddlers/Include/Prompt: Include system tiddlers TagManager/Colour/Heading: Colour diff --git a/core/ui/KeyboardShortcuts/change-sidebar-layout.tid b/core/ui/KeyboardShortcuts/change-sidebar-layout.tid new file mode 100644 index 000000000..6c9a45bc5 --- /dev/null +++ b/core/ui/KeyboardShortcuts/change-sidebar-layout.tid @@ -0,0 +1,8 @@ +title: $:/core/ui/KeyboardShortcuts/change-sidebar-layout +tags: $:/tags/KeyboardShortcut +key: ((change-sidebar-layout)) + +<$list filter="[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]" +emptyMessage="""<$action-setfield $tiddler="$:/themes/tiddlywiki/vanilla/options/sidebarlayout" text="fixed-fluid"/>"""> +<$action-setfield $tiddler="$:/themes/tiddlywiki/vanilla/options/sidebarlayout" text="fluid-fixed"/> +</$list> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 000907164..f9206220a 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -5,6 +5,7 @@ advanced-search: {{$:/language/Buttons/AdvancedSearch/Hint}} advanced-search-sidebar: {{$:/language/Shortcuts/Input/AdvancedSearch/Hint}} bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} +change-sidebar-layout: {{$:/language/Shortcuts/SidebarLayout/Hint}} excise: {{$:/language/Buttons/Excise/Hint}} heading-1: {{$:/language/Buttons/Heading1/Hint}} heading-2: {{$:/language/Buttons/Heading2/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 4968dbb5c..5ff799954 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -4,6 +4,7 @@ add-field: enter advanced-search: ctrl-shift-A advanced-search-sidebar: alt-Enter cancel-edit-tiddler: escape +change-sidebar-layout: shift-alt-Down excise: ctrl-E sidebar-search: ctrl-shift-F heading-1: ctrl-1 From e7245a709c703d5ea9931ff3911747bab1486734 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 1 Nov 2020 18:11:46 +0100 Subject: [PATCH 0892/2376] Add string operator enlist-input[] (#4948) * Add string operator titlelist[] * Update strings.js * Update strings.js * Add tests --- core/modules/filters/strings.js | 8 ++++---- editions/test/tiddlers/tests/test-filters.js | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 625acd9a7..38620454c 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -56,14 +56,14 @@ exports.trim = function(source,operator,options) { return result; }; -// makeStringBinaryOperator( -// function(a) {return [$tw.utils.trim(a)];} -// ); - exports.split = makeStringBinaryOperator( function(a,b) {return ("" + a).split(b);} ); +exports["enlist-input"] = makeStringBinaryOperator( + function(a) {return $tw.utils.parseStringArray("" + a);} +); + exports.join = makeStringReducingOperator( function(accumulator,value,operand) { if(accumulator === null) { diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 2d486a181..aa25a1121 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -160,6 +160,13 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[enlist[one two three]addsuffix[!]]").join(",")).toBe("one!,two!,three!"); }); + it("should handle the enlist-input operator", function() { + expect(wiki.filterTiddlers("[[one two three]enlist-input[]]").join(",")).toBe("one,two,three"); + expect(wiki.filterTiddlers("[[one two three]] [[four five six]] +[enlist-input[]]").join(",")).toBe("one,two,three,four,five,six"); + expect(wiki.filterTiddlers("[[one two three]] [[four five six]] [[seven eight]] +[enlist-input[]]").join(",")).toBe("one,two,three,four,five,six,seven,eight"); + expect(wiki.filterTiddlers("[[]] +[enlist-input[]]").join(",")).toBe(""); + }); + it("should handle the then and else operators", function() { expect(wiki.filterTiddlers("[modifier[JoeBloggs]then[Susi]]").join(",")).toBe("Susi"); expect(wiki.filterTiddlers("[!modifier[JoeBloggs]then[Susi]]").join(",")).toBe("Susi,Susi,Susi,Susi,Susi,Susi,Susi,Susi"); From 26ade60e93285060c8fa8485c7f8c5f1ecfd22fd Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 1 Nov 2020 18:12:29 +0100 Subject: [PATCH 0893/2376] Make AdvancedSearch/Filter navigatable by keyboard (#4932) * Make AdvancedSearch/Filter keyboard-driven * Adapt keyboard-driven-input macro for use with... ... AdvancedSearch/Filter Tab * Adjust Filter dropdown for kb-driven AdvancedSearch/Filter * Adjust Clear Button for kb-driven AdvancedSearch/Filter * Adjust Delete Button for kb-driven AdvancedSearch/Filter * Adjust Export Button for kb-driven AdvancedSearch/Filter * Update clear.tid * Avoid editing the wron tiddler * Make cancel-search-actions a bit more sophisticated * Update Filter.tid * Update Filter.tid * Update Filter.tid * Update keyboard-driven-input.tid * Update dropdown.tid * Update dropdown.tid * Update Filter.tid * Update clear.tid * Update delete.tid * Update dropdown.tid * Update export.tid * Update clear.tid * Update Shadows.tid * Update Standard.tid * Update Shadows.tid * Update System.tid * Update Filter.tid * Update keyboard-driven-input.tid --- core/ui/AdvancedSearch/Filter.tid | 20 ++++++++++++++++--- .../ui/AdvancedSearch/FilterButtons/clear.tid | 3 ++- .../AdvancedSearch/FilterButtons/dropdown.tid | 2 +- core/ui/AdvancedSearch/Shadows.tid | 14 ++++++------- core/ui/AdvancedSearch/Standard.tid | 12 +++++------ core/ui/AdvancedSearch/System.tid | 12 +++++------ core/wiki/macros/keyboard-driven-input.tid | 7 ++++--- 7 files changed, 43 insertions(+), 27 deletions(-) diff --git a/core/ui/AdvancedSearch/Filter.tid b/core/ui/AdvancedSearch/Filter.tid index e55e9e03b..e1c499817 100644 --- a/core/ui/AdvancedSearch/Filter.tid +++ b/core/ui/AdvancedSearch/Filter.tid @@ -4,13 +4,23 @@ caption: {{$:/language/Search/Filter/Caption}} \define lingo-base() $:/language/Search/ \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -<$linkcatcher to="$:/temp/advancedsearch"> + +\define cancel-search-actions() <$set name="userInput" value={{{ [<__storeTitle__>get[text]] }}}><$list filter="[<__tiddler__>get[text]match<userInput>]" emptyMessage="""<$action-setfield $tiddler=<<__tiddler__>> text=<<userInput>>/><$action-setfield $tiddler=<<__refreshTitle__>> text="yes"/>"""><$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /></$list></$set> + +\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> + +\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> + <<lingo Filter/Hint>> <div class="tc-search tc-advanced-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input" focus={{$:/config/Search/AutoFocus}}/> +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch/input" storeTitle="$:/temp/advancedsearch" + refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" + tag="input" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter="[[$:/temp/advancedsearch]]" firstSearchFilterField="text" + inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> + inputCancelActions=<<cancel-search-actions>>/> </$keyboard> </$keyboard> <$list filter="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]"><$transclude/></$list> @@ -20,7 +30,11 @@ caption: {{$:/language/Search/Filter/Caption}} <$set name="resultCount" value="""<$count filter={{$:/temp/advancedsearch}}/>"""> <div class="tc-search-results"> <<lingo Filter/Matches>> -<$list filter={{$:/temp/advancedsearch}} template="$:/core/ui/ListItemTemplate"/> +<$list filter={{$:/temp/advancedsearch}}> +<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}> +<$transclude tiddler="$:/core/ui/ListItemTemplate"/> +</span> +</$list> </div> </$set> </$reveal> diff --git a/core/ui/AdvancedSearch/FilterButtons/clear.tid b/core/ui/AdvancedSearch/FilterButtons/clear.tid index 3dd22e03d..8bfb855a5 100644 --- a/core/ui/AdvancedSearch/FilterButtons/clear.tid +++ b/core/ui/AdvancedSearch/FilterButtons/clear.tid @@ -3,7 +3,8 @@ tags: $:/tags/AdvancedSearch/FilterButton <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> -<$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/> +<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> +<$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input""" /> {{$:/core/images/close-button}} </$button> </$reveal> diff --git a/core/ui/AdvancedSearch/FilterButtons/dropdown.tid b/core/ui/AdvancedSearch/FilterButtons/dropdown.tid index cd6351f7b..d106cba3d 100644 --- a/core/ui/AdvancedSearch/FilterButtons/dropdown.tid +++ b/core/ui/AdvancedSearch/FilterButtons/dropdown.tid @@ -9,7 +9,7 @@ tags: $:/tags/AdvancedSearch/FilterButton <$reveal state=<<qualify "$:/state/filterDropdown">> type="popup" position="belowleft" animate="yes"> <$set name="tv-show-missing-links" value="yes"> -<$linkcatcher to="$:/temp/advancedsearch"> +<$linkcatcher actions="""<$action-setfield $tiddler="$:/temp/advancedsearch" text=<<navigateTo>>/><$action-setfield $tiddler="$:/temp/advancedsearch/input" text=<<navigateTo>>/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/><$action-sendmessage $message="tm-focus-selector" $param='.tc-advanced-search input' />"""> <div class="tc-block-dropdown-wrapper"> <div class="tc-block-dropdown tc-edit-type-dropdown"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/Filter]]"><$link to={{!!filter}}><$transclude field="description"/></$link> diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index b31646dc5..40b34263f 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -7,7 +7,7 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> +\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> @@ -18,7 +18,7 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch" storeTitle="$:/temp/advancedsearch/input" +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch/input" storeTitle="$:/temp/advancedsearch" refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter="[[$:/core/ui/AdvancedSearch/Shadows]]" inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> @@ -33,17 +33,17 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ </$reveal> </div> -<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> +<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> -<$list filter="[{$:/temp/advancedsearch/input}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$list filter="[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$set name="resultCount" value="""<$count filter="[all[shadows]search{$:/temp/advancedsearch/input}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]"/>"""> +<$set name="resultCount" value="""<$count filter="[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]"/>"""> <div class="tc-search-results"> <<lingo Shadows/Matches>> -<$list filter="[all[shadows]search{$:/temp/advancedsearch/input}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]"> +<$list filter="[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]"> <span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}> <$transclude tiddler="$:/core/ui/ListItemTemplate"/> </span> @@ -57,6 +57,6 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ </$reveal> -<$reveal state="$:/temp/advancedsearch/input" type="match" text=""> +<$reveal state="$:/temp/advancedsearch" type="match" text=""> </$reveal> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index 2dbf21ea7..65bea8850 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -7,7 +7,7 @@ caption: {{$:/language/Search/Standard/Caption}} \define next-search-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/advancedsearch" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/advancedsearch/standard/currentTab" text=<<nextTab>>/>"""/> -\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> +\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> @@ -20,7 +20,7 @@ caption: {{$:/language/Search/Standard/Caption}} <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$keyboard key="shift-alt-Right" actions=<<next-search-tab>>> <$keyboard key="shift-alt-Left" actions=<<next-search-tab "before">>> -<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch" storeTitle="$:/temp/advancedsearch/input" +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch/input" storeTitle="$:/temp/advancedsearch" refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> @@ -30,7 +30,7 @@ caption: {{$:/language/Search/Standard/Caption}} </$keyboard> </$keyboard> </$keyboard> -<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> +<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> <<cancel-search-actions>> {{$:/core/images/close-button}} @@ -38,9 +38,9 @@ caption: {{$:/language/Search/Standard/Caption}} </$reveal> </div> -<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> -<$list filter="[{$:/temp/advancedsearch/input}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$vars userInput={{{ [[$:/temp/advancedsearch/input]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState="$:/temp/advancedsearch/selected-item"> +<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> +<$list filter="[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$vars userInput={{{ [[$:/temp/advancedsearch]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState="$:/temp/advancedsearch/selected-item"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]" emptyMessage=""" <$list filter="[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]"> <$transclude/> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index d3f103278..9f6c84803 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -6,7 +6,7 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te \define lingo-base() $:/language/Search/ \define set-next-input-tab(beforeafter:"after",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> +\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> @@ -17,7 +17,7 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch" storeTitle="$:/temp/advancedsearch/input" +<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/advancedsearch/input" storeTitle="$:/temp/advancedsearch" refreshTitle="$:/temp/advancedsearch/refresh" selectionStateTitle="$:/temp/advancedsearch/selected-item" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter="[[$:/core/ui/AdvancedSearch/System]]" inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> @@ -32,17 +32,17 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te </$reveal> </div> -<$reveal state="$:/temp/advancedsearch/input" type="nomatch" text=""> +<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> -<$list filter="[{$:/temp/advancedsearch/input}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> +<$list filter="[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> -<$set name="resultCount" value="""<$count filter="[is[system]search{$:/temp/advancedsearch/input}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]"/>"""> +<$set name="resultCount" value="""<$count filter="[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]"/>"""> <div class="tc-search-results"> <<lingo System/Matches>> -<$list filter="[is[system]search{$:/temp/advancedsearch/input}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]"> +<$list filter="[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]"> <span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}> <$transclude tiddler="$:/core/ui/ListItemTemplate"/> </span> diff --git a/core/wiki/macros/keyboard-driven-input.tid b/core/wiki/macros/keyboard-driven-input.tid index a2ce713da..9a172c904 100644 --- a/core/wiki/macros/keyboard-driven-input.tid +++ b/core/wiki/macros/keyboard-driven-input.tid @@ -25,10 +25,10 @@ $actions$ <$list filter="[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]" variable="ignore"> <$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}> <$set name="configTiddler" value={{{ [subfilter<__configTiddlerFilter__>] }}}> -<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]] }}}> +<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}> <$set name="filteredList" filter="[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]"> <$set name="nextItem" value={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}}> -<$list filter="[<nextItem>minlength[1]]"> +<$list filter="[<nextItem>minlength[1]]" variable="ignore"> <$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/> <$list filter="[<__index__>match[]]"> <$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/> @@ -46,7 +46,8 @@ $actions$ </$list> \end -\define keyboard-driven-input(tiddler,storeTitle,field:"text",index:"",tag:"input",type,focus:"",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:"",default:"",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:"0",refreshTitle,selectionStateTitle,cancelPopups:"",configTiddlerFilter) +\define keyboard-driven-input(tiddler,storeTitle,field:"text",index:"",tag:"input",type,focus:"",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:"",default:"",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:"0",refreshTitle,selectionStateTitle,cancelPopups:"",configTiddlerFilter,firstSearchFilterField:"first-search-filter",secondSearchFilterField:"second-search-filter") +\whitespace trim <$keyboard key="((input-accept))" actions=<<__inputAcceptActions__>>> <$keyboard key="((input-accept-variant))" actions=<<__inputAcceptVariantActions__>>> <$keyboard key="((input-up))" actions=<<input-next-actions "before" "reverse[]">>> From e9a635dc81d38448483cb9acfc51578a6f9cc97b Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 1 Nov 2020 18:13:52 +0100 Subject: [PATCH 0894/2376] Added intersection filter run prefix (#4959) --- .../modules/filterrunprefixes/intersection.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 core/modules/filterrunprefixes/intersection.js diff --git a/core/modules/filterrunprefixes/intersection.js b/core/modules/filterrunprefixes/intersection.js new file mode 100644 index 000000000..2874125d4 --- /dev/null +++ b/core/modules/filterrunprefixes/intersection.js @@ -0,0 +1,30 @@ +/*\ +title: $:/core/modules/filterrunprefixes/intersection.js +type: application/javascript +module-type: filterrunprefix + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.intersection = function(operationSubFunction) { + return function(results,source,widget) { + if(results.length !== 0) { + var secondRunResults = operationSubFunction(source,widget); + var firstRunResults = results.splice(0); + $tw.utils.each(firstRunResults,function(title) { + if(secondRunResults.indexOf(title) !== -1) { + results.push(title); + } + }); + } + }; +}; + +})(); \ No newline at end of file From 42b965c9f023c57609d0f2e56db840544c5d960c Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Sun, 1 Nov 2020 18:14:42 +0100 Subject: [PATCH 0895/2376] Init less parsers (#4954) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * Don't override browser selection colours by default Reverts some of #4590 * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * list-widget, init new Parser() only if needed. * fix braces Co-authored-by: jeremy@jermolene.com <jeremy@jermolene.com> --- core/modules/widgets/list.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/list.js b/core/modules/widgets/list.js index f4981df33..786ce42a9 100755 --- a/core/modules/widgets/list.js +++ b/core/modules/widgets/list.js @@ -87,8 +87,14 @@ ListWidget.prototype.getTiddlerList = function() { }; ListWidget.prototype.getEmptyMessage = function() { - var emptyMessage = this.getAttribute("emptyMessage",""), - parser = this.wiki.parseText("text/vnd.tiddlywiki",emptyMessage,{parseAsInline: true}); + var parser, + emptyMessage = this.getAttribute("emptyMessage",""); + // this.wiki.parseText() calls + // new Parser(..), which should only be done, if needed, because it's heavy! + if (emptyMessage === "") { + return []; + } + parser = this.wiki.parseText("text/vnd.tiddlywiki",emptyMessage,{parseAsInline: true}); if(parser) { return parser.tree; } else { From 9453c4d6843336d7b7e83d323fc05dc42dc67fe5 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Mon, 2 Nov 2020 01:15:27 +0800 Subject: [PATCH 0896/2376] Add chinese translations for `Listing/Rename/OverwriteWarning` (#4960) --- languages/zh-Hans/Import.multids | 1 + languages/zh-Hant/Import.multids | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/Import.multids b/languages/zh-Hans/Import.multids index 810993fde..247c2e68c 100644 --- a/languages/zh-Hans/Import.multids +++ b/languages/zh-Hans/Import.multids @@ -17,6 +17,7 @@ Listing/Rename/Prompt: 重新命名为: Listing/Rename/Tooltip: 导入前重新命名条目 Listing/Rename/ConfirmRename: 重新命名条目 Listing/Rename/CancelRename: 取消 +Listing/Rename/OverwriteWarning: 具有此标题的条目已存在。 Upgrader/Plugins/Suppressed/Incompatible: 封锁的不兼容或过时插件 Upgrader/Plugins/Suppressed/Version: 封锁的插件 (由于传入的 <<incoming>> 较现有版本 <<existing>> 旧) Upgrader/Plugins/Upgraded: 升级插件,从 <<incoming>> 到 <<upgraded>> diff --git a/languages/zh-Hant/Import.multids b/languages/zh-Hant/Import.multids index e038ff428..4c6b5d3d5 100644 --- a/languages/zh-Hant/Import.multids +++ b/languages/zh-Hant/Import.multids @@ -17,6 +17,7 @@ Listing/Rename/Prompt: 重新命名為: Listing/Rename/Tooltip: 導入前重新命名條目 Listing/Rename/ConfirmRename: 重新命名條目 Listing/Rename/CancelRename: 取消 +Listing/Rename/OverwriteWarning: 具有此標題的條目已存在。 Upgrader/Plugins/Suppressed/Incompatible: 封鎖的不相容或過時插件 Upgrader/Plugins/Suppressed/Version: 封鎖的插件 (由於傳入的 <<incoming>> 較現有版本 <<existing>> 舊) Upgrader/Plugins/Upgraded: 升級插件,從 <<incoming>> 到 <<upgraded>> From 2818f52f958a89bcbb018e5b92dffa1830d4e513 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Mon, 2 Nov 2020 17:17:09 +0800 Subject: [PATCH 0897/2376] Add chinese translations for `Shortcuts/SidebarLayout/Hint` (#4962) --- languages/zh-Hans/Misc.multids | 1 + languages/zh-Hant/Misc.multids | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 06796a998..9349c1157 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -72,6 +72,7 @@ Shortcuts/Input/Down/Hint: 选择下一个项目 Shortcuts/Input/Tab-Left/Hint: 选择上一个页签 Shortcuts/Input/Tab-Right/Hint: 选择下一个页签 Shortcuts/Input/Up/Hint: 选择前一个项目 +Shortcuts/SidebarLayout/Hint: 更改侧边栏布局 SystemTiddler/Tooltip: 此为系统条目 SystemTiddlers/Include/Prompt: 包括系统条目 TagManager/Colour/Heading: 颜色 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index 6296db34a..e4c739830 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -72,6 +72,7 @@ Shortcuts/Input/Down/Hint: 選擇下一個項目 Shortcuts/Input/Tab-Left/Hint: 選擇上一個頁籤 Shortcuts/Input/Tab-Right/Hint: 選擇下一個頁籤 Shortcuts/Input/Up/Hint: 選擇前一個項目 +Shortcuts/SidebarLayout/Hint: 更改側邊欄版面 SystemTiddler/Tooltip: 此為系統條目 SystemTiddlers/Include/Prompt: 包括系統條目 TagManager/Colour/Heading: 顏色 From f29d24a1f51b9551a629fe42ce35bb3255ab5895 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 2 Nov 2020 20:04:25 +0100 Subject: [PATCH 0898/2376] Doc updates for keyboard-driven-input (#4963) --- .../tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid | 3 +++ 1 file changed, 3 insertions(+) diff --git a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid index fc4bfaa6b..849aa74bc 100644 --- a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid +++ b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid @@ -16,4 +16,7 @@ The additional parameters are: |inputAcceptVariantActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept-variant}}</kbd> | |inputCancelActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-cancel}}</kbd> | |configTiddlerFilter |a ''filter'' that specifies the tiddler that stores the first item-filter in its <<.field first-search-filter>> field and the second item-filter in its <<.field second-search-filter>> field | +|firstSearchFilterField |the field of the configTiddler where the first search-filter is stored. Defaults to <<.field first-search-filter>> | +|secondSearchFilterField |the field of the configTiddler where the second search-filter is stored. Defaults to <<.field second-search-filter>> | +|filterMinLength |the minimum length of the user input after which items are filtered | From 4a6aa865b32bce781bba1759ba5dcab169ff410e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 2 Nov 2020 20:08:24 +0100 Subject: [PATCH 0899/2376] Make Escape in keyboard-driven-inputs behave like in AdvancedSearch/Filter (#4961) * Create focus-editor.js * Update search.tid * Update link-dropdown.tid * Update search.tid * Update Standard.tid * Update Shadows.tid * Update System.tid * Update fields.tid * Update tag-picker.tid * Update Filter.tid * Update clear.tid * Update link-dropdown.tid * Delete focus-editor.js --- core/ui/AdvancedSearch/Filter.tid | 2 +- core/ui/AdvancedSearch/FilterButtons/clear.tid | 2 +- core/ui/AdvancedSearch/Shadows.tid | 2 +- core/ui/AdvancedSearch/Standard.tid | 2 +- core/ui/AdvancedSearch/System.tid | 2 +- core/ui/EditTemplate/fields.tid | 12 ++++++++++-- core/ui/EditorToolbar/link-dropdown.tid | 16 +++++++++++----- core/ui/SideBarSegments/search.tid | 6 ++---- core/wiki/macros/tag-picker.tid | 18 +++++++++++++++--- plugins/tiddlywiki/menubar/items/search.tid | 8 +++++++- 10 files changed, 50 insertions(+), 20 deletions(-) diff --git a/core/ui/AdvancedSearch/Filter.tid b/core/ui/AdvancedSearch/Filter.tid index e1c499817..232994cc4 100644 --- a/core/ui/AdvancedSearch/Filter.tid +++ b/core/ui/AdvancedSearch/Filter.tid @@ -5,7 +5,7 @@ caption: {{$:/language/Search/Filter/Caption}} \define lingo-base() $:/language/Search/ \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -\define cancel-search-actions() <$set name="userInput" value={{{ [<__storeTitle__>get[text]] }}}><$list filter="[<__tiddler__>get[text]match<userInput>]" emptyMessage="""<$action-setfield $tiddler=<<__tiddler__>> text=<<userInput>>/><$action-setfield $tiddler=<<__refreshTitle__>> text="yes"/>"""><$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /></$list></$set> +\define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> diff --git a/core/ui/AdvancedSearch/FilterButtons/clear.tid b/core/ui/AdvancedSearch/FilterButtons/clear.tid index 8bfb855a5..a524acd24 100644 --- a/core/ui/AdvancedSearch/FilterButtons/clear.tid +++ b/core/ui/AdvancedSearch/FilterButtons/clear.tid @@ -3,7 +3,7 @@ tags: $:/tags/AdvancedSearch/FilterButton <$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$button class="tc-btn-invisible"> -<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /> +<<cancel-search-actions>> <$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input""" /> {{$:/core/images/close-button}} </$button> diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index 40b34263f..1090baaee 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -7,7 +7,7 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> +\define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index 65bea8850..8fdd83d23 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -7,7 +7,7 @@ caption: {{$:/language/Search/Standard/Caption}} \define next-search-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/advancedsearch" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/advancedsearch/standard/currentTab" text=<<nextTab>>/>"""/> -\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> +\define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index 9f6c84803..db4f29151 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -6,7 +6,7 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te \define lingo-base() $:/language/Search/ \define set-next-input-tab(beforeafter:"after",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> -\define cancel-search-actions() <$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" /><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> +\define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 5c025ec82..af059d93c 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -23,12 +23,20 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ \define delete-state-tiddlers() <$action-deletetiddler $filter="[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]"/> -\define cancel-search-actions() -<$list filter="[<__storeTitle__>has[text]] [<__tiddler__>has[text]]" variable="ignore" emptyMessage="""<<delete-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> +\define cancel-search-actions-inner() +<$list filter="[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]" variable="ignore" emptyMessage="""<<delete-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> <<delete-state-tiddlers>> </$list> \end +\define cancel-search-actions() +<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}> +<$list filter="[<newFieldNameTiddler>get[text]!match<userInput>]" emptyMessage="""<<cancel-search-actions-inner>>"""> +<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text="yes"/> +</$list> +</$set> +\end + \define new-field() <$vars name={{{ [<newFieldNameTiddler>get[text]] }}}> <$reveal type="nomatch" text="" default=<<name>>> diff --git a/core/ui/EditorToolbar/link-dropdown.tid b/core/ui/EditorToolbar/link-dropdown.tid index 58f3a0781..96dd99b2a 100644 --- a/core/ui/EditorToolbar/link-dropdown.tid +++ b/core/ui/EditorToolbar/link-dropdown.tid @@ -7,7 +7,13 @@ title: $:/core/ui/EditorToolbar/link-dropdown <$action-deletetiddler $filter="[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]"/> \end -\define cancel-search-actions() <$action-deletetiddler $filter="[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]"/> +\define get-focus-selector() [data-tiddler-title="$(cssEscapedTitle)$"] .tc-create-wikitext-link input + +\define cancel-search-actions-inner() +<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}><$list filter="[<searchTiddler>get[text]!match<userInput>]" emptyMessage="""<$action-deletetiddler $filter="[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]"/>"""><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text="yes"/></$list></$set> +\end + +\define cancel-search-actions() <$list filter="[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]" emptyMessage="""<<cancel-search-actions-inner>>"""><$action-sendmessage $message="tm-edit-text-operation" $param="wrap-selection" prefix="" suffix=""/></$list> \define external-link() <$button class="tc-btn-invisible" style="width: auto; display: inline-block; background-colour: inherit;" actions=<<add-link-actions>>> @@ -24,9 +30,9 @@ title: $:/core/ui/EditorToolbar/link-dropdown <$vars linkTiddler=<<searchTiddler>>> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> -<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> -<$macrocall $name="keyboard-driven-input" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>> filterMinLength={{$:/config/Search/MinLength}} - selectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type="search" +<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">> class="tc-create-wikitext-link"> +<$macrocall $name="keyboard-driven-input" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>> + selectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type="search" filterMinLength="1" tag="input" focus="true" class="tc-popup-handle" inputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default="" configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]" /> @@ -35,7 +41,7 @@ title: $:/core/ui/EditorToolbar/link-dropdown <$reveal tag="span" state=<<storeTitle>> type="nomatch" text=""> <<external-link>> <$button class="tc-btn-invisible" style="width: auto; display: inline-block; background-colour: inherit;"> -<$action-setfield $tiddler=<<searchTiddler>> text="" /> +<<cancel-search-actions>><$set name="cssEscapedTitle" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message="tm-focus-selector" $param=<<get-focus-selector>>/></$set> {{$:/core/images/close-button}} </$button> </$reveal> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index bd71b3fcd..281505b5c 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -32,9 +32,7 @@ tags: $:/tags/SideBarSegment </$vars> \end -\define delete-state-tiddlers() <$action-deletetiddler $filter="[[$:/temp/search]] [<searchTiddler>] [<searchListState>]"/> - -\define cancel-search-actions() <$action-deletetiddler $filter="[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]"/> +\define cancel-search-actions() <$list filter="[<searchTiddler>get[text]!match{$:/temp/search}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/search]] [<searchTiddler>] [<searchListState>]"/>"""><$action-setfield $tiddler="$:/temp/search" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler="$:/temp/search/refresh" text="yes"/></$list> \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> @@ -66,7 +64,7 @@ tags: $:/tags/SideBarSegment {{$:/core/images/advanced-search-button}} </$button> <$button class="tc-btn-invisible"> -<<delete-state-tiddlers>><$action-sendmessage $message="tm-focus-selector" $param=".tc-search input"/> +<<cancel-search-actions>><$action-sendmessage $message="tm-focus-selector" $param=".tc-search input"/> {{$:/core/images/close-button}} </$button> <<count-popup-button>> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index ac92aa24f..f72006541 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -3,6 +3,8 @@ tags: $:/tags/Macro first-search-filter: [tags[]!is[system]search:title<userInput>sort[]] second-search-filter: [tags[]is[system]search:title<userInput>sort[]] +\define get-tagpicker-focus-selector() [data-tiddler-title="$(currentTiddlerCSSEscaped)$"] .tc-add-tag-name input + \define delete-tag-state-tiddlers() <$action-deletetiddler $filter="[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]"/> \define add-tag-actions(actions) @@ -27,12 +29,20 @@ $actions$ </$button> \end -\define clear-tags-actions() -<$list filter="[<__storeTitle__>has[text]] [<__tiddler__>has[text]]" variable="ignore" emptyMessage="""<<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> +\define clear-tags-actions-inner() +<$list filter="[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]" variable="ignore" emptyMessage="""<<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> <<delete-tag-state-tiddlers>> </$list> \end +\define clear-tags-actions() +<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}> +<$list filter="[<newTagNameTiddler>get[text]!match<userInput>]" emptyMessage="""<<clear-tags-actions-inner>>"""> +<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text="yes"/> +</$list> +</$set> +\end + \define tag-picker-inner(actions) \whitespace trim <$vars tagSelectionState=<<qualify "$:/state/selected-tag">> storeTitle=<<qualify "$:/temp/NewTagName/input">> refreshTitle=<<qualify "$:/temp/NewTagName/refresh">> nonSystemTagsFilter="[tags[]!is[system]search:title<userInput>sort[]]" systemTagsFilter="[tags[]is[system]search:title<userInput>sort[]]"> @@ -50,7 +60,9 @@ $actions$ <$button set=<<newTagNameTiddler>> setTo="" class=""> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> $actions$ -<<delete-tag-state-tiddlers>> +<$set name="currentTiddlerCSSEscaped" value={{{ [<currentTiddler>escapecss[]] }}}> +<<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>>/> +</$set> {{$:/language/EditTemplate/Tags/Add/Button}} </$button> </$set> diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid index e4e386be0..4614a3ef1 100644 --- a/plugins/tiddlywiki/menubar/items/search.tid +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -4,7 +4,13 @@ description: Search caption: Search tags: $:/tags/MenuBar -\define cancel-search-actions() <$action-deletetiddler $filter="[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]"/> +\define cancel-search-actions() +<$set name="userInput" value={{{ [<__storeTitle__>get[text]] }}}> +<$list filter="[<__tiddler__>get[text]!match<userInput>]" emptyMessage="""<$action-deletetiddler $filter="[<__storeTitle__>] [<__tiddler__>] [<__selectionStateTitle__>]"/>"""> +<$action-setfield $tiddler=<<__tiddler__>> text=<<userInput>>/><$action-setfield $tiddler=<<__refreshTitle__>> text="yes"/> +</$list> +</$set> +\end \define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> From 2f5f0db00feff9a11aa89ef474848ab94f767937 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 2 Nov 2020 23:49:50 +0100 Subject: [PATCH 0900/2376] Added docs for :intersection filter run prefix (#4967) --- .../filters/syntax/Filter Expression.tid | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index 1b67a98b8..1289e22ad 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20201027185638636 +modified: 20201102224444831 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -17,12 +17,13 @@ A <<.def "filter expression">> is the outermost level of the [[filter syntax|Fil If a run has: * no prefix, its output titles are [[dominantly appended|Dominant Append]] to the filter's output -* <<.from-version "5.1.20">> the prefix `=`, output titles are appended to the filter's output without de-duplication +* the prefix `=`, output titles are appended to the filter's output without de-duplication. <<.from-version "5.1.20">> * the prefix `-`, output titles are <<.em removed>> from the filter's output (if such tiddlers exist) * the prefix `+`, it receives the filter output so far as its input; its output then <<.em "replaces">> all filter output so far and forms the input for the next run -* <<.from-version "5.1.18">> the prefix `~`, if the filter output so far is an empty list then the output titles of the run are [[dominantly appended|Dominant Append]] to the filter's output. If the filter output so far is not an empty list then the run is ignored -* <<.from-version "5.1.23">> named prefixes for filter runs are available. -* <<.from-version "5.1.23">> named prefix `:filter`, it receives the filter output so far as its input. The next run is evaluated for each title of the input, removing every input title for which the output is an empty list. +* the prefix `~`, if the filter output so far is an empty list then the output titles of the run are [[dominantly appended|Dominant Append]] to the filter's output. If the filter output so far is not an empty list then the run is ignored. <<.from-version "5.1.18">> +* named prefixes for filter runs are available. <<.from-version "5.1.23">> +* named prefix `:filter`, it receives the filter output so far as its input. The next run is evaluated for each title of the input, removing every input title for which the output is an empty list. <<.from-version "5.1.23">> +* named prefix `:intersection` replaces all filter output so far with titles that are present in the output of this run, as well as the output from previous runs. Forms the input for the next run. <<.from-version "5.1.23">> <<.tip "Compare named filter run prefix `:filter` with [[filter Operator]] which applies a subfilter to every input title, removing the titles that return an empty result from the subfilter">> @@ -31,15 +32,16 @@ In technical / logical terms: |!Run |!Equivalent named prefix |!Interpretation |!Output | |`run` |`:or[run]` |de-duplicated union of sets |... OR run | |`=run` |`:all[run]` |union of sets without de-duplication |... OR run | -|`+run` |`:and[run]` |intersection of sets |... AND run | +|`+run` |`:and[run]` |accumulation of filter steps |... AND run | |`-run` |`:except[run]` |difference of sets |... AND NOT run | |`~run` |`:else[run]` |else |... ELSE run | +||`:intersection`|intersection of sets|| The input of a run is normally a list of all the non-[[shadow|ShadowTiddlers]] tiddler titles in the wiki (in no particular order). But the `+` prefix can change this: |Prefix|Input|h -|`-`, `~`, `=` or none| <$link to="all Operator">`[all[]]`</$link> tiddler titles, unless otherwise determined by the first [[filter operator|Filter Operators]]| -|`+`|the filter output of all previous runs so far| +|`-`, `~`, `=`, `:intersection` or none| <$link to="all Operator">`[all[]]`</$link> tiddler titles, unless otherwise determined by the first [[filter operator|Filter Operators]]| +|`+`, `:filter`|the filter output of all previous runs so far| Precisely because of varying inputs, be aware that both prefixes `-` and `+` do not behave inverse to one another! From 70561bd481be6a72ed023f9d03db0cac55987203 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 2 Nov 2020 23:50:22 +0100 Subject: [PATCH 0901/2376] Added docs for enlist-input filter operator (#4966) --- .../filters/enlist-input Operator.tid | 29 +++++++++++++++++++ .../enlist-input Operator (Examples).tid | 8 +++++ 2 files changed, 37 insertions(+) create mode 100644 editions/tw5.com/tiddlers/filters/enlist-input Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid diff --git a/editions/tw5.com/tiddlers/filters/enlist-input Operator.tid b/editions/tw5.com/tiddlers/filters/enlist-input Operator.tid new file mode 100644 index 000000000..3a9dd529a --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/enlist-input Operator.tid @@ -0,0 +1,29 @@ +caption: enlist-input +created: 20201102215459192 +modified: 20201102221854719 +op-input: a [[selection of titles|Title Selection]] +op-output: the titles stored as a [[title list|Title List]] in each input title +op-purpose: select titles by interpreting each input title as a [[title list|Title List]] +tags: [[Filter Operators]] [[String Operators]] [[Selection Constructors]] +title: enlist-input Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> + +<<.tip " Compare with [[enlist|enlist Operator]] operator that interprets its operand as a title list">> + +``` +<$vars days={{{ [[Days of the Week]get[list]] }}}> + +{{{ [enlist<days>] }}} + +</$vars> +``` + +is equivalent to: + +``` +{{{ [[Days of the Week]get[list]enlist-input[]] }}} +``` + +<<.operator-examples "enlist-input">> diff --git a/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid new file mode 100644 index 000000000..6c4355d89 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20201102220519567 +modified: 20201102221137200 +tags: [[enlist-input Operator]] [[Operator Examples]] +title: enlist-input Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[Days of the Week]get[list]enlist-input[]]">> +<<.operator-example 2 "'HelloThere GettingStarted [[Customise TiddlyWiki]]' +[enlist-input[]]">> \ No newline at end of file From d5c4aa250a194c27fe8b0c83ae735836ca83eed2 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 2 Nov 2020 23:52:02 +0100 Subject: [PATCH 0902/2376] Remove dependency on wiki.js for story-startup and navigator (#4200) * Update story.js * Update wiki.js * Update navigator.js * Add deprecation console logs to addToHistory and addToStory --- core/modules/startup/story.js | 9 +++++++-- core/modules/widgets/navigator.js | 9 +++++++-- core/modules/wiki.js | 6 ++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/core/modules/startup/story.js b/core/modules/startup/story.js index 14d45554a..0ca975ce3 100644 --- a/core/modules/startup/story.js +++ b/core/modules/startup/story.js @@ -150,6 +150,11 @@ function openStartupTiddlers(options) { // Save the story list $tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: "", list: storyList},$tw.wiki.getModificationFields()); // Update history + var story = new $tw.Story({ + wiki: $tw.wiki, + storyTitle: DEFAULT_STORY_TITLE, + historyTitle: DEFAULT_HISTORY_TITLE + }); if(!options.disableHistory) { // If a target tiddler was specified add it to the history stack if(target && target !== "") { @@ -157,9 +162,9 @@ function openStartupTiddlers(options) { if(target.indexOf("[[") === 0 && target.substr(-2) === "]]") { target = target.substr(2,target.length - 4); } - $tw.wiki.addToHistory(target); + story.addToHistory(target); } else if(storyList.length > 0) { - $tw.wiki.addToHistory(storyList[0]); + story.addToHistory(storyList[0]); } } } diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index bbbb57cb8..189765396 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -62,6 +62,11 @@ NavigatorWidget.prototype.execute = function() { this.historyTitle = this.getAttribute("history"); this.setVariable("tv-story-list",this.storyTitle); this.setVariable("tv-history-list",this.historyTitle); + this.story = new $tw.Story({ + wiki: this.wiki, + storyTitle: this.storyTitle, + historyTitle: this.historyTitle + }); // Construct the child widgets this.makeChildWidgets(); }; @@ -123,7 +128,7 @@ NavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle NavigatorWidget.prototype.addToStory = function(title,fromTitle) { if(this.storyTitle) { - this.wiki.addToStory(title,fromTitle,this.storyTitle,{ + this.story.addToStory(title,fromTitle,this.storyTitle,{ openLinkFromInsideRiver: this.getAttribute("openLinkFromInsideRiver","top"), openLinkFromOutsideRiver: this.getAttribute("openLinkFromOutsideRiver","top") }); @@ -136,7 +141,7 @@ title: a title string or an array of title strings fromPageRect: page coordinates of the origin of the navigation */ NavigatorWidget.prototype.addToHistory = function(title,fromPageRect) { - this.wiki.addToHistory(title,fromPageRect,this.historyTitle); + this.story.addToHistory(title,fromPageRect,this.historyTitle); }; /* diff --git a/core/modules/wiki.js b/core/modules/wiki.js index c158e6b38..9fb5166b0 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1426,7 +1426,8 @@ historyTitle: title of history tiddler (defaults to $:/HistoryList) */ exports.addToHistory = function(title,fromPageRect,historyTitle) { var story = new $tw.Story({wiki: this, historyTitle: historyTitle}); - story.addToHistory(title,fromPageRect); + story.addToHistory(title,fromPageRect); + console.log("$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!") }; /* @@ -1438,7 +1439,8 @@ options: see story.js */ exports.addToStory = function(title,fromTitle,storyTitle,options) { var story = new $tw.Story({wiki: this, storyTitle: storyTitle}); - story.addToStory(title,fromTitle,options); + story.addToStory(title,fromTitle,options); + console.log("$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!") }; /* From 2bd9cc45fa77bc6b45a99a5ca4da1ed4d8e7b03d Mon Sep 17 00:00:00 2001 From: Miha Lunar <mlunar@gmail.com> Date: Wed, 4 Nov 2020 21:02:17 +0100 Subject: [PATCH 0903/2376] Added more start/end parser ranges --- core/modules/parsers/wikiparser/wikiparser.js | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index 673176038..8d1d28aee 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -165,6 +165,17 @@ WikiParser.prototype.findNextMatch = function(rules,startPos) { return matchingRule; }; +WikiParser.prototype.parseRule = function(rule) { + var start = this.pos; + var blocks = rule.parse(); + for(var i=0; i<blocks.length; i++) { + var block = blocks[i]; + if (block.start !== undefined) block.start = start; + if (block.end !== undefined) block.end = this.pos; + } + return blocks; +}; + /* Parse any pragmas at the beginning of a block of parse text */ @@ -184,7 +195,7 @@ WikiParser.prototype.parsePragmas = function() { break; } // Process the pragma rule - var subTree = nextMatch.rule.parse(); + var subTree = this.parseRule(nextMatch.rule); if(subTree.length > 0) { // Quick hack; we only cope with a single parse tree node being returned, which is true at the moment currentTreeBranch.push.apply(currentTreeBranch,subTree); @@ -208,10 +219,13 @@ WikiParser.prototype.parseBlock = function(terminatorRegExpString) { // Look for a block rule that applies at the current position var nextMatch = this.findNextMatch(this.blockRules,this.pos); if(nextMatch && nextMatch.matchIndex === this.pos) { - return nextMatch.rule.parse(); + return this.parseRule(nextMatch.rule); } // Treat it as a paragraph if we didn't find a block rule - return [{type: "element", tag: "p", children: this.parseInlineRun(terminatorRegExp)}]; + var start = this.pos; + var children = this.parseInlineRun(terminatorRegExp); + var end = this.pos; + return [{type: "element", tag: "p", children, start, end }]; }; /* @@ -287,17 +301,17 @@ WikiParser.prototype.parseInlineRunUnterminated = function(options) { while(this.pos < this.sourceLength && nextMatch) { // Process the text preceding the run rule if(nextMatch.matchIndex > this.pos) { - this.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex)); + this.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex),this.pos,nextMatch.matchIndex); this.pos = nextMatch.matchIndex; } // Process the run rule - tree.push.apply(tree,nextMatch.rule.parse()); + tree.push.apply(tree,this.parseRule(nextMatch.rule)); // Look for the next run rule nextMatch = this.findNextMatch(this.inlineRules,this.pos); } // Process the remaining text if(this.pos < this.sourceLength) { - this.pushTextWidget(tree,this.source.substr(this.pos)); + this.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength); } this.pos = this.sourceLength; return tree; @@ -317,7 +331,7 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option if(terminatorMatch) { if(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) { if(terminatorMatch.index > this.pos) { - this.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index)); + this.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index),this.pos,terminatorMatch.index); } this.pos = terminatorMatch.index; if(options.eatTerminator) { @@ -330,11 +344,11 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option if(inlineRuleMatch) { // Preceding text if(inlineRuleMatch.matchIndex > this.pos) { - this.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex)); + this.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex),this.pos,inlineRuleMatch.matchIndex); this.pos = inlineRuleMatch.matchIndex; } // Process the inline rule - tree.push.apply(tree,inlineRuleMatch.rule.parse()); + tree.push.apply(tree,this.parseRule(inlineRuleMatch.rule)); // Look for the next inline rule inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos); // Look for the next terminator match @@ -344,7 +358,7 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option } // Process the remaining text if(this.pos < this.sourceLength) { - this.pushTextWidget(tree,this.source.substr(this.pos)); + this.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength); } this.pos = this.sourceLength; return tree; @@ -353,12 +367,12 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option /* Push a text widget onto an array, respecting the configTrimWhiteSpace setting */ -WikiParser.prototype.pushTextWidget = function(array,text) { +WikiParser.prototype.pushTextWidget = function(array,text,start,end) { if(this.configTrimWhiteSpace) { text = $tw.utils.trim(text); } if(text) { - array.push({type: "text", text: text}); + array.push({type: "text", text: text, start: start, end: end}); } }; From 4394b8e723f78b3d2562a95155aeb91a3d6bbd5f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 6 Nov 2020 12:27:46 +0000 Subject: [PATCH 0904/2376] Dynannotate: Add example of view template usage --- .../examples/viewtemplate-text.tid | 98 +++++++++++++++++++ .../dynannotate/examples/viewtemplate.tid | 29 ++++++ 2 files changed, 127 insertions(+) create mode 100644 plugins/tiddlywiki/dynannotate/examples/viewtemplate-text.tid create mode 100644 plugins/tiddlywiki/dynannotate/examples/viewtemplate.tid diff --git a/plugins/tiddlywiki/dynannotate/examples/viewtemplate-text.tid b/plugins/tiddlywiki/dynannotate/examples/viewtemplate-text.tid new file mode 100644 index 000000000..15588c420 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/viewtemplate-text.tid @@ -0,0 +1,98 @@ +title: $:/plugins/tiddlywiki/dynannotate/examples/viewtemplate/text + +\define click-annotation-actions() +<$action-setfield $tiddler="$:/temp/dynannotate/demo/annotation-title" $value=<<annotationTiddler>>/> +\end + +\define create-annotation-actions() +<$action-createtiddler + $basetitle="$:/plugins/tiddlywiki/dynannotate/demo-annotation" + $savetitle={{{ [<currentTiddler>addprefix[$:/state/dynannotate/temp-save-title/]] }}} + annotate-tiddler=<<currentTiddler>> + annotate-text=<<text>> + annotate-prefix=<<prefix>> + annotate-suffix=<<suffix>> + annotate-colour=<<colour>> +/> +<$set name="popup-coords" value={{{ [<currentTiddler>addprefix[$:/state/dynannotate/popup-selection/]get[text]] }}}> +<$action-deletetiddler $tiddler={{{ [<currentTiddler>addprefix[$:/state/dynannotate/popup-selection/]] }}}/> +<$action-setfield $tiddler="$:/temp/dynannotate/demo/annotation-title" $value={{{ [<currentTiddler>addprefix[$:/state/dynannotate/temp-save-title/]get[text]] }}}/> +<$action-popup $state={{{ [<currentTiddler>addprefix[$:/state/dynannotate/popup-annotation/]] }}} $coords=<<popup-coords>>/> +</$set> +\end + +<$reveal tag="div" class="tc-tiddler-body" type="nomatch" stateTitle=<<folded-state>> text="hide" retain="yes" animate="yes"> +<$list filter="[all[current]!has[plugin-type]!field:hide-body[yes]]"> +<div style="position:relative;"><!-- Needed for the popups to work --> +<$dynannotate + filter="[all[shadows+tiddlers]!has[draft.of]annotate-tiddler<currentTiddler>]" + actions=<<click-annotation-actions>> + popup={{{ [<currentTiddler>addprefix[$:/state/dynannotate/popup-annotation/]] }}} + selection={{{ [<currentTiddler>addprefix[$:/state/dynannotate/selection/]] }}} + selectionPrefix={{{ [<currentTiddler>addprefix[$:/state/dynannotate/selection-prefix/]] }}} + selectionSuffix={{{ [<currentTiddler>addprefix[$:/state/dynannotate/selection-suffix/]] }}} + selectionPopup={{{ [<currentTiddler>addprefix[$:/state/dynannotate/popup-selection/]] }}} + search={{$:/temp/search}} + searchClass="tc-dynannotation-search-overlay-blurred" + searchMinLength={{$:/config/Search/MinLength}} +> +<$transclude mode="block"> +<$transclude tiddler="$:/language/MissingTiddler/Hint"/> +</$transclude> +</$dynannotate> +<$reveal type="popup" state={{{ [<currentTiddler>addprefix[$:/state/dynannotate/popup-annotation/]] }}} position="belowright" animate="yes" retain="yes" style="overflow-y:hidden;"> +<div class="tc-drop-down-wrapper"> +<div class="tc-drop-down tc-popup-keep" style="max-width:550px;white-space: normal;overflow-y:hidden;"> +<$tiddler tiddler={{$:/temp/dynannotate/demo/annotation-title}}> +<p> +<h2> +This is an annotation +</h2> +</p> +<p> +The annotation is stored in the tiddler: +</p> +<p> +<$link><$view field="title"/></$link> +</p> +<p> +The annotated text is ''<$view field="annotate-text"/>''. +</p> +<p> +Annotation Colour: +<$macrocall $name='colour-picker' actions=""" +<$action-setfield $field="annotate-colour" $value=<<colour-picker-value>>/> +"""/> +</p> +</$tiddler> +</div> +</div> +</$reveal> +<$reveal type="popup" state={{{ [<currentTiddler>addprefix[$:/state/dynannotate/popup-selection/]] }}} position="belowright" animate="yes" retain="yes" style="overflow-y:hidden;"> +<div class="tc-drop-down-wrapper"> +<div class="tc-drop-down tc-popup-keep" style="max-width:550px;white-space:normal;"> +<$vars + text={{{ [<currentTiddler>addprefix[$:/state/dynannotate/selection/]get[text]] }}} + prefix={{{ [<currentTiddler>addprefix[$:/state/dynannotate/selection-prefix/]get[text]] }}} + suffix={{{ [<currentTiddler>addprefix[$:/state/dynannotate/selection-suffix/]get[text]] }}} + colour={{{ [<currentTiddler>addprefix[$:/state/dynannotate/annotation-colour/]get[text]] }}} +> +<$button actions=<<create-annotation-actions>>> +Create annotation +</$button> +<p> +Text: <$text text=<<text>>/> +</p> +<p> +Prefix: <$text text=<<prefix>>/> +</p> +<p> +Suffix: <$text text=<<suffix>>/> +</p> +</$vars> +</div> +</div> +</$reveal> +</div> +</$list> +</$reveal> diff --git a/plugins/tiddlywiki/dynannotate/examples/viewtemplate.tid b/plugins/tiddlywiki/dynannotate/examples/viewtemplate.tid new file mode 100644 index 000000000..5922fd8d3 --- /dev/null +++ b/plugins/tiddlywiki/dynannotate/examples/viewtemplate.tid @@ -0,0 +1,29 @@ +title: $:/plugins/tiddlywiki/dynannotate/examples/viewtemplate +tags: $:/tags/dynannotateExamples +caption: View Template + +<div class="tc-dynannotation-example-info"> + +!! Using Dynannotate in the view template + +This example shows how to override the core view template with a custom template that includes dynannotate. It is disabled by default but can be enabled by clicking the button below. (Clicking the button below copies the custom view template from $:/plugins/tiddlywiki/dynannotate/examples/viewtemplate/text to $:/core/ui/ViewTemplate/body). + +Once enabled, this example demonstrates several features: + +* Highlighting of search results within tiddler bodies +* Creating annotations on any tiddler by selecting text and then clicking a colour in the resulting dropdown + +</div> + +<$button> +<$action-setfield $tiddler="$:/core/ui/ViewTemplate/body" $field="text" $value={{$:/plugins/tiddlywiki/dynannotate/examples/viewtemplate/text}}/> +<$action-setfield $tiddler="$:/core/ui/ViewTemplate/body" $field="tags" $value="$:/tags/ViewTemplate"/> +Click here to use the custom view template +</$button> + +<$button> +<$action-deletetiddler $tiddler="$:/core/ui/ViewTemplate/body"/> +Click here to revert to the core view template +</$button> + +<$codeblock code={{$:/plugins/tiddlywiki/dynannotate/examples/viewtemplate/text}}/> From 22e25c05eb5e5cc5b670a362d1eead1d62dedbb9 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 6 Nov 2020 16:24:05 +0000 Subject: [PATCH 0905/2376] Remove normalize.css's styling of search inputs As discussed here: https://github.com/Jermolene/TiddlyWiki5/issues/4984#issuecomment-723169753 --- test.html | 1 + themes/tiddlywiki/vanilla/base.tid | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 test.html diff --git a/test.html b/test.html new file mode 100644 index 000000000..fb9bea3a5 --- /dev/null +++ b/test.html @@ -0,0 +1 @@ +<input value="Something"/> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index d8093d8b3..b6fe7b94c 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -53,6 +53,10 @@ $else$ -webkit-box-sizing: border-box; } +input[type="search"] { + outline-offset: initial; +} + html button { line-height: 1.2; color: <<colour button-foreground>>; From 78c72b85fbb9e2af7cfbdfe7b833a98178108207 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 6 Nov 2020 17:26:44 +0100 Subject: [PATCH 0906/2376] Make tag for menubar-contents dropdown configurable (#4983) * Make tag for menubar-contents dropdown configurable * Make tag for menubar-contents dropdown configurable * Make tag for menubar-contents dropdown configurable --- plugins/tiddlywiki/menubar/config-TableOfContentsTag.tid | 2 ++ plugins/tiddlywiki/menubar/config.tid | 6 ++++++ plugins/tiddlywiki/menubar/items/contents.tid | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 plugins/tiddlywiki/menubar/config-TableOfContentsTag.tid diff --git a/plugins/tiddlywiki/menubar/config-TableOfContentsTag.tid b/plugins/tiddlywiki/menubar/config-TableOfContentsTag.tid new file mode 100644 index 000000000..4469a9b26 --- /dev/null +++ b/plugins/tiddlywiki/menubar/config-TableOfContentsTag.tid @@ -0,0 +1,2 @@ +title: $:/config/plugins/menubar/TableOfContents/Tag +text: TableOfContents diff --git a/plugins/tiddlywiki/menubar/config.tid b/plugins/tiddlywiki/menubar/config.tid index 9b564ee68..abcb8fcea 100644 --- a/plugins/tiddlywiki/menubar/config.tid +++ b/plugins/tiddlywiki/menubar/config.tid @@ -26,6 +26,12 @@ The breakpoint position between narrow and wide screens. Should include CSS unit <$edit-text tiddler="$:/config/plugins/menubar/breakpoint" default="" tag="input"/> +!! Contents Tag + +The tag for the ~TableOfContents used in the Contents dropdown + +<$edit-text tiddler="$:/config/plugins/menubar/TableOfContents/Tag" default="" tag="input"/> + !! Menu Bar Colours To change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette diff --git a/plugins/tiddlywiki/menubar/items/contents.tid b/plugins/tiddlywiki/menubar/items/contents.tid index 5753679eb..f4fbdb2c2 100644 --- a/plugins/tiddlywiki/menubar/items/contents.tid +++ b/plugins/tiddlywiki/menubar/items/contents.tid @@ -6,6 +6,6 @@ tags: $:/tags/MenuBar <div class="tc-table-of-contents"> -<<toc-selective-expandable 'TableOfContents'>> +<$macrocall $name="toc-selective-expandable" tag={{$:/config/plugins/menubar/TableOfContents/Tag}}/> </div> From 458460354ebb4986ebac863fd00ad70738c7f2b0 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 6 Nov 2020 17:27:41 +0100 Subject: [PATCH 0907/2376] Add delete-field keyboard shortcut (#4978) * Add delete-field keyboard-widget * Update shortcuts.multids * Update ShortcutInfo.multids * Update fields.tid * Update shortcuts.multids --- core/ui/EditTemplate/fields.tid | 4 +++- core/wiki/config/ShortcutInfo.multids | 1 + core/wiki/config/shortcuts/shortcuts.multids | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index af059d93c..37d4dbc3e 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -67,11 +67,13 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <td class="tc-edit-field-name"> <$text text=<<currentField>>/>:</td> <td class="tc-edit-field-value"> +<$keyboard key="((delete-field))" actions="""<$action-deletefield $field=<<currentField>>/><$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/></$set>"""> <$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"/> +</$keyboard> </td> <td class="tc-edit-field-remove"> <$button class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}> -<$action-deletefield $field=<<currentField>>/> +<$action-deletefield $field=<<currentField>>/><$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/></$set> {{$:/core/images/delete-button}} </$button> </td> diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index f9206220a..8e26f9ad8 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -6,6 +6,7 @@ advanced-search-sidebar: {{$:/language/Shortcuts/Input/AdvancedSearch/Hint}} bold: {{$:/language/Buttons/Bold/Hint}} cancel-edit-tiddler: {{$:/language/Buttons/Cancel/Hint}} change-sidebar-layout: {{$:/language/Shortcuts/SidebarLayout/Hint}} +delete-field: {{$:/language/EditTemplate/Field/Remove/Hint}} excise: {{$:/language/Buttons/Excise/Hint}} heading-1: {{$:/language/Buttons/Heading1/Hint}} heading-2: {{$:/language/Buttons/Heading2/Hint}} diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 5ff799954..78cefee4a 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -5,6 +5,7 @@ advanced-search: ctrl-shift-A advanced-search-sidebar: alt-Enter cancel-edit-tiddler: escape change-sidebar-layout: shift-alt-Down +delete-field: shift-alt-D excise: ctrl-E sidebar-search: ctrl-shift-F heading-1: ctrl-1 From bc5143f19074db2da32f9eb1e834b72a457659c8 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 6 Nov 2020 17:53:11 +0100 Subject: [PATCH 0908/2376] When accessing the AdvancedSearch from the sidebar, delete sidebar-search state tiddlers (#4981) --- core/ui/SideBarSegments/search.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 281505b5c..307b556e8 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -40,7 +40,7 @@ tags: $:/tags/SideBarSegment \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> -\define advanced-search-actions() <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search/input}}/><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to="$:/AdvancedSearch"/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/><$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/AdvancedSearch"] .tc-search input""" preventScroll="true"/> +\define advanced-search-actions() <$action-setfield $tiddler="$:/temp/advancedsearch" text={{$:/temp/search/input}}/><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to="$:/AdvancedSearch"/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/><$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/AdvancedSearch"] .tc-search input""" preventScroll="true"/><$action-deletetiddler $filter="$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]"/> <div class="tc-sidebar-lists tc-sidebar-search"> From 15e877217073ebb66d28a6ad978f877d7d25c0f7 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 6 Nov 2020 17:01:13 +0000 Subject: [PATCH 0909/2376] Remove erroneously committed file --- test.html | 1 - 1 file changed, 1 deletion(-) delete mode 100644 test.html diff --git a/test.html b/test.html deleted file mode 100644 index fb9bea3a5..000000000 --- a/test.html +++ /dev/null @@ -1 +0,0 @@ -<input value="Something"/> From d51975b183885f9abb2f9834c005a31c20214756 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 6 Nov 2020 18:32:26 +0100 Subject: [PATCH 0910/2376] KeyboardWidget: don't trap keyboard shortcut if actions and message are empty and invokeActions isn't handled (#4971) * KeyboardWidget: don't trap keyboard shortcut if actions are empty * Update keyboard.js * Update keyboard.js --- core/modules/widgets/keyboard.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/modules/widgets/keyboard.js b/core/modules/widgets/keyboard.js index 7611b3d61..471d35e37 100644 --- a/core/modules/widgets/keyboard.js +++ b/core/modules/widgets/keyboard.js @@ -46,13 +46,15 @@ KeyboardWidget.prototype.render = function(parent,nextSibling) { // Add a keyboard event handler domNode.addEventListener("keydown",function (event) { if($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) { - self.invokeActions(self,event); + var handled = self.invokeActions(self,event); if(self.actions) { self.invokeActionString(self.actions,self,event); } self.dispatchMessage(event); - event.preventDefault(); - event.stopPropagation(); + if(handled || self.actions || self.message) { + event.preventDefault(); + event.stopPropagation(); + } return true; } return false; From feefc4cceb2448c9f96adc4da4985b3fc9d1aeab Mon Sep 17 00:00:00 2001 From: Miha Lunar <mlunar@gmail.com> Date: Fri, 6 Nov 2020 18:51:53 +0100 Subject: [PATCH 0911/2376] Signing the CLA (#4976) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index abddae206..d83484a3a 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -411,3 +411,5 @@ Kamal Habash, @Kamal-Habash, 2020/08/28 Florian Kohrt, @fkohrt, 2020/09/10 Gerald Liu, @gera2ld, 2020/09/25 + +Miha Lunar, @SmilyOrg, 2020/11/04 From b3d0303139cbf8a07b689cece3dd46307b8ff960 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 6 Nov 2020 19:34:10 +0100 Subject: [PATCH 0912/2376] Add editor-height button and stamp-button to tiddler types that miss them (#4975) * Add editor-height button also to application/javascript ... ... application/json and application/x-tiddler-dictionary * Add stamp button also to application/javascript ... ... application/json and application/x-tiddler-dictionary --- core/ui/EditorToolbar/editor-height.tid | 2 +- core/ui/EditorToolbar/stamp.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/EditorToolbar/editor-height.tid b/core/ui/EditorToolbar/editor-height.tid index a8bb2ca13..e81a8f418 100644 --- a/core/ui/EditorToolbar/editor-height.tid +++ b/core/ui/EditorToolbar/editor-height.tid @@ -4,7 +4,7 @@ icon: $:/core/images/fixed-height custom-icon: yes caption: {{$:/language/Buttons/EditorHeight/Caption}} description: {{$:/language/Buttons/EditorHeight/Hint}} -condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]] +condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] +[first[]] dropdown: $:/core/ui/EditorToolbar/editor-height-dropdown <$reveal tag="span" state="$:/config/TextEditor/EditorHeight/Mode" type="match" text="fixed"> diff --git a/core/ui/EditorToolbar/stamp.tid b/core/ui/EditorToolbar/stamp.tid index af57feb4b..a69be3f18 100644 --- a/core/ui/EditorToolbar/stamp.tid +++ b/core/ui/EditorToolbar/stamp.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/stamp caption: {{$:/language/Buttons/Stamp/Caption}} description: {{$:/language/Buttons/Stamp/Hint}} -condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]] +condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] +[first[]] shortcuts: ((stamp)) dropdown: $:/core/ui/EditorToolbar/stamp-dropdown text: From 1b226c7556d08d46d2e2d94e2b9b338d8441f3e7 Mon Sep 17 00:00:00 2001 From: Miha Lunar <mlunar@gmail.com> Date: Fri, 6 Nov 2020 19:56:20 +0100 Subject: [PATCH 0913/2376] Fixed coding standard nits --- core/modules/parsers/wikiparser/wikiparser.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index 8d1d28aee..9af8ddff0 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -166,12 +166,16 @@ WikiParser.prototype.findNextMatch = function(rules,startPos) { }; WikiParser.prototype.parseRule = function(rule) { - var start = this.pos; - var blocks = rule.parse(); + var start = this.pos, + blocks = rule.parse(); for(var i=0; i<blocks.length; i++) { var block = blocks[i]; - if (block.start !== undefined) block.start = start; - if (block.end !== undefined) block.end = this.pos; + if(block.start !== undefined) { + block.start = start; + } + if(block.end !== undefined) { + block.end = this.pos; + } } return blocks; }; From 900a29fbb3c53a98785d1b57de5598f6caa8198b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 6 Nov 2020 22:16:14 +0100 Subject: [PATCH 0914/2376] Tag-picker: focus tag-input after clicking a tag from the dropdown (#4986) * Tag-picker: focus tag-input after clicking a tag from the dropdown * Update tag-picker.tid --- core/wiki/macros/tag-picker.tid | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index f72006541..43bcf96d7 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -23,6 +23,9 @@ $actions$ \define tag-button(actions,selectedClass) <$button class="tc-btn-invisible $selectedClass$" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> +<$set name="currentTiddlerCSSEscaped" value={{{ [<storyTiddler>escapecss[]] }}}> +<$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>> preventScroll="true"/> +</$set> <<delete-tag-state-tiddlers>> $actions$ <$macrocall $name="tag-pill" tag=<<tag>>/> From 9003c810393d90ee20db083fda35b6469acc592a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 7 Nov 2020 09:42:37 +0000 Subject: [PATCH 0915/2376] Switch to more modern fork of normalize.css https://github.com/sindresorhus/modern-normalize --- themes/tiddlywiki/vanilla/reset.tid | 331 ++++++++++++---------------- 1 file changed, 140 insertions(+), 191 deletions(-) diff --git a/themes/tiddlywiki/vanilla/reset.tid b/themes/tiddlywiki/vanilla/reset.tid index 11ccd7244..138f5d21d 100644 --- a/themes/tiddlywiki/vanilla/reset.tid +++ b/themes/tiddlywiki/vanilla/reset.tid @@ -1,99 +1,103 @@ title: $:/themes/tiddlywiki/vanilla/reset type: text/plain -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */ -/* Document - ========================================================================== */ +/* +Document +======== +*/ /** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ +Use a better box model (opinionated). +*/ + +*, +*::before, +*::after { + box-sizing: border-box; +} + +/** +Use a more readable tab size (opinionated). +*/ + +:root { + -moz-tab-size: 4; + tab-size: 4; +} + +/** +1. Correct the line height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +*/ html { line-height: 1.15; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ } -/* Sections - ========================================================================== */ +/* +Sections +======== +*/ /** - * Remove the margin in all browsers. - */ +Remove the margin in all browsers. +*/ body { margin: 0; } /** - * Render the `main` element consistently in IE. - */ +Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) +*/ -main { - display: block; +body { + font-family: + system-ui, + -apple-system, /* Firefox supports this but not yet `system-ui` */ + 'Segoe UI', + Roboto, + Helvetica, + Arial, + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji'; } -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ +/* +Grouping content +================ +*/ /** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +*/ hr { - box-sizing: content-box; /* 1 */ height: 0; /* 1 */ - overflow: visible; /* 2 */ + color: inherit; /* 2 */ } -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ +/* +Text-level semantics +==================== +*/ /** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ +Add the correct text decoration in Chrome, Edge, and Safari. +*/ abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ + text-decoration: underline dotted; } /** - * Add the correct font weight in Chrome, Edge, and Safari. - */ +Add the correct font weight in Edge and Safari. +*/ b, strong { @@ -101,29 +105,35 @@ strong { } /** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ +1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) +2. Correct the odd 'em' font sizing in all browsers. +*/ code, kbd, -samp { - font-family: monospace, monospace; /* 1 */ +samp, +pre { + font-family: + ui-monospace, + SFMono-Regular, + Consolas, + 'Liberation Mono', + Menlo, + monospace; /* 1 */ font-size: 1em; /* 2 */ } /** - * Add the correct font size in all browsers. - */ +Add the correct font size in all browsers. +*/ small { font-size: 80%; } /** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ +Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. +*/ sub, sup { @@ -141,24 +151,30 @@ sup { top: -0.5em; } -/* Embedded content - ========================================================================== */ +/* +Tabular data +============ +*/ /** - * Remove the border on images inside links in IE 10. - */ +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +*/ -img { - border-style: none; +table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ } -/* Forms - ========================================================================== */ +/* +Forms +===== +*/ /** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +*/ button, input, @@ -172,19 +188,9 @@ textarea { } /** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ +Remove the inheritance of text transform in Edge and Firefox. +1. Remove the inheritance of text transform in Firefox. +*/ button, select { /* 1 */ @@ -192,161 +198,104 @@ select { /* 1 */ } /** - * Correct the inability to style clickable types in iOS and Safari. - */ +Correct the inability to style clickable types in iOS and Safari. +*/ button, -[type="button"], -[type="reset"], -[type="submit"] { +[type='button'], +[type='reset'], +[type='submit'] { -webkit-appearance: button; } /** - * Remove the inner border and padding in Firefox. - */ +Remove the inner border and padding in Firefox. +*/ -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { +::-moz-focus-inner { border-style: none; padding: 0; } /** - * Restore the focus styles unset by the previous rule. - */ +Restore the focus styles unset by the previous rule. +*/ -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { +:-moz-focusring { outline: 1px dotted ButtonText; } /** - * Correct the padding in Firefox. - */ +Remove the additional ':invalid' styles in Firefox. +See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737 +*/ -fieldset { - padding: 0.35em 0.75em 0.625em; +:-moz-ui-invalid { + box-shadow: none; } /** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ +Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. +*/ legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ + padding: 0; } /** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ +Add the correct vertical alignment in Chrome and Firefox. +*/ progress { vertical-align: baseline; } /** - * Remove the default vertical scrollbar in IE 10+. - */ +Correct the cursor style of increment and decrement buttons in Safari. +*/ -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { height: auto; } /** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ -[type="search"] { +[type='search'] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } /** - * Remove the inner padding in Chrome and Safari on macOS. - */ +Remove the inner padding in Chrome and Safari on macOS. +*/ -[type="search"]::-webkit-search-decoration { +::-webkit-search-decoration { -webkit-appearance: none; } /** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to 'inherit' in Safari. +*/ ::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } -/* Interactive - ========================================================================== */ +/* +Interactive +=========== +*/ /* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ +Add the correct display in Chrome and Safari. +*/ summary { display: list-item; } - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} From 93e7380188dae8c86819bff3bfe12c3700a58fcd Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 7 Nov 2020 09:45:03 +0000 Subject: [PATCH 0916/2376] Update default body text font to modern-normalize.css default Fixes #4988 --- themes/tiddlywiki/vanilla/settings.multids | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/settings.multids b/themes/tiddlywiki/vanilla/settings.multids index 665a9be2e..8db5be53d 100644 --- a/themes/tiddlywiki/vanilla/settings.multids +++ b/themes/tiddlywiki/vanilla/settings.multids @@ -1,6 +1,6 @@ title: $:/themes/tiddlywiki/vanilla/settings/ -fontfamily: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" +fontfamily: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji" codefontfamily: "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace backgroundimageattachment: fixed backgroundimagesize: auto From 0bd866e2f9e432f8fc5bbcea54be73ef84629a78 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 7 Nov 2020 10:46:05 +0100 Subject: [PATCH 0917/2376] Make type input keyboard-driven (#4989) --- core/ui/EditTemplate/type.tid | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 14b023fd6..33547c332 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -1,13 +1,16 @@ title: $:/core/ui/EditTemplate/type tags: $:/tags/EditTemplate +first-search-filter: [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>] \define lingo-base() $:/language/EditTemplate/ +\define input-cancel-actions() <$list filter="[<storeTitle>get[text]]" emptyMessage="""<$action-sendmessage $message="tm-cancel-tiddler"/>"""><$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$list> \whitespace trim +<$vars storeTitle=<<qualify "$:/temp/type-search/input">> refreshTitle=<<qualify "$:/temp/type-search/refresh">> selectionStateTitle=<<qualify "$:/temp/type-search/selected-item">>> <div class="tc-edit-type-selector-wrapper"> <em class="tc-edit tc-big-gap-right"><<lingo Type/Prompt>></em> <div class="tc-type-selector-dropdown-wrapper"> <div class="tc-type-selector"><$fieldmangler> -<$edit-text field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes"/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button> +<$macrocall $name="keyboard-driven-input" tiddler=<<currentTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<selectionStateTitle>> field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes" configTiddlerFilter="[[$:/core/ui/EditTemplate/type]]" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$button> </$fieldmangler></div> <div class="tc-block-dropdown-wrapper"> @@ -19,8 +22,10 @@ tags: $:/tags/EditTemplate <div class="tc-dropdown-item"> <$text text={{!!group}}/> </div> -<$list filter="[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]"><$link to={{!!name}}><$view field="description"/> (<$view field="name"/>)</$link> +<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}> +<$list filter="[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<selectionStateTitle>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field="description"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field="name"/>)</$link></span> </$list> +</$set> </$list> </$linkcatcher> </div> @@ -29,3 +34,4 @@ tags: $:/tags/EditTemplate </div> </div> </div> +</$vars> From 2b31c7a509a40b3ddaf3750257743f1414b786ce Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 7 Nov 2020 10:47:08 +0100 Subject: [PATCH 0918/2376] Multiple operands for filter operators (#4964) * Firt pass at adding multiple operands to filter operators * Optimized parsing of multiple operands and added more tests. Need more flexibility for interpreting multiple operands as variables/text references * Add support for parsing text references and variables in multiple operands * Added string-replace filter for testing multiple filter operands * Added more tests for variables and text references in operands * Removed string-replace operator and some whitespace corrections * Removed string-replace operator and some whitespace corrections * Added test with comma in operand --- core/modules/filters.js | 111 ++++++++++++------- editions/test/tiddlers/tests/test-filters.js | 33 +++++- 2 files changed, 95 insertions(+), 49 deletions(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index 6784efae1..9a18eb2af 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -62,43 +62,61 @@ function parseFilterOperation(operators,filterString,p) { else if(operator.operator === "") { operator.operator = "title"; } + operator.operands = []; + function parseOperand(bracketType) { + var operand = {}; + switch (bracketType) { + case "{": // Curly brackets + operand.indirect = true; + nextBracketPos = filterString.indexOf("}",p); + break; + case "[": // Square brackets + nextBracketPos = filterString.indexOf("]",p); + break; + case "<": // Angle brackets + operand.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]); + // DEPRECATION WARNING + console.log("WARNING: Filter",operator.operator,"has a deprecated regexp operand",operator.regexp); + nextBracketPos = p + rex.lastIndex - 1; + } + else { + throw "Unterminated regular expression in filter expression"; + } + break; + } + if(nextBracketPos === -1) { + throw "Missing closing bracket in filter expression"; + } + if(!operator.regexp) { + operand.text = filterString.substring(p,nextBracketPos); + operator.operands.push(operand); + } + p = nextBracketPos + 1; + } + 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 "<": // 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]); -// DEPRECATION WARNING -console.log("WARNING: Filter",operator.operator,"has a deprecated regexp operand",operator.regexp); - nextBracketPos = p + rex.lastIndex - 1; - } - else { - throw "Unterminated regular expression in filter expression"; - } - break; + parseOperand(bracket); + + // Check for multiple operands + while(filterString.charAt(p) === ",") { + p++; + if(/^[\[\{<\/]/.test(filterString.substring(p))) { + nextBracketPos = p; + p++; + parseOperand(filterString.charAt(nextBracketPos)); + } else { + throw "Missing [ in filter expression"; + } } - - if(nextBracketPos === -1) { - throw "Missing closing bracket in filter expression"; - } - if(!operator.regexp) { - operator.operand = filterString.substring(p,nextBracketPos); - } - p = nextBracketPos + 1; - + // Push this operator operators.push(operator); } while(filterString.charAt(p) !== "]"); @@ -152,7 +170,7 @@ exports.parseFilter = function(filterString) { } if(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title operation.operators.push( - {operator: "title", operand: match[4] || match[5] || match[6]} + {operator: "title", operands: [{text: match[4] || match[5] || match[6]}]} ); } results.push(operation); @@ -209,7 +227,7 @@ exports.compileFilter = function(filterString) { results = [], currTiddlerTitle = widget && widget.getVariable("currentTiddler"); $tw.utils.each(operation.operators,function(operator) { - var operand = operator.operand, + var operands = [], operatorFunction; if(!operator.operator) { operatorFunction = filterOperators.title; @@ -218,16 +236,23 @@ exports.compileFilter = function(filterString) { } else { operatorFunction = filterOperators[operator.operator]; } - if(operator.indirect) { - operand = self.getTextReference(operator.operand,"",currTiddlerTitle); - } - if(operator.variable) { - operand = widget.getVariable(operator.operand,{defaultValue: ""}); - } + + $tw.utils.each(operator.operands,function(operand) { + if(operand.indirect) { + operand.value = self.getTextReference(operand.text,"",currTiddlerTitle); + } else if(operand.variable) { + operand.value = widget.getVariable(operand.text,{defaultValue: ""}); + } else { + operand.value = operand.text; + } + operands.push(operand.value); + }); + // Invoke the appropriate filteroperator module results = operatorFunction(accumulator,{ operator: operator.operator, - operand: operand, + operand: operands.length > 0 ? operands[0] : undefined, + operands: operands, prefix: operator.prefix, suffix: operator.suffix, suffixes: operator.suffixes, diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index aa25a1121..cac120c20 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -19,19 +19,41 @@ describe("Filter tests", function() { // Test filter parsing it("should parse new-style rich operator suffixes", function() { expect($tw.wiki.parseFilter("[search:: four, , five,, six [operand]]")).toEqual( - [ { prefix : '', operators : [ { operator : 'search', suffix : ': four, , five,, six ', suffixes : [ [ ], [ 'four', 'five', 'six' ] ], operand : 'operand' } ] } ] + [ { prefix : '', operators : [ { operator : 'search', suffix : ': four, , five,, six ', suffixes : [ [ ], [ 'four', 'five', 'six' ] ], operands: [ { text:'operand' } ] } ] } ] ); expect($tw.wiki.parseFilter("[search: one, two ,three :[operand]]")).toEqual( - [ { prefix : '', operators : [ { operator : 'search', suffix : ' one, two ,three :', suffixes : [ [ 'one', 'two', 'three' ], [ ] ], operand : 'operand' } ] } ] + [ { prefix : '', operators : [ { operator : 'search', suffix : ' one, two ,three :', suffixes : [ [ 'one', 'two', 'three' ], [ ] ], operands: [ { text:'operand' } ] } ] } ] ); expect($tw.wiki.parseFilter("[search: one, two ,three :[operand]]")).toEqual( - [ { prefix : '', operators : [ { operator : 'search', suffix : ' one, two ,three :', suffixes : [ [ 'one', 'two', 'three' ], [ ] ], operand : 'operand' } ] } ] + [ { prefix : '', operators : [ { operator : 'search', suffix : ' one, two ,three :', suffixes : [ [ 'one', 'two', 'three' ], [ ] ], operands: [ { text:'operand' } ] } ] } ] ); expect($tw.wiki.parseFilter("[search: one, two ,three : four, , five,, six [operand]]")).toEqual( - [ { prefix : '', operators : [ { operator : 'search', suffix : ' one, two ,three : four, , five,, six ', suffixes : [ [ 'one', 'two', 'three' ], [ 'four', 'five', 'six' ] ], operand : 'operand' } ] } ] + [ { prefix : '', operators : [ { operator : 'search', suffix : ' one, two ,three : four, , five,, six ', suffixes : [ [ 'one', 'two', 'three' ], [ 'four', 'five', 'six' ] ], operands: [ { text:'operand' } ] } ] } ] ); expect($tw.wiki.parseFilter("[search: , : [operand]]")).toEqual( - [ { prefix : '', operators : [ { operator : 'search', suffix : ' , : ', suffixes : [ [ ], [ ] ], operand : 'operand' } ] } ] + [ { prefix : '', operators : [ { operator : 'search', suffix : ' , : ', suffixes : [ [ ], [ ] ], operands: [ { text:'operand' } ] } ] } ] + ); + }); + + + it("should parse multiple operands for operators", function() { + expect($tw.wiki.parseFilter("[search: , : [operand],[operand2]]")).toEqual( + [ { prefix : '', operators : [ { operator : 'search', suffix : ' , : ', suffixes : [ [ ], [ ] ], operands: [ { text:'operand' }, { text:'operand2' } ] } ] } ] + ); + expect($tw.wiki.parseFilter("[search: , : [oper,and],[operand2]]")).toEqual( + [ { prefix : '', operators : [ { operator : 'search', suffix : ' , : ', suffixes : [ [ ], [ ] ], operands: [ { text:'oper,and' }, { text:'operand2' } ] } ] } ] + ); + expect($tw.wiki.parseFilter("[[GettingStarted]replace:[operand],[operand2]]")).toEqual( + [ { prefix : '', operators : [ { operator : 'title', operands: [ { text:'GettingStarted' } ] }, { operator : 'replace', suffix : '', suffixes : [[]], operands: [ { text:'operand' }, { text:'operand2' } ] } ] } ] + ); + expect($tw.wiki.parseFilter("[[GettingStarted]replace[operand],[operand2]split[-]]")).toEqual( + [ { prefix : '', operators : [ { operator : 'title', operands: [{ text:'GettingStarted' }] }, { operator : 'replace', operands: [{ text:'operand' }, { text:'operand2' }] }, { operator : 'split', operands: [ { text:'-' } ] } ] } ] + ); + expect($tw.wiki.parseFilter("[[GettingStarted]replace[operand],[operand2]split[-]split2[a],[b]]")).toEqual( + [ { prefix : '', operators : [ { operator : 'title', operands: [{ text:'GettingStarted' }] }, { operator : 'replace', operands: [ { text:'operand' }, { text:'operand2' } ] }, { operator : 'split', operands: [ {text:'-'} ] }, { operator : 'split2', operands: [ { text:'a' }, { text: 'b' }] } ] } ] + ); + expect($tw.wiki.parseFilter("[[GettingStarted]replace[operand],[operand2]split[-]split2[a],<b>,{c}]")).toEqual( + [ { prefix : '', operators : [ { operator : 'title', operands: [{ text:'GettingStarted' }] }, { operator : 'replace', operands: [ { text:'operand' }, { text:'operand2' } ] }, { operator : 'split', operands: [ {text:'-'} ] }, { operator : 'split2', operands: [ { text:'a' }, { variable: true, text: 'b' }, { indirect: true, text: 'c' }] } ] } ] ); }); @@ -730,7 +752,6 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[!sortsub:string<sort2>]",anchorWidget).join(",")).toBe("filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,$:/ShadowPlugin,has filter,hasList,TiddlerOne,one"); expect(wiki.filterTiddlers("[[TiddlerOne]] [[$:/TiddlerTwo]] [[Tiddler Three]] [[a fourth tiddler]] +[!sortsub:number<sort3>]",anchorWidget).join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler"); }); - } }); From 5aa4e4cb6806ab64a41a0eb890f0d0698694904c Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 7 Nov 2020 10:51:01 +0100 Subject: [PATCH 0919/2376] Initial support for switching page templates (#4979) * Add support for switching page templates * Revert "Add support for switching page templates" This reverts commit dbf7682d47a88d87a1c27aa066f5cae91c5ace26. * Adopt Jeremy's approach to page template switching instead * Fix default value of recursion marker * Fixed issue with conditional check --- core/modules/startup/render.js | 4 ++-- core/modules/widgets/transclude.js | 5 ++++- core/modules/wiki.js | 10 +++++++++- core/ui/RootTemplate.tid | 3 +++ 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 core/ui/RootTemplate.tid diff --git a/core/modules/startup/render.js b/core/modules/startup/render.js index fc93bcdb3..7ec6ec444 100644 --- a/core/modules/startup/render.js +++ b/core/modules/startup/render.js @@ -21,7 +21,7 @@ exports.synchronous = true; // Default story and history lists var PAGE_TITLE_TITLE = "$:/core/wiki/title"; var PAGE_STYLESHEET_TITLE = "$:/core/ui/PageStylesheet"; -var PAGE_TEMPLATE_TITLE = "$:/core/ui/PageTemplate"; +var PAGE_TEMPLATE_TITLE = "$:/core/ui/RootTemplate"; // Time (in ms) that we defer refreshing changes to draft tiddlers var DRAFT_TIDDLER_TIMEOUT_TITLE = "$:/config/Drafts/TypingTimeout"; @@ -52,7 +52,7 @@ exports.startup = function() { })); // Display the $:/core/ui/PageTemplate tiddler to kick off the display $tw.perf.report("mainRender",function() { - $tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget}); + $tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: "no"}); $tw.pageContainer = document.createElement("div"); $tw.utils.addClass($tw.pageContainer,"tc-page-container-wrapper"); document.body.insertBefore($tw.pageContainer,document.body.firstChild); diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 7af61fc8e..1af7f9c42 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -43,6 +43,7 @@ TranscludeWidget.prototype.execute = function() { this.transcludeField = this.getAttribute("field"); this.transcludeIndex = this.getAttribute("index"); this.transcludeMode = this.getAttribute("mode"); + this.recursionMarker = this.getAttribute("recursionMarker","yes"); // Parse the text reference var parseAsInline = !this.parseTreeNode.isBlock; if(this.transcludeMode === "inline") { @@ -61,7 +62,9 @@ TranscludeWidget.prototype.execute = function() { parseTreeNodes = parser ? parser.tree : this.parseTreeNode.children; // Set context variables for recursion detection var recursionMarker = this.makeRecursionMarker(); - this.setVariable("transclusion",recursionMarker); + if(this.recursionMarker === "yes") { + this.setVariable("transclusion",recursionMarker); + } // Check for recursion if(parser) { if(this.parentWidget && this.parentWidget.hasVariable("transclusion",recursionMarker)) { diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 9fb5166b0..b7718cac2 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1004,6 +1004,7 @@ title: target tiddler title options: as for wiki.makeWidget() plus: options.field: optional field to transclude (defaults to "text") options.mode: transclusion mode "inline" or "block" +options.recursionMarker : optional flag to set a recursion marker, defaults to "yes" options.children: optional array of children for the transclude widget options.importVariables: optional importvariables filter string for macros to be included options.importPageMacros: optional boolean; if true, equivalent to passing "[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]" to options.importVariables @@ -1027,10 +1028,17 @@ exports.makeTranscludeWidget = function(title,options) { parseTreeTransclude = { type: "transclude", attributes: { + recursionMarker: { + name: "recursionMarker", + type: "string", + value: options.recursionMarker || "yes" + }, tiddler: { name: "tiddler", type: "string", - value: title}}, + value: title + } + }, isBlock: !options.parseAsInline}; if(options.importVariables || options.importPageMacros) { if(options.importVariables) { diff --git a/core/ui/RootTemplate.tid b/core/ui/RootTemplate.tid new file mode 100644 index 000000000..a0af69a70 --- /dev/null +++ b/core/ui/RootTemplate.tid @@ -0,0 +1,3 @@ +title: $:/core/ui/RootTemplate + +<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode="inline"/> \ No newline at end of file From c41e34793df1426202975a932afa539b50beebcf Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 7 Nov 2020 11:00:47 +0100 Subject: [PATCH 0920/2376] Add x-listops filter toggle (#4990) --- core/modules/filters/x-listops.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index dc290a42e..ca04b0e2b 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -187,4 +187,19 @@ Extended filter operators to manipulate the current list. }, []); return set; }; + + /* + Toggles an item in the current list. + */ + exports.toggle = function(source, operator) { + var results = prepare_results(source), + index = results.indexOf(operator.operand); + if(index === -1) { + results.push(operator.operand); + } else { + results.splice(index, 1); + } + return results; + }; + })(); From 53922d35589e20d96e89a9e69fe4158477330ae9 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 7 Nov 2020 11:09:11 +0100 Subject: [PATCH 0921/2376] search-replace string operator (#4973) * Added search-replace operator * Merge with master * Add try catch around new RegExp * Better error handling --- core/modules/filters/strings.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 38620454c..37bd826e8 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -115,4 +115,32 @@ exports.splitregexp = function(source,operator,options) { return result; }; +exports["search-replace"] = function(source,operator,options) { + var results = [], + suffixes = operator.suffixes || [], + flagSuffix = suffixes[0] || [], + flags = (flagSuffix.indexOf("g") !== -1 ? "g" : "") + (flagSuffix.indexOf("i") !== -1 ? "i" : ""), + isRegExp = (suffixes[1] && suffixes[1][0] === "regexp") ? true : false, + searchTerm, + regExp; + + source(function(tiddler,title) { + if(title && (operator.operands.length > 1)) { + //Escape regexp characters if the operand is not a regular expression + searchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand); + try { + regExp = new RegExp(searchTerm,flags); + } catch(ex) { + return ["RegExp error: " + ex]; + } + results.push( + title.replace(regExp,operator.operands[1]) + ); + } else { + results.push(title); + } + }); + return results; +}; + })(); From cf58dcf116c87550fe0b76da7159146cb86869d8 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 7 Nov 2020 11:29:15 +0100 Subject: [PATCH 0922/2376] Add is[draft] operator (#4991) --- core/modules/filters/is/draft.js | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 core/modules/filters/is/draft.js diff --git a/core/modules/filters/is/draft.js b/core/modules/filters/is/draft.js new file mode 100644 index 000000000..3dd183a46 --- /dev/null +++ b/core/modules/filters/is/draft.js @@ -0,0 +1,36 @@ +/*\ +title: $:/core/modules/filters/is/draft.js +type: application/javascript +module-type: isfilteroperator + +Filter function for [is[draft]] analagous to [has[draft.of]] + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.draft = function(source,prefix,options) { + var results = []; + if(prefix === "!") { + source(function(tiddler,title) { + if(!tiddler || !$tw.utils.hop(tiddler.fields,"draft.of")) { + results.push(title); + } + }); + } else { + source(function(tiddler,title) { + if(tiddler && $tw.utils.hop(tiddler.fields,"draft.of") && (tiddler.fields["draft.of"].length !== 0)) { + results.push(title); + } + }); + } + return results; +}; + +})(); From de69ab0d0e8d7fe355c0c0d463cf5fa194576b2c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 7 Nov 2020 13:21:24 +0100 Subject: [PATCH 0923/2376] Update keyboard-driven type-input actions on "Escape" (#4992) * Delete "type" field when pressing escape in type input * Update type.tid --- core/ui/EditTemplate/type.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 33547c332..786a2ecd2 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditTemplate first-search-filter: [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>] \define lingo-base() $:/language/EditTemplate/ -\define input-cancel-actions() <$list filter="[<storeTitle>get[text]]" emptyMessage="""<$action-sendmessage $message="tm-cancel-tiddler"/>"""><$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$list> +\define input-cancel-actions() <$list filter="[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]" emptyMessage="""<$action-sendmessage $message="tm-cancel-tiddler"/>"""><$action-sendmessage $message="tm-remove-field" $param="type"/><$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$list> \whitespace trim <$vars storeTitle=<<qualify "$:/temp/type-search/input">> refreshTitle=<<qualify "$:/temp/type-search/refresh">> selectionStateTitle=<<qualify "$:/temp/type-search/selected-item">>> <div class="tc-edit-type-selector-wrapper"> From ee250bf6c903f916668ae1d2a0248c44ddd11705 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 8 Nov 2020 10:26:58 +0100 Subject: [PATCH 0924/2376] Updated release notes (#4997) --- editions/prerelease/tiddlers/Release 5.1.23.tid | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index f517e73f2..1af500da6 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -34,6 +34,7 @@ type: text/vnd.tiddlywiki * [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4791]] a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4937]] the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist. ! Filter Improvements @@ -41,6 +42,13 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4785]] new [[format Operator]] for formatting dates * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4991]] new [[draft Operator|is Operator]] to check if a tiddler is a draft of another tiddler. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4973]] new [[search-replace Operator]] to search and replace in strings. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4948]] new [[enlist-input Operator]] to parse its input titles as a title lists. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value . +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4959]] new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4918]] new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run. ! Hackability Improvements @@ -62,6 +70,7 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4724]] original event to `tm-navigate` event * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852]] the password prompt to enable it to be customised * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e]] syncer to enable syncadaptors to customise the login prompt +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4979]] support for switching page templates. ! Bug Fixes From b69b84b38e7da542a5672eff4ef2c61102b40718 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 10:31:39 +0100 Subject: [PATCH 0925/2376] Update core "tabs" macros to use explicitState (#4985) * Update ControlPanel.tid * Update Advanced.tid * Update Appearance.tid * Update Info.tid * Update AddPlugins.tid * Update Plugins.tid * Update Saving.tid * Update Toolbars.tid * Update Plugins.tid * Update More.tid * Update TiddlerInfo.tid * Update tabs.tid * Update settings.tid * Update ControlPanel.tid * Update Advanced.tid * Update Appearance.tid * Update Info.tid * Update AddPlugins.tid * Update Plugins.tid * Update Saving.tid * Update Toolbars.tid * Update Plugins.tid * Update More.tid * Update tabs.tid * Update settings.tid * Update TiddlerInfo.tid * Update AdvancedSearch.tid * Update Filter.tid * Update Shadows.tid * Update Standard.tid * Update System.tid --- core/ui/AdvancedSearch.tid | 2 +- core/ui/AdvancedSearch/Filter.tid | 2 +- core/ui/AdvancedSearch/Shadows.tid | 2 +- core/ui/AdvancedSearch/Standard.tid | 2 +- core/ui/AdvancedSearch/System.tid | 2 +- core/ui/ControlPanel.tid | 2 +- core/ui/ControlPanel/Advanced.tid | 2 +- core/ui/ControlPanel/Appearance.tid | 2 +- core/ui/ControlPanel/Info.tid | 2 +- core/ui/ControlPanel/Modals/AddPlugins.tid | 2 +- core/ui/ControlPanel/Plugins.tid | 2 +- core/ui/ControlPanel/Saving.tid | 2 +- core/ui/ControlPanel/Toolbars.tid | 2 +- core/ui/MoreSideBar/Plugins.tid | 2 +- core/ui/SideBar/More.tid | 4 ++-- core/ui/SideBarSegments/tabs.tid | 2 +- core/ui/TiddlerInfo.tid | 2 +- plugins/tiddlywiki/codemirror/ui/controlpanel/settings.tid | 2 +- 18 files changed, 19 insertions(+), 19 deletions(-) diff --git a/core/ui/AdvancedSearch.tid b/core/ui/AdvancedSearch.tid index 38982c002..6c5f1f04e 100644 --- a/core/ui/AdvancedSearch.tid +++ b/core/ui/AdvancedSearch.tid @@ -3,5 +3,5 @@ icon: $:/core/images/advanced-search-button color: #bbb <div class="tc-advanced-search"> -<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]" default="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<currentTab>>/>""" explicitState="$:/state/tab/advanced-search-results"/> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]" default="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<currentTab>>/>""" explicitState="$:/state/tab--1498284803"/> </div> diff --git a/core/ui/AdvancedSearch/Filter.tid b/core/ui/AdvancedSearch/Filter.tid index 232994cc4..e46020077 100644 --- a/core/ui/AdvancedSearch/Filter.tid +++ b/core/ui/AdvancedSearch/Filter.tid @@ -3,7 +3,7 @@ tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/Filter/Caption}} \define lingo-base() $:/language/Search/ -\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab--1498284803" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list> diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index 1090baaee..282c119f7 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -5,7 +5,7 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ \define lingo-base() $:/language/Search/ -\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab--1498284803" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index 8fdd83d23..cd3a3d604 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -3,7 +3,7 @@ tags: $:/tags/AdvancedSearch caption: {{$:/language/Search/Standard/Caption}} \define lingo-base() $:/language/Search/ -\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> +\define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab--1498284803" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> \define next-search-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/advancedsearch" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/advancedsearch/standard/currentTab" text=<<nextTab>>/>"""/> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index db4f29151..12b8a5c12 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -4,7 +4,7 @@ caption: {{$:/language/Search/System/Caption}} first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]] \define lingo-base() $:/language/Search/ -\define set-next-input-tab(beforeafter:"after",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/advanced-search-results" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> +\define set-next-input-tab(beforeafter:"after",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name="change-input-tab" stateTitle="$:/state/tab--1498284803" tag="$:/tags/AdvancedSearch" beforeafter="$beforeafter$" defaultState="$:/core/ui/AdvancedSearch/System" actions="""<$action-setfield $tiddler="$:/state/advancedsearch/currentTab" text=<<nextTab>>/>"""/> \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> diff --git a/core/ui/ControlPanel.tid b/core/ui/ControlPanel.tid index a844c3c96..92a1f76fa 100644 --- a/core/ui/ControlPanel.tid +++ b/core/ui/ControlPanel.tid @@ -3,5 +3,5 @@ icon: $:/core/images/options-button color: #bbb <div class="tc-control-panel"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]" "$:/core/ui/ControlPanel/Info">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]" default="$:/core/ui/ControlPanel/Info" explicitState="$:/state/tab-1749438307"/> </div> diff --git a/core/ui/ControlPanel/Advanced.tid b/core/ui/ControlPanel/Advanced.tid index 63e9a182d..0316089f9 100644 --- a/core/ui/ControlPanel/Advanced.tid +++ b/core/ui/ControlPanel/Advanced.tid @@ -5,5 +5,5 @@ caption: {{$:/language/ControlPanel/Advanced/Caption}} {{$:/language/ControlPanel/Advanced/Hint}} <div class="tc-control-panel"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]" "$:/core/ui/ControlPanel/TiddlerFields">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]" default="$:/core/ui/ControlPanel/TiddlerFields" explicitState="$:/state/tab--959111941"/> </div> diff --git a/core/ui/ControlPanel/Appearance.tid b/core/ui/ControlPanel/Appearance.tid index 9715dcf2f..f8f88f6ab 100644 --- a/core/ui/ControlPanel/Appearance.tid +++ b/core/ui/ControlPanel/Appearance.tid @@ -5,5 +5,5 @@ caption: {{$:/language/ControlPanel/Appearance/Caption}} {{$:/language/ControlPanel/Appearance/Hint}} <div class="tc-control-panel"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]" "$:/core/ui/ControlPanel/Theme">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]" default="$:/core/ui/ControlPanel/Theme" explicitState="$:/state/tab--1963855381"/> </div> diff --git a/core/ui/ControlPanel/Info.tid b/core/ui/ControlPanel/Info.tid index 5c2462ffb..8d357395f 100644 --- a/core/ui/ControlPanel/Info.tid +++ b/core/ui/ControlPanel/Info.tid @@ -5,5 +5,5 @@ caption: {{$:/language/ControlPanel/Info/Caption}} {{$:/language/ControlPanel/Info/Hint}} <div class="tc-control-panel"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]" "$:/core/ui/ControlPanel/Basics">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]" default="$:/core/ui/ControlPanel/Basics" explicitState="$:/state/tab--2112689675"/> </div> diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index a7fbec1dd..063ca02ad 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -148,7 +148,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <$set name="transclusion" value=<<connectionTiddler>>> -<<tabs "[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]" "$:/core/ui/ControlPanel/Plugins/Add/Plugins">> +<$macrocall $name="tabs" tabsList="[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]" default="$:/core/ui/ControlPanel/Plugins/Add/Plugins" explicitState="$:/state/addplugins/tab-1342078386"/> </$set> diff --git a/core/ui/ControlPanel/Plugins.tid b/core/ui/ControlPanel/Plugins.tid index 5f9b76146..327d0a480 100644 --- a/core/ui/ControlPanel/Plugins.tid +++ b/core/ui/ControlPanel/Plugins.tid @@ -16,4 +16,4 @@ caption: {{$:/language/ControlPanel/Plugins/Caption}} <<lingo Installed/Hint>> -<<tabs "[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]" "$:/core/ui/ControlPanel/Plugins/Installed/Plugins">> +<$macrocall $name="tabs" tabsList="[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]" default="$:/core/ui/ControlPanel/Plugins/Installed/Plugins" explicitState="$:/state/tab--86143343"/> diff --git a/core/ui/ControlPanel/Saving.tid b/core/ui/ControlPanel/Saving.tid index ae1d82f63..760b4e4b5 100644 --- a/core/ui/ControlPanel/Saving.tid +++ b/core/ui/ControlPanel/Saving.tid @@ -5,5 +5,5 @@ caption: {{$:/language/ControlPanel/Saving/Caption}} {{$:/language/ControlPanel/Saving/Hint}} <div class="tc-control-panel"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]" "$:/core/ui/ControlPanel/Saving/General">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]" default="$:/core/ui/ControlPanel/Saving/General" explicitState="$:/state/tab-2065006209"/> </div> diff --git a/core/ui/ControlPanel/Toolbars.tid b/core/ui/ControlPanel/Toolbars.tid index 0e6d20e7e..9cff67ce6 100644 --- a/core/ui/ControlPanel/Toolbars.tid +++ b/core/ui/ControlPanel/Toolbars.tid @@ -5,5 +5,5 @@ caption: {{$:/language/ControlPanel/Toolbars/Caption}} {{$:/language/ControlPanel/Toolbars/Hint}} <div class="tc-control-panel"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]" "$:/core/ui/ControlPanel/Toolbars/ViewToolbar" "$:/state/tabs/controlpanel/toolbars" "tc-vertical">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]" default="$:/core/ui/ControlPanel/Toolbars/ViewToolbar" class="tc-vertical" explicitState="$:/state/tabs/controlpanel/toolbars-1345989671"/> </div> diff --git a/core/ui/MoreSideBar/Plugins.tid b/core/ui/MoreSideBar/Plugins.tid index 614bcaeee..6d58b7c14 100644 --- a/core/ui/MoreSideBar/Plugins.tid +++ b/core/ui/MoreSideBar/Plugins.tid @@ -5,4 +5,4 @@ caption: {{$:/language/ControlPanel/Plugins/Caption}} {{$:/language/ControlPanel/Plugins/Installed/Hint}} -<<tabs "[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]" "$:/core/ui/MoreSideBar/Plugins/Plugins">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]" default="$:/core/ui/MoreSideBar/Plugins/Plugins" explicitState="$:/state/tab-1163638994"/> diff --git a/core/ui/SideBar/More.tid b/core/ui/SideBar/More.tid index 1c21f9d68..2d3acd38f 100644 --- a/core/ui/SideBar/More.tid +++ b/core/ui/SideBar/More.tid @@ -3,5 +3,5 @@ tags: $:/tags/SideBar caption: {{$:/language/SideBar/More/Caption}} <div class="tc-more-sidebar"> -<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]" default={{$:/config/DefaultMoreSidebarTab}} state="$:/state/tab/moresidebar" class="tc-vertical tc-sidebar-tabs-more" /> -</div> \ No newline at end of file +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]" default={{$:/config/DefaultMoreSidebarTab}} state="$:/state/tab/moresidebar" class="tc-vertical tc-sidebar-tabs-more" explicitState="$:/state/tab/moresidebar-1850697562"/> +</div> diff --git a/core/ui/SideBarSegments/tabs.tid b/core/ui/SideBarSegments/tabs.tid index 24037e8e0..3fdda7d57 100644 --- a/core/ui/SideBarSegments/tabs.tid +++ b/core/ui/SideBarSegments/tabs.tid @@ -3,6 +3,6 @@ tags: $:/tags/SideBarSegment <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"/> +<$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"/> </div> diff --git a/core/ui/TiddlerInfo.tid b/core/ui/TiddlerInfo.tid index f7447fea1..6385ca379 100644 --- a/core/ui/TiddlerInfo.tid +++ b/core/ui/TiddlerInfo.tid @@ -10,4 +10,4 @@ title: $:/core/ui/TiddlerInfo </div> </div> -<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]" default={{$:/config/TiddlerInfo/Default}}/> \ No newline at end of file +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]" default={{$:/config/TiddlerInfo/Default}}/> diff --git a/plugins/tiddlywiki/codemirror/ui/controlpanel/settings.tid b/plugins/tiddlywiki/codemirror/ui/controlpanel/settings.tid index a0aee5441..1efe8b867 100644 --- a/plugins/tiddlywiki/codemirror/ui/controlpanel/settings.tid +++ b/plugins/tiddlywiki/codemirror/ui/controlpanel/settings.tid @@ -3,5 +3,5 @@ tags: $:/tags/ControlPanel caption: {{$:/language/ControlPanel/Settings/Caption}} <div class="tc-control-panel"> -<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]" "$:/core/ui/ControlPanel/Settings/TiddlyWiki">> +<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]" default="$:/core/ui/ControlPanel/Settings/TiddlyWiki" explicitState="$:/state/tab--697582678"/> </div> From 2a7cdb22c03eb47b7a66ccbc77f2cfa8e615d503 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 8 Nov 2020 10:32:37 +0100 Subject: [PATCH 0926/2376] Documentation for multiple filter operands (#4969) --- .../tiddlers/filters/Introduction to filter notation.tid | 9 ++++++++- .../tw5.com/tiddlers/filters/syntax/Filter Parameter.tid | 6 +++++- editions/tw5.com/tiddlers/filters/syntax/Filter Step.tid | 6 ++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid b/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid index 9a23eb84b..b167da2b4 100644 --- a/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid +++ b/editions/tw5.com/tiddlers/filters/Introduction to filter notation.tid @@ -1,5 +1,5 @@ created: 20140410101941871 -modified: 20150228104558000 +modified: 20201103111438568 tags: Learning Filters title: Introduction to filter notation type: text/vnd.tiddlywiki @@ -85,3 +85,10 @@ In this simplest form the TextReference will take the full content of the tiddle > `[search<currentTiddler>]` Note that these special brackets cannot be nested. It is not possible for example to write `[search{<currentTiddler>}]`. + +!Multiple parameters + +<<.from-version "5.1.23">> Some steps accept multiple parameters which are separated by a ` , ` character. + +> Example: `[param1],[param2]` or `<param1>,{param2}` + diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Parameter.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Parameter.tid index b42317c20..6b7b49eca 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Parameter.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Parameter.tid @@ -1,5 +1,5 @@ created: 20150220152540000 -modified: 20150220152540000 +modified: 20201103110920722 tags: [[Filter Syntax]] title: Filter Parameter type: text/vnd.tiddlywiki @@ -25,3 +25,7 @@ The parameter to a [[filter operator|Filter Operators]] can be: : <<.def variable>> :: `<like this>` :: The parameter is the current value of the [[variable|Variables]] whose name appears between the angle brackets. Macro parameters are <<.em not>> supported. + +<<.from-version "5.1.23">> Filter operators support multiple parameters which are separated by a ` , ` character. + +For example: `[param1],[param2]` or `<param1>,{param2}` diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Step.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Step.tid index 0b8a149e8..b569ec4d6 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Step.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Step.tid @@ -1,5 +1,5 @@ created: 20150124182127000 -modified: 20150124191051000 +modified: 20201103111044922 tags: [[Filter Syntax]] title: Filter Step type: text/vnd.tiddlywiki @@ -18,4 +18,6 @@ The step's <<.def operator>> is drawn from a list of [[predefined keywords|Filte The <<.def suffix>> is additional text, often the name of a [[field|TiddlerFields]], that extends the meaning of certain operators. -Many steps require an explicit <<.def parameter>> value, also known as an <<.def operand>>, that further defines what the step is to do. +Many steps require an explicit <<.def parameter>> value, also known as an <<.def operand>>, that further defines what the step is to do. + +<<.from-version "5.1.23">> Some steps accept multiple parameters which are separated by a ` , ` character. From 66636d1a86d7918ace4f0686267eb26bd60a42e0 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 8 Nov 2020 10:34:05 +0100 Subject: [PATCH 0927/2376] Docs for new operators (#4994) * Docs for is[draft] * Better error handling for suffixes * Docs for search-replace operator * Added tests for search-replace operator * Docs for toggle operator --- core/modules/filters/strings.js | 2 +- editions/test/tiddlers/tests/test-filters.js | 17 +++++++++++ editions/tw5.com/tiddlers/filters/is.tid | 17 +++++------ .../search-replace Operator (Examples).tid | 25 +++++++++++++++++ .../filters/search-replace Operator.tid | 28 +++++++++++++++++++ .../filters/toggle Operator (Examples).tid | 20 +++++++++++++ .../tiddlers/filters/toggle Operator.tid | 13 +++++++++ 7 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/search-replace Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/search-replace Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/toggle Operator.tid diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 37bd826e8..eb74e39e1 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -118,7 +118,7 @@ exports.splitregexp = function(source,operator,options) { exports["search-replace"] = function(source,operator,options) { var results = [], suffixes = operator.suffixes || [], - flagSuffix = suffixes[0] || [], + flagSuffix = (suffixes[0] ? (suffixes[0][0] || "") : ""), flags = (flagSuffix.indexOf("g") !== -1 ? "g" : "") + (flagSuffix.indexOf("i") !== -1 ? "i" : ""), isRegExp = (suffixes[1] && suffixes[1][0] === "regexp") ? true : false, searchTerm, diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index cac120c20..31c66b86f 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -752,6 +752,23 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[!sortsub:string<sort2>]",anchorWidget).join(",")).toBe("filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,$:/ShadowPlugin,has filter,hasList,TiddlerOne,one"); expect(wiki.filterTiddlers("[[TiddlerOne]] [[$:/TiddlerTwo]] [[Tiddler Three]] [[a fourth tiddler]] +[!sortsub:number<sort3>]",anchorWidget).join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler"); }); + + it("should handle multiple operands for search-replace", function() { + var widget = require("$:/core/modules/widgets/widget.js"); + var rootWidget = new widget.widget({ type:"widget", children:[ {type:"widget", children:[]} ] }, + { wiki:wiki, document:$tw.document}); + rootWidget.makeChildWidgets(); + var anchorWidget = rootWidget.children[0]; + rootWidget.setVariable("var1","different"); + rootWidget.setVariable("myregexp","e|o"); + rootWidget.setVariable("name","(\w+)\s(\w+)"); + expect(wiki.filterTiddlers("[[Welcome to TiddlyWiki, a unique non-linear webpage.]search-replace[webpage],[notebook]]").join(",")).toBe("Welcome to TiddlyWiki, a unique non-linear notebook."); + expect(wiki.filterTiddlers("[[Welcome to TiddlyWiki, a unique non-linear notebook.]search-replace[unique],<var1>]",anchorWidget).join(",")).toBe("Welcome to TiddlyWiki, a different non-linear notebook."); + expect(wiki.filterTiddlers("[[Welcome to TiddlyWiki, a unique non-linear notebook.]search-replace[TiddlyWiki],{one}]",anchorWidget).join(",")).toBe("Welcome to This is the text of tiddler [[one]], a unique non-linear notebook."); + expect(wiki.filterTiddlers("[[Hello There]search-replace:g:regexp<myregexp>,[]]",anchorWidget).join(",")).toBe("Hll Thr"); + expect(wiki.filterTiddlers("[[Hello There]search-replace::regexp<myregexp>,[]]",anchorWidget).join(",")).toBe("Hllo There"); + expect(wiki.filterTiddlers("[[Hello There]search-replace:gi[H],[]]",anchorWidget).join(",")).toBe("ello Tere"); + }); } }); diff --git a/editions/tw5.com/tiddlers/filters/is.tid b/editions/tw5.com/tiddlers/filters/is.tid index b18dffe42..a38f8315f 100644 --- a/editions/tw5.com/tiddlers/filters/is.tid +++ b/editions/tw5.com/tiddlers/filters/is.tid @@ -1,15 +1,15 @@ +caption: is created: 20140410103123179 -modified: 20190916151432497 +modified: 20201107110947882 +op-input: a [[selection of titles|Title Selection]] +op-neg-output: those input tiddlers that do <<.em not>> belong to category <<.place C>> +op-output: those input tiddlers that belong to category <<.place C>> +op-parameter: a category +op-parameter-name: C +op-purpose: filter the input by fundamental category tags: [[Filter Operators]] [[Common Operators]] [[Negatable Operators]] title: is Operator type: text/vnd.tiddlywiki -caption: is -op-purpose: filter the input by fundamental category -op-input: a [[selection of titles|Title Selection]] -op-parameter: a category -op-parameter-name: C -op-output: those input tiddlers that belong to category <<.place C>> -op-neg-output: those input tiddlers that do <<.em not>> belong to category <<.place C>> The parameter <<.place C>> is one of the following fundamental categories: @@ -25,6 +25,7 @@ The parameter <<.place C>> is one of the following fundamental categories: |^`tiddler` |exists as a non-shadow tiddler | |^`variable` |<<.from-version "5.1.20">> exists as a variable (whether or not that variable has a non-blank value) | |^`blank` |<<.from-version "5.1.20">> is blank (i.e. is a zero length string) | +|^`draft` |<<.from-version "5.1.23">> is a draft of another tiddler. Synonym for `[has[draft.of]]` | If <<.place C>> is anything else an error message is returned. <<.from-version "5.1.14">> if <<.place C>> is blank, the output is passed through unchanged (in earlier versions an error message was returned). diff --git a/editions/tw5.com/tiddlers/filters/search-replace Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/search-replace Operator (Examples).tid new file mode 100644 index 000000000..79c9b60b6 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/search-replace Operator (Examples).tid @@ -0,0 +1,25 @@ +created: 20201107112846692 +modified: 20201107113536230 +tags: [[Operator Examples]] [[search-replace Operator]] +title: search-replace Operator (Examples) +type: text/vnd.tiddlywiki + +\define myregexp() e|o + +\define names() (\w+)\s(\w+) + +Replace one string with another: +<<.operator-example 1 """[[The quick brown fox jumps over the lazy dog]search-replace[dog],[cat]]""">> + +Replace all matches of a regular expression: + +`\define myregexp() e|o` +<<.operator-example 2 """[[Hello There]search-replace:g:regexp<myregexp>,[]]""">> + +Replace all matches of a string irrespective of case: +<<.operator-example 3 """[[Hello There]search-replace:gi[H],[]]""">> + +You can also use regular expression capture groups in the replacement string: + +`\define names() (\w+)\s(\w+)` +<<.operator-example 4 """[[John Smith]search-replace::regexp<names>,[$2,$1]]""" >> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/search-replace Operator.tid b/editions/tw5.com/tiddlers/filters/search-replace Operator.tid new file mode 100644 index 000000000..6424e01b1 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/search-replace Operator.tid @@ -0,0 +1,28 @@ +caption: search-replace +created: 20201107111139011 +modified: 20201107122008854 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles with the search string replaced with the replacement string +op-parameter: the <<.op search-replace>> operator requires 2 parameters, see below for details +op-purpose: returns each item in the list, replacing within each title the string specified by the first parameter with the second parameter +op-suffix: the <<.op search-replace>> operator uses a rich suffix, see below for details +tags: [[Filter Operators]] [[String Operators]] +title: search-replace Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> + +The <<.op search-replace>> operator uses an extended syntax that allows for multiple suffixes and parameters to be passed: + +``` +[search-replace:<flag list>:<regexp-mode>[<search-term>],[<replacement>]] +``` + +* ''flag-list'': ''g'' for global mode to replace all matches, ''i'' for case-insensitive mode, "gi" for both. (optional) +* ''regexp-mode'': ''regexp'' to treat the first parameter as a regular expression (optional). +* ''search-term'': string or regular expression that should be replaced +* ''replacement'': string that should replace the search-term + +<<.tip "Either [[parameter|Filter Parameter]] can be a string, a text reference or a variable">> + +<<.operator-examples "search-replace">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid new file mode 100644 index 000000000..e53b4ceb0 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid @@ -0,0 +1,20 @@ +created: 20201107154352695 +modified: 20201107155030228 +title: toggle Operator (Examples) +type: text/vnd.tiddlywiki + +<<.using-days-of-week>> + +<<.operator-example 1 """[list[Days of the Week]] +[toggle[Wednesday]]""">> + +To toggle a tag in a tiddler: + +``` +<$action-listops $tiddler="target" $tags="+[toggle[done]]" /> +``` + +To toggle a title in a field: + +``` +<$action-listops $tiddler="target" $field="my-field" $subfilter="+[toggle[done]]" /> +``` diff --git a/editions/tw5.com/tiddlers/filters/toggle Operator.tid b/editions/tw5.com/tiddlers/filters/toggle Operator.tid new file mode 100644 index 000000000..ffb84b00b --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/toggle Operator.tid @@ -0,0 +1,13 @@ +caption: toggle +created: 20201107153758990 +modified: 20201107154300086 +op-input: a list of items +op-output: the input list with the title <<.place R>> toggled +op-parameter: an item to toggle in the input list +op-parameter-name: R +op-purpose: toggle the title specified in the operand in the input +tags: [[Filter Operators]] [[Listops Operators]] [[Order Operators]] +title: toggle Operator +type: text/vnd.tiddlywiki + +<<.operator-examples "toggle">> From 750f56a235190121f2504bdba1b8cf5f47d4d8b1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 10:44:49 +0100 Subject: [PATCH 0928/2376] Update Basics.tid (#4999) --- core/ui/ControlPanel/Basics.tid | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 0820d9e97..4aaf83c4d 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -7,8 +7,11 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} \define show-filter-count(filter) <$button class="tc-btn-invisible"> <$action-setfield $tiddler="$:/temp/advancedsearch" $value="""$filter$"""/> +<$action-setfield $tiddler="$:/temp/advancedsearch/input" $value="""$filter$"""/> +<$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/> <$action-setfield $tiddler="$:/state/tab--1498284803" $value="$:/core/ui/AdvancedSearch/Filter"/> <$action-navigate $to="$:/AdvancedSearch"/> +<$action-sendmessage $message="tm-focus-selector" $param=".tc-advanced-search input"/> ''<$count filter="""$filter$"""/>'' {{$:/core/images/advanced-search-button}} </$button> From 9fe4c4889a9b59e6399db962b296cf89a66d99cf Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 11:15:29 +0100 Subject: [PATCH 0929/2376] Add "meta" to getEventModifierKeyDescriptor (#5000) * Add "meta" to getEventModifierKeyDescriptor * Update modifier Variable.tid --- core/modules/keyboard.js | 18 +++++++++++------- .../tiddlers/variables/modifier Variable.tid | 10 +++++++++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/core/modules/keyboard.js b/core/modules/keyboard.js index a58e1685d..fa883f3dd 100644 --- a/core/modules/keyboard.js +++ b/core/modules/keyboard.js @@ -285,13 +285,17 @@ KeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) { }; KeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) { - return event.ctrlKey && !event.shiftKey && !event.altKey ? "ctrl" : - event.shiftKey && !event.ctrlKey && !event.altKey? "shift" : - event.ctrlKey && event.shiftKey && !event.altKey ? "ctrl-shift" : - event.altKey && !event.shiftKey && !event.ctrlKey ? "alt" : - event.altKey && event.shiftKey && !event.ctrlKey ? "alt-shift" : - event.altKey && event.ctrlKey && !event.shiftKey ? "ctrl-alt" : - event.altKey && event.shiftKey && event.ctrlKey ? "ctrl-alt-shift" : "normal"; + return event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? "ctrl" : + event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? "shift" : + event.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? "ctrl-shift" : + event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? "alt" : + event.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? "alt-shift" : + event.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? "ctrl-alt" : + event.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? "ctrl-alt-shift" : + event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? "meta" : + event.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? "meta-ctrl" : + event.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? "meta-ctrl-shift" : + event.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? "meta-ctrl-alt-shift" : "normal"; }; KeyboardManager.prototype.getShortcutTiddlerList = function() { diff --git a/editions/tw5.com/tiddlers/variables/modifier Variable.tid b/editions/tw5.com/tiddlers/variables/modifier Variable.tid index 2f1239a3d..0399c7b28 100644 --- a/editions/tw5.com/tiddlers/variables/modifier Variable.tid +++ b/editions/tw5.com/tiddlers/variables/modifier Variable.tid @@ -3,16 +3,24 @@ title: modifier Variable type: text/vnd.tiddlywiki Within the ''action'' string of the DroppableWidget, the ''action'' string of the ButtonWidget and the ''action'' string of the LinkCatcherWidget, the <<.def modifier>> [[variable|Variables]] contains the modifier key(s) held during the drag-process. -The possible keys are ''ctrl'', ''shift'', ''alt'', ''ctrl'' and ''shift'', ''alt'' and ''shift'', ''ctrl'' and ''alt'', ''ctrl'' and ''alt'' and ''shift'' +The possible keys are ''meta'', ''ctrl'', ''shift'', ''alt'', ''meta'' and ''ctrl'', ''meta'' and ''shift'', ''meta'' and ''alt'', ''ctrl'' and ''shift'', ''alt'' and ''shift'', ''ctrl'' and ''alt'', ''ctrl'' and ''alt'' and ''shift'', ''meta'' and ''alt'' and ''shift'', ''meta'' and ''ctrl'' and ''shift'', ''meta'' and ''ctrl'' and ''alt'', ''meta'' and ''ctrl'' and ''alt'' and ''shift'' The variable contains a string that identifies the keys: |Modifier Key |Variable Content |h +|meta |meta | |ctrl |ctrl | |alt |alt | |shift |shift | +|meta+shift |meta-shift | +|meta+ctrl |meta-ctrl | +|meta+alt |meta-alt | |ctrl+shift |ctrl-shift | |alt+shift |alt-shift | |ctrl+alt |ctrl-alt | +|meta+ctrl+shift |meta-ctrl-shift | +|meta+ctrl+alt |meta-ctrl-alt | +|meta+alt+shift |meta-alt-shift | |ctrl+alt+shift |ctrl-alt-shift | +|meta+ctrl+alt+shift |meta-ctrl-alt-shift | |no modifier (normal click / drag) |normal | From 9854a4fc08f6908a5b3fd4e956d54aa1267b198b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 12:43:24 +0100 Subject: [PATCH 0930/2376] Fix #4998 - Pressing Enter creates Missing Tiddler (#5001) * Update search.tid * Update Filter.tid * Update Shadows.tid * Update Standard.tid * Update System.tid * Update search.tid * Create Hidden Setting Search-NavigateOnEnter.tid --- core/ui/AdvancedSearch/Filter.tid | 4 ++-- core/ui/AdvancedSearch/Shadows.tid | 4 ++-- core/ui/AdvancedSearch/Standard.tid | 4 ++-- core/ui/AdvancedSearch/System.tid | 4 ++-- core/ui/SideBarSegments/search.tid | 4 ++-- .../Hidden Setting Search-NavigateOnEnter.tid | 6 ++++++ plugins/tiddlywiki/menubar/items/search.tid | 6 ++++-- 7 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Search-NavigateOnEnter.tid diff --git a/core/ui/AdvancedSearch/Filter.tid b/core/ui/AdvancedSearch/Filter.tid index e46020077..37d4ab005 100644 --- a/core/ui/AdvancedSearch/Filter.tid +++ b/core/ui/AdvancedSearch/Filter.tid @@ -7,9 +7,9 @@ caption: {{$:/language/Search/Filter/Caption}} \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list> -\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo Filter/Hint>> diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index 282c119f7..ce59fa674 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -9,9 +9,9 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> -\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo Shadows/Hint>> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index cd3a3d604..7c869731e 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -9,9 +9,9 @@ caption: {{$:/language/Search/Standard/Caption}} \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> -\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo Standard/Hint>> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index 12b8a5c12..ffac5b297 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -8,9 +8,9 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> -\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo System/Hint>> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 307b556e8..e24a9d19f 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -34,9 +34,9 @@ tags: $:/tags/SideBarSegment \define cancel-search-actions() <$list filter="[<searchTiddler>get[text]!match{$:/temp/search}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/search]] [<searchTiddler>] [<searchListState>]"/>"""><$action-setfield $tiddler="$:/temp/search" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler="$:/temp/search/refresh" text="yes"/></$list> -\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Search-NavigateOnEnter.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Search-NavigateOnEnter.tid new file mode 100644 index 000000000..19b48bd02 --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting Search-NavigateOnEnter.tid @@ -0,0 +1,6 @@ +title: Hidden Setting: Navigate on Enter +tags: [[Hidden Settings]] +created: 20201108104956516 +modified: 20201108104956516 + +The configuration Tiddler $:/config/Search/NavigateOnEnter/enable can be used to enable (if set to ''yes'') Navigation to and Creation of missing Tiddlers in the various search input fields when hitting <kbd>{{$:/config/shortcuts/input-accept}}</kbd> respectively <kbd>{{$:/config/shortcuts/input-accept-variant}}</kbd> diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid index 4614a3ef1..e6911b40b 100644 --- a/plugins/tiddlywiki/menubar/items/search.tid +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -12,7 +12,9 @@ tags: $:/tags/MenuBar </$set> \end -\define input-accept-actions() <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> + +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> @@ -24,7 +26,7 @@ tags: $:/tags/MenuBar <$macrocall $name="keyboard-driven-input" tiddler="$:/temp/menubarsearch" storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/menubarsearch/refresh" tag="input" type="search" focusPopup="$:/state/popup/menubar-search-dropdown" class="tc-popup-handle tc-menu-show-when-wide" placeholder="Search..." default="" cancelPopups="yes" - inputAcceptActions=<<input-accept-actions>> inputCancelActions=<<cancel-search-actions>> + inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> inputCancelActions=<<cancel-search-actions>> filterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]" /> </$keyboard> </$keyboard> From c72911550649b1fd195ab6a35c1aaf4b3ecb119a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 12:46:13 +0100 Subject: [PATCH 0931/2376] Update modifier Variable.tid with a test-button and... (#5002) ... a tip for meta-key detection on various operating systems --- editions/tw5.com/tiddlers/variables/modifier Variable.tid | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/editions/tw5.com/tiddlers/variables/modifier Variable.tid b/editions/tw5.com/tiddlers/variables/modifier Variable.tid index 0399c7b28..d5db7d702 100644 --- a/editions/tw5.com/tiddlers/variables/modifier Variable.tid +++ b/editions/tw5.com/tiddlers/variables/modifier Variable.tid @@ -24,3 +24,11 @@ The variable contains a string that identifies the keys: |ctrl+alt+shift |ctrl-alt-shift | |meta+ctrl+alt+shift |meta-ctrl-alt-shift | |no modifier (normal click / drag) |normal | + +<<.tip """Some operating systems may intercept the ''meta'' key so it is never detected""">> + +<$button actions="""<$action-setfield $tiddler="$:/temp/test-modifier-keys" text=<<modifier>>/>""">Test modifier keys here</$button> + +!!! Modifier keys held while clicking the button above: + +{{$:/temp/test-modifier-keys}} From e72d90c227c9625e599ee26f5341ba97f6cbea94 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Sun, 8 Nov 2020 18:47:15 +0700 Subject: [PATCH 0932/2376] More examples for enlist-input operator (#4968) The examples should also show what would happen without the operator, to give a better feel for why it's useful. --- .../filters/examples/enlist-input Operator (Examples).tid | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid index 6c4355d89..c02a85c4c 100644 --- a/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid @@ -1,8 +1,10 @@ created: 20201102220519567 -modified: 20201102221137200 +modified: 20201103090622475 tags: [[enlist-input Operator]] [[Operator Examples]] title: enlist-input Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[[Days of the Week]get[list]enlist-input[]]">> -<<.operator-example 2 "'HelloThere GettingStarted [[Customise TiddlyWiki]]' +[enlist-input[]]">> \ No newline at end of file +Contrast with: <<.operator-example 2 "[[Days of the Week]get[list]]">> +<<.operator-example 3 "'HelloThere GettingStarted [[Customise TiddlyWiki]]' +[enlist-input[]]">> +Contrast with: <<.operator-example 4 "'HelloThere GettingStarted [[Customise TiddlyWiki]]'">> \ No newline at end of file From e574cb472497ffc1807c51d0f864576b17273e5b Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Sun, 8 Nov 2020 02:47:44 -0900 Subject: [PATCH 0933/2376] Markdown plugin: add rel="noopener noreferrer" to external links (#4771) --- plugins/tiddlywiki/markdown/wrapper.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/markdown/wrapper.js b/plugins/tiddlywiki/markdown/wrapper.js index 803f1a7ca..e7a97fadb 100755 --- a/plugins/tiddlywiki/markdown/wrapper.js +++ b/plugins/tiddlywiki/markdown/wrapper.js @@ -119,7 +119,8 @@ function convertNodes(remarkableTree, isStartOfInline) { // External link var attributes = { class: { type: "string", value: "tc-tiddlylink-external" }, - href: { type: "string", value: currentNode.href } + href: { type: "string", value: currentNode.href }, + rel: { type: "string", value: "noopener noreferrer" } }; if (pluginOpts.linkNewWindow) { attributes.target = { type: "string", value: "_blank" }; From 98f67373b15484f30933ea71f5c5795884521a96 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 12:50:15 +0100 Subject: [PATCH 0934/2376] Menubar plugin: make sidebar-scrollable top margin adjust ... (#4974) * Menubar plugin: make sidebar-scrollable top margin adjust ... ... to height of menubar * Update styles.tid * Update styles.tid * Update styles.tid * Update styles.tid * Update menu.tid * Update styles.tid * Update styles.tid * Update styles.tid * Update styles.tid * Update menu.tid * Update styles.tid * Update styles.tid --- core/ui/TopRightBar/menu.tid | 4 +- plugins/tiddlywiki/menubar/menu.tid | 4 +- plugins/tiddlywiki/menubar/styles.tid | 60 +++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/core/ui/TopRightBar/menu.tid b/core/ui/TopRightBar/menu.tid index a16111086..f9fe839ab 100644 --- a/core/ui/TopRightBar/menu.tid +++ b/core/ui/TopRightBar/menu.tid @@ -2,8 +2,8 @@ title: $:/core/ui/TopBar/menu tags: $:/tags/TopRightBar <$list filter="[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]" variable="ignore"> -<$button set="$:/state/sidebar" setTo="no" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-right}}</$button> +<$button set="$:/state/sidebar" setTo="no" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class="tc-btn-invisible tc-hide-sidebar-btn">{{$:/core/images/chevron-right}}</$button> </$list> <$list filter="[[$:/state/sidebar]get[text]] +[else[yes]match[no]]" variable="ignore"> -<$button set="$:/state/sidebar" setTo="yes" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-left}}</$button> +<$button set="$:/state/sidebar" setTo="yes" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class="tc-btn-invisible tc-show-sidebar-btn">{{$:/core/images/chevron-left}}</$button> </$list> diff --git a/plugins/tiddlywiki/menubar/menu.tid b/plugins/tiddlywiki/menubar/menu.tid index 0c1d0d7cd..8123af1bf 100644 --- a/plugins/tiddlywiki/menubar/menu.tid +++ b/plugins/tiddlywiki/menubar/menu.tid @@ -3,7 +3,7 @@ tags: $:/tags/PageTemplate \define menubar-inner(size) <ul class="tc-menubar-list"> -<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]]"> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]]"> <$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore"> <$list filter="[[$size$]match[wide]] ~[<currentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]" variable="ignore"> <li style={{!!custom-menu-styles-$size$}} class={{{ [<currentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}> @@ -42,7 +42,7 @@ tags: $:/tags/PageTemplate </ul> \end -<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]limit[1]]" variable="listItem"> +<$list filter="[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]" variable="listItem"> <nav class="tc-menubar tc-adjust-top-of-scroll"> <div class="tc-menubar-narrow"> <<menubar-inner narrow>> diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index 0ef0c2ccd..2914e85bf 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -5,6 +5,41 @@ tags: [[$:/tags/Stylesheet]] <$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] }}} /> \end +\define sidebarbreakpoint-minus-one() +<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] }}} /> +\end + +\define set-sidebar-scrollable-top-if-hamburger() +<$list filter="[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] -$:/plugins/tiddlywiki/menubar/items/hamburger +[limit[1]]"> + + .tc-sidebar-scrollable { + margin-top: 2em; + } + +</$list> +\end + +\define set-sidebar-scrollable-top() +<$list filter="[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]"> + + .tc-sidebar-scrollable { + margin-top: 2em; + } + +</$list> +<$reveal state="$:/state/popup/menubar/hamburger" type="match" text="yes"> + + <$set name="itemCount" value={{{ [all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[count[]] }}}> + + .tc-sidebar-scrollable { + margin-top: calc(<<itemCount>> * 2em); + } + + </$set> + +</$reveal> +\end + \rules only filteredtranscludeinline transcludeinline macrodef macrocallinline nav.tc-menubar { @@ -156,6 +191,10 @@ nav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button { display: none; } + nav.tc-menubar .tc-menubar-item .tc-show-sidebar-btn svg.tc-image-chevron-left, nav.tc-menubar .tc-menubar-item .tc-hide-sidebar-btn svg.tc-image-chevron-right { + transform: rotate(-90deg); + } + } @media (min-width: <<breakpoint-plus-one>>) { @@ -167,4 +206,25 @@ nav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button { } +@media (max-width: <<sidebarbreakpoint-minus-one>>) { + <<set-sidebar-scrollable-top-if-hamburger>> + + <<if-no-sidebar """ + + .tc-sidebar-header { + min-height: 0; + padding-top: 0; + padding-bottom: 0; + transition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out; + } + + """>> + +} + +@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) { + + <<set-sidebar-scrollable-top>> + +} From 4d85d267a195725ed84659d9ca2e7612c46a210a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 14:26:02 +0100 Subject: [PATCH 0935/2376] Make navigating and editing Shadow tiddlers work again (#5004) * Update search.tid * Update Filter.tid * Update Shadows.tid * Update Standard.tid * Update System.tid * Update search.tid --- core/ui/AdvancedSearch/Filter.tid | 4 ++-- core/ui/AdvancedSearch/Shadows.tid | 4 ++-- core/ui/AdvancedSearch/Standard.tid | 4 ++-- core/ui/AdvancedSearch/System.tid | 4 ++-- core/ui/SideBarSegments/search.tid | 4 ++-- plugins/tiddlywiki/menubar/items/search.tid | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/ui/AdvancedSearch/Filter.tid b/core/ui/AdvancedSearch/Filter.tid index 37d4ab005..5a9430e19 100644 --- a/core/ui/AdvancedSearch/Filter.tid +++ b/core/ui/AdvancedSearch/Filter.tid @@ -7,9 +7,9 @@ caption: {{$:/language/Search/Filter/Caption}} \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list> -\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo Filter/Hint>> diff --git a/core/ui/AdvancedSearch/Shadows.tid b/core/ui/AdvancedSearch/Shadows.tid index ce59fa674..0d5d63bd6 100644 --- a/core/ui/AdvancedSearch/Shadows.tid +++ b/core/ui/AdvancedSearch/Shadows.tid @@ -9,9 +9,9 @@ first-search-filter: [all[shadows]search<userInput>sort[title]limit[250]] -[[$:/ \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> -\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo Shadows/Hint>> diff --git a/core/ui/AdvancedSearch/Standard.tid b/core/ui/AdvancedSearch/Standard.tid index 7c869731e..d3616de33 100644 --- a/core/ui/AdvancedSearch/Standard.tid +++ b/core/ui/AdvancedSearch/Standard.tid @@ -9,9 +9,9 @@ caption: {{$:/language/Search/Standard/Caption}} \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> -\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo Standard/Hint>> diff --git a/core/ui/AdvancedSearch/System.tid b/core/ui/AdvancedSearch/System.tid index ffac5b297..5400b2426 100644 --- a/core/ui/AdvancedSearch/System.tid +++ b/core/ui/AdvancedSearch/System.tid @@ -8,9 +8,9 @@ first-search-filter: [is[system]search<userInput>sort[title]limit[250]] -[[$:/te \define cancel-search-actions() <$list filter="[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]" />"""><$action-setfield $tiddler="$:/temp/advancedsearch/input" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/></$list><$action-sendmessage $message="tm-focus-selector" $param=""".tc-advanced-search input"""/> -\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> <<lingo System/Hint>> diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index e24a9d19f..ac96fa63b 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -34,9 +34,9 @@ tags: $:/tags/SideBarSegment \define cancel-search-actions() <$list filter="[<searchTiddler>get[text]!match{$:/temp/search}]" emptyMessage="""<$action-deletetiddler $filter="[[$:/temp/search]] [<searchTiddler>] [<searchListState>]"/>"""><$action-setfield $tiddler="$:/temp/search" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler="$:/temp/search/refresh" text="yes"/></$list> -\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> diff --git a/plugins/tiddlywiki/menubar/items/search.tid b/plugins/tiddlywiki/menubar/items/search.tid index e6911b40b..df4cad072 100644 --- a/plugins/tiddlywiki/menubar/items/search.tid +++ b/plugins/tiddlywiki/menubar/items/search.tid @@ -12,9 +12,9 @@ tags: $:/tags/MenuBar </$set> \end -\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> +\define input-accept-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>"""><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list> -\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> +\define input-accept-variant-actions() <$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]" emptyMessage="""<$list filter="[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]"><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>"""><$list filter="[<__tiddler__>get[text]minlength[1]]"><$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list> \define set-next-input-tab(beforeafter:"after") <$macrocall $name="change-input-tab" stateTitle="$:/state/tab/search-results/sidebar" tag="$:/tags/SearchResults" beforeafter="$beforeafter$" defaultState={{$:/config/SearchResults/Default}} actions="""<$action-setfield $tiddler="$:/state/search/currentTab" text=<<nextTab>>/>"""/> From db48ce5f2c2577b72229af6a63faeb2ddc484d1b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 23:28:32 +0100 Subject: [PATCH 0936/2376] Correct breakpoint for no-box-shadow in snowwhite/base stylesheet (#5008) --- themes/tiddlywiki/snowwhite/base.tid | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/themes/tiddlywiki/snowwhite/base.tid b/themes/tiddlywiki/snowwhite/base.tid index 4bdff613e..025aef8f5 100644 --- a/themes/tiddlywiki/snowwhite/base.tid +++ b/themes/tiddlywiki/snowwhite/base.tid @@ -1,6 +1,10 @@ title: $:/themes/tiddlywiki/snowwhite/base tags: [[$:/tags/Stylesheet]] +\define sidebarbreakpoint-minus-one() +<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/> +\end + \rules only filteredtranscludeinline transcludeinline macrodef macrocallinline .tc-sidebar-header { @@ -17,7 +21,7 @@ tags: [[$:/tags/Stylesheet]] } } -@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (max-width: <<sidebarbreakpoint-minus-one>>) { .tc-tiddler-frame { <<box-shadow none>> } From 480e4e2ce923320819b08888240364e04b545d5e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 23:30:31 +0100 Subject: [PATCH 0937/2376] Make fieldvalue-input a bit larger when viewport is narrow (#5007) * Make field-value input display a bit larger when narrow * Update base.tid * Update base.tid * Update base.tid --- themes/tiddlywiki/vanilla/base.tid | 33 ++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index b6fe7b94c..4e44bcc1b 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -21,6 +21,14 @@ background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}` </$set> \end +\define sidebarbreakpoint() +<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/> +\end + +\define sidebarbreakpoint-minus-one() +<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/> +\end + \define if-fluid-fixed(text,hiddenSidebarText) <$reveal state="$:/themes/tiddlywiki/vanilla/options/sidebarlayout" type="match" text="fluid-fixed"> $text$ @@ -626,7 +634,7 @@ button svg.tc-image-button, button .tc-image-button img { background: <<colour tiddler-info-background>>; } -@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (max-width: <<sidebarbreakpoint-minus-one>>) { .tc-unfold-banner { position: static; @@ -834,7 +842,7 @@ button.tc-btn-invisible.tc-remove-tag-button { position: relative; } -@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (max-width: <<sidebarbreakpoint-minus-one>>) { .tc-sidebar-header { padding: 14px; @@ -848,7 +856,7 @@ button.tc-btn-invisible.tc-remove-tag-button { } } -@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (min-width: <<sidebarbreakpoint>>) { .tc-message-box { margin: 21px -21px 21px -21px; @@ -956,7 +964,7 @@ button.tc-btn-invisible.tc-remove-tag-button { .tc-view-field-value { } -@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (max-width: <<sidebarbreakpoint-minus-one>>) { .tc-tiddler-frame { padding: 14px 14px 14px 14px; } @@ -966,7 +974,7 @@ button.tc-btn-invisible.tc-remove-tag-button { } } -@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (min-width: <<sidebarbreakpoint>>) { .tc-tiddler-frame { padding: 28px 42px 42px 42px; width: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}}; @@ -1225,7 +1233,7 @@ html body.tc-body.tc-single-tiddler-window { ** Adjustments for fluid-fixed mode */ -@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (min-width: <<sidebarbreakpoint>>) { <<if-fluid-fixed text:""" @@ -1435,7 +1443,14 @@ html body.tc-body.tc-single-tiddler-window { .tc-edit-field-add-value { display: inline-block; - width: 35%; +} + +@media (min-width: <<sidebarbreakpoint>>) { + + .tc-edit-field-add-value { + width: 35%; + } + } .tc-edit-field-add-button { @@ -1457,7 +1472,7 @@ html body.tc-body.tc-single-tiddler-window { width: 100%; } -@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (min-width: <<sidebarbreakpoint>>) { .tc-storyview-zoomin-tiddler { width: calc(100% - 84px); @@ -2087,7 +2102,7 @@ html body.tc-body.tc-single-tiddler-window { color: <<colour alert-highlight>>; } -@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (min-width: <<sidebarbreakpoint>>) { .tc-static-alert { position: relative; From 71194d876763e7652fff6edb57065564ec687207 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 8 Nov 2020 23:32:27 +0100 Subject: [PATCH 0938/2376] Added disabled attribute support to ButtonWidget (#5010) * Added disabled attribute to ButtonWidget * Update ButtonWidget.tid --- core/modules/widgets/button.js | 8 ++++++-- editions/tw5.com/tiddlers/widgets/ButtonWidget.tid | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 204a7edf4..0294ac0ba 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -67,7 +67,10 @@ ButtonWidget.prototype.render = function(parent,nextSibling) { // Set the tabindex if(this.tabIndex) { domNode.setAttribute("tabindex",this.tabIndex); - } + } + if(this.isDisabled === "yes") { + domNode.setAttribute("disabled",true); + } // Add a click event handler domNode.addEventListener("click",function (event) { var handled = false; @@ -211,6 +214,7 @@ ButtonWidget.prototype.execute = function() { this.setIndex = this.getAttribute("setIndex"); this.popupTitle = this.getAttribute("popupTitle"); this.tabIndex = this.getAttribute("tabindex"); + this.isDisabled = this.getAttribute("disabled","no"); // Make child widgets this.makeChildWidgets(); }; @@ -220,7 +224,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ ButtonWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes["class"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) { + if(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes["class"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) { this.refreshSelf(); return true; } diff --git a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid index fcaf50f1d..f2c8c6b84 100644 --- a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid @@ -1,6 +1,6 @@ caption: button created: 20131024141900000 -modified: 20200131171028279 +modified: 20201108183908170 tags: Widgets title: ButtonWidget type: text/vnd.tiddlywiki @@ -45,6 +45,7 @@ The content of the `<$button>` widget is displayed within the button. |dragTiddler |An optional tiddler title making the button draggable and identifying the payload tiddler. See DraggableWidget for details | |dragFilter |An optional filter making the button draggable and identifying the list of payload tiddlers. See DraggableWidget for details | |tabindex |Sets the `tabindex` attribute of the button to the given value | +|disabled|<<.from-version "5.1.23">> Optional, disables the button if set to "yes". Defaults to "no"| ''Note:'' In almost all other cases where a TextReference is used as a widget attribute, it will be placed between curly brackets, to [[transclude|Transclusion in WikiText]] the value currently stored there. However, when we use a TextReference as the value of a button widget's <<.attr set>> attribute, we are referencing //the storage location itself//, rather than the value stored there, so we do ''not'' use curly brackets there. //Example:// we could code a button widget that sets the `caption` field of TiddlerA to be the same as that of TiddlerB as: From 519ce3e89d299a19b978b786d97c824de04f5bf3 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 8 Nov 2020 23:37:43 +0100 Subject: [PATCH 0939/2376] Update Release 5.1.23.tid (#5005) Updated release notes --- .../prerelease/tiddlers/Release 5.1.23.tid | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 1af500da6..b50e2116a 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -24,6 +24,8 @@ type: text/vnd.tiddlywiki ! Performance Improvements * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4659]] templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4954]] ListWidget to not initialize parsers for blank `emptyMessage` attributes. +* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/4200]] `story.js` to remove dependency on `wiki.js` for story start up and navigator. ! Usability Improvements @@ -35,6 +37,14 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4791]] a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4937]] the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist. +* Added keyboard support: +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4909]] keyboard support for cycling through the tabs in $:/AdvancedSearch. +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4921]] keyboard support for navigating the field name dropdown in the Edit Template. +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4989]] keyboard support or navigating the `type` field input in the Edit Template. +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4919]] keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template. +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4927]] keyboard shortcut for saving the wiki. +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4978]] keyboard shortcut for deleting a field in the Edit Template. +* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9]] normalize.css's styling of search input fields and [[updated|https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a]] to a modern fork of normalize.css ! Filter Improvements @@ -47,8 +57,10 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4948]] new [[enlist-input Operator]] to parse its input titles as a title lists. * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value . * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4959]] new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs. * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4918]] new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4959]] new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4990]] new [[toggle Operator]] to toggle a title in a list. + ! Hackability Improvements @@ -71,6 +83,22 @@ type: text/vnd.tiddlywiki * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852]] the password prompt to enable it to be customised * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e]] syncer to enable syncadaptors to customise the login prompt * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4979]] support for switching page templates. +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/a1b486436e9278078c524c6aa11f7f4de6cbc877]] the [[tabs Macro]] to support `actions` and `explicitState` attributes. +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4906]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/pull/4907]]) filters used for syncing on node.js and saving the single file version to exclude multiple story lists and history lists based on their prefix, as well as multiple tiddlers that might be used for the import process. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420]] post-render startup actions. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f7f55e8eff8b172d8fd04f095781efa2420b1be6]] support for username/password parameters for `tm-login` message +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4914]] [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2]] support for the content type `image/jpg`. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4908]] support for an override saver. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4923]] utility CSS classes to replace use of ` ` to introduce visual separation. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4952]] a keyboard shortcut to change the sidebar layout. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4983]] option to configure the tag used for TableOfContents in the menubar. +* [[Modified|https://github.com/Jermolene/TiddlyWiki5/pull/4971]] the KeyboardWidget to not trap keys if there are no actions to be invoked. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4975]] buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary`. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4915]] support for named filter run prefixes. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4964]] support for multiple operands for filter operators. +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4985]] all instance of the [[tabs Macro]] in the core to use the explicitState attribute. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5000]] support for the `meta` key as a modifier in actions. ! Bug Fixes @@ -102,6 +130,12 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4751]] a `plugin-priority` field to the TiddlyWeb plugin so that language plugins can override its language strings * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4853]] bug whereby joining an empty list would not return an empty list * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/59f233cd46616646fa8889f65aa9cc7d704d8c9a]] bug exporting tiddlers with double quoted titles +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4900]] bug with syncing plugin tiddlers. +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/4877891980f077c6c31e99cc6a9eb45b5d1230e1]] bug with the position of the tiddler title when there is no icon in use. +* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/commit/3153c588ecddfdc97cc8289720d36b1fb15ef236]] autosave in the upgrade wizard. +* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/pull/4938]] saving of `$:/temp` tiddlers in single file wikis. +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4839]] a bug with the `sortan` filter operator when used with date fields. +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4947]] a bug for location hashes that contain a `#` character. ! Plugin Improvements @@ -114,14 +148,22 @@ type: text/vnd.tiddlywiki ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) * [[CodeMirror Plugin]] ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4950]] CodeMirror plugins to version 5.58.2 * [[Markdown Plugin]] ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebraks +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebreaks ** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4771]] to add `rel="noopener noreferrer"` to external links. * [[Amazon Web Services Plugin]] ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes * ~BibTeX Plugin ** [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/f863acf8ac716dbf892f2d63efa0a130aadfec6a]] to a later fork of the underlying third party ~BibTeX parsing library +* Menubar Plugin +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4974]] so the top margin of the side bar adjusts to the height of the menu +* Dynannotate Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f]] examples of usage in the View Template. +* External Attachments Plugin +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4549]] a bug with relative paths in the External Attachments plugin. ! Contributors @@ -151,3 +193,4 @@ type: text/vnd.tiddlywiki * [[@rmunn|https://github.com/rmunn]] * [[@saqimtiaz|https://github.com/saqimtiaz]] * [[@twMat|https://github.com/twMat]] +* [[@default-kramer|https://github.com/default-kramer]] From 343207fc357a88f0bfaf8b35848b27e6c5c7f5ec Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 8 Nov 2020 23:38:08 +0100 Subject: [PATCH 0940/2376] MenuBar: Add fallback value to breakpoint-plus-one and ... (#5009) * Add fallback value to breakpoint-plus-one and ... ... sidebarbreakpoint-minus-one in case that widths aren't given in px units * Update styles.tid --- plugins/tiddlywiki/menubar/styles.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index 2914e85bf..b33e805c8 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -2,11 +2,11 @@ title: $:/plugins/tiddlywiki/menubar/styles tags: [[$:/tags/Stylesheet]] \define breakpoint-plus-one() -<$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] }}} /> +<$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] ~[{$:/config/plugins/menubar/breakpoint}] }}} /> \end \define sidebarbreakpoint-minus-one() -<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] }}} /> +<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}} /> \end \define set-sidebar-scrollable-top-if-hamburger() @@ -61,7 +61,7 @@ nav.tc-menubar ul.tc-menubar-list { <<box-shadow "1px 1px 5px rgba(0, 0, 0, 0.3)">> } -@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { +@media (max-width: <<sidebarbreakpoint-minus-one>>) { html nav.tc-menubar ul.tc-menubar-list { padding: 0 0 0 8px; From 59c6f4447e25ef73c0678ee3cf8413cf1357bcd2 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 9 Nov 2020 00:21:01 +0100 Subject: [PATCH 0941/2376] Import UI : Fix issue with size of rename button (#5012) * Fix issue with size of rename button * Add css instead of hard coded style attribute --- core/ui/ImportListing.tid | 4 ++-- themes/tiddlywiki/vanilla/base.tid | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index d66cc5d2c..a2c371807 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -49,10 +49,10 @@ title: $:/core/ui/ImportListing <td> <$reveal type="nomatch" state=<<renameFieldState>> text="yes" tag="div"> <$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div" class="tc-flex"> -<$button class="tc-btn-invisible tc-btn-dropdown tc-flex-grow-1" set=<<previewPopupState>> setTo="yes"> +<$button class="tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break" set=<<previewPopupState>> setTo="yes"> <span class="tc-small-gap-right">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/> </$button> -<$button class="tc-btn-invisible tc-small-gap-left" set=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button> +<$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button> </$reveal> <$reveal type="match" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="no"> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 4e44bcc1b..aad261a08 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2055,6 +2055,18 @@ html body.tc-body.tc-single-tiddler-window { width: 100%; } +.tc-import-table svg.tc-image-edit-button { + max-width: unset; +} + +.tc-import-table th:first-of-type { + width: 10%; +} + +.tc-import-table th:last-of-type { + width: 30%; +} + /* ** Alerts */ @@ -2847,3 +2859,7 @@ select { .tc-big-gap-right { margin-right: 1em; } + +.tc-word-break { + word-break: break-all; +} \ No newline at end of file From 1ec8b7877e3c069b720e2107849dbd8a1be074c4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 9 Nov 2020 17:08:34 +0000 Subject: [PATCH 0942/2376] Ensure root template contents is parsed in block mode Embarrassingly, the double blank lines at the end of the tiddler are needed to ensure the transclude widget is recognised in block mode, instead of being wrapped in a paragraph tag. Fixes #5016 --- core/ui/RootTemplate.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/ui/RootTemplate.tid b/core/ui/RootTemplate.tid index a0af69a70..1fd7319ba 100644 --- a/core/ui/RootTemplate.tid +++ b/core/ui/RootTemplate.tid @@ -1,3 +1,4 @@ title: $:/core/ui/RootTemplate -<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode="inline"/> \ No newline at end of file +<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode="inline"/> + From 27bed615ab258bd9d3ceb85a48d61ebdd77ad211 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 9 Nov 2020 19:18:30 +0100 Subject: [PATCH 0943/2376] Move styles from menubar plugin to vanilla/base (#5019) * Update styles.tid * Update base.tid * Update styles.tid * Update base.tid --- plugins/tiddlywiki/menubar/styles.tid | 15 --------------- themes/tiddlywiki/vanilla/base.tid | 21 ++++++++++++++++++++- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index b33e805c8..7fc56eafe 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -191,10 +191,6 @@ nav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button { display: none; } - nav.tc-menubar .tc-menubar-item .tc-show-sidebar-btn svg.tc-image-chevron-left, nav.tc-menubar .tc-menubar-item .tc-hide-sidebar-btn svg.tc-image-chevron-right { - transform: rotate(-90deg); - } - } @media (min-width: <<breakpoint-plus-one>>) { @@ -209,17 +205,6 @@ nav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button { @media (max-width: <<sidebarbreakpoint-minus-one>>) { <<set-sidebar-scrollable-top-if-hamburger>> - - <<if-no-sidebar """ - - .tc-sidebar-header { - min-height: 0; - padding-top: 0; - padding-bottom: 0; - transition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out; - } - - """>> } diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index aad261a08..7225ffcc2 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -769,6 +769,14 @@ button.tc-btn-invisible.tc-remove-tag-button { fill: <<colour foreground>>; } +@media (max-width: <<sidebarbreakpoint-minus-one>>) { + + .tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right { + transform: rotate(-90deg); + } + +} + .tc-sidebar-header { color: <<colour sidebar-foreground>>; fill: <<colour sidebar-foreground>>; @@ -848,7 +856,18 @@ button.tc-btn-invisible.tc-remove-tag-button { padding: 14px; min-height: 32px; margin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}}; + transition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out; } + + <<if-no-sidebar """ + + .tc-sidebar-header { + min-height: 0; + padding-top: 0; + padding-bottom: 0; + } + + """>> .tc-story-river { position: relative; @@ -2862,4 +2881,4 @@ select { .tc-word-break { word-break: break-all; -} \ No newline at end of file +} From 445c15e719d3451b2d96c04aee77fe893272957a Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 9 Nov 2020 19:27:45 +0100 Subject: [PATCH 0944/2376] Extend toggle operator (#5015) * Extend toggle operator to support optional second operand to toggle a value pair * Added tests for extended toggle filter * Updated docs for toggle operator --- core/modules/filters/x-listops.js | 11 +++++++++-- editions/test/tiddlers/tests/test-filters.js | 7 +++++++ .../filters/toggle Operator (Examples).tid | 8 +++++++- .../tiddlers/filters/toggle Operator.tid | 18 ++++++++++++++---- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index ca04b0e2b..60801bffc 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -193,11 +193,18 @@ Extended filter operators to manipulate the current list. */ exports.toggle = function(source, operator) { var results = prepare_results(source), - index = results.indexOf(operator.operand); + index = results.indexOf(operator.operand), + pairIndex = (operator.operands[1] ? results.indexOf(operator.operands[1]) : -1); if(index === -1) { results.push(operator.operand); + if(pairIndex !== -1) { + results.splice(pairIndex,1); + } } else { - results.splice(index, 1); + results.splice(index,1); + if(operator.operands[1]) { + results.push(operator.operands[1]); + } } return results; }; diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 31c66b86f..b40cea45c 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -752,6 +752,13 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[!sortsub:string<sort2>]",anchorWidget).join(",")).toBe("filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,$:/ShadowPlugin,has filter,hasList,TiddlerOne,one"); expect(wiki.filterTiddlers("[[TiddlerOne]] [[$:/TiddlerTwo]] [[Tiddler Three]] [[a fourth tiddler]] +[!sortsub:number<sort3>]",anchorWidget).join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler"); }); + + it("should handle the toggle operator", function() { + expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] +[toggle[one]]").join(",")).toBe("two"); + expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] -[[one]] +[toggle[one]]").join(",")).toBe("two,one"); + expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] +[toggle[three],[four]]").join(",")).toBe("one,two,three"); + expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] [[three]] +[toggle[three],[four]]").join(",")).toBe("one,two,four"); + }); it("should handle multiple operands for search-replace", function() { var widget = require("$:/core/modules/widgets/widget.js"); diff --git a/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid index e53b4ceb0..95e3d56a8 100644 --- a/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid @@ -1,5 +1,5 @@ created: 20201107154352695 -modified: 20201107155030228 +modified: 20201109104951727 title: toggle Operator (Examples) type: text/vnd.tiddlywiki @@ -18,3 +18,9 @@ To toggle a title in a field: ``` <$action-listops $tiddler="target" $field="my-field" $subfilter="+[toggle[done]]" /> ``` + +To toggle between a value pair: + +``` +<$action-listops $tiddler="target" $field="my-field" $subfilter="+[toggle[todo],[done]]" /> +``` diff --git a/editions/tw5.com/tiddlers/filters/toggle Operator.tid b/editions/tw5.com/tiddlers/filters/toggle Operator.tid index ffb84b00b..d01cb522a 100644 --- a/editions/tw5.com/tiddlers/filters/toggle Operator.tid +++ b/editions/tw5.com/tiddlers/filters/toggle Operator.tid @@ -1,13 +1,23 @@ caption: toggle created: 20201107153758990 -modified: 20201107154300086 +modified: 20201109104654310 op-input: a list of items -op-output: the input list with the title <<.place R>> toggled -op-parameter: an item to toggle in the input list -op-parameter-name: R +op-output: the input list with the title specified in the parameter toggled +op-parameter: the <<.op toggle>> operator accepts 1 or 2 parameters, see below for details op-purpose: toggle the title specified in the operand in the input tags: [[Filter Operators]] [[Listops Operators]] [[Order Operators]] title: toggle Operator type: text/vnd.tiddlywiki +<<.from-version "5.1.23">> + +The <<.op search-replace>> operator requires at least one parameter and can accept a second optional parameter: + +``` +[toggle[<title1>],[<title2>]] +``` +* ''title1'' : a title to toggle in the input list. If it is already present, it is removed. Otherwise, it is added. +* ''title2'': (optional). When the second parameter is provided, the operator toggles between the two values in the input list. If neither is present, the first parameter takes precedence is added to the list. + + <<.operator-examples "toggle">> From 09f7ad84b2c6575ac3623053299bf1d4869bb54b Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 9 Nov 2020 19:28:12 +0100 Subject: [PATCH 0945/2376] Added disabled attribute to input widgets (#5014) * checkbox widget: added disabled attribute * Range widget: added disabled attribute * Radio widget: added disabled attribute * EditText widget: added disabled attribute --- core/modules/editor/engines/framed.js | 3 +++ core/modules/editor/engines/simple.js | 3 +++ core/modules/editor/factory.js | 3 ++- core/modules/widgets/checkbox.js | 6 +++++- core/modules/widgets/radio.js | 6 +++++- core/modules/widgets/range.js | 6 +++++- editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid | 3 ++- editions/tw5.com/tiddlers/widgets/EditTextWidget.tid | 3 ++- editions/tw5.com/tiddlers/widgets/RadioWidget.tid | 4 +++- editions/tw5.com/tiddlers/widgets/RangeWidget.tid | 3 ++- 10 files changed, 32 insertions(+), 8 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 8413d11df..4d6113fae 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -74,6 +74,9 @@ function FramedEngine(options) { if(this.widget.editTabIndex) { this.iframeNode.setAttribute("tabindex",this.widget.editTabIndex); } + if(this.widget.isDisabled === "yes") { + this.domNode.setAttribute("disabled",true); + } // Copy the styles from the dummy textarea this.copyStyles(); // Add event listeners diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index 1c50d28b1..0f65e7ceb 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -52,6 +52,9 @@ function SimpleEngine(options) { if(this.widget.editTabIndex) { this.domNode.setAttribute("tabindex",this.widget.editTabIndex); } + if(this.widget.isDisabled === "yes") { + this.domNode.setAttribute("disabled",true); + } // Add an input event handler $tw.utils.addEventListeners(this.domNode,[ {name: "focus", handlerObject: this, handlerMethod: "handleFocusEvent"}, diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index e7c4ec3d8..933c2eb42 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -180,6 +180,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { this.editCancelPopups = this.getAttribute("cancelPopups","") === "yes"; this.editInputActions = this.getAttribute("inputActions"); this.editRefreshTitle = this.getAttribute("refreshTitle"); + this.isDisabled = this.getAttribute("disabled","no"); // Get the default editor element tag and type var tag,type; if(this.editField === "text") { @@ -211,7 +212,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { EditTextWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Completely rerender if any of our attributes have changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) { this.refreshSelf(); return true; } else if (changedTiddlers[this.editRefreshTitle]) { diff --git a/core/modules/widgets/checkbox.js b/core/modules/widgets/checkbox.js index 1edf0bee0..8ea47deb4 100644 --- a/core/modules/widgets/checkbox.js +++ b/core/modules/widgets/checkbox.js @@ -41,6 +41,9 @@ CheckboxWidget.prototype.render = function(parent,nextSibling) { if(this.getValue()) { this.inputDomNode.setAttribute("checked","true"); } + if(this.isDisabled === "yes") { + this.inputDomNode.setAttribute("disabled",true); + } this.labelDomNode.appendChild(this.inputDomNode); this.spanDomNode = this.document.createElement("span"); this.labelDomNode.appendChild(this.spanDomNode); @@ -181,6 +184,7 @@ CheckboxWidget.prototype.execute = function() { this.checkboxDefault = this.getAttribute("default"); this.checkboxClass = this.getAttribute("class",""); this.checkboxInvertTag = this.getAttribute("invertTag",""); + this.isDisabled = this.getAttribute("disabled","no"); // Make the child widgets this.makeChildWidgets(); }; @@ -190,7 +194,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ CheckboxWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes["default"] || changedAttributes["class"]) { + if(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.disabled) { this.refreshSelf(); return true; } else { diff --git a/core/modules/widgets/radio.js b/core/modules/widgets/radio.js index 90eca6bfd..c22aa5ecb 100644 --- a/core/modules/widgets/radio.js +++ b/core/modules/widgets/radio.js @@ -44,6 +44,9 @@ RadioWidget.prototype.render = function(parent,nextSibling) { if(isChecked) { this.inputDomNode.setAttribute("checked","true"); } + if(this.isDisabled === "yes") { + this.inputDomNode.setAttribute("disabled",true); + } this.labelDomNode.appendChild(this.inputDomNode); this.spanDomNode = this.document.createElement("span"); this.labelDomNode.appendChild(this.spanDomNode); @@ -95,6 +98,7 @@ RadioWidget.prototype.execute = function() { this.radioIndex = this.getAttribute("index"); this.radioValue = this.getAttribute("value"); this.radioClass = this.getAttribute("class",""); + this.isDisabled = this.getAttribute("disabled","no"); // Make the child widgets this.makeChildWidgets(); }; @@ -104,7 +108,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ RadioWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes["class"]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes["class"] || changedAttributes.disabled) { this.refreshSelf(); return true; } else { diff --git a/core/modules/widgets/range.js b/core/modules/widgets/range.js index 0d899e891..46e12061a 100644 --- a/core/modules/widgets/range.js +++ b/core/modules/widgets/range.js @@ -46,6 +46,9 @@ RangeWidget.prototype.render = function(parent,nextSibling) { if(this.increment){ this.inputDomNode.setAttribute("step", this.increment); } + if(this.isDisabled === "yes") { + this.inputDomNode.setAttribute("disabled",true); + } this.inputDomNode.value = this.getValue(); // Add a click event handler $tw.utils.addEventListeners(this.inputDomNode,[ @@ -98,6 +101,7 @@ RangeWidget.prototype.execute = function() { this.increment = this.getAttribute("increment"); this.defaultValue = this.getAttribute("default"); this.elementClass = this.getAttribute("class",""); + this.isDisabled = this.getAttribute("disabled","no"); // Make the child widgets this.makeChildWidgets(); }; @@ -107,7 +111,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ RangeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes["default"] || changedAttributes["class"]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.disabled) { this.refreshSelf(); return true; } else { diff --git a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid index 454124a61..9c70af68a 100644 --- a/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/CheckboxWidget.tid @@ -1,6 +1,6 @@ caption: checkbox created: 20131024141900000 -modified: 20190714134002652 +modified: 20201109090732190 tags: Widgets title: CheckboxWidget type: text/vnd.tiddlywiki @@ -29,6 +29,7 @@ The content of the `<$checkbox>` widget is displayed within an HTML `<label>` el |actions |<<.from-version "5.1.14">> A string containing ActionWidgets to be triggered when the status of the checkbox changes (whether it is checked or unchecked) | |uncheckactions |<<.from-version "5.1.16">> A string containing ActionWidgets to be triggered when the checkbox is unchecked | |checkactions |<<.from-version "5.1.20">> A string containing ActionWidgets to be triggered when the checkbox is checked | +|disabled|<<.from-version "5.1.23">> Optional, disables the checkbox if set to "yes". Defaults to "no"| !! Tag Mode diff --git a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid index a73d8bf69..5205741d2 100644 --- a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid @@ -1,6 +1,6 @@ caption: edit-text created: 20131024141900000 -modified: 20151224143914772 +modified: 20201109093034856 tags: Widgets title: EditTextWidget type: text/vnd.tiddlywiki @@ -34,6 +34,7 @@ The content of the `<$edit-text>` widget is ignored. |cancelPopups |<<.from-version "5.1.23">> if set to "yes", cancels all popups when the input gets focus | |inputActions |<<.from-version 5.1.23>> Optional actions that are triggered every time an input event occurs within the input field or textarea | |refreshTitle |<<.from-version 5.1.23>> An optional tiddler title that makes the input field update whenever the specified tiddler changes | +|disabled|<<.from-version "5.1.23">> Optional, disables the text input if set to "yes". Defaults to "no"| ! Notes diff --git a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid index 347a37e72..7a62c03ed 100644 --- a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid @@ -1,6 +1,6 @@ caption: radio created: 20131212195353929 -modified: 20170115095809695 +modified: 20201109091807432 tags: Widgets title: RadioWidget type: text/vnd.tiddlywiki @@ -19,6 +19,8 @@ The content of the `<$radio>` widget is displayed within an HTML `<label>` eleme |index|<<.from-version "5.1.14">> The index of the //tiddler// being [[DataTiddler|DataTiddlers]] bound to the radio button<<.tip "takes precedence over //field//">>| |value |The value for the //field// or //index// of the //tiddler//| |class |The CSS classes assigned to the label around the radio button<$macrocall $name=".tip" _="""<<.from-version "5.1.14">> `tc-radio` is always applied by default, as well as `tc-radio-selected` when selected"""/>| +|disabled|<<.from-version "5.1.23">> Optional, disables the radio input if set to "yes". Defaults to "no"| + !! Field Mode diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid index 97e4d5ba8..bcabe646c 100644 --- a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid @@ -1,6 +1,6 @@ caption: range created: 20171102134825376 -modified: 20191104185454972 +modified: 20201109091723430 tags: Widgets title: RangeWidget type: text/vnd.tiddlywiki @@ -22,6 +22,7 @@ The content of the `<$range>` widget is ignored. |increment |The minimum amount by which a value may be changed. Defaults to 1 | |default |If the field is missing or empty this is the default position for the widget handle relative to the min and max values.| |class |CSS classes to be assigned to the label around the range slider | +|disabled|<<.from-version "5.1.23">> Optional, disables the range input if set to "yes". Defaults to "no"| ! Examples From 568990409a8b973fc79f13ba3091f9ede8fedb36 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 9 Nov 2020 21:43:44 +0100 Subject: [PATCH 0946/2376] Fix typo in toggle operator docs (#5020) --- editions/tw5.com/tiddlers/filters/toggle Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/toggle Operator.tid b/editions/tw5.com/tiddlers/filters/toggle Operator.tid index d01cb522a..2c2738134 100644 --- a/editions/tw5.com/tiddlers/filters/toggle Operator.tid +++ b/editions/tw5.com/tiddlers/filters/toggle Operator.tid @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.23">> -The <<.op search-replace>> operator requires at least one parameter and can accept a second optional parameter: +The <<.op toggle>> operator requires at least one parameter and can accept a second optional parameter: ``` [toggle[<title1>],[<title2>]] From 1eac5c051f8b29f2d4ddfcf470e98ef4932aa0c2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 13 Nov 2020 18:00:37 +0000 Subject: [PATCH 0947/2376] Menu lists should only use white-space: nowrap in the sidebar Fixes #5030 --- themes/tiddlywiki/vanilla/base.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 7225ffcc2..eb57435f8 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -834,7 +834,7 @@ button.tc-btn-invisible.tc-remove-tag-button { fill: <<colour sidebar-controls-foreground-hover>>; } -.tc-menu-list-item { +.tc-sidebar-lists .tc-menu-list-item { white-space: nowrap; } From fa373a1c6f692b2314a7e33b39453e5d6df22bb0 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 13 Nov 2020 19:01:24 +0100 Subject: [PATCH 0948/2376] Make keyboard-driven-input Macro reset to typed input ... (#5031) ... on up/down when reaching the top/bottom of the list --- core/wiki/macros/keyboard-driven-input.tid | 35 +++++++++++++++++----- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/core/wiki/macros/keyboard-driven-input.tid b/core/wiki/macros/keyboard-driven-input.tid index 9a172c904..b0a7ac9c0 100644 --- a/core/wiki/macros/keyboard-driven-input.tid +++ b/core/wiki/macros/keyboard-driven-input.tid @@ -21,13 +21,7 @@ $actions$ </$list> \end -\define input-next-actions(afterOrBefore:"after",reverse:"") -<$list filter="[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]" variable="ignore"> -<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}> -<$set name="configTiddler" value={{{ [subfilter<__configTiddlerFilter__>] }}}> -<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}> -<$set name="filteredList" filter="[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]"> -<$set name="nextItem" value={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}}> +\define input-next-actions-inner() <$list filter="[<nextItem>minlength[1]]" variable="ignore"> <$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/> <$list filter="[<__index__>match[]]"> @@ -38,7 +32,34 @@ $actions$ </$list> <$action-setfield $tiddler=<<__refreshTitle__>> text="yes"/> </$list> +\end + +\define input-next-actions(afterOrBefore:"after",reverse:"") +<$list filter="[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]" variable="ignore"> +<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}> +<$set name="configTiddler" value={{{ [subfilter<__configTiddlerFilter__>] }}}> +<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}> +<$set name="filteredList" filter="[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]"> +<$vars nextItem={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}} firstItem={{{ [enlist<filteredList>nth[1]] }}} lastItem={{{ [enlist<filteredList>last[]] }}}> +<$list filter="[<selectedItem>match<firstItem>!match<lastItem>]" variable="ignore"> +<$set name="nextItem" value={{{ [[$afterOrBefore$]match[before]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}> +<<input-next-actions-inner>> </$set> +</$list> +<$list filter="[<selectedItem>match<lastItem>!match<firstItem>]" variable="ignore"> +<$set name="nextItem" value={{{ [[$afterOrBefore$]match[after]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}> +<<input-next-actions-inner>> +</$set> +</$list> +<$list filter="[<selectedItem>match<firstItem>match<lastItem>]" variable="ignore"> +<$set name="nextItem" value={{{ [<userInput>addsuffix[-userInput]] }}}> +<<input-next-actions-inner>> +</$set> +</$list> +<$list filter="[<selectedItem>!match<firstItem>!match<lastItem>]" variable="ignore"> +<<input-next-actions-inner>> +</$list> +</$vars> </$set> </$vars> </$set> From 497b334d60d8d98129268e2219f217e70e58e76e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 13 Nov 2020 19:50:50 +0100 Subject: [PATCH 0949/2376] Change tag-picker behavior when there is user-input ... (#5032) ... in the search field --- core/wiki/macros/tag-picker.tid | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 43bcf96d7..befd1efbf 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -16,7 +16,7 @@ second-search-filter: [tags[]is[system]search:title<userInput>sort[]] $actions$ </$list> </$set> -<<delete-tag-state-tiddlers>> +<$action-deletetiddler $tiddler=<<tagSelectionState>>/><$action-setfield $tiddler=<<newTagNameTiddler>> text={{{ [<storeTitle>get[text]] }}}/> <$action-setfield $tiddler=<<refreshTitle>> text="yes"/> \end @@ -26,7 +26,8 @@ $actions$ <$set name="currentTiddlerCSSEscaped" value={{{ [<storyTiddler>escapecss[]] }}}> <$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>> preventScroll="true"/> </$set> -<<delete-tag-state-tiddlers>> +<$action-deletetiddler $tiddler=<<tagSelectionState>>/><$action-setfield $tiddler=<<newTagNameTiddler>> text={{{ [<storeTitle>get[text]] }}}/> +<$action-setfield $tiddler=<<refreshTitle>> text="yes"/> $actions$ <$macrocall $name="tag-pill" tag=<<tag>>/> </$button> @@ -58,7 +59,7 @@ $actions$ focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} cancelPopups=<<cancelPopups>> configTiddlerFilter="[[$:/core/macros/tag-picker]]"/> -</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><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">{{$:/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]] }}}> <$button set=<<newTagNameTiddler>> setTo="" class=""> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> From b63c90e401845df648919409ae08f3270ca843d2 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 13 Nov 2020 20:19:55 +0100 Subject: [PATCH 0950/2376] Add missing tooltip and aria-label to clear-tag-input button (#5033) * Add tooltip and aria-label to new clear-tags-input button * Update EditTemplate.multids --- core/language/en-GB/EditTemplate.multids | 2 ++ core/wiki/macros/tag-picker.tid | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/language/en-GB/EditTemplate.multids b/core/language/en-GB/EditTemplate.multids index 31f18765a..8072ba42d 100644 --- a/core/language/en-GB/EditTemplate.multids +++ b/core/language/en-GB/EditTemplate.multids @@ -19,6 +19,8 @@ Shadow/OverriddenWarning: This is a modified shadow tiddler. You can revert to t Tags/Add/Button: add Tags/Add/Button/Hint: add tag Tags/Add/Placeholder: tag name +Tags/ClearInput/Caption: clear input +Tags/ClearInput/Hint: Clear tag input Tags/Dropdown/Caption: tag list Tags/Dropdown/Hint: Show tag list Title/BadCharacterWarning: Warning: avoid using any of the characters <<bad-chars>> in tiddler titles diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index befd1efbf..ccc7637f9 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -59,7 +59,7 @@ $actions$ focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} cancelPopups=<<cancelPopups>> configTiddlerFilter="[[$:/core/macros/tag-picker]]"/> -</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">{{$:/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]] }}}> <$button set=<<newTagNameTiddler>> setTo="" class=""> <$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> From cc3462999b80461fe30b8f4b4f272ccfbbb78b35 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 14 Nov 2020 12:05:35 +0000 Subject: [PATCH 0951/2376] When importing don't use file type as content type Fixes #5028 I've checked that importing other file types still works but would appreciate a sanity check! --- core/modules/wiki.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index b7718cac2..2d66f5440 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1370,7 +1370,7 @@ exports.readFileContent = function(file,type,isBinary,deserializer,callback) { // Onload reader.onload = function(event) { var text = event.target.result, - tiddlerFields = {title: file.name || "Untitled", type: type}; + tiddlerFields = {title: file.name || "Untitled"}; if(isBinary) { var commaPos = text.indexOf(","); if(commaPos !== -1) { From 02a956b1bbdf3910e384e85c63ae60b1b7092fc3 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 14 Nov 2020 13:32:39 +0100 Subject: [PATCH 0952/2376] Add Pop Storyview to Manager Tags Section (#5034) --- core/ui/Manager/ItemSidebarTags.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/ui/Manager/ItemSidebarTags.tid b/core/ui/Manager/ItemSidebarTags.tid index af7572bca..1c2cbf85c 100644 --- a/core/ui/Manager/ItemSidebarTags.tid +++ b/core/ui/Manager/ItemSidebarTags.tid @@ -2,6 +2,7 @@ title: $:/Manager/ItemSidebar/Tags tags: $:/tags/Manager/ItemSidebar caption: {{$:/language/Manager/Item/Tags}} +\whitespace trim \define tag-checkbox-actions() <$action-listops $tiddler="$:/config/Manager/RecentTags" @@ -14,7 +15,7 @@ caption: {{$:/language/Manager/Item/Tags}} \end <p> -<$list filter="[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] " variable="tag"> +<$list filter="[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] " variable="tag" storyview="pop"> <div> <$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>> <$macrocall $name="tag-pill" tag=<<tag>>/> From 1b31c25ea77ee4dce86a9aac4375337423ebd3a6 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 14 Nov 2020 13:00:00 +0000 Subject: [PATCH 0953/2376] Introduce <$action-log> widget to help debugging action strings --- core/modules/utils/utils.js | 13 +++++ core/modules/widgets/action-log.js | 50 +++++++++++++++++++ .../tiddlers/widgets/ActionLogWidget.tid | 30 +++++++++++ 3 files changed, 93 insertions(+) create mode 100644 core/modules/widgets/action-log.js create mode 100644 editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 9018af3a0..a606c2a2a 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -53,6 +53,19 @@ exports.warning = function(text) { exports.log(text,"brown/orange"); }; +/* +Log a table of name: value pairs +*/ +exports.logTable = function(data,columnNames) { + if(console.table) { + console.table(data,columnNames); + } else { + $tw.utils.each(data,function(value,name) { + console.log(name + ": " + value); + }); + } +} + /* Return the integer represented by the str (string). Return the dflt (default) parameter if str is not a base-10 number. diff --git a/core/modules/widgets/action-log.js b/core/modules/widgets/action-log.js new file mode 100644 index 000000000..e3027a8e9 --- /dev/null +++ b/core/modules/widgets/action-log.js @@ -0,0 +1,50 @@ +/*\ +title: $:/core/modules/widgets/action-log.js +type: application/javascript +module-type: widget + +Action widget to log debug messages + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var LogWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +LogWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +LogWidget.prototype.render = function(parent,nextSibling) { + this.computeAttributes(); +}; + +/* +Refresh the widget by ensuring our attributes are up to date +*/ +LogWidget.prototype.refresh = function(changedTiddlers) { + return this.refreshChildren(changedTiddlers); +}; + +/* +Invoke the action associated with this widget +*/ +LogWidget.prototype.invokeAction = function(triggeringWidget,event) { + $tw.utils.logTable(this.attributes,["attribute name","value"]); + return true; // Action was invoked +}; + +exports["action-log"] = LogWidget; + +})(); diff --git a/editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid new file mode 100644 index 000000000..b8440f31b --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid @@ -0,0 +1,30 @@ +caption: action-log +created: 20201114113318785 +modified: 20201114125859948 +tags: Widgets ActionWidgets +title: ActionLogWidget +type: text/vnd.tiddlywiki + +! Introduction + +<<.from-version "5.1.23">> The ''action-log'' widget is an [[action widget|ActionWidgets]] that can be used to output debugging information to the JavaScript console supported by most browsers. This can be useful because otherwise it is difficult to observe what is going on within a sequence of actions. + +ActionWidgets are used within triggering widgets such as the ButtonWidget. + +! Content and Attributes + +The ''action-log'' widget is invisible. Any content within it is ignored. + +When the actions are invoked, the names and values of all attributes are logged to the JavaScript console. + + +<<.tip """A handy tip if an action widget is not behaving as expected is to temporarily change it to an `<$action-log>` widget so that the attributes can be observed.""">> + +! Example + +Here is an example of logging two variables: + +``` +<$action-log myVar=<<myVar>> otherVar=<<otherVar>>/> +``` + From f087a62c990885bcdacf620387278d16e3b4cef1 Mon Sep 17 00:00:00 2001 From: Xavier Cazin <cazinx@gmail.com> Date: Sun, 15 Nov 2020 12:35:17 +0100 Subject: [PATCH 0954/2376] fr-FR translations updates (#5043) * fr-FR translations for Shortcut hints * fr-FR translations related to renaming tiddlers during Import * Correction of NewJournal Tags default config in fr-FR * fr-FR update for the rendertiddlers command * fr-FR translations for new Filter errors * fr-FR update for the savetiddlers command * fr-FR update for the savetiddler command * fr-FR update for the rendertiddler command Co-authored-by: Xavier Cazin <xavier.cazin@gmail.com> --- languages/fr-FR/Help/rendertiddler.tid | 2 ++ languages/fr-FR/Help/rendertiddlers.tid | 6 ++++-- languages/fr-FR/Help/savetiddler.tid | 2 ++ languages/fr-FR/Help/savetiddlers.tid | 2 ++ languages/fr-FR/Import.multids | 5 +++++ languages/fr-FR/Misc.multids | 11 +++++++++++ languages/fr-FR/NewJournalTags.tid | 3 ++- 7 files changed, 28 insertions(+), 3 deletions(-) diff --git a/languages/fr-FR/Help/rendertiddler.tid b/languages/fr-FR/Help/rendertiddler.tid index ec2ddde31..543935585 100644 --- a/languages/fr-FR/Help/rendertiddler.tid +++ b/languages/fr-FR/Help/rendertiddler.tid @@ -1,6 +1,8 @@ title: $:/language/Help/rendertiddler description: Exécute le contenu d'un tiddler pour le type spécifié +(À noter : la commande `--rendertiddler` est dépréciée. Il est préférable d'utiliser la nouvelle commande `--render`, plus souple) + Enregistre vers le chemin indiqué le résultat de l'exécution d'un tiddler pour le type de contenu (ContentType) spécifié — par défaut `text/html`. Un tiddler modèle (template) peut être indiqué optionnellement. Dans ce cas, le tiddler modèle est exécuté après initialisation de la variable "currentTiddler" avec le tiddler dont le titre est donné en premier paramètre de la commande. diff --git a/languages/fr-FR/Help/rendertiddlers.tid b/languages/fr-FR/Help/rendertiddlers.tid index b7d9e663a..e46ff68d4 100644 --- a/languages/fr-FR/Help/rendertiddlers.tid +++ b/languages/fr-FR/Help/rendertiddlers.tid @@ -1,16 +1,18 @@ title: $:/language/Help/rendertiddlers description: Exécute le contenu d'un ensemble de tiddlers sélectionnés par un filtre, pour le type de contenu (ContentType) spécifié +(À noter : la commande `--rendertiddlers` est dépréciée. Il est préférable d'utiliser la nouvelle commande `--render`, plus souple) + Enregistre vers le chemin indiqué et avec l'extension indiquée — par défaut `.html`, le résultat de l'exécution d'un ensemble de tiddlers (sélectionnés par un filtre). Le résultat de l'exécution est rendu selon le type de contenu (ContentType) spécifié — par défaut `text/html` : ``` ---rendertiddlers <filtre> <modèle> <chemindurépertoire> [<type>] [<extension>] ["noclean"] +--rendertiddlers '<filtre>' <modèle> <chemindurépertoire> [<type>] [<extension>] ["noclean"] ``` Par exemple : ``` ---rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain +--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain ``` Par défaut, le nom de fichier est résolu relativement au sous-répertoire `output` du répertoire de l'édition. La commande `--output` peut servir à rediriger la sortie vers un répertoire différent. diff --git a/languages/fr-FR/Help/savetiddler.tid b/languages/fr-FR/Help/savetiddler.tid index f691f5a83..513f65dca 100644 --- a/languages/fr-FR/Help/savetiddler.tid +++ b/languages/fr-FR/Help/savetiddler.tid @@ -1,6 +1,8 @@ title: $:/language/Help/savetiddler description: Enregistre un tiddler dans un fichier sous sa forme brute +(À noter : la commande `--savetiddler` est dépréciée. Il est préférable d'utiliser la nouvelle commande `--save`, plus souple) + Enregistre un tiddler texte ou binaire dans le fichier spécifié, sous sa forme brute. ``` diff --git a/languages/fr-FR/Help/savetiddlers.tid b/languages/fr-FR/Help/savetiddlers.tid index 50c795579..af60b1e94 100644 --- a/languages/fr-FR/Help/savetiddlers.tid +++ b/languages/fr-FR/Help/savetiddlers.tid @@ -1,6 +1,8 @@ title: $:/language/Help/savetiddlers description: Enregistre un groupe de tiddlers vers un répertoire +(À noter : la commande `--savetiddlers` est dépréciée. Il est préférable d'utiliser la nouvelle commande `--save`, plus souple) + Enregistre un groupe de tiddlers vers le chemin spécifié, sous leur forme brute, texte ou binaire. ``` diff --git a/languages/fr-FR/Import.multids b/languages/fr-FR/Import.multids index 51140427a..d4dce1c0e 100644 --- a/languages/fr-FR/Import.multids +++ b/languages/fr-FR/Import.multids @@ -13,6 +13,11 @@ Listing/Preview/TextRaw: Texte (brut) Listing/Preview/Fields: Champs Listing/Preview/Diff: Diff Listing/Preview/DiffFields: Diff (champs) +Listing/Rename/Tooltip: Renommer le tiddler avant l'importation +Listing/Rename/Prompt: Renommer en : +Listing/Rename/ConfirmRename: Renommer le tiddler +Listing/Rename/CancelRename: Annuler +Listing/Rename/OverwriteWarning: Un tiddler avec le même titre existe déjà Upgrader/Plugins/Suppressed/Incompatible: Plugin bloqué : incompatible ou obsolète Upgrader/Plugins/Suppressed/Version: Plugin bloqué (la version <<incoming>> en cours d'importation est plus ancienne que la version <<existing>> actuelle) Upgrader/Plugins/Upgraded: Plugin mis à jour depuis <<incoming>> vers <<upgraded>> diff --git a/languages/fr-FR/Misc.multids b/languages/fr-FR/Misc.multids index 5110bb717..04954a615 100644 --- a/languages/fr-FR/Misc.multids +++ b/languages/fr-FR/Misc.multids @@ -26,7 +26,9 @@ Error/Caption: Erreur Error/EditConflict: Le fichier a changé sur le serveur Error/Filter: Erreur de filtre Error/FilterSyntax: Erreur de syntaxe dans l'expression du filtre +Error/FilterRunPrefix: Erreur de filtre : Préfixe de run inconnu pour le filtre Error/IsFilterOperator: Erreur de filtre : Opérande inconnu pour l'opérateur de filtre 'is' +Error/FormatFilterOperator: Erreur de filtre : Suffixe inconnu pour l'opérateur de filtre 'format' Error/LoadingPluginLibrary: Erreur lors du chargement de la bibliothèque de plugins Error/NetworkErrorAlert: `<h2>''Erreur Réseau''</h2>Il semble que la connexion au serveur soit perdue. Cela peut indiquer un problème avec votre connexion réseau. Essayez de rétablir la connectivité du réseau avant de continuer.<br><br>''Toute modification non enregistrée sera automatiquement synchronisée lorsque la connectivité sera rétablie''.` Error/RecursiveTransclusion: Erreur dans le widget //transclude// : transclusion récursive @@ -62,6 +64,15 @@ OfficialPluginLibrary: Bibliothèque officielle des plugins ~TiddlyWiki OfficialPluginLibrary/Hint: La bibliothèque officielle des plugins ~TiddlyWiki sur tiddlywiki.com. Plugins, thèmes et packs pour les différentes langues sont maintenus par l'équipe responsable du noyau. PluginReloadWarning: Merci d'enregistrer {{$:/core/ui/Buttons/save-wiki}} et de recharger {{$:/core/ui/Buttons/refresh}} pour que les changements apportés aux plugins ~JavaScript prennent effet RecentChanges/DateFormat: DD MMM YYYY +Shortcuts/Input/AdvancedSearch/Hint: Ouvre le panneau Recherche Avancée depuis le champ de recherche de la barre latérale +Shortcuts/Input/Accept/Hint: Accepte l'élément sélectionné +Shortcuts/Input/AcceptVariant/Hint: Accepte l'élément sélectionné (variante) +Shortcuts/Input/Cancel/Hint: Efface le champ d'entrée +Shortcuts/Input/Down/Hint: Sélectionne l'élément suivant +Shortcuts/Input/Tab-Left/Hint: Sélectionne l'onglet précédent +Shortcuts/Input/Tab-Right/Hint: Sélectionne l'onglet suivant +Shortcuts/Input/Up/Hint: Sélectionne l'élément précédent +Shortcuts/SidebarLayout/Hint: Change la mise en forme de la barre latérale SystemTiddler/Tooltip: Ceci est un tiddler système SystemTiddlers/Include/Prompt: Inclure les tiddlers système TagManager/Colour/Heading: Couleur diff --git a/languages/fr-FR/NewJournalTags.tid b/languages/fr-FR/NewJournalTags.tid index 0534cba33..d8b40818b 100644 --- a/languages/fr-FR/NewJournalTags.tid +++ b/languages/fr-FR/NewJournalTags.tid @@ -1,2 +1,3 @@ title: $:/config/NewJournal/Tags -tags: Journal + +Journal From bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 15 Nov 2020 12:37:30 +0100 Subject: [PATCH 0955/2376] Remove image-buttons from type image/svg+xml and add editor-height and stamp button (#5042) * Add stamp button to image/svg+xml * Add editor-height Button to image/svg+xml * Remove rotate-left button from image/svg+xml * Remove size Button from image/svg+xml * Remove paint Button from image/svg+xml * Remove line-width Button from image/svg+xml * Remove clear Button from image/svg+xml * Remove opacity Button from image/svg+xml --- core/ui/EditorToolbar/clear.tid | 2 +- core/ui/EditorToolbar/editor-height.tid | 2 +- core/ui/EditorToolbar/line-width.tid | 4 ++-- core/ui/EditorToolbar/opacity.tid | 2 +- core/ui/EditorToolbar/paint.tid | 2 +- core/ui/EditorToolbar/rotate-left.tid | 2 +- core/ui/EditorToolbar/size.tid | 2 +- core/ui/EditorToolbar/stamp.tid | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/ui/EditorToolbar/clear.tid b/core/ui/EditorToolbar/clear.tid index 876c9f51c..51dadea6f 100644 --- a/core/ui/EditorToolbar/clear.tid +++ b/core/ui/EditorToolbar/clear.tid @@ -3,6 +3,6 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/erase caption: {{$:/language/Buttons/Clear/Caption}} description: {{$:/language/Buttons/Clear/Hint}} -condition: [<targetTiddler>is[image]] +condition: [<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]] dropdown: $:/core/ui/EditorToolbar/clear-dropdown diff --git a/core/ui/EditorToolbar/editor-height.tid b/core/ui/EditorToolbar/editor-height.tid index e81a8f418..eeb1e22c7 100644 --- a/core/ui/EditorToolbar/editor-height.tid +++ b/core/ui/EditorToolbar/editor-height.tid @@ -4,7 +4,7 @@ icon: $:/core/images/fixed-height custom-icon: yes caption: {{$:/language/Buttons/EditorHeight/Caption}} description: {{$:/language/Buttons/EditorHeight/Hint}} -condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] +[first[]] +condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]] dropdown: $:/core/ui/EditorToolbar/editor-height-dropdown <$reveal tag="span" state="$:/config/TextEditor/EditorHeight/Mode" type="match" text="fixed"> diff --git a/core/ui/EditorToolbar/line-width.tid b/core/ui/EditorToolbar/line-width.tid index 3910745a3..4cfed0f79 100644 --- a/core/ui/EditorToolbar/line-width.tid +++ b/core/ui/EditorToolbar/line-width.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/line-width caption: {{$:/language/Buttons/LineWidth/Caption}} description: {{$:/language/Buttons/LineWidth/Hint}} -condition: [<targetTiddler>is[image]] +condition: [<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]] dropdown: $:/core/ui/EditorToolbar/line-width-dropdown -<$text text={{$:/config/BitmapEditor/LineWidth}}/> \ No newline at end of file +<$text text={{$:/config/BitmapEditor/LineWidth}}/> diff --git a/core/ui/EditorToolbar/opacity.tid b/core/ui/EditorToolbar/opacity.tid index 4b2170c06..29a50249e 100644 --- a/core/ui/EditorToolbar/opacity.tid +++ b/core/ui/EditorToolbar/opacity.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/opacity caption: {{$:/language/Buttons/Opacity/Caption}} description: {{$:/language/Buttons/Opacity/Hint}} -condition: [<targetTiddler>is[image]] +condition: [<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]] dropdown: $:/core/ui/EditorToolbar/opacity-dropdown <$text text={{$:/config/BitmapEditor/Opacity}}/> diff --git a/core/ui/EditorToolbar/paint.tid b/core/ui/EditorToolbar/paint.tid index 8ca488888..6fb8cd0c2 100644 --- a/core/ui/EditorToolbar/paint.tid +++ b/core/ui/EditorToolbar/paint.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/paint caption: {{$:/language/Buttons/Paint/Caption}} description: {{$:/language/Buttons/Paint/Hint}} -condition: [<targetTiddler>is[image]] +condition: [<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]] dropdown: $:/core/ui/EditorToolbar/paint-dropdown \define toolbar-paint() diff --git a/core/ui/EditorToolbar/rotate-left.tid b/core/ui/EditorToolbar/rotate-left.tid index 04f70f9a4..75e4fd8f2 100644 --- a/core/ui/EditorToolbar/rotate-left.tid +++ b/core/ui/EditorToolbar/rotate-left.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/rotate-left caption: {{$:/language/Buttons/RotateLeft/Caption}} description: {{$:/language/Buttons/RotateLeft/Hint}} -condition: [<targetTiddler>is[image]] +condition: [<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]] <$action-sendmessage $message="tm-edit-bitmap-operation" diff --git a/core/ui/EditorToolbar/size.tid b/core/ui/EditorToolbar/size.tid index ca9d31331..951226386 100644 --- a/core/ui/EditorToolbar/size.tid +++ b/core/ui/EditorToolbar/size.tid @@ -3,6 +3,6 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/size caption: {{$:/language/Buttons/Size/Caption}} description: {{$:/language/Buttons/Size/Hint}} -condition: [<targetTiddler>is[image]] +condition: [<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]] dropdown: $:/core/ui/EditorToolbar/size-dropdown diff --git a/core/ui/EditorToolbar/stamp.tid b/core/ui/EditorToolbar/stamp.tid index a69be3f18..67080636a 100644 --- a/core/ui/EditorToolbar/stamp.tid +++ b/core/ui/EditorToolbar/stamp.tid @@ -3,7 +3,7 @@ tags: $:/tags/EditorToolbar icon: $:/core/images/stamp caption: {{$:/language/Buttons/Stamp/Caption}} description: {{$:/language/Buttons/Stamp/Hint}} -condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] +[first[]] +condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]] shortcuts: ((stamp)) dropdown: $:/core/ui/EditorToolbar/stamp-dropdown text: From 04bf6e0fd83290fc1d97c7b1ed4789edd4414de2 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 15 Nov 2020 12:40:08 +0100 Subject: [PATCH 0956/2376] Action widget: confirm (#5037) * added action widget: confirm * Check for all attributes in refresh handler * Always return a value from invokeActions --- core/modules/widgets/confirm.js | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 core/modules/widgets/confirm.js diff --git a/core/modules/widgets/confirm.js b/core/modules/widgets/confirm.js new file mode 100644 index 000000000..ffc506ec6 --- /dev/null +++ b/core/modules/widgets/confirm.js @@ -0,0 +1,77 @@ +/*\ + +title: $:/core/modules/widgets/action-confirm.js +type: application/javascript +module-type: widget + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var ConfirmWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +ConfirmWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +ConfirmWidget.prototype.render = function(parent,nextSibling) { + this.computeAttributes(); + this.execute(); + this.parentDomNode = parent; + this.renderChildren(parent,nextSibling); +}; + +/* +Compute the internal state of the widget +*/ +ConfirmWidget.prototype.execute = function() { + this.message = this.getAttribute("$message"); + this.prompt = (this.getAttribute("$prompt","yes") == "yes" ? true : false); + this.makeChildWidgets(); +}; + +/* +Refresh the widget by ensuring our attributes are up to date +*/ +ConfirmWidget.prototype.refresh = function(changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if(changedAttributes["$message"] || changedAttributes["$prompt"]) { + this.refreshSelf(); + return true; + } + return this.refreshChildren(changedTiddlers); +}; + +/* +Invoke the action associated with this widget +*/ +ConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) { + var invokeActions = true, + handled = true; + if(this.message && this.prompt) { + invokeActions = confirm(this.message); + } + if(invokeActions) { + handled = this.invokeActions(triggeringWidget,event); + } + return handled; +}; + +ConfirmWidget.prototype.allowActionPropagation = function() { + return false; +}; + +exports["action-confirm"] = ConfirmWidget; + +})(); \ No newline at end of file From 7078ca2c1e389cbe9aedccb593835dd270bea7fb Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 15 Nov 2020 12:42:46 +0100 Subject: [PATCH 0957/2376] Revert Tag-input behavior to how it was before (#5041) --- core/wiki/macros/tag-picker.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index ccc7637f9..9c17d3052 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -16,7 +16,7 @@ second-search-filter: [tags[]is[system]search:title<userInput>sort[]] $actions$ </$list> </$set> -<$action-deletetiddler $tiddler=<<tagSelectionState>>/><$action-setfield $tiddler=<<newTagNameTiddler>> text={{{ [<storeTitle>get[text]] }}}/> +<<delete-tag-state-tiddlers>> <$action-setfield $tiddler=<<refreshTitle>> text="yes"/> \end @@ -26,7 +26,7 @@ $actions$ <$set name="currentTiddlerCSSEscaped" value={{{ [<storyTiddler>escapecss[]] }}}> <$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>> preventScroll="true"/> </$set> -<$action-deletetiddler $tiddler=<<tagSelectionState>>/><$action-setfield $tiddler=<<newTagNameTiddler>> text={{{ [<storeTitle>get[text]] }}}/> +<<delete-tag-state-tiddlers>> <$action-setfield $tiddler=<<refreshTitle>> text="yes"/> $actions$ <$macrocall $name="tag-pill" tag=<<tag>>/> From 2aa6e761fd618ad3bc474162f294fe54a7388a6b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 15 Nov 2020 13:04:50 +0100 Subject: [PATCH 0958/2376] Make Tag-Picker Macro work with every field (#5035) * Make tag-picker work with every field * Make EditTemplate/tags work with every field * Make NewTiddlerTags and NewJournalTags selectable through tag-picker * Update tag-picker Macro Docs --- core/ui/ControlPanel/Basics.tid | 4 +-- core/ui/EditTemplate/tags.tid | 20 +++++++---- core/wiki/macros/tag-picker.tid | 34 ++++++++++--------- .../tiddlers/macros/tag-picker_Macro.tid | 2 ++ 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 4aaf83c4d..43f621901 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -26,8 +26,8 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | -|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewTiddler/Tags" tag="input" default=""/> | -|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Tags" tag="input" default=""/> | +|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewTiddler/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}</$vars> | +|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewJournal/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}</$vars> | |<$link to="$:/config/AutoFocus"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index 15d95d705..9548168a3 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -11,27 +11,33 @@ fill:$(foregroundColor)$; color:$(foregroundColor)$; \end -\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon) +\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:"tags") \whitespace trim <$vars foregroundColor=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">> backgroundColor="""$colour$"""> <span style=<<tag-styles>> class="tc-tag-label tc-tag-list-item"> <$transclude tiddler="""$icon$"""/><$view field="title" format="text" /> -<$button message="tm-remove-tag" param={{!!title}} class="tc-btn-invisible tc-remove-tag-button">{{$:/core/images/close-button}}</$button> +<$button class="tc-btn-invisible tc-remove-tag-button"><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="-[{!!title}]"/>{{$:/core/images/close-button}}</$button> </span> </$vars> \end -\define tag-body(colour,palette,icon) -<$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon="""$icon$"""/> +\define tag-body(colour,palette,icon,tagField:"tags") +<$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon="""$icon$""" tagField=<<__tagField__>>/> \end +\define edit-tags-template(tagField:"tags") +\whitespace trim <div class="tc-edit-tags"> <$fieldmangler> -<$list filter="[all[current]tags[]sort[title]]" storyview="pop"> -<$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/> +<$list filter="[list[!!$tagField$]sort[title]]" storyview="pop"> +<$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/> </$list> <$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups="yes"> -<$macrocall $name="tag-picker"/> +<$macrocall $name="tag-picker" tagField=<<__tagField__>>/> </$vars> </$fieldmangler> </div> +\end +<$set name="saveTiddler" value=<<currentTiddler>>> +<$macrocall $name="edit-tags-template" tagField=<<tagField>>/> +</$set> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 9c17d3052..30e0fc8ab 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -7,12 +7,12 @@ second-search-filter: [tags[]is[system]search:title<userInput>sort[]] \define delete-tag-state-tiddlers() <$action-deletetiddler $filter="[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]"/> -\define add-tag-actions(actions) +\define add-tag-actions(actions,tagField:"tags") <$set name="tag" value={{{ [<__tiddler__>get[text]] }}}> -<$list filter="[<currentTiddler>!tag<tag>]" variable="ignore" emptyMessage=""" -<$action-sendmessage $message="tm-remove-tag" $param=<<tag>>/> +<$list filter="[<saveTiddler>!contains:$tagField$<tag>!match[]]" variable="ignore" emptyMessage=""" +<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="-[<tag>]"/> """> -<$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> +<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>]"/> $actions$ </$list> </$set> @@ -20,10 +20,10 @@ $actions$ <$action-setfield $tiddler=<<refreshTitle>> text="yes"/> \end -\define tag-button(actions,selectedClass) +\define tag-button(actions,selectedClass,tagField:"tags") <$button class="tc-btn-invisible $selectedClass$" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> -<$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> -<$set name="currentTiddlerCSSEscaped" value={{{ [<storyTiddler>escapecss[]] }}}> +<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>]"/> +<$set name="currentTiddlerCSSEscaped" value={{{ [<saveTiddler>escapecss[]] }}}> <$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>> preventScroll="true"/> </$set> <<delete-tag-state-tiddlers>> @@ -47,14 +47,14 @@ $actions$ </$set> \end -\define tag-picker-inner(actions) +\define tag-picker-inner(actions,tagField:"tags") \whitespace trim <$vars tagSelectionState=<<qualify "$:/state/selected-tag">> storeTitle=<<qualify "$:/temp/NewTagName/input">> refreshTitle=<<qualify "$:/temp/NewTagName/refresh">> nonSystemTagsFilter="[tags[]!is[system]search:title<userInput>sort[]]" systemTagsFilter="[tags[]is[system]search:title<userInput>sort[]]"> <div class="tc-edit-add-tag"> <div> <span class="tc-add-tag-name tc-small-gap-right"> <$macrocall $name="keyboard-driven-input" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> - selectionStateTitle=<<tagSelectionState>> inputAcceptActions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>>/>""" + selectionStateTitle=<<tagSelectionState>> inputAcceptActions="""<$macrocall $name="add-tag-actions" actions=<<__actions__>> tagField=<<__tagField__>>/>""" inputCancelActions=<<clear-tags-actions>> tag="input" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-edit-texteditor tc-popup-handle" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} @@ -62,9 +62,9 @@ $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"> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> <$button set=<<newTagNameTiddler>> setTo="" class=""> -<$action-sendmessage $message="tm-add-tag" $param=<<tag>>/> +<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>]"/> $actions$ -<$set name="currentTiddlerCSSEscaped" value={{{ [<currentTiddler>escapecss[]] }}}> +<$set name="currentTiddlerCSSEscaped" value={{{ [<saveTiddler>escapecss[]] }}}> <<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>>/> </$set> {{$:/language/EditTemplate/Tags/Add/Button}} @@ -79,14 +79,14 @@ $actions$ <$list filter="[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> <$list filter=<<nonSystemTagsFilter>> variable="tag"> <$list filter="[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$macrocall $name="tag-button" actions=<<__actions__>> selectedClass="tc-tag-button-selected"/>"""> -<$macrocall $name="tag-button" actions=<<__actions__>>/> +<$macrocall $name="tag-button" actions=<<__actions__>> tagField=<<__tagField__>>/> </$list> </$list></$list> <hr> <$list filter="[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> <$list filter=<<systemTagsFilter>> variable="tag"> <$list filter="[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$macrocall $name="tag-button" actions=<<__actions__>> selectedClass="tc-tag-button-selected"/>"""> -<$macrocall $name="tag-button" actions=<<__actions__>>/> +<$macrocall $name="tag-button" actions=<<__actions__>> tagField=<<__tagField__>>/> </$list> </$list></$list> </$set> @@ -96,11 +96,13 @@ $actions$ </div> </$vars> \end -\define tag-picker(actions) +\define tag-picker(actions,tagField:"tags") \whitespace trim -<$list filter="[<newTagNameTiddler>match[]]" emptyMessage="""<$macrocall $name="tag-picker-inner" actions=<<__actions__>>/>"""> +<$set name="saveTiddler" value=<<currentTiddler>>> +<$list filter="[<newTagNameTiddler>match[]]" emptyMessage="""<$macrocall $name="tag-picker-inner" actions=<<__actions__>> tagField=<<__tagField__>>/>"""> <$set name="newTagNameTiddler" value=<<qualify "$:/temp/NewTagName">>> -<$macrocall $name="tag-picker-inner" actions=<<__actions__>>/> +<$macrocall $name="tag-picker-inner" actions=<<__actions__>> tagField=<<__tagField__>>/> </$set> </$list> +</$set> \end diff --git a/editions/tw5.com/tiddlers/macros/tag-picker_Macro.tid b/editions/tw5.com/tiddlers/macros/tag-picker_Macro.tid index b2d9cb9f0..bd67256c9 100644 --- a/editions/tw5.com/tiddlers/macros/tag-picker_Macro.tid +++ b/editions/tw5.com/tiddlers/macros/tag-picker_Macro.tid @@ -11,5 +11,7 @@ The <<.def tag-picker>> [[macro|Macros]] generates a combination of a text box a ;actions : Action widgets to be triggered when the pill is clicked. Within the text, the variable ''tag'' contains the title of the selected tag. +;tagField +: <<.from-version 5.1.23>> The ''field'' that gets updated with the selected tag. Defaults to ''tags''. <<.macro-examples "tag-picker">> From d9b8a800c6341b229fa2a1865161282c3dbed570 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sun, 15 Nov 2020 23:49:05 +0800 Subject: [PATCH 0959/2376] Update chinese translations (#5046) * add the tooltip and aria-label of clear-tag-input button --- languages/zh-Hans/EditTemplate.multids | 2 ++ languages/zh-Hant/EditTemplate.multids | 2 ++ 2 files changed, 4 insertions(+) diff --git a/languages/zh-Hans/EditTemplate.multids b/languages/zh-Hans/EditTemplate.multids index 8c837725e..36b6d84a8 100644 --- a/languages/zh-Hans/EditTemplate.multids +++ b/languages/zh-Hans/EditTemplate.multids @@ -19,6 +19,8 @@ Shadow/OverriddenWarning: 这是一个修改过的默认条目。删除此条目 Tags/Add/Button: 添加 Tags/Add/Button/Hint: 添加标签 Tags/Add/Placeholder: 标签名称 +Tags/ClearInput/Caption: 清除输入 +Tags/ClearInput/Hint: 清除标签输入 Tags/Dropdown/Caption: 标签清单 Tags/Dropdown/Hint: 显示标签清单 Title/BadCharacterWarning: 请注意,避免在条目名称中使用这些字符:<<bad-chars>> diff --git a/languages/zh-Hant/EditTemplate.multids b/languages/zh-Hant/EditTemplate.multids index 9b339eff7..31912ad90 100644 --- a/languages/zh-Hant/EditTemplate.multids +++ b/languages/zh-Hant/EditTemplate.multids @@ -19,6 +19,8 @@ Shadow/OverriddenWarning: 這是一個修改過的預設條目。刪除此條目 Tags/Add/Button: 新增 Tags/Add/Button/Hint: 新增標籤 Tags/Add/Placeholder: 標籤名稱 +Tags/ClearInput/Caption: 清除輸入 +Tags/ClearInput/Hint: 清除標籤輸入 Tags/Dropdown/Caption: 標籤清單 Tags/Dropdown/Hint: 顯示標籤清單 Title/BadCharacterWarning: 請注意,避免在條目名稱中使用這些字元:<<bad-chars>> From a2b2e117e3bd756c2dc7e0e4800a49fe7403f0bd Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 15 Nov 2020 16:49:43 +0100 Subject: [PATCH 0960/2376] Delete all state tiddlers after adding a new field (#5045) --- core/ui/EditTemplate/fields.tid | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 37d4dbc3e..7c041d122 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -16,8 +16,7 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ \define new-field-actions() <$action-sendmessage $message="tm-add-field" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/> -<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/> -<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/> +<$action-deletetiddler $filter="[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]"/> <$action-sendmessage $message="tm-focus-selector" $param=<<current-tiddler-new-field-selector>>/> \end @@ -44,8 +43,7 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ <$action-sendmessage $message="tm-add-field" $name=<<name>> $value={{{ [<newFieldValueTiddler>get[text]] }}}/> -<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/> -<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/> +<$action-deletetiddler $filter="[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]"/> <<lingo Fields/Add/Button>> </$button> </$reveal> @@ -89,8 +87,8 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <em class="tc-edit tc-big-gap-right"> <<lingo Fields/Add/Prompt>> </em> -<div class="tc-edit-field-add-name-wrapper"> <$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<qualify "$:/temp/fieldname/input">> searchListState=<<qualify "$:/temp/fieldname/selected-item">>> +<div class="tc-edit-field-add-name-wrapper"> <$macrocall $name="keyboard-driven-input" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<searchListState>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify "$:/state/popup/field-dropdown">> class="tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} @@ -127,7 +125,6 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> </$set> </div> </$reveal> -</$vars> </div> <span class="tc-edit-field-add-value tc-small-gap-right"> <$set name="currentTiddlerCSSescaped" value={{{ [<currentTiddler>escapecss[]] }}}> @@ -139,5 +136,6 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <span class="tc-edit-field-add-button"> <$macrocall $name="new-field"/> </span> +</$vars> </div> </$fieldmangler> From 13499557bf84cbb8b0e88ad881d00735aa01fa6b Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 15 Nov 2020 17:04:03 +0100 Subject: [PATCH 0961/2376] Fix whitespace in x-listops.js and tweak toggle operator (#5024) * Replaced leading spaces with tabs * Tweak toggle[] to insert new value in same list position --- core/modules/filters/x-listops.js | 344 ++++++++++--------- editions/test/tiddlers/tests/test-filters.js | 1 + 2 files changed, 174 insertions(+), 171 deletions(-) diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index 60801bffc..73f19ccf5 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -8,186 +8,186 @@ Extended filter operators to manipulate the current list. \*/ (function () { - /*jslint node: true, browser: true */ - /*global $tw: false */ - "use strict"; + /*jslint node: true, browser: true */ + /*global $tw: false */ + "use strict"; - /* - Fetch titles from the current list - */ - var prepare_results = function (source) { - var results = []; - source(function (tiddler, title) { - results.push(title); - }); - return results; - }; + /* + Fetch titles from the current list + */ + var prepare_results = function (source) { + var results = []; + source(function (tiddler, title) { + results.push(title); + }); + return results; + }; - /* - Moves a number of items from the tail of the current list before the item named in the operand - */ - exports.putbefore = function (source, operator) { - var results = prepare_results(source), - index = results.indexOf(operator.operand), - count = $tw.utils.getInt(operator.suffix,1); - return (index === -1) ? - results.slice(0, -1) : - results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count)); - }; + /* + Moves a number of items from the tail of the current list before the item named in the operand + */ + exports.putbefore = function (source, operator) { + var results = prepare_results(source), + index = results.indexOf(operator.operand), + count = $tw.utils.getInt(operator.suffix,1); + return (index === -1) ? + results.slice(0, -1) : + results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count)); + }; - /* - Moves a number of items from the tail of the current list after the item named in the operand - */ - exports.putafter = function (source, operator) { - var results = prepare_results(source), - index = results.indexOf(operator.operand), - count = $tw.utils.getInt(operator.suffix,1); - return (index === -1) ? - results.slice(0, -1) : - results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count)); - }; + /* + Moves a number of items from the tail of the current list after the item named in the operand + */ + exports.putafter = function (source, operator) { + var results = prepare_results(source), + index = results.indexOf(operator.operand), + count = $tw.utils.getInt(operator.suffix,1); + return (index === -1) ? + results.slice(0, -1) : + results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count)); + }; - /* - Replaces the item named in the operand with a number of items from the tail of the current list - */ - exports.replace = function (source, operator) { - var results = prepare_results(source), - index = results.indexOf(operator.operand), - count = $tw.utils.getInt(operator.suffix,1); - return (index === -1) ? - results.slice(0, -count) : - results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count)); - }; + /* + Replaces the item named in the operand with a number of items from the tail of the current list + */ + exports.replace = function (source, operator) { + var results = prepare_results(source), + index = results.indexOf(operator.operand), + count = $tw.utils.getInt(operator.suffix,1); + return (index === -1) ? + results.slice(0, -count) : + results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count)); + }; - /* - Moves a number of items from the tail of the current list to the head of the list - */ - exports.putfirst = function (source, operator) { - var results = prepare_results(source), - count = $tw.utils.getInt(operator.suffix,1); - return results.slice(-count).concat(results.slice(0, -count)); - }; + /* + Moves a number of items from the tail of the current list to the head of the list + */ + exports.putfirst = function (source, operator) { + var results = prepare_results(source), + count = $tw.utils.getInt(operator.suffix,1); + return results.slice(-count).concat(results.slice(0, -count)); + }; - /* - Moves a number of items from the head of the current list to the tail of the list - */ - exports.putlast = function (source, operator) { - var results = prepare_results(source), - count = $tw.utils.getInt(operator.suffix,1); - return results.slice(count).concat(results.slice(0, count)); - }; + /* + Moves a number of items from the head of the current list to the tail of the list + */ + exports.putlast = function (source, operator) { + var results = prepare_results(source), + count = $tw.utils.getInt(operator.suffix,1); + return results.slice(count).concat(results.slice(0, count)); + }; - /* - Moves the item named in the operand a number of places forward or backward in the list - */ - exports.move = function (source, operator) { - var results = prepare_results(source), - index = results.indexOf(operator.operand), - count = $tw.utils.getInt(operator.suffix,1), - marker = results.splice(index, 1), - offset = (index + count) > 0 ? index + count : 0; - return results.slice(0, offset).concat(marker).concat(results.slice(offset)); - }; + /* + Moves the item named in the operand a number of places forward or backward in the list + */ + exports.move = function (source, operator) { + var results = prepare_results(source), + index = results.indexOf(operator.operand), + count = $tw.utils.getInt(operator.suffix,1), + marker = results.splice(index, 1), + offset = (index + count) > 0 ? index + count : 0; + return results.slice(0, offset).concat(marker).concat(results.slice(offset)); + }; - /* - Returns the items from the current list that are after the item named in the operand - */ - exports.allafter = function (source, operator) { - var results = prepare_results(source), - index = results.indexOf(operator.operand); - return (index === -1) ? [] : - (operator.suffix) ? results.slice(index) : - results.slice(index + 1); - }; + /* + Returns the items from the current list that are after the item named in the operand + */ + exports.allafter = function (source, operator) { + var results = prepare_results(source), + index = results.indexOf(operator.operand); + return (index === -1) ? [] : + (operator.suffix) ? results.slice(index) : + results.slice(index + 1); + }; - /* - Returns the items from the current list that are before the item named in the operand - */ - exports.allbefore = function (source, operator) { - var results = prepare_results(source), - index = results.indexOf(operator.operand); - return (index === -1) ? [] : - (operator.suffix) ? results.slice(0, index + 1) : - results.slice(0, index); - }; + /* + Returns the items from the current list that are before the item named in the operand + */ + exports.allbefore = function (source, operator) { + var results = prepare_results(source), + index = results.indexOf(operator.operand); + return (index === -1) ? [] : + (operator.suffix) ? results.slice(0, index + 1) : + results.slice(0, index); + }; - /* - Appends the items listed in the operand array to the tail of the current list - */ - exports.append = function (source, operator) { - var append = $tw.utils.parseStringArray(operator.operand, "true"), - results = prepare_results(source), - count = parseInt(operator.suffix) || append.length; - return (append.length === 0) ? results : - (operator.prefix) ? results.concat(append.slice(-count)) : - results.concat(append.slice(0, count)); - }; + /* + Appends the items listed in the operand array to the tail of the current list + */ + exports.append = function (source, operator) { + var append = $tw.utils.parseStringArray(operator.operand, "true"), + results = prepare_results(source), + count = parseInt(operator.suffix) || append.length; + return (append.length === 0) ? results : + (operator.prefix) ? results.concat(append.slice(-count)) : + results.concat(append.slice(0, count)); + }; - /* - Prepends the items listed in the operand array to the head of the current list - */ - exports.prepend = function (source, operator) { - var prepend = $tw.utils.parseStringArray(operator.operand, "true"), - results = prepare_results(source), - count = $tw.utils.getInt(operator.suffix,prepend.length); - return (prepend.length === 0) ? results : - (operator.prefix) ? prepend.slice(-count).concat(results) : - prepend.slice(0, count).concat(results); - }; + /* + Prepends the items listed in the operand array to the head of the current list + */ + exports.prepend = function (source, operator) { + var prepend = $tw.utils.parseStringArray(operator.operand, "true"), + results = prepare_results(source), + count = $tw.utils.getInt(operator.suffix,prepend.length); + return (prepend.length === 0) ? results : + (operator.prefix) ? prepend.slice(-count).concat(results) : + prepend.slice(0, count).concat(results); + }; - /* - Returns all items from the current list except the items listed in the operand array - */ - exports.remove = function (source, operator) { - var array = $tw.utils.parseStringArray(operator.operand, "true"), - results = prepare_results(source), - count = parseInt(operator.suffix) || array.length, - p, - len, - index; - len = array.length - 1; - for (p = 0; p < count; ++p) { - if (operator.prefix) { - index = results.indexOf(array[len - p]); - } else { - index = results.indexOf(array[p]); - } - if (index !== -1) { - results.splice(index, 1); - } - } - return results; - }; + /* + Returns all items from the current list except the items listed in the operand array + */ + exports.remove = function (source, operator) { + var array = $tw.utils.parseStringArray(operator.operand, "true"), + results = prepare_results(source), + count = parseInt(operator.suffix) || array.length, + p, + len, + index; + len = array.length - 1; + for (p = 0; p < count; ++p) { + if (operator.prefix) { + index = results.indexOf(array[len - p]); + } else { + index = results.indexOf(array[p]); + } + if (index !== -1) { + results.splice(index, 1); + } + } + return results; + }; - /* - Returns all items from the current list sorted in the order of the items in the operand array - */ - exports.sortby = function (source, operator) { - var results = prepare_results(source); - if (!results || results.length < 2) { - return results; - } - var lookup = $tw.utils.parseStringArray(operator.operand, "true"); - results.sort(function (a, b) { - return lookup.indexOf(a) - lookup.indexOf(b); - }); - return results; - }; + /* + Returns all items from the current list sorted in the order of the items in the operand array + */ + exports.sortby = function (source, operator) { + var results = prepare_results(source); + if (!results || results.length < 2) { + return results; + } + var lookup = $tw.utils.parseStringArray(operator.operand, "true"); + results.sort(function (a, b) { + return lookup.indexOf(a) - lookup.indexOf(b); + }); + return results; + }; + + /* + Removes all duplicate items from the current list + */ + exports.unique = function (source, operator) { + var results = prepare_results(source); + var set = results.reduce(function (a, b) { + if (a.indexOf(b) < 0) { + a.push(b); + } + return a; + }, []); + return set; + }; - /* - Removes all duplicate items from the current list - */ - exports.unique = function (source, operator) { - var results = prepare_results(source); - var set = results.reduce(function (a, b) { - if (a.indexOf(b) < 0) { - a.push(b); - } - return a; - }, []); - return set; - }; - /* Toggles an item in the current list. */ @@ -196,17 +196,19 @@ Extended filter operators to manipulate the current list. index = results.indexOf(operator.operand), pairIndex = (operator.operands[1] ? results.indexOf(operator.operands[1]) : -1); if(index === -1) { - results.push(operator.operand); if(pairIndex !== -1) { - results.splice(pairIndex,1); + results.splice(pairIndex,1,operator.operand); + } else { + results.push(operator.operand); } } else { - results.splice(index,1); if(operator.operands[1]) { - results.push(operator.operands[1]); + results.splice(index,1,operator.operands[1]); + } else { + results.splice(index,1); } } return results; }; - + })(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index b40cea45c..dedfd5179 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -758,6 +758,7 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] -[[one]] +[toggle[one]]").join(",")).toBe("two,one"); expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] +[toggle[three],[four]]").join(",")).toBe("one,two,three"); expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] [[three]] +[toggle[three],[four]]").join(",")).toBe("one,two,four"); + expect(wiki.filterTiddlers("[[Tiddler Three]tags[]] [[three]] [[four]] +[toggle[three],[five]]").join(",")).toBe("one,two,five,four"); }); it("should handle multiple operands for search-replace", function() { From ca4cdc81dd8526d1695c5759865d9173d92df889 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 15 Nov 2020 17:04:39 +0100 Subject: [PATCH 0962/2376] Remove reduntant fieldmangler widget from tags EditTemplate (#5044) --- core/ui/EditTemplate/tags.tid | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index 9548168a3..c5134db3d 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -28,14 +28,12 @@ color:$(foregroundColor)$; \define edit-tags-template(tagField:"tags") \whitespace trim <div class="tc-edit-tags"> -<$fieldmangler> <$list filter="[list[!!$tagField$]sort[title]]" storyview="pop"> <$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/> </$list> <$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups="yes"> <$macrocall $name="tag-picker" tagField=<<__tagField__>>/> </$vars> -</$fieldmangler> </div> \end <$set name="saveTiddler" value=<<currentTiddler>>> From a637f7fb60a77b290faa42d8e534424aa149e3c3 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 16 Nov 2020 17:27:46 +0100 Subject: [PATCH 0963/2376] Modals: add navigator to handle tm-navigate (#5027) * Wrap modal in a navigator widget to allow tm-navigate to work * Move all story list handling to Modal * Make sure any values for story list or history list sent as variables have precedence * Code clean up --- core/modules/utils/dom/modal.js | 40 +++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/core/modules/utils/dom/modal.js b/core/modules/utils/dom/modal.js index df6ef5432..561dbf298 100644 --- a/core/modules/utils/dom/modal.js +++ b/core/modules/utils/dom/modal.js @@ -13,6 +13,7 @@ Modal message mechanism "use strict"; var widget = require("$:/core/modules/widgets/widget.js"); +var navigator = require("$:/core/modules/widgets/navigator.js"); var Modal = function(wiki) { this.wiki = wiki; @@ -41,7 +42,12 @@ Modal.prototype.display = function(title,options) { return; } // Create the variables - var variables = $tw.utils.extend({currentTiddler: title},options.variables); + var variables = $tw.utils.extend({ + currentTiddler: title, + "tv-story-list": (options.event && options.event.widget ? options.event.widget.getVariable("tv-story-list") : ""), + "tv-history-list": (options.event && options.event.widget ? options.event.widget.getVariable("tv-history-list") : "") + },options.variables); + // Create the wrapper divs var wrapper = this.srcDocument.createElement("div"), modalBackdrop = this.srcDocument.createElement("div"), @@ -75,6 +81,31 @@ Modal.prototype.display = function(title,options) { modalFooter.appendChild(modalFooterHelp); modalFooter.appendChild(modalFooterButtons); modalWrapper.appendChild(modalFooter); + var navigatorTree = { + "type": "navigator", + "attributes": { + "story": { + "name": "story", + "type": "string", + "value": variables["tv-story-list"] + }, + "history": { + "name": "history", + "type": "string", + "value": variables["tv-history-list"] + } + }, + "tag": "$navigator", + "isBlock": true, + "children": [] + }; + var navigatorWidgetNode = new navigator.navigator(navigatorTree, { + wiki: this.wiki, + document : this.srcDocument, + parentWidget: $tw.rootWidget + }); + navigatorWidgetNode.render(modalBody,null); + // Render the title of the message var headerWidgetNode = this.wiki.makeTranscludeWidget(title,{ field: "subtitle", @@ -86,7 +117,7 @@ Modal.prototype.display = function(title,options) { type: "string", value: title }}}], - parentWidget: $tw.rootWidget, + parentWidget: navigatorWidgetNode, document: this.srcDocument, variables: variables, importPageMacros: true @@ -94,11 +125,12 @@ Modal.prototype.display = function(title,options) { headerWidgetNode.render(headerTitle,null); // Render the body of the message var bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{ - parentWidget: $tw.rootWidget, + parentWidget: navigatorWidgetNode, document: this.srcDocument, variables: variables, importPageMacros: true }); + bodyWidgetNode.render(modalBody,null); // Setup the link if present if(options.downloadLink) { @@ -135,7 +167,7 @@ Modal.prototype.display = function(title,options) { value: $tw.language.getString("Buttons/Close/Caption") }}} ]}], - parentWidget: $tw.rootWidget, + parentWidget: navigatorWidgetNode, document: this.srcDocument, variables: variables, importPageMacros: true From ffd6a8cce767a6de6038168a86ceeccc4d9381aa Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 16 Nov 2020 23:32:28 +0700 Subject: [PATCH 0964/2376] More documentation for :intersection filter prefix (#5051) --- .../tiddlers/filters/syntax/Filter Expression.tid | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index 1289e22ad..57de4a9f9 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -56,3 +56,15 @@ In order to remove `$:/baz` in any case, existing or not, simply use the `+` pre * <$link to="is Operator">`foo bar $:/baz +[!is[system]]`</$link> * <$link to="prefix Operator">`foo bar $:/baz +[!prefix[$:/]]`</$link> + +There is also a difference between the `:intersection` and `+` prefixes due to varying inputs. + +The `+` prefix should be thought of as an "AND" in formal logic, e.g. "give me all titles that satisfy condition A ''and'' condition B". But it's not suitable for all cases; if condition B uses a filter operator that replaces its input, then it will be difficult to use the `+` prefix. For example, if you wanted to find out what tags two tiddlers have in common, you might try to write a filter expression like: + +* <$link to="tags Operator">`[[field Operator]tags[]] +[[compare Operator]tags[]]`</$link> + +But that won't work, because the second filter run will end up throwing away its input and replacing it with an input consisting of the single title `[[compare Operator]]`. So the result you'd get from that filter expression would be just the tags of the `compare Operator` tiddler. + +For cases like this, the `:intersection` prefix is what you need. It takes the filter output so far, //sets it aside// in temporary storage, and starts the next filter run with all tiddler titles as input. Then once the latest filter run has completed, it takes the latest output, compares it to the set-aside output, and produces a new output that contains only titles that appeared in both the set-aside output and the latest output. So to get only the tags that the `field Operator` and `compare Operator` tiddlers have in common, you would write a filter expresison like this: + +* <$link to="tags Operator">`[[field Operator]tags[]] :intersection[[compare Operator]tags[]]`</$link> From d8d88c67e3a3a5fe9146b36a153a474a11c5068d Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Mon, 16 Nov 2020 23:50:32 +0700 Subject: [PATCH 0965/2376] Fix minor mistake in ButtonWidget docs (#5050) The ButtonWidget documentation refers to a "state" attribute, but this should probably be "set". The name "state" appears to be an artifact from when the setTitle, setField, and setIndex attributes were added to the widget; at one time they were called stateTitle and so on, and then they were renamed to setTitle instead, but not every instance of "state" was found and renamed to "set". This is one such instance, now fixed. --- editions/tw5.com/tiddlers/widgets/ButtonWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid index 21a0a48a1..1f0a0d2b5 100644 --- a/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ButtonWidget.tid @@ -29,7 +29,7 @@ The content of the `<$button>` widget is displayed within the button. |message |The name of the [[widget message|Messages]] to send when the button is clicked | |param |The optional parameter to the message | |set |A TextReference to which a new value will be assigned | -|setTitle |A title to which a new value will be assigned, ''without'' TextReference. Gets preferred over <<.attr state>> | +|setTitle |A title to which a new value will be assigned, ''without'' TextReference. Gets preferred over <<.attr set>> | |setField |A ''field name'' to which the new value will be assigned, if the attribute <<.attr setTitle>> is present. Defaults to the ''text'' field | |setIndex |An ''index'' to which the new value will be assigned, if the attribute <<.attr setTitle>> is present | |setTo |The new value to assign to the TextReference identified in the `set` attribute or the text field / the field specified through <<.attr setField>> / the index specified through <<.attr setIndex>> of the title given through <<.attr setTitle>> | From 43061e64a69a0c1b2c1c7f50521b7f46a406b5ab Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 16 Nov 2020 17:54:29 +0100 Subject: [PATCH 0966/2376] Fix #5039 - Tag input, Type input and Fields inputs don't delete their state tiddlers on tiddler-cancel/delete (#5049) * Update EditTemplate.tid * Update EditTemplate.tid * Update EditTemplate.tid * Update tag-picker.tid * Update tag-picker.tid * Update type.tid * Update fields.tid * Update cancel.tid * Update delete.tid * Update type.tid * Update ViewTemplate.tid --- core/ui/EditTemplate.tid | 13 ++++++++----- core/ui/EditTemplate/fields.tid | 4 ++-- core/ui/EditTemplate/type.tid | 12 ++++++------ core/ui/EditToolbar/cancel.tid | 4 ++-- core/ui/EditToolbar/delete.tid | 4 ++-- core/ui/ViewTemplate.tid | 1 + core/wiki/macros/tag-picker.tid | 8 ++++++-- 7 files changed, 27 insertions(+), 19 deletions(-) diff --git a/core/ui/EditTemplate.tid b/core/ui/EditTemplate.tid index 1d342ef7b..bf99cd70c 100644 --- a/core/ui/EditTemplate.tid +++ b/core/ui/EditTemplate.tid @@ -1,17 +1,20 @@ title: $:/core/ui/EditTemplate +\define delete-edittemplate-state-tiddlers() <$action-deletetiddler $filter="[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]"/> \define save-tiddler-actions() <$action-sendmessage $message="tm-add-tag" $param={{{ [<newTagNameTiddler>get[text]] }}}/> -<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/> <$action-sendmessage $message="tm-add-field" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/> -<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/> -<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/> +<<delete-edittemplate-state-tiddlers>> <$action-sendmessage $message="tm-save-tiddler"/> \end +\define cancel-delete-tiddler-actions(message) +<<delete-edittemplate-state-tiddlers>> +<$action-sendmessage $message="tm-$message$-tiddler"/> +\end <div data-tiddler-title=<<currentTiddler>> 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[ ]] }}}> <$fieldmangler> -<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify "$:/temp/NewTagName">> newFieldNameTiddler=<<qualify "$:/temp/NewFieldName">> newFieldValueTiddler=<<qualify "$:/temp/NewFieldValue">>> -<$keyboard key="((cancel-edit-tiddler))" message="tm-cancel-tiddler"> +<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify "$:/temp/NewTagName">> newFieldNameTiddler=<<qualify "$:/temp/NewFieldName">> newFieldValueTiddler=<<qualify "$:/temp/NewFieldValue">> newFieldNameInputTiddler=<<qualify "$:/temp/NewFieldName/input">> newFieldNameSelectionTiddler=<<qualify "$:/temp/NewFieldName/selected-item">> newTagNameInputTiddler=<<qualify "$:/temp/NewTagName/input">> newTagNameSelectionTiddler=<<qualify "$:/temp/NewTagName/selected-item">> typeInputTiddler=<<qualify "$:/temp/Type/input">> typeSelectionTiddler=<<qualify "$:/temp/Type/selected-item">>> +<$keyboard key="((cancel-edit-tiddler))" actions=<<cancel-delete-tiddler-actions "cancel">>> <$keyboard key="((save-tiddler))" actions=<<save-tiddler-actions>>> <$list filter="[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]" variable="listItem"> <$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"> diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 7c041d122..84f0baa68 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -23,7 +23,7 @@ $:/config/EditTemplateFields/Visibility/$(currentField)$ \define delete-state-tiddlers() <$action-deletetiddler $filter="[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]"/> \define cancel-search-actions-inner() -<$list filter="[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]" variable="ignore" emptyMessage="""<<delete-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> +<$list filter="[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]" variable="ignore" emptyMessage="""<<cancel-delete-tiddler-actions "cancel">>"""> <<delete-state-tiddlers>> </$list> \end @@ -87,7 +87,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <em class="tc-edit tc-big-gap-right"> <<lingo Fields/Add/Prompt>> </em> -<$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<qualify "$:/temp/fieldname/input">> searchListState=<<qualify "$:/temp/fieldname/selected-item">>> +<$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>> <div class="tc-edit-field-add-name-wrapper"> <$macrocall $name="keyboard-driven-input" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<searchListState>> tag="input" default="" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 786a2ecd2..4b458aa5b 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -3,14 +3,14 @@ tags: $:/tags/EditTemplate first-search-filter: [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>] \define lingo-base() $:/language/EditTemplate/ -\define input-cancel-actions() <$list filter="[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]" emptyMessage="""<$action-sendmessage $message="tm-cancel-tiddler"/>"""><$action-sendmessage $message="tm-remove-field" $param="type"/><$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$list> +\define input-cancel-actions() <$list filter="[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]" emptyMessage="""<<cancel-delete-tiddler-actions "cancel">>"""><$action-sendmessage $message="tm-remove-field" $param="type"/><$action-deletetiddler $filter="[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]"/></$list> \whitespace trim -<$vars storeTitle=<<qualify "$:/temp/type-search/input">> refreshTitle=<<qualify "$:/temp/type-search/refresh">> selectionStateTitle=<<qualify "$:/temp/type-search/selected-item">>> +<$set name="refreshTitle" value=<<qualify "$:/temp/type-search/refresh">>> <div class="tc-edit-type-selector-wrapper"> <em class="tc-edit tc-big-gap-right"><<lingo Type/Prompt>></em> <div class="tc-type-selector-dropdown-wrapper"> <div class="tc-type-selector"><$fieldmangler> -<$macrocall $name="keyboard-driven-input" tiddler=<<currentTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<selectionStateTitle>> field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes" configTiddlerFilter="[[$:/core/ui/EditTemplate/type]]" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$button> +<$macrocall $name="keyboard-driven-input" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes" configTiddlerFilter="[[$:/core/ui/EditTemplate/type]]" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$button> </$fieldmangler></div> <div class="tc-block-dropdown-wrapper"> @@ -22,8 +22,8 @@ first-search-filter: [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[d <div class="tc-dropdown-item"> <$text text={{!!group}}/> </div> -<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}> -<$list filter="[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<selectionStateTitle>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field="description"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field="name"/>)</$link></span> +<$set name="userInput" value={{{ [<typeInputTiddler>get[text]] }}}> +<$list filter="[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<typeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field="description"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field="name"/>)</$link></span> </$list> </$set> </$list> @@ -34,4 +34,4 @@ first-search-filter: [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[d </div> </div> </div> -</$vars> +</$set> diff --git a/core/ui/EditToolbar/cancel.tid b/core/ui/EditToolbar/cancel.tid index 6b5aa56a1..341ae9d0b 100644 --- a/core/ui/EditToolbar/cancel.tid +++ b/core/ui/EditToolbar/cancel.tid @@ -3,11 +3,11 @@ tags: $:/tags/EditToolbar caption: {{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}} description: {{$:/language/Buttons/Cancel/Hint}} -<$button message="tm-cancel-tiddler" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>> +<$button actions=<<cancel-delete-tiddler-actions "cancel">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/cancel-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span> </$list> -</$button> \ No newline at end of file +</$button> diff --git a/core/ui/EditToolbar/delete.tid b/core/ui/EditToolbar/delete.tid index c6ce6b823..67e68c68b 100644 --- a/core/ui/EditToolbar/delete.tid +++ b/core/ui/EditToolbar/delete.tid @@ -3,11 +3,11 @@ tags: $:/tags/EditToolbar $:/tags/ViewToolbar caption: {{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}} description: {{$:/language/Buttons/Delete/Hint}} -<$button message="tm-delete-tiddler" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>> +<$button actions=<<cancel-delete-tiddler-actions "delete">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/delete-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Delete/Caption}}/></span> </$list> -</$button> \ No newline at end of file +</$button> diff --git a/core/ui/ViewTemplate.tid b/core/ui/ViewTemplate.tid index 71303d3dd..e3ba249ee 100644 --- a/core/ui/ViewTemplate.tid +++ b/core/ui/ViewTemplate.tid @@ -3,6 +3,7 @@ title: $:/core/ui/ViewTemplate \define folded-state() $:/state/folded/$(currentTiddler)$ \end +\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message="tm-$message$-tiddler"/> \import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]] <$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[ ]] }}}><$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem"><$transclude tiddler=<<listItem>>/></$list> </div> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 30e0fc8ab..31d6c786d 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -34,7 +34,7 @@ $actions$ \end \define clear-tags-actions-inner() -<$list filter="[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]" variable="ignore" emptyMessage="""<<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-cancel-tiddler"/>"""> +<$list filter="[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]" variable="ignore" emptyMessage="""<<cancel-delete-tiddler-actions "cancel">>"""> <<delete-tag-state-tiddlers>> </$list> \end @@ -49,7 +49,9 @@ $actions$ \define tag-picker-inner(actions,tagField:"tags") \whitespace trim -<$vars tagSelectionState=<<qualify "$:/state/selected-tag">> storeTitle=<<qualify "$:/temp/NewTagName/input">> refreshTitle=<<qualify "$:/temp/NewTagName/refresh">> nonSystemTagsFilter="[tags[]!is[system]search:title<userInput>sort[]]" systemTagsFilter="[tags[]is[system]search:title<userInput>sort[]]"> +<$vars newTagNameInputTiddlerQualified=<<qualify "$:/temp/NewTagName/input">> newTagNameSelectionTiddlerQualified=<<qualify "$:/temp/NewTagName/selected-item">>> +<$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}> +<$vars refreshTitle=<<qualify "$:/temp/NewTagName/refresh">> nonSystemTagsFilter="[tags[]!is[system]search:title<userInput>sort[]]" systemTagsFilter="[tags[]is[system]search:title<userInput>sort[]]"> <div class="tc-edit-add-tag"> <div> <span class="tc-add-tag-name tc-small-gap-right"> @@ -95,6 +97,8 @@ $actions$ </div> </div> </$vars> +</$vars> +</$vars> \end \define tag-picker(actions,tagField:"tags") \whitespace trim From fc1721709ac5f473ee84fb0c1c0d16809155161d Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 16 Nov 2020 18:02:04 +0100 Subject: [PATCH 0967/2376] Cycle operator and refactored toggle operator (#5021) * Refactored toggle operator and added cycle operator * Better handling for operand case * Syntax/whitespace corrections --- core/modules/filters/x-listops.js | 59 ++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index 73f19ccf5..5b3a9aba1 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -188,27 +188,44 @@ Extended filter operators to manipulate the current list. return set; }; - /* - Toggles an item in the current list. - */ - exports.toggle = function(source, operator) { - var results = prepare_results(source), - index = results.indexOf(operator.operand), - pairIndex = (operator.operands[1] ? results.indexOf(operator.operands[1]) : -1); - if(index === -1) { - if(pairIndex !== -1) { - results.splice(pairIndex,1,operator.operand); - } else { - results.push(operator.operand); - } - } else { - if(operator.operands[1]) { - results.splice(index,1,operator.operands[1]); - } else { - results.splice(index,1); + var cycleValueInArray = function(results,operands) { + var resultsIndex, + i = 0, + nextOperandIndex; + for(i; i < operands.length; i++) { + resultsIndex = results.indexOf(operands[i]); + if(resultsIndex !== -1) { + break; } } - return results; - }; + if(resultsIndex !== -1) { + i++; + nextOperandIndex = (i === operands.length ? 0 : i); + if(operands.length > 1) { + results.splice(resultsIndex,1,operands[nextOperandIndex]); + } else { + results.splice(resultsIndex,1,); + } + } else { + results.push(operands[0]); + } + return results; + } -})(); + /* + Toggles an item in the current list. + */ + exports.toggle = function(source,operator) { + return cycleValueInArray(prepare_results(source),operator.operands); + } + + exports.cycle = function(source,operator) { + var results = prepare_results(source), + operands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, "true") : [""]); + if(operator.suffix === "reverse") { + operands.reverse(); + } + return cycleValueInArray(results,operands); + } + +})(); \ No newline at end of file From d6e055368d98f460b8f46d61e714b1e3977466b0 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 16 Nov 2020 18:02:22 +0100 Subject: [PATCH 0968/2376] Added docs for action-confirm widget, added default message for widget and improved logic for disabling it. (#5047) --- core/language/en-GB/Misc.multids | 1 + core/modules/widgets/confirm.js | 6 +-- .../tiddlers/widgets/ActionConfirmWidget.tid | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 editions/tw5.com/tiddlers/widgets/ActionConfirmWidget.tid diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 61570f2af..a6655709d 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -10,6 +10,7 @@ ConfirmCancelTiddler: Do you wish to discard changes to the tiddler "<$text text ConfirmDeleteTiddler: Do you wish to delete 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>>/>"? +ConfirmAction: Do you wish to proceed? Count: count DefaultNewTiddlerTitle: New Tiddler Diffs/CountMessage: <<diff-count>> differences diff --git a/core/modules/widgets/confirm.js b/core/modules/widgets/confirm.js index ffc506ec6..eb762f050 100644 --- a/core/modules/widgets/confirm.js +++ b/core/modules/widgets/confirm.js @@ -36,8 +36,8 @@ ConfirmWidget.prototype.render = function(parent,nextSibling) { Compute the internal state of the widget */ ConfirmWidget.prototype.execute = function() { - this.message = this.getAttribute("$message"); - this.prompt = (this.getAttribute("$prompt","yes") == "yes" ? true : false); + this.message = this.getAttribute("$message",$tw.language.getString("ConfirmAction")); + this.prompt = (this.getAttribute("$prompt","yes") == "no" ? false : true); this.makeChildWidgets(); }; @@ -59,7 +59,7 @@ Invoke the action associated with this widget ConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) { var invokeActions = true, handled = true; - if(this.message && this.prompt) { + if(this.prompt) { invokeActions = confirm(this.message); } if(invokeActions) { diff --git a/editions/tw5.com/tiddlers/widgets/ActionConfirmWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionConfirmWidget.tid new file mode 100644 index 000000000..5de11c755 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/ActionConfirmWidget.tid @@ -0,0 +1,40 @@ +caption: action-confirm +created: 20201115150255011 +modified: 20201115160335288 +tags: Widgets ActionWidgets +title: ActionConfirmWidget +type: text/vnd.tiddlywiki + +! Introduction + +<<.from-version "5.1.23">>The ''action-confirm'' widget is an [[action widget|ActionWidgets]] that prompts the user for confirmation and invokes other action widgets contained within it only if the user confirms. ActionWidgets are used within triggering widgets such as the ButtonWidget. + +! Content and Attributes + +The ''action-confirm'' widget is invisible. Any content within it is only processed if the user confirms the action, or the confirmation has been disabled by the `$prompt` attribute. + +|!Attribute |!Description | +|$message |Optional message displayed to the user when asking for confirmation.| +|$prompt |Optional flag, set to "no" to disable the prompt for confirmation. Defaults to "yes" | + +! Examples + +Here is an example of a button that asks the user for confirmation, before deleting the caption and tags fields of the current tiddler: + +<$macrocall $name='wikitext-example-without-html' +src='<$button> +<$action-confirm $message="Do you wish to delete the caption and tags?"> +<$action-deletefield caption tags/> +Delete "caption" and "tags" +</$action-confirm> +</$button>'/> + +Here is an example of a button that uses the optional `$prompt` attribute to control whether to prompt the user before deleting the text field of the tiddler HelloThere: + +<$macrocall $name='wikitext-example-without-html' +src='<$button> +<$action-confirm $message="Do you wish to delete the text field?" $prompt={{$:/state/promptUser}}> +<$action-deletefield $tiddler="HelloThere" $field="text"/> +</$action-confirm> +Delete text from ~HelloThere +</$button>'/> From 2b60ab1fdc930cb7165f5e8996888e80da86dfbe Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 17 Nov 2020 15:43:46 +0100 Subject: [PATCH 0969/2376] Doc updates for Modals (#5057) --- editions/tw5.com/tiddlers/features/Modals.tid | 6 ++++-- .../tiddlers/messages/WidgetMessage_ tm-modal.tid | 13 ++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/editions/tw5.com/tiddlers/features/Modals.tid b/editions/tw5.com/tiddlers/features/Modals.tid index aa87ab68c..06b43a880 100644 --- a/editions/tw5.com/tiddlers/features/Modals.tid +++ b/editions/tw5.com/tiddlers/features/Modals.tid @@ -1,5 +1,5 @@ created: 20160107225427489 -modified: 20200312172056083 +modified: 20201117081054556 tags: Features title: Modals type: text/vnd.tiddlywiki @@ -10,9 +10,11 @@ The tiddler to be displayed can contain the following optional fields that are u |!Field |!Description | |footer|The footer text for the modal| -|subtitle|The subtitle text for a modal| +|subtitle|The subtitle text for a modal, displayed in a `h3` html tag| |class|An additional class to apply to the modal wrapper| +Note that the footer and subtitle fields are not limited to plain text, and wiki text features such as widgets and transclusions can be used as well. + Modals are displayed with the [[WidgetMessage: tm-modal]]. <$button message="tm-modal" param="SampleWizard">Open demo modal</$button> diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-modal.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-modal.tid index a1b90b688..b6db37eef 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-modal.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-modal.tid @@ -1,22 +1,25 @@ +caption: tm-modal created: 20140811112133701 -modified: 20141107142803042 +modified: 20201117081247738 tags: Messages title: WidgetMessage: tm-modal type: text/vnd.tiddlywiki -caption: tm-modal |!Name |!Description | |param |Title of the tiddler to be displayed | -|paramObject |Hashmap of variables to be provided to the modal | +|paramObject |Hashmap of variables to be provided to the modal, contains all extra parameters passed to the widget sending the message. | |rootwindow |<<.from-version 5.1.18>> ''yes'' or ''true'' will always display a modal in the wiki-root-window | The "currentTiddler" variable is set to the title of the modal tiddler, but can be overridden by specifying a different value in `paramObject`. The modal message is usually generated with the ButtonWidget. The modal message is handled by the TiddlyWiki core. +[[Fields within the tiddler|Modals]] being displayed in the modal can be used to customize its appearance. + ! Example Here is an example of displaying a modal and passing parameters to it: +(Note how all parameters to `action-sendmessage` other than `$param` and `$message` are available as variables within the modal.) <$macrocall $name='wikitext-example-without-html' src='Your name: <$edit-text tiddler="$:/temp/yourName" tag="input" default="Your name"/> @@ -29,5 +32,9 @@ Your message: Click me! </$button>'/> + <<.tip """<$macrocall $name=".from-version" version="5.1.18"/> if triggered from within a ''new window'', the above examples will be displayed within that window. The <$macrocall $name=".attr" _="rootwindow"/> attribute can be set to ''yes'' or ''true'' to inherit this behavior and to display the Modal within the ''root'' window""">> +<<.tip """<$macrocall $name=".from-version" version="5.1.23"/> Links to tiddlers within a modal will open in the same story as the widget that sent the `tm-modal` message. You can override this by specifying values for the variables `tv-story-list` and `tv-history-list` when sending the `tm-modal` message. + +""">> \ No newline at end of file From 3b75297168d411bb9e0ed117ece5cab16eba6a9f Mon Sep 17 00:00:00 2001 From: Mohammad Rahmani <830394+kookma@users.noreply.github.com> Date: Tue, 17 Nov 2020 18:15:32 +0330 Subject: [PATCH 0970/2376] Correct for new GitHub default branch (#5055) * Correct for new GitHub default branch This PR corrects the default branch of GitHub from master to main. This is ne GitHub repository configuration from Oct 1st, 2020 * Update Saving to a Git service.tid GitLab still uses `master` as default branch. * Add Kookma plugins as resources Some of Kookma resources including TW-Scripts, Commander, Trashbin, Todolist has been added. * Revert "Add Kookma plugins as resources" This reverts commit 199fce3a08f8e21c776c7e37734b0d36753bb3e8. --- editions/tw5.com/tiddlers/saving/Saving to a Git service.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid index b6bb269db..ab4186f6c 100644 --- a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid +++ b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid @@ -17,7 +17,7 @@ Saving to a Git service is configured in the [[$:/ControlPanel]] in the ''Git Se * ''Username'' - (mandatory) the username for the Git service account used for saving changes * ''Password'' - (mandatory) the password, OAUTH token or personal access token for the specified account. Note that GitHub permits [[several different mechanisms|https://developer.github.com/v3/#authentication]] for authentication * ''Repository'' - (mandatory) the name of the Git repository. Both the owner name and the repository name must be specified. For example `Jermolene/TiddlyWiki5` -* ''Branch'' - (optional) the name of the branch to be used within the Git repository. Defaults to `master` +* ''Branch'' - (optional) the name of the branch to be used within the Git repository. Defaults to `main` (~GitHub) or `master` (~GitLab)" * ''Path'' - (optional) the path to the target file. Defaults to `/` * ''Filename'' - (mandatory) the filename of the target file From 8cd13e2f89ab85b47794a4f6198fbb1418775704 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 17 Nov 2020 14:47:15 +0000 Subject: [PATCH 0971/2376] Change default branch for GitHub saver to "main" To match GitHub's new default See also #5055 for the accompanying docs change --- core/modules/savers/github.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index 7585db34e..2d59f45ff 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -26,7 +26,7 @@ GitHubSaver.prototype.save = function(text,method,callback) { repo = this.wiki.getTiddlerText("$:/GitHub/Repo"), path = this.wiki.getTiddlerText("$:/GitHub/Path",""), filename = this.wiki.getTiddlerText("$:/GitHub/Filename"), - branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "master", + branch = this.wiki.getTiddlerText("$:/GitHub/Branch") || "main", endpoint = this.wiki.getTiddlerText("$:/GitHub/ServerURL") || "https://api.github.com", headers = { "Accept": "application/vnd.github.v3+json", From 684f13fbcbb73ce3c56b0ad83a91330f4677a213 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Tue, 17 Nov 2020 22:47:31 +0800 Subject: [PATCH 0972/2376] Add chinese translations for `ConfirmAction` (#5056) --- languages/zh-Hans/Misc.multids | 1 + languages/zh-Hant/Misc.multids | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 9349c1157..8d94c60e9 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -10,6 +10,7 @@ ConfirmCancelTiddler: 您确定要放弃对条目 "<$text text=<<title>>/>" 的 ConfirmDeleteTiddler: 您确定要删除条目 "<$text text=<<title>>/>"? ConfirmOverwriteTiddler: 您确定要复写条目 "<$text text=<<title>>/>"? ConfirmEditShadowTiddler: 您即将要编辑默认条目,任何更改将会复盖默认的系统,使未来的升级不寻常。您确定要编辑 "<$text text=<<title>>/>"? +ConfirmAction: 是否要继续? Count: 计数 DefaultNewTiddlerTitle: 新条目 Diffs/CountMessage: <<diff-count>> 个差异 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index e4c739830..008ded4fc 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -10,6 +10,7 @@ ConfirmCancelTiddler: 您確定要放棄對條目 "<$text text=<<title>>/>" 的 ConfirmDeleteTiddler: 您確定要刪除條目 "<$text text=<<title>>/>"? ConfirmOverwriteTiddler: 您確定要覆寫條目 "<$text text=<<title>>/>"? ConfirmEditShadowTiddler: 您即將要編輯預設條目,任何更改將會覆蓋預設的系統,使未來的升級不尋常。您確定要編輯 "<$text text=<<title>>/>"? +ConfirmAction: 是否要繼續? Count: 計數 DefaultNewTiddlerTitle: 新條目 Diffs/CountMessage: <<diff-count>> 個差異 From eae3da0e9de40e00eefa3589a6a4a9534d314c2c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 17 Nov 2020 20:05:32 +0100 Subject: [PATCH 0973/2376] Make sidebarsegments/search-results-count work with all search tabs (#5062) --- core/ui/SideBarSegments/search.tid | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index ac96fa63b..4e7e6eb72 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -8,11 +8,13 @@ tags: $:/tags/SideBarSegment <$button popup=<<qualify "$:/state/popup/search-dropdown">> class="tc-btn-invisible"> {{$:/core/images/down-arrow}} <$list filter="[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]" variable="listItem"> -<$set name="searchTerm" value={{{ [<searchTiddler>get[text]] }}}> -<$set name="resultCount" value="""<$count filter="[!is[system]search<searchTerm>]"/>"""> +<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}> +<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]] }}}> +<$set name="resultCount" value="""<$count filter="[subfilter<primaryListFilter>] =[subfilter<secondaryListFilter>]"/>"""> {{$:/language/Search/Matches}} </$set> -</$set> +</$vars> +</$vars> </$list> </$button> \end From 6d5ea90bfd33a87d520f3b7a17acad019abb235d Mon Sep 17 00:00:00 2001 From: Mohammad Rahmani <830394+kookma@users.noreply.github.com> Date: Tue, 17 Nov 2020 22:37:32 +0330 Subject: [PATCH 0974/2376] Add resources by Mohammad (#5061) * Correct for new GitHub default branch This PR corrects the default branch of GitHub from master to main. This is ne GitHub repository configuration from Oct 1st, 2020 * Update Saving to a Git service.tid GitLab still uses `master` as default branch. * Add Kookma plugins as resources Some of Kookma resources including TW-Scripts, Commander, Trashbin, Todolist has been added. * Revert "Add Kookma plugins as resources" This reverts commit 199fce3a08f8e21c776c7e37734b0d36753bb3e8. * Adding Resources by Mohammad This PR adds resources created by Mohammad mostly in GitHub --- .../resources/Favorites by Mohammad.tid | 20 +++++++++++ .../GitHub Saver Tutorial by Mohammad.tid | 25 ++++++++++++++ .../Kookma Plugin Library by Mohammad.tid | 17 ++++++++++ .../resources/Refnotes by Mohammad.tid | 24 +++++++++++++ .../RegExp in Tiddlywiki by Mohammad.tid | 21 ++++++++++++ .../resources/Searchwikis by Mohammad.tid | 23 +++++++++++++ .../resources/Semantic Colors by Mohammad.tid | 24 +++++++++++++ .../resources/Shiraz by Mohammad.tid | 34 +++++++++++++++++++ .../resources/Slider by Mohammad.tid | 20 +++++++++++ .../resources/TW-Scripts by Mohammad.tid | 24 +++++++++++++ .../Tiddler Commander by Mohammad.tid | 27 +++++++++++++++ .../resources/Tiddlyshow by Mohammad.tid | 18 ++++++++++ .../resources/Timelines by Mohammad.tid | 16 +++++++++ .../resources/Todolist by Mohammad.tid | 16 +++++++++ .../resources/Trashbin by Mohammad.tid | 16 +++++++++ .../resources/Utility by Mohammad.tid | 15 ++++++++ 16 files changed, 340 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid create mode 100644 editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid diff --git a/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid new file mode 100644 index 000000000..4715cbc3f --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid @@ -0,0 +1,20 @@ +created: 20201117155737569 +creator: Mohammad +modified: 20201117155943559 +modifier: Mohammad +tags: Resources Plugings +title: Favorites by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Favorites/ + +Favorites plugin is a set of tool for creating favorites (bookmarks) in Tiddlywiki. Each favorite item is a shortcut to a tiddler. + +{{!!url}} + +A favorite item also called a bookmark is a shortcut, you are creating for quick access to it. You can access that bookmark at any time and view that as many times as you want without having to search and find it again. + +The Favorites plugin contains three modes + +* flat mode: one favorite list, no folder +* structured mode: use folder, search tool, export and delete tool +* frozen list: read only, simple table of content style diff --git a/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid new file mode 100644 index 000000000..0db8ff926 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid @@ -0,0 +1,25 @@ +created: 20201117163027900 +creator: Mohammad +modified: 20201117163855463 +modifier: Mohammad +tags: Resources +title: GitHub Saver Tutorial by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW5-GitHub-Saver/ + +GitHub Saver is a step by step tutorial shows how to integrate Tiddlywiki 5 and GitHub Pages to create websites hosted on https://github.com/. + +{{!!url}} + +This instruction is based on Tiddlywiki single html file model, while it can use subfolder for extra materials like images, audios, videos, pdfs,... in separate folders. + +!! Other tutorials + +;Tiddlywiki, Travis-CI and GitHub Pages +:https://kookma.github.io/Tiddlywiki-Travis-CI/ +:This wiki shows how to set up websites hosted on [[GitHub Pages|https://pages.github.com/]] using [[Travis-CI|https://travis-ci.org]] and [[Tiddlywiki 5|https://tiddlywiki.com]] on Node.js. + + +;Tiddlywiki and GitHub Pages +:https://kookma.github.io/Tiddlywiki-and-GitHub-Pages/ +:This instruction is based on local edit, save and push to GitHub. It does NOT use the new GitHub Saver mechanism (requires TW 5.1.20+) which lets edit and save directly from Tiddlywiki! \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid new file mode 100644 index 000000000..27ae0a35e --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid @@ -0,0 +1,17 @@ +created: 20201117160603290 +creator: Mohammad +modified: 20201117160819308 +modifier: Mohammad +tags: Resources Plugings +title: Kookma Plugin Library by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-PluginLibrary/ + +This library contains most useful plugins developed under the name [[Kookma|https://github.com/kookma]] for Tiddlywiki 5. + +{{!!url}} + + +It has two parts + +The plugin library introduces a very simple mechanism like Tiddlywiki Official Plugin Library to let select among the published plugins and install any number of them you like. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid new file mode 100644 index 000000000..2dfb6e964 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid @@ -0,0 +1,24 @@ +created: 20201117161853918 +creator: Mohammad +modified: 20201117162122822 +modifier: Mohammad +tags: Resources Plugings +title: Refnotes by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/Refnotes/ + +Refnotes plugin is a set of macros and stylesheets for creating abbreviations, footnotes and citations. It also makes tables of footnotes, abbreviations (glossaery) and references (bibliography table). + +{{!!url}} + +Refnotes contains codes and elements to + +;Create and insert +:Abbreviation +:Footnote +:Reference + +;Create tables of +:Abbreviations or glossary +:Footnotes and endnote +:References (bibliography) using different output style \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid new file mode 100644 index 000000000..4bd091698 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid @@ -0,0 +1,21 @@ +created: 20201117164024930 +creator: Mohammad +modified: 20201117164308641 +modifier: Mohammad +tags: Resources +title: RegExp in Tiddlywiki by Mohammad +type: text/vnd.tiddlywiki +url: http://tw-regexp.tiddlyspot.com/ + +~RegExp in Tiddlywiki contains practical use cases of reular expression in Tiddlywiki. + +{{!!url}} + +The regular expression is a way to describe complex search patterns using sequences of characters . + +~RegExp in Tiddlywiki has four main parts + +* Using regular expression to match a pattern in tiddler title +* Using regular expression to match a pattern in tiddler fields excluding tiddler text (body) +* Using regular expression to match a pattern in tiddler body (text field) +* Using regular expression for validation like username, password, etc. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid new file mode 100644 index 000000000..77ced56fb --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid @@ -0,0 +1,23 @@ +created: 20201117160302426 +creator: Mohammad +modified: 20201117160443306 +modifier: Mohammad +tags: Resources Plugings +title: Searchwikis by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Searchwikis/ + +Searchwikis plugin uses index (dataTiddler) to search multiple external Tiddlywikis. + +{{!!url}} + + +It has two parts + +# An indexer, to build an index of all tiddlers in an external wiki +# A search tool to search indexes and display a link to a tiddler found in an external wiki + +Then one master wiki can hosts many index tiddlers and lets to search several external wikis through index tiddlers. + +Searchwikis enable to have a central wiki and search all other wikis from one place. + diff --git a/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid new file mode 100644 index 000000000..34963f263 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid @@ -0,0 +1,24 @@ +created: 20201117162254751 +creator: Mohammad +modified: 20201117162601326 +modifier: Mohammad +tags: Resources +title: Semantic Colors by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Semantic-Colors/ + +Semantic colors are set of CSS to apply colorful theme to individual tiddlers for categorization purpose. + +{{!!url}} + +Tiddlywiki "semantic colors" has two objectives: + +# How it is simply possible to apply theme to an individual tiddler +# Use semantic colors for categorization + +;Some use cases +:Learning materials (each topic, category can have dedicated semantic color, like learning a foreign language) +:Slideshow (section divider, each part can have a semantic color) +:Books and tutorials ( different semantic colors can be applied to chapters, specific subjects, like example tiddlers) +:Visual tags (instead of looking for tag bar and see to what category this subject (tiddler) belongs, you can identify it by its semantic color) + diff --git a/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid new file mode 100644 index 000000000..3c31679f5 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid @@ -0,0 +1,34 @@ +created: 20201116204317018 +creator: Mohammad +modified: 20201116210618803 +modifier: Mohammad +tags: Resources Plugings +title: Shiraz by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Shiraz/ + +Shiraz plugin is a very small in size and framework to create stylish contents in Tiddlywiki. + +{{!!url}} + +Shiraz plugin contains extended markups, macros, styles, and many customization to empty Tiddlywiki and can be used as a ''starter kit''. + +Some of Shiraz features are: + +* Customized elements like, alerts, cards, panels, badges +* Dynamic tables +* Sortable tables +* Display on demand, slider, and details +* Images, basic image macros, slidein, and overlay images, polaroid and pretty images +* Table customization tools +* Sticky footer +* Multi columns tiddler +* Multi column story river +* List search +* Badge status +* Notebook style +* Test utilities +* Stylish buttons + + +Adding Shiraz plugin to any Tiddlywiki, convert it to a full production tool. Shiraz uses modified CSS classes from [[Bootstrap|https://getbootstrap.com/]]. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid new file mode 100644 index 000000000..b8b14cddb --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid @@ -0,0 +1,20 @@ +created: 20201117162655614 +creator: Mohammad +modified: 20201117162926714 +modifier: Mohammad +tags: Resources Plugings +title: Slider by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/slider/ + +Slider is a plugin to create an ordered set of tiddlers also called Trail. + +{{!!url}} + +A trail can be used to create a sequence of selected contents like step by step tutorial, guided help, lessons and similar. + +The slider plugin user interface contains three sections + +* A sidebar tab called Trails to manage trails +* A dashboard for each trail (where trail structure is managed) +* Tiddlers in a trail, also called slides diff --git a/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid new file mode 100644 index 000000000..f319938f7 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid @@ -0,0 +1,24 @@ +created: 20180830194141190 +creator: Mohammad +modified: 20201116203625120 +modifier: Mohammad +tags: Resources +title: TW-Scripts by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Scripts/ + +TW-Scripts is one of the most comprehensive collections of solutions for Tiddlywiki 5. + +{{!!url}} + +TW-Scripts includes: + +* Collected solutions to questions in [[Tiddlywiki Google groups|https://groups.google.com/group/TiddlyWiki]] +* Learn through examples +* Templates, stylesheets +* Wikitext, macros, and snippets +* Tips and tricks +* Search tools  + + + diff --git a/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid new file mode 100644 index 000000000..959290950 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid @@ -0,0 +1,27 @@ +created: 20201116203717105 +creator: Mohammad +modified: 20201116204652385 +modifier: Mohammad +tags: Resources Plugings +title: Tiddler Commander by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Commander/ + +Tiddler Commander plugin, in short ''Commander'' is a unique tool for batch operations on tiddlers. + +{{!!url}} + +Commander has many features including: + +* Bulk tiddler creation/deletion +* Selective operation +* Combo search to filter and select tiddlers +* Title operation: add, remove prefixes and suffixes, also remove cahras form begining and end of title (on renaming tiddlers, [[relink|https://flibbles.github.io/tw5-relink/]] can be used to update title in other tiddlers) +* Tag operation: add, remove, replace +* Field operation: add, remove, rename, and set field value +* ~SnR, search and replace in all fields including text, tags, //title//, and common fields +* Inspect, to review and inspect tiddlers in one place, scroll among them and edit all fields (including common fields), tags, text (title is an exception!) +* Log, create logs of all operations +* Search, //save and load// any combination of filter search + + diff --git a/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid new file mode 100644 index 000000000..67d6b22ad --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid @@ -0,0 +1,18 @@ +created: 20201117160944367 +creator: Mohammad +modified: 20201117162735263 +modifier: Mohammad +tags: Resources Plugings +title: Tiddlyshow by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/Tiddlyshow/ + +Tiddlyshow is a small application of Tiddlywiki for presentation and slideshow. It can also be used as a plugin. + +{{!!url}} + +Tiddlyshow contains the following features + +* Tools for preparing slides +* Shortcut keys for navigation (forward and backward) +* Themes to colorify and customize the slideshow diff --git a/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid new file mode 100644 index 000000000..ccc15be78 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid @@ -0,0 +1,16 @@ +created: 20201117161434779 +creator: Mohammad +modified: 20201117161728094 +modifier: Mohammad +tags: Resources Plugings +title: Timelines by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Timelines/ + +Timelines plugin is for creating vertical and horizontal timeline and sequences. + +{{!!url}} + +The content or description and data of events are stored in individual tiddlers. + +Timelines contain two timeline macros and two sequence macros. A sequence macro shows event contents in sequence not necessarily in chronological order. The order can be determined by tag or list field or other methods. diff --git a/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid new file mode 100644 index 000000000..7144521ee --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid @@ -0,0 +1,16 @@ +created: 20201116210711381 +creator: Mohammad +modified: 20201116212041642 +modifier: Mohammad +tags: Resources Plugings +title: Todolist by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Todolist/ + +Todolist is a small pure wikitext plugin, contain all tools to work with todo list. + +{{!!url}} + +With Todolist, easily organize and prioritize your tasks and projects so you’ll always know exactly what to work on next. + +Todolist creates custom UI and lets you to add new items, set priority, done/undone items, archive, delete. Using Todolist plugin it is possible to create several todo lists in one Tiddlywiki. diff --git a/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid new file mode 100644 index 000000000..76af19e07 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid @@ -0,0 +1,16 @@ +created: 20201117155328920 +creator: Mohammad +modified: 20201117155604253 +modifier: Mohammad +tags: Resources Plugings +title: Trashbin by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Trashbin/ + +The concept behind Trashbin plugin is to have a simple mechanism to move deleted tiddlers to Trashbin and be able to restore them later if required. + +{{!!url}} + +The trash (also known as the Recycle Bin in Microsoft Windows) is a temporary storage for tiddlers that have been deleted in a Tiddlywiki by the user, but not yet permanently erased. + +Typically, a trash bin is presented as a special storage, allowing the user to browse deleted (removed) tiddlers, undelete those that were deleted by mistake, or delete them permanently (either one by one, or by the "Empty Trash" function). diff --git a/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid new file mode 100644 index 000000000..97ab74b0f --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid @@ -0,0 +1,15 @@ +created: 20201117160011169 +creator: Mohammad +modified: 20201117160235750 +modifier: Mohammad +tags: Resources Plugings +title: Utility by Mohammad +type: text/vnd.tiddlywiki +url: https://kookma.github.io/TW-Utility/ + +The utility plugin objective is to provide set of tools for developers and authors. + +{{!!url}} + + +These tools include simple transclusions, show raw contents of tiddlers, author tools, wikitext macros, show fields in view mode, etc. From b95f9e6000bffb563e06d644d76a34abd87f131a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 17 Nov 2020 20:08:14 +0100 Subject: [PATCH 0975/2376] Partial fix for issue #4721 (#5060) * Update new-tiddler.tid * Update new-journal.tid * Update new-image.tid --- core/ui/Actions/new-image.tid | 5 +++-- core/ui/Actions/new-journal.tid | 7 ++++--- core/ui/Actions/new-tiddler.tid | 5 ++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/core/ui/Actions/new-image.tid b/core/ui/Actions/new-image.tid index d27d5c8c1..fc7316235 100644 --- a/core/ui/Actions/new-image.tid +++ b/core/ui/Actions/new-image.tid @@ -5,6 +5,7 @@ description: create a new image tiddler \define get-type() image/$(imageType)$ \end -<$vars imageType={{$:/config/NewImageType}}> -<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>> tags={{$:/config/NewTiddler/Tags}}/> +\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$ +<$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> diff --git a/core/ui/Actions/new-journal.tid b/core/ui/Actions/new-journal.tid index 4c5082f78..b5d1fe09f 100644 --- a/core/ui/Actions/new-journal.tid +++ b/core/ui/Actions/new-journal.tid @@ -2,13 +2,14 @@ title: $:/core/ui/Actions/new-journal tags: $:/tags/Actions description: create a new journal tiddler -<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} journalText={{$:/config/NewJournal/Text}}> +\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$ +<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}> <$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>"""> <$reveal type="nomatch" state=<<journalTitle>> text=""> -<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/> +<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/> </$reveal> <$reveal type="match" state=<<journalTitle>> text=""> -<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalTags>> text=<<journalText>>/> +<$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/> </$reveal> </$wikify> </$vars> diff --git a/core/ui/Actions/new-tiddler.tid b/core/ui/Actions/new-tiddler.tid index 4a6eeac7b..c919a109e 100644 --- a/core/ui/Actions/new-tiddler.tid +++ b/core/ui/Actions/new-tiddler.tid @@ -2,4 +2,7 @@ title: $:/core/ui/Actions/new-tiddler tags: $:/tags/Actions description: create a new empty tiddler -<$action-sendmessage $message="tm-new-tiddler" tags={{$:/config/NewTiddler/Tags}}/> +\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$ +<$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}> +<$action-sendmessage $message="tm-new-tiddler" tags=<<get-tags>>/> +</$vars> From 527638d5e60114653385ed39dc55c736a67e58d2 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 17 Nov 2020 20:12:41 +0100 Subject: [PATCH 0976/2376] Improved status messages in ImportListing to remove redundant and irrelevant messages (#5059) --- core/language/en-GB/Import.multids | 16 ++++++++-------- core/modules/upgraders/plugins.js | 2 +- core/modules/widgets/navigator.js | 1 + core/ui/ImportListing.tid | 10 +++++++--- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/core/language/en-GB/Import.multids b/core/language/en-GB/Import.multids index cc2c6c143..3b3308ad5 100644 --- a/core/language/en-GB/Import.multids +++ b/core/language/en-GB/Import.multids @@ -18,11 +18,11 @@ Listing/Rename/Prompt: Rename to: Listing/Rename/ConfirmRename: Rename tiddler Listing/Rename/CancelRename: Cancel Listing/Rename/OverwriteWarning: A tiddler with this title already exists. -Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugin -Upgrader/Plugins/Suppressed/Version: Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>) -Upgrader/Plugins/Upgraded: Upgraded plugin from <<incoming>> to <<upgraded>> -Upgrader/State/Suppressed: Blocked temporary state tiddler -Upgrader/System/Suppressed: Blocked system tiddler -Upgrader/System/Warning: Core module tiddler -Upgrader/System/Alert: You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable -Upgrader/ThemeTweaks/Created: Migrated theme tweak from <$text text=<<from>>/> +Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugin. +Upgrader/Plugins/Suppressed/Version: Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>). +Upgrader/Plugins/Upgraded: Upgraded plugin from <<incoming>> to <<upgraded>>. +Upgrader/State/Suppressed: Blocked temporary state tiddler. +Upgrader/System/Suppressed: Blocked system tiddler. +Upgrader/System/Warning: Core module tiddler. +Upgrader/System/Alert: You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable. +Upgrader/ThemeTweaks/Created: Migrated theme tweak from <$text text=<<from>>/>. diff --git a/core/modules/upgraders/plugins.js b/core/modules/upgraders/plugins.js index 83c762897..a7dd02982 100644 --- a/core/modules/upgraders/plugins.js +++ b/core/modules/upgraders/plugins.js @@ -57,7 +57,7 @@ exports.upgrade = function(wiki,titles,tiddlers) { // Reject the incoming plugin by blanking all its fields if($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) { tiddlers[title] = Object.create(null); - messages[title] = requiresReload + $tw.language.getString("Import/Upgrader/Plugins/Suppressed/Version",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}}); + messages[title] = $tw.language.getString("Import/Upgrader/Plugins/Suppressed/Version",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}}); return; } } diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 189765396..c44a24afb 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -529,6 +529,7 @@ NavigatorWidget.prototype.handleImportTiddlersEvent = function(event) { $tw.utils.each(importData.tiddlers,function(tiddler,title) { if($tw.utils.count(tiddler) === 0) { newFields["selection-" + title] = "unchecked"; + newFields["suppressed-" + title] = "yes"; } }); // Save the $:/Import tiddler diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index a2c371807..e3705abab 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -7,13 +7,17 @@ title: $:/core/ui/ImportListing \define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>] \define overWriteWarning() +<$list filter="[<currentTiddler>!has<suppressedField>]"> <$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/> +</$list> \end \define selectionField() selection-$(payloadTiddler)$ \define renameField() rename-$(payloadTiddler)$ +\define suppressedField() suppressed-$(payloadTiddler)$ + \define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$ \define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$ @@ -44,15 +48,15 @@ title: $:/core/ui/ImportListing <$list filter="[all[current]plugintiddlers[]sort[title]]" variable="payloadTiddler"> <tr> <td> -<$checkbox field=<<selectionField>> checked="checked" unchecked="unchecked" default="checked"/> +<$checkbox field=<<selectionField>> checked="checked" unchecked="unchecked" default="checked" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/> </td> <td> <$reveal type="nomatch" state=<<renameFieldState>> text="yes" tag="div"> <$reveal type="nomatch" state=<<previewPopupState>> text="yes" tag="div" class="tc-flex"> -<$button class="tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break" set=<<previewPopupState>> setTo="yes"> +<$button class="tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break" set=<<previewPopupState>> setTo="yes" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}> <span class="tc-small-gap-right">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/> </$button> -<$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button> +<$list filter="[<currentTiddler>!has<suppressedField>]"><$button class="tc-btn-invisible" set=<<renameFieldState>> setTo="yes" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list> </$reveal> <$reveal type="match" state=<<previewPopupState>> text="yes" tag="div"> <$button class="tc-btn-invisible tc-btn-dropdown" set=<<previewPopupState>> setTo="no"> From d181b9651895943521832908a2fee6ab80aa2d71 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 18 Nov 2020 12:05:06 +0000 Subject: [PATCH 0977/2376] Wikitext parser: Refactor a poorly written utility function --- core/modules/parsers/wikiparser/wikiparser.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index 673176038..dbeed9de2 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -386,22 +386,18 @@ Amend the rules used by this instance of the parser WikiParser.prototype.amendRules = function(type,names) { names = names || []; // Define the filter function - var keepFilter; + var target; if(type === "only") { - keepFilter = function(name) { - return names.indexOf(name) !== -1; - }; + target = true; } else if(type === "except") { - keepFilter = function(name) { - return names.indexOf(name) === -1; - }; + target = false; } else { return; } // Define a function to process each of our rule arrays var processRuleArray = function(ruleArray) { for(var t=ruleArray.length-1; t>=0; t--) { - if(!keepFilter(ruleArray[t].rule.name)) { + if((names.indexOf(ruleArray[t].rule.name) === -1) === target) { ruleArray.splice(t,1); } } From 061b75741ba33ffda2472fdb3d0d7b2e13b1bd3a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 18 Nov 2020 13:14:19 +0000 Subject: [PATCH 0978/2376] Fix GitHub Actions Copied from 4ecd885a0c990967df96cbb98b3b7bd6593c1415 which fixes #4885 --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ac889fe9..f377b3921 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,9 +39,9 @@ jobs: - name: "Set dynamic environment variables" run: | TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} - echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) - echo ::set-env name=TW5_BUILD_DETAILS::Prerelease built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV + echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV + echo "TW5_BUILD_DETAILS=Prerelease built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: @@ -65,9 +65,9 @@ jobs: - name: "Set dynamic environment variables" run: | TW5_BUILD_BRANCH=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') - echo ::set-env name=TW5_BUILD_BRANCH::${TW5_BUILD_BRANCH} - echo ::set-env name=TW5_BUILD_VERSION::$(./bin/get-plugin-library-version-number) - echo ::set-env name=TW5_BUILD_DETAILS::Built from branch \'$TW5_BUILD_BRANCH\' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z') + echo "TW5_BUILD_BRANCH=${TW5_BUILD_BRANCH}" >> $GITHUB_ENV + echo "TW5_BUILD_VERSION=$(./bin/get-plugin-library-version-number)" >> $GITHUB_ENV + echo "TW5_BUILD_DETAILS=Built from branch '$TW5_BUILD_BRANCH' at commit $(git rev-parse HEAD) of $(git remote get-url origin) at $(date +'%F %T %Z')" >> $GITHUB_ENV - run: "./bin/build-site.sh" - run: "./bin/ci-push.sh" env: From 6f8dca956bd894ef52f66c6f280e9ed7a7e7e20d Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Wed, 18 Nov 2020 16:50:40 +0100 Subject: [PATCH 0979/2376] Colour code ImportListing rows (#5067) --- core/ui/ImportListing.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index e3705abab..04ccd9a79 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -46,7 +46,7 @@ title: $:/core/ui/ImportListing </th> </tr> <$list filter="[all[current]plugintiddlers[]sort[title]]" variable="payloadTiddler"> -<tr> +<tr class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}> <td> <$checkbox field=<<selectionField>> checked="checked" unchecked="unchecked" default="checked" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/> </td> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index eb57435f8..dc9b99f08 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2086,6 +2086,15 @@ html body.tc-body.tc-single-tiddler-window { width: 30%; } +.tc-import-table .tc-row-disabled { + background: <<colour very-muted-foreground>>10; + opacity: 0.8; +} + +.tc-import-table .tc-row-warning { + background: <<colour diff-delete-background>>50; +} + /* ** Alerts */ From 1a8c6fdc4bd33caf256c707dbe88defd134ab6ff Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Wed, 18 Nov 2020 16:56:38 +0100 Subject: [PATCH 0980/2376] Docs: Added example of how to remove stop words (#5066) * Added example of how to remove stop words * Moved filter operator example tiddlers to correct folder --- .../examples/How to remove stop words.tid | 28 +++++++++++++++++++ .../search-replace Operator (Examples).tid | 7 +++-- .../examples/sortsub Operator (Examples).tid | 4 ++- .../toggle Operator (Examples).tid | 0 4 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/examples/How to remove stop words.tid rename editions/tw5.com/tiddlers/filters/{ => examples}/search-replace Operator (Examples).tid (91%) rename editions/tw5.com/tiddlers/filters/{ => examples}/toggle Operator (Examples).tid (100%) diff --git a/editions/tw5.com/tiddlers/filters/examples/How to remove stop words.tid b/editions/tw5.com/tiddlers/filters/examples/How to remove stop words.tid new file mode 100644 index 000000000..a228e4404 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/How to remove stop words.tid @@ -0,0 +1,28 @@ +created: 20201118094513209 +modified: 20201118103414384 +tags: [[Operator Examples]] [[search-replace Operator]] [[sortsub Operator]] +title: How to remove stop words +type: text/vnd.tiddlywiki + +\define book-list() +[[A Tale of Two Cities]] +[[The Dice Man]] +[[A New Kind of Science]] +[[The Recursive Universe]] +[[Great Expectations]] +[[Animal Farm]] +\end + +\define compare-without-stopwords() +[<currentTiddler>search-replace:i:regexp[^The |A ],[]] +\end + +You can use the [[search-replace Operator]] in combination with the [[sortsub Operator]] to ignore stop words like "A" and "The" at the beginning of titles when sorting. (Note for example that "A Tale of Two Cities" sorts under "T" rather than "A") +<<.operator-example 6 "[enlist<book-list>sortsub<compare-without-stopwords>]">> + +You can also customise the listing so that "A Tale of Two Cities" is listed as "Tale of Two Cities, A" but still links to the correct tiddler. +<<wikitext-example-without-html """<ul> +<$list filter="[enlist<book-list>sortsub<compare-without-stopwords>]"> +<li><$link><$text text={{{[<currentTiddler>search-replace:i:regexp[(^The |A )(.*)],[$2, $1]]}}}/></$link></li> +</$list> +</ul>""">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/search-replace Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/search-replace Operator (Examples).tid similarity index 91% rename from editions/tw5.com/tiddlers/filters/search-replace Operator (Examples).tid rename to editions/tw5.com/tiddlers/filters/examples/search-replace Operator (Examples).tid index 79c9b60b6..5bcb57509 100644 --- a/editions/tw5.com/tiddlers/filters/search-replace Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/search-replace Operator (Examples).tid @@ -1,5 +1,5 @@ created: 20201107112846692 -modified: 20201107113536230 +modified: 20201118103305351 tags: [[Operator Examples]] [[search-replace Operator]] title: search-replace Operator (Examples) type: text/vnd.tiddlywiki @@ -20,6 +20,7 @@ Replace all matches of a string irrespective of case: <<.operator-example 3 """[[Hello There]search-replace:gi[H],[]]""">> You can also use regular expression capture groups in the replacement string: - `\define names() (\w+)\s(\w+)` -<<.operator-example 4 """[[John Smith]search-replace::regexp<names>,[$2,$1]]""" >> \ No newline at end of file +<<.operator-example 4 """[[John Smith]search-replace::regexp<names>,[$2,$1]]""" >> + +{{How to remove stop words}} diff --git a/editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid index 475413155..ea91205d9 100644 --- a/editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/sortsub Operator (Examples).tid @@ -1,5 +1,5 @@ created: 20200425110427700 -modified: 20200425110427700 +modified: 20201118103327392 tags: [[sortsub Operator]] [[Operator Examples]] title: sortsub Operator (Examples) type: text/vnd.tiddlywiki @@ -29,4 +29,6 @@ These examples make use of the following variables: <<.operator-example 4 "[!sortsub:number<compare-by-text-length>limit[10]]">> <<.operator-example 5 "[tag[Field Operators]sortsub:date<compare-by-newest-of-modified-and-created-dates>]">> +{{How to remove stop words}} + </$vars> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/toggle Operator (Examples).tid similarity index 100% rename from editions/tw5.com/tiddlers/filters/toggle Operator (Examples).tid rename to editions/tw5.com/tiddlers/filters/examples/toggle Operator (Examples).tid From f61906501d89f9ce2bbc77bb3badba2cd5a81a34 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 18 Nov 2020 16:31:28 +0000 Subject: [PATCH 0981/2376] Fix issue with Arabic translation See discussion https://groups.google.com/d/msgid/tiddlywikidev/bb2f558e-5daa-4f18-8dca-73abc61d4dbfn%40googlegroups.com @Kamal-Habash the .multids file does not allow line breaks in items. Does my fix look right? --- languages/ar-PS/ControlPanel.multids | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/languages/ar-PS/ControlPanel.multids b/languages/ar-PS/ControlPanel.multids index df17cecc4..61ca9e045 100644 --- a/languages/ar-PS/ControlPanel.multids +++ b/languages/ar-PS/ControlPanel.multids @@ -1,6 +1,5 @@ title: $:/language/ControlPanel/ -<$button set="$: DefaultTiddlers" setTo="[list[$:/StoryList]]"> Advanced/Caption: متقدم Advanced/Hint: معلومات داخلية عن هذا الوكي Appearance/Caption: مظهر خارجي @@ -9,10 +8,7 @@ Appearance/Hint: طرق لتخصيص مظهر وكي خاص بك. Basics/AnimDuration/Prompt: مدة الرسوم المتحركة Basics/AutoFocus/Prompt: موقع مؤشر الماوس الإفتراضي للتدلرز الجددة Basics/Caption: أساسيات -Basics/DefaultTiddlers/BottomHint: إستخدم [[أقواس مربعة مزدوجة]] للعناوين مع مسافات. أو بإمكانك إختيار -<$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]"> -الإحتفاظ بترتيب القصة -</$button> +Basics/DefaultTiddlers/BottomHint: إستخدم [[أقواس مربعة مزدوجة]] للعناوين مع مسافات. أو بإمكانك إختيار<$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">الإحتفاظ بترتيب القصة</$button> Basics/DefaultTiddlers/Prompt: تدلرز مفترضة Basics/DefaultTiddlers/TopHint: أي تدلرز ستظهر عند التشغيل Basics/Language/Prompt: مرحبا! اللغة الحالية: From 37f4421ed1c7d7957d622c1fa600ac8135068471 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Thu, 19 Nov 2020 00:39:45 +0800 Subject: [PATCH 0982/2376] Improve chinese status messages in ImportListing (#5064) --- languages/zh-Hans/Import.multids | 14 +++++++------- languages/zh-Hant/Import.multids | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/languages/zh-Hans/Import.multids b/languages/zh-Hans/Import.multids index 247c2e68c..a1320b5c4 100644 --- a/languages/zh-Hans/Import.multids +++ b/languages/zh-Hans/Import.multids @@ -18,11 +18,11 @@ Listing/Rename/Tooltip: 导入前重新命名条目 Listing/Rename/ConfirmRename: 重新命名条目 Listing/Rename/CancelRename: 取消 Listing/Rename/OverwriteWarning: 具有此标题的条目已存在。 -Upgrader/Plugins/Suppressed/Incompatible: 封锁的不兼容或过时插件 -Upgrader/Plugins/Suppressed/Version: 封锁的插件 (由于传入的 <<incoming>> 较现有版本 <<existing>> 旧) -Upgrader/Plugins/Upgraded: 升级插件,从 <<incoming>> 到 <<upgraded>> -Upgrader/State/Suppressed: 封锁的暂存状态条目 -Upgrader/System/Suppressed: 封锁的系统条目 -Upgrader/System/Warning: 核心模块条目 +Upgrader/Plugins/Suppressed/Incompatible: 封锁的不兼容或过时插件。 +Upgrader/Plugins/Suppressed/Version: 封锁的插件 (由于传入的 <<incoming>> 不比现有版本 <<existing>> 新)。 +Upgrader/Plugins/Upgraded: 升级插件,从 <<incoming>> 到 <<upgraded>>。 +Upgrader/State/Suppressed: 封锁的暂存状态条目。 +Upgrader/System/Suppressed: 封锁的系统条目。 +Upgrader/System/Warning: 核心模块条目。 Upgrader/System/Alert: 您即将导入一个条目会覆盖一个核心模块条目。不建议这样做,因为可能会使系统不稳定。 -Upgrader/ThemeTweaks/Created: 从 <$text text=<<from>>/> 迁移布景主题 +Upgrader/ThemeTweaks/Created: 从 <$text text=<<from>>/> 迁移布景主题。 diff --git a/languages/zh-Hant/Import.multids b/languages/zh-Hant/Import.multids index 4c6b5d3d5..d87935929 100644 --- a/languages/zh-Hant/Import.multids +++ b/languages/zh-Hant/Import.multids @@ -18,11 +18,11 @@ Listing/Rename/Tooltip: 導入前重新命名條目 Listing/Rename/ConfirmRename: 重新命名條目 Listing/Rename/CancelRename: 取消 Listing/Rename/OverwriteWarning: 具有此標題的條目已存在。 -Upgrader/Plugins/Suppressed/Incompatible: 封鎖的不相容或過時插件 -Upgrader/Plugins/Suppressed/Version: 封鎖的插件 (由於傳入的 <<incoming>> 較現有版本 <<existing>> 舊) -Upgrader/Plugins/Upgraded: 升級插件,從 <<incoming>> 到 <<upgraded>> -Upgrader/State/Suppressed: 封鎖的暫存狀態條目 -Upgrader/System/Suppressed: 封鎖的系統條目 -Upgrader/System/Warning: 核心模組條目 +Upgrader/Plugins/Suppressed/Incompatible: 封鎖的不相容或過時插件。 +Upgrader/Plugins/Suppressed/Version: 封鎖的插件 (由於傳入的 <<incoming>> 不比現有版本 <<existing>> 新)。 +Upgrader/Plugins/Upgraded: 升級插件,從 <<incoming>> 到 <<upgraded>>。 +Upgrader/State/Suppressed: 封鎖的暫存狀態條目。 +Upgrader/System/Suppressed: 封鎖的系統條目。 +Upgrader/System/Warning: 核心模組條目。 Upgrader/System/Alert: 您即將導入一個條目會覆蓋一個核心模組條目。不建議這樣做,因為可能會使系統不穩定。 -Upgrader/ThemeTweaks/Created: 從 <$text text=<<from>>/> 遷移佈景主題 +Upgrader/ThemeTweaks/Created: 從 <$text text=<<from>>/> 遷移佈景主題。 From 0be778fc27f03fd42bcd7c8d1f434925e02ae349 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 18 Nov 2020 16:56:01 +0000 Subject: [PATCH 0983/2376] Update Dutch translation Thanks @gernert --- languages/nl-NL/ControlPanel.multids | 5 +++++ languages/nl-NL/EditTemplate.multids | 2 ++ languages/nl-NL/Import.multids | 6 ++++++ languages/nl-NL/Misc.multids | 12 ++++++++++++ 4 files changed, 25 insertions(+) diff --git a/languages/nl-NL/ControlPanel.multids b/languages/nl-NL/ControlPanel.multids index 6c25eb77d..82b2ba946 100644 --- a/languages/nl-NL/ControlPanel.multids +++ b/languages/nl-NL/ControlPanel.multids @@ -88,6 +88,7 @@ Plugins/Reinstall/Caption: herinstalleer Plugins/Theme/Prompt: Thema's Plugins/Themes/Caption: Thema's Plugins/Themes/Hint: Thema plugins +Plugins/Updates/Hint: Beschikbare updates voor geïnstalleerde plugins Saving/Caption: Opslaan Saving/DownloadSaver/AutoSave/Description: Sta automatisch opslaan toe voor de opslagmodule Saving/DownloadSaver/AutoSave/Hint: Sla automatisch op voor de opslagmodule @@ -108,7 +109,9 @@ Saving/GitService/Branch: Doeltak (branch) voor opslaan Saving/GitService/CommitMessage: Opgeslagen door TiddlyWiki Saving/GitService/Description: Deze instellingen worden alleen gebruikt bij opslaan naar <<service-name>> Saving/GitService/Filename: Bestandsnaam van doelbestand (b.v. `index.html`) +Saving/GitService/Gitea/Caption: Gitea opslagmodule Saving/GitService/Gitea/Password: Persoonlijk toegangs-token voor API (via Gitea’s web interface: `Settings | Applications | Generate New Token`) +Saving/GitService/GitHub/Caption: ~GitHub opslagmodule Saving/GitService/GitHub/Password: Wachtwoord, OAUTH token, of persoonlijk toegangs-token (zie [[GitHub help-pagina|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] voor details) Saving/GitService/GitLab/Caption: ~GitLab opslagmodule Saving/GitService/GitLab/Password: Persoonlijk toegangs-token voor API (zie [[GitLab help-pagina|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] voor details) @@ -120,6 +123,8 @@ Saving/Hint: Instellingen voor opslaan van de gehele TiddlyWiki als één bestan Saving/TiddlySpot/Advanced/Heading: Geavanceerde instellingen Saving/TiddlySpot/BackupDir: Backup folder Saving/TiddlySpot/Backups: Backups +Saving/TiddlySpot/Caption: ~TiddlySpot opslagmodule +Saving/TiddlySpot/ControlPanel: ~TiddlySpot bedieningspaneel Saving/TiddlySpot/Description: Deze instellingen worden alleen gebruikt bij http://tiddlyspot.com of een vergelijkbare server Saving/TiddlySpot/Filename: Upload bestandsnaam Saving/TiddlySpot/Heading: ~TiddlySpot diff --git a/languages/nl-NL/EditTemplate.multids b/languages/nl-NL/EditTemplate.multids index d8cb1126f..3cf78980a 100644 --- a/languages/nl-NL/EditTemplate.multids +++ b/languages/nl-NL/EditTemplate.multids @@ -18,6 +18,8 @@ Shadow/Warning: Dit is een schaduwtiddler. Elke verandering overschrijft de stan Tags/Add/Button: + Tags/Add/Button/Hint: voeg label toe Tags/Add/Placeholder: labelnaam +Tags/ClearInput/Caption: verwijde ingave +Tags/ClearInput/Hint: Verwijder labelingave Tags/Dropdown/Caption: labellijst Tags/Dropdown/Hint: Toon labellijst Title/BadCharacterWarning: Waarschuwing: vermijd elk karakter van <<bad-chars>> in tiddler titels diff --git a/languages/nl-NL/Import.multids b/languages/nl-NL/Import.multids index f08222ad7..32004f3ce 100644 --- a/languages/nl-NL/Import.multids +++ b/languages/nl-NL/Import.multids @@ -10,6 +10,12 @@ Listing/Preview/DiffFields: Verschil (Velden) Listing/Preview/Fields: Velden Listing/Preview/Text: Tekst Listing/Preview/TextRaw: Tekst (Ruw) +Listing/Rename/CancelRename: Annuleer +Listing/Rename/ConfirmRename: Hernoem tiddler +Listing/Rename/OverwriteWarning: Een tiddler met deze naam bestaat al + +Listing/Rename/Prompt: Hernoem tot: +Listing/Rename/Tooltip: Hernoem tiddler voor import Listing/Select/Caption: Selecteer Listing/Status/Caption: Status Listing/Title/Caption: Titel diff --git a/languages/nl-NL/Misc.multids b/languages/nl-NL/Misc.multids index 16ad5d126..958817def 100644 --- a/languages/nl-NL/Misc.multids +++ b/languages/nl-NL/Misc.multids @@ -5,6 +5,7 @@ BinaryWarning/Prompt: Deze tiddler bevat binaire data ClassicWarning/Hint: Deze tiddler is in TiddlyWiki Classic wiki tekstformaat geschreven dat niet geheel compatibel is met TiddlyWiki versie 5. Zie https://tiddlywiki.com/static/Upgrading.html voor meer details. ClassicWarning/Upgrade/Caption: upgrade CloseAll/Button: sluit alle +ConfirmAction: Wil je doorgaan? ConfirmCancelTiddler: Wil je gemaakte wijzigingen aan de tiddler "<$text text=<<title>>/>" annuleren? ConfirmDeleteTiddler: Wil je de tiddler "<$text text=<<title>>/>" verwijderen? ConfirmEditShadowTiddler: Je staat op het punt een schaduwtiddler te wijzigen. Toekomstige automatische veranderingen (upgrades) zijn dan niet mogelijk. Wil je "<$text text=<<title>>/>" wijzigen? @@ -24,7 +25,9 @@ Encryption/Username: Gebruikersnaam Error/Caption: Fout Error/EditConflict: Bestand gewijzigd op server Error/Filter: Filterfout +Error/FilterRunPrefix: Filterfout: Onbekend voorvoegsel voor filter 'run' Error/FilterSyntax: Syntaxfout in filter expressie +Error/FormatFilterOperator: Filterfout: Onbekend achtervoegsel voor de 'format' filter operator Error/IsFilterOperator: Filterfout: Onbekende operand voor het 'is' filter Error/LoadingPluginLibrary: Fout bij laden van de pluginbibliotheek Error/NetworkErrorAlert: `<h2>''Network fout''</h2>De verbinding met de server lijkt verbroken. Mogelijk een probleem met de netwerkverbinding. Herstel de netwerkverbinding voordat verder wordt gegaan.<br><br>''Niet opgeslagen veranderingen worden gesynchroniseerd als de verbinding hersteld is''.` @@ -60,6 +63,15 @@ OfficialPluginLibrary: Officiële ~TiddlyWiki pluginbibliotheek OfficialPluginLibrary/Hint: De officiële ~TiddlyWiki pluginbibliotheek op tiddlywiki.com. Plugins, thema's en taalpaketten worden door het core team onderhouden. PluginReloadWarning: Sla op {{$:/core/ui/Buttons/save-wiki}} en ververs {{$:/core/ui/Buttons/refresh}} om wijzigingen aan plugins door te voeren RecentChanges/DateFormat: DD MMM YYYY +Shortcuts/Input/Accept/Hint: Accepteer het geselecteerde item +Shortcuts/Input/AcceptVariant/Hint: Accepteer het geselecteerde item (variant) +Shortcuts/Input/AdvancedSearch/Hint: Open geavanceerd zoeken vanuit het zoekveld in het zijpaneel +Shortcuts/Input/Cancel/Hint: Wis het input veld +Shortcuts/Input/Down/Hint: Selecteer het volgende item +Shortcuts/Input/Tab-Left/Hint: Selecteer de voorgaande tab +Shortcuts/Input/Tab-Right/Hint: Selecteer de volgende tab +Shortcuts/Input/Up/Hint: Selecteer het voorgaande item +Shortcuts/SidebarLayout/Hint: Verander de layout van het zijpaneel SystemTiddler/Tooltip: Dit is een systeem tiddler SystemTiddlers/Include/Prompt: Inclusief systeem tiddlers TagManager/Colour/Heading: Kleur From da66323dc572a2e4b4b628314ef408e68483a54c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 18 Nov 2020 19:02:40 +0100 Subject: [PATCH 0984/2376] Remove 2em of whitespace from EditTemplate when there are no visible fields (#5063) * Remove 2em of whitespace from EditTemplate when there are no visible fields * Update base.tid * Update fields.tid * Update fields.tid * Update base.tid --- core/ui/EditTemplate/fields.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 84f0baa68..7afaf8ac1 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -57,7 +57,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> \whitespace trim <div class="tc-edit-fields"> -<table class="tc-edit-fields"> +<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}> <tbody> <$list filter="[all[current]fields[]] +[sort[title]]" variable="currentField" storyview="pop"> <$list filter=<<config-filter>> variable="temp"> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index dc9b99f08..89811d577 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1420,6 +1420,10 @@ html body.tc-body.tc-single-tiddler-window { width: 100%; } +.tc-edit-fields.tc-edit-fields-small { + margin-top: 0; + margin-bottom: 0; +} .tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td { border: none; From a81b7fc9f4b7da42597c7ebfb1718b7bdfdac032 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 18 Nov 2020 18:21:38 +0000 Subject: [PATCH 0985/2376] Remove extraneous modifier/creator fields Fixes #5068 --- .../tiddlers/community/resources/Favorites by Mohammad.tid | 2 -- .../community/resources/GitHub Saver Tutorial by Mohammad.tid | 2 -- .../community/resources/Kookma Plugin Library by Mohammad.tid | 2 -- .../tiddlers/community/resources/Refnotes by Mohammad.tid | 2 -- .../community/resources/RegExp in Tiddlywiki by Mohammad.tid | 2 -- .../tiddlers/community/resources/Searchwikis by Mohammad.tid | 2 -- .../community/resources/Semantic Colors by Mohammad.tid | 2 -- .../tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid | 2 -- .../tw5.com/tiddlers/community/resources/Slider by Mohammad.tid | 2 -- .../tiddlers/community/resources/TW-Scripts by Mohammad.tid | 2 -- .../community/resources/Tiddler Commander by Mohammad.tid | 2 -- .../tiddlers/community/resources/Tiddlyshow by Mohammad.tid | 2 -- .../tiddlers/community/resources/Timelines by Mohammad.tid | 2 -- .../tiddlers/community/resources/Todolist by Mohammad.tid | 2 -- .../tiddlers/community/resources/Trashbin by Mohammad.tid | 2 -- .../tiddlers/community/resources/Utility by Mohammad.tid | 2 -- 16 files changed, 32 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid index 4715cbc3f..17d6532b4 100644 --- a/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117155737569 -creator: Mohammad modified: 20201117155943559 -modifier: Mohammad tags: Resources Plugings title: Favorites by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid index 0db8ff926..07534dd5c 100644 --- a/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117163027900 -creator: Mohammad modified: 20201117163855463 -modifier: Mohammad tags: Resources title: GitHub Saver Tutorial by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid index 27ae0a35e..69cfc8181 100644 --- a/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117160603290 -creator: Mohammad modified: 20201117160819308 -modifier: Mohammad tags: Resources Plugings title: Kookma Plugin Library by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid index 2dfb6e964..3f400bc19 100644 --- a/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117161853918 -creator: Mohammad modified: 20201117162122822 -modifier: Mohammad tags: Resources Plugings title: Refnotes by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid index 4bd091698..8d962586e 100644 --- a/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117164024930 -creator: Mohammad modified: 20201117164308641 -modifier: Mohammad tags: Resources title: RegExp in Tiddlywiki by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid index 77ced56fb..3f7cbc729 100644 --- a/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117160302426 -creator: Mohammad modified: 20201117160443306 -modifier: Mohammad tags: Resources Plugings title: Searchwikis by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid index 34963f263..834348b94 100644 --- a/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117162254751 -creator: Mohammad modified: 20201117162601326 -modifier: Mohammad tags: Resources title: Semantic Colors by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid index 3c31679f5..38d743552 100644 --- a/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201116204317018 -creator: Mohammad modified: 20201116210618803 -modifier: Mohammad tags: Resources Plugings title: Shiraz by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid index b8b14cddb..8373e86c8 100644 --- a/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117162655614 -creator: Mohammad modified: 20201117162926714 -modifier: Mohammad tags: Resources Plugings title: Slider by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid index f319938f7..d269023b6 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid @@ -1,7 +1,5 @@ created: 20180830194141190 -creator: Mohammad modified: 20201116203625120 -modifier: Mohammad tags: Resources title: TW-Scripts by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid index 959290950..d2c873745 100644 --- a/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201116203717105 -creator: Mohammad modified: 20201116204652385 -modifier: Mohammad tags: Resources Plugings title: Tiddler Commander by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid index 67d6b22ad..50a639ac8 100644 --- a/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117160944367 -creator: Mohammad modified: 20201117162735263 -modifier: Mohammad tags: Resources Plugings title: Tiddlyshow by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid index ccc15be78..d1e6fa7cc 100644 --- a/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117161434779 -creator: Mohammad modified: 20201117161728094 -modifier: Mohammad tags: Resources Plugings title: Timelines by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid index 7144521ee..5dcb15b75 100644 --- a/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201116210711381 -creator: Mohammad modified: 20201116212041642 -modifier: Mohammad tags: Resources Plugings title: Todolist by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid index 76af19e07..c8e442ae9 100644 --- a/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117155328920 -creator: Mohammad modified: 20201117155604253 -modifier: Mohammad tags: Resources Plugings title: Trashbin by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid index 97ab74b0f..38da64a30 100644 --- a/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid @@ -1,7 +1,5 @@ created: 20201117160011169 -creator: Mohammad modified: 20201117160235750 -modifier: Mohammad tags: Resources Plugings title: Utility by Mohammad type: text/vnd.tiddlywiki From e2bea854b64c1347efeee78a3e8a6b54e68ca961 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Thu, 19 Nov 2020 16:59:02 +0100 Subject: [PATCH 0986/2376] System tiddler syncing (#4987) * First pass at a fix for system tiddler sync issues * Add new filter syncFromServer * Undo previous attempt at a fix * Added a flag to control sync of system tiddlers from server --- .../server/routes/get-tiddlers-json.js | 3 +++ core/modules/syncer.js | 19 ++++++++++++------- core/wiki/config/SyncFilter.tid | 2 +- .../config/SyncSystemTiddlersFromServer.tid | 3 +++ 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 core/wiki/config/SyncSystemTiddlersFromServer.tid diff --git a/core/modules/server/routes/get-tiddlers-json.js b/core/modules/server/routes/get-tiddlers-json.js index 2c730e066..203900346 100644 --- a/core/modules/server/routes/get-tiddlers-json.js +++ b/core/modules/server/routes/get-tiddlers-json.js @@ -28,6 +28,9 @@ exports.handler = function(request,response,state) { return; } } + if(state.wiki.getTiddlerText("$:/config/SyncSystemTiddlersFromServer") === "no") { + filter += "+[!is[system]]"; + } var excludeFields = (state.queryParameters.exclude || "text").split(","), titles = state.wiki.filterTiddlers(filter); response.writeHead(200, {"Content-Type": "application/json"}); diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 1ad9c3474..d5eae1f48 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -305,7 +305,8 @@ Syncer.prototype.syncFromServer = function() { self.pollTimerId = null; self.syncFromServer.call(self); },self.pollTimerInterval); - }; + }, + syncSystemFromServer = (self.wiki.getTiddlerText("$:/config/SyncSystemTiddlersFromServer") === "yes" ? true : false); if(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) { this.logger.log("Retrieving updated tiddler list"); cancelNextSync(); @@ -320,9 +321,11 @@ Syncer.prototype.syncFromServer = function() { self.titlesToBeLoaded[title] = true; }); $tw.utils.each(updates.deletions,function(title) { - delete self.tiddlerInfo[title]; - self.logger.log("Deleting tiddler missing from server:",title); - self.wiki.deleteTiddler(title); + if(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) { + delete self.tiddlerInfo[title]; + self.logger.log("Deleting tiddler missing from server:",title); + self.wiki.deleteTiddler(title); + } }); if(updates.modifications.length > 0 || updates.deletions.length > 0) { self.processTaskQueue(); @@ -365,9 +368,11 @@ Syncer.prototype.syncFromServer = function() { } // Delete any tiddlers that were previously reported but missing this time $tw.utils.each(previousTitles,function(title) { - delete self.tiddlerInfo[title]; - self.logger.log("Deleting tiddler missing from server:",title); - self.wiki.deleteTiddler(title); + if(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) { + delete self.tiddlerInfo[title]; + self.logger.log("Deleting tiddler missing from server:",title); + self.wiki.deleteTiddler(title); + } }); self.processTaskQueue(); }); diff --git a/core/wiki/config/SyncFilter.tid b/core/wiki/config/SyncFilter.tid index 41d71537c..06b3f192f 100644 --- a/core/wiki/config/SyncFilter.tid +++ b/core/wiki/config/SyncFilter.tid @@ -1,3 +1,3 @@ title: $:/config/SyncFilter -[is[tiddler]] -[[$:/core]] -[prefix[$:/StoryList]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] +[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]] diff --git a/core/wiki/config/SyncSystemTiddlersFromServer.tid b/core/wiki/config/SyncSystemTiddlersFromServer.tid new file mode 100644 index 000000000..32fcb7a46 --- /dev/null +++ b/core/wiki/config/SyncSystemTiddlersFromServer.tid @@ -0,0 +1,3 @@ +title: $:/config/SyncSystemTiddlersFromServer + +no \ No newline at end of file From f591a78f370b05822b418acc48ab45b5b53af3ab Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 19 Nov 2020 17:32:43 +0100 Subject: [PATCH 0987/2376] Fix small typo in syncer-actions-refresh.tid (#5075) --- plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid index eeb0ddba2..46f8a95db 100644 --- a/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid @@ -4,6 +4,6 @@ tags: $:/tags/SyncerDropdown <$reveal state="$:/status/IsLoggedIn" type="match" text="yes"> <$button tooltip="Get latest changes from the server" aria-label="Refresh from server" class="tc-btn-invisible"> <$action-sendmessage $message="tm-server-refresh"/> -{{$:/core/images/refresh-button}} <span clas]s="tc-btn-text"><$text text="Get latest changes from the server"/></span> +{{$:/core/images/refresh-button}} <span class="tc-btn-text"><$text text="Get latest changes from the server"/></span> </$button> </$reveal> From fd14e9461037edc9ba63551bf8d576c06ac4b9f0 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 19 Nov 2020 17:37:36 +0100 Subject: [PATCH 0988/2376] Add whitespace trims to EditToolbar Buttons (#5076) * Add whitespace trim to EditToolbar cancel Button * Add whitespace trim to EditToolbar delete Button * Add whitespace trim to EditToolbar save Button --- core/ui/EditToolbar/cancel.tid | 1 + core/ui/EditToolbar/delete.tid | 1 + core/ui/EditToolbar/save.tid | 1 + 3 files changed, 3 insertions(+) diff --git a/core/ui/EditToolbar/cancel.tid b/core/ui/EditToolbar/cancel.tid index 341ae9d0b..fe21c2e99 100644 --- a/core/ui/EditToolbar/cancel.tid +++ b/core/ui/EditToolbar/cancel.tid @@ -3,6 +3,7 @@ tags: $:/tags/EditToolbar caption: {{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}} description: {{$:/language/Buttons/Cancel/Hint}} +\whitespace trim <$button actions=<<cancel-delete-tiddler-actions "cancel">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/cancel-button}} diff --git a/core/ui/EditToolbar/delete.tid b/core/ui/EditToolbar/delete.tid index 67e68c68b..fcaed4b48 100644 --- a/core/ui/EditToolbar/delete.tid +++ b/core/ui/EditToolbar/delete.tid @@ -3,6 +3,7 @@ tags: $:/tags/EditToolbar $:/tags/ViewToolbar caption: {{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}} description: {{$:/language/Buttons/Delete/Hint}} +\whitespace trim <$button actions=<<cancel-delete-tiddler-actions "delete">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/delete-button}} diff --git a/core/ui/EditToolbar/save.tid b/core/ui/EditToolbar/save.tid index cd69d7686..c539009ee 100644 --- a/core/ui/EditToolbar/save.tid +++ b/core/ui/EditToolbar/save.tid @@ -4,6 +4,7 @@ caption: {{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}} description: {{$:/language/Buttons/Save/Hint}} \define save-tiddler-button() +\whitespace trim <$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>> <<save-tiddler-actions>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> From 89541edcff6672a70020c67cdbe5a38c2ef125d7 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 20 Nov 2020 15:00:20 +0100 Subject: [PATCH 0989/2376] Added mathematics filter operators power and log (#5080) --- core/modules/filters/math.js | 14 ++++++++++++++ .../filters/examples/log Operator (Examples).tid | 14 ++++++++++++++ .../examples/power Operator (Examples).tid | 8 ++++++++ .../tw5.com/tiddlers/filters/log Operator.tid | 15 +++++++++++++++ .../tw5.com/tiddlers/filters/power Operator.tid | 15 +++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 editions/tw5.com/tiddlers/filters/examples/log Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/power Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/log Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/power Operator.tid diff --git a/core/modules/filters/math.js b/core/modules/filters/math.js index ac2b40117..f52a8c678 100644 --- a/core/modules/filters/math.js +++ b/core/modules/filters/math.js @@ -91,6 +91,20 @@ exports.exponential = makeNumericBinaryOperator( function(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));} ); +exports.power = makeNumericBinaryOperator( + function(a,b) {return Math.pow(a,b);} +); + +exports.log = makeNumericBinaryOperator( + function(a,b) { + if(b) { + return Math.log(a)/Math.log(b); + } else { + return Math.log(a); + } + } +); + exports.sum = makeNumericReducingOperator( function(accumulator,value) {return accumulator + value}, 0 // Initial value diff --git a/editions/tw5.com/tiddlers/filters/examples/log Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/log Operator (Examples).tid new file mode 100644 index 000000000..371952170 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/log Operator (Examples).tid @@ -0,0 +1,14 @@ +created: 20201120041503515 +modified: 20201120042024813 +tags: [[Operator Examples]] [[log Operator]] +title: log Operator (Examples) +type: text/vnd.tiddlywiki + +Logarithm of `8` with base `2`: +<<.operator-example 1 "[[8]log[2]]">> + +Logarithm of `100` with base `10`: +<<.operator-example 2 "[[100]log[10]]">> + +Natural logarithm of 10 (base `e`), equivalent to `ln(10)` in mathematics: +<<.operator-example 2 "[[10]log[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/power Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/power Operator (Examples).tid new file mode 100644 index 000000000..e2bfdb0f5 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/power Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20201120040913073 +modified: 20201120041513726 +tags: [[Operator Examples]] [[power Operator]] +title: power Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[[3]power[3]]">> +<<.operator-example 2 "9 +[power[2]]">> diff --git a/editions/tw5.com/tiddlers/filters/log Operator.tid b/editions/tw5.com/tiddlers/filters/log Operator.tid new file mode 100644 index 000000000..bfca18853 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/log Operator.tid @@ -0,0 +1,15 @@ +caption: log +created: 20201120041113537 +modified: 20201120041443518 +op-input: a [[selection of titles|Title Selection]] +op-output: the logarithm of each input title as numbers, with base <<.place N>> if specified otherwise base `e` +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, return its logarithm with base equal to the numeric value of the operand if specified, otherwise base `e` +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: log Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> + +<<.operator-examples "log">> diff --git a/editions/tw5.com/tiddlers/filters/power Operator.tid b/editions/tw5.com/tiddlers/filters/power Operator.tid new file mode 100644 index 000000000..d4afb67ce --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/power Operator.tid @@ -0,0 +1,15 @@ +caption: power +created: 20201120040720190 +modified: 20201120040852980 +op-input: a [[selection of titles|Title Selection]] +op-output: the input as numbers, but with each one raised to the power of <<.place N>> +op-parameter: a number +op-parameter-name: N +op-purpose: treating each input title as a number, raise it to the power of the numeric value of the operand +tags: [[Filter Operators]] [[Mathematics Operators]] [[Binary Mathematics Operators]] +title: power Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> + +<<.operator-examples "power">> From 1339c23b3ab90da37e9e91c4ae042198046b86d1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 20 Nov 2020 15:00:56 +0100 Subject: [PATCH 0990/2376] Adjustments for narrow screens (#5079) --- themes/tiddlywiki/vanilla/base.tid | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 89811d577..28a9b3d4a 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -757,6 +757,14 @@ button.tc-btn-invisible.tc-remove-tag-button { right: 29px; } +@media (max-width: <<sidebarbreakpoint-minus-one>>) { + + .tc-topbar-right { + right: 10px; + } + +} + .tc-topbar button { padding: 8px; } @@ -969,6 +977,14 @@ button.tc-btn-invisible.tc-remove-tag-button { border-bottom: 1px solid <<colour tiddler-info-tab-background>>; } +@media (max-width: <<sidebarbreakpoint-minus-one>>) { + + .tc-tiddler-info { + padding: 14px 14px 14px 14px; + } + +} + .tc-view-field-table { width: 100%; } @@ -986,6 +1002,7 @@ button.tc-btn-invisible.tc-remove-tag-button { @media (max-width: <<sidebarbreakpoint-minus-one>>) { .tc-tiddler-frame { padding: 14px 14px 14px 14px; + margin-bottom: .5em; } .tc-tiddler-info { From 483fd941f57a81bfb86ff7f92a62ff2186cd8ff3 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 20 Nov 2020 15:08:18 +0100 Subject: [PATCH 0991/2376] Extend action-log and subclass it as log widget (#5078) * Extended action-log and subclassed it as log widget * Do not rename LogWidget class * Removed unneeded variable declaration --- core/modules/widgets/action-log.js | 47 ++++++++++++++++++++++++++++-- core/modules/widgets/log.js | 30 +++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 core/modules/widgets/log.js diff --git a/core/modules/widgets/action-log.js b/core/modules/widgets/action-log.js index e3027a8e9..216eb1167 100644 --- a/core/modules/widgets/action-log.js +++ b/core/modules/widgets/action-log.js @@ -28,23 +28,66 @@ Render this widget into the DOM */ LogWidget.prototype.render = function(parent,nextSibling) { this.computeAttributes(); + this.execute(); }; +LogWidget.prototype.execute = function(){ + this.message = this.getAttribute("$$message","debug"); + this.logAll = this.getAttribute("$$all","no") === "yes" ? true : false; + this.filter = this.getAttribute("$$filter"); +} + /* Refresh the widget by ensuring our attributes are up to date */ LogWidget.prototype.refresh = function(changedTiddlers) { - return this.refreshChildren(changedTiddlers); + this.refreshSelf(); + return true; }; /* Invoke the action associated with this widget */ LogWidget.prototype.invokeAction = function(triggeringWidget,event) { - $tw.utils.logTable(this.attributes,["attribute name","value"]); + this.log(); return true; // Action was invoked }; +LogWidget.prototype.log = function() { + var data = {}, + dataCount, + allVars = {}, + filteredVars; + + $tw.utils.each(this.attributes,function(attribute,name) { + if(name.substring(0,2) !== "$$") { + data[name] = attribute; + } + }); + + for(var v in this.variables) { + allVars[v] = this.getVariable(v,{defaultValue:""}); + } + if(this.filter) { + filteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars)); + $tw.utils.each(filteredVars,function(name) { + data[name] = allVars[name]; + }); + } + dataCount = $tw.utils.count(data); + + console.group(this.message); + if(dataCount > 0) { + $tw.utils.logTable(data,["name","value"]); + } + if(this.logAll || !dataCount) { + console.groupCollapsed("All variables"); + $tw.utils.logTable(allVars,["name","value"]); + console.groupEnd(); + } + console.groupEnd(); +} + exports["action-log"] = LogWidget; })(); diff --git a/core/modules/widgets/log.js b/core/modules/widgets/log.js new file mode 100644 index 000000000..2615547ad --- /dev/null +++ b/core/modules/widgets/log.js @@ -0,0 +1,30 @@ +/*\ +title: $:/core/modules/widgets/log.js +type: application/javascript +module-type: widget-subclass + +Widget to log debug messages + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.baseClass = "action-log"; + +exports.name = "log"; + +exports.constructor = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +} + +exports.prototype = {}; + +exports.prototype.render = function(event) { + Object.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event); + Object.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this); +} + +})(); \ No newline at end of file From 59455061695d7c5c45961e0ce470a5e16c58b2c8 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 20 Nov 2020 19:21:30 +0100 Subject: [PATCH 0992/2376] Revert line-height of 3em on tiddler-edit-title (#5083) --- themes/tiddlywiki/vanilla/base.tid | 4 ---- 1 file changed, 4 deletions(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 28a9b3d4a..2b3d427f1 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1191,10 +1191,6 @@ canvas.tc-edit-bitmapeditor { overflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */ } -.tc-tiddler-title.tc-tiddler-edit-title { - line-height: 3em; -} - html body.tc-body.tc-single-tiddler-window { margin: 1em; background: <<colour tiddler-background>>; From 4f07539164921b9d41c374642015e9dfee737755 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 20 Nov 2020 19:37:23 +0100 Subject: [PATCH 0993/2376] Cycle operator improvements plus docs (#5069) * Tweak cycle operator to support step size parameter and add docs for toggle and cycle * Mention that title list should have no duplicates --- core/modules/filters/x-listops.js | 20 +++++++++------- .../tiddlers/filters/cycle Operator.tid | 24 +++++++++++++++++++ .../examples/cycle Operator (Examples).tid | 21 ++++++++++++++++ .../examples/toggle Operator (Examples).tid | 3 ++- .../tiddlers/filters/toggle Operator.tid | 9 ++++--- 5 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/cycle Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/cycle Operator (Examples).tid diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index 5b3a9aba1..eeda70c4a 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -188,19 +188,21 @@ Extended filter operators to manipulate the current list. return set; }; - var cycleValueInArray = function(results,operands) { + var cycleValueInArray = function(results,operands,stepSize) { var resultsIndex, + step = stepSize || 1, i = 0, + opLength = operands.length, nextOperandIndex; - for(i; i < operands.length; i++) { + for(i; i < opLength; i++) { resultsIndex = results.indexOf(operands[i]); if(resultsIndex !== -1) { break; } } if(resultsIndex !== -1) { - i++; - nextOperandIndex = (i === operands.length ? 0 : i); + i = i + step; + nextOperandIndex = (i < opLength ? i : i - opLength); if(operands.length > 1) { results.splice(resultsIndex,1,operands[nextOperandIndex]); } else { @@ -221,11 +223,13 @@ Extended filter operators to manipulate the current list. exports.cycle = function(source,operator) { var results = prepare_results(source), - operands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, "true") : [""]); - if(operator.suffix === "reverse") { + operands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, "true") : [""]), + step = $tw.utils.getInt(operator.operands[1]||"",1); + if(step < 0) { operands.reverse(); - } - return cycleValueInArray(results,operands); + step = Math.abs(step); + } + return cycleValueInArray(results,operands,step); } })(); \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/cycle Operator.tid b/editions/tw5.com/tiddlers/filters/cycle Operator.tid new file mode 100644 index 000000000..dfccac54b --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/cycle Operator.tid @@ -0,0 +1,24 @@ +caption: cycle +created: 20201118172906835 +modified: 20201118192136472 +op-input: a list of items +op-output: the input list with the titles specified in the parameter toggled in a cyclical manner +op-parameter: the <<.op cycle>> operator accepts 1 or 2 parameters, see below for details +op-purpose: toggle in the input, the titles specified in the first operand in a cyclical manner +tags: [[Filter Operators]] [[Listops Operators]] [[Order Operators]] +title: cycle Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> + +The <<.op cycle>> operator requires at least one parameter. + +``` +[toggle[<titles>],[step-size]] +``` +* ''titles'' : a title list to toggle in the input list cyclically. If no title from the parameter is present in the input, the first title is added. If a title from the parameter is present in the input, it is replaced with the next title from the parameter. Note that all titles specified in this parameter should be unique. +* ''step-size'': (optional). Defaults to 1. Specifies the number of steps in the parameter list to move each time. Can be a negative number. + +<$macrocall $name=".tip" _="While the <<.op cycle>> operator interprets its first parameter as a list of titles to cycle through, the [[toggle Operator]] accepts an unlimited number of distinct parameters and offers similar functionality."/> + +<<.operator-examples "cycle">> diff --git a/editions/tw5.com/tiddlers/filters/examples/cycle Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/cycle Operator (Examples).tid new file mode 100644 index 000000000..0ff1d0336 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/cycle Operator (Examples).tid @@ -0,0 +1,21 @@ +created: 20201118174250896 +modified: 20201118175415868 +tags: [[Operator Examples]] [[cycle Operator]] +title: cycle Operator (Examples) +type: text/vnd.tiddlywiki + +Cycle through a list of values to add as a tag: + +``` +<$action-listops $tiddler="target" $tags="+[cycle[todo soon now maybe done ]]" /> +``` + +Cycle through a list of values to add as a tag, in reverse order: + +``` +<$action-listops $tiddler="target" $tags="+[cycle[todo soon now maybe done ],[-1]]" /> +``` + +<<.using-days-of-week>> +<<.operator-example 1 """[list[Days of the Week]first[]] +[cycle{Days of the Week!!list}]""">> +<<.operator-example 1 """[list[Days of the Week]first[]] +[cycle{Days of the Week!!list},[2]]""">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/examples/toggle Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/toggle Operator (Examples).tid index 95e3d56a8..7fa986b7e 100644 --- a/editions/tw5.com/tiddlers/filters/examples/toggle Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/toggle Operator (Examples).tid @@ -1,5 +1,6 @@ created: 20201107154352695 -modified: 20201109104951727 +modified: 20201118174726982 +tags: [[Operator Examples]] [[toggle Operator]] title: toggle Operator (Examples) type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/toggle Operator.tid b/editions/tw5.com/tiddlers/filters/toggle Operator.tid index 2c2738134..13e971990 100644 --- a/editions/tw5.com/tiddlers/filters/toggle Operator.tid +++ b/editions/tw5.com/tiddlers/filters/toggle Operator.tid @@ -1,9 +1,9 @@ caption: toggle created: 20201107153758990 -modified: 20201109104654310 +modified: 20201118192155504 op-input: a list of items op-output: the input list with the title specified in the parameter toggled -op-parameter: the <<.op toggle>> operator accepts 1 or 2 parameters, see below for details +op-parameter: the <<.op toggle>> operator accepts 1 or more parameters, see below for details op-purpose: toggle the title specified in the operand in the input tags: [[Filter Operators]] [[Listops Operators]] [[Order Operators]] title: toggle Operator @@ -11,7 +11,7 @@ type: text/vnd.tiddlywiki <<.from-version "5.1.23">> -The <<.op toggle>> operator requires at least one parameter and can accept a second optional parameter: +The <<.op toggle>> operator requires at least one parameter and can accept additional optional parameters. With a second optional parameter it can be used to toggle between a pair of titles: ``` [toggle[<title1>],[<title2>]] @@ -19,5 +19,8 @@ The <<.op toggle>> operator requires at least one parameter and can accept a sec * ''title1'' : a title to toggle in the input list. If it is already present, it is removed. Otherwise, it is added. * ''title2'': (optional). When the second parameter is provided, the operator toggles between the two values in the input list. If neither is present, the first parameter takes precedence is added to the list. +With more than two parameters, the <<.op toggle>> behaves similar to the [[cycle|cycle Operator]] and can be used to cycle through a list of values. Note that all operands should be unique. + +<$macrocall $name=".tip" _="While the <<.op cycle>> operator interprets its first parameter as a list of titles to cycle through and offers similar functionality, the <<.op toggle>> operator accepts an unlimited number of distinct parameters."/> <<.operator-examples "toggle">> From c97003238be4cc4183a0e5201c57ce9ce9c9771e Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 20 Nov 2020 19:37:48 +0100 Subject: [PATCH 0994/2376] Doc updates for ActionLog and Log widgets (#5081) --- .../definitions/Web Developer Tools.tid | 7 +++ .../tiddlers/widgets/ActionLogWidget.tid | 26 +++++++++-- .../tw5.com/tiddlers/widgets/LogWidget.tid | 45 +++++++++++++++++++ 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 editions/tw5.com/tiddlers/definitions/Web Developer Tools.tid create mode 100644 editions/tw5.com/tiddlers/widgets/LogWidget.tid diff --git a/editions/tw5.com/tiddlers/definitions/Web Developer Tools.tid b/editions/tw5.com/tiddlers/definitions/Web Developer Tools.tid new file mode 100644 index 000000000..c02f4c277 --- /dev/null +++ b/editions/tw5.com/tiddlers/definitions/Web Developer Tools.tid @@ -0,0 +1,7 @@ +created: 20201120153119665 +modified: 20201120154646100 +tags: Definitions +title: Web Developer Tools +type: text/vnd.tiddlywiki + +Most browsers provide ''Web Developer Tools'' that include a JavaScript console. In Chrome and Firefox it can be opened via the ''Tools'' menu, or by pressing <kbd>Ctrl + Shift + J</kbd> (<kbd>Cmd + Shift + J</kbd> on a Mac). \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid index b8440f31b..2fa75cfad 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionLogWidget.tid @@ -1,21 +1,29 @@ caption: action-log created: 20201114113318785 -modified: 20201114125859948 -tags: Widgets ActionWidgets +modified: 20201120155202652 +tags: Widgets ActionWidgets [[Debugging Widgets]] title: ActionLogWidget type: text/vnd.tiddlywiki ! Introduction -<<.from-version "5.1.23">> The ''action-log'' widget is an [[action widget|ActionWidgets]] that can be used to output debugging information to the JavaScript console supported by most browsers. This can be useful because otherwise it is difficult to observe what is going on within a sequence of actions. +<<.from-version "5.1.23">> The ''action-log'' widget is an [[action widget|ActionWidgets]] that can be used to output debugging information to the [[JavaScript console|Web Developer Tools]] supported by most browsers. This can be useful because otherwise it is difficult to observe what is going on within a sequence of actions. ActionWidgets are used within triggering widgets such as the ButtonWidget. +<<.tip """ For debugging outside of actions see [[LogWidget]]""">> + ! Content and Attributes The ''action-log'' widget is invisible. Any content within it is ignored. When the actions are invoked, the names and values of all attributes are logged to the JavaScript console. +In addition there are optional attributes that can be used: + +|!Optional Attribute |!Description | +|$$filter|All variables matching this filter will also be logged. | +|$$message |A message to display as the title of the information logged. Useful when several `action-log` widgets are used in sequence. | +|$$all |Set to "yes" to log all variables in a collapsed table. Note that if there is nothing specified to log, all variables are always logged instead.| <<.tip """A handy tip if an action widget is not behaving as expected is to temporarily change it to an `<$action-log>` widget so that the attributes can be observed.""">> @@ -28,3 +36,15 @@ Here is an example of logging two variables: <$action-log myVar=<<myVar>> otherVar=<<otherVar>>/> ``` +To log all variables: + +``` +<$action-log /> +``` + + +To log two variables as well as all core variables (which start with `tv-`): + +``` +<$action-log myVar=<<myVar>> other={{!!status}} $$filter="[prefix[tv-]]"/> +``` diff --git a/editions/tw5.com/tiddlers/widgets/LogWidget.tid b/editions/tw5.com/tiddlers/widgets/LogWidget.tid new file mode 100644 index 000000000..71cb01b03 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/LogWidget.tid @@ -0,0 +1,45 @@ +created: 20201120152706842 +modified: 20201120154927696 +tags: Widgets [[Debugging Widgets]] +title: LogWidget +type: text/vnd.tiddlywiki + +! Introduction + +<<.from-version "5.1.23">> The ''log'' widget can be used to output debugging information to the [[JavaScript console|Web Developer Tools]] supported by most browsers. + +<<.tip """ For use with ActionWidgets see [[ActionLogWidget]] which uses identical parameters""">> + +! Content and Attributes + +The ''log'' widget is invisible. Any content within it is ignored. Note that the widget will log to the console both when it is first rendered and also every time it refreshes. + +When the widget is rendered, the names and values of all attributes are logged to the JavaScript console. +In addition there are optional attributes that can be used: + +|!Optional Attribute |!Description | +|$$filter|All variables matching this filter will also be logged. | +|$$message |A message to display as the title of the information logged. Useful when several `log` widgets are used in sequence. | +|$$all |Set to "yes" to log all variables in a collapsed table. Note that if there is nothing specified to log, all variables are always logged instead.| + + +! Example + +Here is an example of logging two variables: + +``` +<$log myVar=<<myVar>> otherVar=<<otherVar>>/> +``` + +To log all variables: + +``` +<$log /> +``` + + +To log two variables as well as all core variables (which start with `tv-`): + +``` +<$log myVar=<<myVar>> other={{!!status}} $$filter="[prefix[tv-]]"/> +``` From a0f145197cb91dd5e77b33741578678b4621a70f Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 20 Nov 2020 22:34:43 +0100 Subject: [PATCH 0995/2376] Correct error in operator documentation (#5084) --- editions/tw5.com/tiddlers/filters/cycle Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/cycle Operator.tid b/editions/tw5.com/tiddlers/filters/cycle Operator.tid index dfccac54b..f54316f29 100644 --- a/editions/tw5.com/tiddlers/filters/cycle Operator.tid +++ b/editions/tw5.com/tiddlers/filters/cycle Operator.tid @@ -14,7 +14,7 @@ type: text/vnd.tiddlywiki The <<.op cycle>> operator requires at least one parameter. ``` -[toggle[<titles>],[step-size]] +[cycle[<titles>],[step-size]] ``` * ''titles'' : a title list to toggle in the input list cyclically. If no title from the parameter is present in the input, the first title is added. If a title from the parameter is present in the input, it is replaced with the next title from the parameter. Note that all titles specified in this parameter should be unique. * ''step-size'': (optional). Defaults to 1. Specifies the number of steps in the parameter list to move each time. Can be a negative number. From d2f87d6200149876a31aa784f38b4e4bfb7a7dbe Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 21 Nov 2020 18:19:52 +0100 Subject: [PATCH 0996/2376] Reveal widget allow re-positioning (#5087) * Jeremy's original version of the event widget * Renamed to eventcatcher, added modifier key support and mouse button support as variables * Reveal widget: update popup position when state tiddler updates --- core/modules/widgets/reveal.js | 11 +++++++++++ editions/tw5.com/tiddlers/widgets/RevealWidget.tid | 5 +++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index ebbf490b2..e6334dff2 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -70,6 +70,10 @@ RevealWidget.prototype.positionPopup = function(domNode) { left = this.popup.left + this.popup.width; top = this.popup.top + this.popup.height - domNode.offsetHeight; break; + case "belowright": + left = this.popup.left + this.popup.width; + top = this.popup.top + this.popup.height; + break; case "right": left = this.popup.left + this.popup.width; top = this.popup.top; @@ -78,6 +82,10 @@ RevealWidget.prototype.positionPopup = function(domNode) { left = this.popup.left + this.popup.width - domNode.offsetWidth; top = this.popup.top + this.popup.height; break; + case "aboveleft": + left = this.popup.left - domNode.offsetWidth; + top = this.popup.top - domNode.offsetHeight; + break; default: // Below left = this.popup.left; top = this.popup.top + this.popup.height; @@ -109,6 +117,7 @@ RevealWidget.prototype.execute = function() { this.retain = this.getAttribute("retain","no"); this.openAnimation = this.animate === "no" ? undefined : "open"; this.closeAnimation = this.animate === "no" ? undefined : "close"; + this.updatePopupPosition = this.getAttribute("updatePopupPosition","no") === "yes"; // Compute the title of the state tiddler and read it this.stateTiddlerTitle = this.state; this.stateTitle = this.getAttribute("stateTitle"); @@ -212,6 +221,8 @@ RevealWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } + } else if(this.type === "popup" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) { + this.positionPopup(this.domNodes[0]); } return this.refreshChildren(changedTiddlers); } diff --git a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid index 4716648a3..7ff3747d3 100644 --- a/editions/tw5.com/tiddlers/widgets/RevealWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RevealWidget.tid @@ -1,7 +1,7 @@ caption: reveal created: 20131024141900000 jeremy: tiddlywiki -modified: 20190910150520583 +modified: 20201121100908827 tags: Widgets title: RevealWidget type: text/vnd.tiddlywiki @@ -33,11 +33,12 @@ The content of the `<$reveal>` widget is displayed according to the rules given |text |The text to match when the type is ''match'', ''nomatch'', ''lt'', ''gt'', ''lteq'' or ''gteq'' | |class |An optional CSS class name to be assigned to the HTML element<br/>» Set to `tc-popup-keep` to make a popup "sticky", so it won't close when you click inside of it| |style |An optional CSS style attribute to be assigned to the HTML element | -|position |The position used for the popup when the type is ''popup''. Can be ''left'', ''above'', ''aboveright'', ''right'', ''belowleft'' or ''below'' | +|position |The position used for the popup when the type is ''popup''. Can be ''left'', ''above'', ''aboveleft'', ''aboveright'', ''right'', ''belowleft'', ''belowright'' or ''below'' | |positionAllowNegative |Set to "yes" to prevent computed popup positions from being clamped to be above zero | |default |Default value to use when the state tiddler is missing | |animate |Set to "yes" to animate opening and closure (defaults to "no"; requires "retain" to be set to "yes") | |retain |Set to "yes" to force the content to be retained even when hidden (defaults to "no") | +|updatePopupPosition|<<.from-version "5.1.23">>Set to "yes" to update the popup position when the state tiddler is updated (defaults to "no")| <<.tip """<$macrocall $name=".from-version" version="5.1.18"/> <$macrocall $name=".attr" _="stateTitle"/>, <$macrocall $name=".attr" _="stateField"/> and <$macrocall $name=".attr" _="stateIndex"/> attributes allow specifying Tiddler states ''directly'', without interpreting them as [[TextReferences|TextReference]]. This is useful for edge-cases where titles may contain characters that are used to denote Tiddler fields or indices (`!!`, `##`)""">> From 51ca14861e12e7bd2363a75e403857774b3560dc Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 22 Nov 2020 21:43:36 +0100 Subject: [PATCH 0997/2376] Fixed bug with default value in lookup operator (#5088) * Fixed bug with default value in lookup operator * Fixed test for lookup operator with default --- core/modules/filters/lookup.js | 2 +- editions/test/tiddlers/tests/test-filters.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/filters/lookup.js b/core/modules/filters/lookup.js index 3ab7f42e6..49c8e205a 100644 --- a/core/modules/filters/lookup.js +++ b/core/modules/filters/lookup.js @@ -22,7 +22,7 @@ Export our filter function exports.lookup = function(source,operator,options) { var results = []; source(function(tiddler,title) { - results.push(options.wiki.getTiddlerText(operator.operand + title) || options.wiki.getTiddlerText(operator.operand + operator.suffix)); + results.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix); }); return results; }; diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index dedfd5179..6649af4e3 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -207,7 +207,7 @@ function runTests(wiki) { it("should handle the lookup operator", function() { expect(wiki.filterTiddlers("Six Seventh 8 +[lookup[Tiddler]]").join(",")).toBe("Missing inaction from TiddlerOne,,Tidd"); - expect(wiki.filterTiddlers("Six Seventh 8 +[lookup:8[Tiddler]]").join(",")).toBe("Missing inaction from TiddlerOne,Tidd,Tidd"); + expect(wiki.filterTiddlers("Six Seventh 8 +[lookup:8[Tiddler]]").join(",")).toBe("Missing inaction from TiddlerOne,8,Tidd"); }); it("should retrieve shadow tiddlers", function() { From fa63ac5d1ee3306d2572c94e38f23f5bc59adfaf Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 22 Nov 2020 21:47:12 +0100 Subject: [PATCH 0998/2376] Add: Eventcatcher widget (#5086) * Jeremy's original version of the event widget * Renamed to eventcatcher, added modifier key support and mouse button support as variables * Allow updating classname without re-rendering entire widget * Handle tag attribute in refresh handler * Improve handling for mouse button variable * Fix typo in refresh handler * Added variables for position of selected node and position of event relative to selected node and catcher node --- core/modules/widgets/eventcatcher.js | 146 +++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 core/modules/widgets/eventcatcher.js diff --git a/core/modules/widgets/eventcatcher.js b/core/modules/widgets/eventcatcher.js new file mode 100644 index 000000000..c0d691f5e --- /dev/null +++ b/core/modules/widgets/eventcatcher.js @@ -0,0 +1,146 @@ +/*\ +title: $:/core/modules/widgets/eventcatcher.js +type: application/javascript +module-type: widget + +Event handler widget + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var EventWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +EventWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +EventWidget.prototype.render = function(parent,nextSibling) { + var self = this; + // Remember parent + this.parentDomNode = parent; + // Compute attributes and execute state + this.computeAttributes(); + this.execute(); + // Create element + var tag = this.parseTreeNode.isBlock ? "div" : "span"; + if(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) { + tag = this.elementTag; + } + var domNode = this.document.createElement(tag); + this.domNode = domNode; + // Assign classes + this.assignDomNodeClasses(); + // Add our event handler + domNode.addEventListener(this.type,function(event) { + var selector = self.getAttribute("selector"), + actions = self.getAttribute("actions"), + selectedNode = event.target, + selectedNodeRect, + catcherNodeRect, + variables = {}; + if(selector) { + // Search ancestors for a node that matches the selector + while(!selectedNode.matches(selector) && selectedNode !== domNode) { + selectedNode = selectedNode.parentNode; + } + // If we found one, copy the attributes as variables, otherwise exit + if(selectedNode.matches(selector)) { + $tw.utils.each(selectedNode.attributes,function(attribute) { + variables["dom-" + attribute.name] = attribute.value; + }); + //Add a variable with a popup coordinate string for the selected node + variables["tv-popup-coords"] = "(" + selectedNode.offsetLeft + "," + selectedNode.offsetTop +"," + selectedNode.offsetWidth + "," + selectedNode.offsetHeight + ")"; + + //Add variables for offset of selected node + variables["tv-selectednode-posx"] = selectedNode.offsetLeft; + variables["tv-selectednode-posy"] = selectedNode.offsetTop; + variables["tv-selectednode-width"] = selectedNode.offsetWidth; + variables["tv-selectednode-height"] = selectedNode.offsetHeight; + + //Add variables for event X and Y position relative to selected node + selectedNodeRect = selectedNode.getBoundingClientRect(); + variables["event-fromselected-posx"] = event.clientX - selectedNodeRect.left; + variables["event-fromselected-posy"] = event.clientY - selectedNodeRect.top; + + //Add variables for event X and Y position relative to event catcher node + catcherNodeRect = self.domNode.getBoundingClientRect(); + variables["event-fromcatcher-posx"] = event.clientX - catcherNodeRect.left; + variables["event-fromcatcher-posy"] = event.clientY - catcherNodeRect.top; + } else { + return false; + } + } + // Execute our actions with the variables + if(actions) { + // Add a variable for the modifier key + variables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event); + // Add a variable for the mouse button + if("button" in event) { + if(event.button === 0) { + variables["event-mousebutton"] = "left"; + } else if(event.button === 1) { + variables["event-mousebutton"] = "middle"; + } else if(event.button === 2) { + variables["event-mousebutton"] = "right"; + } + } + self.invokeActionString(actions,self,event,variables); + event.preventDefault(); + event.stopPropagation(); + return true; + } + return false; + },false); + // Insert element + parent.insertBefore(domNode,nextSibling); + this.renderChildren(domNode,null); + this.domNodes.push(domNode); +}; + +/* +Compute the internal state of the widget +*/ +EventWidget.prototype.execute = function() { + var self = this; + // Get attributes that require a refresh on change + this.type = this.getAttribute("type"); + this.elementTag = this.getAttribute("tag"); + // Make child widgets + this.makeChildWidgets(); +}; + +EventWidget.prototype.assignDomNodeClasses = function() { + var classes = this.getAttribute("class","").split(" "); + classes.push("tc-eventcatcher"); + this.domNode.className = classes.join(" "); +}; + +/* +Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering +*/ +EventWidget.prototype.refresh = function(changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if(changedAttributes.type || changedAttributes["tag"]) { + this.refreshSelf(); + return true; + } else if(changedAttributes["class"]) { + this.assignDomNodeClasses(); + } + return this.refreshChildren(changedTiddlers); +}; + +exports.eventcatcher = EventWidget; + +})(); \ No newline at end of file From 530b4308e325cd6b08e0ed1f594a0eda9e7cc255 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 22 Nov 2020 22:12:19 +0100 Subject: [PATCH 0999/2376] Make type input field min-width the highest character length of selectable types (#5090) * Make type input field min-width the highest character length of selectable types * Update base.tid * Update base.tid --- themes/tiddlywiki/vanilla/base.tid | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 2b3d427f1..bc74494bd 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -47,6 +47,20 @@ $else$ </$reveal> \end +\define set-type-selector-min-width() +<$set name="typeLength" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}> + + .tc-type-selector-dropdown-wrapper { + min-width: calc(<<typeLength>>ch + 4em); + } + + .tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor { + min-width: <<typeLength>>ch; + } + +</$set> +\end + \rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock /* @@ -1371,6 +1385,8 @@ html body.tc-body.tc-single-tiddler-window { display: inline-block; } +<<set-type-selector-min-width>> + .tc-edit-tags { border: 1px solid <<colour tiddler-editor-border>>; padding: 4px 8px 4px 8px; From 3c195b05cb1dca2eec5e6b8c059f08f4119c9bb1 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sun, 22 Nov 2020 22:13:24 +0100 Subject: [PATCH 1000/2376] Button and Droppable widgets: improve refresh handling for classes (#5091) * Button and Droppable widgets: improve refesh handling for classes * Added comment regarding handling of class attribute --- core/modules/widgets/button.js | 46 ++++++++++++++++++------------- core/modules/widgets/droppable.js | 23 ++++++++++------ 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 0294ac0ba..3ece52371 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -27,33 +27,22 @@ ButtonWidget.prototype = new Widget(); Render this widget into the DOM */ ButtonWidget.prototype.render = function(parent,nextSibling) { - var self = this; + var self = this, + tag = "button", + domNode; // Remember parent this.parentDomNode = parent; // Compute attributes and execute state this.computeAttributes(); this.execute(); // Create element - var tag = "button"; if(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) { tag = this.buttonTag; } - var domNode = this.document.createElement(tag); + domNode = this.document.createElement(tag); + this.domNode = domNode; // Assign classes - var classes = this["class"].split(" ") || [], - isPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp(); - if(this.selectedClass) { - if((this.set || this.setTitle) && this.setTo && this.isSelected()) { - $tw.utils.pushTop(classes,this.selectedClass.split(" ")); - } - if(isPoppedUp) { - $tw.utils.pushTop(classes,this.selectedClass.split(" ")); - } - } - if(isPoppedUp) { - $tw.utils.pushTop(classes,"tc-popup-handle"); - } - domNode.className = classes.join(" "); + this.assignDomNodeClasses(); // Assign other attributes if(this.style) { domNode.setAttribute("style",this.style); @@ -200,10 +189,10 @@ ButtonWidget.prototype.execute = function() { this.setTo = this.getAttribute("setTo"); this.popup = this.getAttribute("popup"); this.hover = this.getAttribute("hover"); - this["class"] = this.getAttribute("class",""); this["aria-label"] = this.getAttribute("aria-label"); this.tooltip = this.getAttribute("tooltip"); this.style = this.getAttribute("style"); + // Class attribute is handled in assignDomNodeClasses() this.selectedClass = this.getAttribute("selectedClass"); this.defaultSetValue = this.getAttribute("default",""); this.buttonTag = this.getAttribute("tag"); @@ -219,14 +208,33 @@ ButtonWidget.prototype.execute = function() { this.makeChildWidgets(); }; +ButtonWidget.prototype.assignDomNodeClasses = function() { + var classes = this.getAttribute("class","").split(" "), + isPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp(); + if(this.selectedClass) { + if((this.set || this.setTitle) && this.setTo && this.isSelected()) { + $tw.utils.pushTop(classes,this.selectedClass.split(" ")); + } + if(isPoppedUp) { + $tw.utils.pushTop(classes,this.selectedClass.split(" ")); + } + } + if(isPoppedUp) { + $tw.utils.pushTop(classes,"tc-popup-handle"); + } + this.domNode.className = classes.join(" "); +} + /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ ButtonWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes["class"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) { + if(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) { this.refreshSelf(); return true; + } else if(changedAttributes["class"]) { + this.assignDomNodeClasses(); } return this.refreshChildren(changedTiddlers); }; diff --git a/core/modules/widgets/droppable.js b/core/modules/widgets/droppable.js index e6678527b..87a130f39 100644 --- a/core/modules/widgets/droppable.js +++ b/core/modules/widgets/droppable.js @@ -27,21 +27,21 @@ DroppableWidget.prototype = new Widget(); Render this widget into the DOM */ DroppableWidget.prototype.render = function(parent,nextSibling) { - var self = this; + var self = this, + tag = this.parseTreeNode.isBlock ? "div" : "span", + domNode; // Remember parent this.parentDomNode = parent; // Compute attributes and execute state this.computeAttributes(); this.execute(); - var tag = this.parseTreeNode.isBlock ? "div" : "span"; if(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) { tag = this.droppableTag; } // Create element and assign classes - var domNode = this.document.createElement(tag), - classes = (this.droppableClass || "").split(" "); - classes.push("tc-droppable"); - domNode.className = classes.join(" "); + domNode = this.document.createElement(tag); + this.domNode = domNode; + this.assignDomNodeClasses(); // Add event handlers if(this.droppableEnable) { $tw.utils.addEventListeners(domNode,[ @@ -144,20 +144,27 @@ DroppableWidget.prototype.execute = function() { this.droppableActions = this.getAttribute("actions"); this.droppableEffect = this.getAttribute("effect","copy"); this.droppableTag = this.getAttribute("tag"); - this.droppableClass = this.getAttribute("class"); this.droppableEnable = (this.getAttribute("enable") || "yes") === "yes"; // Make child widgets this.makeChildWidgets(); }; +DroppableWidget.prototype.assignDomNodeClasses = function() { + var classes = this.getAttribute("class","").split(" "); + classes.push("tc-droppable"); + this.domNode.className = classes.join(" "); +}; + /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ DroppableWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes["class"] || changedAttributes.tag || changedAttributes.enable) { + if(changedAttributes.tag || changedAttributes.enable) { this.refreshSelf(); return true; + } else if(changedAttributes["class"]) { + this.assignDomNodeClasses(); } return this.refreshChildren(changedTiddlers); }; From 8c4d67ba2bd6810cc5f6ce3963da205b951ba635 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 22 Nov 2020 22:18:34 +0100 Subject: [PATCH 1001/2376] Add light "DesertSand" palette - a desert-sandy palette (#5092) * Add light "DesertSand" palette - a desert-sandy palette * Update DesertSand.tid * Update DesertSand.tid --- core/palettes/DesertSand.tid | 140 +++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 core/palettes/DesertSand.tid diff --git a/core/palettes/DesertSand.tid b/core/palettes/DesertSand.tid new file mode 100644 index 000000000..1f07e4d55 --- /dev/null +++ b/core/palettes/DesertSand.tid @@ -0,0 +1,140 @@ +title: $:/palettes/DesertSand +tags: $:/tags/Palette +name: Desert Sand +description: A desert sand palette +type: application/x-tiddler-dictionary + +alert-background: #ffe476 +alert-border: #b99e2f +alert-highlight: #881122 +alert-muted-foreground: #b99e2f +background: #E9E0C7 +blockquote-bar: <<colour muted-foreground>> +button-background: #BAB29C +button-foreground: <<colour foreground>> +button-border: transparent +code-background: #F3EDDF +code-border: #C3BAA1 +code-foreground: #ab3250 +diff-delete-background: #bd8b8b +diff-delete-foreground: <<colour foreground>> +diff-equal-background: +diff-equal-foreground: <<colour foreground>> +diff-insert-background: #91c093 +diff-insert-foreground: <<colour foreground>> +diff-invisible-background: +diff-invisible-foreground: <<colour muted-foreground>> +dirty-indicator: #ad3434 +download-background: #6ca16c +download-foreground: <<colour background>> +dragger-background: <<colour foreground>> +dragger-foreground: <<colour background>> +dropdown-background: <<colour background>> +dropdown-border: <<colour muted-foreground>> +dropdown-tab-background-selected: #E9E0C7 +dropdown-tab-background: #BAB29C +dropzone-background: rgba(0,200,0,0.7) +external-link-background-hover: inherit +external-link-background-visited: inherit +external-link-background: inherit +external-link-foreground-hover: inherit +external-link-foreground-visited: #313163 +external-link-foreground: #555592 +foreground: #2D2A23 +menubar-background: #CDC2A6 +menubar-foreground: #5A5446 +message-background: #ECE5CF +message-border: #D6CBAA +message-foreground: #5f6e7d +modal-backdrop: <<colour foreground>> +modal-background: <<colour background>> +modal-border: #8A8885 +modal-footer-background: #CDC2A6 +modal-footer-border: #9D998E +modal-header-border: #9D998E +muted-foreground: #9D998E +notification-background: #F0E9D7 +notification-border: #939189 +page-background: #e0d3af +pre-background: #D6CBAA +pre-border: #CDC2A6 +primary: #5B6F55 +selection-background: <<colour foreground>> +selection-foreground: <<colour background>> +select-tag-background: #F0E9D7 +select-tag-foreground: #2D2A23 +sidebar-button-foreground: <<colour foreground>> +sidebar-controls-foreground-hover: #2D2A23 +sidebar-controls-foreground: #867F69 +sidebar-foreground-shadow: transparent +sidebar-foreground: #867F69 +sidebar-muted-foreground-hover: #706A58 +sidebar-muted-foreground: #B3A98C +sidebar-tab-background-selected: #C3BAA1 +sidebar-tab-background: #A6A193 +sidebar-tab-border-selected: #C3BAA1 +sidebar-tab-border: #C3BAA1 +sidebar-tab-divider: #CDC2A6 +sidebar-tab-foreground-selected: +sidebar-tab-foreground: #2D2A23 +sidebar-tiddler-link-foreground-hover: #433F35 +sidebar-tiddler-link-foreground: #706A58 +site-title-foreground: <<colour tiddler-title-foreground>> +static-alert-foreground: #A6A193 +tab-background-selected: #E9E0C7 +tab-background: #A6A193 +tab-border-selected: #C3BAA1 +tab-border: #C3BAA1 +tab-divider: #CDC2A6 +tab-foreground-selected: <<colour tab-foreground>> +tab-foreground: #2D2A23 +table-border: #9D998E +table-footer-background: #8A8885 +table-header-background: #B0AA98 +tag-background: #706A58 +tag-foreground: #E3D7B7 +tiddler-background: <<colour background>> +tiddler-border: <<colour background>> +tiddler-controls-foreground-hover: #9D947B +tiddler-controls-foreground-selected: #706A58 +tiddler-controls-foreground: #C3BAA1 +tiddler-editor-background: #C3BAA1 +tiddler-editor-border-image: #A6A193 +tiddler-editor-border: #A6A193 +tiddler-editor-fields-even: #D6CBAA +tiddler-editor-fields-odd: #C3BAA1 +tiddler-info-background: #E3D7B7 +tiddler-info-border: #BAB29C +tiddler-info-tab-background: #E9E0C7 +tiddler-link-background: <<colour background>> +tiddler-link-foreground: <<colour primary>> +tiddler-subtitle-foreground: #867F69 +tiddler-title-foreground: #374464 +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +toolbar-info-button: +toolbar-edit-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-cancel-button: +toolbar-done-button: +untagged-background: #8A8885 +very-muted-foreground: #CDC2A6 +wikilist-background: <<colour page-background>> +wikilist-item: #CDC2A6 +wikilist-info: #161512 +wikilist-title: #433F35 +wikilist-title-svg: <<colour wikilist-title>> +wikilist-url: #706A58 +wikilist-button-open: #7db66a +wikilist-button-open-hover: #56a556 +wikilist-button-reveal: #5a6c9e +wikilist-button-reveal-hover: #454591 +wikilist-button-remove: #bc5972 +wikilist-button-remove-hover: #814040 +wikilist-toolbar-background: #CDC2A6 +wikilist-toolbar-foreground: #2D2A23 +wikilist-droplink-dragover: rgba(255,192,192,0.5) +wikilist-button-background: #A6A193 +wikilist-button-foreground: #161512 From 60850ee69b38c0216e684ed43dc8bfb0bbfb82e9 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Mon, 23 Nov 2020 17:24:37 +0100 Subject: [PATCH 1002/2376] Update German Language (#5096) * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * Don't override browser selection colours by default Reverts some of #4590 * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * add a new-line before the log text to increase readability of the test output * make eslint, jslint happy * it shouldn't be there * fremove this file from my PRs * Update German Language * some typos Co-authored-by: jeremy@jermolene.com <jeremy@jermolene.com> --- languages/de-DE/ControlPanel.multids | 7 +++++++ languages/de-DE/CoreReadMe.tid | 2 +- languages/de-DE/EditTemplate.multids | 2 ++ languages/de-DE/Help/help.tid | 2 +- languages/de-DE/Help/import.tid | 2 +- languages/de-DE/Help/rendertiddlers.tid | 4 ++-- languages/de-DE/Import.multids | 19 ++++++++++++------- languages/de-DE/Misc.multids | 14 +++++++++++++- languages/de-DE/NewJournalTags.tid | 3 ++- 9 files changed, 41 insertions(+), 14 deletions(-) diff --git a/languages/de-DE/ControlPanel.multids b/languages/de-DE/ControlPanel.multids index 205372f86..f7c9f46f4 100644 --- a/languages/de-DE/ControlPanel.multids +++ b/languages/de-DE/ControlPanel.multids @@ -70,6 +70,7 @@ Plugins/Caption: Plugins Plugins/Disable/Caption: deaktivieren Plugins/Disable/Hint: Deaktivieren Sie dieses Plugin beim nächsten Laden der Seite. Plugins/Disabled/Status: (deaktiviert) +Plugins/Downgrade/Caption: herabstufen Plugins/Empty/Hint: keine Plugins/Enable/Caption: aktivieren Plugins/Enable/Hint: Aktivieren Sie dieses Plugin beim nächsten Laden der Seite. @@ -87,6 +88,11 @@ Plugins/Plugins/Hint: Erweiterungen Plugins/Reinstall/Caption: erneut installieren Plugins/Themes/Caption: Themes Plugins/Themes/Hint: Theme Erweiterungen +Plugins/Update/Caption: aktualisieren +Plugins/Updates/Caption: Aktualisieren +Plugins/Updates/Hint: Verfügbare Erweiterungen zu bereits installierten "Plugins" +Plugins/Updates/UpdateAll/Caption: Aktualisiere <<update-count>> "Plugins" +Plugins/SubPluginPrompt: Mit <<count>> "sub-plugins" verfügbar Saving/Caption: Speichern Saving/DownloadSaver/AutoSave/Description: Erlaube automatisches Speichern für den "Download Saver" Saving/DownloadSaver/AutoSave/Hint: Erlaube automatisches Speichern für den "Download Saver" @@ -111,6 +117,7 @@ Saving/GitService/Gitea/Caption: Gitea Saver Saving/GitService/Gitea/Password: Persönlicher "Zugriffs-Token" (siehe: Gitea’s web Seite: `Settings | Applications | Generate New Token`) Saving/TiddlySpot/Advanced/Heading: Erweiterte Einstellungen Saving/TiddlySpot/BackupDir: Verzeichnis für das "Backup" +Saving/TiddlySpot/ControlPanel: ~TiddlySpot Control Panel Saving/TiddlySpot/Backups: "Backups" Saving/TiddlySpot/Caption: Speichern auf ~TiddlySpot Saving/TiddlySpot/Description: Diese Einstellungen sind nur für http://tiddlyspot.com und kompatible Server aktiv! diff --git a/languages/de-DE/CoreReadMe.tid b/languages/de-DE/CoreReadMe.tid index 7cee41961..2e5b6ab2c 100644 --- a/languages/de-DE/CoreReadMe.tid +++ b/languages/de-DE/CoreReadMe.tid @@ -4,5 +4,5 @@ Dieses Plugin enthält die TiddlyWiki Basis Komponenten, bestehend aus: * JavaScript Code Module. * Piktogramme (icons). -* Vorlagen, die benötigt werden um die TiddlyWiki Oberfläche zu erstellen. +* Vorlagen, die benötigt werden um die ~TiddlyWiki Oberfläche zu erstellen. * British English (''en-GB'') übersetzbare Texte, die von der TW Basis Software verwendet werden. diff --git a/languages/de-DE/EditTemplate.multids b/languages/de-DE/EditTemplate.multids index 17c4f8936..6fafba055 100644 --- a/languages/de-DE/EditTemplate.multids +++ b/languages/de-DE/EditTemplate.multids @@ -19,6 +19,8 @@ Shadow/OverriddenWarning: Dies ist ein veränderter Tiddler. Um zur Standardvers Tags/Add/Button: ok Tags/Add/Button/Hint: Erzeuge einen neuen Tag Tags/Add/Placeholder: Neuer Tag +Tags/ClearInput/Caption: lösche Eingabefeld +Tags/ClearInput/Hint: Lösche Tag Eingabefeld Tags/Dropdown/Caption: Tag Liste Tags/Dropdown/Hint: Tag Liste anzeigen Title/BadCharacterWarning: Warnung: Folgende Zeichen im Titel können zu Problemen führen: <<bad-chars>> diff --git a/languages/de-DE/Help/help.tid b/languages/de-DE/Help/help.tid index 9d76aced5..44b1e0ca6 100644 --- a/languages/de-DE/Help/help.tid +++ b/languages/de-DE/Help/help.tid @@ -1,7 +1,7 @@ title: $:/language/Help/help description: Anzeige der Hilfe für die TiddlyWiki Befehle. -Anzeige der Hilfe für die TiddlyWiki Befehle. +Anzeige der Hilfe für die ~TiddlyWiki Befehle. Beispiel: diff --git a/languages/de-DE/Help/import.tid b/languages/de-DE/Help/import.tid index 606882826..cdf8d81fb 100644 --- a/languages/de-DE/Help/import.tid +++ b/languages/de-DE/Help/import.tid @@ -3,7 +3,7 @@ description: Importiert mehrere Tiddler aus einer Datei Dieser Befehl importiert / extrahiert Tiddler aus folgenden Dateien: -* TiddlyWiki `*.html` +* ~TiddlyWiki `*.html` * `*.tiddler` * `*.tid` * `*.json` diff --git a/languages/de-DE/Help/rendertiddlers.tid b/languages/de-DE/Help/rendertiddlers.tid index 3c7449bd8..7f3ef4d83 100644 --- a/languages/de-DE/Help/rendertiddlers.tid +++ b/languages/de-DE/Help/rendertiddlers.tid @@ -9,13 +9,13 @@ description: Gefilterte Ausgabe von Tiddlern, in einem spezifizierten Format. Gefilterte Ausgabe mehrerer Tiddler, in ein angegebenes Dateiformat (standard: `text/html`) mit spezifischer Erweiterung (Standard: `.html`). ``` ---rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] ["noclean"] +--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] ["noclean"] ``` Beispiel: ``` ---rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain +--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain ``` Standardmäßig ist das `output` Verzeichnis ein Unterverzeichnis im `edition` Verzeichnis. Der `--output` Befehl kann verwendet werden, um ein anderes Verzeichnis auszuwählen. diff --git a/languages/de-DE/Import.multids b/languages/de-DE/Import.multids index be3987cc7..e94d255c1 100644 --- a/languages/de-DE/Import.multids +++ b/languages/de-DE/Import.multids @@ -13,11 +13,16 @@ Listing/Preview/TextRaw: Text - roh Listing/Preview/Fields: Felder Listing/Preview/Diff: Diff - Text Listing/Preview/DiffFields: Diff - Felder -Upgrader/Plugins/Suppressed/Incompatible: Unterdrückte, inkompatible oder veraltete "plugins" +Listing/Rename/Tooltip: Tiddler vorm Importieren umbenennen +Listing/Rename/Prompt: Umbenennen in: +Listing/Rename/ConfirmRename : Tiddler umbenennen +Listing/Rename/CancelRename : Abbrechen +Listing/Rename/OverwriteWarning: Ein Tiddler mit diesem Titel existiert bereits. +Upgrader/Plugins/Suppressed/Incompatible: Unterdrückte, inkompatible oder veraltete "plugins". Upgrader/Plugins/Suppressed/Version: Einige "plugins" weden unterdrückt! Importierte plugins: <<incoming>> sind älter als existierende: <<existing>>. -Upgrader/Plugins/Upgraded: Aktualisieren der plugins von: <<incoming>> nach: <<upgraded>> -Upgrader/State/Suppressed: Unterdrückte temporäre Status Tiddler -Upgrader/System/Suppressed: Unterdrückte "System Tiddler" -Upgrader/System/Warning: "Core Modul Tiddler" -Upgrader/System/Alert: Sie sind dabei einen Tiddler zu importieren, der einen "Core Tiddler" überschreibt. Diese Aktion wird nicht empfohlen! Das System kann instabil werden -Upgrader/ThemeTweaks/Created: Migrieren der "theme tweaks" von: <$text text=<<from>>/> +Upgrader/Plugins/Upgraded: Aktualisieren der plugins von: <<incoming>> nach: <<upgraded>>. +Upgrader/State/Suppressed: Unterdrückte temporäre Status Tiddler. +Upgrader/System/Suppressed: Unterdrückte "System Tiddler". +Upgrader/System/Warning: "Core Modul Tiddler". +Upgrader/System/Alert: Sie sind dabei einen Tiddler zu importieren, der einen "Core Tiddler" überschreibt. Diese Aktion wird nicht empfohlen! Das System kann instabil werden. +Upgrader/ThemeTweaks/Created: Migrieren der "theme tweaks" von: <$text text=<<from>>/>. diff --git a/languages/de-DE/Misc.multids b/languages/de-DE/Misc.multids index eb8962857..936a1fc0b 100644 --- a/languages/de-DE/Misc.multids +++ b/languages/de-DE/Misc.multids @@ -10,6 +10,7 @@ ConfirmCancelTiddler: Wollen Sie die Änderungen im Tiddler: "<$text text=<<titl ConfirmDeleteTiddler: Wollen Sie den Tiddler: "<$text text=<<title>>/>" löschen? ConfirmOverwriteTiddler: Tiddler: "<$text text=<<title>>/>" existiert! OK überschreibt den tiddler! ConfirmEditShadowTiddler: Sie sind dabei, einen Schatten-Tiddler zu verändern. Zukünftige, automatische Anpassungen werden dadurch unterdrückt. Sie können Ihre Änderungen rückgängig machen, indem Sie diesen Tiddler wieder löschen. Wollen Sie den Tiddler: "<$text text=<<title>>/>" ändern? +ConfirmAction: Möchten Sie weitermachen? Count: Anzahl DefaultNewTiddlerTitle: Neuer Tiddler Diffs/CountMessage: <<diff-count>> Unterschied(e) @@ -26,7 +27,9 @@ Error/Caption: Fehler Error/EditConflict: Datei auf Server verändert Error/Filter: Filter Fehler Error/FilterSyntax: Syntax Fehler im Filter-Ausdruck +Error/FilterRunPrefix: Filter Fehler: Unbekanntes Prefix für Filter lauf Error/IsFilterOperator: Filter Fehler: Unbekannter Operand für den 'is' Filter Operator +Error/FormatFilterOperator: Filter Fehler: Unbekannter Operand für den 'format' Filter Operator Error/LoadingPluginLibrary: Fehler beim Laden der "plugin library" Error/NetworkErrorAlert: `<h2>''Netzwerk Fehler''</h2>Es scheint, die Verbindung zum Server ist ausgefallen. Das weist auf Probleme mit der Netzwerkverbindung hin. Bitte versuchen Sie die Verbingung wider herzustellen, bevor Sie weitermachen.<br><br>''Nicht gespeicherte Änderungen werden automatich synchronisiert, sobald die Verbindung wider hergestellt ist. Error/RecursiveTransclusion: Recursive Transclusion: Fehler im "transclude widget" @@ -62,6 +65,15 @@ OfficialPluginLibrary: Offizielles ~TiddlyWiki Plugin-Verzeichnis OfficialPluginLibrary/Hint: Offizielles ~TiddlyWiki Plugin-Verzeichnis auf tiddlywiki.com. Plugin, Themes und Sprach Dateien werden vom "core team" gewartet. PluginReloadWarning: Das Wiki muss gespeichert {{$:/core/ui/Buttons/save-wiki}} und neu gladen {{$:/core/ui/Buttons/refresh}} werden, damit die ~JavaScript Plugins ausgeführt werden. RecentChanges/DateFormat: YYYY MMM DD +Shortcuts/Input/AdvancedSearch/Hint: Öffne den ~AdvancedSearch Tiddler vom "Suchmenü" aus +Shortcuts/Input/Accept/Hint: Wähle das selektierte Element +Shortcuts/Input/AcceptVariant/Hint: Wähle das selektierte Element (Variante) +Shortcuts/Input/Cancel/Hint: Lösche das Eingabefeld +Shortcuts/Input/Down/Hint: Gehe zum nächsten Element +Shortcuts/Input/Up/Hint: Gehe zum vorherigen Element +Shortcuts/Input/Tab-Left/Hint: Gehe zum vorherigen Tab +Shortcuts/Input/Tab-Right/Hint: Gehe zum nächsten Tab +Shortcuts/SidebarLayout/Hint: Das Layout des rechten Menüs ändern SystemTiddler/Tooltip: Das ist ein System-Tiddler SystemTiddlers/Include/Prompt: System-Tiddler einschließen TagManager/Colour/Heading: Farbe @@ -71,5 +83,5 @@ TagManager/Icons/None: Keine TagManager/Info/Heading: Info TagManager/Tag/Heading: Tag Tiddler/DateFormat: DDth MMM YYYY um 0hh:0mm -UnsavedChangesWarning: TiddlyWiki wurde geändert, aber noch nicht gespeichert! +UnsavedChangesWarning: ~TiddlyWiki wurde geändert, aber noch nicht gespeichert! Yes: Ja diff --git a/languages/de-DE/NewJournalTags.tid b/languages/de-DE/NewJournalTags.tid index 0534cba33..eec29622f 100644 --- a/languages/de-DE/NewJournalTags.tid +++ b/languages/de-DE/NewJournalTags.tid @@ -1,2 +1,3 @@ title: $:/config/NewJournal/Tags -tags: Journal + +Journal \ No newline at end of file From 72b32946aa1ad25e93123bc6f1c2c1aa959b95d9 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 17:59:48 +0100 Subject: [PATCH 1003/2376] Small adjustments for DesertSand palette (#5098) * Small adjustments for DesertSand palette * Update DesertSand.tid --- core/palettes/DesertSand.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/palettes/DesertSand.tid b/core/palettes/DesertSand.tid index 1f07e4d55..ba0581095 100644 --- a/core/palettes/DesertSand.tid +++ b/core/palettes/DesertSand.tid @@ -59,8 +59,8 @@ page-background: #e0d3af pre-background: #D6CBAA pre-border: #CDC2A6 primary: #5B6F55 -selection-background: <<colour foreground>> -selection-foreground: <<colour background>> +selection-background: #9D947B +selection-foreground: <<colour foreground>> select-tag-background: #F0E9D7 select-tag-foreground: #2D2A23 sidebar-button-foreground: <<colour foreground>> @@ -70,7 +70,7 @@ sidebar-foreground-shadow: transparent sidebar-foreground: #867F69 sidebar-muted-foreground-hover: #706A58 sidebar-muted-foreground: #B3A98C -sidebar-tab-background-selected: #C3BAA1 +sidebar-tab-background-selected: #e0d3af sidebar-tab-background: #A6A193 sidebar-tab-border-selected: #C3BAA1 sidebar-tab-border: #C3BAA1 @@ -98,7 +98,7 @@ tiddler-border: <<colour background>> tiddler-controls-foreground-hover: #9D947B tiddler-controls-foreground-selected: #706A58 tiddler-controls-foreground: #C3BAA1 -tiddler-editor-background: #C3BAA1 +tiddler-editor-background: #E9E0C7 tiddler-editor-border-image: #A6A193 tiddler-editor-border: #A6A193 tiddler-editor-fields-even: #D6CBAA From aa6f152d35f0e71e32db1d3052bbb435100c942f Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 23 Nov 2020 18:06:24 +0100 Subject: [PATCH 1004/2376] Add Switcher modal (#5089) * Alternative switcher using a parameter via tm-show-switcher * Add CSS class for centered modals * Changed keyboardshortcut and removed transition CSS * Resolved wording issues --- core/language/en-GB/Misc.multids | 7 +++++++ core/modules/startup/rootwidget.js | 3 +++ core/ui/KeyboardShortcuts/switcher.tid | 5 +++++ core/ui/LayoutSwitcher.tid | 16 ++++++++++++++++ core/ui/PageTemplate.tid | 2 ++ core/ui/SwitcherModal.tid | 11 +++++++++++ core/wiki/config/ShortcutInfo.multids | 1 + core/wiki/config/SwitcherTargets.multids | 6 ++++++ core/wiki/config/shortcuts/shortcuts.multids | 1 + themes/tiddlywiki/vanilla/base.tid | 11 +++++++++++ 10 files changed, 63 insertions(+) create mode 100644 core/ui/KeyboardShortcuts/switcher.tid create mode 100644 core/ui/LayoutSwitcher.tid create mode 100644 core/ui/SwitcherModal.tid create mode 100644 core/wiki/config/SwitcherTargets.multids diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index a6655709d..81c5758cc 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -40,6 +40,7 @@ Error/XMLHttpRequest: XMLHttpRequest error code InternalJavaScriptError/Title: Internal JavaScript Error InternalJavaScriptError/Hint: Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser InvalidFieldName: Illegal characters in field name "<$text text=<<fieldName>>/>". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`) +LayoutSwitcher/Description: Open the layout switcher LazyLoadingWarning: <p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p> LoginToTiddlySpace: Login to TiddlySpace Manager/Controls/FilterByTag/None: (none) @@ -63,6 +64,8 @@ MissingTiddler/Hint: Missing tiddler "<$text text=<<currentTiddler>>/>" -- click No: No OfficialPluginLibrary: Official ~TiddlyWiki Plugin Library OfficialPluginLibrary/Hint: The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. +PageTemplate/Description: the default ~TiddlyWiki layout +PageTemplate/Name: Default ~PageTemplate PluginReloadWarning: Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect RecentChanges/DateFormat: DDth MMM YYYY Shortcuts/Input/AdvancedSearch/Hint: Open the ~AdvancedSearch panel from within the sidebar search field @@ -74,6 +77,10 @@ Shortcuts/Input/Tab-Left/Hint: Select the previous Tab Shortcuts/Input/Tab-Right/Hint: Select the next Tab Shortcuts/Input/Up/Hint: Select the previous item Shortcuts/SidebarLayout/Hint: Change the sidebar layout +Switcher/Subtitle/theme: Switch Theme +Switcher/Subtitle/layout: Switch Layout +Switcher/Subtitle/language: Switch Language +Switcher/Subtitle/palette: Switch Palette SystemTiddler/Tooltip: This is a system tiddler SystemTiddlers/Include/Prompt: Include system tiddlers TagManager/Colour/Heading: Colour diff --git a/core/modules/startup/rootwidget.js b/core/modules/startup/rootwidget.js index d02748b28..353c25958 100644 --- a/core/modules/startup/rootwidget.js +++ b/core/modules/startup/rootwidget.js @@ -25,6 +25,9 @@ exports.startup = function() { $tw.rootWidget.addEventListener("tm-modal",function(event) { $tw.modal.display(event.param,{variables: event.paramObject, event: event}); }); + $tw.rootWidget.addEventListener("tm-show-switcher",function(event) { + $tw.modal.display("$:/core/ui/SwitcherModal",{variables: event.paramObject, event: event}); + }); // Install the notification mechanism $tw.notifier = new $tw.utils.Notifier($tw.wiki); $tw.rootWidget.addEventListener("tm-notify",function(event) { diff --git a/core/ui/KeyboardShortcuts/switcher.tid b/core/ui/KeyboardShortcuts/switcher.tid new file mode 100644 index 000000000..06dbae69d --- /dev/null +++ b/core/ui/KeyboardShortcuts/switcher.tid @@ -0,0 +1,5 @@ +title: $:/core/ui/KeyboardShortcuts/switcher +tags: $:/tags/KeyboardShortcut +key: ((layout-switcher)) + +<$action-sendmessage $message="tm-show-switcher" switch="layout"/> \ No newline at end of file diff --git a/core/ui/LayoutSwitcher.tid b/core/ui/LayoutSwitcher.tid new file mode 100644 index 000000000..688375110 --- /dev/null +++ b/core/ui/LayoutSwitcher.tid @@ -0,0 +1,16 @@ +title: $:/snippets/LayoutSwitcher +tags: $:/tags/ControlPanel/Appearance + +<$linkcatcher to="$:/layout"> +<div class="tc-chooser"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[sort[name]]"> +<$list filter="[{$:/layout}!has[text]]" variable="ignore" emptyMessage=""" +<$set name="cls" filter="[all[current]field:title{$:/layout}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field="name"/>'' - <$transclude field="description"/></$link></div> +</$set> +"""> +<$set name="cls" filter="[all[current]field:title[$:/core/ui/PageTemplate]]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field="name"/>'' - <$transclude field="description"/></$link></div> +</$set> +</$list> +</$list> +</div> +</$linkcatcher> \ No newline at end of file diff --git a/core/ui/PageTemplate.tid b/core/ui/PageTemplate.tid index abb23a104..a432cc76a 100644 --- a/core/ui/PageTemplate.tid +++ b/core/ui/PageTemplate.tid @@ -1,4 +1,6 @@ title: $:/core/ui/PageTemplate +name: {{$:/language/PageTemplate/Name}} +description: {{$:/language/PageTemplate/Description}} \whitespace trim \define containerClasses() diff --git a/core/ui/SwitcherModal.tid b/core/ui/SwitcherModal.tid new file mode 100644 index 000000000..3477f5778 --- /dev/null +++ b/core/ui/SwitcherModal.tid @@ -0,0 +1,11 @@ +title: $:/core/ui/SwitcherModal +subtitle: <$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/> +class: tc-modal-centered + +<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}> + + +<$transclude/> + + +</$tiddler> \ No newline at end of file diff --git a/core/wiki/config/ShortcutInfo.multids b/core/wiki/config/ShortcutInfo.multids index 8e26f9ad8..1f903dcad 100644 --- a/core/wiki/config/ShortcutInfo.multids +++ b/core/wiki/config/ShortcutInfo.multids @@ -22,6 +22,7 @@ input-tab-left: {{$:/language/Shortcuts/Input/Tab-Left/Hint}} input-tab-right: {{$:/language/Shortcuts/Input/Tab-Right/Hint}} input-up: {{$:/language/Shortcuts/Input/Up/Hint}} italic: {{$:/language/Buttons/Italic/Hint}} +layout-switcher: {{$:/language/LayoutSwitcher/Description}} link: {{$:/language/Buttons/Link/Hint}} linkify: {{$:/language/Buttons/Linkify/Hint}} list-bullet: {{$:/language/Buttons/ListBullet/Hint}} diff --git a/core/wiki/config/SwitcherTargets.multids b/core/wiki/config/SwitcherTargets.multids new file mode 100644 index 000000000..22583c872 --- /dev/null +++ b/core/wiki/config/SwitcherTargets.multids @@ -0,0 +1,6 @@ +title: $:/config/SwitcherTargets/ + +layout: $:/snippets/LayoutSwitcher +language: $:/snippets/languageswitcher +palette: $:/core/ui/ControlPanel/Palette +theme: $:/core/ui/ControlPanel/Theme \ No newline at end of file diff --git a/core/wiki/config/shortcuts/shortcuts.multids b/core/wiki/config/shortcuts/shortcuts.multids index 78cefee4a..2a312cfa0 100644 --- a/core/wiki/config/shortcuts/shortcuts.multids +++ b/core/wiki/config/shortcuts/shortcuts.multids @@ -21,6 +21,7 @@ input-down: Down input-tab-left: alt-Left input-tab-right: alt-Right input-up: Up +layout-switcher: ctrl-shift-L link: ctrl-L linkify: alt-shift-L list-bullet: ctrl-shift-L diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index bc74494bd..940b486fe 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1840,6 +1840,17 @@ html body.tc-body.tc-single-tiddler-window { border-top: 1px solid <<colour modal-footer-border>>; } + +/* +** Centered modals +*/ +.tc-modal-centered .tc-modal { + width: auto; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) !important; +} + /* ** Notifications */ From cb62c8c96dd5cfa9ef6af2dad11470665d4525c6 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 23 Nov 2020 18:07:41 +0100 Subject: [PATCH 1005/2376] Docs for eventcatcher (#5097) --- .../tiddlers/variables/modifier Variable.tid | 4 +- .../tiddlers/widgets/EventCatcherWidget.tid | 78 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid diff --git a/editions/tw5.com/tiddlers/variables/modifier Variable.tid b/editions/tw5.com/tiddlers/variables/modifier Variable.tid index d5db7d702..835b3e7cb 100644 --- a/editions/tw5.com/tiddlers/variables/modifier Variable.tid +++ b/editions/tw5.com/tiddlers/variables/modifier Variable.tid @@ -1,8 +1,10 @@ +created: 20201123120203415 +modified: 20201123120211360 tags: Variables [[Core Variables]] title: modifier Variable type: text/vnd.tiddlywiki -Within the ''action'' string of the DroppableWidget, the ''action'' string of the ButtonWidget and the ''action'' string of the LinkCatcherWidget, the <<.def modifier>> [[variable|Variables]] contains the modifier key(s) held during the drag-process. +Within the ''action'' string of the DroppableWidget, the ''action'' string of the ButtonWidget and the ''action'' string of the LinkCatcherWidget and the EventCatcherWidget, the <<.def modifier>> [[variable|Variables]] contains the modifier key(s) held during the drag-process. The possible keys are ''meta'', ''ctrl'', ''shift'', ''alt'', ''meta'' and ''ctrl'', ''meta'' and ''shift'', ''meta'' and ''alt'', ''ctrl'' and ''shift'', ''alt'' and ''shift'', ''ctrl'' and ''alt'', ''ctrl'' and ''alt'' and ''shift'', ''meta'' and ''alt'' and ''shift'', ''meta'' and ''ctrl'' and ''shift'', ''meta'' and ''ctrl'' and ''alt'', ''meta'' and ''ctrl'' and ''alt'' and ''shift'' The variable contains a string that identifies the keys: diff --git a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid new file mode 100644 index 000000000..dc8e6b0e3 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid @@ -0,0 +1,78 @@ +created: 20201123113532200 +modified: 20201123143104394 +tags: Widgets +title: EventCatcherWidget +type: text/vnd.tiddlywiki + +! Introduction + +The event catcher widget traps JavaScript events dispatched within its child content, and allows invoking a series of ActionWidgets in response to the events. + +In order for the events to be trapped they must: + +* be of the type specified as a parameter to the event catcher widget. +* arise within a DOM node matching the selector specified as a parameter to the widget. + +Use of the event catcher widget is useful when using large numbers of other trigger widgets such as the ButtonWidget is causing performance problems. The workflow it enables is akin to what is referred to as "event delegation" in JavaScript parlance. + +//This is an advanced widget intended to be used by those familiar with HTML, CSS and JavaScript.// + +! Content and Attributes + +The content of the `<$eventcatcher>` widget is displayed normally. + +|!Attribute |!Description | +|type |The JavaScript event type to be trapped, for example "click", or "dblclick" | +|selector |A CSS selector. Only events originating inside a DOM node with this selector will be trapped. | +|actions |Action strings to be invoked when a matching event is trapped | +|class |An optional CSS class name to be assigned to the HTML element | +|tag |Optional. The html element the widget creates to capture the events, defaults to:<br>» `span` when parsed in inline-mode<br>» `div` when parsed in block-mode | + +! Variables + +The following variables are made available to the actions: + +|!Variables |!Description | +|`dom-*` |All DOM attributes of the node matching the given selector are made available as variables, with the prefix `dom-` | +|`modifier` |The [[modifier Variable]] contains the Modifier Key held during the event (can be "normal", "ctrl", "shift", "alt" or combinations thereof) | +|`event-mousebutton`|The mouse button (if any) used to trigger the event (can be "left", "right" or "middle"). Note that not all event types support the mousebutton property | +|`tv-popup-coords`|A co-ordinate string that can be used with the ActionPopupWidget to trigger a popup at the DOM node matching the selector where the event originated | +|`tv-selectednode-posx`|`x` offset position of the selected DOM node | +|`tv-selectednode-posy`|`y` offset position of the selected DOM node | +|`tv-selectednode-width`|`offsetWidth` of the selected DOM node | +|`tv-selectednode-height`|`offsetHeight` of the selected DOM node | +|`event-fromselected-posx`|`x` position of the event relative to the selected DOM node | +|`event-fromselected-posy`|`y` position of the event relative to the selected DOM node | +|`event-fromcatcher-posx`|`x` position of the event relative to the event catcher DOM node | +|`event-fromcatcher-posy`|`y` position of the event relative to the event catcher DOM node | + +! Example + +This example uses the ActionLogWidget and will log the `data-item-id` attribute of the clicked DOM node to the browser's JavaScript [[console|Web Developer Tools]] + +``` +\define myactions() +<$action-log item=<<dom-data-item-id>>/> +\end + +<$eventcatcher type="click" selector=".item" actions=<<myactions>> tag="div"> + +<div class="item" data-item-id="item1"> +Click events here will be trapped +</div> + +<div class="item" data-item-id="item2"> +And here too +</div> + +<div data-item-id="item3"> +Not here +</div> + +<div class="item" data-item-id="item4"> +And here +</div> + +</$eventcatcher>""" +``` + From 3d93790573fca8c41f65c6f1517007d4cb9d7549 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 19:06:46 +0100 Subject: [PATCH 1006/2376] Fix StaticRiver exporter width of static tiddlers (#5099) * Add tc-static-story-river class to StaticRiver exporter * Update base.tid --- core/templates/exporters/StaticRiver.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/templates/exporters/StaticRiver.tid b/core/templates/exporters/StaticRiver.tid index 48e62b1f2..4583bc1ce 100644 --- a/core/templates/exporters/StaticRiver.tid +++ b/core/templates/exporters/StaticRiver.tid @@ -26,7 +26,7 @@ extension: .html </head> <body class="tc-body"> {{$:/StaticBanner||$:/core/templates/html-tiddler}} -<section class="tc-story-river"> +<section class="tc-story-river tc-static-story-river"> {{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}} </section> </body> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 940b486fe..92d9858c5 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -937,6 +937,11 @@ button.tc-btn-invisible.tc-remove-tag-button { ">> + .tc-story-river.tc-static-story-river { + margin-right: 0; + padding-right: 42px; + } + } @media print { From c9a77c5877c3325e1ab31d47554dc4e9fda6e55d Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 19:41:38 +0100 Subject: [PATCH 1007/2376] Create MacOSDark.tid (#5100) --- core/palettes/MacOSDark.tid | 113 ++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 core/palettes/MacOSDark.tid diff --git a/core/palettes/MacOSDark.tid b/core/palettes/MacOSDark.tid new file mode 100644 index 000000000..3d8caeb9d --- /dev/null +++ b/core/palettes/MacOSDark.tid @@ -0,0 +1,113 @@ +title: $:/palettes/MacOSDark +tags: $:/tags/palette +description: A MacOS inspired dark palette + +alert-background: <<colour background>> +alert-border: <<colour very-muted-foreground>> +alert-highlight: <<colour very-muted-foreground>> +alert-muted-foreground: <<colour muted-foreground>> +background: #282828 +blockquote-bar: <<colour page-background>> +button-background: #3F638B +button-foreground: inherit +button-border: transparent +code-background: <<colour pre-background>> +code-border: <<colour pre-border>> +code-foreground: rgba(255, 255, 255, 0.54) +dirty-indicator: #FF453A +download-background: <<colour primary>> +download-foreground: <<colour foreground>> +dragger-background: <<colour foreground>> +dragger-foreground: <<colour background>> +dropdown-background: #464646 +dropdown-border: <<colour dropdown-background>> +dropdown-tab-background-selected: #3F638B +dropdown-tab-background: #323232 +dropzone-background: <<colour tag-background>> +external-link-background-hover: transparent +external-link-background-visited: transparent +external-link-background: transparent +external-link-foreground-hover: +external-link-foreground-visited: #BF5AF2 +external-link-foreground: #32D74B +foreground: #FFFFFF +message-background: <<colour background>> +message-border: <<colour very-muted-foreground>> +message-foreground: rgba(255, 255, 255, 0.54) +modal-backdrop: <<colour page-background>> +modal-background: <<colour background>> +modal-border: <<colour very-muted-foreground>> +modal-footer-background: <<colour background>> +modal-footer-border: <<colour background>> +modal-header-border: <<colour very-muted-foreground>> +muted-foreground: rgba(255, 255, 255, 0.54) +notification-background: <<colour dropdown-background>> +notification-border: <<colour dropdown-background>> +page-background: #323232 +pre-background: #464646 +pre-border: transparent +primary: #0A84FF +select-tag-background: <<colour background>> +select-tag-foreground: <<colour foreground>> +sidebar-button-foreground: <<colour foreground>> +sidebar-controls-foreground-hover: #FF9F0A +sidebar-controls-foreground: #464646 +sidebar-foreground-shadow: transparent +sidebar-foreground: rgba(255, 255, 255, 0.54) +sidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54) +sidebar-muted-foreground: rgba(255, 255, 255, 0.38) +sidebar-tab-background-selected: #3F638B +sidebar-tab-background: <<colour background>> +sidebar-tab-border-selected: <<colour background>> +sidebar-tab-border: <<colour background>> +sidebar-tab-divider: <<colour background>> +sidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87) +sidebar-tab-foreground: rgba(255, 255, 255, 0.54) +sidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7) +sidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54) +site-title-foreground: #ffffff +static-alert-foreground: #B4B4B4 +tab-background-selected: #3F638B +tab-background: <<colour page-background>> +tab-border-selected: <<colour page-background>> +tab-border: <<colour page-background>> +tab-divider: <<colour page-background>> +tab-foreground-selected: rgba(255, 255, 255, 0.87) +tab-foreground: rgba(255, 255, 255, 0.54) +table-border: #464646 +table-footer-background: <<colour tiddler-editor-fields-odd>> +table-header-background: <<colour tiddler-editor-fields-even>> +tag-background: #48484A +tag-foreground: #323232 +tiddler-background: <<colour background>> +tiddler-border: transparent +tiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>> +tiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>> +tiddler-controls-foreground: <<colour sidebar-controls-foreground>> +tiddler-editor-background: transparent +tiddler-editor-border-image: +tiddler-editor-border: rgba(255, 255, 255, 0.08) +tiddler-editor-fields-even: rgba(255, 255, 255, 0.1) +tiddler-editor-fields-odd: rgba(255, 255, 255, 0.04) +tiddler-info-background: #1E1E1E +tiddler-info-border: #1E1E1E +tiddler-info-tab-background: #3F638B +tiddler-link-background: <<colour background>> +tiddler-link-foreground: <<colour primary>> +tiddler-subtitle-foreground: <<colour muted-foreground>> +tiddler-title-foreground: #FFFFFF +toolbar-new-button: +toolbar-options-button: +toolbar-save-button: +toolbar-info-button: +toolbar-edit-button: +toolbar-close-button: +toolbar-delete-button: +toolbar-cancel-button: +toolbar-done-button: +untagged-background: <<colour very-muted-foreground>> +very-muted-foreground: rgba(255, 255, 255, 0.12) +selection-background: #3F638B +selection-foreground: #ffffff +menubar-background: #464646 +menubar-foreground: #ffffff From 519962b4a93dba9f16f7a9950a86d7996416e550 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 20:14:07 +0100 Subject: [PATCH 1008/2376] Update and rename MacOSDark.tid to CupertinoDark.tid (#5101) * Update and rename MacOSDark.tid to CupertinoDark.tid * Update CupertinoDark.tid * Update CupertinoDark.tid * Update CupertinoDark.tid --- core/palettes/{MacOSDark.tid => CupertinoDark.tid} | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) rename core/palettes/{MacOSDark.tid => CupertinoDark.tid} (96%) diff --git a/core/palettes/MacOSDark.tid b/core/palettes/CupertinoDark.tid similarity index 96% rename from core/palettes/MacOSDark.tid rename to core/palettes/CupertinoDark.tid index 3d8caeb9d..295e3bc04 100644 --- a/core/palettes/MacOSDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -1,6 +1,8 @@ -title: $:/palettes/MacOSDark -tags: $:/tags/palette -description: A MacOS inspired dark palette +title: $:/palettes/CupertinoDark +tags: $:/tags/Palette +name: Cupertino Dark +description: A macOS inspired dark palette +type: application/x-tiddler-dictionary alert-background: <<colour background>> alert-border: <<colour very-muted-foreground>> From af72fdf24579396c4fdf213632f1d509298bf7c9 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 20:15:04 +0100 Subject: [PATCH 1009/2376] Add caption to ControlPanel LayoutSwitcher (#5103) * Update LayoutSwitcher.tid * Update ControlPanel.multids --- core/language/en-GB/ControlPanel.multids | 1 + core/ui/LayoutSwitcher.tid | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index c75aa5679..852197083 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -44,6 +44,7 @@ KeyboardShortcuts/Platform/Linux: Linux platform only KeyboardShortcuts/Platform/NonLinux: Non-Linux platforms only KeyboardShortcuts/Platform/Windows: Windows platform only KeyboardShortcuts/Platform/NonWindows: Non-Windows platforms only +LayoutSwitcher/Caption: Layout LoadedModules/Caption: Loaded Modules LoadedModules/Hint: These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process. Palette/Caption: Palette diff --git a/core/ui/LayoutSwitcher.tid b/core/ui/LayoutSwitcher.tid index 688375110..11c0c01a0 100644 --- a/core/ui/LayoutSwitcher.tid +++ b/core/ui/LayoutSwitcher.tid @@ -1,5 +1,6 @@ title: $:/snippets/LayoutSwitcher tags: $:/tags/ControlPanel/Appearance +caption: {{$:/language/ControlPanel/LayoutSwitcher/Caption}} <$linkcatcher to="$:/layout"> <div class="tc-chooser"> @@ -13,4 +14,4 @@ tags: $:/tags/ControlPanel/Appearance </$list> </$list> </div> -</$linkcatcher> \ No newline at end of file +</$linkcatcher> From e0f4d82214aed29d02c547f0474b24d7f9bf8d77 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 20:32:51 +0100 Subject: [PATCH 1010/2376] Update CupertinoDark.tid (#5105) --- core/palettes/CupertinoDark.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index 295e3bc04..504e627d3 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -4,9 +4,9 @@ name: Cupertino Dark description: A macOS inspired dark palette type: application/x-tiddler-dictionary -alert-background: <<colour background>> -alert-border: <<colour very-muted-foreground>> -alert-highlight: <<colour very-muted-foreground>> +alert-background: #FF453A +alert-border: #FF453A +alert-highlight: #FFD60A alert-muted-foreground: <<colour muted-foreground>> background: #282828 blockquote-bar: <<colour page-background>> @@ -25,7 +25,7 @@ dropdown-background: #464646 dropdown-border: <<colour dropdown-background>> dropdown-tab-background-selected: #3F638B dropdown-tab-background: #323232 -dropzone-background: <<colour tag-background>> +dropzone-background: #30D158 external-link-background-hover: transparent external-link-background-visited: transparent external-link-background: transparent From 77971ff7201a9669c671d45232fdcc863a666e9e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 20:41:51 +0100 Subject: [PATCH 1011/2376] Lighter sidebar-controls-foreground for Cupertino Dark Palette (#5106) --- core/palettes/CupertinoDark.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index 504e627d3..438292d97 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -53,7 +53,7 @@ select-tag-background: <<colour background>> select-tag-foreground: <<colour foreground>> sidebar-button-foreground: <<colour foreground>> sidebar-controls-foreground-hover: #FF9F0A -sidebar-controls-foreground: #464646 +sidebar-controls-foreground: #8E8E93 sidebar-foreground-shadow: transparent sidebar-foreground: rgba(255, 255, 255, 0.54) sidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54) From 50a3c5526fbf9dfbd476428eac7b61b6647e1f2c Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 23 Nov 2020 21:09:53 +0100 Subject: [PATCH 1012/2376] Update CupertinoDark.tid (#5107) --- core/palettes/CupertinoDark.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index 438292d97..12db75000 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -85,7 +85,7 @@ tiddler-background: <<colour background>> tiddler-border: transparent tiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>> tiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>> -tiddler-controls-foreground: <<colour sidebar-controls-foreground>> +tiddler-controls-foreground: #48484A tiddler-editor-background: transparent tiddler-editor-border-image: tiddler-editor-border: rgba(255, 255, 255, 0.08) From 7327a3fb92fa2ae17d7264c66ab0409d43b18fdc Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 24 Nov 2020 18:57:39 +0000 Subject: [PATCH 1013/2376] Fixed: Shadow tiddlers don't refresh when their plugin is deleted/modified --- core/modules/startup/plugins.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/core/modules/startup/plugins.js b/core/modules/startup/plugins.js index 907579dbe..cad61b104 100644 --- a/core/modules/startup/plugins.js +++ b/core/modules/startup/plugins.js @@ -24,6 +24,7 @@ var PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = "$:/config/RegisterPluginType/"; exports.startup = function() { $tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "no"}); $tw.wiki.addEventListener("change",function(changes) { + // Work out which of the changed tiddlers are plugins that we need to reregister var changesToProcess = [], requireReloadDueToPluginChange = false; $tw.utils.each(Object.keys(changes),function(title) { @@ -38,6 +39,7 @@ exports.startup = function() { } } }); + // Issue warning if any of the tiddlers require a reload if(requireReloadDueToPluginChange) { $tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "yes"}); } @@ -45,12 +47,35 @@ exports.startup = function() { if(changesToProcess.length > 0) { var changes = $tw.wiki.readPluginInfo(changesToProcess); if(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) { + var changedShadowTiddlers = {}; + // Collect the shadow tiddlers of any deleted plugins + $tw.utils.each(changes.deletedPlugins,function(pluginTitle) { + var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle); + if(pluginInfo) { + $tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) { + changedShadowTiddlers[title] = true; + }); + } + }); + // Collect the shadow tiddlers of any modified plugins + $tw.utils.each(changes.modifiedPlugins,function(pluginTitle) { + var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle); + if(pluginInfo) { + $tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) { + changedShadowTiddlers[title] = false; + }); + } + }); // (Re-)register any modified plugins $tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins); // Unregister any deleted plugins $tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins); // Unpack the shadow tiddlers $tw.wiki.unpackPluginTiddlers(); + // Queue change events for the changed shadow tiddlers + $tw.utils.each(Object.keys(changedShadowTiddlers),function(title) { + $tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]); + }); } } }); From c854e518faa2d2661b7b7278634b10607ab0a5f5 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 24 Nov 2020 19:01:33 +0000 Subject: [PATCH 1014/2376] Add support for $:/info/darkmode (and for dynamic info tiddlers) --- core/modules/info/platform.js | 9 +++- core/modules/startup/info.js | 44 +++++++++++-------- .../tiddlers/mechanisms/InfoMechanism.tid | 3 +- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/core/modules/info/platform.js b/core/modules/info/platform.js index 29ebdd594..a73a5e5df 100644 --- a/core/modules/info/platform.js +++ b/core/modules/info/platform.js @@ -12,7 +12,7 @@ Initialise basic platform $:/info/ tiddlers /*global $tw: false */ "use strict"; -exports.getInfoTiddlerFields = function() { +exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) { var mapBoolean = function(value) {return value ? "yes" : "no";}, infoTiddlerFields = []; // Basics @@ -36,6 +36,13 @@ exports.getInfoTiddlerFields = function() { // Screen size infoTiddlerFields.push({title: "$:/info/browser/screen/width", text: window.screen.width.toString()}); infoTiddlerFields.push({title: "$:/info/browser/screen/height", text: window.screen.height.toString()}); + // Dark mode through event listener on MediaQueryList + var mqList = window.matchMedia("(prefers-color-scheme: dark)"), + getDarkModeTiddler = function() {return {title: "$:/info/darkmode", text: mqList.matches ? "yes" : "no"};}; + infoTiddlerFields.push(getDarkModeTiddler()); + mqList.addEventListener("change", function(event) { + updateInfoTiddlersCallback([getDarkModeTiddler()]); + }); // Language infoTiddlerFields.push({title: "$:/info/browser/language", text: navigator.language || ""}); } diff --git a/core/modules/startup/info.js b/core/modules/startup/info.js index 7efaa5b0e..ed2305930 100644 --- a/core/modules/startup/info.js +++ b/core/modules/startup/info.js @@ -21,29 +21,37 @@ exports.synchronous = true; var TITLE_INFO_PLUGIN = "$:/temp/info-plugin"; exports.startup = function() { + // Function to bake the info plugin with new tiddlers + var updateInfoPlugin = function(tiddlerFieldsArray) { + // Get the existing tiddlers + var json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}}); + // Add the new ones + $tw.utils.each(tiddlerFieldsArray,function(fields) { + if(fields && fields.title) { + json.tiddlers[fields.title] = fields; + } + }); + // Bake the info tiddlers into a plugin. We use the non-standard plugin-type "info" because ordinary plugins are only registered asynchronously after being loaded dynamically + var fields = { + title: TITLE_INFO_PLUGIN, + type: "application/json", + "plugin-type": "info", + text: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces) + }; + $tw.wiki.addTiddler(new $tw.Tiddler(fields)); + + }; // Collect up the info tiddlers - var infoTiddlerFields = {}; - // Give each info module a chance to fill in as many info tiddlers as they want + var tiddlerFieldsArray = []; + // Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them $tw.modules.forEachModuleOfType("info",function(title,moduleExports) { if(moduleExports && moduleExports.getInfoTiddlerFields) { - var tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields); - $tw.utils.each(tiddlerFieldsArray,function(fields) { - if(fields) { - infoTiddlerFields[fields.title] = fields; - } - }); + Array.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin)); } }); - // Bake the info tiddlers into a plugin. We use the non-standard plugin-type "info" because ordinary plugins are only registered asynchronously after being loaded dynamically - var fields = { - title: TITLE_INFO_PLUGIN, - type: "application/json", - "plugin-type": "info", - text: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces) - }; - $tw.wiki.addTiddler(new $tw.Tiddler(fields)); - $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]); - $tw.wiki.registerPluginTiddlers("info"); + updateInfoPlugin(tiddlerFieldsArray); + var changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]); + $tw.wiki.registerPluginTiddlers("info",[TITLE_INFO_PLUGIN]); $tw.wiki.unpackPluginTiddlers(); }; diff --git a/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid b/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid index 62d907076..c56bd47eb 100644 --- a/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid +++ b/editions/tw5.com/tiddlers/mechanisms/InfoMechanism.tid @@ -1,5 +1,5 @@ created: 20140720164948099 -modified: 20200506110435897 +modified: 20201124185829706 tags: Mechanisms title: InfoMechanism type: text/vnd.tiddlywiki @@ -27,3 +27,4 @@ System tiddlers in the namespace `$:/info/` are used to expose information about |[[$:/info/url/port]] |<<.from-version "5.1.14">> Port portion of URL of wiki (eg, ''<<example port>>'') | |[[$:/info/url/protocol]] |<<.from-version "5.1.14">> Protocol portion of URL of wiki (eg, ''<<example protocol>>'') | |[[$:/info/url/search]] |<<.from-version "5.1.14">> Search portion of URL of wiki (eg, ''<<example search>>'') | +|[[$:/info/darkmode]] |<<.from-version "5.1.23">> Is dark mode enabled? ("yes" or "no") | From 5769cf9784cba842c1b8ff5f1481cc1b4db67f48 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 24 Nov 2020 22:15:37 +0100 Subject: [PATCH 1015/2376] Fix #5108 - vanilla/reset overrides system fonts (#5118) --- themes/tiddlywiki/vanilla/base.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 92d9858c5..2b2ce4ce9 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -90,7 +90,7 @@ html button { ** Basic element styles */ -html { +html, body { font-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}}; text-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */ -webkit-font-smoothing: antialiased; From a9d583b85e1dc660d4c6b75c45db4f95e776d373 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 24 Nov 2020 22:16:24 +0100 Subject: [PATCH 1016/2376] Update CupertinoDark.tid (#5117) --- core/palettes/CupertinoDark.tid | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index 12db75000..b4f8f12aa 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -11,7 +11,7 @@ alert-muted-foreground: <<colour muted-foreground>> background: #282828 blockquote-bar: <<colour page-background>> button-background: #3F638B -button-foreground: inherit +button-foreground: <<colour foreground>> button-border: transparent code-background: <<colour pre-background>> code-border: <<colour pre-border>> @@ -33,6 +33,8 @@ external-link-foreground-hover: external-link-foreground-visited: #BF5AF2 external-link-foreground: #32D74B foreground: #FFFFFF +menubar-background: #464646 +menubar-foreground: #ffffff message-background: <<colour background>> message-border: <<colour very-muted-foreground>> message-foreground: rgba(255, 255, 255, 0.54) @@ -42,7 +44,7 @@ modal-border: <<colour very-muted-foreground>> modal-footer-background: <<colour background>> modal-footer-border: <<colour background>> modal-header-border: <<colour very-muted-foreground>> -muted-foreground: rgba(255, 255, 255, 0.54) +muted-foreground: #464646 notification-background: <<colour dropdown-background>> notification-border: <<colour dropdown-background>> page-background: #323232 @@ -108,8 +110,22 @@ toolbar-delete-button: toolbar-cancel-button: toolbar-done-button: untagged-background: <<colour very-muted-foreground>> -very-muted-foreground: rgba(255, 255, 255, 0.12) +very-muted-foreground: #464646 selection-background: #3F638B selection-foreground: #ffffff -menubar-background: #464646 -menubar-foreground: #ffffff +wikilist-background: <<colour page-background>> +wikilist-button-background: <<colour button-background>> +wikilist-button-foreground: <<colour foreground>> +wikilist-button-open: #32D74B +wikilist-button-open-hover: #32D74B +wikilist-button-reveal: #0A84FF +wikilist-button-reveal-hover: #0A84FF +wikilist-button-remove: #FF453A +wikilist-button-remove-hover: #FF453A +wikilist-droplink-dragover: #32D74B +wikilist-item: <<colour background>> +wikilist-toolbar-background: <<colour background>> +wikilist-title: <<colour foreground>> +wikilist-title-svg: <<colour foreground>> +wikilist-toolbar-foreground: <<colour foreground>> +wikilist-url: <<colour muted-foreground>> From ce27492b968b7f7b698ab720f233ab55f3336826 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 24 Nov 2020 22:19:20 +0100 Subject: [PATCH 1017/2376] Refactor updating of classes for button widgets to avoid potential edge case failures (#5115) --- core/modules/widgets/button.js | 48 ++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 3ece52371..5b15c875f 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -42,7 +42,20 @@ ButtonWidget.prototype.render = function(parent,nextSibling) { domNode = this.document.createElement(tag); this.domNode = domNode; // Assign classes - this.assignDomNodeClasses(); + var classes = this["class"].split(" ") || [], + isPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp(); + if(this.selectedClass) { + if((this.set || this.setTitle) && this.setTo && this.isSelected()) { + $tw.utils.pushTop(classes,this.selectedClass.split(" ")); + } + if(isPoppedUp) { + $tw.utils.pushTop(classes,this.selectedClass.split(" ")); + } + } + if(isPoppedUp) { + $tw.utils.pushTop(classes,"tc-popup-handle"); + } + domNode.className = classes.join(" "); // Assign other attributes if(this.style) { domNode.setAttribute("style",this.style); @@ -192,7 +205,7 @@ ButtonWidget.prototype.execute = function() { this["aria-label"] = this.getAttribute("aria-label"); this.tooltip = this.getAttribute("tooltip"); this.style = this.getAttribute("style"); - // Class attribute is handled in assignDomNodeClasses() + this["class"] = this.getAttribute("class",""); this.selectedClass = this.getAttribute("selectedClass"); this.defaultSetValue = this.getAttribute("default",""); this.buttonTag = this.getAttribute("tag"); @@ -208,21 +221,22 @@ ButtonWidget.prototype.execute = function() { this.makeChildWidgets(); }; -ButtonWidget.prototype.assignDomNodeClasses = function() { - var classes = this.getAttribute("class","").split(" "), - isPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp(); - if(this.selectedClass) { - if((this.set || this.setTitle) && this.setTo && this.isSelected()) { - $tw.utils.pushTop(classes,this.selectedClass.split(" ")); +ButtonWidget.prototype.updateDomNodeClasses = function() { + var domNodeClasses = this.domNode.className.split(" "), + oldClasses = this.class.split(" "), + newClasses; + this["class"] = this.getAttribute("class",""); + newClasses = this.class.split(" "); + //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); } - if(isPoppedUp) { - $tw.utils.pushTop(classes,this.selectedClass.split(" ")); - } - } - if(isPoppedUp) { - $tw.utils.pushTop(classes,"tc-popup-handle"); - } - this.domNode.className = classes.join(" "); + }); + //Add new classes from updated class attribute. + $tw.utils.pushTop(domNodeClasses,newClasses); + this.domNode.className = domNodeClasses.join(" "); } /* @@ -234,7 +248,7 @@ ButtonWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else if(changedAttributes["class"]) { - this.assignDomNodeClasses(); + this.updateDomNodeClasses(); } return this.refreshChildren(changedTiddlers); }; From 0e247c991db7dfc638c358c7d9824897066a51a5 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 24 Nov 2020 22:19:37 +0100 Subject: [PATCH 1018/2376] Update modifier variable docs (#5114) Listing the potential key combination in a single line is hard to read and also redundant when we have the same information in the table below. --- editions/tw5.com/tiddlers/variables/modifier Variable.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/variables/modifier Variable.tid b/editions/tw5.com/tiddlers/variables/modifier Variable.tid index 835b3e7cb..3d1322e7f 100644 --- a/editions/tw5.com/tiddlers/variables/modifier Variable.tid +++ b/editions/tw5.com/tiddlers/variables/modifier Variable.tid @@ -5,7 +5,7 @@ title: modifier Variable type: text/vnd.tiddlywiki Within the ''action'' string of the DroppableWidget, the ''action'' string of the ButtonWidget and the ''action'' string of the LinkCatcherWidget and the EventCatcherWidget, the <<.def modifier>> [[variable|Variables]] contains the modifier key(s) held during the drag-process. -The possible keys are ''meta'', ''ctrl'', ''shift'', ''alt'', ''meta'' and ''ctrl'', ''meta'' and ''shift'', ''meta'' and ''alt'', ''ctrl'' and ''shift'', ''alt'' and ''shift'', ''ctrl'' and ''alt'', ''ctrl'' and ''alt'' and ''shift'', ''meta'' and ''alt'' and ''shift'', ''meta'' and ''ctrl'' and ''shift'', ''meta'' and ''ctrl'' and ''alt'', ''meta'' and ''ctrl'' and ''alt'' and ''shift'' +Possible key combinations are listed in the table below. The variable contains a string that identifies the keys: From 4f88d79d8b0a8560c3e0da7e590687adb35bc6f6 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 25 Nov 2020 05:27:24 +0800 Subject: [PATCH 1019/2376] Add chinese translations for Switchers (#5111) --- languages/zh-Hans/ControlPanel.multids | 1 + languages/zh-Hans/Misc.multids | 7 +++++++ languages/zh-Hant/ControlPanel.multids | 1 + languages/zh-Hant/Misc.multids | 7 +++++++ 4 files changed, 16 insertions(+) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index e40c7b1b7..41b94baf1 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -44,6 +44,7 @@ KeyboardShortcuts/Platform/Linux: 仅 Linux 平台 KeyboardShortcuts/Platform/NonLinux: 仅非 Linux 平台 KeyboardShortcuts/Platform/Windows: 仅 Windows 平台 KeyboardShortcuts/Platform/NonWindows: 仅非 Windows 平台 +LayoutSwitcher/Caption: 布局 LoadedModules/Caption: 已加载的模块 LoadedModules/Hint: 这些是当前已加载的模块之源码条目。斜体的模块则无源码条目,通常是因为它们是在引导过程中设置。 Palette/Caption: 调色板 diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 8d94c60e9..556e8b492 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -40,6 +40,7 @@ Error/XMLHttpRequest: XMLHttpRequest 错误代码 InternalJavaScriptError/Title: 内部的 JavaScript 错误 InternalJavaScriptError/Hint: 喔,真是令人尴尬。建议刷新您的浏览器,重新启动 TiddlyWiki InvalidFieldName: 字段名称 "<$text text=<<fieldName>>/>" 包含无效字符,字段名称只能包含小写字母、数字、底线 (`_`)、 连字号 (`-`) 和小数点 (`.`) +LayoutSwitcher/Description: 打开布局切换器 LazyLoadingWarning: <p>正在从 ''<$text text={{!!_canonical_uri}}/>'' 加载外部内容 ...</p><p>如果此信息未消失,可能是条目内容类型与外部内容的类型不匹配,或是您可能正在使用的浏览器,不支援单文件式维基的外部内容。请参阅 https://tiddlywiki.com/#ExternalText</p> LoginToTiddlySpace: 登录 TiddlySpace Manager/Controls/FilterByTag/None: (无) @@ -63,6 +64,8 @@ MissingTiddler/Hint: 佚失条目 "<$text text=<<currentTiddler>>/>" - 点击 {{ No: 否 OfficialPluginLibrary: ~TiddlyWiki 官方插件程式库 OfficialPluginLibrary/Hint: 此为在 tiddlywiki.com 的 ~TiddlyWiki 官方插件程式库。由核心团队维护的插件、主题和语言包。 +PageTemplate/Description: 默认的 ~Tiddlywiki 布局 +PageTemplate/Name: 默认的 ~PageTemplate PluginReloadWarning: 请保存 {{$:/core/ui/Buttons/save-wiki}} 并刷新页面 {{$:/core/ui/Buttons/refresh}} ,使 ~JavaScript 插件的更改生效 RecentChanges/DateFormat: YYYY年0MM月0DD日 Shortcuts/Input/Accept/Hint: 接受选取的项目 @@ -74,6 +77,10 @@ Shortcuts/Input/Tab-Left/Hint: 选择上一个页签 Shortcuts/Input/Tab-Right/Hint: 选择下一个页签 Shortcuts/Input/Up/Hint: 选择前一个项目 Shortcuts/SidebarLayout/Hint: 更改侧边栏布局 +Switcher/Subtitle/theme: 切换布景主题 +Switcher/Subtitle/layout: 切换布局 +Switcher/Subtitle/language: 切换语言 +Switcher/Subtitle/palette: 切换调色板 SystemTiddler/Tooltip: 此为系统条目 SystemTiddlers/Include/Prompt: 包括系统条目 TagManager/Colour/Heading: 颜色 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 988ae4c39..5fb35f427 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -44,6 +44,7 @@ KeyboardShortcuts/Platform/Linux: 僅 Linux 平臺 KeyboardShortcuts/Platform/NonLinux: 僅非 Linux 平臺 KeyboardShortcuts/Platform/Windows: 僅 Windows 平臺 KeyboardShortcuts/Platform/NonWindows: 僅非 Windows 平臺 +LayoutSwitcher/Caption: 版面 LoadedModules/Caption: 已載入的模組 LoadedModules/Hint: 這些是當前已載入的模組之源碼條目。斜體的模組則無源碼條目,通常是因為它們是在引導過程中設置。 Palette/Caption: 調色盤 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index 008ded4fc..b9d036826 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -40,6 +40,7 @@ Error/XMLHttpRequest: XMLHttpRequest 錯誤代碼 InternalJavaScriptError/Title: 內部的 JavaScript 錯誤 InternalJavaScriptError/Hint: 喔,真是令人尷尬。建議刷新您的瀏覽器,重新啟動 TiddlyWiki InvalidFieldName: 欄位名稱 "<$text text=<<fieldName>>/>" 包含無效字元,欄位名稱只能包含小寫字母、數字、底線 (`_`)、 連接號 (`-`) 和小數點 (`.`) +LayoutSwitcher/Description: 開啟版面切換器 LazyLoadingWarning: <p>正在從 ''<$text text={{!!_canonical_uri}}/>'' 載入外部內容 ...</p><p>如果此訊息未消失,可能是條目內容類型與外部內容的類型不匹配,或是您可能正在使用的瀏覽器,不支援單檔式維基的外部內容。請參閱 https://tiddlywiki.com/#ExternalText</p> LoginToTiddlySpace: 登入 TiddlySpace Manager/Controls/FilterByTag/None: (無) @@ -63,6 +64,8 @@ MissingTiddler/Hint: 佚失條目 "<$text text=<<currentTiddler>>/>" - 點擊 {{ No: 否 OfficialPluginLibrary: ~TiddlyWiki 官方插件程式庫 OfficialPluginLibrary/Hint: 此為在 tiddlywiki.com 的 ~TiddlyWiki 官方插件程式庫。由核心團隊維護的插件、主題和語言包。 +PageTemplate/Description: 預設的 ~Tiddlywiki 佈局 +PageTemplate/Name: 預設的 ~PageTemplate PluginReloadWarning: 請儲存 {{$:/core/ui/Buttons/save-wiki}} 並刷新頁面 {{$:/core/ui/Buttons/refresh}} ,使 ~JavaScript 插件的更改生效 RecentChanges/DateFormat: YYYY年0MM月0DD日 Shortcuts/Input/Accept/Hint: 接受選取的項目 @@ -74,6 +77,10 @@ Shortcuts/Input/Tab-Left/Hint: 選擇上一個頁籤 Shortcuts/Input/Tab-Right/Hint: 選擇下一個頁籤 Shortcuts/Input/Up/Hint: 選擇前一個項目 Shortcuts/SidebarLayout/Hint: 更改側邊欄版面 +Switcher/Subtitle/theme: 切換佈景主題 +Switcher/Subtitle/layout: 切換版面 +Switcher/Subtitle/language: 切換語言 +Switcher/Subtitle/palette: 切換調色盤 SystemTiddler/Tooltip: 此為系統條目 SystemTiddlers/Include/Prompt: 包括系統條目 TagManager/Colour/Heading: 顏色 From 6c98bb706a15b353a92895529a69bece11f613ff Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Tue, 24 Nov 2020 22:38:18 +0100 Subject: [PATCH 1020/2376] Docs for switching layouts (#5109) --- editions/tw5.com/tiddlers/concepts/SystemTags.tid | 3 ++- .../customising/Alternative page layouts.tid | 15 +++++++++++++++ .../tiddlers/customising/Customise TiddlyWiki.tid | 9 +++++---- .../Page and tiddler layout customisation.tid | 9 ++++++--- .../systemtags/SystemTag_ $__tags_Layout.tid | 9 +++++++++ .../tiddlers/widgets/EventCatcherWidget.tid | 3 ++- 6 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 editions/tw5.com/tiddlers/customising/Alternative page layouts.tid create mode 100644 editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Layout.tid diff --git a/editions/tw5.com/tiddlers/concepts/SystemTags.tid b/editions/tw5.com/tiddlers/concepts/SystemTags.tid index d7f01cbf1..6b6d4a5a1 100644 --- a/editions/tw5.com/tiddlers/concepts/SystemTags.tid +++ b/editions/tw5.com/tiddlers/concepts/SystemTags.tid @@ -1,5 +1,6 @@ created: 20130822080600000 -modified: 20180927080631239 +list: [[SystemTag: $:/tags/AboveStory]] [[SystemTag: $:/tags/AdvancedSearch]] [[SystemTag: $:/tags/AdvancedSearch/FilterButton]] [[SystemTag: $:/tags/Alert]] [[SystemTag: $:/tags/BelowStory]] [[SystemTag: $:/tags/ControlPanel]] [[SystemTag: $:/tags/ControlPanel/Advanced]] [[SystemTag: $:/tags/ControlPanel/Appearance]] [[SystemTag: $:/tags/ControlPanel/Info]] [[SystemTag: $:/tags/ControlPanel/Saving]] [[SystemTag: $:/tags/ControlPanel/Settings]] [[SystemTag: $:/tags/ControlPanel/Toolbars]] [[SystemTag: $:/tags/EditorToolbar]] [[SystemTag: $:/tags/EditPreview]] [[SystemTag: $:/tags/EditTemplate]] [[SystemTag: $:/tags/EditToolbar]] [[SystemTag: $:/tags/Exporter]] [[SystemTag: $:/tags/Filter]] [[SystemTag: $:/tags/Image]] [[SystemTag: $:/tags/ImportPreview]] [[SystemTag: $:/tags/KeyboardShortcut]] [[SystemTag: $:/tags/Layout]] [[SystemTag: $:/tags/Macro]] [[SystemTag: $:/tags/Macro/View]] [[SystemTag: $:/tags/Manager/ItemMain]] [[SystemTag: $:/tags/Manager/ItemSidebar]] [[SystemTag: $:/tags/MoreSideBar]] [[SystemTag: $:/tags/MoreSideBar/Plugins]] [[SystemTag: $:/tags/PageControls]] [[SystemTag: $:/tags/PageTemplate]] [[SystemTag: $:/tags/Palette]] [[SystemTag: $:/tags/PluginLibrary]] [[SystemTag: $:/tags/RawMarkup]] [[SystemTag: $:/tags/RawMarkupWikified]] [[SystemTag: $:/tags/RawMarkupWikified/BottomBody]] [[SystemTag: $:/tags/RawMarkupWikified/TopBody]] [[SystemTag: $:/tags/RawMarkupWikified/TopHead]] [[SystemTag: $:/tags/RawStaticContent]] [[SystemTag: $:/tags/RemoteAssetInfo]] [[SystemTag: $:/tags/SearchResults]] [[SystemTag: $:/tags/ServerConnection]] [[SystemTag: $:/tags/SideBar]] [[SystemTag: $:/tags/SideBarSegment]] [[SystemTag: $:/tags/StartupAction]] [[SystemTag: $:/tags/StartupAction/Browser]] [[SystemTag: $:/tags/StartupAction/Node]] [[SystemTag: $:/tags/Stylesheet]] [[SystemTag: $:/tags/TagDropdown]] [[SystemTag: $:/tags/TextEditor/Snippet]] [[SystemTag: $:/tags/TiddlerInfo]] [[SystemTag: $:/tags/TiddlerInfo/Advanced]] [[SystemTag: $:/tags/TiddlerInfoSegment]] [[SystemTag: $:/tags/ToolbarButtonStyle]] [[SystemTag: $:/tags/TopLeftBar]] [[SystemTag: $:/tags/TopRightBar]] [[SystemTag: $:/tags/ViewTemplate]] [[SystemTag: $:/tags/ViewToolbar]] +modified: 20201123192434277 tags: Reference Concepts title: SystemTags type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/customising/Alternative page layouts.tid b/editions/tw5.com/tiddlers/customising/Alternative page layouts.tid new file mode 100644 index 000000000..554313b73 --- /dev/null +++ b/editions/tw5.com/tiddlers/customising/Alternative page layouts.tid @@ -0,0 +1,15 @@ +created: 20201123172925848 +modified: 20201123192845498 +tags: [[Customise TiddlyWiki]] +title: Alternative page layouts +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> You can have multiple alternative page layouts and switch between them. To see a list of available layouts and switch between them, use the keyboard shortcut <kbd><<displayshortcuts ((layout-switcher))>></kbd>. + +! Creating an alternative page layout + +Creating an alternative layout goes beyond [[adding or removing features|Page and tiddler layout customisation]] from the default interface and allows you to create an entirely new layout from scratch. + +To create an alternative page layout and have the ability to switch to it, you need to create an alternative page template tiddler with the [[SystemTag: $:/tags/Layout]]. + +This alternative page template can either be a tweaked and modified version of the [[default page template|$:/core/ui/PageTemplate]], or something entirely different. The layout switching mechanism requires that your page template tiddler has the fields `name` and `description`, which are used in the listing in the switching user interface. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/customising/Customise TiddlyWiki.tid b/editions/tw5.com/tiddlers/customising/Customise TiddlyWiki.tid index 29820d5a9..3c1327366 100644 --- a/editions/tw5.com/tiddlers/customising/Customise TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/customising/Customise TiddlyWiki.tid @@ -1,8 +1,9 @@ -title: Customise TiddlyWiki +created: 20140904101600000 +list: [[Adding a table of contents to the sidebar]] [[Configuring startup tiddlers]] [[Configuring the default TiddlerInfo tab]] [[Creating a custom export format]] [[Creating a splash screen]] [[Customising search results]] [[Hidden Settings]] [[How to add a new tab to the sidebar]] [[How to apply custom styles]] [[How to create keyboard shortcuts]] [[How to turn off camel case linking]] [[How to widen tiddlers (aka storyriver)]] [[Making a custom journal button]] [[Page and tiddler layout customisation]] [[Alternative page layouts]] [[Preserving open tiddlers at startup]] [[Setting a favicon]] [[Setting a page background image]] [[Using Stylesheets]] +modified: 20201123173044437 tags: TableOfContents -created: 201409041016 -modified: 201409041016 -list: [[Initial customisation]] +title: Customise TiddlyWiki +type: text/vnd.tiddlywiki Information about customising TiddlyWiki diff --git a/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid b/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid index 7a233d396..a99687aac 100644 --- a/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid +++ b/editions/tw5.com/tiddlers/customising/Page and tiddler layout customisation.tid @@ -1,7 +1,8 @@ -title: Page and tiddler layout customisation +created: 20141120125300000 +modified: 20201123173002935 tags: [[Customise TiddlyWiki]] -created: 201411201253 -modified: 201411201253 +title: Page and tiddler layout customisation +type: text/vnd.tiddlywiki One major feature of TiddlyWiki that many new users are unaware of is the degree to which TiddlyWiki can be customised, just by adding or removing SystemTags in key shadow tiddlers or in your own custom tiddlers. @@ -11,6 +12,8 @@ One major feature of TiddlyWiki that many new users are unaware of is the degree Once you know what you are doing, all of these things are actually pretty easy to do. +<<.from-version "5.1.23">> You can also create [[alternative page layouts|Alternative page layouts]] and switch between them. + ! Adding custom-made tiddlers to the user interface You can also create any tiddler you want and tag it with the appropriate SystemTag, and it will appear in that place. For example, if you create a tiddler 'Reminder to self', add the text 'This is a reminder' and tag it `$:/tags/EditTemplate`, the words 'This is a reminder' will appear inside every tiddler when you edit it. diff --git a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Layout.tid b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Layout.tid new file mode 100644 index 000000000..537ca1d91 --- /dev/null +++ b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_Layout.tid @@ -0,0 +1,9 @@ +caption: $:/tags/Layout +created: 20201123191935978 +description: marks alternative page layouts +modified: 20201123192158739 +tags: SystemTags +title: SystemTag: $:/tags/Layout +type: text/vnd.tiddlywiki + +The [[system tag|SystemTags]] `$:/tags/Layout` marks [[alternative page layouts|Alternative page layouts]] that can be switched to. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid index dc8e6b0e3..28d2c9e9a 100644 --- a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid @@ -1,11 +1,12 @@ created: 20201123113532200 -modified: 20201123143104394 +modified: 20201123172753436 tags: Widgets title: EventCatcherWidget type: text/vnd.tiddlywiki ! Introduction +<<.from-version "5.1.23">> The event catcher widget traps JavaScript events dispatched within its child content, and allows invoking a series of ActionWidgets in response to the events. In order for the events to be trapped they must: From 3e3f18556223dd93a49af245cbec7c23b7b17dfb Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 25 Nov 2020 09:44:48 +0000 Subject: [PATCH 1021/2376] Clarify behaviour of self closing tags --- .../tw5.com/tiddlers/wikitext/HTML in WikiText.tid | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid index d491a8700..412963adc 100644 --- a/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid @@ -1,6 +1,6 @@ caption: HTML created: 20131205160816081 -modified: 20161021102422842 +modified: 20201125094415933 tags: WikiText title: HTML in WikiText type: text/vnd.tiddlywiki @@ -22,6 +22,14 @@ To get the content of an HTML element to be parsed in block mode, the opening ta Without the two linebreaks, the tag content will be parsed in inline mode which means that block mode formatting such as wikitext tables, lists and headings is not recognised. +! Self closing elements + +The following tags are treated as 'void'. This means that `<tag>` is treated as if it were `<tag/>`, and that no terminating `</tag>` is needed (if one is provided it will be ignored and treated as plain text). + +* `<area>`, `<base>`, `<br>`, `<col>`, `<command>`, `<embed>`, `<hr>`, `<img>`, `<input>`, `<keygen>`, `<link>`, `<meta>`, `<param>`, `<source>`, `<track>`, `<wbr>` + +If you don’t close any other tag then it will behave as if the missing closing tag were at the end of the tiddler. + ! Attributes In an extension of conventional HTML syntax, attributes of elements/widgets can be specified in several different ways: From 94ffb50e047c47e37b1992ca8a9cecf8d7bcf255 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 25 Nov 2020 12:33:39 +0000 Subject: [PATCH 1022/2376] Fix dark mode event handling Previous code worked but this matches the spec, and works on iOS --- core/modules/info/platform.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/info/platform.js b/core/modules/info/platform.js index a73a5e5df..b9c140956 100644 --- a/core/modules/info/platform.js +++ b/core/modules/info/platform.js @@ -40,7 +40,7 @@ exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) { var mqList = window.matchMedia("(prefers-color-scheme: dark)"), getDarkModeTiddler = function() {return {title: "$:/info/darkmode", text: mqList.matches ? "yes" : "no"};}; infoTiddlerFields.push(getDarkModeTiddler()); - mqList.addEventListener("change", function(event) { + mqList.addListener(function(event) { updateInfoTiddlersCallback([getDarkModeTiddler()]); }); // Language From 64ac29adca05b0daaaa34b0bee183858ffa3967c Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 25 Nov 2020 13:58:54 +0000 Subject: [PATCH 1023/2376] Fix typo preventing filter run prefix modules from being cached This had a significant impact on performance. --- core/modules/filters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index 9a18eb2af..0beb86208 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -188,7 +188,7 @@ exports.getFilterOperators = function() { }; exports.getFilterRunPrefixes = function() { - if(!this.filterPrefixes) { + if(!this.filterRunPrefixes) { $tw.Wiki.prototype.filterRunPrefixes = {}; $tw.modules.applyMethods("filterrunprefix",this.filterRunPrefixes); } From e3bf1f43cfe78914525b2969b4aef2cde6671960 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 25 Nov 2020 14:07:01 +0000 Subject: [PATCH 1024/2376] Missed off previous commit 64ac29adc Thanks @saqimtiaz --- core/wiki/config/RegisterPluginTypes.multids | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/config/RegisterPluginTypes.multids b/core/wiki/config/RegisterPluginTypes.multids index f0e52acd5..0ea7e1a01 100644 --- a/core/wiki/config/RegisterPluginTypes.multids +++ b/core/wiki/config/RegisterPluginTypes.multids @@ -3,5 +3,5 @@ title: $:/config/RegisterPluginType/ plugin: yes theme: no language: no -info: no +info: yes import: no From 2267e31546271588b88e49c762f7d7482f678c0a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 25 Nov 2020 15:54:28 +0000 Subject: [PATCH 1025/2376] Fix eventcatcher to ensure variable values are strings I was getting some inconsistencies with filter operators that expect strings. --- core/modules/widgets/eventcatcher.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/modules/widgets/eventcatcher.js b/core/modules/widgets/eventcatcher.js index c0d691f5e..1f3d96688 100644 --- a/core/modules/widgets/eventcatcher.js +++ b/core/modules/widgets/eventcatcher.js @@ -58,26 +58,26 @@ EventWidget.prototype.render = function(parent,nextSibling) { // If we found one, copy the attributes as variables, otherwise exit if(selectedNode.matches(selector)) { $tw.utils.each(selectedNode.attributes,function(attribute) { - variables["dom-" + attribute.name] = attribute.value; + variables["dom-" + attribute.name] = attribute.value.toString(); }); //Add a variable with a popup coordinate string for the selected node variables["tv-popup-coords"] = "(" + selectedNode.offsetLeft + "," + selectedNode.offsetTop +"," + selectedNode.offsetWidth + "," + selectedNode.offsetHeight + ")"; //Add variables for offset of selected node - variables["tv-selectednode-posx"] = selectedNode.offsetLeft; - variables["tv-selectednode-posy"] = selectedNode.offsetTop; - variables["tv-selectednode-width"] = selectedNode.offsetWidth; - variables["tv-selectednode-height"] = selectedNode.offsetHeight; + variables["tv-selectednode-posx"] = selectedNode.offsetLeft.toString(); + variables["tv-selectednode-posy"] = selectedNode.offsetTop.toString(); + variables["tv-selectednode-width"] = selectedNode.offsetWidth.toString(); + variables["tv-selectednode-height"] = selectedNode.offsetHeight.toString(); //Add variables for event X and Y position relative to selected node selectedNodeRect = selectedNode.getBoundingClientRect(); - variables["event-fromselected-posx"] = event.clientX - selectedNodeRect.left; - variables["event-fromselected-posy"] = event.clientY - selectedNodeRect.top; + variables["event-fromselected-posx"] = (event.clientX - selectedNodeRect.left).toString(); + variables["event-fromselected-posy"] = (event.clientY - selectedNodeRect.top).toString(); //Add variables for event X and Y position relative to event catcher node catcherNodeRect = self.domNode.getBoundingClientRect(); - variables["event-fromcatcher-posx"] = event.clientX - catcherNodeRect.left; - variables["event-fromcatcher-posy"] = event.clientY - catcherNodeRect.top; + variables["event-fromcatcher-posx"] = (event.clientX - catcherNodeRect.left).toString(); + variables["event-fromcatcher-posy"] = (event.clientY - catcherNodeRect.top).toString(); } else { return false; } From 8320a55fef4b34be305568ae1dd930f5177a2f44 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Wed, 25 Nov 2020 17:27:31 +0100 Subject: [PATCH 1026/2376] fix titlebar line-height for chrome (#5122) --- themes/tiddlywiki/vanilla/base.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 2b2ce4ce9..0807c37bd 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1053,7 +1053,7 @@ button.tc-btn-invisible.tc-remove-tag-button { .tc-titlebar { font-weight: 300; font-size: 2.35em; - line-height: 1.3em; + line-height: 1.35em; color: <<colour tiddler-title-foreground>>; margin: 0; } From 9637a29e55d72c3533c3d92356fc9057974ce0e4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 26 Nov 2020 12:41:24 +0000 Subject: [PATCH 1027/2376] Rename widget.executeStartupTiddlers() to invokeActionsByTag() This method was introduced earlier in v5.1.23 in 5cc1600072f5aa50c8ff5f5d2e748d81a7067420 It is not in fact restricted to startup tiddlers. --- core/modules/startup/render.js | 2 +- core/modules/startup/startup.js | 6 +++--- core/modules/widgets/widget.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/modules/startup/render.js b/core/modules/startup/render.js index 7ec6ec444..fa4d21003 100644 --- a/core/modules/startup/render.js +++ b/core/modules/startup/render.js @@ -107,7 +107,7 @@ exports.startup = function() { $tw.rootWidget.domNodes = [$tw.pageContainer]; $tw.rootWidget.children = [$tw.pageWidgetNode]; // Run any post-render startup actions - $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction/PostRender"); + $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction/PostRender"); }; })(); diff --git a/core/modules/startup/startup.js b/core/modules/startup/startup.js index b7897a5ce..781852cea 100755 --- a/core/modules/startup/startup.js +++ b/core/modules/startup/startup.js @@ -64,12 +64,12 @@ exports.startup = function() { document: $tw.browser ? document : $tw.fakeDocument }); // Execute any startup actions - $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction"); + $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction"); if($tw.browser) { - $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction/Browser"); + $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction/Browser"); } if($tw.node) { - $tw.rootWidget.executeStartupTiddlers("$:/tags/StartupAction/Node"); + $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction/Node"); } // Kick off the language manager and switcher $tw.language = new $tw.Language(); diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index bd66438e2..22112a516 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -574,10 +574,10 @@ Widget.prototype.invokeActionString = function(actions,triggeringWidget,event,va /* Execute action tiddlers by tag */ -Widget.prototype.executeStartupTiddlers = function(tag) { +Widget.prototype.invokeActionsByTag = function(tag,event,variables) { var self = this; $tw.utils.each(self.wiki.filterTiddlers("[all[shadows+tiddlers]tag[" + tag + "]!has[draft.of]]"),function(title) { - self.invokeActionString(self.wiki.getTiddlerText(title),self); + self.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables); }); }; From 2175be27b0ceac691f711d7c45994ce97aaa0267 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Fri, 27 Nov 2020 22:37:11 +0100 Subject: [PATCH 1028/2376] Ensure that we always fetch the latest sha bypassing cache. (#5126) Ensure that we always fetch the latest sha bypassing cache. --- core/modules/savers/github.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/savers/github.js b/core/modules/savers/github.js index 2d59f45ff..2276a2346 100644 --- a/core/modules/savers/github.js +++ b/core/modules/savers/github.js @@ -31,7 +31,8 @@ GitHubSaver.prototype.save = function(text,method,callback) { headers = { "Accept": "application/vnd.github.v3+json", "Content-Type": "application/json;charset=UTF-8", - "Authorization": "Basic " + window.btoa(username + ":" + password) + "Authorization": "Basic " + window.btoa(username + ":" + password), + "If-None-Match": "" }; // Bail if we don't have everything we need if(!username || !password || !repo || !filename) { From 86a9f922bf8f424703d4fee6a730659cec08f240 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 27 Nov 2020 22:52:26 +0100 Subject: [PATCH 1029/2376] Update LayoutSwitcher.tid (#5125) --- core/ui/LayoutSwitcher.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/LayoutSwitcher.tid b/core/ui/LayoutSwitcher.tid index 11c0c01a0..28bc19158 100644 --- a/core/ui/LayoutSwitcher.tid +++ b/core/ui/LayoutSwitcher.tid @@ -4,7 +4,7 @@ caption: {{$:/language/ControlPanel/LayoutSwitcher/Caption}} <$linkcatcher to="$:/layout"> <div class="tc-chooser"> -<$list filter="[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[sort[name]]"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]"> <$list filter="[{$:/layout}!has[text]]" variable="ignore" emptyMessage=""" <$set name="cls" filter="[all[current]field:title{$:/layout}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field="name"/>'' - <$transclude field="description"/></$link></div> </$set> From 8005c91e79cf1cbafe7aee64ff99398149d83c18 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 08:26:47 +0100 Subject: [PATCH 1030/2376] Correctly add EventListener 'click' for popup-handling in new windows (#5127) --- core/modules/startup/windows.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/modules/startup/windows.js b/core/modules/startup/windows.js index 16b8f0316..5c867f74d 100644 --- a/core/modules/startup/windows.js +++ b/core/modules/startup/windows.js @@ -84,11 +84,8 @@ exports.startup = function() { name: "keydown", handlerObject: $tw.keyboardManager, handlerMethod: "handleKeydownEvent" - },{ - name: "click", - handlerObject: $tw.popup, - handlerMethod: "handleEvent" }]); + srcWindow.document.documentElement.addEventListener("click",$tw.popup,true); srcWindow.haveInitialisedWindow = true; }); // Close open windows when unloading main window From 09d7a77f1b5ecf6b3519de13f960223b8ab8e864 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 15:07:12 +0100 Subject: [PATCH 1031/2376] Add default "tiddlywiki" styles to CodeMirror and Highlight.js (#5128) * Update styles.tid * Update styles.tid * Update theme.tid * Delete cm-theme-tiddlywiki.tid --- .../tiddlers/cm-theme-tiddlywiki.tid | 56 ------------- .../tiddlywiki/codemirror/config/theme.tid | 2 +- plugins/tiddlywiki/codemirror/styles.tid | 80 ++++++++++++++++++- plugins/tiddlywiki/highlight/styles.tid | 80 ++++++++++++++++++- 4 files changed, 159 insertions(+), 59 deletions(-) delete mode 100644 editions/codemirrordemo/tiddlers/cm-theme-tiddlywiki.tid diff --git a/editions/codemirrordemo/tiddlers/cm-theme-tiddlywiki.tid b/editions/codemirrordemo/tiddlers/cm-theme-tiddlywiki.tid deleted file mode 100644 index 501b20b9a..000000000 --- a/editions/codemirrordemo/tiddlers/cm-theme-tiddlywiki.tid +++ /dev/null @@ -1,56 +0,0 @@ -title: $:/themes/codemirror/tiddlywiki -tags: $:/tags/Stylesheet -module-type: codemirror-theme -name: tiddlywiki - -.cm-s-tiddlywiki { - font-size: 1em; - line-height: 1.5em; - letter-spacing: 0.3px; - word-spacing: 1px; - background: <<colour page-background>>; - color: <<colour foreground>>; -} -.cm-s-tiddlywiki .CodeMirror-lines { - padding: 8px 0; -} -.cm-s-tiddlywiki .CodeMirror-gutters { - background-color: <<colour page-background>>; - padding-right: 10px; - z-index: 3; - border: none; -} -.cm-s-tiddlywiki div.CodeMirror-cursor { - border-left: 3px solid <<colour very-muted-foreground>>; -} -.cm-s-tiddlywiki .CodeMirror-activeline-background { - background: <<colour tiddler-editor-fields-even>>; -} -.cm-s-tiddlywiki .CodeMirror-selected { - background: <<colour muted-foreground>>; -} -.cm-s-tiddlywiki .cm-comment { - font-style: italic; - color: <<colour muted-foreground>>; -} -.cm-s-tiddlywiki .CodeMirror-linenumber { - color: italic; -} - -.cm-s-tiddlywiki span.cm-atom, .cm-s-tiddlywiki span.cm-number, .cm-s-tiddlywiki span.cm-keyword, .cm-s-tiddlywiki span.cm-variable, .cm-s-tiddlywiki span.cm-attribute, .cm-s-tiddlywiki span.cm-quote, .cm-s-tiddlywiki-light span.cm-hr, .cm-s-tiddlywiki-light span.cm-link { color: #063289; } - -.cm-s-tiddlywiki span.cm-property { color: #b29762; } -.cm-s-tiddlywiki span.cm-punctuation, .cm-s-tiddlywiki span.cm-unit, .cm-s-tiddlywiki span.cm-negative { color: #063289; } -.cm-s-tiddlywiki span.cm-string, .cm-s-tiddlywiki span.cm-operator { color: #1659df; } -.cm-s-tiddlywiki span.cm-positive { color: #896724; } - -.cm-s-tiddlywiki span.cm-variable-2, .cm-s-tiddlywiki span.cm-variable-3, .cm-s-tiddlywiki span.cm-type, .cm-s-tiddlywiki span.cm-string-2, .cm-s-tiddlywiki span.cm-url { color: #896724; } -.cm-s-tiddlywiki span.cm-def, .cm-s-tiddlywiki span.cm-tag, .cm-s-tiddlywiki span.cm-builtin, .cm-s-tiddlywiki span.cm-qualifier, .cm-s-tiddlywiki span.cm-header, .cm-s-tiddlywiki span.cm-em { color: #2d2006; } -.cm-s-tiddlywiki span.cm-bracket, .cm-s-tiddlywiki span.cm-comment { color: #b6ad9a; } - -/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ -/* .cm-s-tiddlywiki span.cm-error { background: #896724; color: #728fcb; } */ -.cm-s-tiddlywiki span.cm-error, .cm-s-tiddlywiki span.cm-invalidchar { color: #f00; } - -.cm-s-tiddlywiki span.cm-header { font-weight: normal; } -.cm-s-tiddlywiki .CodeMirror-matchingbracket { text-decoration: underline; color: #faf8f5 !important; } diff --git a/plugins/tiddlywiki/codemirror/config/theme.tid b/plugins/tiddlywiki/codemirror/config/theme.tid index 66eb3fce0..e0e25ba37 100644 --- a/plugins/tiddlywiki/codemirror/config/theme.tid +++ b/plugins/tiddlywiki/codemirror/config/theme.tid @@ -1,3 +1,3 @@ title: $:/config/codemirror/theme type: string -text: default +text: tiddlywiki diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index 869521839..135584b2a 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -1,5 +1,7 @@ title: $:/plugins/tiddlywiki/codemirror/styles tags: [[$:/tags/Stylesheet]] +module-type: codemirror-theme +name: tiddlywiki /* Make the editor resize to fit its content */ @@ -13,5 +15,81 @@ tags: [[$:/tags/Stylesheet]] .CodeMirror-scroll { overflow-x: auto; - overflow-y: hidden; + overflow-y: hidden; +} + +.cm-s-tiddlywiki { + color-profile: sRGB; + rendering-intent: auto; +} + +.cm-s-tiddlywiki.CodeMirror, .cm-s-tiddlywiki .CodeMirror-gutters { background-color: <<colour tiddler-editor-background>>; color: <<colour foreground>>; } +.cm-s-tiddlywiki .CodeMirror-gutters {background: <<colour tiddler-editor-background>>; border-right: 0px;} +.cm-s-tiddlywiki .CodeMirror-linenumber {color: <<colour primary>>;} +.cm-s-tiddlywiki .CodeMirror-cursor { border-left: 2px solid <<colour foreground>>; } +.cm-s-tiddlywiki div.CodeMirror-selected { background: <<colour selection-background>>; } +.cm-s-tiddlywiki .CodeMirror-selectedtext, +.cm-s-tiddlywiki .CodeMirror-selected, +.cm-s-tiddlywiki .CodeMirror-line::selection, +.cm-s-tiddlywiki .CodeMirror-line > span::selection, +.cm-s-tiddlywiki .CodeMirror-line > span > span::selection, +.cm-s-tiddlywiki .CodeMirror-line::-moz-selection, +.cm-s-tiddlywiki .CodeMirror-line > span::-moz-selection, +.cm-s-tiddlywiki .CodeMirror-line > span > span::-moz-selection { background: <<colour selection-background>>; } +.cm-s-tiddlywiki span.cm-comment { color: <<colour muted-foreground>>; font-style:italic; font-weight:normal; } +.cm-s-tiddlywiki .CodeMirror-activeline-background, .cm-s-tiddlywiki .CodeMirror-activeline-gutter .CodeMirror-linenumber { background: <<colour background>>; } +.cm-s-tiddlywiki .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: <<colour background>>; color: <<colour foreground>>; } +.cm-s-tiddlywiki .CodeMirror-matchingbracket { background: <<colour primary>>; color:<<colour foreground>> !important; } +.cm-s-tiddlywiki span.cm-matchhighlight { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} +.cm-s-tiddlywiki span.cm-searching { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} + + +.cm-s-tiddlywiki .CodeMirror-widget { + text-shadow: none; +} + +.cm-s-tiddlywiki .cm-header { color: #586e75; } +.cm-s-tiddlywiki .cm-quote { color: #93a1a1; } + +.cm-s-tiddlywiki .cm-keyword { color: #cb4b16; } +.cm-s-tiddlywiki .cm-atom { color: #d33682; } +.cm-s-tiddlywiki .cm-number { color: #d33682; } +.cm-s-tiddlywiki .cm-def { color: #2aa198; } + +.cm-s-tiddlywiki .cm-variable { color: #839496; } +.cm-s-tiddlywiki .cm-variable-2 { color: #b58900; } +.cm-s-tiddlywiki .cm-variable-3, .cm-s-tiddlywiki .cm-type { color: #6c71c4; } + +.cm-s-tiddlywiki .cm-property { color: #2aa198; } +.cm-s-tiddlywiki .cm-operator { color: #6c71c4; } + +.cm-s-tiddlywiki .cm-comment { color: #586e75; font-style:italic; } + +.cm-s-tiddlywiki .cm-string { color: #859900; } +.cm-s-tiddlywiki .cm-string-2 { color: #b58900; } + +.cm-s-tiddlywiki .cm-meta { color: #859900; } +.cm-s-tiddlywiki .cm-qualifier { color: #b58900; } +.cm-s-tiddlywiki .cm-builtin { color: #d33682; } +.cm-s-tiddlywiki .cm-bracket { color: #cb4b16; } +.cm-s-tiddlywiki .CodeMirror-matchingbracket { color: #859900; } +.cm-s-tiddlywiki .CodeMirror-nonmatchingbracket { color: #dc322f; } +.cm-s-tiddlywiki .cm-tag { color: #93a1a1; } +.cm-s-tiddlywiki .cm-attribute { color: #2aa198; } +.cm-s-tiddlywiki .cm-hr { + color: transparent; + border-top: 1px solid #586e75; + display: block; +} +.cm-s-tiddlywiki .cm-link { color: #93a1a1; cursor: pointer; } +.cm-s-tiddlywiki .cm-special { color: #6c71c4; } +.cm-s-tiddlywiki .cm-em { + color: #999; + text-decoration: underline; + text-decoration-style: dotted; +} +.cm-s-tiddlywiki .cm-error, +.cm-s-tiddlywiki .cm-invalidchar { + color: #586e75; + border-bottom: 1px dotted #dc322f; } diff --git a/plugins/tiddlywiki/highlight/styles.tid b/plugins/tiddlywiki/highlight/styles.tid index 1e55917ed..ac22a85b4 100644 --- a/plugins/tiddlywiki/highlight/styles.tid +++ b/plugins/tiddlywiki/highlight/styles.tid @@ -1,4 +1,82 @@ title: $:/plugins/tiddlywiki/highlight/styles tags: [[$:/tags/Stylesheet]] -.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8;-webkit-text-size-adjust:none}.hljs-comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:teal}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.scss .hljs-preprocessor{color:#900;font-weight:bold}.hljs-list .hljs-keyword,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rule .hljs-property,.django .hljs-tag .hljs-keyword{color:navy;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.hljs-name{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.clojure .hljs-keyword,.scheme .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa} \ No newline at end of file +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: <<colour tiddler-editor-background>>; + color: <<colour foreground>>; + -webkit-text-size-adjust:none +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} From 7d2703bffb1365b7691af9c24480d524073fe595 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 15:07:46 +0100 Subject: [PATCH 1032/2376] Make tiddler-editor iframe same color as tiddler background (#5132) --- themes/tiddlywiki/vanilla/base.tid | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 0807c37bd..e32a4b45e 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1164,12 +1164,20 @@ button.tc-btn-invisible.tc-remove-tag-button { .tc-tiddler-frame iframe.tc-edit-texteditor { padding: 3px 3px 3px 3px; border: 1px solid <<colour tiddler-editor-border>>; - background-color: <<colour tiddler-editor-background>>; line-height: 1.3em; -webkit-appearance: none; font-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}}; } +.tc-tiddler-frame input.tc-edit-texteditor, +.tc-tiddler-frame textarea.tc-edit-texteditor { + background-color: <<colour tiddler-editor-background>>; +} + +.tc-tiddler-frame iframe.tc-edit-texteditor { + background-color: <<colour background>>; +} + .tc-tiddler-frame .tc-binary-warning { width: 100%; height: 5em; From c655ec5469f16c7c8d83615618ce87a633b136fc Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 15:08:16 +0100 Subject: [PATCH 1033/2376] Remove background-colors from framed engine (#5131) --- core/modules/editor/engines/framed.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 4d6113fae..08ff0ffd7 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -42,7 +42,6 @@ function FramedEngine(options) { this.iframeNode.style.border = "none"; this.iframeNode.style.padding = "0"; this.iframeNode.style.resize = "none"; - this.iframeNode.style["background-color"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText("$:/palette"),"tiddler-editor-background"); this.iframeDoc.body.style.margin = "0"; this.iframeDoc.body.style.padding = "0"; this.widget.domNodes.push(this.iframeNode); @@ -100,7 +99,6 @@ FramedEngine.prototype.copyStyles = function() { this.domNode.style.display = "block"; this.domNode.style.width = "100%"; this.domNode.style.margin = "0"; - this.domNode.style["background-color"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText("$:/palette"),"tiddler-editor-background"); // In Chrome setting -webkit-text-fill-color overrides the placeholder text colour this.domNode.style["-webkit-text-fill-color"] = "currentcolor"; }; From 98e60758a9b3e934596fba98046c2277db3826bc Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 28 Nov 2020 17:32:42 +0000 Subject: [PATCH 1034/2376] Updated Release Note --- .../prerelease/tiddlers/Release 5.1.23.tid | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index b50e2116a..9446aa892 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20201018143621963 -modified: 20201018143621963 +created: 20201128173201204 +modified: 20201128173201204 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -9,7 +9,7 @@ type: text/vnd.tiddlywiki ! Major Improvements -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4725]] support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4725]] support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns * [[New|https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1]] [[Consent Banner Plugin]] to help make websites compliant with cookie legislation by displaying a consent banner * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] [[JSZip Plugin]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items @@ -20,15 +20,25 @@ type: text/vnd.tiddlywiki * New Arabic (Palestine) translation * Improved Catalan translation * Improved Chinese translation +* Improved Dutch translation +* Improved French translation +* Improved German translation ! Performance Improvements * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4659]] templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4954]] ListWidget to not initialize parsers for blank `emptyMessage` attributes. -* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/4200]] `story.js` to remove dependency on `wiki.js` for story start up and navigator. +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4954]] ListWidget to not initialize parsers for blank `emptyMessage` attributes +* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/4200]] `story.js` to remove dependency on `wiki.js` for story start up and navigator ! Usability Improvements +* Several improvements to the import mechanism: +** [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/527638d5e60114653385ed39dc55c736a67e58d2]] status messages in the import listing +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5067]] colour coding for import items that will overwrite existing tiddlers, and for other warnings +** [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4937]] the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5037]] new ActionConfirm widget +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5092]] new "Desert Sand" palette +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5100]] new "Cupertino Dark" palette * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c]] "Solarized Dark" palette * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/274a07b4fd2ca2d1b95c8ddf52fe055c44260d9b]]) the Vanilla theme to optionally use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration @@ -36,34 +46,44 @@ type: text/vnd.tiddlywiki * [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4791]] a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4937]] the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist. * Added keyboard support: -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4909]] keyboard support for cycling through the tabs in $:/AdvancedSearch. -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4921]] keyboard support for navigating the field name dropdown in the Edit Template. -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4989]] keyboard support or navigating the `type` field input in the Edit Template. -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4919]] keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template. -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4927]] keyboard shortcut for saving the wiki. -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4978]] keyboard shortcut for deleting a field in the Edit Template. +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4909]] keyboard support for cycling through the tabs in $:/AdvancedSearch +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4921]] keyboard support for navigating the field name dropdown in the Edit Template +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4989]] keyboard support or navigating the `type` field input in the Edit Template +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4919]] keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4927]] keyboard shortcut for saving the wiki +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4978]] keyboard shortcut for deleting a field in the Edit Template * [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9]] normalize.css's styling of search input fields and [[updated|https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a]] to a modern fork of normalize.css +* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b]] unneeded editor toolbar buttons when editing SVG tiddlers +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5089]] global keyboard shortcut for switching layouts +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] the [[CodeMirror Plugin]] and the [[Hightlight Plugin]] to use palette colours ! Filter Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5080]] [[power Operator]] and [[log Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b]] new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4785]] new [[format Operator]] for formatting dates * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4991]] new [[draft Operator|is Operator]] to check if a tiddler is a draft of another tiddler. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4973]] new [[search-replace Operator]] to search and replace in strings. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4948]] new [[enlist-input Operator]] to parse its input titles as a title lists. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value . -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4918]] new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4959]] new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4990]] new [[toggle Operator]] to toggle a title in a list. - +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4991]] new [[draft Operator|is Operator]] to check if a tiddler is a draft of another tiddler +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4973]] new [[search-replace Operator]] to search and replace in strings +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4948]] new [[enlist-input Operator]] to parse its input titles as a title lists +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4918]] new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4959]] new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4990]] new [[toggle Operator]] to toggle a title in a list +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5021]] new [[cycle Operator]] ! Hackability Improvements +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5091]] ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5086]] EventCatcherWidget for low level event handling +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5087]] the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5027]] modals to incorporate a NavigatorWidget so that links work as expected +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1b31c25ea77ee4dce86a9aac4375337423ebd3a6]] new LogWidget and ActionLogWidget to help debugging +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5014]] support for ''disabled'' attribute to EditWidget, EditTextWidget, CheckboxWidget, RadioWidget and RangeWidget +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5010]] support for ''disabled'' attribute to ButtonWidget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10]] the [[Table-of-Contents Macros]] to support custom link targets * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f]] the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) * [[Adedd|https://github.com/Jermolene/TiddlyWiki5/pull/4777]] new Hyperdrive saver for use with Beaker Browser v1.0 @@ -82,26 +102,31 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4724]] original event to `tm-navigate` event * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852]] the password prompt to enable it to be customised * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e]] syncer to enable syncadaptors to customise the login prompt -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4979]] support for switching page templates. -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/a1b486436e9278078c524c6aa11f7f4de6cbc877]] the [[tabs Macro]] to support `actions` and `explicitState` attributes. -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4906]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/pull/4907]]) filters used for syncing on node.js and saving the single file version to exclude multiple story lists and history lists based on their prefix, as well as multiple tiddlers that might be used for the import process. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420]] post-render startup actions. +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4979]] support for switching page templates +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/a1b486436e9278078c524c6aa11f7f4de6cbc877]] the [[tabs Macro]] to support `actions` and `explicitState` attributes +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4906]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/pull/4907]]) filters used for syncing on node.js and saving the single file version to exclude multiple story lists and history lists based on their prefix, as well as multiple tiddlers that might be used for the import process +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420]] post-render startup actions * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f7f55e8eff8b172d8fd04f095781efa2420b1be6]] support for username/password parameters for `tm-login` message -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4914]] [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2]] support for the content type `image/jpg`. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4908]] support for an override saver. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4923]] utility CSS classes to replace use of ` ` to introduce visual separation. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4952]] a keyboard shortcut to change the sidebar layout. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4983]] option to configure the tag used for TableOfContents in the menubar. -* [[Modified|https://github.com/Jermolene/TiddlyWiki5/pull/4971]] the KeyboardWidget to not trap keys if there are no actions to be invoked. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4975]] buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary`. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4915]] support for named filter run prefixes. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4964]] support for multiple operands for filter operators. -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4985]] all instance of the [[tabs Macro]] in the core to use the explicitState attribute. -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5000]] support for the `meta` key as a modifier in actions. +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4914]] [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2]] support for the content type `image/jpg` +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4908]] support for an override saver +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4923]] utility CSS classes to replace use of ` ` to introduce visual separation +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4952]] a keyboard shortcut to change the sidebar layout +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4983]] option to configure the tag used for TableOfContents in the menubar +* [[Modified|https://github.com/Jermolene/TiddlyWiki5/pull/4971]] the KeyboardWidget to not trap keys if there are no actions to be invoked +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4975]] buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary` +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4915]] support for named filter run prefixes +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4964]] support for multiple operands for filter operators +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4985]] all instance of the [[tabs Macro]] in the core to use the explicitState attribute +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5000]] support for the `meta` key as a modifier in actions +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c854e518faa2d2661b7b7278634b10607ab0a5f5]] support for $:/info/darkmode to the InfoMechanism, reflecting the browser dark mode vs. light mode setting ! Bug Fixes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5126]] "409 conflict" errors with the ~GitHub saver when saving within 60 seconds of the last save +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5088]] incorrect behaviour of default values with [[lookup Operator]] +* [[Restored|https://github.com/Jermolene/TiddlyWiki5/pull/4987]] behaviour of system tiddler syncing with the client server configuration. By default, changes to system tiddlers are not synced from the server to the client, restoring the behaviour from v5.1.21 and earlier. Bidirectional syncing of system tiddlers can be enabled with the configuration tiddler $:/config/SyncSystemTiddlersFromServer +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/cc3462999b80461fe30b8f4b4f272ccfbbb78b35]] content type of imported `.tid` files that do not have a `type` field * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4632]] hover effect for search dropdown items * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4584]] restored missing parameter to `saveTiddler()` method of syncadaptors * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04]] MakeLibraryCommand to skip non-directories @@ -130,12 +155,14 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4751]] a `plugin-priority` field to the TiddlyWeb plugin so that language plugins can override its language strings * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4853]] bug whereby joining an empty list would not return an empty list * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/59f233cd46616646fa8889f65aa9cc7d704d8c9a]] bug exporting tiddlers with double quoted titles -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4900]] bug with syncing plugin tiddlers. -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/4877891980f077c6c31e99cc6a9eb45b5d1230e1]] bug with the position of the tiddler title when there is no icon in use. -* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/commit/3153c588ecddfdc97cc8289720d36b1fb15ef236]] autosave in the upgrade wizard. -* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/pull/4938]] saving of `$:/temp` tiddlers in single file wikis. -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4839]] a bug with the `sortan` filter operator when used with date fields. -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4947]] a bug for location hashes that contain a `#` character. +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4900]] bug with syncing plugin tiddlers +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/4877891980f077c6c31e99cc6a9eb45b5d1230e1]] bug with the position of the tiddler title when there is no icon in use +* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/commit/3153c588ecddfdc97cc8289720d36b1fb15ef236]] autosave in the upgrade wizard +* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/pull/4938]] saving of `$:/temp` tiddlers in single file wikis +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4839]] a bug with the `sortan` filter operator when used with date fields +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4947]] a bug for location hashes that contain a `#` character +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5055]] default branch to ''main'' for saving to ~GitHub +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/7327a3fb92fa2ae17d7264c66ab0409d43b18fdc]] shadow tiddlers not refreshing when their plugin is deleted or modified ! Plugin Improvements @@ -153,7 +180,7 @@ type: text/vnd.tiddlywiki ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebreaks ** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4771]] to add `rel="noopener noreferrer"` to external links. +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4771]] to add `rel="noopener noreferrer"` to external links * [[Amazon Web Services Plugin]] ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes * ~BibTeX Plugin @@ -161,9 +188,9 @@ type: text/vnd.tiddlywiki * Menubar Plugin ** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4974]] so the top margin of the side bar adjusts to the height of the menu * Dynannotate Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f]] examples of usage in the View Template. +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f]] examples of usage in the View Template * External Attachments Plugin -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4549]] a bug with relative paths in the External Attachments plugin. +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4549]] a bug with relative paths in the External Attachments plugin ! Contributors From 62a2a0e5796e6ceef9e985186cb88a023233b189 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 22:13:18 +0100 Subject: [PATCH 1035/2376] Fix typo in vanilla/base (#5135) --- themes/tiddlywiki/vanilla/base.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index e32a4b45e..2010b45e6 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1175,7 +1175,7 @@ button.tc-btn-invisible.tc-remove-tag-button { } .tc-tiddler-frame iframe.tc-edit-texteditor { - background-color: <<colour background>>; + background-color: <<colour tiddler-background>>; } .tc-tiddler-frame .tc-binary-warning { From 28724138d11c6db25e1cd14e6a24d609228c726b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 22:21:53 +0100 Subject: [PATCH 1036/2376] Small update for better readability for CupertinoDark palette (#5134) --- core/palettes/CupertinoDark.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index b4f8f12aa..44ad38e8b 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -21,7 +21,7 @@ download-background: <<colour primary>> download-foreground: <<colour foreground>> dragger-background: <<colour foreground>> dragger-foreground: <<colour background>> -dropdown-background: #464646 +dropdown-background: <<colour tiddler-info-background>> dropdown-border: <<colour dropdown-background>> dropdown-tab-background-selected: #3F638B dropdown-tab-background: #323232 From b3cbd7d7338925e57ede258a5a5bc9017794b79f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 22:22:32 +0100 Subject: [PATCH 1037/2376] Add TiddlySpot-ReadOnly Message-Box to Tiddlyspot Saving Panel (#5133) * Add message box to TiddlySpot Saving panel * add readonly message --- core/language/en-GB/ControlPanel.multids | 1 + core/ui/ControlPanel/Saving/TiddlySpot.tid | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 852197083..50f77b40f 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -126,6 +126,7 @@ Saving/TiddlySpot/Filename: Upload Filename Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.// Saving/TiddlySpot/Password: Password +Saving/TiddlySpot/ReadOnly: ~TiddlySpot service may currently be available as read only. Please see http://tiddlyspot.com/ for details Saving/TiddlySpot/ServerURL: Server URL Saving/TiddlySpot/UploadDir: Upload Directory Saving/TiddlySpot/UserName: Wiki Name diff --git a/core/ui/ControlPanel/Saving/TiddlySpot.tid b/core/ui/ControlPanel/Saving/TiddlySpot.tid index 2497b300e..dad217251 100644 --- a/core/ui/ControlPanel/Saving/TiddlySpot.tid +++ b/core/ui/ControlPanel/Saving/TiddlySpot.tid @@ -20,6 +20,12 @@ http://$(userName)$.tiddlyspot.com/$path$/ </$reveal> \end +<div class="tc-message-box"> + +<<lingo ReadOnly>> + +</div> + <<lingo Description>> |<<lingo UserName>> |<$edit-text tiddler="$:/UploadName" default="" tag="input"/> | @@ -34,4 +40,4 @@ http://$(userName)$.tiddlyspot.com/$path$/ |<<lingo UploadDir>> |<$edit-text tiddler="$:/UploadDir" default="." tag="input"/> | |<<lingo BackupDir>> |<$edit-text tiddler="$:/UploadBackupDir" default="." tag="input"/> | -<<lingo TiddlySpot/Hint>> \ No newline at end of file +<<lingo TiddlySpot/Hint>> From eb7f59a8555fe73af250d56914c2d07b2c0f7205 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 28 Nov 2020 22:24:01 +0100 Subject: [PATCH 1038/2376] Make "tc-dirty" update also on external windows (#5129) * Update windows.js * Update saver-handler.js * Update saver-handler.js --- core/modules/saver-handler.js | 4 ++++ core/modules/startup/windows.js | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/modules/saver-handler.js b/core/modules/saver-handler.js index a4b7f4a4e..e2ac21361 100644 --- a/core/modules/saver-handler.js +++ b/core/modules/saver-handler.js @@ -197,8 +197,12 @@ SaverHandler.prototype.isDirty = function() { Update the document body with the class "tc-dirty" if the wiki has unsaved/unsynced changes */ SaverHandler.prototype.updateDirtyStatus = function() { + var self = this; if($tw.browser) { $tw.utils.toggleClass(document.body,"tc-dirty",this.isDirty()); + $tw.utils.each($tw.windows,function(win) { + $tw.utils.toggleClass(win.document.body,"tc-dirty",self.isDirty()); + }); } }; diff --git a/core/modules/startup/windows.js b/core/modules/startup/windows.js index 5c867f74d..75786d026 100644 --- a/core/modules/startup/windows.js +++ b/core/modules/startup/windows.js @@ -19,7 +19,7 @@ exports.after = ["startup"]; exports.synchronous = true; // Global to keep track of open windows (hashmap by title) -var windows = {}; +$tw.windows = {}; exports.startup = function() { // Handle open window message @@ -44,7 +44,7 @@ exports.startup = function() { catch(e) { return; } - windows[title] = srcWindow; + $tw.windows[title] = srcWindow; // Check for reopening the same window if(srcWindow.haveInitialisedWindow) { return; @@ -54,7 +54,7 @@ exports.startup = function() { srcDocument.close(); srcDocument.title = windowTitle; srcWindow.addEventListener("beforeunload",function(event) { - delete windows[title]; + delete $tw.windows[title]; $tw.wiki.removeEventListener("change",refreshHandler); },false); // Set up the styles @@ -90,7 +90,7 @@ exports.startup = function() { }); // Close open windows when unloading main window $tw.addUnloadTask(function() { - $tw.utils.each(windows,function(win) { + $tw.utils.each($tw.windows,function(win) { win.close(); }); }); From e54f3368e903d54be83346b456e609cd380fe53e Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sat, 28 Nov 2020 21:43:09 +0000 Subject: [PATCH 1039/2376] Update contributors list in release note --- editions/prerelease/tiddlers/Release 5.1.23.tid | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 9446aa892..796757d73 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -202,6 +202,7 @@ type: text/vnd.tiddlywiki * [[@BramChen|https://github.com/BramChen]] * [[@BurningTreeC|https://github.com/BurningTreeC]] * [[@danielo515|https://github.com/danielo515]] +* [[@default-kramer|https://github.com/default-kramer]] * [[@ento|https://github.com/ento]] * [[@favadi|https://github.com/favadi]] * [[@fkohrt|https://github.com/fkohrt]] @@ -211,6 +212,7 @@ type: text/vnd.tiddlywiki * [[@idotobi|https://github.com/idotobi]] * [[@jdangerx|https://github.com/jdangerx]] * [[@jjduhamel|https://github.com/jjduhamel]] +* [[@kookma|https://github.com/kookma]] * [[@Kamal-Habash|https://github.com/Kamal-Habash]] * [[@Marxsal|https://github.com/Marxsal]] * [[@mocsa|https://github.com/mocsa]] @@ -218,6 +220,7 @@ type: text/vnd.tiddlywiki * [[@passuf|https://github.com/passuf]] * [[@pmario|https://github.com/pmario]] * [[@rmunn|https://github.com/rmunn]] +* [[@SmilyOrg|https://github.com/SmilyOrg]] * [[@saqimtiaz|https://github.com/saqimtiaz]] * [[@twMat|https://github.com/twMat]] -* [[@default-kramer|https://github.com/default-kramer]] +* [[@xcazin|https://github.com/xcazin]] From 12bb938463f6f3578970eeeab217b258a08187a3 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Sat, 28 Nov 2020 23:05:54 +0100 Subject: [PATCH 1040/2376] Corrected typo in contributor's name (#5138) --- editions/prerelease/tiddlers/Release 5.1.23.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 796757d73..f3b26ec57 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -216,7 +216,7 @@ type: text/vnd.tiddlywiki * [[@Kamal-Habash|https://github.com/Kamal-Habash]] * [[@Marxsal|https://github.com/Marxsal]] * [[@mocsa|https://github.com/mocsa]] -* [[@NicolasPeton|https://github.com/NicolasPeton]] +* [[@NicolasPetton|https://github.com/NicolasPetton]] * [[@passuf|https://github.com/passuf]] * [[@pmario|https://github.com/pmario]] * [[@rmunn|https://github.com/rmunn]] From a21428a33a74dcac8360752a624f1fcc4e4dae01 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sun, 29 Nov 2020 20:26:21 +0800 Subject: [PATCH 1041/2376] Add chinese translations for `Saving/TiddlySpot/ReadOnly` (#5139) --- languages/zh-Hans/ControlPanel.multids | 1 + languages/zh-Hant/ControlPanel.multids | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 41b94baf1..a29cd9a35 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -127,6 +127,7 @@ Saving/TiddlySpot/Filename: 上传文件名 Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //默认之服务器网址 `http://<wikiname>.tiddlyspot.com/store.cgi`,可改为定制之服务器网址,例如 `http://example.com/store.php`。// Saving/TiddlySpot/Password: 密码 +Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服务目前可能仅提供唯读。详见 http://tiddlyspot.com/ Saving/TiddlySpot/ServerURL: 服务器网址 Saving/TiddlySpot/UploadDir: 上传文件夹 Saving/TiddlySpot/UserName: 用户 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 5fb35f427..09c088e85 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -127,6 +127,7 @@ Saving/TiddlySpot/Filename: 上傳檔名 Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //預設之伺服器網址 `http://<wikiname>.tiddlyspot.com/store.cgi`,可改為自訂之伺服器網址,例如 `http://example.com/store.php`。// Saving/TiddlySpot/Password: 密碼 +Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服務目前可能僅提供唯讀。詳見 http://tiddlyspot.com/ Saving/TiddlySpot/ServerURL: 伺服器網址 Saving/TiddlySpot/UploadDir: 上傳資料夾 Saving/TiddlySpot/UserName: 帳號 From cc850d71516459383cde3c70449a7a0c6bfe8fd7 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 29 Nov 2020 12:38:09 +0000 Subject: [PATCH 1042/2376] Fix typo in list macro See discussion https://github.com/Jermolene/TiddlyWiki5/pull/3710#issuecomment-735295319 --- core/wiki/macros/list.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/wiki/macros/list.tid b/core/wiki/macros/list.tid index 01b527a07..cb25a7a88 100644 --- a/core/wiki/macros/list.tid +++ b/core/wiki/macros/list.tid @@ -39,7 +39,6 @@ tags: $:/tags/Macro </div> </$droppable> </$list> -</$type$> <$tiddler tiddler=""> <$droppable actions=<<list-links-draggable-drop-actions>> tag="div" enable=<<tv-enable-drag-and-drop>>> <div class="tc-droppable-placeholder"> @@ -48,6 +47,7 @@ tags: $:/tags/Macro <div style="height:0.5em;"/> </$droppable> </$tiddler> +</$type$> </$vars> </span> \end From ce937595d71e78a2470eaf600bbda339c9a02cb5 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 29 Nov 2020 13:52:50 +0100 Subject: [PATCH 1043/2376] Add Button to remove tags from tiddlers $:/config/NewTiddler/Tags and $:/config/NewJournal/Tags (#5140) * Update Basics.tid * Update ControlPanel.multids * Update Basics.tid * Update ControlPanel.multids * Update ControlPanel.multids * Update ControlPanel.multids --- core/language/en-GB/ControlPanel.multids | 2 ++ core/ui/ControlPanel/Basics.tid | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 50f77b40f..54f0d4050 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -17,6 +17,8 @@ Basics/NewJournal/Tags/Prompt: Tags for new journal tiddlers Basics/NewTiddler/Title/Prompt: Title of new tiddlers Basics/NewTiddler/Tags/Prompt: Tags for new tiddlers Basics/OverriddenShadowTiddlers/Prompt: Number of overridden shadow tiddlers +Basics/RemoveTags: Update to current format +Basics/RemoveTags/Hint: Update the tags configuration to the latest format Basics/ShadowTiddlers/Prompt: Number of shadow tiddlers Basics/Subtitle/Prompt: Subtitle Basics/SystemTiddlers/Prompt: Number of system tiddlers diff --git a/core/ui/ControlPanel/Basics.tid b/core/ui/ControlPanel/Basics.tid index 43f621901..4897d232a 100644 --- a/core/ui/ControlPanel/Basics.tid +++ b/core/ui/ControlPanel/Basics.tid @@ -26,8 +26,8 @@ caption: {{$:/language/ControlPanel/Basics/Caption}} |<$link to="$:/language/DefaultNewTiddlerTitle"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler="$:/language/DefaultNewTiddlerTitle" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Title"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler="$:/config/NewJournal/Title" default="" tag="input"/> | |<$link to="$:/config/NewJournal/Text"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler="$:/config/NewJournal/Text" tag="textarea" class="tc-edit-texteditor" default=""/> | -|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewTiddler/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}</$vars> | -|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewJournal/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}</$vars> | +|<$link to="$:/config/NewTiddler/Tags"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewTiddler/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}<$list filter="[<currentTiddler>tags[]] +[limit[1]]" variable="ignore"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field="text" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=""/></$button></$list></$vars> | +|<$link to="$:/config/NewJournal/Tags"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler="$:/config/NewJournal/Tags" tagField="text">{{||$:/core/ui/EditTemplate/tags}}<$list filter="[<currentTiddler>tags[]] +[limit[1]]" variable="ignore"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field="text" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=""/></$button></$list></$vars> | |<$link to="$:/config/AutoFocus"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} | |<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} | |<<lingo Tiddlers/Prompt>> |<<show-filter-count "[!is[system]sort[title]]">> | From 5887c6621ece5aa3652c420309f00bee2d39897c Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Sun, 29 Nov 2020 22:45:39 +0700 Subject: [PATCH 1044/2376] Create "Filter Run Prefix (Examples)" tiddler (#5144) Move the `+` vs `:intersection` example into a separate Examples tiddler which can be expanded on later. --- .../filters/syntax/Filter Expression.tid | 14 ++--------- .../syntax/Filter Run Prefix (Examples).tid | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index 57de4a9f9..fb2a1704e 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -37,6 +37,8 @@ In technical / logical terms: |`~run` |`:else[run]` |else |... ELSE run | ||`:intersection`|intersection of sets|| +For the difference between `+` and `:intersection`, see [[Filter Run Prefix (Examples)]]. + The input of a run is normally a list of all the non-[[shadow|ShadowTiddlers]] tiddler titles in the wiki (in no particular order). But the `+` prefix can change this: |Prefix|Input|h @@ -56,15 +58,3 @@ In order to remove `$:/baz` in any case, existing or not, simply use the `+` pre * <$link to="is Operator">`foo bar $:/baz +[!is[system]]`</$link> * <$link to="prefix Operator">`foo bar $:/baz +[!prefix[$:/]]`</$link> - -There is also a difference between the `:intersection` and `+` prefixes due to varying inputs. - -The `+` prefix should be thought of as an "AND" in formal logic, e.g. "give me all titles that satisfy condition A ''and'' condition B". But it's not suitable for all cases; if condition B uses a filter operator that replaces its input, then it will be difficult to use the `+` prefix. For example, if you wanted to find out what tags two tiddlers have in common, you might try to write a filter expression like: - -* <$link to="tags Operator">`[[field Operator]tags[]] +[[compare Operator]tags[]]`</$link> - -But that won't work, because the second filter run will end up throwing away its input and replacing it with an input consisting of the single title `[[compare Operator]]`. So the result you'd get from that filter expression would be just the tags of the `compare Operator` tiddler. - -For cases like this, the `:intersection` prefix is what you need. It takes the filter output so far, //sets it aside// in temporary storage, and starts the next filter run with all tiddler titles as input. Then once the latest filter run has completed, it takes the latest output, compares it to the set-aside output, and produces a new output that contains only titles that appeared in both the set-aside output and the latest output. So to get only the tags that the `field Operator` and `compare Operator` tiddlers have in common, you would write a filter expresison like this: - -* <$link to="tags Operator">`[[field Operator]tags[]] :intersection[[compare Operator]tags[]]`</$link> diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid new file mode 100644 index 000000000..eb88c339b --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid @@ -0,0 +1,25 @@ +created: 20201117073343969 +modified: 20201117074106350 +tags: [[Filter Syntax]] +title: Filter Run Prefix (Examples) + +!! Difference between `+` and `:intersection` + +The `+` prefix should be thought of as an "AND" in formal logic, e.g. "give me all titles that satisfy condition A ''and'' condition B". But it's not suitable for all cases; if condition B uses a filter operator that replaces its input, then it will be difficult to use the `+` prefix. For example, if you wanted to find out what tags two tiddlers have in common, you might try to write a filter expression like: + +* <$link to="tags Operator">`[[field Operator]tags[]] +[[compare Operator]tags[]]`</$link> + +But that won't work, because the second filter run will end up throwing away its input and replacing it with an input consisting of the single title `[[compare Operator]]`. So the result you'd get from that filter expression would be just the tags of the `compare Operator` tiddler. + +For cases like this, the `:intersection` prefix is what you need. It takes the filter output so far, //sets it aside//, and starts the next filter run with all tiddler titles as input. Then once the latest filter run has completed, it takes the latest output, compares it to the set-aside output, and produces a new output that contains only titles that appeared in both the set-aside output and the latest output. So to get only the tags that the `field Operator` and `compare Operator` tiddlers have in common, you would write a filter expression like this: + +* <$link to="tags Operator">`[[field Operator]tags[]] :intersection[[compare Operator]tags[]]`</$link> + +The following examples use the [[field Operator]] and [[compare Operator]] tiddlers and their respective tags. + +<<.operator-example 1 "[[field Operator]tags[]]">> +<<.operator-example 2 "[[compare Operator]tags[]]">> + +<<.operator-example 3 "[[field Operator]tags[]] +[[compare Operator]tags[]]" """The "field Operator" tiddler's tags are lost, so only the "compare Operator" tiddler's tags are returned""">> + +<<.operator-example 4 "[[field Operator]tags[]] :intersection[[compare Operator]tags[]]" """Returns the tags that both tiddlers have in common""">> From 4d9e6831bbbdcc68cb428c930e979012f43c8b8a Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 29 Nov 2020 18:32:22 +0000 Subject: [PATCH 1045/2376] Rename "references" to "backlinks" in the tiddler info panel (#5143) * Rename "references" to "backlinks" in the tiddler info panel * Change docs references to "references" to "backlinks" --- core/language/en-GB/TiddlerInfo.multids | 2 +- editions/tw5.com/tiddlers/concepts/InfoPanel.tid | 4 ++-- .../Using links to navigate between tiddlers.tid | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/language/en-GB/TiddlerInfo.multids b/core/language/en-GB/TiddlerInfo.multids index a395ce19b..0899320c6 100644 --- a/core/language/en-GB/TiddlerInfo.multids +++ b/core/language/en-GB/TiddlerInfo.multids @@ -14,7 +14,7 @@ List/Caption: List List/Empty: This tiddler does not have a list Listed/Caption: Listed Listed/Empty: This tiddler is not listed by any others -References/Caption: References +References/Caption: Backlinks References/Empty: No tiddlers link to this one Tagging/Caption: Tagging Tagging/Empty: No tiddlers are tagged with this one diff --git a/editions/tw5.com/tiddlers/concepts/InfoPanel.tid b/editions/tw5.com/tiddlers/concepts/InfoPanel.tid index 8c422a5c5..280f417d5 100644 --- a/editions/tw5.com/tiddlers/concepts/InfoPanel.tid +++ b/editions/tw5.com/tiddlers/concepts/InfoPanel.tid @@ -1,5 +1,5 @@ created: 20150917193630604 -modified: 20150917193631731 +modified: 20201129183045031 tags: Features title: InfoPanel type: text/vnd.tiddlywiki @@ -9,7 +9,7 @@ Each tiddler has a panel of additional information. To reveal it, click the <<.i The info panel has the following tabs: * ''Tools'' - This offers buttons for various actions you can perform on the tiddler. The checkbox next to each button lets you promote an action to the tiddler's toolbar - this will affect all of the tiddlers in your wiki -* ''References'', ''Tagging'', ''List'' and ''Listed'' - These list various kinds of related tiddlers. See [[Using links to navigate between tiddlers]] +* ''Backlinks'', ''Tagging'', ''List'' and ''Listed'' - These list various kinds of related tiddlers. See [[Using links to navigate between tiddlers]] * ''Fields'' - This summarises all of the tiddler's [[fields|TiddlerFields]], except for ''text'' * ''Advanced'' - This indicates whether the tiddler is a [[shadow|ShadowTiddlers]]. If it is, this also reveals which plugin it comes from and whether it has been overridden by an ordinary tiddler diff --git a/editions/tw5.com/tiddlers/workingwithtw/Using links to navigate between tiddlers.tid b/editions/tw5.com/tiddlers/workingwithtw/Using links to navigate between tiddlers.tid index bf491a8d6..aa970cff4 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Using links to navigate between tiddlers.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Using links to navigate between tiddlers.tid @@ -1,5 +1,5 @@ created: 20140908093600000 -modified: 20171219170302268 +modified: 20201129183020567 tags: [[Working with TiddlyWiki]] title: Using links to navigate between tiddlers type: text/vnd.tiddlywiki @@ -12,7 +12,7 @@ You can use links (normally displayed as blue text) to navigate from one tiddler * The ''InfoPanel'' of each tiddler gives you access to four tabs containing additional lists of related tiddlers: -** The ''References'' tab lists all the tiddlers that link //to// the current tiddler. +** The ''Backlinks'' tab lists all the tiddlers that link //to// the current tiddler. ** The ''Tagging'' tab lists all the tiddlers that have been tagged with the current tiddler's title. From 5cbe4c531739b760f9d4ae81f535c8fd0535e65d Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Mon, 30 Nov 2020 18:28:49 +0100 Subject: [PATCH 1046/2376] Add radio actions, th-radio-variables hook and fix label refresh problem (#5154) * Add actions to radio-widget, pass trhough all attributes and user parameters, fix label refresh * invoke th-radio-hook instead of hardcoded variables * simplify code and test it with a plugin hook * remove hook --- core/modules/widgets/radio.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/core/modules/widgets/radio.js b/core/modules/widgets/radio.js index c22aa5ecb..43b6e5dab 100644 --- a/core/modules/widgets/radio.js +++ b/core/modules/widgets/radio.js @@ -13,7 +13,6 @@ Set a field or index at a given tiddler via radio buttons "use strict"; var Widget = require("$:/core/modules/widgets/widget.js").widget; - var RadioWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); }; @@ -37,8 +36,8 @@ RadioWidget.prototype.render = function(parent,nextSibling) { // Create our elements this.labelDomNode = this.document.createElement("label"); this.labelDomNode.setAttribute("class", - "tc-radio " + this.radioClass + (isChecked ? " tc-radio-selected" : "") - ); + "tc-radio " + this.radioClass + (isChecked ? " tc-radio-selected" : "") + ); this.inputDomNode = this.document.createElement("input"); this.inputDomNode.setAttribute("type","radio"); if(isChecked) { @@ -86,6 +85,10 @@ RadioWidget.prototype.handleChangeEvent = function(event) { if(this.inputDomNode.checked) { this.setValue(); } + // Trigger actions + if(this.radioActions) { + this.invokeActionString(this.radioActions,this,event,{"actionValue": this.radioValue}); + } }; /* @@ -99,6 +102,7 @@ RadioWidget.prototype.execute = function() { this.radioValue = this.getAttribute("value"); this.radioClass = this.getAttribute("class",""); this.isDisabled = this.getAttribute("disabled","no"); + this.radioActions = this.getAttribute("actions",""); // Make the child widgets this.makeChildWidgets(); }; @@ -108,16 +112,11 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ RadioWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes["class"] || changedAttributes.disabled) { + if(($tw.utils.count(changedAttributes) > 0) || changedTiddlers[this.radioTitle]) { this.refreshSelf(); return true; } else { - var refreshed = false; - if(changedTiddlers[this.radioTitle]) { - this.inputDomNode.checked = this.getValue() === this.radioValue; - refreshed = true; - } - return this.refreshChildren(changedTiddlers) || refreshed; + return this.refreshChildren(changedTiddlers); } }; From 4623c45d294a719cc9a9e60f03a74f1e5541a808 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 1 Dec 2020 00:30:51 +0700 Subject: [PATCH 1047/2376] Tag trim operator as a string operator (#5147) * Tag trim operator as a string operator With the new functionality of the trim operator in 5.1.23, it's now a general-purpose string manipulation tool. So it should be given the "String operators" tag so that people see it in the same list as removeprefix and removesuffix, etc. * Document suffix of trim operator --- editions/tw5.com/tiddlers/filters/trim Operator.tid | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/trim Operator.tid b/editions/tw5.com/tiddlers/filters/trim Operator.tid index 199c8cd7f..918b4f4c4 100644 --- a/editions/tw5.com/tiddlers/filters/trim Operator.tid +++ b/editions/tw5.com/tiddlers/filters/trim Operator.tid @@ -1,12 +1,14 @@ caption: trim created: 20190613153740241 -modified: 20190613153820282 +modified: 20201130141111438 op-purpose: returns each item in the list with whitespace, or a given character string, trimmed from the start and/or end op-input: a [[selection of titles|Title Selection]] op-parameter: <<.from-version "5.1.23">> a string of characters op-parameter-name: S op-output: the input titles with <<.place S>>, or whitespace if <<.place S>> is not specified, trimmed from the start and/or end -tags: [[Filter Operators]] +op-suffix: `prefix` to trim from the start only, `suffix` to trim from the end only. If omitted (default), trim from both start and end +op-suffix-name: T +tags: [[Filter Operators]] [[String Operators]] title: trim Operator type: text/vnd.tiddlywiki From 8fc6910c032987095e459b49b3f9736842c3fe02 Mon Sep 17 00:00:00 2001 From: saqimtiaz <saq.imtiaz@gmail.com> Date: Mon, 30 Nov 2020 18:43:50 +0100 Subject: [PATCH 1048/2376] Added string operator pad[] along with tests and docs (#5146) --- core/modules/filters/strings.js | 29 +++++++++++++++++++ editions/test/tiddlers/tests/test-filters.js | 11 +++++++ .../examples/pad Operator (Examples).tid | 13 +++++++++ .../tw5.com/tiddlers/filters/pad Operator.tid | 23 +++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 editions/tw5.com/tiddlers/filters/examples/pad Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/pad Operator.tid diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index eb74e39e1..6b76178d4 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -143,4 +143,33 @@ exports["search-replace"] = function(source,operator,options) { return results; }; +exports.pad = function(source,operator,options) { + var results = [], + targetLength = operator.operand ? parseInt(operator.operand) : 0, + fill = operator.operands[1] || "0"; + + source(function(tiddler,title) { + if(title && title.length) { + if(title.length >= targetLength) { + results.push(title); + } else { + var padString = "", + padStringLength = targetLength - title.length; + while (padStringLength > padString.length) { + padString += fill; + } + //make sure we do not exceed the specified length + padString = padString.slice(0,padStringLength); + if(operator.suffix && (operator.suffix === "suffix")) { + title = title + padString; + } else { + title = padString + title; + } + results.push(title); + } + } + }); + return results; +} + })(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 6649af4e3..bf537ee36 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -777,6 +777,17 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[[Hello There]search-replace::regexp<myregexp>,[]]",anchorWidget).join(",")).toBe("Hllo There"); expect(wiki.filterTiddlers("[[Hello There]search-replace:gi[H],[]]",anchorWidget).join(",")).toBe("ello Tere"); }); + + it("should handle the pad operator", function() { + expect(wiki.filterTiddlers("[[2]pad[]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]pad[0]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("[[2]pad[1]]").join(",")).toBe("2"); + expect(wiki.filterTiddlers("2 20 +[pad[3]]").join(",")).toBe("002,020"); + expect(wiki.filterTiddlers("[[2]pad[9]]").join(",")).toBe("000000002"); + expect(wiki.filterTiddlers("[[2]pad[9],[a]]").join(",")).toBe("aaaaaaaa2"); + expect(wiki.filterTiddlers("[[12]pad[9],[abc]]").join(",")).toBe("abcabca12"); + expect(wiki.filterTiddlers("[[12]pad:suffix[9],[abc]]").join(",")).toBe("12abcabca"); + }); } }); diff --git a/editions/tw5.com/tiddlers/filters/examples/pad Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/pad Operator (Examples).tid new file mode 100644 index 000000000..2ccf8ea77 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/pad Operator (Examples).tid @@ -0,0 +1,13 @@ +created: 20201129174833980 +modified: 20201129180011580 +tags: [[Operator Examples]] [[pad Operator]] +title: pad Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 """[[2]pad[3]]""">> + +<<.operator-example 2 """[[2]pad[3],[a]]""">> + +<<.operator-example 3 """[[12]pad[9],[abc]]""">> + +<<.operator-example 4 """[[12]pad:suffix[9],[abc]]""">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/pad Operator.tid b/editions/tw5.com/tiddlers/filters/pad Operator.tid new file mode 100644 index 000000000..defacf117 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/pad Operator.tid @@ -0,0 +1,23 @@ +caption: pad +created: 20201129174215674 +modified: 20201129175301148 +op-input: a [[selection of titles|Title Selection]] +op-output: the input titles padded to the specified length +op-parameter: the <<.op pad>> operator accepts 1 or more parameters, see below for details +op-purpose: returns each item in the list padded to the specified length +op-suffix: (optional). Whether to pad by adding a "suffix" or "prefix". Defaults to "prefix". +tags: [[Filter Operators]] [[String Operators]] +title: pad Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.23">> + +The <<.op pad>> operator requires at least one parameter which specifies the desired length of the input titles. A second optional parameter can be used to specify the string to pad with (defaults to "0"). + +``` +[pad[<length>],[<padding-string>]] +``` +* ''length'' : the desired final length of the input titles. +* ''padding-string'': (optional). The string to use to pad to the desired length. Defaults to "0". + +<<.operator-examples "pad">> From fd3e77d38f850f736368a9b97b20af3e2644557c Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 1 Dec 2020 00:52:46 +0700 Subject: [PATCH 1049/2376] "dedupe" and "raw" suffixes for enlist-input operator (#5152) Includes unit tests. --- core/modules/filters/strings.js | 4 ++-- editions/test/tiddlers/tests/test-filters.js | 3 +++ editions/tw5.com/tiddlers/filters/enlist-input Operator.tid | 2 ++ .../filters/examples/enlist-input Operator (Examples).tid | 4 +++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 6b76178d4..38e5be231 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -61,7 +61,7 @@ exports.split = makeStringBinaryOperator( ); exports["enlist-input"] = makeStringBinaryOperator( - function(a) {return $tw.utils.parseStringArray("" + a);} + function(a,o,s) {return $tw.utils.parseStringArray("" + a,(s === "raw"));} ); exports.join = makeStringReducingOperator( @@ -78,7 +78,7 @@ function makeStringBinaryOperator(fnCalc) { return function(source,operator,options) { var result = []; source(function(tiddler,title) { - Array.prototype.push.apply(result,fnCalc(title,operator.operand || "")); + Array.prototype.push.apply(result,fnCalc(title,operator.operand || "",operator.suffix || "")); }); return result; }; diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index bf537ee36..895c83ca3 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -184,6 +184,9 @@ function runTests(wiki) { it("should handle the enlist-input operator", function() { expect(wiki.filterTiddlers("[[one two three]enlist-input[]]").join(",")).toBe("one,two,three"); + expect(wiki.filterTiddlers("[[one two two three]enlist-input[]]").join(",")).toBe("one,two,three"); + expect(wiki.filterTiddlers("[[one two two three]enlist-input:dedupe[]]").join(",")).toBe("one,two,three"); + expect(wiki.filterTiddlers("[[one two two three]enlist-input:raw[]]").join(",")).toBe("one,two,two,three"); expect(wiki.filterTiddlers("[[one two three]] [[four five six]] +[enlist-input[]]").join(",")).toBe("one,two,three,four,five,six"); expect(wiki.filterTiddlers("[[one two three]] [[four five six]] [[seven eight]] +[enlist-input[]]").join(",")).toBe("one,two,three,four,five,six,seven,eight"); expect(wiki.filterTiddlers("[[]] +[enlist-input[]]").join(",")).toBe(""); diff --git a/editions/tw5.com/tiddlers/filters/enlist-input Operator.tid b/editions/tw5.com/tiddlers/filters/enlist-input Operator.tid index 3a9dd529a..a561a8e12 100644 --- a/editions/tw5.com/tiddlers/filters/enlist-input Operator.tid +++ b/editions/tw5.com/tiddlers/filters/enlist-input Operator.tid @@ -4,6 +4,8 @@ modified: 20201102221854719 op-input: a [[selection of titles|Title Selection]] op-output: the titles stored as a [[title list|Title List]] in each input title op-purpose: select titles by interpreting each input title as a [[title list|Title List]] +op-suffix: `dedupe` (the default) to remove duplicates, `raw` to leave duplicates untouched +op-suffix-name: D tags: [[Filter Operators]] [[String Operators]] [[Selection Constructors]] title: enlist-input Operator type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid index c02a85c4c..7e4eee4a7 100644 --- a/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/enlist-input Operator (Examples).tid @@ -7,4 +7,6 @@ type: text/vnd.tiddlywiki <<.operator-example 1 "[[Days of the Week]get[list]enlist-input[]]">> Contrast with: <<.operator-example 2 "[[Days of the Week]get[list]]">> <<.operator-example 3 "'HelloThere GettingStarted [[Customise TiddlyWiki]]' +[enlist-input[]]">> -Contrast with: <<.operator-example 4 "'HelloThere GettingStarted [[Customise TiddlyWiki]]'">> \ No newline at end of file +Contrast with: <<.operator-example 4 "'HelloThere GettingStarted [[Customise TiddlyWiki]]'">> +<<.operator-example 5 "'HelloThere HelloThere GettingStarted [[Customise TiddlyWiki]]' +[enlist-input:raw[]]">> +Contrast with: <<.operator-example 6 "'HelloThere HelloThere GettingStarted [[Customise TiddlyWiki]]' +[enlist-input[]]">> From 4f13848ca2255afa7d5ee9604f48a5064ce4a20b Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 1 Dec 2020 00:54:45 +0700 Subject: [PATCH 1050/2376] Document using double hashes for anchor links (#5149) This is based on #3836, updated and revised with the edits made by Watt on the Google Group. --- .../wikitext/Anchor Links using HTML.tid | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 editions/tw5.com/tiddlers/wikitext/Anchor Links using HTML.tid diff --git a/editions/tw5.com/tiddlers/wikitext/Anchor Links using HTML.tid b/editions/tw5.com/tiddlers/wikitext/Anchor Links using HTML.tid new file mode 100644 index 000000000..1bf287c9a --- /dev/null +++ b/editions/tw5.com/tiddlers/wikitext/Anchor Links using HTML.tid @@ -0,0 +1,200 @@ +created: 20190311094603013 +modified: 20201130064330388 +tags: [[HTML in WikiText]] +title: Anchor Links using HTML + +<a id=<<qualify "#Top">>></a> + +<h2 id="#Introduction:Anchor-Links-using-HTML">''HTML Anchor Links in Tiddlers''</h2> + + + +* <a href=<<qualify "##Introduction">>>What do they do?</a> +* <a href=<<qualify "##How-do-I-make-them">>>How do I make them?</a> +* <a href=<<qualify "##Anchor-link-limitations">>>Limitations and things to look out for</a> +* <a href=<<qualify "##More_examples">>>More examples</a> +* <a href=<<qualify "##Suggestions-for-elements">>>Suggestions for HTML elements to use</a> +* <a href=<<qualify "##Suggestions-for-ids">>>Suggestions for target names to use</a> +* <a href=<<qualify "##qualify-example">>>Avoiding duplicate IDs when transcluding</a> +* <a href=<<qualify ##Style_Hints>>>Style Hints</a> + +<a id=<<qualify "#Introduction">>></a> + +!! What do they do? + +In TiddlyWiki anchor links can help us link to target points and distinct sections within rendered tiddlers. They can help the reader navigate longer tiddler content. + +For example this link, <a href=<<qualify "##Bottom_of_tiddler">>>Bottom</a>, should take you to the bottom of this tiddler. The "Back to the top" link below should return you back to the top of this tiddler. + +<a href=<<qualify "##Top">>>Back to the top</a> + +<a id=<<qualify "#How-do-I-make-them">>></a> + +!! How do I make them? + +There are only 2 steps to making anchor links. + +* First, create the target point (called an 'anchor') where you want it. +* Second, add a link to it where the reader might need it. + +That's it. + + +''Step 1: Create an 'anchor' (link target)'' + +``` +<a id="#Bottom_of_tiddler"></a> +``` + +*Add an <<.attr id>> attribute to any HTML5 tag and place a single `#` before the 'address' value. <a href="##Suggestions%0">Here are some suggestions of tags you can use.</a> +* Place this code at the target location. E.g. at the bottom of the tiddler. + +''Step 2: Create a link to the target anchor'' + +``` +<a href="##Bottom_of_tiddler">Bottom</a> +``` +*Create an `<a href>` link using exactly the same 'address' value as the target but with double `##` characters preceding it. +*Place this code where it will most help the reader. + +The above example can be adapted to work for many situations in ~TiddlyWiki, such as the table of contents at the top of this tiddler. + +''Is it really that simple? '' + +Yes, it's that simple. BUT... in ~TiddlyWiki there are some small differences from standard HTML5 anchor links and some specific ~TiddlyWiki limitations. + +<a href=<<qualify "##Top">>>Back to the top</a> + +<h2 id=<<qualify "#Anchor-link-limitations">>>Limitations and things to watch out for</h2> + +''Step 1:'' Creating the target anchor + +* Unlike standard HTML5, in ~TiddlyWiki you must put a single `#` character in front of the target address value that follows the <<.attr id>> attribute. (Notice the single `#` character used in the #Bottom_of_tiddler in Example 1.) +* Unlike standard HTML5, ~TiddlyWiki anchor links are case sensitive. In the example above #Bottom_of_tiddler works, but #bottom_of_Tiddler wouldn't. +* Avoid using the % character in your link, as some browsers have a bug where navigation to anchors containing a % character can sometimes fail (see warning below). +* <a id=<<qualify #note.1-return>>/>Avoid using any whitespace in your link (see <a href=<<qualify ##note.1>> title="click to go to note 1.">note 1</a> below). +* Each link address should be unique in the TiddlyWiki. If transclusions create multiple instances of the same <<.attr id>> attribute, navigation will take place to the first instance found that satisfies the above criteria. To avoid this, you can use the [[qualify macro|qualify Macro]] in both the <<.attr id>> and the <<.attr href>> attributes in a similar style to the example given below: <a href=<<qualify ##qualify-example>> >Avoiding duplicate IDs when transcluding</a>. + +''Step 2:'' Creating the link to the target + +* Remember that the <<.attr href>> value should start with ''two'' `#` characters, one more than the <<.attr id>> value of the target anchor. +* Remember that ~TiddlyWiki anchor links are case sensitive + +''Step 3:'' Navigating to the target + +Normally you can click on the link and ~TiddlyWiki will scroll the window so the target anchor is at the top of the window, but there are several limitations: + +* Anchor links in ~TiddlyWiki do not work if the tiddler is not in the Story River, or is not displayed in the sidebar. +* Anchor links in ~TiddlyWiki do not work if the tidlder is in the Story River or sidebar but anchor marked target point is not visible on the page (e.g., the tiddler is folded or the anchor is within a non-displaying $reveal widget). Ctrl+Click on such an anchor link will open a new browser window/tab loading the base web page and will not navigate to the expected tiddler. +* Anchor links in Tiddlywiki do not work if Control Panel > Appearance > Story View is set to Zoomin (the single page view) and the tiddler is not at the top of the story river (i.e. not displayed). +* When an anchor link is clicked the browser's navigation history will be updated with the link's href value appended to the web page's URL. This will happen even if the Control Panel > Settings > Navigation History value is set to "Do not update history". + +<$macrocall $name=.note _="""<span id=<<qualify #note.1>>><a href=<<qualify ##note.1-return>> title="click to return">1.</a></span> The [ext[HTML5 specification|https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id]] for the <<.attr id>> attribute says that its value should not contain any whitespace. Currently ^^(Dec 2020)^^ an <<.attr id>> value with whitespace can sometimes work. However, it may not work in all browsers and is not guaranteed to work in the future.""" /> + +<<.warning "Some browsers may fail to navigate to an anchor target whose ''id'' value includes a `%` character followed by 2 digits. This is a bug in the browser and nothing that ~TiddlyWiki can fix. To be safe, avoid using the `%` character.">> + +<a href=<<qualify "##Top">>>Back to the top</a> + +<h2 id=<<qualify "#More_examples">>>More examples</h2> +In each case the target code is placed at the destination the reader navigates to, the link code is placed where it will help the reader navigate from. + +``` +<h2 id="#heading-01"> My Target Heading</h2> + +<a href="##heading-01">Link to My Target Heading</a> + +``` + +This looks like: + +<hr> +<h2 id="#heading-01">My Target Heading</h2> + +<a href="##heading-01">Link to My Target Heading</a> +<hr> + +``` +<section id="#unique001"> + +!! My Target section + +A `<section>` HTML tag is generally used to define sections in an HTML document, such as chapters, headers, footers, or any other sections of the document. +</section> + +Clicking this anchor link goes to: <a href="##unique001">Link to My Target Section</a> +``` + +This looks like: + +<hr> +<section id="#unique001"> + +!! My Target section + +A `<section>` HTML tag is generally used to define sections in an HTML document, such as chapters, headers, footers, or any other sections of the document. +</section> + +Clicking this anchor link goes to: <a href="##unique001">Link to My Target Section</a> +<hr> + +<a href=<<qualify "##Top">>>Back to the top</a> + +<h2 id=<<qualify "#Suggestions-for-elements">>>''Suggestions for HTML elements to use''</h2> + +Some suggestions for the HTML element you choose for marking a position using the <<.attr id>> attribute: + +| ! Element | ! Sample code | ! Observations | +|<<.def anchor>> |<$text text="""<a id="#part001-of-TiddlerName"></a>"""/> |Should work perfectly everywhere| +|<<.def heading>> |<$text text="""<h2 id="#a-new-heading">A New Heading</h2>"""/>|Headings can have <<.attr id>> attributes as well| +|<<.def section>> |<$text text="""<section id="#sect001-of-TiddlerName">This is a new section</section>"""/>|If you use the `section` element it should probably have an <<.attr id>> of its own| +|<<.def span>> |<$text text="""<span id="#007">Marker 007 is here!</span>"""/>|`span` elements can be used to insert an <<.attr id>> mid-paragraph| + +<a href=<<qualify "##Top">>>Back to the top</a> + +<h2 id=<<qualify "#Suggestions-for-ids">>>Suggestions for target names to use</h2> + +| ! | ! Sample code | ! Observations | +|<<.def Recommended>> |<$text text="""<a id="#part001-of-TiddlerName"></a>"""/> |Include the tiddler name for easy unique <<.attr id>>s| +|<<.def "Avoid: whitespace">> |<$text text="""<h2 id="#0 0 1">A New Heading</h2>"""/>|Whitespace is not guaranteed to work in all browsers| +|<<.def "Avoid: %">> |<$text text="""<section id="#sect001%20of%20TiddlerName">This is a new section</section>"""/>|URI encoding (turning space into %20 and so on) may not work in some browsers| +|<<.def "Avoid: duplicate IDs">> |<$text text="""<span id="#007">Marker 007 is here!</span>"""/>|<<.attr id>> values should be unique within entire wiki| +|<<.def "Avoid: duplicate IDs">> |<$text text="""<a id="#007"></a>"""/>A different marker 007|If <<.attr id>> values are duplicated, one will be ignored| + +<a href=<<qualify "##Top">>>Back to the top</a> + +<h2 id=<<qualify "#qualify-example">>> ''Avoiding duplicate IDs when transcluding''</h2> +The <<.attr id>> and anchor link to this header has been made as follows: + +``` +<a href=<<qualify "##qualify-example">>>Avoiding duplicate IDs when transcluding</a> + +<h2 id=<<qualify "#qualify-example">>>Avoiding duplicate IDs when transcluding</h2> +``` +;For this to work: + +* The <<.attr href>> and <<.attr id>> values use the [[macro invocation syntax for attributes|HTML in WikiText]], using the [[qualify Macro]] to create a unique <<.attr id>> value. +* Both the <<.attr id>> and the anchor link must be in the same tiddler. +* There must not be any quote characters between the `=` and the `<<`. +* The double quotes around the target name are optional, but recommended. +* There should be a total of three `>` characters after the target name, two `>>` to close the `<<qualify` macro, and one `>` to close the `<a` tag. + +<a href=<<qualify "##Top">>>Back to the top</a> + +<h2 id=<<qualify #Style_Hints>>>''Style Hints'' </h2> + +If you don't want the link to look like an external link, give the `<a>` element's <<.attr class>> attribute the value <<.def tc-tiddlylink>> and if you want the link to also be italic & bold, give the additional classes <<.def "tc-tiddlylink-missing tc-tiddlylink-shadow">> like below: + +``` +<a class="tc-tiddlylink" href="##Introduction:Anchor-Links-using-HTML">Back to the top</a> or just back to <a class="tc-tiddlylink tc-tiddlylink-missing tc-tiddlylink-shadow" href=<<qualify ##Hints>>>Hints</a>. +``` +<a class="tc-tiddlylink" href="##Introduction:Anchor-Links-using-HTML">Back to the top</a> or just back to <a class="tc-tiddlylink tc-tiddlylink-missing tc-tiddlylink-shadow" href=<<qualify ##Style_Hints>>>Style Hints</a>. + +If you want to include an <<.attr id>> attribute to a link in your sidebar Table of Contents, you can include it in your listed tiddler's <<.field caption>> field similar to the way shown below: + +``` +<span id=#some-value>Your caption</span> +``` + +<a id=<<qualify "#Bottom_of_tiddler">>></a> + +<a href=<<qualify "##Top">>>Back to the top</a> From 367854c81b9f9145e068b12689173607677cc79e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 30 Nov 2020 18:56:19 +0100 Subject: [PATCH 1051/2376] Update static.tiddler.html.tid (#5148) --- core/templates/static.tiddler.html.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/templates/static.tiddler.html.tid b/core/templates/static.tiddler.html.tid index 0fdd4e2fe..a4537305a 100644 --- a/core/templates/static.tiddler.html.tid +++ b/core/templates/static.tiddler.html.tid @@ -22,9 +22,9 @@ title: $:/core/templates/static.tiddler.html </head> <body class="tc-body"> `{{$:/StaticBanner||$:/core/templates/html-tiddler}}` -<section class="tc-story-river"> +<section class="tc-story-river tc-static-story-river"> `<$view tiddler="$:/core/ui/ViewTemplate" format="htmlwikified"/>` </section> </body> </html> -` \ No newline at end of file +` From 80191903b6b5c61fe16715f35d8f874d57c02045 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Tue, 1 Dec 2020 01:58:33 +0800 Subject: [PATCH 1052/2376] Update chinese translations (#5145) * Improve `References/Caption` * Add `Basics/RemoveTags` and `Basics/RemoveTags/Hint` --- languages/zh-Hans/ControlPanel.multids | 2 ++ languages/zh-Hans/TiddlerInfo.multids | 2 +- languages/zh-Hant/ControlPanel.multids | 2 ++ languages/zh-Hant/TiddlerInfo.multids | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index a29cd9a35..1a849b3bc 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -17,6 +17,8 @@ Basics/NewJournal/Title/Prompt: 新日志条目的名称 Basics/NewTiddler/Tags/Prompt: 新条目的标签 Basics/NewTiddler/Title/Prompt: 新条目的名称 Basics/OverriddenShadowTiddlers/Prompt: 被覆盖的默认条目数量 +Basics/RemoveTags: 更新到当前格式 +Basics/RemoveTags/Hint: 将标签配置更新为最新格式 Basics/ShadowTiddlers/Prompt: 默认条目数量 Basics/Subtitle/Prompt: 副标题 Basics/SystemTiddlers/Prompt: 系统条目数量 diff --git a/languages/zh-Hans/TiddlerInfo.multids b/languages/zh-Hans/TiddlerInfo.multids index 8329fd89e..b5580d1cf 100644 --- a/languages/zh-Hans/TiddlerInfo.multids +++ b/languages/zh-Hans/TiddlerInfo.multids @@ -14,7 +14,7 @@ List/Caption: 列表 List/Empty: 此条目无指定列表 Listed/Caption: 被列于 Listed/Empty: 此条目未出现于其他条目的列表中 -References/Caption: 参照 +References/Caption: 反向链接 References/Empty: 无条目链接至此 Tagging/Caption: 子条目 Tagging/Empty: 无任何条目以此条目之标题为标签 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 09c088e85..ba5333014 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -17,6 +17,8 @@ Basics/NewJournal/Title/Prompt: 新日誌條目的名稱 Basics/NewTiddler/Tags/Prompt: 新條目的標籤 Basics/NewTiddler/Title/Prompt: 新條目的名稱 Basics/OverriddenShadowTiddlers/Prompt: 被覆寫的預設條目數量 +Basics/RemoveTags: 更新到當前格式 +Basics/RemoveTags/Hint: 將標籤設定更新為最新格式 Basics/ShadowTiddlers/Prompt: 預設條目數量 Basics/Subtitle/Prompt: 副標題 Basics/SystemTiddlers/Prompt: 系統條目數量 diff --git a/languages/zh-Hant/TiddlerInfo.multids b/languages/zh-Hant/TiddlerInfo.multids index dab4c0c08..ffb16889d 100644 --- a/languages/zh-Hant/TiddlerInfo.multids +++ b/languages/zh-Hant/TiddlerInfo.multids @@ -14,7 +14,7 @@ List/Caption: 列表 List/Empty: 此條目無指定列表 Listed/Caption: 被列於 Listed/Empty: 此條目未出現於其他條目的列表中 -References/Caption: 參照 +References/Caption: 反向連結 References/Empty: 無條目連結至此 Tagging/Caption: 子條目 Tagging/Empty: 無任何條目以此條目之標題為標籤 From 3406b98af62def252bcb0f7df8a72ed4b74818eb Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 30 Nov 2020 18:48:04 +0000 Subject: [PATCH 1053/2376] Add "autocomplete" attribute to <$edit> and <$edit-text> widgets --- core/modules/editor/engines/framed.js | 3 +++ core/modules/editor/engines/simple.js | 3 +++ core/modules/editor/factory.js | 3 ++- core/modules/widgets/edit.js | 3 ++- editions/tw5.com/tiddlers/widgets/EditTextWidget.tid | 3 ++- editions/tw5.com/tiddlers/widgets/EditWidget.tid | 10 ++++++---- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 08ff0ffd7..c70167f6c 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -73,6 +73,9 @@ function FramedEngine(options) { if(this.widget.editTabIndex) { this.iframeNode.setAttribute("tabindex",this.widget.editTabIndex); } + if(this.widget.editAutoComplete) { + this.domNode.setAttribute("autocomplete",this.widget.editAutoComplete); + } if(this.widget.isDisabled === "yes") { this.domNode.setAttribute("disabled",true); } diff --git a/core/modules/editor/engines/simple.js b/core/modules/editor/engines/simple.js index 0f65e7ceb..fe65d1fd9 100644 --- a/core/modules/editor/engines/simple.js +++ b/core/modules/editor/engines/simple.js @@ -52,6 +52,9 @@ function SimpleEngine(options) { if(this.widget.editTabIndex) { this.domNode.setAttribute("tabindex",this.widget.editTabIndex); } + if(this.widget.editAutoComplete) { + this.domNode.setAttribute("autocomplete",this.widget.editAutoComplete); + } if(this.widget.isDisabled === "yes") { this.domNode.setAttribute("disabled",true); } diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index 933c2eb42..3cf595371 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -180,6 +180,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { this.editCancelPopups = this.getAttribute("cancelPopups","") === "yes"; this.editInputActions = this.getAttribute("inputActions"); this.editRefreshTitle = this.getAttribute("refreshTitle"); + this.editAutoComplete = this.getAttribute("autocomplete"); this.isDisabled = this.getAttribute("disabled","no"); // Get the default editor element tag and type var tag,type; @@ -212,7 +213,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { EditTextWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Completely rerender if any of our attributes have changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) { this.refreshSelf(); return true; } else if (changedTiddlers[this.editRefreshTitle]) { diff --git a/core/modules/widgets/edit.js b/core/modules/widgets/edit.js index 6ee918170..e7bd49b93 100644 --- a/core/modules/widgets/edit.js +++ b/core/modules/widgets/edit.js @@ -51,6 +51,7 @@ EditWidget.prototype.execute = function() { this.editCancelPopups = this.getAttribute("cancelPopups",""); this.editInputActions = this.getAttribute("inputActions"); this.editRefreshTitle = this.getAttribute("refreshTitle"); + this.editAutoComplete = this.getAttribute("autocomplete"); // Choose the appropriate edit widget this.editorType = this.getEditorType(); // Make the child widgets @@ -89,7 +90,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of EditWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Refresh if an attribute has changed, or the type associated with the target tiddler has changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) { this.refreshSelf(); return true; } else { diff --git a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid index 5205741d2..c2e57e755 100644 --- a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid @@ -1,6 +1,6 @@ caption: edit-text created: 20131024141900000 -modified: 20201109093034856 +modified: 20201130184701532 tags: Widgets title: EditTextWidget type: text/vnd.tiddlywiki @@ -25,6 +25,7 @@ The content of the `<$edit-text>` widget is ignored. |focusPopup |Title of a state tiddler for a popup that is displayed when the editing element has focus | |focus |Set to "yes" or "true" to automatically focus the editor after creation | |tabindex |Sets the `tabindex` attribute of the input or textarea to the given value | +|autocomplete |<<.from-version 5.1.23>> An optional string to provide a hint to the browser how to handle autocomplete for this input | |tag |Overrides the generated HTML editing element tag. For a multi-line editor use `tag=textarea`. For a single-line editor use `tag=input` | |type |Overrides the generated HTML editing element `type` attribute | |size |The size of the input field (in characters) | diff --git a/editions/tw5.com/tiddlers/widgets/EditWidget.tid b/editions/tw5.com/tiddlers/widgets/EditWidget.tid index 930319d70..78d85f3fe 100644 --- a/editions/tw5.com/tiddlers/widgets/EditWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditWidget.tid @@ -1,8 +1,9 @@ -title: EditWidget -created: 201310241419 -modified: 20150220161220000 -tags: Widgets caption: edit +created: 20131024141900000 +modified: 20201130184647904 +tags: Widgets +title: EditWidget +type: text/vnd.tiddlywiki ! Introduction @@ -18,6 +19,7 @@ The content of the `<$edit>` widget is ignored. |index |The index to edit | |class |A CSS class to be added the generated editing widget | |tabindex |Sets the `tabindex` attribute of the input or textarea to the given value | +|autocomplete |<<.from-version 5.1.23>> An optional string to provide a hint to the browser how to handle autocomplete for this input | |cancelPopups |<<.from-version "5.1.23">> if set to "yes", cancels all popups when the input gets focus | |inputActions |<<.from-version 5.1.23>> Optional actions that are triggered every time an input event occurs within the input field or textarea | |refreshTitle |<<.from-version 5.1.23>> An optional tiddler title that makes the input field update whenever the specified tiddler changes | From 1de747b182b546af2d857181b6d07901ab510bc3 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Mon, 30 Nov 2020 19:48:48 +0100 Subject: [PATCH 1054/2376] add docs for radio-actions (#5156) --- .../tiddlers/widgets/RadioWidget Example.tid | 32 +++++++++++++++++++ .../widgets/RadioWidget ExampleTemplate.tid | 7 ++++ .../tw5.com/tiddlers/widgets/RadioWidget.tid | 5 ++- 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid create mode 100644 editions/tw5.com/tiddlers/widgets/RadioWidget ExampleTemplate.tid diff --git a/editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid b/editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid new file mode 100644 index 000000000..64d8914c1 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid @@ -0,0 +1,32 @@ +created: 20201130181015815 +modified: 20201130183426619 +tags: RadioWidget +title: RadioWidget Example +type: text/vnd.tiddlywiki + +\define newText() value: $(actionValue)$ + +\define radioActions() +<$action-sendmessage $message="tm-notify" $param="RadioWidget ExampleTemplate" value=<<actionValue>> current=<<currentTiddler>> /> +<$action-createtiddler $basetitle="$:/temp/test/value" $overwrite="yes" text=<<newText>>/> +<$action-navigate $to="$:/temp/test/value"/> +\end + +!! Using Actions + +If you select an option, the value is written to $:/temp/test/value and the ''id'' field of tiddler: $:/temp/test will be updated. + +A notification showing the ''actionValue'' will be shown. + +<$tiddler tiddler="$:/temp/test"> + <$radio field="id" value="a" actions=<<radioActions>> > Option a </$radio>| + <$radio field="id" value="b" actions=<<radioActions>> > Option b </$radio>| + <$radio field="id" value="c" actions=<<radioActions>> > Option c </$radio>| +</$tiddler> + +--- + +<details> + <summary>Show the code [[RadioWidget Example]]</summary> + <pre><code><$view mode=text&><pre><code> +</details> diff --git a/editions/tw5.com/tiddlers/widgets/RadioWidget ExampleTemplate.tid b/editions/tw5.com/tiddlers/widgets/RadioWidget ExampleTemplate.tid new file mode 100644 index 000000000..13be1572a --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/RadioWidget ExampleTemplate.tid @@ -0,0 +1,7 @@ +created: 20201130181111808 +modified: 20201130182421491 +tags: RadioWidget +title: RadioWidget ExampleTemplate +type: text/vnd.tiddlywiki + +value = <<value>> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid index 7a62c03ed..c8798900f 100644 --- a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid @@ -1,6 +1,6 @@ caption: radio created: 20131212195353929 -modified: 20201109091807432 +modified: 20201130184330254 tags: Widgets title: RadioWidget type: text/vnd.tiddlywiki @@ -19,6 +19,7 @@ The content of the `<$radio>` widget is displayed within an HTML `<label>` eleme |index|<<.from-version "5.1.14">> The index of the //tiddler// being [[DataTiddler|DataTiddlers]] bound to the radio button<<.tip "takes precedence over //field//">>| |value |The value for the //field// or //index// of the //tiddler//| |class |The CSS classes assigned to the label around the radio button<$macrocall $name=".tip" _="""<<.from-version "5.1.14">> `tc-radio` is always applied by default, as well as `tc-radio-selected` when selected"""/>| +|actions|<<.from-version "5.1.23">> Optional, A string containing ActionWidgets to be triggered when the value changes. <br>The variable: ''actionValue'' is available for the actions. | |disabled|<<.from-version "5.1.23">> Optional, disables the radio input if set to "yes". Defaults to "no"| @@ -39,3 +40,5 @@ This example sets the `Tree Frog` index in the tiddler AnimalColours: <$radio index="Tree Frog" value="green"> green</$radio> <$radio index="Tree Frog" value="brown"> brown</$radio> </$tiddler>"""/> + +{{RadioWidget Example}} \ No newline at end of file From fe8606759ebf1db50c57a2e779b086a6d7df2ae6 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 30 Nov 2020 18:56:52 +0000 Subject: [PATCH 1055/2376] Fix parsing of dates between 0 and 100 AD --- boot/boot.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/boot/boot.js b/boot/boot.js index 9b742120c..7f85417a6 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -305,13 +305,16 @@ $tw.utils.stringifyDate = function(value) { // Parse a date from a UTC YYYYMMDDHHMMSSmmm format string $tw.utils.parseDate = function(value) { if(typeof value === "string") { - return new Date(Date.UTC(parseInt(value.substr(0,4),10), + var year = parseInt(value.substr(0,4),10), + d = new Date(Date.UTC(year, parseInt(value.substr(4,2),10)-1, parseInt(value.substr(6,2),10), parseInt(value.substr(8,2)||"00",10), parseInt(value.substr(10,2)||"00",10), parseInt(value.substr(12,2)||"00",10), parseInt(value.substr(14,3)||"000",10))); + d.setUTCFullYear(year); // See https://stackoverflow.com/a/5870822 + return d; } else if($tw.utils.isDate(value)) { return value; } else { From 6a319940d375825ef661ec90c5472cc2260f0471 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 30 Nov 2020 22:04:14 +0100 Subject: [PATCH 1056/2376] Make buttons look like buttons in CupertinoDark, GruvboxDark and DesertSand palette (#5159) * Make buttons look like buttons in CupertinoDark palette * Update GruvBoxDark.tid * Update DesertSand.tid --- core/palettes/CupertinoDark.tid | 6 ++---- core/palettes/DesertSand.tid | 2 -- core/palettes/GruvBoxDark.tid | 6 ++---- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index 44ad38e8b..0880054ca 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -10,9 +10,7 @@ alert-highlight: #FFD60A alert-muted-foreground: <<colour muted-foreground>> background: #282828 blockquote-bar: <<colour page-background>> -button-background: #3F638B -button-foreground: <<colour foreground>> -button-border: transparent +button-foreground: <<colour background>> code-background: <<colour pre-background>> code-border: <<colour pre-border>> code-foreground: rgba(255, 255, 255, 0.54) @@ -53,7 +51,7 @@ pre-border: transparent primary: #0A84FF select-tag-background: <<colour background>> select-tag-foreground: <<colour foreground>> -sidebar-button-foreground: <<colour foreground>> +sidebar-button-foreground: <<colour background>> sidebar-controls-foreground-hover: #FF9F0A sidebar-controls-foreground: #8E8E93 sidebar-foreground-shadow: transparent diff --git a/core/palettes/DesertSand.tid b/core/palettes/DesertSand.tid index ba0581095..ab345d11f 100644 --- a/core/palettes/DesertSand.tid +++ b/core/palettes/DesertSand.tid @@ -10,9 +10,7 @@ alert-highlight: #881122 alert-muted-foreground: #b99e2f background: #E9E0C7 blockquote-bar: <<colour muted-foreground>> -button-background: #BAB29C button-foreground: <<colour foreground>> -button-border: transparent code-background: #F3EDDF code-border: #C3BAA1 code-foreground: #ab3250 diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index c4b1cfc63..a8db56807 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -11,9 +11,7 @@ alert-highlight: #d79921 alert-muted-foreground: #504945 background: #3c3836 blockquote-bar: <<colour muted-foreground>> -button-background: #504945 -button-foreground: #fbf1c7 -button-border: transparent +button-foreground: <<colour page-background>> code-background: #504945 code-border: #504945 code-foreground: #fb4934 @@ -62,7 +60,7 @@ pre-border: #504945 primary: #d79921 select-tag-background: #665c54 select-tag-foreground: <<colour foreground>> -sidebar-button-foreground: <<colour foreground>> +sidebar-button-foreground: <<colour page-background>> sidebar-controls-foreground-hover: #7c6f64 sidebar-controls-foreground: #504945 sidebar-foreground-shadow: transparent From 706fc3e06ed0998545918aafda8951080f15a955 Mon Sep 17 00:00:00 2001 From: Florian Kohrt <fkohrt@anche.no> Date: Mon, 30 Nov 2020 22:33:16 +0100 Subject: [PATCH 1057/2376] Fix typo; closes #4815 (#4844) --- .../webserver/WebServer Parameter_ tiddler-render-type.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ tiddler-render-type.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ tiddler-render-type.tid index d674b0e5f..900a80b91 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ tiddler-render-type.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ tiddler-render-type.tid @@ -5,6 +5,6 @@ tags: [[WebServer Parameters]] title: WebServer Parameter: tiddler-render-type type: text/vnd.tiddlywiki -The [[web server configuration parameter|WebServer Parameters]] ''tiddler-render-type'' is used to specify the render type for serving ordinary, non-system tiddlers in the [[read-only single tiddler view|Using the read-only single tiddler view]]. The default value is `text/html`, causing the full HTML of the rendered output to be returned. Alternatively, `text/html` can be used to cause the raw text of rendered system tiddlers to be returned. +The [[web server configuration parameter|WebServer Parameters]] ''tiddler-render-type'' is used to specify the render type for serving ordinary, non-system tiddlers in the [[read-only single tiddler view|Using the read-only single tiddler view]]. The default value is `text/html`, causing the full HTML of the rendered output to be returned. Alternatively, `text/plain` can be used to cause the raw text of rendered system tiddlers to be returned. -<<.tip "This setting may be overwritten by specifying the `_render_type` field of a tiddler.">> \ No newline at end of file +<<.tip "This setting may be overwritten by specifying the `_render_type` field of a tiddler.">> From 6f09a5ee652f78f251a958a64ce10139bf4b60c0 Mon Sep 17 00:00:00 2001 From: Florian Kohrt <fkohrt@anche.no> Date: Mon, 30 Nov 2020 22:34:00 +0100 Subject: [PATCH 1058/2376] Fix link to TiddlyWikiFolders (#4843) * Fix link to TiddlyWikiFolders * Better link to tiddlywiki.info reference tiddler --- .../howtos/How to add a banner for GitHub contributions.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/How to add a banner for GitHub contributions.tid b/editions/tw5.com/tiddlers/howtos/How to add a banner for GitHub contributions.tid index 086b45a64..5482b3dc1 100644 --- a/editions/tw5.com/tiddlers/howtos/How to add a banner for GitHub contributions.tid +++ b/editions/tw5.com/tiddlers/howtos/How to add a banner for GitHub contributions.tid @@ -7,7 +7,7 @@ When you edit a tiddler on https://tiddlywiki.com you will see a small ribbon in If you are using Node.js, you can replicate this feature for your own TiddlyWiki-based site as follows: -# Make sure the following setting is included in the `tiddlywiki.info` file in your WikiFolder: +# Make sure the following setting is included in the <$link to="tiddlywiki.info Files">`tiddlywiki.info`</$link> file in your [[wiki folder|TiddlyWikiFolders]]: #> <pre><code> "config": { "retain-original-tiddler-path": true }</code></pre> From abe9af13691bc7c43d3a37184cf81eafa66d42f1 Mon Sep 17 00:00:00 2001 From: Rob Hoelz <rob@hoelz.ro> Date: Mon, 30 Nov 2020 16:10:07 -0600 Subject: [PATCH 1059/2376] Add documentation for indexer modules (#4873) --- .../wikimethod module type.tid | 5 +- editions/dev/tiddlers/indexer modules.tid | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 editions/dev/tiddlers/indexer modules.tid diff --git a/editions/dev/tiddlers/from Heigele and Jurke/wikimethod module type.tid b/editions/dev/tiddlers/from Heigele and Jurke/wikimethod module type.tid index fe3061d10..907f67336 100644 --- a/editions/dev/tiddlers/from Heigele and Jurke/wikimethod module type.tid +++ b/editions/dev/tiddlers/from Heigele and Jurke/wikimethod module type.tid @@ -1,5 +1,6 @@ created: 20140710185051844 -modified: 20140710185339032 +modified: 20201002010124844 title: wikimethod module type +tags: moduletypes -The startup module [[$:/core/modules/startup/load-modules.js]] in the TiddlyWiki core plug-in loads all modules of type``wikimethod`` and puts their exported functions into the wiki store. \ No newline at end of file +The startup module [[$:/core/modules/startup/load-modules.js]] in the TiddlyWiki core plug-in loads all modules of type``wikimethod`` and puts their exported functions into the wiki store. diff --git a/editions/dev/tiddlers/indexer modules.tid b/editions/dev/tiddlers/indexer modules.tid new file mode 100644 index 000000000..2a3119d05 --- /dev/null +++ b/editions/dev/tiddlers/indexer modules.tid @@ -0,0 +1,55 @@ +created: 20201002010134640 +modified: 20201002012758239 +tags: moduletypes dev +title: indexer modules + +Indexer modules maintain indexes of tiddlers organized in a manner that's more efficient for different types of access, typically to speed up things like certain filter operators. An example of this would be the tag indexer - it's much faster to maintain a lookup table listing which tiddlers have a given tag than to iterate over //all// of the tiddlers in a wiki and ask each of them if they have the tag you're interested in! + +Indexer modules have a `module-type` of `indexer`, and the indexers that are included with TiddlyWiki can be found under `core/modules/indexers`. + +! Methods + +Indexer modules must export a constructor function, which takes the current wiki object as its only argument. The object built by the construction function must implement the following methods: + +!! `init()` + +This performs any initial setup required by an indexer. + +!! `rebuild()` + +This rebuilds an index from scratch, usually after a large number of changes have happened to a wiki. + +!! `update(updateDescriptor)` + +This is called every time a tiddler is added, changed, or deleted. The `updateDescriptor` value is an object with two fields - `old` and `new` - which represent the pre-update and post-update state of the tiddler, respectively. Each of these has three fields of their own: + + * `tiddler` - the state of the tiddler (may be `null`) + * `shadow` - a boolean indicating whether or not the tiddler is a shadow + * `exists` - a boolean indicating whether or not the tiddler exists + +For example, let's say you have an indexer `idx` and you create a tiddler T with the text "test" - that would result in your indexer's `update` method being called like this: + +```javascript +idx.update({ + old: { tiddler: null, shadow: false, exists: false }, + new: { tiddler: new $tw.Tiddler({title: 'T', text: 'test'}), shadow: false, exists: true } +}); +``` + +If you then change the text from "test" to "testing", `update` would be called like this: + +```javascript +idx.update({ + old: { tiddler: new $tw.Tiddler({title: 'T', text: 'test'}), shadow: false, exists: true }, + new: { tiddler: new $tw.Tiddler({title: 'T', text: 'testing'}), shadow: false, exists: true } +}); +``` + +And finally, if you delete T, `update` will be called like this: + +```javascript +idx.update({ + old: { tiddler: new $tw.Tiddler({title: 'T', text: 'testing'}), shadow: false, exists: true }, + new: { tiddler: null, shadow: false, exists: false } +}); +``` \ No newline at end of file From dde4182830f11bfdbcca558065f432556ccf4e65 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Mon, 30 Nov 2020 14:31:48 -0800 Subject: [PATCH 1060/2376] Fix filesystem adaptor (#5113) * ignore .env testing new implementation almost there closer bug, desyncing fixed final testing final testing cleanup cleanup * isEditableFile flow fixed * removed `basepath` logic * callback to delete title from $tw.boot.files * comment fix * have syncer delete from boot.files * syntax * bugfix: error on missing directory * bugifx * remove !draft check * fix relative filepaths * cleanup * cleanup !draft * catch undefined filepaths in deleteTiddlerFile() * typo * whitelist wiki dir, encodeURIComponent otherwise * test for wikiPath, not wikiPath/tiddlers * don't need to .normailze() * whitelist wiki directory, move cleanup to util * use cleanup util & fail EPERM & EACCESS gracefully * comments * final bugs fixed * improved sync error --- boot/boot.js | 22 ++- core/modules/syncer.js | 4 + core/modules/utils/filesystem.js | 139 ++++++++++++++++-- .../filesystem/filesystemadaptor.js | 78 ++++++---- 4 files changed, 195 insertions(+), 48 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index 7f85417a6..97bf73837 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1915,15 +1915,21 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) { } } else { // Process directory specifier - var dirPath = path.resolve(filepath,dirSpec.path), - files = fs.readdirSync(dirPath), - fileRegExp = new RegExp(dirSpec.filesRegExp || "^.*$"), - metaRegExp = /^.*\.meta$/; - for(var t=0; t<files.length; t++) { - var filename = files[t]; - if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) { - processFile(dirPath + path.sep + filename,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile); + var dirPath = path.resolve(filepath,dirSpec.path); + if(fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) { + var files = fs.readdirSync(dirPath), + fileRegExp = new RegExp(dirSpec.filesRegExp || "^.*$"), + metaRegExp = /^.*\.meta$/; + for(var t=0; t<files.length; t++) { + var filename = files[t]; + if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) { + processFile(dirPath + path.sep + filename,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile); + } } + } else { + console.log("Warning: a directory in a tiddlywiki.files file does not exist."); + console.log("dirPath: " + dirPath); + console.log("tiddlywiki.files location: " + filepath); } } }); diff --git a/core/modules/syncer.js b/core/modules/syncer.js index d5eae1f48..15374d40a 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -633,6 +633,10 @@ DeleteTiddlerTask.prototype.run = function(callback) { } // Remove the info stored about this tiddler delete self.syncer.tiddlerInfo[self.title]; + if($tw.boot.files){ + // Remove the tiddler from $tw.boot.files + delete $tw.boot.files[self.title]; + } // Invoke the callback callback(null); },{ diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index df820a63c..7c77eb0d7 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -204,15 +204,17 @@ exports.deleteEmptyDirs = function(dirpath,callback) { /* Create a fileInfo object for saving a tiddler: filepath: the absolute path to the file containing the tiddler - type: the type of the tiddler file (NOT the type of the tiddler) + type: the type of the tiddler file on disk (NOT the type of the tiddler) hasMetaFile: true if the file also has a companion .meta file Options include: directory: absolute path of root directory to which we are saving pathFilters: optional array of filters to be used to generate the base path - wiki: optional wiki for evaluating the pathFilters + extFilters: optional array of filters to be used to generate the base path + wiki: optional wiki for evaluating the pathFilters, + fileInfo: an existing fileInfo to check against */ exports.generateTiddlerFileInfo = function(tiddler,options) { - var fileInfo = {}; + var fileInfo = {}, metaExt; // Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace var hasUnsafeFields = false; $tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) { @@ -238,19 +240,66 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { fileInfo.type = tiddlerType; fileInfo.hasMetaFile = true; } + if(options.extFilters) { + // Check for extension override + metaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{ + extFilters: options.extFilters, + wiki: options.wiki + }); + if(metaExt === ".tid") { + // Overriding to the .tid extension needs special handling + fileInfo.type = "application/x-tiddler"; + fileInfo.hasMetaFile = false; + } else if (metaExt === ".json") { + // Overriding to the .json extension needs special handling + fileInfo.type = "application/json"; + fileInfo.hasMetaFile = false; + } else if (metaExt) { + //If the new type matches a known extention, use that MIME type's encoding + var extInfo = $tw.utils.getFileExtensionInfo(metaExt); + fileInfo.type = extInfo ? extInfo.type : null; + fileInfo.encoding = $tw.utils.getTypeEncoding(metaExt); + fileInfo.hasMetaFile = true; + } + } } - // Take the file extension from the tiddler content type + // Take the file extension from the tiddler content type or metaExt var contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: ""}; // Generate the filepath fileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{ - extension: contentTypeInfo.extension, + extension: metaExt || contentTypeInfo.extension, directory: options.directory, pathFilters: options.pathFilters, - wiki: options.wiki + wiki: options.wiki, + fileInfo: options.fileInfo }); return fileInfo; }; +/* +Generate the file extension for saving a tiddler +Options include: + extFilters: optional array of filters to be used to generate the extention + wiki: optional wiki for evaluating the extFilters +*/ +exports.generateTiddlerExtension = function(title,options) { + var self = this, + extension; + // Check if any of the extFilters applies + if(options.extFilters && options.wiki) { + $tw.utils.each(options.extFilters,function(filter) { + if(!extension) { + var source = options.wiki.makeTiddlerIterator([title]), + result = options.wiki.filterTiddlers(filter,null,source); + if(result.length > 0) { + extension = result[0]; + } + } + }); + } + return extension; +}; + /* Generate the filepath for saving a tiddler Options include: @@ -258,12 +307,13 @@ Options include: directory: absolute path of root directory to which we are saving pathFilters: optional array of filters to be used to generate the base path wiki: optional wiki for evaluating the pathFilters + fileInfo: an existing fileInfo object to check against */ exports.generateTiddlerFilepath = function(title,options) { var self = this, directory = options.directory || "", extension = options.extension || "", - filepath; + filepath; // Check if any of the pathFilters applies if(options.pathFilters && options.wiki) { $tw.utils.each(options.pathFilters,function(filter) { @@ -276,7 +326,6 @@ exports.generateTiddlerFilepath = function(title,options) { } }); } - // If not, generate a base pathname if(!filepath) { filepath = title; // If the filepath already ends in the extension then remove it @@ -286,10 +335,13 @@ exports.generateTiddlerFilepath = function(title,options) { // Remove any forward or backward slashes so we don't create directories filepath = filepath.replace(/\/|\\/g,"_"); } - // Don't let the filename start with a dot because such files are invisible on *nix - filepath = filepath.replace(/^\./g,"_"); + //If the path does not start with "." or ".." and a path seperator, then + if(!/^\.{1,2}[/\\]/g.test(filepath)) { + // Don't let the filename start with any dots because such files are invisible on *nix + filepath = filepath.replace(/^\.+/g,"_"); + } // Remove any characters that can't be used in cross-platform filenames - filepath = $tw.utils.transliterate(filepath.replace(/<|>|\:|\"|\||\?|\*|\^/g,"_")); + filepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\:|\"|\||\?|\*|\^/g,"_")); // Truncate the filename if it is too long if(filepath.length > 200) { filepath = filepath.substr(0,200); @@ -306,12 +358,21 @@ exports.generateTiddlerFilepath = function(title,options) { }); } // Add a uniquifier if the file already exists - var fullPath, + var fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined, count = 0; do { fullPath = path.resolve(directory,filepath + (count ? "_" + count : "") + extension); + if(oldPath && oldPath == fullPath) { + break; + } count++; } while(fs.existsSync(fullPath)); + //If the path does not start with the wiki directory, or if the last write failed + var encode = fullPath.indexOf($tw.boot.wikiPath) !== 0 || ((options.fileInfo || {writeError: false}).writeError == true); + if(encode){ + //encodeURIComponent() and then resolve to tiddler directory + fullPath = path.resolve(directory, encodeURIComponent(fullPath)); + } // Return the full path to the file return fullPath; }; @@ -366,4 +427,58 @@ exports.saveTiddlerToFileSync = function(tiddler,fileInfo) { } }; +/* +Delete a file described by the fileInfo if it exits +*/ +exports.deleteTiddlerFile = function(fileInfo, callback) { + //Only attempt to delete files that exist on disk + if(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) { + return callback(null); + } + // Delete the file + fs.unlink(fileInfo.filepath,function(err) { + if(err) { + return callback(err); + } + // Delete the metafile if present + if(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + ".meta")) { + fs.unlink(fileInfo.filepath + ".meta",function(err) { + if(err) { + return callback(err); + } + return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback); + }); + } else { + return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback); + } + }); +}; + +/* +Cleanup old files on disk, by comparing the options values: + adaptorInfo from $tw.syncer.tiddlerInfo + bootInfo from $tw.boot.files +*/ +exports.cleanupTiddlerFiles = function(options, callback) { + var adaptorInfo = options.adaptorInfo || {}, + bootInfo = options.bootInfo || {}, + title = options.title || "undefined"; + if(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) { + return $tw.utils.deleteTiddlerFile(adaptorInfo, function(err){ + if(err) { + if ((err.code == "EPERM" || err.code == "EACCES") && err.syscall == "unlink") { + // Error deleting the previous file on disk, should fail gracefully + $tw.syncer.displayError("Server desynchronized. Error cleaning up previous file for tiddler: "+title, err); + return callback(null); + } else { + return callback(err); + } + } + return callback(null); + }); + } else { + return callback(null); + } +}; + })(); diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index 84da6236e..fce2eaeaa 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -35,7 +35,9 @@ FileSystemAdaptor.prototype.isReady = function() { }; FileSystemAdaptor.prototype.getTiddlerInfo = function(tiddler) { - return {}; + //Returns the existing fileInfo for the tiddler. To regenerate, call getTiddlerFileInfo(). + var title = tiddler.fields.title; + return this.boot.files[title]; }; /* @@ -44,24 +46,25 @@ Return a fileInfo object for a tiddler, creating it if necessary: type: the type of the tiddler file (NOT the type of the tiddler -- see below) hasMetaFile: true if the file also has a companion .meta file -The boot process populates this.boot.files for each of the tiddler files that it loads. The type is found by looking up the extension in $tw.config.fileExtensionInfo (eg "application/x-tiddler" for ".tid" files). +The boot process populates this.boot.files for each of the tiddler files that it loads. +The type is found by looking up the extension in $tw.config.fileExtensionInfo (eg "application/x-tiddler" for ".tid" files). It is the responsibility of the filesystem adaptor to update this.boot.files for new files that are created. */ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { // See if we've already got information about this file var title = tiddler.fields.title, - fileInfo = this.boot.files[title]; - if(!fileInfo) { - // Otherwise, we'll need to generate it - fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ - directory: this.boot.wikiTiddlersPath, - pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"), - wiki: this.wiki - }); - this.boot.files[title] = fileInfo; - } - callback(null,fileInfo); + newInfo, fileInfo = this.boot.files[title]; + // Always generate a fileInfo object when this fuction is called + newInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ + directory: this.boot.wikiTiddlersPath, + pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"), + extFilters: this.wiki.getTiddlerText("$:/config/FileSystemExtensions","").split("\n"), + wiki: this.wiki, + fileInfo: fileInfo + }); + this.boot.files[title] = newInfo; + callback(null,newInfo); }; @@ -74,7 +77,31 @@ FileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) { if(err) { return callback(err); } - $tw.utils.saveTiddlerToFile(tiddler,fileInfo,callback); + $tw.utils.saveTiddlerToFile(tiddler,fileInfo,function(err) { + if(err) { + if ((err.code == "EPERM" || err.code == "EACCES") && err.syscall == "open") { + var bootInfo = self.boot.files[tiddler.fields.title]; + bootInfo.writeError = true; + self.boot.files[tiddler.fields.title] = bootInfo; + $tw.syncer.displayError("Sync for tiddler [["+tiddler.fields.title+"]] will be retried with encoded filepath", encodeURIComponent(bootInfo.filepath)); + return callback(err); + } else { + return callback(err); + } + } + // Cleanup duplicates if the file moved or changed extensions + var options = { + adaptorInfo: ($tw.syncer.tiddlerInfo[tiddler.fields.title] || {adaptorInfo: {} }).adaptorInfo, + bootInfo: self.boot.files[tiddler.fields.title] || {}, + title: tiddler.fields.title + }; + $tw.utils.cleanupTiddlerFiles(options, function(err){ + if(err) { + return callback(err); + } + return callback(null, self.boot.files[tiddler.fields.title]); + }); + }); }); }; @@ -95,22 +122,17 @@ FileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) { fileInfo = this.boot.files[title]; // Only delete the tiddler if we have writable information for the file if(fileInfo) { - // Delete the file - fs.unlink(fileInfo.filepath,function(err) { + $tw.utils.deleteTiddlerFile(fileInfo, function(err){ if(err) { - return callback(err); - } - // Delete the metafile if present - if(fileInfo.hasMetaFile) { - fs.unlink(fileInfo.filepath + ".meta",function(err) { - if(err) { - return callback(err); - } - return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback); - }); - } else { - return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback); + if ((err.code == "EPERM" || err.code == "EACCES") && err.syscall == "unlink") { + // Error deleting the file on disk, should fail gracefully + $tw.syncer.displayError("Server desynchronized. Error deleting file for deleted tiddler: "+title, err); + return callback(null); + } else { + return callback(err); + } } + return callback(null); }); } else { callback(null); From 6a91dbfe2f6e52512d7f063b6d5e3742ff77126d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 1 Dec 2020 10:39:27 +0000 Subject: [PATCH 1061/2376] Add support for working with negative dates See discussion https://groups.google.com/g/tiddlywiki/c/aHlyaHr93Io/m/vGcDa6lxAgAJ --- boot/boot.js | 7 ++- core/modules/utils/utils.js | 13 +++-- editions/test/tiddlers/tests/test-utils.js | 25 ++++++++++ .../tw5.com/tiddlers/concepts/Date Fields.tid | 28 ----------- .../tw5.com/tiddlers/features/DateFormat.tid | 48 ------------------- 5 files changed, 41 insertions(+), 80 deletions(-) delete mode 100644 editions/tw5.com/tiddlers/concepts/Date Fields.tid delete mode 100644 editions/tw5.com/tiddlers/features/DateFormat.tid diff --git a/boot/boot.js b/boot/boot.js index 97bf73837..f6341dab0 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -305,7 +305,12 @@ $tw.utils.stringifyDate = function(value) { // Parse a date from a UTC YYYYMMDDHHMMSSmmm format string $tw.utils.parseDate = function(value) { if(typeof value === "string") { - var year = parseInt(value.substr(0,4),10), + var negative = 1; + if(value.charAt(0) === "-") { + negative = -1; + value = value.substr(1); + } + var year = parseInt(value.substr(0,4),10) * negative, d = new Date(Date.UTC(year, parseInt(value.substr(4,2),10)-1, parseInt(value.substr(6,2),10), diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index a606c2a2a..b3c56fb8c 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -302,7 +302,7 @@ exports.formatDateString = function(date,template) { return $tw.utils.pad($tw.utils.getHours12(date)); }], [/^wYYYY/, function() { - return $tw.utils.getYearForWeekNo(date); + return $tw.utils.pad($tw.utils.getYearForWeekNo(date),4); }], [/^hh12/, function() { return $tw.utils.getHours12(date); @@ -311,7 +311,14 @@ exports.formatDateString = function(date,template) { return date.getDate() + $tw.utils.getDaySuffix(date); }], [/^YYYY/, function() { - return date.getFullYear(); + return $tw.utils.pad(date.getFullYear(),4); + }], + [/^aYYYY/, function() { + return $tw.utils.pad(Math.abs(date.getFullYear()),4); + }], + [/^\{era:([^,\|}]*)\|([^}\|]*)\|([^}]*)\}/, function(match) { + var year = date.getFullYear(); + return year === 0 ? match[2] : (year < 0 ? match[1] : match[3]); }], [/^0hh/, function() { return $tw.utils.pad(date.getHours()); @@ -400,7 +407,7 @@ exports.formatDateString = function(date,template) { $tw.utils.each(matches, function(m) { var match = m[0].exec(t); if(match) { - matchString = m[1].call(); + matchString = m[1].call(null,match); t = t.substr(match[0].length); return false; } diff --git a/editions/test/tiddlers/tests/test-utils.js b/editions/test/tiddlers/tests/test-utils.js index ec60a6691..d57b0e0dc 100644 --- a/editions/test/tiddlers/tests/test-utils.js +++ b/editions/test/tiddlers/tests/test-utils.js @@ -25,6 +25,16 @@ describe("Utility tests", function() { expect(psa(" [[Tidd\u00a0ler8]] two ")).toEqual(["Tidd\u00a0ler8","two"]); }); + it("should handle parsing a date", function() { + var pd = function(v) { + return $tw.utils.parseDate(v).toString(); + }; + expect(pd("20150428204930183")).toEqual("Tue Apr 28 2015 21:49:30 GMT+0100 (British Summer Time)"); + expect(pd("-20150428204930183")).toEqual("Sun Apr 28 -2015 20:48:15 GMT-0001 (British Summer Time)"); + expect(pd("00730428204930183")).toEqual("Fri Apr 28 0073 20:48:15 GMT-0001 (British Summer Time)"); + expect(pd("-00730428204930183")).toEqual("Thu Apr 28 -0073 20:48:15 GMT-0001 (British Summer Time)"); + }); + it("should handle base64 encoding emojis", function() { var booksEmoji = "📚"; expect(booksEmoji).toBe(booksEmoji); @@ -62,6 +72,8 @@ describe("Utility tests", function() { var fds = $tw.utils.formatDateString, // nov is month: 10! d = new Date(2014,10,9,17,41,28,542); + expect(fds(d,"{era:bce||ce}")).toBe("ce"); + expect(fds(d,"YYYY")).toBe("2014"); expect(fds(d,"DDD DD MMM YYYY")).toBe("Sunday 9 November 2014"); expect(fds(d,"ddd hh mm ssss")).toBe("Sun 17 41 2828"); expect(fds(d,"MM0DD")).toBe("1109"); @@ -92,6 +104,19 @@ describe("Utility tests", function() { d = new Date(2014,11,29,23,59,59); expect(fds(d,"WW")).toBe("1"); expect(fds(d,"wYYYY")).toBe("2015"); + + // Negative years + d = new Date(-2014,10,9,17,41,28,542); + expect(fds(d,"YYYY")).toBe("-2014"); + expect(fds(d,"aYYYY")).toBe("2014"); + expect(fds(d,"{era:bce||ce}")).toBe("bce"); + + // Zero years + d = new Date(0,10,9,17,41,28,542); + d.setUTCFullYear(0); // See https://stackoverflow.com/a/5870822 + expect(fds(d,"YYYY")).toBe("0000"); + expect(fds(d,"aYYYY")).toBe("0000"); + expect(fds(d,"{era:bce|z|ce}")).toBe("z"); }); it("should parse text references", function() { diff --git a/editions/tw5.com/tiddlers/concepts/Date Fields.tid b/editions/tw5.com/tiddlers/concepts/Date Fields.tid deleted file mode 100644 index b1dcbe82d..000000000 --- a/editions/tw5.com/tiddlers/concepts/Date Fields.tid +++ /dev/null @@ -1,28 +0,0 @@ -created: 20150117190213631 -modified: 20150124214537000 -tags: Concepts -title: Date Fields -type: text/vnd.tiddlywiki - -Certain [[fields|TiddlerFields]] of a tiddler are used to store dates and times. - -The two standard date fields are <<.field created>> and <<.field modified>>. - -Values of date fields are 17-character strings: - -* 4 digits for the year -* 2 digits for the month -* 2 digits for the day -* 2 digits for the hour -* 2 digits for the minute -* 2 digits for the second -* 3 digits for the millisecond - -To avoid problems arising from differences of time zone, TiddlyWiki always uses [[UTC|https://en.wikipedia.org/wiki/Coordinated_Universal_Time]]. - -As an example, the <<.field created>> field of this tiddler has the value <<.value """<$view field="created"/>""">>. - -Dates can be [[converted to other formats|DateFormat]] for display: - -<$macrocall $name="wikitext-example-without-html" -src="""<$view field="created" format="date" template="DDD DDth MMM YYYY"/>"""> diff --git a/editions/tw5.com/tiddlers/features/DateFormat.tid b/editions/tw5.com/tiddlers/features/DateFormat.tid deleted file mode 100644 index 4d138e576..000000000 --- a/editions/tw5.com/tiddlers/features/DateFormat.tid +++ /dev/null @@ -1,48 +0,0 @@ -created: 20140418142957325 -modified: 20180730201626985 -tags: Features -title: DateFormat -type: text/vnd.tiddlywiki - -When used to display date values (with the `format` attribute set to ''date''), the ViewWidget accepts a `template` attribute that allows the format of the date values to be specified. The format string is processed with the following substitutions: - -|!Token |!Substituted Value | -|`DDD` |Day of week in full (eg, "Monday") | -|`ddd` |Short day of week (eg, "Mon") | -|`DD` |Day of month | -|`0DD` |Adds a leading zero | -|`DDth` |Adds a suffix | -|`WW` |ISO-8601 week number of year | -|`0WW` |Adds a leading zero | -|`MMM` |Month in full (eg, "July") | -|`mmm` |Short month (eg, "Jul") | -|`MM` |Month number | -|`0MM` |Adds leading zero | -|`YYYY` |Full year | -|`YY` |Two digit year | -|`wYYYY` |Full year with respect to week number | -|`wYY` |Two digit year with respect to week number | -|`hh` |Hours | -|`0hh` |Adds a leading zero | -|`hh12` |Hours in 12 hour clock | -|`0hh12` |Hours in 12 hour clock with leading zero | -|`mm` |Minutes | -|`0mm` |Minutes with leading zero | -|`ss` |Seconds | -|`0ss` |Seconds with leading zero | -|`XXX` |Milliseconds | -|`0XXX` |Milliseconds with leading zero | -|`am` or `pm` |Lower case AM/PM indicator | -|`AM` or `PM` |Upper case AM/PM indicator | -|`TZD` |Timezone offset | -|`\x` |Used to escape a character that would otherwise have special meaning | -|`[UTC]`|Time-shift the represented date to UTC. Must be at very start of format string| - -Note that other text is passed through unchanged, allowing commas, colons or other separators to be used. - -! Examples - -|!Template |!Output | -|`DDth MMM YYYY` |16th February 2011 | -|`DDth MMM \M\M\M YYYY` |16th February MMM 2011 | -|`DDth mmm YYYY 0hh:0mm:0ss` |16th Feb 2011 11:38:42 | From b63049b4df7baff5ec10627ed545f52020ba611d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 1 Dec 2020 10:52:24 +0000 Subject: [PATCH 1062/2376] Fix tests to work in other timezones Oops. --- editions/test/tiddlers/tests/test-utils.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/editions/test/tiddlers/tests/test-utils.js b/editions/test/tiddlers/tests/test-utils.js index d57b0e0dc..e8f4de32f 100644 --- a/editions/test/tiddlers/tests/test-utils.js +++ b/editions/test/tiddlers/tests/test-utils.js @@ -27,12 +27,12 @@ describe("Utility tests", function() { it("should handle parsing a date", function() { var pd = function(v) { - return $tw.utils.parseDate(v).toString(); + return $tw.utils.parseDate(v).toUTCString(); }; - expect(pd("20150428204930183")).toEqual("Tue Apr 28 2015 21:49:30 GMT+0100 (British Summer Time)"); - expect(pd("-20150428204930183")).toEqual("Sun Apr 28 -2015 20:48:15 GMT-0001 (British Summer Time)"); - expect(pd("00730428204930183")).toEqual("Fri Apr 28 0073 20:48:15 GMT-0001 (British Summer Time)"); - expect(pd("-00730428204930183")).toEqual("Thu Apr 28 -0073 20:48:15 GMT-0001 (British Summer Time)"); + expect(pd("20150428204930183")).toEqual("Tue, 28 Apr 2015 20:49:30 GMT"); + expect(pd("-20150428204930183")).toEqual("Sun, 28 Apr -2015 20:49:30 GMT"); + expect(pd("00730428204930183")).toEqual("Fri, 28 Apr 0073 20:49:30 GMT"); + expect(pd("-00730428204930183")).toEqual("Thu, 28 Apr -0073 20:49:30 GMT"); }); it("should handle base64 encoding emojis", function() { From 13b69a9c109ada59e322a99b9cef61f1ac161225 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 1 Dec 2020 15:51:07 +0000 Subject: [PATCH 1063/2376] Missing docs for working with negative years --- .../tw5.com/tiddlers/concepts/Date Fields.tid | 29 +++++++++++ .../tw5.com/tiddlers/features/DateFormat.tid | 52 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 editions/tw5.com/tiddlers/concepts/Date Fields.tid create mode 100644 editions/tw5.com/tiddlers/features/DateFormat.tid diff --git a/editions/tw5.com/tiddlers/concepts/Date Fields.tid b/editions/tw5.com/tiddlers/concepts/Date Fields.tid new file mode 100644 index 000000000..7ffb40c5c --- /dev/null +++ b/editions/tw5.com/tiddlers/concepts/Date Fields.tid @@ -0,0 +1,29 @@ +created: 20150117190213631 +modified: 20201201154211507 +tags: Concepts +title: Date Fields +type: text/vnd.tiddlywiki + +Certain [[fields|TiddlerFields]] of a tiddler are used to store dates and times. TiddlyWiki supports dates from the year -9999 to the year 9999. + +The two standard date fields are <<.field created>> and <<.field modified>>. + +Values of date fields are 17 or 18-character strings: + +* <<.from-version "5.1.23">> an optional minus sign `-` to indicate a negative year +* 4 digits for the year +* 2 digits for the month +* 2 digits for the day +* 2 digits for the hour +* 2 digits for the minute +* 2 digits for the second +* 3 digits for the millisecond + +To avoid problems arising from differences of time zone, TiddlyWiki always uses [[UTC|https://en.wikipedia.org/wiki/Coordinated_Universal_Time]]. + +As an example, the <<.field created>> field of this tiddler has the value <<.value """<$view field="created"/>""">>. + +Dates can be [[converted to other formats|DateFormat]] for display: + +<$macrocall $name="wikitext-example-without-html" +src="""<$view field="created" format="date" template="DDD DDth MMM YYYY"/>"""> diff --git a/editions/tw5.com/tiddlers/features/DateFormat.tid b/editions/tw5.com/tiddlers/features/DateFormat.tid new file mode 100644 index 000000000..d0426565e --- /dev/null +++ b/editions/tw5.com/tiddlers/features/DateFormat.tid @@ -0,0 +1,52 @@ +created: 20140418142957325 +modified: 20201201154521138 +tags: Features +title: DateFormat +type: text/vnd.tiddlywiki + +When used to display date values (with the `format` attribute set to ''date''), the ViewWidget accepts a `template` attribute that allows the format of the date values to be specified. The format string is processed with the following substitutions: + +|!Token |!Substituted Value | +|`DDD` |Day of week in full (eg, "Monday") | +|`ddd` |Short day of week (eg, "Mon") | +|`DD` |Day of month | +|`0DD` |Adds a leading zero | +|`DDth` |Adds a suffix | +|`WW` |ISO-8601 week number of year | +|`0WW` |Adds a leading zero | +|`MMM` |Month in full (eg, "July") | +|`mmm` |Short month (eg, "Jul") | +|`MM` |Month number | +|`0MM` |Adds leading zero | +|`YYYY` |Full year | +|`YY` |Two digit year | +|`wYYYY` |Full year with respect to week number | +|`aYYYY` |<<.from-version "5.1.23">> Full year but negative dates are displayed as positive | +|`wYY` |Two digit year with respect to week number | +|`{era:BCE||CE}` |<<.from-version "5.1.23">> Displays a different string for years that are negative, zero or positive (see below) | +|`hh` |Hours | +|`0hh` |Adds a leading zero | +|`hh12` |Hours in 12 hour clock | +|`0hh12` |Hours in 12 hour clock with leading zero | +|`mm` |Minutes | +|`0mm` |Minutes with leading zero | +|`ss` |Seconds | +|`0ss` |Seconds with leading zero | +|`XXX` |Milliseconds | +|`0XXX` |Milliseconds with leading zero | +|`am` or `pm` |Lower case AM/PM indicator | +|`AM` or `PM` |Upper case AM/PM indicator | +|`TZD` |Timezone offset | +|`\x` |Used to escape a character that would otherwise have special meaning | +|`[UTC]`|Time-shift the represented date to UTC. Must be at very start of format string| + +Note that other text is passed through unchanged, allowing commas, colons or other separators to be used. + +The `{era:BCE||CE}` notation can specify different strings for years that are negative, zero or positive. For example `{era:BC|Z|AD}` would display `BC` for negative years, `AD` for positive years, and `Z` for year zero. + +! Examples + +|!Template |!Output | +|`DDth MMM YYYY` |16th February 2011 | +|`DDth MMM \M\M\M YYYY` |16th February MMM 2011 | +|`DDth mmm YYYY 0hh:0mm:0ss` |16th Feb 2011 11:38:42 | From 68cb08749f006b7b7dfd15979b64d5f1daa77832 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Tue, 1 Dec 2020 09:36:38 -0800 Subject: [PATCH 1064/2376] Docs for filesystem adaptor update (#5169) * rebased to master * cleanup typos * typo --- .../Customising Tiddler File Naming.tid | 44 +++++++++++++++---- .../nodejs/tiddlywiki.files_Files.tid | 42 ++++++++++++++++-- 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid b/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid index 8bd4d121c..d13a6ce3b 100644 --- a/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid +++ b/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid @@ -1,25 +1,51 @@ created: 20160424181300000 -modified: 20160424181300000 +modified: 20201201000000000 tags: [[TiddlyWiki on Node.js]] title: Customising Tiddler File Naming type: text/vnd.tiddlywiki -By default, a [[TiddlyWiki on Node.js]] instance using a [[wiki folder|TiddlyWikiFolders]] will create new tiddler files by using the sanitised and disambiguated title as filename. +By default, a [[TiddlyWiki on Node.js]] instance using a [[wiki folder|TiddlyWikiFolders]] will create new tiddler files by using the sanitised and disambiguated title as filename and write them to the wiki folder's `tiddlers/` directory. The default file extension of `.tid` is used for tiddlers that are missing the `type` field, or for tiddlers of type "text/vnd.tiddlywiki". Tidders of other types are saved according to their IMIE types (defined at boot startup). Both the logical path (directory and file name) and the file extension can be customized independently by creating optional tiddlers: [[$:/config/FileSystemPaths]] and [[$:/config/FileSystemExtensions]]. -This can be customised by creating a tiddler [[$:/config/FileSystemPaths]] containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Newly created tiddlers are matched to each filter in turn, and the first output of the first filter to produce any output is taken as a logical path to be used for the tiddler file. Logical paths don't include the `.tid` extension, and they can use `/` or `\` as directory separator (when generating the physical path, this is replaced by the correct separator for the platform ~TiddlyWiki is running on). If none of the filters matches, the logical path is simply the title with all occurences of `/` replaced by `_` (for backwards compatibility). +! File System Paths -In both cases, the characters `<>:"\|?*^` are replaced by `_` in order to guarantee that the resulting path is legal on all supported platforms. +The logical path can be customised by creating a tiddler [[$:/config/FileSystemPaths]] containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Newly created tiddlers are matched to each filter in turn, and the first output of the first filter to produce any output is taken as a logical path to be used for the tiddler file. Tiddlers are also tested against the [[$:/config/FileSystemPaths]] on every save to disk, and if the logical path has changed a new file is created and the old file deleted. + +Tiddlers are limited to being written to the [[wiki folder|TiddlyWikiFolders]]. Any error saving a tiddler to disk, with a logical path that does not start with the wiki folder's path the most common error, causes the filepath to be encoded via Javascript's `encodeURIComponent()` method and the tiddler is saved as this file in the wiki folder's `tiddlers/` directory. + +Logical paths do not include the file-on-disk's extension (see below), and they can use `/` or `\` as directory separator (when generating the physical path, this is replaced by the correct separator for the platform ~TiddlyWiki is running on). If none of the filters matches, the logical path is simply the title with all occurences of `/` replaced by `_` (for backwards compatibility). + +In both cases, the characters `<>~:"\|?*^` are replaced by `_` in order to guarantee that the resulting path is legal on all supported platforms. !! Example ``` -[is[system]removeprefix[$:/]addprefix[_system/]] +[is[system]!has[draft.of]removeprefix[$:/]addprefix[_system/]] +[is[draft]search-replace:g:regexp[/|\\],[_]addprefix[drafts/]] [tag[task]addprefix[mytasks/]] -[!has[draft.of]] +[tag[externalnote]addprefix[../externalnotes/]] +[addprefix[wiki/]] ``` -This will store newly created system tiddlers in `tiddlers/_system` (after stripping the `$:/` prefix), tiddlers tagged [[task]] in a subdirectory `tiddlers/mytasks`, and also create subdirectory structures for all other non-draft tiddlers. +This will store newly created system tiddlers that are not drafts of other tiddlers in `tiddlers/_system` (after stripping the `$:/` prefix). Next, all drafts have the path seperator characters in their titles replaced by "_" and are stored in `tiddlers/drafts/`. Then tiddlers tagged [[task]] are stored in a subdirectory `tiddlers/mytasks/`. Next, all tiddlers tagged "externalnote" will be written to `<wikiFolder>/tiddlers/../externalnotes/`, which resolves to `<wikiFolder>/externalnotes/` and places these tiddlers outside of the tiddler folder. Use [[tiddlywiki.files Files|tiddlywiki.files_Files]] to reimport these tiddlers when the wiki server is restarted. Finally, all tidders will match the final `[addprefix[wiki/]]` storing these in `<wikiFolder>/tiddlers/wiki/`. -Thus, $:/config/FileSystemPaths itself will end up in `tiddlers/_system/config/FileSystemPaths.tid` or `tiddlers\_system\config\FileSystemPaths.tid`, depending on the platform. +Because there was a filter match, any `/` or `\` in the tiddler title is mapped to a path separator. With the above filters, the non-system, non-draft tiddler `some/thing/entirely/new` (with no tags) will be saved to `<wikiFolder>/tiddlers/wiki/some/thing/entirely/new.tid` (ie, the file `new.tid` in a directory called `entirely/`). Thus, $:/config/FileSystemPaths itself will end up in `tiddlers/_system/config/FileSystemPaths.tid` or `tiddlers\_system\config\FileSystemPaths.tid`, depending on the platform. -The final `[!has[draft.of]]` will match all remaining non-draft tiddlers. Because there was a match, any `/` or `\` in the tiddler title is mapped to a path separator. Thus, `some/thing/entirely/new` will be saved to `tiddlers/some/thing/entirely/new.tid` (ie, the file `new.tid` in a directory called `entirely`). +! File System Extensions + +Normally, the file system extension of a tiddler on disk is determined by the existance of bad fields (multi-line fields other than the text field, fields that can be trimmed of spaces from the fron or back, etc), in which case the single-file ".json" tiddler-file format is used. If the tiddler does not have bad fields, then the `type` field is referenced to find a matching file-type. Tiddlywiki's boot engine defines a set of these tiddler-type to file-type relationships in the [[$:/boot/boot.js]] tiddler. Search for `// Add file extension information` to find the section of code that defines these relationships. + +The file extension of individual tidders can be customised by creating a tiddler [[$:/config/FileSystemExtensions]] containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Newly created tiddlers are matched to each filter in turn, and the first output of the first filter to produce any output is taken as the file extension to be used for the tiddler file. Extensions should always start with a leading dot (see example). Tiddlers are also tested against the $:/config/FileSystemExtensions on every save to disk, and if the extension has changed a new file is created and the old file deleted. If no filter matches, the default extension is used. + +Two special cases should be noted: Result of ".tid" will force the tiddler to be written to disk as a single-file text tiddler. A result of ".json" will force the tiddler to be written to disk as a single-file tiddler in json-format (a single tiddler fields object in an array), NOT as a tiddler of type "application/json". All other recognized file-types will be saved using their defined extention along with an acompanying *.meta file of the same name which describes all fields but the "text" field. + +!! Example + +``` +[tag[.txt]then[.txt]] +[tag[.json]then[.json]] +[tag[.tid]then[.tid]] +``` + +This will cause all tidders that have the tag ".txt" in their tags field to be saved at the filepath determined by the File System Paths filters, but with their text field saved as a *.txt file, and all other fields saved as a *.txt.meta file. + +Next, all tiddlers that have the ".json" tag are saved as *.json single-file tiddlers. Finally, all tiddlers that have tag ".tid" are saved as single-file text tiddlers. If a tiddler matches none of the filters, the default extension determined by the tiddler's `type` field would be used. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid b/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid index 59c9a679d..389643175 100644 --- a/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid +++ b/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid @@ -1,5 +1,5 @@ created: 20161015114118243 -modified: 20161015170604353 +modified: 20201201000000000 tags: TiddlyWikiFolders title: tiddlywiki.files Files type: text/vnd.tiddlywiki @@ -51,7 +51,7 @@ Directory specifications in the `directories` array may take the following forms ** ''path'' - (required) the absolute or relative path to the directory containing the tiddler files (relative paths are interpreted relative to the path of the `tiddlywiki.files` file). Note that the directory is not recursively searched; sub-directories are ignored ** ''filesRegExp'' - (optional) a [[regular expression|https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions]] that matches the filenames of the files that should be processed within the directory ** ''isTiddlerFile'' - (required) if `true`, the file will be treated as a [[tiddler file|TiddlerFiles]] and deserialised to extract the tiddlers. Otherwise, the raw content of the file is assigned to the `text` field without any parsing -** ''isEditableFile'' - (optional) if `true`, changes to the tiddler be saved back to the original file. <<.from-version "5.1.23">> +** ''isEditableFile'' - (optional) if `true`, changes to the tiddler be saved back to the original file. The ''path'' of the current directory being read must be within the wiki's base directory, and a $:/config/FileSystemPath filter is required to add the correct logical path to the tiddler's title (see second **Example**). <<.from-version "5.1.23">> ** ''fields'' - (required) an object containing values that override or customise the fields provided in the tiddler file (see above) Fields can be overridden for particular files by creating a file with the same name plus the suffix `.meta` -- see TiddlerFiles. @@ -64,7 +64,7 @@ There are also several examples of `tiddlywiki.files` files in the main [[Tiddly !! Importing a folder of PDFs -This example retrieves all the files with the extension `.pdf` from a folder specified by a relative path. Each tiddler is set up for LazyLoading with the following fields: +This example retrieves all the files with the extension `.pdf` from a folder specified by a relative path. This path starts with "../../../" indicating 3 directory levels above the folder holdng this confog fole. Each tiddler is set up for LazyLoading with the following fields: * ''title'' - set to the URI decoded base filename of the PDF file. [[URI decoding|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent]] allows characters like "/" to be included in titles by URI encoding them as "%2F" * ''created'' - set to the creation date/time of the PDF file @@ -94,3 +94,39 @@ This example retrieves all the files with the extension `.pdf` from a folder spe ] } ``` +!! Importing a folder of text files + +This example retrieves all the files with the extension `.txt` from a folder specified by a relative path. This folder is within the wiki's base directory, and the current config file is in a directory within the wiki's "tiddlers/" directory. So, in this case the path starts with "../../" to traverse upwards two directory levels, and then down into the "externalnotes/" directory. Each tiddler is set up with the following fields: + +* ''title'' - set to the URI decoded base filename of the text file. [[URI decoding|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent]] allows characters like "/" to be included in titles by URI encoding them as "%2F" +* ''created'' - set to the creation date/time of the text file +* ''modified'' - set to the modification date/time of the text file +* ''type'' - set to `text/plain` +* ''tags'' - set to `[[note]] [[externalnote]]` (using array notation) +* ''text'' - not set, thus the content of the file is loaded as the text field + +``` +{ + "directories": [ + { + "path": "../../externalnotes", + "filesRegExp": ".+\\.txt", + "isTiddlerFile": false, + "isEditableFile": true, + "fields": { + "title": {"source": "basename-uri-decoded"}, + "created": {"source": "created"}, + "modified": {"source": "modified"}, + "type": "text/plain", + "tags": ["note", "externalnote", ".txt"] + } + } + ] +} +``` + +This will load all text files in the `<wikiBase>/externalnotes/` directory into the wiki as individual tiddlers. These can be a collection of snippets in various markup-languages. Then, the `type` field of each of these tiddlers can be changed to match their languages For example, "text/vnd.tiddlywiki" for wikitext, or "text/markdown" for markdown files. Then, using $:/config/FileSystemPaths and $:/config/FileSystemExtentions tiddlers with the following lines we can cause any changes to these tiddlers to be saved back to the directory they started from, and as "*.txt" files with accompanying "*.txt.meta" files. These meta files will then over-ride any fields generated from the config `tiddlywiki.files` file (such as the tiddler's `type` field) when the server is restarted. + +From the examples in [[Customising Tiddler File Naming]] we see that the `[tag[externalnote]addprefix[../externalnotes/]]` filter in the $:/config/FileSystemPaths tiddler catches all tiddlers tagged with `externalnotes` (that have not matched an earlier filter). These tiddlers have "../externalnotes/" appended to their titles to render the final logical path. As this path starts in the wiki's "tiddlers/" folder by default (one folder above the folder holding the above config file) it differes by one set of "../". + +Then, the `[tag[.txt]then[.txt]]` filter in the $:/config/FileSystemExtensions tiddler forces all these text files (which start with tag ".txt") to be saved back to disk as *.txt and accompanying *.txt.meta files (overriding the normal tiddler-type to file-type mapping). In this case, allowing the snippets of Tiddlywiki wikitext or markdown-text to be saved back to "text" *.txt files. \ No newline at end of file From 880930da8bced8f4c161cfd31f5f3324aaabacac Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Tue, 1 Dec 2020 19:11:09 +0100 Subject: [PATCH 1065/2376] Add actions parameter to range-widget + docs! (#5158) * add actionsStart, -Stop and actions to range-widgets * fix indent --- core/modules/widgets/range.js | 84 ++++++++++++++++--- .../tiddlers/widgets/RangeWidget Example.tid | 54 ++++++++++++ .../tw5.com/tiddlers/widgets/RangeWidget.tid | 7 +- 3 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid diff --git a/core/modules/widgets/range.js b/core/modules/widgets/range.js index 46e12061a..4dd55dc3c 100644 --- a/core/modules/widgets/range.js +++ b/core/modules/widgets/range.js @@ -52,8 +52,10 @@ RangeWidget.prototype.render = function(parent,nextSibling) { this.inputDomNode.value = this.getValue(); // Add a click event handler $tw.utils.addEventListeners(this.inputDomNode,[ - {name: "input", handlerObject: this, handlerMethod: "handleInputEvent"}, - {name: "change", handlerObject: this, handlerMethod: "handleInputEvent"} + {name:"mousedown", handlerObject:this, handlerMethod:"handleMouseDownEvent"}, + {name:"mouseup", handlerObject:this, handlerMethod:"handleMouseUpEvent"}, + {name:"change", handlerObject:this, handlerMethod:"handleChangeEvent"}, + {name:"input", handlerObject:this, handlerMethod:"handleInputEvent"}, ]); // Insert the label into the DOM and render any children parent.insertBefore(this.inputDomNode,nextSibling); @@ -62,23 +64,77 @@ RangeWidget.prototype.render = function(parent,nextSibling) { RangeWidget.prototype.getValue = function() { var tiddler = this.wiki.getTiddler(this.tiddlerTitle), - fieldName = this.tiddlerField || "text", - value = this.defaultValue; + fieldName = this.tiddlerField, + value = this.defaultValue; if(tiddler) { if(this.tiddlerIndex) { - value = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue || ""); + value = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue); } else { if($tw.utils.hop(tiddler.fields,fieldName)) { value = tiddler.fields[fieldName] || ""; } else { - value = this.defaultValue || ""; + value = this.defaultValue; } } } return value; }; +RangeWidget.prototype.getActionVariables = function(options) { + options = options || {}; + var hasChanged = (this.startValue !== this.inputDomNode.value) ? "yes" : "no"; + // Trigger actions. Use variables = {key:value, key:value ...} + // the "value" is needed. + return $tw.utils.extend({"actionValue": this.inputDomNode.value, "actionValueHasChanged": hasChanged}, options); +} + +// actionsStart +RangeWidget.prototype.handleMouseDownEvent = function(event) { + this.mouseDown = true; // TODO remove once IE is gone. + this.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone! + this.handleEvent(event); + // Trigger actions + if(this.actionsMouseDown) { + var variables = this.getActionVariables() // TODO this line will go into the function call below. + this.invokeActionString(this.actionsMouseDown,this,event,variables); + } +} + +// actionsStop +RangeWidget.prototype.handleMouseUpEvent = function(event) { + this.mouseDown = false; // TODO remove once IE is gone. + this.handleEvent(event); + // Trigger actions + if(this.actionsMouseUp) { + var variables = this.getActionVariables() + this.invokeActionString(this.actionsMouseUp,this,event,variables); + } + // TODO remove the following if() once IE is gone! + if ($tw.browser.isIE) { + if (this.startValue !== this.inputDomNode.value) { + this.handleChangeEvent(event); + this.startValue = this.inputDomNode.value; + } + } +} + +RangeWidget.prototype.handleChangeEvent = function(event) { + if (this.mouseDown) { // TODO refactor this function once IE is gone. + this.handleInputEvent(event); + } +}; + RangeWidget.prototype.handleInputEvent = function(event) { + this.handleEvent(event); + // Trigger actions + if(this.actionsInput) { + // "tiddler" parameter may be missing. See .execute() below + var variables = this.getActionVariables({"actionValueHasChanged": "yes"}) // TODO this line will go into the function call below. + this.invokeActionString(this.actionsInput,this,event,variables); + } +}; + +RangeWidget.prototype.handleEvent = function(event) { if(this.getValue() !== this.inputDomNode.value) { if(this.tiddlerIndex) { this.wiki.setText(this.tiddlerTitle,"",this.tiddlerIndex,this.inputDomNode.value); @@ -92,16 +148,24 @@ RangeWidget.prototype.handleInputEvent = function(event) { Compute the internal state of the widget */ RangeWidget.prototype.execute = function() { + // TODO remove the next 1 lines once IE is gone! + this.mouseUp = true; // Needed for IE10 // Get the parameters from the attributes this.tiddlerTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler")); - this.tiddlerField = this.getAttribute("field"); + this.tiddlerField = this.getAttribute("field","text"); this.tiddlerIndex = this.getAttribute("index"); this.minValue = this.getAttribute("min"); this.maxValue = this.getAttribute("max"); this.increment = this.getAttribute("increment"); - this.defaultValue = this.getAttribute("default"); + this.defaultValue = this.getAttribute("default",""); this.elementClass = this.getAttribute("class",""); this.isDisabled = this.getAttribute("disabled","no"); + // Actions since 5.1.23 + // Next 2 only fire once! + this.actionsMouseDown = this.getAttribute("actionsStart",""); + this.actionsMouseUp = this.getAttribute("actionsStop",""); + // Input fires very often! + this.actionsInput = this.getAttribute("actions",""); // Make the child widgets this.makeChildWidgets(); }; @@ -111,7 +175,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ RangeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.disabled) { + if($tw.utils.count(changedAttributes) > 0) { this.refreshSelf(); return true; } else { @@ -119,7 +183,7 @@ RangeWidget.prototype.refresh = function(changedTiddlers) { if(changedTiddlers[this.tiddlerTitle]) { var value = this.getValue(); if(this.inputDomNode.value !== value) { - this.inputDomNode.value = value; + this.inputDomNode.value = value; } refreshed = true; } diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid new file mode 100644 index 000000000..822313374 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid @@ -0,0 +1,54 @@ +created: 20201130191618831 +modified: 20201130194441670 +tags: RangeWidget +title: RangeWidget Example +type: text/vnd.tiddlywiki + +\define getText() $(text)$ - value: $(value)$ - changed: $(actionValueHasChanged)$ + +\define range-log(text:"", value:"", tiddler:"$:/temp/range/log") +<$vars text="""$text$""" value="""$value$""" > +<$action-setfield $tiddler="""$tiddler$""" $index=<<now "0hh-0mm-0ss:0XXX">> $value=<<getText>>/> +</$vars> +\end + +\define clear-range-log(tiddler:"$:/temp/range/log") +<$action-setfield $tiddler="""$tiddler$""" text="{}" show=show/> +\end + +\define logTiddler()$:/temp/range/log + +\define clearLogButton()<$button actions=<<clear-range-log>>>Clear Log</$button> + +\define actionsStop() +<$macrocall $name="range-log" text=" actionsStop" value=<<actionValue>> /> +\end + +\define actionsStart() +<$macrocall $name="range-log" text=" actionsStart" value=<<actionValue>> /> +\end + +\define actions() +<$macrocall $name="range-log" text="actions" value=<<actionValue>> /> +\end + +!! Using Actions + +<$range tiddler="$:/temp/range/1__" min="-1" max="10" default="1" increment="1" + actionsStart=<<actionsStart>> actionsStop=<<actionsStop>> actions=<<actions>>/> {{$:/temp/range/1__}} + +<$range tiddler="$:/temp/range/__2" min="0" max="1" default=".01" increment=".01" + actionsStart=<<actionsStart>> actionsStop=<<actionsStop>> actions=<<actions>> /> {{$:/temp/range/__2}} + +<$checkbox tiddler=<<logTiddler>> field="show" checked="show" unchecked="hide"> Show log</$checkbox> <<clearLogButton>> + +<$reveal stateTitle=<<logTiddler>> stateField="show" type="match" text="show"> +<$transclude tiddler=<<logTiddler>> /> +</$reveal> + +--- + +<details> + <summary>Show the code [[RangeWidget Example]]</summary> + <pre><code><$view mode=text&><pre><code> +</details> diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid index bcabe646c..195b32fec 100644 --- a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid @@ -1,6 +1,6 @@ caption: range created: 20171102134825376 -modified: 20201109091723430 +modified: 20201130193635857 tags: Widgets title: RangeWidget type: text/vnd.tiddlywiki @@ -22,6 +22,9 @@ The content of the `<$range>` widget is ignored. |increment |The minimum amount by which a value may be changed. Defaults to 1 | |default |If the field is missing or empty this is the default position for the widget handle relative to the min and max values.| |class |CSS classes to be assigned to the label around the range slider | +|actions|<<.from-version "5.1.23">> Optional, A string containing ActionWidgets to be triggered when the value changes. <br>The variable: ''actionValue'' is available for ''all'' actions.<br>The variable: ''actionValueHasChanged'' is always `yes` here.| +|actionsStart|<<.from-version "5.1.23">> Optional, A string containing ~ActionWidgets to be triggered when the "handle" is ''clicked''. <br>The variable: ''actionValueHasChanged'' is always `no` here.| +|actionsStop|<<.from-version "5.1.23">> Optional, A string containing ~ActionWidgets to be triggered when the "handle" is ''released''. <br>The variable: ''actionValueHasChanged'' is `yes`, ''if'' the new-value is different to the start-value | |disabled|<<.from-version "5.1.23">> Optional, disables the range input if set to "yes". Defaults to "no"| ! Examples @@ -36,3 +39,5 @@ src="""<$range tiddler="$:/_RangeDemo/1" min="-1" max="10" default="1" increment <$macrocall $name='wikitext-example-without-html' src="""<$range tiddler="$:/_RangeDemo/2" min="0" max="1" default=".01" increment=".01"/> {{$:/_RangeDemo/2}}"""/> + +{{RangeWidget Example}} \ No newline at end of file From cc1f32067f78a6b3360db979c43510c3ed733677 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 1 Dec 2020 19:11:40 +0100 Subject: [PATCH 1066/2376] Update CodeMirror to 5.58.3 - fix vim-mode cursor invisible (#5172) * Update codemirror to v5.58.3 * Update jump-to-line.js * Update search.js --- .../files/addon/search/jump-to-line.js | 2 +- .../codemirror-search-replace/files/addon/search/search.js | 2 +- plugins/tiddlywiki/codemirror/files/codemirror.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js index c4285a645..05172fa03 100644 --- a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js +++ b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/jump-to-line.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: https://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../dialog/dialog"],e):e(CodeMirror)}(function(e){"use strict";function u(e,o){var r=Number(o);return/^[-+]/.test(o)?e.getCursor().line+r:r-1}e.commands.jumpToLine=function(t){var e,o,r,s,i,n,l=t.getCursor();o=(n=e=t).phrase("Jump to line:")+' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+n.phrase("(Use line:column or scroll% syntax)")+"</span>",r=t.phrase("Jump to line:"),s=l.line+1+":"+l.ch,i=function(e){var o,r;e&&((o=/^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(e))?t.setCursor(u(t,o[1]),Number(o[2])):(o=/^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(e))?(r=Math.round(t.lineCount()*Number(o[1])/100),/^[-+]/.test(o[1])&&(r=l.line+r+1),t.setCursor(r-1,l.ch)):(o=/^\s*\:?\s*([\+\-]?\d+)\s*/.exec(e))&&t.setCursor(u(t,o[1]),l.ch))},e.openDialog?e.openDialog(o,i,{value:s,selectValueOnOpen:!0}):i(prompt(r,s))},e.keyMap.default["Alt-G"]="jumpToLine"}); +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../dialog/dialog"],e):e(CodeMirror)}(function(e){"use strict";function u(e,o){var r=Number(o);return/^[-+]/.test(o)?e.getCursor().line+r:r-1}e.defineOption("search",{bottom:!1}),e.commands.jumpToLine=function(t){var e,o,r,s,i,n,l=t.getCursor();o=(n=e=t).phrase("Jump to line:")+' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+n.phrase("(Use line:column or scroll% syntax)")+"</span>",r=t.phrase("Jump to line:"),s=l.line+1+":"+l.ch,i=function(e){var o,r;e&&((o=/^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(e))?t.setCursor(u(t,o[1]),Number(o[2])):(o=/^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(e))?(r=Math.round(t.lineCount()*Number(o[1])/100),/^[-+]/.test(o[1])&&(r=l.line+r+1),t.setCursor(r-1,l.ch)):(o=/^\s*\:?\s*([\+\-]?\d+)\s*/.exec(e))&&t.setCursor(u(t,o[1]),l.ch))},e.openDialog?e.openDialog(o,i,{value:s,selectValueOnOpen:!0,bottom:e.options.search.bottom}):i(prompt(r,s))},e.keyMap.default["Alt-G"]="jumpToLine"}); diff --git a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js index 7efd7994a..134d0f307 100644 --- a/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js +++ b/plugins/tiddlywiki/codemirror-search-replace/files/addon/search/search.js @@ -1,3 +1,3 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: https://codemirror.net/LICENSE -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("./searchcursor"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./searchcursor","../dialog/dialog"],e):e(CodeMirror)}(function(d){"use strict";function n(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null}function y(e){return e.state.search||(e.state.search=new n)}function a(e){return"string"==typeof e&&e==e.toLowerCase()}function m(e,n,o){return e.getSearchCursor(n,o,{caseFold:a(n),multiline:!0})}function h(e,n,o,r,t){e.openDialog?e.openDialog(n,t,{value:r,selectValueOnOpen:!0}):t(prompt(o,r))}function r(e){return e.replace(/\\([nrt\\])/g,function(e,n){return"n"==n?"\n":"r"==n?"\r":"t"==n?"\t":"\\"==n?"\\":e})}function s(e){var n=e.match(/^\/(.*)\/([a-z]*)$/);if(n)try{e=new RegExp(n[1],-1==n[2].indexOf("i")?"":"i")}catch(e){}else e=r(e);return("string"==typeof e?""==e:e.test(""))&&(e=/x^/),e}function g(e,n,o){var r,t;n.queryText=o,n.query=s(o),e.removeOverlay(n.overlay,a(n.query)),n.overlay=(r=n.query,t=a(n.query),"string"==typeof r?r=new RegExp(r.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),t?"gi":"g"):r.global||(r=new RegExp(r.source,r.ignoreCase?"gi":"g")),{token:function(e){r.lastIndex=e.pos;var n=r.exec(e.string);if(n&&n.index==e.pos)return e.pos+=n[0].length||1,"searching";n?e.pos=n.index:e.skipToEnd()}}),e.addOverlay(n.overlay),e.showMatchesOnScrollbar&&(n.annotate&&(n.annotate.clear(),n.annotate=null),n.annotate=e.showMatchesOnScrollbar(n.query,a(n.query)))}function o(a,n,e,o){var r=y(a);if(r.query)return x(a,n);var t,s,i,c,l,u,p,f=a.getSelection()||r.lastQuery;f instanceof RegExp&&"x^"==f.source&&(f=null),e&&a.openDialog?(t=null,s=function(e,n){d.e_stop(n),e&&(e!=r.queryText&&(g(a,r,e),r.posFrom=r.posTo=a.getCursor()),t&&(t.style.opacity=1),x(a,n.shiftKey,function(e,n){var o;n.line<3&&document.querySelector&&(o=a.display.wrapper.querySelector(".CodeMirror-dialog"))&&o.getBoundingClientRect().bottom-4>a.cursorCoords(n,"window").top&&((t=o).style.opacity=.4)}))},c=C(i=a),l=f,u=s,p=function(e,n){var o=d.keyName(e),r=a.getOption("extraKeys"),t=r&&r[o]||d.keyMap[a.getOption("keyMap")][o];"findNext"==t||"findPrev"==t||"findPersistentNext"==t||"findPersistentPrev"==t?(d.e_stop(e),g(a,y(a),n),a.execCommand(t)):"find"!=t&&"findPersistent"!=t||(d.e_stop(e),s(n,e))},i.openDialog(c,u,{value:l,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){v(i)},onKeyDown:p}),o&&f&&(g(a,r,f),x(a,n))):h(a,C(a),"Search for:",f,function(e){e&&!r.query&&a.operation(function(){g(a,r,e),r.posFrom=r.posTo=a.getCursor(),x(a,n)})})}function x(o,r,t){o.operation(function(){var e=y(o),n=m(o,e.query,r?e.posFrom:e.posTo);(n.find(r)||(n=m(o,e.query,r?d.Pos(o.lastLine()):d.Pos(o.firstLine(),0))).find(r))&&(o.setSelection(n.from(),n.to()),o.scrollIntoView({from:n.from(),to:n.to()},20),e.posFrom=n.from(),e.posTo=n.to(),t&&t(n.from(),n.to()))})}function v(n){n.operation(function(){var e=y(n);e.lastQuery=e.query,e.query&&(e.query=e.queryText=null,n.removeOverlay(e.overlay),e.annotate&&(e.annotate.clear(),e.annotate=null))})}function C(e){return'<span class="CodeMirror-search-label">'+e.phrase("Search:")+'</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+e.phrase("(Use /re/ syntax for regexp search)")+"</span>"}function q(n,r,t){n.operation(function(){for(var o,e=m(n,r);e.findNext();){"string"!=typeof r?(o=n.getRange(e.from(),e.to()).match(r),e.replace(t.replace(/\$(\d)/g,function(e,n){return o[n]}))):e.replace(t)}})}function t(f,e){var n,o;f.getOption("readOnly")||(n=f.getSelection()||y(f).lastQuery,o='<span class="CodeMirror-search-label">'+(e?f.phrase("Replace all:"):f.phrase("Replace:"))+"</span>",h(f,o+(' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+f.phrase("(Use /re/ syntax for regexp search)")+"</span>"),o,n,function(p){p&&(p=s(p),h(f,'<span class="CodeMirror-search-label">'+f.phrase("With:")+'</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',f.phrase("Replace with:"),"",function(i){var c,l,u;i=r(i),e?q(f,p,i):(v(f),c=m(f,p,f.getCursor("from")),l=function(){var e,n,o,r,t,a,s=c.from();!(e=c.findNext())&&(c=m(f,p),!(e=c.findNext())||s&&c.from().line==s.line&&c.from().ch==s.ch)||(f.setSelection(c.from(),c.to()),f.scrollIntoView({from:c.from(),to:c.to()}),o='<span class="CodeMirror-search-label">'+(a=n=f).phrase("Replace?")+"</span> <button>"+a.phrase("Yes")+"</button> <button>"+a.phrase("No")+"</button> <button>"+a.phrase("All")+"</button> <button>"+a.phrase("Stop")+"</button> ",r=f.phrase("Replace?"),t=[function(){u(e)},l,function(){q(f,p,i)}],n.openConfirm?n.openConfirm(o,t):confirm(r)&&t[0]())},u=function(o){c.replace("string"==typeof p?i:i.replace(/\$(\d)/g,function(e,n){return o[n]})),l()},l())}))}))}d.commands.find=function(e){v(e),o(e)},d.commands.findPersistent=function(e){v(e),o(e,!1,!0)},d.commands.findPersistentNext=function(e){o(e,!1,!0,!0)},d.commands.findPersistentPrev=function(e){o(e,!0,!0,!0)},d.commands.findNext=o,d.commands.findPrev=function(e){o(e,!0)},d.commands.clearSearch=v,d.commands.replace=t,d.commands.replaceAll=function(e){t(e,!0)}}); +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("./searchcursor"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./searchcursor","../dialog/dialog"],e):e(CodeMirror)}(function(d){"use strict";function o(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null}function m(e){return e.state.search||(e.state.search=new o)}function a(e){return"string"==typeof e&&e==e.toLowerCase()}function y(e,o,n){return e.getSearchCursor(o,n,{caseFold:a(o),multiline:!0})}function h(e,o,n,r,t){e.openDialog?e.openDialog(o,t,{value:r,selectValueOnOpen:!0,bottom:e.options.search.bottom}):t(prompt(n,r))}function r(e){return e.replace(/\\([nrt\\])/g,function(e,o){return"n"==o?"\n":"r"==o?"\r":"t"==o?"\t":"\\"==o?"\\":e})}function s(e){var o=e.match(/^\/(.*)\/([a-z]*)$/);if(o)try{e=new RegExp(o[1],-1==o[2].indexOf("i")?"":"i")}catch(e){}else e=r(e);return("string"==typeof e?""==e:e.test(""))&&(e=/x^/),e}function g(e,o,n){var r,t;o.queryText=n,o.query=s(n),e.removeOverlay(o.overlay,a(o.query)),o.overlay=(r=o.query,t=a(o.query),"string"==typeof r?r=new RegExp(r.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),t?"gi":"g"):r.global||(r=new RegExp(r.source,r.ignoreCase?"gi":"g")),{token:function(e){r.lastIndex=e.pos;var o=r.exec(e.string);if(o&&o.index==e.pos)return e.pos+=o[0].length||1,"searching";o?e.pos=o.index:e.skipToEnd()}}),e.addOverlay(o.overlay),e.showMatchesOnScrollbar&&(o.annotate&&(o.annotate.clear(),o.annotate=null),o.annotate=e.showMatchesOnScrollbar(o.query,a(o.query)))}function n(a,o,e,n){var r=m(a);if(r.query)return x(a,o);var t,s,i,c,l,u,p,f=a.getSelection()||r.lastQuery;f instanceof RegExp&&"x^"==f.source&&(f=null),e&&a.openDialog?(t=null,s=function(e,o){d.e_stop(o),e&&(e!=r.queryText&&(g(a,r,e),r.posFrom=r.posTo=a.getCursor()),t&&(t.style.opacity=1),x(a,o.shiftKey,function(e,o){var n;o.line<3&&document.querySelector&&(n=a.display.wrapper.querySelector(".CodeMirror-dialog"))&&n.getBoundingClientRect().bottom-4>a.cursorCoords(o,"window").top&&((t=n).style.opacity=.4)}))},c=b(i=a),l=f,u=s,p=function(e,o){var n=d.keyName(e),r=a.getOption("extraKeys"),t=r&&r[n]||d.keyMap[a.getOption("keyMap")][n];"findNext"==t||"findPrev"==t||"findPersistentNext"==t||"findPersistentPrev"==t?(d.e_stop(e),g(a,m(a),o),a.execCommand(t)):"find"!=t&&"findPersistent"!=t||(d.e_stop(e),s(o,e))},i.openDialog(c,u,{value:l,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){v(i)},onKeyDown:p,bottom:i.options.search.bottom}),n&&f&&(g(a,r,f),x(a,o))):h(a,b(a),"Search for:",f,function(e){e&&!r.query&&a.operation(function(){g(a,r,e),r.posFrom=r.posTo=a.getCursor(),x(a,o)})})}function x(n,r,t){n.operation(function(){var e=m(n),o=y(n,e.query,r?e.posFrom:e.posTo);(o.find(r)||(o=y(n,e.query,r?d.Pos(n.lastLine()):d.Pos(n.firstLine(),0))).find(r))&&(n.setSelection(o.from(),o.to()),n.scrollIntoView({from:o.from(),to:o.to()},20),e.posFrom=o.from(),e.posTo=o.to(),t&&t(o.from(),o.to()))})}function v(o){o.operation(function(){var e=m(o);e.lastQuery=e.query,e.query&&(e.query=e.queryText=null,o.removeOverlay(e.overlay),e.annotate&&(e.annotate.clear(),e.annotate=null))})}function b(e){return'<span class="CodeMirror-search-label">'+e.phrase("Search:")+'</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+e.phrase("(Use /re/ syntax for regexp search)")+"</span>"}function C(o,r,t){o.operation(function(){for(var n,e=y(o,r);e.findNext();){"string"!=typeof r?(n=o.getRange(e.from(),e.to()).match(r),e.replace(t.replace(/\$(\d)/g,function(e,o){return n[o]}))):e.replace(t)}})}function t(f,e){var o,n;f.getOption("readOnly")||(o=f.getSelection()||m(f).lastQuery,n='<span class="CodeMirror-search-label">'+(e?f.phrase("Replace all:"):f.phrase("Replace:"))+"</span>",h(f,n+(' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+f.phrase("(Use /re/ syntax for regexp search)")+"</span>"),n,o,function(p){p&&(p=s(p),h(f,'<span class="CodeMirror-search-label">'+f.phrase("With:")+'</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',f.phrase("Replace with:"),"",function(i){var c,l,u;i=r(i),e?C(f,p,i):(v(f),c=y(f,p,f.getCursor("from")),l=function(){var e,o,n,r,t,a,s=c.from();!(e=c.findNext())&&(c=y(f,p),!(e=c.findNext())||s&&c.from().line==s.line&&c.from().ch==s.ch)||(f.setSelection(c.from(),c.to()),f.scrollIntoView({from:c.from(),to:c.to()}),n='<span class="CodeMirror-search-label">'+(a=o=f).phrase("Replace?")+"</span> <button>"+a.phrase("Yes")+"</button> <button>"+a.phrase("No")+"</button> <button>"+a.phrase("All")+"</button> <button>"+a.phrase("Stop")+"</button> ",r=f.phrase("Replace?"),t=[function(){u(e)},l,function(){C(f,p,i)}],o.openConfirm?o.openConfirm(n,t):confirm(r)&&t[0]())},u=function(n){c.replace("string"==typeof p?i:i.replace(/\$(\d)/g,function(e,o){return n[o]})),l()},l())}))}))}d.defineOption("search",{bottom:!1}),d.commands.find=function(e){v(e),n(e)},d.commands.findPersistent=function(e){v(e),n(e,!1,!0)},d.commands.findPersistentNext=function(e){n(e,!1,!0,!0)},d.commands.findPersistentPrev=function(e){n(e,!0,!0,!0)},d.commands.findNext=n,d.commands.findPrev=function(e){n(e,!0)},d.commands.clearSearch=v,d.commands.replace=t,d.commands.replaceAll=function(e){t(e,!0)}}); diff --git a/plugins/tiddlywiki/codemirror/files/codemirror.js b/plugins/tiddlywiki/codemirror/files/codemirror.js index 231e8a0da..0c80808ae 100755 --- a/plugins/tiddlywiki/codemirror/files/codemirror.js +++ b/plugins/tiddlywiki/codemirror/files/codemirror.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,g=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),r=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),i=/Edge\/(\d+)/.exec(e),x=n||r||i,C=x&&(n?document.documentMode||6:+(i||r)[1]),v=!i&&/WebKit\//.test(e),o=v&&/Qt\/\d+\.\d+/.test(e),l=!i&&/Chrome\//.test(e),m=/Opera\//.test(e),c=/Apple Computer/.test(navigator.vendor),s=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),u=/PhantomJS/.test(e),a=!i&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),h=/Android/.test(e),d=a||h||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=a||/Mac/.test(t),f=/\bCrOS\b/.test(e),p=/win/i.test(t),b=m&&e.match(/Version\/(\d*\.\d*)/);(b=b&&Number(b[1]))&&15<=b&&(v=!(m=!1));var w=y&&(o||m&&(null==b||b<12.11)),S=g||x&&9<=C;function L(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var n,r=e.className,i=L(t).exec(r);i&&(n=r.slice(i.index+i[0].length),e.className=r.slice(0,i.index)+(n?i[1]+n:""))};function M(e){for(var t=e.childNodes.length;0<t;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,n,r){var i=O(e,t,n,r);return i.setAttribute("role","presentation"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var t;try{t=document.activeElement}catch(e){t=document.body||null}for(;t&&t.shadowRoot&&t.shadowRoot.activeElement;)t=t.shadowRoot.activeElement;return t}function H(e,t){var n=e.className;L(t).test(n)||(e.className+=(n?" ":"")+t)}function F(e,t){for(var n=e.split(" "),r=0;r<n.length;r++)n[r]&&!L(n[r]).test(t)&&(t+=" "+n[r]);return t}k=document.createRange?function(e,t,n,r){var i=document.createRange();return i.setEnd(r||e,n),i.setStart(e,t),i}:function(e,t,n){var r=document.body.createTextRange();try{r.moveToElementText(e.parentNode)}catch(e){return r}return r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function I(e,t,n){for(var r in t=t||{},e)!e.hasOwnProperty(r)||!1===n&&t.hasOwnProperty(r)||(t[r]=e[r]);return t}function R(e,t,n,r,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=r||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||t<=s)return l+(t-o);l+=s-o,l+=n-l%n,o=s+1}}a?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:x&&(P=function(e){try{e.select()}catch(e){}});var z=function(){this.id=null,this.f=null,this.time=0,this.handler=E(this.onTimeout,this)};function B(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}z.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-new Date)},z.prototype.set=function(e,t){this.f=t;var n=+new Date+e;(!this.id||n<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,e),this.time=n)};var G=50,U={toString:function(){return"CodeMirror.Pass"}},V={scroll:!1},K={origin:"*mouse"},j={origin:"+move"};function X(e,t,n){for(var r=0,i=0;;){var o=e.indexOf("\t",r);-1==o&&(o=e.length);var l=o-r;if(o==e.length||t<=i+l)return r+Math.min(l,t-i);if(i+=o-r,r=o+1,t<=(i+=n-i%n))return r}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var n=[],r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function Z(){}function Q(e,t){var n=Object.create?Object.create(e):(Z.prototype=e,new Z);return t&&I(t,n),n}var J=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function ee(e){return/\w/.test(e)||"€"<e&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(-1<t.source.indexOf("\\w")&&ee(e))||t.test(e):ee(e)}function ne(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return;return 1}var re=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return 768<=e.charCodeAt(0)&&re.test(e)}function oe(e,t,n){for(;(n<0?0<t:t<e.length)&&ie(e.charAt(t));)t+=n;return t}function le(e,t,n){for(var r=n<t?-1:1;;){if(t==n)return t;var i=(t+n)/2,o=r<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+r}}var se=null;function ae(e,t,n){var r;se=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:se=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:se=i)}return null!=r?r:se}var ue,ce,he,de,fe,pe,ge,me=(ue="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",ce="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",he=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,de=/[stwN]/,fe=/[LRr]/,pe=/[Lb1n]/,ge=/[1n]/,function(e,t){var n="ltr"==t?"L":"R";if(0==e.length||"ltr"==t&&!he.test(e))return!1;for(var r,i=e.length,o=[],l=0;l<i;++l)o.push((r=e.charCodeAt(l))<=247?ue.charAt(r):1424<=r&&r<=1524?"R":1536<=r&&r<=1785?ce.charAt(r-1536):1774<=r&&r<=2220?"r":8192<=r&&r<=8203?"w":8204==r?"b":"L");for(var s=0,a=n;s<i;++s){var u=o[s];"m"==u?o[s]=a:a=u}for(var c=0,h=n;c<i;++c){var d=o[c];"1"==d&&"r"==h?o[c]="n":fe.test(d)&&"r"==(h=d)&&(o[c]="R")}for(var f=1,p=o[0];f<i-1;++f){var g=o[f];"+"==g&&"1"==p&&"1"==o[f+1]?o[f]="1":","!=g||p!=o[f+1]||"1"!=p&&"n"!=p||(o[f]=p),p=g}for(var m=0;m<i;++m){var v=o[m];if(","==v)o[m]="N";else if("%"==v){for(var y=void 0,y=m+1;y<i&&"%"==o[y];++y);for(var b=m&&"!"==o[m-1]||y<i&&"1"==o[y]?"1":"N",w=m;w<y;++w)o[w]=b;m=y-1}}for(var x=0,C=n;x<i;++x){var S=o[x];"L"==C&&"1"==S?o[x]="L":fe.test(S)&&(C=S)}for(var L=0;L<i;++L)if(de.test(o[L])){for(var k=void 0,k=L+1;k<i&&de.test(o[k]);++k);for(var T="L"==(L?o[L-1]:n),M=T==("L"==(k<i?o[k]:n))?T?"L":"R":n,N=L;N<k;++N)o[N]=M;L=k-1}for(var A,O=[],D=0;D<i;)if(pe.test(o[D])){var W=D;for(++D;D<i&&pe.test(o[D]);++D);O.push(new ve(0,W,D))}else{var H=D,F=O.length,P="rtl"==t?1:0;for(++D;D<i&&"L"!=o[D];++D);for(var E=H;E<D;)if(ge.test(o[E])){H<E&&(O.splice(F,0,new ve(1,H,E)),F+=P);var I=E;for(++E;E<D&&ge.test(o[E]);++E);O.splice(F,0,new ve(2,I,E)),F+=P,H=E}else++E;H<D&&O.splice(F,0,new ve(1,H,D))}return"ltr"==t&&(1==O[0].level&&(A=e.match(/^\s+/))&&(O[0].from=A[0].length,O.unshift(new ve(0,0,A[0].length))),1==$(O).level&&(A=e.match(/\s+$/))&&($(O).to-=A[0].length,O.push(new ve(0,i-A[0].length,i)))),"rtl"==t?O.reverse():O});function ve(e,t,n){this.level=e,this.from=t,this.to=n}function ye(e,t){var n=e.order;return null==n&&(n=e.order=me(e.text,t)),n}var be=[],we=function(e,t,n){var r;e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent?e.attachEvent("on"+t,n):(r=e._handlers||(e._handlers={}))[t]=(r[t]||be).concat(n)};function xe(e,t){return e._handlers&&e._handlers[t]||be}function Ce(e,t,n){var r,i,o;e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent?e.detachEvent("on"+t,n):!(i=(r=e._handlers)&&r[t])||-1<(o=B(i,n))&&(r[t]=i.slice(0,o).concat(i.slice(o+1)))}function Se(e,t){var n=xe(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i<n.length;++i)n[i].apply(null,r)}function Le(e,t,n){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),Se(e,n||t.type,e,t),Oe(t)||t.codemirrorIgnore}function ke(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var n=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),r=0;r<t.length;++r)-1==B(n,t[r])&&n.push(t[r])}function Te(e,t){return 0<xe(e,t).length}function Me(e){e.prototype.on=function(e,t){we(this,e,t)},e.prototype.off=function(e,t){Ce(this,e,t)}}function Ne(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Ae(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Oe(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function De(e){Ne(e),Ae(e)}function We(e){return e.target||e.srcElement}function He(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Fe,Pe,Ee=function(){if(x&&C<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();var Ie,Re=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(n.push(o.slice(0,l)),t+=l+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},ze=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Be="oncopy"in(Ie=O("div"))||(Ie.setAttribute("oncopy","return;"),"function"==typeof Ie.oncopy),Ge=null;var Ue={},Ve={};function Ke(e){if("string"==typeof e&&Ve.hasOwnProperty(e))e=Ve[e];else if(e&&"string"==typeof e.name&&Ve.hasOwnProperty(e.name)){var t=Ve[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ke("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ke("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function je(e,t){t=Ke(t);var n=Ue[t.name];if(!n)return je(e,"text/plain");var r=n(e,t);if(Xe.hasOwnProperty(t.name)){var i=Xe[t.name];for(var o in i)i.hasOwnProperty(o)&&(r.hasOwnProperty(o)&&(r["_"+o]=r[o]),r[o]=i[o])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var Xe={};function Ye(e,t){I(t,Xe.hasOwnProperty(e)?Xe[e]:Xe[e]={})}function _e(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function $e(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function qe(e,t,n){return!e.startState||e.startState(t,n)}var Ze=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};function Qe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t<o){n=i;break}t-=o}return n.lines[t]}function Je(e,n,r){var i=[],o=n.line;return e.iter(n.line,r.line+1,function(e){var t=e.text;o==r.line&&(t=t.slice(0,r.ch)),o==n.line&&(t=t.slice(n.ch)),i.push(t),++o}),i}function et(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function tt(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function nt(e){if(null==e.parent)return null;for(var t=e.parent,n=B(t.lines,e),r=t.parent;r;r=(t=r).parent)for(var i=0;r.children[i]!=t;++i)n+=r.children[i].chunkSize();return n+t.first}function rt(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],o=i.height;if(t<o){e=i;continue e}t-=o,n+=i.chunkSize()}return n}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return n+l}function it(e,t){return t>=e.first&&t<e.first+e.size}function ot(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function lt(e,t,n){if(void 0===n&&(n=null),!(this instanceof lt))return new lt(e,t,n);this.line=e,this.ch=t,this.sticky=n}function st(e,t){return e.line-t.line||e.ch-t.ch}function at(e,t){return e.sticky==t.sticky&&0==st(e,t)}function ut(e){return lt(e.line,e.ch)}function ct(e,t){return st(e,t)<0?t:e}function ht(e,t){return st(e,t)<0?e:t}function dt(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function ft(e,t){if(t.line<e.first)return lt(e.first,0);var n,r,i,o=e.first+e.size-1;return t.line>o?lt(o,Qe(e,o).text.length):(r=Qe(e,(n=t).line).text.length,null==(i=n.ch)||r<i?lt(n.line,r):i<0?lt(n.line,0):n)}function pt(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=ft(e,t[r]);return n}Ze.prototype.eol=function(){return this.pos>=this.string.length},Ze.prototype.sol=function(){return this.pos==this.lineStart},Ze.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Ze.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Ze.prototype.eat=function(e){var t=this.string.charAt(this.pos),n="string"==typeof e?t==e:t&&(e.test?e.test(t):e(t));if(n)return++this.pos,t},Ze.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Ze.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Ze.prototype.skipToEnd=function(){this.pos=this.string.length},Ze.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(-1<t)return this.pos=t,!0},Ze.prototype.backUp=function(e){this.pos-=e},Ze.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=R(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.indentation=function(){return R(this.string,null,this.tabSize)-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.match=function(e,t,n){if("string"!=typeof e){var r=this.string.slice(this.pos).match(e);return r&&0<r.index?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}function i(e){return n?e.toLowerCase():e}if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Ze.prototype.current=function(){return this.string.slice(this.start,this.pos)},Ze.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Ze.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Ze.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var gt=function(e,t){this.state=e,this.lookAhead=t},mt=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};function vt(t,n,r,e){var a=[t.state.modeGen],i={};Tt(t,n.text,t.doc.mode,r,function(e,t){return a.push(e,t)},i,e);for(var u=r.state,o=0;o<t.state.overlays.length;++o)!function(e){r.baseTokens=a;var o=t.state.overlays[e],l=1,s=0;r.state=!0,Tt(t,n.text,o.mode,r,function(e,t){for(var n=l;s<e;){var r=a[l];e<r&&a.splice(l,1,e,a[l+1],r),l+=2,s=Math.min(e,r)}if(t)if(o.opaque)a.splice(n,l-n,e,"overlay "+t),l=n+2;else for(;n<l;n+=2){var i=a[n+1];a[n+1]=(i?i+" ":"")+"overlay "+t}},i),r.state=u,r.baseTokens=null,r.baseTokenPos=1}(o);return{styles:a,classes:i.bgClass||i.textClass?i:null}}function yt(e,t,n){var r,i,o;return t.styles&&t.styles[0]==e.state.modeGen||(r=bt(e,nt(t)),i=t.text.length>e.options.maxHighlightLength&&_e(e.doc.mode,r.state),o=vt(e,t,r),i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))),t.styles}function bt(n,r,e){var t=n.doc,i=n.display;if(!t.mode.startState)return new mt(t,!0,r);var o=function(e,t,n){for(var r,i,o=e.doc,l=n?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;l<s;--s){if(s<=o.first)return o.first;var a=Qe(o,s-1),u=a.stateAfter;if(u&&(!n||s+(u instanceof gt?u.lookAhead:0)<=o.modeFrontier))return s;var c=R(a.text,null,e.options.tabSize);(null==i||c<r)&&(i=s-1,r=c)}return i}(n,r,e),l=o>t.first&&Qe(t,o-1).stateAfter,s=l?mt.fromSaved(t,l,o):new mt(t,qe(t.mode),o);return t.iter(o,r,function(e){wt(n,e.text,s);var t=s.line;e.stateAfter=t==r-1||t%5==0||t>=i.viewFrom&&t<i.viewTo?s.save():null,s.nextLine()}),e&&(t.modeFrontier=s.line),s}function wt(e,t,n,r){var i=e.doc.mode,o=new Ze(t,e.options.tabSize,n);for(o.start=o.pos=r||0,""==t&&xt(i,n.state);!o.eol();)Ct(i,o,n.state),o.start=o.pos}function xt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var n=$e(e,t);return n.mode.blankLine?n.mode.blankLine(n.state):void 0}}function Ct(e,t,n,r){for(var i=0;i<10;i++){r&&(r[0]=$e(e,n).mode);var o=e.token(t,n);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}mt.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},mt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},mt.prototype.nextLine=function(){this.line++,0<this.maxLookAhead&&this.maxLookAhead--},mt.fromSaved=function(e,t,n){return t instanceof gt?new mt(e,_e(e.mode,t.state),n,t.lookAhead):new mt(e,_e(e.mode,t),n)},mt.prototype.save=function(e){var t=!1!==e?_e(this.doc.mode,this.state):this.state;return 0<this.maxLookAhead?new gt(t,this.maxLookAhead):t};var St=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function Lt(e,t,n,r){var i,o,l=e.doc,s=l.mode,a=Qe(l,(t=ft(l,t)).line),u=bt(e,t.line,n),c=new Ze(a.text,e.options.tabSize,u);for(r&&(o=[]);(r||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Ct(s,c,u.state),r&&o.push(new St(c,i,_e(l.mode,u.state)));return r?o:new St(c,i,u.state)}function kt(e,t){if(e)for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";null==t[r]?t[r]=n[2]:new RegExp("(?:^|\\s)"+n[2]+"(?:$|\\s)").test(t[r])||(t[r]+=" "+n[2])}return e}function Tt(e,t,n,r,i,o,l){var s=n.flattenSpans;null==s&&(s=e.options.flattenSpans);var a=0,u=null,c=new Ze(t,e.options.tabSize,r),h=e.options.addModeClass&&[null];for(""==t&&kt(xt(n,r.state),o);!c.eol();){var d,f=c.pos>e.options.maxHighlightLength?(s=!1,l&&wt(e,t,r,c.pos),c.pos=t.length,null):kt(Ct(n,c,r.state,h),o);if(!h||(d=h[0].name)&&(f="m-"+(f?d+" "+f:d)),!s||u!=f){for(;a<c.start;)i(a=Math.min(c.start,a+5e3),u);u=f}c.start=c.pos}for(;a<c.pos;){var p=Math.min(c.pos,a+5e3);i(p,u),a=p}}var Mt=!1,Nt=!1;function At(e,t,n){this.marker=e,this.from=t,this.to=n}function Ot(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function Dt(e,t){if(t.full)return null;var n=it(e,t.from.line)&&Qe(e,t.from.line).markedSpans,r=it(e,t.to.line)&&Qe(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,o=t.to.ch,l=0==st(t.from,t.to),s=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t))&&(l.from!=t||"bookmark"!=s.type||n&&l.marker.insertLeft)||(o=null==l.to||(s.inclusiveRight?l.to>=t:l.to>t),(r=r||[]).push(new At(s,l.from,o?null:l.to)))}return r}(n,i,l),a=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.to||(s.inclusiveRight?l.to>=t:l.to>t))&&(l.from!=t||"bookmark"!=s.type||n&&!l.marker.insertLeft)||(o=null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t),(r=r||[]).push(new At(s,o?null:l.from-t,null==l.to?null:l.to-t)))}return r}(r,o,l),u=1==t.text.length,c=$(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var d,f=s[h];null==f.to&&((d=Ot(a,f.marker))?u&&(f.to=null==d.to?null:d.to+c):f.to=i)}if(a)for(var p=0;p<a.length;++p){var g=a[p];null!=g.to&&(g.to+=c),null==g.from?Ot(s,g.marker)||(g.from=c,u&&(s=s||[]).push(g)):(g.from+=c,u&&(s=s||[]).push(g))}s=s&&Wt(s),a&&a!=s&&(a=Wt(a));var m=[s];if(!u){var v,y=t.text.length-2;if(0<y&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(v=v||[]).push(new At(s[b].marker,null,null));for(var w=0;w<y;++w)m.push(v);m.push(a)}return m}function Wt(e){for(var t=0;t<e.length;++t){var n=e[t];null!=n.from&&n.from==n.to&&!1!==n.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function Ht(e){var t=e.markedSpans;if(t){for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}}function Ft(e,t){if(t){for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}}function Pt(e){return e.inclusiveLeft?-1:0}function Et(e){return e.inclusiveRight?1:0}function It(e,t){var n=e.lines.length-t.lines.length;if(0!=n)return n;var r=e.find(),i=t.find(),o=st(r.from,i.from)||Pt(e)-Pt(t);if(o)return-o;var l=st(r.to,i.to)||Et(e)-Et(t);return l||t.id-e.id}function Rt(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=void 0,o=0;o<r.length;++o)(i=r[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!n||It(n,i.marker)<0)&&(n=i.marker);return n}function zt(e){return Rt(e,!0)}function Bt(e){return Rt(e,!1)}function Gt(e,t,n,r,i){var o=Qe(e,t),l=Nt&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=st(u.from,n)||Pt(a.marker)-Pt(i),h=st(u.to,r)||Et(a.marker)-Et(i);if(!(0<=c&&h<=0||c<=0&&0<=h)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?0<=st(u.to,n):0<st(u.to,n))||0<=c&&(a.marker.inclusiveRight&&i.inclusiveLeft?st(u.from,r)<=0:st(u.from,r)<0)))return 1}}}function Ut(e){for(var t;t=zt(e);)e=t.find(-1,!0).line;return e}function Vt(e,t){var n=Qe(e,t),r=Ut(n);return n==r?t:nt(r)}function Kt(e,t){if(t>e.lastLine())return t;var n,r=Qe(e,t);if(!jt(e,r))return t;for(;n=Bt(r);)r=n.find(1,!0).line;return nt(r)+1}function jt(e,t){var n=Nt&&t.markedSpans;if(n)for(var r=void 0,i=0;i<n.length;++i)if((r=n[i]).marker.collapsed){if(null==r.from)return!0;if(!r.marker.widgetNode&&0==r.from&&r.marker.inclusiveLeft&&function e(t,n,r){if(null==r.to){var i=r.marker.find(1,!0);return e(t,i.line,Ot(i.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==n.text.length)return!0;for(var o=void 0,l=0;l<n.markedSpans.length;++l)if((o=n.markedSpans[l]).marker.collapsed&&!o.marker.widgetNode&&o.from==r.to&&(null==o.to||o.to!=r.from)&&(o.marker.inclusiveLeft||r.marker.inclusiveRight)&&e(t,n,o))return!0}(e,t,r))return!0}}function Xt(e){for(var t=0,n=(e=Ut(e)).parent,r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var o=n.parent;o;o=(n=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==n)break;t+=s.height}return t}function Yt(e){if(0==e.height)return 0;for(var t,n=e.text.length,r=e;t=zt(r);){var i=t.find(0,!0),r=i.from.line;n+=i.from.ch-i.to.ch}for(r=e;t=Bt(r);){var o=t.find(0,!0);n-=r.text.length-o.from.ch,n+=(r=o.to.line).text.length-o.to.ch}return n}function _t(e){var n=e.display,t=e.doc;n.maxLine=Qe(t,t.first),n.maxLineLength=Yt(n.maxLine),n.maxLineChanged=!0,t.iter(function(e){var t=Yt(e);t>n.maxLineLength&&(n.maxLineLength=t,n.maxLine=e)})}var $t=function(e,t,n){this.text=e,Ft(this,t),this.height=n?n(this):1};$t.prototype.lineNo=function(){return nt(this)},Me($t);var qt={},Zt={};function Qt(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?Zt:qt;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function Jt(e,t){var n=A("span",null,null,v?"padding-right: .1px":null),r={pre:A("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i,o=0;o<=(t.rest?t.rest.length:0);o++){var l=o?t.rest[o-1]:t.line,s=void 0;r.pos=0,r.addToken=tn,function(e){if(null!=Pe)return Pe;var t=N(e,document.createTextNode("AخA")),n=k(t,0,1).getBoundingClientRect(),r=k(t,1,2).getBoundingClientRect();return M(e),n&&n.left!=n.right&&(Pe=r.right-n.right<3)}(e.display.measure)&&(s=ye(l,e.doc.direction))&&(r.addToken=function(h,d){return function(e,t,n,r,i,o,l){n=n?n+" cm-force-border":"cm-force-border";for(var s=e.pos,a=s+t.length;;){for(var u=void 0,c=0;c<d.length&&!((u=d[c]).to>s&&u.from<=s);c++);if(u.to>=a)return h(e,t,n,r,i,o,l);h(e,t.slice(0,u.to-s),n,r,null,o,l),r=null,t=t.slice(u.to-s),s=u.to}}}(r.addToken,s)),r.map=[],function(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(!r){for(var l=1;l<n.length;l+=2)t.addToken(t,i.slice(o,o=n[l]),Qt(n[l+1],t.cm.options));return}for(var s,a,u,c,h,d,f,p=i.length,g=0,m=1,v="",y=0;;){if(y==g){u=c=h=a="",d=f=null,y=1/0;for(var b=[],w=void 0,x=0;x<r.length;++x){var C=r[x],S=C.marker;if("bookmark"==S.type&&C.from==g&&S.widgetNode)b.push(S);else if(C.from<=g&&(null==C.to||C.to>g||S.collapsed&&C.to==g&&C.from==g)){if(null!=C.to&&C.to!=g&&y>C.to&&(y=C.to,c=""),S.className&&(u+=" "+S.className),S.css&&(a=(a?a+";":"")+S.css),S.startStyle&&C.from==g&&(h+=" "+S.startStyle),S.endStyle&&C.to==y&&(w=w||[]).push(S.endStyle,C.to),S.title&&((f=f||{}).title=S.title),S.attributes)for(var L in S.attributes)(f=f||{})[L]=S.attributes[L];S.collapsed&&(!d||It(d.marker,S)<0)&&(d=C)}else C.from>g&&y>C.from&&(y=C.from)}if(w)for(var k=0;k<w.length;k+=2)w[k+1]==y&&(c+=" "+w[k]);if(!d||d.from==g)for(var T=0;T<b.length;++T)nn(t,0,b[T]);if(d&&(d.from||0)==g){if(nn(t,(null==d.to?p+1:d.to)-g,d.marker,null==d.from),null==d.to)return;d.to==g&&(d=!1)}}if(p<=g)break;for(var M=Math.min(p,y);;){if(v){var N,A=g+v.length;if(d||(N=M<A?v.slice(0,M-g):v,t.addToken(t,N,s?s+u:u,h,g+N.length==y?c:"",a,f)),M<=A){v=v.slice(M-g),g=M;break}g=A,h=""}v=i.slice(o,o=n[m++]),s=Qt(n[m++],t.cm.options)}}}(l,r,yt(e,l,t!=e.display.externalMeasured&&nt(l))),l.styleClasses&&(l.styleClasses.bgClass&&(r.bgClass=F(l.styleClasses.bgClass,r.bgClass||"")),l.styleClasses.textClass&&(r.textClass=F(l.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(function(e){var t;null==Fe&&(t=O("span","​"),N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Fe=t.offsetWidth<=1&&2<t.offsetHeight&&!(x&&C<8)));var n=Fe?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}(e.display.measure))),0==o?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return v&&(i=r.content.lastChild,(/\bcm-tab\b/.test(i.className)||i.querySelector&&i.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")),Se(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=F(r.pre.className,r.textClass||"")),r}function en(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function tn(e,t,n,r,i,o,l){if(t){var s,a=e.splitSpaces?function(e,t){if(1<e.length&&!/ /.test(e))return e;for(var n=t,r="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!n||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),r+=o,n=" "==o}return r}(t,e.trailingSpace):t,u=e.cm.state.specialChars,c=!1;if(u.test(t)){s=document.createDocumentFragment();for(var h=0;;){u.lastIndex=h;var d,f=u.exec(t),p=f?f.index-h:t.length-h;if(p&&(d=document.createTextNode(a.slice(h,h+p)),x&&C<9?s.appendChild(O("span",[d])):s.appendChild(d),e.map.push(e.pos,e.pos+p,d),e.col+=p,e.pos+=p),!f)break;h+=1+p;var g,m,v=void 0;"\t"==f[0]?(m=(g=e.cm.options.tabSize)-e.col%g,(v=s.appendChild(O("span",_(m),"cm-tab"))).setAttribute("role","presentation"),v.setAttribute("cm-text","\t"),e.col+=m):("\r"==f[0]||"\n"==f[0]?(v=s.appendChild(O("span","\r"==f[0]?"␍":"␤","cm-invalidchar"))).setAttribute("cm-text",f[0]):((v=e.cm.options.specialCharPlaceholder(f[0])).setAttribute("cm-text",f[0]),x&&C<9?s.appendChild(O("span",[v])):s.appendChild(v)),e.col+=1),e.map.push(e.pos,e.pos+1,v),e.pos++}}else e.col+=t.length,s=document.createTextNode(a),e.map.push(e.pos,e.pos+t.length,s),x&&C<9&&(c=!0),e.pos+=t.length;if(e.trailingSpace=32==a.charCodeAt(t.length-1),n||r||i||c||o||l){var y=n||"";r&&(y+=r),i&&(y+=i);var b=O("span",[s],y,o);if(l)for(var w in l)l.hasOwnProperty(w)&&"style"!=w&&"class"!=w&&b.setAttribute(w,l[w]);return e.content.appendChild(b)}e.content.appendChild(s)}}function nn(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i=i||e.content.appendChild(document.createElement("span"))).setAttribute("cm-marker",n.id),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rn(e,t,n){this.line=t,this.rest=function(e){for(var t,n;t=Bt(e);)e=t.find(1,!0).line,(n=n||[]).push(e);return n}(t),this.size=this.rest?nt($(this.rest))-n+1:1,this.node=this.text=null,this.hidden=jt(e,t)}function on(e,t,n){for(var r=[],i=t;i<n;i=l){var o=new rn(e.doc,Qe(e.doc,i),i),l=i+o.size;r.push(o)}return r}var ln=null;function sn(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n<t.length;n++)t[n].call(null);for(var r=0;r<e.ops.length;r++){var i=e.ops[r];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(n<t.length)}(n)}finally{ln=null,t(n)}}var an=null;function un(e,t){var n=xe(e,t);if(n.length){var r,i=Array.prototype.slice.call(arguments,2);ln?r=ln.delayedCallbacks:an?r=an:(r=an=[],setTimeout(cn,0));for(var o=0;o<n.length;++o)!function(e){r.push(function(){return n[e].apply(null,i)})}(o)}}function cn(){var e=an;an=null;for(var t=0;t<e.length;++t)e[t]()}function hn(e,t,n,r){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?function(e,t){var n=t.text.className,r=fn(e,t);t.text==t.node&&(t.node=r.pre);t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,pn(e,t)):n&&(t.text.className=n)}(e,t):"gutter"==o?gn(e,t,n,r):"class"==o?pn(e,t):"widget"==o&&function(e,t,n){t.alignable&&(t.alignable=null);for(var r=L("CodeMirror-linewidget"),i=t.node.firstChild,o=void 0;i;i=o)o=i.nextSibling,r.test(i.className)&&t.node.removeChild(i);mn(e,t,n)}(e,t,r)}t.changes=null}function dn(e){return e.node==e.text&&(e.node=O("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),x&&C<8&&(e.node.style.zIndex=2)),e.node}function fn(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):Jt(e,t)}function pn(e,t){var n,r,i,o;n=e,(o=(r=t).bgClass?r.bgClass+" "+(r.line.bgClass||""):r.line.bgClass)&&(o+=" CodeMirror-linebackground"),r.background?o?r.background.className=o:(r.background.parentNode.removeChild(r.background),r.background=null):o&&(i=dn(r),r.background=i.insertBefore(O("div",null,o),i.firstChild),n.display.input.setUneditable(r.background)),t.line.wrapClass?dn(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var l=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=l||""}function gn(e,t,n,r){var i;t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass&&(i=dn(t),t.gutterBackground=O("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px; width: "+r.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text));var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=dn(t),s=t.gutter=O("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=" "+t.line.gutterClass),!e.options.lineNumbers||o&&o["CodeMirror-linenumbers"]||(t.lineNumber=s.appendChild(O("div",ot(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),o)for(var a=0;a<e.display.gutterSpecs.length;++a){var u=e.display.gutterSpecs[a].className,c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O("div",[c],"CodeMirror-gutter-elt","left: "+r.gutterLeft[u]+"px; width: "+r.gutterWidth[u]+"px"))}}}function mn(e,t,n){if(vn(e,t.line,t,n,!0),t.rest)for(var r=0;r<t.rest.length;r++)vn(e,t.rest[r],t,n,!1)}function vn(e,t,n,r,i){if(t.widgets)for(var o=dn(n),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O("div",[a.node],"CodeMirror-linewidget"+(a.className?" "+a.className:""));a.handleMouseEvents||u.setAttribute("cm-ignore-events","true"),function(e,t,n,r){{var i;e.noHScroll&&((n.alignable||(n.alignable=[])).push(t),i=r.wrapperWidth,t.style.left=r.fixedPos+"px",e.coverGutter||(i-=r.gutterTotalWidth,t.style.paddingLeft=r.gutterTotalWidth+"px"),t.style.width=i+"px")}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-r.gutterTotalWidth+"px"))}(a,u,n,r),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,n.gutter||n.text):o.appendChild(u),un(a,"redraw")}}function yn(e){if(null!=e.height)return e.height;var t,n=e.doc.cm;return n?(D(document.body,e.node)||(t="position: relative;",e.coverGutter&&(t+="margin-left: -"+n.display.gutters.offsetWidth+"px;"),e.noHScroll&&(t+="width: "+n.display.wrapper.clientWidth+"px;"),N(n.display.measure,O("div",[e.node],null,t))),e.height=e.node.parentNode.offsetHeight):0}function bn(e,t){for(var n=We(t);n!=e.wrapper;n=n.parentNode)if(!n||1==n.nodeType&&"true"==n.getAttribute("cm-ignore-events")||n.parentNode==e.sizer&&n!=e.mover)return 1}function wn(e){return e.lineSpace.offsetTop}function xn(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Cn(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O("pre","x","CodeMirror-line-like")),n=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,r={left:parseInt(n.paddingLeft),right:parseInt(n.paddingRight)};return isNaN(r.left)||isNaN(r.right)||(e.cachedPaddingH=r),r}function Sn(e){return G-e.display.nativeBarWidth}function Ln(e){return e.display.scroller.clientWidth-Sn(e)-e.display.barWidth}function kn(e){return e.display.scroller.clientHeight-Sn(e)-e.display.barHeight}function Tn(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var i=0;i<e.rest.length;i++)if(nt(e.rest[i])>n)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Mn(e,t,n,r){return On(e,An(e,t),n,r)}function Nn(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[rr(e,t)];var n=e.display.externalMeasured;return n&&t>=n.lineN&&t<n.lineN+n.size?n:void 0}function An(e,t){var n=nt(t),r=Nn(e,n);r&&!r.text?r=null:r&&r.changes&&(hn(e,r,n,Qn(e)),e.curOp.forceUpdate=!0);var i=Tn(r=r||function(e,t){var n=nt(t=Ut(t)),r=e.display.externalMeasured=new rn(e.doc,t,n);r.lineN=n;var i=r.built=Jt(e,r);return r.text=i.pre,N(e.display.lineMeasure,i.pre),r}(e,t),t,n);return{line:t,view:r,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function On(e,t,n,r,i){t.before&&(n=-1);var o,l=n+(r||"");return t.cache.hasOwnProperty(l)?o=t.cache[l]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(function(e,t,n){var r=e.options.lineWrapping,i=r&&Ln(e);if(!t.measure.heights||r&&t.measure.width!=i){var o=t.measure.heights=[];if(r){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];2<Math.abs(a.bottom-u.bottom)&&o.push((a.bottom+u.top)/2-n.top)}}o.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,n,r){var i,o,l=Hn(t.map,n,r),s=l.node,a=l.start,u=l.end,c=l.collapse;if(3==s.nodeType){for(var h=0;h<4;h++){for(;a&&ie(t.line.text.charAt(l.coverStart+a));)--a;for(;l.coverStart+u<l.coverEnd&&ie(t.line.text.charAt(l.coverStart+u));)++u;if((i=x&&C<9&&0==a&&u==l.coverEnd-l.coverStart?s.parentNode.getBoundingClientRect():function(e,t){var n=Wn;if("left"==t)for(var r=0;r<e.length&&(n=e[r]).left==n.right;r++);else for(var i=e.length-1;0<=i&&(n=e[i]).left==n.right;i--);return n}(k(s,a,u).getClientRects(),r)).left||i.right||0==a)break;u=a,--a,c="right"}x&&C<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ge)return Ge;var t=N(e,O("span","x")),n=t.getBoundingClientRect(),r=k(t,0,1).getBoundingClientRect();return Ge=1<Math.abs(n.left-r.left)}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,r=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*r,bottom:t.bottom*r}}(e.display.measure,i))}else 0<a&&(c=r="right"),i=e.options.lineWrapping&&1<(o=s.getClientRects()).length?o["right"==r?o.length-1:0]:s.getBoundingClientRect();{var d;!(x&&C<9)||a||i&&(i.left||i.right)||(d=s.parentNode.getClientRects()[0],i=d?{left:d.left,right:d.left+Zn(e.display),top:d.top,bottom:d.bottom}:Wn)}for(var f=i.top-t.rect.top,p=i.bottom-t.rect.top,g=(f+p)/2,m=t.view.measure.heights,v=0;v<m.length-1&&!(g<m[v]);v++);var y=v?m[v-1]:0,b=m[v],w={left:("right"==c?i.right:i.left)-t.rect.left,right:("left"==c?i.left:i.right)-t.rect.left,top:y,bottom:b};i.left||i.right||(w.bogus=!0);e.options.singleCursorHeightPerLine||(w.rtop=f,w.rbottom=p);return w}(e,t,n,r)).bogus||(t.cache[l]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Dn,Wn={left:0,right:0,top:0,bottom:0};function Hn(e,t,n){for(var r,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,a<=t&&(l="right")),null!=i){if(r=e[u+2],s==a&&n==(r.insertLeft?"left":"right")&&(l=n),"left"==n&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)r=e[2+(u-=3)],l="left";if("right"==n&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)r=e[(u+=3)+2],l="right";break}return{node:r,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Fn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function Pn(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fn(e.display.view[t])}function En(e){Pn(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function In(){return l&&h?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Rn(){return l&&h?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function zn(e){var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;++n)e.widgets[n].above&&(t+=yn(e.widgets[n]));return t}function Bn(e,t,n,r,i){var o;if(i||(o=zn(t),n.top+=o,n.bottom+=o),"line"==r)return n;r=r||"local";var l,s,a=Xt(t);return"local"==r?a+=wn(e.display):a-=e.display.viewOffset,"page"!=r&&"window"!=r||(a+=(l=e.display.lineSpace.getBoundingClientRect()).top+("window"==r?0:Rn()),s=l.left+("window"==r?0:In()),n.left+=s,n.right+=s),n.top+=a,n.bottom+=a,n}function Gn(e,t,n){if("div"==n)return t;var r,i=t.left,o=t.top;"page"==n?(i-=In(),o-=Rn()):"local"!=n&&n||(i+=(r=e.display.sizer.getBoundingClientRect()).left,o+=r.top);var l=e.display.lineSpace.getBoundingClientRect();return{left:i-l.left,top:o-l.top}}function Un(e,t,n,r,i){return Bn(e,r=r||Qe(e.doc,t.line),Mn(e,r,t.ch,i),n)}function Vn(r,e,i,o,l,s){function a(e,t){var n=On(r,l,e,t?"right":"left",s);return t?n.left=n.right:n.right=n.left,Bn(r,o,n,i)}o=o||Qe(r.doc,e.line),l=l||An(r,o);var u=ye(o,r.doc.direction),t=e.ch,n=e.sticky;if(t>=o.text.length?(t=o.text.length,n="before"):t<=0&&(t=0,n="after"),!u)return a("before"==n?t-1:t,"before"==n);function c(e,t,n){return a(n?e-1:e,1==u[t].level!=n)}var h=ae(u,t,n),d=se,f=c(t,h,"before"==n);return null!=d&&(f.other=c(t,d,"before"!=n)),f}function Kn(e,t){var n=0;t=ft(e.doc,t),e.options.lineWrapping||(n=Zn(e.display)*t.ch);var r=Qe(e.doc,t.line),i=Xt(r)+wn(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function jn(e,t,n,r,i){var o=lt(e,t,n);return o.xRel=i,r&&(o.outside=r),o}function Xn(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return jn(r.first,0,null,-1,-1);var i=rt(r,n),o=r.first+r.size-1;if(o<i)return jn(r.first+r.size-1,Qe(r,o).text.length,null,1,1);t<0&&(t=0);for(var l=Qe(r,i);;){var s=function(n,e,t,r,i){i-=Xt(e);var o=An(n,e),l=zn(e),s=0,a=e.text.length,u=!0,c=ye(e,n.doc.direction);{var h;c&&(h=(n.options.lineWrapping?function(e,t,n,r,i,o,l){var s=Yn(e,t,r,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,d=0;d<i.length;d++){var f,p,g,m=i[d];m.from>=u||m.to<=a||(f=1!=m.level,p=On(e,r,f?Math.min(u,m.to)-1:Math.max(a,m.from)).right,g=p<o?o-p+1e9:p-o,(!c||g<h)&&(c=m,h=g))}c=c||i[i.length-1];c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(r,i,o,l,s,a,u){var e=le(function(e){var t=s[e],n=1!=t.level;return $n(Vn(r,lt(o,n?t.to:t.from,n?"before":"after"),"line",i,l),a,u,!0)},0,s.length-1),t=s[e];{var n,c;0<e&&(n=1!=t.level,$n(c=Vn(r,lt(o,n?t.from:t.to,n?"after":"before"),"line",i,l),a,u,!0)&&c.top>u&&(t=s[e-1]))}return t})(n,e,t,o,c,r,i),u=1!=h.level,s=u?h.from:h.to-1,a=u?h.to:h.from-1)}var d,f,p=null,g=null,m=le(function(e){var t=On(n,o,e);return t.top+=l,t.bottom+=l,$n(t,r,i,!1)&&(t.top<=i&&t.left<=r&&(p=e,g=t),1)},s,a),v=!1;{var y,b,w;g?(y=r-g.left<g.right-r,m=p+((b=y==u)?0:1),f=b?"after":"before",d=y?g.left:g.right):(u||m!=a&&m!=s||m++,f=0==m||m!=e.text.length&&On(n,o,m-(u?1:0)).bottom+l<=i==u?"after":"before",w=Vn(n,lt(t,m,f),"line",e,o),d=w.left,v=i<w.top?-1:i>=w.bottom?1:0)}return m=oe(e.text,m,1),jn(t,m,f,v,r-d)}(e,l,i,t,n),a=function(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=0;i<r.length;++i){var o=r[i];o.marker.collapsed&&(null==o.from||o.from<t)&&(null==o.to||o.to>t)&&(!n||It(n,o.marker)<0)&&(n=o.marker)}return n}(l,s.ch+(0<s.xRel||0<s.outside?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Qe(r,i=u.line)}}function Yn(t,e,n,r){r-=zn(e);var i=e.text.length,o=le(function(e){return On(t,n,e-1).bottom<=r},i,0);return{begin:o,end:i=le(function(e){return On(t,n,e).top>r},o,i)}}function _n(e,t,n,r){return Yn(e,t,n=n||An(e,t),Bn(e,t,On(e,n,r),"line").top)}function $n(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function qn(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Dn){Dn=O("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Dn.appendChild(document.createTextNode("x")),Dn.appendChild(O("br"));Dn.appendChild(document.createTextNode("x"))}N(e.measure,Dn);var n=Dn.offsetHeight/50;return 3<n&&(e.cachedTextHeight=n),M(e.measure),n||1}function Zn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),n=O("pre",[t],"CodeMirror-line-like");N(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return 2<i&&(e.cachedCharWidth=i),i||10}function Qn(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;n[s]=o.offsetLeft+o.clientLeft+i,r[s]=o.clientWidth}return{fixedPos:Jn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function Jn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function er(r){var i=qn(r.display),o=r.options.lineWrapping,l=o&&Math.max(5,r.display.scroller.clientWidth/Zn(r.display)-3);return function(e){if(jt(r.doc,e))return 0;var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;n++)e.widgets[n].height&&(t+=e.widgets[n].height);return o?t+(Math.ceil(e.text.length/l)||1)*i:t+i}}function tr(e){var t=e.doc,n=er(e);t.iter(function(e){var t=n(e);t!=e.height&&tt(e,t)})}function nr(e,t,n,r){var i=e.display;if(!n&&"true"==We(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(e){return null}var a,u,c=Xn(e,o,l);return r&&0<c.xRel&&(a=Qe(e.doc,c.line).text).length==c.ch&&(u=R(a,a.length,e.options.tabSize)-a.length,c=lt(c.line,Math.max(0,Math.round((o-Cn(e.display).left)/Zn(e.display))-u))),c}function rr(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;r<n.length;r++)if((t-=n[r].size)<0)return r}function ir(e,t,n,r){null==t&&(t=e.doc.first),null==n&&(n=e.doc.first+e.doc.size),r=r||0;var i,o,l,s,a=e.display;r&&n<a.viewTo&&(null==a.updateLineNumbers||a.updateLineNumbers>t)&&(a.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=a.viewTo?Nt&&Vt(e.doc,t)<a.viewTo&&lr(e):n<=a.viewFrom?Nt&&Kt(e.doc,n+r)>a.viewFrom?lr(e):(a.viewFrom+=r,a.viewTo+=r):t<=a.viewFrom&&n>=a.viewTo?lr(e):t<=a.viewFrom?(i=sr(e,n,n+r,1))?(a.view=a.view.slice(i.index),a.viewFrom=i.lineN,a.viewTo+=r):lr(e):n>=a.viewTo?(o=sr(e,t,t,-1))?(a.view=a.view.slice(0,o.index),a.viewTo=o.lineN):lr(e):(l=sr(e,t,t,-1),s=sr(e,n,n+r,1),l&&s?(a.view=a.view.slice(0,l.index).concat(on(e,l.lineN,s.lineN)).concat(a.view.slice(s.index)),a.viewTo+=r):lr(e));var u=a.externalMeasured;u&&(n<u.lineN?u.lineN+=r:t<u.lineN+u.size&&(a.externalMeasured=null))}function or(e,t,n){e.curOp.viewChanged=!0;var r,i,o=e.display,l=e.display.externalMeasured;l&&t>=l.lineN&&t<l.lineN+l.size&&(o.externalMeasured=null),t<o.viewFrom||t>=o.viewTo||(null==(r=o.view[rr(e,t)]).node||-1==B(i=r.changes||(r.changes=[]),n)&&i.push(n))}function lr(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function sr(e,t,n,r){var i,o=rr(e,t),l=e.display.view;if(!Nt||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(0<r){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;Vt(e.doc,n)!=n;){if(o==(r<0?0:l.length-1))return null;n+=r*l[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function ar(e){for(var t=e.display.view,n=0,r=0;r<t.length;r++){var i=t[r];i.hidden||i.node&&!i.changes||++n}return n}function ur(e){e.display.input.showSelection(e.display.input.prepareSelection())}function cr(e,t){void 0===t&&(t=!0);for(var n,r,i=e.doc,o={},l=o.cursors=document.createDocumentFragment(),s=o.selection=document.createDocumentFragment(),a=0;a<i.sel.ranges.length;a++){!t&&a==i.sel.primIndex||((n=i.sel.ranges[a]).from().line>=e.display.viewTo||n.to().line<e.display.viewFrom||(((r=n.empty())||e.options.showCursorWhenSelecting)&&hr(e,n.head,l),r||function(l,e,t){var n=l.display,r=l.doc,i=document.createDocumentFragment(),o=Cn(l.display),T=o.left,M=Math.max(n.sizerWidth,Ln(l)-n.sizer.offsetLeft)-o.right,N="ltr"==r.direction;function A(e,t,n,r){t<0&&(t=0),t=Math.round(t),r=Math.round(r),i.appendChild(O("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n top: "+t+"px; width: "+(null==n?M-e:n)+"px;\n height: "+(r-t)+"px"))}function s(n,y,b){var w,x,o=Qe(r,n),C=o.text.length;function S(e,t){return Un(l,lt(n,e),"div",o,t)}function L(e,t,n){var r=_n(l,o,null,e),i="ltr"==t==("after"==n)?"left":"right";return S("after"==n?r.begin:r.end-(/\s/.test(o.text.charAt(r.end-1))?2:1),i)[i]}var k=ye(o,r.direction);return function(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<n&&l.to>t||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),1==l.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(k,y||0,null==b?C:b,function(e,t,n,r){var i,o,l,s,a,u,c,h="ltr"==n,d=S(e,h?"left":"right"),f=S(t-1,h?"right":"left"),p=null==y&&0==e,g=null==b&&t==C,m=0==r,v=!k||r==k.length-1;f.top-d.top<=3?(i=(N?g:p)&&v,o=(N?p:g)&&m?T:(h?d:f).left,l=i?M:(h?f:d).right,A(o,d.top,l-o,d.bottom)):(c=h?(s=N&&p&&m?T:d.left,a=N?M:L(e,n,"before"),u=N?T:L(t,n,"after"),N&&g&&v?M:f.right):(s=N?L(e,n,"before"):T,a=!N&&p&&m?M:d.right,u=!N&&g&&v?T:f.left,N?L(t,n,"after"):M),A(s,d.top,a-s,d.bottom),d.bottom<f.top&&A(T,d.bottom,null,f.top),A(u,f.top,c-u,f.bottom)),(!w||dr(d,w)<0)&&(w=d),dr(f,w)<0&&(w=f),(!x||dr(d,x)<0)&&(x=d),dr(f,x)<0&&(x=f)}),{start:w,end:x}}var a=e.from(),u=e.to();{var c,h,d,f,p;a.line==u.line?s(a.line,a.ch,u.ch):(c=Qe(r,a.line),h=Qe(r,u.line),d=Ut(c)==Ut(h),f=s(a.line,a.ch,d?c.text.length+1:null).end,p=s(u.line,d?0:null,u.ch).start,d&&(f.top<p.top-2?(A(f.right,f.top,null,f.bottom),A(T,p.top,p.left,p.bottom)):A(f.right,f.top,p.left-f.right,f.bottom)),f.bottom<p.top&&A(T,f.bottom,null,p.top))}t.appendChild(i)}(e,n,s)))}return o}function hr(e,t,n){var r,i=Vn(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),o=n.appendChild(O("div"," ","CodeMirror-cursor"));o.style.left=i.left+"px",o.style.top=i.top+"px",o.style.height=Math.max(0,i.bottom-i.top)*e.options.cursorHeight+"px",i.other&&((r=n.appendChild(O("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"))).style.display="",r.style.left=i.other.left+"px",r.style.top=i.other.top+"px",r.style.height=.85*(i.other.bottom-i.other.top)+"px")}function dr(e,t){return e.top-t.top||e.left-t.left}function fr(e){var t,n;e.state.focused&&(t=e.display,clearInterval(t.blinker),n=!0,t.cursorDiv.style.visibility="",0<e.options.cursorBlinkRate?t.blinker=setInterval(function(){e.hasFocus()||vr(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden"))}function pr(e){e.state.focused||(e.display.input.focus(),mr(e))}function gr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,vr(e))},100)}function mr(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(Se(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),v&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),fr(e))}function vr(e,t){e.state.delayingBlurEvent||(e.state.focused&&(Se(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function yr(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r<t.view.length;r++){var i,o,l=t.view[r],s=e.options.lineWrapping,a=void 0,u=0;if(!l.hidden){x&&C<8?(a=(i=l.node.offsetTop+l.node.offsetHeight)-n,n=i):(a=(o=l.node.getBoundingClientRect()).bottom-o.top,!s&&l.text.firstChild&&(u=l.text.firstChild.getBoundingClientRect().right-o.left-1));var c,h=l.line.height-a;if((.005<h||h<-.005)&&(tt(l.line,a),br(l.line),l.rest))for(var d=0;d<l.rest.length;d++)br(l.rest[d]);u>e.display.sizerWidth&&((c=Math.ceil(u/Zn(e.display)))>e.display.maxLineLength&&(e.display.maxLineLength=c,e.display.maxLine=l.line,e.display.maxLineChanged=!0))}}}function br(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var n=e.widgets[t],r=n.node.parentNode;r&&(n.height=r.offsetHeight)}}function wr(e,t,n){var r,i,o=n&&null!=n.top?Math.max(0,n.top):e.scroller.scrollTop,o=Math.floor(o-wn(e)),l=n&&null!=n.bottom?n.bottom:o+e.wrapper.clientHeight,s=rt(t,o),a=rt(t,l);return n&&n.ensure&&(r=n.ensure.from.line,i=n.ensure.to.line,r<s?a=rt(t,Xt(Qe(t,s=r))+e.wrapper.clientHeight):Math.min(i,t.lastLine())>=a&&(s=rt(t,Xt(Qe(t,i))-e.wrapper.clientHeight),a=i)),{from:s,to:Math.max(a,s+1)}}function xr(e,t){var n=e.display,r=qn(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:n.scroller.scrollTop,o=kn(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s,a=e.doc.height+xn(n),u=t.top<r,c=t.bottom>a-r;t.top<i?l.scrollTop=u?0:t.top:t.bottom>i+o&&((s=Math.min(t.top,(c?a:t.bottom)-o))!=i&&(l.scrollTop=s));var h=e.options.fixedGutter?0:n.gutters.offsetWidth,d=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft-h,f=Ln(e)-n.gutters.offsetWidth,p=t.right-t.left>f;return p&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<d?l.scrollLeft=Math.max(0,t.left+h-(p?0:10)):t.right>f+d-3&&(l.scrollLeft=t.right+(p?0:10)-f),l}function Cr(e,t){null!=t&&(kr(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sr(e){kr(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Lr(e,t,n){null==t&&null==n||kr(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function kr(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tr(e,Kn(e,t.from),Kn(e,t.to),t.margin))}function Tr(e,t,n,r){var i=xr(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Lr(e,i.scrollLeft,i.scrollTop)}function Mr(e,t){Math.abs(e.doc.scrollTop-t)<2||(g||$r(e,{top:t}),Nr(e,t,!0),g&&$r(e),Kr(e,100))}function Nr(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),e.display.scroller.scrollTop==t&&!n||(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Ar(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,Qr(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Or(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+xn(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+Sn(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}function Dr(e,t,n){this.cm=n;var r=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),we(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),we(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,x&&C<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}Dr.prototype.update=function(e){var t,n,r=e.scrollWidth>e.clientWidth+1,i=e.scrollHeight>e.clientHeight+1,o=e.nativeBarWidth;return i?(this.vert.style.display="block",this.vert.style.bottom=r?o+"px":"0",t=e.viewHeight-(r?o:0),this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+t)+"px"):(this.vert.style.display="",this.vert.firstChild.style.height="0"),r?(this.horiz.style.display="block",this.horiz.style.right=i?o+"px":"0",this.horiz.style.left=e.barLeft+"px",n=e.viewWidth-e.barLeft-(i?o:0),this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+n)+"px"):(this.horiz.style.display="",this.horiz.firstChild.style.width="0"),!this.checkedZeroWidth&&0<e.clientHeight&&(0==o&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:i?o:0,bottom:r?o:0}},Dr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},Dr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},Dr.prototype.zeroWidthHack=function(){var e=y&&!s?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new z,this.disableVert=new z},Dr.prototype.enableZeroWidthBar=function(n,r,i){n.style.pointerEvents="auto",r.set(1e3,function e(){var t=n.getBoundingClientRect();("vert"==i?document.elementFromPoint(t.right-1,(t.top+t.bottom)/2):document.elementFromPoint((t.right+t.left)/2,t.bottom-1))!=n?n.style.pointerEvents="none":r.set(1e3,e)})},Dr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};function Wr(){}function Hr(e,t){t=t||Or(e);var n=e.display.barWidth,r=e.display.barHeight;Fr(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&yr(e),Fr(e,Or(e)),n=e.display.barWidth,r=e.display.barHeight}function Fr(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}Wr.prototype.update=function(){return{bottom:0,right:0}},Wr.prototype.setScrollLeft=function(){},Wr.prototype.setScrollTop=function(){},Wr.prototype.clear=function(){};var Pr={native:Dr,null:Wr};function Er(n){n.display.scrollbars&&(n.display.scrollbars.clear(),n.display.scrollbars.addClass&&T(n.display.wrapper,n.display.scrollbars.addClass)),n.display.scrollbars=new Pr[n.options.scrollbarStyle](function(e){n.display.wrapper.insertBefore(e,n.display.scrollbarFiller),we(e,"mousedown",function(){n.state.focused&&setTimeout(function(){return n.display.input.focus()},0)}),e.setAttribute("cm-not-content","true")},function(e,t){("horizontal"==t?Ar:Mr)(n,e)},n),n.display.scrollbars.addClass&&H(n.display.wrapper,n.display.scrollbars.addClass)}var Ir=0;function Rr(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ir},t=e.curOp,ln?ln.ops.push(t):t.ownsGroup=ln={ops:[t],delayedCallbacks:[]}}function zr(e){var t=e.curOp;t&&sn(t,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,n=0;n<t.length;n++)!function(e){var t=e.cm,n=t.display;(function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=Sn(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=Sn(e)+"px",t.scrollbarsClipped=!0)})(t),e.updateMaxLine&&_t(t);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<n.viewFrom||e.scrollToPos.to.line>=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new Xr(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}(t[n]);for(var r=0;r<t.length;r++)!function(e){e.updatedDisplay=e.mustUpdate&&Yr(e.cm,e.update)}(t[r]);for(var i=0;i<t.length;i++)!function(e){var t=e.cm,n=t.display;e.updatedDisplay&&yr(t);e.barMeasure=Or(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Mn(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+Sn(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Ln(t)));(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}(t[i]);for(var o=0;o<t.length;o++)!function(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&Ar(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var n=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,n);!e.updatedDisplay&&e.startHeight==t.doc.height||Hr(t,e.barMeasure);e.updatedDisplay&&Zr(t,e.barMeasure);e.selectionChanged&&fr(t);t.state.focused&&e.updateInput&&t.display.input.reset(e.typing);n&&pr(e.cm)}(t[o]);for(var l=0;l<t.length;l++)!function(e){var t=e.cm,n=t.display,r=t.doc;e.updatedDisplay&&_r(t,e.update);null==n.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(n.wheelStartX=n.wheelStartY=null);null!=e.scrollTop&&Nr(t,e.scrollTop,e.forceScroll);null!=e.scrollLeft&&Ar(t,e.scrollLeft,!0,!0);{var i;e.scrollToPos&&(i=function(e,t,n,r){null==r&&(r=0),e.options.lineWrapping||t!=n||(n="before"==(t=t.ch?lt(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?lt(t.line,t.ch+1,"before"):t);for(var i=0;i<5;i++){var o,l=!1,s=Vn(e,t),a=n&&n!=t?Vn(e,n):s,u=xr(e,o={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-r,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+r}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mr(e,u.scrollTop),1<Math.abs(e.doc.scrollTop-c)&&(l=!0)),null!=u.scrollLeft&&(Ar(e,u.scrollLeft),1<Math.abs(e.doc.scrollLeft-h)&&(l=!0)),!l)break}return o}(t,ft(r,e.scrollToPos.from),ft(r,e.scrollToPos.to),e.scrollToPos.margin),function(e,t){var n,r,i,o;Le(e,"scrollCursorIntoView")||(r=(n=e.display).sizer.getBoundingClientRect(),i=null,t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null==i||u||(o=O("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-wn(e.display))+"px;\n height: "+(t.bottom-t.top+Sn(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;"),e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)))}(t,i))}var o=e.maybeHiddenMarkers,l=e.maybeUnhiddenMarkers;if(o)for(var s=0;s<o.length;++s)o[s].lines.length||Se(o[s],"hide");if(l)for(var a=0;a<l.length;++a)l[a].lines.length&&Se(l[a],"unhide");n.wrapper.offsetHeight&&(r.scrollTop=t.display.scroller.scrollTop);e.changeObjs&&Se(t,"changes",t,e.changeObjs);e.update&&e.update.finish()}(t[l])}(e)})}function Br(e,t){if(e.curOp)return t();Rr(e);try{return t()}finally{zr(e)}}function Gr(e,t){return function(){if(e.curOp)return t.apply(e,arguments);Rr(e);try{return t.apply(e,arguments)}finally{zr(e)}}}function Ur(e){return function(){if(this.curOp)return e.apply(this,arguments);Rr(this);try{return e.apply(this,arguments)}finally{zr(this)}}}function Vr(t){return function(){var e=this.cm;if(!e||e.curOp)return t.apply(this,arguments);Rr(e);try{return t.apply(this,arguments)}finally{zr(e)}}}function Kr(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(jr,e))}function jr(a){var u,c,h,d=a.doc;d.highlightFrontier>=a.display.viewTo||(u=+new Date+a.options.workTime,c=bt(a,d.highlightFrontier),h=[],d.iter(c.line,Math.min(d.first+d.size,a.display.viewTo+500),function(e){if(c.line>=a.display.viewFrom){var t=e.styles,n=e.text.length>a.options.maxHighlightLength?_e(d.mode,c.state):null,r=vt(a,e,c,!0);n&&(c.state=n),e.styles=r.styles;var i=e.styleClasses,o=r.classes;o?e.styleClasses=o:i&&(e.styleClasses=null);for(var l=!t||t.length!=e.styles.length||i!=o&&(!i||!o||i.bgClass!=o.bgClass||i.textClass!=o.textClass),s=0;!l&&s<t.length;++s)l=t[s]!=e.styles[s];l&&h.push(c.line),e.stateAfter=c.save(),c.nextLine()}else e.text.length<=a.options.maxHighlightLength&&wt(a,e.text,c),e.stateAfter=c.line%5==0?c.save():null,c.nextLine();if(+new Date>u)return Kr(a,a.options.workDelay),!0}),d.highlightFrontier=c.line,d.modeFrontier=Math.max(d.modeFrontier,c.line),h.length&&Br(a,function(){for(var e=0;e<h.length;e++)or(a,h[e],"text")}))}var Xr=function(e,t,n){var r=e.display;this.viewport=t,this.visible=wr(r,e.doc,t),this.editorIsHidden=!r.wrapper.offsetWidth,this.wrapperHeight=r.wrapper.clientHeight,this.wrapperWidth=r.wrapper.clientWidth,this.oldDisplayWidth=Ln(e),this.force=n,this.dims=Qn(e),this.events=[]};function Yr(e,t){var n=e.display,r=e.doc;if(t.editorIsHidden)return lr(e),!1;if(!t.force&&t.visible.from>=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==ar(e))return!1;Jr(e)&&(lr(e),t.dims=Qn(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFrom<o&&o-n.viewFrom<20&&(o=Math.max(r.first,n.viewFrom)),n.viewTo>l&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),Nt&&(o=Vt(e.doc,o),l=Kt(e.doc,l));var s,a,u,c,h=o!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;a=o,u=l,0==(c=(s=e).display).view.length||a>=c.viewTo||u<=c.viewFrom?(c.view=on(s,a,u),c.viewFrom=a):(c.viewFrom>a?c.view=on(s,a,c.viewFrom).concat(c.view):c.viewFrom<a&&(c.view=c.view.slice(rr(s,a))),c.viewFrom=a,c.viewTo<u?c.view=c.view.concat(on(s,c.viewTo,u)):c.viewTo>u&&(c.view=c.view.slice(0,rr(s,u)))),c.viewTo=u,n.viewOffset=Xt(Qe(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var d=ar(e);if(!h&&0==d&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var f,p,g,m=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var n,r={activeElt:t};return!window.getSelection||(n=window.getSelection()).anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset),r}(e);return 4<d&&(n.lineDiv.style.display="none"),function(n,e,t){var r=n.display,i=n.options.lineNumbers,o=r.lineDiv,l=o.firstChild;function s(e){var t=e.nextSibling;return v&&y&&n.display.currentWheelTarget==e?e.style.display="none":e.parentNode.removeChild(e),t}for(var a=r.view,u=r.viewFrom,c=0;c<a.length;c++){var h=a[c];if(!h.hidden)if(h.node&&h.node.parentNode==o){for(;l!=h.node;)l=s(l);var d=i&&null!=e&&e<=u&&h.lineNumber;h.changes&&(-1<B(h.changes,"gutter")&&(d=!1),hn(n,h,u,t)),d&&(M(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(ot(n.options,u)))),l=h.node.nextSibling}else{var f=function(e,t,n,r){var i=fn(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),pn(e,t),gn(e,t,n,r),mn(e,t,r),t.node}(n,h,u,t);o.insertBefore(f,l)}u+=h.size}for(;l;)l=s(l)}(e,n.updateLineNumbers,t.dims),4<d&&(n.lineDiv.style.display=""),n.renderedView=n.view,(f=m)&&f.activeElt&&f.activeElt!=W()&&(f.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(f.activeElt.nodeName)&&f.anchorNode&&D(document.body,f.anchorNode)&&D(document.body,f.focusNode)&&(p=window.getSelection(),(g=document.createRange()).setEnd(f.anchorNode,f.anchorOffset),g.collapse(!1),p.removeAllRanges(),p.addRange(g),p.extend(f.focusNode,f.focusOffset))),M(n.cursorDiv),M(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,h&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,Kr(e,400)),!(n.updateLineNumbers=null)}function _r(e,t){for(var n=t.viewport,r=!0;;r=!1){if(r&&e.options.lineWrapping&&t.oldDisplayWidth!=Ln(e))r&&(t.visible=wr(e.display,e.doc,n));else if(n&&null!=n.top&&(n={top:Math.min(e.doc.height+xn(e.display)-kn(e),n.top)}),t.visible=wr(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break;if(!Yr(e,t))break;yr(e);var i=Or(e);ur(e),Hr(e,i),Zr(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function $r(e,t){var n,r=new Xr(e,t);Yr(e,r)&&(yr(e),_r(e,r),n=Or(e),ur(e),Hr(e,n),Zr(e,n),r.finish())}function qr(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function Zr(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Sn(e)+"px"}function Qr(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=Jn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",l=0;l<n.length;l++)if(!n[l].hidden){e.options.fixedGutter&&(n[l].gutter&&(n[l].gutter.style.left=o),n[l].gutterBackground&&(n[l].gutterBackground.style.left=o));var s=n[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}}function Jr(e){if(e.options.lineNumbers){var t=e.doc,n=ot(e.options,t.first+t.size-1),r=e.display;if(n.length!=r.lineNumChars){var i=r.measure.appendChild(O("div",[O("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return r.lineGutter.style.width="",r.lineNumInnerWidth=Math.max(o,r.lineGutter.offsetWidth-l)+1,r.lineNumWidth=r.lineNumInnerWidth+l,r.lineNumChars=r.lineNumInnerWidth?n.length:-1,r.lineGutter.style.width=r.lineNumWidth+"px",qr(e.display),1}}}function ei(e,t){for(var n=[],r=!1,i=0;i<e.length;i++){var o=e[i],l=null;if("string"!=typeof o&&(l=o.style,o=o.className),"CodeMirror-linenumbers"==o){if(!t)continue;r=!0}n.push({className:o,style:l})}return t&&!r&&n.push({className:"CodeMirror-linenumbers",style:null}),n}function ti(e){var t=e.gutters,n=e.gutterSpecs;M(t),e.lineGutter=null;for(var r=0;r<n.length;++r){var i=n[r],o=i.className,l=i.style,s=t.appendChild(O("div",null,"CodeMirror-gutter "+o));l&&(s.style.cssText=l),"CodeMirror-linenumbers"==o&&((e.lineGutter=s).style.width=(e.lineNumWidth||1)+"px")}t.style.display=n.length?"":"none",qr(e)}function ni(e){ti(e.display),ir(e),Qr(e)}function ri(e,t,n,r){var i=this;this.input=n,i.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),i.scrollbarFiller.setAttribute("cm-not-content","true"),i.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),i.gutterFiller.setAttribute("cm-not-content","true"),i.lineDiv=A("div",null,"CodeMirror-code"),i.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),i.cursorDiv=O("div",null,"CodeMirror-cursors"),i.measure=O("div",null,"CodeMirror-measure"),i.lineMeasure=O("div",null,"CodeMirror-measure"),i.lineSpace=A("div",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,"position: relative; outline: none");var o=A("div",[i.lineSpace],"CodeMirror-lines");i.mover=O("div",[o],null,"position: relative"),i.sizer=O("div",[i.mover],"CodeMirror-sizer"),i.sizerWidth=null,i.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),i.gutters=O("div",null,"CodeMirror-gutters"),i.lineGutter=null,i.scroller=O("div",[i.sizer,i.heightForcer,i.gutters],"CodeMirror-scroll"),i.scroller.setAttribute("tabIndex","-1"),i.wrapper=O("div",[i.scrollbarFiller,i.gutterFiller,i.scroller],"CodeMirror"),x&&C<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),v||g&&d||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,i.gutterSpecs=ei(r.gutters,r.lineNumbers),ti(i),n.init(i)}Xr.prototype.signal=function(e,t){Te(e,t)&&this.events.push(arguments)},Xr.prototype.finish=function(){for(var e=0;e<this.events.length;e++)Se.apply(null,this.events[e])};var ii=0,oi=null;function li(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==n&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:null==n&&(n=e.wheelDelta),{x:t,y:n}}function si(e){var t=li(e);return t.x*=oi,t.y*=oi,t}function ai(e,t){var n,r,i,o=li(t),l=o.x,s=o.y,a=e.display,u=a.scroller,c=u.scrollWidth>u.clientWidth,h=u.scrollHeight>u.clientHeight;if(l&&c||s&&h){if(s&&y&&v)e:for(var d=t.target,f=a.view;d!=u;d=d.parentNode)for(var p=0;p<f.length;p++)if(f[p].node==d){e.display.currentWheelTarget=d;break e}if(l&&!g&&!m&&null!=oi)return s&&h&&Mr(e,Math.max(0,u.scrollTop+s*oi)),Ar(e,Math.max(0,u.scrollLeft+l*oi)),(!s||s&&h)&&Ne(t),void(a.wheelStartX=null);s&&null!=oi&&(n=s*oi,i=(r=e.doc.scrollTop)+a.wrapper.clientHeight,n<0?r=Math.max(0,r+n-50):i=Math.min(e.doc.height,i+n+50),$r(e,{top:r,bottom:i})),ii<20&&(null==a.wheelStartX?(a.wheelStartX=u.scrollLeft,a.wheelStartY=u.scrollTop,a.wheelDX=l,a.wheelDY=s,setTimeout(function(){var e,t,n;null!=a.wheelStartX&&(e=u.scrollLeft-a.wheelStartX,n=(t=u.scrollTop-a.wheelStartY)&&a.wheelDY&&t/a.wheelDY||e&&a.wheelDX&&e/a.wheelDX,a.wheelStartX=a.wheelStartY=null,n&&(oi=(oi*ii+n)/(ii+1),++ii))},200)):(a.wheelDX+=l,a.wheelDY+=s))}}x?oi=-.53:g?oi=15:l?oi=-.7:c&&(oi=-1/3);var ui=function(e,t){this.ranges=e,this.primIndex=t};ui.prototype.primary=function(){return this.ranges[this.primIndex]},ui.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(!at(n.anchor,r.anchor)||!at(n.head,r.head))return!1}return!0},ui.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new ci(ut(this.ranges[t].anchor),ut(this.ranges[t].head));return new ui(e,this.primIndex)},ui.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},ui.prototype.contains=function(e,t){t=t||e;for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(0<=st(t,r.from())&&st(e,r.to())<=0)return n}return-1};var ci=function(e,t){this.anchor=e,this.head=t};function hi(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(e,t){return st(e.from(),t.from())}),n=B(t,i);for(var o=1;o<t.length;o++){var l,s,a,u=t[o],c=t[o-1],h=st(c.to(),u.from());(r&&!u.empty()?0<h:0<=h)&&(l=ht(c.from(),u.from()),s=ct(c.to(),u.to()),a=c.empty()?u.from()==u.head:c.from()==c.head,o<=n&&--n,t.splice(--o,2,new ci(a?s:l,a?l:s)))}return new ui(t,n)}function di(e,t){return new ui([new ci(e,t||e)],0)}function fi(e){return e.text?lt(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function pi(e,t){if(st(e,t.from)<0)return e;if(st(e,t.to)<=0)return fi(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=fi(t).ch-t.to.ch),lt(n,r)}function gi(e,t){for(var n=[],r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new ci(pi(i.anchor,t),pi(i.head,t)))}return hi(e.cm,n,e.sel.primIndex)}function mi(e,t,n){return e.line==t.line?lt(n.line,e.ch-t.ch+n.ch):lt(n.line+(e.line-t.line),e.ch)}function vi(e){e.doc.mode=je(e.options,e.doc.modeOption),yi(e)}function yi(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Kr(e,100),e.state.modeGen++,e.curOp&&ir(e)}function bi(e,t){return 0==t.from.ch&&0==t.to.ch&&""==$(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function wi(e,r,t,i){function o(e){return t?t[e]:null}function n(e,t,n){!function(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),Ht(e),Ft(e,n);var i=r?r(e):1;i!=e.height&&tt(e,i)}(e,t,n,i),un(e,"change",e,r)}function l(e,t){for(var n=[],r=e;r<t;++r)n.push(new $t(d[r],o(r),i));return n}var s,a,u,c=r.from,h=r.to,d=r.text,f=Qe(e,c.line),p=Qe(e,h.line),g=$(d),m=o(d.length-1),v=h.line-c.line;r.full?(e.insert(0,l(0,d.length)),e.remove(d.length,e.size-d.length)):bi(e,r)?(s=l(0,d.length-1),n(p,p.text,m),v&&e.remove(c.line,v),s.length&&e.insert(c.line,s)):f==p?1==d.length?n(f,f.text.slice(0,c.ch)+g+f.text.slice(h.ch),m):((a=l(1,d.length-1)).push(new $t(g+f.text.slice(h.ch),m,i)),n(f,f.text.slice(0,c.ch)+d[0],o(0)),e.insert(c.line+1,a)):1==d.length?(n(f,f.text.slice(0,c.ch)+d[0]+p.text.slice(h.ch),o(0)),e.remove(c.line+1,v)):(n(f,f.text.slice(0,c.ch)+d[0],o(0)),n(p,g+p.text.slice(h.ch),m),u=l(1,d.length-1),1<v&&e.remove(c.line+1,v-1),e.insert(c.line+1,u)),un(e,"change",e,r)}function xi(e,s,a){!function e(t,n,r){if(t.linked)for(var i=0;i<t.linked.length;++i){var o,l=t.linked[i];l.doc!=n&&(o=r&&l.sharedHist,a&&!o||(s(l.doc,o),e(l.doc,t,o)))}}(e,null,!0)}function Ci(e,t){if(t.cm)throw new Error("This document is already in use.");tr((e.doc=t).cm=e),vi(e),Si(e),e.options.lineWrapping||_t(e),e.options.mode=t.modeOption,ir(e)}function Si(e){("rtl"==e.doc.direction?H:T)(e.display.lineDiv,"CodeMirror-rtl")}function Li(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function ki(e,t){var n={from:ut(t.from),to:fi(t),text:Je(e,t.from,t.to)};return Oi(e,n,t.from.line,t.to.line+1),xi(e,function(e){return Oi(e,n,t.from.line,t.to.line+1),0},!0),n}function Ti(e){for(;e.length;){if(!$(e).ranges)break;e.pop()}}function Mi(e,t,n,r){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=(s=i).lastOp==r?(Ti(s.done),$(s.done)):s.done.length&&!$(s.done).ranges?$(s.done):1<s.done.length&&!s.done[s.done.length-2].ranges?(s.done.pop(),$(s.done)):void 0))l=$(o.changes),0==st(t.from,t.to)&&0==st(t.from,l.to)?l.to=fi(t):o.changes.push(ki(e,t));else{var u=$(i.done);for(u&&u.ranges||Ai(e.sel,i.done),o={changes:[ki(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,l||Se(e,"historyAdded")}function Ni(e,t,n,r){var i,o,l,s,a,u=e.history,c=r&&r.origin;n==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=$(u.done),s=t,"*"==(a=o.charAt(0))||"+"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Ai(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=n,r&&!1!==r.clearRedo&&Ti(u.undone)}function Ai(e,t){var n=$(t);n&&n.ranges&&n.equals(e)||t.push(e)}function Oi(t,n,e,r){var i=n["spans_"+t.id],o=0;t.iter(Math.max(t.first,e),Math.min(t.first+t.size,r),function(e){e.markedSpans&&((i=i||(n["spans_"+t.id]={}))[o]=e.markedSpans),++o})}function Di(e,t){var n=t["spans_"+e.id];if(!n)return null;for(var r=[],i=0;i<t.text.length;++i)r.push(function(e){if(!e)return null;for(var t,n=0;n<e.length;++n)e[n].marker.explicitlyCleared?t=t||e.slice(0,n):t&&t.push(e[n]);return t?t.length?t:null:e}(n[i]));return r}function Wi(e,t){var n=Di(e,t),r=Dt(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var o=n[i],l=r[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(n[i]=l)}return n}function Hi(e,t,n){for(var r=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)r.push(n?ui.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];r.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\d+)$/))&&-1<B(t,Number(c[1]))&&($(s)[h]=u[h],delete u[h])}}}return r}function Fi(e,t,n,r){if(r){var i,o=e.anchor;return n&&((i=st(t,o)<0)!=st(n,o)<0?(o=t,t=n):i!=st(t,n)<0&&(t=n)),new ci(o,t)}return new ci(n||t,t)}function Pi(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),Bi(e,new ui([Fi(e.sel.primary(),t,n,i)],0),r)}function Ei(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)r[o]=Fi(e.sel.ranges[o],t[o],null,i);Bi(e,hi(e.cm,r,e.sel.primIndex),n)}function Ii(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,Bi(e,hi(e.cm,i,e.sel.primIndex),r)}function Ri(e,t,n,r){Bi(e,di(t,n),r)}function zi(e,t,n){var r=e.history.done,i=$(r);i&&i.ranges?Gi(e,r[r.length-1]=t,n):Bi(e,t,n)}function Bi(e,t,n){Gi(e,t,n),Ni(e,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function Gi(e,t,n){var r,i,o,l;(Te(e,"beforeSelectionChange")||e.cm&&Te(e.cm,"beforeSelectionChange"))&&(r=e,o=n,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new ci(ft(r,e[t].anchor),ft(r,e[t].head))},origin:o&&o.origin},Se(r,"beforeSelectionChange",r,l),r.cm&&Se(r.cm,"beforeSelectionChange",r.cm,l),t=l.ranges!=i.ranges?hi(r.cm,l.ranges,l.ranges.length-1):i);var s=n&&n.bias||(st(t.primary().head,e.sel.primary().head)<0?-1:1);Ui(e,Ki(e,t,s,!0)),n&&!1===n.scroll||!e.cm||Sr(e.cm)}function Ui(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=1,e.cm.curOp.selectionChanged=!0,ke(e.cm)),un(e,"cursorActivity",e))}function Vi(e){Ui(e,Ki(e,e.sel,null,!1))}function Ki(e,t,n,r){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Xi(e,l.anchor,s&&s.anchor,n,r),u=Xi(e,l.head,s&&s.head,n,r);!i&&a==l.anchor&&u==l.head||((i=i||t.ranges.slice(0,o))[o]=new ci(a,u))}return i?hi(e.cm,i,t.primIndex):t}function ji(e,t,n,r,i){var o=Qe(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker,u="selectLeft"in a?!a.selectLeft:a.inclusiveLeft,c="selectRight"in a?!a.selectRight:a.inclusiveRight;if((null==s.from||(u?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(c?s.to>=t.ch:s.to>t.ch))){if(i&&(Se(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(n){var h=a.find(r<0?1:-1),d=void 0;if((r<0?c:u)&&(h=Yi(e,h,-r,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(d=st(h,n))&&(r<0?d<0:0<d))return ji(e,h,t,r,i)}var f=a.find(r<0?-1:1);return(r<0?u:c)&&(f=Yi(e,f,r,f.line==t.line?o:null)),f?ji(e,f,t,r,i):null}}return t}function Xi(e,t,n,r,i){var o=r||1,l=ji(e,t,n,o,i)||!i&&ji(e,t,n,o,!0)||ji(e,t,n,-o,i)||!i&&ji(e,t,n,-o,!0);return l||(e.cantEdit=!0,lt(e.first,0))}function Yi(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?ft(e,lt(t.line-1)):null:0<n&&t.ch==(r||Qe(e,t.line)).text.length?t.line<e.first+e.size-1?lt(t.line+1,0):null:new lt(t.line,t.ch+n)}function _i(e){e.setSelection(lt(e.firstLine(),0),lt(e.lastLine()),V)}function $i(i,e,t){var o={canceled:!1,from:e.from,to:e.to,text:e.text,origin:e.origin,cancel:function(){return o.canceled=!0}};return t&&(o.update=function(e,t,n,r){e&&(o.from=ft(i,e)),t&&(o.to=ft(i,t)),n&&(o.text=n),void 0!==r&&(o.origin=r)}),Se(i,"beforeChange",i,o),i.cm&&Se(i.cm,"beforeChange",i.cm,o),o.canceled?(i.cm&&(i.cm.curOp.updateInput=2),null):{from:o.from,to:o.to,text:o.text,origin:o.origin}}function qi(e,t,n){if(e.cm){if(!e.cm.curOp)return Gr(e.cm,qi)(e,t,n);if(e.cm.state.suppressEdits)return}if(!(Te(e,"beforeChange")||e.cm&&Te(e.cm,"beforeChange"))||(t=$i(e,t,!0))){var r=Mt&&!n&&function(e,t,n){var r=null;if(e.iter(t.line,n.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;!n.readOnly||r&&-1!=B(r,n)||(r=r||[]).push(n)}}),!r)return null;for(var i=[{from:t,to:n}],o=0;o<r.length;++o)for(var l=r[o],s=l.find(0),a=0;a<i.length;++a){var u,c,h,d=i[a];st(d.to,s.from)<0||0<st(d.from,s.to)||(u=[a,1],c=st(d.from,s.from),h=st(d.to,s.to),(c<0||!l.inclusiveLeft&&!c)&&u.push({from:d.from,to:s.from}),(0<h||!l.inclusiveRight&&!h)&&u.push({from:s.to,to:d.to}),i.splice.apply(i,u),a+=u.length-3)}return i}(e,t.from,t.to);if(r)for(var i=r.length-1;0<=i;--i)Zi(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else Zi(e,t)}}function Zi(e,n){var t,r;1==n.text.length&&""==n.text[0]&&0==st(n.from,n.to)||(t=gi(e,n),Mi(e,n,t,e.cm?e.cm.curOp.id:NaN),eo(e,n,t,Dt(e,n)),r=[],xi(e,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Dt(e,n))}))}function Qi(i,o,e){var t=i.cm&&i.cm.state.suppressEdits;if(!t||e){for(var l,n=i.history,r=i.sel,s="undo"==o?n.done:n.undone,a="undo"==o?n.undone:n.done,u=0;u<s.length&&(l=s[u],e?!l.ranges||l.equals(i.sel):l.ranges);u++);if(u!=s.length){for(n.lastOrigin=n.lastSelOrigin=null;;){if(!(l=s.pop()).ranges){if(t)return void s.push(l);break}if(Ai(l,a),e&&!l.equals(i.sel))return void Bi(i,l,{clearRedo:!1});r=l}var c=[];Ai(r,a),a.push({changes:c,generation:n.generation}),n.generation=l.generation||++n.maxGeneration;for(var h=Te(i,"beforeChange")||i.cm&&Te(i.cm,"beforeChange"),d=l.changes.length-1;0<=d;--d){var f=function(e){var n=l.changes[e];if(n.origin=o,h&&!$i(i,n,!1))return s.length=0,{};c.push(ki(i,n));var t=e?gi(i,n):$(s);eo(i,n,t,Wi(i,n)),!e&&i.cm&&i.cm.scrollIntoView({from:n.from,to:fi(n)});var r=[];xi(i,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Wi(e,n))})}(d);if(f)return f.v}}}}function Ji(e,t){if(0!=t&&(e.first+=t,e.sel=new ui(q(e.sel.ranges,function(e){return new ci(lt(e.anchor.line+t,e.anchor.ch),lt(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){ir(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;r<n.viewTo;r++)or(e.cm,r,"gutter")}}function eo(e,t,n,r){if(e.cm&&!e.cm.curOp)return Gr(e.cm,eo)(e,t,n,r);var i,o;t.to.line<e.first?Ji(e,t.text.length-1-(t.to.line-t.from.line)):t.from.line>e.lastLine()||(t.from.line<e.first&&(Ji(e,i=t.text.length-1-(e.first-t.from.line)),t={from:lt(e.first,0),to:lt(t.to.line+i,t.to.ch),text:[$(t.text)],origin:t.origin}),o=e.lastLine(),t.to.line>o&&(t={from:t.from,to:lt(o,Qe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Je(e,t.from,t.to),n=n||gi(e,t),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=nt(Ut(Qe(r,o.line))),r.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0}));-1<r.sel.contains(t.from,t.to)&&ke(e);wi(r,t,n,er(e)),e.options.lineWrapping||(r.iter(a,o.line+t.text.length,function(e){var t=Yt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var n=e.first,r=t-1;n<r;r--){var i=Qe(e,r).stateAfter;if(i&&(!(i instanceof gt)||r+i.lookAhead<t)){n=r+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,n)}})(r,o.line),Kr(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?ir(e):o.line!=l.line||1!=t.text.length||bi(e.doc,t)?ir(e,o.line,l.line+1,u):or(e,o.line,"text");var c=Te(e,"changes"),h=Te(e,"change");{var d;(h||c)&&(d={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin},h&&un(e,"change",e,d),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(d))}e.display.selForContextMenu=null}(e.cm,t,r):wi(e,t,r),Gi(e,n,V),e.cantEdit&&Xi(e,lt(e.firstLine(),0))&&(e.cantEdit=!1))}function to(e,t,n,r,i){var o;st(r=r||n,n)<0&&(n=(o=[r,n])[0],r=o[1]),"string"==typeof t&&(t=e.splitLines(t)),qi(e,{from:n,to:r,text:t,origin:i})}function no(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function ro(e,t,n,r){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)no(o.ranges[s].anchor,t,n,r),no(o.ranges[s].head,t,n,r)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(n<u.from.line)u.from=lt(u.from.line+r,u.from.ch),u.to=lt(u.to.line+r,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function io(e,t){var n=t.from.line,r=t.to.line,i=t.text.length-(r-n)-1;ro(e.done,n,r,i),ro(e.undone,n,r,i)}function oo(e,t,n,r){var i=t,o=t;return"number"==typeof t?o=Qe(e,dt(e,t)):i=nt(t),null==i?null:(r(o,i)&&e.cm&&or(e.cm,i,n),o)}function lo(e){this.lines=e,this.parent=null;for(var t=0,n=0;n<e.length;++n)e[n].parent=this,t+=e[n].height;this.height=t}function so(e){this.children=e;for(var t=0,n=0,r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}ci.prototype.from=function(){return ht(this.anchor,this.head)},ci.prototype.to=function(){return ct(this.anchor,this.head)},ci.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},lo.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n,r=e,i=e+t;r<i;++r){var o=this.lines[r];this.height-=o.height,(n=o).parent=null,Ht(n),un(o,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},so.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n,r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e),s=i.height;if(i.removeInner(e,l),this.height-=s-i.height,o==l&&(this.children.splice(r--,1),i.parent=null),0==(t-=l))break;e=0}else e-=o}this.size-t<25&&(1<this.children.length||!(this.children[0]instanceof lo))&&(n=[],this.collapse(n),this.children=[new lo(n)],this.children[0].parent=this)},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,n),i.lines&&50<i.lines.length){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new lo(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++r,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t,n,r=new so(e.children.splice(e.children.length-5,5));e.parent?(e.size-=r.size,e.height-=r.height,t=B(e.parent.children,e),e.parent.children.splice(t+1,0,r)):(((n=new so(e.children)).parent=e).children=[n,r],e=n),r.parent=e.parent}while(10<e.children.length);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,n))return!0;if(0==(t-=l))break;e=0}else e-=o}}};function ao(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.doc=e,this.node=t}function uo(e,t,n){Xt(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cr(e,n)}ao.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,n=this.line,r=nt(n);if(null!=r&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var o=yn(this);tt(n,Math.max(0,n.height-o)),e&&(Br(e,function(){uo(e,n,-o),or(e,r,"widget")}),un(e,"lineWidgetCleared",e,this,r))}},ao.prototype.changed=function(){var e=this,t=this.height,n=this.doc.cm,r=this.line;this.height=null;var i=yn(this)-t;i&&(jt(this.doc,r)||tt(r,r.height+i),n&&Br(n,function(){n.curOp.forceUpdate=!0,uo(n,r,i),un(n,"lineWidgetChanged",n,e,nt(r))}))},Me(ao);var co=0,ho=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++co};function fo(t,r,i,e,n){if(e&&e.shared)return function(e,n,r,i,o){(i=I(i)).shared=!1;var l=[fo(e,n,r,i,o)],s=l[0],a=i.widgetNode;return xi(e,function(e){a&&(i.widgetNode=a.cloneNode(!0)),l.push(fo(e,ft(e,n),ft(e,r),i,o));for(var t=0;t<e.linked.length;++t)if(e.linked[t].isParent)return;s=$(l)}),new po(l,s)}(t,r,i,e,n);if(t.cm&&!t.cm.curOp)return Gr(t.cm,fo)(t,r,i,e,n);var o=new ho(t,n),l=st(r,i);if(e&&I(e,o,!1),0<l||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),e.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),e.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Gt(t,r.line,r,i,o)||r.line!=i.line&&Gt(t,i.line,r,i,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Nt=!0}o.addToHistory&&Mi(t,{from:r,to:i,origin:"markText"},t.sel,NaN);var s,a=r.line,u=t.cm;if(t.iter(a,i.line+1,function(e){var t,n;u&&o.collapsed&&!u.options.lineWrapping&&Ut(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=r.line&&tt(e,0),t=e,n=new At(o,a==r.line?r.ch:null,a==i.line?i.ch:null),t.markedSpans=t.markedSpans?t.markedSpans.concat([n]):[n],n.marker.attachLine(t),++a}),o.collapsed&&t.iter(r.line,i.line+1,function(e){jt(t,e)&&tt(e,0)}),o.clearOnEnter&&we(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(Mt=!0,(t.history.done.length||t.history.undone.length)&&t.clearHistory()),o.collapsed&&(o.id=++co,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)ir(u,r.line,i.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=r.line;c<=i.line;c++)or(u,c,"text");o.atomic&&Vi(u.doc),un(u,"markerAdded",u,o)}return o}ho.prototype.clear=function(){if(!this.explicitlyCleared){var e,t=this.doc.cm,n=t&&!t.curOp;n&&Rr(t),!Te(this,"clear")||(e=this.find())&&un(this,"clear",e.from,e.to);for(var r=null,i=null,o=0;o<this.lines.length;++o){var l=this.lines[o],s=Ot(l.markedSpans,this);t&&!this.collapsed?or(t,nt(l),"text"):t&&(null!=s.to&&(i=nt(l)),null!=s.from&&(r=nt(l))),l.markedSpans=function(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n=n||[]).push(e[r]);return n}(l.markedSpans,s),null==s.from&&this.collapsed&&!jt(this.doc,l)&&t&&tt(l,qn(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var a=0;a<this.lines.length;++a){var u=Ut(this.lines[a]),c=Yt(u);c>t.display.maxLineLength&&(t.display.maxLine=u,t.display.maxLineLength=c,t.display.maxLineChanged=!0)}null!=r&&t&&this.collapsed&&ir(t,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&Vi(t.doc)),t&&un(t,"markerCleared",t,this,r,i),n&&zr(t),this.parent&&this.parent.clear()}},ho.prototype.find=function(e,t){var n,r;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Ot(o.markedSpans,this);if(null!=l.from&&(n=lt(t?o:nt(o),l.from),-1==e))return n;if(null!=l.to&&(r=lt(t?o:nt(o),l.to),1==e))return r}return n&&{from:n,to:r}},ho.prototype.changed=function(){var o=this,l=this.find(-1,!0),s=this,a=this.doc.cm;l&&a&&Br(a,function(){var e,t,n=l.line,r=nt(l.line),i=Nn(a,r);i&&(Fn(i),a.curOp.selectionChanged=a.curOp.forceUpdate=!0),a.curOp.updateMaxLine=!0,jt(s.doc,n)||null==s.height||(e=s.height,s.height=null,(t=yn(s)-e)&&tt(n,n.height+t)),un(a,"markerChanged",a,o)})},ho.prototype.attachLine=function(e){var t;!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)),this.lines.push(e)},ho.prototype.detachLine=function(e){var t;this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)},Me(ho);var po=function(e,t){this.markers=e,this.primary=t;for(var n=0;n<e.length;++n)e[n].parent=this};function go(e){return e.findMarks(lt(e.first,0),e.clipPos(lt(e.lastLine())),function(e){return e.parent})}po.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();un(this,"clear")}},po.prototype.find=function(e,t){return this.primary.find(e,t)},Me(po);var mo=0,vo=function(e,t,n,r,i){if(!(this instanceof vo))return new vo(e,t,n,r,i);null==n&&(n=0),so.call(this,[new lo([new $t("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1;var o=lt(this.modeFrontier=this.highlightFrontier=n,0);this.sel=di(o),this.history=new Li(null),this.id=++mo,this.modeOption=t,this.lineSep=r,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),wi(this,{from:o,to:o,text:e}),Bi(this,di(o),V)};vo.prototype=Q(so.prototype,{constructor:vo,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var n=0,r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=et(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Vr(function(e){var t=lt(this.first,0),n=this.first+this.size-1;qi(this,{from:t,to:lt(n,Qe(this,n).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&Lr(this.cm,0,0),Bi(this,di(t),V)}),replaceRange:function(e,t,n,r){to(this,e,t=ft(this,t),n=n?ft(this,n):t,r)},getRange:function(e,t,n){var r=Je(this,ft(this,e),ft(this,t));return!1===n?r:r.join(n||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(it(this,e))return Qe(this,e)},getLineNumber:nt,getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=Qe(this,e)),Ut(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return ft(this,e)},getCursor:function(e){var t=this.sel.primary(),n=null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from();return n},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Vr(function(e,t,n){Ri(this,ft(this,"number"==typeof e?lt(e,t||0):e),null,n)}),setSelection:Vr(function(e,t,n){Ri(this,ft(this,e),ft(this,t||e),n)}),extendSelection:Vr(function(e,t,n){Pi(this,ft(this,e),t&&ft(this,t),n)}),extendSelections:Vr(function(e,t){Ei(this,pt(this,e),t)}),extendSelectionsBy:Vr(function(e,t){Ei(this,pt(this,q(this.sel.ranges,e)),t)}),setSelections:Vr(function(e,t,n){if(e.length){for(var r=[],i=0;i<e.length;i++)r[i]=new ci(ft(this,e[i].anchor),ft(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),Bi(this,hi(this.cm,r,t),n)}}),addSelection:Vr(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new ci(ft(this,e),ft(this,t||e))),Bi(this,hi(this.cm,r,r.length-1),n)}),getSelection:function(e){for(var t=this.sel.ranges,n=0;n<t.length;n++)var r=Je(this,t[n].from(),t[n].to()),i=i?i.concat(r):r;return!1===e?i:i.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],n=this.sel.ranges,r=0;r<n.length;r++){var i=Je(this,n[r].from(),n[r].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[r]=i}return t},replaceSelection:function(e,t,n){for(var r=[],i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")},replaceSelections:Vr(function(e,t,n){for(var r=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];r[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:n}}for(var s=t&&"end"!=t&&function(e,t,n){for(var r=[],i=h=lt(e.first,0),o=0;o<t.length;o++){var l,s,a=t[o],u=mi(a.from,h,i),c=mi(fi(a),h,i),h=a.to,i=c;"around"==n?(s=st((l=e.sel.ranges[o]).head,l.anchor)<0,r[o]=new ci(s?c:u,s?u:c)):r[o]=new ci(u,u)}return new ui(r,e.sel.primIndex)}(this,r,t),a=r.length-1;0<=a;a--)qi(this,r[a]);s?zi(this,s):this.cm&&Sr(this.cm)}),undo:Vr(function(){Qi(this,"undo")}),redo:Vr(function(){Qi(this,"redo")}),undoSelection:Vr(function(){Qi(this,"undo",!0)}),redoSelection:Vr(function(){Qi(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){var t=this;this.history=new Li(this.history.maxGeneration),xi(this,function(e){return e.history=t.history},!0)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Hi(this.history.done),undone:Hi(this.history.undone)}},setHistory:function(e){var t=this.history=new Li(this.history.maxGeneration);t.done=Hi(e.done.slice(0),null,!0),t.undone=Hi(e.undone.slice(0),null,!0)},setGutterMarker:Vr(function(e,n,r){return oo(this,e,"gutter",function(e){var t=e.gutterMarkers||(e.gutterMarkers={});return!(t[n]=r)&&ne(t)&&(e.gutterMarkers=null),1})}),clearGutter:Vr(function(t){var n=this;this.iter(function(e){e.gutterMarkers&&e.gutterMarkers[t]&&oo(n,e,"gutter",function(){return e.gutterMarkers[t]=null,ne(e.gutterMarkers)&&(e.gutterMarkers=null),1})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!it(this,e))return null;if(!(e=Qe(this,t=e)))return null}else if(null==(t=nt(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Vr(function(e,n,r){return oo(this,e,"gutter"==n?"gutter":"class",function(e){var t="text"==n?"textClass":"background"==n?"bgClass":"gutter"==n?"gutterClass":"wrapClass";if(e[t]){if(L(r).test(e[t]))return;e[t]+=" "+r}else e[t]=r;return 1})}),removeLineClass:Vr(function(e,o,l){return oo(this,e,"gutter"==o?"gutter":"class",function(e){var t="text"==o?"textClass":"background"==o?"bgClass":"gutter"==o?"gutterClass":"wrapClass",n=e[t];if(n){if(null==l)e[t]=null;else{var r=n.match(L(l));if(!r)return;var i=r.index+r[0].length;e[t]=n.slice(0,r.index)+(r.index&&i!=n.length?" ":"")+n.slice(i)||null}return 1}})}),addLineWidget:Vr(function(e,t,n){return i=e,o=new ao(r=this,t,n),(l=r.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),oo(r,i,"widget",function(e){var t,n=e.widgets||(e.widgets=[]);return null==o.insertAt?n.push(o):n.splice(Math.min(n.length-1,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!jt(r,e)&&(t=Xt(e)<r.scrollTop,tt(e,e.height+yn(o)),t&&Cr(l,o.height),l.curOp.forceUpdate=!0),1}),l&&un(l,"lineWidgetAdded",l,o,"number"==typeof i?i:nt(i)),o;var r,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,n){return fo(this,ft(this,e),ft(this,t),n,n&&n.type||"range")},setBookmark:function(e,t){var n={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return fo(this,e=ft(this,e),e,n,"bookmark")},findMarksAt:function(e){var t=[],n=Qe(this,(e=ft(this,e)).line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(i,o,l){i=ft(this,i),o=ft(this,o);var s=[],a=i.line;return this.iter(i.line,o.line+1,function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;n++){var r=t[n];null!=r.to&&a==i.line&&i.ch>=r.to||null==r.from&&a!=i.line||null!=r.from&&a==o.line&&r.from>=o.ch||l&&!l(r.marker)||s.push(r.marker.parent||r.marker)}++a}),s},getAllMarks:function(){var r=[];return this.iter(function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;++n)null!=t[n].from&&r.push(t[n].marker)}),r},posFromIndex:function(n){var r,i=this.first,o=this.lineSeparator().length;return this.iter(function(e){var t=e.text.length+o;if(n<t)return r=n,!0;n-=t,++i}),ft(this,lt(i,r))},indexFromPos:function(e){var t=(e=ft(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var n=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+n}),t},copy:function(e){var t=new vo(et(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e=e||{};var t=this.first,n=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<n&&(n=e.to);var r=new vo(et(this,t,n),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(r.history=this.history),(this.linked||(this.linked=[])).push({doc:r,sharedHist:e.sharedHist}),r.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var n=0;n<t.length;n++){var r,i=t[n],o=i.find(),l=e.clipPos(o.from),s=e.clipPos(o.to);st(l,s)&&(r=fo(e,l,s,i.primary,i.primary.type),i.markers.push(r),r.parent=i)}}(r,go(this)),r},unlinkDoc:function(e){if(e instanceof pl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),function(o){for(var e=0;e<o.length;e++)!function(e){var t=o[e],n=[t.primary.doc];xi(t.primary.doc,function(e){return n.push(e)});for(var r=0;r<t.markers.length;r++){var i=t.markers[r];-1==B(n,i.doc)&&(i.parent=null,t.markers.splice(r--,1))}}(e)}(go(this));break}}var n;e.history==this.history&&(n=[e.id],xi(e,function(e){return n.push(e.id)},!0),e.history=new Li(null),e.history.done=Hi(this.history.done,n),e.history.undone=Hi(this.history.undone,n))},iterLinkedDocs:function(e){xi(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):Re(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:Vr(function(e){var t;"rtl"!=e&&(e="ltr"),e!=this.direction&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Br(t=this.cm,function(){Si(t),ir(t)}))})}),vo.prototype.eachLine=vo.prototype.iter;var yo=0;function bo(e){var r=this;if(wo(r),!Le(r,e)&&!bn(r.display,e)){Ne(e),x&&(yo=+new Date);var t=nr(r,e,!0),n=e.dataTransfer.files;if(t&&!r.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),l=0,s=function(){++l==i&&Gr(r,function(){var e={from:t=ft(r.doc,t),to:t,text:r.doc.splitLines(o.filter(function(e){return null!=e}).join(r.doc.lineSeparator())),origin:"paste"};qi(r.doc,e),zi(r.doc,di(ft(r.doc,t),ft(r.doc,fi(e))))})()},a=0;a<n.length;a++)!function(e,t){var n;r.options.allowDropFileTypes&&-1==B(r.options.allowDropFileTypes,e.type)?s():((n=new FileReader).onerror=s,n.onload=function(){var e=n.result;/[\x00-\x08\x0e-\x1f]{2}/.test(e)||(o[t]=e),s()},n.readAsText(e))}(n[a],a);else{if(r.state.draggingText&&-1<r.doc.sel.contains(t))return r.state.draggingText(e),void setTimeout(function(){return r.display.input.focus()},20);try{var u,c=e.dataTransfer.getData("Text");if(c){if(r.state.draggingText&&!r.state.draggingText.copy&&(u=r.listSelections()),Gi(r.doc,di(t,t)),u)for(var h=0;h<u.length;++h)to(r.doc,"",u[h].anchor,u[h].head,"drag");r.replaceSelection(c,"around","paste"),r.display.input.focus()}}catch(e){}}}}function wo(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function xo(t){if(document.getElementsByClassName){for(var e=document.getElementsByClassName("CodeMirror"),n=[],r=0;r<e.length;r++){var i=e[r].CodeMirror;i&&n.push(i)}n.length&&n[0].operation(function(){for(var e=0;e<n.length;e++)t(n[e])})}}var Co=!1;function So(){var e;Co||(we(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,xo(Lo)},100))}),we(window,"blur",function(){return xo(vr)}),Co=!0)}function Lo(e){var t=e.display;t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize()}for(var ko={3:"Pause",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",145:"ScrollLock",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",224:"Mod",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},To=0;To<10;To++)ko[To+48]=ko[To+96]=String(To);for(var Mo=65;Mo<=90;Mo++)ko[Mo]=String.fromCharCode(Mo);for(var No=1;No<=12;No++)ko[No+111]=ko[No+63235]="F"+No;var Ao={};function Oo(e){var t,n,r,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))n=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error("Unrecognized modifier name: "+s);r=!0}}return t&&(e="Alt-"+e),n&&(e="Ctrl-"+e),i&&(e="Cmd-"+e),r&&(e="Shift-"+e),e}function Do(e){var t={};for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(/^(name|fallthrough|(de|at)tach)$/.test(n))continue;if("..."==r){delete e[n];continue}for(var i=q(n.split(" "),Oo),o=0;o<i.length;o++){var l=void 0,s=void 0,l=o==i.length-1?(s=i.join(" "),r):(s=i.slice(0,o+1).join(" "),"..."),a=t[s];if(a){if(a!=l)throw new Error("Inconsistent bindings for "+s)}else t[s]=l}delete e[n]}for(var u in t)e[u]=t[u];return e}function Wo(e,t,n,r){var i=(t=Eo(t)).call?t.call(e,r):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&n(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return Wo(e,t.fallthrough,n,r);for(var o=0;o<t.fallthrough.length;o++){var l=Wo(e,t.fallthrough[o],n,r);if(l)return l}}}function Ho(e){var t="string"==typeof e?e:ko[e.keyCode];return"Ctrl"==t||"Alt"==t||"Shift"==t||"Mod"==t}function Fo(e,t,n){var r=e;return t.altKey&&"Alt"!=r&&(e="Alt-"+e),(w?t.metaKey:t.ctrlKey)&&"Ctrl"!=r&&(e="Ctrl-"+e),(w?t.ctrlKey:t.metaKey)&&"Mod"!=r&&(e="Cmd-"+e),!n&&t.shiftKey&&"Shift"!=r&&(e="Shift-"+e),e}function Po(e,t){if(m&&34==e.keyCode&&e.char)return!1;var n=ko[e.keyCode];return null!=n&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(n=e.code),Fo(n,e,t))}function Eo(e){return"string"==typeof e?Ao[e]:e}function Io(t,e){for(var n=t.doc.sel.ranges,r=[],i=0;i<n.length;i++){for(var o=e(n[i]);r.length&&st(o.from,$(r).to)<=0;){var l=r.pop();if(st(l.from,o.from)<0){o.from=l.from;break}}r.push(o)}Br(t,function(){for(var e=r.length-1;0<=e;e--)to(t.doc,"",r[e].from,r[e].to,"+delete");Sr(t)})}function Ro(e,t,n){var r=oe(e.text,t+n,n);return r<0||r>e.text.length?null:r}function zo(e,t,n){var r=Ro(e,t.ch,n);return null==r?null:new lt(t.line,r,n<0?"after":"before")}function Bo(e,t,n,r,i){if(e){"rtl"==t.doc.direction&&(i=-i);var o=ye(n,t.doc.direction);if(o){var l,s,a,u=i<0?$(o):o[0],c=i<0==(1==u.level)?"after":"before";return 0<u.level||"rtl"==t.doc.direction?(l=An(t,n),s=i<0?n.text.length-1:0,a=On(t,l,s).top,s=le(function(e){return On(t,l,e).top==a},i<0==(1==u.level)?u.from:u.to-1,s),"before"==c&&(s=Ro(n,s,1))):s=i<0?u.to:u.from,new lt(r,s,c)}}return new lt(r,i<0?n.text.length:0,i<0?"before":"after")}function Go(t,n,s,e){var a=ye(n,t.doc.direction);if(!a)return zo(n,s,e);s.ch>=n.text.length?(s.ch=n.text.length,s.sticky="before"):s.ch<=0&&(s.ch=0,s.sticky="after");var r=ae(a,s.ch,s.sticky),i=a[r];if("ltr"==t.doc.direction&&i.level%2==0&&(0<e?i.to>s.ch:i.from<s.ch))return zo(n,s,e);function u(e,t){return Ro(n,e instanceof lt?e.ch:e,t)}function o(e){return t.options.lineWrapping?(l=l||An(t,n),_n(t,n,l,e)):{begin:0,end:n.text.length}}var l,c=o("before"==s.sticky?u(s,-1):s.ch);if("rtl"==t.doc.direction||1==i.level){var h=1==i.level==e<0,d=u(s,h?1:-1);if(null!=d&&(h?d<=i.to&&d<=c.end:d>=i.from&&d>=c.begin)){var f=h?"before":"after";return new lt(s.line,d,f)}}function p(e,t,n){for(var r=function(e,t){return t?new lt(s.line,u(e,1),"before"):new lt(s.line,e,"after")};0<=e&&e<a.length;e+=t){var i=a[e],o=0<t==(1!=i.level),l=o?n.begin:u(n.end,-1);if(i.from<=l&&l<i.to)return r(l,o);if(l=o?i.from:u(i.to,-1),n.begin<=l&&l<n.end)return r(l,o)}}var g=p(r+e,e,c);if(g)return g;var m=0<e?c.end:u(c.begin,-1);return null==m||0<e&&m==n.text.length||!(g=p(0<e?0:a.length-1,e,o(m)))?null:g}Ao.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Ao.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Ao.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Ao.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Ao.default=y?Ao.macDefault:Ao.pcDefault;var Uo={selectAll:_i,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(n){return Io(n,function(e){if(e.empty()){var t=Qe(n.doc,e.head.line).text.length;return e.head.ch==t&&e.head.line<n.lastLine()?{from:e.head,to:lt(e.head.line+1,0)}:{from:e.head,to:lt(e.head.line,t)}}return{from:e.from(),to:e.to()}})},deleteLine:function(t){return Io(t,function(e){return{from:lt(e.from().line,0),to:ft(t.doc,lt(e.to().line+1,0))}})},delLineLeft:function(e){return Io(e,function(e){return{from:lt(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(n){return Io(n,function(e){var t=n.charCoords(e.head,"div").top+5;return{from:n.coordsChar({left:0,top:t},"div"),to:e.from()}})},delWrappedLineRight:function(r){return Io(r,function(e){var t=r.charCoords(e.head,"div").top+5,n=r.coordsChar({left:r.display.lineDiv.offsetWidth+100,top:t},"div");return{from:e.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(lt(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(lt(e.lastLine()))},goLineStart:function(t){return t.extendSelectionsBy(function(e){return Vo(t,e.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(t){return t.extendSelectionsBy(function(e){return Ko(t,e.head)},{origin:"+move",bias:1})},goLineEnd:function(t){return t.extendSelectionsBy(function(e){return function(e,t){var n=Qe(e.doc,t),r=function(e){for(var t;t=Bt(e);)e=t.find(1,!0).line;return e}(n);r!=n&&(t=nt(r));return Bo(!0,e,n,t,-1)}(t,e.head.line)},{origin:"+move",bias:-1})},goLineRight:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:n.display.lineDiv.offsetWidth+100,top:t},"div")},j)},goLineLeft:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:0,top:t},"div")},j)},goLineLeftSmart:function(r){return r.extendSelectionsBy(function(e){var t=r.cursorCoords(e.head,"div").top+5,n=r.coordsChar({left:0,top:t},"div");return n.ch<r.getLine(n.line).search(/\S/)?Ko(r,e.head):n},j)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"codepoint")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],n=e.listSelections(),r=e.options.tabSize,i=0;i<n.length;i++){var o=n[i].from(),l=R(e.getLine(o.line),o.ch,r);t.push(_(r-l%r))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(l){return Br(l,function(){for(var e,t,n,r=l.listSelections(),i=[],o=0;o<r.length;o++){r[o].empty()&&(e=r[o].head,(t=Qe(l.doc,e.line).text)&&(e.ch==t.length&&(e=new lt(e.line,e.ch-1)),0<e.ch?(e=new lt(e.line,e.ch+1),l.replaceRange(t.charAt(e.ch-1)+t.charAt(e.ch-2),lt(e.line,e.ch-2),e,"+transpose")):e.line>l.doc.first&&((n=Qe(l.doc,e.line-1).text)&&(e=new lt(e.line,1),l.replaceRange(t.charAt(0)+l.doc.lineSeparator()+n.charAt(n.length-1),lt(e.line-1,n.length-1),e,"+transpose")))),i.push(new ci(e,e)))}l.setSelections(i)})},newlineAndIndent:function(r){return Br(r,function(){for(var e=r.listSelections(),t=e.length-1;0<=t;t--)r.replaceRange(r.doc.lineSeparator(),e[t].anchor,e[t].head,"+input");e=r.listSelections();for(var n=0;n<e.length;n++)r.indentLine(e[n].from().line,null,!0);Sr(r)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function Vo(e,t){var n=Qe(e.doc,t),r=Ut(n);return r!=n&&(t=nt(r)),Bo(!0,e,r,t,1)}function Ko(e,t){var n=Vo(e,t.line),r=Qe(e.doc,n.line),i=ye(r,e.doc.direction);if(i&&0!=i[0].level)return n;var o=Math.max(n.ch,r.text.search(/\S/)),l=t.line==n.line&&t.ch<=o&&t.ch;return lt(n.line,l?0:o,n.sticky)}function jo(e,t,n){if("string"==typeof t&&!(t=Uo[t]))return!1;e.display.input.ensurePolled();var r=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}var Xo=new z;function Yo(e,t,n,r){var i=e.state.keySeq;if(i){if(Ho(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:Xo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),_o(e,i+" "+t,n,r))return!0}return _o(e,t,n,r)}function _o(e,t,n,r){var i=function(e,t,n){for(var r=0;r<e.state.keyMaps.length;r++){var i=Wo(t,e.state.keyMaps[r],n,e);if(i)return i}return e.options.extraKeys&&Wo(t,e.options.extraKeys,n,e)||Wo(t,e.options.keyMap,n,e)}(e,t,r);return"multi"==i&&(e.state.keySeq=t),"handled"==i&&un(e,"keyHandled",e,t,n),"handled"!=i&&"multi"!=i||(Ne(n),fr(e)),!!i}function $o(t,e){var n=Po(e,!0);return!!n&&(e.shiftKey&&!t.state.keySeq?Yo(t,"Shift-"+n,e,function(e){return jo(t,e,!0)})||Yo(t,n,e,function(e){if("string"==typeof e?/^go[A-Z]/.test(e):e.motion)return jo(t,e)}):Yo(t,n,e,function(e){return jo(t,e)}))}var qo=null;function Zo(e){var t,n,r,i=this;function o(e){18!=e.keyCode&&e.altKey||(T(r,"CodeMirror-crosshair"),Ce(document,"keyup",o),Ce(document,"mouseover",o))}e.target&&e.target!=i.display.input.getField()||(i.curOp.focus=W(),Le(i,e)||(x&&C<11&&27==e.keyCode&&(e.returnValue=!1),t=e.keyCode,i.display.shift=16==t||e.shiftKey,n=$o(i,e),m&&(qo=n?t:null,!n&&88==t&&!Be&&(y?e.metaKey:e.ctrlKey)&&i.replaceSelection("",null,"cut")),g&&!y&&!n&&46==t&&e.shiftKey&&!e.ctrlKey&&document.execCommand&&document.execCommand("cut"),18!=t||/\bCodeMirror-crosshair\b/.test(i.display.lineDiv.className)||(H(r=i.display.lineDiv,"CodeMirror-crosshair"),we(document,"keyup",o),we(document,"mouseover",o))))}function Qo(e){16==e.keyCode&&(this.doc.sel.shift=!1),Le(this,e)}function Jo(e){var t=this;if(!(e.target&&e.target!=t.display.input.getField()||bn(t.display,e)||Le(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var n,r,i=e.keyCode,o=e.charCode;if(m&&i==qo)return qo=null,void Ne(e);m&&(!e.which||e.which<10)&&$o(t,e)||"\b"!=(n=String.fromCharCode(null==o?i:o))&&(Yo(r=t,"'"+n+"'",e,function(e){return jo(r,e,!0)})||t.display.input.onKeyPress(e))}}var el,tl,nl=function(e,t,n){this.time=e,this.pos=t,this.button=n};function rl(e){var t,n,r,i,o,l,s=this,a=s.display;Le(s,e)||a.activeTouch&&a.input.supportsTouch()||(a.input.ensurePolled(),a.shift=e.shiftKey,bn(a,e)?v||(a.scroller.draggable=!1,setTimeout(function(){return a.scroller.draggable=!0},100)):ll(s,e)||(t=nr(s,e),n=He(e),r=t?(i=t,o=n,l=+new Date,tl&&tl.compare(l,i,o)?(el=tl=null,"triple"):el&&el.compare(l,i,o)?(tl=new nl(l,i,o),el=null,"double"):(el=new nl(l,i,o),tl=null,"single")):"single",window.focus(),1==n&&s.state.selectingText&&s.state.selectingText(e),t&&function(n,e,r,t,i){var o="Click";"double"==t?o="Double"+o:"triple"==t&&(o="Triple"+o);return Yo(n,Fo(o=(1==e?"Left":2==e?"Middle":"Right")+o,i),i,function(e){if("string"==typeof e&&(e=Uo[e]),!e)return!1;var t=!1;try{n.isReadOnly()&&(n.state.suppressEdits=!0),t=e(n,r)!=U}finally{n.state.suppressEdits=!1}return t})}(s,n,t,r,e)||(1==n?t?function(e,t,n,r){x?setTimeout(E(pr,e),0):e.curOp.focus=W();var i,o=function(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};{var o;null==i.unit&&(o=f?n.shiftKey&&n.metaKey:n.altKey,i.unit=o?"rectangle":"single"==t?"char":"double"==t?"word":"line")}null!=i.extend&&!e.doc.extend||(i.extend=e.doc.extend||n.shiftKey);null==i.addNew&&(i.addNew=y?n.metaKey:n.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?n.altKey:n.ctrlKey));return i}(e,n,r),l=e.doc.sel;(e.options.dragDrop&&Ee&&!e.isReadOnly()&&"single"==n&&-1<(i=l.contains(t))&&(st((i=l.ranges[i]).from(),t)<0||0<t.xRel)&&(0<st(i.to(),t)||t.xRel<0)?function(t,n,r,i){var o=t.display,l=!1,s=Gr(t,function(e){v&&(o.scroller.draggable=!1),t.state.draggingText=!1,Ce(o.wrapper.ownerDocument,"mouseup",s),Ce(o.wrapper.ownerDocument,"mousemove",a),Ce(o.scroller,"dragstart",u),Ce(o.scroller,"drop",s),l||(Ne(e),i.addNew||Pi(t.doc,r,null,null,i.extend),v&&!c||x&&9==C?setTimeout(function(){o.wrapper.ownerDocument.body.focus({preventScroll:!0}),o.input.focus()},20):o.input.focus())}),a=function(e){l=l||10<=Math.abs(n.clientX-e.clientX)+Math.abs(n.clientY-e.clientY)},u=function(){return l=!0};v&&(o.scroller.draggable=!0);(t.state.draggingText=s).copy=!i.moveOnDrag,o.scroller.dragDrop&&o.scroller.dragDrop();we(o.wrapper.ownerDocument,"mouseup",s),we(o.wrapper.ownerDocument,"mousemove",a),we(o.scroller,"dragstart",u),we(o.scroller,"drop",s),gr(t),setTimeout(function(){return o.input.focus()},20)}:function(m,e,v,y){var l=m.display,b=m.doc;Ne(e);var w,x,C=b.sel,t=C.ranges;y.addNew&&!y.extend?(x=b.sel.contains(v),w=-1<x?t[x]:new ci(v,v)):(w=b.sel.primary(),x=b.sel.primIndex);{var n;"rectangle"==y.unit?(y.addNew||(w=new ci(v,v)),v=nr(m,e,!0,!0),x=-1):(n=il(m,v,y.unit),w=y.extend?Fi(w,n.anchor,n.head,y.extend):n)}y.addNew?-1==x?(x=t.length,Bi(b,hi(m,t.concat([w]),x),{scroll:!1,origin:"*mouse"})):1<t.length&&t[x].empty()&&"char"==y.unit&&!y.extend?(Bi(b,hi(m,t.slice(0,x).concat(t.slice(x+1)),0),{scroll:!1,origin:"*mouse"}),C=b.sel):Ii(b,x,w,K):(Bi(b,new ui([w],x=0),K),C=b.sel);var S=v;function s(e){if(0!=st(S,e))if(S=e,"rectangle"==y.unit){for(var t=[],n=m.options.tabSize,r=R(Qe(b,v.line).text,v.ch,n),i=R(Qe(b,e.line).text,e.ch,n),o=Math.min(r,i),l=Math.max(r,i),s=Math.min(v.line,e.line),a=Math.min(m.lastLine(),Math.max(v.line,e.line));s<=a;s++){var u=Qe(b,s).text,c=X(u,o,n);o==l?t.push(new ci(lt(s,c),lt(s,c))):u.length>c&&t.push(new ci(lt(s,c),lt(s,X(u,l,n))))}t.length||t.push(new ci(v,v)),Bi(b,hi(m,C.ranges.slice(0,x).concat(t),x),{origin:"*mouse",scroll:!1}),m.scrollIntoView(e)}else{var h,d=w,f=il(m,e,y.unit),p=d.anchor,p=0<st(f.anchor,p)?(h=f.head,ht(d.from(),f.anchor)):(h=f.anchor,ct(d.to(),f.head)),g=C.ranges.slice(0);g[x]=function(e,t){var n=t.anchor,r=t.head,i=Qe(e.doc,n.line);if(0==st(n,r)&&n.sticky==r.sticky)return t;var o=ye(i);if(!o)return t;var l=ae(o,n.ch,n.sticky),s=o[l];if(s.from!=n.ch&&s.to!=n.ch)return t;var a,u=l+(s.from==n.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;{var c,h;a=r.line!=n.line?0<(r.line-n.line)*("ltr"==e.doc.direction?1:-1):(c=ae(o,r.ch,r.sticky),h=c-l||(r.ch-n.ch)*(1==s.level?-1:1),c==u-1||c==u?h<0:0<h)}var d=o[u+(a?-1:0)],f=a==(1==d.level),p=f?d.from:d.to,g=f?"after":"before";return n.ch==p&&n.sticky==g?t:new ci(new lt(n.line,p,g),r)}(m,new ci(ft(b,p),h)),Bi(b,hi(m,g,x),K)}}var a=l.wrapper.getBoundingClientRect(),u=0;function r(e){m.state.selectingText=!1,u=1/0,e&&(Ne(e),l.input.focus()),Ce(l.wrapper.ownerDocument,"mousemove",i),Ce(l.wrapper.ownerDocument,"mouseup",o),b.history.lastSelOrigin=null}var i=Gr(m,function(e){(0!==e.buttons&&He(e)?function e(t){var n,r,i=++u,o=nr(m,t,!0,"rectangle"==y.unit);o&&(0!=st(o,S)?(m.curOp.focus=W(),s(o),n=wr(l,b),(o.line>=n.to||o.line<n.from)&&setTimeout(Gr(m,function(){u==i&&e(t)}),150)):(r=t.clientY<a.top?-20:t.clientY>a.bottom?20:0)&&setTimeout(Gr(m,function(){u==i&&(l.scroller.scrollTop+=r,e(t))}),50))}:r)(e)}),o=Gr(m,r);m.state.selectingText=o,we(l.wrapper.ownerDocument,"mousemove",i),we(l.wrapper.ownerDocument,"mouseup",o)})(e,r,t,o)}(s,t,r,e):We(e)==a.scroller&&Ne(e):2==n?(t&&Pi(s.doc,t),setTimeout(function(){return a.input.focus()},20)):3==n&&(S?s.display.input.onContextMenu(e):gr(s)))))}function il(e,t,n){if("char"==n)return new ci(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new ci(lt(t.line,0),ft(e.doc,lt(t.line+1,0)));var r=n(e,t);return new ci(r.from,r.to)}function ol(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(e){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Ne(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!Te(e,n))return Oe(t);o-=s.top-l.viewOffset;for(var a=0;a<e.display.gutterSpecs.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return Se(e,n,e,rt(e.doc,o),e.display.gutterSpecs[a].className,t),Oe(t)}}function ll(e,t){return ol(e,t,"gutterClick",!0)}function sl(e,t){var n,r;bn(e.display,t)||(r=t,Te(n=e,"gutterContextMenu")&&ol(n,r,"gutterContextMenu",!1))||Le(e,t,"contextmenu")||S||e.display.input.onContextMenu(t)}function al(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),En(e)}nl.prototype.compare=function(e,t,n){return this.time+400>e&&0==st(t,this.pos)&&n==this.button};var ul={toString:function(){return"CodeMirror.Init"}},cl={},hl={};function dl(e,t,n){var r,i;!t!=!(n&&n!=ul)&&(r=e.display.dragFunctions,(i=t?we:Ce)(e.display.scroller,"dragstart",r.start),i(e.display.scroller,"dragenter",r.enter),i(e.display.scroller,"dragover",r.over),i(e.display.scroller,"dragleave",r.leave),i(e.display.scroller,"drop",r.drop))}function fl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),_t(e)),tr(e),ir(e),En(e),setTimeout(function(){return Hr(e)},100)}function pl(e,t){var n=this;if(!(this instanceof pl))return new pl(e,t);this.options=t=t?I(t):{},I(cl,t,!1);var r=t.value;"string"==typeof r?r=new vo(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new pl.inputStyles[t.inputStyle](this),o=this.display=new ri(e,r,i,t);for(var l in al(o.wrapper.CodeMirror=this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Er(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new z,keySeq:null,specialChars:null},t.autofocus&&!d&&o.input.focus(),x&&C<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(i){var o=i.display;we(o.scroller,"mousedown",Gr(i,rl)),we(o.scroller,"dblclick",x&&C<11?Gr(i,function(e){var t,n;Le(i,e)||(!(t=nr(i,e))||ll(i,e)||bn(i.display,e)||(Ne(e),n=i.findWordAt(t),Pi(i.doc,n.anchor,n.head)))}):function(e){return Le(i,e)||Ne(e)});we(o.scroller,"contextmenu",function(e){return sl(i,e)}),we(o.input.getField(),"contextmenu",function(e){o.scroller.contains(e.target)||sl(i,e)});var n,r={end:0};function l(){o.activeTouch&&(n=setTimeout(function(){return o.activeTouch=null},1e3),(r=o.activeTouch).end=+new Date)}function s(e,t){if(null==t.left)return 1;var n=t.left-e.left,r=t.top-e.top;return 400<n*n+r*r}we(o.scroller,"touchstart",function(e){var t;Le(i,e)||function(e){if(1==e.touches.length){var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}}(e)||ll(i,e)||(o.input.ensurePolled(),clearTimeout(n),t=+new Date,o.activeTouch={start:t,moved:!1,prev:t-r.end<=300?r:null},1==e.touches.length&&(o.activeTouch.left=e.touches[0].pageX,o.activeTouch.top=e.touches[0].pageY))}),we(o.scroller,"touchmove",function(){o.activeTouch&&(o.activeTouch.moved=!0)}),we(o.scroller,"touchend",function(e){var t,n,r=o.activeTouch;r&&!bn(o,e)&&null!=r.left&&!r.moved&&new Date-r.start<300&&(t=i.coordsChar(o.activeTouch,"page"),n=!r.prev||s(r,r.prev)?new ci(t,t):!r.prev.prev||s(r,r.prev.prev)?i.findWordAt(t):new ci(lt(t.line,0),ft(i.doc,lt(t.line+1,0))),i.setSelection(n.anchor,n.head),i.focus(),Ne(e)),l()}),we(o.scroller,"touchcancel",l),we(o.scroller,"scroll",function(){o.scroller.clientHeight&&(Mr(i,o.scroller.scrollTop),Ar(i,o.scroller.scrollLeft,!0),Se(i,"scroll",i))}),we(o.scroller,"mousewheel",function(e){return ai(i,e)}),we(o.scroller,"DOMMouseScroll",function(e){return ai(i,e)}),we(o.wrapper,"scroll",function(){return o.wrapper.scrollTop=o.wrapper.scrollLeft=0}),o.dragFunctions={enter:function(e){Le(i,e)||De(e)},over:function(e){var t,n,r;Le(i,e)||((r=nr(t=i,e))&&(hr(t,r,n=document.createDocumentFragment()),t.display.dragCursor||(t.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),t.display.lineSpace.insertBefore(t.display.dragCursor,t.display.cursorDiv)),N(t.display.dragCursor,n)),De(e))},start:function(e){return t=i,n=e,void(x&&(!t.state.draggingText||new Date-yo<100)?De(n):Le(t,n)||bn(t.display,n)||(n.dataTransfer.setData("Text",t.getSelection()),n.dataTransfer.effectAllowed="copyMove",n.dataTransfer.setDragImage&&!c&&((r=O("img",null,null,"position: fixed; left: 0; top: 0;")).src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",m&&(r.width=r.height=1,t.display.wrapper.appendChild(r),r._top=r.offsetTop),n.dataTransfer.setDragImage(r,0,0),m&&r.parentNode.removeChild(r))));var t,n,r},drop:Gr(i,bo),leave:function(e){Le(i,e)||wo(i)}};var e=o.input.getField();we(e,"keyup",function(e){return Qo.call(i,e)}),we(e,"keydown",Gr(i,Zo)),we(e,"keypress",Gr(i,Jo)),we(e,"focus",function(e){return mr(i,e)}),we(e,"blur",function(e){return vr(i,e)})}(this),So(),Rr(this),this.curOp.forceUpdate=!0,Ci(this,r),t.autofocus&&!d||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&mr(n)},20):vr(this),hl)hl.hasOwnProperty(l)&&hl[l](this,t[l],ul);Jr(this),t.finishInit&&t.finishInit(this);for(var s=0;s<gl.length;++s)gl[s](this);zr(this),v&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(o.lineDiv).textRendering&&(o.lineDiv.style.textRendering="auto")}pl.defaults=cl,pl.optionHandlers=hl;var gl=[];function ml(e,t,n,r){var i,o=e.doc;null==n&&(n="add"),"smart"==n&&(o.mode.indent?i=bt(e,t).state:n="prev");var l=e.options.tabSize,s=Qe(o,t),a=R(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(r||/\S/.test(s.text)){if("smart"==n&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||150<u)){if(!r)return;n="prev"}}else u=0,n="not";"prev"==n?u=t>o.first?R(Qe(o,t-1).text,null,l):0:"add"==n?u=a+e.options.indentUnit:"subtract"==n?u=a-e.options.indentUnit:"number"==typeof n&&(u=a+n),u=Math.max(0,u);var h="",d=0;if(e.options.indentWithTabs)for(var f=Math.floor(u/l);f;--f)d+=l,h+="\t";if(d<u&&(h+=_(u-d)),h!=c)return to(o,h,lt(t,0),lt(t,c.length),"+input"),!(s.stateAfter=null);for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var m=lt(t,c.length);Ii(o,p,new ci(m,m));break}}}pl.defineInitHook=function(e){return gl.push(e)};var vl=null;function yl(e){vl=e}function bl(e,t,n,r,i){var o=e.doc;e.display.shift=!1,r=r||o.sel;var l=new Date-200,s="paste"==i||e.state.pasteIncoming>l,a=Re(t),u=null;if(s&&1<r.ranges.length)if(vl&&vl.text.join("\n")==t){if(r.ranges.length%vl.text.length==0){u=[];for(var c=0;c<vl.text.length;c++)u.push(o.splitLines(vl.text[c]))}}else a.length==r.ranges.length&&e.options.pasteLinesPerSelection&&(u=q(a,function(e){return[e]}));for(var h=e.curOp.updateInput,d=r.ranges.length-1;0<=d;d--){var f=r.ranges[d],p=f.from(),g=f.to();f.empty()&&(n&&0<n?p=lt(p.line,p.ch-n):e.state.overwrite&&!s?g=lt(g.line,Math.min(Qe(o,g.line).text.length,g.ch+$(a).length)):s&&vl&&vl.lineWise&&vl.text.join("\n")==a.join("\n")&&(p=g=lt(p.line,0)));var m={from:p,to:g,text:u?u[d%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};qi(e.doc,m),un(e,"inputRead",e,m)}t&&!s&&xl(e,t),Sr(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function wl(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");return n&&(e.preventDefault(),t.isReadOnly()||t.options.disableInput||Br(t,function(){return bl(t,n,0,null,"paste")}),1)}function xl(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;0<=r;r--){var i=n.ranges[r];if(!(100<i.head.ch||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(-1<t.indexOf(o.electricChars.charAt(s))){l=ml(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Qe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=ml(e,i.head.line,"smart"));l&&un(e,"electricInput",e,i.head.line)}}}function Cl(e){for(var t=[],n=[],r=0;r<e.doc.sel.ranges.length;r++){var i=e.doc.sel.ranges[r].head.line,o={anchor:lt(i,0),head:lt(i+1,0)};n.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:n}}function Sl(e,t,n,r){e.setAttribute("autocorrect",n?"":"off"),e.setAttribute("autocapitalize",r?"":"off"),e.setAttribute("spellcheck",!!t)}function Ll(){var e=O("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=O("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return v?e.style.width="1000px":e.setAttribute("wrap","off"),a&&(e.style.border="1px solid black"),Sl(e),t}function kl(i,o,l,s,a){var e=o,t=l,u=Qe(i,o.line),c=a&&"rtl"==i.direction?-l:l;function n(e){var t,n,r;if(null==(n="codepoint"==s?(t=u.text.charCodeAt(o.ch+(0<s?0:-1)),isNaN(t)?null:new lt(o.line,Math.max(0,Math.min(u.text.length,o.ch+l*(55296<=t&&t<56320?2:1))),-l)):a?Go(i.cm,u,o,l):zo(u,o,l))){if(e||(r=o.line+c)<i.first||r>=i.first+i.size||(o=new lt(r,o.ch,o.sticky),!(u=Qe(i,r))))return;o=Bo(a,i.cm,u,o.line,c)}else o=n;return 1}if("char"==s||"codepoint"==s)n();else if("column"==s)n(!0);else if("word"==s||"group"==s)for(var r=null,h="group"==s,d=i.cm&&i.cm.getHelper(o,"wordChars"),f=!0;!(l<0)||n(!f);f=!1){var p=u.text.charAt(o.ch)||"\n",g=te(p,d)?"w":h&&"\n"==p?"n":!h||/\s/.test(p)?null:"p";if(!h||f||g||(g="s"),r&&r!=g){l<0&&(l=1,n(),o.sticky="after");break}if(g&&(r=g),0<l&&!n(!f))break}var m=Xi(i,o,e,t,!0);return at(e,m)&&(m.hitSide=!0),m}function Tl(e,t,n,r){var i,o,l,s,a=e.doc,u=t.left;for("page"==r?(i=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),o=Math.max(i-.5*qn(e.display),3),l=(0<n?t.bottom:t.top)+n*o):"line"==r&&(l=0<n?t.bottom+3:t.top-3);(s=Xn(e,u,l)).outside;){if(n<0?l<=0:l>=a.height){s.hitSide=!0;break}l+=5*n}return s}function Ml(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new z,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null}function Nl(e,t){var n=Nn(e,t.line);if(!n||n.hidden)return null;var r=Qe(e.doc,t.line),i=Tn(n,r,t.line),o=ye(r,e.doc.direction),l="left";o&&(l=ae(o,t.ch)%2?"right":"left");var s=Hn(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function Al(e,t){return t&&(e.bad=!0),e}function Ol(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Al(e.clipPos(lt(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==r)return function(u,e,t){var n=u.text.firstChild,r=!1;if(!e||!D(n,e))return Al(lt(nt(u.line),0),!0);if(e==n&&(r=!0,e=n.childNodes[t],t=0,!e)){var i=u.rest?$(u.rest):u.line;return Al(lt(nt(i),i.text.length),r)}var o=3==e.nodeType?e:null,l=e;o||1!=e.childNodes.length||3!=e.firstChild.nodeType||(o=e.firstChild,t=t&&o.nodeValue.length);for(;l.parentNode!=n;)l=l.parentNode;var c=u.measure,h=c.maps;function s(e,t,n){for(var r=-1;r<(h?h.length:0);r++)for(var i=r<0?c.map:h[r],o=0;o<i.length;o+=3){var l=i[o+2];if(l==e||l==t){var s=nt(r<0?u.line:u.rest[r]),a=i[o]+n;return(n<0||l!=e)&&(a=i[o+(n?1:0)]),lt(s,a)}}}var a=s(o,l,t);if(a)return Al(a,r);for(var d=l.nextSibling,f=o?o.nodeValue.length-t:0;d;d=d.nextSibling){if(a=s(d,d.firstChild,0))return Al(lt(a.line,a.ch-f),r);f+=d.textContent.length}for(var p=l.previousSibling,g=t;p;p=p.previousSibling){if(a=s(p,p.firstChild,-1))return Al(lt(a.line,a.ch+g),r);g+=p.textContent.length}}(o,t,n)}}Ml.prototype.init=function(e){var t=this,l=this,s=l.cm,a=l.div=e.lineDiv;function u(e){for(var t=e.target;t;t=t.parentNode){if(t==a)return 1;if(/\bCodeMirror-(?:line)?widget\b/.test(t.className))break}}function n(e){if(u(e)&&!Le(s,e)){if(s.somethingSelected())yl({lineWise:!1,text:s.getSelections()}),"cut"==e.type&&s.replaceSelection("",null,"cut");else{if(!s.options.lineWiseCopyCut)return;var t=Cl(s);yl({lineWise:!0,text:t.text}),"cut"==e.type&&s.operation(function(){s.setSelections(t.ranges,0,V),s.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var n=vl.text.join("\n");if(e.clipboardData.setData("Text",n),e.clipboardData.getData("Text")==n)return void e.preventDefault()}var r=Ll(),i=r.firstChild;s.display.lineSpace.insertBefore(r,s.display.lineSpace.firstChild),i.value=vl.text.join("\n");var o=document.activeElement;P(i),setTimeout(function(){s.display.lineSpace.removeChild(r),o.focus(),o==a&&l.showPrimarySelection()},50)}}Sl(a,s.options.spellcheck,s.options.autocorrect,s.options.autocapitalize),we(a,"paste",function(e){!u(e)||Le(s,e)||wl(e,s)||C<=11&&setTimeout(Gr(s,function(){return t.updateFromDOM()}),20)}),we(a,"compositionstart",function(e){t.composing={data:e.data,done:!1}}),we(a,"compositionupdate",function(e){t.composing||(t.composing={data:e.data,done:!1})}),we(a,"compositionend",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),we(a,"touchstart",function(){return l.forceCompositionEnd()}),we(a,"input",function(){t.composing||t.readFromDOMSoon()}),we(a,"copy",n),we(a,"cut",n)},Ml.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},Ml.prototype.prepareSelection=function(){var e=cr(this.cm,!1);return e.focus=document.activeElement==this.div,e},Ml.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Ml.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},Ml.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line<t.display.viewFrom)e.removeAllRanges();else{var o=Ol(t,e.anchorNode,e.anchorOffset),l=Ol(t,e.focusNode,e.focusOffset);if(!o||o.bad||!l||l.bad||0!=st(ht(o,l),r)||0!=st(ct(o,l),i)){var s,a,u=t.display.view,c=r.line>=t.display.viewFrom&&Nl(t,r)||{node:u[0].measure.map[2],offset:0},h=i.line<t.display.viewTo&&Nl(t,i);if(h||(h={node:(a=(s=u[u.length-1].measure).maps?s.maps[s.maps.length-1]:s.map)[a.length-1],offset:a[a.length-2]-a[a.length-3]}),c&&h){var d,f=e.rangeCount&&e.getRangeAt(0);try{d=k(c.node,c.offset,h.offset,h.node)}catch(e){}d&&(!g&&t.state.focused?(e.collapse(c.node,c.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),f&&null==e.anchorNode?e.addRange(f):g&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Ml.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Ml.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Ml.prototype.rememberSelection=function(){var e=this.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Ml.prototype.selectionInEditor=function(){var e=this.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Ml.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()&&document.activeElement==this.div||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Ml.prototype.blur=function(){this.div.blur()},Ml.prototype.getField=function(){return this.div},Ml.prototype.supportsTouch=function(){return!0},Ml.prototype.receivedFocus=function(){var t=this;this.selectionInEditor()?this.pollSelection():Br(this.cm,function(){return t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))})},Ml.prototype.selectionChanged=function(){var e=this.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Ml.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e,t,n=this.getSelection(),r=this.cm;if(h&&l&&this.cm.display.gutterSpecs.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(n.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();this.composing||(this.rememberSelection(),e=Ol(r,n.anchorNode,n.anchorOffset),t=Ol(r,n.focusNode,n.focusOffset),e&&t&&Br(r,function(){Bi(r.doc,di(e,t),V),(e.bad||t.bad)&&(r.curOp.selectionChanged=!0)}))}},Ml.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,n,r=this.cm,i=r.display,o=r.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>r.firstLine()&&(l=lt(l.line-1,Qe(r.doc,l.line-1).length)),s.ch==Qe(r.doc,s.line).text.length&&s.line<r.lastLine()&&(s=lt(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;n=l.line==i.viewFrom||0==(e=rr(r,l.line))?(t=nt(i.view[0].line),i.view[0].node):(t=nt(i.view[e].line),i.view[e-1].node.nextSibling);var a,u=rr(r,s.line),c=u==i.view.length-1?(a=i.viewTo-1,i.lineDiv.lastChild):(a=nt(i.view[u+1].line)-1,i.view[u+1].node.previousSibling);if(!n)return!1;for(var h=r.doc.splitLines(function(u,e,t,c,h){var n="",d=!1,f=u.doc.lineSeparator(),p=!1;function g(){d&&(n+=f,p&&(n+=f),d=p=!1)}function m(e){e&&(g(),n+=e)}for(;!function e(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)return void m(n);var r,i=t.getAttribute("cm-marker");if(i){var o=u.findMarks(lt(c,0),lt(h+1,0),(a=+i,function(e){return e.id==a}));return void(o.length&&(r=o[0].find(0))&&m(Je(u.doc,r.from,r.to).join(f)))}if("false"==t.getAttribute("contenteditable"))return;var l=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;l&&g();for(var s=0;s<t.childNodes.length;s++)e(t.childNodes[s]);/^(pre|p)$/i.test(t.nodeName)&&(p=!0),l&&(d=!0)}else 3==t.nodeType&&m(t.nodeValue.replace(/\u200b/g,"").replace(/\u00a0/g," "));var a}(e),e!=t;)e=e.nextSibling,p=!1;return n}(r,n,c,t,a)),d=Je(r.doc,lt(t,0),lt(a,Qe(r.doc,a).text.length));1<h.length&&1<d.length;)if($(h)==$(d))h.pop(),d.pop(),a--;else{if(h[0]!=d[0])break;h.shift(),d.shift(),t++}for(var f=0,p=0,g=h[0],m=d[0],v=Math.min(g.length,m.length);f<v&&g.charCodeAt(f)==m.charCodeAt(f);)++f;for(var y=$(h),b=$(d),w=Math.min(y.length-(1==h.length?f:0),b.length-(1==d.length?f:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==d.length&&t==l.line)for(;f&&f>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)f--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(f).replace(/\u200b+$/,"");var x=lt(t,f),C=lt(a,d.length?$(d).length-p:0);return 1<h.length||h[0]||st(x,C)?(to(r.doc,h,x,C,"+input"),!0):void 0},Ml.prototype.ensurePolled=function(){this.forceCompositionEnd()},Ml.prototype.reset=function(){this.forceCompositionEnd()},Ml.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Ml.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Ml.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Br(this.cm,function(){return ir(e.cm)})},Ml.prototype.setUneditable=function(e){e.contentEditable="false"},Ml.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Gr(this.cm,bl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Ml.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Ml.prototype.onContextMenu=function(){},Ml.prototype.resetPosition=function(){},Ml.prototype.needsContentAttribute=!0;function Dl(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new z,this.hasSelection=!1,this.composing=null}var Wl,Hl,Fl,Pl,El;function Il(e,t,r,n){Wl.defaults[e]=t,r&&(Hl[e]=n?function(e,t,n){n!=ul&&r(e,t,n)}:r)}Dl.prototype.init=function(n){var e=this,r=this,i=this.cm;this.createField(n);var o=this.textarea;function t(e){if(!Le(i,e)){if(i.somethingSelected())yl({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=Cl(i);yl({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,V):(r.prevInput="",o.value=t.text.join("\n"),P(o))}"cut"==e.type&&(i.state.cutIncoming=+new Date)}}n.wrapper.insertBefore(this.wrapper,n.wrapper.firstChild),a&&(o.style.width="0px"),we(o,"input",function(){x&&9<=C&&e.hasSelection&&(e.hasSelection=null),r.poll()}),we(o,"paste",function(e){Le(i,e)||wl(e,i)||(i.state.pasteIncoming=+new Date,r.fastPoll())}),we(o,"cut",t),we(o,"copy",t),we(n.scroller,"paste",function(e){if(!bn(n,e)&&!Le(i,e)){if(!o.dispatchEvent)return i.state.pasteIncoming=+new Date,void r.focus();var t=new Event("paste");t.clipboardData=e.clipboardData,o.dispatchEvent(t)}}),we(n.lineSpace,"selectstart",function(e){bn(n,e)||Ne(e)}),we(o,"compositionstart",function(){var e=i.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}}),we(o,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Dl.prototype.createField=function(e){this.wrapper=Ll(),this.textarea=this.wrapper.firstChild},Dl.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},Dl.prototype.prepareSelection=function(){var e,t,n,r=this.cm,i=r.display,o=r.doc,l=cr(r);return r.options.moveInputWithCursor&&(e=Vn(r,o.sel.primary().head,"div"),t=i.wrapper.getBoundingClientRect(),n=i.lineDiv.getBoundingClientRect(),l.teTop=Math.max(0,Math.min(i.wrapper.clientHeight-10,e.top+n.top-t.top)),l.teLeft=Math.max(0,Math.min(i.wrapper.clientWidth-10,e.left+n.left-t.left))),l},Dl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Dl.prototype.reset=function(e){var t,n;this.contextMenuPending||this.composing||((t=this.cm).somethingSelected()?(this.prevInput="",n=t.getSelection(),this.textarea.value=n,t.state.focused&&P(this.textarea),x&&9<=C&&(this.hasSelection=n)):e||(this.prevInput=this.textarea.value="",x&&9<=C&&(this.hasSelection=null)))},Dl.prototype.getField=function(){return this.textarea},Dl.prototype.supportsTouch=function(){return!1},Dl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!d||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Dl.prototype.blur=function(){this.textarea.blur()},Dl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Dl.prototype.receivedFocus=function(){this.slowPoll()},Dl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Dl.prototype.fastPoll=function(){var t=!1,n=this;n.pollingFast=!0,n.polling.set(20,function e(){n.poll()||t?(n.pollingFast=!1,n.slowPoll()):(t=!0,n.polling.set(60,e))})},Dl.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||ze(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(x&&9<=C&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,s=Math.min(r.length,i.length);l<s&&r.charCodeAt(l)==i.charCodeAt(l);)++l;return Br(t,function(){bl(t,i.slice(l),r.length-l,null,e.composing?"*compose":null),1e3<i.length||-1<i.indexOf("\n")?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Dl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Dl.prototype.onKeyPress=function(){x&&9<=C&&(this.hasSelection=null),this.fastPoll()},Dl.prototype.onContextMenu=function(e){var n=this,r=n.cm,i=r.display,o=n.textarea;n.contextMenuPending&&n.contextMenuPending();var l,s,t,a,u,c=nr(r,e),h=i.scroller.scrollTop;function d(){var e,t;null!=o.selectionStart&&(t="​"+((e=r.somethingSelected())?o.value:""),o.value="⇚",o.value=t,n.prevInput=e?"":"​",o.selectionStart=1,o.selectionEnd=t.length,i.selForContextMenu=r.doc.sel)}function f(){var e,t;n.contextMenuPending==f&&(n.contextMenuPending=!1,n.wrapper.style.cssText=s,o.style.cssText=l,x&&C<9&&i.scrollbars.setScrollTop(i.scroller.scrollTop=h),null!=o.selectionStart&&((!x||x&&C<9)&&d(),e=0,t=function(){i.selForContextMenu==r.doc.sel&&0==o.selectionStart&&0<o.selectionEnd&&"​"==n.prevInput?Gr(r,_i)(r):e++<10?i.detectingSelectAll=setTimeout(t,500):(i.selForContextMenu=null,i.input.reset())},i.detectingSelectAll=setTimeout(t,200)))}c&&!m&&(r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(c)&&Gr(r,Bi)(r.doc,di(c),V),l=o.style.cssText,s=n.wrapper.style.cssText,t=n.wrapper.offsetParent.getBoundingClientRect(),n.wrapper.style.cssText="position: static",o.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-t.top-5)+"px; left: "+(e.clientX-t.left-5)+"px;\n z-index: 1000; background: "+(x?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",v&&(a=window.scrollY),i.input.focus(),v&&window.scrollTo(null,a),i.input.reset(),r.somethingSelected()||(o.value=n.prevInput=" "),n.contextMenuPending=f,i.selForContextMenu=r.doc.sel,clearTimeout(i.detectingSelectAll),x&&9<=C&&d(),S?(De(e),u=function(){Ce(window,"mouseup",u),setTimeout(f,20)},we(window,"mouseup",u)):setTimeout(f,50))},Dl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e,this.textarea.readOnly=!!e},Dl.prototype.setUneditable=function(){},Dl.prototype.needsContentAttribute=!1,Hl=(Wl=pl).optionHandlers,Wl.defineOption=Il,Wl.Init=ul,Il("value","",function(e,t){return e.setValue(t)},!0),Il("mode",null,function(e,t){e.doc.modeOption=t,vi(e)},!0),Il("indentUnit",2,vi,!0),Il("indentWithTabs",!1),Il("smartIndent",!0),Il("tabSize",4,function(e){yi(e),En(e),ir(e)},!0),Il("lineSeparator",null,function(e,r){if(e.doc.lineSep=r){var i=[],o=e.doc.first;e.doc.iter(function(e){for(var t=0;;){var n=e.text.indexOf(r,t);if(-1==n)break;t=n+r.length,i.push(lt(o,n))}o++});for(var t=i.length-1;0<=t;t--)to(e.doc,r,i[t],lt(i[t].line,i[t].ch+r.length))}}),Il("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=ul&&e.refresh()}),Il("specialCharPlaceholder",en,function(e){return e.refresh()},!0),Il("electricChars",!0),Il("inputStyle",d?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Il("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),Il("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),Il("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),Il("rtlMoveVisually",!p),Il("wholeLineUpdateBefore",!0),Il("theme","default",function(e){al(e),ni(e)},!0),Il("keyMap","default",function(e,t,n){var r=Eo(t),i=n!=ul&&Eo(n);i&&i.detach&&i.detach(e,r),r.attach&&r.attach(e,i||null)}),Il("extraKeys",null),Il("configureMouse",null),Il("lineWrapping",!1,fl,!0),Il("gutters",[],function(e,t){e.display.gutterSpecs=ei(t,e.options.lineNumbers),ni(e)},!0),Il("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?Jn(e.display)+"px":"0",e.refresh()},!0),Il("coverGutterNextToScrollbar",!1,function(e){return Hr(e)},!0),Il("scrollbarStyle","native",function(e){Er(e),Hr(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),Il("lineNumbers",!1,function(e,t){e.display.gutterSpecs=ei(e.options.gutters,t),ni(e)},!0),Il("firstLineNumber",1,ni,!0),Il("lineNumberFormatter",function(e){return e},ni,!0),Il("showCursorWhenSelecting",!1,ur,!0),Il("resetSelectionOnContextMenu",!0),Il("lineWiseCopyCut",!0),Il("pasteLinesPerSelection",!0),Il("selectionsMayTouch",!1),Il("readOnly",!1,function(e,t){"nocursor"==t&&(vr(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),Il("screenReaderLabel",null,function(e,t){t=""===t?null:t,e.display.input.screenReaderLabelChanged(t)}),Il("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),Il("dragDrop",!0,dl),Il("allowDropFileTypes",null),Il("cursorBlinkRate",530),Il("cursorScrollMargin",0),Il("cursorHeight",1,ur,!0),Il("singleCursorHeightPerLine",!0,ur,!0),Il("workTime",100),Il("workDelay",100),Il("flattenSpans",!0,yi,!0),Il("addModeClass",!1,yi,!0),Il("pollInterval",100),Il("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),Il("historyEventDelay",1250),Il("viewportMargin",10,function(e){return e.refresh()},!0),Il("maxHighlightLength",1e4,yi,!0),Il("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),Il("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),Il("autofocus",null),Il("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),Il("phrases",null),Pl=(Fl=pl).optionHandlers,El=Fl.helpers={},Fl.prototype={constructor:Fl,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var n=this.options,r=n[e];n[e]==t&&"mode"!=e||(n[e]=t,Pl.hasOwnProperty(e)&&Gr(this,Pl[e])(this,t,r),Se(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Eo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;n<t.length;++n)if(t[n]==e||t[n].name==e)return t.splice(n,1),!0},addOverlay:Ur(function(e,t){var n=e.token?e:Fl.getMode(this.options,e);if(n.startState)throw new Error("Overlays may not be stateful.");!function(e,t,n){for(var r=0,i=n(t);r<e.length&&n(e[r])<=i;)r++;e.splice(r,0,t)}(this.state.overlays,{mode:n,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,ir(this)}),removeOverlay:Ur(function(e){for(var t=this.state.overlays,n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||"string"==typeof e&&r.name==e)return t.splice(n,1),this.state.modeGen++,void ir(this)}}),indentLine:Ur(function(e,t,n){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),it(this.doc,e)&&ml(this,e,t,n)}),indentSelection:Ur(function(e){for(var t=this.doc.sel.ranges,n=-1,r=0;r<t.length;r++){var i=t[r];if(i.empty())i.head.line>n&&(ml(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Sr(this));else{for(var o=i.from(),l=i.to(),s=Math.max(n,o.line),n=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1,a=s;a<n;++a)ml(this,a,e);var u=this.doc.sel.ranges;0==o.ch&&t.length==u.length&&0<u[r].from().ch&&Ii(this.doc,r,new ci(o,u[r].to()),V)}}}),getTokenAt:function(e,t){return Lt(this,e,t)},getLineTokens:function(e,t){return Lt(this,lt(e),t,!0)},getTokenTypeAt:function(e){e=ft(this.doc,e);var t,n=yt(this,Qe(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var l=r+i>>1;if((l?n[2*l-1]:0)>=o)i=l;else{if(!(n[2*l+1]<o)){t=n[2*l+2];break}r=1+l}}var s=t?t.indexOf("overlay "):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Fl.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!El.hasOwnProperty(t))return n;var r=El[t],i=this.getModeAt(e);if("string"==typeof i[t])r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=r[i[t][o]];l&&n.push(l)}else i.helperType&&r[i.helperType]?n.push(r[i.helperType]):r[i.name]&&n.push(r[i.name]);for(var s=0;s<r._global.length;s++){var a=r._global[s];a.pred(i,this)&&-1==B(n,a.val)&&n.push(a.val)}return n},getStateAfter:function(e,t){var n=this.doc;return bt(this,(e=dt(n,null==e?n.first+n.size-1:e))+1,t).state},cursorCoords:function(e,t){var n=this.doc.sel.primary(),r=null==e?n.head:"object"==typeof e?ft(this.doc,e):e?n.from():n.to();return Vn(this,r,t||"page")},charCoords:function(e,t){return Un(this,ft(this.doc,e),t||"page")},coordsChar:function(e,t){return Xn(this,(e=Gn(this,e,t||"page")).left,e.top)},lineAtHeight:function(e,t){return e=Gn(this,{top:e,left:0},t||"page").top,rt(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,n){var r,i=!1,o="number"==typeof e?(r=this.doc.first+this.doc.size-1,e<this.doc.first?e=this.doc.first:r<e&&(e=r,i=!0),Qe(this.doc,e)):e;return Bn(this,o,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-Xt(o):0)},defaultTextHeight:function(){return qn(this.display)},defaultCharWidth:function(){return Zn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o,l,s,a,u,c=this.display,h=(e=Vn(this,ft(this.doc,e))).bottom,d=e.left;t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),c.sizer.appendChild(t),"over"==r?h=e.top:"above"!=r&&"near"!=r||(o=Math.max(c.wrapper.clientHeight,this.doc.height),l=Math.max(c.sizer.clientWidth,c.lineSpace.clientWidth),("above"==r||e.bottom+t.offsetHeight>o)&&e.top>t.offsetHeight?h=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=o&&(h=e.bottom),d+t.offsetWidth>l&&(d=l-t.offsetWidth)),t.style.top=h+"px",t.style.left=t.style.right="","right"==i?(d=c.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?d=0:"middle"==i&&(d=(c.sizer.clientWidth-t.offsetWidth)/2),t.style.left=d+"px"),n&&(s=this,a={left:d,top:h,right:d+t.offsetWidth,bottom:h+t.offsetHeight},null!=(u=xr(s,a)).scrollTop&&Mr(s,u.scrollTop),null!=u.scrollLeft&&Ar(s,u.scrollLeft))},triggerOnKeyDown:Ur(Zo),triggerOnKeyPress:Ur(Jo),triggerOnKeyUp:Qo,triggerOnMouseDown:Ur(rl),execCommand:function(e){if(Uo.hasOwnProperty(e))return Uo[e].call(null,this)},triggerElectric:Ur(function(e){xl(this,e)}),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=ft(this.doc,e),l=0;l<t&&!(o=kl(this.doc,o,i,n,r)).hitSide;++l);return o},moveH:Ur(function(t,n){var r=this;this.extendSelectionsBy(function(e){return r.display.shift||r.doc.extend||e.empty()?kl(r.doc,e.head,t,n,r.options.rtlMoveVisually):t<0?e.from():e.to()},j)}),deleteH:Ur(function(n,r){var e=this.doc.sel,i=this.doc;e.somethingSelected()?i.replaceSelection("",null,"+delete"):Io(this,function(e){var t=kl(i,e.head,n,r,!1);return n<0?{from:t,to:e.head}:{from:e.head,to:t}})}),findPosV:function(e,t,n,r){var i=1,o=r;t<0&&(i=-1,t=-t);for(var l=ft(this.doc,e),s=0;s<t;++s){var a=Vn(this,l,"div");if(null==o?o=a.left:a.left=o,(l=Tl(this,a,i,n)).hitSide)break}return l},moveV:Ur(function(r,i){var o=this,l=this.doc,s=[],a=!this.display.shift&&!l.extend&&l.sel.somethingSelected();if(l.extendSelectionsBy(function(e){if(a)return r<0?e.from():e.to();var t=Vn(o,e.head,"div");null!=e.goalColumn&&(t.left=e.goalColumn),s.push(t.left);var n=Tl(o,t,r,i);return"page"==i&&e==l.sel.primary()&&Cr(o,Un(o,n,"div").top-t.top),n},j),s.length)for(var e=0;e<l.sel.ranges.length;e++)l.sel.ranges[e].goalColumn=s[e]}),findWordAt:function(e){var t=Qe(this.doc,e.line).text,n=e.ch,r=e.ch;if(t){var i=this.getHelper(e,"wordChars");"before"!=e.sticky&&r!=t.length||!n?++r:--n;for(var o=t.charAt(n),l=te(o,i)?function(e){return te(e,i)}:/\s/.test(o)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!te(e)};0<n&&l(t.charAt(n-1));)--n;for(;r<t.length&&l(t.charAt(r));)++r}return new ci(lt(e.line,n),lt(e.line,r))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||(((this.state.overwrite=!this.state.overwrite)?H:T)(this.display.cursorDiv,"CodeMirror-overwrite"),Se(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Ur(function(e,t){Lr(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Sn(this)-this.display.barHeight,width:e.scrollWidth-Sn(this)-this.display.barWidth,clientHeight:kn(this),clientWidth:Ln(this)}},scrollIntoView:Ur(function(e,t){var n,r;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:lt(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(r=e,kr(n=this),n.curOp.scrollToPos=r):Tr(this,e.from,e.to,e.margin)}),setSize:Ur(function(e,t){function n(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e}var r=this;null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&Pn(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){or(r,i,"widget");break}++i}),this.curOp.forceUpdate=!0,Se(this,"refresh",this)}),operation:function(e){return Br(this,e)},startOperation:function(){return Rr(this)},endOperation:function(){return zr(this)},refresh:Ur(function(){var e=this.display.cachedTextHeight;ir(this),this.curOp.forceUpdate=!0,En(this),Lr(this,this.doc.scrollLeft,this.doc.scrollTop),qr(this.display),(null==e||.5<Math.abs(e-qn(this.display))||this.options.lineWrapping)&&tr(this),Se(this,"refresh",this)}),swapDoc:Ur(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Ci(this,e),En(this),this.display.input.reset(),Lr(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,un(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Me(Fl),Fl.registerHelper=function(e,t,n){El.hasOwnProperty(e)||(El[e]=Fl[e]={_global:[]}),El[e][t]=n},Fl.registerGlobalHelper=function(e,t,n,r){Fl.registerHelper(e,t,r),El[e]._global.push({pred:n,val:r})};var Rl,zl="iter insert remove copy getEditor constructor".split(" ");for(var Bl in vo.prototype)vo.prototype.hasOwnProperty(Bl)&&B(zl,Bl)<0&&(pl.prototype[Bl]=function(e){return function(){return e.apply(this.doc,arguments)}}(vo.prototype[Bl]));return Me(vo),pl.inputStyles={textarea:Dl,contenteditable:Ml},pl.defineMode=function(e){pl.defaults.mode||"null"==e||(pl.defaults.mode=e),function(e,t){2<arguments.length&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ue[e]=t}.apply(this,arguments)},pl.defineMIME=function(e,t){Ve[e]=t},pl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),pl.defineMIME("text/plain","null"),pl.defineExtension=function(e,t){pl.prototype[e]=t},pl.defineDocExtension=function(e,t){vo.prototype[e]=t},pl.fromTextArea=function(t,n){var e;function r(){t.value=s.getValue()}if((n=n?I(n):{}).value=t.value,!n.tabindex&&t.tabIndex&&(n.tabindex=t.tabIndex),!n.placeholder&&t.placeholder&&(n.placeholder=t.placeholder),null==n.autofocus&&(e=W(),n.autofocus=e==t||null!=t.getAttribute("autofocus")&&e==document.body),t.form&&(we(t.form,"submit",r),!n.leaveSubmitMethodAlone)){var i=t.form,o=i.submit;try{var l=i.submit=function(){r(),i.submit=o,i.submit(),i.submit=l}}catch(e){}}n.finishInit=function(e){e.save=r,e.getTextArea=function(){return t},e.toTextArea=function(){e.toTextArea=isNaN,r(),t.parentNode.removeChild(e.getWrapperElement()),t.style.display="",t.form&&(Ce(t.form,"submit",r),n.leaveSubmitMethodAlone||"function"!=typeof t.form.submit||(t.form.submit=o))}},t.style.display="none";var s=pl(function(e){return t.parentNode.insertBefore(e,t.nextSibling)},n);return s},(Rl=pl).off=Ce,Rl.on=we,Rl.wheelEventPixels=si,Rl.Doc=vo,Rl.splitLines=Re,Rl.countColumn=R,Rl.findColumn=X,Rl.isWordChar=ee,Rl.Pass=U,Rl.signal=Se,Rl.Line=$t,Rl.changeEnd=fi,Rl.scrollbarModel=Pr,Rl.Pos=lt,Rl.cmpPos=st,Rl.modes=Ue,Rl.mimeModes=Ve,Rl.resolveMode=Ke,Rl.getMode=je,Rl.modeExtensions=Xe,Rl.extendMode=Ye,Rl.copyState=_e,Rl.startState=qe,Rl.innerMode=$e,Rl.commands=Uo,Rl.keyMap=Ao,Rl.keyName=Po,Rl.isModifierKey=Ho,Rl.lookupKey=Wo,Rl.normalizeKeyMap=Do,Rl.StringStream=Ze,Rl.SharedTextMarker=po,Rl.TextMarker=ho,Rl.LineWidget=ao,Rl.e_preventDefault=Ne,Rl.e_stopPropagation=Ae,Rl.e_stop=De,Rl.addClass=H,Rl.contains=D,Rl.rmClass=T,Rl.keyNames=ko,pl.version="5.58.2",pl}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,g=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),r=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),i=/Edge\/(\d+)/.exec(e),L=n||r||i,x=L&&(n?document.documentMode||6:+(i||r)[1]),v=!i&&/WebKit\//.test(e),o=v&&/Qt\/\d+\.\d+/.test(e),l=!i&&/Chrome\//.test(e),m=/Opera\//.test(e),c=/Apple Computer/.test(navigator.vendor),s=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),u=/PhantomJS/.test(e),a=!i&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),h=/Android/.test(e),d=a||h||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=a||/Mac/.test(t),f=/\bCrOS\b/.test(e),p=/win/i.test(t),b=m&&e.match(/Version\/(\d*\.\d*)/);(b=b&&Number(b[1]))&&15<=b&&(v=!(m=!1));var w=y&&(o||m&&(null==b||b<12.11)),C=g||L&&9<=x;function S(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var n,r=e.className,i=S(t).exec(r);i&&(n=r.slice(i.index+i[0].length),e.className=r.slice(0,i.index)+(n?i[1]+n:""))};function M(e){for(var t=e.childNodes.length;0<t;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,n,r){var i=O(e,t,n,r);return i.setAttribute("role","presentation"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var t;try{t=document.activeElement}catch(e){t=document.body||null}for(;t&&t.shadowRoot&&t.shadowRoot.activeElement;)t=t.shadowRoot.activeElement;return t}function H(e,t){var n=e.className;S(t).test(n)||(e.className+=(n?" ":"")+t)}function F(e,t){for(var n=e.split(" "),r=0;r<n.length;r++)n[r]&&!S(n[r]).test(t)&&(t+=" "+n[r]);return t}k=document.createRange?function(e,t,n,r){var i=document.createRange();return i.setEnd(r||e,n),i.setStart(e,t),i}:function(e,t,n){var r=document.body.createTextRange();try{r.moveToElementText(e.parentNode)}catch(e){return r}return r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r};var E=function(e){e.select()};function P(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function I(e,t,n){for(var r in t=t||{},e)!e.hasOwnProperty(r)||!1===n&&t.hasOwnProperty(r)||(t[r]=e[r]);return t}function R(e,t,n,r,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=r||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||t<=s)return l+(t-o);l+=s-o,l+=n-l%n,o=s+1}}a?E=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:L&&(E=function(e){try{e.select()}catch(e){}});var z=function(){this.id=null,this.f=null,this.time=0,this.handler=P(this.onTimeout,this)};function B(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}z.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-new Date)},z.prototype.set=function(e,t){this.f=t;var n=+new Date+e;(!this.id||n<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,e),this.time=n)};var G=50,U={toString:function(){return"CodeMirror.Pass"}},V={scroll:!1},K={origin:"*mouse"},j={origin:"+move"};function X(e,t,n){for(var r=0,i=0;;){var o=e.indexOf("\t",r);-1==o&&(o=e.length);var l=o-r;if(o==e.length||t<=i+l)return r+Math.min(l,t-i);if(i+=o-r,r=o+1,t<=(i+=n-i%n))return r}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var n=[],r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function Z(){}function Q(e,t){var n=Object.create?Object.create(e):(Z.prototype=e,new Z);return t&&I(t,n),n}var J=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function ee(e){return/\w/.test(e)||"€"<e&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(-1<t.source.indexOf("\\w")&&ee(e))||t.test(e):ee(e)}function ne(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return;return 1}var re=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return 768<=e.charCodeAt(0)&&re.test(e)}function oe(e,t,n){for(;(n<0?0<t:t<e.length)&&ie(e.charAt(t));)t+=n;return t}function le(e,t,n){for(var r=n<t?-1:1;;){if(t==n)return t;var i=(t+n)/2,o=r<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+r}}var se=null;function ae(e,t,n){var r;se=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:se=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:se=i)}return null!=r?r:se}var ue,ce,he,de,fe,pe,ge,me=(ue="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",ce="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",he=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,de=/[stwN]/,fe=/[LRr]/,pe=/[Lb1n]/,ge=/[1n]/,function(e,t){var n="ltr"==t?"L":"R";if(0==e.length||"ltr"==t&&!he.test(e))return!1;for(var r,i=e.length,o=[],l=0;l<i;++l)o.push((r=e.charCodeAt(l))<=247?ue.charAt(r):1424<=r&&r<=1524?"R":1536<=r&&r<=1785?ce.charAt(r-1536):1774<=r&&r<=2220?"r":8192<=r&&r<=8203?"w":8204==r?"b":"L");for(var s=0,a=n;s<i;++s){var u=o[s];"m"==u?o[s]=a:a=u}for(var c=0,h=n;c<i;++c){var d=o[c];"1"==d&&"r"==h?o[c]="n":fe.test(d)&&"r"==(h=d)&&(o[c]="R")}for(var f=1,p=o[0];f<i-1;++f){var g=o[f];"+"==g&&"1"==p&&"1"==o[f+1]?o[f]="1":","!=g||p!=o[f+1]||"1"!=p&&"n"!=p||(o[f]=p),p=g}for(var m=0;m<i;++m){var v=o[m];if(","==v)o[m]="N";else if("%"==v){for(var y=void 0,y=m+1;y<i&&"%"==o[y];++y);for(var b=m&&"!"==o[m-1]||y<i&&"1"==o[y]?"1":"N",w=m;w<y;++w)o[w]=b;m=y-1}}for(var x=0,C=n;x<i;++x){var S=o[x];"L"==C&&"1"==S?o[x]="L":fe.test(S)&&(C=S)}for(var L=0;L<i;++L)if(de.test(o[L])){for(var k=void 0,k=L+1;k<i&&de.test(o[k]);++k);for(var T="L"==(L?o[L-1]:n),M=T==("L"==(k<i?o[k]:n))?T?"L":"R":n,N=L;N<k;++N)o[N]=M;L=k-1}for(var A,O=[],D=0;D<i;)if(pe.test(o[D])){var W=D;for(++D;D<i&&pe.test(o[D]);++D);O.push(new ve(0,W,D))}else{var H=D,F=O.length,E="rtl"==t?1:0;for(++D;D<i&&"L"!=o[D];++D);for(var P=H;P<D;)if(ge.test(o[P])){H<P&&(O.splice(F,0,new ve(1,H,P)),F+=E);var I=P;for(++P;P<D&&ge.test(o[P]);++P);O.splice(F,0,new ve(2,I,P)),F+=E,H=P}else++P;H<D&&O.splice(F,0,new ve(1,H,D))}return"ltr"==t&&(1==O[0].level&&(A=e.match(/^\s+/))&&(O[0].from=A[0].length,O.unshift(new ve(0,0,A[0].length))),1==$(O).level&&(A=e.match(/\s+$/))&&($(O).to-=A[0].length,O.push(new ve(0,i-A[0].length,i)))),"rtl"==t?O.reverse():O});function ve(e,t,n){this.level=e,this.from=t,this.to=n}function ye(e,t){var n=e.order;return null==n&&(n=e.order=me(e.text,t)),n}var be=[],we=function(e,t,n){var r;e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent?e.attachEvent("on"+t,n):(r=e._handlers||(e._handlers={}))[t]=(r[t]||be).concat(n)};function xe(e,t){return e._handlers&&e._handlers[t]||be}function Ce(e,t,n){var r,i,o;e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent?e.detachEvent("on"+t,n):!(i=(r=e._handlers)&&r[t])||-1<(o=B(i,n))&&(r[t]=i.slice(0,o).concat(i.slice(o+1)))}function Se(e,t){var n=xe(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i<n.length;++i)n[i].apply(null,r)}function Le(e,t,n){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),Se(e,n||t.type,e,t),Oe(t)||t.codemirrorIgnore}function ke(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var n=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),r=0;r<t.length;++r)-1==B(n,t[r])&&n.push(t[r])}function Te(e,t){return 0<xe(e,t).length}function Me(e){e.prototype.on=function(e,t){we(this,e,t)},e.prototype.off=function(e,t){Ce(this,e,t)}}function Ne(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Ae(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Oe(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function De(e){Ne(e),Ae(e)}function We(e){return e.target||e.srcElement}function He(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Fe,Ee,Pe=function(){if(L&&x<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();var Ie,Re=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(n.push(o.slice(0,l)),t+=l+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},ze=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Be="oncopy"in(Ie=O("div"))||(Ie.setAttribute("oncopy","return;"),"function"==typeof Ie.oncopy),Ge=null;var Ue={},Ve={};function Ke(e){if("string"==typeof e&&Ve.hasOwnProperty(e))e=Ve[e];else if(e&&"string"==typeof e.name&&Ve.hasOwnProperty(e.name)){var t=Ve[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ke("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ke("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function je(e,t){t=Ke(t);var n=Ue[t.name];if(!n)return je(e,"text/plain");var r=n(e,t);if(Xe.hasOwnProperty(t.name)){var i=Xe[t.name];for(var o in i)i.hasOwnProperty(o)&&(r.hasOwnProperty(o)&&(r["_"+o]=r[o]),r[o]=i[o])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var Xe={};function Ye(e,t){I(t,Xe.hasOwnProperty(e)?Xe[e]:Xe[e]={})}function _e(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function $e(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function qe(e,t,n){return!e.startState||e.startState(t,n)}var Ze=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};function Qe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t<o){n=i;break}t-=o}return n.lines[t]}function Je(e,n,r){var i=[],o=n.line;return e.iter(n.line,r.line+1,function(e){var t=e.text;o==r.line&&(t=t.slice(0,r.ch)),o==n.line&&(t=t.slice(n.ch)),i.push(t),++o}),i}function et(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function tt(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function nt(e){if(null==e.parent)return null;for(var t=e.parent,n=B(t.lines,e),r=t.parent;r;r=(t=r).parent)for(var i=0;r.children[i]!=t;++i)n+=r.children[i].chunkSize();return n+t.first}function rt(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],o=i.height;if(t<o){e=i;continue e}t-=o,n+=i.chunkSize()}return n}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return n+l}function it(e,t){return t>=e.first&&t<e.first+e.size}function ot(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function lt(e,t,n){if(void 0===n&&(n=null),!(this instanceof lt))return new lt(e,t,n);this.line=e,this.ch=t,this.sticky=n}function st(e,t){return e.line-t.line||e.ch-t.ch}function at(e,t){return e.sticky==t.sticky&&0==st(e,t)}function ut(e){return lt(e.line,e.ch)}function ct(e,t){return st(e,t)<0?t:e}function ht(e,t){return st(e,t)<0?e:t}function dt(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function ft(e,t){if(t.line<e.first)return lt(e.first,0);var n,r,i,o=e.first+e.size-1;return t.line>o?lt(o,Qe(e,o).text.length):(r=Qe(e,(n=t).line).text.length,null==(i=n.ch)||r<i?lt(n.line,r):i<0?lt(n.line,0):n)}function pt(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=ft(e,t[r]);return n}Ze.prototype.eol=function(){return this.pos>=this.string.length},Ze.prototype.sol=function(){return this.pos==this.lineStart},Ze.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Ze.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Ze.prototype.eat=function(e){var t=this.string.charAt(this.pos),n="string"==typeof e?t==e:t&&(e.test?e.test(t):e(t));if(n)return++this.pos,t},Ze.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Ze.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Ze.prototype.skipToEnd=function(){this.pos=this.string.length},Ze.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(-1<t)return this.pos=t,!0},Ze.prototype.backUp=function(e){this.pos-=e},Ze.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=R(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.indentation=function(){return R(this.string,null,this.tabSize)-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.match=function(e,t,n){if("string"!=typeof e){var r=this.string.slice(this.pos).match(e);return r&&0<r.index?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}function i(e){return n?e.toLowerCase():e}if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Ze.prototype.current=function(){return this.string.slice(this.start,this.pos)},Ze.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Ze.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Ze.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var gt=function(e,t){this.state=e,this.lookAhead=t},mt=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};function vt(t,n,r,e){var a=[t.state.modeGen],i={};Tt(t,n.text,t.doc.mode,r,function(e,t){return a.push(e,t)},i,e);for(var u=r.state,o=0;o<t.state.overlays.length;++o)!function(e){r.baseTokens=a;var o=t.state.overlays[e],l=1,s=0;r.state=!0,Tt(t,n.text,o.mode,r,function(e,t){for(var n=l;s<e;){var r=a[l];e<r&&a.splice(l,1,e,a[l+1],r),l+=2,s=Math.min(e,r)}if(t)if(o.opaque)a.splice(n,l-n,e,"overlay "+t),l=n+2;else for(;n<l;n+=2){var i=a[n+1];a[n+1]=(i?i+" ":"")+"overlay "+t}},i),r.state=u,r.baseTokens=null,r.baseTokenPos=1}(o);return{styles:a,classes:i.bgClass||i.textClass?i:null}}function yt(e,t,n){var r,i,o;return t.styles&&t.styles[0]==e.state.modeGen||(r=bt(e,nt(t)),i=t.text.length>e.options.maxHighlightLength&&_e(e.doc.mode,r.state),o=vt(e,t,r),i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))),t.styles}function bt(n,r,e){var t=n.doc,i=n.display;if(!t.mode.startState)return new mt(t,!0,r);var o=function(e,t,n){for(var r,i,o=e.doc,l=n?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;l<s;--s){if(s<=o.first)return o.first;var a=Qe(o,s-1),u=a.stateAfter;if(u&&(!n||s+(u instanceof gt?u.lookAhead:0)<=o.modeFrontier))return s;var c=R(a.text,null,e.options.tabSize);(null==i||c<r)&&(i=s-1,r=c)}return i}(n,r,e),l=o>t.first&&Qe(t,o-1).stateAfter,s=l?mt.fromSaved(t,l,o):new mt(t,qe(t.mode),o);return t.iter(o,r,function(e){wt(n,e.text,s);var t=s.line;e.stateAfter=t==r-1||t%5==0||t>=i.viewFrom&&t<i.viewTo?s.save():null,s.nextLine()}),e&&(t.modeFrontier=s.line),s}function wt(e,t,n,r){var i=e.doc.mode,o=new Ze(t,e.options.tabSize,n);for(o.start=o.pos=r||0,""==t&&xt(i,n.state);!o.eol();)Ct(i,o,n.state),o.start=o.pos}function xt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var n=$e(e,t);return n.mode.blankLine?n.mode.blankLine(n.state):void 0}}function Ct(e,t,n,r){for(var i=0;i<10;i++){r&&(r[0]=$e(e,n).mode);var o=e.token(t,n);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}mt.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},mt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},mt.prototype.nextLine=function(){this.line++,0<this.maxLookAhead&&this.maxLookAhead--},mt.fromSaved=function(e,t,n){return t instanceof gt?new mt(e,_e(e.mode,t.state),n,t.lookAhead):new mt(e,_e(e.mode,t),n)},mt.prototype.save=function(e){var t=!1!==e?_e(this.doc.mode,this.state):this.state;return 0<this.maxLookAhead?new gt(t,this.maxLookAhead):t};var St=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function Lt(e,t,n,r){var i,o,l=e.doc,s=l.mode,a=Qe(l,(t=ft(l,t)).line),u=bt(e,t.line,n),c=new Ze(a.text,e.options.tabSize,u);for(r&&(o=[]);(r||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Ct(s,c,u.state),r&&o.push(new St(c,i,_e(l.mode,u.state)));return r?o:new St(c,i,u.state)}function kt(e,t){if(e)for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";null==t[r]?t[r]=n[2]:new RegExp("(?:^|\\s)"+n[2]+"(?:$|\\s)").test(t[r])||(t[r]+=" "+n[2])}return e}function Tt(e,t,n,r,i,o,l){var s=n.flattenSpans;null==s&&(s=e.options.flattenSpans);var a=0,u=null,c=new Ze(t,e.options.tabSize,r),h=e.options.addModeClass&&[null];for(""==t&&kt(xt(n,r.state),o);!c.eol();){var d,f=c.pos>e.options.maxHighlightLength?(s=!1,l&&wt(e,t,r,c.pos),c.pos=t.length,null):kt(Ct(n,c,r.state,h),o);if(!h||(d=h[0].name)&&(f="m-"+(f?d+" "+f:d)),!s||u!=f){for(;a<c.start;)i(a=Math.min(c.start,a+5e3),u);u=f}c.start=c.pos}for(;a<c.pos;){var p=Math.min(c.pos,a+5e3);i(p,u),a=p}}var Mt=!1,Nt=!1;function At(e,t,n){this.marker=e,this.from=t,this.to=n}function Ot(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function Dt(e,t){if(t.full)return null;var n=it(e,t.from.line)&&Qe(e,t.from.line).markedSpans,r=it(e,t.to.line)&&Qe(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,o=t.to.ch,l=0==st(t.from,t.to),s=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t))&&(l.from!=t||"bookmark"!=s.type||n&&l.marker.insertLeft)||(o=null==l.to||(s.inclusiveRight?l.to>=t:l.to>t),(r=r||[]).push(new At(s,l.from,o?null:l.to)))}return r}(n,i,l),a=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.to||(s.inclusiveRight?l.to>=t:l.to>t))&&(l.from!=t||"bookmark"!=s.type||n&&!l.marker.insertLeft)||(o=null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t),(r=r||[]).push(new At(s,o?null:l.from-t,null==l.to?null:l.to-t)))}return r}(r,o,l),u=1==t.text.length,c=$(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var d,f=s[h];null==f.to&&((d=Ot(a,f.marker))?u&&(f.to=null==d.to?null:d.to+c):f.to=i)}if(a)for(var p=0;p<a.length;++p){var g=a[p];null!=g.to&&(g.to+=c),null==g.from?Ot(s,g.marker)||(g.from=c,u&&(s=s||[]).push(g)):(g.from+=c,u&&(s=s||[]).push(g))}s=s&&Wt(s),a&&a!=s&&(a=Wt(a));var m=[s];if(!u){var v,y=t.text.length-2;if(0<y&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(v=v||[]).push(new At(s[b].marker,null,null));for(var w=0;w<y;++w)m.push(v);m.push(a)}return m}function Wt(e){for(var t=0;t<e.length;++t){var n=e[t];null!=n.from&&n.from==n.to&&!1!==n.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function Ht(e){var t=e.markedSpans;if(t){for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}}function Ft(e,t){if(t){for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}}function Et(e){return e.inclusiveLeft?-1:0}function Pt(e){return e.inclusiveRight?1:0}function It(e,t){var n=e.lines.length-t.lines.length;if(0!=n)return n;var r=e.find(),i=t.find(),o=st(r.from,i.from)||Et(e)-Et(t);if(o)return-o;var l=st(r.to,i.to)||Pt(e)-Pt(t);return l||t.id-e.id}function Rt(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=void 0,o=0;o<r.length;++o)(i=r[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!n||It(n,i.marker)<0)&&(n=i.marker);return n}function zt(e){return Rt(e,!0)}function Bt(e){return Rt(e,!1)}function Gt(e,t,n,r,i){var o=Qe(e,t),l=Nt&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=st(u.from,n)||Et(a.marker)-Et(i),h=st(u.to,r)||Pt(a.marker)-Pt(i);if(!(0<=c&&h<=0||c<=0&&0<=h)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?0<=st(u.to,n):0<st(u.to,n))||0<=c&&(a.marker.inclusiveRight&&i.inclusiveLeft?st(u.from,r)<=0:st(u.from,r)<0)))return 1}}}function Ut(e){for(var t;t=zt(e);)e=t.find(-1,!0).line;return e}function Vt(e,t){var n=Qe(e,t),r=Ut(n);return n==r?t:nt(r)}function Kt(e,t){if(t>e.lastLine())return t;var n,r=Qe(e,t);if(!jt(e,r))return t;for(;n=Bt(r);)r=n.find(1,!0).line;return nt(r)+1}function jt(e,t){var n=Nt&&t.markedSpans;if(n)for(var r=void 0,i=0;i<n.length;++i)if((r=n[i]).marker.collapsed){if(null==r.from)return!0;if(!r.marker.widgetNode&&0==r.from&&r.marker.inclusiveLeft&&function e(t,n,r){if(null==r.to){var i=r.marker.find(1,!0);return e(t,i.line,Ot(i.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==n.text.length)return!0;for(var o=void 0,l=0;l<n.markedSpans.length;++l)if((o=n.markedSpans[l]).marker.collapsed&&!o.marker.widgetNode&&o.from==r.to&&(null==o.to||o.to!=r.from)&&(o.marker.inclusiveLeft||r.marker.inclusiveRight)&&e(t,n,o))return!0}(e,t,r))return!0}}function Xt(e){for(var t=0,n=(e=Ut(e)).parent,r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var o=n.parent;o;o=(n=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==n)break;t+=s.height}return t}function Yt(e){if(0==e.height)return 0;for(var t,n=e.text.length,r=e;t=zt(r);){var i=t.find(0,!0),r=i.from.line;n+=i.from.ch-i.to.ch}for(r=e;t=Bt(r);){var o=t.find(0,!0);n-=r.text.length-o.from.ch,n+=(r=o.to.line).text.length-o.to.ch}return n}function _t(e){var n=e.display,t=e.doc;n.maxLine=Qe(t,t.first),n.maxLineLength=Yt(n.maxLine),n.maxLineChanged=!0,t.iter(function(e){var t=Yt(e);t>n.maxLineLength&&(n.maxLineLength=t,n.maxLine=e)})}var $t=function(e,t,n){this.text=e,Ft(this,t),this.height=n?n(this):1};$t.prototype.lineNo=function(){return nt(this)},Me($t);var qt={},Zt={};function Qt(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?Zt:qt;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function Jt(e,t){var n=A("span",null,null,v?"padding-right: .1px":null),r={pre:A("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i,o=0;o<=(t.rest?t.rest.length:0);o++){var l=o?t.rest[o-1]:t.line,s=void 0;r.pos=0,r.addToken=tn,function(e){if(null!=Ee)return Ee;var t=N(e,document.createTextNode("AخA")),n=k(t,0,1).getBoundingClientRect(),r=k(t,1,2).getBoundingClientRect();return M(e),n&&n.left!=n.right&&(Ee=r.right-n.right<3)}(e.display.measure)&&(s=ye(l,e.doc.direction))&&(r.addToken=function(h,d){return function(e,t,n,r,i,o,l){n=n?n+" cm-force-border":"cm-force-border";for(var s=e.pos,a=s+t.length;;){for(var u=void 0,c=0;c<d.length&&!((u=d[c]).to>s&&u.from<=s);c++);if(u.to>=a)return h(e,t,n,r,i,o,l);h(e,t.slice(0,u.to-s),n,r,null,o,l),r=null,t=t.slice(u.to-s),s=u.to}}}(r.addToken,s)),r.map=[],function(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(!r){for(var l=1;l<n.length;l+=2)t.addToken(t,i.slice(o,o=n[l]),Qt(n[l+1],t.cm.options));return}for(var s,a,u,c,h,d,f,p=i.length,g=0,m=1,v="",y=0;;){if(y==g){u=c=h=a="",d=f=null,y=1/0;for(var b=[],w=void 0,x=0;x<r.length;++x){var C=r[x],S=C.marker;if("bookmark"==S.type&&C.from==g&&S.widgetNode)b.push(S);else if(C.from<=g&&(null==C.to||C.to>g||S.collapsed&&C.to==g&&C.from==g)){if(null!=C.to&&C.to!=g&&y>C.to&&(y=C.to,c=""),S.className&&(u+=" "+S.className),S.css&&(a=(a?a+";":"")+S.css),S.startStyle&&C.from==g&&(h+=" "+S.startStyle),S.endStyle&&C.to==y&&(w=w||[]).push(S.endStyle,C.to),S.title&&((f=f||{}).title=S.title),S.attributes)for(var L in S.attributes)(f=f||{})[L]=S.attributes[L];S.collapsed&&(!d||It(d.marker,S)<0)&&(d=C)}else C.from>g&&y>C.from&&(y=C.from)}if(w)for(var k=0;k<w.length;k+=2)w[k+1]==y&&(c+=" "+w[k]);if(!d||d.from==g)for(var T=0;T<b.length;++T)nn(t,0,b[T]);if(d&&(d.from||0)==g){if(nn(t,(null==d.to?p+1:d.to)-g,d.marker,null==d.from),null==d.to)return;d.to==g&&(d=!1)}}if(p<=g)break;for(var M=Math.min(p,y);;){if(v){var N,A=g+v.length;if(d||(N=M<A?v.slice(0,M-g):v,t.addToken(t,N,s?s+u:u,h,g+N.length==y?c:"",a,f)),M<=A){v=v.slice(M-g),g=M;break}g=A,h=""}v=i.slice(o,o=n[m++]),s=Qt(n[m++],t.cm.options)}}}(l,r,yt(e,l,t!=e.display.externalMeasured&&nt(l))),l.styleClasses&&(l.styleClasses.bgClass&&(r.bgClass=F(l.styleClasses.bgClass,r.bgClass||"")),l.styleClasses.textClass&&(r.textClass=F(l.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(function(e){var t;null==Fe&&(t=O("span","​"),N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Fe=t.offsetWidth<=1&&2<t.offsetHeight&&!(L&&x<8)));var n=Fe?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}(e.display.measure))),0==o?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return v&&(i=r.content.lastChild,(/\bcm-tab\b/.test(i.className)||i.querySelector&&i.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")),Se(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=F(r.pre.className,r.textClass||"")),r}function en(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function tn(e,t,n,r,i,o,l){if(t){var s,a=e.splitSpaces?function(e,t){if(1<e.length&&!/ /.test(e))return e;for(var n=t,r="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!n||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),r+=o,n=" "==o}return r}(t,e.trailingSpace):t,u=e.cm.state.specialChars,c=!1;if(u.test(t)){s=document.createDocumentFragment();for(var h=0;;){u.lastIndex=h;var d,f=u.exec(t),p=f?f.index-h:t.length-h;if(p&&(d=document.createTextNode(a.slice(h,h+p)),L&&x<9?s.appendChild(O("span",[d])):s.appendChild(d),e.map.push(e.pos,e.pos+p,d),e.col+=p,e.pos+=p),!f)break;h+=1+p;var g,m,v=void 0;"\t"==f[0]?(m=(g=e.cm.options.tabSize)-e.col%g,(v=s.appendChild(O("span",_(m),"cm-tab"))).setAttribute("role","presentation"),v.setAttribute("cm-text","\t"),e.col+=m):("\r"==f[0]||"\n"==f[0]?(v=s.appendChild(O("span","\r"==f[0]?"␍":"␤","cm-invalidchar"))).setAttribute("cm-text",f[0]):((v=e.cm.options.specialCharPlaceholder(f[0])).setAttribute("cm-text",f[0]),L&&x<9?s.appendChild(O("span",[v])):s.appendChild(v)),e.col+=1),e.map.push(e.pos,e.pos+1,v),e.pos++}}else e.col+=t.length,s=document.createTextNode(a),e.map.push(e.pos,e.pos+t.length,s),L&&x<9&&(c=!0),e.pos+=t.length;if(e.trailingSpace=32==a.charCodeAt(t.length-1),n||r||i||c||o||l){var y=n||"";r&&(y+=r),i&&(y+=i);var b=O("span",[s],y,o);if(l)for(var w in l)l.hasOwnProperty(w)&&"style"!=w&&"class"!=w&&b.setAttribute(w,l[w]);return e.content.appendChild(b)}e.content.appendChild(s)}}function nn(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i=i||e.content.appendChild(document.createElement("span"))).setAttribute("cm-marker",n.id),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rn(e,t,n){this.line=t,this.rest=function(e){for(var t,n;t=Bt(e);)e=t.find(1,!0).line,(n=n||[]).push(e);return n}(t),this.size=this.rest?nt($(this.rest))-n+1:1,this.node=this.text=null,this.hidden=jt(e,t)}function on(e,t,n){for(var r=[],i=t;i<n;i=l){var o=new rn(e.doc,Qe(e.doc,i),i),l=i+o.size;r.push(o)}return r}var ln=null;function sn(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n<t.length;n++)t[n].call(null);for(var r=0;r<e.ops.length;r++){var i=e.ops[r];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(n<t.length)}(n)}finally{ln=null,t(n)}}var an=null;function un(e,t){var n=xe(e,t);if(n.length){var r,i=Array.prototype.slice.call(arguments,2);ln?r=ln.delayedCallbacks:an?r=an:(r=an=[],setTimeout(cn,0));for(var o=0;o<n.length;++o)!function(e){r.push(function(){return n[e].apply(null,i)})}(o)}}function cn(){var e=an;an=null;for(var t=0;t<e.length;++t)e[t]()}function hn(e,t,n,r){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?function(e,t){var n=t.text.className,r=fn(e,t);t.text==t.node&&(t.node=r.pre);t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,pn(e,t)):n&&(t.text.className=n)}(e,t):"gutter"==o?gn(e,t,n,r):"class"==o?pn(e,t):"widget"==o&&function(e,t,n){t.alignable&&(t.alignable=null);for(var r=S("CodeMirror-linewidget"),i=t.node.firstChild,o=void 0;i;i=o)o=i.nextSibling,r.test(i.className)&&t.node.removeChild(i);mn(e,t,n)}(e,t,r)}t.changes=null}function dn(e){return e.node==e.text&&(e.node=O("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),L&&x<8&&(e.node.style.zIndex=2)),e.node}function fn(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):Jt(e,t)}function pn(e,t){var n,r,i,o;n=e,(o=(r=t).bgClass?r.bgClass+" "+(r.line.bgClass||""):r.line.bgClass)&&(o+=" CodeMirror-linebackground"),r.background?o?r.background.className=o:(r.background.parentNode.removeChild(r.background),r.background=null):o&&(i=dn(r),r.background=i.insertBefore(O("div",null,o),i.firstChild),n.display.input.setUneditable(r.background)),t.line.wrapClass?dn(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var l=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=l||""}function gn(e,t,n,r){var i;t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass&&(i=dn(t),t.gutterBackground=O("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px; width: "+r.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text));var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=dn(t),s=t.gutter=O("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=" "+t.line.gutterClass),!e.options.lineNumbers||o&&o["CodeMirror-linenumbers"]||(t.lineNumber=s.appendChild(O("div",ot(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),o)for(var a=0;a<e.display.gutterSpecs.length;++a){var u=e.display.gutterSpecs[a].className,c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O("div",[c],"CodeMirror-gutter-elt","left: "+r.gutterLeft[u]+"px; width: "+r.gutterWidth[u]+"px"))}}}function mn(e,t,n){if(vn(e,t.line,t,n,!0),t.rest)for(var r=0;r<t.rest.length;r++)vn(e,t.rest[r],t,n,!1)}function vn(e,t,n,r,i){if(t.widgets)for(var o=dn(n),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O("div",[a.node],"CodeMirror-linewidget"+(a.className?" "+a.className:""));a.handleMouseEvents||u.setAttribute("cm-ignore-events","true"),function(e,t,n,r){{var i;e.noHScroll&&((n.alignable||(n.alignable=[])).push(t),i=r.wrapperWidth,t.style.left=r.fixedPos+"px",e.coverGutter||(i-=r.gutterTotalWidth,t.style.paddingLeft=r.gutterTotalWidth+"px"),t.style.width=i+"px")}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-r.gutterTotalWidth+"px"))}(a,u,n,r),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,n.gutter||n.text):o.appendChild(u),un(a,"redraw")}}function yn(e){if(null!=e.height)return e.height;var t,n=e.doc.cm;return n?(D(document.body,e.node)||(t="position: relative;",e.coverGutter&&(t+="margin-left: -"+n.display.gutters.offsetWidth+"px;"),e.noHScroll&&(t+="width: "+n.display.wrapper.clientWidth+"px;"),N(n.display.measure,O("div",[e.node],null,t))),e.height=e.node.parentNode.offsetHeight):0}function bn(e,t){for(var n=We(t);n!=e.wrapper;n=n.parentNode)if(!n||1==n.nodeType&&"true"==n.getAttribute("cm-ignore-events")||n.parentNode==e.sizer&&n!=e.mover)return 1}function wn(e){return e.lineSpace.offsetTop}function xn(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Cn(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O("pre","x","CodeMirror-line-like")),n=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,r={left:parseInt(n.paddingLeft),right:parseInt(n.paddingRight)};return isNaN(r.left)||isNaN(r.right)||(e.cachedPaddingH=r),r}function Sn(e){return G-e.display.nativeBarWidth}function Ln(e){return e.display.scroller.clientWidth-Sn(e)-e.display.barWidth}function kn(e){return e.display.scroller.clientHeight-Sn(e)-e.display.barHeight}function Tn(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var i=0;i<e.rest.length;i++)if(nt(e.rest[i])>n)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Mn(e,t,n,r){return On(e,An(e,t),n,r)}function Nn(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[rr(e,t)];var n=e.display.externalMeasured;return n&&t>=n.lineN&&t<n.lineN+n.size?n:void 0}function An(e,t){var n=nt(t),r=Nn(e,n);r&&!r.text?r=null:r&&r.changes&&(hn(e,r,n,Qn(e)),e.curOp.forceUpdate=!0);var i=Tn(r=r||function(e,t){var n=nt(t=Ut(t)),r=e.display.externalMeasured=new rn(e.doc,t,n);r.lineN=n;var i=r.built=Jt(e,r);return r.text=i.pre,N(e.display.lineMeasure,i.pre),r}(e,t),t,n);return{line:t,view:r,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function On(e,t,n,r,i){t.before&&(n=-1);var o,l=n+(r||"");return t.cache.hasOwnProperty(l)?o=t.cache[l]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(function(e,t,n){var r=e.options.lineWrapping,i=r&&Ln(e);if(!t.measure.heights||r&&t.measure.width!=i){var o=t.measure.heights=[];if(r){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];2<Math.abs(a.bottom-u.bottom)&&o.push((a.bottom+u.top)/2-n.top)}}o.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,n,r){var i,o,l=Hn(t.map,n,r),s=l.node,a=l.start,u=l.end,c=l.collapse;if(3==s.nodeType){for(var h=0;h<4;h++){for(;a&&ie(t.line.text.charAt(l.coverStart+a));)--a;for(;l.coverStart+u<l.coverEnd&&ie(t.line.text.charAt(l.coverStart+u));)++u;if((i=L&&x<9&&0==a&&u==l.coverEnd-l.coverStart?s.parentNode.getBoundingClientRect():function(e,t){var n=Wn;if("left"==t)for(var r=0;r<e.length&&(n=e[r]).left==n.right;r++);else for(var i=e.length-1;0<=i&&(n=e[i]).left==n.right;i--);return n}(k(s,a,u).getClientRects(),r)).left||i.right||0==a)break;u=a,--a,c="right"}L&&x<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ge)return Ge;var t=N(e,O("span","x")),n=t.getBoundingClientRect(),r=k(t,0,1).getBoundingClientRect();return Ge=1<Math.abs(n.left-r.left)}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,r=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*r,bottom:t.bottom*r}}(e.display.measure,i))}else 0<a&&(c=r="right"),i=e.options.lineWrapping&&1<(o=s.getClientRects()).length?o["right"==r?o.length-1:0]:s.getBoundingClientRect();{var d;!(L&&x<9)||a||i&&(i.left||i.right)||(d=s.parentNode.getClientRects()[0],i=d?{left:d.left,right:d.left+Zn(e.display),top:d.top,bottom:d.bottom}:Wn)}for(var f=i.top-t.rect.top,p=i.bottom-t.rect.top,g=(f+p)/2,m=t.view.measure.heights,v=0;v<m.length-1&&!(g<m[v]);v++);var y=v?m[v-1]:0,b=m[v],w={left:("right"==c?i.right:i.left)-t.rect.left,right:("left"==c?i.left:i.right)-t.rect.left,top:y,bottom:b};i.left||i.right||(w.bogus=!0);e.options.singleCursorHeightPerLine||(w.rtop=f,w.rbottom=p);return w}(e,t,n,r)).bogus||(t.cache[l]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Dn,Wn={left:0,right:0,top:0,bottom:0};function Hn(e,t,n){for(var r,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,a<=t&&(l="right")),null!=i){if(r=e[u+2],s==a&&n==(r.insertLeft?"left":"right")&&(l=n),"left"==n&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)r=e[2+(u-=3)],l="left";if("right"==n&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)r=e[(u+=3)+2],l="right";break}return{node:r,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Fn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function En(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fn(e.display.view[t])}function Pn(e){En(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function In(){return l&&h?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Rn(){return l&&h?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function zn(e){var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;++n)e.widgets[n].above&&(t+=yn(e.widgets[n]));return t}function Bn(e,t,n,r,i){var o;if(i||(o=zn(t),n.top+=o,n.bottom+=o),"line"==r)return n;r=r||"local";var l,s,a=Xt(t);return"local"==r?a+=wn(e.display):a-=e.display.viewOffset,"page"!=r&&"window"!=r||(a+=(l=e.display.lineSpace.getBoundingClientRect()).top+("window"==r?0:Rn()),s=l.left+("window"==r?0:In()),n.left+=s,n.right+=s),n.top+=a,n.bottom+=a,n}function Gn(e,t,n){if("div"==n)return t;var r,i=t.left,o=t.top;"page"==n?(i-=In(),o-=Rn()):"local"!=n&&n||(i+=(r=e.display.sizer.getBoundingClientRect()).left,o+=r.top);var l=e.display.lineSpace.getBoundingClientRect();return{left:i-l.left,top:o-l.top}}function Un(e,t,n,r,i){return Bn(e,r=r||Qe(e.doc,t.line),Mn(e,r,t.ch,i),n)}function Vn(r,e,i,o,l,s){function a(e,t){var n=On(r,l,e,t?"right":"left",s);return t?n.left=n.right:n.right=n.left,Bn(r,o,n,i)}o=o||Qe(r.doc,e.line),l=l||An(r,o);var u=ye(o,r.doc.direction),t=e.ch,n=e.sticky;if(t>=o.text.length?(t=o.text.length,n="before"):t<=0&&(t=0,n="after"),!u)return a("before"==n?t-1:t,"before"==n);function c(e,t,n){return a(n?e-1:e,1==u[t].level!=n)}var h=ae(u,t,n),d=se,f=c(t,h,"before"==n);return null!=d&&(f.other=c(t,d,"before"!=n)),f}function Kn(e,t){var n=0;t=ft(e.doc,t),e.options.lineWrapping||(n=Zn(e.display)*t.ch);var r=Qe(e.doc,t.line),i=Xt(r)+wn(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function jn(e,t,n,r,i){var o=lt(e,t,n);return o.xRel=i,r&&(o.outside=r),o}function Xn(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return jn(r.first,0,null,-1,-1);var i=rt(r,n),o=r.first+r.size-1;if(o<i)return jn(r.first+r.size-1,Qe(r,o).text.length,null,1,1);t<0&&(t=0);for(var l=Qe(r,i);;){var s=function(n,e,t,r,i){i-=Xt(e);var o=An(n,e),l=zn(e),s=0,a=e.text.length,u=!0,c=ye(e,n.doc.direction);{var h;c&&(h=(n.options.lineWrapping?function(e,t,n,r,i,o,l){var s=Yn(e,t,r,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,d=0;d<i.length;d++){var f,p,g,m=i[d];m.from>=u||m.to<=a||(f=1!=m.level,p=On(e,r,f?Math.min(u,m.to)-1:Math.max(a,m.from)).right,g=p<o?o-p+1e9:p-o,(!c||g<h)&&(c=m,h=g))}c=c||i[i.length-1];c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(r,i,o,l,s,a,u){var e=le(function(e){var t=s[e],n=1!=t.level;return $n(Vn(r,lt(o,n?t.to:t.from,n?"before":"after"),"line",i,l),a,u,!0)},0,s.length-1),t=s[e];{var n,c;0<e&&(n=1!=t.level,$n(c=Vn(r,lt(o,n?t.from:t.to,n?"after":"before"),"line",i,l),a,u,!0)&&c.top>u&&(t=s[e-1]))}return t})(n,e,t,o,c,r,i),u=1!=h.level,s=u?h.from:h.to-1,a=u?h.to:h.from-1)}var d,f,p=null,g=null,m=le(function(e){var t=On(n,o,e);return t.top+=l,t.bottom+=l,$n(t,r,i,!1)&&(t.top<=i&&t.left<=r&&(p=e,g=t),1)},s,a),v=!1;{var y,b,w;g?(y=r-g.left<g.right-r,m=p+((b=y==u)?0:1),f=b?"after":"before",d=y?g.left:g.right):(u||m!=a&&m!=s||m++,f=0==m||m!=e.text.length&&On(n,o,m-(u?1:0)).bottom+l<=i==u?"after":"before",w=Vn(n,lt(t,m,f),"line",e,o),d=w.left,v=i<w.top?-1:i>=w.bottom?1:0)}return m=oe(e.text,m,1),jn(t,m,f,v,r-d)}(e,l,i,t,n),a=function(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=0;i<r.length;++i){var o=r[i];o.marker.collapsed&&(null==o.from||o.from<t)&&(null==o.to||o.to>t)&&(!n||It(n,o.marker)<0)&&(n=o.marker)}return n}(l,s.ch+(0<s.xRel||0<s.outside?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Qe(r,i=u.line)}}function Yn(t,e,n,r){r-=zn(e);var i=e.text.length,o=le(function(e){return On(t,n,e-1).bottom<=r},i,0);return{begin:o,end:i=le(function(e){return On(t,n,e).top>r},o,i)}}function _n(e,t,n,r){return Yn(e,t,n=n||An(e,t),Bn(e,t,On(e,n,r),"line").top)}function $n(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function qn(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Dn){Dn=O("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Dn.appendChild(document.createTextNode("x")),Dn.appendChild(O("br"));Dn.appendChild(document.createTextNode("x"))}N(e.measure,Dn);var n=Dn.offsetHeight/50;return 3<n&&(e.cachedTextHeight=n),M(e.measure),n||1}function Zn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),n=O("pre",[t],"CodeMirror-line-like");N(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return 2<i&&(e.cachedCharWidth=i),i||10}function Qn(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;n[s]=o.offsetLeft+o.clientLeft+i,r[s]=o.clientWidth}return{fixedPos:Jn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function Jn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function er(r){var i=qn(r.display),o=r.options.lineWrapping,l=o&&Math.max(5,r.display.scroller.clientWidth/Zn(r.display)-3);return function(e){if(jt(r.doc,e))return 0;var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;n++)e.widgets[n].height&&(t+=e.widgets[n].height);return o?t+(Math.ceil(e.text.length/l)||1)*i:t+i}}function tr(e){var t=e.doc,n=er(e);t.iter(function(e){var t=n(e);t!=e.height&&tt(e,t)})}function nr(e,t,n,r){var i=e.display;if(!n&&"true"==We(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(e){return null}var a,u,c=Xn(e,o,l);return r&&0<c.xRel&&(a=Qe(e.doc,c.line).text).length==c.ch&&(u=R(a,a.length,e.options.tabSize)-a.length,c=lt(c.line,Math.max(0,Math.round((o-Cn(e.display).left)/Zn(e.display))-u))),c}function rr(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;r<n.length;r++)if((t-=n[r].size)<0)return r}function ir(e,t,n,r){null==t&&(t=e.doc.first),null==n&&(n=e.doc.first+e.doc.size),r=r||0;var i,o,l,s,a=e.display;r&&n<a.viewTo&&(null==a.updateLineNumbers||a.updateLineNumbers>t)&&(a.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=a.viewTo?Nt&&Vt(e.doc,t)<a.viewTo&&lr(e):n<=a.viewFrom?Nt&&Kt(e.doc,n+r)>a.viewFrom?lr(e):(a.viewFrom+=r,a.viewTo+=r):t<=a.viewFrom&&n>=a.viewTo?lr(e):t<=a.viewFrom?(i=sr(e,n,n+r,1))?(a.view=a.view.slice(i.index),a.viewFrom=i.lineN,a.viewTo+=r):lr(e):n>=a.viewTo?(o=sr(e,t,t,-1))?(a.view=a.view.slice(0,o.index),a.viewTo=o.lineN):lr(e):(l=sr(e,t,t,-1),s=sr(e,n,n+r,1),l&&s?(a.view=a.view.slice(0,l.index).concat(on(e,l.lineN,s.lineN)).concat(a.view.slice(s.index)),a.viewTo+=r):lr(e));var u=a.externalMeasured;u&&(n<u.lineN?u.lineN+=r:t<u.lineN+u.size&&(a.externalMeasured=null))}function or(e,t,n){e.curOp.viewChanged=!0;var r,i,o=e.display,l=e.display.externalMeasured;l&&t>=l.lineN&&t<l.lineN+l.size&&(o.externalMeasured=null),t<o.viewFrom||t>=o.viewTo||(null==(r=o.view[rr(e,t)]).node||-1==B(i=r.changes||(r.changes=[]),n)&&i.push(n))}function lr(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function sr(e,t,n,r){var i,o=rr(e,t),l=e.display.view;if(!Nt||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(0<r){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;Vt(e.doc,n)!=n;){if(o==(r<0?0:l.length-1))return null;n+=r*l[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function ar(e){for(var t=e.display.view,n=0,r=0;r<t.length;r++){var i=t[r];i.hidden||i.node&&!i.changes||++n}return n}function ur(e){e.display.input.showSelection(e.display.input.prepareSelection())}function cr(e,t){void 0===t&&(t=!0);for(var n,r,i=e.doc,o={},l=o.cursors=document.createDocumentFragment(),s=o.selection=document.createDocumentFragment(),a=0;a<i.sel.ranges.length;a++){!t&&a==i.sel.primIndex||((n=i.sel.ranges[a]).from().line>=e.display.viewTo||n.to().line<e.display.viewFrom||(((r=n.empty())||e.options.showCursorWhenSelecting)&&hr(e,n.head,l),r||function(l,e,t){var n=l.display,r=l.doc,i=document.createDocumentFragment(),o=Cn(l.display),T=o.left,M=Math.max(n.sizerWidth,Ln(l)-n.sizer.offsetLeft)-o.right,N="ltr"==r.direction;function A(e,t,n,r){t<0&&(t=0),t=Math.round(t),r=Math.round(r),i.appendChild(O("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n top: "+t+"px; width: "+(null==n?M-e:n)+"px;\n height: "+(r-t)+"px"))}function s(n,y,b){var w,x,o=Qe(r,n),C=o.text.length;function S(e,t){return Un(l,lt(n,e),"div",o,t)}function L(e,t,n){var r=_n(l,o,null,e),i="ltr"==t==("after"==n)?"left":"right";return S("after"==n?r.begin:r.end-(/\s/.test(o.text.charAt(r.end-1))?2:1),i)[i]}var k=ye(o,r.direction);return function(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<n&&l.to>t||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),1==l.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(k,y||0,null==b?C:b,function(e,t,n,r){var i,o,l,s,a,u,c,h="ltr"==n,d=S(e,h?"left":"right"),f=S(t-1,h?"right":"left"),p=null==y&&0==e,g=null==b&&t==C,m=0==r,v=!k||r==k.length-1;f.top-d.top<=3?(i=(N?g:p)&&v,o=(N?p:g)&&m?T:(h?d:f).left,l=i?M:(h?f:d).right,A(o,d.top,l-o,d.bottom)):(c=h?(s=N&&p&&m?T:d.left,a=N?M:L(e,n,"before"),u=N?T:L(t,n,"after"),N&&g&&v?M:f.right):(s=N?L(e,n,"before"):T,a=!N&&p&&m?M:d.right,u=!N&&g&&v?T:f.left,N?L(t,n,"after"):M),A(s,d.top,a-s,d.bottom),d.bottom<f.top&&A(T,d.bottom,null,f.top),A(u,f.top,c-u,f.bottom)),(!w||dr(d,w)<0)&&(w=d),dr(f,w)<0&&(w=f),(!x||dr(d,x)<0)&&(x=d),dr(f,x)<0&&(x=f)}),{start:w,end:x}}var a=e.from(),u=e.to();{var c,h,d,f,p;a.line==u.line?s(a.line,a.ch,u.ch):(c=Qe(r,a.line),h=Qe(r,u.line),d=Ut(c)==Ut(h),f=s(a.line,a.ch,d?c.text.length+1:null).end,p=s(u.line,d?0:null,u.ch).start,d&&(f.top<p.top-2?(A(f.right,f.top,null,f.bottom),A(T,p.top,p.left,p.bottom)):A(f.right,f.top,p.left-f.right,f.bottom)),f.bottom<p.top&&A(T,f.bottom,null,p.top))}t.appendChild(i)}(e,n,s)))}return o}function hr(e,t,n){var r,i=Vn(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),o=n.appendChild(O("div"," ","CodeMirror-cursor"));o.style.left=i.left+"px",o.style.top=i.top+"px",o.style.height=Math.max(0,i.bottom-i.top)*e.options.cursorHeight+"px",i.other&&((r=n.appendChild(O("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"))).style.display="",r.style.left=i.other.left+"px",r.style.top=i.other.top+"px",r.style.height=.85*(i.other.bottom-i.other.top)+"px")}function dr(e,t){return e.top-t.top||e.left-t.left}function fr(e){var t,n;e.state.focused&&(t=e.display,clearInterval(t.blinker),n=!0,t.cursorDiv.style.visibility="",0<e.options.cursorBlinkRate?t.blinker=setInterval(function(){e.hasFocus()||vr(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden"))}function pr(e){e.hasFocus()||(e.display.input.focus(),e.state.focused||mr(e))}function gr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,e.state.focused&&vr(e))},100)}function mr(e,t){e.state.delayingBlurEvent&&!e.state.draggingText&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(Se(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),v&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),fr(e))}function vr(e,t){e.state.delayingBlurEvent||(e.state.focused&&(Se(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function yr(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r<t.view.length;r++){var i,o,l=t.view[r],s=e.options.lineWrapping,a=void 0,u=0;if(!l.hidden){L&&x<8?(a=(i=l.node.offsetTop+l.node.offsetHeight)-n,n=i):(a=(o=l.node.getBoundingClientRect()).bottom-o.top,!s&&l.text.firstChild&&(u=l.text.firstChild.getBoundingClientRect().right-o.left-1));var c,h=l.line.height-a;if((.005<h||h<-.005)&&(tt(l.line,a),br(l.line),l.rest))for(var d=0;d<l.rest.length;d++)br(l.rest[d]);u>e.display.sizerWidth&&((c=Math.ceil(u/Zn(e.display)))>e.display.maxLineLength&&(e.display.maxLineLength=c,e.display.maxLine=l.line,e.display.maxLineChanged=!0))}}}function br(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var n=e.widgets[t],r=n.node.parentNode;r&&(n.height=r.offsetHeight)}}function wr(e,t,n){var r,i,o=n&&null!=n.top?Math.max(0,n.top):e.scroller.scrollTop,o=Math.floor(o-wn(e)),l=n&&null!=n.bottom?n.bottom:o+e.wrapper.clientHeight,s=rt(t,o),a=rt(t,l);return n&&n.ensure&&(r=n.ensure.from.line,i=n.ensure.to.line,r<s?a=rt(t,Xt(Qe(t,s=r))+e.wrapper.clientHeight):Math.min(i,t.lastLine())>=a&&(s=rt(t,Xt(Qe(t,i))-e.wrapper.clientHeight),a=i)),{from:s,to:Math.max(a,s+1)}}function xr(e,t){var n=e.display,r=qn(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:n.scroller.scrollTop,o=kn(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s,a=e.doc.height+xn(n),u=t.top<r,c=t.bottom>a-r;t.top<i?l.scrollTop=u?0:t.top:t.bottom>i+o&&((s=Math.min(t.top,(c?a:t.bottom)-o))!=i&&(l.scrollTop=s));var h=e.options.fixedGutter?0:n.gutters.offsetWidth,d=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft-h,f=Ln(e)-n.gutters.offsetWidth,p=t.right-t.left>f;return p&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<d?l.scrollLeft=Math.max(0,t.left+h-(p?0:10)):t.right>f+d-3&&(l.scrollLeft=t.right+(p?0:10)-f),l}function Cr(e,t){null!=t&&(kr(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sr(e){kr(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Lr(e,t,n){null==t&&null==n||kr(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function kr(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tr(e,Kn(e,t.from),Kn(e,t.to),t.margin))}function Tr(e,t,n,r){var i=xr(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Lr(e,i.scrollLeft,i.scrollTop)}function Mr(e,t){Math.abs(e.doc.scrollTop-t)<2||(g||$r(e,{top:t}),Nr(e,t,!0),g&&$r(e),Kr(e,100))}function Nr(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),e.display.scroller.scrollTop==t&&!n||(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Ar(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,Qr(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Or(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+xn(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+Sn(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}function Dr(e,t,n){this.cm=n;var r=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),we(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),we(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,L&&x<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}Dr.prototype.update=function(e){var t,n,r=e.scrollWidth>e.clientWidth+1,i=e.scrollHeight>e.clientHeight+1,o=e.nativeBarWidth;return i?(this.vert.style.display="block",this.vert.style.bottom=r?o+"px":"0",t=e.viewHeight-(r?o:0),this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+t)+"px"):(this.vert.style.display="",this.vert.firstChild.style.height="0"),r?(this.horiz.style.display="block",this.horiz.style.right=i?o+"px":"0",this.horiz.style.left=e.barLeft+"px",n=e.viewWidth-e.barLeft-(i?o:0),this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+n)+"px"):(this.horiz.style.display="",this.horiz.firstChild.style.width="0"),!this.checkedZeroWidth&&0<e.clientHeight&&(0==o&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:i?o:0,bottom:r?o:0}},Dr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},Dr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},Dr.prototype.zeroWidthHack=function(){var e=y&&!s?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new z,this.disableVert=new z},Dr.prototype.enableZeroWidthBar=function(n,r,i){n.style.pointerEvents="auto",r.set(1e3,function e(){var t=n.getBoundingClientRect();("vert"==i?document.elementFromPoint(t.right-1,(t.top+t.bottom)/2):document.elementFromPoint((t.right+t.left)/2,t.bottom-1))!=n?n.style.pointerEvents="none":r.set(1e3,e)})},Dr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};function Wr(){}function Hr(e,t){t=t||Or(e);var n=e.display.barWidth,r=e.display.barHeight;Fr(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&yr(e),Fr(e,Or(e)),n=e.display.barWidth,r=e.display.barHeight}function Fr(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}Wr.prototype.update=function(){return{bottom:0,right:0}},Wr.prototype.setScrollLeft=function(){},Wr.prototype.setScrollTop=function(){},Wr.prototype.clear=function(){};var Er={native:Dr,null:Wr};function Pr(n){n.display.scrollbars&&(n.display.scrollbars.clear(),n.display.scrollbars.addClass&&T(n.display.wrapper,n.display.scrollbars.addClass)),n.display.scrollbars=new Er[n.options.scrollbarStyle](function(e){n.display.wrapper.insertBefore(e,n.display.scrollbarFiller),we(e,"mousedown",function(){n.state.focused&&setTimeout(function(){return n.display.input.focus()},0)}),e.setAttribute("cm-not-content","true")},function(e,t){("horizontal"==t?Ar:Mr)(n,e)},n),n.display.scrollbars.addClass&&H(n.display.wrapper,n.display.scrollbars.addClass)}var Ir=0;function Rr(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ir},t=e.curOp,ln?ln.ops.push(t):t.ownsGroup=ln={ops:[t],delayedCallbacks:[]}}function zr(e){var t=e.curOp;t&&sn(t,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,n=0;n<t.length;n++)!function(e){var t=e.cm,n=t.display;(function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=Sn(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=Sn(e)+"px",t.scrollbarsClipped=!0)})(t),e.updateMaxLine&&_t(t);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<n.viewFrom||e.scrollToPos.to.line>=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new Xr(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}(t[n]);for(var r=0;r<t.length;r++)!function(e){e.updatedDisplay=e.mustUpdate&&Yr(e.cm,e.update)}(t[r]);for(var i=0;i<t.length;i++)!function(e){var t=e.cm,n=t.display;e.updatedDisplay&&yr(t);e.barMeasure=Or(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Mn(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+Sn(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Ln(t)));(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}(t[i]);for(var o=0;o<t.length;o++)!function(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&Ar(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var n=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,n);!e.updatedDisplay&&e.startHeight==t.doc.height||Hr(t,e.barMeasure);e.updatedDisplay&&Zr(t,e.barMeasure);e.selectionChanged&&fr(t);t.state.focused&&e.updateInput&&t.display.input.reset(e.typing);n&&pr(e.cm)}(t[o]);for(var l=0;l<t.length;l++)!function(e){var t=e.cm,n=t.display,r=t.doc;e.updatedDisplay&&_r(t,e.update);null==n.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(n.wheelStartX=n.wheelStartY=null);null!=e.scrollTop&&Nr(t,e.scrollTop,e.forceScroll);null!=e.scrollLeft&&Ar(t,e.scrollLeft,!0,!0);{var i;e.scrollToPos&&(i=function(e,t,n,r){null==r&&(r=0),e.options.lineWrapping||t!=n||(n="before"==(t=t.ch?lt(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?lt(t.line,t.ch+1,"before"):t);for(var i=0;i<5;i++){var o,l=!1,s=Vn(e,t),a=n&&n!=t?Vn(e,n):s,u=xr(e,o={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-r,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+r}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mr(e,u.scrollTop),1<Math.abs(e.doc.scrollTop-c)&&(l=!0)),null!=u.scrollLeft&&(Ar(e,u.scrollLeft),1<Math.abs(e.doc.scrollLeft-h)&&(l=!0)),!l)break}return o}(t,ft(r,e.scrollToPos.from),ft(r,e.scrollToPos.to),e.scrollToPos.margin),function(e,t){var n,r,i,o;Le(e,"scrollCursorIntoView")||(r=(n=e.display).sizer.getBoundingClientRect(),i=null,t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null==i||u||(o=O("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-wn(e.display))+"px;\n height: "+(t.bottom-t.top+Sn(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;"),e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)))}(t,i))}var o=e.maybeHiddenMarkers,l=e.maybeUnhiddenMarkers;if(o)for(var s=0;s<o.length;++s)o[s].lines.length||Se(o[s],"hide");if(l)for(var a=0;a<l.length;++a)l[a].lines.length&&Se(l[a],"unhide");n.wrapper.offsetHeight&&(r.scrollTop=t.display.scroller.scrollTop);e.changeObjs&&Se(t,"changes",t,e.changeObjs);e.update&&e.update.finish()}(t[l])}(e)})}function Br(e,t){if(e.curOp)return t();Rr(e);try{return t()}finally{zr(e)}}function Gr(e,t){return function(){if(e.curOp)return t.apply(e,arguments);Rr(e);try{return t.apply(e,arguments)}finally{zr(e)}}}function Ur(e){return function(){if(this.curOp)return e.apply(this,arguments);Rr(this);try{return e.apply(this,arguments)}finally{zr(this)}}}function Vr(t){return function(){var e=this.cm;if(!e||e.curOp)return t.apply(this,arguments);Rr(e);try{return t.apply(this,arguments)}finally{zr(e)}}}function Kr(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,P(jr,e))}function jr(a){var u,c,h,d=a.doc;d.highlightFrontier>=a.display.viewTo||(u=+new Date+a.options.workTime,c=bt(a,d.highlightFrontier),h=[],d.iter(c.line,Math.min(d.first+d.size,a.display.viewTo+500),function(e){if(c.line>=a.display.viewFrom){var t=e.styles,n=e.text.length>a.options.maxHighlightLength?_e(d.mode,c.state):null,r=vt(a,e,c,!0);n&&(c.state=n),e.styles=r.styles;var i=e.styleClasses,o=r.classes;o?e.styleClasses=o:i&&(e.styleClasses=null);for(var l=!t||t.length!=e.styles.length||i!=o&&(!i||!o||i.bgClass!=o.bgClass||i.textClass!=o.textClass),s=0;!l&&s<t.length;++s)l=t[s]!=e.styles[s];l&&h.push(c.line),e.stateAfter=c.save(),c.nextLine()}else e.text.length<=a.options.maxHighlightLength&&wt(a,e.text,c),e.stateAfter=c.line%5==0?c.save():null,c.nextLine();if(+new Date>u)return Kr(a,a.options.workDelay),!0}),d.highlightFrontier=c.line,d.modeFrontier=Math.max(d.modeFrontier,c.line),h.length&&Br(a,function(){for(var e=0;e<h.length;e++)or(a,h[e],"text")}))}var Xr=function(e,t,n){var r=e.display;this.viewport=t,this.visible=wr(r,e.doc,t),this.editorIsHidden=!r.wrapper.offsetWidth,this.wrapperHeight=r.wrapper.clientHeight,this.wrapperWidth=r.wrapper.clientWidth,this.oldDisplayWidth=Ln(e),this.force=n,this.dims=Qn(e),this.events=[]};function Yr(e,t){var n=e.display,r=e.doc;if(t.editorIsHidden)return lr(e),!1;if(!t.force&&t.visible.from>=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==ar(e))return!1;Jr(e)&&(lr(e),t.dims=Qn(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFrom<o&&o-n.viewFrom<20&&(o=Math.max(r.first,n.viewFrom)),n.viewTo>l&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),Nt&&(o=Vt(e.doc,o),l=Kt(e.doc,l));var s,a,u,c,h=o!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;a=o,u=l,0==(c=(s=e).display).view.length||a>=c.viewTo||u<=c.viewFrom?(c.view=on(s,a,u),c.viewFrom=a):(c.viewFrom>a?c.view=on(s,a,c.viewFrom).concat(c.view):c.viewFrom<a&&(c.view=c.view.slice(rr(s,a))),c.viewFrom=a,c.viewTo<u?c.view=c.view.concat(on(s,c.viewTo,u)):c.viewTo>u&&(c.view=c.view.slice(0,rr(s,u)))),c.viewTo=u,n.viewOffset=Xt(Qe(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var d=ar(e);if(!h&&0==d&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var f,p,g,m=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var n,r={activeElt:t};return!window.getSelection||(n=window.getSelection()).anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset),r}(e);return 4<d&&(n.lineDiv.style.display="none"),function(n,e,t){var r=n.display,i=n.options.lineNumbers,o=r.lineDiv,l=o.firstChild;function s(e){var t=e.nextSibling;return v&&y&&n.display.currentWheelTarget==e?e.style.display="none":e.parentNode.removeChild(e),t}for(var a=r.view,u=r.viewFrom,c=0;c<a.length;c++){var h=a[c];if(!h.hidden)if(h.node&&h.node.parentNode==o){for(;l!=h.node;)l=s(l);var d=i&&null!=e&&e<=u&&h.lineNumber;h.changes&&(-1<B(h.changes,"gutter")&&(d=!1),hn(n,h,u,t)),d&&(M(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(ot(n.options,u)))),l=h.node.nextSibling}else{var f=function(e,t,n,r){var i=fn(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),pn(e,t),gn(e,t,n,r),mn(e,t,r),t.node}(n,h,u,t);o.insertBefore(f,l)}u+=h.size}for(;l;)l=s(l)}(e,n.updateLineNumbers,t.dims),4<d&&(n.lineDiv.style.display=""),n.renderedView=n.view,(f=m)&&f.activeElt&&f.activeElt!=W()&&(f.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(f.activeElt.nodeName)&&f.anchorNode&&D(document.body,f.anchorNode)&&D(document.body,f.focusNode)&&(p=window.getSelection(),(g=document.createRange()).setEnd(f.anchorNode,f.anchorOffset),g.collapse(!1),p.removeAllRanges(),p.addRange(g),p.extend(f.focusNode,f.focusOffset))),M(n.cursorDiv),M(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,h&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,Kr(e,400)),!(n.updateLineNumbers=null)}function _r(e,t){for(var n=t.viewport,r=!0;;r=!1){if(r&&e.options.lineWrapping&&t.oldDisplayWidth!=Ln(e))r&&(t.visible=wr(e.display,e.doc,n));else if(n&&null!=n.top&&(n={top:Math.min(e.doc.height+xn(e.display)-kn(e),n.top)}),t.visible=wr(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break;if(!Yr(e,t))break;yr(e);var i=Or(e);ur(e),Hr(e,i),Zr(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function $r(e,t){var n,r=new Xr(e,t);Yr(e,r)&&(yr(e),_r(e,r),n=Or(e),ur(e),Hr(e,n),Zr(e,n),r.finish())}function qr(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function Zr(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Sn(e)+"px"}function Qr(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=Jn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",l=0;l<n.length;l++)if(!n[l].hidden){e.options.fixedGutter&&(n[l].gutter&&(n[l].gutter.style.left=o),n[l].gutterBackground&&(n[l].gutterBackground.style.left=o));var s=n[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}}function Jr(e){if(e.options.lineNumbers){var t=e.doc,n=ot(e.options,t.first+t.size-1),r=e.display;if(n.length!=r.lineNumChars){var i=r.measure.appendChild(O("div",[O("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return r.lineGutter.style.width="",r.lineNumInnerWidth=Math.max(o,r.lineGutter.offsetWidth-l)+1,r.lineNumWidth=r.lineNumInnerWidth+l,r.lineNumChars=r.lineNumInnerWidth?n.length:-1,r.lineGutter.style.width=r.lineNumWidth+"px",qr(e.display),1}}}function ei(e,t){for(var n=[],r=!1,i=0;i<e.length;i++){var o=e[i],l=null;if("string"!=typeof o&&(l=o.style,o=o.className),"CodeMirror-linenumbers"==o){if(!t)continue;r=!0}n.push({className:o,style:l})}return t&&!r&&n.push({className:"CodeMirror-linenumbers",style:null}),n}function ti(e){var t=e.gutters,n=e.gutterSpecs;M(t),e.lineGutter=null;for(var r=0;r<n.length;++r){var i=n[r],o=i.className,l=i.style,s=t.appendChild(O("div",null,"CodeMirror-gutter "+o));l&&(s.style.cssText=l),"CodeMirror-linenumbers"==o&&((e.lineGutter=s).style.width=(e.lineNumWidth||1)+"px")}t.style.display=n.length?"":"none",qr(e)}function ni(e){ti(e.display),ir(e),Qr(e)}function ri(e,t,n,r){var i=this;this.input=n,i.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),i.scrollbarFiller.setAttribute("cm-not-content","true"),i.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),i.gutterFiller.setAttribute("cm-not-content","true"),i.lineDiv=A("div",null,"CodeMirror-code"),i.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),i.cursorDiv=O("div",null,"CodeMirror-cursors"),i.measure=O("div",null,"CodeMirror-measure"),i.lineMeasure=O("div",null,"CodeMirror-measure"),i.lineSpace=A("div",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,"position: relative; outline: none");var o=A("div",[i.lineSpace],"CodeMirror-lines");i.mover=O("div",[o],null,"position: relative"),i.sizer=O("div",[i.mover],"CodeMirror-sizer"),i.sizerWidth=null,i.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),i.gutters=O("div",null,"CodeMirror-gutters"),i.lineGutter=null,i.scroller=O("div",[i.sizer,i.heightForcer,i.gutters],"CodeMirror-scroll"),i.scroller.setAttribute("tabIndex","-1"),i.wrapper=O("div",[i.scrollbarFiller,i.gutterFiller,i.scroller],"CodeMirror"),L&&x<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),v||g&&d||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,i.gutterSpecs=ei(r.gutters,r.lineNumbers),ti(i),n.init(i)}Xr.prototype.signal=function(e,t){Te(e,t)&&this.events.push(arguments)},Xr.prototype.finish=function(){for(var e=0;e<this.events.length;e++)Se.apply(null,this.events[e])};var ii=0,oi=null;function li(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==n&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:null==n&&(n=e.wheelDelta),{x:t,y:n}}function si(e){var t=li(e);return t.x*=oi,t.y*=oi,t}function ai(e,t){var n,r,i,o=li(t),l=o.x,s=o.y,a=e.display,u=a.scroller,c=u.scrollWidth>u.clientWidth,h=u.scrollHeight>u.clientHeight;if(l&&c||s&&h){if(s&&y&&v)e:for(var d=t.target,f=a.view;d!=u;d=d.parentNode)for(var p=0;p<f.length;p++)if(f[p].node==d){e.display.currentWheelTarget=d;break e}if(l&&!g&&!m&&null!=oi)return s&&h&&Mr(e,Math.max(0,u.scrollTop+s*oi)),Ar(e,Math.max(0,u.scrollLeft+l*oi)),(!s||s&&h)&&Ne(t),void(a.wheelStartX=null);s&&null!=oi&&(n=s*oi,i=(r=e.doc.scrollTop)+a.wrapper.clientHeight,n<0?r=Math.max(0,r+n-50):i=Math.min(e.doc.height,i+n+50),$r(e,{top:r,bottom:i})),ii<20&&(null==a.wheelStartX?(a.wheelStartX=u.scrollLeft,a.wheelStartY=u.scrollTop,a.wheelDX=l,a.wheelDY=s,setTimeout(function(){var e,t,n;null!=a.wheelStartX&&(e=u.scrollLeft-a.wheelStartX,n=(t=u.scrollTop-a.wheelStartY)&&a.wheelDY&&t/a.wheelDY||e&&a.wheelDX&&e/a.wheelDX,a.wheelStartX=a.wheelStartY=null,n&&(oi=(oi*ii+n)/(ii+1),++ii))},200)):(a.wheelDX+=l,a.wheelDY+=s))}}L?oi=-.53:g?oi=15:l?oi=-.7:c&&(oi=-1/3);var ui=function(e,t){this.ranges=e,this.primIndex=t};ui.prototype.primary=function(){return this.ranges[this.primIndex]},ui.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(!at(n.anchor,r.anchor)||!at(n.head,r.head))return!1}return!0},ui.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new ci(ut(this.ranges[t].anchor),ut(this.ranges[t].head));return new ui(e,this.primIndex)},ui.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},ui.prototype.contains=function(e,t){t=t||e;for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(0<=st(t,r.from())&&st(e,r.to())<=0)return n}return-1};var ci=function(e,t){this.anchor=e,this.head=t};function hi(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(e,t){return st(e.from(),t.from())}),n=B(t,i);for(var o=1;o<t.length;o++){var l,s,a,u=t[o],c=t[o-1],h=st(c.to(),u.from());(r&&!u.empty()?0<h:0<=h)&&(l=ht(c.from(),u.from()),s=ct(c.to(),u.to()),a=c.empty()?u.from()==u.head:c.from()==c.head,o<=n&&--n,t.splice(--o,2,new ci(a?s:l,a?l:s)))}return new ui(t,n)}function di(e,t){return new ui([new ci(e,t||e)],0)}function fi(e){return e.text?lt(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function pi(e,t){if(st(e,t.from)<0)return e;if(st(e,t.to)<=0)return fi(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=fi(t).ch-t.to.ch),lt(n,r)}function gi(e,t){for(var n=[],r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new ci(pi(i.anchor,t),pi(i.head,t)))}return hi(e.cm,n,e.sel.primIndex)}function mi(e,t,n){return e.line==t.line?lt(n.line,e.ch-t.ch+n.ch):lt(n.line+(e.line-t.line),e.ch)}function vi(e){e.doc.mode=je(e.options,e.doc.modeOption),yi(e)}function yi(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Kr(e,100),e.state.modeGen++,e.curOp&&ir(e)}function bi(e,t){return 0==t.from.ch&&0==t.to.ch&&""==$(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function wi(e,r,t,i){function o(e){return t?t[e]:null}function n(e,t,n){!function(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),Ht(e),Ft(e,n);var i=r?r(e):1;i!=e.height&&tt(e,i)}(e,t,n,i),un(e,"change",e,r)}function l(e,t){for(var n=[],r=e;r<t;++r)n.push(new $t(d[r],o(r),i));return n}var s,a,u,c=r.from,h=r.to,d=r.text,f=Qe(e,c.line),p=Qe(e,h.line),g=$(d),m=o(d.length-1),v=h.line-c.line;r.full?(e.insert(0,l(0,d.length)),e.remove(d.length,e.size-d.length)):bi(e,r)?(s=l(0,d.length-1),n(p,p.text,m),v&&e.remove(c.line,v),s.length&&e.insert(c.line,s)):f==p?1==d.length?n(f,f.text.slice(0,c.ch)+g+f.text.slice(h.ch),m):((a=l(1,d.length-1)).push(new $t(g+f.text.slice(h.ch),m,i)),n(f,f.text.slice(0,c.ch)+d[0],o(0)),e.insert(c.line+1,a)):1==d.length?(n(f,f.text.slice(0,c.ch)+d[0]+p.text.slice(h.ch),o(0)),e.remove(c.line+1,v)):(n(f,f.text.slice(0,c.ch)+d[0],o(0)),n(p,g+p.text.slice(h.ch),m),u=l(1,d.length-1),1<v&&e.remove(c.line+1,v-1),e.insert(c.line+1,u)),un(e,"change",e,r)}function xi(e,s,a){!function e(t,n,r){if(t.linked)for(var i=0;i<t.linked.length;++i){var o,l=t.linked[i];l.doc!=n&&(o=r&&l.sharedHist,a&&!o||(s(l.doc,o),e(l.doc,t,o)))}}(e,null,!0)}function Ci(e,t){if(t.cm)throw new Error("This document is already in use.");tr((e.doc=t).cm=e),vi(e),Si(e),e.options.lineWrapping||_t(e),e.options.mode=t.modeOption,ir(e)}function Si(e){("rtl"==e.doc.direction?H:T)(e.display.lineDiv,"CodeMirror-rtl")}function Li(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function ki(e,t){var n={from:ut(t.from),to:fi(t),text:Je(e,t.from,t.to)};return Oi(e,n,t.from.line,t.to.line+1),xi(e,function(e){return Oi(e,n,t.from.line,t.to.line+1),0},!0),n}function Ti(e){for(;e.length;){if(!$(e).ranges)break;e.pop()}}function Mi(e,t,n,r){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=(s=i).lastOp==r?(Ti(s.done),$(s.done)):s.done.length&&!$(s.done).ranges?$(s.done):1<s.done.length&&!s.done[s.done.length-2].ranges?(s.done.pop(),$(s.done)):void 0))l=$(o.changes),0==st(t.from,t.to)&&0==st(t.from,l.to)?l.to=fi(t):o.changes.push(ki(e,t));else{var u=$(i.done);for(u&&u.ranges||Ai(e.sel,i.done),o={changes:[ki(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,l||Se(e,"historyAdded")}function Ni(e,t,n,r){var i,o,l,s,a,u=e.history,c=r&&r.origin;n==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=$(u.done),s=t,"*"==(a=o.charAt(0))||"+"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Ai(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=n,r&&!1!==r.clearRedo&&Ti(u.undone)}function Ai(e,t){var n=$(t);n&&n.ranges&&n.equals(e)||t.push(e)}function Oi(t,n,e,r){var i=n["spans_"+t.id],o=0;t.iter(Math.max(t.first,e),Math.min(t.first+t.size,r),function(e){e.markedSpans&&((i=i||(n["spans_"+t.id]={}))[o]=e.markedSpans),++o})}function Di(e,t){var n=t["spans_"+e.id];if(!n)return null;for(var r=[],i=0;i<t.text.length;++i)r.push(function(e){if(!e)return null;for(var t,n=0;n<e.length;++n)e[n].marker.explicitlyCleared?t=t||e.slice(0,n):t&&t.push(e[n]);return t?t.length?t:null:e}(n[i]));return r}function Wi(e,t){var n=Di(e,t),r=Dt(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var o=n[i],l=r[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(n[i]=l)}return n}function Hi(e,t,n){for(var r=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)r.push(n?ui.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];r.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\d+)$/))&&-1<B(t,Number(c[1]))&&($(s)[h]=u[h],delete u[h])}}}return r}function Fi(e,t,n,r){if(r){var i,o=e.anchor;return n&&((i=st(t,o)<0)!=st(n,o)<0?(o=t,t=n):i!=st(t,n)<0&&(t=n)),new ci(o,t)}return new ci(n||t,t)}function Ei(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),Bi(e,new ui([Fi(e.sel.primary(),t,n,i)],0),r)}function Pi(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)r[o]=Fi(e.sel.ranges[o],t[o],null,i);Bi(e,hi(e.cm,r,e.sel.primIndex),n)}function Ii(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,Bi(e,hi(e.cm,i,e.sel.primIndex),r)}function Ri(e,t,n,r){Bi(e,di(t,n),r)}function zi(e,t,n){var r=e.history.done,i=$(r);i&&i.ranges?Gi(e,r[r.length-1]=t,n):Bi(e,t,n)}function Bi(e,t,n){Gi(e,t,n),Ni(e,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function Gi(e,t,n){var r,i,o,l;(Te(e,"beforeSelectionChange")||e.cm&&Te(e.cm,"beforeSelectionChange"))&&(r=e,o=n,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new ci(ft(r,e[t].anchor),ft(r,e[t].head))},origin:o&&o.origin},Se(r,"beforeSelectionChange",r,l),r.cm&&Se(r.cm,"beforeSelectionChange",r.cm,l),t=l.ranges!=i.ranges?hi(r.cm,l.ranges,l.ranges.length-1):i);var s=n&&n.bias||(st(t.primary().head,e.sel.primary().head)<0?-1:1);Ui(e,Ki(e,t,s,!0)),n&&!1===n.scroll||!e.cm||Sr(e.cm)}function Ui(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=1,e.cm.curOp.selectionChanged=!0,ke(e.cm)),un(e,"cursorActivity",e))}function Vi(e){Ui(e,Ki(e,e.sel,null,!1))}function Ki(e,t,n,r){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Xi(e,l.anchor,s&&s.anchor,n,r),u=Xi(e,l.head,s&&s.head,n,r);!i&&a==l.anchor&&u==l.head||((i=i||t.ranges.slice(0,o))[o]=new ci(a,u))}return i?hi(e.cm,i,t.primIndex):t}function ji(e,t,n,r,i){var o=Qe(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker,u="selectLeft"in a?!a.selectLeft:a.inclusiveLeft,c="selectRight"in a?!a.selectRight:a.inclusiveRight;if((null==s.from||(u?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(c?s.to>=t.ch:s.to>t.ch))){if(i&&(Se(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(n){var h=a.find(r<0?1:-1),d=void 0;if((r<0?c:u)&&(h=Yi(e,h,-r,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(d=st(h,n))&&(r<0?d<0:0<d))return ji(e,h,t,r,i)}var f=a.find(r<0?-1:1);return(r<0?u:c)&&(f=Yi(e,f,r,f.line==t.line?o:null)),f?ji(e,f,t,r,i):null}}return t}function Xi(e,t,n,r,i){var o=r||1,l=ji(e,t,n,o,i)||!i&&ji(e,t,n,o,!0)||ji(e,t,n,-o,i)||!i&&ji(e,t,n,-o,!0);return l||(e.cantEdit=!0,lt(e.first,0))}function Yi(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?ft(e,lt(t.line-1)):null:0<n&&t.ch==(r||Qe(e,t.line)).text.length?t.line<e.first+e.size-1?lt(t.line+1,0):null:new lt(t.line,t.ch+n)}function _i(e){e.setSelection(lt(e.firstLine(),0),lt(e.lastLine()),V)}function $i(i,e,t){var o={canceled:!1,from:e.from,to:e.to,text:e.text,origin:e.origin,cancel:function(){return o.canceled=!0}};return t&&(o.update=function(e,t,n,r){e&&(o.from=ft(i,e)),t&&(o.to=ft(i,t)),n&&(o.text=n),void 0!==r&&(o.origin=r)}),Se(i,"beforeChange",i,o),i.cm&&Se(i.cm,"beforeChange",i.cm,o),o.canceled?(i.cm&&(i.cm.curOp.updateInput=2),null):{from:o.from,to:o.to,text:o.text,origin:o.origin}}function qi(e,t,n){if(e.cm){if(!e.cm.curOp)return Gr(e.cm,qi)(e,t,n);if(e.cm.state.suppressEdits)return}if(!(Te(e,"beforeChange")||e.cm&&Te(e.cm,"beforeChange"))||(t=$i(e,t,!0))){var r=Mt&&!n&&function(e,t,n){var r=null;if(e.iter(t.line,n.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;!n.readOnly||r&&-1!=B(r,n)||(r=r||[]).push(n)}}),!r)return null;for(var i=[{from:t,to:n}],o=0;o<r.length;++o)for(var l=r[o],s=l.find(0),a=0;a<i.length;++a){var u,c,h,d=i[a];st(d.to,s.from)<0||0<st(d.from,s.to)||(u=[a,1],c=st(d.from,s.from),h=st(d.to,s.to),(c<0||!l.inclusiveLeft&&!c)&&u.push({from:d.from,to:s.from}),(0<h||!l.inclusiveRight&&!h)&&u.push({from:s.to,to:d.to}),i.splice.apply(i,u),a+=u.length-3)}return i}(e,t.from,t.to);if(r)for(var i=r.length-1;0<=i;--i)Zi(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else Zi(e,t)}}function Zi(e,n){var t,r;1==n.text.length&&""==n.text[0]&&0==st(n.from,n.to)||(t=gi(e,n),Mi(e,n,t,e.cm?e.cm.curOp.id:NaN),eo(e,n,t,Dt(e,n)),r=[],xi(e,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Dt(e,n))}))}function Qi(i,o,e){var t=i.cm&&i.cm.state.suppressEdits;if(!t||e){for(var l,n=i.history,r=i.sel,s="undo"==o?n.done:n.undone,a="undo"==o?n.undone:n.done,u=0;u<s.length&&(l=s[u],e?!l.ranges||l.equals(i.sel):l.ranges);u++);if(u!=s.length){for(n.lastOrigin=n.lastSelOrigin=null;;){if(!(l=s.pop()).ranges){if(t)return void s.push(l);break}if(Ai(l,a),e&&!l.equals(i.sel))return void Bi(i,l,{clearRedo:!1});r=l}var c=[];Ai(r,a),a.push({changes:c,generation:n.generation}),n.generation=l.generation||++n.maxGeneration;for(var h=Te(i,"beforeChange")||i.cm&&Te(i.cm,"beforeChange"),d=l.changes.length-1;0<=d;--d){var f=function(e){var n=l.changes[e];if(n.origin=o,h&&!$i(i,n,!1))return s.length=0,{};c.push(ki(i,n));var t=e?gi(i,n):$(s);eo(i,n,t,Wi(i,n)),!e&&i.cm&&i.cm.scrollIntoView({from:n.from,to:fi(n)});var r=[];xi(i,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Wi(e,n))})}(d);if(f)return f.v}}}}function Ji(e,t){if(0!=t&&(e.first+=t,e.sel=new ui(q(e.sel.ranges,function(e){return new ci(lt(e.anchor.line+t,e.anchor.ch),lt(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){ir(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;r<n.viewTo;r++)or(e.cm,r,"gutter")}}function eo(e,t,n,r){if(e.cm&&!e.cm.curOp)return Gr(e.cm,eo)(e,t,n,r);var i,o;t.to.line<e.first?Ji(e,t.text.length-1-(t.to.line-t.from.line)):t.from.line>e.lastLine()||(t.from.line<e.first&&(Ji(e,i=t.text.length-1-(e.first-t.from.line)),t={from:lt(e.first,0),to:lt(t.to.line+i,t.to.ch),text:[$(t.text)],origin:t.origin}),o=e.lastLine(),t.to.line>o&&(t={from:t.from,to:lt(o,Qe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Je(e,t.from,t.to),n=n||gi(e,t),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=nt(Ut(Qe(r,o.line))),r.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0}));-1<r.sel.contains(t.from,t.to)&&ke(e);wi(r,t,n,er(e)),e.options.lineWrapping||(r.iter(a,o.line+t.text.length,function(e){var t=Yt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var n=e.first,r=t-1;n<r;r--){var i=Qe(e,r).stateAfter;if(i&&(!(i instanceof gt)||r+i.lookAhead<t)){n=r+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,n)}})(r,o.line),Kr(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?ir(e):o.line!=l.line||1!=t.text.length||bi(e.doc,t)?ir(e,o.line,l.line+1,u):or(e,o.line,"text");var c=Te(e,"changes"),h=Te(e,"change");{var d;(h||c)&&(d={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin},h&&un(e,"change",e,d),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(d))}e.display.selForContextMenu=null}(e.cm,t,r):wi(e,t,r),Gi(e,n,V),e.cantEdit&&Xi(e,lt(e.firstLine(),0))&&(e.cantEdit=!1))}function to(e,t,n,r,i){var o;st(r=r||n,n)<0&&(n=(o=[r,n])[0],r=o[1]),"string"==typeof t&&(t=e.splitLines(t)),qi(e,{from:n,to:r,text:t,origin:i})}function no(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function ro(e,t,n,r){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)no(o.ranges[s].anchor,t,n,r),no(o.ranges[s].head,t,n,r)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(n<u.from.line)u.from=lt(u.from.line+r,u.from.ch),u.to=lt(u.to.line+r,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function io(e,t){var n=t.from.line,r=t.to.line,i=t.text.length-(r-n)-1;ro(e.done,n,r,i),ro(e.undone,n,r,i)}function oo(e,t,n,r){var i=t,o=t;return"number"==typeof t?o=Qe(e,dt(e,t)):i=nt(t),null==i?null:(r(o,i)&&e.cm&&or(e.cm,i,n),o)}function lo(e){this.lines=e,this.parent=null;for(var t=0,n=0;n<e.length;++n)e[n].parent=this,t+=e[n].height;this.height=t}function so(e){this.children=e;for(var t=0,n=0,r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}ci.prototype.from=function(){return ht(this.anchor,this.head)},ci.prototype.to=function(){return ct(this.anchor,this.head)},ci.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},lo.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n,r=e,i=e+t;r<i;++r){var o=this.lines[r];this.height-=o.height,(n=o).parent=null,Ht(n),un(o,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},so.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n,r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e),s=i.height;if(i.removeInner(e,l),this.height-=s-i.height,o==l&&(this.children.splice(r--,1),i.parent=null),0==(t-=l))break;e=0}else e-=o}this.size-t<25&&(1<this.children.length||!(this.children[0]instanceof lo))&&(n=[],this.collapse(n),this.children=[new lo(n)],this.children[0].parent=this)},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,n),i.lines&&50<i.lines.length){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new lo(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++r,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t,n,r=new so(e.children.splice(e.children.length-5,5));e.parent?(e.size-=r.size,e.height-=r.height,t=B(e.parent.children,e),e.parent.children.splice(t+1,0,r)):(((n=new so(e.children)).parent=e).children=[n,r],e=n),r.parent=e.parent}while(10<e.children.length);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,n))return!0;if(0==(t-=l))break;e=0}else e-=o}}};function ao(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.doc=e,this.node=t}function uo(e,t,n){Xt(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cr(e,n)}ao.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,n=this.line,r=nt(n);if(null!=r&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var o=yn(this);tt(n,Math.max(0,n.height-o)),e&&(Br(e,function(){uo(e,n,-o),or(e,r,"widget")}),un(e,"lineWidgetCleared",e,this,r))}},ao.prototype.changed=function(){var e=this,t=this.height,n=this.doc.cm,r=this.line;this.height=null;var i=yn(this)-t;i&&(jt(this.doc,r)||tt(r,r.height+i),n&&Br(n,function(){n.curOp.forceUpdate=!0,uo(n,r,i),un(n,"lineWidgetChanged",n,e,nt(r))}))},Me(ao);var co=0,ho=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++co};function fo(t,r,i,e,n){if(e&&e.shared)return function(e,n,r,i,o){(i=I(i)).shared=!1;var l=[fo(e,n,r,i,o)],s=l[0],a=i.widgetNode;return xi(e,function(e){a&&(i.widgetNode=a.cloneNode(!0)),l.push(fo(e,ft(e,n),ft(e,r),i,o));for(var t=0;t<e.linked.length;++t)if(e.linked[t].isParent)return;s=$(l)}),new po(l,s)}(t,r,i,e,n);if(t.cm&&!t.cm.curOp)return Gr(t.cm,fo)(t,r,i,e,n);var o=new ho(t,n),l=st(r,i);if(e&&I(e,o,!1),0<l||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),e.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),e.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Gt(t,r.line,r,i,o)||r.line!=i.line&&Gt(t,i.line,r,i,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Nt=!0}o.addToHistory&&Mi(t,{from:r,to:i,origin:"markText"},t.sel,NaN);var s,a=r.line,u=t.cm;if(t.iter(a,i.line+1,function(e){var t,n;u&&o.collapsed&&!u.options.lineWrapping&&Ut(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=r.line&&tt(e,0),t=e,n=new At(o,a==r.line?r.ch:null,a==i.line?i.ch:null),t.markedSpans=t.markedSpans?t.markedSpans.concat([n]):[n],n.marker.attachLine(t),++a}),o.collapsed&&t.iter(r.line,i.line+1,function(e){jt(t,e)&&tt(e,0)}),o.clearOnEnter&&we(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(Mt=!0,(t.history.done.length||t.history.undone.length)&&t.clearHistory()),o.collapsed&&(o.id=++co,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)ir(u,r.line,i.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=r.line;c<=i.line;c++)or(u,c,"text");o.atomic&&Vi(u.doc),un(u,"markerAdded",u,o)}return o}ho.prototype.clear=function(){if(!this.explicitlyCleared){var e,t=this.doc.cm,n=t&&!t.curOp;n&&Rr(t),!Te(this,"clear")||(e=this.find())&&un(this,"clear",e.from,e.to);for(var r=null,i=null,o=0;o<this.lines.length;++o){var l=this.lines[o],s=Ot(l.markedSpans,this);t&&!this.collapsed?or(t,nt(l),"text"):t&&(null!=s.to&&(i=nt(l)),null!=s.from&&(r=nt(l))),l.markedSpans=function(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n=n||[]).push(e[r]);return n}(l.markedSpans,s),null==s.from&&this.collapsed&&!jt(this.doc,l)&&t&&tt(l,qn(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var a=0;a<this.lines.length;++a){var u=Ut(this.lines[a]),c=Yt(u);c>t.display.maxLineLength&&(t.display.maxLine=u,t.display.maxLineLength=c,t.display.maxLineChanged=!0)}null!=r&&t&&this.collapsed&&ir(t,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&Vi(t.doc)),t&&un(t,"markerCleared",t,this,r,i),n&&zr(t),this.parent&&this.parent.clear()}},ho.prototype.find=function(e,t){var n,r;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Ot(o.markedSpans,this);if(null!=l.from&&(n=lt(t?o:nt(o),l.from),-1==e))return n;if(null!=l.to&&(r=lt(t?o:nt(o),l.to),1==e))return r}return n&&{from:n,to:r}},ho.prototype.changed=function(){var o=this,l=this.find(-1,!0),s=this,a=this.doc.cm;l&&a&&Br(a,function(){var e,t,n=l.line,r=nt(l.line),i=Nn(a,r);i&&(Fn(i),a.curOp.selectionChanged=a.curOp.forceUpdate=!0),a.curOp.updateMaxLine=!0,jt(s.doc,n)||null==s.height||(e=s.height,s.height=null,(t=yn(s)-e)&&tt(n,n.height+t)),un(a,"markerChanged",a,o)})},ho.prototype.attachLine=function(e){var t;!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)),this.lines.push(e)},ho.prototype.detachLine=function(e){var t;this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)},Me(ho);var po=function(e,t){this.markers=e,this.primary=t;for(var n=0;n<e.length;++n)e[n].parent=this};function go(e){return e.findMarks(lt(e.first,0),e.clipPos(lt(e.lastLine())),function(e){return e.parent})}po.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();un(this,"clear")}},po.prototype.find=function(e,t){return this.primary.find(e,t)},Me(po);var mo=0,vo=function(e,t,n,r,i){if(!(this instanceof vo))return new vo(e,t,n,r,i);null==n&&(n=0),so.call(this,[new lo([new $t("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1;var o=lt(this.modeFrontier=this.highlightFrontier=n,0);this.sel=di(o),this.history=new Li(null),this.id=++mo,this.modeOption=t,this.lineSep=r,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),wi(this,{from:o,to:o,text:e}),Bi(this,di(o),V)};vo.prototype=Q(so.prototype,{constructor:vo,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var n=0,r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=et(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Vr(function(e){var t=lt(this.first,0),n=this.first+this.size-1;qi(this,{from:t,to:lt(n,Qe(this,n).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&Lr(this.cm,0,0),Bi(this,di(t),V)}),replaceRange:function(e,t,n,r){to(this,e,t=ft(this,t),n=n?ft(this,n):t,r)},getRange:function(e,t,n){var r=Je(this,ft(this,e),ft(this,t));return!1===n?r:r.join(n||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(it(this,e))return Qe(this,e)},getLineNumber:nt,getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=Qe(this,e)),Ut(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return ft(this,e)},getCursor:function(e){var t=this.sel.primary(),n=null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from();return n},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Vr(function(e,t,n){Ri(this,ft(this,"number"==typeof e?lt(e,t||0):e),null,n)}),setSelection:Vr(function(e,t,n){Ri(this,ft(this,e),ft(this,t||e),n)}),extendSelection:Vr(function(e,t,n){Ei(this,ft(this,e),t&&ft(this,t),n)}),extendSelections:Vr(function(e,t){Pi(this,pt(this,e),t)}),extendSelectionsBy:Vr(function(e,t){Pi(this,pt(this,q(this.sel.ranges,e)),t)}),setSelections:Vr(function(e,t,n){if(e.length){for(var r=[],i=0;i<e.length;i++)r[i]=new ci(ft(this,e[i].anchor),ft(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),Bi(this,hi(this.cm,r,t),n)}}),addSelection:Vr(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new ci(ft(this,e),ft(this,t||e))),Bi(this,hi(this.cm,r,r.length-1),n)}),getSelection:function(e){for(var t=this.sel.ranges,n=0;n<t.length;n++)var r=Je(this,t[n].from(),t[n].to()),i=i?i.concat(r):r;return!1===e?i:i.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],n=this.sel.ranges,r=0;r<n.length;r++){var i=Je(this,n[r].from(),n[r].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[r]=i}return t},replaceSelection:function(e,t,n){for(var r=[],i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")},replaceSelections:Vr(function(e,t,n){for(var r=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];r[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:n}}for(var s=t&&"end"!=t&&function(e,t,n){for(var r=[],i=h=lt(e.first,0),o=0;o<t.length;o++){var l,s,a=t[o],u=mi(a.from,h,i),c=mi(fi(a),h,i),h=a.to,i=c;"around"==n?(s=st((l=e.sel.ranges[o]).head,l.anchor)<0,r[o]=new ci(s?c:u,s?u:c)):r[o]=new ci(u,u)}return new ui(r,e.sel.primIndex)}(this,r,t),a=r.length-1;0<=a;a--)qi(this,r[a]);s?zi(this,s):this.cm&&Sr(this.cm)}),undo:Vr(function(){Qi(this,"undo")}),redo:Vr(function(){Qi(this,"redo")}),undoSelection:Vr(function(){Qi(this,"undo",!0)}),redoSelection:Vr(function(){Qi(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){var t=this;this.history=new Li(this.history.maxGeneration),xi(this,function(e){return e.history=t.history},!0)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Hi(this.history.done),undone:Hi(this.history.undone)}},setHistory:function(e){var t=this.history=new Li(this.history.maxGeneration);t.done=Hi(e.done.slice(0),null,!0),t.undone=Hi(e.undone.slice(0),null,!0)},setGutterMarker:Vr(function(e,n,r){return oo(this,e,"gutter",function(e){var t=e.gutterMarkers||(e.gutterMarkers={});return!(t[n]=r)&&ne(t)&&(e.gutterMarkers=null),1})}),clearGutter:Vr(function(t){var n=this;this.iter(function(e){e.gutterMarkers&&e.gutterMarkers[t]&&oo(n,e,"gutter",function(){return e.gutterMarkers[t]=null,ne(e.gutterMarkers)&&(e.gutterMarkers=null),1})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!it(this,e))return null;if(!(e=Qe(this,t=e)))return null}else if(null==(t=nt(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Vr(function(e,n,r){return oo(this,e,"gutter"==n?"gutter":"class",function(e){var t="text"==n?"textClass":"background"==n?"bgClass":"gutter"==n?"gutterClass":"wrapClass";if(e[t]){if(S(r).test(e[t]))return;e[t]+=" "+r}else e[t]=r;return 1})}),removeLineClass:Vr(function(e,o,l){return oo(this,e,"gutter"==o?"gutter":"class",function(e){var t="text"==o?"textClass":"background"==o?"bgClass":"gutter"==o?"gutterClass":"wrapClass",n=e[t];if(n){if(null==l)e[t]=null;else{var r=n.match(S(l));if(!r)return;var i=r.index+r[0].length;e[t]=n.slice(0,r.index)+(r.index&&i!=n.length?" ":"")+n.slice(i)||null}return 1}})}),addLineWidget:Vr(function(e,t,n){return i=e,o=new ao(r=this,t,n),(l=r.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),oo(r,i,"widget",function(e){var t,n=e.widgets||(e.widgets=[]);return null==o.insertAt?n.push(o):n.splice(Math.min(n.length,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!jt(r,e)&&(t=Xt(e)<r.scrollTop,tt(e,e.height+yn(o)),t&&Cr(l,o.height),l.curOp.forceUpdate=!0),1}),l&&un(l,"lineWidgetAdded",l,o,"number"==typeof i?i:nt(i)),o;var r,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,n){return fo(this,ft(this,e),ft(this,t),n,n&&n.type||"range")},setBookmark:function(e,t){var n={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return fo(this,e=ft(this,e),e,n,"bookmark")},findMarksAt:function(e){var t=[],n=Qe(this,(e=ft(this,e)).line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(i,o,l){i=ft(this,i),o=ft(this,o);var s=[],a=i.line;return this.iter(i.line,o.line+1,function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;n++){var r=t[n];null!=r.to&&a==i.line&&i.ch>=r.to||null==r.from&&a!=i.line||null!=r.from&&a==o.line&&r.from>=o.ch||l&&!l(r.marker)||s.push(r.marker.parent||r.marker)}++a}),s},getAllMarks:function(){var r=[];return this.iter(function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;++n)null!=t[n].from&&r.push(t[n].marker)}),r},posFromIndex:function(n){var r,i=this.first,o=this.lineSeparator().length;return this.iter(function(e){var t=e.text.length+o;if(n<t)return r=n,!0;n-=t,++i}),ft(this,lt(i,r))},indexFromPos:function(e){var t=(e=ft(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var n=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+n}),t},copy:function(e){var t=new vo(et(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e=e||{};var t=this.first,n=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<n&&(n=e.to);var r=new vo(et(this,t,n),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(r.history=this.history),(this.linked||(this.linked=[])).push({doc:r,sharedHist:e.sharedHist}),r.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var n=0;n<t.length;n++){var r,i=t[n],o=i.find(),l=e.clipPos(o.from),s=e.clipPos(o.to);st(l,s)&&(r=fo(e,l,s,i.primary,i.primary.type),i.markers.push(r),r.parent=i)}}(r,go(this)),r},unlinkDoc:function(e){if(e instanceof pl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),function(o){for(var e=0;e<o.length;e++)!function(e){var t=o[e],n=[t.primary.doc];xi(t.primary.doc,function(e){return n.push(e)});for(var r=0;r<t.markers.length;r++){var i=t.markers[r];-1==B(n,i.doc)&&(i.parent=null,t.markers.splice(r--,1))}}(e)}(go(this));break}}var n;e.history==this.history&&(n=[e.id],xi(e,function(e){return n.push(e.id)},!0),e.history=new Li(null),e.history.done=Hi(this.history.done,n),e.history.undone=Hi(this.history.undone,n))},iterLinkedDocs:function(e){xi(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):Re(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:Vr(function(e){var t;"rtl"!=e&&(e="ltr"),e!=this.direction&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Br(t=this.cm,function(){Si(t),ir(t)}))})}),vo.prototype.eachLine=vo.prototype.iter;var yo=0;function bo(e){var r=this;if(wo(r),!Le(r,e)&&!bn(r.display,e)){Ne(e),L&&(yo=+new Date);var t=nr(r,e,!0),n=e.dataTransfer.files;if(t&&!r.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),l=0,s=function(){++l==i&&Gr(r,function(){var e={from:t=ft(r.doc,t),to:t,text:r.doc.splitLines(o.filter(function(e){return null!=e}).join(r.doc.lineSeparator())),origin:"paste"};qi(r.doc,e),zi(r.doc,di(ft(r.doc,t),ft(r.doc,fi(e))))})()},a=0;a<n.length;a++)!function(e,t){var n;r.options.allowDropFileTypes&&-1==B(r.options.allowDropFileTypes,e.type)?s():((n=new FileReader).onerror=s,n.onload=function(){var e=n.result;/[\x00-\x08\x0e-\x1f]{2}/.test(e)||(o[t]=e),s()},n.readAsText(e))}(n[a],a);else{if(r.state.draggingText&&-1<r.doc.sel.contains(t))return r.state.draggingText(e),void setTimeout(function(){return r.display.input.focus()},20);try{var u,c=e.dataTransfer.getData("Text");if(c){if(r.state.draggingText&&!r.state.draggingText.copy&&(u=r.listSelections()),Gi(r.doc,di(t,t)),u)for(var h=0;h<u.length;++h)to(r.doc,"",u[h].anchor,u[h].head,"drag");r.replaceSelection(c,"around","paste"),r.display.input.focus()}}catch(e){}}}}function wo(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function xo(t){if(document.getElementsByClassName){for(var e=document.getElementsByClassName("CodeMirror"),n=[],r=0;r<e.length;r++){var i=e[r].CodeMirror;i&&n.push(i)}n.length&&n[0].operation(function(){for(var e=0;e<n.length;e++)t(n[e])})}}var Co=!1;function So(){var e;Co||(we(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,xo(Lo)},100))}),we(window,"blur",function(){return xo(vr)}),Co=!0)}function Lo(e){var t=e.display;t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize()}for(var ko={3:"Pause",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",145:"ScrollLock",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",224:"Mod",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},To=0;To<10;To++)ko[To+48]=ko[To+96]=String(To);for(var Mo=65;Mo<=90;Mo++)ko[Mo]=String.fromCharCode(Mo);for(var No=1;No<=12;No++)ko[No+111]=ko[No+63235]="F"+No;var Ao={};function Oo(e){var t,n,r,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))n=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error("Unrecognized modifier name: "+s);r=!0}}return t&&(e="Alt-"+e),n&&(e="Ctrl-"+e),i&&(e="Cmd-"+e),r&&(e="Shift-"+e),e}function Do(e){var t={};for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(/^(name|fallthrough|(de|at)tach)$/.test(n))continue;if("..."==r){delete e[n];continue}for(var i=q(n.split(" "),Oo),o=0;o<i.length;o++){var l=void 0,s=void 0,l=o==i.length-1?(s=i.join(" "),r):(s=i.slice(0,o+1).join(" "),"..."),a=t[s];if(a){if(a!=l)throw new Error("Inconsistent bindings for "+s)}else t[s]=l}delete e[n]}for(var u in t)e[u]=t[u];return e}function Wo(e,t,n,r){var i=(t=Po(t)).call?t.call(e,r):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&n(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return Wo(e,t.fallthrough,n,r);for(var o=0;o<t.fallthrough.length;o++){var l=Wo(e,t.fallthrough[o],n,r);if(l)return l}}}function Ho(e){var t="string"==typeof e?e:ko[e.keyCode];return"Ctrl"==t||"Alt"==t||"Shift"==t||"Mod"==t}function Fo(e,t,n){var r=e;return t.altKey&&"Alt"!=r&&(e="Alt-"+e),(w?t.metaKey:t.ctrlKey)&&"Ctrl"!=r&&(e="Ctrl-"+e),(w?t.ctrlKey:t.metaKey)&&"Mod"!=r&&(e="Cmd-"+e),!n&&t.shiftKey&&"Shift"!=r&&(e="Shift-"+e),e}function Eo(e,t){if(m&&34==e.keyCode&&e.char)return!1;var n=ko[e.keyCode];return null!=n&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(n=e.code),Fo(n,e,t))}function Po(e){return"string"==typeof e?Ao[e]:e}function Io(t,e){for(var n=t.doc.sel.ranges,r=[],i=0;i<n.length;i++){for(var o=e(n[i]);r.length&&st(o.from,$(r).to)<=0;){var l=r.pop();if(st(l.from,o.from)<0){o.from=l.from;break}}r.push(o)}Br(t,function(){for(var e=r.length-1;0<=e;e--)to(t.doc,"",r[e].from,r[e].to,"+delete");Sr(t)})}function Ro(e,t,n){var r=oe(e.text,t+n,n);return r<0||r>e.text.length?null:r}function zo(e,t,n){var r=Ro(e,t.ch,n);return null==r?null:new lt(t.line,r,n<0?"after":"before")}function Bo(e,t,n,r,i){if(e){"rtl"==t.doc.direction&&(i=-i);var o=ye(n,t.doc.direction);if(o){var l,s,a,u=i<0?$(o):o[0],c=i<0==(1==u.level)?"after":"before";return 0<u.level||"rtl"==t.doc.direction?(l=An(t,n),s=i<0?n.text.length-1:0,a=On(t,l,s).top,s=le(function(e){return On(t,l,e).top==a},i<0==(1==u.level)?u.from:u.to-1,s),"before"==c&&(s=Ro(n,s,1))):s=i<0?u.to:u.from,new lt(r,s,c)}}return new lt(r,i<0?n.text.length:0,i<0?"before":"after")}function Go(t,n,s,e){var a=ye(n,t.doc.direction);if(!a)return zo(n,s,e);s.ch>=n.text.length?(s.ch=n.text.length,s.sticky="before"):s.ch<=0&&(s.ch=0,s.sticky="after");var r=ae(a,s.ch,s.sticky),i=a[r];if("ltr"==t.doc.direction&&i.level%2==0&&(0<e?i.to>s.ch:i.from<s.ch))return zo(n,s,e);function u(e,t){return Ro(n,e instanceof lt?e.ch:e,t)}function o(e){return t.options.lineWrapping?(l=l||An(t,n),_n(t,n,l,e)):{begin:0,end:n.text.length}}var l,c=o("before"==s.sticky?u(s,-1):s.ch);if("rtl"==t.doc.direction||1==i.level){var h=1==i.level==e<0,d=u(s,h?1:-1);if(null!=d&&(h?d<=i.to&&d<=c.end:d>=i.from&&d>=c.begin)){var f=h?"before":"after";return new lt(s.line,d,f)}}function p(e,t,n){for(var r=function(e,t){return t?new lt(s.line,u(e,1),"before"):new lt(s.line,e,"after")};0<=e&&e<a.length;e+=t){var i=a[e],o=0<t==(1!=i.level),l=o?n.begin:u(n.end,-1);if(i.from<=l&&l<i.to)return r(l,o);if(l=o?i.from:u(i.to,-1),n.begin<=l&&l<n.end)return r(l,o)}}var g=p(r+e,e,c);if(g)return g;var m=0<e?c.end:u(c.begin,-1);return null==m||0<e&&m==n.text.length||!(g=p(0<e?0:a.length-1,e,o(m)))?null:g}Ao.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Ao.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Ao.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Ao.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Ao.default=y?Ao.macDefault:Ao.pcDefault;var Uo={selectAll:_i,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(n){return Io(n,function(e){if(e.empty()){var t=Qe(n.doc,e.head.line).text.length;return e.head.ch==t&&e.head.line<n.lastLine()?{from:e.head,to:lt(e.head.line+1,0)}:{from:e.head,to:lt(e.head.line,t)}}return{from:e.from(),to:e.to()}})},deleteLine:function(t){return Io(t,function(e){return{from:lt(e.from().line,0),to:ft(t.doc,lt(e.to().line+1,0))}})},delLineLeft:function(e){return Io(e,function(e){return{from:lt(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(n){return Io(n,function(e){var t=n.charCoords(e.head,"div").top+5;return{from:n.coordsChar({left:0,top:t},"div"),to:e.from()}})},delWrappedLineRight:function(r){return Io(r,function(e){var t=r.charCoords(e.head,"div").top+5,n=r.coordsChar({left:r.display.lineDiv.offsetWidth+100,top:t},"div");return{from:e.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(lt(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(lt(e.lastLine()))},goLineStart:function(t){return t.extendSelectionsBy(function(e){return Vo(t,e.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(t){return t.extendSelectionsBy(function(e){return Ko(t,e.head)},{origin:"+move",bias:1})},goLineEnd:function(t){return t.extendSelectionsBy(function(e){return function(e,t){var n=Qe(e.doc,t),r=function(e){for(var t;t=Bt(e);)e=t.find(1,!0).line;return e}(n);r!=n&&(t=nt(r));return Bo(!0,e,n,t,-1)}(t,e.head.line)},{origin:"+move",bias:-1})},goLineRight:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:n.display.lineDiv.offsetWidth+100,top:t},"div")},j)},goLineLeft:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:0,top:t},"div")},j)},goLineLeftSmart:function(r){return r.extendSelectionsBy(function(e){var t=r.cursorCoords(e.head,"div").top+5,n=r.coordsChar({left:0,top:t},"div");return n.ch<r.getLine(n.line).search(/\S/)?Ko(r,e.head):n},j)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"codepoint")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],n=e.listSelections(),r=e.options.tabSize,i=0;i<n.length;i++){var o=n[i].from(),l=R(e.getLine(o.line),o.ch,r);t.push(_(r-l%r))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(l){return Br(l,function(){for(var e,t,n,r=l.listSelections(),i=[],o=0;o<r.length;o++){r[o].empty()&&(e=r[o].head,(t=Qe(l.doc,e.line).text)&&(e.ch==t.length&&(e=new lt(e.line,e.ch-1)),0<e.ch?(e=new lt(e.line,e.ch+1),l.replaceRange(t.charAt(e.ch-1)+t.charAt(e.ch-2),lt(e.line,e.ch-2),e,"+transpose")):e.line>l.doc.first&&((n=Qe(l.doc,e.line-1).text)&&(e=new lt(e.line,1),l.replaceRange(t.charAt(0)+l.doc.lineSeparator()+n.charAt(n.length-1),lt(e.line-1,n.length-1),e,"+transpose")))),i.push(new ci(e,e)))}l.setSelections(i)})},newlineAndIndent:function(r){return Br(r,function(){for(var e=r.listSelections(),t=e.length-1;0<=t;t--)r.replaceRange(r.doc.lineSeparator(),e[t].anchor,e[t].head,"+input");e=r.listSelections();for(var n=0;n<e.length;n++)r.indentLine(e[n].from().line,null,!0);Sr(r)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function Vo(e,t){var n=Qe(e.doc,t),r=Ut(n);return r!=n&&(t=nt(r)),Bo(!0,e,r,t,1)}function Ko(e,t){var n=Vo(e,t.line),r=Qe(e.doc,n.line),i=ye(r,e.doc.direction);if(i&&0!=i[0].level)return n;var o=Math.max(n.ch,r.text.search(/\S/)),l=t.line==n.line&&t.ch<=o&&t.ch;return lt(n.line,l?0:o,n.sticky)}function jo(e,t,n){if("string"==typeof t&&!(t=Uo[t]))return!1;e.display.input.ensurePolled();var r=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}var Xo=new z;function Yo(e,t,n,r){var i=e.state.keySeq;if(i){if(Ho(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:Xo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),_o(e,i+" "+t,n,r))return!0}return _o(e,t,n,r)}function _o(e,t,n,r){var i=function(e,t,n){for(var r=0;r<e.state.keyMaps.length;r++){var i=Wo(t,e.state.keyMaps[r],n,e);if(i)return i}return e.options.extraKeys&&Wo(t,e.options.extraKeys,n,e)||Wo(t,e.options.keyMap,n,e)}(e,t,r);return"multi"==i&&(e.state.keySeq=t),"handled"==i&&un(e,"keyHandled",e,t,n),"handled"!=i&&"multi"!=i||(Ne(n),fr(e)),!!i}function $o(t,e){var n=Eo(e,!0);return!!n&&(e.shiftKey&&!t.state.keySeq?Yo(t,"Shift-"+n,e,function(e){return jo(t,e,!0)})||Yo(t,n,e,function(e){if("string"==typeof e?/^go[A-Z]/.test(e):e.motion)return jo(t,e)}):Yo(t,n,e,function(e){return jo(t,e)}))}var qo=null;function Zo(e){var t,n,r,i=this;function o(e){18!=e.keyCode&&e.altKey||(T(r,"CodeMirror-crosshair"),Ce(document,"keyup",o),Ce(document,"mouseover",o))}e.target&&e.target!=i.display.input.getField()||(i.curOp.focus=W(),Le(i,e)||(L&&x<11&&27==e.keyCode&&(e.returnValue=!1),t=e.keyCode,i.display.shift=16==t||e.shiftKey,n=$o(i,e),m&&(qo=n?t:null,!n&&88==t&&!Be&&(y?e.metaKey:e.ctrlKey)&&i.replaceSelection("",null,"cut")),g&&!y&&!n&&46==t&&e.shiftKey&&!e.ctrlKey&&document.execCommand&&document.execCommand("cut"),18!=t||/\bCodeMirror-crosshair\b/.test(i.display.lineDiv.className)||(H(r=i.display.lineDiv,"CodeMirror-crosshair"),we(document,"keyup",o),we(document,"mouseover",o))))}function Qo(e){16==e.keyCode&&(this.doc.sel.shift=!1),Le(this,e)}function Jo(e){var t=this;if(!(e.target&&e.target!=t.display.input.getField()||bn(t.display,e)||Le(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var n,r,i=e.keyCode,o=e.charCode;if(m&&i==qo)return qo=null,void Ne(e);m&&(!e.which||e.which<10)&&$o(t,e)||"\b"!=(n=String.fromCharCode(null==o?i:o))&&(Yo(r=t,"'"+n+"'",e,function(e){return jo(r,e,!0)})||t.display.input.onKeyPress(e))}}var el,tl,nl=function(e,t,n){this.time=e,this.pos=t,this.button=n};function rl(e){var t,n,r,i,o,l,s=this,a=s.display;Le(s,e)||a.activeTouch&&a.input.supportsTouch()||(a.input.ensurePolled(),a.shift=e.shiftKey,bn(a,e)?v||(a.scroller.draggable=!1,setTimeout(function(){return a.scroller.draggable=!0},100)):ll(s,e)||(t=nr(s,e),n=He(e),r=t?(i=t,o=n,l=+new Date,tl&&tl.compare(l,i,o)?(el=tl=null,"triple"):el&&el.compare(l,i,o)?(tl=new nl(l,i,o),el=null,"double"):(el=new nl(l,i,o),tl=null,"single")):"single",window.focus(),1==n&&s.state.selectingText&&s.state.selectingText(e),t&&function(n,e,r,t,i){var o="Click";"double"==t?o="Double"+o:"triple"==t&&(o="Triple"+o);return Yo(n,Fo(o=(1==e?"Left":2==e?"Middle":"Right")+o,i),i,function(e){if("string"==typeof e&&(e=Uo[e]),!e)return!1;var t=!1;try{n.isReadOnly()&&(n.state.suppressEdits=!0),t=e(n,r)!=U}finally{n.state.suppressEdits=!1}return t})}(s,n,t,r,e)||(1==n?t?function(e,t,n,r){L?setTimeout(P(pr,e),0):e.curOp.focus=W();var i,o=function(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};{var o;null==i.unit&&(o=f?n.shiftKey&&n.metaKey:n.altKey,i.unit=o?"rectangle":"single"==t?"char":"double"==t?"word":"line")}null!=i.extend&&!e.doc.extend||(i.extend=e.doc.extend||n.shiftKey);null==i.addNew&&(i.addNew=y?n.metaKey:n.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?n.altKey:n.ctrlKey));return i}(e,n,r),l=e.doc.sel;(e.options.dragDrop&&Pe&&!e.isReadOnly()&&"single"==n&&-1<(i=l.contains(t))&&(st((i=l.ranges[i]).from(),t)<0||0<t.xRel)&&(0<st(i.to(),t)||t.xRel<0)?function(t,n,r,i){var o=t.display,l=!1,s=Gr(t,function(e){v&&(o.scroller.draggable=!1),t.state.draggingText=!1,t.state.delayingBlurEvent&&(t.hasFocus()?t.state.delayingBlurEvent=!1:gr(t)),Ce(o.wrapper.ownerDocument,"mouseup",s),Ce(o.wrapper.ownerDocument,"mousemove",a),Ce(o.scroller,"dragstart",u),Ce(o.scroller,"drop",s),l||(Ne(e),i.addNew||Ei(t.doc,r,null,null,i.extend),v&&!c||L&&9==x?setTimeout(function(){o.wrapper.ownerDocument.body.focus({preventScroll:!0}),o.input.focus()},20):o.input.focus())}),a=function(e){l=l||10<=Math.abs(n.clientX-e.clientX)+Math.abs(n.clientY-e.clientY)},u=function(){return l=!0};v&&(o.scroller.draggable=!0);(t.state.draggingText=s).copy=!i.moveOnDrag,we(o.wrapper.ownerDocument,"mouseup",s),we(o.wrapper.ownerDocument,"mousemove",a),we(o.scroller,"dragstart",u),we(o.scroller,"drop",s),t.state.delayingBlurEvent=!0,setTimeout(function(){return o.input.focus()},20),o.scroller.dragDrop&&o.scroller.dragDrop()}:function(m,e,v,y){L&&gr(m);var l=m.display,b=m.doc;Ne(e);var w,x,C=b.sel,t=C.ranges;y.addNew&&!y.extend?(x=b.sel.contains(v),w=-1<x?t[x]:new ci(v,v)):(w=b.sel.primary(),x=b.sel.primIndex);{var n;"rectangle"==y.unit?(y.addNew||(w=new ci(v,v)),v=nr(m,e,!0,!0),x=-1):(n=il(m,v,y.unit),w=y.extend?Fi(w,n.anchor,n.head,y.extend):n)}y.addNew?-1==x?(x=t.length,Bi(b,hi(m,t.concat([w]),x),{scroll:!1,origin:"*mouse"})):1<t.length&&t[x].empty()&&"char"==y.unit&&!y.extend?(Bi(b,hi(m,t.slice(0,x).concat(t.slice(x+1)),0),{scroll:!1,origin:"*mouse"}),C=b.sel):Ii(b,x,w,K):(Bi(b,new ui([w],x=0),K),C=b.sel);var S=v;function s(e){if(0!=st(S,e))if(S=e,"rectangle"==y.unit){for(var t=[],n=m.options.tabSize,r=R(Qe(b,v.line).text,v.ch,n),i=R(Qe(b,e.line).text,e.ch,n),o=Math.min(r,i),l=Math.max(r,i),s=Math.min(v.line,e.line),a=Math.min(m.lastLine(),Math.max(v.line,e.line));s<=a;s++){var u=Qe(b,s).text,c=X(u,o,n);o==l?t.push(new ci(lt(s,c),lt(s,c))):u.length>c&&t.push(new ci(lt(s,c),lt(s,X(u,l,n))))}t.length||t.push(new ci(v,v)),Bi(b,hi(m,C.ranges.slice(0,x).concat(t),x),{origin:"*mouse",scroll:!1}),m.scrollIntoView(e)}else{var h,d=w,f=il(m,e,y.unit),p=d.anchor,p=0<st(f.anchor,p)?(h=f.head,ht(d.from(),f.anchor)):(h=f.anchor,ct(d.to(),f.head)),g=C.ranges.slice(0);g[x]=function(e,t){var n=t.anchor,r=t.head,i=Qe(e.doc,n.line);if(0==st(n,r)&&n.sticky==r.sticky)return t;var o=ye(i);if(!o)return t;var l=ae(o,n.ch,n.sticky),s=o[l];if(s.from!=n.ch&&s.to!=n.ch)return t;var a,u=l+(s.from==n.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;{var c,h;a=r.line!=n.line?0<(r.line-n.line)*("ltr"==e.doc.direction?1:-1):(c=ae(o,r.ch,r.sticky),h=c-l||(r.ch-n.ch)*(1==s.level?-1:1),c==u-1||c==u?h<0:0<h)}var d=o[u+(a?-1:0)],f=a==(1==d.level),p=f?d.from:d.to,g=f?"after":"before";return n.ch==p&&n.sticky==g?t:new ci(new lt(n.line,p,g),r)}(m,new ci(ft(b,p),h)),Bi(b,hi(m,g,x),K)}}var a=l.wrapper.getBoundingClientRect(),u=0;function r(e){m.state.selectingText=!1,u=1/0,e&&(Ne(e),l.input.focus()),Ce(l.wrapper.ownerDocument,"mousemove",i),Ce(l.wrapper.ownerDocument,"mouseup",o),b.history.lastSelOrigin=null}var i=Gr(m,function(e){(0!==e.buttons&&He(e)?function e(t){var n,r,i=++u,o=nr(m,t,!0,"rectangle"==y.unit);o&&(0!=st(o,S)?(m.curOp.focus=W(),s(o),n=wr(l,b),(o.line>=n.to||o.line<n.from)&&setTimeout(Gr(m,function(){u==i&&e(t)}),150)):(r=t.clientY<a.top?-20:t.clientY>a.bottom?20:0)&&setTimeout(Gr(m,function(){u==i&&(l.scroller.scrollTop+=r,e(t))}),50))}:r)(e)}),o=Gr(m,r);m.state.selectingText=o,we(l.wrapper.ownerDocument,"mousemove",i),we(l.wrapper.ownerDocument,"mouseup",o)})(e,r,t,o)}(s,t,r,e):We(e)==a.scroller&&Ne(e):2==n?(t&&Ei(s.doc,t),setTimeout(function(){return a.input.focus()},20)):3==n&&(C?s.display.input.onContextMenu(e):gr(s)))))}function il(e,t,n){if("char"==n)return new ci(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new ci(lt(t.line,0),ft(e.doc,lt(t.line+1,0)));var r=n(e,t);return new ci(r.from,r.to)}function ol(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(e){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Ne(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!Te(e,n))return Oe(t);o-=s.top-l.viewOffset;for(var a=0;a<e.display.gutterSpecs.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return Se(e,n,e,rt(e.doc,o),e.display.gutterSpecs[a].className,t),Oe(t)}}function ll(e,t){return ol(e,t,"gutterClick",!0)}function sl(e,t){var n,r;bn(e.display,t)||(r=t,Te(n=e,"gutterContextMenu")&&ol(n,r,"gutterContextMenu",!1))||Le(e,t,"contextmenu")||C||e.display.input.onContextMenu(t)}function al(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Pn(e)}nl.prototype.compare=function(e,t,n){return this.time+400>e&&0==st(t,this.pos)&&n==this.button};var ul={toString:function(){return"CodeMirror.Init"}},cl={},hl={};function dl(e,t,n){var r,i;!t!=!(n&&n!=ul)&&(r=e.display.dragFunctions,(i=t?we:Ce)(e.display.scroller,"dragstart",r.start),i(e.display.scroller,"dragenter",r.enter),i(e.display.scroller,"dragover",r.over),i(e.display.scroller,"dragleave",r.leave),i(e.display.scroller,"drop",r.drop))}function fl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),_t(e)),tr(e),ir(e),Pn(e),setTimeout(function(){return Hr(e)},100)}function pl(e,t){var n=this;if(!(this instanceof pl))return new pl(e,t);this.options=t=t?I(t):{},I(cl,t,!1);var r=t.value;"string"==typeof r?r=new vo(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new pl.inputStyles[t.inputStyle](this),o=this.display=new ri(e,r,i,t);for(var l in al(o.wrapper.CodeMirror=this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Pr(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new z,keySeq:null,specialChars:null},t.autofocus&&!d&&o.input.focus(),L&&x<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(i){var o=i.display;we(o.scroller,"mousedown",Gr(i,rl)),we(o.scroller,"dblclick",L&&x<11?Gr(i,function(e){var t,n;Le(i,e)||(!(t=nr(i,e))||ll(i,e)||bn(i.display,e)||(Ne(e),n=i.findWordAt(t),Ei(i.doc,n.anchor,n.head)))}):function(e){return Le(i,e)||Ne(e)});we(o.scroller,"contextmenu",function(e){return sl(i,e)}),we(o.input.getField(),"contextmenu",function(e){o.scroller.contains(e.target)||sl(i,e)});var n,r={end:0};function l(){o.activeTouch&&(n=setTimeout(function(){return o.activeTouch=null},1e3),(r=o.activeTouch).end=+new Date)}function s(e,t){if(null==t.left)return 1;var n=t.left-e.left,r=t.top-e.top;return 400<n*n+r*r}we(o.scroller,"touchstart",function(e){var t;Le(i,e)||function(e){if(1==e.touches.length){var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}}(e)||ll(i,e)||(o.input.ensurePolled(),clearTimeout(n),t=+new Date,o.activeTouch={start:t,moved:!1,prev:t-r.end<=300?r:null},1==e.touches.length&&(o.activeTouch.left=e.touches[0].pageX,o.activeTouch.top=e.touches[0].pageY))}),we(o.scroller,"touchmove",function(){o.activeTouch&&(o.activeTouch.moved=!0)}),we(o.scroller,"touchend",function(e){var t,n,r=o.activeTouch;r&&!bn(o,e)&&null!=r.left&&!r.moved&&new Date-r.start<300&&(t=i.coordsChar(o.activeTouch,"page"),n=!r.prev||s(r,r.prev)?new ci(t,t):!r.prev.prev||s(r,r.prev.prev)?i.findWordAt(t):new ci(lt(t.line,0),ft(i.doc,lt(t.line+1,0))),i.setSelection(n.anchor,n.head),i.focus(),Ne(e)),l()}),we(o.scroller,"touchcancel",l),we(o.scroller,"scroll",function(){o.scroller.clientHeight&&(Mr(i,o.scroller.scrollTop),Ar(i,o.scroller.scrollLeft,!0),Se(i,"scroll",i))}),we(o.scroller,"mousewheel",function(e){return ai(i,e)}),we(o.scroller,"DOMMouseScroll",function(e){return ai(i,e)}),we(o.wrapper,"scroll",function(){return o.wrapper.scrollTop=o.wrapper.scrollLeft=0}),o.dragFunctions={enter:function(e){Le(i,e)||De(e)},over:function(e){var t,n,r;Le(i,e)||((r=nr(t=i,e))&&(hr(t,r,n=document.createDocumentFragment()),t.display.dragCursor||(t.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),t.display.lineSpace.insertBefore(t.display.dragCursor,t.display.cursorDiv)),N(t.display.dragCursor,n)),De(e))},start:function(e){return t=i,n=e,void(L&&(!t.state.draggingText||new Date-yo<100)?De(n):Le(t,n)||bn(t.display,n)||(n.dataTransfer.setData("Text",t.getSelection()),n.dataTransfer.effectAllowed="copyMove",n.dataTransfer.setDragImage&&!c&&((r=O("img",null,null,"position: fixed; left: 0; top: 0;")).src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",m&&(r.width=r.height=1,t.display.wrapper.appendChild(r),r._top=r.offsetTop),n.dataTransfer.setDragImage(r,0,0),m&&r.parentNode.removeChild(r))));var t,n,r},drop:Gr(i,bo),leave:function(e){Le(i,e)||wo(i)}};var e=o.input.getField();we(e,"keyup",function(e){return Qo.call(i,e)}),we(e,"keydown",Gr(i,Zo)),we(e,"keypress",Gr(i,Jo)),we(e,"focus",function(e){return mr(i,e)}),we(e,"blur",function(e){return vr(i,e)})}(this),So(),Rr(this),this.curOp.forceUpdate=!0,Ci(this,r),t.autofocus&&!d||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&mr(n)},20):vr(this),hl)hl.hasOwnProperty(l)&&hl[l](this,t[l],ul);Jr(this),t.finishInit&&t.finishInit(this);for(var s=0;s<gl.length;++s)gl[s](this);zr(this),v&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(o.lineDiv).textRendering&&(o.lineDiv.style.textRendering="auto")}pl.defaults=cl,pl.optionHandlers=hl;var gl=[];function ml(e,t,n,r){var i,o=e.doc;null==n&&(n="add"),"smart"==n&&(o.mode.indent?i=bt(e,t).state:n="prev");var l=e.options.tabSize,s=Qe(o,t),a=R(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(r||/\S/.test(s.text)){if("smart"==n&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||150<u)){if(!r)return;n="prev"}}else u=0,n="not";"prev"==n?u=t>o.first?R(Qe(o,t-1).text,null,l):0:"add"==n?u=a+e.options.indentUnit:"subtract"==n?u=a-e.options.indentUnit:"number"==typeof n&&(u=a+n),u=Math.max(0,u);var h="",d=0;if(e.options.indentWithTabs)for(var f=Math.floor(u/l);f;--f)d+=l,h+="\t";if(d<u&&(h+=_(u-d)),h!=c)return to(o,h,lt(t,0),lt(t,c.length),"+input"),!(s.stateAfter=null);for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var m=lt(t,c.length);Ii(o,p,new ci(m,m));break}}}pl.defineInitHook=function(e){return gl.push(e)};var vl=null;function yl(e){vl=e}function bl(e,t,n,r,i){var o=e.doc;e.display.shift=!1,r=r||o.sel;var l=new Date-200,s="paste"==i||e.state.pasteIncoming>l,a=Re(t),u=null;if(s&&1<r.ranges.length)if(vl&&vl.text.join("\n")==t){if(r.ranges.length%vl.text.length==0){u=[];for(var c=0;c<vl.text.length;c++)u.push(o.splitLines(vl.text[c]))}}else a.length==r.ranges.length&&e.options.pasteLinesPerSelection&&(u=q(a,function(e){return[e]}));for(var h=e.curOp.updateInput,d=r.ranges.length-1;0<=d;d--){var f=r.ranges[d],p=f.from(),g=f.to();f.empty()&&(n&&0<n?p=lt(p.line,p.ch-n):e.state.overwrite&&!s?g=lt(g.line,Math.min(Qe(o,g.line).text.length,g.ch+$(a).length)):s&&vl&&vl.lineWise&&vl.text.join("\n")==a.join("\n")&&(p=g=lt(p.line,0)));var m={from:p,to:g,text:u?u[d%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};qi(e.doc,m),un(e,"inputRead",e,m)}t&&!s&&xl(e,t),Sr(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function wl(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");return n&&(e.preventDefault(),t.isReadOnly()||t.options.disableInput||Br(t,function(){return bl(t,n,0,null,"paste")}),1)}function xl(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;0<=r;r--){var i=n.ranges[r];if(!(100<i.head.ch||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(-1<t.indexOf(o.electricChars.charAt(s))){l=ml(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Qe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=ml(e,i.head.line,"smart"));l&&un(e,"electricInput",e,i.head.line)}}}function Cl(e){for(var t=[],n=[],r=0;r<e.doc.sel.ranges.length;r++){var i=e.doc.sel.ranges[r].head.line,o={anchor:lt(i,0),head:lt(i+1,0)};n.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:n}}function Sl(e,t,n,r){e.setAttribute("autocorrect",n?"":"off"),e.setAttribute("autocapitalize",r?"":"off"),e.setAttribute("spellcheck",!!t)}function Ll(){var e=O("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=O("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return v?e.style.width="1000px":e.setAttribute("wrap","off"),a&&(e.style.border="1px solid black"),Sl(e),t}function kl(i,o,l,s,a){var e=o,t=l,u=Qe(i,o.line),c=a&&"rtl"==i.direction?-l:l;function n(e){var t,n,r;if(null==(n="codepoint"==s?(t=u.text.charCodeAt(o.ch+(0<s?0:-1)),isNaN(t)?null:new lt(o.line,Math.max(0,Math.min(u.text.length,o.ch+l*(55296<=t&&t<56320?2:1))),-l)):a?Go(i.cm,u,o,l):zo(u,o,l))){if(e||(r=o.line+c)<i.first||r>=i.first+i.size||(o=new lt(r,o.ch,o.sticky),!(u=Qe(i,r))))return;o=Bo(a,i.cm,u,o.line,c)}else o=n;return 1}if("char"==s||"codepoint"==s)n();else if("column"==s)n(!0);else if("word"==s||"group"==s)for(var r=null,h="group"==s,d=i.cm&&i.cm.getHelper(o,"wordChars"),f=!0;!(l<0)||n(!f);f=!1){var p=u.text.charAt(o.ch)||"\n",g=te(p,d)?"w":h&&"\n"==p?"n":!h||/\s/.test(p)?null:"p";if(!h||f||g||(g="s"),r&&r!=g){l<0&&(l=1,n(),o.sticky="after");break}if(g&&(r=g),0<l&&!n(!f))break}var m=Xi(i,o,e,t,!0);return at(e,m)&&(m.hitSide=!0),m}function Tl(e,t,n,r){var i,o,l,s,a=e.doc,u=t.left;for("page"==r?(i=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),o=Math.max(i-.5*qn(e.display),3),l=(0<n?t.bottom:t.top)+n*o):"line"==r&&(l=0<n?t.bottom+3:t.top-3);(s=Xn(e,u,l)).outside;){if(n<0?l<=0:l>=a.height){s.hitSide=!0;break}l+=5*n}return s}function Ml(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new z,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null}function Nl(e,t){var n=Nn(e,t.line);if(!n||n.hidden)return null;var r=Qe(e.doc,t.line),i=Tn(n,r,t.line),o=ye(r,e.doc.direction),l="left";o&&(l=ae(o,t.ch)%2?"right":"left");var s=Hn(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function Al(e,t){return t&&(e.bad=!0),e}function Ol(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Al(e.clipPos(lt(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==r)return function(u,e,t){var n=u.text.firstChild,r=!1;if(!e||!D(n,e))return Al(lt(nt(u.line),0),!0);if(e==n&&(r=!0,e=n.childNodes[t],t=0,!e)){var i=u.rest?$(u.rest):u.line;return Al(lt(nt(i),i.text.length),r)}var o=3==e.nodeType?e:null,l=e;o||1!=e.childNodes.length||3!=e.firstChild.nodeType||(o=e.firstChild,t=t&&o.nodeValue.length);for(;l.parentNode!=n;)l=l.parentNode;var c=u.measure,h=c.maps;function s(e,t,n){for(var r=-1;r<(h?h.length:0);r++)for(var i=r<0?c.map:h[r],o=0;o<i.length;o+=3){var l=i[o+2];if(l==e||l==t){var s=nt(r<0?u.line:u.rest[r]),a=i[o]+n;return(n<0||l!=e)&&(a=i[o+(n?1:0)]),lt(s,a)}}}var a=s(o,l,t);if(a)return Al(a,r);for(var d=l.nextSibling,f=o?o.nodeValue.length-t:0;d;d=d.nextSibling){if(a=s(d,d.firstChild,0))return Al(lt(a.line,a.ch-f),r);f+=d.textContent.length}for(var p=l.previousSibling,g=t;p;p=p.previousSibling){if(a=s(p,p.firstChild,-1))return Al(lt(a.line,a.ch+g),r);g+=p.textContent.length}}(o,t,n)}}Ml.prototype.init=function(e){var t=this,l=this,s=l.cm,a=l.div=e.lineDiv;function u(e){for(var t=e.target;t;t=t.parentNode){if(t==a)return 1;if(/\bCodeMirror-(?:line)?widget\b/.test(t.className))break}}function n(e){if(u(e)&&!Le(s,e)){if(s.somethingSelected())yl({lineWise:!1,text:s.getSelections()}),"cut"==e.type&&s.replaceSelection("",null,"cut");else{if(!s.options.lineWiseCopyCut)return;var t=Cl(s);yl({lineWise:!0,text:t.text}),"cut"==e.type&&s.operation(function(){s.setSelections(t.ranges,0,V),s.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var n=vl.text.join("\n");if(e.clipboardData.setData("Text",n),e.clipboardData.getData("Text")==n)return void e.preventDefault()}var r=Ll(),i=r.firstChild;s.display.lineSpace.insertBefore(r,s.display.lineSpace.firstChild),i.value=vl.text.join("\n");var o=document.activeElement;E(i),setTimeout(function(){s.display.lineSpace.removeChild(r),o.focus(),o==a&&l.showPrimarySelection()},50)}}Sl(a,s.options.spellcheck,s.options.autocorrect,s.options.autocapitalize),we(a,"paste",function(e){!u(e)||Le(s,e)||wl(e,s)||x<=11&&setTimeout(Gr(s,function(){return t.updateFromDOM()}),20)}),we(a,"compositionstart",function(e){t.composing={data:e.data,done:!1}}),we(a,"compositionupdate",function(e){t.composing||(t.composing={data:e.data,done:!1})}),we(a,"compositionend",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),we(a,"touchstart",function(){return l.forceCompositionEnd()}),we(a,"input",function(){t.composing||t.readFromDOMSoon()}),we(a,"copy",n),we(a,"cut",n)},Ml.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},Ml.prototype.prepareSelection=function(){var e=cr(this.cm,!1);return e.focus=document.activeElement==this.div,e},Ml.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Ml.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},Ml.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line<t.display.viewFrom)e.removeAllRanges();else{var o=Ol(t,e.anchorNode,e.anchorOffset),l=Ol(t,e.focusNode,e.focusOffset);if(!o||o.bad||!l||l.bad||0!=st(ht(o,l),r)||0!=st(ct(o,l),i)){var s,a,u=t.display.view,c=r.line>=t.display.viewFrom&&Nl(t,r)||{node:u[0].measure.map[2],offset:0},h=i.line<t.display.viewTo&&Nl(t,i);if(h||(h={node:(a=(s=u[u.length-1].measure).maps?s.maps[s.maps.length-1]:s.map)[a.length-1],offset:a[a.length-2]-a[a.length-3]}),c&&h){var d,f=e.rangeCount&&e.getRangeAt(0);try{d=k(c.node,c.offset,h.offset,h.node)}catch(e){}d&&(!g&&t.state.focused?(e.collapse(c.node,c.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),f&&null==e.anchorNode?e.addRange(f):g&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Ml.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Ml.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Ml.prototype.rememberSelection=function(){var e=this.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Ml.prototype.selectionInEditor=function(){var e=this.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Ml.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()&&document.activeElement==this.div||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Ml.prototype.blur=function(){this.div.blur()},Ml.prototype.getField=function(){return this.div},Ml.prototype.supportsTouch=function(){return!0},Ml.prototype.receivedFocus=function(){var t=this;this.selectionInEditor()?this.pollSelection():Br(this.cm,function(){return t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))})},Ml.prototype.selectionChanged=function(){var e=this.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Ml.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e,t,n=this.getSelection(),r=this.cm;if(h&&l&&this.cm.display.gutterSpecs.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(n.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();this.composing||(this.rememberSelection(),e=Ol(r,n.anchorNode,n.anchorOffset),t=Ol(r,n.focusNode,n.focusOffset),e&&t&&Br(r,function(){Bi(r.doc,di(e,t),V),(e.bad||t.bad)&&(r.curOp.selectionChanged=!0)}))}},Ml.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,n,r=this.cm,i=r.display,o=r.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>r.firstLine()&&(l=lt(l.line-1,Qe(r.doc,l.line-1).length)),s.ch==Qe(r.doc,s.line).text.length&&s.line<r.lastLine()&&(s=lt(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;n=l.line==i.viewFrom||0==(e=rr(r,l.line))?(t=nt(i.view[0].line),i.view[0].node):(t=nt(i.view[e].line),i.view[e-1].node.nextSibling);var a,u=rr(r,s.line),c=u==i.view.length-1?(a=i.viewTo-1,i.lineDiv.lastChild):(a=nt(i.view[u+1].line)-1,i.view[u+1].node.previousSibling);if(!n)return!1;for(var h=r.doc.splitLines(function(u,e,t,c,h){var n="",d=!1,f=u.doc.lineSeparator(),p=!1;function g(){d&&(n+=f,p&&(n+=f),d=p=!1)}function m(e){e&&(g(),n+=e)}for(;!function e(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)return void m(n);var r,i=t.getAttribute("cm-marker");if(i){var o=u.findMarks(lt(c,0),lt(h+1,0),(a=+i,function(e){return e.id==a}));return void(o.length&&(r=o[0].find(0))&&m(Je(u.doc,r.from,r.to).join(f)))}if("false"==t.getAttribute("contenteditable"))return;var l=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;l&&g();for(var s=0;s<t.childNodes.length;s++)e(t.childNodes[s]);/^(pre|p)$/i.test(t.nodeName)&&(p=!0),l&&(d=!0)}else 3==t.nodeType&&m(t.nodeValue.replace(/\u200b/g,"").replace(/\u00a0/g," "));var a}(e),e!=t;)e=e.nextSibling,p=!1;return n}(r,n,c,t,a)),d=Je(r.doc,lt(t,0),lt(a,Qe(r.doc,a).text.length));1<h.length&&1<d.length;)if($(h)==$(d))h.pop(),d.pop(),a--;else{if(h[0]!=d[0])break;h.shift(),d.shift(),t++}for(var f=0,p=0,g=h[0],m=d[0],v=Math.min(g.length,m.length);f<v&&g.charCodeAt(f)==m.charCodeAt(f);)++f;for(var y=$(h),b=$(d),w=Math.min(y.length-(1==h.length?f:0),b.length-(1==d.length?f:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==d.length&&t==l.line)for(;f&&f>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)f--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(f).replace(/\u200b+$/,"");var x=lt(t,f),C=lt(a,d.length?$(d).length-p:0);return 1<h.length||h[0]||st(x,C)?(to(r.doc,h,x,C,"+input"),!0):void 0},Ml.prototype.ensurePolled=function(){this.forceCompositionEnd()},Ml.prototype.reset=function(){this.forceCompositionEnd()},Ml.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Ml.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Ml.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Br(this.cm,function(){return ir(e.cm)})},Ml.prototype.setUneditable=function(e){e.contentEditable="false"},Ml.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Gr(this.cm,bl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Ml.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Ml.prototype.onContextMenu=function(){},Ml.prototype.resetPosition=function(){},Ml.prototype.needsContentAttribute=!0;function Dl(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new z,this.hasSelection=!1,this.composing=null}var Wl,Hl,Fl,El,Pl;function Il(e,t,r,n){Wl.defaults[e]=t,r&&(Hl[e]=n?function(e,t,n){n!=ul&&r(e,t,n)}:r)}Dl.prototype.init=function(n){var e=this,r=this,i=this.cm;this.createField(n);var o=this.textarea;function t(e){if(!Le(i,e)){if(i.somethingSelected())yl({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=Cl(i);yl({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,V):(r.prevInput="",o.value=t.text.join("\n"),E(o))}"cut"==e.type&&(i.state.cutIncoming=+new Date)}}n.wrapper.insertBefore(this.wrapper,n.wrapper.firstChild),a&&(o.style.width="0px"),we(o,"input",function(){L&&9<=x&&e.hasSelection&&(e.hasSelection=null),r.poll()}),we(o,"paste",function(e){Le(i,e)||wl(e,i)||(i.state.pasteIncoming=+new Date,r.fastPoll())}),we(o,"cut",t),we(o,"copy",t),we(n.scroller,"paste",function(e){if(!bn(n,e)&&!Le(i,e)){if(!o.dispatchEvent)return i.state.pasteIncoming=+new Date,void r.focus();var t=new Event("paste");t.clipboardData=e.clipboardData,o.dispatchEvent(t)}}),we(n.lineSpace,"selectstart",function(e){bn(n,e)||Ne(e)}),we(o,"compositionstart",function(){var e=i.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}}),we(o,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Dl.prototype.createField=function(e){this.wrapper=Ll(),this.textarea=this.wrapper.firstChild},Dl.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},Dl.prototype.prepareSelection=function(){var e,t,n,r=this.cm,i=r.display,o=r.doc,l=cr(r);return r.options.moveInputWithCursor&&(e=Vn(r,o.sel.primary().head,"div"),t=i.wrapper.getBoundingClientRect(),n=i.lineDiv.getBoundingClientRect(),l.teTop=Math.max(0,Math.min(i.wrapper.clientHeight-10,e.top+n.top-t.top)),l.teLeft=Math.max(0,Math.min(i.wrapper.clientWidth-10,e.left+n.left-t.left))),l},Dl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Dl.prototype.reset=function(e){var t,n;this.contextMenuPending||this.composing||((t=this.cm).somethingSelected()?(this.prevInput="",n=t.getSelection(),this.textarea.value=n,t.state.focused&&E(this.textarea),L&&9<=x&&(this.hasSelection=n)):e||(this.prevInput=this.textarea.value="",L&&9<=x&&(this.hasSelection=null)))},Dl.prototype.getField=function(){return this.textarea},Dl.prototype.supportsTouch=function(){return!1},Dl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!d||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Dl.prototype.blur=function(){this.textarea.blur()},Dl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Dl.prototype.receivedFocus=function(){this.slowPoll()},Dl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Dl.prototype.fastPoll=function(){var t=!1,n=this;n.pollingFast=!0,n.polling.set(20,function e(){n.poll()||t?(n.pollingFast=!1,n.slowPoll()):(t=!0,n.polling.set(60,e))})},Dl.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||ze(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(L&&9<=x&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,s=Math.min(r.length,i.length);l<s&&r.charCodeAt(l)==i.charCodeAt(l);)++l;return Br(t,function(){bl(t,i.slice(l),r.length-l,null,e.composing?"*compose":null),1e3<i.length||-1<i.indexOf("\n")?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Dl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Dl.prototype.onKeyPress=function(){L&&9<=x&&(this.hasSelection=null),this.fastPoll()},Dl.prototype.onContextMenu=function(e){var n=this,r=n.cm,i=r.display,o=n.textarea;n.contextMenuPending&&n.contextMenuPending();var l,s,t,a,u,c=nr(r,e),h=i.scroller.scrollTop;function d(){var e,t;null!=o.selectionStart&&(t="​"+((e=r.somethingSelected())?o.value:""),o.value="⇚",o.value=t,n.prevInput=e?"":"​",o.selectionStart=1,o.selectionEnd=t.length,i.selForContextMenu=r.doc.sel)}function f(){var e,t;n.contextMenuPending==f&&(n.contextMenuPending=!1,n.wrapper.style.cssText=s,o.style.cssText=l,L&&x<9&&i.scrollbars.setScrollTop(i.scroller.scrollTop=h),null!=o.selectionStart&&((!L||L&&x<9)&&d(),e=0,t=function(){i.selForContextMenu==r.doc.sel&&0==o.selectionStart&&0<o.selectionEnd&&"​"==n.prevInput?Gr(r,_i)(r):e++<10?i.detectingSelectAll=setTimeout(t,500):(i.selForContextMenu=null,i.input.reset())},i.detectingSelectAll=setTimeout(t,200)))}c&&!m&&(r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(c)&&Gr(r,Bi)(r.doc,di(c),V),l=o.style.cssText,s=n.wrapper.style.cssText,t=n.wrapper.offsetParent.getBoundingClientRect(),n.wrapper.style.cssText="position: static",o.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-t.top-5)+"px; left: "+(e.clientX-t.left-5)+"px;\n z-index: 1000; background: "+(L?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",v&&(a=window.scrollY),i.input.focus(),v&&window.scrollTo(null,a),i.input.reset(),r.somethingSelected()||(o.value=n.prevInput=" "),n.contextMenuPending=f,i.selForContextMenu=r.doc.sel,clearTimeout(i.detectingSelectAll),L&&9<=x&&d(),C?(De(e),u=function(){Ce(window,"mouseup",u),setTimeout(f,20)},we(window,"mouseup",u)):setTimeout(f,50))},Dl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e,this.textarea.readOnly=!!e},Dl.prototype.setUneditable=function(){},Dl.prototype.needsContentAttribute=!1,Hl=(Wl=pl).optionHandlers,Wl.defineOption=Il,Wl.Init=ul,Il("value","",function(e,t){return e.setValue(t)},!0),Il("mode",null,function(e,t){e.doc.modeOption=t,vi(e)},!0),Il("indentUnit",2,vi,!0),Il("indentWithTabs",!1),Il("smartIndent",!0),Il("tabSize",4,function(e){yi(e),Pn(e),ir(e)},!0),Il("lineSeparator",null,function(e,r){if(e.doc.lineSep=r){var i=[],o=e.doc.first;e.doc.iter(function(e){for(var t=0;;){var n=e.text.indexOf(r,t);if(-1==n)break;t=n+r.length,i.push(lt(o,n))}o++});for(var t=i.length-1;0<=t;t--)to(e.doc,r,i[t],lt(i[t].line,i[t].ch+r.length))}}),Il("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=ul&&e.refresh()}),Il("specialCharPlaceholder",en,function(e){return e.refresh()},!0),Il("electricChars",!0),Il("inputStyle",d?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Il("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),Il("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),Il("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),Il("rtlMoveVisually",!p),Il("wholeLineUpdateBefore",!0),Il("theme","default",function(e){al(e),ni(e)},!0),Il("keyMap","default",function(e,t,n){var r=Po(t),i=n!=ul&&Po(n);i&&i.detach&&i.detach(e,r),r.attach&&r.attach(e,i||null)}),Il("extraKeys",null),Il("configureMouse",null),Il("lineWrapping",!1,fl,!0),Il("gutters",[],function(e,t){e.display.gutterSpecs=ei(t,e.options.lineNumbers),ni(e)},!0),Il("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?Jn(e.display)+"px":"0",e.refresh()},!0),Il("coverGutterNextToScrollbar",!1,function(e){return Hr(e)},!0),Il("scrollbarStyle","native",function(e){Pr(e),Hr(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),Il("lineNumbers",!1,function(e,t){e.display.gutterSpecs=ei(e.options.gutters,t),ni(e)},!0),Il("firstLineNumber",1,ni,!0),Il("lineNumberFormatter",function(e){return e},ni,!0),Il("showCursorWhenSelecting",!1,ur,!0),Il("resetSelectionOnContextMenu",!0),Il("lineWiseCopyCut",!0),Il("pasteLinesPerSelection",!0),Il("selectionsMayTouch",!1),Il("readOnly",!1,function(e,t){"nocursor"==t&&(vr(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),Il("screenReaderLabel",null,function(e,t){t=""===t?null:t,e.display.input.screenReaderLabelChanged(t)}),Il("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),Il("dragDrop",!0,dl),Il("allowDropFileTypes",null),Il("cursorBlinkRate",530),Il("cursorScrollMargin",0),Il("cursorHeight",1,ur,!0),Il("singleCursorHeightPerLine",!0,ur,!0),Il("workTime",100),Il("workDelay",100),Il("flattenSpans",!0,yi,!0),Il("addModeClass",!1,yi,!0),Il("pollInterval",100),Il("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),Il("historyEventDelay",1250),Il("viewportMargin",10,function(e){return e.refresh()},!0),Il("maxHighlightLength",1e4,yi,!0),Il("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),Il("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),Il("autofocus",null),Il("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),Il("phrases",null),El=(Fl=pl).optionHandlers,Pl=Fl.helpers={},Fl.prototype={constructor:Fl,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var n=this.options,r=n[e];n[e]==t&&"mode"!=e||(n[e]=t,El.hasOwnProperty(e)&&Gr(this,El[e])(this,t,r),Se(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Po(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;n<t.length;++n)if(t[n]==e||t[n].name==e)return t.splice(n,1),!0},addOverlay:Ur(function(e,t){var n=e.token?e:Fl.getMode(this.options,e);if(n.startState)throw new Error("Overlays may not be stateful.");!function(e,t,n){for(var r=0,i=n(t);r<e.length&&n(e[r])<=i;)r++;e.splice(r,0,t)}(this.state.overlays,{mode:n,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,ir(this)}),removeOverlay:Ur(function(e){for(var t=this.state.overlays,n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||"string"==typeof e&&r.name==e)return t.splice(n,1),this.state.modeGen++,void ir(this)}}),indentLine:Ur(function(e,t,n){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),it(this.doc,e)&&ml(this,e,t,n)}),indentSelection:Ur(function(e){for(var t=this.doc.sel.ranges,n=-1,r=0;r<t.length;r++){var i=t[r];if(i.empty())i.head.line>n&&(ml(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Sr(this));else{for(var o=i.from(),l=i.to(),s=Math.max(n,o.line),n=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1,a=s;a<n;++a)ml(this,a,e);var u=this.doc.sel.ranges;0==o.ch&&t.length==u.length&&0<u[r].from().ch&&Ii(this.doc,r,new ci(o,u[r].to()),V)}}}),getTokenAt:function(e,t){return Lt(this,e,t)},getLineTokens:function(e,t){return Lt(this,lt(e),t,!0)},getTokenTypeAt:function(e){e=ft(this.doc,e);var t,n=yt(this,Qe(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var l=r+i>>1;if((l?n[2*l-1]:0)>=o)i=l;else{if(!(n[2*l+1]<o)){t=n[2*l+2];break}r=1+l}}var s=t?t.indexOf("overlay "):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Fl.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!Pl.hasOwnProperty(t))return n;var r=Pl[t],i=this.getModeAt(e);if("string"==typeof i[t])r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=r[i[t][o]];l&&n.push(l)}else i.helperType&&r[i.helperType]?n.push(r[i.helperType]):r[i.name]&&n.push(r[i.name]);for(var s=0;s<r._global.length;s++){var a=r._global[s];a.pred(i,this)&&-1==B(n,a.val)&&n.push(a.val)}return n},getStateAfter:function(e,t){var n=this.doc;return bt(this,(e=dt(n,null==e?n.first+n.size-1:e))+1,t).state},cursorCoords:function(e,t){var n=this.doc.sel.primary(),r=null==e?n.head:"object"==typeof e?ft(this.doc,e):e?n.from():n.to();return Vn(this,r,t||"page")},charCoords:function(e,t){return Un(this,ft(this.doc,e),t||"page")},coordsChar:function(e,t){return Xn(this,(e=Gn(this,e,t||"page")).left,e.top)},lineAtHeight:function(e,t){return e=Gn(this,{top:e,left:0},t||"page").top,rt(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,n){var r,i=!1,o="number"==typeof e?(r=this.doc.first+this.doc.size-1,e<this.doc.first?e=this.doc.first:r<e&&(e=r,i=!0),Qe(this.doc,e)):e;return Bn(this,o,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-Xt(o):0)},defaultTextHeight:function(){return qn(this.display)},defaultCharWidth:function(){return Zn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o,l,s,a,u,c=this.display,h=(e=Vn(this,ft(this.doc,e))).bottom,d=e.left;t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),c.sizer.appendChild(t),"over"==r?h=e.top:"above"!=r&&"near"!=r||(o=Math.max(c.wrapper.clientHeight,this.doc.height),l=Math.max(c.sizer.clientWidth,c.lineSpace.clientWidth),("above"==r||e.bottom+t.offsetHeight>o)&&e.top>t.offsetHeight?h=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=o&&(h=e.bottom),d+t.offsetWidth>l&&(d=l-t.offsetWidth)),t.style.top=h+"px",t.style.left=t.style.right="","right"==i?(d=c.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?d=0:"middle"==i&&(d=(c.sizer.clientWidth-t.offsetWidth)/2),t.style.left=d+"px"),n&&(s=this,a={left:d,top:h,right:d+t.offsetWidth,bottom:h+t.offsetHeight},null!=(u=xr(s,a)).scrollTop&&Mr(s,u.scrollTop),null!=u.scrollLeft&&Ar(s,u.scrollLeft))},triggerOnKeyDown:Ur(Zo),triggerOnKeyPress:Ur(Jo),triggerOnKeyUp:Qo,triggerOnMouseDown:Ur(rl),execCommand:function(e){if(Uo.hasOwnProperty(e))return Uo[e].call(null,this)},triggerElectric:Ur(function(e){xl(this,e)}),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=ft(this.doc,e),l=0;l<t&&!(o=kl(this.doc,o,i,n,r)).hitSide;++l);return o},moveH:Ur(function(t,n){var r=this;this.extendSelectionsBy(function(e){return r.display.shift||r.doc.extend||e.empty()?kl(r.doc,e.head,t,n,r.options.rtlMoveVisually):t<0?e.from():e.to()},j)}),deleteH:Ur(function(n,r){var e=this.doc.sel,i=this.doc;e.somethingSelected()?i.replaceSelection("",null,"+delete"):Io(this,function(e){var t=kl(i,e.head,n,r,!1);return n<0?{from:t,to:e.head}:{from:e.head,to:t}})}),findPosV:function(e,t,n,r){var i=1,o=r;t<0&&(i=-1,t=-t);for(var l=ft(this.doc,e),s=0;s<t;++s){var a=Vn(this,l,"div");if(null==o?o=a.left:a.left=o,(l=Tl(this,a,i,n)).hitSide)break}return l},moveV:Ur(function(r,i){var o=this,l=this.doc,s=[],a=!this.display.shift&&!l.extend&&l.sel.somethingSelected();if(l.extendSelectionsBy(function(e){if(a)return r<0?e.from():e.to();var t=Vn(o,e.head,"div");null!=e.goalColumn&&(t.left=e.goalColumn),s.push(t.left);var n=Tl(o,t,r,i);return"page"==i&&e==l.sel.primary()&&Cr(o,Un(o,n,"div").top-t.top),n},j),s.length)for(var e=0;e<l.sel.ranges.length;e++)l.sel.ranges[e].goalColumn=s[e]}),findWordAt:function(e){var t=Qe(this.doc,e.line).text,n=e.ch,r=e.ch;if(t){var i=this.getHelper(e,"wordChars");"before"!=e.sticky&&r!=t.length||!n?++r:--n;for(var o=t.charAt(n),l=te(o,i)?function(e){return te(e,i)}:/\s/.test(o)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!te(e)};0<n&&l(t.charAt(n-1));)--n;for(;r<t.length&&l(t.charAt(r));)++r}return new ci(lt(e.line,n),lt(e.line,r))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||(((this.state.overwrite=!this.state.overwrite)?H:T)(this.display.cursorDiv,"CodeMirror-overwrite"),Se(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Ur(function(e,t){Lr(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Sn(this)-this.display.barHeight,width:e.scrollWidth-Sn(this)-this.display.barWidth,clientHeight:kn(this),clientWidth:Ln(this)}},scrollIntoView:Ur(function(e,t){var n,r;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:lt(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(r=e,kr(n=this),n.curOp.scrollToPos=r):Tr(this,e.from,e.to,e.margin)}),setSize:Ur(function(e,t){function n(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e}var r=this;null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&En(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){or(r,i,"widget");break}++i}),this.curOp.forceUpdate=!0,Se(this,"refresh",this)}),operation:function(e){return Br(this,e)},startOperation:function(){return Rr(this)},endOperation:function(){return zr(this)},refresh:Ur(function(){var e=this.display.cachedTextHeight;ir(this),this.curOp.forceUpdate=!0,Pn(this),Lr(this,this.doc.scrollLeft,this.doc.scrollTop),qr(this.display),(null==e||.5<Math.abs(e-qn(this.display))||this.options.lineWrapping)&&tr(this),Se(this,"refresh",this)}),swapDoc:Ur(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Ci(this,e),Pn(this),this.display.input.reset(),Lr(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,un(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Me(Fl),Fl.registerHelper=function(e,t,n){Pl.hasOwnProperty(e)||(Pl[e]=Fl[e]={_global:[]}),Pl[e][t]=n},Fl.registerGlobalHelper=function(e,t,n,r){Fl.registerHelper(e,t,r),Pl[e]._global.push({pred:n,val:r})};var Rl,zl="iter insert remove copy getEditor constructor".split(" ");for(var Bl in vo.prototype)vo.prototype.hasOwnProperty(Bl)&&B(zl,Bl)<0&&(pl.prototype[Bl]=function(e){return function(){return e.apply(this.doc,arguments)}}(vo.prototype[Bl]));return Me(vo),pl.inputStyles={textarea:Dl,contenteditable:Ml},pl.defineMode=function(e){pl.defaults.mode||"null"==e||(pl.defaults.mode=e),function(e,t){2<arguments.length&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ue[e]=t}.apply(this,arguments)},pl.defineMIME=function(e,t){Ve[e]=t},pl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),pl.defineMIME("text/plain","null"),pl.defineExtension=function(e,t){pl.prototype[e]=t},pl.defineDocExtension=function(e,t){vo.prototype[e]=t},pl.fromTextArea=function(t,n){var e;function r(){t.value=s.getValue()}if((n=n?I(n):{}).value=t.value,!n.tabindex&&t.tabIndex&&(n.tabindex=t.tabIndex),!n.placeholder&&t.placeholder&&(n.placeholder=t.placeholder),null==n.autofocus&&(e=W(),n.autofocus=e==t||null!=t.getAttribute("autofocus")&&e==document.body),t.form&&(we(t.form,"submit",r),!n.leaveSubmitMethodAlone)){var i=t.form,o=i.submit;try{var l=i.submit=function(){r(),i.submit=o,i.submit(),i.submit=l}}catch(e){}}n.finishInit=function(e){e.save=r,e.getTextArea=function(){return t},e.toTextArea=function(){e.toTextArea=isNaN,r(),t.parentNode.removeChild(e.getWrapperElement()),t.style.display="",t.form&&(Ce(t.form,"submit",r),n.leaveSubmitMethodAlone||"function"!=typeof t.form.submit||(t.form.submit=o))}},t.style.display="none";var s=pl(function(e){return t.parentNode.insertBefore(e,t.nextSibling)},n);return s},(Rl=pl).off=Ce,Rl.on=we,Rl.wheelEventPixels=si,Rl.Doc=vo,Rl.splitLines=Re,Rl.countColumn=R,Rl.findColumn=X,Rl.isWordChar=ee,Rl.Pass=U,Rl.signal=Se,Rl.Line=$t,Rl.changeEnd=fi,Rl.scrollbarModel=Er,Rl.Pos=lt,Rl.cmpPos=st,Rl.modes=Ue,Rl.mimeModes=Ve,Rl.resolveMode=Ke,Rl.getMode=je,Rl.modeExtensions=Xe,Rl.extendMode=Ye,Rl.copyState=_e,Rl.startState=qe,Rl.innerMode=$e,Rl.commands=Uo,Rl.keyMap=Ao,Rl.keyName=Eo,Rl.isModifierKey=Ho,Rl.lookupKey=Wo,Rl.normalizeKeyMap=Do,Rl.StringStream=Ze,Rl.SharedTextMarker=po,Rl.TextMarker=ho,Rl.LineWidget=ao,Rl.e_preventDefault=Ne,Rl.e_stopPropagation=Ae,Rl.e_stop=De,Rl.addClass=H,Rl.contains=D,Rl.rmClass=T,Rl.keyNames=ko,pl.version="5.58.3",pl}); From 4079f7231044161e5e033030c7b0e1ac19109b1f Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Tue, 1 Dec 2020 19:14:07 +0100 Subject: [PATCH 1067/2376] Fix typo in x-listops.js (#5171) --- core/modules/filters/x-listops.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index eeda70c4a..cb8c031a2 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -206,7 +206,7 @@ Extended filter operators to manipulate the current list. if(operands.length > 1) { results.splice(resultsIndex,1,operands[nextOperandIndex]); } else { - results.splice(resultsIndex,1,); + results.splice(resultsIndex,1); } } else { results.push(operands[0]); @@ -232,4 +232,4 @@ Extended filter operators to manipulate the current list. return cycleValueInArray(results,operands,step); } -})(); \ No newline at end of file +})(); From c3055f92a96ac369d034872035f02aa7300b59fc Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 1 Dec 2020 21:55:22 +0100 Subject: [PATCH 1068/2376] Don't minify codemirror.js (#5173) --- .../tiddlywiki/codemirror/files/codemirror.js | 9798 ++++++++++++++++- 1 file changed, 9797 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/codemirror/files/codemirror.js b/plugins/tiddlywiki/codemirror/files/codemirror.js index 0c80808ae..0436a9968 100755 --- a/plugins/tiddlywiki/codemirror/files/codemirror.js +++ b/plugins/tiddlywiki/codemirror/files/codemirror.js @@ -1 +1,9797 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,g=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),r=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),i=/Edge\/(\d+)/.exec(e),L=n||r||i,x=L&&(n?document.documentMode||6:+(i||r)[1]),v=!i&&/WebKit\//.test(e),o=v&&/Qt\/\d+\.\d+/.test(e),l=!i&&/Chrome\//.test(e),m=/Opera\//.test(e),c=/Apple Computer/.test(navigator.vendor),s=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),u=/PhantomJS/.test(e),a=!i&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),h=/Android/.test(e),d=a||h||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=a||/Mac/.test(t),f=/\bCrOS\b/.test(e),p=/win/i.test(t),b=m&&e.match(/Version\/(\d*\.\d*)/);(b=b&&Number(b[1]))&&15<=b&&(v=!(m=!1));var w=y&&(o||m&&(null==b||b<12.11)),C=g||L&&9<=x;function S(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var n,r=e.className,i=S(t).exec(r);i&&(n=r.slice(i.index+i[0].length),e.className=r.slice(0,i.index)+(n?i[1]+n:""))};function M(e){for(var t=e.childNodes.length;0<t;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,n,r){var i=O(e,t,n,r);return i.setAttribute("role","presentation"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var t;try{t=document.activeElement}catch(e){t=document.body||null}for(;t&&t.shadowRoot&&t.shadowRoot.activeElement;)t=t.shadowRoot.activeElement;return t}function H(e,t){var n=e.className;S(t).test(n)||(e.className+=(n?" ":"")+t)}function F(e,t){for(var n=e.split(" "),r=0;r<n.length;r++)n[r]&&!S(n[r]).test(t)&&(t+=" "+n[r]);return t}k=document.createRange?function(e,t,n,r){var i=document.createRange();return i.setEnd(r||e,n),i.setStart(e,t),i}:function(e,t,n){var r=document.body.createTextRange();try{r.moveToElementText(e.parentNode)}catch(e){return r}return r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r};var E=function(e){e.select()};function P(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function I(e,t,n){for(var r in t=t||{},e)!e.hasOwnProperty(r)||!1===n&&t.hasOwnProperty(r)||(t[r]=e[r]);return t}function R(e,t,n,r,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=r||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||t<=s)return l+(t-o);l+=s-o,l+=n-l%n,o=s+1}}a?E=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:L&&(E=function(e){try{e.select()}catch(e){}});var z=function(){this.id=null,this.f=null,this.time=0,this.handler=P(this.onTimeout,this)};function B(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}z.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-new Date)},z.prototype.set=function(e,t){this.f=t;var n=+new Date+e;(!this.id||n<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,e),this.time=n)};var G=50,U={toString:function(){return"CodeMirror.Pass"}},V={scroll:!1},K={origin:"*mouse"},j={origin:"+move"};function X(e,t,n){for(var r=0,i=0;;){var o=e.indexOf("\t",r);-1==o&&(o=e.length);var l=o-r;if(o==e.length||t<=i+l)return r+Math.min(l,t-i);if(i+=o-r,r=o+1,t<=(i+=n-i%n))return r}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var n=[],r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function Z(){}function Q(e,t){var n=Object.create?Object.create(e):(Z.prototype=e,new Z);return t&&I(t,n),n}var J=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function ee(e){return/\w/.test(e)||"€"<e&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(-1<t.source.indexOf("\\w")&&ee(e))||t.test(e):ee(e)}function ne(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return;return 1}var re=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return 768<=e.charCodeAt(0)&&re.test(e)}function oe(e,t,n){for(;(n<0?0<t:t<e.length)&&ie(e.charAt(t));)t+=n;return t}function le(e,t,n){for(var r=n<t?-1:1;;){if(t==n)return t;var i=(t+n)/2,o=r<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+r}}var se=null;function ae(e,t,n){var r;se=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:se=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:se=i)}return null!=r?r:se}var ue,ce,he,de,fe,pe,ge,me=(ue="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",ce="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",he=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,de=/[stwN]/,fe=/[LRr]/,pe=/[Lb1n]/,ge=/[1n]/,function(e,t){var n="ltr"==t?"L":"R";if(0==e.length||"ltr"==t&&!he.test(e))return!1;for(var r,i=e.length,o=[],l=0;l<i;++l)o.push((r=e.charCodeAt(l))<=247?ue.charAt(r):1424<=r&&r<=1524?"R":1536<=r&&r<=1785?ce.charAt(r-1536):1774<=r&&r<=2220?"r":8192<=r&&r<=8203?"w":8204==r?"b":"L");for(var s=0,a=n;s<i;++s){var u=o[s];"m"==u?o[s]=a:a=u}for(var c=0,h=n;c<i;++c){var d=o[c];"1"==d&&"r"==h?o[c]="n":fe.test(d)&&"r"==(h=d)&&(o[c]="R")}for(var f=1,p=o[0];f<i-1;++f){var g=o[f];"+"==g&&"1"==p&&"1"==o[f+1]?o[f]="1":","!=g||p!=o[f+1]||"1"!=p&&"n"!=p||(o[f]=p),p=g}for(var m=0;m<i;++m){var v=o[m];if(","==v)o[m]="N";else if("%"==v){for(var y=void 0,y=m+1;y<i&&"%"==o[y];++y);for(var b=m&&"!"==o[m-1]||y<i&&"1"==o[y]?"1":"N",w=m;w<y;++w)o[w]=b;m=y-1}}for(var x=0,C=n;x<i;++x){var S=o[x];"L"==C&&"1"==S?o[x]="L":fe.test(S)&&(C=S)}for(var L=0;L<i;++L)if(de.test(o[L])){for(var k=void 0,k=L+1;k<i&&de.test(o[k]);++k);for(var T="L"==(L?o[L-1]:n),M=T==("L"==(k<i?o[k]:n))?T?"L":"R":n,N=L;N<k;++N)o[N]=M;L=k-1}for(var A,O=[],D=0;D<i;)if(pe.test(o[D])){var W=D;for(++D;D<i&&pe.test(o[D]);++D);O.push(new ve(0,W,D))}else{var H=D,F=O.length,E="rtl"==t?1:0;for(++D;D<i&&"L"!=o[D];++D);for(var P=H;P<D;)if(ge.test(o[P])){H<P&&(O.splice(F,0,new ve(1,H,P)),F+=E);var I=P;for(++P;P<D&&ge.test(o[P]);++P);O.splice(F,0,new ve(2,I,P)),F+=E,H=P}else++P;H<D&&O.splice(F,0,new ve(1,H,D))}return"ltr"==t&&(1==O[0].level&&(A=e.match(/^\s+/))&&(O[0].from=A[0].length,O.unshift(new ve(0,0,A[0].length))),1==$(O).level&&(A=e.match(/\s+$/))&&($(O).to-=A[0].length,O.push(new ve(0,i-A[0].length,i)))),"rtl"==t?O.reverse():O});function ve(e,t,n){this.level=e,this.from=t,this.to=n}function ye(e,t){var n=e.order;return null==n&&(n=e.order=me(e.text,t)),n}var be=[],we=function(e,t,n){var r;e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent?e.attachEvent("on"+t,n):(r=e._handlers||(e._handlers={}))[t]=(r[t]||be).concat(n)};function xe(e,t){return e._handlers&&e._handlers[t]||be}function Ce(e,t,n){var r,i,o;e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent?e.detachEvent("on"+t,n):!(i=(r=e._handlers)&&r[t])||-1<(o=B(i,n))&&(r[t]=i.slice(0,o).concat(i.slice(o+1)))}function Se(e,t){var n=xe(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i<n.length;++i)n[i].apply(null,r)}function Le(e,t,n){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),Se(e,n||t.type,e,t),Oe(t)||t.codemirrorIgnore}function ke(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var n=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),r=0;r<t.length;++r)-1==B(n,t[r])&&n.push(t[r])}function Te(e,t){return 0<xe(e,t).length}function Me(e){e.prototype.on=function(e,t){we(this,e,t)},e.prototype.off=function(e,t){Ce(this,e,t)}}function Ne(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Ae(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Oe(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function De(e){Ne(e),Ae(e)}function We(e){return e.target||e.srcElement}function He(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Fe,Ee,Pe=function(){if(L&&x<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();var Ie,Re=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(n.push(o.slice(0,l)),t+=l+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},ze=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Be="oncopy"in(Ie=O("div"))||(Ie.setAttribute("oncopy","return;"),"function"==typeof Ie.oncopy),Ge=null;var Ue={},Ve={};function Ke(e){if("string"==typeof e&&Ve.hasOwnProperty(e))e=Ve[e];else if(e&&"string"==typeof e.name&&Ve.hasOwnProperty(e.name)){var t=Ve[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ke("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ke("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function je(e,t){t=Ke(t);var n=Ue[t.name];if(!n)return je(e,"text/plain");var r=n(e,t);if(Xe.hasOwnProperty(t.name)){var i=Xe[t.name];for(var o in i)i.hasOwnProperty(o)&&(r.hasOwnProperty(o)&&(r["_"+o]=r[o]),r[o]=i[o])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var Xe={};function Ye(e,t){I(t,Xe.hasOwnProperty(e)?Xe[e]:Xe[e]={})}function _e(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function $e(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function qe(e,t,n){return!e.startState||e.startState(t,n)}var Ze=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};function Qe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t<o){n=i;break}t-=o}return n.lines[t]}function Je(e,n,r){var i=[],o=n.line;return e.iter(n.line,r.line+1,function(e){var t=e.text;o==r.line&&(t=t.slice(0,r.ch)),o==n.line&&(t=t.slice(n.ch)),i.push(t),++o}),i}function et(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function tt(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function nt(e){if(null==e.parent)return null;for(var t=e.parent,n=B(t.lines,e),r=t.parent;r;r=(t=r).parent)for(var i=0;r.children[i]!=t;++i)n+=r.children[i].chunkSize();return n+t.first}function rt(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],o=i.height;if(t<o){e=i;continue e}t-=o,n+=i.chunkSize()}return n}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return n+l}function it(e,t){return t>=e.first&&t<e.first+e.size}function ot(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function lt(e,t,n){if(void 0===n&&(n=null),!(this instanceof lt))return new lt(e,t,n);this.line=e,this.ch=t,this.sticky=n}function st(e,t){return e.line-t.line||e.ch-t.ch}function at(e,t){return e.sticky==t.sticky&&0==st(e,t)}function ut(e){return lt(e.line,e.ch)}function ct(e,t){return st(e,t)<0?t:e}function ht(e,t){return st(e,t)<0?e:t}function dt(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function ft(e,t){if(t.line<e.first)return lt(e.first,0);var n,r,i,o=e.first+e.size-1;return t.line>o?lt(o,Qe(e,o).text.length):(r=Qe(e,(n=t).line).text.length,null==(i=n.ch)||r<i?lt(n.line,r):i<0?lt(n.line,0):n)}function pt(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=ft(e,t[r]);return n}Ze.prototype.eol=function(){return this.pos>=this.string.length},Ze.prototype.sol=function(){return this.pos==this.lineStart},Ze.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Ze.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Ze.prototype.eat=function(e){var t=this.string.charAt(this.pos),n="string"==typeof e?t==e:t&&(e.test?e.test(t):e(t));if(n)return++this.pos,t},Ze.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Ze.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Ze.prototype.skipToEnd=function(){this.pos=this.string.length},Ze.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(-1<t)return this.pos=t,!0},Ze.prototype.backUp=function(e){this.pos-=e},Ze.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=R(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.indentation=function(){return R(this.string,null,this.tabSize)-(this.lineStart?R(this.string,this.lineStart,this.tabSize):0)},Ze.prototype.match=function(e,t,n){if("string"!=typeof e){var r=this.string.slice(this.pos).match(e);return r&&0<r.index?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}function i(e){return n?e.toLowerCase():e}if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Ze.prototype.current=function(){return this.string.slice(this.start,this.pos)},Ze.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Ze.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Ze.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var gt=function(e,t){this.state=e,this.lookAhead=t},mt=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};function vt(t,n,r,e){var a=[t.state.modeGen],i={};Tt(t,n.text,t.doc.mode,r,function(e,t){return a.push(e,t)},i,e);for(var u=r.state,o=0;o<t.state.overlays.length;++o)!function(e){r.baseTokens=a;var o=t.state.overlays[e],l=1,s=0;r.state=!0,Tt(t,n.text,o.mode,r,function(e,t){for(var n=l;s<e;){var r=a[l];e<r&&a.splice(l,1,e,a[l+1],r),l+=2,s=Math.min(e,r)}if(t)if(o.opaque)a.splice(n,l-n,e,"overlay "+t),l=n+2;else for(;n<l;n+=2){var i=a[n+1];a[n+1]=(i?i+" ":"")+"overlay "+t}},i),r.state=u,r.baseTokens=null,r.baseTokenPos=1}(o);return{styles:a,classes:i.bgClass||i.textClass?i:null}}function yt(e,t,n){var r,i,o;return t.styles&&t.styles[0]==e.state.modeGen||(r=bt(e,nt(t)),i=t.text.length>e.options.maxHighlightLength&&_e(e.doc.mode,r.state),o=vt(e,t,r),i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))),t.styles}function bt(n,r,e){var t=n.doc,i=n.display;if(!t.mode.startState)return new mt(t,!0,r);var o=function(e,t,n){for(var r,i,o=e.doc,l=n?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;l<s;--s){if(s<=o.first)return o.first;var a=Qe(o,s-1),u=a.stateAfter;if(u&&(!n||s+(u instanceof gt?u.lookAhead:0)<=o.modeFrontier))return s;var c=R(a.text,null,e.options.tabSize);(null==i||c<r)&&(i=s-1,r=c)}return i}(n,r,e),l=o>t.first&&Qe(t,o-1).stateAfter,s=l?mt.fromSaved(t,l,o):new mt(t,qe(t.mode),o);return t.iter(o,r,function(e){wt(n,e.text,s);var t=s.line;e.stateAfter=t==r-1||t%5==0||t>=i.viewFrom&&t<i.viewTo?s.save():null,s.nextLine()}),e&&(t.modeFrontier=s.line),s}function wt(e,t,n,r){var i=e.doc.mode,o=new Ze(t,e.options.tabSize,n);for(o.start=o.pos=r||0,""==t&&xt(i,n.state);!o.eol();)Ct(i,o,n.state),o.start=o.pos}function xt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var n=$e(e,t);return n.mode.blankLine?n.mode.blankLine(n.state):void 0}}function Ct(e,t,n,r){for(var i=0;i<10;i++){r&&(r[0]=$e(e,n).mode);var o=e.token(t,n);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}mt.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},mt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},mt.prototype.nextLine=function(){this.line++,0<this.maxLookAhead&&this.maxLookAhead--},mt.fromSaved=function(e,t,n){return t instanceof gt?new mt(e,_e(e.mode,t.state),n,t.lookAhead):new mt(e,_e(e.mode,t),n)},mt.prototype.save=function(e){var t=!1!==e?_e(this.doc.mode,this.state):this.state;return 0<this.maxLookAhead?new gt(t,this.maxLookAhead):t};var St=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function Lt(e,t,n,r){var i,o,l=e.doc,s=l.mode,a=Qe(l,(t=ft(l,t)).line),u=bt(e,t.line,n),c=new Ze(a.text,e.options.tabSize,u);for(r&&(o=[]);(r||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Ct(s,c,u.state),r&&o.push(new St(c,i,_e(l.mode,u.state)));return r?o:new St(c,i,u.state)}function kt(e,t){if(e)for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";null==t[r]?t[r]=n[2]:new RegExp("(?:^|\\s)"+n[2]+"(?:$|\\s)").test(t[r])||(t[r]+=" "+n[2])}return e}function Tt(e,t,n,r,i,o,l){var s=n.flattenSpans;null==s&&(s=e.options.flattenSpans);var a=0,u=null,c=new Ze(t,e.options.tabSize,r),h=e.options.addModeClass&&[null];for(""==t&&kt(xt(n,r.state),o);!c.eol();){var d,f=c.pos>e.options.maxHighlightLength?(s=!1,l&&wt(e,t,r,c.pos),c.pos=t.length,null):kt(Ct(n,c,r.state,h),o);if(!h||(d=h[0].name)&&(f="m-"+(f?d+" "+f:d)),!s||u!=f){for(;a<c.start;)i(a=Math.min(c.start,a+5e3),u);u=f}c.start=c.pos}for(;a<c.pos;){var p=Math.min(c.pos,a+5e3);i(p,u),a=p}}var Mt=!1,Nt=!1;function At(e,t,n){this.marker=e,this.from=t,this.to=n}function Ot(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function Dt(e,t){if(t.full)return null;var n=it(e,t.from.line)&&Qe(e,t.from.line).markedSpans,r=it(e,t.to.line)&&Qe(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,o=t.to.ch,l=0==st(t.from,t.to),s=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t))&&(l.from!=t||"bookmark"!=s.type||n&&l.marker.insertLeft)||(o=null==l.to||(s.inclusiveRight?l.to>=t:l.to>t),(r=r||[]).push(new At(s,l.from,o?null:l.to)))}return r}(n,i,l),a=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.to||(s.inclusiveRight?l.to>=t:l.to>t))&&(l.from!=t||"bookmark"!=s.type||n&&!l.marker.insertLeft)||(o=null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t),(r=r||[]).push(new At(s,o?null:l.from-t,null==l.to?null:l.to-t)))}return r}(r,o,l),u=1==t.text.length,c=$(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var d,f=s[h];null==f.to&&((d=Ot(a,f.marker))?u&&(f.to=null==d.to?null:d.to+c):f.to=i)}if(a)for(var p=0;p<a.length;++p){var g=a[p];null!=g.to&&(g.to+=c),null==g.from?Ot(s,g.marker)||(g.from=c,u&&(s=s||[]).push(g)):(g.from+=c,u&&(s=s||[]).push(g))}s=s&&Wt(s),a&&a!=s&&(a=Wt(a));var m=[s];if(!u){var v,y=t.text.length-2;if(0<y&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(v=v||[]).push(new At(s[b].marker,null,null));for(var w=0;w<y;++w)m.push(v);m.push(a)}return m}function Wt(e){for(var t=0;t<e.length;++t){var n=e[t];null!=n.from&&n.from==n.to&&!1!==n.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function Ht(e){var t=e.markedSpans;if(t){for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}}function Ft(e,t){if(t){for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}}function Et(e){return e.inclusiveLeft?-1:0}function Pt(e){return e.inclusiveRight?1:0}function It(e,t){var n=e.lines.length-t.lines.length;if(0!=n)return n;var r=e.find(),i=t.find(),o=st(r.from,i.from)||Et(e)-Et(t);if(o)return-o;var l=st(r.to,i.to)||Pt(e)-Pt(t);return l||t.id-e.id}function Rt(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=void 0,o=0;o<r.length;++o)(i=r[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!n||It(n,i.marker)<0)&&(n=i.marker);return n}function zt(e){return Rt(e,!0)}function Bt(e){return Rt(e,!1)}function Gt(e,t,n,r,i){var o=Qe(e,t),l=Nt&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=st(u.from,n)||Et(a.marker)-Et(i),h=st(u.to,r)||Pt(a.marker)-Pt(i);if(!(0<=c&&h<=0||c<=0&&0<=h)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?0<=st(u.to,n):0<st(u.to,n))||0<=c&&(a.marker.inclusiveRight&&i.inclusiveLeft?st(u.from,r)<=0:st(u.from,r)<0)))return 1}}}function Ut(e){for(var t;t=zt(e);)e=t.find(-1,!0).line;return e}function Vt(e,t){var n=Qe(e,t),r=Ut(n);return n==r?t:nt(r)}function Kt(e,t){if(t>e.lastLine())return t;var n,r=Qe(e,t);if(!jt(e,r))return t;for(;n=Bt(r);)r=n.find(1,!0).line;return nt(r)+1}function jt(e,t){var n=Nt&&t.markedSpans;if(n)for(var r=void 0,i=0;i<n.length;++i)if((r=n[i]).marker.collapsed){if(null==r.from)return!0;if(!r.marker.widgetNode&&0==r.from&&r.marker.inclusiveLeft&&function e(t,n,r){if(null==r.to){var i=r.marker.find(1,!0);return e(t,i.line,Ot(i.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==n.text.length)return!0;for(var o=void 0,l=0;l<n.markedSpans.length;++l)if((o=n.markedSpans[l]).marker.collapsed&&!o.marker.widgetNode&&o.from==r.to&&(null==o.to||o.to!=r.from)&&(o.marker.inclusiveLeft||r.marker.inclusiveRight)&&e(t,n,o))return!0}(e,t,r))return!0}}function Xt(e){for(var t=0,n=(e=Ut(e)).parent,r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var o=n.parent;o;o=(n=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==n)break;t+=s.height}return t}function Yt(e){if(0==e.height)return 0;for(var t,n=e.text.length,r=e;t=zt(r);){var i=t.find(0,!0),r=i.from.line;n+=i.from.ch-i.to.ch}for(r=e;t=Bt(r);){var o=t.find(0,!0);n-=r.text.length-o.from.ch,n+=(r=o.to.line).text.length-o.to.ch}return n}function _t(e){var n=e.display,t=e.doc;n.maxLine=Qe(t,t.first),n.maxLineLength=Yt(n.maxLine),n.maxLineChanged=!0,t.iter(function(e){var t=Yt(e);t>n.maxLineLength&&(n.maxLineLength=t,n.maxLine=e)})}var $t=function(e,t,n){this.text=e,Ft(this,t),this.height=n?n(this):1};$t.prototype.lineNo=function(){return nt(this)},Me($t);var qt={},Zt={};function Qt(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?Zt:qt;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function Jt(e,t){var n=A("span",null,null,v?"padding-right: .1px":null),r={pre:A("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i,o=0;o<=(t.rest?t.rest.length:0);o++){var l=o?t.rest[o-1]:t.line,s=void 0;r.pos=0,r.addToken=tn,function(e){if(null!=Ee)return Ee;var t=N(e,document.createTextNode("AخA")),n=k(t,0,1).getBoundingClientRect(),r=k(t,1,2).getBoundingClientRect();return M(e),n&&n.left!=n.right&&(Ee=r.right-n.right<3)}(e.display.measure)&&(s=ye(l,e.doc.direction))&&(r.addToken=function(h,d){return function(e,t,n,r,i,o,l){n=n?n+" cm-force-border":"cm-force-border";for(var s=e.pos,a=s+t.length;;){for(var u=void 0,c=0;c<d.length&&!((u=d[c]).to>s&&u.from<=s);c++);if(u.to>=a)return h(e,t,n,r,i,o,l);h(e,t.slice(0,u.to-s),n,r,null,o,l),r=null,t=t.slice(u.to-s),s=u.to}}}(r.addToken,s)),r.map=[],function(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(!r){for(var l=1;l<n.length;l+=2)t.addToken(t,i.slice(o,o=n[l]),Qt(n[l+1],t.cm.options));return}for(var s,a,u,c,h,d,f,p=i.length,g=0,m=1,v="",y=0;;){if(y==g){u=c=h=a="",d=f=null,y=1/0;for(var b=[],w=void 0,x=0;x<r.length;++x){var C=r[x],S=C.marker;if("bookmark"==S.type&&C.from==g&&S.widgetNode)b.push(S);else if(C.from<=g&&(null==C.to||C.to>g||S.collapsed&&C.to==g&&C.from==g)){if(null!=C.to&&C.to!=g&&y>C.to&&(y=C.to,c=""),S.className&&(u+=" "+S.className),S.css&&(a=(a?a+";":"")+S.css),S.startStyle&&C.from==g&&(h+=" "+S.startStyle),S.endStyle&&C.to==y&&(w=w||[]).push(S.endStyle,C.to),S.title&&((f=f||{}).title=S.title),S.attributes)for(var L in S.attributes)(f=f||{})[L]=S.attributes[L];S.collapsed&&(!d||It(d.marker,S)<0)&&(d=C)}else C.from>g&&y>C.from&&(y=C.from)}if(w)for(var k=0;k<w.length;k+=2)w[k+1]==y&&(c+=" "+w[k]);if(!d||d.from==g)for(var T=0;T<b.length;++T)nn(t,0,b[T]);if(d&&(d.from||0)==g){if(nn(t,(null==d.to?p+1:d.to)-g,d.marker,null==d.from),null==d.to)return;d.to==g&&(d=!1)}}if(p<=g)break;for(var M=Math.min(p,y);;){if(v){var N,A=g+v.length;if(d||(N=M<A?v.slice(0,M-g):v,t.addToken(t,N,s?s+u:u,h,g+N.length==y?c:"",a,f)),M<=A){v=v.slice(M-g),g=M;break}g=A,h=""}v=i.slice(o,o=n[m++]),s=Qt(n[m++],t.cm.options)}}}(l,r,yt(e,l,t!=e.display.externalMeasured&&nt(l))),l.styleClasses&&(l.styleClasses.bgClass&&(r.bgClass=F(l.styleClasses.bgClass,r.bgClass||"")),l.styleClasses.textClass&&(r.textClass=F(l.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(function(e){var t;null==Fe&&(t=O("span","​"),N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Fe=t.offsetWidth<=1&&2<t.offsetHeight&&!(L&&x<8)));var n=Fe?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}(e.display.measure))),0==o?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return v&&(i=r.content.lastChild,(/\bcm-tab\b/.test(i.className)||i.querySelector&&i.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")),Se(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=F(r.pre.className,r.textClass||"")),r}function en(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function tn(e,t,n,r,i,o,l){if(t){var s,a=e.splitSpaces?function(e,t){if(1<e.length&&!/ /.test(e))return e;for(var n=t,r="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!n||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),r+=o,n=" "==o}return r}(t,e.trailingSpace):t,u=e.cm.state.specialChars,c=!1;if(u.test(t)){s=document.createDocumentFragment();for(var h=0;;){u.lastIndex=h;var d,f=u.exec(t),p=f?f.index-h:t.length-h;if(p&&(d=document.createTextNode(a.slice(h,h+p)),L&&x<9?s.appendChild(O("span",[d])):s.appendChild(d),e.map.push(e.pos,e.pos+p,d),e.col+=p,e.pos+=p),!f)break;h+=1+p;var g,m,v=void 0;"\t"==f[0]?(m=(g=e.cm.options.tabSize)-e.col%g,(v=s.appendChild(O("span",_(m),"cm-tab"))).setAttribute("role","presentation"),v.setAttribute("cm-text","\t"),e.col+=m):("\r"==f[0]||"\n"==f[0]?(v=s.appendChild(O("span","\r"==f[0]?"␍":"␤","cm-invalidchar"))).setAttribute("cm-text",f[0]):((v=e.cm.options.specialCharPlaceholder(f[0])).setAttribute("cm-text",f[0]),L&&x<9?s.appendChild(O("span",[v])):s.appendChild(v)),e.col+=1),e.map.push(e.pos,e.pos+1,v),e.pos++}}else e.col+=t.length,s=document.createTextNode(a),e.map.push(e.pos,e.pos+t.length,s),L&&x<9&&(c=!0),e.pos+=t.length;if(e.trailingSpace=32==a.charCodeAt(t.length-1),n||r||i||c||o||l){var y=n||"";r&&(y+=r),i&&(y+=i);var b=O("span",[s],y,o);if(l)for(var w in l)l.hasOwnProperty(w)&&"style"!=w&&"class"!=w&&b.setAttribute(w,l[w]);return e.content.appendChild(b)}e.content.appendChild(s)}}function nn(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i=i||e.content.appendChild(document.createElement("span"))).setAttribute("cm-marker",n.id),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rn(e,t,n){this.line=t,this.rest=function(e){for(var t,n;t=Bt(e);)e=t.find(1,!0).line,(n=n||[]).push(e);return n}(t),this.size=this.rest?nt($(this.rest))-n+1:1,this.node=this.text=null,this.hidden=jt(e,t)}function on(e,t,n){for(var r=[],i=t;i<n;i=l){var o=new rn(e.doc,Qe(e.doc,i),i),l=i+o.size;r.push(o)}return r}var ln=null;function sn(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n<t.length;n++)t[n].call(null);for(var r=0;r<e.ops.length;r++){var i=e.ops[r];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(n<t.length)}(n)}finally{ln=null,t(n)}}var an=null;function un(e,t){var n=xe(e,t);if(n.length){var r,i=Array.prototype.slice.call(arguments,2);ln?r=ln.delayedCallbacks:an?r=an:(r=an=[],setTimeout(cn,0));for(var o=0;o<n.length;++o)!function(e){r.push(function(){return n[e].apply(null,i)})}(o)}}function cn(){var e=an;an=null;for(var t=0;t<e.length;++t)e[t]()}function hn(e,t,n,r){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?function(e,t){var n=t.text.className,r=fn(e,t);t.text==t.node&&(t.node=r.pre);t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,pn(e,t)):n&&(t.text.className=n)}(e,t):"gutter"==o?gn(e,t,n,r):"class"==o?pn(e,t):"widget"==o&&function(e,t,n){t.alignable&&(t.alignable=null);for(var r=S("CodeMirror-linewidget"),i=t.node.firstChild,o=void 0;i;i=o)o=i.nextSibling,r.test(i.className)&&t.node.removeChild(i);mn(e,t,n)}(e,t,r)}t.changes=null}function dn(e){return e.node==e.text&&(e.node=O("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),L&&x<8&&(e.node.style.zIndex=2)),e.node}function fn(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):Jt(e,t)}function pn(e,t){var n,r,i,o;n=e,(o=(r=t).bgClass?r.bgClass+" "+(r.line.bgClass||""):r.line.bgClass)&&(o+=" CodeMirror-linebackground"),r.background?o?r.background.className=o:(r.background.parentNode.removeChild(r.background),r.background=null):o&&(i=dn(r),r.background=i.insertBefore(O("div",null,o),i.firstChild),n.display.input.setUneditable(r.background)),t.line.wrapClass?dn(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var l=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=l||""}function gn(e,t,n,r){var i;t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass&&(i=dn(t),t.gutterBackground=O("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px; width: "+r.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text));var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=dn(t),s=t.gutter=O("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=" "+t.line.gutterClass),!e.options.lineNumbers||o&&o["CodeMirror-linenumbers"]||(t.lineNumber=s.appendChild(O("div",ot(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),o)for(var a=0;a<e.display.gutterSpecs.length;++a){var u=e.display.gutterSpecs[a].className,c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O("div",[c],"CodeMirror-gutter-elt","left: "+r.gutterLeft[u]+"px; width: "+r.gutterWidth[u]+"px"))}}}function mn(e,t,n){if(vn(e,t.line,t,n,!0),t.rest)for(var r=0;r<t.rest.length;r++)vn(e,t.rest[r],t,n,!1)}function vn(e,t,n,r,i){if(t.widgets)for(var o=dn(n),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O("div",[a.node],"CodeMirror-linewidget"+(a.className?" "+a.className:""));a.handleMouseEvents||u.setAttribute("cm-ignore-events","true"),function(e,t,n,r){{var i;e.noHScroll&&((n.alignable||(n.alignable=[])).push(t),i=r.wrapperWidth,t.style.left=r.fixedPos+"px",e.coverGutter||(i-=r.gutterTotalWidth,t.style.paddingLeft=r.gutterTotalWidth+"px"),t.style.width=i+"px")}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-r.gutterTotalWidth+"px"))}(a,u,n,r),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,n.gutter||n.text):o.appendChild(u),un(a,"redraw")}}function yn(e){if(null!=e.height)return e.height;var t,n=e.doc.cm;return n?(D(document.body,e.node)||(t="position: relative;",e.coverGutter&&(t+="margin-left: -"+n.display.gutters.offsetWidth+"px;"),e.noHScroll&&(t+="width: "+n.display.wrapper.clientWidth+"px;"),N(n.display.measure,O("div",[e.node],null,t))),e.height=e.node.parentNode.offsetHeight):0}function bn(e,t){for(var n=We(t);n!=e.wrapper;n=n.parentNode)if(!n||1==n.nodeType&&"true"==n.getAttribute("cm-ignore-events")||n.parentNode==e.sizer&&n!=e.mover)return 1}function wn(e){return e.lineSpace.offsetTop}function xn(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Cn(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O("pre","x","CodeMirror-line-like")),n=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,r={left:parseInt(n.paddingLeft),right:parseInt(n.paddingRight)};return isNaN(r.left)||isNaN(r.right)||(e.cachedPaddingH=r),r}function Sn(e){return G-e.display.nativeBarWidth}function Ln(e){return e.display.scroller.clientWidth-Sn(e)-e.display.barWidth}function kn(e){return e.display.scroller.clientHeight-Sn(e)-e.display.barHeight}function Tn(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var i=0;i<e.rest.length;i++)if(nt(e.rest[i])>n)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Mn(e,t,n,r){return On(e,An(e,t),n,r)}function Nn(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[rr(e,t)];var n=e.display.externalMeasured;return n&&t>=n.lineN&&t<n.lineN+n.size?n:void 0}function An(e,t){var n=nt(t),r=Nn(e,n);r&&!r.text?r=null:r&&r.changes&&(hn(e,r,n,Qn(e)),e.curOp.forceUpdate=!0);var i=Tn(r=r||function(e,t){var n=nt(t=Ut(t)),r=e.display.externalMeasured=new rn(e.doc,t,n);r.lineN=n;var i=r.built=Jt(e,r);return r.text=i.pre,N(e.display.lineMeasure,i.pre),r}(e,t),t,n);return{line:t,view:r,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function On(e,t,n,r,i){t.before&&(n=-1);var o,l=n+(r||"");return t.cache.hasOwnProperty(l)?o=t.cache[l]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(function(e,t,n){var r=e.options.lineWrapping,i=r&&Ln(e);if(!t.measure.heights||r&&t.measure.width!=i){var o=t.measure.heights=[];if(r){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];2<Math.abs(a.bottom-u.bottom)&&o.push((a.bottom+u.top)/2-n.top)}}o.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,n,r){var i,o,l=Hn(t.map,n,r),s=l.node,a=l.start,u=l.end,c=l.collapse;if(3==s.nodeType){for(var h=0;h<4;h++){for(;a&&ie(t.line.text.charAt(l.coverStart+a));)--a;for(;l.coverStart+u<l.coverEnd&&ie(t.line.text.charAt(l.coverStart+u));)++u;if((i=L&&x<9&&0==a&&u==l.coverEnd-l.coverStart?s.parentNode.getBoundingClientRect():function(e,t){var n=Wn;if("left"==t)for(var r=0;r<e.length&&(n=e[r]).left==n.right;r++);else for(var i=e.length-1;0<=i&&(n=e[i]).left==n.right;i--);return n}(k(s,a,u).getClientRects(),r)).left||i.right||0==a)break;u=a,--a,c="right"}L&&x<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ge)return Ge;var t=N(e,O("span","x")),n=t.getBoundingClientRect(),r=k(t,0,1).getBoundingClientRect();return Ge=1<Math.abs(n.left-r.left)}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,r=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*r,bottom:t.bottom*r}}(e.display.measure,i))}else 0<a&&(c=r="right"),i=e.options.lineWrapping&&1<(o=s.getClientRects()).length?o["right"==r?o.length-1:0]:s.getBoundingClientRect();{var d;!(L&&x<9)||a||i&&(i.left||i.right)||(d=s.parentNode.getClientRects()[0],i=d?{left:d.left,right:d.left+Zn(e.display),top:d.top,bottom:d.bottom}:Wn)}for(var f=i.top-t.rect.top,p=i.bottom-t.rect.top,g=(f+p)/2,m=t.view.measure.heights,v=0;v<m.length-1&&!(g<m[v]);v++);var y=v?m[v-1]:0,b=m[v],w={left:("right"==c?i.right:i.left)-t.rect.left,right:("left"==c?i.left:i.right)-t.rect.left,top:y,bottom:b};i.left||i.right||(w.bogus=!0);e.options.singleCursorHeightPerLine||(w.rtop=f,w.rbottom=p);return w}(e,t,n,r)).bogus||(t.cache[l]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Dn,Wn={left:0,right:0,top:0,bottom:0};function Hn(e,t,n){for(var r,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,a<=t&&(l="right")),null!=i){if(r=e[u+2],s==a&&n==(r.insertLeft?"left":"right")&&(l=n),"left"==n&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)r=e[2+(u-=3)],l="left";if("right"==n&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)r=e[(u+=3)+2],l="right";break}return{node:r,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Fn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function En(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fn(e.display.view[t])}function Pn(e){En(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function In(){return l&&h?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Rn(){return l&&h?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function zn(e){var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;++n)e.widgets[n].above&&(t+=yn(e.widgets[n]));return t}function Bn(e,t,n,r,i){var o;if(i||(o=zn(t),n.top+=o,n.bottom+=o),"line"==r)return n;r=r||"local";var l,s,a=Xt(t);return"local"==r?a+=wn(e.display):a-=e.display.viewOffset,"page"!=r&&"window"!=r||(a+=(l=e.display.lineSpace.getBoundingClientRect()).top+("window"==r?0:Rn()),s=l.left+("window"==r?0:In()),n.left+=s,n.right+=s),n.top+=a,n.bottom+=a,n}function Gn(e,t,n){if("div"==n)return t;var r,i=t.left,o=t.top;"page"==n?(i-=In(),o-=Rn()):"local"!=n&&n||(i+=(r=e.display.sizer.getBoundingClientRect()).left,o+=r.top);var l=e.display.lineSpace.getBoundingClientRect();return{left:i-l.left,top:o-l.top}}function Un(e,t,n,r,i){return Bn(e,r=r||Qe(e.doc,t.line),Mn(e,r,t.ch,i),n)}function Vn(r,e,i,o,l,s){function a(e,t){var n=On(r,l,e,t?"right":"left",s);return t?n.left=n.right:n.right=n.left,Bn(r,o,n,i)}o=o||Qe(r.doc,e.line),l=l||An(r,o);var u=ye(o,r.doc.direction),t=e.ch,n=e.sticky;if(t>=o.text.length?(t=o.text.length,n="before"):t<=0&&(t=0,n="after"),!u)return a("before"==n?t-1:t,"before"==n);function c(e,t,n){return a(n?e-1:e,1==u[t].level!=n)}var h=ae(u,t,n),d=se,f=c(t,h,"before"==n);return null!=d&&(f.other=c(t,d,"before"!=n)),f}function Kn(e,t){var n=0;t=ft(e.doc,t),e.options.lineWrapping||(n=Zn(e.display)*t.ch);var r=Qe(e.doc,t.line),i=Xt(r)+wn(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function jn(e,t,n,r,i){var o=lt(e,t,n);return o.xRel=i,r&&(o.outside=r),o}function Xn(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return jn(r.first,0,null,-1,-1);var i=rt(r,n),o=r.first+r.size-1;if(o<i)return jn(r.first+r.size-1,Qe(r,o).text.length,null,1,1);t<0&&(t=0);for(var l=Qe(r,i);;){var s=function(n,e,t,r,i){i-=Xt(e);var o=An(n,e),l=zn(e),s=0,a=e.text.length,u=!0,c=ye(e,n.doc.direction);{var h;c&&(h=(n.options.lineWrapping?function(e,t,n,r,i,o,l){var s=Yn(e,t,r,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,d=0;d<i.length;d++){var f,p,g,m=i[d];m.from>=u||m.to<=a||(f=1!=m.level,p=On(e,r,f?Math.min(u,m.to)-1:Math.max(a,m.from)).right,g=p<o?o-p+1e9:p-o,(!c||g<h)&&(c=m,h=g))}c=c||i[i.length-1];c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(r,i,o,l,s,a,u){var e=le(function(e){var t=s[e],n=1!=t.level;return $n(Vn(r,lt(o,n?t.to:t.from,n?"before":"after"),"line",i,l),a,u,!0)},0,s.length-1),t=s[e];{var n,c;0<e&&(n=1!=t.level,$n(c=Vn(r,lt(o,n?t.from:t.to,n?"after":"before"),"line",i,l),a,u,!0)&&c.top>u&&(t=s[e-1]))}return t})(n,e,t,o,c,r,i),u=1!=h.level,s=u?h.from:h.to-1,a=u?h.to:h.from-1)}var d,f,p=null,g=null,m=le(function(e){var t=On(n,o,e);return t.top+=l,t.bottom+=l,$n(t,r,i,!1)&&(t.top<=i&&t.left<=r&&(p=e,g=t),1)},s,a),v=!1;{var y,b,w;g?(y=r-g.left<g.right-r,m=p+((b=y==u)?0:1),f=b?"after":"before",d=y?g.left:g.right):(u||m!=a&&m!=s||m++,f=0==m||m!=e.text.length&&On(n,o,m-(u?1:0)).bottom+l<=i==u?"after":"before",w=Vn(n,lt(t,m,f),"line",e,o),d=w.left,v=i<w.top?-1:i>=w.bottom?1:0)}return m=oe(e.text,m,1),jn(t,m,f,v,r-d)}(e,l,i,t,n),a=function(e,t){var n,r=Nt&&e.markedSpans;if(r)for(var i=0;i<r.length;++i){var o=r[i];o.marker.collapsed&&(null==o.from||o.from<t)&&(null==o.to||o.to>t)&&(!n||It(n,o.marker)<0)&&(n=o.marker)}return n}(l,s.ch+(0<s.xRel||0<s.outside?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Qe(r,i=u.line)}}function Yn(t,e,n,r){r-=zn(e);var i=e.text.length,o=le(function(e){return On(t,n,e-1).bottom<=r},i,0);return{begin:o,end:i=le(function(e){return On(t,n,e).top>r},o,i)}}function _n(e,t,n,r){return Yn(e,t,n=n||An(e,t),Bn(e,t,On(e,n,r),"line").top)}function $n(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function qn(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Dn){Dn=O("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Dn.appendChild(document.createTextNode("x")),Dn.appendChild(O("br"));Dn.appendChild(document.createTextNode("x"))}N(e.measure,Dn);var n=Dn.offsetHeight/50;return 3<n&&(e.cachedTextHeight=n),M(e.measure),n||1}function Zn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),n=O("pre",[t],"CodeMirror-line-like");N(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return 2<i&&(e.cachedCharWidth=i),i||10}function Qn(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;n[s]=o.offsetLeft+o.clientLeft+i,r[s]=o.clientWidth}return{fixedPos:Jn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function Jn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function er(r){var i=qn(r.display),o=r.options.lineWrapping,l=o&&Math.max(5,r.display.scroller.clientWidth/Zn(r.display)-3);return function(e){if(jt(r.doc,e))return 0;var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;n++)e.widgets[n].height&&(t+=e.widgets[n].height);return o?t+(Math.ceil(e.text.length/l)||1)*i:t+i}}function tr(e){var t=e.doc,n=er(e);t.iter(function(e){var t=n(e);t!=e.height&&tt(e,t)})}function nr(e,t,n,r){var i=e.display;if(!n&&"true"==We(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(e){return null}var a,u,c=Xn(e,o,l);return r&&0<c.xRel&&(a=Qe(e.doc,c.line).text).length==c.ch&&(u=R(a,a.length,e.options.tabSize)-a.length,c=lt(c.line,Math.max(0,Math.round((o-Cn(e.display).left)/Zn(e.display))-u))),c}function rr(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;r<n.length;r++)if((t-=n[r].size)<0)return r}function ir(e,t,n,r){null==t&&(t=e.doc.first),null==n&&(n=e.doc.first+e.doc.size),r=r||0;var i,o,l,s,a=e.display;r&&n<a.viewTo&&(null==a.updateLineNumbers||a.updateLineNumbers>t)&&(a.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=a.viewTo?Nt&&Vt(e.doc,t)<a.viewTo&&lr(e):n<=a.viewFrom?Nt&&Kt(e.doc,n+r)>a.viewFrom?lr(e):(a.viewFrom+=r,a.viewTo+=r):t<=a.viewFrom&&n>=a.viewTo?lr(e):t<=a.viewFrom?(i=sr(e,n,n+r,1))?(a.view=a.view.slice(i.index),a.viewFrom=i.lineN,a.viewTo+=r):lr(e):n>=a.viewTo?(o=sr(e,t,t,-1))?(a.view=a.view.slice(0,o.index),a.viewTo=o.lineN):lr(e):(l=sr(e,t,t,-1),s=sr(e,n,n+r,1),l&&s?(a.view=a.view.slice(0,l.index).concat(on(e,l.lineN,s.lineN)).concat(a.view.slice(s.index)),a.viewTo+=r):lr(e));var u=a.externalMeasured;u&&(n<u.lineN?u.lineN+=r:t<u.lineN+u.size&&(a.externalMeasured=null))}function or(e,t,n){e.curOp.viewChanged=!0;var r,i,o=e.display,l=e.display.externalMeasured;l&&t>=l.lineN&&t<l.lineN+l.size&&(o.externalMeasured=null),t<o.viewFrom||t>=o.viewTo||(null==(r=o.view[rr(e,t)]).node||-1==B(i=r.changes||(r.changes=[]),n)&&i.push(n))}function lr(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function sr(e,t,n,r){var i,o=rr(e,t),l=e.display.view;if(!Nt||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(0<r){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;Vt(e.doc,n)!=n;){if(o==(r<0?0:l.length-1))return null;n+=r*l[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function ar(e){for(var t=e.display.view,n=0,r=0;r<t.length;r++){var i=t[r];i.hidden||i.node&&!i.changes||++n}return n}function ur(e){e.display.input.showSelection(e.display.input.prepareSelection())}function cr(e,t){void 0===t&&(t=!0);for(var n,r,i=e.doc,o={},l=o.cursors=document.createDocumentFragment(),s=o.selection=document.createDocumentFragment(),a=0;a<i.sel.ranges.length;a++){!t&&a==i.sel.primIndex||((n=i.sel.ranges[a]).from().line>=e.display.viewTo||n.to().line<e.display.viewFrom||(((r=n.empty())||e.options.showCursorWhenSelecting)&&hr(e,n.head,l),r||function(l,e,t){var n=l.display,r=l.doc,i=document.createDocumentFragment(),o=Cn(l.display),T=o.left,M=Math.max(n.sizerWidth,Ln(l)-n.sizer.offsetLeft)-o.right,N="ltr"==r.direction;function A(e,t,n,r){t<0&&(t=0),t=Math.round(t),r=Math.round(r),i.appendChild(O("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n top: "+t+"px; width: "+(null==n?M-e:n)+"px;\n height: "+(r-t)+"px"))}function s(n,y,b){var w,x,o=Qe(r,n),C=o.text.length;function S(e,t){return Un(l,lt(n,e),"div",o,t)}function L(e,t,n){var r=_n(l,o,null,e),i="ltr"==t==("after"==n)?"left":"right";return S("after"==n?r.begin:r.end-(/\s/.test(o.text.charAt(r.end-1))?2:1),i)[i]}var k=ye(o,r.direction);return function(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<n&&l.to>t||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),1==l.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(k,y||0,null==b?C:b,function(e,t,n,r){var i,o,l,s,a,u,c,h="ltr"==n,d=S(e,h?"left":"right"),f=S(t-1,h?"right":"left"),p=null==y&&0==e,g=null==b&&t==C,m=0==r,v=!k||r==k.length-1;f.top-d.top<=3?(i=(N?g:p)&&v,o=(N?p:g)&&m?T:(h?d:f).left,l=i?M:(h?f:d).right,A(o,d.top,l-o,d.bottom)):(c=h?(s=N&&p&&m?T:d.left,a=N?M:L(e,n,"before"),u=N?T:L(t,n,"after"),N&&g&&v?M:f.right):(s=N?L(e,n,"before"):T,a=!N&&p&&m?M:d.right,u=!N&&g&&v?T:f.left,N?L(t,n,"after"):M),A(s,d.top,a-s,d.bottom),d.bottom<f.top&&A(T,d.bottom,null,f.top),A(u,f.top,c-u,f.bottom)),(!w||dr(d,w)<0)&&(w=d),dr(f,w)<0&&(w=f),(!x||dr(d,x)<0)&&(x=d),dr(f,x)<0&&(x=f)}),{start:w,end:x}}var a=e.from(),u=e.to();{var c,h,d,f,p;a.line==u.line?s(a.line,a.ch,u.ch):(c=Qe(r,a.line),h=Qe(r,u.line),d=Ut(c)==Ut(h),f=s(a.line,a.ch,d?c.text.length+1:null).end,p=s(u.line,d?0:null,u.ch).start,d&&(f.top<p.top-2?(A(f.right,f.top,null,f.bottom),A(T,p.top,p.left,p.bottom)):A(f.right,f.top,p.left-f.right,f.bottom)),f.bottom<p.top&&A(T,f.bottom,null,p.top))}t.appendChild(i)}(e,n,s)))}return o}function hr(e,t,n){var r,i=Vn(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),o=n.appendChild(O("div"," ","CodeMirror-cursor"));o.style.left=i.left+"px",o.style.top=i.top+"px",o.style.height=Math.max(0,i.bottom-i.top)*e.options.cursorHeight+"px",i.other&&((r=n.appendChild(O("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"))).style.display="",r.style.left=i.other.left+"px",r.style.top=i.other.top+"px",r.style.height=.85*(i.other.bottom-i.other.top)+"px")}function dr(e,t){return e.top-t.top||e.left-t.left}function fr(e){var t,n;e.state.focused&&(t=e.display,clearInterval(t.blinker),n=!0,t.cursorDiv.style.visibility="",0<e.options.cursorBlinkRate?t.blinker=setInterval(function(){e.hasFocus()||vr(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden"))}function pr(e){e.hasFocus()||(e.display.input.focus(),e.state.focused||mr(e))}function gr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,e.state.focused&&vr(e))},100)}function mr(e,t){e.state.delayingBlurEvent&&!e.state.draggingText&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(Se(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),v&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),fr(e))}function vr(e,t){e.state.delayingBlurEvent||(e.state.focused&&(Se(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function yr(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r<t.view.length;r++){var i,o,l=t.view[r],s=e.options.lineWrapping,a=void 0,u=0;if(!l.hidden){L&&x<8?(a=(i=l.node.offsetTop+l.node.offsetHeight)-n,n=i):(a=(o=l.node.getBoundingClientRect()).bottom-o.top,!s&&l.text.firstChild&&(u=l.text.firstChild.getBoundingClientRect().right-o.left-1));var c,h=l.line.height-a;if((.005<h||h<-.005)&&(tt(l.line,a),br(l.line),l.rest))for(var d=0;d<l.rest.length;d++)br(l.rest[d]);u>e.display.sizerWidth&&((c=Math.ceil(u/Zn(e.display)))>e.display.maxLineLength&&(e.display.maxLineLength=c,e.display.maxLine=l.line,e.display.maxLineChanged=!0))}}}function br(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var n=e.widgets[t],r=n.node.parentNode;r&&(n.height=r.offsetHeight)}}function wr(e,t,n){var r,i,o=n&&null!=n.top?Math.max(0,n.top):e.scroller.scrollTop,o=Math.floor(o-wn(e)),l=n&&null!=n.bottom?n.bottom:o+e.wrapper.clientHeight,s=rt(t,o),a=rt(t,l);return n&&n.ensure&&(r=n.ensure.from.line,i=n.ensure.to.line,r<s?a=rt(t,Xt(Qe(t,s=r))+e.wrapper.clientHeight):Math.min(i,t.lastLine())>=a&&(s=rt(t,Xt(Qe(t,i))-e.wrapper.clientHeight),a=i)),{from:s,to:Math.max(a,s+1)}}function xr(e,t){var n=e.display,r=qn(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:n.scroller.scrollTop,o=kn(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s,a=e.doc.height+xn(n),u=t.top<r,c=t.bottom>a-r;t.top<i?l.scrollTop=u?0:t.top:t.bottom>i+o&&((s=Math.min(t.top,(c?a:t.bottom)-o))!=i&&(l.scrollTop=s));var h=e.options.fixedGutter?0:n.gutters.offsetWidth,d=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft-h,f=Ln(e)-n.gutters.offsetWidth,p=t.right-t.left>f;return p&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<d?l.scrollLeft=Math.max(0,t.left+h-(p?0:10)):t.right>f+d-3&&(l.scrollLeft=t.right+(p?0:10)-f),l}function Cr(e,t){null!=t&&(kr(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sr(e){kr(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Lr(e,t,n){null==t&&null==n||kr(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function kr(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tr(e,Kn(e,t.from),Kn(e,t.to),t.margin))}function Tr(e,t,n,r){var i=xr(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Lr(e,i.scrollLeft,i.scrollTop)}function Mr(e,t){Math.abs(e.doc.scrollTop-t)<2||(g||$r(e,{top:t}),Nr(e,t,!0),g&&$r(e),Kr(e,100))}function Nr(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),e.display.scroller.scrollTop==t&&!n||(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Ar(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,Qr(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Or(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+xn(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+Sn(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}function Dr(e,t,n){this.cm=n;var r=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),we(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),we(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,L&&x<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}Dr.prototype.update=function(e){var t,n,r=e.scrollWidth>e.clientWidth+1,i=e.scrollHeight>e.clientHeight+1,o=e.nativeBarWidth;return i?(this.vert.style.display="block",this.vert.style.bottom=r?o+"px":"0",t=e.viewHeight-(r?o:0),this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+t)+"px"):(this.vert.style.display="",this.vert.firstChild.style.height="0"),r?(this.horiz.style.display="block",this.horiz.style.right=i?o+"px":"0",this.horiz.style.left=e.barLeft+"px",n=e.viewWidth-e.barLeft-(i?o:0),this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+n)+"px"):(this.horiz.style.display="",this.horiz.firstChild.style.width="0"),!this.checkedZeroWidth&&0<e.clientHeight&&(0==o&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:i?o:0,bottom:r?o:0}},Dr.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},Dr.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},Dr.prototype.zeroWidthHack=function(){var e=y&&!s?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new z,this.disableVert=new z},Dr.prototype.enableZeroWidthBar=function(n,r,i){n.style.pointerEvents="auto",r.set(1e3,function e(){var t=n.getBoundingClientRect();("vert"==i?document.elementFromPoint(t.right-1,(t.top+t.bottom)/2):document.elementFromPoint((t.right+t.left)/2,t.bottom-1))!=n?n.style.pointerEvents="none":r.set(1e3,e)})},Dr.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};function Wr(){}function Hr(e,t){t=t||Or(e);var n=e.display.barWidth,r=e.display.barHeight;Fr(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&yr(e),Fr(e,Or(e)),n=e.display.barWidth,r=e.display.barHeight}function Fr(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}Wr.prototype.update=function(){return{bottom:0,right:0}},Wr.prototype.setScrollLeft=function(){},Wr.prototype.setScrollTop=function(){},Wr.prototype.clear=function(){};var Er={native:Dr,null:Wr};function Pr(n){n.display.scrollbars&&(n.display.scrollbars.clear(),n.display.scrollbars.addClass&&T(n.display.wrapper,n.display.scrollbars.addClass)),n.display.scrollbars=new Er[n.options.scrollbarStyle](function(e){n.display.wrapper.insertBefore(e,n.display.scrollbarFiller),we(e,"mousedown",function(){n.state.focused&&setTimeout(function(){return n.display.input.focus()},0)}),e.setAttribute("cm-not-content","true")},function(e,t){("horizontal"==t?Ar:Mr)(n,e)},n),n.display.scrollbars.addClass&&H(n.display.wrapper,n.display.scrollbars.addClass)}var Ir=0;function Rr(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ir},t=e.curOp,ln?ln.ops.push(t):t.ownsGroup=ln={ops:[t],delayedCallbacks:[]}}function zr(e){var t=e.curOp;t&&sn(t,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,n=0;n<t.length;n++)!function(e){var t=e.cm,n=t.display;(function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=Sn(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=Sn(e)+"px",t.scrollbarsClipped=!0)})(t),e.updateMaxLine&&_t(t);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<n.viewFrom||e.scrollToPos.to.line>=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new Xr(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}(t[n]);for(var r=0;r<t.length;r++)!function(e){e.updatedDisplay=e.mustUpdate&&Yr(e.cm,e.update)}(t[r]);for(var i=0;i<t.length;i++)!function(e){var t=e.cm,n=t.display;e.updatedDisplay&&yr(t);e.barMeasure=Or(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Mn(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+Sn(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Ln(t)));(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}(t[i]);for(var o=0;o<t.length;o++)!function(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&Ar(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var n=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,n);!e.updatedDisplay&&e.startHeight==t.doc.height||Hr(t,e.barMeasure);e.updatedDisplay&&Zr(t,e.barMeasure);e.selectionChanged&&fr(t);t.state.focused&&e.updateInput&&t.display.input.reset(e.typing);n&&pr(e.cm)}(t[o]);for(var l=0;l<t.length;l++)!function(e){var t=e.cm,n=t.display,r=t.doc;e.updatedDisplay&&_r(t,e.update);null==n.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(n.wheelStartX=n.wheelStartY=null);null!=e.scrollTop&&Nr(t,e.scrollTop,e.forceScroll);null!=e.scrollLeft&&Ar(t,e.scrollLeft,!0,!0);{var i;e.scrollToPos&&(i=function(e,t,n,r){null==r&&(r=0),e.options.lineWrapping||t!=n||(n="before"==(t=t.ch?lt(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?lt(t.line,t.ch+1,"before"):t);for(var i=0;i<5;i++){var o,l=!1,s=Vn(e,t),a=n&&n!=t?Vn(e,n):s,u=xr(e,o={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-r,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+r}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mr(e,u.scrollTop),1<Math.abs(e.doc.scrollTop-c)&&(l=!0)),null!=u.scrollLeft&&(Ar(e,u.scrollLeft),1<Math.abs(e.doc.scrollLeft-h)&&(l=!0)),!l)break}return o}(t,ft(r,e.scrollToPos.from),ft(r,e.scrollToPos.to),e.scrollToPos.margin),function(e,t){var n,r,i,o;Le(e,"scrollCursorIntoView")||(r=(n=e.display).sizer.getBoundingClientRect(),i=null,t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null==i||u||(o=O("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-wn(e.display))+"px;\n height: "+(t.bottom-t.top+Sn(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;"),e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)))}(t,i))}var o=e.maybeHiddenMarkers,l=e.maybeUnhiddenMarkers;if(o)for(var s=0;s<o.length;++s)o[s].lines.length||Se(o[s],"hide");if(l)for(var a=0;a<l.length;++a)l[a].lines.length&&Se(l[a],"unhide");n.wrapper.offsetHeight&&(r.scrollTop=t.display.scroller.scrollTop);e.changeObjs&&Se(t,"changes",t,e.changeObjs);e.update&&e.update.finish()}(t[l])}(e)})}function Br(e,t){if(e.curOp)return t();Rr(e);try{return t()}finally{zr(e)}}function Gr(e,t){return function(){if(e.curOp)return t.apply(e,arguments);Rr(e);try{return t.apply(e,arguments)}finally{zr(e)}}}function Ur(e){return function(){if(this.curOp)return e.apply(this,arguments);Rr(this);try{return e.apply(this,arguments)}finally{zr(this)}}}function Vr(t){return function(){var e=this.cm;if(!e||e.curOp)return t.apply(this,arguments);Rr(e);try{return t.apply(this,arguments)}finally{zr(e)}}}function Kr(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,P(jr,e))}function jr(a){var u,c,h,d=a.doc;d.highlightFrontier>=a.display.viewTo||(u=+new Date+a.options.workTime,c=bt(a,d.highlightFrontier),h=[],d.iter(c.line,Math.min(d.first+d.size,a.display.viewTo+500),function(e){if(c.line>=a.display.viewFrom){var t=e.styles,n=e.text.length>a.options.maxHighlightLength?_e(d.mode,c.state):null,r=vt(a,e,c,!0);n&&(c.state=n),e.styles=r.styles;var i=e.styleClasses,o=r.classes;o?e.styleClasses=o:i&&(e.styleClasses=null);for(var l=!t||t.length!=e.styles.length||i!=o&&(!i||!o||i.bgClass!=o.bgClass||i.textClass!=o.textClass),s=0;!l&&s<t.length;++s)l=t[s]!=e.styles[s];l&&h.push(c.line),e.stateAfter=c.save(),c.nextLine()}else e.text.length<=a.options.maxHighlightLength&&wt(a,e.text,c),e.stateAfter=c.line%5==0?c.save():null,c.nextLine();if(+new Date>u)return Kr(a,a.options.workDelay),!0}),d.highlightFrontier=c.line,d.modeFrontier=Math.max(d.modeFrontier,c.line),h.length&&Br(a,function(){for(var e=0;e<h.length;e++)or(a,h[e],"text")}))}var Xr=function(e,t,n){var r=e.display;this.viewport=t,this.visible=wr(r,e.doc,t),this.editorIsHidden=!r.wrapper.offsetWidth,this.wrapperHeight=r.wrapper.clientHeight,this.wrapperWidth=r.wrapper.clientWidth,this.oldDisplayWidth=Ln(e),this.force=n,this.dims=Qn(e),this.events=[]};function Yr(e,t){var n=e.display,r=e.doc;if(t.editorIsHidden)return lr(e),!1;if(!t.force&&t.visible.from>=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==ar(e))return!1;Jr(e)&&(lr(e),t.dims=Qn(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFrom<o&&o-n.viewFrom<20&&(o=Math.max(r.first,n.viewFrom)),n.viewTo>l&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),Nt&&(o=Vt(e.doc,o),l=Kt(e.doc,l));var s,a,u,c,h=o!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;a=o,u=l,0==(c=(s=e).display).view.length||a>=c.viewTo||u<=c.viewFrom?(c.view=on(s,a,u),c.viewFrom=a):(c.viewFrom>a?c.view=on(s,a,c.viewFrom).concat(c.view):c.viewFrom<a&&(c.view=c.view.slice(rr(s,a))),c.viewFrom=a,c.viewTo<u?c.view=c.view.concat(on(s,c.viewTo,u)):c.viewTo>u&&(c.view=c.view.slice(0,rr(s,u)))),c.viewTo=u,n.viewOffset=Xt(Qe(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var d=ar(e);if(!h&&0==d&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var f,p,g,m=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var n,r={activeElt:t};return!window.getSelection||(n=window.getSelection()).anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset),r}(e);return 4<d&&(n.lineDiv.style.display="none"),function(n,e,t){var r=n.display,i=n.options.lineNumbers,o=r.lineDiv,l=o.firstChild;function s(e){var t=e.nextSibling;return v&&y&&n.display.currentWheelTarget==e?e.style.display="none":e.parentNode.removeChild(e),t}for(var a=r.view,u=r.viewFrom,c=0;c<a.length;c++){var h=a[c];if(!h.hidden)if(h.node&&h.node.parentNode==o){for(;l!=h.node;)l=s(l);var d=i&&null!=e&&e<=u&&h.lineNumber;h.changes&&(-1<B(h.changes,"gutter")&&(d=!1),hn(n,h,u,t)),d&&(M(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(ot(n.options,u)))),l=h.node.nextSibling}else{var f=function(e,t,n,r){var i=fn(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),pn(e,t),gn(e,t,n,r),mn(e,t,r),t.node}(n,h,u,t);o.insertBefore(f,l)}u+=h.size}for(;l;)l=s(l)}(e,n.updateLineNumbers,t.dims),4<d&&(n.lineDiv.style.display=""),n.renderedView=n.view,(f=m)&&f.activeElt&&f.activeElt!=W()&&(f.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(f.activeElt.nodeName)&&f.anchorNode&&D(document.body,f.anchorNode)&&D(document.body,f.focusNode)&&(p=window.getSelection(),(g=document.createRange()).setEnd(f.anchorNode,f.anchorOffset),g.collapse(!1),p.removeAllRanges(),p.addRange(g),p.extend(f.focusNode,f.focusOffset))),M(n.cursorDiv),M(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,h&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,Kr(e,400)),!(n.updateLineNumbers=null)}function _r(e,t){for(var n=t.viewport,r=!0;;r=!1){if(r&&e.options.lineWrapping&&t.oldDisplayWidth!=Ln(e))r&&(t.visible=wr(e.display,e.doc,n));else if(n&&null!=n.top&&(n={top:Math.min(e.doc.height+xn(e.display)-kn(e),n.top)}),t.visible=wr(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break;if(!Yr(e,t))break;yr(e);var i=Or(e);ur(e),Hr(e,i),Zr(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function $r(e,t){var n,r=new Xr(e,t);Yr(e,r)&&(yr(e),_r(e,r),n=Or(e),ur(e),Hr(e,n),Zr(e,n),r.finish())}function qr(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function Zr(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Sn(e)+"px"}function Qr(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=Jn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",l=0;l<n.length;l++)if(!n[l].hidden){e.options.fixedGutter&&(n[l].gutter&&(n[l].gutter.style.left=o),n[l].gutterBackground&&(n[l].gutterBackground.style.left=o));var s=n[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}}function Jr(e){if(e.options.lineNumbers){var t=e.doc,n=ot(e.options,t.first+t.size-1),r=e.display;if(n.length!=r.lineNumChars){var i=r.measure.appendChild(O("div",[O("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return r.lineGutter.style.width="",r.lineNumInnerWidth=Math.max(o,r.lineGutter.offsetWidth-l)+1,r.lineNumWidth=r.lineNumInnerWidth+l,r.lineNumChars=r.lineNumInnerWidth?n.length:-1,r.lineGutter.style.width=r.lineNumWidth+"px",qr(e.display),1}}}function ei(e,t){for(var n=[],r=!1,i=0;i<e.length;i++){var o=e[i],l=null;if("string"!=typeof o&&(l=o.style,o=o.className),"CodeMirror-linenumbers"==o){if(!t)continue;r=!0}n.push({className:o,style:l})}return t&&!r&&n.push({className:"CodeMirror-linenumbers",style:null}),n}function ti(e){var t=e.gutters,n=e.gutterSpecs;M(t),e.lineGutter=null;for(var r=0;r<n.length;++r){var i=n[r],o=i.className,l=i.style,s=t.appendChild(O("div",null,"CodeMirror-gutter "+o));l&&(s.style.cssText=l),"CodeMirror-linenumbers"==o&&((e.lineGutter=s).style.width=(e.lineNumWidth||1)+"px")}t.style.display=n.length?"":"none",qr(e)}function ni(e){ti(e.display),ir(e),Qr(e)}function ri(e,t,n,r){var i=this;this.input=n,i.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),i.scrollbarFiller.setAttribute("cm-not-content","true"),i.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),i.gutterFiller.setAttribute("cm-not-content","true"),i.lineDiv=A("div",null,"CodeMirror-code"),i.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),i.cursorDiv=O("div",null,"CodeMirror-cursors"),i.measure=O("div",null,"CodeMirror-measure"),i.lineMeasure=O("div",null,"CodeMirror-measure"),i.lineSpace=A("div",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,"position: relative; outline: none");var o=A("div",[i.lineSpace],"CodeMirror-lines");i.mover=O("div",[o],null,"position: relative"),i.sizer=O("div",[i.mover],"CodeMirror-sizer"),i.sizerWidth=null,i.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),i.gutters=O("div",null,"CodeMirror-gutters"),i.lineGutter=null,i.scroller=O("div",[i.sizer,i.heightForcer,i.gutters],"CodeMirror-scroll"),i.scroller.setAttribute("tabIndex","-1"),i.wrapper=O("div",[i.scrollbarFiller,i.gutterFiller,i.scroller],"CodeMirror"),L&&x<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),v||g&&d||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,i.gutterSpecs=ei(r.gutters,r.lineNumbers),ti(i),n.init(i)}Xr.prototype.signal=function(e,t){Te(e,t)&&this.events.push(arguments)},Xr.prototype.finish=function(){for(var e=0;e<this.events.length;e++)Se.apply(null,this.events[e])};var ii=0,oi=null;function li(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==n&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:null==n&&(n=e.wheelDelta),{x:t,y:n}}function si(e){var t=li(e);return t.x*=oi,t.y*=oi,t}function ai(e,t){var n,r,i,o=li(t),l=o.x,s=o.y,a=e.display,u=a.scroller,c=u.scrollWidth>u.clientWidth,h=u.scrollHeight>u.clientHeight;if(l&&c||s&&h){if(s&&y&&v)e:for(var d=t.target,f=a.view;d!=u;d=d.parentNode)for(var p=0;p<f.length;p++)if(f[p].node==d){e.display.currentWheelTarget=d;break e}if(l&&!g&&!m&&null!=oi)return s&&h&&Mr(e,Math.max(0,u.scrollTop+s*oi)),Ar(e,Math.max(0,u.scrollLeft+l*oi)),(!s||s&&h)&&Ne(t),void(a.wheelStartX=null);s&&null!=oi&&(n=s*oi,i=(r=e.doc.scrollTop)+a.wrapper.clientHeight,n<0?r=Math.max(0,r+n-50):i=Math.min(e.doc.height,i+n+50),$r(e,{top:r,bottom:i})),ii<20&&(null==a.wheelStartX?(a.wheelStartX=u.scrollLeft,a.wheelStartY=u.scrollTop,a.wheelDX=l,a.wheelDY=s,setTimeout(function(){var e,t,n;null!=a.wheelStartX&&(e=u.scrollLeft-a.wheelStartX,n=(t=u.scrollTop-a.wheelStartY)&&a.wheelDY&&t/a.wheelDY||e&&a.wheelDX&&e/a.wheelDX,a.wheelStartX=a.wheelStartY=null,n&&(oi=(oi*ii+n)/(ii+1),++ii))},200)):(a.wheelDX+=l,a.wheelDY+=s))}}L?oi=-.53:g?oi=15:l?oi=-.7:c&&(oi=-1/3);var ui=function(e,t){this.ranges=e,this.primIndex=t};ui.prototype.primary=function(){return this.ranges[this.primIndex]},ui.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(!at(n.anchor,r.anchor)||!at(n.head,r.head))return!1}return!0},ui.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new ci(ut(this.ranges[t].anchor),ut(this.ranges[t].head));return new ui(e,this.primIndex)},ui.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},ui.prototype.contains=function(e,t){t=t||e;for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(0<=st(t,r.from())&&st(e,r.to())<=0)return n}return-1};var ci=function(e,t){this.anchor=e,this.head=t};function hi(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort(function(e,t){return st(e.from(),t.from())}),n=B(t,i);for(var o=1;o<t.length;o++){var l,s,a,u=t[o],c=t[o-1],h=st(c.to(),u.from());(r&&!u.empty()?0<h:0<=h)&&(l=ht(c.from(),u.from()),s=ct(c.to(),u.to()),a=c.empty()?u.from()==u.head:c.from()==c.head,o<=n&&--n,t.splice(--o,2,new ci(a?s:l,a?l:s)))}return new ui(t,n)}function di(e,t){return new ui([new ci(e,t||e)],0)}function fi(e){return e.text?lt(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function pi(e,t){if(st(e,t.from)<0)return e;if(st(e,t.to)<=0)return fi(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=fi(t).ch-t.to.ch),lt(n,r)}function gi(e,t){for(var n=[],r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new ci(pi(i.anchor,t),pi(i.head,t)))}return hi(e.cm,n,e.sel.primIndex)}function mi(e,t,n){return e.line==t.line?lt(n.line,e.ch-t.ch+n.ch):lt(n.line+(e.line-t.line),e.ch)}function vi(e){e.doc.mode=je(e.options,e.doc.modeOption),yi(e)}function yi(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Kr(e,100),e.state.modeGen++,e.curOp&&ir(e)}function bi(e,t){return 0==t.from.ch&&0==t.to.ch&&""==$(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function wi(e,r,t,i){function o(e){return t?t[e]:null}function n(e,t,n){!function(e,t,n,r){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),Ht(e),Ft(e,n);var i=r?r(e):1;i!=e.height&&tt(e,i)}(e,t,n,i),un(e,"change",e,r)}function l(e,t){for(var n=[],r=e;r<t;++r)n.push(new $t(d[r],o(r),i));return n}var s,a,u,c=r.from,h=r.to,d=r.text,f=Qe(e,c.line),p=Qe(e,h.line),g=$(d),m=o(d.length-1),v=h.line-c.line;r.full?(e.insert(0,l(0,d.length)),e.remove(d.length,e.size-d.length)):bi(e,r)?(s=l(0,d.length-1),n(p,p.text,m),v&&e.remove(c.line,v),s.length&&e.insert(c.line,s)):f==p?1==d.length?n(f,f.text.slice(0,c.ch)+g+f.text.slice(h.ch),m):((a=l(1,d.length-1)).push(new $t(g+f.text.slice(h.ch),m,i)),n(f,f.text.slice(0,c.ch)+d[0],o(0)),e.insert(c.line+1,a)):1==d.length?(n(f,f.text.slice(0,c.ch)+d[0]+p.text.slice(h.ch),o(0)),e.remove(c.line+1,v)):(n(f,f.text.slice(0,c.ch)+d[0],o(0)),n(p,g+p.text.slice(h.ch),m),u=l(1,d.length-1),1<v&&e.remove(c.line+1,v-1),e.insert(c.line+1,u)),un(e,"change",e,r)}function xi(e,s,a){!function e(t,n,r){if(t.linked)for(var i=0;i<t.linked.length;++i){var o,l=t.linked[i];l.doc!=n&&(o=r&&l.sharedHist,a&&!o||(s(l.doc,o),e(l.doc,t,o)))}}(e,null,!0)}function Ci(e,t){if(t.cm)throw new Error("This document is already in use.");tr((e.doc=t).cm=e),vi(e),Si(e),e.options.lineWrapping||_t(e),e.options.mode=t.modeOption,ir(e)}function Si(e){("rtl"==e.doc.direction?H:T)(e.display.lineDiv,"CodeMirror-rtl")}function Li(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function ki(e,t){var n={from:ut(t.from),to:fi(t),text:Je(e,t.from,t.to)};return Oi(e,n,t.from.line,t.to.line+1),xi(e,function(e){return Oi(e,n,t.from.line,t.to.line+1),0},!0),n}function Ti(e){for(;e.length;){if(!$(e).ranges)break;e.pop()}}function Mi(e,t,n,r){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=(s=i).lastOp==r?(Ti(s.done),$(s.done)):s.done.length&&!$(s.done).ranges?$(s.done):1<s.done.length&&!s.done[s.done.length-2].ranges?(s.done.pop(),$(s.done)):void 0))l=$(o.changes),0==st(t.from,t.to)&&0==st(t.from,l.to)?l.to=fi(t):o.changes.push(ki(e,t));else{var u=$(i.done);for(u&&u.ranges||Ai(e.sel,i.done),o={changes:[ki(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,l||Se(e,"historyAdded")}function Ni(e,t,n,r){var i,o,l,s,a,u=e.history,c=r&&r.origin;n==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=$(u.done),s=t,"*"==(a=o.charAt(0))||"+"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Ai(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=n,r&&!1!==r.clearRedo&&Ti(u.undone)}function Ai(e,t){var n=$(t);n&&n.ranges&&n.equals(e)||t.push(e)}function Oi(t,n,e,r){var i=n["spans_"+t.id],o=0;t.iter(Math.max(t.first,e),Math.min(t.first+t.size,r),function(e){e.markedSpans&&((i=i||(n["spans_"+t.id]={}))[o]=e.markedSpans),++o})}function Di(e,t){var n=t["spans_"+e.id];if(!n)return null;for(var r=[],i=0;i<t.text.length;++i)r.push(function(e){if(!e)return null;for(var t,n=0;n<e.length;++n)e[n].marker.explicitlyCleared?t=t||e.slice(0,n):t&&t.push(e[n]);return t?t.length?t:null:e}(n[i]));return r}function Wi(e,t){var n=Di(e,t),r=Dt(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var o=n[i],l=r[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(n[i]=l)}return n}function Hi(e,t,n){for(var r=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)r.push(n?ui.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];r.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\d+)$/))&&-1<B(t,Number(c[1]))&&($(s)[h]=u[h],delete u[h])}}}return r}function Fi(e,t,n,r){if(r){var i,o=e.anchor;return n&&((i=st(t,o)<0)!=st(n,o)<0?(o=t,t=n):i!=st(t,n)<0&&(t=n)),new ci(o,t)}return new ci(n||t,t)}function Ei(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),Bi(e,new ui([Fi(e.sel.primary(),t,n,i)],0),r)}function Pi(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)r[o]=Fi(e.sel.ranges[o],t[o],null,i);Bi(e,hi(e.cm,r,e.sel.primIndex),n)}function Ii(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,Bi(e,hi(e.cm,i,e.sel.primIndex),r)}function Ri(e,t,n,r){Bi(e,di(t,n),r)}function zi(e,t,n){var r=e.history.done,i=$(r);i&&i.ranges?Gi(e,r[r.length-1]=t,n):Bi(e,t,n)}function Bi(e,t,n){Gi(e,t,n),Ni(e,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function Gi(e,t,n){var r,i,o,l;(Te(e,"beforeSelectionChange")||e.cm&&Te(e.cm,"beforeSelectionChange"))&&(r=e,o=n,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new ci(ft(r,e[t].anchor),ft(r,e[t].head))},origin:o&&o.origin},Se(r,"beforeSelectionChange",r,l),r.cm&&Se(r.cm,"beforeSelectionChange",r.cm,l),t=l.ranges!=i.ranges?hi(r.cm,l.ranges,l.ranges.length-1):i);var s=n&&n.bias||(st(t.primary().head,e.sel.primary().head)<0?-1:1);Ui(e,Ki(e,t,s,!0)),n&&!1===n.scroll||!e.cm||Sr(e.cm)}function Ui(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=1,e.cm.curOp.selectionChanged=!0,ke(e.cm)),un(e,"cursorActivity",e))}function Vi(e){Ui(e,Ki(e,e.sel,null,!1))}function Ki(e,t,n,r){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Xi(e,l.anchor,s&&s.anchor,n,r),u=Xi(e,l.head,s&&s.head,n,r);!i&&a==l.anchor&&u==l.head||((i=i||t.ranges.slice(0,o))[o]=new ci(a,u))}return i?hi(e.cm,i,t.primIndex):t}function ji(e,t,n,r,i){var o=Qe(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker,u="selectLeft"in a?!a.selectLeft:a.inclusiveLeft,c="selectRight"in a?!a.selectRight:a.inclusiveRight;if((null==s.from||(u?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(c?s.to>=t.ch:s.to>t.ch))){if(i&&(Se(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(n){var h=a.find(r<0?1:-1),d=void 0;if((r<0?c:u)&&(h=Yi(e,h,-r,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(d=st(h,n))&&(r<0?d<0:0<d))return ji(e,h,t,r,i)}var f=a.find(r<0?-1:1);return(r<0?u:c)&&(f=Yi(e,f,r,f.line==t.line?o:null)),f?ji(e,f,t,r,i):null}}return t}function Xi(e,t,n,r,i){var o=r||1,l=ji(e,t,n,o,i)||!i&&ji(e,t,n,o,!0)||ji(e,t,n,-o,i)||!i&&ji(e,t,n,-o,!0);return l||(e.cantEdit=!0,lt(e.first,0))}function Yi(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?ft(e,lt(t.line-1)):null:0<n&&t.ch==(r||Qe(e,t.line)).text.length?t.line<e.first+e.size-1?lt(t.line+1,0):null:new lt(t.line,t.ch+n)}function _i(e){e.setSelection(lt(e.firstLine(),0),lt(e.lastLine()),V)}function $i(i,e,t){var o={canceled:!1,from:e.from,to:e.to,text:e.text,origin:e.origin,cancel:function(){return o.canceled=!0}};return t&&(o.update=function(e,t,n,r){e&&(o.from=ft(i,e)),t&&(o.to=ft(i,t)),n&&(o.text=n),void 0!==r&&(o.origin=r)}),Se(i,"beforeChange",i,o),i.cm&&Se(i.cm,"beforeChange",i.cm,o),o.canceled?(i.cm&&(i.cm.curOp.updateInput=2),null):{from:o.from,to:o.to,text:o.text,origin:o.origin}}function qi(e,t,n){if(e.cm){if(!e.cm.curOp)return Gr(e.cm,qi)(e,t,n);if(e.cm.state.suppressEdits)return}if(!(Te(e,"beforeChange")||e.cm&&Te(e.cm,"beforeChange"))||(t=$i(e,t,!0))){var r=Mt&&!n&&function(e,t,n){var r=null;if(e.iter(t.line,n.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;!n.readOnly||r&&-1!=B(r,n)||(r=r||[]).push(n)}}),!r)return null;for(var i=[{from:t,to:n}],o=0;o<r.length;++o)for(var l=r[o],s=l.find(0),a=0;a<i.length;++a){var u,c,h,d=i[a];st(d.to,s.from)<0||0<st(d.from,s.to)||(u=[a,1],c=st(d.from,s.from),h=st(d.to,s.to),(c<0||!l.inclusiveLeft&&!c)&&u.push({from:d.from,to:s.from}),(0<h||!l.inclusiveRight&&!h)&&u.push({from:s.to,to:d.to}),i.splice.apply(i,u),a+=u.length-3)}return i}(e,t.from,t.to);if(r)for(var i=r.length-1;0<=i;--i)Zi(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else Zi(e,t)}}function Zi(e,n){var t,r;1==n.text.length&&""==n.text[0]&&0==st(n.from,n.to)||(t=gi(e,n),Mi(e,n,t,e.cm?e.cm.curOp.id:NaN),eo(e,n,t,Dt(e,n)),r=[],xi(e,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Dt(e,n))}))}function Qi(i,o,e){var t=i.cm&&i.cm.state.suppressEdits;if(!t||e){for(var l,n=i.history,r=i.sel,s="undo"==o?n.done:n.undone,a="undo"==o?n.undone:n.done,u=0;u<s.length&&(l=s[u],e?!l.ranges||l.equals(i.sel):l.ranges);u++);if(u!=s.length){for(n.lastOrigin=n.lastSelOrigin=null;;){if(!(l=s.pop()).ranges){if(t)return void s.push(l);break}if(Ai(l,a),e&&!l.equals(i.sel))return void Bi(i,l,{clearRedo:!1});r=l}var c=[];Ai(r,a),a.push({changes:c,generation:n.generation}),n.generation=l.generation||++n.maxGeneration;for(var h=Te(i,"beforeChange")||i.cm&&Te(i.cm,"beforeChange"),d=l.changes.length-1;0<=d;--d){var f=function(e){var n=l.changes[e];if(n.origin=o,h&&!$i(i,n,!1))return s.length=0,{};c.push(ki(i,n));var t=e?gi(i,n):$(s);eo(i,n,t,Wi(i,n)),!e&&i.cm&&i.cm.scrollIntoView({from:n.from,to:fi(n)});var r=[];xi(i,function(e,t){t||-1!=B(r,e.history)||(io(e.history,n),r.push(e.history)),eo(e,n,null,Wi(e,n))})}(d);if(f)return f.v}}}}function Ji(e,t){if(0!=t&&(e.first+=t,e.sel=new ui(q(e.sel.ranges,function(e){return new ci(lt(e.anchor.line+t,e.anchor.ch),lt(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){ir(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;r<n.viewTo;r++)or(e.cm,r,"gutter")}}function eo(e,t,n,r){if(e.cm&&!e.cm.curOp)return Gr(e.cm,eo)(e,t,n,r);var i,o;t.to.line<e.first?Ji(e,t.text.length-1-(t.to.line-t.from.line)):t.from.line>e.lastLine()||(t.from.line<e.first&&(Ji(e,i=t.text.length-1-(e.first-t.from.line)),t={from:lt(e.first,0),to:lt(t.to.line+i,t.to.ch),text:[$(t.text)],origin:t.origin}),o=e.lastLine(),t.to.line>o&&(t={from:t.from,to:lt(o,Qe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Je(e,t.from,t.to),n=n||gi(e,t),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=nt(Ut(Qe(r,o.line))),r.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0}));-1<r.sel.contains(t.from,t.to)&&ke(e);wi(r,t,n,er(e)),e.options.lineWrapping||(r.iter(a,o.line+t.text.length,function(e){var t=Yt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var n=e.first,r=t-1;n<r;r--){var i=Qe(e,r).stateAfter;if(i&&(!(i instanceof gt)||r+i.lookAhead<t)){n=r+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,n)}})(r,o.line),Kr(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?ir(e):o.line!=l.line||1!=t.text.length||bi(e.doc,t)?ir(e,o.line,l.line+1,u):or(e,o.line,"text");var c=Te(e,"changes"),h=Te(e,"change");{var d;(h||c)&&(d={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin},h&&un(e,"change",e,d),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(d))}e.display.selForContextMenu=null}(e.cm,t,r):wi(e,t,r),Gi(e,n,V),e.cantEdit&&Xi(e,lt(e.firstLine(),0))&&(e.cantEdit=!1))}function to(e,t,n,r,i){var o;st(r=r||n,n)<0&&(n=(o=[r,n])[0],r=o[1]),"string"==typeof t&&(t=e.splitLines(t)),qi(e,{from:n,to:r,text:t,origin:i})}function no(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function ro(e,t,n,r){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)no(o.ranges[s].anchor,t,n,r),no(o.ranges[s].head,t,n,r)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(n<u.from.line)u.from=lt(u.from.line+r,u.from.ch),u.to=lt(u.to.line+r,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function io(e,t){var n=t.from.line,r=t.to.line,i=t.text.length-(r-n)-1;ro(e.done,n,r,i),ro(e.undone,n,r,i)}function oo(e,t,n,r){var i=t,o=t;return"number"==typeof t?o=Qe(e,dt(e,t)):i=nt(t),null==i?null:(r(o,i)&&e.cm&&or(e.cm,i,n),o)}function lo(e){this.lines=e,this.parent=null;for(var t=0,n=0;n<e.length;++n)e[n].parent=this,t+=e[n].height;this.height=t}function so(e){this.children=e;for(var t=0,n=0,r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}ci.prototype.from=function(){return ht(this.anchor,this.head)},ci.prototype.to=function(){return ct(this.anchor,this.head)},ci.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},lo.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n,r=e,i=e+t;r<i;++r){var o=this.lines[r];this.height-=o.height,(n=o).parent=null,Ht(n),un(o,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},so.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n,r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e),s=i.height;if(i.removeInner(e,l),this.height-=s-i.height,o==l&&(this.children.splice(r--,1),i.parent=null),0==(t-=l))break;e=0}else e-=o}this.size-t<25&&(1<this.children.length||!(this.children[0]instanceof lo))&&(n=[],this.collapse(n),this.children=[new lo(n)],this.children[0].parent=this)},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,n),i.lines&&50<i.lines.length){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new lo(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++r,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t,n,r=new so(e.children.splice(e.children.length-5,5));e.parent?(e.size-=r.size,e.height-=r.height,t=B(e.parent.children,e),e.parent.children.splice(t+1,0,r)):(((n=new so(e.children)).parent=e).children=[n,r],e=n),r.parent=e.parent}while(10<e.children.length);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,n))return!0;if(0==(t-=l))break;e=0}else e-=o}}};function ao(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.doc=e,this.node=t}function uo(e,t,n){Xt(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cr(e,n)}ao.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,n=this.line,r=nt(n);if(null!=r&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var o=yn(this);tt(n,Math.max(0,n.height-o)),e&&(Br(e,function(){uo(e,n,-o),or(e,r,"widget")}),un(e,"lineWidgetCleared",e,this,r))}},ao.prototype.changed=function(){var e=this,t=this.height,n=this.doc.cm,r=this.line;this.height=null;var i=yn(this)-t;i&&(jt(this.doc,r)||tt(r,r.height+i),n&&Br(n,function(){n.curOp.forceUpdate=!0,uo(n,r,i),un(n,"lineWidgetChanged",n,e,nt(r))}))},Me(ao);var co=0,ho=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++co};function fo(t,r,i,e,n){if(e&&e.shared)return function(e,n,r,i,o){(i=I(i)).shared=!1;var l=[fo(e,n,r,i,o)],s=l[0],a=i.widgetNode;return xi(e,function(e){a&&(i.widgetNode=a.cloneNode(!0)),l.push(fo(e,ft(e,n),ft(e,r),i,o));for(var t=0;t<e.linked.length;++t)if(e.linked[t].isParent)return;s=$(l)}),new po(l,s)}(t,r,i,e,n);if(t.cm&&!t.cm.curOp)return Gr(t.cm,fo)(t,r,i,e,n);var o=new ho(t,n),l=st(r,i);if(e&&I(e,o,!1),0<l||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),e.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),e.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Gt(t,r.line,r,i,o)||r.line!=i.line&&Gt(t,i.line,r,i,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Nt=!0}o.addToHistory&&Mi(t,{from:r,to:i,origin:"markText"},t.sel,NaN);var s,a=r.line,u=t.cm;if(t.iter(a,i.line+1,function(e){var t,n;u&&o.collapsed&&!u.options.lineWrapping&&Ut(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=r.line&&tt(e,0),t=e,n=new At(o,a==r.line?r.ch:null,a==i.line?i.ch:null),t.markedSpans=t.markedSpans?t.markedSpans.concat([n]):[n],n.marker.attachLine(t),++a}),o.collapsed&&t.iter(r.line,i.line+1,function(e){jt(t,e)&&tt(e,0)}),o.clearOnEnter&&we(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(Mt=!0,(t.history.done.length||t.history.undone.length)&&t.clearHistory()),o.collapsed&&(o.id=++co,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)ir(u,r.line,i.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=r.line;c<=i.line;c++)or(u,c,"text");o.atomic&&Vi(u.doc),un(u,"markerAdded",u,o)}return o}ho.prototype.clear=function(){if(!this.explicitlyCleared){var e,t=this.doc.cm,n=t&&!t.curOp;n&&Rr(t),!Te(this,"clear")||(e=this.find())&&un(this,"clear",e.from,e.to);for(var r=null,i=null,o=0;o<this.lines.length;++o){var l=this.lines[o],s=Ot(l.markedSpans,this);t&&!this.collapsed?or(t,nt(l),"text"):t&&(null!=s.to&&(i=nt(l)),null!=s.from&&(r=nt(l))),l.markedSpans=function(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n=n||[]).push(e[r]);return n}(l.markedSpans,s),null==s.from&&this.collapsed&&!jt(this.doc,l)&&t&&tt(l,qn(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var a=0;a<this.lines.length;++a){var u=Ut(this.lines[a]),c=Yt(u);c>t.display.maxLineLength&&(t.display.maxLine=u,t.display.maxLineLength=c,t.display.maxLineChanged=!0)}null!=r&&t&&this.collapsed&&ir(t,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&Vi(t.doc)),t&&un(t,"markerCleared",t,this,r,i),n&&zr(t),this.parent&&this.parent.clear()}},ho.prototype.find=function(e,t){var n,r;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Ot(o.markedSpans,this);if(null!=l.from&&(n=lt(t?o:nt(o),l.from),-1==e))return n;if(null!=l.to&&(r=lt(t?o:nt(o),l.to),1==e))return r}return n&&{from:n,to:r}},ho.prototype.changed=function(){var o=this,l=this.find(-1,!0),s=this,a=this.doc.cm;l&&a&&Br(a,function(){var e,t,n=l.line,r=nt(l.line),i=Nn(a,r);i&&(Fn(i),a.curOp.selectionChanged=a.curOp.forceUpdate=!0),a.curOp.updateMaxLine=!0,jt(s.doc,n)||null==s.height||(e=s.height,s.height=null,(t=yn(s)-e)&&tt(n,n.height+t)),un(a,"markerChanged",a,o)})},ho.prototype.attachLine=function(e){var t;!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)),this.lines.push(e)},ho.prototype.detachLine=function(e){var t;this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)},Me(ho);var po=function(e,t){this.markers=e,this.primary=t;for(var n=0;n<e.length;++n)e[n].parent=this};function go(e){return e.findMarks(lt(e.first,0),e.clipPos(lt(e.lastLine())),function(e){return e.parent})}po.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();un(this,"clear")}},po.prototype.find=function(e,t){return this.primary.find(e,t)},Me(po);var mo=0,vo=function(e,t,n,r,i){if(!(this instanceof vo))return new vo(e,t,n,r,i);null==n&&(n=0),so.call(this,[new lo([new $t("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1;var o=lt(this.modeFrontier=this.highlightFrontier=n,0);this.sel=di(o),this.history=new Li(null),this.id=++mo,this.modeOption=t,this.lineSep=r,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),wi(this,{from:o,to:o,text:e}),Bi(this,di(o),V)};vo.prototype=Q(so.prototype,{constructor:vo,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var n=0,r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=et(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Vr(function(e){var t=lt(this.first,0),n=this.first+this.size-1;qi(this,{from:t,to:lt(n,Qe(this,n).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&Lr(this.cm,0,0),Bi(this,di(t),V)}),replaceRange:function(e,t,n,r){to(this,e,t=ft(this,t),n=n?ft(this,n):t,r)},getRange:function(e,t,n){var r=Je(this,ft(this,e),ft(this,t));return!1===n?r:r.join(n||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(it(this,e))return Qe(this,e)},getLineNumber:nt,getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=Qe(this,e)),Ut(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return ft(this,e)},getCursor:function(e){var t=this.sel.primary(),n=null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from();return n},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Vr(function(e,t,n){Ri(this,ft(this,"number"==typeof e?lt(e,t||0):e),null,n)}),setSelection:Vr(function(e,t,n){Ri(this,ft(this,e),ft(this,t||e),n)}),extendSelection:Vr(function(e,t,n){Ei(this,ft(this,e),t&&ft(this,t),n)}),extendSelections:Vr(function(e,t){Pi(this,pt(this,e),t)}),extendSelectionsBy:Vr(function(e,t){Pi(this,pt(this,q(this.sel.ranges,e)),t)}),setSelections:Vr(function(e,t,n){if(e.length){for(var r=[],i=0;i<e.length;i++)r[i]=new ci(ft(this,e[i].anchor),ft(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),Bi(this,hi(this.cm,r,t),n)}}),addSelection:Vr(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new ci(ft(this,e),ft(this,t||e))),Bi(this,hi(this.cm,r,r.length-1),n)}),getSelection:function(e){for(var t=this.sel.ranges,n=0;n<t.length;n++)var r=Je(this,t[n].from(),t[n].to()),i=i?i.concat(r):r;return!1===e?i:i.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],n=this.sel.ranges,r=0;r<n.length;r++){var i=Je(this,n[r].from(),n[r].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[r]=i}return t},replaceSelection:function(e,t,n){for(var r=[],i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")},replaceSelections:Vr(function(e,t,n){for(var r=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];r[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:n}}for(var s=t&&"end"!=t&&function(e,t,n){for(var r=[],i=h=lt(e.first,0),o=0;o<t.length;o++){var l,s,a=t[o],u=mi(a.from,h,i),c=mi(fi(a),h,i),h=a.to,i=c;"around"==n?(s=st((l=e.sel.ranges[o]).head,l.anchor)<0,r[o]=new ci(s?c:u,s?u:c)):r[o]=new ci(u,u)}return new ui(r,e.sel.primIndex)}(this,r,t),a=r.length-1;0<=a;a--)qi(this,r[a]);s?zi(this,s):this.cm&&Sr(this.cm)}),undo:Vr(function(){Qi(this,"undo")}),redo:Vr(function(){Qi(this,"redo")}),undoSelection:Vr(function(){Qi(this,"undo",!0)}),redoSelection:Vr(function(){Qi(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){var t=this;this.history=new Li(this.history.maxGeneration),xi(this,function(e){return e.history=t.history},!0)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Hi(this.history.done),undone:Hi(this.history.undone)}},setHistory:function(e){var t=this.history=new Li(this.history.maxGeneration);t.done=Hi(e.done.slice(0),null,!0),t.undone=Hi(e.undone.slice(0),null,!0)},setGutterMarker:Vr(function(e,n,r){return oo(this,e,"gutter",function(e){var t=e.gutterMarkers||(e.gutterMarkers={});return!(t[n]=r)&&ne(t)&&(e.gutterMarkers=null),1})}),clearGutter:Vr(function(t){var n=this;this.iter(function(e){e.gutterMarkers&&e.gutterMarkers[t]&&oo(n,e,"gutter",function(){return e.gutterMarkers[t]=null,ne(e.gutterMarkers)&&(e.gutterMarkers=null),1})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!it(this,e))return null;if(!(e=Qe(this,t=e)))return null}else if(null==(t=nt(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Vr(function(e,n,r){return oo(this,e,"gutter"==n?"gutter":"class",function(e){var t="text"==n?"textClass":"background"==n?"bgClass":"gutter"==n?"gutterClass":"wrapClass";if(e[t]){if(S(r).test(e[t]))return;e[t]+=" "+r}else e[t]=r;return 1})}),removeLineClass:Vr(function(e,o,l){return oo(this,e,"gutter"==o?"gutter":"class",function(e){var t="text"==o?"textClass":"background"==o?"bgClass":"gutter"==o?"gutterClass":"wrapClass",n=e[t];if(n){if(null==l)e[t]=null;else{var r=n.match(S(l));if(!r)return;var i=r.index+r[0].length;e[t]=n.slice(0,r.index)+(r.index&&i!=n.length?" ":"")+n.slice(i)||null}return 1}})}),addLineWidget:Vr(function(e,t,n){return i=e,o=new ao(r=this,t,n),(l=r.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),oo(r,i,"widget",function(e){var t,n=e.widgets||(e.widgets=[]);return null==o.insertAt?n.push(o):n.splice(Math.min(n.length,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!jt(r,e)&&(t=Xt(e)<r.scrollTop,tt(e,e.height+yn(o)),t&&Cr(l,o.height),l.curOp.forceUpdate=!0),1}),l&&un(l,"lineWidgetAdded",l,o,"number"==typeof i?i:nt(i)),o;var r,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,n){return fo(this,ft(this,e),ft(this,t),n,n&&n.type||"range")},setBookmark:function(e,t){var n={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return fo(this,e=ft(this,e),e,n,"bookmark")},findMarksAt:function(e){var t=[],n=Qe(this,(e=ft(this,e)).line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(i,o,l){i=ft(this,i),o=ft(this,o);var s=[],a=i.line;return this.iter(i.line,o.line+1,function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;n++){var r=t[n];null!=r.to&&a==i.line&&i.ch>=r.to||null==r.from&&a!=i.line||null!=r.from&&a==o.line&&r.from>=o.ch||l&&!l(r.marker)||s.push(r.marker.parent||r.marker)}++a}),s},getAllMarks:function(){var r=[];return this.iter(function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;++n)null!=t[n].from&&r.push(t[n].marker)}),r},posFromIndex:function(n){var r,i=this.first,o=this.lineSeparator().length;return this.iter(function(e){var t=e.text.length+o;if(n<t)return r=n,!0;n-=t,++i}),ft(this,lt(i,r))},indexFromPos:function(e){var t=(e=ft(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var n=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+n}),t},copy:function(e){var t=new vo(et(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e=e||{};var t=this.first,n=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<n&&(n=e.to);var r=new vo(et(this,t,n),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(r.history=this.history),(this.linked||(this.linked=[])).push({doc:r,sharedHist:e.sharedHist}),r.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var n=0;n<t.length;n++){var r,i=t[n],o=i.find(),l=e.clipPos(o.from),s=e.clipPos(o.to);st(l,s)&&(r=fo(e,l,s,i.primary,i.primary.type),i.markers.push(r),r.parent=i)}}(r,go(this)),r},unlinkDoc:function(e){if(e instanceof pl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),function(o){for(var e=0;e<o.length;e++)!function(e){var t=o[e],n=[t.primary.doc];xi(t.primary.doc,function(e){return n.push(e)});for(var r=0;r<t.markers.length;r++){var i=t.markers[r];-1==B(n,i.doc)&&(i.parent=null,t.markers.splice(r--,1))}}(e)}(go(this));break}}var n;e.history==this.history&&(n=[e.id],xi(e,function(e){return n.push(e.id)},!0),e.history=new Li(null),e.history.done=Hi(this.history.done,n),e.history.undone=Hi(this.history.undone,n))},iterLinkedDocs:function(e){xi(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):Re(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:Vr(function(e){var t;"rtl"!=e&&(e="ltr"),e!=this.direction&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Br(t=this.cm,function(){Si(t),ir(t)}))})}),vo.prototype.eachLine=vo.prototype.iter;var yo=0;function bo(e){var r=this;if(wo(r),!Le(r,e)&&!bn(r.display,e)){Ne(e),L&&(yo=+new Date);var t=nr(r,e,!0),n=e.dataTransfer.files;if(t&&!r.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),l=0,s=function(){++l==i&&Gr(r,function(){var e={from:t=ft(r.doc,t),to:t,text:r.doc.splitLines(o.filter(function(e){return null!=e}).join(r.doc.lineSeparator())),origin:"paste"};qi(r.doc,e),zi(r.doc,di(ft(r.doc,t),ft(r.doc,fi(e))))})()},a=0;a<n.length;a++)!function(e,t){var n;r.options.allowDropFileTypes&&-1==B(r.options.allowDropFileTypes,e.type)?s():((n=new FileReader).onerror=s,n.onload=function(){var e=n.result;/[\x00-\x08\x0e-\x1f]{2}/.test(e)||(o[t]=e),s()},n.readAsText(e))}(n[a],a);else{if(r.state.draggingText&&-1<r.doc.sel.contains(t))return r.state.draggingText(e),void setTimeout(function(){return r.display.input.focus()},20);try{var u,c=e.dataTransfer.getData("Text");if(c){if(r.state.draggingText&&!r.state.draggingText.copy&&(u=r.listSelections()),Gi(r.doc,di(t,t)),u)for(var h=0;h<u.length;++h)to(r.doc,"",u[h].anchor,u[h].head,"drag");r.replaceSelection(c,"around","paste"),r.display.input.focus()}}catch(e){}}}}function wo(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function xo(t){if(document.getElementsByClassName){for(var e=document.getElementsByClassName("CodeMirror"),n=[],r=0;r<e.length;r++){var i=e[r].CodeMirror;i&&n.push(i)}n.length&&n[0].operation(function(){for(var e=0;e<n.length;e++)t(n[e])})}}var Co=!1;function So(){var e;Co||(we(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,xo(Lo)},100))}),we(window,"blur",function(){return xo(vr)}),Co=!0)}function Lo(e){var t=e.display;t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize()}for(var ko={3:"Pause",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",145:"ScrollLock",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",224:"Mod",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},To=0;To<10;To++)ko[To+48]=ko[To+96]=String(To);for(var Mo=65;Mo<=90;Mo++)ko[Mo]=String.fromCharCode(Mo);for(var No=1;No<=12;No++)ko[No+111]=ko[No+63235]="F"+No;var Ao={};function Oo(e){var t,n,r,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))n=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error("Unrecognized modifier name: "+s);r=!0}}return t&&(e="Alt-"+e),n&&(e="Ctrl-"+e),i&&(e="Cmd-"+e),r&&(e="Shift-"+e),e}function Do(e){var t={};for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(/^(name|fallthrough|(de|at)tach)$/.test(n))continue;if("..."==r){delete e[n];continue}for(var i=q(n.split(" "),Oo),o=0;o<i.length;o++){var l=void 0,s=void 0,l=o==i.length-1?(s=i.join(" "),r):(s=i.slice(0,o+1).join(" "),"..."),a=t[s];if(a){if(a!=l)throw new Error("Inconsistent bindings for "+s)}else t[s]=l}delete e[n]}for(var u in t)e[u]=t[u];return e}function Wo(e,t,n,r){var i=(t=Po(t)).call?t.call(e,r):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&n(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return Wo(e,t.fallthrough,n,r);for(var o=0;o<t.fallthrough.length;o++){var l=Wo(e,t.fallthrough[o],n,r);if(l)return l}}}function Ho(e){var t="string"==typeof e?e:ko[e.keyCode];return"Ctrl"==t||"Alt"==t||"Shift"==t||"Mod"==t}function Fo(e,t,n){var r=e;return t.altKey&&"Alt"!=r&&(e="Alt-"+e),(w?t.metaKey:t.ctrlKey)&&"Ctrl"!=r&&(e="Ctrl-"+e),(w?t.ctrlKey:t.metaKey)&&"Mod"!=r&&(e="Cmd-"+e),!n&&t.shiftKey&&"Shift"!=r&&(e="Shift-"+e),e}function Eo(e,t){if(m&&34==e.keyCode&&e.char)return!1;var n=ko[e.keyCode];return null!=n&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(n=e.code),Fo(n,e,t))}function Po(e){return"string"==typeof e?Ao[e]:e}function Io(t,e){for(var n=t.doc.sel.ranges,r=[],i=0;i<n.length;i++){for(var o=e(n[i]);r.length&&st(o.from,$(r).to)<=0;){var l=r.pop();if(st(l.from,o.from)<0){o.from=l.from;break}}r.push(o)}Br(t,function(){for(var e=r.length-1;0<=e;e--)to(t.doc,"",r[e].from,r[e].to,"+delete");Sr(t)})}function Ro(e,t,n){var r=oe(e.text,t+n,n);return r<0||r>e.text.length?null:r}function zo(e,t,n){var r=Ro(e,t.ch,n);return null==r?null:new lt(t.line,r,n<0?"after":"before")}function Bo(e,t,n,r,i){if(e){"rtl"==t.doc.direction&&(i=-i);var o=ye(n,t.doc.direction);if(o){var l,s,a,u=i<0?$(o):o[0],c=i<0==(1==u.level)?"after":"before";return 0<u.level||"rtl"==t.doc.direction?(l=An(t,n),s=i<0?n.text.length-1:0,a=On(t,l,s).top,s=le(function(e){return On(t,l,e).top==a},i<0==(1==u.level)?u.from:u.to-1,s),"before"==c&&(s=Ro(n,s,1))):s=i<0?u.to:u.from,new lt(r,s,c)}}return new lt(r,i<0?n.text.length:0,i<0?"before":"after")}function Go(t,n,s,e){var a=ye(n,t.doc.direction);if(!a)return zo(n,s,e);s.ch>=n.text.length?(s.ch=n.text.length,s.sticky="before"):s.ch<=0&&(s.ch=0,s.sticky="after");var r=ae(a,s.ch,s.sticky),i=a[r];if("ltr"==t.doc.direction&&i.level%2==0&&(0<e?i.to>s.ch:i.from<s.ch))return zo(n,s,e);function u(e,t){return Ro(n,e instanceof lt?e.ch:e,t)}function o(e){return t.options.lineWrapping?(l=l||An(t,n),_n(t,n,l,e)):{begin:0,end:n.text.length}}var l,c=o("before"==s.sticky?u(s,-1):s.ch);if("rtl"==t.doc.direction||1==i.level){var h=1==i.level==e<0,d=u(s,h?1:-1);if(null!=d&&(h?d<=i.to&&d<=c.end:d>=i.from&&d>=c.begin)){var f=h?"before":"after";return new lt(s.line,d,f)}}function p(e,t,n){for(var r=function(e,t){return t?new lt(s.line,u(e,1),"before"):new lt(s.line,e,"after")};0<=e&&e<a.length;e+=t){var i=a[e],o=0<t==(1!=i.level),l=o?n.begin:u(n.end,-1);if(i.from<=l&&l<i.to)return r(l,o);if(l=o?i.from:u(i.to,-1),n.begin<=l&&l<n.end)return r(l,o)}}var g=p(r+e,e,c);if(g)return g;var m=0<e?c.end:u(c.begin,-1);return null==m||0<e&&m==n.text.length||!(g=p(0<e?0:a.length-1,e,o(m)))?null:g}Ao.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Ao.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Ao.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Ao.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Ao.default=y?Ao.macDefault:Ao.pcDefault;var Uo={selectAll:_i,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(n){return Io(n,function(e){if(e.empty()){var t=Qe(n.doc,e.head.line).text.length;return e.head.ch==t&&e.head.line<n.lastLine()?{from:e.head,to:lt(e.head.line+1,0)}:{from:e.head,to:lt(e.head.line,t)}}return{from:e.from(),to:e.to()}})},deleteLine:function(t){return Io(t,function(e){return{from:lt(e.from().line,0),to:ft(t.doc,lt(e.to().line+1,0))}})},delLineLeft:function(e){return Io(e,function(e){return{from:lt(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(n){return Io(n,function(e){var t=n.charCoords(e.head,"div").top+5;return{from:n.coordsChar({left:0,top:t},"div"),to:e.from()}})},delWrappedLineRight:function(r){return Io(r,function(e){var t=r.charCoords(e.head,"div").top+5,n=r.coordsChar({left:r.display.lineDiv.offsetWidth+100,top:t},"div");return{from:e.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(lt(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(lt(e.lastLine()))},goLineStart:function(t){return t.extendSelectionsBy(function(e){return Vo(t,e.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(t){return t.extendSelectionsBy(function(e){return Ko(t,e.head)},{origin:"+move",bias:1})},goLineEnd:function(t){return t.extendSelectionsBy(function(e){return function(e,t){var n=Qe(e.doc,t),r=function(e){for(var t;t=Bt(e);)e=t.find(1,!0).line;return e}(n);r!=n&&(t=nt(r));return Bo(!0,e,n,t,-1)}(t,e.head.line)},{origin:"+move",bias:-1})},goLineRight:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:n.display.lineDiv.offsetWidth+100,top:t},"div")},j)},goLineLeft:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5;return n.coordsChar({left:0,top:t},"div")},j)},goLineLeftSmart:function(r){return r.extendSelectionsBy(function(e){var t=r.cursorCoords(e.head,"div").top+5,n=r.coordsChar({left:0,top:t},"div");return n.ch<r.getLine(n.line).search(/\S/)?Ko(r,e.head):n},j)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"codepoint")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],n=e.listSelections(),r=e.options.tabSize,i=0;i<n.length;i++){var o=n[i].from(),l=R(e.getLine(o.line),o.ch,r);t.push(_(r-l%r))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(l){return Br(l,function(){for(var e,t,n,r=l.listSelections(),i=[],o=0;o<r.length;o++){r[o].empty()&&(e=r[o].head,(t=Qe(l.doc,e.line).text)&&(e.ch==t.length&&(e=new lt(e.line,e.ch-1)),0<e.ch?(e=new lt(e.line,e.ch+1),l.replaceRange(t.charAt(e.ch-1)+t.charAt(e.ch-2),lt(e.line,e.ch-2),e,"+transpose")):e.line>l.doc.first&&((n=Qe(l.doc,e.line-1).text)&&(e=new lt(e.line,1),l.replaceRange(t.charAt(0)+l.doc.lineSeparator()+n.charAt(n.length-1),lt(e.line-1,n.length-1),e,"+transpose")))),i.push(new ci(e,e)))}l.setSelections(i)})},newlineAndIndent:function(r){return Br(r,function(){for(var e=r.listSelections(),t=e.length-1;0<=t;t--)r.replaceRange(r.doc.lineSeparator(),e[t].anchor,e[t].head,"+input");e=r.listSelections();for(var n=0;n<e.length;n++)r.indentLine(e[n].from().line,null,!0);Sr(r)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function Vo(e,t){var n=Qe(e.doc,t),r=Ut(n);return r!=n&&(t=nt(r)),Bo(!0,e,r,t,1)}function Ko(e,t){var n=Vo(e,t.line),r=Qe(e.doc,n.line),i=ye(r,e.doc.direction);if(i&&0!=i[0].level)return n;var o=Math.max(n.ch,r.text.search(/\S/)),l=t.line==n.line&&t.ch<=o&&t.ch;return lt(n.line,l?0:o,n.sticky)}function jo(e,t,n){if("string"==typeof t&&!(t=Uo[t]))return!1;e.display.input.ensurePolled();var r=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}var Xo=new z;function Yo(e,t,n,r){var i=e.state.keySeq;if(i){if(Ho(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:Xo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),_o(e,i+" "+t,n,r))return!0}return _o(e,t,n,r)}function _o(e,t,n,r){var i=function(e,t,n){for(var r=0;r<e.state.keyMaps.length;r++){var i=Wo(t,e.state.keyMaps[r],n,e);if(i)return i}return e.options.extraKeys&&Wo(t,e.options.extraKeys,n,e)||Wo(t,e.options.keyMap,n,e)}(e,t,r);return"multi"==i&&(e.state.keySeq=t),"handled"==i&&un(e,"keyHandled",e,t,n),"handled"!=i&&"multi"!=i||(Ne(n),fr(e)),!!i}function $o(t,e){var n=Eo(e,!0);return!!n&&(e.shiftKey&&!t.state.keySeq?Yo(t,"Shift-"+n,e,function(e){return jo(t,e,!0)})||Yo(t,n,e,function(e){if("string"==typeof e?/^go[A-Z]/.test(e):e.motion)return jo(t,e)}):Yo(t,n,e,function(e){return jo(t,e)}))}var qo=null;function Zo(e){var t,n,r,i=this;function o(e){18!=e.keyCode&&e.altKey||(T(r,"CodeMirror-crosshair"),Ce(document,"keyup",o),Ce(document,"mouseover",o))}e.target&&e.target!=i.display.input.getField()||(i.curOp.focus=W(),Le(i,e)||(L&&x<11&&27==e.keyCode&&(e.returnValue=!1),t=e.keyCode,i.display.shift=16==t||e.shiftKey,n=$o(i,e),m&&(qo=n?t:null,!n&&88==t&&!Be&&(y?e.metaKey:e.ctrlKey)&&i.replaceSelection("",null,"cut")),g&&!y&&!n&&46==t&&e.shiftKey&&!e.ctrlKey&&document.execCommand&&document.execCommand("cut"),18!=t||/\bCodeMirror-crosshair\b/.test(i.display.lineDiv.className)||(H(r=i.display.lineDiv,"CodeMirror-crosshair"),we(document,"keyup",o),we(document,"mouseover",o))))}function Qo(e){16==e.keyCode&&(this.doc.sel.shift=!1),Le(this,e)}function Jo(e){var t=this;if(!(e.target&&e.target!=t.display.input.getField()||bn(t.display,e)||Le(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var n,r,i=e.keyCode,o=e.charCode;if(m&&i==qo)return qo=null,void Ne(e);m&&(!e.which||e.which<10)&&$o(t,e)||"\b"!=(n=String.fromCharCode(null==o?i:o))&&(Yo(r=t,"'"+n+"'",e,function(e){return jo(r,e,!0)})||t.display.input.onKeyPress(e))}}var el,tl,nl=function(e,t,n){this.time=e,this.pos=t,this.button=n};function rl(e){var t,n,r,i,o,l,s=this,a=s.display;Le(s,e)||a.activeTouch&&a.input.supportsTouch()||(a.input.ensurePolled(),a.shift=e.shiftKey,bn(a,e)?v||(a.scroller.draggable=!1,setTimeout(function(){return a.scroller.draggable=!0},100)):ll(s,e)||(t=nr(s,e),n=He(e),r=t?(i=t,o=n,l=+new Date,tl&&tl.compare(l,i,o)?(el=tl=null,"triple"):el&&el.compare(l,i,o)?(tl=new nl(l,i,o),el=null,"double"):(el=new nl(l,i,o),tl=null,"single")):"single",window.focus(),1==n&&s.state.selectingText&&s.state.selectingText(e),t&&function(n,e,r,t,i){var o="Click";"double"==t?o="Double"+o:"triple"==t&&(o="Triple"+o);return Yo(n,Fo(o=(1==e?"Left":2==e?"Middle":"Right")+o,i),i,function(e){if("string"==typeof e&&(e=Uo[e]),!e)return!1;var t=!1;try{n.isReadOnly()&&(n.state.suppressEdits=!0),t=e(n,r)!=U}finally{n.state.suppressEdits=!1}return t})}(s,n,t,r,e)||(1==n?t?function(e,t,n,r){L?setTimeout(P(pr,e),0):e.curOp.focus=W();var i,o=function(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};{var o;null==i.unit&&(o=f?n.shiftKey&&n.metaKey:n.altKey,i.unit=o?"rectangle":"single"==t?"char":"double"==t?"word":"line")}null!=i.extend&&!e.doc.extend||(i.extend=e.doc.extend||n.shiftKey);null==i.addNew&&(i.addNew=y?n.metaKey:n.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?n.altKey:n.ctrlKey));return i}(e,n,r),l=e.doc.sel;(e.options.dragDrop&&Pe&&!e.isReadOnly()&&"single"==n&&-1<(i=l.contains(t))&&(st((i=l.ranges[i]).from(),t)<0||0<t.xRel)&&(0<st(i.to(),t)||t.xRel<0)?function(t,n,r,i){var o=t.display,l=!1,s=Gr(t,function(e){v&&(o.scroller.draggable=!1),t.state.draggingText=!1,t.state.delayingBlurEvent&&(t.hasFocus()?t.state.delayingBlurEvent=!1:gr(t)),Ce(o.wrapper.ownerDocument,"mouseup",s),Ce(o.wrapper.ownerDocument,"mousemove",a),Ce(o.scroller,"dragstart",u),Ce(o.scroller,"drop",s),l||(Ne(e),i.addNew||Ei(t.doc,r,null,null,i.extend),v&&!c||L&&9==x?setTimeout(function(){o.wrapper.ownerDocument.body.focus({preventScroll:!0}),o.input.focus()},20):o.input.focus())}),a=function(e){l=l||10<=Math.abs(n.clientX-e.clientX)+Math.abs(n.clientY-e.clientY)},u=function(){return l=!0};v&&(o.scroller.draggable=!0);(t.state.draggingText=s).copy=!i.moveOnDrag,we(o.wrapper.ownerDocument,"mouseup",s),we(o.wrapper.ownerDocument,"mousemove",a),we(o.scroller,"dragstart",u),we(o.scroller,"drop",s),t.state.delayingBlurEvent=!0,setTimeout(function(){return o.input.focus()},20),o.scroller.dragDrop&&o.scroller.dragDrop()}:function(m,e,v,y){L&&gr(m);var l=m.display,b=m.doc;Ne(e);var w,x,C=b.sel,t=C.ranges;y.addNew&&!y.extend?(x=b.sel.contains(v),w=-1<x?t[x]:new ci(v,v)):(w=b.sel.primary(),x=b.sel.primIndex);{var n;"rectangle"==y.unit?(y.addNew||(w=new ci(v,v)),v=nr(m,e,!0,!0),x=-1):(n=il(m,v,y.unit),w=y.extend?Fi(w,n.anchor,n.head,y.extend):n)}y.addNew?-1==x?(x=t.length,Bi(b,hi(m,t.concat([w]),x),{scroll:!1,origin:"*mouse"})):1<t.length&&t[x].empty()&&"char"==y.unit&&!y.extend?(Bi(b,hi(m,t.slice(0,x).concat(t.slice(x+1)),0),{scroll:!1,origin:"*mouse"}),C=b.sel):Ii(b,x,w,K):(Bi(b,new ui([w],x=0),K),C=b.sel);var S=v;function s(e){if(0!=st(S,e))if(S=e,"rectangle"==y.unit){for(var t=[],n=m.options.tabSize,r=R(Qe(b,v.line).text,v.ch,n),i=R(Qe(b,e.line).text,e.ch,n),o=Math.min(r,i),l=Math.max(r,i),s=Math.min(v.line,e.line),a=Math.min(m.lastLine(),Math.max(v.line,e.line));s<=a;s++){var u=Qe(b,s).text,c=X(u,o,n);o==l?t.push(new ci(lt(s,c),lt(s,c))):u.length>c&&t.push(new ci(lt(s,c),lt(s,X(u,l,n))))}t.length||t.push(new ci(v,v)),Bi(b,hi(m,C.ranges.slice(0,x).concat(t),x),{origin:"*mouse",scroll:!1}),m.scrollIntoView(e)}else{var h,d=w,f=il(m,e,y.unit),p=d.anchor,p=0<st(f.anchor,p)?(h=f.head,ht(d.from(),f.anchor)):(h=f.anchor,ct(d.to(),f.head)),g=C.ranges.slice(0);g[x]=function(e,t){var n=t.anchor,r=t.head,i=Qe(e.doc,n.line);if(0==st(n,r)&&n.sticky==r.sticky)return t;var o=ye(i);if(!o)return t;var l=ae(o,n.ch,n.sticky),s=o[l];if(s.from!=n.ch&&s.to!=n.ch)return t;var a,u=l+(s.from==n.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;{var c,h;a=r.line!=n.line?0<(r.line-n.line)*("ltr"==e.doc.direction?1:-1):(c=ae(o,r.ch,r.sticky),h=c-l||(r.ch-n.ch)*(1==s.level?-1:1),c==u-1||c==u?h<0:0<h)}var d=o[u+(a?-1:0)],f=a==(1==d.level),p=f?d.from:d.to,g=f?"after":"before";return n.ch==p&&n.sticky==g?t:new ci(new lt(n.line,p,g),r)}(m,new ci(ft(b,p),h)),Bi(b,hi(m,g,x),K)}}var a=l.wrapper.getBoundingClientRect(),u=0;function r(e){m.state.selectingText=!1,u=1/0,e&&(Ne(e),l.input.focus()),Ce(l.wrapper.ownerDocument,"mousemove",i),Ce(l.wrapper.ownerDocument,"mouseup",o),b.history.lastSelOrigin=null}var i=Gr(m,function(e){(0!==e.buttons&&He(e)?function e(t){var n,r,i=++u,o=nr(m,t,!0,"rectangle"==y.unit);o&&(0!=st(o,S)?(m.curOp.focus=W(),s(o),n=wr(l,b),(o.line>=n.to||o.line<n.from)&&setTimeout(Gr(m,function(){u==i&&e(t)}),150)):(r=t.clientY<a.top?-20:t.clientY>a.bottom?20:0)&&setTimeout(Gr(m,function(){u==i&&(l.scroller.scrollTop+=r,e(t))}),50))}:r)(e)}),o=Gr(m,r);m.state.selectingText=o,we(l.wrapper.ownerDocument,"mousemove",i),we(l.wrapper.ownerDocument,"mouseup",o)})(e,r,t,o)}(s,t,r,e):We(e)==a.scroller&&Ne(e):2==n?(t&&Ei(s.doc,t),setTimeout(function(){return a.input.focus()},20)):3==n&&(C?s.display.input.onContextMenu(e):gr(s)))))}function il(e,t,n){if("char"==n)return new ci(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new ci(lt(t.line,0),ft(e.doc,lt(t.line+1,0)));var r=n(e,t);return new ci(r.from,r.to)}function ol(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(e){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Ne(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!Te(e,n))return Oe(t);o-=s.top-l.viewOffset;for(var a=0;a<e.display.gutterSpecs.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return Se(e,n,e,rt(e.doc,o),e.display.gutterSpecs[a].className,t),Oe(t)}}function ll(e,t){return ol(e,t,"gutterClick",!0)}function sl(e,t){var n,r;bn(e.display,t)||(r=t,Te(n=e,"gutterContextMenu")&&ol(n,r,"gutterContextMenu",!1))||Le(e,t,"contextmenu")||C||e.display.input.onContextMenu(t)}function al(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Pn(e)}nl.prototype.compare=function(e,t,n){return this.time+400>e&&0==st(t,this.pos)&&n==this.button};var ul={toString:function(){return"CodeMirror.Init"}},cl={},hl={};function dl(e,t,n){var r,i;!t!=!(n&&n!=ul)&&(r=e.display.dragFunctions,(i=t?we:Ce)(e.display.scroller,"dragstart",r.start),i(e.display.scroller,"dragenter",r.enter),i(e.display.scroller,"dragover",r.over),i(e.display.scroller,"dragleave",r.leave),i(e.display.scroller,"drop",r.drop))}function fl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),_t(e)),tr(e),ir(e),Pn(e),setTimeout(function(){return Hr(e)},100)}function pl(e,t){var n=this;if(!(this instanceof pl))return new pl(e,t);this.options=t=t?I(t):{},I(cl,t,!1);var r=t.value;"string"==typeof r?r=new vo(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new pl.inputStyles[t.inputStyle](this),o=this.display=new ri(e,r,i,t);for(var l in al(o.wrapper.CodeMirror=this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Pr(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new z,keySeq:null,specialChars:null},t.autofocus&&!d&&o.input.focus(),L&&x<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(i){var o=i.display;we(o.scroller,"mousedown",Gr(i,rl)),we(o.scroller,"dblclick",L&&x<11?Gr(i,function(e){var t,n;Le(i,e)||(!(t=nr(i,e))||ll(i,e)||bn(i.display,e)||(Ne(e),n=i.findWordAt(t),Ei(i.doc,n.anchor,n.head)))}):function(e){return Le(i,e)||Ne(e)});we(o.scroller,"contextmenu",function(e){return sl(i,e)}),we(o.input.getField(),"contextmenu",function(e){o.scroller.contains(e.target)||sl(i,e)});var n,r={end:0};function l(){o.activeTouch&&(n=setTimeout(function(){return o.activeTouch=null},1e3),(r=o.activeTouch).end=+new Date)}function s(e,t){if(null==t.left)return 1;var n=t.left-e.left,r=t.top-e.top;return 400<n*n+r*r}we(o.scroller,"touchstart",function(e){var t;Le(i,e)||function(e){if(1==e.touches.length){var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}}(e)||ll(i,e)||(o.input.ensurePolled(),clearTimeout(n),t=+new Date,o.activeTouch={start:t,moved:!1,prev:t-r.end<=300?r:null},1==e.touches.length&&(o.activeTouch.left=e.touches[0].pageX,o.activeTouch.top=e.touches[0].pageY))}),we(o.scroller,"touchmove",function(){o.activeTouch&&(o.activeTouch.moved=!0)}),we(o.scroller,"touchend",function(e){var t,n,r=o.activeTouch;r&&!bn(o,e)&&null!=r.left&&!r.moved&&new Date-r.start<300&&(t=i.coordsChar(o.activeTouch,"page"),n=!r.prev||s(r,r.prev)?new ci(t,t):!r.prev.prev||s(r,r.prev.prev)?i.findWordAt(t):new ci(lt(t.line,0),ft(i.doc,lt(t.line+1,0))),i.setSelection(n.anchor,n.head),i.focus(),Ne(e)),l()}),we(o.scroller,"touchcancel",l),we(o.scroller,"scroll",function(){o.scroller.clientHeight&&(Mr(i,o.scroller.scrollTop),Ar(i,o.scroller.scrollLeft,!0),Se(i,"scroll",i))}),we(o.scroller,"mousewheel",function(e){return ai(i,e)}),we(o.scroller,"DOMMouseScroll",function(e){return ai(i,e)}),we(o.wrapper,"scroll",function(){return o.wrapper.scrollTop=o.wrapper.scrollLeft=0}),o.dragFunctions={enter:function(e){Le(i,e)||De(e)},over:function(e){var t,n,r;Le(i,e)||((r=nr(t=i,e))&&(hr(t,r,n=document.createDocumentFragment()),t.display.dragCursor||(t.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),t.display.lineSpace.insertBefore(t.display.dragCursor,t.display.cursorDiv)),N(t.display.dragCursor,n)),De(e))},start:function(e){return t=i,n=e,void(L&&(!t.state.draggingText||new Date-yo<100)?De(n):Le(t,n)||bn(t.display,n)||(n.dataTransfer.setData("Text",t.getSelection()),n.dataTransfer.effectAllowed="copyMove",n.dataTransfer.setDragImage&&!c&&((r=O("img",null,null,"position: fixed; left: 0; top: 0;")).src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",m&&(r.width=r.height=1,t.display.wrapper.appendChild(r),r._top=r.offsetTop),n.dataTransfer.setDragImage(r,0,0),m&&r.parentNode.removeChild(r))));var t,n,r},drop:Gr(i,bo),leave:function(e){Le(i,e)||wo(i)}};var e=o.input.getField();we(e,"keyup",function(e){return Qo.call(i,e)}),we(e,"keydown",Gr(i,Zo)),we(e,"keypress",Gr(i,Jo)),we(e,"focus",function(e){return mr(i,e)}),we(e,"blur",function(e){return vr(i,e)})}(this),So(),Rr(this),this.curOp.forceUpdate=!0,Ci(this,r),t.autofocus&&!d||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&mr(n)},20):vr(this),hl)hl.hasOwnProperty(l)&&hl[l](this,t[l],ul);Jr(this),t.finishInit&&t.finishInit(this);for(var s=0;s<gl.length;++s)gl[s](this);zr(this),v&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(o.lineDiv).textRendering&&(o.lineDiv.style.textRendering="auto")}pl.defaults=cl,pl.optionHandlers=hl;var gl=[];function ml(e,t,n,r){var i,o=e.doc;null==n&&(n="add"),"smart"==n&&(o.mode.indent?i=bt(e,t).state:n="prev");var l=e.options.tabSize,s=Qe(o,t),a=R(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(r||/\S/.test(s.text)){if("smart"==n&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||150<u)){if(!r)return;n="prev"}}else u=0,n="not";"prev"==n?u=t>o.first?R(Qe(o,t-1).text,null,l):0:"add"==n?u=a+e.options.indentUnit:"subtract"==n?u=a-e.options.indentUnit:"number"==typeof n&&(u=a+n),u=Math.max(0,u);var h="",d=0;if(e.options.indentWithTabs)for(var f=Math.floor(u/l);f;--f)d+=l,h+="\t";if(d<u&&(h+=_(u-d)),h!=c)return to(o,h,lt(t,0),lt(t,c.length),"+input"),!(s.stateAfter=null);for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var m=lt(t,c.length);Ii(o,p,new ci(m,m));break}}}pl.defineInitHook=function(e){return gl.push(e)};var vl=null;function yl(e){vl=e}function bl(e,t,n,r,i){var o=e.doc;e.display.shift=!1,r=r||o.sel;var l=new Date-200,s="paste"==i||e.state.pasteIncoming>l,a=Re(t),u=null;if(s&&1<r.ranges.length)if(vl&&vl.text.join("\n")==t){if(r.ranges.length%vl.text.length==0){u=[];for(var c=0;c<vl.text.length;c++)u.push(o.splitLines(vl.text[c]))}}else a.length==r.ranges.length&&e.options.pasteLinesPerSelection&&(u=q(a,function(e){return[e]}));for(var h=e.curOp.updateInput,d=r.ranges.length-1;0<=d;d--){var f=r.ranges[d],p=f.from(),g=f.to();f.empty()&&(n&&0<n?p=lt(p.line,p.ch-n):e.state.overwrite&&!s?g=lt(g.line,Math.min(Qe(o,g.line).text.length,g.ch+$(a).length)):s&&vl&&vl.lineWise&&vl.text.join("\n")==a.join("\n")&&(p=g=lt(p.line,0)));var m={from:p,to:g,text:u?u[d%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};qi(e.doc,m),un(e,"inputRead",e,m)}t&&!s&&xl(e,t),Sr(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function wl(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");return n&&(e.preventDefault(),t.isReadOnly()||t.options.disableInput||Br(t,function(){return bl(t,n,0,null,"paste")}),1)}function xl(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;0<=r;r--){var i=n.ranges[r];if(!(100<i.head.ch||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(-1<t.indexOf(o.electricChars.charAt(s))){l=ml(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Qe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=ml(e,i.head.line,"smart"));l&&un(e,"electricInput",e,i.head.line)}}}function Cl(e){for(var t=[],n=[],r=0;r<e.doc.sel.ranges.length;r++){var i=e.doc.sel.ranges[r].head.line,o={anchor:lt(i,0),head:lt(i+1,0)};n.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:n}}function Sl(e,t,n,r){e.setAttribute("autocorrect",n?"":"off"),e.setAttribute("autocapitalize",r?"":"off"),e.setAttribute("spellcheck",!!t)}function Ll(){var e=O("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=O("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return v?e.style.width="1000px":e.setAttribute("wrap","off"),a&&(e.style.border="1px solid black"),Sl(e),t}function kl(i,o,l,s,a){var e=o,t=l,u=Qe(i,o.line),c=a&&"rtl"==i.direction?-l:l;function n(e){var t,n,r;if(null==(n="codepoint"==s?(t=u.text.charCodeAt(o.ch+(0<s?0:-1)),isNaN(t)?null:new lt(o.line,Math.max(0,Math.min(u.text.length,o.ch+l*(55296<=t&&t<56320?2:1))),-l)):a?Go(i.cm,u,o,l):zo(u,o,l))){if(e||(r=o.line+c)<i.first||r>=i.first+i.size||(o=new lt(r,o.ch,o.sticky),!(u=Qe(i,r))))return;o=Bo(a,i.cm,u,o.line,c)}else o=n;return 1}if("char"==s||"codepoint"==s)n();else if("column"==s)n(!0);else if("word"==s||"group"==s)for(var r=null,h="group"==s,d=i.cm&&i.cm.getHelper(o,"wordChars"),f=!0;!(l<0)||n(!f);f=!1){var p=u.text.charAt(o.ch)||"\n",g=te(p,d)?"w":h&&"\n"==p?"n":!h||/\s/.test(p)?null:"p";if(!h||f||g||(g="s"),r&&r!=g){l<0&&(l=1,n(),o.sticky="after");break}if(g&&(r=g),0<l&&!n(!f))break}var m=Xi(i,o,e,t,!0);return at(e,m)&&(m.hitSide=!0),m}function Tl(e,t,n,r){var i,o,l,s,a=e.doc,u=t.left;for("page"==r?(i=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),o=Math.max(i-.5*qn(e.display),3),l=(0<n?t.bottom:t.top)+n*o):"line"==r&&(l=0<n?t.bottom+3:t.top-3);(s=Xn(e,u,l)).outside;){if(n<0?l<=0:l>=a.height){s.hitSide=!0;break}l+=5*n}return s}function Ml(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new z,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null}function Nl(e,t){var n=Nn(e,t.line);if(!n||n.hidden)return null;var r=Qe(e.doc,t.line),i=Tn(n,r,t.line),o=ye(r,e.doc.direction),l="left";o&&(l=ae(o,t.ch)%2?"right":"left");var s=Hn(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function Al(e,t){return t&&(e.bad=!0),e}function Ol(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Al(e.clipPos(lt(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==r)return function(u,e,t){var n=u.text.firstChild,r=!1;if(!e||!D(n,e))return Al(lt(nt(u.line),0),!0);if(e==n&&(r=!0,e=n.childNodes[t],t=0,!e)){var i=u.rest?$(u.rest):u.line;return Al(lt(nt(i),i.text.length),r)}var o=3==e.nodeType?e:null,l=e;o||1!=e.childNodes.length||3!=e.firstChild.nodeType||(o=e.firstChild,t=t&&o.nodeValue.length);for(;l.parentNode!=n;)l=l.parentNode;var c=u.measure,h=c.maps;function s(e,t,n){for(var r=-1;r<(h?h.length:0);r++)for(var i=r<0?c.map:h[r],o=0;o<i.length;o+=3){var l=i[o+2];if(l==e||l==t){var s=nt(r<0?u.line:u.rest[r]),a=i[o]+n;return(n<0||l!=e)&&(a=i[o+(n?1:0)]),lt(s,a)}}}var a=s(o,l,t);if(a)return Al(a,r);for(var d=l.nextSibling,f=o?o.nodeValue.length-t:0;d;d=d.nextSibling){if(a=s(d,d.firstChild,0))return Al(lt(a.line,a.ch-f),r);f+=d.textContent.length}for(var p=l.previousSibling,g=t;p;p=p.previousSibling){if(a=s(p,p.firstChild,-1))return Al(lt(a.line,a.ch+g),r);g+=p.textContent.length}}(o,t,n)}}Ml.prototype.init=function(e){var t=this,l=this,s=l.cm,a=l.div=e.lineDiv;function u(e){for(var t=e.target;t;t=t.parentNode){if(t==a)return 1;if(/\bCodeMirror-(?:line)?widget\b/.test(t.className))break}}function n(e){if(u(e)&&!Le(s,e)){if(s.somethingSelected())yl({lineWise:!1,text:s.getSelections()}),"cut"==e.type&&s.replaceSelection("",null,"cut");else{if(!s.options.lineWiseCopyCut)return;var t=Cl(s);yl({lineWise:!0,text:t.text}),"cut"==e.type&&s.operation(function(){s.setSelections(t.ranges,0,V),s.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var n=vl.text.join("\n");if(e.clipboardData.setData("Text",n),e.clipboardData.getData("Text")==n)return void e.preventDefault()}var r=Ll(),i=r.firstChild;s.display.lineSpace.insertBefore(r,s.display.lineSpace.firstChild),i.value=vl.text.join("\n");var o=document.activeElement;E(i),setTimeout(function(){s.display.lineSpace.removeChild(r),o.focus(),o==a&&l.showPrimarySelection()},50)}}Sl(a,s.options.spellcheck,s.options.autocorrect,s.options.autocapitalize),we(a,"paste",function(e){!u(e)||Le(s,e)||wl(e,s)||x<=11&&setTimeout(Gr(s,function(){return t.updateFromDOM()}),20)}),we(a,"compositionstart",function(e){t.composing={data:e.data,done:!1}}),we(a,"compositionupdate",function(e){t.composing||(t.composing={data:e.data,done:!1})}),we(a,"compositionend",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),we(a,"touchstart",function(){return l.forceCompositionEnd()}),we(a,"input",function(){t.composing||t.readFromDOMSoon()}),we(a,"copy",n),we(a,"cut",n)},Ml.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},Ml.prototype.prepareSelection=function(){var e=cr(this.cm,!1);return e.focus=document.activeElement==this.div,e},Ml.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Ml.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},Ml.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line<t.display.viewFrom)e.removeAllRanges();else{var o=Ol(t,e.anchorNode,e.anchorOffset),l=Ol(t,e.focusNode,e.focusOffset);if(!o||o.bad||!l||l.bad||0!=st(ht(o,l),r)||0!=st(ct(o,l),i)){var s,a,u=t.display.view,c=r.line>=t.display.viewFrom&&Nl(t,r)||{node:u[0].measure.map[2],offset:0},h=i.line<t.display.viewTo&&Nl(t,i);if(h||(h={node:(a=(s=u[u.length-1].measure).maps?s.maps[s.maps.length-1]:s.map)[a.length-1],offset:a[a.length-2]-a[a.length-3]}),c&&h){var d,f=e.rangeCount&&e.getRangeAt(0);try{d=k(c.node,c.offset,h.offset,h.node)}catch(e){}d&&(!g&&t.state.focused?(e.collapse(c.node,c.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),f&&null==e.anchorNode?e.addRange(f):g&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Ml.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Ml.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Ml.prototype.rememberSelection=function(){var e=this.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Ml.prototype.selectionInEditor=function(){var e=this.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Ml.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()&&document.activeElement==this.div||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Ml.prototype.blur=function(){this.div.blur()},Ml.prototype.getField=function(){return this.div},Ml.prototype.supportsTouch=function(){return!0},Ml.prototype.receivedFocus=function(){var t=this;this.selectionInEditor()?this.pollSelection():Br(this.cm,function(){return t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))})},Ml.prototype.selectionChanged=function(){var e=this.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Ml.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e,t,n=this.getSelection(),r=this.cm;if(h&&l&&this.cm.display.gutterSpecs.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(n.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();this.composing||(this.rememberSelection(),e=Ol(r,n.anchorNode,n.anchorOffset),t=Ol(r,n.focusNode,n.focusOffset),e&&t&&Br(r,function(){Bi(r.doc,di(e,t),V),(e.bad||t.bad)&&(r.curOp.selectionChanged=!0)}))}},Ml.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,n,r=this.cm,i=r.display,o=r.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>r.firstLine()&&(l=lt(l.line-1,Qe(r.doc,l.line-1).length)),s.ch==Qe(r.doc,s.line).text.length&&s.line<r.lastLine()&&(s=lt(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;n=l.line==i.viewFrom||0==(e=rr(r,l.line))?(t=nt(i.view[0].line),i.view[0].node):(t=nt(i.view[e].line),i.view[e-1].node.nextSibling);var a,u=rr(r,s.line),c=u==i.view.length-1?(a=i.viewTo-1,i.lineDiv.lastChild):(a=nt(i.view[u+1].line)-1,i.view[u+1].node.previousSibling);if(!n)return!1;for(var h=r.doc.splitLines(function(u,e,t,c,h){var n="",d=!1,f=u.doc.lineSeparator(),p=!1;function g(){d&&(n+=f,p&&(n+=f),d=p=!1)}function m(e){e&&(g(),n+=e)}for(;!function e(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)return void m(n);var r,i=t.getAttribute("cm-marker");if(i){var o=u.findMarks(lt(c,0),lt(h+1,0),(a=+i,function(e){return e.id==a}));return void(o.length&&(r=o[0].find(0))&&m(Je(u.doc,r.from,r.to).join(f)))}if("false"==t.getAttribute("contenteditable"))return;var l=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;l&&g();for(var s=0;s<t.childNodes.length;s++)e(t.childNodes[s]);/^(pre|p)$/i.test(t.nodeName)&&(p=!0),l&&(d=!0)}else 3==t.nodeType&&m(t.nodeValue.replace(/\u200b/g,"").replace(/\u00a0/g," "));var a}(e),e!=t;)e=e.nextSibling,p=!1;return n}(r,n,c,t,a)),d=Je(r.doc,lt(t,0),lt(a,Qe(r.doc,a).text.length));1<h.length&&1<d.length;)if($(h)==$(d))h.pop(),d.pop(),a--;else{if(h[0]!=d[0])break;h.shift(),d.shift(),t++}for(var f=0,p=0,g=h[0],m=d[0],v=Math.min(g.length,m.length);f<v&&g.charCodeAt(f)==m.charCodeAt(f);)++f;for(var y=$(h),b=$(d),w=Math.min(y.length-(1==h.length?f:0),b.length-(1==d.length?f:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==d.length&&t==l.line)for(;f&&f>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)f--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(f).replace(/\u200b+$/,"");var x=lt(t,f),C=lt(a,d.length?$(d).length-p:0);return 1<h.length||h[0]||st(x,C)?(to(r.doc,h,x,C,"+input"),!0):void 0},Ml.prototype.ensurePolled=function(){this.forceCompositionEnd()},Ml.prototype.reset=function(){this.forceCompositionEnd()},Ml.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Ml.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Ml.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Br(this.cm,function(){return ir(e.cm)})},Ml.prototype.setUneditable=function(e){e.contentEditable="false"},Ml.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Gr(this.cm,bl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Ml.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Ml.prototype.onContextMenu=function(){},Ml.prototype.resetPosition=function(){},Ml.prototype.needsContentAttribute=!0;function Dl(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new z,this.hasSelection=!1,this.composing=null}var Wl,Hl,Fl,El,Pl;function Il(e,t,r,n){Wl.defaults[e]=t,r&&(Hl[e]=n?function(e,t,n){n!=ul&&r(e,t,n)}:r)}Dl.prototype.init=function(n){var e=this,r=this,i=this.cm;this.createField(n);var o=this.textarea;function t(e){if(!Le(i,e)){if(i.somethingSelected())yl({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=Cl(i);yl({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,V):(r.prevInput="",o.value=t.text.join("\n"),E(o))}"cut"==e.type&&(i.state.cutIncoming=+new Date)}}n.wrapper.insertBefore(this.wrapper,n.wrapper.firstChild),a&&(o.style.width="0px"),we(o,"input",function(){L&&9<=x&&e.hasSelection&&(e.hasSelection=null),r.poll()}),we(o,"paste",function(e){Le(i,e)||wl(e,i)||(i.state.pasteIncoming=+new Date,r.fastPoll())}),we(o,"cut",t),we(o,"copy",t),we(n.scroller,"paste",function(e){if(!bn(n,e)&&!Le(i,e)){if(!o.dispatchEvent)return i.state.pasteIncoming=+new Date,void r.focus();var t=new Event("paste");t.clipboardData=e.clipboardData,o.dispatchEvent(t)}}),we(n.lineSpace,"selectstart",function(e){bn(n,e)||Ne(e)}),we(o,"compositionstart",function(){var e=i.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}}),we(o,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Dl.prototype.createField=function(e){this.wrapper=Ll(),this.textarea=this.wrapper.firstChild},Dl.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},Dl.prototype.prepareSelection=function(){var e,t,n,r=this.cm,i=r.display,o=r.doc,l=cr(r);return r.options.moveInputWithCursor&&(e=Vn(r,o.sel.primary().head,"div"),t=i.wrapper.getBoundingClientRect(),n=i.lineDiv.getBoundingClientRect(),l.teTop=Math.max(0,Math.min(i.wrapper.clientHeight-10,e.top+n.top-t.top)),l.teLeft=Math.max(0,Math.min(i.wrapper.clientWidth-10,e.left+n.left-t.left))),l},Dl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Dl.prototype.reset=function(e){var t,n;this.contextMenuPending||this.composing||((t=this.cm).somethingSelected()?(this.prevInput="",n=t.getSelection(),this.textarea.value=n,t.state.focused&&E(this.textarea),L&&9<=x&&(this.hasSelection=n)):e||(this.prevInput=this.textarea.value="",L&&9<=x&&(this.hasSelection=null)))},Dl.prototype.getField=function(){return this.textarea},Dl.prototype.supportsTouch=function(){return!1},Dl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!d||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Dl.prototype.blur=function(){this.textarea.blur()},Dl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Dl.prototype.receivedFocus=function(){this.slowPoll()},Dl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Dl.prototype.fastPoll=function(){var t=!1,n=this;n.pollingFast=!0,n.polling.set(20,function e(){n.poll()||t?(n.pollingFast=!1,n.slowPoll()):(t=!0,n.polling.set(60,e))})},Dl.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||ze(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(L&&9<=x&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,s=Math.min(r.length,i.length);l<s&&r.charCodeAt(l)==i.charCodeAt(l);)++l;return Br(t,function(){bl(t,i.slice(l),r.length-l,null,e.composing?"*compose":null),1e3<i.length||-1<i.indexOf("\n")?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Dl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Dl.prototype.onKeyPress=function(){L&&9<=x&&(this.hasSelection=null),this.fastPoll()},Dl.prototype.onContextMenu=function(e){var n=this,r=n.cm,i=r.display,o=n.textarea;n.contextMenuPending&&n.contextMenuPending();var l,s,t,a,u,c=nr(r,e),h=i.scroller.scrollTop;function d(){var e,t;null!=o.selectionStart&&(t="​"+((e=r.somethingSelected())?o.value:""),o.value="⇚",o.value=t,n.prevInput=e?"":"​",o.selectionStart=1,o.selectionEnd=t.length,i.selForContextMenu=r.doc.sel)}function f(){var e,t;n.contextMenuPending==f&&(n.contextMenuPending=!1,n.wrapper.style.cssText=s,o.style.cssText=l,L&&x<9&&i.scrollbars.setScrollTop(i.scroller.scrollTop=h),null!=o.selectionStart&&((!L||L&&x<9)&&d(),e=0,t=function(){i.selForContextMenu==r.doc.sel&&0==o.selectionStart&&0<o.selectionEnd&&"​"==n.prevInput?Gr(r,_i)(r):e++<10?i.detectingSelectAll=setTimeout(t,500):(i.selForContextMenu=null,i.input.reset())},i.detectingSelectAll=setTimeout(t,200)))}c&&!m&&(r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(c)&&Gr(r,Bi)(r.doc,di(c),V),l=o.style.cssText,s=n.wrapper.style.cssText,t=n.wrapper.offsetParent.getBoundingClientRect(),n.wrapper.style.cssText="position: static",o.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-t.top-5)+"px; left: "+(e.clientX-t.left-5)+"px;\n z-index: 1000; background: "+(L?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",v&&(a=window.scrollY),i.input.focus(),v&&window.scrollTo(null,a),i.input.reset(),r.somethingSelected()||(o.value=n.prevInput=" "),n.contextMenuPending=f,i.selForContextMenu=r.doc.sel,clearTimeout(i.detectingSelectAll),L&&9<=x&&d(),C?(De(e),u=function(){Ce(window,"mouseup",u),setTimeout(f,20)},we(window,"mouseup",u)):setTimeout(f,50))},Dl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e,this.textarea.readOnly=!!e},Dl.prototype.setUneditable=function(){},Dl.prototype.needsContentAttribute=!1,Hl=(Wl=pl).optionHandlers,Wl.defineOption=Il,Wl.Init=ul,Il("value","",function(e,t){return e.setValue(t)},!0),Il("mode",null,function(e,t){e.doc.modeOption=t,vi(e)},!0),Il("indentUnit",2,vi,!0),Il("indentWithTabs",!1),Il("smartIndent",!0),Il("tabSize",4,function(e){yi(e),Pn(e),ir(e)},!0),Il("lineSeparator",null,function(e,r){if(e.doc.lineSep=r){var i=[],o=e.doc.first;e.doc.iter(function(e){for(var t=0;;){var n=e.text.indexOf(r,t);if(-1==n)break;t=n+r.length,i.push(lt(o,n))}o++});for(var t=i.length-1;0<=t;t--)to(e.doc,r,i[t],lt(i[t].line,i[t].ch+r.length))}}),Il("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=ul&&e.refresh()}),Il("specialCharPlaceholder",en,function(e){return e.refresh()},!0),Il("electricChars",!0),Il("inputStyle",d?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Il("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),Il("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),Il("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),Il("rtlMoveVisually",!p),Il("wholeLineUpdateBefore",!0),Il("theme","default",function(e){al(e),ni(e)},!0),Il("keyMap","default",function(e,t,n){var r=Po(t),i=n!=ul&&Po(n);i&&i.detach&&i.detach(e,r),r.attach&&r.attach(e,i||null)}),Il("extraKeys",null),Il("configureMouse",null),Il("lineWrapping",!1,fl,!0),Il("gutters",[],function(e,t){e.display.gutterSpecs=ei(t,e.options.lineNumbers),ni(e)},!0),Il("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?Jn(e.display)+"px":"0",e.refresh()},!0),Il("coverGutterNextToScrollbar",!1,function(e){return Hr(e)},!0),Il("scrollbarStyle","native",function(e){Pr(e),Hr(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),Il("lineNumbers",!1,function(e,t){e.display.gutterSpecs=ei(e.options.gutters,t),ni(e)},!0),Il("firstLineNumber",1,ni,!0),Il("lineNumberFormatter",function(e){return e},ni,!0),Il("showCursorWhenSelecting",!1,ur,!0),Il("resetSelectionOnContextMenu",!0),Il("lineWiseCopyCut",!0),Il("pasteLinesPerSelection",!0),Il("selectionsMayTouch",!1),Il("readOnly",!1,function(e,t){"nocursor"==t&&(vr(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),Il("screenReaderLabel",null,function(e,t){t=""===t?null:t,e.display.input.screenReaderLabelChanged(t)}),Il("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),Il("dragDrop",!0,dl),Il("allowDropFileTypes",null),Il("cursorBlinkRate",530),Il("cursorScrollMargin",0),Il("cursorHeight",1,ur,!0),Il("singleCursorHeightPerLine",!0,ur,!0),Il("workTime",100),Il("workDelay",100),Il("flattenSpans",!0,yi,!0),Il("addModeClass",!1,yi,!0),Il("pollInterval",100),Il("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),Il("historyEventDelay",1250),Il("viewportMargin",10,function(e){return e.refresh()},!0),Il("maxHighlightLength",1e4,yi,!0),Il("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),Il("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),Il("autofocus",null),Il("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),Il("phrases",null),El=(Fl=pl).optionHandlers,Pl=Fl.helpers={},Fl.prototype={constructor:Fl,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var n=this.options,r=n[e];n[e]==t&&"mode"!=e||(n[e]=t,El.hasOwnProperty(e)&&Gr(this,El[e])(this,t,r),Se(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Po(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;n<t.length;++n)if(t[n]==e||t[n].name==e)return t.splice(n,1),!0},addOverlay:Ur(function(e,t){var n=e.token?e:Fl.getMode(this.options,e);if(n.startState)throw new Error("Overlays may not be stateful.");!function(e,t,n){for(var r=0,i=n(t);r<e.length&&n(e[r])<=i;)r++;e.splice(r,0,t)}(this.state.overlays,{mode:n,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,ir(this)}),removeOverlay:Ur(function(e){for(var t=this.state.overlays,n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||"string"==typeof e&&r.name==e)return t.splice(n,1),this.state.modeGen++,void ir(this)}}),indentLine:Ur(function(e,t,n){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),it(this.doc,e)&&ml(this,e,t,n)}),indentSelection:Ur(function(e){for(var t=this.doc.sel.ranges,n=-1,r=0;r<t.length;r++){var i=t[r];if(i.empty())i.head.line>n&&(ml(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Sr(this));else{for(var o=i.from(),l=i.to(),s=Math.max(n,o.line),n=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1,a=s;a<n;++a)ml(this,a,e);var u=this.doc.sel.ranges;0==o.ch&&t.length==u.length&&0<u[r].from().ch&&Ii(this.doc,r,new ci(o,u[r].to()),V)}}}),getTokenAt:function(e,t){return Lt(this,e,t)},getLineTokens:function(e,t){return Lt(this,lt(e),t,!0)},getTokenTypeAt:function(e){e=ft(this.doc,e);var t,n=yt(this,Qe(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var l=r+i>>1;if((l?n[2*l-1]:0)>=o)i=l;else{if(!(n[2*l+1]<o)){t=n[2*l+2];break}r=1+l}}var s=t?t.indexOf("overlay "):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Fl.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!Pl.hasOwnProperty(t))return n;var r=Pl[t],i=this.getModeAt(e);if("string"==typeof i[t])r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=r[i[t][o]];l&&n.push(l)}else i.helperType&&r[i.helperType]?n.push(r[i.helperType]):r[i.name]&&n.push(r[i.name]);for(var s=0;s<r._global.length;s++){var a=r._global[s];a.pred(i,this)&&-1==B(n,a.val)&&n.push(a.val)}return n},getStateAfter:function(e,t){var n=this.doc;return bt(this,(e=dt(n,null==e?n.first+n.size-1:e))+1,t).state},cursorCoords:function(e,t){var n=this.doc.sel.primary(),r=null==e?n.head:"object"==typeof e?ft(this.doc,e):e?n.from():n.to();return Vn(this,r,t||"page")},charCoords:function(e,t){return Un(this,ft(this.doc,e),t||"page")},coordsChar:function(e,t){return Xn(this,(e=Gn(this,e,t||"page")).left,e.top)},lineAtHeight:function(e,t){return e=Gn(this,{top:e,left:0},t||"page").top,rt(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,n){var r,i=!1,o="number"==typeof e?(r=this.doc.first+this.doc.size-1,e<this.doc.first?e=this.doc.first:r<e&&(e=r,i=!0),Qe(this.doc,e)):e;return Bn(this,o,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-Xt(o):0)},defaultTextHeight:function(){return qn(this.display)},defaultCharWidth:function(){return Zn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o,l,s,a,u,c=this.display,h=(e=Vn(this,ft(this.doc,e))).bottom,d=e.left;t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),c.sizer.appendChild(t),"over"==r?h=e.top:"above"!=r&&"near"!=r||(o=Math.max(c.wrapper.clientHeight,this.doc.height),l=Math.max(c.sizer.clientWidth,c.lineSpace.clientWidth),("above"==r||e.bottom+t.offsetHeight>o)&&e.top>t.offsetHeight?h=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=o&&(h=e.bottom),d+t.offsetWidth>l&&(d=l-t.offsetWidth)),t.style.top=h+"px",t.style.left=t.style.right="","right"==i?(d=c.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?d=0:"middle"==i&&(d=(c.sizer.clientWidth-t.offsetWidth)/2),t.style.left=d+"px"),n&&(s=this,a={left:d,top:h,right:d+t.offsetWidth,bottom:h+t.offsetHeight},null!=(u=xr(s,a)).scrollTop&&Mr(s,u.scrollTop),null!=u.scrollLeft&&Ar(s,u.scrollLeft))},triggerOnKeyDown:Ur(Zo),triggerOnKeyPress:Ur(Jo),triggerOnKeyUp:Qo,triggerOnMouseDown:Ur(rl),execCommand:function(e){if(Uo.hasOwnProperty(e))return Uo[e].call(null,this)},triggerElectric:Ur(function(e){xl(this,e)}),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=ft(this.doc,e),l=0;l<t&&!(o=kl(this.doc,o,i,n,r)).hitSide;++l);return o},moveH:Ur(function(t,n){var r=this;this.extendSelectionsBy(function(e){return r.display.shift||r.doc.extend||e.empty()?kl(r.doc,e.head,t,n,r.options.rtlMoveVisually):t<0?e.from():e.to()},j)}),deleteH:Ur(function(n,r){var e=this.doc.sel,i=this.doc;e.somethingSelected()?i.replaceSelection("",null,"+delete"):Io(this,function(e){var t=kl(i,e.head,n,r,!1);return n<0?{from:t,to:e.head}:{from:e.head,to:t}})}),findPosV:function(e,t,n,r){var i=1,o=r;t<0&&(i=-1,t=-t);for(var l=ft(this.doc,e),s=0;s<t;++s){var a=Vn(this,l,"div");if(null==o?o=a.left:a.left=o,(l=Tl(this,a,i,n)).hitSide)break}return l},moveV:Ur(function(r,i){var o=this,l=this.doc,s=[],a=!this.display.shift&&!l.extend&&l.sel.somethingSelected();if(l.extendSelectionsBy(function(e){if(a)return r<0?e.from():e.to();var t=Vn(o,e.head,"div");null!=e.goalColumn&&(t.left=e.goalColumn),s.push(t.left);var n=Tl(o,t,r,i);return"page"==i&&e==l.sel.primary()&&Cr(o,Un(o,n,"div").top-t.top),n},j),s.length)for(var e=0;e<l.sel.ranges.length;e++)l.sel.ranges[e].goalColumn=s[e]}),findWordAt:function(e){var t=Qe(this.doc,e.line).text,n=e.ch,r=e.ch;if(t){var i=this.getHelper(e,"wordChars");"before"!=e.sticky&&r!=t.length||!n?++r:--n;for(var o=t.charAt(n),l=te(o,i)?function(e){return te(e,i)}:/\s/.test(o)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!te(e)};0<n&&l(t.charAt(n-1));)--n;for(;r<t.length&&l(t.charAt(r));)++r}return new ci(lt(e.line,n),lt(e.line,r))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||(((this.state.overwrite=!this.state.overwrite)?H:T)(this.display.cursorDiv,"CodeMirror-overwrite"),Se(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Ur(function(e,t){Lr(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Sn(this)-this.display.barHeight,width:e.scrollWidth-Sn(this)-this.display.barWidth,clientHeight:kn(this),clientWidth:Ln(this)}},scrollIntoView:Ur(function(e,t){var n,r;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:lt(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(r=e,kr(n=this),n.curOp.scrollToPos=r):Tr(this,e.from,e.to,e.margin)}),setSize:Ur(function(e,t){function n(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e}var r=this;null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&En(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){or(r,i,"widget");break}++i}),this.curOp.forceUpdate=!0,Se(this,"refresh",this)}),operation:function(e){return Br(this,e)},startOperation:function(){return Rr(this)},endOperation:function(){return zr(this)},refresh:Ur(function(){var e=this.display.cachedTextHeight;ir(this),this.curOp.forceUpdate=!0,Pn(this),Lr(this,this.doc.scrollLeft,this.doc.scrollTop),qr(this.display),(null==e||.5<Math.abs(e-qn(this.display))||this.options.lineWrapping)&&tr(this),Se(this,"refresh",this)}),swapDoc:Ur(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Ci(this,e),Pn(this),this.display.input.reset(),Lr(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,un(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Me(Fl),Fl.registerHelper=function(e,t,n){Pl.hasOwnProperty(e)||(Pl[e]=Fl[e]={_global:[]}),Pl[e][t]=n},Fl.registerGlobalHelper=function(e,t,n,r){Fl.registerHelper(e,t,r),Pl[e]._global.push({pred:n,val:r})};var Rl,zl="iter insert remove copy getEditor constructor".split(" ");for(var Bl in vo.prototype)vo.prototype.hasOwnProperty(Bl)&&B(zl,Bl)<0&&(pl.prototype[Bl]=function(e){return function(){return e.apply(this.doc,arguments)}}(vo.prototype[Bl]));return Me(vo),pl.inputStyles={textarea:Dl,contenteditable:Ml},pl.defineMode=function(e){pl.defaults.mode||"null"==e||(pl.defaults.mode=e),function(e,t){2<arguments.length&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ue[e]=t}.apply(this,arguments)},pl.defineMIME=function(e,t){Ve[e]=t},pl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),pl.defineMIME("text/plain","null"),pl.defineExtension=function(e,t){pl.prototype[e]=t},pl.defineDocExtension=function(e,t){vo.prototype[e]=t},pl.fromTextArea=function(t,n){var e;function r(){t.value=s.getValue()}if((n=n?I(n):{}).value=t.value,!n.tabindex&&t.tabIndex&&(n.tabindex=t.tabIndex),!n.placeholder&&t.placeholder&&(n.placeholder=t.placeholder),null==n.autofocus&&(e=W(),n.autofocus=e==t||null!=t.getAttribute("autofocus")&&e==document.body),t.form&&(we(t.form,"submit",r),!n.leaveSubmitMethodAlone)){var i=t.form,o=i.submit;try{var l=i.submit=function(){r(),i.submit=o,i.submit(),i.submit=l}}catch(e){}}n.finishInit=function(e){e.save=r,e.getTextArea=function(){return t},e.toTextArea=function(){e.toTextArea=isNaN,r(),t.parentNode.removeChild(e.getWrapperElement()),t.style.display="",t.form&&(Ce(t.form,"submit",r),n.leaveSubmitMethodAlone||"function"!=typeof t.form.submit||(t.form.submit=o))}},t.style.display="none";var s=pl(function(e){return t.parentNode.insertBefore(e,t.nextSibling)},n);return s},(Rl=pl).off=Ce,Rl.on=we,Rl.wheelEventPixels=si,Rl.Doc=vo,Rl.splitLines=Re,Rl.countColumn=R,Rl.findColumn=X,Rl.isWordChar=ee,Rl.Pass=U,Rl.signal=Se,Rl.Line=$t,Rl.changeEnd=fi,Rl.scrollbarModel=Er,Rl.Pos=lt,Rl.cmpPos=st,Rl.modes=Ue,Rl.mimeModes=Ve,Rl.resolveMode=Ke,Rl.getMode=je,Rl.modeExtensions=Xe,Rl.extendMode=Ye,Rl.copyState=_e,Rl.startState=qe,Rl.innerMode=$e,Rl.commands=Uo,Rl.keyMap=Ao,Rl.keyName=Eo,Rl.isModifierKey=Ho,Rl.lookupKey=Wo,Rl.normalizeKeyMap=Do,Rl.StringStream=Ze,Rl.SharedTextMarker=po,Rl.TextMarker=ho,Rl.LineWidget=ao,Rl.e_preventDefault=Ne,Rl.e_stopPropagation=Ae,Rl.e_stop=De,Rl.addClass=H,Rl.contains=D,Rl.rmClass=T,Rl.keyNames=ko,pl.version="5.58.3",pl}); +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// This is CodeMirror (https://codemirror.net), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.CodeMirror = factory()); +}(this, (function () { 'use strict'; + + // Kludges for bugs and behavior differences that can't be feature + // detected are enabled based on userAgent etc sniffing. + var userAgent = navigator.userAgent; + var platform = navigator.platform; + + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\//.test(userAgent); + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + + var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); + var android = /Android/.test(userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { presto_version = Number(presto_version[1]); } + if (presto_version && presto_version >= 15) { presto = false; webkit = true; } + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || (ie && ie_version >= 9); + + function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + + var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) + } + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { e.className = className; } + if (style) { e.style.cssText = style; } + if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } + else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } + return e + } + // wrapper for elt, which removes the elt from the accessibility tree + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e + } + + var range; + if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r + }; } + else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r + }; } + + function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) + } + + function activeElt() { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = document.activeElement; + } catch(e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement + } + + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b + } + + var selectInput = function(node) { node.select(); }; + if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } + else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} + } + + function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } + } + + var Delayed = function() { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function (self) { + self.id = 0; + if (self.time <= +new Date) { + self.f(); + } else { + setTimeout(self.handler, self.time - +new Date); + } + }; + Delayed.prototype.set = function (ms, f) { + this.f = f; + var time = +new Date + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + + function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 + } + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerGap = 50; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = {toString: function(){return "CodeMirror.Pass"}}; + + // Reused option objects for setSelection & friends + var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; + + // The inverse of countColumn -- find the offset that corresponds to + // a particular column. + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } + } + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] + } + + function lst(arr) { return arr[arr.length-1] } + + function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out + } + + function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); + } + + function nothing() {} + + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst + } + + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + } + function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) + } + + function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true + } + + // Extending unicode characters. A series of a non-extending char + + // any number of extending chars is treated as a single unit as far + // as editing and measuring is concerned. This is not fully correct, + // since some scripts/fonts/browsers also treat other configurations + // of code points as a group. + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + + // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos + } + + // Returns the value from the range [`from`; `to`] that satisfies + // `pred` and is closest to `from`. Assumes that at least `to` + // satisfies `pred`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { return from } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { return pred(mid) ? from : to } + if (pred(mid)) { to = mid; } + else { from = mid + dir; } + } + } + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr", 0) } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } + } + + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + + return direction == "rtl" ? order.reverse() : order + } + })(); + + // Get the bidi ordering for the given line (and cache it). Returns + // false for lines that are fully left-to-right, and an array of + // BidiSpan objects otherwise. + function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order + } + + // EVENT HANDLING + + // Lightweight event framework. on/off also work on DOM nodes, + // registering native DOM handlers. + + var noHandlers = []; + + var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map = emitter._handlers || (emitter._handlers = {}); + map[type] = (map[type] || noHandlers).concat(f); + } + }; + + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map = emitter._handlers, arr = map && map[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } + } + + function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } + } + + // The DOM events that CodeMirror handles can be overridden by + // registering a (non-DOM) handler on the editor for the event name, + // and preventDefault-ing the event in that handler. + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore + } + + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } + } + + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 + } + + // Add on and off methods to a constructor's prototype, to make + // registering events on such objects more convenient. + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; + } + + // Due to the fact that we still support jurassic IE versions, some + // compatibility wrappers are needed. + + function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + + function e_target(e) {return e.target || e.srcElement} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b + } + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div + }(); + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node + } + + // Feature-detect IE's crummy client rect reporting for bidi text + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result + } : function (string) { return string.split(/\r\n?|\n/); }; + + var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } + } : function (te) { + var range; + try {range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) { return false } + return range.compareEndPoints("StartToEnd", range) != 0 + }; + + var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" + })(); + + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 + } + + // Known modes, by name and by MIME + var modes = {}, mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; + } + + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + } + + function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} + } + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true + } + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + + StringStream.prototype.eol = function () {return this.pos >= this.string.length}; + StringStream.prototype.sol = function () {return this.pos == this.lineStart}; + StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } + return this.pos > start + }; + StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} + }; + StringStream.prototype.backUp = function (n) {this.pos -= n;}; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } + }; + StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + // Find the line object corresponding to the given line number. + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] + } + + // Get the part of a document between two positions, as an array of + // strings. + function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out + } + // Get the lines between from and to, as array of strings. + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out + } + + // Update the height of a line, propagating the height change + // upwards to parent nodes. + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } + } + + // Given a line object, find its line number by walking up through + // its parent links. + function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first + } + + // Find the line at the given vertical position, using the height + // information in the document tree. + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); + } + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i + } + + function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) + } + + // A Pos instance represents a position within the text. + function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + + // Compare two positions, return 0 if they are the same, a negative + // number when a is less, and a positive number otherwise. + function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + + function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + + function copyPos(x) {return Pos(x.line, x.ch)} + function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } + function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + + // Most of the external API clips given positions to make sure they + // actually exist within the document. + function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} + function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } + } + function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out + } + + var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + + var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line + }; + + Context.prototype.baseToken = function (n) { + if (!this.baseTokens) { return null } + while (this.baseTokens[this.baseTokenPos] <= n) + { this.baseTokenPos += 2; } + var type = this.baseTokens[this.baseTokenPos + 1]; + return {type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n} + }; + + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } + }; + + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } + }; + + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state + }; + + + // Compute a style array (an array starting with a mode generation + // -- for invalidation -- followed by pairs of end positions and + // style strings), which is used to highlight the tokens on the + // line. + function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + context.baseTokens = st; + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} + } + + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles + } + + function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. Used for lines that + // aren't currently visible. + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + + function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } + } + + function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") + } + + var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + + // Utility for getTokenAt and getLineTokens + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) + } + + function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type + } + + // Run the given mode's parser over a line, calling f for each token. + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline + } + + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + + // Optimize some code when these features are not used. + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + + // TEXTMARKER SPANS + + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; + } + + // Search an array of spans for a span matching the given marker. + function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } + } + // Remove a span from an array, returning undefined if no spans are + // left (we don't store arrays for lines without spans). + function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r + } + // Add a span to a line. + function addMarkedSpan(line, span) { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + span.marker.attachLine(line); + } + + // Used for the algorithm that adjusts markers for a change in the + // document. These functions cut an array of spans at a given + // character position, returning an array of remaining chunks (or + // undefined if nothing remains). + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw + } + + // Given a change object, compute the new set of marker spans that + // cover the line in which the change took place. Removes spans + // entirely within the change, reconnects spans belonging to the + // same marker that appear on both sides of the change, and cuts off + // spans partially within the change. Returns an array of span + // arrays with one element for each line in (after) the change. + function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers + } + + // Remove spans that are empty and don't have a clearWhenEmpty + // option of false. + function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans + } + + // Used to 'clip' out readOnly ranges when making a change. + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts + } + + // Connect or disconnect spans from a line. + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; + } + + // Helpers used when computing which overlapping collapsed span + // counts as the larger one. + function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } + function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + + // Returns a number indicating which of two overlapping collapsed + // spans is larger (and thus includes the other). Falls back to + // comparing ids when the spans cover exactly the same range. + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id + } + + // Find out whether a line ends or starts in a collapsed span. If + // so, return the marker for that span. + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } + } } + return found + } + function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } + function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } + } } + return found + } + + // Test whether there exists a collapsed span that partially + // overlaps (covers the start or end, but not both) of a new span. + // Such overlap is not allowed. + function conflictingCollapsedRange(doc, lineNo, from, to, marker) { + var line = getLine(doc, lineNo); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } + } + + // A visual line is a line as drawn on the screen. Folding, for + // example, can cause multiple logical lines to appear on the same + // visual line. This finds the start of the visual line that the + // given line is part of (usually that is the line itself). + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line + } + + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line + } + + // Returns an array of logical lines that continue the visual line + // started by the argument, or undefined if there are no such lines. + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines + } + + // Get the line number of the start of the visual line that the + // given line number is part of. + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) + } + + // Get the line number of the start of the next visual line after + // the given line. + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 + } + + // Compute whether a line is hidden. Lines count as hidden when they + // are part of a visual line that starts with another line, or when + // they are entirely covered by collapsed, non-widget span. + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } + } + + // Find the height above the given line. + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h + } + + // Compute the character length of a line, taking into account + // collapsed ranges (see markText) that might hide parts, and join + // other lines onto it. + function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len + } + + // Find the longest line in the document. + function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + + Line.prototype.lineNo = function () { return lineNo(this) }; + eventMixin(Line); + + // Change the content (text, markers) of a line. Automatically + // invalidates cached information and tries to re-estimate the + // line's height. + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + } + + // Detach a line from the document tree and its markers. + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Convert a style as returned by a mode (either null, or a string + // containing one or more styles) to a CSS style. This is cached, + // and also looks for line-wide styles. + var styleToClassCache = {}, styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) + } + + // Render the DOM representation of the text of a line. Also builds + // up a 'line map', which points at the DOM nodes that represent + // specific stretches of text, and is used by the measuring code. + // The returned object contains the DOM node, this map, and + // information about line-wide styles that were set by the mode. + function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder + } + + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token + } + + // Build up the DOM representation for a single token, and add it to + // the line map. Takes care to render special characters separately. + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css || attributes) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") + { token.setAttribute(attr, attributes[attr]); } } + } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result + } + + // Work around nonsense dimensions being reported for stretches of + // right-to-left text. + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } + } + + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { (attributes || (attributes = {})).title = m.title; } + if (m.attributes) { + for (var attr in m.attributes) + { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } + } + + + // These objects are used to represent the visible (currently drawn) + // part of the document. A LineView may correspond to multiple + // logical lines, if those are connected by collapsed ranges. + function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + + // Create a range of LineView objects for the given lines. + function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array + } + + var operationGroup = null; + + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + + function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) + } + + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } + } + + var orphanDelayedCallbacks = null; + + // Often, we want to signal events at a point where we are in the + // middle of some work, but don't want the handler to start calling + // other methods on the editor, which might be in an inconsistent + // state or simply not expect any other events to happen. + // signalLater looks whether there are any handlers, and schedules + // them to be executed when the last operation ends, or, if no + // operation is active, when a timeout fires. + function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); + } + + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } + } + + // When an aspect of a line changes, a string is added to + // lineView.changes. This updates the relevant part of the line's + // DOM structure. + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; + } + + // Lines with gutter elements, widgets or a background class need to + // be wrapped, and have the extra elements added to the wrapper div + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node + } + + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + + // Wrapper around buildLineContent which will reuse the structure + // in display.externalMeasured when possible. + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) + } + + // Redraw the line's text. Interacts with the background and text + // classes because the mode may output tokens that influence these + // classes. + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } + } + + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); + } + + // Build a line's DOM representation from scratch + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node + } + + // A lineView may contain multiple logical lines (when merged by + // collapsed spans). The widgets for all of them need to be drawn. + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } + } + + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } + } + + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } + } + + function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight + } + + // Return true when the given mouse event happened in a widget + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop} + function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} + function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data + } + + function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight + } + + // Ensure the lineView.wrapping.heights array is populated. This is + // an array of bottom offsets for the lines that make up a drawn + // line. When lineWrapping is on, there might be more than one + // height. + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } + } + + // Find a line map (mapping character offsets to text nodes) and a + // measurement cache for the given line number. (A line view might + // contain multiple lines when collapsed ranges are present.) + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } + } + + // Render a line into the hidden node display.externalMeasured. Used + // when measurement is needed for a line that's not in the viewport. + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view + } + + // Get a {top, bottom, left, right} box (in line-local coordinates) + // for a given character. + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) + } + + // Find a line view that corresponds to the given line number. + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } + } + + // Measurement can be split in two steps, the set-up work that + // applies to the whole line, and the measurement of the actual + // character. Functions like coordsChar, that need to do a lot of + // measurements in a row, can thus ensure that the set-up work is + // only done once. + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } + } + + // Given a prepared measurement object, measures the position of an + // actual character (or fetches it from the cache). + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} + } + + var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + + function nodeAndOffsetInLineMap(map, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map.length; i += 3) { + mStart = map[i]; + mEnd = map[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { + node = map[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { + node = map[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} + } + + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect + } + + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result + } + + // Work around problem with bounding client rects on ranges being + // returned incorrectly when zoomed on IE10 and below. + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} + } + + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } + } + + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } + } + + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; + } + + function pageScrollX() { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft + } + function pageScrollY() { + if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } + return window.pageYOffset || (document.documentElement || document.body).scrollTop + } + + function widgetTopHeight(lineObj) { + var height = 0; + if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) + { height += widgetHeight(lineObj.widgets[i]); } } } + return height + } + + // Converts a {top, bottom, left, right} box from line-local + // coordinates into another coordinate system. Context may be one of + // "line", "div" (display.lineDiv), "local"./null (editor), "window", + // or "page". + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; rect.bottom += height; + } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect + } + + // Coverts a box from "div" coords to another coordinate system. + // Context may be "window", "page", "div", or "local"./null. + function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} + } + + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) + } + + // Returns a box for a given cursor position, which may have an + // 'other' property containing the position of the secondary cursor + // on a bidi boundary. + // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` + // and after `char - 1` in writing order of `char - 1` + // A cursor Pos(line, char, "after") is on the same visual line as `char` + // and before `char` in writing order of `char` + // Examples (upper-case letters are RTL, lower-case are LTR): + // Pos(0, 1, ...) + // before after + // ab a|b a|b + // aB a|B aB| + // Ab |Ab A|b + // AB B|A B|A + // Every position after the last character on a line is considered to stick + // to the last character on the line. + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = part.level == 1; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val + } + + // Used to cheaply estimate the coordinates for a position. Used for + // intermediate scroll updates. + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} + } + + // Positions returned by coordsChar contain some extra information. + // xRel is the relative x position of the input coordinates compared + // to the found position (so xRel > 0 means the coordinates are to + // the right of the character position, for example). When outside + // is true, that means the coordinates lie outside the line's + // vertical range. + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = outside; } + return pos + } + + // Compute the character position closest to the given coordinates. + // Input must be lineSpace-local ("div" coordinate system). + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { return found } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { return rangeEnd } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); + return {begin: begin, end: end} + } + + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) + (cm, lineObj, lineNo, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight; box.bottom += widgetHeight; + if (!boxIsAfter(box, x, y, false)) { return false } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true + }, begin, end); + + var baseX, sticky, outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { ch++; } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : + (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ? + "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo, ch, sticky, outside, x - baseX) + } + + function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"), + "line", lineObj, preparedMeasure), x, y, true) + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) + { part = order[index - 1]; } + } + return part + } + + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } + var part = null, closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { continue } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { part = order[order.length - 1]; } + // Clip the part to the wrapped line. + if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } + if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } + return part + } + + var measureText; + // Compute the default text height. + function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 + } + + // Compute the default character width. + function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 + } + + // Do a bulk-read of the DOM positions and sizes needed to draw the + // view, so that we don't interleave reading and writing to the DOM. + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + var id = cm.display.gutterSpecs[i].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} + } + + // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, + // but using getBoundingClientRect to get a sub-pixel-accurate + // result. + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left + } + + // Returns a function that estimates the height of a line, to use as + // first approximation until the line becomes visible (and is thus + // properly measurable). + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } + } + + function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); + } + + // Given a mouse event, find the corresponding position. If liberal + // is false, it checks whether a gutter or scrollbar was clicked, + // and returns null if it was. forRect is used by rectangular + // selections, and tries to estimate a character position even for + // coordinates beyond the right of the text. + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e$1) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords + } + + // Find the view element corresponding to a given line. Return null + // when the line isn't visible. + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } + } + + // Updates the display.view data structure for a given change to the + // document. From and to are in pre-change coordinates. Lendiff is + // the amount of lines added or subtracted by the change. This is + // used for changes that span multiple lines, or change the way + // lines are divided into visual lines. regLineChange (below) + // registers single-line changes. + function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } + } + + // Register a change to a single line. Type must be one of "text", + // "gutter", "class", "widget" + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } + } + + // Clear the view. + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} + } + + // Force the view to cover a given range, adding empty view element + // or clipping off existing ones as needed. + function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; + } + + // Count the number of lines in the view whose DOM representation is + // out of date (or nonexistent). + function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty + } + + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + + function prepareSelection(cm, primary) { + if ( primary === void 0 ) primary = true; + + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (!primary && i == doc.sel.primIndex) { continue } + var range = doc.sel.ranges[i]; + if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue } + var collapsed = range.empty(); + if (collapsed || cm.options.showCursorWhenSelecting) + { drawSelectionCursor(cm, range.head, curFragment); } + if (!collapsed) + { drawSelectionRange(cm, range, selFragment); } + } + return result + } + + // Draws a cursor for the given range + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } + } + + function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } + + // Draws the given range as a highlighted selection + function drawSelectionRange(cm, range, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop] + } + + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i == 0, last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + + if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } + if (cmpCoords(toPos, start) < 0) { start = toPos; } + if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } + if (cmpCoords(toPos, end) < 0) { end = toPos; } + }); + return {start: start, end: end} + } + + var sFrom = range.from(), sTo = range.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); + } + + // Cursor-blinking + function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { + if (!cm.hasFocus()) { onBlur(cm); } + display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } + } + + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { onFocus(cm); } + } + } + + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { onBlur(cm); } + } }, 100); + } + + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); + } + + // Read the actual heights of the rendered lines, and update their + // stored heights to match. + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], wrapping = cm.options.lineWrapping; + var height = (void 0), width = 0; + if (cur.hidden) { continue } + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) + { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } + } + var diff = cur.line.height - height; + if (diff > .005 || diff < -.005) { + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + } + + // Read and store the height of line widgets associated with the + // given line. + function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i], parent = w.node.parentNode; + if (parent) { w.height = parent.offsetHeight; } + } } + } + + // Compute the lines that are visible in a given viewport (defaults + // the the current scroll position). viewport may contain top, + // height, and ensure (see op.scrollToPos) properties. + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} + } + + // SCROLLING THINGS INTO VIEW + + // If an editor sits on the top or bottom of the window, partially + // scrolled out of view, this ensures that the cursor is visible. + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + + // Scroll a given position into view (immediately), verifying that + // it actually became visible (as line heights are accurately + // measured, the position of something may 'drift' during drawing). + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect + } + + // Scroll a given set of coordinates into view (immediately). + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } + } + + // Calculate a new scroll position needed to scroll the given + // rectangle into view. Returns an object with scrollTop and + // scrollLeft properties. When these are undefined, the + // vertical/horizontal position does not need to be adjusted. + function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result + } + + // Store a relative adjustment to the scroll position in the current + // operation (to be applied when the operation finishes). + function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + + // Make sure that at the end of the operation the current cursor is + // shown. + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; + } + + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } + } + + function scrollToRange(cm, range) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range; + } + + // When an operation has its scrollToPos property set, and another + // scroll action is applied before the end of the operation, this + // 'simulates' scrolling that position into view in a cheap way, so + // that the effect of intermediate scroll commands is not ignored. + function resolveScrollToPos(cm) { + var range = cm.curOp.scrollToPos; + if (range) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); + scrollToCoordsRange(cm, from, to, range.margin); + } + } + + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + + // Sync the scrollable area and scrollbars, ensure the viewport + // covers the visible area. + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); + } + + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } + } + + // Sync scroller and scrollbar, ensure the gutter elements are + // aligned. + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); + } + + // SCROLLBARS + + // Prepare DOM reads needed to update the scrollbars. Done in one + // shot to minimize update/measure roundtrips. + function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } + } + + var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } + }; + + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} + }; + + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } + }; + + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } + }; + + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; + }; + + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt != bar) { bar.style.pointerEvents = "none"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); + }; + + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + + var NullScrollbars = function () {}; + + NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + + function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } + } + + // Re-synchronize the fake scrollbars with the actual size of the + // content. + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } + } + + var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + // Operations are used to wrap a series of changes to the editor + // state in such a way that each change won't have to update the + // cursor and display (which would be awkward, slow, and + // error-prone). Instead, display updates are batched and then all + // combined and executed at once. + + var nextOpId = 0; + // Start a new operation. + function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: 0, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId // Unique ID + }; + pushOperation(cm.curOp); + } + + // Finish an operation, updating the display and signalling delayed events + function endOperation(cm) { + var op = cm.curOp; + if (op) { finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); } + } + + // The DOM updates done when an operation finishes are batched so + // that the minimum number of relayouts are required. + function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } + } + + function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); + } + + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + + function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(); } + } + + function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt(); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } + } + + function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } + } + + // Run the given function in an operation + function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } + } + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } + } + // Used to add methods to editor and doc instances, wrapping them in + // operations. + function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } + } + function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } + } + + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } + } + + // DISPLAY DRAWING + + var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } + }; + DisplayUpdate.prototype.finish = function () { + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this.events[i]); } + }; + + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + + function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result + } + + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && + snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), range = document.createRange(); + range.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range.collapse(false); + sel.removeAllRanges(); + sel.addRange(range); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + + // Does the actual updating of the line display. Bails out + // (returning false) when there is nothing to be done and forced is + // false. + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true + } + + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } + } + + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + + // Sync the actual display DOM structure with display.view, removing + // nodes for lines that are no longer in view, and creating the ones + // that are not there yet, and updating the ones that are out of + // date. + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } + } + + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + } + + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; + } + + // Re-align line numbers and gutter marks to compensate for + // horizontal scrolling. + function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } + } + + // Used to ensure that the line number gutter is still the right + // size for the current document size. Returns true when an update + // is needed. + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true + } + return false + } + + function getGutters(gutters, lineNumbers) { + var result = [], sawLineNumbers = false; + for (var i = 0; i < gutters.length; i++) { + var name = gutters[i], style = null; + if (typeof name != "string") { style = name.style; name = name.className; } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { continue } + else { sawLineNumbers = true; } + } + result.push({className: name, style: style}); + } + if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } + return result + } + + // Rebuild the gutter elements, ensure the margin to the left of the + // code matches their width. + function renderGutters(display) { + var gutters = display.gutters, specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i = 0; i < specs.length; ++i) { + var ref = specs[i]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { gElt.style.cssText = style; } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + + // The display handles the DOM integration, both for input reading + // and content drawing. It holds references to DOM nodes and + // display-related state. + + function Display(place, doc, input, options) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + + input.init(d); + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) { wheelPixelsPerUnit = -.53; } + else if (gecko) { wheelPixelsPerUnit = 15; } + else if (chrome) { wheelPixelsPerUnit = -.7; } + else if (safari) { wheelPixelsPerUnit = -1/3; } + + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta + } + + function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && wheelPixelsPerUnit != null) { + var pixels = dy * wheelPixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + // Selection objects are immutable. A new one is created every time + // the selection changes. A selection is one or more non-overlapping + // (and non-touching) ranges, sorted, and an integer that indicates + // which one is the primary selection (the one that's scrolled into + // view, that getCursor returns, etc). + var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + + Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + + Selection.prototype.equals = function (other) { + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true + }; + + Selection.prototype.deepCopy = function () { + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); } + return new Selection(out, this.primIndex) + }; + + Selection.prototype.somethingSelected = function () { + for (var i = 0; i < this.ranges.length; i++) + { if (!this.ranges[i].empty()) { return true } } + return false + }; + + Selection.prototype.contains = function (pos, end) { + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 + }; + + var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; + }; + + Range.prototype.from = function () { return minPos(this.anchor, this.head) }; + Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; + Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + + // Take an unsorted, potentially overlapping set of ranges, and + // build a selection out of it. 'Consumes' ranges array (modifying + // it). + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) + } + + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) + } + + // Compute the position of the end of a change (its 'to' property + // refers to the pre-change end). + function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) + } + + // Adjust a position to refer to the post-change position of the + // same text, or the end of the change if the change covers it. + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) + } + + function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex) + } + + function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } + } + + // Used by replaceSelections to allow moving the selection to the + // start or around the replaced test. Hint may be "start" or "around". + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) + } + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } + } + + // DOCUMENT DATA STRUCTURE + + // By default, updates that start and end at the beginning of a line + // are treated specially, in order to make the association of line + // widgets and marker elements with the text behave more intuitive. + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) + } + + // Perform a change on the document data structure. + function updateDoc(doc, change, markedSpans, estimateHeight) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); + } + + // Call f for all linked documents. + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); + } + + // Attach a document to an editor. + function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); + } + + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + + function History(startGen) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = startGen || 1; + } + + // Create a history change event from an updateDoc-style change + // object. + function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange + } + + // Pop all selection events off the end of a history array. Stop at + // a change event. + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } + } + + // Find the top change event in the history. Pop off selection + // events that are in the way. + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } + } + + // Register a change in the history. Merges changes that are within + // a single operation, or are close together with an origin that + // allows merging (starting with "+") into a single event. + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } + } + + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) + } + + // Called whenever the selection changes, sets the new selection as + // the pending selection in the history, and pushes the old pending + // selection into the 'done' array when it was significantly + // different (in number of selected ranges, emptiness, or time). + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } + } + + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } + } + + // Used to store marked span information in the history. + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); + } + + // When un/re-doing restores text containing marked spans, those + // that have been explicitly cleared should not be restored. + function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null + } + + // Retrieve and filter the old marked spans stored in a change event. + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw + } + + // Used for un/re-doing changes from the history. Combines the + // result of computing the existing spans with the set of spans that + // existed in the history (so that deleting around a span and then + // undoing brings back the span). + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy + } + + // The 'scroll' parameter given to many of these indicated whether + // the new cursor position should be scrolled into view after + // modifying the selection. + + // If shift is held or the extend flag is set, extends a range to + // include a given position (and optionally a second position). + // Otherwise, simply returns the range between the given positions. + // Used for cursor motion and such. + function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } + } + + // Extend the primary selection range, discard the rest. + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + + // Extend all selections (pos is an array of selections with length + // equal the number of selections) + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + + // Updates a single range in the selection. + function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + + // Reset the selection to a single range. + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + + // Give beforeSelectionChange handlers a change to influence a + // selection update. + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } + else { return sel } + } + + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + + // Set a new selection. + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm) + { ensureCursorVisible(doc.cm); } + } + + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + + // Verify that the selection does not partially select any atomic + // marked ranges. + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + + // Return a selection that does not partially select any atomic + // ranges. + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel + } + + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + + // Determine if we should prevent the cursor being placed to the left/right of an atomic marker + // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it + // is with selectLeft/Right + var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; + + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? preventCursorRight : preventCursorLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos + } + + // Ensure a given position is not inside an atomic range. + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found + } + + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } + } + + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + + // UPDATING + + // Allow "beforeChange" event handlers to influence a change + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { + if (doc.cm) { doc.cm.curOp.updateInput = 2; } + return null + } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} + } + + // Apply a change to a document, and add it to the document's + // history, and propagating it to all linked documents. + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } + } else { + makeChangeInner(doc, change); + } + } + + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + // Revert a change stored in a document's history. + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } else if (suppress) { + source.push(event); + return + } else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } + } + + // Sub-views need their line numbers shifted when text is added + // above or below them in the parent document. + function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } + } + + // More lower-level change function, handling only a single document + // (not linked ones). + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) + { doc.cantEdit = false; } + } + + // Handle the interaction of a change to a document with the editor + // that this document is part of. + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; + } + + function replaceRange(doc, code, from, to, origin) { + var assign; + + if (!to) { to = from; } + if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } + } + + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // Utility for applying a change to a line by handle or number, + // returning the number and optionally registering the line as + // changed. + function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line + } + + // The document is represented as a BTree consisting of leaves, with + // chunk of lines in them, and branches, with up to ten leaves or + // other branch nodes below them. The top node is always a branch + // node, and is the document object itself (meaning it has + // additional methods and properties). + // + // All nodes have parent links. The tree is used both to go from + // line numbers to line objects, and to go from objects to numbers. + // It also indexes by height, and is used to convert between height + // and line object, and to find the total height of the document. + // + // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function(at, n) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; } + }, + + // Used to iterate over a part of the tree. + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + { if (op(this.lines[at])) { return true } } + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size }, + + removeInner: function(at, n) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function(lines) { + for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); } + }, + + insertInner: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function(at, n, op) { + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } + }; + + // Line widgets are block elements displayed above or below a line. + + var LineWidget = function(doc, node, options) { + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; + }; + + LineWidget.prototype.clear = function () { + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + + LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } + } + + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } + return widget + } + + // TEXTMARKERS + + // Created with markText and setBookmark methods. A TextMarker is a + // handle that can be used to clear or find a marked position in the + // document. Line objects hold arrays (markedSpans) containing + // {from, to, marker} object pointing to such marker objects, and + // indicating that such a marker is present on that line. Multiple + // lines may point to the same marker when it spans across lines. + // The spans will have null for their from/to properties when the + // marker continues beyond the start/end of the line. Markers have + // links back to the lines they currently touch. + + // Collapsed markers have unique ids, in order to be able to order + // them, which is needed for uniquely determining an outer marker + // when they overlap (they may nest, but not partially overlap). + var nextMarkerId = 0; + + var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + + // Clear the marker. + TextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } + }; + + // Find the position of the marker in the document. Returns a {from, + // to} object by default. Side can be passed to get a specific side + // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the + // Pos objects returned contain a line object, rather than a line + // number (used to prevent looking up the same line twice). + TextMarker.prototype.find = function (side, lineObj) { + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} + }; + + // Signals that the marker's widget changed, and surrounding layout + // should be recomputed. + TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); + }; + + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); + }; + + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp + ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + + // Create a marker, wire it up to the right lines, and + function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null)); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.startStyle || marker.endStyle || marker.css || + marker.attributes || marker.title) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker + } + + // SHARED TEXTMARKERS + + // A shared marker spans multiple linked documents. It is + // implemented as a meta-marker-object controlling multiple normal + // markers. + var SharedTextMarker = function(markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this; } + }; + + SharedTextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this.markers[i].clear(); } + signalLater(this, "clear"); + }; + + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) + }; + eventMixin(SharedTextMarker); + + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) + } + + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) + } + + function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + + function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); + } + + var nextDocId = 0; + var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range.head; } + else if (start == "anchor") { pos = range.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range.to(); } + else { pos = range.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this, ranges[i].anchor), + clipPos(this, ranges[i].head)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() { + var this$1 = this; + + this.history = new History(this.history.maxGeneration); + linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true); + }, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history.maxGeneration); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo == from.line && from.ch >= span.to || + span.from == null && lineNo != from.line || + span.from != null && lineNo == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo; + }); + return clipPos(this, Pos(lineNo, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + if (other instanceof CodeMirror) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this.linked[i]; + if (link.doc != other) { continue } + this.linked.splice(i, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) + }); + + // Public alias. + Doc.prototype.eachLine = Doc.prototype.iter; + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function () { + if (++read == n) { + operation(cm, function () { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines( + text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + var reader = new FileReader; + reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); }; + reader.onload = function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + text[i] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e$1){} + } + } + + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } + } + + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + + // These must be handled carefully, because naively registering a + // handler for each editor will cause the editors to never be + // garbage collected. + + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"), editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { editors.push(cm); } + } + if (editors.length) { editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { f(editors[i]); } + }); } + } + + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); + } + // Called when the window resizes + function onResize(cm) { + var d = cm.display; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + + var keyNames = { + 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" + }; + + // Number keys + for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } + // Alphabetic keys + for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } + // Function keys + for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + + var keyMap = {}; + + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + // Note that the save and find-related commands aren't defined by + // default. User code or addons can define them. Unknown commands + // are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + // Very basic readline/emacs-style bindings, which are standard on Mac. + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", + "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", + "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + + // KEYMAP DISPATCH + + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name + } + + // This is a kludge to keep keymaps mostly working as raw objects + // (backwards compatibility) while at the same time support features + // like normalization and multi-stroke key bindings. It compiles a + // new normalized keymap, and then updates the old object to reflect + // this. + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap + } + + function lookupKey(key, map, handle, context) { + map = getKeyMap(map); + var found = map.call ? map.call(key, context) : map[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map.fallthrough) { + if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") + { return lookupKey(key, map.fallthrough, handle, context) } + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle, context); + if (result) { return result } + } + } + } + + // Modifier key presses don't count as 'real' key presses for the + // purpose of keymap fallthrough. + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" + } + + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name + } + + // Look up the name of a key as indicated by an event object. + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { name = event.code; } + return addModifierNames(name, event, noShift) + } + + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val + } + + // Helper for deleting text near the selection(s), used to implement + // backspace, delete, and similar functionality. + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); + } + + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target + } + + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") + } + + function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { dir = -dir; } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") + } + + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null + } + + // Commands are parameter-less actions that can be performed on an + // editor, mostly used for keybindings. + var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } + }; + + + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start + } + + // Run a handler that was bound to a key. + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done + } + + function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) + } + + // Note that, despite the name, this function is also used to check + // for bound mouse clicks. + + var stopSeq = new Delayed; + + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + if (/\'$/.test(name)) + { cm.state.keySeq = null; } + else + { stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } + } + return dispatchKeyInner(cm, name, e, handle) + } + + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + return !!result + } + + // Handle a key from the keydown event. + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } + } + + // Handle a key from the keypress event + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) + { document.execCommand("cut"); } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } + } + + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + + function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); + } + + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); + } + + var DOUBLECLICK_DELAY = 400; + + var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button + }; + + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } + } + + // A mouse down can be a single click, double click, triple click, + // start of selection drag, start of text drag, new cursor + // (ctrl-click), rectangle drag (alt-drag), or xwin + // middle-click-paste. Or it might be a click on something we should + // not interfere with, such as a scrollbar or widget. + function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { cm.display.input.onContextMenu(e); } + else { delayBlurEvent(cm); } + } + } + + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) + } + + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value + } + + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } + } + + // Start a text drag. When it ends, see if any dragging actually + // happen, and treat as a click if it didn't. + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; } + else { delayBlurEvent(cm); } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if ((webkit && !safari) || ie && ie_version == 9) + { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + cm.state.delayingBlurEvent = true; + setTimeout(function () { return display.input.focus(); }, 20); + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + } + + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) + } + + // Normal selection, as opposed to text dragging. + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { delayBlurEvent(cm); } + var display = cm.display, doc = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); } + else + { ourRange = range; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } + } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range.anchor, anchor) > 0) { + head = range.head; + anchor = minPos(oldRange.from(), range.anchor); + } else { + head = range.anchor; + anchor = maxPos(oldRange.to(), range.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } + } + } + + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + // If e is null or undefined we interpret this as someone trying + // to explicitly cancel the selection rather than the user + // letting go of the mouse button. + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range) { + var anchor = range.anchor; + var head = range.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range } + var order = getOrder(anchorLine); + if (!order) { return range } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { return range } + var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { return range } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) + { leftSide = dir < 0; } + else + { leftSide = dir > 0; } + } + + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head) + } + + + // Determines whether an event happened in the gutter, and fires the + // handlers for the corresponding event. + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { mX = e.clientX; mY = e.clientY; } + catch(e$1) { return false } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } + + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e) + } + } + } + + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) + } + + // CONTEXT MENU HANDLING + + // To make the context menu work, we need to briefly unhide the + // textarea (making it as unobtrusive as possible) to let the + // right-click take effect on it. + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + if (!captureRightClick) { cm.display.input.onContextMenu(e); } + } + + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + var Init = {toString: function(){return "CodeMirror.Init"}}; + + var defaults = {}; + var optionHandlers = {}; + + function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); + option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + + option("screenReaderLabel", null, function (cm, val) { + val = (val === '') ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); + option("phrases", null); + } + + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); + } + + // A CodeMirror instance represents an editor. This is the object + // that user code is usually dealing with. + + function CodeMirror(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + else if (options.mode) { doc.modeOption = options.mode; } + this.doc = doc; + + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(function () { + if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); } + }, 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } + } + + // The default configuration options. + CodeMirror.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.optionHandlers = optionHandlers; + + // Attach the necessary event handlers when initializing the editor + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); + on(d.input.getField(), "contextmenu", function (e) { + if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); } + }); + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); + } + + var initHooks = []; + CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; + + // Indent the given line. The how parameter can be "smart", + // "add"/null, "subtract", or "prev". When aggressive is false + // (typically set to true for forced single-line indents), empty + // lines are not indented, and places where the mode returns Pass + // are left alone. + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } + } + } + + // This will be set to a {lineWise: bool, text: [string]} object, so + // that, when pasting, we know what kind of selections the copied + // text was made out of. + var lastCopied = null; + + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var recent = +new Date - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasting N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); + } + } + + var updateInput = cm.curOp.updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range = sel.ranges[i$1]; + var from = range.from(), to = range.to(); + if (range.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) + { from = to = Pos(from.line, 0); } + } + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } + } + + function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range = sel.ranges[i]; + if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue } + var mode = cm.getModeAt(range.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) + { indented = indentLine(cm, range.head.line, "smart"); } + } + if (indented) { signalLater(cm, "electricInput", cm, range.head.line); } + } + } + + function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} + } + + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + disableBrowserMagic(te); + return div + } + + // The publicly visible API. Note that methodOp(f) means + // 'wrap f in an operation, performed on its `this` parameter'. + + // This is not the complete set of editor methods. Most of the + // methods defined on the Doc type are also injected into + // CodeMirror.prototype, for backwards compatibility and + // convenience. + + function addEditorMethods(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){window.focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); + }, + removeKeyMap: function(map) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map || maps[i].name == map) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this.state.modeGen++; + regChange(this); + return + } + } + }), + + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (!range.empty()) { + var from = range.from(), to = range.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this, j, how); } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range.head.line > end) { + indentLine(this, range.head.line, how, true); + end = range.head.line; + if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range = this.doc.sel.primary(); + if (start == null) { pos = range.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range.from() : range.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range) { + if (this$1.display.shift || this$1.doc.extend || range.empty()) + { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range.from() : range.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range) { + var other = findPosH(doc, range.head, dir, unit, false); + return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range) { + if (collapse) + { return dir < 0 ? range.from() : range.to() } + var headPos = cursorCoords(this$1, range.head, "div"); + if (range.goalColumn != null) { headPos.left = range.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, + + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt() }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range, margin) { + if (range == null) { + range = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range == "number") { + range = {from: Pos(range, 0), to: null}; + } else if (range.from == null) { + range = {from: range, to: null}; + } + if (!range.to) { range.to = range.from; } + range.margin = margin || 0; + + if (range.from.line != null) { + scrollToRange(this, range); + } else { + scrollToCoordsRange(this, range.from, range.to, range.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo = this.display.viewFrom; + this.doc.iter(lineNo, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } } + ++lineNo; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + startOperation: function(){return startOperation(this)}, + endOperation: function(){return endOperation(this)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + // Cancel the current text selection if any (#5821) + if (this.state.selectingText) { this.state.selectingText(); } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText + }, + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; + } + + // Used for horizontal relative motion. Dir is -1 or 1 (left or + // right), unit can be "codepoint", "char", "column" (like char, but + // doesn't cross line boundaries), "word" (across next word), or + // "group" (to the start of next group of word or + // non-word-non-whitespace chars). The visually param controls + // whether, in right-to-left text, direction 1 means to move towards + // the next index in the string, or towards the character to the right + // of the current position. The resulting position will have a + // hitSide=true property if it reached the end of the document. + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + var lineDir = visually && doc.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1)); + if (isNaN(ch)) { next = null; } + else { next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (ch >= 0xD800 && ch < 0xDC00 ? 2 : 1))), + -dir); } + } else if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); } + else + { return false } + } else { + pos = next; + } + return true + } + + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } + + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result + } + + // For relative vertical movement. Dir may be -1 or 1. Unit can be + // "page" or "line". The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target + } + + // CONTENTEDITABLE INPUT STYLE + + var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + + ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { return true } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break } + } + return false + } + + on(div, "paste", function (e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); + + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); + + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); + + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = document.activeElement; + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + + ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.div.setAttribute('aria-label', label); + } else { + this.div.removeAttribute('aria-label'); + } + }; + + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = document.activeElement == this.div; + return result + }; + + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); + }; + + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection() + }; + + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } + + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } + + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; + } + + if (!start || !end) { + sel.removeAllRanges(); + return + } + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); + }; + + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); + }; + + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; + }; + + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) + }; + + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || document.activeElement != this.div) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function () { this.div.blur(); }; + ContentEditableInput.prototype.getField = function () { return this.div }; + + ContentEditableInput.prototype.supportsTouch = function () { return true }; + + ContentEditableInput.prototype.receivedFocus = function () { + var input = this; + if (this.selectionInEditor()) + { this.pollSelection(); } + else + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset + }; + + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = this.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } + }; + + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } + }; + + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } + } + this$1.updateFromDOM(); + }, 80); + }; + + ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } + }; + + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; + + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } + }; + + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; + + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; + + ContentEditableInput.prototype.needsContentAttribute = true; + + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result + } + + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false + } + + function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } + + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { text += lineSep; } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return + } + var markerID = node.getAttribute("cm-marker"), range; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range = found[0].find(0))) + { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } + + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + + if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + extraLinebreak = false; + } + return text + } + + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } + } + + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) + } + } + + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map.length; j += 3) { + var curNode = map[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } + } + + // TEXTAREA INPUT STYLE + + var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; + }; + + TextareaInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = this.cm; + this.createField(display); + var te = this.textarea; + + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } + + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); + + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + + cm.state.pasteIncoming = +new Date; + input.fastPoll(); + }); + + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = +new Date; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +new Date; + input.focus(); + return + } + + // Pass the `paste` event to the textarea so it's handled by its event listener. + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + + TextareaInput.prototype.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + }; + + TextareaInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.textarea.setAttribute('aria-label', label); + } else { + this.textarea.removeAttribute('aria-label'); + } + }; + + TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } + + return result + }; + + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + + // Reset the input to correspond to the selection (or to be empty, + // when not typing and nothing is selected) + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { return } + var cm = this.cm; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + }; + + TextareaInput.prototype.getField = function () { return this.textarea }; + + TextareaInput.prototype.supportsTouch = function () { return false }; + + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } + }; + + TextareaInput.prototype.blur = function () { this.textarea.blur(); }; + + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + + TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; + + // Poll for input changes, using the normal rate of polling. This + // runs as long as the editor is focused. + TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); + }; + + // When an event has just come in that is likely to add or change + // something in the input textarea, we poll faster, to ensure that + // the change appears on the screen quickly. + TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); + }; + + // Read input from the textarea, and update the document to match. + // When something is selected, it is present in the textarea, and + // selected (unless it is huge, in which case a placeholder is + // used). When nothing is selected, the cursor sits after previously + // seen text (can be empty), which is stored in prevInput (we must + // not reset the textarea when typing, because that breaks IME). + TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true + }; + + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } + }; + + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); + }; + + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + if (input.contextMenuPending) { input.contextMenuPending(); } + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { window.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { return } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; + + TextareaInput.prototype.setUneditable = function () {}; + + TextareaInput.prototype.needsContentAttribute = false; + + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm + } + + function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; + } + + // EDITOR CONSTRUCTOR + + defineOptions(CodeMirror); + + addEditorMethods(CodeMirror); + + // Set up methods on CodeMirror's prototype to redirect to the editor's document. + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + + eventMixin(Doc); + CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + CodeMirror.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } + defineMode.apply(this, arguments); + }; + + CodeMirror.defineMIME = defineMIME; + + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); + + // EXTENSIONS + + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + + CodeMirror.fromTextArea = fromTextArea; + + addLegacyProps(CodeMirror); + + CodeMirror.version = "5.58.3"; + + return CodeMirror; + +}))); From c6bb7833087156e77b9f2e779e87ad65cc9982f8 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Wed, 2 Dec 2020 01:47:51 -0800 Subject: [PATCH 1069/2376] Fix filesystem regression (#5176) * $:/config/OriginalTiddlerPaths if no filters match * fixed & docs updated * tested with tiddlywiki.files & tw.com edition * typos * originalpath to options, propigate isEditableFile * syntax cleanup --- boot/boot.js | 38 +++++++++++-------- core/modules/utils/filesystem.js | 20 ++++++++-- .../Customising Tiddler File Naming.tid | 13 ++++--- .../nodejs/tiddlywiki.files_Files.tid | 10 ++--- .../filesystem/filesystemadaptor.js | 7 ++-- 5 files changed, 54 insertions(+), 34 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index f6341dab0..c065cfb61 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1894,7 +1894,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) { }); }); if(isEditableFile) { - tiddlers.push({filepath: pathname, hasMetaFile: !!metadata && !isTiddlerFile, tiddlers: fileTiddlers}); + tiddlers.push({filepath: pathname, hasMetaFile: !!metadata && !isTiddlerFile, isEditableFile: true, tiddlers: fileTiddlers}); } else { tiddlers.push({tiddlers: fileTiddlers}); } @@ -2074,6 +2074,11 @@ $tw.loadWikiTiddlers = function(wikiPath,options) { } else { return null; } + // Save the path to the tiddlers folder for the filesystemadaptor + var config = wikiInfo.config || {}; + if($tw.boot.wikiPath == wikiPath) { + $tw.boot.wikiTiddlersPath = path.resolve($tw.boot.wikiPath,config["default-tiddler-location"] || $tw.config.wikiTiddlersSubDir); + } // Load any parent wikis if(wikiInfo.includeWikis) { parentPaths = parentPaths.slice(0); @@ -2107,27 +2112,30 @@ $tw.loadWikiTiddlers = function(wikiPath,options) { $tw.boot.files[tiddler.title] = { filepath: tiddlerFile.filepath, type: tiddlerFile.type, - hasMetaFile: tiddlerFile.hasMetaFile + hasMetaFile: tiddlerFile.hasMetaFile, + isEditableFile: config["retain-original-tiddler-path"] || tiddlerFile.isEditableFile || tiddlerFile.filepath.indexOf($tw.boot.wikiTiddlersPath) !== 0 }; }); } $tw.wiki.addTiddlers(tiddlerFile.tiddlers); }); - // Save the original tiddler file locations if requested - var config = wikiInfo.config || {}; - if(config["retain-original-tiddler-path"]) { - var output = {}, relativePath; + if ($tw.boot.wikiPath == wikiPath) { + // Save the original tiddler file locations if requested + var output = {}, relativePath, fileInfo; for(var title in $tw.boot.files) { - relativePath = path.relative(resolvedWikiPath,$tw.boot.files[title].filepath); - output[title] = - path.sep === "/" ? - relativePath : - relativePath.split(path.sep).join("/"); + fileInfo = $tw.boot.files[title]; + if(fileInfo.isEditableFile) { + relativePath = path.relative($tw.boot.wikiTiddlersPath,fileInfo.filepath); + output[title] = + path.sep === "/" ? + relativePath : + relativePath.split(path.sep).join("/"); + } + } + if(Object.keys(output).length > 0){ + $tw.wiki.addTiddler({title: "$:/config/OriginalTiddlerPaths", type: "application/json", text: JSON.stringify(output)}); } - $tw.wiki.addTiddler({title: "$:/config/OriginalTiddlerPaths", type: "application/json", text: JSON.stringify(output)}); } - // Save the path to the tiddlers folder for the filesystemadaptor - $tw.boot.wikiTiddlersPath = path.resolve($tw.boot.wikiPath,config["default-tiddler-location"] || $tw.config.wikiTiddlersSubDir); // Load any plugins within the wiki folder var wikiPluginsPath = path.resolve(wikiPath,$tw.config.wikiPluginsSubDir); if(fs.existsSync(wikiPluginsPath)) { @@ -2174,7 +2182,7 @@ $tw.loadTiddlersNode = function() { // Load any extra plugins $tw.utils.each($tw.boot.extraPlugins,function(name) { if(name.charAt(0) === "+") { // Relative path to plugin - var pluginFields = $tw.loadPluginFolder(name.substring(1));; + var pluginFields = $tw.loadPluginFolder(name.substring(1)); if(pluginFields) { $tw.wiki.addTiddler(pluginFields); } diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 7c77eb0d7..9ee2e8acd 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -206,12 +206,14 @@ Create a fileInfo object for saving a tiddler: filepath: the absolute path to the file containing the tiddler type: the type of the tiddler file on disk (NOT the type of the tiddler) hasMetaFile: true if the file also has a companion .meta file + isEditableFile: true if the tiddler was loaded via non-standard options & marked editable Options include: directory: absolute path of root directory to which we are saving pathFilters: optional array of filters to be used to generate the base path extFilters: optional array of filters to be used to generate the base path wiki: optional wiki for evaluating the pathFilters, fileInfo: an existing fileInfo to check against + originalpath: a preferred filepath if no pathFilters match */ exports.generateTiddlerFileInfo = function(tiddler,options) { var fileInfo = {}, metaExt; @@ -271,8 +273,13 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { directory: options.directory, pathFilters: options.pathFilters, wiki: options.wiki, - fileInfo: options.fileInfo + fileInfo: options.fileInfo, + originalpath: options.originalpath }); + // Propigate the isEditableFile flag + if(options.fileInfo) { + fileInfo.isEditableFile = options.fileInfo.isEditableFile || false; + } return fileInfo; }; @@ -313,6 +320,7 @@ exports.generateTiddlerFilepath = function(title,options) { var self = this, directory = options.directory || "", extension = options.extension || "", + originalpath = options.originalpath || "", filepath; // Check if any of the pathFilters applies if(options.pathFilters && options.wiki) { @@ -326,7 +334,11 @@ exports.generateTiddlerFilepath = function(title,options) { } }); } - if(!filepath) { + if(!filepath && originalpath !== "") { + //Use the originalpath without the extension + var ext = path.extname(originalpath); + filepath = originalpath.substring(0,originalpath.length - ext.length);; + } else if(!filepath) { filepath = title; // If the filepath already ends in the extension then remove it if(filepath.substring(filepath.length - extension.length) === extension) { @@ -367,8 +379,8 @@ exports.generateTiddlerFilepath = function(title,options) { } count++; } while(fs.existsSync(fullPath)); - //If the path does not start with the wiki directory, or if the last write failed - var encode = fullPath.indexOf($tw.boot.wikiPath) !== 0 || ((options.fileInfo || {writeError: false}).writeError == true); + //If the path does not start with the wikiPath directory or the wikiTiddlersPath directory, or if the last write failed + var encode = !(fullPath.indexOf($tw.boot.wikiPath) == 0 || fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0) || ((options.fileInfo || {writeError: false}).writeError == true); if(encode){ //encodeURIComponent() and then resolve to tiddler directory fullPath = path.resolve(directory, encodeURIComponent(fullPath)); diff --git a/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid b/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid index d13a6ce3b..3aef1351f 100644 --- a/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid +++ b/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid @@ -4,13 +4,15 @@ tags: [[TiddlyWiki on Node.js]] title: Customising Tiddler File Naming type: text/vnd.tiddlywiki -By default, a [[TiddlyWiki on Node.js]] instance using a [[wiki folder|TiddlyWikiFolders]] will create new tiddler files by using the sanitised and disambiguated title as filename and write them to the wiki folder's `tiddlers/` directory. The default file extension of `.tid` is used for tiddlers that are missing the `type` field, or for tiddlers of type "text/vnd.tiddlywiki". Tidders of other types are saved according to their IMIE types (defined at boot startup). Both the logical path (directory and file name) and the file extension can be customized independently by creating optional tiddlers: [[$:/config/FileSystemPaths]] and [[$:/config/FileSystemExtensions]]. +By default, a [[TiddlyWiki on Node.js]] instance using a [[wiki folder|TiddlyWikiFolders]] will create new tiddler files by using the sanitised and disambiguated title as filename and write them to the wiki folder's `tiddlers/` directory. This can be overridden by mapping a path in the wiki's tiddlywiki.info file, using a `default-tiddler-location` property in the `config` object. All filepath operations are relative to this `$tw.boot.wikiTiddlersPath` internal javacript variable. + +The default file extension of `.tid` is used for tiddlers that are missing the `type` field, or for tiddlers of type "text/vnd.tiddlywiki". Tidders of other types are saved according to their IMIE types (defined at boot startup). Both the logical path (directory and file name) and the file extension can be customized independently by creating optional tiddlers: [[$:/config/FileSystemPaths]] and [[$:/config/FileSystemExtensions]]. ! File System Paths The logical path can be customised by creating a tiddler [[$:/config/FileSystemPaths]] containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Newly created tiddlers are matched to each filter in turn, and the first output of the first filter to produce any output is taken as a logical path to be used for the tiddler file. Tiddlers are also tested against the [[$:/config/FileSystemPaths]] on every save to disk, and if the logical path has changed a new file is created and the old file deleted. -Tiddlers are limited to being written to the [[wiki folder|TiddlyWikiFolders]]. Any error saving a tiddler to disk, with a logical path that does not start with the wiki folder's path the most common error, causes the filepath to be encoded via Javascript's `encodeURIComponent()` method and the tiddler is saved as this file in the wiki folder's `tiddlers/` directory. +Tiddlers are limited to being written to the [[wiki folder|TiddlyWikiFolders]]. Any error saving a tiddler to disk, with a logical path that does not start with the wiki folder's path the most common error, causes the filepath to be encoded via Javascript's `encodeURIComponent()` method and the tiddler is saved as this file in the wiki folder's `$tw.boot.wikiTiddlersPath` directory. Logical paths do not include the file-on-disk's extension (see below), and they can use `/` or `\` as directory separator (when generating the physical path, this is replaced by the correct separator for the platform ~TiddlyWiki is running on). If none of the filters matches, the logical path is simply the title with all occurences of `/` replaced by `_` (for backwards compatibility). @@ -22,13 +24,12 @@ In both cases, the characters `<>~:"\|?*^` are replaced by `_` in order to guara [is[system]!has[draft.of]removeprefix[$:/]addprefix[_system/]] [is[draft]search-replace:g:regexp[/|\\],[_]addprefix[drafts/]] [tag[task]addprefix[mytasks/]] -[tag[externalnote]addprefix[../externalnotes/]] -[addprefix[wiki/]] +[!tag[externalnote]addprefix[wiki/]] ``` -This will store newly created system tiddlers that are not drafts of other tiddlers in `tiddlers/_system` (after stripping the `$:/` prefix). Next, all drafts have the path seperator characters in their titles replaced by "_" and are stored in `tiddlers/drafts/`. Then tiddlers tagged [[task]] are stored in a subdirectory `tiddlers/mytasks/`. Next, all tiddlers tagged "externalnote" will be written to `<wikiFolder>/tiddlers/../externalnotes/`, which resolves to `<wikiFolder>/externalnotes/` and places these tiddlers outside of the tiddler folder. Use [[tiddlywiki.files Files|tiddlywiki.files_Files]] to reimport these tiddlers when the wiki server is restarted. Finally, all tidders will match the final `[addprefix[wiki/]]` storing these in `<wikiFolder>/tiddlers/wiki/`. +This will store newly created system tiddlers that are not drafts of other tiddlers in `tiddlers/_system` (after stripping the `$:/` prefix). Next, all drafts have the path seperator characters in their titles replaced by "_" and are stored in `tiddlers/drafts/`. Then tiddlers tagged [[task]] are stored in a subdirectory `tiddlers/mytasks/`. Finally, all tidders not tagged with "externalnote" will match the final `[!tag[externalnote]addprefix[wiki/]]` storing these in `/wiki/`. In this example, tiddlers tagged with "externalnote" have been imported using [[tiddlywiki.files Files|tiddlywiki.files_Files]] with an "isEditableFile" flag set to true, causing the server to remember their original file path. -Because there was a filter match, any `/` or `\` in the tiddler title is mapped to a path separator. With the above filters, the non-system, non-draft tiddler `some/thing/entirely/new` (with no tags) will be saved to `<wikiFolder>/tiddlers/wiki/some/thing/entirely/new.tid` (ie, the file `new.tid` in a directory called `entirely/`). Thus, $:/config/FileSystemPaths itself will end up in `tiddlers/_system/config/FileSystemPaths.tid` or `tiddlers\_system\config\FileSystemPaths.tid`, depending on the platform. +Whenever a tiddler generates a $:/config/FileSystemPaths filter match, any `/` or `\` in the tiddler title is mapped to a path separator. With the above filters, the non-system, non-draft tiddler `some/thing/entirely/new` (with no tags) will be saved to `<wikiFolder>/tiddlers/wiki/some/thing/entirely/new.tid` (ie, the file `new.tid` in a directory called `entirely/`). Thus, $:/config/FileSystemPaths itself will end up in `tiddlers/_system/config/FileSystemPaths.tid` or `tiddlers\_system\config\FileSystemPaths.tid`, depending on the platform. ! File System Extensions diff --git a/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid b/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid index 389643175..b519b6bf7 100644 --- a/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid +++ b/editions/tw5.com/tiddlers/nodejs/tiddlywiki.files_Files.tid @@ -51,7 +51,7 @@ Directory specifications in the `directories` array may take the following forms ** ''path'' - (required) the absolute or relative path to the directory containing the tiddler files (relative paths are interpreted relative to the path of the `tiddlywiki.files` file). Note that the directory is not recursively searched; sub-directories are ignored ** ''filesRegExp'' - (optional) a [[regular expression|https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions]] that matches the filenames of the files that should be processed within the directory ** ''isTiddlerFile'' - (required) if `true`, the file will be treated as a [[tiddler file|TiddlerFiles]] and deserialised to extract the tiddlers. Otherwise, the raw content of the file is assigned to the `text` field without any parsing -** ''isEditableFile'' - (optional) if `true`, changes to the tiddler be saved back to the original file. The ''path'' of the current directory being read must be within the wiki's base directory, and a $:/config/FileSystemPath filter is required to add the correct logical path to the tiddler's title (see second **Example**). <<.from-version "5.1.23">> +** ''isEditableFile'' - (optional) if `true`, changes to the tiddler be saved back to the original file. The tiddler will be saved back to the original filepath as long as it does not generate a result from the $:/config/FileSystemPath filters, which will override the final filepath generated if a result is returned from a filter. <<.from-version "5.1.23">> ** ''fields'' - (required) an object containing values that override or customise the fields provided in the tiddler file (see above) Fields can be overridden for particular files by creating a file with the same name plus the suffix `.meta` -- see TiddlerFiles. @@ -102,7 +102,7 @@ This example retrieves all the files with the extension `.txt` from a folder spe * ''created'' - set to the creation date/time of the text file * ''modified'' - set to the modification date/time of the text file * ''type'' - set to `text/plain` -* ''tags'' - set to `[[note]] [[externalnote]]` (using array notation) +* ''tags'' - set to `[[note]] [[externalnote]] [[.txt]]` (using array notation) * ''text'' - not set, thus the content of the file is loaded as the text field ``` @@ -125,8 +125,8 @@ This example retrieves all the files with the extension `.txt` from a folder spe } ``` -This will load all text files in the `<wikiBase>/externalnotes/` directory into the wiki as individual tiddlers. These can be a collection of snippets in various markup-languages. Then, the `type` field of each of these tiddlers can be changed to match their languages For example, "text/vnd.tiddlywiki" for wikitext, or "text/markdown" for markdown files. Then, using $:/config/FileSystemPaths and $:/config/FileSystemExtentions tiddlers with the following lines we can cause any changes to these tiddlers to be saved back to the directory they started from, and as "*.txt" files with accompanying "*.txt.meta" files. These meta files will then over-ride any fields generated from the config `tiddlywiki.files` file (such as the tiddler's `type` field) when the server is restarted. +This will load all text files in the `../../externalnotes/` directory into the wiki as individual tiddlers. These can be a collection of snippets in various markup-languages. Then, the `type` field of each of these tiddlers can be changed to match their languages For example, "text/vnd.tiddlywiki" for wikitext, or "text/markdown" for markdown files. Then, using $:/config/FileSystemPaths and $:/config/FileSystemExtentions tiddlers with the following lines we can cause any changes to these tiddlers to be saved back to the directory they started from, and also as "*.txt" files with accompanying "*.txt.meta" files. These meta files will be generated as required, and will then over-ride any fields generated from the config `tiddlywiki.files` file (such as the tiddler's `type` field) when the server is restarted. -From the examples in [[Customising Tiddler File Naming]] we see that the `[tag[externalnote]addprefix[../externalnotes/]]` filter in the $:/config/FileSystemPaths tiddler catches all tiddlers tagged with `externalnotes` (that have not matched an earlier filter). These tiddlers have "../externalnotes/" appended to their titles to render the final logical path. As this path starts in the wiki's "tiddlers/" folder by default (one folder above the folder holding the above config file) it differes by one set of "../". +From the examples in [[Customising Tiddler File Naming]] we see that the final `[!tag[externalnote]addprefix[wiki/]]` filter in the $:/config/FileSystemPaths tiddler excludes all tiddlers tagged with `externalnotes` (that have not matched an earlier filter). These tiddlers have their filepath retrieved from the $:/config/OriginalTiddlerPaths generated upon boot startup. -Then, the `[tag[.txt]then[.txt]]` filter in the $:/config/FileSystemExtensions tiddler forces all these text files (which start with tag ".txt") to be saved back to disk as *.txt and accompanying *.txt.meta files (overriding the normal tiddler-type to file-type mapping). In this case, allowing the snippets of Tiddlywiki wikitext or markdown-text to be saved back to "text" *.txt files. \ No newline at end of file +Then, the `[tag[.txt]then[.txt]]` filter in the $:/config/FileSystemExtensions tiddler forces all these tiddlers to be saved back to disk as *.txt and accompanying *.txt.meta files (overriding the normal tiddler-type to file-type mapping). In this case, allowing the snippets of Tiddlywiki wikitext or markdown-text to be saved back to "text" *.txt files. \ No newline at end of file diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index fce2eaeaa..5cef917bf 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -52,16 +52,15 @@ The type is found by looking up the extension in $tw.config.fileExtensionInfo (e It is the responsibility of the filesystem adaptor to update this.boot.files for new files that are created. */ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { - // See if we've already got information about this file - var title = tiddler.fields.title, - newInfo, fileInfo = this.boot.files[title]; // Always generate a fileInfo object when this fuction is called + var title = tiddler.fields.title, newInfo; newInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ directory: this.boot.wikiTiddlersPath, pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"), extFilters: this.wiki.getTiddlerText("$:/config/FileSystemExtensions","").split("\n"), wiki: this.wiki, - fileInfo: fileInfo + fileInfo: this.boot.files[title], + originalpath: this.wiki.extractTiddlerDataItem("$:/config/OriginalTiddlerPaths",title, "") }); this.boot.files[title] = newInfo; callback(null,newInfo); From fc797f3722b44141606b8362e43c5517729d37a5 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 2 Dec 2020 13:21:02 +0100 Subject: [PATCH 1070/2376] Fix #5162 - tiddler opening position is incorrect, bug in navigator.js --- core/modules/widgets/navigator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index c44a24afb..2f8e2421e 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -128,7 +128,7 @@ NavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle NavigatorWidget.prototype.addToStory = function(title,fromTitle) { if(this.storyTitle) { - this.story.addToStory(title,fromTitle,this.storyTitle,{ + this.story.addToStory(title,fromTitle,{ openLinkFromInsideRiver: this.getAttribute("openLinkFromInsideRiver","top"), openLinkFromOutsideRiver: this.getAttribute("openLinkFromOutsideRiver","top") }); From a1ef66ec6ddaa4bd929ebe19bbb260dbf8b0fb4a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 2 Dec 2020 13:21:23 +0100 Subject: [PATCH 1071/2376] Better readability for codemirror linenumbers + CupertinoDark muted-foreground better contrast (#5164) * Update styles.tid * Update CupertinoDark.tid --- core/palettes/CupertinoDark.tid | 2 +- plugins/tiddlywiki/codemirror/styles.tid | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index 0880054ca..f97cab56d 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -42,7 +42,7 @@ modal-border: <<colour very-muted-foreground>> modal-footer-background: <<colour background>> modal-footer-border: <<colour background>> modal-header-border: <<colour very-muted-foreground>> -muted-foreground: #464646 +muted-foreground: #98989D notification-background: <<colour dropdown-background>> notification-border: <<colour dropdown-background>> page-background: #323232 diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index 135584b2a..4b57f664d 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -25,7 +25,7 @@ name: tiddlywiki .cm-s-tiddlywiki.CodeMirror, .cm-s-tiddlywiki .CodeMirror-gutters { background-color: <<colour tiddler-editor-background>>; color: <<colour foreground>>; } .cm-s-tiddlywiki .CodeMirror-gutters {background: <<colour tiddler-editor-background>>; border-right: 0px;} -.cm-s-tiddlywiki .CodeMirror-linenumber {color: <<colour primary>>;} +.cm-s-tiddlywiki .CodeMirror-linenumber {color: <<colour foreground>>;} .cm-s-tiddlywiki .CodeMirror-cursor { border-left: 2px solid <<colour foreground>>; } .cm-s-tiddlywiki div.CodeMirror-selected { background: <<colour selection-background>>; } .cm-s-tiddlywiki .CodeMirror-selectedtext, @@ -38,7 +38,7 @@ name: tiddlywiki .cm-s-tiddlywiki .CodeMirror-line > span > span::-moz-selection { background: <<colour selection-background>>; } .cm-s-tiddlywiki span.cm-comment { color: <<colour muted-foreground>>; font-style:italic; font-weight:normal; } .cm-s-tiddlywiki .CodeMirror-activeline-background, .cm-s-tiddlywiki .CodeMirror-activeline-gutter .CodeMirror-linenumber { background: <<colour background>>; } -.cm-s-tiddlywiki .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: <<colour background>>; color: <<colour foreground>>; } +.cm-s-tiddlywiki .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: <<colour primary>>; color: <<colour foreground>>; } .cm-s-tiddlywiki .CodeMirror-matchingbracket { background: <<colour primary>>; color:<<colour foreground>> !important; } .cm-s-tiddlywiki span.cm-matchhighlight { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} .cm-s-tiddlywiki span.cm-searching { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} From 9871c1a6a9b495c6b3532a672b491907b8697822 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 2 Dec 2020 17:54:36 +0100 Subject: [PATCH 1072/2376] Small tweak for codemirror selected-linenumber (#5181) --- plugins/tiddlywiki/codemirror/styles.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index 4b57f664d..2c44f8d1a 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -38,7 +38,7 @@ name: tiddlywiki .cm-s-tiddlywiki .CodeMirror-line > span > span::-moz-selection { background: <<colour selection-background>>; } .cm-s-tiddlywiki span.cm-comment { color: <<colour muted-foreground>>; font-style:italic; font-weight:normal; } .cm-s-tiddlywiki .CodeMirror-activeline-background, .cm-s-tiddlywiki .CodeMirror-activeline-gutter .CodeMirror-linenumber { background: <<colour background>>; } -.cm-s-tiddlywiki .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: <<colour primary>>; color: <<colour foreground>>; } +.cm-s-tiddlywiki .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: <<colour primary>>; color: <<colour background>>; } .cm-s-tiddlywiki .CodeMirror-matchingbracket { background: <<colour primary>>; color:<<colour foreground>> !important; } .cm-s-tiddlywiki span.cm-matchhighlight { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} .cm-s-tiddlywiki span.cm-searching { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} From f0eba7fdc629c805ab185373870e8841b16bd4ac Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 2 Dec 2020 17:55:37 +0100 Subject: [PATCH 1073/2376] Re-add minified codemirror, without minification bug (#5180) --- .../tiddlywiki/codemirror/files/codemirror.js | 9798 +---------------- 1 file changed, 1 insertion(+), 9797 deletions(-) diff --git a/plugins/tiddlywiki/codemirror/files/codemirror.js b/plugins/tiddlywiki/codemirror/files/codemirror.js index 0436a9968..cd4b00d89 100755 --- a/plugins/tiddlywiki/codemirror/files/codemirror.js +++ b/plugins/tiddlywiki/codemirror/files/codemirror.js @@ -1,9797 +1 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: https://codemirror.net/LICENSE - -// This is CodeMirror (https://codemirror.net), a code editor -// implemented in JavaScript on top of the browser's DOM. -// -// You can find some technical background for some of the code below -// at http://marijnhaverbeke.nl/blog/#cm-internals . - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = global || self, global.CodeMirror = factory()); -}(this, (function () { 'use strict'; - - // Kludges for bugs and behavior differences that can't be feature - // detected are enabled based on userAgent etc sniffing. - var userAgent = navigator.userAgent; - var platform = navigator.platform; - - var gecko = /gecko\/\d/i.test(userAgent); - var ie_upto10 = /MSIE \d/.test(userAgent); - var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); - var edge = /Edge\/(\d+)/.exec(userAgent); - var ie = ie_upto10 || ie_11up || edge; - var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); - var webkit = !edge && /WebKit\//.test(userAgent); - var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); - var chrome = !edge && /Chrome\//.test(userAgent); - var presto = /Opera\//.test(userAgent); - var safari = /Apple Computer/.test(navigator.vendor); - var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); - var phantom = /PhantomJS/.test(userAgent); - - var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); - var android = /Android/.test(userAgent); - // This is woefully incomplete. Suggestions for alternative methods welcome. - var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); - var mac = ios || /Mac/.test(platform); - var chromeOS = /\bCrOS\b/.test(userAgent); - var windows = /win/i.test(platform); - - var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); - if (presto_version) { presto_version = Number(presto_version[1]); } - if (presto_version && presto_version >= 15) { presto = false; webkit = true; } - // Some browsers use the wrong event properties to signal cmd/ctrl on OS X - var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); - var captureRightClick = gecko || (ie && ie_version >= 9); - - function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } - - var rmClass = function(node, cls) { - var current = node.className; - var match = classTest(cls).exec(current); - if (match) { - var after = current.slice(match.index + match[0].length); - node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); - } - }; - - function removeChildren(e) { - for (var count = e.childNodes.length; count > 0; --count) - { e.removeChild(e.firstChild); } - return e - } - - function removeChildrenAndAdd(parent, e) { - return removeChildren(parent).appendChild(e) - } - - function elt(tag, content, className, style) { - var e = document.createElement(tag); - if (className) { e.className = className; } - if (style) { e.style.cssText = style; } - if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } - else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } - return e - } - // wrapper for elt, which removes the elt from the accessibility tree - function eltP(tag, content, className, style) { - var e = elt(tag, content, className, style); - e.setAttribute("role", "presentation"); - return e - } - - var range; - if (document.createRange) { range = function(node, start, end, endNode) { - var r = document.createRange(); - r.setEnd(endNode || node, end); - r.setStart(node, start); - return r - }; } - else { range = function(node, start, end) { - var r = document.body.createTextRange(); - try { r.moveToElementText(node.parentNode); } - catch(e) { return r } - r.collapse(true); - r.moveEnd("character", end); - r.moveStart("character", start); - return r - }; } - - function contains(parent, child) { - if (child.nodeType == 3) // Android browser always returns false when child is a textnode - { child = child.parentNode; } - if (parent.contains) - { return parent.contains(child) } - do { - if (child.nodeType == 11) { child = child.host; } - if (child == parent) { return true } - } while (child = child.parentNode) - } - - function activeElt() { - // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. - // IE < 10 will throw when accessed while the page is loading or in an iframe. - // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. - var activeElement; - try { - activeElement = document.activeElement; - } catch(e) { - activeElement = document.body || null; - } - while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) - { activeElement = activeElement.shadowRoot.activeElement; } - return activeElement - } - - function addClass(node, cls) { - var current = node.className; - if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } - } - function joinClasses(a, b) { - var as = a.split(" "); - for (var i = 0; i < as.length; i++) - { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } - return b - } - - var selectInput = function(node) { node.select(); }; - if (ios) // Mobile Safari apparently has a bug where select() is broken. - { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } - else if (ie) // Suppress mysterious IE10 errors - { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } - - function bind(f) { - var args = Array.prototype.slice.call(arguments, 1); - return function(){return f.apply(null, args)} - } - - function copyObj(obj, target, overwrite) { - if (!target) { target = {}; } - for (var prop in obj) - { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) - { target[prop] = obj[prop]; } } - return target - } - - // Counts the column offset in a string, taking tabs into account. - // Used mostly to find indentation. - function countColumn(string, end, tabSize, startIndex, startValue) { - if (end == null) { - end = string.search(/[^\s\u00a0]/); - if (end == -1) { end = string.length; } - } - for (var i = startIndex || 0, n = startValue || 0;;) { - var nextTab = string.indexOf("\t", i); - if (nextTab < 0 || nextTab >= end) - { return n + (end - i) } - n += nextTab - i; - n += tabSize - (n % tabSize); - i = nextTab + 1; - } - } - - var Delayed = function() { - this.id = null; - this.f = null; - this.time = 0; - this.handler = bind(this.onTimeout, this); - }; - Delayed.prototype.onTimeout = function (self) { - self.id = 0; - if (self.time <= +new Date) { - self.f(); - } else { - setTimeout(self.handler, self.time - +new Date); - } - }; - Delayed.prototype.set = function (ms, f) { - this.f = f; - var time = +new Date + ms; - if (!this.id || time < this.time) { - clearTimeout(this.id); - this.id = setTimeout(this.handler, ms); - this.time = time; - } - }; - - function indexOf(array, elt) { - for (var i = 0; i < array.length; ++i) - { if (array[i] == elt) { return i } } - return -1 - } - - // Number of pixels added to scroller and sizer to hide scrollbar - var scrollerGap = 50; - - // Returned or thrown by various protocols to signal 'I'm not - // handling this'. - var Pass = {toString: function(){return "CodeMirror.Pass"}}; - - // Reused option objects for setSelection & friends - var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; - - // The inverse of countColumn -- find the offset that corresponds to - // a particular column. - function findColumn(string, goal, tabSize) { - for (var pos = 0, col = 0;;) { - var nextTab = string.indexOf("\t", pos); - if (nextTab == -1) { nextTab = string.length; } - var skipped = nextTab - pos; - if (nextTab == string.length || col + skipped >= goal) - { return pos + Math.min(skipped, goal - col) } - col += nextTab - pos; - col += tabSize - (col % tabSize); - pos = nextTab + 1; - if (col >= goal) { return pos } - } - } - - var spaceStrs = [""]; - function spaceStr(n) { - while (spaceStrs.length <= n) - { spaceStrs.push(lst(spaceStrs) + " "); } - return spaceStrs[n] - } - - function lst(arr) { return arr[arr.length-1] } - - function map(array, f) { - var out = []; - for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } - return out - } - - function insertSorted(array, value, score) { - var pos = 0, priority = score(value); - while (pos < array.length && score(array[pos]) <= priority) { pos++; } - array.splice(pos, 0, value); - } - - function nothing() {} - - function createObj(base, props) { - var inst; - if (Object.create) { - inst = Object.create(base); - } else { - nothing.prototype = base; - inst = new nothing(); - } - if (props) { copyObj(props, inst); } - return inst - } - - var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; - function isWordCharBasic(ch) { - return /\w/.test(ch) || ch > "\x80" && - (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) - } - function isWordChar(ch, helper) { - if (!helper) { return isWordCharBasic(ch) } - if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } - return helper.test(ch) - } - - function isEmpty(obj) { - for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } - return true - } - - // Extending unicode characters. A series of a non-extending char + - // any number of extending chars is treated as a single unit as far - // as editing and measuring is concerned. This is not fully correct, - // since some scripts/fonts/browsers also treat other configurations - // of code points as a group. - var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; - function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } - - // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. - function skipExtendingChars(str, pos, dir) { - while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } - return pos - } - - // Returns the value from the range [`from`; `to`] that satisfies - // `pred` and is closest to `from`. Assumes that at least `to` - // satisfies `pred`. Supports `from` being greater than `to`. - function findFirst(pred, from, to) { - // At any point we are certain `to` satisfies `pred`, don't know - // whether `from` does. - var dir = from > to ? -1 : 1; - for (;;) { - if (from == to) { return from } - var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); - if (mid == from) { return pred(mid) ? from : to } - if (pred(mid)) { to = mid; } - else { from = mid + dir; } - } - } - - // BIDI HELPERS - - function iterateBidiSections(order, from, to, f) { - if (!order) { return f(from, to, "ltr", 0) } - var found = false; - for (var i = 0; i < order.length; ++i) { - var part = order[i]; - if (part.from < to && part.to > from || from == to && part.to == from) { - f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); - found = true; - } - } - if (!found) { f(from, to, "ltr"); } - } - - var bidiOther = null; - function getBidiPartAt(order, ch, sticky) { - var found; - bidiOther = null; - for (var i = 0; i < order.length; ++i) { - var cur = order[i]; - if (cur.from < ch && cur.to > ch) { return i } - if (cur.to == ch) { - if (cur.from != cur.to && sticky == "before") { found = i; } - else { bidiOther = i; } - } - if (cur.from == ch) { - if (cur.from != cur.to && sticky != "before") { found = i; } - else { bidiOther = i; } - } - } - return found != null ? found : bidiOther - } - - // Bidirectional ordering algorithm - // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm - // that this (partially) implements. - - // One-char codes used for character types: - // L (L): Left-to-Right - // R (R): Right-to-Left - // r (AL): Right-to-Left Arabic - // 1 (EN): European Number - // + (ES): European Number Separator - // % (ET): European Number Terminator - // n (AN): Arabic Number - // , (CS): Common Number Separator - // m (NSM): Non-Spacing Mark - // b (BN): Boundary Neutral - // s (B): Paragraph Separator - // t (S): Segment Separator - // w (WS): Whitespace - // N (ON): Other Neutrals - - // Returns null if characters are ordered as they appear - // (left-to-right), or an array of sections ({from, to, level} - // objects) in the order in which they occur visually. - var bidiOrdering = (function() { - // Character types for codepoints 0 to 0xff - var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; - // Character types for codepoints 0x600 to 0x6f9 - var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; - function charType(code) { - if (code <= 0xf7) { return lowTypes.charAt(code) } - else if (0x590 <= code && code <= 0x5f4) { return "R" } - else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } - else if (0x6ee <= code && code <= 0x8ac) { return "r" } - else if (0x2000 <= code && code <= 0x200b) { return "w" } - else if (code == 0x200c) { return "b" } - else { return "L" } - } - - var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; - var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; - - function BidiSpan(level, from, to) { - this.level = level; - this.from = from; this.to = to; - } - - return function(str, direction) { - var outerType = direction == "ltr" ? "L" : "R"; - - if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } - var len = str.length, types = []; - for (var i = 0; i < len; ++i) - { types.push(charType(str.charCodeAt(i))); } - - // W1. Examine each non-spacing mark (NSM) in the level run, and - // change the type of the NSM to the type of the previous - // character. If the NSM is at the start of the level run, it will - // get the type of sor. - for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { - var type = types[i$1]; - if (type == "m") { types[i$1] = prev; } - else { prev = type; } - } - - // W2. Search backwards from each instance of a European number - // until the first strong type (R, L, AL, or sor) is found. If an - // AL is found, change the type of the European number to Arabic - // number. - // W3. Change all ALs to R. - for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { - var type$1 = types[i$2]; - if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } - else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } - } - - // W4. A single European separator between two European numbers - // changes to a European number. A single common separator between - // two numbers of the same type changes to that type. - for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { - var type$2 = types[i$3]; - if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } - else if (type$2 == "," && prev$1 == types[i$3+1] && - (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } - prev$1 = type$2; - } - - // W5. A sequence of European terminators adjacent to European - // numbers changes to all European numbers. - // W6. Otherwise, separators and terminators change to Other - // Neutral. - for (var i$4 = 0; i$4 < len; ++i$4) { - var type$3 = types[i$4]; - if (type$3 == ",") { types[i$4] = "N"; } - else if (type$3 == "%") { - var end = (void 0); - for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} - var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; - for (var j = i$4; j < end; ++j) { types[j] = replace; } - i$4 = end - 1; - } - } - - // W7. Search backwards from each instance of a European number - // until the first strong type (R, L, or sor) is found. If an L is - // found, then change the type of the European number to L. - for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { - var type$4 = types[i$5]; - if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } - else if (isStrong.test(type$4)) { cur$1 = type$4; } - } - - // N1. A sequence of neutrals takes the direction of the - // surrounding strong text if the text on both sides has the same - // direction. European and Arabic numbers act as if they were R in - // terms of their influence on neutrals. Start-of-level-run (sor) - // and end-of-level-run (eor) are used at level run boundaries. - // N2. Any remaining neutrals take the embedding direction. - for (var i$6 = 0; i$6 < len; ++i$6) { - if (isNeutral.test(types[i$6])) { - var end$1 = (void 0); - for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} - var before = (i$6 ? types[i$6-1] : outerType) == "L"; - var after = (end$1 < len ? types[end$1] : outerType) == "L"; - var replace$1 = before == after ? (before ? "L" : "R") : outerType; - for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } - i$6 = end$1 - 1; - } - } - - // Here we depart from the documented algorithm, in order to avoid - // building up an actual levels array. Since there are only three - // levels (0, 1, 2) in an implementation that doesn't take - // explicit embedding into account, we can build up the order on - // the fly, without following the level-based algorithm. - var order = [], m; - for (var i$7 = 0; i$7 < len;) { - if (countsAsLeft.test(types[i$7])) { - var start = i$7; - for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} - order.push(new BidiSpan(0, start, i$7)); - } else { - var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0; - for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} - for (var j$2 = pos; j$2 < i$7;) { - if (countsAsNum.test(types[j$2])) { - if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; } - var nstart = j$2; - for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} - order.splice(at, 0, new BidiSpan(2, nstart, j$2)); - at += isRTL; - pos = j$2; - } else { ++j$2; } - } - if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } - } - } - if (direction == "ltr") { - if (order[0].level == 1 && (m = str.match(/^\s+/))) { - order[0].from = m[0].length; - order.unshift(new BidiSpan(0, 0, m[0].length)); - } - if (lst(order).level == 1 && (m = str.match(/\s+$/))) { - lst(order).to -= m[0].length; - order.push(new BidiSpan(0, len - m[0].length, len)); - } - } - - return direction == "rtl" ? order.reverse() : order - } - })(); - - // Get the bidi ordering for the given line (and cache it). Returns - // false for lines that are fully left-to-right, and an array of - // BidiSpan objects otherwise. - function getOrder(line, direction) { - var order = line.order; - if (order == null) { order = line.order = bidiOrdering(line.text, direction); } - return order - } - - // EVENT HANDLING - - // Lightweight event framework. on/off also work on DOM nodes, - // registering native DOM handlers. - - var noHandlers = []; - - var on = function(emitter, type, f) { - if (emitter.addEventListener) { - emitter.addEventListener(type, f, false); - } else if (emitter.attachEvent) { - emitter.attachEvent("on" + type, f); - } else { - var map = emitter._handlers || (emitter._handlers = {}); - map[type] = (map[type] || noHandlers).concat(f); - } - }; - - function getHandlers(emitter, type) { - return emitter._handlers && emitter._handlers[type] || noHandlers - } - - function off(emitter, type, f) { - if (emitter.removeEventListener) { - emitter.removeEventListener(type, f, false); - } else if (emitter.detachEvent) { - emitter.detachEvent("on" + type, f); - } else { - var map = emitter._handlers, arr = map && map[type]; - if (arr) { - var index = indexOf(arr, f); - if (index > -1) - { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } - } - } - } - - function signal(emitter, type /*, values...*/) { - var handlers = getHandlers(emitter, type); - if (!handlers.length) { return } - var args = Array.prototype.slice.call(arguments, 2); - for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } - } - - // The DOM events that CodeMirror handles can be overridden by - // registering a (non-DOM) handler on the editor for the event name, - // and preventDefault-ing the event in that handler. - function signalDOMEvent(cm, e, override) { - if (typeof e == "string") - { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } - signal(cm, override || e.type, cm, e); - return e_defaultPrevented(e) || e.codemirrorIgnore - } - - function signalCursorActivity(cm) { - var arr = cm._handlers && cm._handlers.cursorActivity; - if (!arr) { return } - var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); - for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) - { set.push(arr[i]); } } - } - - function hasHandler(emitter, type) { - return getHandlers(emitter, type).length > 0 - } - - // Add on and off methods to a constructor's prototype, to make - // registering events on such objects more convenient. - function eventMixin(ctor) { - ctor.prototype.on = function(type, f) {on(this, type, f);}; - ctor.prototype.off = function(type, f) {off(this, type, f);}; - } - - // Due to the fact that we still support jurassic IE versions, some - // compatibility wrappers are needed. - - function e_preventDefault(e) { - if (e.preventDefault) { e.preventDefault(); } - else { e.returnValue = false; } - } - function e_stopPropagation(e) { - if (e.stopPropagation) { e.stopPropagation(); } - else { e.cancelBubble = true; } - } - function e_defaultPrevented(e) { - return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false - } - function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} - - function e_target(e) {return e.target || e.srcElement} - function e_button(e) { - var b = e.which; - if (b == null) { - if (e.button & 1) { b = 1; } - else if (e.button & 2) { b = 3; } - else if (e.button & 4) { b = 2; } - } - if (mac && e.ctrlKey && b == 1) { b = 3; } - return b - } - - // Detect drag-and-drop - var dragAndDrop = function() { - // There is *some* kind of drag-and-drop support in IE6-8, but I - // couldn't get it to work yet. - if (ie && ie_version < 9) { return false } - var div = elt('div'); - return "draggable" in div || "dragDrop" in div - }(); - - var zwspSupported; - function zeroWidthElement(measure) { - if (zwspSupported == null) { - var test = elt("span", "\u200b"); - removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); - if (measure.firstChild.offsetHeight != 0) - { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } - } - var node = zwspSupported ? elt("span", "\u200b") : - elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); - node.setAttribute("cm-text", ""); - return node - } - - // Feature-detect IE's crummy client rect reporting for bidi text - var badBidiRects; - function hasBadBidiRects(measure) { - if (badBidiRects != null) { return badBidiRects } - var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); - var r0 = range(txt, 0, 1).getBoundingClientRect(); - var r1 = range(txt, 1, 2).getBoundingClientRect(); - removeChildren(measure); - if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) - return badBidiRects = (r1.right - r0.right < 3) - } - - // See if "".split is the broken IE version, if so, provide an - // alternative way to split lines. - var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { - var pos = 0, result = [], l = string.length; - while (pos <= l) { - var nl = string.indexOf("\n", pos); - if (nl == -1) { nl = string.length; } - var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); - var rt = line.indexOf("\r"); - if (rt != -1) { - result.push(line.slice(0, rt)); - pos += rt + 1; - } else { - result.push(line); - pos = nl + 1; - } - } - return result - } : function (string) { return string.split(/\r\n?|\n/); }; - - var hasSelection = window.getSelection ? function (te) { - try { return te.selectionStart != te.selectionEnd } - catch(e) { return false } - } : function (te) { - var range; - try {range = te.ownerDocument.selection.createRange();} - catch(e) {} - if (!range || range.parentElement() != te) { return false } - return range.compareEndPoints("StartToEnd", range) != 0 - }; - - var hasCopyEvent = (function () { - var e = elt("div"); - if ("oncopy" in e) { return true } - e.setAttribute("oncopy", "return;"); - return typeof e.oncopy == "function" - })(); - - var badZoomedRects = null; - function hasBadZoomedRects(measure) { - if (badZoomedRects != null) { return badZoomedRects } - var node = removeChildrenAndAdd(measure, elt("span", "x")); - var normal = node.getBoundingClientRect(); - var fromRange = range(node, 0, 1).getBoundingClientRect(); - return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 - } - - // Known modes, by name and by MIME - var modes = {}, mimeModes = {}; - - // Extra arguments are stored as the mode's dependencies, which is - // used by (legacy) mechanisms like loadmode.js to automatically - // load a mode. (Preferred mechanism is the require/define calls.) - function defineMode(name, mode) { - if (arguments.length > 2) - { mode.dependencies = Array.prototype.slice.call(arguments, 2); } - modes[name] = mode; - } - - function defineMIME(mime, spec) { - mimeModes[mime] = spec; - } - - // Given a MIME type, a {name, ...options} config object, or a name - // string, return a mode config object. - function resolveMode(spec) { - if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { - spec = mimeModes[spec]; - } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { - var found = mimeModes[spec.name]; - if (typeof found == "string") { found = {name: found}; } - spec = createObj(found, spec); - spec.name = found.name; - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { - return resolveMode("application/xml") - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { - return resolveMode("application/json") - } - if (typeof spec == "string") { return {name: spec} } - else { return spec || {name: "null"} } - } - - // Given a mode spec (anything that resolveMode accepts), find and - // initialize an actual mode object. - function getMode(options, spec) { - spec = resolveMode(spec); - var mfactory = modes[spec.name]; - if (!mfactory) { return getMode(options, "text/plain") } - var modeObj = mfactory(options, spec); - if (modeExtensions.hasOwnProperty(spec.name)) { - var exts = modeExtensions[spec.name]; - for (var prop in exts) { - if (!exts.hasOwnProperty(prop)) { continue } - if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } - modeObj[prop] = exts[prop]; - } - } - modeObj.name = spec.name; - if (spec.helperType) { modeObj.helperType = spec.helperType; } - if (spec.modeProps) { for (var prop$1 in spec.modeProps) - { modeObj[prop$1] = spec.modeProps[prop$1]; } } - - return modeObj - } - - // This can be used to attach properties to mode objects from - // outside the actual mode definition. - var modeExtensions = {}; - function extendMode(mode, properties) { - var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); - copyObj(properties, exts); - } - - function copyState(mode, state) { - if (state === true) { return state } - if (mode.copyState) { return mode.copyState(state) } - var nstate = {}; - for (var n in state) { - var val = state[n]; - if (val instanceof Array) { val = val.concat([]); } - nstate[n] = val; - } - return nstate - } - - // Given a mode and a state (for that mode), find the inner mode and - // state at the position that the state refers to. - function innerMode(mode, state) { - var info; - while (mode.innerMode) { - info = mode.innerMode(state); - if (!info || info.mode == mode) { break } - state = info.state; - mode = info.mode; - } - return info || {mode: mode, state: state} - } - - function startState(mode, a1, a2) { - return mode.startState ? mode.startState(a1, a2) : true - } - - // STRING STREAM - - // Fed to the mode parsers, provides helper functions to make - // parsers more succinct. - - var StringStream = function(string, tabSize, lineOracle) { - this.pos = this.start = 0; - this.string = string; - this.tabSize = tabSize || 8; - this.lastColumnPos = this.lastColumnValue = 0; - this.lineStart = 0; - this.lineOracle = lineOracle; - }; - - StringStream.prototype.eol = function () {return this.pos >= this.string.length}; - StringStream.prototype.sol = function () {return this.pos == this.lineStart}; - StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; - StringStream.prototype.next = function () { - if (this.pos < this.string.length) - { return this.string.charAt(this.pos++) } - }; - StringStream.prototype.eat = function (match) { - var ch = this.string.charAt(this.pos); - var ok; - if (typeof match == "string") { ok = ch == match; } - else { ok = ch && (match.test ? match.test(ch) : match(ch)); } - if (ok) {++this.pos; return ch} - }; - StringStream.prototype.eatWhile = function (match) { - var start = this.pos; - while (this.eat(match)){} - return this.pos > start - }; - StringStream.prototype.eatSpace = function () { - var start = this.pos; - while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } - return this.pos > start - }; - StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; - StringStream.prototype.skipTo = function (ch) { - var found = this.string.indexOf(ch, this.pos); - if (found > -1) {this.pos = found; return true} - }; - StringStream.prototype.backUp = function (n) {this.pos -= n;}; - StringStream.prototype.column = function () { - if (this.lastColumnPos < this.start) { - this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); - this.lastColumnPos = this.start; - } - return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) - }; - StringStream.prototype.indentation = function () { - return countColumn(this.string, null, this.tabSize) - - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) - }; - StringStream.prototype.match = function (pattern, consume, caseInsensitive) { - if (typeof pattern == "string") { - var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; - var substr = this.string.substr(this.pos, pattern.length); - if (cased(substr) == cased(pattern)) { - if (consume !== false) { this.pos += pattern.length; } - return true - } - } else { - var match = this.string.slice(this.pos).match(pattern); - if (match && match.index > 0) { return null } - if (match && consume !== false) { this.pos += match[0].length; } - return match - } - }; - StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; - StringStream.prototype.hideFirstChars = function (n, inner) { - this.lineStart += n; - try { return inner() } - finally { this.lineStart -= n; } - }; - StringStream.prototype.lookAhead = function (n) { - var oracle = this.lineOracle; - return oracle && oracle.lookAhead(n) - }; - StringStream.prototype.baseToken = function () { - var oracle = this.lineOracle; - return oracle && oracle.baseToken(this.pos) - }; - - // Find the line object corresponding to the given line number. - function getLine(doc, n) { - n -= doc.first; - if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } - var chunk = doc; - while (!chunk.lines) { - for (var i = 0;; ++i) { - var child = chunk.children[i], sz = child.chunkSize(); - if (n < sz) { chunk = child; break } - n -= sz; - } - } - return chunk.lines[n] - } - - // Get the part of a document between two positions, as an array of - // strings. - function getBetween(doc, start, end) { - var out = [], n = start.line; - doc.iter(start.line, end.line + 1, function (line) { - var text = line.text; - if (n == end.line) { text = text.slice(0, end.ch); } - if (n == start.line) { text = text.slice(start.ch); } - out.push(text); - ++n; - }); - return out - } - // Get the lines between from and to, as array of strings. - function getLines(doc, from, to) { - var out = []; - doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value - return out - } - - // Update the height of a line, propagating the height change - // upwards to parent nodes. - function updateLineHeight(line, height) { - var diff = height - line.height; - if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } - } - - // Given a line object, find its line number by walking up through - // its parent links. - function lineNo(line) { - if (line.parent == null) { return null } - var cur = line.parent, no = indexOf(cur.lines, line); - for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { - for (var i = 0;; ++i) { - if (chunk.children[i] == cur) { break } - no += chunk.children[i].chunkSize(); - } - } - return no + cur.first - } - - // Find the line at the given vertical position, using the height - // information in the document tree. - function lineAtHeight(chunk, h) { - var n = chunk.first; - outer: do { - for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { - var child = chunk.children[i$1], ch = child.height; - if (h < ch) { chunk = child; continue outer } - h -= ch; - n += child.chunkSize(); - } - return n - } while (!chunk.lines) - var i = 0; - for (; i < chunk.lines.length; ++i) { - var line = chunk.lines[i], lh = line.height; - if (h < lh) { break } - h -= lh; - } - return n + i - } - - function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} - - function lineNumberFor(options, i) { - return String(options.lineNumberFormatter(i + options.firstLineNumber)) - } - - // A Pos instance represents a position within the text. - function Pos(line, ch, sticky) { - if ( sticky === void 0 ) sticky = null; - - if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } - this.line = line; - this.ch = ch; - this.sticky = sticky; - } - - // Compare two positions, return 0 if they are the same, a negative - // number when a is less, and a positive number otherwise. - function cmp(a, b) { return a.line - b.line || a.ch - b.ch } - - function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } - - function copyPos(x) {return Pos(x.line, x.ch)} - function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } - function minPos(a, b) { return cmp(a, b) < 0 ? a : b } - - // Most of the external API clips given positions to make sure they - // actually exist within the document. - function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} - function clipPos(doc, pos) { - if (pos.line < doc.first) { return Pos(doc.first, 0) } - var last = doc.first + doc.size - 1; - if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } - return clipToLen(pos, getLine(doc, pos.line).text.length) - } - function clipToLen(pos, linelen) { - var ch = pos.ch; - if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } - else if (ch < 0) { return Pos(pos.line, 0) } - else { return pos } - } - function clipPosArray(doc, array) { - var out = []; - for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } - return out - } - - var SavedContext = function(state, lookAhead) { - this.state = state; - this.lookAhead = lookAhead; - }; - - var Context = function(doc, state, line, lookAhead) { - this.state = state; - this.doc = doc; - this.line = line; - this.maxLookAhead = lookAhead || 0; - this.baseTokens = null; - this.baseTokenPos = 1; - }; - - Context.prototype.lookAhead = function (n) { - var line = this.doc.getLine(this.line + n); - if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } - return line - }; - - Context.prototype.baseToken = function (n) { - if (!this.baseTokens) { return null } - while (this.baseTokens[this.baseTokenPos] <= n) - { this.baseTokenPos += 2; } - var type = this.baseTokens[this.baseTokenPos + 1]; - return {type: type && type.replace(/( |^)overlay .*/, ""), - size: this.baseTokens[this.baseTokenPos] - n} - }; - - Context.prototype.nextLine = function () { - this.line++; - if (this.maxLookAhead > 0) { this.maxLookAhead--; } - }; - - Context.fromSaved = function (doc, saved, line) { - if (saved instanceof SavedContext) - { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } - else - { return new Context(doc, copyState(doc.mode, saved), line) } - }; - - Context.prototype.save = function (copy) { - var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; - return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state - }; - - - // Compute a style array (an array starting with a mode generation - // -- for invalidation -- followed by pairs of end positions and - // style strings), which is used to highlight the tokens on the - // line. - function highlightLine(cm, line, context, forceToEnd) { - // A styles array always starts with a number identifying the - // mode/overlays that it is based on (for easy invalidation). - var st = [cm.state.modeGen], lineClasses = {}; - // Compute the base array of styles - runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, - lineClasses, forceToEnd); - var state = context.state; - - // Run overlays, adjust style array. - var loop = function ( o ) { - context.baseTokens = st; - var overlay = cm.state.overlays[o], i = 1, at = 0; - context.state = true; - runMode(cm, line.text, overlay.mode, context, function (end, style) { - var start = i; - // Ensure there's a token end at the current position, and that i points at it - while (at < end) { - var i_end = st[i]; - if (i_end > end) - { st.splice(i, 1, end, st[i+1], i_end); } - i += 2; - at = Math.min(end, i_end); - } - if (!style) { return } - if (overlay.opaque) { - st.splice(start, i - start, end, "overlay " + style); - i = start + 2; - } else { - for (; start < i; start += 2) { - var cur = st[start+1]; - st[start+1] = (cur ? cur + " " : "") + "overlay " + style; - } - } - }, lineClasses); - context.state = state; - context.baseTokens = null; - context.baseTokenPos = 1; - }; - - for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); - - return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} - } - - function getLineStyles(cm, line, updateFrontier) { - if (!line.styles || line.styles[0] != cm.state.modeGen) { - var context = getContextBefore(cm, lineNo(line)); - var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); - var result = highlightLine(cm, line, context); - if (resetState) { context.state = resetState; } - line.stateAfter = context.save(!resetState); - line.styles = result.styles; - if (result.classes) { line.styleClasses = result.classes; } - else if (line.styleClasses) { line.styleClasses = null; } - if (updateFrontier === cm.doc.highlightFrontier) - { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } - } - return line.styles - } - - function getContextBefore(cm, n, precise) { - var doc = cm.doc, display = cm.display; - if (!doc.mode.startState) { return new Context(doc, true, n) } - var start = findStartLine(cm, n, precise); - var saved = start > doc.first && getLine(doc, start - 1).stateAfter; - var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); - - doc.iter(start, n, function (line) { - processLine(cm, line.text, context); - var pos = context.line; - line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; - context.nextLine(); - }); - if (precise) { doc.modeFrontier = context.line; } - return context - } - - // Lightweight form of highlight -- proceed over this line and - // update state, but don't save a style array. Used for lines that - // aren't currently visible. - function processLine(cm, text, context, startAt) { - var mode = cm.doc.mode; - var stream = new StringStream(text, cm.options.tabSize, context); - stream.start = stream.pos = startAt || 0; - if (text == "") { callBlankLine(mode, context.state); } - while (!stream.eol()) { - readToken(mode, stream, context.state); - stream.start = stream.pos; - } - } - - function callBlankLine(mode, state) { - if (mode.blankLine) { return mode.blankLine(state) } - if (!mode.innerMode) { return } - var inner = innerMode(mode, state); - if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } - } - - function readToken(mode, stream, state, inner) { - for (var i = 0; i < 10; i++) { - if (inner) { inner[0] = innerMode(mode, state).mode; } - var style = mode.token(stream, state); - if (stream.pos > stream.start) { return style } - } - throw new Error("Mode " + mode.name + " failed to advance stream.") - } - - var Token = function(stream, type, state) { - this.start = stream.start; this.end = stream.pos; - this.string = stream.current(); - this.type = type || null; - this.state = state; - }; - - // Utility for getTokenAt and getLineTokens - function takeToken(cm, pos, precise, asArray) { - var doc = cm.doc, mode = doc.mode, style; - pos = clipPos(doc, pos); - var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); - var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; - if (asArray) { tokens = []; } - while ((asArray || stream.pos < pos.ch) && !stream.eol()) { - stream.start = stream.pos; - style = readToken(mode, stream, context.state); - if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } - } - return asArray ? tokens : new Token(stream, style, context.state) - } - - function extractLineClasses(type, output) { - if (type) { for (;;) { - var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); - if (!lineClass) { break } - type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); - var prop = lineClass[1] ? "bgClass" : "textClass"; - if (output[prop] == null) - { output[prop] = lineClass[2]; } - else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop])) - { output[prop] += " " + lineClass[2]; } - } } - return type - } - - // Run the given mode's parser over a line, calling f for each token. - function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { - var flattenSpans = mode.flattenSpans; - if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } - var curStart = 0, curStyle = null; - var stream = new StringStream(text, cm.options.tabSize, context), style; - var inner = cm.options.addModeClass && [null]; - if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } - while (!stream.eol()) { - if (stream.pos > cm.options.maxHighlightLength) { - flattenSpans = false; - if (forceToEnd) { processLine(cm, text, context, stream.pos); } - stream.pos = text.length; - style = null; - } else { - style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); - } - if (inner) { - var mName = inner[0].name; - if (mName) { style = "m-" + (style ? mName + " " + style : mName); } - } - if (!flattenSpans || curStyle != style) { - while (curStart < stream.start) { - curStart = Math.min(stream.start, curStart + 5000); - f(curStart, curStyle); - } - curStyle = style; - } - stream.start = stream.pos; - } - while (curStart < stream.pos) { - // Webkit seems to refuse to render text nodes longer than 57444 - // characters, and returns inaccurate measurements in nodes - // starting around 5000 chars. - var pos = Math.min(stream.pos, curStart + 5000); - f(pos, curStyle); - curStart = pos; - } - } - - // Finds the line to start with when starting a parse. Tries to - // find a line with a stateAfter, so that it can start with a - // valid state. If that fails, it returns the line with the - // smallest indentation, which tends to need the least context to - // parse correctly. - function findStartLine(cm, n, precise) { - var minindent, minline, doc = cm.doc; - var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); - for (var search = n; search > lim; --search) { - if (search <= doc.first) { return doc.first } - var line = getLine(doc, search - 1), after = line.stateAfter; - if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) - { return search } - var indented = countColumn(line.text, null, cm.options.tabSize); - if (minline == null || minindent > indented) { - minline = search - 1; - minindent = indented; - } - } - return minline - } - - function retreatFrontier(doc, n) { - doc.modeFrontier = Math.min(doc.modeFrontier, n); - if (doc.highlightFrontier < n - 10) { return } - var start = doc.first; - for (var line = n - 1; line > start; line--) { - var saved = getLine(doc, line).stateAfter; - // change is on 3 - // state on line 1 looked ahead 2 -- so saw 3 - // test 1 + 2 < 3 should cover this - if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { - start = line + 1; - break - } - } - doc.highlightFrontier = Math.min(doc.highlightFrontier, start); - } - - // Optimize some code when these features are not used. - var sawReadOnlySpans = false, sawCollapsedSpans = false; - - function seeReadOnlySpans() { - sawReadOnlySpans = true; - } - - function seeCollapsedSpans() { - sawCollapsedSpans = true; - } - - // TEXTMARKER SPANS - - function MarkedSpan(marker, from, to) { - this.marker = marker; - this.from = from; this.to = to; - } - - // Search an array of spans for a span matching the given marker. - function getMarkedSpanFor(spans, marker) { - if (spans) { for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if (span.marker == marker) { return span } - } } - } - // Remove a span from an array, returning undefined if no spans are - // left (we don't store arrays for lines without spans). - function removeMarkedSpan(spans, span) { - var r; - for (var i = 0; i < spans.length; ++i) - { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } - return r - } - // Add a span to a line. - function addMarkedSpan(line, span) { - line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; - span.marker.attachLine(line); - } - - // Used for the algorithm that adjusts markers for a change in the - // document. These functions cut an array of spans at a given - // character position, returning an array of remaining chunks (or - // undefined if nothing remains). - function markedSpansBefore(old, startCh, isInsert) { - var nw; - if (old) { for (var i = 0; i < old.length; ++i) { - var span = old[i], marker = span.marker; - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); - if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) - ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); - } - } } - return nw - } - function markedSpansAfter(old, endCh, isInsert) { - var nw; - if (old) { for (var i = 0; i < old.length; ++i) { - var span = old[i], marker = span.marker; - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); - if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) - ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, - span.to == null ? null : span.to - endCh)); - } - } } - return nw - } - - // Given a change object, compute the new set of marker spans that - // cover the line in which the change took place. Removes spans - // entirely within the change, reconnects spans belonging to the - // same marker that appear on both sides of the change, and cuts off - // spans partially within the change. Returns an array of span - // arrays with one element for each line in (after) the change. - function stretchSpansOverChange(doc, change) { - if (change.full) { return null } - var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; - var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; - if (!oldFirst && !oldLast) { return null } - - var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; - // Get the spans that 'stick out' on both sides - var first = markedSpansBefore(oldFirst, startCh, isInsert); - var last = markedSpansAfter(oldLast, endCh, isInsert); - - // Next, merge those two ends - var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); - if (first) { - // Fix up .to properties of first - for (var i = 0; i < first.length; ++i) { - var span = first[i]; - if (span.to == null) { - var found = getMarkedSpanFor(last, span.marker); - if (!found) { span.to = startCh; } - else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } - } - } - } - if (last) { - // Fix up .from in last (or move them into first in case of sameLine) - for (var i$1 = 0; i$1 < last.length; ++i$1) { - var span$1 = last[i$1]; - if (span$1.to != null) { span$1.to += offset; } - if (span$1.from == null) { - var found$1 = getMarkedSpanFor(first, span$1.marker); - if (!found$1) { - span$1.from = offset; - if (sameLine) { (first || (first = [])).push(span$1); } - } - } else { - span$1.from += offset; - if (sameLine) { (first || (first = [])).push(span$1); } - } - } - } - // Make sure we didn't create any zero-length spans - if (first) { first = clearEmptySpans(first); } - if (last && last != first) { last = clearEmptySpans(last); } - - var newMarkers = [first]; - if (!sameLine) { - // Fill gap with whole-line-spans - var gap = change.text.length - 2, gapMarkers; - if (gap > 0 && first) - { for (var i$2 = 0; i$2 < first.length; ++i$2) - { if (first[i$2].to == null) - { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } - for (var i$3 = 0; i$3 < gap; ++i$3) - { newMarkers.push(gapMarkers); } - newMarkers.push(last); - } - return newMarkers - } - - // Remove spans that are empty and don't have a clearWhenEmpty - // option of false. - function clearEmptySpans(spans) { - for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) - { spans.splice(i--, 1); } - } - if (!spans.length) { return null } - return spans - } - - // Used to 'clip' out readOnly ranges when making a change. - function removeReadOnlyRanges(doc, from, to) { - var markers = null; - doc.iter(from.line, to.line + 1, function (line) { - if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { - var mark = line.markedSpans[i].marker; - if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) - { (markers || (markers = [])).push(mark); } - } } - }); - if (!markers) { return null } - var parts = [{from: from, to: to}]; - for (var i = 0; i < markers.length; ++i) { - var mk = markers[i], m = mk.find(0); - for (var j = 0; j < parts.length; ++j) { - var p = parts[j]; - if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } - var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); - if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) - { newParts.push({from: p.from, to: m.from}); } - if (dto > 0 || !mk.inclusiveRight && !dto) - { newParts.push({from: m.to, to: p.to}); } - parts.splice.apply(parts, newParts); - j += newParts.length - 3; - } - } - return parts - } - - // Connect or disconnect spans from a line. - function detachMarkedSpans(line) { - var spans = line.markedSpans; - if (!spans) { return } - for (var i = 0; i < spans.length; ++i) - { spans[i].marker.detachLine(line); } - line.markedSpans = null; - } - function attachMarkedSpans(line, spans) { - if (!spans) { return } - for (var i = 0; i < spans.length; ++i) - { spans[i].marker.attachLine(line); } - line.markedSpans = spans; - } - - // Helpers used when computing which overlapping collapsed span - // counts as the larger one. - function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } - function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } - - // Returns a number indicating which of two overlapping collapsed - // spans is larger (and thus includes the other). Falls back to - // comparing ids when the spans cover exactly the same range. - function compareCollapsedMarkers(a, b) { - var lenDiff = a.lines.length - b.lines.length; - if (lenDiff != 0) { return lenDiff } - var aPos = a.find(), bPos = b.find(); - var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); - if (fromCmp) { return -fromCmp } - var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); - if (toCmp) { return toCmp } - return b.id - a.id - } - - // Find out whether a line ends or starts in a collapsed span. If - // so, return the marker for that span. - function collapsedSpanAtSide(line, start) { - var sps = sawCollapsedSpans && line.markedSpans, found; - if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { - sp = sps[i]; - if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && - (!found || compareCollapsedMarkers(found, sp.marker) < 0)) - { found = sp.marker; } - } } - return found - } - function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } - function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } - - function collapsedSpanAround(line, ch) { - var sps = sawCollapsedSpans && line.markedSpans, found; - if (sps) { for (var i = 0; i < sps.length; ++i) { - var sp = sps[i]; - if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && - (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } - } } - return found - } - - // Test whether there exists a collapsed span that partially - // overlaps (covers the start or end, but not both) of a new span. - // Such overlap is not allowed. - function conflictingCollapsedRange(doc, lineNo, from, to, marker) { - var line = getLine(doc, lineNo); - var sps = sawCollapsedSpans && line.markedSpans; - if (sps) { for (var i = 0; i < sps.length; ++i) { - var sp = sps[i]; - if (!sp.marker.collapsed) { continue } - var found = sp.marker.find(0); - var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); - var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); - if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } - if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || - fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) - { return true } - } } - } - - // A visual line is a line as drawn on the screen. Folding, for - // example, can cause multiple logical lines to appear on the same - // visual line. This finds the start of the visual line that the - // given line is part of (usually that is the line itself). - function visualLine(line) { - var merged; - while (merged = collapsedSpanAtStart(line)) - { line = merged.find(-1, true).line; } - return line - } - - function visualLineEnd(line) { - var merged; - while (merged = collapsedSpanAtEnd(line)) - { line = merged.find(1, true).line; } - return line - } - - // Returns an array of logical lines that continue the visual line - // started by the argument, or undefined if there are no such lines. - function visualLineContinued(line) { - var merged, lines; - while (merged = collapsedSpanAtEnd(line)) { - line = merged.find(1, true).line - ;(lines || (lines = [])).push(line); - } - return lines - } - - // Get the line number of the start of the visual line that the - // given line number is part of. - function visualLineNo(doc, lineN) { - var line = getLine(doc, lineN), vis = visualLine(line); - if (line == vis) { return lineN } - return lineNo(vis) - } - - // Get the line number of the start of the next visual line after - // the given line. - function visualLineEndNo(doc, lineN) { - if (lineN > doc.lastLine()) { return lineN } - var line = getLine(doc, lineN), merged; - if (!lineIsHidden(doc, line)) { return lineN } - while (merged = collapsedSpanAtEnd(line)) - { line = merged.find(1, true).line; } - return lineNo(line) + 1 - } - - // Compute whether a line is hidden. Lines count as hidden when they - // are part of a visual line that starts with another line, or when - // they are entirely covered by collapsed, non-widget span. - function lineIsHidden(doc, line) { - var sps = sawCollapsedSpans && line.markedSpans; - if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { - sp = sps[i]; - if (!sp.marker.collapsed) { continue } - if (sp.from == null) { return true } - if (sp.marker.widgetNode) { continue } - if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) - { return true } - } } - } - function lineIsHiddenInner(doc, line, span) { - if (span.to == null) { - var end = span.marker.find(1, true); - return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) - } - if (span.marker.inclusiveRight && span.to == line.text.length) - { return true } - for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { - sp = line.markedSpans[i]; - if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && - (sp.to == null || sp.to != span.from) && - (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && - lineIsHiddenInner(doc, line, sp)) { return true } - } - } - - // Find the height above the given line. - function heightAtLine(lineObj) { - lineObj = visualLine(lineObj); - - var h = 0, chunk = lineObj.parent; - for (var i = 0; i < chunk.lines.length; ++i) { - var line = chunk.lines[i]; - if (line == lineObj) { break } - else { h += line.height; } - } - for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { - for (var i$1 = 0; i$1 < p.children.length; ++i$1) { - var cur = p.children[i$1]; - if (cur == chunk) { break } - else { h += cur.height; } - } - } - return h - } - - // Compute the character length of a line, taking into account - // collapsed ranges (see markText) that might hide parts, and join - // other lines onto it. - function lineLength(line) { - if (line.height == 0) { return 0 } - var len = line.text.length, merged, cur = line; - while (merged = collapsedSpanAtStart(cur)) { - var found = merged.find(0, true); - cur = found.from.line; - len += found.from.ch - found.to.ch; - } - cur = line; - while (merged = collapsedSpanAtEnd(cur)) { - var found$1 = merged.find(0, true); - len -= cur.text.length - found$1.from.ch; - cur = found$1.to.line; - len += cur.text.length - found$1.to.ch; - } - return len - } - - // Find the longest line in the document. - function findMaxLine(cm) { - var d = cm.display, doc = cm.doc; - d.maxLine = getLine(doc, doc.first); - d.maxLineLength = lineLength(d.maxLine); - d.maxLineChanged = true; - doc.iter(function (line) { - var len = lineLength(line); - if (len > d.maxLineLength) { - d.maxLineLength = len; - d.maxLine = line; - } - }); - } - - // LINE DATA STRUCTURE - - // Line objects. These hold state related to a line, including - // highlighting info (the styles array). - var Line = function(text, markedSpans, estimateHeight) { - this.text = text; - attachMarkedSpans(this, markedSpans); - this.height = estimateHeight ? estimateHeight(this) : 1; - }; - - Line.prototype.lineNo = function () { return lineNo(this) }; - eventMixin(Line); - - // Change the content (text, markers) of a line. Automatically - // invalidates cached information and tries to re-estimate the - // line's height. - function updateLine(line, text, markedSpans, estimateHeight) { - line.text = text; - if (line.stateAfter) { line.stateAfter = null; } - if (line.styles) { line.styles = null; } - if (line.order != null) { line.order = null; } - detachMarkedSpans(line); - attachMarkedSpans(line, markedSpans); - var estHeight = estimateHeight ? estimateHeight(line) : 1; - if (estHeight != line.height) { updateLineHeight(line, estHeight); } - } - - // Detach a line from the document tree and its markers. - function cleanUpLine(line) { - line.parent = null; - detachMarkedSpans(line); - } - - // Convert a style as returned by a mode (either null, or a string - // containing one or more styles) to a CSS style. This is cached, - // and also looks for line-wide styles. - var styleToClassCache = {}, styleToClassCacheWithMode = {}; - function interpretTokenStyle(style, options) { - if (!style || /^\s*$/.test(style)) { return null } - var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; - return cache[style] || - (cache[style] = style.replace(/\S+/g, "cm-$&")) - } - - // Render the DOM representation of the text of a line. Also builds - // up a 'line map', which points at the DOM nodes that represent - // specific stretches of text, and is used by the measuring code. - // The returned object contains the DOM node, this map, and - // information about line-wide styles that were set by the mode. - function buildLineContent(cm, lineView) { - // The padding-right forces the element to have a 'border', which - // is needed on Webkit to be able to get line-level bounding - // rectangles for it (in measureChar). - var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); - var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, - col: 0, pos: 0, cm: cm, - trailingSpace: false, - splitSpaces: cm.getOption("lineWrapping")}; - lineView.measure = {}; - - // Iterate over the logical lines that make up this visual line. - for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { - var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); - builder.pos = 0; - builder.addToken = buildToken; - // Optionally wire in some hacks into the token-rendering - // algorithm, to deal with browser quirks. - if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) - { builder.addToken = buildTokenBadBidi(builder.addToken, order); } - builder.map = []; - var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); - insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); - if (line.styleClasses) { - if (line.styleClasses.bgClass) - { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } - if (line.styleClasses.textClass) - { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } - } - - // Ensure at least a single node is present, for measuring. - if (builder.map.length == 0) - { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } - - // Store the map and a cache object for the current logical line - if (i == 0) { - lineView.measure.map = builder.map; - lineView.measure.cache = {}; - } else { - (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) - ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); - } - } - - // See issue #2901 - if (webkit) { - var last = builder.content.lastChild; - if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) - { builder.content.className = "cm-tab-wrap-hack"; } - } - - signal(cm, "renderLine", cm, lineView.line, builder.pre); - if (builder.pre.className) - { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } - - return builder - } - - function defaultSpecialCharPlaceholder(ch) { - var token = elt("span", "\u2022", "cm-invalidchar"); - token.title = "\\u" + ch.charCodeAt(0).toString(16); - token.setAttribute("aria-label", token.title); - return token - } - - // Build up the DOM representation for a single token, and add it to - // the line map. Takes care to render special characters separately. - function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { - if (!text) { return } - var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; - var special = builder.cm.state.specialChars, mustWrap = false; - var content; - if (!special.test(text)) { - builder.col += text.length; - content = document.createTextNode(displayText); - builder.map.push(builder.pos, builder.pos + text.length, content); - if (ie && ie_version < 9) { mustWrap = true; } - builder.pos += text.length; - } else { - content = document.createDocumentFragment(); - var pos = 0; - while (true) { - special.lastIndex = pos; - var m = special.exec(text); - var skipped = m ? m.index - pos : text.length - pos; - if (skipped) { - var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); - if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } - else { content.appendChild(txt); } - builder.map.push(builder.pos, builder.pos + skipped, txt); - builder.col += skipped; - builder.pos += skipped; - } - if (!m) { break } - pos += skipped + 1; - var txt$1 = (void 0); - if (m[0] == "\t") { - var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; - txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); - txt$1.setAttribute("role", "presentation"); - txt$1.setAttribute("cm-text", "\t"); - builder.col += tabWidth; - } else if (m[0] == "\r" || m[0] == "\n") { - txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); - txt$1.setAttribute("cm-text", m[0]); - builder.col += 1; - } else { - txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); - txt$1.setAttribute("cm-text", m[0]); - if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } - else { content.appendChild(txt$1); } - builder.col += 1; - } - builder.map.push(builder.pos, builder.pos + 1, txt$1); - builder.pos++; - } - } - builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; - if (style || startStyle || endStyle || mustWrap || css || attributes) { - var fullStyle = style || ""; - if (startStyle) { fullStyle += startStyle; } - if (endStyle) { fullStyle += endStyle; } - var token = elt("span", [content], fullStyle, css); - if (attributes) { - for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") - { token.setAttribute(attr, attributes[attr]); } } - } - return builder.content.appendChild(token) - } - builder.content.appendChild(content); - } - - // Change some spaces to NBSP to prevent the browser from collapsing - // trailing spaces at the end of a line when rendering text (issue #1362). - function splitSpaces(text, trailingBefore) { - if (text.length > 1 && !/ /.test(text)) { return text } - var spaceBefore = trailingBefore, result = ""; - for (var i = 0; i < text.length; i++) { - var ch = text.charAt(i); - if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) - { ch = "\u00a0"; } - result += ch; - spaceBefore = ch == " "; - } - return result - } - - // Work around nonsense dimensions being reported for stretches of - // right-to-left text. - function buildTokenBadBidi(inner, order) { - return function (builder, text, style, startStyle, endStyle, css, attributes) { - style = style ? style + " cm-force-border" : "cm-force-border"; - var start = builder.pos, end = start + text.length; - for (;;) { - // Find the part that overlaps with the start of this text - var part = (void 0); - for (var i = 0; i < order.length; i++) { - part = order[i]; - if (part.to > start && part.from <= start) { break } - } - if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } - inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); - startStyle = null; - text = text.slice(part.to - start); - start = part.to; - } - } - } - - function buildCollapsedSpan(builder, size, marker, ignoreWidget) { - var widget = !ignoreWidget && marker.widgetNode; - if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } - if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { - if (!widget) - { widget = builder.content.appendChild(document.createElement("span")); } - widget.setAttribute("cm-marker", marker.id); - } - if (widget) { - builder.cm.display.input.setUneditable(widget); - builder.content.appendChild(widget); - } - builder.pos += size; - builder.trailingSpace = false; - } - - // Outputs a number of spans to make up a line, taking highlighting - // and marked text into account. - function insertLineContent(line, builder, styles) { - var spans = line.markedSpans, allText = line.text, at = 0; - if (!spans) { - for (var i$1 = 1; i$1 < styles.length; i$1+=2) - { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } - return - } - - var len = allText.length, pos = 0, i = 1, text = "", style, css; - var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; - for (;;) { - if (nextChange == pos) { // Update current marker set - spanStyle = spanEndStyle = spanStartStyle = css = ""; - attributes = null; - collapsed = null; nextChange = Infinity; - var foundBookmarks = [], endStyles = (void 0); - for (var j = 0; j < spans.length; ++j) { - var sp = spans[j], m = sp.marker; - if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { - foundBookmarks.push(m); - } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { - if (sp.to != null && sp.to != pos && nextChange > sp.to) { - nextChange = sp.to; - spanEndStyle = ""; - } - if (m.className) { spanStyle += " " + m.className; } - if (m.css) { css = (css ? css + ";" : "") + m.css; } - if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } - if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } - // support for the old title property - // https://github.com/codemirror/CodeMirror/pull/5673 - if (m.title) { (attributes || (attributes = {})).title = m.title; } - if (m.attributes) { - for (var attr in m.attributes) - { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } - } - if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) - { collapsed = sp; } - } else if (sp.from > pos && nextChange > sp.from) { - nextChange = sp.from; - } - } - if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) - { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } - - if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) - { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } - if (collapsed && (collapsed.from || 0) == pos) { - buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, - collapsed.marker, collapsed.from == null); - if (collapsed.to == null) { return } - if (collapsed.to == pos) { collapsed = false; } - } - } - if (pos >= len) { break } - - var upto = Math.min(len, nextChange); - while (true) { - if (text) { - var end = pos + text.length; - if (!collapsed) { - var tokenText = end > upto ? text.slice(0, upto - pos) : text; - builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, - spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); - } - if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} - pos = end; - spanStartStyle = ""; - } - text = allText.slice(at, at = styles[i++]); - style = interpretTokenStyle(styles[i++], builder.cm.options); - } - } - } - - - // These objects are used to represent the visible (currently drawn) - // part of the document. A LineView may correspond to multiple - // logical lines, if those are connected by collapsed ranges. - function LineView(doc, line, lineN) { - // The starting line - this.line = line; - // Continuing lines, if any - this.rest = visualLineContinued(line); - // Number of logical lines in this visual line - this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; - this.node = this.text = null; - this.hidden = lineIsHidden(doc, line); - } - - // Create a range of LineView objects for the given lines. - function buildViewArray(cm, from, to) { - var array = [], nextPos; - for (var pos = from; pos < to; pos = nextPos) { - var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); - nextPos = pos + view.size; - array.push(view); - } - return array - } - - var operationGroup = null; - - function pushOperation(op) { - if (operationGroup) { - operationGroup.ops.push(op); - } else { - op.ownsGroup = operationGroup = { - ops: [op], - delayedCallbacks: [] - }; - } - } - - function fireCallbacksForOps(group) { - // Calls delayed callbacks and cursorActivity handlers until no - // new ones appear - var callbacks = group.delayedCallbacks, i = 0; - do { - for (; i < callbacks.length; i++) - { callbacks[i].call(null); } - for (var j = 0; j < group.ops.length; j++) { - var op = group.ops[j]; - if (op.cursorActivityHandlers) - { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) - { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } - } - } while (i < callbacks.length) - } - - function finishOperation(op, endCb) { - var group = op.ownsGroup; - if (!group) { return } - - try { fireCallbacksForOps(group); } - finally { - operationGroup = null; - endCb(group); - } - } - - var orphanDelayedCallbacks = null; - - // Often, we want to signal events at a point where we are in the - // middle of some work, but don't want the handler to start calling - // other methods on the editor, which might be in an inconsistent - // state or simply not expect any other events to happen. - // signalLater looks whether there are any handlers, and schedules - // them to be executed when the last operation ends, or, if no - // operation is active, when a timeout fires. - function signalLater(emitter, type /*, values...*/) { - var arr = getHandlers(emitter, type); - if (!arr.length) { return } - var args = Array.prototype.slice.call(arguments, 2), list; - if (operationGroup) { - list = operationGroup.delayedCallbacks; - } else if (orphanDelayedCallbacks) { - list = orphanDelayedCallbacks; - } else { - list = orphanDelayedCallbacks = []; - setTimeout(fireOrphanDelayed, 0); - } - var loop = function ( i ) { - list.push(function () { return arr[i].apply(null, args); }); - }; - - for (var i = 0; i < arr.length; ++i) - loop( i ); - } - - function fireOrphanDelayed() { - var delayed = orphanDelayedCallbacks; - orphanDelayedCallbacks = null; - for (var i = 0; i < delayed.length; ++i) { delayed[i](); } - } - - // When an aspect of a line changes, a string is added to - // lineView.changes. This updates the relevant part of the line's - // DOM structure. - function updateLineForChanges(cm, lineView, lineN, dims) { - for (var j = 0; j < lineView.changes.length; j++) { - var type = lineView.changes[j]; - if (type == "text") { updateLineText(cm, lineView); } - else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } - else if (type == "class") { updateLineClasses(cm, lineView); } - else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } - } - lineView.changes = null; - } - - // Lines with gutter elements, widgets or a background class need to - // be wrapped, and have the extra elements added to the wrapper div - function ensureLineWrapped(lineView) { - if (lineView.node == lineView.text) { - lineView.node = elt("div", null, null, "position: relative"); - if (lineView.text.parentNode) - { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } - lineView.node.appendChild(lineView.text); - if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } - } - return lineView.node - } - - function updateLineBackground(cm, lineView) { - var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; - if (cls) { cls += " CodeMirror-linebackground"; } - if (lineView.background) { - if (cls) { lineView.background.className = cls; } - else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } - } else if (cls) { - var wrap = ensureLineWrapped(lineView); - lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); - cm.display.input.setUneditable(lineView.background); - } - } - - // Wrapper around buildLineContent which will reuse the structure - // in display.externalMeasured when possible. - function getLineContent(cm, lineView) { - var ext = cm.display.externalMeasured; - if (ext && ext.line == lineView.line) { - cm.display.externalMeasured = null; - lineView.measure = ext.measure; - return ext.built - } - return buildLineContent(cm, lineView) - } - - // Redraw the line's text. Interacts with the background and text - // classes because the mode may output tokens that influence these - // classes. - function updateLineText(cm, lineView) { - var cls = lineView.text.className; - var built = getLineContent(cm, lineView); - if (lineView.text == lineView.node) { lineView.node = built.pre; } - lineView.text.parentNode.replaceChild(built.pre, lineView.text); - lineView.text = built.pre; - if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { - lineView.bgClass = built.bgClass; - lineView.textClass = built.textClass; - updateLineClasses(cm, lineView); - } else if (cls) { - lineView.text.className = cls; - } - } - - function updateLineClasses(cm, lineView) { - updateLineBackground(cm, lineView); - if (lineView.line.wrapClass) - { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } - else if (lineView.node != lineView.text) - { lineView.node.className = ""; } - var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; - lineView.text.className = textClass || ""; - } - - function updateLineGutter(cm, lineView, lineN, dims) { - if (lineView.gutter) { - lineView.node.removeChild(lineView.gutter); - lineView.gutter = null; - } - if (lineView.gutterBackground) { - lineView.node.removeChild(lineView.gutterBackground); - lineView.gutterBackground = null; - } - if (lineView.line.gutterClass) { - var wrap = ensureLineWrapped(lineView); - lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, - ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); - cm.display.input.setUneditable(lineView.gutterBackground); - wrap.insertBefore(lineView.gutterBackground, lineView.text); - } - var markers = lineView.line.gutterMarkers; - if (cm.options.lineNumbers || markers) { - var wrap$1 = ensureLineWrapped(lineView); - var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); - cm.display.input.setUneditable(gutterWrap); - wrap$1.insertBefore(gutterWrap, lineView.text); - if (lineView.line.gutterClass) - { gutterWrap.className += " " + lineView.line.gutterClass; } - if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) - { lineView.lineNumber = gutterWrap.appendChild( - elt("div", lineNumberFor(cm.options, lineN), - "CodeMirror-linenumber CodeMirror-gutter-elt", - ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } - if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { - var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; - if (found) - { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", - ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } - } } - } - } - - function updateLineWidgets(cm, lineView, dims) { - if (lineView.alignable) { lineView.alignable = null; } - var isWidget = classTest("CodeMirror-linewidget"); - for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { - next = node.nextSibling; - if (isWidget.test(node.className)) { lineView.node.removeChild(node); } - } - insertLineWidgets(cm, lineView, dims); - } - - // Build a line's DOM representation from scratch - function buildLineElement(cm, lineView, lineN, dims) { - var built = getLineContent(cm, lineView); - lineView.text = lineView.node = built.pre; - if (built.bgClass) { lineView.bgClass = built.bgClass; } - if (built.textClass) { lineView.textClass = built.textClass; } - - updateLineClasses(cm, lineView); - updateLineGutter(cm, lineView, lineN, dims); - insertLineWidgets(cm, lineView, dims); - return lineView.node - } - - // A lineView may contain multiple logical lines (when merged by - // collapsed spans). The widgets for all of them need to be drawn. - function insertLineWidgets(cm, lineView, dims) { - insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); - if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) - { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } - } - - function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { - if (!line.widgets) { return } - var wrap = ensureLineWrapped(lineView); - for (var i = 0, ws = line.widgets; i < ws.length; ++i) { - var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); - if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } - positionLineWidget(widget, node, lineView, dims); - cm.display.input.setUneditable(node); - if (allowAbove && widget.above) - { wrap.insertBefore(node, lineView.gutter || lineView.text); } - else - { wrap.appendChild(node); } - signalLater(widget, "redraw"); - } - } - - function positionLineWidget(widget, node, lineView, dims) { - if (widget.noHScroll) { - (lineView.alignable || (lineView.alignable = [])).push(node); - var width = dims.wrapperWidth; - node.style.left = dims.fixedPos + "px"; - if (!widget.coverGutter) { - width -= dims.gutterTotalWidth; - node.style.paddingLeft = dims.gutterTotalWidth + "px"; - } - node.style.width = width + "px"; - } - if (widget.coverGutter) { - node.style.zIndex = 5; - node.style.position = "relative"; - if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } - } - } - - function widgetHeight(widget) { - if (widget.height != null) { return widget.height } - var cm = widget.doc.cm; - if (!cm) { return 0 } - if (!contains(document.body, widget.node)) { - var parentStyle = "position: relative;"; - if (widget.coverGutter) - { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } - if (widget.noHScroll) - { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } - removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); - } - return widget.height = widget.node.parentNode.offsetHeight - } - - // Return true when the given mouse event happened in a widget - function eventInWidget(display, e) { - for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { - if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || - (n.parentNode == display.sizer && n != display.mover)) - { return true } - } - } - - // POSITION MEASUREMENT - - function paddingTop(display) {return display.lineSpace.offsetTop} - function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} - function paddingH(display) { - if (display.cachedPaddingH) { return display.cachedPaddingH } - var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); - var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; - var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; - if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } - return data - } - - function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } - function displayWidth(cm) { - return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth - } - function displayHeight(cm) { - return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight - } - - // Ensure the lineView.wrapping.heights array is populated. This is - // an array of bottom offsets for the lines that make up a drawn - // line. When lineWrapping is on, there might be more than one - // height. - function ensureLineHeights(cm, lineView, rect) { - var wrapping = cm.options.lineWrapping; - var curWidth = wrapping && displayWidth(cm); - if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { - var heights = lineView.measure.heights = []; - if (wrapping) { - lineView.measure.width = curWidth; - var rects = lineView.text.firstChild.getClientRects(); - for (var i = 0; i < rects.length - 1; i++) { - var cur = rects[i], next = rects[i + 1]; - if (Math.abs(cur.bottom - next.bottom) > 2) - { heights.push((cur.bottom + next.top) / 2 - rect.top); } - } - } - heights.push(rect.bottom - rect.top); - } - } - - // Find a line map (mapping character offsets to text nodes) and a - // measurement cache for the given line number. (A line view might - // contain multiple lines when collapsed ranges are present.) - function mapFromLineView(lineView, line, lineN) { - if (lineView.line == line) - { return {map: lineView.measure.map, cache: lineView.measure.cache} } - for (var i = 0; i < lineView.rest.length; i++) - { if (lineView.rest[i] == line) - { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } - for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) - { if (lineNo(lineView.rest[i$1]) > lineN) - { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } - } - - // Render a line into the hidden node display.externalMeasured. Used - // when measurement is needed for a line that's not in the viewport. - function updateExternalMeasurement(cm, line) { - line = visualLine(line); - var lineN = lineNo(line); - var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); - view.lineN = lineN; - var built = view.built = buildLineContent(cm, view); - view.text = built.pre; - removeChildrenAndAdd(cm.display.lineMeasure, built.pre); - return view - } - - // Get a {top, bottom, left, right} box (in line-local coordinates) - // for a given character. - function measureChar(cm, line, ch, bias) { - return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) - } - - // Find a line view that corresponds to the given line number. - function findViewForLine(cm, lineN) { - if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) - { return cm.display.view[findViewIndex(cm, lineN)] } - var ext = cm.display.externalMeasured; - if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) - { return ext } - } - - // Measurement can be split in two steps, the set-up work that - // applies to the whole line, and the measurement of the actual - // character. Functions like coordsChar, that need to do a lot of - // measurements in a row, can thus ensure that the set-up work is - // only done once. - function prepareMeasureForLine(cm, line) { - var lineN = lineNo(line); - var view = findViewForLine(cm, lineN); - if (view && !view.text) { - view = null; - } else if (view && view.changes) { - updateLineForChanges(cm, view, lineN, getDimensions(cm)); - cm.curOp.forceUpdate = true; - } - if (!view) - { view = updateExternalMeasurement(cm, line); } - - var info = mapFromLineView(view, line, lineN); - return { - line: line, view: view, rect: null, - map: info.map, cache: info.cache, before: info.before, - hasHeights: false - } - } - - // Given a prepared measurement object, measures the position of an - // actual character (or fetches it from the cache). - function measureCharPrepared(cm, prepared, ch, bias, varHeight) { - if (prepared.before) { ch = -1; } - var key = ch + (bias || ""), found; - if (prepared.cache.hasOwnProperty(key)) { - found = prepared.cache[key]; - } else { - if (!prepared.rect) - { prepared.rect = prepared.view.text.getBoundingClientRect(); } - if (!prepared.hasHeights) { - ensureLineHeights(cm, prepared.view, prepared.rect); - prepared.hasHeights = true; - } - found = measureCharInner(cm, prepared, ch, bias); - if (!found.bogus) { prepared.cache[key] = found; } - } - return {left: found.left, right: found.right, - top: varHeight ? found.rtop : found.top, - bottom: varHeight ? found.rbottom : found.bottom} - } - - var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; - - function nodeAndOffsetInLineMap(map, ch, bias) { - var node, start, end, collapse, mStart, mEnd; - // First, search the line map for the text node corresponding to, - // or closest to, the target character. - for (var i = 0; i < map.length; i += 3) { - mStart = map[i]; - mEnd = map[i + 1]; - if (ch < mStart) { - start = 0; end = 1; - collapse = "left"; - } else if (ch < mEnd) { - start = ch - mStart; - end = start + 1; - } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { - end = mEnd - mStart; - start = end - 1; - if (ch >= mEnd) { collapse = "right"; } - } - if (start != null) { - node = map[i + 2]; - if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) - { collapse = bias; } - if (bias == "left" && start == 0) - { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { - node = map[(i -= 3) + 2]; - collapse = "left"; - } } - if (bias == "right" && start == mEnd - mStart) - { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { - node = map[(i += 3) + 2]; - collapse = "right"; - } } - break - } - } - return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} - } - - function getUsefulRect(rects, bias) { - var rect = nullRect; - if (bias == "left") { for (var i = 0; i < rects.length; i++) { - if ((rect = rects[i]).left != rect.right) { break } - } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { - if ((rect = rects[i$1]).left != rect.right) { break } - } } - return rect - } - - function measureCharInner(cm, prepared, ch, bias) { - var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); - var node = place.node, start = place.start, end = place.end, collapse = place.collapse; - - var rect; - if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. - for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned - while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } - while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } - if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) - { rect = node.parentNode.getBoundingClientRect(); } - else - { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } - if (rect.left || rect.right || start == 0) { break } - end = start; - start = start - 1; - collapse = "right"; - } - if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } - } else { // If it is a widget, simply get the box for the whole widget. - if (start > 0) { collapse = bias = "right"; } - var rects; - if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) - { rect = rects[bias == "right" ? rects.length - 1 : 0]; } - else - { rect = node.getBoundingClientRect(); } - } - if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { - var rSpan = node.parentNode.getClientRects()[0]; - if (rSpan) - { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } - else - { rect = nullRect; } - } - - var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; - var mid = (rtop + rbot) / 2; - var heights = prepared.view.measure.heights; - var i = 0; - for (; i < heights.length - 1; i++) - { if (mid < heights[i]) { break } } - var top = i ? heights[i - 1] : 0, bot = heights[i]; - var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, - right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, - top: top, bottom: bot}; - if (!rect.left && !rect.right) { result.bogus = true; } - if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } - - return result - } - - // Work around problem with bounding client rects on ranges being - // returned incorrectly when zoomed on IE10 and below. - function maybeUpdateRectForZooming(measure, rect) { - if (!window.screen || screen.logicalXDPI == null || - screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) - { return rect } - var scaleX = screen.logicalXDPI / screen.deviceXDPI; - var scaleY = screen.logicalYDPI / screen.deviceYDPI; - return {left: rect.left * scaleX, right: rect.right * scaleX, - top: rect.top * scaleY, bottom: rect.bottom * scaleY} - } - - function clearLineMeasurementCacheFor(lineView) { - if (lineView.measure) { - lineView.measure.cache = {}; - lineView.measure.heights = null; - if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) - { lineView.measure.caches[i] = {}; } } - } - } - - function clearLineMeasurementCache(cm) { - cm.display.externalMeasure = null; - removeChildren(cm.display.lineMeasure); - for (var i = 0; i < cm.display.view.length; i++) - { clearLineMeasurementCacheFor(cm.display.view[i]); } - } - - function clearCaches(cm) { - clearLineMeasurementCache(cm); - cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; - if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } - cm.display.lineNumChars = null; - } - - function pageScrollX() { - // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 - // which causes page_Offset and bounding client rects to use - // different reference viewports and invalidate our calculations. - if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } - return window.pageXOffset || (document.documentElement || document.body).scrollLeft - } - function pageScrollY() { - if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } - return window.pageYOffset || (document.documentElement || document.body).scrollTop - } - - function widgetTopHeight(lineObj) { - var height = 0; - if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) - { height += widgetHeight(lineObj.widgets[i]); } } } - return height - } - - // Converts a {top, bottom, left, right} box from line-local - // coordinates into another coordinate system. Context may be one of - // "line", "div" (display.lineDiv), "local"./null (editor), "window", - // or "page". - function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { - if (!includeWidgets) { - var height = widgetTopHeight(lineObj); - rect.top += height; rect.bottom += height; - } - if (context == "line") { return rect } - if (!context) { context = "local"; } - var yOff = heightAtLine(lineObj); - if (context == "local") { yOff += paddingTop(cm.display); } - else { yOff -= cm.display.viewOffset; } - if (context == "page" || context == "window") { - var lOff = cm.display.lineSpace.getBoundingClientRect(); - yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); - var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); - rect.left += xOff; rect.right += xOff; - } - rect.top += yOff; rect.bottom += yOff; - return rect - } - - // Coverts a box from "div" coords to another coordinate system. - // Context may be "window", "page", "div", or "local"./null. - function fromCoordSystem(cm, coords, context) { - if (context == "div") { return coords } - var left = coords.left, top = coords.top; - // First move into "page" coordinate system - if (context == "page") { - left -= pageScrollX(); - top -= pageScrollY(); - } else if (context == "local" || !context) { - var localBox = cm.display.sizer.getBoundingClientRect(); - left += localBox.left; - top += localBox.top; - } - - var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); - return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} - } - - function charCoords(cm, pos, context, lineObj, bias) { - if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } - return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) - } - - // Returns a box for a given cursor position, which may have an - // 'other' property containing the position of the secondary cursor - // on a bidi boundary. - // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` - // and after `char - 1` in writing order of `char - 1` - // A cursor Pos(line, char, "after") is on the same visual line as `char` - // and before `char` in writing order of `char` - // Examples (upper-case letters are RTL, lower-case are LTR): - // Pos(0, 1, ...) - // before after - // ab a|b a|b - // aB a|B aB| - // Ab |Ab A|b - // AB B|A B|A - // Every position after the last character on a line is considered to stick - // to the last character on the line. - function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { - lineObj = lineObj || getLine(cm.doc, pos.line); - if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } - function get(ch, right) { - var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); - if (right) { m.left = m.right; } else { m.right = m.left; } - return intoCoordSystem(cm, lineObj, m, context) - } - var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; - if (ch >= lineObj.text.length) { - ch = lineObj.text.length; - sticky = "before"; - } else if (ch <= 0) { - ch = 0; - sticky = "after"; - } - if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } - - function getBidi(ch, partPos, invert) { - var part = order[partPos], right = part.level == 1; - return get(invert ? ch - 1 : ch, right != invert) - } - var partPos = getBidiPartAt(order, ch, sticky); - var other = bidiOther; - var val = getBidi(ch, partPos, sticky == "before"); - if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } - return val - } - - // Used to cheaply estimate the coordinates for a position. Used for - // intermediate scroll updates. - function estimateCoords(cm, pos) { - var left = 0; - pos = clipPos(cm.doc, pos); - if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } - var lineObj = getLine(cm.doc, pos.line); - var top = heightAtLine(lineObj) + paddingTop(cm.display); - return {left: left, right: left, top: top, bottom: top + lineObj.height} - } - - // Positions returned by coordsChar contain some extra information. - // xRel is the relative x position of the input coordinates compared - // to the found position (so xRel > 0 means the coordinates are to - // the right of the character position, for example). When outside - // is true, that means the coordinates lie outside the line's - // vertical range. - function PosWithInfo(line, ch, sticky, outside, xRel) { - var pos = Pos(line, ch, sticky); - pos.xRel = xRel; - if (outside) { pos.outside = outside; } - return pos - } - - // Compute the character position closest to the given coordinates. - // Input must be lineSpace-local ("div" coordinate system). - function coordsChar(cm, x, y) { - var doc = cm.doc; - y += cm.display.viewOffset; - if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } - var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; - if (lineN > last) - { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } - if (x < 0) { x = 0; } - - var lineObj = getLine(doc, lineN); - for (;;) { - var found = coordsCharInner(cm, lineObj, lineN, x, y); - var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); - if (!collapsed) { return found } - var rangeEnd = collapsed.find(1); - if (rangeEnd.line == lineN) { return rangeEnd } - lineObj = getLine(doc, lineN = rangeEnd.line); - } - } - - function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { - y -= widgetTopHeight(lineObj); - var end = lineObj.text.length; - var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); - end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); - return {begin: begin, end: end} - } - - function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { - if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } - var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; - return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) - } - - // Returns true if the given side of a box is after the given - // coordinates, in top-to-bottom, left-to-right order. - function boxIsAfter(box, x, y, left) { - return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x - } - - function coordsCharInner(cm, lineObj, lineNo, x, y) { - // Move y into line-local coordinate space - y -= heightAtLine(lineObj); - var preparedMeasure = prepareMeasureForLine(cm, lineObj); - // When directly calling `measureCharPrepared`, we have to adjust - // for the widgets at this line. - var widgetHeight = widgetTopHeight(lineObj); - var begin = 0, end = lineObj.text.length, ltr = true; - - var order = getOrder(lineObj, cm.doc.direction); - // If the line isn't plain left-to-right text, first figure out - // which bidi section the coordinates fall into. - if (order) { - var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) - (cm, lineObj, lineNo, preparedMeasure, order, x, y); - ltr = part.level != 1; - // The awkward -1 offsets are needed because findFirst (called - // on these below) will treat its first bound as inclusive, - // second as exclusive, but we want to actually address the - // characters in the part's range - begin = ltr ? part.from : part.to - 1; - end = ltr ? part.to : part.from - 1; - } - - // A binary search to find the first character whose bounding box - // starts after the coordinates. If we run across any whose box wrap - // the coordinates, store that. - var chAround = null, boxAround = null; - var ch = findFirst(function (ch) { - var box = measureCharPrepared(cm, preparedMeasure, ch); - box.top += widgetHeight; box.bottom += widgetHeight; - if (!boxIsAfter(box, x, y, false)) { return false } - if (box.top <= y && box.left <= x) { - chAround = ch; - boxAround = box; - } - return true - }, begin, end); - - var baseX, sticky, outside = false; - // If a box around the coordinates was found, use that - if (boxAround) { - // Distinguish coordinates nearer to the left or right side of the box - var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; - ch = chAround + (atStart ? 0 : 1); - sticky = atStart ? "after" : "before"; - baseX = atLeft ? boxAround.left : boxAround.right; - } else { - // (Adjust for extended bound, if necessary.) - if (!ltr && (ch == end || ch == begin)) { ch++; } - // To determine which side to associate with, get the box to the - // left of the character and compare it's vertical position to the - // coordinates - sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : - (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ? - "after" : "before"; - // Now get accurate coordinates for this place, in order to get a - // base X position - var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure); - baseX = coords.left; - outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; - } - - ch = skipExtendingChars(lineObj.text, ch, 1); - return PosWithInfo(lineNo, ch, sticky, outside, x - baseX) - } - - function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) { - // Bidi parts are sorted left-to-right, and in a non-line-wrapping - // situation, we can take this ordering to correspond to the visual - // ordering. This finds the first part whose end is after the given - // coordinates. - var index = findFirst(function (i) { - var part = order[i], ltr = part.level != 1; - return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"), - "line", lineObj, preparedMeasure), x, y, true) - }, 0, order.length - 1); - var part = order[index]; - // If this isn't the first part, the part's start is also after - // the coordinates, and the coordinates aren't on the same line as - // that start, move one part back. - if (index > 0) { - var ltr = part.level != 1; - var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"), - "line", lineObj, preparedMeasure); - if (boxIsAfter(start, x, y, true) && start.top > y) - { part = order[index - 1]; } - } - return part - } - - function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { - // In a wrapped line, rtl text on wrapping boundaries can do things - // that don't correspond to the ordering in our `order` array at - // all, so a binary search doesn't work, and we want to return a - // part that only spans one line so that the binary search in - // coordsCharInner is safe. As such, we first find the extent of the - // wrapped line, and then do a flat search in which we discard any - // spans that aren't on the line. - var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); - var begin = ref.begin; - var end = ref.end; - if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } - var part = null, closestDist = null; - for (var i = 0; i < order.length; i++) { - var p = order[i]; - if (p.from >= end || p.to <= begin) { continue } - var ltr = p.level != 1; - var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; - // Weigh against spans ending before this, so that they are only - // picked if nothing ends after - var dist = endX < x ? x - endX + 1e9 : endX - x; - if (!part || closestDist > dist) { - part = p; - closestDist = dist; - } - } - if (!part) { part = order[order.length - 1]; } - // Clip the part to the wrapped line. - if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } - if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } - return part - } - - var measureText; - // Compute the default text height. - function textHeight(display) { - if (display.cachedTextHeight != null) { return display.cachedTextHeight } - if (measureText == null) { - measureText = elt("pre", null, "CodeMirror-line-like"); - // Measure a bunch of lines, for browsers that compute - // fractional heights. - for (var i = 0; i < 49; ++i) { - measureText.appendChild(document.createTextNode("x")); - measureText.appendChild(elt("br")); - } - measureText.appendChild(document.createTextNode("x")); - } - removeChildrenAndAdd(display.measure, measureText); - var height = measureText.offsetHeight / 50; - if (height > 3) { display.cachedTextHeight = height; } - removeChildren(display.measure); - return height || 1 - } - - // Compute the default character width. - function charWidth(display) { - if (display.cachedCharWidth != null) { return display.cachedCharWidth } - var anchor = elt("span", "xxxxxxxxxx"); - var pre = elt("pre", [anchor], "CodeMirror-line-like"); - removeChildrenAndAdd(display.measure, pre); - var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; - if (width > 2) { display.cachedCharWidth = width; } - return width || 10 - } - - // Do a bulk-read of the DOM positions and sizes needed to draw the - // view, so that we don't interleave reading and writing to the DOM. - function getDimensions(cm) { - var d = cm.display, left = {}, width = {}; - var gutterLeft = d.gutters.clientLeft; - for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { - var id = cm.display.gutterSpecs[i].className; - left[id] = n.offsetLeft + n.clientLeft + gutterLeft; - width[id] = n.clientWidth; - } - return {fixedPos: compensateForHScroll(d), - gutterTotalWidth: d.gutters.offsetWidth, - gutterLeft: left, - gutterWidth: width, - wrapperWidth: d.wrapper.clientWidth} - } - - // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, - // but using getBoundingClientRect to get a sub-pixel-accurate - // result. - function compensateForHScroll(display) { - return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left - } - - // Returns a function that estimates the height of a line, to use as - // first approximation until the line becomes visible (and is thus - // properly measurable). - function estimateHeight(cm) { - var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; - var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); - return function (line) { - if (lineIsHidden(cm.doc, line)) { return 0 } - - var widgetsHeight = 0; - if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { - if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } - } } - - if (wrapping) - { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } - else - { return widgetsHeight + th } - } - } - - function estimateLineHeights(cm) { - var doc = cm.doc, est = estimateHeight(cm); - doc.iter(function (line) { - var estHeight = est(line); - if (estHeight != line.height) { updateLineHeight(line, estHeight); } - }); - } - - // Given a mouse event, find the corresponding position. If liberal - // is false, it checks whether a gutter or scrollbar was clicked, - // and returns null if it was. forRect is used by rectangular - // selections, and tries to estimate a character position even for - // coordinates beyond the right of the text. - function posFromMouse(cm, e, liberal, forRect) { - var display = cm.display; - if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } - - var x, y, space = display.lineSpace.getBoundingClientRect(); - // Fails unpredictably on IE[67] when mouse is dragged around quickly. - try { x = e.clientX - space.left; y = e.clientY - space.top; } - catch (e$1) { return null } - var coords = coordsChar(cm, x, y), line; - if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { - var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; - coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); - } - return coords - } - - // Find the view element corresponding to a given line. Return null - // when the line isn't visible. - function findViewIndex(cm, n) { - if (n >= cm.display.viewTo) { return null } - n -= cm.display.viewFrom; - if (n < 0) { return null } - var view = cm.display.view; - for (var i = 0; i < view.length; i++) { - n -= view[i].size; - if (n < 0) { return i } - } - } - - // Updates the display.view data structure for a given change to the - // document. From and to are in pre-change coordinates. Lendiff is - // the amount of lines added or subtracted by the change. This is - // used for changes that span multiple lines, or change the way - // lines are divided into visual lines. regLineChange (below) - // registers single-line changes. - function regChange(cm, from, to, lendiff) { - if (from == null) { from = cm.doc.first; } - if (to == null) { to = cm.doc.first + cm.doc.size; } - if (!lendiff) { lendiff = 0; } - - var display = cm.display; - if (lendiff && to < display.viewTo && - (display.updateLineNumbers == null || display.updateLineNumbers > from)) - { display.updateLineNumbers = from; } - - cm.curOp.viewChanged = true; - - if (from >= display.viewTo) { // Change after - if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) - { resetView(cm); } - } else if (to <= display.viewFrom) { // Change before - if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { - resetView(cm); - } else { - display.viewFrom += lendiff; - display.viewTo += lendiff; - } - } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap - resetView(cm); - } else if (from <= display.viewFrom) { // Top overlap - var cut = viewCuttingPoint(cm, to, to + lendiff, 1); - if (cut) { - display.view = display.view.slice(cut.index); - display.viewFrom = cut.lineN; - display.viewTo += lendiff; - } else { - resetView(cm); - } - } else if (to >= display.viewTo) { // Bottom overlap - var cut$1 = viewCuttingPoint(cm, from, from, -1); - if (cut$1) { - display.view = display.view.slice(0, cut$1.index); - display.viewTo = cut$1.lineN; - } else { - resetView(cm); - } - } else { // Gap in the middle - var cutTop = viewCuttingPoint(cm, from, from, -1); - var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); - if (cutTop && cutBot) { - display.view = display.view.slice(0, cutTop.index) - .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) - .concat(display.view.slice(cutBot.index)); - display.viewTo += lendiff; - } else { - resetView(cm); - } - } - - var ext = display.externalMeasured; - if (ext) { - if (to < ext.lineN) - { ext.lineN += lendiff; } - else if (from < ext.lineN + ext.size) - { display.externalMeasured = null; } - } - } - - // Register a change to a single line. Type must be one of "text", - // "gutter", "class", "widget" - function regLineChange(cm, line, type) { - cm.curOp.viewChanged = true; - var display = cm.display, ext = cm.display.externalMeasured; - if (ext && line >= ext.lineN && line < ext.lineN + ext.size) - { display.externalMeasured = null; } - - if (line < display.viewFrom || line >= display.viewTo) { return } - var lineView = display.view[findViewIndex(cm, line)]; - if (lineView.node == null) { return } - var arr = lineView.changes || (lineView.changes = []); - if (indexOf(arr, type) == -1) { arr.push(type); } - } - - // Clear the view. - function resetView(cm) { - cm.display.viewFrom = cm.display.viewTo = cm.doc.first; - cm.display.view = []; - cm.display.viewOffset = 0; - } - - function viewCuttingPoint(cm, oldN, newN, dir) { - var index = findViewIndex(cm, oldN), diff, view = cm.display.view; - if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) - { return {index: index, lineN: newN} } - var n = cm.display.viewFrom; - for (var i = 0; i < index; i++) - { n += view[i].size; } - if (n != oldN) { - if (dir > 0) { - if (index == view.length - 1) { return null } - diff = (n + view[index].size) - oldN; - index++; - } else { - diff = n - oldN; - } - oldN += diff; newN += diff; - } - while (visualLineNo(cm.doc, newN) != newN) { - if (index == (dir < 0 ? 0 : view.length - 1)) { return null } - newN += dir * view[index - (dir < 0 ? 1 : 0)].size; - index += dir; - } - return {index: index, lineN: newN} - } - - // Force the view to cover a given range, adding empty view element - // or clipping off existing ones as needed. - function adjustView(cm, from, to) { - var display = cm.display, view = display.view; - if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { - display.view = buildViewArray(cm, from, to); - display.viewFrom = from; - } else { - if (display.viewFrom > from) - { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } - else if (display.viewFrom < from) - { display.view = display.view.slice(findViewIndex(cm, from)); } - display.viewFrom = from; - if (display.viewTo < to) - { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } - else if (display.viewTo > to) - { display.view = display.view.slice(0, findViewIndex(cm, to)); } - } - display.viewTo = to; - } - - // Count the number of lines in the view whose DOM representation is - // out of date (or nonexistent). - function countDirtyView(cm) { - var view = cm.display.view, dirty = 0; - for (var i = 0; i < view.length; i++) { - var lineView = view[i]; - if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } - } - return dirty - } - - function updateSelection(cm) { - cm.display.input.showSelection(cm.display.input.prepareSelection()); - } - - function prepareSelection(cm, primary) { - if ( primary === void 0 ) primary = true; - - var doc = cm.doc, result = {}; - var curFragment = result.cursors = document.createDocumentFragment(); - var selFragment = result.selection = document.createDocumentFragment(); - - for (var i = 0; i < doc.sel.ranges.length; i++) { - if (!primary && i == doc.sel.primIndex) { continue } - var range = doc.sel.ranges[i]; - if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue } - var collapsed = range.empty(); - if (collapsed || cm.options.showCursorWhenSelecting) - { drawSelectionCursor(cm, range.head, curFragment); } - if (!collapsed) - { drawSelectionRange(cm, range, selFragment); } - } - return result - } - - // Draws a cursor for the given range - function drawSelectionCursor(cm, head, output) { - var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); - - var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); - cursor.style.left = pos.left + "px"; - cursor.style.top = pos.top + "px"; - cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; - - if (pos.other) { - // Secondary cursor, shown when on a 'jump' in bi-directional text - var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); - otherCursor.style.display = ""; - otherCursor.style.left = pos.other.left + "px"; - otherCursor.style.top = pos.other.top + "px"; - otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; - } - } - - function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } - - // Draws the given range as a highlighted selection - function drawSelectionRange(cm, range, output) { - var display = cm.display, doc = cm.doc; - var fragment = document.createDocumentFragment(); - var padding = paddingH(cm.display), leftSide = padding.left; - var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; - var docLTR = doc.direction == "ltr"; - - function add(left, top, width, bottom) { - if (top < 0) { top = 0; } - top = Math.round(top); - bottom = Math.round(bottom); - fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); - } - - function drawForLine(line, fromArg, toArg) { - var lineObj = getLine(doc, line); - var lineLen = lineObj.text.length; - var start, end; - function coords(ch, bias) { - return charCoords(cm, Pos(line, ch), "div", lineObj, bias) - } - - function wrapX(pos, dir, side) { - var extent = wrappedLineExtentChar(cm, lineObj, null, pos); - var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; - var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); - return coords(ch, prop)[prop] - } - - var order = getOrder(lineObj, doc.direction); - iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { - var ltr = dir == "ltr"; - var fromPos = coords(from, ltr ? "left" : "right"); - var toPos = coords(to - 1, ltr ? "right" : "left"); - - var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; - var first = i == 0, last = !order || i == order.length - 1; - if (toPos.top - fromPos.top <= 3) { // Single line - var openLeft = (docLTR ? openStart : openEnd) && first; - var openRight = (docLTR ? openEnd : openStart) && last; - var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; - var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; - add(left, fromPos.top, right - left, fromPos.bottom); - } else { // Multiple lines - var topLeft, topRight, botLeft, botRight; - if (ltr) { - topLeft = docLTR && openStart && first ? leftSide : fromPos.left; - topRight = docLTR ? rightSide : wrapX(from, dir, "before"); - botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); - botRight = docLTR && openEnd && last ? rightSide : toPos.right; - } else { - topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); - topRight = !docLTR && openStart && first ? rightSide : fromPos.right; - botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; - botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); - } - add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); - if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } - add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); - } - - if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } - if (cmpCoords(toPos, start) < 0) { start = toPos; } - if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } - if (cmpCoords(toPos, end) < 0) { end = toPos; } - }); - return {start: start, end: end} - } - - var sFrom = range.from(), sTo = range.to(); - if (sFrom.line == sTo.line) { - drawForLine(sFrom.line, sFrom.ch, sTo.ch); - } else { - var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); - var singleVLine = visualLine(fromLine) == visualLine(toLine); - var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; - var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; - if (singleVLine) { - if (leftEnd.top < rightStart.top - 2) { - add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); - add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); - } else { - add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); - } - } - if (leftEnd.bottom < rightStart.top) - { add(leftSide, leftEnd.bottom, null, rightStart.top); } - } - - output.appendChild(fragment); - } - - // Cursor-blinking - function restartBlink(cm) { - if (!cm.state.focused) { return } - var display = cm.display; - clearInterval(display.blinker); - var on = true; - display.cursorDiv.style.visibility = ""; - if (cm.options.cursorBlinkRate > 0) - { display.blinker = setInterval(function () { - if (!cm.hasFocus()) { onBlur(cm); } - display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; - }, cm.options.cursorBlinkRate); } - else if (cm.options.cursorBlinkRate < 0) - { display.cursorDiv.style.visibility = "hidden"; } - } - - function ensureFocus(cm) { - if (!cm.hasFocus()) { - cm.display.input.focus(); - if (!cm.state.focused) { onFocus(cm); } - } - } - - function delayBlurEvent(cm) { - cm.state.delayingBlurEvent = true; - setTimeout(function () { if (cm.state.delayingBlurEvent) { - cm.state.delayingBlurEvent = false; - if (cm.state.focused) { onBlur(cm); } - } }, 100); - } - - function onFocus(cm, e) { - if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; } - - if (cm.options.readOnly == "nocursor") { return } - if (!cm.state.focused) { - signal(cm, "focus", cm, e); - cm.state.focused = true; - addClass(cm.display.wrapper, "CodeMirror-focused"); - // This test prevents this from firing when a context - // menu is closed (since the input reset would kill the - // select-all detection hack) - if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { - cm.display.input.reset(); - if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 - } - cm.display.input.receivedFocus(); - } - restartBlink(cm); - } - function onBlur(cm, e) { - if (cm.state.delayingBlurEvent) { return } - - if (cm.state.focused) { - signal(cm, "blur", cm, e); - cm.state.focused = false; - rmClass(cm.display.wrapper, "CodeMirror-focused"); - } - clearInterval(cm.display.blinker); - setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); - } - - // Read the actual heights of the rendered lines, and update their - // stored heights to match. - function updateHeightsInViewport(cm) { - var display = cm.display; - var prevBottom = display.lineDiv.offsetTop; - for (var i = 0; i < display.view.length; i++) { - var cur = display.view[i], wrapping = cm.options.lineWrapping; - var height = (void 0), width = 0; - if (cur.hidden) { continue } - if (ie && ie_version < 8) { - var bot = cur.node.offsetTop + cur.node.offsetHeight; - height = bot - prevBottom; - prevBottom = bot; - } else { - var box = cur.node.getBoundingClientRect(); - height = box.bottom - box.top; - // Check that lines don't extend past the right of the current - // editor width - if (!wrapping && cur.text.firstChild) - { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } - } - var diff = cur.line.height - height; - if (diff > .005 || diff < -.005) { - updateLineHeight(cur.line, height); - updateWidgetHeight(cur.line); - if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) - { updateWidgetHeight(cur.rest[j]); } } - } - if (width > cm.display.sizerWidth) { - var chWidth = Math.ceil(width / charWidth(cm.display)); - if (chWidth > cm.display.maxLineLength) { - cm.display.maxLineLength = chWidth; - cm.display.maxLine = cur.line; - cm.display.maxLineChanged = true; - } - } - } - } - - // Read and store the height of line widgets associated with the - // given line. - function updateWidgetHeight(line) { - if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { - var w = line.widgets[i], parent = w.node.parentNode; - if (parent) { w.height = parent.offsetHeight; } - } } - } - - // Compute the lines that are visible in a given viewport (defaults - // the the current scroll position). viewport may contain top, - // height, and ensure (see op.scrollToPos) properties. - function visibleLines(display, doc, viewport) { - var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; - top = Math.floor(top - paddingTop(display)); - var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; - - var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); - // Ensure is a {from: {line, ch}, to: {line, ch}} object, and - // forces those lines into the viewport (if possible). - if (viewport && viewport.ensure) { - var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; - if (ensureFrom < from) { - from = ensureFrom; - to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); - } else if (Math.min(ensureTo, doc.lastLine()) >= to) { - from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); - to = ensureTo; - } - } - return {from: from, to: Math.max(to, from + 1)} - } - - // SCROLLING THINGS INTO VIEW - - // If an editor sits on the top or bottom of the window, partially - // scrolled out of view, this ensures that the cursor is visible. - function maybeScrollWindow(cm, rect) { - if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } - - var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; - if (rect.top + box.top < 0) { doScroll = true; } - else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } - if (doScroll != null && !phantom) { - var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); - cm.display.lineSpace.appendChild(scrollNode); - scrollNode.scrollIntoView(doScroll); - cm.display.lineSpace.removeChild(scrollNode); - } - } - - // Scroll a given position into view (immediately), verifying that - // it actually became visible (as line heights are accurately - // measured, the position of something may 'drift' during drawing). - function scrollPosIntoView(cm, pos, end, margin) { - if (margin == null) { margin = 0; } - var rect; - if (!cm.options.lineWrapping && pos == end) { - // Set pos and end to the cursor positions around the character pos sticks to - // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch - // If pos == Pos(_, 0, "before"), pos and end are unchanged - pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; - end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; - } - for (var limit = 0; limit < 5; limit++) { - var changed = false; - var coords = cursorCoords(cm, pos); - var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); - rect = {left: Math.min(coords.left, endCoords.left), - top: Math.min(coords.top, endCoords.top) - margin, - right: Math.max(coords.left, endCoords.left), - bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; - var scrollPos = calculateScrollPos(cm, rect); - var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; - if (scrollPos.scrollTop != null) { - updateScrollTop(cm, scrollPos.scrollTop); - if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } - } - if (scrollPos.scrollLeft != null) { - setScrollLeft(cm, scrollPos.scrollLeft); - if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } - } - if (!changed) { break } - } - return rect - } - - // Scroll a given set of coordinates into view (immediately). - function scrollIntoView(cm, rect) { - var scrollPos = calculateScrollPos(cm, rect); - if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } - if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } - } - - // Calculate a new scroll position needed to scroll the given - // rectangle into view. Returns an object with scrollTop and - // scrollLeft properties. When these are undefined, the - // vertical/horizontal position does not need to be adjusted. - function calculateScrollPos(cm, rect) { - var display = cm.display, snapMargin = textHeight(cm.display); - if (rect.top < 0) { rect.top = 0; } - var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; - var screen = displayHeight(cm), result = {}; - if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } - var docBottom = cm.doc.height + paddingVert(display); - var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; - if (rect.top < screentop) { - result.scrollTop = atTop ? 0 : rect.top; - } else if (rect.bottom > screentop + screen) { - var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); - if (newTop != screentop) { result.scrollTop = newTop; } - } - - var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; - var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; - var screenw = displayWidth(cm) - display.gutters.offsetWidth; - var tooWide = rect.right - rect.left > screenw; - if (tooWide) { rect.right = rect.left + screenw; } - if (rect.left < 10) - { result.scrollLeft = 0; } - else if (rect.left < screenleft) - { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); } - else if (rect.right > screenw + screenleft - 3) - { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } - return result - } - - // Store a relative adjustment to the scroll position in the current - // operation (to be applied when the operation finishes). - function addToScrollTop(cm, top) { - if (top == null) { return } - resolveScrollToPos(cm); - cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; - } - - // Make sure that at the end of the operation the current cursor is - // shown. - function ensureCursorVisible(cm) { - resolveScrollToPos(cm); - var cur = cm.getCursor(); - cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; - } - - function scrollToCoords(cm, x, y) { - if (x != null || y != null) { resolveScrollToPos(cm); } - if (x != null) { cm.curOp.scrollLeft = x; } - if (y != null) { cm.curOp.scrollTop = y; } - } - - function scrollToRange(cm, range) { - resolveScrollToPos(cm); - cm.curOp.scrollToPos = range; - } - - // When an operation has its scrollToPos property set, and another - // scroll action is applied before the end of the operation, this - // 'simulates' scrolling that position into view in a cheap way, so - // that the effect of intermediate scroll commands is not ignored. - function resolveScrollToPos(cm) { - var range = cm.curOp.scrollToPos; - if (range) { - cm.curOp.scrollToPos = null; - var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); - scrollToCoordsRange(cm, from, to, range.margin); - } - } - - function scrollToCoordsRange(cm, from, to, margin) { - var sPos = calculateScrollPos(cm, { - left: Math.min(from.left, to.left), - top: Math.min(from.top, to.top) - margin, - right: Math.max(from.right, to.right), - bottom: Math.max(from.bottom, to.bottom) + margin - }); - scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); - } - - // Sync the scrollable area and scrollbars, ensure the viewport - // covers the visible area. - function updateScrollTop(cm, val) { - if (Math.abs(cm.doc.scrollTop - val) < 2) { return } - if (!gecko) { updateDisplaySimple(cm, {top: val}); } - setScrollTop(cm, val, true); - if (gecko) { updateDisplaySimple(cm); } - startWorker(cm, 100); - } - - function setScrollTop(cm, val, forceScroll) { - val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); - if (cm.display.scroller.scrollTop == val && !forceScroll) { return } - cm.doc.scrollTop = val; - cm.display.scrollbars.setScrollTop(val); - if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } - } - - // Sync scroller and scrollbar, ensure the gutter elements are - // aligned. - function setScrollLeft(cm, val, isScroller, forceScroll) { - val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); - if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } - cm.doc.scrollLeft = val; - alignHorizontally(cm); - if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } - cm.display.scrollbars.setScrollLeft(val); - } - - // SCROLLBARS - - // Prepare DOM reads needed to update the scrollbars. Done in one - // shot to minimize update/measure roundtrips. - function measureForScrollbars(cm) { - var d = cm.display, gutterW = d.gutters.offsetWidth; - var docH = Math.round(cm.doc.height + paddingVert(cm.display)); - return { - clientHeight: d.scroller.clientHeight, - viewHeight: d.wrapper.clientHeight, - scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, - viewWidth: d.wrapper.clientWidth, - barLeft: cm.options.fixedGutter ? gutterW : 0, - docHeight: docH, - scrollHeight: docH + scrollGap(cm) + d.barHeight, - nativeBarWidth: d.nativeBarWidth, - gutterWidth: gutterW - } - } - - var NativeScrollbars = function(place, scroll, cm) { - this.cm = cm; - var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); - var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); - vert.tabIndex = horiz.tabIndex = -1; - place(vert); place(horiz); - - on(vert, "scroll", function () { - if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } - }); - on(horiz, "scroll", function () { - if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } - }); - - this.checkedZeroWidth = false; - // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). - if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } - }; - - NativeScrollbars.prototype.update = function (measure) { - var needsH = measure.scrollWidth > measure.clientWidth + 1; - var needsV = measure.scrollHeight > measure.clientHeight + 1; - var sWidth = measure.nativeBarWidth; - - if (needsV) { - this.vert.style.display = "block"; - this.vert.style.bottom = needsH ? sWidth + "px" : "0"; - var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); - // A bug in IE8 can cause this value to be negative, so guard it. - this.vert.firstChild.style.height = - Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; - } else { - this.vert.style.display = ""; - this.vert.firstChild.style.height = "0"; - } - - if (needsH) { - this.horiz.style.display = "block"; - this.horiz.style.right = needsV ? sWidth + "px" : "0"; - this.horiz.style.left = measure.barLeft + "px"; - var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); - this.horiz.firstChild.style.width = - Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; - } else { - this.horiz.style.display = ""; - this.horiz.firstChild.style.width = "0"; - } - - if (!this.checkedZeroWidth && measure.clientHeight > 0) { - if (sWidth == 0) { this.zeroWidthHack(); } - this.checkedZeroWidth = true; - } - - return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} - }; - - NativeScrollbars.prototype.setScrollLeft = function (pos) { - if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } - if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } - }; - - NativeScrollbars.prototype.setScrollTop = function (pos) { - if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } - if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } - }; - - NativeScrollbars.prototype.zeroWidthHack = function () { - var w = mac && !mac_geMountainLion ? "12px" : "18px"; - this.horiz.style.height = this.vert.style.width = w; - this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; - this.disableHoriz = new Delayed; - this.disableVert = new Delayed; - }; - - NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { - bar.style.pointerEvents = "auto"; - function maybeDisable() { - // To find out whether the scrollbar is still visible, we - // check whether the element under the pixel in the bottom - // right corner of the scrollbar box is the scrollbar box - // itself (when the bar is still visible) or its filler child - // (when the bar is hidden). If it is still visible, we keep - // it enabled, if it's hidden, we disable pointer events. - var box = bar.getBoundingClientRect(); - var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) - : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); - if (elt != bar) { bar.style.pointerEvents = "none"; } - else { delay.set(1000, maybeDisable); } - } - delay.set(1000, maybeDisable); - }; - - NativeScrollbars.prototype.clear = function () { - var parent = this.horiz.parentNode; - parent.removeChild(this.horiz); - parent.removeChild(this.vert); - }; - - var NullScrollbars = function () {}; - - NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; - NullScrollbars.prototype.setScrollLeft = function () {}; - NullScrollbars.prototype.setScrollTop = function () {}; - NullScrollbars.prototype.clear = function () {}; - - function updateScrollbars(cm, measure) { - if (!measure) { measure = measureForScrollbars(cm); } - var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; - updateScrollbarsInner(cm, measure); - for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { - if (startWidth != cm.display.barWidth && cm.options.lineWrapping) - { updateHeightsInViewport(cm); } - updateScrollbarsInner(cm, measureForScrollbars(cm)); - startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; - } - } - - // Re-synchronize the fake scrollbars with the actual size of the - // content. - function updateScrollbarsInner(cm, measure) { - var d = cm.display; - var sizes = d.scrollbars.update(measure); - - d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; - d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; - d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; - - if (sizes.right && sizes.bottom) { - d.scrollbarFiller.style.display = "block"; - d.scrollbarFiller.style.height = sizes.bottom + "px"; - d.scrollbarFiller.style.width = sizes.right + "px"; - } else { d.scrollbarFiller.style.display = ""; } - if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { - d.gutterFiller.style.display = "block"; - d.gutterFiller.style.height = sizes.bottom + "px"; - d.gutterFiller.style.width = measure.gutterWidth + "px"; - } else { d.gutterFiller.style.display = ""; } - } - - var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; - - function initScrollbars(cm) { - if (cm.display.scrollbars) { - cm.display.scrollbars.clear(); - if (cm.display.scrollbars.addClass) - { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } - } - - cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { - cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); - // Prevent clicks in the scrollbars from killing focus - on(node, "mousedown", function () { - if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } - }); - node.setAttribute("cm-not-content", "true"); - }, function (pos, axis) { - if (axis == "horizontal") { setScrollLeft(cm, pos); } - else { updateScrollTop(cm, pos); } - }, cm); - if (cm.display.scrollbars.addClass) - { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } - } - - // Operations are used to wrap a series of changes to the editor - // state in such a way that each change won't have to update the - // cursor and display (which would be awkward, slow, and - // error-prone). Instead, display updates are batched and then all - // combined and executed at once. - - var nextOpId = 0; - // Start a new operation. - function startOperation(cm) { - cm.curOp = { - cm: cm, - viewChanged: false, // Flag that indicates that lines might need to be redrawn - startHeight: cm.doc.height, // Used to detect need to update scrollbar - forceUpdate: false, // Used to force a redraw - updateInput: 0, // Whether to reset the input textarea - typing: false, // Whether this reset should be careful to leave existing text (for compositing) - changeObjs: null, // Accumulated changes, for firing change events - cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on - cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already - selectionChanged: false, // Whether the selection needs to be redrawn - updateMaxLine: false, // Set when the widest line needs to be determined anew - scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet - scrollToPos: null, // Used to scroll to a specific position - focus: false, - id: ++nextOpId // Unique ID - }; - pushOperation(cm.curOp); - } - - // Finish an operation, updating the display and signalling delayed events - function endOperation(cm) { - var op = cm.curOp; - if (op) { finishOperation(op, function (group) { - for (var i = 0; i < group.ops.length; i++) - { group.ops[i].cm.curOp = null; } - endOperations(group); - }); } - } - - // The DOM updates done when an operation finishes are batched so - // that the minimum number of relayouts are required. - function endOperations(group) { - var ops = group.ops; - for (var i = 0; i < ops.length; i++) // Read DOM - { endOperation_R1(ops[i]); } - for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) - { endOperation_W1(ops[i$1]); } - for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM - { endOperation_R2(ops[i$2]); } - for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) - { endOperation_W2(ops[i$3]); } - for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM - { endOperation_finish(ops[i$4]); } - } - - function endOperation_R1(op) { - var cm = op.cm, display = cm.display; - maybeClipScrollbars(cm); - if (op.updateMaxLine) { findMaxLine(cm); } - - op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || - op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || - op.scrollToPos.to.line >= display.viewTo) || - display.maxLineChanged && cm.options.lineWrapping; - op.update = op.mustUpdate && - new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); - } - - function endOperation_W1(op) { - op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); - } - - function endOperation_R2(op) { - var cm = op.cm, display = cm.display; - if (op.updatedDisplay) { updateHeightsInViewport(cm); } - - op.barMeasure = measureForScrollbars(cm); - - // If the max line changed since it was last measured, measure it, - // and ensure the document's width matches it. - // updateDisplay_W2 will use these properties to do the actual resizing - if (display.maxLineChanged && !cm.options.lineWrapping) { - op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; - cm.display.sizerWidth = op.adjustWidthTo; - op.barMeasure.scrollWidth = - Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); - op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); - } - - if (op.updatedDisplay || op.selectionChanged) - { op.preparedSelection = display.input.prepareSelection(); } - } - - function endOperation_W2(op) { - var cm = op.cm; - - if (op.adjustWidthTo != null) { - cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; - if (op.maxScrollLeft < cm.doc.scrollLeft) - { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } - cm.display.maxLineChanged = false; - } - - var takeFocus = op.focus && op.focus == activeElt(); - if (op.preparedSelection) - { cm.display.input.showSelection(op.preparedSelection, takeFocus); } - if (op.updatedDisplay || op.startHeight != cm.doc.height) - { updateScrollbars(cm, op.barMeasure); } - if (op.updatedDisplay) - { setDocumentHeight(cm, op.barMeasure); } - - if (op.selectionChanged) { restartBlink(cm); } - - if (cm.state.focused && op.updateInput) - { cm.display.input.reset(op.typing); } - if (takeFocus) { ensureFocus(op.cm); } - } - - function endOperation_finish(op) { - var cm = op.cm, display = cm.display, doc = cm.doc; - - if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } - - // Abort mouse wheel delta measurement, when scrolling explicitly - if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) - { display.wheelStartX = display.wheelStartY = null; } - - // Propagate the scroll position to the actual DOM scroller - if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } - - if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } - // If we need to scroll a specific position into view, do so. - if (op.scrollToPos) { - var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), - clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); - maybeScrollWindow(cm, rect); - } - - // Fire events for markers that are hidden/unidden by editing or - // undoing - var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; - if (hidden) { for (var i = 0; i < hidden.length; ++i) - { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } - if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) - { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } - - if (display.wrapper.offsetHeight) - { doc.scrollTop = cm.display.scroller.scrollTop; } - - // Fire change events, and delayed event handlers - if (op.changeObjs) - { signal(cm, "changes", cm, op.changeObjs); } - if (op.update) - { op.update.finish(); } - } - - // Run the given function in an operation - function runInOp(cm, f) { - if (cm.curOp) { return f() } - startOperation(cm); - try { return f() } - finally { endOperation(cm); } - } - // Wraps a function in an operation. Returns the wrapped function. - function operation(cm, f) { - return function() { - if (cm.curOp) { return f.apply(cm, arguments) } - startOperation(cm); - try { return f.apply(cm, arguments) } - finally { endOperation(cm); } - } - } - // Used to add methods to editor and doc instances, wrapping them in - // operations. - function methodOp(f) { - return function() { - if (this.curOp) { return f.apply(this, arguments) } - startOperation(this); - try { return f.apply(this, arguments) } - finally { endOperation(this); } - } - } - function docMethodOp(f) { - return function() { - var cm = this.cm; - if (!cm || cm.curOp) { return f.apply(this, arguments) } - startOperation(cm); - try { return f.apply(this, arguments) } - finally { endOperation(cm); } - } - } - - // HIGHLIGHT WORKER - - function startWorker(cm, time) { - if (cm.doc.highlightFrontier < cm.display.viewTo) - { cm.state.highlight.set(time, bind(highlightWorker, cm)); } - } - - function highlightWorker(cm) { - var doc = cm.doc; - if (doc.highlightFrontier >= cm.display.viewTo) { return } - var end = +new Date + cm.options.workTime; - var context = getContextBefore(cm, doc.highlightFrontier); - var changedLines = []; - - doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { - if (context.line >= cm.display.viewFrom) { // Visible - var oldStyles = line.styles; - var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; - var highlighted = highlightLine(cm, line, context, true); - if (resetState) { context.state = resetState; } - line.styles = highlighted.styles; - var oldCls = line.styleClasses, newCls = highlighted.classes; - if (newCls) { line.styleClasses = newCls; } - else if (oldCls) { line.styleClasses = null; } - var ischange = !oldStyles || oldStyles.length != line.styles.length || - oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); - for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } - if (ischange) { changedLines.push(context.line); } - line.stateAfter = context.save(); - context.nextLine(); - } else { - if (line.text.length <= cm.options.maxHighlightLength) - { processLine(cm, line.text, context); } - line.stateAfter = context.line % 5 == 0 ? context.save() : null; - context.nextLine(); - } - if (+new Date > end) { - startWorker(cm, cm.options.workDelay); - return true - } - }); - doc.highlightFrontier = context.line; - doc.modeFrontier = Math.max(doc.modeFrontier, context.line); - if (changedLines.length) { runInOp(cm, function () { - for (var i = 0; i < changedLines.length; i++) - { regLineChange(cm, changedLines[i], "text"); } - }); } - } - - // DISPLAY DRAWING - - var DisplayUpdate = function(cm, viewport, force) { - var display = cm.display; - - this.viewport = viewport; - // Store some values that we'll need later (but don't want to force a relayout for) - this.visible = visibleLines(display, cm.doc, viewport); - this.editorIsHidden = !display.wrapper.offsetWidth; - this.wrapperHeight = display.wrapper.clientHeight; - this.wrapperWidth = display.wrapper.clientWidth; - this.oldDisplayWidth = displayWidth(cm); - this.force = force; - this.dims = getDimensions(cm); - this.events = []; - }; - - DisplayUpdate.prototype.signal = function (emitter, type) { - if (hasHandler(emitter, type)) - { this.events.push(arguments); } - }; - DisplayUpdate.prototype.finish = function () { - for (var i = 0; i < this.events.length; i++) - { signal.apply(null, this.events[i]); } - }; - - function maybeClipScrollbars(cm) { - var display = cm.display; - if (!display.scrollbarsClipped && display.scroller.offsetWidth) { - display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; - display.heightForcer.style.height = scrollGap(cm) + "px"; - display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; - display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; - display.scrollbarsClipped = true; - } - } - - function selectionSnapshot(cm) { - if (cm.hasFocus()) { return null } - var active = activeElt(); - if (!active || !contains(cm.display.lineDiv, active)) { return null } - var result = {activeElt: active}; - if (window.getSelection) { - var sel = window.getSelection(); - if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { - result.anchorNode = sel.anchorNode; - result.anchorOffset = sel.anchorOffset; - result.focusNode = sel.focusNode; - result.focusOffset = sel.focusOffset; - } - } - return result - } - - function restoreSelection(snapshot) { - if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } - snapshot.activeElt.focus(); - if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && - snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { - var sel = window.getSelection(), range = document.createRange(); - range.setEnd(snapshot.anchorNode, snapshot.anchorOffset); - range.collapse(false); - sel.removeAllRanges(); - sel.addRange(range); - sel.extend(snapshot.focusNode, snapshot.focusOffset); - } - } - - // Does the actual updating of the line display. Bails out - // (returning false) when there is nothing to be done and forced is - // false. - function updateDisplayIfNeeded(cm, update) { - var display = cm.display, doc = cm.doc; - - if (update.editorIsHidden) { - resetView(cm); - return false - } - - // Bail out if the visible area is already rendered and nothing changed. - if (!update.force && - update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && - (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && - display.renderedView == display.view && countDirtyView(cm) == 0) - { return false } - - if (maybeUpdateLineNumberWidth(cm)) { - resetView(cm); - update.dims = getDimensions(cm); - } - - // Compute a suitable new viewport (from & to) - var end = doc.first + doc.size; - var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); - var to = Math.min(end, update.visible.to + cm.options.viewportMargin); - if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } - if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } - if (sawCollapsedSpans) { - from = visualLineNo(cm.doc, from); - to = visualLineEndNo(cm.doc, to); - } - - var different = from != display.viewFrom || to != display.viewTo || - display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; - adjustView(cm, from, to); - - display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); - // Position the mover div to align with the current scroll position - cm.display.mover.style.top = display.viewOffset + "px"; - - var toUpdate = countDirtyView(cm); - if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && - (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) - { return false } - - // For big changes, we hide the enclosing element during the - // update, since that speeds up the operations on most browsers. - var selSnapshot = selectionSnapshot(cm); - if (toUpdate > 4) { display.lineDiv.style.display = "none"; } - patchDisplay(cm, display.updateLineNumbers, update.dims); - if (toUpdate > 4) { display.lineDiv.style.display = ""; } - display.renderedView = display.view; - // There might have been a widget with a focused element that got - // hidden or updated, if so re-focus it. - restoreSelection(selSnapshot); - - // Prevent selection and cursors from interfering with the scroll - // width and height. - removeChildren(display.cursorDiv); - removeChildren(display.selectionDiv); - display.gutters.style.height = display.sizer.style.minHeight = 0; - - if (different) { - display.lastWrapHeight = update.wrapperHeight; - display.lastWrapWidth = update.wrapperWidth; - startWorker(cm, 400); - } - - display.updateLineNumbers = null; - - return true - } - - function postUpdateDisplay(cm, update) { - var viewport = update.viewport; - - for (var first = true;; first = false) { - if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { - // Clip forced viewport to actual scrollable area. - if (viewport && viewport.top != null) - { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } - // Updated line heights might result in the drawn area not - // actually covering the viewport. Keep looping until it does. - update.visible = visibleLines(cm.display, cm.doc, viewport); - if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) - { break } - } else if (first) { - update.visible = visibleLines(cm.display, cm.doc, viewport); - } - if (!updateDisplayIfNeeded(cm, update)) { break } - updateHeightsInViewport(cm); - var barMeasure = measureForScrollbars(cm); - updateSelection(cm); - updateScrollbars(cm, barMeasure); - setDocumentHeight(cm, barMeasure); - update.force = false; - } - - update.signal(cm, "update", cm); - if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { - update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); - cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; - } - } - - function updateDisplaySimple(cm, viewport) { - var update = new DisplayUpdate(cm, viewport); - if (updateDisplayIfNeeded(cm, update)) { - updateHeightsInViewport(cm); - postUpdateDisplay(cm, update); - var barMeasure = measureForScrollbars(cm); - updateSelection(cm); - updateScrollbars(cm, barMeasure); - setDocumentHeight(cm, barMeasure); - update.finish(); - } - } - - // Sync the actual display DOM structure with display.view, removing - // nodes for lines that are no longer in view, and creating the ones - // that are not there yet, and updating the ones that are out of - // date. - function patchDisplay(cm, updateNumbersFrom, dims) { - var display = cm.display, lineNumbers = cm.options.lineNumbers; - var container = display.lineDiv, cur = container.firstChild; - - function rm(node) { - var next = node.nextSibling; - // Works around a throw-scroll bug in OS X Webkit - if (webkit && mac && cm.display.currentWheelTarget == node) - { node.style.display = "none"; } - else - { node.parentNode.removeChild(node); } - return next - } - - var view = display.view, lineN = display.viewFrom; - // Loop over the elements in the view, syncing cur (the DOM nodes - // in display.lineDiv) with the view as we go. - for (var i = 0; i < view.length; i++) { - var lineView = view[i]; - if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet - var node = buildLineElement(cm, lineView, lineN, dims); - container.insertBefore(node, cur); - } else { // Already drawn - while (cur != lineView.node) { cur = rm(cur); } - var updateNumber = lineNumbers && updateNumbersFrom != null && - updateNumbersFrom <= lineN && lineView.lineNumber; - if (lineView.changes) { - if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } - updateLineForChanges(cm, lineView, lineN, dims); - } - if (updateNumber) { - removeChildren(lineView.lineNumber); - lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); - } - cur = lineView.node.nextSibling; - } - lineN += lineView.size; - } - while (cur) { cur = rm(cur); } - } - - function updateGutterSpace(display) { - var width = display.gutters.offsetWidth; - display.sizer.style.marginLeft = width + "px"; - } - - function setDocumentHeight(cm, measure) { - cm.display.sizer.style.minHeight = measure.docHeight + "px"; - cm.display.heightForcer.style.top = measure.docHeight + "px"; - cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; - } - - // Re-align line numbers and gutter marks to compensate for - // horizontal scrolling. - function alignHorizontally(cm) { - var display = cm.display, view = display.view; - if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } - var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; - var gutterW = display.gutters.offsetWidth, left = comp + "px"; - for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { - if (cm.options.fixedGutter) { - if (view[i].gutter) - { view[i].gutter.style.left = left; } - if (view[i].gutterBackground) - { view[i].gutterBackground.style.left = left; } - } - var align = view[i].alignable; - if (align) { for (var j = 0; j < align.length; j++) - { align[j].style.left = left; } } - } } - if (cm.options.fixedGutter) - { display.gutters.style.left = (comp + gutterW) + "px"; } - } - - // Used to ensure that the line number gutter is still the right - // size for the current document size. Returns true when an update - // is needed. - function maybeUpdateLineNumberWidth(cm) { - if (!cm.options.lineNumbers) { return false } - var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; - if (last.length != display.lineNumChars) { - var test = display.measure.appendChild(elt("div", [elt("div", last)], - "CodeMirror-linenumber CodeMirror-gutter-elt")); - var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; - display.lineGutter.style.width = ""; - display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; - display.lineNumWidth = display.lineNumInnerWidth + padding; - display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; - display.lineGutter.style.width = display.lineNumWidth + "px"; - updateGutterSpace(cm.display); - return true - } - return false - } - - function getGutters(gutters, lineNumbers) { - var result = [], sawLineNumbers = false; - for (var i = 0; i < gutters.length; i++) { - var name = gutters[i], style = null; - if (typeof name != "string") { style = name.style; name = name.className; } - if (name == "CodeMirror-linenumbers") { - if (!lineNumbers) { continue } - else { sawLineNumbers = true; } - } - result.push({className: name, style: style}); - } - if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } - return result - } - - // Rebuild the gutter elements, ensure the margin to the left of the - // code matches their width. - function renderGutters(display) { - var gutters = display.gutters, specs = display.gutterSpecs; - removeChildren(gutters); - display.lineGutter = null; - for (var i = 0; i < specs.length; ++i) { - var ref = specs[i]; - var className = ref.className; - var style = ref.style; - var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); - if (style) { gElt.style.cssText = style; } - if (className == "CodeMirror-linenumbers") { - display.lineGutter = gElt; - gElt.style.width = (display.lineNumWidth || 1) + "px"; - } - } - gutters.style.display = specs.length ? "" : "none"; - updateGutterSpace(display); - } - - function updateGutters(cm) { - renderGutters(cm.display); - regChange(cm); - alignHorizontally(cm); - } - - // The display handles the DOM integration, both for input reading - // and content drawing. It holds references to DOM nodes and - // display-related state. - - function Display(place, doc, input, options) { - var d = this; - this.input = input; - - // Covers bottom-right square when both scrollbars are present. - d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); - d.scrollbarFiller.setAttribute("cm-not-content", "true"); - // Covers bottom of gutter when coverGutterNextToScrollbar is on - // and h scrollbar is present. - d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); - d.gutterFiller.setAttribute("cm-not-content", "true"); - // Will contain the actual code, positioned to cover the viewport. - d.lineDiv = eltP("div", null, "CodeMirror-code"); - // Elements are added to these to represent selection and cursors. - d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); - d.cursorDiv = elt("div", null, "CodeMirror-cursors"); - // A visibility: hidden element used to find the size of things. - d.measure = elt("div", null, "CodeMirror-measure"); - // When lines outside of the viewport are measured, they are drawn in this. - d.lineMeasure = elt("div", null, "CodeMirror-measure"); - // Wraps everything that needs to exist inside the vertically-padded coordinate system - d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], - null, "position: relative; outline: none"); - var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); - // Moved around its parent to cover visible view. - d.mover = elt("div", [lines], null, "position: relative"); - // Set to the height of the document, allowing scrolling. - d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); - d.sizerWidth = null; - // Behavior of elts with overflow: auto and padding is - // inconsistent across browsers. This is used to ensure the - // scrollable area is big enough. - d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); - // Will contain the gutters, if any. - d.gutters = elt("div", null, "CodeMirror-gutters"); - d.lineGutter = null; - // Actual scrollable element. - d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); - d.scroller.setAttribute("tabIndex", "-1"); - // The element in which the editor lives. - d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); - - // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) - if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } - if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } - - if (place) { - if (place.appendChild) { place.appendChild(d.wrapper); } - else { place(d.wrapper); } - } - - // Current rendered range (may be bigger than the view window). - d.viewFrom = d.viewTo = doc.first; - d.reportedViewFrom = d.reportedViewTo = doc.first; - // Information about the rendered lines. - d.view = []; - d.renderedView = null; - // Holds info about a single rendered line when it was rendered - // for measurement, while not in view. - d.externalMeasured = null; - // Empty space (in pixels) above the view - d.viewOffset = 0; - d.lastWrapHeight = d.lastWrapWidth = 0; - d.updateLineNumbers = null; - - d.nativeBarWidth = d.barHeight = d.barWidth = 0; - d.scrollbarsClipped = false; - - // Used to only resize the line number gutter when necessary (when - // the amount of lines crosses a boundary that makes its width change) - d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; - // Set to true when a non-horizontal-scrolling line widget is - // added. As an optimization, line widget aligning is skipped when - // this is false. - d.alignWidgets = false; - - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; - - // Tracks the maximum line length so that the horizontal scrollbar - // can be kept static when scrolling. - d.maxLine = null; - d.maxLineLength = 0; - d.maxLineChanged = false; - - // Used for measuring wheel scrolling granularity - d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; - - // True when shift is held down. - d.shift = false; - - // Used to track whether anything happened since the context menu - // was opened. - d.selForContextMenu = null; - - d.activeTouch = null; - - d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); - renderGutters(d); - - input.init(d); - } - - // Since the delta values reported on mouse wheel events are - // unstandardized between browsers and even browser versions, and - // generally horribly unpredictable, this code starts by measuring - // the scroll effect that the first few mouse wheel events have, - // and, from that, detects the way it can convert deltas to pixel - // offsets afterwards. - // - // The reason we want to know the amount a wheel event will scroll - // is that it gives us a chance to update the display before the - // actual scrolling happens, reducing flickering. - - var wheelSamples = 0, wheelPixelsPerUnit = null; - // Fill in a browser-detected starting value on browsers where we - // know one. These don't have to be accurate -- the result of them - // being wrong would just be a slight flicker on the first wheel - // scroll (if it is large enough). - if (ie) { wheelPixelsPerUnit = -.53; } - else if (gecko) { wheelPixelsPerUnit = 15; } - else if (chrome) { wheelPixelsPerUnit = -.7; } - else if (safari) { wheelPixelsPerUnit = -1/3; } - - function wheelEventDelta(e) { - var dx = e.wheelDeltaX, dy = e.wheelDeltaY; - if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } - if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } - else if (dy == null) { dy = e.wheelDelta; } - return {x: dx, y: dy} - } - function wheelEventPixels(e) { - var delta = wheelEventDelta(e); - delta.x *= wheelPixelsPerUnit; - delta.y *= wheelPixelsPerUnit; - return delta - } - - function onScrollWheel(cm, e) { - var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; - - var display = cm.display, scroll = display.scroller; - // Quit if there's nothing to scroll here - var canScrollX = scroll.scrollWidth > scroll.clientWidth; - var canScrollY = scroll.scrollHeight > scroll.clientHeight; - if (!(dx && canScrollX || dy && canScrollY)) { return } - - // Webkit browsers on OS X abort momentum scrolls when the target - // of the scroll event is removed from the scrollable element. - // This hack (see related code in patchDisplay) makes sure the - // element is kept around. - if (dy && mac && webkit) { - outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { - for (var i = 0; i < view.length; i++) { - if (view[i].node == cur) { - cm.display.currentWheelTarget = cur; - break outer - } - } - } - } - - // On some browsers, horizontal scrolling will cause redraws to - // happen before the gutter has been realigned, causing it to - // wriggle around in a most unseemly way. When we have an - // estimated pixels/delta value, we just handle horizontal - // scrolling entirely here. It'll be slightly off from native, but - // better than glitching out. - if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { - if (dy && canScrollY) - { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); } - setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit)); - // Only prevent default scrolling if vertical scrolling is - // actually possible. Otherwise, it causes vertical scroll - // jitter on OSX trackpads when deltaX is small and deltaY - // is large (issue #3579) - if (!dy || (dy && canScrollY)) - { e_preventDefault(e); } - display.wheelStartX = null; // Abort measurement, if in progress - return - } - - // 'Project' the visible viewport to cover the area that is being - // scrolled into view (if we know enough to estimate it). - if (dy && wheelPixelsPerUnit != null) { - var pixels = dy * wheelPixelsPerUnit; - var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; - if (pixels < 0) { top = Math.max(0, top + pixels - 50); } - else { bot = Math.min(cm.doc.height, bot + pixels + 50); } - updateDisplaySimple(cm, {top: top, bottom: bot}); - } - - if (wheelSamples < 20) { - if (display.wheelStartX == null) { - display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; - display.wheelDX = dx; display.wheelDY = dy; - setTimeout(function () { - if (display.wheelStartX == null) { return } - var movedX = scroll.scrollLeft - display.wheelStartX; - var movedY = scroll.scrollTop - display.wheelStartY; - var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || - (movedX && display.wheelDX && movedX / display.wheelDX); - display.wheelStartX = display.wheelStartY = null; - if (!sample) { return } - wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); - ++wheelSamples; - }, 200); - } else { - display.wheelDX += dx; display.wheelDY += dy; - } - } - } - - // Selection objects are immutable. A new one is created every time - // the selection changes. A selection is one or more non-overlapping - // (and non-touching) ranges, sorted, and an integer that indicates - // which one is the primary selection (the one that's scrolled into - // view, that getCursor returns, etc). - var Selection = function(ranges, primIndex) { - this.ranges = ranges; - this.primIndex = primIndex; - }; - - Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; - - Selection.prototype.equals = function (other) { - if (other == this) { return true } - if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } - for (var i = 0; i < this.ranges.length; i++) { - var here = this.ranges[i], there = other.ranges[i]; - if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } - } - return true - }; - - Selection.prototype.deepCopy = function () { - var out = []; - for (var i = 0; i < this.ranges.length; i++) - { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); } - return new Selection(out, this.primIndex) - }; - - Selection.prototype.somethingSelected = function () { - for (var i = 0; i < this.ranges.length; i++) - { if (!this.ranges[i].empty()) { return true } } - return false - }; - - Selection.prototype.contains = function (pos, end) { - if (!end) { end = pos; } - for (var i = 0; i < this.ranges.length; i++) { - var range = this.ranges[i]; - if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) - { return i } - } - return -1 - }; - - var Range = function(anchor, head) { - this.anchor = anchor; this.head = head; - }; - - Range.prototype.from = function () { return minPos(this.anchor, this.head) }; - Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; - Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; - - // Take an unsorted, potentially overlapping set of ranges, and - // build a selection out of it. 'Consumes' ranges array (modifying - // it). - function normalizeSelection(cm, ranges, primIndex) { - var mayTouch = cm && cm.options.selectionsMayTouch; - var prim = ranges[primIndex]; - ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); - primIndex = indexOf(ranges, prim); - for (var i = 1; i < ranges.length; i++) { - var cur = ranges[i], prev = ranges[i - 1]; - var diff = cmp(prev.to(), cur.from()); - if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { - var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); - var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; - if (i <= primIndex) { --primIndex; } - ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); - } - } - return new Selection(ranges, primIndex) - } - - function simpleSelection(anchor, head) { - return new Selection([new Range(anchor, head || anchor)], 0) - } - - // Compute the position of the end of a change (its 'to' property - // refers to the pre-change end). - function changeEnd(change) { - if (!change.text) { return change.to } - return Pos(change.from.line + change.text.length - 1, - lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) - } - - // Adjust a position to refer to the post-change position of the - // same text, or the end of the change if the change covers it. - function adjustForChange(pos, change) { - if (cmp(pos, change.from) < 0) { return pos } - if (cmp(pos, change.to) <= 0) { return changeEnd(change) } - - var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; - if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } - return Pos(line, ch) - } - - function computeSelAfterChange(doc, change) { - var out = []; - for (var i = 0; i < doc.sel.ranges.length; i++) { - var range = doc.sel.ranges[i]; - out.push(new Range(adjustForChange(range.anchor, change), - adjustForChange(range.head, change))); - } - return normalizeSelection(doc.cm, out, doc.sel.primIndex) - } - - function offsetPos(pos, old, nw) { - if (pos.line == old.line) - { return Pos(nw.line, pos.ch - old.ch + nw.ch) } - else - { return Pos(nw.line + (pos.line - old.line), pos.ch) } - } - - // Used by replaceSelections to allow moving the selection to the - // start or around the replaced test. Hint may be "start" or "around". - function computeReplacedSel(doc, changes, hint) { - var out = []; - var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; - for (var i = 0; i < changes.length; i++) { - var change = changes[i]; - var from = offsetPos(change.from, oldPrev, newPrev); - var to = offsetPos(changeEnd(change), oldPrev, newPrev); - oldPrev = change.to; - newPrev = to; - if (hint == "around") { - var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; - out[i] = new Range(inv ? to : from, inv ? from : to); - } else { - out[i] = new Range(from, from); - } - } - return new Selection(out, doc.sel.primIndex) - } - - // Used to get the editor into a consistent state again when options change. - - function loadMode(cm) { - cm.doc.mode = getMode(cm.options, cm.doc.modeOption); - resetModeState(cm); - } - - function resetModeState(cm) { - cm.doc.iter(function (line) { - if (line.stateAfter) { line.stateAfter = null; } - if (line.styles) { line.styles = null; } - }); - cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; - startWorker(cm, 100); - cm.state.modeGen++; - if (cm.curOp) { regChange(cm); } - } - - // DOCUMENT DATA STRUCTURE - - // By default, updates that start and end at the beginning of a line - // are treated specially, in order to make the association of line - // widgets and marker elements with the text behave more intuitive. - function isWholeLineUpdate(doc, change) { - return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && - (!doc.cm || doc.cm.options.wholeLineUpdateBefore) - } - - // Perform a change on the document data structure. - function updateDoc(doc, change, markedSpans, estimateHeight) { - function spansFor(n) {return markedSpans ? markedSpans[n] : null} - function update(line, text, spans) { - updateLine(line, text, spans, estimateHeight); - signalLater(line, "change", line, change); - } - function linesFor(start, end) { - var result = []; - for (var i = start; i < end; ++i) - { result.push(new Line(text[i], spansFor(i), estimateHeight)); } - return result - } - - var from = change.from, to = change.to, text = change.text; - var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); - var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; - - // Adjust the line structure - if (change.full) { - doc.insert(0, linesFor(0, text.length)); - doc.remove(text.length, doc.size - text.length); - } else if (isWholeLineUpdate(doc, change)) { - // This is a whole-line replace. Treated specially to make - // sure line objects move the way they are supposed to. - var added = linesFor(0, text.length - 1); - update(lastLine, lastLine.text, lastSpans); - if (nlines) { doc.remove(from.line, nlines); } - if (added.length) { doc.insert(from.line, added); } - } else if (firstLine == lastLine) { - if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); - } else { - var added$1 = linesFor(1, text.length - 1); - added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); - doc.insert(from.line + 1, added$1); - } - } else if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); - doc.remove(from.line + 1, nlines); - } else { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); - update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); - var added$2 = linesFor(1, text.length - 1); - if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } - doc.insert(from.line + 1, added$2); - } - - signalLater(doc, "change", doc, change); - } - - // Call f for all linked documents. - function linkedDocs(doc, f, sharedHistOnly) { - function propagate(doc, skip, sharedHist) { - if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { - var rel = doc.linked[i]; - if (rel.doc == skip) { continue } - var shared = sharedHist && rel.sharedHist; - if (sharedHistOnly && !shared) { continue } - f(rel.doc, shared); - propagate(rel.doc, doc, shared); - } } - } - propagate(doc, null, true); - } - - // Attach a document to an editor. - function attachDoc(cm, doc) { - if (doc.cm) { throw new Error("This document is already in use.") } - cm.doc = doc; - doc.cm = cm; - estimateLineHeights(cm); - loadMode(cm); - setDirectionClass(cm); - if (!cm.options.lineWrapping) { findMaxLine(cm); } - cm.options.mode = doc.modeOption; - regChange(cm); - } - - function setDirectionClass(cm) { - (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); - } - - function directionChanged(cm) { - runInOp(cm, function () { - setDirectionClass(cm); - regChange(cm); - }); - } - - function History(startGen) { - // Arrays of change events and selections. Doing something adds an - // event to done and clears undo. Undoing moves events from done - // to undone, redoing moves them in the other direction. - this.done = []; this.undone = []; - this.undoDepth = Infinity; - // Used to track when changes can be merged into a single undo - // event - this.lastModTime = this.lastSelTime = 0; - this.lastOp = this.lastSelOp = null; - this.lastOrigin = this.lastSelOrigin = null; - // Used by the isClean() method - this.generation = this.maxGeneration = startGen || 1; - } - - // Create a history change event from an updateDoc-style change - // object. - function historyChangeFromChange(doc, change) { - var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; - attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); - linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); - return histChange - } - - // Pop all selection events off the end of a history array. Stop at - // a change event. - function clearSelectionEvents(array) { - while (array.length) { - var last = lst(array); - if (last.ranges) { array.pop(); } - else { break } - } - } - - // Find the top change event in the history. Pop off selection - // events that are in the way. - function lastChangeEvent(hist, force) { - if (force) { - clearSelectionEvents(hist.done); - return lst(hist.done) - } else if (hist.done.length && !lst(hist.done).ranges) { - return lst(hist.done) - } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { - hist.done.pop(); - return lst(hist.done) - } - } - - // Register a change in the history. Merges changes that are within - // a single operation, or are close together with an origin that - // allows merging (starting with "+") into a single event. - function addChangeToHistory(doc, change, selAfter, opId) { - var hist = doc.history; - hist.undone.length = 0; - var time = +new Date, cur; - var last; - - if ((hist.lastOp == opId || - hist.lastOrigin == change.origin && change.origin && - ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || - change.origin.charAt(0) == "*")) && - (cur = lastChangeEvent(hist, hist.lastOp == opId))) { - // Merge this change into the last event - last = lst(cur.changes); - if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { - // Optimized case for simple insertion -- don't want to add - // new changesets for every character typed - last.to = changeEnd(change); - } else { - // Add new sub-event - cur.changes.push(historyChangeFromChange(doc, change)); - } - } else { - // Can not be merged, start a new event. - var before = lst(hist.done); - if (!before || !before.ranges) - { pushSelectionToHistory(doc.sel, hist.done); } - cur = {changes: [historyChangeFromChange(doc, change)], - generation: hist.generation}; - hist.done.push(cur); - while (hist.done.length > hist.undoDepth) { - hist.done.shift(); - if (!hist.done[0].ranges) { hist.done.shift(); } - } - } - hist.done.push(selAfter); - hist.generation = ++hist.maxGeneration; - hist.lastModTime = hist.lastSelTime = time; - hist.lastOp = hist.lastSelOp = opId; - hist.lastOrigin = hist.lastSelOrigin = change.origin; - - if (!last) { signal(doc, "historyAdded"); } - } - - function selectionEventCanBeMerged(doc, origin, prev, sel) { - var ch = origin.charAt(0); - return ch == "*" || - ch == "+" && - prev.ranges.length == sel.ranges.length && - prev.somethingSelected() == sel.somethingSelected() && - new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) - } - - // Called whenever the selection changes, sets the new selection as - // the pending selection in the history, and pushes the old pending - // selection into the 'done' array when it was significantly - // different (in number of selected ranges, emptiness, or time). - function addSelectionToHistory(doc, sel, opId, options) { - var hist = doc.history, origin = options && options.origin; - - // A new event is started when the previous origin does not match - // the current, or the origins don't allow matching. Origins - // starting with * are always merged, those starting with + are - // merged when similar and close together in time. - if (opId == hist.lastSelOp || - (origin && hist.lastSelOrigin == origin && - (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || - selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) - { hist.done[hist.done.length - 1] = sel; } - else - { pushSelectionToHistory(sel, hist.done); } - - hist.lastSelTime = +new Date; - hist.lastSelOrigin = origin; - hist.lastSelOp = opId; - if (options && options.clearRedo !== false) - { clearSelectionEvents(hist.undone); } - } - - function pushSelectionToHistory(sel, dest) { - var top = lst(dest); - if (!(top && top.ranges && top.equals(sel))) - { dest.push(sel); } - } - - // Used to store marked span information in the history. - function attachLocalSpans(doc, change, from, to) { - var existing = change["spans_" + doc.id], n = 0; - doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { - if (line.markedSpans) - { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } - ++n; - }); - } - - // When un/re-doing restores text containing marked spans, those - // that have been explicitly cleared should not be restored. - function removeClearedSpans(spans) { - if (!spans) { return null } - var out; - for (var i = 0; i < spans.length; ++i) { - if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } - else if (out) { out.push(spans[i]); } - } - return !out ? spans : out.length ? out : null - } - - // Retrieve and filter the old marked spans stored in a change event. - function getOldSpans(doc, change) { - var found = change["spans_" + doc.id]; - if (!found) { return null } - var nw = []; - for (var i = 0; i < change.text.length; ++i) - { nw.push(removeClearedSpans(found[i])); } - return nw - } - - // Used for un/re-doing changes from the history. Combines the - // result of computing the existing spans with the set of spans that - // existed in the history (so that deleting around a span and then - // undoing brings back the span). - function mergeOldSpans(doc, change) { - var old = getOldSpans(doc, change); - var stretched = stretchSpansOverChange(doc, change); - if (!old) { return stretched } - if (!stretched) { return old } - - for (var i = 0; i < old.length; ++i) { - var oldCur = old[i], stretchCur = stretched[i]; - if (oldCur && stretchCur) { - spans: for (var j = 0; j < stretchCur.length; ++j) { - var span = stretchCur[j]; - for (var k = 0; k < oldCur.length; ++k) - { if (oldCur[k].marker == span.marker) { continue spans } } - oldCur.push(span); - } - } else if (stretchCur) { - old[i] = stretchCur; - } - } - return old - } - - // Used both to provide a JSON-safe object in .getHistory, and, when - // detaching a document, to split the history in two - function copyHistoryArray(events, newGroup, instantiateSel) { - var copy = []; - for (var i = 0; i < events.length; ++i) { - var event = events[i]; - if (event.ranges) { - copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); - continue - } - var changes = event.changes, newChanges = []; - copy.push({changes: newChanges}); - for (var j = 0; j < changes.length; ++j) { - var change = changes[j], m = (void 0); - newChanges.push({from: change.from, to: change.to, text: change.text}); - if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { - if (indexOf(newGroup, Number(m[1])) > -1) { - lst(newChanges)[prop] = change[prop]; - delete change[prop]; - } - } } } - } - } - return copy - } - - // The 'scroll' parameter given to many of these indicated whether - // the new cursor position should be scrolled into view after - // modifying the selection. - - // If shift is held or the extend flag is set, extends a range to - // include a given position (and optionally a second position). - // Otherwise, simply returns the range between the given positions. - // Used for cursor motion and such. - function extendRange(range, head, other, extend) { - if (extend) { - var anchor = range.anchor; - if (other) { - var posBefore = cmp(head, anchor) < 0; - if (posBefore != (cmp(other, anchor) < 0)) { - anchor = head; - head = other; - } else if (posBefore != (cmp(head, other) < 0)) { - head = other; - } - } - return new Range(anchor, head) - } else { - return new Range(other || head, head) - } - } - - // Extend the primary selection range, discard the rest. - function extendSelection(doc, head, other, options, extend) { - if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } - setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); - } - - // Extend all selections (pos is an array of selections with length - // equal the number of selections) - function extendSelections(doc, heads, options) { - var out = []; - var extend = doc.cm && (doc.cm.display.shift || doc.extend); - for (var i = 0; i < doc.sel.ranges.length; i++) - { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } - var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); - setSelection(doc, newSel, options); - } - - // Updates a single range in the selection. - function replaceOneSelection(doc, i, range, options) { - var ranges = doc.sel.ranges.slice(0); - ranges[i] = range; - setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); - } - - // Reset the selection to a single range. - function setSimpleSelection(doc, anchor, head, options) { - setSelection(doc, simpleSelection(anchor, head), options); - } - - // Give beforeSelectionChange handlers a change to influence a - // selection update. - function filterSelectionChange(doc, sel, options) { - var obj = { - ranges: sel.ranges, - update: function(ranges) { - this.ranges = []; - for (var i = 0; i < ranges.length; i++) - { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), - clipPos(doc, ranges[i].head)); } - }, - origin: options && options.origin - }; - signal(doc, "beforeSelectionChange", doc, obj); - if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } - if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } - else { return sel } - } - - function setSelectionReplaceHistory(doc, sel, options) { - var done = doc.history.done, last = lst(done); - if (last && last.ranges) { - done[done.length - 1] = sel; - setSelectionNoUndo(doc, sel, options); - } else { - setSelection(doc, sel, options); - } - } - - // Set a new selection. - function setSelection(doc, sel, options) { - setSelectionNoUndo(doc, sel, options); - addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); - } - - function setSelectionNoUndo(doc, sel, options) { - if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) - { sel = filterSelectionChange(doc, sel, options); } - - var bias = options && options.bias || - (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); - setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); - - if (!(options && options.scroll === false) && doc.cm) - { ensureCursorVisible(doc.cm); } - } - - function setSelectionInner(doc, sel) { - if (sel.equals(doc.sel)) { return } - - doc.sel = sel; - - if (doc.cm) { - doc.cm.curOp.updateInput = 1; - doc.cm.curOp.selectionChanged = true; - signalCursorActivity(doc.cm); - } - signalLater(doc, "cursorActivity", doc); - } - - // Verify that the selection does not partially select any atomic - // marked ranges. - function reCheckSelection(doc) { - setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); - } - - // Return a selection that does not partially select any atomic - // ranges. - function skipAtomicInSelection(doc, sel, bias, mayClear) { - var out; - for (var i = 0; i < sel.ranges.length; i++) { - var range = sel.ranges[i]; - var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; - var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); - var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); - if (out || newAnchor != range.anchor || newHead != range.head) { - if (!out) { out = sel.ranges.slice(0, i); } - out[i] = new Range(newAnchor, newHead); - } - } - return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel - } - - function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { - var line = getLine(doc, pos.line); - if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { - var sp = line.markedSpans[i], m = sp.marker; - - // Determine if we should prevent the cursor being placed to the left/right of an atomic marker - // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it - // is with selectLeft/Right - var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; - var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; - - if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && - (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { - if (mayClear) { - signal(m, "beforeCursorEnter"); - if (m.explicitlyCleared) { - if (!line.markedSpans) { break } - else {--i; continue} - } - } - if (!m.atomic) { continue } - - if (oldPos) { - var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); - if (dir < 0 ? preventCursorRight : preventCursorLeft) - { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } - if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) - { return skipAtomicInner(doc, near, pos, dir, mayClear) } - } - - var far = m.find(dir < 0 ? -1 : 1); - if (dir < 0 ? preventCursorLeft : preventCursorRight) - { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } - return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null - } - } } - return pos - } - - // Ensure a given position is not inside an atomic range. - function skipAtomic(doc, pos, oldPos, bias, mayClear) { - var dir = bias || 1; - var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || - (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || - skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || - (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); - if (!found) { - doc.cantEdit = true; - return Pos(doc.first, 0) - } - return found - } - - function movePos(doc, pos, dir, line) { - if (dir < 0 && pos.ch == 0) { - if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } - else { return null } - } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { - if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } - else { return null } - } else { - return new Pos(pos.line, pos.ch + dir) - } - } - - function selectAll(cm) { - cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); - } - - // UPDATING - - // Allow "beforeChange" event handlers to influence a change - function filterChange(doc, change, update) { - var obj = { - canceled: false, - from: change.from, - to: change.to, - text: change.text, - origin: change.origin, - cancel: function () { return obj.canceled = true; } - }; - if (update) { obj.update = function (from, to, text, origin) { - if (from) { obj.from = clipPos(doc, from); } - if (to) { obj.to = clipPos(doc, to); } - if (text) { obj.text = text; } - if (origin !== undefined) { obj.origin = origin; } - }; } - signal(doc, "beforeChange", doc, obj); - if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } - - if (obj.canceled) { - if (doc.cm) { doc.cm.curOp.updateInput = 2; } - return null - } - return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} - } - - // Apply a change to a document, and add it to the document's - // history, and propagating it to all linked documents. - function makeChange(doc, change, ignoreReadOnly) { - if (doc.cm) { - if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } - if (doc.cm.state.suppressEdits) { return } - } - - if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { - change = filterChange(doc, change, true); - if (!change) { return } - } - - // Possibly split or suppress the update based on the presence - // of read-only spans in its range. - var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); - if (split) { - for (var i = split.length - 1; i >= 0; --i) - { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } - } else { - makeChangeInner(doc, change); - } - } - - function makeChangeInner(doc, change) { - if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } - var selAfter = computeSelAfterChange(doc, change); - addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); - - makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); - var rebased = []; - - linkedDocs(doc, function (doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change); - rebased.push(doc.history); - } - makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); - }); - } - - // Revert a change stored in a document's history. - function makeChangeFromHistory(doc, type, allowSelectionOnly) { - var suppress = doc.cm && doc.cm.state.suppressEdits; - if (suppress && !allowSelectionOnly) { return } - - var hist = doc.history, event, selAfter = doc.sel; - var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; - - // Verify that there is a useable event (so that ctrl-z won't - // needlessly clear selection events) - var i = 0; - for (; i < source.length; i++) { - event = source[i]; - if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) - { break } - } - if (i == source.length) { return } - hist.lastOrigin = hist.lastSelOrigin = null; - - for (;;) { - event = source.pop(); - if (event.ranges) { - pushSelectionToHistory(event, dest); - if (allowSelectionOnly && !event.equals(doc.sel)) { - setSelection(doc, event, {clearRedo: false}); - return - } - selAfter = event; - } else if (suppress) { - source.push(event); - return - } else { break } - } - - // Build up a reverse change object to add to the opposite history - // stack (redo when undoing, and vice versa). - var antiChanges = []; - pushSelectionToHistory(selAfter, dest); - dest.push({changes: antiChanges, generation: hist.generation}); - hist.generation = event.generation || ++hist.maxGeneration; - - var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); - - var loop = function ( i ) { - var change = event.changes[i]; - change.origin = type; - if (filter && !filterChange(doc, change, false)) { - source.length = 0; - return {} - } - - antiChanges.push(historyChangeFromChange(doc, change)); - - var after = i ? computeSelAfterChange(doc, change) : lst(source); - makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); - if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } - var rebased = []; - - // Propagate to the linked documents - linkedDocs(doc, function (doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change); - rebased.push(doc.history); - } - makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); - }); - }; - - for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { - var returned = loop( i$1 ); - - if ( returned ) return returned.v; - } - } - - // Sub-views need their line numbers shifted when text is added - // above or below them in the parent document. - function shiftDoc(doc, distance) { - if (distance == 0) { return } - doc.first += distance; - doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( - Pos(range.anchor.line + distance, range.anchor.ch), - Pos(range.head.line + distance, range.head.ch) - ); }), doc.sel.primIndex); - if (doc.cm) { - regChange(doc.cm, doc.first, doc.first - distance, distance); - for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) - { regLineChange(doc.cm, l, "gutter"); } - } - } - - // More lower-level change function, handling only a single document - // (not linked ones). - function makeChangeSingleDoc(doc, change, selAfter, spans) { - if (doc.cm && !doc.cm.curOp) - { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } - - if (change.to.line < doc.first) { - shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); - return - } - if (change.from.line > doc.lastLine()) { return } - - // Clip the change to the size of this doc - if (change.from.line < doc.first) { - var shift = change.text.length - 1 - (doc.first - change.from.line); - shiftDoc(doc, shift); - change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), - text: [lst(change.text)], origin: change.origin}; - } - var last = doc.lastLine(); - if (change.to.line > last) { - change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), - text: [change.text[0]], origin: change.origin}; - } - - change.removed = getBetween(doc, change.from, change.to); - - if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } - if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } - else { updateDoc(doc, change, spans); } - setSelectionNoUndo(doc, selAfter, sel_dontScroll); - - if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) - { doc.cantEdit = false; } - } - - // Handle the interaction of a change to a document with the editor - // that this document is part of. - function makeChangeSingleDocInEditor(cm, change, spans) { - var doc = cm.doc, display = cm.display, from = change.from, to = change.to; - - var recomputeMaxLength = false, checkWidthStart = from.line; - if (!cm.options.lineWrapping) { - checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); - doc.iter(checkWidthStart, to.line + 1, function (line) { - if (line == display.maxLine) { - recomputeMaxLength = true; - return true - } - }); - } - - if (doc.sel.contains(change.from, change.to) > -1) - { signalCursorActivity(cm); } - - updateDoc(doc, change, spans, estimateHeight(cm)); - - if (!cm.options.lineWrapping) { - doc.iter(checkWidthStart, from.line + change.text.length, function (line) { - var len = lineLength(line); - if (len > display.maxLineLength) { - display.maxLine = line; - display.maxLineLength = len; - display.maxLineChanged = true; - recomputeMaxLength = false; - } - }); - if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } - } - - retreatFrontier(doc, from.line); - startWorker(cm, 400); - - var lendiff = change.text.length - (to.line - from.line) - 1; - // Remember that these lines changed, for updating the display - if (change.full) - { regChange(cm); } - else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) - { regLineChange(cm, from.line, "text"); } - else - { regChange(cm, from.line, to.line + 1, lendiff); } - - var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); - if (changeHandler || changesHandler) { - var obj = { - from: from, to: to, - text: change.text, - removed: change.removed, - origin: change.origin - }; - if (changeHandler) { signalLater(cm, "change", cm, obj); } - if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } - } - cm.display.selForContextMenu = null; - } - - function replaceRange(doc, code, from, to, origin) { - var assign; - - if (!to) { to = from; } - if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } - if (typeof code == "string") { code = doc.splitLines(code); } - makeChange(doc, {from: from, to: to, text: code, origin: origin}); - } - - // Rebasing/resetting history to deal with externally-sourced changes - - function rebaseHistSelSingle(pos, from, to, diff) { - if (to < pos.line) { - pos.line += diff; - } else if (from < pos.line) { - pos.line = from; - pos.ch = 0; - } - } - - // Tries to rebase an array of history events given a change in the - // document. If the change touches the same lines as the event, the - // event, and everything 'behind' it, is discarded. If the change is - // before the event, the event's positions are updated. Uses a - // copy-on-write scheme for the positions, to avoid having to - // reallocate them all on every rebase, but also avoid problems with - // shared position objects being unsafely updated. - function rebaseHistArray(array, from, to, diff) { - for (var i = 0; i < array.length; ++i) { - var sub = array[i], ok = true; - if (sub.ranges) { - if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } - for (var j = 0; j < sub.ranges.length; j++) { - rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); - rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); - } - continue - } - for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { - var cur = sub.changes[j$1]; - if (to < cur.from.line) { - cur.from = Pos(cur.from.line + diff, cur.from.ch); - cur.to = Pos(cur.to.line + diff, cur.to.ch); - } else if (from <= cur.to.line) { - ok = false; - break - } - } - if (!ok) { - array.splice(0, i + 1); - i = 0; - } - } - } - - function rebaseHist(hist, change) { - var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; - rebaseHistArray(hist.done, from, to, diff); - rebaseHistArray(hist.undone, from, to, diff); - } - - // Utility for applying a change to a line by handle or number, - // returning the number and optionally registering the line as - // changed. - function changeLine(doc, handle, changeType, op) { - var no = handle, line = handle; - if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } - else { no = lineNo(handle); } - if (no == null) { return null } - if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } - return line - } - - // The document is represented as a BTree consisting of leaves, with - // chunk of lines in them, and branches, with up to ten leaves or - // other branch nodes below them. The top node is always a branch - // node, and is the document object itself (meaning it has - // additional methods and properties). - // - // All nodes have parent links. The tree is used both to go from - // line numbers to line objects, and to go from objects to numbers. - // It also indexes by height, and is used to convert between height - // and line object, and to find the total height of the document. - // - // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html - - function LeafChunk(lines) { - this.lines = lines; - this.parent = null; - var height = 0; - for (var i = 0; i < lines.length; ++i) { - lines[i].parent = this; - height += lines[i].height; - } - this.height = height; - } - - LeafChunk.prototype = { - chunkSize: function() { return this.lines.length }, - - // Remove the n lines at offset 'at'. - removeInner: function(at, n) { - for (var i = at, e = at + n; i < e; ++i) { - var line = this.lines[i]; - this.height -= line.height; - cleanUpLine(line); - signalLater(line, "delete"); - } - this.lines.splice(at, n); - }, - - // Helper used to collapse a small branch into a single leaf. - collapse: function(lines) { - lines.push.apply(lines, this.lines); - }, - - // Insert the given array of lines at offset 'at', count them as - // having the given height. - insertInner: function(at, lines, height) { - this.height += height; - this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); - for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; } - }, - - // Used to iterate over a part of the tree. - iterN: function(at, n, op) { - for (var e = at + n; at < e; ++at) - { if (op(this.lines[at])) { return true } } - } - }; - - function BranchChunk(children) { - this.children = children; - var size = 0, height = 0; - for (var i = 0; i < children.length; ++i) { - var ch = children[i]; - size += ch.chunkSize(); height += ch.height; - ch.parent = this; - } - this.size = size; - this.height = height; - this.parent = null; - } - - BranchChunk.prototype = { - chunkSize: function() { return this.size }, - - removeInner: function(at, n) { - this.size -= n; - for (var i = 0; i < this.children.length; ++i) { - var child = this.children[i], sz = child.chunkSize(); - if (at < sz) { - var rm = Math.min(n, sz - at), oldHeight = child.height; - child.removeInner(at, rm); - this.height -= oldHeight - child.height; - if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } - if ((n -= rm) == 0) { break } - at = 0; - } else { at -= sz; } - } - // If the result is smaller than 25 lines, ensure that it is a - // single leaf node. - if (this.size - n < 25 && - (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { - var lines = []; - this.collapse(lines); - this.children = [new LeafChunk(lines)]; - this.children[0].parent = this; - } - }, - - collapse: function(lines) { - for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); } - }, - - insertInner: function(at, lines, height) { - this.size += lines.length; - this.height += height; - for (var i = 0; i < this.children.length; ++i) { - var child = this.children[i], sz = child.chunkSize(); - if (at <= sz) { - child.insertInner(at, lines, height); - if (child.lines && child.lines.length > 50) { - // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. - // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. - var remaining = child.lines.length % 25 + 25; - for (var pos = remaining; pos < child.lines.length;) { - var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); - child.height -= leaf.height; - this.children.splice(++i, 0, leaf); - leaf.parent = this; - } - child.lines = child.lines.slice(0, remaining); - this.maybeSpill(); - } - break - } - at -= sz; - } - }, - - // When a node has grown, check whether it should be split. - maybeSpill: function() { - if (this.children.length <= 10) { return } - var me = this; - do { - var spilled = me.children.splice(me.children.length - 5, 5); - var sibling = new BranchChunk(spilled); - if (!me.parent) { // Become the parent node - var copy = new BranchChunk(me.children); - copy.parent = me; - me.children = [copy, sibling]; - me = copy; - } else { - me.size -= sibling.size; - me.height -= sibling.height; - var myIndex = indexOf(me.parent.children, me); - me.parent.children.splice(myIndex + 1, 0, sibling); - } - sibling.parent = me.parent; - } while (me.children.length > 10) - me.parent.maybeSpill(); - }, - - iterN: function(at, n, op) { - for (var i = 0; i < this.children.length; ++i) { - var child = this.children[i], sz = child.chunkSize(); - if (at < sz) { - var used = Math.min(n, sz - at); - if (child.iterN(at, used, op)) { return true } - if ((n -= used) == 0) { break } - at = 0; - } else { at -= sz; } - } - } - }; - - // Line widgets are block elements displayed above or below a line. - - var LineWidget = function(doc, node, options) { - if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) - { this[opt] = options[opt]; } } } - this.doc = doc; - this.node = node; - }; - - LineWidget.prototype.clear = function () { - var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); - if (no == null || !ws) { return } - for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } } - if (!ws.length) { line.widgets = null; } - var height = widgetHeight(this); - updateLineHeight(line, Math.max(0, line.height - height)); - if (cm) { - runInOp(cm, function () { - adjustScrollWhenAboveVisible(cm, line, -height); - regLineChange(cm, no, "widget"); - }); - signalLater(cm, "lineWidgetCleared", cm, this, no); - } - }; - - LineWidget.prototype.changed = function () { - var this$1 = this; - - var oldH = this.height, cm = this.doc.cm, line = this.line; - this.height = null; - var diff = widgetHeight(this) - oldH; - if (!diff) { return } - if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } - if (cm) { - runInOp(cm, function () { - cm.curOp.forceUpdate = true; - adjustScrollWhenAboveVisible(cm, line, diff); - signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); - }); - } - }; - eventMixin(LineWidget); - - function adjustScrollWhenAboveVisible(cm, line, diff) { - if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) - { addToScrollTop(cm, diff); } - } - - function addLineWidget(doc, handle, node, options) { - var widget = new LineWidget(doc, node, options); - var cm = doc.cm; - if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } - changeLine(doc, handle, "widget", function (line) { - var widgets = line.widgets || (line.widgets = []); - if (widget.insertAt == null) { widgets.push(widget); } - else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); } - widget.line = line; - if (cm && !lineIsHidden(doc, line)) { - var aboveVisible = heightAtLine(line) < doc.scrollTop; - updateLineHeight(line, line.height + widgetHeight(widget)); - if (aboveVisible) { addToScrollTop(cm, widget.height); } - cm.curOp.forceUpdate = true; - } - return true - }); - if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } - return widget - } - - // TEXTMARKERS - - // Created with markText and setBookmark methods. A TextMarker is a - // handle that can be used to clear or find a marked position in the - // document. Line objects hold arrays (markedSpans) containing - // {from, to, marker} object pointing to such marker objects, and - // indicating that such a marker is present on that line. Multiple - // lines may point to the same marker when it spans across lines. - // The spans will have null for their from/to properties when the - // marker continues beyond the start/end of the line. Markers have - // links back to the lines they currently touch. - - // Collapsed markers have unique ids, in order to be able to order - // them, which is needed for uniquely determining an outer marker - // when they overlap (they may nest, but not partially overlap). - var nextMarkerId = 0; - - var TextMarker = function(doc, type) { - this.lines = []; - this.type = type; - this.doc = doc; - this.id = ++nextMarkerId; - }; - - // Clear the marker. - TextMarker.prototype.clear = function () { - if (this.explicitlyCleared) { return } - var cm = this.doc.cm, withOp = cm && !cm.curOp; - if (withOp) { startOperation(cm); } - if (hasHandler(this, "clear")) { - var found = this.find(); - if (found) { signalLater(this, "clear", found.from, found.to); } - } - var min = null, max = null; - for (var i = 0; i < this.lines.length; ++i) { - var line = this.lines[i]; - var span = getMarkedSpanFor(line.markedSpans, this); - if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); } - else if (cm) { - if (span.to != null) { max = lineNo(line); } - if (span.from != null) { min = lineNo(line); } - } - line.markedSpans = removeMarkedSpan(line.markedSpans, span); - if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) - { updateLineHeight(line, textHeight(cm.display)); } - } - if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { - var visual = visualLine(this.lines[i$1]), len = lineLength(visual); - if (len > cm.display.maxLineLength) { - cm.display.maxLine = visual; - cm.display.maxLineLength = len; - cm.display.maxLineChanged = true; - } - } } - - if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } - this.lines.length = 0; - this.explicitlyCleared = true; - if (this.atomic && this.doc.cantEdit) { - this.doc.cantEdit = false; - if (cm) { reCheckSelection(cm.doc); } - } - if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } - if (withOp) { endOperation(cm); } - if (this.parent) { this.parent.clear(); } - }; - - // Find the position of the marker in the document. Returns a {from, - // to} object by default. Side can be passed to get a specific side - // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the - // Pos objects returned contain a line object, rather than a line - // number (used to prevent looking up the same line twice). - TextMarker.prototype.find = function (side, lineObj) { - if (side == null && this.type == "bookmark") { side = 1; } - var from, to; - for (var i = 0; i < this.lines.length; ++i) { - var line = this.lines[i]; - var span = getMarkedSpanFor(line.markedSpans, this); - if (span.from != null) { - from = Pos(lineObj ? line : lineNo(line), span.from); - if (side == -1) { return from } - } - if (span.to != null) { - to = Pos(lineObj ? line : lineNo(line), span.to); - if (side == 1) { return to } - } - } - return from && {from: from, to: to} - }; - - // Signals that the marker's widget changed, and surrounding layout - // should be recomputed. - TextMarker.prototype.changed = function () { - var this$1 = this; - - var pos = this.find(-1, true), widget = this, cm = this.doc.cm; - if (!pos || !cm) { return } - runInOp(cm, function () { - var line = pos.line, lineN = lineNo(pos.line); - var view = findViewForLine(cm, lineN); - if (view) { - clearLineMeasurementCacheFor(view); - cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; - } - cm.curOp.updateMaxLine = true; - if (!lineIsHidden(widget.doc, line) && widget.height != null) { - var oldHeight = widget.height; - widget.height = null; - var dHeight = widgetHeight(widget) - oldHeight; - if (dHeight) - { updateLineHeight(line, line.height + dHeight); } - } - signalLater(cm, "markerChanged", cm, this$1); - }); - }; - - TextMarker.prototype.attachLine = function (line) { - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp; - if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) - { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } - } - this.lines.push(line); - }; - - TextMarker.prototype.detachLine = function (line) { - this.lines.splice(indexOf(this.lines, line), 1); - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp - ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); - } - }; - eventMixin(TextMarker); - - // Create a marker, wire it up to the right lines, and - function markText(doc, from, to, options, type) { - // Shared markers (across linked documents) are handled separately - // (markTextShared will call out to this again, once per - // document). - if (options && options.shared) { return markTextShared(doc, from, to, options, type) } - // Ensure we are in an operation. - if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } - - var marker = new TextMarker(doc, type), diff = cmp(from, to); - if (options) { copyObj(options, marker, false); } - // Don't connect empty markers unless clearWhenEmpty is false - if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) - { return marker } - if (marker.replacedWith) { - // Showing up as a widget implies collapsed (widget replaces text) - marker.collapsed = true; - marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); - if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } - if (options.insertLeft) { marker.widgetNode.insertLeft = true; } - } - if (marker.collapsed) { - if (conflictingCollapsedRange(doc, from.line, from, to, marker) || - from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) - { throw new Error("Inserting collapsed marker partially overlapping an existing one") } - seeCollapsedSpans(); - } - - if (marker.addToHistory) - { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } - - var curLine = from.line, cm = doc.cm, updateMaxLine; - doc.iter(curLine, to.line + 1, function (line) { - if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) - { updateMaxLine = true; } - if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } - addMarkedSpan(line, new MarkedSpan(marker, - curLine == from.line ? from.ch : null, - curLine == to.line ? to.ch : null)); - ++curLine; - }); - // lineIsHidden depends on the presence of the spans, so needs a second pass - if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { - if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } - }); } - - if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } - - if (marker.readOnly) { - seeReadOnlySpans(); - if (doc.history.done.length || doc.history.undone.length) - { doc.clearHistory(); } - } - if (marker.collapsed) { - marker.id = ++nextMarkerId; - marker.atomic = true; - } - if (cm) { - // Sync editor state - if (updateMaxLine) { cm.curOp.updateMaxLine = true; } - if (marker.collapsed) - { regChange(cm, from.line, to.line + 1); } - else if (marker.className || marker.startStyle || marker.endStyle || marker.css || - marker.attributes || marker.title) - { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } - if (marker.atomic) { reCheckSelection(cm.doc); } - signalLater(cm, "markerAdded", cm, marker); - } - return marker - } - - // SHARED TEXTMARKERS - - // A shared marker spans multiple linked documents. It is - // implemented as a meta-marker-object controlling multiple normal - // markers. - var SharedTextMarker = function(markers, primary) { - this.markers = markers; - this.primary = primary; - for (var i = 0; i < markers.length; ++i) - { markers[i].parent = this; } - }; - - SharedTextMarker.prototype.clear = function () { - if (this.explicitlyCleared) { return } - this.explicitlyCleared = true; - for (var i = 0; i < this.markers.length; ++i) - { this.markers[i].clear(); } - signalLater(this, "clear"); - }; - - SharedTextMarker.prototype.find = function (side, lineObj) { - return this.primary.find(side, lineObj) - }; - eventMixin(SharedTextMarker); - - function markTextShared(doc, from, to, options, type) { - options = copyObj(options); - options.shared = false; - var markers = [markText(doc, from, to, options, type)], primary = markers[0]; - var widget = options.widgetNode; - linkedDocs(doc, function (doc) { - if (widget) { options.widgetNode = widget.cloneNode(true); } - markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); - for (var i = 0; i < doc.linked.length; ++i) - { if (doc.linked[i].isParent) { return } } - primary = lst(markers); - }); - return new SharedTextMarker(markers, primary) - } - - function findSharedMarkers(doc) { - return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) - } - - function copySharedMarkers(doc, markers) { - for (var i = 0; i < markers.length; i++) { - var marker = markers[i], pos = marker.find(); - var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); - if (cmp(mFrom, mTo)) { - var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); - marker.markers.push(subMark); - subMark.parent = marker; - } - } - } - - function detachSharedMarkers(markers) { - var loop = function ( i ) { - var marker = markers[i], linked = [marker.primary.doc]; - linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); - for (var j = 0; j < marker.markers.length; j++) { - var subMarker = marker.markers[j]; - if (indexOf(linked, subMarker.doc) == -1) { - subMarker.parent = null; - marker.markers.splice(j--, 1); - } - } - }; - - for (var i = 0; i < markers.length; i++) loop( i ); - } - - var nextDocId = 0; - var Doc = function(text, mode, firstLine, lineSep, direction) { - if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } - if (firstLine == null) { firstLine = 0; } - - BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); - this.first = firstLine; - this.scrollTop = this.scrollLeft = 0; - this.cantEdit = false; - this.cleanGeneration = 1; - this.modeFrontier = this.highlightFrontier = firstLine; - var start = Pos(firstLine, 0); - this.sel = simpleSelection(start); - this.history = new History(null); - this.id = ++nextDocId; - this.modeOption = mode; - this.lineSep = lineSep; - this.direction = (direction == "rtl") ? "rtl" : "ltr"; - this.extend = false; - - if (typeof text == "string") { text = this.splitLines(text); } - updateDoc(this, {from: start, to: start, text: text}); - setSelection(this, simpleSelection(start), sel_dontScroll); - }; - - Doc.prototype = createObj(BranchChunk.prototype, { - constructor: Doc, - // Iterate over the document. Supports two forms -- with only one - // argument, it calls that for each line in the document. With - // three, it iterates over the range given by the first two (with - // the second being non-inclusive). - iter: function(from, to, op) { - if (op) { this.iterN(from - this.first, to - from, op); } - else { this.iterN(this.first, this.first + this.size, from); } - }, - - // Non-public interface for adding and removing lines. - insert: function(at, lines) { - var height = 0; - for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } - this.insertInner(at - this.first, lines, height); - }, - remove: function(at, n) { this.removeInner(at - this.first, n); }, - - // From here, the methods are part of the public interface. Most - // are also available from CodeMirror (editor) instances. - - getValue: function(lineSep) { - var lines = getLines(this, this.first, this.first + this.size); - if (lineSep === false) { return lines } - return lines.join(lineSep || this.lineSeparator()) - }, - setValue: docMethodOp(function(code) { - var top = Pos(this.first, 0), last = this.first + this.size - 1; - makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), - text: this.splitLines(code), origin: "setValue", full: true}, true); - if (this.cm) { scrollToCoords(this.cm, 0, 0); } - setSelection(this, simpleSelection(top), sel_dontScroll); - }), - replaceRange: function(code, from, to, origin) { - from = clipPos(this, from); - to = to ? clipPos(this, to) : from; - replaceRange(this, code, from, to, origin); - }, - getRange: function(from, to, lineSep) { - var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); - if (lineSep === false) { return lines } - return lines.join(lineSep || this.lineSeparator()) - }, - - getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, - - getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, - getLineNumber: function(line) {return lineNo(line)}, - - getLineHandleVisualStart: function(line) { - if (typeof line == "number") { line = getLine(this, line); } - return visualLine(line) - }, - - lineCount: function() {return this.size}, - firstLine: function() {return this.first}, - lastLine: function() {return this.first + this.size - 1}, - - clipPos: function(pos) {return clipPos(this, pos)}, - - getCursor: function(start) { - var range = this.sel.primary(), pos; - if (start == null || start == "head") { pos = range.head; } - else if (start == "anchor") { pos = range.anchor; } - else if (start == "end" || start == "to" || start === false) { pos = range.to(); } - else { pos = range.from(); } - return pos - }, - listSelections: function() { return this.sel.ranges }, - somethingSelected: function() {return this.sel.somethingSelected()}, - - setCursor: docMethodOp(function(line, ch, options) { - setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); - }), - setSelection: docMethodOp(function(anchor, head, options) { - setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); - }), - extendSelection: docMethodOp(function(head, other, options) { - extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); - }), - extendSelections: docMethodOp(function(heads, options) { - extendSelections(this, clipPosArray(this, heads), options); - }), - extendSelectionsBy: docMethodOp(function(f, options) { - var heads = map(this.sel.ranges, f); - extendSelections(this, clipPosArray(this, heads), options); - }), - setSelections: docMethodOp(function(ranges, primary, options) { - if (!ranges.length) { return } - var out = []; - for (var i = 0; i < ranges.length; i++) - { out[i] = new Range(clipPos(this, ranges[i].anchor), - clipPos(this, ranges[i].head)); } - if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } - setSelection(this, normalizeSelection(this.cm, out, primary), options); - }), - addSelection: docMethodOp(function(anchor, head, options) { - var ranges = this.sel.ranges.slice(0); - ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); - setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); - }), - - getSelection: function(lineSep) { - var ranges = this.sel.ranges, lines; - for (var i = 0; i < ranges.length; i++) { - var sel = getBetween(this, ranges[i].from(), ranges[i].to()); - lines = lines ? lines.concat(sel) : sel; - } - if (lineSep === false) { return lines } - else { return lines.join(lineSep || this.lineSeparator()) } - }, - getSelections: function(lineSep) { - var parts = [], ranges = this.sel.ranges; - for (var i = 0; i < ranges.length; i++) { - var sel = getBetween(this, ranges[i].from(), ranges[i].to()); - if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); } - parts[i] = sel; - } - return parts - }, - replaceSelection: function(code, collapse, origin) { - var dup = []; - for (var i = 0; i < this.sel.ranges.length; i++) - { dup[i] = code; } - this.replaceSelections(dup, collapse, origin || "+input"); - }, - replaceSelections: docMethodOp(function(code, collapse, origin) { - var changes = [], sel = this.sel; - for (var i = 0; i < sel.ranges.length; i++) { - var range = sel.ranges[i]; - changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}; - } - var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); - for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) - { makeChange(this, changes[i$1]); } - if (newSel) { setSelectionReplaceHistory(this, newSel); } - else if (this.cm) { ensureCursorVisible(this.cm); } - }), - undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), - redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), - undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), - redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), - - setExtending: function(val) {this.extend = val;}, - getExtending: function() {return this.extend}, - - historySize: function() { - var hist = this.history, done = 0, undone = 0; - for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } - for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } - return {undo: done, redo: undone} - }, - clearHistory: function() { - var this$1 = this; - - this.history = new History(this.history.maxGeneration); - linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true); - }, - - markClean: function() { - this.cleanGeneration = this.changeGeneration(true); - }, - changeGeneration: function(forceSplit) { - if (forceSplit) - { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } - return this.history.generation - }, - isClean: function (gen) { - return this.history.generation == (gen || this.cleanGeneration) - }, - - getHistory: function() { - return {done: copyHistoryArray(this.history.done), - undone: copyHistoryArray(this.history.undone)} - }, - setHistory: function(histData) { - var hist = this.history = new History(this.history.maxGeneration); - hist.done = copyHistoryArray(histData.done.slice(0), null, true); - hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); - }, - - setGutterMarker: docMethodOp(function(line, gutterID, value) { - return changeLine(this, line, "gutter", function (line) { - var markers = line.gutterMarkers || (line.gutterMarkers = {}); - markers[gutterID] = value; - if (!value && isEmpty(markers)) { line.gutterMarkers = null; } - return true - }) - }), - - clearGutter: docMethodOp(function(gutterID) { - var this$1 = this; - - this.iter(function (line) { - if (line.gutterMarkers && line.gutterMarkers[gutterID]) { - changeLine(this$1, line, "gutter", function () { - line.gutterMarkers[gutterID] = null; - if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } - return true - }); - } - }); - }), - - lineInfo: function(line) { - var n; - if (typeof line == "number") { - if (!isLine(this, line)) { return null } - n = line; - line = getLine(this, line); - if (!line) { return null } - } else { - n = lineNo(line); - if (n == null) { return null } - } - return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, - textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, - widgets: line.widgets} - }, - - addLineClass: docMethodOp(function(handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop = where == "text" ? "textClass" - : where == "background" ? "bgClass" - : where == "gutter" ? "gutterClass" : "wrapClass"; - if (!line[prop]) { line[prop] = cls; } - else if (classTest(cls).test(line[prop])) { return false } - else { line[prop] += " " + cls; } - return true - }) - }), - removeLineClass: docMethodOp(function(handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop = where == "text" ? "textClass" - : where == "background" ? "bgClass" - : where == "gutter" ? "gutterClass" : "wrapClass"; - var cur = line[prop]; - if (!cur) { return false } - else if (cls == null) { line[prop] = null; } - else { - var found = cur.match(classTest(cls)); - if (!found) { return false } - var end = found.index + found[0].length; - line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; - } - return true - }) - }), - - addLineWidget: docMethodOp(function(handle, node, options) { - return addLineWidget(this, handle, node, options) - }), - removeLineWidget: function(widget) { widget.clear(); }, - - markText: function(from, to, options) { - return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") - }, - setBookmark: function(pos, options) { - var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), - insertLeft: options && options.insertLeft, - clearWhenEmpty: false, shared: options && options.shared, - handleMouseEvents: options && options.handleMouseEvents}; - pos = clipPos(this, pos); - return markText(this, pos, pos, realOpts, "bookmark") - }, - findMarksAt: function(pos) { - pos = clipPos(this, pos); - var markers = [], spans = getLine(this, pos.line).markedSpans; - if (spans) { for (var i = 0; i < spans.length; ++i) { - var span = spans[i]; - if ((span.from == null || span.from <= pos.ch) && - (span.to == null || span.to >= pos.ch)) - { markers.push(span.marker.parent || span.marker); } - } } - return markers - }, - findMarks: function(from, to, filter) { - from = clipPos(this, from); to = clipPos(this, to); - var found = [], lineNo = from.line; - this.iter(from.line, to.line + 1, function (line) { - var spans = line.markedSpans; - if (spans) { for (var i = 0; i < spans.length; i++) { - var span = spans[i]; - if (!(span.to != null && lineNo == from.line && from.ch >= span.to || - span.from == null && lineNo != from.line || - span.from != null && lineNo == to.line && span.from >= to.ch) && - (!filter || filter(span.marker))) - { found.push(span.marker.parent || span.marker); } - } } - ++lineNo; - }); - return found - }, - getAllMarks: function() { - var markers = []; - this.iter(function (line) { - var sps = line.markedSpans; - if (sps) { for (var i = 0; i < sps.length; ++i) - { if (sps[i].from != null) { markers.push(sps[i].marker); } } } - }); - return markers - }, - - posFromIndex: function(off) { - var ch, lineNo = this.first, sepSize = this.lineSeparator().length; - this.iter(function (line) { - var sz = line.text.length + sepSize; - if (sz > off) { ch = off; return true } - off -= sz; - ++lineNo; - }); - return clipPos(this, Pos(lineNo, ch)) - }, - indexFromPos: function (coords) { - coords = clipPos(this, coords); - var index = coords.ch; - if (coords.line < this.first || coords.ch < 0) { return 0 } - var sepSize = this.lineSeparator().length; - this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value - index += line.text.length + sepSize; - }); - return index - }, - - copy: function(copyHistory) { - var doc = new Doc(getLines(this, this.first, this.first + this.size), - this.modeOption, this.first, this.lineSep, this.direction); - doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; - doc.sel = this.sel; - doc.extend = false; - if (copyHistory) { - doc.history.undoDepth = this.history.undoDepth; - doc.setHistory(this.getHistory()); - } - return doc - }, - - linkedDoc: function(options) { - if (!options) { options = {}; } - var from = this.first, to = this.first + this.size; - if (options.from != null && options.from > from) { from = options.from; } - if (options.to != null && options.to < to) { to = options.to; } - var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); - if (options.sharedHist) { copy.history = this.history - ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); - copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; - copySharedMarkers(copy, findSharedMarkers(this)); - return copy - }, - unlinkDoc: function(other) { - if (other instanceof CodeMirror) { other = other.doc; } - if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { - var link = this.linked[i]; - if (link.doc != other) { continue } - this.linked.splice(i, 1); - other.unlinkDoc(this); - detachSharedMarkers(findSharedMarkers(this)); - break - } } - // If the histories were shared, split them again - if (other.history == this.history) { - var splitIds = [other.id]; - linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); - other.history = new History(null); - other.history.done = copyHistoryArray(this.history.done, splitIds); - other.history.undone = copyHistoryArray(this.history.undone, splitIds); - } - }, - iterLinkedDocs: function(f) {linkedDocs(this, f);}, - - getMode: function() {return this.mode}, - getEditor: function() {return this.cm}, - - splitLines: function(str) { - if (this.lineSep) { return str.split(this.lineSep) } - return splitLinesAuto(str) - }, - lineSeparator: function() { return this.lineSep || "\n" }, - - setDirection: docMethodOp(function (dir) { - if (dir != "rtl") { dir = "ltr"; } - if (dir == this.direction) { return } - this.direction = dir; - this.iter(function (line) { return line.order = null; }); - if (this.cm) { directionChanged(this.cm); } - }) - }); - - // Public alias. - Doc.prototype.eachLine = Doc.prototype.iter; - - // Kludge to work around strange IE behavior where it'll sometimes - // re-fire a series of drag-related events right after the drop (#1551) - var lastDrop = 0; - - function onDrop(e) { - var cm = this; - clearDragCursor(cm); - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) - { return } - e_preventDefault(e); - if (ie) { lastDrop = +new Date; } - var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; - if (!pos || cm.isReadOnly()) { return } - // Might be a file drop, in which case we simply extract the text - // and insert it. - if (files && files.length && window.FileReader && window.File) { - var n = files.length, text = Array(n), read = 0; - var markAsReadAndPasteIfAllFilesAreRead = function () { - if (++read == n) { - operation(cm, function () { - pos = clipPos(cm.doc, pos); - var change = {from: pos, to: pos, - text: cm.doc.splitLines( - text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())), - origin: "paste"}; - makeChange(cm.doc, change); - setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); - })(); - } - }; - var readTextFromFile = function (file, i) { - if (cm.options.allowDropFileTypes && - indexOf(cm.options.allowDropFileTypes, file.type) == -1) { - markAsReadAndPasteIfAllFilesAreRead(); - return - } - var reader = new FileReader; - reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); }; - reader.onload = function () { - var content = reader.result; - if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { - markAsReadAndPasteIfAllFilesAreRead(); - return - } - text[i] = content; - markAsReadAndPasteIfAllFilesAreRead(); - }; - reader.readAsText(file); - }; - for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); } - } else { // Normal drop - // Don't do a replace if the drop happened inside of the selected text. - if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { - cm.state.draggingText(e); - // Ensure the editor is re-focused - setTimeout(function () { return cm.display.input.focus(); }, 20); - return - } - try { - var text$1 = e.dataTransfer.getData("Text"); - if (text$1) { - var selected; - if (cm.state.draggingText && !cm.state.draggingText.copy) - { selected = cm.listSelections(); } - setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); - if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) - { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } - cm.replaceSelection(text$1, "around", "paste"); - cm.display.input.focus(); - } - } - catch(e$1){} - } - } - - function onDragStart(cm, e) { - if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } - - e.dataTransfer.setData("Text", cm.getSelection()); - e.dataTransfer.effectAllowed = "copyMove"; - - // Use dummy image instead of default browsers image. - // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. - if (e.dataTransfer.setDragImage && !safari) { - var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); - img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - if (presto) { - img.width = img.height = 1; - cm.display.wrapper.appendChild(img); - // Force a relayout, or Opera won't use our image for some obscure reason - img._top = img.offsetTop; - } - e.dataTransfer.setDragImage(img, 0, 0); - if (presto) { img.parentNode.removeChild(img); } - } - } - - function onDragOver(cm, e) { - var pos = posFromMouse(cm, e); - if (!pos) { return } - var frag = document.createDocumentFragment(); - drawSelectionCursor(cm, pos, frag); - if (!cm.display.dragCursor) { - cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); - cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); - } - removeChildrenAndAdd(cm.display.dragCursor, frag); - } - - function clearDragCursor(cm) { - if (cm.display.dragCursor) { - cm.display.lineSpace.removeChild(cm.display.dragCursor); - cm.display.dragCursor = null; - } - } - - // These must be handled carefully, because naively registering a - // handler for each editor will cause the editors to never be - // garbage collected. - - function forEachCodeMirror(f) { - if (!document.getElementsByClassName) { return } - var byClass = document.getElementsByClassName("CodeMirror"), editors = []; - for (var i = 0; i < byClass.length; i++) { - var cm = byClass[i].CodeMirror; - if (cm) { editors.push(cm); } - } - if (editors.length) { editors[0].operation(function () { - for (var i = 0; i < editors.length; i++) { f(editors[i]); } - }); } - } - - var globalsRegistered = false; - function ensureGlobalHandlers() { - if (globalsRegistered) { return } - registerGlobalHandlers(); - globalsRegistered = true; - } - function registerGlobalHandlers() { - // When the window resizes, we need to refresh active editors. - var resizeTimer; - on(window, "resize", function () { - if (resizeTimer == null) { resizeTimer = setTimeout(function () { - resizeTimer = null; - forEachCodeMirror(onResize); - }, 100); } - }); - // When the window loses focus, we want to show the editor as blurred - on(window, "blur", function () { return forEachCodeMirror(onBlur); }); - } - // Called when the window resizes - function onResize(cm) { - var d = cm.display; - // Might be a text scaling operation, clear size caches. - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; - d.scrollbarsClipped = false; - cm.setSize(); - } - - var keyNames = { - 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", - 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", - 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", - 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", - 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", - 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", - 221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", - 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" - }; - - // Number keys - for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } - // Alphabetic keys - for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } - // Function keys - for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } - - var keyMap = {}; - - keyMap.basic = { - "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", - "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", - "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", - "Tab": "defaultTab", "Shift-Tab": "indentAuto", - "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", - "Esc": "singleSelection" - }; - // Note that the save and find-related commands aren't defined by - // default. User code or addons can define them. Unknown commands - // are simply ignored. - keyMap.pcDefault = { - "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", - "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", - "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", - "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", - "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", - "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", - "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", - "fallthrough": "basic" - }; - // Very basic readline/emacs-style bindings, which are standard on Mac. - keyMap.emacsy = { - "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", - "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", - "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", - "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", - "Ctrl-O": "openLine" - }; - keyMap.macDefault = { - "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", - "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", - "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", - "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", - "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", - "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", - "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", - "fallthrough": ["basic", "emacsy"] - }; - keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; - - // KEYMAP DISPATCH - - function normalizeKeyName(name) { - var parts = name.split(/-(?!$)/); - name = parts[parts.length - 1]; - var alt, ctrl, shift, cmd; - for (var i = 0; i < parts.length - 1; i++) { - var mod = parts[i]; - if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } - else if (/^a(lt)?$/i.test(mod)) { alt = true; } - else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } - else if (/^s(hift)?$/i.test(mod)) { shift = true; } - else { throw new Error("Unrecognized modifier name: " + mod) } - } - if (alt) { name = "Alt-" + name; } - if (ctrl) { name = "Ctrl-" + name; } - if (cmd) { name = "Cmd-" + name; } - if (shift) { name = "Shift-" + name; } - return name - } - - // This is a kludge to keep keymaps mostly working as raw objects - // (backwards compatibility) while at the same time support features - // like normalization and multi-stroke key bindings. It compiles a - // new normalized keymap, and then updates the old object to reflect - // this. - function normalizeKeyMap(keymap) { - var copy = {}; - for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { - var value = keymap[keyname]; - if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } - if (value == "...") { delete keymap[keyname]; continue } - - var keys = map(keyname.split(" "), normalizeKeyName); - for (var i = 0; i < keys.length; i++) { - var val = (void 0), name = (void 0); - if (i == keys.length - 1) { - name = keys.join(" "); - val = value; - } else { - name = keys.slice(0, i + 1).join(" "); - val = "..."; - } - var prev = copy[name]; - if (!prev) { copy[name] = val; } - else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } - } - delete keymap[keyname]; - } } - for (var prop in copy) { keymap[prop] = copy[prop]; } - return keymap - } - - function lookupKey(key, map, handle, context) { - map = getKeyMap(map); - var found = map.call ? map.call(key, context) : map[key]; - if (found === false) { return "nothing" } - if (found === "...") { return "multi" } - if (found != null && handle(found)) { return "handled" } - - if (map.fallthrough) { - if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") - { return lookupKey(key, map.fallthrough, handle, context) } - for (var i = 0; i < map.fallthrough.length; i++) { - var result = lookupKey(key, map.fallthrough[i], handle, context); - if (result) { return result } - } - } - } - - // Modifier key presses don't count as 'real' key presses for the - // purpose of keymap fallthrough. - function isModifierKey(value) { - var name = typeof value == "string" ? value : keyNames[value.keyCode]; - return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" - } - - function addModifierNames(name, event, noShift) { - var base = name; - if (event.altKey && base != "Alt") { name = "Alt-" + name; } - if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } - if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; } - if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } - return name - } - - // Look up the name of a key as indicated by an event object. - function keyName(event, noShift) { - if (presto && event.keyCode == 34 && event["char"]) { return false } - var name = keyNames[event.keyCode]; - if (name == null || event.altGraphKey) { return false } - // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, - // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) - if (event.keyCode == 3 && event.code) { name = event.code; } - return addModifierNames(name, event, noShift) - } - - function getKeyMap(val) { - return typeof val == "string" ? keyMap[val] : val - } - - // Helper for deleting text near the selection(s), used to implement - // backspace, delete, and similar functionality. - function deleteNearSelection(cm, compute) { - var ranges = cm.doc.sel.ranges, kill = []; - // Build up a set of ranges to kill first, merging overlapping - // ranges. - for (var i = 0; i < ranges.length; i++) { - var toKill = compute(ranges[i]); - while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { - var replaced = kill.pop(); - if (cmp(replaced.from, toKill.from) < 0) { - toKill.from = replaced.from; - break - } - } - kill.push(toKill); - } - // Next, remove those actual ranges. - runInOp(cm, function () { - for (var i = kill.length - 1; i >= 0; i--) - { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } - ensureCursorVisible(cm); - }); - } - - function moveCharLogically(line, ch, dir) { - var target = skipExtendingChars(line.text, ch + dir, dir); - return target < 0 || target > line.text.length ? null : target - } - - function moveLogically(line, start, dir) { - var ch = moveCharLogically(line, start.ch, dir); - return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") - } - - function endOfLine(visually, cm, lineObj, lineNo, dir) { - if (visually) { - if (cm.doc.direction == "rtl") { dir = -dir; } - var order = getOrder(lineObj, cm.doc.direction); - if (order) { - var part = dir < 0 ? lst(order) : order[0]; - var moveInStorageOrder = (dir < 0) == (part.level == 1); - var sticky = moveInStorageOrder ? "after" : "before"; - var ch; - // With a wrapped rtl chunk (possibly spanning multiple bidi parts), - // it could be that the last bidi part is not on the last visual line, - // since visual lines contain content order-consecutive chunks. - // Thus, in rtl, we are looking for the first (content-order) character - // in the rtl chunk that is on the last line (that is, the same line - // as the last (content-order) character). - if (part.level > 0 || cm.doc.direction == "rtl") { - var prep = prepareMeasureForLine(cm, lineObj); - ch = dir < 0 ? lineObj.text.length - 1 : 0; - var targetTop = measureCharPrepared(cm, prep, ch).top; - ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); - if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } - } else { ch = dir < 0 ? part.to : part.from; } - return new Pos(lineNo, ch, sticky) - } - } - return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") - } - - function moveVisually(cm, line, start, dir) { - var bidi = getOrder(line, cm.doc.direction); - if (!bidi) { return moveLogically(line, start, dir) } - if (start.ch >= line.text.length) { - start.ch = line.text.length; - start.sticky = "before"; - } else if (start.ch <= 0) { - start.ch = 0; - start.sticky = "after"; - } - var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; - if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { - // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, - // nothing interesting happens. - return moveLogically(line, start, dir) - } - - var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; - var prep; - var getWrappedLineExtent = function (ch) { - if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } - prep = prep || prepareMeasureForLine(cm, line); - return wrappedLineExtentChar(cm, line, prep, ch) - }; - var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); - - if (cm.doc.direction == "rtl" || part.level == 1) { - var moveInStorageOrder = (part.level == 1) == (dir < 0); - var ch = mv(start, moveInStorageOrder ? 1 : -1); - if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { - // Case 2: We move within an rtl part or in an rtl editor on the same visual line - var sticky = moveInStorageOrder ? "before" : "after"; - return new Pos(start.line, ch, sticky) - } - } - - // Case 3: Could not move within this bidi part in this visual line, so leave - // the current bidi part - - var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { - var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder - ? new Pos(start.line, mv(ch, 1), "before") - : new Pos(start.line, ch, "after"); }; - - for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { - var part = bidi[partPos]; - var moveInStorageOrder = (dir > 0) == (part.level != 1); - var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); - if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } - ch = moveInStorageOrder ? part.from : mv(part.to, -1); - if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } - } - }; - - // Case 3a: Look for other bidi parts on the same visual line - var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); - if (res) { return res } - - // Case 3b: Look for other bidi parts on the next visual line - var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); - if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { - res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); - if (res) { return res } - } - - // Case 4: Nowhere to move - return null - } - - // Commands are parameter-less actions that can be performed on an - // editor, mostly used for keybindings. - var commands = { - selectAll: selectAll, - singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, - killLine: function (cm) { return deleteNearSelection(cm, function (range) { - if (range.empty()) { - var len = getLine(cm.doc, range.head.line).text.length; - if (range.head.ch == len && range.head.line < cm.lastLine()) - { return {from: range.head, to: Pos(range.head.line + 1, 0)} } - else - { return {from: range.head, to: Pos(range.head.line, len)} } - } else { - return {from: range.from(), to: range.to()} - } - }); }, - deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ - from: Pos(range.from().line, 0), - to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) - }); }); }, - delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ - from: Pos(range.from().line, 0), to: range.from() - }); }); }, - delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { - var top = cm.charCoords(range.head, "div").top + 5; - var leftPos = cm.coordsChar({left: 0, top: top}, "div"); - return {from: leftPos, to: range.from()} - }); }, - delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { - var top = cm.charCoords(range.head, "div").top + 5; - var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); - return {from: range.from(), to: rightPos } - }); }, - undo: function (cm) { return cm.undo(); }, - redo: function (cm) { return cm.redo(); }, - undoSelection: function (cm) { return cm.undoSelection(); }, - redoSelection: function (cm) { return cm.redoSelection(); }, - goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, - goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, - goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, - {origin: "+move", bias: 1} - ); }, - goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, - {origin: "+move", bias: 1} - ); }, - goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, - {origin: "+move", bias: -1} - ); }, - goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.cursorCoords(range.head, "div").top + 5; - return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") - }, sel_move); }, - goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.cursorCoords(range.head, "div").top + 5; - return cm.coordsChar({left: 0, top: top}, "div") - }, sel_move); }, - goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.cursorCoords(range.head, "div").top + 5; - var pos = cm.coordsChar({left: 0, top: top}, "div"); - if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } - return pos - }, sel_move); }, - goLineUp: function (cm) { return cm.moveV(-1, "line"); }, - goLineDown: function (cm) { return cm.moveV(1, "line"); }, - goPageUp: function (cm) { return cm.moveV(-1, "page"); }, - goPageDown: function (cm) { return cm.moveV(1, "page"); }, - goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, - goCharRight: function (cm) { return cm.moveH(1, "char"); }, - goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, - goColumnRight: function (cm) { return cm.moveH(1, "column"); }, - goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, - goGroupRight: function (cm) { return cm.moveH(1, "group"); }, - goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, - goWordRight: function (cm) { return cm.moveH(1, "word"); }, - delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); }, - delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, - delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, - delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, - delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, - delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, - indentAuto: function (cm) { return cm.indentSelection("smart"); }, - indentMore: function (cm) { return cm.indentSelection("add"); }, - indentLess: function (cm) { return cm.indentSelection("subtract"); }, - insertTab: function (cm) { return cm.replaceSelection("\t"); }, - insertSoftTab: function (cm) { - var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; - for (var i = 0; i < ranges.length; i++) { - var pos = ranges[i].from(); - var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); - spaces.push(spaceStr(tabSize - col % tabSize)); - } - cm.replaceSelections(spaces); - }, - defaultTab: function (cm) { - if (cm.somethingSelected()) { cm.indentSelection("add"); } - else { cm.execCommand("insertTab"); } - }, - // Swap the two chars left and right of each selection's head. - // Move cursor behind the two swapped characters afterwards. - // - // Doesn't consider line feeds a character. - // Doesn't scan more than one line above to find a character. - // Doesn't do anything on an empty line. - // Doesn't do anything with non-empty selections. - transposeChars: function (cm) { return runInOp(cm, function () { - var ranges = cm.listSelections(), newSel = []; - for (var i = 0; i < ranges.length; i++) { - if (!ranges[i].empty()) { continue } - var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; - if (line) { - if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } - if (cur.ch > 0) { - cur = new Pos(cur.line, cur.ch + 1); - cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), - Pos(cur.line, cur.ch - 2), cur, "+transpose"); - } else if (cur.line > cm.doc.first) { - var prev = getLine(cm.doc, cur.line - 1).text; - if (prev) { - cur = new Pos(cur.line, 1); - cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + - prev.charAt(prev.length - 1), - Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); - } - } - } - newSel.push(new Range(cur, cur)); - } - cm.setSelections(newSel); - }); }, - newlineAndIndent: function (cm) { return runInOp(cm, function () { - var sels = cm.listSelections(); - for (var i = sels.length - 1; i >= 0; i--) - { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } - sels = cm.listSelections(); - for (var i$1 = 0; i$1 < sels.length; i$1++) - { cm.indentLine(sels[i$1].from().line, null, true); } - ensureCursorVisible(cm); - }); }, - openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, - toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } - }; - - - function lineStart(cm, lineN) { - var line = getLine(cm.doc, lineN); - var visual = visualLine(line); - if (visual != line) { lineN = lineNo(visual); } - return endOfLine(true, cm, visual, lineN, 1) - } - function lineEnd(cm, lineN) { - var line = getLine(cm.doc, lineN); - var visual = visualLineEnd(line); - if (visual != line) { lineN = lineNo(visual); } - return endOfLine(true, cm, line, lineN, -1) - } - function lineStartSmart(cm, pos) { - var start = lineStart(cm, pos.line); - var line = getLine(cm.doc, start.line); - var order = getOrder(line, cm.doc.direction); - if (!order || order[0].level == 0) { - var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); - var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; - return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) - } - return start - } - - // Run a handler that was bound to a key. - function doHandleBinding(cm, bound, dropShift) { - if (typeof bound == "string") { - bound = commands[bound]; - if (!bound) { return false } - } - // Ensure previous input has been read, so that the handler sees a - // consistent view of the document - cm.display.input.ensurePolled(); - var prevShift = cm.display.shift, done = false; - try { - if (cm.isReadOnly()) { cm.state.suppressEdits = true; } - if (dropShift) { cm.display.shift = false; } - done = bound(cm) != Pass; - } finally { - cm.display.shift = prevShift; - cm.state.suppressEdits = false; - } - return done - } - - function lookupKeyForEditor(cm, name, handle) { - for (var i = 0; i < cm.state.keyMaps.length; i++) { - var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); - if (result) { return result } - } - return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) - || lookupKey(name, cm.options.keyMap, handle, cm) - } - - // Note that, despite the name, this function is also used to check - // for bound mouse clicks. - - var stopSeq = new Delayed; - - function dispatchKey(cm, name, e, handle) { - var seq = cm.state.keySeq; - if (seq) { - if (isModifierKey(name)) { return "handled" } - if (/\'$/.test(name)) - { cm.state.keySeq = null; } - else - { stopSeq.set(50, function () { - if (cm.state.keySeq == seq) { - cm.state.keySeq = null; - cm.display.input.reset(); - } - }); } - if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } - } - return dispatchKeyInner(cm, name, e, handle) - } - - function dispatchKeyInner(cm, name, e, handle) { - var result = lookupKeyForEditor(cm, name, handle); - - if (result == "multi") - { cm.state.keySeq = name; } - if (result == "handled") - { signalLater(cm, "keyHandled", cm, name, e); } - - if (result == "handled" || result == "multi") { - e_preventDefault(e); - restartBlink(cm); - } - - return !!result - } - - // Handle a key from the keydown event. - function handleKeyBinding(cm, e) { - var name = keyName(e, true); - if (!name) { return false } - - if (e.shiftKey && !cm.state.keySeq) { - // First try to resolve full name (including 'Shift-'). Failing - // that, see if there is a cursor-motion command (starting with - // 'go') bound to the keyname without 'Shift-'. - return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) - || dispatchKey(cm, name, e, function (b) { - if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) - { return doHandleBinding(cm, b) } - }) - } else { - return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) - } - } - - // Handle a key from the keypress event - function handleCharBinding(cm, e, ch) { - return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) - } - - var lastStoppedKey = null; - function onKeyDown(e) { - var cm = this; - if (e.target && e.target != cm.display.input.getField()) { return } - cm.curOp.focus = activeElt(); - if (signalDOMEvent(cm, e)) { return } - // IE does strange things with escape. - if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } - var code = e.keyCode; - cm.display.shift = code == 16 || e.shiftKey; - var handled = handleKeyBinding(cm, e); - if (presto) { - lastStoppedKey = handled ? code : null; - // Opera has no cut event... we try to at least catch the key combo - if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) - { cm.replaceSelection("", null, "cut"); } - } - if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) - { document.execCommand("cut"); } - - // Turn mouse into crosshair when Alt is held on Mac. - if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) - { showCrossHair(cm); } - } - - function showCrossHair(cm) { - var lineDiv = cm.display.lineDiv; - addClass(lineDiv, "CodeMirror-crosshair"); - - function up(e) { - if (e.keyCode == 18 || !e.altKey) { - rmClass(lineDiv, "CodeMirror-crosshair"); - off(document, "keyup", up); - off(document, "mouseover", up); - } - } - on(document, "keyup", up); - on(document, "mouseover", up); - } - - function onKeyUp(e) { - if (e.keyCode == 16) { this.doc.sel.shift = false; } - signalDOMEvent(this, e); - } - - function onKeyPress(e) { - var cm = this; - if (e.target && e.target != cm.display.input.getField()) { return } - if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } - var keyCode = e.keyCode, charCode = e.charCode; - if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} - if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } - var ch = String.fromCharCode(charCode == null ? keyCode : charCode); - // Some browsers fire keypress events for backspace - if (ch == "\x08") { return } - if (handleCharBinding(cm, e, ch)) { return } - cm.display.input.onKeyPress(e); - } - - var DOUBLECLICK_DELAY = 400; - - var PastClick = function(time, pos, button) { - this.time = time; - this.pos = pos; - this.button = button; - }; - - PastClick.prototype.compare = function (time, pos, button) { - return this.time + DOUBLECLICK_DELAY > time && - cmp(pos, this.pos) == 0 && button == this.button - }; - - var lastClick, lastDoubleClick; - function clickRepeat(pos, button) { - var now = +new Date; - if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { - lastClick = lastDoubleClick = null; - return "triple" - } else if (lastClick && lastClick.compare(now, pos, button)) { - lastDoubleClick = new PastClick(now, pos, button); - lastClick = null; - return "double" - } else { - lastClick = new PastClick(now, pos, button); - lastDoubleClick = null; - return "single" - } - } - - // A mouse down can be a single click, double click, triple click, - // start of selection drag, start of text drag, new cursor - // (ctrl-click), rectangle drag (alt-drag), or xwin - // middle-click-paste. Or it might be a click on something we should - // not interfere with, such as a scrollbar or widget. - function onMouseDown(e) { - var cm = this, display = cm.display; - if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } - display.input.ensurePolled(); - display.shift = e.shiftKey; - - if (eventInWidget(display, e)) { - if (!webkit) { - // Briefly turn off draggability, to allow widgets to do - // normal dragging things. - display.scroller.draggable = false; - setTimeout(function () { return display.scroller.draggable = true; }, 100); - } - return - } - if (clickInGutter(cm, e)) { return } - var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; - window.focus(); - - // #3261: make sure, that we're not starting a second selection - if (button == 1 && cm.state.selectingText) - { cm.state.selectingText(e); } - - if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } - - if (button == 1) { - if (pos) { leftButtonDown(cm, pos, repeat, e); } - else if (e_target(e) == display.scroller) { e_preventDefault(e); } - } else if (button == 2) { - if (pos) { extendSelection(cm.doc, pos); } - setTimeout(function () { return display.input.focus(); }, 20); - } else if (button == 3) { - if (captureRightClick) { cm.display.input.onContextMenu(e); } - else { delayBlurEvent(cm); } - } - } - - function handleMappedButton(cm, button, pos, repeat, event) { - var name = "Click"; - if (repeat == "double") { name = "Double" + name; } - else if (repeat == "triple") { name = "Triple" + name; } - name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; - - return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { - if (typeof bound == "string") { bound = commands[bound]; } - if (!bound) { return false } - var done = false; - try { - if (cm.isReadOnly()) { cm.state.suppressEdits = true; } - done = bound(cm, pos) != Pass; - } finally { - cm.state.suppressEdits = false; - } - return done - }) - } - - function configureMouse(cm, repeat, event) { - var option = cm.getOption("configureMouse"); - var value = option ? option(cm, repeat, event) : {}; - if (value.unit == null) { - var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; - value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; - } - if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } - if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } - if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } - return value - } - - function leftButtonDown(cm, pos, repeat, event) { - if (ie) { setTimeout(bind(ensureFocus, cm), 0); } - else { cm.curOp.focus = activeElt(); } - - var behavior = configureMouse(cm, repeat, event); - - var sel = cm.doc.sel, contained; - if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && - repeat == "single" && (contained = sel.contains(pos)) > -1 && - (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && - (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) - { leftButtonStartDrag(cm, event, pos, behavior); } - else - { leftButtonSelect(cm, event, pos, behavior); } - } - - // Start a text drag. When it ends, see if any dragging actually - // happen, and treat as a click if it didn't. - function leftButtonStartDrag(cm, event, pos, behavior) { - var display = cm.display, moved = false; - var dragEnd = operation(cm, function (e) { - if (webkit) { display.scroller.draggable = false; } - cm.state.draggingText = false; - if (cm.state.delayingBlurEvent) { - if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; } - else { delayBlurEvent(cm); } - } - off(display.wrapper.ownerDocument, "mouseup", dragEnd); - off(display.wrapper.ownerDocument, "mousemove", mouseMove); - off(display.scroller, "dragstart", dragStart); - off(display.scroller, "drop", dragEnd); - if (!moved) { - e_preventDefault(e); - if (!behavior.addNew) - { extendSelection(cm.doc, pos, null, null, behavior.extend); } - // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) - if ((webkit && !safari) || ie && ie_version == 9) - { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); } - else - { display.input.focus(); } - } - }); - var mouseMove = function(e2) { - moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; - }; - var dragStart = function () { return moved = true; }; - // Let the drag handler handle this. - if (webkit) { display.scroller.draggable = true; } - cm.state.draggingText = dragEnd; - dragEnd.copy = !behavior.moveOnDrag; - on(display.wrapper.ownerDocument, "mouseup", dragEnd); - on(display.wrapper.ownerDocument, "mousemove", mouseMove); - on(display.scroller, "dragstart", dragStart); - on(display.scroller, "drop", dragEnd); - - cm.state.delayingBlurEvent = true; - setTimeout(function () { return display.input.focus(); }, 20); - // IE's approach to draggable - if (display.scroller.dragDrop) { display.scroller.dragDrop(); } - } - - function rangeForUnit(cm, pos, unit) { - if (unit == "char") { return new Range(pos, pos) } - if (unit == "word") { return cm.findWordAt(pos) } - if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } - var result = unit(cm, pos); - return new Range(result.from, result.to) - } - - // Normal selection, as opposed to text dragging. - function leftButtonSelect(cm, event, start, behavior) { - if (ie) { delayBlurEvent(cm); } - var display = cm.display, doc = cm.doc; - e_preventDefault(event); - - var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; - if (behavior.addNew && !behavior.extend) { - ourIndex = doc.sel.contains(start); - if (ourIndex > -1) - { ourRange = ranges[ourIndex]; } - else - { ourRange = new Range(start, start); } - } else { - ourRange = doc.sel.primary(); - ourIndex = doc.sel.primIndex; - } - - if (behavior.unit == "rectangle") { - if (!behavior.addNew) { ourRange = new Range(start, start); } - start = posFromMouse(cm, event, true, true); - ourIndex = -1; - } else { - var range = rangeForUnit(cm, start, behavior.unit); - if (behavior.extend) - { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); } - else - { ourRange = range; } - } - - if (!behavior.addNew) { - ourIndex = 0; - setSelection(doc, new Selection([ourRange], 0), sel_mouse); - startSel = doc.sel; - } else if (ourIndex == -1) { - ourIndex = ranges.length; - setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), - {scroll: false, origin: "*mouse"}); - } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { - setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), - {scroll: false, origin: "*mouse"}); - startSel = doc.sel; - } else { - replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); - } - - var lastPos = start; - function extendTo(pos) { - if (cmp(lastPos, pos) == 0) { return } - lastPos = pos; - - if (behavior.unit == "rectangle") { - var ranges = [], tabSize = cm.options.tabSize; - var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); - var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); - var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); - for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); - line <= end; line++) { - var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); - if (left == right) - { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } - else if (text.length > leftPos) - { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } - } - if (!ranges.length) { ranges.push(new Range(start, start)); } - setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), - {origin: "*mouse", scroll: false}); - cm.scrollIntoView(pos); - } else { - var oldRange = ourRange; - var range = rangeForUnit(cm, pos, behavior.unit); - var anchor = oldRange.anchor, head; - if (cmp(range.anchor, anchor) > 0) { - head = range.head; - anchor = minPos(oldRange.from(), range.anchor); - } else { - head = range.anchor; - anchor = maxPos(oldRange.to(), range.head); - } - var ranges$1 = startSel.ranges.slice(0); - ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); - setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); - } - } - - var editorSize = display.wrapper.getBoundingClientRect(); - // Used to ensure timeout re-tries don't fire when another extend - // happened in the meantime (clearTimeout isn't reliable -- at - // least on Chrome, the timeouts still happen even when cleared, - // if the clear happens after their scheduled firing time). - var counter = 0; - - function extend(e) { - var curCount = ++counter; - var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); - if (!cur) { return } - if (cmp(cur, lastPos) != 0) { - cm.curOp.focus = activeElt(); - extendTo(cur); - var visible = visibleLines(display, doc); - if (cur.line >= visible.to || cur.line < visible.from) - { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } - } else { - var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; - if (outside) { setTimeout(operation(cm, function () { - if (counter != curCount) { return } - display.scroller.scrollTop += outside; - extend(e); - }), 50); } - } - } - - function done(e) { - cm.state.selectingText = false; - counter = Infinity; - // If e is null or undefined we interpret this as someone trying - // to explicitly cancel the selection rather than the user - // letting go of the mouse button. - if (e) { - e_preventDefault(e); - display.input.focus(); - } - off(display.wrapper.ownerDocument, "mousemove", move); - off(display.wrapper.ownerDocument, "mouseup", up); - doc.history.lastSelOrigin = null; - } - - var move = operation(cm, function (e) { - if (e.buttons === 0 || !e_button(e)) { done(e); } - else { extend(e); } - }); - var up = operation(cm, done); - cm.state.selectingText = up; - on(display.wrapper.ownerDocument, "mousemove", move); - on(display.wrapper.ownerDocument, "mouseup", up); - } - - // Used when mouse-selecting to adjust the anchor to the proper side - // of a bidi jump depending on the visual position of the head. - function bidiSimplify(cm, range) { - var anchor = range.anchor; - var head = range.head; - var anchorLine = getLine(cm.doc, anchor.line); - if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range } - var order = getOrder(anchorLine); - if (!order) { return range } - var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; - if (part.from != anchor.ch && part.to != anchor.ch) { return range } - var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); - if (boundary == 0 || boundary == order.length) { return range } - - // Compute the relative visual position of the head compared to the - // anchor (<0 is to the left, >0 to the right) - var leftSide; - if (head.line != anchor.line) { - leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; - } else { - var headIndex = getBidiPartAt(order, head.ch, head.sticky); - var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); - if (headIndex == boundary - 1 || headIndex == boundary) - { leftSide = dir < 0; } - else - { leftSide = dir > 0; } - } - - var usePart = order[boundary + (leftSide ? -1 : 0)]; - var from = leftSide == (usePart.level == 1); - var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; - return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head) - } - - - // Determines whether an event happened in the gutter, and fires the - // handlers for the corresponding event. - function gutterEvent(cm, e, type, prevent) { - var mX, mY; - if (e.touches) { - mX = e.touches[0].clientX; - mY = e.touches[0].clientY; - } else { - try { mX = e.clientX; mY = e.clientY; } - catch(e$1) { return false } - } - if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } - if (prevent) { e_preventDefault(e); } - - var display = cm.display; - var lineBox = display.lineDiv.getBoundingClientRect(); - - if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } - mY -= lineBox.top - display.viewOffset; - - for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { - var g = display.gutters.childNodes[i]; - if (g && g.getBoundingClientRect().right >= mX) { - var line = lineAtHeight(cm.doc, mY); - var gutter = cm.display.gutterSpecs[i]; - signal(cm, type, cm, line, gutter.className, e); - return e_defaultPrevented(e) - } - } - } - - function clickInGutter(cm, e) { - return gutterEvent(cm, e, "gutterClick", true) - } - - // CONTEXT MENU HANDLING - - // To make the context menu work, we need to briefly unhide the - // textarea (making it as unobtrusive as possible) to let the - // right-click take effect on it. - function onContextMenu(cm, e) { - if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } - if (signalDOMEvent(cm, e, "contextmenu")) { return } - if (!captureRightClick) { cm.display.input.onContextMenu(e); } - } - - function contextMenuInGutter(cm, e) { - if (!hasHandler(cm, "gutterContextMenu")) { return false } - return gutterEvent(cm, e, "gutterContextMenu", false) - } - - function themeChanged(cm) { - cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + - cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); - clearCaches(cm); - } - - var Init = {toString: function(){return "CodeMirror.Init"}}; - - var defaults = {}; - var optionHandlers = {}; - - function defineOptions(CodeMirror) { - var optionHandlers = CodeMirror.optionHandlers; - - function option(name, deflt, handle, notOnInit) { - CodeMirror.defaults[name] = deflt; - if (handle) { optionHandlers[name] = - notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } - } - - CodeMirror.defineOption = option; - - // Passed to option handlers when there is no old value. - CodeMirror.Init = Init; - - // These two are, on init, called from the constructor because they - // have to be initialized before the editor can start at all. - option("value", "", function (cm, val) { return cm.setValue(val); }, true); - option("mode", null, function (cm, val) { - cm.doc.modeOption = val; - loadMode(cm); - }, true); - - option("indentUnit", 2, loadMode, true); - option("indentWithTabs", false); - option("smartIndent", true); - option("tabSize", 4, function (cm) { - resetModeState(cm); - clearCaches(cm); - regChange(cm); - }, true); - - option("lineSeparator", null, function (cm, val) { - cm.doc.lineSep = val; - if (!val) { return } - var newBreaks = [], lineNo = cm.doc.first; - cm.doc.iter(function (line) { - for (var pos = 0;;) { - var found = line.text.indexOf(val, pos); - if (found == -1) { break } - pos = found + val.length; - newBreaks.push(Pos(lineNo, found)); - } - lineNo++; - }); - for (var i = newBreaks.length - 1; i >= 0; i--) - { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } - }); - option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { - cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); - if (old != Init) { cm.refresh(); } - }); - option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); - option("electricChars", true); - option("inputStyle", mobile ? "contenteditable" : "textarea", function () { - throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME - }, true); - option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); - option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); - option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); - option("rtlMoveVisually", !windows); - option("wholeLineUpdateBefore", true); - - option("theme", "default", function (cm) { - themeChanged(cm); - updateGutters(cm); - }, true); - option("keyMap", "default", function (cm, val, old) { - var next = getKeyMap(val); - var prev = old != Init && getKeyMap(old); - if (prev && prev.detach) { prev.detach(cm, next); } - if (next.attach) { next.attach(cm, prev || null); } - }); - option("extraKeys", null); - option("configureMouse", null); - - option("lineWrapping", false, wrappingChanged, true); - option("gutters", [], function (cm, val) { - cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); - updateGutters(cm); - }, true); - option("fixedGutter", true, function (cm, val) { - cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; - cm.refresh(); - }, true); - option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); - option("scrollbarStyle", "native", function (cm) { - initScrollbars(cm); - updateScrollbars(cm); - cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); - cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); - }, true); - option("lineNumbers", false, function (cm, val) { - cm.display.gutterSpecs = getGutters(cm.options.gutters, val); - updateGutters(cm); - }, true); - option("firstLineNumber", 1, updateGutters, true); - option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); - option("showCursorWhenSelecting", false, updateSelection, true); - - option("resetSelectionOnContextMenu", true); - option("lineWiseCopyCut", true); - option("pasteLinesPerSelection", true); - option("selectionsMayTouch", false); - - option("readOnly", false, function (cm, val) { - if (val == "nocursor") { - onBlur(cm); - cm.display.input.blur(); - } - cm.display.input.readOnlyChanged(val); - }); - - option("screenReaderLabel", null, function (cm, val) { - val = (val === '') ? null : val; - cm.display.input.screenReaderLabelChanged(val); - }); - - option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); - option("dragDrop", true, dragDropChanged); - option("allowDropFileTypes", null); - - option("cursorBlinkRate", 530); - option("cursorScrollMargin", 0); - option("cursorHeight", 1, updateSelection, true); - option("singleCursorHeightPerLine", true, updateSelection, true); - option("workTime", 100); - option("workDelay", 100); - option("flattenSpans", true, resetModeState, true); - option("addModeClass", false, resetModeState, true); - option("pollInterval", 100); - option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); - option("historyEventDelay", 1250); - option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); - option("maxHighlightLength", 10000, resetModeState, true); - option("moveInputWithCursor", true, function (cm, val) { - if (!val) { cm.display.input.resetPosition(); } - }); - - option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); - option("autofocus", null); - option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); - option("phrases", null); - } - - function dragDropChanged(cm, value, old) { - var wasOn = old && old != Init; - if (!value != !wasOn) { - var funcs = cm.display.dragFunctions; - var toggle = value ? on : off; - toggle(cm.display.scroller, "dragstart", funcs.start); - toggle(cm.display.scroller, "dragenter", funcs.enter); - toggle(cm.display.scroller, "dragover", funcs.over); - toggle(cm.display.scroller, "dragleave", funcs.leave); - toggle(cm.display.scroller, "drop", funcs.drop); - } - } - - function wrappingChanged(cm) { - if (cm.options.lineWrapping) { - addClass(cm.display.wrapper, "CodeMirror-wrap"); - cm.display.sizer.style.minWidth = ""; - cm.display.sizerWidth = null; - } else { - rmClass(cm.display.wrapper, "CodeMirror-wrap"); - findMaxLine(cm); - } - estimateLineHeights(cm); - regChange(cm); - clearCaches(cm); - setTimeout(function () { return updateScrollbars(cm); }, 100); - } - - // A CodeMirror instance represents an editor. This is the object - // that user code is usually dealing with. - - function CodeMirror(place, options) { - var this$1 = this; - - if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } - - this.options = options = options ? copyObj(options) : {}; - // Determine effective options based on given values and defaults. - copyObj(defaults, options, false); - - var doc = options.value; - if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } - else if (options.mode) { doc.modeOption = options.mode; } - this.doc = doc; - - var input = new CodeMirror.inputStyles[options.inputStyle](this); - var display = this.display = new Display(place, doc, input, options); - display.wrapper.CodeMirror = this; - themeChanged(this); - if (options.lineWrapping) - { this.display.wrapper.className += " CodeMirror-wrap"; } - initScrollbars(this); - - this.state = { - keyMaps: [], // stores maps added by addKeyMap - overlays: [], // highlighting overlays, as added by addOverlay - modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info - overwrite: false, - delayingBlurEvent: false, - focused: false, - suppressEdits: false, // used to disable editing during key handlers when in readOnly mode - pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll - selectingText: false, - draggingText: false, - highlight: new Delayed(), // stores highlight worker timeout - keySeq: null, // Unfinished key sequence - specialChars: null - }; - - if (options.autofocus && !mobile) { display.input.focus(); } - - // Override magic textarea content restore that IE sometimes does - // on our hidden textarea on reload - if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } - - registerEventHandlers(this); - ensureGlobalHandlers(); - - startOperation(this); - this.curOp.forceUpdate = true; - attachDoc(this, doc); - - if ((options.autofocus && !mobile) || this.hasFocus()) - { setTimeout(function () { - if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); } - }, 20); } - else - { onBlur(this); } - - for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) - { optionHandlers[opt](this, options[opt], Init); } } - maybeUpdateLineNumberWidth(this); - if (options.finishInit) { options.finishInit(this); } - for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); } - endOperation(this); - // Suppress optimizelegibility in Webkit, since it breaks text - // measuring on line wrapping boundaries. - if (webkit && options.lineWrapping && - getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") - { display.lineDiv.style.textRendering = "auto"; } - } - - // The default configuration options. - CodeMirror.defaults = defaults; - // Functions to run when options are changed. - CodeMirror.optionHandlers = optionHandlers; - - // Attach the necessary event handlers when initializing the editor - function registerEventHandlers(cm) { - var d = cm.display; - on(d.scroller, "mousedown", operation(cm, onMouseDown)); - // Older IE's will not fire a second mousedown for a double click - if (ie && ie_version < 11) - { on(d.scroller, "dblclick", operation(cm, function (e) { - if (signalDOMEvent(cm, e)) { return } - var pos = posFromMouse(cm, e); - if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } - e_preventDefault(e); - var word = cm.findWordAt(pos); - extendSelection(cm.doc, word.anchor, word.head); - })); } - else - { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } - // Some browsers fire contextmenu *after* opening the menu, at - // which point we can't mess with it anymore. Context menu is - // handled in onMouseDown for these browsers. - on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); - on(d.input.getField(), "contextmenu", function (e) { - if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); } - }); - - // Used to suppress mouse event handling when a touch happens - var touchFinished, prevTouch = {end: 0}; - function finishTouch() { - if (d.activeTouch) { - touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); - prevTouch = d.activeTouch; - prevTouch.end = +new Date; - } - } - function isMouseLikeTouchEvent(e) { - if (e.touches.length != 1) { return false } - var touch = e.touches[0]; - return touch.radiusX <= 1 && touch.radiusY <= 1 - } - function farAway(touch, other) { - if (other.left == null) { return true } - var dx = other.left - touch.left, dy = other.top - touch.top; - return dx * dx + dy * dy > 20 * 20 - } - on(d.scroller, "touchstart", function (e) { - if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { - d.input.ensurePolled(); - clearTimeout(touchFinished); - var now = +new Date; - d.activeTouch = {start: now, moved: false, - prev: now - prevTouch.end <= 300 ? prevTouch : null}; - if (e.touches.length == 1) { - d.activeTouch.left = e.touches[0].pageX; - d.activeTouch.top = e.touches[0].pageY; - } - } - }); - on(d.scroller, "touchmove", function () { - if (d.activeTouch) { d.activeTouch.moved = true; } - }); - on(d.scroller, "touchend", function (e) { - var touch = d.activeTouch; - if (touch && !eventInWidget(d, e) && touch.left != null && - !touch.moved && new Date - touch.start < 300) { - var pos = cm.coordsChar(d.activeTouch, "page"), range; - if (!touch.prev || farAway(touch, touch.prev)) // Single tap - { range = new Range(pos, pos); } - else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap - { range = cm.findWordAt(pos); } - else // Triple tap - { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } - cm.setSelection(range.anchor, range.head); - cm.focus(); - e_preventDefault(e); - } - finishTouch(); - }); - on(d.scroller, "touchcancel", finishTouch); - - // Sync scrolling between fake scrollbars and real scrollable - // area, ensure viewport is updated when scrolling. - on(d.scroller, "scroll", function () { - if (d.scroller.clientHeight) { - updateScrollTop(cm, d.scroller.scrollTop); - setScrollLeft(cm, d.scroller.scrollLeft, true); - signal(cm, "scroll", cm); - } - }); - - // Listen to wheel events in order to try and update the viewport on time. - on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); - on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); - - // Prevent wrapper from ever scrolling - on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); - - d.dragFunctions = { - enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, - over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, - start: function (e) { return onDragStart(cm, e); }, - drop: operation(cm, onDrop), - leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} - }; - - var inp = d.input.getField(); - on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); - on(inp, "keydown", operation(cm, onKeyDown)); - on(inp, "keypress", operation(cm, onKeyPress)); - on(inp, "focus", function (e) { return onFocus(cm, e); }); - on(inp, "blur", function (e) { return onBlur(cm, e); }); - } - - var initHooks = []; - CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; - - // Indent the given line. The how parameter can be "smart", - // "add"/null, "subtract", or "prev". When aggressive is false - // (typically set to true for forced single-line indents), empty - // lines are not indented, and places where the mode returns Pass - // are left alone. - function indentLine(cm, n, how, aggressive) { - var doc = cm.doc, state; - if (how == null) { how = "add"; } - if (how == "smart") { - // Fall back to "prev" when the mode doesn't have an indentation - // method. - if (!doc.mode.indent) { how = "prev"; } - else { state = getContextBefore(cm, n).state; } - } - - var tabSize = cm.options.tabSize; - var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); - if (line.stateAfter) { line.stateAfter = null; } - var curSpaceString = line.text.match(/^\s*/)[0], indentation; - if (!aggressive && !/\S/.test(line.text)) { - indentation = 0; - how = "not"; - } else if (how == "smart") { - indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); - if (indentation == Pass || indentation > 150) { - if (!aggressive) { return } - how = "prev"; - } - } - if (how == "prev") { - if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } - else { indentation = 0; } - } else if (how == "add") { - indentation = curSpace + cm.options.indentUnit; - } else if (how == "subtract") { - indentation = curSpace - cm.options.indentUnit; - } else if (typeof how == "number") { - indentation = curSpace + how; - } - indentation = Math.max(0, indentation); - - var indentString = "", pos = 0; - if (cm.options.indentWithTabs) - { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } - if (pos < indentation) { indentString += spaceStr(indentation - pos); } - - if (indentString != curSpaceString) { - replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); - line.stateAfter = null; - return true - } else { - // Ensure that, if the cursor was in the whitespace at the start - // of the line, it is moved to the end of that space. - for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { - var range = doc.sel.ranges[i$1]; - if (range.head.line == n && range.head.ch < curSpaceString.length) { - var pos$1 = Pos(n, curSpaceString.length); - replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); - break - } - } - } - } - - // This will be set to a {lineWise: bool, text: [string]} object, so - // that, when pasting, we know what kind of selections the copied - // text was made out of. - var lastCopied = null; - - function setLastCopied(newLastCopied) { - lastCopied = newLastCopied; - } - - function applyTextInput(cm, inserted, deleted, sel, origin) { - var doc = cm.doc; - cm.display.shift = false; - if (!sel) { sel = doc.sel; } - - var recent = +new Date - 200; - var paste = origin == "paste" || cm.state.pasteIncoming > recent; - var textLines = splitLinesAuto(inserted), multiPaste = null; - // When pasting N lines into N selections, insert one line per selection - if (paste && sel.ranges.length > 1) { - if (lastCopied && lastCopied.text.join("\n") == inserted) { - if (sel.ranges.length % lastCopied.text.length == 0) { - multiPaste = []; - for (var i = 0; i < lastCopied.text.length; i++) - { multiPaste.push(doc.splitLines(lastCopied.text[i])); } - } - } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { - multiPaste = map(textLines, function (l) { return [l]; }); - } - } - - var updateInput = cm.curOp.updateInput; - // Normal behavior is to insert the new text into every selection - for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { - var range = sel.ranges[i$1]; - var from = range.from(), to = range.to(); - if (range.empty()) { - if (deleted && deleted > 0) // Handle deletion - { from = Pos(from.line, from.ch - deleted); } - else if (cm.state.overwrite && !paste) // Handle overwrite - { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } - else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) - { from = to = Pos(from.line, 0); } - } - var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, - origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; - makeChange(cm.doc, changeEvent); - signalLater(cm, "inputRead", cm, changeEvent); - } - if (inserted && !paste) - { triggerElectric(cm, inserted); } - - ensureCursorVisible(cm); - if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } - cm.curOp.typing = true; - cm.state.pasteIncoming = cm.state.cutIncoming = -1; - } - - function handlePaste(e, cm) { - var pasted = e.clipboardData && e.clipboardData.getData("Text"); - if (pasted) { - e.preventDefault(); - if (!cm.isReadOnly() && !cm.options.disableInput) - { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } - return true - } - } - - function triggerElectric(cm, inserted) { - // When an 'electric' character is inserted, immediately trigger a reindent - if (!cm.options.electricChars || !cm.options.smartIndent) { return } - var sel = cm.doc.sel; - - for (var i = sel.ranges.length - 1; i >= 0; i--) { - var range = sel.ranges[i]; - if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue } - var mode = cm.getModeAt(range.head); - var indented = false; - if (mode.electricChars) { - for (var j = 0; j < mode.electricChars.length; j++) - { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { - indented = indentLine(cm, range.head.line, "smart"); - break - } } - } else if (mode.electricInput) { - if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) - { indented = indentLine(cm, range.head.line, "smart"); } - } - if (indented) { signalLater(cm, "electricInput", cm, range.head.line); } - } - } - - function copyableRanges(cm) { - var text = [], ranges = []; - for (var i = 0; i < cm.doc.sel.ranges.length; i++) { - var line = cm.doc.sel.ranges[i].head.line; - var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; - ranges.push(lineRange); - text.push(cm.getRange(lineRange.anchor, lineRange.head)); - } - return {text: text, ranges: ranges} - } - - function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { - field.setAttribute("autocorrect", autocorrect ? "" : "off"); - field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); - field.setAttribute("spellcheck", !!spellcheck); - } - - function hiddenTextarea() { - var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"); - var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); - // The textarea is kept positioned near the cursor to prevent the - // fact that it'll be scrolled into view on input from scrolling - // our fake cursor out of view. On webkit, when wrap=off, paste is - // very slow. So make the area wide instead. - if (webkit) { te.style.width = "1000px"; } - else { te.setAttribute("wrap", "off"); } - // If border: 0; -- iOS fails to open keyboard (issue #1287) - if (ios) { te.style.border = "1px solid black"; } - disableBrowserMagic(te); - return div - } - - // The publicly visible API. Note that methodOp(f) means - // 'wrap f in an operation, performed on its `this` parameter'. - - // This is not the complete set of editor methods. Most of the - // methods defined on the Doc type are also injected into - // CodeMirror.prototype, for backwards compatibility and - // convenience. - - function addEditorMethods(CodeMirror) { - var optionHandlers = CodeMirror.optionHandlers; - - var helpers = CodeMirror.helpers = {}; - - CodeMirror.prototype = { - constructor: CodeMirror, - focus: function(){window.focus(); this.display.input.focus();}, - - setOption: function(option, value) { - var options = this.options, old = options[option]; - if (options[option] == value && option != "mode") { return } - options[option] = value; - if (optionHandlers.hasOwnProperty(option)) - { operation(this, optionHandlers[option])(this, value, old); } - signal(this, "optionChange", this, option); - }, - - getOption: function(option) {return this.options[option]}, - getDoc: function() {return this.doc}, - - addKeyMap: function(map, bottom) { - this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); - }, - removeKeyMap: function(map) { - var maps = this.state.keyMaps; - for (var i = 0; i < maps.length; ++i) - { if (maps[i] == map || maps[i].name == map) { - maps.splice(i, 1); - return true - } } - }, - - addOverlay: methodOp(function(spec, options) { - var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); - if (mode.startState) { throw new Error("Overlays may not be stateful.") } - insertSorted(this.state.overlays, - {mode: mode, modeSpec: spec, opaque: options && options.opaque, - priority: (options && options.priority) || 0}, - function (overlay) { return overlay.priority; }); - this.state.modeGen++; - regChange(this); - }), - removeOverlay: methodOp(function(spec) { - var overlays = this.state.overlays; - for (var i = 0; i < overlays.length; ++i) { - var cur = overlays[i].modeSpec; - if (cur == spec || typeof spec == "string" && cur.name == spec) { - overlays.splice(i, 1); - this.state.modeGen++; - regChange(this); - return - } - } - }), - - indentLine: methodOp(function(n, dir, aggressive) { - if (typeof dir != "string" && typeof dir != "number") { - if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } - else { dir = dir ? "add" : "subtract"; } - } - if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } - }), - indentSelection: methodOp(function(how) { - var ranges = this.doc.sel.ranges, end = -1; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - if (!range.empty()) { - var from = range.from(), to = range.to(); - var start = Math.max(end, from.line); - end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; - for (var j = start; j < end; ++j) - { indentLine(this, j, how); } - var newRanges = this.doc.sel.ranges; - if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) - { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } - } else if (range.head.line > end) { - indentLine(this, range.head.line, how, true); - end = range.head.line; - if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); } - } - } - }), - - // Fetch the parser token for a given character. Useful for hacks - // that want to inspect the mode state (say, for completion). - getTokenAt: function(pos, precise) { - return takeToken(this, pos, precise) - }, - - getLineTokens: function(line, precise) { - return takeToken(this, Pos(line), precise, true) - }, - - getTokenTypeAt: function(pos) { - pos = clipPos(this.doc, pos); - var styles = getLineStyles(this, getLine(this.doc, pos.line)); - var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; - var type; - if (ch == 0) { type = styles[2]; } - else { for (;;) { - var mid = (before + after) >> 1; - if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } - else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } - else { type = styles[mid * 2 + 2]; break } - } } - var cut = type ? type.indexOf("overlay ") : -1; - return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) - }, - - getModeAt: function(pos) { - var mode = this.doc.mode; - if (!mode.innerMode) { return mode } - return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode - }, - - getHelper: function(pos, type) { - return this.getHelpers(pos, type)[0] - }, - - getHelpers: function(pos, type) { - var found = []; - if (!helpers.hasOwnProperty(type)) { return found } - var help = helpers[type], mode = this.getModeAt(pos); - if (typeof mode[type] == "string") { - if (help[mode[type]]) { found.push(help[mode[type]]); } - } else if (mode[type]) { - for (var i = 0; i < mode[type].length; i++) { - var val = help[mode[type][i]]; - if (val) { found.push(val); } - } - } else if (mode.helperType && help[mode.helperType]) { - found.push(help[mode.helperType]); - } else if (help[mode.name]) { - found.push(help[mode.name]); - } - for (var i$1 = 0; i$1 < help._global.length; i$1++) { - var cur = help._global[i$1]; - if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) - { found.push(cur.val); } - } - return found - }, - - getStateAfter: function(line, precise) { - var doc = this.doc; - line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); - return getContextBefore(this, line + 1, precise).state - }, - - cursorCoords: function(start, mode) { - var pos, range = this.doc.sel.primary(); - if (start == null) { pos = range.head; } - else if (typeof start == "object") { pos = clipPos(this.doc, start); } - else { pos = start ? range.from() : range.to(); } - return cursorCoords(this, pos, mode || "page") - }, - - charCoords: function(pos, mode) { - return charCoords(this, clipPos(this.doc, pos), mode || "page") - }, - - coordsChar: function(coords, mode) { - coords = fromCoordSystem(this, coords, mode || "page"); - return coordsChar(this, coords.left, coords.top) - }, - - lineAtHeight: function(height, mode) { - height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; - return lineAtHeight(this.doc, height + this.display.viewOffset) - }, - heightAtLine: function(line, mode, includeWidgets) { - var end = false, lineObj; - if (typeof line == "number") { - var last = this.doc.first + this.doc.size - 1; - if (line < this.doc.first) { line = this.doc.first; } - else if (line > last) { line = last; end = true; } - lineObj = getLine(this.doc, line); - } else { - lineObj = line; - } - return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + - (end ? this.doc.height - heightAtLine(lineObj) : 0) - }, - - defaultTextHeight: function() { return textHeight(this.display) }, - defaultCharWidth: function() { return charWidth(this.display) }, - - getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, - - addWidget: function(pos, node, scroll, vert, horiz) { - var display = this.display; - pos = cursorCoords(this, clipPos(this.doc, pos)); - var top = pos.bottom, left = pos.left; - node.style.position = "absolute"; - node.setAttribute("cm-ignore-events", "true"); - this.display.input.setUneditable(node); - display.sizer.appendChild(node); - if (vert == "over") { - top = pos.top; - } else if (vert == "above" || vert == "near") { - var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), - hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); - // Default to positioning above (if specified and possible); otherwise default to positioning below - if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) - { top = pos.top - node.offsetHeight; } - else if (pos.bottom + node.offsetHeight <= vspace) - { top = pos.bottom; } - if (left + node.offsetWidth > hspace) - { left = hspace - node.offsetWidth; } - } - node.style.top = top + "px"; - node.style.left = node.style.right = ""; - if (horiz == "right") { - left = display.sizer.clientWidth - node.offsetWidth; - node.style.right = "0px"; - } else { - if (horiz == "left") { left = 0; } - else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } - node.style.left = left + "px"; - } - if (scroll) - { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } - }, - - triggerOnKeyDown: methodOp(onKeyDown), - triggerOnKeyPress: methodOp(onKeyPress), - triggerOnKeyUp: onKeyUp, - triggerOnMouseDown: methodOp(onMouseDown), - - execCommand: function(cmd) { - if (commands.hasOwnProperty(cmd)) - { return commands[cmd].call(null, this) } - }, - - triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), - - findPosH: function(from, amount, unit, visually) { - var dir = 1; - if (amount < 0) { dir = -1; amount = -amount; } - var cur = clipPos(this.doc, from); - for (var i = 0; i < amount; ++i) { - cur = findPosH(this.doc, cur, dir, unit, visually); - if (cur.hitSide) { break } - } - return cur - }, - - moveH: methodOp(function(dir, unit) { - var this$1 = this; - - this.extendSelectionsBy(function (range) { - if (this$1.display.shift || this$1.doc.extend || range.empty()) - { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) } - else - { return dir < 0 ? range.from() : range.to() } - }, sel_move); - }), - - deleteH: methodOp(function(dir, unit) { - var sel = this.doc.sel, doc = this.doc; - if (sel.somethingSelected()) - { doc.replaceSelection("", null, "+delete"); } - else - { deleteNearSelection(this, function (range) { - var other = findPosH(doc, range.head, dir, unit, false); - return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other} - }); } - }), - - findPosV: function(from, amount, unit, goalColumn) { - var dir = 1, x = goalColumn; - if (amount < 0) { dir = -1; amount = -amount; } - var cur = clipPos(this.doc, from); - for (var i = 0; i < amount; ++i) { - var coords = cursorCoords(this, cur, "div"); - if (x == null) { x = coords.left; } - else { coords.left = x; } - cur = findPosV(this, coords, dir, unit); - if (cur.hitSide) { break } - } - return cur - }, - - moveV: methodOp(function(dir, unit) { - var this$1 = this; - - var doc = this.doc, goals = []; - var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); - doc.extendSelectionsBy(function (range) { - if (collapse) - { return dir < 0 ? range.from() : range.to() } - var headPos = cursorCoords(this$1, range.head, "div"); - if (range.goalColumn != null) { headPos.left = range.goalColumn; } - goals.push(headPos.left); - var pos = findPosV(this$1, headPos, dir, unit); - if (unit == "page" && range == doc.sel.primary()) - { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } - return pos - }, sel_move); - if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) - { doc.sel.ranges[i].goalColumn = goals[i]; } } - }), - - // Find the word at the given position (as returned by coordsChar). - findWordAt: function(pos) { - var doc = this.doc, line = getLine(doc, pos.line).text; - var start = pos.ch, end = pos.ch; - if (line) { - var helper = this.getHelper(pos, "wordChars"); - if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } - var startChar = line.charAt(start); - var check = isWordChar(startChar, helper) - ? function (ch) { return isWordChar(ch, helper); } - : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } - : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; - while (start > 0 && check(line.charAt(start - 1))) { --start; } - while (end < line.length && check(line.charAt(end))) { ++end; } - } - return new Range(Pos(pos.line, start), Pos(pos.line, end)) - }, - - toggleOverwrite: function(value) { - if (value != null && value == this.state.overwrite) { return } - if (this.state.overwrite = !this.state.overwrite) - { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } - else - { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } - - signal(this, "overwriteToggle", this, this.state.overwrite); - }, - hasFocus: function() { return this.display.input.getField() == activeElt() }, - isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, - - scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), - getScrollInfo: function() { - var scroller = this.display.scroller; - return {left: scroller.scrollLeft, top: scroller.scrollTop, - height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, - width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, - clientHeight: displayHeight(this), clientWidth: displayWidth(this)} - }, - - scrollIntoView: methodOp(function(range, margin) { - if (range == null) { - range = {from: this.doc.sel.primary().head, to: null}; - if (margin == null) { margin = this.options.cursorScrollMargin; } - } else if (typeof range == "number") { - range = {from: Pos(range, 0), to: null}; - } else if (range.from == null) { - range = {from: range, to: null}; - } - if (!range.to) { range.to = range.from; } - range.margin = margin || 0; - - if (range.from.line != null) { - scrollToRange(this, range); - } else { - scrollToCoordsRange(this, range.from, range.to, range.margin); - } - }), - - setSize: methodOp(function(width, height) { - var this$1 = this; - - var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; - if (width != null) { this.display.wrapper.style.width = interpret(width); } - if (height != null) { this.display.wrapper.style.height = interpret(height); } - if (this.options.lineWrapping) { clearLineMeasurementCache(this); } - var lineNo = this.display.viewFrom; - this.doc.iter(lineNo, this.display.viewTo, function (line) { - if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) - { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } } - ++lineNo; - }); - this.curOp.forceUpdate = true; - signal(this, "refresh", this); - }), - - operation: function(f){return runInOp(this, f)}, - startOperation: function(){return startOperation(this)}, - endOperation: function(){return endOperation(this)}, - - refresh: methodOp(function() { - var oldHeight = this.display.cachedTextHeight; - regChange(this); - this.curOp.forceUpdate = true; - clearCaches(this); - scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); - updateGutterSpace(this.display); - if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping) - { estimateLineHeights(this); } - signal(this, "refresh", this); - }), - - swapDoc: methodOp(function(doc) { - var old = this.doc; - old.cm = null; - // Cancel the current text selection if any (#5821) - if (this.state.selectingText) { this.state.selectingText(); } - attachDoc(this, doc); - clearCaches(this); - this.display.input.reset(); - scrollToCoords(this, doc.scrollLeft, doc.scrollTop); - this.curOp.forceScroll = true; - signalLater(this, "swapDoc", this, old); - return old - }), - - phrase: function(phraseText) { - var phrases = this.options.phrases; - return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText - }, - - getInputField: function(){return this.display.input.getField()}, - getWrapperElement: function(){return this.display.wrapper}, - getScrollerElement: function(){return this.display.scroller}, - getGutterElement: function(){return this.display.gutters} - }; - eventMixin(CodeMirror); - - CodeMirror.registerHelper = function(type, name, value) { - if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } - helpers[type][name] = value; - }; - CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { - CodeMirror.registerHelper(type, name, value); - helpers[type]._global.push({pred: predicate, val: value}); - }; - } - - // Used for horizontal relative motion. Dir is -1 or 1 (left or - // right), unit can be "codepoint", "char", "column" (like char, but - // doesn't cross line boundaries), "word" (across next word), or - // "group" (to the start of next group of word or - // non-word-non-whitespace chars). The visually param controls - // whether, in right-to-left text, direction 1 means to move towards - // the next index in the string, or towards the character to the right - // of the current position. The resulting position will have a - // hitSide=true property if it reached the end of the document. - function findPosH(doc, pos, dir, unit, visually) { - var oldPos = pos; - var origDir = dir; - var lineObj = getLine(doc, pos.line); - var lineDir = visually && doc.direction == "rtl" ? -dir : dir; - function findNextLine() { - var l = pos.line + lineDir; - if (l < doc.first || l >= doc.first + doc.size) { return false } - pos = new Pos(l, pos.ch, pos.sticky); - return lineObj = getLine(doc, l) - } - function moveOnce(boundToLine) { - var next; - if (unit == "codepoint") { - var ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1)); - if (isNaN(ch)) { next = null; } - else { next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (ch >= 0xD800 && ch < 0xDC00 ? 2 : 1))), - -dir); } - } else if (visually) { - next = moveVisually(doc.cm, lineObj, pos, dir); - } else { - next = moveLogically(lineObj, pos, dir); - } - if (next == null) { - if (!boundToLine && findNextLine()) - { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); } - else - { return false } - } else { - pos = next; - } - return true - } - - if (unit == "char" || unit == "codepoint") { - moveOnce(); - } else if (unit == "column") { - moveOnce(true); - } else if (unit == "word" || unit == "group") { - var sawType = null, group = unit == "group"; - var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); - for (var first = true;; first = false) { - if (dir < 0 && !moveOnce(!first)) { break } - var cur = lineObj.text.charAt(pos.ch) || "\n"; - var type = isWordChar(cur, helper) ? "w" - : group && cur == "\n" ? "n" - : !group || /\s/.test(cur) ? null - : "p"; - if (group && !first && !type) { type = "s"; } - if (sawType && sawType != type) { - if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} - break - } - - if (type) { sawType = type; } - if (dir > 0 && !moveOnce(!first)) { break } - } - } - var result = skipAtomic(doc, pos, oldPos, origDir, true); - if (equalCursorPos(oldPos, result)) { result.hitSide = true; } - return result - } - - // For relative vertical movement. Dir may be -1 or 1. Unit can be - // "page" or "line". The resulting position will have a hitSide=true - // property if it reached the end of the document. - function findPosV(cm, pos, dir, unit) { - var doc = cm.doc, x = pos.left, y; - if (unit == "page") { - var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); - var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); - y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; - - } else if (unit == "line") { - y = dir > 0 ? pos.bottom + 3 : pos.top - 3; - } - var target; - for (;;) { - target = coordsChar(cm, x, y); - if (!target.outside) { break } - if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } - y += dir * 5; - } - return target - } - - // CONTENTEDITABLE INPUT STYLE - - var ContentEditableInput = function(cm) { - this.cm = cm; - this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; - this.polling = new Delayed(); - this.composing = null; - this.gracePeriod = false; - this.readDOMTimeout = null; - }; - - ContentEditableInput.prototype.init = function (display) { - var this$1 = this; - - var input = this, cm = input.cm; - var div = input.div = display.lineDiv; - disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); - - function belongsToInput(e) { - for (var t = e.target; t; t = t.parentNode) { - if (t == div) { return true } - if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break } - } - return false - } - - on(div, "paste", function (e) { - if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } - // IE doesn't fire input events, so we schedule a read for the pasted content in this way - if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } - }); - - on(div, "compositionstart", function (e) { - this$1.composing = {data: e.data, done: false}; - }); - on(div, "compositionupdate", function (e) { - if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } - }); - on(div, "compositionend", function (e) { - if (this$1.composing) { - if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } - this$1.composing.done = true; - } - }); - - on(div, "touchstart", function () { return input.forceCompositionEnd(); }); - - on(div, "input", function () { - if (!this$1.composing) { this$1.readFromDOMSoon(); } - }); - - function onCopyCut(e) { - if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return } - if (cm.somethingSelected()) { - setLastCopied({lineWise: false, text: cm.getSelections()}); - if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } - } else if (!cm.options.lineWiseCopyCut) { - return - } else { - var ranges = copyableRanges(cm); - setLastCopied({lineWise: true, text: ranges.text}); - if (e.type == "cut") { - cm.operation(function () { - cm.setSelections(ranges.ranges, 0, sel_dontScroll); - cm.replaceSelection("", null, "cut"); - }); - } - } - if (e.clipboardData) { - e.clipboardData.clearData(); - var content = lastCopied.text.join("\n"); - // iOS exposes the clipboard API, but seems to discard content inserted into it - e.clipboardData.setData("Text", content); - if (e.clipboardData.getData("Text") == content) { - e.preventDefault(); - return - } - } - // Old-fashioned briefly-focus-a-textarea hack - var kludge = hiddenTextarea(), te = kludge.firstChild; - cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); - te.value = lastCopied.text.join("\n"); - var hadFocus = document.activeElement; - selectInput(te); - setTimeout(function () { - cm.display.lineSpace.removeChild(kludge); - hadFocus.focus(); - if (hadFocus == div) { input.showPrimarySelection(); } - }, 50); - } - on(div, "copy", onCopyCut); - on(div, "cut", onCopyCut); - }; - - ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { - // Label for screenreaders, accessibility - if(label) { - this.div.setAttribute('aria-label', label); - } else { - this.div.removeAttribute('aria-label'); - } - }; - - ContentEditableInput.prototype.prepareSelection = function () { - var result = prepareSelection(this.cm, false); - result.focus = document.activeElement == this.div; - return result - }; - - ContentEditableInput.prototype.showSelection = function (info, takeFocus) { - if (!info || !this.cm.display.view.length) { return } - if (info.focus || takeFocus) { this.showPrimarySelection(); } - this.showMultipleSelections(info); - }; - - ContentEditableInput.prototype.getSelection = function () { - return this.cm.display.wrapper.ownerDocument.getSelection() - }; - - ContentEditableInput.prototype.showPrimarySelection = function () { - var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); - var from = prim.from(), to = prim.to(); - - if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { - sel.removeAllRanges(); - return - } - - var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); - var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); - if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && - cmp(minPos(curAnchor, curFocus), from) == 0 && - cmp(maxPos(curAnchor, curFocus), to) == 0) - { return } - - var view = cm.display.view; - var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || - {node: view[0].measure.map[2], offset: 0}; - var end = to.line < cm.display.viewTo && posToDOM(cm, to); - if (!end) { - var measure = view[view.length - 1].measure; - var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; - end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; - } - - if (!start || !end) { - sel.removeAllRanges(); - return - } - - var old = sel.rangeCount && sel.getRangeAt(0), rng; - try { rng = range(start.node, start.offset, end.offset, end.node); } - catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible - if (rng) { - if (!gecko && cm.state.focused) { - sel.collapse(start.node, start.offset); - if (!rng.collapsed) { - sel.removeAllRanges(); - sel.addRange(rng); - } - } else { - sel.removeAllRanges(); - sel.addRange(rng); - } - if (old && sel.anchorNode == null) { sel.addRange(old); } - else if (gecko) { this.startGracePeriod(); } - } - this.rememberSelection(); - }; - - ContentEditableInput.prototype.startGracePeriod = function () { - var this$1 = this; - - clearTimeout(this.gracePeriod); - this.gracePeriod = setTimeout(function () { - this$1.gracePeriod = false; - if (this$1.selectionChanged()) - { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } - }, 20); - }; - - ContentEditableInput.prototype.showMultipleSelections = function (info) { - removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); - removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); - }; - - ContentEditableInput.prototype.rememberSelection = function () { - var sel = this.getSelection(); - this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; - this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; - }; - - ContentEditableInput.prototype.selectionInEditor = function () { - var sel = this.getSelection(); - if (!sel.rangeCount) { return false } - var node = sel.getRangeAt(0).commonAncestorContainer; - return contains(this.div, node) - }; - - ContentEditableInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor") { - if (!this.selectionInEditor() || document.activeElement != this.div) - { this.showSelection(this.prepareSelection(), true); } - this.div.focus(); - } - }; - ContentEditableInput.prototype.blur = function () { this.div.blur(); }; - ContentEditableInput.prototype.getField = function () { return this.div }; - - ContentEditableInput.prototype.supportsTouch = function () { return true }; - - ContentEditableInput.prototype.receivedFocus = function () { - var input = this; - if (this.selectionInEditor()) - { this.pollSelection(); } - else - { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } - - function poll() { - if (input.cm.state.focused) { - input.pollSelection(); - input.polling.set(input.cm.options.pollInterval, poll); - } - } - this.polling.set(this.cm.options.pollInterval, poll); - }; - - ContentEditableInput.prototype.selectionChanged = function () { - var sel = this.getSelection(); - return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || - sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset - }; - - ContentEditableInput.prototype.pollSelection = function () { - if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } - var sel = this.getSelection(), cm = this.cm; - // On Android Chrome (version 56, at least), backspacing into an - // uneditable block element will put the cursor in that element, - // and then, because it's not editable, hide the virtual keyboard. - // Because Android doesn't allow us to actually detect backspace - // presses in a sane way, this code checks for when that happens - // and simulates a backspace press in this case. - if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { - this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); - this.blur(); - this.focus(); - return - } - if (this.composing) { return } - this.rememberSelection(); - var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); - var head = domToPos(cm, sel.focusNode, sel.focusOffset); - if (anchor && head) { runInOp(cm, function () { - setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); - if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } - }); } - }; - - ContentEditableInput.prototype.pollContent = function () { - if (this.readDOMTimeout != null) { - clearTimeout(this.readDOMTimeout); - this.readDOMTimeout = null; - } - - var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); - var from = sel.from(), to = sel.to(); - if (from.ch == 0 && from.line > cm.firstLine()) - { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } - if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) - { to = Pos(to.line + 1, 0); } - if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } - - var fromIndex, fromLine, fromNode; - if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { - fromLine = lineNo(display.view[0].line); - fromNode = display.view[0].node; - } else { - fromLine = lineNo(display.view[fromIndex].line); - fromNode = display.view[fromIndex - 1].node.nextSibling; - } - var toIndex = findViewIndex(cm, to.line); - var toLine, toNode; - if (toIndex == display.view.length - 1) { - toLine = display.viewTo - 1; - toNode = display.lineDiv.lastChild; - } else { - toLine = lineNo(display.view[toIndex + 1].line) - 1; - toNode = display.view[toIndex + 1].node.previousSibling; - } - - if (!fromNode) { return false } - var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); - var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); - while (newText.length > 1 && oldText.length > 1) { - if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } - else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } - else { break } - } - - var cutFront = 0, cutEnd = 0; - var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); - while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) - { ++cutFront; } - var newBot = lst(newText), oldBot = lst(oldText); - var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), - oldBot.length - (oldText.length == 1 ? cutFront : 0)); - while (cutEnd < maxCutEnd && - newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) - { ++cutEnd; } - // Try to move start of change to start of selection if ambiguous - if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { - while (cutFront && cutFront > from.ch && - newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { - cutFront--; - cutEnd++; - } - } - - newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); - newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); - - var chFrom = Pos(fromLine, cutFront); - var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); - if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { - replaceRange(cm.doc, newText, chFrom, chTo, "+input"); - return true - } - }; - - ContentEditableInput.prototype.ensurePolled = function () { - this.forceCompositionEnd(); - }; - ContentEditableInput.prototype.reset = function () { - this.forceCompositionEnd(); - }; - ContentEditableInput.prototype.forceCompositionEnd = function () { - if (!this.composing) { return } - clearTimeout(this.readDOMTimeout); - this.composing = null; - this.updateFromDOM(); - this.div.blur(); - this.div.focus(); - }; - ContentEditableInput.prototype.readFromDOMSoon = function () { - var this$1 = this; - - if (this.readDOMTimeout != null) { return } - this.readDOMTimeout = setTimeout(function () { - this$1.readDOMTimeout = null; - if (this$1.composing) { - if (this$1.composing.done) { this$1.composing = null; } - else { return } - } - this$1.updateFromDOM(); - }, 80); - }; - - ContentEditableInput.prototype.updateFromDOM = function () { - var this$1 = this; - - if (this.cm.isReadOnly() || !this.pollContent()) - { runInOp(this.cm, function () { return regChange(this$1.cm); }); } - }; - - ContentEditableInput.prototype.setUneditable = function (node) { - node.contentEditable = "false"; - }; - - ContentEditableInput.prototype.onKeyPress = function (e) { - if (e.charCode == 0 || this.composing) { return } - e.preventDefault(); - if (!this.cm.isReadOnly()) - { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } - }; - - ContentEditableInput.prototype.readOnlyChanged = function (val) { - this.div.contentEditable = String(val != "nocursor"); - }; - - ContentEditableInput.prototype.onContextMenu = function () {}; - ContentEditableInput.prototype.resetPosition = function () {}; - - ContentEditableInput.prototype.needsContentAttribute = true; - - function posToDOM(cm, pos) { - var view = findViewForLine(cm, pos.line); - if (!view || view.hidden) { return null } - var line = getLine(cm.doc, pos.line); - var info = mapFromLineView(view, line, pos.line); - - var order = getOrder(line, cm.doc.direction), side = "left"; - if (order) { - var partPos = getBidiPartAt(order, pos.ch); - side = partPos % 2 ? "right" : "left"; - } - var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); - result.offset = result.collapse == "right" ? result.end : result.start; - return result - } - - function isInGutter(node) { - for (var scan = node; scan; scan = scan.parentNode) - { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } - return false - } - - function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } - - function domTextBetween(cm, from, to, fromLine, toLine) { - var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; - function recognizeMarker(id) { return function (marker) { return marker.id == id; } } - function close() { - if (closing) { - text += lineSep; - if (extraLinebreak) { text += lineSep; } - closing = extraLinebreak = false; - } - } - function addText(str) { - if (str) { - close(); - text += str; - } - } - function walk(node) { - if (node.nodeType == 1) { - var cmText = node.getAttribute("cm-text"); - if (cmText) { - addText(cmText); - return - } - var markerID = node.getAttribute("cm-marker"), range; - if (markerID) { - var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); - if (found.length && (range = found[0].find(0))) - { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); } - return - } - if (node.getAttribute("contenteditable") == "false") { return } - var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); - if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } - - if (isBlock) { close(); } - for (var i = 0; i < node.childNodes.length; i++) - { walk(node.childNodes[i]); } - - if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } - if (isBlock) { closing = true; } - } else if (node.nodeType == 3) { - addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); - } - } - for (;;) { - walk(from); - if (from == to) { break } - from = from.nextSibling; - extraLinebreak = false; - } - return text - } - - function domToPos(cm, node, offset) { - var lineNode; - if (node == cm.display.lineDiv) { - lineNode = cm.display.lineDiv.childNodes[offset]; - if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } - node = null; offset = 0; - } else { - for (lineNode = node;; lineNode = lineNode.parentNode) { - if (!lineNode || lineNode == cm.display.lineDiv) { return null } - if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } - } - } - for (var i = 0; i < cm.display.view.length; i++) { - var lineView = cm.display.view[i]; - if (lineView.node == lineNode) - { return locateNodeInLineView(lineView, node, offset) } - } - } - - function locateNodeInLineView(lineView, node, offset) { - var wrapper = lineView.text.firstChild, bad = false; - if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } - if (node == wrapper) { - bad = true; - node = wrapper.childNodes[offset]; - offset = 0; - if (!node) { - var line = lineView.rest ? lst(lineView.rest) : lineView.line; - return badPos(Pos(lineNo(line), line.text.length), bad) - } - } - - var textNode = node.nodeType == 3 ? node : null, topNode = node; - if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { - textNode = node.firstChild; - if (offset) { offset = textNode.nodeValue.length; } - } - while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } - var measure = lineView.measure, maps = measure.maps; - - function find(textNode, topNode, offset) { - for (var i = -1; i < (maps ? maps.length : 0); i++) { - var map = i < 0 ? measure.map : maps[i]; - for (var j = 0; j < map.length; j += 3) { - var curNode = map[j + 2]; - if (curNode == textNode || curNode == topNode) { - var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); - var ch = map[j] + offset; - if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; } - return Pos(line, ch) - } - } - } - } - var found = find(textNode, topNode, offset); - if (found) { return badPos(found, bad) } - - // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems - for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { - found = find(after, after.firstChild, 0); - if (found) - { return badPos(Pos(found.line, found.ch - dist), bad) } - else - { dist += after.textContent.length; } - } - for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { - found = find(before, before.firstChild, -1); - if (found) - { return badPos(Pos(found.line, found.ch + dist$1), bad) } - else - { dist$1 += before.textContent.length; } - } - } - - // TEXTAREA INPUT STYLE - - var TextareaInput = function(cm) { - this.cm = cm; - // See input.poll and input.reset - this.prevInput = ""; - - // Flag that indicates whether we expect input to appear real soon - // now (after some event like 'keypress' or 'input') and are - // polling intensively. - this.pollingFast = false; - // Self-resetting timeout for the poller - this.polling = new Delayed(); - // Used to work around IE issue with selection being forgotten when focus moves away from textarea - this.hasSelection = false; - this.composing = null; - }; - - TextareaInput.prototype.init = function (display) { - var this$1 = this; - - var input = this, cm = this.cm; - this.createField(display); - var te = this.textarea; - - display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); - - // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) - if (ios) { te.style.width = "0px"; } - - on(te, "input", function () { - if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } - input.poll(); - }); - - on(te, "paste", function (e) { - if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } - - cm.state.pasteIncoming = +new Date; - input.fastPoll(); - }); - - function prepareCopyCut(e) { - if (signalDOMEvent(cm, e)) { return } - if (cm.somethingSelected()) { - setLastCopied({lineWise: false, text: cm.getSelections()}); - } else if (!cm.options.lineWiseCopyCut) { - return - } else { - var ranges = copyableRanges(cm); - setLastCopied({lineWise: true, text: ranges.text}); - if (e.type == "cut") { - cm.setSelections(ranges.ranges, null, sel_dontScroll); - } else { - input.prevInput = ""; - te.value = ranges.text.join("\n"); - selectInput(te); - } - } - if (e.type == "cut") { cm.state.cutIncoming = +new Date; } - } - on(te, "cut", prepareCopyCut); - on(te, "copy", prepareCopyCut); - - on(display.scroller, "paste", function (e) { - if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } - if (!te.dispatchEvent) { - cm.state.pasteIncoming = +new Date; - input.focus(); - return - } - - // Pass the `paste` event to the textarea so it's handled by its event listener. - var event = new Event("paste"); - event.clipboardData = e.clipboardData; - te.dispatchEvent(event); - }); - - // Prevent normal selection in the editor (we handle our own) - on(display.lineSpace, "selectstart", function (e) { - if (!eventInWidget(display, e)) { e_preventDefault(e); } - }); - - on(te, "compositionstart", function () { - var start = cm.getCursor("from"); - if (input.composing) { input.composing.range.clear(); } - input.composing = { - start: start, - range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) - }; - }); - on(te, "compositionend", function () { - if (input.composing) { - input.poll(); - input.composing.range.clear(); - input.composing = null; - } - }); - }; - - TextareaInput.prototype.createField = function (_display) { - // Wraps and hides input textarea - this.wrapper = hiddenTextarea(); - // The semihidden textarea that is focused when the editor is - // focused, and receives input. - this.textarea = this.wrapper.firstChild; - }; - - TextareaInput.prototype.screenReaderLabelChanged = function (label) { - // Label for screenreaders, accessibility - if(label) { - this.textarea.setAttribute('aria-label', label); - } else { - this.textarea.removeAttribute('aria-label'); - } - }; - - TextareaInput.prototype.prepareSelection = function () { - // Redraw the selection and/or cursor - var cm = this.cm, display = cm.display, doc = cm.doc; - var result = prepareSelection(cm); - - // Move the hidden textarea near the cursor to prevent scrolling artifacts - if (cm.options.moveInputWithCursor) { - var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); - var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); - result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, - headPos.top + lineOff.top - wrapOff.top)); - result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, - headPos.left + lineOff.left - wrapOff.left)); - } - - return result - }; - - TextareaInput.prototype.showSelection = function (drawn) { - var cm = this.cm, display = cm.display; - removeChildrenAndAdd(display.cursorDiv, drawn.cursors); - removeChildrenAndAdd(display.selectionDiv, drawn.selection); - if (drawn.teTop != null) { - this.wrapper.style.top = drawn.teTop + "px"; - this.wrapper.style.left = drawn.teLeft + "px"; - } - }; - - // Reset the input to correspond to the selection (or to be empty, - // when not typing and nothing is selected) - TextareaInput.prototype.reset = function (typing) { - if (this.contextMenuPending || this.composing) { return } - var cm = this.cm; - if (cm.somethingSelected()) { - this.prevInput = ""; - var content = cm.getSelection(); - this.textarea.value = content; - if (cm.state.focused) { selectInput(this.textarea); } - if (ie && ie_version >= 9) { this.hasSelection = content; } - } else if (!typing) { - this.prevInput = this.textarea.value = ""; - if (ie && ie_version >= 9) { this.hasSelection = null; } - } - }; - - TextareaInput.prototype.getField = function () { return this.textarea }; - - TextareaInput.prototype.supportsTouch = function () { return false }; - - TextareaInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { - try { this.textarea.focus(); } - catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM - } - }; - - TextareaInput.prototype.blur = function () { this.textarea.blur(); }; - - TextareaInput.prototype.resetPosition = function () { - this.wrapper.style.top = this.wrapper.style.left = 0; - }; - - TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; - - // Poll for input changes, using the normal rate of polling. This - // runs as long as the editor is focused. - TextareaInput.prototype.slowPoll = function () { - var this$1 = this; - - if (this.pollingFast) { return } - this.polling.set(this.cm.options.pollInterval, function () { - this$1.poll(); - if (this$1.cm.state.focused) { this$1.slowPoll(); } - }); - }; - - // When an event has just come in that is likely to add or change - // something in the input textarea, we poll faster, to ensure that - // the change appears on the screen quickly. - TextareaInput.prototype.fastPoll = function () { - var missed = false, input = this; - input.pollingFast = true; - function p() { - var changed = input.poll(); - if (!changed && !missed) {missed = true; input.polling.set(60, p);} - else {input.pollingFast = false; input.slowPoll();} - } - input.polling.set(20, p); - }; - - // Read input from the textarea, and update the document to match. - // When something is selected, it is present in the textarea, and - // selected (unless it is huge, in which case a placeholder is - // used). When nothing is selected, the cursor sits after previously - // seen text (can be empty), which is stored in prevInput (we must - // not reset the textarea when typing, because that breaks IME). - TextareaInput.prototype.poll = function () { - var this$1 = this; - - var cm = this.cm, input = this.textarea, prevInput = this.prevInput; - // Since this is called a *lot*, try to bail out as cheaply as - // possible when it is clear that nothing happened. hasSelection - // will be the case when there is a lot of text in the textarea, - // in which case reading its value would be expensive. - if (this.contextMenuPending || !cm.state.focused || - (hasSelection(input) && !prevInput && !this.composing) || - cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) - { return false } - - var text = input.value; - // If nothing changed, bail. - if (text == prevInput && !cm.somethingSelected()) { return false } - // Work around nonsensical selection resetting in IE9/10, and - // inexplicable appearance of private area unicode characters on - // some key combos in Mac (#2689). - if (ie && ie_version >= 9 && this.hasSelection === text || - mac && /[\uf700-\uf7ff]/.test(text)) { - cm.display.input.reset(); - return false - } - - if (cm.doc.sel == cm.display.selForContextMenu) { - var first = text.charCodeAt(0); - if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } - if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } - } - // Find the part of the input that is actually new - var same = 0, l = Math.min(prevInput.length, text.length); - while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } - - runInOp(cm, function () { - applyTextInput(cm, text.slice(same), prevInput.length - same, - null, this$1.composing ? "*compose" : null); - - // Don't leave long text in the textarea, since it makes further polling slow - if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } - else { this$1.prevInput = text; } - - if (this$1.composing) { - this$1.composing.range.clear(); - this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), - {className: "CodeMirror-composing"}); - } - }); - return true - }; - - TextareaInput.prototype.ensurePolled = function () { - if (this.pollingFast && this.poll()) { this.pollingFast = false; } - }; - - TextareaInput.prototype.onKeyPress = function () { - if (ie && ie_version >= 9) { this.hasSelection = null; } - this.fastPoll(); - }; - - TextareaInput.prototype.onContextMenu = function (e) { - var input = this, cm = input.cm, display = cm.display, te = input.textarea; - if (input.contextMenuPending) { input.contextMenuPending(); } - var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; - if (!pos || presto) { return } // Opera is difficult. - - // Reset the current text selection only if the click is done outside of the selection - // and 'resetSelectionOnContextMenu' option is true. - var reset = cm.options.resetSelectionOnContextMenu; - if (reset && cm.doc.sel.contains(pos) == -1) - { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } - - var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; - var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); - input.wrapper.style.cssText = "position: static"; - te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; - var oldScrollY; - if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) - display.input.focus(); - if (webkit) { window.scrollTo(null, oldScrollY); } - display.input.reset(); - // Adds "Select all" to context menu in FF - if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } - input.contextMenuPending = rehide; - display.selForContextMenu = cm.doc.sel; - clearTimeout(display.detectingSelectAll); - - // Select-all will be greyed out if there's nothing to select, so - // this adds a zero-width space so that we can later check whether - // it got selected. - function prepareSelectAllHack() { - if (te.selectionStart != null) { - var selected = cm.somethingSelected(); - var extval = "\u200b" + (selected ? te.value : ""); - te.value = "\u21da"; // Used to catch context-menu undo - te.value = extval; - input.prevInput = selected ? "" : "\u200b"; - te.selectionStart = 1; te.selectionEnd = extval.length; - // Re-set this, in case some other handler touched the - // selection in the meantime. - display.selForContextMenu = cm.doc.sel; - } - } - function rehide() { - if (input.contextMenuPending != rehide) { return } - input.contextMenuPending = false; - input.wrapper.style.cssText = oldWrapperCSS; - te.style.cssText = oldCSS; - if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } - - // Try to detect the user choosing select-all - if (te.selectionStart != null) { - if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } - var i = 0, poll = function () { - if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && - te.selectionEnd > 0 && input.prevInput == "\u200b") { - operation(cm, selectAll)(cm); - } else if (i++ < 10) { - display.detectingSelectAll = setTimeout(poll, 500); - } else { - display.selForContextMenu = null; - display.input.reset(); - } - }; - display.detectingSelectAll = setTimeout(poll, 200); - } - } - - if (ie && ie_version >= 9) { prepareSelectAllHack(); } - if (captureRightClick) { - e_stop(e); - var mouseup = function () { - off(window, "mouseup", mouseup); - setTimeout(rehide, 20); - }; - on(window, "mouseup", mouseup); - } else { - setTimeout(rehide, 50); - } - }; - - TextareaInput.prototype.readOnlyChanged = function (val) { - if (!val) { this.reset(); } - this.textarea.disabled = val == "nocursor"; - this.textarea.readOnly = !!val; - }; - - TextareaInput.prototype.setUneditable = function () {}; - - TextareaInput.prototype.needsContentAttribute = false; - - function fromTextArea(textarea, options) { - options = options ? copyObj(options) : {}; - options.value = textarea.value; - if (!options.tabindex && textarea.tabIndex) - { options.tabindex = textarea.tabIndex; } - if (!options.placeholder && textarea.placeholder) - { options.placeholder = textarea.placeholder; } - // Set autofocus to true if this textarea is focused, or if it has - // autofocus and no other element is focused. - if (options.autofocus == null) { - var hasFocus = activeElt(); - options.autofocus = hasFocus == textarea || - textarea.getAttribute("autofocus") != null && hasFocus == document.body; - } - - function save() {textarea.value = cm.getValue();} - - var realSubmit; - if (textarea.form) { - on(textarea.form, "submit", save); - // Deplorable hack to make the submit method do the right thing. - if (!options.leaveSubmitMethodAlone) { - var form = textarea.form; - realSubmit = form.submit; - try { - var wrappedSubmit = form.submit = function () { - save(); - form.submit = realSubmit; - form.submit(); - form.submit = wrappedSubmit; - }; - } catch(e) {} - } - } - - options.finishInit = function (cm) { - cm.save = save; - cm.getTextArea = function () { return textarea; }; - cm.toTextArea = function () { - cm.toTextArea = isNaN; // Prevent this from being ran twice - save(); - textarea.parentNode.removeChild(cm.getWrapperElement()); - textarea.style.display = ""; - if (textarea.form) { - off(textarea.form, "submit", save); - if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") - { textarea.form.submit = realSubmit; } - } - }; - }; - - textarea.style.display = "none"; - var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, - options); - return cm - } - - function addLegacyProps(CodeMirror) { - CodeMirror.off = off; - CodeMirror.on = on; - CodeMirror.wheelEventPixels = wheelEventPixels; - CodeMirror.Doc = Doc; - CodeMirror.splitLines = splitLinesAuto; - CodeMirror.countColumn = countColumn; - CodeMirror.findColumn = findColumn; - CodeMirror.isWordChar = isWordCharBasic; - CodeMirror.Pass = Pass; - CodeMirror.signal = signal; - CodeMirror.Line = Line; - CodeMirror.changeEnd = changeEnd; - CodeMirror.scrollbarModel = scrollbarModel; - CodeMirror.Pos = Pos; - CodeMirror.cmpPos = cmp; - CodeMirror.modes = modes; - CodeMirror.mimeModes = mimeModes; - CodeMirror.resolveMode = resolveMode; - CodeMirror.getMode = getMode; - CodeMirror.modeExtensions = modeExtensions; - CodeMirror.extendMode = extendMode; - CodeMirror.copyState = copyState; - CodeMirror.startState = startState; - CodeMirror.innerMode = innerMode; - CodeMirror.commands = commands; - CodeMirror.keyMap = keyMap; - CodeMirror.keyName = keyName; - CodeMirror.isModifierKey = isModifierKey; - CodeMirror.lookupKey = lookupKey; - CodeMirror.normalizeKeyMap = normalizeKeyMap; - CodeMirror.StringStream = StringStream; - CodeMirror.SharedTextMarker = SharedTextMarker; - CodeMirror.TextMarker = TextMarker; - CodeMirror.LineWidget = LineWidget; - CodeMirror.e_preventDefault = e_preventDefault; - CodeMirror.e_stopPropagation = e_stopPropagation; - CodeMirror.e_stop = e_stop; - CodeMirror.addClass = addClass; - CodeMirror.contains = contains; - CodeMirror.rmClass = rmClass; - CodeMirror.keyNames = keyNames; - } - - // EDITOR CONSTRUCTOR - - defineOptions(CodeMirror); - - addEditorMethods(CodeMirror); - - // Set up methods on CodeMirror's prototype to redirect to the editor's document. - var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); - for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) - { CodeMirror.prototype[prop] = (function(method) { - return function() {return method.apply(this.doc, arguments)} - })(Doc.prototype[prop]); } } - - eventMixin(Doc); - CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; - - // Extra arguments are stored as the mode's dependencies, which is - // used by (legacy) mechanisms like loadmode.js to automatically - // load a mode. (Preferred mechanism is the require/define calls.) - CodeMirror.defineMode = function(name/*, mode, …*/) { - if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } - defineMode.apply(this, arguments); - }; - - CodeMirror.defineMIME = defineMIME; - - // Minimal default mode. - CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); - CodeMirror.defineMIME("text/plain", "null"); - - // EXTENSIONS - - CodeMirror.defineExtension = function (name, func) { - CodeMirror.prototype[name] = func; - }; - CodeMirror.defineDocExtension = function (name, func) { - Doc.prototype[name] = func; - }; - - CodeMirror.fromTextArea = fromTextArea; - - addLegacyProps(CodeMirror); - - CodeMirror.version = "5.58.3"; - - return CodeMirror; - -}))); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,d=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),r=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),i=/Edge\/(\d+)/.exec(e),w=n||r||i,v=w&&(n?document.documentMode||6:+(i||r)[1]),f=!i&&/WebKit\//.test(e),r=f&&/Qt\/\d+\.\d+/.test(e),o=!i&&/Chrome\//.test(e),p=/Opera\//.test(e),c=/Apple Computer/.test(navigator.vendor),l=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),u=/PhantomJS/.test(e),s=!i&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),a=/Android/.test(e),h=s||a||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),g=s||/Mac/.test(t),m=/\bCrOS\b/.test(e),y=/win/i.test(t),e=p&&e.match(/Version\/(\d*\.\d*)/);(e=e&&Number(e[1]))&&15<=e&&(f=!(p=!1));var b=g&&(r||p&&(null==e||e<12.11)),x=d||w&&9<=v;function C(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var S,L=function(e,t){var n=e.className,r=C(t).exec(n);r&&(t=n.slice(r.index+r[0].length),e.className=n.slice(0,r.index)+(t?r[1]+t:""))};function k(e){for(var t=e.childNodes.length;0<t;--t)e.removeChild(e.firstChild);return e}function T(e,t){return k(e).appendChild(t)}function M(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function N(e,t,n,r){r=M(e,t,n,r);return r.setAttribute("role","presentation"),r}function A(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function O(){var t;try{t=document.activeElement}catch(e){t=document.body||null}for(;t&&t.shadowRoot&&t.shadowRoot.activeElement;)t=t.shadowRoot.activeElement;return t}function D(e,t){var n=e.className;C(t).test(n)||(e.className+=(n?" ":"")+t)}function W(e,t){for(var n=e.split(" "),r=0;r<n.length;r++)n[r]&&!C(n[r]).test(t)&&(t+=" "+n[r]);return t}S=document.createRange?function(e,t,n,r){var i=document.createRange();return i.setEnd(r||e,n),i.setStart(e,t),i}:function(e,t,n){var r=document.body.createTextRange();try{r.moveToElementText(e.parentNode)}catch(e){return r}return r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r};var H=function(e){e.select()};function F(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function E(e,t,n){for(var r in t=t||{},e)!e.hasOwnProperty(r)||!1===n&&t.hasOwnProperty(r)||(t[r]=e[r]);return t}function P(e,t,n,r,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=r||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||t<=s)return l+(t-o);l+=s-o,l+=n-l%n,o=s+1}}s?H=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:w&&(H=function(e){try{e.select()}catch(e){}});var I=function(){this.id=null,this.f=null,this.time=0,this.handler=F(this.onTimeout,this)};function R(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}I.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-+new Date)},I.prototype.set=function(e,t){this.f=t;t=+new Date+e;(!this.id||t<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,e),this.time=t)};var z=50,B={toString:function(){return"CodeMirror.Pass"}},G={scroll:!1},U={origin:"*mouse"},V={origin:"+move"};function K(e,t,n){for(var r=0,i=0;;){var o=e.indexOf("\t",r);-1==o&&(o=e.length);var l=o-r;if(o==e.length||t<=i+l)return r+Math.min(l,t-i);if(i+=o-r,r=o+1,t<=(i+=n-i%n))return r}}var j=[""];function X(e){for(;j.length<=e;)j.push(Y(j)+" ");return j[e]}function Y(e){return e[e.length-1]}function _(e,t){for(var n=[],r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function $(){}function q(e,t){e=Object.create?Object.create(e):($.prototype=e,new $);return t&&E(t,e),e}var Z=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;function Q(e){return/\w/.test(e)||"€"<e&&(e.toUpperCase()!=e.toLowerCase()||Z.test(e))}function J(e,t){return t?!!(-1<t.source.indexOf("\\w")&&Q(e))||t.test(e):Q(e)}function ee(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return;return 1}var te=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ne(e){return 768<=e.charCodeAt(0)&&te.test(e)}function re(e,t,n){for(;(n<0?0<t:t<e.length)&&ne(e.charAt(t));)t+=n;return t}function ie(e,t,n){for(var r=n<t?-1:1;;){if(t==n)return t;var i=(t+n)/2,i=r<0?Math.ceil(i):Math.floor(i);if(i==t)return e(i)?t:n;e(i)?n=i:t=i+r}}var oe=null;function le(e,t,n){var r;oe=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:oe=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:oe=i)}return null!=r?r:oe}var se,ae,ue,ce,he,de,fe,pe=(se="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",ae="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",ue=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,ce=/[stwN]/,he=/[LRr]/,de=/[Lb1n]/,fe=/[1n]/,function(e,t){var n="ltr"==t?"L":"R";if(0==e.length||"ltr"==t&&!ue.test(e))return!1;for(var r,i=e.length,o=[],l=0;l<i;++l)o.push((r=e.charCodeAt(l))<=247?se.charAt(r):1424<=r&&r<=1524?"R":1536<=r&&r<=1785?ae.charAt(r-1536):1774<=r&&r<=2220?"r":8192<=r&&r<=8203?"w":8204==r?"b":"L");for(var s=0,a=n;s<i;++s){var u=o[s];"m"==u?o[s]=a:a=u}for(var c=0,h=n;c<i;++c){var d=o[c];"1"==d&&"r"==h?o[c]="n":he.test(d)&&"r"==(h=d)&&(o[c]="R")}for(var f=1,p=o[0];f<i-1;++f){var g=o[f];"+"==g&&"1"==p&&"1"==o[f+1]?o[f]="1":","!=g||p!=o[f+1]||"1"!=p&&"n"!=p||(o[f]=p),p=g}for(var m=0;m<i;++m){var v=o[m];if(","==v)o[m]="N";else if("%"==v){for(var y=void 0,y=m+1;y<i&&"%"==o[y];++y);for(var b=m&&"!"==o[m-1]||y<i&&"1"==o[y]?"1":"N",w=m;w<y;++w)o[w]=b;m=y-1}}for(var x=0,C=n;x<i;++x){var S=o[x];"L"==C&&"1"==S?o[x]="L":he.test(S)&&(C=S)}for(var L=0;L<i;++L)if(ce.test(o[L])){for(var k=void 0,k=L+1;k<i&&ce.test(o[k]);++k);for(var T="L"==(L?o[L-1]:n),M=T==("L"==(k<i?o[k]:n))?T?"L":"R":n,N=L;N<k;++N)o[N]=M;L=k-1}for(var A,O=[],D=0;D<i;)if(de.test(o[D])){var W=D;for(++D;D<i&&de.test(o[D]);++D);O.push(new ge(0,W,D))}else{var H=D,F=O.length,E="rtl"==t?1:0;for(++D;D<i&&"L"!=o[D];++D);for(var P=H;P<D;)if(fe.test(o[P])){H<P&&(O.splice(F,0,new ge(1,H,P)),F+=E);var I=P;for(++P;P<D&&fe.test(o[P]);++P);O.splice(F,0,new ge(2,I,P)),F+=E,H=P}else++P;H<D&&O.splice(F,0,new ge(1,H,D))}return"ltr"==t&&(1==O[0].level&&(A=e.match(/^\s+/))&&(O[0].from=A[0].length,O.unshift(new ge(0,0,A[0].length))),1==Y(O).level&&(A=e.match(/\s+$/))&&(Y(O).to-=A[0].length,O.push(new ge(0,i-A[0].length,i)))),"rtl"==t?O.reverse():O});function ge(e,t,n){this.level=e,this.from=t,this.to=n}function me(e,t){var n=e.order;return null==n&&(n=e.order=pe(e.text,t)),n}var ve=[],ye=function(e,t,n){e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent?e.attachEvent("on"+t,n):(e=e._handlers||(e._handlers={}))[t]=(e[t]||ve).concat(n)};function be(e,t){return e._handlers&&e._handlers[t]||ve}function we(e,t,n){var r;e.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent?e.detachEvent("on"+t,n):!(e=(r=e._handlers)&&r[t])||-1<(n=R(e,n))&&(r[t]=e.slice(0,n).concat(e.slice(n+1)))}function xe(e,t){var n=be(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i<n.length;++i)n[i].apply(null,r)}function Ce(e,t,n){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),xe(e,n||t.type,e,t),Ne(t)||t.codemirrorIgnore}function Se(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var n=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),r=0;r<t.length;++r)-1==R(n,t[r])&&n.push(t[r])}function Le(e,t){return 0<be(e,t).length}function ke(e){e.prototype.on=function(e,t){ye(this,e,t)},e.prototype.off=function(e,t){we(this,e,t)}}function Te(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Me(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ne(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function Ae(e){Te(e),Me(e)}function Oe(e){return e.target||e.srcElement}function De(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),g&&e.ctrlKey&&1==t&&(t=3),t}var We,He,Fe=function(){if(w&&v<9)return!1;var e=M("div");return"draggable"in e||"dragDrop"in e}();var Ee=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(n.push(o.slice(0,l)),t+=l+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},Pe=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Ie="oncopy"in(r=M("div"))||(r.setAttribute("oncopy","return;"),"function"==typeof r.oncopy),Re=null;var ze={},Be={};function Ge(e){if("string"==typeof e&&Be.hasOwnProperty(e))e=Be[e];else if(e&&"string"==typeof e.name&&Be.hasOwnProperty(e.name)){var t=Be[e.name];"string"==typeof t&&(t={name:t}),(e=q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ge("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ge("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function Ue(e,t){t=Ge(t);var n=ze[t.name];if(!n)return Ue(e,"text/plain");var r=n(e,t);if(Ve.hasOwnProperty(t.name)){var i,o=Ve[t.name];for(i in o)o.hasOwnProperty(i)&&(r.hasOwnProperty(i)&&(r["_"+i]=r[i]),r[i]=o[i])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}var Ve={};function Ke(e,t){E(t,Ve.hasOwnProperty(e)?Ve[e]:Ve[e]={})}function je(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n,r={};for(n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function Xe(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function Ye(e,t,n){return!e.startState||e.startState(t,n)}var _e=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};function $e(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t<o){n=i;break}t-=o}return n.lines[t]}function qe(e,t,n){var r=[],i=t.line;return e.iter(t.line,n.line+1,function(e){e=e.text;i==n.line&&(e=e.slice(0,n.ch)),i==t.line&&(e=e.slice(t.ch)),r.push(e),++i}),r}function Ze(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function Qe(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function Je(e){if(null==e.parent)return null;for(var t=e.parent,n=R(t.lines,e),r=t.parent;r;r=(t=r).parent)for(var i=0;r.children[i]!=t;++i)n+=r.children[i].chunkSize();return n+t.first}function et(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],o=i.height;if(t<o){e=i;continue e}t-=o,n+=i.chunkSize()}return n}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return n+l}function tt(e,t){return t>=e.first&&t<e.first+e.size}function nt(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function rt(e,t,n){if(void 0===n&&(n=null),!(this instanceof rt))return new rt(e,t,n);this.line=e,this.ch=t,this.sticky=n}function it(e,t){return e.line-t.line||e.ch-t.ch}function ot(e,t){return e.sticky==t.sticky&&0==it(e,t)}function lt(e){return rt(e.line,e.ch)}function st(e,t){return it(e,t)<0?t:e}function at(e,t){return it(e,t)<0?e:t}function ut(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function ct(e,t){if(t.line<e.first)return rt(e.first,0);var n=e.first+e.size-1;return t.line>n?rt(n,$e(e,n).text.length):(e=$e(e,(n=t).line).text.length,null==(t=n.ch)||e<t?rt(n.line,e):t<0?rt(n.line,0):n)}function ht(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=ct(e,t[r]);return n}_e.prototype.eol=function(){return this.pos>=this.string.length},_e.prototype.sol=function(){return this.pos==this.lineStart},_e.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},_e.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},_e.prototype.eat=function(e){var t=this.string.charAt(this.pos),e="string"==typeof e?t==e:t&&(e.test?e.test(t):e(t));if(e)return++this.pos,t},_e.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},_e.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},_e.prototype.skipToEnd=function(){this.pos=this.string.length},_e.prototype.skipTo=function(e){e=this.string.indexOf(e,this.pos);if(-1<e)return this.pos=e,!0},_e.prototype.backUp=function(e){this.pos-=e},_e.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=P(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?P(this.string,this.lineStart,this.tabSize):0)},_e.prototype.indentation=function(){return P(this.string,null,this.tabSize)-(this.lineStart?P(this.string,this.lineStart,this.tabSize):0)},_e.prototype.match=function(e,t,n){if("string"!=typeof e){var r=this.string.slice(this.pos).match(e);return r&&0<r.index?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}r=function(e){return n?e.toLowerCase():e};if(r(this.string.substr(this.pos,e.length))==r(e))return!1!==t&&(this.pos+=e.length),!0},_e.prototype.current=function(){return this.string.slice(this.start,this.pos)},_e.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},_e.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},_e.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var dt=function(e,t){this.state=e,this.lookAhead=t},ft=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};function pt(t,n,r,e){var a=[t.state.modeGen],i={};St(t,n.text,t.doc.mode,r,function(e,t){return a.push(e,t)},i,e);for(var u=r.state,o=0;o<t.state.overlays.length;++o)!function(e){r.baseTokens=a;var o=t.state.overlays[e],l=1,s=0;r.state=!0,St(t,n.text,o.mode,r,function(e,t){for(var n=l;s<e;){var r=a[l];e<r&&a.splice(l,1,e,a[l+1],r),l+=2,s=Math.min(e,r)}if(t)if(o.opaque)a.splice(n,l-n,e,"overlay "+t),l=n+2;else for(;n<l;n+=2){var i=a[n+1];a[n+1]=(i?i+" ":"")+"overlay "+t}},i),r.state=u,r.baseTokens=null,r.baseTokenPos=1}(o);return{styles:a,classes:i.bgClass||i.textClass?i:null}}function gt(e,t,n){var r,i,o;return t.styles&&t.styles[0]==e.state.modeGen||(r=mt(e,Je(t)),i=t.text.length>e.options.maxHighlightLength&&je(e.doc.mode,r.state),o=pt(e,t,r),i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))),t.styles}function mt(n,r,e){var t=n.doc,i=n.display;if(!t.mode.startState)return new ft(t,!0,r);var o=function(e,t,n){for(var r,i,o=e.doc,l=n?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;l<s;--s){if(s<=o.first)return o.first;var a=$e(o,s-1),u=a.stateAfter;if(u&&(!n||s+(u instanceof dt?u.lookAhead:0)<=o.modeFrontier))return s;a=P(a.text,null,e.options.tabSize);(null==i||a<r)&&(i=s-1,r=a)}return i}(n,r,e),l=o>t.first&&$e(t,o-1).stateAfter,s=l?ft.fromSaved(t,l,o):new ft(t,Ye(t.mode),o);return t.iter(o,r,function(e){vt(n,e.text,s);var t=s.line;e.stateAfter=t==r-1||t%5==0||t>=i.viewFrom&&t<i.viewTo?s.save():null,s.nextLine()}),e&&(t.modeFrontier=s.line),s}function vt(e,t,n,r){var i=e.doc.mode,o=new _e(t,e.options.tabSize,n);for(o.start=o.pos=r||0,""==t&&yt(i,n.state);!o.eol();)bt(i,o,n.state),o.start=o.pos}function yt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){t=Xe(e,t);return t.mode.blankLine?t.mode.blankLine(t.state):void 0}}function bt(e,t,n,r){for(var i=0;i<10;i++){r&&(r[0]=Xe(e,n).mode);var o=e.token(t,n);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}ft.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},ft.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},ft.prototype.nextLine=function(){this.line++,0<this.maxLookAhead&&this.maxLookAhead--},ft.fromSaved=function(e,t,n){return t instanceof dt?new ft(e,je(e.mode,t.state),n,t.lookAhead):new ft(e,je(e.mode,t),n)},ft.prototype.save=function(e){e=!1!==e?je(this.doc.mode,this.state):this.state;return 0<this.maxLookAhead?new dt(e,this.maxLookAhead):e};var wt=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function xt(e,t,n,r){var i,o,l=e.doc,s=l.mode,a=$e(l,(t=ct(l,t)).line),u=mt(e,t.line,n),c=new _e(a.text,e.options.tabSize,u);for(r&&(o=[]);(r||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=bt(s,c,u.state),r&&o.push(new wt(c,i,je(l.mode,u.state)));return r?o:new wt(c,i,u.state)}function Ct(e,t){if(e)for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";null==t[r]?t[r]=n[2]:new RegExp("(?:^|\\s)"+n[2]+"(?:$|\\s)").test(t[r])||(t[r]+=" "+n[2])}return e}function St(e,t,n,r,i,o,l){var s=n.flattenSpans;null==s&&(s=e.options.flattenSpans);var a=0,u=null,c=new _e(t,e.options.tabSize,r),h=e.options.addModeClass&&[null];for(""==t&&Ct(yt(n,r.state),o);!c.eol();){var d,f=c.pos>e.options.maxHighlightLength?(s=!1,l&&vt(e,t,r,c.pos),c.pos=t.length,null):Ct(bt(n,c,r.state,h),o);if(!h||(d=h[0].name)&&(f="m-"+(f?d+" "+f:d)),!s||u!=f){for(;a<c.start;)i(a=Math.min(c.start,a+5e3),u);u=f}c.start=c.pos}for(;a<c.pos;){var p=Math.min(c.pos,a+5e3);i(p,u),a=p}}var Lt=!1,kt=!1;function Tt(e,t,n){this.marker=e,this.from=t,this.to=n}function Mt(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function Nt(e,t){if(t.full)return null;var n=tt(e,t.from.line)&&$e(e,t.from.line).markedSpans,r=tt(e,t.to.line)&&$e(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,o=t.to.ch,e=0==it(t.from,t.to),l=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t))&&(l.from!=t||"bookmark"!=s.type||n&&l.marker.insertLeft)||(o=null==l.to||(s.inclusiveRight?l.to>=t:l.to>t),(r=r||[]).push(new Tt(s,l.from,o?null:l.to)))}return r}(n,i,e),s=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o,l=e[i],s=l.marker;!(null==l.to||(s.inclusiveRight?l.to>=t:l.to>t))&&(l.from!=t||"bookmark"!=s.type||n&&!l.marker.insertLeft)||(o=null==l.from||(s.inclusiveLeft?l.from<=t:l.from<t),(r=r||[]).push(new Tt(s,o?null:l.from-t,null==l.to?null:l.to-t)))}return r}(r,o,e),a=1==t.text.length,u=Y(t.text).length+(a?i:0);if(l)for(var c=0;c<l.length;++c){var h,d=l[c];null==d.to&&((h=Mt(s,d.marker))?a&&(d.to=null==h.to?null:h.to+u):d.to=i)}if(s)for(var f=0;f<s.length;++f){var p=s[f];null!=p.to&&(p.to+=u),null==p.from?Mt(l,p.marker)||(p.from=u,a&&(l=l||[]).push(p)):(p.from+=u,a&&(l=l||[]).push(p))}l=l&&At(l),s&&s!=l&&(s=At(s));var g=[l];if(!a){var m,v=t.text.length-2;if(0<v&&l)for(var y=0;y<l.length;++y)null==l[y].to&&(m=m||[]).push(new Tt(l[y].marker,null,null));for(var b=0;b<v;++b)g.push(m);g.push(s)}return g}function At(e){for(var t=0;t<e.length;++t){var n=e[t];null!=n.from&&n.from==n.to&&!1!==n.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function Ot(e){var t=e.markedSpans;if(t){for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}}function Dt(e,t){if(t){for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}}function Wt(e){return e.inclusiveLeft?-1:0}function Ht(e){return e.inclusiveRight?1:0}function Ft(e,t){var n=e.lines.length-t.lines.length;if(0!=n)return n;var r=e.find(),i=t.find(),n=it(r.from,i.from)||Wt(e)-Wt(t);if(n)return-n;i=it(r.to,i.to)||Ht(e)-Ht(t);return i||t.id-e.id}function Et(e,t){var n,r=kt&&e.markedSpans;if(r)for(var i,o=0;o<r.length;++o)(i=r[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!n||Ft(n,i.marker)<0)&&(n=i.marker);return n}function Pt(e){return Et(e,!0)}function It(e){return Et(e,!1)}function Rt(e,t,n,r,i){var t=$e(e,t),o=kt&&t.markedSpans;if(o)for(var l=0;l<o.length;++l){var s=o[l];if(s.marker.collapsed){var a=s.marker.find(0),u=it(a.from,n)||Wt(s.marker)-Wt(i),c=it(a.to,r)||Ht(s.marker)-Ht(i);if(!(0<=u&&c<=0||u<=0&&0<=c)&&(u<=0&&(s.marker.inclusiveRight&&i.inclusiveLeft?0<=it(a.to,n):0<it(a.to,n))||0<=u&&(s.marker.inclusiveRight&&i.inclusiveLeft?it(a.from,r)<=0:it(a.from,r)<0)))return 1}}}function zt(e){for(var t;t=Pt(e);)e=t.find(-1,!0).line;return e}function Bt(e,t){var n=$e(e,t),e=zt(n);return n==e?t:Je(e)}function Gt(e,t){if(t>e.lastLine())return t;var n,r=$e(e,t);if(!Ut(e,r))return t;for(;n=It(r);)r=n.find(1,!0).line;return Je(r)+1}function Ut(e,t){var n=kt&&t.markedSpans;if(n)for(var r,i=0;i<n.length;++i)if((r=n[i]).marker.collapsed){if(null==r.from)return!0;if(!r.marker.widgetNode&&0==r.from&&r.marker.inclusiveLeft&&function e(t,n,r){if(null==r.to){var i=r.marker.find(1,!0);return e(t,i.line,Mt(i.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==n.text.length)return!0;for(var o=void 0,l=0;l<n.markedSpans.length;++l)if((o=n.markedSpans[l]).marker.collapsed&&!o.marker.widgetNode&&o.from==r.to&&(null==o.to||o.to!=r.from)&&(o.marker.inclusiveLeft||r.marker.inclusiveRight)&&e(t,n,o))return!0}(e,t,r))return!0}}function Vt(e){for(var t=0,n=(e=zt(e)).parent,r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var o=n.parent;o;o=(n=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==n)break;t+=s.height}return t}function Kt(e){if(0==e.height)return 0;for(var t,n=e.text.length,r=e;t=Pt(r);){var i=t.find(0,!0),r=i.from.line;n+=i.from.ch-i.to.ch}for(r=e;t=It(r);){var o=t.find(0,!0);n-=r.text.length-o.from.ch,n+=(r=o.to.line).text.length-o.to.ch}return n}function jt(e){var n=e.display,e=e.doc;n.maxLine=$e(e,e.first),n.maxLineLength=Kt(n.maxLine),n.maxLineChanged=!0,e.iter(function(e){var t=Kt(e);t>n.maxLineLength&&(n.maxLineLength=t,n.maxLine=e)})}var Xt=function(e,t,n){this.text=e,Dt(this,t),this.height=n?n(this):1};Xt.prototype.lineNo=function(){return Je(this)},ke(Xt);var Yt={},_t={};function $t(e,t){if(!e||/^\s*$/.test(e))return null;t=t.addModeClass?_t:Yt;return t[e]||(t[e]=e.replace(/\S+/g,"cm-$&"))}function qt(e,t){var n=N("span",null,null,f?"padding-right: .1px":null),r={pre:N("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,l=void 0;r.pos=0,r.addToken=Qt,function(e){if(null!=He)return He;var t=T(e,document.createTextNode("AخA")),n=S(t,0,1).getBoundingClientRect(),t=S(t,1,2).getBoundingClientRect();return k(e),n&&n.left!=n.right&&(He=t.right-n.right<3)}(e.display.measure)&&(l=me(o,e.doc.direction))&&(r.addToken=function(h,d){return function(e,t,n,r,i,o,l){n=n?n+" cm-force-border":"cm-force-border";for(var s=e.pos,a=s+t.length;;){for(var u=void 0,c=0;c<d.length&&!((u=d[c]).to>s&&u.from<=s);c++);if(u.to>=a)return h(e,t,n,r,i,o,l);h(e,t.slice(0,u.to-s),n,r,null,o,l),r=null,t=t.slice(u.to-s),s=u.to}}}(r.addToken,l)),r.map=[],function(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(!r){for(var l=1;l<n.length;l+=2)t.addToken(t,i.slice(o,o=n[l]),$t(n[l+1],t.cm.options));return}for(var s,a,u,c,h,d,f,p=i.length,g=0,m=1,v="",y=0;;){if(y==g){u=c=h=a="",d=f=null,y=1/0;for(var b=[],w=void 0,x=0;x<r.length;++x){var C=r[x],S=C.marker;if("bookmark"==S.type&&C.from==g&&S.widgetNode)b.push(S);else if(C.from<=g&&(null==C.to||C.to>g||S.collapsed&&C.to==g&&C.from==g)){if(null!=C.to&&C.to!=g&&y>C.to&&(y=C.to,c=""),S.className&&(u+=" "+S.className),S.css&&(a=(a?a+";":"")+S.css),S.startStyle&&C.from==g&&(h+=" "+S.startStyle),S.endStyle&&C.to==y&&(w=w||[]).push(S.endStyle,C.to),S.title&&((f=f||{}).title=S.title),S.attributes)for(var L in S.attributes)(f=f||{})[L]=S.attributes[L];S.collapsed&&(!d||Ft(d.marker,S)<0)&&(d=C)}else C.from>g&&y>C.from&&(y=C.from)}if(w)for(var k=0;k<w.length;k+=2)w[k+1]==y&&(c+=" "+w[k]);if(!d||d.from==g)for(var T=0;T<b.length;++T)Jt(t,0,b[T]);if(d&&(d.from||0)==g){if(Jt(t,(null==d.to?p+1:d.to)-g,d.marker,null==d.from),null==d.to)return;d.to==g&&(d=!1)}}if(p<=g)break;for(var M=Math.min(p,y);;){if(v){var N,A=g+v.length;if(d||(N=M<A?v.slice(0,M-g):v,t.addToken(t,N,s?s+u:u,h,g+N.length==y?c:"",a,f)),M<=A){v=v.slice(M-g),g=M;break}g=A,h=""}v=i.slice(o,o=n[m++]),s=$t(n[m++],t.cm.options)}}}(o,r,gt(e,o,t!=e.display.externalMeasured&&Je(o))),o.styleClasses&&(o.styleClasses.bgClass&&(r.bgClass=W(o.styleClasses.bgClass,r.bgClass||"")),o.styleClasses.textClass&&(r.textClass=W(o.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(function(e){null==We&&(t=M("span","​"),T(e,M("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(We=t.offsetWidth<=1&&2<t.offsetHeight&&!(w&&v<8)));var t=We?M("span","​"):M("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return t.setAttribute("cm-text",""),t}(e.display.measure))),0==i?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return f&&(n=r.content.lastChild,(/\bcm-tab\b/.test(n.className)||n.querySelector&&n.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")),xe(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=W(r.pre.className,r.textClass||"")),r}function Zt(e){var t=M("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Qt(e,t,n,r,i,o,l){if(t){var s,a=e.splitSpaces?function(e,t){if(1<e.length&&!/ /.test(e))return e;for(var n=t,r="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!n||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),r+=o,n=" "==o}return r}(t,e.trailingSpace):t,u=e.cm.state.specialChars,c=!1;if(u.test(t)){s=document.createDocumentFragment();for(var h=0;;){u.lastIndex=h;var d=u.exec(t),f=d?d.index-h:t.length-h;if(f&&(p=document.createTextNode(a.slice(h,h+f)),w&&v<9?s.appendChild(M("span",[p])):s.appendChild(p),e.map.push(e.pos,e.pos+f,p),e.col+=f,e.pos+=f),!d)break;h+=1+f;var p=void 0;"\t"==d[0]?(f=(f=e.cm.options.tabSize)-e.col%f,(p=s.appendChild(M("span",X(f),"cm-tab"))).setAttribute("role","presentation"),p.setAttribute("cm-text","\t"),e.col+=f):("\r"==d[0]||"\n"==d[0]?(p=s.appendChild(M("span","\r"==d[0]?"␍":"␤","cm-invalidchar"))).setAttribute("cm-text",d[0]):((p=e.cm.options.specialCharPlaceholder(d[0])).setAttribute("cm-text",d[0]),w&&v<9?s.appendChild(M("span",[p])):s.appendChild(p)),e.col+=1),e.map.push(e.pos,e.pos+1,p),e.pos++}}else e.col+=t.length,s=document.createTextNode(a),e.map.push(e.pos,e.pos+t.length,s),w&&v<9&&(c=!0),e.pos+=t.length;if(e.trailingSpace=32==a.charCodeAt(t.length-1),n||r||i||c||o||l){n=n||"";r&&(n+=r),i&&(n+=i);var g=M("span",[s],n,o);if(l)for(var m in l)l.hasOwnProperty(m)&&"style"!=m&&"class"!=m&&g.setAttribute(m,l[m]);return e.content.appendChild(g)}e.content.appendChild(s)}}function Jt(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i=i||e.content.appendChild(document.createElement("span"))).setAttribute("cm-marker",n.id),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function en(e,t,n){this.line=t,this.rest=function(e){for(var t,n;t=It(e);)e=t.find(1,!0).line,(n=n||[]).push(e);return n}(t),this.size=this.rest?Je(Y(this.rest))-n+1:1,this.node=this.text=null,this.hidden=Ut(e,t)}function tn(e,t,n){for(var r=[],i=t;i<n;i=l){var o=new en(e.doc,$e(e.doc,i),i),l=i+o.size;r.push(o)}return r}var nn=null;function rn(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n<t.length;n++)t[n].call(null);for(var r=0;r<e.ops.length;r++){var i=e.ops[r];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(n<t.length)}(n)}finally{nn=null,t(n)}}var on=null;function ln(e,t){var n=be(e,t);if(n.length){var r,i=Array.prototype.slice.call(arguments,2);nn?r=nn.delayedCallbacks:on?r=on:(r=on=[],setTimeout(sn,0));for(var o=0;o<n.length;++o)!function(e){r.push(function(){return n[e].apply(null,i)})}(o)}}function sn(){var e=on;on=null;for(var t=0;t<e.length;++t)e[t]()}function an(e,t,n,r){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?function(e,t){var n=t.text.className,r=cn(e,t);t.text==t.node&&(t.node=r.pre);t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,hn(e,t)):n&&(t.text.className=n)}(e,t):"gutter"==o?dn(e,t,n,r):"class"==o?hn(e,t):"widget"==o&&function(e,t,n){t.alignable&&(t.alignable=null);for(var r=C("CodeMirror-linewidget"),i=t.node.firstChild,o=void 0;i;i=o)o=i.nextSibling,r.test(i.className)&&t.node.removeChild(i);fn(e,t,n)}(e,t,r)}t.changes=null}function un(e){return e.node==e.text&&(e.node=M("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),w&&v<8&&(e.node.style.zIndex=2)),e.node}function cn(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):qt(e,t)}function hn(e,t){var n,r;n=e,(r=(i=t).bgClass?i.bgClass+" "+(i.line.bgClass||""):i.line.bgClass)&&(r+=" CodeMirror-linebackground"),i.background?r?i.background.className=r:(i.background.parentNode.removeChild(i.background),i.background=null):r&&(e=un(i),i.background=e.insertBefore(M("div",null,r),e.firstChild),n.display.input.setUneditable(i.background)),t.line.wrapClass?un(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var i=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=i||""}function dn(e,t,n,r){t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass&&(o=un(t),t.gutterBackground=M("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px; width: "+r.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),o.insertBefore(t.gutterBackground,t.text));var i=t.line.gutterMarkers;if(e.options.lineNumbers||i){var o=un(t),l=t.gutter=M("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px");if(e.display.input.setUneditable(l),o.insertBefore(l,t.text),t.line.gutterClass&&(l.className+=" "+t.line.gutterClass),!e.options.lineNumbers||i&&i["CodeMirror-linenumbers"]||(t.lineNumber=l.appendChild(M("div",nt(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),i)for(var s=0;s<e.display.gutterSpecs.length;++s){var a=e.display.gutterSpecs[s].className,u=i.hasOwnProperty(a)&&i[a];u&&l.appendChild(M("div",[u],"CodeMirror-gutter-elt","left: "+r.gutterLeft[a]+"px; width: "+r.gutterWidth[a]+"px"))}}}function fn(e,t,n){if(pn(e,t.line,t,n,!0),t.rest)for(var r=0;r<t.rest.length;r++)pn(e,t.rest[r],t,n,!1)}function pn(e,t,n,r,i){if(t.widgets)for(var o=un(n),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=M("div",[a.node],"CodeMirror-linewidget"+(a.className?" "+a.className:""));a.handleMouseEvents||u.setAttribute("cm-ignore-events","true"),function(e,t,n,r){e.noHScroll&&((n.alignable||(n.alignable=[])).push(t),n=r.wrapperWidth,t.style.left=r.fixedPos+"px",e.coverGutter||(n-=r.gutterTotalWidth,t.style.paddingLeft=r.gutterTotalWidth+"px"),t.style.width=n+"px");e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-r.gutterTotalWidth+"px"))}(a,u,n,r),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,n.gutter||n.text):o.appendChild(u),ln(a,"redraw")}}function gn(e){if(null!=e.height)return e.height;var t,n=e.doc.cm;return n?(A(document.body,e.node)||(t="position: relative;",e.coverGutter&&(t+="margin-left: -"+n.display.gutters.offsetWidth+"px;"),e.noHScroll&&(t+="width: "+n.display.wrapper.clientWidth+"px;"),T(n.display.measure,M("div",[e.node],null,t))),e.height=e.node.parentNode.offsetHeight):0}function mn(e,t){for(var n=Oe(t);n!=e.wrapper;n=n.parentNode)if(!n||1==n.nodeType&&"true"==n.getAttribute("cm-ignore-events")||n.parentNode==e.sizer&&n!=e.mover)return 1}function vn(e){return e.lineSpace.offsetTop}function yn(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function bn(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=T(e.measure,M("pre","x","CodeMirror-line-like")),t=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,t={left:parseInt(t.paddingLeft),right:parseInt(t.paddingRight)};return isNaN(t.left)||isNaN(t.right)||(e.cachedPaddingH=t),t}function wn(e){return z-e.display.nativeBarWidth}function xn(e){return e.display.scroller.clientWidth-wn(e)-e.display.barWidth}function Cn(e){return e.display.scroller.clientHeight-wn(e)-e.display.barHeight}function Sn(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var i=0;i<e.rest.length;i++)if(Je(e.rest[i])>n)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Ln(e,t,n,r){return Mn(e,Tn(e,t),n,r)}function kn(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[er(e,t)];e=e.display.externalMeasured;return e&&t>=e.lineN&&t<e.lineN+e.size?e:void 0}function Tn(e,t){var n,r,i=Je(t),o=kn(e,i);o&&!o.text?o=null:o&&o.changes&&(an(e,o,i,$n(e)),e.curOp.forceUpdate=!0),o||(n=e,e=Je(r=zt(r=t)),(r=n.display.externalMeasured=new en(n.doc,r,e)).lineN=e,e=r.built=qt(n,r),r.text=e.pre,T(n.display.lineMeasure,e.pre),o=r);i=Sn(o,t,i);return{line:t,view:o,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function Mn(e,t,n,r,i){t.before&&(n=-1);var o,l=n+(r||"");return t.cache.hasOwnProperty(l)?o=t.cache[l]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(function(e,t,n){var r=e.options.lineWrapping,e=r&&xn(e);if(!t.measure.heights||r&&t.measure.width!=e){var i=t.measure.heights=[];if(r){t.measure.width=e;for(var o=t.text.firstChild.getClientRects(),l=0;l<o.length-1;l++){var s=o[l],a=o[l+1];2<Math.abs(s.bottom-a.bottom)&&i.push((s.bottom+a.top)/2-n.top)}}i.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,n,r){var i,o=On(t.map,n,r),l=o.node,s=o.start,a=o.end,u=o.collapse;if(3==l.nodeType){for(var c=0;c<4;c++){for(;s&&ne(t.line.text.charAt(o.coverStart+s));)--s;for(;o.coverStart+a<o.coverEnd&&ne(t.line.text.charAt(o.coverStart+a));)++a;if((i=w&&v<9&&0==s&&a==o.coverEnd-o.coverStart?l.parentNode.getBoundingClientRect():function(e,t){var n=An;if("left"==t)for(var r=0;r<e.length&&(n=e[r]).left==n.right;r++);else for(var i=e.length-1;0<=i&&(n=e[i]).left==n.right;i--);return n}(S(l,s,a).getClientRects(),r)).left||i.right||0==s)break;a=s,--s,u="right"}w&&v<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Re)return Re;var e=(t=T(e,M("span","x"))).getBoundingClientRect(),t=S(t,0,1).getBoundingClientRect();return Re=1<Math.abs(e.left-t.left)}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,e=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*e,bottom:t.bottom*e}}(e.display.measure,i))}else 0<s&&(u=r="right"),i=e.options.lineWrapping&&1<(g=l.getClientRects()).length?g["right"==r?g.length-1:0]:l.getBoundingClientRect();!(w&&v<9)||s||i&&(i.left||i.right)||(m=l.parentNode.getClientRects()[0],i=m?{left:m.left,right:m.left+_n(e.display),top:m.top,bottom:m.bottom}:An);for(var h=i.top-t.rect.top,n=i.bottom-t.rect.top,d=(h+n)/2,f=t.view.measure.heights,p=0;p<f.length-1&&!(d<f[p]);p++);var g=p?f[p-1]:0,m=f[p],m={left:("right"==u?i.right:i.left)-t.rect.left,right:("left"==u?i.left:i.right)-t.rect.left,top:g,bottom:m};i.left||i.right||(m.bogus=!0);e.options.singleCursorHeightPerLine||(m.rtop=h,m.rbottom=n);return m}(e,t,n,r)).bogus||(t.cache[l]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Nn,An={left:0,right:0,top:0,bottom:0};function On(e,t,n){for(var r,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,a<=t&&(l="right")),null!=i){if(r=e[u+2],s==a&&n==(r.insertLeft?"left":"right")&&(l=n),"left"==n&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)r=e[2+(u-=3)],l="left";if("right"==n&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)r=e[(u+=3)+2],l="right";break}return{node:r,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Dn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function Wn(e){e.display.externalMeasure=null,k(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Dn(e.display.view[t])}function Hn(e){Wn(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function Fn(){return o&&a?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function En(){return o&&a?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function Pn(e){var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;++n)e.widgets[n].above&&(t+=gn(e.widgets[n]));return t}function In(e,t,n,r,i){if(i||(i=Pn(t),n.top+=i,n.bottom+=i),"line"==r)return n;r=r||"local";t=Vt(t);return"local"==r?t+=vn(e.display):t-=e.display.viewOffset,"page"!=r&&"window"!=r||(t+=(e=e.display.lineSpace.getBoundingClientRect()).top+("window"==r?0:En()),r=e.left+("window"==r?0:Fn()),n.left+=r,n.right+=r),n.top+=t,n.bottom+=t,n}function Rn(e,t,n){if("div"==n)return t;var r=t.left,t=t.top;"page"==n?(r-=Fn(),t-=En()):"local"!=n&&n||(r+=(n=e.display.sizer.getBoundingClientRect()).left,t+=n.top);e=e.display.lineSpace.getBoundingClientRect();return{left:r-e.left,top:t-e.top}}function zn(e,t,n,r,i){return In(e,r=r||$e(e.doc,t.line),Ln(e,r,t.ch,i),n)}function Bn(n,e,r,i,o,l){function s(e,t){e=Mn(n,o,e,t?"right":"left",l);return t?e.left=e.right:e.right=e.left,In(n,i,e,r)}i=i||$e(n.doc,e.line),o=o||Tn(n,i);var a=me(i,n.doc.direction),t=e.ch,u=e.sticky;if(t>=i.text.length?(t=i.text.length,u="before"):t<=0&&(t=0,u="after"),!a)return s("before"==u?t-1:t,"before"==u);function c(e,t,n){return s(n?e-1:e,1==a[t].level!=n)}var h=le(a,t,u),e=oe,h=c(t,h,"before"==u);return null!=e&&(h.other=c(t,e,"before"!=u)),h}function Gn(e,t){var n=0;t=ct(e.doc,t),e.options.lineWrapping||(n=_n(e.display)*t.ch);t=$e(e.doc,t.line),e=Vt(t)+vn(e.display);return{left:n,right:n,top:e,bottom:e+t.height}}function Un(e,t,n,r,i){n=rt(e,t,n);return n.xRel=i,r&&(n.outside=r),n}function Vn(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return Un(r.first,0,null,-1,-1);var i=et(r,n),o=r.first+r.size-1;if(o<i)return Un(r.first+r.size-1,$e(r,o).text.length,null,1,1);t<0&&(t=0);for(var l=$e(r,i);;){var s=function(n,e,t,r,i){i-=Vt(e);var o=Tn(n,e),l=Pn(e),s=0,a=e.text.length,u=!0,c=me(e,n.doc.direction);c&&(f=(n.options.lineWrapping?function(e,t,n,r,i,o,l){var l=Kn(e,t,r,l),s=l.begin,a=l.end;/\s/.test(t.text.charAt(a-1))&&a--;for(var u=null,c=null,h=0;h<i.length;h++){var d,f=i[h];f.from>=a||f.to<=s||(d=1!=f.level,d=Mn(e,r,d?Math.min(a,f.to)-1:Math.max(s,f.from)).right,d=d<o?o-d+1e9:d-o,(!u||d<c)&&(u=f,c=d))}u=u||i[i.length-1];u.from<s&&(u={from:s,to:u.to,level:u.level});u.to>a&&(u={from:u.from,to:a,level:u.level});return u}:function(n,r,i,o,l,s,a){var e=ie(function(e){var t=l[e],e=1!=t.level;return Xn(Bn(n,rt(i,e?t.to:t.from,e?"before":"after"),"line",r,o),s,a,!0)},0,l.length-1),t=l[e];{var u;0<e&&(u=1!=t.level,Xn(u=Bn(n,rt(i,u?t.from:t.to,u?"after":"before"),"line",r,o),s,a,!0)&&u.top>a&&(t=l[e-1]))}return t})(n,e,t,o,c,r,i),u=1!=f.level,s=u?f.from:f.to-1,a=u?f.to:f.from-1);var h=null,d=null,c=ie(function(e){var t=Mn(n,o,e);return t.top+=l,t.bottom+=l,Xn(t,r,i,!1)&&(t.top<=i&&t.left<=r&&(h=e,d=t),1)},s,a),f=!1;{var p,g;d?(p=r-d.left<d.right-r,c=h+((g=p==u)?0:1),g=g?"after":"before",p=p?d.left:d.right):(u||c!=a&&c!=s||c++,g=0==c||c!=e.text.length&&Mn(n,o,c-(u?1:0)).bottom+l<=i==u?"after":"before",u=Bn(n,rt(t,c,g),"line",e,o),p=u.left,f=i<u.top?-1:i>=u.bottom?1:0)}return c=re(e.text,c,1),Un(t,c,g,f,r-p)}(e,l,i,t,n),a=function(e,t){var n,r=kt&&e.markedSpans;if(r)for(var i=0;i<r.length;++i){var o=r[i];o.marker.collapsed&&(null==o.from||o.from<t)&&(null==o.to||o.to>t)&&(!n||Ft(n,o.marker)<0)&&(n=o.marker)}return n}(l,s.ch+(0<s.xRel||0<s.outside?1:0));if(!a)return s;a=a.find(1);if(a.line==i)return a;l=$e(r,i=a.line)}}function Kn(t,e,n,r){r-=Pn(e);var i=e.text.length,e=ie(function(e){return Mn(t,n,e-1).bottom<=r},i,0);return{begin:e,end:i=ie(function(e){return Mn(t,n,e).top>r},e,i)}}function jn(e,t,n,r){return Kn(e,t,n=n||Tn(e,t),In(e,t,Mn(e,n,r),"line").top)}function Xn(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function Yn(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Nn){Nn=M("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Nn.appendChild(document.createTextNode("x")),Nn.appendChild(M("br"));Nn.appendChild(document.createTextNode("x"))}T(e.measure,Nn);var n=Nn.offsetHeight/50;return 3<n&&(e.cachedTextHeight=n),k(e.measure),n||1}function _n(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=M("span","xxxxxxxxxx"),n=M("pre",[t],"CodeMirror-line-like");T(e.measure,n);t=t.getBoundingClientRect(),t=(t.right-t.left)/10;return 2<t&&(e.cachedCharWidth=t),t||10}function $n(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;n[s]=o.offsetLeft+o.clientLeft+i,r[s]=o.clientWidth}return{fixedPos:qn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function qn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function Zn(r){var i=Yn(r.display),o=r.options.lineWrapping,l=o&&Math.max(5,r.display.scroller.clientWidth/_n(r.display)-3);return function(e){if(Ut(r.doc,e))return 0;var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;n++)e.widgets[n].height&&(t+=e.widgets[n].height);return o?t+(Math.ceil(e.text.length/l)||1)*i:t+i}}function Qn(e){var t=e.doc,n=Zn(e);t.iter(function(e){var t=n(e);t!=e.height&&Qe(e,t)})}function Jn(e,t,n,r){var i=e.display;if(!n&&"true"==Oe(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(e){return null}var a,i=Vn(e,o,l);return r&&0<i.xRel&&(a=$e(e.doc,i.line).text).length==i.ch&&(a=P(a,a.length,e.options.tabSize)-a.length,i=rt(i.line,Math.max(0,Math.round((o-bn(e.display).left)/_n(e.display))-a))),i}function er(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;r<n.length;r++)if((t-=n[r].size)<0)return r}function tr(e,t,n,r){null==t&&(t=e.doc.first),null==n&&(n=e.doc.first+e.doc.size),r=r||0;var i,o,l=e.display;r&&n<l.viewTo&&(null==l.updateLineNumbers||l.updateLineNumbers>t)&&(l.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=l.viewTo?kt&&Bt(e.doc,t)<l.viewTo&&rr(e):n<=l.viewFrom?kt&&Gt(e.doc,n+r)>l.viewFrom?rr(e):(l.viewFrom+=r,l.viewTo+=r):t<=l.viewFrom&&n>=l.viewTo?rr(e):t<=l.viewFrom?(i=ir(e,n,n+r,1))?(l.view=l.view.slice(i.index),l.viewFrom=i.lineN,l.viewTo+=r):rr(e):n>=l.viewTo?(o=ir(e,t,t,-1))?(l.view=l.view.slice(0,o.index),l.viewTo=o.lineN):rr(e):(i=ir(e,t,t,-1),o=ir(e,n,n+r,1),i&&o?(l.view=l.view.slice(0,i.index).concat(tn(e,i.lineN,o.lineN)).concat(l.view.slice(o.index)),l.viewTo+=r):rr(e));e=l.externalMeasured;e&&(n<e.lineN?e.lineN+=r:t<e.lineN+e.size&&(l.externalMeasured=null))}function nr(e,t,n){e.curOp.viewChanged=!0;var r=e.display,i=e.display.externalMeasured;i&&t>=i.lineN&&t<i.lineN+i.size&&(r.externalMeasured=null),t<r.viewFrom||t>=r.viewTo||(null==(t=r.view[er(e,t)]).node||-1==R(t=t.changes||(t.changes=[]),n)&&t.push(n))}function rr(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function ir(e,t,n,r){var i,o=er(e,t),l=e.display.view;if(!kt||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(0<r){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;Bt(e.doc,n)!=n;){if(o==(r<0?0:l.length-1))return null;n+=r*l[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function or(e){for(var t=e.display.view,n=0,r=0;r<t.length;r++){var i=t[r];i.hidden||i.node&&!i.changes||++n}return n}function lr(e){e.display.input.showSelection(e.display.input.prepareSelection())}function sr(e,t){void 0===t&&(t=!0);for(var n,r,i=e.doc,o={},l=o.cursors=document.createDocumentFragment(),s=o.selection=document.createDocumentFragment(),a=0;a<i.sel.ranges.length;a++)!t&&a==i.sel.primIndex||((n=i.sel.ranges[a]).from().line>=e.display.viewTo||n.to().line<e.display.viewFrom||(((r=n.empty())||e.options.showCursorWhenSelecting)&&ar(e,n.head,l),r||function(i,e,t){var n=i.display,o=i.doc,l=document.createDocumentFragment(),r=bn(i.display),S=r.left,L=Math.max(n.sizerWidth,xn(i)-n.sizer.offsetLeft)-r.right,k="ltr"==o.direction;function T(e,t,n,r){t<0&&(t=0),t=Math.round(t),r=Math.round(r),l.appendChild(M("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n top: "+t+"px; width: "+(null==n?L-e:n)+"px;\n height: "+(r-t)+"px"))}function s(n,g,m){var v,y,r=$e(o,n),b=r.text.length;function w(e,t){return zn(i,rt(n,e),"div",r,t)}function x(e,t,n){e=jn(i,r,null,e),t="ltr"==t==("after"==n)?"left":"right";return w("after"==n?e.begin:e.end-(/\s/.test(r.text.charAt(e.end-1))?2:1),t)[t]}var C=me(r,o.direction);return function(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<n&&l.to>t||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),1==l.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(C,g||0,null==m?b:m,function(e,t,n,r){var i,o,l,s,a="ltr"==n,u=w(e,a?"left":"right"),c=w(t-1,a?"right":"left"),h=null==g&&0==e,d=null==m&&t==b,f=0==r,p=!C||r==C.length-1;c.top-u.top<=3?(i=(k?d:h)&&p,r=(k?h:d)&&f?S:(a?u:c).left,i=i?L:(a?c:u).right,T(r,u.top,i-r,u.bottom)):(n=a?(o=k&&h&&f?S:u.left,l=k?L:x(e,n,"before"),s=k?S:x(t,n,"after"),k&&d&&p?L:c.right):(o=k?x(e,n,"before"):S,l=!k&&h&&f?L:u.right,s=!k&&d&&p?S:c.left,k?x(t,n,"after"):L),T(o,u.top,l-o,u.bottom),u.bottom<c.top&&T(S,u.bottom,null,c.top),T(s,c.top,n-s,c.bottom)),(!v||ur(u,v)<0)&&(v=u),ur(c,v)<0&&(v=c),(!y||ur(u,y)<0)&&(y=u),ur(c,y)<0&&(y=c)}),{start:v,end:y}}var a=e.from(),n=e.to();a.line==n.line?s(a.line,a.ch,n.ch):(r=$e(o,a.line),e=$e(o,n.line),e=zt(r)==zt(e),r=s(a.line,a.ch,e?r.text.length+1:null).end,n=s(n.line,e?0:null,n.ch).start,e&&(r.top<n.top-2?(T(r.right,r.top,null,r.bottom),T(S,n.top,n.left,n.bottom)):T(r.right,r.top,n.left-r.right,r.bottom)),r.bottom<n.top&&T(S,r.bottom,null,n.top));t.appendChild(l)}(e,n,s)));return o}function ar(e,t,n){var r=Bn(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),t=n.appendChild(M("div"," ","CodeMirror-cursor"));t.style.left=r.left+"px",t.style.top=r.top+"px",t.style.height=Math.max(0,r.bottom-r.top)*e.options.cursorHeight+"px",r.other&&((n=n.appendChild(M("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"))).style.display="",n.style.left=r.other.left+"px",n.style.top=r.other.top+"px",n.style.height=.85*(r.other.bottom-r.other.top)+"px")}function ur(e,t){return e.top-t.top||e.left-t.left}function cr(e){var t,n;e.state.focused&&(t=e.display,clearInterval(t.blinker),n=!0,t.cursorDiv.style.visibility="",0<e.options.cursorBlinkRate?t.blinker=setInterval(function(){e.hasFocus()||pr(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden"))}function hr(e){e.hasFocus()||(e.display.input.focus(),e.state.focused||fr(e))}function dr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,e.state.focused&&pr(e))},100)}function fr(e,t){e.state.delayingBlurEvent&&!e.state.draggingText&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(xe(e,"focus",e,t),e.state.focused=!0,D(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),f&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),cr(e))}function pr(e,t){e.state.delayingBlurEvent||(e.state.focused&&(xe(e,"blur",e,t),e.state.focused=!1,L(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function gr(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r<t.view.length;r++){var i,o=t.view[r],l=e.options.lineWrapping,s=void 0,a=0;if(!o.hidden){w&&v<8?(s=(i=o.node.offsetTop+o.node.offsetHeight)-n,n=i):(s=(u=o.node.getBoundingClientRect()).bottom-u.top,!l&&o.text.firstChild&&(a=o.text.firstChild.getBoundingClientRect().right-u.left-1));var u=o.line.height-s;if((.005<u||u<-.005)&&(Qe(o.line,s),mr(o.line),o.rest))for(var c=0;c<o.rest.length;c++)mr(o.rest[c]);a>e.display.sizerWidth&&((a=Math.ceil(a/_n(e.display)))>e.display.maxLineLength&&(e.display.maxLineLength=a,e.display.maxLine=o.line,e.display.maxLineChanged=!0))}}}function mr(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var n=e.widgets[t],r=n.node.parentNode;r&&(n.height=r.offsetHeight)}}function vr(e,t,n){var r=n&&null!=n.top?Math.max(0,n.top):e.scroller.scrollTop,r=Math.floor(r-vn(e)),i=n&&null!=n.bottom?n.bottom:r+e.wrapper.clientHeight,o=et(t,r),r=et(t,i);return n&&n.ensure&&(i=n.ensure.from.line,n=n.ensure.to.line,i<o?r=et(t,Vt($e(t,o=i))+e.wrapper.clientHeight):Math.min(n,t.lastLine())>=r&&(o=et(t,Vt($e(t,n))-e.wrapper.clientHeight),r=n)),{from:o,to:Math.max(r,o+1)}}function yr(e,t){var n=e.display,r=Yn(e.display);t.top<0&&(t.top=0);var i=(e.curOp&&null!=e.curOp.scrollTop?e.curOp:n.scroller).scrollTop,o=Cn(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+yn(n),a=t.top<r,r=t.bottom>s-r;t.top<i?l.scrollTop=a?0:t.top:t.bottom>i+o&&((u=Math.min(t.top,(r?s:t.bottom)-o))!=i&&(l.scrollTop=u));var i=e.options.fixedGutter?0:n.gutters.offsetWidth,u=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft-i,e=xn(e)-n.gutters.offsetWidth,n=t.right-t.left>e;return n&&(t.right=t.left+e),t.left<10?l.scrollLeft=0:t.left<u?l.scrollLeft=Math.max(0,t.left+i-(n?0:10)):t.right>e+u-3&&(l.scrollLeft=t.right+(n?0:10)-e),l}function br(e,t){null!=t&&(Cr(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc:e.curOp).scrollTop+t)}function wr(e){Cr(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function xr(e,t,n){null==t&&null==n||Cr(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function Cr(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Sr(e,Gn(e,t.from),Gn(e,t.to),t.margin))}function Sr(e,t,n,r){r=yr(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});xr(e,r.scrollLeft,r.scrollTop)}function Lr(e,t){Math.abs(e.doc.scrollTop-t)<2||(d||Kr(e,{top:t}),kr(e,t,!0),d&&Kr(e),zr(e,100))}function kr(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),e.display.scroller.scrollTop==t&&!n||(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Tr(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,Yr(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Mr(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+yn(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+wn(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}e=function(e,t,n){this.cm=n;var r=this.vert=M("div",[M("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=M("div",[M("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),ye(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),ye(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,w&&v<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};e.prototype.update=function(e){var t,n=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,i=e.nativeBarWidth;return r?(this.vert.style.display="block",this.vert.style.bottom=n?i+"px":"0",t=e.viewHeight-(n?i:0),this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+t)+"px"):(this.vert.style.display="",this.vert.firstChild.style.height="0"),n?(this.horiz.style.display="block",this.horiz.style.right=r?i+"px":"0",this.horiz.style.left=e.barLeft+"px",t=e.viewWidth-e.barLeft-(r?i:0),this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+t)+"px"):(this.horiz.style.display="",this.horiz.firstChild.style.width="0"),!this.checkedZeroWidth&&0<e.clientHeight&&(0==i&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?i:0,bottom:n?i:0}},e.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},e.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},e.prototype.zeroWidthHack=function(){var e=g&&!l?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new I,this.disableVert=new I},e.prototype.enableZeroWidthBar=function(n,r,i){n.style.pointerEvents="auto",r.set(1e3,function e(){var t=n.getBoundingClientRect();("vert"==i?document.elementFromPoint(t.right-1,(t.top+t.bottom)/2):document.elementFromPoint((t.right+t.left)/2,t.bottom-1))!=n?n.style.pointerEvents="none":r.set(1e3,e)})},e.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};r=function(){};function Nr(e,t){t=t||Mr(e);var n=e.display.barWidth,r=e.display.barHeight;Ar(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&gr(e),Ar(e,Mr(e)),n=e.display.barWidth,r=e.display.barHeight}function Ar(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}r.prototype.update=function(){return{bottom:0,right:0}},r.prototype.setScrollLeft=function(){},r.prototype.setScrollTop=function(){},r.prototype.clear=function(){};var Or={native:e,null:r};function Dr(n){n.display.scrollbars&&(n.display.scrollbars.clear(),n.display.scrollbars.addClass&&L(n.display.wrapper,n.display.scrollbars.addClass)),n.display.scrollbars=new Or[n.options.scrollbarStyle](function(e){n.display.wrapper.insertBefore(e,n.display.scrollbarFiller),ye(e,"mousedown",function(){n.state.focused&&setTimeout(function(){return n.display.input.focus()},0)}),e.setAttribute("cm-not-content","true")},function(e,t){("horizontal"==t?Tr:Lr)(n,e)},n),n.display.scrollbars.addClass&&D(n.display.wrapper,n.display.scrollbars.addClass)}var Wr=0;function Hr(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Wr},e=e.curOp,nn?nn.ops.push(e):e.ownsGroup=nn={ops:[e],delayedCallbacks:[]}}function Fr(e){e=e.curOp;e&&rn(e,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,n=0;n<t.length;n++)!function(e){var t=e.cm,n=t.display;(function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=wn(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=wn(e)+"px",t.scrollbarsClipped=!0)})(t),e.updateMaxLine&&jt(t);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<n.viewFrom||e.scrollToPos.to.line>=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new Gr(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}(t[n]);for(var r=0;r<t.length;r++)!function(e){e.updatedDisplay=e.mustUpdate&&Ur(e.cm,e.update)}(t[r]);for(var i=0;i<t.length;i++)!function(e){var t=e.cm,n=t.display;e.updatedDisplay&&gr(t);e.barMeasure=Mr(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Ln(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+wn(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-xn(t)));(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}(t[i]);for(var o=0;o<t.length;o++)!function(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&Tr(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var n=e.focus&&e.focus==O();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,n);!e.updatedDisplay&&e.startHeight==t.doc.height||Nr(t,e.barMeasure);e.updatedDisplay&&Xr(t,e.barMeasure);e.selectionChanged&&cr(t);t.state.focused&&e.updateInput&&t.display.input.reset(e.typing);n&&hr(e.cm)}(t[o]);for(var l=0;l<t.length;l++)!function(e){var t=e.cm,n=t.display,r=t.doc;e.updatedDisplay&&Vr(t,e.update);null==n.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(n.wheelStartX=n.wheelStartY=null);null!=e.scrollTop&&kr(t,e.scrollTop,e.forceScroll);null!=e.scrollLeft&&Tr(t,e.scrollLeft,!0,!0);{var i;e.scrollToPos&&(i=function(e,t,n,r){null==r&&(r=0),e.options.lineWrapping||t!=n||(n="before"==(t=t.ch?rt(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?rt(t.line,t.ch+1,"before"):t);for(var i=0;i<5;i++){var o,l=!1,s=Bn(e,t),a=n&&n!=t?Bn(e,n):s,u=yr(e,o={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-r,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+r}),s=e.doc.scrollTop,a=e.doc.scrollLeft;if(null!=u.scrollTop&&(Lr(e,u.scrollTop),1<Math.abs(e.doc.scrollTop-s)&&(l=!0)),null!=u.scrollLeft&&(Tr(e,u.scrollLeft),1<Math.abs(e.doc.scrollLeft-a)&&(l=!0)),!l)break}return o}(t,ct(r,e.scrollToPos.from),ct(r,e.scrollToPos.to),e.scrollToPos.margin),function(e,t){var n,r,i;Ce(e,"scrollCursorIntoView")||(r=(n=e.display).sizer.getBoundingClientRect(),i=null,t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null==i||u||(t=M("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-vn(e.display))+"px;\n height: "+(t.bottom-t.top+wn(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;"),e.display.lineSpace.appendChild(t),t.scrollIntoView(i),e.display.lineSpace.removeChild(t)))}(t,i))}var o=e.maybeHiddenMarkers,l=e.maybeUnhiddenMarkers;if(o)for(var s=0;s<o.length;++s)o[s].lines.length||xe(o[s],"hide");if(l)for(var a=0;a<l.length;++a)l[a].lines.length&&xe(l[a],"unhide");n.wrapper.offsetHeight&&(r.scrollTop=t.display.scroller.scrollTop);e.changeObjs&&xe(t,"changes",t,e.changeObjs);e.update&&e.update.finish()}(t[l])}(e)})}function Er(e,t){if(e.curOp)return t();Hr(e);try{return t()}finally{Fr(e)}}function Pr(e,t){return function(){if(e.curOp)return t.apply(e,arguments);Hr(e);try{return t.apply(e,arguments)}finally{Fr(e)}}}function Ir(e){return function(){if(this.curOp)return e.apply(this,arguments);Hr(this);try{return e.apply(this,arguments)}finally{Fr(this)}}}function Rr(t){return function(){var e=this.cm;if(!e||e.curOp)return t.apply(this,arguments);Hr(e);try{return t.apply(this,arguments)}finally{Fr(e)}}}function zr(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,F(Br,e))}function Br(l){var s,a,u,c=l.doc;c.highlightFrontier>=l.display.viewTo||(s=+new Date+l.options.workTime,a=mt(l,c.highlightFrontier),u=[],c.iter(a.line,Math.min(c.first+c.size,l.display.viewTo+500),function(e){if(a.line>=l.display.viewFrom){var t=e.styles,n=e.text.length>l.options.maxHighlightLength?je(c.mode,a.state):null,r=pt(l,e,a,!0);n&&(a.state=n),e.styles=r.styles;n=e.styleClasses,r=r.classes;r?e.styleClasses=r:n&&(e.styleClasses=null);for(var i=!t||t.length!=e.styles.length||n!=r&&(!n||!r||n.bgClass!=r.bgClass||n.textClass!=r.textClass),o=0;!i&&o<t.length;++o)i=t[o]!=e.styles[o];i&&u.push(a.line),e.stateAfter=a.save(),a.nextLine()}else e.text.length<=l.options.maxHighlightLength&&vt(l,e.text,a),e.stateAfter=a.line%5==0?a.save():null,a.nextLine();if(+new Date>s)return zr(l,l.options.workDelay),!0}),c.highlightFrontier=a.line,c.modeFrontier=Math.max(c.modeFrontier,a.line),u.length&&Er(l,function(){for(var e=0;e<u.length;e++)nr(l,u[e],"text")}))}var Gr=function(e,t,n){var r=e.display;this.viewport=t,this.visible=vr(r,e.doc,t),this.editorIsHidden=!r.wrapper.offsetWidth,this.wrapperHeight=r.wrapper.clientHeight,this.wrapperWidth=r.wrapper.clientWidth,this.oldDisplayWidth=xn(e),this.force=n,this.dims=$n(e),this.events=[]};function Ur(e,t){var n=e.display,r=e.doc;if(t.editorIsHidden)return rr(e),!1;if(!t.force&&t.visible.from>=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==or(e))return!1;_r(e)&&(rr(e),t.dims=$n(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFrom<o&&o-n.viewFrom<20&&(o=Math.max(r.first,n.viewFrom)),n.viewTo>l&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),kt&&(o=Bt(e.doc,o),l=Gt(e.doc,l));var s=o!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;r=o,i=l,0==(l=(o=e).display).view.length||r>=l.viewTo||i<=l.viewFrom?(l.view=tn(o,r,i),l.viewFrom=r):(l.viewFrom>r?l.view=tn(o,r,l.viewFrom).concat(l.view):l.viewFrom<r&&(l.view=l.view.slice(er(o,r))),l.viewFrom=r,l.viewTo<i?l.view=l.view.concat(tn(o,l.viewTo,i)):l.viewTo>i&&(l.view=l.view.slice(0,er(o,i)))),l.viewTo=i,n.viewOffset=Vt($e(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";o=or(e);if(!s&&0==o&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;l=function(e){if(e.hasFocus())return null;var t=O();if(!t||!A(e.display.lineDiv,t))return null;var n={activeElt:t};return!window.getSelection||(t=window.getSelection()).anchorNode&&t.extend&&A(e.display.lineDiv,t.anchorNode)&&(n.anchorNode=t.anchorNode,n.anchorOffset=t.anchorOffset,n.focusNode=t.focusNode,n.focusOffset=t.focusOffset),n}(e);return 4<o&&(n.lineDiv.style.display="none"),function(n,e,t){var r=n.display,i=n.options.lineNumbers,o=r.lineDiv,l=o.firstChild;function s(e){var t=e.nextSibling;return f&&g&&n.display.currentWheelTarget==e?e.style.display="none":e.parentNode.removeChild(e),t}for(var a=r.view,u=r.viewFrom,c=0;c<a.length;c++){var h=a[c];if(!h.hidden)if(h.node&&h.node.parentNode==o){for(;l!=h.node;)l=s(l);var d=i&&null!=e&&e<=u&&h.lineNumber;h.changes&&(-1<R(h.changes,"gutter")&&(d=!1),an(n,h,u,t)),d&&(k(h.lineNumber),h.lineNumber.appendChild(document.createTextNode(nt(n.options,u)))),l=h.node.nextSibling}else{d=function(e,t,n,r){var i=cn(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),hn(e,t),dn(e,t,n,r),fn(e,t,r),t.node}(n,h,u,t);o.insertBefore(d,l)}u+=h.size}for(;l;)l=s(l)}(e,n.updateLineNumbers,t.dims),4<o&&(n.lineDiv.style.display=""),n.renderedView=n.view,(i=l)&&i.activeElt&&i.activeElt!=O()&&(i.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(i.activeElt.nodeName)&&i.anchorNode&&A(document.body,i.anchorNode)&&A(document.body,i.focusNode)&&(o=window.getSelection(),(l=document.createRange()).setEnd(i.anchorNode,i.anchorOffset),l.collapse(!1),o.removeAllRanges(),o.addRange(l),o.extend(i.focusNode,i.focusOffset))),k(n.cursorDiv),k(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,s&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,zr(e,400)),!(n.updateLineNumbers=null)}function Vr(e,t){for(var n=t.viewport,r=!0;;r=!1){if(r&&e.options.lineWrapping&&t.oldDisplayWidth!=xn(e))r&&(t.visible=vr(e.display,e.doc,n));else if(n&&null!=n.top&&(n={top:Math.min(e.doc.height+yn(e.display)-Cn(e),n.top)}),t.visible=vr(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break;if(!Ur(e,t))break;gr(e);var i=Mr(e);lr(e),Nr(e,i),Xr(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function Kr(e,t){var n=new Gr(e,t);Ur(e,n)&&(gr(e),Vr(e,n),t=Mr(e),lr(e),Nr(e,t),Xr(e,t),n.finish())}function jr(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function Xr(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+wn(e)+"px"}function Yr(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=qn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",l=0;l<n.length;l++)if(!n[l].hidden){e.options.fixedGutter&&(n[l].gutter&&(n[l].gutter.style.left=o),n[l].gutterBackground&&(n[l].gutterBackground.style.left=o));var s=n[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}}function _r(e){if(e.options.lineNumbers){var t=e.doc,n=nt(e.options,t.first+t.size-1),r=e.display;if(n.length!=r.lineNumChars){var i=r.measure.appendChild(M("div",[M("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),t=i.firstChild.offsetWidth,i=i.offsetWidth-t;return r.lineGutter.style.width="",r.lineNumInnerWidth=Math.max(t,r.lineGutter.offsetWidth-i)+1,r.lineNumWidth=r.lineNumInnerWidth+i,r.lineNumChars=r.lineNumInnerWidth?n.length:-1,r.lineGutter.style.width=r.lineNumWidth+"px",jr(e.display),1}}}function $r(e,t){for(var n=[],r=!1,i=0;i<e.length;i++){var o=e[i],l=null;if("string"!=typeof o&&(l=o.style,o=o.className),"CodeMirror-linenumbers"==o){if(!t)continue;r=!0}n.push({className:o,style:l})}return t&&!r&&n.push({className:"CodeMirror-linenumbers",style:null}),n}function qr(e){var t=e.gutters,n=e.gutterSpecs;k(t),e.lineGutter=null;for(var r=0;r<n.length;++r){var i=n[r],o=i.className,l=i.style,i=t.appendChild(M("div",null,"CodeMirror-gutter "+o));l&&(i.style.cssText=l),"CodeMirror-linenumbers"==o&&((e.lineGutter=i).style.width=(e.lineNumWidth||1)+"px")}t.style.display=n.length?"":"none",jr(e)}function Zr(e){qr(e.display),tr(e),Yr(e)}function Qr(e,t,n,r){var i=this;this.input=n,i.scrollbarFiller=M("div",null,"CodeMirror-scrollbar-filler"),i.scrollbarFiller.setAttribute("cm-not-content","true"),i.gutterFiller=M("div",null,"CodeMirror-gutter-filler"),i.gutterFiller.setAttribute("cm-not-content","true"),i.lineDiv=N("div",null,"CodeMirror-code"),i.selectionDiv=M("div",null,null,"position: relative; z-index: 1"),i.cursorDiv=M("div",null,"CodeMirror-cursors"),i.measure=M("div",null,"CodeMirror-measure"),i.lineMeasure=M("div",null,"CodeMirror-measure"),i.lineSpace=N("div",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,"position: relative; outline: none");var o=N("div",[i.lineSpace],"CodeMirror-lines");i.mover=M("div",[o],null,"position: relative"),i.sizer=M("div",[i.mover],"CodeMirror-sizer"),i.sizerWidth=null,i.heightForcer=M("div",null,null,"position: absolute; height: "+z+"px; width: 1px;"),i.gutters=M("div",null,"CodeMirror-gutters"),i.lineGutter=null,i.scroller=M("div",[i.sizer,i.heightForcer,i.gutters],"CodeMirror-scroll"),i.scroller.setAttribute("tabIndex","-1"),i.wrapper=M("div",[i.scrollbarFiller,i.gutterFiller,i.scroller],"CodeMirror"),w&&v<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),f||d&&h||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,i.gutterSpecs=$r(r.gutters,r.lineNumbers),qr(i),n.init(i)}Gr.prototype.signal=function(e,t){Le(e,t)&&this.events.push(arguments)},Gr.prototype.finish=function(){for(var e=0;e<this.events.length;e++)xe.apply(null,this.events[e])};var Jr=0,ei=null;function ti(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==n&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:null==n&&(n=e.wheelDelta),{x:t,y:n}}function ni(e){e=ti(e);return e.x*=ei,e.y*=ei,e}function ri(e,t){var n=ti(t),r=n.x,i=n.y,o=e.display,l=o.scroller,s=l.scrollWidth>l.clientWidth,a=l.scrollHeight>l.clientHeight;if(r&&s||i&&a){if(i&&g&&f)e:for(var u=t.target,c=o.view;u!=l;u=u.parentNode)for(var h=0;h<c.length;h++)if(c[h].node==u){e.display.currentWheelTarget=u;break e}if(r&&!d&&!p&&null!=ei)return i&&a&&Lr(e,Math.max(0,l.scrollTop+i*ei)),Tr(e,Math.max(0,l.scrollLeft+r*ei)),(!i||i&&a)&&Te(t),void(o.wheelStartX=null);i&&null!=ei&&(n=i*ei,a=(s=e.doc.scrollTop)+o.wrapper.clientHeight,n<0?s=Math.max(0,s+n-50):a=Math.min(e.doc.height,a+n+50),Kr(e,{top:s,bottom:a})),Jr<20&&(null==o.wheelStartX?(o.wheelStartX=l.scrollLeft,o.wheelStartY=l.scrollTop,o.wheelDX=r,o.wheelDY=i,setTimeout(function(){var e,t;null!=o.wheelStartX&&(t=l.scrollLeft-o.wheelStartX,t=(e=l.scrollTop-o.wheelStartY)&&o.wheelDY&&e/o.wheelDY||t&&o.wheelDX&&t/o.wheelDX,o.wheelStartX=o.wheelStartY=null,t&&(ei=(ei*Jr+t)/(Jr+1),++Jr))},200)):(o.wheelDX+=r,o.wheelDY+=i))}}w?ei=-.53:d?ei=15:o?ei=-.7:c&&(ei=-1/3);var ii=function(e,t){this.ranges=e,this.primIndex=t};ii.prototype.primary=function(){return this.ranges[this.primIndex]},ii.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(!ot(n.anchor,r.anchor)||!ot(n.head,r.head))return!1}return!0},ii.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new oi(lt(this.ranges[t].anchor),lt(this.ranges[t].head));return new ii(e,this.primIndex)},ii.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},ii.prototype.contains=function(e,t){t=t||e;for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(0<=it(t,r.from())&&it(e,r.to())<=0)return n}return-1};var oi=function(e,t){this.anchor=e,this.head=t};function li(e,t,n){var r=e&&e.options.selectionsMayTouch,e=t[n];t.sort(function(e,t){return it(e.from(),t.from())}),n=R(t,e);for(var i=1;i<t.length;i++){var o,l=t[i],s=t[i-1],a=it(s.to(),l.from());(r&&!l.empty()?0<a:0<=a)&&(o=at(s.from(),l.from()),a=st(s.to(),l.to()),s=s.empty()?l.from()==l.head:s.from()==s.head,i<=n&&--n,t.splice(--i,2,new oi(s?a:o,s?o:a)))}return new ii(t,n)}function si(e,t){return new ii([new oi(e,t||e)],0)}function ai(e){return e.text?rt(e.from.line+e.text.length-1,Y(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function ui(e,t){if(it(e,t.from)<0)return e;if(it(e,t.to)<=0)return ai(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=ai(t).ch-t.to.ch),rt(n,r)}function ci(e,t){for(var n=[],r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new oi(ui(i.anchor,t),ui(i.head,t)))}return li(e.cm,n,e.sel.primIndex)}function hi(e,t,n){return e.line==t.line?rt(n.line,e.ch-t.ch+n.ch):rt(n.line+(e.line-t.line),e.ch)}function di(e){e.doc.mode=Ue(e.options,e.doc.modeOption),fi(e)}function fi(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,zr(e,100),e.state.modeGen++,e.curOp&&tr(e)}function pi(e,t){return 0==t.from.ch&&0==t.to.ch&&""==Y(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function gi(e,o,t,l){function i(e){return t?t[e]:null}function n(e,t,n){var r,i;r=t,i=n,t=l,(n=e).text=r,n.stateAfter&&(n.stateAfter=null),n.styles&&(n.styles=null),null!=n.order&&(n.order=null),Ot(n),Dt(n,i),(t=t?t(n):1)!=n.height&&Qe(n,t),ln(e,"change",e,o)}function r(e,t){for(var n=[],r=e;r<t;++r)n.push(new Xt(c[r],i(r),l));return n}var s,a=o.from,u=o.to,c=o.text,h=$e(e,a.line),d=$e(e,u.line),f=Y(c),p=i(c.length-1),g=u.line-a.line;o.full?(e.insert(0,r(0,c.length)),e.remove(c.length,e.size-c.length)):pi(e,o)?(s=r(0,c.length-1),n(d,d.text,p),g&&e.remove(a.line,g),s.length&&e.insert(a.line,s)):h==d?1==c.length?n(h,h.text.slice(0,a.ch)+f+h.text.slice(u.ch),p):((s=r(1,c.length-1)).push(new Xt(f+h.text.slice(u.ch),p,l)),n(h,h.text.slice(0,a.ch)+c[0],i(0)),e.insert(a.line+1,s)):1==c.length?(n(h,h.text.slice(0,a.ch)+c[0]+d.text.slice(u.ch),i(0)),e.remove(a.line+1,g)):(n(h,h.text.slice(0,a.ch)+c[0],i(0)),n(d,f+d.text.slice(u.ch),p),p=r(1,c.length-1),1<g&&e.remove(a.line+1,g-1),e.insert(a.line+1,p)),ln(e,"change",e,o)}function mi(e,s,a){!function e(t,n,r){if(t.linked)for(var i=0;i<t.linked.length;++i){var o,l=t.linked[i];l.doc!=n&&(o=r&&l.sharedHist,a&&!o||(s(l.doc,o),e(l.doc,t,o)))}}(e,null,!0)}function vi(e,t){if(t.cm)throw new Error("This document is already in use.");Qn((e.doc=t).cm=e),di(e),yi(e),e.options.lineWrapping||jt(e),e.options.mode=t.modeOption,tr(e)}function yi(e){("rtl"==e.doc.direction?D:L)(e.display.lineDiv,"CodeMirror-rtl")}function bi(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function wi(e,t){var n={from:lt(t.from),to:ai(t),text:qe(e,t.from,t.to)};return ki(e,n,t.from.line,t.to.line+1),mi(e,function(e){return ki(e,n,t.from.line,t.to.line+1),0},!0),n}function xi(e){for(;e.length;){if(!Y(e).ranges)break;e.pop()}}function Ci(e,t,n,r){var i=e.history;i.undone.length=0;var o,l,s=+new Date;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&i.lastModTime>s-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=(a=i).lastOp==r?(xi(a.done),Y(a.done)):a.done.length&&!Y(a.done).ranges?Y(a.done):1<a.done.length&&!a.done[a.done.length-2].ranges?(a.done.pop(),Y(a.done)):void 0))l=Y(o.changes),0==it(t.from,t.to)&&0==it(t.from,l.to)?l.to=ai(t):o.changes.push(wi(e,t));else{var a=Y(i.done);for(a&&a.ranges||Li(e.sel,i.done),o={changes:[wi(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,l||xe(e,"historyAdded")}function Si(e,t,n,r){var i,o,l,s=e.history,a=r&&r.origin;n==s.lastSelOp||a&&s.lastSelOrigin==a&&(s.lastModTime==s.lastSelTime&&s.lastOrigin==a||(i=e,o=a,l=Y(s.done),e=t,"*"==(o=o.charAt(0))||"+"==o&&l.ranges.length==e.ranges.length&&l.somethingSelected()==e.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?s.done[s.done.length-1]=t:Li(t,s.done),s.lastSelTime=+new Date,s.lastSelOrigin=a,s.lastSelOp=n,r&&!1!==r.clearRedo&&xi(s.undone)}function Li(e,t){var n=Y(t);n&&n.ranges&&n.equals(e)||t.push(e)}function ki(t,n,e,r){var i=n["spans_"+t.id],o=0;t.iter(Math.max(t.first,e),Math.min(t.first+t.size,r),function(e){e.markedSpans&&((i=i||(n["spans_"+t.id]={}))[o]=e.markedSpans),++o})}function Ti(e,t){var n=t["spans_"+e.id];if(!n)return null;for(var r=[],i=0;i<t.text.length;++i)r.push(function(e){if(!e)return null;for(var t,n=0;n<e.length;++n)e[n].marker.explicitlyCleared?t=t||e.slice(0,n):t&&t.push(e[n]);return t?t.length?t:null:e}(n[i]));return r}function Mi(e,t){var n=Ti(e,t),r=Nt(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var o=n[i],l=r[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(n[i]=l)}return n}function Ni(e,t,n){for(var r=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)r.push(n?ii.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];r.push({changes:s});for(var a=0;a<l.length;++a){var u,c=l[a];if(s.push({from:c.from,to:c.to,text:c.text}),t)for(var h in c)(u=h.match(/^spans_(\d+)$/))&&-1<R(t,Number(u[1]))&&(Y(s)[h]=c[h],delete c[h])}}}return r}function Ai(e,t,n,r){if(r){r=e.anchor;return n&&((e=it(t,r)<0)!=it(n,r)<0?(r=t,t=n):e!=it(t,n)<0&&(t=n)),new oi(r,t)}return new oi(n||t,t)}function Oi(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),Ei(e,new ii([Ai(e.sel.primary(),t,n,i)],0),r)}function Di(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)r[o]=Ai(e.sel.ranges[o],t[o],null,i);Ei(e,li(e.cm,r,e.sel.primIndex),n)}function Wi(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,Ei(e,li(e.cm,i,e.sel.primIndex),r)}function Hi(e,t,n,r){Ei(e,si(t,n),r)}function Fi(e,t,n){var r=e.history.done,i=Y(r);i&&i.ranges?Pi(e,r[r.length-1]=t,n):Ei(e,t,n)}function Ei(e,t,n){Pi(e,t,n),Si(e,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function Pi(e,t,n){var r,i;(Le(e,"beforeSelectionChange")||e.cm&&Le(e.cm,"beforeSelectionChange"))&&(r=e,i=n,i={ranges:(o=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new oi(ct(r,e[t].anchor),ct(r,e[t].head))},origin:i&&i.origin},xe(r,"beforeSelectionChange",r,i),r.cm&&xe(r.cm,"beforeSelectionChange",r.cm,i),t=i.ranges!=o.ranges?li(r.cm,i.ranges,i.ranges.length-1):o);var o=n&&n.bias||(it(t.primary().head,e.sel.primary().head)<0?-1:1);Ii(e,zi(e,t,o,!0)),n&&!1===n.scroll||!e.cm||wr(e.cm)}function Ii(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=1,e.cm.curOp.selectionChanged=!0,Se(e.cm)),ln(e,"cursorActivity",e))}function Ri(e){Ii(e,zi(e,e.sel,null,!1))}function zi(e,t,n,r){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Gi(e,l.anchor,s&&s.anchor,n,r),s=Gi(e,l.head,s&&s.head,n,r);!i&&a==l.anchor&&s==l.head||((i=i||t.ranges.slice(0,o))[o]=new oi(a,s))}return i?li(e.cm,i,t.primIndex):t}function Bi(e,t,n,r,i){var o=$e(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker,u="selectLeft"in a?!a.selectLeft:a.inclusiveLeft,c="selectRight"in a?!a.selectRight:a.inclusiveRight;if((null==s.from||(u?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(c?s.to>=t.ch:s.to>t.ch))){if(i&&(xe(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(a.atomic){if(n){var h=a.find(r<0?1:-1),s=void 0;if((r<0?c:u)&&(h=Ui(e,h,-r,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(s=it(h,n))&&(r<0?s<0:0<s))return Bi(e,h,t,r,i)}a=a.find(r<0?-1:1);return(r<0?u:c)&&(a=Ui(e,a,r,a.line==t.line?o:null)),a?Bi(e,a,t,r,i):null}}}return t}function Gi(e,t,n,r,i){r=r||1,r=Bi(e,t,n,r,i)||!i&&Bi(e,t,n,r,!0)||Bi(e,t,n,-r,i)||!i&&Bi(e,t,n,-r,!0);return r||(e.cantEdit=!0,rt(e.first,0))}function Ui(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?ct(e,rt(t.line-1)):null:0<n&&t.ch==(r||$e(e,t.line)).text.length?t.line<e.first+e.size-1?rt(t.line+1,0):null:new rt(t.line,t.ch+n)}function Vi(e){e.setSelection(rt(e.firstLine(),0),rt(e.lastLine()),G)}function Ki(i,e,t){var o={canceled:!1,from:e.from,to:e.to,text:e.text,origin:e.origin,cancel:function(){return o.canceled=!0}};return t&&(o.update=function(e,t,n,r){e&&(o.from=ct(i,e)),t&&(o.to=ct(i,t)),n&&(o.text=n),void 0!==r&&(o.origin=r)}),xe(i,"beforeChange",i,o),i.cm&&xe(i.cm,"beforeChange",i.cm,o),o.canceled?(i.cm&&(i.cm.curOp.updateInput=2),null):{from:o.from,to:o.to,text:o.text,origin:o.origin}}function ji(e,t,n){if(e.cm){if(!e.cm.curOp)return Pr(e.cm,ji)(e,t,n);if(e.cm.state.suppressEdits)return}if(!(Le(e,"beforeChange")||e.cm&&Le(e.cm,"beforeChange"))||(t=Ki(e,t,!0))){var r=Lt&&!n&&function(e,t,n){var r=null;if(e.iter(t.line,n.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;!n.readOnly||r&&-1!=R(r,n)||(r=r||[]).push(n)}}),!r)return null;for(var i=[{from:t,to:n}],o=0;o<r.length;++o)for(var l=r[o],s=l.find(0),a=0;a<i.length;++a){var u,c,h,d=i[a];it(d.to,s.from)<0||0<it(d.from,s.to)||(u=[a,1],c=it(d.from,s.from),h=it(d.to,s.to),(c<0||!l.inclusiveLeft&&!c)&&u.push({from:d.from,to:s.from}),(0<h||!l.inclusiveRight&&!h)&&u.push({from:s.to,to:d.to}),i.splice.apply(i,u),a+=u.length-3)}return i}(e,t.from,t.to);if(r)for(var i=r.length-1;0<=i;--i)Xi(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else Xi(e,t)}}function Xi(e,n){var t,r;1==n.text.length&&""==n.text[0]&&0==it(n.from,n.to)||(t=ci(e,n),Ci(e,n,t,e.cm?e.cm.curOp.id:NaN),$i(e,n,t,Nt(e,n)),r=[],mi(e,function(e,t){t||-1!=R(r,e.history)||(Ji(e.history,n),r.push(e.history)),$i(e,n,null,Nt(e,n))}))}function Yi(i,o,e){var t=i.cm&&i.cm.state.suppressEdits;if(!t||e){for(var l,n=i.history,r=i.sel,s="undo"==o?n.done:n.undone,a="undo"==o?n.undone:n.done,u=0;u<s.length&&(l=s[u],e?!l.ranges||l.equals(i.sel):l.ranges);u++);if(u!=s.length){for(n.lastOrigin=n.lastSelOrigin=null;;){if(!(l=s.pop()).ranges){if(t)return void s.push(l);break}if(Li(l,a),e&&!l.equals(i.sel))return void Ei(i,l,{clearRedo:!1});r=l}var c=[];Li(r,a),a.push({changes:c,generation:n.generation}),n.generation=l.generation||++n.maxGeneration;for(var h=Le(i,"beforeChange")||i.cm&&Le(i.cm,"beforeChange"),d=l.changes.length-1;0<=d;--d){var f=function(e){var n=l.changes[e];if(n.origin=o,h&&!Ki(i,n,!1))return s.length=0,{};c.push(wi(i,n));var t=e?ci(i,n):Y(s);$i(i,n,t,Mi(i,n)),!e&&i.cm&&i.cm.scrollIntoView({from:n.from,to:ai(n)});var r=[];mi(i,function(e,t){t||-1!=R(r,e.history)||(Ji(e.history,n),r.push(e.history)),$i(e,n,null,Mi(e,n))})}(d);if(f)return f.v}}}}function _i(e,t){if(0!=t&&(e.first+=t,e.sel=new ii(_(e.sel.ranges,function(e){return new oi(rt(e.anchor.line+t,e.anchor.ch),rt(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){tr(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;r<n.viewTo;r++)nr(e.cm,r,"gutter")}}function $i(e,t,n,r){if(e.cm&&!e.cm.curOp)return Pr(e.cm,$i)(e,t,n,r);var i;t.to.line<e.first?_i(e,t.text.length-1-(t.to.line-t.from.line)):t.from.line>e.lastLine()||(t.from.line<e.first&&(_i(e,i=t.text.length-1-(e.first-t.from.line)),t={from:rt(e.first,0),to:rt(t.to.line+i,t.to.ch),text:[Y(t.text)],origin:t.origin}),i=e.lastLine(),t.to.line>i&&(t={from:t.from,to:rt(i,$e(e,i).text.length),text:[t.text[0]],origin:t.origin}),t.removed=qe(e,t.from,t.to),n=n||ci(e,t),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=Je(zt($e(r,o.line))),r.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0}));-1<r.sel.contains(t.from,t.to)&&Se(e);gi(r,t,n,Zn(e)),e.options.lineWrapping||(r.iter(a,o.line+t.text.length,function(e){var t=Kt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var n=e.first,r=t-1;n<r;r--){var i=$e(e,r).stateAfter;if(i&&(!(i instanceof dt)||r+i.lookAhead<t)){n=r+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,n)}})(r,o.line),zr(e,400);a=t.text.length-(l.line-o.line)-1;t.full?tr(e):o.line!=l.line||1!=t.text.length||pi(e.doc,t)?tr(e,o.line,l.line+1,a):nr(e,o.line,"text");r=Le(e,"changes"),a=Le(e,"change");(a||r)&&(t={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin},a&&ln(e,"change",e,t),r&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(t));e.display.selForContextMenu=null}(e.cm,t,r):gi(e,t,r),Pi(e,n,G),e.cantEdit&&Gi(e,rt(e.firstLine(),0))&&(e.cantEdit=!1))}function qi(e,t,n,r,i){var o;it(r=r||n,n)<0&&(n=(o=[r,n])[0],r=o[1]),"string"==typeof t&&(t=e.splitLines(t)),ji(e,{from:n,to:r,text:t,origin:i})}function Zi(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function Qi(e,t,n,r){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)Zi(o.ranges[s].anchor,t,n,r),Zi(o.ranges[s].head,t,n,r)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(n<u.from.line)u.from=rt(u.from.line+r,u.from.ch),u.to=rt(u.to.line+r,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function Ji(e,t){var n=t.from.line,r=t.to.line,t=t.text.length-(r-n)-1;Qi(e.done,n,r,t),Qi(e.undone,n,r,t)}function eo(e,t,n,r){var i=t,o=t;return"number"==typeof t?o=$e(e,ut(e,t)):i=Je(t),null==i?null:(r(o,i)&&e.cm&&nr(e.cm,i,n),o)}function to(e){this.lines=e,this.parent=null;for(var t=0,n=0;n<e.length;++n)e[n].parent=this,t+=e[n].height;this.height=t}function no(e){this.children=e;for(var t=0,n=0,r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}oi.prototype.from=function(){return at(this.anchor,this.head)},oi.prototype.to=function(){return st(this.anchor,this.head)},oi.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},to.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n,r=e,i=e+t;r<i;++r){var o=this.lines[r];this.height-=o.height,(n=o).parent=null,Ot(n),ln(o,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},no.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n,r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e),s=i.height;if(i.removeInner(e,l),this.height-=s-i.height,o==l&&(this.children.splice(r--,1),i.parent=null),0==(t-=l))break;e=0}else e-=o}this.size-t<25&&(1<this.children.length||!(this.children[0]instanceof to))&&(n=[],this.collapse(n),this.children=[new to(n)],this.children[0].parent=this)},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,n),i.lines&&50<i.lines.length){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new to(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++r,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t,n=new no(e.children.splice(e.children.length-5,5))}while(e.parent?(e.size-=n.size,e.height-=n.height,t=R(e.parent.children,e),e.parent.children.splice(t+1,0,n)):(((t=new no(e.children)).parent=e).children=[t,n],e=t),n.parent=e.parent,10<e.children.length);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,n))return!0;if(0==(t-=l))break;e=0}else e-=o}}};function ro(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.doc=e,this.node=t}function io(e,t,n){Vt(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&br(e,n)}ro.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,n=this.line,r=Je(n);if(null!=r&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var o=gn(this);Qe(n,Math.max(0,n.height-o)),e&&(Er(e,function(){io(e,n,-o),nr(e,r,"widget")}),ln(e,"lineWidgetCleared",e,this,r))}},ro.prototype.changed=function(){var e=this,t=this.height,n=this.doc.cm,r=this.line;this.height=null;var i=gn(this)-t;i&&(Ut(this.doc,r)||Qe(r,r.height+i),n&&Er(n,function(){n.curOp.forceUpdate=!0,io(n,r,i),ln(n,"lineWidgetChanged",n,e,Je(r))}))},ke(ro);var oo=0,lo=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++oo};function so(t,n,r,e,i){if(e&&e.shared)return function(e,n,r,i,o){(i=E(i)).shared=!1;var l=[so(e,n,r,i,o)],s=l[0],a=i.widgetNode;return mi(e,function(e){a&&(i.widgetNode=a.cloneNode(!0)),l.push(so(e,ct(e,n),ct(e,r),i,o));for(var t=0;t<e.linked.length;++t)if(e.linked[t].isParent)return;s=Y(l)}),new ao(l,s)}(t,n,r,e,i);if(t.cm&&!t.cm.curOp)return Pr(t.cm,so)(t,n,r,e,i);var o=new lo(t,i),i=it(n,r);if(e&&E(e,o,!1),0<i||0==i&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=N("span",[o.replacedWith],"CodeMirror-widget"),e.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),e.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Rt(t,n.line,n,r,o)||n.line!=r.line&&Rt(t,r.line,n,r,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");kt=!0}o.addToHistory&&Ci(t,{from:n,to:r,origin:"markText"},t.sel,NaN);var l,s=n.line,a=t.cm;if(t.iter(s,r.line+1,function(e){var t;a&&o.collapsed&&!a.options.lineWrapping&&zt(e)==a.display.maxLine&&(l=!0),o.collapsed&&s!=n.line&&Qe(e,0),t=e,e=new Tt(o,s==n.line?n.ch:null,s==r.line?r.ch:null),t.markedSpans=t.markedSpans?t.markedSpans.concat([e]):[e],e.marker.attachLine(t),++s}),o.collapsed&&t.iter(n.line,r.line+1,function(e){Ut(t,e)&&Qe(e,0)}),o.clearOnEnter&&ye(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(Lt=!0,(t.history.done.length||t.history.undone.length)&&t.clearHistory()),o.collapsed&&(o.id=++oo,o.atomic=!0),a){if(l&&(a.curOp.updateMaxLine=!0),o.collapsed)tr(a,n.line,r.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var u=n.line;u<=r.line;u++)nr(a,u,"text");o.atomic&&Ri(a.doc),ln(a,"markerAdded",a,o)}return o}lo.prototype.clear=function(){if(!this.explicitlyCleared){var e,t=this.doc.cm,n=t&&!t.curOp;n&&Hr(t),!Le(this,"clear")||(e=this.find())&&ln(this,"clear",e.from,e.to);for(var r=null,i=null,o=0;o<this.lines.length;++o){var l=this.lines[o],s=Mt(l.markedSpans,this);t&&!this.collapsed?nr(t,Je(l),"text"):t&&(null!=s.to&&(i=Je(l)),null!=s.from&&(r=Je(l))),l.markedSpans=function(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n=n||[]).push(e[r]);return n}(l.markedSpans,s),null==s.from&&this.collapsed&&!Ut(this.doc,l)&&t&&Qe(l,Yn(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var a=0;a<this.lines.length;++a){var u=zt(this.lines[a]),c=Kt(u);c>t.display.maxLineLength&&(t.display.maxLine=u,t.display.maxLineLength=c,t.display.maxLineChanged=!0)}null!=r&&t&&this.collapsed&&tr(t,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&Ri(t.doc)),t&&ln(t,"markerCleared",t,this,r,i),n&&Fr(t),this.parent&&this.parent.clear()}},lo.prototype.find=function(e,t){var n,r;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Mt(o.markedSpans,this);if(null!=l.from&&(n=rt(t?o:Je(o),l.from),-1==e))return n;if(null!=l.to&&(r=rt(t?o:Je(o),l.to),1==e))return r}return n&&{from:n,to:r}},lo.prototype.changed=function(){var n=this,r=this.find(-1,!0),i=this,o=this.doc.cm;r&&o&&Er(o,function(){var e=r.line,t=Je(r.line),t=kn(o,t);t&&(Dn(t),o.curOp.selectionChanged=o.curOp.forceUpdate=!0),o.curOp.updateMaxLine=!0,Ut(i.doc,e)||null==i.height||(t=i.height,i.height=null,(t=gn(i)-t)&&Qe(e,e.height+t)),ln(o,"markerChanged",o,n)})},lo.prototype.attachLine=function(e){var t;!this.lines.length&&this.doc.cm&&((t=this.doc.cm.curOp).maybeHiddenMarkers&&-1!=R(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)),this.lines.push(e)},lo.prototype.detachLine=function(e){this.lines.splice(R(this.lines,e),1),!this.lines.length&&this.doc.cm&&((e=this.doc.cm.curOp).maybeHiddenMarkers||(e.maybeHiddenMarkers=[])).push(this)},ke(lo);var ao=function(e,t){this.markers=e,this.primary=t;for(var n=0;n<e.length;++n)e[n].parent=this};function uo(e){return e.findMarks(rt(e.first,0),e.clipPos(rt(e.lastLine())),function(e){return e.parent})}ao.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();ln(this,"clear")}},ao.prototype.find=function(e,t){return this.primary.find(e,t)},ke(ao);var co=0,ho=function(e,t,n,r,i){if(!(this instanceof ho))return new ho(e,t,n,r,i);null==n&&(n=0),no.call(this,[new to([new Xt("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1;n=rt(this.modeFrontier=this.highlightFrontier=n,0);this.sel=si(n),this.history=new bi(null),this.id=++co,this.modeOption=t,this.lineSep=r,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),gi(this,{from:n,to:n,text:e}),Ei(this,si(n),G)};ho.prototype=q(no.prototype,{constructor:ho,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var n=0,r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=Ze(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Rr(function(e){var t=rt(this.first,0),n=this.first+this.size-1;ji(this,{from:t,to:rt(n,$e(this,n).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&xr(this.cm,0,0),Ei(this,si(t),G)}),replaceRange:function(e,t,n,r){qi(this,e,t=ct(this,t),n=n?ct(this,n):t,r)},getRange:function(e,t,n){t=qe(this,ct(this,e),ct(this,t));return!1===n?t:t.join(n||this.lineSeparator())},getLine:function(e){e=this.getLineHandle(e);return e&&e.text},getLineHandle:function(e){if(tt(this,e))return $e(this,e)},getLineNumber:Je,getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=$e(this,e)),zt(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return ct(this,e)},getCursor:function(e){var t=this.sel.primary(),t=null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from();return t},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Rr(function(e,t,n){Hi(this,ct(this,"number"==typeof e?rt(e,t||0):e),null,n)}),setSelection:Rr(function(e,t,n){Hi(this,ct(this,e),ct(this,t||e),n)}),extendSelection:Rr(function(e,t,n){Oi(this,ct(this,e),t&&ct(this,t),n)}),extendSelections:Rr(function(e,t){Di(this,ht(this,e),t)}),extendSelectionsBy:Rr(function(e,t){Di(this,ht(this,_(this.sel.ranges,e)),t)}),setSelections:Rr(function(e,t,n){if(e.length){for(var r=[],i=0;i<e.length;i++)r[i]=new oi(ct(this,e[i].anchor),ct(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),Ei(this,li(this.cm,r,t),n)}}),addSelection:Rr(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new oi(ct(this,e),ct(this,t||e))),Ei(this,li(this.cm,r,r.length-1),n)}),getSelection:function(e){for(var t=this.sel.ranges,n=0;n<t.length;n++)var r=qe(this,t[n].from(),t[n].to()),i=i?i.concat(r):r;return!1===e?i:i.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],n=this.sel.ranges,r=0;r<n.length;r++){var i=qe(this,n[r].from(),n[r].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[r]=i}return t},replaceSelection:function(e,t,n){for(var r=[],i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")},replaceSelections:Rr(function(e,t,n){for(var r=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];r[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:n}}for(var t=t&&"end"!=t&&function(e,t,n){for(var r=[],i=u=rt(e.first,0),o=0;o<t.length;o++){var l=t[o],s=hi(l.from,u,i),a=hi(ai(l),u,i),u=l.to,i=a;"around"==n?(l=it((l=e.sel.ranges[o]).head,l.anchor)<0,r[o]=new oi(l?a:s,l?s:a)):r[o]=new oi(s,s)}return new ii(r,e.sel.primIndex)}(this,r,t),s=r.length-1;0<=s;s--)ji(this,r[s]);t?Fi(this,t):this.cm&&wr(this.cm)}),undo:Rr(function(){Yi(this,"undo")}),redo:Rr(function(){Yi(this,"redo")}),undoSelection:Rr(function(){Yi(this,"undo",!0)}),redoSelection:Rr(function(){Yi(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){var t=this;this.history=new bi(this.history.maxGeneration),mi(this,function(e){return e.history=t.history},!0)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Ni(this.history.done),undone:Ni(this.history.undone)}},setHistory:function(e){var t=this.history=new bi(this.history.maxGeneration);t.done=Ni(e.done.slice(0),null,!0),t.undone=Ni(e.undone.slice(0),null,!0)},setGutterMarker:Rr(function(e,n,r){return eo(this,e,"gutter",function(e){var t=e.gutterMarkers||(e.gutterMarkers={});return!(t[n]=r)&&ee(t)&&(e.gutterMarkers=null),1})}),clearGutter:Rr(function(t){var n=this;this.iter(function(e){e.gutterMarkers&&e.gutterMarkers[t]&&eo(n,e,"gutter",function(){return e.gutterMarkers[t]=null,ee(e.gutterMarkers)&&(e.gutterMarkers=null),1})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!tt(this,e))return null;if(!(e=$e(this,t=e)))return null}else if(null==(t=Je(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Rr(function(e,n,r){return eo(this,e,"gutter"==n?"gutter":"class",function(e){var t="text"==n?"textClass":"background"==n?"bgClass":"gutter"==n?"gutterClass":"wrapClass";if(e[t]){if(C(r).test(e[t]))return;e[t]+=" "+r}else e[t]=r;return 1})}),removeLineClass:Rr(function(e,o,l){return eo(this,e,"gutter"==o?"gutter":"class",function(e){var t="text"==o?"textClass":"background"==o?"bgClass":"gutter"==o?"gutterClass":"wrapClass",n=e[t];if(n){if(null==l)e[t]=null;else{var r=n.match(C(l));if(!r)return;var i=r.index+r[0].length;e[t]=n.slice(0,r.index)+(r.index&&i!=n.length?" ":"")+n.slice(i)||null}return 1}})}),addLineWidget:Rr(function(e,t,n){return e=e,i=new ro(r=this,t,n),(o=r.cm)&&i.noHScroll&&(o.display.alignWidgets=!0),eo(r,e,"widget",function(e){var t=e.widgets||(e.widgets=[]);return null==i.insertAt?t.push(i):t.splice(Math.min(t.length,Math.max(0,i.insertAt)),0,i),i.line=e,o&&!Ut(r,e)&&(t=Vt(e)<r.scrollTop,Qe(e,e.height+gn(i)),t&&br(o,i.height),o.curOp.forceUpdate=!0),1}),o&&ln(o,"lineWidgetAdded",o,i,"number"==typeof e?e:Je(e)),i;var r,i,o}),removeLineWidget:function(e){e.clear()},markText:function(e,t,n){return so(this,ct(this,e),ct(this,t),n,n&&n.type||"range")},setBookmark:function(e,t){t={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return so(this,e=ct(this,e),e,t,"bookmark")},findMarksAt:function(e){var t=[],n=$e(this,(e=ct(this,e)).line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(i,o,l){i=ct(this,i),o=ct(this,o);var s=[],a=i.line;return this.iter(i.line,o.line+1,function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;n++){var r=t[n];null!=r.to&&a==i.line&&i.ch>=r.to||null==r.from&&a!=i.line||null!=r.from&&a==o.line&&r.from>=o.ch||l&&!l(r.marker)||s.push(r.marker.parent||r.marker)}++a}),s},getAllMarks:function(){var r=[];return this.iter(function(e){var t=e.markedSpans;if(t)for(var n=0;n<t.length;++n)null!=t[n].from&&r.push(t[n].marker)}),r},posFromIndex:function(t){var n,r=this.first,i=this.lineSeparator().length;return this.iter(function(e){e=e.text.length+i;if(t<e)return n=t,!0;t-=e,++r}),ct(this,rt(r,n))},indexFromPos:function(e){var t=(e=ct(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var n=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+n}),t},copy:function(e){var t=new ho(Ze(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e=e||{};var t=this.first,n=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<n&&(n=e.to);t=new ho(Ze(this,t,n),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(t.history=this.history),(this.linked||(this.linked=[])).push({doc:t,sharedHist:e.sharedHist}),t.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n],i=r.find(),o=e.clipPos(i.from),i=e.clipPos(i.to);it(o,i)&&(i=so(e,o,i,r.primary,r.primary.type),r.markers.push(i),i.parent=r)}}(t,uo(this)),t},unlinkDoc:function(e){if(e instanceof ul&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t)if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),function(o){for(var e=0;e<o.length;e++)!function(e){var t=o[e],n=[t.primary.doc];mi(t.primary.doc,function(e){return n.push(e)});for(var r=0;r<t.markers.length;r++){var i=t.markers[r];-1==R(n,i.doc)&&(i.parent=null,t.markers.splice(r--,1))}}(e)}(uo(this));break}var n;e.history==this.history&&(n=[e.id],mi(e,function(e){return n.push(e.id)},!0),e.history=new bi(null),e.history.done=Ni(this.history.done,n),e.history.undone=Ni(this.history.undone,n))},iterLinkedDocs:function(e){mi(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):Ee(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:Rr(function(e){var t;"rtl"!=e&&(e="ltr"),e!=this.direction&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Er(t=this.cm,function(){yi(t),tr(t)}))})}),ho.prototype.eachLine=ho.prototype.iter;var fo=0;function po(e){var r=this;if(go(r),!Ce(r,e)&&!mn(r.display,e)){Te(e),w&&(fo=+new Date);var t=Jn(r,e,!0),n=e.dataTransfer.files;if(t&&!r.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),l=0,s=function(){++l==i&&Pr(r,function(){var e={from:t=ct(r.doc,t),to:t,text:r.doc.splitLines(o.filter(function(e){return null!=e}).join(r.doc.lineSeparator())),origin:"paste"};ji(r.doc,e),Fi(r.doc,si(ct(r.doc,t),ct(r.doc,ai(e))))})()},a=0;a<n.length;a++)!function(e,t){var n;r.options.allowDropFileTypes&&-1==R(r.options.allowDropFileTypes,e.type)?s():((n=new FileReader).onerror=s,n.onload=function(){var e=n.result;/[\x00-\x08\x0e-\x1f]{2}/.test(e)||(o[t]=e),s()},n.readAsText(e))}(n[a],a);else{if(r.state.draggingText&&-1<r.doc.sel.contains(t))return r.state.draggingText(e),void setTimeout(function(){return r.display.input.focus()},20);try{var u,c=e.dataTransfer.getData("Text");if(c){if(r.state.draggingText&&!r.state.draggingText.copy&&(u=r.listSelections()),Pi(r.doc,si(t,t)),u)for(var h=0;h<u.length;++h)qi(r.doc,"",u[h].anchor,u[h].head,"drag");r.replaceSelection(c,"around","paste"),r.display.input.focus()}}catch(e){}}}}function go(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function mo(t){if(document.getElementsByClassName){for(var e=document.getElementsByClassName("CodeMirror"),n=[],r=0;r<e.length;r++){var i=e[r].CodeMirror;i&&n.push(i)}n.length&&n[0].operation(function(){for(var e=0;e<n.length;e++)t(n[e])})}}var vo=!1;function yo(){var e;vo||(ye(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,mo(bo)},100))}),ye(window,"blur",function(){return mo(pr)}),vo=!0)}function bo(e){var t=e.display;t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize()}for(var wo={3:"Pause",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",145:"ScrollLock",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",224:"Mod",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},xo=0;xo<10;xo++)wo[xo+48]=wo[xo+96]=String(xo);for(var Co=65;Co<=90;Co++)wo[Co]=String.fromCharCode(Co);for(var So=1;So<=12;So++)wo[So+111]=wo[So+63235]="F"+So;var Lo={};function ko(e){var t,n,r,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))n=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error("Unrecognized modifier name: "+s);r=!0}}return t&&(e="Alt-"+e),n&&(e="Ctrl-"+e),i&&(e="Cmd-"+e),r&&(e="Shift-"+e),e}function To(e){var t,n,r={};for(t in e)if(e.hasOwnProperty(t)){var i=e[t];if(!/^(name|fallthrough|(de|at)tach)$/.test(t))if("..."!=i){for(var o=_(t.split(" "),ko),l=0;l<o.length;l++){var s=void 0,a=void 0,s=l==o.length-1?(a=o.join(" "),i):(a=o.slice(0,l+1).join(" "),"..."),u=r[a];if(u){if(u!=s)throw new Error("Inconsistent bindings for "+a)}else r[a]=s}delete e[t]}else delete e[t]}for(n in r)e[n]=r[n];return e}function Mo(e,t,n,r){var i=(t=Do(t)).call?t.call(e,r):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&n(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return Mo(e,t.fallthrough,n,r);for(var o=0;o<t.fallthrough.length;o++){var l=Mo(e,t.fallthrough[o],n,r);if(l)return l}}}function No(e){e="string"==typeof e?e:wo[e.keyCode];return"Ctrl"==e||"Alt"==e||"Shift"==e||"Mod"==e}function Ao(e,t,n){var r=e;return t.altKey&&"Alt"!=r&&(e="Alt-"+e),(b?t.metaKey:t.ctrlKey)&&"Ctrl"!=r&&(e="Ctrl-"+e),(b?t.ctrlKey:t.metaKey)&&"Mod"!=r&&(e="Cmd-"+e),!n&&t.shiftKey&&"Shift"!=r&&(e="Shift-"+e),e}function Oo(e,t){if(p&&34==e.keyCode&&e.char)return!1;var n=wo[e.keyCode];return null!=n&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(n=e.code),Ao(n,e,t))}function Do(e){return"string"==typeof e?Lo[e]:e}function Wo(t,e){for(var n=t.doc.sel.ranges,r=[],i=0;i<n.length;i++){for(var o=e(n[i]);r.length&&it(o.from,Y(r).to)<=0;){var l=r.pop();if(it(l.from,o.from)<0){o.from=l.from;break}}r.push(o)}Er(t,function(){for(var e=r.length-1;0<=e;e--)qi(t.doc,"",r[e].from,r[e].to,"+delete");wr(t)})}function Ho(e,t,n){n=re(e.text,t+n,n);return n<0||n>e.text.length?null:n}function Fo(e,t,n){e=Ho(e,t.ch,n);return null==e?null:new rt(t.line,e,n<0?"after":"before")}function Eo(e,t,n,r,i){if(e){"rtl"==t.doc.direction&&(i=-i);var o=me(n,t.doc.direction);if(o){var l,s,a,e=i<0?Y(o):o[0],o=i<0==(1==e.level)?"after":"before";return 0<e.level||"rtl"==t.doc.direction?(l=Tn(t,n),s=i<0?n.text.length-1:0,a=Mn(t,l,s).top,s=ie(function(e){return Mn(t,l,e).top==a},i<0==(1==e.level)?e.from:e.to-1,s),"before"==o&&(s=Ho(n,s,1))):s=i<0?e.to:e.from,new rt(r,s,o)}}return new rt(r,i<0?n.text.length:0,i<0?"before":"after")}function Po(t,n,s,e){var a=me(n,t.doc.direction);if(!a)return Fo(n,s,e);s.ch>=n.text.length?(s.ch=n.text.length,s.sticky="before"):s.ch<=0&&(s.ch=0,s.sticky="after");var r=le(a,s.ch,s.sticky),i=a[r];if("ltr"==t.doc.direction&&i.level%2==0&&(0<e?i.to>s.ch:i.from<s.ch))return Fo(n,s,e);function u(e,t){return Ho(n,e instanceof rt?e.ch:e,t)}function o(e){return t.options.lineWrapping?(l=l||Tn(t,n),jn(t,n,l,e)):{begin:0,end:n.text.length}}var l,c=o("before"==s.sticky?u(s,-1):s.ch);if("rtl"==t.doc.direction||1==i.level){var h=1==i.level==e<0,d=u(s,h?1:-1);if(null!=d&&(h?d<=i.to&&d<=c.end:d>=i.from&&d>=c.begin)){var f=h?"before":"after";return new rt(s.line,d,f)}}f=function(e,t,n){for(var r=function(e,t){return t?new rt(s.line,u(e,1),"before"):new rt(s.line,e,"after")};0<=e&&e<a.length;e+=t){var i=a[e],o=0<t==(1!=i.level),l=o?n.begin:u(n.end,-1);if(i.from<=l&&l<i.to)return r(l,o);if(l=o?i.from:u(i.to,-1),n.begin<=l&&l<n.end)return r(l,o)}},r=f(r+e,e,c);if(r)return r;c=0<e?c.end:u(c.begin,-1);return null==c||0<e&&c==n.text.length||!(r=f(0<e?0:a.length-1,e,o(c)))?null:r}Lo.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Lo.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Lo.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Lo.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Lo.default=g?Lo.macDefault:Lo.pcDefault;var Io={selectAll:Vi,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),G)},killLine:function(n){return Wo(n,function(e){if(e.empty()){var t=$e(n.doc,e.head.line).text.length;return e.head.ch==t&&e.head.line<n.lastLine()?{from:e.head,to:rt(e.head.line+1,0)}:{from:e.head,to:rt(e.head.line,t)}}return{from:e.from(),to:e.to()}})},deleteLine:function(t){return Wo(t,function(e){return{from:rt(e.from().line,0),to:ct(t.doc,rt(e.to().line+1,0))}})},delLineLeft:function(e){return Wo(e,function(e){return{from:rt(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(n){return Wo(n,function(e){var t=n.charCoords(e.head,"div").top+5;return{from:n.coordsChar({left:0,top:t},"div"),to:e.from()}})},delWrappedLineRight:function(n){return Wo(n,function(e){var t=n.charCoords(e.head,"div").top+5,t=n.coordsChar({left:n.display.lineDiv.offsetWidth+100,top:t},"div");return{from:e.from(),to:t}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(rt(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(rt(e.lastLine()))},goLineStart:function(t){return t.extendSelectionsBy(function(e){return Ro(t,e.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(t){return t.extendSelectionsBy(function(e){return zo(t,e.head)},{origin:"+move",bias:1})},goLineEnd:function(t){return t.extendSelectionsBy(function(e){return function(e,t){var n=$e(e.doc,t),r=function(e){for(var t;t=It(e);)e=t.find(1,!0).line;return e}(n);r!=n&&(t=Je(r));return Eo(!0,e,n,t,-1)}(t,e.head.line)},{origin:"+move",bias:-1})},goLineRight:function(t){return t.extendSelectionsBy(function(e){e=t.cursorCoords(e.head,"div").top+5;return t.coordsChar({left:t.display.lineDiv.offsetWidth+100,top:e},"div")},V)},goLineLeft:function(t){return t.extendSelectionsBy(function(e){e=t.cursorCoords(e.head,"div").top+5;return t.coordsChar({left:0,top:e},"div")},V)},goLineLeftSmart:function(n){return n.extendSelectionsBy(function(e){var t=n.cursorCoords(e.head,"div").top+5,t=n.coordsChar({left:0,top:t},"div");return t.ch<n.getLine(t.line).search(/\S/)?zo(n,e.head):t},V)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"codepoint")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],n=e.listSelections(),r=e.options.tabSize,i=0;i<n.length;i++){var o=n[i].from(),o=P(e.getLine(o.line),o.ch,r);t.push(X(r-o%r))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(l){return Er(l,function(){for(var e,t,n,r=l.listSelections(),i=[],o=0;o<r.length;o++)r[o].empty()&&(e=r[o].head,(t=$e(l.doc,e.line).text)&&(e.ch==t.length&&(e=new rt(e.line,e.ch-1)),0<e.ch?(e=new rt(e.line,e.ch+1),l.replaceRange(t.charAt(e.ch-1)+t.charAt(e.ch-2),rt(e.line,e.ch-2),e,"+transpose")):e.line>l.doc.first&&((n=$e(l.doc,e.line-1).text)&&(e=new rt(e.line,1),l.replaceRange(t.charAt(0)+l.doc.lineSeparator()+n.charAt(n.length-1),rt(e.line-1,n.length-1),e,"+transpose")))),i.push(new oi(e,e)));l.setSelections(i)})},newlineAndIndent:function(r){return Er(r,function(){for(var e=r.listSelections(),t=e.length-1;0<=t;t--)r.replaceRange(r.doc.lineSeparator(),e[t].anchor,e[t].head,"+input");e=r.listSelections();for(var n=0;n<e.length;n++)r.indentLine(e[n].from().line,null,!0);wr(r)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function Ro(e,t){var n=$e(e.doc,t),r=zt(n);return r!=n&&(t=Je(r)),Eo(!0,e,r,t,1)}function zo(e,t){var n=Ro(e,t.line),r=$e(e.doc,n.line),e=me(r,e.doc.direction);if(e&&0!=e[0].level)return n;r=Math.max(n.ch,r.text.search(/\S/)),t=t.line==n.line&&t.ch<=r&&t.ch;return rt(n.line,t?0:r,n.sticky)}function Bo(e,t,n){if("string"==typeof t&&!(t=Io[t]))return!1;e.display.input.ensurePolled();var r=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=B}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}var Go=new I;function Uo(e,t,n,r){var i=e.state.keySeq;if(i){if(No(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:Go.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),Vo(e,i+" "+t,n,r))return!0}return Vo(e,t,n,r)}function Vo(e,t,n,r){r=function(e,t,n){for(var r=0;r<e.state.keyMaps.length;r++){var i=Mo(t,e.state.keyMaps[r],n,e);if(i)return i}return e.options.extraKeys&&Mo(t,e.options.extraKeys,n,e)||Mo(t,e.options.keyMap,n,e)}(e,t,r);return"multi"==r&&(e.state.keySeq=t),"handled"==r&&ln(e,"keyHandled",e,t,n),"handled"!=r&&"multi"!=r||(Te(n),cr(e)),!!r}function Ko(t,e){var n=Oo(e,!0);return!!n&&(e.shiftKey&&!t.state.keySeq?Uo(t,"Shift-"+n,e,function(e){return Bo(t,e,!0)})||Uo(t,n,e,function(e){if("string"==typeof e?/^go[A-Z]/.test(e):e.motion)return Bo(t,e)}):Uo(t,n,e,function(e){return Bo(t,e)}))}var jo=null;function Xo(e){var t,n,r,i=this;function o(e){18!=e.keyCode&&e.altKey||(L(r,"CodeMirror-crosshair"),we(document,"keyup",o),we(document,"mouseover",o))}e.target&&e.target!=i.display.input.getField()||(i.curOp.focus=O(),Ce(i,e)||(w&&v<11&&27==e.keyCode&&(e.returnValue=!1),t=e.keyCode,i.display.shift=16==t||e.shiftKey,n=Ko(i,e),p&&(jo=n?t:null,!n&&88==t&&!Ie&&(g?e.metaKey:e.ctrlKey)&&i.replaceSelection("",null,"cut")),d&&!g&&!n&&46==t&&e.shiftKey&&!e.ctrlKey&&document.execCommand&&document.execCommand("cut"),18!=t||/\bCodeMirror-crosshair\b/.test(i.display.lineDiv.className)||(D(r=i.display.lineDiv,"CodeMirror-crosshair"),ye(document,"keyup",o),ye(document,"mouseover",o))))}function Yo(e){16==e.keyCode&&(this.doc.sel.shift=!1),Ce(this,e)}function _o(e){var t=this;if(!(e.target&&e.target!=t.display.input.getField()||mn(t.display,e)||Ce(t,e)||e.ctrlKey&&!e.altKey||g&&e.metaKey)){var n,r=e.keyCode,i=e.charCode;if(p&&r==jo)return jo=null,void Te(e);p&&(!e.which||e.which<10)&&Ko(t,e)||"\b"!=(i=String.fromCharCode(null==i?r:i))&&(Uo(n=t,"'"+i+"'",e,function(e){return Bo(n,e,!0)})||t.display.input.onKeyPress(e))}}var $o,qo,Zo=function(e,t,n){this.time=e,this.pos=t,this.button=n};function Qo(e){var t,n,r,i,o,l=this,s=l.display;Ce(l,e)||s.activeTouch&&s.input.supportsTouch()||(s.input.ensurePolled(),s.shift=e.shiftKey,mn(s,e)?f||(s.scroller.draggable=!1,setTimeout(function(){return s.scroller.draggable=!0},100)):tl(l,e)||(t=Jn(l,e),n=De(e),i=t?(r=t,i=n,o=+new Date,qo&&qo.compare(o,r,i)?($o=qo=null,"triple"):$o&&$o.compare(o,r,i)?(qo=new Zo(o,r,i),$o=null,"double"):($o=new Zo(o,r,i),qo=null,"single")):"single",window.focus(),1==n&&l.state.selectingText&&l.state.selectingText(e),t&&function(n,e,r,t,i){var o="Click";"double"==t?o="Double"+o:"triple"==t&&(o="Triple"+o);return Uo(n,Ao(o=(1==e?"Left":2==e?"Middle":"Right")+o,i),i,function(e){if("string"==typeof e&&(e=Io[e]),!e)return!1;var t=!1;try{n.isReadOnly()&&(n.state.suppressEdits=!0),t=e(n,r)!=B}finally{n.state.suppressEdits=!1}return t})}(l,n,t,i,e)||(1==n?t?function(e,t,n,r){w?setTimeout(F(hr,e),0):e.curOp.focus=O();var i,o=function(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};null==i.unit&&(r=m?n.shiftKey&&n.metaKey:n.altKey,i.unit=r?"rectangle":"single"==t?"char":"double"==t?"word":"line");null!=i.extend&&!e.doc.extend||(i.extend=e.doc.extend||n.shiftKey);null==i.addNew&&(i.addNew=g?n.metaKey:n.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(g?n.altKey:n.ctrlKey));return i}(e,n,r),l=e.doc.sel;(e.options.dragDrop&&Fe&&!e.isReadOnly()&&"single"==n&&-1<(i=l.contains(t))&&(it((i=l.ranges[i]).from(),t)<0||0<t.xRel)&&(0<it(i.to(),t)||t.xRel<0)?function(t,n,r,i){var o=t.display,l=!1,s=Pr(t,function(e){f&&(o.scroller.draggable=!1),t.state.draggingText=!1,t.state.delayingBlurEvent&&(t.hasFocus()?t.state.delayingBlurEvent=!1:dr(t)),we(o.wrapper.ownerDocument,"mouseup",s),we(o.wrapper.ownerDocument,"mousemove",a),we(o.scroller,"dragstart",u),we(o.scroller,"drop",s),l||(Te(e),i.addNew||Oi(t.doc,r,null,null,i.extend),f&&!c||w&&9==v?setTimeout(function(){o.wrapper.ownerDocument.body.focus({preventScroll:!0}),o.input.focus()},20):o.input.focus())}),a=function(e){l=l||10<=Math.abs(n.clientX-e.clientX)+Math.abs(n.clientY-e.clientY)},u=function(){return l=!0};f&&(o.scroller.draggable=!0);(t.state.draggingText=s).copy=!i.moveOnDrag,ye(o.wrapper.ownerDocument,"mouseup",s),ye(o.wrapper.ownerDocument,"mousemove",a),ye(o.scroller,"dragstart",u),ye(o.scroller,"drop",s),t.state.delayingBlurEvent=!0,setTimeout(function(){return o.input.focus()},20),o.scroller.dragDrop&&o.scroller.dragDrop()}:function(d,e,f,p){w&&dr(d);var l=d.display,g=d.doc;Te(e);var m,v,y=g.sel,t=y.ranges;p.addNew&&!p.extend?(v=g.sel.contains(f),m=-1<v?t[v]:new oi(f,f)):(m=g.sel.primary(),v=g.sel.primIndex);"rectangle"==p.unit?(p.addNew||(m=new oi(f,f)),f=Jn(d,e,!0,!0),v=-1):(e=Jo(d,f,p.unit),m=p.extend?Ai(m,e.anchor,e.head,p.extend):e);p.addNew?-1==v?(v=t.length,Ei(g,li(d,t.concat([m]),v),{scroll:!1,origin:"*mouse"})):1<t.length&&t[v].empty()&&"char"==p.unit&&!p.extend?(Ei(g,li(d,t.slice(0,v).concat(t.slice(v+1)),0),{scroll:!1,origin:"*mouse"}),y=g.sel):Wi(g,v,m,U):(Ei(g,new ii([m],v=0),U),y=g.sel);var b=f;function s(e){if(0!=it(b,e))if(b=e,"rectangle"==p.unit){for(var t=[],n=d.options.tabSize,r=P($e(g,f.line).text,f.ch,n),i=P($e(g,e.line).text,e.ch,n),o=Math.min(r,i),l=Math.max(r,i),s=Math.min(f.line,e.line),a=Math.min(d.lastLine(),Math.max(f.line,e.line));s<=a;s++){var u=$e(g,s).text,c=K(u,o,n);o==l?t.push(new oi(rt(s,c),rt(s,c))):u.length>c&&t.push(new oi(rt(s,c),rt(s,K(u,l,n))))}t.length||t.push(new oi(f,f)),Ei(g,li(d,y.ranges.slice(0,v).concat(t),v),{origin:"*mouse",scroll:!1}),d.scrollIntoView(e)}else{var h,r=m,i=Jo(d,e,p.unit),e=r.anchor,e=0<it(i.anchor,e)?(h=i.head,at(r.from(),i.anchor)):(h=i.anchor,st(r.to(),i.head)),i=y.ranges.slice(0);i[v]=function(e,t){var n=t.anchor,r=t.head,i=$e(e.doc,n.line);if(0==it(n,r)&&n.sticky==r.sticky)return t;var o=me(i);if(!o)return t;var l=le(o,n.ch,n.sticky),s=o[l];if(s.from!=n.ch&&s.to!=n.ch)return t;i=l+(s.from==n.ch==(1!=s.level)?0:1);if(0==i||i==o.length)return t;a=r.line!=n.line?0<(r.line-n.line)*("ltr"==e.doc.direction?1:-1):(e=le(o,r.ch,r.sticky),a=e-l||(r.ch-n.ch)*(1==s.level?-1:1),e==i-1||e==i?a<0:0<a);var i=o[i+(a?-1:0)],a=a==(1==i.level),i=a?i.from:i.to,a=a?"after":"before";return n.ch==i&&n.sticky==a?t:new oi(new rt(n.line,i,a),r)}(d,new oi(ct(g,e),h)),Ei(g,li(d,i,v),U)}}var a=l.wrapper.getBoundingClientRect(),u=0;function n(e){d.state.selectingText=!1,u=1/0,e&&(Te(e),l.input.focus()),we(l.wrapper.ownerDocument,"mousemove",r),we(l.wrapper.ownerDocument,"mouseup",i),g.history.lastSelOrigin=null}var r=Pr(d,function(e){(0!==e.buttons&&De(e)?function e(t){var n,r,i=++u,o=Jn(d,t,!0,"rectangle"==p.unit);o&&(0!=it(o,b)?(d.curOp.focus=O(),s(o),n=vr(l,g),(o.line>=n.to||o.line<n.from)&&setTimeout(Pr(d,function(){u==i&&e(t)}),150)):(r=t.clientY<a.top?-20:t.clientY>a.bottom?20:0)&&setTimeout(Pr(d,function(){u==i&&(l.scroller.scrollTop+=r,e(t))}),50))}:n)(e)}),i=Pr(d,n);d.state.selectingText=i,ye(l.wrapper.ownerDocument,"mousemove",r),ye(l.wrapper.ownerDocument,"mouseup",i)})(e,r,t,o)}(l,t,i,e):Oe(e)==s.scroller&&Te(e):2==n?(t&&Oi(l.doc,t),setTimeout(function(){return s.input.focus()},20)):3==n&&(x?l.display.input.onContextMenu(e):dr(l)))))}function Jo(e,t,n){if("char"==n)return new oi(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new oi(rt(t.line,0),ct(e.doc,rt(t.line+1,0)));t=n(e,t);return new oi(t.from,t.to)}function el(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(e){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Te(t);var l=e.display,r=l.lineDiv.getBoundingClientRect();if(o>r.bottom||!Le(e,n))return Ne(t);o-=r.top-l.viewOffset;for(var s=0;s<e.display.gutterSpecs.length;++s){var a=l.gutters.childNodes[s];if(a&&a.getBoundingClientRect().right>=i)return xe(e,n,e,et(e.doc,o),e.display.gutterSpecs[s].className,t),Ne(t)}}function tl(e,t){return el(e,t,"gutterClick",!0)}function nl(e,t){var n,r;mn(e.display,t)||(r=t,Le(n=e,"gutterContextMenu")&&el(n,r,"gutterContextMenu",!1))||Ce(e,t,"contextmenu")||x||e.display.input.onContextMenu(t)}function rl(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Hn(e)}Zo.prototype.compare=function(e,t,n){return this.time+400>e&&0==it(t,this.pos)&&n==this.button};var il={toString:function(){return"CodeMirror.Init"}},ol={},ll={};function sl(e,t,n){!t!=!(n&&n!=il)&&(n=e.display.dragFunctions,(t=t?ye:we)(e.display.scroller,"dragstart",n.start),t(e.display.scroller,"dragenter",n.enter),t(e.display.scroller,"dragover",n.over),t(e.display.scroller,"dragleave",n.leave),t(e.display.scroller,"drop",n.drop))}function al(e){e.options.lineWrapping?(D(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(L(e.display.wrapper,"CodeMirror-wrap"),jt(e)),Qn(e),tr(e),Hn(e),setTimeout(function(){return Nr(e)},100)}function ul(e,t){var n=this;if(!(this instanceof ul))return new ul(e,t);this.options=t=t?E(t):{},E(ol,t,!1);var r=t.value;"string"==typeof r?r=new ho(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i,o=new ul.inputStyles[t.inputStyle](this),o=this.display=new Qr(e,r,o,t);for(i in rl(o.wrapper.CodeMirror=this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Dr(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new I,keySeq:null,specialChars:null},t.autofocus&&!h&&o.input.focus(),w&&v<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(r){var i=r.display;ye(i.scroller,"mousedown",Pr(r,Qo)),ye(i.scroller,"dblclick",w&&v<11?Pr(r,function(e){var t;Ce(r,e)||(!(t=Jn(r,e))||tl(r,e)||mn(r.display,e)||(Te(e),t=r.findWordAt(t),Oi(r.doc,t.anchor,t.head)))}):function(e){return Ce(r,e)||Te(e)});ye(i.scroller,"contextmenu",function(e){return nl(r,e)}),ye(i.input.getField(),"contextmenu",function(e){i.scroller.contains(e.target)||nl(r,e)});var n,o={end:0};function l(){i.activeTouch&&(n=setTimeout(function(){return i.activeTouch=null},1e3),(o=i.activeTouch).end=+new Date)}function s(e,t){if(null==t.left)return 1;var n=t.left-e.left,e=t.top-e.top;return 400<n*n+e*e}ye(i.scroller,"touchstart",function(e){var t;Ce(r,e)||function(e){if(1==e.touches.length){e=e.touches[0];return e.radiusX<=1&&e.radiusY<=1}}(e)||tl(r,e)||(i.input.ensurePolled(),clearTimeout(n),t=+new Date,i.activeTouch={start:t,moved:!1,prev:t-o.end<=300?o:null},1==e.touches.length&&(i.activeTouch.left=e.touches[0].pageX,i.activeTouch.top=e.touches[0].pageY))}),ye(i.scroller,"touchmove",function(){i.activeTouch&&(i.activeTouch.moved=!0)}),ye(i.scroller,"touchend",function(e){var t,n=i.activeTouch;n&&!mn(i,e)&&null!=n.left&&!n.moved&&new Date-n.start<300&&(t=r.coordsChar(i.activeTouch,"page"),t=!n.prev||s(n,n.prev)?new oi(t,t):!n.prev.prev||s(n,n.prev.prev)?r.findWordAt(t):new oi(rt(t.line,0),ct(r.doc,rt(t.line+1,0))),r.setSelection(t.anchor,t.head),r.focus(),Te(e)),l()}),ye(i.scroller,"touchcancel",l),ye(i.scroller,"scroll",function(){i.scroller.clientHeight&&(Lr(r,i.scroller.scrollTop),Tr(r,i.scroller.scrollLeft,!0),xe(r,"scroll",r))}),ye(i.scroller,"mousewheel",function(e){return ri(r,e)}),ye(i.scroller,"DOMMouseScroll",function(e){return ri(r,e)}),ye(i.wrapper,"scroll",function(){return i.wrapper.scrollTop=i.wrapper.scrollLeft=0}),i.dragFunctions={enter:function(e){Ce(r,e)||Ae(e)},over:function(e){var t,n;Ce(r,e)||((n=Jn(t=r,n=e))&&(ar(t,n,n=document.createDocumentFragment()),t.display.dragCursor||(t.display.dragCursor=M("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),t.display.lineSpace.insertBefore(t.display.dragCursor,t.display.cursorDiv)),T(t.display.dragCursor,n)),Ae(e))},start:function(e){return t=r,n=e,void(w&&(!t.state.draggingText||+new Date-fo<100)?Ae(n):Ce(t,n)||mn(t.display,n)||(n.dataTransfer.setData("Text",t.getSelection()),n.dataTransfer.effectAllowed="copyMove",n.dataTransfer.setDragImage&&!c&&((e=M("img",null,null,"position: fixed; left: 0; top: 0;")).src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",p&&(e.width=e.height=1,t.display.wrapper.appendChild(e),e._top=e.offsetTop),n.dataTransfer.setDragImage(e,0,0),p&&e.parentNode.removeChild(e))));var t,n},drop:Pr(r,po),leave:function(e){Ce(r,e)||go(r)}};var e=i.input.getField();ye(e,"keyup",function(e){return Yo.call(r,e)}),ye(e,"keydown",Pr(r,Xo)),ye(e,"keypress",Pr(r,_o)),ye(e,"focus",function(e){return fr(r,e)}),ye(e,"blur",function(e){return pr(r,e)})}(this),yo(),Hr(this),this.curOp.forceUpdate=!0,vi(this,r),t.autofocus&&!h||this.hasFocus()?setTimeout(function(){n.hasFocus()&&!n.state.focused&&fr(n)},20):pr(this),ll)ll.hasOwnProperty(i)&&ll[i](this,t[i],il);_r(this),t.finishInit&&t.finishInit(this);for(var l=0;l<cl.length;++l)cl[l](this);Fr(this),f&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(o.lineDiv).textRendering&&(o.lineDiv.style.textRendering="auto")}ul.defaults=ol,ul.optionHandlers=ll;var cl=[];function hl(e,t,n,r){var i,o=e.doc;null==n&&(n="add"),"smart"==n&&(o.mode.indent?i=mt(e,t).state:n="prev");var l=e.options.tabSize,s=$e(o,t),a=P(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(r||/\S/.test(s.text)){if("smart"==n&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==B||150<u)){if(!r)return;n="prev"}}else u=0,n="not";"prev"==n?u=t>o.first?P($e(o,t-1).text,null,l):0:"add"==n?u=a+e.options.indentUnit:"subtract"==n?u=a-e.options.indentUnit:"number"==typeof n&&(u=a+n),u=Math.max(0,u);var h="",d=0;if(e.options.indentWithTabs)for(var f=Math.floor(u/l);f;--f)d+=l,h+="\t";if(d<u&&(h+=X(u-d)),h!=c)return qi(o,h,rt(t,0),rt(t,c.length),"+input"),!(s.stateAfter=null);for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){g=rt(t,c.length);Wi(o,p,new oi(g,g));break}}}ul.defineInitHook=function(e){return cl.push(e)};var dl=null;function fl(e){dl=e}function pl(e,t,n,r,i){var o=e.doc;e.display.shift=!1,r=r||o.sel;var l=+new Date-200,s="paste"==i||e.state.pasteIncoming>l,a=Ee(t),u=null;if(s&&1<r.ranges.length)if(dl&&dl.text.join("\n")==t){if(r.ranges.length%dl.text.length==0){u=[];for(var c=0;c<dl.text.length;c++)u.push(o.splitLines(dl.text[c]))}}else a.length==r.ranges.length&&e.options.pasteLinesPerSelection&&(u=_(a,function(e){return[e]}));for(var h=e.curOp.updateInput,d=r.ranges.length-1;0<=d;d--){var f=r.ranges[d],p=f.from(),g=f.to();f.empty()&&(n&&0<n?p=rt(p.line,p.ch-n):e.state.overwrite&&!s?g=rt(g.line,Math.min($e(o,g.line).text.length,g.ch+Y(a).length)):s&&dl&&dl.lineWise&&dl.text.join("\n")==a.join("\n")&&(p=g=rt(p.line,0)));g={from:p,to:g,text:u?u[d%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};ji(e.doc,g),ln(e,"inputRead",e,g)}t&&!s&&ml(e,t),wr(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function gl(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");return n&&(e.preventDefault(),t.isReadOnly()||t.options.disableInput||Er(t,function(){return pl(t,n,0,null,"paste")}),1)}function ml(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;0<=r;r--){var i=n.ranges[r];if(!(100<i.head.ch||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(-1<t.indexOf(o.electricChars.charAt(s))){l=hl(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test($e(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=hl(e,i.head.line,"smart"));l&&ln(e,"electricInput",e,i.head.line)}}}function vl(e){for(var t=[],n=[],r=0;r<e.doc.sel.ranges.length;r++){var i=e.doc.sel.ranges[r].head.line,i={anchor:rt(i,0),head:rt(i+1,0)};n.push(i),t.push(e.getRange(i.anchor,i.head))}return{text:t,ranges:n}}function yl(e,t,n,r){e.setAttribute("autocorrect",n?"":"off"),e.setAttribute("autocapitalize",r?"":"off"),e.setAttribute("spellcheck",!!t)}function bl(){var e=M("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=M("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return f?e.style.width="1000px":e.setAttribute("wrap","off"),s&&(e.style.border="1px solid black"),yl(e),t}function wl(r,i,o,l,s){var e=i,t=o,a=$e(r,i.line),u=s&&"rtl"==r.direction?-o:o;function n(e){var t,n;if(null==(t="codepoint"==l?(t=a.text.charCodeAt(i.ch+(0<l?0:-1)),isNaN(t)?null:new rt(i.line,Math.max(0,Math.min(a.text.length,i.ch+o*(55296<=t&&t<56320?2:1))),-o)):s?Po(r.cm,a,i,o):Fo(a,i,o))){if(e||(n=i.line+u)<r.first||n>=r.first+r.size||(i=new rt(n,i.ch,i.sticky),!(a=$e(r,n))))return;i=Eo(s,r.cm,a,i.line,u)}else i=t;return 1}if("char"==l||"codepoint"==l)n();else if("column"==l)n(!0);else if("word"==l||"group"==l)for(var c=null,h="group"==l,d=r.cm&&r.cm.getHelper(i,"wordChars"),f=!0;!(o<0)||n(!f);f=!1){var p=a.text.charAt(i.ch)||"\n",p=J(p,d)?"w":h&&"\n"==p?"n":!h||/\s/.test(p)?null:"p";if(!h||f||p||(p="s"),c&&c!=p){o<0&&(o=1,n(),i.sticky="after");break}if(p&&(c=p),0<o&&!n(!f))break}t=Gi(r,i,e,t,!0);return ot(e,t)&&(t.hitSide=!0),t}function xl(e,t,n,r){var i,o,l,s=e.doc,a=t.left;for("page"==r?(i=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),i=Math.max(i-.5*Yn(e.display),3),o=(0<n?t.bottom:t.top)+n*i):"line"==r&&(o=0<n?t.bottom+3:t.top-3);(l=Vn(e,a,o)).outside;){if(n<0?o<=0:o>=s.height){l.hitSide=!0;break}o+=5*n}return l}e=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new I,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Cl(e,t){var n=kn(e,t.line);if(!n||n.hidden)return null;var r=$e(e.doc,t.line),n=Sn(n,r,t.line),r=me(r,e.doc.direction),e="left";r&&(e=le(r,t.ch)%2?"right":"left");e=On(n.map,t.ch,e);return e.offset="right"==e.collapse?e.end:e.start,e}function Sl(e,t){return t&&(e.bad=!0),e}function Ll(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Sl(e.clipPos(rt(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==r)return function(u,e,t){var n=u.text.firstChild,r=!1;if(!e||!A(n,e))return Sl(rt(Je(u.line),0),!0);if(e==n&&(r=!0,e=n.childNodes[t],t=0,!e)){var i=u.rest?Y(u.rest):u.line;return Sl(rt(Je(i),i.text.length),r)}var i=3==e.nodeType?e:null,o=e;i||1!=e.childNodes.length||3!=e.firstChild.nodeType||(i=e.firstChild,t=t&&i.nodeValue.length);for(;o.parentNode!=n;)o=o.parentNode;var c=u.measure,h=c.maps;function l(e,t,n){for(var r=-1;r<(h?h.length:0);r++)for(var i=r<0?c.map:h[r],o=0;o<i.length;o+=3){var l=i[o+2];if(l==e||l==t){var s=Je(r<0?u.line:u.rest[r]),a=i[o]+n;return(n<0||l!=e)&&(a=i[o+(n?1:0)]),rt(s,a)}}}var s=l(i,o,t);if(s)return Sl(s,r);for(var a=o.nextSibling,d=i?i.nodeValue.length-t:0;a;a=a.nextSibling){if(s=l(a,a.firstChild,0))return Sl(rt(s.line,s.ch-d),r);d+=a.textContent.length}for(var f=o.previousSibling,p=t;f;f=f.previousSibling){if(s=l(f,f.firstChild,-1))return Sl(rt(s.line,s.ch+p),r);p+=f.textContent.length}}(o,t,n)}}e.prototype.init=function(e){var t=this,o=this,l=o.cm,s=o.div=e.lineDiv;function a(e){for(var t=e.target;t;t=t.parentNode){if(t==s)return 1;if(/\bCodeMirror-(?:line)?widget\b/.test(t.className))break}}function n(e){if(a(e)&&!Ce(l,e)){if(l.somethingSelected())fl({lineWise:!1,text:l.getSelections()}),"cut"==e.type&&l.replaceSelection("",null,"cut");else{if(!l.options.lineWiseCopyCut)return;var t=vl(l);fl({lineWise:!0,text:t.text}),"cut"==e.type&&l.operation(function(){l.setSelections(t.ranges,0,G),l.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var n=dl.text.join("\n");if(e.clipboardData.setData("Text",n),e.clipboardData.getData("Text")==n)return void e.preventDefault()}var r=bl(),e=r.firstChild;l.display.lineSpace.insertBefore(r,l.display.lineSpace.firstChild),e.value=dl.text.join("\n");var i=document.activeElement;H(e),setTimeout(function(){l.display.lineSpace.removeChild(r),i.focus(),i==s&&o.showPrimarySelection()},50)}}yl(s,l.options.spellcheck,l.options.autocorrect,l.options.autocapitalize),ye(s,"paste",function(e){!a(e)||Ce(l,e)||gl(e,l)||v<=11&&setTimeout(Pr(l,function(){return t.updateFromDOM()}),20)}),ye(s,"compositionstart",function(e){t.composing={data:e.data,done:!1}}),ye(s,"compositionupdate",function(e){t.composing||(t.composing={data:e.data,done:!1})}),ye(s,"compositionend",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),ye(s,"touchstart",function(){return o.forceCompositionEnd()}),ye(s,"input",function(){t.composing||t.readFromDOMSoon()}),ye(s,"copy",n),ye(s,"cut",n)},e.prototype.screenReaderLabelChanged=function(e){e?this.div.setAttribute("aria-label",e):this.div.removeAttribute("aria-label")},e.prototype.prepareSelection=function(){var e=sr(this.cm,!1);return e.focus=document.activeElement==this.div,e},e.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},e.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},e.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line<t.display.viewFrom)e.removeAllRanges();else{var o=Ll(t,e.anchorNode,e.anchorOffset),n=Ll(t,e.focusNode,e.focusOffset);if(!o||o.bad||!n||n.bad||0!=it(at(o,n),r)||0!=it(st(o,n),i)){var n=t.display.view,l=r.line>=t.display.viewFrom&&Cl(t,r)||{node:n[0].measure.map[2],offset:0},s=i.line<t.display.viewTo&&Cl(t,i);if(s||(s={node:(u=(u=n[n.length-1].measure).maps?u.maps[u.maps.length-1]:u.map)[u.length-1],offset:u[u.length-2]-u[u.length-3]}),l&&s){var a,u=e.rangeCount&&e.getRangeAt(0);try{a=S(l.node,l.offset,s.offset,s.node)}catch(e){}a&&(!d&&t.state.focused?(e.collapse(l.node,l.offset),a.collapsed||(e.removeAllRanges(),e.addRange(a))):(e.removeAllRanges(),e.addRange(a)),u&&null==e.anchorNode?e.addRange(u):d&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},e.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},e.prototype.showMultipleSelections=function(e){T(this.cm.display.cursorDiv,e.cursors),T(this.cm.display.selectionDiv,e.selection)},e.prototype.rememberSelection=function(){var e=this.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},e.prototype.selectionInEditor=function(){var e=this.getSelection();if(!e.rangeCount)return!1;e=e.getRangeAt(0).commonAncestorContainer;return A(this.div,e)},e.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()&&document.activeElement==this.div||this.showSelection(this.prepareSelection(),!0),this.div.focus())},e.prototype.blur=function(){this.div.blur()},e.prototype.getField=function(){return this.div},e.prototype.supportsTouch=function(){return!0},e.prototype.receivedFocus=function(){var t=this;this.selectionInEditor()?this.pollSelection():Er(this.cm,function(){return t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))})},e.prototype.selectionChanged=function(){var e=this.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},e.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e,t,n=this.getSelection(),r=this.cm;if(a&&o&&this.cm.display.gutterSpecs.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(n.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();this.composing||(this.rememberSelection(),e=Ll(r,n.anchorNode,n.anchorOffset),t=Ll(r,n.focusNode,n.focusOffset),e&&t&&Er(r,function(){Ei(r.doc,si(e,t),G),(e.bad||t.bad)&&(r.curOp.selectionChanged=!0)}))}},e.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t=this.cm,n=t.display,r=t.doc.sel.primary(),i=r.from(),r=r.to();if(0==i.ch&&i.line>t.firstLine()&&(i=rt(i.line-1,$e(t.doc,i.line-1).length)),r.ch==$e(t.doc,r.line).text.length&&r.line<t.lastLine()&&(r=rt(r.line+1,0)),i.line<n.viewFrom||r.line>n.viewTo-1)return!1;m=i.line==n.viewFrom||0==(m=er(t,i.line))?(e=Je(n.view[0].line),n.view[0].node):(e=Je(n.view[m].line),n.view[m-1].node.nextSibling);var o,r=er(t,r.line),r=r==n.view.length-1?(o=n.viewTo-1,n.lineDiv.lastChild):(o=Je(n.view[r+1].line)-1,n.view[r+1].node.previousSibling);if(!m)return!1;for(var l=t.doc.splitLines(function(l,e,t,s,a){var n="",u=!1,c=l.doc.lineSeparator(),h=!1;function d(){u&&(n+=c,h&&(n+=c),u=h=!1)}function f(e){e&&(d(),n+=e)}for(;!function e(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)f(n);else if(n=t.getAttribute("cm-marker"))(n=l.findMarks(rt(s,0),rt(a+1,0),(o=+n,function(e){return e.id==o}))).length&&(r=n[0].find(0))&&f(qe(l.doc,r.from,r.to).join(c));else if("false"!=t.getAttribute("contenteditable")){var r=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(/^br$/i.test(t.nodeName)||0!=t.textContent.length){r&&d();for(var i=0;i<t.childNodes.length;i++)e(t.childNodes[i]);/^(pre|p)$/i.test(t.nodeName)&&(h=!0),r&&(u=!0)}}}else 3==t.nodeType&&f(t.nodeValue.replace(/\u200b/g,"").replace(/\u00a0/g," "));var o}(e),e!=t;)e=e.nextSibling,h=!1;return n}(t,m,r,e,o)),s=qe(t.doc,rt(e,0),rt(o,$e(t.doc,o).text.length));1<l.length&&1<s.length;)if(Y(l)==Y(s))l.pop(),s.pop(),o--;else{if(l[0]!=s[0])break;l.shift(),s.shift(),e++}for(var a=0,u=0,c=l[0],h=s[0],d=Math.min(c.length,h.length);a<d&&c.charCodeAt(a)==h.charCodeAt(a);)++a;for(var f=Y(l),p=Y(s),g=Math.min(f.length-(1==l.length?a:0),p.length-(1==s.length?a:0));u<g&&f.charCodeAt(f.length-u-1)==p.charCodeAt(p.length-u-1);)++u;if(1==l.length&&1==s.length&&e==i.line)for(;a&&a>i.ch&&f.charCodeAt(f.length-u-1)==p.charCodeAt(p.length-u-1);)a--,u++;l[l.length-1]=f.slice(0,f.length-u).replace(/^\u200b+/,""),l[0]=l[0].slice(a).replace(/\u200b+$/,"");var m=rt(e,a),r=rt(o,s.length?Y(s).length-u:0);return 1<l.length||l[0]||it(m,r)?(qi(t.doc,l,m,r,"+input"),!0):void 0},e.prototype.ensurePolled=function(){this.forceCompositionEnd()},e.prototype.reset=function(){this.forceCompositionEnd()},e.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},e.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},e.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Er(this.cm,function(){return tr(e.cm)})},e.prototype.setUneditable=function(e){e.contentEditable="false"},e.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Pr(this.cm,pl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},e.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},e.prototype.onContextMenu=function(){},e.prototype.resetPosition=function(){},e.prototype.needsContentAttribute=!0;var kl,Tl,Ml,Nl,Al,r=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new I,this.hasSelection=!1,this.composing=null};function Ol(e,t,r,n){kl.defaults[e]=t,r&&(Tl[e]=n?function(e,t,n){n!=il&&r(e,t,n)}:r)}r.prototype.init=function(n){var e=this,r=this,i=this.cm;this.createField(n);var o=this.textarea;function t(e){if(!Ce(i,e)){if(i.somethingSelected())fl({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=vl(i);fl({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,G):(r.prevInput="",o.value=t.text.join("\n"),H(o))}"cut"==e.type&&(i.state.cutIncoming=+new Date)}}n.wrapper.insertBefore(this.wrapper,n.wrapper.firstChild),s&&(o.style.width="0px"),ye(o,"input",function(){w&&9<=v&&e.hasSelection&&(e.hasSelection=null),r.poll()}),ye(o,"paste",function(e){Ce(i,e)||gl(e,i)||(i.state.pasteIncoming=+new Date,r.fastPoll())}),ye(o,"cut",t),ye(o,"copy",t),ye(n.scroller,"paste",function(e){if(!mn(n,e)&&!Ce(i,e)){if(!o.dispatchEvent)return i.state.pasteIncoming=+new Date,void r.focus();var t=new Event("paste");t.clipboardData=e.clipboardData,o.dispatchEvent(t)}}),ye(n.lineSpace,"selectstart",function(e){mn(n,e)||Te(e)}),ye(o,"compositionstart",function(){var e=i.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}}),ye(o,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},r.prototype.createField=function(e){this.wrapper=bl(),this.textarea=this.wrapper.firstChild},r.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},r.prototype.prepareSelection=function(){var e,t=this.cm,n=t.display,r=t.doc,i=sr(t);return t.options.moveInputWithCursor&&(e=Bn(t,r.sel.primary().head,"div"),t=n.wrapper.getBoundingClientRect(),r=n.lineDiv.getBoundingClientRect(),i.teTop=Math.max(0,Math.min(n.wrapper.clientHeight-10,e.top+r.top-t.top)),i.teLeft=Math.max(0,Math.min(n.wrapper.clientWidth-10,e.left+r.left-t.left))),i},r.prototype.showSelection=function(e){var t=this.cm.display;T(t.cursorDiv,e.cursors),T(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},r.prototype.reset=function(e){var t,n;this.contextMenuPending||this.composing||((t=this.cm).somethingSelected()?(this.prevInput="",n=t.getSelection(),this.textarea.value=n,t.state.focused&&H(this.textarea),w&&9<=v&&(this.hasSelection=n)):e||(this.prevInput=this.textarea.value="",w&&9<=v&&(this.hasSelection=null)))},r.prototype.getField=function(){return this.textarea},r.prototype.supportsTouch=function(){return!1},r.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!h||O()!=this.textarea))try{this.textarea.focus()}catch(e){}},r.prototype.blur=function(){this.textarea.blur()},r.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},r.prototype.receivedFocus=function(){this.slowPoll()},r.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},r.prototype.fastPoll=function(){var t=!1,n=this;n.pollingFast=!0,n.polling.set(20,function e(){n.poll()||t?(n.pollingFast=!1,n.slowPoll()):(t=!0,n.polling.set(60,e))})},r.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||Pe(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(w&&9<=v&&this.hasSelection===i||g&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,s=Math.min(r.length,i.length);l<s&&r.charCodeAt(l)==i.charCodeAt(l);)++l;return Er(t,function(){pl(t,i.slice(l),r.length-l,null,e.composing?"*compose":null),1e3<i.length||-1<i.indexOf("\n")?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},r.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},r.prototype.onKeyPress=function(){w&&9<=v&&(this.hasSelection=null),this.fastPoll()},r.prototype.onContextMenu=function(e){var n=this,r=n.cm,i=r.display,o=n.textarea;n.contextMenuPending&&n.contextMenuPending();var l,s,t,a,u=Jn(r,e),c=i.scroller.scrollTop;function h(){var e,t;null!=o.selectionStart&&(t="​"+((e=r.somethingSelected())?o.value:""),o.value="⇚",o.value=t,n.prevInput=e?"":"​",o.selectionStart=1,o.selectionEnd=t.length,i.selForContextMenu=r.doc.sel)}function d(){var e,t;n.contextMenuPending==d&&(n.contextMenuPending=!1,n.wrapper.style.cssText=s,o.style.cssText=l,w&&v<9&&i.scrollbars.setScrollTop(i.scroller.scrollTop=c),null!=o.selectionStart&&((!w||w&&v<9)&&h(),e=0,t=function(){i.selForContextMenu==r.doc.sel&&0==o.selectionStart&&0<o.selectionEnd&&"​"==n.prevInput?Pr(r,Vi)(r):e++<10?i.detectingSelectAll=setTimeout(t,500):(i.selForContextMenu=null,i.input.reset())},i.detectingSelectAll=setTimeout(t,200)))}u&&!p&&(r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(u)&&Pr(r,Ei)(r.doc,si(u),G),l=o.style.cssText,s=n.wrapper.style.cssText,u=n.wrapper.offsetParent.getBoundingClientRect(),n.wrapper.style.cssText="position: static",o.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-u.top-5)+"px; left: "+(e.clientX-u.left-5)+"px;\n z-index: 1000; background: "+(w?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",f&&(t=window.scrollY),i.input.focus(),f&&window.scrollTo(null,t),i.input.reset(),r.somethingSelected()||(o.value=n.prevInput=" "),n.contextMenuPending=d,i.selForContextMenu=r.doc.sel,clearTimeout(i.detectingSelectAll),w&&9<=v&&h(),x?(Ae(e),a=function(){we(window,"mouseup",a),setTimeout(d,20)},ye(window,"mouseup",a)):setTimeout(d,50))},r.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e,this.textarea.readOnly=!!e},r.prototype.setUneditable=function(){},r.prototype.needsContentAttribute=!1,Tl=(kl=ul).optionHandlers,kl.defineOption=Ol,kl.Init=il,Ol("value","",function(e,t){return e.setValue(t)},!0),Ol("mode",null,function(e,t){e.doc.modeOption=t,di(e)},!0),Ol("indentUnit",2,di,!0),Ol("indentWithTabs",!1),Ol("smartIndent",!0),Ol("tabSize",4,function(e){fi(e),Hn(e),tr(e)},!0),Ol("lineSeparator",null,function(e,r){if(e.doc.lineSep=r){var i=[],o=e.doc.first;e.doc.iter(function(e){for(var t=0;;){var n=e.text.indexOf(r,t);if(-1==n)break;t=n+r.length,i.push(rt(o,n))}o++});for(var t=i.length-1;0<=t;t--)qi(e.doc,r,i[t],rt(i[t].line,i[t].ch+r.length))}}),Ol("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=il&&e.refresh()}),Ol("specialCharPlaceholder",Zt,function(e){return e.refresh()},!0),Ol("electricChars",!0),Ol("inputStyle",h?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Ol("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),Ol("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),Ol("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),Ol("rtlMoveVisually",!y),Ol("wholeLineUpdateBefore",!0),Ol("theme","default",function(e){rl(e),Zr(e)},!0),Ol("keyMap","default",function(e,t,n){t=Do(t),n=n!=il&&Do(n);n&&n.detach&&n.detach(e,t),t.attach&&t.attach(e,n||null)}),Ol("extraKeys",null),Ol("configureMouse",null),Ol("lineWrapping",!1,al,!0),Ol("gutters",[],function(e,t){e.display.gutterSpecs=$r(t,e.options.lineNumbers),Zr(e)},!0),Ol("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?qn(e.display)+"px":"0",e.refresh()},!0),Ol("coverGutterNextToScrollbar",!1,function(e){return Nr(e)},!0),Ol("scrollbarStyle","native",function(e){Dr(e),Nr(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),Ol("lineNumbers",!1,function(e,t){e.display.gutterSpecs=$r(e.options.gutters,t),Zr(e)},!0),Ol("firstLineNumber",1,Zr,!0),Ol("lineNumberFormatter",function(e){return e},Zr,!0),Ol("showCursorWhenSelecting",!1,lr,!0),Ol("resetSelectionOnContextMenu",!0),Ol("lineWiseCopyCut",!0),Ol("pasteLinesPerSelection",!0),Ol("selectionsMayTouch",!1),Ol("readOnly",!1,function(e,t){"nocursor"==t&&(pr(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),Ol("screenReaderLabel",null,function(e,t){t=""===t?null:t,e.display.input.screenReaderLabelChanged(t)}),Ol("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),Ol("dragDrop",!0,sl),Ol("allowDropFileTypes",null),Ol("cursorBlinkRate",530),Ol("cursorScrollMargin",0),Ol("cursorHeight",1,lr,!0),Ol("singleCursorHeightPerLine",!0,lr,!0),Ol("workTime",100),Ol("workDelay",100),Ol("flattenSpans",!0,fi,!0),Ol("addModeClass",!1,fi,!0),Ol("pollInterval",100),Ol("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),Ol("historyEventDelay",1250),Ol("viewportMargin",10,function(e){return e.refresh()},!0),Ol("maxHighlightLength",1e4,fi,!0),Ol("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),Ol("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),Ol("autofocus",null),Ol("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),Ol("phrases",null),Nl=(Ml=ul).optionHandlers,Al=Ml.helpers={},Ml.prototype={constructor:Ml,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var n=this.options,r=n[e];n[e]==t&&"mode"!=e||(n[e]=t,Nl.hasOwnProperty(e)&&Pr(this,Nl[e])(this,t,r),xe(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Do(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;n<t.length;++n)if(t[n]==e||t[n].name==e)return t.splice(n,1),!0},addOverlay:Ir(function(e,t){var n=e.token?e:Ml.getMode(this.options,e);if(n.startState)throw new Error("Overlays may not be stateful.");!function(e,t,n){for(var r=0,i=n(t);r<e.length&&n(e[r])<=i;)r++;e.splice(r,0,t)}(this.state.overlays,{mode:n,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,tr(this)}),removeOverlay:Ir(function(e){for(var t=this.state.overlays,n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||"string"==typeof e&&r.name==e)return t.splice(n,1),this.state.modeGen++,void tr(this)}}),indentLine:Ir(function(e,t,n){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),tt(this.doc,e)&&hl(this,e,t,n)}),indentSelection:Ir(function(e){for(var t=this.doc.sel.ranges,n=-1,r=0;r<t.length;r++){var i=t[r];if(i.empty())i.head.line>n&&(hl(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&wr(this));else{for(var o=i.from(),l=i.to(),i=Math.max(n,o.line),n=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1,s=i;s<n;++s)hl(this,s,e);i=this.doc.sel.ranges;0==o.ch&&t.length==i.length&&0<i[r].from().ch&&Wi(this.doc,r,new oi(o,i[r].to()),G)}}}),getTokenAt:function(e,t){return xt(this,e,t)},getLineTokens:function(e,t){return xt(this,rt(e),t,!0)},getTokenTypeAt:function(e){e=ct(this.doc,e);var t,n=gt(this,$e(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var l=r+i>>1;if((l?n[2*l-1]:0)>=o)i=l;else{if(!(n[2*l+1]<o)){t=n[2*l+2];break}r=1+l}}e=t?t.indexOf("overlay "):-1;return e<0?t:0==e?null:t.slice(0,e-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Ml.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!Al.hasOwnProperty(t))return n;var r=Al[t],i=this.getModeAt(e);if("string"==typeof i[t])r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=r[i[t][o]];l&&n.push(l)}else i.helperType&&r[i.helperType]?n.push(r[i.helperType]):r[i.name]&&n.push(r[i.name]);for(var s=0;s<r._global.length;s++){var a=r._global[s];a.pred(i,this)&&-1==R(n,a.val)&&n.push(a.val)}return n},getStateAfter:function(e,t){var n=this.doc;return mt(this,(e=ut(n,null==e?n.first+n.size-1:e))+1,t).state},cursorCoords:function(e,t){var n=this.doc.sel.primary(),n=null==e?n.head:"object"==typeof e?ct(this.doc,e):e?n.from():n.to();return Bn(this,n,t||"page")},charCoords:function(e,t){return zn(this,ct(this.doc,e),t||"page")},coordsChar:function(e,t){return Vn(this,(e=Rn(this,e,t||"page")).left,e.top)},lineAtHeight:function(e,t){return e=Rn(this,{top:e,left:0},t||"page").top,et(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,n){var r,i=!1,e="number"==typeof e?(r=this.doc.first+this.doc.size-1,e<this.doc.first?e=this.doc.first:r<e&&(e=r,i=!0),$e(this.doc,e)):e;return In(this,e,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-Vt(e):0)},defaultTextHeight:function(){return Yn(this.display)},defaultCharWidth:function(){return _n(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o,l,s=this.display,a=(e=Bn(this,ct(this.doc,e))).bottom,u=e.left;t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),s.sizer.appendChild(t),"over"==r?a=e.top:"above"!=r&&"near"!=r||(o=Math.max(s.wrapper.clientHeight,this.doc.height),l=Math.max(s.sizer.clientWidth,s.lineSpace.clientWidth),("above"==r||e.bottom+t.offsetHeight>o)&&e.top>t.offsetHeight?a=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=o&&(a=e.bottom),u+t.offsetWidth>l&&(u=l-t.offsetWidth)),t.style.top=a+"px",t.style.left=t.style.right="","right"==i?(u=s.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?u=0:"middle"==i&&(u=(s.sizer.clientWidth-t.offsetWidth)/2),t.style.left=u+"px"),n&&(n=this,t={left:u,top:a,right:u+t.offsetWidth,bottom:a+t.offsetHeight},null!=(t=yr(n,t)).scrollTop&&Lr(n,t.scrollTop),null!=t.scrollLeft&&Tr(n,t.scrollLeft))},triggerOnKeyDown:Ir(Xo),triggerOnKeyPress:Ir(_o),triggerOnKeyUp:Yo,triggerOnMouseDown:Ir(Qo),execCommand:function(e){if(Io.hasOwnProperty(e))return Io[e].call(null,this)},triggerElectric:Ir(function(e){ml(this,e)}),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=ct(this.doc,e),l=0;l<t&&!(o=wl(this.doc,o,i,n,r)).hitSide;++l);return o},moveH:Ir(function(t,n){var r=this;this.extendSelectionsBy(function(e){return r.display.shift||r.doc.extend||e.empty()?wl(r.doc,e.head,t,n,r.options.rtlMoveVisually):t<0?e.from():e.to()},V)}),deleteH:Ir(function(n,r){var e=this.doc.sel,i=this.doc;e.somethingSelected()?i.replaceSelection("",null,"+delete"):Wo(this,function(e){var t=wl(i,e.head,n,r,!1);return n<0?{from:t,to:e.head}:{from:e.head,to:t}})}),findPosV:function(e,t,n,r){var i=1,o=r;t<0&&(i=-1,t=-t);for(var l=ct(this.doc,e),s=0;s<t;++s){var a=Bn(this,l,"div");if(null==o?o=a.left:a.left=o,(l=xl(this,a,i,n)).hitSide)break}return l},moveV:Ir(function(r,i){var o=this,l=this.doc,s=[],a=!this.display.shift&&!l.extend&&l.sel.somethingSelected();if(l.extendSelectionsBy(function(e){if(a)return r<0?e.from():e.to();var t=Bn(o,e.head,"div");null!=e.goalColumn&&(t.left=e.goalColumn),s.push(t.left);var n=xl(o,t,r,i);return"page"==i&&e==l.sel.primary()&&br(o,zn(o,n,"div").top-t.top),n},V),s.length)for(var e=0;e<l.sel.ranges.length;e++)l.sel.ranges[e].goalColumn=s[e]}),findWordAt:function(e){var t=$e(this.doc,e.line).text,n=e.ch,r=e.ch;if(t){var i=this.getHelper(e,"wordChars");"before"!=e.sticky&&r!=t.length||!n?++r:--n;for(var o=t.charAt(n),l=J(o,i)?function(e){return J(e,i)}:/\s/.test(o)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!J(e)};0<n&&l(t.charAt(n-1));)--n;for(;r<t.length&&l(t.charAt(r));)++r}return new oi(rt(e.line,n),rt(e.line,r))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||(((this.state.overwrite=!this.state.overwrite)?D:L)(this.display.cursorDiv,"CodeMirror-overwrite"),xe(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==O()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Ir(function(e,t){xr(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-wn(this)-this.display.barHeight,width:e.scrollWidth-wn(this)-this.display.barWidth,clientHeight:Cn(this),clientWidth:xn(this)}},scrollIntoView:Ir(function(e,t){var n;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:rt(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(n=e,Cr(t=this),t.curOp.scrollToPos=n):Sr(this,e.from,e.to,e.margin)}),setSize:Ir(function(e,t){function n(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e}var r=this;null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&Wn(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){nr(r,i,"widget");break}++i}),this.curOp.forceUpdate=!0,xe(this,"refresh",this)}),operation:function(e){return Er(this,e)},startOperation:function(){return Hr(this)},endOperation:function(){return Fr(this)},refresh:Ir(function(){var e=this.display.cachedTextHeight;tr(this),this.curOp.forceUpdate=!0,Hn(this),xr(this,this.doc.scrollLeft,this.doc.scrollTop),jr(this.display),(null==e||.5<Math.abs(e-Yn(this.display))||this.options.lineWrapping)&&Qn(this),xe(this,"refresh",this)}),swapDoc:Ir(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),vi(this,e),Hn(this),this.display.input.reset(),xr(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,ln(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},ke(Ml),Ml.registerHelper=function(e,t,n){Al.hasOwnProperty(e)||(Al[e]=Ml[e]={_global:[]}),Al[e][t]=n},Ml.registerGlobalHelper=function(e,t,n,r){Ml.registerHelper(e,t,r),Al[e]._global.push({pred:n,val:r})};var Dl,Wl,Hl="iter insert remove copy getEditor constructor".split(" ");for(Dl in ho.prototype)ho.prototype.hasOwnProperty(Dl)&&R(Hl,Dl)<0&&(ul.prototype[Dl]=function(e){return function(){return e.apply(this.doc,arguments)}}(ho.prototype[Dl]));return ke(ho),ul.inputStyles={textarea:r,contenteditable:e},ul.defineMode=function(e){ul.defaults.mode||"null"==e||(ul.defaults.mode=e),function(e,t){2<arguments.length&&(t.dependencies=Array.prototype.slice.call(arguments,2)),ze[e]=t}.apply(this,arguments)},ul.defineMIME=function(e,t){Be[e]=t},ul.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),ul.defineMIME("text/plain","null"),ul.defineExtension=function(e,t){ul.prototype[e]=t},ul.defineDocExtension=function(e,t){ho.prototype[e]=t},ul.fromTextArea=function(t,n){var e;function r(){t.value=s.getValue()}if(n=n?E(n):{},n.value=t.value,!n.tabindex&&t.tabIndex&&(n.tabindex=t.tabIndex),!n.placeholder&&t.placeholder&&(n.placeholder=t.placeholder),null==n.autofocus&&(e=O(),n.autofocus=e==t||null!=t.getAttribute("autofocus")&&e==document.body),t.form&&(ye(t.form,"submit",r),!n.leaveSubmitMethodAlone)){var i=t.form,o=i.submit;try{var l=i.submit=function(){r(),i.submit=o,i.submit(),i.submit=l}}catch(e){}}n.finishInit=function(e){e.save=r,e.getTextArea=function(){return t},e.toTextArea=function(){e.toTextArea=isNaN,r(),t.parentNode.removeChild(e.getWrapperElement()),t.style.display="",t.form&&(we(t.form,"submit",r),n.leaveSubmitMethodAlone||"function"!=typeof t.form.submit||(t.form.submit=o))}},t.style.display="none";var s=ul(function(e){return t.parentNode.insertBefore(e,t.nextSibling)},n);return s},(Wl=ul).off=we,Wl.on=ye,Wl.wheelEventPixels=ni,Wl.Doc=ho,Wl.splitLines=Ee,Wl.countColumn=P,Wl.findColumn=K,Wl.isWordChar=Q,Wl.Pass=B,Wl.signal=xe,Wl.Line=Xt,Wl.changeEnd=ai,Wl.scrollbarModel=Or,Wl.Pos=rt,Wl.cmpPos=it,Wl.modes=ze,Wl.mimeModes=Be,Wl.resolveMode=Ge,Wl.getMode=Ue,Wl.modeExtensions=Ve,Wl.extendMode=Ke,Wl.copyState=je,Wl.startState=Ye,Wl.innerMode=Xe,Wl.commands=Io,Wl.keyMap=Lo,Wl.keyName=Oo,Wl.isModifierKey=No,Wl.lookupKey=Mo,Wl.normalizeKeyMap=To,Wl.StringStream=_e,Wl.SharedTextMarker=ao,Wl.TextMarker=lo,Wl.LineWidget=ro,Wl.e_preventDefault=Te,Wl.e_stopPropagation=Me,Wl.e_stop=Ae,Wl.addClass=D,Wl.contains=A,Wl.rmClass=L,Wl.keyNames=wo,ul.version="5.58.3",ul}); From 552843369c34bfea11cf6a2586842879f5103ada Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 2 Dec 2020 17:55:55 +0100 Subject: [PATCH 1074/2376] Update shortcuts-mac.multids (#5179) --- core/wiki/config/shortcuts/shortcuts-mac.multids | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/wiki/config/shortcuts/shortcuts-mac.multids b/core/wiki/config/shortcuts/shortcuts-mac.multids index fc3fc060f..7b41dce17 100644 --- a/core/wiki/config/shortcuts/shortcuts-mac.multids +++ b/core/wiki/config/shortcuts/shortcuts-mac.multids @@ -1,6 +1,8 @@ title: $:/config/shortcuts-mac/ bold: meta-B +input-tab-left: ctrl-Left +input-tab-right: ctrl-Right italic: meta-I underline: meta-U new-image: ctrl-I From e620aaed809e52e0585613012d675056bf84e004 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Wed, 2 Dec 2020 23:59:04 +0700 Subject: [PATCH 1075/2376] Fix a couple typos in "deprecated feature" warning (#5174) One tiddler had been renamed since the deprecation warning tiddler was created, and there were also a couple of minor punctuation and/or spelling errors. --- .../tiddlers/system/Deprecated_-_What_does_it_mean.tid | 4 ++-- editions/tw5.com/tiddlers/system/version-macros.tid | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/system/Deprecated_-_What_does_it_mean.tid b/editions/tw5.com/tiddlers/system/Deprecated_-_What_does_it_mean.tid index 37f98c3f1..5fdbca026 100644 --- a/editions/tw5.com/tiddlers/system/Deprecated_-_What_does_it_mean.tid +++ b/editions/tw5.com/tiddlers/system/Deprecated_-_What_does_it_mean.tid @@ -7,9 +7,9 @@ First of all: ''Keep calm!'' {{$:/deprecated}} -For ~TiddlyWiki it means, that you should not use this mechanism for new content anymore! ''AND you should update your existing content''! +For ~TiddlyWiki it means that you should not use this mechanism for new content anymore, ''AND you should update your existing content''! -Deprecated features have a marker. see: [[Custom styles by tag]] +Deprecated features have a marker. See: [[How to apply custom styles by tag]] ''Tiddlers tagged `$:/deprecated`'' diff --git a/editions/tw5.com/tiddlers/system/version-macros.tid b/editions/tw5.com/tiddlers/system/version-macros.tid index 763252000..b3893d358 100644 --- a/editions/tw5.com/tiddlers/system/version-macros.tid +++ b/editions/tw5.com/tiddlers/system/version-macros.tid @@ -8,8 +8,8 @@ type: text/vnd.tiddlywiki <span class="doc-from-version">{{$:/core/images/warning}} New in: $version$</span> \end -\define .deprecated-since(version, superseeded:"TODO-Link") -<$button to="Deprecated - What does it mean" class="doc-deprecated-version tc-btn-invisible">{{$:/core/images/warning}} Deprecated since: $version$ </$button> use [[$superseeded$]] instead! +\define .deprecated-since(version, superseded:"TODO-Link") +<$button to="Deprecated - What does it mean" class="doc-deprecated-version tc-btn-invisible">{{$:/core/images/warning}} Deprecated since: $version$ </$button>. Use [[$superseded$]] instead \end <pre><$view field="text"/></pre> \ No newline at end of file From 9d5babc248d2fbd25922ee1690ada31c0c282e2f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 2 Dec 2020 22:12:56 +0100 Subject: [PATCH 1076/2376] Bump CodeMirror plugin version (#5184) --- plugins/tiddlywiki/codemirror/readme.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/codemirror/readme.tid b/plugins/tiddlywiki/codemirror/readme.tid index bc899c1dc..c36e2eac0 100755 --- a/plugins/tiddlywiki/codemirror/readme.tid +++ b/plugins/tiddlywiki/codemirror/readme.tid @@ -4,4 +4,4 @@ This plugin provides an enhanced text editor component based on [[CodeMirror|htt [[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/codemirror]] -Based on ~CodeMirror version 5.58.2 +Based on ~CodeMirror version 5.58.3 From 6b03105bed733dbf0436191b14227f89e72e28e3 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 2 Dec 2020 22:13:42 +0100 Subject: [PATCH 1077/2376] Update CupertinoDark.tid (#5183) --- core/palettes/CupertinoDark.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index f97cab56d..8097322cc 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -113,7 +113,7 @@ selection-background: #3F638B selection-foreground: #ffffff wikilist-background: <<colour page-background>> wikilist-button-background: <<colour button-background>> -wikilist-button-foreground: <<colour foreground>> +wikilist-button-foreground: <<colour background>> wikilist-button-open: #32D74B wikilist-button-open-hover: #32D74B wikilist-button-reveal: #0A84FF From 1f5e1205ec633e55ea8377cef15f357e935e880a Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Wed, 2 Dec 2020 22:15:35 +0100 Subject: [PATCH 1078/2376] Extend Eventcatcher to handle multiple events (#5185) * support multiple events * Add variables for event type and detail. Rename types attribute to events * Correct typo in refresh handling --- core/modules/widgets/eventcatcher.js | 126 ++++++++++-------- .../tiddlers/widgets/EventCatcherWidget.tid | 24 ++-- 2 files changed, 83 insertions(+), 67 deletions(-) diff --git a/core/modules/widgets/eventcatcher.js b/core/modules/widgets/eventcatcher.js index 1f3d96688..09f2e3ad7 100644 --- a/core/modules/widgets/eventcatcher.js +++ b/core/modules/widgets/eventcatcher.js @@ -43,66 +43,76 @@ EventWidget.prototype.render = function(parent,nextSibling) { // Assign classes this.assignDomNodeClasses(); // Add our event handler - domNode.addEventListener(this.type,function(event) { - var selector = self.getAttribute("selector"), - actions = self.getAttribute("actions"), - selectedNode = event.target, - selectedNodeRect, - catcherNodeRect, - variables = {}; - if(selector) { - // Search ancestors for a node that matches the selector - while(!selectedNode.matches(selector) && selectedNode !== domNode) { - selectedNode = selectedNode.parentNode; - } - // If we found one, copy the attributes as variables, otherwise exit - if(selectedNode.matches(selector)) { - $tw.utils.each(selectedNode.attributes,function(attribute) { - variables["dom-" + attribute.name] = attribute.value.toString(); - }); - //Add a variable with a popup coordinate string for the selected node - variables["tv-popup-coords"] = "(" + selectedNode.offsetLeft + "," + selectedNode.offsetTop +"," + selectedNode.offsetWidth + "," + selectedNode.offsetHeight + ")"; - - //Add variables for offset of selected node - variables["tv-selectednode-posx"] = selectedNode.offsetLeft.toString(); - variables["tv-selectednode-posy"] = selectedNode.offsetTop.toString(); - variables["tv-selectednode-width"] = selectedNode.offsetWidth.toString(); - variables["tv-selectednode-height"] = selectedNode.offsetHeight.toString(); + $tw.utils.each(this.types,function(type) { + domNode.addEventListener(type,function(event) { + var selector = self.getAttribute("selector"), + actions = self.getAttribute("actions-"+type), + selectedNode = event.target, + selectedNodeRect, + catcherNodeRect, + variables = {}; + if(selector) { + // Search ancestors for a node that matches the selector + while(!selectedNode.matches(selector) && selectedNode !== domNode) { + selectedNode = selectedNode.parentNode; + } + // If we found one, copy the attributes as variables, otherwise exit + if(selectedNode.matches(selector)) { + $tw.utils.each(selectedNode.attributes,function(attribute) { + variables["dom-" + attribute.name] = attribute.value.toString(); + }); + //Add a variable with a popup coordinate string for the selected node + variables["tv-popup-coords"] = "(" + selectedNode.offsetLeft + "," + selectedNode.offsetTop +"," + selectedNode.offsetWidth + "," + selectedNode.offsetHeight + ")"; + + //Add variables for offset of selected node + variables["tv-selectednode-posx"] = selectedNode.offsetLeft.toString(); + variables["tv-selectednode-posy"] = selectedNode.offsetTop.toString(); + variables["tv-selectednode-width"] = selectedNode.offsetWidth.toString(); + variables["tv-selectednode-height"] = selectedNode.offsetHeight.toString(); - //Add variables for event X and Y position relative to selected node - selectedNodeRect = selectedNode.getBoundingClientRect(); - variables["event-fromselected-posx"] = (event.clientX - selectedNodeRect.left).toString(); - variables["event-fromselected-posy"] = (event.clientY - selectedNodeRect.top).toString(); + //Add variables for event X and Y position relative to selected node + selectedNodeRect = selectedNode.getBoundingClientRect(); + variables["event-fromselected-posx"] = (event.clientX - selectedNodeRect.left).toString(); + variables["event-fromselected-posy"] = (event.clientY - selectedNodeRect.top).toString(); - //Add variables for event X and Y position relative to event catcher node - catcherNodeRect = self.domNode.getBoundingClientRect(); - variables["event-fromcatcher-posx"] = (event.clientX - catcherNodeRect.left).toString(); - variables["event-fromcatcher-posy"] = (event.clientY - catcherNodeRect.top).toString(); - } else { - return false; - } - } - // Execute our actions with the variables - if(actions) { - // Add a variable for the modifier key - variables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event); - // Add a variable for the mouse button - if("button" in event) { - if(event.button === 0) { - variables["event-mousebutton"] = "left"; - } else if(event.button === 1) { - variables["event-mousebutton"] = "middle"; - } else if(event.button === 2) { - variables["event-mousebutton"] = "right"; + //Add variables for event X and Y position relative to event catcher node + catcherNodeRect = self.domNode.getBoundingClientRect(); + variables["event-fromcatcher-posx"] = (event.clientX - catcherNodeRect.left).toString(); + variables["event-fromcatcher-posy"] = (event.clientY - catcherNodeRect.top).toString(); + } else { + return false; } } - self.invokeActionString(actions,self,event,variables); - event.preventDefault(); - event.stopPropagation(); - return true; - } - return false; - },false); + // Execute our actions with the variables + if(actions) { + // Add a variable for the modifier key + variables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event); + // Add a variable for the mouse button + if("button" in event) { + if(event.button === 0) { + variables["event-mousebutton"] = "left"; + } else if(event.button === 1) { + variables["event-mousebutton"] = "middle"; + } else if(event.button === 2) { + variables["event-mousebutton"] = "right"; + } + } + variables["event-type"] = event.type; + if(typeof event.detail === "object" && !!event.detail) { + $tw.utils.each(event.detail,function(detailValue,detail) { + variables["event-detail-" + detail] = detailValue; + }); + } else if(!!event.detail) { + variables["event-detail"] = event.detail; + } + self.invokeActionString(actions,self,event,variables); + event.preventDefault(); + event.stopPropagation(); + return true; + } + return false; + },false); + }); // Insert element parent.insertBefore(domNode,nextSibling); this.renderChildren(domNode,null); @@ -115,7 +125,7 @@ Compute the internal state of the widget EventWidget.prototype.execute = function() { var self = this; // Get attributes that require a refresh on change - this.type = this.getAttribute("type"); + this.types = this.getAttribute("events","").split(" "); this.elementTag = this.getAttribute("tag"); // Make child widgets this.makeChildWidgets(); @@ -132,7 +142,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ EventWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.type || changedAttributes["tag"]) { + if(changedAttributes["events"] || changedAttributes["tag"]) { this.refreshSelf(); return true; } else if(changedAttributes["class"]) { diff --git a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid index 28d2c9e9a..9a4b498c5 100644 --- a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid @@ -1,5 +1,5 @@ created: 20201123113532200 -modified: 20201123172753436 +modified: 20201202200719126 tags: Widgets title: EventCatcherWidget type: text/vnd.tiddlywiki @@ -11,10 +11,10 @@ The event catcher widget traps JavaScript events dispatched within its child con In order for the events to be trapped they must: -* be of the type specified as a parameter to the event catcher widget. +* be of one of the types specified as a parameter to the event catcher widget. * arise within a DOM node matching the selector specified as a parameter to the widget. -Use of the event catcher widget is useful when using large numbers of other trigger widgets such as the ButtonWidget is causing performance problems. The workflow it enables is akin to what is referred to as "event delegation" in JavaScript parlance. +Use of the event catcher widget is beneficial when using large numbers of other trigger widgets such as the ButtonWidget is causing performance problems. The workflow it enables is akin to what is referred to as "event delegation" in JavaScript parlance. //This is an advanced widget intended to be used by those familiar with HTML, CSS and JavaScript.// @@ -23,9 +23,9 @@ Use of the event catcher widget is useful when using large numbers of other trig The content of the `<$eventcatcher>` widget is displayed normally. |!Attribute |!Description | -|type |The JavaScript event type to be trapped, for example "click", or "dblclick" | +|events |Space separated list of JavaScript events to be trapped, for example "click" or "click dblclick" | |selector |A CSS selector. Only events originating inside a DOM node with this selector will be trapped. | -|actions |Action strings to be invoked when a matching event is trapped | +|actions-* |Action strings to be invoked when a matching event is trapped. Each event is mapped to an action attribute name of the form `actions-"event"` where `event` represents the type of the event. For example: `actions-click` or `actions-dblclick` | |class |An optional CSS class name to be assigned to the HTML element | |tag |Optional. The html element the widget creates to capture the events, defaults to:<br>» `span` when parsed in inline-mode<br>» `div` when parsed in block-mode | @@ -37,6 +37,8 @@ The following variables are made available to the actions: |`dom-*` |All DOM attributes of the node matching the given selector are made available as variables, with the prefix `dom-` | |`modifier` |The [[modifier Variable]] contains the Modifier Key held during the event (can be "normal", "ctrl", "shift", "alt" or combinations thereof) | |`event-mousebutton`|The mouse button (if any) used to trigger the event (can be "left", "right" or "middle"). Note that not all event types support the mousebutton property | +|`event-type`|The type property of the JavaScript event | +|`event-detail-*`|Any properties in the detail attribute of the event are made available with the prefix `event-detail-` | |`tv-popup-coords`|A co-ordinate string that can be used with the ActionPopupWidget to trigger a popup at the DOM node matching the selector where the event originated | |`tv-selectednode-posx`|`x` offset position of the selected DOM node | |`tv-selectednode-posy`|`y` offset position of the selected DOM node | @@ -52,11 +54,15 @@ The following variables are made available to the actions: This example uses the ActionLogWidget and will log the `data-item-id` attribute of the clicked DOM node to the browser's JavaScript [[console|Web Developer Tools]] ``` -\define myactions() -<$action-log item=<<dom-data-item-id>>/> +\define clickactions() +<$action-log item=<<dom-data-item-id>> event=<<event-type>>/> \end -<$eventcatcher type="click" selector=".item" actions=<<myactions>> tag="div"> +\define contextmenu-actions() +<$action-log item=<<dom-data-item-id>> event=<<event-type>>/> +\end + +<$eventcatcher events="click contextmenu" selector=".item" actions-click=<<clickactions>> actions-contextmenu=<<contextmenu-actions>> tag="div"> <div class="item" data-item-id="item1"> Click events here will be trapped @@ -74,6 +80,6 @@ Not here And here </div> -</$eventcatcher>""" +</$eventcatcher> ``` From 2bbcc94b4dd6a1c6a8c82837c4d022d34edd7c81 Mon Sep 17 00:00:00 2001 From: Rob Hoelz <rob@hoelz.ro> Date: Thu, 3 Dec 2020 15:19:25 -0600 Subject: [PATCH 1079/2376] Add documentation for shortcuts introduced in 5.1.20 (#4324) --- editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid b/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid index 9ecece61d..421f99dce 100644 --- a/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid +++ b/editions/tw5.com/tiddlers/howtos/KeyboardShortcuts.tid @@ -20,9 +20,13 @@ Keyboard shortcuts are available for common editing operations within the Text E <<.from-version 5.1.18>> : New ''global'' Keyboard shortcuts: -* Creating a new tiddler (defaults to <kbd>alt-N</kbd> ) -* Creating a new journal (defaults to <kbd>alt-J</kbd> ) -* Creating a new image (defaults to <kbd>alt-I</kbd> ) +|!Action |!Default Shortcut| +|Creating a new tiddler |<kbd>alt-N</kbd> | +|Creating a new journal |<kbd>alt-J</kbd> | +|Creating a new image |<kbd>alt-I</kbd> | +|Focusing sidebar search |<<.from-version 5.1.20>><kbd>ctrl-shift-F</kbd> | +|Toggling the sidebar |<<.from-version 5.1.20>><kbd>shift-alt-S</kbd> | +|Advanced search |<<.from-version 5.1.20>><kbd>ctrl-shift-A</kbd> | The current shortcuts can be inspected and customised in the "Keyboard Shortcuts" tab of the [[Control Panel|$:/ControlPanel]] <<.icon $:/core/images/options-button>>. From c92f9dd404a2a1194bc7ebfa91ef6f3928311472 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Fri, 4 Dec 2020 04:20:23 +0700 Subject: [PATCH 1080/2376] Docs for trim operator suffix use from-version (#5161) Trim suffix was introduced in version 5.1.23; docs should mention that. --- editions/tw5.com/tiddlers/filters/trim Operator.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/trim Operator.tid b/editions/tw5.com/tiddlers/filters/trim Operator.tid index 918b4f4c4..a24790eb0 100644 --- a/editions/tw5.com/tiddlers/filters/trim Operator.tid +++ b/editions/tw5.com/tiddlers/filters/trim Operator.tid @@ -6,7 +6,7 @@ op-input: a [[selection of titles|Title Selection]] op-parameter: <<.from-version "5.1.23">> a string of characters op-parameter-name: S op-output: the input titles with <<.place S>>, or whitespace if <<.place S>> is not specified, trimmed from the start and/or end -op-suffix: `prefix` to trim from the start only, `suffix` to trim from the end only. If omitted (default), trim from both start and end +op-suffix: <<.from-version "5.1.23">> `prefix` to trim from the start only, `suffix` to trim from the end only. If omitted (default), trim from both start and end op-suffix-name: T tags: [[Filter Operators]] [[String Operators]] title: trim Operator From 15be409c42350a7d9b0d97f706c61456602cce7f Mon Sep 17 00:00:00 2001 From: Mohammad Rahmani <830394+kookma@users.noreply.github.com> Date: Fri, 4 Dec 2020 01:57:21 +0330 Subject: [PATCH 1081/2376] Minor issue in example of Import Variables Widget (#5165) an unbalanced [ was resolved. --- editions/tw5.com/tiddlers/widgets/ImportVariablesWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/ImportVariablesWidget.tid b/editions/tw5.com/tiddlers/widgets/ImportVariablesWidget.tid index 674526e37..a9451bc63 100644 --- a/editions/tw5.com/tiddlers/widgets/ImportVariablesWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ImportVariablesWidget.tid @@ -37,5 +37,5 @@ So-called global macros are implemented within the main page template ([[$:/core <<.from-version "5.1.18">> The `\import` [[pragma|Pragma]] is an alternative syntax for using the ImportVariablesWidget. For example, the previous example could be expressed as: ``` -\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of] +\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] ``` \ No newline at end of file From 8ffe1389423440a67aa64aba9c6421fdcf951d33 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Fri, 4 Dec 2020 20:19:59 +0700 Subject: [PATCH 1082/2376] Add rawunicode suffix to (json)stringify operators (#5191) Default with no suffix is pre-5.1.23 behavior, escaping all Unicode characters for maximum compatibility (avoids encoding issues). New "rawunicode" suffix allows passing through Unicode characters U+0080 and up unchanged, for cases where you know your tools are handling encoding correctly and you want less verbose escaping. --- core/modules/filters/encodings.js | 4 +-- core/modules/utils/utils.js | 10 ++++--- .../jsonstringify Operator (Examples).tid | 2 ++ .../stringify_Operator_(Examples).tid | 2 ++ .../filters/jsonstringify Operator.tid | 27 ++++++++++++------- .../tiddlers/filters/stringify_Operator.tid | 26 +++++++++++------- 6 files changed, 46 insertions(+), 25 deletions(-) diff --git a/core/modules/filters/encodings.js b/core/modules/filters/encodings.js index f41350791..557599c1a 100644 --- a/core/modules/filters/encodings.js +++ b/core/modules/filters/encodings.js @@ -77,7 +77,7 @@ exports.encodehtml = function(source,operator,options) { exports.stringify = function(source,operator,options) { var results = []; source(function(tiddler,title) { - results.push($tw.utils.stringify(title)); + results.push($tw.utils.stringify(title,(operator.suffix === "rawunicode"))); }); return results; }; @@ -85,7 +85,7 @@ exports.stringify = function(source,operator,options) { exports.jsonstringify = function(source,operator,options) { var results = []; source(function(tiddler,title) { - results.push($tw.utils.jsonStringify(title)); + results.push($tw.utils.jsonStringify(title,(operator.suffix === "rawunicode"))); }); return results; }; diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index b3c56fb8c..14d251f01 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -564,7 +564,7 @@ exports.escape = function(ch) { // Turns a string into a legal JavaScript string // Copied from peg.js, thanks to David Majda -exports.stringify = function(s) { +exports.stringify = function(s, rawUnicode) { /* * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string * literal except for the closing quote character, backslash, carriage return, @@ -573,19 +573,21 @@ exports.stringify = function(s) { * * For portability, we also escape all non-ASCII characters. */ + var regex = rawUnicode ? /[\x00-\x1f]/g : /[\x00-\x1f\x80-\uFFFF]/g; return (s || "") .replace(/\\/g, '\\\\') // backslash .replace(/"/g, '\\"') // double quote character .replace(/'/g, "\\'") // single quote character .replace(/\r/g, '\\r') // carriage return .replace(/\n/g, '\\n') // line feed - .replace(/[\x00-\x1f\x80-\uFFFF]/g, exports.escape); // non-ASCII characters + .replace(regex, exports.escape); // non-ASCII characters }; // Turns a string into a legal JSON string // Derived from peg.js, thanks to David Majda -exports.jsonStringify = function(s) { +exports.jsonStringify = function(s, rawUnicode) { // See http://www.json.org/ + var regex = rawUnicode ? /[\x00-\x1f]/g : /[\x00-\x1f\x80-\uFFFF]/g; return (s || "") .replace(/\\/g, '\\\\') // backslash .replace(/"/g, '\\"') // double quote character @@ -594,7 +596,7 @@ exports.jsonStringify = function(s) { .replace(/\x08/g, '\\b') // backspace .replace(/\x0c/g, '\\f') // formfeed .replace(/\t/g, '\\t') // tab - .replace(/[\x00-\x1f\x80-\uFFFF]/g,function(s) { + .replace(regex,function(s) { return '\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4); }); // non-ASCII characters }; diff --git a/editions/tw5.com/tiddlers/filters/examples/jsonstringify Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/jsonstringify Operator (Examples).tid index 20f7bff75..ead9ffb38 100644 --- a/editions/tw5.com/tiddlers/filters/examples/jsonstringify Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/jsonstringify Operator (Examples).tid @@ -5,3 +5,5 @@ title: jsonstringify Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 """[[Title with "double quotes" and single ' and \backslash]] +[jsonstringify[]]""">> +<<.operator-example 2 """[[Accents and emojis -> äñøßπ ⌛🎄🍪🍓 without suffix]] +[jsonstringify[]]""">> +<<.operator-example 3 """[[Accents and emojis -> äñøßπ ⌛🎄🍪🍓 with rawunicode suffix]] +[jsonstringify:rawunicode[]]""">> diff --git a/editions/tw5.com/tiddlers/filters/examples/stringify_Operator_(Examples).tid b/editions/tw5.com/tiddlers/filters/examples/stringify_Operator_(Examples).tid index 1378287f5..a664cf7d2 100644 --- a/editions/tw5.com/tiddlers/filters/examples/stringify_Operator_(Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/stringify_Operator_(Examples).tid @@ -5,3 +5,5 @@ title: stringify Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 """[[Title with "double quotes" and single ' and \backslash]] +[stringify[]]""">> +<<.operator-example 2 """[[Accents and emojis -> äñøßπ ⌛🎄🍪🍓 without suffix]] +[stringify[]]""">> +<<.operator-example 3 """[[Accents and emojis -> äñøßπ ⌛🎄🍪🍓 with rawunicode suffix]] +[stringify:rawunicode[]]""">> diff --git a/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid b/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid index ff361450e..a7e4d565c 100644 --- a/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid +++ b/editions/tw5.com/tiddlers/filters/jsonstringify Operator.tid @@ -7,22 +7,29 @@ op-output: the input with JSON string encodings applied op-parameter: op-parameter-name: op-purpose: apply JSON string encoding to a string +op-suffix: <<.from-version "5.1.23">> optionally, the keyword `rawunicode` +op-suffix-name: R tags: [[Filter Operators]] [[String Operators]] title: jsonstringify Operator type: text/vnd.tiddlywiki The following substitutions are made: -|!Character |!Replacement | -|`\` |`\\` | -|`"` |`\"` | -|`\r` (carriage return) |`\\r` | -|`\n` (line feed) |`\\n` | -|`\x08` (backspace) |`\\b` | -|`\x0c` (form field) |`\\f` | -|`\t` (tab) |`\\t` | -|Characters from 0x00 to 0x1f |`\\x##` where ## is two hex digits | -|Characters from 0x80 to 0xffff |`\\u####` where #### is four hex digits | +|!Character |!Replacement |!Condition | +|`\` |`\\` |Always | +|`"` |`\"` |Always | +|Carriage return (0x0d) |`\\r` |Always | +|Line feed (0x0a) |`\\n` |Always | +|Backspace (0x08) |`\\b` |Always | +|Form field (0x0c) |`\\f` |Always | +|Tab (0x09) |`\\t` |Always | +|Characters from 0x00 to 0x1f |`\\u####` where #### is four hex digits |Always | +|Characters from 0x80 to 0xffff|`\\u####` where #### is four hex digits |If `rawunicode` suffix is not present (default) | +|Characters from 0x80 to 0xffff|Unchanged |If `rawunicode` suffix is present <<.from-version "5.1.23">> | + +<<.from-version "5.1.23">> If the suffix `rawunicode` is present, Unicode characters above 0x80 (such as ß, ä, ñ or 🎄) will be passed through unchanged. Without the suffix, they will be substituted with `\\u` codes, which was the default behavior before 5.1.23. + +<<.note """Technical note: Characters outside the Basic Multilingual Plane, such as 🎄 and other emojis, will be encoded as a UTF-16 surrogate pair, i.e. with two `\u` sequences.""">> Also see the [[stringify Operator]]. diff --git a/editions/tw5.com/tiddlers/filters/stringify_Operator.tid b/editions/tw5.com/tiddlers/filters/stringify_Operator.tid index 7bd0847d9..e06be4387 100644 --- a/editions/tw5.com/tiddlers/filters/stringify_Operator.tid +++ b/editions/tw5.com/tiddlers/filters/stringify_Operator.tid @@ -6,6 +6,8 @@ op-output: the input with ~JavaScript string encodings applied op-parameter: op-parameter-name: op-purpose: apply ~JavaScript string encoding to a string +op-suffix: <<.from-version "5.1.23">> optionally, the keyword `rawunicode` +op-suffix-name: R tags: [[Filter Operators]] [[String Operators]] title: stringify Operator type: text/vnd.tiddlywiki @@ -13,15 +15,21 @@ from-version: 5.1.14 The following substitutions are made: -|!Character |!Replacement | -|`\` |`\\` | -|`"` |`\"` | -|`\r` (carriage return) |`\\r` | -|`\n` (line feed) |`\\n` | -|`\x08` (backspace) |`\\b` | -|`\x0c` (form feed) |`\\f` | -|`\t` (tab) |`\\t` | -|Characters from 0x00 to 0x1f and characters from 0x80 to 0xffff |`\\u####` where #### is four hex digits | +|!Character |!Replacement |!Condition | +|`\` |`\\` |Always | +|`"` |`\"` |Always | +|Carriage return (0x0d) |`\\r` |Always | +|Line feed (0x0a) |`\\n` |Always | +|Backspace (0x08) |`\\b` |Always | +|Form field (0x0c) |`\\f` |Always | +|Tab (0x09) |`\\t` |Always | +|Characters from 0x00 to 0x1f |`\\x##` where ## is two hex digits |Always | +|Characters from 0x80 to 0xffff|`\\u####` where #### is four hex digits |If `rawunicode` suffix is not present (default) | +|Characters from 0x80 to 0xffff|<<.from-version "5.1.23">> Unchanged |If `rawunicode` suffix is present | + +<<.from-version "5.1.23">> If the suffix `rawunicode` is present, Unicode characters above 0x80 (such as ß, ä, ñ or 🎄) will be passed through unchanged. Without the suffix, they will be substituted with `\\u` codes, which was the default behavior before 5.1.23. + +<<.note """Technical note: Characters outside the Basic Multilingual Plane, such as 🎄 and other emojis, will be encoded as a UTF-16 surrogate pair, i.e. with two `\u` sequences.""">> Also see the [[jsonstringify Operator]]. From 046746ba20d129e5f3f936627e8d7754c385d264 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Fri, 4 Dec 2020 19:23:50 +0100 Subject: [PATCH 1083/2376] Add :reduce filter run prefix (#5196) --- core/modules/filterrunprefixes/reduce.js | 49 ++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 core/modules/filterrunprefixes/reduce.js diff --git a/core/modules/filterrunprefixes/reduce.js b/core/modules/filterrunprefixes/reduce.js new file mode 100644 index 000000000..3ca305720 --- /dev/null +++ b/core/modules/filterrunprefixes/reduce.js @@ -0,0 +1,49 @@ +/*\ +title: $:/core/modules/filterrunprefixes/reduce.js +type: application/javascript +module-type: filterrunprefix +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.reduce = function(operationSubFunction) { + return function(results,source,widget) { + if(results.length > 0) { + var accumulator = ""; + for(var index=0; index<results.length; index++) { + var title = results[index], + list = operationSubFunction($tw.wiki.makeTiddlerIterator([title]),{ + getVariable: function(name) { + switch(name) { + case "currentTiddler": + return "" + title; + case "accumulator": + return "" + accumulator; + case "index": + return "" + index; + case "revIndex": + return "" + (results.length - 1 - index); + case "length": + return "" + results.length; + default: + return widget.getVariable(name); + } + } + }); + if(list.length > 0) { + accumulator = "" + list[0]; + } + } + results.splice(0,results.length); + results.push(accumulator); + } + } +}; + +})(); \ No newline at end of file From 911e23ee6d1b54618eb98adf93b421e3b7e90e1f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 4 Dec 2020 19:27:40 +0100 Subject: [PATCH 1084/2376] Make sidebarsegments/search button display the count of ALL search results (de-duplicated) (#5194) --- core/ui/SideBarSegments/search.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index 4e7e6eb72..a5b6f1b97 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -8,9 +8,9 @@ tags: $:/tags/SideBarSegment <$button popup=<<qualify "$:/state/popup/search-dropdown">> class="tc-btn-invisible"> {{$:/core/images/down-arrow}} <$list filter="[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]" variable="listItem"> -<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}> -<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]] }}}> -<$set name="resultCount" value="""<$count filter="[subfilter<primaryListFilter>] =[subfilter<secondaryListFilter>]"/>"""> +<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp="limit\[\d+\]"> +<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}> +<$set name="resultCount" value="""<$count filter="[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]"/>"""> {{$:/language/Search/Matches}} </$set> </$vars> From 813e28e1eafe954eb3d9352addf4d41bd9564576 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 4 Dec 2020 19:28:36 +0100 Subject: [PATCH 1085/2376] Make the tag-picker tags-dropdown more performant (#5195) * Replace macrocall for tag-button with transclusion of a TagPickerTagTemplate * Create TagPickerTagTemplate.tid --- core/ui/TagPickerTagTemplate.tid | 17 +++++++++++++++++ core/wiki/macros/tag-picker.tid | 27 +++++++-------------------- 2 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 core/ui/TagPickerTagTemplate.tid diff --git a/core/ui/TagPickerTagTemplate.tid b/core/ui/TagPickerTagTemplate.tid new file mode 100644 index 000000000..43406a565 --- /dev/null +++ b/core/ui/TagPickerTagTemplate.tid @@ -0,0 +1,17 @@ +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>> +<$macrocall $name="tag-pill-inner" tag=<<currentTiddler>> icon={{{ [<tag>get[icon]] }}} colour={{{ [<tag>get[color]] }}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>> element-tag="span" element-attributes="" actions=<<actions>>/> +</$button> diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid index 31d6c786d..8a48532b1 100644 --- a/core/wiki/macros/tag-picker.tid +++ b/core/wiki/macros/tag-picker.tid @@ -20,19 +20,6 @@ $actions$ <$action-setfield $tiddler=<<refreshTitle>> text="yes"/> \end -\define tag-button(actions,selectedClass,tagField:"tags") -<$button class="tc-btn-invisible $selectedClass$" tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}> -<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>]"/> -<$set name="currentTiddlerCSSEscaped" value={{{ [<saveTiddler>escapecss[]] }}}> -<$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>> preventScroll="true"/> -</$set> -<<delete-tag-state-tiddlers>> -<$action-setfield $tiddler=<<refreshTitle>> text="yes"/> -$actions$ -<$macrocall $name="tag-pill" tag=<<tag>>/> -</$button> -\end - \define clear-tags-actions-inner() <$list filter="[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]" variable="ignore" emptyMessage="""<<cancel-delete-tiddler-actions "cancel">>"""> <<delete-tag-state-tiddlers>> @@ -49,7 +36,7 @@ $actions$ \define tag-picker-inner(actions,tagField:"tags") \whitespace trim -<$vars newTagNameInputTiddlerQualified=<<qualify "$:/temp/NewTagName/input">> newTagNameSelectionTiddlerQualified=<<qualify "$:/temp/NewTagName/selected-item">>> +<$vars newTagNameInputTiddlerQualified=<<qualify "$:/temp/NewTagName/input">> newTagNameSelectionTiddlerQualified=<<qualify "$:/temp/NewTagName/selected-item">> fallbackTarget={{$(palette)$##tag-background}} colourA={{$(palette)$##foreground}} colourB={{$(palette)$##background}}> <$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}> <$vars refreshTitle=<<qualify "$:/temp/NewTagName/refresh">> nonSystemTagsFilter="[tags[]!is[system]search:title<userInput>sort[]]" systemTagsFilter="[tags[]is[system]search:title<userInput>sort[]]"> <div class="tc-edit-add-tag"> @@ -80,15 +67,15 @@ $actions$ <$set name="userInput" value={{{ [<storeTitle>get[text]] }}}> <$list filter="[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> <$list filter=<<nonSystemTagsFilter>> variable="tag"> -<$list filter="[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$macrocall $name="tag-button" actions=<<__actions__>> selectedClass="tc-tag-button-selected"/>"""> -<$macrocall $name="tag-button" actions=<<__actions__>> tagField=<<__tagField__>>/> +<$list filter="[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$vars button-classes="tc-btn-invisible tc-tag-button-selected" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>"""> +<$vars button-classes="tc-btn-invisible" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars> </$list> </$list></$list> <hr> <$list filter="[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]" emptyMessage="""<div class="tc-search-results">{{$:/language/Search/Search/TooShort}}</div>""" variable="listItem"> <$list filter=<<systemTagsFilter>> variable="tag"> -<$list filter="[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$macrocall $name="tag-button" actions=<<__actions__>> selectedClass="tc-tag-button-selected"/>"""> -<$macrocall $name="tag-button" actions=<<__actions__>> tagField=<<__tagField__>>/> +<$list filter="[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]" emptyMessage="""<$vars button-classes="tc-btn-invisible tc-tag-button-selected" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>"""> +<$vars button-classes="tc-btn-invisible" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars> </$list> </$list></$list> </$set> @@ -102,11 +89,11 @@ $actions$ \end \define tag-picker(actions,tagField:"tags") \whitespace trim -<$set name="saveTiddler" value=<<currentTiddler>>> +<$vars saveTiddler=<<currentTiddler>> palette={{$:/palette}}> <$list filter="[<newTagNameTiddler>match[]]" emptyMessage="""<$macrocall $name="tag-picker-inner" actions=<<__actions__>> tagField=<<__tagField__>>/>"""> <$set name="newTagNameTiddler" value=<<qualify "$:/temp/NewTagName">>> <$macrocall $name="tag-picker-inner" actions=<<__actions__>> tagField=<<__tagField__>>/> </$set> </$list> -</$set> +</$vars> \end From 8799911162de6e5f5b656edb93a55a7a679cae13 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Fri, 4 Dec 2020 19:31:23 +0100 Subject: [PATCH 1086/2376] Reduce operator: second optional parameter instead of suffix (#5193) * Tweak reduce operator to use an optional second parameter instead of a suffix * Updated docs --- core/modules/filters/reduce.js | 2 +- .../filters/examples/reduce Operator (Examples).tid | 12 ++++++------ editions/tw5.com/tiddlers/filters/reduce.tid | 8 +++----- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/core/modules/filters/reduce.js b/core/modules/filters/reduce.js index 74d1131eb..fd5ccf568 100644 --- a/core/modules/filters/reduce.js +++ b/core/modules/filters/reduce.js @@ -23,7 +23,7 @@ exports.reduce = function(source,operator,options) { }); // Run the filter over each item var filterFn = options.wiki.compileFilter(operator.operand), - accumulator = operator.suffix || ""; + accumulator = operator.operands[1] || ""; for(var index=0; index<results.length; index++) { var title = results[index], list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{ diff --git a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid index 9d92ea0c8..1c619c506 100644 --- a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid @@ -1,5 +1,5 @@ created: 20201004154413968 -modified: 20201006181831622 +modified: 20201204131137081 tags: [[Operator Examples]] [[reduce Operator]] title: reduce Operator (Examples) type: text/vnd.tiddlywiki @@ -42,7 +42,7 @@ Using `<index>` to act differently on the first item than the rest: <<.operator-example 3 "[tag[shopping]reduce<join-with-commas>]">> -Empty input, no suffix: +Empty input, no second parameter: <<.operator-example 4 "[tag[non-existent]reduce<add-price>]">> @@ -50,12 +50,12 @@ Note how the output contains a single item with no text. This is not "empty outp <$macrocall $name=".tip" _=<<reduce-tip>> /> -Empty input, no suffix, followed by <<.op else>>: +Empty input, no second parameter, followed by <<.op else>>: <<.operator-example 5 "[tag[non-existent]reduce<add-price>else[0]]">> -Note how the output still contains a single item with no text: <<.op else>> did not trigger. If you want the value to be 0 when <<.op reduce>> has no items to process, you need to specify 0 as the initial value by passing it as a suffix to <<.op reduce>>. +Note how the output still contains a single item with no text: <<.op else>> did not trigger. If you want the value to be 0 when <<.op reduce>> has no items to process, you need to specify 0 as the initial value by passing it as a second parameter to <<.op reduce>>. -Empty input, suffix provided: +Empty input, second parameter provided: -<<.operator-example 6 "[tag[non-existent]reduce:0<add-price>]">> +<<.operator-example 6 "[tag[non-existent]reduce<add-price>,[0]]">> diff --git a/editions/tw5.com/tiddlers/filters/reduce.tid b/editions/tw5.com/tiddlers/filters/reduce.tid index d47955da3..debd28c9f 100644 --- a/editions/tw5.com/tiddlers/filters/reduce.tid +++ b/editions/tw5.com/tiddlers/filters/reduce.tid @@ -1,19 +1,17 @@ caption: reduce created: 20201004154131193 -modified: 20201006174749170 +modified: 20201204130601564 op-input: a [[selection of titles|Title Selection]] passed as input to the filter op-output: the final result of running the subfilter <<.place S>> -op-parameter: a [[filter expression|Filter Expression]] +op-parameter: a [[filter expression|Filter Expression]]. Optional second parameter for initial value for accumulator op-parameter-name: S op-purpose: apply a subfilter to each input title in turn, accumulating a single value -op-suffix: Initial value for accumulator -op-suffix-name: V tags: [[Filter Operators]] title: reduce Operator type: text/vnd.tiddlywiki \define reduce-tip() -The <<.op reduce>> operator will always produce output, even if its input was empty. If its input is empty, the output of <<.op reduce>> will be the initial value of the accumulator, i.e. the value of the suffix. One result of this fact is that the <<.op else>> operator will never be triggered if it follows a <<.op reduce>>. The "Empty input" examples show what happens when <<.op reduce>> receives no input. +The <<.op reduce>> operator will always produce output, even if its input was empty. If its input is empty, the output of <<.op reduce>> will be the initial value of the accumulator, i.e. the value of the second parameter. One result of this fact is that the <<.op else>> operator will never be triggered if it follows a <<.op reduce>>. The "Empty input" examples show what happens when <<.op reduce>> receives no input. \end <<.from-version "5.1.23">> The <<.op reduce>> operator runs a subfilter for each input title, passing the result of the previous subfilter run as a variable. The initial value of the accumulator can optionally be specified. It returns the result of the final subfilter run. From 9825b5b4a0ccab82d38c8daac8b5e85ab82ee84d Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Fri, 4 Dec 2020 20:02:05 +0100 Subject: [PATCH 1087/2376] Ensure new variables are strings (#5197) --- core/modules/widgets/eventcatcher.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/modules/widgets/eventcatcher.js b/core/modules/widgets/eventcatcher.js index 09f2e3ad7..c014f8997 100644 --- a/core/modules/widgets/eventcatcher.js +++ b/core/modules/widgets/eventcatcher.js @@ -97,13 +97,13 @@ EventWidget.prototype.render = function(parent,nextSibling) { variables["event-mousebutton"] = "right"; } } - variables["event-type"] = event.type; + variables["event-type"] = event.type.toString(); if(typeof event.detail === "object" && !!event.detail) { $tw.utils.each(event.detail,function(detailValue,detail) { - variables["event-detail-" + detail] = detailValue; + variables["event-detail-" + detail] = detailValue.toString(); }); } else if(!!event.detail) { - variables["event-detail"] = event.detail; + variables["event-detail"] = event.detail.toString(); } self.invokeActionString(actions,self,event,variables); event.preventDefault(); @@ -153,4 +153,4 @@ EventWidget.prototype.refresh = function(changedTiddlers) { exports.eventcatcher = EventWidget; -})(); \ No newline at end of file +})(); From ae5d78b4dd8024190dcd9334dcbd69f636884b20 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Fri, 4 Dec 2020 20:14:59 +0100 Subject: [PATCH 1088/2376] Update codemirror styles (#5198) --- plugins/tiddlywiki/codemirror/styles.tid | 35 ++++++++++++++---------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index 2c44f8d1a..3d097c234 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -3,6 +3,21 @@ tags: [[$:/tags/Stylesheet]] module-type: codemirror-theme name: tiddlywiki +\define set-fat-cursor-background-css(colour,colourA,colourB) +<$set name="backgroundColour" value=<<contrastcolour target:"""$colour$""" fallbackTarget:"""""" colourA:"""$colourA$""" colourB:"""$colourB$""">>> +.cm-s-tiddlywiki.cm-fat-cursor .CodeMirror-cursor { background: <<backgroundColour>>; } +.cm-s-tiddlywiki .cm-animate-fat-cursor { background-color: <<backgroundColour>>; } +</$set> +\end +\define set-fat-cursor-background-colours(palette) +<$macrocall $name="set-fat-cursor-background-css" colour={{$palette$##foreground}} colourA="#77ee77" colourB="#586e75"/> +\end +\define set-fat-cursor-background() +<$macrocall $name="set-fat-cursor-background-colours" palette={{$:/palette}}/> +\end + +\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock + /* Make the editor resize to fit its content */ .CodeMirror { @@ -37,37 +52,25 @@ name: tiddlywiki .cm-s-tiddlywiki .CodeMirror-line > span::-moz-selection, .cm-s-tiddlywiki .CodeMirror-line > span > span::-moz-selection { background: <<colour selection-background>>; } .cm-s-tiddlywiki span.cm-comment { color: <<colour muted-foreground>>; font-style:italic; font-weight:normal; } -.cm-s-tiddlywiki .CodeMirror-activeline-background, .cm-s-tiddlywiki .CodeMirror-activeline-gutter .CodeMirror-linenumber { background: <<colour background>>; } -.cm-s-tiddlywiki .CodeMirror-activeline .CodeMirror-linenumber.CodeMirror-gutter-elt { background: <<colour primary>>; color: <<colour background>>; } -.cm-s-tiddlywiki .CodeMirror-matchingbracket { background: <<colour primary>>; color:<<colour foreground>> !important; } -.cm-s-tiddlywiki span.cm-matchhighlight { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} -.cm-s-tiddlywiki span.cm-searching { color: <<colour foreground>>; background-color: <<colour primary>>; font-weight: normal;} - - +.cm-s-tiddlywiki .CodeMirror-activeline-background, .cm-s-tiddlywiki .CodeMirror-activeline-gutter .CodeMirror-linenumber { background: rgba(127,127,127,0.2); } +.cm-s-tiddlywiki span.cm-matchhighlight { color: <<colour background>>; background-color: <<colour primary>>; font-weight: normal;} .cm-s-tiddlywiki .CodeMirror-widget { text-shadow: none; } - .cm-s-tiddlywiki .cm-header { color: #586e75; } .cm-s-tiddlywiki .cm-quote { color: #93a1a1; } - .cm-s-tiddlywiki .cm-keyword { color: #cb4b16; } .cm-s-tiddlywiki .cm-atom { color: #d33682; } .cm-s-tiddlywiki .cm-number { color: #d33682; } .cm-s-tiddlywiki .cm-def { color: #2aa198; } - .cm-s-tiddlywiki .cm-variable { color: #839496; } .cm-s-tiddlywiki .cm-variable-2 { color: #b58900; } .cm-s-tiddlywiki .cm-variable-3, .cm-s-tiddlywiki .cm-type { color: #6c71c4; } - .cm-s-tiddlywiki .cm-property { color: #2aa198; } .cm-s-tiddlywiki .cm-operator { color: #6c71c4; } - .cm-s-tiddlywiki .cm-comment { color: #586e75; font-style:italic; } - .cm-s-tiddlywiki .cm-string { color: #859900; } .cm-s-tiddlywiki .cm-string-2 { color: #b58900; } - .cm-s-tiddlywiki .cm-meta { color: #859900; } .cm-s-tiddlywiki .cm-qualifier { color: #b58900; } .cm-s-tiddlywiki .cm-builtin { color: #d33682; } @@ -93,3 +96,7 @@ name: tiddlywiki color: #586e75; border-bottom: 1px dotted #dc322f; } +.cm-s-tiddlywiki .CodeMirror-matchingbracket { color: #859900; } +.cm-s-tiddlywiki .CodeMirror-nonmatchingbracket { color: #dc322f; } +.cm-s-tiddlywiki .cm-searching { background: rgba(243, 155, 53, .3); outline: 1px solid #F39B35; } +<<set-fat-cursor-background>> From fbe5bb229a937108220a16e13509739a68c3da66 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Sat, 5 Dec 2020 11:12:40 -0500 Subject: [PATCH 1089/2376] Fix for filterrunprefixes using $tw.wiki (#5202) * Fixed runprefix 'and' to use widget wiki * Made widget arg of filterTiddlers optional again * Switched to passing {wiki: wiki} to prefixes --- core/modules/filterrunprefixes/and.js | 4 ++-- core/modules/filterrunprefixes/reduce.js | 6 +++--- core/modules/filters.js | 13 +++++++------ editions/test/tiddlers/tests/test-filters.js | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core/modules/filterrunprefixes/and.js b/core/modules/filterrunprefixes/and.js index 29ccf1619..ad41c049c 100644 --- a/core/modules/filterrunprefixes/and.js +++ b/core/modules/filterrunprefixes/and.js @@ -16,10 +16,10 @@ Equivalent to + filter run prefix. /* Export our filter prefix function */ -exports.and = function(operationSubFunction) { +exports.and = function(operationSubFunction,options) { return function(results,source,widget) { // This replaces all the elements of the array, but keeps the actual array so that references to it are preserved - source = $tw.wiki.makeTiddlerIterator(results); + source = options.wiki.makeTiddlerIterator(results); results.splice(0,results.length); $tw.utils.pushTop(results,operationSubFunction(source,widget)); }; diff --git a/core/modules/filterrunprefixes/reduce.js b/core/modules/filterrunprefixes/reduce.js index 3ca305720..4dcef4bc7 100644 --- a/core/modules/filterrunprefixes/reduce.js +++ b/core/modules/filterrunprefixes/reduce.js @@ -12,13 +12,13 @@ module-type: filterrunprefix /* Export our filter prefix function */ -exports.reduce = function(operationSubFunction) { +exports.reduce = function(operationSubFunction,options) { return function(results,source,widget) { if(results.length > 0) { var accumulator = ""; for(var index=0; index<results.length; index++) { var title = results[index], - list = operationSubFunction($tw.wiki.makeTiddlerIterator([title]),{ + list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ getVariable: function(name) { switch(name) { case "currentTiddler": @@ -46,4 +46,4 @@ exports.reduce = function(operationSubFunction) { } }; -})(); \ No newline at end of file +})(); diff --git a/core/modules/filters.js b/core/modules/filters.js index 0beb86208..0fc0a3dc9 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -280,20 +280,21 @@ exports.compileFilter = function(filterString) { var filterRunPrefixes = self.getFilterRunPrefixes(); // Wrap the operator functions in a wrapper function that depends on the prefix operationFunctions.push((function() { + var options = {wiki: self}; switch(operation.prefix || "") { case "": // No prefix means that the operation is unioned into the result - return filterRunPrefixes["or"](operationSubFunction); + return filterRunPrefixes["or"](operationSubFunction, options); case "=": // The results of the operation are pushed into the result without deduplication - return filterRunPrefixes["all"](operationSubFunction); + return filterRunPrefixes["all"](operationSubFunction, options); case "-": // The results of this operation are removed from the main result - return filterRunPrefixes["except"](operationSubFunction); + return filterRunPrefixes["except"](operationSubFunction, options); case "+": // This operation is applied to the main results so far - return filterRunPrefixes["and"](operationSubFunction); + return filterRunPrefixes["and"](operationSubFunction, options); case "~": // This operation is unioned into the result only if the main result so far is empty - return filterRunPrefixes["else"](operationSubFunction); + return filterRunPrefixes["else"](operationSubFunction, options); default: if(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) { - return filterRunPrefixes[operation.namedPrefix](operationSubFunction); + return filterRunPrefixes[operation.namedPrefix](operationSubFunction, options); } else { return function(results,source,widget) { results.splice(0,results.length); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 895c83ca3..4a9e9f950 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -459,7 +459,7 @@ function runTests(wiki) { it("should handle indirect operands", function() { expect(wiki.filterTiddlers("[prefix{Tiddler8}] +[sort[title]]").join(",")).toBe("Tiddler Three,TiddlerOne"); expect(wiki.filterTiddlers("[modifier{Tiddler8!!test-field}] +[sort[title]]").join(",")).toBe("TiddlerOne"); - var fakeWidget = {getVariable: function() {return "Tiddler Three";}}; + var fakeWidget = {wiki: wiki, getVariable: function() {return "Tiddler Three";}}; expect(wiki.filterTiddlers("[modifier{!!modifier}] +[sort[title]]",fakeWidget).join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); }); From f798eab33f0621f20b79f794d4c51ec776f6fd62 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 5 Dec 2020 17:30:49 +0100 Subject: [PATCH 1090/2376] Update documentation on Performance (#5203) --- editions/tw5.com/tiddlers/workingwithtw/Performance.tid | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index 83ee7de91..68fa1f230 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -1,5 +1,5 @@ created: 20150330155120127 -modified: 20191014091943444 +modified: 20201205104857625 tags: [[Working with TiddlyWiki]] title: Performance type: text/vnd.tiddlywiki @@ -28,4 +28,5 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d ** Note that the field indexer currently defaults to indexing field values of less than 128 characters; longer values can still be searched for, but no index will be constructed ** Also note that the “field” operator is also used when the operator name is a fieldname, so, for example, `[all[shadows+tiddlers]caption[x]...` is optimised. * Use the [[throttling|RefreshThrottling]] feature of the RefreshMechanism judiciously - +* Keep in mind that ''transcluding separate tiddlers is more performant than heavy use of macros'' and the difference can be significant in some situations. The result of parsing each tiddler is cached and reused the next time if the tiddler has not changed. The same technique cannot be used for macros and they have to be re-parsed every time, as they are not global but local to the widget tree. +* Where possible ''use the SetWidget or VarsWidget with filters instead of the WikifyWidget'' for declaring variables and string concatenation. The performance of the wikify mechanism is relatively poor as there is no opportunity to cache the parse tree or widget tree. From d957b3e4e68fb76ba60e7c92b293fbc1b98f245b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 5 Dec 2020 17:37:50 +0100 Subject: [PATCH 1091/2376] Update CodeMirror styles to set selection colors based on foreground contrastcolour (#5200) * Update styles.tid * Update styles.tid * Update styles.tid --- plugins/tiddlywiki/codemirror/styles.tid | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index 3d097c234..d2b1e3916 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -15,6 +15,17 @@ name: tiddlywiki \define set-fat-cursor-background() <$macrocall $name="set-fat-cursor-background-colours" palette={{$:/palette}}/> \end +\define set-selection-background-css(colour,colourA,colourB) +<$set name="backgroundColour" value=<<contrastcolour target:"""$colour$""" fallbackTarget:"""""" colourA:"""$colourA$""" colourB:"""$colourB$""">>> +.cm-s-tiddlywiki div.CodeMirror-selected, .cm-s-tiddlywiki .CodeMirror-selectedtext, .cm-s-tiddlywiki .CodeMirror-selected, .cm-s-tiddlywiki .CodeMirror-line::selection, .cm-s-tiddlywiki .CodeMirror-line > span::selection, .cm-s-tiddlywiki .CodeMirror-line > span > span::selection, .cm-s-tiddlywiki .CodeMirror-line::-moz-selection, .cm-s-tiddlywiki .CodeMirror-line > span::-moz-selection, .cm-s-tiddlywiki .CodeMirror-line > span > span::-moz-selection { background: <<backgroundColour>> ; } +</$set> +\end +\define set-selection-background-colours(palette) +<$macrocall $name="set-selection-background-css" colour={{$palette$##foreground}} colourA={{{ [{$palette$##selection-background}!match[]!prefix[<<]!suffix[>>]] ~#073642 }}} colourB={{{ [{$palette$##selection-background}!match[]!prefix[<<]!suffix[>>]] ~#eee8d5 }}}/> +\end +\define set-selection-background() +<$macrocall $name="set-selection-background-colours" palette={{$:/palette}}/> +\end \rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock @@ -42,16 +53,7 @@ name: tiddlywiki .cm-s-tiddlywiki .CodeMirror-gutters {background: <<colour tiddler-editor-background>>; border-right: 0px;} .cm-s-tiddlywiki .CodeMirror-linenumber {color: <<colour foreground>>;} .cm-s-tiddlywiki .CodeMirror-cursor { border-left: 2px solid <<colour foreground>>; } -.cm-s-tiddlywiki div.CodeMirror-selected { background: <<colour selection-background>>; } -.cm-s-tiddlywiki .CodeMirror-selectedtext, -.cm-s-tiddlywiki .CodeMirror-selected, -.cm-s-tiddlywiki .CodeMirror-line::selection, -.cm-s-tiddlywiki .CodeMirror-line > span::selection, -.cm-s-tiddlywiki .CodeMirror-line > span > span::selection, -.cm-s-tiddlywiki .CodeMirror-line::-moz-selection, -.cm-s-tiddlywiki .CodeMirror-line > span::-moz-selection, -.cm-s-tiddlywiki .CodeMirror-line > span > span::-moz-selection { background: <<colour selection-background>>; } -.cm-s-tiddlywiki span.cm-comment { color: <<colour muted-foreground>>; font-style:italic; font-weight:normal; } +.cm-s-tiddlywiki span.cm-comment { color: #586e75; font-style:italic; font-weight:normal; } .cm-s-tiddlywiki .CodeMirror-activeline-background, .cm-s-tiddlywiki .CodeMirror-activeline-gutter .CodeMirror-linenumber { background: rgba(127,127,127,0.2); } .cm-s-tiddlywiki span.cm-matchhighlight { color: <<colour background>>; background-color: <<colour primary>>; font-weight: normal;} .cm-s-tiddlywiki .CodeMirror-widget { @@ -100,3 +102,4 @@ name: tiddlywiki .cm-s-tiddlywiki .CodeMirror-nonmatchingbracket { color: #dc322f; } .cm-s-tiddlywiki .cm-searching { background: rgba(243, 155, 53, .3); outline: 1px solid #F39B35; } <<set-fat-cursor-background>> +<<set-selection-background>> From bfc4b447dab6dfdb68c3f0d31ed1f630e68ebe39 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 5 Dec 2020 17:38:08 +0100 Subject: [PATCH 1092/2376] Add selection-background/foreground to GruvboxDark and Nord palettes (#5204) * Update GruvBoxDark.tid * Update Nord.tid * Update Nord.tid * Update Nord.tid * Update Nord.tid --- core/palettes/GruvBoxDark.tid | 2 ++ core/palettes/Nord.tid | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index a8db56807..d53ec61e0 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -60,6 +60,8 @@ pre-border: #504945 primary: #d79921 select-tag-background: #665c54 select-tag-foreground: <<colour foreground>> +selection-background: #458588 +selection-foreground: <<colour foreground>> sidebar-button-foreground: <<colour page-background>> sidebar-controls-foreground-hover: #7c6f64 sidebar-controls-foreground: #504945 diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index 73174a4d6..21d93a759 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -11,9 +11,7 @@ alert-highlight: #B48EAD alert-muted-foreground: #4C566A background: #3b4252 blockquote-bar: <<colour muted-foreground>> -button-background: #4C566A -button-foreground: #D8DEE9 -button-border: transparent +button-foreground: <<colour page-background>> code-background: #2E3440 code-border: #2E3440 code-foreground: #BF616A @@ -62,7 +60,9 @@ pre-border: #2E3440 primary: #5E81AC select-tag-background: #3b4252 select-tag-foreground: <<colour foreground>> -sidebar-button-foreground: <<colour foreground>> +selection-background: #5E81AC +selection-foreground: <<colour foreground>> +sidebar-button-foreground: <<colour page-background>> sidebar-controls-foreground-hover: #D8DEE9 sidebar-controls-foreground: #4C566A sidebar-foreground-shadow: transparent From 396703c4784e0993e1b85ae7cdb39d4aa4c80d4a Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 5 Dec 2020 18:38:39 +0100 Subject: [PATCH 1093/2376] An even faster version of the TagPickerTagTemplate (#5207) --- core/ui/TagPickerTagTemplate.tid | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/ui/TagPickerTagTemplate.tid b/core/ui/TagPickerTagTemplate.tid index 43406a565..0588a0698 100644 --- a/core/ui/TagPickerTagTemplate.tid +++ b/core/ui/TagPickerTagTemplate.tid @@ -13,5 +13,11 @@ title: $:/core/ui/TagPickerTagTemplate <$action-setfield $tiddler=<<refreshTitle>> text="yes"/> </$list> <<actions>> -<$macrocall $name="tag-pill-inner" tag=<<currentTiddler>> icon={{{ [<tag>get[icon]] }}} colour={{{ [<tag>get[color]] }}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>> element-tag="span" element-attributes="" actions=<<actions>>/> +<$set name="backgroundColor" value={{!!color}}> +<$wikify name="foregroundColor" text="""<$macrocall $name="contrastcolour" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>"""> +<span class="tc-tag-label tc-btn-invisible" style=<<tag-pill-styles>>> +<$transclude tiddler={{!!icon}}/><$view field="title" format="text"/> +</span> +</$wikify> +</$set> </$button> From 7fd24de372b5022e9266049101a12700f668eaca Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sun, 6 Dec 2020 00:10:51 +0100 Subject: [PATCH 1094/2376] Tests for filter prefixes (#5209) --- core/modules/filterrunprefixes/filter.js | 4 +- .../tiddlers/tests/test-prefixes-filter.js | 113 ++++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 editions/test/tiddlers/tests/test-prefixes-filter.js diff --git a/core/modules/filterrunprefixes/filter.js b/core/modules/filterrunprefixes/filter.js index 726732c8e..72b7ce24c 100644 --- a/core/modules/filterrunprefixes/filter.js +++ b/core/modules/filterrunprefixes/filter.js @@ -13,12 +13,12 @@ module-type: filterrunprefix /* Export our filter function */ -exports.filter = function(operationSubFunction) { +exports.filter = function(operationSubFunction,options) { return function(results,source,widget) { if(results.length > 0) { var resultsToRemove = []; $tw.utils.each(results,function(result) { - var filtered = operationSubFunction($tw.wiki.makeTiddlerIterator([result]),widget); + var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget); if(filtered.length === 0) { resultsToRemove.push(result); } diff --git a/editions/test/tiddlers/tests/test-prefixes-filter.js b/editions/test/tiddlers/tests/test-prefixes-filter.js new file mode 100644 index 000000000..7c88aeaf2 --- /dev/null +++ b/editions/test/tiddlers/tests/test-prefixes-filter.js @@ -0,0 +1,113 @@ +/*\ +title: test-prefixes-filters.js +type: application/javascript +tags: [[$:/tags/test-spec]] +Tests the reduce prefix and filter. +\*/ +(function(){ + +/* jslint node: true, browser: true */ +/* eslint-env node, browser, jasmine */ +/* eslint no-mixed-spaces-and-tabs: ["error", "smart-tabs"]*/ +/* global $tw, require */ +"use strict"; + +describe("'reduce' and 'intersection' filter prefix tests", function() { + + var wiki = new $tw.Wiki(); + + wiki.addTiddler({ + title: "Brownies", + text: "//This is a sample shopping list item for the [[Shopping List Example]]//", + tags: ["shopping","food"], + price: "4.99", + quantity: "1" + }); + wiki.addTiddler({ + title: "Chick Peas", + text: "//This is a sample shopping list item for the [[Shopping List Example]]//", + tags: ["shopping","food"], + price: "1.32", + quantity: "5" + }); + wiki.addTiddler({ + title: "Milk", + text: "//This is a sample shopping list item for the [[Shopping List Example]]//", + tags: ["shopping", "dairy", "drinks"], + price: "0.46", + quantity: "12" + }); + wiki.addTiddler({ + title: "Rice Pudding", + price: "2.66", + quantity: "4", + tags: ["shopping", "dairy"], + text: "//This is a sample shopping list item for the [[Shopping List Example]]//" + }); + wiki.addTiddler({ + title: "Sparkling water", + tags: ["drinks", "mineral water", "textexample"], + text: "This is some text" + }); + wiki.addTiddler({ + title: "Red wine", + tags: ["drinks", "wine", "textexample"], + text: "This is some more text" + }); + wiki.addTiddler({ + title: "Cheesecake", + tags: ["cakes", "food", "textexample"], + text: "This is even even even more text" + }); + wiki.addTiddler({ + title: "Chocolate Cake", + tags: ["cakes", "food", "textexample"], + text: "This is even more text" + }); + + it("should handle the :reduce filter prefix", function() { + expect(wiki.filterTiddlers("[tag[shopping]] :reduce[get[quantity]add<accumulator>]").join(",")).toBe("22"); + expect(wiki.filterTiddlers("[tag[shopping]] :reduce[get[price]multiply{!!quantity}add<accumulator>]").join(",")).toBe("27.75"); + expect(wiki.filterTiddlers("[tag[shopping]] :reduce[<index>compare:number:gt[0]then<accumulator>addsuffix[, ]addsuffix<currentTiddler>else<currentTiddler>]").join(",")).toBe("Brownies, Chick Peas, Milk, Rice Pudding"); + expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0"); + }); + + it("should handle the reduce operator", function() { + var widget = require("$:/core/modules/widgets/widget.js"); + var rootWidget = new widget.widget({ type:"widget", children:[ {type:"widget", children:[]} ] }, + { wiki:wiki, document:$tw.document}); + rootWidget.makeChildWidgets(); + var anchorWidget = rootWidget.children[0]; + rootWidget.setVariable("add-price","[get[price]multiply{!!quantity}add<accumulator>]"); + rootWidget.setVariable("num-items","[get[quantity]add<accumulator>]"); + rootWidget.setVariable("join-with-commas","[<index>compare:number:gt[0]then<accumulator>addsuffix[, ]addsuffix<currentTiddler>else<currentTiddler>]"); + + expect(wiki.filterTiddlers("[tag[shopping]reduce<num-items>]",anchorWidget).join(",")).toBe("22"); + expect(wiki.filterTiddlers("[tag[shopping]reduce<add-price>]",anchorWidget).join(",")).toBe("27.75"); + expect(wiki.filterTiddlers("[tag[shopping]reduce<join-with-commas>]",anchorWidget).join(",")).toBe("Brownies, Chick Peas, Milk, Rice Pudding"); + expect(wiki.filterTiddlers("[tag[non-existent]reduce<add-price>,[0]]",anchorWidget).join(",")).toBe("0"); + }); + + it("should handle the :intersection prefix", function() { + expect(wiki.filterTiddlers("[[Sparkling water]tags[]] :intersection[[Red wine]tags[]]").join(",")).toBe("drinks,textexample"); + expect(wiki.filterTiddlers("[[Brownies]tags[]] :intersection[[Chocolate Cake]tags[]]").join(",")).toBe("food"); + expect(wiki.filterTiddlers("[tag[shopping]] :intersection[tag[food]]").join(",")).toBe("Brownies,Chick Peas"); + expect(wiki.filterTiddlers("[tag[shopping]] :intersection[tag[drinks]]").join(",")).toBe("Milk"); + expect(wiki.filterTiddlers("[tag[shopping]] :intersection[tag[wine]]").join(",")).toBe(""); + }); + + it("should handle the :filter prefix and filter operator", function() { + var widget = require("$:/core/modules/widgets/widget.js"); + var rootWidget = new widget.widget({ type:"widget", children:[ {type:"widget", children:[]} ] }, + { wiki:wiki, document:$tw.document}); + rootWidget.makeChildWidgets(); + var anchorWidget = rootWidget.children[0]; + rootWidget.setVariable("larger-than-18","[get[text]length[]compare:integer:gteq[18]]"); + expect(wiki.filterTiddlers("[tag[textexample]] :filter[get[text]length[]compare:integer:gteq[18]]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake"); + expect(wiki.filterTiddlers("[tag[textexample]]",anchorWidget).join(",")).toBe("Sparkling water,Red wine,Cheesecake,Chocolate Cake"); + expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18>]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake"); + }) + +}); + +})(); \ No newline at end of file From c4dcf510ef44ccb4882bb272f68e5c8600a14559 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Sat, 5 Dec 2020 23:29:34 -0800 Subject: [PATCH 1095/2376] Ensure jasmine-plugin startup module is executed in the right order (#5210) --- plugins/tiddlywiki/jasmine/jasmine-plugin.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/tiddlywiki/jasmine/jasmine-plugin.js b/plugins/tiddlywiki/jasmine/jasmine-plugin.js index 3c79201c6..34c5b5831 100644 --- a/plugins/tiddlywiki/jasmine/jasmine-plugin.js +++ b/plugins/tiddlywiki/jasmine/jasmine-plugin.js @@ -14,6 +14,15 @@ The main module of the Jasmine test plugin for TiddlyWiki5 var TEST_TIDDLER_FILTER = "[type[application/javascript]tag[$:/tags/test-spec]]"; +// Ensure this startup module is executed in the right order. +// Jasmine calls `process.exit()` with a non-zero exit code if there's +// any failed tests. Because of that, we want to make sure all critical +// startup modules are run before this one. +// * The "commands" module handles the --rendertiddler command-line flag, +// which is typically given to export an HTML file that can be opened with +// a browser to run tests. +exports.after = ["commands"]; + /* Startup function for running tests From a857b4ab9a9c828708c4e7a5d03f1ea97ba782c4 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Sun, 6 Dec 2020 03:54:57 -0500 Subject: [PATCH 1096/2376] use a linked list for filter runs. (#5206) * Changed the filterrunprefixes to use LinkedList * Testing for Linked List * Finishing touches to LinkedList * Minor corrections to link-list coding style * Corrected for sneaky bug in linkedList --- core/modules/filterrunprefixes/all.js | 2 +- core/modules/filterrunprefixes/and.js | 6 +- core/modules/filterrunprefixes/else.js | 2 +- core/modules/filterrunprefixes/except.js | 2 +- core/modules/filterrunprefixes/filter.js | 4 +- .../modules/filterrunprefixes/intersection.js | 5 +- core/modules/filterrunprefixes/or.js | 2 +- core/modules/filterrunprefixes/reduce.js | 11 +- core/modules/filters.js | 4 +- core/modules/utils/linked-list.js | 118 ++++++++++++++++ .../test/tiddlers/tests/test-linked-list.js | 130 ++++++++++++++++++ 11 files changed, 268 insertions(+), 18 deletions(-) create mode 100644 core/modules/utils/linked-list.js create mode 100644 editions/test/tiddlers/tests/test-linked-list.js diff --git a/core/modules/filterrunprefixes/all.js b/core/modules/filterrunprefixes/all.js index 2e25bbc4d..652936de0 100644 --- a/core/modules/filterrunprefixes/all.js +++ b/core/modules/filterrunprefixes/all.js @@ -18,7 +18,7 @@ Export our filter prefix function */ exports.all = function(operationSubFunction) { return function(results,source,widget) { - Array.prototype.push.apply(results,operationSubFunction(source,widget)); + results.push.apply(results, operationSubFunction(source,widget)); }; }; diff --git a/core/modules/filterrunprefixes/and.js b/core/modules/filterrunprefixes/and.js index ad41c049c..309c228e6 100644 --- a/core/modules/filterrunprefixes/and.js +++ b/core/modules/filterrunprefixes/and.js @@ -19,9 +19,9 @@ Export our filter prefix function exports.and = function(operationSubFunction,options) { return function(results,source,widget) { // This replaces all the elements of the array, but keeps the actual array so that references to it are preserved - source = options.wiki.makeTiddlerIterator(results); - results.splice(0,results.length); - $tw.utils.pushTop(results,operationSubFunction(source,widget)); + source = options.wiki.makeTiddlerIterator(results.toArray()); + results.clear(); + results.pushTop(operationSubFunction(source,widget)); }; }; diff --git a/core/modules/filterrunprefixes/else.js b/core/modules/filterrunprefixes/else.js index c39b9e8fe..6e9ef29b3 100644 --- a/core/modules/filterrunprefixes/else.js +++ b/core/modules/filterrunprefixes/else.js @@ -19,7 +19,7 @@ exports.else = function(operationSubFunction) { return function(results,source,widget) { if(results.length === 0) { // Main result so far is empty - $tw.utils.pushTop(results,operationSubFunction(source,widget)); + results.pushTop(operationSubFunction(source,widget)); } }; }; diff --git a/core/modules/filterrunprefixes/except.js b/core/modules/filterrunprefixes/except.js index 18d649627..659f14228 100644 --- a/core/modules/filterrunprefixes/except.js +++ b/core/modules/filterrunprefixes/except.js @@ -18,7 +18,7 @@ Export our filter prefix function */ exports.except = function(operationSubFunction) { return function(results,source,widget) { - $tw.utils.removeArrayEntries(results,operationSubFunction(source,widget)); + results.remove(operationSubFunction(source,widget)); }; }; diff --git a/core/modules/filterrunprefixes/filter.js b/core/modules/filterrunprefixes/filter.js index 72b7ce24c..555f8981b 100644 --- a/core/modules/filterrunprefixes/filter.js +++ b/core/modules/filterrunprefixes/filter.js @@ -17,13 +17,13 @@ exports.filter = function(operationSubFunction,options) { return function(results,source,widget) { if(results.length > 0) { var resultsToRemove = []; - $tw.utils.each(results,function(result) { + results.each(function(result) { var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget); if(filtered.length === 0) { resultsToRemove.push(result); } }); - $tw.utils.removeArrayEntries(results,resultsToRemove); + results.remove(resultsToRemove); } } }; diff --git a/core/modules/filterrunprefixes/intersection.js b/core/modules/filterrunprefixes/intersection.js index 2874125d4..34d36066f 100644 --- a/core/modules/filterrunprefixes/intersection.js +++ b/core/modules/filterrunprefixes/intersection.js @@ -17,7 +17,8 @@ exports.intersection = function(operationSubFunction) { return function(results,source,widget) { if(results.length !== 0) { var secondRunResults = operationSubFunction(source,widget); - var firstRunResults = results.splice(0); + var firstRunResults = results.toArray(); + results.clear(); $tw.utils.each(firstRunResults,function(title) { if(secondRunResults.indexOf(title) !== -1) { results.push(title); @@ -27,4 +28,4 @@ exports.intersection = function(operationSubFunction) { }; }; -})(); \ No newline at end of file +})(); diff --git a/core/modules/filterrunprefixes/or.js b/core/modules/filterrunprefixes/or.js index 5192f490b..82eff083a 100644 --- a/core/modules/filterrunprefixes/or.js +++ b/core/modules/filterrunprefixes/or.js @@ -17,7 +17,7 @@ Export our filter prefix function */ exports.or = function(operationSubFunction) { return function(results,source,widget) { - $tw.utils.pushTop(results,operationSubFunction(source,widget)); + results.pushTop(operationSubFunction(source,widget)); }; }; diff --git a/core/modules/filterrunprefixes/reduce.js b/core/modules/filterrunprefixes/reduce.js index 4dcef4bc7..534c3e450 100644 --- a/core/modules/filterrunprefixes/reduce.js +++ b/core/modules/filterrunprefixes/reduce.js @@ -16,9 +16,9 @@ exports.reduce = function(operationSubFunction,options) { return function(results,source,widget) { if(results.length > 0) { var accumulator = ""; - for(var index=0; index<results.length; index++) { - var title = results[index], - list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ + var index = 0; + results.each(function(title) { + var list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ getVariable: function(name) { switch(name) { case "currentTiddler": @@ -39,8 +39,9 @@ exports.reduce = function(operationSubFunction,options) { if(list.length > 0) { accumulator = "" + list[0]; } - } - results.splice(0,results.length); + ++index; + }); + results.clear(); results.push(accumulator); } } diff --git a/core/modules/filters.js b/core/modules/filters.js index 0fc0a3dc9..4fec05964 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -311,11 +311,11 @@ exports.compileFilter = function(filterString) { } else if(typeof source === "object") { // Array or hashmap source = self.makeTiddlerIterator(source); } - var results = []; + var results = new $tw.utils.LinkedList(); $tw.utils.each(operationFunctions,function(operationFunction) { operationFunction(results,source,widget); }); - return results; + return results.toArray(); }); }; diff --git a/core/modules/utils/linked-list.js b/core/modules/utils/linked-list.js new file mode 100644 index 000000000..50421ab56 --- /dev/null +++ b/core/modules/utils/linked-list.js @@ -0,0 +1,118 @@ +/*\ +module-type: utils +title: $:/core/modules/utils/linkedlist.js +type: application/javascript + +This is a doubly-linked indexed list intended for manipulation, particularly +pushTop, which it does with significantly better performance than an array. + +\*/ +(function(){ + +function LinkedList() { + this.clear(); +}; + +LinkedList.prototype.clear = function() { + this.index = Object.create(null); + // LinkedList performs the duty of both the head and tail node + this.next = this; + this.prev = this; + this.length = 0; +}; + +LinkedList.prototype.remove = function(value) { + if($tw.utils.isArray(value)) { + for(var t=0; t<value.length; t++) { + this._removeOne(value[t]); + } + } else { + this._removeOne(value); + } +}; + +LinkedList.prototype._removeOne = function(value) { + var node = this.index[value]; + if(node) { + node.prev.next = node.next; + node.next.prev = node.prev; + this.length -= 1; + // Point index to the next instance of the same value, maybe nothing. + this.index[value] = node.copy; + } + return node; +}; + +LinkedList.prototype._linkToEnd = function(node) { + // Sticks the given node onto the end of the list. + this.prev.next = node; + node.prev = this.prev; + this.prev = node; + node.next = this; + this.length += 1; +}; + +LinkedList.prototype.push = function(/* values */) { + for(var i = 0; i < arguments.length; i++) { + var value = arguments[i]; + var node = {value: value}; + var preexistingNode = this.index[value]; + this._linkToEnd(node); + if(preexistingNode) { + // We want to keep pointing to the first instance, but we want + // to have that instance (or chain of instances) point to the + // new one. + while (preexistingNode.copy) { + preexistingNode = preexistingNode.copy; + } + preexistingNode.copy = node; + } else { + this.index[value] = node; + } + } +}; + +LinkedList.prototype.pushTop = function(value) { + if($tw.utils.isArray(value)) { + for(var t=0; t<value.length; t++) { + this._removeOne(value[t]); + } + this.push.apply(this, value); + } else { + var node = this._removeOne(value); + if(!node) { + node = {value: value}; + this.index[value] = node; + } else { + // Put this node at the end of the copy chain. + var preexistingNode = node; + while(preexistingNode.copy) { + preexistingNode = preexistingNode.copy; + } + // The order of these three statements is important, + // because sometimes preexistingNode == node. + preexistingNode.copy = node; + this.index[value] = node.copy; + node.copy = undefined; + } + this._linkToEnd(node); + } +}; + +LinkedList.prototype.each = function(callback) { + for(var ptr = this.next; ptr !== this; ptr = ptr.next) { + callback(ptr.value); + } +}; + +LinkedList.prototype.toArray = function() { + var output = []; + for(var ptr = this.next; ptr !== this; ptr = ptr.next) { + output.push(ptr.value); + } + return output; +}; + +exports.LinkedList = LinkedList; + +})(); diff --git a/editions/test/tiddlers/tests/test-linked-list.js b/editions/test/tiddlers/tests/test-linked-list.js new file mode 100644 index 000000000..c66a1fc3b --- /dev/null +++ b/editions/test/tiddlers/tests/test-linked-list.js @@ -0,0 +1,130 @@ +/*\ +title: test-linked-list.js +type: application/javascript +tags: [[$:/tags/test-spec]] + +Tests the utils.LinkedList class. + +LinkedList was built to behave exactly as $tw.utils.pushTop and +Array.prototype.push would behave with an array. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +describe("LinkedList class tests", function() { + + it("can pushTop", function() { + var list = new $tw.utils.LinkedList(); + list.push('A', 'B', 'C'); + // singles + list.pushTop('X'); + list.pushTop('B'); + expect(list.toArray()).toEqual(['A', 'C', 'X', 'B']); + expect(list.length).toBe(4); + //arrays + list.pushTop(['X', 'A', 'G', 'A']); + // If the pushedTopped list has duplicates, they go in unempeded. + expect(list.toArray()).toEqual(['C', 'B', 'X', 'A', 'G', 'A']); + expect(list.length).toBe(6); + }); + + it("can pushTop with tricky duplicates", function() { + var list = new $tw.utils.LinkedList(); + list.push('A', 'B', 'A', 'C', 'A', 'end'); + // If the original list contains duplicates, only one instance is cut + list.pushTop('A'); + expect(list.toArray()).toEqual(['B', 'A', 'C', 'A', 'end', 'A']); + expect(list.length).toBe(6); + + // And the Llist properly knows the next 'A' to cut if pushed again + list.pushTop(['X', 'A']); + expect(list.toArray()).toEqual(['B', 'C', 'A', 'end', 'A', 'X', 'A']); + expect(list.length).toBe(7); + + // One last time, to make sure we maintain the linked chain of copies + list.pushTop('A'); + expect(list.toArray()).toEqual(['B', 'C', 'end', 'A', 'X', 'A', 'A']); + expect(list.length).toBe(7); + }); + + it("can handle particularly nasty pushTop pitfall", function() { + var list = new $tw.utils.LinkedList(); + list.push('A', 'B', 'A', 'C'); + list.pushTop('A'); // BACA + list.pushTop('X'); // BACAX + list.remove('A'); // BCAX + list.pushTop('A'); // BCXA + list.remove('A'); // BCX + // But! The way I initially coded the copy chains, a mystery A could + // hang around. + expect(list.toArray()).toEqual(['B', 'C', 'X']); + expect(list.length).toBe(3); + }); + + it("can push", function() { + var list = new $tw.utils.LinkedList(); + list.push('A', 'B', 'C'); + // singles + list.push('B'); + expect(list.toArray()).toEqual(['A', 'B', 'C', 'B']); + expect(list.length).toBe(4); + + // multiple args + list.push('A', 'B', 'C'); + expect(list.toArray()).toEqual(['A', 'B', 'C', 'B', 'A', 'B', 'C']); + expect(list.length).toBe(7); + }); + + it("can clear", function() { + var list = new $tw.utils.LinkedList(); + list.push('A', 'B', 'C'); + list.clear(); + expect(list.toArray()).toEqual([]); + expect(list.length).toBe(0); + }); + + it("can remove", function() { + var list = new $tw.utils.LinkedList(); + list.push('A', 'x', 'C', 'x', 'D', 'x', 'E', 'x'); + // single + list.remove('x'); + expect(list.toArray()).toEqual(['A', 'C', 'x', 'D', 'x', 'E', 'x']); + expect(list.length).toBe(7); + + // arrays + list.remove(['x', 'A', 'x']); + expect(list.toArray()).toEqual(['C', 'D', 'E', 'x']); + expect(list.length).toBe(4); + }); + + it('can ignore removal of nonexistent items', function() { + var list = new $tw.utils.LinkedList(); + list.push('A', 'B', 'C', 'D'); + // single + list.remove('Z'); + expect(list.toArray()).toEqual(['A', 'B', 'C', 'D']); + expect(list.length).toBe(4); + + // array + list.remove(['Z', 'B', 'X']); + expect(list.toArray()).toEqual(['A', 'C', 'D']); + expect(list.length).toBe(3); + }); + + it('can iterate with each', function() { + var list = new $tw.utils.LinkedList(); + list.push('0', '1', '2', '3'); + var counter = 0; + list.each(function(value) { + expect(value).toBe(counter.toString()); + counter = counter + 1; + }); + expect(counter).toBe(4); + }); +}); + +})(); From a3a7d6450dfabbd0a183ce941be65560ecc77a37 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 6 Dec 2020 09:56:06 +0100 Subject: [PATCH 1097/2376] CodeMirror: Ensure linenumber-gutter has a right border (#5212) * Ensure linenumber-gutter has a right border * Update GruvBoxDark.tid * Update Nord.tid --- core/palettes/GruvBoxDark.tid | 2 +- core/palettes/Nord.tid | 2 +- plugins/tiddlywiki/codemirror/styles.tid | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index d53ec61e0..9c2aaaa31 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -97,7 +97,7 @@ tiddler-border: <<colour background>> tiddler-controls-foreground-hover: #7c6f64 tiddler-controls-foreground-selected: <<colour primary>> tiddler-controls-foreground: #665c54 -tiddler-editor-background: #282828 +tiddler-editor-background: #32302f tiddler-editor-border-image: #282828 tiddler-editor-border: #282828 tiddler-editor-fields-even: #504945 diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index 21d93a759..b2b618e72 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -99,7 +99,7 @@ tiddler-controls-foreground-selected: #EBCB8B tiddler-controls-foreground: #4C566A tiddler-editor-background: #2e3440 tiddler-editor-border-image: #2e3440 -tiddler-editor-border: #2e3440 +tiddler-editor-border: #3b4252 tiddler-editor-fields-even: #2e3440 tiddler-editor-fields-odd: #2e3440 tiddler-info-background: #2e3440 diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index d2b1e3916..30c9e731a 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -50,7 +50,7 @@ name: tiddlywiki } .cm-s-tiddlywiki.CodeMirror, .cm-s-tiddlywiki .CodeMirror-gutters { background-color: <<colour tiddler-editor-background>>; color: <<colour foreground>>; } -.cm-s-tiddlywiki .CodeMirror-gutters {background: <<colour tiddler-editor-background>>; border-right: 0px;} +.cm-s-tiddlywiki .CodeMirror-gutters {background: <<colour tiddler-editor-background>>; border-right: 1px solid <<colour tiddler-editor-border>>;} .cm-s-tiddlywiki .CodeMirror-linenumber {color: <<colour foreground>>;} .cm-s-tiddlywiki .CodeMirror-cursor { border-left: 2px solid <<colour foreground>>; } .cm-s-tiddlywiki span.cm-comment { color: #586e75; font-style:italic; font-weight:normal; } From b0f6d50b6096955b93725c88f6204a971de6110e Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Sun, 6 Dec 2020 01:41:03 -0800 Subject: [PATCH 1098/2376] fix filesystem bugs (#5213) --- core/modules/utils/filesystem.js | 40 ++++++++++--------- .../filesystem/filesystemadaptor.js | 12 ++++-- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 9ee2e8acd..370a1eaf5 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -217,6 +217,10 @@ Options include: */ exports.generateTiddlerFileInfo = function(tiddler,options) { var fileInfo = {}, metaExt; + // Propigate the isEditableFile flag + if(options.fileInfo) { + fileInfo.isEditableFile = options.fileInfo.isEditableFile || false; + } // Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace var hasUnsafeFields = false; $tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) { @@ -248,20 +252,22 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { extFilters: options.extFilters, wiki: options.wiki }); - if(metaExt === ".tid") { - // Overriding to the .tid extension needs special handling - fileInfo.type = "application/x-tiddler"; - fileInfo.hasMetaFile = false; - } else if (metaExt === ".json") { - // Overriding to the .json extension needs special handling - fileInfo.type = "application/json"; - fileInfo.hasMetaFile = false; - } else if (metaExt) { - //If the new type matches a known extention, use that MIME type's encoding - var extInfo = $tw.utils.getFileExtensionInfo(metaExt); - fileInfo.type = extInfo ? extInfo.type : null; - fileInfo.encoding = $tw.utils.getTypeEncoding(metaExt); - fileInfo.hasMetaFile = true; + if(metaExt){ + if(metaExt === ".tid") { + // Overriding to the .tid extension needs special handling + fileInfo.type = "application/x-tiddler"; + fileInfo.hasMetaFile = false; + } else if (metaExt === ".json") { + // Overriding to the .json extension needs special handling + fileInfo.type = "application/json"; + fileInfo.hasMetaFile = false; + } else { + //If the new type matches a known extention, use that MIME type's encoding + var extInfo = $tw.utils.getFileExtensionInfo(metaExt); + fileInfo.type = extInfo ? extInfo.type : null; + fileInfo.encoding = $tw.utils.getTypeEncoding(metaExt); + fileInfo.hasMetaFile = true; + } } } } @@ -276,10 +282,6 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { fileInfo: options.fileInfo, originalpath: options.originalpath }); - // Propigate the isEditableFile flag - if(options.fileInfo) { - fileInfo.isEditableFile = options.fileInfo.isEditableFile || false; - } return fileInfo; }; @@ -380,7 +382,7 @@ exports.generateTiddlerFilepath = function(title,options) { count++; } while(fs.existsSync(fullPath)); //If the path does not start with the wikiPath directory or the wikiTiddlersPath directory, or if the last write failed - var encode = !(fullPath.indexOf($tw.boot.wikiPath) == 0 || fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0) || ((options.fileInfo || {writeError: false}).writeError == true); + var encode = !(fullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 || fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0) || ((options.fileInfo || {writeError: false}).writeError == true); if(encode){ //encodeURIComponent() and then resolve to tiddler directory fullPath = path.resolve(directory, encodeURIComponent(fullPath)); diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index 5cef917bf..7e3cd2fa2 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -53,11 +53,17 @@ It is the responsibility of the filesystem adaptor to update this.boot.files for */ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { // Always generate a fileInfo object when this fuction is called - var title = tiddler.fields.title, newInfo; + var title = tiddler.fields.title, newInfo, pathFilters, extFilters; + if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")){ + pathFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"); + } + if(this.wiki.tiddlerExists("$:/config/FileSystemExtensions")){ + extFilters = this.wiki.getTiddlerText("$:/config/FileSystemExtensions","").split("\n"); + } newInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ directory: this.boot.wikiTiddlersPath, - pathFilters: this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"), - extFilters: this.wiki.getTiddlerText("$:/config/FileSystemExtensions","").split("\n"), + pathFilters: pathFilters, + extFilters: extFilters, wiki: this.wiki, fileInfo: this.boot.files[title], originalpath: this.wiki.extractTiddlerDataItem("$:/config/OriginalTiddlerPaths",title, "") From 0b1a05d10d3bda97c36953bb8e8f3e97d333c191 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Sun, 6 Dec 2020 09:43:06 +0000 Subject: [PATCH 1099/2376] Cache result of parsing macro calls which don't use text subsitution (#5205) --- core/modules/widgets/macrocall.js | 15 ++++++++++++--- core/modules/widgets/widget.js | 7 +++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/modules/widgets/macrocall.js b/core/modules/widgets/macrocall.js index 2f527cc96..bc013cbf4 100644 --- a/core/modules/widgets/macrocall.js +++ b/core/modules/widgets/macrocall.js @@ -55,9 +55,18 @@ MacroCallWidget.prototype.execute = function() { // Are we rendering to HTML? if(this.renderOutput === "text/html") { // If so we'll return the parsed macro - var parser = this.wiki.parseText(this.parseType,text, - {parseAsInline: !this.parseTreeNode.isBlock}); - parseTreeNodes = parser ? parser.tree : []; + // Check if we've already cached parsing this macro + var parser; + if(variableInfo.srcVariable && variableInfo.srcVariable.parser) { + parser = variableInfo.srcVariable.parser; + } else { + parser = this.wiki.parseText(this.parseType,text, + {parseAsInline: !this.parseTreeNode.isBlock}); + if(variableInfo.isCacheable && variableInfo.srcVariable) { + // variableInfo.srcVariable.parser = parser; + } + } + var parseTreeNodes = parser ? parser.tree : []; // Wrap the parse tree in a vars widget assigning the parameters to variables named "__paramname__" var attributes = {}; $tw.utils.each(variableInfo.params,function(param) { diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 22112a516..1925bfe00 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -113,7 +113,8 @@ Widget.prototype.getVariableInfo = function(name,options) { // Check for the variable defined in the parent widget (or an ancestor in the prototype chain) if(parentWidget && name in parentWidget.variables) { var variable = parentWidget.variables[name], - value = variable.value, + originalValue = variable.value, + value = originalValue, params = this.resolveVariableParameters(variable.params,actualParams); // Substitute any parameters specified in the definition $tw.utils.each(params,function(param) { @@ -125,7 +126,9 @@ Widget.prototype.getVariableInfo = function(name,options) { } return { text: value, - params: params + params: params, + srcVariable: variable, + isCacheable: originalValue === value }; } // If the variable doesn't exist in the parent widget then look for a macro module From 122306fc24968a800f3a0eb237d350e81d0bf836 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 6 Dec 2020 10:58:02 +0100 Subject: [PATCH 1100/2376] Update GruvboxDark, CupertinoDark and Nord palettes to work better with TiddlyDesktop (#5214) * Update CupertinoDark.tid * Update GruvBoxDark.tid * Update Nord.tid --- core/palettes/CupertinoDark.tid | 4 ++-- core/palettes/GruvBoxDark.tid | 2 +- core/palettes/Nord.tid | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index 8097322cc..f0930f548 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -112,8 +112,8 @@ very-muted-foreground: #464646 selection-background: #3F638B selection-foreground: #ffffff wikilist-background: <<colour page-background>> -wikilist-button-background: <<colour button-background>> -wikilist-button-foreground: <<colour background>> +wikilist-button-background: #3F638B +wikilist-button-foreground: <<colour foreground>> wikilist-button-open: #32D74B wikilist-button-open-hover: #32D74B wikilist-button-reveal: #0A84FF diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index 9c2aaaa31..494a9349b 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -121,7 +121,7 @@ toolbar-done-button: untagged-background: #504945 very-muted-foreground: #bdae93 wikilist-background: <<colour page-background>> -wikilist-button-background: <<colour button-background>> +wikilist-button-background: #acacac wikilist-button-foreground: <<colour button-foreground>> wikilist-item: <<colour background>> wikilist-toolbar-background: <<colour background>> diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index b2b618e72..7af3b01e4 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -120,3 +120,14 @@ toolbar-cancel-button: toolbar-done-button: untagged-background: #2d3038 very-muted-foreground: #2d3038 +wikilist-background: <<colour page-background>> +wikilist-toolbar-background: <<colour background>> +wikilist-item: <<colour background>> +wikilist-title: <<colour foreground>> +wikilist-info: <<colour muted-foreground>> +wikilist-button-open: #A3BE8C +wikilist-button-open-hover: #A3BE8C +wikilist-button-reveal: #81A1C1 +wikilist-button-reveal-hover: #81A1C1 +wikilist-button-remove: #B48EAD +wikilist-button-remove-hover: #B48EAD From 005f7c55b69e61ed8a30f2a457468907c78e9320 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 6 Dec 2020 10:50:59 +0000 Subject: [PATCH 1101/2376] Restore accidental commenting in 0b1a05d10 --- core/modules/widgets/macrocall.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/macrocall.js b/core/modules/widgets/macrocall.js index bc013cbf4..adf1f908c 100644 --- a/core/modules/widgets/macrocall.js +++ b/core/modules/widgets/macrocall.js @@ -63,7 +63,7 @@ MacroCallWidget.prototype.execute = function() { parser = this.wiki.parseText(this.parseType,text, {parseAsInline: !this.parseTreeNode.isBlock}); if(variableInfo.isCacheable && variableInfo.srcVariable) { - // variableInfo.srcVariable.parser = parser; + variableInfo.srcVariable.parser = parser; } } var parseTreeNodes = parser ? parser.tree : []; From b2d270a7e87bb5f16443a5c760a8e437a59661bc Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 6 Dec 2020 14:00:19 +0100 Subject: [PATCH 1102/2376] CodeMirror: Make colored selections based on palette work in chrome, too (#5215) * Make colored selections based on palette work in chrome, too * Update styles.tid --- plugins/tiddlywiki/codemirror/styles.tid | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index 30c9e731a..d1a324847 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -17,7 +17,10 @@ name: tiddlywiki \end \define set-selection-background-css(colour,colourA,colourB) <$set name="backgroundColour" value=<<contrastcolour target:"""$colour$""" fallbackTarget:"""""" colourA:"""$colourA$""" colourB:"""$colourB$""">>> -.cm-s-tiddlywiki div.CodeMirror-selected, .cm-s-tiddlywiki .CodeMirror-selectedtext, .cm-s-tiddlywiki .CodeMirror-selected, .cm-s-tiddlywiki .CodeMirror-line::selection, .cm-s-tiddlywiki .CodeMirror-line > span::selection, .cm-s-tiddlywiki .CodeMirror-line > span > span::selection, .cm-s-tiddlywiki .CodeMirror-line::-moz-selection, .cm-s-tiddlywiki .CodeMirror-line > span::-moz-selection, .cm-s-tiddlywiki .CodeMirror-line > span > span::-moz-selection { background: <<backgroundColour>> ; } +.cm-s-tiddlywiki div.CodeMirror-selected { background: <<backgroundColour>>; } +.cm-s-tiddlywiki.CodeMirror ::selection { background: <<backgroundColour>>; } +.cm-s-tiddlywiki .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: <<backgroundColour>>; } +.cm-s-tiddlywiki .CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: <<backgroundColour>>; } </$set> \end \define set-selection-background-colours(palette) From a8c1e6a3bd7feb8cd5d98ee886e25b52fcd0d6c4 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sun, 6 Dec 2020 14:57:47 +0100 Subject: [PATCH 1103/2376] Update performance documentation (#5216) Documents the change to macro parsing from #5205 This builds on documentation changes made in the tw.com branch and is therefore based on that branch, but should not be merged before 5.1.23 is live. --- editions/tw5.com/tiddlers/workingwithtw/Performance.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index 68fa1f230..2aec04e36 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -29,4 +29,5 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d ** Also note that the “field” operator is also used when the operator name is a fieldname, so, for example, `[all[shadows+tiddlers]caption[x]...` is optimised. * Use the [[throttling|RefreshThrottling]] feature of the RefreshMechanism judiciously * Keep in mind that ''transcluding separate tiddlers is more performant than heavy use of macros'' and the difference can be significant in some situations. The result of parsing each tiddler is cached and reused the next time if the tiddler has not changed. The same technique cannot be used for macros and they have to be re-parsed every time, as they are not global but local to the widget tree. +** <<.from-version "5.1.23">> Parse trees are now cached for macros that do ''not'' perform any text substitution either via parameters or variables (i.e. `$parameter$` or `$(variable)$`). * Where possible ''use the SetWidget or VarsWidget with filters instead of the WikifyWidget'' for declaring variables and string concatenation. The performance of the wikify mechanism is relatively poor as there is no opportunity to cache the parse tree or widget tree. From 96d4f87e78b01731d74f46ca695e6f5e0eef93dd Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 6 Dec 2020 14:01:03 +0000 Subject: [PATCH 1104/2376] Revert "Update documentation on Performance (#5203)" This reverts commit f798eab33f0621f20b79f794d4c51ec776f6fd62. --- editions/tw5.com/tiddlers/workingwithtw/Performance.tid | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index 2aec04e36..5eec40ac5 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -1,5 +1,5 @@ created: 20150330155120127 -modified: 20201205104857625 +modified: 20191014091943444 tags: [[Working with TiddlyWiki]] title: Performance type: text/vnd.tiddlywiki @@ -29,5 +29,4 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d ** Also note that the “field” operator is also used when the operator name is a fieldname, so, for example, `[all[shadows+tiddlers]caption[x]...` is optimised. * Use the [[throttling|RefreshThrottling]] feature of the RefreshMechanism judiciously * Keep in mind that ''transcluding separate tiddlers is more performant than heavy use of macros'' and the difference can be significant in some situations. The result of parsing each tiddler is cached and reused the next time if the tiddler has not changed. The same technique cannot be used for macros and they have to be re-parsed every time, as they are not global but local to the widget tree. -** <<.from-version "5.1.23">> Parse trees are now cached for macros that do ''not'' perform any text substitution either via parameters or variables (i.e. `$parameter$` or `$(variable)$`). * Where possible ''use the SetWidget or VarsWidget with filters instead of the WikifyWidget'' for declaring variables and string concatenation. The performance of the wikify mechanism is relatively poor as there is no opportunity to cache the parse tree or widget tree. From 43a3228200e6e18622b1d193c503c2ea23cfd218 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 6 Dec 2020 14:02:06 +0000 Subject: [PATCH 1105/2376] Update Performance docs for macro parsing optimisation Replacing #5216 --- editions/tw5.com/tiddlers/workingwithtw/Performance.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid index 68fa1f230..2aec04e36 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Performance.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Performance.tid @@ -29,4 +29,5 @@ TiddlyWiki ships with defaults that are designed to get the best out of modern d ** Also note that the “field” operator is also used when the operator name is a fieldname, so, for example, `[all[shadows+tiddlers]caption[x]...` is optimised. * Use the [[throttling|RefreshThrottling]] feature of the RefreshMechanism judiciously * Keep in mind that ''transcluding separate tiddlers is more performant than heavy use of macros'' and the difference can be significant in some situations. The result of parsing each tiddler is cached and reused the next time if the tiddler has not changed. The same technique cannot be used for macros and they have to be re-parsed every time, as they are not global but local to the widget tree. +** <<.from-version "5.1.23">> Parse trees are now cached for macros that do ''not'' perform any text substitution either via parameters or variables (i.e. `$parameter$` or `$(variable)$`). * Where possible ''use the SetWidget or VarsWidget with filters instead of the WikifyWidget'' for declaring variables and string concatenation. The performance of the wikify mechanism is relatively poor as there is no opportunity to cache the parse tree or widget tree. From 958f57f2c0c2138ca1756fa67999ed59570db33b Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 6 Dec 2020 18:15:40 +0100 Subject: [PATCH 1106/2376] Make editTiddler in sidebarsegments/search available as variable (#5218) --- core/ui/SideBarSegments/search.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/SideBarSegments/search.tid b/core/ui/SideBarSegments/search.tid index a5b6f1b97..91d4fe922 100644 --- a/core/ui/SideBarSegments/search.tid +++ b/core/ui/SideBarSegments/search.tid @@ -46,12 +46,12 @@ tags: $:/tags/SideBarSegment <div class="tc-sidebar-lists tc-sidebar-search"> -<$vars searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> +<$vars editTiddler="$:/temp/search" searchTiddler="$:/temp/search/input" searchListState=<<qualify "$:/state/search-list/selected-item">>> <div class="tc-search"> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$keyboard key="((advanced-search-sidebar))" actions=<<advanced-search-actions>>> -<$macrocall $name="keyboard-driven-input" tiddler="$:/temp/search" storeTitle=<<searchTiddler>> +<$macrocall $name="keyboard-driven-input" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search" tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> class="tc-popup-handle" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> From e8815b79ff661f3b8d5793b434562a8402baa4d8 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 6 Dec 2020 18:21:35 +0100 Subject: [PATCH 1107/2376] Update CodeMirror Dialog to always have a background color (#5217) --- plugins/tiddlywiki/codemirror/styles.tid | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index d1a324847..de3ca98ce 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -59,9 +59,8 @@ name: tiddlywiki .cm-s-tiddlywiki span.cm-comment { color: #586e75; font-style:italic; font-weight:normal; } .cm-s-tiddlywiki .CodeMirror-activeline-background, .cm-s-tiddlywiki .CodeMirror-activeline-gutter .CodeMirror-linenumber { background: rgba(127,127,127,0.2); } .cm-s-tiddlywiki span.cm-matchhighlight { color: <<colour background>>; background-color: <<colour primary>>; font-weight: normal;} -.cm-s-tiddlywiki .CodeMirror-widget { - text-shadow: none; -} +.cm-s-tiddlywiki .CodeMirror-widget { text-shadow: none; } +.cm-s-tiddlywiki .CodeMirror-dialog { background: <<colour tiddler-background>>; } .cm-s-tiddlywiki .cm-header { color: #586e75; } .cm-s-tiddlywiki .cm-quote { color: #93a1a1; } .cm-s-tiddlywiki .cm-keyword { color: #cb4b16; } @@ -84,23 +83,12 @@ name: tiddlywiki .cm-s-tiddlywiki .CodeMirror-nonmatchingbracket { color: #dc322f; } .cm-s-tiddlywiki .cm-tag { color: #93a1a1; } .cm-s-tiddlywiki .cm-attribute { color: #2aa198; } -.cm-s-tiddlywiki .cm-hr { - color: transparent; - border-top: 1px solid #586e75; - display: block; -} +.cm-s-tiddlywiki .cm-hr { color: transparent; border-top: 1px solid #586e75; display: block; } .cm-s-tiddlywiki .cm-link { color: #93a1a1; cursor: pointer; } .cm-s-tiddlywiki .cm-special { color: #6c71c4; } -.cm-s-tiddlywiki .cm-em { - color: #999; - text-decoration: underline; - text-decoration-style: dotted; -} +.cm-s-tiddlywiki .cm-em { color: #999; text-decoration: underline; text-decoration-style: dotted; } .cm-s-tiddlywiki .cm-error, -.cm-s-tiddlywiki .cm-invalidchar { - color: #586e75; - border-bottom: 1px dotted #dc322f; -} +.cm-s-tiddlywiki .cm-invalidchar { color: #586e75; border-bottom: 1px dotted #dc322f; } .cm-s-tiddlywiki .CodeMirror-matchingbracket { color: #859900; } .cm-s-tiddlywiki .CodeMirror-nonmatchingbracket { color: #dc322f; } .cm-s-tiddlywiki .cm-searching { background: rgba(243, 155, 53, .3); outline: 1px solid #F39B35; } From c3e34b469c47682cc84e0f0e2688430a48e15656 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Sun, 6 Dec 2020 14:59:48 -0800 Subject: [PATCH 1108/2376] typo (#5221) --- core/modules/utils/filesystem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 370a1eaf5..eb1050f90 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -217,7 +217,7 @@ Options include: */ exports.generateTiddlerFileInfo = function(tiddler,options) { var fileInfo = {}, metaExt; - // Propigate the isEditableFile flag + // Propagate the isEditableFile flag if(options.fileInfo) { fileInfo.isEditableFile = options.fileInfo.isEditableFile || false; } From 5df0225356ee734e5e847a86e186ecb203cd807f Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 7 Dec 2020 11:22:02 +0100 Subject: [PATCH 1109/2376] Update Customising search results.tid (#5225) --- .../customising/Customising search results.tid | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/editions/tw5.com/tiddlers/customising/Customising search results.tid b/editions/tw5.com/tiddlers/customising/Customising search results.tid index b08500421..a1a64bae4 100644 --- a/editions/tw5.com/tiddlers/customising/Customising search results.tid +++ b/editions/tw5.com/tiddlers/customising/Customising search results.tid @@ -29,3 +29,21 @@ Here is an example of an alternative visualisation that displays results in reve <<searchResults>> ``` +<<.from-version 5.1.23>> The sidebar search introduces a more sophisticated search-mechanism which makes it possible to navigate the search results using the keyboard shortcuts <kbd><<displayshortcuts ((input-down))>></kbd> and <kbd><<displayshortcuts ((input-up))>></kbd>. To add that mechanism to your own custom search results follow these simple steps: + +# Your tiddler tagged <<tag-pill "$:/tags/SearchResults">>is accessible through the <<.var configTiddler>> variable +# The user-input in the search field is accessible through the <<.var userInput>> variable +# Use the fields <<.field first-search-filter>> and <<.field second-search-filter>> to store the filters used for your search results. See the tiddler $:/core/ui/DefaultSearchResultList for details +# Use the following form so that navigated search-results are highlighted, modify it to match your needs: + +``` +<$list filter="[<userInput>minlength[1]]" variable="ignore"> +<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}> +<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}> +<$transclude tiddler="$:/core/ui/ListItemTemplate"/> +</span> +</$list> +</$list> +``` + +<$macrocall $name=".tip" _="Note that the <<.var searchTiddler>> variable still contains the name of the tiddler that is used for sorting the search results. The <<.var editTiddler>> variable contains the name of the tiddler that is being edited."/> From 90f05295a2c1db74665796926d8d3f21e968ffa1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 7 Dec 2020 15:43:44 +0100 Subject: [PATCH 1110/2376] Add missing config options to ControlPanel->Settings->CodeMirror (#5229) * Create cursorBlinkRate.tid * Update config-language.multids * Create indentUnit.tid * Create indentWithTabs.tid * Create smartIndent.tid * Create tabSize.tid --- plugins/tiddlywiki/codemirror/config-language.multids | 9 ++++++++- .../tiddlywiki/codemirror/settings/cursorBlinkRate.tid | 7 +++++++ plugins/tiddlywiki/codemirror/settings/indentUnit.tid | 7 +++++++ .../tiddlywiki/codemirror/settings/indentWithTabs.tid | 8 ++++++++ plugins/tiddlywiki/codemirror/settings/smartIndent.tid | 8 ++++++++ plugins/tiddlywiki/codemirror/settings/tabSize.tid | 7 +++++++ 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 plugins/tiddlywiki/codemirror/settings/cursorBlinkRate.tid create mode 100644 plugins/tiddlywiki/codemirror/settings/indentUnit.tid create mode 100644 plugins/tiddlywiki/codemirror/settings/indentWithTabs.tid create mode 100644 plugins/tiddlywiki/codemirror/settings/smartIndent.tid create mode 100644 plugins/tiddlywiki/codemirror/settings/tabSize.tid diff --git a/plugins/tiddlywiki/codemirror/config-language.multids b/plugins/tiddlywiki/codemirror/config-language.multids index 13cd693d9..05a5e6854 100644 --- a/plugins/tiddlywiki/codemirror/config-language.multids +++ b/plugins/tiddlywiki/codemirror/config-language.multids @@ -4,10 +4,14 @@ homeUrl: http://codemirror.net addOnUrl: http://codemirror.net/doc/manual.html#addons configUrl: http://codemirror.net/doc/manual.html#config controlPanel/hint: These settings let you customise the behaviour of [[CodeMirror|$:/plugins/tiddlywiki/codemirror]]. +controlPanel/keyboard: Keyboard shortcuts controlPanel/usage: Usage information +cursorBlinkRate/hint: Cursor blink rate editorFont/hint: Editor font family editorFont/info: Set the font family for the ~CodeMirror text-editor -controlPanel/keyboard: Keyboard shortcuts +indentUnit/hint: How many spaces a block should be indented +indentWithTabs/hint: Enable indenting with tabs +indentWithTabs/info: Whether, when indenting, the first N*`tabSize` spaces should be replaced by N tabs. keyMap/hint: ~CodeMirror keymap keyMap/info: ~The Keyboard KeyMap used within the ~CodeMirror text-editor lineNumbers/hint: Enable line numbers @@ -16,7 +20,10 @@ lineWrapping/hint: Enable line wrapping lineWrapping/info: Whether CodeMirror should scroll or wrap for long lines. Defaults to `false` (scroll). showCursorWhenSelecting/hint: Show cursor, when selecting showCursorWhenSelecting/info: Whether the cursor should be drawn when a selection is active. +smartIndent/hint: Enable smart indent +smartIndent/info: Whether to use the context-sensitive indentation that the mode provides (or just indent the same as the line before). Defaults to `true`. styleActiveLine/hint: Highlight active line styleActiveLine/info: Whether or not to highlight the active text-editor line +tabSize/hint: Width of a tab character theme/hint: Select a theme theme/info: Choose between ~CodeMirror themes diff --git a/plugins/tiddlywiki/codemirror/settings/cursorBlinkRate.tid b/plugins/tiddlywiki/codemirror/settings/cursorBlinkRate.tid new file mode 100644 index 000000000..ba540ea4c --- /dev/null +++ b/plugins/tiddlywiki/codemirror/settings/cursorBlinkRate.tid @@ -0,0 +1,7 @@ +title: $:/core/ui/ControlPanel/Settings/codemirror/cursorBlinkRate +tags: $:/tags/ControlPanel/Settings/CodeMirror +caption: {{$:/language/codemirror/cursorBlinkRate/hint}} + +\define lingo-base() $:/language/codemirror/cursorBlinkRate/ + +|<$link to="$:/config/codemirror/cursorBlinkRate"><<lingo hint>></$link> |<$edit-text tiddler="$:/config/codemirror/cursorBlinkRate" default="" placeholder="cursorBlinkRate" tag="input"/> | diff --git a/plugins/tiddlywiki/codemirror/settings/indentUnit.tid b/plugins/tiddlywiki/codemirror/settings/indentUnit.tid new file mode 100644 index 000000000..b463f3e78 --- /dev/null +++ b/plugins/tiddlywiki/codemirror/settings/indentUnit.tid @@ -0,0 +1,7 @@ +title: $:/core/ui/ControlPanel/Settings/codemirror/indentUnit +tags: $:/tags/ControlPanel/Settings/CodeMirror +caption: {{$:/language/codemirror/indentUnit/hint}} + +\define lingo-base() $:/language/codemirror/indentUnit/ + +|<$link to="$:/config/codemirror/indentUnit"><<lingo hint>></$link> |<$edit-text tiddler="$:/config/codemirror/indentUnit" default="" placeholder="indentUnit" tag="input"/> | diff --git a/plugins/tiddlywiki/codemirror/settings/indentWithTabs.tid b/plugins/tiddlywiki/codemirror/settings/indentWithTabs.tid new file mode 100644 index 000000000..16c5c9bb6 --- /dev/null +++ b/plugins/tiddlywiki/codemirror/settings/indentWithTabs.tid @@ -0,0 +1,8 @@ +title: $:/core/ui/ControlPanel/Settings/codemirror/indentWithTabs +tags: $:/tags/ControlPanel/Settings/CodeMirror +caption: {{$:/language/codemirror/indentWithTabs/hint}} + +\define lingo-base() $:/language/codemirror/indentWithTabs/ +<<lingo hint>> + +<$checkbox tiddler="$:/config/codemirror/indentWithTabs" field="text" checked="true" unchecked="false" default="true"> <$link to="$:/config/codemirror/indentWithTabs"><<lingo info>></$link> </$checkbox> diff --git a/plugins/tiddlywiki/codemirror/settings/smartIndent.tid b/plugins/tiddlywiki/codemirror/settings/smartIndent.tid new file mode 100644 index 000000000..3f59e38af --- /dev/null +++ b/plugins/tiddlywiki/codemirror/settings/smartIndent.tid @@ -0,0 +1,8 @@ +title: $:/core/ui/ControlPanel/Settings/codemirror/smartIndent +tags: $:/tags/ControlPanel/Settings/CodeMirror +caption: {{$:/language/codemirror/smartIndent/hint}} + +\define lingo-base() $:/language/codemirror/smartIndent/ +<<lingo hint>> + +<$checkbox tiddler="$:/config/codemirror/smartIndent" field="text" checked="true" unchecked="false" default="true"> <$link to="$:/config/codemirror/smartIndent"><<lingo info>></$link> </$checkbox> diff --git a/plugins/tiddlywiki/codemirror/settings/tabSize.tid b/plugins/tiddlywiki/codemirror/settings/tabSize.tid new file mode 100644 index 000000000..1ca932b19 --- /dev/null +++ b/plugins/tiddlywiki/codemirror/settings/tabSize.tid @@ -0,0 +1,7 @@ +title: $:/core/ui/ControlPanel/Settings/codemirror/tabSize +tags: $:/tags/ControlPanel/Settings/CodeMirror +caption: {{$:/language/codemirror/tabSize/hint}} + +\define lingo-base() $:/language/codemirror/tabSize/ + +|<$link to="$:/config/codemirror/tabSize"><<lingo hint>></$link> |<$edit-text tiddler="$:/config/codemirror/tabSize" default="" placeholder="tabSize" tag="input"/> | From 2c76cfa67a65e062713618fb059baaaa2f58a980 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 7 Dec 2020 15:44:07 +0100 Subject: [PATCH 1111/2376] Use displayshortcuts macro for keyboard_driven_input_macro tiddler (#5226) * Update keyboard-driven-input_Macro.tid * Update keyboard-driven-input_Macro.tid --- .../tiddlers/macros/keyboard-driven-input_Macro.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid index 849aa74bc..720e612d1 100644 --- a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid +++ b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid @@ -1,7 +1,7 @@ title: keyboard-driven-input Macro tags: Macros [[Core Macros]] -The <<.def keyboard-driven-input>> [[macro|Macros]] generates an input field or textarea that lets you cycle through a given list of entries with the <kbd>up</kbd> and <kbd>down</kbd> arrow keys. Doing so, an entry gets selected and can be processed with further actions +The <<.def keyboard-driven-input>> [[macro|Macros]] generates an input field or textarea that lets you cycle through a given list of entries with the <kbd><<displayshortcuts ((input-up))>></kbd> and <kbd><<displayshortcuts ((input-down))>></kbd> keys. Doing so, an entry gets selected and can be processed with further actions !! Parameters @@ -12,9 +12,9 @@ The additional parameters are: |parameter |purpose |h |storeTitle |the title of the tiddler that stores the user input | |selectionStateTitle |the title of the tiddler that stores the selected entry with a -primaryList or -secondaryList suffix to make it unique | -|inputAcceptActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept}}</kbd> | -|inputAcceptVariantActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-accept-variant}}</kbd> | -|inputCancelActions |the actions that get processed when the user hits <kbd>{{$:/config/shortcuts/input-cancel}}</kbd> | +|inputAcceptActions |the actions that get processed when the user hits <kbd><<displayshortcuts ((input-accept))>></kbd> | +|inputAcceptVariantActions |the actions that get processed when the user hits <kbd><<displayshortcuts ((input-accept-variant))>></kbd> | +|inputCancelActions |the actions that get processed when the user hits <kbd><<displayshortcuts ((input-cancel))>></kbd> | |configTiddlerFilter |a ''filter'' that specifies the tiddler that stores the first item-filter in its <<.field first-search-filter>> field and the second item-filter in its <<.field second-search-filter>> field | |firstSearchFilterField |the field of the configTiddler where the first search-filter is stored. Defaults to <<.field first-search-filter>> | |secondSearchFilterField |the field of the configTiddler where the second search-filter is stored. Defaults to <<.field second-search-filter>> | From ce5d20b8fc72056a4c18b09a1135a5634e63888c Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Mon, 7 Dec 2020 16:53:49 +0100 Subject: [PATCH 1112/2376] Logging widgets :Fixed issue on Firefox where logging does not work (#5223) * Fixed issue on Firefox where logging does not work properly due to column names * Remove second argument to utils.logTable --- core/modules/utils/utils.js | 4 ++-- core/modules/widgets/action-log.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 14d251f01..4c9c3e96d 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -56,9 +56,9 @@ exports.warning = function(text) { /* Log a table of name: value pairs */ -exports.logTable = function(data,columnNames) { +exports.logTable = function(data) { if(console.table) { - console.table(data,columnNames); + console.table(data); } else { $tw.utils.each(data,function(value,name) { console.log(name + ": " + value); diff --git a/core/modules/widgets/action-log.js b/core/modules/widgets/action-log.js index 216eb1167..eacef94bc 100644 --- a/core/modules/widgets/action-log.js +++ b/core/modules/widgets/action-log.js @@ -78,11 +78,11 @@ LogWidget.prototype.log = function() { console.group(this.message); if(dataCount > 0) { - $tw.utils.logTable(data,["name","value"]); + $tw.utils.logTable(data); } if(this.logAll || !dataCount) { console.groupCollapsed("All variables"); - $tw.utils.logTable(allVars,["name","value"]); + $tw.utils.logTable(allVars); console.groupEnd(); } console.groupEnd(); From 85ff47366c5d00836404ccfefc6bdf48cf50009a Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Mon, 7 Dec 2020 07:58:28 -0800 Subject: [PATCH 1113/2376] fix viewtemplate quirks (#5224) --- core/ui/TiddlerInfo/Advanced.tid | 2 +- core/ui/ViewTemplate/plugin.tid | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/ui/TiddlerInfo/Advanced.tid b/core/ui/TiddlerInfo/Advanced.tid index d14144558..2742a8398 100644 --- a/core/ui/TiddlerInfo/Advanced.tid +++ b/core/ui/TiddlerInfo/Advanced.tid @@ -3,6 +3,6 @@ tags: $:/tags/TiddlerInfo caption: {{$:/language/TiddlerInfo/Advanced/Caption}} <$list filter="[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]" variable="listItem"> -<$transclude tiddler=<<listItem>>/> +<$transclude tiddler=<<listItem>> mode="block"/> </$list> diff --git a/core/ui/ViewTemplate/plugin.tid b/core/ui/ViewTemplate/plugin.tid index 07bb3b618..564b209b3 100644 --- a/core/ui/ViewTemplate/plugin.tid +++ b/core/ui/ViewTemplate/plugin.tid @@ -1,6 +1,8 @@ title: $:/core/ui/ViewTemplate/plugin tags: $:/tags/ViewTemplate +<$reveal tag="div" class="tc-tiddler-plugin-info" type="nomatch" stateTitle=<<folded-state>> text="hide" retain="yes" animate="yes"> + <$list filter="[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]"> <$set name="plugin-type" value={{!!plugin-type}}> <$set name="default-popup-state" value="yes"> @@ -10,3 +12,4 @@ tags: $:/tags/ViewTemplate </$set> </$set> </$list> +</$reveal> \ No newline at end of file From a878d82c7a943695bed8dd2ed9df3b73b5ee3497 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Mon, 7 Dec 2020 07:59:32 -0800 Subject: [PATCH 1114/2376] Ignore edition filters if not running on node (#5222) --- core/modules/filters/editiondescription.js | 18 ++++++++++-------- core/modules/filters/editions.js | 16 +++++++++------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/core/modules/filters/editiondescription.js b/core/modules/filters/editiondescription.js index bca03e9bc..ee3acd898 100644 --- a/core/modules/filters/editiondescription.js +++ b/core/modules/filters/editiondescription.js @@ -16,14 +16,16 @@ Filter operator for returning the descriptions of the specified edition names Export our filter function */ exports.editiondescription = function(source,operator,options) { - var results = [], - editionInfo = $tw.utils.getEditionInfo(); - if(editionInfo) { - source(function(tiddler,title) { - if($tw.utils.hop(editionInfo,title)) { - results.push(editionInfo[title].description || ""); - } - }); + var results = []; + if($tw.node) { + var editionInfo = $tw.utils.getEditionInfo(); + if(editionInfo) { + source(function(tiddler,title) { + if($tw.utils.hop(editionInfo,title)) { + results.push(editionInfo[title].description || ""); + } + }); + } } return results; }; diff --git a/core/modules/filters/editions.js b/core/modules/filters/editions.js index 36f1dc8fd..05ae57c31 100644 --- a/core/modules/filters/editions.js +++ b/core/modules/filters/editions.js @@ -16,14 +16,16 @@ Filter operator for returning the names of the available editions in this wiki Export our filter function */ exports.editions = function(source,operator,options) { - var results = [], - editionInfo = $tw.utils.getEditionInfo(); - if(editionInfo) { - $tw.utils.each(editionInfo,function(info,name) { - results.push(name); - }); + var results = []; + if($tw.node) { + var editionInfo = $tw.utils.getEditionInfo(); + if(editionInfo) { + $tw.utils.each(editionInfo,function(info,name) { + results.push(name); + }); + } + results.sort(); } - results.sort(); return results; }; From bb6d41f3dd20fca01621479e6f80844b3edc9820 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 7 Dec 2020 16:05:34 +0000 Subject: [PATCH 1115/2376] Macrocall widget: ensure we separately cache inline vs block parse trees Fixes a bug in #5205 --- core/modules/widgets/macrocall.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/modules/widgets/macrocall.js b/core/modules/widgets/macrocall.js index adf1f908c..2381d0360 100644 --- a/core/modules/widgets/macrocall.js +++ b/core/modules/widgets/macrocall.js @@ -56,14 +56,15 @@ MacroCallWidget.prototype.execute = function() { if(this.renderOutput === "text/html") { // If so we'll return the parsed macro // Check if we've already cached parsing this macro - var parser; - if(variableInfo.srcVariable && variableInfo.srcVariable.parser) { - parser = variableInfo.srcVariable.parser; + var mode = this.parseTreeNode.isBlock ? "blockParser" : "inlineParser", + parser; + if(variableInfo.srcVariable && variableInfo.srcVariable[mode]) { + parser = variableInfo.srcVariable[mode]; } else { parser = this.wiki.parseText(this.parseType,text, {parseAsInline: !this.parseTreeNode.isBlock}); if(variableInfo.isCacheable && variableInfo.srcVariable) { - variableInfo.srcVariable.parser = parser; + variableInfo.srcVariable[mode] = parser; } } var parseTreeNodes = parser ? parser.tree : []; From 4334de88a011cd8bef2292258f038a47429f7a12 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Mon, 7 Dec 2020 18:29:42 +0100 Subject: [PATCH 1116/2376] Make search-matches button discoverable on dark palettes (#5232) --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 2010b45e6..2f60c4537 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -598,6 +598,10 @@ html body.tc-body .tc-btn-rounded:hover svg { color: <<colour sidebar-muted-foreground-hover>>; } +.tc-sidebar-lists button small { + color: <<colour foreground>>; +} + button svg.tc-image-button, button .tc-image-button img { height: 1em; width: 1em; From 1d7091e637462dcda8c28d660ca42c073f647043 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 8 Dec 2020 17:48:58 +0000 Subject: [PATCH 1117/2376] Hide .tid exporter when more than one tiddler to export Fixes #5237 --- core/templates/exporters/TidFile.tid | 1 + core/wiki/macros/export.tid | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/core/templates/exporters/TidFile.tid b/core/templates/exporters/TidFile.tid index 1e964818d..1dbd3503b 100644 --- a/core/templates/exporters/TidFile.tid +++ b/core/templates/exporters/TidFile.tid @@ -2,6 +2,7 @@ title: $:/core/templates/exporters/TidFile tags: $:/tags/Exporter description: {{$:/language/Exporters/TidFile}} extension: .tid +condition: [<count>compare:lte[1]] \define renderContent() {{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}} diff --git a/core/wiki/macros/export.tid b/core/wiki/macros/export.tid index c55df3ecb..629333ff8 100644 --- a/core/wiki/macros/export.tid +++ b/core/wiki/macros/export.tid @@ -15,7 +15,9 @@ $baseFilename$$(extension)$ </$list> </$button></span><$reveal state=<<qualify "$:/state/popup/export">> type="popup" position="below" animate="yes"> <div class="tc-drop-down"> +<$set name="count" value={{{ [subfilter<__exportFilter__>count[]] }}}> <$list filter="[all[shadows+tiddlers]tag[$:/tags/Exporter]]"> +<$list filter="[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]" variable="ignore"> <$set name="extension" value={{!!extension}}> <$button class="tc-btn-invisible"> <$action-sendmessage $message="tm-download-file" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename """$baseFilename$""">>/> @@ -24,6 +26,8 @@ $baseFilename$$(extension)$ </$button> </$set> </$list> +</$list> +</$set> </div> </$reveal> \end From 1e1aeefd935a1013245ea71d12be635f0847558a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 9 Dec 2020 09:07:48 +0000 Subject: [PATCH 1118/2376] Fix add plugins modal Fixes #5235 --- core/ui/ControlPanel/Modals/AddPlugins.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index 063ca02ad..a7fbec1dd 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -148,7 +148,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <$set name="transclusion" value=<<connectionTiddler>>> -<$macrocall $name="tabs" tabsList="[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]" default="$:/core/ui/ControlPanel/Plugins/Add/Plugins" explicitState="$:/state/addplugins/tab-1342078386"/> +<<tabs "[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]" "$:/core/ui/ControlPanel/Plugins/Add/Plugins">> </$set> From cd5d9bd5b90d8a9aa563362b0ed78906debf45b3 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Wed, 9 Dec 2020 04:46:35 -0500 Subject: [PATCH 1119/2376] Code cleanup of Linked Lists (#5241) * made private methods limited to module scope * moved private methods to file bottom * changed tests to run comperable array functions in parallel * added comments --- core/modules/utils/linked-list.js | 56 ++++----- .../test/tiddlers/tests/test-linked-list.js | 118 +++++++++++------- 2 files changed, 99 insertions(+), 75 deletions(-) diff --git a/core/modules/utils/linked-list.js b/core/modules/utils/linked-list.js index 50421ab56..b25f0b8fd 100644 --- a/core/modules/utils/linked-list.js +++ b/core/modules/utils/linked-list.js @@ -24,40 +24,19 @@ LinkedList.prototype.clear = function() { LinkedList.prototype.remove = function(value) { if($tw.utils.isArray(value)) { for(var t=0; t<value.length; t++) { - this._removeOne(value[t]); + _removeOne(this,value[t]); } } else { - this._removeOne(value); + _removeOne(this,value); } }; -LinkedList.prototype._removeOne = function(value) { - var node = this.index[value]; - if(node) { - node.prev.next = node.next; - node.next.prev = node.prev; - this.length -= 1; - // Point index to the next instance of the same value, maybe nothing. - this.index[value] = node.copy; - } - return node; -}; - -LinkedList.prototype._linkToEnd = function(node) { - // Sticks the given node onto the end of the list. - this.prev.next = node; - node.prev = this.prev; - this.prev = node; - node.next = this; - this.length += 1; -}; - LinkedList.prototype.push = function(/* values */) { for(var i = 0; i < arguments.length; i++) { var value = arguments[i]; var node = {value: value}; var preexistingNode = this.index[value]; - this._linkToEnd(node); + _linkToEnd(this,node); if(preexistingNode) { // We want to keep pointing to the first instance, but we want // to have that instance (or chain of instances) point to the @@ -75,11 +54,11 @@ LinkedList.prototype.push = function(/* values */) { LinkedList.prototype.pushTop = function(value) { if($tw.utils.isArray(value)) { for(var t=0; t<value.length; t++) { - this._removeOne(value[t]); + _removeOne(this,value[t]); } - this.push.apply(this, value); + this.push.apply(this,value); } else { - var node = this._removeOne(value); + var node = _removeOne(this,value); if(!node) { node = {value: value}; this.index[value] = node; @@ -95,7 +74,7 @@ LinkedList.prototype.pushTop = function(value) { this.index[value] = node.copy; node.copy = undefined; } - this._linkToEnd(node); + _linkToEnd(this,node); } }; @@ -113,6 +92,27 @@ LinkedList.prototype.toArray = function() { return output; }; +function _removeOne(list,value) { + var node = list.index[value]; + if(node) { + node.prev.next = node.next; + node.next.prev = node.prev; + list.length -= 1; + // Point index to the next instance of the same value, maybe nothing. + list.index[value] = node.copy; + } + return node; +}; + +function _linkToEnd(list,node) { + // Sticks the given node onto the end of the list. + list.prev.next = node; + node.prev = list.prev; + list.prev = node; + node.next = list; + list.length += 1; +}; + exports.LinkedList = LinkedList; })(); diff --git a/editions/test/tiddlers/tests/test-linked-list.js b/editions/test/tiddlers/tests/test-linked-list.js index c66a1fc3b..0cef342d0 100644 --- a/editions/test/tiddlers/tests/test-linked-list.js +++ b/editions/test/tiddlers/tests/test-linked-list.js @@ -8,6 +8,10 @@ Tests the utils.LinkedList class. LinkedList was built to behave exactly as $tw.utils.pushTop and Array.prototype.push would behave with an array. +Many of these tests function by performing operations on a LinkedList while +performing the equivalent actions on an array with the old utility methods. +Then we confirm that the two come out functionally identical. + \*/ (function(){ @@ -17,66 +21,88 @@ Array.prototype.push would behave with an array. describe("LinkedList class tests", function() { + // pushTops a value or array of values into both the array and linked list. + function pushTop(array, linkedList, valueOrValues) { + $tw.utils.pushTop(array, valueOrValues); + linkedList.pushTop(valueOrValues); + }; + + // pushes values into both the array and the linked list. + function push(array, linkedList/*, other values */) { + var values = Array.prototype.slice(arguments, 2); + array.push.apply(array, values); + linkedList.push.apply(linkedList, values); + }; + + // operates a remove action on an array and a linked list in parallel. + function remove(array, linkedList, valueOrValues) { + $tw.utils.removeArrayEntries(array, valueOrValues); + linkedList.remove(valueOrValues); + }; + + // compares an array and a linked list to make sure they match up + function compare(array, linkedList) { + expect(linkedList.toArray()).toEqual(array); + expect(linkedList.length).toBe(array.length); + }; + it("can pushTop", function() { + var array = []; var list = new $tw.utils.LinkedList(); - list.push('A', 'B', 'C'); + push(array, list, 'A', 'B', 'C'); // singles - list.pushTop('X'); - list.pushTop('B'); - expect(list.toArray()).toEqual(['A', 'C', 'X', 'B']); - expect(list.length).toBe(4); + pushTop(array, list, 'X'); + pushTop(array, list, 'B'); + compare(array, list); // A C X B //arrays - list.pushTop(['X', 'A', 'G', 'A']); + pushTop(array, list, ['X', 'A', 'G', 'A']); // If the pushedTopped list has duplicates, they go in unempeded. - expect(list.toArray()).toEqual(['C', 'B', 'X', 'A', 'G', 'A']); - expect(list.length).toBe(6); + compare(array, list); // C B X A G A }); it("can pushTop with tricky duplicates", function() { + var array = []; var list = new $tw.utils.LinkedList(); - list.push('A', 'B', 'A', 'C', 'A', 'end'); + push(array, list, 'A', 'B', 'A', 'C', 'A', 'end'); // If the original list contains duplicates, only one instance is cut - list.pushTop('A'); - expect(list.toArray()).toEqual(['B', 'A', 'C', 'A', 'end', 'A']); - expect(list.length).toBe(6); + pushTop(array, list, 'A'); + compare(array, list); // B A C A end A // And the Llist properly knows the next 'A' to cut if pushed again - list.pushTop(['X', 'A']); - expect(list.toArray()).toEqual(['B', 'C', 'A', 'end', 'A', 'X', 'A']); - expect(list.length).toBe(7); + pushTop(array, list, ['X', 'A']); + compare(array, list); // B C A end A X A // One last time, to make sure we maintain the linked chain of copies - list.pushTop('A'); - expect(list.toArray()).toEqual(['B', 'C', 'end', 'A', 'X', 'A', 'A']); - expect(list.length).toBe(7); + pushTop(array, list, 'A'); + compare(array, list); // B C end A X A A }); it("can handle particularly nasty pushTop pitfall", function() { + var array = []; var list = new $tw.utils.LinkedList(); - list.push('A', 'B', 'A', 'C'); - list.pushTop('A'); // BACA - list.pushTop('X'); // BACAX - list.remove('A'); // BCAX - list.pushTop('A'); // BCXA - list.remove('A'); // BCX + push(array, list, 'A', 'B', 'A', 'C'); + pushTop(array, list, 'A'); // BACA + pushTop(array, list, 'X'); // BACAX + remove(array, list, 'A'); // BCAX + pushTop(array, list, 'A'); // BCXA + remove(array, list, 'A'); // BCX + // But! The way I initially coded the copy chains, a mystery A could // hang around. - expect(list.toArray()).toEqual(['B', 'C', 'X']); - expect(list.length).toBe(3); + compare(array, list); // B C X }); it("can push", function() { + var array = []; var list = new $tw.utils.LinkedList(); - list.push('A', 'B', 'C'); + push(array, list, 'A', 'B', 'C'); // singles - list.push('B'); - expect(list.toArray()).toEqual(['A', 'B', 'C', 'B']); - expect(list.length).toBe(4); + push(array, list, 'B'); + compare(array, list); // A B C B // multiple args - list.push('A', 'B', 'C'); - expect(list.toArray()).toEqual(['A', 'B', 'C', 'B', 'A', 'B', 'C']); - expect(list.length).toBe(7); + push(array, list, 'A', 'B', 'C'); + compare(array, list); // A B C B A B C }); it("can clear", function() { @@ -88,31 +114,29 @@ describe("LinkedList class tests", function() { }); it("can remove", function() { + var array = []; var list = new $tw.utils.LinkedList(); - list.push('A', 'x', 'C', 'x', 'D', 'x', 'E', 'x'); + push(array, list, 'A', 'x', 'C', 'x', 'D', 'x', 'E', 'x'); // single - list.remove('x'); - expect(list.toArray()).toEqual(['A', 'C', 'x', 'D', 'x', 'E', 'x']); - expect(list.length).toBe(7); + remove(array, list, 'x'); + compare(array, list); // A C x D x E x // arrays - list.remove(['x', 'A', 'x']); - expect(list.toArray()).toEqual(['C', 'D', 'E', 'x']); - expect(list.length).toBe(4); + remove(array, list, ['x', 'A', 'x']); + compare(array, list); // C D E x }); it('can ignore removal of nonexistent items', function() { + var array = []; var list = new $tw.utils.LinkedList(); - list.push('A', 'B', 'C', 'D'); + push(array, list, 'A', 'B', 'C', 'D'); // single - list.remove('Z'); - expect(list.toArray()).toEqual(['A', 'B', 'C', 'D']); - expect(list.length).toBe(4); + remove(array, list, 'Z'); + compare(array, list); // A B C D // array - list.remove(['Z', 'B', 'X']); - expect(list.toArray()).toEqual(['A', 'C', 'D']); - expect(list.length).toBe(3); + remove(array, list, ['Z', 'B', 'X']); + compare(array, list); // A C D }); it('can iterate with each', function() { From da5d12d6fb09254396909aafc427aed5d2e1c66b Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Wed, 9 Dec 2020 12:11:14 +0100 Subject: [PATCH 1120/2376] Docs for :reduce filter run prefix (#5238) --- editions/tw5.com/tiddlers/filters/reduce.tid | 17 ++++++++++++++- .../filters/syntax/Filter Expression.tid | 8 +++++-- .../syntax/Filter Run Prefix (Examples).tid | 21 ++++++++++++++++++- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/filters/reduce.tid b/editions/tw5.com/tiddlers/filters/reduce.tid index debd28c9f..153fe463c 100644 --- a/editions/tw5.com/tiddlers/filters/reduce.tid +++ b/editions/tw5.com/tiddlers/filters/reduce.tid @@ -1,6 +1,6 @@ caption: reduce created: 20201004154131193 -modified: 20201204130601564 +modified: 20201208185109549 op-input: a [[selection of titles|Title Selection]] passed as input to the filter op-output: the final result of running the subfilter <<.place S>> op-parameter: a [[filter expression|Filter Expression]]. Optional second parameter for initial value for accumulator @@ -28,4 +28,19 @@ The following variables are available within the subfilter: <$macrocall $name=".tip" _=<<reduce-tip>> /> + +<<.tip "Compare with the analagous named filter run prefix `:reduce`">> + +``` +\define num-items() [get[quantity]add<accumulator>] + +[tag[shopping]reduce<num-items>] +``` + +is equivalent to: + +``` +[tag[shopping]] :reduce[get[quantity]add<accumulator>] +``` + <<.operator-examples "reduce">> diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index fb2a1704e..0b3835373 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20201102224444831 +modified: 20201208185257875 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -24,9 +24,13 @@ If a run has: * named prefixes for filter runs are available. <<.from-version "5.1.23">> * named prefix `:filter`, it receives the filter output so far as its input. The next run is evaluated for each title of the input, removing every input title for which the output is an empty list. <<.from-version "5.1.23">> * named prefix `:intersection` replaces all filter output so far with titles that are present in the output of this run, as well as the output from previous runs. Forms the input for the next run. <<.from-version "5.1.23">> +* named prefix `:reduce` replaces all filter output so far with a single item by repeatedly applying a formula to each input title. A typical use is to add up the values in a given field of each input title. <<.from-version "5.1.23">> +** [[Examples|Filter Run Prefix (Examples)]] <<.tip "Compare named filter run prefix `:filter` with [[filter Operator]] which applies a subfilter to every input title, removing the titles that return an empty result from the subfilter">> +<<.tip "Compare named filter run prefix `:reduce` with [[reduce Operator]] which is used to used to flatten a list of items down to a single item by repeatedly applying a subfilter.">> + In technical / logical terms: |!Run |!Equivalent named prefix |!Interpretation |!Output | @@ -43,7 +47,7 @@ The input of a run is normally a list of all the non-[[shadow|ShadowTiddlers]] t |Prefix|Input|h |`-`, `~`, `=`, `:intersection` or none| <$link to="all Operator">`[all[]]`</$link> tiddler titles, unless otherwise determined by the first [[filter operator|Filter Operators]]| -|`+`, `:filter`|the filter output of all previous runs so far| +|`+`, `:filter`, `:reduce`|the filter output of all previous runs so far| Precisely because of varying inputs, be aware that both prefixes `-` and `+` do not behave inverse to one another! diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid index eb88c339b..f40cc7356 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid @@ -1,7 +1,8 @@ created: 20201117073343969 -modified: 20201117074106350 +modified: 20201208185546667 tags: [[Filter Syntax]] title: Filter Run Prefix (Examples) +type: text/vnd.tiddlywiki !! Difference between `+` and `:intersection` @@ -23,3 +24,21 @@ The following examples use the [[field Operator]] and [[compare Operator]] tiddl <<.operator-example 3 "[[field Operator]tags[]] +[[compare Operator]tags[]]" """The "field Operator" tiddler's tags are lost, so only the "compare Operator" tiddler's tags are returned""">> <<.operator-example 4 "[[field Operator]tags[]] :intersection[[compare Operator]tags[]]" """Returns the tags that both tiddlers have in common""">> + +!! `:reduce` examples + +``` +[tag[shopping]] :reduce[get[quantity]add<accumulator>] +``` + +is equivalent to: + +``` +\define num-items() [get[quantity]add<accumulator>] + +[tag[shopping]reduce<num-items>] +``` + +Specifying a default value: + +`[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]` From 3016b3d0948c3d3c3aba18af34fddd244c303e19 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Wed, 9 Dec 2020 12:12:57 +0100 Subject: [PATCH 1121/2376] Docs update for Set Widget (#5239) * Update docs for Set Widget This updates the docs for Set Widget to add a tip regarding a common source of misunderstanding for users, i.e. using Filtered List Variable Assignment and being confused as to why the value of the variable is in double square brackets. * Corrected typos --- editions/tw5.com/tiddlers/widgets/SetWidget.tid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editions/tw5.com/tiddlers/widgets/SetWidget.tid b/editions/tw5.com/tiddlers/widgets/SetWidget.tid index cc5f29167..d34fa1658 100644 --- a/editions/tw5.com/tiddlers/widgets/SetWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/SetWidget.tid @@ -24,6 +24,8 @@ The content of the `<$set>` widget is the scope for the value assigned to the va |select |<<.from-version "5.1.14">> An optional zero-based index of the item to return from the filter output (see below) | |emptyValue |The value to assign to the variable if the specified value is missing or empty (see below) | +<<.tip """If the value of your variable is enclosed in double square brackets this might indicate that you are returning a list of values from the filter. To use a single title from the filter output without the double square brackets see ''Filtered Item Variable Assignment'' below.""">> + !! Simple Variable Assignment The simplest way of using set variable widget assigns a string to a variable. The following example assigns a literal string From 50d8325d4c9f17892ec36e9fc818cfcb3655f150 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 9 Dec 2020 19:14:43 +0000 Subject: [PATCH 1122/2376] Dynannotate: Fix off-by-one error for end of annotation text --- plugins/tiddlywiki/dynannotate/modules/textmap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/dynannotate/modules/textmap.js b/plugins/tiddlywiki/dynannotate/modules/textmap.js index d1a3bdd27..9f9dbbbe3 100644 --- a/plugins/tiddlywiki/dynannotate/modules/textmap.js +++ b/plugins/tiddlywiki/dynannotate/modules/textmap.js @@ -78,7 +78,7 @@ exports.TextMap.prototype.findText = function(targetString,targetPrefix,targetSu if(startPos !== -1) { startPos += targetPrefix.length; var startMetadata = this.locateMetadata(startPos), - endMetadata = this.locateMetadata(startPos + targetString.length); + endMetadata = this.locateMetadata(startPos + targetString.length - 1); if(startMetadata && endMetadata) { return { startNode: startMetadata.domNode, From 1af1f6621a5a08b07f55a324981505be8c41f624 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 10 Dec 2020 18:09:03 +0100 Subject: [PATCH 1123/2376] cursor:pointer on input[type=file] doesn't work in webkit browsers... (#5244) --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 2f60c4537..32c7c3875 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2710,6 +2710,10 @@ body.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg display: inline-block; } +::-webkit-file-upload-button { + cursor:pointer; +} + /* ** Thumbnail macros */ From 0d2b6cf83793709a96a6ea348d63ffae8fcc97fc Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 10 Dec 2020 18:09:28 +0100 Subject: [PATCH 1124/2376] Rename control-panel-button to advanced-search-button in advanced-search button (#5242) --- core/ui/PageControls/advanced-search.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/ui/PageControls/advanced-search.tid b/core/ui/PageControls/advanced-search.tid index caeaaebb8..597395b5b 100644 --- a/core/ui/PageControls/advanced-search.tid +++ b/core/ui/PageControls/advanced-search.tid @@ -4,7 +4,7 @@ caption: {{$:/core/images/advanced-search-button}} {{$:/language/Buttons/Advance description: {{$:/language/Buttons/AdvancedSearch/Hint}} \whitespace trim -\define control-panel-button(class) +\define advanced-search-button(class) <$button to="$:/AdvancedSearch" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/advanced-search-button}} @@ -15,6 +15,6 @@ description: {{$:/language/Buttons/AdvancedSearch/Hint}} </$button> \end -<$list filter="[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]" emptyMessage=<<control-panel-button>>> -<<control-panel-button "tc-selected">> +<$list filter="[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]" emptyMessage=<<advanced-search-button>>> +<<advanced-search-button "tc-selected">> </$list> From e34a88e3e442b2a9dd992522816f94f88b078c47 Mon Sep 17 00:00:00 2001 From: Stefano Stoduto <2358361+OmbraDiFenice@users.noreply.github.com> Date: Thu, 10 Dec 2020 18:27:47 +0100 Subject: [PATCH 1125/2376] Signing the CLA (#4876) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index d83484a3a..c27b2bca6 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -412,4 +412,6 @@ Florian Kohrt, @fkohrt, 2020/09/10 Gerald Liu, @gera2ld, 2020/09/25 +Stefano Stoduto, @OmbraDiFenice, 2020/10/03 + Miha Lunar, @SmilyOrg, 2020/11/04 From 78c2beb640eb432c0f85d23f0745c1558da8e2f0 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 10 Dec 2020 18:33:42 +0100 Subject: [PATCH 1126/2376] Add fill: <<colour button-foreground>> to html button in vanilla/base (#5250) --- themes/tiddlywiki/vanilla/base.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 32c7c3875..2d5fc82a3 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -82,6 +82,7 @@ input[type="search"] { html button { line-height: 1.2; color: <<colour button-foreground>>; + fill: <<colour button-foreground>>; background: <<colour button-background>>; border-color: <<colour button-border>>; } From 6ca89304a18bf4a9c6674ceaf27836e40373469f Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 10 Dec 2020 13:25:53 -0500 Subject: [PATCH 1127/2376] Fix for LinkedLists when using bad filter prefix (#5251) --- core/modules/filters.js | 2 +- editions/test/tiddlers/tests/test-prefixes-filter.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index 4fec05964..2925c515e 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -297,7 +297,7 @@ exports.compileFilter = function(filterString) { return filterRunPrefixes[operation.namedPrefix](operationSubFunction, options); } else { return function(results,source,widget) { - results.splice(0,results.length); + results.clear(); results.push($tw.language.getString("Error/FilterRunPrefix")); }; } diff --git a/editions/test/tiddlers/tests/test-prefixes-filter.js b/editions/test/tiddlers/tests/test-prefixes-filter.js index 7c88aeaf2..e84e86cf4 100644 --- a/editions/test/tiddlers/tests/test-prefixes-filter.js +++ b/editions/test/tiddlers/tests/test-prefixes-filter.js @@ -12,6 +12,14 @@ Tests the reduce prefix and filter. /* global $tw, require */ "use strict"; +describe("general filter prefix tests", function() { + it("should handle nonexistent prefixes gracefully", function() { + var wiki = new $tw.Wiki(); + var results = wiki.filterTiddlers("[tag[A]] :nonexistent[tag[B]]"); + expect(results).toEqual(["Filter Error: Unknown prefix for filter run"]); + }); +}); + describe("'reduce' and 'intersection' filter prefix tests", function() { var wiki = new $tw.Wiki(); From f60d0ef10945c9a10cda02d70f612ffc61cb602f Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Fri, 11 Dec 2020 17:07:52 +0700 Subject: [PATCH 1128/2376] reduce and :reduce handle empty input identically (#5255) Fixes #5246. Now the reduce operator and :reduce filter run prefix will both return empty output when their input is empty, so that both can be chained together with the else operator or :else prefix. --- core/modules/filters/reduce.js | 6 ++- .../tiddlers/tests/test-prefixes-filter.js | 7 +++- .../examples/reduce Operator (Examples).tid | 37 ++++--------------- editions/tw5.com/tiddlers/filters/reduce.tid | 17 ++++++--- .../syntax/Filter Run Prefix (Examples).tid | 4 +- 5 files changed, 32 insertions(+), 39 deletions(-) diff --git a/core/modules/filters/reduce.js b/core/modules/filters/reduce.js index fd5ccf568..206936887 100644 --- a/core/modules/filters/reduce.js +++ b/core/modules/filters/reduce.js @@ -48,7 +48,11 @@ exports.reduce = function(source,operator,options) { accumulator = "" + list[0]; } } - return [accumulator]; + if(results.length > 0) { + return [accumulator]; + } else { + return []; + } }; })(); diff --git a/editions/test/tiddlers/tests/test-prefixes-filter.js b/editions/test/tiddlers/tests/test-prefixes-filter.js index e84e86cf4..62f51263f 100644 --- a/editions/test/tiddlers/tests/test-prefixes-filter.js +++ b/editions/test/tiddlers/tests/test-prefixes-filter.js @@ -77,6 +77,8 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { expect(wiki.filterTiddlers("[tag[shopping]] :reduce[get[quantity]add<accumulator>]").join(",")).toBe("22"); expect(wiki.filterTiddlers("[tag[shopping]] :reduce[get[price]multiply{!!quantity}add<accumulator>]").join(",")).toBe("27.75"); expect(wiki.filterTiddlers("[tag[shopping]] :reduce[<index>compare:number:gt[0]then<accumulator>addsuffix[, ]addsuffix<currentTiddler>else<currentTiddler>]").join(",")).toBe("Brownies, Chick Peas, Milk, Rice Pudding"); + // Empty input should become empty output + expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>]").length).toBe(0); expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0"); }); @@ -93,7 +95,10 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { expect(wiki.filterTiddlers("[tag[shopping]reduce<num-items>]",anchorWidget).join(",")).toBe("22"); expect(wiki.filterTiddlers("[tag[shopping]reduce<add-price>]",anchorWidget).join(",")).toBe("27.75"); expect(wiki.filterTiddlers("[tag[shopping]reduce<join-with-commas>]",anchorWidget).join(",")).toBe("Brownies, Chick Peas, Milk, Rice Pudding"); - expect(wiki.filterTiddlers("[tag[non-existent]reduce<add-price>,[0]]",anchorWidget).join(",")).toBe("0"); + // Empty input should become empty output + expect(wiki.filterTiddlers("[tag[non-existent]reduce<add-price>,[0]]",anchorWidget).join(",")).not.toBe("0"); + expect(wiki.filterTiddlers("[tag[non-existent]reduce<add-price>,[0]]",anchorWidget).length).toBe(0); + expect(wiki.filterTiddlers("[tag[non-existent]reduce<add-price>else[0]]",anchorWidget).join(",")).toBe("0"); }); it("should handle the :intersection prefix", function() { diff --git a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid index 1c619c506..94ad021fe 100644 --- a/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/reduce Operator (Examples).tid @@ -7,18 +7,17 @@ type: text/vnd.tiddlywiki \define add-price() [get[price]multiply{!!quantity}add<accumulator>] \define num-items() [get[quantity]add<accumulator>] \define join-with-commas() [<index>compare:number:gt[0]then<accumulator>addsuffix[, ]addsuffix<currentTiddler>else<currentTiddler>] +\define multiply-input() [multiply<accumulator>] \define display-variable(name) ''<$text text=<<__name__>>/>'': <code><$text text={{{ [<__name__>getvariable[]] }}}/></code> \end -\define reduce-tip() -Remember that <<.op reduce>> always produces output, so <<.op else>> will never trigger after <<.op reduce>>. -\end These examples use the following predefined variables: * <<display-variable add-price>> * <<display-variable num-items>> * <<display-variable join-with-commas>> +* <<display-variable multiply-input>> They also use the following data tiddlers: @@ -30,32 +29,10 @@ They also use the following data tiddlers: </$list> </ul> -Number of items: - <<.operator-example 1 "[tag[shopping]reduce<num-items>]">> - -Total price: - <<.operator-example 2 "[tag[shopping]reduce<add-price>]">> - -Using `<index>` to act differently on the first item than the rest: - -<<.operator-example 3 "[tag[shopping]reduce<join-with-commas>]">> - -Empty input, no second parameter: - -<<.operator-example 4 "[tag[non-existent]reduce<add-price>]">> - -Note how the output contains a single item with no text. This is not "empty output" for the purposes of the <<.op else>> operator. - -<$macrocall $name=".tip" _=<<reduce-tip>> /> - -Empty input, no second parameter, followed by <<.op else>>: - -<<.operator-example 5 "[tag[non-existent]reduce<add-price>else[0]]">> - -Note how the output still contains a single item with no text: <<.op else>> did not trigger. If you want the value to be 0 when <<.op reduce>> has no items to process, you need to specify 0 as the initial value by passing it as a second parameter to <<.op reduce>>. - -Empty input, second parameter provided: - -<<.operator-example 6 "[tag[non-existent]reduce<add-price>,[0]]">> +<<.operator-example 3 "[tag[shopping]reduce<join-with-commas>]" "Uses `<index>` to act differently on the first item than the rest">> +<<.operator-example 4 "[tag[non-existent]reduce<add-price>]" "Empty input produces empty output">> +<<.operator-example 5 "[tag[non-existent]reduce<add-price>else[0]]" "Use `else` to ensure output if input was empty">> +<<.operator-example 6 "=1 =2 =3 +[reduce<multiply-input>]" "Empty initial value is treated as 0 by mathematical operators">> +<<.operator-example 7 "=1 =2 =3 +[reduce<multiply-input>,[1]]" "Setting initial value is sometimes necessary for correct results">> diff --git a/editions/tw5.com/tiddlers/filters/reduce.tid b/editions/tw5.com/tiddlers/filters/reduce.tid index 153fe463c..d9893346c 100644 --- a/editions/tw5.com/tiddlers/filters/reduce.tid +++ b/editions/tw5.com/tiddlers/filters/reduce.tid @@ -10,10 +10,6 @@ tags: [[Filter Operators]] title: reduce Operator type: text/vnd.tiddlywiki -\define reduce-tip() -The <<.op reduce>> operator will always produce output, even if its input was empty. If its input is empty, the output of <<.op reduce>> will be the initial value of the accumulator, i.e. the value of the second parameter. One result of this fact is that the <<.op else>> operator will never be triggered if it follows a <<.op reduce>>. The "Empty input" examples show what happens when <<.op reduce>> receives no input. -\end - <<.from-version "5.1.23">> The <<.op reduce>> operator runs a subfilter for each input title, passing the result of the previous subfilter run as a variable. The initial value of the accumulator can optionally be specified. It returns the result of the final subfilter run. The <<.op reduce>> operator is used to flatten a list of items down to a single item by repeatedly applying a formula. A typical use is to add up the values in a given field of a list of tiddlers. @@ -26,10 +22,17 @@ The following variables are available within the subfilter: * ''revIndex'' - the reverse numeric index of the current list item (with zero being the last item in the list) * ''length'' - the total length of the input list -<$macrocall $name=".tip" _=<<reduce-tip>> /> +If the <<.op reduce>> operator receives no input, its output will be empty. The [[else Operator]] can be useful in such cases. +<<.tip "Literal filter operands cannot contain square brackets but you can work around the issue by using a variable:">> -<<.tip "Compare with the analagous named filter run prefix `:reduce`">> +``` +<$set name="sum-input" value="[add<accumulator>]"> +{{{ =1 =2 =3 +[reduce<sum-input>] }}} +</$set> +``` + +<<.tip "Compare with the analagous named [[filter run prefix|Filter Expression]] `:reduce`">> ``` \define num-items() [get[quantity]add<accumulator>] @@ -43,4 +46,6 @@ is equivalent to: [tag[shopping]] :reduce[get[quantity]add<accumulator>] ``` +<$macrocall $name=".tip" _="""If the optional second parameter is not given, the initial accumulator value will be empty. Numerical operators treat empty input as if it was the number 0. See the multiply-input examples for how this can affect the result of <<.op reduce>> in some cases."""/> + <<.operator-examples "reduce">> diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid index f40cc7356..fde0a1557 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid @@ -39,6 +39,8 @@ is equivalent to: [tag[shopping]reduce<num-items>] ``` -Specifying a default value: +Specifying a default value when input is empty: `[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]` + +<$macrocall $name=".tip" _="""Unlike the [[reduce Operator]], the `:reduce` prefix cannot specify an initial value for the accumulator, so its initial value will always be empty (which is treated as 0 by mathematical operators). So `=1 =2 =3 :reduce[multiply<accumulator>]` will produce 0, not 6. If you need to specify an initial accumulator value, use the [[reduce Operator]]."""/> From ae61b08ae5bdf3c738dbda9e6b8d438323386383 Mon Sep 17 00:00:00 2001 From: ento <ento+github@i.pearlwaffles.xyz> Date: Fri, 11 Dec 2020 02:12:01 -0800 Subject: [PATCH 1129/2376] Fix browser testing (#5254) * jasmine: specify 'after' only in Node The commands module is never executed in browsers and the 'after' constraint caused a regression where tests were never run in the browser. * jasmine: give the startup module a name like all others --- plugins/tiddlywiki/jasmine/jasmine-plugin.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/tiddlywiki/jasmine/jasmine-plugin.js b/plugins/tiddlywiki/jasmine/jasmine-plugin.js index 34c5b5831..f508b8f03 100644 --- a/plugins/tiddlywiki/jasmine/jasmine-plugin.js +++ b/plugins/tiddlywiki/jasmine/jasmine-plugin.js @@ -9,19 +9,20 @@ The main module of the Jasmine test plugin for TiddlyWiki5 (function(){ /*jslint node: true, browser: true */ -/*global $tw: false */ +/*global $tw: true */ "use strict"; var TEST_TIDDLER_FILTER = "[type[application/javascript]tag[$:/tags/test-spec]]"; +exports.name = "jasmine"; // Ensure this startup module is executed in the right order. -// Jasmine calls `process.exit()` with a non-zero exit code if there's +// In Node.js, Jasmine calls `process.exit()` with a non-zero exit code if there's // any failed tests. Because of that, we want to make sure all critical // startup modules are run before this one. // * The "commands" module handles the --rendertiddler command-line flag, -// which is typically given to export an HTML file that can be opened with +// which is typically given in order to export an HTML file that can be opened with // a browser to run tests. -exports.after = ["commands"]; +exports.after = $tw.node ? ["commands"] : []; /* Startup function for running tests From c0dd13d446d4c34eeeaef01f83111883dcc276dd Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Fri, 11 Dec 2020 16:36:00 +0100 Subject: [PATCH 1130/2376] Reveal widget should update on changed class and style attributes (#5258) --- core/modules/widgets/reveal.js | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index e6334dff2..dc819bcba 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -35,9 +35,8 @@ RevealWidget.prototype.render = function(parent,nextSibling) { tag = this.revealTag; } var domNode = this.document.createElement(tag); - var classes = this["class"].split(" ") || []; - classes.push("tc-reveal"); - domNode.className = classes.join(" "); + this.domNode = domNode; + this.assignDomNodeClasses(); if(this.style) { domNode.setAttribute("style",this.style); } @@ -110,7 +109,7 @@ RevealWidget.prototype.execute = function() { this.text = this.getAttribute("text"); this.position = this.getAttribute("position"); this.positionAllowNegative = this.getAttribute("positionAllowNegative") === "yes"; - this["class"] = this.getAttribute("class",""); + // class attribute handled in assignDomNodeClasses() this.style = this.getAttribute("style",""); this["default"] = this.getAttribute("default",""); this.animate = this.getAttribute("animate","no"); @@ -203,6 +202,12 @@ RevealWidget.prototype.readPopupState = function(state) { } }; +RevealWidget.prototype.assignDomNodeClasses = function() { + var classes = this.getAttribute("class","").split(" "); + classes.push("tc-reveal"); + this.domNode.className = classes.join(" "); +}; + /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ @@ -211,7 +216,12 @@ RevealWidget.prototype.refresh = function(changedTiddlers) { if(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes["default"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) { this.refreshSelf(); return true; - } else { + } else if(changedAttributes.style) { + this.domNode.style = this.getAttribute("style"); + } else if(changedAttributes["class"]) { + this.assignDomNodeClasses(); + } + else { var currentlyOpen = this.isOpen; this.readState(); if(this.isOpen !== currentlyOpen) { @@ -222,7 +232,7 @@ RevealWidget.prototype.refresh = function(changedTiddlers) { return true; } } else if(this.type === "popup" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) { - this.positionPopup(this.domNodes[0]); + this.positionPopup(this.domNode); } return this.refreshChildren(changedTiddlers); } From 93309b0b7d376f61e4ae3a9fc7b2021db7eeb44c Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 11 Dec 2020 16:13:14 +0000 Subject: [PATCH 1131/2376] Sort plugins in control panel by name instead of title Fixes #5256 --- core/ui/ControlPanel/Modals/AddPlugins.tid | 8 ++++---- core/ui/ControlPanel/Plugins.tid | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/ui/ControlPanel/Modals/AddPlugins.tid b/core/ui/ControlPanel/Modals/AddPlugins.tid index a7fbec1dd..ead756408 100644 --- a/core/ui/ControlPanel/Modals/AddPlugins.tid +++ b/core/ui/ControlPanel/Modals/AddPlugins.tid @@ -5,7 +5,7 @@ subtitle: {{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/ <$action-sendmessage $message="tm-load-plugin-from-library" url={{!!url}} title={{$(assetInfo)$!!original-title}}/> <$set name="url" value={{!!url}}> <$set name="currentTiddler" value=<<assetInfo>>> -<$list filter="[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]" variable="dependency"> +<$list filter="[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]" variable="dependency"> <$action-sendmessage $message="tm-load-plugin-from-library" url=<<url>> title=<<dependency>>/> </$list> </$set> @@ -84,7 +84,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ <$list filter="[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]" variable="ignore"> <div> {{$:/language/ControlPanel/Plugins/AlsoRequires}} -<$list filter="[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]" variable="dependency"> +<$list filter="[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]" variable="dependency"> <$text text=<<dependency>>/> </$list> </div> @@ -97,7 +97,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </div> <$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]" variable="ignore"> <div class="tc-plugin-info-sub-plugins"> -<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]]" variable="assetInfo"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]" variable="assetInfo"> <<display-plugin-info "$type$">> </$list> </div> @@ -135,7 +135,7 @@ $:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$ </$button> </$reveal> <div class="tc-plugin-library-listing"> -<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]]" variable="assetInfo"> +<$list filter="[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]" variable="assetInfo"> <$list filter="[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]" variable="ignore"><!-- Hide sub-plugins if we're not searching --> <<display-plugin-info "$type$">> </$list> diff --git a/core/ui/ControlPanel/Plugins.tid b/core/ui/ControlPanel/Plugins.tid index 327d0a480..3161787b8 100644 --- a/core/ui/ControlPanel/Plugins.tid +++ b/core/ui/ControlPanel/Plugins.tid @@ -7,7 +7,7 @@ caption: {{$:/language/ControlPanel/Plugins/Caption}} \define plugin-table(type) <$set name="plugin-type" value="""$type$"""> <$set name="qualified-state" value=<<qualify "$:/state/plugin-info">>> -<$list filter="[!has[draft.of]plugin-type[$type$]sort[title]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/> +<$list filter="[!has[draft.of]plugin-type[$type$]sort[name]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/> </$set> </$set> \end From 0911d99813f9123961116a08c136b157a72393bd Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 12 Dec 2020 00:24:27 +0100 Subject: [PATCH 1132/2376] URGENT: Reveal widget - fixed problem with previous patch of refresh handling (#5260) * Fixed problem with previous patch of refresh handling * Update reveal.js --- core/modules/widgets/reveal.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index dc819bcba..2431e7195 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -216,12 +216,7 @@ RevealWidget.prototype.refresh = function(changedTiddlers) { if(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes["default"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) { this.refreshSelf(); return true; - } else if(changedAttributes.style) { - this.domNode.style = this.getAttribute("style"); - } else if(changedAttributes["class"]) { - this.assignDomNodeClasses(); - } - else { + } else { var currentlyOpen = this.isOpen; this.readState(); if(this.isOpen !== currentlyOpen) { @@ -234,6 +229,12 @@ RevealWidget.prototype.refresh = function(changedTiddlers) { } else if(this.type === "popup" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) { this.positionPopup(this.domNode); } + if(changedAttributes.style) { + this.domNode.style = this.getAttribute("style",""); + } + if(changedAttributes["class"]) { + this.assignDomNodeClasses(); + } return this.refreshChildren(changedTiddlers); } }; From a17fa35c28d863d1edbb04f28887a7a49e6aef14 Mon Sep 17 00:00:00 2001 From: Bimba Laszlo <bimbalaszlo@gmail.com> Date: Sun, 13 Dec 2020 12:37:07 +0100 Subject: [PATCH 1133/2376] Remove menubar from print (#5273) In the print view, a shadow appeared at the top of each page, and the first lines were not visible. I hide the menubar in the print view. --- plugins/tiddlywiki/menubar/styles.tid | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/tiddlywiki/menubar/styles.tid b/plugins/tiddlywiki/menubar/styles.tid index 7fc56eafe..26a96be01 100644 --- a/plugins/tiddlywiki/menubar/styles.tid +++ b/plugins/tiddlywiki/menubar/styles.tid @@ -213,3 +213,10 @@ nav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button { <<set-sidebar-scrollable-top>> } +@media print { + + nav.tc-menubar { + display: none; + } + +} From 8798ebadbd9ef079207b9c470ad5490761c6ab08 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 13 Dec 2020 12:40:57 +0100 Subject: [PATCH 1134/2376] Add foreground color to CodeMirror selections and fix #5272 (#5266) * Add foreground color to CodeMirror selections * Use default selection background if tiddler-editor-background matches selection-background --- plugins/tiddlywiki/codemirror/styles.tid | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/tiddlywiki/codemirror/styles.tid b/plugins/tiddlywiki/codemirror/styles.tid index de3ca98ce..a070a614d 100755 --- a/plugins/tiddlywiki/codemirror/styles.tid +++ b/plugins/tiddlywiki/codemirror/styles.tid @@ -15,16 +15,20 @@ name: tiddlywiki \define set-fat-cursor-background() <$macrocall $name="set-fat-cursor-background-colours" palette={{$:/palette}}/> \end -\define set-selection-background-css(colour,colourA,colourB) +\define set-selection-background-css(colour,colourA,colourB,tiddlerEditorBackground) +<$wikify name="tiddlerEditorBackground" text={{{ [[$tiddlerEditorBackground$]lowercase[]] }}}> <$set name="backgroundColour" value=<<contrastcolour target:"""$colour$""" fallbackTarget:"""""" colourA:"""$colourA$""" colourB:"""$colourB$""">>> -.cm-s-tiddlywiki div.CodeMirror-selected { background: <<backgroundColour>>; } -.cm-s-tiddlywiki.CodeMirror ::selection { background: <<backgroundColour>>; } -.cm-s-tiddlywiki .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: <<backgroundColour>>; } -.cm-s-tiddlywiki .CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: <<backgroundColour>>; } +<$set name="backgroundColour" value={{{ [<backgroundColour>lowercase[]match<tiddlerEditorBackground>then[]] ~[<backgroundColour>] }}}> +.cm-s-tiddlywiki div.CodeMirror-selected { background: <<backgroundColour>>; color: <<colour foreground>>; } +.cm-s-tiddlywiki.CodeMirror ::selection { background: <<backgroundColour>>; color: <<colour foreground>>; } +.cm-s-tiddlywiki .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: <<backgroundColour>>; color: <<colour foreground>>; } +.cm-s-tiddlywiki .CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: <<backgroundColour>>; color: <<colour foreground>>; } </$set> +</$set> +</$wikify> \end \define set-selection-background-colours(palette) -<$macrocall $name="set-selection-background-css" colour={{$palette$##foreground}} colourA={{{ [{$palette$##selection-background}!match[]!prefix[<<]!suffix[>>]] ~#073642 }}} colourB={{{ [{$palette$##selection-background}!match[]!prefix[<<]!suffix[>>]] ~#eee8d5 }}}/> +<$macrocall $name="set-selection-background-css" colour={{$palette$##foreground}} colourA={{{ [{$palette$##selection-background}!match[]!prefix[<<]!suffix[>>]] ~#073642 }}} colourB={{{ [{$palette$##selection-background}!match[]!prefix[<<]!suffix[>>]] ~#eee8d5 }}} tiddlerEditorBackground={{$palette$##tiddler-editor-background}}/> \end \define set-selection-background() <$macrocall $name="set-selection-background-colours" palette={{$:/palette}}/> From 88e29b45585f484964a19a805646505091a1cade Mon Sep 17 00:00:00 2001 From: Xavier Cazin <xavier@cazin.eu> Date: Sun, 13 Dec 2020 17:15:16 +0100 Subject: [PATCH 1135/2376] tabsState should hold a tiddler name rather than a list singleton (#5263) * tabsState should hold a tiddler name rather than a list singleton * tabsState should hold a tiddler name rather than a list singleton --- core/wiki/macros/tabs.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/macros/tabs.tid b/core/wiki/macros/tabs.tid index 0470186b9..63f5222c2 100644 --- a/core/wiki/macros/tabs.tid +++ b/core/wiki/macros/tabs.tid @@ -3,7 +3,7 @@ tags: $:/tags/Macro \define tabs(tabsList,default,state:"$:/state/tab",class,template,buttonTemplate,retain,actions,explicitState) <$set name="qualifiedState" value=<<qualify "$state$">>> -<$set name="tabsState" filter="[<__explicitState__>minlength[1]] ~[<qualifiedState>]"> +<$vars tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}> <div class="tc-tab-set $class$"> <div class="tc-tab-buttons $class$"> <$list filter="$tabsList$" variable="currentTab" storyview="pop"><$set name="save-currentTiddler" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default="$default$" selectedClass="tc-tab-selected" tooltip={{!!tooltip}}> @@ -33,6 +33,6 @@ tags: $:/tags/Macro </$list> </div> </div> -</$set> +</$vars> </$set> \end From 81947edd5c3a2daa8da44a520824b1867e40953e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 13 Dec 2020 20:01:47 +0000 Subject: [PATCH 1136/2376] Dev: Update hook mechanism docs --- editions/dev/tiddlers/new/HookMechanism.tid | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/editions/dev/tiddlers/new/HookMechanism.tid b/editions/dev/tiddlers/new/HookMechanism.tid index 82883d16d..0034c9fab 100644 --- a/editions/dev/tiddlers/new/HookMechanism.tid +++ b/editions/dev/tiddlers/new/HookMechanism.tid @@ -1,17 +1,30 @@ created: 20141122200310516 -modified: 20170209130807520 +modified: 20201213161842776 title: HookMechanism type: text/vnd.tiddlywiki The hook mechanism provides a way for plugins to intercept and modify default functionality. Hooks are added as follows: ```js +/* +name: name of hook function (by convention prefixed with `th-`) +handler: function to be called when hook is invoked +*/ $tw.hooks.addHook(name,handler); ``` +The handler function will be called with parameters that depend on the specific hook in question, but they always follow the pattern `handler(value,params...)` + +* ''value'': an optional value that is to be transformed by the hook function +* ''params'': one or more optional parameters that are passed to the hook function + +If required by the hook in question, the handler function must return the modified ''value''. + Multiple handlers can be assigned to the same name using repeated calls. When a hook is invoked by name all registered functions will be called sequentially in their order of addition. -Though not essential care should be taken to ensure that hooks are added before they are invoked. For example: [[Hook: tc-opening-default-tiddlers-list]] should ideally be added before the story startup module is invoked otherwise any hook specified additions to the default tiddlers will not be seen on the initial loading of the page, though will be visible if the user clicks the home button. +Note that the ''value'' passed to the subsequent hook function will be the return value of the previous hook function. + +Though not essential care should be taken to ensure that hooks are added before they are invoked. For example: [[Hook: th-opening-default-tiddlers-list]] should ideally be added before the story startup module is invoked otherwise any hook specified additions to the default tiddlers will not be seen on the initial loading of the page, though will be visible if the user clicks the home button. !! Example From c1a1e272cc9b823f97f8f1bde6a24dfa5fe973e8 Mon Sep 17 00:00:00 2001 From: jed <inmysocks@fastmail.com> Date: Mon, 14 Dec 2020 00:24:23 +0100 Subject: [PATCH 1137/2376] Add a hook to allow modifying the the behaviour creating tiddler paths (#5267) * Add a hook to allow modifying the the behaviour creating tiddler paths This is needed for Bob to use the core to generate tiddler fileInfo I don't know if this is the best way to make the hook, but it works for what I need * update th-make-tiddler-path arguments the value is the current path, the parameter passed in is the original unmodified path so it is available to subsequent hooks --- core/modules/utils/filesystem.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index eb1050f90..e616f9f70 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -382,11 +382,13 @@ exports.generateTiddlerFilepath = function(title,options) { count++; } while(fs.existsSync(fullPath)); //If the path does not start with the wikiPath directory or the wikiTiddlersPath directory, or if the last write failed - var encode = !(fullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 || fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0) || ((options.fileInfo || {writeError: false}).writeError == true); + var newPath = fullPath; + var encode = !(fullPath.indexOf($tw.boot.wikiPath) == 0 || fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0) || ((options.fileInfo || {writeError: false}).writeError == true); if(encode){ //encodeURIComponent() and then resolve to tiddler directory - fullPath = path.resolve(directory, encodeURIComponent(fullPath)); + newPath = path.resolve(directory, encodeURIComponent(fullPath)); } + fullPath = $tw.hooks.invokeHook("th-make-tiddler-path", newPath, fullPath); // Return the full path to the file return fullPath; }; From d50f6b406e141ea5b4c2caf48f181381648abfe9 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Mon, 14 Dec 2020 01:50:53 -0800 Subject: [PATCH 1138/2376] filesystem cleaup around hook (#5276) --- core/modules/utils/filesystem.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index e616f9f70..c530b095d 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -339,7 +339,7 @@ exports.generateTiddlerFilepath = function(title,options) { if(!filepath && originalpath !== "") { //Use the originalpath without the extension var ext = path.extname(originalpath); - filepath = originalpath.substring(0,originalpath.length - ext.length);; + filepath = originalpath.substring(0,originalpath.length - ext.length); } else if(!filepath) { filepath = title; // If the filepath already ends in the extension then remove it @@ -381,13 +381,20 @@ exports.generateTiddlerFilepath = function(title,options) { } count++; } while(fs.existsSync(fullPath)); - //If the path does not start with the wikiPath directory or the wikiTiddlersPath directory, or if the last write failed - var newPath = fullPath; - var encode = !(fullPath.indexOf($tw.boot.wikiPath) == 0 || fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0) || ((options.fileInfo || {writeError: false}).writeError == true); + // If the last write failed with an error, or if path does not start with: + // the resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, + // then encodeURIComponent() and resolve to tiddler directory + var newPath = fullPath, + encode = (options.fileInfo || {writeError: false}).writeError == true; + if(!encode){ + encode = !(fullPath.indexOf(path.resolve(directory)) == 0 || + fullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 || + fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0); + } if(encode){ - //encodeURIComponent() and then resolve to tiddler directory - newPath = path.resolve(directory, encodeURIComponent(fullPath)); + fullPath = path.resolve(directory, encodeURIComponent(fullPath)); } + // Call hook to allow plugins to modify the final path fullPath = $tw.hooks.invokeHook("th-make-tiddler-path", newPath, fullPath); // Return the full path to the file return fullPath; From 3c3cd4673ec7c816125c5a14d2981ce7d28c0491 Mon Sep 17 00:00:00 2001 From: Robin Munn <rmunn@pobox.com> Date: Tue, 15 Dec 2020 02:18:51 +0700 Subject: [PATCH 1139/2376] Railroad diagram for filter expression now includes named prefixes (#5278) --- .../tiddlers/filters/syntax/Filter Expression.tid | 4 ++-- .../filters/syntax/Named Filter Run Prefix.tid | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/syntax/Named Filter Run Prefix.tid diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index 0b3835373..577ff6181 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20201208185257875 +modified: 20201214053032397 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -7,7 +7,7 @@ type: text/vnd.tiddlywiki <$railroad text=""" [{: [: [[whitespace|"Filter Whitespace"]] ] - ("+"|"~"|:-|"-"|"=") + ("+"|"~"|:-|"-"|"="|":"[[named-prefix|"Named Filter Run Prefix"]]) [[run|"Filter Run"]] }] """/> diff --git a/editions/tw5.com/tiddlers/filters/syntax/Named Filter Run Prefix.tid b/editions/tw5.com/tiddlers/filters/syntax/Named Filter Run Prefix.tid new file mode 100644 index 000000000..2ffedd21c --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/syntax/Named Filter Run Prefix.tid @@ -0,0 +1,10 @@ +created: 20201214044413473 +modified: 20201214053018350 +tags: +title: Named Filter Run Prefix + +<$set name="prefixlist" filter="""[all[shadows+tiddlers]has[module-type]module-type[filterrunprefix]trim:prefix[$:/core/modules/filterrunprefixes/]trim:suffix[.js]addprefix["]addsuffix["]join[|]addprefix[(]addsuffix[)]]"""> +<$railroad text=<<prefixlist>>/> +</$set> + +A named filter run prefix can precede any [[run|Filter Run]] of a [[filter expression|Filter Expression]] in place of a single-character prefix (`+`, `-` and so on). To create a new filter run prefix, create a [[Javascript module|Modules]] with a [[module-type|ModuleType]] of `filerrunprefix`. \ No newline at end of file From e046d5ad76508aa5dd5774e20b076ea4798fa0e5 Mon Sep 17 00:00:00 2001 From: jed <inmysocks@fastmail.com> Date: Mon, 14 Dec 2020 20:20:29 +0100 Subject: [PATCH 1140/2376] Create Hook_th-make-tiddler-path.tid (#5274) Documentation for the hook --- .../dev/tiddlers/new/Hook_th-make-tiddler-path.tid | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 editions/dev/tiddlers/new/Hook_th-make-tiddler-path.tid diff --git a/editions/dev/tiddlers/new/Hook_th-make-tiddler-path.tid b/editions/dev/tiddlers/new/Hook_th-make-tiddler-path.tid new file mode 100644 index 000000000..4209920f1 --- /dev/null +++ b/editions/dev/tiddlers/new/Hook_th-make-tiddler-path.tid @@ -0,0 +1,14 @@ +tags: HookMechanism +title: Hook: th-make-tiddler-path +type: text/vnd.tiddlywiki + +This hook lets a plugin inspect or modify the tiddler file path during the saving process. + +Hook function parameters: + +* ``currentPath``: The path the tiddler file will be saved to. +* ``originalPath``: The original tiddler file path unmodified by any hooks. + +Return value: + +The path to use for saving the tiddler file. From f96813069691015f4965a7e9bf1d6f310ae568bd Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 15 Dec 2020 11:38:16 +0100 Subject: [PATCH 1141/2376] Update Customising search results.tid (#5233) --- .../tw5.com/tiddlers/customising/Customising search results.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/customising/Customising search results.tid b/editions/tw5.com/tiddlers/customising/Customising search results.tid index a1a64bae4..9b345e8ce 100644 --- a/editions/tw5.com/tiddlers/customising/Customising search results.tid +++ b/editions/tw5.com/tiddlers/customising/Customising search results.tid @@ -1,5 +1,5 @@ created: 20141027151552783 -modified: 20141027151947305 +modified: 20201207181116804 tags: [[Customise TiddlyWiki]] title: Customising search results type: text/vnd.tiddlywiki From 1e9cc2b747e9f8b7b9366cde2c452d52a4d172a5 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Tue, 15 Dec 2020 12:09:32 +0100 Subject: [PATCH 1142/2376] Fix refresh for all attributes of droppable widget. Add disabled class (#5280) --- core/modules/widgets/droppable.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/droppable.js b/core/modules/widgets/droppable.js index 87a130f39..c9878930d 100644 --- a/core/modules/widgets/droppable.js +++ b/core/modules/widgets/droppable.js @@ -50,6 +50,8 @@ DroppableWidget.prototype.render = function(parent,nextSibling) { {name: "dragleave", handlerObject: this, handlerMethod: "handleDragLeaveEvent"}, {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"} ]); + } else { + $tw.utils.addClass(this.domNode,this.disabledClass); } // Insert element parent.insertBefore(domNode,nextSibling); @@ -145,6 +147,7 @@ DroppableWidget.prototype.execute = function() { this.droppableEffect = this.getAttribute("effect","copy"); this.droppableTag = this.getAttribute("tag"); this.droppableEnable = (this.getAttribute("enable") || "yes") === "yes"; + this.disabledClass = this.getAttribute("disabledClass",""); // Make child widgets this.makeChildWidgets(); }; @@ -160,7 +163,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ DroppableWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tag || changedAttributes.enable) { + if(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) { this.refreshSelf(); return true; } else if(changedAttributes["class"]) { @@ -171,4 +174,4 @@ DroppableWidget.prototype.refresh = function(changedTiddlers) { exports.droppable = DroppableWidget; -})(); +})(); \ No newline at end of file From 3c003364d2408eb27912187f57f023333cc4f4dd Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 15 Dec 2020 11:59:07 +0000 Subject: [PATCH 1143/2376] Add the Atrounoush's winning banner design for v5.1.23 The image was received with a transparent background, but I adjusted it to give it a white background to ensure it is readable with all colour schemes. --- .../tiddlers/images/New Release Banner.png | Bin 44302 -> 27715 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.png b/editions/tw5.com/tiddlers/images/New Release Banner.png index 924f12b6dfc4f8cf3e80fec4ef1e4d759d21fe63..0a5875f63b665186cf422314bdda79ecd05e5e8e 100644 GIT binary patch literal 27715 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%0AsTpr&#AX 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 literal 44302 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 Cj!BpR From dc83ee411d4b5d84dd681157fa0ccc6e8bd7f939 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Wed, 16 Dec 2020 17:20:14 +0100 Subject: [PATCH 1144/2376] Fix problem with tc-btn-invisible not correct fill color (#5288) --- themes/tiddlywiki/vanilla/base.tid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 2d5fc82a3..ddb6fa5e9 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -483,8 +483,9 @@ button svg, button img, label svg, label img { margin: 0; background: none; border: none; - cursor: pointer; + cursor: pointer; color: <<colour foreground>>; + fill: <<colour foreground>>; } .tc-btn-boxed { From c0a56e790d9cbe65fe27adfbda0889dc116a538d Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Fri, 18 Dec 2020 21:19:02 +0100 Subject: [PATCH 1145/2376] Update title.tid (#5292) --- editions/tw5.com/tiddlers/filters/title.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/filters/title.tid b/editions/tw5.com/tiddlers/filters/title.tid index 46f16e9b6..3bb59d73f 100644 --- a/editions/tw5.com/tiddlers/filters/title.tid +++ b/editions/tw5.com/tiddlers/filters/title.tid @@ -12,7 +12,7 @@ op-parameter-name: T op-output: a selection containing only <<.place T>> op-neg-output: the input, but with tiddler <<.place T>> filtered out if it exists in the wiki -`[title[An Example]]` can be shortened to `[[An Example]]`, because <<.op title>> is the default filter operator. +`[title[An Example]]` can be shortened to `[[An Example]]`, because <<.op title>> is the default filter operator. Consequentially, `[!title[An Example]]` can be shortened to `[![An Example]]`. <<.op title>> is a [[constructor|Selection Constructors]] (except in the form `!title`), but <<.olink2 "field:title" field>> is a [[modifier|Selection Constructors]]. From ddda9a34ae9c70e8e0487e70ab638bedd9406705 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 22 Dec 2020 11:48:40 +0000 Subject: [PATCH 1146/2376] [Docs] Update links to developer discussions --- editions/tw5.com/tiddlers/about/Developers.tid | 11 ++++++++--- editions/tw5.com/tiddlers/community/Forums.tid | 9 ++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/editions/tw5.com/tiddlers/about/Developers.tid b/editions/tw5.com/tiddlers/about/Developers.tid index 9bb7007ac..9b24b0c36 100644 --- a/editions/tw5.com/tiddlers/about/Developers.tid +++ b/editions/tw5.com/tiddlers/about/Developers.tid @@ -1,5 +1,5 @@ created: 20150412191004348 -modified: 20160710150754023 +modified: 20201222114745463 tags: Community Reference title: Developers type: text/vnd.tiddlywiki @@ -7,5 +7,10 @@ type: text/vnd.tiddlywiki There are several resources for developers to learn more about TiddlyWiki and to discuss and contribute to its development. * [[tiddlywiki.com/dev|https://tiddlywiki.com/dev]] is the official developer documentation -* [[TiddlyWikiDev group|https://groups.google.com/group/TiddlyWikiDev]] for discussions about TiddlyWiki development -* https://github.com/Jermolene/TiddlyWiki5 for the source code and development activity +* Get involved in the [[development on GitHub|https://github.com/Jermolene/TiddlyWiki5]] +** [[Discussions|https://github.com/Jermolene/TiddlyWiki5/discussions]] are for Q&A and open-ended discussion +** [[Issues|https://github.com/Jermolene/TiddlyWiki5/issues]] are for raising bug reports and proposing specific, actionable new ideas +* The older ~TiddlyWikiDev Google Group is now closed in favour of [[GitHub Discussions|https://github.com/Jermolene/TiddlyWiki5/discussions]] but remains a useful archive: https://groups.google.com/group/TiddlyWikiDev +** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywikidev@googlegroups.com/]] +* Follow [[@TiddlyWiki on Twitter|http://twitter.com/#!/TiddlyWiki]] for the latest news +* Chat at https://gitter.im/TiddlyWiki/public (development room coming soon) diff --git a/editions/tw5.com/tiddlers/community/Forums.tid b/editions/tw5.com/tiddlers/community/Forums.tid index b213db329..2a2663a65 100644 --- a/editions/tw5.com/tiddlers/community/Forums.tid +++ b/editions/tw5.com/tiddlers/community/Forums.tid @@ -1,5 +1,5 @@ created: 20140721121924384 -modified: 20161229091129395 +modified: 20201222114755959 tags: Community title: Forums type: text/vnd.tiddlywiki @@ -19,12 +19,7 @@ The ~TiddlyWiki discussion groups are mailing lists for talking about ~TiddlyWik ! Developers -* The TiddlyWikiDev group for developers: https://groups.google.com/group/TiddlyWikiDev -*> Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to mailto:tiddlywikidev+subscribe@googlegroups.com. -** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywikidev@googlegroups.com/]] -* Follow [[@TiddlyWiki on Twitter|http://twitter.com/#!/TiddlyWiki]] for the latest news -* Get involved in the [[development on GitHub|https://github.com/Jermolene/TiddlyWiki5]] -* Chat at https://gitter.im/TiddlyWiki/public (development room coming soon) +{{Developers}} New releases of TiddlyWiki, TiddlyDesktop and TiddlyFox are announced via the discussion groups and [[Twitter|https://twitter.com/TiddlyWiki]] (you can also subscribe to an Atom/RSS feed of [[TiddlyWiki releases from GitHub|https://github.com/jermolene/tiddlywiki5/releases.atom]]) From a9a36b641aa0c603166a8ce98df84dfa68727a7a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 22 Dec 2020 11:50:26 +0000 Subject: [PATCH 1147/2376] Filename for action-confirm widget should be 'action-confirm.js' for consistency --- core/modules/widgets/{confirm.js => action-confirm.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/modules/widgets/{confirm.js => action-confirm.js} (100%) diff --git a/core/modules/widgets/confirm.js b/core/modules/widgets/action-confirm.js similarity index 100% rename from core/modules/widgets/confirm.js rename to core/modules/widgets/action-confirm.js From 2f8a100babb5b12b0998fe0c8b7d4ded0eb4b7d5 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 22 Dec 2020 15:42:21 +0000 Subject: [PATCH 1148/2376] Clarify TiddlySpot warning text --- core/language/en-GB/ControlPanel.multids | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 54f0d4050..6fc42e954 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -128,7 +128,7 @@ Saving/TiddlySpot/Filename: Upload Filename Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.// Saving/TiddlySpot/Password: Password -Saving/TiddlySpot/ReadOnly: ~TiddlySpot service may currently be available as read only. Please see http://tiddlyspot.com/ for details +Saving/TiddlySpot/ReadOnly: The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers. Saving/TiddlySpot/ServerURL: Server URL Saving/TiddlySpot/UploadDir: Upload Directory Saving/TiddlySpot/UserName: Wiki Name From 9e70e89a84c3f9ed734266aa6cf91fb0f42aff6a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 22 Dec 2020 17:34:24 +0000 Subject: [PATCH 1149/2376] Update Release Note --- .../prerelease/tiddlers/Release 5.1.23.tid | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index f3b26ec57..496badac9 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 -created: 20201128173201204 -modified: 20201128173201204 +created: 20201222153818731 +modified: 20201222153818731 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -29,6 +29,8 @@ type: text/vnd.tiddlywiki * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4659]] templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4954]] ListWidget to not initialize parsers for blank `emptyMessage` attributes * [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/4200]] `story.js` to remove dependency on `wiki.js` for story start up and navigator +* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/5206]] filter execution to use a more efficient linked list structure for intermediate results +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5205]] filter mechanism to cache the result of parsing macros which don't use text substitution ! Usability Improvements @@ -56,7 +58,9 @@ type: text/vnd.tiddlywiki * [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9]] normalize.css's styling of search input fields and [[updated|https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a]] to a modern fork of normalize.css * [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b]] unneeded editor toolbar buttons when editing SVG tiddlers * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5089]] global keyboard shortcut for switching layouts -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] the [[CodeMirror Plugin]] and the [[Hightlight Plugin]] to use palette colours +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] the [[CodeMirror Plugin]] and the [[Highlight Plugin]] to use palette colours +* [[Renamed|https://github.com/Jermolene/TiddlyWiki5/pull/5143]] "references" to "backlinks" in the tiddler info panel +* [[Hide|https://github.com/Jermolene/TiddlyWiki5/commit/1d7091e637462dcda8c28d660ca42c073f647043]] the `.tid` exporter when more than one tiddler to export ! Filter Improvements @@ -70,13 +74,21 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4948]] new [[enlist-input Operator]] to parse its input titles as a title lists * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4915]] support for named filter run prefixes * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4918]] new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4959]] new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5196]] new [[:reduce filter run prefix|Filter Expression]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4990]] new [[toggle Operator]] to toggle a title in a list * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5021]] new [[cycle Operator]] +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5146]] new [[pad Operator]] ! Hackability Improvements +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5113]] the mechanism for [[Customising Tiddler File Naming]] to: +** Save drafts to a special folder for each user +** Allow filters in $:/config/FileSystemPaths to change the path of a tiddler file on disk +** Allow filters in $:/config/FileSystemExtensions to change the extension of a tiddler file on disk +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c1a1e272cc9b823f97f8f1bde6a24dfa5fe973e8]] `th-make-tiddler-path` hook for low-level control of tiddler path construction * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5091]] ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5086]] EventCatcherWidget for low level event handling * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5087]] the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes @@ -108,21 +120,26 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420]] post-render startup actions * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f7f55e8eff8b172d8fd04f095781efa2420b1be6]] support for username/password parameters for `tm-login` message * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4914]] [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2]] support for the content type `image/jpg` +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2]] support for the content type `image/jpg` (the correct type is `image/jpeg` but the misspelling is common so most browsers now support it) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4908]] support for an override saver * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4923]] utility CSS classes to replace use of ` ` to introduce visual separation * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4952]] a keyboard shortcut to change the sidebar layout * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4983]] option to configure the tag used for TableOfContents in the menubar * [[Modified|https://github.com/Jermolene/TiddlyWiki5/pull/4971]] the KeyboardWidget to not trap keys if there are no actions to be invoked * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4975]] buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary` -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4915]] support for named filter run prefixes * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4964]] support for multiple operands for filter operators * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4985]] all instance of the [[tabs Macro]] in the core to use the explicitState attribute * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5000]] support for the `meta` key as a modifier in actions * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c854e518faa2d2661b7b7278634b10607ab0a5f5]] support for $:/info/darkmode to the InfoMechanism, reflecting the browser dark mode vs. light mode setting +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5154]] RadioWidget to support actions +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5158]] RangeWidget to support actions +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3406b98af62def252bcb0f7df8a72ed4b74818eb]] "autocomplete" attribute to the EditTextWidget and EditWidget +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5191]] [[jsonstringify Operator]] and [[stringify Operator]] to support "rawunicode" suffix ! Bug Fixes +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/fe8606759ebf1db50c57a2e779b086a6d7df2ae6]] parsing of dates from 0 to 100CE +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6a91dbfe2f6e52512d7f063b6d5e3742ff77126d]] handling of negative dates (see [[Date Fields]] and DateFormat) * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5126]] "409 conflict" errors with the ~GitHub saver when saving within 60 seconds of the last save * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5088]] incorrect behaviour of default values with [[lookup Operator]] * [[Restored|https://github.com/Jermolene/TiddlyWiki5/pull/4987]] behaviour of system tiddler syncing with the client server configuration. By default, changes to system tiddlers are not synced from the server to the client, restoring the behaviour from v5.1.21 and earlier. Bidirectional syncing of system tiddlers can be enabled with the configuration tiddler $:/config/SyncSystemTiddlersFromServer @@ -163,6 +180,9 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4947]] a bug for location hashes that contain a `#` character * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5055]] default branch to ''main'' for saving to ~GitHub * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/7327a3fb92fa2ae17d7264c66ab0409d43b18fdc]] shadow tiddlers not refreshing when their plugin is deleted or modified +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5129]] `tc-dirty` class not appearing on external windows +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5148]] `static.tiddler.html` template to make rendered tiddlers full-width +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5222]] crash when using [[edition Operator]] in the browser ! Plugin Improvements @@ -175,7 +195,7 @@ type: text/vnd.tiddlywiki ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) * [[CodeMirror Plugin]] ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4950]] CodeMirror plugins to version 5.58.2 +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4950]] CodeMirror plugins to version 5.58.3 * [[Markdown Plugin]] ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files ** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebreaks @@ -212,11 +232,13 @@ type: text/vnd.tiddlywiki * [[@idotobi|https://github.com/idotobi]] * [[@jdangerx|https://github.com/jdangerx]] * [[@jjduhamel|https://github.com/jjduhamel]] +* [[@joshuafontany|https://github.com/joshuafontany]] * [[@kookma|https://github.com/kookma]] * [[@Kamal-Habash|https://github.com/Kamal-Habash]] * [[@Marxsal|https://github.com/Marxsal]] * [[@mocsa|https://github.com/mocsa]] * [[@NicolasPetton|https://github.com/NicolasPetton]] +* [[@OmbraDiFenice|https://github.com/OmbraDiFenice]] * [[@passuf|https://github.com/passuf]] * [[@pmario|https://github.com/pmario]] * [[@rmunn|https://github.com/rmunn]] From 03ad396db1de83d900f99702d801341459739ad8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 22 Dec 2020 19:12:12 +0000 Subject: [PATCH 1150/2376] Start to rearrange release note into topics The previous groupings were getting too large to manage --- editions/prerelease/tiddlers/$__StoryList.tid | 5 + .../prerelease/tiddlers/Release 5.1.23.tid | 135 ++++++++++-------- 2 files changed, 79 insertions(+), 61 deletions(-) create mode 100644 editions/prerelease/tiddlers/$__StoryList.tid diff --git a/editions/prerelease/tiddlers/$__StoryList.tid b/editions/prerelease/tiddlers/$__StoryList.tid new file mode 100644 index 000000000..d1a1e959f --- /dev/null +++ b/editions/prerelease/tiddlers/$__StoryList.tid @@ -0,0 +1,5 @@ +created: 20201222190149806 +list: [[Release 5.1.23]] +modified: 20201222190149806 +title: $:/StoryList +type: text/vnd.tiddlywiki \ No newline at end of file diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 496badac9..0cb82686c 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,6 +1,6 @@ caption: 5.1.23 created: 20201222153818731 -modified: 20201222153818731 +modified: 20201222190149890 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -28,25 +28,65 @@ type: text/vnd.tiddlywiki * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4659]] templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4954]] ListWidget to not initialize parsers for blank `emptyMessage` attributes -* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/4200]] `story.js` to remove dependency on `wiki.js` for story start up and navigator * [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/5206]] filter execution to use a more efficient linked list structure for intermediate results * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5205]] filter mechanism to cache the result of parsing macros which don't use text substitution +! Plugin Improvements + +* Freelinks Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements +* Twitter Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded +* [[Dynaview Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) +* [[CodeMirror Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4950]] CodeMirror plugins to version 5.58.3 +* [[Markdown Plugin]] +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebreaks +** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4771]] to add `rel="noopener noreferrer"` to external links +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] to use palette colours +* [[Amazon Web Services Plugin]] +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes +* ~BibTeX Plugin +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/f863acf8ac716dbf892f2d63efa0a130aadfec6a]] to a later fork of the underlying third party ~BibTeX parsing library +* Menubar Plugin +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4974]] so the top margin of the side bar adjusts to the height of the menu +* Dynannotate Plugin +** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f]] examples of usage in the View Template +* External Attachments Plugin +** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4549]] a bug with relative paths in the External Attachments plugin +* [[Highlight Plugin]] +** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] to use palette colours + ! Usability Improvements +* [[Renamed|https://github.com/Jermolene/TiddlyWiki5/pull/5143]] "references" to "backlinks" in the tiddler info panel * Several improvements to the import mechanism: ** [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/527638d5e60114653385ed39dc55c736a67e58d2]] status messages in the import listing ** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5067]] colour coding for import items that will overwrite existing tiddlers, and for other warnings ** [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4937]] the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5037]] new ActionConfirm widget +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration +* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) +* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9]] normalize.css's styling of search input fields and [[updated|https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a]] to a modern fork of normalize.css +* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b]] unneeded editor toolbar buttons when editing SVG tiddlers +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5089]] global keyboard shortcut for switching layouts +* [[Hide|https://github.com/Jermolene/TiddlyWiki5/commit/1d7091e637462dcda8c28d660ca42c073f647043]] the `.tid` exporter when more than one tiddler to export + +! Palette Improvements + * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5092]] new "Desert Sand" palette * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5100]] new "Cupertino Dark" palette * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c]] "Solarized Dark" palette * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/274a07b4fd2ca2d1b95c8ddf52fe055c44260d9b]]) the Vanilla theme to optionally use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration * [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox palette readability of toolbar buttons -* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) + +! Keyboard Handling Improvements + * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4791]] a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls * Added keyboard support: ** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4909]] keyboard support for cycling through the tabs in $:/AdvancedSearch @@ -55,15 +95,35 @@ type: text/vnd.tiddlywiki ** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4919]] keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template ** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4927]] keyboard shortcut for saving the wiki ** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4978]] keyboard shortcut for deleting a field in the Edit Template -* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9]] normalize.css's styling of search input fields and [[updated|https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a]] to a modern fork of normalize.css -* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b]] unneeded editor toolbar buttons when editing SVG tiddlers -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5089]] global keyboard shortcut for switching layouts -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] the [[CodeMirror Plugin]] and the [[Highlight Plugin]] to use palette colours -* [[Renamed|https://github.com/Jermolene/TiddlyWiki5/pull/5143]] "references" to "backlinks" in the tiddler info panel -* [[Hide|https://github.com/Jermolene/TiddlyWiki5/commit/1d7091e637462dcda8c28d660ca42c073f647043]] the `.tid` exporter when more than one tiddler to export +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4952]] a keyboard shortcut to change the sidebar layout + + +! Widget Improvements + +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5037]] new ActionConfirm widget +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5091]] ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5086]] EventCatcherWidget for low level event handling +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5087]] the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1b31c25ea77ee4dce86a9aac4375337423ebd3a6]] new LogWidget and ActionLogWidget to help debugging +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5014]] support for ''disabled'' attribute to EditWidget, EditTextWidget, CheckboxWidget, RadioWidget and RangeWidget +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5010]] support for ''disabled'' attribute to ButtonWidget +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f]] the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) +* [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f]] ''accept'' attribute to the BrowseWidget +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4740]] the EditWidget to pass all attributes through to the sub-widget +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653]] LinkCatcherWidget to pass keyboard modifier status to actions +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5154]] RadioWidget to support actions +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5158]] RangeWidget to support actions +* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3406b98af62def252bcb0f7df8a72ed4b74818eb]] "autocomplete" attribute to the EditTextWidget and EditWidget +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5088]] incorrect behaviour of default values with [[lookup Operator]] +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac]] [[has Operator]] when used with the ''tags'' field +* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5222]] crash when using [[edition Operator]] in the browser + ! Filter Improvements +* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4964]] support for multiple operands for filter operators * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5080]] [[power Operator]] and [[log Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b]] new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter @@ -81,6 +141,7 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4990]] new [[toggle Operator]] to toggle a title in a list * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5021]] new [[cycle Operator]] * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5146]] new [[pad Operator]] +* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5191]] [[jsonstringify Operator]] and [[stringify Operator]] to support "rawunicode" suffix ! Hackability Improvements @@ -89,28 +150,16 @@ type: text/vnd.tiddlywiki ** Allow filters in $:/config/FileSystemPaths to change the path of a tiddler file on disk ** Allow filters in $:/config/FileSystemExtensions to change the extension of a tiddler file on disk ** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c1a1e272cc9b823f97f8f1bde6a24dfa5fe973e8]] `th-make-tiddler-path` hook for low-level control of tiddler path construction -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5091]] ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5086]] EventCatcherWidget for low level event handling -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5087]] the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5027]] modals to incorporate a NavigatorWidget so that links work as expected -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1b31c25ea77ee4dce86a9aac4375337423ebd3a6]] new LogWidget and ActionLogWidget to help debugging -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5014]] support for ''disabled'' attribute to EditWidget, EditTextWidget, CheckboxWidget, RadioWidget and RangeWidget -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5010]] support for ''disabled'' attribute to ButtonWidget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10]] the [[Table-of-Contents Macros]] to support custom link targets -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f]] the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) * [[Adedd|https://github.com/Jermolene/TiddlyWiki5/pull/4777]] new Hyperdrive saver for use with Beaker Browser v1.0 -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f]] ''accept'' attribute to the BrowseWidget -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52]] [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df]] support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe]] support for SVG favicons * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/f760a2fa796d57e61307a5ea5274d6cd0b6484c7]] `th-saving-tiddler` hook to include information about the draft tiddler (see https://tiddlywiki.com/dev/#Hook%3A%20th-saving-tiddler) * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4723]] [[WidgetMessage: tm-rename-tiddler]] to control whether relinking occurs * [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4741]] [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4740]] the EditWidget to pass all attributes through to the sub-widget * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653]] LinkCatcherWidget to pass keyboard modifier status to actions * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4724]] original event to `tm-navigate` event * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852]] the password prompt to enable it to be customised * [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e]] syncer to enable syncadaptors to customise the login prompt @@ -123,25 +172,19 @@ type: text/vnd.tiddlywiki * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2]] support for the content type `image/jpg` (the correct type is `image/jpeg` but the misspelling is common so most browsers now support it) * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4908]] support for an override saver * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4923]] utility CSS classes to replace use of ` ` to introduce visual separation -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4952]] a keyboard shortcut to change the sidebar layout * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4983]] option to configure the tag used for TableOfContents in the menubar * [[Modified|https://github.com/Jermolene/TiddlyWiki5/pull/4971]] the KeyboardWidget to not trap keys if there are no actions to be invoked * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4975]] buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary` -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4964]] support for multiple operands for filter operators * [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4985]] all instance of the [[tabs Macro]] in the core to use the explicitState attribute * [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5000]] support for the `meta` key as a modifier in actions * [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c854e518faa2d2661b7b7278634b10607ab0a5f5]] support for $:/info/darkmode to the InfoMechanism, reflecting the browser dark mode vs. light mode setting -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5154]] RadioWidget to support actions -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5158]] RangeWidget to support actions -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3406b98af62def252bcb0f7df8a72ed4b74818eb]] "autocomplete" attribute to the EditTextWidget and EditWidget -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5191]] [[jsonstringify Operator]] and [[stringify Operator]] to support "rawunicode" suffix +* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/4200]] `story.js` to remove dependency on `wiki.js` for story start up and navigator ! Bug Fixes * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/fe8606759ebf1db50c57a2e779b086a6d7df2ae6]] parsing of dates from 0 to 100CE * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6a91dbfe2f6e52512d7f063b6d5e3742ff77126d]] handling of negative dates (see [[Date Fields]] and DateFormat) * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5126]] "409 conflict" errors with the ~GitHub saver when saving within 60 seconds of the last save -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5088]] incorrect behaviour of default values with [[lookup Operator]] * [[Restored|https://github.com/Jermolene/TiddlyWiki5/pull/4987]] behaviour of system tiddler syncing with the client server configuration. By default, changes to system tiddlers are not synced from the server to the client, restoring the behaviour from v5.1.21 and earlier. Bidirectional syncing of system tiddlers can be enabled with the configuration tiddler $:/config/SyncSystemTiddlersFromServer * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/cc3462999b80461fe30b8f4b4f272ccfbbb78b35]] content type of imported `.tid` files that do not have a `type` field * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4632]] hover effect for search dropdown items @@ -149,7 +192,6 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04]] MakeLibraryCommand to skip non-directories * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4601]] erroneous use of `$tw.wiki` * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4647]] ''class'' attribute of DroppableWidget -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac]] [[has Operator]] when used with the ''tags'' field * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4634]] high CPU usage with animated syncing icon introduced in v5.1.22 * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4591]] $:/config/NewJournal/Tags appearing in tag dropdowns * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4658]] popups not being cancelled when clicking within a text editor @@ -182,35 +224,6 @@ type: text/vnd.tiddlywiki * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/7327a3fb92fa2ae17d7264c66ab0409d43b18fdc]] shadow tiddlers not refreshing when their plugin is deleted or modified * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5129]] `tc-dirty` class not appearing on external windows * [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5148]] `static.tiddler.html` template to make rendered tiddlers full-width -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5222]] crash when using [[edition Operator]] in the browser - -! Plugin Improvements - -* Freelinks Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements -* Twitter Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded -* [[Dynaview Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) -* [[CodeMirror Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4950]] CodeMirror plugins to version 5.58.3 -* [[Markdown Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebreaks -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4771]] to add `rel="noopener noreferrer"` to external links -* [[Amazon Web Services Plugin]] -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes -* ~BibTeX Plugin -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/f863acf8ac716dbf892f2d63efa0a130aadfec6a]] to a later fork of the underlying third party ~BibTeX parsing library -* Menubar Plugin -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4974]] so the top margin of the side bar adjusts to the height of the menu -* Dynannotate Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f]] examples of usage in the View Template -* External Attachments Plugin -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4549]] a bug with relative paths in the External Attachments plugin ! Contributors From 8620b77b45d9ca80cda9e98b556fd2abaab58246 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 23 Dec 2020 21:34:23 +0800 Subject: [PATCH 1151/2376] Improve chinese translations for TiddlySpot warning text (#5306) --- languages/zh-Hans/ControlPanel.multids | 2 ++ languages/zh-Hant/ControlPanel.multids | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 1a849b3bc..00ae235cf 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -130,6 +130,8 @@ Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //默认之服务器网址 `http://<wikiname>.tiddlyspot.com/store.cgi`,可改为定制之服务器网址,例如 `http://example.com/store.php`。// Saving/TiddlySpot/Password: 密码 Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服务目前可能仅提供唯读。详见 http://tiddlyspot.com/ +Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服务目前仅以唯读形式提供。相关最新详细信息,请参阅 http://tiddlyspot.com/ 。~TiddlySpot 保存模块仍可用于保存到兼容的服务器。 + Saving/TiddlySpot/ServerURL: 服务器网址 Saving/TiddlySpot/UploadDir: 上传文件夹 Saving/TiddlySpot/UserName: 用户 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index ba5333014..3be034d0c 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -129,7 +129,7 @@ Saving/TiddlySpot/Filename: 上傳檔名 Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //預設之伺服器網址 `http://<wikiname>.tiddlyspot.com/store.cgi`,可改為自訂之伺服器網址,例如 `http://example.com/store.php`。// Saving/TiddlySpot/Password: 密碼 -Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服務目前可能僅提供唯讀。詳見 http://tiddlyspot.com/ +Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服務目前僅以唯讀形式提供。相關最新詳細資訊,請參閱 http://tiddlyspot.com/ 。~TiddlySpot 儲存模組仍可用於儲存到相容的伺服器。 Saving/TiddlySpot/ServerURL: 伺服器網址 Saving/TiddlySpot/UploadDir: 上傳資料夾 Saving/TiddlySpot/UserName: 帳號 From 7cb6dc0e4fa98c61c510a71dba2ff95121661fba Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 24 Dec 2020 10:37:54 +0000 Subject: [PATCH 1152/2376] Override crazy browser defaults for h1 fontsize Fixes #5311 --- themes/tiddlywiki/vanilla/base.tid | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index ddb6fa5e9..cab5a84aa 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -120,6 +120,15 @@ body.tc-body { """>> +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; +} + h1, h2, h3, h4, h5, h6 { line-height: 1.2; font-weight: 300; From 2632ed0078c98d6b4bb9cdea73ae4d95102eaea6 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 24 Dec 2020 11:47:36 +0000 Subject: [PATCH 1153/2376] Release note: coloured badges for different types of changes --- .../prerelease/tiddlers/Release 5.1.23.tid | 431 +++++++++--------- .../tw5.com/tiddlers/system/doc-macros.tid | 17 + .../tw5.com/tiddlers/system/doc-styles.tid | 16 +- 3 files changed, 255 insertions(+), 209 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index 0cb82686c..dc98836fb 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -1,19 +1,235 @@ caption: 5.1.23 created: 20201222153818731 -modified: 20201222190149890 +modified: 20201223144716441 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...master]]// -! Major Improvements +! Performance Improvements -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4725]] support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns -* [[New|https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1]] [[Consent Banner Plugin]] to help make websites compliant with cookie legislation by displaying a consent banner -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf]] [[JSZip Plugin]] ability to dynamically create Zip files, giving TiddlyWiki the ability to build static sites within the browser -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/1446a1e44cd084b0905f3fdcd8b339f23edf2384]] the [[WidgetMessage: tm-scroll]] message to allow the target element to be specified by a CSS selector, making it possible to scroll to positions within a tiddler +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4659">> templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4954">> ListWidget to not initialize parsers for blank `emptyMessage` attributes +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5206">> filter execution to use a more efficient linked list structure for intermediate results +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5205">> widget mechanism to cache the result of parsing macros which don't use text substitution + +! Plugin Improvements + +!! [[JSZip Plugin]] + +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf">> the [[JSZip Plugin]] with the ability to dynamically create Zip files, and thus to conveniently build multi-file static sites within the browser + +!! [[Consent Banner Plugin]] + +<<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1">> + +The new [[Consent Banner Plugin]] plugin helps make websites that are compliant with "cookie legislation" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]]. +It presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits. + +By default, content embedded with <iframe>, <embed> and <object> is blocked unless the user consents to accept cookies. + +Consent status is available via a configuration tiddler so that it is possible to construct content that behaves differently depending upon whether consent has been granted. As an example, a macro is provided for embedding ~YouTube videos that automatically uses the youtube-nocookie.com variant of video URLs unless the user has accepted cookies. + +Please note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice. + +!! [[Freelinks Plugin]] + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3">> (and <<.link-badge-here "https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd">>) support for ignoring case when matching titles + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0">> bug with autolinking within HTML `<a>` elements + +!! [[Twitter Plugin]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58">> warning if wiki needs to be saved and reloaded +!! [[Dynaview Plugin]] +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997">> examples (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc">>) +!! [[CodeMirror Plugin]] +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4662">> issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4950">> CodeMirror plugins to version 5.58.3 +!! [[Markdown Plugin]] +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4680">> encoding of Markdown image files +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41">> issue with whitespace and linebreaks +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4862">> ''tc-tiddlylink-external'' class to external links +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4771">> to add `rel="noopener noreferrer"` to external links +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5128">> to use palette colours +!! [[Amazon Web Services Plugin]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa">> a new ''aws-encodeuricomponent'' filter that also encodes single quotes +!! [[BibTeX Plugin]] +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/f863acf8ac716dbf892f2d63efa0a130aadfec6a">> to a later fork of the underlying third party ~BibTeX parsing library +!! [[Menubar Plugin]] +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4974">> so the top margin of the side bar adjusts to the height of the menu +!! [[Dynannotate Plugin]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f">> examples of usage in the View Template +!! [[External Attachments Plugin]] +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/4549">> a bug with relative paths in the [[External Attachments Plugin]] +!! [[Highlight Plugin]] +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5128">> to use palette colours + +! Usability Improvements + +* <<.link-badge-renamed "https://github.com/Jermolene/TiddlyWiki5/pull/5143">> "references" to "backlinks" in the tiddler info panel +* Several improvements to the import mechanism: +** <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/527638d5e60114653385ed39dc55c736a67e58d2">> status messages in the import listing +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5067">> colour coding for import items that will overwrite existing tiddlers, and for other warnings +** <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4937">> the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a">> warning message about using the online plugin library with the client-server configuration +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e">> favicon for the prerelease edition +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e">> the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) +* <<.link-badge-removed "https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9">> normalize.css's styling of search input fields and <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a">> to a modern fork of normalize.css +* <<.link-badge-removed "https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b">> unneeded editor toolbar buttons when editing SVG tiddlers +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5089">> global keyboard shortcut for switching layouts +* <<.link-badge-hide "https://github.com/Jermolene/TiddlyWiki5/commit/1d7091e637462dcda8c28d660ca42c073f647043">> the `.tid` exporter when more than one tiddler to export + +! Palette Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5092">> new "Desert Sand" palette +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5100">> new "Cupertino Dark" palette +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c">> "Solarized Dark" palette +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4590">> (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/commit/274a07b4fd2ca2d1b95c8ddf52fe055c44260d9b">>) the Vanilla theme to optionally use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4585">> Gruvbox palette readability of toolbar buttons + +! Keyboard Handling Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4725">> support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4791">> a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls +* Added keyboard support: +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4909">> keyboard support for cycling through the tabs in $:/AdvancedSearch +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4921">> keyboard support for navigating the field name dropdown in the Edit Template +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4989">> keyboard support or navigating the `type` field input in the Edit Template +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4919">> keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4927">> keyboard shortcut for saving the wiki +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4978">> keyboard shortcut for deleting a field in the Edit Template +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4952">> a keyboard shortcut to change the sidebar layout + + +! Widget Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5037">> new ActionConfirm widget +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5091">> ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5086">> EventCatcherWidget for low level event handling +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5087">> the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1b31c25ea77ee4dce86a9aac4375337423ebd3a6">> new LogWidget and ActionLogWidget to help debugging +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5014">> support for ''disabled'' attribute to EditWidget, EditTextWidget, CheckboxWidget, RadioWidget and RangeWidget +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5010">> support for ''disabled'' attribute to ButtonWidget +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f">> the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105">> LinkWidget to work within SVG elements +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f">> ''accept'' attribute to the BrowseWidget +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b">> ActionPopupWidget to allow popups to be dismissed +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4740">> the EditWidget to pass all attributes through to the sub-widget +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653">> LinkCatcherWidget to pass keyboard modifier status to actions +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5154">> RadioWidget to support actions +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5158">> RangeWidget to support actions +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/3406b98af62def252bcb0f7df8a72ed4b74818eb">> "autocomplete" attribute to the EditTextWidget and EditWidget +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5088">> incorrect behaviour of default values with [[lookup Operator]] +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac">> [[has Operator]] when used with the ''tags'' field +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5222">> crash when using [[edition Operator]] in the browser + + +! Filter Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4964">> support for multiple operands for filter operators +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5080">> [[power Operator]] and [[log Operator]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b">> new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4">> new [[sortsub Operator]] for sorting by a user defined subfilter +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4785">> new [[format Operator]] for formatting dates +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4811">> the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4991">> new [[draft Operator|is Operator]] to check if a tiddler is a draft of another tiddler +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4973">> new [[search-replace Operator]] to search and replace in strings +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4948">> new [[enlist-input Operator]] to parse its input titles as a title lists +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4915">> support for named filter run prefixes +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4918">> new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4959">> new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5196">> new [[:reduce filter run prefix|Filter Expression]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4990">> new [[toggle Operator]] to toggle a title in a list +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5021">> new [[cycle Operator]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5146">> new [[pad Operator]] +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5191">> [[jsonstringify Operator]] and [[stringify Operator]] to support "rawunicode" suffix + +! Hackability Improvements + +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/1446a1e44cd084b0905f3fdcd8b339f23edf2384">> the [[WidgetMessage: tm-scroll]] message to allow the target element to be specified by a CSS selector, making it possible to scroll to positions within a tiddler +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5113">> the mechanism for [[Customising Tiddler File Naming]] to: +** Save drafts to a special folder for each user +** Allow filters in $:/config/FileSystemPaths to change the path of a tiddler file on disk +** Allow filters in $:/config/FileSystemExtensions to change the extension of a tiddler file on disk +** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c1a1e272cc9b823f97f8f1bde6a24dfa5fe973e8">> `th-make-tiddler-path` hook for low-level control of tiddler path construction +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5027">> modals to incorporate a NavigatorWidget so that links work as expected +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10">> the [[Table-of-Contents Macros]] to support custom link targets +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4777">> new Hyperdrive saver for use with Beaker Browser v1.0 +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52">> [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df">> support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe">> support for SVG favicons +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/f760a2fa796d57e61307a5ea5274d6cd0b6484c7">> `th-saving-tiddler` hook to include information about the draft tiddler (see https://tiddlywiki.com/dev/#Hook%3A%20th-saving-tiddler) +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4723">> [[WidgetMessage: tm-rename-tiddler]] to control whether relinking occurs +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4741">> [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb">> the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4724">> original event to `tm-navigate` event +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852">> the password prompt to enable it to be customised +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e">> syncer to enable syncadaptors to customise the login prompt +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4979">> support for switching page templates +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/a1b486436e9278078c524c6aa11f7f4de6cbc877">> the [[tabs Macro]] to support `actions` and `explicitState` attributes +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4906">> (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/pull/4907">>) filters used for syncing on node.js and saving the single file version to exclude multiple story lists and history lists based on their prefix, as well as multiple tiddlers that might be used for the import process +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420">> post-render startup actions +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/f7f55e8eff8b172d8fd04f095781efa2420b1be6">> support for username/password parameters for `tm-login` message +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4914">> [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2">> support for the content type `image/jpg` (the correct type is `image/jpeg` but the misspelling is common so most browsers now support it) +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4908">> support for an override saver +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4923">> utility CSS classes to replace use of ` ` to introduce visual separation +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4983">> option to configure the tag used for TableOfContents in the menubar +* <<.link-badge-modified "https://github.com/Jermolene/TiddlyWiki5/pull/4971">> the KeyboardWidget to not trap keys if there are no actions to be invoked +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4975">> buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary` +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4985">> all instance of the [[tabs Macro]] in the core to use the explicitState attribute +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5000">> support for the `meta` key as a modifier in actions +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c854e518faa2d2661b7b7278634b10607ab0a5f5">> support for $:/info/darkmode to the InfoMechanism, reflecting the browser dark mode vs. light mode setting +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4200">> `story.js` to remove dependency on `wiki.js` for story start up and navigator + +! Bug Fixes + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/fe8606759ebf1db50c57a2e779b086a6d7df2ae6">> parsing of dates from 0 to 100CE +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/6a91dbfe2f6e52512d7f063b6d5e3742ff77126d">> handling of negative dates (see [[Date Fields]] and DateFormat) +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5126">> "409 conflict" errors with the ~GitHub saver when saving within 60 seconds of the last save +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4987">> behaviour of system tiddler syncing with the client server configuration. By default, changes to system tiddlers are not synced from the server to the client, restoring the behaviour from v5.1.21 and earlier. Bidirectional syncing of system tiddlers can be enabled with the configuration tiddler $:/config/SyncSystemTiddlersFromServer +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/cc3462999b80461fe30b8f4b4f272ccfbbb78b35">> content type of imported `.tid` files that do not have a `type` field +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4632">> hover effect for search dropdown items +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4584">> restored missing parameter to `saveTiddler()` method of syncadaptors +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04">> MakeLibraryCommand to skip non-directories +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4601">> erroneous use of `$tw.wiki` +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4647">> ''class'' attribute of DroppableWidget +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4634">> high CPU usage with animated syncing icon introduced in v5.1.22 +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/4591">> $:/config/NewJournal/Tags appearing in tag dropdowns +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4658">> popups not being cancelled when clicking within a text editor +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4676">> issue with [[timeline Macro]] and invalid date values +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4682">> hover colours of tag dropdowns in the sidebar +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4683">> alignment of tag pill icons +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4696">> crash with droppable widget +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4674">> issue with adding tags in $:/Manager +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4686">> edit template "type" dropdown positioning +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4687">> edit template field dropdown positioning +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4704">> (with <<.link-badge-addendum "https://github.com/Jermolene/TiddlyWiki5/pull/4705">>) syntax error in ScrollableWidget +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4711">> extraneous system tiddlers created during import process +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4780">> problem with headers not being treated case insensitively +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/a2796d89ab3dbf4a15b63b0f4623387fdc6acd5b">> problem with `Content-Type` HTTP header sent as `Content-type` +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4776">> EntityWidget not refreshing correctly +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4774">> [[Markdown Plugin]] to honour alignment directives +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/f74c49f393da3213abadaa52dd09940d708ea635">> syncing issues with external JS template +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4813">> incorrect base64 encoding of astral plane Unicode text +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4770">> server error when saving a new tiddler created by following a tiddler link +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4751">> a `plugin-priority` field to the TiddlyWeb plugin so that language plugins can override its language strings +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4853">> bug whereby joining an empty list would not return an empty list +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/59f233cd46616646fa8889f65aa9cc7d704d8c9a">> bug exporting tiddlers with double quoted titles +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/4900">> bug with syncing plugin tiddlers +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/4877891980f077c6c31e99cc6a9eb45b5d1230e1">> bug with the position of the tiddler title when there is no icon in use +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/3153c588ecddfdc97cc8289720d36b1fb15ef236">> unwanted autosave in the upgrade wizard +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4938">> problem whereby `$:/temp` tiddlers were being saved in single file wikis +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4839">> a bug with the `sortan` filter operator when used with date fields +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4947">> a bug for location hashes that contain a `#` character +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5055">> default branch to ''main'' for saving to ~GitHub +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/7327a3fb92fa2ae17d7264c66ab0409d43b18fdc">> shadow tiddlers not refreshing when their plugin is deleted or modified +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5129">> `tc-dirty` class not appearing on external windows +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5148">> `static.tiddler.html` template to make rendered tiddlers full-width ! Translation Improvements @@ -24,207 +240,6 @@ type: text/vnd.tiddlywiki * Improved French translation * Improved German translation -! Performance Improvements - -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4659]] templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4954]] ListWidget to not initialize parsers for blank `emptyMessage` attributes -* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/5206]] filter execution to use a more efficient linked list structure for intermediate results -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5205]] filter mechanism to cache the result of parsing macros which don't use text substitution - -! Plugin Improvements - -* Freelinks Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3]] (and [[here|https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd]]) support for ignoring case when matching titles -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/05e6c1bf62cd51df6aa025d0ad07f7959cde6fa0]] bug with autolinking within HTML `<a>` elements -* Twitter Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3a20fb1e3a41a032574d227a8c770a11ae0a5d58]] warning if wiki needs to be saved and reloaded -* [[Dynaview Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/b0e40e86413c1769c8be8a84652b66ef6ac8b997]] examples (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/f7fe47914e19ba7198b7768ca832ee03c289a2bc]]) -* [[CodeMirror Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4662]] issue with `e.toggleComment` being undefined with CodeMirror Sublime keymap -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4950]] CodeMirror plugins to version 5.58.3 -* [[Markdown Plugin]] -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4680]] encoding of Markdown image files -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/e01b354f7d9e137cb355f7090f5e68661a4ead41]] issue with whitespace and linebreaks -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4862]] ''tc-tiddlylink-external'' class to external links -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4771]] to add `rel="noopener noreferrer"` to external links -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] to use palette colours -* [[Amazon Web Services Plugin]] -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa]] a new ''aws-encodeuricomponent'' filter that also encodes single quotes -* ~BibTeX Plugin -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/f863acf8ac716dbf892f2d63efa0a130aadfec6a]] to a later fork of the underlying third party ~BibTeX parsing library -* Menubar Plugin -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4974]] so the top margin of the side bar adjusts to the height of the menu -* Dynannotate Plugin -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f]] examples of usage in the View Template -* External Attachments Plugin -** [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4549]] a bug with relative paths in the External Attachments plugin -* [[Highlight Plugin]] -** [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/5128]] to use palette colours - -! Usability Improvements - -* [[Renamed|https://github.com/Jermolene/TiddlyWiki5/pull/5143]] "references" to "backlinks" in the tiddler info panel -* Several improvements to the import mechanism: -** [[Improved|https://github.com/Jermolene/TiddlyWiki5/commit/527638d5e60114653385ed39dc55c736a67e58d2]] status messages in the import listing -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5067]] colour coding for import items that will overwrite existing tiddlers, and for other warnings -** [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4937]] the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a]] warning message about using the online plugin library with the client-server configuration -* [[Changed|https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e]] favicon for the prerelease edition -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e]] the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) -* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9]] normalize.css's styling of search input fields and [[updated|https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a]] to a modern fork of normalize.css -* [[Removed|https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b]] unneeded editor toolbar buttons when editing SVG tiddlers -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5089]] global keyboard shortcut for switching layouts -* [[Hide|https://github.com/Jermolene/TiddlyWiki5/commit/1d7091e637462dcda8c28d660ca42c073f647043]] the `.tid` exporter when more than one tiddler to export - -! Palette Improvements - -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5092]] new "Desert Sand" palette -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5100]] new "Cupertino Dark" palette -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c]] "Solarized Dark" palette -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4590]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/commit/274a07b4fd2ca2d1b95c8ddf52fe055c44260d9b]]) the Vanilla theme to optionally use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] -* [[Improved|https://github.com/Jermolene/TiddlyWiki5/pull/4585]] Gruvbox palette readability of toolbar buttons - -! Keyboard Handling Improvements - -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4791]] a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls -* Added keyboard support: -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4909]] keyboard support for cycling through the tabs in $:/AdvancedSearch -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4921]] keyboard support for navigating the field name dropdown in the Edit Template -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4989]] keyboard support or navigating the `type` field input in the Edit Template -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4919]] keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4927]] keyboard shortcut for saving the wiki -** [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4978]] keyboard shortcut for deleting a field in the Edit Template -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4952]] a keyboard shortcut to change the sidebar layout - - -! Widget Improvements - -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5037]] new ActionConfirm widget -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5091]] ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5086]] EventCatcherWidget for low level event handling -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5087]] the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/1b31c25ea77ee4dce86a9aac4375337423ebd3a6]] new LogWidget and ActionLogWidget to help debugging -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5014]] support for ''disabled'' attribute to EditWidget, EditTextWidget, CheckboxWidget, RadioWidget and RangeWidget -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5010]] support for ''disabled'' attribute to ButtonWidget -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f]] the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105]] LinkWidget to work within SVG elements -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f]] ''accept'' attribute to the BrowseWidget -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b]] ActionPopupWidget to allow popups to be dismissed -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4740]] the EditWidget to pass all attributes through to the sub-widget -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653]] LinkCatcherWidget to pass keyboard modifier status to actions -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5154]] RadioWidget to support actions -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5158]] RangeWidget to support actions -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/3406b98af62def252bcb0f7df8a72ed4b74818eb]] "autocomplete" attribute to the EditTextWidget and EditWidget -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5088]] incorrect behaviour of default values with [[lookup Operator]] -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac]] [[has Operator]] when used with the ''tags'' field -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5222]] crash when using [[edition Operator]] in the browser - - -! Filter Improvements - -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4964]] support for multiple operands for filter operators -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5080]] [[power Operator]] and [[log Operator]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b]] new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4]] new [[sortsub Operator]] for sorting by a user defined subfilter -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4785]] new [[format Operator]] for formatting dates -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4811]] the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4991]] new [[draft Operator|is Operator]] to check if a tiddler is a draft of another tiddler -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4973]] new [[search-replace Operator]] to search and replace in strings -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4948]] new [[enlist-input Operator]] to parse its input titles as a title lists -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354]] new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4915]] support for named filter run prefixes -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4918]] new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4959]] new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5196]] new [[:reduce filter run prefix|Filter Expression]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4990]] new [[toggle Operator]] to toggle a title in a list -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5021]] new [[cycle Operator]] -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5146]] new [[pad Operator]] -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5191]] [[jsonstringify Operator]] and [[stringify Operator]] to support "rawunicode" suffix - -! Hackability Improvements - -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/5113]] the mechanism for [[Customising Tiddler File Naming]] to: -** Save drafts to a special folder for each user -** Allow filters in $:/config/FileSystemPaths to change the path of a tiddler file on disk -** Allow filters in $:/config/FileSystemExtensions to change the extension of a tiddler file on disk -** [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c1a1e272cc9b823f97f8f1bde6a24dfa5fe973e8]] `th-make-tiddler-path` hook for low-level control of tiddler path construction -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5027]] modals to incorporate a NavigatorWidget so that links work as expected -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10]] the [[Table-of-Contents Macros]] to support custom link targets -* [[Adedd|https://github.com/Jermolene/TiddlyWiki5/pull/4777]] new Hyperdrive saver for use with Beaker Browser v1.0 -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52]] [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df]] support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe]] support for SVG favicons -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/f760a2fa796d57e61307a5ea5274d6cd0b6484c7]] `th-saving-tiddler` hook to include information about the draft tiddler (see https://tiddlywiki.com/dev/#Hook%3A%20th-saving-tiddler) -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4723]] [[WidgetMessage: tm-rename-tiddler]] to control whether relinking occurs -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4741]] [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb]] the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4724]] original event to `tm-navigate` event -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852]] the password prompt to enable it to be customised -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e]] syncer to enable syncadaptors to customise the login prompt -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4979]] support for switching page templates -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/commit/a1b486436e9278078c524c6aa11f7f4de6cbc877]] the [[tabs Macro]] to support `actions` and `explicitState` attributes -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4906]] (and [[here|https://github.com/Jermolene/TiddlyWiki5/pull/4907]]) filters used for syncing on node.js and saving the single file version to exclude multiple story lists and history lists based on their prefix, as well as multiple tiddlers that might be used for the import process -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420]] post-render startup actions -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/f7f55e8eff8b172d8fd04f095781efa2420b1be6]] support for username/password parameters for `tm-login` message -* [[Extended|https://github.com/Jermolene/TiddlyWiki5/pull/4914]] [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2]] support for the content type `image/jpg` (the correct type is `image/jpeg` but the misspelling is common so most browsers now support it) -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4908]] support for an override saver -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4923]] utility CSS classes to replace use of ` ` to introduce visual separation -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4983]] option to configure the tag used for TableOfContents in the menubar -* [[Modified|https://github.com/Jermolene/TiddlyWiki5/pull/4971]] the KeyboardWidget to not trap keys if there are no actions to be invoked -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4975]] buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary` -* [[Updated|https://github.com/Jermolene/TiddlyWiki5/pull/4985]] all instance of the [[tabs Macro]] in the core to use the explicitState attribute -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/5000]] support for the `meta` key as a modifier in actions -* [[Added|https://github.com/Jermolene/TiddlyWiki5/commit/c854e518faa2d2661b7b7278634b10607ab0a5f5]] support for $:/info/darkmode to the InfoMechanism, reflecting the browser dark mode vs. light mode setting -* [[Refactored|https://github.com/Jermolene/TiddlyWiki5/pull/4200]] `story.js` to remove dependency on `wiki.js` for story start up and navigator - -! Bug Fixes - -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/fe8606759ebf1db50c57a2e779b086a6d7df2ae6]] parsing of dates from 0 to 100CE -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/6a91dbfe2f6e52512d7f063b6d5e3742ff77126d]] handling of negative dates (see [[Date Fields]] and DateFormat) -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5126]] "409 conflict" errors with the ~GitHub saver when saving within 60 seconds of the last save -* [[Restored|https://github.com/Jermolene/TiddlyWiki5/pull/4987]] behaviour of system tiddler syncing with the client server configuration. By default, changes to system tiddlers are not synced from the server to the client, restoring the behaviour from v5.1.21 and earlier. Bidirectional syncing of system tiddlers can be enabled with the configuration tiddler $:/config/SyncSystemTiddlersFromServer -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/cc3462999b80461fe30b8f4b4f272ccfbbb78b35]] content type of imported `.tid` files that do not have a `type` field -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4632]] hover effect for search dropdown items -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4584]] restored missing parameter to `saveTiddler()` method of syncadaptors -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04]] MakeLibraryCommand to skip non-directories -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4601]] erroneous use of `$tw.wiki` -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4647]] ''class'' attribute of DroppableWidget -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4634]] high CPU usage with animated syncing icon introduced in v5.1.22 -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4591]] $:/config/NewJournal/Tags appearing in tag dropdowns -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4658]] popups not being cancelled when clicking within a text editor -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4676]] issue with [[timeline Macro]] and invalid date values -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4682]] hover colours of tag dropdowns in the sidebar -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4683]] alignment of tag pill icons -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4696]] crash with droppable widget -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4674]] issue with adding tags in $:/Manager -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4686]] edit template "type" dropdown positioning -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4687]] edit template field dropdown positioning -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4704]] (with [[addendum|https://github.com/Jermolene/TiddlyWiki5/pull/4705]]) syntax error in ScrollableWidget -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4711]] extraneous system tiddlers created during import process -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4780]] problem with headers not being treated case insensitively -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/a2796d89ab3dbf4a15b63b0f4623387fdc6acd5b]] problem with `Content-Type` HTTP header sent as `Content-type` -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4776]] EntityWidget not refreshing correctly -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4774]] [[Markdown Plugin]] to honour alignment directives -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/f74c49f393da3213abadaa52dd09940d708ea635]] syncing issues with external JS template -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4813]] incorrect base64 encoding of astral plane Unicode text -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4770]] server error when saving a new tiddler created by following a tiddler link -* [[Added|https://github.com/Jermolene/TiddlyWiki5/pull/4751]] a `plugin-priority` field to the TiddlyWeb plugin so that language plugins can override its language strings -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4853]] bug whereby joining an empty list would not return an empty list -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/59f233cd46616646fa8889f65aa9cc7d704d8c9a]] bug exporting tiddlers with double quoted titles -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/issues/4900]] bug with syncing plugin tiddlers -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/4877891980f077c6c31e99cc6a9eb45b5d1230e1]] bug with the position of the tiddler title when there is no icon in use -* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/commit/3153c588ecddfdc97cc8289720d36b1fb15ef236]] autosave in the upgrade wizard -* [[Disabled|https://github.com/Jermolene/TiddlyWiki5/pull/4938]] saving of `$:/temp` tiddlers in single file wikis -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4839]] a bug with the `sortan` filter operator when used with date fields -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/4947]] a bug for location hashes that contain a `#` character -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5055]] default branch to ''main'' for saving to ~GitHub -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/commit/7327a3fb92fa2ae17d7264c66ab0409d43b18fdc]] shadow tiddlers not refreshing when their plugin is deleted or modified -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5129]] `tc-dirty` class not appearing on external windows -* [[Fixed|https://github.com/Jermolene/TiddlyWiki5/pull/5148]] `static.tiddler.html` template to make rendered tiddlers full-width - ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: diff --git a/editions/tw5.com/tiddlers/system/doc-macros.tid b/editions/tw5.com/tiddlers/system/doc-macros.tid index 26262d8f9..40214259c 100644 --- a/editions/tw5.com/tiddlers/system/doc-macros.tid +++ b/editions/tw5.com/tiddlers/system/doc-macros.tid @@ -113,4 +113,21 @@ This is an example tiddler. See [[Table-of-Contents Macros (Examples)]]. </$list> \end +\define .link-badge(text,link,colour) +<a href=<<__link__>> class="doc-link-badge" style="background-color:$colour$;" target="_blank" rel="noopener noreferrer"><$text text=<<__text__>>/></a> +\end + + +\define .link-badge-added(link,colour:#ffe246) <<.link-badge "added" """$link$""" """$colour$""">> +\define .link-badge-addendum(link,colour:#fcc84a) <<.link-badge "addendum" """$link$""" """$colour$""">> +\define .link-badge-extended(link,colour:#f9a344) <<.link-badge "extended" """$link$""" """$colour$""">> +\define .link-badge-fixed(link,colour:#f88b40) <<.link-badge "fixed" """$link$""" """$colour$""">> +\define .link-badge-here(link,colour:#d88e63) <<.link-badge "here" """$link$""" """$colour$""">> +\define .link-badge-hide(link,colour:#9d959f) <<.link-badge "hide" """$link$""" """$colour$""">> +\define .link-badge-improved(link,colour:#7593c7) <<.link-badge "improved" """$link$""" """$colour$""">> +\define .link-badge-modified(link,colour:#7f99c9) <<.link-badge "modified" """$link$""" """$colour$""">> +\define .link-badge-removed(link,colour:#a9aabc) <<.link-badge "removed" """$link$""" """$colour$""">> +\define .link-badge-renamed(link,colour:#b4b995) <<.link-badge "renamed" """$link$""" """$colour$""">> +\define .link-badge-updated(link,colour:#91ba66) <<.link-badge "updated" """$link$""" """$colour$""">> + <pre><$view field="text"/></pre> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/system/doc-styles.tid b/editions/tw5.com/tiddlers/system/doc-styles.tid index 94e89d5f7..2e33a266c 100644 --- a/editions/tw5.com/tiddlers/system/doc-styles.tid +++ b/editions/tw5.com/tiddlers/system/doc-styles.tid @@ -202,4 +202,18 @@ tr.doc-table-subheading { width: 1em; height: 1em; vertical-align: text-bottom; -} \ No newline at end of file +} + +.doc-link-badge { + text-decoration: none; + background-color: #7eba4c; + color: <<colour foreground>>; + padding: 3px; + border-radius: 4px; + font-weight: bold; + font-size: 0.75em; +} + +.doc-link-badge:hover { + text-decoration: underline; +} From 8e61e37f2bbb74c60086624b446cc563ea82774d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 24 Dec 2020 13:10:44 +0000 Subject: [PATCH 1154/2376] Release note: More tweaks and reformatting --- .../prerelease/tiddlers/Release 5.1.23.tid | 299 +++++++++--------- .../tw5.com/tiddlers/system/doc-macros.tid | 2 +- .../tw5.com/tiddlers/system/doc-styles.tid | 6 + 3 files changed, 165 insertions(+), 142 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index dc98836fb..f55767fe4 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -7,24 +7,162 @@ type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...master]]// +<div class="doc-plain-list"> + ! Performance Improvements -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4659">> templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4954">> ListWidget to not initialize parsers for blank `emptyMessage` attributes * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5206">> filter execution to use a more efficient linked list structure for intermediate results * <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5205">> widget mechanism to cache the result of parsing macros which don't use text substitution +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4659">> page templates to use a single VarsWidget instead of several [[SetVariableWidgets|SetVariableWidget]], for improved performance and easier debugging +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4954">> ListWidget to not initialize parsers for blank `emptyMessage` attributes + +! Usability Improvements + +* <<.link-badge-renamed "https://github.com/Jermolene/TiddlyWiki5/pull/5143">> "references" to "backlinks" in the tiddler info panel +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a">> warning message about using the online plugin library with the client-server configuration +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e">> favicon for the prerelease edition +* <<.link-badge-removed "https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9">> normalize.css's styling of search input fields and <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a">> to a modern fork of normalize.css +* <<.link-badge-removed "https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b">> unneeded editor toolbar buttons when editing SVG tiddlers +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5089">> global keyboard shortcut for switching layouts +* <<.link-badge-hide "https://github.com/Jermolene/TiddlyWiki5/commit/1d7091e637462dcda8c28d660ca42c073f647043">> the `.tid` exporter when more than one tiddler to export + +! Import Mechanism Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4937">> support for renaming tiddlers and a warning about overwriting existing tiddlers +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5067">> colour coding for import items that will overwrite existing tiddlers, and for other warnings +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/commit/527638d5e60114653385ed39dc55c736a67e58d2">> other warnings in the import listing +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/cc3462999b80461fe30b8f4b4f272ccfbbb78b35">> content type of imported `.tid` files that do not have a `type` field +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4711">> extraneous system tiddlers created during import process + +! Palette Improvements + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e">> the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5092">> new "Desert Sand" palette +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5100">> new "Cupertino Dark" palette +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c">> "Solarized Dark" palette +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4590">> (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/commit/274a07b4fd2ca2d1b95c8ddf52fe055c44260d9b">>) the Vanilla theme to optionally use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4585">> "Gruvbox" palette readability of toolbar buttons + +! Keyboard Handling Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4725">> support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4791">> a ''tabIndex'' property to the tiddler editor input area to make it easier to use the <kbd>tab</kbd> key to move between edit controls +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4909">> keyboard support for cycling through the tabs in $:/AdvancedSearch +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4921">> keyboard support for navigating the field name dropdown in the Edit Template +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4989">> keyboard support or navigating the `type` field input in the Edit Template +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4919">> keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4927">> a keyboard shortcut for saving the wiki +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4978">> a keyboard shortcut for deleting a field in the edit template +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4952">> a keyboard shortcut to change the sidebar layout + +! Widget Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5086">> EventCatcherWidget for low level event handling +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1b31c25ea77ee4dce86a9aac4375337423ebd3a6">> new LogWidget and ActionLogWidget to help debugging +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5037">> new ActionConfirmWidget to prompt the user for simple yes/no questions +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5091">> ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5087">> the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5014">> support for ''disabled'' attribute to EditWidget, EditTextWidget, CheckboxWidget, RadioWidget and RangeWidget +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5010">> support for ''disabled'' attribute to ButtonWidget +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f">> the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105">> the LinkWidget to work within SVG elements +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f">> ''accept'' attribute to the BrowseWidget +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b">> the ActionPopupWidget to allow popups to be dismissed +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4740">> the EditWidget to pass all attributes through to the sub-widget +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653">> the LinkCatcherWidget to pass keyboard modifier status to actions +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5154">> the RadioWidget to support actions +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5158">> the RangeWidget to support actions +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/3406b98af62def252bcb0f7df8a72ed4b74818eb">> ''autocomplete'' attribute to the EditTextWidget and EditWidget +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5088">> incorrect behaviour of default values with [[lookup Operator]] +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac">> [[has Operator]] when used with the ''tags'' field +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5222">> crash when using [[edition Operator]] in the browser +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4647">> ''class'' attribute of DroppableWidget + +! Filter Improvements + +New capabilities: + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4964">> support for multiple operands for filter operators + +New filter run prefixes: + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4915">> support for named filter run prefixes +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4918">> new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4959">> new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5196">> new [[:reduce filter run prefix|Filter Expression]] + +New operators: + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5080">> new [[power Operator]] and [[log Operator]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4991">> new [[draft Operator|is Operator]] to check if a tiddler is a draft of another tiddler +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4973">> new [[search-replace Operator]] to search and replace in strings +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4948">> new [[enlist-input Operator]] to parse its input titles as a title lists +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b">> new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4">> new [[sortsub Operator]] for sorting by a user defined subfilter +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4785">> new [[format Operator]] for formatting dates +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4990">> new [[toggle Operator]] to toggle a title in a list +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5021">> new [[cycle Operator]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5146">> new [[pad Operator]] + +Other improvements: + +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4811">> the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5191">> [[jsonstringify Operator]] and [[stringify Operator]] to support "rawunicode" suffix + +! Tiddler File Naming Improvements + +<<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5113">> the mechanism for [[Customising Tiddler File Naming]] to: + +* Save drafts to a special folder for each user +* Allow filters in $:/config/FileSystemPaths to change the path of a tiddler file on disk +* Allow filters in $:/config/FileSystemExtensions to change the extension of a tiddler file on disk +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c1a1e272cc9b823f97f8f1bde6a24dfa5fe973e8">> `th-make-tiddler-path` hook for low-level control of tiddler path construction +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4914">> [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location + +! Hackability Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4979">> basic support for switching page templates +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/1446a1e44cd084b0905f3fdcd8b339f23edf2384">> the [[WidgetMessage: tm-scroll]] message to allow the target element to be specified by a CSS selector, making it possible to scroll to positions within a tiddler +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5027">> modals to incorporate a NavigatorWidget so that links work as expected +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10">> the [[Table-of-Contents Macros]] to support custom link targets +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4777">> new Hyperdrive saver for use with Beaker Browser v1.0 +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52">> [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df">> support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe">> support for SVG favicons +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/f760a2fa796d57e61307a5ea5274d6cd0b6484c7">> `th-saving-tiddler` hook to include information about the draft tiddler (see https://tiddlywiki.com/dev/#Hook%3A%20th-saving-tiddler) +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4723">> [[WidgetMessage: tm-rename-tiddler]] to control whether relinking occurs +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4741">> [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb">> the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4724">> original event to `tm-navigate` event +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852">> the password prompt to enable it to be customised +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e">> syncer to enable syncadaptors to customise the login prompt +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/a1b486436e9278078c524c6aa11f7f4de6cbc877">> the [[tabs Macro]] to support `actions` and `explicitState` attributes +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4906">> (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/pull/4907">>) filters used for syncing on node.js and saving the single file version to exclude multiple story lists and history lists based on their prefix, as well as multiple tiddlers that might be used for the import process +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420">> post-render startup actions +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/f7f55e8eff8b172d8fd04f095781efa2420b1be6">> support for username/password parameters for `tm-login` message +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2">> support for the content type ''image/jpg'' (the correct type is ''image/jpeg'' but the misspelling is common so most browsers now support it) +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4908">> support for an override saver +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4923">> utility CSS classes to replace use of ` ` to introduce visual separation +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4983">> option to configure the tag used for TableOfContents in the menubar +* <<.link-badge-modified "https://github.com/Jermolene/TiddlyWiki5/pull/4971">> the KeyboardWidget to not trap keys if there are no actions to be invoked +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4975">> buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type ''application/javascript'',''application/json'' and ''application/x-tiddler-dictionary'' +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4985">> all instance of the [[tabs Macro]] in the core to use the explicitState attribute +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5000">> support for the <kbd>meta</kbd> key as a modifier in actions +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c854e518faa2d2661b7b7278634b10607ab0a5f5">> support for $:/info/darkmode to the InfoMechanism, reflecting the browser dark mode vs. light mode setting +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4200">> `story.js` to remove dependency on `wiki.js` for story start up and navigator ! Plugin Improvements !! [[JSZip Plugin]] -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf">> the [[JSZip Plugin]] with the ability to dynamically create Zip files, and thus to conveniently build multi-file static sites within the browser +<<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/6a0ff7db1807f45b73061ced82f5a85f1a529bbf">> the [[JSZip Plugin]] with the ability to dynamically create Zip files, and thus to conveniently build multi-file static sites within the browser !! [[Consent Banner Plugin]] -<<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1">> - -The new [[Consent Banner Plugin]] plugin helps make websites that are compliant with "cookie legislation" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]]. +<<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4a84ed0018df7fd67000404bb5ef8a7ca50509c1">> the new [[Consent Banner Plugin]] plugin helps make websites that are compliant with "cookie legislation" such as the [[EU General Data Protection Regulation|https://gdpr.eu/cookies/]]. It presents a banner inviting the user to accept or reject cookies, keeping track of their consent in local storage so that the banner can be hidden on subsequent visits. By default, content embedded with <iframe>, <embed> and <object> is blocked unless the user consents to accept cookies. @@ -33,7 +171,7 @@ Consent status is available via a configuration tiddler so that it is possible Please note that using this plugin does not guarantee compliance with any particular legislation. You will need to understand the technical issues specific to your situation, and if necessary seek legal advice. -!! [[Freelinks Plugin]] +!! Freelinks Plugin * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1f354a972e0217e034d1f59d31577c1fd6b186f3">> (and <<.link-badge-here "https://gitxhub.com/Jermolene/TiddlyWiki5/commit/c9692d7a508cfdb0446e67061201961dca64d8dd">>) support for ignoring case when matching titles @@ -54,150 +192,36 @@ Please note that using this plugin does not guarantee compliance with any partic * <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5128">> to use palette colours !! [[Amazon Web Services Plugin]] * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/0338f0fee23d176a94de9009492d2e43a916fbfa">> a new ''aws-encodeuricomponent'' filter that also encodes single quotes -!! [[BibTeX Plugin]] +!! ~BibTeX Plugin * <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/f863acf8ac716dbf892f2d63efa0a130aadfec6a">> to a later fork of the underlying third party ~BibTeX parsing library -!! [[Menubar Plugin]] +!! Menubar Plugin * <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4974">> so the top margin of the side bar adjusts to the height of the menu -!! [[Dynannotate Plugin]] +!! Dynannotate Plugin * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4394b8e723f78b3d2562a95155aeb91a3d6bbd5f">> examples of usage in the View Template !! [[External Attachments Plugin]] * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/4549">> a bug with relative paths in the [[External Attachments Plugin]] !! [[Highlight Plugin]] * <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5128">> to use palette colours -! Usability Improvements +!! Translation Plugins -* <<.link-badge-renamed "https://github.com/Jermolene/TiddlyWiki5/pull/5143">> "references" to "backlinks" in the tiddler info panel -* Several improvements to the import mechanism: -** <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/527638d5e60114653385ed39dc55c736a67e58d2">> status messages in the import listing -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5067">> colour coding for import items that will overwrite existing tiddlers, and for other warnings -** <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4937">> the Import UI to allow renaming tiddlers and to warn about tiddlers that already exist -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1546a4a1895b93a47b79c9d37b94be039604443a">> warning message about using the online plugin library with the client-server configuration -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/9cd5415dfe54b47819920aa3cf6ac2d5e3a9188e">> favicon for the prerelease edition -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/484c9e986fc6f323e30460a88f134da3a4e8a89e">> the $:/PaletteManager to show "indirect" colours (ie, colours defined by another `<<colour>>` macro) -* <<.link-badge-removed "https://github.com/Jermolene/TiddlyWiki5/commit/22e25c05eb5e5cc5b670a362d1eead1d62dedbb9">> normalize.css's styling of search input fields and <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/9003c810393d90ee20db083fda35b6469acc592a">> to a modern fork of normalize.css -* <<.link-badge-removed "https://github.com/Jermolene/TiddlyWiki5/commit/bb6fee4e1c79a2b1cbf75cd0326ecb8fb1ccb86b">> unneeded editor toolbar buttons when editing SVG tiddlers -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5089">> global keyboard shortcut for switching layouts -* <<.link-badge-hide "https://github.com/Jermolene/TiddlyWiki5/commit/1d7091e637462dcda8c28d660ca42c073f647043">> the `.tid` exporter when more than one tiddler to export +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/tree/master/languages/ar-PS">> new Arabic (Palestine) translation +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/tree/master/languages/ca-ES">> Catalan translation +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/tree/master/languages/zh-Hans">> (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/tree/master/languages/zh-Hant">>) Chinese translation +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/tree/master/languages/nl-NL">> Dutch translation +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/tree/master/languages/fr-FR">> French translation +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/tree/master/languages/de-DE">> German translation -! Palette Improvements - -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5092">> new "Desert Sand" palette -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5100">> new "Cupertino Dark" palette -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/8cf458d3b3f1e38c14a2819529e08dca4a7e297c">> "Solarized Dark" palette -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4590">> (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/commit/274a07b4fd2ca2d1b95c8ddf52fe055c44260d9b">>) the Vanilla theme to optionally use palette colours for the [[browser selection outline|https://developer.mozilla.org/en-US/docs/Web/CSS/::selection]] -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4585">> Gruvbox palette readability of toolbar buttons - -! Keyboard Handling Improvements - -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4725">> support for navigating the search and new tag dropdowns via the keyboard. The [[keyboard-driven-input Macro]] can be used to add this capability to other dropdowns -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4791">> a 'tabIndex' property to the tiddler editor input area to make it easier to use the tab key to move between edit controls -* Added keyboard support: -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4909">> keyboard support for cycling through the tabs in $:/AdvancedSearch -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4921">> keyboard support for navigating the field name dropdown in the Edit Template -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4989">> keyboard support or navigating the `type` field input in the Edit Template -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4919">> keyboard support for using the ''insert wikilink'' toolbar dropdown in the Edit Template -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4927">> keyboard shortcut for saving the wiki -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4978">> keyboard shortcut for deleting a field in the Edit Template -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4952">> a keyboard shortcut to change the sidebar layout - - -! Widget Improvements - -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5037">> new ActionConfirm widget -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5091">> ButtonWidget and DroppableWidget so that changing the class attribute does not trigger a refresh. This makes it easier to use classes to trigger CSS animations -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5086">> EventCatcherWidget for low level event handling -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5087">> the RevealWidget to optionally dynamically refresh popup positions when the state tiddler changes -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/1b31c25ea77ee4dce86a9aac4375337423ebd3a6">> new LogWidget and ActionLogWidget to help debugging -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5014">> support for ''disabled'' attribute to EditWidget, EditTextWidget, CheckboxWidget, RadioWidget and RangeWidget -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5010">> support for ''disabled'' attribute to ButtonWidget -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/ae13a0fee118c50169b7835c950df1dade33788f">> the MacroCallWidget to be able to optionally render the raw text of the macro (previously the output was always wikified) -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/e71a27ac2d71f2e48f9e4e9156b59bb3ecc2a105">> LinkWidget to work within SVG elements -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c86a621d5d205e1ae0ce999b90ebe09addc45a9f">> ''accept'' attribute to the BrowseWidget -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/77a929faa3a33768e52cf2a34ecbef9c554a6a7b">> ActionPopupWidget to allow popups to be dismissed -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4740">> the EditWidget to pass all attributes through to the sub-widget -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/95e30138f0b34135031d50c1606e8b0059ca6653">> LinkCatcherWidget to pass keyboard modifier status to actions -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5154">> RadioWidget to support actions -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5158">> RangeWidget to support actions -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/3406b98af62def252bcb0f7df8a72ed4b74818eb">> "autocomplete" attribute to the EditTextWidget and EditWidget -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5088">> incorrect behaviour of default values with [[lookup Operator]] -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/6570561d4ec31d9e64c3021bb69c20daec8c9eac">> [[has Operator]] when used with the ''tags'' field -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5222">> crash when using [[edition Operator]] in the browser - - -! Filter Improvements - -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[filter|filter Operator]] and [[reduce|reduce Operator]] operators for processing lists of items -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4964">> support for multiple operands for filter operators -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5080">> [[power Operator]] and [[log Operator]] -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4966f6ab625c8ce2c9f0812a726ba928d68ea00b">> new [[slugify Operator]] and [[duplicateslugs Operator]] for generating human readable filenames/URLs -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/619c0752bd3c6e71d1fcdb74daa03cfe8257afe4">> new [[sortsub Operator]] for sorting by a user defined subfilter -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4785">> new [[format Operator]] for formatting dates -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4811">> the [[trim Operator]] to optionally trim a given string instead of whitespace, and trim from front, back, or both sides of input tiddlers -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4991">> new [[draft Operator|is Operator]] to check if a tiddler is a draft of another tiddler -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4973">> new [[search-replace Operator]] to search and replace in strings -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4948">> new [[enlist-input Operator]] to parse its input titles as a title lists -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[reduce Operator]] to apply a subfilter to each input title in turn, accumulating a single value -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/14a28b77796461c9167898793ab9851e029e0354">> new [[filter Operator]] to apply a subfilter to each input title and return the titles that return a non-empty result from the subfilter -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4915">> support for named filter run prefixes -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4918">> new [[:filter filter run prefix|Filter Expression]] which is analagous to the new [[filter Operator]] but applies to a filter run -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4959">> new [[:intersection filter run prefix|Filter Expression]] to get the intersection of two filter runs -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5196">> new [[:reduce filter run prefix|Filter Expression]] -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4990">> new [[toggle Operator]] to toggle a title in a list -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5021">> new [[cycle Operator]] -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5146">> new [[pad Operator]] -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5191">> [[jsonstringify Operator]] and [[stringify Operator]] to support "rawunicode" suffix - -! Hackability Improvements - -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/1446a1e44cd084b0905f3fdcd8b339f23edf2384">> the [[WidgetMessage: tm-scroll]] message to allow the target element to be specified by a CSS selector, making it possible to scroll to positions within a tiddler -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5113">> the mechanism for [[Customising Tiddler File Naming]] to: -** Save drafts to a special folder for each user -** Allow filters in $:/config/FileSystemPaths to change the path of a tiddler file on disk -** Allow filters in $:/config/FileSystemExtensions to change the extension of a tiddler file on disk -** <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c1a1e272cc9b823f97f8f1bde6a24dfa5fe973e8">> `th-make-tiddler-path` hook for low-level control of tiddler path construction -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5027">> modals to incorporate a NavigatorWidget so that links work as expected -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/5af76c5ea10db2b59cc20f963a836c6a9faa8b10">> the [[Table-of-Contents Macros]] to support custom link targets -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4777">> new Hyperdrive saver for use with Beaker Browser v1.0 -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/2a8f7a9c503c9a6e4ea1bcd116be31ab6e90cf52">> [[favicon mechanism|Setting a favicon]] to support ''_canonical_uri'' images -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/48dfadd85b8ebd788b44ed2c46108720742546df">> support for recording the startup timestamp in $:/info/startup-timestamp (see [[InfoMechanism]]) -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/bf6735420d2f8191f658c556910e7d73c681d5fe">> support for SVG favicons -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/f760a2fa796d57e61307a5ea5274d6cd0b6484c7">> `th-saving-tiddler` hook to include information about the draft tiddler (see https://tiddlywiki.com/dev/#Hook%3A%20th-saving-tiddler) -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4723">> [[WidgetMessage: tm-rename-tiddler]] to control whether relinking occurs -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4741">> [[WidgetMessage: tm-import-tiddlers]] to override the title $:/Import and to better control whether the import tiddler is opened automatically -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/bd2cf5c46498222a32ebda92da3ae50bde33decb">> the internal `<$element>` widget to add a hook so that plugins can intercept DOM node creation -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4724">> original event to `tm-navigate` event -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/651fb777abd11c88e58b4bdfbced01d6db508852">> the password prompt to enable it to be customised -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/69c12618d963c711edd72a60427bd15ec4fa0e6e">> syncer to enable syncadaptors to customise the login prompt -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4979">> support for switching page templates -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/a1b486436e9278078c524c6aa11f7f4de6cbc877">> the [[tabs Macro]] to support `actions` and `explicitState` attributes -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4906">> (and <<.link-badge-here "https://github.com/Jermolene/TiddlyWiki5/pull/4907">>) filters used for syncing on node.js and saving the single file version to exclude multiple story lists and history lists based on their prefix, as well as multiple tiddlers that might be used for the import process -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/5cc1600072f5aa50c8ff5f5d2e748d81a7067420">> post-render startup actions -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/f7f55e8eff8b172d8fd04f095781efa2420b1be6">> support for username/password parameters for `tm-login` message -* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/4914">> [[tiddlywiki.files Files]] specification with `isEditableFile` attribute allowing files to be saved back to their original location -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/4c6de2271124fc3a4b01e4324a0d5e401500cca2">> support for the content type `image/jpg` (the correct type is `image/jpeg` but the misspelling is common so most browsers now support it) -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4908">> support for an override saver -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4923">> utility CSS classes to replace use of ` ` to introduce visual separation -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4983">> option to configure the tag used for TableOfContents in the menubar -* <<.link-badge-modified "https://github.com/Jermolene/TiddlyWiki5/pull/4971">> the KeyboardWidget to not trap keys if there are no actions to be invoked -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/4975">> buttons to the Edit Template toolbar for the editor-height and the stamp tool for tiddlers of type `application/javascript`,`application/json` and `application/x-tiddler-dictionary` -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4985">> all instance of the [[tabs Macro]] in the core to use the explicitState attribute -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5000">> support for the `meta` key as a modifier in actions -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c854e518faa2d2661b7b7278634b10607ab0a5f5">> support for $:/info/darkmode to the InfoMechanism, reflecting the browser dark mode vs. light mode setting -* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/4200">> `story.js` to remove dependency on `wiki.js` for story start up and navigator - -! Bug Fixes +! Other Bug Fixes * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/fe8606759ebf1db50c57a2e779b086a6d7df2ae6">> parsing of dates from 0 to 100CE * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/6a91dbfe2f6e52512d7f063b6d5e3742ff77126d">> handling of negative dates (see [[Date Fields]] and DateFormat) * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5126">> "409 conflict" errors with the ~GitHub saver when saving within 60 seconds of the last save * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4987">> behaviour of system tiddler syncing with the client server configuration. By default, changes to system tiddlers are not synced from the server to the client, restoring the behaviour from v5.1.21 and earlier. Bidirectional syncing of system tiddlers can be enabled with the configuration tiddler $:/config/SyncSystemTiddlersFromServer -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/cc3462999b80461fe30b8f4b4f272ccfbbb78b35">> content type of imported `.tid` files that do not have a `type` field * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4632">> hover effect for search dropdown items * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4584">> restored missing parameter to `saveTiddler()` method of syncadaptors * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/678e25f510786fbc38f505f8b594f57f39e33a04">> MakeLibraryCommand to skip non-directories * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4601">> erroneous use of `$tw.wiki` -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4647">> ''class'' attribute of DroppableWidget * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4634">> high CPU usage with animated syncing icon introduced in v5.1.22 * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/4591">> $:/config/NewJournal/Tags appearing in tag dropdowns * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4658">> popups not being cancelled when clicking within a text editor @@ -209,7 +233,6 @@ Please note that using this plugin does not guarantee compliance with any partic * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4686">> edit template "type" dropdown positioning * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4687">> edit template field dropdown positioning * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4704">> (with <<.link-badge-addendum "https://github.com/Jermolene/TiddlyWiki5/pull/4705">>) syntax error in ScrollableWidget -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4711">> extraneous system tiddlers created during import process * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4780">> problem with headers not being treated case insensitively * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/a2796d89ab3dbf4a15b63b0f4623387fdc6acd5b">> problem with `Content-Type` HTTP header sent as `Content-type` * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/4776">> EntityWidget not refreshing correctly @@ -231,14 +254,7 @@ Please note that using this plugin does not guarantee compliance with any partic * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5129">> `tc-dirty` class not appearing on external windows * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5148">> `static.tiddler.html` template to make rendered tiddlers full-width -! Translation Improvements - -* New Arabic (Palestine) translation -* Improved Catalan translation -* Improved Chinese translation -* Improved Dutch translation -* Improved French translation -* Improved German translation +</div> ! Contributors @@ -274,3 +290,4 @@ Please note that using this plugin does not guarantee compliance with any partic * [[@saqimtiaz|https://github.com/saqimtiaz]] * [[@twMat|https://github.com/twMat]] * [[@xcazin|https://github.com/xcazin]] + diff --git a/editions/tw5.com/tiddlers/system/doc-macros.tid b/editions/tw5.com/tiddlers/system/doc-macros.tid index 40214259c..1aebbec25 100644 --- a/editions/tw5.com/tiddlers/system/doc-macros.tid +++ b/editions/tw5.com/tiddlers/system/doc-macros.tid @@ -121,7 +121,7 @@ This is an example tiddler. See [[Table-of-Contents Macros (Examples)]]. \define .link-badge-added(link,colour:#ffe246) <<.link-badge "added" """$link$""" """$colour$""">> \define .link-badge-addendum(link,colour:#fcc84a) <<.link-badge "addendum" """$link$""" """$colour$""">> \define .link-badge-extended(link,colour:#f9a344) <<.link-badge "extended" """$link$""" """$colour$""">> -\define .link-badge-fixed(link,colour:#f88b40) <<.link-badge "fixed" """$link$""" """$colour$""">> +\define .link-badge-fixed(link,colour:#ffa86d) <<.link-badge "fixed" """$link$""" """$colour$""">> \define .link-badge-here(link,colour:#d88e63) <<.link-badge "here" """$link$""" """$colour$""">> \define .link-badge-hide(link,colour:#9d959f) <<.link-badge "hide" """$link$""" """$colour$""">> \define .link-badge-improved(link,colour:#7593c7) <<.link-badge "improved" """$link$""" """$colour$""">> diff --git a/editions/tw5.com/tiddlers/system/doc-styles.tid b/editions/tw5.com/tiddlers/system/doc-styles.tid index 2e33a266c..469e27d05 100644 --- a/editions/tw5.com/tiddlers/system/doc-styles.tid +++ b/editions/tw5.com/tiddlers/system/doc-styles.tid @@ -217,3 +217,9 @@ tr.doc-table-subheading { .doc-link-badge:hover { text-decoration: underline; } + +.doc-plain-list ul, +.doc-plain-list ol { + list-style: none; + padding-left: 0; +} From f6339d437ed88154f100eb63a24f0f3ce2741404 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 24 Dec 2020 13:21:06 +0000 Subject: [PATCH 1155/2376] Release note: Jazz up the contributor list --- .../prerelease/tiddlers/Release 5.1.23.tid | 67 ++++++++++--------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/prerelease/tiddlers/Release 5.1.23.tid index f55767fe4..e434be9ef 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/prerelease/tiddlers/Release 5.1.23.tid @@ -5,6 +5,10 @@ tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki +\define contributor(username) +<a href="https://github.com/$username$" style="text-decoration:none;font-size:24px;" class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer"><img src="https://github.com/$username$.png?size=32" width="32" height="32"/> @<$text text=<<__username__>>/></a> +\end + //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...master]]// <div class="doc-plain-list"> @@ -254,40 +258,39 @@ Please note that using this plugin does not guarantee compliance with any partic * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5129">> `tc-dirty` class not appearing on external windows * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5148">> `static.tiddler.html` template to make rendered tiddlers full-width -</div> - ! Contributors [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: -* [[@adithya-badidey|https://github.com/adithya-badidey]] -* [[@Arlen22|https://github.com/Arlen22]] -* [[@bimlas|https://github.com/bimlas]] -* [[@BramChen|https://github.com/BramChen]] -* [[@BurningTreeC|https://github.com/BurningTreeC]] -* [[@danielo515|https://github.com/danielo515]] -* [[@default-kramer|https://github.com/default-kramer]] -* [[@ento|https://github.com/ento]] -* [[@favadi|https://github.com/favadi]] -* [[@fkohrt|https://github.com/fkohrt]] -* [[@flibbles|https://github.com/flibbles]] -* [[@gera2ld|https://github.com/gera2ld]] -* [[@ibnishak|https://github.com/ibnishak]] -* [[@idotobi|https://github.com/idotobi]] -* [[@jdangerx|https://github.com/jdangerx]] -* [[@jjduhamel|https://github.com/jjduhamel]] -* [[@joshuafontany|https://github.com/joshuafontany]] -* [[@kookma|https://github.com/kookma]] -* [[@Kamal-Habash|https://github.com/Kamal-Habash]] -* [[@Marxsal|https://github.com/Marxsal]] -* [[@mocsa|https://github.com/mocsa]] -* [[@NicolasPetton|https://github.com/NicolasPetton]] -* [[@OmbraDiFenice|https://github.com/OmbraDiFenice]] -* [[@passuf|https://github.com/passuf]] -* [[@pmario|https://github.com/pmario]] -* [[@rmunn|https://github.com/rmunn]] -* [[@SmilyOrg|https://github.com/SmilyOrg]] -* [[@saqimtiaz|https://github.com/saqimtiaz]] -* [[@twMat|https://github.com/twMat]] -* [[@xcazin|https://github.com/xcazin]] +* <<contributor adithya-badidey>> +* <<contributor Arlen22>> +* <<contributor bimlas>> +* <<contributor BramChen>> +* <<contributor BurningTreeC>> +* <<contributor danielo515>> +* <<contributor default-kramer>> +* <<contributor ento>> +* <<contributor favadi>> +* <<contributor fkohrt>> +* <<contributor flibbles>> +* <<contributor gera2ld>> +* <<contributor ibnishak>> +* <<contributor idotobi>> +* <<contributor jdangerx>> +* <<contributor jjduhamel>> +* <<contributor joshuafontany>> +* <<contributor kookma>> +* <<contributor Kamal-Habash>> +* <<contributor Marxsal>> +* <<contributor mocsa>> +* <<contributor NicolasPetton>> +* <<contributor OmbraDiFenice>> +* <<contributor passuf>> +* <<contributor pmario>> +* <<contributor rmunn>> +* <<contributor SmilyOrg>> +* <<contributor saqimtiaz>> +* <<contributor twMat>> +* <<contributor xcazin>> +</div> From 2ab5fd9abb46fb5a76d83c2f9cffc4d278cef259 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 24 Dec 2020 13:37:18 +0000 Subject: [PATCH 1156/2376] Preparing for release of v5.1.23 --- .../prerelease/tiddlers/Release 5.1.24.tid | 26 +++++++++++++++++++ .../tiddlers/hellothere/HelloThere.tid | 2 +- .../tiddlers/releasenotes}/Release 5.1.23.tid | 7 ++--- readme.md | 6 ++--- 4 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 editions/prerelease/tiddlers/Release 5.1.24.tid rename editions/{prerelease/tiddlers => tw5.com/tiddlers/releasenotes}/Release 5.1.23.tid (99%) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid new file mode 100644 index 000000000..d093db6a3 --- /dev/null +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -0,0 +1,26 @@ +caption: 5.1.24 +created: 20201222153818731 +modified: 20201223144716441 +tags: ReleaseNotes +title: Release 5.1.24 +type: text/vnd.tiddlywiki + +\define contributor(username) +<a href="https://github.com/$username$" style="text-decoration:none;font-size:24px;" class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer"><img src="https://github.com/$username$.png?size=32" width="32" height="32"/> @<$text text=<<__username__>>/></a> +\end + +//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.23...master]]// + +<div class="doc-plain-list"> + +! Improvements + +* + +! Contributors + +[[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: + +* <<contributor Jermolene>> + +</div> diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid index d82e7f413..041f9e79a 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThere.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThere.tid @@ -1,6 +1,6 @@ created: 20130822170200000 list: [[A Gentle Guide to TiddlyWiki]] [[Discover TiddlyWiki]] [[Some of the things you can do with TiddlyWiki]] [[Ten reasons to switch to TiddlyWiki]] Examples [[What happened to the original TiddlyWiki?]] [[HelloThumbnail - TWEUM2017]] -modified: 20200415160825341 +modified: 20201224132933812 tags: TableOfContents title: HelloThere type: text/vnd.tiddlywiki diff --git a/editions/prerelease/tiddlers/Release 5.1.23.tid b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid similarity index 99% rename from editions/prerelease/tiddlers/Release 5.1.23.tid rename to editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid index e434be9ef..fe51734bb 100644 --- a/editions/prerelease/tiddlers/Release 5.1.23.tid +++ b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid @@ -1,6 +1,7 @@ caption: 5.1.23 -created: 20201222153818731 -modified: 20201223144716441 +created: 20201224132933812 +modified: 20201224132933812 +released: 20201224132933812 tags: ReleaseNotes title: Release 5.1.23 type: text/vnd.tiddlywiki @@ -9,7 +10,7 @@ type: text/vnd.tiddlywiki <a href="https://github.com/$username$" style="text-decoration:none;font-size:24px;" class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer"><img src="https://github.com/$username$.png?size=32" width="32" height="32"/> @<$text text=<<__username__>>/></a> \end -//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...master]]// +//[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...v5.1.23]]// <div class="doc-plain-list"> diff --git a/readme.md b/readme.md index 8e64f085c..81ed51eee 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1,8 @@ <p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is a complete interactive wiki in <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/JavaScript.html">JavaScript</a>. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h1 class="">Join the Community</h1><p> -<h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWiki</a><blockquote><div>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</div></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</li><li>There is also a discord available at <a class="tc-tiddlylink-external" href="https://discord.gg/HFFZVQ8" rel="noopener noreferrer" target="_blank">https://discord.gg/HFFZVQ8</a></li></ul><h2 class="">Developers</h2><ul><li>The <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiDev.html">TiddlyWikiDev</a> group for developers: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/TiddlyWikiDev</a><blockquote><div>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a> or <a class="tc-tiddlylink-external" href="mailto:tiddlywikidev+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywikidev+subscribe@googlegroups.com</a>.</div></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a></li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="http://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">http://groups.google.com/group/tiddlywikidocs</a> +<h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="https://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/TiddlyWiki</a><blockquote><div>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a>.</div></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</li><li>There is also a discord available at <a class="tc-tiddlylink-external" href="https://discord.gg/HFFZVQ8" rel="noopener noreferrer" target="_blank">https://discord.gg/HFFZVQ8</a></li></ul><h2 class="">Developers</h2><p>There are several resources for developers to learn more about <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> and to discuss and contribute to its development.</p><ul><li><a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev" rel="noopener noreferrer" target="_blank">tiddlywiki.com/dev</a> is the official developer documentation</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a><ul><li><a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/discussions" rel="noopener noreferrer" target="_blank">Discussions</a> are for Q&A and open-ended discussion</li><li><a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/issues" rel="noopener noreferrer" target="_blank">Issues</a> are for raising bug reports and proposing specific, actionable new ideas</li></ul></li><li>The older TiddlyWikiDev Google Group is now closed in favour of <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/discussions" rel="noopener noreferrer" target="_blank">GitHub Discussions</a> but remains a useful archive: <a class="tc-tiddlylink-external" href="https://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/TiddlyWikiDev</a><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="https://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/tiddlywikidocs</a> </p> -</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><div><code>npm install -g tiddlywiki</code></div><div>If it fails with an error you may need to re-run the command as an administrator:</div><div><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</div></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><div><code>tiddlywiki --version</code></div></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.22"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <span class="doc-icon"><svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z" fill-rule="evenodd"></path></svg></span> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><div>npm install -g tiddlywiki@5.1.13</div></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.20</span> First, there can be zero or more plugin references identified by the prefix <code>+</code> for plugin names or <code>++</code> for a path to a plugin folder. These plugins are loaded in addition to any specified in the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a>.</p><p>The next argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p>For example:</p><pre><code>tiddlywiki --version +</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><div><code>npm install -g tiddlywiki</code></div><div>If it fails with an error you may need to re-run the command as an administrator:</div><div><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</div></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><div><code>tiddlywiki --version</code></div></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.23"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <span class="doc-icon"><svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z" fill-rule="evenodd"></path></svg></span> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><div>npm install -g tiddlywiki@5.1.13</div></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.20</span> First, there can be zero or more plugin references identified by the prefix <code>+</code> for plugin names or <code>++</code> for a path to a plugin folder. These plugins are loaded in addition to any specified in the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a>.</p><p>The next argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p>For example:</p><pre><code>tiddlywiki --version tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen tiddlywiki ++./mygreatplugin mywiki --listen</code></pre><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.18</span> Commands such as the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ListenCommand.html">ListenCommand</a> that support large numbers of parameters can use <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/NamedCommandParameters.html">NamedCommandParameters</a> to make things less unwieldy. For example:</p><pre><code>tiddlywiki wikipath --listen username=jeremy port=8090</code></pre><p>See <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for a full listing of the available commands. -</p><h1 class="">Upgrading <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p>If you've installed <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html">TiddlyWiki on Node.js</a> on the usual way, when a new version is released you can upgrade it with this command:</p><pre><code>npm update -g tiddlywiki</code></pre><p>On Mac or Linux you'll need to add <strong>sudo</strong> like this:</p><pre><code>sudo npm update -g tiddlywiki</code></pre><h1 class="">Also see</h1><p><ul class=""><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFileSyntax.html">MultiTiddlerFileSyntax</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFiles.html">MultiTiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Generating%2520Static%2520Sites%2520with%2520TiddlyWiki.html">Generating Static Sites with TiddlyWiki</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/How%2520to%2520build%2520a%2520TiddlyWiki5%2520from%2520individual%2520tiddlers.html">How to build a TiddlyWiki5 from individual tiddlers</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520TiddlyWiki%2520for%2520GitHub%2520project%2520documentation.html">Using TiddlyWiki for GitHub project documentation</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520a%2520custom%2520path%2520prefix%2520with%2520the%2520client-server%2520edition.html">Using a custom path prefix with the client-server edition</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Building%2520TiddlyWikiClassic.html">Building TiddlyWikiClassic</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Customising%2520Tiddler%2520File%2520Naming.html">Customising Tiddler File Naming</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Environment%2520Variables%2520on%2520Node.js.html">Environment Variables on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520Prerelease%2520on%2520Node.js.html">Installing TiddlyWiki Prerelease on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520custom%2520plugins%2520on%2520Node.js.html">Installing custom plugins on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Scripts%2520for%2520TiddlyWiki%2520on%2520Node.js.html">Scripts for TiddlyWiki on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Serving TW5 from Android</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Working%2520with%2520the%2520TiddlyWiki5%2520repository.html">Working with the TiddlyWiki5 repository</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520a%2520plugin%2520from%2520the%2520plugin%2520library.html">Installing a plugin from the plugin library</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Microsoft%2520Internet%2520Information%2520Server.html">Internet Information Services</a></li></ul></p><p><em>This readme file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></em> +</p><h1 class="">Upgrading <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p>If you've installed <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html">TiddlyWiki on Node.js</a> on the usual way, when a new version is released you can upgrade it with this command:</p><pre><code>npm update -g tiddlywiki</code></pre><p>On Mac or Linux you'll need to add <strong>sudo</strong> like this:</p><pre><code>sudo npm update -g tiddlywiki</code></pre><h1 class="">Also see</h1><p><ul class=""><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFileSyntax.html">MultiTiddlerFileSyntax</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFiles.html">MultiTiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Generating%2520Static%2520Sites%2520with%2520TiddlyWiki.html">Generating Static Sites with TiddlyWiki</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/How%2520to%2520build%2520a%2520TiddlyWiki5%2520from%2520individual%2520tiddlers.html">How to build a TiddlyWiki5 from individual tiddlers</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520TiddlyWiki%2520for%2520GitHub%2520project%2520documentation.html">Using TiddlyWiki for GitHub project documentation</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520a%2520custom%2520path%2520prefix%2520with%2520the%2520client-server%2520edition.html">Using a custom path prefix with the client-server edition</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Building%2520TiddlyWikiClassic.html">Building TiddlyWikiClassic</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Customising%2520Tiddler%2520File%2520Naming.html">Customising Tiddler File Naming</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Environment%2520Variables%2520on%2520Node.js.html">Environment Variables on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520Prerelease%2520on%2520Node.js.html">Installing TiddlyWiki Prerelease on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520custom%2520plugins%2520on%2520Node.js.html">Installing custom plugins on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Scripts%2520for%2520TiddlyWiki%2520on%2520Node.js.html">Scripts for TiddlyWiki on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Node.js on Termux</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Working%2520with%2520the%2520TiddlyWiki5%2520repository.html">Working with the TiddlyWiki5 repository</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520a%2520plugin%2520from%2520the%2520plugin%2520library.html">Installing a plugin from the plugin library</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Microsoft%2520Internet%2520Information%2520Server.html">Internet Information Services</a></li></ul></p><p><em>This readme file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></em> </p> \ No newline at end of file From ac8f52130353dd5476599b979a8eea6abd8b3648 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 24 Dec 2020 13:38:24 +0000 Subject: [PATCH 1157/2376] Version number update for 5.1.23 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ff7af3897..db1dba450 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.23-prerelease", + "version": "5.1.23", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From 1e1b52088faa99a2676e98a2a5cefb3c551df3da Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 29 Dec 2020 12:06:30 +0000 Subject: [PATCH 1158/2376] Preparing for v5.1.24 as new prerelease The new release banner is a placeholder; we'll run the competition once the release has taken shape a little. --- bin/build-site.sh | 2 +- core/wiki/config/OfficialPluginLibrary.tid | 2 +- .../prerelease/tiddlers/Release 5.1.24.tid | 4 ++-- .../PrereleaseOfficialPluginLibrary.tid | 2 +- .../tiddlers/images/New Release Banner.png | Bin 27715 -> 77188 bytes package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/build-site.sh b/bin/build-site.sh index cdb3292aa..f896abcac 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -5,7 +5,7 @@ # Default to the current version number for building the plugin library if [ -z "$TW5_BUILD_VERSION" ]; then - TW5_BUILD_VERSION=v5.1.23 + TW5_BUILD_VERSION=v5.1.24 fi echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]" diff --git a/core/wiki/config/OfficialPluginLibrary.tid b/core/wiki/config/OfficialPluginLibrary.tid index 1a0f47d2c..1bc0bca2e 100644 --- a/core/wiki/config/OfficialPluginLibrary.tid +++ b/core/wiki/config/OfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/library/v5.1.23/index.html +url: https://tiddlywiki.com/library/v5.1.24/index.html caption: {{$:/language/OfficialPluginLibrary}} {{$:/language/OfficialPluginLibrary/Hint}} diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index d093db6a3..c03440848 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -1,6 +1,6 @@ caption: 5.1.24 -created: 20201222153818731 -modified: 20201223144716441 +created: 20201229120443187 +modified: 20201229120443187 tags: ReleaseNotes title: Release 5.1.24 type: text/vnd.tiddlywiki diff --git a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid index 7d517f8c7..4ac70a30a 100644 --- a/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid +++ b/editions/prerelease/tiddlers/system/PrereleaseOfficialPluginLibrary.tid @@ -1,6 +1,6 @@ title: $:/config/OfficialPluginLibrary tags: $:/tags/PluginLibrary -url: https://tiddlywiki.com/prerelease/library/v5.1.23/index.html +url: https://tiddlywiki.com/prerelease/library/v5.1.24/index.html caption: {{$:/language/OfficialPluginLibrary}} (Prerelease) The prerelease version of the official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team. diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.png b/editions/tw5.com/tiddlers/images/New Release Banner.png index 0a5875f63b665186cf422314bdda79ecd05e5e8e..e85f7a0e133438fce297f9afa769d60d711831b6 100644 GIT binary patch literal 77188 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 literal 27715 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%0AsTpr&#AX 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 diff --git a/package.json b/package.json index db1dba450..529f16569 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiddlywiki", "preferGlobal": "true", - "version": "5.1.23", + "version": "5.1.24-prerelease", "author": "Jeremy Ruston <jeremy@jermolene.com>", "description": "a non-linear personal web notebook", "contributors": [ From 24646e1993cf853cbbd867a822f3d41ece4753db Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 29 Dec 2020 13:27:00 +0000 Subject: [PATCH 1159/2376] Adjust placeholder release banner for readability --- .../tiddlers/images/New Release Banner.png.png | Bin 0 -> 77080 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 editions/tw5.com/tiddlers/images/New Release Banner.png.png diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.png.png b/editions/tw5.com/tiddlers/images/New Release Banner.png.png new file mode 100644 index 0000000000000000000000000000000000000000..db1f4848ea22abd7e0d7535320c90d2182d46b96 GIT binary patch literal 77080 zcmYIv1yEbf_ckqBTw1I^pitZ?QY=W3;_mJa#i5Y2NYNsNBE_BJ?j^;Y;O_1&0TS}j z-#h>LGIMA4%Ff+A=XsuU?w(DAnu;7AHYGL+3JTsw`41W>D9^c3P@aikVLV;wT508Z zIx)AGmR56=mXmgMa&^~qGq<$<VDI7PWbUWNhl0W!Z)s+x@sXXm-`w2Htbc@!1>4<6 zBRo7>!wlU27eAy8*8&$iVxR{-=GilGiMP1il&=C>d;enPavcT@3%}*B|5$JGch;it zY&xp)LmKyV9!f>x)P@x;0yA7Q0Vh&{oSa<qi_`YSkLQG~sQsiY&xNu3Gf^#yq~~5s z95G-$VCgB#$MMAlqW0^^kIJL{>VTp4&wP|3R+Y1mK1P4$l03W-l-{iniemY^;w@@o zzE0v7yIpwDVD9i$G%>oI8FK-v@6Ox9eP(hB@?U)1UplFB?>%UR*eQBOX}f=&@^R0d zAfJ9NAt|#UjBnp1GK@rsEGS8Faf6m{ahbeH8A#s-g{FK>Vd41xb$!wu17k%V17jUW zLTtRpzE{@FPnL!W17qeh5((CMGE~;^-!q?1Boab~Kq7s3)GnzpzM=Y|yrQ!{;qM!N zc(S>WwcbY?Wn~oBr#2SKvoL!Uw5Qgyr-Sn8cydqn^Z&c@oI4x!|Ju(){@s);>U(-p z0_EceNiE-JM;R}^SnKNVs&W|r@v&X)$A97YoFSeYpShp*O>tB8Fl{h>_8ZPM-k7|+ zVyq2;(d_V{=>EbW_TV5|aw9d;XTkCObTybi;>7j~T0TEQkUs67Pd^(^8*3v<T7?5u zrdw~FR_|_3(?6dC-YWmu$(_7;RS@_P@W!yPuy9Zup}ZgKpX~VHyMiM84#o(n3$+1` zfDPbw=d~jM=SQRC>n`?$nBecE9I4EgmDh^O)!{jDXfo2C4rhM?*z*`6|Mxgw;fo$= zP6w*jhv=W))!m^o*<aea0vh72hqE**oA<Qz)%|~c_-J31LP2S;^^k{tY7wmZp8t;j z!TvGfoYu0Z-+_~j-mMWv_aeW|0PcKV+XJ=kfwqNO0p5&KaeqgD1LrjVb|=$kcNSRn zBkmjT>zy<>X}m;jmJLuyL0LMBVy89`;_>fv1SH%@em~5;>O~GM6GNubus_ycYP^{7 zYr@W5v9@jz_oTka3z$tpcr>vK!c1h9K_j4F$g4~HC_tc7zwi7;(c8am6FUH$oW^(o zu<v7v4H0jPUVJuI8UMKKIKh6*^y`Wa!8<RuSqDW+?}?+LJJl$_MGz0f?woJumjF^8 zKlsjjNyPweBnnbNoc9#@xbWXA;Y=eMS)|(4$ufmjWXoxKKgq@5wGX&1$^Jr^k>EVY zUS^R34d70fm?V1^Jh?s4PxDH0+%nwbTb6q2rn?u#XKm%PFIt}7%m1(+<a!C{iy37y zfX6W#z^PQkogXDAg)qFwcc7d)v<cSTsvKr0#n6VW@-MzG+aRlqcixKu=6=_U3a^}l z3H15z%n2{#UMtmRd3NsrIY3rUcIT6tDtJWLq|T3YY73$hvIg*@S%yqiQd6+qGm;mn z)r586PuWK=JH1*5V+QK1-C|TSYbgT~Oltv7+5e``&&{f~K;<Cne6Hzke<_y+WU2$D z+$UgO;Ns?K6DUGN?2N@%Q6z$0FC1?sn`8JeFC%t<55P;_M6-m|ua*k`{I&^IqW=6y z(inFz^HE6>4PPT8&hu_eRXIhekZ0WsK^Y)lJOFjyI||aM&DsI3Q_o3#h-^{YKg#ck zjZ=#PBuU$nCH@00eH;B|-<lXVk(w2kf^gh=-e)=WSKFMbT(`ebXFyLzubfwfDO>^u za(ZG(fz-r{a7j_S%OWy-lXprM2<}4^`i`0!=_ZgVYS*d9Kvc>v5AK5?UheA-axD9^ z|G;9UWOts|qv|J}20X~^5n&omX7%xKNdxNJ%QLW<0+kR0!K1~BKlOsvyf;}4oMNhj zs66);DMb}i7$ILjO*y&J%iF!Xc7DPg;vJIWmY}WRHhu@Vd9iOjxzSfm4lJCcZ5hkK zR{EM~dw=yUR|<Vl_+9|Un#c$lb@_!@qgdzMXG{8c2^e~7P0Z`?Xqi(78{Y`S%Nc<v zrUI{UqeTm2sgo$R8CLV$3lD#YnAI<5w8#d(a13tr{RJ16-c!n-k4?`%p$f}-hdhkV z>mlg*P6}LvkMFFuw989+(pf<6EN8?H3)D_>ub}?Bl;JWjZhvbv1oOD9?v#~K24J-f za5>XM|MBMEn~OHSK5lk4#o{?Xj(INZKwp&u;F`~yCxe2|2{XywXlKv&N)=UB`mv%X z1pW^-PyP!`SL5_q|K~4F;$kFSlmNKy?vikppcY>MjqEvIlttG4G*1-qy&I!-rU#~U z;D6A87xlz)>JW1oJ~2gZG<8mTXA%BB^}1`yk*gVV5recmpDk7s<TkzKg>$`WPld6D zvAQ+;A43D{%5v%}i<?P-Z^Jv%d4>fa_D2flRm<4?BR*8zL*L;f#yhVpeau;O;|Qj` zizDvENqXuWM)%>sdxKfvVZRdnzscI7MF@bq(-(K3AP%A=B6o`OgoP@3c>3tI0;m6e z@|}|<)~sL0k#u9yfcT5awKVty>4d;PKUXW)!Eyq>kphV%N7X6ld2Q<M@<ssmIQFkG ze?56T?t*<$BQmd+6K^F^SDDL)nwS&%A6PH5qN&&MI6#De>c|uQPRas4m!0MwXcc)( z>PB<?KM8(#h^5)k9(+sSw`_P3Y^%TfS@}9mc5t^d6!fW8q9Qr)^*^pYS^dXfZWTgr zULD-S+KQf7y#_*YL%8#$Y8p712Dl-{J^krO!XSDsL$Apy6CHb7sh%TB-1c+l{|^kj z;)Lu5aPmKUim7fYS@!3($udy@4iGyru+YS3KlQHmdlU2-2~L_(uMp6!rVKcS@-zjm z<NSF7o{tm7BszlychC*uf8>e1O86&uw4jq)LawM~^T7*Hhjhl=^Fr#pgL{5h4$Qx~ z*t`4g7yO^;?4LS7{~@F{iz&GoG?wOD4;$+v3x26(!85_3f>G<@gA|UR(pLN*N=QIc z|8VjjqM<F#)q{s&_KY+->?ToeYN3a9oHzMeWPI$-@L#aK4fGg?T-T>=mai87!wCn- zf5PFPgjp)|e~+Ekdt&pvwLgX|N$hD~twMyHZ>te|cH5x3u_!fFU~08|m++uIpcw<e zt6+asqw*Beu6gZmCgDtoH)4f%1Uv!-;|~ghzk6a$7&$;xj^~y;A8nnG?@KdEZQn-I zQT56I?py2*hu#saQ^Jd#q`n0jCzx{jetzwEW69<4XluJ4_%@&@d1Q}a<%o$B@5x)| zdAISFu8$ezpK4cVESMNW$1vlDWmf0PBP0?yu$i9c{|ipv7iA4T)&dyD;Y^k?3+TIL zj{i(f3barcxFWdV02yE#m$~g<n|kSRZnOCOZe2MKDl9c|FYMscCQ6w+OJW!Hak_B) zC)WR2(sF%bCpMH}&6SR0YK=deLGVpm3%8L|s3=uYha%-aQ7nPZ3I0Nckjn-Qaywkz zkpdZ_{`uGL+>)Jnjr5P2#k0JNs+uq}fCS6Ktn*jja37R^<iL=9CEHa!A8Y+IQl;D; zg1!k-AU&t2he{f70bbpCXDNK*adn%`x8~hjfW1*UL{9mZHSs8X%R1JNU=h!gg78B! zMywhvme1YcB4OQ(>YpU-nS3PUbBiYhViBn{$wy@o2^zw2-<y#;KhEj406eA|Z@Tnf z3h}DSVEiy&u3D*uqI`SoYRAhw3r>`3=iG~Px4*C?np}K}k0zvZ3JV|q5r;zLoA>yJ zToj<s9iHyrB|RF`|5tQ~#Il`%re#ns<H7nNyZnE_+5T~ILk^?QpQc;h!2o{si!FpN zPWgY63A&Sp{x$ocaJ?nkJN5Qe%@PHL?l(_2nJcHWjBa7SW?9~vG7TfTVn$%d<WZ4F z+Ya!C6fj|06K9>KcnRp9*a$1gmi9{D0b(&|+(#+0THU$q0c(Aw&dB5zzvA!HwnG^u z)w~UlRmBgUL>7=aafHe84*7zv4)&FQ&pW%4l}|_G)p<=1H1XrV@es9leri6ieW2vO zojcZo&Aq!_KXm)S`8<aA&JHK1Rr7fM$vvGq|3^PnD5dkG-Q_N81)xq#y+jv%IroDu z-rd=nTOgH}Ln-%rb3s^~Mgrhl&eT61Id#B-Fcba?8o(v6IY13}U87^p<aKu*+m}V{ zvK$^3X|)*XCr2&q!Uvlzte5!m|0&%m^S;~&m?6Q0or3RWi=*`)d58aS>n~@2-bMFj zhT)GMX%ygE#`}}CM3E77-!!q|I=c(JQqyWFOz34XYmy#XbIhl*@c%FS-91l&9}2r2 zUT+Rc-;MkyB0hJAvGa2ixVN22R<h!~vP^wdLZk!p$sbeik6zn#QPoy-(8vCl*<#Ug zfa+kW=T-lb;q<9{^8;l9u|7w<(~WgYp3~k`-U#i1D)FJ<1`JaffkcuEx`MV|XmA4~ zgb}D@+YMz-=sjk9y8ACF{e|eKGk_m&qMv_FJhy<0+KCu!%E1%Ake_qX;Lbl!f6?2Q z>aDNS`F`<B%`M8Twd{k{Dh8m_;faI^;^Y4dd`{k}q`)v9-oPH)0lT>w_-@KIAQ0z8 z*l!H;)p+ZvX?fB7Qkx%(LX*kj@vdj2-DbQlPrXS-C*X4KSn9Z=CI8D>j-))E0KgtD z0Is6-D$`qmzsE~2U^08|LasH_n@V%8=5j^7Q_Ix<znB4N<NlL-M?e((E}Eh%K%wOS zWHoks6mU*h>7(7m9qG1#B0a;FJMMpLUY!fstCX{&Y}+mSXTW8v<^S~KQ&_xT!3Y2w z_sNQL_vQ_)lqFL2J$U%!MmPHx{6e;WS_OUCtZ9X9MN)rHZ9m~ILLX-1a5H%n)-RqU zoTVO^?D{wf5A%JZ;3-F+9lQ+qR^mhd%e%VoIq{x;eW?g@ix7-hs$cL<O5wC>r319- zBe@B?M-tM`PhkBg670W2{^pV1*s~hn=nE1jA@y(?ftdVNQuYEyFwp<LOLye`5#otK z;?dTfe1LD0;(C^(x9iD?M<$>QvN!mrDcZMtmLLCxI{D{M3SiY2-~ArQev?Ooxqlh> zSvW@W^yVTBAC&^4{Brh#5;xX24_En@>^k+<fx)VG`A;_dXAOG-dw_T54v-(#0Q*$e zV`?GJmAlyJ>N?*lxCzSq40b(t-9HED`^)}xyFGbZ>5<{1OAI7l*%i(tg1O!Pf)o)E z_F~lLH?ew$P_s<p*w#wq6{Kaq7JY7iA&or(Vn@eUVTt{h(3f4qK03t?RQf)*Cf-&( zOstVhU@xDF&sTomdcZGvqP}cG`Y!l!t5&Jc2AOvQut<z%fFv@zzcryXJTNjHIw|P= zbZ0nv5*0#WW)54R#9^SHopsxD%y>qwW!0AZEpfZP1oB%D`Ebd)oh#tZPk(ZC>P*Tz zTB<bYuSi=WyCA04$!)h27O1_t_BoYcdvQy!D)qnbMDmErm{$oASr2u>9bN7LyL}tb z_CUpCu#)c|sLJ#JZy)A#-HP~*-!^$P(u5&q-<27>MUo&j*p_U~tT1AEhVd!G12eQS zW-N;LyndU?!~QHR68z)rk<tqi7q0z=IC5G@LtWu({HsZNXZd=*ZVZ57rzNie>c!%2 zdG{E=5TgA%koKI@<{;LA^+OY$v3?htsH7`Lr^j*-{I+(SpB6ks^qc=F-=Jsmnh$0w z?V<v1maMAK#qMtkeiGZ%HQJY>>ROycPUo=iASX40Zmpgf^2<)GThitAM6GQKd|ay} zFgL)ZB1ZO8c?h1bCc0kOG~;h&!RdRBg7-KyhCJ@hQO7wj02bQm$ts0<`81&yS^k$@ zqow(};^ulRbNf*JJ_`MXT?d=$_URDycoKv>-s9N-f%#|WH_fp_tCHB8GEDV>#igMK zQ^!^Nv0fSz7%QLdm9NPW^Uy#{XMJe%{OWow1a%)O>7Si<-Y&QBc%lLm^RsxkpQ~hW zI&dG5jLuH4eh$dtVsUl1>LJWTmpd4F&2|7iomA_i1E}f>&dxeO0sG-6IO)P~RSx=h z->(Zjsb5-S;16gHT#E4F68kc&6MSG{1mbiwyNZ7di}~yIZV)U$(Y@7~9!!B7+AwIp zrCq1CETL&7HHHV`7~l$;EPfm#0cfBx@2kE-<G51ImdeXf^=DC4Q{OFvHh3yvM7F3S z!mRDSJZtOAW91VEkb@-Qlql&8##gDJAjYfBrn6wp`w~}!W(6QZ+3{_~yepOk9fFRn zQ8qs+;3q(%8<d_%u>kcYq>2U1;ceot-xe<&5{N|Bkv~#;8^C`D3B^5yuMY)${tENF z5xM49U*X$(<10V+OM&ZVeGOqah-W_{8Yr&wlF8WJ6|N$<dY{W#e~04ZMTpl0XNlH# z12PL<_&TnL^&a;H=G_&Kf!%Py@kea><a=COfIreS<H#@Pm7N5L*qpBfh}@a*RlZld zgy3G_!4bHB)gN~W<5}1No9|u;DY5t-^><{no6uU(qmc-=q>GqNkh4%+TKQB$w-Tkc zPfU`Kz|*pXoIGfWv(v4-twc(RP}|+H|L!Y|W{*zxTAPgM7pQ+0rW@NhxZ*xAiq*LX zbyj+Y8VzEZb6+K&!?tvhIuq366`AR#1Qhwzrx_-lkJS5in|qCNA^m7iqRCE$d9ym7 zvgVxD_36t{qA+#vZPOJ+XO8AzSEAQU<3i2+wk4+cTvC}P+QzCMbxPIP+fQG@TyKjB zNKDvm_KGmwmkY%wx`w}vSo=S`u)b*`8M?av&gwd0D?Q&Thwxs~zByS?zghD3NQGRp zS)Up=CjaqSa>+^~!r;;gN!vBCdB-UJUNbPU#a^>xgE7(0^p$gZd5syvQ6wj~WY-y0 z_Irud!s<Jp3$sDIb@%jzg2UuMe4-T|moKaO-!pDv;W<pLaYMqso{9pT!64J7W{6zv zlypi5@{EGvwj6GV9yC-N+V~uv5xws8bNw1OTEki=RgK$=IX=IHyHx=<P_x4rpjQYE zKHZub*f|@7Mv+}H!e_FzJEy;sa+ZYueHoR~M5erZz&-<5$8)A!VEv9gZP-H@w`*S& zd~Y-|28xCRQK~F=f-uf<d$`j-(%<MFV!+6PvMjz@z|nx>*wOxBM6eg%G%0&+x9KB_ z^8u3i)RRI%5Mpr1l~4Y$Egd{O7pIq{QIudSxq~b|FHBEJBRhdT(j#<;Rt3jPFPoP( z@&pxT7aG2I_?7f;))_8E{~i=+#w*_>I++Yd0cy+f1)Q|M;e^dbQ$&$?Yjm@TupYH| zuF`6NOx$gW_yRY6TMq@&XvMT{t#5Bt-u3bpg(^npsN@qh|8`=Snhp4Qn=u<$xCDzm zWp51FI~}41Kx&4;+ltmY8G3EQN6RF(9AD0sDazgTM3slY*Y$Jc*dkwO;6~sEY`3?M zqNNTT2Lum3B^R_C_okk^=oWh~Mp?naeU}kIAz%!7UkmFC=-ip<r!yK3SvT86d8wF# z=WSeX(V(dcZoXgjKFz736Hv3;9mrn^zzvchK4xaL713-xl7i@bns0YC`fz{H>8m|S zM?b-27gktADH|!*=U3fr;i<n^TD1$aDm$I3{ygHwsvOczQ@7ClE~;qR{cshV9J2U@ zkvn#SAo*9MGnwWW>WMIDSrFCefS+vLLm7sv=0p0~m8y{hEB}KRw_!hMlXY2Yf^JJ7 zF$*Fd^}!MD_E#&lo2N0ac`%mpNWt3{XTkKb-C~xuZY%7|Yf`dZIuQRm1m2NgQDzRb z_e24bC*@~yKbPmrT^ZqIlCXCFc?FUVPhtAW2S6tB{&D$JA8Z%jq&b46J>|t3fqR{= zrM&_8s$0a>zKOT3h&+uQj41^g+0^-_#zRK27t2WbVO%&ASBEm+zlgj$AmM7oefTK; z-SaP4)u=#|I*2reXJNex5WwPx$#*6DU4fm^*k)YTvhMhm#8nUU0|#b7vB!5s>3h^Z z3C4<SId+3DMH2J%l%5MwWM*yY<LZ7dnS_^k{DmDMH?%mLv4vkunL%UtR#Z6_5{|Td zE75=m0G59OJ_hibi~tCjz%x^iq#)6B9B#Q&+$#AEzd_@NsX--D<s?9v%q5RwNsS=| zMpvzh&o-k0AoKT+hgs3a`JDmy3v#8#*oXV~H~yxrXS!mKnb?t^hsr7xnoiR?2-9}3 zp$#iXv*!mAkB4iN6E%<Y%(YlH=Pi{+;DylbiB(@?{YF0z+x@xWu_RpaV$l=?{E`bU z@qQiE)dL>EO(l%eL<+XJ_z_K3W%}{}$e+u`sn?|6Erp(Dn-g^6U2B&UxY^)7VVR{d z`T&J;)V>yoDa9_|J{o7K?<;N4svAv3w@Lv3Jh70W5MS#%cq!6n-Y3u72CXh8iXg+1 zhotql+UQmx<K-5$j$0FM!&l{|mx$OcxOEA`Y9iXp3)f$5zBwO7%nT+;vd(K$HAmUW z;HwaH&w-0W;oh^&+#9{kpZ&)Rr(n-iB)q6iLaJi!<@LSp!FKZXNlxz-*ki~2n5&=2 zg@0~65!mX_DE=aZva)}eFi|*9+H<PfvNv5$(R6k#HXPnk$++-K%GK(;U|IMmvFm8D z?hmUWUh0$zL}}D;px!190JHWMJTnM_ID%Z~^X28a-x&+Ld69I0rzF!5xl0bj8l1cr zqyiT;@BlXe<A;Njx!R(m&z-eH(ph(#bY=rS8u!Rf<I8Q|`QNStjMn7T;fC;!L|4@_ z?(udEc`mv`_u-`hr!5ZOmN@W^XT<2eO>SJ~O-2J2Vt?{Mw(T=Ej%Jg5%B7ZmPf4yI zFsy^gP0>}V%(EmxSm55xEQ3+sCC#C70Mf1bUN_V51b#Ga(mfm@>#de*K2M)w6VUrt zKqk@W`W<0I%M4u5I_Z*0%f|SYlUlp#Qf9vKd}<p`)>d;$R_1N}ZLhD2yoJ};UQv5G z_c*_lDmeMG{dxEEYEDr*-HRQW0<wEYFQ1$2k}Eey`NwnIXa+(lLBBsAv_1$;6;`Un zV;@kqwqUqM(7l^5Ps*akC^)Mm=pEd6E8c?H;+J-)Y~cBt+^#_PdZj(&=GW}+LpkaQ z@vi&gBlF=_;pkgKXBf2<H&d_ehp{>xp8hWZwWf~!3WmerX3DzUQkMabX&RG1l}p@z zs?!l0x=ETRx3sYd%ZL3ZDFU^`h&(pN(ovhL4h4-#)1SQe^5)E^#$-4VY^IEFD^9M} zsYN(i6L;G_`xmC)WMvwTB4U9rQ7HsG4dukG5O`kV!)a{{SwR{HzKegjIFsRzB17L# zTXT&r9f1Zndy;GKuh-9G^zXPn7uIe>@#96HHvpsx;!qFUNOvmDl>1<f9IY|Idr)e! zqx8i}b}JSC3y;C2ecP@P^LU_;z7U;?=bB88LQ>W-Yq;Qm+*jnCtllnR0~QYk{bQe- z8NWuEf1cQ7-8)z!kpmEZ!KVShGG##L)n`h0VcqcEX9Ff0Cl{&mCvO^b6-LsvZq1*y zi)J`<c80w#394N!fN}Z1ZL%PosScpI<DuJlR0^71y_|3#aI8Ec<#NbuLij2HLZ*=X zRWskB-*=}CPkNU10_vvs6)7@3&8vAU;VQ>gYnK5wC!h73k5ntE^xO3E4=~#he==he zky&SPa!Hl<2?R;Uv3?58itkPd5inkyYS{1R%=oQecIpd}P0r7)2?eW6)g34v$U(27 z6t6|D%iQlLL046SfF)SNc8SLrsclSR*d_2Lj>Wn?3C@+dMHEVbMqASoy3d&9JUV$| zHrqAE^Y9KvPY-1IdoT4^R<ivd(2HxQBvrdu_oYMXr$uLETP%NM&u{O+9rI7$ySjWt zjaVJE+viWeA_R|7kTUgi1Q$aP!&mz^V#h^;(x7A2`n-ZaWz$pO9)c64Exrb!)s5KA zN=vtC3IVR_y-1UWN~nsn>Cums6Rj?LC_MEd+w`+>>T=!N4=um$C+GG(egm^Ud(ljR zILAEvZ|_C~e`a{R9>PDbQfxaS4d~`6TuA{>xR9tW^v9=w;jkXsM~k9?8jlG);ULVb zO&o=7u7GjJAMlq;bVH|R7q`KSKiDpUWf$=^dXltw5&_3o3iHB{Ubw3O7Fj%@E2Dpq z2!|Gim-|M2mkk(;Z&=q_0G6oNFQAx^lm%ERzv$y0ryrtduL%3fOE+LMM1@0s5EzXf z%jr1<KoTiwY18X4J@e^}@@lnq?jm7;mH6_KxL~_dd(>RpKmzFTq$M~TD7FincZmQu zX9d@bLxG@c=->?>RNL?RI#xfI%lms7r`pWazUsE6G1y3oo+)5aSTmGH`J((8Dc8!^ z)I}}M2`RI~_hfoOVbb6~QR}7(Y|(&4t^l*<t5>HSx*()rVyg@MIrgr7z+y?}--`#U zr&Ym&vu*nKU?MOHgiL3ya;}ndX8*;4A5BE)4ol0=#>d3ZO$6>DM(49p%n_5PgHmNb z9Q%LhLGeUJB_TD&2BnX)t5SooOdY$4;M6sXer4;L8-5SG6$?t%h4q4j-SwY<4i4RU zb`x*5D&<N;COM*1anB-$B3|SAo-h@jX6p<#Pwrv@$CoseY#Bm%O=Dp#YXj&quSNEG z93YPx<-T$l+LOZ(Nkq040j_PZ`0Weeqr|*-tjDAgd&~3;giN)!JEtd0JTs)wVpnFy zX}M=>MDTkG`MmXZt;gZ{_77cnFd3Iz1~O9FH+{LL+=!9JX7rC~v*IG@N(7N>H?L|F z{SBMud#Ou;Is>^*SG)*LL(YIb0`MDBkB+rvf>(tqz}EEZsa<c7wU9sRrs~uj&@lsZ z`s)pvXJ+o}WDMxW41tHPkR1uC7cNFg5JTxgc89$2W*22-)-p%FdM8`CHibHNZ>~eX z)kVF8aj@$8UYqbm6dT)EH_ZFXJ9}+&e|9T3_=<ufs+j_h>|Z(Mx}sp*!y9NNhwt3c zL|lRP4{(@c_qpRSWi3)~>`e}qp80DYIx|3k%L<?NPUdCl_C(ghpXh{vVe`7I5AU_i zwqmzoBnfZte>~>1G0Io$G?%QDU#ciyeO3|uBf1s4Vz|>l<%4!D*bF;gTlH6DDaz7y zWg_a^pa3wMAVfaVeAliw|B0xK{j>IZ!C|b>tH9o><7Z=scU0j6{D%wm+w;PVPC}6T zMR1KgkIhN1AxJ8%W>Vv=$jz>Hl4)%C(%=~ZDL2B6-jmNW<~wf5+5=lK4X1}O(qR1O zYxsJ+=}(c8i~P`~>l$XN3O>CH)(~;&j{UeUkJYetIZV+bUA}sTAQ9_W^M@|{AILbo z#;7>WrAS)jc6m_}&g0thcDkHchkI@NJ_$-`1#-%Oj7v!-3fSKz{=1gz0|OaEUDy9S zgmc^PR>m~Geai>gqBJtYmAp|IrVj3E`g*`<4NQiQiVVUVNQUr_-<&3*%ng{?cC~$# z|NX1@Qmzy97nq-OTiWD%Rm=4TrWHuygcz`m9$<Vk<uE|-KAwEFMl-d<<eS*`RuCm^ zt|^o1qWM(i&pXJ9)EoJ#0`?8o_^kwaKJDi4dqUX;TT>tVGw-s*kFID~WU0NFmcQ!Y zPJaEX;TsYw7-i^6%z`STlQMsD*rP=&j_w7*y_jAj$5C8ky07BnkOp<gxxiAxjvR%> zu+`BrUXnM4SB>IukwNLlvt{eah@#>K){IN@8E_G>xJsfclMnLiv6l4O)(_X}*>{*H z99Ke=utjmSRoZnd@NB4pneV<lSH)gV0!$&7z38d*7gTt42J3-5eydS5E!p`=cqDY! z6VPcEkn;Oy*ruHE+(%kDlY|DqO6yNcgJG$ZmIxfwtCw6LrC+wALXh<9e89W!*C?1@ z0PQdwPP*u2y;m*W6;3|^UIz*A@^5fPe&n6=A)Qh`LlFc%5vbLKFDZweSM_J=2E&!4 z&UYpRUY1_M6))?OwSpQy0O^r5z6RY{jMx%TG_}Qf1H+Tla|J4`Vf=JR{x#qXwSR4E z4Yy3zFPK(*N0h|FD>35cYY0NJ875~k$7b40Uw|xxAU0h?OjNntr^W!f&~`6|f|Ua8 zJ#;8CuSVQ7!42&?S@xa%!@Tdp{Pq$cAjkFXIR}kzAE;TZ3$=<^DSO8%tum20R@v*g z{#<Q`E5IHLO5DA`^Fo%qy%03Ezf7j?wo2AE_<?!=HXvd)fu!@{QUwrfSt5hqUlJ=n zg#cOV_*D=rnFyH2cF#|uJ-)+o(Tt6ge<I(YL0H;X^<sgtjUODc&6HIQa$|iLlBWvY z)0HdUCBcrW9h#CEjNrWQ_bkwGLYd2Z_Vl^8%Ih6MKXxt7Hynnkx&nrc%V5fTl7{Fp ztZ*hpTFS}lo=ogs7p0q?ATPkIwtLi6sWEkrv0jMpm#h0dsrNTJ`!NyyrhPv>vd%Jq zdMW{bb({O*XI33HfXCyitbDeseWwkny119Ftr3pMm^f0Nb!9YG?TR1Bjx5a>)s9J% zwOcN~Qk-|&oJ{`0$G?F(J68ce>_s}ylkaF}0<<l1`Q2@-w71DRrER`OS%wEMU7R1j zj(Yw>LzHHs9JMI>JMCe4>q1!DQ@Ng=38MBaDoP#Ux87Nyu*-b#UL@>yF+Q`F36%45 zzFu}dkqp<Y%&Iw(A2(LHvw7gVBW6>BajQ!lByGMD%wr&$V~NQk$HLg^Yx6}oGqp)N zIYfl!A=-W36;eLzyn~>{!Vr<#=MRswW|*etL|{_90vBxS#Q^)o^XbIoEB9h6k7|5V zXDe_TV{Q(f&Eh;>UTS%4UHb?f?Sg=}5B{XGZHN2Tr0eX%hy|0^3jG7#QB@2H(+z;D zpafV*mcHtOU;K}qZ7{n@A+*i*{bdC7n}#UsC|#KWz5ziPoV}7(XM;}X>MBimHi9Oh z`Tjy=>RMX#*gAKeY0BAIZ+Jk?8qK6so$z&@PP%~a;X~CBSJL<&cxmgen3N6~U7_o# zmX<G)#(Sh0>%NIbMA%T_Bf)64dyL=-BxP6_&R%cg-Cs-!z5MjM)&xXn-Zdk}h^t-w z9*#`K?MW2nTwt@gjph5>T~l?H3Fx!@irL7=a+=cOSu(g@maz0L&ueg*-f~PF;TSzs z`^@V$Die7@h<l-~kWskQ>B`X*mqi)J2Z{@P>Xs~p{FZR4-T=N9OcGhWoT*W1JHyp| ztV01FVY<c`c5H+rCw-Z3Hhbj0zwIXI-3b4nuO<9D9P-IADk{|2zi|*1QBHr2E_*CN z&2pC}JC1QI2`=a<G69Xrx4rZEX**eo>g@OybYZB^*e?}YbwAD$KKmZ;%|q|J(^Vjf zn!_1ga3Z>f@Q({=x;-lc5pIgAGJ4UEzo4Qr3(k0N78bPU!FA_FygO;!jzr=aD$yyU z^c=|PUZ@oYKC%C~cFQQ5)`C%y=&DBZc^l?WOvpy?cK1W?hV{t4>eNER2d)UX!%$_H zdGyx=VU5{u>Ue|ds>WlEl*^VEXFO%39E15P<8MvVRxXN}ek%J5ph2dP%bnozPcNn> z>Jd6CarJ}USvZ-9DE~>fw#7(l{D&_O-{A4DSOP7H&u4jOQgXaT<E2kj218;tn#nQ) z*KMgreHT=dy!tYn6hGcSqk}T17NvOM2GTx~*t|Xa#@{jUaV_`5!6Ln?*o9#tc;Qg4 zNM^m3quTqTv<kBeLLLx^!HD*eDPTI7#j@vh-dwJcNH>MfL%X`enWG|zxA>{{fcM%e z#N15Bh*c?+XjlC!=9wGFvGFjBs4~zO_ZLCK>nyV|Kl0NfA#xl;ap7a&^EbjVFGlZ) zq}^n>w*%>ney^6yyR3rY0~c$ipmI~2aPp-A3hQw;Oi`m<`rpX<Z6G;u%?~Hx)&ZgL zw%pVP=4L|xQ$p&izlN_-eFxo#T!=i9+qHdH0r0nzf6p9cz+qjWofwhoVPm&=S7_DH z*No4fZ0)av^+)d5Xh3*IFjIC;OSy349OL`p%s}(^n=hby#Wk4@zxl|25)?ght0=Xs zSQ0pV0CV0?Y&o6kf05Wm<%E`4k^>lBk%~Q)#)9%=gGsemp`swHIAI+9>AHDIjKIwW zRD4RfK|DaXMqmH!r=A}+0_BzZ294zO4$@HV)eMk*4fR;e`>A$e9{0{NYnZ<Cd~fL< zoq>@Ze;1%ZtZq7Q8HBhb+G7sX6ul_JK{f}DGy>XdK!(l9ARODp)ZOwxggIyrd$Y8y zDMb|DVr0Am5<C(6=OT7L(zU%|h@tDVsPB#C(5#sHD(Q47QKG3b@-0T&ttv7*0LEo% z=yE^IZ+-i;_#4PuM)AkdMu$wsP*tpU>2MX;B6{@^%DSi`${&FHYiy0RH@5cLYs=B( zOleitplCO!aQl|8v+wXMHT~}L9pk*$g?<jg?0Xk1{uA2#<#1G%7)c+<PS@*kq3(d| zK2&$S$1{cIdf!Upa_+NSmPp>&bV8ON(I}@R<ncnzba^8<oLelnN3>*3_Y>{rmvi#L z$#`KaG+>wqB70TpIhgQe2%V^h8B1qyLP@Sbgxs0KdTr!cH3>Jjd=8GT3aj*3HGXoQ zVR&H^w(!N6AH$v;h`b!H3EP9^YLWKCnZ?CyocX(l0bn#%MOU$fmsqX2X1(0iY>_8( zeuCd?b6TwHnUlZG<(Q{tGuWc7T;%+xm?`7)I>eEJT$14JkbA@yndmQ>daoLd%!(bp zw;$27wCj+eXMGz5^!*>I?C8!*+$yGg>>FA)H{=o(!8^B(IHcrlGO9kNn)lKRW8Y5L z4XA|;M7#-H;qQrI<_q4Dgo$#jeh*m7D+LEbkkdOIv-`4R;w)|6BQ*H!2-jofc9$!> ztH$2JbzX?iSfw-TYHF)pA8XRxZ<gBn)>d5S@p>UPiJ%P*PMYKd+4*%sA$3$>|D_p= zpknqE&SE}i&K~oEtE~I6O0KN2Qo1(O+RFBPO%nE~HVVsEoOG2ID4%8wG7Hf*l+5O) zq%KVbvvAiorRdnG=Ea!4inyE}vlW4%Nan+ate0JwrNtWC^wi+Z=W>dqP=bEuI<!xc zi{o41dzbP+hLmFA7r_1q?w2nU%!M?0okEoe#XEJ;%(&4re{K@25Q~=;CmE%@L%c}= zyLK=kIueAc1v!jCWe4j3Uqva@&7*oN(akH5dK>smg#V8IyAhWuoC>Y42{PE0{Kh3_ zP9oeA4AH3pVweaq_=xGf#a*&byL!j-^sgzp+t2Xu@`r=@77zAL5{|ptT`DtbmTfV# zF&;bqN`-d62^G!asO7U(*`;{JOn>nuyG$ySpw+$Fg!)<(h4_t-=L3$Ywk1h#?8}s4 zc{D9M*->^Yml+?S*oPHU&f9>gMgxQ2hQi7UNO{~Vw)(8lHFdpLBvdbg>xr6Q3=uS^ zf~W&9bm4$ch%l32)~&I9eeKo=95SQAP&9}mskozw!-}|K=$02P(pdg+A1MevuiZw9 zBGj!<V$ufnUteX?t}h6cQpb=djdReG4zbhv5^ZGM>x>-(0>O97u8^{TP3WVF-(Smi z=N{O1vlmyF7EQ~hO$)6W9!L1{U?aq-Hf{QZAO8`iY1F6l*0T=Z*`dVMJKoBhd5=>= z6)=2KHv?>l1<FZmaN|ZO8W#eX*WPcneT5&{)SCnEnm<E<%X8Zo^M7@|ItMQx)|Lei z*_P-!9}MNSF=)oS^%$v2N{SgeXfeSb<ja9tzJ#BdsfGG{6Z%Z6J%t!$z|6*pj^298 z_XMm+9=L!Kj^^R<by~S#{x5g688poX6B$w4M%&E4^2TCJa7f#6{dQ!sD5Pvw!CVJG zO3dew@45%gi>3PVR$n$=`;=LeYQWZ(k`+b!5$l;PDa%pAFiWjUzp9>~p~^~jxpNOM zDG!>}{n%_oTST6X`^_PpB(1P=36VRNu<=I`nDWTr`Rgzu3|><9HHNB->5)n&k@}^F z&`P#672)Y74Oc(>VTq|N^Q1~7nxL3)3fK1@KbD(Xa?xi3J8wd!6^9T^v=C5teI=OD zg3+p6zwOK_cWZsQHVZDD0b}Gq9#$f({CXxK4e9xnKIv7~e>kxVhlKadbsm2{;<<Yc z<8bT$Jz5em_TFcc^a*cD^EqX41wYmf#w@yWBnK`|wl-B$-ZUbf5pXmHoH#7D`&iVu z-BL58;U}#)E<QIbM3_azkO?PP<j&F#!YIhg+4t#rUXpT(s<k<;Mz>QG8p=7KJisVQ zjsUpw#G=-k*y3inycd?6RIF{EZ2kuMR&m?m;_guLX~#dxy^Ub?i5^Wz2a2_yrM&r8 z>6<Qw0&4f$vFeD(HHcOq=+m3pVSXpG!ge!^Lu_k^9}un8XYeNAil&EPbbBK9q%2zD z%zZtF`teVOX`cZnGK>|{v-W~L-VNQV0HyAehuvWGZR3KQ0%fkL)U%wH>IUYnBdvL_ zLuKoSrRc^aeTlPyWy0Z5XZato)1ZDi=ky%Np|qj1Rb%f*>qGfab80`c4oNlZjvAGC z$KZyB`2!pES|CTw$Opn7Ztw3*em};(4Cv0pip%^^=R1Ely{bV2mxgFu2bdwYXJAb+ z@t^gE<G;wssl~leNHo&FtO$o&+?+mD8RcG!w&3A!?j`5$52zjbEq`-g2nJL%kyLyC zxKCScu7&T{(rAwA=?;E8oc*cn&TdN8-x#2-_A@v#8&_Cgt9-V5#ASHtDwCHf3~lEW zjOZJ(Co|DH`Gi!Q5`>ZW#(o?FFQIaB2|jMKF_7)8>oj`<JuwW&^sKdpgr{F#QT2oL zd_8|JWI1|%0W55;`-u_KKKiXV6+J%{%e?cre|x;ip8aWA=@<A??`J&kH=8}9;t|-0 z)|H!RexAl?s9YMd=d)Qi%5yhD!H4c>te72q3`f5?TP-`qFeoOWhtsGuoV4=Hd@B_{ z1nAEZ4P<JUSw}x=cy$KcvXqC|S6nFIlXe0Mlc-KqkyFHXwjteFmO)%3?}l9_aE8cZ z{WJ3TJ)Jh|SG0#95i{W@WL~2LYqu*PkNF0dLMI)o#q8{QljIQ-A^Ejvu?w{nhq)JD zdyVE8oa3ay;#BkZUZbAEiq3(cXaWCTY1=LG<R0v%+20cHeM0P@i5Dp$h)zrvXeuBk z<KA12x<>S<mKe5`^~o<up}Kad5R)VZIi8$&2{}-AF^PPX5@4G}I{d9=7<qY*{a#a$ z<&L@puKQZt5*tp8bbAlhvdQJ#U4p(Ur9%P{9ZZQNx5vyy&SvMl^jR~x`6h&GhBqRf z45)m{7hlAFz4EI{u?5-`+8jl_nI;3e-lZZnGVku$oD(+BEs3wPuGT6!vIyz=Syl!` zHkS#@n2%-ji`Xl*!0b9^l)j`2M)X0m5R8gWPUnP?3?KFP*VU_`DT#6FS4>vr7)Y#! zF7te;ZsfDG()ay1*k1X)QwQN&xK4N0nciEwd_s;{qME88=EcOuub%xERZxbtLymkx zw0`1oA&dPt8b2j?t)4}`AI%T$U>e^%Yu4L`XseG;SI^6O2@`_qzi*!QlK2((-D`lt zffzBHLIFvAceiRk8!A+_7OL1%sl~p@eTW)2{r;xUf?4lmFlsDzsYSdV8NRL^awy<j zz<;H6*EpIjH*jTsH>S53to7aWFr+w`>t5h_6j?(G{anxUAVWdi-c%m_{*dozhaVj| z-Ry?iK9k!|p&O~0zmWl+;o>SKlW}^!#$lfJu_V@F8%YWlo?gerDLqJg_ti25kTlIP zLHU&|XNCm&AsyD1oRq+MXYgD3gN|{BTwF`lqp<jXzSUz=4s!ZS7^s)Jkh#?Q`v7p? zh~wd-_c-6AHQYDP<xuqMHG9;@A!HsHQOFCv{<%FoQhnLU$7S+&uM;iVrbx3HmLVEm zdeaxndLJZNT1qjmS`r(2U6EG7258+t{(KO<NbBTWN0&JO6JJ4HR!SD-*qQZ|LZ&_a zf6FHNCRqZz01i}N$?(0qHX5Th48cbd=ko<jA)Nk?Y_hPfAI_6wy|$@v$l)!x+321_ zm2L6qFBvjtIP0gK*>)fGt@9<UDoSgPhStF@QIaBa(=}kX1lg@qZ0ZlD6BQ{0GJ!qZ zu4dPx;wM6TBDg|b;;DeJ#&i5N{eg)-N0LNCBE4+RZf&gXrN_vFy);<u=-Mkz+$4|~ z;@$bc3y(RQIYODfQz66&pAbX9#;yMGjw$-y&2!ZIuamH@cKWmVqE4?XHcLOPxe(i? zklQioyLj6k+j$J+VS^LFZscg7Ngn2Rm$B^LvBuBr;TFSomrXuPI~io8Tu%J8I9-3- zffA)T?5G(z@qcyYZkt62&m0VAIvllwONZ$LH3aMPqF$|Vm!K$eI(>+g;|0-_kmu7m zr$YIbd7*yHn^bQW!<_XS7tUs$4S#$^m-hQ2(=<TG?<mVi+h*sgVf*bt<zzvA9WkO3 zTQq>BfL-%3K*l?z1|i=MmR~JdYb>>Hi*pG8l3T`5r+5GmA9k5Ikhg!fYzKe8whdIT zQ5XLX^k9>(C=dPU>()CmhLh0jO+D2+I#w6(>6dnhi?xQ0hHco5sp)Nv`>CAWvtTZ~ z4Y_2X)<c>;)5A20Sv1%77b#N(cZG-b^nc|#9)YC&^K;>!x8b_pfong>W|lYgp<K0T zjjF>)moeR$O4u^l&j+!Kw4s@Vx-VZLF9r$ThakRHv1hqKRCHJ%IV-wvAUQ`&ctBzb zGdt1mDok}V;;_W&1!*d*b`nsit>p87Fm;OiZ2HP#HpYb)RpY(-Lo|aD-rVCft6jVP zZ^i%CT$n3~$6Gvbo!fHkF11t79QV=VpiX=NeY@!kC%65J>bF-8a8vsx+ajW>pOwE# zkUuS4b^e9XastS`Z)bV=b@1=0<&9fCeg|@C$N3NLJGE$Z+9)gyVfibc`4QOz$uREE zK1(Juj-OL$<*F95;r^or>}mk7bEU|`Wtu=c(^EFlK*!=6A8JWW08Rf0f#IB=>GJKS zb+!1UT*o8<c}WbPZe&0rzv>yk_?_3pCxHLeM~!_Pe!&W4JsR{_r~(B2mCEG`BMRK? z$2R!&_^kz(h20nlfTcl1tse9V!A678duAL%;Pi%%iv*i^pN=LL>vkKQYN4FWkXHxD z1ITB`dEbZc)<Z34%V&Id$xczXtktyxOz<e2H+Me+Vj7wP*^nNqXUZ1OvPKNBmd}63 zhKRSq3Uc?-Um_lCJQw>dpY|;{VOV-?=fH)f`q?*->(b+VG5oS$q+itqs~)}s-gcJP zdfm1)rC;nJ_XPTsH<N(Vk2G?jbkHui)Z^^|;1PeQA<s7Ttk9ANPFRP6%otO0qe^0f zJS(m(#arbt(|gO&pb<nIE%4*LU}Yfnaa31cNPFeWAw4@mD6<^(z4ki{nspS*4)(9r z<4@awHwTQ56A|<VlwE#i<O%-YyDXj=k$(sKi(Rf&vh1JY%3e$RNr3BEG}i-Fd|$Qk zl5yUnujIcU72Vs3y?0xkTcuJrt<V`x=pE$v2$oT|tm)iEC17{zKg_}&N)!dWR^YPo zm&hbJt~K}@hZPa<hCp?zSo0gQ*iB^H?(k3q)_UST7Wubl`WGn)wm~8_icHj@r_HCF zxxLc&j7B~D=)jXo+qkXa;Gn=NG{*H8nGt=GnwDo3VF5Ee1V<$?s~^7dMK9RqIw@1W z@fc@bxqqtVEOLDbG{x)IlOtTI(}KsjZ=|;eUN@Hx0^1H6lPe%*=KA+f+rMU$bw$r7 zE>4ogO~*((YSvI~K0TyGYB%@oaG!w3-L|&DO;@Kqg4jA6b*@9_ysbUkjqFHkQE}mb z4JfEGy$UoFg&!aYgyjV)BHZ5E{q3p(IyZTe;Z%orRCY1V{-y>mXGbM^U5c>MRDJcR zxpG`ox4a;mLMP3uc}l8T9$%{=h#vUb@KbEMy~Hl_41l-v>&G*#cARiP<vVmw6L)wW z`yPS#84A@I@+=Hu;_|Rj#38+<oJ@7Awv8zer4W3>OBbsVZ=Mx{f%FIobHV9X!b5$Z zi?icy!ly}n*>UE+#=-CnT}wxjbknRf@pDwQUPOe5_uE|j;2b5SQDXO2h48dTY)Vl_ zP6AKj_ZL~`q0t-=y?!jF1jxbr37>S3L8sYYSrNnLKpLuV=844u6>WlpuZ`LWiIm60 zDtWvk^xAFuI;|Qn>Mm<|ATas64FBj1@#g;dw{yz@T1DVk)E8$K1|{&Ic7@7?9DY2m z{8x3O&LZu^)ECe3#kK5B=v7m-4*N@T9C0LNkjp--UwRq?v2@6ZS5eM#rN(0fwEJFB zTG#uHcW9@*q|x=Pj}4}8{554N5g^fn`iCaCW`P%gV3q?O(ER}1@S3dSP^3uiCScAQ zssx=Euj%W7N(v@_h1`a`(U%gz>8urm{(Nn6-FdOC3Z4ishZJUdRK-UdfX`lCD^4Qi zRuDHAx~iY$n*(-c+#}m_YK(kQL$V3N!FCWw{l_ZzxuZS|PO&Waq@SeK_I~#wad01_ zOQ<!8NQOluwJPU_Gu>5E;w&R_Gq#)CE9>d=Fs?z|jE!6=GP<DK&`7gptocueBje^T z?klOC=@qM2M@Or@5vmg)QPXhR-ViX9jg>E%5OSyRAeMO@#5*D=s_di|YwYRyJIB%R zInrmzQ~ItC`LN;NfpM|jfr*a!muo>v<*JTI<l9^!BRi1(x#G_(9s`UiWengY7V|q= z%4|a0xF4~X%$;k7QtquS)F_!c8e`5@CRJ|ruW+!<i3U?^IoY4;4yyDzwd&M~-Lv^W zDvJ3`n(+fIyPf(HHqhOAUzqTIzDYDbMc^bm>1|9`Fm;ciqm5Gj*`$(+73F4Oav)D6 zD!UqXOoXv`W!MTP;t}{oFZv~;vNQ<t0bn`ccjGR&lo^n}szRwV2phYF%LsxbF~I;% znzC0TZAREZ8sIyFLxn2C_|v5u5+zkNHFHtW8jjWg$(8ne&z|sxygI>EyRisW+so1^ zb(mM?n=ylibT(zWCIywA6U{l*?w!oXwJhF@5LY7K3YBWqpprO>N@xi^HEw46lZkuI z04%;u*1Md3(=wIa-OdevwmZvT4~k^nmTwP$y{9FwF$3miJFbz*$jhRkdo~kw8h<zj zx=vYqou{vV?obYb9n18g`Iz>;2s&O2VHF;7rMsU5SBq@*oM4bS88IvsggKca#bTK~ ziZV1CvOG@R2cLE}j{1*5*wUJWsz0JB!DxviJ!$V&;q$6VBM&?E54?wlkfTgOO}#JK zyJwY6ReQ2me}$h0(GeQmJl+#wa(L=)6kbKU;CHDz_^rH;+6eh`m&%9bD*2BQjV$!a zk1=JKYZ@$uqm_2)%O86bKH(;JwJ88L3Q%CW^>=%}AHVt)MTZ@Ua<smBW~s_vYh>;b znu`W{RO+C8l*Lg1HX-rXDJHupCS*6UcVZJ$`&1qSb?^=<?!K75ek{6{#KOd;|Etw$ zmMDO*730s5HM5JX4Q*m>qh)~o4NjF;<E<k6yv9I#y7;Hm3A_^}T0wv{<QDjITsx3s zfvGjN!xXs=;rM*oGNKw^i~2Vz-0dAnu4oiN`=95k9rUQbm#sdC@ecs=$H_KtJU9mX z1kvmCnqZDsj8mqm%!svbNnD~2?i5XoJlnROCwrs_G+|*$%l?Xq$_rs<V1h>e2_IwL z7)izzaH6+KAxXw+JejQ+O=3bx>~!1$XWqS)^V^F%8K_B;(1++U%N|>y>519R*S4WP z;Hw#t##SC|=b<svXc|2wq&gOKYon(zM#)pO%dPTGWau^M!hYM(^a{KB)dU_QM5xw* z<$m>#rJUcg2aWED*CqdU`lf(CuOjsWd%75Y&8sXG%=)a7TDpKS{o~olX;^lZSV+Y; zKRDOKvK*4zX*rzdA&4nSPd=TyK;CZ?@>2u?|Lu;zT-AS6US0nq<;vBjXjrGYfUXBY zbk`hD)efES8mX!Lfuau06TnK`e_YV%X2e++<;Kk?uYhIdE5e+2JzM(-jvO|wdcyDh zJ2(Cx0DeG$zic7Laa{fkXNs`}qM^=H_`izK&w10yrw3l;$MJU+f?kRJ?492&oK^qW zl(44!Ou2CqKO$y~(=Pzw4Z6XPP0@#uSP1d0BmWMS^4@h(A9h}L>*3)Gf98*d<gbYS zw^=ou002M$Nkl<Z;Q&{?<<;fptN+!DRpiEwJA`y{nSlHlP{TNd|4<SV=`Fa9bM(<s z|0x%M7Ls2FKak(yg0C;KgGzYFkPv6&=X$t^f0b({c&1rtVR%od^wVF0O<@squY>dK z2O^#S;=h$WH-EWIZ$AZDW(Q?RuArmwQ6h26#(iCiK8(8%{Pg|5y6pa^x9LfF8HQ|` z$se2MWNr<2VE#el#aEJ}bKK5~TU1;N@SMsCkAJ2HX5>r>kocm0IrIa$<6|EvyKcEj z#OoG}_?Y4Ho1t|GzS9U*BO!P%3%>NXe(MQF9{jEh|4{z>6gZGG<Doy~z@#OzM2j%G zO|4Xr2*jKL;9igZUDnZm^b-(vLQldCU8A2WD=>YX2i|?@6q!le?>PP-;mG4>g5fqI z{6iCbW7j-qbo$11<<^h>P5IDU{<J*!vEPYsl;|aH;@>4|4`hFz{m6&P`+n*>%OxB1 zjLqf^c|oWlVp2L7{L1VfUNo`}oRVz#Bk#HlBzIT+i%BLf?4OGi;-!CjNELo@q*fVx z>t%-)FT6NyhZZlKckh`m^S57DcHjENa?{7(Q?7gKAC>pgu6}!G*Ov|2rP+GQ8Rdkt z?^#a0*8}u|xl7Bb_r0v#`tc8xO){K#7@lWdwEKcRrOYj72sw!SWq<ZRFSw+?3Xjdr zuHPhXl!^b)BQ?v2-wCWCM&P}G(F-*hJMibZ5=?z1UN!1Bs8^QpJYvGDlzaGY(*c|3 zBAXb;dtbQif5!K{uuRYC=UKYM=!$_JhpeG%YqWukT1uoL|MNR{lz0E;Pxy-vT#S%> zvG44`;bYXL;IF==@r{O|$(U~R#z?hKMe7pvF1thRAN&B(!9#e3w*(lM_6oKX`7a0F zzlCJ_d%8>vdQNFW04uLlj+LPHjzIDUfH(E(jbnm~MGMegyr_<`c`)kc*Sxr#@O{6k zHg%%b2%;}X5=Oevij@9++8=()<DON%^xnVp>Xw1+V4U^GY8U#u5uhoCFe&uO#Xu#^ z?OwdlSAWpYz0qAV>J8^VP^3(jet7%BYktj6G%ez|b;GkU`~s`*QHx$kW*xx6yy!rg zg+=^!%F5-(u%wj#{GQ!qj}{_+7+Ey%><-8Xx}^Cr`Jpq`EhbWmcYv%!`Zh>yQaANe zz^LQUpL^@bm^QXL-3L1Wk?Y_whR(Wi{q^u68|*OqI)9YG`wFef4EZ2jCOf`DdcIx( z|G}63csc*FuPNK~lLD1fq}Ay!3Tm+sD0P|g?mvEMx#Kl2Dwl8DP&R6E<4W4?>XLFZ z95U>{x{Ufp|ApGpe!xh#VIM}|!v(eV=>j;1`mcR}WegpTM*XE64@N(FhCyF&iPvc^ zUZiWj<+n$#t<Pushy~rV87l0OV0nIShhh>t2YYwlRQ7!KrgG<JuPWF4{Ts{GRc@#1 zrFF;Y`6+G<`dK#N;?Mu|5dr)i$baaY{n4jCs786-O54S2v!bzRAfdyWwIZW78o;<f z+t7Y?-g1Lc6F<CbBuInkFk(OM6}VFFdCo<|e(^(NF<%k)8IudscwSLo9l!9>a^l0E zaLDuz`G4zAeOH;)MWKJPfd>8ac3=BKFNpAkEU!R*p6ie>usX+q3je#fpZ}@xK>GJs z19%2GT=6${U`#<MN^}G#K2tL3@E1g>Z@wXRSckPCkcHsAlJrP)2zVw|0B9qR1K#%j zw`&2T>QoSY#?nYzC#BI&BYkSq+`0EJdvql*y<5NKDqOzj7hGwZP$3%nO+1rp1wt;S zkA;qMu1|N4KBiv{OyoSIyYAkXuL}M9^c>GEAA4WfDB@;CE6>(=;ulT1T|Xj!^9ZeK zAINi<4~BpmO(T6qo4T>~?A8^ZCO3XMo-0C}oh@iKa4j~&8M||8LhNb_nzA3IdDjJ; zCu4aKPQ*YgdiGFe6deqYu97E^@u4odxF6kJuUh_qxBkFYVTW}`9enZu6Uws#!%tZt zKfe8O-_5h-FMjx&%2QtTJ|xklPHxm#AV@6|ZLj}{Czms?eP4Od@f$s<#j{n2REv1) z0faS;!FScEo2(d|4}_m?m7RLFhVGvFtGuR74(*Rc19I~7FW9bB#IA^5bZh<2XlI38 z0xw?ZtFf415xaLn^^7(C7$4$m_$Lb)Ji%X>K-fxr)!7g3Vnh0{+e7@rU$LvyfX^JL z0}+XHtt0Q49t}Z<@|(}UziaYvF#XeSq)!6Y^RVrU@BOQY)s;?YF*zbW$l@6O&muf! zy%_y)#V4QwAuJN(n4dV$>#OYd{qHZYjl-T%#c@buUmLlRw(38hdEYzB^;iC#A9&^) zV8|aj=1s}y2n)fF_BaUsl$C&>-UrozF?pv*4Y4-r`}jN5zgwdtNIUqB>@oOp`A-5q z9^w^p6RR@>LQJGM(}v*2`<P)<v42~_N1q<v4rZ~ictJcm%hPNiJMSvDzUM7v+e5!G zz-d>9B+2p^sRM7<b-~OKe%*a8FT4NwuN4J!Rmr%5@I$DzlS4uB>d~Ms6luc&nP}y? zlYI&z&`k2PFXDs+%&CumMpV}05P#Cz*Dam?e|zo!){pfGCrbnojkzE{Z#Qbd)QuN2 zZbh~=sL;R45wbELI<15*a_akr9ul5!N$t=T|BPswUZ<}zZroD#ZroJX>0bPley^qI z7i_1rFx<O)XPKJcRd(yVPjBztd*^N1DbVdF$qISoi|+`Y1Woioz;+&S>k~Tw!7KIy zuU>GfKRWYO6c4=(i8Vi?`b!xZvHH?#ozyXpHhA*`7os2e!IA4^7{}?W)%U#P`tp_+ zKd*e_PyBkv8e-|i6gr^pE7yIlyyHh6SMEQ3M>$<PFR?i0c_S%6V<UGzI4!-$tid=v zJYy`BdR$f3>eSaQ0B?olNOy1j9mxLBBl5)$kT*6yBOB*=jcGXvF_T-!=p1?S)R{W@ z3>;%~W}zb~J4U75vl3!lCd&A>5IeeByimt8Foy2bY?}&Q3jk#3sN#rhU&otqiHq0^ zZ|S|)cRoj>_F%(&jOpe@4+C^YJA}XfLw|1`f|rON$W7FVM)$1w;K;r)7!VmjKfI*8 zhrF@yV__&!d-sJMnA4yAD-quewt)SDc8~_>_M;#Eg}nUj3%=J6P{$ABvf~;0<IF!P z#~J2VB)`Ex4BhcB{S$YCf3T1OdCDes%~cmlcWVb<>#}Vj_=Cy6W72ZjAOAw|T5wCb zRf)lk08N!n9Se~+Q3FD0cb_G|8<qp`GHjeG)T9M~s#yeZ8{&(ve@WSTdB1>3;Q>03 zeahB#v@Mo~@W(yw8RZKf`fE*|5d<Kc+ZD;b1*E!I1dQ_U@jC^Ja`6HEdo{!Qmq_Kc zyLGR5^L-vNLemicq0s;Nx4o+9J*%eGhR?2%XvhgBg%fS!jDHv;>0Je+L%}}|f3I)* z{&LR0e{4DaK9_pz#STOM=>tvBF@MYT<(7YXXSqweN;|H-s_gmlXS7YO*OIFdo(QPx zY$fo>&O#*ftUkz}zy*uwj|Jrvix^U6+-*_geqCD?1nmhwBAlZL9$EQYNyv=_BQg{H ze6{+l&Fjmp|M+L+<L~*Va^dBV9AQ!2oDjv8?|5VR{7ZhgJY@R@y*+i#i<hvi=))2D zvtag&0nh-R>c!Gf|5fbKbs=~=qMB3w=(P@vo}6f_15w8({WszA?6!b9D)rBV;e})6 zF~q|nM!K#SF))ve{AvaHIWftxwF)jSvQ)?7C#3*9s~44H$EErhix*WhC%9FG#pF*t zx+NLEe3v-xg^Mb7Q@Qo{a>@fAW_sOEbrqyjEUG+EI*|R`^09v^8)Wl&@#FhQ3>Hk7 zha5X7t!+XITE?b6?Z<In4Zc8CAM72T{43MCP@B{4`UzkCIGbMz=1}O@(B*Gl`0O&Z z^G>}0G`_;lf|5UQTazj$4$g-vKM&x6&~@-Xtb?XR0<Kigxcult-B5lBmuI(m!06|! z2MtCh0nZm&A|*2_MO`>TltirBvpxv~a54D&I$#GcRueuA1^8I46C80?J(%|CkLzKy zTXgSKuVq%kS%->K7fZuqaX<>gG*&l+-*oTGyahP3XP5CZ-Q~78{E<@V)x=d31Dbzj znINcPRSsRO(D|_V+Mw}kcZPBr;-_LI^xyockCq)beYwo>uo?&|&q=F`Re!a~{Y<0# z=k&ia{0qtdLErP!!7EG+lgLZ@s9uc!+3hEn6Tj}sr94WXn(n;j!{w&GdS$uupRXuW zcigO(L`8t*Rpx%MP}^n^qGR#G?hO1U|0rZ=rxCD&pke(|>=)*a7Wm}fvLG6>y(m8+ z7+$b-efhvIKeL?k$}7wIO?qF&nE$-x#XnrOyzfor(i8OTmL^3n0c}gz89@sF3;z!_ zMLkl*w1&EN`&iv#`d<v*ywrh?7Wtdp>VM?T8*;O7LLe)(KMm_R<HZbvbD7-X%9yGJ zrnk%jH~z})M3lobaxw^0LhOo!UPIC{5xWDLcU~O~30`-0NqrJm#6Oy7;e$!>qmJl0 zVj<6q>@DX${byYV3GhK0x4%k8G`fQhwXcf;UI>2A?%ieAjbALA6%(PG1sNhp9-s{Q z2i0M}&>Hp5)KcW*+nm8q$A=ipuT0PD;`D-_{DX<n4=p!*{L1pVzj;&f?@r10xP26A zjJeRy0WQM7dEqdSRmaevZruMygeicK3FCxC^q?WX=n?Ys_&}sG7l5ZvjJZF2)=v^X z<CSRxL83)6(23!aXp3ytyV{53XDRUAIC3!ZF+ey0i-37q_@`f~uTy8E&Ww){XWy=^ zR&{NZvv2kvgI}*5lDtyDp<|L~{8({w4vuvsBjgMPj^sb;<F;2UV8YN(eC&506u)7U zHt1D482uml!(TLR@N<>TZ6j~z1-PA-Y%H!~aF1E(S9I%fP`6C{;O%H!Mfgp6CHFnP z@5SX_FMWTx$1lC5Oh4#R<xU00yL9!##}CmdsIcSUkBGAVpsBLOA~=d^r%{6C)F0=_ z8?4LIXSMAg1DQ1bxS9@LnBaI01{+}kvsqt}z2By(^5!4aLx&{9Ax3xHep`9%_dKke z{-HlF_t*0-{FDPt&_)o&?>!mlOdYbJob;2+)Y%3V^bJ8qv+{<gj>H(5cSY@=c{Li1 zj=)Vi{y;#CTM_C+nG|HNJ^Yq|i1Z5{MgMT3Mki8T#}j21`(E^`!1FEGfp;_oNS=pv z`Kb=qtFJE(IvL1*ERd8_G$0$Q(Jg0psY1hNh&|q^(87fma?af2!gBi8%I0eS&PEuH z!3L>oqpsrU`YZzf@z=k!;|o3*mPE9U{1WL8Aj3jd#L&2~CdLqRSd5+i{lBVj9qHEi zgy;w16+inl=||rX<s%;a24v;qIT*!x)v-O4ayOBOieC&^cOj%0vgYCcXp4W{JcyIP zSU5}Q3GO<B9puxv5{7=6KM*{VjfID#oIsfQIAea-{ll9Bh5A{j*`IROX)ssUHrLm7 zI%OMY+MIMg@f-e&o+XJZ1)I9?yLaV3gwT@(tmUEsaywS`?1>ZFx%yz0zDLh|9QU9{ z1g-<%XFSN^o;K$==tO<}kjXZ-WN-eLcSleXLfN-PhS*rl=s!}WKjlv)V=(5-x_EOc z6~;mR67lC4jCVNUH=KDvIr~RmTJHIKA1)gn`INFl_wDbhUmf)ui$y;VG9xMTRFwq( zmL8RmtW)YQ^YB4Rn;qs;e#n=UFqAXD7U6k50zPqQY=TJ$TVYvp(uUb`{#ULkfA@c0 zY##pY%6}|>_4G^1gXh0o&e=NGO#}o?FNO?f_B)=(`CkqD!LW~3`KK+dHvQ;_KlF^w znd8t6W%9lL$%hVE;G`|&qJ=i}-7kIuo-wV503FePesv%F4;SKAM_fb@8+pi;w~OzT z0p9<AyxN`Uhu=8qOx|^e7=J$VwpYhO3?8a1f)_D{91^9Fso63b(ob{h40@2M!if_L zmw1Lp{D`qRy@KQT%O4y3Oo;yXzwGDA-dk_*uBU%HP7mI*km1e6@WHJ;bViz_{459< zR!aVd`PH^xbWx3GBKSkkW+>DMGfu_?lYKezs?dK3wMt@Q@PTX3owt`8KJeGQ;#BRe zuu6(gm9S2^2Wd<AtrtJ6?9qhI%ZT#F6IqaS6QObGFy!B&k%_}M%<EtNXCueZ_sGaM zod2Mnf(2+x{9UI7`YhD;$v6D2E~@#-`uciq8#wL;i3gE?ZPtqzCMLgyXzc1TvjA@^ z<$rqJ`f~cypI^@Zoez|m2R>5owa`~XwHvcjGUv+3i$^bJ&>)MKnnVLQD=F4z<U@a} zW4~yn$4~BX;%7l?oW_g2a+MvolFrs!diTBMx69xE#`DT&e(@>gvaK`aB>nyk@Bd)O z21o}q&cl4Nq<+Cm$S)aNuK#K1NHN%mk7tw5wY{E>3H^oSN9A)c{zGTEcws?9ULVB? zRL3O9nSLx<h#VeMj*{L&Pq%efLk2J*?yDSr75SLxeG#WxFI=iGGTGysXaB%&=*{0J zj_7u!{%<0{FGEY;zUkVJl-)Oc-U}En$kfi8fW?LRG@X_3h3HquN*g;z3?2t;8Ggiq zpW$Kmg<D7G{n+n~;HP&L#t4tDU!-kF|83WOrd<7|-}6`D;|FkK*CoHoZl2Iz60b3b z@WxZymhXSnAS%xutIK04HI2y+exoYj1Fr!)`C(CAI!y46czy+ZNB4jT)%8NG#MXYX zZ5@3Vf={?SS1vpL;)=0{Cr97xfAt^#y5)hOIwjRS%EajEspe(iS*Np&QiEol5!d!P zEjH-F6+8<OyqA8Y#NU;xQetZ{oQOQt7(2JUxL0}NW1iOGGA!dQf`2*mU;F3(r@my0 zD<&K@f(`EraNrS=cvpkTH~q;oB=FG|Of;$xZDeYm7U!2Pzva-Mw3vXz>B{BdXZ!Z- z=f13*{_}4vcWv0>uWrXJB?TetBCZ4_fZ#be?(}IUYaOS9*>84DdpKI)eFZJzi61yO zWo%}>3isK*vE1vbx0VO!meE!{JHQn<{Q0V0{q^t3k8`HQ_+J(K5z-!CP|%lUJcD$1 z)nCu=q4UpJEM$heGr7Rw_lj8XQeG&2r>Ggj{$9NbE#STa^h@3R%!}Gsyl|U$`+xYZ za?-zhT)2x2X;S`gdTRXm;BWtwUlrgVdleo2?I!pTKKRK*u9xTj_T!7u+J}Wqe)72& zUJ!V?7GqOd#5h&_hZ_H`_~|FdZ6n><=eaX>V0>FoybO29@ZU+xFBnO=gseu^t&RfO zEBjI2Uw&$J$Aj5VjJ7)P(sw1Io)MVqRGr4lIr@c>s1P)Xsi^N6JrKO0gXP32cu&Y0 z&5ousBV&ZOUGpzx_g!~ZJe>N8iBVD<^bZHCV^;{;p`}kf%t?Ay#aHgy*}!PsPXpP2 zS<yfr1A`|R3O?%|BZf~mc3(K}(d~^BwZ&+ViV)O`;a@8Kw|?&0virs__&%u(T$aWn z#<z~Z##M)C1#jwsD<krd3JuUWvw=58_WUmu|Dn>q8t@y>xnH^PCGRgq-w4>D*Qk5T zTEWv-PD04llLTP?kpu6%u#A*P25}-!TAuwLE%138z>_@s7t_>j(pQtV>fJqa3Y_>@ zEO0_5l#vQL^VNG@++hDB^0VB+w#WtymKN}}*|x`6eOj9R0Ruh;=DZ(%5Yp~+_tf87 z;(zErlD4JJ1F!J{%Xlu$Zw6K%oV)+S$~oWtb5%28OD_1ZH2r6POlKkcxkbO-bjK$? z;O9hS%Jr5@O#C_FW6MjiA1+6+T0#cNi!t%RMJcz#*5Ci(<+w{99gXUj<_t`qhfYdM zv;U90{$*w7b)VL^j##+piysQ;Jg4M$@yO@6D9wvh^HH%gevfmQUmkuBw~+s6e3Cg? zqWtJ>TNPZM54ZnLgD?dX1euTiP?-(J)Wgb(<_IuLgvX{rM%~zkSBc4%CT@vHhu!Dn zuj2QF=nx=@+cZ}?d`cR-x&Uzh1>m<|@@RdnP;aqR8xtNoDlA0kKTczOUAmGW+Wfmm z^c6`MK90QZ+y|Jzo<3S*yhEY?sz3Y%UtO@Z$jY1#PKu16lZ6Z{2R38ekA5oh3Zkd4 z(q<ZUSf>1pvy=7Vhv#eIXaCoimraj-X1UYP#l!=Iz9pEtgg1TQ4Zg|4X38L%Xgj$4 z=zFxmXYljxocJbjJ7L6rFeD2}vT=|6daVnRmuk~CRAu=A!2hb~ze5)Ua2&^9@kZ0# zSAU%Vjv)Wmam7DA$ursWRcU_803Vz>_ksGB&i^&py={c8q>c6UE4QEbyy*M9W5KQk zpPcMjK0vBM<!D+&exgkM!+!i2fGWB-87rpqN{n-!_p<O0Ix8J2{X1^Gsr<{!Ur_0v zDjRhn(d{A;+eN>hL$lijKY`fCL&hKUS7toq0{#=I`r{(<qeIHCA94TrbG7|97po@N z0ZTauk_@}x;VcIw`nWBMrZ39}f=|1mPnXviR$89fVW3?f&e#3T>noNt9%1UF6?soh zs*8yz6k_V#FDcs}e%*N&c>&WcUW5tS0K=f2RPK`MqLw<Y^ttNSNBNT<_0(nKPZ|$I z|BWAdS9hP6C)0BglM@k?AitzCH3LtkQuMPh<2O6PcvV|jTMGVu<o)Hh7T`~N(od9a z`tW-%-8Yn~Uf?qqpVnd3=}PUlld)u)dB(*=vV0)>ANI-oYQwXWlF4==#O%sY3k`gz zcUg>Ne@uinGsjuUWuN<;WgLfz*nf_EK>SCM{1=qpQ9{2Jig7DBWa!{{r!(;pfAh0w z+Tol&?}6pQ=f6(<mL7j?Q5x$&@vpbKh(Fi<_3O*d&wWA@zuq>j#Y^0F$!}d@%RRle z{91;Gw5|02<SBQmBbLVt>)`8*ANXIo@Z-%}ktPv8-}SRkE$emJyHT{q&WoOX5ijxe zX}%rC{3lvPclu<qFbVu2g`+2aEyaJV=T5um3gM;HY?4tIY8>RTi0qfvL8meJ{S2wX z_`aL+{!<jS(libM);kT#@44fqa>G^c=_X&$V0fX-JXfcw6BHzn+(&g(r}BsJCp_xA z>es2+Nnr;DSJGdl9~gF9JeH4)qmSBI6!6>&?>^wolP5m>Tcfe|GfW^}6o1!8@N|ts zKfpC_eMOnkPsRJ|b+T#}bQrg{_fZ(ksLrXLA|Lu=NDb<4GaL9ZwJ_X3Ra=dCVf+V^ zpGRK<@Fzd^8D;CYKi9$3ix{zH{Z#o|G$|*D&ip~-N7s~J2Se3S2JZ_31xB-L^1}{b z!@*pc;XQ2lTay1Hoz>9)Qt=-n`h(5R=7#xI<li{KrT7s?-mc39n_`|Sym-;Vh259g ziyv7o_}SNC4DOqUNym?!cidL4{H-7NZ*%pNfBzM6@TN^4%zkq>DPLF@yu~gqx1={* z{D`vcfsZgx5k}zc(BkK{df&_KSO2pXE<E?5MT?%U&)Y^k&loQh44;I4cp*&+f6^bL z>bQ#bb1?avh6&+!WV33z0hz`_kRT$+IqBqp=Suij1=6KH4s=j!51#>YA^3Ozl?hoN z!TU;32cI<#-?}0Ae&W?H7C5+KV&d#+86s;vITvXYO_1d_+MV`?KmMz~*>7BA2Za}P z0m2(ZfXBc)zGDDCC~9=z&~Q9!!mF}p&$_RB7$t2>#2*9)T?{Y||EV{=tlsD4N<$xv z9GR%EWu_INf73(qL;e>1Q2wSW4l{baKM0uEIZr}<LGa@AA58v}gg@o+-(O}g|K|E& zuYQ@g>X5($9UReJcT#>S_UrzZsdB(5?_rKYcor!vejOa`XLkMI%gn(e-1Yu@ApSd{ zTDUf=u&qO}e+zeM_>VRH9WMLh1*G;G*+NY8b@3u&;MtH}+MU>;xVKY<4PW!5a^7=) z7c&WSQ2V6fpA9p-O`}hhcl_8lmAQTMWfQv>eC3#!D0|_SOT6R~rwsdro{ZmlPWjR1 zybk_37!~<42S0x43m|>#@vI;Io#;eIC!NLHO5^8V{chX`|JRS|g>|ubSugr|24+t5 z64&D*BmL9l^|59G_&s8!zvl>^RH>7FiH2qP|61`ssh<GPlm-X=xrPyo4@RROJ^FkE z^ku+<LhyceLpk6Hqdfa!C8|AM!W8%Gsk==NZ0*^#%Z_0R5jvv`&XKPZ6?_caYG3+{ z!_S?0UmGPa&!aVX4jza6dwh0Vgxb$p$g`OoG3XN?@#IR&^6@7h<MiKo!xzfV>p$&< z3tNo*M#(xBEHJ=xLgqwSYj1J+S22`n{fOm4{4a)osq$M(@MnGRua-S0pW~Nl?N)$| zhqNOI59J##x(i(`+kVCHA=&@k34Z8f&L6t{V^0}}hW>{=P9*-^o#c<K6c9o#As?*s zP~^wrCE@eJ&bt!|bh=Bc2|ivZd6yP1Tb}Sk<*e`i1;>@4f1$xi$B*~E?5E587eA#R zo}BhuYq<r(H;;H2eO7T1Tk*nt3H&?K6U(s$$&VPmTYM*fr$6T<imP#B0=}4Se6|fn zURAEk^TGK4n-_d{S*N$Z=S%BYym0%=FBug53h|!z@SxazF;?q$68J~xhiK`DaVKp* zl1gVkhs%FG7lzTomL$nPj^U5Fbw26`eL@b=pGKvF!AocEqoLy-A9mt=Tp6-piI*#} z+YleReDZa_>5d4!OX{13BLchXa30!JmGwS{(z=eS+pZU+*^p(>zJ(;1yy`HlhBZ$0 z<<;B_gNousN4g?W`Q)#AN{@%Z1M!mZFGl~r>On6a?!w@CPls3ORUW)y6Pf8h4$ixz zx@Z{c5Bg^}ZE<Jw0vrjRDy^NIsGk7+5VjQgPa6N(KlK{FM2m+Dxmv`D&}%OjD62BE z43I;ub9R6Exf_b-Kl?_}b;l%p2xWEb$8wgIBy8l}<d5Bj!L6qK;fwf&LZK&ijGM`x z3jx2NPLsU9ZKSKX6aUML%BkP-oYm2P1dc9#eCEAxE1!GIAL@<L`WBr&EMC~b;MO|p z3>CEiV3vU5u$f`}8`_VWb^Ry4uq)wVaRz@ZUUq6{Y3_mlp=^7=!#z@vK}U+5B^wv& zL3K-sU)Npv_vI^kmJyos*%#uupK0Xcw9*gFzV!l)%KMY}4gtT17>5T34Z)U9F2&h( z6@OG87W)fwgpmK_e+l?mzIKe556Y>j+QxuR**DKrW}Ys5DDxrd?5*oX;OWi^3PWUZ z;{}Y$-K)?A$Aaeb?|6-k#YUxe&b$c}gdA;1)P>clCK6@$t8L@(Cw}b{{VgOfNCe`= ziw896KG>nv2CObXginUAGcfB;zn7hTrT7=4|N8g6-HVqra&93ZAFZK$MrPG#gHQyS zpE3HWU$=3aWi!tIV)#RP@O)tTtu^@BttXUi-|^qdF0Ed8tvTNiL#NiE<YN9M58DLt zA|bDo9p@@PnzHRs?4PmkZtxb-1pIG5`$?IDAoF)a`K4VAdF*WPFxy|eQCUbO=gv=v zZ*msCsKDZd3j*GPeU}z5r#|=h%kdBUwu!{w{q&y>8rm;k`sfGBdtdkr{~X2^{UpXF z?YQu}L0r`Nxe*pIBHY(>_%5FV$S;S7XD(dXQ72CDzL)vA&E@Rp{O>x5PD+!AfB*Q) z&+;uVo_pch9lkl`Zyu?vf78z*j43i>JUqaP6Mn|Oh&TOe;p`YjUY(XV{{Wy*BFH>t zJ|0kKQf*ty@oQuU#zZG0DkR}d+S%sSS~5?i@~(>>A%xn#AiOk%va$_$8zE;tQfBVH za7M}Vdgbyh`k_BGm+~H>qY@=TM<^O)XHN~FWPIcBB4pi}7ut|<SU{NYxbh&+h@45B zsQ1h7bY^lq?&047`EFbheu0j|fBIdoFEe{~dW+G|z90iH@L1@<p&)`KFptX86;zU; z&ArRI&081dpFVViS24P5`K>|tlOO$EW%ss|6qxkuxZ=x!SiD({7M%}p9VzPu<)Qqj zuFw|NxcuoGQmzB2e0PV3#Z1mm%ziZLF(ALR56e*e9x3~AjI8+a4?e^{F3#{97A}54 zo!+;!b85Dn@zbv>TQB;Waq?Fse%$hfYs<U-`?r@ZngDorQ9S#?B4Eag06+I4T3Nh! z5+kpV56&pdM5BcN!WYRrsv7>-ec`zmcs%U~eydE)%sLJt7t3Za*n;zi#xn*Dx={Rl z&u>1rOy6~z=;im0Vn@AOym)Sli+A*|qSJ704Em#CCHRNJNO;#(Tp(o8TDc%I1nK0* zyhlQgYc2js{R6_351~;T^_+(eW+tj(&_?PQQ~qG^^j0S;9@%-Q`dkOF@$hau1H%G_ zdxg|}^i?mUx4`4J0QtP_<9e0V6n%1Z43R(8({~~Gtq=PSUum$=#c}BsAB;ZCKH#f! zYb%vnjQ=FPb<)FDe8YU=IvD;T4Ebx`_*-#*R6O&dChtngOEK_}6^lGuow14(B`A)% z;R)Qp%xv1eDF5U5V;siPM~&n3@0*`5H-G7K<p%v~_!mC*!E)ngt}Z+E!+`W3j<py( zol+N*(BBYe=1+dw3*uQARS>AqZQ{Zihc+t0&12g5unpcx*+xEOT4hazlIyDAj|KP) zdMQ)udQ$qgk@s>X*W};Z+obF-Cg_lJOi;wrh;dw;@lze#R`HLh&TT1Y{nFdZrgJZH zOjvFIz2n9&mA`!MqswMR<Shz<-hHXJV7TQH559828*)J=-6CcI`w9ERPa_V%Cp_kl zPp*IP*O#sOy`zjDY0nGAzoo{nn~9HCyw2Y^;(agv<`MImzJ(EAmyShCJo6G(?&BE! z@CIEe^QGc94+0#Ar%b3q7JZ^rZES!)aMIG-pPwNd^kEFf%sz)Z{%IjwjX=z1KF>Xa zrm}1IYIB^41HlW$6jqbClm`cxSwUHRTEs9}@0H{5*3em1&S<f~;$?PvZ@J~8@0IR) z8iTgjaUsumc1m#RFZ+Un@dF7NYBK4E?!NA+<tu;kOP=UZ1B(-{>KH{`h0^y-8IN&z z%#Cj!tvmgEzbC*rRlidFL-?Jy-dJ{g{*z_9tQ;qW_jvvVXAOtN;D@{=CtaP0v~1Nc zUKK7{w{BmQ{~><zJ8r+ZeC~sPSHAd>_m-Rf?PKNk>px$1-S(9-zvB+A@bsneDo~$= z+_FV3mXCIe^o^(W$DLBPo_=0A@A9uN_xlguS!V0EphEPc@*l@fpXKOpA$WdN^ZM<l zm-*YiRQ5=4Y!_RnA{x4ZNg0jHk1}ohr7BnI6MoodSa)}V?<A3S1=D#sD@`pV|CQ=5 zafSFpSC%mi$Ef_xKZgnOpKsT#!%BzYzrHYIVpo}4M|@3s_tuljIlu5$`SsRHN@|JX zWc80N-S(x=l(+uSqso?jyUKR`R@XLe9qHRU8}&Wod}A#XFh^h~Ne!@k%Wmk0mEbT} zF(<aV_{}qN?7r+-zqOqE?EmGiwq=hw8e@Sou#qK3Di`Pf?|%NNaqCF5uNUnsTGsQ> zvEmWWZ4leN=wdh{(99CS$$W9hzm?!mIdsD_hzfy&EQLIa5B*Km=MvKY%pn7i1fOvY z`^k4kMWdP}|7_25w)s4OANI{Y!@A|b^92{D{eVP}DC!97+6ROtEa$F0D;I$`p;98v zOvX%no|Gjh+WZhNXO-C|<oog7iP1e+b|>!ngdZ>lo*-us@M@@zPR5|@`r6+0Q#n%y zKRa7yPCdWux&B%|+rp26#k2StTYrqF(NM1zIXtb-H(W~D_Rw#c4E_QAAARME{PjS; zWl}Qon<j-F`5+hl2To<kj-)D&tfQU&$Z>AV@tr)f9scKc+*z)9*Bi>G^`P9%pZ;js zdDEB5)Sh|6FyVufUjf;qzSDCAjQAQivNbJrFeHSS(B&Qlp1n7HRzHF8nR3;K-&NlK z(w{8rPd>9;{OvzbF8-#cR|xg5^d7SQG)~~JwjdfPZ+z6#%g)!oNVntmhE2JjbgMuH zU*icnMiLAGqcd$?do7RjRiSIohPxR&vT!nA(jSE?i-qKmJW_UDKVWNGNdMX9^FV&! z?&Mo>j`UTbYtM!OJZ)Y3F%HjHhf@|TSP)b0QnD+-H;veR;b%JboN|6S|L5QATPwgs zEDQlJq`&NgmNRc$RptkSzvXjRm$yIfF=hMIeA%ww>e|AGofm!l?icwj^TBZOf>j!a z=o?8@|L~?BzE#4rixIzLcZnC)o&Mb4QlRV?KG3*Q`jh7?700zrT{emSeD=l9?udTA z`aN8{Ks7s>j_4IP_^lYuB-Q8GQ2~sAvff?#J_n><I%e`Pm$8)^L!#f{yrPcra()&8 z(V95xIq9(uvcOsGhN=C!_A$5w>DsemiSXS5CgEVs99DzaZ(!Ba#P|!RgTpg_$Va-Q zq9<t_ieFyNZzHW!pLyLoT&KES>h#&Sy+R9^=ctz&Dm-*#pbVOZj+S{Xl%%+xmr?kw z|LzIpwm1EH=g7R^$TZb%F)_!j2<XNsPI=7tnEpxNPx`<7o<G;UUbYxx#qLF%oQpH` zKoyH*t44H;C+aaX7CgD=!C6?qB>$g%_nXT#?|60j^2a|^=I^-G3lZeaVsV4;&eW>} z%3d@HNq1JA{yjGIj3-E9i_tImb1;lRvGexp%2mJr-^)L}{1?kZp7H$hfN%Iu6V+eJ zZ>ax!e8bbr$6x>AvOzTQFd{m|ci~k+>hO>A5DoMR4ttxaJylOr;MyPhn1Dyo)&3@F z{~=8VZt`CZ`@>Hd7yBiSQ6!e}$y+LM+ei)fysX^wCtqC^ec<@HkpG1)mll74zfr$^ zcg27E=CVz@?c3*O<JOUPUSjb=Oe7BBzY1x#KRk3l|FmI_+7Eo<`^0fBKG|L38&&Hs zd2HEy?}z$<SjM3rwr4q!?ea_K|IQn)E1%MZ_GX@W5xw!yZp2sbzNpUhd;I=j)GpQ> z^ypGLXjwY`o@NG1UV3;hd@5Qn`IE>cwp_$uBaxtkks<*v7A&jOdu_@dI;%q+U_bq+ zo~DrXC}fl>wk5)Q0TX>8RFk}!j-e7!C^xw5>*x~#S_(Y9gW(_^CGrBf5Dz0sFv5?L zF|=63Xu{EV-eN+ZDtFv;UAgUZpDbI?yuf3bf-2eG=%@`GNvnqLQVKo$)90kGe|ov; zjatA6Kf5oqA&Gs{v1mc!EC4(as%7S+v&xiSc!Uyy_u#EVvP}HIeewNoFH^hjEOXpG zk_?c84PNxct)O21BEd$4)Q}Z4uwcPS@oi*^k@<eHGPnK9yUHhj=SRzp*IuP>=<IQ@ z+5*gmS@#Ez7cmv5zXhg&Sj6N)h?nMJ2P~#Y)Mp|KZX5r;`WsW~PhgDu%=*2Q-FwR& z^SjEGFa3$~(YO9l`PLWzzcMqoeq!=VeI`vpUG|=RQJMejhs!<%6UwBdHTlT8klO0m zf6@njXbJI!t#x@xaJBqzrTDQm2carJ(=VY7$3uo$CQnKp4c42A`;Etw=wCx;2*YC- zSH+*>_jPnx`|=Ap1f8b%2<e|~e<$J3i$`j50po8P)!mnwOTM9;^}YYo-It@kKoG~} z=>JQ)UH!K|`^2(cv(a%ZUbJxGoiBWCIv#q}V+5kx@u)6dh;Qr&V;5mEM7>e}VS_=} zQ<!kaC(kbO629H~Mf-EV_cuC{)4sA|IrIaQ@PGUB|H->7esEVju!!NEHN;qv<G9S& z%zxqQP*>^ZYo^tv=|kdNv$YJrqxKa2hP?tVeZ`0k9S34HbsmS&>4>aUU7P+tdv5~o z=~dVFpP9L{WhOHdvTuNZpyC3UQWPsLsBDUTQKeSYYF*lDt1a$pQNijTt+-IDQo**0 zE2u0*6v~beSqz&YB!uh<NhZnccb5O>{rQ~l^Ly@{d*^PyJ4qmC=Kjuk&N<)xd(Qbj z=h;kmgVsN955bfE!9QKS&Tv4z7|cDH)rUIT(wFjlepBZjh6kr{na0ZC@rf`i<&{DU zp~W%sFj3<1;yE)3%qrk{9vFC(!a_)3fcRA=(k8NEaCvc65R>~sPP8j^Gw<Vm_$5fJ zgs^A}CM&0&q~HU*W>7~o_dexp1;1hQwzlcq2e;#QT%XHG+6A%L<`Gyp6+impodG)@ z{|t~RO@}^suKLqo&D$mI@CjbL^U)n2IaD;wjU)Y27l(}f5LDwu_YkpjrLznj?ESMB ziuvQdqyOl}ey6=KS<ixZ@FM&^!%@9;t`P<ue8Oiv>IZrFz*guJ)l!FU$S1*Hc;b?q z;uZ%?J9Jai&Z8UsNaUT@f2jT8zkXbM)^EMFZQpfPhb}BSbXvas=5jHCKjU#<tpMiz z_9M<5pg`ZT|Kf9zC9+~`<Qj0gtRq*3$1yzBpHA>O=|DfE>G^+o5xT6&-E|M>Kbl^H z|HY?ug40JTr)gYH;e^d67>a0kl$gh)w|&L8w~L<rqoTR?@wc4$_xks|vAzBI-`dVn zu;QJU9=LGd3qb&L5sytXr{N0BK8!#6o_L%;{_2FT+5y6+n45TEDVN8%Om@-t=|hb@ z0HSaCp9(##T>dL{Vs=p9YC2OVp}t>7yu&~Dx-id_Uo)>pH&D%7nmi|@=2=`IrFl~U z8H&gG>(|Qo2aoiD{S}~W7BP4^ZvC=_AVOAjAKTV7RjTZINB^uj<meyxlI?WQpJE$E zYI2`jMrUT+Vp)T9w_>x9A?aM0F|PUWSp*h_w|?})^-bec8KdI>>?C+m*72QJyr~<r zCQo-C42%L}U>tpJAEZfpD5PKDcl?uQc%kL&geV=}Wn<&@7OUziKkq5urIxw4%fVJd zfA-+McHr6%c;|(H!#gnI9qkf4WWee`i8|}m?GydGQ9t#lb%Ky=VR8c;FM`^oYqDHh z=H|Eu>F+F^?Qq7!-!6UIJ-N<+)Q3kGcW4q}Fapap+%x(gukzk8++0V!uJuyq_Pnbh zeRU06{qiJ1CaAMT_x$af+n%HMv{!uZliIP_S+l+t{efU1_=~^%U$t2olt~TS@sDx_ zANrl>51o=u<-h5%u>L=-;4SR*{2#r>eh=t>+WzOsLO%p6q>KeEUOJrB85uXSayf;k zjdnikN85$p_#>VpnQ2xsf5v{9dzU-^Uj61*ws$`NTiSy(zwGgx!(78nySZ${9JYn~ z?$`-X(qTrd=fso8FLX<P%-xK0_!{nAR0RRsmdl>rc6{b#T~4F!{<kvz$Lq(D1N+() zFZ~$@E<AX_9M1ZclfTS8%r?wJ=w6%-{847jp$)z>S9Sio-NNPK>lbo@b*c4-UIeo4 zuJXW3uP4y+l?Zjn`UltW#pNtY`9sg$8rC^}MJoMMrY3W2<fo40`g!YDpjQq*+{zt> zLZHf(iz_o`cI-s{sm@gQ_Nqd-QQbWFy8AjhATo`yf#T0Q0jl#3glY(CxQpAt%<*IG z+SmPlv;YycPaG+9t8Q>;Dc6b}DcM>a!JqS#e`Cj)I8PQj49w1pb6IrLgD%pWZFNU} zX?zOw|M3rhX}DJE-H?)1!HlDK=_0m3Pe|t<bFT*eyWP3kqR%Fre6C%eZC8Lnkg;>K z0u@aZ+}XcNfds+HnF?OcR2^+h90V;)B0T!HT{$<;5uAVnd<0mu`E8ggZ>3)Cp`|TT z4PN>K2MlkYJVSWENiYK~0;O{m#Oyk}x4rIp-#iujb!8;$Hrcp!dpojuyX}X$c!y6^ zC!bN#DN5`5t*SJxm;cYVpLv3ho{Dbeu`%u4))6AT?+yN;IYs}UjNcOJ0sW(iwb*~G zQ{U4kn|VPOUUrf5?Vr3|_kbGqe8;b}^S=7qV*vRV@GF@=0~ovEr%S<K@n^r;-uI&K z^NG|R<|54roai`s(Y!$bz~v+6d_O!uu77ocreY_l0{<5oKOXn$z+%jY8jtB|s!P6G zmyV|Fzi<4xZ)qF!iV5cL1T9(9U^2VE8@wA0S=N%HVt}CKsE)ZOhq^k^@>-)hcrINc zU)j{Mu9AOfu!{<A(^O7C!?BvogLl%$b<&^dt4~sNPTBX=oI?NZFWzGxawM9-_ln-$ zvC~N@FfR1+$?&?K;J#o@>bR?#N}3RkLglXW4?UD9la!CEd({BPHOcBj?qfPB!S}GG zFUIT)eVc1mZ8-H2b^63>ey2V7tH0I#%cvmD8&+dzD;#F|gH9D)#)zR;@SC<NDA{vi zJ9f{_Ug!u~yrBjh#uNZfx8t#2BiNJS*Fyi6x4xonlU((fAaZ6Ph>5U|2!k9PaO_1` z?M|b*nd+b|zAchsM*M1Su%nj#MMAwa$OP;%G(n_#?tyWlPuG*1=m<UPmCd0KBDGOR z8~UTb<Vi%oNq;l4<tBZ9!F1Jz4Q~3#JKFW{eN(&Sv0t_(`$23W`ybu;pmu!UP2Muq z?K!52(D29)FditbNF7DQtmNY^H#`I9x^YL!q-x7iRfVqF?yvAx2>g4d%S6X`t?`54 z3+dkice#<hV8-RBicS;#jno%if12yR{HAhgYwq}?g5(C2m4vy_YZk{`&h^`M`z51; zx;%gW54^PPeAGW(v;CH9|98CjN7~JA_&@DIx(AO}MsQ-Yon2l9EdENf=c4Ss!@KWS zQ_fr6mm`0vfX}}Wv{`l)kbC<-`8xY7c*+-}snz@MJvV*4-K{66w(E5jTL`{%0=LnB zaH3U20_X)4x~EdSsD}Bb%mp8;FUoQSKz#C~*a@OcMHm}(0!DJb5znjTe~VuKF}weE z^LIk}J|Ug*stI&^R9vxXfL;h<yf}#VCcTUgJ-S|m2mTSl{7-b5@AJ7Dww>G!0abu+ za@YAMeOy7Y+In@b8sO%`4{Kc@qe#;Lxv-UT9T4aUAxPmv?OX?Q4V0ILCxT|uvmphU z8->snQK7KvKlo&SEjks==DGPzf+He7_{r<_cSAcvkLQBR3y=We2}wJP$vea2iPr48 zcX%oIotHhW?f=`C=o?4E!GbKV{8Wuf7?3;l&wbkW=m-i>n+v}h`nO&2wzlz*-qxs{ z2?7`7^VXvmS;`_KI>qB+`d5#^7E*!n@ZAqCKQVA-R7Ss+t1E~giG--&7Y2()DJ|3l zCao%WSY*X!C);0jrVnP()KdlYb3i8jZJd$ig+!&M_XGQS^m~5mN82U;;~h|6ll>Ng z-*C3>ZMx?sPxkf!%Ngqp{97jdEW>}t@>?hP3VieXDF~0I&@297Ux=`l7@4Oz{<<Pf z55F&;TZq2vp#LeZe{{YQ`B|(<_^HpNb&QU9GLU;fIP2$&(p)k+ym4#0@W=k7ouRjp zmz~!#f10xJmy0;>1E%KRzx}!Av;$YXxt+aDmyxyW!sTstUA(KSg`WA3xq`XS9w6RH ze#eV6(a}XGi`YLw0#gY-TW{oM2ZR%;;LQv$9slK>SO4PoukgGFuY=s!VxIh&$KefG z=FyL+r-bj=MTO4u;32+*{y*mj`q#r(K!5fpp3pWNKHzl%64t78%R0rJXL<GOwWiA) zvFW)o|3xZG79}nT?`0aM20~^8!l{M3nn+xwqo^)N^}AB|A{^lhOBO}%!l;VKTUQ`- z_c_-=$#LwIKl*>3pECydk<zl06Ktr|bz(Gak;ZbkZ<mg!r25M1&w1*1`{p(twaYb0 zIlp>v!y7k#ZP<No<9j<k(@=f#wbB3RAHUFpcJke$e&!)r(GdYh=|9pfu77oRu;3t3 zW%Q>L0_%@}5E|_AFgci>Xt<A#nJ<9j!)V^7)iLkHLGKKDsKO76K76oSljG#Hr@n$P z)#KcvVf(3($!W{R+~DR*QzFjU*QUKUw1a!^5JoWIi(RL(!%FP85d7xzKf}Q%6ML*4 z{h83{XQlodPA3RHo#0FAY4|@jn~dN1dV(dW$YN4-`G4rfexJ_z$B!41A0J0o=#O~| zy|VjxOecbTT7y^S^Kv?ZmqS~0DdlHh-?m@;$dUeob(-U^#_tKe1oJgN@RjY*2j1eH zm$P)w9b>=lrSr?)G#@a(^VAM9X8s`eUU<we`4*Eu^*BuWFeV9RnC2b4slePm&G{Qk zO#FBK^oQ^s2d7xS$}6UAKlGP-ccNh~Jux=Lifz%4x?SRb?m`XbKu1H*rR}$p@z1&? z3Ly$$vE(wusmuR4Wnk#b?@Hklxh)KzJDXVqwN$DL&dauzzsjsS7D1f+_V>L3%1TjH z$~xlEKgz?L`J)|2n<O_<J5<f+eJM>rif^V;b>$9bWW^ni`KqCBM?MFh#+A@NK6|(w zy!ySPOGlDbY;gucutxBL{N!*uw#8!l$35ta&M1`rz=uw$r_6mtbU~l~;HGluGF3P* zQ5kq>x}7$`RGClC(*;{nrp@ggrpn%u6hg}c4MjfKvhLC+klCd(v5&s?rQ&*J`ZK`D zeha~G+PSCizR;>2A)nF7xG>*!McH!pI`^d9WpNI4)uqFyEj;2|InF2Jhr^Zlzrp9( z51Wt%U5|7=)TM)dS2zD)d2Ifv1Rs$i6N@(XA$UPU%wGgB+^oxcUJjjketXCZ-qbd0 zt}A^Tgd^1NALUV0*A>-cTf33Y`kSPM;Ex=*r~SqEJicwb^{RHxc0D|xdtP$SogOaG znHBfY<$jmUf0%}OgA*y{5%_@GYU~eWg18E1ir?k)A75F${P%Zw{Kr9>bct_SbA9~S z{3^#bv_!vyt>~BktFqsKXA%2r{RvTi?YJBdjw;5+_4CWcxQEHg;h~+sOhhc4KJN5c z9C`lViz<ts{`@`w%Eykh8{YC~X0_Nw$?)4%*xS1DsT96(-#Q-G?RbnHz11MkE=+<L zzr9i5=RNJ;EeXF8`d9w>i?SQSqAr>0EsX>*=)u8(=t7iZCz!3W^3+FeGe=z)2zcW{ zBLxF4(c;h(1pU>{j!MA~LaN17$27-fV2yV!{et(+cWU3*X__CAnNiS!EjiO7kYOA7 z?yD{rSn#aHe(*bn-@IdwAM+c_-?_C;PQ|}EtV#Y)S$Mljd<u8qkF<9C2?_pG2p`b@ zvi$Fawx4U9a?cq%3_1DI;_aYCA7j+Y<I6_peP;WN=fAOWgFCvOuKi9Pzjxn!ZF|-C zT-J6RyuF>H%SPPuGI_EwyRqD#$Na|}<he;qF;}d0{BQ}$vw`rj@Nx@4b`RpKr$c@( z{GyMZi=IjzD|PI)Ue`IMbGOaP*01$|M{lf$-o=)$;ccq&i6Qf+I2`=XGAUS2TL1Zz zm_Z39$XJki?pm8a_5Ij=R3^D^N^62g%rSkO*t-D`&>y=6xqPIuR%GwOsQ$WFz1Y;% zsZ<z8Q7w)$NeI>JP<(Hwt;8|>xljGKzB8PGUvH<x={M+R(9L_!H}I+8i|lgf-}0tE z%4HqN=K-u->$ybMqAwoJb+^alxH|>y5z9TzlPX*{f~OvQ+1cqqOULcLDnp4aXHR~@ z={w6^8(kT<1PedQqi?o_!}KK={L8Ekn&2fnLa{TKm5$tTvwEn%iIMk$YfU+Is;-uW z>{nm~KcgKOloAX=HY$(hH%{8<*!xf%>Z#UWwe=#Id7fONVmS9oF++X9ECvtefzB%E z-&^p@(LbtyKay=CK`krC%z{pn@w*!RpKkdvc>HU!xRm`*H~--yXU2?QlE<=m<iv~D z<@59n`SH(uLVL(h{)N=l?XiIVaaU4}pBydUeq;DsKXQ3{{SQ2;?P*68yzsgPT{6;c zt6#gIiH@fgz4O8@vv|txQtp9F002M$Nkl<ZE^~yAMVLP{orPPJU$B6cZV;4^SS(UX zesnA$BHf}AONdA#u{2AgfFJ_WCDPr^(o3gwOS>!`+k1KLeeU0I&NttjnRni)S2Y7x z)slcLXqstot76}=ANdRKo1ZSInNJZ0vFt-Y&Msm|TMw`AaG~^ZVJ|_Wkg)3XM^Jxm z$nsc5wyH@?{wEi@k|D>9hc1rQ;GO<el4Q+`x3f}yB<Yu8TAmz`8So2v-GA+sazV^e zf+|C^?5-{Sp-hhX+eMEWYo{)rGTNV#yS24(t_K9Hv|*gTM1xX8j13_dcTQxzgx**C z3w#<%fJnhrBVax`Yaegc@<U&;C$t{!dgo&74x2~<`SyMCo{U`_ZunhcRw$<z$Hv>= zPuD+5v|#bN%O+jL@z-VrHautjoP2E#B7c_l5oUDC7wR{fSifl`S+fNv)%qif%+Ec1 z8Y|W=SzZWgNQ<9B@QgPMA@UGIJ)4oD+CMbANH3*^UiI82q};rx9ie|Lj7>y`OTSo5 z`OM6q;d?$l%$s7mNN~5|K{70Oifc&^HwBrlR_qqBgZ_fFZS9}C%|FRZf#)9d*7-zM zO$DbZbUh&b=_&+&3vrarKJS|iM8yVwOLTvZ+1^nwu<5WewH4iXW*bpB>4*Sb6iYqK z<NlE4i_#;<|7r+l9WPB)sJB2@LK$ov*$)g)4T87+!y2w(-k~k!Hr!Z3p?e5OA?!Dy zlZeGKv*ulD-1(OVDCJWQGcTc~cKG8Vjyua^;vc(##0jHQfNiqOIGA1-%Z_2E=-vmS z*0u_Yb_#;E)zz*1zQ>btxE*a+vL62LDosY-No_+YNw~D0^Evi4tZe`FC+Gd0GNZd! zwwT|o*O?7Mbh+8G6ke)-NnRavh_ajT{#nT{*<%1H1Txca9bE=ZMo;MoyL}3s71N!V zpq7d_uSz_6dqCTS{_!7Gtzkdor;eJ-0a8h8V?KZA&|k-Ifj7D2(2EP`YQpN-Q+A&! zPaG0kOu*RniA3W~L<rSCpNLd#Ye#IVd1xx0C?0kv{cfe7EQIg4zSSp4?hggGP=+sF z1vS}<24ubyIuf;;u?-MS9j}{<nRj2L41&wd3DyBqlfLU2%KCnGF0uXRt|H77#;iFy z4G64_KE$Knjp5aAHq_L8Kvnovx8Kli*hzk0?O|^Xo}#AIN2nWp;sY#+Q=A6Ou!(%* z@QI3Ui@)(ofJ#h*qVUfuX3ht517aRs>~L5l>QB6cY%Q5EWmkpcwU@}~gS4YL*;JYY zk4&=LtaklHUU^`N%w_}Hu&IO(()ME3+DyP*GvKoKbdR!*O=d1u0r8kr<cp1T8jsFW zu$7t-z;_qoM#$UTmG6Y#;w=6fNs1(9A|)4?UtWW~*l}XAF*p~2sK09VlE5hb^RCSK z6X`60$|US;7PR-^e30Jo(R#z-LZK8U=#WOU<WE_0?)Kj@K}?T&C1}gB4Nos|aHBw$ zCdO;`zVZEo<NX}PqJ(#FKer;+2dADS_vQI|Nqr3lKZF)2N`-w)w7+wDGwcHe=h4~| zlig{f$a(w9*`A?XW<8J*i_$~+(7mTHr?Ap>-k593x!BBO&Iv2;_y7{dZToLccL@@z z+;ZQD{_Kvd|M7H3B<|T5HgINv`Xi@6^B6vIL;JV3Yez~Q5i@ATxG-1$JMnokkz1A8 z$K&N<k)+3`5Bgc_m#EwZoDQw5pvfn67bxB8uQ<C|p%of2TFf_%iQ^SG<%__H{U?n> z4fhGpRSrb_QxvZfY!@`t<3M3b6Pg~(&%eF%nL5CwOwK)NQ%lgA^#LT%p;I|Fd9p2i zrMWBT3Di~RGYZn%Y=d;9RGQCDu=16&KLK5gUJ;7QTBP|+5P)8qu(B!<;YDGPO2<B6 zRSbVhj@&KYc`HM(mA4d+2s2e+c)9S*ZSdrg!j-4ehQi9VNN`&=#(M*>ob7zrc|HUA zU6^E8TQV{vUn<x#0y{lHujM)~bYMvlSaAx=^S>jU{u+DWY_B@_ueYx*B<XFH9`m}y z(Q%RR)d|1V+xpb2EoS29FAT#E>HEf<jKHwPlT&jgrjH55k2@A(GYF@)f4J;(ke34U zkg2DX+X7qOf+`%$wuVvFWyF5*yfS2UTXRz1vm+(C!=u06X`=}~_S;J97fYC}rS>$x zOP%@ytMXq8&Uk!U74g%jvnZROm-EoFVBM0LXy+D;>BC7Mu!KzCgimxDE05+#23S=e zp7>p+W~A=+&a(X&YGlBbd!Nur9o1oaIgunb=o3yJwD?aM!BFo{KPeP*iV4DlR@|3! z{6?oXBiGE5qc3GCZ4NXQL`eh(f%TOxUC8=nvLF%zJrKC7L8nBqLodo@y?3tpL_508 z2&LD=e#X}0`A)qh-?U4z9-dVtPCYfMV$rJ_StP65Olq~)JNb|Di_1Z6xXNVcqlGmi z7cSiaU<CP0m<luU<at_jn0-yEHu8=JV|l&TBEoTl8PN4v*5We25f@55{jCykpYVqn z_n*#ts;cvp-oCcOYYvReVcLfd3nt#wxw}>mUw`m6HyNn}WcagSy5h^=(mp4`V=qSz zhe5#tZ^nde`!2sS%f~Z{{{CUP_3M)UK2GLFiEgttz@F_+A-4rTp(pzch7<1Q4H>bW zSuO82dKJjEnTK4v;)G6vf!D*2)`#gdO+cnSG0zb46a3}Tk<}9g+hq@Xpl75T^K?O{ zghpzx^BGRK<Ez~5BQ}22iKAni$a>38S3PQs-RTOlC*s8v*hBp&zOMq_*4dV3bOoBV z496drpHf=wIQ`J6PlM=v!Z%#~GM1YhM&BARHhzh$&y$DKml~Fx8C`23NUFk1{DtK= zv^nB*m+=2alIO}G+B}b>ctXtd<*Lm1J2bqD3(QXkM5*O2TkSt4k@1Y`BD((A6*>|A zF5F7Q6z1e#$(+uSKKPIDjU`H1`^7es|Dn;yR!%B!que@5Q;&hgQ9bIzlwEIb3|_~d zdiTxFBMK&4ZLgtz;Es^xuywE)E<jhP>rd<3zUli<r0v4AP-y}(TB^js|C!&(I9dLT z5OtZR4Ym(NH8-;b^{}n2UVw7`NCG-$Lz%5(0nN<ZQWSMeuZZZM9sGo(-K<ORZKzyz zCASuhbo1fC=IEuLkoVVuI6&(*k7v4C?S-R-$T(0zU@^p=`AK}D*;x*<_;*%R6-Alh zDA7;HS#bO2nKcpH=A}9Vv9?#r>Z$75-|ONHk1NnMrBGh)zT+k}v+`Cz@5u*jGJfqn z?qJcId2qis+$U}_C?ZIVK)&XP1bB(jD<*x~sntl-!M;e=d^Je_-*$5q=TU0jv&S#= z&S(Lc`p1yVdo4p>aHhS`Ho1I7P>$imc2C^JQCeMi#^x?pQ2NO#0SR4Z%RM8_4qgx> z(aVQi)@7VU3tQei(R0XjMZ>_MU`t;pwbZ}!Fj?Vm;?19zHc|(t!|(SjmL!WM#?<2Y z3knO5fON8<wVmJRD3L>xkHC#o-IeF&{^dy<zvJLWOkI02mr?lN62TSw8PK%t*Pd4z z<1^R9Zr_GedM8`IE_AT5Whu!|?D^BB^x8Lf#XG<|+Rb%q&3!}cz<tb|HTxCMF5ew> z5Eqa!&)8-#EJj*exvQS^uq)2QbG4Xl@GU>+isWOBRpv}cG)><Vp!T7)Oly6cpuKU~ zWZLk}{>a(hd}K7|Px^oN)}pu3VpyBYlh&;fF!tCCw`W1-LuxIpMC+*MGv@yIl|>@> zTLQ1P=-cc+U-Kd+E+<toVSJ^qGxwMHmgarrG4=A^Brc{2F4$Ete$;C9*fc+Qb)hlb z&A${B&dGA$@T~u7Ke%z*{lFS%m7F)4kYJH2>3gW-82?egSIn)feN(F|I3CY3yP<gn zLH<nO{muZaNe-Q7qiYXehhd{9Pfsi!T&ej;-1Ycc=@sMK?Vne!kKPO}>R9+vT=m-% zw>0Q%$EI>^z}cmvqW8=92Y$@7&1?0}@1GmL_8;QL79jp)%IGSRoM{;iwQ|QchsxDm zB%u_+Tl$iQ^Fi*#p$V>GH`-^kG<TV^zbj58jAVJ#-lEvn!w}fx)1w?mvia;g?7{2) zbxMDI!!tKC_??Vrw$nGYL633UEIcXMKrxD|4wszK&ZK5I*J4d&HenmG-jt2`PIo8t zVD16aEJi<1<G3Jvy=(Q%$CuD`4Y|#)5o6)G&h}?P;?OK%Jyw@1Ey3N5d37SzFLt#L z`QGAd@#H~P6wfdzTBxlbO^%gvivaX&9EBq|8~s2i<Mo`By62URtY9*v65S5$?km_= z5M=0dx^Dhkc}%)Lc_4$=TF^8B3}Jujtm*+3n+{W>CWTnS+#xMC{V8wS#SkQ_7H+14 zD(nT-v^nBbMPBsA(>^b0U1ybEA4EvxyglP3{qy>c=n6scnwJ0y*lEU_Uq<kdloP`F zb{Df`3b@bn>GdVp4Vbalv0T&fE-Oo5;J>du`E6n4SmRSw_KxqeSQE%4^<KcM@;99i zQnjqH`Tkr?#Uhllp#{PzG8iH@LLrOao7#9hg|P2=)UafaCM2^aUN7tBOVjS>$xrsU zdN)^gNjJE(Y^w^9_0<|Gj<D+L4+k7%azw9CW^44ADe7>`DUr)5f$UZ$HSckA%2hi` zLJYFdJ>lp`;MP>_B=^8*PIS=LosTG?4HA>fJBnx49ehKCwIF?!edw~}YLJ$frq5Ne z<y+(1AOfT<r6XK<k*A!hgTU2O#h_uuWbf<IcPI1WD@U#LZiv-rhYdW(RC5vUnB;1( z&Pw2@i3>cj9e1wCEU_Ni7eu4|Z@To8ew4)h53e>2zP>OKRXk`&O%WO-{64wdj8-GD zREmX`4Bh)HTtu*u^B|e{`<!U9pn-EcB(QTgn(!-BNWQ4Q1@^<kIVW?~8<HjqSnR0h z>|NiN?{L{1U!`b0xo$daDqs1jXSvqI)dk}<&AeozozVB=e#9iiYqJP!cXy0wEo5+d zAU~vM`AvYXqjbVEU%Fh~Z0X(z^*`MPoEf+|Hu$_zHgUxz^KBC6oX3@0TQ|jRojc%C zBNd9<s&=$*R7D&i%$9Y>nN};>O*~oU#>}4nXNFy63~{?i$V4TEwXR*TTv-Ie@8Lwa z3BPqi8WJ`m|8y8mHV5q;&>Oh7_&Ic97e4$fg${*CCbQC~96Ozs7<c4@v6Jct=4wv! z=!7-wpEaWE%tew9D!-i{UZi$K-j4wDr6Bk|4mpGAwn;3i!P04)?Ci54xzaud0gT~q zS?)g*+p167%;j@n+R%7xf5rl6hGIm_Fip9!{&yMV`AQC=m5ak?M8<_@Lyd#vx>2BW zTEs7r;JvafmS515J~t<O$9pS}Ih{J>+|SrrK5SA}i1N?g*1es|4m`WA^uEJNb2m_% z+&p)CDqPoXJ+>>37RTnne|vIQnu4aG&h1<m$zS+7Mw37re13!UjX{uWdAQv+na;qk zV!}w{W=y*6GU-Kp6obdo2$SI(?1A<b^1;_Ppk>2s6w_p2PAD%A*!;Tj@OPJ&RNR45 z4Ap``HPxkx<*=RX_cAx~yp^$|t|se`^;a~aa<3b?k#e%<0ET!Rl*c&tb1d~sl{I{Z z%RZ{c^}9TBYIOPCB)YW8tfwkn2z_cOUv@l{-P~YCI3jh~PjPcznG4x)WmXCM{OPm9 zpS$@Zaln65<p$ibjPjn&)5dg@Wo#pz^i&4f7`E@Z>#wSSr_~SFsmN`A&?{@+E>jSQ zrA2c7E6J$Qik;=~bu9TF{5UjT?)d7*hI|aqwYrG6N(gk1B;?LsgzK$u!4)#Z(nw9% zoow)&>{{%|lwx>$uydb&9c<B#(}Q#&TJ|_y*lo=f`*g~##kP8zTAd%a5$#1-9YJg{ z)5Ju3LSrAXLo)V_RDgLB_t#y%R+9sW9{@~wlSBPr2RHJwa8!&!BEL_5G?Vvnx4{+S zPH`CYs^G-M4Yy?9=-J!=ena^2AE<8f*^}{M57!lardJ1G$Z_3^Ja<(llcjTNA{_mB zW@rmZ%UD_PRQdu9PeD&Af0-W3Oo>GlnQ)|gl?1Sq)-_-2SFGk~-8ve6zi%`stLus` zVSsmRh3)`yj9vPsaJXze?}Qal8ccMjTkIb+VYZV|x)*QT5*=(fdC#3GO`=<M^Z+IC zCO5^9+CHnXj&ssxG8a(#hC!8~JHVI@9-HoCel~xdH;H4cc}i-sX|k;<sAwlORsYYQ zYja)^lL--UnbTb`@Z(1^{72=3>jx3^f{f47eD~HwRu>18)KU6{d(Oi!r6eU9?YrWy zS!N)It8&8s`c$;I-IFz3R*vVn&h%F1MQ}|`yN}v(NsTpoT3+CN2=$PqW4{xptJZLz z73ROX=Cx)|BW!-M2lz<<<>?|`;f<0gJ%9L!_LJVMo`wlktxP(eE7X1V4A_C9MYi;C zo1U*Zg}kw-nwxxiud243*_Unmg9%NDe_vb?qk~FXzLN2lw+le%5HN|@-LDCF0kBw3 zC7KCwtdQDN?;XAqF6^5Y&`0i`CUja#*VpD}AfnWP+~_FbT!S{Rq5qyZ2e=Yo_&=m$ zk*NoamM4X03o^NJc4tw9L%<82K}hPiiU@><2oH2?t~0a8Y91%=tFIeaI@|2_?T}sT zgq(UBv~=<mUpX1MC1e!6AN&IkYMM;@`)&2eb+u#v9-`v}dv#so$=K3;t%6O(u1vHx zSYX`<>T(S?MPRw>E{yEfpB8(&4`ZW?9ds%mp29+C&xA}rB(75i_CurMuJjbPVWBA@ z2@D+v5xbjexeLNU$D`!9hlz=I4+tMr15zwBpzFoR;t~EbaC2Dbe)$F}1B|N1t$;(< z&+0N+W*rtHy9Ye$b}oFGh!Oz9l+c6wWFGU`@?J~(HWgb=8aeRtszKGBn{6&GWi^O( zG6){q^>kZ1v!@bH8KJyZy+B!^`mm$GdrhhEMyz_S_4c}0;i4{aTwH$6&_wW5y?37M zND5yn;XOfd@V;SuyBa^K>IS9uQ8S~j%Xy@)j<M*AKi+@yGlRYM4T&f*v_U3+)BgKY zNz~;o%OW3h5i&)u$IWSf3g-&5WseW&KIMVEli@*0R3mr6^92vOyDjYp)lwn_Ogd?D zKRbFDiJL!IAjS_a5OSJL;WPKz@0!c1fbdo}`?X~DG%EuJpbuvWM9mo=DCsCD;vr|A z%gm%gW|Q*O#9pXD4<e`vN(9xF+LS=}liK)=+_k=7juY1sA`(sk;(5NbL8HQj=Vn%% z=1&q$s@^cjSBgy-;bh#{hrp^G#C$khx{6B)aQro-nUm^1%ndg{ze)eb`kqBnuV<8Q zRjv3Z@2`e5wK|gk`>kj$%ouoB3b-M9>IfAmiY$wvMoq>kI=N5N;~m;}Q$(C$w|kHf zgLml3wby4-;ww!ZBR)Apn8F0GK5BiCry3Jt4kb*UhpKiv=KS)(WILi;pDMhyX92)p z#L#dZSwjElZU0*4yuj!FB;6xkVyyK^P~A;-0z^09pgy>Nr-wAWP}5n*uNGws&!Ju! zxMi=vvjo&|(>4w=-DJ&n$@`u}o20xp_=99{VwxLp$dFpWcjsj!?>D+nO5=+EMpvFu zRc%uDO+~N5OpLQpf5fgvcXN+lNrXW*KzJ}_iV$qs{#x(h=hiQN3sU<Ye+whbul3Gg z9q!ulKTlf1cZ>gfZX~SdIHeY^*?hYB2bC8zmHQAkt$ws1_X}7PurMGKgys-j>}^iQ z<!Nl>10Fd2*}&c7s@+aPp1g*r1}zsp?1u-XlzYaPa>R+xp<=a?HAE%z=WnG&jtvjy zQWT$xeYlR={s$k-hqw#Vo{YZo@DGSHVIYUSOMlU`&B?keEfC9V|KD@n)iJG0$mTNS z6D*!%Moz7%H_uP#I_qW{QBf{wcZGQVgT6i_q=*!vv@!xa>Bx6EwinFwV=4s4zd-g0 z|CRvk<iP{F@V(W@AFCaN(62v-ooAmwUoLD5`i44@WRMZqm%}0GD+H5>??bbPqWb}o zl1}ZuWNnZ8yo2H2Qtmv`mb<pSyTdWst||cFp_uwTxG_<U%WvAJ&Y@8XC0SRg$|eK> zW>Vb-@~TJwR?i3>l^*2Mh<p(=;0>CNg3iU?L)$ff+1x!aCBVR2ra?ZdeL0V4zzlcq zF3c(3XPzdYK!k9_PtNw0C@DVQ@TRcmM|8mSqi`D97bCs*$0F60N;3D5;^}{Li6cTA z;5@MSI;#Te_J=59CL3F%@J~DVKZSHftIqBBJ0i8(FyzxDY;#yzdjf|Gc`iyE(W8eY zOA=p_d67E?am$eoYny_HL9Q+k%xkH2TiMX+0<N54k*!?r^hmBYR|B?zdQ2Ez*$Q&s z^ZD{sPEk0OjjlX?3DN5|B`j8&$tSucRO3)og!K@^i3~!OuPz2R@L$1eAVSW@SuY%r z7Oo+aehY+p-jynHf(*M-(<2*P=63IXq;MQ#eSn5L&nhO%bu?OaaNTRG*10Tf{5Avd zWY~^oGT%PqCKHVoB`U`o-_1(<_@yu_UTYZo2Dj$6Rh#Qw!qNCHeb`wr__s>>9h3b# zcE8?~zl#iZZg11Np<E6!55n}k*z%^=zB5z<RVWS-YvTWC<K24GtUAp__wD1u(;`0f zo0kk3<jjw9Y2PP$yqUIR2hZ{d{aQ|3syLgNKZ1c!<%q2fWC6tsUNM>cX+GAVB4-1k zj%W5fwY7V9;8vBV9b$`eB1aUW$T0#Bz5Iu5nn&U9nGxr({<prrAb_u+st0{?sS+)< zr<?4MW&~<X<UI>s%6WZ;3u{#ECe?)mH3uzpn4N&9zWHb9!Wmg_9&L5-rH)#Pe)KMn zxf8PBjPjU1vt9B_?7WuWPhCD9&2eROX6o)1dxp!Mnn&+-N*zQEvgx^#w1mUKVO6D? z$TywD!a`innPY0lpv{NClS4!=FGPw%wsH<K5peF)$nMtFHXewaqq~zo(BJKTZo|_h z3v*0cgglP;cj>mgJ^7|aI7ab}OgjGkE{K9FMt6<*=cMK57eN;d%qWSx9*8zoG>b^@ z<B46mb<1{BIT8B99%}hYZ*1<(7{F0#HPA#3v+U!We-$JWm!SxU(V}kUQfL^<^YXxp zv@qtu_VCndG(BRKOS>9|RNnjChS&x;V5%|h0gEj1(+RKP)O^c9!?A~fNmXf9Z9KlU z_V4p3qlA}!s}z<!seZx9cd;$oZ)#na`K#6N!9xMX&uhN3<X3q;_p-;XgY{4Bz+r(i z<z1&O4t-*Mp}~&`#Ln+8=t~A2D)F9fy>d#)K?r-+!c;b(BqPiuXCDgZ1k%WfJ|Y3y zXokm#KWG0VFI!Qg@Tt1XlO}oHDXck+l{8zi;=B7>9%j0w+RZL%j*LoGkdMhbu~4Fn zc|}w_@bjHMj&A*!sHAX+Ina6bri+9@m}m)p8+sNVxP7vx0-9B!&;rB)#It)hC9(KU zc0sbSF!WT;*NW8LagNzz_!br8wFT-J{L`AGh7P;kzyjGA_0k)IFR!N(d^58Zp1zv` zCJ}?b799Zv<QN#jgD<L??OhjlSDv#AqdLITKDZmnf&|;DVth4r6trM;Z#kXGRvx8X zH@TQu@or&m@-4K5Tk4$$>I?g`lVyK!`=wd%G_mgyi_<RQ*M3Ky#m%gnD+^%bWbM(( z2Wyv)`>v2c=Ir@2_S9IP^Und_a%%~3E9D)G$lBn%j~RcbZ3m+}R}<r}lJS4#ZA!`S z{BYoszZzm8oEXn52ZM!SltHJH%5fQ0E5V;JWA?ZbRIF+AMj;a9h;Km#1edQ}G9|d# z1Axy#W5cOK?^(v|7FTb&hb@A_elcfE+pWiq7ixD_9AD(FPZ)_RfFN4aAZo(C{B1Q^ zJotKYT&v}Wb^n^iHB0ryp)n!y-vSi`sW#~dyV_y->Nj^?hc_ex&K;z--ke6`LGAwr z7W~K;^%yi;v*h!%>;@cDlVZM-4@q!xSTp^QV344BkTYl!JuYCvvXjtRt`@Bdx?k)s z*7JaDFPACv<FcvZjgQ>a%(lJEHS`|=_qiQ!Q9W+XCu{iCr#8*Qm*}S%TT5}WAbao+ z?OocovRY+N1se2A_V&!BM2<4m$*N**(zm3&S{A?zqa3AzpL`XYwJ?uOPx`noF9R6p z-Y0L>HCDa(4-tHMk1a#3pTuH=eSrdyRr6%5*97$T8~*;#7k*#c>7D0Mqp$e_>nkSc zVE5MeT5k$Y9NGbA(%)aE<&<NxY?oo){92!f{{1HfxT(DUyk>JM)v=qf!i-RKJ_NX~ zRt%5I5viQiQ+_bWHWA{|nWJKUU@8DdH&a*;(!Wr;HrVD(GOc2lS(-0$N2D_M&ey~y z61|^c6SjO5_naO=d^&Ln%b`+O@JhqYM^Z{kzWfnTX}Y=|?!P}#=}l*k5}fQIxP<0g z9htyyTzfDYdLaav;wl^U4mPX5jO_|y<|R8@s(O>kCV)&{)Y&Yw9eAIy=utgU<%W6Y zDc9s3@m7u?cUu)loC5IVXU)U^RjN)$0ra96!uDMWqKx<jTWrdiBUUatvWHM3Z2n_j znDDlEvGB*P6lFy2luy77p>ag-bkaNuS1a{n%@6rWjt~&sSZ{!R3b@Fi6HEdqf6TcK zM+}wcREs4g(O(NwE^1D0Hk#J~FH3HQWA>yxPP)gk#7?F5_;(K{L8qKuvP(U>f=Q4u zC(%mIoXiT!>yA6IBBe8{`BEe1dw=__V!1Bl%4V;YIv3#lwR#7JO|HRj{yT`K?4Ay~ z!`n@t<s8DH=UY9fk*dsTeAnEy{`JzQx#*Bq^lXYM`Si${4wRcIi}MjeL(OUz-F}Uz zc5c4)_f@c58eKeLC+>QnDw9gy%8x0TpJmEW^|O^Xm8<)B#r+ER+7jx&l<w;lOD9ka z8V4j7vjKM)8Ds7>K9nx}Q`M}Y&`>z=&^g7FkYBlN_Mqc_s`_CsQ%euE@crIrR9Qc? z`uUQ-MsE&8O?~TR-C70`3a?Q>?0Gkv08PHtMTzVJ^6hJ_JE!GF!`5v^A<!*vXf}7O zl9pv()ty*=>=Wwvmti?9OEv7F0iCSu=$5xcpHfs6IM%PpEOLYY-RNc$X6SE;@b<2Q zC6^l(;L5EjD-`Myt%#lg|IN{BVnSoX-pwj-iSH|PAp9>)n<`U-<6AP@5128hmPmdb zRYJ31$eN$8+e!sHEoTd>NK3wZ9RVHDF*+z)`F56xB6h%{9WcX%9)g*{Y*EDngdBBX z=~~NY`xWrt5F(FSUWiiY>AheRW`M-};BHxLuR3mwL*>ayNwB5gyVKLKL|Jiuqf`M8 z&O?#@c^jbKK_0)?>?XjA_fRiIb1x-Kud{J9-{>rJGRO;a6bsOB*~#feiiGNK$$+rm z5PPOL!xevQiQa_n&_UOlnkSLw!0|Ik%2qDqy?rBb-|k`@3RxgCr<dHwj0-=+lTEHf z>+vyI<JG0u8x~!s{FU^-u!}W&0O?W@t>Qlv|Kz#q`r?>v`I$FjbHoW|H~$WwzTA8~ zepYC#bM%ZOh3A>ol#|EN(2OPGL4UUismRV=`6NP(Tbk!IvVJ+gGa1*S8M;dH{3s`Y zmJvvI`DbvpmPF)I1A0_dZ$#`W?NildS<W3J`m=h{2$v>1!;!5axv7y-O{$psT{d5o zk2%^1IGfJ!kO^UzCirTBSh4O`3u{_7)hGWBt@6x<<-EYS&~y78N=$WE2d8O7r@@Wm z+f)^zOl+dL`Z3kkF_lhkgQ2i`fr1Me=pJ^f-PH-^hVfl7lsf6HKV7murJ9k)32JHu z5hQS*-;Lcdq$9y_0A^EDs}~BESs-&hX&VlwZZ27x!HozcmKQ_MsnfuoLj+hW4w|v; zyoBr$0$tl*Ciu*cuhB6M@Djez3k+2Ktyw^&4Qn%hWZc?2KoE}15P;JzODw=2$+S|N z(77&xvmv!L2w%`Vy;WKHb;1B%1;y_Ams_8fuZf#?ExQS-3LSBy<%z(+aJ9CkMy47r zeJl3~qb{i{F!eI;x!x$ATsT-;4m`U{_l80<jjVgzcW(oWVo^L(Cwv7AER>~p;kWXg zHJ3Un!m%m}5_r@#6K~_HlR5(vjua^SHw{e^;@><s78mdNYZOz`5*I<cc=l!NfQ8PM zi3LsHcv;$C)6e6{xV=E&X}s`{v$9z@W#;-)-Lg7C%ou2%YP?<j+MxYCrhs}+4YI6k zN0dP#E|XssZR2>nqo_V&S$|NzjdVahOrA%*+^7Ia=-nsm{6<}svq5|Ao6}iUaPzMX ziU`qm{xKjpPN}C`yX&qcZ@F+&(>!^CHr#u~#^NgD&GuMB?Z3=MoiCmfpCTZC=b-Cc z=Z(NA3;t7ss?D9d&kf%cjWDM>J{Y7b;?h)uNSp#Nv!L(9{gm!p6C@rRub)QbR0r64 zeRv;*XM4QvKd&E)rHYYs(5Jegg`j%D(@D@Z5AE>Vh<uCBxV2yjP2$IGT?lE<@~a8j znFI55uODheau+U@w-ZbB2ZBA+Nnh7n%H$FzA-(nHZX4Z-+=sZLU0^#G<`R5aws1)E z`4zLB%3v>8&b)eMMnaWs*%m)7jyLiSk-G~l6KNSa+&*VKeWP+hO~WMRE*i7`vbVuP zo&4E9QyWNM8h!Y_{m40e+BD#TLjF}8IQlpWy5kA;I;b<mBc2@mE*{uyb}~J0Az~H2 zSHtd<?JZNepputm^|4~M>cD%N;DLhe6+7Y0M<5>?H!nVd!|pMLzRq5hQHS_{3Q;mC z08!VVor0{YKEMzy9z-e!Rw7XD`!6-~`lVQbrKaD46j2{4O4mB&7}$nhgQMfL(pQ?i zGXDkT#<oq(rp6hE@K*8F)b|I;^)UG&DR6V}+!djJPkKp2f*HbP4E@hk#ma0=c}}jT zh2vyDpM3Xmd@6TQ+V)}mUt2sucMq@}{hOFu6L48*E`u}w$vlYrNex`>k7d^5dafM) zIrjCviVoIH9_(A`gEW!;B;|Znxd0Xtl2!8Fzx|D(IVv_QvEutH>*wlpR{DTace;hY zr`l2!&nD*222Z^5?i*Fo;;U|Ojq7T^T;%*H4BXZ=RFKL$qrDH`Pvrtydx;$?AT4(@ z?)E+Is6A0~`KjwZ@hv)`fgV3`)2t3zh%M?RbXG!BW(fTN?8|@yHZyr;KXp1#;!F(` zFK57$qNl(2!jR_?tteqO$)at+D%|z=6O)ar)7*MRIHe2p<EHo}U*rb0t)=xcVSf?o zTN<b^2xt+s8~Qc~#U;-h?p+Qh)Pm*2u173w3Dt@z)o+7un`e(hDejzzRioRz_)lzh zk_I(qSqX*3zaj}o=nBa4M*_MfXD`;xZsMK^e`c^n{lqj-S!l$Ha!@_CePX9=0z`f0 zHmEy`ZM`2P+*o6#Ec%+ECelg$V9J&kP9kf2w<vzJA@lOhXI=exhsw=*o|!gcmCKmp zVbl|Ac1-Sj%?mq`<xXN^8-crf#eME1Tzwj#P@m#ZOH#2tkiy4-*|>0)t68CYoTa`A z)m7ej>+BsamM~Uw{@&3xF=vubIvVLKoQy*|RO<BjKcF>o+~X(17ZJe%z7ZRm^8hRy zP`a$iWBRN9n4rjo%c8P`J5aE_<FyKL6@AZU=m{^Om4lN4@J~e9!=2%^?wH%;_TA^F zH6jBg^*)k2FB?h0z8fxx95`?WY<bRydV^GB^mJ+X{N=TJr~W@)1(aGZwu%`)KMI<a z<Wwl3m#T9~7m`JN`!@E=F<bLz8u$C-`vdBS@*F?$PKmo&VIdP{VKbz$SIjbsxz!s1 zsPbjrT;vgWVqbpRu;S<cg@6r=+@y;==gLNt+saWrnb&waDPHxldcyjdhelh<`Mdrj z*vJ+er+5$N>hBY^X}4^geNq?c08Ucd6v<7@Ru0=st|L`E`|4X7FyQw%y7eSjg1pOJ z=ln7T`?!fu9+#KtkR#7Up&ds4zGqadgRB>U<sNu(wSOFXAf2yZf!YEDkF$_W1Hh(W z_tA-U6*-0Tc5{5HAmQ4RYv$UqM=dGQ{TJcybJ@l><074<qt9X|*hnnoIB_DW1in}Q zoe*CxDI^LQs5YBAOR|Z}7<@3s>?nCYlcUW-o_{MZ;${@&);u3(?J@oF-`5ZeIT;B$ zX>fUvT<1u}&Y0xHH=nTje>MTu269+W$~YOTS4?^plnI;n`d`54*S3LJqVx?hdH6G@ zeo3`Q6>KE@ew<{UcJqAmJST&%ok5yEy3(|mvc3R0`<{3f5lRXDAT{wFA>e=``~J_^ zCW#49#m&9@TNvd>5}BXwk{SFWu!JmX%%Qu(%^F5!_Gi`8<<He#kI%m5u>JBxc94M& zzYN4gULTx5-m%n(Q){PweJ40kBwLuT&9e1!i}?rscJ+Mv=>l|bq4UYkrb-8j@yC-@ zY1K{wX~plt%LK|AO4)q3;Yp>ZzjEdZXw9Y8s!TB9BKYI$ewMEGapzek>hc{(<$12| zEz){E0p3xlc4o<L)oI%_qLm3KDQ=fXit>WJ42NO38o1XEN89j^eU?9m{~aWRIBZsk zf6U3J%`FbVetq6W2I8GIO_@!G>0Q#avXY?`qN~HPTx)}J23Ro#A=AquF+9r^1eLNc z!GF)_iEwG4XBwms#QcdvwB>EY92>~}3OxaeJ>Lkj>D-^Rn@;WFdDLiZOYGQ~5;F)- zU2jQ|4P!WiY7jWuO5(t03jJltjY>EA6XiYu-bWu_=ZW<Y%Q7zY=Z0<MZ5k7QBw-F- z{JPah+X0|aT7T)CO#j<^J&V0MSV_h2!FIx(LFL$aYLMoP{BT=;6&0LEb~K(^nWkN+ z%(K(0D9g4!9~78a_u|6%Vr~=aD1=&Y!rQ33=u;eh2>CtX(jfT2h;NccJ%+VY&`V)c zE}aWEz+b3-VXN5B9<!${7fNklSG9y79LRZOx3}|*G;F&c5rS+O=s1|!5G{`EsoP`S z!T|h1X#4WfxM>CpN0gS?676@IU&O(yMts>`U#=}qG#{26IaCm8v0go;E%Is~#(gxJ z1ivqVkMuF^`wHVEZ~6%DcY)cb_2k!$3D`ZT14~ZroXFDoofO?Eabj^lFE-AC6~1|N zb5%RuC9;8Yw%xU6z#mSZn|!ES2lX@S#xDjM;2lV&0)4F7*!ixUBBkc5SS~eG)NL~p zMn~rWc*Q+Wg<TQvG@S0I?P=AY#A}sN1hKIec@SRJXFa0C!tG5Cf^EZmIoQq|9vFiL zT*wPg?r*^0Rs^x}&nV+d7g<~ld);?@n&1UXWWAC&P*mhkA>;Y;qol@gQ;V8-cLKSm zV61}s`qqNjjqqH&8oH)D-_O*uI)RkDWB+l_ZYkH6L3*_}<|k3AYPcXpH`^=h2c1}v zEKPh$JW$s^u^9Pz9kto-mdVWT`w~y}wwJnDZt+$bNGD)T(tLF`T8keNu-4->X_J=G zhTU2_qUe&yVr*VW)Qa`$E{(jfZjW)&W06nQ+M896ej`A401Qi8P1~`0RkwO7C8De{ z`XEY3X+Jwe4gKWBXFwTKKaIC>B@uqR8mT5%zzMKtS#ln=v##VObJfhW#a+A*$A8Y% zVoaU-vvPDJDG^dk7Q<=e9#{|o1;e}%7EmmQ(HD8E7erK=a9+aut7dcG39I$%Sv^-4 zXT{}-KLOx0jw!#+?um@LAzqB07q^h_OR@MPTE)R?Nx=HaL-?>FWA=m9hRf!gvYW*y zvGEVLU53B3$KRg?*%1B~pyP1777O%>4aIO^)+4K%AG3zwm5OHUf%|BFC!>?>Ho+L* zepBYNvYtbnCw&eaovbA!AhKj)(8na%3s>pTTS|}Psm=nP%|>tmdjAu64@2<9?tJTr zBX59ljD=;jrlFFq!jdSCH9qtdnTP6B3LV4D*NJKSO5DJr-6>Zkr-^O``kRekyi3VR zFL~ec`-V}FtE+4>ecls6-gB*>gVm~!RGm+bTur)C-B`*pz~zlaw@m}N>9MbMk^BGd zdK^x<JI>ciIGOIS5=?k3<(jMFaz>jMoUpxS#?$E`R$?l|c8jBbEO#jj;FO?_`#5FF zzhr|B37%W-Oa-s^JsAE;Hkhp=Uv!T_cde5@!M{bi9o<h3(iZ=F<+7YlXI01{LJQg7 ztw!iRgf(toDu)J{aL`PO)$w^Mf(X)a?`En4WYU=EhMi$H?yo;FyMnEn_}|N_KCvzy ziLMF^z+gaxs#)RxJvwBw;t3mKbxCezX{E`RJcg1Ovkf@lxlQnXZ6X<$vktQAc<b}& z6q><<gSIY&%7u{wyk4{23ZxYqeldU3F>kMkBnedd2Ab)V!7~?3-g%dL_9RSVFJC94 z3CpI%gbCn?q4SztcW)WzGM@U^!%STP#^#RTeYyy=mU#jp%DM;J^?$|z1l~zV>!sED zouAG6T)r0e_(T_rqlCXGs11HP<hE6ZgE=yK%u^rhoMQ8G>mW-+1gp~luHMoY)QYfV z8Orfh!%!M0eK0{rgA~|f=uF8)^sC#c?KsqFuegmovWxQV5GG4l{yK6-gXBQcvJ*d^ ziVWd`$YT>d!gzcie<|~p2n8*Cy)wPo)*$PNy~272PtV%m<=949rDe%-KH#ncpPhbs zW2O9d_eBnEdM-nr2!WccMxgxduETBRBv_yIvR*J>BZs?SmbaX=^RYVksqU(`k(@6a z79AQo(vCJB>5ld`982VQ_TrH-rxJ3;WAg;NnR$yw;DZ5!PcyE>FIhV;oL?CW$7?e0 zbo<RQpe-af%@G_?kLxoK?$VFt7)ZqAythx|h1fd<Ye6Cz?O3&qE@yn-^uJvo=P9pO z-+3kk&F`|nY1-u3Jc;ZA99Qi>e{BEXO#Y?V!L%$~R_&`K->VZlmOdG@{bLy;*^X-o zkvFk3R7X%lR6^i^oBY>BsM@FHZCG#v4N8keYg!NZJL?>I*z`6=5kbA=)`}&bOq*S{ zv9SN)icnsWYEJ09hN=rUR)eu3b_82fsA_CRbo2i61395b&|M}DfXDcls2xtrW5y60 zZRWp*xnxVdCKab6@FoEM*k!io$r$-90X<1X#|p<-{6r&K|9HQap%1>j7>Jx^36>ia zabWO_u^(b)DwW9zcY{t*+@h4eDAc_avz(LGnAoiXCc0YRDsbxVdC9ys=r*+Ty`)P< z(bLnd`zvjGo4U^f6mNkpVcmSlOIA1}qz6pF_Jq!EIofZfJGL*j@xLEQVe)qWeZ+F8 zI47^tFKgPSefE2J%DPxOd!k;XQR5uWAo2ba8|>cG6_6NX>{4SjvYHsvmmc%ogSlsk zq{L!JpLAj6^9!XlX5m#`z>Ll50&cGQa`V~3!_R|%>4T^FC-mDm;m+ok+K_{gU{XMI z1w6w%c5Sf<?p9m{^LQ5t4F?2!28`+j+sT!kynjA$`x^wgA)k=nG)m!5nO5HUSZre~ zDdt<i@NPAaZLEYwz8hn>e^$l5qo7(DaS{db!)%XY{1(JF1r);?3j-FFLfhS1%Cdcs zN!cLe#8QS|N-k~117eFWx4QdyLWoV}>E_!pf~gDPFZIsv*{4u%VZvhmnFlf(QnPmk z5kR?NPUS9ze&ceA9UsM3zuGZcqW5VW6&538#VB^k=@2XuP@Za7GnXLlf?VtF11nOz zQJavN`<P{T5pjYtv*z9pbUgx%-nJrM#%6~px=2X*6_c%^?KAEO-afY`NA3q`B>#7_ zZBz{`o&oUU)R>mO+vgp=P`-ba@8;({cJC|b<x6G{!;#KT0f)Dt_(NUU6#UE+=rQk) zQ~O;n%cvIuzl`{+kOD-iIEOH)f^1$pgN*YMGnhc?qeUXyyCb_1w21EL_4~wM97fen z7?s>5@=Uzy4%42l!dx4ik=s-ZAFBy@#C*)gNcWJ?dJ5{K!Wd$|9V$IF`KrHderWX@ zTbwPEd#T5LwS6uI=F2vgs5>8<@sjJoIsq5-id_gC5~$4@!t#N$uyKe!<0=CBj=DQD z__Pk(b0)V;dh1fwMZBPu%F#%tk<a0LY#^-gOK|2bL=o(Qg}Kc0`%majwE9bpVuDYi zf4UGh@2}aRCmTgDdbeNGWm+f2U+Sqj2%%f=U6jA+O|O2n=4jepzPSfIu80OGN`~Xd zOfI^@2X0r80+b6MG$?vqIAf-Av486j(aX2Y{x=aqZIitq=ygIT>>~B^A-U0bGoVYk zmlxTbg9c5WIkgrILFazu&gh-yRzMY<nK=lg;lbs%h^=y;?QCnKp6N>I-nsQrnRpjT z2{HR_!vlx}Ve0N%2~>2Zld5Z2?q{WfUe@>H=146z{TWTHNW1na`QSwO$Tdv=Gn>bh z4{(3Wdr_alp)K^eOo#j1)_*cQrHdE$qx|QXX*kP{0@+T3sra>7Ar!QKdTCT>C?wuZ z1H*JEev*(`sQdCw6esja``!cXI7gy*o=Lci(6}YE?p8t;X*r|6OdGw@#M65J6oX0Y z73N!bZ=bW`nIKmi9ZX86z0WFEvkDzFWqXj_J&>#?X)@qv?;_YAdQjvxwC<bxnusxs zh^d<1^znr(6~XzBdXHx4NK;jZnmN}t@OaWmXH)FfMfaDd6UEP<pR1H1#bE?YD()@j zG`6cXD9UouBQ!@^*0cQhW?Dg{%gOTm1qG$0C*_0<ZFtS4DH?#Oc6lV--~^hXZ)r(H zJQtD_2TTQcSNRb*GDSWTjLv{j`GHsL!BC5ulWn^09pSx{uM-_#Sy;<7c8sxo&FQ?` zc^FD>nJna_%6Tpo*G5>bSkS-0IwiY@_#`da*<HvZlveRUMudDEz<I*%cV#M}8ayeq z@P05Q9^!S6lNZnj*+~)k<GSLq{>ZL4t(A(nhrSh`nSi>!=ul=in`r9)dofvhkl-RI zOe{`|p_N{6z|ter8($K4O=s)9)#sAf!9Tho+!D0_D|z(~HK;{Uh{%*tx2n|B-(n9o zAKN}{2xD}K`qmJ6ZzX^v!J=o2`zJ?NGRBY*Cd-P^8`fTHp|QI?o8l?xlrGj{EWPNT z)nZ49F#Y!kMVwRBf52Xg7t;XlIxMn=@VjagcA-9Z7a&;0#f6V8W4m>rTRqeck&R&W zNL599b*qOmp|>L03)4t8$AOZ8*~4gEM<O<vyUJsgZkzQxnl%>7Z{A(IXY7;?Ri_l_ zwmJxKqG&}nGrC(F5kU*Na_+;&TE~4MyeGYUu&+`zJ_|a{%(x|&0ZoP4h;8al7Hijo z-9*JOR<O;)AC->VUIAtU;pXoU&<F8%Zodk56W?Z%ndgC!8T^jT>7Syyyd6g$2l$!= zAa39ou~dRa0P+}t$U-dpC7Q3`76GAA$Cs(}dE3$rJn4Mk0lbrRX&yFuEnDmIU068; zk-3bQbNv@4<VuJ{f?ngz8j>2$yrCr+AIVs^qo1UefdP$JTW#Mo$-qm2Sa9c{L*DKT zAE=YSdL@q!?>x9(<;*X*7s4;Ax8<^XF3y#hP&-TsQw2M_ni9?zn)@&(V&5W<?7RAV zJ$4EG?UrjF*RL5dRc^_b($5a!wNH-&Xd-+cVf<>1%#I7K@cQrX;>_Pr(D-|z?}q?Z z0Gx@Mkc0aoj|{4yNNOQZ9B=AX_><iVL1J@QJ*zzKwHg4M|3fMC&B`=x#^$HYG1mIw zW~c6=uJLmS?(V!ik|oA-tMt|}Ur#zuPhfF5_GbHZTQ;H@1Iqt&t~$Z)S8jd3<8)cx zt8s2*dO9H&Xtg>tIc494*CpLhC$eDZ5S)Ae?Xh<3UVi6@sDdt>9(0_RxxP2EPpY&U z5)tMYX7!?s^Xs-x;4jXlfLPWym;ahyKeHM5!uLE%BrB=SQHvTH+qZF1JGxTTciVy^ zUM{NUfK5UA$n+LG=|1U)`FQZWpo)b<(S=e_>DRYR|689QOf9u{a`TlwMjt<1-PO_{ z5zB0-uW5Awdib>eRhx8hLoF3IcP<1`JRelE^f1l&dD>`+&eS6uXI8tqA(yIM0Qhfi z4)kkYc@}M+T5?*cW)zkb6M?f;M2#fTivWd}8`HeuzhXZGy(*qYOl{JIj^};cAJDsB z@<Zu+c6qex##EIrexX4Qc-A9<nWR0rrRgTMp!F7Qw&iYZdt)2aY>Igh<ftYpL3^!Q zRz6I~6u;Xm9;)Vfi)Tqj)Y#Wrt`b=4Hat-Dw1e-96jwMEG;VHlU+yW$4jXI*h{u{X zbxMJfD3?NNM>TPTjAopJ+^IUD)#5S1PToJ2L4j&bw3Z$(!$xROXE`v(p3UeI4@|`A zG;2HHRj4&?zMX+Q^>!j|*M3YcPJX3EOpo%AC5;}WqDQuk=0t?9w9GbHG9b2sr^#z| z<vH7B#0&kwiUKJQrLG?jxC&nbj@SXukt7O*;oWELNHj6x_W*(g68(mL`PpQDvGHWB z>?4t{c#W-Fg{nlbe?grQ+--*L<)wURW!u0NlvV!G$Fv8g5@~ToTAQ-e%5ty57hiVg zcTAk-E98S>9`I&({nCG|#Y{}|Lrwm!_WDR$?HV%Gd?jA(d*bg}z}jV;ZB|r?lt%06 zT^9TI9QZv`LJW&ZSdsj_f?-X&TDu$$)L#yxDG(VO$77LqLV@?${=8cZ`l?ng2D0A$ zxL`qLdF{Nkdd<hM`5ybuAAujt1g@^*F7%w-{MQ#6GOK-O%XXUu7V@BBgdN!W0)Edv zXBmHN-}Nio69)8O*bTIJv0R{DxTJHwD^^KF$%qN#_7h)%WgRRpCkp?5eE(^uHa7a- z(|-=f#OazTl#dr>wj+(ERP_?3w7$uR6Na3EM^(R930~z2;!o{Y@`1>%>nZW(0|&7W zQ^$$d-JCly_P)yW63i!Z+in%m)0T%QJqdgbt1Sy^6si}EZJ}xxwWO)-#B)6j0D7z> zg5e^-N(<axs)*C=aA^E~!VPq%6|o4yeh4_ILQr*FMS2NUbs3oBNjdQkaCIn^YnTrz ziaxb)D@pNp3VNgT63RfBiG%fd>_G#FyNJ@3(*+3p7CCf;M7GK&pCY*=?Vc}){rr`6 zmhJ!V4jdltoPiSbq`wH=uHlCRmMwYD{0=fj#DCTD;;l4?<ppk}`$<<tJS!5)wkfz+ zXH@X)X+uCAB<%^hX!O5zM!#n#;l0{@y3EHDndI6j4%rQQXg~c*VtMQXSH6HJYFJKo z#i4;4p>sA5%h5pO!5R4NiONQGH5EX<4A?2}kFkYLY-CB7p>4x<Gg&t;a|;bDAl0_o zcMG4!z2<D?<=piy(w*|yT!WNl$D7w#fBsua1~t~9y6CsVP%*EK&C=^OKEy@eEGD?v zoN98$L%V&<Ll-Iprl>boq(5ZmrEVj><LM4OtNye;=QMyAZ$#Yg+qQ2~m){OpiLV!q zQ+-dWoizj)PgXptF-Qz9*V~;-rMrNKQ6isUuAAt){zf8-d<Z6Tw%0k}Ca!Pml_8^g ztPW2-_cEkR7?VFT+Sl3K3sI(T5C(do2~!;Z=1hX_rawK~x!xHvMQ;;3Az49DyK>JC z_Hv%UmUS@n&1NfXh+p=2-+;wbEcK9TRq>D7^C7}nGhU<pVh;L8c-glmyE-$0se@ac zhnB~NVfb5bL40^Uk{VrzY?hT(oekR$_Yoy_xjdWh6Gt>f%Mb5Pm{3-8l$|mD*Zmo# z-KZlQt%|lCt#|VSVJg6K(NugNjPguMKHpt!aG`w{`~NP0U2*{O?4S9^X~DH;PjmI9 z1zPD3o@7cL%dNVuH?(J8jO99}T3#m$KblFdNPO<0ww{0+*IKcF;C_K?U8xk+Qz<Ds zYQ^xHo8x~Y#&RyzAb6xm_E|c^WdfmRLHXMPe4^#|TF`NUNijWR#=@BOBAIRotq=dZ z{Ex!eHfav^;FroQiBB(v@345e#_G^MXL$Z0&-iqO^MB|%%eSbyuaAR(NC+z3C<-@7 zcaMmOG)RfWpn!mM_Y5JO(mjAQ0@9L$q;z)-ICR&*%rNor`vaag=eo{yYQ5NJ?X~w> z>+=<kHF42@>(yl96p=YXt*QdO_(WSil_8U=k(O`Vav=AXMezdN4Bt~EjSPGpzVNQV z3i7C2=xnj&-e+rZp;9`3_&IDz3iZ#H8E5RzhpsdHsxT3iW-=xe7?p`a77UX%IX4X| zYFv(stmF&1G|X?`>g-9@KP=MaBK-B8$YR^;S$c|Z5cB2_7kg9c^_>OnvjOjUfxz#^ ziJU^0iC#5C2h|Tm6sEF1n(MIe%D-y4`WDBjaaTdnsR0^Ro3rpk^E0dyYVx)`+L7LJ z;G~nA+wp%MvLvHTX_nFbqV)cIP?b~D8P5ahZ!eW;3d5(ovdqNF6IV6@8TJa|bT~b9 z!K5F`o8ED}$3A9N8t*Ae5Sx?uY@ybv%Xcy)cD|)nb|;9OBHSUL5FHcJsBCLW$;~a` z4uf-UZ2Tc}C1>-(+H@;tvA>+*xG;`sE@AVIi&IOfBQB2nNh}r@+l!8oAnHNyp(_d^ z2)~_38xhZp`)@Jap&QQ-$3=sIX=goBv)ok1@AXWNzgs?wJyxLJ*`e-gGQTVZ*aaYl zBI8L<&JrfGrdOy)z`513cHd8a(+<2EsY$+~B0?uR`|&4fM5ZzRemMt}dabIb<P;dE zLX>q@WpamF$iA1g^y9cWtl{|j$G^jW6Ata{C4+4o*WpepCcCBp(v#n<Ye9&BWd)9) z00$|HsqvN7K<G$T5NWhpdJBn|(|^jWLxdC(O2}8<u_`>W317?s7m)Fe%>_Pupf7K? zFG__$v;I1sWG^=0*85y;heMpTObaFNJ1|6l{BG{WzZ$B;(la`jnN;XNVxOqbD2XWI zQQxEPlNrm_<L>X*Lssa}@fQ%-xNjfL^2vm+*@|Gm4+s&YqiZc_EMTSUC2U!89a-o- zKL4=(CcQbRVE{@`div;Zx8kOfGuGDa&)rJkIo0#L1GQY=0*`x4fr;k<yPH<%oH5@4 zo;j+C9hj)*1`mwv$@*6s3$H}=0Jg?=ONC19C(g^xk9sQ}@*h7x>$BhuYuuT>BB1W% zvfhc@=rIl!>PW#Es^`Cw42dqCU;Qnl;_lw7OrA?Ad?R{V|41yqBgZlsTW?xME#Vuo z<BQAFCARAm!meh*zTS1|BAn#^u(fkSh4-n!Rn)RnJgFD0LD{yflXluW*12A>plb?g zl01~aLowU~#rkVs?01M$TK=TYRiB_FPdK^dY^`>U$wFpgFe%IBWA`F(Lc`l|eA+N@ zwb}?A`^N>@?t*^Z$uN{#N=+`&z9ajBn3;BtnsVkg|1DB96Sy<`kQ$HUZ~Xvw3|EQ# zGujt6MO}50lpA8s$WfKAmPtlv+x;0~a+&E^RO3b#mi%||KKp4Gk^-`(bkQ{7Pp*a) zFFFvBxqtlJHyS5>%beP!j=gQ`(4xsbi>{H!h-;`D$SBB(EY)QjuKWy@yL$EOv$-Dk z-xQEE3#Te@FUlJ|eiW#?a#5hMJg&j9b}f&ba#~PH{MyceS#r8;&P&qd13yAosZuq| z)nE%w*if%l!0@!Lg`Ew7g}oVQfI{X2B;z|ue(<1L2ssfs+Y?sNbB|FLE*Uw?&%?J& zj9;I;CcC{%#6Qpy=r69^E&rIBGZ>C-;kJxE+!AAFlir}iW!v!y*W~eIC_9yMf@8_T zUOBdNf1s~BV)cT4*VLrU7w?PZi5>@ZREOh}MOSOhaN!#sFjBN=%8<swe2D?yQ%Qro zDBGTq&!6TFNqxB;t*^Gsu?GFZ|J~~GBej#?eoe{Q>A9}5I4Eyy#GK5BWReETa<Xru z^Hmd~1)F*7tmK6gT}AttL_Hop_tolf$>cz}gr4v}=l{=jJoNR&c4!Uhh>4~TwlK0d zaPl#h!v+&0LocGOcqZYUz3-<PXm4i<{`KZySp+OINcQ-)<yO5*sf_I{G6_&V4T06u zb>6FGzcS=1<tzg(Q6mcz{7aaP1uw-Wi+rYkCt{0N64}eC6hwtwO)`AU-I5#fWWM>m zw&{;$(m$XE<}(pcddwcwimiFIB;oecte@+L=oHA`#ZTD}J{e;ubN<<mw&Z$pOlQ&X zY|2!`t%)V7LZWQqI$vc0cG9K|gM5ZgNoUMPqVLJV`yPR}BqNzD4Xz&*Q?frQRN6jY z5BbQf(}4R-oSD5iAtx;SA%&bjWwhP>1Gm?&r#jUjQnSuUmU)V<`|r-TLzYms8zKam zzL~BE?$f?XHF@D5zwN2st8sOg-vJE7jxkcO(+;z3tNZb5N)zb`5|NW`PJeHSaU(}O zT_m$UbKQDgBt71E1yQ0dS)|H(Br=%gIvLAgC1Dr$PKQZcGbW$4r2A;rdL=tNOT!sn zFd<9Ne)T|W_rW)@?*@Z?oQ6nEv9R!wS9iCb%%^d)yI+Oj7<Komaqa@rzTFCYdRQ&{ zVKl|%Ce$<1_8lu^-)MX*j7pSD1&0J8`C6R<tm#jOkHq%EMZrg$YII>(g{+tko3Qxt zM}w&^Pv>fA+X%Z37KrjiL`z*jR}GJXwz%o=|G6sSomu{59CeRH3bm!p4B8U|konB7 zgI+^7_)aIoaPC?Bx^WCoKw4+&+H7|kZ3EQXA6-Klp(EvsT?6u7<@at=7FPAJdgKW9 z7Fz$JH*7y&sj9A%6xRr{wepw!Fh)*BXFlB-rtUar(sF(OoXp(4_p#&kEQ|CGwJ#>9 z8}4s7S-ypu3Elb)+AOm(FdriM&nfIDZE6fK!#qV%{D<+?h(f|>UB~N?);GHkYOJ(N z69?1L%Ds~1?h|P*lz_;Mp>T^e6W;UttreuZNk#+!FlMoabB2ujlIN0CM#(KN&{pa# zPxgC7M6Rb5Df)ZS3i6reJQewcs&ST!A1{wA*Pb%a0#crGmdp7pm54F5@Xefb$jHx1 z(bRw{D(ws$eNk;})TakriE?pSZ_;JiZ|WYDF|j+jrK^exxtlqX;XjDQ%oltoA#=8_ zY99MS7u@DJormF1c5MIh<X}K3P{CO8d7-cXHTl#gqq`O9d8gn(@Q*FGFWmg4FQ<;q zQY$zUiTQeY<_-=!S`6E%cCR>Y3gZVv<mLTD-K;Fz!RiW>j?KhrIXe5HN^YN1xP#*r zbKo>5lnIo@UFH>5p&8_XjIUDn^;2YN2#9_WD;uAM*0AmIa**<*di>ld$;jHG8~F_; z5&SC3evyqCVNc3w#=YTw7R7*xj^l*?b{{`U%FEzkGbZv^6jb2z0B#v){9#Xx#iyQ= z(Tkz`q!zshR&iBt(M)+4>V|`Lx7Vx319V6?mTmQ!P^rY%vg<Y>pJwPzRXCpN6eVuF zH$YUZ-lMP`aJp*Y3}h(XxR0TjEOWApgiW1)K06AXzZW)kPY7l>)ck(!E#{S|uzh|K z%_2+=ILWyr_2Q*ff~=>}bt#*~<RHl|&!Ni(^pMi*DEFfH#ce<vb4CAs=>d%c%iq=` z(s9Iw89&rG5{_HW3W#fI@YU-nmY?6x+$QjSo@@OrAwfyD%4)PBDx;mDXDqhe#g^@k z;2G4J<hUf_k&*Cm{rs)Qo`+8RfV}Hqa8Nuu0v&HpCoc@g!4(^;iP<eCl{Ui+&&~%~ z)mTs>b6gCv@=xI|lVdAlEQ>*(x(wS76b5IgsGt9Ne_yKWg=<DN58HyWz*eqngW&5} zRLUE`dk~MWOii6yz!c+NW!T|2hgHc&pIk5b6C%Y2ZO&<DAH}+bpRnh;vi)=pql*4Y zV_-UrQ^1}Top27sssH&0`4g!m%s;TmY30(b&VC_mA@!0sd9J{Ago=^6lFB7(e|h`n z)^OHnD6BA+Qh<^|;2y19%rJjXYpJxoep<5c^qoZYut7z_Tf+})p8D=!<E!zC6Jd|d zHF4_vcg)`kgzKm#-aK%(wjD_taV@utD7O&K36Eq8{}DPX*gCE#W$%z31srT7dy0PH zs`mw}ml4hDl@tmtt`<<+d;ivUkE}`<^~-K@fH;wT(i~AjtrPJpIGDnu2mI#Z4aw8w z%)(BNY7_9=m)}6ZM7J<DQO(R`Q*>AcJe|08N=uKL>!X9bjP$A2CXn>&566|V+qN?o z70dGc(feDQ@ojSlI+KgGiXDe$wH$v#!EXSP8is#<$oUrDzCYWPIdk|2evBG}AcI+s z1}yvMg`-HHQ4ta=o*qhU|Cb!XcUcS+EP1@;?^d9sR=&!f2A@)w`SpqhX>m-BI6xDz z<B6nXxiUXv+Lo^5p2Fv-k9GIY!a1Z$)U(K#hR-^kgUbrULvNlMqQyEuyS=xWZyEmn z$RT{|Gzw4wDnuv>UUF^Q+Ona@^(>P(mNLcU!NQ506`q?SB)`$t7!wmqPjamk)1<DI zxtT8_y_H$29Iq-vtCT&NZl~%uH<wOc1P=E9auG}7KjMB$*TQUhqZRYvfnD?Pxw{Mv zd+`rvd>g6w6=DRud1Y2rzrc$?oV278*O(>iWObp1up~r(MCkG%^Ln`d$Unl*iPk24 zK9Qk+T4`@8+>47(f9pA2mu^YVR7d2|w)r?~vsb9`hewvV4gDu1B2<Y4KgSy@F<zkf zo^m{lG2x4b?!wayOJa=z>!oLw_alZ|-5TYB(f|0n^mG~@*m1@x`$ox~3Ugt-QtxDe z8DGT5?N}jwa)MRQ6!(PxNHDBZJ!rEVda<#Y_L2MZ{dl%j*{R_7ieb*^EVhs_GC%2z zY)0`nc=TxjcS45RK%0R=G$A2ia!@d}P){~1wPK=^pUE-#J$6ziXbkZC+cyi{x70EY z!4$Z1>UcgK4e(n^XOZ5}Z<dl;9GidBbJz_h30GyNDlSi1Sk2jFcoR@JT7w6P36yWX zJfro$m*GYsRKCU(ffU=o(kn`KxeP(b*w+3*%=>v9oo+*P9?1u6P)~tJIbVLtaRxiW z{azbho3<@m8-7>@ZB(7d3WcEG01L-H71rwr(-#(U9E@q~!srMNKfDeRQ)A<mC3;uU zy8@wDU|eq;IOAh!giFx$SfTA>^9}B6(s)b(vfh?WJSUfbY&~esuX}pCVUP&gQ#apV z<Y}2TECLetQu&TO7-f{%P?k~O`dwz<!!;h&b?lH|@Ir8|S?}?B9FN`@(^ohaAQozs z_pkB~S@p6-gC$Uy=WHxWN#%{c5l<5G7sr}$zWK?|@Yx>>r^E1d#e3^f74HtPaf=<5 z|JJ8r@@STI>{y2V18vsf!2aw?0dr2>Rsum)@O#jy0Mg%|V4d+1|KBfaary&PW?^2x zUYmedPdCx)14SL;c=~xlGS7}obyeLa58*=Hc|r>FWBy5_#pBEqLy3RPBrgTDfbZ5Q z0%?2`jP50FSosb==gue`C3tML7q=CxB5M^HlKtj(X`s=2&FS8$wz+U)=xUd}35MqP z8{1i%je>h=tE54M5T0oH2`09**%Cj*g$_~v;K`ldNRDUIH;gkq{yUpm50p6OS339; zR?9z_q>={NQ^j}J2>Okk<PLJD?@s_~LXSviRzc%3rVoeEI>D8G1>!CqKi5E)gF@am z+C-P?$3R>xZB+=h!d1O^ptl}<1_xz7ba3VgE+>m%c$8ve4q)W}!gjV*F&_-P1lNs$ zOK>Z@K+o=ReT&n_@f%=y*|DD~H18}$0UoTBG}zXnk#REl<IyTbds^0Ai=!@K)k*E| zDIahtXC{0yo^))XvxB<DO&;2(pxkWFhxMUmI==nxd6|s;ej6<fpLeABB6dY}VBH_0 z0v@kFi2`Xco<TOACZDa6o4QD&xK*l}VuP77338K6ZCv$K^4+&;6)hZtUKvnCOjd_% zRT*{P`zh(aAzxgFTLsQdK2H<e|Hxlr<BwJ?kniOheMSkK^w}s7Z9D5!{wg_fLL`;b zmj3`}aNi94PTTo;j{@FW&5%6eHBD=gfFOBzDWZ(1(cmJ$gD6*lM9^~p{iD@#zy_UD zMl~@dj?G}>I<vK<ir#=g_S`igXpxCj3PsKkri{U}S)CmGG)d;^L+l!C&nof4Bh&|Z ziYLVid<6&FTqgS+QB+L<JO|+nw<5a&>aba!tIhC!4#?Pj)te>Zlu!KD5}+QenXk3m z*^dx&oHDdfo_byUHj@mi2pSOPTi8yj!|Uwb_zkrEbcg)t7VGI(vp%o=T0(|*n8VL* z2xKCYe@WoEUwv1QA)3dJj+u!jS6@}6wk^26rPtIIc#a0-d(ezBugX?P2ouJ*I$%c< ze9puco}B%OBs8PyFx-XQ7T{z(&c+hnR|B3DXQXAkVgIG*UZTWX=sQgyCJ5p7eQ7Zt zkr7hdDr&p)kjRaQJHqx}&tJ-QV!?>_K~JO1EGEOI7L)3(^j_>%-fR(TN7n4qb*+Bh zeUOH^XB?uu`QJsDpz77U27ZSXhp<HtXE8rlKX`6}6cvk}o_otSgw{y8|NVC{KO5~` z0u7at^kY2PF6@!hlz{9e=h;$GSrLr~&7hj|z7`SwEA#LPGjgT^fXsUdcou%T^$Fe8 z4PJ7aT(X~sVZVcpDbul&YXwj}KT)vt#h}9o_4@=!JHPZTWl-f$)(4o14Zd1>D}xLX z%`}EGzyf{`C=9;{^xYX02`ZHpCM3$)0UNOQwi9WZvNK>BI7b;XZgbR0L%W|pJgZbU zVHG3*1{zb{7ba9@z8f1U?m`H}pCp#I0R2b?rmJCXDWy0c)adIyxii|Sdd?QLZf2gS z?;PU;HdlJyKjNMf3t#c&@>SgPwexuTXM26{x}^R6{?qL%kJi1JvSBuh&ilU+p*IS` zbPv8gEmzgj(@Z$-`x0j%EVtkC0p-~pDal&MFIFl~5$(iZ<vPw0X1fySOx*T@XXoWY zw?PT=Z!SEVUxXH0pgbI^k=0cpgy?fU<HF6FVFXJX+_2wvh}r#%-Jt!$FT+VEf?pQN zEWYNTLzve1T@Aw6qp6Bwi-6a!80M9TCtY}^5B1rC^aXv<X}EHphk^M;fp@gdJsr_8 z1Y{953JKk<Gb_sh`vwH#unYM45m4Mxw9spt8c1Bwm-hpB9xV6v3<+Qd)g=XX%~4vr zC$gvMU&AK4pk}|S%6n3+QAB<9H}LnA?Pv-rrM1*y{&>2Bx-(^cvq4*lsQrwE5j{I( zgNVdoKjD}KpQ>0A{}T%H)jj&vElj2=>~+8!!<QLAWWoP1BEHosNm_Y}DU=e;SN~~5 zl<dLp-OMKy?NgT4Oe<^AmV?;;+W+_otEdW62i^8m*W9RJpSo?m!qq%1y7`Xz=G$2P z4eZ5!mWCtGm#=V7;J%8T{|0GfxDz22Ko-&AID!+a*(ZUhOCp@U)#v&}1!2(17>dh- zNs_bfp2!z6V*~fT49;E#@`^I&2cPSgDKXR@0>AmBv$l>p2)=hmi+m@Z)9fz<UaFwf z*~%t{ckrX<hjO^*pBTP;AmzTNCRrlOE(SXsP;bxJJRFeu8B#aeQp~mS*A1y^M*jtX zDEco`()r7?0xb(4yM{DU$J0YaX<{`(s(K%k;d>bC{RqWIp4ys}{+q5c=o$Hn&1nj1 z5GC;4Gc;HJ3+vK<ri+B^Z2GDvU0>OIO}%ia*)wR#l`+k0`otPI=~jlEf+e1k4^IUj zOc}Jp`F4ZvsE~J!p3pJ^ol2Tpv9x+4U#-Xg4tg=s8o#)w2ABuhLq4<wfAap)d0FTG zMQbFb-kCvn3?OsgX8<@A%y@~w_TweZZ~}?DqRY8k8@0yIT%T3Qn9CnelANDvoSn(- zKr}e4aQ0!l|JpC=JgtzZ3+nnx;dF30X-iVNG69g{hLu^Cv3J5ghZL{_Mbp93j1^FU zXzK37Y8tJybw2PbFwH~x4S>hsDG_`(<Xnu2?NAK-OWS}s5qgeR2|`r*Rb7O>;J6Fx zKy{Mwn*;Ox3pyk~Px7vdN?;5KaR-sC0+pO~k(S=Y;?74?Jvz$OeSAg%+a$(*bFiwj ze+=jjW>%cYJEo}iU5(tM7n;_uBmO~L=OfCTiGjykB-Cb`wb#k8jGP$G-~O=S5Vo>P zA>?fd?#1M1j8qr<%OK8OUPRe7T-Db26f9=Ol(!hv6*O?AvnR*p=P=)=7<&%9u2^lh zDpS)TOR7{%dBp*!1l(zz4IDpgRmIsxZWBf3Dj>SHV)qjVpGfX~L0rK8Y?6pY2xV8Y zC$Gq~&)nqP_iZwQ{SWuHFPD!0wpAhCt^DIKu2}@sDWi9`B<O=BAJEBJax}9-U!I52 zD5n3zBd31M!^IIk7)I&VH^SeUaD0YXwd+&1%FYX|JC2+j;E-Y^-9yOHbfQ%krQ!rn zuXehwky}1uYdPpmK6SVW-0D2;+YB4fbxmV1zj!!pK38i9MsAP=@q3qCv+PaW;K%Kn zj1_kv?sG!M;F}k|o+p+nn(?SI5F-cQM$2Cl+{)>;*IFQIpQwf~AMSV7o#c2)yE_T2 z!-pM;FT3=@97qQ=pLoa9&_pVW7#gMU(6G6h9e2l#u%=Yjh#PqkK;HW5FigtDU%5rx z#$dt*^WUOK%_lA)6X0{;p;c1*TF2}}UD)l)QC>?E7urg69gHAdVROMlkCBB~4fI5B z7oOoRje)5zdG|Xn9KE-eeI{4kD-~3<hD$eYQkJsdl6B90fw}1c<IIom4tXO*O}W~q zsAe9|wv_XmjZ<W__jpQ|v&;sSe8PIe!o}#ipMzZB;ltyEmabAZBvSQXibfpN1BzZc zp5Ddm+Dv`aF1rDr8n;;8tftk(QA|OROZdV(eB&<v1JKM%P|Mm?49sK>>34M6sr6?o z*Q1`qp1<tkt_Kp-ex3;SP`hO@9`lm*MS9>(SFj|&4$kNtAQt-VQY!rlCL_&o1{K&f zn;j1rmTGE%UOB9kR<AG=8>aElMjZ#8nl1|z1#M(gSA0|)3zYtsbzx<3k>0GQG%Eh2 z(fO6n2qU0WYG)hoa;i}v(OxNf8sJw!sZv_`{L#JVaXnA;X!VkKDW4S-X-*e;zw9JX z$t|FBvZG5gvRtYjDf#a|t&w^LzUBYIp1lkEk26$L^hHu}^1Js;d}(#>)hhkLFvVNS zn|u%aEwx04|E)nMUNZpFFyV8(zPq|a{HuN#>2T2?1Xt;ZMs22){?%y<{K*9;jdN@e z#a|Dc=LV_cAA9u5x^xdyonwZqW~HCakMPSMyk;l(Tre$j?XpVziZiuvc>0OM{?v%j zpnodIXAVA8bPB5>dn~fr8z)1S0!omx4~T@)oPreheH795YpoN0Za!;(uBvu)r_14W z5aRQ}CoMd;*Q2Nc{2-(`1<V7%ch>~i@x&fpZtWrT?_k*Y<`Z;chw+Z#_;lv@%@uHD zci$~H{d%zh>XuNS4wpg1o%o^-#{&pnPNZuMjWK|`+INCnXfW$zKdhQg+py^Zf*CXH z#qq2F|M<7<#madE3T1fv#^1i@xmXS%+gI8_f4Q=;dAuwMwOz+I?P2cRUnudVcsj>l zS!<~BvLU@1wlJx7tN!fVczJk^&<1Q>2mHJJ>LIk}VE`0=ZbV;^2ga>}4`eH8c%Z*X zLh71uJ@XE@+6ut(henn4-v8DdcMyONO3i8^Q%@L!t+uaTj1n0HM-T)`FtTMPYJ)nn z7^KpN)43mXMPUZ0<F0lLf?cl?fhAj8taT_cClm33h@GE2itPcDwVfq$+karwvjD!$ zqCDcRcKMCN_5kRf;aX=to}zN*z4lm!A8GmnHLy4|8L0gjJqbSONO$qO?c|uvyMX|w z)@}!Z0`65yJSZ`&c~?~tNeW;A8d{KSvWPcW{@D0;t9l5K3+_L?`<%wFrsYo)EM>Xt zdFRzSm3ul7&|fVB;Pphz>qxE1*)a`Z=!~@o$x7=8wkyF<ZMJz7E6KfG^66HJ8YEu+ z{rrd4WM*S4W|{h61?lt_l%Og&WI6UR9D_o8@oz*L?+|xB_O-rnJ5#lJq-DcqNx?N2 zxLijTGOg<($pBrSswPj2k6K?6@cSCaOql#pkcGpt0N<PWq9J;4;`~mYh(`uW_U5;y zD<lKs?=!8yp*siA9{uKBnsgL+<>P&W#6h_2weZGE46+r=9JDSfn^!LW{8Bb!D4-r- zo-)@N1|IEk)Wcf^)$rvH;;UWc>cVP9$!!%jvnWuB?SR`s-yu7r+lGVF4%C1%%rIj= z*ZLX|>(b?K|Di`7S&=V(g=aJaXJ0ey6h}a6RNEe)&?Sepjz=4;DPdc(PO%aRvp>~8 zPpjw2JfD>T5QruPM{a&wJdd4x9%Y%M5ee6pH#w0)j-4Q9CQ_T<!@B_!LTlf}U9VFh zD|v{mQ+@N(eSGEZ*MkYZ`%jj;Uk6CF`jmZzzC4Q5TAF?5hzolwI-NKj0s`GK*?V{K z4a;@n*%E!-Tk5d0SwW7_(=a)UO5&1F(=#v}(yjTt28L1=Tgg{(U75qLn_p#Tc>1h+ zb|xF4A#($b{^A{r7zqT-`gjRa3%EB*iQUX)`+*FXTen^z9s8~z=H25>Y^|z}trw;C z&4r!kR071y{!HX2b{Xf(FYD;{F{Q(;MWpvFZgx9)iT>#Zk5M>VcO2B>jSHay{;5EG zG_^OWb0-<|h-)sZ3<r2%X>I7nFDW;Bp)C5f;p04P>aLeDehqT*$gLbtVn4d-H==cJ z&v!_j7Gv=I<rA9~8Dk}SF{!^n4_jcrd3HqdAGVg+-Uf9U<@4LaCjGBdx@y}G*j!Gi z*1LedDcFGsKC;yhL9g}(x20+yGbib*V?{!sbi=Z2_$0uMp54$^ZA(mm_DPZ$HGSz{ z@UEhKt5_#q406Wr0QwR*4~Hxr`_EK~$)<p#=%U60S8u*F+C0&@Jp$c8JQsqHF74O_ zjNGx!U1Od6wi0#9h#`z!NNSTC5o>V?clWqCSr05wV6$DS-w9?LU*4i^IFoZ-5h$$K zN4DY(3~t+~IB#ui*lFQt{plMoM~}-(ZVRdqDXL1V?izZNBm1iePF>Civ~`*@ADunN zCuT|$fXZM^(};5$Fy^C-XonJCUpFP7wb5sI0i@xRzZzR#hfRH&lA4PfOFZ?qdOCh( zJln|Bh2Dj})L}G#hA6?+Kmyf$5_hqhE%5I!z3nyboZRD^fOkG4Dv*SrKlEn{<P7-n zk#-iqjZhX*wiBQqS#ms$i%|G<>FvRta$cMFyHoDQ1hAaPo5BB;FmWTFPxV?V@Iv{g zB<5?QQS%`+xO(OG{DuME($)tV1116Avi<Er##cPC8j8IHFyi?!d=J&91Tq5aZl`PI zIRqxIfDsTh0I6jDt!Y~pKjf}6G_)D9-$rc1D@kwMf$*{B%9AvV0FHrkFE%1G9$L4K zz%bb-%hWi-+?17T^Z8>~kl)=L(xIQf9ANB&qX4QL#9G`YJLBho4;P<o>#a2jI=5bF ztcBP5cYUz=Ct~8U)*{+l+qe9&3Lg0pUK<blJtEm8P~`#2gH%UAa=F5XD`s>f9mnsN zJbm{#m;9jczx3v>yE;e$mWK(DebV{bZyNjpPfGQpwa;kG+c(8HPP{wy@?8Hs66MJa zN{qnGmoHfxf~i;Cty&HrLVqT*ESR*@Z1JXK<D~xTpVwcfe5@?}dL7xInE|~Ez2foL zb$rz1=j)HY<pNG5KFr*jq+xHe#~P*r|1&JliUO`{1Dw!?InY2%IL?Gi4DFH^^k=E^ z;|BoY&4|2!Q9J^gP<FoMZZEK5t`?wpk^dRzj&ezE#rFu|bR)+`oPeF4v*3m0L>sXI z05@R86}RU>6^?VV!L)`v#>Nm@a%MjL@Ux_1^`dx8biCG*(V3p*4Hje6JK<{AFM(~{ zzvQ4!#8I_wtX}$jV#FuC*O<PS^`ASI!}RR@x0e&{y+*GAqzgi-x(*$3@ua6V)qY`x zk;1J2czP_z;Yxo|0nfu6weoYp=@<!IM~Vva5_j4Bb^jw?2H$~o`3pZN1002ZG+sM_ zqEb%0{RVXfjygEa>6s6qO@2x_fy`?8m8@{6vLM@W`%%$<JwMM?dy@XHyq)65`JG$k z6bilhpUva{vsr%lQfB!p(v3*jHPm+EkMQJ2H^S1(mvI8W__j^ip!bp=W2XZ2m$Qd% zzQ&y~V6C&5af1?qh9SoZIX7Qcy=*NWjsBfQyCk}Qv3kCDnHaAsv=r`51QPS-tu*F? zM(bS(=T{&A<9hS+$XjF@s|^)Kj^p;~fMUb7IA{%k@$%_hT`{EKSwFUL_Y-dypPhus z)j;1~QDqoK5_-Fhivi2&9^#%F^YIQqVtC5PaW=O;pnr<Bxc;H#BIG7&BRIr@`Stx6 zwe2@)m~GStLBkHg15B`HC|q^z(R248-m6IICeSi+bKA1o2e|t5W^C{9Kn!QZpd=}0 zy?=O$KIb{ZiV9q>)GVhRy^i|p65o_*WC{3To{5^j(y>?oA1JdgC2O*mb<(EL-D${c zMF`WUlqJGOQK#oEX!`@5L?{egrI4!M%!Iid2J4Q4jyg7&=A2!+&h$GfuG^@g?H?0g zuR{#}Kmj;YpP-7R0TZ1-?VDiywW>TtBM2iojX+(>5B?|3nToVu+K{sRa;KqzO2KVm zm5eVsE{PtgwD!Tye>gu7Z|xeL=J3;03gOBOVX|N9d1Mn?ZBa-~r6gKR$JOZXd4jq7 z(c=3{IZ6T5zwa70f_kmm0x)M2Eq~jCGJtQwTdvcfYV0pxMZPjmyE?apycF^ecmd_5 ziLUPpS-FcN&E4GiML>;{<hB3=X*(P2%Z)4}8(Kxyw=Pq0(VR<1=2Knel1>$MD$5r? z|CMo%yO$3_Qhc^oYlmaXjIWP-O2YH8s;v=@whB0tyS$@nN*Om8dbCX4)!Dw?qtoy- z2lA;3o4k!tg-UGcB(-+#UIHIiE+ca=EkI~{`}_6G*vV<2C1_chW5!7i{&Uiq>G-?U zTdt!NmZ+N`MDj_W$GB?qgEA1dWr)Vr*6a7E6>`z+BQ(kdHN1;7(EF2Xqn(~Xn~%4G z&Tm$<bV87?eAZNP&F!d5NK!@rO;mEeE&nXjmKOf9O+J2te)SSn`@AGQ5$<z~FdkWn z01I8qHR0>de*mkDnXE1RuN@E)m|Xl~ze_J|9QorwM}8WK;!u6Iu--H~fk5c;K>_Eu zP`5PbO2`RICi|xHV%Hgl=v@n0xvqO8CF7jy{x)(@spa^$gWBTACimNK@A3X`Oz2Mm zf2;~A-HGE}#PVFP720VgI(^<sXj)vZ15T;_-U~r+E`aGNhfG4t0(Zy)060QtOEfaR zDMV|UEuhx$iJuGkx=Otk{n7kD|8mdG_iLb!%}2XmoWxj(Y*1hZDaZ<HCk~!r08DLa z5)W8eCHIY5Hb#vNeqcg+V5)O3VRlR|-D~GgI!?1xv2}X=_rDn7<yaE6ITpdDKG;E= z;>GEA7vH-oK!%61Juf)rp9O6LaY{O1y61=B8#%m>54sofH|H;Dyfuk$y<=qH7Xolg zthObM*IYYnn(a}LRPINl%^0m({|T?k(ueywO)p{B{>hn`C|d+@*+mAl>x21-PO+eU zIzEz1lDeA9#3V4mXrcWC$ss8^Yjk&&IOH|3oVW62sm^TL@Px^QMY12!xRDu$q_7>} z;PjpHo#Q*_YC`a>Mn$W<IW8*1d(F41KLrpSk0$?Z?6rrTm3!O#xUYI(jGbfgs)^&? zuw63j4_9<G`xIxzb~WgN`YS|+IYmM0xOXd+0Z(VQfrr{j4^MgHAFi!~vB80!SM<#U zxVvIB9iJB44&i)>U(JtCeMfyp%rK9kiL{6exB=f8ypyjTw~^6y+llev0snj=WoPBl zt}pqn9flaZp!(4=Tw>(M7n2xnd^QsPQF1MX!$W26%jz#k0hnaH$7m}LssJ{n1+4cZ zgb5u5pDzdUvCvAVK8=2q==yDZI!<jDlK^{z)${s@W^keFM1ngEEPgiYT-6nUHEs$X zo*kFqu_}QmHVr;Bw5aCov5R5Qs-RRj2qk4PT5FiNd`d2xY9IY4@IH5J?E9blFXDJd zE9U4inXY6(sCe%e=W)0R$JN`=uA9H4Vjg(E+a_agsgXe?hfU;+_Zf~Z&Sn(9&Ih!@ zUmSv7cL{?0s<XZ@jSuH?of5U3j)2-tdlf|Kun%1&S3Z<~z7Mi%0D!IF5K;U%6fy6@ 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 Gxc>w7c;ig~ literal 0 HcmV?d00001 From 7ec6d3703150469e73dabcf25655192767092a77 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 29 Dec 2020 14:08:09 +0000 Subject: [PATCH 1160/2376] Fix filename of new release banner --- .../tiddlers/images/New Release Banner.png | Bin 77188 -> 77080 bytes .../images/New Release Banner.png.png | Bin 77080 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 editions/tw5.com/tiddlers/images/New Release Banner.png.png diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.png b/editions/tw5.com/tiddlers/images/New Release Banner.png index e85f7a0e133438fce297f9afa769d60d711831b6..db1f4848ea22abd7e0d7535320c90d2182d46b96 100644 GIT binary patch delta 48705 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 VV{|`^P*MJj4b1dE-g1oke*g+z^$Gw0 delta 48814 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%0As8A@ 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 O=shsJ|5fWn`2PcRr*EJD diff --git a/editions/tw5.com/tiddlers/images/New Release Banner.png.png b/editions/tw5.com/tiddlers/images/New Release Banner.png.png deleted file mode 100644 index db1f4848ea22abd7e0d7535320c90d2182d46b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77080 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%0D!IF5K;U%6fy6@ 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 Gxc>w7c;ig~ From c2c8892aa5c485264c6e28bf356bf02415030cc0 Mon Sep 17 00:00:00 2001 From: Joe Bordes <joe@tsolucio.com> Date: Sat, 2 Jan 2021 18:38:51 +0100 Subject: [PATCH 1161/2376] Signing the CLA (#5355) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 9ddfb728d..5a59b4c07 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -421,3 +421,5 @@ Stefano Stoduto, @OmbraDiFenice, 2020/10/03 Ryan Kramer, @default-kramer, 2020/10/24 Miha Lunar, @SmilyOrg, 2020/11/04 + +Joe Bordes, @joebordes, 2021/01/02 From 0ea89970d12847d2d61ee611728c71289d39d1d3 Mon Sep 17 00:00:00 2001 From: Joe Bordes <joe@tsolucio.com> Date: Sat, 2 Jan 2021 18:39:46 +0100 Subject: [PATCH 1162/2376] Doc(Developer) typo (#5354) --- .../tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid index b4f150ff0..a39c0f8da 100644 --- a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid +++ b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid @@ -82,7 +82,7 @@ Attempts to login to the server with specified credentials. This method is optio !! `displayLoginPrompt(syncer)` -Invoked by the syncer to display a custom login promopt. This method is optional. +Invoked by the syncer to display a custom login prompt. This method is optional. |!Parameter |!Description | |syncer |Reference to the syncer object making the call | From 493b45706f14ec0e800f1cf54941b8d77d934236 Mon Sep 17 00:00:00 2001 From: Odin <74539616+OdinJorna@users.noreply.github.com> Date: Sat, 2 Jan 2021 18:52:53 +0100 Subject: [PATCH 1163/2376] Signing the CLA (#5347) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 5a59b4c07..04d75786f 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -422,4 +422,6 @@ Ryan Kramer, @default-kramer, 2020/10/24 Miha Lunar, @SmilyOrg, 2020/11/04 +Odin Jorna, @OdinJorna, 2020/12/31 + Joe Bordes, @joebordes, 2021/01/02 From 87704b17707e2d150727ae1ad097492c9b7ec8f6 Mon Sep 17 00:00:00 2001 From: Odin <74539616+OdinJorna@users.noreply.github.com> Date: Sat, 2 Jan 2021 21:46:19 +0100 Subject: [PATCH 1164/2376] Tiddlywiki com - Update to the Community page (#5353) * Replaced the 'resources' tab with: Editions, Plugin, Themes, Palettes, Other resources. * Added tiddlers that lists the new categories to be used in the Community tabs tiddler * Added three themes for in the Community Themes section of the community page. * Added three community made edtitions to the Community Editions tabs of the community page. * Removed David Giffords Obahiah by his request. * Added two palettes into the Community Palettes tab. * Changed the link of 'PETTIL - Forth for the Commodore PET' to webarchive as discussed in pull request #5116 * removed four tiddlers because of dead links. * Changed the dead link in Tiddlydrive add-on by Joshua Stubbs to link to the projects github instead. * Fixed titltes in the community tabs macro. * Sorted all entries into their new categories, updates tags accordingly and moved tid files into new folders according to their new category. * final edit for sorting --- .../tiddlers/community/Community Editions.tid | 24 ++++++++++++++++++ .../tiddlers/community/Community Palettes.tid | 24 ++++++++++++++++++ .../tiddlers/community/Community Plugins.tid | 24 ++++++++++++++++++ .../tiddlers/community/Community Themes.tid | 24 ++++++++++++++++++ .../tw5.com/tiddlers/community/Community.tid | 4 +-- .../tiddlers/community/Other Resources.tid | 24 ++++++++++++++++++ .../tw5.com/tiddlers/community/Resources.tid | 25 ------------------- .../community/editions/Drift by Tony K.tid | 17 +++++++++++++ .../editions/Stroll by David Gifford.tid | 18 +++++++++++++ .../editions/TiddlyResearch by Kebi.tid | 25 +++++++++++++++++++ ...roject Management Wiki_ by David_Szego.tid | 4 +-- .../_Noteself_ by Danielo Rodriguez.tid | 4 +-- .../tiddlers/community/examples/Obadiah.tid | 10 -------- .../tiddlers/community/examples/PETTIL.tid | 2 +- .../_Lucky Sushi_ online shop by sini-Kit.tid | 4 +-- .../palettes/Dracula for tiddlywiki.tid | 22 ++++++++++++++++ .../community/palettes/palletes by JD.tid | 20 +++++++++++++++ .../Ace Editor Plugin by Joerg Plewe.tid | 4 +-- .../{resources => plugins}/BJHacks.tid | 4 +-- .../Disqus comments plugin by bimlas.tid | 4 +-- .../Encrypt single tiddler plugin.tid | 4 +-- .../Eucalys Tiddly World.tid | 4 +-- .../Favorites by Mohammad.tid | 4 +-- .../Full Text Search Plugin by Rob Hoelz.tid | 4 +-- .../community/{resources => plugins}/GSD5.tid | 4 +-- .../IndexedDB Plugin by Andreas Abeck.tid | 4 +-- .../Json Mangler plugin by Joshua Fontany.tid | 4 +-- .../Kin filter operator by bimlas.tid | 4 +-- .../Kookma Plugin Library by Mohammad.tid | 4 +-- .../Leaflet_maps_plugin_by_Sylvain_Comte.tid | 4 +-- .../Locator plugin by bimlas.tid | 4 +-- .../MathJax Plugin by Martin Kantor.tid | 4 +-- .../Plugins by TheDiveO.tid | 4 +-- .../Refnotes by Mohammad.tid | 4 +-- .../Searchwikis by Mohammad.tid | 4 +-- .../Shiraz by Mohammad.tid | 4 +-- .../Slider by Mohammad.tid | 4 +-- .../Tiddler Commander by Mohammad.tid | 4 +-- .../TiddlyClip by buggyjay.tid | 4 +-- .../TiddlyMap by Felix Kuppers.tid | 4 +-- .../TiddlyWiki for Scholars.tid | 4 +-- .../Tiddlyshow by Mohammad.tid | 4 +-- .../Timelines by Mohammad.tid | 4 +-- .../Tinka by Andreas Hahn.tid | 4 +-- .../Todolist by Mohammad.tid | 4 +-- .../Trashbin by Mohammad.tid | 4 +-- .../Utility by Mohammad.tid | 4 +-- .../_JD Mobile Layout plugin_ by JD.tid | 4 +-- .../_Mal's Sandbox_ by Mal.tid | 4 +-- .../_SK_Plugins_ by Stephen Kimmel.tid | 4 +-- .../_Slides and Stories_ by Jan.tid | 4 +-- .../_TW5-TeXZilla_ plugin by Joe Renes.tid | 4 +-- ...an_ Kanban that stays with you_ by Riz.tid | 4 +-- .../datepicker based on Pikaday.tid | 4 +-- .../rboue's plugins for TiddlyWiki.tid | 4 +-- .../vis.js Timeline.tid | 4 +-- .../community/resources/BrainTest.tid | 4 +-- ...yles and auto format settings for IDEs.tid | 4 +-- .../community/resources/CouchDB Adaptor.tid | 4 +-- .../Filter Examples by Tobias Beer.tid | 4 +-- ...Free SVGs for TiddlyWiki by morosanuae.tid | 4 +-- .../Gospel_Bubbles_by_Rev_David_Gifford.tid | 4 +-- .../tiddlers/community/resources/Heeg.ru.tid | 4 +-- .../Hosting TiddlyWiki5 on GoogleDrive.tid | 4 +-- ...How Does Twederation Work by Jed Carty.tid | 14 ----------- .../resources/Plugins by Uwe Stuehler.tid | 13 ---------- .../RegExp in Tiddlywiki by Mohammad.tid | 4 +-- .../resources/SeeAlso by Matias Goldman.tid | 4 +-- .../resources/Semantic Colors by Mohammad.tid | 4 +-- ...5 a pocket full of tips by Tobias Beer.tid | 4 +-- .../resources/TW-Scripts by Mohammad.tid | 4 +-- .../community/resources/TW5 Magick.tid | 4 +-- .../TW5-SingleExecutable_by_Jed_Carty.tid | 4 +-- .../community/resources/TWCommunitySearch.tid | 4 +-- .../resources/TWaddle by Matias Goldman.tid | 2 +- .../TiddlyChrome by Arlen Beiler.tid | 4 +-- ...d-on for Google Drive by Joshua Stubbs.tid | 8 +++--- .../TiddlyServer by Arlen Beiler.tid | 4 +-- .../TiddlyWiki Jingle by Mans Martensson.tid | 18 ------------- .../community/resources/TiddlyWiki Notes.tid | 4 +-- .../community/resources/TiddlyWiki Posts.tid | 4 +-- ...Wiki Video Tutorials by Francis Meetze.tid | 4 +-- ...ensions for Sublime Text 3 by roma0104.tid | 4 +-- .../TiddlyWiki extensions for ViM.tid | 4 +-- .../resources/TiddlyWiki guide FR.tid | 4 +-- .../community/resources/TiddlyWiki wu.tid | 4 +-- .../resources/TiddlyWiki5 Coding.tid | 18 ------------- .../resources/TiddlyWiki5 Playground.tid | 4 +-- .../TiddlyWiki5 Squared by Iannis Zannos.tid | 4 +-- ...xe_ Single File Tiddlywiki5 executable.tid | 4 +-- .../resources/Widdly by Opennota.tid | 4 +-- .../resources/Wikilabs by PMario.tid | 4 +-- .../community/resources/Wills QnD gTD.tid | 4 +-- .../resources/_ATWiki_ by Lamusia Project.tid | 4 +-- .../resources/_Dropboard_ by Reid Gould.tid | 4 +-- .../_Dynamic Tables_ by Jed Carty.tid | 4 +-- .../resources/_Hacks_ by Thomas Elmiger.tid | 4 +-- .../resources/_In My Socks_ by Jed Carty.tid | 4 +-- .../resources/_MathCell_ by Ste Wilson.tid | 4 +-- .../resources/_TWeb.at_ by Mario Pietsch.tid | 4 +-- .../_TiddlyServer_ by Matt Lauber.tid | 4 +-- ...i Knowledge Network_ by Dmitry Sokolov.tid | 4 +-- .../_TiddlyWiki Toolmap_ by David Gifford.tid | 4 +-- .../_TiddlyWiki5 Bourbon_ from mkt_memory.tid | 4 +-- .../_TiddlyWiki5 Forum on Reddit_ by Riz.tid | 4 +-- ...imimi_ Extension and executable by Riz.tid | 4 +-- ...X3DOM for TiddlyWiki 5_ by Jamal Wills.tid | 4 +-- ...e-backups_ Extension Firefox by pmario.tid | 4 +-- .../resources/_muritest_ by Simon Huber.tid | 4 +-- ...nsion for Chrome and Firefox by buggyj.tid | 4 +-- .../resources/twproxy by Steve Gattuso.tid | 4 +-- .../community/themes/Mono theme by JD.tid | 11 ++++++++ .../Notebook theme by Nicolas Petton.tid | 19 ++++++++++++++ ...-spacious webapp-nostalgic theme by JD.tid | 11 ++++++++ ...ostwriter theme by Rory Gibson_ by Riz.tid | 4 +-- ...ents-A little color won't hurt_ by Riz.tid | 4 +-- .../GitHub Saver Tutorial by Mohammad.tid | 4 +-- 117 files changed, 459 insertions(+), 294 deletions(-) create mode 100644 editions/tw5.com/tiddlers/community/Community Editions.tid create mode 100644 editions/tw5.com/tiddlers/community/Community Palettes.tid create mode 100644 editions/tw5.com/tiddlers/community/Community Plugins.tid create mode 100644 editions/tw5.com/tiddlers/community/Community Themes.tid create mode 100644 editions/tw5.com/tiddlers/community/Other Resources.tid delete mode 100644 editions/tw5.com/tiddlers/community/Resources.tid create mode 100644 editions/tw5.com/tiddlers/community/editions/Drift by Tony K.tid create mode 100644 editions/tw5.com/tiddlers/community/editions/Stroll by David Gifford.tid create mode 100644 editions/tw5.com/tiddlers/community/editions/TiddlyResearch by Kebi.tid rename editions/tw5.com/tiddlers/community/{resources => editions}/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid (92%) rename editions/tw5.com/tiddlers/community/{resources => editions}/_Noteself_ by Danielo Rodriguez.tid (93%) delete mode 100644 editions/tw5.com/tiddlers/community/examples/Obadiah.tid rename editions/tw5.com/tiddlers/community/{resources => examples}/_Lucky Sushi_ online shop by sini-Kit.tid (82%) create mode 100644 editions/tw5.com/tiddlers/community/palettes/Dracula for tiddlywiki.tid create mode 100644 editions/tw5.com/tiddlers/community/palettes/palletes by JD.tid rename editions/tw5.com/tiddlers/community/{resources => plugins}/Ace Editor Plugin by Joerg Plewe.tid (89%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/BJHacks.tid (82%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Disqus comments plugin by bimlas.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Encrypt single tiddler plugin.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Eucalys Tiddly World.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Favorites by Mohammad.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Full Text Search Plugin by Rob Hoelz.tid (93%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/GSD5.tid (82%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/IndexedDB Plugin by Andreas Abeck.tid (89%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Json Mangler plugin by Joshua Fontany.tid (87%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Kin filter operator by bimlas.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Kookma Plugin Library by Mohammad.tid (87%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Leaflet_maps_plugin_by_Sylvain_Comte.tid (94%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Locator plugin by bimlas.tid (89%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/MathJax Plugin by Martin Kantor.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Plugins by TheDiveO.tid (93%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Refnotes by Mohammad.tid (89%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Searchwikis by Mohammad.tid (90%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Shiraz by Mohammad.tid (93%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Slider by Mohammad.tid (89%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Tiddler Commander by Mohammad.tid (94%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/TiddlyClip by buggyjay.tid (93%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/TiddlyMap by Felix Kuppers.tid (93%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/TiddlyWiki for Scholars.tid (90%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Tiddlyshow by Mohammad.tid (86%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Timelines by Mohammad.tid (88%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Tinka by Andreas Hahn.tid (90%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Todolist by Mohammad.tid (89%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Trashbin by Mohammad.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/Utility by Mohammad.tid (84%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/_JD Mobile Layout plugin_ by JD.tid (82%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/_Mal's Sandbox_ by Mal.tid (95%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/_SK_Plugins_ by Stephen Kimmel.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/_Slides and Stories_ by Jan.tid (95%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/_TW5-TeXZilla_ plugin by Joe Renes.tid (92%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/_Tekan_ Kanban that stays with you_ by Riz.tid (88%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/datepicker based on Pikaday.tid (91%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/rboue's plugins for TiddlyWiki.tid (90%) rename editions/tw5.com/tiddlers/community/{resources => plugins}/vis.js Timeline.tid (90%) delete mode 100644 editions/tw5.com/tiddlers/community/resources/How Does Twederation Work by Jed Carty.tid delete mode 100644 editions/tw5.com/tiddlers/community/resources/Plugins by Uwe Stuehler.tid delete mode 100644 editions/tw5.com/tiddlers/community/resources/TiddlyWiki Jingle by Mans Martensson.tid delete mode 100644 editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Coding.tid create mode 100644 editions/tw5.com/tiddlers/community/themes/Mono theme by JD.tid create mode 100644 editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid create mode 100644 editions/tw5.com/tiddlers/community/themes/Whitespace a negative-spacious webapp-nostalgic theme by JD.tid rename editions/tw5.com/tiddlers/community/{resources => themes}/_Ghostwriter theme by Rory Gibson_ by Riz.tid (87%) rename editions/tw5.com/tiddlers/community/{resources => themes}/_Moments-A little color won't hurt_ by Riz.tid (90%) rename editions/tw5.com/tiddlers/community/{resources => tutorials}/GitHub Saver Tutorial by Mohammad.tid (95%) diff --git a/editions/tw5.com/tiddlers/community/Community Editions.tid b/editions/tw5.com/tiddlers/community/Community Editions.tid new file mode 100644 index 000000000..a0187b3af --- /dev/null +++ b/editions/tw5.com/tiddlers/community/Community Editions.tid @@ -0,0 +1,24 @@ +created: 20210101150806938 +modified: 20210101151808491 +tags: Community +title: Community Editions + +These are prepackaged editions created by the ~TiddlyWiki [[Community]]. These are TiddlyWikis with added plugins and configurations to facilitate a certain use-case. These are great starting points if you want to quickly jump into TiddlyWiki and start using it without spending too much time configuring yourself. + +<div class="tc-link-info"> + +<$list filter='[tag[Community Editions]!sort[modified]]'> + +<div class="tc-link-info-item"> + +! <$link><$view field="title"/></$link> + +<div class="tc-subtitle">Posted <$view field="modified" format="relativedate"/></div> + +<$transclude/> + +</div> + +</$list> + +</div> diff --git a/editions/tw5.com/tiddlers/community/Community Palettes.tid b/editions/tw5.com/tiddlers/community/Community Palettes.tid new file mode 100644 index 000000000..11e33e646 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/Community Palettes.tid @@ -0,0 +1,24 @@ +created: 20210101152520906 +modified: 20210101152533358 +tags: Community +title: Community Palettes + +This is a list of palettes made by members of the ~TiddlyWiki [[Community]]. Palettes change the colourscheme of TiddlyWiki and can be used in combination with themes. + +<div class="tc-link-info"> + +<$list filter='[tag[Community Palettes]!sort[modified]]'> + +<div class="tc-link-info-item"> + +! <$link><$view field="title"/></$link> + +<div class="tc-subtitle">Posted <$view field="modified" format="relativedate"/></div> + +<$transclude/> + +</div> + +</$list> + +</div> diff --git a/editions/tw5.com/tiddlers/community/Community Plugins.tid b/editions/tw5.com/tiddlers/community/Community Plugins.tid new file mode 100644 index 000000000..d622a24cb --- /dev/null +++ b/editions/tw5.com/tiddlers/community/Community Plugins.tid @@ -0,0 +1,24 @@ +created: 20210101150806938 +modified: 20210101151403345 +tags: Community +title: Community Plugins + +These are plugins created by the ~TiddlyWiki [[Community]]. Visit their website to try out the plugin. Carefully read the installing instructions and back up before installing! These plugins may not always be up to date and can contain bugs or unwanted behaviour. For even more plugins, visit the [[TiddlyWiki Groups|Forums]]. New plugins get posted and announced there first. + +<div class="tc-link-info"> + +<$list filter='[tag[Community Plugins]!sort[modified]]'> + +<div class="tc-link-info-item"> + +! <$link><$view field="title"/></$link> + +<div class="tc-subtitle">Posted <$view field="modified" format="relativedate"/></div> + +<$transclude/> + +</div> + +</$list> + +</div> diff --git a/editions/tw5.com/tiddlers/community/Community Themes.tid b/editions/tw5.com/tiddlers/community/Community Themes.tid new file mode 100644 index 000000000..23abb7150 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/Community Themes.tid @@ -0,0 +1,24 @@ +created: 20210101152520906 +modified: 20210101152533358 +tags: Community +title: Community Themes + +This is a list of themes made by members of the ~TiddlyWiki [[Community]]. Themes change the look and feel of TiddlyWiki, allowing for another degree of customisation. Installing themes works [[the same as plugins.|Manually installing a plugin]] + +<div class="tc-link-info"> + +<$list filter='[tag[Community Themes]!sort[modified]]'> + +<div class="tc-link-info-item"> + +! <$link><$view field="title"/></$link> + +<div class="tc-subtitle">Posted <$view field="modified" format="relativedate"/></div> + +<$transclude/> + +</div> + +</$list> + +</div> diff --git a/editions/tw5.com/tiddlers/community/Community.tid b/editions/tw5.com/tiddlers/community/Community.tid index aa8287178..3e6d3041f 100644 --- a/editions/tw5.com/tiddlers/community/Community.tid +++ b/editions/tw5.com/tiddlers/community/Community.tid @@ -1,9 +1,9 @@ created: 20130909151600000 -modified: 20140911084937570 +modified: 20210101170443584 tags: TableOfContents title: Community type: text/vnd.tiddlywiki Here we gather the latest and most useful material from the TiddlyWiki community. -<<tabs "Forums Latest Tutorials Resources Examples Articles Meetups" "Latest">> +<<tabs "Forums Latest Tutorials [[Community Editions]] [[Community Plugins]] [[Community Themes]] [[Community Palettes]] [[Other resources]] Examples Articles Meetups" "Latest">> diff --git a/editions/tw5.com/tiddlers/community/Other Resources.tid b/editions/tw5.com/tiddlers/community/Other Resources.tid new file mode 100644 index 000000000..d924690e9 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/Other Resources.tid @@ -0,0 +1,24 @@ +created: 20210101152520906 +modified: 20210101152533358 +tags: Community +title: Other Resources + +This list contains any usefull resource that have been shared with the ~TiddlyWiki Community that doesn fit the previous categories. They may be, macros, widgets, code snippts, ideas or more. + +<div class="tc-link-info"> + +<$list filter='[tag[Other Resources]!sort[modified]]'> + +<div class="tc-link-info-item"> + +! <$link><$view field="title"/></$link> + +<div class="tc-subtitle">Posted <$view field="modified" format="relativedate"/></div> + +<$transclude/> + +</div> + +</$list> + +</div> diff --git a/editions/tw5.com/tiddlers/community/Resources.tid b/editions/tw5.com/tiddlers/community/Resources.tid deleted file mode 100644 index 3eede0437..000000000 --- a/editions/tw5.com/tiddlers/community/Resources.tid +++ /dev/null @@ -1,25 +0,0 @@ -created: 20140320230543190 -modified: 20160602172731726 -tags: Community -title: Resources -type: text/vnd.tiddlywiki - -These are sites with resources created by the ~TiddlyWiki [[Community]] help you get the best out of ~TiddlyWiki: plugins, macros and more. Submit new entries via GitHub, Twitter or by posting in the [[TiddlyWiki Groups|Forums]]. - -<div class="tc-link-info"> - -<$list filter='[tag[Resources]!sort[modified]]'> - -<div class="tc-link-info-item"> - -! <$link><$view field="title"/></$link> - -<div class="tc-subtitle">Posted <$view field="modified" format="relativedate"/></div> - -<$transclude/> - -</div> - -</$list> - -</div> diff --git a/editions/tw5.com/tiddlers/community/editions/Drift by Tony K.tid b/editions/tw5.com/tiddlers/community/editions/Drift by Tony K.tid new file mode 100644 index 000000000..7c4112db7 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/editions/Drift by Tony K.tid @@ -0,0 +1,17 @@ +created: 20210101161529206 +modified: 20210101201435693 +tags: [[Community Editions]] +title: "Drift - Collect, Organise, Grow." by Tony K +url: https://akhater.github.io/drift/ + +A adaptation of TiddlyWiki perfect for using as a Notebook sysetem. + +{{!!url}} + +<<< +Drift is an adaptation of TiddlyWiki with the goal of helping you Collect. Organize. and Grow. your ideas while keeping tab on how they interconnect together and fluidly Drift from one to another. + +The 2 main components of Drift are TWCrosslinks and DailyNotes so you never miss an idea + +Drift was inspired by TiddlyBlink / Stroll and adapted to fit my needs. +<<< \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/editions/Stroll by David Gifford.tid b/editions/tw5.com/tiddlers/community/editions/Stroll by David Gifford.tid new file mode 100644 index 000000000..65a2e5cf5 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/editions/Stroll by David Gifford.tid @@ -0,0 +1,18 @@ +created: 20210101161104883 +modified: 20210101201435693 +tags: [[Community Editions]] +title: "Stroll - a Roam-like experience" by David Gifford +url: https://giffmex.org/stroll/stroll.html + +A adaptation of TiddlyWiki perfect for using as a Notebook sysetem. + +{{!!url}} + +<<< +Stroll is a TiddlyWiki adaptation imitating certain features of Roam to help users easily see connections between their notes and navigate between them. Features include: + +* bi-directional links, +* autocompletion when linking, +* renaming of links upon changing tiddler titles, +* side-by-side editing of multiple notes. +<<< \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/editions/TiddlyResearch by Kebi.tid b/editions/tw5.com/tiddlers/community/editions/TiddlyResearch by Kebi.tid new file mode 100644 index 000000000..680009c41 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/editions/TiddlyResearch by Kebi.tid @@ -0,0 +1,25 @@ +created: 20210101162308245 +modified: 20210101201435693 +tags: [[Community Editions]] +title: "TiddlyResearch" by Kebi +url: https://kebifurai.github.io/TiddlyResearch/ + +A adaptation of TiddlyWiki perfect for using as a Notebook sysetem. + +{{!!url}} + +<<< +Tiddly Research is a free and local note-taking environment based on TiddlyWiki + +Core Features: + +* Bidirectional note linking on multiple levels +* Tags +* Linked references +* Unlinked references +* Transclusions +* Bullet point based hierarchical note taking structure +* Integration with the spaced repetition flashcards tool Anki +* TODOs +* and more +<<< \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid b/editions/tw5.com/tiddlers/community/editions/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid similarity index 92% rename from editions/tw5.com/tiddlers/community/resources/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid rename to editions/tw5.com/tiddlers/community/editions/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid index 74bdabbeb..b363c53c8 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid +++ b/editions/tw5.com/tiddlers/community/editions/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20170101184753993 -tags: Resources +modified: 20210101170932934 +tags: [[Community Editions]] title: "Cardo - Task and Project Management Wiki" by David Szego type: text/vnd.tiddlywiki url: http://cardo.wiki diff --git a/editions/tw5.com/tiddlers/community/resources/_Noteself_ by Danielo Rodriguez.tid b/editions/tw5.com/tiddlers/community/editions/_Noteself_ by Danielo Rodriguez.tid similarity index 93% rename from editions/tw5.com/tiddlers/community/resources/_Noteself_ by Danielo Rodriguez.tid rename to editions/tw5.com/tiddlers/community/editions/_Noteself_ by Danielo Rodriguez.tid index bc3ca1827..1c5cf5b2a 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Noteself_ by Danielo Rodriguez.tid +++ b/editions/tw5.com/tiddlers/community/editions/_Noteself_ by Danielo Rodriguez.tid @@ -5,8 +5,8 @@ created: 20141122093837330 delivery: Web Service description: Free online service that you can also host yourself method: sync -modified: 20200507203026367 -tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Resources Safari Saving Windows iOS Edge +modified: 20210101191843666 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP [[Other resources]] Safari Saving Windows iOS Edge [[Community Editions]] title: "Noteself" by Danielo Rodríguez type: text/vnd.tiddlywiki url: https://noteself.github.io/ diff --git a/editions/tw5.com/tiddlers/community/examples/Obadiah.tid b/editions/tw5.com/tiddlers/community/examples/Obadiah.tid deleted file mode 100644 index f07b52df2..000000000 --- a/editions/tw5.com/tiddlers/community/examples/Obadiah.tid +++ /dev/null @@ -1,10 +0,0 @@ -created: 20131207085406905 -modified: 20131207084548184 -tags: Examples -title: Obadiah TOC -url: http://giffmex.org/experiments/obadiah.html - -An introduction to the biblical book of Obadiah by Dave Gifford using the table of contents macro and various custom tweaks to ~TiddlyWiki: custom new here buttons, [[this custom viewtemplate addition|http://giffmex.org/experiments/obadiah.html#%24%3A%2F_aa%2FViewTemplate%2FNoteList]] to add notes or images within any tiddler, and a tiddler transcluding all the content, in order to facilitate printing ([[this tiddler|http://giffmex.org/experiments/obadiah.html#An%20introduction%20to%20Obadiah]]). - -{{!!url}} - diff --git a/editions/tw5.com/tiddlers/community/examples/PETTIL.tid b/editions/tw5.com/tiddlers/community/examples/PETTIL.tid index 868f363b5..0ec2fab43 100644 --- a/editions/tw5.com/tiddlers/community/examples/PETTIL.tid +++ b/editions/tw5.com/tiddlers/community/examples/PETTIL.tid @@ -3,7 +3,7 @@ modified: 20140716084548184 tags: Examples title: "PETTIL - Forth for the Commodore PET" by Charlie Hitselberger type: text/vnd.tiddlywiki -url: http://chitselb.com/files/tiddlypettil.html +url: https://web.archive.org/web/20171114121112/chitselb.com/files/tiddlypettil.html A fast Forth interpreter for the [[Commodore PET|https://en.wikipedia.org/wiki/Commodore_PET]], written in 6502 assembly language. The TiddlyWiki containing program documentation is automatically generated from the source code: see https://github.com/chitselb/pettil. diff --git a/editions/tw5.com/tiddlers/community/resources/_Lucky Sushi_ online shop by sini-Kit.tid b/editions/tw5.com/tiddlers/community/examples/_Lucky Sushi_ online shop by sini-Kit.tid similarity index 82% rename from editions/tw5.com/tiddlers/community/resources/_Lucky Sushi_ online shop by sini-Kit.tid rename to editions/tw5.com/tiddlers/community/examples/_Lucky Sushi_ online shop by sini-Kit.tid index 7e4b11403..d036d1f71 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Lucky Sushi_ online shop by sini-Kit.tid +++ b/editions/tw5.com/tiddlers/community/examples/_Lucky Sushi_ online shop by sini-Kit.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20161224181607230 -tags: Resources +modified: 20210101170932934 +tags: Examples title: "Lucky Sushi" online shop by sini-Kit type: text/vnd.tiddlywiki url: http://luckysushi.ru/habarovsk/heeg.html#index diff --git a/editions/tw5.com/tiddlers/community/palettes/Dracula for tiddlywiki.tid b/editions/tw5.com/tiddlers/community/palettes/Dracula for tiddlywiki.tid new file mode 100644 index 000000000..d10c334da --- /dev/null +++ b/editions/tw5.com/tiddlers/community/palettes/Dracula for tiddlywiki.tid @@ -0,0 +1,22 @@ +created: 20210101163650901 +modified: 20210101163652263 +tags: [[Community Palettes]] +title: "Dracula - a dark palette for TiddlyWiki" by SlyBouhafs & zenorocha +url: https://draculatheme.com/tiddlywiki + +A dark palette for TiddlyWiki. + +{{!!url}} + +<<< +!!! Install manually + +Open the Control Panel > Appereance > Palette, scroll down and clone a platte, rename it to Dracula and copy the code from the website. + +!!! Activating theme + +* Open the Control Panel > Appereance > Palette +* Scroll down and select Dracula +* Boom! It's working + +<<< \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/palettes/palletes by JD.tid b/editions/tw5.com/tiddlers/community/palettes/palletes by JD.tid new file mode 100644 index 000000000..16790910b --- /dev/null +++ b/editions/tw5.com/tiddlers/community/palettes/palletes by JD.tid @@ -0,0 +1,20 @@ +created: 20210101164546151 +modified: 20210101164548796 +tags: [[Community Palettes]] +title: "JD's palettes" by JD +url: http://j.d.palette.tiddlyspot.com/ + +Some palettes by JD. + +{{!!url}} + +<<< +You can install any or all of these by dragging any of the below links into your Tiddlywiki: + +* Brown One +* C8 Dark +* Cool Mint +* Neonize +* Spartan Day +* Spartan Night +<<< \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/resources/Ace Editor Plugin by Joerg Plewe.tid b/editions/tw5.com/tiddlers/community/plugins/Ace Editor Plugin by Joerg Plewe.tid similarity index 89% rename from editions/tw5.com/tiddlers/community/resources/Ace Editor Plugin by Joerg Plewe.tid rename to editions/tw5.com/tiddlers/community/plugins/Ace Editor Plugin by Joerg Plewe.tid index 517bcf670..199d0d8e6 100644 --- a/editions/tw5.com/tiddlers/community/resources/Ace Editor Plugin by Joerg Plewe.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Ace Editor Plugin by Joerg Plewe.tid @@ -1,6 +1,6 @@ created: 20150403110817298 -modified: 20150403111020017 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Ace Editor Plugin by Joerg Plewe type: text/vnd.tiddlywiki url: http://innoq.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/BJHacks.tid b/editions/tw5.com/tiddlers/community/plugins/BJHacks.tid similarity index 82% rename from editions/tw5.com/tiddlers/community/resources/BJHacks.tid rename to editions/tw5.com/tiddlers/community/plugins/BJHacks.tid index cf93adea4..68dd1147b 100644 --- a/editions/tw5.com/tiddlers/community/resources/BJHacks.tid +++ b/editions/tw5.com/tiddlers/community/plugins/BJHacks.tid @@ -1,6 +1,6 @@ created: 20140315085406905 -modified: 20140321084548184 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: "BJTools" by buggyj type: text/vnd.tiddlywiki url: http://bjtools.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/Disqus comments plugin by bimlas.tid b/editions/tw5.com/tiddlers/community/plugins/Disqus comments plugin by bimlas.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/Disqus comments plugin by bimlas.tid rename to editions/tw5.com/tiddlers/community/plugins/Disqus comments plugin by bimlas.tid index 2dfbab738..ea9c297de 100644 --- a/editions/tw5.com/tiddlers/community/resources/Disqus comments plugin by bimlas.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Disqus comments plugin by bimlas.tid @@ -1,6 +1,6 @@ created: 20190219201946994 -modified: 20190219202305854 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Disqus comments plugin by bimlas type: text/vnd.tiddlywiki url: https://bimlas.gitlab.io/tw5-disqus/ diff --git a/editions/tw5.com/tiddlers/community/resources/Encrypt single tiddler plugin.tid b/editions/tw5.com/tiddlers/community/plugins/Encrypt single tiddler plugin.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/Encrypt single tiddler plugin.tid rename to editions/tw5.com/tiddlers/community/plugins/Encrypt single tiddler plugin.tid index 9ca474010..0f36fc718 100644 --- a/editions/tw5.com/tiddlers/community/resources/Encrypt single tiddler plugin.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Encrypt single tiddler plugin.tid @@ -1,6 +1,6 @@ created: 20150602084548184 -modified: 20150602084548184 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugns]] title: "Encrypt single tiddler plugin" by Danielo Rodriguez type: text/vnd.tiddlywiki url: http://danielorodriguez.com/TW5-EncryptTiddlerPlugin/ diff --git a/editions/tw5.com/tiddlers/community/resources/Eucalys Tiddly World.tid b/editions/tw5.com/tiddlers/community/plugins/Eucalys Tiddly World.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/Eucalys Tiddly World.tid rename to editions/tw5.com/tiddlers/community/plugins/Eucalys Tiddly World.tid index 11286e993..b3f25abc1 100644 --- a/editions/tw5.com/tiddlers/community/resources/Eucalys Tiddly World.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Eucalys Tiddly World.tid @@ -1,7 +1,7 @@ title: Eucaly's Tiddly World -tags: Resources +tags: [[Community Plugins]] created: 201409081039 -modified: 201409131039 +modified: 20210101191843666 url: http://eucaly-tw5.tiddlyspot.com/ I collect my tw5 creations on-line as http://eucaly-tw5.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Favorites by Mohammad.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Favorites by Mohammad.tid index 17d6532b4..625e1e71d 100644 --- a/editions/tw5.com/tiddlers/community/resources/Favorites by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Favorites by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117155737569 -modified: 20201117155943559 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Favorites by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Favorites/ diff --git a/editions/tw5.com/tiddlers/community/resources/Full Text Search Plugin by Rob Hoelz.tid b/editions/tw5.com/tiddlers/community/plugins/Full Text Search Plugin by Rob Hoelz.tid similarity index 93% rename from editions/tw5.com/tiddlers/community/resources/Full Text Search Plugin by Rob Hoelz.tid rename to editions/tw5.com/tiddlers/community/plugins/Full Text Search Plugin by Rob Hoelz.tid index 518fcc11b..728d3f1ad 100644 --- a/editions/tw5.com/tiddlers/community/resources/Full Text Search Plugin by Rob Hoelz.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Full Text Search Plugin by Rob Hoelz.tid @@ -1,6 +1,6 @@ created: 20171109171703588 -modified: 20171109171922913 -tags: Resources plugins +modified: 20210101191843666 +tags: [[Community Plugins]] plugins title: Full Text Search Plugin by Rob Hoelz type: text/vnd.tiddlywiki url: https://hoelz.ro/files/fts.html diff --git a/editions/tw5.com/tiddlers/community/resources/GSD5.tid b/editions/tw5.com/tiddlers/community/plugins/GSD5.tid similarity index 82% rename from editions/tw5.com/tiddlers/community/resources/GSD5.tid rename to editions/tw5.com/tiddlers/community/plugins/GSD5.tid index c114e4e61..f94adb1b6 100644 --- a/editions/tw5.com/tiddlers/community/resources/GSD5.tid +++ b/editions/tw5.com/tiddlers/community/plugins/GSD5.tid @@ -1,9 +1,9 @@ -tags: Resources +tags: [[Community Editions]] [[Community Plugins]] title: "GSD5" by Roma Hicks type: text/vnd.tiddlywiki url: http://gsd5.tiddlyspot.com/ created: 20141230182901899 -modified: 20141230182901899 +modified: 20210101191843666 An adaptation of the [[TiddlyWiki powered GTD® system formerly known as MonkeyGTD|http://mgsd.tiddlyspot.com/]] for TiddlyWiki version 5. diff --git a/editions/tw5.com/tiddlers/community/resources/IndexedDB Plugin by Andreas Abeck.tid b/editions/tw5.com/tiddlers/community/plugins/IndexedDB Plugin by Andreas Abeck.tid similarity index 89% rename from editions/tw5.com/tiddlers/community/resources/IndexedDB Plugin by Andreas Abeck.tid rename to editions/tw5.com/tiddlers/community/plugins/IndexedDB Plugin by Andreas Abeck.tid index 1a932330f..b6d6eb2a9 100644 --- a/editions/tw5.com/tiddlers/community/resources/IndexedDB Plugin by Andreas Abeck.tid +++ b/editions/tw5.com/tiddlers/community/plugins/IndexedDB Plugin by Andreas Abeck.tid @@ -1,6 +1,6 @@ created: 20150403110356105 -modified: 20150403110758877 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: IndexedDB Plugin by Andreas Abeck type: text/vnd.tiddlywiki url: http://tw5-dev.cibm.de diff --git a/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid b/editions/tw5.com/tiddlers/community/plugins/Json Mangler plugin by Joshua Fontany.tid similarity index 87% rename from editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid rename to editions/tw5.com/tiddlers/community/plugins/Json Mangler plugin by Joshua Fontany.tid index 548e0685c..7681d52e9 100644 --- a/editions/tw5.com/tiddlers/community/resources/Json Mangler plugin by Joshua Fontany.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Json Mangler plugin by Joshua Fontany.tid @@ -1,6 +1,6 @@ created: 20190308041321498 -modified: 20190308042014046 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Json Mangler plugin by Joshua Fontany Extend tiddlywiki to parse complex ("nested") json data tiddlers. diff --git a/editions/tw5.com/tiddlers/community/resources/Kin filter operator by bimlas.tid b/editions/tw5.com/tiddlers/community/plugins/Kin filter operator by bimlas.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/Kin filter operator by bimlas.tid rename to editions/tw5.com/tiddlers/community/plugins/Kin filter operator by bimlas.tid index e92a0f3ee..662d27d18 100644 --- a/editions/tw5.com/tiddlers/community/resources/Kin filter operator by bimlas.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Kin filter operator by bimlas.tid @@ -1,6 +1,6 @@ created: 20190219094230499 -modified: 20190219095858434 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Kin filter operator by bimlas type: text/vnd.tiddlywiki url: https://bimlas.gitlab.io/tw5-kin-filter/ diff --git a/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Kookma Plugin Library by Mohammad.tid similarity index 87% rename from editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Kookma Plugin Library by Mohammad.tid index 69cfc8181..f6a5aa1c3 100644 --- a/editions/tw5.com/tiddlers/community/resources/Kookma Plugin Library by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Kookma Plugin Library by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160603290 -modified: 20201117160819308 -tags: Resources Plugings +modified: 20210101201435693 +tags: [[Community Plugins]] Plugings title: Kookma Plugin Library by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-PluginLibrary/ diff --git a/editions/tw5.com/tiddlers/community/resources/Leaflet_maps_plugin_by_Sylvain_Comte.tid b/editions/tw5.com/tiddlers/community/plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid similarity index 94% rename from editions/tw5.com/tiddlers/community/resources/Leaflet_maps_plugin_by_Sylvain_Comte.tid rename to editions/tw5.com/tiddlers/community/plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid index be43c11e3..5b6d49ad1 100644 --- a/editions/tw5.com/tiddlers/community/resources/Leaflet_maps_plugin_by_Sylvain_Comte.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid @@ -1,6 +1,6 @@ created: 20151110060519720 -modified: 20170115170220030 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Leaflet maps plugin by Sylvain Comte type: text/vnd.tiddlywiki url: http://sycom.github.io/TiddlyWiki-Plugins/#Leaflet%20plugin diff --git a/editions/tw5.com/tiddlers/community/resources/Locator plugin by bimlas.tid b/editions/tw5.com/tiddlers/community/plugins/Locator plugin by bimlas.tid similarity index 89% rename from editions/tw5.com/tiddlers/community/resources/Locator plugin by bimlas.tid rename to editions/tw5.com/tiddlers/community/plugins/Locator plugin by bimlas.tid index 761d94f82..cf47af35b 100644 --- a/editions/tw5.com/tiddlers/community/resources/Locator plugin by bimlas.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Locator plugin by bimlas.tid @@ -1,6 +1,6 @@ created: 20190219191946994 -modified: 20190219192305854 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Locator plugin by bimlas type: text/vnd.tiddlywiki url: https://bimlas.gitlab.io/tw5-locator/ diff --git a/editions/tw5.com/tiddlers/community/resources/MathJax Plugin by Martin Kantor.tid b/editions/tw5.com/tiddlers/community/plugins/MathJax Plugin by Martin Kantor.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/MathJax Plugin by Martin Kantor.tid rename to editions/tw5.com/tiddlers/community/plugins/MathJax Plugin by Martin Kantor.tid index f34e7088a..c46c95f8e 100644 --- a/editions/tw5.com/tiddlers/community/resources/MathJax Plugin by Martin Kantor.tid +++ b/editions/tw5.com/tiddlers/community/plugins/MathJax Plugin by Martin Kantor.tid @@ -1,6 +1,6 @@ created: 20140403191946994 -modified: 20140403192305854 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: MathJax Plugin by Martin Kantor type: text/vnd.tiddlywiki url: http://mathjax-tw5.kantorsite.net diff --git a/editions/tw5.com/tiddlers/community/resources/Plugins by TheDiveO.tid b/editions/tw5.com/tiddlers/community/plugins/Plugins by TheDiveO.tid similarity index 93% rename from editions/tw5.com/tiddlers/community/resources/Plugins by TheDiveO.tid rename to editions/tw5.com/tiddlers/community/plugins/Plugins by TheDiveO.tid index 9668d7944..8f6694542 100644 --- a/editions/tw5.com/tiddlers/community/resources/Plugins by TheDiveO.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Plugins by TheDiveO.tid @@ -1,6 +1,6 @@ created: 20140910102845245 -modified: 20140910102845245 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Plugins by TheDiveO type: text/vnd.tiddlywiki url: http://thediveo.github.io diff --git a/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Refnotes by Mohammad.tid similarity index 89% rename from editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Refnotes by Mohammad.tid index 3f400bc19..600a2ccbc 100644 --- a/editions/tw5.com/tiddlers/community/resources/Refnotes by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Refnotes by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117161853918 -modified: 20201117162122822 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Refnotes by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/Refnotes/ diff --git a/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Searchwikis by Mohammad.tid similarity index 90% rename from editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Searchwikis by Mohammad.tid index 3f7cbc729..0178808a3 100644 --- a/editions/tw5.com/tiddlers/community/resources/Searchwikis by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Searchwikis by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160302426 -modified: 20201117160443306 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Searchwikis by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Searchwikis/ diff --git a/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Shiraz by Mohammad.tid similarity index 93% rename from editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Shiraz by Mohammad.tid index 38d743552..2988e26e9 100644 --- a/editions/tw5.com/tiddlers/community/resources/Shiraz by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Shiraz by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201116204317018 -modified: 20201116210618803 -tags: Resources Plugings +modified: 20210101201435693 +tags: [[Community Plugins]] Plugings title: Shiraz by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Shiraz/ diff --git a/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Slider by Mohammad.tid similarity index 89% rename from editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Slider by Mohammad.tid index 8373e86c8..4216c9879 100644 --- a/editions/tw5.com/tiddlers/community/resources/Slider by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Slider by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117162655614 -modified: 20201117162926714 -tags: Resources Plugings +modified: 20210101201435693 +tags: [[Community Plugins]] Plugings title: Slider by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/slider/ diff --git a/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Tiddler Commander by Mohammad.tid similarity index 94% rename from editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Tiddler Commander by Mohammad.tid index d2c873745..663801f8f 100644 --- a/editions/tw5.com/tiddlers/community/resources/Tiddler Commander by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Tiddler Commander by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201116203717105 -modified: 20201116204652385 -tags: Resources Plugings +modified: 20210101201435693 +tags: [[Community Plugins]] Plugings title: Tiddler Commander by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Commander/ diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyClip by buggyjay.tid b/editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid similarity index 93% rename from editions/tw5.com/tiddlers/community/resources/TiddlyClip by buggyjay.tid rename to editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid index cc8ebe929..a074b0ab1 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyClip by buggyjay.tid +++ b/editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid @@ -1,6 +1,6 @@ created: 20140910102845245 -modified: 20140910102845245 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: TiddlyClip by buggyjay type: text/vnd.tiddlywiki url: http://tiddlyclip.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyMap by Felix Kuppers.tid b/editions/tw5.com/tiddlers/community/plugins/TiddlyMap by Felix Kuppers.tid similarity index 93% rename from editions/tw5.com/tiddlers/community/resources/TiddlyMap by Felix Kuppers.tid rename to editions/tw5.com/tiddlers/community/plugins/TiddlyMap by Felix Kuppers.tid index 0d8059587..571b5f38d 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyMap by Felix Kuppers.tid +++ b/editions/tw5.com/tiddlers/community/plugins/TiddlyMap by Felix Kuppers.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20141122093837330 -tags: Resources +modified: 20210101201435693 +tags: [[Community Resources]] title: TiddlyMap Plugin by Felix Küppers type: text/vnd.tiddlywiki url: http://tiddlymap.org diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki for Scholars.tid b/editions/tw5.com/tiddlers/community/plugins/TiddlyWiki for Scholars.tid similarity index 90% rename from editions/tw5.com/tiddlers/community/resources/TiddlyWiki for Scholars.tid rename to editions/tw5.com/tiddlers/community/plugins/TiddlyWiki for Scholars.tid index 25c9faa4d..256d1c142 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki for Scholars.tid +++ b/editions/tw5.com/tiddlers/community/plugins/TiddlyWiki for Scholars.tid @@ -1,6 +1,6 @@ created: 20140720085406905 -modified: 20140720084548184 -tags: Resources +modified: 20210101191843666 +tags: [[Community Editions]] title: "TiddlyWiki for Scholars" by Alberto Molina type: text/vnd.tiddlywiki url: http://tw5.scholars.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Tiddlyshow by Mohammad.tid similarity index 86% rename from editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Tiddlyshow by Mohammad.tid index 50a639ac8..7d7e7351f 100644 --- a/editions/tw5.com/tiddlers/community/resources/Tiddlyshow by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Tiddlyshow by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160944367 -modified: 20201117162735263 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Tiddlyshow by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/Tiddlyshow/ diff --git a/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Timelines by Mohammad.tid similarity index 88% rename from editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Timelines by Mohammad.tid index d1e6fa7cc..40ab9e968 100644 --- a/editions/tw5.com/tiddlers/community/resources/Timelines by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Timelines by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117161434779 -modified: 20201117161728094 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Timelines by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Timelines/ diff --git a/editions/tw5.com/tiddlers/community/resources/Tinka by Andreas Hahn.tid b/editions/tw5.com/tiddlers/community/plugins/Tinka by Andreas Hahn.tid similarity index 90% rename from editions/tw5.com/tiddlers/community/resources/Tinka by Andreas Hahn.tid rename to editions/tw5.com/tiddlers/community/plugins/Tinka by Andreas Hahn.tid index cc704405e..4b8ffd54e 100644 --- a/editions/tw5.com/tiddlers/community/resources/Tinka by Andreas Hahn.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Tinka by Andreas Hahn.tid @@ -1,6 +1,6 @@ created: 20140920124011558 -modified: 20170305081535978 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: Tinka by Andreas Hahn type: text/vnd.tiddlywiki url: https://tinkaplugin.github.io/ diff --git a/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Todolist by Mohammad.tid similarity index 89% rename from editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Todolist by Mohammad.tid index 5dcb15b75..2fc99a39e 100644 --- a/editions/tw5.com/tiddlers/community/resources/Todolist by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Todolist by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201116210711381 -modified: 20201116212041642 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Todolist by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Todolist/ diff --git a/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Trashbin by Mohammad.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Trashbin by Mohammad.tid index c8e442ae9..65f0ed91a 100644 --- a/editions/tw5.com/tiddlers/community/resources/Trashbin by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Trashbin by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117155328920 -modified: 20201117155604253 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Trashbin by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Trashbin/ diff --git a/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Utility by Mohammad.tid similarity index 84% rename from editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid rename to editions/tw5.com/tiddlers/community/plugins/Utility by Mohammad.tid index 38da64a30..a4e7c479d 100644 --- a/editions/tw5.com/tiddlers/community/resources/Utility by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Utility by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160011169 -modified: 20201117160235750 -tags: Resources Plugings +modified: 20210101191843666 +tags: [[Community Plugins]] Plugings title: Utility by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Utility/ diff --git a/editions/tw5.com/tiddlers/community/resources/_JD Mobile Layout plugin_ by JD.tid b/editions/tw5.com/tiddlers/community/plugins/_JD Mobile Layout plugin_ by JD.tid similarity index 82% rename from editions/tw5.com/tiddlers/community/resources/_JD Mobile Layout plugin_ by JD.tid rename to editions/tw5.com/tiddlers/community/plugins/_JD Mobile Layout plugin_ by JD.tid index 520e87309..07fce12b5 100644 --- a/editions/tw5.com/tiddlers/community/resources/_JD Mobile Layout plugin_ by JD.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_JD Mobile Layout plugin_ by JD.tid @@ -1,7 +1,7 @@ created: 20171107181449175 creator: Ste Willson -modified: 20171107185105718 -tags: Resources +modified: 20210101170932934 +tags: [[Community Plugins]] title: "JD Mobile Layout plugin" by JD type: text/vnd.tiddlywiki url: http://j.d.simplemobile.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/_Mal's Sandbox_ by Mal.tid b/editions/tw5.com/tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid similarity index 95% rename from editions/tw5.com/tiddlers/community/resources/_Mal's Sandbox_ by Mal.tid rename to editions/tw5.com/tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid index 189b90b16..ab1fc15ba 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Mal's Sandbox_ by Mal.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid @@ -1,6 +1,6 @@ created: 20160501131111865 -modified: 20160501131900615 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: "Mal's Sandbox" by Mal type: text/vnd.tiddlywiki url: http://malsandbox.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/_SK_Plugins_ by Stephen Kimmel.tid b/editions/tw5.com/tiddlers/community/plugins/_SK_Plugins_ by Stephen Kimmel.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/_SK_Plugins_ by Stephen Kimmel.tid rename to editions/tw5.com/tiddlers/community/plugins/_SK_Plugins_ by Stephen Kimmel.tid index 764acdf9e..c6fafb82a 100644 --- a/editions/tw5.com/tiddlers/community/resources/_SK_Plugins_ by Stephen Kimmel.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_SK_Plugins_ by Stephen Kimmel.tid @@ -1,6 +1,6 @@ created: 20160505180545073 -modified: 20160505180934836 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: "SK Plugins" by Stephen Kimmel type: text/vnd.tiddlywiki url: http://skplugins.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/_Slides and Stories_ by Jan.tid b/editions/tw5.com/tiddlers/community/plugins/_Slides and Stories_ by Jan.tid similarity index 95% rename from editions/tw5.com/tiddlers/community/resources/_Slides and Stories_ by Jan.tid rename to editions/tw5.com/tiddlers/community/plugins/_Slides and Stories_ by Jan.tid index 3e28951d2..361dd3ae0 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Slides and Stories_ by Jan.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_Slides and Stories_ by Jan.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20170101192254712 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: "Slides and Stories" by Jan type: text/vnd.tiddlywiki url: http://slidesnstories.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/_TW5-TeXZilla_ plugin by Joe Renes.tid b/editions/tw5.com/tiddlers/community/plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid similarity index 92% rename from editions/tw5.com/tiddlers/community/resources/_TW5-TeXZilla_ plugin by Joe Renes.tid rename to editions/tw5.com/tiddlers/community/plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid index f9f422306..49533271b 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TW5-TeXZilla_ plugin by Joe Renes.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid @@ -1,6 +1,6 @@ created: 20150206170114934 -modified: 20150206170327332 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: "TW5-TeXZilla" plugin by Joe Renes type: text/vnd.tiddlywiki url: http://tw5-texzilla.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/_Tekan_ Kanban that stays with you_ by Riz.tid b/editions/tw5.com/tiddlers/community/plugins/_Tekan_ Kanban that stays with you_ by Riz.tid similarity index 88% rename from editions/tw5.com/tiddlers/community/resources/_Tekan_ Kanban that stays with you_ by Riz.tid rename to editions/tw5.com/tiddlers/community/plugins/_Tekan_ Kanban that stays with you_ by Riz.tid index a80cc8655..7da1e208b 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Tekan_ Kanban that stays with you_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_Tekan_ Kanban that stays with you_ by Riz.tid @@ -1,6 +1,6 @@ created: 20171115160958926 -modified: 20171115161136049 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: "Tekan: Kanban that stays with you" by Riz type: text/vnd.tiddlywiki url: https://ibnishak.github.io/Tesseract/projects/tekan/Tekan.html diff --git a/editions/tw5.com/tiddlers/community/resources/datepicker based on Pikaday.tid b/editions/tw5.com/tiddlers/community/plugins/datepicker based on Pikaday.tid similarity index 91% rename from editions/tw5.com/tiddlers/community/resources/datepicker based on Pikaday.tid rename to editions/tw5.com/tiddlers/community/plugins/datepicker based on Pikaday.tid index d7e26eeca..1f5f6abc1 100644 --- a/editions/tw5.com/tiddlers/community/resources/datepicker based on Pikaday.tid +++ b/editions/tw5.com/tiddlers/community/plugins/datepicker based on Pikaday.tid @@ -1,6 +1,6 @@ created: 20151015072304780 -modified: 20151015073121685 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: datepicker plugin based on Pikaday, by kixam type: text/vnd.tiddlywiki url: http://kixam.github.io/TW5-datePicker/ diff --git a/editions/tw5.com/tiddlers/community/resources/rboue's plugins for TiddlyWiki.tid b/editions/tw5.com/tiddlers/community/plugins/rboue's plugins for TiddlyWiki.tid similarity index 90% rename from editions/tw5.com/tiddlers/community/resources/rboue's plugins for TiddlyWiki.tid rename to editions/tw5.com/tiddlers/community/plugins/rboue's plugins for TiddlyWiki.tid index 20d60653a..4c5d4237a 100644 --- a/editions/tw5.com/tiddlers/community/resources/rboue's plugins for TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/community/plugins/rboue's plugins for TiddlyWiki.tid @@ -1,6 +1,6 @@ created: 20150403104230499 -modified: 20150630165603125 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: rboue's plugins for TiddlyWiki type: text/vnd.tiddlywiki url: http://rboue.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/vis.js Timeline.tid b/editions/tw5.com/tiddlers/community/plugins/vis.js Timeline.tid similarity index 90% rename from editions/tw5.com/tiddlers/community/resources/vis.js Timeline.tid rename to editions/tw5.com/tiddlers/community/plugins/vis.js Timeline.tid index 42948de98..5155426b2 100644 --- a/editions/tw5.com/tiddlers/community/resources/vis.js Timeline.tid +++ b/editions/tw5.com/tiddlers/community/plugins/vis.js Timeline.tid @@ -1,6 +1,6 @@ created: 20150527080809699 -modified: 20150527080809699 -tags: Resources +modified: 20210101191843666 +tags: [[Community Plugins]] title: vis.js Timeline by emkay, revived by kixam type: text/vnd.tiddlywiki url: http://kixam.github.io/TW5-visjsTimeline/ diff --git a/editions/tw5.com/tiddlers/community/resources/BrainTest.tid b/editions/tw5.com/tiddlers/community/resources/BrainTest.tid index 0b0fa0f09..3947bdc2a 100644 --- a/editions/tw5.com/tiddlers/community/resources/BrainTest.tid +++ b/editions/tw5.com/tiddlers/community/resources/BrainTest.tid @@ -1,6 +1,6 @@ created: 20140315085406905 -modified: 20140321084548184 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "BrainTest - tools for a digital brain" by Danielo Rodriguez type: text/vnd.tiddlywiki url: http://braintest.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid b/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid index 7cd273fbf..7eb546980 100644 --- a/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid +++ b/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid @@ -1,6 +1,6 @@ created: 20181108094230499 -modified: 20181108095858434 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: Code styles and auto format settings for IDEs type: text/vnd.tiddlywiki url: https://gitlab.com/bimlas/tw5-code-style-auto-format diff --git a/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid b/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid index 8758e615b..86cb29198 100644 --- a/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid +++ b/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid @@ -1,6 +1,6 @@ created: 20140927155929149 -modified: 20140927155929149 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "CouchDB Adaptor" by William Shallum type: text/vnd.tiddlywiki url: https://github.com/wshallum/couchadaptor diff --git a/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid b/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid index 89d53794a..549d63d70 100644 --- a/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid +++ b/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20161224181607230 -tags: Resources +modified: 20210101191843666 +tags: [[Community Resources]] Tutorials title: "Filter Examples" by Tobias Beer type: text/vnd.tiddlywiki url: http://tobibeer.github.io/tw/filters/#Filter%20Examples diff --git a/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid b/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid index 681a45f0b..5fb28888f 100644 --- a/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid +++ b/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid @@ -1,6 +1,6 @@ created: 20190710085450262 -modified: 20190710090131976 -tags: SVG Images [[Font Awesome 5]] Resources +modified: 20210101191843666 +tags: SVG Images [[Font Awesome 5]] [[Other Resources]] title: "Font Awesome 5 Free SVGs for TiddlyWiki" by morosanuae type: text/vnd.tiddlywiki url: http://fa5-free-svg.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid b/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid index 565374f24..c41fe164a 100644 --- a/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid +++ b/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20161224182127471 -tags: Resources +modified: 20210101191843666 +tags: Examples title: "Gospel Bubbles" by Rev. David Gifford type: text/vnd.tiddlywiki url: http://giffmex.org/gospels.bubbles.html#Gospels%20Bubbles diff --git a/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid b/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid index 486310ca8..db8c20c55 100644 --- a/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid +++ b/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid @@ -1,6 +1,6 @@ created: 20141215174011558 -modified: 20141215174011558 -tags: Resources +modified: 20210101191843666 +tags: [[Tutorials]] title: "Heeg.ru" by sini-Kit type: text/vnd.tiddlywiki url: http://heeg.ru/ diff --git a/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid b/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid index 8257e207c..9b18622ce 100644 --- a/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid +++ b/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid @@ -1,6 +1,6 @@ created: 20140315085406905 -modified: 20140321084548184 -tags: Resources +modified: 20210101191843666 +tags: Tutorials title: "Hosting TiddlyWiki5 on GoogleDrive" by Tony Ching url: https://googledrive.com/host/0B51gSXixfJ2Qb0I4R2M4MWJVMlU diff --git a/editions/tw5.com/tiddlers/community/resources/How Does Twederation Work by Jed Carty.tid b/editions/tw5.com/tiddlers/community/resources/How Does Twederation Work by Jed Carty.tid deleted file mode 100644 index de0bd2cb9..000000000 --- a/editions/tw5.com/tiddlers/community/resources/How Does Twederation Work by Jed Carty.tid +++ /dev/null @@ -1,14 +0,0 @@ -created: 20141122093837330 -modified: 20161224220352820 -tags: Resources -title: "How Does Twederation Work" by Jed Carty -type: text/vnd.tiddlywiki -url: http://twederation.tiddlyspot.com/#How%20does%20the%20TWederation%20work%20anyway%3F%20-%20The%20TWederation%20(2016122014h0034) - -An explainer about Twederation, a system of sharing information between TiddlyWiki instances. - -{{!!url}} - -<<< -TWederation is a system for sharing information between participating ~TiddlyWikis without using a client-server model. The link here points to a tiddler that gives more details. This particular implementation works something like an online forum. On the rest of the site, you can follow discussions by the developers and collaborators occurring within the Twederation "network" itself. -<<< diff --git a/editions/tw5.com/tiddlers/community/resources/Plugins by Uwe Stuehler.tid b/editions/tw5.com/tiddlers/community/resources/Plugins by Uwe Stuehler.tid deleted file mode 100644 index 27545b5e7..000000000 --- a/editions/tw5.com/tiddlers/community/resources/Plugins by Uwe Stuehler.tid +++ /dev/null @@ -1,13 +0,0 @@ -created: 20171212104509964 -modified: 20171212104733995 -tags: Resources -title: Plugins by Uwe Stuehler -type: text/vnd.tiddlywiki -url: https://ustuehler.github.io - -A collection of plugins from Uwe Stuehler, including: - -* Material Edition, a theme based on Google's "material" design language -* A wrapper for the [[MUURI plugin|https://github.com/haltu/muuri]], bringing complex "masonry"-style layouts to TiddlyWiki - -{{!!url}} diff --git a/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid index 8d962586e..c2d5143ec 100644 --- a/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117164024930 -modified: 20201117164308641 -tags: Resources +modified: 20210101191843666 +tags: [[Tutorials]] title: RegExp in Tiddlywiki by Mohammad type: text/vnd.tiddlywiki url: http://tw-regexp.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid b/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid index 22a646aea..c52a71018 100644 --- a/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid +++ b/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid @@ -1,6 +1,6 @@ created: 20150430154234863 -modified: 20150430154355656 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: SeeAlso by Matias Goldman type: text/vnd.tiddlywiki url: http://seealso.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid index 834348b94..2e775a468 100644 --- a/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117162254751 -modified: 20201117162601326 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: Semantic Colors by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Semantic-Colors/ diff --git a/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid b/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid index 31e3fc1ca..43ab60606 100644 --- a/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid +++ b/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid @@ -1,6 +1,6 @@ created: 20140315085406905 -modified: 20161230173004886 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] Tutorials title: "TB5 - a pocket full of tips" by Tobias Beer type: text/vnd.tiddlywiki url: http://tobibeer.github.io/tb5/ diff --git a/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid index d269023b6..143d02d08 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid @@ -1,6 +1,6 @@ created: 20180830194141190 -modified: 20201116203625120 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] Tutorials title: TW-Scripts by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Scripts/ diff --git a/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid b/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid index eb37b4ff9..1a2a687f1 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid @@ -1,6 +1,6 @@ created: 20140315085406905 -modified: 20140321084548184 -tags: Resources Tutorials +modified: 20210101191843666 +tags: [[Other Resources]] Tutorials [[Community plugins]] title: "TW5 Magick" by Stephan Hradek type: text/vnd.tiddlywiki url: http://tw5magick.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid b/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid index c23471ea0..c0990ad71 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid @@ -1,6 +1,6 @@ created: 20180320020552940 -modified: 20180320020554172 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: TW5-SingleExecutable by Jed Carty type: text/vnd.tiddlywiki url: https://github.com/OokTech/TW5-SingleExecutable diff --git a/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid b/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid index d116f8027..d6ef2551c 100644 --- a/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid +++ b/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid @@ -1,6 +1,6 @@ created: 20150913184230499 -modified: 20150913184230499 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: TWCommunitySearch type: text/vnd.tiddlywiki url: http://erwanm.github.io/tw-community-search diff --git a/editions/tw5.com/tiddlers/community/resources/TWaddle by Matias Goldman.tid b/editions/tw5.com/tiddlers/community/resources/TWaddle by Matias Goldman.tid index b4edd39ee..fa6cbe414 100644 --- a/editions/tw5.com/tiddlers/community/resources/TWaddle by Matias Goldman.tid +++ b/editions/tw5.com/tiddlers/community/resources/TWaddle by Matias Goldman.tid @@ -1,6 +1,6 @@ created: 20150529084054330 modified: 20150529084329815 -tags: Resources +tags: [[Other Resources]] title: TWaddle by Matias Goldman type: text/vnd.tiddlywiki url: http://twaddle.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid index acdc92002..639d94436 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid @@ -1,6 +1,6 @@ created: 20160422143238688 -modified: 20160422143637775 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: TiddlyChrome by Arlen Beiler type: text/vnd.tiddlywiki url: https://github.com/Arlen22/tiddly-chrome-app/ diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid index 71de566d0..c63b22904 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid @@ -5,15 +5,15 @@ created: 20171109172705241 delivery: Google Drive Add-on description: Google Drive add-on to save TiddlyWiki files method: save -modified: 20200507202706013 -tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Resources Safari Saving Windows iOS plugins Edge +modified: 20210101191843666 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP [[Other Resources]] Safari Saving Windows iOS plugins Edge title: TiddlyDrive Add-on for Google Drive by Joshua Stubbs type: text/vnd.tiddlywiki -url: https://lordratte.gitlab.io/tiddlydrive/#installation-guide +url: https://github.com/tiddlydrive/tiddlydrive.github.io An add-on for Google Drive that allows TiddlyWiki files stored there to be opened and saved directly -To find out how to add it to your account, go to the project's info page: +To find more information, go to the github page of this project: {{!!url}} <<< diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid index 24dd5ed4e..93d94140f 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid @@ -5,8 +5,8 @@ created: 20171109171415540 delivery: DIY description: An extension to TiddlyWiki's Node.js server method: sync -modified: 20200507203417109 -tags: Linux Mac Windows Saving Resources +modified: 20210101191843666 +tags: Linux Mac Windows Saving [[Other Resources]] title: TiddlyServer by Arlen Beiler type: text/vnd.tiddlywiki url: https://github.com/Arlen22/TiddlyServer diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Jingle by Mans Martensson.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Jingle by Mans Martensson.tid deleted file mode 100644 index 9b0b847c9..000000000 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Jingle by Mans Martensson.tid +++ /dev/null @@ -1,18 +0,0 @@ -created: 20150630204917564 -modified: 20150630205144064 -tags: Resources -title: TiddlyWiki Jingle by Måns Mårtensson -type: text/vnd.tiddlywiki -url: https://musescore.com/node/796056 - -A catchy jingle for TiddlyWiki. - -{{!!url}} - -<<< -Even if it sounds like some ol' jazz tune it ''IS'' an original composition and it should be quite obvious that the "hook of the melody" is a trill made by singing Tidd-ly Wiki :-). - -My lacking skills for writing text/lyrics should be apparent in the fact that the text consists of 12 Tidd-ly Wikis and some extra "tiddly's" - just for the sake of getting the message delivered ;-)... - -I've recorded every instrument on my guitar via a guitar synth on a loop machine (except for the drums - they were played live/in sync with the loop station on a "~BeatBuddy" drum pedal..) - no pc was involved.. -<<< diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid index 9685faedd..0da6d11d5 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid @@ -1,6 +1,6 @@ created: 20140327085406905 -modified: 20140327084548184 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki Notes" by James Anderson type: text/vnd.tiddlywiki url: http://welford.github.io diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid index 1a091f57b..bebfa92a9 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid @@ -1,6 +1,6 @@ created: 20140129085406905 -modified: 20140129084548184 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] Articles title: "TiddlyWiki Posts" by Jeffrey Kishner type: text/vnd.tiddlywiki url: http://blog.jeffreykishner.com/tiddlywiki/ diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid index 94d1a4c3d..5b01c18fd 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid @@ -1,6 +1,6 @@ created: 20150926170842677 -modified: 20150926171056402 -tags: Resources +modified: 20210101191843666 +tags: [[Tutorials]] title: TiddlyWiki Video Tutorials by Francis Meetze type: text/vnd.tiddlywiki url: https://www.youtube.com/playlist?list=PLzZCajspPU_UjFn0uy-J9URz0LP4zhxRK diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid index faae8a3d2..5ed79f0f2 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid @@ -1,6 +1,6 @@ created: 20160424121451825 -modified: 20160424121733860 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: TiddlyWiki extensions for Sublime Text 3 by roma0104 type: text/vnd.tiddlywiki url: https://github.com/roma0104/sublime-tid diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid index 32b0a5814..41817b9dc 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid @@ -1,6 +1,6 @@ created: 20160820000000000 -modified: 20160820000000000 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: TiddlyWiki extensions for ViM type: text/vnd.tiddlywiki url: https://github.com/roma0104/vim-tid diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid index 08a9f1a79..28fc730d7 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid @@ -1,6 +1,6 @@ created: 20141031210213087 -modified: 20141031210213087 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki guide FR" by Sylvain Naudin type: text/vnd.tiddlywiki url: http://sylvain.naud.in/public/TiddlyWiki/tiddlywiki-guide-fr-CCbysa.html diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid index 99b17182a..00fb339f4 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid @@ -1,6 +1,6 @@ created: 20140322085406905 -modified: 20140322084539183 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki 舞" by Bram Chen type: text/vnd.tiddlywiki url: http://tw5-zh.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Coding.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Coding.tid deleted file mode 100644 index ffadaf1f9..000000000 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Coding.tid +++ /dev/null @@ -1,18 +0,0 @@ -created: 20140315085406905 -modified: 20140321084548184 -tags: Resources -title: "TiddlyWiki5 Coding" by Chris Hunt -url: http://cjhunt.github.io/ - -Chris Hunt's detailed developer tutorials for getting started with writing widgets for TiddlyWiki. - -{{!!url}} - -<<< -These pages document aspects TiddlyWiki5 programming, sharing "lessons learned" to help developers to get started with TiddlyWiki5 customization and extension. - -There are currently two articles in this wiki: - -* A Simple Widget -* A More Complex Widget -<<< diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid index dcd9ac91a..274c7ccdf 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid @@ -1,6 +1,6 @@ created: 20140315085406905 -modified: 20140321084548184 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] [[Community Plugins]] title: "TiddlyWiki5 Playground" by Ton Gerner type: text/vnd.tiddlywiki url: http://tongerner.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid index 4e9457218..794370df8 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid @@ -1,6 +1,6 @@ created: 20141009170239174 -modified: 20190217000000000 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki5^2 documenting while learning TiddlyWiki5" by Iannis Zannos type: text/vnd.tiddlywiki url: https://web.archive.org/web/20170728212414/http://larigot.avarts.ionio.gr/users/iani/wikis/tw5square.html diff --git a/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid b/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid index 8e5294854..b2dc32b48 100644 --- a/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid +++ b/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid @@ -5,8 +5,8 @@ created: 20200507214737998 delivery: App description: Single File Tiddlywiki5 executable method: save -modified: 20200507215529213 -tags: Firefox [[Internet Explorer]] Opera Resources Safari Saving Windows Edge Linux +modified: 20210101191843666 +tags: Firefox [[Internet Explorer]] Opera [[Other Resources]] Safari Saving Windows Edge Linux title: Twexe: Single File Tiddlywiki5 executable type: text/vnd.tiddlywiki url: https://ihm4u.github.io/twexe/ diff --git a/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid b/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid index 9ca6b0d87..93e1c2a4b 100644 --- a/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid +++ b/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid @@ -1,6 +1,6 @@ created: 20180309162923236 -modified: 20180309164105386 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: Widdly by Opennota type: text/vnd.tiddlywiki url: https://gitlab.com/opennota/widdly diff --git a/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid b/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid index dbc8fd1e4..dbe7d6928 100644 --- a/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid +++ b/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid @@ -1,6 +1,6 @@ created: 201704191641 -modified: 201704191641 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "Wikilabs" by PMario type: text/vnd.tiddlywiki url: https://wikilabs.github.io diff --git a/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid b/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid index c69e966be..f6337504c 100644 --- a/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid +++ b/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid @@ -1,6 +1,6 @@ created: 20140505085406905 -modified: 20140505085406905 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "Wills Q&D gTD" by Matabele type: text/vnd.tiddlywiki url: http://wills.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid b/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid index 527f5dd9d..002a3ab6e 100644 --- a/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid +++ b/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid @@ -1,6 +1,6 @@ created: 20171219171531482 -modified: 20171219171730344 -tags: Resources +modified: 20210101170932934 +tags: [[Other Resources]] title: "ATWiki" by Lamusia Project type: text/vnd.tiddlywiki url: https://lamusia.github.io/#ATWiki diff --git a/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid b/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid index c6561f668..57ff67459 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid @@ -1,7 +1,7 @@ created: 20171111192738730 creator: MAS -modified: 20171111192738730 -tags: Resources +modified: 20210101170932934 +tags: [[Other Resources]] title: "Dropboard" by Reid Gould type: text/vnd.tiddlywiki url: https://github.com/reidgould/tiddlywiki-dropboard diff --git a/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid b/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid index ee9ad516b..0119f0cf6 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid @@ -1,6 +1,6 @@ created: 20180309160958926 -modified: 20180309160118848 -tags: Resources +modified: 20210101170932934 +tags: [[Other Resourches]] title: "Dynamic Tables" by Jed Carty type: text/vnd.tiddlywiki url: http://ooktech.com/jed/ExampleWikis/DynamicTables/ diff --git a/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid b/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid index 0576f083d..06548d27a 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid @@ -1,8 +1,8 @@ created: 20161226165024380 creator: Thomas Elmiger -modified: 20161226193911129 +modified: 20210101170932934 modifier: Thomas Elmiger -tags: Resources +tags: [[Other Resources]] title: "Hacks" by Thomas Elmiger url: http://tid.li/tw5/hacks.html diff --git a/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid b/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid index 3343778b5..ae78dca46 100644 --- a/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid +++ b/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20141122093837330 -tags: Resources +modified: 20210101170932934 +tags: [[Other Resources]] title: "In My Socks" by Jed Carty type: text/vnd.tiddlywiki url: http://inmysocks.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid b/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid index 4275d011d..a52f013d3 100644 --- a/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid +++ b/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid @@ -1,7 +1,7 @@ created: 20161226165024380 creator: Ste Willson -modified: 20170813162852649 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "MathCell" by Stephen Kimmel url: http://mathcell.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid b/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid index ae8e1b4a0..441297a84 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid @@ -1,6 +1,6 @@ created: 20140410103123179 -modified: 20140410103123179 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TWeb.at" by Mario Pietsch type: text/vnd.tiddlywiki url: https://tweb.at diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid index 33b4b4629..4b0a1655e 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid @@ -1,7 +1,7 @@ created: 20161226165024380 creator: Matt Lauber -modified: 20161226193911129 -tags: Resources +modified: 20210101191843666 +tags: [[Other resources]] title: "TiddlyServer" by Matt Lauber url: https://github.com/mklauber/TiddlyServer/releases/ diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid index 127e03f94..41eb937c7 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20170101185203168 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki Knowledge Network" by Dmitry Sokolov type: text/vnd.tiddlywiki url: http://confocal-manawatu.pbworks.com/w/page/113574373/TiddlyWiki diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid index 47ef58f0d..fa3ea3d0e 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid @@ -1,6 +1,6 @@ created: 20181012161505447 -modified: 20181012184124165 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki Toolmap" by David Gifford type: text/vnd.tiddlywiki url: https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid index edac8b94c..3145c52e4 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid @@ -1,6 +1,6 @@ created: 20141020072708790 -modified: 20141020072708790 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki5 Bourbon" by mkt_memory type: text/vnd.tiddlywiki url: http://bacchus.ivory.ne.jp/bourbon/ diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid index 9a37d6155..e19d8ace1 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20161224230649593 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "TiddlyWiki5 Forum on Reddit" by Riz type: text/vnd.tiddlywiki url: https://www.reddit.com/r/TiddlyWiki5/ diff --git a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid index 65859af50..6a5e7bfe9 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid @@ -5,8 +5,8 @@ created: 20180830194141190 delivery: Browser Extension & Native host description: Browser extension & native host for desktops method: save -modified: 20200507202633529 -tags: Windows Linux Chrome Firefox Saving Resources plugins Mac Opera Edge +modified: 20210101191843666 +tags: Windows Linux Chrome Firefox Saving [[Other Resources]] plugins Mac Opera Edge title: Timimi: WebExtension and Native Host by Riz type: text/vnd.tiddlywiki url: https://ibnishak.github.io/Timimi/ diff --git a/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid b/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid index f0fcf7e19..198e777c0 100644 --- a/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid +++ b/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid @@ -1,7 +1,7 @@ created: 20171107175718679 creator: Ste Willson -modified: 20171113155204443 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: "X3DOM for TiddlyWiki 5" by Jamal Wills type: text/vnd.tiddlywiki url: http://x3dom.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid index 7d13d39bc..b3352b675 100644 --- a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid +++ b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid @@ -5,8 +5,8 @@ created: 20171116165500000 delivery: Browser Extension description: Browser extension for Firefox method: save -modified: 20200507105159105 -tags: Firefox Saving Resources plugins +modified: 20210101170932934 +tags: Firefox Saving [[Other Resources]] plugins title: "file-backups" Extension for Firefox by pmario type: text/vnd.tiddlywiki url: https://github.com/pmario/file-backups diff --git a/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid b/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid index 88385a8d6..ae589ce18 100644 --- a/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid +++ b/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid @@ -1,6 +1,6 @@ created: 20171219165418434 -modified: 20171219165845495 -tags: Resources +modified: 20210101191843666 +tags: [[Other resources]] title: "muritest" by Simon Huber type: text/vnd.tiddlywiki url: http://muritest.tiddlyspot.com diff --git a/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid b/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid index d09f0e17a..c0f50f58f 100644 --- a/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid +++ b/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid @@ -5,8 +5,8 @@ created: 20171109171935039 delivery: Browser Extension description: Browser extension for Chrome and Firefox method: save -modified: 20200507105459753 -tags: Chrome Firefox Saving Resources plugins +modified: 20210101191843666 +tags: Chrome Firefox Saving [[Other Resources]] plugins title: "savetiddlers" Extension for Chrome and Firefox by buggyj type: text/vnd.tiddlywiki url: https://github.com/buggyj/savetiddlers diff --git a/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid b/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid index 20da1617e..fd17aa4fd 100644 --- a/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid +++ b/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid @@ -1,6 +1,6 @@ created: 20160424150055313 -modified: 20160424150236151 -tags: Resources +modified: 20210101191843666 +tags: [[Other Resources]] title: twproxy by Steve Gattuso type: text/vnd.tiddlywiki url: https://github.com/stevenleeg/twproxy diff --git a/editions/tw5.com/tiddlers/community/themes/Mono theme by JD.tid b/editions/tw5.com/tiddlers/community/themes/Mono theme by JD.tid new file mode 100644 index 000000000..8d40adaf2 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/themes/Mono theme by JD.tid @@ -0,0 +1,11 @@ +created: 20210101154635213 +modified: 20210101154636617 +tags: [[Community Themes]] +title: "Mono theme" by JD +type: text/vnd.tiddlywiki +url: http://j.d.mono.tiddlyspot.com/ + +This theme by JD features a left side bar, advanced functionality from the search bar and plenty of customizability built in. + +{{!!url}} + diff --git a/editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid b/editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid new file mode 100644 index 000000000..7d505a41e --- /dev/null +++ b/editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid @@ -0,0 +1,19 @@ +created: 20210101154635213 +modified: 20210101201435693 +tags: [[Community Themes]] +title: "Notebook, a clean, uncluttered theme for TiddlyWiki" by Nicolas Petton +type: text/vnd.tiddlywiki +url: https://nicolas.petton.fr/tw/notebook.html + +A theme that give TiddlyWiki a modern look. + +{{!!url}} + +<<< +Notebook is a clean, uncluttered theme for TiddlyWiki. + +* The theme is responsive and comes with mobile support through the included notebook-mobile plugin. +* Notebook comes with 3 default colour palettes, a grey, beige and dark one. To switch between colour palettes, click the color palette switch button in the top bar. +* Notebook uses a custom left sidebar, with another sticky bar at the top of the page (or at the bottom on mobile). + +<<< \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/themes/Whitespace a negative-spacious webapp-nostalgic theme by JD.tid b/editions/tw5.com/tiddlers/community/themes/Whitespace a negative-spacious webapp-nostalgic theme by JD.tid new file mode 100644 index 000000000..5c3055fde --- /dev/null +++ b/editions/tw5.com/tiddlers/community/themes/Whitespace a negative-spacious webapp-nostalgic theme by JD.tid @@ -0,0 +1,11 @@ +created: 20210101154635213 +modified: 20210101154636617 +tags: [[Community Themes]] +title: "Whitespace, a negative-spacious, webapp-nostalgic theme" by JD +type: text/vnd.tiddlywiki +url: http://j.d.whitespace.tiddlyspot.com/ + +A beautiful theme that leverages the white spaces between elements. + +{{!!url}} + diff --git a/editions/tw5.com/tiddlers/community/resources/_Ghostwriter theme by Rory Gibson_ by Riz.tid b/editions/tw5.com/tiddlers/community/themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid similarity index 87% rename from editions/tw5.com/tiddlers/community/resources/_Ghostwriter theme by Rory Gibson_ by Riz.tid rename to editions/tw5.com/tiddlers/community/themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid index 64544aa1a..8ba7a22a1 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Ghostwriter theme by Rory Gibson_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20161224230649593 -tags: Resources +modified: 20210101170932934 +tags: [[Community Themes]] title: "Ghostwriter theme by Rory Gibson" adapted for TW5 by Riz type: text/vnd.tiddlywiki url: https://ibnishak.github.io/ghostwriter/ diff --git a/editions/tw5.com/tiddlers/community/resources/_Moments-A little color won't hurt_ by Riz.tid b/editions/tw5.com/tiddlers/community/themes/_Moments-A little color won't hurt_ by Riz.tid similarity index 90% rename from editions/tw5.com/tiddlers/community/resources/_Moments-A little color won't hurt_ by Riz.tid rename to editions/tw5.com/tiddlers/community/themes/_Moments-A little color won't hurt_ by Riz.tid index c81056f78..443023f66 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Moments-A little color won't hurt_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/themes/_Moments-A little color won't hurt_ by Riz.tid @@ -1,6 +1,6 @@ created: 20141122093837330 -modified: 20161224225452147 -tags: Resources +modified: 20210101191843666 +tags: [[Community Themes]] title: "Moments: A little color won't hurt" by Riz type: text/vnd.tiddlywiki url: http://tesseractmoments.surge.sh/ diff --git a/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid b/editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid similarity index 95% rename from editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid rename to editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid index 07534dd5c..7a213b523 100644 --- a/editions/tw5.com/tiddlers/community/resources/GitHub Saver Tutorial by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117163027900 -modified: 20201117163855463 -tags: Resources +modified: 20210101191843666 +tags: [[Tutorials]] title: GitHub Saver Tutorial by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW5-GitHub-Saver/ From 4ee3ded04ad1639777b4663abe2e67774bfc4dc2 Mon Sep 17 00:00:00 2001 From: Odin <74539616+OdinJorna@users.noreply.github.com> Date: Sun, 3 Jan 2021 10:51:20 +0100 Subject: [PATCH 1165/2376] Fixed typo in Community.tid (#5356) --- editions/tw5.com/tiddlers/community/Community.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/community/Community.tid b/editions/tw5.com/tiddlers/community/Community.tid index 3e6d3041f..ccbb6afb8 100644 --- a/editions/tw5.com/tiddlers/community/Community.tid +++ b/editions/tw5.com/tiddlers/community/Community.tid @@ -6,4 +6,4 @@ type: text/vnd.tiddlywiki Here we gather the latest and most useful material from the TiddlyWiki community. -<<tabs "Forums Latest Tutorials [[Community Editions]] [[Community Plugins]] [[Community Themes]] [[Community Palettes]] [[Other resources]] Examples Articles Meetups" "Latest">> +<<tabs "Forums Latest Tutorials [[Community Editions]] [[Community Plugins]] [[Community Themes]] [[Community Palettes]] [[Other Resources]] Examples Articles Meetups" "Latest">> From d25e540dd2f0decf61c52fdc665a28a5dfeda93f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 3 Jan 2021 10:04:52 +0000 Subject: [PATCH 1166/2376] Add support for image/vnd.microsoft.icon content type Fixes #5357 --- boot/boot.js | 1 + core/modules/parsers/imageparser.js | 1 + 2 files changed, 2 insertions(+) diff --git a/boot/boot.js b/boot/boot.js index c065cfb61..353e5e0f6 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2301,6 +2301,7 @@ $tw.boot.initStartup = function(options) { $tw.utils.registerFileType("image/heic","base64",".heic",{flags:["image"]}); $tw.utils.registerFileType("image/heif","base64",".heif",{flags:["image"]}); $tw.utils.registerFileType("image/svg+xml","utf8",".svg",{flags:["image"]}); + $tw.utils.registerFileType("image/vnd.microsoft.icon","base64",".ico",{flags:["image"]}); $tw.utils.registerFileType("image/x-icon","base64",".ico",{flags:["image"]}); $tw.utils.registerFileType("application/font-woff","base64",".woff"); $tw.utils.registerFileType("application/x-font-ttf","base64",".woff"); diff --git a/core/modules/parsers/imageparser.js b/core/modules/parsers/imageparser.js index 0208d47e2..e3b8fb60a 100644 --- a/core/modules/parsers/imageparser.js +++ b/core/modules/parsers/imageparser.js @@ -39,6 +39,7 @@ exports["image/webp"] = ImageParser; exports["image/heic"] = ImageParser; exports["image/heif"] = ImageParser; exports["image/x-icon"] = ImageParser; +exports["image/vnd.microsoft.icon"] = ImageParser; })(); From fecf622616476d1764d5784fc1eb21e0971b7925 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 3 Jan 2021 10:05:02 +0000 Subject: [PATCH 1167/2376] It's 2021! --- core/copyright.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/copyright.tid b/core/copyright.tid index ffc8c4ac0..da72136c4 100644 --- a/core/copyright.tid +++ b/core/copyright.tid @@ -4,7 +4,7 @@ type: text/plain TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com) Copyright (c) 2004-2007, Jeremy Ruston -Copyright (c) 2007-2020, UnaMesa Association +Copyright (c) 2007-2021, UnaMesa Association All rights reserved. Redistribution and use in source and binary forms, with or without From 9434e95396cc0b8543fee1a7e619618384fb16c3 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 3 Jan 2021 10:48:13 +0000 Subject: [PATCH 1168/2376] Fix PETTIL url Fixes #5348 --- editions/tw5.com/tiddlers/community/examples/PETTIL.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/community/examples/PETTIL.tid b/editions/tw5.com/tiddlers/community/examples/PETTIL.tid index 0ec2fab43..c711eb679 100644 --- a/editions/tw5.com/tiddlers/community/examples/PETTIL.tid +++ b/editions/tw5.com/tiddlers/community/examples/PETTIL.tid @@ -3,7 +3,7 @@ modified: 20140716084548184 tags: Examples title: "PETTIL - Forth for the Commodore PET" by Charlie Hitselberger type: text/vnd.tiddlywiki -url: https://web.archive.org/web/20171114121112/chitselb.com/files/tiddlypettil.html +url: http://pettilmobile.com/tw/ A fast Forth interpreter for the [[Commodore PET|https://en.wikipedia.org/wiki/Commodore_PET]], written in 6502 assembly language. The TiddlyWiki containing program documentation is automatically generated from the source code: see https://github.com/chitselb/pettil. From 3ae27cab9ee54b989c380a7665942ea9966e7a03 Mon Sep 17 00:00:00 2001 From: Chris Nicoll <clutterstack@users.noreply.github.com> Date: Sun, 3 Jan 2021 06:36:11 -0500 Subject: [PATCH 1169/2376] Signed cla-individual (#5333) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 04d75786f..c3b9491fc 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -422,6 +422,8 @@ Ryan Kramer, @default-kramer, 2020/10/24 Miha Lunar, @SmilyOrg, 2020/11/04 +Chris Nicoll, @clutterstack, 2020/12/28 + Odin Jorna, @OdinJorna, 2020/12/31 Joe Bordes, @joebordes, 2021/01/02 From a8639c3129525b0fdb588666cdec14f4b7facf19 Mon Sep 17 00:00:00 2001 From: Glenn Dixon <dixonge@users.noreply.github.com> Date: Sun, 3 Jan 2021 04:37:28 -0700 Subject: [PATCH 1170/2376] Signing the CLA (#5358) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index c3b9491fc..1393039b9 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -427,3 +427,5 @@ Chris Nicoll, @clutterstack, 2020/12/28 Odin Jorna, @OdinJorna, 2020/12/31 Joe Bordes, @joebordes, 2021/01/02 + +Glenn Dixon, @dixonge, 2021/01/03 From e96a54c7531a2d9e07745e27d2015d8d7d09588f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 3 Jan 2021 11:46:40 +0000 Subject: [PATCH 1171/2376] TiddlyWebAdaptor: Don't crash if "etag" header is missing --- plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js index 7566b6756..6eff2f64d 100644 --- a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js +++ b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js @@ -197,11 +197,16 @@ TiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,callback) { return callback(err); } // Save the details of the new revision of the tiddler - var etagInfo = self.parseEtag(request.getResponseHeader("Etag")); - // Invoke the callback - callback(null,{ - bag: etagInfo.bag - }, etagInfo.revision); + var etag = request.getResponseHeader("Etag"); + if(!etag) { + callback("Response from server is missing required `etag` header"); + } else { + var etagInfo = self.parseEtag(etag); + // Invoke the callback + callback(null,{ + bag: etagInfo.bag + }, etagInfo.revision); + } } }); }; From 69e595abf9efdbcc77c6ce9803392307791643ed Mon Sep 17 00:00:00 2001 From: Rob Hoelz <rob@hoelz.ro> Date: Sun, 3 Jan 2021 05:48:17 -0600 Subject: [PATCH 1172/2376] Add docs on share plugin (#5331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …and mention it in the "sharing tiddlers" tiddler --- editions/tw5.com/tiddlers/plugins/Share Plugin.tid | 12 ++++++++++++ .../Sharing your tiddlers with others.tid | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 editions/tw5.com/tiddlers/plugins/Share Plugin.tid diff --git a/editions/tw5.com/tiddlers/plugins/Share Plugin.tid b/editions/tw5.com/tiddlers/plugins/Share Plugin.tid new file mode 100644 index 000000000..f90506548 --- /dev/null +++ b/editions/tw5.com/tiddlers/plugins/Share Plugin.tid @@ -0,0 +1,12 @@ +created: 20201228143125000 +modified: 20201228143125000 +tags: OfficialPlugins +title: Share Plugin +type: text/vnd.tiddlywiki + +<div class="tc-message-box">Do not install this plugin unless you understand exactly what it does</div> + +This experimental plugin provides tools to share tiddlers via URLs, comprising: + +* The ability to load a group of tiddlers from the browser location hash at startup +* Wizard and templates to create URLs from group of tiddlers diff --git a/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid b/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid index a88275448..caa787619 100644 --- a/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid +++ b/editions/tw5.com/tiddlers/workingwithtw/Sharing your tiddlers with others.tid @@ -1,5 +1,5 @@ created: 20140908163900000 -modified: 20170328142732658 +modified: 20201228143412000 tags: Learning title: Sharing your tiddlers with others type: text/vnd.tiddlywiki @@ -14,3 +14,4 @@ There are a number of ways that you can share [[tiddlers|Tiddlers]] or your whol * You can [[share a Dropbox link to your TiddlyWiki|Sharing a TiddlyWiki on Dropbox]] * You can [[export tiddlers|How to export tiddlers]] (<<.icon $:/core/images/export-button>>) in a variety of formats including text, static HTML and comma separated values (ie spreadsheet compatible) *You can also share tiddlers merely by making your ~TiddlyWiki accessible to others, for example by publishing it online, so that they can [[import tiddlers|Importing Tiddlers]] from it +* There is an experimental [[sharing plugin|Share Plugin]] that you can use to share tiddlers via the URL location hash. From 03626bc14248b7bde5c89be1c546f008e74d1538 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Sun, 3 Jan 2021 03:50:14 -0800 Subject: [PATCH 1173/2376] always test ext in tiddler title and remove it (#5329) * always test ext in tiddler title and remove it * patch custom ext length vulernability --- core/modules/utils/filesystem.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index c530b095d..9d05f7a8d 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -342,10 +342,6 @@ exports.generateTiddlerFilepath = function(title,options) { filepath = originalpath.substring(0,originalpath.length - ext.length); } else if(!filepath) { filepath = title; - // If the filepath already ends in the extension then remove it - if(filepath.substring(filepath.length - extension.length) === extension) { - filepath = filepath.substring(0,filepath.length - extension.length); - } // Remove any forward or backward slashes so we don't create directories filepath = filepath.replace(/\/|\\/g,"_"); } @@ -354,12 +350,20 @@ exports.generateTiddlerFilepath = function(title,options) { // Don't let the filename start with any dots because such files are invisible on *nix filepath = filepath.replace(/^\.+/g,"_"); } + // If the filepath already ends in the extension then remove it + if(filepath.substring(filepath.length - extension.length) === extension) { + filepath = filepath.substring(0,filepath.length - extension.length); + } // Remove any characters that can't be used in cross-platform filenames filepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\:|\"|\||\?|\*|\^/g,"_")); // Truncate the filename if it is too long if(filepath.length > 200) { filepath = filepath.substr(0,200); } + // Truncate the extension if it is too long + if(extension.length > 32) { + extension = extension.substr(0,32); + } // If the resulting filename is blank (eg because the title is just punctuation characters) if(!filepath) { // ...then just use the character codes of the title From bbe94f3544a082dfd40272becb4cc94b8742ff82 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Sun, 3 Jan 2021 03:50:39 -0800 Subject: [PATCH 1174/2376] Cleaned up Customising Tiddler File Naming docs (#5320) * cleaned up Customising Tiddler File Naming * revereted to british customis* --- .../Customising Tiddler File Naming.tid | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid b/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid index 3aef1351f..ce2305604 100644 --- a/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid +++ b/editions/tw5.com/tiddlers/nodejs/Customising Tiddler File Naming.tid @@ -1,22 +1,22 @@ created: 20160424181300000 -modified: 20201201000000000 +modified: 20201226021719220 tags: [[TiddlyWiki on Node.js]] title: Customising Tiddler File Naming type: text/vnd.tiddlywiki -By default, a [[TiddlyWiki on Node.js]] instance using a [[wiki folder|TiddlyWikiFolders]] will create new tiddler files by using the sanitised and disambiguated title as filename and write them to the wiki folder's `tiddlers/` directory. This can be overridden by mapping a path in the wiki's tiddlywiki.info file, using a `default-tiddler-location` property in the `config` object. All filepath operations are relative to this `$tw.boot.wikiTiddlersPath` internal javacript variable. +By default, a [[TiddlyWiki on Node.js]] instance using a [[wiki folder|TiddlyWikiFolders]] will create new tiddler files by using the sanitised and disambiguated title as filename. All filepath operations are relative to a `default-tiddler-location` which defaults to the wiki folder's `tiddlers/` directory. This can be overridden by mapping a path in the wiki's tiddlywiki.info file, by using a `default-tiddler-location` property in the `config` object. -The default file extension of `.tid` is used for tiddlers that are missing the `type` field, or for tiddlers of type "text/vnd.tiddlywiki". Tidders of other types are saved according to their IMIE types (defined at boot startup). Both the logical path (directory and file name) and the file extension can be customized independently by creating optional tiddlers: [[$:/config/FileSystemPaths]] and [[$:/config/FileSystemExtensions]]. +The default file extension of `.tid` is used for tiddlers that are missing the `type` field, or for tiddlers of type "text/vnd.tiddlywiki". Tidders of other types are saved according to their IMIE types (defined at boot startup). + +Both the logical path (directory and file name) and the file extension can be customised independently by creating optional tiddlers [[$:/config/FileSystemPaths]] and [[$:/config/FileSystemExtensions]]. ! File System Paths -The logical path can be customised by creating a tiddler [[$:/config/FileSystemPaths]] containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Newly created tiddlers are matched to each filter in turn, and the first output of the first filter to produce any output is taken as a logical path to be used for the tiddler file. Tiddlers are also tested against the [[$:/config/FileSystemPaths]] on every save to disk, and if the logical path has changed a new file is created and the old file deleted. +The logical path can be customised by creating a [[$:/config/FileSystemPaths]] tiddler containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Every time a tiddler is saved to disk it is tested against each filter in turn, and the first output of the first filter to produce any output is taken as a logical path to be used for the tiddler file. If the logical path has changed a new file is created and the old file is deleted. -Tiddlers are limited to being written to the [[wiki folder|TiddlyWikiFolders]]. Any error saving a tiddler to disk, with a logical path that does not start with the wiki folder's path the most common error, causes the filepath to be encoded via Javascript's `encodeURIComponent()` method and the tiddler is saved as this file in the wiki folder's `$tw.boot.wikiTiddlersPath` directory. +Tiddlers are limited to being written to the [[wiki folder|TiddlyWikiFolders]], the path defined in the `default-tiddler-location` setting, or the specific path saved in the $:/config/OriginalTiddlerPaths tiddler (see [[tiddlywiki.files Files]]). Any error saving a tiddler to disk, with a logical path that does not start with the wiki folder's path the most common error, causes the filepath to be encoded via Javascript's `encodeURIComponent()` method and the tiddler is saved as this file in the wiki folder's `default-tiddler-location`. -Logical paths do not include the file-on-disk's extension (see below), and they can use `/` or `\` as directory separator (when generating the physical path, this is replaced by the correct separator for the platform ~TiddlyWiki is running on). If none of the filters matches, the logical path is simply the title with all occurences of `/` replaced by `_` (for backwards compatibility). - -In both cases, the characters `<>~:"\|?*^` are replaced by `_` in order to guarantee that the resulting path is legal on all supported platforms. +Logical paths do not include the file-on-disk's extension (see below), and they can use `/` or `\` as directory separator (when generating the physical path, this is replaced by the correct separator for the platform ~TiddlyWiki is running on). If none of the filters match, the logical path is simply the title with all occurrences of the characters `/\<>~:"|?*^` replaced by `_` in order to guarantee that the resulting path is legal on all supported platforms. Logical paths are also limited to 200 characters. If a file with this name already exits, a space and a number will be appended to the final filepath, and with the number incremented until an un-used path is found. !! Example @@ -27,17 +27,21 @@ In both cases, the characters `<>~:"\|?*^` are replaced by `_` in order to guara [!tag[externalnote]addprefix[wiki/]] ``` -This will store newly created system tiddlers that are not drafts of other tiddlers in `tiddlers/_system` (after stripping the `$:/` prefix). Next, all drafts have the path seperator characters in their titles replaced by "_" and are stored in `tiddlers/drafts/`. Then tiddlers tagged [[task]] are stored in a subdirectory `tiddlers/mytasks/`. Finally, all tidders not tagged with "externalnote" will match the final `[!tag[externalnote]addprefix[wiki/]]` storing these in `/wiki/`. In this example, tiddlers tagged with "externalnote" have been imported using [[tiddlywiki.files Files|tiddlywiki.files_Files]] with an "isEditableFile" flag set to true, causing the server to remember their original file path. +<<.note "All paths are relative to the wiki's `default-tiddler-location`.">> -Whenever a tiddler generates a $:/config/FileSystemPaths filter match, any `/` or `\` in the tiddler title is mapped to a path separator. With the above filters, the non-system, non-draft tiddler `some/thing/entirely/new` (with no tags) will be saved to `<wikiFolder>/tiddlers/wiki/some/thing/entirely/new.tid` (ie, the file `new.tid` in a directory called `entirely/`). Thus, $:/config/FileSystemPaths itself will end up in `tiddlers/_system/config/FileSystemPaths.tid` or `tiddlers\_system\config\FileSystemPaths.tid`, depending on the platform. +This will store newly created system tiddlers that are not drafts of other tiddlers in `./_system/` (after stripping the `$:/` prefix). Next, all drafts have the path seperator characters in their titles replaced by "_" and are stored in `./drafts/`. Then tiddlers tagged [[task]] are stored in a subdirectory `./mytasks/`. Finally, all tidders not tagged with "externalnote" will match the final `[!tag[externalnote]addprefix[wiki/]]` storing these in `./wiki/`. In this example, tiddlers tagged with "externalnote" have been imported using [[tiddlywiki.files Files]] with an "isEditableFile" flag set to true, causing the server to remember their original file path in the $:/config/OriginalTiddlerPaths tiddler. + +Whenever a tiddler generates a $:/config/FileSystemPaths filter match, any `/` or `\` in the tiddler title is mapped to a path separator. With the above filters, the non-system, non-draft tiddler titled `some/thing/entirely/new` (with no tags) will be saved to `./wiki/some/thing/entirely/new.tid` (ie, the file `new.tid` in a directory called `entirely/`). Thus, $:/config/FileSystemPaths itself will end up in `./_system/config/FileSystemPaths.tid` or `.\_system\config\FileSystemPaths.tid`, depending on the platform. ! File System Extensions -Normally, the file system extension of a tiddler on disk is determined by the existance of bad fields (multi-line fields other than the text field, fields that can be trimmed of spaces from the fron or back, etc), in which case the single-file ".json" tiddler-file format is used. If the tiddler does not have bad fields, then the `type` field is referenced to find a matching file-type. Tiddlywiki's boot engine defines a set of these tiddler-type to file-type relationships in the [[$:/boot/boot.js]] tiddler. Search for `// Add file extension information` to find the section of code that defines these relationships. +Normally, the file system extension of a tiddler on disk is determined by the existence of bad fields (multi-line fields other than the text field, fields that can be trimmed of spaces from the fron or back, etc), in which case the single-file ".json" tiddler-file format is used. -The file extension of individual tidders can be customised by creating a tiddler [[$:/config/FileSystemExtensions]] containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Newly created tiddlers are matched to each filter in turn, and the first output of the first filter to produce any output is taken as the file extension to be used for the tiddler file. Extensions should always start with a leading dot (see example). Tiddlers are also tested against the $:/config/FileSystemExtensions on every save to disk, and if the extension has changed a new file is created and the old file deleted. If no filter matches, the default extension is used. +If the tiddler does not have bad fields, then the `type` field is referenced to find a matching file-type, with `.tid` used for tiddlers wihtout a type value. The boot engine defines a set of these tiddler-type to file-type relationships in the [[$:/boot/boot.js]] tiddler. Search for `// Add file extension information` to find the section of code that defines these relationships. -Two special cases should be noted: Result of ".tid" will force the tiddler to be written to disk as a single-file text tiddler. A result of ".json" will force the tiddler to be written to disk as a single-file tiddler in json-format (a single tiddler fields object in an array), NOT as a tiddler of type "application/json". All other recognized file-types will be saved using their defined extention along with an acompanying *.meta file of the same name which describes all fields but the "text" field. +The file extension of individual tidders can be customised by creating a tiddler [[$:/config/FileSystemExtensions]] containing one or more [[filter expressions|Filter Syntax]], each on a line of its own. Every time a tiddler is saved to disk it is tested against these filters, and the first output of the first filter to produce any output is taken as the file extension to be used for the tiddler file. Extensions should always start with a leading dot (see example). If no filter matches, the default extension is used. If the extension has changed a new file is created and the old file is deleted. + +<<.note """A result of ".tid" will force the tiddler to be written to disk as a single-file text tiddler. A result of ".json" will force the tiddler to be written to disk as a single-file tiddler in json-format (a single tiddler fields object in an array), NOT as a tiddler of type "application/json". All other recognized file-types will be saved using their defined extention along with an acompanying *.meta file of the same name which describes all fields but the "text" field.""">> !! Example From ac40ee42461a30a69f8842c91751b3e6ba0f2c61 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sun, 3 Jan 2021 12:51:30 +0100 Subject: [PATCH 1175/2376] Fix #5318 - remove-tag-button not having the correct fill color (#5326) --- core/ui/EditTemplate/tags.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index c5134db3d..0dd0dd774 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -16,7 +16,7 @@ color:$(foregroundColor)$; <$vars foregroundColor=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">> backgroundColor="""$colour$"""> <span style=<<tag-styles>> class="tc-tag-label tc-tag-list-item"> <$transclude tiddler="""$icon$"""/><$view field="title" format="text" /> -<$button class="tc-btn-invisible tc-remove-tag-button"><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="-[{!!title}]"/>{{$:/core/images/close-button}}</$button> +<$button class="tc-btn-invisible tc-remove-tag-button" style=<<tag-styles>>><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="-[{!!title}]"/>{{$:/core/images/close-button}}</$button> </span> </$vars> \end From 4fe411be8081bf290eebe0a39a62e0a091359485 Mon Sep 17 00:00:00 2001 From: maki lam <maki@makiaea.com> Date: Sun, 3 Jan 2021 11:52:30 +0000 Subject: [PATCH 1176/2376] Signing the CLA (#5327) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 1393039b9..b4f542d51 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -422,6 +422,8 @@ Ryan Kramer, @default-kramer, 2020/10/24 Miha Lunar, @SmilyOrg, 2020/11/04 +Maki Lam, @makiaea, 2020/12/27 + Chris Nicoll, @clutterstack, 2020/12/28 Odin Jorna, @OdinJorna, 2020/12/31 From 6f62c4fc7f93a3f5aa2a936162542d7a6840c681 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Sun, 3 Jan 2021 20:29:17 +0100 Subject: [PATCH 1177/2376] Add missing tags (#5360) --- .../tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid | 2 +- .../resources/_file-backups_ Extension Firefox by pmario.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid b/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid index dbe7d6928..2edb2afc9 100644 --- a/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid +++ b/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid @@ -1,6 +1,6 @@ created: 201704191641 modified: 20210101191843666 -tags: [[Other Resources]] +tags: [[Other Resources]] [[Community Plugins]] [[Community Editions]] title: "Wikilabs" by PMario type: text/vnd.tiddlywiki url: https://wikilabs.github.io diff --git a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid index b3352b675..bbcd579d6 100644 --- a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid +++ b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid @@ -6,7 +6,7 @@ delivery: Browser Extension description: Browser extension for Firefox method: save modified: 20210101170932934 -tags: Firefox Saving [[Other Resources]] plugins +tags: Firefox Saving [[Other Resources]] plugins Windows Linux Mac title: "file-backups" Extension for Firefox by pmario type: text/vnd.tiddlywiki url: https://github.com/pmario/file-backups From be70e5851d284ecaced61b8d8fab70f3c7c866dd Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Mon, 4 Jan 2021 03:38:50 -0500 Subject: [PATCH 1178/2376] Taking advantage of linkedLists in all operator (#5362) * Taking advantage of linkedLists in all operator * Test to confirm [all[]] with LinkList is the same --- core/modules/filters/all.js | 6 +++--- editions/test/tiddlers/tests/test-filters.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/modules/filters/all.js b/core/modules/filters/all.js index da9e949dc..853fe0a7f 100644 --- a/core/modules/filters/all.js +++ b/core/modules/filters/all.js @@ -31,7 +31,7 @@ exports.all = function(source,operator,options) { // Get our suboperators var allFilterOperators = getAllFilterOperators(); // Cycle through the suboperators accumulating their results - var results = [], + var results = new $tw.utils.LinkedList(), subops = operator.operand.split("+"); // Check for common optimisations if(subops.length === 1 && subops[0] === "") { @@ -49,10 +49,10 @@ exports.all = function(source,operator,options) { for(var t=0; t<subops.length; t++) { var subop = allFilterOperators[subops[t]]; if(subop) { - $tw.utils.pushTop(results,subop(source,operator.prefix,options)); + results.pushTop(subop(source,operator.prefix,options)); } } - return results; + return results.toArray(); }; })(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 4a9e9f950..0dbb9723b 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -306,6 +306,7 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[all[shadows+tiddlers]]").join(",")).toBe("$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8,$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test"); expect(wiki.filterTiddlers("[all[tiddlers+shadows]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one,hasList,has filter,filter regexp test,$:/TiddlerFive,TiddlerSix,TiddlerSeventh,Tiddler8"); expect(wiki.filterTiddlers("[all[tiddlers]tag[two]]").join(",")).toBe("$:/TiddlerTwo,Tiddler Three"); + expect(wiki.filterTiddlers("[all[orphans+tiddlers+tags]]").join(",")).toBe("$:/ShadowPlugin,TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,hasList,has filter,filter regexp test,two,one"); }); it("should handle the tags operator", function() { From 6edcbfd0cd0fe4ba20a778eab26e4364d3b6aa2e Mon Sep 17 00:00:00 2001 From: Chris Nicoll <clutterstack@users.noreply.github.com> Date: Mon, 4 Jan 2021 03:39:14 -0500 Subject: [PATCH 1179/2376] Fix typos and Refnotes URL in kookma resources (#5365) Co-authored-by: clutterstack <clutterstack@gmail.com> --- .../community/plugins/Favorites by Mohammad.tid | 4 ++-- .../plugins/Kookma Plugin Library by Mohammad.tid | 4 ++-- .../community/plugins/Refnotes by Mohammad.tid | 10 +++++----- .../community/plugins/Searchwikis by Mohammad.tid | 6 +++--- .../tiddlers/community/plugins/Shiraz by Mohammad.tid | 6 +++--- .../tiddlers/community/plugins/Slider by Mohammad.tid | 4 ++-- .../plugins/Tiddler Commander by Mohammad.tid | 4 ++-- .../community/plugins/Tiddlyshow by Mohammad.tid | 4 ++-- .../community/plugins/Timelines by Mohammad.tid | 4 ++-- .../community/plugins/Todolist by Mohammad.tid | 4 ++-- .../community/plugins/Trashbin by Mohammad.tid | 4 ++-- .../tiddlers/community/plugins/Utility by Mohammad.tid | 4 ++-- 12 files changed, 29 insertions(+), 29 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/plugins/Favorites by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Favorites by Mohammad.tid index 625e1e71d..4c3cc12e9 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Favorites by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Favorites by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117155737569 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201117155943559 +tags: [[Community Plugins]] title: Favorites by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Favorites/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Kookma Plugin Library by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Kookma Plugin Library by Mohammad.tid index f6a5aa1c3..761f1051c 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Kookma Plugin Library by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Kookma Plugin Library by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160603290 -modified: 20210101201435693 -tags: [[Community Plugins]] Plugings +modified: 20201117160819308 +tags: [[Community Plugins]] title: Kookma Plugin Library by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-PluginLibrary/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Refnotes by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Refnotes by Mohammad.tid index 600a2ccbc..b8c1c230c 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Refnotes by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Refnotes by Mohammad.tid @@ -1,11 +1,11 @@ created: 20201117161853918 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201117162122822 +tags: [[Community Plugins]] title: Refnotes by Mohammad type: text/vnd.tiddlywiki -url: https://kookma.github.io/Refnotes/ +url: https://kookma.github.io/TW-Refnotes/ -Refnotes plugin is a set of macros and stylesheets for creating abbreviations, footnotes and citations. It also makes tables of footnotes, abbreviations (glossaery) and references (bibliography table). +Refnotes plugin is a set of macros and stylesheets for creating abbreviations, footnotes and citations. It also makes tables of footnotes, abbreviations (glossary) and references (bibliography table). {{!!url}} @@ -18,5 +18,5 @@ Refnotes contains codes and elements to ;Create tables of :Abbreviations or glossary -:Footnotes and endnote +:Footnotes and endnotes :References (bibliography) using different output style \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/plugins/Searchwikis by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Searchwikis by Mohammad.tid index 0178808a3..77c4750d2 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Searchwikis by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Searchwikis by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160302426 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201117160443306 +tags: [[Community Plugins]] title: Searchwikis by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Searchwikis/ @@ -15,7 +15,7 @@ It has two parts # An indexer, to build an index of all tiddlers in an external wiki # A search tool to search indexes and display a link to a tiddler found in an external wiki -Then one master wiki can hosts many index tiddlers and lets to search several external wikis through index tiddlers. +Then one master wiki can host many index tiddlers and lets to search several external wikis through index tiddlers. Searchwikis enable to have a central wiki and search all other wikis from one place. diff --git a/editions/tw5.com/tiddlers/community/plugins/Shiraz by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Shiraz by Mohammad.tid index 2988e26e9..a8691284d 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Shiraz by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Shiraz by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201116204317018 -modified: 20210101201435693 -tags: [[Community Plugins]] Plugings +modified: 20201116210618803 +tags: [[Community Plugins]] title: Shiraz by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Shiraz/ @@ -29,4 +29,4 @@ Some of Shiraz features are: * Stylish buttons -Adding Shiraz plugin to any Tiddlywiki, convert it to a full production tool. Shiraz uses modified CSS classes from [[Bootstrap|https://getbootstrap.com/]]. \ No newline at end of file +Adding Shiraz plugin to any Tiddlywiki converts it to a full production tool. Shiraz uses modified CSS classes from [[Bootstrap|https://getbootstrap.com/]]. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/plugins/Slider by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Slider by Mohammad.tid index 4216c9879..842bc3e97 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Slider by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Slider by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117162655614 -modified: 20210101201435693 -tags: [[Community Plugins]] Plugings +modified: 20201117162926714 +tags: [[Community Plugins]] title: Slider by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/slider/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Tiddler Commander by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Tiddler Commander by Mohammad.tid index 663801f8f..67dbd1490 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Tiddler Commander by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Tiddler Commander by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201116203717105 -modified: 20210101201435693 -tags: [[Community Plugins]] Plugings +modified: 20201116204652385 +tags: [[Community Plugins]] title: Tiddler Commander by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Commander/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Tiddlyshow by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Tiddlyshow by Mohammad.tid index 7d7e7351f..a9e588a4b 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Tiddlyshow by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Tiddlyshow by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160944367 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201117162735263 +tags: [[Community Plugins]] title: Tiddlyshow by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/Tiddlyshow/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Timelines by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Timelines by Mohammad.tid index 40ab9e968..79eb879bb 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Timelines by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Timelines by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117161434779 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201117161728094 +tags: [[Community Plugins]] title: Timelines by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Timelines/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Todolist by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Todolist by Mohammad.tid index 2fc99a39e..5d9d9646b 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Todolist by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Todolist by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201116210711381 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201116212041642 +tags: [[Community Plugins]] title: Todolist by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Todolist/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Trashbin by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Trashbin by Mohammad.tid index 65f0ed91a..57979b811 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Trashbin by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Trashbin by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117155328920 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201117155604253 +tags: [[Community Plugins]] title: Trashbin by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Trashbin/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Utility by Mohammad.tid b/editions/tw5.com/tiddlers/community/plugins/Utility by Mohammad.tid index a4e7c479d..4b400d0b7 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Utility by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Utility by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117160011169 -modified: 20210101191843666 -tags: [[Community Plugins]] Plugings +modified: 20201117160235750 +tags: [[Community Plugins]] title: Utility by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW-Utility/ From 58010e089f791bfedc11d64e88360c3ae4dff833 Mon Sep 17 00:00:00 2001 From: CodaCoder <CodaCodr@users.noreply.github.com> Date: Mon, 4 Jan 2021 02:39:41 -0600 Subject: [PATCH 1180/2376] Signed CLA (#5363) --- licenses/cla-individual.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index b4f542d51..2f0fc19d2 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -431,3 +431,6 @@ Odin Jorna, @OdinJorna, 2020/12/31 Joe Bordes, @joebordes, 2021/01/02 Glenn Dixon, @dixonge, 2021/01/03 + +Russ Thomas, @codacodr, 2021/01/03 + From d5175e4fdc4a669e1e4e3e44d9108ed28b05971d Mon Sep 17 00:00:00 2001 From: CodaCoder <CodaCodr@users.noreply.github.com> Date: Mon, 4 Jan 2021 02:40:35 -0600 Subject: [PATCH 1181/2376] Update EventCatcherWidget.tid (#5335) * Update EventCatcherWidget.tid Changed "JavaScript events" to "DOM-initiated Javascript events". Removed the quotes from `"event"`. Tightened up some of the language. * Update EventCatcherWidget.tid Edited/reworded as per discussion(s). --- .../tiddlers/widgets/EventCatcherWidget.tid | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid index 9a4b498c5..4dfd810aa 100644 --- a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid @@ -7,27 +7,29 @@ type: text/vnd.tiddlywiki ! Introduction <<.from-version "5.1.23">> -The event catcher widget traps JavaScript events dispatched within its child content, and allows invoking a series of ActionWidgets in response to the events. + +//This is an advanced widget intended for use by those familiar with HTML, CSS and JavaScript handling of DOM events.// + +The event catcher widget traps DOM-initiated Javascript events dispatched within its child content, and allows invoking a series of ActionWidgets in response to those events. In order for the events to be trapped they must: -* be of one of the types specified as a parameter to the event catcher widget. -* arise within a DOM node matching the selector specified as a parameter to the widget. +* be of one of the events specified in the event catcher widget's `events` attribute. +* arise within a DOM node specified by the widget's `selector` attribute. +* support event bubbling. -Use of the event catcher widget is beneficial when using large numbers of other trigger widgets such as the ButtonWidget is causing performance problems. The workflow it enables is akin to what is referred to as "event delegation" in JavaScript parlance. - -//This is an advanced widget intended to be used by those familiar with HTML, CSS and JavaScript.// +Use of the event catcher widget is beneficial when using large numbers of other trigger widgets such as the ButtonWidget is causing performance problems. The workflow it enables is akin to what is referred to as "event delegation" in JavaScript parlance. ! Content and Attributes The content of the `<$eventcatcher>` widget is displayed normally. |!Attribute |!Description | -|events |Space separated list of JavaScript events to be trapped, for example "click" or "click dblclick" | +|events |Space separated list of JavaScript events to be trapped, for example "click" or "click dblclick". | |selector |A CSS selector. Only events originating inside a DOM node with this selector will be trapped. | -|actions-* |Action strings to be invoked when a matching event is trapped. Each event is mapped to an action attribute name of the form `actions-"event"` where `event` represents the type of the event. For example: `actions-click` or `actions-dblclick` | -|class |An optional CSS class name to be assigned to the HTML element | -|tag |Optional. The html element the widget creates to capture the events, defaults to:<br>» `span` when parsed in inline-mode<br>» `div` when parsed in block-mode | +|actions-* |Action strings to be invoked when a matching event is trapped. Each event is mapped to an action attribute name of the form <code>actions-<em>event</em></code> where <code><em>event</em></code> represents the type of the event. For example: `actions-click` or `actions-dblclick` | +|tag |Optional. The HTML element the widget creates to capture the events, defaults to:<br>» `span` when parsed in inline-mode<br>» `div` when parsed in block-mode | +|class |Optional. A CSS class name (or names) to be assigned to the widget HTML element. | ! Variables From 6a98106679a689470fef10fad8d3c74f48c5abd2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 4 Jan 2021 09:15:28 +0000 Subject: [PATCH 1182/2376] Update styles docs Fixes #1691 --- editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid b/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid index 2a8429c2b..3af3742db 100644 --- a/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid +++ b/editions/tw5.com/tiddlers/howtos/Using Stylesheets.tid @@ -1,5 +1,5 @@ created: 20140305091244145 -modified: 201804111739 +modified: 20210104090402829 tags: [[Customise TiddlyWiki]] title: Using Stylesheets type: text/vnd.tiddlywiki @@ -30,6 +30,8 @@ body.tc-body { } ``` +You can then use your own [[styles and classes in WikiText|Styles and Classes in WikiText]]. + !! Additional Resrouces * [[Cascading Style Sheets (CSS) at mozilla|https://developer.mozilla.org/en-US/docs/Web/CSS]] From 5832002feb2b662d65a8d0a38c1c81a390e03317 Mon Sep 17 00:00:00 2001 From: donmor <donmor3000@hotmail.com> Date: Mon, 4 Jan 2021 19:05:41 +0800 Subject: [PATCH 1183/2376] Docs: Create Japanese (Japan) Edition.tid (#5324) Added the Japanese version tiddler since the Japanese version of empty.html exists --- .../tiddlers/languages/Japanese (Japan) Edition.tid | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 editions/tw5.com/tiddlers/languages/Japanese (Japan) Edition.tid diff --git a/editions/tw5.com/tiddlers/languages/Japanese (Japan) Edition.tid b/editions/tw5.com/tiddlers/languages/Japanese (Japan) Edition.tid new file mode 100644 index 000000000..ba9cabded --- /dev/null +++ b/editions/tw5.com/tiddlers/languages/Japanese (Japan) Edition.tid @@ -0,0 +1,11 @@ +caption: 日本語 (日本国) +created: 20201227004927059 +modified: 20201227010050287 +tags: Languages +title: Japanese (Japan) Edition +type: text/vnd.tiddlywiki + +TiddlyWikiの日本語バージョンはこちら: + +<!--* ''ドキュメント'' : https://tiddlywiki.com/languages/ja-JP/index.html--> +* ''空白のコピー'' : https://tiddlywiki.com/languages/ja-JP/empty.html From 87b9dbcda139f9b0b81b846b4594c58f585f5e81 Mon Sep 17 00:00:00 2001 From: Mohammad Rahmani <830394+kookma@users.noreply.github.com> Date: Tue, 5 Jan 2021 21:05:26 +0330 Subject: [PATCH 1184/2376] Remove extra dashes in page title (#5370) When Tiddlywiki has no subtitle you see extra dashes! --- core/wiki/title.tid | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/wiki/title.tid b/core/wiki/title.tid index 6db4cdca1..d1f36adf2 100644 --- a/core/wiki/title.tid +++ b/core/wiki/title.tid @@ -1,3 +1,6 @@ title: $:/core/wiki/title -{{$:/SiteTitle}} --- {{$:/SiteSubtitle}} \ No newline at end of file +{{$:/SiteTitle}} +<$list filter="[{$:/SiteSubtitle}trim[]minlength[1]]" variable="ignore"> +--- {{$:/SiteSubtitle}} +</$list> \ No newline at end of file From e280f89ca5dc78ba384a3a1108c88bd1ff31f25c Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Tue, 5 Jan 2021 12:36:18 -0500 Subject: [PATCH 1185/2376] Converting [links[]] to use better LinkedList (#5369) --- core/modules/filters/links.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/modules/filters/links.js b/core/modules/filters/links.js index ca969b6da..e1a859bc1 100644 --- a/core/modules/filters/links.js +++ b/core/modules/filters/links.js @@ -16,11 +16,11 @@ Filter operator for returning all the links from a tiddler Export our filter function */ exports.links = function(source,operator,options) { - var results = []; + var results = new $tw.utils.LinkedList(); source(function(tiddler,title) { - $tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title)); + results.pushTop(options.wiki.getTiddlerLinks(title)); }); - return results; + return results.toArray(); }; })(); From eadbd62e6d694fc25fc6fa94a2632cc51d874bb4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 6 Jan 2021 15:12:05 +0000 Subject: [PATCH 1186/2376] Fix "modified" dates for tiddlers modified in #5353 --- editions/tw5.com/tiddlers/community/Community.tid | 2 +- ...-A Task and Project Management Wiki_ by David_Szego.tid | 2 +- .../community/editions/_Noteself_ by Danielo Rodriguez.tid | 2 +- .../examples/_Lucky Sushi_ online shop by sini-Kit.tid | 4 ++-- .../community/plugins/Ace Editor Plugin by Joerg Plewe.tid | 2 +- editions/tw5.com/tiddlers/community/plugins/BJHacks.tid | 2 +- .../community/plugins/Disqus comments plugin by bimlas.tid | 2 +- .../community/plugins/Encrypt single tiddler plugin.tid | 2 +- .../tiddlers/community/plugins/Eucalys Tiddly World.tid | 7 ++++--- .../plugins/Full Text Search Plugin by Rob Hoelz.tid | 2 +- editions/tw5.com/tiddlers/community/plugins/GSD5.tid | 4 ++-- .../plugins/IndexedDB Plugin by Andreas Abeck.tid | 2 +- .../plugins/Json Mangler plugin by Joshua Fontany.tid | 3 ++- .../community/plugins/Kin filter operator by bimlas.tid | 2 +- .../plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid | 2 +- .../community/plugins/Locator plugin by bimlas.tid | 2 +- .../community/plugins/MathJax Plugin by Martin Kantor.tid | 2 +- .../tiddlers/community/plugins/Plugins by TheDiveO.tid | 2 +- .../tiddlers/community/plugins/TiddlyClip by buggyjay.tid | 2 +- .../community/plugins/TiddlyMap by Felix Kuppers.tid | 2 +- .../tiddlers/community/plugins/TiddlyWiki for Scholars.tid | 2 +- .../tiddlers/community/plugins/Tinka by Andreas Hahn.tid | 2 +- .../community/plugins/_JD Mobile Layout plugin_ by JD.tid | 2 +- .../tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid | 2 +- .../community/plugins/_SK_Plugins_ by Stephen Kimmel.tid | 2 +- .../community/plugins/_Slides and Stories_ by Jan.tid | 2 +- .../plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid | 2 +- .../plugins/_Tekan_ Kanban that stays with you_ by Riz.tid | 2 +- .../community/plugins/datepicker based on Pikaday.tid | 2 +- .../community/plugins/rboue's plugins for TiddlyWiki.tid | 2 +- .../tw5.com/tiddlers/community/plugins/vis.js Timeline.tid | 2 +- .../tw5.com/tiddlers/community/resources/BrainTest.tid | 2 +- .../Code styles and auto format settings for IDEs.tid | 2 +- .../tiddlers/community/resources/CouchDB Adaptor.tid | 2 +- .../community/resources/Filter Examples by Tobias Beer.tid | 2 +- ...nt Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid | 2 +- .../resources/Gospel_Bubbles_by_Rev_David_Gifford.tid | 2 +- editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid | 4 ++-- .../resources/Hosting TiddlyWiki5 on GoogleDrive.tid | 3 ++- .../resources/RegExp in Tiddlywiki by Mohammad.tid | 4 ++-- .../community/resources/SeeAlso by Matias Goldman.tid | 2 +- .../community/resources/Semantic Colors by Mohammad.tid | 2 +- .../resources/TB5 a pocket full of tips by Tobias Beer.tid | 2 +- .../community/resources/TW-Scripts by Mohammad.tid | 2 +- .../tw5.com/tiddlers/community/resources/TW5 Magick.tid | 2 +- .../resources/TW5-SingleExecutable_by_Jed_Carty.tid | 2 +- .../tiddlers/community/resources/TWCommunitySearch.tid | 2 +- .../community/resources/TiddlyChrome by Arlen Beiler.tid | 2 +- ...iddlyDrive Add-on for Google Drive by Joshua Stubbs.tid | 2 +- .../community/resources/TiddlyServer by Arlen Beiler.tid | 2 +- .../tiddlers/community/resources/TiddlyWiki Notes.tid | 2 +- .../tiddlers/community/resources/TiddlyWiki Posts.tid | 2 +- .../TiddlyWiki Video Tutorials by Francis Meetze.tid | 4 ++-- ...iddlyWiki extensions for Sublime Text 3 by roma0104.tid | 2 +- .../community/resources/TiddlyWiki extensions for ViM.tid | 2 +- .../tiddlers/community/resources/TiddlyWiki guide FR.tid | 2 +- .../tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid | 2 +- .../community/resources/TiddlyWiki5 Playground.tid | 2 +- .../resources/TiddlyWiki5 Squared by Iannis Zannos.tid | 2 +- .../Twexe_ Single File Tiddlywiki5 executable.tid | 2 +- .../tiddlers/community/resources/Widdly by Opennota.tid | 2 +- .../tiddlers/community/resources/Wikilabs by PMario.tid | 4 ++-- .../tw5.com/tiddlers/community/resources/Wills QnD gTD.tid | 2 +- .../community/resources/_ATWiki_ by Lamusia Project.tid | 2 +- .../community/resources/_Dropboard_ by Reid Gould.tid | 2 +- .../community/resources/_Dynamic Tables_ by Jed Carty.tid | 2 +- .../community/resources/_Hacks_ by Thomas Elmiger.tid | 3 ++- .../community/resources/_In My Socks_ by Jed Carty.tid | 2 +- .../community/resources/_MathCell_ by Ste Wilson.tid | 3 ++- .../community/resources/_TWeb.at_ by Mario Pietsch.tid | 2 +- .../community/resources/_TiddlyServer_ by Matt Lauber.tid | 3 ++- .../_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid | 2 +- .../resources/_TiddlyWiki Toolmap_ by David Gifford.tid | 2 +- .../resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid | 2 +- .../resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid | 2 +- .../resources/_Timimi_ Extension and executable by Riz.tid | 2 +- .../resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid | 2 +- .../_file-backups_ Extension Firefox by pmario.tid | 2 +- .../community/resources/_muritest_ by Simon Huber.tid | 2 +- ...iddlers_ Extension for Chrome and Firefox by buggyj.tid | 2 +- .../community/resources/twproxy by Steve Gattuso.tid | 2 +- .../themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid | 2 +- .../themes/_Moments-A little color won't hurt_ by Riz.tid | 2 +- .../tutorials/GitHub Saver Tutorial by Mohammad.tid | 4 ++-- 84 files changed, 99 insertions(+), 93 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/Community.tid b/editions/tw5.com/tiddlers/community/Community.tid index ccbb6afb8..86b158cb7 100644 --- a/editions/tw5.com/tiddlers/community/Community.tid +++ b/editions/tw5.com/tiddlers/community/Community.tid @@ -1,5 +1,5 @@ created: 20130909151600000 -modified: 20210101170443584 +modified: 20210106151027426 tags: TableOfContents title: Community type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/editions/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid b/editions/tw5.com/tiddlers/community/editions/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid index b363c53c8..3a869c061 100644 --- a/editions/tw5.com/tiddlers/community/editions/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid +++ b/editions/tw5.com/tiddlers/community/editions/_Cardo-A Task and Project Management Wiki_ by David_Szego.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101170932934 +modified: 20210106151026996 tags: [[Community Editions]] title: "Cardo - Task and Project Management Wiki" by David Szego type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/editions/_Noteself_ by Danielo Rodriguez.tid b/editions/tw5.com/tiddlers/community/editions/_Noteself_ by Danielo Rodriguez.tid index 1c5cf5b2a..276785b58 100644 --- a/editions/tw5.com/tiddlers/community/editions/_Noteself_ by Danielo Rodriguez.tid +++ b/editions/tw5.com/tiddlers/community/editions/_Noteself_ by Danielo Rodriguez.tid @@ -5,7 +5,7 @@ created: 20141122093837330 delivery: Web Service description: Free online service that you can also host yourself method: sync -modified: 20210101191843666 +modified: 20210106151027179 tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP [[Other resources]] Safari Saving Windows iOS Edge [[Community Editions]] title: "Noteself" by Danielo Rodríguez type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/examples/_Lucky Sushi_ online shop by sini-Kit.tid b/editions/tw5.com/tiddlers/community/examples/_Lucky Sushi_ online shop by sini-Kit.tid index d036d1f71..aa06aec5a 100644 --- a/editions/tw5.com/tiddlers/community/examples/_Lucky Sushi_ online shop by sini-Kit.tid +++ b/editions/tw5.com/tiddlers/community/examples/_Lucky Sushi_ online shop by sini-Kit.tid @@ -1,5 +1,5 @@ -created: 20141122093837330 -modified: 20210101170932934 +created: 20141122093837330 +modified: 20210106151027143 tags: Examples title: "Lucky Sushi" online shop by sini-Kit type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Ace Editor Plugin by Joerg Plewe.tid b/editions/tw5.com/tiddlers/community/plugins/Ace Editor Plugin by Joerg Plewe.tid index 199d0d8e6..f9c093fe4 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Ace Editor Plugin by Joerg Plewe.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Ace Editor Plugin by Joerg Plewe.tid @@ -1,5 +1,5 @@ created: 20150403110817298 -modified: 20210101191843666 +modified: 20210106151027409 tags: [[Community Plugins]] title: Ace Editor Plugin by Joerg Plewe type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/BJHacks.tid b/editions/tw5.com/tiddlers/community/plugins/BJHacks.tid index 68dd1147b..6c5c585b8 100644 --- a/editions/tw5.com/tiddlers/community/plugins/BJHacks.tid +++ b/editions/tw5.com/tiddlers/community/plugins/BJHacks.tid @@ -1,5 +1,5 @@ created: 20140315085406905 -modified: 20210101191843666 +modified: 20210106151026926 tags: [[Community Plugins]] title: "BJTools" by buggyj type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Disqus comments plugin by bimlas.tid b/editions/tw5.com/tiddlers/community/plugins/Disqus comments plugin by bimlas.tid index ea9c297de..873398fbf 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Disqus comments plugin by bimlas.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Disqus comments plugin by bimlas.tid @@ -1,5 +1,5 @@ created: 20190219201946994 -modified: 20210101191843666 +modified: 20210106151027439 tags: [[Community Plugins]] title: Disqus comments plugin by bimlas type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Encrypt single tiddler plugin.tid b/editions/tw5.com/tiddlers/community/plugins/Encrypt single tiddler plugin.tid index 0f36fc718..7108116a4 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Encrypt single tiddler plugin.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Encrypt single tiddler plugin.tid @@ -1,5 +1,5 @@ created: 20150602084548184 -modified: 20210101191843666 +modified: 20210106151027028 tags: [[Community Plugns]] title: "Encrypt single tiddler plugin" by Danielo Rodriguez type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Eucalys Tiddly World.tid b/editions/tw5.com/tiddlers/community/plugins/Eucalys Tiddly World.tid index b3f25abc1..5b3362633 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Eucalys Tiddly World.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Eucalys Tiddly World.tid @@ -1,7 +1,8 @@ -title: Eucaly's Tiddly World +created: 20140908103900000 +modified: 20210106151027444 tags: [[Community Plugins]] -created: 201409081039 -modified: 20210101191843666 +title: Eucaly's Tiddly World +type: text/vnd.tiddlywiki url: http://eucaly-tw5.tiddlyspot.com/ I collect my tw5 creations on-line as http://eucaly-tw5.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/plugins/Full Text Search Plugin by Rob Hoelz.tid b/editions/tw5.com/tiddlers/community/plugins/Full Text Search Plugin by Rob Hoelz.tid index 728d3f1ad..5cdda4777 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Full Text Search Plugin by Rob Hoelz.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Full Text Search Plugin by Rob Hoelz.tid @@ -1,5 +1,5 @@ created: 20171109171703588 -modified: 20210101191843666 +modified: 20210106151027452 tags: [[Community Plugins]] plugins title: Full Text Search Plugin by Rob Hoelz type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/GSD5.tid b/editions/tw5.com/tiddlers/community/plugins/GSD5.tid index f94adb1b6..6471a41bf 100644 --- a/editions/tw5.com/tiddlers/community/plugins/GSD5.tid +++ b/editions/tw5.com/tiddlers/community/plugins/GSD5.tid @@ -1,9 +1,9 @@ +created: 20141230182901899 +modified: 20210106151027090 tags: [[Community Editions]] [[Community Plugins]] title: "GSD5" by Roma Hicks type: text/vnd.tiddlywiki url: http://gsd5.tiddlyspot.com/ -created: 20141230182901899 -modified: 20210101191843666 An adaptation of the [[TiddlyWiki powered GTD® system formerly known as MonkeyGTD|http://mgsd.tiddlyspot.com/]] for TiddlyWiki version 5. diff --git a/editions/tw5.com/tiddlers/community/plugins/IndexedDB Plugin by Andreas Abeck.tid b/editions/tw5.com/tiddlers/community/plugins/IndexedDB Plugin by Andreas Abeck.tid index b6d6eb2a9..1eff4eb76 100644 --- a/editions/tw5.com/tiddlers/community/plugins/IndexedDB Plugin by Andreas Abeck.tid +++ b/editions/tw5.com/tiddlers/community/plugins/IndexedDB Plugin by Andreas Abeck.tid @@ -1,5 +1,5 @@ created: 20150403110356105 -modified: 20210101191843666 +modified: 20210106151027470 tags: [[Community Plugins]] title: IndexedDB Plugin by Andreas Abeck type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Json Mangler plugin by Joshua Fontany.tid b/editions/tw5.com/tiddlers/community/plugins/Json Mangler plugin by Joshua Fontany.tid index 7681d52e9..289c19628 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Json Mangler plugin by Joshua Fontany.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Json Mangler plugin by Joshua Fontany.tid @@ -1,7 +1,8 @@ created: 20190308041321498 -modified: 20210101191843666 +modified: 20210106151027480 tags: [[Community Plugins]] title: Json Mangler plugin by Joshua Fontany +type: text/vnd.tiddlywiki Extend tiddlywiki to parse complex ("nested") json data tiddlers. diff --git a/editions/tw5.com/tiddlers/community/plugins/Kin filter operator by bimlas.tid b/editions/tw5.com/tiddlers/community/plugins/Kin filter operator by bimlas.tid index 662d27d18..9d924d540 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Kin filter operator by bimlas.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Kin filter operator by bimlas.tid @@ -1,5 +1,5 @@ created: 20190219094230499 -modified: 20210101191843666 +modified: 20210106151027488 tags: [[Community Plugins]] title: Kin filter operator by bimlas type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid b/editions/tw5.com/tiddlers/community/plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid index 5b6d49ad1..2aa97b44f 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Leaflet_maps_plugin_by_Sylvain_Comte.tid @@ -1,5 +1,5 @@ created: 20151110060519720 -modified: 20210101191843666 +modified: 20210106151027499 tags: [[Community Plugins]] title: Leaflet maps plugin by Sylvain Comte type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Locator plugin by bimlas.tid b/editions/tw5.com/tiddlers/community/plugins/Locator plugin by bimlas.tid index cf47af35b..93b8aa4a7 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Locator plugin by bimlas.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Locator plugin by bimlas.tid @@ -1,5 +1,5 @@ created: 20190219191946994 -modified: 20210101191843666 +modified: 20210106151027508 tags: [[Community Plugins]] title: Locator plugin by bimlas type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/MathJax Plugin by Martin Kantor.tid b/editions/tw5.com/tiddlers/community/plugins/MathJax Plugin by Martin Kantor.tid index c46c95f8e..502e8155f 100644 --- a/editions/tw5.com/tiddlers/community/plugins/MathJax Plugin by Martin Kantor.tid +++ b/editions/tw5.com/tiddlers/community/plugins/MathJax Plugin by Martin Kantor.tid @@ -1,5 +1,5 @@ created: 20140403191946994 -modified: 20210101191843666 +modified: 20210106151027517 tags: [[Community Plugins]] title: MathJax Plugin by Martin Kantor type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Plugins by TheDiveO.tid b/editions/tw5.com/tiddlers/community/plugins/Plugins by TheDiveO.tid index 8f6694542..e65332804 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Plugins by TheDiveO.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Plugins by TheDiveO.tid @@ -1,5 +1,5 @@ created: 20140910102845245 -modified: 20210101191843666 +modified: 20210106151027524 tags: [[Community Plugins]] title: Plugins by TheDiveO type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid b/editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid index a074b0ab1..22bed3a4b 100644 --- a/editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid +++ b/editions/tw5.com/tiddlers/community/plugins/TiddlyClip by buggyjay.tid @@ -1,5 +1,5 @@ created: 20140910102845245 -modified: 20210101191843666 +modified: 20210106151027576 tags: [[Community Plugins]] title: TiddlyClip by buggyjay type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/TiddlyMap by Felix Kuppers.tid b/editions/tw5.com/tiddlers/community/plugins/TiddlyMap by Felix Kuppers.tid index 571b5f38d..2964c1c14 100644 --- a/editions/tw5.com/tiddlers/community/plugins/TiddlyMap by Felix Kuppers.tid +++ b/editions/tw5.com/tiddlers/community/plugins/TiddlyMap by Felix Kuppers.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101201435693 +modified: 20210106151027589 tags: [[Community Resources]] title: TiddlyMap Plugin by Felix Küppers type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/TiddlyWiki for Scholars.tid b/editions/tw5.com/tiddlers/community/plugins/TiddlyWiki for Scholars.tid index 256d1c142..f53bf3d21 100644 --- a/editions/tw5.com/tiddlers/community/plugins/TiddlyWiki for Scholars.tid +++ b/editions/tw5.com/tiddlers/community/plugins/TiddlyWiki for Scholars.tid @@ -1,5 +1,5 @@ created: 20140720085406905 -modified: 20210101191843666 +modified: 20210106151027232 tags: [[Community Editions]] title: "TiddlyWiki for Scholars" by Alberto Molina type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/Tinka by Andreas Hahn.tid b/editions/tw5.com/tiddlers/community/plugins/Tinka by Andreas Hahn.tid index 4b8ffd54e..92e6c78f4 100644 --- a/editions/tw5.com/tiddlers/community/plugins/Tinka by Andreas Hahn.tid +++ b/editions/tw5.com/tiddlers/community/plugins/Tinka by Andreas Hahn.tid @@ -1,5 +1,5 @@ created: 20140920124011558 -modified: 20210101191843666 +modified: 20210106151027644 tags: [[Community Plugins]] title: Tinka by Andreas Hahn type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/_JD Mobile Layout plugin_ by JD.tid b/editions/tw5.com/tiddlers/community/plugins/_JD Mobile Layout plugin_ by JD.tid index 07fce12b5..6bd891b23 100644 --- a/editions/tw5.com/tiddlers/community/plugins/_JD Mobile Layout plugin_ by JD.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_JD Mobile Layout plugin_ by JD.tid @@ -1,6 +1,6 @@ created: 20171107181449175 creator: Ste Willson -modified: 20210101170932934 +modified: 20210106151027136 tags: [[Community Plugins]] title: "JD Mobile Layout plugin" by JD type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid b/editions/tw5.com/tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid index ab1fc15ba..bd388b9cb 100644 --- a/editions/tw5.com/tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_Mal's Sandbox_ by Mal.tid @@ -1,5 +1,5 @@ created: 20160501131111865 -modified: 20210101191843666 +modified: 20210106151027149 tags: [[Community Plugins]] title: "Mal's Sandbox" by Mal type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/_SK_Plugins_ by Stephen Kimmel.tid b/editions/tw5.com/tiddlers/community/plugins/_SK_Plugins_ by Stephen Kimmel.tid index c6fafb82a..9c841d3ba 100644 --- a/editions/tw5.com/tiddlers/community/plugins/_SK_Plugins_ by Stephen Kimmel.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_SK_Plugins_ by Stephen Kimmel.tid @@ -1,5 +1,5 @@ created: 20160505180545073 -modified: 20210101191843666 +modified: 20210106151027199 tags: [[Community Plugins]] title: "SK Plugins" by Stephen Kimmel type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/_Slides and Stories_ by Jan.tid b/editions/tw5.com/tiddlers/community/plugins/_Slides and Stories_ by Jan.tid index 361dd3ae0..2a794305d 100644 --- a/editions/tw5.com/tiddlers/community/plugins/_Slides and Stories_ by Jan.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_Slides and Stories_ by Jan.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101191843666 +modified: 20210106151027205 tags: [[Community Plugins]] title: "Slides and Stories" by Jan type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid b/editions/tw5.com/tiddlers/community/plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid index 49533271b..69b55fc3c 100644 --- a/editions/tw5.com/tiddlers/community/plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_TW5-TeXZilla_ plugin by Joe Renes.tid @@ -1,5 +1,5 @@ created: 20150206170114934 -modified: 20210101191843666 +modified: 20210106151027364 tags: [[Community Plugins]] title: "TW5-TeXZilla" plugin by Joe Renes type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/_Tekan_ Kanban that stays with you_ by Riz.tid b/editions/tw5.com/tiddlers/community/plugins/_Tekan_ Kanban that stays with you_ by Riz.tid index 7da1e208b..10de1275d 100644 --- a/editions/tw5.com/tiddlers/community/plugins/_Tekan_ Kanban that stays with you_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/plugins/_Tekan_ Kanban that stays with you_ by Riz.tid @@ -1,5 +1,5 @@ created: 20171115160958926 -modified: 20210101191843666 +modified: 20210106151027218 tags: [[Community Plugins]] title: "Tekan: Kanban that stays with you" by Riz type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/datepicker based on Pikaday.tid b/editions/tw5.com/tiddlers/community/plugins/datepicker based on Pikaday.tid index 1f5f6abc1..0f7b83134 100644 --- a/editions/tw5.com/tiddlers/community/plugins/datepicker based on Pikaday.tid +++ b/editions/tw5.com/tiddlers/community/plugins/datepicker based on Pikaday.tid @@ -1,5 +1,5 @@ created: 20151015072304780 -modified: 20210101191843666 +modified: 20210106151027432 tags: [[Community Plugins]] title: datepicker plugin based on Pikaday, by kixam type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/rboue's plugins for TiddlyWiki.tid b/editions/tw5.com/tiddlers/community/plugins/rboue's plugins for TiddlyWiki.tid index 4c5d4237a..12a89962b 100644 --- a/editions/tw5.com/tiddlers/community/plugins/rboue's plugins for TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/community/plugins/rboue's plugins for TiddlyWiki.tid @@ -1,5 +1,5 @@ created: 20150403104230499 -modified: 20210101191843666 +modified: 20210106151027533 tags: [[Community Plugins]] title: rboue's plugins for TiddlyWiki type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/plugins/vis.js Timeline.tid b/editions/tw5.com/tiddlers/community/plugins/vis.js Timeline.tid index 5155426b2..710048df7 100644 --- a/editions/tw5.com/tiddlers/community/plugins/vis.js Timeline.tid +++ b/editions/tw5.com/tiddlers/community/plugins/vis.js Timeline.tid @@ -1,5 +1,5 @@ created: 20150527080809699 -modified: 20210101191843666 +modified: 20210106151027704 tags: [[Community Plugins]] title: vis.js Timeline by emkay, revived by kixam type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/BrainTest.tid b/editions/tw5.com/tiddlers/community/resources/BrainTest.tid index 3947bdc2a..c278f50ad 100644 --- a/editions/tw5.com/tiddlers/community/resources/BrainTest.tid +++ b/editions/tw5.com/tiddlers/community/resources/BrainTest.tid @@ -1,5 +1,5 @@ created: 20140315085406905 -modified: 20210101191843666 +modified: 20210106151026982 tags: [[Other Resources]] title: "BrainTest - tools for a digital brain" by Danielo Rodriguez type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid b/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid index 7eb546980..dbc87ca7f 100644 --- a/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid +++ b/editions/tw5.com/tiddlers/community/resources/Code styles and auto format settings for IDEs.tid @@ -1,5 +1,5 @@ created: 20181108094230499 -modified: 20210101191843666 +modified: 20210106151027417 tags: [[Other Resources]] title: Code styles and auto format settings for IDEs type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid b/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid index 86cb29198..e55dc3d58 100644 --- a/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid +++ b/editions/tw5.com/tiddlers/community/resources/CouchDB Adaptor.tid @@ -1,5 +1,5 @@ created: 20140927155929149 -modified: 20210101191843666 +modified: 20210106151027005 tags: [[Other Resources]] title: "CouchDB Adaptor" by William Shallum type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid b/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid index 549d63d70..78a738a6d 100644 --- a/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid +++ b/editions/tw5.com/tiddlers/community/resources/Filter Examples by Tobias Beer.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101191843666 +modified: 20210106151027050 tags: [[Community Resources]] Tutorials title: "Filter Examples" by Tobias Beer type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid b/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid index 5fb28888f..155ebd48e 100644 --- a/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid +++ b/editions/tw5.com/tiddlers/community/resources/Font Awesome 5 Free SVGs for TiddlyWiki by morosanuae.tid @@ -1,5 +1,5 @@ created: 20190710085450262 -modified: 20210101191843666 +modified: 20210106151027064 tags: SVG Images [[Font Awesome 5]] [[Other Resources]] title: "Font Awesome 5 Free SVGs for TiddlyWiki" by morosanuae type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid b/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid index c41fe164a..c8f9649a4 100644 --- a/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid +++ b/editions/tw5.com/tiddlers/community/resources/Gospel_Bubbles_by_Rev_David_Gifford.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101191843666 +modified: 20210106151027081 tags: Examples title: "Gospel Bubbles" by Rev. David Gifford type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid b/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid index db8c20c55..e8e8aa4b6 100644 --- a/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid +++ b/editions/tw5.com/tiddlers/community/resources/Heeg.ru.tid @@ -1,6 +1,6 @@ created: 20141215174011558 -modified: 20210101191843666 -tags: [[Tutorials]] +modified: 20210106151027109 +tags: Tutorials title: "Heeg.ru" by sini-Kit type: text/vnd.tiddlywiki url: http://heeg.ru/ diff --git a/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid b/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid index 9b18622ce..32a889751 100644 --- a/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid +++ b/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid @@ -1,7 +1,8 @@ created: 20140315085406905 -modified: 20210101191843666 +modified: 20210106151027120 tags: Tutorials title: "Hosting TiddlyWiki5 on GoogleDrive" by Tony Ching +type: text/vnd.tiddlywiki url: https://googledrive.com/host/0B51gSXixfJ2Qb0I4R2M4MWJVMlU Tony Ching's quick guide for sharing TiddlyWiki with Google Drive. diff --git a/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid index c2d5143ec..0ade3cbe5 100644 --- a/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/RegExp in Tiddlywiki by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117164024930 -modified: 20210101191843666 -tags: [[Tutorials]] +modified: 20210106151027546 +tags: Tutorials title: RegExp in Tiddlywiki by Mohammad type: text/vnd.tiddlywiki url: http://tw-regexp.tiddlyspot.com/ diff --git a/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid b/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid index c52a71018..a96f87bcb 100644 --- a/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid +++ b/editions/tw5.com/tiddlers/community/resources/SeeAlso by Matias Goldman.tid @@ -1,5 +1,5 @@ created: 20150430154234863 -modified: 20210101191843666 +modified: 20210106151027554 tags: [[Other Resources]] title: SeeAlso by Matias Goldman type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid index 2e775a468..a552f8314 100644 --- a/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/Semantic Colors by Mohammad.tid @@ -1,5 +1,5 @@ created: 20201117162254751 -modified: 20210101191843666 +modified: 20210106151027560 tags: [[Other Resources]] title: Semantic Colors by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid b/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid index 43ab60606..bdf82d2a4 100644 --- a/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid +++ b/editions/tw5.com/tiddlers/community/resources/TB5 a pocket full of tips by Tobias Beer.tid @@ -1,5 +1,5 @@ created: 20140315085406905 -modified: 20210101191843666 +modified: 20210106151027212 tags: [[Other Resources]] Tutorials title: "TB5 - a pocket full of tips" by Tobias Beer type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid index 143d02d08..d95c04f47 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW-Scripts by Mohammad.tid @@ -1,5 +1,5 @@ created: 20180830194141190 -modified: 20210101191843666 +modified: 20210106151027650 tags: [[Other Resources]] Tutorials title: TW-Scripts by Mohammad type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid b/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid index 1a2a687f1..c24cf340a 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW5 Magick.tid @@ -1,5 +1,5 @@ created: 20140315085406905 -modified: 20210101191843666 +modified: 20210106151027357 tags: [[Other Resources]] Tutorials [[Community plugins]] title: "TW5 Magick" by Stephan Hradek type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid b/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid index c0990ad71..b91875796 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW5-SingleExecutable_by_Jed_Carty.tid @@ -1,5 +1,5 @@ created: 20180320020552940 -modified: 20210101191843666 +modified: 20210106151027657 tags: [[Other Resources]] title: TW5-SingleExecutable by Jed Carty type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid b/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid index d6ef2551c..6059bc27a 100644 --- a/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid +++ b/editions/tw5.com/tiddlers/community/resources/TWCommunitySearch.tid @@ -1,5 +1,5 @@ created: 20150913184230499 -modified: 20210101191843666 +modified: 20210106151027664 tags: [[Other Resources]] title: TWCommunitySearch type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid index 639d94436..1535b9152 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyChrome by Arlen Beiler.tid @@ -1,5 +1,5 @@ created: 20160422143238688 -modified: 20210101191843666 +modified: 20210106151027566 tags: [[Other Resources]] title: TiddlyChrome by Arlen Beiler type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid index c63b22904..332085884 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyDrive Add-on for Google Drive by Joshua Stubbs.tid @@ -5,7 +5,7 @@ created: 20171109172705241 delivery: Google Drive Add-on description: Google Drive add-on to save TiddlyWiki files method: save -modified: 20210101191843666 +modified: 20210106151027582 tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP [[Other Resources]] Safari Saving Windows iOS plugins Edge title: TiddlyDrive Add-on for Google Drive by Joshua Stubbs type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid index 93d94140f..88c0bf623 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyServer by Arlen Beiler.tid @@ -5,7 +5,7 @@ created: 20171109171415540 delivery: DIY description: An extension to TiddlyWiki's Node.js server method: sync -modified: 20210101191843666 +modified: 20210106151027596 tags: Linux Mac Windows Saving [[Other Resources]] title: TiddlyServer by Arlen Beiler type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid index 0da6d11d5..41bf81e11 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Notes.tid @@ -1,5 +1,5 @@ created: 20140327085406905 -modified: 20210101191843666 +modified: 20210106151027260 tags: [[Other Resources]] title: "TiddlyWiki Notes" by James Anderson type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid index bebfa92a9..0c3d37cff 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Posts.tid @@ -1,5 +1,5 @@ created: 20140129085406905 -modified: 20210101191843666 +modified: 20210106151027268 tags: [[Other Resources]] Articles title: "TiddlyWiki Posts" by Jeffrey Kishner type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid index 5b01c18fd..e596a8f2d 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki Video Tutorials by Francis Meetze.tid @@ -1,6 +1,6 @@ created: 20150926170842677 -modified: 20210101191843666 -tags: [[Tutorials]] +modified: 20210106151027628 +tags: Tutorials title: TiddlyWiki Video Tutorials by Francis Meetze type: text/vnd.tiddlywiki url: https://www.youtube.com/playlist?list=PLzZCajspPU_UjFn0uy-J9URz0LP4zhxRK diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid index 5ed79f0f2..fe1dc3e37 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for Sublime Text 3 by roma0104.tid @@ -1,5 +1,5 @@ created: 20160424121451825 -modified: 20210101191843666 +modified: 20210106151027608 tags: [[Other Resources]] title: TiddlyWiki extensions for Sublime Text 3 by roma0104 type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid index 41817b9dc..9d485c392 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki extensions for ViM.tid @@ -1,5 +1,5 @@ created: 20160820000000000 -modified: 20210101191843666 +modified: 20210106151027617 tags: [[Other Resources]] title: TiddlyWiki extensions for ViM type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid index 28fc730d7..c84b98550 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki guide FR.tid @@ -1,5 +1,5 @@ created: 20141031210213087 -modified: 20210101191843666 +modified: 20210106151027238 tags: [[Other Resources]] title: "TiddlyWiki guide FR" by Sylvain Naudin type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid index 00fb339f4..03d10da56 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki wu.tid @@ -1,5 +1,5 @@ created: 20140322085406905 -modified: 20210101191843666 +modified: 20210106151027288 tags: [[Other Resources]] title: "TiddlyWiki 舞" by Bram Chen type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid index 274c7ccdf..fbb33b246 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Playground.tid @@ -1,5 +1,5 @@ created: 20140315085406905 -modified: 20210101191843666 +modified: 20210106151027330 tags: [[Other Resources]] [[Community Plugins]] title: "TiddlyWiki5 Playground" by Ton Gerner type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid index 794370df8..1326ab5af 100644 --- a/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid +++ b/editions/tw5.com/tiddlers/community/resources/TiddlyWiki5 Squared by Iannis Zannos.tid @@ -1,5 +1,5 @@ created: 20141009170239174 -modified: 20210101191843666 +modified: 20210106151027345 tags: [[Other Resources]] title: "TiddlyWiki5^2 documenting while learning TiddlyWiki5" by Iannis Zannos type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid b/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid index b2dc32b48..337f83dbb 100644 --- a/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid +++ b/editions/tw5.com/tiddlers/community/resources/Twexe_ Single File Tiddlywiki5 executable.tid @@ -5,7 +5,7 @@ created: 20200507214737998 delivery: App description: Single File Tiddlywiki5 executable method: save -modified: 20210101191843666 +modified: 20210106151027674 tags: Firefox [[Internet Explorer]] Opera [[Other Resources]] Safari Saving Windows Edge Linux title: Twexe: Single File Tiddlywiki5 executable type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid b/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid index 93e1c2a4b..ee6d21c24 100644 --- a/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid +++ b/editions/tw5.com/tiddlers/community/resources/Widdly by Opennota.tid @@ -1,5 +1,5 @@ created: 20180309162923236 -modified: 20210101191843666 +modified: 20210106151027712 tags: [[Other Resources]] title: Widdly by Opennota type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid b/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid index 2edb2afc9..43766e2ef 100644 --- a/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid +++ b/editions/tw5.com/tiddlers/community/resources/Wikilabs by PMario.tid @@ -1,5 +1,5 @@ -created: 201704191641 -modified: 20210101191843666 +created: 20170419164100000 +modified: 20210106151027378 tags: [[Other Resources]] [[Community Plugins]] [[Community Editions]] title: "Wikilabs" by PMario type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid b/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid index f6337504c..fac71a603 100644 --- a/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid +++ b/editions/tw5.com/tiddlers/community/resources/Wills QnD gTD.tid @@ -1,5 +1,5 @@ created: 20140505085406905 -modified: 20210101191843666 +modified: 20210106151027388 tags: [[Other Resources]] title: "Wills Q&D gTD" by Matabele type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid b/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid index 002a3ab6e..e9517e7cc 100644 --- a/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid +++ b/editions/tw5.com/tiddlers/community/resources/_ATWiki_ by Lamusia Project.tid @@ -1,5 +1,5 @@ created: 20171219171531482 -modified: 20210101170932934 +modified: 20210106151026834 tags: [[Other Resources]] title: "ATWiki" by Lamusia Project type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid b/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid index 57ff67459..6f0eb3523 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Dropboard_ by Reid Gould.tid @@ -1,6 +1,6 @@ created: 20171111192738730 creator: MAS -modified: 20210101170932934 +modified: 20210106151027013 tags: [[Other Resources]] title: "Dropboard" by Reid Gould type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid b/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid index 0119f0cf6..71f78806b 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Dynamic Tables_ by Jed Carty.tid @@ -1,5 +1,5 @@ created: 20180309160958926 -modified: 20210101170932934 +modified: 20210106151027021 tags: [[Other Resourches]] title: "Dynamic Tables" by Jed Carty type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid b/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid index 06548d27a..8d9cb326b 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Hacks_ by Thomas Elmiger.tid @@ -1,9 +1,10 @@ created: 20161226165024380 creator: Thomas Elmiger -modified: 20210101170932934 +modified: 20210106151027097 modifier: Thomas Elmiger tags: [[Other Resources]] title: "Hacks" by Thomas Elmiger +type: text/vnd.tiddlywiki url: http://tid.li/tw5/hacks.html A collection of helpers by Thomas Elmiger, among them a ''tweet button'' macro, a ''text-stretch'' solution, a ''snippet extraction'' macro and a tiddler that installs a ''scroll-to-top button'' via drag-and-drop. diff --git a/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid b/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid index ae78dca46..9d95a1677 100644 --- a/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid +++ b/editions/tw5.com/tiddlers/community/resources/_In My Socks_ by Jed Carty.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101170932934 +modified: 20210106151027127 tags: [[Other Resources]] title: "In My Socks" by Jed Carty type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid b/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid index a52f013d3..20957e433 100644 --- a/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid +++ b/editions/tw5.com/tiddlers/community/resources/_MathCell_ by Ste Wilson.tid @@ -1,8 +1,9 @@ created: 20161226165024380 creator: Ste Willson -modified: 20210101191843666 +modified: 20210106151027156 tags: [[Other Resources]] title: "MathCell" by Stephen Kimmel +type: text/vnd.tiddlywiki url: http://mathcell.tiddlyspot.com/ Mathcell allows spreadsheet-like abilities in a completely contained TiddlyWiki. diff --git a/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid b/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid index 441297a84..733b1cd88 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TWeb.at_ by Mario Pietsch.tid @@ -1,5 +1,5 @@ created: 20140410103123179 -modified: 20210101191843666 +modified: 20210106151027370 tags: [[Other Resources]] title: "TWeb.at" by Mario Pietsch type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid index 4b0a1655e..615298b6b 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyServer_ by Matt Lauber.tid @@ -1,8 +1,9 @@ created: 20161226165024380 creator: Matt Lauber -modified: 20210101191843666 +modified: 20210106151027226 tags: [[Other resources]] title: "TiddlyServer" by Matt Lauber +type: text/vnd.tiddlywiki url: https://github.com/mklauber/TiddlyServer/releases/ TiddlyServer is a special purpose Desktop app, designed to facilitate managing multiple instances of TiddlyWiki running as a server. It does not require internet acess to access the wikis. diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid index 41eb937c7..b867bbab4 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Knowledge Network_ by Dmitry Sokolov.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101191843666 +modified: 20210106151027250 tags: [[Other Resources]] title: "TiddlyWiki Knowledge Network" by Dmitry Sokolov type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid index fa3ea3d0e..26fa32117 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki Toolmap_ by David Gifford.tid @@ -1,5 +1,5 @@ created: 20181012161505447 -modified: 20210101191843666 +modified: 20210106151027280 tags: [[Other Resources]] title: "TiddlyWiki Toolmap" by David Gifford type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid index 3145c52e4..5aefa6f82 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Bourbon_ from mkt_memory.tid @@ -1,5 +1,5 @@ created: 20141020072708790 -modified: 20210101191843666 +modified: 20210106151027295 tags: [[Other Resources]] title: "TiddlyWiki5 Bourbon" by mkt_memory type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid index e19d8ace1..0abe2af9a 100644 --- a/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/resources/_TiddlyWiki5 Forum on Reddit_ by Riz.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101191843666 +modified: 20210106151027302 tags: [[Other Resources]] title: "TiddlyWiki5 Forum on Reddit" by Riz type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid index 6a5e7bfe9..475de4308 100644 --- a/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid +++ b/editions/tw5.com/tiddlers/community/resources/_Timimi_ Extension and executable by Riz.tid @@ -5,7 +5,7 @@ created: 20180830194141190 delivery: Browser Extension & Native host description: Browser extension & native host for desktops method: save -modified: 20210101191843666 +modified: 20210106151027637 tags: Windows Linux Chrome Firefox Saving [[Other Resources]] plugins Mac Opera Edge title: Timimi: WebExtension and Native Host by Riz type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid b/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid index 198e777c0..4df710ad4 100644 --- a/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid +++ b/editions/tw5.com/tiddlers/community/resources/_X3DOM for TiddlyWiki 5_ by Jamal Wills.tid @@ -1,6 +1,6 @@ created: 20171107175718679 creator: Ste Willson -modified: 20210101191843666 +modified: 20210106151027400 tags: [[Other Resources]] title: "X3DOM for TiddlyWiki 5" by Jamal Wills type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid index bbcd579d6..e023a34d9 100644 --- a/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid +++ b/editions/tw5.com/tiddlers/community/resources/_file-backups_ Extension Firefox by pmario.tid @@ -5,7 +5,7 @@ created: 20171116165500000 delivery: Browser Extension description: Browser extension for Firefox method: save -modified: 20210101170932934 +modified: 20210106151027036 tags: Firefox Saving [[Other Resources]] plugins Windows Linux Mac title: "file-backups" Extension for Firefox by pmario type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid b/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid index ae589ce18..d925445ef 100644 --- a/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid +++ b/editions/tw5.com/tiddlers/community/resources/_muritest_ by Simon Huber.tid @@ -1,5 +1,5 @@ created: 20171219165418434 -modified: 20210101191843666 +modified: 20210106151027169 tags: [[Other resources]] title: "muritest" by Simon Huber type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid b/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid index c0f50f58f..1eaa83302 100644 --- a/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid +++ b/editions/tw5.com/tiddlers/community/resources/_savetiddlers_ Extension for Chrome and Firefox by buggyj.tid @@ -5,7 +5,7 @@ created: 20171109171935039 delivery: Browser Extension description: Browser extension for Chrome and Firefox method: save -modified: 20210101191843666 +modified: 20210106151027189 tags: Chrome Firefox Saving [[Other Resources]] plugins title: "savetiddlers" Extension for Chrome and Firefox by buggyj type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid b/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid index fd17aa4fd..cd6171e0d 100644 --- a/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid +++ b/editions/tw5.com/tiddlers/community/resources/twproxy by Steve Gattuso.tid @@ -1,5 +1,5 @@ created: 20160424150055313 -modified: 20210101191843666 +modified: 20210106151027692 tags: [[Other Resources]] title: twproxy by Steve Gattuso type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid b/editions/tw5.com/tiddlers/community/themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid index 8ba7a22a1..dff9d3970 100644 --- a/editions/tw5.com/tiddlers/community/themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/themes/_Ghostwriter theme by Rory Gibson_ by Riz.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101170932934 +modified: 20210106151027075 tags: [[Community Themes]] title: "Ghostwriter theme by Rory Gibson" adapted for TW5 by Riz type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/themes/_Moments-A little color won't hurt_ by Riz.tid b/editions/tw5.com/tiddlers/community/themes/_Moments-A little color won't hurt_ by Riz.tid index 443023f66..f0c13140a 100644 --- a/editions/tw5.com/tiddlers/community/themes/_Moments-A little color won't hurt_ by Riz.tid +++ b/editions/tw5.com/tiddlers/community/themes/_Moments-A little color won't hurt_ by Riz.tid @@ -1,5 +1,5 @@ created: 20141122093837330 -modified: 20210101191843666 +modified: 20210106151027162 tags: [[Community Themes]] title: "Moments: A little color won't hurt" by Riz type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid b/editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid index 7a213b523..4f4e39c4e 100644 --- a/editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid +++ b/editions/tw5.com/tiddlers/community/tutorials/GitHub Saver Tutorial by Mohammad.tid @@ -1,6 +1,6 @@ created: 20201117163027900 -modified: 20210101191843666 -tags: [[Tutorials]] +modified: 20210106151027459 +tags: Tutorials title: GitHub Saver Tutorial by Mohammad type: text/vnd.tiddlywiki url: https://kookma.github.io/TW5-GitHub-Saver/ From b632cea6b7286f586fcc4c64b59c1b998a6e48a4 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 7 Jan 2021 13:19:50 -0500 Subject: [PATCH 1187/2376] Fixed issue where [lookup[]] could emit undefined (#5376) --- core/modules/filters/lookup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters/lookup.js b/core/modules/filters/lookup.js index 49c8e205a..2174e8c47 100644 --- a/core/modules/filters/lookup.js +++ b/core/modules/filters/lookup.js @@ -22,7 +22,7 @@ Export our filter function exports.lookup = function(source,operator,options) { var results = []; source(function(tiddler,title) { - results.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix); + results.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix || ''); }); return results; }; From 5125b91b3fd4263c9bd15307114175cd3dae5374 Mon Sep 17 00:00:00 2001 From: CodaCoder <CodaCodr@users.noreply.github.com> Date: Thu, 7 Jan 2021 12:22:05 -0600 Subject: [PATCH 1188/2376] Update Formatting List Results as Tables with CSS - Specified Columns Methods.tid (#5375) -moz-column* seems to have been dropped in Firefox. Added the non-prefixed, standard properties. --- ...Results as Tables with CSS - Specified Columns Methods.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/editions/tw5.com/tiddlers/howtos/Formatting List Results as Tables with CSS - Specified Columns Methods.tid b/editions/tw5.com/tiddlers/howtos/Formatting List Results as Tables with CSS - Specified Columns Methods.tid index bae7414ca..817776a1a 100644 --- a/editions/tw5.com/tiddlers/howtos/Formatting List Results as Tables with CSS - Specified Columns Methods.tid +++ b/editions/tw5.com/tiddlers/howtos/Formatting List Results as Tables with CSS - Specified Columns Methods.tid @@ -18,6 +18,8 @@ For other table-making techniques see also: /* FOUR COLUMN MODE */ .fourcolumns { display:block; + column-count:4; + column-gap:1em; -moz-column-count:4; -moz-column-gap:1em; -webkit-column-count: 4; @@ -42,6 +44,8 @@ Note the various places you need to indicate the number of columns <style> .fourcolumns { display:block; + column-count:4; + column-gap:1em; -moz-column-count:4; -moz-column-gap:1em; -webkit-column-count: 4; From 4858b24cfe978ad03e90b3fb2e52b006e823cb67 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Sat, 9 Jan 2021 14:25:48 +0100 Subject: [PATCH 1189/2376] Fix #5308 - WidgetSubclassingMechanism not working with widgets that add EventListeners (or logic ?) in constructor (#5382) * add EventListeners in the render() method instead of the constructor * scrollable widget: add EventListeners in render() method instead of constructor + ... move logic from constructor to render() * linkcatcher: add EventListeners in render() instead of constructor * fieldmangler: add EventListeners in render() instead of constructor * edit-bitmap: initialise editorOperations in render() instead of constructor * list-widget: initialise storyviews in render() instead of constructor * vars widget: execute Widget.call(this) in render() instead of constructor ... not shure what this should do * Update fieldmangler.js * Update edit-bitmap.js * Update linkcatcher.js * Update navigator.js * Update scrollable.js * Update list.js * Update vars.js --- core/modules/widgets/edit-bitmap.js | 10 +++---- core/modules/widgets/fieldmangler.js | 12 ++++----- core/modules/widgets/linkcatcher.js | 6 ++--- core/modules/widgets/list.js | 12 ++++----- core/modules/widgets/navigator.js | 22 +++++++-------- core/modules/widgets/scrollable.js | 40 ++++++++++++++-------------- core/modules/widgets/vars.js | 4 +-- 7 files changed, 53 insertions(+), 53 deletions(-) diff --git a/core/modules/widgets/edit-bitmap.js b/core/modules/widgets/edit-bitmap.js index 0e72b5df1..c6c3dde8c 100644 --- a/core/modules/widgets/edit-bitmap.js +++ b/core/modules/widgets/edit-bitmap.js @@ -25,11 +25,6 @@ var LINE_WIDTH_TITLE = "$:/config/BitmapEditor/LineWidth", var Widget = require("$:/core/modules/widgets/widget.js").widget; var EditBitmapWidget = function(parseTreeNode,options) { - // Initialise the editor operations if they've not been done already - if(!this.editorOperations) { - EditBitmapWidget.prototype.editorOperations = {}; - $tw.modules.applyMethods("bitmapeditoroperation",this.editorOperations); - } this.initialise(parseTreeNode,options); }; @@ -43,6 +38,11 @@ Render this widget into the DOM */ EditBitmapWidget.prototype.render = function(parent,nextSibling) { var self = this; + // Initialise the editor operations if they've not been done already + if(!this.editorOperations) { + EditBitmapWidget.prototype.editorOperations = {}; + $tw.modules.applyMethods("bitmapeditoroperation",this.editorOperations); + } // Save the parent dom node this.parentDomNode = parent; // Compute our attributes diff --git a/core/modules/widgets/fieldmangler.js b/core/modules/widgets/fieldmangler.js index ca0b4f0f4..a8b18ffa1 100644 --- a/core/modules/widgets/fieldmangler.js +++ b/core/modules/widgets/fieldmangler.js @@ -16,12 +16,6 @@ var Widget = require("$:/core/modules/widgets/widget.js").widget; var FieldManglerWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); - this.addEventListeners([ - {type: "tm-remove-field", handler: "handleRemoveFieldEvent"}, - {type: "tm-add-field", handler: "handleAddFieldEvent"}, - {type: "tm-remove-tag", handler: "handleRemoveTagEvent"}, - {type: "tm-add-tag", handler: "handleAddTagEvent"} - ]); }; /* @@ -33,6 +27,12 @@ FieldManglerWidget.prototype = new Widget(); Render this widget into the DOM */ FieldManglerWidget.prototype.render = function(parent,nextSibling) { + this.addEventListeners([ + {type: "tm-remove-field", handler: "handleRemoveFieldEvent"}, + {type: "tm-add-field", handler: "handleAddFieldEvent"}, + {type: "tm-remove-tag", handler: "handleRemoveTagEvent"}, + {type: "tm-add-tag", handler: "handleAddTagEvent"} + ]); this.parentDomNode = parent; this.computeAttributes(); this.execute(); diff --git a/core/modules/widgets/linkcatcher.js b/core/modules/widgets/linkcatcher.js index 28b906b80..616a54c32 100644 --- a/core/modules/widgets/linkcatcher.js +++ b/core/modules/widgets/linkcatcher.js @@ -16,9 +16,6 @@ var Widget = require("$:/core/modules/widgets/widget.js").widget; var LinkCatcherWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); - this.addEventListeners([ - {type: "tm-navigate", handler: "handleNavigateEvent"} - ]); }; /* @@ -30,6 +27,9 @@ LinkCatcherWidget.prototype = new Widget(); Render this widget into the DOM */ LinkCatcherWidget.prototype.render = function(parent,nextSibling) { + this.addEventListeners([ + {type: "tm-navigate", handler: "handleNavigateEvent"} + ]); this.parentDomNode = parent; this.computeAttributes(); this.execute(); diff --git a/core/modules/widgets/list.js b/core/modules/widgets/list.js index 786ce42a9..a49bf01ea 100755 --- a/core/modules/widgets/list.js +++ b/core/modules/widgets/list.js @@ -19,11 +19,6 @@ The list widget creates list element sub-widgets that reach back into the list w */ var ListWidget = function(parseTreeNode,options) { - // Initialise the storyviews if they've not been done already - if(!this.storyViews) { - ListWidget.prototype.storyViews = {}; - $tw.modules.applyMethods("storyview",this.storyViews); - } // Main initialisation inherited from widget.js this.initialise(parseTreeNode,options); }; @@ -37,6 +32,11 @@ ListWidget.prototype = new Widget(); Render this widget into the DOM */ ListWidget.prototype.render = function(parent,nextSibling) { + // Initialise the storyviews if they've not been done already + if(!this.storyViews) { + ListWidget.prototype.storyViews = {}; + $tw.modules.applyMethods("storyview",this.storyViews); + } this.parentDomNode = parent; this.computeAttributes(); this.execute(); @@ -324,4 +324,4 @@ ListItemWidget.prototype.refresh = function(changedTiddlers) { exports.listitem = ListItemWidget; -})(); \ No newline at end of file +})(); diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 2f8e2421e..02eee8c43 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -18,6 +18,17 @@ var Widget = require("$:/core/modules/widgets/widget.js").widget; var NavigatorWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +NavigatorWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +NavigatorWidget.prototype.render = function(parent,nextSibling) { this.addEventListeners([ {type: "tm-navigate", handler: "handleNavigateEvent"}, {type: "tm-edit-tiddler", handler: "handleEditTiddlerEvent"}, @@ -36,17 +47,6 @@ var NavigatorWidget = function(parseTreeNode,options) { {type: "tm-unfold-all-tiddlers", handler: "handleUnfoldAllTiddlersEvent"}, {type: "tm-rename-tiddler", handler: "handleRenameTiddlerEvent"} ]); -}; - -/* -Inherit from the base widget class -*/ -NavigatorWidget.prototype = new Widget(); - -/* -Render this widget into the DOM -*/ -NavigatorWidget.prototype.render = function(parent,nextSibling) { this.parentDomNode = parent; this.computeAttributes(); this.execute(); diff --git a/core/modules/widgets/scrollable.js b/core/modules/widgets/scrollable.js index 93f81310a..23be39efd 100644 --- a/core/modules/widgets/scrollable.js +++ b/core/modules/widgets/scrollable.js @@ -16,26 +16,6 @@ var Widget = require("$:/core/modules/widgets/widget.js").widget; var ScrollableWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); - this.scaleFactor = 1; - this.addEventListeners([ - {type: "tm-scroll", handler: "handleScrollEvent"} - ]); - if($tw.browser) { - this.requestAnimationFrame = window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - function(callback) { - return window.setTimeout(callback, 1000/60); - }; - this.cancelAnimationFrame = window.cancelAnimationFrame || - window.webkitCancelAnimationFrame || - window.webkitCancelRequestAnimationFrame || - window.mozCancelAnimationFrame || - window.mozCancelRequestAnimationFrame || - function(id) { - window.clearTimeout(id); - }; - } }; /* @@ -147,6 +127,26 @@ Render this widget into the DOM */ ScrollableWidget.prototype.render = function(parent,nextSibling) { var self = this; + this.scaleFactor = 1; + this.addEventListeners([ + {type: "tm-scroll", handler: "handleScrollEvent"} + ]); + if($tw.browser) { + this.requestAnimationFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000/60); + }; + this.cancelAnimationFrame = window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.webkitCancelRequestAnimationFrame || + window.mozCancelAnimationFrame || + window.mozCancelRequestAnimationFrame || + function(id) { + window.clearTimeout(id); + }; + } // Remember parent this.parentDomNode = parent; // Compute attributes and execute state diff --git a/core/modules/widgets/vars.js b/core/modules/widgets/vars.js index ce443aee5..cbd3e0ddc 100644 --- a/core/modules/widgets/vars.js +++ b/core/modules/widgets/vars.js @@ -22,8 +22,6 @@ This widget allows multiple variables to be set in one go: var Widget = require("$:/core/modules/widgets/widget.js").widget; var VarsWidget = function(parseTreeNode,options) { - // Call the constructor - Widget.call(this); // Initialise this.initialise(parseTreeNode,options); }; @@ -37,6 +35,8 @@ VarsWidget.prototype = Object.create(Widget.prototype); Render this widget into the DOM */ VarsWidget.prototype.render = function(parent,nextSibling) { + // Call the constructor + Widget.call(this); this.parentDomNode = parent; this.computeAttributes(); this.execute(); From af897361c7d0eaea06f04e3bd5cd05ea035ae699 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 9 Jan 2021 13:34:21 +0000 Subject: [PATCH 1190/2376] Fix name of default branch for GitHub saver Fixes #5317 Missed off 8cd13e2f89ab85b47794a4f6198fbb1418775704 --- core/ui/ControlPanel/Saving/GitHub.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/ControlPanel/Saving/GitHub.tid b/core/ui/ControlPanel/Saving/GitHub.tid index 88d6f947f..5782d0dcd 100644 --- a/core/ui/ControlPanel/Saving/GitHub.tid +++ b/core/ui/ControlPanel/Saving/GitHub.tid @@ -10,7 +10,7 @@ caption: {{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}} |<<lingo UserName>> |<$edit-text tiddler="$:/GitHub/Username" default="" tag="input"/> | |<<lingo GitHub/Password>> |<$password name="github"/> | |<<lingo Repo>> |<$edit-text tiddler="$:/GitHub/Repo" default="" tag="input"/> | -|<<lingo Branch>> |<$edit-text tiddler="$:/GitHub/Branch" default="master" tag="input"/> | +|<<lingo Branch>> |<$edit-text tiddler="$:/GitHub/Branch" default="main" tag="input"/> | |<<lingo Path>> |<$edit-text tiddler="$:/GitHub/Path" default="" tag="input"/> | |<<lingo Filename>> |<$edit-text tiddler="$:/GitHub/Filename" default="" tag="input"/> | |<<lingo ServerURL>> |<$edit-text tiddler="$:/GitHub/ServerURL" default="https://api.github.com" tag="input"/> | \ No newline at end of file From 65932a9b213c1a82625519fd086f35607b279469 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Sat, 9 Jan 2021 15:52:34 -0500 Subject: [PATCH 1191/2376] Memory efficient linked list (#5380) * Outlines of the mem efficient linked list Need to stop for now. Found problem with $tw.utils.pushTop that I need consultation for. * Link list throws when given non-string vals * Think I got rid of the last LinkList infinite loops * LinkedList push better; fixed coding conventions * Cleaning up LinkedList code and tests * Ready to ship new mem efficient Linked List * Switching to double quotes in LinkedList --- core/modules/utils/linked-list.js | 188 +++++++++---- .../test/tiddlers/tests/test-linked-list.js | 248 +++++++++++++----- 2 files changed, 314 insertions(+), 122 deletions(-) diff --git a/core/modules/utils/linked-list.js b/core/modules/utils/linked-list.js index b25f0b8fd..3fdc7f8b2 100644 --- a/core/modules/utils/linked-list.js +++ b/core/modules/utils/linked-list.js @@ -14,105 +14,181 @@ function LinkedList() { }; LinkedList.prototype.clear = function() { - this.index = Object.create(null); // LinkedList performs the duty of both the head and tail node - this.next = this; - this.prev = this; + this.next = Object.create(null); + this.prev = Object.create(null); + this.first = undefined; + this.last = undefined; this.length = 0; }; LinkedList.prototype.remove = function(value) { if($tw.utils.isArray(value)) { + for(var t=0; t<value.length; t++) { + _assertString(value[t]); + } for(var t=0; t<value.length; t++) { _removeOne(this,value[t]); } } else { + _assertString(value); _removeOne(this,value); } }; +/* +Push behaves like array.push and accepts multiple string arguments. But it also +accepts a single array argument too, to be consistent with its other methods. +*/ LinkedList.prototype.push = function(/* values */) { - for(var i = 0; i < arguments.length; i++) { - var value = arguments[i]; - var node = {value: value}; - var preexistingNode = this.index[value]; - _linkToEnd(this,node); - if(preexistingNode) { - // We want to keep pointing to the first instance, but we want - // to have that instance (or chain of instances) point to the - // new one. - while (preexistingNode.copy) { - preexistingNode = preexistingNode.copy; - } - preexistingNode.copy = node; - } else { - this.index[value] = node; - } + var values = arguments; + if($tw.utils.isArray(values[0])) { + values = values[0]; } + for(var i = 0; i < values.length; i++) { + _assertString(values[i]); + } + for(var i = 0; i < values.length; i++) { + _linkToEnd(this,values[i]); + } + return this.length; }; LinkedList.prototype.pushTop = function(value) { if($tw.utils.isArray(value)) { + for (var t=0; t<value.length; t++) { + _assertString(value[t]); + } for(var t=0; t<value.length; t++) { _removeOne(this,value[t]); } - this.push.apply(this,value); - } else { - var node = _removeOne(this,value); - if(!node) { - node = {value: value}; - this.index[value] = node; - } else { - // Put this node at the end of the copy chain. - var preexistingNode = node; - while(preexistingNode.copy) { - preexistingNode = preexistingNode.copy; - } - // The order of these three statements is important, - // because sometimes preexistingNode == node. - preexistingNode.copy = node; - this.index[value] = node.copy; - node.copy = undefined; + for(var t=0; t<value.length; t++) { + _linkToEnd(this,value[t]); } - _linkToEnd(this,node); + } else { + _assertString(value); + _removeOne(this,value); + _linkToEnd(this,value); } }; LinkedList.prototype.each = function(callback) { - for(var ptr = this.next; ptr !== this; ptr = ptr.next) { - callback(ptr.value); + var visits = Object.create(null), + value = this.first; + while(value !== undefined) { + callback(value); + var next = this.next[value]; + if(typeof next === "object") { + var i = visits[value] || 0; + visits[value] = i+1; + value = next[i]; + } else { + value = next; + } } }; LinkedList.prototype.toArray = function() { var output = []; - for(var ptr = this.next; ptr !== this; ptr = ptr.next) { - output.push(ptr.value); - } + this.each(function(value) { output.push(value); }); return output; }; function _removeOne(list,value) { - var node = list.index[value]; - if(node) { - node.prev.next = node.next; - node.next.prev = node.prev; - list.length -= 1; - // Point index to the next instance of the same value, maybe nothing. - list.index[value] = node.copy; + var prevEntry = list.prev[value], + nextEntry = list.next[value], + prev = prevEntry, + next = nextEntry; + if(typeof nextEntry === "object") { + next = nextEntry[0]; + prev = prevEntry[0]; } - return node; + // Relink preceding element. + if(list.first === value) { + list.first = next + } else if(prev !== undefined) { + if(typeof list.next[prev] === "object") { + if(next === undefined) { + // Must have been last, and 'i' would be last element. + list.next[prev].pop(); + } else { + var i = list.next[prev].indexOf(value); + list.next[prev][i] = next; + } + } else { + list.next[prev] = next; + } + } else { + return; + } + // Now relink following element + // Check "next !== undefined" rather than "list.last === value" because + // we need to know if the FIRST value is the last in the list, not the last. + if(next !== undefined) { + if(typeof list.prev[next] === "object") { + if(prev === undefined) { + // Must have been first, and 'i' would be 0. + list.prev[next].shift(); + } else { + var i = list.prev[next].indexOf(value); + list.prev[next][i] = prev; + } + } else { + list.prev[next] = prev; + } + } else { + list.last = prev; + } + // Delink actual value. If it uses arrays, just remove first entries. + if(typeof nextEntry === "object") { + nextEntry.shift(); + prevEntry.shift(); + } else { + list.next[value] = undefined; + list.prev[value] = undefined; + } + list.length -= 1; }; -function _linkToEnd(list,node) { - // Sticks the given node onto the end of the list. - list.prev.next = node; - node.prev = list.prev; - list.prev = node; - node.next = list; +// Sticks the given node onto the end of the list. +function _linkToEnd(list,value) { + if(list.first === undefined) { + list.first = value; + } else { + // Does it already exists? + if(list.first === value || list.prev[value] !== undefined) { + if(typeof list.next[value] === "string") { + list.next[value] = [list.next[value]]; + list.prev[value] = [list.prev[value]]; + } else if(typeof list.next[value] === "undefined") { + // list.next[value] must be undefined. + // Special case. List already has 1 value. It's at the end. + list.next[value] = []; + list.prev[value] = [list.prev[value]]; + } + list.prev[value].push(list.last); + // We do NOT append a new value onto "next" list. Iteration will + // figure out it must point to End-of-List on its own. + } else { + list.prev[value] = list.last; + } + // Make the old last point to this new one. + if(typeof list.next[list.last] === "object") { + list.next[list.last].push(value); + } else { + list.next[list.last] = value; + } + } + list.last = value; list.length += 1; }; +function _assertString(value) { + if(typeof value !== "string") { + throw "Linked List only accepts string values, not " + value; + } +}; + exports.LinkedList = LinkedList; })(); diff --git a/editions/test/tiddlers/tests/test-linked-list.js b/editions/test/tiddlers/tests/test-linked-list.js index 0cef342d0..cf16fb91c 100644 --- a/editions/test/tiddlers/tests/test-linked-list.js +++ b/editions/test/tiddlers/tests/test-linked-list.js @@ -8,10 +8,18 @@ Tests the utils.LinkedList class. LinkedList was built to behave exactly as $tw.utils.pushTop and Array.prototype.push would behave with an array. -Many of these tests function by performing operations on a LinkedList while -performing the equivalent actions on an array with the old utility methods. +Many of these tests function by performing operations on a paired set of +an array and LinkedList. It uses equivalent actions on both. Then we confirm that the two come out functionally identical. +NOTE TO FURTHER LINKED LIST DEVELOPERS: + + If you want to add new functionality, like 'shift' or 'unshift', you'll + probably need to deal with the fact that Linked List will insert undefined + as a first entry into an item's 'prev' array when it's at the front of + the list, but it doesn't do the same for the 'next' array when it's at + the end. I think you'll probably be better off preventing 'prev' from ever + adding undefined. \*/ (function(){ @@ -21,127 +29,230 @@ Then we confirm that the two come out functionally identical. describe("LinkedList class tests", function() { + // creates and initializes a new {array, list} pair for testing + function newPair(initialArray) { + var pair = {array: [], list: new $tw.utils.LinkedList()}; + if (initialArray) { + push(pair, initialArray); + } + return pair; + }; + // pushTops a value or array of values into both the array and linked list. - function pushTop(array, linkedList, valueOrValues) { - $tw.utils.pushTop(array, valueOrValues); - linkedList.pushTop(valueOrValues); + function pushTop(pair, valueOrValues) { + pair.list.pushTop(valueOrValues); + $tw.utils.pushTop(pair.array, valueOrValues); + return pair; }; // pushes values into both the array and the linked list. - function push(array, linkedList/*, other values */) { - var values = Array.prototype.slice(arguments, 2); - array.push.apply(array, values); - linkedList.push.apply(linkedList, values); + function push(pair, values) { + pair.list.push(values); + pair.array.push.apply(pair.array, values); + return pair; }; // operates a remove action on an array and a linked list in parallel. - function remove(array, linkedList, valueOrValues) { - $tw.utils.removeArrayEntries(array, valueOrValues); - linkedList.remove(valueOrValues); + function remove(pair, valueOrValues) { + pair.list.remove(valueOrValues); + $tw.utils.removeArrayEntries(pair.array, valueOrValues); + return pair; }; // compares an array and a linked list to make sure they match up - function compare(array, linkedList) { - expect(linkedList.toArray()).toEqual(array); - expect(linkedList.length).toBe(array.length); + function compare(pair) { + expect(pair.list.toArray()).toEqual(pair.array); + expect(pair.list.length).toBe(pair.array.length); + return pair; }; it("can pushTop", function() { - var array = []; - var list = new $tw.utils.LinkedList(); - push(array, list, 'A', 'B', 'C'); + var pair = newPair(["A", "B", "C"]); // singles - pushTop(array, list, 'X'); - pushTop(array, list, 'B'); - compare(array, list); // A C X B + pushTop(pair, "X"); + pushTop(pair, "B"); + compare(pair); // ACXB //arrays - pushTop(array, list, ['X', 'A', 'G', 'A']); + pushTop(pair, ["X", "A", "G", "A"]); // If the pushedTopped list has duplicates, they go in unempeded. - compare(array, list); // C B X A G A + compare(pair); // CBXAGA }); it("can pushTop with tricky duplicates", function() { - var array = []; - var list = new $tw.utils.LinkedList(); - push(array, list, 'A', 'B', 'A', 'C', 'A', 'end'); + var pair = newPair(["A", "B", "A", "C", "A", "e"]); // If the original list contains duplicates, only one instance is cut - pushTop(array, list, 'A'); - compare(array, list); // B A C A end A + compare(pushTop(pair, "A")); // BACAeA // And the Llist properly knows the next 'A' to cut if pushed again - pushTop(array, list, ['X', 'A']); - compare(array, list); // B C A end A X A + compare(pushTop(pair, ["X", "A"])); // BCAeAXA // One last time, to make sure we maintain the linked chain of copies - pushTop(array, list, 'A'); - compare(array, list); // B C end A X A A + compare(pushTop(pair, "A")); // BCeAXAA + }); + + it("can pushTop a single-value list with itself", function() { + // This simple case actually requires special handling in LinkedList. + compare(pushTop(newPair(["A"]), "A")); // A + }); + + it("can remove all instances of a multi-instance value", function() { + var pair = compare(remove(newPair(["A", "A"]), ["A", "A"])); // + // Now add 'A' back in, since internally it might be using arrays, + // even though those arrays must be empty. + compare(pushTop(pair, "A")); // A + // Same idea, but push something else before readding 'A' + compare(pushTop(remove(newPair(["A", "A"]), ["A", "A"]), ["B", "A"])); // BA + + // Again, but this time with other values mixed in + compare(remove(newPair(["B", "A", "A", "C"]), ["A", "A"])) // BC; + // And again, but this time with value inbetween too. + compare(remove(newPair(["B", "A", "X", "Y", "Z", "A", "C"]), ["A", "A"])); // BXYZC + + // One last test, where removing a pair from the end could corrupt + // list.last. + pair = remove(newPair(["D", "C", "A", "A"]), ["A", "A"]); + // But I can't figure out another way to test this. It's wrong + // for list.last to be anything other than a string, but I + // can't figure out how to make that corruption manifest a problem. + // So I dig into its private members. Bleh... + expect(typeof pair.list.last).toBe("string"); + }); + + it("can pushTop value linked to by a repeat item", function() { + var pair = newPair(["A", "B", "A", "C", "A", "C", "D"]); + // This is tricky because that 'C' is referenced by a second 'A' + // It WAS a crash before + pushTop(pair, "C"); + compare(pair); // ABAACDC + }); + + it("can pushTop last value after pair", function() { + // The 'next' ptrs for A would be polluted with an extraneous + // undefined after the pop, which would make pushing the 'X' + // back on problematic. + compare(pushTop(newPair(["A", "A", "X"]), "X")); // AACX + // And lets try a few other manipulations around pairs + compare(pushTop(newPair(["A", "A", "X", "C"]), "X")); // AACX + compare(pushTop(newPair(["X", "A", "A"]), "X")); // AAX + compare(pushTop(newPair(["C", "X", "A", "A"]), "X")); // CAAX }); it("can handle particularly nasty pushTop pitfall", function() { - var array = []; - var list = new $tw.utils.LinkedList(); - push(array, list, 'A', 'B', 'A', 'C'); - pushTop(array, list, 'A'); // BACA - pushTop(array, list, 'X'); // BACAX - remove(array, list, 'A'); // BCAX - pushTop(array, list, 'A'); // BCXA - remove(array, list, 'A'); // BCX + var pair = newPair(["A", "B", "A", "C"]); + pushTop(pair, "A"); // BACA + pushTop(pair, "X"); // BACAX + remove(pair, "A"); // BCAX + pushTop(pair, "A"); // BCXA + remove(pair, "A"); // BCX // But! The way I initially coded the copy chains, a mystery A could // hang around. - compare(array, list); // B C X + compare(pair); // BCX + }); + + it("can handle past-duplicate items when pushing", function() { + var pair = newPair(["X", "Y", "A", "C", "A"]); + // Removing an item, when it has a duplicat at the list's end + remove(pair, "A"); + compare(pair); // XYCA + // This actually caused an infinite loop once. So important test here. + push(pair, ["A"]); + compare(pair); // XYCAA + pushTop(pair, "A") // switch those last As + compare(pair); // XYCAA + remove(pair, ["A", "A"]); // Remove all As, then add them back + pushTop(pair, ["A", "A"]) + compare(pair); // XYCAA }); it("can push", function() { - var array = []; var list = new $tw.utils.LinkedList(); - push(array, list, 'A', 'B', 'C'); // singles - push(array, list, 'B'); - compare(array, list); // A B C B - + expect(list.push("A")).toBe(1); + expect(list.push("B")).toBe(2); // multiple args - push(array, list, 'A', 'B', 'C'); - compare(array, list); // A B C B A B C + expect(list.push("C", "D", "E")).toBe(5); + // array arg allowed + expect(list.push(["F", "G"])).toBe(7); + // No-op + expect(list.push()).toBe(7); + expect(list.toArray()).toEqual(["A", "B", "C", "D", "E", "F", "G"]); + }); + + it("can handle empty string", function() { + compare(newPair(["", "", ""])); // ___ + compare(push(newPair([""]), [""])); // __ + compare(pushTop(newPair(["", "", ""]), ["A", ""])); // __A_ + compare(remove(newPair(["", "A"]), "A")); // _ + compare(push(newPair(["", "A"]), ["A"])); // _AA + compare(remove(newPair(["A", ""]), "A")); // _ + compare(push(newPair(["A", ""]), ["A"])); // A_A + + // This one is tricky but precise. Remove 'B', and 'A' might mistake + // it as being first in the list since it's before ''. 'C' would get + // blasted from A's prev reference array. + compare(remove(newPair(["C", "A", "", "B", "A"]), ["B", "A"])); // C_A + // Same idea, but with A mistaking B for being at the list's end, and + // thus removing C from its 'next' reference array. + compare(remove(newPair(["A", "B", "", "A", "C"]), ["B", "A"])); // _AC + }); + + it("will throw if told to push non-strings", function() { + var message = "Linked List only accepts string values, not "; + var list = new $tw.utils.LinkedList(); + expect(() => list.push(undefined)).toThrow(message + "undefined"); + expect(() => list.pushTop(undefined)).toThrow(message + "undefined"); + expect(() => list.pushTop(["c", undefined])).toThrow(message + "undefined"); + expect(() => list.pushTop(5)).toThrow(message + "5"); + expect(() => list.pushTop(null)).toThrow(message + "null"); + + // now lets do a quick test to make sure this exception + // doesn't leave any side-effects + // A.K.A Strong guarantee + var pair = newPair(["A", "5", "B", "C"]); + expect(() => pushTop(pair, 5)).toThrow(message + "5"); + compare(pair); + expect(() => push(pair, ["D", 7])).toThrow(message + "7"); + compare(pair); + expect(() => remove(pair, 5)).toThrow(message + "5"); + compare(pair); + // This is the tricky one. 'A' and 'B' should not be removed or pushed. + expect(() => pushTop(pair, ["A", "B", null])).toThrow(message + "null"); + compare(pair); + expect(() => remove(pair, ["A", "B", null])).toThrow(message + "null"); + compare(pair); }); it("can clear", function() { var list = new $tw.utils.LinkedList(); - list.push('A', 'B', 'C'); + list.push("A", "B", "C"); list.clear(); expect(list.toArray()).toEqual([]); expect(list.length).toBe(0); }); it("can remove", function() { - var array = []; var list = new $tw.utils.LinkedList(); - push(array, list, 'A', 'x', 'C', 'x', 'D', 'x', 'E', 'x'); + list.push(["A", "x", "C", "x", "D", "x", "E", "x"]); // single - remove(array, list, 'x'); - compare(array, list); // A C x D x E x - + list.remove("x"); // arrays - remove(array, list, ['x', 'A', 'x']); - compare(array, list); // C D E x + list.remove(["x", "A", "XXX", "x"]); + expect(list.toArray()).toEqual(["C", "D", "E", "x"]); }); - it('can ignore removal of nonexistent items', function() { - var array = []; - var list = new $tw.utils.LinkedList(); - push(array, list, 'A', 'B', 'C', 'D'); + it("can ignore removal of nonexistent items", function() { + var pair = newPair(["A", "B", "C", "D"]); // single - remove(array, list, 'Z'); - compare(array, list); // A B C D + compare(remove(pair, "Z")); // ABCD // array - remove(array, list, ['Z', 'B', 'X']); - compare(array, list); // A C D + compare(remove(pair, ["Z", "B", "X"])); // ACD }); - it('can iterate with each', function() { + it("can iterate with each", function() { var list = new $tw.utils.LinkedList(); - list.push('0', '1', '2', '3'); + list.push("0", "1", "2", "3"); var counter = 0; list.each(function(value) { expect(value).toBe(counter.toString()); @@ -149,6 +260,11 @@ describe("LinkedList class tests", function() { }); expect(counter).toBe(4); }); + + it("can iterate a list of the same item", function() { + // Seems simple. Caused an infinite loop during development. + compare(newPair(["A", "A"])); + }); }); })(); From b8a9826f23b2bdd6c3345ab93db6b53f7e6e2ae8 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Sat, 9 Jan 2021 15:53:17 -0500 Subject: [PATCH 1192/2376] Cleaned up jasmine test suite output (#5377) * Cleaned up jasmine test suite output Also testing for expected log messages, instead of just letting them print to the console every single time, constantly making you think there's some warning you need to worry about, and making all those dots not line up nicely. * switched single quotes to double in collectLogs --- editions/test/tiddlers/tests/test-filters.js | 26 ++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 0dbb9723b..a820c4d04 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -14,6 +14,22 @@ Tests the filtering mechanism. /* global $tw, require */ "use strict"; +// This wrapper method is used to collect warnings which should be emitted +// by certain deprecated tests. +function collectLog(block) { + var messages = []; + var oldLog = console.log; + console.log = function(a) { + messages.push(Array.prototype.join.call(arguments, " ")); + } + try { + block(); + } finally { + console.log = oldLog; + } + return messages; +}; + describe("Filter tests", function() { // Test filter parsing @@ -249,8 +265,14 @@ function runTests(wiki) { // The following 2 tests should write a log -> WARNING: Filter modifier has a deprecated regexp operand XXXX // The test should pass anyway. it("should handle the field operator with a regular expression operand", function() { - expect(wiki.filterTiddlers("[modifier/JoeBloggs/]").join(",")).toBe("TiddlerOne"); - expect(wiki.filterTiddlers("[modifier/Jo/]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + var warnings = collectLog(function() { + expect(wiki.filterTiddlers("[modifier/JoeBloggs/]").join(",")).toBe("TiddlerOne"); + }); + expect(warnings).toEqual(["WARNING: Filter modifier has a deprecated regexp operand /JoeBloggs/"]); + warnings = collectLog(function() { + expect(wiki.filterTiddlers("[modifier/Jo/]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + }); + expect(warnings).toEqual(["WARNING: Filter modifier has a deprecated regexp operand /Jo/"]); }); it("should handle the prefix operator", function() { From 65ffe96cc2be7e0a441daf69179850409c37de20 Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Wed, 13 Jan 2021 11:18:27 +0100 Subject: [PATCH 1193/2376] Fix broken aria-label in $:/PaletteManager (#5397) --- core/ui/PaletteManager.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/PaletteManager.tid b/core/ui/PaletteManager.tid index eb6968a84..e9953729f 100644 --- a/core/ui/PaletteManager.tid +++ b/core/ui/PaletteManager.tid @@ -46,7 +46,7 @@ title: $:/PaletteManager <tr> <td> <span style="float:right;"> -<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label=<<lingo Delete/Hint>> class="tc-btn-invisible" actions=<<delete-colour-index-actions>>> +<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} class="tc-btn-invisible" actions=<<delete-colour-index-actions>>> {{$:/core/images/delete-button}}</$button> </span> ''<$macrocall $name="describePaletteColour" colour=<<colourName>>/>''<br/> From ca95f1069fae5223022ad3756366aeab79c9d48f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 13 Jan 2021 11:48:42 +0000 Subject: [PATCH 1194/2376] Fixed comment parsers to match end marker correctly Fixes #5396 --- core/modules/parsers/wikiparser/rules/commentblock.js | 2 +- core/modules/parsers/wikiparser/rules/commentinline.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/parsers/wikiparser/rules/commentblock.js b/core/modules/parsers/wikiparser/rules/commentblock.js index 84ee897ba..b7651c272 100644 --- a/core/modules/parsers/wikiparser/rules/commentblock.js +++ b/core/modules/parsers/wikiparser/rules/commentblock.js @@ -31,7 +31,7 @@ exports.findNextMatch = function(startPos) { this.matchRegExp.lastIndex = startPos; this.match = this.matchRegExp.exec(this.parser.source); if(this.match) { - this.endMatchRegExp.lastIndex = startPos + this.match[0].length; + this.endMatchRegExp.lastIndex = this.match.index + this.match[0].length; this.endMatch = this.endMatchRegExp.exec(this.parser.source); if(this.endMatch) { return this.match.index; diff --git a/core/modules/parsers/wikiparser/rules/commentinline.js b/core/modules/parsers/wikiparser/rules/commentinline.js index 6e697e6c0..671bd79d6 100644 --- a/core/modules/parsers/wikiparser/rules/commentinline.js +++ b/core/modules/parsers/wikiparser/rules/commentinline.js @@ -31,7 +31,7 @@ exports.findNextMatch = function(startPos) { this.matchRegExp.lastIndex = startPos; this.match = this.matchRegExp.exec(this.parser.source); if(this.match) { - this.endMatchRegExp.lastIndex = startPos + this.match[0].length; + this.endMatchRegExp.lastIndex = this.match.index + this.match[0].length; this.endMatch = this.endMatchRegExp.exec(this.parser.source); if(this.endMatch) { return this.match.index; From a8457f7f9ef287f66469995b2b4d273830abfdbb Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Wed, 13 Jan 2021 13:51:48 +0100 Subject: [PATCH 1195/2376] Add a community resource tiddler documenting Projectify (#5372) --- .../Projectify by Nicolas Petton.tid | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid diff --git a/editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid b/editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid new file mode 100644 index 000000000..a65a29775 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid @@ -0,0 +1,20 @@ +created: 202101061831 +modified: 20210110204503082 +tags: [[Community Plugins]] +title: Projectify by Nicolas Petton +type: text/vnd.tiddlywiki +url: https://projectify.wiki + +Project & todo management for TiddlyWiki. + +{{!!url}} + +Projectify is a TiddlyWiki plugin for managing projects & todo lists, +inspired by products like [[Todoist|https://todoist.com]] and [[Basecamp|https://basecamp.com]]. + +Projectify features: + +* An inbox for collecting tasks and thoughts +* Projects to structure tasks together into separate todo-lists +* Support for scheduling tasks +* A dashboard to quickly view all projects, the inbox, or scheduled tasks From 17b4f53ba27fbf09b531f8fcb2e8dd2bfbf507c4 Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Fri, 15 Jan 2021 11:37:55 +0100 Subject: [PATCH 1196/2376] Add server sent events (#5279) * Create server-sent-events.js * Create sse-change-listener.js * Implement server sent events * Convert to ES5 and wrap in function * Use the host string from tiddlyweb * Improve comments in sse-server.js * Can't use object reference as key * Add retry timeout * Fix a bug * bug fix * Fix formatting * Fix ES5 compat * capitalize comments * more fixes * Refactor tiddlywek/sse-server.js * Extract helper functions for handling wikis and connections. * Replace JSDoc comments. * Fix formatting according to TW core. * Simplify the logic for adding and removing connections. * Fix formatting of tiddlyweb/sse-client.js Fix formatting according to TW core. * Fix formatting of server-sent-events.js Fix formatting and comments following TW core guidelines. * Extract a debounce function in sse-client.js * Avoid using startsWith in server-sent-events.js startsWith is part of ES2015, while TiddlyWiki uses the 5.1 dialect. * New sse-enabled WebServer parameter * If not set to "yes", disabled SSE request handling. * Add documentation for the parameter in core/language/en-GB/Help/listen.tid * Add new tiddler editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid * Disable polling for changes if SSE is enabled * Add sse_enabled to /status JSON response * Store syncer polling status in $:/config/SyncDisablePolling * Handled disabling polling in core/modules/syncer.js * Simply boolean logic in syncer.js * Delete trailing whitespaces in syncer.js Co-authored-by: Arlen22 <arlenbee@gmail.com> --- core/language/en-GB/Help/listen.tid | 1 + core/modules/server/routes/get-status.js | 1 + core/modules/server/server-sent-events.js | 70 ++++++++++++++ core/modules/syncer.js | 39 ++++---- .../WebServer Parameter_ sse-enabled.tid | 11 +++ plugins/tiddlywiki/tiddlyweb/sse-client.js | 53 +++++++++++ plugins/tiddlywiki/tiddlyweb/sse-server.js | 94 +++++++++++++++++++ .../tiddlywiki/tiddlyweb/tiddlywebadaptor.js | 4 +- 8 files changed, 256 insertions(+), 17 deletions(-) create mode 100644 core/modules/server/server-sent-events.js create mode 100644 editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid create mode 100644 plugins/tiddlywiki/tiddlyweb/sse-client.js create mode 100644 plugins/tiddlywiki/tiddlyweb/sse-server.js diff --git a/core/language/en-GB/Help/listen.tid b/core/language/en-GB/Help/listen.tid index 88208ea29..7b2c78cbe 100644 --- a/core/language/en-GB/Help/listen.tid +++ b/core/language/en-GB/Help/listen.tid @@ -22,6 +22,7 @@ All parameters are optional with safe defaults, and can be specified in any orde * ''readers'' - comma separated list of principals allowed to read from this wiki * ''writers'' - comma separated list of principals allowed to write to this wiki * ''csrf-disable'' - set to "yes" to disable CSRF checks (defaults to "no") +* ''sse-enabled'' - set to "yes" to enable Server-sent events (defaults to "no") * ''root-tiddler'' - the tiddler to serve at the root (defaults to "$:/core/save/all") * ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to "text/plain") * ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to "text/html") diff --git a/core/modules/server/routes/get-status.js b/core/modules/server/routes/get-status.js index 0da5cb70f..c570c090b 100644 --- a/core/modules/server/routes/get-status.js +++ b/core/modules/server/routes/get-status.js @@ -22,6 +22,7 @@ exports.handler = function(request,response,state) { username: state.authenticatedUsername || state.server.get("anon-username") || "", anonymous: !state.authenticatedUsername, read_only: !state.server.isAuthorized("writers",state.authenticatedUsername), + sse_enabled: state.server.get("sse-enabled") === "yes", space: { recipe: "default" }, diff --git a/core/modules/server/server-sent-events.js b/core/modules/server/server-sent-events.js new file mode 100644 index 000000000..377d64c7f --- /dev/null +++ b/core/modules/server/server-sent-events.js @@ -0,0 +1,70 @@ +/*\ +title: $:/core/modules/server/server-sent-events.js +type: application/javascript +module-type: library +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +parameters: + prefix - usually the plugin path, such as `plugins/tiddlywiki/tiddlyweb`. The + route will match `/events/${prefix}` exactly. + + handler - a function that will be called each time a request comes in with the + request and state from the route and an emit function to call. +*/ + +var ServerSentEvents = function ServerSentEvents(prefix, handler) { + this.handler = handler; + this.prefix = prefix; +}; + +ServerSentEvents.prototype.getExports = function() { + return { + bodyFormat: "stream", + method: "GET", + path: new RegExp("^/events/" + this.prefix + "$"), + handler: this.handleEventRequest.bind(this) + }; +}; + +ServerSentEvents.prototype.handleEventRequest = function(request,response,state) { + if(ServerSentEvents.prototype.isEventStreamRequest(request)) { + response.writeHead(200, { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + "Connection": "keep-alive" + }); + this.handler(request,state,this.emit.bind(this,response),this.end.bind(this,response)); + } else { + response.writeHead(406,"Not Acceptable",{}); + response.end(); + } +}; + +ServerSentEvents.prototype.isEventStreamRequest = function(request) { + return request.headers.accept && + request.headers.accept.match(/^text\/event-stream/); +}; + +ServerSentEvents.prototype.emit = function(response,event,data) { + if(typeof event !== "string" || event.indexOf("\n") !== -1) { + throw new Error("Type must be a single-line string"); + } + if(typeof data !== "string" || data.indexOf("\n") !== -1) { + throw new Error("Data must be a single-line string"); + } + response.write("event: " + event + "\ndata: " + data + "\n\n", "utf8"); +}; + +ServerSentEvents.prototype.end = function(response) { + response.end(); +}; + +exports.ServerSentEvents = ServerSentEvents; + +})(); diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 15374d40a..90ed41032 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -20,6 +20,7 @@ Syncer.prototype.titleIsAnonymous = "$:/status/IsAnonymous"; Syncer.prototype.titleIsReadOnly = "$:/status/IsReadOnly"; Syncer.prototype.titleUserName = "$:/status/UserName"; Syncer.prototype.titleSyncFilter = "$:/config/SyncFilter"; +Syncer.prototype.titleSyncDisablePolling = "$:/config/SyncDisablePolling"; Syncer.prototype.titleSyncPollingInterval = "$:/config/SyncPollingInterval"; Syncer.prototype.titleSyncDisableLazyLoading = "$:/config/SyncDisableLazyLoading"; Syncer.prototype.titleSavedNotification = "$:/language/Notifications/Save/Done"; @@ -89,7 +90,7 @@ function Syncer(options) { if(filteredChanges.length > 0) { self.processTaskQueue(); } else { - // Look for deletions of tiddlers we're already syncing + // Look for deletions of tiddlers we're already syncing var outstandingDeletion = false $tw.utils.each(changes,function(change,title,object) { if(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) { @@ -121,7 +122,7 @@ function Syncer(options) { self.login(username,password,function() {}); } else { // No username and password, so we display a prompt - self.handleLoginEvent(); + self.handleLoginEvent(); } }); $tw.rootWidget.addEventListener("tm-logout",function() { @@ -138,7 +139,7 @@ function Syncer(options) { if(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== "yes") { this.wiki.addEventListener("lazyLoad",function(title) { self.handleLazyLoadEvent(title); - }); + }); } // Get the login status this.getStatus(function(err,isLoggedIn) { @@ -173,8 +174,8 @@ Syncer.prototype.getTiddlerRevision = function(title) { if(this.syncadaptor && this.syncadaptor.getTiddlerRevision) { return this.syncadaptor.getTiddlerRevision(title); } else { - return this.wiki.getTiddler(title).fields.revision; - } + return this.wiki.getTiddler(title).fields.revision; + } }; /* @@ -267,7 +268,7 @@ Syncer.prototype.getStatus = function(callback) { // Mark us as not logged in this.wiki.addTiddler({title: this.titleIsLoggedIn,text: "no"}); // Get login status - this.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) { + this.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous,isPollingDisabled) { if(err) { self.logger.alert(err); } else { @@ -278,6 +279,9 @@ Syncer.prototype.getStatus = function(callback) { if(isLoggedIn) { self.wiki.addTiddler({title: self.titleUserName,text: username || ""}); } + if(isPollingDisabled) { + self.wiki.addTiddler({title: self.titleSyncDisablePolling, text: "yes"}); + } } // Invoke the callback if(callback) { @@ -301,12 +305,15 @@ Syncer.prototype.syncFromServer = function() { } }, triggerNextSync = function() { - self.pollTimerId = setTimeout(function() { - self.pollTimerId = null; - self.syncFromServer.call(self); - },self.pollTimerInterval); + if(pollingEnabled) { + self.pollTimerId = setTimeout(function() { + self.pollTimerId = null; + self.syncFromServer.call(self); + },self.pollTimerInterval); + } }, - syncSystemFromServer = (self.wiki.getTiddlerText("$:/config/SyncSystemTiddlersFromServer") === "yes" ? true : false); + syncSystemFromServer = (self.wiki.getTiddlerText("$:/config/SyncSystemTiddlersFromServer") === "yes"), + pollingEnabled = (self.wiki.getTiddlerText(self.titleSyncDisablePolling) !== "yes"); if(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) { this.logger.log("Retrieving updated tiddler list"); cancelNextSync(); @@ -329,7 +336,7 @@ Syncer.prototype.syncFromServer = function() { }); if(updates.modifications.length > 0 || updates.deletions.length > 0) { self.processTaskQueue(); - } + } } }); } else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) { @@ -509,7 +516,7 @@ Syncer.prototype.processTaskQueue = function() { } else { self.updateDirtyStatus(); // Process the next task - self.processTaskQueue.call(self); + self.processTaskQueue.call(self); } }); } else { @@ -517,11 +524,11 @@ Syncer.prototype.processTaskQueue = function() { this.updateDirtyStatus(); // And trigger a timeout if there is a pending task if(task === true) { - this.triggerTimeout(); + this.triggerTimeout(); } } } else { - this.updateDirtyStatus(); + this.updateDirtyStatus(); } }; @@ -555,7 +562,7 @@ Syncer.prototype.chooseNextTask = function() { isReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved; if(hasChanged) { if(isReadyToSave) { - return new SaveTiddlerTask(this,title); + return new SaveTiddlerTask(this,title); } else { havePending = true; } diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid new file mode 100644 index 000000000..b4ad424c0 --- /dev/null +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid @@ -0,0 +1,11 @@ +caption: sse-enabled +created: 20210113204602693 +modified: 20210113205535065 +tags: [[WebServer Parameters]] +title: WebServer Parameter: sse-enabled +type: text/vnd.tiddlywiki + +The [[web server configuration parameter|WebServer Parameters]] ''sse-enabled'' enabled [[Server sent events|https://en.wikipedia.org/wiki/Server-sent_events]], allowing changes to be propagated in almost real time to all browser windows or tabs. + +Setting ''sse-enabled'' to `yes` enables Server-sent events; `no`, or any other value, disables them. + diff --git a/plugins/tiddlywiki/tiddlyweb/sse-client.js b/plugins/tiddlywiki/tiddlyweb/sse-client.js new file mode 100644 index 000000000..be02133dc --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/sse-client.js @@ -0,0 +1,53 @@ +/*\ +title: $:/plugins/tiddlywiki/tiddlyweb/sse-client.js +type: application/javascript +module-type: startup + +GET /recipes/default/tiddlers/:title + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.name = "/events/plugins/tiddlywiki/tiddlyweb"; +exports.after = ["startup"]; +exports.synchronous = true; +exports.platforms = ["browser"]; +exports.startup = function() { + // Make sure we're actually being used + if($tw.syncadaptor.name !== "tiddlyweb") { + return; + } + // Get the mount point in case a path prefix is used + var host = $tw.syncadaptor.getHost(); + // Make sure it ends with a slash (it usually does) + if(host[host.length - 1] !== "/") { + host += "/"; + } + // Setup the event listener + setupEvents(host); +}; + +function debounce(callback) { + var timeout = null; + return function() { + clearTimeout(timeout); + timeout = setTimeout(callback,$tw.syncer.throttleInterval); + }; +} + +function setupEvents(host) { + var events = new EventSource(host + "events/plugins/tiddlywiki/tiddlyweb"); + var debouncedSync = debounce($tw.syncer.syncFromServer.bind($tw.syncer)); + events.addEventListener("change",debouncedSync); + events.onerror = function() { + events.close(); + setTimeout(function() { + setupEvents(host); + },$tw.syncer.errorRetryInterval); + }; +} +})(); diff --git a/plugins/tiddlywiki/tiddlyweb/sse-server.js b/plugins/tiddlywiki/tiddlyweb/sse-server.js new file mode 100644 index 000000000..a31b8064b --- /dev/null +++ b/plugins/tiddlywiki/tiddlyweb/sse-server.js @@ -0,0 +1,94 @@ +/*\ +title: $:/plugins/tiddlywiki/tiddlyweb/sse-server.js +type: application/javascript +module-type: route + +GET /events/plugins/tiddlywiki/tiddlyweb + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var wikis = []; +var connections = []; + +/* +Setup up the array for this wiki and add the change listener +*/ +function setupWiki(wiki) { + var index = wikis.length; + // Add a new array for this wiki (object references work as keys) + wikis.push(wiki); + connections.push([]); + // Listen to change events for this wiki + wiki.addEventListener("change",function(changes) { + var jsonChanges = JSON.stringify(changes); + getWikiConnections(wiki).forEach(function(item) { + item.emit("change",jsonChanges); + }); + }); + return index; +} + +/* +Setup this particular wiki if we haven't seen it before +*/ +function ensureWikiSetup(wiki) { + if(wikis.indexOf(wiki) === -1) { + setupWiki(wiki); + } +} + +/* +Return the array of connections for a particular wiki +*/ +function getWikiConnections(wiki) { + return connections[wikis.indexOf(wiki)]; +} + +function addWikiConnection(wiki,connection) { + getWikiConnections(wiki).push(connection); +} + +function removeWikiConnection(wiki,connection) { + var wikiConnections = getWikiConnections(wiki); + var index = wikiConnections.indexOf(connection); + if(index !== -1) { + wikiConnections.splice(index,1); + } +} + +function handleConnection(request,state,emit,end) { + if(isDisabled(state)) { + return; + } + + ensureWikiSetup(state.wiki); + // Add the connection to the list of connections for this wiki + var connection = { + request: request, + state: state, + emit: emit, + end: end + }; + addWikiConnection(state.wiki,connection); + request.on("close",function() { + removeWikiConnection(state.wiki,connection); + }); +} + +function isDisabled(state) { + return state.server.get("sse-enabled") !== "yes"; +} + +// Import the ServerSentEvents class +var ServerSentEvents = require("$:/core/modules/server/server-sent-events.js").ServerSentEvents; +// Instantiate the class +var events = new ServerSentEvents("plugins/tiddlywiki/tiddlyweb", handleConnection); +// Export the route definition for this server sent events instance +module.exports = events.getExports(); + +})(); diff --git a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js index 6eff2f64d..135b91055 100644 --- a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js +++ b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js @@ -91,10 +91,12 @@ TiddlyWebAdaptor.prototype.getStatus = function(callback) { self.isLoggedIn = json.username !== "GUEST"; self.isReadOnly = !!json["read_only"]; self.isAnonymous = !!json.anonymous; + + var isSseEnabled = !!json.sse_enabled; } // Invoke the callback if present if(callback) { - callback(null,self.isLoggedIn,json.username,self.isReadOnly,self.isAnonymous); + callback(null,self.isLoggedIn,json.username,self.isReadOnly,self.isAnonymous,isSseEnabled); } } }); From 8344d13efb731106137402d1204dcf666509f90f Mon Sep 17 00:00:00 2001 From: Peter Neumark <neumark.peter@gmail.com> Date: Fri, 15 Jan 2021 13:17:28 +0100 Subject: [PATCH 1197/2376] Add TW5-firebase (#5408) * Added resource tiddler for TW5-firebase * Signing the CLA --- ...5 for Google Firebase by Peter Neumark.tid | 27 +++++++++++++++++++ licenses/cla-individual.md | 2 ++ 2 files changed, 29 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid b/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid new file mode 100644 index 000000000..b86f25c06 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid @@ -0,0 +1,27 @@ +caption: ~TW5-firebase +color: #FFEB3B +community-author: Peter Neumark +created: 20210115121027582 +delivery: Google Firebase backend +description: Google Firebase backend for TiddlyWiki +method: save +modified: 20210115121027582 +tags: Chrome Firefox [[Internet Explorer]] Linux Mac Opera [[Other Resources]] Safari Saving Windows plugins Edge +title: TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark +type: text/vnd.tiddlywiki +url: https://github.com/neumark/TiddlyWiki5 + +Google-Firebase hosted version of TiddlyWiki5. + +{{!!url}} + +<<< +I've been using TiddlyWiki5 with Google Firebase for over a year now. It's stable enough to use on a daily basis. There's a detailed walkthrough of how to create your own instance with lots of screenshots. The entire process takes less than 30 minutes: https://neumark.github.io/tw5-firebase/ + +Please consider this version a proof of concept rather than a polished product! My focus was on multi-device or small-team collaboration: + +* Basic authorization (bags have an access policy determining who can read / write them). +* Multiple wikis can be hosted under a single firebase account. +* It uses Firebase's built-in social auth to log in users. +* Tiddlers are written individually with locking, preventing users overwriting each others' updates. +<<< diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 2f0fc19d2..20c87c7f7 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -434,3 +434,5 @@ Glenn Dixon, @dixonge, 2021/01/03 Russ Thomas, @codacodr, 2021/01/03 +Peter Neumark, @neumark, 2021/01/15 + From afa490a0c1f0fe84f7aec069ef440bb281ffacca Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Fri, 15 Jan 2021 13:20:22 +0100 Subject: [PATCH 1198/2376] Fix a typo in WebServer Parameter_ sse-enabled.tid (#5407) --- .../tiddlers/webserver/WebServer Parameter_ sse-enabled.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid index b4ad424c0..cdcdee008 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer Parameter_ sse-enabled.tid @@ -1,11 +1,11 @@ caption: sse-enabled created: 20210113204602693 -modified: 20210113205535065 +modified: 20210115120126953 tags: [[WebServer Parameters]] title: WebServer Parameter: sse-enabled type: text/vnd.tiddlywiki -The [[web server configuration parameter|WebServer Parameters]] ''sse-enabled'' enabled [[Server sent events|https://en.wikipedia.org/wiki/Server-sent_events]], allowing changes to be propagated in almost real time to all browser windows or tabs. +The [[web server configuration parameter|WebServer Parameters]] ''sse-enabled'' enables [[Server sent events|https://en.wikipedia.org/wiki/Server-sent_events]], allowing changes to be propagated in almost real time to all browser windows or tabs. Setting ''sse-enabled'' to `yes` enables Server-sent events; `no`, or any other value, disables them. From 82b7167d55274fa6a0a75b7e5b40fa5359ba391c Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Fri, 15 Jan 2021 13:20:55 +0100 Subject: [PATCH 1199/2376] Update the Notebook theme tiddler (#5387) * Update the title to be shorter. * Update the description to follow the description on https://nicolas.petton.fr/tw/notebook.html. --- .../community/themes/Notebook theme by Nicolas Petton.tid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid b/editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid index 7d505a41e..c31316239 100644 --- a/editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid +++ b/editions/tw5.com/tiddlers/community/themes/Notebook theme by Nicolas Petton.tid @@ -1,11 +1,11 @@ created: 20210101154635213 -modified: 20210101201435693 +modified: 20210110210929321 tags: [[Community Themes]] -title: "Notebook, a clean, uncluttered theme for TiddlyWiki" by Nicolas Petton +title: "Notebook theme" by Nicolas Petton type: text/vnd.tiddlywiki url: https://nicolas.petton.fr/tw/notebook.html -A theme that give TiddlyWiki a modern look. +Notebook is a clean, uncluttered theme for ~TiddlyWiki. {{!!url}} @@ -16,4 +16,4 @@ Notebook is a clean, uncluttered theme for TiddlyWiki. * Notebook comes with 3 default colour palettes, a grey, beige and dark one. To switch between colour palettes, click the color palette switch button in the top bar. * Notebook uses a custom left sidebar, with another sticky bar at the top of the page (or at the bottom on mobile). -<<< \ No newline at end of file +<<< From ce8c03250cc2307fa12a992176629140c8391ab7 Mon Sep 17 00:00:00 2001 From: Peter Neumark <neumark.peter@gmail.com> Date: Fri, 15 Jan 2021 17:52:44 +0100 Subject: [PATCH 1200/2376] Other Resources: fixed TW5-firebase URL (#5411) --- ...rebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid b/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid index b86f25c06..ec5d60f58 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid @@ -9,7 +9,7 @@ modified: 20210115121027582 tags: Chrome Firefox [[Internet Explorer]] Linux Mac Opera [[Other Resources]] Safari Saving Windows plugins Edge title: TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark type: text/vnd.tiddlywiki -url: https://github.com/neumark/TiddlyWiki5 +url: https://github.com/neumark/tw5-firebase Google-Firebase hosted version of TiddlyWiki5. From ffc8feea0cb12e9104ba9729a1db487b76c516f5 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sat, 16 Jan 2021 00:54:03 +0800 Subject: [PATCH 1201/2376] Update chinese help text for parameters of `listen` command (#5410) * Improve help text for "csrf-disable" * Add help text for "sse-enabled" --- languages/zh-Hans/Help/listen.tid | 1 + languages/zh-Hant/Help/listen.tid | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/languages/zh-Hans/Help/listen.tid b/languages/zh-Hans/Help/listen.tid index 5fd567ff5..93b01db8f 100644 --- a/languages/zh-Hans/Help/listen.tid +++ b/languages/zh-Hans/Help/listen.tid @@ -22,6 +22,7 @@ listen 命令使用[[命名的命令参数|NamedCommandParameters]]: * ''readers'' - 允许读取此维基的主体,以逗号分隔的清单 * ''writers'' - 允许写入此维基的主体,以逗号分隔的清单 * ''csrf-disable'' - 设置为 "yes" 以禁用 CSRF 检查 (默认为 "no") +* ''sse-enabled'' - 设置为 "yes" 以启用服务器传送的事件 (默认为 "no") * ''root-tiddler'' - 服务的基本条目 (默认为 "$:/core/save/all") * ''root-render-type'' - 呈现的基本条目的内容类型 (默认为 "text/plain") * ''root-serve-type'' - 服务的基本条目的内容类型 (默认为 "text/html") diff --git a/languages/zh-Hant/Help/listen.tid b/languages/zh-Hant/Help/listen.tid index 10c5fbe14..8c3a9bd63 100644 --- a/languages/zh-Hant/Help/listen.tid +++ b/languages/zh-Hant/Help/listen.tid @@ -21,7 +21,8 @@ listen 命令使用[[命名的命令參數|NamedCommandParameters]]: * ''authenticated-user-header'' - 可選的標頭名稱,用於受信任身份驗證 * ''readers'' - 允許讀取此維基的主體,以逗號分隔的清單 * ''writers'' - 允許寫入此維基的主體,以逗號分隔的清單 -* ''csrf-disable'' - 設置為 "yes" 以禁用 CSRF 檢查 (預設為 "no") +* ''csrf-disable'' - 設定為 "yes" 以停用 CSRF 檢查 (預設為 "no") +* ''sse-enabled'' - 設定為 "yes" 以啟用伺服器傳送的事件 (預設為 "no") * ''root-tiddler'' - 服務的基本條目 (預設為 "$:/core/save/all") * ''root-render-type'' - 呈現的基本條目的內容類型 (預設為 "text/plain") * ''root-serve-type'' - 服務的基本條目的內容類型 (預設為 "text/html") From b205da20079aa102381a646534b56710c7aac448 Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Fri, 15 Jan 2021 17:55:52 +0100 Subject: [PATCH 1202/2376] Minor cleanup of startup.js (#5409) * Remove unused var declaration * Remove trailing whitespaces --- core/modules/startup/startup.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/modules/startup/startup.js b/core/modules/startup/startup.js index 781852cea..f681b71d1 100755 --- a/core/modules/startup/startup.js +++ b/core/modules/startup/startup.js @@ -23,7 +23,6 @@ var PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = "$:/config/Performance/Instrument var widget = require("$:/core/modules/widgets/widget.js"); exports.startup = function() { - var modules,n,m,f; // Minimal browser detection if($tw.browser) { $tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent)); @@ -66,10 +65,10 @@ exports.startup = function() { // Execute any startup actions $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction"); if($tw.browser) { - $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction/Browser"); + $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction/Browser"); } if($tw.node) { - $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction/Node"); + $tw.rootWidget.invokeActionsByTag("$:/tags/StartupAction/Node"); } // Kick off the language manager and switcher $tw.language = new $tw.Language(); From 7be1e7e5f8c9e7074e0f14696217beee10f2218d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 16 Jan 2021 15:37:50 +0000 Subject: [PATCH 1203/2376] Xlsx-utils: Fix crash when using deserializer Fixes #5400 (broken in #4601) --- plugins/tiddlywiki/xlsx-utils/deserializer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/xlsx-utils/deserializer.js b/plugins/tiddlywiki/xlsx-utils/deserializer.js index 94a4249dc..250184d23 100644 --- a/plugins/tiddlywiki/xlsx-utils/deserializer.js +++ b/plugins/tiddlywiki/xlsx-utils/deserializer.js @@ -20,7 +20,8 @@ exports["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"] = f var results = [], XLSXImporter = require("$:/plugins/tiddlywiki/xlsx-utils/importer.js").XLSXImporter, importer = new XLSXImporter({ - text: text + text: text, + wiki: $tw.wiki }); // Return the output tiddlers return importer.getResults(); From 36de5f65ff3a0e11c986941a7a035ae4c7c32cd9 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 16 Jan 2021 15:39:05 +0000 Subject: [PATCH 1204/2376] Core plugin images: Add missing classes --- core/images/plugin-generic-language.tid | 2 +- core/images/plugin-generic-plugin.tid | 2 +- core/images/plugin-generic-theme.tid | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/images/plugin-generic-language.tid b/core/images/plugin-generic-language.tid index 64b310872..5c777d98d 100755 --- a/core/images/plugin-generic-language.tid +++ b/core/images/plugin-generic-language.tid @@ -1,4 +1,4 @@ title: $:/core/images/plugin-generic-language tags: $:/tags/Image -<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg> \ No newline at end of file +<svg width="22pt" height="22pt" viewBox="0 0 128 128" class="tc-image-plugin-generic-language tc-image-button"><path fill-rule="evenodd" d="M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg> \ No newline at end of file diff --git a/core/images/plugin-generic-plugin.tid b/core/images/plugin-generic-plugin.tid index 94988e2ca..ab2e6670e 100755 --- a/core/images/plugin-generic-plugin.tid +++ b/core/images/plugin-generic-plugin.tid @@ -1,4 +1,4 @@ title: $:/core/images/plugin-generic-plugin tags: $:/tags/Image -<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg> \ No newline at end of file +<svg width="22pt" height="22pt" viewBox="0 0 128 128" class="tc-image-plugin-generic-plugin tc-image-button"><path fill-rule="evenodd" d="M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z"/></svg> \ No newline at end of file diff --git a/core/images/plugin-generic-theme.tid b/core/images/plugin-generic-theme.tid index 34dccf18f..9ae3cd779 100755 --- a/core/images/plugin-generic-theme.tid +++ b/core/images/plugin-generic-theme.tid @@ -1,4 +1,4 @@ title: $:/core/images/plugin-generic-theme tags: $:/tags/Image -<svg width="22pt" height="22pt" viewBox="0 0 128 128"><path fill-rule="evenodd" d="M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z"/></svg> \ No newline at end of file +<svg width="22pt" height="22pt" viewBox="0 0 128 128" class="tc-image-plugin-generic-theme tc-image-button"><path fill-rule="evenodd" d="M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z"/></svg> \ No newline at end of file From ae273a08f138dc470cb034cdc9867bb6defc2323 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 16 Jan 2021 16:09:42 +0000 Subject: [PATCH 1205/2376] xlsx-utils: Fix demo spreadsheet Somehow it had an error in it --- .../samples/Presidents and Justices.xlsx | Bin 86814 -> 29448 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/editions/xlsx-utils/tiddlers/samples/Presidents and Justices.xlsx b/editions/xlsx-utils/tiddlers/samples/Presidents and Justices.xlsx index c4bbc298446a421e791e99c8f0def40663a257e7..76470a7d05f4794ff76e920f6cba35f11fd68abf 100644 GIT binary patch delta 22092 zcmb4qbyQs6k~IW(65QS09Rdk%!QDN$Ly!&<2=1=I-CcvbLvVL@x33||@4Z<wYrZ#s z^<}NP`_!r0d)H}h-_#t4?^~cKpCrM+Q9&R<pg}-Dh(O#e;?d2@QK;SkKDRTXb{|8z z`A5!=eZ&i9D$+g}*(4w2d;cqWPB+mvdFSHL8QU><j4GpSk+rJtwnaxa(wbA7ja)<M z{h>wMT~iNpS+>I5Fzgk(N58e2pPV{bNad$8HbR^*dIrCVYN)}yIsLXh%*PaD)nB7x z8^b=?3H{$hM7|)ftQv8}0a%cIw2wuihegVm!iphr5D3yE;ZQ1j&^(sH!5Moi?uXic z73z+=WlCZNDAE?+twvhoaVq7oshWqW__lq_{lIhH*j97&O&z7m+k*Imdn|(9_n5Z? z^n=SON#~Emc+n*V4lw;OL4Mpn$DqPt&A-lIriv_ySvoJcJxu7Mn(6PPVP!qGlDd=j ztfbj!KED;sI!7YrlU<G^wbun>EJ0YQ57T?cx1l)zvd0D~5m*W4KE2c<cy0PFSyUn# zq{mqg1IyC!NE}*d@&pZAEADt8Vti+#=0lP*tfGId*e&-RcwB@uC@Ms?5+lh)Wf>UZ z8-TQI2P3@SvDkxu@AcGTII@tWv!GZbk)r2U@dc#nkW5mX#a0SjWJPQrFi}9W=R^Pe zB5%lEFVWQ+Yf;cUR34HV=VHIOJ6lI6YI3_+5!<5G&bLlems3{>q7tr@PR(J|g>`v9 zB>R?0L?%u@mLreQt6;;RWaIjw^CftxcUwxUE$QEsfKCZ192WbP)pDfoMU5l@rekw< z5d^+-Nga$Qp!M48o6MHD_gWBL-eM~$m~xqw>8ILp6T9jdTKqi!nAD2$=uRh-+$&Ga z`tF8#M6`!2{Su&F#d<oB;@Zgp(^1%a(&rsSkhcW-d-qE)kCbmJCn3c_0di}jo$Rq! z6xIS!9~$2G(f`2kA${-=7|nfL%{}hKfc%`I6i!A3U6oy^K2LeW+04)DL-?y^Jf$*E z_r3QATR<(KL&pB$W6mXMMj#o4-|TT#*0^pdl`Xzy@+AF5q5&56uA}QOgnnM>TIPqT zulhMup)uYzMeKw!K4HVp=6a0{R+8?vn<ingrK-Kw7{i9hT!DL|gf#K$q&<D)0iA@U z9UB~eeQ~-KI30$PjPq=Iy*pp0c>Lpq8j3#u()M;$NAvTi_w$5>54ntdTu;2hm4#tA zGN9^lp7T#$)IWuL-7&ydRBy2r3<SgtC^#gb=3FcooUQH5^{uVV>0K->vXqvsGdYnx z1$LjH&@W@K&uL(&)grRSjH=xNYZea;Hou~{v&C0Rf2f{&e(WaA%3Ac-#vt=++dAi9 zSq?7cuOX|&&sUUE3<zP+n$J)ow^KfRcRznPjx`@Up4AV70YH;JpeQ&9n-F-en}fS8 zd%M>5=Bosm(+@{HlB^2v*pFI)iOP(XXceT`QuQASVxu<-(iP)yT}yC&M3(jQ6Ly}_ zVd^&;VQGCYqB6@yB8;@l@M@t}E&fu)>;|VPzVShUCxH^ECdT0l1*p#&M(CwZG2w<C zZHMUo$~3DOZ2*EsMwdq!#>>xzkw)^A<x_DWA&6Nzw_#eor)to1(@ZWn@?S|k49Wc| zl$pO!6z=$<@%iXo*N!oY6;4RNx4BWMyR2=^P88CuU)&2epy%(mikmTaSq7nGm)hr; zrOuErcBS&Sf|MF6j9_=`p*Lb0;7H5bX-hH^UQ<mgDg!=F)aS8^9g00V8%^nrz=0Ci zw2T9A$f+g~#h@3wA`F>k^Vr6|O^Kz>>?FN;9u-g=KNDw{2!cI~7fH*bg~&w{uB9Eh zoxpR`CCXT-$OoIWo8k^J)+DmrLhvIt8p;;}n~j`iI}`AgWJcitFXz6ock#sHu#xO; z=A2enKLIqUyZeDJhKq_}d?yxAKJVY?Xf0*NTE8cV5YTWLnC(2>p7vVLX&V$@WOQtI zsPD82AI@;SK}n8~ONJTWS<3?lOPTQ+I~vGm$T~DB!{ML><eYZ!X@}OgV&2uKb?Z%> zx3Dy*j3hGUOf8jDW88O!lGAfSP;tfoD8EXv?E%<nfq*%m95M7eK_FidJHx}V&APJ< z(Uv!|kxm>$EJY&FG9tSAIqIjCYvIn&ui6dTbfY8eIHh2iIy)Ec6>N(5bp9}NI&J`e z@7QUKRNvp&j#;AZqppTH#rW{%drHfRl&_zT`<o%}U;g`#ZC_fWKFQMNYABB_Ofrq) zs)_<CuIWnq2kyyOs_O}nX)^Mtj)PBd?29m=zRG|m=5Dc8<~}|V(2v96>I~8YofE{z zc!UEY%Yu&1o<+B0RaE0qZTARKsgLj>vyT~`JhQhgh}FRxIxGbXQACDOM-!@2d?)v5 z#&jY%*fz-L+L6cEo7{iB?ZS`nNLF(NDoaPa<FbI1ry<WP@;D?z4ns=UO@!^@Vc%wz zN4xGKg|*2E5BD||1wxVmek&EjcPZdA%;o7C?z7PcN^w8aq_HDZf@|CXb{Qk(BJ^L8 zQFv9=G6-eJ&<W*m#Cy&0Pf)KSuato=hlC^PTl6s{0RiDf28{|L!UH5Ps@X66ip^QQ z58ZiAUuh;IX5pfuRlyB3)KBe^RL`*Jj`+wXj--Tkx$H)Uk~C-D+Biinqv-0=1d`J! z`*S!<Y-RiT=6+yX1+cUru(0Ie;f&nG&+FoNe%Z0uGhf=;%(F9Bm?ndy&Bv<^cyxKZ zJ=z~?^m%S_<-7^gc>-KN-`$or-U9?4JnheKB(6>_R~Ork!@`!AT3pXhR<Dy7rjbgI zTNd48p3ioVo(3*6ANC)ut?^qHmo)+Ib2|gu9EBYn>l`{I)~)yl*C$s`X$R{^6S?z9 z92m|7Pd9ewm$t1@_emquVP|&)o~@5px>r}59Rjn9ar^gxXTa%UE|RlOOCP;w^P~Iy zO`0qZpUdTD$NWxhsq^)8t7ojv^>W+RT}NT-@#eGg*|Yh%Q7W#^?!ck{eWQP)Y*?w$ zi1k%zLhC~%hlzEG0Pk@?>l2_VN%wr~X=`MDk>ljPM0r44-sYmIbm}^#7~|;R#?_>8 zx#YeUu;A(L3^-Z#KY#X&Y=vrU#eH(1RCBqbIA4C+UWrQ+Sn79nxi0+T2sqzeY-{zd zRY1nYYr5Us&IP}$<pA)hK0oZ8-c4_9oe%l<;M`KTwH5X>TJH|!_FQwM2@L!)N%B!? z?0x#;e0{u_69JFcuX5}3c)2yTJj8L^ZC_|VJ9O#a1DF@EmcVjzCTuLS2HZcM?uK<{ z{>;5^d~UeCyGTrJxj33Sx-tzra%OA|Cgh9_c^-M7fel>_RlyLnajKc`O4`<mdmP!C zcDcNO%5MT(?q7Bc-8YVO9QO1qZ;}lV%!F~Il|0`(n6BPkj<HNT1HN%Is?c?05IniK zG~J)k0vZ_}R*x#((Qfw(8EPASz8XH?9p|<_S3eUMt~lB>aq(*NSzEW<HQjoC2pF93 zJG*x6$Rw~PET6F^G<e>TY@ThM%w5h4+V9!d@oZ_m-;a4{i<o{OY(2HZgk3t)-aJxi zoNMAgeem8?X_#NrX_Q{V>-`$cFZS-~!Kjk^9&kI9c9!(4mpbe5oRaW?@6=PkHsi{! zz=Zya#g5S9Nuo_XO!G+8X?gINrRU4m9>Ji+bDPu+k}>i5z+AS$bt771cwKlyczt-| zr@BuKpXxs~j@FGfjMk4fGS)FRFshx15ML+r1l&p5*UoP&dP(@;G(L(E0(es=%IthN zMhtuP4&C%+l2?XUWTA#~t=Bhcdt?Dt&dW12z3A_Rh{fQ=38_eZHp1V?3sH+9m=V%t z`CNp9G7FJwDC%yw-Hrb|U?211vTL_#A&~RpQs)vaaNY9vIz8O(<x(7CQT8R&5QC0- zB*!7Mkb4_>ydp_bHQyN!?lw3ZmIsa3_%_kR6Z3~_H}}?{J_KaNx2Q2}6o44qE+L=c z*WmCzbTmx0^(I!vMrjA#&=jSiThEUWTckFjT<5_}70=h=pHs`<umquD{{K^TI+oL} zOI)(d0JC3%G#1DJTgUyjG{PbPKgeqUVH_KET$rfVB5Dc;L-ZCv>PH%m8YyTe21-SQ zmgUD9jy^8<r56N?D2k4n@$6|k+iTWxjn-#+Sbp7IAoCqcQA(}w@%9e_5#!WyVwNDs zU@r?IB2w?paPUYWW-&x6Lb5FH$#BSVA#O1wEJ6~)3SnX6X_}T3%t~M>2D`Ojj!hg4 z*^kW3@bB~tw-OXt?kB5fIn7sHdnMi)zGU>jB_w=y=xP?|l*CEJZHLiukCl>PaE*7v zd(nY9#PZ9_1bttVEy%IN`=ziP|6bSxt-h<Z5}Vqg=WV{53D0am^tGk3|2C?}@z5la zf`MPr3}%I$K`$&K6=~E@Rve~4hghfP6-l>kk2p$yRvPl*j4j?7BrZL>yXI@-y&k<p zXCr?zavmv`S-m&kw%|O|q8M1PIV02b`0yk)w%<1r+|Fp(mC+#RVCQ&@<+VGkl?0?Z z9pERNXfH}Va!T2koB6{WZpX~V;E_vxO9tMI!-BfYc(~UQ=VzwFwa3VXw{m+FUUkou z#66U<!pb2#tEbL0Z~|9J!y~mLSUMQ}&wX?+_Z4)#+$RdW?>KGPr@nGh&+hZr*F@)z z`-k6AkJD6A@JPnPaz%~O<FHYUtIbu1G7OEk<WH*E?RPD9A=v4v=coNhtAkkQt#<Pm z8DPMV-!h&=MA@65d0Fz$oh(%2dUI@%3<wh~U5a|#U0!A-+*A5Hs8Hl1lXKz=T@z>m zveQfPK~(ezYRzxWBw@whQbm>1VlqS#<K<|n+>SFI-b>?=YYMZ*rSH)?Z^cHo@n(lg zK~L}+5+r<T&`!{r75!TenwNc154`NlzJM`hwU^cT2e;G_lCZbyOa1*17=O4mGdEUr z_~wU4fwJMSysnY(vIg8I9x1z+VmFWVg~&NQb-cCSsx*0;!VtG&HOAw9L=^Q|8Wtme z7zLsz9Zp;(VQQ&H>vhSFi>i>LRu%uF2s8Y-=8!6S4Totd<Im?09d~fge#1nE<5Frt z<m0iZkx{ywIP}8Y(s0-(XgDWRL?vFAtSf~eDs96GSFT6B%}-yRzMQeIxk6a=e*TG| z=1(p!_R`>&4bhqYRI&J}a<qB5eICxw3NZ|N(40`w;jnj+hGE=`h=OASOe_F_^CdAV zVQ#74ODL^q$FRPTPi4ipA8`VvofTu&DSqZ_lGd!AKG<-6)G0GIm3Rc=gg2yn7o<BH z=fKvvYcEWcJ*1m;jwfzTeP2ySC+xxjaO*TSGB5n54s?h|S6pdCs^(HjFM3myuyv<a z{PVW&$4hPXA^2OtsYVBx_X4ZPzD1od<1oL1!@76Dx>wsRU8aqExa+O56L_cpicS&d ze7C%eRkAShK2dA-ww<k4L+1518u5tXX>VosE@k&>A*~g&E)|+dh*ag|0m_=SbIEY; ztNS)sw3}a29$}jQR-rBx3t-^&mwH#z>tEyC?RC=wLkfHTt?(!swv{O!hC&c6n~JaT z)UOroQb|>IKLjF%^Pksaz%+3vTqPXCr~Ndhv8t);@P&0B$PY)28l%Uip_12AXE5zb ztFcu-t#(UH@=s>0&*fsd>|jhF+DAww+GjQC{o*6~m$lR{jDpC%nNtWXU98c?w`<?1 zfiRZPYO>p@Su^gJK`FUuVODTTbkTb47wHQnfWWzEJtmu5L@DI%s>4$GtPo--4DcK{ z>J;36xkLUE_!$_8?koW3%8$fl)*diyujlfUwH$+^v3A1u-9IT)Q;nOcj|P?UHQ#hM zCpzQXjc;fVndeNF_tC}D4@P_B7%*Ao9I)U8*}k@wF3=$n9d&)bKCg!1Ub~({fSW_X z>65bPQLeJPLK|!@x8{b28G99yO#GZ3^{dg520A38D+2GZ{bg&nPtKCPzVS<XIadnG zRd2`b6TP@f7Ts@0qzZI!LZ4jPuh&(cwYA2vvC2_&3SBg(_fTl-=F-)Qr{a-m!cA7t z_|0{4)Ll+G%9d&SuA+5c&p!L?>pjc?tC4658Omygp`fx6i=q}Tv{xko%O(R?aD1uB zywABh$S%8^i85@FN+p~8$y_H9L$4=blOtCsih&x3B1^2xtTO$<bIus>yn8HQ+adjC zC^|Iio_(03i!*_0-%zxH*ixJ*>IVZ3nS9oIRr=G?V0HyJ_o@uKu|yY)bH$0Y>zXh2 z{kVlGUW(YCOsQTn-D%~p$17gnSQ==T+U2Y-{%TD<Q<pZ#s&F+HF#XN`^FKyL2BbtT z1jLQ8Rib0^LUvukxUF5>S_?4SQA?dfgu_grf`4<LOgtj=MUO1k{oFD~@(VAxlD5mh z3Yb<f4EZ@FGgkj$G1*H7c|SQ?U~y}8*cG^CR0G}U5wAM~(CTKJ@hFs6lK&Et>UDLr zn{E}av<8g61S+&#h1%{5X$aBbfb({#S#t`_TaT{%KOG}~X>HXSjt<R{XVKY90(w+O z_1Ft26pAZx#@E2D#rfF(W&y=Np`rI22~>C#v|S#>b@!R^aFq=AJDu}cHvcLC`D+rz zH{H{LY5G)0=3TPosMpnNqDN$_TQqaFLJ*$+WIz+Bm>ddBL3X~b_=XBUrLr}p?hdzq zZ&E8T$z!&s48)dMK{;9MACA3}v1(1UMfqV67((S((eb$Ht^g|IWZWN$QVP30`Nw@< zIir3`qC?}k1(c#hPoGxcea@TfZ2-ngq=v1`A0Cju@&HZXta`0Z@5kS6xo(x6zgJ)} z>It}(T>Xnl{KCUOnDkvQ#A-yn1`?)IdBMUI4dSm3Xn&Wg(Io5`UoqXY*Um4yF85eF z1z212E>{PA8Y^vIJc^pNf0{<|r(O}cXgceD1;+jS+{LyZl$N8ncYI+VfL!bes1;lN zZD_AlFzpKCExx%!mb8^!ZszZlUziTGry5pXXoBXEvFQ4D)c~`VrD^HL`!W>G&kan# zvTIRRFu`M1(iXV>T;!{2sItU*%misXH_W=G{ejH7JGvx_T?1CQb9VaMZJ<-~OyIxq zn?8ydEq5KF_-2BASl<0`DSQpcn@p5c<fGkTuxluGj3tkH=dc!5g<rQ}e`W)Pc!bQ1 zcgDkvLUbwEb*!JU1R1T3wb@S68EJ4_SQ5e^r{3qk4opflZma$&n!qjajO~cpD#syt zp%K_PURxm=PoOWY`{vXA*81<P<vb6l`lstkUuAYobCd*Y6Zhr0B{_RGJD~!lo2LIy zF(`$(_23%L4P>2LoU9A&fw=8u?TOb$vaavCj}{J=LQ!&R{^`eW{x05@=kn+@a=a7Z zP@tAM^2l0#NkiY+3YbObQ8Mso0CW+OSN8A-TsdwZ6?cxja6-fB?!U(o|0}Mp^)=Z6 znHQxW48I6{CgqRHUg_<y-P3Y}>x{_(6uQ;yZW8Rm$gpNSRp9}tRzywK??FZXQl`-q zg8K&hYjV47AirTGZFQW7IfoR^YL7=)osU0znzdwj{9G$m;r#8QWWv;X6mWYNxt0su zi_HR$^$GGY8jVJ|)`3v8EJk=`{}S1&EjVmbv>dq~7B&8}sW;c>NU!2yVE#vDuaamu zN6`V+l_10PrCk*h9Gd|sjrNs494kovh>Y~l_D>zRT^PMzL`D$2l62M?P^-;^GiR$W zH~eP+ll^Xg+D+hD^*y05OZM6Zzrbp<bw3IP`lj&*9vRxd9i?~?W8fKzj@%Ky(E1<m zYV2KjboljcHm=zT$d`Xy1~{3L(NQ-kS~3=z_s{Er>$l6hFU9epC3EeU0Syc|m@Z*+ z|JL>o1z&PN0O}xUkV7@_o}SqxSv5KdLoe+>HTqAtUhDJ<>%PvPIrt)j*LW<7rSMly zS&RMM7u7%evb%060QReEx3?am-ECQM#dGEuXv`Em+J?h_eVG*KiZU2~Trt88rtGgR zb@xfB*%JSY1|+XE2u!<Ex4jOKd!fOr&GFi<p#iG}9Cv>tPV-0Nd*)qX|79j^mF9U; zA1v|jjUNoiU;-Qa+hs^lcYWz7`(-_ZZzJ4V!C10UwzQpr4I>Q}uAdzZMG3O|J;I1z zM_9(gq)PO<p7F~FMPfOBal{OuBlZLcbN$vT+3WIho_jR?VT<>8@xbwM{Z99V|4qLG zRsNRrRRE})xi6g}8hPoI9Rujq3nESbi&9+vLIOuU(6s&=<Ya$y<-oUuibk-iHI=^x zNBXbWQwv_;0mc_-$dthG3EWJxhr_?v_gc<R(P?*qcDy(vQu&;#vo5cbJMd+4bDo~r z{@ymJctqgDEYQ)+aB3+9Y~%i!FPIc8MkxpXQWE8F;+eE$Jal@nr~YYUevF%FKHST2 zi3|HTXC-|d1H!inrIgOr7*4O=mtFTleQkcA>Bu<!9WZ}}ph=4|?npNa&?SI}hZoHO z55GVD%U~h?GguNz(RwOR2crW~QbV?1WLI4G(na79d_9Ddymk>dQKtjfXI*}K$;jq< zDrY$w@UXewsr<+6DE^Gf^XfI1*UhxcFWBGSd|q#oY+}5xh+AuN|L1r|`f_A3?HX|} z=1dJS0s2B2>a`~SQ2+`90T44x<|XviLI2L*e+QioY`k`B20{YkM7jPECgmTt->TdG zt3CN>>l=+Df%l-zlE9P5*RG5|xB&UAcj&nErv2AA^-8x1Zsx(;OnA)K)Vjwr{mmo; zUFY$RlV>wAJvI1neCV#USE_5}lLiSrc427vG<?dgMOUip<-ZJ4dcK4q;N$SIo7sEU zq<=s{^dM`vx6L~TVzFM|=^n>3m^Q6ExGL=LY%;-M*Tkf^k(x5XU`u&J0;2wP{l8q+ za0zORmO%Npe0dyvgkL_7M@+mY;(x)lm`USM5?qhjPUV8Z-uesszd-$7_cZ{B3eXsB z1j4Q@dX%N&j%_jVnBrWQe?D$DXh|=311u>*gd8@S$awn!!GYQSXRwSgiIy^>=&WaL zKXN0N>%tbI(uWMVO^=|Sn+yu8@2fJlnW{xTKrxuJUY!B(qtf+c{&Qqt7RE^^RS;Sp zHak@N97i2Dq^7C(p6mR9(xIj;4NJ|^c}-aHJqNP3mWU}8S7)wLcpIu~Zd;^o@lgkD zq;8CT_)-;6|GEVH+x36FoZT|C7Az;g{gU{IfZuz?OWp@)K{<ewH9QY3UN{iXo7r%a zT7uJ+5rT;N)JCev2!kf|A6?FF`F<8`2IAfUaR&fbyg45>*(;Wq*dIm=_6GZCmig@8 zu?~ul>b_%*2S*?m^!d*&=abXvD4%>j$ey>_rgc-8$jIim+G?nB+21t)u04hAwl>I4 z@uSGF83M0?u)rmLg9H9^^qYwHHaoWoKf67Crh!}HD~PgQpIW_R9hvDzVb!L6Zpv2= zJIw|8KhhBJLjRiGbO=dL#*?aub007173~Y$_!r^G!vRJ3xbp-Qp~oJpP8%Y&<^C-D zh3ZE6j6pz;e3%jb0H3l;(S_<}`J6#Wk9wFR{yrbOi^auE))35GN&h48-{yjL=T2nS z$ewX*cc0I{IK%ZJ0eE?rJYcM?0P}h_Cj)>H0`0|Co*Nb9!N*eHi~B%+8-auy-W;DT zZQoVAa|i_Ci_P;KYSZ}tl=}ZBlNS{@DIEp*uwS<V>3{gaTNi&qup<d{d1kMdi@*OZ zf^Zc89Kq?u6aJ6N{VlP-;MArrHM+=y2Efm{bmu_~R@AY-{r&&77x3Tc1tij8!2$-9 z<q^PfbYX-GvhB4RT8DTV^&E^5By&w1YSx|tI*lVaQ3pRtWB(^r{Z}RZ53(~!ifY!1 zxnDZ~3_X?(r@A%P62|vz6l$2YUE;Pd>0EvKDEWUCz+bUg%tIXxbsTeWgkemFO}9R{ zKlZFIP91LdB;Bh3AFw!CgDj;E2pu2)evo78{P#gl+ToMk%_D<<;UnN7&4;7);o<PE zHtFE*sdl~;sg!@&J<<WMC06;^^BHn|H;v%9g)hG;L+2QO^U(jcb{Y5xX{om{tYg~l z<CB9kMXB*KL&Y)&U~%#Jei!2T4DkCG3NR{8JVXjOARvlyBQ&6NfT1ADx1mn5pXB#{ zH58N9{&E`p5Kx59^ad0Wq$bfb5imnAW1Yk>8>RMDkpqOaC?q~0R*8x@A|_^9q0bp` z-|*dsfq5X4^>$YpP<Txq-p86E+}9y%?b*Wjuzw>RjzOFdz$v{UYyFEEa9(@8?0HT< z5(ENB+7M_?!00;b0n}Qb?`qP2Y>A;a@{SoXt3if%VsUdxVql>%zSZp4f7^<8@rB14 zgIHn-e8M3HRiGK`TL(uQb-+`7<ozDUe8*DK_3_!xW8>PR*I=$%746Tp#@eoXXY1YR z&t~s}+{%%!O0Bn<;{%NpzjKNSK#?gSZ??H6q9W}I8SjHIpvB$Og2Dp=3>o^-T^{RI zT~cEOtWFq_$DmS5-cc!6k0g*zxF!Zb?edZbdCErp+NPxbGCIW@BYshRB!09l5J-yQ znl#BQEF#Mp6i6J~=E&`_a6xrX9GVU$K6ypV;CqpU!!*<>L@umOQ&-7~MBe8UoP7>^ zZw4PRJRYl3*t_Ee#q0%mvc6NURl6YbR>li7TjhOJi01p4im@ac^-(6sw1Jwodk6Y4 zo}mj>6wZV+ZWiNq%R{#kKx!LkXhU(v#ad}I;`ITUH-NX!|Hg+B<|utBh&75SpO>KQ zvUb^h`w4-yHJ-u1=A3W9haU`(>iL8#ZN#W%EQbs4CIJ4pXp0GWxYv0`Ne;5$MylE6 zSS=a4Fyof>RwysI_c&SHrS|`1ctY@ajNr-Ox!P07YAl!t4l#T_1p7u^Y)yd1dzRXV z)J2a@IF?0L7bZCP#ERsh4&|i(y13z_i7N}ShnOb4rt-^qxNs#@y%dWZgI=!wDJk<d zug0%DVuMXd90vwKU66jo$J9rD-$c>MnkXgtF&`^o+@Shidn)tg14Su<bJp8;UFGM9 zMYP4D^;sEEGO(r^MC^PjJ>i<Dvl@<weq9bN{YI;)?2<)$C@ydlq#-J{#haJZ8;0cQ z!(PT{TWB8yu9-PYiKE^n=0va(5Udxe=9(<*&r78Yb~X(Gf|(E+i&*>3ucvM|I78n( z2oBV9QuWPHuJ2GFrIBDwrv*K_vZ5g&4p8*bzAGLs%E~Z_5ul&Ie3o0!)cU3H5x*_} z;Q{MMusOc$cy3Ll5NSW&r*LGlit`QxrTT=R*{EQHFg_1CXp7cN<R6cr1RSTcf!~pM z+Zla{90iB90IVq_ymt6+dKwe?x!LEr%?TtcmJy$1Mz{w*o<V1-vDO_ZMY|ykP$lz` z(i=yZEDy^+B*=OMw=#o!3S0bK<%c=5bwh534`q&@T?s^ZCmg|loOA4VxX|s<YTu|$ zMCr|9$|XKx-6pE^Gnph@y)A9pa`>A&EPbV_eou2v0pLr?mLOCPRP*dJ3w{++-{q<x z6dV2p?pEnxc7h*X+a9P@i#Cc`2PI?q@&#m@t)Q(dQKj(L350JkX+D6w_|=}T2**LB zH9inR_pVPL7~zfeEhBgYL2BF%-3qdI(6Cy?BEO3iq8<d)eWx6?bCRZVO*G7}grp!4 z)qi_X$_c15A0z7^dAjlnTh>mDlCd<U8OZEt!lZ!8e>?L51hr>lnl<+AA$^7m9xjP3 ztW`!k4*qATyjJt1%C=rlhW%<bCH%w!cmCay{&i2JQs$iq`s@AZ1lm;}8+l0$6ba^W zUlv@cK>q#VV=vkYR=c&1bLa@;)CT2gS4Hujl3KtFY)PjC7qU)6e_8?R1WZ~6Z|*Z) zoQz?14Mx&Rc>^NPNSY9QjNDqzo>NpwplcZe^Nl?R{OIhcqVBw+SE0a<H;t>9)Qo<R zzHG3J;>K9;R=3(U@Iy*0#qV^s*Qk(6Ho=l5D*XvK`HgmNqU{gRB5_PgdG7@co3NBR zQ4RnKml-ld17%-Laq+ySEW$?eEZ$IumP9zO=icqXbcG;!_Ecj8QQi}A4%IYy9vZ1l ze2d73OM8l@uiEs(IO9h-WJ?VU4iWVIqNZu?=`#RvMt{8jGz|-AKx|6r`Sw7pe$FHO zQEJ6~m5_s`4a<Fp;&$bi$4u1TAS(qA<Yo?lYs7`o&fObj4fr*Q7G09F{TJ<Ay3yOL z8GpZ~N6qvlKNlh6E8|ho6k_XeOTA+_BGDNvrTje({7GWBqI0(%W<i8^Q+|UOH_A(6 zS<F{P0D5F%{r%k)0Sw10!>jLL4NJUpi^}!>1xKH#Oqvc!GcVS*&&*jZ2gG!sXPs>U z5G!T;qbZ%&G?VTu56iVwtyv`xv<6~Gq|At;Yi<#fIBkKGuJ6_czaV`p%XyD*5GCf_ zjONrt#^1=uA6(afULK6URSg++%|r()`sOMsWbql3j3r@cLUGDqNFoJ25FzE$U}fXr zxtEItlJw+0mHe=AhPxNGuB9Aigu&J?08mEKP^TP$^5&D}76FNcIdt!4`83n|Nt5u7 zYV7KAX*!FE%r5gx1a|E3t9Mx<DA(VWqF)z=n7@e&%d7c8K9)g;hQ+sbyG<^8bV*XX zKg0IfV$wBx=(Ed)DJIywl{HWKgAqBwLPn6IJX!=ZT=_>4l?l)M0jN^L$c_CQK+p;5 zj1p#jt+zUv6{&Se;#zw9&j?la{qbI|k369PRZGg-SG6BxCZda5b&M_pI;MC7yQI1Y z>NP$$r{=O?C2!yu7IW`fi$0vtM8D6#Qg_3NgNd2sC%zXm=n29KGJb@}2Bp8K!j+}K zopEXhmCQ0GKeeOI3<(<CLt$rj0B}?B?NLXnDIfP*WjI`-b<>BY{Jh4!ZGNw5_Z{F- z4eGW?OHhKoqa;M*4)JlZX4c<<)j<krI4tW95G37Dyt7lyFlzf{R@(ZG3S(5cHlDV% z!HawvCIYXFHTN)hg=D5wp)Z$zm|Ld&D3M@a&rdasXcTvmNpW?n7tvC_0ANq}3AHj- zXw`J*`=a=sCw*s=@Y+ZDxvn?W-$XC!up{dmz|j`jW$AUYOFvH`d*jF7aC<zytslbM zPCw#=Qd0AYl4^J83JqEllCRI(bmUPUDOKoV&KgJj;;APY`V7PNF{_LYM^1iB`%`;k zG?R>nM^0lu<-}!Ps!?4*%?ZG|$0D#)PW%naWlD4)|4bBgv}USOX-DgFEvjR>n8MMu zWRT-@K>?mae!({|vLm9-p~zCI{7H@iir!MMB9Qd2mB#m*+JP-^B|<naCT}6cNNGIb z4^(jYRNU|Rl+J`}8B;_u!j)oXsP5InI4murdF7RmbkQDsII03Th8+RU7tsaWB6JPc z#LS40>zDd!$1~nIRM6pi0CKiFA8u6d>=;NoH-(r_PhRq8Bd6Gi5b+^&RjT3pvj;Q# z%9)USidp&c8#fBy=YK3|F3H$hPM3E$%kfL+Tg=xWq2XzOPQ@0mfu1bN>R;~MO*T48 zq`2LynW_vLb)R@Q(~$z6-z!v?XYz|3hG|AwFIAoGxyF}+j&OnpcABH~YEfL_@suC8 z6cmC-73+Fye%Z`&K=f+sB?|Oj(C~X#7hMG5Dm}3(LJwD8=O1%qAIaf_oxeUe+<^xF ztyE2OO1r>u$Rva=&2g^pJ7VAWP&b}QBLg4qBBsp#QlSD-A(&pku?E|l4<*}Z8~z<B zTP{tg$uzRo-M7zEU*TbD6@*;AunEmZ^$CoIN_;jqLG&U*RcZqXIcu%{a!i=q{R2gQ z`Foc{Hz+k{y+Pn5o3u~6ifso^k)X%Xgw@1ICbpjKHV@pD!R@y(ohz%kePcUX{cd_> z<zViexou>z3Q+1C09tyt%mb&>TF(GyhV1j#^oM}Ya?elG&vU_F#2g+}M^N{lEOUMG zJLfV}iBiT6xe-3*vP+sE*fjC^3z_^9YINK;^_?8w3xh(vMWjN<`NhUbacc5$>$@pm zh?$49$(T2arUT4y4<F*&p5{YzS7pd+_rL=3&(kuB3QoO+z+Y+cic)&7gI@Vtl>GQ{ zW|O#^N$s*DR8f}&IW@f9d*19+u0APjR$a++$POaZH2+~w2SJ>}-?85{E~k>#gZLnw z0*_T?=%g0;r+zL>-}p^%2pQJZp*troXL-B53789wqOet$35CT)c)Sx#J(&7##`h`@ z0ngi}A*`cWFA{+E51IS^=mI0PW!J)>MVKg`iA<+d#4*CGlv4ZP@5d8Z!<;{b&19~Y z;*Qi&x8w@GP$_!;Twg%4h$wRNExHq%vA1}}<JM({38lmx-kI~F)17)VKLEm)mdkXO z#6nm$rhB!qIBbGdT8oj38y#m;mXn9^WguA=vk?`(7atygJ7l^dr2<yywFtAodvr)` zFPq?;mYK!v!m@G^j>PQ^qUlm*_NyWxl4#$s&W{F1;oVgYB5$=u$%lm;7N{9VS{CpF zh|!Oz3U#+5=LCB~RRzKXjf9<P-+CiB?nk(#zV~Gkkq#$$frxNmx#_*N!bbmwh);^k zeRruD%R5s55SY*=_E}wLyMt6Q7532*V4LDel1y2V!GmrA8{Gz5z48j}^neVuu_?P- zI}P6|XsIuiOTxZp!{8#s;L5X)nEbA$Ft*07LAT%(QEkzC1|Ju~Jm+-zc9WtiUU*8n z(6`%;7p*UlI~}Y+`fWqkor3DgCT|_p_#lk`1)EkNK-q2%hJ!;HX4fSN3_(Js{Pf8j zwRI%}eL0ExZGx97y;l-_mi-D+>gY558`D#$pOaCpcN_R_1R+YrV$hVJvu@%^NU3yI zBlvZA%}K)GnjlJeaj9bcnp4+p5~mHbZohQjGtDeT%@a)4KUO+2gTX>vW+g&*5tX&` zFYLR?1L9@lD%6TF7*{mivC0Hz<k;I$Yv$?dWM&`M$*0zq==2f`6E&ffL#Kxz;1xqT z2tVnfbgFgTO|a;eJx1^|>>jA8EpFQSqoVHOHs0d(A0$;aFyEx3E*6_%2XRL!Yfr<d zav680C!t1O)yFHDn9(3J31>U&A9{D=y-87{0oZfzc|YJFaj9Y-A4GmM>+yHYyV}11 z6^2gE)QG4P&#Nz}H2ZeDt;J2V{$qRq5AmGp7f!JG!I54x5%dxUM8>M=owvWWaauUU z7&8d19=as;=`j^$Nb!QB!yQ~JByr`JRm*V)3EMqtRd?jmnuPh)saS`rqEDw+83Tg2 z1ppT}|A&=yTY(Z=C5-8elI)YOy&=LKM@w(Ep?UH6m$Gh2LW^kU5+SGQN@HpUbu^jK z9huYxXEzRHzuU4BDvYV-XO&Q*fe+Vu2kjI#&R#VTNfCk^LtLVoc!R5Zq5@<jEsS|+ z_zp8eh3Xm)ao+~CfHqjvK_!DjeI*gk#RNEPM($)(6IWZ2{jjvc3wF*^pH-PtR{@X3 zGT%|Qf&N<b$ZhoFPUvn=xI5zsw)EYG1<ibu<Xl^*YgywM4W`@3&1d(Y5vQ@A=kqN) zKL<g={*<l1R<G<o9T>X$=x4=n3J;z8HP8^mo@=$fJTJh)w2J{F<&CerAqjJmbX+pv zR+YdCqAowKH-W<c=i)(}QKd{Is1mGU$N8ah$WfSTZUx*Ccz}$8VwVr4Dy?lvXt*G^ zuopAsq_{($`VW=bJYx;l6|EMg$#{WSjP0;m??$?>-u6%#tH_vV!V`6S<w=Va^Pz4I zV~2u#&W(hb_mrUcxVkVHVM-rzB*y{)2#uRzBr)H@C>K6Yj+mB%Sm3REMsiTnsN7Si zbID_@la8d(_!Y~UB2m>)9|8(F#+T6J!MWi^;2F@3DTT|dWv84zH>4D*s1g4Gz`X5v zs>4?EL+(<d%b~xqXALf}*veHl4z0T~Z!h;!^11<1|5M#hkHK3)F&~c-hCw4OfUZ;T z!w*RdCV9Lvri6A-t`0%1eEqPKDBY+z9QL@oL^XCFu67EXeL&~KH!F6jNXM+`HxE#x z&{~|WZP`W~q762b4sz;kF11zmqFwK3`#lZxP|d({K7z-!<n!Dml1W$+`arM^o=?45 z?6d0@OX`m~?Ikj1NVmg4cKTIK0MI7ZGFJAp8K)|zHA1gwH627o1W%v-j@nvhtfn!J zRi%F%B~$L)w?dz=wl#B~^S=D8(+?p8{PA=s3Ym+yyHXl*hn^hy)HIlO4NEgSO>e&{ zfJrnd`L{C0I*Js}RIf+KdDLrBkFqV&7bhlgM7MDd(b+2**v$u`H+Hc$768Bm$niG& z<+a|H7g2qP-?2y+`lRCENi^zO-E-~WB^)BD{Xqt@j#Wh^PcX?E9XC_$@It>3B83a5 ze>C5|s&LXyYLM-aolwO+4QYx#3!fdZRWO`|Cg`Bhr<EOPP-4kGy-Atl3Q3cm;3Y{m z^c7M#v(n=B#A<U!OGfj92s5C11zQ3cntqiGoG|BN0901Fr;l(vp{B{GR?M<Uf5BEG z*v*G#!U63ZS9P)8-L9^B+EIiKV@jHcS_Fn<5>+1Gz!;kz60~DK+09biWaMbZvEtGo zl)D`t!ynrXH(Rvl@kF2dx+@XUYq%(6?!XWfwGsq0lEbJ{-M^MwLmEJ`fSP4K4)L^D zI!b+$Fz<gQXr4K()8&V><N%Z0Lv6FAVn*GZDoF@q>N&g`*iMT?J(4{dkEcdoq=A|l zk1$0TCQ_TOPvuep{q_=HgxjSd7&icml)EFA;C@EDVNW7Zziv5i$|%kc9_NHsm&?Ph zs4PsxWL9QQwt@0vFC>6Y@%x4`Z$9=%7azF0H<?bnKDhlCikYLc)eoArc_NEKFm8vU zZ_^nQn=kchRLLs0$H)-ddnL0gEpHpF=)RS~TjpnvPJVe{G%#EMrO)lE8+*5)_bKiI zw}qQK#dcsh#j#?7s1Te{uGna9f67F)o@dbYTl4!$m~cAhz=Ak{n8{oV)~`Nof6ZaA zmEf$!;0hI0xO7Q5noFrYT~d)3`@Q{XbsOq^>IZhj@^+w_?BpG&hd(0z?u9M(dSu2m z^e=_IgH}jQ@Rp>zsnu|wD-nk^Bi_sbaWqx%buHH>lM^j+IH`LOY=Vh(MijaOuDF_l zyrVC0;tq7&s>Ogk>l<uW{37_))vrF$-Q(Z6D#2{bYY&cy#xR%4agB3fX^S{n1`#V^ zy0k@{pbw}*_&-d|(1qTbI{4A~&-T%`D^UB*>#k)(Dt$1ZaJ0$%%-9bV4EvK;Mf3D> z5Qg4AcZc;Zs99wE=0P8v!=m6@rLrzNQZ)+G6%;acF6bJ7Xl%B6VNVMqD1cNd#Yn;& zvhz3{QD0pdu7ru|o$(URB=8srTxkwwPL64T;+DO;Tt9Smv(7==#RhNtE@L<YVg68l z5;|rZX7&p!hVD)51wT0iFXZ-wdA&&2<d8L*W_Qkby(hxShrEJsL<TI0_Z7Tzk)K6u zB&-}KG^YTw?ja9M2Q-o#q!`N!AfMtB6mC&B&oMfsSk4#lxw|{T-zZG9)G6TQ2kL*? zDK)*Fmceqr3@j2TCI?q~dx-8!p?{%S1QIiRQCK%9XeO4oH={^fC=bzsx{qVNhHP4N zq&|GMO|Q~o!x%HP9;rrBlnVJZU8F*kL<jHOf_4uerH**k1cwg8frJ``+t1FdmIGcJ zuk_|?rI>s6JA#nmip{%*+lxRWc~I_b$GXspB4}UG^x*)80b42uW4fMc81tZ&q|HWY z&n#EvJcg>1<Vx%c6(mMfWQEz?t;ESqlsO();nirOOE#^VQYK%PBGrwo+VZNC;7@h$ zMWMa{9xj|sIOF_3n%uC_&k@GBmP1RUW7ryDrxS8H8j~~^?F_1g)+=msDdu(B#I3ds zEtXeY!FOV?Nt9;84V3neU<VABZD#OHU3dKGkH<tDUr^=mEJKs}v?jjRE3ApLkGwP3 zBEihF0Zq5CYFP93(<iQRNyDrHsr9Oiey1)tz_;O&O=BJ{6+}rV=i36v{Jk=IZGjKl z<%wC3B#ZEyUK8BrQ)y3Maj1xp6l^POmJ(OoW9YVJ5KBtUj=5@3=IE#TY&16g=Pg-0 z6>Z>EDr$$n=Gfe+;pz!6>|3a7H%tgitLkkEi@7BluScu0r}um&N8|zLE-a0Vk1Yzt z1pHi9#qlXg_xhF;wNnG>xPH|9k$WOG?#Q<mx>gCb^Yf@_yxAn{U5DH$kMzNX5*sdT zirT=TW6(UB6br7c<}9V&do|392bkU()>Ckl7nj>SYrr!5=H5wH6{~y5-WC0Y(?r7W zU?RJ87k=(`2jILT>pP#VXG|(dGI<LLSa(Ea?DfB7R&ivv{3)Hw*=%V4(biC5^d9ul z2?Ts+>0HO%(ZgQN<eZI=ea3`ck>_yNm+9o|kqL=7oQw>+5NvYtPB2jZytw(CDVb?o zJfkr|JY>9ZN|z|~(a+h#lJgGO`+1^Cl>IV}=@HaQjH*Rg+qzqbllN4NZ%0`Ga^lhe zWr#r&<`i3=>!t&{3lZ4#HYPcRki$T7Oq1R<(;dfE=sERYvsJw69BzeW>8s?bqii;+ z1-V=A1$AN_AnA^)m&HS2gE8zznvFE!WJh5`S2}HE#|4A)K{ZAOxHDt7_a?1HFA9sm zII<}7itc~;x~;rnEb2))<8svoj3rd^D%DoBhgN`CG$ek(sf`!B`U*M7(%omP!tOP^ zXMRD@f#+x=WR=LSP4TI#uWuWEIW6YF(c883qC+yF;?k(U9D@M*ZD=XX1t=RY=^f7e z=8VjdwW#YZldOua+w`YPL65*F6V|O1C*I}aQe{W>L)uc5Bv=znKlh0WfUUuBp0-r2 zVF@PT%3<}LsY5JKRJ#Q#b%n#EV8e+KO(VtfT(VCA$HUav1wW^;L%Qu+O<bG$N`cQ) z%+564UEBkX*M#ET-Y?IK!rC;o={SK2cn85gF}xjvfp4MnpB{QTwA(Jsoy*-g^>gG< zkkd&q@>U;j+XRfOxHn`14){nRdt#519_EBwg3mIKC$rDUY=cYZPQolc#csiXDYKqe zw3$m$#*5%=7zZ9ZI3mB>Dme8lWxA)vWueXJv259b5nC}#UBe;#Oy8_F0GS(md;q=$ zjaAsKv)&ITopg*qQ-?i-RoaoC&*mfD*g3n2sMib4MhQ;=5)uvxkhpX)Zc1!6*Z6Ec zyE18)vB=#7FEs%^m$%4zj5<AcT8-KEHqs2c%9`bXh$+72VMQ>m-1+;d4J2C*4o$$+ z6kHaS`G|Dv+3+`YHdT+9KnjvZR%M*i7>g99+(HYIpOr4jL2<ph4`}4Nkt|Gx3kwgF zZEaDU)XA~lEjg9527qr>VHOo_#w2f6Ajy@%Im|%Mo385K+0U+AqP6fR40^ShD}a8u zjaY})(M;JPp;Xsi1q0a5h%P6CTlTqBs?<ese`VlUD#~~Hp8DO*avfG@P<lCKb%BHG zhZuwMmSrl&aa<V<C^`TRw5&M;__FNTTM!V0-!IGBJGfdH*}uFhyP>KPmc)tbsblu+ zv+3+7DMTLd^)oY8mc-(i1PjgO)K{Wk*f>}wu~mD3W2Oxu);Ov0EcwPJU4p^wk?n3S zaDv3hOp1cf<ig(<X`o1`<rA3Xd~ecvX0Qzu&54=Yv(t$H+GE&&?@tdTd6$6`{t(&N zpuTw@nnoKE=bTdLO~v<U)Z{>A?eZlu^a@}bOHj$wEVZfY54nbW>0wanKE%iFy1kdk zc+yf<rXC11jRn3EThP^>CzVS8M}#KM`N?vDNL+3`G}<4#dNwPDe?HeRKeBr85^ZIU zc|=VjZ6aj`fRdEOL;9W{q3_bNXP(C`Q|2S~Tp&M_0Y5H8J!*qUz9uZ*+I}@5>>k5T zfDL1*{~@IqSsZLWF^nxP&!JJLcXXA8lO(4kDvQuOp;Mh)_}3NvPyV&b%Xj1Z*Hs&h zE$ck@>J4(iCnnr;kq)woj)kY#io=}CiFUeDFy53PfV64F08DaIK2J@hmBTmfl?D?f zJY@}^3^%_#-RtC$nI!1REnF>9STTS_HC_EYl4D1l8aKDL>Hk;&A34%(q&4#cMHn=< z9#XR_@LRpPT7p*AFXVK&a3*;%!MfA2A)I~CpE=RzP*Lgp+io+`p`8`Ml8;PqOj+FP zi%CQ$>Hs93CM*4uds93oq+jP>&rj>}`lcHr3f2lSzrT0apB%R0r1>b$^On&C0sj|{ zW6S&d#}he_v86*lbop|IpPd`9nVuFc@QK;Rh<80Z0>TBNb5)8V#)%J(c1z_Oo>M-E z!xrCysBa;l+$O*f)m(3)v`!ARoi#i04kx#N)rteuTV;C*av$uW=F}z@x!})5Ae(Mx zksy9?K|d@Hn>f^zFfJ9h+#4l)LaWu9C?V!7=D(TkTMI|JZQOtesM0ZRRx6FyzrI=9 z0e(s1{y@Bh8uv-&>hrJWKt~NX;)xUAn<Y+2e{=^0esalfHWUWM!mkNzjd!({I#p&N z^ZhP>Mz|fSOfEIM$2t$pwZ$8T#Bw99*^;{?KJi5%Ul)!eWvwI`ki8CBHr5auQOPc$ zhf6CbzJ%qjR5mAL19Q&w7PeCp`vHQb;jMF*HJ9PTT5X>vutV2-0nk8sXU<|S*3-`( zGna1(oGOs7$<w6b#%e6sN002&Tu8RNo$+V{@HtD^a3jju@Dbc;uC%QAv4@WyW{z#I zWi8h6<{cXe-uN{MOciA%2ZR)}qwh(!i7|StBX3a_lN~IMB<}FUwMl@Y0WRImE!`kM zKyL6sKrsLH#=E_#k&%Nv!|Mmri=LC!=B?J*kv$kj0mv8ll39j5>=q2{IJ6D#;ZTLG zO9Q3mg-FL@q6ac|TAjsaW7%-uU_k{i^mDO%7#@5pT*BY1VsuiFSTlObjT*%Xub8rL zDR(@*N&sjDG$;8B&Kq5_(>NCYT6LcCOJf&!D*G}qWbgK=0Pd&IVoAq`X}mbO$t@@) zqr;B`N(j%hyE*;bH**J>S2KAQ=Hg0NeVnPnO3IUZ)_Sw<oqkJ)ftq}K583jL(>P{| z3697BH_Fh%S@jq|r)CV>2t!Y!riv)zsbaM7^&$Wp!G~JMbAGy^FI58bx>2l>*Ts58 zrCrC)$)J=cwSd^#q0o5|oL1Ch@aP0%jJW?Sh|KwcfSF`GPp<Tv_=>K?5_)93wnbl? zs$FLJY*&0jiSezx#q?_H>Fze-(l^%t|G4w#CpeBmOHeHKOjzt{4ga*RGd=2d)5;2n z3lqSPrMbcp!Q3!`Lal4z7_zUMwD3~j_{|<I(wBeQ!;5Gr6)a3jgtyHXa<}C&&RwM~ zjVRJTKiyFpV&j;Mb<JOHS8kWqGyp8UbBmO89Bx(04-rR2Muj!12ekW-_Vk$(wCSI7 zmObUWo<>12OSTv+a|;L1);XuiT)d{!sigoWLW0J}SC7Tc#M@D>#Ooh>gS;y5QCdyf zM`=-(WCtO9r`<?l!i!QtoMhoakF-Q4drVDsnD#4%3dXEKqnXm@4U9hu(zX?2Wd~Dy zNbY#A=j(Se%LsxB31UekTbiV}RGOg@fAQe!YQuC2@z!fQ$Sq1L)vZI-e>cX>E4dK> zEzaXVYrxGBTz(GD<@}cF5Le`<gB7O1w!+4O@Sy4TCwi%EKPIP8`y=A5D*GMh9QzJT z9-Z`vM(EZ2I=33<j`wK(lA&K+J`XQsx<XiEj;2f_P}r=&1mo)CIxcwQebq|`*<j?R zfki?!HVu&j5wWe0G@#`4{ZV>{T%-jLz$X8U+ksFqZ9YedWM^8c0FP>F8f^>je#kPM z;)>aDfC>gG!8=5F^UjpYG!do9o3xk2*Spj=*4yAGpP)DI7gMW)g~WqPD@CLLdxEU@ z_-d%`T2-j5NW0;C3VauHoUp8y-+fjJGqYDPlfUdh*x~w=;@`ZZf_{`t`I7#=1@L91 zFpH3s(eX<Zh%{e)xO++!YIG3QFa*rmhR~VgxV#O#DusBsD8(j%`9}$g)5x|tVXtBL z0mT-Xeorz^>f3}UIM|H=2ptNeRzlpKulL^Iu6OOc7&g=UzTm@UGU|<-7$4fZ!{FUh zSi|CPT3o}Xkw|+hJzp1M?Q{d=GC-#^U0(tL$cVh`-CGF-`9s$Bvq(v8jxHb|&Mt)8 zr^O`&>*Loo!wF^S-?hl7!-j$`Gl+%fGQ9o~sOJ@T1w^cowQ|WKC$;f%o0#kJ`tpTk zbw4Xx_gsb#S-;_=X!CchU}qhdS#&NBN{hUDAj-EWL?M8z@WB9-4h@PBr0@Z$@5fv2 z=+ao2%MFj};!%cDvuFkq_hu<*D%5r}`FERr&=zqO*QwtrY=~?`iu5%3+M^<(OA}(f zkAKt&Q-+79e$(p5kd|!oX_~X#9q<-$W&bAMV)3$4C6U<o!n(O?OuC|RoElOXY1Cn> zGPZ-xJwSa(w)<`ss)azCn*(cq+}jq1oM=jJo;R%h_Bi6V<7QMY^ktq=>78-NEp|E4 zb~&n*rqSDdB%3t3*_;Yq1bn8^6hsOwcEGBv?IpCv!C`Mw$#7~ISTCdCM77Uim-(fr zo@!+YnC#0&gwAR|MzY;!{J%o3JQ}J#{LiFRmQ;u^o61rm>tuOnM6VXhh+aw}+mL0f z8OgY>BuP<5O+u2bvSdkQ26@Ml#*z{lW{8q8j5N$-8S@+7-|wx{Kfmue_uPB#{oLpK zd_T`~?>XPkInRTO-`+JhGJ#w7=ir?BS0A2!7H^>VZ9k?izN(5_BbIew-@y~t)gL;T zmXf&&;dk-IRm^2l#XhjSgv3bACgc_n$jXPfSr#hlS#ZX&ce1W!cIj+&gIJ3|ZV`UD zpv>iRHg_Rrz_Yk_Jze^7_=hq9!`VW$VW%*?ODn*xCudi1xZ-YBktM$vSh)~R_!fl6 z1J#WLLTyxJOjJ3!eh8?o6U;4^zeWOCQ0NdkFc=;9j9)|UPZTm4uoZ46dgbc}zJQSf z@N@9w#Q4aB!KMDh92m5LVrEj;xJ)4rFwuj+0ON)5dnkafBKQfT`K*Z*8UwfVDKsyW zo%dySw!Np5H_0n^|MZ11eA-JmJNDrV#}inX$KsdX>V(yhnW*P8Lc!N!9X{HL{Bqfp z#t58QSzi2-N)vRFB9r*e{mwFgFxGYM+sOF$0xl~Os38E1*dbtl-yki%kwX{Wofa0u zklcydg3MwXSs+*$qgF+J$y*_eCjyZXk<aU6T#{hIVHa!#s&0@#o^1FVO>$Ym&%7I5 zc<(~XNiJQXwb(t_!A70M>omF%q6j~LHtI7py(XDcGlou4U<3oL&xGh0?j-fEC3z0& zX*`+HCgRA264=M4<{_U!B~Q9dHw-HSsENfNv5ms2rHw`P*<+DOON@C=Wk74w3j#L? z-#~7_IlG{PO$CjDr|hpf?9LX?i;J~$J@4tkZh~cQ>fnG`q;Z33RAc>c_RO>5Vi}p7 z!QlJ6OXF04Gsa`j$Hx`>PM1n$aT*87#h4rzJ*1fAJ_F++G4BXAq$M`bi9RfYE32EK zzK9)cgbv5f1bZ)x4)|A_x$VD;kzB4_@K}na@o2nSpC#VcyN%3z!KfMTT?53(*q9I* zR*6C_bOx0ILr&zC@-M8a_wE$Z5kca@k7EsIKB5ALDRqMY+V9eEEQRm>g5l;pTS@NW z=vSLfqv97|`lF9A#D$YDqK3+BnKkZ{!NGkrg=Z-Z)$TPk1UGVTxJg$QKZ9opxO|Pu zs-2KkPtEzlDIC@elp`M5fzTRxJl*W5OIPaFvZ`reQ}xFr>rPqgsHr++b5WIk!=*)T zTKOglgjS8K|5&9d?1HuUHG28($Q$%@z40YOF8=lh3!Z}P?SiQTi`RN26K)b)6?Q2{ z_dtnQ-lM@$q^XpZlS6j6RUbVW<vC~Jkw;v=W0$g9L{SX4>p<Q9*!PlFebMlYYez3= z|9syyI#iFWz}V5q+OVs8o<h7WYuxKPw=GXWLV1IAlT(PC>jq4d^Cmfqgrf+jqjC-j zHV9`8x#J1PbDjL86z4}<rraV#0`RN_=Qt(%+UrB3F{+hm++Q4kxkZeXUu?ULOCHX` z>xDh7pV*aWy1S^mK=Idg&V+WYauU2{_l>M})E7$Xjq9O>N77JUa+d$DW4C9-Skp^t zDUKLw*cEYYwzkB3?sNF-8?@Y_9Lv`#A@fL~qY*I*f(R(HL2k)3mYG)f3)&29DY4H; z>ZpMF)m26iKlDtnPjw%<ntoa-n-z4c0&dhCSG!ea)N<X?O-XRw-EsN1q|z)Uj&6Pe zH_X@dalMZ_X;ft(h?wp#$at;db)A`5$Dj5Uq*N63u$bh8H{wJz1fgcYPzl1GU+fut zY#=$1OgU?l;H@5py3$(Ob6(JLOAl{oB0U86BAP?sYKDyTAZ);5Q`W%!Dp>+0B_jbf z8P;%5!UK~R-h`)O$Bl1dwY-UkAh139jP*FI?_w_FvHrm#4{SwqN}<e6yn*%U$w!y` z8vfww;tlpH6GP#uy9$-NJGE@lJ^I$+*CEpS)AI0WA9I)z37b$X7V+o@F1Ip{co71J zXxk#mnWyi^4)NJ}vZCe=JOf9>lwSn>Kg3>+4YDtDAR~5rt>5r6Mf{jmWiT0-=GbQD zwkVZm*s!ATr)Xv<Rzz4l(F}^vphs9XW>mAjUSXuQp7qJ<vnl9{?rHMeJFk+c0r{&z z`Gr2_s-YLci?~e@vd60abXU%1H15%*G%r_rUn;I`I$HY)x4rrS?eselO*$debBe@} zod|e+23pZ=3wNkz1zSLRV^{cK?CI+#)pPHzCVT9!Lf(@mR=`!2kz8LY%_Dz_J=W`e z{F%3LjvZ@0)bh=gbSrf=2_T%#<=JnQu&$NyWvt$X%VWL0F6z;4W+gs6aWPL3Z3tC9 zcIEG=fmE*}^~QHHItHJ-9X+g$e6N|kO-8fI$YdMy-;lwLxW3H{jO3>+MwsLx2c6GX z_%UIn3SrwLbn`oy=WK4QGU3YXfXV74vN%x(^3WOv@+Kelm8+3VJ_MADQcYRv`tAQW z(=r$0M}5$b1&o2tlM<u|yRr*Uo#|4VRY=7htILHVxrr^bq|G|oqB6eyb4|rumRyR1 ziBc>w&{s+TCla7=l>mL<6lM7gb+kSGfoTq=a4u{#8R5ghMHo;H5z$I;*oj~#k(JcU ziE>5D#`fL}x2-1G@2I`E^rFQE%(bo&Q7|Y}L`r#-q3+08Hb&PrVTZ5YomFN%{Euc- zH<he~N4Yu!z0b|I<9cYMzPw8oYYJ;pP?d@B=@ZXe;}y}5U3n}r!6f9S`q?Gi{qZD$ zCAY=FL}As}EIG^nok)br7ojxWM%sZw2bve*aJWf9_ncmS2SeJbWi^BdQ3y}W`ulI{ zVA|y0l{Ay?@RsOaAHVN<BEM;9*ss;1l?Xtg@Jsr@Ny`0u>z>V7G(LH|y<ZMf6cQO9 za6NIlgZ>{##El4~xNdB7k(wS&o)d>D3<--b7MXe#_<vs<+>pDmr8wzO1!{CIa_@6j z7B%C&=2YMT4d@H~fV`cOJBgPdP-t1_@}XIOPy3FdnoJ4S`}Ay#b^)oxT}qRit{A>X zfXWB#AAsF*ZBj?liOlx5E_@?VQt_oV^NemuHxtd3;3`4msY(5^UZVvow;0|>frFo7 zObQe*qG%f_%C0515x1?G{lxnEd`j<0zoeXV_v~1AaxLGKNVhhxGNU4LLU%UW-$u*X z-`3}D)Vmf|`h(T9HLQKG79(hB26_+9eIH2S>ZIBDwD-i}830o>x5B@r7Z8uoCB{IZ zXCibYXXl!w2|<hfxCwX95gPBk_D3e6uC5+k%OnH>6W@QFHWh!#c2E5@+by%ClS)tV z9G-#E`>{V}Yr3b|cc$oHm(j6(959N*mqD+*Yw)J_yx;ebvLLgz58t3?lBZ9q89WZ& z0|q+n*ax;I@Q+d~KmT#z;ilX-x^<V6x2`+!WJ6y=SAIpv^lSZ_E)O0YQ#~$G!okI+ zq@YvVCjH60(~_IdN+lf3{;V2*&WrWW)2-dKL8A3-M25W*Oia#mqej`>?CtwSAI()a z-mCcYl|}F2PMhP;4NIi$Y9Y0bEzgab&%3mr`U~j#$M$)q;rcY+i?Ij~>#fH%F!$?o z6;*uq3!a_d8Pt}jLpw`-<svw*G*g0TD2R<P`tydoPikwO`8M{{Oy6baFfGT9mmu=7 zlt>fju&k#EhS0KwO=oweKK$%_h!MwXMIyCxo%VOSl*>6@<z#P+QmX{SbH(-@4oK6F zQ!FO}(#K#+;+m}fd(3ii_{p>lmK8E>^w6oU`R58DAsSOs;#+Yls@jl?uZsL}+XWV8 z5Lv#I*v#KmaLbTaHR{>w=FZ=(h0KOw_^in?<qTT8aJhAU<R4`ek`_f(kL?naKi*M& z%>KLM^stY+J>Km5XHz1Zenmb#=YGyjoV(lhtC(Djj@p93*A0pv(wAKT!N1i8>oKxD zjWthf!RlauVNE?C*D}08n0SkC)T!om<%QUtKaAyuLVoN>8`S<7bL%i!z{fI5xMR9m z;Q)V#7*^2_Sp>n-4dn|j#%)vdD9{T^K(c*|+B6R1cF&Z=Nx<MEe-a3PNwi&=|Mt05 z3?{!m{ixc3PkSlJJ-QZ`KgNwCFk6Vtt<jxc(TjJ1gWAj}NpA-^{YQwf_Fd{n&W&5C zqIMN1-sUjyV&)R-AbtmQx88UBK7DiK!Vmm8d+jWjmUwGq_Ly5`!NH`wOR!$QsU_4* zk>!o_oV4l5PZtjwI*xz519F8ev7)XOpY+KyXF@0MY-frO9-jMXa2!Nm|837gfL4Lx zBRvAt%JRIasgEGdtq{*=?<rGnxq{u$IT2{<TXL@|b0OeZtk|SSXSeVv8Vmvng<>Fk zYw)`Lpx+vqlD64{&6L+VY>IRzn{^<Nr0D!}JR<qogQ3c6O(;cndPPdJ($A-&t2R=u zJ$S$J?>!rTVm6alqA9@hB()P@HI-jFzO5-;KXHY!q_Pv>y^#N^NdS<@*<Z(DB#30{ z0Nw-nUGx44YIgvU2o7K<<ab5wC*-aZh%|o!tf}&IANQ~5_7if%l_)K%B>y{MYkvpQ sLkF<D*mHjnsn!9EfUIVtwuqQz(IHace;IK>AQI03tSUYpyn6S40OanRZvX%Q literal 86814 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 From 3c3f1b60c645da7b4e9965e9297404e318efe2c6 Mon Sep 17 00:00:00 2001 From: BlueGreenMagick <50060875+BlueGreenMagick@users.noreply.github.com> Date: Fri, 22 Jan 2021 01:56:12 +0900 Subject: [PATCH 1206/2376] Update cla-individual.md (#5428) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 20c87c7f7..00d0a36a7 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -436,3 +436,5 @@ Russ Thomas, @codacodr, 2021/01/03 Peter Neumark, @neumark, 2021/01/15 +Yoonchae Lee, @BlueGreenMagick, 2021/01/21 + From 1ec532ea50d537d9dadcdbed8f056c3b57478941 Mon Sep 17 00:00:00 2001 From: BlueGreenMagick <50060875+BlueGreenMagick@users.noreply.github.com> Date: Fri, 22 Jan 2021 01:57:12 +0900 Subject: [PATCH 1207/2376] Update WikiRuleModules.tid (#5429) --- .../from tw5.com/moduletypes/WikiRuleModules.tid | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/editions/dev/tiddlers/from tw5.com/moduletypes/WikiRuleModules.tid b/editions/dev/tiddlers/from tw5.com/moduletypes/WikiRuleModules.tid index eac8b6c09..8ca8c1905 100644 --- a/editions/dev/tiddlers/from tw5.com/moduletypes/WikiRuleModules.tid +++ b/editions/dev/tiddlers/from tw5.com/moduletypes/WikiRuleModules.tid @@ -1,11 +1,11 @@ -created: 201308252147 -modified: 201311011307 +created: 20130825214700000 +modified: 20210121054620146 tags: dev moduletypes title: WikiRuleModules -WikiRuleModules cover the module types `wikirunrule`, `wikiblockrule` and `wikipragmarule`. Modules of these types encapsulate the logic of individual parsing rules used by the WikiParser engine. For example, there is a `wikirunrule` module that identifies references to HTML entities by matching the pattern `&<chars>;`. +WikiRuleModules have a `module-type` of `wikirule`, and may have following types: `pragma`, `block`, `inline`. Modules of these types encapsulate the logic of individual parsing rules used by the WikiParser engine. For example, `entity.js` rule module identifies references to HTML entities by matching the pattern `&<chars>;`. -Pragma rules are applied at the start of a block of text, and cover definitions and declarations that affect the parsing of the rest of the text. Block rules are only applied at the beginning of a block of wikitext, while run rules can appear anywhere. The only current example of a pragma rule is for macro definitions. +Pragma rules are applied at the start of a block of text, and cover definitions and declarations that affect the parsing of the rest of the text. Block rules are only applied at the beginning of a block of wikitext, while inline rules can appear anywhere. The only current example of a pragma rule is for macro definitions. Examples of block rules: @@ -13,7 +13,7 @@ Examples of block rules: * Tables * Lists -Examples of run rules: +Examples of inline rules: * Entities * HTML tags @@ -24,6 +24,7 @@ Parser rule modules extend the `$tw.WikiParserRule` class. This is done by insta The standard methods and properties of parser rules are as follows: * `name`: a string containing the name of this parse rule +* `types`: an object that defines the module's type. For example, `exports.types = {block: true};` * `init(parser)`: initialisation function called immediately after the constructor with a pointer back to the parser containing this rule * `findNextMatch(pos)`: returns the position of the next match after the specified position * `parse()`: parses the most recent match, returning an array of the generated parse tree nodes. Pragma rules don't return parse tree nodes but instead modify the parser object directly (for example, to add local macro definitions) From 53ebfffedf7a6771640f04c38bc678fcc27229cc Mon Sep 17 00:00:00 2001 From: leehawk787 <77782168+leehawk787@users.noreply.github.com> Date: Thu, 21 Jan 2021 17:59:39 +0100 Subject: [PATCH 1208/2376] Update cla-individual.md (#5426) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 00d0a36a7..f364d6507 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -436,5 +436,6 @@ Russ Thomas, @codacodr, 2021/01/03 Peter Neumark, @neumark, 2021/01/15 -Yoonchae Lee, @BlueGreenMagick, 2021/01/21 +@leehawk787, 2021/01/21 +Yoonchae Lee, @BlueGreenMagick, 2021/01/21 From 678ec7b3ddd290c047eebdb52803ae46721c7597 Mon Sep 17 00:00:00 2001 From: leehawk787 <77782168+leehawk787@users.noreply.github.com> Date: Thu, 21 Jan 2021 18:00:38 +0100 Subject: [PATCH 1209/2376] Update Saving to a Git service.tid (#5427) --- editions/tw5.com/tiddlers/saving/Saving to a Git service.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid index ab4186f6c..3502f2a22 100644 --- a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid +++ b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid @@ -15,7 +15,7 @@ Saving to a Git service is configured in the [[$:/ControlPanel]] in the ''Git Se * ''Type'' - (mandatory) the type of the service (e.g. GitHub, GitLab) * ''Username'' - (mandatory) the username for the Git service account used for saving changes -* ''Password'' - (mandatory) the password, OAUTH token or personal access token for the specified account. Note that GitHub permits [[several different mechanisms|https://developer.github.com/v3/#authentication]] for authentication +* ''Password'' - (mandatory) the OAUTH token or personal access token for the specified account. Note that GitHub deprecated password authetication, permitted authentication methods are shown in the[[API docu|https://developer.github.com/v3/#authentication]]. * ''Repository'' - (mandatory) the name of the Git repository. Both the owner name and the repository name must be specified. For example `Jermolene/TiddlyWiki5` * ''Branch'' - (optional) the name of the branch to be used within the Git repository. Defaults to `main` (~GitHub) or `master` (~GitLab)" * ''Path'' - (optional) the path to the target file. Defaults to `/` @@ -23,4 +23,4 @@ Saving to a Git service is configured in the [[$:/ControlPanel]] in the ''Git Se Notes -* The Git service password is stored persistently in browser local storage. Be sure to clear the password if using a shared machine. Using a [[personal access token|]] for authentication offers an extra layer of security: if the access token is accidentally exposed it can be revoked without needing to reset the account password +* The Git service password (token) is stored persistently in browser local storage. Be sure to clear the password if using a shared machine. Using a [[personal access token|]] for authentication offers an extra layer of security: if the access token is accidentally exposed it can be revoked without needing to reset the account password From 674d55db06cad6533a7447e72f7bb058adaaa12f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 21 Jan 2021 17:02:21 +0000 Subject: [PATCH 1210/2376] Docs typo --- editions/tw5.com/tiddlers/saving/Saving to a Git service.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid index 3502f2a22..3253d8313 100644 --- a/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid +++ b/editions/tw5.com/tiddlers/saving/Saving to a Git service.tid @@ -15,7 +15,7 @@ Saving to a Git service is configured in the [[$:/ControlPanel]] in the ''Git Se * ''Type'' - (mandatory) the type of the service (e.g. GitHub, GitLab) * ''Username'' - (mandatory) the username for the Git service account used for saving changes -* ''Password'' - (mandatory) the OAUTH token or personal access token for the specified account. Note that GitHub deprecated password authetication, permitted authentication methods are shown in the[[API docu|https://developer.github.com/v3/#authentication]]. +* ''Password'' - (mandatory) the OAUTH token or personal access token for the specified account. Note that GitHub deprecated password authetication, permitted authentication methods are shown in the[[API documentation|https://developer.github.com/v3/#authentication]]. * ''Repository'' - (mandatory) the name of the Git repository. Both the owner name and the repository name must be specified. For example `Jermolene/TiddlyWiki5` * ''Branch'' - (optional) the name of the branch to be used within the Git repository. Defaults to `main` (~GitHub) or `master` (~GitLab)" * ''Path'' - (optional) the path to the target file. Defaults to `/` @@ -23,4 +23,4 @@ Saving to a Git service is configured in the [[$:/ControlPanel]] in the ''Git Se Notes -* The Git service password (token) is stored persistently in browser local storage. Be sure to clear the password if using a shared machine. Using a [[personal access token|]] for authentication offers an extra layer of security: if the access token is accidentally exposed it can be revoked without needing to reset the account password +* The Git service token or password is stored persistently in browser local storage. Be sure to clear the password if using a shared machine. Using a personal access token for authentication offers an extra layer of security: if the access token is accidentally exposed it can be revoked without needing to reset the account password From ea12994f47f90b3574f5d18e29b1e7c308b479b8 Mon Sep 17 00:00:00 2001 From: FlashSystems <developer@flashsystems.de> Date: Thu, 21 Jan 2021 18:07:13 +0100 Subject: [PATCH 1211/2376] Signing the CLA (#5421) ...to contribute some code. Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index f364d6507..f84f6562d 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -436,6 +436,8 @@ Russ Thomas, @codacodr, 2021/01/03 Peter Neumark, @neumark, 2021/01/15 +Daniel Goß, @FlashSystems, 2021/01/19 + @leehawk787, 2021/01/21 Yoonchae Lee, @BlueGreenMagick, 2021/01/21 From 2e47f277acfcc52ab872e84261385d254873f67e Mon Sep 17 00:00:00 2001 From: FlashSystems <developer@flashsystems.de> Date: Thu, 21 Jan 2021 18:07:28 +0100 Subject: [PATCH 1212/2376] Fix blank favicon if root-tiddler=$:/core/save/lazy-images is set (#5423) If image lazy loading is used with node.js the favicon is blank. The line `-[!is[system]is[image]]` excludes only non system images from begin saved as full tiddlers. But the `[is[image]]` line includes system images as skinny tiddlers. The created HTML file has all system image tiddlers (as the favicon) listed twice. And the skinny tiddler seems to win in this case and breaks the display of the favicon. This patch fixes this issue by excluding system images from the skinny tiddlers list. --- core/templates/save-lazy-images.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/templates/save-lazy-images.tid b/core/templates/save-lazy-images.tid index 62334f0db..0a4a84295 100644 --- a/core/templates/save-lazy-images.tid +++ b/core/templates/save-lazy-images.tid @@ -4,6 +4,6 @@ title: $:/core/save/lazy-images [is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \end \define skinnySaveTiddlerFilter() -[is[image]] +[!is[system]is[image]] \end {{$:/core/templates/tiddlywiki5.html}} From 466713986486a1cd9732b390bb6844cf2f5fb5ca Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Wed, 27 Jan 2021 09:18:54 -0800 Subject: [PATCH 1213/2376] Rename TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid (#5430) * Delete TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid Delete file with illegal character in filename * replace file without illegal character * fixed ext --- ...irebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename editions/tw5.com/tiddlers/community/resources/{TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid => TW5-firebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid} (100%) diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid b/editions/tw5.com/tiddlers/community/resources/TW5-firebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid similarity index 100% rename from editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid rename to editions/tw5.com/tiddlers/community/resources/TW5-firebase_ TiddlyWiki5 for Google Firebase by Peter Neumark.tid From 8bab081c9eba38367c396dd9cc00da3de909c013 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 27 Jan 2021 17:21:25 +0000 Subject: [PATCH 1214/2376] Remove illegal character from filename Fixes #5430 for tiddlywiki-com branch --- ...firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename editions/tw5.com/tiddlers/community/resources/{TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid => TW5-firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid} (100%) diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid b/editions/tw5.com/tiddlers/community/resources/TW5-firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid similarity index 100% rename from editions/tw5.com/tiddlers/community/resources/TW5-firebase: TiddlyWiki5 for Google Firebase by Peter Neumark.tid rename to editions/tw5.com/tiddlers/community/resources/TW5-firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid From f77015ea18842f5af511dedb919b6bdece92a5fa Mon Sep 17 00:00:00 2001 From: jeremyredhead <jeremyredhead@users.noreply.github.com> Date: Fri, 29 Jan 2021 07:02:29 -0600 Subject: [PATCH 1215/2376] Signing the CLA (#5454) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index f84f6562d..b95cf77e3 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -441,3 +441,5 @@ Daniel Goß, @FlashSystems, 2021/01/19 @leehawk787, 2021/01/21 Yoonchae Lee, @BlueGreenMagick, 2021/01/21 + +J. Wilhelm, @jeremyredhead, 2021/01/27 From 45355a7fcfa79cebcccf9fb53b46e39f620b34f6 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Fri, 29 Jan 2021 08:26:31 -0500 Subject: [PATCH 1216/2376] Wikirules now use better macrocall parser (#5451) * wikirules now use better macrocall parser Before, wikirules would use a deficient macrocall parser which couldn't handle certain types of arguments. Now it uses the same one that the widget parser uses. Less code! * style changes and removing weird switch statement That switch statement made more sense in an earlier iteration. * comment improvements * oops, wikirule macrocalls could do ONE thing better * '=' wasn't allowed for widget macros, but why? Now they're allowed for both widget macros and macrocall macros. --- core/modules/parsers/parseutils.js | 2 +- .../wikiparser/rules/macrocallblock.js | 52 +++++----- .../wikiparser/rules/macrocallinline.js | 44 ++++----- .../test/tiddlers/tests/test-html-parser.js | 2 +- .../tiddlers/tests/test-wikitext-parser.js | 98 ++++++++++++++++++- 5 files changed, 139 insertions(+), 59 deletions(-) diff --git a/core/modules/parsers/parseutils.js b/core/modules/parsers/parseutils.js index 0d74355f7..8d83efd1b 100644 --- a/core/modules/parsers/parseutils.js +++ b/core/modules/parsers/parseutils.js @@ -132,7 +132,7 @@ exports.parseMacroParameter = function(source,pos) { start: pos }; // Define our regexp - var reMacroParameter = /(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|([^\s>"'=]+)))/g; + var reMacroParameter = /(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|((?:(?:>(?!>))|[^\s>"'])+)))/g; // Skip whitespace pos = $tw.utils.skipWhiteSpace(source,pos); // Look for the parameter diff --git a/core/modules/parsers/wikiparser/rules/macrocallblock.js b/core/modules/parsers/wikiparser/rules/macrocallblock.js index d99c15a6c..6f50fdbb0 100644 --- a/core/modules/parsers/wikiparser/rules/macrocallblock.js +++ b/core/modules/parsers/wikiparser/rules/macrocallblock.js @@ -21,40 +21,36 @@ exports.types = {block: true}; exports.init = function(parser) { this.parser = parser; - // Regexp to match - this.matchRegExp = /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\r?\n|$)/mg; +}; + +exports.findNextMatch = function(startPos) { + var nextStart = startPos; + // Try parsing at all possible macrocall openers until we match + while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) { + var nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart); + if(nextCall) { + var c = this.parser.source.charAt(nextCall.end); + // Ensure EOL after parsed macro + // If we didn't need to support IE, we'd just use /(?:\r?\n|$)/ym + if ((c === "") || (c === "\n") || ((c === "\r") && this.parser.source.charAt(nextCall.end+1) === "\n")) { + this.nextCall = nextCall; + return nextStart; + } + } + nextStart += 2; + } + return undefined; }; /* Parse the most recent match */ exports.parse = function() { - // Get all the details of the match - var macroName = this.match[1], - paramString = this.match[2]; - // Move past the macro call - this.parser.pos = this.matchRegExp.lastIndex; - var params = [], - reParam = /\s*(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|([^"'\s]+)))/mg, - paramMatch = reParam.exec(paramString); - while(paramMatch) { - // Process this parameter - var paramInfo = { - value: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6] - }; - if(paramMatch[1]) { - paramInfo.name = paramMatch[1]; - } - params.push(paramInfo); - // Find the next match - paramMatch = reParam.exec(paramString); - } - return [{ - type: "macrocall", - name: macroName, - params: params, - isBlock: true - }]; + var call = this.nextCall; + call.isBlock = true; + this.nextCall = null; + this.parser.pos = call.end; + return [call]; }; })(); diff --git a/core/modules/parsers/wikiparser/rules/macrocallinline.js b/core/modules/parsers/wikiparser/rules/macrocallinline.js index 6e96d45b7..165a70dce 100644 --- a/core/modules/parsers/wikiparser/rules/macrocallinline.js +++ b/core/modules/parsers/wikiparser/rules/macrocallinline.js @@ -21,39 +21,29 @@ exports.types = {inline: true}; exports.init = function(parser) { this.parser = parser; - // Regexp to match - this.matchRegExp = /<<([^\s>]+)\s*([\s\S]*?)>>/mg; +}; + +exports.findNextMatch = function(startPos) { + var nextStart = startPos; + // Try parsing at all possible macrocall openers until we match + while((nextStart = this.parser.source.indexOf("<<",nextStart)) >= 0) { + this.nextCall = $tw.utils.parseMacroInvocation(this.parser.source,nextStart); + if(this.nextCall) { + return nextStart; + } + nextStart += 2; + } + return undefined; }; /* Parse the most recent match */ exports.parse = function() { - // Get all the details of the match - var macroName = this.match[1], - paramString = this.match[2]; - // Move past the macro call - this.parser.pos = this.matchRegExp.lastIndex; - var params = [], - reParam = /\s*(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|([^"'\s]+)))/mg, - paramMatch = reParam.exec(paramString); - while(paramMatch) { - // Process this parameter - var paramInfo = { - value: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6] - }; - if(paramMatch[1]) { - paramInfo.name = paramMatch[1]; - } - params.push(paramInfo); - // Find the next match - paramMatch = reParam.exec(paramString); - } - return [{ - type: "macrocall", - name: macroName, - params: params - }]; + var call = this.nextCall; + this.nextCall = null; + this.parser.pos = call.end; + return [call]; }; })(); diff --git a/editions/test/tiddlers/tests/test-html-parser.js b/editions/test/tiddlers/tests/test-html-parser.js index bbe4f1573..3e0214059 100644 --- a/editions/test/tiddlers/tests/test-html-parser.js +++ b/editions/test/tiddlers/tests/test-html-parser.js @@ -90,7 +90,7 @@ describe("HTML tag new parser tests", function() { { type : 'macro-parameter', start : 0, value : 'one two three', end : 17 } ); expect($tw.utils.parseMacroParameter("myparam>",0)).toEqual( - { type : 'macro-parameter', start : 0, value : 'myparam', end : 7 } + { type : 'macro-parameter', start : 0, value : 'myparam>', end : 8 } ); }); diff --git a/editions/test/tiddlers/tests/test-wikitext-parser.js b/editions/test/tiddlers/tests/test-wikitext-parser.js index 697c5400a..12607a29f 100644 --- a/editions/test/tiddlers/tests/test-wikitext-parser.js +++ b/editions/test/tiddlers/tests/test-wikitext-parser.js @@ -114,10 +114,104 @@ describe("WikiText parser tests", function() { }); - it("should parse macro calls", function() { + it("should parse inline macro calls", function() { expect(parse("<<john>><<paul>><<george>><<ringo>>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'macrocall', name : 'john', params : [ ] }, { type : 'macrocall', name : 'paul', params : [ ] }, { type : 'macrocall', name : 'george', params : [ ] }, { type : 'macrocall', name : 'ringo', params : [ ] } ] } ] + [ { type: 'element', tag: 'p', children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'macrocall', start: 8, params: [ ], name: 'paul', end: 16 }, { type: 'macrocall', start: 16, params: [ ], name: 'george', end: 26 }, { type: 'macrocall', start: 26, params: [ ], name: 'ringo', end: 35 } ] } ] + + ); + expect(parse("text <<john one:val1 two: 'val \"2\"' three: \"val '3'\" four: \"\"\"val 4\"5'\"\"\" five: [[val 5]] >>")).toEqual( + + [{ type: 'element', tag: 'p', children: [ { type: 'text', text: 'text ' }, { type: 'macrocall', name: 'john', start: 5, params: [ { type: 'macro-parameter', start: 11, value: 'val1', name: 'one', end: 20 }, { type: 'macro-parameter', start: 20, value: 'val "2"', name: 'two', end: 35 }, { type: 'macro-parameter', start: 35, value: 'val \'3\'', name: 'three', end: 52 }, { type: 'macro-parameter', start: 52, value: 'val 4"5\'', name: 'four', end: 73 }, { type: 'macro-parameter', start: 73, value: 'val 5', name: 'five', end: 89 } ], end: 92 } ] } ] + + ); + expect(parse("ignored << carrots <<john>>")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'ignored << carrots ' }, { type: 'macrocall', name: 'john', start: 19, params: [ ], end: 27 } ] } ] + + ); + expect(parse("text <<<john>>")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'text ' }, { type: 'macrocall', name: '<john', start: 5, params: [ ], end: 14 } ] } ] + + ); + expect(parse("before\n<<john>>")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'before\n' }, { type: 'macrocall', start: 7, params: [ ], name: 'john', end: 15 } ] } ] + + ); + // A single space will cause it to be inline + expect(parse("<<john>> ")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'text', text: ' ' } ] } ] + + ); + expect(parse("text <<outie one:'my <<innie>>' >>")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'text ' }, { type: 'macrocall', start: 5, params: [ { type: 'macro-parameter', start: 12, value: 'my <<innie>>', name: 'one', end: 31 } ], name: 'outie', end: 34 } ] } ] + + ); + + }); + + it("should parse block macro calls", function() { + expect(parse("<<john>>\n<<paul>>\r\n<<george>>\n<<ringo>>")).toEqual( + + [ { type: 'macrocall', start: 0, name: 'john', params: [ ], end: 8, isBlock: true }, { type: 'macrocall', start: 9, name: 'paul', params: [ ], end: 17, isBlock: true }, { type: 'macrocall', start: 19, name: 'george', params: [ ], end: 29, isBlock: true }, { type: 'macrocall', start: 30, name: 'ringo', params: [ ], end: 39, isBlock: true } ] + + ); + expect(parse("<<john one:val1 two: 'val \"2\"' three: \"val '3'\" four: \"\"\"val 4\"5'\"\"\" five: [[val 5]] >>")).toEqual( + + [ { type: 'macrocall', start: 0, name: 'john', params: [ { type: 'macro-parameter', start: 6, value: 'val1', name: 'one', end: 15 }, { type: 'macro-parameter', start: 15, value: 'val "2"', name: 'two', end: 30 }, { type: 'macro-parameter', start: 30, value: 'val \'3\'', name: 'three', end: 47 }, { type: 'macro-parameter', start: 47, value: 'val 4"5\'', name: 'four', end: 68 }, { type: 'macro-parameter', start: 68, value: 'val 5', name: 'five', end: 84 }], end: 87, isBlock: true } ] + + ); + expect(parse("<< carrots\n\n<<john>>")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'text', text: '<< carrots' } ] }, { type: 'macrocall', start: 12, params: [ ], name: 'john', end: 20, isBlock: true } ] + + ); + expect(parse("before\n\n<<john>>")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'before' } ] }, { type: 'macrocall', start: 8, name: 'john', params: [ ], end: 16, isBlock: true } ] + + ); + expect(parse("<<john>>\nafter")).toEqual( + + [ { type: 'macrocall', start: 0, name: 'john', params: [ ], end: 8, isBlock: true }, { type: 'element', tag: 'p', children: [ { type: 'text', text: 'after' } ] } ] + + ); + expect(parse("<<multiline arg:\"\"\"\n\nwikitext\n\"\"\" >>")).toEqual( + + [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 11, value: '\n\nwikitext\n', name: 'arg', end: 33 } ], name: 'multiline', end: 36, isBlock: true }] + + ); + expect(parse("<<outie one:'my <<innie>>' >>")).toEqual( + + [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 7, value: 'my <<innie>>', name: 'one', end: 26 } ], name: 'outie', end: 29, isBlock: true } ] + + ); + }); + + it("should parse tricky macrocall parameters", function() { + expect(parse("<<john pa>am>>")).toEqual( + + [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'pa>am', end: 12 } ], name: 'john', end: 14, isBlock: true } ] + + ); + expect(parse("<<john param> >>")).toEqual( + + [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'param>', end: 13 } ], name: 'john', end: 16, isBlock: true } ] + + ); + expect(parse("<<john param>>>")).toEqual( + + [ { type: 'element', tag: 'p', children: [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'param', end: 12 } ], name: 'john', end: 14 }, { type: 'text', text: '>' } ] } ] + + ); + // equals signs should be allowed + expect(parse("<<john var>=4 >>")).toEqual( + + [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'var>=4', end: 13 } ], name: 'john', end: 16, isBlock: true } ] ); From 010158db81d738580412fcbe77c886d4151086ac Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Fri, 29 Jan 2021 15:34:06 +0100 Subject: [PATCH 1217/2376] Fix tiddler info area content bleeding on close animation (#5453) --- themes/tiddlywiki/vanilla/base.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index cab5a84aa..60354b7ac 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -995,6 +995,7 @@ button.tc-btn-invisible.tc-remove-tag-button { {{$:/themes/tiddlywiki/vanilla/sticky}} .tc-tiddler-info { + overflow: hidden; padding: 14px 42px 14px 42px; background-color: <<colour tiddler-info-background>>; border-top: 1px solid <<colour tiddler-info-border>>; From 4c7dcb83d1c942f61b811adb606c00896140dec2 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Fri, 29 Jan 2021 09:57:30 -0500 Subject: [PATCH 1218/2376] Fix for #3306, inline/block widget glitch (#5452) * Fix for #3306, inline/block widget glitch * Just realized we don't need to set lastIndex anymore * Forgot that parseBlocks doesn't use options --- core/modules/parsers/wikiparser/rules/html.js | 11 +++-------- editions/test/tiddlers/tests/test-wikitext-parser.js | 6 ++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/modules/parsers/wikiparser/rules/html.js b/core/modules/parsers/wikiparser/rules/html.js index b92d19a69..b9e6bdc69 100644 --- a/core/modules/parsers/wikiparser/rules/html.js +++ b/core/modules/parsers/wikiparser/rules/html.js @@ -53,17 +53,12 @@ exports.parse = function() { tag.isBlock = this.is.block || hasLineBreak; // Parse the body if we need to if(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) { - var reEndString = "</" + $tw.utils.escapeRegExp(tag.tag) + ">", - reEnd = new RegExp("(" + reEndString + ")","mg"); + var reEndString = "</" + $tw.utils.escapeRegExp(tag.tag) + ">"; if(hasLineBreak) { tag.children = this.parser.parseBlocks(reEndString); } else { - tag.children = this.parser.parseInlineRun(reEnd); - } - reEnd.lastIndex = this.parser.pos; - var endMatch = reEnd.exec(this.parser.source); - if(endMatch && endMatch.index === this.parser.pos) { - this.parser.pos = endMatch.index + endMatch[0].length; + var reEnd = new RegExp("(" + reEndString + ")","mg"); + tag.children = this.parser.parseInlineRun(reEnd,{eatTerminator: true}); } } // Return the tag diff --git a/editions/test/tiddlers/tests/test-wikitext-parser.js b/editions/test/tiddlers/tests/test-wikitext-parser.js index 12607a29f..ea17ff857 100644 --- a/editions/test/tiddlers/tests/test-wikitext-parser.js +++ b/editions/test/tiddlers/tests/test-wikitext-parser.js @@ -103,6 +103,12 @@ describe("WikiText parser tests", function() { [ { type : 'element', tag : 'p', children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : false, children : [ { type : 'text', text : '\n!some heading' } ] } ] } ] } ] ); + // Regression test for issue (#3306) + expect(parse("<div><span><span>\n\nSome text</span></span></div>")).toEqual( + + [ { type : 'element', tag : 'p', children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { }, tag : 'span', end : 11, isBlock : false, children : [ { type : 'element', start : 11, attributes : { }, tag : 'span', end : 17, isBlock : true, children : [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'Some text' } ] } ] } ] } ] } ] } ] + + ); }); it("should parse macro definitions", function() { From a360adbba924d222c5b55709133c18890c04398d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 29 Jan 2021 15:22:43 +0000 Subject: [PATCH 1219/2376] Ensure dropzone is full size even if story river is empty Thanks @jeremyredhead Fixes #5446 --- themes/tiddlywiki/vanilla/base.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 60354b7ac..001f1419d 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -420,6 +420,10 @@ a.tc-tiddlylink-external:hover { background-color: <<colour page-background>>; } +.tc-page-container > .tc-dropzone { + min-height: 100vh; +} + .tc-dropzone { position: relative; } From 2b41661721ace534b5f51ded3a5812c9d028ecd8 Mon Sep 17 00:00:00 2001 From: Dyllon Gagnier <dyllongagnier@gmail.com> Date: Fri, 29 Jan 2021 07:25:43 -0800 Subject: [PATCH 1220/2376] Signing the CLA (#5445) Co-authored-by: Jeremy Ruston <jeremy@jermolene.com> --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index b95cf77e3..f535dc12b 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -442,4 +442,6 @@ Daniel Goß, @FlashSystems, 2021/01/19 Yoonchae Lee, @BlueGreenMagick, 2021/01/21 +Dyllon Gagnier, @slaymaker1907, 2021/01/24 + J. Wilhelm, @jeremyredhead, 2021/01/27 From 3eefb3cce6e84c1c1c1ccca111683d3ad502760b Mon Sep 17 00:00:00 2001 From: Dyllon Gagnier <dyllongagnier@gmail.com> Date: Fri, 29 Jan 2021 07:26:25 -0800 Subject: [PATCH 1221/2376] Fix backtracking issue with regex (#5401) There was an unnecessary --- core/modules/filters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index 2925c515e..1a3c6f451 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -78,7 +78,7 @@ function parseFilterOperation(operators,filterString,p) { nextBracketPos = filterString.indexOf(">",p); break; case "/": // regexp brackets - var rex = /^((?:[^\\\/]*|\\.)*)\/(?:\(([mygi]+)\))?/g, + var rex = /^((?:[^\\\/]|\\.)*)\/(?:\(([mygi]+)\))?/g, rexMatch = rex.exec(filterString.substring(p)); if(rexMatch) { operator.regexp = new RegExp(rexMatch[1], rexMatch[2]); From 6a55069609bba21a172fcd6ccfc17c35704e05d3 Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Fri, 29 Jan 2021 19:16:41 +0100 Subject: [PATCH 1222/2376] Fix the right margin of tags used outside of the tags wrapper (#5440) --- themes/tiddlywiki/vanilla/base.tid | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 001f1419d..c197d3971 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -689,13 +689,16 @@ button svg.tc-image-button, button .tc-image-button img { .tc-tag-list-item { position: relative; display: inline-block; - margin-right: 7px; } .tc-tags-wrapper { margin: 4px 0 14px 0; } +.tc-tags-wrapper .tc-tag-list-item { + margin-right: 7px; +} + .tc-missing-tiddler-label { font-style: italic; font-weight: normal; From f2aba29d94cddcff6d7c188c4aa0b668995d8002 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 31 Jan 2021 15:11:12 +0000 Subject: [PATCH 1223/2376] Update to KaTeX v0.12.0 --- plugins/tiddlywiki/katex/files/README.md | 159 +- .../katex/files/fonts/KaTeX_AMS-Regular.ttf | Bin 70972 -> 70936 bytes .../katex/files/fonts/KaTeX_AMS-Regular.woff | Bin 38868 -> 36912 bytes .../katex/files/fonts/KaTeX_AMS-Regular.woff2 | Bin 32944 -> 31136 bytes .../files/fonts/KaTeX_Caligraphic-Bold.ttf | Bin 19316 -> 15416 bytes .../files/fonts/KaTeX_Caligraphic-Bold.woff | Bin 11696 -> 9376 bytes .../files/fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 10448 -> 8392 bytes .../files/fonts/KaTeX_Caligraphic-Regular.ttf | Bin 18684 -> 14908 bytes .../fonts/KaTeX_Caligraphic-Regular.woff | Bin 11460 -> 9148 bytes .../fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 10240 -> 8248 bytes .../katex/files/fonts/KaTeX_Fraktur-Bold.ttf | Bin 35660 -> 24400 bytes .../katex/files/fonts/KaTeX_Fraktur-Bold.woff | Bin 22632 -> 16208 bytes .../files/fonts/KaTeX_Fraktur-Bold.woff2 | Bin 20360 -> 13912 bytes .../files/fonts/KaTeX_Fraktur-Regular.ttf | Bin 34352 -> 23904 bytes .../files/fonts/KaTeX_Fraktur-Regular.woff | Bin 22088 -> 15880 bytes .../files/fonts/KaTeX_Fraktur-Regular.woff2 | Bin 19784 -> 13668 bytes .../katex/files/fonts/KaTeX_Main-Bold.ttf | Bin 60784 -> 59972 bytes .../katex/files/fonts/KaTeX_Main-Bold.woff | Bin 35464 -> 35056 bytes .../katex/files/fonts/KaTeX_Main-Bold.woff2 | Bin 30244 -> 29932 bytes .../files/fonts/KaTeX_Main-BoldItalic.ttf | Bin 44496 -> 42872 bytes .../files/fonts/KaTeX_Main-BoldItalic.woff | Bin 25352 -> 24500 bytes .../files/fonts/KaTeX_Main-BoldItalic.woff2 | Bin 21944 -> 21244 bytes .../katex/files/fonts/KaTeX_Main-Italic.ttf | Bin 47640 -> 46028 bytes .../katex/files/fonts/KaTeX_Main-Italic.woff | Bin 26228 -> 25352 bytes .../katex/files/fonts/KaTeX_Main-Italic.woff2 | Bin 22748 -> 22076 bytes .../katex/files/fonts/KaTeX_Main-Regular.ttf | Bin 69520 -> 68880 bytes .../katex/files/fonts/KaTeX_Main-Regular.woff | Bin 38112 -> 37856 bytes .../files/fonts/KaTeX_Main-Regular.woff2 | Bin 32464 -> 32312 bytes .../files/fonts/KaTeX_Math-BoldItalic.ttf | Bin 39308 -> 42300 bytes .../files/fonts/KaTeX_Math-BoldItalic.woff | Bin 22324 -> 23980 bytes .../files/fonts/KaTeX_Math-BoldItalic.woff2 | Bin 19720 -> 21192 bytes .../katex/files/fonts/KaTeX_Math-Italic.ttf | Bin 40992 -> 44484 bytes .../katex/files/fonts/KaTeX_Math-Italic.woff | Bin 22844 -> 24668 bytes .../katex/files/fonts/KaTeX_Math-Italic.woff2 | Bin 20096 -> 21668 bytes .../files/fonts/KaTeX_SansSerif-Bold.ttf | Bin 33688 -> 32588 bytes .../files/fonts/KaTeX_SansSerif-Bold.woff | Bin 18516 -> 17988 bytes .../files/fonts/KaTeX_SansSerif-Bold.woff2 | Bin 15732 -> 15296 bytes .../files/fonts/KaTeX_SansSerif-Italic.ttf | Bin 30960 -> 29860 bytes .../files/fonts/KaTeX_SansSerif-Italic.woff | Bin 17572 -> 17044 bytes .../files/fonts/KaTeX_SansSerif-Italic.woff2 | Bin 15024 -> 14484 bytes .../files/fonts/KaTeX_SansSerif-Regular.ttf | Bin 29812 -> 28708 bytes .../files/fonts/KaTeX_SansSerif-Regular.woff | Bin 16228 -> 15712 bytes .../files/fonts/KaTeX_SansSerif-Regular.woff2 | Bin 13708 -> 13300 bytes .../files/fonts/KaTeX_Script-Regular.ttf | Bin 24620 -> 23520 bytes .../files/fonts/KaTeX_Script-Regular.woff | Bin 13428 -> 12992 bytes .../files/fonts/KaTeX_Script-Regular.woff2 | Bin 12064 -> 11792 bytes .../katex/files/fonts/KaTeX_Size1-Regular.ttf | Bin 12916 -> 11932 bytes .../files/fonts/KaTeX_Size1-Regular.woff | Bin 6696 -> 6300 bytes .../files/fonts/KaTeX_Size1-Regular.woff2 | Bin 5592 -> 5332 bytes .../katex/files/fonts/KaTeX_Size2-Regular.ttf | Bin 12172 -> 11080 bytes .../files/fonts/KaTeX_Size2-Regular.woff | Bin 6436 -> 6012 bytes .../files/fonts/KaTeX_Size2-Regular.woff2 | Bin 5392 -> 5080 bytes .../katex/files/fonts/KaTeX_Size3-Regular.ttf | Bin 8120 -> 7028 bytes .../files/fonts/KaTeX_Size3-Regular.woff | Bin 4568 -> 4148 bytes .../files/fonts/KaTeX_Size3-Regular.woff2 | Bin 3728 -> 3400 bytes .../katex/files/fonts/KaTeX_Size4-Regular.ttf | Bin 11016 -> 10008 bytes .../files/fonts/KaTeX_Size4-Regular.woff | Bin 6184 -> 5820 bytes .../files/fonts/KaTeX_Size4-Regular.woff2 | Bin 5028 -> 4720 bytes .../files/fonts/KaTeX_Typewriter-Regular.ttf | Bin 35924 -> 34560 bytes .../files/fonts/KaTeX_Typewriter-Regular.woff | Bin 20260 -> 19700 bytes .../fonts/KaTeX_Typewriter-Regular.woff2 | Bin 17272 -> 16868 bytes plugins/tiddlywiki/katex/files/katex.css | 1035 +++++ plugins/tiddlywiki/katex/files/katex.js | 4101 +++++++++-------- plugins/tiddlywiki/katex/files/katex.min.css | 2 +- plugins/tiddlywiki/katex/files/katex.min.js | 2 +- .../files/katex.without-font-face.min.css | 2 +- plugins/tiddlywiki/katex/files/mhchem.min.js | 1684 +------ .../tiddlywiki/katex/files/tiddlywiki.files | 4 +- plugins/tiddlywiki/katex/plugin.info | 2 +- plugins/tiddlywiki/katex/readme.tid | 2 +- plugins/tiddlywiki/katex/wrapper.js | 12 - 71 files changed, 3399 insertions(+), 3606 deletions(-) create mode 100644 plugins/tiddlywiki/katex/files/katex.css diff --git a/plugins/tiddlywiki/katex/files/README.md b/plugins/tiddlywiki/katex/files/README.md index 27f2bc128..307fdbf94 100644 --- a/plugins/tiddlywiki/katex/files/README.md +++ b/plugins/tiddlywiki/katex/files/README.md @@ -1,135 +1,86 @@ -# [<img src="https://khan.github.io/KaTeX/katex-logo.svg" width="130" alt="KaTeX">](https://khan.github.io/KaTeX/) -[![Build Status](https://travis-ci.org/Khan/KaTeX.svg?branch=master)](https://travis-ci.org/Khan/KaTeX) -[![codecov](https://codecov.io/gh/Khan/KaTeX/branch/master/graph/badge.svg)](https://codecov.io/gh/Khan/KaTeX) -[![Join the chat at https://gitter.im/Khan/KaTeX](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Khan/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +# [<img src="https://katex.org/img/katex-logo-black.svg" width="130" alt="KaTeX">](https://katex.org/) +[![npm](https://img.shields.io/npm/v/katex.svg)](https://www.npmjs.com/package/katex) +[![CircleCI](https://circleci.com/gh/KaTeX/KaTeX.svg?style=shield)](https://circleci.com/gh/KaTeX/KaTeX) +[![codecov](https://codecov.io/gh/KaTeX/KaTeX/branch/master/graph/badge.svg)](https://codecov.io/gh/KaTeX/KaTeX) +[![Join the chat at https://gitter.im/KaTeX/KaTeX](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/KaTeX/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=KaTeX/KaTeX)](https://dependabot.com) +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/katex/badge?style=rounded)](https://www.jsdelivr.com/package/npm/katex) +![](https://img.badgesize.io/KaTeX/KaTeX/v0.12.0/dist/katex.min.js?compression=gzip) KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web. * **Fast:** KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in [this speed test](http://www.intmath.com/cg5/katex-mathjax-comparison.php). - * **Print quality:** KaTeX’s layout is based on Donald Knuth’s TeX, the gold standard for math typesetting. + * **Print quality:** KaTeX's layout is based on Donald Knuth's TeX, the gold standard for math typesetting. * **Self contained:** KaTeX has no dependencies and can easily be bundled with your website resources. * **Server side rendering:** KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML. -KaTeX supports all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 9 - IE 11. More information can be found on the [list of supported commands](https://khan.github.io/KaTeX/function-support.html) and on the [wiki](https://github.com/khan/katex/wiki). +KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 11. -## Usage +KaTeX supports much (but not all) of LaTeX and many LaTeX packages. See the [list of supported functions](https://katex.org/docs/supported.html). -You can [download KaTeX](https://github.com/khan/katex/releases) and host it on your server or include the `katex.min.js` and `katex.min.css` files on your page directly from a CDN: +Try out KaTeX [on the demo page](https://katex.org/#demo)! + +## Getting started + +### Starter template ```html -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.css" integrity="sha384-VEnyslhHLHiYPca9KFkBB3CMeslnM9CzwjxsEbZTeA21JBm7tdLwKoZmCt3cZTYD" crossorigin="anonymous"> -<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.js" integrity="sha384-O4hpKqcplNCe+jLuBVEXC10Rn1QEqAmX98lKAIFBEDxZI0a+6Z2w2n8AEtQbR4CD" crossorigin="anonymous"></script> +<!DOCTYPE html> +<!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly --> +<html> + <head> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous"> + + <!-- The loading of KaTeX is deferred to speed up page rendering --> + <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script> + + <!-- To automatically render math in text elements, include the auto-render extension: --> + <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous" + onload="renderMathInElement(document.body);"></script> + </head> + ... +</html> ``` -#### In-browser rendering +You can also [download KaTeX](https://github.com/KaTeX/KaTeX/releases) and host it yourself. -Call `katex.render` with a TeX expression and a DOM element to render into: +For details on how to configure auto-render extension, refer to [the documentation](https://katex.org/docs/autorender.html). -```js -katex.render("c = \\pm\\sqrt{a^2 + b^2}", element); -``` - -If KaTeX can't parse the expression, it throws a `katex.ParseError` error. - -#### Server side rendering or rendering to a string - -To generate HTML on the server or to generate an HTML string of the rendered math, you can use `katex.renderToString`: - -```js -var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}"); -// '<span class="katex">...</span>' -``` - -Make sure to include the CSS and font files, but there is no need to include the JavaScript. Like `render`, `renderToString` throws if it can't parse the expression. - -#### Security - -Any HTML generated by KaTeX *should* be safe from `<script>` or other code -injection attacks. -(See `maxSize` below for preventing large width/height visual affronts.) -Of course, it is always a good idea to sanitize the HTML, though you will need -a rather generous whitelist (including some of SVG and MathML) to support -all of KaTeX. - -#### Handling errors - -If KaTeX encounters an error (invalid or unsupported LaTeX), then it will -throw an exception of type `katex.ParseError`. The message in this error -includes some of the LaTeX source code, so needs to be escaped if you want -to render it to HTML. In particular, you should convert `&`, `<`, `>` -characters to `&`, `<`, `>` (e.g., using `_.escape`) -before including either LaTeX source code or exception messages in your -HTML/DOM. (Failure to escape in this way makes a `<script>` injection -attack possible if your LaTeX source is untrusted.) - -#### Rendering options - -You can provide an object of options as the last argument to `katex.render` and `katex.renderToString`. Available options are: - -- `displayMode`: `boolean`. If `true` the math will be rendered in display mode, which will put the math in display style (so `\int` and `\sum` are large, for example), and will center the math on the page on its own line. If `false` the math will be rendered in inline mode. (default: `false`) -- `throwOnError`: `boolean`. If `true`, KaTeX will throw a `ParseError` when it encounters an unsupported command. If `false`, KaTeX will render the unsupported command as text in the color given by `errorColor`. (default: `true`) -- `errorColor`: `string`. A color string given in the format `"#XXX"` or `"#XXXXXX"`. This option determines the color which unsupported commands are rendered in. (default: `#cc0000`) -- `macros`: `object`. A collection of custom macros. Each macro is a property with a name like `\name` (written `"\\name"` in JavaScript) which maps to a string that describes the expansion of the macro. Single-character keys can also be included in which case the character will be redefined as the given macro (similar to TeX active characters). -- `colorIsTextColor`: `boolean`. If `true`, `\color` will work like LaTeX's `\textcolor`, and take two arguments (e.g., `\color{blue}{hello}`), which restores the old behavior of KaTeX (pre-0.8.0). If `false` (the default), `\color` will work like LaTeX's `\color`, and take one argument (e.g., `\color{blue}hello`). In both cases, `\textcolor` works as in LaTeX (e.g., `\textcolor{blue}{hello}`). -- `maxSize`: `number`. If non-zero, all user-specified sizes, e.g. in `\rule{500em}{500em}`, will be capped to `maxSize` ems. Otherwise, users can make elements and spaces arbitrarily large (the default behavior). +### API +Call `katex.render` to render a TeX expression directly into a DOM element. For example: ```js -katex.render("c = \\pm\\sqrt{a^2 + b^2}\\in\\RR", element, { - displayMode: true, - macros: { - "\\RR": "\\mathbb{R}" - } +katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, { + throwOnError: false }); ``` -#### Automatic rendering of math on a page +Call `katex.renderToString` to generate an HTML string of the rendered math, +e.g., for server-side rendering. For example: -Math on the page can be automatically rendered using the auto-render extension. See [the Auto-render README](contrib/auto-render/README.md) for more information. - -#### Font size and lengths - -By default, KaTeX math is rendered in a 1.21× larger font than the surrounding -context, which makes super- and subscripts easier to read. You can control -this using CSS, for example: - -```css -.katex { font-size: 1.1em; } +```js +var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", { + throwOnError: false +}); +// '<span class="katex">...</span>' ``` -KaTeX supports all TeX units, including absolute units like `cm` and `in`. -Absolute units are currently scaled relative to the default TeX font size of -10pt, so that `\kern1cm` produces the same results as `\kern2.845275em`. -As a result, relative and absolute units are both uniformly scaled relative -to LaTeX with a 10pt font; for example, the rectangle `\rule{1cm}{1em}` has -the same aspect ratio in KaTeX as in LaTeX. However, because most browsers -default to a larger font size, this typically means that a 1cm kern in KaTeX -will appear larger than 1cm in browser units. +Make sure to include the CSS and font files in both cases. +If you are doing all rendering on the server, there is no need to include the +JavaScript on the client. -### Common Issues -- Many Markdown preprocessors, such as the one that Jekyll and GitHub Pages use, - have a "smart quotes" feature. This changes `'` to `’` which is an issue for - math containing primes, e.g. `f'`. This can be worked around by defining a - single character macro which changes them back, e.g. `{"’", "'"}`. -- KaTeX follows LaTeX's rendering of `aligned` and `matrix` environments unlike - MathJax. When displaying fractions one above another in these vertical - layouts there may not be enough space between rows for people who are used to - MathJax's rendering. The distance between rows can be adjusted by using - `\\[0.1em]` instead of the standard line separator distance. -- KaTeX does not support the `align` environment because LaTeX doesn't support - `align` in math mode. The `aligned` environment offers the same functionality - but in math mode, so use that instead or define a macro that maps `align` to - `aligned`. +The examples above use the `throwOnError: false` option, which renders invalid +inputs as the TeX source code in red (by default), with the error message as +hover text. For other available options, see the +[API documentation](https://katex.org/docs/api.html), +[options documentation](https://katex.org/docs/options.html), and +[handling errors documentation](https://katex.org/docs/error.html). -## Libraries +## Demo and Documentation -### Angular2+ -- [ng-katex](https://github.com/garciparedes/ng-katex) Angular module to write beautiful math expressions with TeX syntax boosted by KaTeX library - -### Ruby - -- [katex-ruby](https://github.com/glebm/katex-ruby) Provides server-side rendering and integration with popular Ruby web frameworks (Rails, Hanami, and anything that uses Sprockets). +Learn more about using KaTeX [on the website](https://katex.org)! ## Contributing diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.ttf index afcd2eb4d1488b6eb04b00302eaa6e223812b012..737cf8eb58a98d8717f742fca3f10f6d214e4e22 100644 GIT binary patch delta 39681 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óLADS~!@@}heK2x1K5;J_Oe?WFij$=m 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 C%3+fL delta 41037 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�UzJRF4?Lf=Qo_tGF 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 LS>Z2S;B5a72=SWS diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff index 4f575152f2d92dfe48ed316b668e5558c6102c93..38378bfba8d66d78d68b0a392316adca9e042a11 100644 GIT binary patch delta 35580 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 W0V5{NSbhONLtg;^0RRF2{{RnkFPBjO delta 37552 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 U_lgbs7ut1b;s5~v0ssF158l7xhX4Qo diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_AMS-Regular.woff2 index b982d6eaf85fcd6eaa94a0302bdf1db9c08e8231..a4d1ba64101f2102fd7dfab61bb98ade4de55870 100644 GIT binary patch literal 31136 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 DMdwbj literal 32944 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.ttf index f84148db5806b752524c18c6173fa19e8675c976..04d28abd99572bb80ae0cabbf3dd9072cd1d7a2a 100644 GIT binary patch delta 680 zcmYjNT}V@57=FI<?dNP~&P^7HBX%q=%my1We^RkVL+l3%x(PG$H0O@6>0w(kL0Umk zq%7h@b`wQ(6J!xX=pwpFOe9DcL?TgOflxw1-FAA<T+qe$z0dP}@B6&(`~AAhUgis6 z0Nl6?j^UH1L#=&RG7``-Na}Drt!S8GLE^87$KsPY8D-~vpreU+%cz!2fAp>Y1P&0D z=8{TQBj5pg!W6}1YHGA=<*k?S51_eSO(-J`^K&6!|5ei3RW(si#4>+QUY#T~sp(w) z%o-o31he6EY9g-86z*&jj}bqdR`MF_c6AXq2av~=bV5<4KhZ#^0L!E{k<A@kDIEg3 zm+4*AG6}7C<I58Dx<~vb1hi6I7Ix9Pc8CkM+kf_y<|VP2b~ZmEfGh;PCDM5AGg}aX z!gpS@T(@4ZU9$)6@5NciQ73c0kh-O9*H+Dj`$285r`}WaM(g&~een5x{)z|rY%ZnN z&e!(*hQv3?73-lV<$uxmW(?|!5m|S&r9`uU_meQ&=C=kQ@ZI{;w%!3e<g(F;0p5?t zGH`2%o7KWIy5vd^fsm>B=r-r}!Gg+{L!=$eEb=gn3W}P@*f8E0m%vIR9cNty2Qp@% z#X$*==<HyIy~K8~Kt_vI%y9zms@Q@ctFK}!8d$7~ZU5;tLWT`hbvGh>6-O`u4O7&0 s3`wZ^>wa%(tM4mk&{vN&Is!BTqq({6KHl!JUmPC`hofPV7_CtI7ii#<oB#j- delta 4611 zcmbVQYit|Wl|J{*ojb$fL!|hoUc-lmltfV@lA>OeP1&++Q*vY{aqPsdBbuU3C6X+Q za_j&FW?Q7K+otJ5bz1a=HYm^nE!s3jf&H;t>@IeT-83nRxZP&aVzEF`z(3li-R<s= z7LE4YA-xF_cY)mzX6D{=&%JZccfNDZrT+59@1G|Y5CHJNUw{OwD-Vt37r#^U0Ze=y zrK|PL+V+3F{?ZcwB^7{NtUtA@!yWC50Ea(;<HMJ>FK@mc_}Om(CN}__pSfIXZKK=^ zu!Mb3FK;}3sbw|ZhwWbh6pGD8Z7q2F+DU-o7f@DeHXBw=y(4`LKlls^Qq9fX8#{O8 z8>sMO?7z5irC#g)o}9sc1^bU})^2Q*<E|O(>)6+~YMYHeo&4+wZs@N7l)(0t*6wSM zB>n@S`Xe0w-1bgm`?;I{_I(^@*#8Jn$m9DTX%Nj-K>aTN<ePm~ZvPGHC9mMVM<7*+ zr~0TwNfm*i5}|dFBshnYJh0rGDR~)>jIe|;Q7lcC3Wa<)6b=Ogl95a(oGSqy3<ybn z5=SSB#)M&zFZ^M5<#Z$(7<W8j4!+PcYerlSLMW9zU-HP55@I=g+wX0*yqtIrPhWa3 zNkk&fc$SU%j>Qrl)AS@_$9!Wf8%GZSLPvf>UWEx5sbsnc5PP3w2lppakZTMVmd@jr zz0&gOiKkMDNzP*<{$jCIEagj+1>Bg}b1>L`26!@ISPAi*m?#Q^CW=X}Bsfnd4dWzX zM4=JuxJ&UeS}rq9@r15EvK{s)PN_Ugv_Z)mQ3o}Nyq_yvVvHDEV}JWMl>52QMXAfj zgN%OWc}XIKImGr008~b#7hvzZDMA^kF1_fsPM)oxah!2z0;7~&LQM{Y*Aadyp9fj? z%F8`VF9uLC(N<*J|BGfN`8Fla=+^z#d-Tyt*MV|&C_Z5I#G;Wwufjtk-NLbLh=g0w zD)Gk^1))Qa+SrBL;$$Li*vcptzD^?rf;Jg$72}@t&9bX$ri0N)DJijhIQ(UgQ&l9* z?_&-!Kq+TGctui}%&xADSzYmy`f!#|2gxL2z5Z$9%B3a;l0I+1Lukb5B*YW-DO6UK z&&ymw2W!3%V@Kxnu6U{(awwF#12F-wxj#zX$c`0wpt2MqGEWjF(JDp;SAcJWBr{n; z=m>J3D0Ku`mbh%yZ7k0KWAq$QMpsr&EG`_Jn<xyW;{!%OMPU2_jW#$4f^8<QskGUT z2qA&eA|`Mw7*G^01_apzE&>@G6fkwdBANKkczPktJk9EfCqtG?@1J#boz6tE`qupE z_c_V1k;?YD6ec;+6G!}N*d6tb8B8G#J>eSisqx`a^0ePfW-<w1*TmuR(P-cJ@KB7g zU^y|iP)H3e9pcVZZZt6*R0W^><?!UvfX^vYInd3KQr@X>W(<=G1%3Yjwff0VU>XiU zr7|~581*4rX%)H0=nf~~APOj}no5!1=VU^Nmn_d<2AVlAGl$a(@uCr*iI<$bXC#b_ z=!B6l*+vBHG|^^GC+-3YhF3cRMF3iek22}wO88$i=8(<t4}O55n;AL9Bn&DKk4e}y z(oEABaxN`76?gYzsao{Nr>a|j$5g+=!|5{=mBJyFJS&nGI{F{}p30_-ayioNrevSc zZ=S|{0n^A4898zS>XlU&A*#nBoE{_!PZOE3s)K+EJIENu6%l1JXYv+`2vtcP5#tKw zb>xjCpTWSC&LOF!6#`4g50s}T$429NPt@;oI^YC3q4B^7$s-@^C_+S%!A|}WY_ds# zj0st`26CyxnS0S>(+V-P5iPa(L|*n#8mVr2{e#^SQSygoC-ZZ+uAZCArIUxKt6!#) zgBfOs7rkAs?y=Kp)zKA3zY`++k3PKefQP&q>!Nb3>Y?nq+#ijt&Nr;qtXYm{)C0&Y z2bCmMiV}Cc@APV9aM~$5rEi`;O^L*NdKsE;Vy*DdPs1=AhEk=V5iVm2W(X`J7+?TQ zf;#qOPGk%)E+PsiEKd&x)9Fl7L6#6Bi5?f2D3c<kSe;bU1_VRI&du#`Q;f9GY*&>+ zz9g~`;)7-7R)7VZ*#%z+-5o9rug=aaOym}iO<kQo_F<o)TuqfzYH%<Ta%VZyB1OqX z`+RPUA%&jO*sz{$cG3R6gEN;-tXZ*8YUy8}JA27RVvYXPU{CrrKXtgXmky=6U1`F+ z9#6DY#c&}|LGt9t&tV2;DwE?xqP+wk!hW^`STvD)m|e(K3@r+0uqX-hfv!xIa#<r8 zi(Hg>aKs-7=P@~iMI92{uxx%{3n?LD#x^mDW#}GljI=1Wb_l&tP!lq_^#SUp^wg;- z4eOnp3P(~hk<a$bCD@bC$*KdhTtMX66lO|qP?pKd3T910d%G!n&xNJ;XXf&1psz2a zg!ew0T^zKC#HJ$>vP5NfnTm0Qer)^s7NlVks*tOUEEJP2Or~$03mAFpU@$#3Rh_P8 zhx?-mVc}q#-R<&#CW%DQPJY6L?G%aUgpgD;&`hiC-Z0uI<x5C+F~LZu@k9{}gsA7{ z#?a`|6TY6KnBXG){jTW9l!wu7eqrmRsus&P4o{u$mIu7$qh4;b=8g|($Gk(Dro^(# ze_h+ue2>m&62-K{-0{);l-V5|P$+r$=z}JwQr`ulju$OD>UQ=8oqEQ_lW$%e9aD^` zns$U`9?Q;^=R}$`_j43O2TWLouT`9L-IU83K}fNFYj#ye8c>4e8;Q@5_*B8u6RctY zhzuc4BUr!tP%{ariIm06a!=KIw{B(VU1}U8!X=S`fSwWbI&V)qiFG_k;83MFo=HZ- zZYP()B&Ld~Cv2b6Y_ySXNTA6HgcNh{y~>S%qcaLt=MblGKgMO7br^8{w9tt*bcpfW z>Z2G@iLfzaL;@0#V`+cSg|go3bkAqZg5+X)^u*BASEiX9F@j#qiFm||#d-o!r><cU zPQG?<zJGAAZ!qLaMXM`bCF$m6{ph5TO&?Bm2M7<$oq7J(5BAW@#P4xw39Y)M8U0Sp zsV`{RgFTV-?FeyZEHoa&@b|FRIljsaVKzs`Cknwh-fJYgCN2RI>SgbzR}gybOGLD| z)@(g~8_Pp`EwO|>mW7tcX?RiShuq%OP}q7BUM4rFm)?{N>8mWlz9c`+GyF~Enp#wU z>iCiN4d)MC*W3~JPduOMs&@Us`;2d<yX4RM?*={;tOb7>`bc;qG7w$EzZ=nKqo2dI z#V+u^d*`FKAMYyvCpe|M;*+nx^w~e&d++~pe^fp$9RsrW(oifz4?+&_lXw^KHu2W+ zp6;|OowvF7%Fspt@e)`FJMHgC$M#3}D#JZ;7HRaoz186Z)*JhhzCQ(z;Ro*M03W|# z8%@836LfofqA%`Vy9a<rY`fKqG_IiBg%y%wTgMZ@WANoS_V@Qus$;;+WA9Jc{l)%| z_g~$=>CJXlz~S~qIJAF+i7pYIv%S|Iw4aDg+X-*Uuq-R8Lvy;^9hs-g>+ALh@B|u( z#(H}D`UmuQBAFUA(r-=rvn}h-j{H9cuu%M8uiJkdKI^hV#PdJcoWdp0Z2RehQ=PUz z_+qCmfdS%&g18uj;Mq=F1~<IWY4f+q-DDcR-I04BM(%dnUg)eZK=9cgK-Y?&EARql znRc5%f_}Brrl8XAciIvx(;s%)46;(J)0QD7Eq2=cZE`o=kybl$4;1CsI&CkmZ{7QV zPki9;mF=f@)-N}A^-O(8&zt7-Xx<z*^@T=j{qmOnP<_3zRc~bV<6HHd_D<#TqEMdF zmzuRLeZF2>YivHfRC~B__VL5DjrGerwe9A5{m_+-wZ$u2yNg$LE;sai&NB5G{asq4 zLhb(2M;be=^($MtnKN_6cW$Ax-|T%itY^yCuV2q?)^?ju)NbT(0|$mQ>zzy7&x+2> zC(*E4+phNPtag2Ux2ZqaXf<}8YOLwPF#Q4i@4&k)%4yoe&GlAW<)JH=cCXiV8v1(6 z(l^%Yjja~WzP7d2*wJ^J4gI0x%lgW8W2>#b+*Ziy_e>wpjpy2{b>`}|r)ujPwTl}K z-QG}5Uz|Us*LG*L=I-wH%-C3~zO%l)+sd`pH^k1zRu-2#BmVmg?dj8Fw|_VJ&(hvM z&FXz3hl#Q(fgb`8L~@5A0#S%T5A^Q+`)tW168>bDm1|q;ra5nl_mRcLh0gm(=e=kz JLoh>i{WoV?<-Gs^ diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff index ab56ab7fa707dda6bf71209cf0275ef6be2bab03..a01ce906060328399bad5499e87b6bac40f8fb3c 100644 GIT binary patch delta 7841 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 delta 10179 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 JetiXD{vUlJLM{LR diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Bold.woff2 index 710c26179c5f1c9998065035a82a578cf45d60e9..37927274af1e1e3eabcf1763e9dbc261473dc4ef 100644 GIT binary patch literal 8392 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 literal 10448 zcmV;>C@<G{Pew8T0RR9104UG^4gdfE085wv04R3=0RR9100000000000000000000 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 G0002%wf^z| diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.ttf index 97814db7e2c7bb3039692551a4fbbb7f33baa46a..b2ce555fd5d1d1eb6411cc41c3688bd077452458 100644 GIT binary patch delta 678 zcmYjPOK1~O6g}_FH2*d!NorFm8PjTu6cS@vTJaZ%P!Lg+78=oZOw**0&m@f!OSKg@ zMT;c_8r+EsLEN+iSJssuL|j-A5i1ztMnS}d;zl#xNmFo!dH0-i?>+Cn$NVX<_1rud zfEFx3z{JTjUjMN}(*>aS6sZ%Dq^#g3>m$BOJQTT<lW@f}0`#{N-#ewmlJ6axKPdkb zFqdNTj6%8%I1r#{h$SvhxhB^-2!8|i^u?p{q-&#O2YT|P4aDQod0GEV@Q?v*g6?=S zmp@VB->E>`a4wOK$k!h&k$KM`@uNvOudorz5#rhaQc6xnFL)PHG*Ac-7nSr(Zs=v1 z@<XpEA6K$b<<?^5IS^PPeghnSiZ8g6j;n{^p{`KtEO(h}yN%j4xRC=duI$@&?l=3& z$N2|gR-A2e>2~TK>&FZp!@BXB$z!@_?l=Fnd~BX;>9o47w{6E;yIL#uHhWwBD#>T` z-NvVJ>%m_z3tz|;o8J3xx1(BBGew_YD(3x(UadiJsu_gEHMLr+h?%;DR=fSU!TD;j zegEMw?g)}Ph_K+qvIH!j7qlAwfEKCV#tCVfgI4V{4v6qkG|;Q%B#?)y)=^MH>Sy(d zdKIkvI&jvKHX^Gvibg89OWzh|@DSU=oc@!i4J_a^-ZZcXKkIJbCUmgT2G;$jH}fo0 q8hQ%?LbV(W?GTG&!;;ZWn=zVDD6R|-*z^}u(>`C&M-ro9t^WYhSdb$C delta 4517 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff index aec8a33389cb27a7e2e603ece720eb000fb9a0a9..bc169b7cdd8b30947558f542d59ab407a0646ab9 100644 GIT binary patch delta 7611 zcmY*;Wl)?=xa_jH1qkl81h?Q8EC~b&?gVFXcYPOk4;DOFaF^f~EJ&~*!P(%!UC(~! z-uvTDRo6^+_4G4UQ}bi$8PMyH1H4q;zXu_K5QDJ;^y0r+RQ&(&|JMKiP|@Ii4FXYe zAXGI3Ox{V@B$+#yIwLd~g7YKr78HZTVeaWp2LjReAUFjAY@h%vEvU1V1H#t`0-?r$ zK-lREM1M}KOx*y)W=4bv!uY?yx3c$vf<Q=bK_Idg5a<;LxkVj?wWX;ABFhlr5&RG2 zQ|W}(2oVv8gW$9XK+u06Ggv#gdn0_G5!@32f8})Wk-d{S!bd@c;8On~q&@b+!PFa3 zm;3<)0zh;Kkq$`<N7B*M!4h%mWkm4=5C|pGj2q_Y?BwQ-IG{bkBaeW!$Y_J4v#TXy zGrbgo2Otm~AGtp0y_D*M>P`7!+EYgW*IJ6l3~G=joy=rj3GwWyqwWxnZ^$@gQtX1< zudMX(Zk^MfuM8<gNb>RV0epO0+s6b8tB*ICA2yH5Y^_$mw%B4MlhDIezRIyAy}b`I zk#cUHdeI!x<XJm=H=U!6-T8d&q<=!qlofEXV?+7;N{?A*B(MAA-%>GUz`^qSa9d$L z=@+e;6xElfzQ=tng$mZubaO1W*O&x!7|Zk0jKS8MFOcb8!U;pw4*>AS^0q<QMlWF~ zLx8+$e?)ilZ`A@xzT~;o$`b5P?Lyl0ZPUNjD(hP2TWXB-xbn(WbSjF!(!Y)~D*fa5 z<Li`X#k`hI&C33Sm+z-0)=qg2il1NaDoWFG6GJLAE49$){mTRmb=Yk;o>_|QD+udF ze&!2r>{ZrZUWVkqB4`3U$53Mo=tNEu_1q0jf}%c?MiWt$`~h!-&^9VeR2h}Uq$p*S zuJ#e4$@JXF#<>d}7Ec8{IXxFLD3pBnxt@`{8qd+njaSvcn%6eqHHd6w;TjK3l4&LM zy?y{BpNDih6a1Ab+G2TSU~t+;y9cZ%`m>j}P{|H(4~5jmGzIWdA2hqL9p*Gdbj624 zW+`<{s6fVq-eqTfmg`7IZ=Z*3KC1gAyak1B=^F>neT6lC*~+tk*3}&=9p2Ge!1i9L z<BE7gSBJ1z&SY3HoXLBHC<%=y;38uF!C$V|@bl*G%ZP;b^UnAs^2)jTe+DcJ76ZUG z<!lTNzXgZrjSFDW8f0ody0A5qN{W%u;CiL`>CZ>Y;+B^&jemOA?dRgP9PC8xl!mM{ zVE76m1=-&E`?FH>(vMMIc2T9~M3)N}Oh5OlvQG27*|Jw{7l%pAr*jXF8xO>1v-i&# z4242+kAyQmykahPP;oYO8d6LMsB3B75v~KptahA71hxR~WQF0VL8_sX^gm#&rD|J_ z7@o2DrkbuRti7^2q;6quc$`c1O(u)E*|~<;tsj{)i@M^F6P{3gM+alz?%lNL;k6&g z)Gd$?^6TS4eMu+C!NQTE3(O!vd!#+jFL7pXNTyNrLf@5fsM*}M;;NqW(iDn=ukck+ zE#!iBk9~k7q}oq6avzH>=iEx6&B0AW+mdbc?y-&qm3n)j?8@QL<?X0hCASJOx4)av zKVNQrX5@3a4E1h?r^{-@7eA$gE>PT<Cz)PS%;>t?GFT7w8U6c9n!DKDO+E557@~yH z6)&j*9kF@6;zWm!l@+S`5wlwbhQuW0L^$D+N7n|lYB|^oRJY4OC{6$Jt@vDuc1^w= z%KchBl~rvjw9Gl47Md86<>k*!E<bYhi<h0A;_>P{)Bd6?WWqt>c_iW4@Musl#Svm^ zs{&yuemp1P;mNvzpBuDrmNuH}7zLgwlD`0$VQ4F@%=Fn}rwT5cDc47X!gPcs)W3D% zl3+l&ei}lt`)Z;ipdfOB5ZF#2*&CZk-^_K|sEpo>uRlTaQCT|yITN%>5qJEiTLi0z z`n~0uK%sqGlz%8F4Y?0Z4Epi+P11B4n`@S=i|?}#Q}?_Od$Im^{i>X~w`~N~FSe>Z z$n3rrnOx@dUWZ9<+s6e-oW))(l!kL%;&B1n?0Lc}{r*B6Tif=(QkUkkd@9t8W5gEA zZ12<;SB*NC1@sB#9RNGOEgPqOdT||NC*?~|h?1^nxf!#Pjj*SiL~ial#HOdVfv9rX zk@rn!;}%qzvn}x7p^WAJL|cOK?v!Lv#i(7iOp#M~kW4mxL90lmc0(5_ufh?*rxf4| z*D<>|%r16K5Vy!3pCiOV5bd2-W%=|0)xJvsW?<0^1*hGJSd6e!4X0TL)|J~NuJ&gG z^&{>_?F;v^fANh1J}xR+y%_Z6pN-#m3I4{_p8U*y%z~oHiK0gFcZTV(c}dN3AhLT- zE2<t6@jJHh@zK<bh1xQ>K-!>dwDmKP+w&2#(s%XmQK}$>^4tmwkj*M$$0Uti?<|$Z zwnDyHvJ+M9&&EbyxZYbFS@8YfO?o~yrlmX~`%cbktimuyS~k14g+!TTc#a%oJpvCk zXFx~0%^50(1@HBmj1sLG{S;)n5Gcz+9UZIheRsNae7CY~frXh^CPzE;=^+GwqlwHJ zw|l<~8v|Rmeh5Wjl?sxBBqGa1;{E$4{d<6!Xxl%}*>R+55Iz7`@6@Imkg|9vF(10B zNmjx2=UBpu+&K54PYB{KR|y&5TcB~6z?+Uu*s+?(sUk^_9)n}Mh>3`Fp3>>H*KV@4 zaM^92>2Z>9kjiA|wZFv5$<YTIUrU}(Y#$a?>WEx)_%GHS;sg^&x|mkCkFO6DTba!% z`m*Zs#xZxbUGgy648j95PVB#VIw+|Au5&KGHf(r|H=aO~dbO#f_|H$T-(AM-6|p0o zAxD6R7rq3Ll%{zhF84GM=0uu$9<FZE^BTht<<$hTl|A3(wsM)^b@(ChRUtA6P5Q@< zDsrzX3vH@GoTM}k@)avccTn5b`({>G-+?d$=5pUkv16akGkA@DN2>97rJF53m<jK0 z`$APgV62E5?6<Qw<djn}S2{gs^g}=kKQsc3d`DnyV{W>8NU(V-CYBS>WZY?&p#Mt; zdB6B;o&x&zFQM&TdRi~w%A$c;TGHihH<8ws61ekoTC6HlW23g~*SAcV>XbsCl9o8% zm5Bty{`)YrHBUN?zmc^ivRnf1zO$A7B<XjDWXCm}UC6v5PuDlnA}gKl)@-a=A3>j| z>$<%Me|)J#@%$hp=^=LwZXD}}Mi*Aey%O6MjJ?k*#M!)8xhl#6RJSKXX#gi2Bw<-b z%U#eBGk0po`sXSu%pkev4EzV!Sx`&j`6HhM6EO(fTDFcdh>kSy0D7s;iQ29#0I@I( z4zhR1)!&;?nRB(_wxED>o{+3qQM^%*6_2>=?Z(qk(3xA_m}4g<t~KWph6ZyoP0_fC z``qaEZJ*<Sz9#`%b4wk|@w0*Zcp5gvXB*fX-oi$)@9VXeT5Q$YUJCF#LPt$Wy4xRw zo4K{S>{TskzBg|Vm}SPM<je|!kQ!l`1xVGz>Bv-|4F0Onft%Srxohn!W-^eF?lP~& z*yp=2-|QfKC6r_^y?FQCRr>yXR-17clqMiMSBor{-U|p+1zGTzt=aTpyeu&!!=w|J z4#Mx^hPlOj`)o`lsV%loumu;C1}!s1)*jm#E+3#{s_i&t>+UtavK=ocnnH^`I46kH zz8+>BdUHt4#7DbZSM-unL(*49&fyJ3^NvAgN6EVqN^b6m&f6GM=G^gj_$@l@i%tAX zg!6ZUcTnI^I}`c3J`-b}Aw|-M(G@0Hqw!Hz#O^9)eoZ63X54FH-@Q$LqJ;r7nuJ2% z-Et+XgI-kfQE1*BzpfLeYSsSZVbKcBh=14gsoG4^@=VwVSSw@3U$j|g!00LK<Eh}O zq%~tnEIgTksaWyTSqykH;jlQBO9r3_X|=fOj{<uz^eJOy(;C{0vd^WR-i2zv9?g6> z_GqVRpUbK36us+~C{N9ehj-qEfPFOi-ai(VlSj<;9_xl04}Kz$7l1b8kIPXNuCN%8 z#1t)?Qi9j`ah;KaKR(`6TKzav(H`r8*K?h1;A3}RC%+TpyHun)i(B(DWlLwZIK|7) zF#uZqj^*AohV<IQir?HcU5f|k?O(NSc(+%Jr6F%OG#Eit-}vne$##6k8>CV;UO@A* zJ5}LS$5m{ah-i==D^6K-(YYnJOrmxz>sFRx)B`PnOU9)AtEKtFO3)}!QC~Yt<z?M} z4_>2bAU_BO4ca$1HF(@vlo?hKG5>6n7Xb3zGT7wevK5Bwq`Al#y%u8T<2NJ~NX((- ziB#gD&%M4jeo%%?OteCEh~Iq+)LwB$JvCHzWk)+(SI}tbK#;oMA&iQs&h<xDE*rn+ zu^FtYT()vO_8=c_^DkE5wz&cCH?x%z^`=YX*E-eZo}NRGnAbFJEW3`=ZwVq(y#Vg# zv$&M;1JTBRCUnGjD1|8UcT;&*ctlX{#Hy#;Vm8;;>F-2`3s5lSXjwgI6Q!};q{u9} zF{6;Zie^g;q^=wh&+koYG<pu~gAt6BzuSdIl+ibd9*I(Hhpb3?a^~QJi#QSvRn7J> z)g;Cn=ek{tAzr<xxJSXtr&`Vw1E8KYgTB#v`l`~JsXwmBTn(iPX886pZ<TfVvl0ut z3S{NOPd4s}d3MxtCO>e)7r3|~wsmn_3Z^M!luBglNBlo;DzCnp#~}{On+P-d(l!4_ zAmGM+*vzp9D-)^<GoNc<&D>nO324Lru!U#LdHkBK>hj+r?H;H9-<UkZ17I)Fg<m8! zwU4mJ9Jml$8>h6%haO$~dsVl!65i5TjP^X}Uro+x9@MBN7+x=$;0bHH7cC2+sKYOw zK)zrUk#z^8Ax`I~!;z*;sOTQ*h({||#0{QW^lg5egma>ALVX!&naAv!S>$DpN5Y^& zSJWy_AgL$y=#F3;HO+_?P-114bFizfsCZD|DDuPm+v))rR$2CvBqLYboD<i_v`io+ zc8633N%{4Lmct$~7c<$+{!IkrGH?&wcwvUS>uw|OMzy0b#8jwW6nC+0)o;!CNs$D^ zke@<QFkWipeXE6MeY6vJ$2acHOJj=`p17p)90MfI9||MYU+fwK8Ueo&xUNa3doXU4 zVD(7ev4@3Z_y4AfOg+BOe5ovbS@KcP#2jPglprp6Ll=YgBjsSA1dVWHVMzc>e7lh2 zV9Z)zZCBlbp%`*drdytp4-2uO@AjxPsJdl>!#(|YpyS-YNPJ;<4_a;F0);Q78%3_u z`d&_ijgtaANs&-s)s3%at^HxuPWlDXt67%a(xbgwm7Gcl-|?!U@tPkmzP<hXF&tNd zKZYH|GGNHVuFCqF25~?Z$E6<)gDDoqT0kT?m{G?F;_v>D22MI+lk!)8d%6j&q;Uuw zNoDX5PCp@6X5Viy-r5)-pjTJH^9y4v-;*W5%Imo;*M9*VZ-jyy;%pgXjt%2%US8gM zZw|C@y(cf(kFs-8iTGJTJ85z@7-};%*b42e!ie46*xj_&L|SqcFRm{MxU(2M$j%Qg zNO}>ZYg|nP#m3(5ex~LA-urpb8>w%7*p>n`sDab1Ant$RNTF?1ukvQ!YX!#6$0E>u zkV`d26@UT|91+GTlz-@!QFY+ypbw5=j+B&xJdwF9-%mVZ;f|ES(Yw<aPVKy!L?tBD zFy~`JmIC<eDVi!mPLHzu8hOh;Z!PZ_J8?+tXHSh;6J6bGd0ja<I1MyGJ*q?~8yNBB zfqcGHz_#U@F}>mY%(+VNWo~E60g1#lyexzHdm2#o{@Z<DGG&Dzbk*0c+Bz&-e(Bqx zr)bkv+y%<Ruttr8lXx2IC;M_o5Qju!)%WrF)xhUvhphCEfr3sQC!MKf8TqF&Jhlhq z@gzdq&A8>{sU0RrGts+5bSCd#3boBg9#^s13Z3i>Q=c_;MM=TGMi|DH(tVOCN_@Ml zL#F@~s9x4-c|?9K@|H^cV1X_wFY+bAy8kR^-z$(W8s#$^l8;|e^ZYeUyT|3|ZG#;< zcIRH1tw@%UGcJKdbhzWavjQ_*jeeiz3R`aQq-OI0^YFHr!fQ5HI65Vlmic@r1adQ) z`a9LG{hCeLw)>iG+QgQDY%<){u}3)~Th$ZTs?!{_m@}+RR77FqDk<kBDWRM>|1ptn z9=XU|XjsQ*lYi@)+|BFmdr$D^LlG&b)xlrzR@9S5UGkPFfm{eIRg#u4zlAT|Q(f9N zD+(X9d-*+X&l=Nyr~7d-mwaqL`&9uB@ju)tBK7P8<eP|azF1BZP*%ig4-ENSgd`CN z;Dy#+{BE_as+t&An(e49NTGCoWVxi-R->)k-vBv<-c6mD;k1VIQR<q0+b}L1+A3pv zsA$T{&dMyGD5`G=DDmd&WiMO3oo2voR3F({dyW@yDxZpXWgaPmojmXz*XWV?9vRwC zNX^cq&QGZCx1a*GB3AGEq2UG2oO8enl)jyi-xjP%98jx|x>v5u1mXabmQjwas>Y65 z$`?lt0!a_1B<zvEQnGUXcfv(;iZjfpumt1NspDei)5#>_vp;u(L_G3Huc?|$^!h-i zzX;cnH<9I$OlCuSwQV!%r-zEsR>*i>v;_EctFaUIjr0qRfKEO=f9}l)36TW+YE%2L z^l}Yz%ZZERsXU30-MssON4qfxmHdR`{B&U@nJxRUXMaI*_m#iyhetE&Q1H399_D0L zT45?<YvZu$&>wF7kD;T`f$40`Bh$$Tp_}t}EAgQ*!N?`alKhYJvI(EQg=dWXW8Y~6 z9uou_6Hk3J6xo?u4XQupB+CQqQ-Jq{%4zx|IjEJitBPGb8!WGj0%^d7%L@@JH5EE| zwmyba7kFM>g`;amqJWc^=S_M7@yO_Ou7eV~*63p;@$Up}sR*I_Z|KI*?_dx6Y){Wc z-vpV&A<4rLU1?6#7I>*>Z>SWnD!S7Wdm`Rq_+4a9)8-Ar3_Jbr;DEnhN#^7`ndAgH z^1$Dso2zmm$1YYYXYU2$r~);q=8ogL@1a=yw$y~ZGm7lztfh_nWW}zP-ba3RYV7^7 zd-9Psj(!588Bh!AbV(A-cZ7VJ;@*MgQ%xcI-=X32CDbeKUz2dE(Kn0zOWjKX_Xrik z%nAu}9@CF=IgB?P5&v%?9ly(NqZMb!R&!28wD-l~BseASk2P83;F7!P*{oG=&d7U1 zt&a~Z3gUMSHzI$LvEj+I?=WgJkz5_E3s4Fa2Au9da{=oSJ;K6$p{ijVsCS8=;9%0c zl><ubmG=_c#F-})8xv}$4hgsMc?)7&+c$A8Q`Eq);#f%<CE$k!F6x^EUiE#sRh=~r z+T)4|^gNg_SF<45pHO#X*loRuHmEcXc-;K75{;I3W3+~2K}mM4FIs;YpZT=Tz0&G3 z0&A_M>~6fX^2|b`?Ksaf4foy2f}gHUaig=yE>LyXuJzEJ>m4KaiKs~*@fojGoekxc zIXs^pt=CD00T4r6hr=wP=9X<SzH$3DmUw(J6FNWU-PVk_!Q}mD>hpvN-ewtMHbx@` z$n@!FCCrb7U~4Y7`fZU9q)1_o(WKWO)lpVsQCJcjg{2xg)73fBvApB)9rHt?B)##y zP*fdw-?H8>Nk;8A|EkPS{ZuY?qrkEjKhG`Eac+nq4SdgdTCC|-E|l4Fd_Ro+yek=@ z>vBJoTf3}OJU6R0P!qPC=lys&DHc9H`FP%4$2xET99%vp2WJo}h@XybVJ8@8F-eJr z{`%5)qjy%<m1QFD{5m$<9uJCDcq8Qg_T<yS8+xk9Nq#bC!DxTX*r)*9Q0K6`Sk@cI z?E`#&VPI@5`!vD{|BnU<WZ!GG-Q{s}V&AoePsm`nSR*xfZ*uZIOMIOU4VfLTG_|nh zeQmfxw|zXOr90JlphNZ`@7hIiM4n3gSO0~`bdye9JlXZVVtZj*d20Op+wY)P*?*N7 zh&{1)-sJwmahz*SW6z?<2>V^K17`rk_!5sregQnn0&L@px(pIY95sP$Wj60Alm}XV z^YrY#{fYZ~=9pKUembEzBh?DY>uciZVBy|hyB86UIx^V$FN%$#G>h7Odhzd~?&i*E z8b*V$7&F+4$_Yo{W0yq!wO)M}=2>tWi5|(SLy!1}!!Rcm_5(627z{Og9Xe{f?#%my zmIy$ydHN!zc&zc{+<;WdaCCTr;xFm()k~)E6-Z(Xn+EoYhS0`!Dizz$gtr6{Ujv;` zcheVm5<j+!q-q?qh=`!?!0RB?F=&i^lv%Dl@HP2|glU)STJ}7h`mKVQIn|=hz$y>w zx~CCxJ_`1Q4Orssz~{85!*heYGCocUHejN7b5_JDdeBm*_E(^P->;cgo6Mx!xR&lG z?kYFm^Q=79wzAgrlX5U)G2h|?_VadFPCNMRx`o8=$ZBlR<L8lbua7E^S$qU9?qKNJ z7`<{>x1=U@PA$^WVCN-tDN%+qgSS|(itr%BW6Ya|s*<{@&f;`P{jb4k&z#|8NC3ZM z7KjH2;|B%xP^T0}%;6udmz&8h|5k35bIO7e={%J|$Qzsy-5WY0O~9>?2b~LtnFxGd z{N^TebYFmOa>ef;$4-aqpM9>eWK-Mpmn<7W+gn41?J#PC^rv4O-^2?floC3pVO>{C zA$b)|{il7u7zg_YbPsna6Js0EZvmg#^m$t+GPU^S-EUv-r`DQNByUG<4rBFx8;wX3 zwh$7Qw#=j^)AKEA3V$PA^8)wPf3G|8(eNbWX#|*UCQ)js_<v>K46fZLrfVM=+4-T$ zjzQi@na75m+1<adyZ-IRw^(F_VwU&hOchGvrn_;QjU7(@)5jD~Sr2n8`>&|UK8S`a z^7Y;33crb_st{@qYAL?or43s6`_fl^s8OHAurFgw`IQ)@o+N3-a61vr5k${}7UT{B zr?An}1J_7<U}NwSvM-7+DmfY@S|_?51_MS1W)KzwRtdHM_9M<RuKx>aJX*X=d_@9A zf^|X?LX!W@K;&ruo?0`;6TbvuBkv+oL4UZ*X8+&(y!q^c;(|<!;20qAe<}#%y@VUX z4DLlD8U$8n?4vuG`~Zkmt;aa(lhBl94je1Fh*dkyp~nAy>jQSr9Qus)mqw0Z1yBte z0p^!A!ZcRmf0R3cR(fjbr4E7?D|X3Cw=4V~bei8bMinyNkJobgxCDA-63#I4E>0ye zk&CEqVgl69q}~4&HaD>_F(G+09>)JsfBIYq;OSxoF?^E(Xh0>O(Ek0e!EC8VI4CGJ zD5xyP1`ioo7B3X)-(xa7JOD$XAR}AF=IQXk-a;?>Ucw{H!@|R1qJ87ki~oaT^jA$! z&o9~`oMcOVTnG^v8Pc;b9-_hYznLZ`U^6Hk2~u*b$(OKRkh~j+UjAbceY9!s^Rr1B zV<i6N^XYT{^8w7Z00cTX$F6IzU}QrB%uGzyEm+J<pe7a@DD|XByrJX6`6zJd1tlDR z9636BI`RQ$%u%Q*kC|pry&icHS%1F0AjHL}gkccOl9kXKdP|Tm&^DaR78%U*5NAg$ z(y!?3<rP8B?344i`eHvRrv1|G`>k9yM!J%cL)O9GuD*h2#bFZF?5ulVkhd*hqrk;Z z!Yh_0uD-`Q$o3;}B+k3K;xTR6^@i}a6`od2HH*!*m}X}2hjY>Vha0zHGH!@ay0XWm zCJmdYc6j~widTbaE_nwm1v+@w%uL-o)Hh#l@Yr+Nwn=<9m~6_2d~UeUSD$yH(03Y@ z4?P$c)pd-o6h2vOR7!{~jLk;_$h=H|z<Kdmpa5m(Nh(9#J9wkE{fE3SibtdGM`@e1 zbTrO|S4oW3Xfmx0mWH>bW1>tnlQv{n49Fw4z7riORCaAN!*loA7i)%Fx)~1ByX-oO zX{?0r3mlWHEG1+Y75i_lSZPIwxV`Zw6`AM0Ruq?|P*9MR?>gJs6wvIO_Nzn*ExXPA z1N6?(#2%V{BJR?@7ZoW~3IwX{Z1MI&e$nEN5&^bP>k-D-rmC%NboFq%KDju%I=wt6 pjbaMce5J#pWgDkmYRus^qj3Hj7l#TL^l1U(1o3i^o}WQ@{{z3$XqEr~ delta 9960 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Caligraphic-Regular.woff2 index ee5193d7c888fe2e82fb54342f2bb5d4c34b83a5..f1e38bba2a7612a9842254bc305626bcc8c12b97 100644 GIT binary patch literal 8248 zcmV-8AjjW#Pew8T0RR9103bL34gdfE06I_r03YN40RR9100000000000000000000 z00006U;so2DhZbt5eN#*K*A0IHUcCAd<#GT1Rw>82nT2kfeIVyGerkt*f;<LsK+S& zza(g5gkal=)h7@}Q$&-Q#M`$rGaYm?-om!U8-d6m{0iaiI1ctH>fgSF2b54C3jW~j zFDx8m8Olp>jpBN?V#kkTKuO+9k9L9O_*MKFb-!YSB(no_^ZyX8y1=WY+rn6@Z4FFI zoYVk35qsLx$DZ|xeTe&co!Wa}Xvr)C)s{(8EK?jA!aoQ!tlbWHSz2BXXuNH^u{?Z# z-_BdKiP8WQ$XEOzO_<0o8ZE1R!xrGQ`@cC=+W7ysn{3$yRM06f%hm{v0B~)t1BP?} z=vZtU+wiY$^qN7}G9eo*1|v9g=9VB%?Zf}0?VA<lE}G_shu92aD}&`5DhZnTR@4-A zy6R+bGi@n7aS%1~gSP2*t`CC!;WDYa*#E2co0*%Q#LC2wW&aSp9DSk*QAexoX$mTe zp0?s%-E02VXRS_Lnuxb{TDl<)BkI<>^<;et){XVQLjba`F!%3urR{rv*S<AU2ee6L z>_crKy@k<#+Vx4=yPGd5pj)#{Iz;0-$Q?sv#*IT{nm!C&iYiT;rb$tz>r*tDo*w4N z2vT!GAibAw`}>wHYf`ZhhJXi8r@g<vI}HHJ6KNd|K>K_d0IQy!8GLCz2zXj>9>5PQ z-+s4oVFL5QM!*QSkHI5TMd4ek0@iNA0001V1^|v+XhQPNChkTNlqIs8gm-0yeP80U zFm28F#;uqG^dcKG6n4uu;_J)@eEO2gAIJ+>h?68e{RhtTr|_4bBGw+peO{|9+(Eqm zFN!F83!6Ldffb<7#si@A<<NjY&FcmNEyb^|VAH3;P>GYp<jv>k&AYOE%=B6G(0eBu zyH$<*q&l~@Ut$z8Lz+pHxy%p0MzmIW-9LaNv&<?7OP@szYF18L;J{cS2295lp790- znh4hWrQrA~!dZZ~;Ji;@ZeU^Fyq1+)22H0;p!d2-TWet!UR6}tPwmZS)N(Tmn_kEK z%Jpwjv}AGVW$f6wme#LBXATIwGyn+@@P?2A6Tr)R$a0PHtygf1-V-2G+sRz~V`W!z ziqM>97V>y|AQ6Mmm%d53=tB;+zA?y2vRn*P_XX=&lael4;^jaT)3vC3P?Qvm+j3(? z*F^@g$+RM@a}RcM>tqMHSFfUX=F>&r;6Np{ihXNsgA=_ap~EL2`ZctWa17xrIvO^( zAl!jzrGKpKm2_#I%&f9)IP1W6=El=^v9j;ublN%c!+sbZdGYJ`^zFrVzK<!%UQ}@L zz2Q2y153aa$*quhsP-#5T7jD;7@xR?(1I=a<+YT%3vcf1K+bUi(NC#+G-2lqN7S`` zBDOwpJYogdu`x)XYe3c8!4+&&km_B;WkD0<^Xy0l=Ae8=%5V2%6P(f;%J#pvW%3a2 zRBG^{f^w<BkBTP<2m(RDKuE9<792zb4^bgNOo;GG*rH8P3qE5k2fr~B{$A2?Y%qkS zn7}xyw1uP~kP-}}1q&I$L00gf2?2B=f+1{1K0*f>3iUGXtdSu+iV9T`=ZmgY5fp;L zf~J%p&DNccqV;>$&DNh!IiJSLa+LOro0Jxn(~U{In%pdD#%CR~7FD2IR?8Oit*}z% zfnmbBCyNmH1uwsz@jctC74=_iu%J#es}<14zo3RH+GAZqZGi>qx~p{^l}O->TJnH& zc`tulUe9a~d&Rlyj;CT_s3~sjUTkOp2*CQ7nz?gqytFDsle*HVx<qT0T1iD%3%s7# zZu-{rJpLrd+p0T<X*-ev5v~-ek`{T6HqEfCD9&V*?)keQ%u9n|zZ?`{&mP14)UTlG zO?)Ue*|gtthR7+zFDYHOnzd(R(sa%Va5?W!{m%7ZlV7HrlJK0Sx?UQMv_P8+0bw<l zkWkj`6=UtQAzF|$C6$yi?wCxuk-_yqFdtiW<{f10E`kfZ&AU|ccnwa+Yn^4BNe^2# zbLTT*p1pJamhRWlY(&E@m|E=A^i7nbsjWrzT`E>|U+UEssK~lGAHN4Q0y^3YTBE2k z<;<;>#;y)5TZ)d#zB0p<&BVaeiSv7)K|iWE+|VH-{}8hhBqxYu9@*KR^GUDv$x<E& zNfre$SncgV-t=)ChjRWJbp~igV@FL`iz_m`d;}Hn$)*amqo96)vHd|{Vrn%l>4KIs zj;yp9d#E#k0booxDG;Uxqu{hqp5eram?Z{tgHdo^C@(O4C>Dvq(qI%^7RoCOM`D#2 ztPMuNb)me$a4I&5!Pa0D+!o3^41?Gu277~1a9`-M1JD+1KK#n2tBW0BYyq@7K!BkU z+A4EIpgo=g9q}BqbBjjks?2?Y?szWr#B-rHo(p{ydC(uvgMoM+494@C4JDnY5TKt> z`!Od@AWajDayq)Q>_!8CFap!dV7XlW=f=nbP!HIAD4-8O7!u9A&mNInQT$5<LM>zt zX6u!~qVkRsyDEFCtJLPJYAVkw$*OF3cD?UvCeHA1I+VaeB)c+z-g`$$JAaQhvJ zwP-ibH^+|~CKOE~5oTPQhy*Yr&gsdinx(+A-dG;+-}=HUSzhuj7OE&x?<XlZwq}xx zlhM*abD$f=nsf;-yGlLd)Fg#WQKIZo8i7dIqCj(tlOm#Rw&sR2gX9{bSv|TWLt{Hl zbe8vJ0yrM?+HWLd9%*DzhZ?D$(d<X7+Ks3!0BkNYC_V+!m~(b^W%-(5Kr_x9%&k$l z0a)v$CpwL!YR?xTg`-roQdg1Eefp$CDSanTfoGBEf-I^5z?z@MhZv{Uf>-1O(XPCR zpGF%;(#L^SvYL>rA_GRk>Hwm7niK$KndrLdE+U$_$}!<(-2e);25gzG1C$g#&n*pV zx`(#5pOcsy<F@{xM6B8C1<awppq<M^b=WXg`3s;Kgud1Jl?+&Juo|qPiu(Ok28j;_ zIXrvvAUsxRH5@YMVn?Qvhf|>FkIkLdsMc*%NoP?FQb?gZd-Dl}LeXk+FUI(kZHV@x z&N_bRm1Q=$!Qh@RAEV=12iYV$qETgvo(s<-uIciw`Pd<%k!or@t4a9~eLkQ$K}%Y( zcm$PILo8VC(UX~9B?XL+1YQFxjr1&oD(Vs`>Q)K2lukvS)lgEG`JKt56rCDr%t}U; zR7gt{;G;{hCfM?FrQup~cNN)KWz^0%CAc#<Ryrg-dX3?i2@0mg_Lj0_-5P3L@;ej2 zptysAlSR^nsdQP+A-5_NJrRKyc7wf^aM+P|I-*sIpL3V<+-47&&GDOxc|P0<Ji<$G z1dxsSjqX@`wNKX>q~Dpfn;;GwLTLGhw-OXs(-{@a;;$+4udRmgIBZT!B+<vhtMmb? zO4-hEY#B@p&K<%N-bQs>$W|=k)>*t5EvLiMQKT|MTJ$mIQh>V`s;;cxGuzq1DbV65 zi>W3Fa;g+CDk@@pjb&@jzfoc$h1U@jToOIsx>Rud4gZK^k&H%k_-q~6Jd?^Yhwa?$ z&K^e6jw~AFb~TX^jk(n%UpuD<KCHJPtkourORLc`VPR4Z%a3Fffj3P$PuQ{=9j*CA z;V$3D($GHNPU*7KD>d@#cY<hZ>|_xY6j>Rqn3IWi_mKv66@_43aVa_{%l{fg1#4wO zR9gMJq~z1&<0R%|4ZHG+)+rY~noTUnq~{UQ6@x3APat4%hLm3Jp8Ic+J$sVIj2L*c zCT*dLuirF})R1!044n@cCZ$xlI5c!;&w}u<n~ToP%*@8r?208+yG8dzN5y^7=%Ms% zHteSDh0(^FsFLZrX{e|%8fAH`AC0TgsYSHfI{JT1m3ENwrdPz9VWjrv^9WTWOUo&R z`U577ZVr{Ib%f(J{}z?p;MJkcTR5efonyb~7&iLyx_wjKQ5PK(Uej+`><PFMVF-mv zte;Xx4!t6Nkkg#?I!hL{QYkNNU!=Nd`G-g(lG|SVEN^+)*UM0+Y<ov=lm|HEZ`CSI z2PK2L=N0+<UQoN_1@(RB)ro$K)F4_7=5`z}EN2~jeb~rpF5@6?co`hlzgt2@y`$iA zl&k=7WVvw5;5BhmF3rw|Fmps#*yyV;Qh3OL$HS4TYO;qsYON`F1J%8Ne)#USHL_3c zS#CFz7a8Hk&)dLoA$N{|6@@!ZnH=Wrv<36MV6){FdwpQ`d%k1+!mO2O<KP$I>bXjd zWgvwb*%j9uC#}>VnU;ci!EdD7G%{MQ<tr3o+1)^0(KrmMb`MDP243>w3ukgMVKG&k zX-XFE9Hu2}I8?K=DCh~tM*!J`b9!typQe36EuuOp#G8N(=fvhw(4pX0_7@qbyGYu( zYxtzHw4r@Y;Wew<LWgjN7j+vR#1v{Gbzht)m{=hjq^xq(3D|H^_s~_9Ug+v<q1ueO zc;f($uP=p^s5ZO$nqr4lwe7mp>)hJwh(%Pfp@il!AngC;MN-}x8?VdChs)3W&H6tt zC<w_p!l&r{?)DvTcTIr^nN22ObCWR^bM*mq7s30O&|!gGg2Qqqived`TXL$9&x`)T zF#qiu4hSz?0KBu0DraRVisFBRhlzLc4w)7gEwwM+%LUJGyzx|5OsBCwee3F+K9A)1 z+X-Ywm*WCv(4=_CP;!-O(;MBYvJalVAwvn9HRV`C^7W_}NiqTqi%w2)P|hbs5nW^f zydGkqBt{DcFRy8y#qJf=3%v1cs%TO7>;A+$w<DHNmV6&(KiF4?#z;Ku_c7f<jQsv~ zqfawdfU<nt2QM0loZVC7Od2&?Z{8Mgm_K!AEXih>)LW}+3zt}|qyU8_a6|b7d7IjP z|AnQ$kmU^S;hAq48Q21G@@==;Frw{fstoq{T`8Vh-&vIJa8M{7=3CFSw3DPS2_jvb z{QA7Hm}T-6D_WK{9~XRD3V8JmB-(!|OAijz{2+wlVPL;FVjh55;F<fig+uKb?&t<O z#AMXOJoMgrSv3OHYBzf&o9%q<2W`GsYsx>i<z5E~#)+kIoec5dsXy5)8o6x_Lldr$ zTkc78C&xY(qSWu+KNq;{mnlkK7HU0Nc|n7Buaw84A-|<qc89%%5nHCpo!HQ4nS(a< z;Vc@#{eLi40Y)VnZP9N4y<6j>UJ$XE)b)fGpdJS2a=g;2i!5m7%*Alrx_wkGntefK zJF}<DlB5ps{nIsM%J@`>W^r*vpHc`0lQJB7LHlCV_6o>0&DZ7y?2UG{U~{xT^MG+s z$e>Y0HSyatZfjq!WJ|0Iy8Jgmdh%Tga_E#D!N7DpEGC&P_S7KC=GZSSY1iD83>`f^ zEPbR)s2eV`!-zP&!up?*Nu@n~`Fa#YV(skDcY`6%Hn_yBe20rN4_({juhPHVMQ0;M zMz1&wj*PbOoaW0jPrrzBY4FmF4GFu{E2#|#j|MAMh%z)jZZ$C|2itm6t-RpeL@K36 zxjqK&2D)3KDipQpCC}dCuuxEaGN`Cl&1r@}t@3&r7otvP#l6&9pjZ)5XftoGo7pw` z-@A{k?SLK#V(uO9nK>vic7Gr{F|F<}@b0*QOnZFncdiTMjwFsmFX5NvNGr+|MtWTU zzEHk##5evhl}jUMVy@=cqt!5!>H}0iY$g#@l}=S;s^H_sPRXF8{|jmHu2E;|$0wG- zL{6Viz<tlJ-y|uP&mI`bf9>Fi?N|)o;M1r+!BYm_`dCkgM3^AgW64v!_LaDl|7zTk z@SFc{vpRvMN`a!xO*H%7l=A$21@X2+jiqFLcO&)cdWgl4m(rS}S`zjqFO+)0UN4V{ z5_Y64NZ78JjYiNwdgiGgoA7VfU4yi32$TLl%Hxv<TBkd2p-O>G-cWnMbO=p2ur}~J zm%~IdW9N7Rbi6?89`)aMz+_1A`@zeLT+#{o4TdD@{rSI>xE#cmA$jksxNeb6(#x_? zYTC=zWmI65*hh@VL&N*+A|@3|oc<}k{4pjQP?ia5Zcc5RwmD21#II~lRhIAqn$wA; zxbb93aWeu<5b{#0*{HbX5%AfB8L-~GLBlw{XPrr;#r9w>l{8Qr#X#w%hZW{KMrzde zk7K1`GL=Z)iC-2L7MCwSa>E;f%S#$kNXT$!oJHiBj_tjBPq8&~Q`(9-HUvkaI%_a; z()+_?Vxh8WVo+_pWt<S6t=+y-No1L`ebJMtXJ7ivL4>?s#f$|%NM6NLJtfzf<QS{& zl=XsPV``a$>ywQs7ikV^7q+ApBhZhqV~mk_Wf>==Kb7ea#Li8B+3*q_1OkD&I|S6B zvl^$SF1AB6q8b|nIX?V&))D>MZ?_8ZJ|RbPX_!nXwidtC=*1&}&xIcpWXv8hms~F^ zA8T}D&gjlF7kc9?!osXO-xkiUz!6%DHejE#BD~KE)j=$jpqh6*nA~-k)`H-xij6#5 zX8Fm6Spp}|Vl8)cdiXPe@wjv0__rY4YS?mr_BelK2V0**cAp(cwokoJ1`U%Rw#=v# zkfn$@%{Xh(tGn}jkifu&s3-d7g^7cfNoBN7cW=2gO7van?{WQS*8PnUM+n60-JEC! z$&d)La5DU+W*^uaX_!%2<?&dpSk)|r|8Y@)=GXR@cy#2_mHFzlr0JYAbEu>z-M+Uz zKz~hcG1nT`;}o=G_PMegW1>ZHC&rG|;%3a)<Q;unq^A?(f9&vV{~1#s{i;b>DJOF2 z9F+EL>I)l;B|uJFLtJU;#klZN-@YrP(TX5f8Y(JnVK^RT(Y18<oRJXDRU&8N>PY=E z&iB(-f4PcHaZvh)R!5cKu#~1N`xwRjGVcnY+|7tO7OW%SxD|QRSg7TvY{fvSO!{l> zA0@6{FOR&92Ol3%h?I!Y=YK5j`0`pod6J%9XdZtYrs$gra+$&p-!0_CR0thLdV={_ zn<HAYCZDdE<Q`ks?wCKEA9N}6E{(?sXcX&bJIo2S7!sRiYMQSO-j{O(^0riabcC>r z&*flC&v|DUZA2J{q3h<)#(#=pQy9Pe+<mdJ8K{Ta+av>5(q1=-s+2C3=^&j+BhFR? zxppk;tIUrw*sItLUAI2X;1boHPYt&bCQEtvn?6(X{%_U_Eo@Y1j@g@QNK-@=ei7r( zUH;X&m_&sV<J*(ZeUU$_{FWq`w)ZVPhgLA>_mr{RU-%)|%1j^F^gfft@Kvb{9Klk7 zU3&~vl=QA|w^|dH|HSb0Wp!(#k8@1<Yc;LkujaAFnS$I~(_G;w>nCx}(X!D0eoC_t z1rOuxHEYimWTUc&KXHWo;Fo&zRf8psmcw7L?v%T<p|r|h&LYr-B<Tvqsk}#7CEqS5 zFj)cND2FLE)!V-i`THB0ZETQLw&HYI=en{T#%=^wVFdqU9;&kOUDheaPhk4xbWi{O zsG3}s^iwgK;`uU2VqMHA;>d*uuYp|~=6qF6fb8VYGT&f3VU=OK`eU?W9s^?rN6{MA zXiX+sEe-FDW7b%j1btkT0KE{=XUmcUTRV{16ds8PK3ZQj$))29nJDX+RJ2bli~Wr@ zl)Wsxh6s`?D5Iu(vBZ(@^|WE+5X^J&KmUR2B)TXh#G3(<XNS5RgIu~&0uRBewtatN zq6x8j+4iibtBN0j<ORdKCt3TUWg#brPD@o<i}cpwK_MNqQ=nNZc4^n{XNgN2qZuN; z>SB<LFFa?H%@ud7`?|fu?OoeEq(cOJvCbHWjSE!_i-Wi?a4cZ@o3PMm$zgw8Q8=(@ z-Le;sr!uJMmP4ynEE>^G9Y(PHfw3PO+vj{JnrEhXs1lWWPvgzk_H$`u!b;g(+iT_- zs=~AVQeV)|hyN51Z}YF7?;ZYvoBzi*?1nbzZ}^svf8g=&mz$kFwd2q>*HeD^-`T0} z&r$Iut1I|_*SqTdD)st-?dT}Qe;S+a01v>OUv^*8e;?Bcy<m>L(a$ea$ME+R)AUr9 z1U1&+z|K%D22>sd=g!m?kW6q%Y)G{HaYLe5-(ogwiP*%h;8hctH?eXXwI0&Ts%c38 zyJoG+uKoJ3>EJTE-+x-6&bfbkX3!{VS~?}=y(U#Ukp46p&p!nAAgcK|-vrMu(-P3l zX$uB7%qX;0zosO>rybpgEv@OAqqNbkXnFI%P;FsnS2T(^S&j~Nch*-2``cT~MK$5| zz$xzre~U?J2wfa;nH(Ior$mGhGg1i4=LEUo&fqnxV5ZcdS4_N#Zwf$DOhQ-^EDSM{ zPM3CQ2E9e;2C}=%adXkl=Upb1{7Aitks9Y4M<n-5nfNQ|;Tis^G=F8JgaTj&R8Y04 zTty3uZoe&uHz6u#(|ShJ^dXVI$E31?#yeQSjKBbweNb)~le$)|t37)%n#W;CGV?zb z*bFe05^9x}@FOBy1_+a-P<Sqm4A1W+U}Zq{j`QVkhtam(lCIkR7PLC2Z6x)<;V$9A z7em3CM;pv!ACvYXjdoA<5Weoiz%_E6jg?#=Ld*b^nuqL2*0)r}wA&bJcjuaNZHAu0 z_BS~8CUt(9dZXC$ZA`t1o?ja0KGqltIW@o;(g3}BXh~FKy7GV*!{b}}o>N0|=yAi; z!n}xHd=~Uze^}fx!uPnxBxUKjqAiPF2+G4NwgZdVm!TEv-rwC^AJ&b0Osi+za){av z)-n8uAWRFVhj2UV(a5x>i2};~9UAP$-i}%|uP0)DuiWDb7m~ll{FtPi%|BZV9D?gr z3KYL>2*l(VF<^H$P0iBf&x8>kI6$QKNSvT}PSgXyXZZBJ4y)3n7c?PnGpWl66Zyx+ z<&DU&alVP4U#5o6Fcr#>P{k~12-G-qI^3mb(L74KF}IDfuzSU9zk5-8DVr(!L#COu zVRqOFV8eY#dkH;kBm-@<SC%(6<1I-HDwv4Y#39Ge#;|pC-}vqw@9Rlt^lU1ZvE|(+ z9cj}@;KewxBorZpg+O46YC6ui`Kb$HWt(kmXYkeW_-J2mG~{s|U57t;9^I-{cO65I z+5`kRS*9?8_yG_K>fk8pa9@7j(_JdWB7P5C<zhe9YsApOVgRGv8pkAFe=nju!n^HO zC1*s#a)(bju&Gz~6TuJq2O#Q);uIz<RT-$b$E=k0Y&!P~8iB(1?#jDq>*CZqB~lG@ zUI}D)J1#UUYZTzY+7ZLcZ&?qReU?17+${D2RanKmoRQvnHLX}|$|^=`KQbZeO+Sh3 zpOG4%vXWf-urg+V4Z~xb$}}S{`J7nQNplhD`(4ypZbM!I*5O{JsDER9Zgym-yQ5Jr z=Cw>b)^JO?-?DogS#oqV$r<!mLt@Izt+8v#-RJwA&7~&YuSgw^Hwh`<gm<G{O$zZb z6g`~)q|L)fU^*EkG2T?g0)Yjfm7h}v5Lh{jWb9?7NX`lNp7Z1c;2n57*PhptLf&bP zy|JBN)Rn~In<%_sl8}wRU^1f>-gg+YN-Hp&?c=LiSlU0J-iE3{o*f!IYzJ=wgPWU6 zzyqK0M)2#v9`zu_kepa?YCYIkv+XO@Xyw06RGSOAhRn_Ox08m)4k9jH=<BJrlnQFX z=M{oJQ&E~v<ai>!m@Nzj!pJ01o)OMs4+@xGW7~>0S9;aIiAs%{X$1W#Hg7dQQ>EQp z93kr|Jmgi~_JjybhKd*^>P|1xb8Js52jVSK=jxgmuUe%-JeK0~R+GBJte~e95;)Tf zGdR~uox~suNIqgd<{e?#mv%V?X5PRTki*ag67-=ppJ=5jU1y(Z(J%nN;n(BEsmadv zn$=uRCSuWSQqJ4Vu{Xu@%TyXP;J|>!`YKMcD{<op1RUXIiq0~tuK*THRK8ISDfa39 z*N!-MH`RE?-bE~CL;Zkxs6@o(Q00DP1@THtA)knc0z%*m4!7VjoGn=SAclQlDC;qD z91LgD?pb<|m>6j>Ih3K(I_ii1Xjl@3{z&~{Ac@Ya8Ma)1{S9L<445`<0^9((e*GsU z*A2{K?rB*sUeU8I*|(ogxghKd1u#2+qYFIueLf>ixiJ<5P8ZFMMWKMt<+Pgfax2ZH zf~l*CaL})~7!>mN8nTN3f_Ja#yQgf_GIM`{@RtAp-c3Hf_UVZ6arAv3%m)An0>l)+ zJuOgC&sq}yDH`tk63YFp!V=&}7d}h?_sLpMjS1Kb3@EY4dd6EANSYVm6dfPuBTD^E z?Hu*biY+ZZD-zkgK$%{D2>{$`1m1+0`lo-$O@L_c3HN~2E{R^3)mQ*PJMx1z?;Dbm zVgvx}khfaNlqTN?tP}u%0{{avP|ATBgwvlh7_(lP!K$2c1}AbQoAZ-19JwFteWOm+ zKGvs4uQC1Fv}iR57pFn|%}t@({VbY?)N@0eRg(b$*-a4E6E@A;ph*&(^Zsd3<xkK{ z!%XQmni1J(aw8hq?J}mi5k<n3GPNvbr&QTL$=){E)*wSPrNxlWj{R(UbQ}C6`=i;U z)ztcMf3x9Ix1c#~Y%y6Pnf++RdVC%2yBjhM^&2YbMAH0RBd;s8x<r!Os{JNM#WW&+ zl6>*$=}&LIgSRAd?5kfUvHzsaIupmu96(DBpRZ|zr!N`j6VbKdDWih(CG$h21F~fJ zj?Hpp!u~wYN6c(MGC!bS4n?!kA``dKY?9$Rd6MVXE6`VdsYebZ^`CasgFbEFy0x#s zMGQx?t#C%w>)aei$&BdrO@agAplsBH=~?zBnY{Z08WJgcNz10zhRROdU;4@XY&?Q# zk{Sg}FI?x#Lizv4y=)mOYO&(POOPmuhE{R`o$C~-(io)6kSR;H9J%riA`f-9>2y6h zz}>>Xp>-C)HO&P60k*h23;bUo9l4LI&dUT4ISldCRv1n)0Dx=^;!vPFhk^cQ=9bOM qCg`$dhDM=9CdGNM7QDTpvYE2k4t3r^0MUdNoL=#(pEY}2qZI%d8u^O= literal 10240 zcmV+bDF4@YPew8T0RR9104M+e4gdfE07)1C04Jva0RR9100000000000000000000 z00006U;u(*2r3De7ZC^w;XKno0X7081A#CLS^xwf1&%KVff@{f3LD2j1>6|AVdDS~ z1NDH2%F#E9|8K{QF~C8qd)Q=3L{DR|A{J&Sy}J*R!E3c(ZoQA;n%Qi&X|NG}AL?19 z1=nqH9TzXVVY+F2B1p3xL<AOj{?y*k;n4S^G2#Tfv}?aOLSvug4)CY;Pw`9g!WZ|Y zL7|{b6*WSkRaw(^<q8fR)VYIo;K<|d#sjqf@B07ie7*Mx$VjmTWJ@yQ`^^49Y&kIO zIeV7{6J9%S<)MD8y}$eKnj)oH=nPdO-WU=?$)rjWZ|On<Z?J#nwAb6C-c`1e0;;iF zr@$;*JChHL*W^lzP~rt5$AbTVZU3{P1W$9qMQjGKFN5V7DhZl-R@A>JS?Q{s!L9%O zemjWTviHlKkg+*0qxST4D3R8%|8i+n^`TpeHJL0h2T7g)8stSSpq?yWkNe}C-)1}8 zTaFa5Qs;n#JY!nh*caH+aUlc1kCZkC@K0{aaLIY9-I(WVOrHJU0+m%&$R5IV>i`W! z5U`x0b|>(G`FdJ21y!xt^F%IcE0%==Ky_<eu2jv+GkZt=KSf76W`3%2@6_j_bJKte z0)sn{PXK&rK;Q#ND&iA^^pxbJ;2_E|cOhk^@PQvfa2I3kqH^o5aZ$Qz-McB>yXb10 z`CDH}vWQM8slwkqUHmQojAQ0lDO8ixLdUlE`wVDj`AJ>I_6uGO0E$Q(M*`4Qya51~ zJ-swI*J=>(H1li#_zCm<4>mY-Rul!yh_`}O*{W0EApuxfw+#RQK-Wuv07l`nD(eaW zK#huR06_;vi3pY|N41?l)gdmB(6M;-$G`Zqdav%(Sd0KV&j*J<k7zPLZH#*;0H3On z0h#jO4iBkdP1sM~2mK9cx?x(j11}eQJOEgfq3Bw1p}q|P;M2EMZUPE;jFTii{Ra!T zPvP%BMY_AVuX(L<@dAndzi3m|ENt$)2VMc$cmSAkXh5Qt>jpwC#eZPar@_UHCX30N z&(WKAWqHK$P4v)LCx-39;cHSIo9vgk38_n{qD|hM4*z9nt@6IV0hwi;s}s2Vnf9Tt z<#ad>%$sRIMp;DzHZasgu+c9Cr&-t>5Aal?^FD!P155MfwX9qnG#u6e--oJ%Jqa`P z*$t42`uAZo*XDS@rq?mQa{ZeWE!8CGeH^&6O;X=e14jg18eqgjz$=1vOaN+oNWEs( zjLqPN4FaWWGewJktkqg31ufIacpjhn6FCU8rb)QyeGXD<3?lMU3Cx!54K}hS#i+D| z%Ya=-m!R%KL8=E6){j@ZC5jXsvzI`-7YLzUA3Z2Dqeb-2e7fkVQJ9sC6g;j?HbgjT z5*vCVC3JN?B*I<fj)e0Yq7*UDG}1rTnqpMlXDX}QS0ZI#9~I-%cd@eVIGt`hs<Q(n zu2;T}Pv73^&X1nt#0ged)O#fwHUq0bG$*@U5}}6fNVpNWVS<T;S08Gy3A?=4>WQJZ zX1OEcCIJZr;zMR4q#0ow%C&*m^}%u23U<iGpn$Uhf%}1z+^85S-bJDwG(iccM0T(Y z$~&d{9b4M81-lC6{(oX3^Cr7fsUgJ*tCt$mtk^<^639{pa+HNU<)A=$C{h7RRD>H; z%B)f?_{p9c{CGV0eM6VIL6;3B6>>mSJb^|D=#&A2vS3mUEXspT1#qYcE|nDDLI))T zIhk0gktTeE3MLWvqpne%1estcuStW_Omw8I-?3tL{im7Er#aR{se9a@F{~WcC-G{s zGuDEq{ZZ*Qb<1ehslFQ)Ygu5{q5Z)WZ2W?k-_H1+?bJ5bFE(_kPBWuTKoExasmJzM z*U%S8f?6~+9<UPIIHOi9z~j62ad|)U)9n@Kt~joYhoKLwAHLWyB(MP+vpDjjk#uQQ z>MnI<SahCITy5(L*27dw+|T;P^fvw^N83j(bkp`u3QV{_l!`G&v*~n~tP+Z6HVT*g zk0HuSgHgYnOrjnZqx{t7%$4d*f=xE<cbp+=3W<xT>Ta_x5#v0C-H?C;7k$v?SPM3} zrG_rP$YHK)p-@R1jD4^na5<NNFs<83dL~mKdXO~5HIXtt9Te@5U~LKyu~lc@>GCa? zL9*v{KD468H8_k{yKyYh!#$Y!>=_}KA9&uR+q6_h)Sc7RLT66jL_IULwT`t*$#IMG zz3PO{X@BCguaIGu-F%gda#4@Ekh!}uJY~VErQQ%*i!+ksKy*x<5Z#gLth0*KZ5;yg zPce%@v;tY?sh#aOPkOmehVl)c$RN<oa&L{$*oNg~E3%%V#sJx<9LoB-!;7+AyTb~& z)9F!imkchj*B5L|Os%HHsK7Gz8I(GEH(3W9z{WxjDd5PDMvf`qBmg!crxbAJM<eGH za1j7|NG>Vh%8y2t6mT5?8<Cq7aLbQIZd1UW0N9k=rGR^WG;*H;9t6Mwc}M||{AlDc zMa>g3_BMa|mCk(dJR=KuZotNoP<RoW%z>BQ3B2-7)E`cS!jG}(6a3_z!q46*{NkO$ zuj6L$n|B7kduQ<4J6q}ve@bH`-=X>lmk>Lc(^m(TrHh6XKv)w%)QdlvuTl@`0LDIm zdE;dU48Z<H*br=@q-6|dk?xk~D^6epX7BWl&=u=z*vm{LUj{!TiObIv6tVkFdY+@S zs=eH)F$Fs-9D$mqs{HbtNp0><<mJFKNDQQ$0c&71<}5)4XxBb=YUwgnn(ASQ=K(2Y zTYdDE<<rNZj9q!^f_2o+&_=>Ch>>raB9c@=+;7zZt5~IjFeuMRBfUqXv&F;8F}|>H z@r-~oNe2FZxQ;AWWL~H>6tftTd!`K}bZ@x2;#WXGWrN`p3-KivUn5q8`QM^3MO!sF z1+6AZgHR^c9P>~^AbY}JJcV*474&e3p1dHU9cdb=lo7d_3|#ajP<bujii<Fj$eeiD z5{`hz&zTg;-1VY4!)R2PG7`WHOR-C!jl54K40By8`T2{rAPi$dTXPMZs;E(|;4^6| z01zS^qmP^81SxNhLmFC|pxrG|)6g>_he3(GP9-eH+Aq+p7qwkd3KeG-1M>9PBVDU} z+O<}wYo7q)=>JGSC5~%4@*AaL$0zbL&(Kc&G*A#LCvDoABg|k-5sgFRxBRnWO1cDd zsR}48s;&0m8mE~-5ohr39ZqJnG0~HrUaM?sGk{MOlu)31J&w$!^I+t(0Oj~ZIdMOs z7u5nV^TAtK169<cm(6tCJ}=@#*2Rki1F8UV)gF}03+7?ptrdFt8&4qm8cyXC<p_V` ze1ijEITlda(kF~kxQTYwKvlNd-bRNrQx+d9tv)`0U?@+b?+{B^Zd6PT9yCZ9x_~B! zL5n9msvKHSF36fm>aA{u6xHi*V=s9>OITqh@&-Q@;IQT~*G?VE|IOBrBle|?Dp{;i z3@*ljT&=WX8E6n56T;9yIu&)g#Vg|IsM<)^-bmAUlqK?%FFmR`%Eb$`u|!X=RhYfD zSx(>iuwSw39ICF^gW`9R1n}vYmV80PkCWRj6s#=yO=(e55m~enS7Hv3fkmrSh|Z3x zW0F-Fa2vww7RuEzL7`7S50VTner<a(6;WzDMrVc+u%ChIJ+1J0bS2(Gtw9AQ=FV`E z6Rp!hOfcCn5b=T<psy_=q<e^<I{teh>IglIkERb2I2psR^)!=lH3QEu8$u5VA;z6U zLi}O2OVePvNBRvwRj0ApZpM3Vvyq^A+sp3p!~fI$idy>>cp-GCJ34q4oyVx@Hm8gq z285~FFo_^f*>ww)YOTgS7{g0pLin~cj&D1qnKk51ocr>ZW4SOuJ}#ZIFy`jBamBI? zRW*eJNdnz0z`_jX<;R#KD76CdITX(BFmEL?hjTwAdW@$%FHkzPUh=YI+A?Z0<%gOx zaFF8lW=v|0Kj7_9v~pPEP~BI$UUwrJ-#J5{0z$34L36<+&J?cWF`zyQE(#bhcuhwt zwmQr|2hf`uJKsu@Zm83<@drGrpeheIbt@DU>C&7lY(lBl^N9LFNnl(^Dqe83Rv}(O zmlxU1l~g&z@2Jh2q271WJo$f`iVge@c_6=<XIlySMXp$u5@($>cD!9sQX38^XO8zv zVlRAY`^R7lB^l8MGs_Y$@J4=DoVqY1SkkT%8F`0IX_ho1&6%^lRk{P@gT}RllnyX? z(epnAvx<3ti11|a@LFkum}H4lkOeq%QHUiM7_@~SAu$=Tmk&ywsFv#4L>zw%KX+JI zsXBwt(?I8Stt65PM{X&<i`I^gwK@9|lO6&5o=$>Q@9ud@Z9aXrcnoTiQ8Vq0lX$32 z=fr_`S`P_C(X~4y)pKB-tMh~wyYg!_)uk#F#BMtc&=z3Stu+u?W*1BignNM=KNB~+ zx-<4d^1lXh!4f^MRhaxAixU?Ty9u0TtKrNewMt6+8mbeI6J4>iu5T~sx}|~P3>QP` zYZv~HvEzrKXUxEVR3vPe@VT8!bbH8IlgmmZvXa19Gw}(HZ!XQ08=;qT1Dk|u5ld)F z#6zP2qkB@+tcQ=<&%)-yqy7=bM7DJ*E0Y-2+NiwA%6V%DOR3KOA7i2oP*?Nfidw{h z>+%%~7fh_X?|`;TPBLBX#HyC&JpX?zX$Sw(x6u$xVzzVY7GB-zXw-V4Yhp&)v*Fb? zE_K-BrZ5@Be|b5@g6w*6#brTu<`k;eTBRtD|GMV7O#W1O(jifEKTm~}Y>a@jSnjcO zG|X@#&R``~aoDMD>)}V(IgYC{_5!!}BA2*@Zr5713k!}lJg>2>lo8VW!N8VUxoxqk zs{NUx+dv`L6#&w;LcVL?5Z)O|Q$i94N9%f)c|GC)+no654>76H9CWC$2E0~NK-CUU ztlnyV8^6zYH)50_Z2U?dC@w`FFt7=%bx9%2PiS-YD*@G-7oWMbWq<ZdRxVT#qgwDB zbG}?OC@cY8R?W}2<RDqNUFR}DzbRj!R|%W9@Mj#Ng-e7*u`b2jmh;670?%6gsbit& z3jrpZdSe#WhUl)hU#U6FCFKZBQ(%40UDs~3FZpD5YgGXDSW?Cr<x3Dk6!#m-3k$Mc zCBl(Q_*gNx?S*o^T2q=WpuC~AdP|#npc!HH;vl+LA@eSVxGjZTcddu<`8BPw=T{<C zXMohJ|8T4?@rxqa^rjaX-E1svHkeu$iW?RK)MlONjuPc&3lB;p7_|EIpSC=YUkKI< z8uf-#2I?=DdZr8wefQ40-*q>RK7XJ|IyGf>3^EQW81uRVG`G$ww9eMXD9^OLDoa8W z%2pe>qVfLBp>+sp;KF%MW*9Mx1~^zIgVz9h>OmeO6XOhs%t)UG+_tsV4N96bGX18u zJWpwN-eVG1AkgJ0o2$1J$DhOcTJxbPy&$b^rmmEUTC|cm9I))%(&sQh4#ws{2fAN; z=S$NCGA$WTIF>dAZ!CUOK?_+7i3H<(GrW84nl$;SC7Scg4joR=mN7VC#7rj0>z=CJ zhQ=zBbnu`UpV0j)W+#o=a}ptTiQz-D2K>RHSc_o|*nn2hfD459ow`yx;}`xwu0N!a zv%}{%mB|ri1Kr%9vv5Gw!qMjQd=8Iy(h+e)R$etKdAzc%6-H&O(pX`!fufx}4cDL| zni;DclR-vV(>FT3Ew`j|gKv8he$zs6#oI#CCG+J0NA8d58&x5#bqbp!;2n?y*NjXu z1|x(`>W=FlP|QPUT&AyjZrWeqMfrSOr>)9#yeQ54{m6%=JYjT}yEIRJULty0yrQvb zQIc^OykRzRaocOWqn_VHyieWCB#WtLM~8QpEx9y%7PVb+QiR_T;!iexW`=1d8E4_? zANRp+W84r<ziNm&%g?OvC=*__KXKcgXi=-@4|GL~C@+IXl9_}yBP`qGjnj-urK8pr zQ5%YB%Tz8kZ+%?idPD@TD_MOnFZ?|OyjQ#du=X8KH*g#yEgWxAr05}uo7_L|?8^^F zlpJy#ikT<AE(r!Y!q0G_c_uk&{x>^s53S>BU1xGqy@n)WWZ0hEw_b;KOS$+uvo5J7 zuh^lB`{Z?3>O)O`KPfWyzan-{Ss;B-hu;<8Pj1u63r-~3lFV(hDV2#fANJt8kE9iO zHQ$#Xi>jgf2<blLrB%$P*H##(xOTpn*P0hFWr&~Ld9y&3@ahP|?2Kb1{&T1y?#PeL zjhut_k7Zvl>9PE!0-8SPZQJ}&=W~!s;ZP8KRvM16m+wZmBL3S*yAARP_r<U=7M%6= z!ed1OzVfS#IUm(=L3rL=;G*%#q#0SN(u6<YZPJzey_N-~i<}E~@W3-`F5K0XF&UiC zAHFr(<C7iwD3QYIbe+XBQVc!{lvblz`$3nc^6A|V6ezMTr3!CMJ1=>atUzE`eDpaN z<$hKg(M9IMs~`*|vs!R?ab5EaPPcfn(4WAei|2Q}A56M(Ibti$iP?!e_w+QNu`(a$ z39g%mQ=V)x2U11~Q7pi_@v51`-S+%2n?X0}ts6rw>*wCAg(l3R-B43sw9sZJhiI74 z3l$(Sty<^xR~G$7QL=dZrav^Z@VU~o%U*59P-=VAr0~?B$Kbp4gH8Q07ljgFf&D~F z8(Dr|80q8|OwJ#P9gA7Aq-Cu6knr;gz^`v4GyXL!+S6C}lL$(H0sGArdjre?Ph77r z8feS%DjS&)n^hNk(|_rKW(cZJUFVmra|%+Qwg%$thW|Mh`(0$1AXUV7u%!LR{^no| zO6w>qrKCE>c1@-`I`XLqrT_5cbm)zsLRJ1il<LdL4`=vy$oUw9`iH@`t;Amxab#<} zNsT?WQM9Rtz!-@4zi^xilq8uQ$`63<4GEH0#2A~t3TXi*!{98gUtV(#gQibk0LPE- zr1MbIS&iew_D)-}HY5m6G*f7YpBFQ19-jDf8j@jAmlVH}`l@78HRPD!EAvCns8cIk zrwnHAHusBI47#{3VPlHd-qS5xALoJIc!9`welSq?9&=K0Fq0^elC3tUF^qD!&es>V zrCgK^95_BGzokoT7_4-{RB2|l{a-bk&ba&FyaXa+TY3w;V6kr_Ty9l=%tP6G-(DN6 z(Ld;9a;Rojx3mNt8gAjct#3>}{wl#^z>Bh0CvMd)r8iRf3|Ot9s*4XFwp&=VJ+0kF zJ3l-tiB6lUUKI;>0bMPUYE^w^`Mrl+3<b4E!>U@%Xfp(+s?VqMAo^=L@%Ot6RZBvu z)a=XS(>sU%edM;c0eS!+?%n*@%0)?WyF#X<^oD)FMYWN_xP9<Xo(JR&B@HPT3MzBu z)s-qUvmpeZty(h_IDFH{V^FejPjlRXS{O100L_MVWJEK`t%*D@{50Aj>zDO@B`@1L z>^6RSWDF*8djdk<<Dh=6tSn|`-%!DOdxjhbV+9$36wPOZq3_|RdL|^sg?T<(zUIAe zq!og9<M)?*_}|6>H_$XmsH*gmtbq^Z{9sREf@5#Af}-z=(%)JIVXT-6Mzf?PaYx!b zxgYHI^Vuk}*)TV8lWHa!K|`6@$9~Sj|8H;YXKbXhng5|Y@!IYw69bn}wa^jMSijq{ z7fsx~GV~{p%cf?>jru}NqA=Av9K7y=DUj;VJy+*@<R@b;uw;@abN(cAxl~7%?D048 zU1Eo<8?({s+A7Dhs_{wqC#>58gS(t!HXTZuXf1o=Q(V!ft`yc?e7<oa%w;nm!K7xR zx||<MIi6HOn2(m1HB+IJNWP(#gGyU&0bj(}A^XJ(44fOd*O5$K;0)){$$j+_7Rt2T zthQb;(<MLNj+09%bP{C?@rJ0VtZMQ83;trbs=U!arVe(*+r++!@*P*NsWxP<O<ywV zpb}I`M;%T{elkcQ6{(v}_G|5z%qK;s>NhP_lQ63(pnT1E>i!ol66E)*rp^6H_AX)c zm7ix*V(q$P_OlsljFm24Kry18pRy-)UW>7e3jGX+M_5U3j&Y0i$Fg0*xLKJGGVU`$ zKp>#5b|HP>REj&LA+9}TNHfw8as$Mnoc;Qh-)|5RJtD5`^+5_!W-q%R^%IfMm!hYI zSu=;M<>xD_MxtKat?W2)wmaS?D$2R?ebLNng34$~4LL`bl<c%a4G@MRn%U>WX`TBR zEmUGznVIj%t~%N{L+Iw)>{YG~pI|z0xa^*H_<N9P&seW;#|J01bM(1v_tk+EJGDC% z&>-bz%d`d|MNYM*n`g{_cUyh{5@zrq`jMX5C8U1aYigxVcWtp;BL1P`&-mUG<1cX1 z5JEcN#Z|J%8A%{Uu;CBYw0lRSaoVIBpU-Z`Yi6i|w@V9Ces8<aXHs8(bB;DWd7>eC z`at>AOy`ctA?ABAHfz0k6+uJWXP&OiH7D7GS7M!bJz>SoP5$BArFteQ;pcYWreAUG zfp41BlVV6bCKqLVZ+vC7xg5wfHO5y|oQp46<l0Y#JX{^-$%{)XT3D`IIm}e1cXX(j z;Hjx6;v2}l3hs{+Z~gWbf6hgj&+M)m;XXM-SNSPQ1Qq@zfB|Dk4u%^Lg0NFRG#8}` z3>$Dzu8{v;|5v%E+s~(L<im%CRAM#N?DD_wHh=wgVO6r8S!6wYyM(51D$HYxo;@n! z##W15W@e)GV5>`+vZ8>Q@*3~pc$;g^U_scU&VT)ItdK#of3ew`SdUZV(k)GMwBhS9 zTwzSB(W#6eTLnBWzUZ`nn%O~u2^czW{o?R15)O^^+pneFXfrSwYHOACy_x>LMO>ry zXe@h}YzAqjD$H}@Ip1V|lEqoZY3#i8c@~eP?YNt9naal0`@ZY3H1GOurO3uXMb_9I zc^T;{Nzqra!Mw%ajK?Oa)VRQzcKWM=8C92L;q)C3^;|~b=%0p>yx#=Hu$`URxAqAe zV+Cq78C>Bap)>U$s4DMX)n>ORF8+lT@5$*(RUYD63Rb2}`EfZPJIog5U7FyDhOu9y zxd$qX{|nNZMJTwBXscU!y3m9wZvMg*3Bq6N(RVX!>5N>#-0@@HipGkXU=@ZiMP&IB z*0KCsIpyCkM%Y+LG|XkoEt8#JiG#gSb}I+ODwiCu>=>`yZ0@4M8XO7U=A#;iz+->T z`UNx|Wcqq{N$T=2`R7v9;QKmE#?EDxa$`h$-Ud5YkA72&Ku*dR*&lG+uqI=Z_EWTa zHVbEmhtWE0xGo#5m6z;@XV=-9ggrbIfnJH|O^US8hIZ;q8lOx8Z>_3%jmISBu~F=x zT)b1Ni2H-FWg074K>{h&v|-D&IMUFMdd47iFU<D{zWj;jCV6ONsy_>)%q;G7_4Al& z89V@MT6ey{#V4iOu}wL5mzCWFDRT$6y@u_A#){osCc~(<m+I|h{URplq(L*5Y)xIc z3zJqvl`OG9b1qCF=ACvZW=Y$}zin&x`d2m&=%_-0RA-LI4~sM`n~StFbTDLjfm}pw zxtwpSi~8n|kG*op$fBd`_byv9e@ORy9~Cd?8~HifHu_9F+e-7%Wg6}F=*9PT@fZ|j zsbZGnJ&>TJ*y%Q^*?jgsj}C!CL3KxC^A?cx$vFXxnSdE=Et#|$7#tnxiP(s|W?Bg) zR>0U;{Cs^Fr5e%;@V^QI)!bFFSxvMSdYWRBcj7+W`Sqn({HXJ=WflKW&;S3Z{vR_! zpLx{g2%{VtapwTJ;zoGAl1jv)>1fzwKIPH2LhzFsSm0e$SP#JkAcPnbN_K$Rn%NA^ z*N&<4`GQ9$6JFtOAf=vgd1yv-aRTswkB~Nqf6Q)WJgnMkxsZ7So^E>Rpxb$r)7fq^ zKWH#v$_W}c5ik!MVJ3GV^MGXD74AF-y}-B4Y$|*V5B0Ec<kP$}DHGG1I-zw0Pqv!i z3GaJoyopRpN)#sYr?Se7Lqc+mo7s3gAJ60Kb~;fTp2+!<M~_+o3Hu7gAgY=9WAX*D zQgx<+6%&R?i;)DC96>4A0Vo3n<<7uy3^UMOTgsO`D!+>6V21kp2U(yxn8WQ)1ULBz z5Q+GiOuXh8HOAgk%*{qRmEY~xjB20@`JzYH(kbFH!rv$m1EL@!r6s!tHe+^(+_i(` z11`TKeBx`BL`-S$6@C>KYu(!J=t_i%J#fmPF{Rns!>wk%H#?pmdsBa!&uX-0uPmY} z$zko0#d9nOP~eCViXSN@BzCWGWj7kM8fGPx2(=~gHGVDSQ{LVO$C8F`9B(jHA6O)) z-a5xNikFg%>4S(HDi|6=fOE-;M9p6ll08EC5wmWah*fM%zF7rp^)1{pEsZ2rP8%~w zvs7)eseeA|G<1Q@kbX@g4}KGK)2-XKq088Bd~%BP57BscO<=F1s`vK~Sxedgx;aTf zlK+q<3TiEXmaPCEQo48B)T)Dw(n=en>bJsdKYYPK$`c|Fb6#AKbpVxjq>+>uMzt zha(-;NV_zLF3Qp}xpbm<#>`JoNIq;)I)?hD8+f{!O^At;cv5J69!VN|cuGUe&}q7j z-JtHIHQ5ZjeeW{H8qMXWkvfTyi9o^=`#_nPmmZ$so|)#493>$R=z%#^zpTo}Xdra& zZEm`Bs=RGDrfoZ0Vq$lpJc-8VSi!U)8Qyfkbi+JRQ%h}1Z=Q_mG1jdDUi7Ra8Dojq zvF_}rMAi%`oJRx!^8ligpBEtQF}?fF=jJ}6<JnbBsXO;hEqDAViKYN}z`e^>wjZ}Q zP3x@|iqhtbqZN|n6|_=3Q5KdYhPDbGr-s47mBA2QM|5Q~tyODd*U_Q<9qxV5Eoq{N zEl*?WBzoRdxcAmaO2ji@C2c^f7Me?{GF>_1rMc_)k+$U!lk8g9h(61o^L8<b7Hr3p z5|p=tdkl+I-!a+|dMzj(UgA8qaLy(8HH|%fc=z_U<N76gV8s+4U3GJS;adc298kQY zu4lPb(l3syfOs!S*xXj9{hsesO6i2s;*lOPTZ6CK<jnqhC2$B8?@Wq6#(g7(j1e6+ zM)gr49SeDWU_@le2JU-`cbvunxW?7hwA-#afi2`S9*w@2C-TdRJb?`B?;pyR)K%%G zLg^Ds7%b0HibEc*Hy!HwA??c47qGC0#q83p)6l1uSx@IYPpfi69sny|LE0DSVLbt; zqdwwRR^#r#3aU^bpcOHOcxl~sM)#F(Ui)h+hUr*(&6GB?Zg$2t34C5AM#3BjdkhMZ zYxq>x(nnd5ftJ~7a~XCo?C-9v7IX3F)-n96fA<GnECv{QTatyuGi3@x8NUERL5&#~ z8tUeGWzh&qg>)Pq>v4X~8kW#OcZ{1ab_`LfZ^4wqoSk&rHMf{o8eG-YL(U*g1aG8m zI5!kWFy&&Bfl@n|#ZnihJGZQx3I2%HbL6ebsWS~yDygL!Ai$72Q>|F#01H;HB&__A zdce8J?9q8^-fL9CN=)J$^iKbdU9VTIq^tL#h$tu1B(i*F^Z_M{WAo^ij0wq#@#v;v znvfUyRI-#p8Yz%|)JD7FIz$y%#)lG}rtjQ7JKfn@OoxNIZ=2=PFeZn7;bI@1>@A(h z8T438V#orw!Vbvo_57^Ws5<GS++g?MlRs*}7g4S(h4L{JEgd3BSPv(GVKRzJQ^kY@ z0^>j~zakS5SSF^(*jY+sIU`tlc2fkv88}^=_>Lyz^WNSENubf!vG61cpLrx?{SHR% z9p|mPNzV3bIlWj=2o}u6KU1uPN<ltZglQ*#Ga}iJo(Q<(6W$4a3%C%+(HRoH1*0sD zj>YS~NQIW^_lVkKAs3Um+TJ?}JbV`M;Jdcc>ofwjl1d1{pAt$li0u1_8&l-LKo~h$ zlurQ5&_fa|RHEC$Iu}{%znse7^*uM6*4cd8`%Xp3T<m4$C_Lmz-Sm(M3^8R%6shM> z5}!RgSUCuKq>=q_u;1%8f^zA1O}DW;E9iqH3EV1$63j`tkpR+wvk}uZ>HxERYnDU7 z%rzfD216TgrVTCOgq5mz8NIWe<^lMNKf~qG;cU|HwwhX{RJ1fDpYirS)GeueO<>1> zdi%;Nxf0heK)?}BihL$jUkXw$Ql|xClJ11dUo+y4QJW|Bxc_SquJB3VFbSE>pyGY_ zB;u=1;8)7Ij1ah?8#y>i<V!61I)+^kWhI8~lj1<-mZg`76C*9o3}tAww%V@U>gJL{ zyQOxlNrJOB-8RRMulJzqFm!7ItRd8I{h<WTE|`V6BQ>q~D4h1t_nt<9u)nVz_6P`1 z0HLLTKM@-rhrrA8=4fegDByA1t@+b-s}XpPTFGbA$ta6P8P>>b_Sg8!mo>^~0R-T{ ztySU4wf|`}@24XCH2{Ezr}_V=<<zGY-+NL30I0}9HDx*HsP3m~eE)MaZY{dWUTBkL z;1;|{g5R8-ToRwuNGaMjAOq^HL@Fp^6(ZO`C}AKOnA-H7M3hKQf3)+I^=a&v7B8rA z8qrUYWqN&)GNyP1FZFsegco%lHbHFk)=$wyoR8(>hHh*X6YsNP7Fki00Z|o<`_cX2 zQ2>a}U<d$gW^72=d|_jy7Q&K25EK^<LIe+ku&UM|B5!q&B<#<QWXmA4<#;8?QfR+) z#6t0KdV^u70RZfV7*r7HaV$tg;$Dz(8c%|(cBTb6g^YCMsbDyIb9ykMJNThvjH2-t zpRr>+O4!U4mkdXm`(a5dQ^SvLZPSgv)on0T_ohU;jy8KqZ=|%Tvi`mG(mG@5N(#6c zz7YJ%y)8{dyWUjCs^e%1d;QF%{VTL){k$dJ*x$U*TB<u;;)@H4t+vSUg6Vr-P)(BL zp1n#$B23s1!<U!B%R5?O5^?X4w$osz%Jk*KqD}c(-tq$I7CVDlXKvpixuP5Cg1mC_ zwO0KU{geSQ;xQe{gQ1}%Og!i}$vYiLZ@&|E-Vy!Bn0DmwS#L04GgY?{y;`-Hq8}k% zqXYy4-D&4Y(K0>q33g5TJg_c-l8_@!tTANCy6UDLT`D^M1if^U&AgRr1Whc7h$!kh zjqoa@^sGwtY`g;+@_~qM*19H&HR)_1&mxlVFjbd+4ePaPQ>bcc8Xm0)0qrD(zp=fs za!u{cEzeY2CslD<rsw)?mCPf|&NC#{rRo%Mi7DD5Hmrto<S$Ynp?um3H`?yBD8jW4 zpC!Y7r!{sek#A~WZn42|eiTuD6B7a=I&XNHVU4q8=SIbSC{_}aW<FFhh?JZmNNvnX z(g)Ep18OuzDiKGu36XH~IV-5!Lu-7o4+F_<mpkZDA;+)1(CY{hgH~;=If2PKIug00 zM#8l%!Uk?X6MBh-JnMEW?X>$emL%&IyH9EyVjcPZ#!nOE;PV)Vh*vr>4-94{Z{@K| zCGiOe;Y7qFq-4}IwBp1|kSIyA6sgi`)y^_7N|zy1mTWmpa^=Zy5D0?^NTLi}wCb8G zI?ZWC4u^eA(MS%!`wZ8Mm!}Y1u@5d_OI@A<@)9OPO}+3=K|m^dXndq8W#g3r03-pZ zhk^N{4OqW1F}4>^(jQAel-e1uiL-${VLf_RX_M_AgPjQ@Ae#8hi3J~!<u_2b#YHy( G0000_1BZzK diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.ttf index 483a7cdd4eb2e0aedd07727ead59f50818497a0b..c42d169167d78a1d93b4fb3f85f168417b5bafd0 100644 GIT binary patch literal 24400 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 literal 35660 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff index 189fea5e4ff5d5d66f2793d6753f702590add053..f30b54b3d1c494e73e6af651165cfe572d8663dc 100644 GIT binary patch delta 14735 zcmY*=V{|4>)a?`7wl&cN6MJG$%!zGdl5}iyV%y2Ywr$&-c*2|ayWjnBPp`dB?cL|B z>Qh}^-9NgHYrv*`05=73aS#~j(*zYk$p3jg#sACyYybbIpv=q)0&$>zs%oFm7k^Tj zHL@|V|J2MsxydI24<?{-ja;2cK_I^MPfq>`9&kZqV^e!Go6opu5C|#)1VTtz#$3BL zGjIYvlLaL|gJAy`sAkq4rXUcQC<w%A2?9wTI<WulF*h+V27%aPKVvxl1HNFgzxk&K z0)4yw<RqV<gawCWG`Def|BM^{%%}N;*A5G^t+k!eXB^vS$Dr>2pn`2`ZDZj6*)LlS z2n2vgKSffo3`7N61DnqZ_&+IFEC>Xtru)}pz~0Wu83Ype<e=tHom6K4{mkCc<TII1 z=Tr0fM0kAU>!|x`W*d|~fm9=tj%rjMc0=m`LxV=$bTXr+sb(-PI!*LNY~ME5$hdV~ zpFPau<uvPFd!e66drdp=(Kg;L8^gr!(`NLcx>1)oak%TBA6!<&bDepWA%KKR3l8cG zBJ>3(+!maeMa>auHD=UIivOnMH8*02#{Kh+S?tNdxBKv6E8rts!0+l$z-sY5D(P~n zC)HQC5)&}k)FKeb9!rR}*Fs@TG#bPwUX^olpg?oZ5uP-+;Mf4rhFLGmJE*iPRV81~ znEoM*N*+>rASJq%ikFPeE2+INhutK>*&|jU1VP?iV_jq1Y39JN(l*}kNbU@=#pX?i zKRe@#z<y2#YA&0vApKaRx`jx)B?-;NxJLRXhbIeU81>aRI!7Im!+8HOmz4AgJSy5A z_04$r{`=<}J1>A6D$_G_ZXAFD!51`sWLf4<1>oa?D{pgZR}n&b@rP=FNR5AqQUv8- z%o5HeNg~(m_iB<uL2f&A-;TrU<1$c1=c|L{B9uX7mQad`l5)R_eui!TIMJ3M6Cyi3 zwt=40=pWI(It0l%+&x$3Kb;&LB(o$B7xw<uFqa&9o&{>Clfu6-5y#aaUQbb%jaXAw zY=2->&R=J1C51|2qS8n?HYi0)^gcBEi_z`A&|N?Z_%io(cAk;sil;0m?f7FlAb6@D zj12rOmsrZy)_6z`Va8nZn^7`wC{41sr>;QJm45!&mZ-~%=SJ_)y!qY1`_Gc=k&cqA zr_Q<hmqLIZMr$a%a@Vn_iH4x+-u>Y0$m-<eyn9h^<F+n8F13@Ov!(fvDX}lVzx!~z zxVufY9QIE;VIatLS}qvmYY9p;1@*6oPEJV=+eEQ~J(V)^ZX~0Uyn_2~&s;b(`*)&< zcKaxy7?4eH?S_8|v78{AM*fk!Jxaieyi)t;_c?&FY%cL+<iFRnnC)}7JnJ%Io6dcm zcF@_B;q6y(y8eJmD6#e9Xm>>CA>0^?JNe*?d!uEclA7c3`WDx~n^jON6*Ym5%bj*! zoy+k*CzwfXhDGPo{%ojht~ioZ%6hS#lw5*0o@>9I<c%}e5#$+D)?<(4Tu4wD%3;j~ zZYY4quxEtP-Dm)YN<!QnqMtg>QvXWV1y!rGN?f|AA>Z>w%`#p`O`1V{p!J9{HG+ON z1)hg%+wGw+Ue%7Pn*R8tZcY$e5jr3m-(Rl^XD&Bz?#L+wJXeieHKxT#AY=<KX_p`5 zzj=XE%JK&ik#tTP{|@#K9)1rTh!z$Z1P_o(=I(8%f^!))Xfv{($@Zb*)HyCHG8$L* z2!^CEXkRhg@|y)&iQzKXzU2}jV;P8mPzl%6y34mM^kEK@XQ08d@G@jXDzpu=!}E5+ z7!1lyxG$@I>~Uo`jhb4uPfK`vQ=PFhpI+2$U2@@vF-9wjeo?)~u*7WzL1i!wRRZYs zWjEnFE<Xm;EqI^11nJ^$hnhaXULo93?MZp>rOhR->3N&Yz>I?fHk?40+V6?FnUZ}S z?*B^tR4hsF^}}DkAIjK1=F>i7bQ@|LpfzIAei!rmw!ha1503;$2z8mg|J&dpa6y3r z^*(+m?E8Ko$gDus@s?d_wKo?(2LKyRsM}ZthQ?5_l0|1bj!SXru)M72+FgGOBVd^M zQ^rhUqG)8$f8o69RV__c13QD`{~n?C`wHWhMq5Pn?*vp$L1H@qxb5^iyDui`LrQ-{ zEZ92|oxgZ89f*tv5fvTnXRIjb?n}<~!W^fr#`}1?OIMPHuWnc^ZluhBB~W?@tNQhF zI~xm}Wz+#OAen(;7N^mg<KOQ&eHIU_rv=dCHBojvsVo+4!uyzVDm(<~FvxfGy2}@I z?8Tu!t(<sDK-|tj;~Odxy9x=rGw=hGtDS-oMhI0GD%M~9adNNWerUJMC0ImS4uV(S zf*d@ojKrxTfV3o1M;rZq8^~XAzlmkk=ElYQt<w}Wik=rpzlE(sppGIsDpkF9R*tQ0 zl}r`_F%y|ZEzrRqig;a23SHF@=|jR@`8`yGXrjmvG>wUL?f;iVRQb%;U>U2s4jcX3 zJgpVQV)AlF3>4x7>si|)1?)`EWe4meW7A#S?*+6lE$+pH=n-9IML?2}bP^**C43>% z+j4lSm#5=nP-ZEHq~3Wo!VJC8EfFQ^@rcc4Z6qOJ2>HF%k7ruoO|qKa)j1DCdSF0Y zp*^vNh_FHh1(o-k&C(C3ccQNlFkwrGqL}Ag*5X;gHjrRY)S-+F7}|>8>MEo*O%u*V zFA<AXM6g10N5UagMS(~I>0ZZcdb8BZsUC_5&o`ApAIGyK5;mu)PWs%BJQSY^>*u7( zuA=m@sXoGQ_v#?<wFgwgokt;1h9w+Bfcf#`ijBrk(NO^g6G2}MFH{Lx&~FoLRzz&O z6vgGx15a1G98li$Ovg)2*dIvH^}3%qB{7mi1wB%W;_^-`8~}|*zk*RstxBKwrk%}p z@-lc;!MQpXv+l9X!{U5?zHD51?zg2~&p$NGfAB^Sl^V|LVAJXGwKOCE<k$P~A@t)e z{Ygsm+Fb@#Na%zVA|Te3wmk-SGXzDb!h1N@yCf1E11e3NUKeKmbq<17=+(vh@i5)i z0t)!|MdYsM65wZF4WSEUN{i2z{%x}1UhXafJ`guynVk3?S9Lg!^1EP1z16-W75o82 z2OL46-d2<QB?gXX3j9ryU^BtW#_J+RtW%)njH#1J9*VB8qv3V;JG-hNcjv2$#k=A| z@0Ebm5Bsx3K);>vBr#nA?peQl6{ZUUa@rD4))Nv90sy0gXGAA%HB!PB5x2>S7}{RF z^aw32sWc>0QHiESt!70xP1G9p6KL=04x#flIzxdJeC+~Wknp(8wTd}2;+o#mKpL(u zX2UT)2*<uCv^gJaKVW8IYt9}ZakIgXPcP|i^vzhMiLIA%nzW*q9#Az4b@pSGHxzpw zU%hMq;A8vx@Ac@ejCx8na2h74*Y@|Hq*oCS#8Ld2cX9C4RhQyVLX9>nlhfzBnSW6n zbJkgv5qq_-B?9Z06avR<wmG=scyOZKR$89S1!T3yM2QaI_@HoT8nD1F^M7f&++f7^ zE{{d&{C#d?RDmS{8w9k54A~Q!RCN9N)uAqrfO_Rcvshs`3Z_j;8trzz%vk1x!DIR* zF^|_r2k`p5L*d!O|Be5*CING%%{rSy9+SeIyx@a2&J>ih_sb<B&&wnKw(HblI?gbY z6&LeA>{pI$U#v*WJMGo5&}2INP0@O7SA5HJ_ebbZ{*{6~C<?m;%?oU37-?-zm9>#B z0PQv3QwM3)2H?4PES$Suv%K4U&YTzG;g2P^DlxRZkyvKp-UjPTUPGFJgkxB;^^_fy zAGfu;S+h?zIyEZL(`UNoJyrhceaC?a4F=~0I@n1|>k85a1F1H;=%@~Z<;9xh#p0E_ zgjg+z5WWkBcRZs&QywpLebs&SLL<!qtUoZ{VeZ6oAn?9!&HigAhCnJI@}cufSE^*% zL(8F7`nJH^`U@gR%rcl1tw~b@|2QYwV8Gc%{kLoMxz=}NbV;!l;mLW+HmRW3ovH%4 z`k9B)+3UEI5W~&CTD#90Y<P?joa`-qZl;wj;~MS-9816~$<1hMdwuL32}4#m&_qF& zBB^$;_D;MI^Ak*N+WH>n7pf>!Q$(J=o}EAhr-TbWAB@FU;R0y78aPlhIO+U@pG$JI zL=vr>J88;y$N@X80+OBka#vZkuD0Afok~qB)*&r1&B4DB2bk=Cm8)6zCy3)a??;11 zyaxJ{_O5DTROws#)9J@h5WPIi0dAiMs@(oLZ!B@ZY}$Ql?X6a0^tt;0rD3u#&tErt zN`r=GBJ6j=;vMyDZSLM&`O((5Vgi5WEVd-i#&_30j-zA_POk8ZIXGAU%8$jS!Rz(0 ztp6}EJRZ=Bb9PmC$=}L$$7p1QfM$tuz9Y`Er2Fom_1S@vkKB{jAPM_LfE5tx_8Nz4 zoysldw#T=B{aql`?z`N=lga+&VSBrV<pe1c5d(gDBW^S*tN1ciRm<G4a(YHpAKsI~ zbx|<}aoGaGjDRPh$OPj^7_EL|D@vIk1JTSs6nq#q1@H8rQ7Y21(rEj|CY!s6Ps57x zKj(ap22%{l%DJ|KiI#*JK$SqTeH-laa-Lf`SZ|iar<vJeM77mtZ>Jl>GL4HU&)JfY zGT=JHolhwO6I`4RL6hL)#Hxi#Fjn+?!?00B>)qa{GY;hoOS-{F=%z<73o-817Jz-w z7lM-U)%`54u1{)WVTq!T@=4wrz<GmuCOw8oQezqa4)4#v!3OyQkl3b${}V>{lS=gb zG@1*_vQ<NphN8?t*qRkR4m>V1{H;G8vY$@WUsMac7h1x$bVRg!qaX93CCf{vEWHqe zj>V|H5S?sDl$v=k{RhvQ8L!K8+@Ck(=OC|FCyDBV3zQs>CE*joGih3ZE+)ISQyX_1 zg9y!O&VaZOK5zvTz;)J6TWeO8-|P;7X4A!dU>zFusR<C`_pK~N#;<H$gQ9~zCDp&- z7M)Rn0R@|aqU2zwF~3(|Jw<y+ujOMVC%KCkBC@VvZ>AI(POyh2a~JBY9mwkZ&M;m; zRF#qcV)7(ks#)6E^se2aSa!+faPzp?1VlPy^1shrZ8oq1ZGTnX?_|Dbl_@kHGK=53 zd~jp3C1w~JEwimvm!}S*m~7QG19?8dzus~Ol-Xi*yV^N0s@nMFU#8)05V;Pbx^aE= z9baIM?WV`{Q6n3IO(c~AV8M8BQDxZ&M1)*U2Xv?>6m5Ln<aUX@Rp%_+y1>&eEARL7 z4Z1jcwj(hCX~_A+Od`v+0iHAH_B11fh=!`0zj%)Fa{@d>v`jRmv{NT?aq5&NLiV)~ zeO>>SODXI~j=i`3mXEAhoz!1lV=?%g3X3|al?vjAbj=a4E@li5oEDAxw;VGT(s<`h zxEoy$E}dqv1^?T-(%4$!)weR`;8Fl@EjCf#7A9E%f?ZzFpE;g!xqMS^!dCG5YY>q7 zo%+6G7JyY3qd|Gaip#>-BTm`BQg4Ix8CiocAxe;h$bv<1>CB;L2z;s6x0mGy4NZ%V zj*58q@+*tbf1rm)e?3T}v~rhL^jpB~Wn2lNrg20!0!f4`t*S;Dm5tzxm3D#)-WJ(A z&(k&o3_q#TCad^AM+P!RW_%iF?eaH5NO+d}{86!&XVc7}(^=nDDbal!k$N=LVM0(u zoz<#4qn0&E$jOqsICO=Y6YVD3fyGbaG;^NAj_4c)PXG817KMs5#ORghd;=bHc#V#{ ziYY=wXW~Y}_V0C}E5Rmn5tM+QpXkBlLre)^aYq*mn%k~Qh7p0sB~|fwQG}NXy9_l2 zdqFU_5@o1KATydX#QpY1%ayJ@=Wpc(ukFDVIQdTFLd7HYFOlV(3$<h{RmmR-UM*@7 z30ey3hGJ0`&Un8nE!AyBa4nd1$qEILlPLmjm1r?=JJYOiIT`;Y(hJ*E5&wGDe~}9S za^Jc<n>D!j>~N)0XOWh6+m=$~vwljp&@Ectr0x|_uG+~;M2b`kI&if24`Db-4P0hq z@%^!T^|TgV0(LKRqh>lQacru}j-YhcrIBRmUbcKpE9V3X>zAQY%xjNjBjc87mVHp) zAR4DQp7iMn12OR<$cG8Yd>H~H(Grb-h}fOw=(U3!RO~Wjga$-ZvHZETJ`v*U*g&^r zm~-fDjo<^^Z&s$M`MiD;y+%?gum-Kqb_79V<sAmvBGH9L21-Ap9NO-|mC}@`Hj)G# z9P+Rb?c(7*48AF-+|L!zbCL91OBA3ev@6C8VaialP$t87swkXFWGY$8F6%h~yy7WF z`4Wqc1n-`3-m98&kJ?Yak71Xi5WQA$tM2wMfyT0B@>*-V<*QU8ZPjRgewDh3z?MzL z8W-2R{f6hwkNF0xFbCS;idqdeqHiC$`~q_UkI3L_g2E{?5`K`<+mbSptw=oKxk7NW z^YUp25TTU1qF?b*RAzo+1q;CgbC(-um~;w+8y!)`6Rn11SknEtz2dceD$Pga(h0Mp z0;-{LTMB5%(_#{g_~>-GbFE_%9KjSxGpJ^+1D+umBkJo9?Pm*Dj&C$_i~2eO28EBA z_80YUhgQ%b({1B0PCwR!#AuNbp~TM@)fHBuO?9&h-fVj7-$ReOeLI@~<`>cZ^R`=1 z&c#Q)H&&)F2{d_0z+0sUEUIt#jPC{LUO4$Qh+W1Fq(l#vPFSEJWRRe5(TzS#VQ{@H z_mW81U`cj#%XO;6U(oL{9+?xct;*T@Ev{8pLnRLR>V;#CYCVLMn5W)>ikM*P<rii7 z#GF$Ns=LgW_WL4-W(_6)@he-gPQ-v)RytxoV#TH|>={$uo+FjH!+;lYOe{%N_NJCO zE85;!$nDBj`4f@EkaK3(ZuNbI!0AKNE?UaMA~bC1nqX1gF@-+nxZhO6t60gAM6P^S zwQdOe?8*oUG1w{uUGRk(QJPS(geTD|WauKsx)}%xH@qLZBYFv_hKQa62MM!A-8!@F z+wOk7W|kAGLrGgrKR(<UV;nob8&*VgB2Fia+Malsja>^vOnVB&xU31+l3HyjwS^@! z?vRm}A_~COjVfKV<PMMgzV+d$r(~CPGt@lx9YHN&?#E;j-NXEiyN}d$(GAS&0&_<7 zC4wfM6ee+I>S`>I-GwQ+3b}Ha*f^PyRfR_+qNsIMxP2O%%jdpKN8~L>bMCZilXs?6 z;i;dO`)ZpVugym@;#$wWYOKwML2)p$^e-Nc<V9tY^7h1io2g^8+b7f~dd3d-Ra)lU zk0C%+xV9jeS_YQ9Rohn%EV*Yjm!qxFmAr|lvr4VeR(=&=_3be<&_FcB98w}^!mD?C zaU9E8&cI#UWy!iPB8w(Z`wjJ_ZfJ?UVr?R5Ka=!w`ysE*bp6_K3ijo-a}P!ATwKAF z(&;Gu5?+cWWQ|pj;+leA%<ZJmiOnE2Dp}yrnP7Eb^;iJ*rQYKxAUG>5OoNK9Ew3ns z)M|vq<tsiQJI?q-_|2$i+jZIVHScSW3H-g+jjpB=teYJW^6q_y?hgJcMgP7!5s{eH z`f?l>-(45^4reZu;1K9$mBSn5_cLV<nVTzj0eZ+U%aE2|DjIbF)zK&?)&K(6d{l^# zSc!cd#Ful&*Qm(gi^agBYT1gFGq<C+!85(wWl0XeR==_(psiz)0C$5{Rk|%+C$B3i zJgMVfEGSC%(I32=()vqtVIU%r%Y9MJ9sNw)n0M&;W>lj3sifI_yyO<P<t~K@{a?G% zGiwRyrW0C!M!g@>94*UcN146-P`3&td68r}Zqlx((7u}1yvI&ReZ=DXsdYpf$Y9V$ zN%#tsTXUpx%n47HyQP|hu&CB(58h|(oAYSd%)dahHjYF%KAhz4+*YwUU7SMTc>8Y> zxJXT|xFgO&m+M6~7c=X=+Z`l}q(8~G#$CKcE%|)4LL1MRB0XWKh|Y`Op-1TJQKO-O zU9{ZYxbpc0CCHL@dqZAc{4964n6i6Os?`r%xNtn{c8aUi1!FClWaFC4A}&5eWpkcF zv$iu{+%ieMFS|Dml|rQ5D{l3&7{GaTVy&XMnD++cRCPt0n+N)Gq@zOQeW8SpO`C4k z5frM37HgFQnFm9QUSUos5^$EP7T06kZmWZ)wgRII1QwQwDg!EzZC~dS)@}Kq2L^zD zsin1X8p}nZnNs|XsLkcvA*S>@{Ms{?^Hjb3wsP}rRTU;D^U-9(3=OU27}hZV$|g>) z|9S1bWTtM#tsGvH@#-NGBQ#ISL*K?Z?<37BD*VM5qGp!%yE`^+C#}zloj5Zlzpj1@ zvDTGZ3$>LnGJP@Mm3|o}lE_+oB#Hy(NZO4WoL2U*ZfEl5HEOnH+gZ2qI%=ok`y=Fe zm6?ynEp3*3Z|CTb6?)j8DwBgkP`Aeuzvq%lDYPxD5Z`C6pYRXobAK~eCX}-=ANewL zfre-B=<Ovu_V*oWPm9V1)}K&x{qQ1WlLvljF{t$Kp-=~N;-4?bS;mqkN|cNMn#<R^ zY;s}i>YCYt`HGTt6NG-CE%tLoe^UGXb=0D5tot`)3cq3dlk6Isp!dnN<Xem~L`SrV zx+K~Q%(fN@_3>hD?)dRoy;1J6P7T)@lO$1uU}W@)iT1Ju8g9EOB$+WngjFR>b(EUY zcU6mkg$RL}t`9|8cS=%P2O}AP2S0T3`I*1-uo|f{>5XR<3bn>Aq(t5RJ_kbHU(gQf z*)en{rMQ<2pLNa@a=Re9*djTf7nZ#7OxU9v4BKAA5*38(f4`QTgA2`zHU@wGN5ZJE zWy65s*MT1XsJ`kwC^&=<g7YH@VnG0Y?fGxZ%7eRI15LKnfDsFksVgGjfWyeEN{^>I zy)a4y{tRU{E0i>wSFCnq5QY=3R=z&bDe3ShIlsXd4tOsZQbvk)84uWW%x2J{$X_vR zZCc_*MbyR*dPO)2nQYE(qc@mCX!RXCKNOj1bz8_<JtoohX&It#tD+(oj@Yc68|o|V z(bGje6rd-ntM(i_UrGf2wHS_?oslGFq(+)I4JAD2EG)Tuw)@1SG9T_`Y*-^eG1mS9 zr&HJ~VU2=rA}0CcdGT%r5gk4i6uWuuRB&rCfuNVS8QO6TdRj~Vh3IJA9rMkm5KRc1 z=)16x8y74MJ8%v~2{Dk07r+v=3CV6~j*bf!ASnmN>Kmx`b73AJUWc<EVzhGS`*pv? z(yqEBenZ&zcl=OLu#Yhy?9$Avh?k=8Z9#`R36YL0?*;cSPtwW<!AAYf7;&`EF9saO zD)|gTt8ecOKcB}0E^%!&34??fjy}{|OLrc8m>_n$aCJXG-h>PWF;AxSgpZ`sZhV;q zxSPhJgvyNMY4pNCvMJA=Q6;OKjz%v&K8SBXQM4aXf@K}LTiFTnLnGXjGc^0eZIkS` zB;R^D-YQ%u2Uy{r3uY;sLEV_Xu04+pb|y!}Wp=7qNM8<&|3Y5~vb=mGGRpj~o7&K= zv-lo#9o8DdRUd*S>%1zvc*)ZHzR)@~ww|&DLyC|}wG}$x$3MEL?>qFe?woTai#{~! z%TAN?%Y~jV@+Uh9wTWoAR51)SoXIZ~gnF{SJFY2qaR=ldMt(T`8=`9ahSs1%i$_(w z8Fl^;{9Q-5#&Ft9e2DJU8B164+3sHDXxZGS=)FdJ<csZKVzuL6g3|eB(rjtME?nBX z-%H5?aqLG7z+)};W{_<1E{WWo>fshIr`uwh0@fV6uRd58ojZE|E$na02JfH!PBm=H z=c)*cgwckCQwC-RPvw*y1Hw`5yu}=Dx2&)$SV;c)CmQTn;X@0jFqFHBG77v%)NR<+ zNd+}3ZrXINRx1rmJ>6#0y?qd!n?b{eshlRsrU*E^z`)c>1ceo20;V84yGfO4e`#Ma z@k@GBwjiK)(Bt%eCXu8zOx0yO8?+q?oQm!QQG{5>^%xr|j+jZ$`F9r+c~cwjA8MDw zR8=x`ef+y!$s3!-!N-73UU)ryNhI+`XSeTwSVJEw!h`&+#3D6A>R%Zc%r4F*%906f zyym+DfQCTiP_X9Br4QY)zmY)`2F$r7wsmDmhaw}1nDMg)-yCMk1a(IzN)M0?t#&%% zo03K7ENd~gsGT-y{KUThvnvQM{BCPuy%Wug8QJ~w`-{>+!ifIF0Shs&7Ro=Zx#!tk z&h;~!KN=sa2g`s>^j-eZ6>I822`>x#UIg<IK**8q<eq2K#A7YPy@?mA&DNv5SL-LD zB$&p?$X|#F2AO=(l{2ZIeFXzi*=Y<OHyGtecbqWck9MNZEA-P=L<rw>UhTUQ^lGW- zms<1Xv*_6h3L+!!U7@s;ZEr`dn<c9FjJhE+c24re87!ps8uVnrgfI>?vot|Fmjf~g zfKjUHn*w09>qDpVZYiKtp9w^y3VOOIW<}q<Zz+>+lssLn0|)9}0j6eC1d$$Z|169O zx2S)1zGRf@Vls12HIp}TBI`wH-h}BGd1uGuq$A|7aoR5c;29uw?UadFKg@lXD6sw; zG)aeo?Y?8&q-YGvUV|VL_lEPn66a{Z$Q)b-cb7K4uapd?0#$|8rG*GmLQNfcO5Tn7 z*Ue7O7Co*D;cs6I$WZ+hZ8tyhZ-^c#XwGnA3D3pHq8KaO<l~nS`{B};ZIY0;%Ec2s z<C1+w2wLhkKX69nSk$T>udQ>hYI$V>USxyX66<8lkYkSO2l)G?WAt8cd5shRzRb9e zNLhjd*Hb@z2l(8S$0l&;nM$*A|1th-rkCi!x6E~wB29}`^xM{beG07XRC?_8CjUe; zYuYxKYt-{AH)-3Cfan4Tp=)HhjK68j;6i@g5058;LoUVMzq15kH<vw`PQHT*bK+X< z-rT4Aa3d)vaSwB&35ZIS*~eUgYg&q&$n<V=ka)bLQ@3wY&fZ;yd>7muU$HvY0GgP? zm)oD}`4MoJN%R(4q^;<<6*<4Id?tuem@)*L{s4wv&EJ+wRMG!x^iu_R+h^OqxYwpr zEm2m86mZi@NFTRZsOq38E_Jt6*E#Y&msv=JrzIt%z1muoiF=8Jxg|XT>Otv-VQdZ` zeh*MbwNP$6zc0CQ!?!T%xeTZ^mH4vNdf!{-l#|2CmT$8pO~zGP^94wnmJ`EJ1Wh%$ zP;2Eidkumc4~%jt-%w5zZ%}p%tz9sslH>KOw4uYnd2mo(;|~oX*z)h=+7)U06W42I zun-&bvpA_tz1-4u$cT!8VdXa^1Hi|Yi6os+!7ek+Fy3bXU0}YV(35)9mBm=0>&U#i zZ7$rKI?Nkc8akk1ag9&p$<Y4At^}>((ZIg7;b(QCM<||Vzg5!=Z1BP&HOPaDn@=&{ zT$ezfLr8-_0i7P2yqDg5c)HAoY>0Tv#*f-_fzZzUD`vPjEU^^e*}zfanqDF|wQKu> z0-f4&*=B*9xuTEoT~*DBw#>E7FAU$KImyN}i~i4SxuIz-Cu@>6JQR9m#gf;h;vz90 z`<5Q&z|1=D*!K~q$49Y*#u+Ckx9g!RHqH3o$@x3U>!Tz*QcI<GyE-vjCl)8(9S6%{ z{^hKCGa)2eg`P72Nr>U@6L{BGXNlP(1gEqNrFoOcfsmfC#TkK=5lN@JV^YKB)Dt+W zNkxW*ze3B<?Asu3<<5~(mkt-=O`Tkca;+C+$OtFp1d8t+3(l<A4$|9S`6}9?a*ty1 zy+V_&dX(g%P9YPIH*U)Q-168m!>t-f0C5`)20;JEj7$uGNy4wD;mkDdb#Y$WlgHi4 z;*m={LpFKH2r15L4VbOpX)v(%F-_74rdf<HD<Ch6egA61G+8_&eu=X^KzMI*urmbQ z>y#xw4g2YR4DX5`aPh2Y`0UTxQ*y2-+b{5q=0_}GR?HL8%$@g#z8Qy$*U`Pq@D3TB zYEQLIBi#XQIS}vKGK9f|C8}tZ)J%yO<iVGXH|oB~C5tfJ#J1@0W3!kea+>&t#s(n6 zX_jsW{L3pf@IO_lvo<gZ1l+{-XHAoJ+EA?*6jClJE6o%7fxiQM4MKhJ*hAQ`P{57y zzXweCNz-K_!gv#pl<f(@$d$b|sm&{)3kH15G;0Etu4iNFawA%pN(9{V1htM<rwi(W zKYw?&;|{aWdQ`uqU(L`xiz15@FW}5%YlaV348`L~wcKZ&=kC`uG<oM?cuR8{GZ<U{ zkr1^r$gho~mm0>S)SG<Su@lZztm6{9RarLrf{PTa-@>2kT=08=-HvBoQoF2=ZkT|P zBgYk(+=S_j@d>0#v?(N2Ouyy|U1bQw*huDu?eV)T2L~OUtEI2H4DEP2{H~WSyz07i z$>epM%CSrJdFOBQ<LLvz244K?zRD*tuRnDU1f5T#HsXcOYgSvxE&STpaV;0iR4v7{ zT68Z^`nANS@F2hG4(%;<WDLBkZ5k*_cp(7|Gj1S=WrbPaJ6E=hUfQo<0V^L3_g#F) zydO)q#efkc?D!6HJl)e#HynA+W*L-j9u`UtDR{|uSC*4+ct||ZjhW~LuE#h+1+#&Z zV!gyoM0QG)%*1VSQ1KPDbed!On9{#4Xh+1{4-f`eF>$J}OhY{ARTl?R%^;)#Ekgi) z=M|a>8*1%5#|uyAaoZcmzL<wcl<>x}77b=dM@Kd;9qbXOl*TTE50t}kc~q#^;_t+5 z$XK%vL>b*El#_aAodK@HxWBk>?7beU^|JK}&#&74#ImJ|E}2fuN_sc{MxwLNMGrtB zOg0+Wy~h}n*0a40nbO@gqsb_`Tki&f3dV+?yBHMgGk@KPzQZ&Dh=PzG;F3bNVaWJ? zjr#1z78mItdP*W(9m>s(y5#KgzpDNuX$$Hw73V@XuMo`(0UX{95PE!SU)$uVipn<= zjabqME-otWbiaZ%cXYf#G)GlIK)Gv8=9n)DL!S>5XCzRiLzPyqN_n)m@mB)PWvEc+ z@ZXi;0^@&w`}#H~R>bG>E#Vw3&21hfGvkOg3}<PTeaXM8kkgDFA;@#3>nY1xuS^H+ zA{TR1-EyFl<`OxRku!6lWueuQQ819XR}jJ$wSN}H9T79xN7mGCRv@`4JE8nEgqXpr z`f~8jJp@hQlxtc0*(Lm_f+q!F>89FpYo6xZZZ=PqGZ})0mkCk7OPHBg&XAf$Xb-Aq zTUVYCEwIm!<ZEQ?4w(rNhSV{KvmKsAhQ*zqDOV*z`>qT7l|etXo)b6$+s4<|tn?Z* z)JL#-^ql~niw=?nj3ZY0I1o-$no<aL0%3nx5!D+?&>QTLgF&CE8w~)}0+uZX#X<Cj z{xd|J3aokFrI}^&TIdey+pt~~#ji_a@wbmBdpn&!+<jxT7bTX$5#(YBe^MdN*Xarg zSWEH2`Y}j0?&gyEgIw#R8O~ipUCW8_T?v{cm%O`i#3?&=T6JY*FK~3_Pdg8eNCn!A z{I5Ih_)3@0lPk+fei{LVyoV@M$+9z;F6Zs$%}+vvRV)c(YK`dHuSs;PbTpGcwbRuW zaRzs#)N<FZ7<?8TT#+xFM0}d-%ciCnlccfeHD_`!;9v13^^|b+Fd_Phhc5;#<xj-* z3#~Gm+z<5fZ!C?n;)^exnbvFu#TAka2y=T&I1OgjGI8J=9T9=|bFwS@Zb6pkhFcgE z*r=HunM}?==bqdfp)a`i52gvg{o#`BaZ!kl>4yM#{4x#Av`jY?c=y)LlQ%JfgEY~6 zxgNMh=Se(S4_z<z`~q!SHEN56Uh)nE6LKM<a@*HZv)%9u^Vy9tMW2MrGy2+n9orFG zgb7B5s(S_Qib0?!7FRdDacWu4!Z=$NvdG^Z>%*oE=9Tfeq!rmsX7DVB6k?UBBYJj` zR3<jCN1L)?$zNqpvM=%?*BoU}t80!GcbtM2TK`;d@{#9A(|wChLEq-N<B>4CiLU3B zx4<NXtdbtPQZRkId5uAMX!=26o8BGjM=XV|lSTQ8c{ecSccIuVvnWIXKVzmk>Y1~q zWbeiNhn6KpIk`e@He9D%%#x~tZ6x;#(uXQWBsvb+w0xcAIpQ})nEn)ImfPNvo*g_c z>#D%V`^SGc(VBYO$WHl88=S;}#|^?}EUC^vUmRZn*}uwP)BikSKYPCAlNAHN>+E*P zl5v-7<Sp=FGln(QN>G4pkNybxXq0scS(UusPZoNlF&%8L9;-E7dXA^YIYHwG^U&2| zvVF0;pCN325I1Rq%xoj8OtbZGTW{_nFK@2xW-4N?Q6kyP(zt2ca-QP4S{R`~OFBRM zxFAuUmL*#mT^93?pQ}JR+!M>!^}7?C`ACVyGz#Dw#a6wilHdukr35cWakLT=iml)l z9u6+E{Pn%T+|!J`QVxC#e$;c-<Jpg#Iekm@1g5O$L)jQH<-6VC8APaR5~Q&DkY7W4 zJcHC!;s_&m2Vr0_WIDu%G4f0kJ*TO=@%l(8QH-wG1f70`r*JVF&g7IKl`Wl-Kgik& zueE_Uqibei@RuqygRRO9R}bTr1-<2zr{bsy;_NJ^A{&$iK6}en_jS;1BdVTm%BeWd zx`hCjV>3BSGE7z?VXxM@IUMy1-;B{xonvaPw#cnt&tlKKPXw-e^zv!Yg&hUF56N#o zm?89$UI;>&{SBeKme2=lq_M_i=p5&r{doZIm}ko4Wbhrd1owz3c5uq?9l+gGe-sq- z_qavQE-5CF*%<n4nWE|Ipd&4e2q}^XBfy8>Gp7Z|<?A|Ky@zJ}ElFCmuuhuG$`Z3- zFv(VP_{SPjabBjAc@M{XjCuvCQjHo5F>LYOOr!Y~@XWF)$dZjmi=83?<$cuQp$7aQ zcBHAShaMipIAB>ci850fdR9ts(~U$5d6Iex8h(@ulm2DR0gGyijVIbe0!9F<@8M1a zE(&#lgi<^z8sJeb>GI+%6|4~q{2E~LI)Oa+H){XUJOdcyo&=pJ=6vK!y%om%<imi^ z_Bn3X&NiL0_VyC=N=8Z|UZO$rwgrri#Xx>&dxuL7kfZ)y^a<C$)^RDg(ft#Br(^;+ ziqcH|jCT6vQF&72hVsAMDzYDvJzK~+KFEre8aVtr*`UNRb@I#-$7IBX=-t7occNZ3 z8^g`wvG=RPtH93eIk2m*z?%HRK*G<pZRC<6%uE0teVgj()6unM_7$Ffq8os}Ks)Ej z97)dy^Ia3%cqe%Be$t(W;HeB_4+2&0p+aGX(w5C72s^I@G|2YBRqCo)>5I-UblA<Q zfkf@~$Z(KbGxH`!Oa91Fl>Ks$9TRH3pbCH3_(7P`W?44YcO{s~TXg$Cg7C}bfk3%@ z!o9~ndo8nL@~cnG&l@R=gaP1Vz`%@l7NX1Ek?Z7QBGe*cIlH%-#b^#}jHm5zO#Ieo z&^T6;%*5wZRtFYM_^1hh+=~2(!dFnN-G7JQ=t39(J8-_sfn*0}3%cGQUO6<9G$kD^ z@SMK4?A88)&toWlD~MON|7Y<;;qI;$;V=#-(jdXU2Yjl%mSPZZ9|K^1?C0Iu+q2`M zav$%d;l^TiUIPNuYLi66V8r}?aw4O9LV{7#7?iIV8{6KHmbA(?>FOBRaUjZ-EeDTX zpCa{~HvM&u^LDfH$@L^mu`UR`rsWitAV;9M{*Jei#C$RoYu@U^#GVxC%7pzOQ=!Y% zn>3Zobl4(!rvT@3X9zGovtdHBDoS2rx@mKTlPy~H{fMEi1(zpnHfmuq<2qK+8I`ZA zo5NwO&l_L(Bait-wp+_eoGN7}yIm_|y0%m~uQDv_SGY){ou?A*W^5+<H#WE0#Aw}9 z?szBBWDAzLJ4Q~=@B=^9<Lh_7?wpbv9g0l(5<NKYkkNcxT7Te&(h_l12!pRMs%v<V z4hLQ#Daxuq3;~U%q!T;5>&yLAl1xC<thtBEpPBv>71xPNWA4A<54OjLPjyS9H088R zA#SXY4a0#F-4`hLQ=|bszdkyh62xicYqB5*l9(3wTscg0UJ|fxOU#VSeWIDQH3Kh= z@UjqEc&<-Jd_Mp=<%ks#$K_<t!BzCY5}G92N~FoCwFn$X3C#R}{9^Lqo#ZnXCz?Yy znczWvwdfSuv)wW3hPCu9;vl`jmG4<z#hEBDe0BZkLH}yy41&<OitNDCbr#9URdwOp zFqFqOs+X~_K3_x9tGoNH;o_l?A0O8vSazqC<`-e54D`VMxcu0_^{MHXhN&4VOe9Rq zUg5F+-UF%DeLQ=7%blL?@OXhVzFar0$ogbY=fWj!F?xU07|Edkc9VD_VNg%EEA9_k z6nHL6>O0DO>O<Mplx5r6*F|%np2-p&JaNXhsXFt1Dy{uTB;|mPU^e$E?3$;V`>H9C z#|Es|&^FMWL~{;T?A&-Bes)l*Z1l~?oJ!yMEmc`v+veBvyP6)Fmki%TD`BmyBV(0o z4D}9DMi-0_dVw}v(}c7zrkMr2&^#KMrJEqzqLKu`?`YnN#8n>D=yLAWP4&TLeU<29 z&oU9qQOKw59k)LUt;~FxIzi=eX;WKPc)Z%UNR7ZL(pX2T;T6Vi>V(Rh4S|4~;C?*c z-@q0Y;|nB$x3|Xa;r-5E`KbmD{c!>sP^c=~Yuzc+OMXFK5-4QmSMhYeQlu}usD66) zteb_M^<mrTeTnX5B8258;-~KVFjpa#f`EPAPT1z0DfWY`p>mbVg_Av6Xi20le->%c zRyG74Q{#d#G>975Ob`X=6qy1TmKoP4`zPZlYum9+B|sg}l(kuXws~f$QRXDNBXR|& z&GZ%8_123Sq5{zO#`$%!Gj4kQ!ACPBrJIjGzI^zd?$VZ5_Xtjlt-CE@n#C*;3$SU$ z{8{=Q*^|YoK`dLi_0~GK*}1tBck=gKe(?ps);UtV<`LnjL#|498EqPoeN2<Fx@N>7 zz;>%3_Iy3uclP@>*~VwFf+nJnE&EG!$nkFR?oMeij$n}>>R}_}1q-!X!R@-HCIy*( zgU0Z-%Cho+%T{`J>UvJ}@TbHT+^wOtamBe4H=<0Tuw`UH4*-lj5}p1f*eB~Pa;p0L z{}?x=qV@$0oZ|QGG7C<WKi?tWzd!`E$@(RtBJWBkD;ueXsZ2!m_?^Y{kbDBCKF^`Q ztu*Iu-Ys~-BL8M)cf`nO?G<ub#8L~<N3xC>jm}Q^&K@Z*J7;d9g0J{+@tk<-2E*E} z^knb|?Vh6rG`Tg-9g5mdAAbq<qCfox(so*-+R$ScsLsU~GuOWlkTHeyE?d3d*p5Mc zNyjUwQiFjWCvp<Bdzc#6R=afMPRr20kurrwEA?U`7+g2{`ZFr=9f#y&qt2%l^T5fi zp>G7c4laH>A&gpQ4eb>C`Ktz*wQl7;R-tZmUdLsr0hzN^5!b$};P&d-GmYtYK-Q!Q zZr_zTN#E2^ml!a+32naq@HU}4%bQG{?p&%$g7ADX=ikhE`M3W2A6?<s?&!)|=lz5g z^O&u;F8hLvg91smzX(?mYSSTR=?f5HyFkX%-jX*NSsg(M-)xif-g@_%dL6RFfOfNh z#LMh+XBj)cKej(vZKEJY7aKbtuvY!*s2xl5z_sHgxYilUF@um3c7Xa7!<)7tQ$f5n z3AoT!lW>q==eDe_sYsozdVF6u*CfiSoJdq^tX=V}G&4A!ou`<{U6>dODJJwx(Sxr) zN;9$3Yhh<V@Tc=+N#N+N9~M|nDW~eY(O=L%8;i0&UUs}VPN<ituk5J+#E2`SIJ7WA z#{Q}F20F=Je?SCsHP?UcYx!?akRB);1o7!XAaD>NhympG*(yRv`5y%Y!v5bw6_g03 z4;BPg4mJx;4Xy?bfTx1@fUiK{L6}0cLo!0zLe4;GKqWz4K^sCBKySl9!`Q=|!sf%F z!3Dwt5b)&)%7}1?K}e8Dv&i-+F{lP;U(qQsP%%C*{juP&0Bj)~KAdS>A3ROGK)h<a zetbfF9sC&lH3BRGKY}enYC=oGaw1eBaiR`lFk&|1FydYkVv;D51yV9n7t&`k4YC5V zXR>E<5^`DcSn??f2nt1tL`qyrr~fGs3;=-!&8_zIQ26da2oT5rRkp@ly72$}$MFX; z<TCidXE5yN82pd9uNpoL==XylBRhq5ablxQXhDC3kUchhg$Y0S**=!W8*SDaZL)La zT+9EQf@e~!aSorY&jk)VvQhuMPT<{Ubj@Auj-4)K-5Ko&1u$1=S#^vtuzJouKMU0D zvEE?^MYfB#6lwy*A^$9&d{vjZ-UeUBlSPw)8QwNpz7;f{5r}k0ThRfZW+yZk*{a2p zUBP__#?ZJWXnPv?_0=Qgh5Yfy_+d>-+Q;nBs67aV$)6&-H%?8z08=NZE0LMsN|Cls z=OWMl=8syjBd`Tpm$WQ}NcsX(;CLU^pQ(bT<stm4tZylTvT%y?MJ#Bw-|o3^YJnD< z7DccGJB}{`_TP+Kt<geqXCH(wP9WTm!~oH6(3}g*PT{fSF0NjX^gJ^$)$fM#A|Urw zBYk6ieb49Y7_#t#=MS6@y_$7Uc#gk2s0R=B+kfX1+~in*p^S0(4@TU)-&w3)O8WZ8 zF-Fj*?}N@!eqgj?upsGp^v~@@?yH1hVtC*}s6hasd~;iHcd6f;FPjCeFs=^uuu&J0 z2Rx)7YOE9PHQ^y_qGSuDd<YtbX~nYR?)n$)esuI{!|ik^0^}+>&F<ZJS(1+XS!I+B z=YO(iA3<Y?!Qc~vU?8`7;x-VdzE~a|8VC}Cg_KSI*fP<YaKHUX_<)wplk}2<B>|CX zA(#DkF^2m3+s3qp`lkBEJCJoaU@U<X!=zCA!ppLVgowXLtw~RM?IA}^4HOObed{#w z3UFO=tT`wheiku^bJC{A^aOf9<b11Jo*;!bteJYjY)MK@O>Jp9H9H(=x+<mv*uJC@ zne8uYN?2KzltM1W!+#k~QEp;A&5g1A{VgBtJ4Iq2b8)o8+4-b?^6&W*?t8Ws7Czc5 zdXu|BlBD9)iyo=eQ}~L+I@(39E*JqAy)*Ijl0p?>dQj!AVo;M*HCsL#Bdr;7fa{j# zsZo%hMAVf%Q<BltR(ke#VA}E(2%&rUAeC@tuO40`^(ffS*DD%2zW^FSr#=qeW^2if zeoS#OXS^KrFsyWB$Qw8_6f1H+UH)~+Ku+3qzMR9sOB~{nC@+|dm@~`aqg8?@{_+_4 zC39ZI%q;qN{$w3&yfX5ac;3q$1*`vyh{s0|_(_+?2^vzkr$c>8r#xK{pc3XGZP7WN zbr8=wgp~<9ZjH^j8M*+8Qp;2F*Y(`{nlxz9X!iTMm-0&&w-bW+blLuYx5N+>@G*fX zj<_tuhsp-73Z@lq)*qS&0{PZ&l6*drYaB1lV+-+nL3U|UlG0)O!$~xHej;MwNwlg( zIziH^WeX*$#Xke68CRYDoK2U?G!b_^-w}K@AFe^mAB;@@YBBl;ul{gcyT*7W&4qx& zW~I?+Da#uMnTXqUcRtk#he@}^b#F2AMPof=N`pK(ve58EgE~1%EcLNzC^z>YcWX%^ fB)E@aXXaYNosSPI>m9n*n)2gwX#xBA0HORJ6E+Y* delta 21207 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Bold.woff2 index dc3bd4c040abd23afb59d2fe385f80e23b0cff41..b7a83593a8d3170d69921e7d3d63e0289926bae6 100644 GIT binary patch literal 13912 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 literal 20360 zcmV)0K+eB+Pew8T0RR9108fYj4gdfE0E@5y08cIe0RR9100000000000000000000 z00006U;u*}2s#Ou7ZC^wf#Pt1xIzIo0we>22n&Hm00bZfjbsOcJ`8~h8^UxIY+QwR zJ3vrW_WOvUWT|?9|34>{LrgkPS_U^rknGH$WGFi&87YjndU*~@$h9#G9VR=}8G?A> zK%6XAyissmZT|1mt>!l!i~%{id|BLC&qw=3Um#Y}rYTnJX~=ZTwA-BU)5+jNMz#Gb zBP5v}BHe0dcGJqHR7w&c5C|m+30+bu^w7JY(geYV2#Q!yu#}GV)Vq6IfAu`EoL;l^ zyYq_m4*&Vw{QtF25-eDub{k5uQZY;_2bbKE)`6#@gNgVz8QPJXwKIrl3<$OmwWE7E zEvjC5zSxi7*}Lxxp-^dNl_C8hi6y)-M23<HRXm%fEH)i)FgxEnwMKg^ZSQL!$pXoi z+bnUq%xZlMpZq!Vt9kb~U^_szOo2@=ab?R;;J9^KOPT}!|8<J@KKhazJ5gfCE)iPQ zaSG(74!eLlic{u|hly~;VQ&5l1ZcKQ&zIU(vtP!9StlL^wJM$v7^2q1HR2u`<!W4| z9o^VJNZ<plixlnFnpOX^aFK^w0(6}m00e-=Z2wwOdO|as{bF3iz9?r=fhasH>J&9y zHC!A%=-#~5zxvCib+Ld3W9bC<bVj$NcCKIn%W?kio!Z}f_HX8w3`rcYEXfKqeRXPc zfdZ`qBhB`tu>1hX{%w9OJ6^!lp(RL)%OF_~!5a}Gs_VD^Gu3QoK=BxyqzpMy1r)lA zy^c;*;ij4W8?-Y6kc(N;#?C4%7QB1Fl6;R?kdm<A1%|UhNf%S^7(3kJ5*NC()H#5T zp$gq~j#YfU%fdzJ(tYc;bLqDA>ka>W`?Y%C`?EGJ?E)#$+Mo3SPbBe*cav5*oGu;` zku8zXBNgAt-e_$SJDukHGJu0K8LHKp?an7Q2%&Kj{BXZdiNN|LUy}e{_xA#sR}VhZ z6hzeP$!^#M{Km%XHw)6Pl%|l;xA%Qe*+k0EV?WA(EPO=~fM00?B7-h)<Q{8wA;=)7 z>n_aWjs#n_W8xDdPP_ueI;}q(^Xtm5n|_<op~jWl51AAxs~`PZzpnrGpZ<=1^OGMv z^3V_NJN$WYLe8>k9|O2K16GkjBOv3#Lx3)X_Y>D((Ev!}Tc!Q4BgBIzuPrjU!pGN7 z=^vm93{nS&gobIfx^TTAA`*!@h#)bC;>N@qbNNECRIXHO^+vPR?sR+o!4S)2*7ERW zpCLw@H9}qid^kV9x9-j_Lc@o^N4fp`>c`ip^NiRAq53uePyfMs_msN(PoA+g*B{~x zS@mR|{u^MxWUM12LTE%mn*oGEbe2SV-e;DKn1KKOpqM`m>n5umw{JdsQ89T0c3*iR z4+cy<noB(dl!E0n;d)wMLok^T3zbIyUVs_$n<+#l8neu^otYkG5-4HCpgcp0r=&#Q zocbLt1)>E-PZRbez4FUTj=I&^hy>ERrAQSHV^X9~hpid|a8JRIw@l$CwQoSkp8ucc zqlBt+iutvVuS|Lqyat5B-};l8j_IwFwOk_g+8@BggLI~TdJ00SiR^Pm^lO(W-L}*d zjMmE<{}VBWDPPHBSnSvwpUc2O-$tQzdm?aTT&aM(iIPL1HIJgl%zXBLU?MF6MWQ4= zvnH1jVbf9hrkP8TNfa6A#8~r$%+RUMgWM_?UW`iElXaejg_R0Uk!4FOw*`>U6B0@g zBo}B|gZtRxS=xAUyI9V{KM|Ac|L7f4M7}buAf%n_eEQB8@w*8dZ99MThdGm-dF`LR zeJL8*1J0uzEU@XlY4aka4@X;sP6f<eF~4HVd8C<wg5RtN(4v@j^P6bexrw&!dXJ|~ z8CYrC@4Exd>S-Be<rH<DM~Pn+U`ZR2h{J)*-rjd|u7DNqJZ;ILrR+7+lt}LmaU>tV z?Spw@Mc(DB;;2zRvTtq#%UKpU_bumG=*qkq3l><k$PG&@S%+dhE*n_3arXvMkzT0S z<hR)3??Jmc$8PYc6}ja}2fSwZEa10Dz!Iz05wxB)8(6n-ust~Cot=G=_IK25<XR=k zh4Qw|&F>O1h&{MP_p(Qzhc?zV9V(QaztobEaLt8O^fb-5cPo-jTYoEblE=f+SznP# zgt*T$jbiVIMMIJl46MD)$NVqc{OL63dRQXn?ODc%Q}jHSh=Tk9S;kqdomwV}TcoPe za(<G9VSW=8OTus6)yMhGUUiV*M+O>6Ve=tjFkRlWOp%zU=teEpnMUnT^KJr8a|&`? zdI}XCpJH+)C3xlYiTt(y$qtKC^ONPpI5-@fH3->XqoiGw3(B2X#3BvwJ21tGQc#+R zk|-v#Sj3@K>y?s1HWRaU>Ch+*>d4$xTe{zfQ(h6z6d#bkBYCo`7L*iouedWZ>`_Cy z+qGwg2W5saPiR`oawzHPVQC;+rXjhy*$rqAG{*L~sh!ZJ+Ki#EaH?Xm#tQ>KhS-Zb z&un-cfi-2VX~nvBSTbdH@C6b#-dPOMt9H{+r*+7PRgx=pZ+v!PsLHOn`=z0y8@;*! zud#NykDWVUDhQkTs+W%J$%4V$Urv>)qo|6z@X3Oe;cS?pr#OWa4oP~&gJSsH)y^FM zA$kjhE&#@S_^BQm(fPClK3Pd1h72<0Y0)!jTcz8$lAm)>F~AqirP^@p_O4W`wSxjm z6d7M;9Y>QcYCId}TSbK~`#)qQng=FH07_WbIv9Y418SS-M1s1u+$*Qn{j@NM1PyIj zU3BG}Y2i2$G_qxFQSFnoa2g3Zv*q(eoiEbDWhCgzmai8%kJG{=5;V2#+;YH-sPnBW z7AQLAENT=_?II#rWTb8`rUqj}4D}&qs^K6b<K|*N86RSq5MpTzu{71<Xby3-gg9D5 z+_8!3gA@!VPy_RQoLsdZ^-Y@;R~`ut06;U!<|dY_pGBUT19;vA6kCy-3AGT(1298K zlMCoNyDzpZU`twavTScle{Ju0I{jYR9-V&e-p5&`?*wOQ`5Pd{FfNVFE@E-n3ZH1P zoI+tp_#ryGKOUpyNrMI4ATFJb`!E<9diO+*M|n-#Y^P>WX$Ww3;Pp3`H%|-gUm>n+ znKo9_rI+_EE#-;XA<|f3s4Ylniud8<Gea4wY^i!thNm={?=Q&Bjc`TtN`+(dqq$z* zX{q)&e%6`>?B;(!BhWC<H%>d>uz${WspAqb5d;iC$o_PJ-KO4e+#tGjnRAdRXrImy zscCf?HJ5NG9|m|on*BN-^oigCN<ilhsLfat=KCPFG@cN7ibW?b5%s+aQfuov{vq`# zHHd93G|s$uJY70pKqI8uIu)=01L7gIuG6@754%Nl15B5BT~6?XhSc-ktC@Epp-5tl zSg8Xg|FG{<(l9UkHsO%SN>l>evfVTQB@$Q8wfdu(XEAM}%Zz6I>ptz&O@T_v=M=OE zIdn$aAYOKCr}*PJqC4`?#LCl>pr)O(*r??I5pb?O&Jj$Q;F32BIl)w406J(}tJnwX z&mM;y6Kuw}?{eJ$gB@U%_Z<61k=J!D?QLOyqXld6i0DD7UrK63s4uZ-ojmq0=pIdx z-Cn!dxN+sy*Z)sD?(^I~-2kUw_joR?q+mQz(V?nHQ5L9gY4r3g4$@Ho!a|q&qtqfI zHu|ePqJ|}jpA(l{(g-AMcU!E9LrN`mCuK0OXEW+lhxF>}>`fviT37@oMr-O&L2g+D zef^$L|C?4$AAX$KK|f<#Um3?}9wFHl5!=tJwuoEFO5*8s8I&7AI)H{=Squj$Hc(X} zuZKv2)cfnVi@Z5=gEZFfi`@4)pm)-Tq39YsW^6!1D6zq=5s3#DG2Cqxjj|XK6V{R1 zf;g6rbg-a$;u{W!IdHFU1F^;^;AnYBy>z}+ESS1+Ngp(huGdFM|J(c>2x4A~Rffw- zUs`OKg7lphsKa7EAnG4HgQSU6dFRfJ{&Dp)0`PRHOZ!e~WR*qo7=Y(gqGoJC)D-wF zv#N#dt8a_2Xm8855(UvsqZtCWR!)ePhse~fCRnwF3hQfAH)xZF$hbzOc^1V}izv=q z;I@`n>CffM?0NMbRr@{-l${_g$3(|3YTd!%+5N6`m*`Z7qZQ<M+l<v0cTW(2rRF~M zb#{a0-i%uHY40Z3Bk$TDo6p7eggmp=4b~Y!Nka-LX<E<o4t=r*7O;3xv>3)0jZ{{Z zFgYb&u=!)L&c4rzV$x`Dzk*$M*G@K~`4__-q-3arD?zzrja8#olt4YMAW2=CIBj_m z`4VdEn{eLduXz`q2@~S<X{LNUEcS@f`wA;rG>$RsxKoPgW5CPyO;74l?kk8DLB^+` zGC53Cyj(R#?Ebu2qGk$_DxjLtJ&TOCSQJIL6qoAPC6OF8ERaCxBQT!YqrU!ghsVn! z>$apeHSMISl%bP`em6@fAMO)nu6UfJR4&GZ=<Curv7@DqkYklkO$wyo%E|yz!&@pM z>LH%Y#=A(B$Ld2JIf_Jv6KGpXqkJCW`-4N-4v`g&3tqmTd3MpyAy^uKeT7mt&DE$S zms+;Jy$>FFp#fy2aWSqtaf&6Bw}MDUlm<T1#11Ykk(5wkFU>pmOfEqaVoD!L?iuZI zDJkf$Cmq35`s$e~dCsa^zh-?Rb)-Nbu*FiFkt%@^)uwHccIR}W<7KBpBCBdajEyD^ zFSXS$T5ZM2#oA<^Ak>cujme2YTp^KCKFY(~Wfy}^nr~miXmv%P2^cF*r&`%-la{(Z zDUp}TE%h}R%XXQ+k=eIfeV-(u-h7s{qQwLQ)LoCG&ptzY1tdOZwqJwav&Sac865F2 ziJcvXSHZwER?Uv&gVUP&Y9y-;C*bBhzcxa|igzKQqY9b2s8uG@iK_&_;_%8ea1Y$; z1}iVOULu^MWC3?(@|Uaz@ZoYvos$O@$%67pyhHRpxEaRbkDs|#`bf%91ERF}xmfGA z_o*Fl2L+U#y^fvL*iw*hw8*l1NomUaeLJo<bx~gBWHPTgl0HZ98VH||vG#B_Sy8gV zmd-?Hj6q7B>?vMReBd91jG9GP{_g_=oFz*Cdbg`iHp*6z++7)Ii3Ei6L9TOgXY0BH z-DM(RiVm)LxDQIKP0ME*Yv9U6d(Rn;7+H__*7`cyQ%PEotUj@;A|ba`m2PTrY!T_t zg+!_f&G!Z+a3V3Bfn2Ye7j0D*^QJTceo*=O<gRd2@k*^}SCe3(AP&8Z=!h5>SCr7{ zf)d_Tdy+S8(9u_^r*<{-@dgJIQrhHrK-mA4LFmBJjeJ6M4i_4iW9mZ9&M3r$Nj&7f ztgiK5^;QDuHV%Vc^Pz{Nxm!ouWK`(KN?>{~z77VyE{_9AL#B7IlGsq53o8=YaJ&a! zeuLU+BSR|(&kW&XWooLqkTVCtl-LR$HO$twc|y=Sbf!-fj5ouOd0!dz&B48GlbevX z7)a6wJa;M$*$a3HAz`&1t?Z7MWmV@xqQxL>_+X&W*D>iTQ6|jd*G7^|m43ZNq-K!p z^4Y`rq8h6Fe8rW+0>tISUKl3*O^ct?kYCQ#9;6cuy8bXrtTB;y#mh2*P|}L=86oa5 zbwcW!uWddgnW%WJ#Ew(PL^VTQ=z_;FE(P5XL;=wbl3e|D5LhS$4A1xp!>tT9FsSA7 z#a**baWz|FeMlN)Ic1Pl3)Zj(5+O$5Vbjn(@+A~Ab?T<3t{@Hi+_RbL1{00=*xigb z(SnaLnLMK^QWd#dH|IQx;q2&rbhd%ZZhX%`^G!MBz>QRul|Ve5m1(g21c!H-A5`D8 zOv;)c0eK7-p$@KymQEoJxG?W9n3ib|b~{6EwHo<|q#o9fH>>P$sIVDz{H5l^$U<gq z8836tN-_~mkMjZ+7)&RcfV*gO69xq<PtmH*eS?f@8Ve~ROswn(MMTC&VDKQh<8Ed{ zKgvh?S<;?*4gDFn!CU}YP5GHQnTD=3J;4(7-Km)l1kPT0i1Ax*5i_Nc#LltMLo!}H zHl^a=EDiB(_dJ)8p1TgnE<*r6t|#kMM>l#l#%$%Qpx$liHc(@to(MYcd#yH_1$Tt) z6;fB0NQg|usEwpp5~aRR61$d<Vt_choesIBz{*^=>;dY^2HbfcD;x|4+#@PCETrX* z(R4G=#%Pwv&JDlG<I0|6cSPr}O03rtN>~bM>rA^STEFo57UMH_J(q?eN-y^Iz)jwy zK1?VFFD7XhXXh}yhPENmA<9>U{qXOg=#~{#TQFIdVKLN8D7;y*(D}&SX53gS6Xn76 zz}8B*50fQ%ag&}w$qx+l5FISXw{5v*0?K{=!m&AQVUM~@h*7q7;A@<gO5E}(nhzu~ zhof5Ls=v*VcBT$gA<e!e4b#?;lGJ^a$p59%6uGA0gOpLKxjsBbo)c<l<?F$hNOZVv zItW#*5;%#-+>8a}_*Q_aGc#G=OR>~G^l;OYwKcPTJ4p~)Du-|<b2|G600R<hU`cjP zr=g6d+Ub5%he#zq=XH`|@$;lap2}bIExbgSWM}AX*N8%lM7oKiL<3NOw3rK1C_IBy zgRH9FnUtd-#p0o#3AQvOr<?{X*b%LFoy}gq76CiadQ-5i{1Fo`)2*miMJBpraixbu z^fyZBrr7YZ#E1$wFvSHJ&!*EJ`}5E32_nCq>oLy&mtfHHP-BVGr4C1hT7z8q2A7r= zi=_YS_ap>1tiJh#8ePB3Qyc?-x@oR6myNnSto638mxoiMrq?RSaRHzwZu6XZVP8Sj zmiih<X2gu1GWtvgiUYUH<ppo?yvn2P1xt(e?C{lIrWff@Bxk7)D2X3`Ea{VbFq`HM zem;ME`)DqN>PoH)H?`m3G@Tp>q{=Fk5`ki`t&>GIbA>2<E$u>aMRewRI_(NEW~EWx zbIkE+$Unip*|n<I0~9fx8xrpQCbBY}ze??v<A|G+yLD@qA<_k<mepr2HOy;}&b!`5 zqO%d_VqHrju7uC0QFAx$!h%JXz(xkXqC$>eIxD>h6L)as*8(PMDA(0?aHa262sqkN zI+8CgzV;gD-CPnU<F9QF&wIVSLDrcwk9f|pvdLkFl5LP8(oMC8(xt%&(O;P(UB}F~ zZCO77pd^ob)mA%}DBz5=lUprTut6HSa!uCf$?s`Aj6xVKxJb^XhV9n~l0!>7AK~;= zuO~up-qgv8*4n8}L}bh1u&x0nQa+`XEF5l@hsnjnns54K)h@>+?e_Gclxh)gx-y;y zRI@;AKU{<_rVv8gp$m&U$o*AeM}J&YM3OjWGzIyAxuLAq76E=#+L1i#?ahnh69T*v z8ZlEOA<c;Ic`G|ahvsx=Q%;aZ`3u8T46A9LAe8fJP_^5CzoNcf4Y>pCXw3eOQ*$@} zdC(WO<rtGoP2;yiZ>Q#wbiVWF;2-erHUCflVX~^oG}HbUA_s2Ht7m~Rv|R%u=nKy? z-oU?*#g^YeL=5-Ek3*tZSRF>k(;+XGo~8PTu<YQnnXl6g;gZ7I8r+q(qQ;~n+NjMw z2g*RLF{+X?uKMy*tMP}j1Z$IZe=&cU+P;-nuZq0bV?K=ol;+T?{P$`R9pt)jTPLB7 zvl2GYzS5SmBF}zwNJk$hX?)9@+dz^=#+P9vlDakM5!%g*9JjF`(aghhEM<}`j}8!u zSfQ7p!C7f{3n7#t0|dxIiS~=}kBv?Xh%O|m04N8j8B%vPW!;oM6Tv=Iyp_dsD}y?5 zDoh;W8?6>g2I!hxh-IA0$ZubnamR+~?LoN)HtHv8iFt$x*>66Uyk`dJ`|jP(NK<zl zj<eaQMW%I4<4tN)^2XvR)fbj(<2^FADs?@cuhZ$8Ze62BU0OgW0l45iong>T35#>s z-R67EHT~ns7ZFQzWuazg3eG>0<YA^+v(v<&MCUwiZ8fpsDOAAd_CCLUnRV#GeZ-W! z@y_{zja5kjQm2+&*F}K(T|Fj<mX)Y{UQ6x7^5U%Ba=|h;GH#Wm27P<HfYXDMllTG5 z4sc(8B@KpA`E_ia=cXq)Wszzu{$SKdnKaEID-^C9^st(7jWmsyKr;U6$B>s_ll%O5 z!#bJoWwBqBTo$D7(++q_M_A~yMnFnW5c9C4H!rU2WZbIwbAUkT7am!S0kPhIUDhKm z`FRi%s_>j6EE~{})5?Ipn1^d|7^xRew5s`4ZKP#CudhqT%0^Xtlx7d!H<KV;92mGa zumpK{rx~}MWP?jr8$HlvWQ)mrD&Az?OD{^%^TVGi7a_!+2SmWp?C;YYpe?9b49!Wz z^^*q}HoCL&nL!9QH4)>E7Yc#csp7>UW`a<2*xe@y@|f&$ktUrd9w(c~5EJ34;Lx*% z5gnmEgidS&I{qNV9xLFTNhMd2QT8DAER%PuED*Z>S#y>*T5QJD_16=~alrxxh_S+9 z**b=Oqu<2+;Y?n<&%iR|vBw(L$9R}kc%zv&hn2wLm%-5Zs_UO|qif87N!`;%%|*ZW z&`lT3Qq%X{d{&**h>jV_OjA%|n#E>YMl*MFR?_H)_4tY#2*P4PK60yP)L+RqjrTAN zxHaSm6MmHoR{BV~X@Fwx`mBVaE${@!Fp^@$;NA=dr`+oMms29&^}*$VI7_uMi*e^} zgJvk$uEOb<k@0*HUC*I~1qmw%zzC=YX^elC=dnL7zcA{D>yl|=E74gMQE8!OzeKz6 z(wpXyB>A2p&AQ}}#zKMS>LHa4Nm=K!)P?W%e7i~UiLY%!P$RJL@SJK3tW{@@`qh?j zU8O2t=XHd)((ZUgVC<7{#>-sFtJ*_yA9^4e97xjcojI@tc^I^t5wXL=_hJn%A4$v& zM3Y}s&kBX1XgJ?Da<zNSSSyh#UkT+|27^r)4)z?(J65qM&T;{W;FW+{P63&5vfaF! zc|kr}sFEUjb9v?Ja&+!xb+;4^ofKXI%M)`j!i=BI74KmlOIRO$#Qk}{0J1%S+?;Ug zeDZY~f_3;EfPOV#PzhD-WpFNc-st^!h{#p8Xl6~T+bLIOp@2OqEu^!4IHyQTKMTqQ z`2n>(hKjcv0V!6fN)fLPTPKvqcScTo9>Jv@rRFqk#KIxq^(?bRL%Zv_+)QGSW<c!J z<R#Nsoa%nun!(jWpalPW^FhGYVghvUh1}s7OIuHZ%OtB^bO>1;V+n?DMAGHO22+BS zj9D{Y0+jAdD1N5mAV|y6LMYUyB48r_WE{6rbm>;z^f(MZA=^XJR%5)@4_rw{=*6yA z1#vd1?iC;3ApK4@Pc}6Z%J4fZuC!_94LEJx1ZEfX?yj7FV-TQ!fW?-|iPN@T!zyD_ zCwG4*C0G&a!;Ax@0<`OMxxKv_Y_#?m#$>9ybIexDVtF!GOE|Hzl)u=q^c}_}kxa+4 z@MrO^Wree?^K&c+Mw6jWay1(DZ*l~eC5Pu$yU*O@zjwv9vP5;zHam6k_|Nrkx3D*o zm4@+#B`l04(Fe2Y!8VrWy#^qyRx#ufVl0DEK$hOzFagn+s})igmD4z1?7h!^6H5+- znq+5VC~RvoOrXp_%K!Z=SDLFBGiTnh%wtm5+NPGo4kYhTGstHV(X^ut7@vQxJK7RA zVAaa*fIHzCgg|2}D#&z9YwO3@KUz7SdvlwS6HlVBX6TbFVD<-zy|)!#t`w5uz(EaW zgEjTwIR%AHxv9mcRM5lvCBKgJ$<KoS>QD@uA!SIdAChFG>ooK0E{aQ%mtt$cT@Fhk zU{jA_Ty(a>O9_){yLOkpm>*dhck|hty7!QFvH_KDhy@o(;-yY)YRk4rz2u<Du!vwC znjhh_i4M3!d}K8qhVj{CEo6m0|Af8uSc#o*`f_v-9KWf9jaDw&Lwn?E<m@8e&Zk5( z2z+TaJ-iSpCF;&_V&cNgPhQVI#6!!8o<{>WH(L(#VOI%uIj`7C=+3U3F4LbTpeb)t zQ-Y^0_GYlyV^K_SscK?b`g@nMPWZ%I>1d%L;a7Xb>~8w7|Jc;O2T{rn3CEp)s!cAE zPn@k!Y*C2HK(4s4(L=&6QXg+SjsRDO1{HqUmcL`CWD%V=E}yM+Q)@tf9wrrC%*^3x z-8KdX9JAOeIQRe8ji-^~zkcfJJ>C##$&(tCQ)NDLctUS7Cb-Byg<)Nbh>DdAm8eT1 zou+M;dQ>!oAK{NiF(*+hCmFO1_Bc=R`%2<Kl|&dITv{y#)M{GUemW@aWOp`(<0Ze# zEP%iU4pLQ0z7DjfGNeK(>g9+82Mz%8?lb1d%)C^a7H>J2l&s0`$-*rrsdKc?5wH(< z*>y!%elM9;B)<zd>l3uGwu++Dsq#@%Fn-(^<pyGrk(B}XRXqf@fS_Fao1|atTjH;6 ze4yC7^maPTP3`P(3r=S#a`Ixbv(G^2&iLcY|6ZjIvAZ}vzElEU&ng2HDv?$~8_P|3 zxDik&6*+M>?hbN7(HmXEqkFGrlSn9BoW%Uv+jN*$1ZT4j_>C7>lCp@kx2X_;G7xdl zZ3q|;R?S)?so|s-&d6kLAd}=h6+N5=X7SKGPCjq^-P6Ow@V93*@)7fV`p5;Raz$0! zrNfKjh&~FM7fK>!BhVb|0c+>HxB0zfSIXoYwj@?P?6rke(4tzsNV;emmZ10lCS?{_ zyLMb;RP!EWpSGh9Y}$DAD2Q}57lo)N#&SM$X_mo&=S5NmN`)4R7z4w|!;eNjOE`}s z1qE#VtA=A!rhoufxmR_NC_OqoY_TCdn8kQ{8kM2LMvKS6X<cGabD8D)Is&XR^0!;9 zncC@o$ypKo3qHw{#un2YM4^|2Ug&gPIkXsaf`AN7NN8>VIXu|=z#czN$XB&hy5gTm zPf1#UrDHaNV^KXfuQV(z4FWEFD<sk|*bUgCw#;Ch+?^@)<IOqLb_6n+VcHbGlS;n? zdHE7xGtBF4x7tai%ow{iT=F2VPvNj7IB@F*BPQ`Ab7l;J6DJAl{SPCHvIPgSoGbG4 zQwFYNw#3B;eaQ;t9a#QA`&vt3+cl{qrlK*4_T-GGh7axPr6|NP6eX8h3B^(WwM&ZT zPAX%}^v+1|Z9&0`9h;3_uCXDuEwQ@j1!s%t%9^@Ir7WPgA)b071xG0qPz%=1&th`X zI%ae8z1xET_7O2>gw=D;k9&U<eCHBjKmlNK+oqQo_G=^yY0y0TUqp>jpo#zP7R0Z- z+KOz07)rr(h&2#(-ztlpdi7o6*#3@s=CFTNnu=|bYuEq*0CrA!|66QceM6qjmQ?fj zf23-NQcQ@Ew14ot^)F9p)-`!b5^ab`BV4d3t<(W;^EFp^mh0__maw>}a^sOlX=R!F zQ_SsEbI5R!&zEg(Ykc6BK}aD{=a0k%g_vUd2pqv^USvCz7V|%dY7Zt<ue>wmulw{; zts08OmGe&A@b%|>dj#vvR9$ES5fxtTe*}2G^)_XPUl`d?@=Wbg(g|}%Gu;atBVXB6 zyGH9n|6zklyv!=Jl;A<%m@6r08VbqMw;FNHkNSJ^u~%heykv^KG{P}P%QPN!#;l71 zqmSGO3JXn?e-q~W;M|*A*NA)~6{C{#Ne!Vh@6ybKPy#0PNRl>{a)nJVNAA206Pft2 z3!M|R=PA<`E|RC~4M}nKhgm=Q2gTG9q)kst2*z=d^ToKt`-Vhx-OIxps|dR-G-x_; z$pe|FsQr@10g*3K#t#15pW=g@g#(}lbV2s&@gahvE?&+<PVcPk3j$aa5Hg{Etsk8_ zT@N7H8IlF3LskkZL<xXInzQ2nhe5^ldCEVfg3cOXu|`OwVJV5m+CE9KkP|I_e-IWX zWNG`fC`J&hiIDy}C86Wsq1~qvg0HPAkeriym5DvJ$-I^f>(a`A2?|@2-HJ^<3BC!S zCAm3iXaCgz50Wmx=DqC*s5VVWdEQhoUm!Z@PLBM85nSU-_3wQhvel0&W4D=QcV^83 zAmiS3Ukcf;>kq%PBlwuysKoG6GACgDY`%B-94V7XFe_6ol?P5JY#v|>Z;E#$dYe=N zGLnn5B2E4z>v78Q-l4Sg4V~MRq-REdh5%&_pGL6_rtf#rV?PexzE!z`i*H$sQpf<_ zs7*H#JDABiMuo`Ev$}OzhIiEg$|cG~ak9uhtVnaHqNk2y5B0Qt=&=2>fHXHwKy9K- zd-$Ee{+K0y=fxy_t5qycBr(=(&ojJ)AQ9m5A+6&fm)%$Ma0ZwC_5ZKEof;mm%M1U; z!Nw<Q+A}9SK}*3uIiTxa4c#;<^7?h<9fTaG%3HNn(5PYws)u=hC%-GPEGi@Qs;vC% z?-;CZ;!ty6cIAuGJQZUW)e_7LuRA>_tbOUM_7Br|f`|~7@f!it52E<wME{v{(%i13 zCLSTc`wW;I!PW_vZaE=wYX{!T9+XUpa?;DZg$1f~*GNv7e8KF|#3t)_eg;4wL~+Zd zOMIb*z~j3%wcR{I=|%dy4PmGFo4#B1^&WT9b1at*4jra@&m6HAeJqdIZTtNdH*1F4 zQX<4DS?ZJs=7jtfQz8-mp~#lb2oyc>3>yipeB03%YAQ^Az$nbvFDLoW-o5kJCv;TU z&_wxm@W7cxcji&im?eMC-!_9qjIW8CFfyVzF-?)qm*Hhq@;H+r)-}PIt4(;?Usp9t z+U20wl!qmX8q3P$<t0hyqoeHf5|ScMkr-vZH+1^Q`GGAN+WCPt2uiMyem!qu@Xx?N z$%_xaz=6%%W;_F0`7%X&5lf8Q-*cqfj^zDuwd(oC=bVo{)6Lt=i;0T-k;tf7nKU?S zX!Gg$?}SRv=CMo?Uc+4~AYuwlv)tzU>Lx=tcXSsQj&STM^>tOu(^3;V;Cy1%hQD^K z7BIzS6_vU>!kN+GKATdw_5hgCdNEd*!OkrXHu4)X6)%?zpwv5)lU@RqIJcnVr1oEQ z!U>%K65x1~>He68|Lv#iAt+Cu+~ZB^rNO#z%fm~8NPQy9p>Z<KDH0rUHesf>k3z7{ zhx_GFF1@TW2?H+0BURu*o;EYO$XS+F2D`m{CyF@sNxEdp5pt6Mjm7UpZTWE~fA^Za z2A{EoNvguI^qTae6Yo7i*lZKKr)N(*ljb^s%$=C(k(MH;SQ7mt$jfu0|Ii}+tXZF4 zYF}SPC9;+s3?k(O13=EkmA;Osc4zVbni9v<(gr--mAT2z(GvxVmeoXOuLnWe8krNF z=S0bnHyGLW#u2FK$v`yFI<oo+iyTJySdjq$57G6EHHLfAje4v91)Ye*QjI_2tb-6Y zD-w#e1&u)`3#o<wzd9V<>|G=%D+AnAO^UW-F)O0|)M<bk$tl-vm(vuB|H+R}srN2C z(=O7vRD~eId1_M-Lz!#KNXbb4NEyKB!Uz(=HSpj{tI70~O*R_vg8u2EXphDmt0+-Y zAtU=4)yp7<V?aLdIUS1gH_=2+0@v5}Wo{XdJiE^o(V!}^bg*Pr17pa*y7qQk4cGts z0cgP~SwxG9OBAg%+jAqfJ{wrJ>rwzqOmk3;p$z5v4HNRKopmu6w(j3w{_Ub!fdb99 z!>QpuQj<^#2n1Srd2qgjzxeRs{#Y2sm2Vi_Yy)(7@S{G&GNbhqV8e9TCWZCCNAggS zcf$rB)%&uO|0U2)d4;bW@O7umn14{g>-fG4!M3{8v0?A0*dj6AVqgD%Pv|5QTWI1U zsa$RI`(tX-H=+D8DVNZ^&cDowQlV-$|L5YwX;e-LG5<d)y9so4K`e1wYkXRKegM4W zZAcL=FE1&QT;Tg>97c3(#)lx30N_T0zGGmBpD0R25`GvJk>!SH)tjej(P0Yt4VoD* zymU3p>#}j9Oa>_|$g9)o&Ncm~k_ZIbtFNtKUnXHZ4`WunPG~ompB}@j=jXByk5}$I zzGifS*i&RvhgI;CMI7<u)Cu?60*NGmx^lt7z+dU_n&sW{7Jrm526QeKc;|eM91~%r z_g5(jJ<q^KC^zrecoX@II=f`{4fCKl_z9CLn4>ZV4PhP>bWBvr#<IkvF~*5;R4Yvu z*6txMM8UE^l(&XQR7@VFcC}@4M^FJh!uMcg(~Q*Q1jpNDrYJH~KKn9fDhJ$rP0Hhv zWNqhr5cV^_z??lZ^gCsY^cTl7Lnn%GD{EeK%MzD%pk~faf7vHRrjCt+_V(YWbQk;n zE%3Rz^UjGe2|G3=#4WiyjC=IG9rZYU>e`z#WV+v$P5bX?`!a_f%TeLX0>_2vH2OH( z_!LWPKw~*8Fe`tXJH}2jQj>Srwz=YxgbhC2$D95d{qwMeM&HhckU%1b8G|P%yNiRQ z)U}Bf%)7Gk^e{F6GGu=}nATW>Y_$>Fvt}Yl1&e1bO~2Vm8Lj+2U2cyO3(6VhxF5=E zeso0NETG|}1HWZU=mkZ#;~lGsND9!JE99s!_WI}<lTHix)oL(li^#ZdS1KdeKX64{ zu01=JR&Z$Bl<!AObl$RL7&$C{2`}eF%ZO>^R3wW+__PB+3?+RusWO9(?4uU{;<w9H zdKrYFf1U9D_Fd7Pb2Le_-_knJ3jPe)6j!gzO{{WM*$-`^c{se==O8z7jCU5_MvVjj z000FP=HmkiXaRPmm|L2G=X9t7%9w6V;*?|cSp~i>uNbdwUm1CMQa`?dmZDv;^2m`t z6LEYTi}QfDS$w~o1n21zI*DYYEfb_Q3sLe+OqX1r42bx~>I&~gis?Q@;=@6H)Zty> zp{|~p*RQBMTQr?OGj$piN#ZUycs>`3U-j^V8ys>B#3Dd0zvw53H(D1kskpE@DJC^R zv@S5}tW7R8BluQRn8nj74VU^S9HLo@O>E8?kZT7mGdqa<?g*++#>)b}xVOiY*0fOF zE;eQa(Bo(h3WmO`vIm?$4`TQ^^SMv{5GsEj9My%_b{f(iUVgY-L{1+@Sx9FBt2pKG zTeV<^fFQ1K^jdI`K`H2Z7!6E!+b5~%R5HpWFfcLSpvMJ%x(in;_K*Kxozl!5b;|QU zZ5p=8J4qP2{^MUu$|+?80!5qX_jO%)j`xS9OI}3A7kVTK-$e=oh2#1a5L5s$|2s(2 zQ~$>A<Dkdm{#GH$zXfOgFb)say3<OjMlx-J+1&mh;Z0F~Hs=>symN-5^u!(+uW1+* zg4<86(yirB&!6vY!IAVP>gPK&mnrtXxqO*=HA)p{YO*x(?#HTdCSlR#ZfB$p4cfl6 z?*u-wnr+sVh_I&2*k!F9?KL%*2QU&rz0AzsG17bZ?6xA?FB(j-{VjtWQ8YGuh5krA zOPd<<=}vaeFJktcO8<lgx|u)&8xLknnsr}8%HaA1ol`$flZ2mA1vnCR`)NqwR@<60 zc!+<RGBbl?qRW%BTy~|v;BqaWnz-HnNIP%k5@st`kmhHP8b2*2(Wi`i03#(TDud&C z)dHfT+pwbJd`nycN5mJ+%~R)xII_61H|&VS-A%qpdwmNIHg&pswcF!-6c3X3MX8E8 z72I(vx|~zc5;Xh%tkdGqpyig`kv#H0+IteVK-Kjc+78??GCAq}ONM;?5^RIzW*UWD z`dyaXD&-n+!LXx$n<M}&NOh~8<=0e;n99A&dZsmmW;o*dU_~t}mFcD5`IhUkV&(K+ zh#?@&%!VhjQ@z;)R??p4d}12Iw-s;URv8*y8Q<2)>7Hr;(kGl!RP-~jKQdh6Zo14O z2%?3ZFUf*l0M^!lhpv#Fd|&?UV6!2e#b2FJUKnnv*mhK&GF?u^GB-q4rh4_xUkh$+ z$PyJvWy1H5^lLmN#1(<n)Tt<uh(b^{^I1lyyv1xrApC&?+O68|x0uO3cICVnuT}F! z)cV^fDpp0oS{p(k-#u_yKOpqsa=4=85N3+Z{tfO3{S@U{w)g&2Lr9F%V9o$LiGJCo zS+@sfbbCJvGSciSg?3jIiT(7kIb*z%D)a143VddMglH{iJ&3+d9W@K*F(@g;!^zdX zbX?ik!j;#>6s0Bmvn6V$%CaQ=c&JC53}<F2Izyy9h5w!d<`@>$6g_Y1R~0u&+&g1# zcM>obR^^}MS~(dZ9W;rGmnF*ri0d~mzbS6*&#W4o_oI&DlVJA+9N%;~6+rJ&w@^hF zaNW2gSeia>m166-BWeSceF|ONUS<>AlX6LO6Q)s4{UQ3}>Gdate6?A#J+A;&KmQzz zJF%1d`ZCRpr)#{DSdhs4^_N}VXHT(&BOC07p`P;>Hj|f%q?^rKdA|M2PJ4$>icP;! zZa`CCx@ET*q=8AgAEblYLRnhtyiRC4y)xI^BpmpME8m(V^y8HrkM)pBAO=1u*f=i3 zx=?D9QMsZR9?7UG@CNdYDW&~pKeI1zH;3%Z^Mh#=Ryot{-#5m!r}Dxdqm&9eFNkK! zcxTg&d7KGJ#`hMN%vlO1w&$nW{B4uEX>8{^QQK^2O_|%oVs?K;O_qL)XJ+8C8-z6Q z=~by;n1v53Uxh@;cRLvhXwmoK$CG0{jm0FZ^-j&Vt-+^_B0l10Kqnpln=Ag6LdsEX z**t(oa(~JyB8+FaqzMoQ)o*6KoXtgxa;K%zZh8!Sj~*)j{2B<z({%2!&zIMx-jSJY z5^q+w^yW5|KT1$!xda%Ywj;^&my3LZE%Ml$KE!O<{Zi;g+kJY!xRn$};o0+{N}Yno zUt~1xzD*S$Ge(^m`s$cDgElwqFns&?8BS5%utp@uHEL6osUN;gf@w*S)_|xU#iTyV ztHeNW9G{sT8^-L_x0L!!o;=U*Rfs0vqtE;I(z3!>lPY?w#aP$iQO9xME<3kLQ8uT( zX8r#afffW(`a5t3Y6*!K@P};vde#};?oEfxFOdJ`T6T=foUy}}RUc(c`gLB^FbYqm z(Eh6q?V4Ya>Nb_KF-g$H_gUU#r)!LYn`%d%$GF$e9;WLrd}p($P0^tbtc?a))=fjU zpYCVGqD}buJe)%lp@eA!Hp)fw3aG?tqP!T`8S16S;dGJ=6Gh~JpV87%0IMt7&~QEh zc2U?wq26~LAl(OGCG?{M@AqKKkp}SlEn;d{D`z71B-JNB;>bD^o%7`l%ElEy^+SD< z4=to_l8z3Y5jK4b@|Fn6kXT?S(Br0p!tv{M7z%qnmiZ~^iW5!C=CU_O1=5fLZU!Wf zg1x#k+~K<m&_MRlW!fcU?~kXTWSTSN<D}jpT;%#VhUk}^NwH`6Vinp<)w7!Ce@Jm! z>Eje{w0<0rKps}<ACSQtEsD)Rmo*2b*Bm~47;)u8#b>K#RrAf*5c0W=rTTY$^fEwj zjW-g$>RQlEq}#JX)v+SnXS1Ad!7!e&$@b$iyV(qbqUD}gg8QgI7-{s*@iLlb$~M=> zq5(bx7Nyg-DU;SbvtrEOraY}FQpZdP#WK_21Bo+Cx_OXMEhoNARjTpPKM%WF<oSVV z3(PhGec^;0yoD*7w|MDnNz0V#2(!E>iGL5eGUHw02Wd=5xYwPe!NA|gHrXE_^O3By zu$p)Rws!36<1jd|l4cYyg_N(X5I|9gfMKO^;nBW1Z3Ohfi}QZW$b*F_C1dWXy8WOT zbgaTs)Nm<lVPXU@Xo@xVP6`z}U0#kGTcT&61tg%=F#Z(?KnB;UV0{y`cP9$068<`U z*4N9X?h{<Kr2rJA65}MUZyPjOC-1xVps@U$=8SDS3G3dJUZ${2r3+$2l}vM}^ta5M zEX(Kp=z7%fIP6a?<pTsU5T-;fy)G+H*8nz<(TquYJ?)JqBy}TN_+l#-gJu$FBqD^R zP0y5%yyQ~0tek7%1MqDZ0KX3&exNTN1RvqKEkil_R?1ekg$>;0KQVGRpwU-;Ehlb* zYtSS*ivc>7!iYM>D<#`~jOJ3eSfVk{d?LwRelP+{fC;fMK=99-M<Bm8B8-(gq5pOY zU>oqbn{!0;V@t*pvk6R$=&XEo@|Di#$aaw81Ss{;x)0#x$2bJM$jOLpg5c)`J9Q}F z6Rq1L$ZL-H`vVI2q@MK4<uhu695p77A2)G~mfX}kvnqJU7DbOKR18<dzv!*dXnU*7 zBRxP%!ED8A1miuAe?cB(I$+pm_E4Ip^JrnomUgl_y2W3GlLhN!73mrT4)ykEi^wqq z0ULn33(KMqTlN<Z{8!v;ui3A@(lNjk5V|n*<OZ0#5`{Ci{#zZT8~ON72}7zt3W*ue zIFUS2mWiyNLV!MqX$ic2j*Yj<=a+W3gNvUP=Je_SI!-xN+N(H$uc!qiNDIh|tuRoM zk@>R-N69i08`rvJ$mWf-nFaY^8?cxI)~9E$n@FmpUwd@s_72Xgo)Y9|jM#psEO-(I z7zFR$p4yKuYKMC9ykq0bAmT-{W_q9wq3^I<hob1p6DTT$`<}uXK;P}Vvdnu-YNz)3 zyI()kfqZJ=p`2gBeZj;`aQg2N&l!0cYP#I@mJpN3q$^XxhztzFHf}&c<^74R3tA72 zeXt*)*XM?NlK}yP9-huzgs}Qk-<zFuK%i1YDeAo|RHI8N>0Ks!__b`HIMENr7_AW_ z00*R-kAg`qQ#=v-?X~_Oawv^vmHl*caAZoB@}&iKA;u(P3uX2SwxUP&UUs;x6{4TN zun8SRlIZu*6g=u$j?ZFZ^zEdf$GM_Ev0=KsU5Onnj;U35h@I*K+o_V)HcGYzb|$G( z*fI?OkhiYVU}b)FwX~an28s&m!!(5b7s=h%DT53mb`u4Z+npD!1>pR#j}*Y?<jtt* zzn=)vy`PwG01x4WpJowZiX=F2VM)Gf(-MFH45jjEO?YMxI<&^D|I)ki+zcvd_s(6_ zhn*OT?Yx3Cw_He+AA%s8?1&9WqC6?q)SaO>%<?YO7ltFCq#6VyAjWlcH-5CRH2ik> zvteJq!|(^j8qid`dLhX#L84sJQ){b21^KHz0LkGw(Q_2virHwG?B)_OeJb0kHYkG| z*ATdb*oj`pw#o5u{ZFnXz9<5T#I4#!0MKI@=gUHXVgOr{MZgH&z7Y?*KY(;W;c`Hw zoNBS3Y?pOd?kVI1!Fqdi3T^q&vaD>xt|w04>06;vVyHdT9!Bm-2-CF6aMVE&v)XFf z*=K^SUUi%QQ9^E#P+|;N7PXu7c=}_WUwaRj4?9X_=5pqYT^X?@DB|g*3gWWY$^<F? zrV}GVnBXeZ7HScokcgw>99E|c0vQ5w3^|5>`*zs$G|atlOg0K3P{_Zsr27vhha`t8 z+0}1aiIB1vkZVzNW_PrzAVel8`s;D%2`?B^OgOUnJPlT~KD-klv;I6qcg3-?;{D-= z=3rw83hE1~%6uc$Msq^&UAv{uBtg~#m&n^=^Er4F0#D}HK~GMdk+kD}wK8U1N;L8P zaulXeh(r?FcQ|3H{)$QZ_dmn76^#L6oe#lcu*TpuN-lvvkYv3Kbaddu8D?X`w4C1= zL=teS_4*X~@rkB2J!jFsg^Zt<m%nfk7>OR1&hQZBvk7!qpA52VB|U5lU_;)2wax-! zxE<!vDXxH>;TRi)0VDL;z+>#ewq5pvb=F4nm0ZOp9C2&hVc^c&aS?QI(ldWUEAoA@ zBGE4rNOE=4yD^Bxd!aVBFZulX9~W1DLsF%pQ)hkr3M6<TVHi{C7j*q{Md&+7S}n4` z`SQ(7FH)YsN=%w@v7Mo1EHnZn!n(z6E-2fTeiwqt4(+w1g+JgNP+t##!sfHF`Zonw z&Z_>`7m*)4jOli!Q5+Qp1y3)C0FIm-JD`wqBXacUrUT?9*Pd?T@J8_*<}FA-FAptn zXZ)EXZe2|jhF3<dhkdv1vjSft>&!g#x2#e=kz&}={vSYoK?Q!{e_i0hRZG_&&<=|v zTfdihk?A;7baZ=mc4FAikj({0{`p(}@Z>J7kd~Yuj3wim7t0|ecAnVhD<Rl)1b^c4 zX2$j-1bJJ{vBnzHt;V|^)IG~~R<$bcS!HaC%fYp-^EEm3iF)S5-(pB$e);T<GB30) z)j=enoIO1*C53}LG_$$T5|NOU4T)a=3Uy3uutXmd9=7ES`|1>Se<6#LMRF=BRBqH+ zCdIrtaPuRPB#m=}9lO$SlTLP@%Q(@^ll`Dt`?a!nXm7B^hjD(q{kuAl$dhM9g;|dW z2C$ybb7|~??QA-~X#mHw5U_+@S8nvMoh1rKmz^_tJM^E!Z3BV*QN3GVhh*gH2qbs> zyA#|%slR=Sm*L*DGQAs=R~$Qj`IsYh*x}3{+t@@@)&T&^({(l^<(skdHDR?fO*y0w z10z5I61eK{iw^*S1XN^7XR|ZpxBuC^i1TEhnAP}2mn)b?Tyd$ztv<@GN@|X%(&p1k ziSo?xG~~uLVn9j6j!P9HAsk{SX*Pr>|ISuX2igYyg20+&H9|J3^Hm>}Q6xVQ<?a=4 zU4$;b$$QFq9{9idAV>T9G$P=S`*vRkFauM>WGs(PjPDIO;m76AM~{b<#LDpp56Hqm z3QA5PIY>$(>8E=AkI+=kw=xH2zSH^)PQP8)#VById8NFe0pni(vFT>qR8Dgih52!K z#uRP5`bC-=8@pRb#>OFaAca|fh^%+s0vJXDa{RE?>@$@7@8->H7^KNYrr7L6jK-&Q zY3f3yf#4o6oQ|A**KPLBhrLk4ou+!IgiE@yAUpgK5ES8_p6p#}50uzF`Rjs^UKRB( zGjWHOX1N(yAy?RuhuJlqwK-nD<0*3LS0z2cj<mnz9xEz@sK=x^GZV?awGAe}iuV&P z`7)TD-~G>@&KaNIZ_(wF*)f~V-W~}N0J-;iqUopQWo92$a0oFO5Uk<n6Z-S6ESk1Z zu~U~if5U#o^%GwM0+0cez;0;8teIxDN49UxioF~s+6PO{vR$(!r+kQ>$~JA%*cT(k z#$K1#?tDC8-gY1k+*_fWlSW~RPNbCw5lJ+95{&`Y`UE70#)g_F**dC=>58CV*jK>m zCr2M^@OznjCht|eDv@&X9RR!uNoRF_15>JTUxsj}Trd$8C>qBWPvxjD>yz`<tpIZQ zQP0%jWA^#&D=bV%XyvuJ5);5b4@jo>uEBqUYl@nDfXiu{eX|3ZUY>4SW_WPbw5UVW zHNk=`W+8)LqS24ja&5Nrj=c9~zwZ2eLfw@;KlLGJOy@<B*+H7em)1RudD^+UJ1;!y z=XxY)p0qT5jJ-IY%5&e%?(BZKiUEY}-*sdqL4eSaqd&`OXSp2+vhC9F8Ki7M(#MHX z8?=l!xcEk$D7SzR%HBtbOf;4FCs!PJ850BgBS=)*!^YNmsLBiyB4x}(b}^v7K`t@Q zU|m&zq?*QU#Bs4>34vuUd-UnBkfTWV5d2QFFkeu{Q$RCkqMC#U?ATLyV2v%h@V6M4 zW0K8a8$4q(ouRbfPdvlrlWzR%C-JTf9~h6+Uc6ArbS}opU1Ch=Vjqfx*B-n7-s{Vg ze!H1Y*5!0;8Q7Ax<nD62KsZjF7JL}%^wR;n*vmK*hd}bM?Am-fva}+xt97V^H_>ts zjrbl?`YvuPf}pZ=gkwO7hfolz%mHu{1UF`bxy!}~zteK8qCjKtw2xvy2L)95^h+?F z8vta;)E|ES+50i#a)IF)SgFl6dnGm_f3<tG-<>wbdSFgOb;_(mXY!TJO~^g9`-BLk z6sGGfVg`Q*77Jv^-`NK3CoK{Bl%4RA9`K{6-&Mc~q34=9E?_ROmTyo#T@k^BpdxkS z=beucUj!(Gv>^L^iEe2#U?vKm<M`7q0KsBggZ9T;4l|i}M&wfiUIpe9vHMxvIs$I+ zxi!p=o?){P0ap*G@U}{~O(}Gap{BcKQ^G{!PQvZ^Y<j(PZ82~M-JxeZc{cz8)-pva z_dIg!9(WV=HJ!z=50h9p&zz2x?XbKa(o0bsyk(ZI1`Wa$J0%<;?YQZQRd%^up>qOr z+bx^N!!@ql&GR(Ym-bu>*ACnAXX3hxF1J#+x}4*O$h`PmPv9^d?e!g;0f2QDA8$CW z<y{-xMJ~#j4Fz`Eu&A`I1Kzoir}#My4c)B;#$E^(JIbIKPaKgJrc^7T_h>iYCZ8kR ze3;lR7iBR@j4m#LOT_5Y9|<A=&@nqiup3yhSAqEz+jfjJPdOtzT1q(4u49sad_oL^ zX2z=;F6$P(TxB6rm0R}HsaPneMK!V)1+xPU;;mPL=_=4Ng384%QhrgYn5ea&!HCwx zkHr>%RdNw`xuRj%UU9Idm$Glu-G<(~TT?}T#>2+Vb09l=UlLU@r>P^^Fy9Q`Yizkm zRi@jS2)Xjd)uM3Ixlb?17|YoV-twcSiUJAb#uwHLf!EB`K&d8fAqI{ZP_e?=ySoCS zrI;hY6{Z1dk;*-B{~i!Njq%ip6sErEd6DLQaoDYma*6Q<m+r5R!_o=qYuj!?5Wl<u zhWq;?WTHjRF4vv+Tg$-3aPd=rhYu3vjfd|zjC0C^E0aRCp0|Wz3<hzbZD`0U8qmYh zZGe-r(`G#wur0ZK*RNlBX@bCbX_h5^1vZ@zqE^EmZqcIY!3Ipu)L=3<V+~e4-=rFi zr9MMk2&sB9`TEQG{aw@UzO$I$T+gQERD!ckQ3X^kG`b3<MzvNdh*Fs_MV2@_L3Ag3 zoSdHxddYZQa<@t5xYNjI<SZ$6$hxl<389Q(oigd!u<Yte@W^C3ZV$Tlk#Ws7Ee<*@ zLFJkIGRr-IX<dn}7OYg-D=e{qZKq*CO5@|wlme_o_*VJJTaRx>BX!->_d~6c=#JWJ zB{q1sXKy(X;9A4tV%{PUm%dB_31%sYXA!~Jvx*c0oV@&E$78qOR?P2b7G2wlw4;s! zQSa|og~&9YHsuQD5BUH^hSJ5QVaLA;D{5d$B)fy9ae05-Q?QY6qt7pp&y*}LKf>Y3 zmCsX_Jb%NZP~Q+H|EzcFxoGhSsaXv|Kxr`^o~#EMvN5Zhww4|O@C4#$CHcK~ySpab zGaVnRh1~XLnuuzTv)-}o_gR(Ab#~GGaAKLf0gbF{c`9lT_iWu|P#Mv<X{yGfOJGF9 z<eH6wi>40ayobWHu3ise3%cP=Xb0A5%zP6hAVo&q_{;N~!&ak^bKNLrf-t@fWf4@a zYSD_1W==a4lWjDZ=ZBObbN%*<I5jP-#aM1BZ;>3iqm_v)N7e*smF>9EGhUv}uvrh3 z8)Jr!k_Vg*6}_Qyp!eRN$K~_zGD-^3qQ#lWyV<P$3FwBF)4%cLqYvM6*U6~gtydDU z)gqs{HhG0!F<ZwA&)jy&Qk>!<(=|s_(}7SpgcOXV!xt0b6R@b5wg8~%Ovg%ASSZtx z4{F_k-d(@gW)B`gAR$tVAwXd5j};X`D#?ypCKu<!el*<HX&i-_7}vj9_qXrPLQj8f zx&NN9<i&q(W*x2nRxM^{)!<mei5+Ync^0ji2n~dRY!O-nDWq^`iRl#5Y4BOmvG*(s zqy6$8)Y1%-qRJI(&&h?6mR(wx^v?6J8tk!fX^@YX9Wj0w?++XAkbMmD@Rjk1wapd6 zpSx>T4KAKHr@O1@wA(&9=;<i6P4a(7+F<iaYh>|FSN)yo0Ppq%7-)SfrSVfV3~DH& zMS~b~v_LW>JD%)jm8@&R;k9Q>>Ln4~#oo%e`~Z*En{jwVjU92Zs17xupS@<@e|O50 zCt9^~xWC&}vt#Pay*XxhxX0AaZ;+xj%EVOTS(<R#hLBn~YrOl8i?hI9kBl#8B{4_M zejFNHfVKWKqfPLDJj1vzTC)0-Ogt<z>_s3WXmt&at)%9t#>8Z*y|o+DqDtx7GZMpc zcga)+dhglr#vvaMil+%YuI-RWo`I=;o_m(??Z&k4pZori2XCGBI`LRfvnhF#-jttY z`&BLCr?`WepHm_A(iVkQ?^5EzJQOO!r7H?7c1nY|R`ie@dijO6hxaq%G|}@8|BbG^ zxiexU`+5DK$>=5zG?>Pl<ZAT;_jLs)EN?B1#EdCxvBFFmSVGdbtV(E5F6!;^!=%kf zSovDAaF@;#x$*Emd8U3vMhT$<oKjL5mkew<)!f%#_V%<ta_1dqC-vIaMm~!INt%&6 z53-o7lL0_|jWM_M_W~yYx>>Oh-LOl{&5Sj8u%j9ik=aBuC1l|DmI?cp$7-Wi%qQaO zWi}0c*CKP8tFHIhO2%G;InOB*M*O;zrhze4=zJ~IA{0WW(LtnA8-tx7hiN1=RI;+M zEwuNjgM2O-TlLvQEwG?PucE<Q3$bv?X_e0}SwNJ<+(Z}jFnRpZdUf4B@_*48Vv;?I z^m$)WNo2&ja13I}B#_9kBnre38v~u3<lAoBBwV0@O8c%>s-kkM8eh2U&X-@D{N$Zq z-u2}zle3d}bUKd1&ZPAH@w+J_(U*$9YHt<N(&ykycNCb^!mrVfcM+3SYz&`4d6tWH zWSM6iW0A8MyQREX@_#8`N{eMDPvD;I=AEwpkG#w0l;znY&NagYtOtF<oX5Xl$xW0d z2Fw05?)v{V?yOkWJ!8_N>Y!QA9c9j&byLo=M#sz_<mHq+p6u5I^OI0=Jpm|IPg*Q0 zw8sK5U*M@|j=>p?8DyHWeHg8?{Sk+*tG=Iq?#U+}zJGibDBQle)5viw9bBI@YOrQ~ zS)h<|NZy^!l6m`~OF0xlW@?BAhIIzg&H+x_(h9AeKNgc>3mvQcM5%au31j|m>Vx<D zW=(zS{B(1D-Yuj!h7Oe_0?CA%GwD#0CAV0{lJlPfBuAQL(Wl5zH{oQ|>(r}92Z!CV zEJb<#O*R-ItgV#FOpYPQV!|=A72Lb(-!kRh$bvn$qCB)}QY$z|piDe8FAz`M!%!NT zV}zrzr2N#^#Hyn><m>4wew6LANgVppl&DiJ6Rz&NQ(O~7nA3>og8o#oB7ASgw79@3 z%ZmA()jalu7r_tfF8vLJvWwe&;SZiy_=77|e)o)Fnr#yy;!+@_KHSG>Kx@mn7lByl zIRaMk#XUgAOcVQ)jqU5@U=c?cTeeNBNVm<&KE5#<m3ZB`r%jp0rqRi9Gu`~O#UXOn zh1%Qj@q#OWBDKejs3wtwKq%5?pSn!O<A){>MM7yTwvjEV?mHYxD*i#Ap0US}KJK;* zhUy@`W;hssH0-JA=i~O{##hAxKMdrv2}gBg-TCH*;M=eDc27OmMrtk_n<qw+l2i}g ze@`>A!^?Km?~$MFEhgNZsnPhBcWae`rK6HS*2DhZZeItk$O=Yn#;GgfjjUQ?BB=CW zxGqBZnG;)1%5<8p1<@6Ek*L(~;m`(hEOG$60+oC4X~MXaN-jDwrRgNg@V2W`nKPMF z0bAo*3j4G2-H46dou*D=%aq<oRf!+``CK}=rQ<{-%$xED62Kz>Yh+R_2Un5&<&}r8 zHT58|TlJmZK~*6!yzc&cM{Ze`pQ(^$^G+@sYF#0OLnfjUsKhp$;s|$^d>(QQT*FeI zw#dA^aL&*>=gVOt#&$Y5z(e~t$IQLhO&YYT^UX3{{@Kz&ELEx*ZFH0!J&w*xREYtE z-G@>mM2H=QuWI^@(Thu4>|e5jK8GO4-2=zJ!)3i7U+(5Hz<@z5k|UL}{AC1zUMsxH z&1|_(HpQLekoc(yxTM~H<gTGUY9DpQEZbaHP60htq>tOMp;nW0s(}Ns0jse$W?*h1 zY#R=)c^XC1qf;t&g4%7pQ}e?M?-!QuIQtIoW+C<5g7-T0&OppUp3Iw%jqsYoYZ)Q! z5t6=v-Z#nbJGXdG$K8U_oPpDKh?nnhDbvaNE=4ZPm$HyR0mPaVNJ-P?uYPvjkdx#Y zt-I2zhd&wc)X1wuXeG^?ZctRZ%3i^q1*DXzPvMLvQ%+sQ2yOI5b8ICUC50k;sbpP2 zPO{j#HXmhq5c$u3^Ggz$s^4nOw3>95-mQB3d$Nqc>n{ZCh9H#?1ZZUU9R$4`0=cNQ zLy*1gWp2(0im5}Cu0PHJ7QGxKy2zn?%5xZp9!lsL{Is38EypOmO*y8ey4%ifV*oc% z8CfW&Hrl(#IkJ?&9An7doS>K^IZ+^=a+0O?YS$femfVt2hq<5H%6<FaG4p@BAC{;P z>2EfK@p~NAc37+LIZpeb_^euCv|L-#f~|(mw;mY3#hd(kF9I~9IQZ6<;JZ{J_BRYv z87ia%9Vo>3^BQaQUCCM{qA#V!=Eb?Q2UIUr@L&6t24?#%eDDLBcfB$-(|J5;1O)f7 zS4v~&^3WyNjqgg<UGmZF#ZN6_{B*30{gB>n4}J2w-hHpCP(lAO)f*kR%0vUf6ZI$I z|Fmx6xpaI6j5;4X9MyjWBjn}Qt^=Roak1O_4HTxXmj}A4MSvpGzEe@sZX5qW%hCvD za#)@^jIPSWG8H|_W%>H><cJUI2g+)=MYlMPl=0X>Nosb!jq$Di^<D%=&5Yt%o46L1 zF8n=CG#jXLE1d95J9eE^Civ?eFGnAP2ND=?-4gQaU0IXlUBz92mfMrw)(9J?qZvNU za$2ANNd{<{uhwe8EV%(MD_f_WxT(&Y3od;FS<%F!(rswyXmCJ#{aOL*`N|(RO%Ey1 zYlIb=-Z&^gDQfv#lwToimBxchd~o25%M_gTZpx!qekJvdJ1U4<UE8P(zZ%@F)pk9= z1oPDLkO0f=Wy7&mIVOtq$I2n2QT3z<Z9HhGc3V{Fk2bQ~B7}p<25Eoshe~CaRL_QP z-sk8{5fkP6$NkX}NsLTnW)@a9b~p|$9zFpf5iyCKLvD+Vf-gTx{sO233ZfP)M5wL3 z7PWN3=@~?b6eU`WSaHTMGO@C;b8vD=kSIyA6sgjrbIXt^OST-j^5iQ}sHh<FNBqf9 zfB^y^0umqt3ZMcSppzzEy(1Jdh3>zt6b)$xwS&6B@In1x<UrKEa=AEIx?CBFZ}1=Y z=obPD&h4i?PQ_gN1-gxAi$pfx=AO%BKt8{2E}Hcl?*s&ZQIO&F;GGpIJ`J$%bnef* rZzQNP6I}3DLl;`oa*{bJM$f6uezTAPJ@5@jd!H=xpQcwzm4^WU&I_Mr diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.ttf index 9aa5f674daddca531e771b400501317fe476a722..413322824e3a08e33435d4247166da724ab2ecc6 100644 GIT binary patch literal 23904 zcmb`v37i~PeJB22oqgZ;-Ccd3Gt<-Eb5GBGYBZX=N7sx-qg%2pS+;EB3u9x;7z_kR zSO_<SEP<8}LLmPQkdT7~LRbPhNJ4^1NJ2K71V~6gv)@-eBg@7nY(D>yy6aWdtE%7o z9pB&aUNxbF5EFTj@ML5EVyR>7&u4#ukm<*8bYtuM=EYz7^`oD_{&%qds;xWkh;T8} z8X>Ffe9wuCC(r+p<4^w&Av4Db(ZB8F=H-hxZXx6_`Vh^@b9bNk(nD{%5AE*~GX5v0 zwl|M^AA0LugiL+}$Ev4rKpx|9?KD0le(L-kSAXMoj0K#3o)G%rx!bljH_z|?G9eS} z`JX+%dG#WFi(vx$zl;6Ih0XKZM}FhJ70~lrgb1fD-gfzpr;Q&*-$Qv^pS^f#`{J8k z_oL4fvhpMJzeYIHf$i^dPK;J2n&%{e60R**wwA4_vQ_DL>+y~b&iUiN@1WPwcYWvk z<O|%>L`z(x_M8q~>GVvqIKNi65RP-t;8yeyq0~WV{dFVTBXonE;bt4prIZ*ixpURd zYPrMZkd#=BPgW{y&*_l)^_a&Ujk-M=KkxM>#JIZ{ixp$PNgrtA<wT&EYP<0y0R>vx zB)`S|D$#+0a=p!|<#^B_Ql94ysw4=MQgRTFcGFqC9x`z0T~;&t>*A8+%-K`PN++K0 zbjszurbCuv4l!nMI*+@=l+I4=wE6StXi}%^{Eg2j8jnsJF@F~PY2W!i_vhRvNf#L+ z`^Zyue}}?}nqDf1<w8Ofh-9QP5vE;Kq*E=f6p0{8l5mQML?WWJMKl`zAmMrA43TA( zV28@HgL^#7z4QW=g-2iJI&idZNM`LF#jKKyYNcQ<;VO63+$LU$rBdK78(p==zSwXb zvLwkaceT=)N-8nA#`?-hg`G&IB&P%Wd=+PL5^QqNza1zpMVzub*`FHg7iZ=!)&|BJ zzV)fpV9Bv)o479-w-mxjuIs7$Lwx3p_RWusG>%N}J3f%jc>-bS^1x$aVz5u?75Zue zD?^Lb!M@2eo$1k>tyBBX2fOy?;ubN-^KEj{yYz;idw1{F)Ft|Jsor*fHJ%FgurZI) zXUU_Gvz~bCF76hYLb7_IPw;!P#ON>vdCkT-%^|@@pZ$!-Xfj7lzE9#Vx9^P60{2(M zMx<wSl(ywWXEMncQ>)gTlGPF7X<=f~Vsm63c#OCBEAR72uUS3$#H){g$>opTI6rvk z{>5QN&C1RQb#UJ#&b|BCD=w?UB*>L&tqL7Z6}grFA?SVS;oO`rX4ly}xzG7iH�r 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 Z?zX(U?cCi~cDL2tZB69^*1r<-{{^A8k;wo6 literal 34352 zcmbTf2b3h)Stc6yhW8Pf5gF;dH)Yb6udME_?&|8Q_S1ISP4`SskL|J2$V)RLuayLn zKqJtRR$5>eAq|XXK_K>Fgww)#S}j`q1M!4i9o~b-!h7dH*ZXc{b@ym72Ub;Qx-v5& zGUER3`@jGHuQ<YSoW;G3<GIU6PE2>#fBNi)IqvcI<K4?wAH8yuj-L5CUVoe8$ah_R z_USxr**3?$`Lp<Z;engiAN@`5cm8jVd*W>zr+?4&D^K0T`wqvwvyOk2>yJG5!0-IU z*T06pasI<!d+`1%*Sz;U{Y{R0l$}3(5O2u)`S;=a58`$C!AGBd{m;F_{LlFOckzAi zf8_D2S2{Br8pl0?*W52Zdgb*u$@dr^!|N~Ob^fs{kKX^%0bwuh=MOke+PV4oQ%`^R zC;!X8<+vB{nrz&B^8TCO_5Q#6Dn5_n`1f*@>*C*Eraqol=9E_@fpB!D)pL7pt>>1y zAG_A=QvdJ&dzbtujy=Eg*W9ntALU#w!(BV{a^vWkah$^m9HHzn?L!=;{Jk8{Tl`k) z(95&<+`scV<#@_pW`}WGsc{mw!##-;$&(!Ad3t*HRLUPcd-gw;>p@YF;;m?Z*z5Y9 zEXlG|s?u7&%CmQ3z9*H6)d#$6m8X%Yq>?ltdLbSZ3bA;RK2pi|;<?zDf08HUeNn;s z`(MHbL84UVaH|S=nfnU;aW2Ybx&33qvvi&kvKb}xz~qS_EY4(4Le6u9*c3PG-@aK& zPUAg#o}+{wIs0lQRp+Ik6|GhW{o$yKI}2jIkGu6tqkeebeyKPpNKwTlGWB$-sWf(J zpQdR#`C|H$$+#mCi%+M{pOu9_PXxv5=Tyo;60<x1gZ>`<N$zp(9o%<w|9R{!_>{^U zMBuLxMc_AEgeM0Nz1+e2&O&UIld=8;%Sax?3tpi7waG&$igccnB<~O>2;zB86g}~_ zV5a`569rBb#7p0KzJx_+aX8~ie3i_^_8s4~d&=!^leW&D9eeM3@#!ZYeBkoM!`o}C zb2E)vTa|n)6<eucZ`6epLqUeJ4PpUa4e`mKU#r%t)lyNGNBz+Nhp@wX-O<RCe0)^& zneb(Ka>gh;V|K(e0vCc(;E>wn-$5Urj{59UlJDKV{%FX1>~g~azNQv___frbc>}sh zi9$Q0eD<U()@GI(JdqR{P*t;&nQTrckf4**)syMBB`w}43}@7OT9g|#$?}ZZKqJ)C zqSew$T<Nw|b^GAs^9$qL;77};SR`W_JaK)oVAy|q;Xu7zjCBvxBqCON<O7T2^~)L* za9HcM+FhOQJ+(fqSyE>Z)e=?&w-xay)EIU`rm*US2G#ogIaz6FRCEsJWkR7s#l5vU z)oY5}TUtJGa*)dXRHkFcMvZz)w}e<Sd+VnT-i*0IZ2$FRcDlxtd7XTbdnc^G;u4|O zzslqdyL<)z-Z=Y8fiPM1ne9okS7bsNte3JW-hl?clqp+3Z&0e9yO0PCV`o39&~I`% z&L2n81p2$-67B%IQkGqZ_>jy*1{10Ieu>E#*JL6Zl1f8gHK<^8ecM%u5Y>zGR-M>K zGxVF0jC1l2n$3Ote`O`9+lnlS?w;Bszk9&?%X{+dyU*^d6OaBrm*AvVERM{yf&sha zt{&9}&@22f<&e%AgIHOmne0Bf=o~G2d^WoAQ?BUOmcQIS@DooxRS|q$AAI!O^X?a( z+uFpni{xjyKcipd*16O;zHfDIwo^<6wyscv+h7mZs1wO+MF%|}tK{J!{Sh=c7Gn<^ zDrgXsWISfg$2~};(qK3kuuqDi4L~!o0K-ubiv>ad%}F8>-Ix}MNq99;SB+@Rh4YbT zRTY{^C6_l-8H;F5-|xG&spwi(*Xb8Td?rYIJ1|wXDiD|Ol9iSfE2)zxks7j;m<klZ zTuPampU^$Rr%jWVRFycgrY2S8Af9u2=kxRz=qb+U+T#Wf2eP57lt6ww;qHMnDdFiA zJTN(ngUPlZi+Id86FjV2kmZ7lM;Z(Y?BPcRa=)CG$xxPV{f6h0TVECMTmq@l4PK?U zz7q9r{hF$N=HF_(MG?dZcXelt`v&(gbVqu{;UPa5{Sa<6OD6^$F4jbzSgu<2YDuAj zqUIec#Rn46BvW-&PdCJs95hJkHq*WwuWnJB@`~q|5)m(LM-28&Q{1=d&ygsnbNO+G z;z0;^8vopWDxQ->PUkhAiL_r}&jl?Sj#kJXvPYKw{yCMv>5>TXqA|kDJg#_p=P$Wm z<{scwE;?pGBa9ao*(yb-6vKlIyRk4#ozBe^OYvB~l`Irz5QLyvJDcR|^uOR<?6Dz| zi8>`in~U_I4l*ZurP?2V1<ofLx%F>I%qJH4c}TkPcb|hVfQXtq{}1_P@@+28O>^B> z8iZ_2!hz17>pX78VnNoycX46JV($^|$k{KpJM8A7LqsZQ<z272Ym4%(b7Wq4if679 z%KSH`WUgMZgj8XDej$_XEy<C!(Y~#Hh2-K?eV!K)3q-dNC=v2UvKYU%8V!cS{k^6U zy|GbBZ><b}dHYGHeBa^4X$Ln?jKFtF>~5xaZjoOlzs~i!r^eB89MGXk1logW_)VFJ z2*)hI6*&REPe5R!{CPkN=Ma0ud+~_gA^6ZRqK)&n4}!J|JiYo44mmrva7Lf&U)q~0 z9)nr5M8pyV3K=2hHTs2c&E7yL>caa4cz6~%!r;;KWS{(8<87PgS`l^g5Y=F7hMmh= z#0w6q#T3j$<#|b<8sCd9Sx^^2;7JGXnje1M8dOxWOaL9CN}Y}Szc;RlgxAdg>#&5o z{TBIcuEXq4z<C9Dd%6kBgD)ivScT6_&tVBXy4Cd0&4t*Axt7p@B0vUV_`|)jAUa|% z<-#3Lh$tsL3GhHG`{qQwxkTm6$32<UHj5vUc*D4LbNXVr<a*s)bc;L=fFTIUo<inp zvB>G~ixCkwgOhnamv`D{Tg^f#UF;TdZ#8J~kC5Mje_R^RuWAZpz)cZB#H}-2#{rX2 zkx=n5016@sk8uK^34a++>yWL}&7d{km84{gAVf1oldCl*h#q^IiDJq*y8EY8s!dTu z3wX;gb~E3Jhk{S-;S_|B*?x_;lxiSb>e_-v)&87Cn}w>4@c8Z|rS^NzUy|byS$3A1 z8;xNp+u0+Sye;3?@?}akT3u>;f+o+aw9-_fi?u>j76ih-Q4iwk@kb(5R|z#tCDoWa zHnqoykfPR#$0gXIwzEdQNq!erxWrA5+bl#MfC>`&01y{<Hq=r)Fn<o3>+xIj!*;!p z%ckQZ;-Xj^!bu<~6b7)qRSM|ng@FWOWIEXG0rS8S6tO;j;PWM{5nlIt2*+duXh6uV z-y$FS&@n7B&zGvA#`7`(!qi&yoS_}wE-6nuDgSSVGB5Z!ZARu5@f+Vr!5#C4<*7%H zeidM!)^M4vqarnpt1m7@$-yrzhL*WOeu8|Jo8hjF-M|N=tSJ&NaurCI-#qkk4R)D? zesUtuUFAeh5QR$&Fe5+^hXLk1F2cadmAeN4fSv{b70$DxkDMK=jcTLk7nufBLXalc zYHk5~>y=8(><~1=ND!(5a9wRQ>M@ta<WCOoSsqNQ2xBL8<HZ*tLSEA5#``;K<L!6% zMw%p2D)XJ%nVDu{?Z}iWiDa8rYeeM9xwCMi@%-@Ah2;%jFia?_z0iXsJMgH#LB9-1 zu5gcz^&D((p+%WCPyA3$f-e<;bgx2`ECZnCA(=o+Se5{<pBks{9D(;aM7>LQj^ww_ zj)U15!p#k5R%Tbq#YCX1+%%b15N^l>z2c!6eBE`#K*KNu_-Cxh1g3_I(p#Z?Hw4L0 z{}2R|mGzUFwbqy&W%8^0p1<!&K_&{XSCA)YekLZ@PNfgZrN+9ww3e*z&2IWcuNKJb zFRte@t<4~*`OlyK>hsrQfVV=V2%TrA_e*C!pvL2|TR*fl?$qaVzWMB^4UtxM4w1it z$4+wl#u^YWM>df!?uH%&8%mzSx`gp3R0AY`>@D`*X_x|AHIC&?bN+gmHw_0vgu8Cg zgB8khsUJE30P|9DF-wH(GX2a)5`X%%agg_}zxygre&7elTMr9}H`FQLdi75dvXuVt zZ@k3g7C4Ek@B9t<HTtvA*?qvC+uRB6LGHxZSgVFkcM~xK_sKHSIBo)Af@h8uc^-ln zlc2{W=->GWzL$smLQs5mtlf8c&`-uA0z<_k-0&R_g+E>!MJIq3=u?(LxWZlsh@~au zBusuRmIUxu@~9}Y3}-m`Zva=$jNA8i6`TR?zi<>kyPVFG$VJC;*CW-n<s**wy0%-% zZv%uhXw&NGG@k#}%g86ah#~R3ec0%`%2~K;tUE<!!2WA1o}kPHiF_hmIgxb=3Hp;V zk<E0a7nP1K>$)-Pw--;&cMW=`R^QVqbqqH`3bbH%dWtt&>O6JchK-n}V?<nSeo-yY z#-5=9tbOvIlcLUx*?e(W-{-h1`D$Y-i&acBghRf;mADZ%9QQZ|0!87b6dDHiScon8 z$3i*K-H1>rw_D{=Wmu@Cuo&@HB}~qCbGpzfhRg-*E;l?s96^oQ!fq^(c9)ObFAyQV zFl|Vpy_#E$x(7};>W%3G?X!OsRlYu_KeDj0zKBq)lX`2|u*`djk+ub1Ei7JMs+9+I zS!u6-_x-1S!btyOTb`dgcGI9lKQUamWQvSG=z;_JA@VDn#>Kb`hh8p0qoC#!(1kd? zi&7>82qQ?MP$Fh2S6}-Pl<>~Gx5*EH8_FMH<VU%5m;9JO$dCttH-Lwzc2lu*wVDVr zd@4v+8VNs5J`^hzX9|T|Urbc0$yhGW?sIx)FZT+3xW=`)xrxhm7;W*?otxd&c=i^1 zk69=)1&+W%OXVW7(8yi3B_v+%YP(#mhLJZ+4ViTM!|7~1QLe-T>Z_(v&;=qlDu^{a zZ|IS1449d`Zl+X>C-S#;1l26H4Nn*93)2EGQ#BH+q@wK-k#uB$61)E)_X7O}(2s%K zt~k!&zF0m2=Zh6Sz3W(cdZgFy^}=ifiIrc-4-iiadE{buU*IZ&aO>4uuM&kE!q0cS zc#OC%RJlZc>GmJ&yQg;k2f3fV%FS}i+~Z?oCX+&xoI@JKg28u4JS2)jT#D!p%8Mb^ ze;{%8(LX2gv9`1@?6;fM(7#Mned7G#6DEEET90SijSUR(>}owcinOa75>t*N1tWTC zw7gE#N@}_ib5oLT1hYg+1=VigHwvm#Zs&_M8;cicCgzvOpT}EqzdG2r9FaQRawCTf zHy?%QRL7fAcrTwWHQV*0fK=slCLg`kixqRpSg8P2;bJ>~On;vK1osrTIG($H-{P#N zN(lO!2Ud{D0R{0`FbI&4Cm=5FJaf}FzlEIg#QNS=lY5FhDegu;JR001lnee3QGYao zRsp^C@YJE-ltT=T&<}7s90e9X@TxVycbU;W%uN70utk}q{VXzuCxqFJ%wQ$cQuf3A zagW4LoaAd#=83eDOsBL=r(8;j;}xEmYR1A{!+j_PL$q98as)NI(#$&!xps|;({qN= zS<w`w@XX?#WT`hCH`l4E2mMA02|HB>yj;j=%HYHk^hYk7Id@V|J({L`j3m@dI_|q) z`sp=gW*S<kCX>1L!*Aajn#pw$$Wn3TU^YkS!D{8;rn>F&6-ks5r+W+a!98cDdvhhr zaub7mt(Nvhg(}6WB1MXsq#v0X9)=5@+4&>BPha7l;NHc3ntOHZKY1U=OYm=;^bAqB zk8M$^2vA(+jaE5X<V6|5kC#MVdJKV6l$bwOL{52(L*7qS$V^c}wlE}g8DbOg7a=j` zF_!;jR}eU=3P{B6UMV~uyx^z4|NZZM;T<<0W8C2Uu++|Ia5Q8$gRyx?dDq8>svkn4 zNgm3$fKbR2c}^t1o1eWV2s1UfD{b})i5$}^_Af3SLdZ(Y58p!c2o+-zYgj6ROvGo| z2!1C=hshs54V&m?4Wm%9iCW+G622_Ek5^LpLRtDkt-CI$P<AVMa5XU-adl&FS8_Xk zOtFHrF4vN^2m!)wDPU);rYu@UX?@L6FN`H^wma1-#~epD6~j*6`m{i@d-nC9dzvEU zom?ws5$^i&teb?IM8%~!yIRg1oGVIte~}7NWEQ@wDluOtwRCm9JL9P4Sx`ZAwLv9H z62xs+y+)z(z@Gl{woVc$UvuKAl5d;UTGCTAB~>&GKQanjGm%aemQ{L1Ri}c$F}CLn zMRpqdR<xiL7ihfU4-MTe#wxcyvVBTK+BjF&rkfPEnTbi{1oH=rJAX<q(I4S1a-DJW z!m*`=`G{*Ph&h|12GWcTI9B>3I}rRaL(Iee;%Oda1i2l#0eMHT@UA~04B^hICE($~ zaFq^6qgW6MAL=m?VR%@m1W**%duZ)2{n8{U4g(VyWMZzZec+9;h#2K<Z#znErm0(O z%29)V`+NDK=pLB!^;oXmI*RqOJz3O@EZyHI*MV2!f@+z?>0?+*WPiDg%lO#7^vsEO ze#$}erPegl+#euEASC+vkEkaPnMN<INm}5?a{N?Z7F12oi-~n9BH2r$*~Ch*ZKI+< z1U2op%X`{MUtu|ZYUhvWpJClDa|g%!FD_C^+=qPTAd<RN0#Hua1U1ED$zij*?1m_Y z7#l{pn}5JEFPuMf>hM;p+$=Eg6lKaT_?}I%ILwA7IRtZ*j4~MYm?yoh{2^*(L?m;= zz@Ut;++9z3vex0jcP}v*K6U(u7IZS|$=P9PrR?w9JUShes;(x>N-&d=%;7PGI<`|l z(ph>4`50J{SdWP1x<VqQb$j9bg=nf!3(EidVC}tI`)s0X5<P#M<o@3`y(5wxq`IlB zZ<eDre63tui-~lqsELu17i}1_=0rC~BFGh@ILjWqwcDRh@NzuUt*SbRwp?rVso$Qn z_RK#mijw_2Q@B&m%r{_#AK^yh{<Sk1p5v!Ft_^CEqnqc}D8GTF<?rZbnB7@)>*(Rp zpi!%{s7&B|LPx=Z3!K9w-h^?5VV}@JF?0`5isePr!b)P{aZ0$jOnqa!K4@2che&#G zp=zzqj${gq&j;bk)B6q*QQ<R=%IgW5eZf!^Et7FIPvdDSUhmw0`Z-rIYKMdFoT0k; z%6~XIR~7V)Wnc6qbI-LT91-Xs-HfVK@71+*Uy%8TuIch@SCrBfm0U*IiuyXQYZrW~ zKt@qLl^-7fU25>AcVq1{C-)&EswVAR4NhDTUVr?>3nx^ipVN4qs;!FN>EqscUyMsM zdW<CkT71}<U(V%V%hdq*jd1$Tb$X3{o_iZOge!9>V9X<<T8)FAJ94PZg9jjr_%z{U zX%ktsB8Up2jw~qhW2iC-GC~p$qJS5!0+mXfbO|ma6pKx^-twlWp16MhnN!P)y>6$K z&sJGsiIs;Y>;E0W9t9xiJ{XkHr8DMzGz{awZM|l)V(bD_e2CA3U5uCzuz*Z@lk@PJ zfp2ys-a`e8Sq?s`)tDJg0?W^sT`!n!w%vHQ6LB()eX4bJ9;CP9FUNRd8{YW?(IE3k zIhzy}uj-mds$R;jAIQadC+jSyB!~Ar-sVvOk=+vSbd%PJm4$_D2^5LoxQQI)g_4p< zqR3=K-Woj>*~(eX_Bc_QIWVr~{9Jw5LgKz45he40t&w<Z?WiR8;-I3dZpyuC$<k^i zJ*X2W<t!9b&*76<pLcjA&HH<Yg~Xm~xs)Br9dp*BK|B&cX(1-qk{C(CY3~8f`$hU= z+#>3cFN`C7&@J5M)3_hHxe#cm_8fXy2ejC&=<a$Xq(Zwi2@DCqIQ`EY5o44QGNLdt za3D<~_1%;45o(F%Jtwv{oAqom=7o@PLQ;<)S*(4)3@Wrd=D$E6LRQipzsDrb4nnes zPb9g|$fXIrG&zaMGL*B7G7%FoggOen<8A~Ql4l~kxF^1-&1XtQ#$c25KobH-BtJ;= z(ZkKQxT&>|MoOC*<!$eqK75#D$ow27+TawC<hkUucxuln$9-VF<;D94qj8<=+Y23# zDIZKrqH0k}XZ&ZUB7G@6pUZ*DBJ&Yw4f!ygo?X5Fq@EdCDdN2H(Kn2zXRJzD>r`-t zot=9?{+{DwEbj7FwG(X#)RFeBJCdvrA~ikBwd(cdQc?|TA7tl^^ac77_fGEg_~a~D z0gK4oo6k@H!Ocd!$`jPH@aUX;6W~sgL&g?98;q^+1f;^4ysIc9PxyCf>m6^uas9&i zV@LLkJFQ~AslfceU;waBj3E{<Pxczbjim?6!@>??HZvj!t`<sxdA-mtBC!YA%R+c4 z9+=(~h2XN3W%;+S78;|(OwqI0VIanKEmS9f(GuO8m$iIJQPNaO%?4_3`h-p9R}Ime z4TygxSK72RRVnI}m#u(CmQOp*y{nq&=M~A_s`_@^6I3Z4sCvxS<rz~Z=2Wf~i7s~q zk^<5KeJInlqTvQ;8W1G6;84(qRN@cmlon(qUA3iH_w1fjtg|}5q|f7olB?<dJ$YFW z^+sJ&Y%`M|P-kJNicKlFXY<`>qME(#sYFN6r@6eT8+`n}-if~X5OUbqF_~YVkrY*w z;J`KhWZ85B9ZXr4<)~R$r3e3-N8)~SZ0wDq48xrQ$-;6}W{(vhFUCAD*ua=~#&?BO zR|p$Id~cx};9qiFOay<a9Y0cT7pH0xiYKT@h08yY2t*2j-gbncq=BTFLWD-QYiAQF zGUv%O0Y$FR<AyeOM<=MJEgv&VuP<m)zp8u4#6(qWm1_&lv-6QiESI@e1?0?bAY2%r zPG@YXlqzaa`R;yGQH*)TC^Zk?BgUdqzNjSWCvCFalFberqunwoFWRrGHX13SJHg-I z1LLG-eM78f)g0A|olBj~Q@RwT`tl60yt!B{%^V-@KUrQkkP~I(2uFARX6G5IVa;3M z7Wa%-OVA0j30c5ISfa~FL&Pl!zeubE{IZ${x+yMW>CyGVGM=S{-fTV_14v_4xYuMP zq0^Zl2d36x%)%PuPX^eAJmAM9as?9rv1?)Bdfr~>32tVAj9JnI_Av|jciB{sOtpi! zZwOY<6cnD8&c!t;Gc}Wi*%Ve|G61HSEXBSXcq(=@S+^8Itsqh8juNgY6QcAsPzNHW zAk7-o&F)`6dLgMus$qI@`f=a3N}j2*>J-XXzS~g+B9$uwS*U7QblzNUB>(=$sm{lm zNxQqS;J61@`ZxBarvl!fn!a~QL~n&CFHFhN!r6}|kMCb!^4t4N6D#Wi8~+FTLx2PC z=Kj+-8%ObCu|q}m*)^(&m$$cgNqGdmOx(OdWE2eJ(EBk!GEj?plT$@OWxkA|i^n)c z5|l9E6~cs97C2yyUG_ILiTEK-mSZwZVh@54i*G1kK^0Ww#Ueks5<j^TKe-Y_jno;% z;P1Fnco7sFpS;<qPM7CviRmJix;2W$dLeMQg9(SDQ2t@!0%;)-4XTh9vkQ1o2t7=N zV{m~iFyXRcJ&e7E7riTAs0i#3g@Vv^%FHYFM})nHbC`qmyTcJvscMb==crXkt;wpL z78BjHyXRiFsvOM=@cXE6t7i@#J7@9s^u>~-mGXv|Mo)xDN{y`&)nwaMGMPeNt`xGq zp`|QE)Z+;!UY~{1`0?m)py{n#o;<CgE;=`@VDWkK>%eU$JT7lVm4^yt;r{$=u6L=Z z>MILbbEpz)CXz_hAseFc^9v^r_o|vbyDF0DDL*5ihrx*!bRwFi1GTpADV0b>a_f=G z{ys3DUXGcmY;+XisotSw@+cL(O~c6MZ2lztvROiq&1k5^a0U3v7ht#7xG#?*Cp9W@ zSI*~cDCrOs6)R{lf7wQP2R#513|SIDRNq8B6V+Vkj|laUqzSoux4SL*uR15jIKa-G zuR!HmB9Ea+1Y#Ucg2HX@ei7(R_8mALz{fau=IB<fy|-CqC2PWfClfXV4Y@KG94Zj& zkAk+0Mln{f-c^iA^`2?N?Gyxu+=euW#Lz7$9<sd{E5D!)C(Bcm{EnDRPtP9_Xsbrz zee{pS-gJa_#kn<4Qv?gE>Lqe#BC%s{RdbP~4(0)MCP9fuTuXc=D%ARi58ad%acx;P z%?K9QN*dj$u9IKWm#kqlx;8y^>SQyL9yF9$30f6NYbsHVtIaOe`#dnJpf8((s1c!C zjz>v!1oCq8N^5y*Lm{)vm7Zdll=uV<FQzWX7+^&1EX2{H^EK{|#@P#p)?l9>e#gZb zc-`kfBlDZT@|7?Az-PbzSyPdAy~6<JivA6_Yf)jO7owu1aLg}APu%9YCW*!&a91JX zu@wejS<SQe&z;QUa=dc&J1@c*vmWFtpmFY>{@&ZC-pz3!`{<9q`hoX7eB<78CyyUk zUtVY=RfG&yDPrC}46MPfL_<rTK&jC2GY#0K$|f*uLYsxU0>`o&l-b#LUcgHrZijB= zHDxHM6yAbnAVIoKz3qAuIFj2ACX71aVa&Zi0THR#g>lIMbbP3>Of6YdVz`_gRVrFy z1))cZCsP40m!`FucxPX2rIHMYVwMsHm7~LwM9^t8qmfF{l=;EhY1v%s<t;&-JuHLb zKrkaovov2fq*T;$RZVk)gf&~$`LrI_6}^olmmY8`pu;j5xF{+MSrq6kQAB2J#Io5! z0D<w<h@>hxYf;I$hV3N;NvLLR)pb*mQrwHKMBOyHG=;s=iQ|%1Px7*47>X&F4n^#$ zBvKM-tJ&iI&wXNl1(_3w+GaK<n^CJ;4J^X*$qG7(I-P{$b_aV^(o9zrb;$+P&B;R2 zNYs!(TeBJT7pRV$D(lkty&L0-i$*O3(!P<B<-y?Q8&ZPal$tHnXf?GmR17cKP~DlC zr=ISkleFR<l#^I~HG$@bsUl*#5HV68eEfZ*c_UH;pd9_ov--v+uU63~APYK=J~`OU zpYZeWh#%*^cO1Nl$mAiU;vfIO;q3z`^uumG61Ky#a5~Gu8NxloEy@x>po1dI9LT6$ zw+P=T%hB)1_Qu`+`5YPP1q+o78{KiJIP-3bh<N$N=bpTI-{p2=x(aBKU|j)WwmurM zM0}z&x77%b%l>2t2a4WfnLF|X)=n`|c&3^myqq8*NtW*v0VdZRhV^x5XqFHBi5b8I z@H<H)S(<|DGb9znpv#lQg!$51jXs6w-*u_(h^pzPbgNV@6(GNcszx8lYEn8SCKd%g zG82i`asoM=DtK|*PSkj{G(*wY={V|a&9^lvdSe;Ic0*X`OeK($5wb$+3(-_667@_| zwrn#&Gt()-&e)c0N3v)IQq;H<=aq*OuPa`5wPhC>hBh^CN!i@~C|^DM;UiJqIj7JF zjq^vTG}7Z+hlG^+waa-+6Xj-7R}#(nxS*w{^O_@N3h|jFiU?L@co7IMU))PsCl@(M zIu^)oDOIjYhAL9UFQy`g&pfq|hidTwyg7eVl<QhuMB6*z3?Q^WrN6~J#C>FJ?B7cT zZmNwKb~_6}XBNvp7<q}ZJADk4+awDKD`yjKAO<!2=Z^~+g6#ivDUR`Xs4B6_>Vzk7 z1@6Afje5Cg>fA%ZLtxcf1YJVV66TM9w){|}p_oHY2^m9+Lgfn4(u6u5O}rMQ&6EYP zG6?Q!!$hN?8!=XkX6k}Vha3X=oW7tgdEjc(IYCC+rp|6}O>OLJTE*J+lR<j>OgW{N zm3oTWMK^)erDa;#qLa<egNM<Cq*x5>cmSf;++*;9wzV}~&o15TXX=${dXmorYbVfR z5|Kq&(`3m`zTx`wC$qKeiHN|L9k@EZOl{KklQy;b`DiBDoJpJYcBiJH>n0|aGwDvc z+B6+oH3rM9<v5*H<hAbJM~}QYRbd%rdZ)^l5li32eV+Tnaq;`t2fU#C(8mkuq%U#8 zzkeTv^*;aH4U~_B&9^^ES%V%6inAJ&g|P-VRmc{0E?vDt*4>SvjH-s0xZQ!y>ZF}J zC$bbup(v3f5DL6<<?e-EbJDnd_jpl!;-5W7VBjh9o_7=OGoO0*=il@BH^1@9#l3qL z=VzzUcJnUsE*+Xt=>`*LfnWqJV6tSgWhya=v6D|HXdN=1giri2`76xA@G4889ZZcT z&f>Oul!{Y)jk$|38-o(=RwV|v<L2Z$#7Q#`^KPN8?E-bYEQLgs?BcGvF_KKg1<8wy zON9aQNvT<uNh9f}Ety)83>C{MgG$C;NPDAJ0)mpNZ<)_}F;zgHup5JQGxsv(HC#}> zkwD>zdTiK{4NFU^Rz(L0Bli-Ys;Xqpc&?Z2Xo4hn7Zc=Cxkuz`9R+%8N|9408XT>- z<f-L$DJ9K6jPCfCln;D=Vo=RDni<n}M;)J+(~FUa3FNFfInZ_1G%^M&7AYU{gIZ~1 zit@~HC$gDxMdodo%i$9a`fc?{5KWiBuIS>GwHC@A8ZVlHAl<vI2>Ue9n)l2f@OVoz zmzZz7FR7iID#}82G?y?0Gn#8ivf-Ii%@o=PT9sMz*2khH^b0T^`lrxr{9D|M+<zPg zS1y*&#<tmMAxIvWf|ueqX9*8QW(h!zb+RE{XTTr7kAe5X?_;d1E96bWW}!)A2lH6} zqQgVjU-`!`j68#&F^2Ut?85!1z`gm6>w8z18+F^{UKCzLVe7UB>yK6_>Nc-+VUxrW zx)<sqDi0yO28VVxSi-kWQA9(i^e%4PjgbFKt_^9NpA@w_zU}?Qn2YF2DcXxjX09L; zeYP)<$cYAe!_Z|0mv>LbPk?ZikR&*%lJ&3kd7>i;$*iQ`^?LoEEh<l5$!T&XXvowT z5Gm71DrHKjiNkl43`OjK%uu{i)%subgQ=ZA=I4NoUgEyQ{mi)Z2$A@I_u&tH-~w{P zquXd@lhGO|(=O1MxLL0vF7Kum3o1$)`0BgGbq)YGY=f00$_g8xoLJI_hKR7DzKfuu zY`SLgADn!<GEYU0>7p!7E&(>?J1@bwx%l^e;uBx`zAt_6_q^qe&pdhK`to9@T`o>* zAZ9B*LKoosB=?&*pHh)Qb_T^+Xk^;)8ul)v@9v=XiBm&kDzpqgljH6<Mz}xr6Jn`Y zFySnA9pxl4GS;0TEOs(Vi71S++9G1+h~H%=aAj8B9h9bIG@SEu<n4sy^8l(;$u4JR zG}e9WwxB%Ep#!%OD<ftpO1~9BnH6;n8lQ~@kEK(scxD>8B(=K*6&#|TRCQj-mPN`p zjC2n$i|WGC*(e61=G<;yh<2kIx*zniU<ha*L|RLUteo0*XK*?KaK#oXf1SysieMJS zSZe0r0ix&t#^57CGn<KX4!MskEci2#<+7vI(c(m{M>kB<e^74}6;$i?#K3-}-AHw~ z{=!!lt#~Sv8x%cPmrS`?OJQ_ImLskcRb{8%jY>v$)(M*UuFZieDobWfB~@=!QB62) zI6{0UFBBFHDIsY_;X*0cwrC-f*y|WdqTj-ZK&6Zl95NY0jEb>rF#@l*2dM0?5zEhV z8{_p;NbJ#<Q%zD~15gaPC{j@r;W^CSf%HerX56qWax$8E#W4E?o;tj>d0=gI*k7p^ z3ksX}@EFEsQE&pCnC|SxELMb>KycLCVqkV5ZNxtOFd)uC<L<||Yb_xro16_MnM|)H z@4Z}@uA~#x`L&OJV*BXe;Ab;Xg4jnJqU%X52RxzREDx=q)!$P~#9eiE>d;HiIf-W$ zJH3t+D{gMr^RAc9B!=b;`P`D{C!(`;*Lmv)FJAu8!)M;uQ{bA8vL5c9N;GQB&c#ID z&sJ<5%+dN=-~ZDNU7pz(?gJfVOG+(ODJFcCXTAAFtm9|tPjmNkr^YAHZo#FXn%4$- zq?YLHmo_(0{TDYQ4u)oMH0!uTp#(8RLYuHG->%a0yl@sKZwXtME*v?$chB<T>~y0z zQo`B6$r|<;n#2N+CIf_QfnHN0*|k5gc}xcEAZCzZCcV4H6BA~2{fTulyDWvv4-=LT zHK^I&|E#=p<yfwPB37v&C1zXGhIT+DooQQ>)oiq^xkoFiFoOms?f3yvtFPp|oTmuQ z1=R1=?yP+(*BZ|0yzC#f>DrkSt>kK+JYL!#C`*I=e8fRRqNH~^ys1zbHYR8Lb9v8+ zSYA1iQ`H)g7gUpq+If_(*vt^(beoyVOw;gC{8=976>r}uC)r9?7L$2|+?_wc+JBsW z3H@bf#^&XV`}g!R64|&v%uHFlj!iTepz%rcEmLSTr7WTNM?YW*!Wan)uJ+X9kDfcT zIL|7HBa4?&r(lbP-^t4D>huW3;EC=s-JZZYEcxU`C<S&rIQbExFVlEWN+Ye`4aIny z)%S5iwFU#gFCsC1O0un@sjOae9HlA-yjGia{Fy>l*NB$(ld>4(bx9J;+6<pc`iaBQ z%BYD(ZW6o4N9kQj`bf}(BD_mHjaeD8-z{tEn4}9Bopb!=(P1K}5KWC>xM8Xde^8Z6 zQ?^w*u-)`im6@C`+e8V_r0IIj%v#6KWTTEdHAlehYT1QOB6{Kv&xrOCA_G;@YXf0= zeQ9r-wyr4D1%jOL5$~d@Vi(|z=3)ZFODtM4CgA~06MqoXs-GMu*1;#d`SBzBr)$+5 zrb3<v6NlMKiS?i{xnX1#epF^S3j`>m1wsmr!5~lqw>dDDI@~Q%{VUH23s%v0zw_B= zu3fqJ+`c_4OZ{#WeF7NEn&9q<04E}6KI$%bmsr4*8H07(keJJx93Q3t?C+2$+l`IT z5{MW7VGc2rF|IcuFQ8YuVh`P*EF%!&P-qjoUS(J+dA*X~Jx3M0*VjZlnu(V*`AVTQ zm5drzfL=l(E=_4pSLX{Op0+lhe0>{r<J{JgVYXUXEgrW_EgMt;dPq%8^~##<#`CH6 z+-0Qh3+U*c*A$xQD#_VeT-VVTRLJ>?*cH-qnS*btBm2MgG-6*=5K@BSj4<=2CJK97 z`@V11$wWQZPo_%IsD*~b<Z4oKaw$a)Dl7T+@Y2J{+|eixbZ?4|9AtZ|#jSQ*()SLn zSS7CN;6(};&g&XK9RH}3D{AQlK9`VrDi!iA$9w-pB{3s6_ZO-&2yd|7JUHAeH0Ukd zk8oe*-ZOsZPrU1$t+HzaW<E>=oo=ooQXQ;g#tjFn9M38{3Vt8sG=KpO!AmqSUZtaf zgp<*=#`pmHka-)nL#K2-Y+|$yafT5NM8_obq5k4mUi#jTeD^!v{<>$b-+$%O`E&Q6 z;bL~WkmKG$-eSQyM8itVUDF5nS-}tz6EP!0LuFvj7%qW15WLPRpw&lA#Q0(AaT_<? z)(tko6N0WgUYn(eA<4i7nb^gvV(7J*r@4K0fXK`I&O`~>K@&1IOcrI<zEEYc0%Se| zb$5d8X!!Gu0k78Tra2$ibk%ZQyO2gx(d_0!E48ZYcLtuhH|d@o>S}czV`~a83uxdH z1Di)wt9hV`a>7);7RzKi&Fxq;p%z*>-5GD@V_@RNTvLZ3Q_?Qx4CCPJLd{#E`$ff4 zTQd?NNvc?NID9KpS!iS&xe`S`2>^0cacQ<P{U`03;0S&eALPZkQC3|TMT3>@5`DUf zgf!Xe<S_x%Hv|?UjHDZ@<+D+5c66**>G_?yW9@Ib_u70Lo(6Mt&?6Z#7BjihzDjX> z?QBVE#M8DC$x0GhDLlCq1$U*@bPP=cDoqs<nmAhh^y7n|WDvpGP$S0jn=h)0Jwjif zYNSyFuBML6F0IyDo?TP%GRXe@_H!r`Q$HKm%rl?usm&%lqF5HKnN`H0G-A~+(3iP4 zaZit*cvDVCA(VUM{PvoFL5a<xBl7wNrakrD7BdtT6%`YWs4`+sOvcO&k^>3UGE|yV z&{GKp1$s_+)^!1`6-79-*FXE@6AwRh<NBowr%vwQw>aOOotdiF0^eY&8hW)bHifzf z%4%0%hNBUj4ip3$Df>Mc0S~YN<N`j&FGCZo6K%q!GDSjLH9IuaSVYFyuGZnWK?vqb z2yLSthIB$TmE_BYbYPIsj+K2R`?bT-4w2K671KS&z8Ck!mdtc?B)*JBBmh|w-_r(} zPUMYwsVEhyCVAXQIF`9mRWYW+XXYwPElui_#B5q^rED#o8w4ti_iIfDv0ZfD%O`T( zTwa@%$&My%%_oUAm0EZ8!!u^gT2v!gGR){k>*{<gNFTpudAy9u8p_vX$=G_<fSSZr z|C}HT_O{zFjLcl7W6+MomkU9Tms9PFjoBEAHM}iFbB{H#F5PfSIki)z--3sFk-Kkv z>GHW|BJN2XdEz=!v$ww$Y1BcKq=Ze>761a#<Vv`k3cL?%sG0a82rzUz5G7_pS$QwQ z8sXpk#%G^-<e}|Dd&bqWDswNA7gdHyhAvy(aCz^BC5QxAgPA_tKLI=dgcq>C*uQ`s zw|&K~<QTSojqKnv;I^2P2;GFtLL5$G4h5&Pw<p015|%?%8hzpy_+)gwdccROW+1a@ zcAt~1wgzjNnS)k;5R}EKz3p-&o%AeJLfVm~nMXR&U{6DKD-~(JU8_zNE75YwFD6wx z70E=zk!E-1vW-EaQZkX$n5lRf^LMG0vx)f@8eI6|z<z^?H0#KqHa%2KOHLL0sI~;D zM$_>+>F!D*ciyimUUs%UHCwb3e$3Fx(f6H;{ovL5e0y0HN>U)uTD`gG#p_eOYrpcY zV}8*T)rgZVYWfGSxpr+@@scojbo&&OB`Rd<D>7=1vojXsv32xzc;JaHgZsoRuS%nY zQxh1aJA!>627Tn;Z6css@zBd^h+!l}l%)p|k&qX{URl$kaG67`iH!!@hcp&`*gPay zBT;0HHiuqjtWg(OM^q${b>;j^&m7O(If>x9lQEco;_S(nf&EMo?&7_Nx7PPAp)I^w zPbX~+(~FnMWyXENUkpaQFhuPp@3$3*g)yd3y9qx_Ls-CJiV+e>VSgPCm?%#evG5t| zO#zCAJ|e?oZsH?7Y2A?(rx!Vl!WTv!>_&SrUc5A8@#a#**f`y+RqCds`5y3sKHZ1} zY6Oj_=v_05mc4yXY5GvNC5duI7CUE5wOx!yPSC@&Bwdb*hGL7EilD~x%|^Q+4Qz9! zck_By8$}g`W(JlMksYOEN{SRMb#%0S|C<NyDT0_(v=%DMhZ-p_ou>+u`7=9jAu;+b zOmfYPJHR3oIXF6k9T+llZ;Y@^8rFAbqwd8S<Y=wjWs^}vc9{)=aRW~)7hM<mThI51 z|12*)OsO-snjm8I@FM*s<L~}dBB};PgS<js!IX)C+~)6g-pqZ9{vj9V`r}#9-6W3g zA&OmS_yZFc!ZeG=G$rnbZH>b+Ny;6m&PFS2+9?=fPTH+uQW68u%!=^}NV7B`^id)X z=LI=oW+O}JEtCe!?d#~Rh=aVqchJB4ghayaY&h~2@_*6)1AF=G?!4eae2^>1Y`GS~ ziE8r);Ugb=Jfi6jK6tUe6m`hgI$!J<+LJd8S$X)Od%H^!wD*H+_&xHM<iBBJYn!W$ z%josRT&N#KN_=4N>`XhCl-XtyleYgG+lShKD6QxU?*}XZ?ds8J#N3eYp~D4x!{ARm z4LYA{SXvg7CR70nO}id309+bjY<f_tp3+MoanXYuO=J~8p>a9Dw7P{IS0ZGZh|7z- zX844hK20i3FyRLO29#S^pQV`dCH(}pR_Kt2<zOZY6hVopq2I;i4S^=^J$i7Jkyh4d z=y+u%E3dBBXLaA2yRx3DistmYqIH*7@-f=8O!>)2cqXCKJKrQfiB9u5?ih!CCibi? zG}9m-6ku1Z3c^3uduwBVtxA~{1|A$ZR(+B{ut#IB850m-6zX>OJ{BN^hD#LB3#=He zv2G2B2`k8!52wIHQCN7)6?wb8?2;0lR#1a;8@VY-6y0-#xHQ-|eN+|B*;Gf5u=*vR zL{g%b(7blSkj#P-7fqXfauX|{=i3I&k?E7x-X+Rg#h{FqyN*fQ&hwXatDWf3d+f-b z&%XLr7$Uv}?9{E_R*>3Dw)}Okjg}#M`r6@wgsuua^2W~pNgg0y=LVcNhKWQ~j4nVK zxEq6hxOobb=R^_0Cl4Q70ziSxSvORei{p`dVX+Nuy?nLyqX9Ma1(|56E<gcF2%j`H z_ZVnG+>3PL7!}2Qs%lsXQCyuS@2ua9teB=g50t28RFG+?WGkw566@k9_3m7J6rsI7 zku5AptVZZG>*h0eexH1fUg5U5!Z<rs$QmH<!Oq1A?tNE`H#Rp`mqQ`4ZY$VdC^R-a z!Fn7Z93+F&Y|DaStv?9+Auu)^bRjnUOdfio`jgPi5Sf%R$@Mf(YW4G%O_HbQqO)ke z>g6-&cwq&c@(MOTff-9e+A%fR$V?S5t<p06_5D+2U(Qq8q_l5p(fXEV2{X>C$K-uh zRZ(j3jISR(-j0F}6+k5V3=j!rw^o>&U6#yLDjM5*?nKvHFMGTJ9p1n5hvX6RU(w~b z%y#sd>y|KVChhKdQ)6PQ;4#^Al$dcsR1-Ok;6O&uTzrCF>f5@>SK%Nr&d-o0>)5VV z$raIWPoYEFM+Tdsh?_hb$0A3oYqt8((FidMZA}rUy^k|i$K#8$1<MW+QvN#HZJk2C z>}9lg-m3TZ%uNBeruA-jMpv(`Tb5}SlA^DXHbA%ck`m+#mS%fm8Zyi7l*nHC@3}GS z+ic*vuEWsxW;O+YvoT(#kSyxcAcz6IA?(wv5`+PSE08<e#({9#(Nv>VgsCRseZ%}~ zP+~X?cE@HFNAR6+#3L}BZ1WAcuVSrKV@l!o!Z(1z@q?v7L_J+$^1K=|@_9YRtNE^` z7vq+rL7B4|yIum}%PWyU5T3To3!tER9%HMbtpDZ<l=|kcd<8w^GsiQkIXgf}AGtpU zQ%SMFqStbBp{yY1ali0mTGlc@fCd8q5gvV%(-?96Z(I*LeV&^gPqA%Q$mZDt`<CX0 z-AXYPk44ZGzJc4Cj50^Kt;5^f=MSF;j|7Paqbk&SB4_5Z@Vt1?;m8B0k4_87H%G(L zDH~D7iqvFMtueVXj~*@zOrhT&jEZdg0){9CEYFZ*?%Vk(5shUUdf<-grHD$K^LBg& z!*r~TL0ONkS~*#C4jnT~q;uei$7b6#ZHAK35adX&SaBt~vOdReKmWKmC%aaBbafli zeOC5NbO$+tnZ{zG%t+h+>A3Ykk)H53u#*LveANi~D>XT&tLgEQZs;?mQsm-A%(C;h zQpKEBI2)Iy1~dFNll)GP{1|e(Q(R`8oay9q@ffV(<cWnkDD%*n9o}YEF_I?F&XfaB z*k|nn(2xl`z!W6(+E^-9$qU=vLzR$a^!lPhVKUqrBC1Jl1qUAsz9Ad}WQfEF`dty9 zBu2R8(~1Z81vg*TMNe8Bs`<Sx@?crj7f$KGt{@CaxlA&ejZU|jvVb{$JFvRqdXPsa zRp$quzxsrLeqFHD-K2|L#zMORDGQz1=<x%N(5i{~K=Q91Ilp+^J9J8;3ii6m<Vb$+ z@yFZE%cM-Dy!yLkj5$-z+W9t`*FViUm<~~1?ZmK|-VFMhnL}i~GXY$At<Uh`h-E5a zh{xN&O`{=jO9(R=#Ju~|8z6--Bj;$wyw#wjgR*XISh6)F#i9;2ix-f0i`#XPCeR#( z+7K_s>5T@)9^8m#ESYVd{H-i$`EJRO6X&<*@<|8%5j?PqxLT@ISGEovaU>szpYHta z&J6bz`YA4gJqnap3ve9l-f^4ZjY2G}b~@<G-BAqEa-gmdU}yq(K8ToQX%l2zy+0?( z8vKus7JnZ7Y{C?MfHn=4$f#Vr+fDP)1y#|bXq1TH5uAugU%)P1wq;qq3a_0)cQK*g zzJQ&%q^Vmw_m?8V_e3x?M9iM9CFXvv@DRqbQT$;Y(ea%>ArD~>#>3nNZh5?rjXQw# z8*B6Z838a0K8?d(Ni0YBN4D;|=fvUdLkFj)+D%4&N128W`aO6qpFI&C6Z_{-*@tXK z3<@&w;I$m|P$^^%9oz!c8S7AD%g`V8S<CXEgz(mb@`GN0Seb3tsu!>o4I1TCy<atW zms+`WoY$<QvadBHY7p=P?aq`E`JjUsfPGOUw7VP@Zh#;t71c=dBh54~tdxPSd=s4s zAAU(g>RvAJvf2t{sI8gKFSZm}?}?_~EMbBpO6-I_MfBLKwjWopHIHQXM)x51qtUG8 ztlJHu#lGOLtOtWcLYF<?WFGxK=&lE>HVp)fCS&Y9HtMnwqKTY$K^GfDXKN9bMe#Xv z<M3*z(!^rFHwC||$Z6AW@(OB&aJ(}3234kRvk@n{q|7!IvA7jDDE!8Cw?vJ;QTXIr zo_lLvLNO6Dw;mP-(^`_;yzfNnuVPubi2G8|t^Akdcff~AuN-Fg6-9Q1bw^Bvj4-7H z>^sCwvAdG7V-URW#LtG*&k$UI41?RP_(B%75X}Q~;CP9BG({1zZ%c}Ojz^XmTPfoY ziz1@oEbLZ?XRmn%uz+DE$m;5zA<1~DifwGF7UaQ#j$$~PFG#9Hp3530N<X}WPB&X? zpof=047GZIiFzn9<#lwOh`v*Z7}ExU&ldyLilU!H7qLrT5<Cz&uUm;AHrs7D(P$K0 zxFMr=5)IOdDK+K%!eTM0dk)${0D-W()`K0#HTG{!&&4&x)C4ik%TGLo89C5O#aa}7 zC5Rx>aC`Z<hfO6ERgzQk!*5WQ5l5q#v<7X6HkOLuZf!o64ky>Voj=C|{SJ4WdHJI{ zW(T;9!y9vzVnmZCUcTQAAuCgTXaoeo^nyW~AS+_8CTyv8d*Ly37}^%rwpc>e0%jH` zAT)+6J6YQ*0}is3)BCfESP?&@uCi%r?2>`j6tr2yC|z7K?G$=MuzY$EJA#O`Tq2}) zGR#xln4lrel#%4zL^Ib^OBOT2!Xr{cx9iVecSSUPVQ5*`&_5at8b)#N)?U%kuwR-b z65qf1Bro;pCXyhUNebeg)6r8--BC2KU6k9q^DXjy<PW$sP&@EnIgLy%V9*z^y$f4q z6xE199(Zu3Q=u1!?l9GYGF6~9fIqjBHMo%p&>ijtKwUqs;&Jw`7*d4S9zPusoq>xU zNGey4Ca4{U!*m)|6;nU?*mE!55ars6LOPC+ID6$j%t-C8$bvN!Q@*~6QPH%T8XTTl z)KsUT14BIm#AfWY$>(W?+k=^?^V}uw;y8JRC3Txew<`H$5VIsvqZ=4ZM}s(;HW(ih zz0KI|CfS_FHqOJYwi6yNOu+BCn}B2As(ViE84r346isSLkRyZn%y}?7WI;{};~NN( z0D;5vcG)?$JZQau;@~g1*g;7W(Xz@ix7x%+p-Zsy8en5kEyd8M6*Tl{(oLmxVz_`* z_@DfMYzt`0Tm*M2#K>Nda2^6Ce+c6n$TKn9l;S1Rn6b4&(IA*h{0xF*(&b&?M9^n{ zlPW7lvXRjhl6Hy>#fGywCYmrQxn_w1Z%TvJ7nbPUsAwsp`8{@1;*(#9<ft(B)Sfla zR#DU@6Y6a0;)YOTj7HjLdnPUIRLEz@?_+<xBZ#C2SK1;XX$6^`Br`uW8bCQD_LMB6 z!!MiX2SUK`5!0U$v!-5n$Pj>uDG$=2JGp+iC%}k&Q0XQ#jBa4(feQ%cl{zI+LBG_* zL_M~IqV+Upzr$=)5yhkMH|pFT8^8~hB@*ePyCZE3qVFAvNlR7S2j0`rI*TX<G&_ox zmy^<?=WMxO0CeIB0!$Fc`9}M(H|XBczA0ggL2b`FXGJmE6Oc3(SnP0j{yTXdd-fgX zs^ilBYEcB=Pc{P$9U|Pu!ic_x@n}zlJ1#P3aW}HENQtP4C1TG#fy~SchsB$amhWL4 zA8%mMZhLC@W2i|<Vgq3hD`wFf7#UfXQvl!!`Xiv{5l?Y_!}fiRcVvf(dO9vN+iY~P zP(PTO^U(f{f=z^N@I-VmOa7~D=Iwk-i(&X@23ud^5`rK*5yg>JPr*QjedS0(^OLY} zY%Ln3`;i6D9nE&eZM66CmI~B`(MH6qoxeby|1t7=+zsx?c&h}796hvA1e2ai!H#%1 z8pfsxtg#NQCUC86EQ<}lOj?=PPKj(!AJ!$o3)}Z!T|yx)j{aj1ZM6_PGFLMh2EEfl zA~S#na+0~CVVG`Wg;}bBSGeJc#!Zq>cwcDI2p{8jLaSJO32VzVt%!A(R9<qsmX|>X z|6ChWpsMMMy6cGj8Cka_?CIGAy})}Z*Kz}ZC;kLFipG0fI2Sd+YwF2{o6w<cHi_+> zo3v4j(x9oDPSSFaRH%`jf-Z`3HeQ-)l`J6YbV_wn`fx?}x&bz?hKzK;!6KH#0S5@E zkDh*Bh?I}HlvJaluS!-veQZ|L&=-TyhJwSi&8w<`J*ikX|F_A#^lk9h*n_YSws51I z1bl?Y{>O1(cXoOzk`>qpB7=N*eqc9-@!-9%LID<Qvh^?6H?SKF=!MBHmik+QX0!1q zJS;-f4b|HQN-a5toX36bD;CKmfVk6feMm<1Z72p}=#IzM4bot3%7`Di94(t^6Y$=r zvqAi@u(X+9ZxJJIG~e35bErFihDZBt@QBz6b1xc2kfLtwU!Nb%PMcI^3`EExhI@vy zR*&*jGUQ^zFpSKb<rSeDX2PEc7mv1UUPbtv(3EPD4B!j%gF&)Kmtckg{0;yQ(Cm<W z7V+1RZADXa7LlxDE@-2e9Ob2Er{ao&*R5hA6vh!Lh-Q-4qX)6O6?%cN;nnQSQcgf) z(694C@{#*Ty|_V4$)M)CjSkysuoKCm<y6tt%16_q8yBH@th#P5*cIparPN}>!ZtWX zN9{ZuJm?zOTbXhr#Nr>L5#;SBx#T!F-fsm_$C9~?!frqwuY{l^WXO6ku=dEfd5^i& z35Cd>Po7u`o)0PfBw7WN?Go<T6k9B$p`ei2;l6hbBoXpv?95OGk~?_Noo`^z7Fp(R zJmeJ$AXl*)4J!KLO&){LLOEx~;yIb{0el^_(<*0l^0%0ohIzPVx(Q1ngMnVQEIJi= z7os>nn)eDR%<bHNDN!+!rX*p1knhqjVOYm^`D`RN{d8m5q#o;llOljsn7+jhjo+d# zQ;)lkdo$Z{>MWRw>(|aN3}&JTM0E3>Bbx`{e7l%KJpi?Tji%hd-#5zz?mluKny9hg z;%;?=Elafu^`7VjfU#U;aR;N6@EB|bp(%I$?{1t2&SR_0K8|?|a<ji=He<=ok!z^I zBgTh6%o*Va84<pSeon}PeY|kaPpz34uf-aQB#<mw0|SQ8t7E_q0SHq}a<UuAsT6=& zLrKf>N*YEfb)<jTgxsmDYvuU_;opN&v@!am<DnKoB-L*f4C+T@39JaEVupO|#ETC= zPTd*PDaojTrklo8^+cW8xE8hwgs)2Q<i7hfKjO#KM7LT{t)-Kv8&NY06t8&s3R3Q< zt3(4!$F?FyVhN=<JrcP_jfjXnEWoM9?>phdoE+wd?P3#~Ncf@<VHT?G>?048-vnQR zecN>G2?nVwFU?j#V8A1Vav?X49gVsneL5V$DF?nkVn!T>e&A(@AYi^ah_MA6f>sM+ zQut{NA#f5Tkq(6d48a$UndB?*=dxU_S~DYIUeF(@#<N+fXaP36_E_OrFw3T@d7c^- z;bVml62$*N*Sgt65Ex`$AEtaG*28w~*xT1rMK^-&u%7F+`7Tu*=gfkWNbqJh;Wcuz z8`xW+fK3uK9YCBHMNPP0QM0b9_L~7l{YCK5W!_E%Nhj4>v_w67<ocYfdkWj$jzE{I z<O|e+rvumo>4i4UW#H1feLL6aP0V@(;yX++uoR3##VWCFVq?3I5^KVAi(#zE0<d_7 z)nm*NQ{B*|^(RC{t>gAUw26wD0zbO3xn9zV;LC>aS@gkcLc~6hj_FZ_E=71N*|5v* zJq=N38|aDxa)yt0*Lk8uY$I6~um|>V*fg<mpX6)r%)f9nWl5jHYEnh1wDPU3?>=}S zU6hT4_RV(ez^ZKRd&-_dOJqhtmdP@Vo&RsANfyX&AYL725o=s3upDs{_ye0n5o{8L z@PZ~)Y#N8015D(B_1T$PHJfJEJ85+YZH<{R=5U}UEUL4|4uMqI7K5#UCrdI}5F8-k z0Q`iO8^VMTNlYuevox~wLpD|EVNq&#sS%KU`_!pUUmbi}sI`2))l;NK3b}6eBN!`O zt3i`wC6z4|EI=TY98m;&v93ww8AWgmdI6OPJFU--udR#o^NCFB`lkiUHfl4bX2xel zCH<>t<WuJtatV=5$wvHI_i$lbR+(0im$*;TuVBYRXN*bL3FRJjLsej2hiL+HJmJ%_ zXJxwoe!!K2L^B?t3G5x?l`uE<70XzR%jja5%JYH|x2605gF&;*`ew=dxX++7xWr{& zu@OYVAs)8<Kl{Jsc!lM7XJ09XTagbL=-T}<d^bi)N6gG%Xd%bLfP9apb;F3+n(gFu z%pCy}P^5M_v?<b;<fxNs1o*!nD74KOrpB-#oM#uZk~@tK0GY}xz8%{617vJJ3=U=k znZruAs33D7yHynC4JM>BzO@GTEDVOD5$@==6!F(&Yo9Rj!Uwwq6dW%3VZO+pIZc&4 zag<f4G1HQOr{X5|JLAWOfX4hl(ApaxvQN@?P|3+c0iA6$m-m1<$QOkr?fp+^d)D}# zpD@jGYx7zaGYnv<CEv|P_wU8D4N-Cx$H?WTe7bKcw|cRaaU{`NlY3uofOVCz(j{Qx zm+6DtLGU;UiSan$2Dd10;!g1!sxK32N!oqRFfYQY$B-4^{X5zk>=yZ0_^!z{!EMaA z{L15pF{ejzlAyN7E0Q?oi`d0iqo(Lb_EF+u#6XUtDI5y!93f&-M9tH^?<q4&Yt&Jq zwixSdU;xN1e*7vn#>O^}be_)z8LxWwL_`-O_W$47wZ=AbUFSP9e2EWH)Ptf(Nqec0 zsMnC9sK;ux+Lc6#)b45@dhLdkvtG_hTuHW8t4P|1+qyAOCv}CSc>rmGv_XRAhySF& zr8aI|8wFw%4ch*wTcALUG<6(11yaPR(Z*@g*aiEY8A>bdqc+@*G(2bSJ@?*o&OP_e zeNV!H&OnvD!Rd~iy3*|QRu077Q_uDJeLlV2O7b<8I;A<B&5(qA!*#~l{j%9kOi+zu zEL4HDkP%V7z;f|Er3$M2_UwazXmX;q2W&ys;_uTH`C2EMk{GCPRrWSGZ9x@BtyG{5 z60gT;jaatf=^Hv`@mVg`Nf=CXRLOMifgj(QP_4Bt$yGVl8V>p!`)!yz!1is)W*fvQ zkKv%to|wV#leO#3&$|M8gCaK^O|(OX#uArK%Fo04Y<G`0QXZMy`Rg(0N$i1F)G^2j z{DJuhI`t?35e#wAsApMFa>MvNB&9-XR6>z&*ETBFF{`wOW#0>ARCY(u&9UuMk*X`v z!jz+0&>h6!OSM#yLXF~5MkBWRAdJjX6R464jdc!J)h&!V*I8R4O^&vsHBU!+68?b( zRNm5{rtvSmS&f?5CDjIIs+`uLVRRH!Yb++&F<Oq2)sH&%71XiEaT2oQh3ScQFZIdk z9cuK#%SY<bkrc);_r~}i)u#}^R<2rbw5n02=*^0L0LndpIr)stq%Ifg18Hto#%aWg zR|@60`$&7c?K~Dfplyix8@VzuY_C5ymkdO(#HUhwEIL+!VI0r!Ih@;OfykafL+yo{ ztIyO0d+dP=cgF42C#&r>-b#$uYNs04la)_n6{x%V=(xQ;;j>s5aJb0$KzBoYs!M(q zQyUiSi11oFFORm`y}>%ShLsg8h`!Kqtks%Ejt;<V%u`lOxgcJx`4Y7mO$TF;0gK|0 z&-6yE!+QjldbAEr2uK>i{2f(xMovQo$l!V^w@>}14K<z1idBdhwU_$(RJ%LiZ1Uhc z8}8ti$BoZQG;>VTqBArxQC(Znh1QpBZ9c-iHBJdlIN7dv<cm3Ms<VU}17WMbO6uqs zsYchR#jaHGQM5XG2UUN(xgjX~ssr&JUv)(*x}Vk`j!S;`&^LxLC|c`KjS~1%X+a*x z$_v}wo*>CeBS=Q6+M9r-@@EVr(5NqMgDs0=ygI0+fqlQ~{4GayUaGCbX{GjN%s^YD zBW<bn3V$V9Kaw1c1>6H*5p90VkYp~S*K>K<U0>y^lYBTCHPF}}cGS4hTy=eOOA2_> zkuZiYVaHe<2Ogc}an(!UG36j0slj5SirkNOpHU0q9S+8f#>xOp%IwZT*QoX|#fXtp z7^NK<f=Z?R-hc^e639cwi8i4vfVmb$I@%bLxWgqkC_|k`#;`4C2y<H))lzC)N<#<@ z9bd~}rPJoC#w5bv$y$f4D%yaN4r`M`Znk=CHPS8Y_QI0Z`g*C&?(pz)Tc_=cFI3fR zS7%!9G<fYe%Sj2$FQ03z#%Y6Sc-v%eXaGABJ3>yI-D3~+c|F|Yv^H%twk#j9*^~-; z%i)qVoIZksVo(-otO#YX7axx4!@Xo)AD#{qy115%_-uF4(=p>hG^B5a{e=I3Jt%Zx zPcKe?z76cFt}h!d3~QatzdP)2rT648PVD?FTDzmlw(>RQCFP$iCoHd6o2*~AIc?A4 zFq|bvx8p00w=2$8>^Pg8KXSLZU-4{KYF?lBKdOG<`-AEWHJi0p>fWp80c*oX@b^ML zZTwu*xn_Q3oPRU?#g=E)-&S8%-){}KKHt{UwiBs{Y(;+F{)LVs9Zz?>*7<bj-*i3O zUD16_YtjBNsz%?8Wn!=PT#R?dU+x|5{Vx7~l^9L@NncanC;Q&+U+I5+AU?1=@ZEv$ z5B$WC6S8icP`-7=JMs&Bx#cG$-)p;Hd4CUL{|LwE-;eQ3tCY;^*DOJZbPhki2JAo+ z^LxyJl~}#(A6Z)Z6x+m|ll-hjeisMy``IF34De&pf3g<bUATL2kKk^{?JPe>0o!nQ z;BI8EA)VJ)55f*gPq3K$cg(MBv$$Mf$CWV_lE2I@VW*Hw@v)@*_ZV#MV$Cv6u$TXc z`EX8K*b-zRqEn7Dw=%*S0bPJ0<pk)z2Hrl6^BYE4$l_;Qeii=Xh;xCtz~@cLUwU79 z7qYzzS}a|IJg20eGmrEImXR{7S^5>ys9@)$dR8ellzs{SfD~X?<r4JZWwp}3vJ}F) z0Y~8HlU^?U8}t=Iai*`69mOv2DBPWhGb;UV>Ay&i&|wsJuk`N>UkG3-=$oX|tWo+U z>jxf`&g1zP2!lg*=!WeAfr0+G#My!+h`jolrP;_;c<f(TJu7`x`aD)*FnI^xW?<|y zCdBLnmVE8g0eOb8cdFRiKihMgzLs8MV~oF3Qg~^IEx-=m;Ea9laV*o4=)3~PxRD;7 zQ7#$s4E*5w44w#U#C!s6iwj_G8%s4=3*MwB*eLAfarPVR8@%By`#Ysl2^5?~44-k# z$m;M3yv5%6Z+N{`dZYBi((9#vF8!eN{n86>oNUTgEtXS3um>;n4EMba=?+N<dhmsn z`9N^YAI_F_dn&zEJ{%W;`ZLfF41wn+hWAXkMQv@1w0CrNbz_#bC*GUr>qqlyh#ebd z?D)uulcQtf$<#zTGkNOtnW?kq&R>|GnVp+|kfHyR%f<cBm*{Bu4}A%yaltNT(>czk zUSyRsQ^Gd4kQMzQ(UHqv<2x6#LT=Ol9LM*t#YOdMC>$0nCs<0I*oB5t`D9c`n&A0s zQ6X!5iHq+{3rl2Sw?lHK(u?WY$FgBH9NNipF+H6Pi?LjYiy^{>ayec!iS#AW0jKg4 z7jg2B6XkcNvm8w9=v+9bvw661@^cb4NZ4RLl+WdIAt80=a;jj{*+MQC6^h2wTv*z4 zFl0?lXN6Tw3Y(e)`#B-yqr#%8;EOL6tyhzre9Xk@7yju*p>&1ep5i-v2XPnU);5SW zlg&?u^x0fi&B1qUE(@;^2~|!xDy*8Yr@D7h1sbZc;ZaShP_dfSg?#mzkQNcYz+8y1 zYn+&Lr50brNg5yln`8MLk>n=~CLP+Y-NjPrWLJ1!*%jJh<vYz-q;9Z~g2Z{A-cfbR z2t!jWMA{TQ1Sa>m6iS<_Pnb!#9uZu$A`}Aei*_)On`}l+?z)^xIvWnD;apcZDm+?I zmeXQMpNNV|4FYg3+^I7p7Z5d>6CQe+#ghk5QQ<{2RfbA9G_VM^MP(|_ck*0RLTOP^ zrA^Iei<YH{T&wUD)H_k()23#!Q*)+cC=B-+!@XK7GH>c)w&?XD|MaBrc9W69bdyCl z{dn*rBtLROX`9X#$#S8r<PNfzlI;qs2)2iZOn(Xj+b7=~B$)*NlX+y~p{#mD1{N8s zQK90LU?+FcA2F<<Mq~J}XL>#>ylRrCg$qXMM8f$b&m;L4(7t1pEScQN7praE;%0ZK z1!}5=Y&G3cQKuCpf_~_kV7*pU2nMvGg<ykLv=R(zMH|78R<sjr)QS#*O<J*nV5i1o zLb@CkT?X=rsOUD3&8TSBnDBIe1Rjro$7aOM!6U&icqG^Y9to=8kzgx$B-jQX2}Zyp z!FKRSume02M2~C4C<0Lps;SEJ6sd{wQwJ0p*;`B#(QXk%N$P<SPr}+BT9j0MNTq7* zf2DvaMMZo+dnCW;=_+FGKAlB1M48ZgP%{sDCp11_@Y@GEDg9uHMn&;Z_Q;+2zirgl z6DQT7VnV8eME#H-3_mnT9)_(CMa6&?s~?Gq!4D#Z5iWxKD6)k4+jxvmQsIRvPw(tZ zs*|WJvZ&TkEuusZ;vlSAq(6jO#*YGme}hC+q`C_`F_rU?9mI9)o;Qz~aR>|I1Qi!~ zD(_=6*}F1Vc<8PiQG&T7)qxJwrbrJdsu`3%<mTa`gmN!+o0Yws$}g!xN$E?dhUAnU z0-n#I?A{+n2TQ1!)r>wAQjtOiase2rAijqr0!FB^w4efj?yWE=RPFb1f*5rKZZnv` zFWxj%%iT*07BNgZ;7HvXDeFKTfohH$&ccBL&Ur?iq{Jw<Mhuma0A-D``D~1j;N3_Z zmmLw=J(b(q@N^np`)^+}qaHM_yjso~@E8>*${eKjvL;Wj=lez6%gU3Q%44Lp3@YZ4 zT&x(AYEb}3_nncO_ngP}oek=}poeJ2H8Iq^=W{61q$ZAa@4$x0Sawh>A4nM45)(0` zpEA@%2DqnPGA<RRB8Ea@@;HG?19kYmrS8f5!KOI*FvIvL)<=4y`ej5N3WX2kcQ{w( zF-^+YQ)-6f50mDJ#j+gxB2Pl(I<s)%ZI5zT6BGR?i>Dspej0TyCI`d-XwGQjD8LkH zEe*Z$3|?z{dOE9-If^N$^_;fL*aVRCKqNvgXuFc(G7ZFVnIW1qyk?1pkU63uWS(dU zxkxnQKrRstAs-_eLb60dNRDVyKo*FGkjIFIkdG4$A(x3J1LSd{A><0t5RxYvLUf`@ z0=Y^wge(#bAxlI<NI?_B`)a;M58@=8mkn$b*ot9Ka2~_MswR%_Q$Ilu2KAE$M$~Ht zMx@s@F|tp(P7em@4Fe<64Fe<6PiW%AKItYs7^GVUMx@&YMx-~jyErs=ukn=Z7LI~Y zTBq;qy>g<Ap)vl~vuLPDzmJ;PY<_PPnJu}CeGy%R+{LOQhl$}(55nxpm#DwRDu6qZ zFR?KbSJ*_cReEj)t;^@KMP+HC7@?<^9M9lDfU)Nm(Zm7?8qvACm??F4y(pDFB`lxC z+hU?<U79dnP51vyu_<zr{}SJNcwYJ*dS5Yo)tsLH1<$YVJsZLN5}ko)UNZnDj(s24 zwPWHq<p=#d6IWOp&i^oR3%-)OQ^u{J|9Tm>9dP$Z1MFL6_e%7Ae^kb+4#e*>;zv)@ zf&n7-$I^S$>jaMROZ4we9ILDGg=Q01*cth+%D9DfDc&+}WkKaw8Mhs9_sCBub7l8R z)^GibGG28cejml3y0P&TP7GSv<{gWjJQ0r{izec|aXwMlT3ue}bBn8m^~Hk5Pp>b= zoc9y=_7m|CpIXt^`S_x~RJi`sls;d`Ude3gPj27boGmQhT+=r*H`cc^H#V0GJQ0iY zVSb1vS|)m^<E6sp*6NLQ9*@Oi{r4wd=2d$rv%F*E_U+rT>-zS}6Z)MPQa{=Gp#&%g zd=fJ0rbuRB&3Suudxg&ywhEiK3QL@X;^+12g~Q^+oX+``)h*L|?#8w4+xljK!(nZ8 zv9P{{fH&8d3Y&a;rNHM-pXC=e3hO5ES(8BHdqVfddShl}<*;18rLV5(SJw*M;6>+| z@fogf4?9=3w>O4+dbSofS2wn|Vq2?g#B|Sv%-Ki#uoOP%u)&_f_jp#>GFxHWjI$05 zA9eyJ@FB%GJBDE$!g_IYHi2TWWzeqUX%3XDa9IZ|V3?6(qKoht_OO3Y%)MADxEJ#f zLQWxd9icfJM+`cKhYIXEIGX}K4?K&-oEh+`<5SVw>?W{TxGn=*gWD$jZXoow0XN}Z zKuig6LR=3U@joh_=zTFgI>q}bFCmppLm!kjM_QC#43d42^oR9In)|StrTiJefG+*T zpdlSHui)rSo!!Cn4e+y!&zE-oKjy&U6rU{TlYS_d4yLRj?c1;m;)@%)-7@ra3%^Tn z*~=-8sec_3P)<Es=VVJxSilNm+&UC`4$@vjDz}aNr&vsiH9)e*b<mqB-ULqev<VvG zifHFxt7ic(!2XH$AYW$>#Xz}pe@^#8*K{A`>~OjqT;0OGYS`yh{8Fm-^r9Onj?*Sl zP;J9To#1R6e;dGi@V5mis9bKqZ3}5pxm(-M;~sFHfdn5V3<iRXtMof4A`iP3;fNUu zyfJ7GTm@Kj;VX<Dj01Qv7V5)-j2f(xuERV+Jw`_x7{;p2kw*yA!dmgRjIeeXYA5T$ z9zqQTJqCfO5=mekTR&EP3}VL(Mk68WahUT7nCut|{sc=ys7cJlo@QrY6lbwI<~#(Q zhMH!PW%Jn5atSNDv)GWgfN|K5Gc2`Wf6D$0t3~j&E-Xi+jkY-83zKYEcxS)4z8a5@ r#|ftU;(M^S{G2GmzB24D!+|m!EW@J)%w#6YFkOZj=t#o&ulIid4ye+y diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff index d01450e91806b0c316af1228ce35f7a31788e77e..5af51de9e5dce95438e1200ae629552f9369a668 100644 GIT binary patch delta 14404 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 M!9ZXiA0U+f1LgoA&j0`b delta 20685 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%0AoKk;eQo&G?1#FK-Ejk$%n zRD2%&;at<-pKSDbg=xGLM$icK@AEr@y6pW8?)}FN)H4n)Rl26RojFB9rHyq-oS5h1 zFoB_7t~Vvvf@ZY&>2?$nUI+BD@U`fFeWG)sDb+5zEEGe2vp73{nQ=_qjWtND%EahZ zZ1B5{3e?t|H);+k<eN>mp}?nBSv{{nW5UOh*Eqv4ayN6)G2?seMjY@03HiXQB5v~X zbaSvg2V%vCUe}XuVw>?Be-rZslow!Cc-mrMVgQ5x%?w5i*g!H6GXhlsYKn({ga86C z0Hfd7*|uvulWp7W^RBDa@#5dxJPjQK2Nw^YfC?(9qM90NsiU3-8fl`L7FubeoesL_ zp^ttB7-WcHMi^y`aV7|fh)GDv$SEk9WQu8Km}QQ67FlAIHP+c+lP$K{VV6DjIpB~Z zjyd6!GtRl-k}Iyc;g&l^<(&^cMN@ReP)x;AY{gMr#Z!DGu-;xDqG&1lc`c3pkL5&8 h<xI}yLN0$_Utg8i<n=F|A}*Hz0000100IC101r)Y>dOEC diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Fraktur-Regular.woff2 index 7eeba377932c6914b32e8e3da14520c231559e77..3874f93e8dacd0b91f5fa57d045119a2b695fd77 100644 GIT binary patch literal 13668 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 CwR465 literal 19784 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.ttf index dc0185a12290672e819e1d62ac9a955311c60341..14390e012a5ad45c41fe93fb6543ecefc33bf70a 100644 GIT binary patch delta 1961 zcmZux3s6+o8UD{bcke!V$vy-GR@UsgAg_IbuFDDt@{$D>5Eg`WdDV)n3C55yStqYf zs7@1iNNkcx97*hGHA%bm6`eTRv`W%JZPlpY*%e2z)|r@86WT1^o;7qP&2-K^_y6wy zIOl)e|Nb@n*+uLJ1OTzH4KQ@pHsl)0{$9TWVEh5)c6$3gzM)|0+W_ZW0NCbzdQi<A zjyn!O{y^nRdwjk9SL74-0si_Lfb`8?&r?3ij|aGGqg2$pVW_8so$R9c9>Aaf-Pi5u zO4;~kIl$*pxuvhK+wYNJ;X``idCFMS*FX47_OSgMsxSz^wrv>jdS<>q(+F@@1i%>j zJ<s@<GTE~LXYNpa^+r#Bck96|8tTw}s&DrVJT*A4<k}H{n|T02sqe{d-_GrkPd z)gJ~143wT_6f|5Rhz@bTdvv4L-^0(~1ZE7p@N@XRBf)_fT#3YJeV>P6L53@<KGr$c zI0`|)VNQU3AYl+AK|UeEA__3$rAd?ll6isSSU0e&q6)-fa7$wtfF!6+aaez93oLK~ zmh(o>@c-nHADgx~79!~FYIip_)Yg=hF1MMDdfmb_l_FLq6o40bV>x-2D#L8HSgZz> z(P}Z9GIUzA$zrt_jn*ik%V<z3RdOMx$#^WWTC_T?CPT>4C8sjKQX!{UqoLnIrAlcu zP$Ns!D5^q@v^t%Ti<&6pM$3^puC7oW&*IDiRwzO2A~n)sm1RY9oL#5EixsM*^e2)z zBw*sL_Vk!kIm%pu#A1duX3G^!BDXA8pOz!S5>+b8Vnto<k_AiGrs&fpMTuO}0%?rM z!0GZamcA8>7*>e2495yaL=`%dK)=Xdn;e^>O3vjFQnChH(xwJP3n3OPVg)sIqD(F> zPM0EO1)QuRODPq_NVz8*j0~gTr1O%*PwS7g=rkz7;Gick<scA13rD*@zKTT%F>Z_) zCYGsYK#>?5Ba=!*0v41E&4D~C(P}j&7!{gm)--0L*`(8IH5zkHYb$3L$$I-^#48a_ zN|K>ZSoYCYJI40F2rJ|4wBH)|hpdk|8obyx#`ur%1!x|1LIXVxNh*y{fiT0+{*uuC zN(F|+nCYYa11*BbjseD~4G>C3w1?87a+aa}_kR^y90>?A)Jdv@IH?#kNW(pL-1xY* zKh!?(Yr7(K^`{(S1@X4cOI^D3RDC>_NDJc_p+K%wqE7;o_SC?OMtg9&lkE}Gl+kB? zVC|V3{%QSueVzVw{Xa5wnOCz`W?f#gH~XdRD>=@b?YZ9E2YK$iXY)q$PUhXqPsp#z z-<bbVK5wWtY%`oN%8f4LhsH^h!!%<0m)U3j_J5Zp!Lr0MU^!q-v<?->3%)IM6~0(_ zd};AA#j+i?`L@~RhnLUT%l-BdJ1KG&opLO2Y;{~&QLrMg;%>3Cc)0kF#ow2hOWrLN zm2NH#t#q&aXW0v7pOst6eXF=twpBY<-K!8)R8|aByiqBuv{iOi?yj0wHB$9u)i>4I z)!o(aRo|}3su`{sTOG4{%j)a3>uN7K)1B*`C+oy@8|p69r_{IAe^CEbgTJofL)QXV zm+O7kdDnN1ZH@bz7B=~t#+zoElbfrX2b=dcPp@Iuw5>VRB5A2_+1GNR<w5JbRzs_= zb+q+{JI(EJ?{eR2D{VW~p54ByeR8c~?Ux<6!_e`3$NA2R&eI-~=gzvyb^E>GZSp=x zXH;}7)BW4$w#{_J*&fP4ilZYBCUW;p{FeqVj=h6e+zmYe-xv9DMX;EC9UAcSphg}1 zvEavFY^U?96Ltrj;~Jz442~BwVRhi>czObzOLPJP$mu(JlRR*LT!BUd?70&%o~H~o zcwje-2L5vHgrDd6oBR}iia*I8=a2G-_>cHK{7!y5{|f&!Z|Bn<Et@?!dti3=?0b>B zk?F{-$j!)9BpeAvNcffTOX02Iq41XQ=J2L)Pv~^$m!aX%tD%=eFND^I;zMkRAzzcP z$SpEOj*=tfFgZkm<RCdf_LF_&H)JpQfRvAro#Zw0E3$*UN`67Mkj-Qh@sf7pCXJ+l zRFMjjL$Zm82(N#AePW_|qI{xsqG&>X?fq+SU)5Zle^qt)(&ZlYcLC>xvqAOWyfVKS zo{YxLifN#G=>7pCnvFekm;n(Sp2HaI@aY_8Aq^sPSOCc=c@A?w;>R#u$TY`~1ry!{ zB`^R!7^1iS40@q2K&BD`V>e@iqf_r<1OdnGh4d#|cl%H1<)C(YJqo^Y=UCJ?1c=rm F?myfYGmQWM delta 2790 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 PR|b0{e^xMb4~qW-FQ^6R diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff index acf48e66893be130a57bb66b9506becef9b72f81..33b41998e40d6bdfbe9e49dc11174bd3f74dc278 100644 GIT binary patch delta 33422 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 delta 33849 zcmY&;V{o8Nux@PI*2c!hwr$&X-q_yQwl{XNF*eD@wrwZ(JNMi_x2v9->8_`1@Mn6u z`z8r2G8GK)RFsea0R{O_q9Z|&{%5>&`d|Hj=KsGasxq;HfcR|uXVv%*MiQqccBb~m zP9Pw@>>wauZ6F{JGMwB4|4cpHNI*bBUjE}S{)eAnt;k&#PL}o{ApRF1AdoR2An@rc z80$Bd#;(AB&e4JYkzoEGP%Q1dEkHm(#XvyZ8bClsY#{J2u&vCE%|JlB<o@Gu{tvL+ z++(c%Gyb=k?*DX>|3Co;4*hCn@8<O%FZ937{Ktc^Vm}eYwsSQ7kLQ8$zcw&V871rq zdt<Nv)^&dX0RjH6GYOa!f{%l-y*UU-D9wMwW)Kjl{tY$eTPH_XHxQ8U|4s~E1Oft0 zEs1x6?BrtppL5863xNduhv?+kj|s1}6kkX$UCE^<9?L7eL^n$PQ-dILl*v}RNi00` zVQGR<j{@s|3(jlo?i1E$RQg-23~Y|+>xY-X@0*L!ssCgWLH#R}E;Ft7x_<3wFxG8{ z|G3-I0t~_&<OR_sFbL|+QXMjABnGqE1d~>y>>~~Skd<fV(-T(^62dmHVwOn+=Z$n( z<~%ZRG7#n*WTyrMRTp~X!*1~}aycf427=~!stX04v)w;6`RNjP@8lV>y{N3e_3}W; zKhvK}upMaebPN4aer0MpMCHenk}9xe&};P?I7wwYhsR&kTneRj4&4wC-h8p&qJmKV z%;4a)29QZNaFS$NmM|y<iz@7@(Pio_<v9P{jopvHmrtD*<@9`?GFr&0@3FSmM!gP) zA<Z75`cuRQ3VD@T81di0r)b{%g$nSxav=1yQFFz?v3T=@l#YmxX}TA|2OYe$=<U%r zd&ubpOJL3LoCVR2>>ihfNp_Pxq`t!i?N{Q1_|Hw9cLs%}VNX~e`LtT|s^k1gm+Nm$ z?oVeocV|GrlSFe`^S-cPjk;!AiX&^mi9?N}OT{^Ly(2Y#t~u7C+Sg$*z8(l=8C;xt z-sq&NYTwpzWIy0fH|^Y>_1}svnvOMz?harpA?P{fn|BF`wiwUGcTf{aT6a_>L-jc^ zc7C1Eq_Lx!VP9`n*l_E0CFB&Pc4#NX`{ak@U^+G!A@ZS-VY$_rLi@fJ80HNDb-bp# zHnA8Z{-W|GXYx~H`BT=8VF+M96-Cj-h{?5y?ybF#{h>E{byKrGUkiaN9Bq~RC4N63 zG{Owi6L2QC?gJ&~b;8vkpC3W)g!lK)?NXAn*~GZ$JFew<#5}^QO$v;<gpeODMwuSe z-$dsP2#RnwX>l+KCs>dx$Pt28pZ(Q5B@?@`B?uwc)+(M%9jg5CV_QI<yGln#R+3El zwlc-GMZ{oDzq3xInj7;~4{5@V-*I7BeIyAz<7{Qmy;%cM{T{Mh1&e6(sn#+}tk?9| zwK7P=QH}fn%9GXqr;a7{KUvjP9NW9X*~`{s#c(hQN5!FnJTqzjfb4k98S6Rkr@V2} ze`NfHeSAQDn-1wV!ziE{CIax4Ctn@LEB3i)HzKE7B5&-yRAZ{k=C%!18ml}wF{Uj> zlEpvi9&J_=Y}*mHeo~@4b~jGPE8+unzJy9f+l$*q&+zaGf57zM+xjb)q6n&nP*-r^ z6q)Fx3RqRR0zs`1IEBC$I5t2C`3yE)K`F=-LY60&5m`crc>&Kqr>c^g(Dxk!Zmmjk zuVQ=!azbGhgw7PRhjHxfu@UjPhpF#S2eP+RIWr|3%XxR^wK`+P1l^WT&xnPR6Nl*4 z24bIbCjAR(@k^t~NSF$_ZN*Fi1Ta}xbFP9j?uLS!J8WcW+m6G~CQ-rAj)aDM+$ooT zUtjsJPr3!iVF7g+Yy(5~Ip5LBxHqqBy}&wn-Lj&)V}iQJ^PGS%lSW;KxZ&gw$r&uZ zOYFFr#d=>+&%u{G&witiv*i`gr0IkKL?`Txji2QtIOma0FCZ)%LMA`dAPVHoyl`;P zSl1x_C@l-C=VBt7?>(PEpkQ=FN@*Wg(4d-Q?i^(+<N+w#z85D+tK)Wzyci0v5Py}k zD)!9S1+BAe8#)`bYRPI(eMY8Pb$QyCdaAf4++kl7;+H6zhtDO-G%7mF(nqirGZ^~x zM??+$kT>l%opTlW(+OncOM<~4WxhiTIi-2$yI;#Hjvq#DyFwQBbt_oYD83)%;VStx zY*wW6HGr3~T!Wbh8JFAgWZ3yJ-%4t)qw5%QXq&C`V+=xX!7l{U>3<tmZ0Kq^172g6 z%;L8xI{N}Gy(<ryA==fPp;-YJYoV)r#w2(H;HDjB_EFyT9iz5#hKwAB8P+sG$y=^w zOMv|Qs6|@x+a6(6y0x~D*2teRagLKzcZO&RI-rK$fy5TSz0|%r(Za?}QU8~bTdjuU z!p30B1y;q$Zr}uez)UYp6aVAsMeNMY`{O_9#hDIz(LkqlbwpwmmKEs6H1vxF521F1 zNKY|xT$NlCEk6MJ``^`o1BKaLT|J`?Q!fjOnNGoi?}KPXqtVU?wl0Ap|J(6>$%##Y z4&c3M*aGZ}4)Mii0k>9#I-nRG>VM|<G*xG}Wl+Fm{6U$}!8U?WU`63n<yvCq+@P^F z8fJyV0~I^SGKSK)*D{F!;N|Ifv^yX~N;&iWzWeygWLFoIGV#KnjZDY!{1Fl(q!^<> zh2i50ot&S9B*FY6E73&R%yVCerId~WfY5$5yS_cw<pg0iBIAoxG9s8OSrn^=2Eon2 zdXCOM;5uk<=eb+anZ&`5jYI5wAn!h;D%bVi+?YdMf7Bgt9#2%OY*n{99E(@x9j{FL zzAm{$;C`m*Bsxv#g|KcFp93A8P4Ue+FuH^8D=>t69QyN@&?{MM<n%dq1@-O`;IWpV zzD1&5m`8sjz1Hj7m^nHTPYjo_%^?jAiLHo%k&tU(uuf3@N7P(KLP|Jp@tbEoS;kbq zXh_-}cUYshX7T4oVN#X)?dMy8a63IsKif>AaRj2z(WzDBzH#Ty%Eu|Po6QS!-qCJD zyXYSe_NSn7;gPXLDl|WYWE4kn03>iJXsiz`l2nfYv2$+DiQ&0tm-I!N>T=DiBZWAg znmp<Uu_j_);Y)<Q3N9<<!GUb~-G1fNpqzK1*%&h^U@Q>>m1zJa#Jn4_G6cgMr3E6! z4GGdN5g91?)2J~cGEIWvFoXMcU|RkM8;PI%n4NGtX3G9D=v+cIWW+)wkkUGr+D3Qf zQfSCxqs+Ew3z0k*qzZ2O6KVB!OF3kaWm&LlQaaeE<zwAhM{3+rG>T20(uKo*0Tj?~ z`y?Go_>dTb$uy?$i~O2s^_O^0^SIWcIpA7l6JqvxJU5%O?GI8u`2_-PLJ~NgL1z!4 z84(>KJ$~M(%G&m+liJM$oE@2}{~DgH4Huznv+()w{!~Spk?T2}H!ZwbY5D!p`{GwP z!>Oc6-Sn78LdxQUNcB~);x)Z@pP$$Jd2_Vd8SSa?!~=cB)K{B9AOE;f%QSi|ttg|O z0KRj4+JX|HQ*Bo~=#1Mw$P@w=i_uz0hFWuq#|k1?0~VR&%$qv_=%krfM48a$FR-@A z)MlY}R8vv7|H?8~C-@kZdLOmBSI*LFs-f2G`HB=tU|agQORqgDxl&&Pw!hw~NaR3K zu+y?4*y!>fq9~HUc4EQTAtZ(zAR&;(xB{hkz@zsx#YUvA@&4fIzk!B`9pS_sNW$e# zk=~28!CbBA`Zd=9&gVrQ6TXt6zb3mWK~HZ`SzcyhGH)x0BK52omMo#8RipfS=;D@a z<^B{mP(k_C_%r;QP7m29o!MP&_}TA;w%)O4R6uQsEu%rNsl6hYiUU6r>!eXq5eL_G zjHbEAA8WsX?Xd9nW~rg1isK5R)C7A6pHDwfxD@1HQAwl*c){T|n$N1$+4!ML8N<Oo zf~p}dAnp{PXzKapUhdFw9biDYmNwTtU7ZoOFl_4kwl6u|PjH^1Wi};VG4D2c>0W0Q z{xZHFtta4p?Iz*J;?9$;+@*Ht@!Uq4vtktFtayGxzJfpB4XD;rQlAOLdQjm^r;o>= zC9iZt?Q`A%4lYuto3%A^Zj)3fI^Ep1XVrY{__&A;qpxzK734YT38NxJ@lfB=Y{|ni z^e2%pgGgY7J|BMK1kw}OF_e%EVd^~<j5!rJ9X2hK)D?vedQU^vNM3_+{wSmRJsz9! z(?~lhJkWlEnm##MMtY~rChm<dby8oAJ6J918!oL15dUGv|8<nuvHJC_=oefWZBpeN z#-^jI`(DjO*h^91CwkBHjfR`-^-2wpUC+Ko{ib1I;2R5rR_w2>jniIO;Gw8R#?^+2 zB?mM7OKx~3hDS~Ul??@kwnM2Tw1}bJ<YIzn4^q^NR77!F4KpbVjYV}{I=83fsJL)@ z;smA$c!`NSx<wbB4^fTFB{8+1T=s9(2BW>)eL7T;k8sBe2|pJSY}TeGl!ep9VwY8Y z3NVqL_DY?-G+4Y8=a}VEVR5_Nttc~bVeF5=5BlddM~Bj;X0`D>9MOTV?)sN0e=P5+ zZHkx|Y!m!NJn9Y$$lqkfV0u4!lMWw3?}_FDP#!j|SU5St#+aS2JK}s1U1_r;sbWBy z31KN$kR3m2pw$^OLnSGq5NHAmcBq&^#5q}D^ipw!)Hm_4P=`zof5qcuz4sR8bV+l! zH~HRtpVBQa>EspaIXF8}ltx`d)Wsc2GAD1EOHSL3Dm`aTinFuyvhn?kYx5)8ULpPg zJRq+Hq_S90?`5VdQ2VN`+8!CQ^S*{tGmkMLophLOGyh!m8YE_STQH5&P!d(BF2iJ` zI1V?JJ7t;1mz6w&{&o8GsOkvJQ~P_dV#y;O{TdeZ_$ZXB0vs0WFv*#?b0FLH{NqMW ztZ4?w^ABM{Cvz9FL6T{@^>u<Vx<O)rOgaKkGLl*z+VBUD@ctuY0&)YkF#WGBmd)is zA1skhE*o9pd{9dIO0cf(KmRrq#Ih6~t{;_JRGfXUUBp)E=a;NDkwuyUx4Nc_?e-t5 zEI3&BnT@=t9-2=giOGHPSuB{v;Cv!jLHGF`VRA{;7Q+$;DQpnyeuy>V><d}|jGNm) zLzx1|`Q8ObVhHO+$lTJ6*2GK(^Q6Y6hEur{{M?iJa~zgw61!)VUt5t_mwYO|Ue{WE z_{XoVL){{A1cda>E{86B9^#%x^#`QGgdZC@9Nnh!L|!`^r`T&m<efFXX|ufUI*OY$ zrXqp|j*Q1QpCu9_@k-9k@qAhUH*VV*Pu*iqZN&a$`4L{DT$5#Qf6LqW9NqA^I(~Lf ztB#c+5$@#U&g$6Mg&Vq+?mlYawOjSBcpX}>$YcRY0hyj;fr|@Wj2R>&r67E)_{y0Q zBd->Xg&7FD-Slwd%R(rt?t<FJwFSp!DGrreTxSR`>_qNOdYG6E1>qAg#N$#<ZLp%* zow_~Ct+HUK3)9`|elff1*90)9;2>A33YXc0^@>nb_!#D#-;RI<UBnFPB%I313Dz0r z{WZDZ|2_JBruNnU(eDIWT)Ijt`Ylo6#g3t<(!ZYo=H5>Jg^<Ba(luC%xx90Qxhzt$ zQ`a6|)#Y9C^x5q~rWy}))VMg=F%1ueK-21nzy9`JrIH>&+;*eH3AtT5L7`0%qoVJV z#4^`!%D^<DAJQ0=Fv%3j0`jG7j_X{{sdBPPSP`Fpp@MtJYE8Vx1=*PoJ$QYLaiq2R z5&Srtyh3{-PNT{=HZuR}HLl-XPDFLdJ(Toim4gh;t_z5LoPz@%M4Qb=J>O(O+D+Lh zR#~yV8GlWB1m;g`w8|hJql!mKXyu!qUFJJ{W3VAWBJY7!O*!Jqyw|S*goE^J8yOGU z*M8Bs0`p3FKD=Ra`GwtQ>Uo+16Nn(eSR2zvH-|eRI4L^hAaG=$dC(@Y3ewnh&SpdL z8B~F|Y^JT0BX2-eRjjIJg<5&S-a1#S$4?vAZbU~_k)-31u*6MUzCBo8AIsN!VuVr7 z#8Ypkizd;83!Ucc^WPz$Cj)s3`Ilb^NARl(-?%|m%S6aoq}g-5*gch>_j2&Bh(0PT z2uoj;Pcu19Qw0gkeEuhd(N}B?cHe0xFuV=rTd)xCAh*EviDd!Uy^^E4NUl1f(NLhC zhSWr9E!7`wQ1RXK{*L^5i<nXsffL3(&yuy%(~X4A76i>}h!d<Jrwtkll@|wGU!PW? zqudBXWg@K%0x6tGDLvSAIO>B!i�fL>XS|lAx3>$fU{i8@jNP(r9A&_*N*@FtxnH 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 F01wn$mev3O diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Bold.woff2 index cf5ababf46d8d4d15ba26b1c72fdeb39500b3d1b..f9b71cbe7420582e03f9479a5b1781e7c8244221 100644 GIT binary patch literal 29932 zcmV)0K+eB+Pew8T0RR910CemC4gdfE0P8>i0CbT60RR9100000000000000000000 z00006U;u_Z2s#Ou7ZC^wgO7NE!yo}R0we>7TnmIU00bZfh&~673k-n@8@<67@TQ|y zZU?A;&i3b>8OZI3hzj(076KawfJgsZD*pdJBRLtO1S<r!+xzW@%q-F{(secV!A61{ zbZO*14wQa1I(DqmHW75$61AuxwqX~I?`wB5(nI$aRNvfHReYgk{&U4Wl%a=+dy3!s zsb4hA1VIoq!#)1x!e$5RC)L-jH;!upk-y>349APDSGs26hyPPalPm(<=^;{F$jS5n z?DwpF?tLHi=ou1Ot9pY>h-!&O@+=;;6mKM-nK<kD|6exk-WPtT(6kWUgmwUdLX4oI zWaNlzO2N1t@B~f|ny^h_xtIZ(TX(nZc8j_-u_k&O(Z@EH<QSuJ&;yAwDT%ipBoq@A z^Y!1zPepzG#>lt&)3?8v_nTT$x?fU#D2?oK!nVf&fKo~%jndBEx}0~HBkJP#j_o_n z*nt9ui;!lC)9ntl>ji{ExBkln*0BIVJOR(@V|Skz|HL@0tn;S1%ImwTvi-tS{q1H2 zDdE5>Omy!*qPgKriQ67Z4Ho_X**>i(Ekbk2Td|plttexw0#W!@)G5jwy6QsWLwfx; z*_SLLE{LorTH`}3`eS`fcdmbWe}kL8zqN?kOCQo(w#&~>m`t<7;+&@rNa?e1Og6=3 z2m{;g9SNStHufPxg+NNAf`MeJPeZ?Xx9MgmhG=QWd^!D`v6Jk3lKr!71q-JVvSkGh zUO>?7-ZbrPK(<0Zv1E)LwjBT*Y07wP;s5{l`~BF&vw01?)3RBE5D95QTWip+pq5Rl zjsB$m{!yk|jj#lXeeUmPZ0S{ZRnv?h$R7b^{?}@CA?=~sh*05mXf#qL{hhOaqNa$= z3}(BFxF%EU#Viqdgw*l>Q`7g`8BnrU>qI%qbci~KmK=*t?>UxkN|!DNcd*OB9c&ux zQrN-r83g!j68pjupq?qL5`*MbJd{(46!`SQ(s4<rT)MO?cPaeb{-*g|(|`Z}*IK>r z&7hvCBn^?&XoNKTmou|({+fTRspS<zL!%QC-J~=^ON5Bux285QKRgKw<@X5Yf*U{; zRbnH7jI5A(b@kOKY>kqAzaQ0NAX#H+CMxLc-~QdZWlSAb_r7&X1-XF)i0<wC)3CXN z+?ZWi3=<$=hL>bXjMvY;iHdgbi#Qj81QBuPt<%kox#r*B7N}C?X?>0Wb){+pxTZDV zr~(10$uvEl0{of>{Q3h-pB*Qf!I*^PTRu)QMoexW4MhUDd2A9u-qgnc%drcwF)jMA zuxp8LZ>%45fxS><iAh`Sw8wtOhVSod?s)7StWJ7`*V+26Zq%(F?X|tWH}zz1?d=V? zO9D&C5{^VDahFIXo)Wd>s+1vRN!e0?)J+;Hose#q?v{QbJt_TOdRYYv0a?o?vT3rJ zvV}b03D0=WOD^~WAH*{-OJ-G~T&;zA4OnHuHamS?c&_k|!WVLid{ueL@qCd};Xfjd znYYihzrFtTjqCpXlDWA7ELReYq_KTtSLs`7d+}e_H+8LU_Q=0#Tkl*BNv2B{W?mL$ z*%kfk3A_69K0#+`(WwU)aLVHwub;I{jRku2?;o~>o~FOQFd|=hc=6QjQ|-0!&;J)B ze)pa9mCqb=*eAAFZH0bqI*3m6e|vXo_wC-k-8cGLU+K$zv5oIvcl%%ZqUYa!>y1}5 zb7y(W`k=mgs)?CZ{`lkequcjyA9K_ZhaI%n9=q+b!*<(@S#8LNR{FqzcC8vY6v&ey zT_TG>=OrRez4hn0FS8;u&X}3u&*a9Tcl{&3?!V5iIPQ-8w*ctXzDXnmYV1Hg&&&v8 zN4S7`HNMWdoEiT%Bdlri_ms$k;Ak5Mocsm7KVdk0u)H>A`shc9M@zBrFNsqg_ob(_ zCb$xY)ES5v-V{W@@MBca1`NO-cUt_APicuwzq$TswP+PD;O5e5LZ?7=e2aQ?NK0qK zfTud8DP}UtSe7S0dN4x#DF_6&eH+6Ph>wjXY1X|<fg<9UCj<jAtTrup12iCNVc-Ld zmllIy7;r?TwId$|QHU0eLGqWuyk!G?G)?TDrSA05BVzu}{v7vI&Kl8pW&NcJ*UpNw zwBe22QTb+>H}OOabZ|8TTZD*RI9wng;Q2s#jmUlnkG>1q0ob~jVE?blBc&PjBkzRk z>(kviksW0*8ndEfPFyQf;NZI2h|4fbGmj>&KhweCQosi(Yp_=hg2cQqn^SLeDTI;+ zH&!Xu><I~eZJx_gI<Z=bb}Jf}QAoB_!XK=&1!)8U&?JwQm~S?v9qTE&qZEr>1|S=m zW%!HA<GB7@emp(m13~MEY{uf`)+YPZZf<h?E8hgyp1ZOqH+K!C!<aCcM*<A*#9Wyn zpN4bp{EEd)s_tpMjO+<`V;@X0tkXKgCjJkb7j{~v-HEW0f&_}-<59<o9cu`TDkQ9y zH2#<XrlclG3^Jnn@VS7o1Y2@zITs8XmgRI7fyl$a|H|{%urV&Q=q7%b=5x-ktLm96 zC?Wx2wV;HA+(2d<6uyC*QFs`Gm+kPe1AcZQz^<bipd@l7D~q3%!~anSF~-^*r4R)v ztU5&4hA7`4#wg;9A;ESe*?|;0k!DvY57@>7g#r?u!v`u$uu2LP5uPJmy$Fl&Aa?bq zr39cuK0*oW(#+N`=PB*ZS~*Euv&YgdVcKo%3+HF80?*ouqAKv#X}e~A6->6$q}#Ce zYzX9^;Pu~5y({afs@;`>bzmEv(;i_k+vgi7A8o%bt9b!)Y-~;~Zz0)4o=5355u^9~ zQT$&gIS#Nr)f~T*VDb&s?(|AQ6$CO-JNd%RnYlWQ7Xq*yRn-ygCQ40AP{GKu4?d{+ z<?zb>kj3OeU2&WoIm3iqClO<7JZU{&kOhUFjjWcxiH&|BykQuyDK&yZ^h~tsN-qfb z-q0v*SXV+PTZ+B7saNUIJHmMay&wZ^%tEp1Qca6tNwdW)olCAe!=P{%=@fv>sD(u! zJlS6Fj&*1048|Z@fGr_s*qh~klwds`2U}uWv}%{{*zy1t`9`qTc}GXEm98~uT*?my zG*|j=RGA?3yY#A_mJ?bZpvDq9uf4YIURS1~c2>Lh9p2#b0&vaRk{?=Iqw1=KJ`UO* z!)?IKtBSWI7ZGL2;zZ4$8HrjwByI?{!I5>P8|GSa9(QdJ`6oIGDlZhvJlvLbrL&&V z&Qafri3<XcGFk>_vV!L{4ofAP%&5lD)UdO@TgYT<x|RSUCD_2w%qXoF=I;Ty5tL}- z`V*|=Vhxp!CLkPJu4MpfPb)^S?nZ<*to~M#8r~^^eK#U>VD*oJ4)~-5&fSR6h1I_b zs`!=?xZRBi-C_0b3TpYD61d-u2t8o+9||)3NC`adMueWQZa!UOC))nAa|s5;cB_)& zP?ZFDf;6a(MXy1P9gSK$T01+^pe`2kjCwl;^XwQj*fD7Ah((hfi)K3(Eq3gMR{w(} zJoFtZr2AY%%J<<E){cYai2&095XW&C(omL3)VdnC&#vEJz{U+@V%|Bxnp*|YH7s2j z#a0=SXkFt@vGma@r=W~`U7MWyF=k`$RJ(>KZag<F)jEPy4=E-RtX^0CTG`3V>KLTX zw~FDoAXYnhW~#}klM+{}1D9pmIQ?+78i2a9)irn@YjY4X_3<^}w?QHi489OoI9}m7 zenZoNV00XdpgbqLy>J@F_GPi0q?m$4^K>Lck-j>4B1?`ai4P^Vk=vK0g6V7KykdY= zLoS^;CUeQHUT8W6Cxg~$KcCMDX}qw&SfNcQM7*c$Tau7qLQHOw85FjfTECFz=o2SN zNF1B??;Q0KM{f<6NK#~kCY3p#6<l#fLU~4^IW{Wu5gB(&WX40vL9LUe$o*Xu4F>{& zU~oIud7hV}56rbe9?9Rym#mZvlUZ-j?{}MeG#bgXUbpn!o}TdmXH$;%1yOXhyHu7F z)}m8Pwxo<KXGul~hsy<+$#;YdMdnM%Bt`NpB}65U6vQzuq)Nq-SR@Ofpx`GJ(c{3K zb`Oqw2%I524DYaz9zHAu{4S>F46!`VGYo^!UA<^$lL3(uSvMs)eZnA@%z9^DHb=Z5 zy}n{?xtQ!C&`MJ&N+d7><sc@jCY2nT#hwmO;5s3MASvvbAD~(MJPlk<TzMgWAGQNz z3r-RWgD_s&EaJlmQbh7(&=^Qdo4)5Ujy(=4cW{b5$&J<nAe2FxW8374NO<27qzQ<D zP$kPDL{m*Zyte?zY@UZdi42Muzg{ixG;IzLR2b^JkQwZ0U@GJi*Rp7(KEQ_Yj#%G> zc*|Qjp$hPPI1+i_GMZsZ6>>~7c}cZF0gfZ+Mgh>tMLI+`;@27g##*WL+53@nLw79j z0eBHfF~_u?VDp-CfGvG*r4jO}4;UdVmqLnqK%jzM+Jtnl?K7U|ZRl`bE+qaccxo^e zp!cm`zS^ca#V6R01vv~Am}JOC(%+#8B)5=3Dt&nd8zqLY32!kT#W&%32Z*k7O^<|b zUdazCFpEwik-2OFRGYHLaj=&gvCdM8R?oQa#74wmiIhCeU`mCQn9HLSAnR2EJjFO5 zsKnn0M<Bw_bgfj*+10CLV6iWq#2GnaSZjB=DHopv#pM78*&{$mAU*QP4NjR%=)eKS za_vf(b#ipECb1uVR0(*@fnEXQK0g`ot@scV0F!urPGvCg(J<3rfutW>J_%Hb6~P3Y zt<`Qijr6o|uY_r!ZD^b!?{?_WCDp#HF&|vNUglBX1moZIVN8QS4t6jD@zSq!F&8sP z(X!2fnUjA4yV94)gXE6;ZvPQdpb8QCLj|f>nr{CfSwku?oXbcR3=(X5*h>$}H-I%| zo^!v4G2?k?co-%ix&m{{DC>E_ty&-Ay1WP!S~1YH=M+%Pay@Ea0sO+Q&T7#px|2<s z6ArLfMkh<c?rI#C)^IwFUp>fCq^5%|r7PdQMRGKog0^I)iIY9!0*H-@gq{@Kl8S>R zgm!SdQoeUDL>U=Usz_Y~P=uB$+(w8MwyXdRC~z#!hBOG{X|{x=AH+s#Sa5R-keR*^ zDcUac@`u2S)wB{9#H6;Hmc3aVLp+Jo11In5cM9QEq(go$+XGi%8avO2{XL=&r2I~O zX)1yc8%&UA;y8gx=^}jQD?~MiSt7W{$H-U=@O(O79|^}lwnEc84tP*7g_=SboR#MF zZ)o!wL}y6(UNIH@Ne|M(T%_nS;7F$_z-}$Eri3mjhl)roF$^is$U(1@<5G+HFW(5v z6ZM$wNgtvXE=JrCAzmi_G|eu|X}5|L+BK+X5J9J{rCt+`qjZ|BRr+}x@zR~n7%F%C zsoCEA$}6~Knarl!4!`sgrA8GrxvxHI51nJEt;B@ze--N*mQ3RMBWm5s477;}4|{DT zsAJ0N*(BTB4Th)SSy0LvWN1iXNTE4Q`asVfVP(wy876Bl7l4Cvrt(gnKvLn|WwEQX z)Tu2ma*W8dXD=i)-@#IfVkB*TEf?H2g{tBJ&2QYykFJ~ZD%cCs42e|LJmdw&Ge{o$ z9DoxbN@p=VR6nA8Xo`H*FKyjLU2uonVu3?<HrCYUl<u@w=wySl`Rpj&x1)O-7%Biu zCI!;7C^5dSAw6tC!xXRZ0?{VXa*|NSJ7S%AT=;{in-MmX!C#Q0i|RMWpc*0Ms24S7 z?xgES)@0`uM2+3vy_q7YCKNbwG!ix_2^D*tO*z2?v)2ju)>>A9y})uPK%Aa-^$-={ z^Ld3tjB>}XHS|@iRgYiku4VPJ^V$NdguI2^K3NNUWk7Ym7SwUKWf6~AwoRu!I$DIn z$pHJI<hju}pAO6cLQvx>E?82iNo?@Ja|2yDxiy(esDKgA@0JUt6V;p5H1~`hJ%@*X z**+rpHq!hm3^bd30+^jkaA^->G-LYWKOiHBYaMZfRZodOUh@pPkA4nd@T)%XEn9f@ zmP%7ivjj15{j^R`h<;DXQ_M_<BmdE-2HrPh^IsH%{vA>~FRz8o*fvXFqsdy*UAmKa zjj-fNC2ZrsO)7}d-g+dWrNoJ;Y_1v+(8TlDjgmK3gxti=kCC`c@FLHu8)F#lXssZ_ zWNyP2_}bATb11!Ve80Vc$efv@o^*ilP^*M#4Q0}|tRgkFs|vQUQkOmEKX!|?q|)pV z`vc>i!UPh4ZIh@+T&bj>t-XX&92L-<>y5cH8RQiZysy>~YR_jXDRsQAvI!N$7Ew_E z@)5eNx8kR{R=PiP!n|2e@>jG{e{W3@4q^@9GgVt5T?MAY)S(9t*7uQ6XK0qTI8=5j zt=;V6ats^x0tW=axT4V=cIU6`{)yY6?Xo%t=-C`WD&W9*`^`cI(HjAWMn{<~d-Pe# zM4$b|5KS?ds}J;AR?zoq?ag?RqmXy54H$EIN<m7z@fX~aSds~!u12n!PwaxzmM3%1 z$2bEEgq#xbO%<CvFKf0f<LE=EWQhMbV9Pt@*0uPg!_1on(lrp;2jfzNJ|l{6E8P?H z3l1<aY~Rn_^fISM*k$k2abhlwz1C823x?G0bpq!8%+q-P#w>~uX9<Y7K?SI1M9N9r z@N1sDaf8w^Bo%!fgKCcg)f;lQ<(PLPt@^==$C2&@Loe{TXU|Tk+PSaHJl!g#3emj{ zF8O=*8$9^*1?X-Ns~!gry~UY!NA@sf#gcXmdpHvq$OX~kNag6;l;rD50Tp=n4AKe> z&`C(2oXztgz3v1Ti$u^Y_ZNH)k~v%j&xz!;W(Xvxus$qpoOq4qADnGVZ6p}lG1wz{ zD5t3lQFW^S5;kX|WgFPNn+7Ij-dX2XRCqB97Bt&0Q1SN&Oh-`cPM`6#9wVLid-(u+ zGfe91?%rxncoL7|@8U|cBKK-GL1QFg%XYicG|Hc*^9s9JU&E#yU<_$OEig`8QY7>@ z0NT!nVG99_J-0`9nj@e|{6k+f^B-nLyB9Mwk~xsbCm?3Hf?dQR8{Xlf5ERYk1E1=w zK_X#?r+_fGB!`?R8dR#g`FDVgczZjW@N1>P7|0Pu<UPAG_bX*1*$_MYanCQNqBHGR zDP{6uuv{hG%hhvW%HfCKBP*hhJ?ul7Sv~r$I)QdC+;tHLA27otc6A>3*E-vI_SecK zUzwafE9b7>ODtyWrsL5m<Y6?#K5Xv~Ok(#S<ba_SnQU-it`TVAB1W0JzP*anrUANv z-MR(Y+I|>m-6g~iyu&=bS=l3fSuCM3@+2}9zn;DU07DK%X8Iacq*Pl4ITEBQi8ac& z(;Y|R&F&U<^E(k=%Q7LOhKEmj5w(=UAf$$+TZ*B}{!o0_AeYkNCt^?q*4J}ro@Q8S zFPYU>>$HHz9drVh);z=R15^7AEJ|_W*`Udb5Tto%UteLodbzF`3D=FRiL%PQjx+T> zVwZ_2$n$ZI>J3-<fK^Rc5yoRKa`4HC7ERez<X0pJ6Ry3^^iJV8F@@KkacfFRTE}Yb z)R1z%Y}KRU;76EJ>dfea&CV~n<vld`{0esa3`Nn81c~6w9_Are@r5siPZiEM{$0Q; zKd6GT7vX~2Y^_Z)S}bV?NN!4}UI+j*h&&i5y#G}&?`f_3@_g5RSicQ|+^>(MWXd+# z<{p5`gLt%9qCX_6$gXg|3*JToD{k&g=g>dUyt62X_ZMr`Vy=;mr_F}qFql#(sYXJ2 zd@7#SN?3{u1T@&grlD{}3Rg|O&V1}Zj~8>Ovz;8vOq&gwAQsIRSHb~3-ZJ|`#p9!8 zKOw+02exCup$#=1qe%8wFDv<82pgSgUBZTAZcALq{-_k(?l1+93{HdM4tA&cZfa3o zkTw#m)ot2)fKk3=HQ~Y-^%i5Q;vBAc*<QwRn#hxJ^;}7{uM{{<MR_TAMl<=4GLBT` zaXyLn4eqk*rWm}BE}9R`nP6x!J!$tnIMVPA?YM?Pr&jwy1lzZq;~Rlyk|e43_KLxM zonWo{2d-jY>W*w|7Q31Pj{~S@Zdrr~G=iiw7Sqlp85eR!Ey-*EqqIW$a1#F<(Sj;H zgA-6a0{GlQMT08Gb9TDg?RVbcn=&Iw#iDVygr!C@o&{{FmR1V-kV4F&?y!MA4{qG6 zT$4VFN}5nX8?KT3r@w)Q8JUX3=fN0ZLnWMElVf6z%(8Zz`9e<0aup^%gDO9WkV-D2 zen-Yy4CC~JAN(}8;fg$Mf{&h1amyaO2wL#Ev-+<o$I?!XY(Q?sUx*X#V9QZYhEpE} zN8vUkJ!SPKjfMr~*aX{$T&klVRa=}&y`{=Le!jNWDy>1TAaRm4G>B7)5d$?!u`{$` z1@euKgCuz4=8R)LH|t>fbm53H62Whkd^|kN<p4ue(b(opW4A7`Cv^xiA9kxqFWDDQ zp}6X=y0(d`58ie;rx(|Mb-@Lo>Pth4wkh;C7+>nT2&w&Qu<!(W5c8{sfIuFv$esY3 zRDKu+vbzR@FTQxt$Xyt4<^0~K^7VFb#+a>+Y9x6ZYcbBIgHXqFtbuh$#^^<;*Lz~* z$wbq>4TuZKg`0yoR_ase#&vg}CpIz!m!rz3L;W3!&;hlvwa+fsKn1Je%X*Bb&8f9? zxlCIY%@bnJClwZhY0&pJBuaRuq{{gEtx3jX<@Sax$BMoys})t9^74YtQ2&&T6xnrQ zs30)xykNYXp#e~KS$%W#@?y?s-e4CMRB2zsy`eif&f8T#64!A0{2IjGhbW~R+P$Pp z1-Cf_k;`}Fk9txPZ-wh_X}C((<`%Yd9@VT3&mun0@MjF7Eu75Zqm!DHqmWHL*oN#t zNr93YXI4xeqy)pu>ivZEQNt+le}jip@MZ@Uh?H?9{70x5P`U!Dz^5`y0iF%m;yOMd zO#jJBz)}xp9`Wio0E%X(uKmC21CTDAk#^G6V`;1D>vV_X${%C_?8|0^@U|U#n~w1y zi_W=(iE!p7rd~$q&<{#kf?|stqA&=~Z1X8xQ)XskC9a9P-8E#KB2B^|JT>X_%*c>o zt~fDQ2(AGPUXDv&_i{IIPkn&5(7oM;YkoGi?kh>OupTdAoEevdlJkP*IPDctb`X|+ zrwJ3YB~Okr*~o*gAlWPDi>pyL$4+>I2Rci$>%0!&U&i~i!dT+6Cnxf*@<t*50CI*! zB*teU(_;myz#0w^Mm3~@c;`dp5{zB|;hR9lm{cUZvZ2OkQZMNTi^EEO{mTGv*y}uA zM$fnzD%;s;)BV-HXY(zuxRoR@QR7&DbAVfw4Jk9uVrUKps>lHGDAty+r(N-qmJn4Z z99b^oC#Wc{QZS14a6Fwd!)#V@Lv2Hau%LdJ(%Vx=MXB97z<6Q<fK(~WdBGjBxeQX< zgb?<U(YLsABR-RC4k(SoMx9Y}lSiD?1fIN{2})oZJav4A(u-&v;&Qj1*D?Im$_HM5 z!$<opkzu2a{1)FFTXeWN7-6d27BND1HkpYebh_%CMgvDm)Az9gOeP*?d{o+!hQrTz z$oAjlctZ@Q*Bs+RegfdT(pp}yQe9TJ?W2kuM$61W9FlC85u121>y~ffp6IOXQ2p&# zD~(}ZFbtKs8;gfw$*K|`seEEJm|fE8J0%2%l5e=OYN|SaQTC&7DAXWr)WOnDBpj|N zFPwAWBkHG-Fv3#sh;h862ak+5cfuX)f0IRMNMS99Fd&fUsA@oO#Hh5!-s=ZNEhm>6 zId%bE6A(Oa@vfW30LubxJa{p1EgD+XieuNF)$ffXmDPD>`9W>PUPjSjB%<VmyV;tz z+v=dq`|>#8AM2fMltUd2#fRZlt=WLE3A{~;%q=5IQ<R-?a`Foj;+oez_>`5(B=Uy< zi6)1`9(?BFaY{q_<f4G_gG`zYVe1j3DZnbO1S+7jC{{0vR)7aTFkPtF1i$Ro8YKpR zYTP>uJB%OdH#eoj#qX^pF97{b-@`s-*DYi&435lOQ$Ei(cT`nv9u9|r;C2?dAyKAJ z3xK6g^*Q)}=s^tJNi%&3kE1jkK$OK?h=Ts)<piCkG(0a3j{Ci_`P7hNfI4FnJu1+F zd4=<RUJHAfm4ArLEiGONP?HQf9cUS>jKz?Os<K!^C%`i{3JuBUlea;q#N0^a`$M_P z%M6TQJe+)E`2}Alw;ON|*c|vZ70__DDg*cHAvK)Z=*t4;YG4jel$J<K-x+qWsJv&L zKpuwtmnj*=UO&1`t%;;dQ+I?CrR7nn6CI{MK~MCXQnoOYg`r$cBnJN_3hS$%Z~5%1 z*m*Xe7roZbm5+Ae<U_r&OqSJ<2a*0NtT%SIy0R0kcmI!o1@Jc#V*#tLw;<J)*7%@9 z;Jrt&Dvl$zMEmEda7UW5MX!9L)JE>I@X2+hLAELg$t*CBZaAh~tBu0p^xR*IRwYIt z7XF771V^AfCgS+LI_m&?fQm>y6@q%yY}Ix3$6Uu3*lmR4PPU0xqnR*X8azRF&nRX? z)R6g$zBs8|2PO;5EulT@F>cVPD+Y!dT~G@XMZNgI0wNi@yfXd9eXZHQVoIZX0b)2$ z)K}^%?usdpnx)S`-F6un^Be^_>B-Ei<TNz!y2P4TniVPiLTm(R<kd*2H~+Oj6`$To z<5J&L8MEXjGz3l3?7&;*ZiWUIh24I$VUU0ZQp{f<*PE2}vW${0Z)a2F|GESG7H!b< z>1m*~m%Ocah-J}(cAYEgY|P6aiQ*o1PhURmzm3}yYPYdkV-PacrX?KWk{U+9yvpY6 zB0;xTv_~Aw61T)$uS0truASI&+G4m_JH&gO&T35oQ(J~qp++;u&$~zu_`$6OM>uM8 zZF%=EnD01jF$S$Z{tHq0Y}O8LO}I4Ttdg2_zk~$s_mx7$48-_N-R6UK9or09uf*kz z`bxFV*=(oz;Pl9nF|MVJYDuG`ndf~|GI1oj0fUCa0bW@v4fRU#Br@h*Rqk#+QFyX# z^B1Qb#x-r3>mAX1)%u{@2Bmvwgl^pumvMWo^+>~a@<>9t3<i_B;S|Fy<);0Rdmg&> zyAVt#q~4}=>6Lk$t(BVHvwG>Euza=*ZlZABWCizc9N5f`uW!lT<P+umARC33E>atr z4$k8!rMzGTM|f0=#T0p@Wsk#8tGwBW^LoqNh}%{s9v8-=R?>SuPUbiR+U12(yoq_p zaLqdrywzYOs~Zfkb~k{k*8!2WD<|tG{X}zUr<`gR_`Zs`OVR-$1N}+GLOveH98%68 z)upr*c5{V?{Kfdvk1Hc8O2y%r;JG+^0|nkBgeXj5&*<5>VhuW5tl$i@cQs5WAKKI8 z+oWjl)4+L=c%BlNc9sU=KpZf#mj--nD;(i^t5+-@C{iUWS)3N+Ja9c3b;ey5Mne5? zo|G1<xqrSv1|@dOFsx-0nS5S-<I7shJh%1o<jm~8oh~7BORS`~u#t`*1oBMlDJt@U zx4M@fe_P5~Yx!XVd&x<9xc&QT!G-NMAlEormwwsW3qbE*;!ANiVVh1egCpTA4@fWF z@Nd}^o_yy^;*J@@b^>)9qrG)rCL(|-U4%hM5$%3eHAFjDrg!7P^&Jo{xW`O|Z+jAz z?WH3q$ag%n^@cI_#m#26%1WI;ggvv^am$*L1zY{CohY^xb-jqt3wrmim*@YKtpG%T z=tSUzhu4%C&!!sutLD9bH%=F177}}=Px#KQU{GD*p(cl+jhh0hAG5=vGk1d0>ZGXo z4&xF*wVaD<{757m2)p(qzT}58!`Z3&o2XQhTaQC2;i?cp4MK!!QXm{kiwFQ=E<wyf zH^|~Kc3)1s-{Al-L8mt8Hb+QdIzP|rZByVpkUlHo7to<Ty9Euqw3O!`lu}Nx39qq* zeNPT$&mexv!b7BJG27ec2;$?>bM7wI!u1*H4ngT~X=m*P_mcMD5%wV1W0Y97xbCuK zaZy9p7?J@vaT%ZTdyx~S*ouZo`iL!1G7nk8;*1<ATLmZ9*N(IBx1h~*Jlls6v{)Uj z2CFn5vzEn{Q>}W=K!0Aa<C==Ga4xBE$GBcA*9Mz;NqmcrdNG*;A{#$$SeQQU02z9Y z=o8@`apKf3Dkhd7!y9lQJ=-E}uar~zHau<;(ll{NgIok`JS6ZJOCHM9e(g@g8E<V% zeH<rg!A0GnbTWyORggR0Ey2siLtOX)np)1m@3!*ClrHk0o~*vOxe0Eb{)D}w{hJAW z?Dm%^{dq`NS1at;c+}f^=f`p7&Zdj<BJ#hpqm^~{P?4<+;i?H@GhX^1v&bAdD_7%u zxFMC-Kx~<N^~0@MIO0yJ@%(tpE*!UTeAiphEb=Sjv1s;fbZN9Q68RTO40EoRZ{S5! zL+boLa8IchlrksZ$(F^dV%^X1HlF!KL%<MoFH-U@V<{R}dR!rYKe9+QGAdO#!NbWF zG^)6IL#S7N!#S+BvU8L`a_(GAv<+$M4fLiJ9PC;HDEZ)$smZ~~@b26;x2tzD3cK@8 zdb?A1w2Om`*S{8ux=K5K#6Lnw>B|Hs+jCNnnmbGxu;98Y-Te>8UXYy<_ZT^3hgN%Q zQjwC{y(vXWq{Yba=449m<WJkZER|6ITv-0hA)7JTdl&Ykd9C33^5CzMoFe$Iwd5v! z%rD`yZSy-*=xa?zh-9sV80}3X40r9TZ)TN+cGGcHIe{%l1hu+6ciWTlUT3W-G96@> zJC-~6hLGvT+^SZ|QnUzyDKo#0YinLkmp;Q(4y6YY5;&AVO{wca+lWx1c|$>d6KHKJ zkj^AZzDsrR?aD+q;Q?>QnYD)9QkVq&cY4gyFR#fsLP|S+pKUwg-d@K6d&{HPi(MQ1 z$|E4~G7=MRN7=qyp0&!_v~|+Gy;J{j<iR$18$$nx^HOrHy^dej+cxhdRHw=R1}o_} zOXVv}#ev6Oh63<7zx3Gb>|>W0OL)0+&ac+^OW*o^;oC~N-0jaYrWYJN?oFeodi&25 zKIhtYdTyOlLe+8w)_}EoJU8C0m9CXa-=iz-l`lMGH(h-JUd^=2yy#y<B`L<1ta`J) zWFYeGNnZwnW+sD<@U8bDp@DndiVrYCdisRVuF0H*>({hyy!y)2d;1#)N17ui*i;-N z-VV!l@&p>zCvQ+>X5_;|C|@5hz%1b#16S$Oa3&`IDNY=bXZLVLZJX5+&^aS(JI(fH zVTx$ph@TjIr~t7OLwA(nuH*z%hWvF-#hj6yvz|OFEt)({R{fRHyq!>~g~UMXugF55 z-Yh-CUK+XDWI4Lbm+vmqMBKQyBkrh&V$uNXboe)hKGl9wuA9x(vQt9bhHzU`_G-45 zP)FQuMiafjw7^!y>TRqltvW+6EAdzDr^PZC-!>w(xH7=OYlp(zQ?Y^DKN!b#W#oJ! zcaGqe)fzEA`*6C}c@aH)1a{dASLH&y#heJVoPrIE0P|aaW{Zl!i6V^h%e0J%9h8#C z__?e454inrCKfX0zm^_V94$t31icO4j?mkZ3<pVRi^PLD!xFhn=CICmAlIrBiJeQ# z=E$udewD||8@0q4*gRpCBSO^YN#>e!=%bGq2wgXQE2~6CDSOsC#r!~~dB$XC0UWfL z4lw#@URZz&zn6R_rG$MwzD;tv37Z&QmEyoFm5+D~+375+xk4<Jt1&(0+Fh6~_VDYF ztdsL8KhSCtOoe{&+%P#S8+MLzueW&v<xfpY_sc5nY&UdlWBgILlpPvjrwfjHi@MiP z4pWx<8`4M^Pa`ys&aYUx%D4rKcAZ!l1iKTu0#4iEC7rY?FWM3~BM7sF!%!z3@Z1Ul zg@>`lwBnNR9?6EOYURnv{DQ0*c$ecJ<PP7l2oIsu+;Of$rQWYbvRfn+scd!ugfK#z z*pODm7KX9I8UeNk!&CaZ!sCyG|2;gS&F4MTp(zpKUO{1E^bYdw?}_lv=j-2}6a<4{ zuYj+(p_D@@j;m(Yb9|TkE|b)td+0P4U7h?Eiq-m-E84w!f}JcHN}Hx+L7|$*Vdqu? zl`$YUfootvUEOLv2hCjuEQ|5=?)K=C)pKY76-guf27}PdrZK7HG#uc~2dX(N=Z`T^ z#kSOxE#BTxS0_-zr(Hm&6dBVmnN`XET`MVX$RUSd!4Qj@LMbk@N{v!+g-Cd)oX7%A z%k+A`vk2JSgv(<q&8!%`scdPi05|o^LFnUEO4!9pwlqh=dN6RnLokxr%^G|482&bu zTHz!n;{P8lWLr3O^}k9A3pf31oj-ULB4(}QSi6he)wV?OGzb!)Mz7%<-#ublv5A~q zmEp*kGh}M*F~xKhe}OsUK9dH}@LZ1OxxS4m5+R)YQ~OCg;??qst3;u=b4N;k#YB1k zoY7hlnz>q;_g@A{{{&=|d<Io#9)Pi;|5s3H(A-TAvw}rPcOD6c;qk)yoH(qsD5!QU zGt^;q8vb*od5`SVhD3m#UgDH=SGQYPY1beoJcKZO;sZTWIhiJPf}gdze)rmmgvS4k z*ztDx8&_Iy;m3TJ<n{mMSZ`aReNF!Q)E!xdn5xhPknv)v1xF*o%QHv)0u$EWqOZ{e za?=R`cmhf0f32O_Gyh5f#$ZYv2>knl1IZuWh}gaz#F0y-Oh!TM{Hx3!V@R+d=bZ}! zfBTMK<tWH%U9<3`+j!Da2vWj0Npc5=7=_<2>iei#^!z0Hp2L00=5ngQ`gBzj!n?o~ zRWI-Zp@XkkweH+|TvDm3F9~w0xcV@9zeoETtW%B_?_SRI)�*o(8sUo#yn^Og$YS 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 literal 30244 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.ttf index 4346f173ce347459e433f45d1fb06cfc74bc8eca..ad0761f431e3147794ead4831ff267c43fe517fe 100644 GIT binary patch delta 744 zcmYjPYe<t(7=FI*n`@?K)UptwMH5W|VR=j4oSHMlZUlA}_pyshTrQ`fU7Y$y5+U<* zbAKuoq=HGsNU<dP5g8GZ7F}5BDguL`qI-OLdM69|anAdk=Y8JuKIi2;4)MRHcn>%L zE6@f3=H2@;bf)RE_W`MgShK|`x;*xji*)`Ba0QkVjT-(!;t(*nhw^!LSB>+9Iz&0| z79g&_Ms&M~UkO}}L{&{)i+y^zb}!+Nz`1n}n`lio`z`_JNsnxY!{!lHIw8`ajtH&8 z+1PBV)Q^+E3h>IhdW(46ziSle(UJkBQ*3r|WARQpD@d<7COU0Z2Tr$<p>9B7b=A8Y zJJ&8!?J$|*&bS(EuHJ6>Auw={^j+YgqxgVdL(g3X)lKD%#fsWsn)9|cCNhT(sj_#* zlV#4jo1Ktj$oZ5zzpXFtNZwTb7d@|U(vRwY8`2Fn!;s-a;p#$n;iNIu*kzn7I#@JO z+*tgx#8UEl`(SBB>8wd*+G=u}0%fUX<ZEffbbU+fxT-p_;5*`kd14XDxH|VQviD4> z_{0AoU%_iq6DOs4{X8b5DQ^nbE`9SB^P2Tiu5UvIPZa_!HSH10YACogiY6El10^;g zA9@@{HBO=x15%GKQ_UC&G)SRDA*vuQC0_Y5cQD4@vA66E3$r;k%R=lH3$g$kW`5Sm z+Sw^q%XDnjV#dPY!oWh`f+Ww%A^D~JTz)1$m7mBn;iF-D*a}V(`%S^?eoK6PEE*!l z6tUEi{z(*bWOFErc_d*piUpM8Q4}kX&Lu^043arx6f6JZ6L>3kD9W!urf?^?@yb_0 d+8oeu9a4E<OcF+RN|ht~<ES%Dhogrl{sqcj=9>Tj delta 2333 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 BEEfO( diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff index d2cfe4e319168499f33686f3b1524addca1a596d..115af4f072e4274fa7b4d2e598da5bef26144564 100644 GIT binary patch delta 22867 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 delta 23691 zcmY&;b8zRq7w)&%dTVcO+qSkgw_Drhr?zd|-P*SG*6!A}d-pf@{&O?)OmfaVPjWJu z$>bzy>;VfK1_Rs_BqTs!pnt^(288&(x_b8i+W%|+|3yKCkp%?Ofc)oG{)gWZ^IBy_ zHU{?pe3~E-m<I?1t}WzSWoYE;Oaub`+WE(!`Uf8HY@`BHdovplNOKVc`W6WS!KbdE zuV0%PI065}M*lb<nEwZ4Giwjif1Qc_8)Fg#iZ{GQF$y&|F)#*!)P(+VIQ|C=Q|E2- ze@+lc{otQX_zz?-ED(j}HqP$<c>e%q`7ao3ML&UcYdfQVJXNNDzJJpLLqzC3da^Na z|2M8GG6)2Ki2jL*z&a3YYz=HoKp_2pfq>6}K+ss*!zIG@c23S9kio`3A?ZJ4C+e|o z+B=&36aV`CPv`p&5eZT6<L+xyUElohmeYyeyRVd#R9w_posble?&Bor38F_08%;cn zwL++jnjvBmxhBU9A5(TyY#F^?vP}R}o)D9gf%86PSNgAqiVjbS1LNJ$llYR3Ew3dt z!iBd8q7!5hUjjXmaI&?^0I<IDx%3s;DsHq&*X}*b(!firuO^7?pK+a;$j@}2cw-41 z+@Cbxi0XWgS<#-d&x&D@W&CVWMK(l(lsiX3%u%5YU68~=IV3{6<-2}?p)<gf$ct`Q zhSkyf1r=7f(lME?BwUh+D(%$pM%89^?v<;$gK3UBu9H*4<_iwHc<=sSiakk`2Qkbc zx@%Kh>|(z!vUP$P^2liXXQ$*Urh};#m5@>LP`3s#J#bKG^KrE7k<pa3Q#{d&0hd4H z{*hFKY~st-q$(<GFAp@?b0bg`fC`R<0}>nEmBp2+)S@XWWnGA`J0SZ;Eyq=;c*Ef0 zOR=lpiGHfG+_6}b*0u~XhHpxax2#^)gwb+9&>yG#e2yVKR=q8R=UU=(_N}R=WQ#Gs zXE=7_mx4)X>FG}N9qvdR8D%|?vh#sv^2Lb<)mVXRX-Y;!37|70ivkqj!YgsT9tUyX zf>sW$7cw~s0QY_Wx0xIP-}`G%-ug6KXI!Vbve8%yTDbc=Cjn)2RMYm&)oP@zxUaK) ziI6!t*G||zlx1EL6Gw^Yv5KT=*=uze>WaSd4+SQji<#q3=bZT`JYE`W9bI30<NGN) z<*Q$w9%PMVw<#29CV)!4o8+i2kB9qGvMiD~yYqNF{?q1ByGD&WJcr&>HsjOCVtMxz z059lvdoWt|bVUi5Q3SxNMs_3+2qLQTY-JjqP*!<l8nRWvpZ%o-+cla|?TRI)m-xZk zpdd_@GTWPZ`StPKu$2bneCjkV&N}puy7hd*-+SEvaaxXkz=nctT&Ne4TomyLDihi= z#xe|Ky>Og;xObowd>F-;1Pq&DT1LIF?C@m6Als_=rp`bNzAnV=$^&hx!bXehS6^g@ z=jKbiI`P#?d>ru@-DC&^%lTt|j_jm!`yE6SOu^1M5-LmS7H1~L@(nS;(=}DFXIqT+ z9(}0aF9-xLpmy5Zk!j9lv3#j<AD(ypPNOxMkqept_|#ls5>Ya)osudEEld)Dx1?{V zZ?^RNvCW&%s=gGZN@duABV0KF6}qsn@ONyX<RT1uuX^Ge8p&Vn@o3YHIvfRORB(n% zeIBphq)@xh{)q-C4bBX|8mNawaIu)66Uz+ze=P8(01AU_qgT78`Q5(L)d8OeGAD=n zJ2}A*5V4e0t+5K{?#=lSd@ZGM-uK27=Yy2FbW|}fqi4CLj9&BSfd^K*LW~UvNf%3V zJ4l3LQ|`M0=oC5tf-IN&F>46rUJ9&9mQuGg7c*PUtXPn(XV_vG1G|r?gYp5g0Rkhc zm;#&(0E-1H1deEi<TLyrUr)+4gr#SR{Z6vW=eaIT@tMCor-N4`(NFa!np5Cs9S2nC zOs?QIE%-}C?ej`#j>qXR+LJz?>p^e#*6GINN|;e1Qa`k4Kdf=<lVbv`M%QLRVa=19 zkRt0{c92484J(nnoqO}@b+{~4&>5qR)b4^F;3(wo)G$@TLjsK|NpHuIaoTy>6tN_s zl8sdHxf+C5m1W0qtX+}RqRT^}qkcl!ecKVkU~Vf}NVR!6uOyQ$Pw95H5@w=2ltn8V zuS#!I`XJvpFXCfSrC9`%CYFNZbEj}#tF5@(IgCr8kUT#mUtC{CIy)-N%b$p9fKN36 z$ZvWhQkN)`K((jGz}SNA9664S%hF5@_ilI$(!>fp^=ltV{c&~-wZ+AmpwHIQodqkw z^|WTjn5JBy&vqQBC}HG`veXKaJdy+T-tFqT^RT{@q_fkvv6QlAmN?QSD<qdxYGJ}> zMkcBkrJ*XJ&C#UtaDHL6Zj@x4)GMU|V8lYc5c0h(?yvpiQ@^IbiXX$~JyoNBk#&zl z?9uXI>AG@?FKd|olyOnBoTw&OaKX`l^FPe6CgABhpe`@la8lCPewM5KdG6_0FKgJv z1O~2vB0_*qTUh$mR%pLTiLQepMTvtv4|=QP{2@Z`Ha_~*&@%KOl{8+qUZy<*$nyT& z>k08s&V7#2bJ_-5YDf{Qxv}qL$9+3w+yHI^Q`x|a?%RVjx~`_<jc4k8226e@_ZD)0 z!TtV^a<oWNNm;D!R9_}{3l~`-w788p<>=~5lgs)?KJ@lhnKS!4L}I#vx1IYwC*gBS zsB>Nk+stR*a`)BEQx1G(;uq~Pu=Cb+)ft<0IV9s}@7x&?wL_d2<msw1Z*)iorfM$~ z5oC)hlS>vxY{EYDMk+P?qeLuSJ~rnH2O23V8r@NeVq?y|xSYYk6g*P^Vu});>*xbV z#`mP_%qpm8M(&#|#rwLIeBK#^YaVvH^1DYm){co3V{w^!*g7V@1rf$5Fkwpv%c@Kp zlETe-#axc7k+?;&^YI{oO)=Rh-DF=tR~!^iaX>@Mk`g5e=@agxVFj_}^B<z^lNr7w z_(7%q7h9JfmQ=Lt<FGYI^&XahiEEc2o`#11Czzk^Zy`Ut>Sf(h0eUghBrk27-&xK} z7f%LC1Znt)uc*)hjgMmr0GZ8=n*L^4WoG$O-eG(0rzKaA=VVl^=yzeaeca&M=OC2u zkON7<!%ClFyHB2I2@Kzv&TcsFTRAdu)7OMmUK#K79|B?^YjWGr(5$}vyV^@T^)jg# zS2O-jghl(NnV)w~r<)6r)$9ZU&F0bsEssm2+=Yr~O)1l4oA?T}fa|;|qH$4G8Evc3 zCv_({Vt9ffBUUmOkrk1dbZ$5-o|QVf%LqgYs)!7E+_r2}>aRV|EDJjzJfwFIJ$)L< z3c*k7bVC6R+~Vp|#JC-BOX0Z@hZN~Quy<XT40UhrgcVCAgCstchTFcykIP5SrClr+ z(4baxXi{f-*mJK2R!&ig)D#H3J4Of{l#fly8U4M>^QK>@kX0xh!YUWYq5u2omMPxA zi&q$CrP?CmFs}aww)n||o07F~_1l!L$Z6khrm&>(9jz81(C=d;MZ_U}dv)7GCPMeO zMHX{Z3Lgk+FXTlUS<DvqV>>%3Do2CHyVOI}kg)32^k=gMXa+_F%fvz`$12ov2l8Hh zkTa?nHlIpLeC_GidEDR4C@UWLQQV4pJ(w|KaNw5~58TfixG(5u^fdV(|4T=ki1k^h zhrg<db{=2Yel(;%Gd%-;2%ks#(1&BRBZU-w{%ah<x5BCn;)06W>-|3Qpk++dw;u{A zDYGixubGAqOn3Ly4RrE;_abF2y7R97&sr*;K&`-C9ZsAP!r-`v$2LHj5_wj};?32Y zkfe6*3>hc=Pup+V*eH3t>{w~6{}6xew@?3-I=mScbyXG(@%Cj$*!CkTNOCIIQu=OQ z)jAOX)Ahp33H*r1iJ77Xt??<~5P><)5BzmOO3geF1Rkp>IT)1meuA;MJbk;mq=X@r z!nQ^A$NRQTCd7u{_`TqVP?|gk713?v_>J^+Z%zh&jmYW87EyqsXUkB~e038LYr=fF zs@O#r2Yo5%V(3!L%gH}ih4m-Bu{=?3g)MkL{9XbyY6GVzm41F-jm^Fn`ylx$)1Y-S zaT}tX2W+mkfmFsDZZ95t`>)Pe3DZAV!)8)PPHms;8)g@~H)2u_1-JzCm{e?SNR{M9 z?vgCi#vO+XS+l<pz=dXJ|8<lNp(`mx;~~L@kDlJry_M<<Ba8~4XDF>PShNTciH|C# zj0;A4+wC{!2FN;it%P3(HYM7)yqL7cevB3s1E~d2QUsS%@+W?t<%rtmY=a<fQ8DXn z{oE=^Qm4vG@+Z(}{rO@L47aBAkz6`vdv)mDkhQOM3i5U9`^>dPEDHg#{x<7g@6a<x zO_~N~^<tBp2={&xHJ&v70ThbZ?s)}RkU3U(iFl}~6F5f9RhuHKA51jD3^HBht^wf? zpuyl3b6*efrmkVi8?DW-pZ|>FKG->=@S{MJq9wf}V)@lkewQx(KD$k*f(@e^!{0qr zy`ER7_IA^ocSzLTUYSZw8!a-{f!^D~IH`mKLDN3+s!P*BM=v{?U1i8nnaEPU;E$%< z>YQfhmQXl_S(7xc3Y%P|n=7+{*nCJ4koGsF_)P10&D6rwk{s^gblUw{LQ-gdbZ})l zaN}6D`uSKyARcE9nW|yRp54Wq{A&0c2u(Y%VAiVmQMI6<Rxzr$zr@6RV@!O{)?C`a zZudcr&Wq)O=w*h#12Rh<V*idP4HRzun<g50yu9=i2Z&%g{8@LM-~9(e<QIuDK!IrC z%OvXHI;1nV)*S$1S!q4;7N?Bvn8Xr8C9Zuv3s}`RE<lr2B~U>fz1)&Db1Yb*Iv_Ea zAcEe_yR<^tzP+tGe53A;QhUeQjwpsnnjh&2)wuFIFY^aSEGwxnq!;N8H|D_o$v(d1 z<1hfH<tqO^a;HsU1JgoOvHh3^&=05Lmsu`_dw0btt44uWYnJ{FE*ow-R4~=^(Lid7 zgPAZ_wcMrp;^5MtlA3JQzD>>qoS4CP!k$JJxR0#Zg(?=PI6crYs|*pcqWZU;BHsAk zv&pW`L>(hw82DBc^AI>-iN19TbH(FoOo~!1yjngc5SVZGtfT6)miku#wbV$?o`2NG z%=Veb#-zCn5b}7L0_|=HAW~KdjIwS_tU&kv!vCpyHwDAGAROcraxo`RFE415DcPnN zsnf-0jq)Ul%f+tB3PuMQ7$3c^8Du(8qkQwZ<#&nL4T~#Glq8J1Nu9>pn+xoqz=S{9 z2#O&h2^Slk&gqK7i=S%;gq5@qO3Qavqh?!omC^5c^fW<5mp2c(kM}Cf@^PJeeQ(qX zYf}j>xBImr{t#79f#~ewu|ay2NyrjoP`evPNo6Fj`M=LtRl5YSIC@r$gXd216aDSM zyp7%#83kxV1T?VWlh;PwJBY<ylMuYW{Bs<=)1b%g;FaLq#=~3ypZn2aP$UfzMqV>K zpzZ9Dq|x}e<-V~rY{tWj%1x^tuU6RA(y_J@xqEuN%#Z02FTWDMXlqlDRY?(L%&<$1 zl^wi^9{44|UO;*j_G(z^3nNCWVXKfb{1kJhrX^!GoFlz%C*brjFg#pS^!T4dO?QVq ze?}RmGd-~T*|`S<Be`>oGrD)yrRtsqH-Ol{rPPIp@XZTJi2a0;c8Nek->2hHiO|vG zQ1|Q~qs<0`BwvQ5y1O-VV`!d*i<P>9i}<Svv0;7o)NAPjm*NSG%LP4}Pex3{)bgV6 z8zu`Qqq&yRENG4}sYG~YS`FwYDU2jWQ8QRq#S=ZDse^!?qeeW&*pS(*7lugYka?Su z3Lf!_hO=e=fVi4TiF=WZGu3rDxdT~<#;=`2GnztnQ}N2&H#=sK2vyr|-x+gk%9(LI z9!aR@p}(HfgNUqR5LoXXB#g3<iFACVF%jb>*J&iA(a5bPZKf^Fmpk&<Idqu!TNAhY zK7>i{G68Vn0m6d`7h@@pa#w_Fx_YI}K9dU+q-`pG`}^Z8m0s-Znt{Gt8U@%rcdR!P zo+PmPo60OwONL{16OZ%XVgx5}*x&B}f$dg`#iX4XB6qY?rpNVkuosZr;F?WyHrC0S zsR^ve)H*s9soPTa7|nq;u>NKgi^Df%uzTK#QUWO>=_m^WH`=U8{L(N9seD^Nf8a8n z7ODPI#dj+3ty&o(7$NjKCt-{Q6tez6WKf3~_Rl)MOsh{-vbq-ur=B1S<`QddtkE33 zpYSSZOOE~Z2rSS}G_3RZqw?E9H>)kQL+V*an6w%Qfs0IMH;>iKCqOn$(>G<5XthVm zDj;jIvHqoNDuQ@8i~r%IxZN9eQu{8@jAdxZXMuz6ATij2HA&h<dG0^4jc02H_M8Ir za&wLICTsP^@nH2%d)w+xLrUU@lYpDS7ptrA$di*z>F+ty=y%~8573(^q&Fq3MnQR3 z@cJQy6etOlBd^G^e~9EUFG@Sy<1X8s$beC|AtNQC6Js{QiA<hwAu&jbp4$qjwTP`f z-Y=V)IeD_)ytd)-%;tCVQ8q`TA?#qw?l$kc*p{{>NHtwU`z9O5cA!bC`yvDRjUd0B zCzD`$%ViNKD(7m*ukmy>%4qv7!vuNadX6{B#2seS_aj%!`jR7o_o#3l)s-^09&kyg z-*%+z+0y38DbLo_i8)m_cJ>r8R5NKF%{+Fx1~Wv~7z%(f07>n@3CrBD2^Sr4D;7!0 zCL%AeZ)&b&T1~=Wkg8y*JQ@jlpItCg>Oq~^&${Sm;&ca-zJ?thx%zUt7v{ZG2JH+y zI}x;G6BC}{c==zm?aa2M&HCAo10Os1juD(Ns1)(vlgkMKEG!pflB%G$6?}L<`vO(t zI;ONsn7==(2q7K!x&zJro4Hq~9Kl^O+?pT7t-{gi4iXu>08`;SnRX7b9R{)cW2znF zNUURk+fCF;B#`sJG()h_xHhl5I=%+uIeu?7pe)!3D@{u(Z{Tw#LknMs1%y~=NN*lD z8h<4Jl}2ExyB=sWChK~uKpdJsHMeQ+K2#=%0nv=qRuM;rn4#4P2qZLK<B8qPiBaI$ zi6?kgspfRHx#=XN5WS=<e?@dh35v)kgpO+5N4YRHdh86R0Hr4(H8`1&-1b3oB;hsE zK7rWaT(|_*us7vvqEMhNK#D4wy8mk)OQM;PZ#(kWBWm%DX%qiiRg|i1JmEvJI>@&i zGL_K&uIrpgbay~tmjBef@B|6UgE#n3UtDeN8#bJy?Va=PNwlMtjU-=JOIFaf#}VzE zWwcCOc;c1kQ6gci6AW+m(3S6EI!BKSgQsx?#~)?(L(Et`rdy;M0Ix&a0oD9mY^NQ1 z>B_;Za_Cl;p=WVU=Nb)3Z@J$n|9&gf_455m1zamBc%i!TXd(Hse{7(XgUx=MpWW+A zkde|tElHlBVlhYGBB$6d<T+DH3ZmY3|5UgBJ?2+o!~DBt06{JC+N1j+h+87(WC$^U zq94>+XiiFsj4k2;6rezUuSF)_5KU02Ac>G25e{Nj2%^Y=qu6A*M40?C3Qff<9X?yq zCBdwh9UB8%sm3m>+Ee=V+_GPORgpyS{yu6(nCGKA`Ls%E`=m8^<J{Br9qdyV#SSjH z^RoY{_<JEcIQokndZf2NwL^6VmornwK>~~EASEmK4m98gq?0#<X{#RQZ<>aLs9KTL zsxo4UCdZ2!9SvJo6Xm64<Yw<P(^;T{K;?Y}4swb@$NhW_B=+YzPuuU@#-nmMrAc5! ze6RC+-KnpbDzV7zXg#5m@m&Xy9&KjkLcdX|;Ggrw6{(IKRJe;}M`=Z02zZK4MzQ%7 zsJ_!8wmvNaqs`?p1uu{{&f9%WOMizvSR_q{B^Nd;h!bdJ%xBcW!E<2|XvJ5@f?m0# zAYZkTe`C6HRH9E$3SrJ^1yc@jRygjw{r>89f~ynxqyNEvmpIA8rh~vNQ*N3S?Zn@) z#f|;)vCW#E!So#<m(QKVLaI3{y)|`{eYbBzIGWA`SUWVn74=FGcEd)1#^h+3y9kiL zh$!47NYoj8y#JV!FfHWzt33C^!(jJl%F%DXM=Zhk%y@zPLuyg3jc1QeB(FzC4gRb) zxPlvmA~GlngQqP+r_50Z6TxtL_w^Zcj7n4aZ5wUjqYkIp#WW#Nud{ZL>ja#?(OgZs zh1?VZLj92Qn@_n3r(GmoJz2wqSJNuZMlUL6W|6RrJTCS;i0D*I=vnF16c7EJ`ppXp zfR@Nz9^2E@kMh%b?c^rys0>@A@_0C%021)`%Y4?@r!5!D!<8EdR$A3kaBQLl<J)^) zy4TsZz32DE@&_Z00XmI?U=qWyP48?+vA%wQhxmBmik0A_d6dENRSh2oGQ~H-289Nz zEQ*q)uA(`FWFX&P3xnL))3E9yyS9ESJ04709U@}`ZUO$`j8{6k4GibsdSv@Uw9zD~ zt1fbKOursHO?+v0e0HimZ@CqZd<`9vqC=5Az1{Y1eLxS(^AhSsk)y*P3oC5P+phsS z1i2Z&-?v0OKL~U4H#R8yI|aK>>Vh}rkE}Tu6FN>)^@I*sFhUmgch_6&mzZB<C8Yj{ zMB5-yc;iFFepu9+(NK>b&M=1H#o&?d4D_|{{b7sg8`p`gM?PE`c^1Rp46zLcAog#u zw2;tYp#Pv`nYXSn^GU78@;m<Rb1DVQ5ZTOlN$<)xQ%1c!=y=PZl$q#|RM&T;;^1yX zlVpx*)|>-SYik65-3$lgje?7>>xi`C{kA`R69gIUFRG$q{MbcEMq%x9j-SS2sHGE6 z9VXq7GDiu#EGZ+O7qL&Lb(+j9Jj`Lgcy}+qSQfMhIjr_fD)?MuL>wHsx9tURe-l}? z5&K4-ZBZIY+cmrFFOw?j#lYIuWdg!WaFj=6B22HFg)qOTmKj+S;hHvPdwOwxNF{(V z=pm&pk7_)TC=u1ci3r%^JrFY-*^LCp!NF$2J&F)JMB*UKvVD-uJ=E3o&p&Bn|7PSG zuum_f6=-vP_+)jOvh8v;@2&^dJ2Bi^^5qR|17ZuDi|$d-#8T#RccwJTDmjXgQ99); z9z#PlGxtP}z*Tgl7A6~66K290(Ba1<I)6Knp5Si>_eZIhPcE~F;}{^Mq`cBNS6oky zlHNcX$<BiGvrd?G4E<^b6D~0~>LmQ<uzrE~J7+Lu8aCg5)JV3aJE;H^ooSmG(X%!( z?88-MF=bp=nfhO>uLcV3`ovck;&;7yo3ieSkAZPu?ZYr82}*6!MNk1h>vu!*QIeu- z6`jKD1)>x>=kCKYF3V1I{3EXek=SaN*GccD222J-<u=XYE=2T%Uuu+n7{Z8=)Ph7b z-6APJu1z`P&wmuEmDU1G*U5pIxqOGX^rw70Z|qn_C^i#D7rY1j!-Wf^78k`I*~)w4 zCx<ai@LKSZKJr;~eC-BDWKX_nWte9EKj(gE@tjMjD<tpfH?-M{LBP1!s(>rG`4(kC zzipg$%uM6)tB+Y`Ph+Zss8Ss=on9wKY5i5-Yje8YBm1YkC*}Zbe=`E^wp<I;<<NL9 zLn%vL6oiiqIm8H?eqt3fWlJpj*~U6oF0ZHXcpXZfjL=vF;w`N1>w7efTHS8v-E;Wt z!#CRO!xu}j1G^S?^j=<{S1e&LBR8h*Q|3_I+|>-Bxwb$9aO&mgN>nM&8Q69DLieMo zwrE(vWFG$PnI7PM+Ix%8P?dA@Y-(77j~jc#?YDL3j5KNb2(HFH^H!>N-PvEa{u-ST z>%-X1l5r-fet|bU_nyz)y5Z1JpXlc329i%2sIc?HDPCxFbu-w$eFF8=(cqlq*|=U= z{1!)7YCM^q^@bH4(fAINy42CVH(n=3^<pXLG+YX`w=zJAr{#D58}_i}-~ad?&G@7Q z^UCnJB4-2=dveZ2ZCqWq{l};|{G9f})$cMA@6DzVe{;0zh~aHiBW39bOS~zY%|-t8 z`7f}~_Eu~LZ-P`A|F^j^rZ}>Xir>B5KpYF|3pvZE@V1GBF&F8u+9>R3%-{5KSN24h z&{5kJ`oLB|SFm<N`jtotd{{j_UPovtn^19=>a~r68Vc=GIzK*=^qUa<iSl>&1!C`s z@ffhyjo_o1!-mtq#jdqFDe4sN&a=g#@{L;swcB!PG-N-So$Qn#L9vwpEQGCzuZH`1 z0!^!A3CD-<Vt>eI6C`;?udSjk2h8wCV_sQ*JWUAzuRZabXsYU82YNL2sX|-{>R$EV zm(8&8Iuu+hPxhU)?q>}Of}h7P>1{`DYy{GrqT?-uDWtDVPUm8dUJrpu(ZZ)qmF~ap zMM3kW)kL7K>@lDH`<y+|)|{#uj>Vwv`{T(4LR5;s64pFsY>YkE)YhqG27XEo47%fs z-X~VT%F^{ao)o7xD^t2M-BcQ;6Cro!(1pKNhn_3QEc?XqThCpG2Mw-)2vfz$P2^Ah zcLGtzi8->v{|NmuxBbFIeo9awK{giFyLBS;7Uo9@GyYOnMRJveH~+NV3nb~j!g$<z zQkLTppuA^3bLxd_n~QA4eZ*h&*kKd03TF}lU<)(XAp_8*s09_ckZ3tton(yH(Isz$ zgOLA-q$p3x-_2D}u(*w1^P1cfnas~f1UvkW+9D3lrL{Iy5ukFryf+@O+&?JFXI`!& zlWZNl&+PYxNSCQ+B;2dkh(Iqt$m%NjJ~b*3v?6#z)F}Pyct~RL78P`<FVaq*(C_mI znB|cL<--ap7W_<vichM(8MWE>B_l^N-XC9Gko@nd+SQC#Wy+HW1=cFSy5A^8e|iZi zZPIQ3al^(pnUG5<?-oMGO~tV#v4=lYAn<-Ba7s%CO{Z!va#uxZxK%5w>B%O(N~6Sd zUO9Ph*(bYB-<viBYVijZC#FM9jo@!+VDWP+*9(9zzNAPSEUc?Eqoe${b%q#H!oL&} z#PgtXbNybR2ck2cp@Gcj%$`NMyj`1C9I0ZzX6A34z>Q!{LDA^9A)M=~$;?^@Vr;Gm zh~{;=(k^r1Dm2j|uLc-*7zcPOtv<#4;5YLHA!2c;xmq0w(sjwemF2b1&8{Kf<;1l( z$#tNFV$`B_rWHbGJuX@5_1KCnd6kQ+QT(yu*HoV{4B=&+5)@T>_|=bu&%4yS^A-Xz z8y*v--48{2*FTzEsIKfu5{8^#G{Je!Ih*fScB@uTHc=H`@4tG@IG=jgLDb3&*<^?- zqElWMnbgIj4)><RYo;>DWZOHyka5jUENZH3T%b=L1&krGTd8wpyPXx$A9m!$rzYH! zqWp3mGXhmp>tM^P6&hwK3@C8$?vJ5Za_ydblN;v!z89bT$@OWy=dq^}5ig3;NF2G4 z0orKi$8iy!?3k|ijq!Y>ue@*nZA>4T9c|q!jEuws5t1E|NctI8ixieXa>y@F-^1G_ z;i#gsiJ`)SlV6$;;E3kNh+OcarFiJ#Qu?R)b~mTsIQv)-WA3Tk@xSGXaQB1GH!r?n zs*m2@Ig!@8F0G)(uHQN9<SAylHKT82+vY}8z~J;!hLvaShg|i2OwRm(X3+MFf6{}^ z6-dTF8TKZOr-pBALwWW9uFo75?AVq!GjrreE~L0H!xT(s>m1kpu5^)YB?MoLVRolZ z{@S-*p~JQRT`M=AXb~K16!Em7jz<`Qc`!FERbX{Gpz{dxmSc4MYBPdPqmaCy3O0ao zk$^7oKh$6Wfyums$|;J*&miAu*s6PK_mFWGzxmv##qU<E{7$w5T=|}Rhweg`Q!z*J zZYs3arcf|6tD(K91IYSxk&in9d5X`-pva_KP*Hqj<Pd$H{3)d|nsxKNMc!Gbj3tcE z{cIIlW^pUCyu3KtqSG3#07YmfmGC#Z-ShQKIDGx_mHLX_ioDmH|GYWyaI4qQ@V=Vx z6ryHbEt1yS^IY2i`?2BTVs(*1$FI}L=?mwt$)`pf&_K~<SnpL8{@>~F;pgKw3j8B` zJ<Fx?m`at(=AK7A*6Ar|GbdY~0N=&gyIBQyyc>{5inmQJsbg<+0}=C17-GJzJq<^= zFc<rCNVf?~8ZI0$BP#VkAl?zth|iUHyiH`*ZUMH67PkmM;B}Bcu{E>-9ImWw>G5_r z?HfH<c36fF;&<+c_O_(Hen(wzN%4RZ#=u}mjBz)*gnOP5bfk>@SYd20vq>2k8vBV- z_`?o|55qKooJH0+!bsvVlw>YqDKk(F+i|OD7=v=B6PR$TPBM<FpPut>vN<6T$l`5{ z1?Tc|97+f3^~8xSD_?1?5k*yqLu92|<`DNwmd>>H9r~^rcQ3PEl=HEo^Gn#RUgD*w za9m-)9JeZ=UzizDozgoy%*_0Szf<voXU#qY_97vC_)w&YWDv>5{a7bqmYKha^bd8O z36KB1*Q?~{pT*y0<<h7}Z90EL)rOGDzU$7%RR#`NSl6y)DTV!Tmq;!lJgicG-DnOz zCrUb0f6r@hi@BsZGwKvXBS;ry4j~-836}aeKX*RvPlDoARG22^+;b?OJ2HDZG0!C4 z0Eiqp);s`alr_yoVx0qGYJZb-YRJ+Gl99JneFDLT&flUKRf%^G@w6&!%^cr}A1h@S zAQ^$kR1FGx`b@SqmIX<|N;iRDiAJbs7UPQ6!)xV9->BTlF7c)%VB!FIn68*@S@}4H zr%4W?OnMS=a>8|)7yCRIDFc;WKW4s$4Nm38K16?iG~O(!G*A%&r)~D*Fl$o%K9<tu zYSSM!{-v@*7A2GP9KV5fyR&D_8*E_*kxqcdIPJx6J3=zmJLU($`AAl!+9@;xzpMxC ztHcqbu`>fA9!RfN;%TWQQGQPPI3<rH`}Zr4BN)9ob0JjOT+oDbp0-(WJ)`o1vwQ81 z?k3c-$z$^L{koAurb^j=0*ybcXT`>|Ws_})<9^(7ma9UMe|$ILC0VfWCgx4=dU*lx zbIVlAZ>!A1V9#~pdoEWwdrrnW6A$8Zni$ba{8W006qRwt-UzDtg{6`i-h}QhvUQ+I z`*wN{rNOzK?XSk)C#5D>3Gr1(DR&Rl)lO-))`jsg4-rJ5rXrr&Be|&$gxvaS`ECRv zSQp&f1dcGN1>*k`Wb3OHTA@=NoJ{~G3Dptvsjd!L_dQKNtk1`bjmhq51wBe39&$ei zn@P<2Uh2Lx($0}I=^#kGzYvb*=xi$Zy-OnHd`$-)2{`VkeLuE;YIm|)VH#cHZh?Xg zEpJm<#;tyBz!79WTB%XpQYb_UegQ)Wa2FPbD;Vr1oG5m#W3+%#S#@*Y(Vqeaw)njs z|I|0a6_3x)S(~<;9LvJH=??E4@^Ur(@vu}hZ_=KMlaD?glz6=js`)9EX46S*`wR8@ z8BKvtUg?xsQnFFaU6<u`ZJA~svIK&z4_u1h(h7a9P*Hy_{_FbnXcdbuty7A_GoJLP zQOyCQB{^G&Ls=sOmv{{*Us?iqlO`XKD)XMlH$nmE4$UHSfXjNxTHTlnJI<}#OfLs* zlSnRnThi@I*SDf#%k0EYj=2)Slj-a7xKF(N9ek=mW8^Y861Fg~Ub7{vxlicU`Re~P z_4y?z31s=>q*xd<y~LK;e4HP_LXM-~4EW2}u_}`%e4kZo-_VZlcwK?8Y@Fd%bp^aF zLdWv4R)S4~S>Uk(vriS*1+(R=`736BA#4Ntm^&)Kh!rkY*XtlY@Tl9t8Qm`On<EHN ze4j5|7LN)p4EzHsho!B-xj(GkdME#>A?f`5^c8ZOIr4!7=hgv}zrC}2xqmR#^*n@A zbS@f;MV-&ck5eiXG6#Uk*;f=4p(Z79JP0WL03nAAtm=%AwnXvfUH?npyFONbD6r{c z^ZImcdKXn)Ybv;!Hi!0#39V$?madN&_#ItnVmd;qL6O8eC#@=9I8D*q)o)xpK9#;` zCK=F}yf?S{^?T?;dr{tNGDIm0S!Gzw&!_(<o6T)u*4o#aqX{s;jOBQ_y5_{hD5+qP z@VL@D(Vr+bh0ZOK?V&FI>=2Hk!0=+)$q3V@%Z@N12?&&;!*B^9jf9W6n_nsWQ^D8V zrdq2PPU&-`E`fmDV3C2RkhM18AM!T*-7nTnBQdM{Opow6uAHr{y2wK|qekRj1ER4K znp&A2`5x4NAP-=-ioxx7Es5P8n)%Su+9Hr)_j*0e%Tl@sg5B1_=Jy;Lyc4TwG;}8v zNR=AFxC>ejVL0NNsRkpyW2YUVy{;|7++S1=#P41c{fWak=-0BddiwO~3Vx|~?K&PN zCBBVwAH6@b3~)apN;)An__=I5a!>WT)Y$!^dZYfL(h1ZPw?OSN2Z-=|P<6(EEAT95 z#um{8X3cLnS8+4|)<I{eO7klRq;TQwB^VV(63X_^ZUhQH>)4EUS8g`?>=QCF3>eAN z@(4fdDIl=Cvj=bx7i6FXUdQwcbj>`_1>AU=A7eJQ%<tj-R*>FCeTi@_mC>FrwqK76 zXOC8j2!VQUKV(ZU>=ki>D;!?`20Rc{!5;}O(L*y+e_|@91%;d7fIY;X)5Dwvl0b{V zh#x)%ZA;kIW&G7lJsA3=EUQY~s~6H*f>|6Z0yZ-*oh0Z;YEUcw;8?(;S)K)mQzdGm zyy^Va^VhLODo!c#Ly!A+u<!4cf(j-iM(*3e2!P|PEbY_~!8?b%zqGd4>sl=nB#Q5K z7HxdyM-&%?giWY07z>C<9)Fj3oO|KqiW=7C(gh3%`U*ssD&@2Qk7J`EO+W^h`aQt7 z%XgM)&(af=h-_z>zb54nk0<9zvhnB^h_s=rR@#k`+Kw5}(g~y6iC40Li&O1Wv1QIA z3Xovw??8nL1`C4Zi~HzP2TFgveJYgyoF>)izj)|*s5yh^a}n<w;qP+^7_^HPfhqo^ z(Ee(dvezrO9O$X>|GfR(ML)r_A75AN6=kz5D(Aw_h*WbAA6V(Hu-B&ml{)a<m(_(8 zDGL?!14Uu?NGe#&ix}Kk&L)1wq?hp#9hl!H`foW~Sd601dI{#8tb3W4Hag(<w)8i& zdo7{7_|{>?=Bc7ym8bk(5>`kr8KnoOBu5ExF2t&u4qb!u{AB<x*Xx5(O6r1I0wl7- z_DUiWO`tL;Tct&_p>%1NiWBz2@CzyQ8LL}p3Yjw~{w8`ONi1Ls=L=5XFPEa>0LV-2 zYa%6L0+TiN`-6x)4%NYV76eO!y-61KiI^lT{s&TKjJzh_uH%*5>fd9aDbv?46(3f& z?VRF&nOC7U4cARvc}B5ydK&>0uME*cWHArK#r|XUy20)_s8@OLhmTrIQ~qe?x3&Dp z?15UvaReS6B@%Lhc=}}&k@BKAW`K062<4B{cbx5|MXW9Kig5RG^HL)Q&FWw!gT}^& zP=##o|G-CCi{n^fU%F#;_(-zuVAaSoEB~%j#Dr5=vxzD;YCL6Et#ocBSKE<6jujGE z|0L*Y93!|jX0(RLgF=t!Z6;St!V-ca2w>DJ_*jDggNQ>c6}w~}QXs3Ti2`EPWmd&j zNNmg}E`F<CUMP+u9V9d?jgp4tz)=tVUXW*5Vfg-EzEjea0`sg$Nb$=byc3Ne8*M82 z7(9N)3C8K|?Wtw4>C}E$xwJWBTMBe1yo<^9iz45L5wO>QOfX9n?{%FG*3gKdTHWb> zhzW}nlaRTHY#h1Lf_!^cogUyStzbWtzm<HabQIm=d5MBaU_(?G8+y71ttajfYM0Ls zintGog1qNLtL_DAA?aOyQ4$wJ-`6dBaFS^QE$AkID~E>z=H`3gWDhUL%`8JCJgou2 za|P+LsBVd%FMnr`YDQT}M6`^6U;^BFJ(i@U^(q{B5z|vu&EUCI`7_WP>B+HL<8mAB zDld^GZ)>yc2fckUCmowbk$X!1$Bzxl&mb<(7Qlenhw#K9)@2!6rC62W`N_S*^gXEp z)w4IsO*Ur3=}&GWm#_6#4*o>;Sbe-U^@%priSW#dgtQMfId4m%>Q}4i&~`TW#X$|c zx_1!`aq^nH@#S<=oE#wd;%2m{YiS09@A_9p$SF%1Grra*W?dhAfTZnkmw11ypC(;7 zBNRl65Js2{-p6q%Bem3Cx=L&E*Vgr;<4V%Eg@?_iKHYJqBM@{gYlZ=QJr9G4i!u1Q z?4U{VNG2}D{?g+azYyikrOJDuEOsuQoub732|v_ApwlG6unbi3x0Q#cV8-&zrbi6A z8S6RSQ=+v=9TMYIqPc(E)w(hNRolxY?zuf>vq!m}Lf;L5^WB7LCW2+AYF+MaVejjq z27RE;Jwy=%h4Os3I4{7^;B-Hab84cujTH0^d({H}buazZs&#EsqWz23oS(>QFM-oM zCIGo9KVMrbeg*X87vkQdv;`}@F+GZ2ojzkew|qN4ax00n7}H#f`!-uh0s#-NyNq*N zY?2ZdrMIOfBda<;M1tl(ZKz6gdHRC3lG9c0NT!8*hI=!XjrLc!A}Iybv{*W{xY|#d zw~g-)_U-9p??stJKYgsY!lQA2xnE812V&3NQu0qDS`^^l2RB~Gv5m94)*Yp7wpGbb zSqu1ZY2-irqcmCsA`-Bqy0Ain#~kVuBF~r=`Uet>C^D?7yNcA8%uPW|-7n-dO76L2 zFsO>QP*y!Fe;7@I8+?M-Of8!;qqQsBRsR#SZDeRh=0Rrl8OE_@!M_CJSs^yj@9(cG zRiR-*LnQ$U&P-;0<tn~*2-3}VIx)1DVsfd@xASGW&~w!>lXwv?@~FdgxRVXUNP2Xm z5G7iS+nTc+D%U?#f5WF~Liu8g6W4$bQOy+xV+LZUF_8$*=Fb({Rgp~$fXoobzj%+e z^k2#(q@|d1FCe_N3{PvN2KojS1<ljVk3OK&{tFlvN_tl2s>{91`q8$myX~jUTh-B! zxZfnBJ$8m>FGAR8oSqrGttLeai+7&2ML@rC>W*yfnf@b;MzHxVMa*~iJR7`SHQ(9v zDyMJ~+l_sFTCCOCI6@kizl*7j_7AGud5(PH2nYLAN3UQAYm1cWXN?<+kTo4$dU-Gw zCJ8{y%W4E~jJtp}?W!IBAE)!e7`{n#SII~M<k;u(7p}mbFpn5w{6`l*ZEt<z)5JWC zWQ6X;nxWL{_xfb=+p+Fk9OcKuMX^H6$otIQ(cg*cASB|@j?Atn0_z|<tc?WdQ%-Qj zb@wif!ge2cwnpU_&o$(ez4If9wS8Ki`EWp027IZcK~|wS-C5!><K`qA#Kc@2qwqH^ zM}5b!PDS=Wg6vSGcq~=}7efyI?D@ZJ-pxAsm%mJsCF0soL&x`2r{KFbb`ZdUKg?5K zQ|itcaPNuLJr)=v{g_z%%WX^p6jUHYgU<a;{+x(($EhUOaO`^E;pRWxYL1nex+S1p z4yuDcFyV$bGZ*1<OTQ5D{w)5&V^lt6erU|`5Bk2k0r5ETq#*$e>e7&ePjOE4`mO~g z|K?QEVPbr^WxEi4gwRQtD50r)7gMsrQ7L>6CPyj_u_e($)UYA-FS+G`&?m;vDuMcu zgdz8K9<@<2n{m*l3BEuE+_OU{bSUuSAon55kC2g7b*MkG_qSr?EP2#f)=8#Vs%|Q0 z7`kr64;?<-vNwO2g(yGCp3(8qF7;RK%e8@j|Gs_icfgj?Yn2o#zqfJjgm^I4e6Mmr zIWKrJstzpib_$dW$R?^TwtgD4d9PAr%hM4AR`Hy(Jm%E!d_wgE*`t|D1$2Na&gC_m z44RlEp%k4*nNTg269;&gIPLz#bX}*QQ2B=Tg@TkUz5U=UIXxZD@AM@mS;V!_DS}_& zxd=n2tnv{#X<L1c<&HY`^jO+isy4$J+LPLGB@8k*DWvfh>Zi&HhHlD9#^iW`iB=X1 zdF}m|<;!1imrr#aVhm6H`$B*gh95)!W3-hJteWY1-XoiHrI-DP`vGRp&f9c!%YR0? z$)!Aft~t~6;J<sJ-6YX5ddw}f>EOb8%ZOc&BpSVY5j0Xs^Q(TWyHE}a!g?)uc8(wn z`@e3y8)h9Q%F{fqr1Sf&=O3^CfrESN;!o{4T!phE5B0QSR7V+Ycq#-ATIKy<z-bD{ zyS9IXgq&_+i|ZpeGB9TF$lxS~=K9{gHboxkOtsBPco~!w><!-tix!;HYxx<2g|1#7 zq?|s_Cxv3;>iV7qe%`=T1T6K<)lkZQ6|>wmrNtYv5d5fi$F%oXGIll`k~y~uGTL3c zpSLYGwiYAJuA35?8sr1m7vL8Ws+eGHC#aKX7v=GEkiX%u8uMRZ;(qtT65DtJYaDfV zQikTCM}cgnoBScpn|^hc7h~e5CeI$KZC=8?DDn(cA*Zm$^dfm9lgv5q6?`_oU*b~S zp01SkK#@XB?wIjU>JoKr#W;Zu&|wbugV7XigwvnAL<2<NgZ%+VR4n%EOvy%m?<gwg zV|{R*ZZ6Ev%h}H$f{Ja3Q2;tlAd!mkR~s)K)+HS0z0c=e&P*;5DNQrRef0HHC$yYA z5}PEgY>~wNdZrj8jkzrcw_hORA(ZD?;FQL6)8CFnDwQiAs*Kl1y6%V3d{+U|cDiz` z4y7yns4H&R8%{tcUFK%b$-sMPTr5>zcb)mM+0c?0yy<>rT?SJ6{6VerVAo}8;Cywf z+^1I>M##yZM2|ASO4mG-r>rhY^;V$0I>lV`%VuGqB4PLXb&DU~37^s6m+U(81d)}! zkcFRtoBmfy&<f36C0hVVqRDy9pSG8EX`{N1g}2yOxZeN>>f1M1LFa2-cCAZ2nDs)N zG7~4?HhqJx21A~9CZlo;egbB4Ytl%uF^AT!$`Z!&&!b1#!kvz_d<j=(nw`><a?uW? zXbsm8rf<0`6+Mkc&7Xp2lBtvpy*89YQLCzH#P}#vnfko?aPJq6B2-y+?o69UeT|}s zRFUKe;1U4TV;1s<4Dz<giQORgpaD_6jcco#RnAYI&HO9mYso*X$V$^Tyxh$;^p9|- z`#v3}$kB?l{L_BXWAR2uWgp|DbOM{QB|lP_p762#e$sO1HZJHY4^PSdESe5Ex>L#5 zj0`yy$M~ed6uC?<jPcr>pfwPflpDAnSNU?c@)8H?(pUD&X|FX)(=B}U_!<5k5Y;jZ zpc0HW0*4X*6t*Nm22997&VTDGLnVv?sVJ#kJwa_V2)qUqZk08eC4sqxuE4xg6VkbH zjTt1Zn+){8nJA0?@GZB*j-;2%)WzBU@gId{`CgKWG`DR+%9(DnE@d2eDl}hrXN`dx z+Jh%B=X%!Aw&*+#8(MMhlN-U6PTT;&eQ|Ov_;~4@%=aH_gr74sa?Ah`p|bo9&u);T zW1u1~S3(dZ`!AZ&qnW)-J0`hrFSv;hug0rLw=ZFj?j%&$?X0FuW%%F8A_KN(8$Y^5 z-jp*6Qu^+yShUkT7v|dem1T<V#y0*G;>?!=uA6F3r)NKx!l%XP^?pa@WAOJGQ4G#y z*+j_`m=E0**IV<Ya;_;2u&|Y<tJ|3IJYibMs-I?yl*qxvH4s>LqixImH!5Stj0lP8 z=WzbCMV7@fzFGn)^R~$ky;i6I@ut10TKUV4IwuSX52NSXyE^jtD&}{kG`F|-nd%rf zU>y!utyP7Og1%2!Hg=ukZ?rKDR)YeQ-q9$<uthZjRh79p9hT-(TKY=1^b|pv`no#m zmaVz(?fnih=8OsI-p;4+zLe0}{*^%rCbJTS>uLWrqGaZqUNtZ3>oqhA)W$UiL3Gw# zr=<}JvOEONV}kYff$s_a#+>hicuxZ|05~>jYNG*y^Z8?WmSmvV7XHEq)$!QA)tl$9 zsU7o<xX54^>FGXh(qlRv<j$7xE%{z;ozs;}^GfDi_t}S-ErXP|sjUH+2K`N!M%D3V zs3^1R*=OHIbFZ;MsWFz)c?(uAP_j+pWFOCAe+tTV*+QLDI=&izI_}&S|5NzC`}eXm z>$eSaGLlOa2upE#JiBb%%+d2Oi*NG8lp>nbB|C>b-+n3_EnI+I5m>L}SJ;M%`eQ7F z<Py^wS8#U2WWDB)Nse=derWi3u_#Ve|EKFT_?VdAaOdyOMU|D+L%Rr`fS1AOM4;18 zS?ac2Fh5!qTLS;JSUzmxt)tj?0dNdcc<%n`!23=g&7wWkyYSMss$Q+ZP^BN4S-be8 ze>yl>P1V09<y&!~K3%Qx7=GR|Qsqs9sX0^Q=7toPdy<Z&p;(9Q*DD-XEsKqj6fU<7 z6~CczI4%(Q6Xw)ZEsgH{XfPmLSpw;$fqTQo@$e__S*p7T25*CeghZy(6rlYRCjugM zbM-%$`z`yPK;<KJHK=F%Y?}^Mh@zdJ3&EEBDdQYwDu4M&V+7i+aZ2~hlcT8HqJCmz z#pWJ2@;QFzlx?m||2F7>e%!qAPGZ=O9hrf`8jtQw1F3LyXeNK&$pUa070X)PLj3(W z;;+bdL4&BcsG?19q17<cdjfhzcxp3yX!s-Kc$MGF5y&mcry|HkX3Qp)nfdY-;d8Q9 zh@PGpR6)lG&$pty-*^npApHYtDP(sJzZ+Wqw&V<x5F+J-q~h-NZX@<b{zw38Cs;tz z@BZ3IPaHYYuGVg1=iFOfbZ+rPpXU7GCZt9l5yF2JIJmApy^mPRHwr{OJ3;(<ZbTa& zoDxYPIX0!(r5j8)wW6j-|JYG}eowQWj=93CE#-SILSWZmMf)q}S%Wbb5I)zSN9(eY z$<127Af-?efi^MccyF_eH`QEhap3x#Plhl<I5#Zj<WMj-Rcz==Gg$an@nfT-FkF)} zhhXvq?~kHf#yHo0+ah4R7W&AS^OWb4^S+)_4}u95PUMnhC1MgP!F@2#=p>N(OXPUc z5~6Ba-zpX~8b&0>-{pfJzjlbFzmnNuG?k*;^VELV?RO=JYv8L6>&|Ove!!PSSkiVm z&gusDoZT7`NRR^F5}^$pmgM7Ii5$%d=>#3?27S&FcYPCh;ScyBX~;TRRu!nRk0d=f z(?Bnq-}w7@5sZ)BSXQJh8rCOEb4CeS2(LGJeeSm~P2B$i^Korkyd`^2yQ#mO!=$)f zP3n9J@~zN03%NLT7SNKhd>3*EfD=1@D~Bi8KH!(#Qb4?av?P*-SH#)MC{n&#*O#u) z_9hXX=I|lK^8@09kyyaG{hQuIA0!6S@#x<!EoY}^TexhmJc=Ldp@OlM!+fVqdZmPo z{(uFJMU+7)NecGvegD|dT<6%-9ze;ccH)mWOTt}k8#!dzT$xxq2#P5%%1d!C%Z!ki zXsaV&F%cMIw<C#oH}qQ8HT`$XdR{T<U@G2*3TcbpT@46{(?m<q6e#s!|FyMvYP&gL zV`oY!0e6|w<BAHPw4N?gN>$A>kY#K>8c9@v=@phXtr((_2LGM#6?En2R3vWdZQ5H3 z0|6doUGcS3MHp0!r&bPy%s8QDzh4hyA^fw<@^PHQiKKq%!I^3q!d+ODr>$O=4FOXj z)oS-WjT$KW=}@A(NFqNOhDEY^GYdGfrQ<ZQK`l--KC}+w<W6RkHP{zeJT_#rh4ct< zjP4)k-y8A^wIlMl$NmwPs3OX0#xA-G^Y??I+E;;Kqq0RN!UVH2qNSE{&emlU9S}OX zu!1EGV6AsJ;<nZD=+=O`9bI~3%n|T7AN}m&RR<1D*QOkaPeSO&#-OZ&KI~66vi4-f zZ9nDPg&*?wcph%U9o8Xa4?`C*&$nP41LmP!g&KS`EB{MSF2kr`eR{&j8o~OhBq52J z#^$#qGg~zFqGv{0IYndBHs)NPgVM{qrbi!gix?H<UqhOS<E9%G`FG6KK%`KDWd_?N zRso3loAT$Ppq`aso}0DEMa(Hf`EJ2Lh{6Km+rEAczV-C2tIdNZMV6c?#W$e<7xj6C z97xDTkLVlHktP(BaJB}D{eB*<45p?y>QnwkD&!!hlxyyH0mFnM&kCsE9e)rCmu}_K zJJ<gS9US80%JxuyciVdicWde9LL*cCmkYH_ZN8DIf8nL-LOEOORx_0a{~sX;4`K<A z;?I&8X_I}g+OX9X)Fzaus5?RQop;yo5=00=N<5@f0D5-dvQap8{&Vw}T4n!=wzUHq zNZ;8BKIox3Y$pqEY3?a&<q{1YoH-a5uL7llYr<sFl&MGEj5cOj__b{ig?vb_jkL^Y ziBrKSe*%EuB|EIe5`=gp_WCM(3yG5kY4oZ&g4j26=~I2)1t6FD+rXOc?3lW|x+C0e z9@Ic}t6p%;%C^?<aFtWJ><RhqqwR2<=HHwS3B8pLAxAbj!3?Ah(8yFg-i%q?$}`AE zLNOX+^T+{_6C?)-VN>`$<Q4KU^6z@l22i#>e}!E0;!|6t!+VKFIn|VLBPo|Rh-K)8 zrP30_(8-M$$OssgG&Z6FDP`yVSa{e(n-Kz+LP3S`-{UlqZKnwekw<}i^ds+k&pY4o zwzoXv?a_bm(uH&P9X_ys=jvj2e6&{1q#QdW$Sd$l+~2u#=jJKz6^{oh*KY=y^iz+w ze>N+Ux9!hLQh%FIBMAHT*?ZVye_OYrf%!Y*DQ?wu4rVLTf8fSU7Y?L#F01b0>>kTu z%*^aC@H@Xfnc%uk1%(`BLy!Y%I2l2?o5>yPl*)<4L@vT5a}!L5y;{h!ERAz58k@@I z^Dy1pQ_i~CypAG0=xKB_8m8RLk3v5Gf8hiB4R|mCi$`MmbEVbj;86;y7F_^p3ZQYy z^{6c<a)bR2RViT^>WO;A(%<ziz_7i;W{6z7`FTx~@k%Hm<+INMhTM3$bs&Kv=y)Vd zZYCss{wa9o8IIF{aOtIN<Xwb%&-?iS`VRaHGEerB)8tam<2{5Edv{Zc1`tZuf2RS~ zVn7Cay4>4#?gou?+}k$p4qN@M?O$3LX$@Na4hta%*{Fu!KB3!GV)mA#{{UyIfJO$= zS~$shfW)>PtLij#{Djl_z>^=iZ*MH*#*p%a#wcdXK!I`G1J?ezuYa(fUppL$7X{-i zK{@~C#-8)LdbLta=<f&n=6f24e^ZsG7E`ILpx3Tl!&lbcx^wq;UtBM^;f#yilDeqW zkurw6o-FClKXKw(m>29slhO#&wMVP-Gf!N3u(neAR#<=S4;otbh1rcK=1U3Vt#5ss zs$%_f&sP2{{wR5Yd}Gg?7()U3K#IUvULXRb6xWHt2{En{O$%B85CA+Me^hJqn}w*L z)>ehhl3EHvZmPB1Ae&$M;`2S{`DdTneCYDp{#`ql7x#FY%Qi)NH0ekmyz%XoH8Xv@ zbeAx(&H9zXV>;F6zAvM<jNYwBfDMou;Hxja{TB`kaQszouZBV)Ju;Po?jkjHE}o;h zmbiKjQHU5{yK15|cI;G?e_oG;qZ~2(=C!FEwPHL|ip4A$k8zDg%Z4@<6OkCJXCtj> z#E6AiZQ61&)zxgeIj<`6PPH>mthNf`6`+36Kc{Y|aAchWjE-4)G88*^KFUR;6^|9- zM#Ee>J6kV}rtC^0B4VqKG^1L)yqGWKrsCn;u6Qg}5X^|~i~PdPf4`hK*;>w;lWUzk zq2z>TQSI_<>IJf&oF(UbXQH6NeV}XIX(WuU2k|?i6UudZm1tTJ<u?3kJSj}-Gmxt6 z*t=(CX>Mj}qSdTdRsZ}*h%CT@74**!;On!^5I;gz!#MCa2bwDIGn)c@&nA$d+?SKe zPaR+fwEM2HU29*Sf0@@omfb>l&#sAmAz`K8daVP3O^hB}jT*6-x$os&U1ry#DV&1u z-dU`565;H78un{{u-uwUMNB(NM|O{QW16<KbKky$^G1~NSTdil6eD&fGt)q`oYqGt zSHrP5*NnXtk+VZZxYmhg=c^oA$-k=9N=svhcDU8Cg}oI*e<)dd{R8+s&U$cN^Wgf? zo-Kgl9$>Tx;DI#>;7O_Wpp!C^{)0?|!jIb?(3c)eLBCXFWBY_&;r1~Ac6Km>d1i{= zZu!2WD@&8(v4}#37(P@_-ja-xTZv-dI2cH{V6Xm6QhnGGaIV|&@Y%&68{u;ep4SrN zW5yVSKKVq{e{MG|xTwUK9|_f4j76qo#oTo&YL8b@Ai^0C?@#9|x#fJ)0>tM&_IcY2 z*%Ze{<1w7IHL);nj-80hH+@YALku>l#hGCE1Q@OLV*13YS<z<<3;_bX3B-5A!ueBs z4{8Ms@KX=n{B??&3@1+<>D6Nd`gJ%eQ=zIPCxDV#e*_V5o%9>wZxTQPcq2&P#qe-< zu2M=R%1Rr=|3Ni2AN#u&*1$LYy{c)*tKQDLZ}X)0<Kz|c?|aczu*8EPjq3$M&EcN* zV?>4V4HaD0HL0ui(k4N3lbGQB-XJ<5sFMw1S$?67-<80R*85vd{9?H9ArcA=H@yE{ z&lnk=e=#yVqodBal>$k;{jE>l@SLejXHFe#bw(-+%X6Ku3K}*V)u2V-U79-%o4yC? zSq=HEmA0%hMWz#U6opj2y_$7f7eYGg8+bumj;*jF{cbGOvQuTXj~#ZcW%jlUt!+IZ z9~Pkf>(5L~@5{gRWjwZH`7=+{iu04B-})0=f8xLpW5^=zbiE~)67{j^gj0-gb8OhA zQ2fr=q=@3FookiYj*@3Q+L6gI&Y+kI!8;3kVlfIl)M?y5><_8^ACqzb5c<n+v6H#S zE}ef=lM;Y3ZD4<;O8H#F(eZ(g0X5<)F^Np?cQ6!Y33k-e5IS(;efxGkHJ+}ImVe?i zf0+`YUS;=xr@P=^kx8<ToPyDw;eeqd@Sz#7LX>eLxN2~~guyn5rVTTDx;}iX^2(+k z&bsrNqf2)^2N|3q2#DS53>{Sqb;lVb0STAi_(a5y!v!mmXgX>ex1Hhc>r@Ck59IjK z^|hTlW;*RwqgE~^-FQ?JWD+L(I<C2ue~OwPIP}|tN>$-**K&0yxn&>@C2M_9h9Z-` zT*dnyo~2CNd*#p>j68KVoeV!Xa`=gd^1`aVqt=<QJg0h~;%*w9R@pY~L>xlxW+~;Q zG#wMAjBDRlWXaH4D_hrgP}G($9Ev+vzuc9ucX3z5&ZgEw3>FK=1MPNYmY3~hfBo#S zs>4Ss**(Xm#{OF>#}f~QAgnbAcvXAz@D5*=&h<L!C<2)W%5W>=OURZkqZj+-vz@82 zcB^Z1k@VXS3%RXEZy3vWoUj~bVYbXP#q3^Y3JjIG8_frqJBXB~#-}>#isZSbhvYPi zKeAJXMwccksZx@TrRi0Q@VuY0e_QoS@(h_@C>7?%DCfFvJEh8e_Gk6E0~)mI#hF|p zmyhg|@bR$q|A(DZP=No5m+*b0Lejm24oF}f2HGAU9k0()AC`kWs3N5x5Fx`<1`q#& zLY^~*Y-tjA?Ggq@LxjVvv8EvfW#R>-ct+MK7E{@rq&2Dt&rLd<BRxg^f4Z$d#|pj` zH%OFtIV%%xeI(?0R0oa_;tfaVsPdfpp{p&a3^Z&C{=MJJ3=O%!iqy?AMdT(c_xH}h zbMWW*ApQtRkk)67z<v8103oi&ul}2ea?t!oJ3#`67K{+LJ^lm7lKBGvXqYn;JftDM zTPE;Fipg4>9g!5N6B1O=f47PV0T_cnhyUVzYo7FF(yOHZed@3Jy3bZXxczvO@*N!S z3&Yf}J*f5pJ2sJbBU+;f0F>&K=>k;f@M&h@GwG>_v1=KC0%IICN;M7$c#ee$Knea9 z-|kUXSv@Hi{k8#v*b_4JzZ^&|6OS2^l%dT1+x74E_8l7AvNU)#f6eVHE7HBc8bYc^ z!#XTAc2A{DrsL;q8tI;}U@cR&^|-DXG{%d~kwhUR2#~+V1bm$rb&HTpFNxqksS_Xq zhk@uCi9m$jS#vC4N3lLpqk5@1R?sj}F4U(@s1+(59SK1sSi=AD|3Q=uGyf=2HZXAx z-{E1XMMitAt$=txe-5s$J%WetjE2KMZZsU{R5*MjbgytYK}f+D@SXVMBu<)ScOSqZ z3P9j#^tmTcmfH?SlnOL`JU>MN;L-EvKi6t)0r{2=@IF)Bc?_;3Dv3&5dxTLY3zP%w zdG(GX_>ILvG8NY@0mM1i>GSfo&x3A_e}&&p_7L&enJ`Sfe{u6~Keek~{zG@2K*9uD z`R~%%8@@1X5{(Qr&)42D4<CSM{PHL}_3WtE2HJk(w%ycer%REXWWeCH--O$H_xaDq zA%s4NKSxreM6_3nnJ~qvQJCorl1sMqpjR&W*&^b_D{$I>{w6-od06JC6!;xr;LTTV zzK1fT@E6=%e|mWTsZam%ui(!Dg2rAui;@FS137-Z&|mur`1JjozXHUMh<%>E1AmMp z$qadj7~gkrww*J9PW3UlRaiNEP&yAbp4|2jbbm|<8I_Be3xbeC*mt`g$i-H}Ry6_s z!`@RD-ciUpBY*NOkA5&|aCiMAe0q0JSgR|?CSzp*e=Dudp*`tzJDmxMn?GBjp8{lz zXKbOjP`J7+LIQ3%=HRzx_N>mW?cDvTA3b-hI^|ilFFp9?FF$x%LVfzpBQH(r`Kzr= z$1ctuT02=c;zDO2(W0DkgMKqNsTLEr9_j0C{Je*q-5!lC3Yb!X-0fsD*m~W;=B)6u zpaIafe+JbHeA@D`nM}Gf_#2Ky8i`-3RUUF&%B}VYWZ}t$1*4N@OopQO&90hp#*9?a z))`zEI?H7ZOqxb@HOBI2Y&CHB5XGOly1}D<tH(h+6&O%_R!}t9&7b_*ucd^NbA-@C z_|2qAPLh{BOkX^;+)76kragSkRfh(Z6t{IMe+n2^_IHC;gEYXvZcsD)2GfK3R9|H$ zJA?Rh$v>AG8>E@snZ%aoH9v#Dud~o^{es3MwNPVYOrKF)mxeSm><AYu;f6nG(f7WO zGQpj6s7-|)b)tyg5w52aRKqs%^yOq1QNQ{7H-Dd*HRM`I_Z#kmaR1X!#W>dupg<|p ze{>0dY>aS?0!3TYEsn@c{#{HkWlo$q=u#BFNyFa!P>fL)qTk8{H>l=)wgqyHeJhnv zv*`~~rdH5@AvGq2TZtMJC>TzOTHXW-gMOR;#gj}IJ*sKmRWb!lpOq}ScLQ#J*}W&- zA+hkknge+R>foJSw*7&Z-+9OAUBy_?fA=*IU3d1=uED(qiLdGieM0p&Qu3L2P=M{O zbdcZh$t;YnZ>Mjs%-bR&U-T*2tw!ks!`uV|>@1aUoL*l?`n6w8pL{X5J~~p6oF}Z1 zhG$g{;@5Bf8Z%LYUGl<l6MP%;dxjYXH<DhN5$uB>5S-DM-U<jzYc~%&6g7s%e}88_ zo;j01v~T|k7wdhCll%c8^gBJddCI%5-9?z%dLl}7tNygl4@q}>;a7DMhqW|el=oIb z@p<^w*5rPR87z~Qp~RU9CXBq;h){icwYO(>pUI76no$tp$(>VU88G8|HPA~hOpHI9 zuzhszTs<6uf496;GZ_MxR&IQke+01K2bF|<dAie^FNXvIWoB4}cP?FHV~0y0xm`!W z)DA+)cN0PvJzQQQo8-No1bOST58Zz>Pd$0)tJR?qeV1lkGuyj$`N?Phwbi`Sb#5VT zDTCFXB{Z+t#)Dj-aFVLVs9Et(w5{wL9?59N(Txxf7ryF#3qsb?;-D?8f7^Yj^kh2a z_nu$fX{q~Sa<+QEjcDu}+q)sHa365mWa0VevaLP??R*#t1wf#J&UQjt$gcmPZ-WCA zB4Oas>4}i^RMmAr&{xJ{;Y@Mmhz??Q;?5rRvsPA003I&xl`T24->I0h(+swkNe}q! z>t1{dAV6qlwv@_8yxMXKe~iDlw8%m;-CWYK(get_5kkMt!@~<6?R6DTmA45CztPd4 zq-TH-pOXf#o13?1-v~7`J~(gf1UXO(5!{9)U%P=GkQjtQ;WxKzU50F(M<$kO0}N|c zgNL4B+ffiSrJhb^fN_i6SE3?4B|Jpwf+ut*TsggG!w9fpr=C0af98Rlp`8xe>$UMx zBk!b;S&q&Dw1rH4A-A5U2=IYBo3Q=N#m5i?j=va*oi`AfVMQcr&iq@ulNM~jU!pIm zo*{%@@HqOK2i0jyadbtw1-EX2@<=g&OP>@w3d#Y*Z%G)b5{j;G8r^2Y-<BxCeJ7q6 zrC}!d<-;k?4bYjJe-<2(PB$!(${G5Zr+?tdk3`vQ{>XHsS{m0V(_Eb^&Dd;EWc_t4 zzTQse4T>Ln@KX=PuR0eNZHB<ODZYhk9EJC$DQu*GvKH^Iwo3KK&OCnnNHnp2Wa9X& z-KGFsvnCvhJS5JX;~dm#iT2(PADP*=63INFI<a`Z-g7Yae<gHcfqQjgfwAqaSO}1J zlD}r(_NAXQ&<0)hRo*#YyZPE{cRlM*!b$iLevV{Ft5<h{VA_9-0R=S(LkG-`YLa9i z!-9xFVEzOtSzkxb!&sp<R@6$`^zz7pC1i+F<4Pd`|EE%@%<72to<paXT1G@_n%r|y zCqRA!PQbT#f8Xya58VL*uuhQR)59m|_&$0hEIDz(WkUyfCfE&A@k_%5EEQ@iBbC~6 zYbj*K)t91E$&W7JWYhb~ww{RkUr3OA9!}zCy>Bd%ooZjnLJA44juuR&?psnp2?KTO z9Q=DPmw?R8w3?-z<(+O^lcWem?N%r>XKw|B4~p^^e;J1h15k}K=rsnw!tkYh0>bwk z3E&uALJbd{pKmHqazvwdL4SiGg5-zc1itLub&5=r`QFS_5*4U9C|IkTR?uePgFBN3 z;@xi{J)N2M0iS}Db{D{_oAO~lbFTr&Dx_3v-d%V|@o(Xe?>I8R(^T`&`8f|y!8PCY zpu!&^KZL$Qt`bV5=L2$uwyDwSxf!?Y{kw`kd{zDQ=fT+B=FO;i{U1f->gTFIPka^# z^yjFt{~MiRi{JnO0001nlgd)ke>NR9Pd2YM{5UN*-Z|GggF8z*y*%JO@jhfer9S9C z89!7%kw4f#0zhIwwm}v_c|o>9NJ6VaV?*XdQbf!}kVZR3%|`b}B1d9Jn@AQ&dq|H+ zqe!s;000310003109zfbD_;*h^#BV4=l}o!0NApa{{R300NApa|NrIxlM_@Hf2iMa z6h}Yzdw*%RZQHhO+jf|3<k@jH!<3u7ID27we&>(sbWNqIfh1XP30<~EYr|~a^s`zH zCw+;w+a$fQS2_yiLSH?=w+G)4JE#%Jh4?DMELa8ulX^2)0_$Ki%z+iLd>BHH<=8Kg z$9;mjd409>mguw8F8qNP*ei9+e^;rUy;P$xQO&X2h3je;#d24{P#yMyNjZ|(77h1O zI^*;8nx4<2O?rlG4-dmVjbZLEo0OFv`dR^IPl!`U(_wN_pJKbRejyuUcO}0I`5&;m zT6GQLA6=Nyh1g`skAI^5CFhd{+iDHvZ(Z<paUttN17hFAA1o)ol~2|bfAl<F*v64J z)w9%{`;Ue_S%0{F06n|KW=4y3344OAW;VM*8Df8sOQ05%BQM1-1;u(pvDjbOZ%C}4 zSLL75u-K32GZx=F<VoZ!<f7QE(Lt@I$8C7S-oN0cuam5nq)AdXc@lGZ004N}V_;-p zVEXo-jUkF<-v6inD_DL32}Mvr8vwQE2iudQRWN_T`~S=e|1B7zn7%RmQea@{k7EYv zKFqWNs6>H*5ddXY6AAzTc-pLtGhk&w6o&tqi?!|Nc5T+%Evntv=!@8>W81d+xQp$i zePuK^Cw9{1m>&RX#~*_M0Q(CGY^#^q2LM0u0}3v}h|l<n|FDNI0+EGW6rl=DXu}XD zv4DRi_LBYK?|D1#<|BMuij$J0R4GHsl5(X2saSVg_dxf=N<;v3FmJHF!xoOGvVL!{ z+IS});$u?m0am_Lq`RfNuX}9Oh-j8(Xqu*Ik|t=BTBwQYsGJHYnW8C_{K=bM)2+1^ zT8@^j#cOe5QjCcaF(d{>zvvUaQ(jZ<Q?7s4Bf)Tn!c^=583(|R9srW8s5p22!o^FM zuUx%${l?8(x9{A&cmKh|M~|Q2DW2){2BXPrS)aOwrk1vjuAaVup^>qPshPQjrIj^< zjjbJny@R8Zvx}>nyN9Qjw~w!%e?VYRa7buacm&XbNWzYcWrzlni6CYSLwo{?TumZU zGJ+EY#Hneub&XB+4Ft?g$tYmR&C8D~WXJ>nfi{I?0JF|kI0k=A%pnNEP!xsX|K7Vd zaI&$%9Jp>VioMuu%VHCI@6FytFxoNNgFV@MvKc(#o%C_S4-D2|{5OGYR7|on=O70w z&T_$mi=3#r%4PP~w&5W+jP{Y+tlv@Dm%xe{aPyFj-tV$A_)`w{{+0{Yv6K^I?Bp{0 zYd^(NZrG-m+-86Mjz0ZbrHbXofgsvveMR4v<S{IV84cm&mYT>DYZ6&fNn`r(z3+1? z%v6GDw;nY3-(r%EGTR9qe-6HIty1}0s#U5LUNX7u#Jn3=69>lU^*B)8U2yfs82pDf zLml&cpxdT9+SGgI=(wS6ypTj~UUxdO!AcUll_cvJuBm?tPw+LUG)5Jm2a^XT%WV>K zMOD;~M~d|ytd>7d4F&_%)h;~KLk0JlFE8rgf_RRUE;0q#_XgI5ykl~c^-Y_{O>t9q z&5d@H=k0|yFTU+2r*5D#!$_bN6X#&{;<m}yg@$+6>)c9BT!8BZz~{@3tE#FXcFkqo z*EZ58kzs!+MDxo0HfuNGh0diD<#HZmHg&nmZ8Wa9+*+wW{^feav`7i1G@^_wbtoi9 zOrI&BFF0#d!S$C)5>@dqEs>#IurYq^0%?(naT@ZGS(jLm_pEZ2eq1U4L2eTmEvoZC zX=+2U3;rhJJ;X<JObx^qm<4D@)D}NS8nFdu1=)X?oSYdvjW{W(dxH2urP7tw4W(Bg z4}i+X6A^EQmy+klD<|u}e72%9MFY7MW~9kM{|x7l)J5+z^yLG0aNF_x0;O+aZaMqp z0coW!rX3)1nNyz(@O-r?rY32y%_G}U(D9HB@hiW@+eLJWXaHm;d_fdjk*VbuUOmKZ zac6(2#|V3!>Ns1J3ihUQ{g#4Hd~e59Qu0V;5Bf4`>Prt1-Y0k?cVi-29Or3UVn-9? zA@6Xdh|9Qg3S?_3ImAlbqpKO0sRe%hEu4q`#s2}9rDM4O004N}Y{7$dBmfiu!1-(A zY}>bI+qTupSy2PQW1i!560?$|fy_t%3*Ub<EafLcLQ+avMowNqQAt@vRZZP8%dN1| zDyyxr);jBLu+b)4Y_r`CJMFUD9((Px-vI|5a@Y|^H5_x?2`8O$+8Jk^bKV6PU3SG) z*WGZ_Ew|lq*FE<=@X#ZVJ@M2t&%N-{E3dur);sTg@Ffy{X!gyFR&D<1)MZqU-bjBM zGaso)N5-Tn)5gt4R(IqgAB8AJDauiast$en4H-6IFltec#R;*O=4BcfI2wRyBV%(2 z?Q9999ig-nt9xQ@ZX#<)MruhSn@?hHQc5CIL?%-}CTnnJdTt_nXhCsiPJSM9Kt?8W gKyfBWo2#3f3zT++(ry5)(MQDq009O70ssF15Bb)?FaQ7m diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-BoldItalic.woff2 index d0178f421501dbac3424821b480c7e58b1dd9b48..5c500c285ab55e11950be8b95b43ab163924eadd 100644 GIT binary patch literal 21244 zcmV)AK*YayPew8T0RR9108;z_4gdfE0H^!_08*j=0RR9100000000000000000000 z00006U;u(V2s#Ou7ZC^wf}b3L@g)H^0we>31`C1)00bZfh-3$XeGGvL8w8I<2Xfdr z0DvY98AW{-vno*p8wVf=eRtyj>v2PdU;%3D|DnQ&T*ygxMzgEOI6XKACoSyGxY6{& zuEr<A;SU6{SuB=l5c$4FpxA7c*6o4{!4pLLe({4izHF7g|KTyYP_TcY4+-AFCYxR7 zN{S;i_DL?(_rtmGo}xL%f2VNOfzqYv(uBj|z@dCkGCnFcH$b}C-DRyC$t9P0StP8G z3t@$oMF#9Z2<$+Zg2<8~q9Cq;id8$U)!l*auCI1Y?bL6b?bfz-*>3&+_ow!IAG+`) zJu8ux|%a3&0f5NPC}22e}me57iq`%wO>1gZ)yY9{{sgZ-X+-b|1L7+Bx|W=R+a z9A=g@S<p<vALRf4ZTtVd4=G5b_C@LdMk2-yUPX_8=WLX&KYh*L4*(vXr<?EJHB1vI z@bqSDGAzp_`2W}TKP$?Qr#aywHiOug!SW211kF4vYKoGTuG$$q{{Oe8m2{P6W=SPg zTu#bks><5ib`Tm_<)7DH$^dy8l529cU7-dF4{+GcAX~$5-DSVr+mb7_?QE{>Gw#jz zN9)M}<H1OrgGk+K1WV8YDNggYODeE(+?TV@@wK(fZEKN^3_+4d%U8f-fK=D2O-|Ka z8n*}DTDDAyJ!ns6K6Bfh@G($M$JsQt2!hTQMUa9oh_l0(zc<xv|AHq2N*5x}kr!ms znU`BpmP0D45G!|AV*mTQ!2ZP&z+Zqze1H-H<B}&)fC6u+1T3>sqI0I4q6nTy2~-3X zM!aasF@`FoE|)G!cWsJA)w?KTZ?}ej`unEm-v8PjWe`$=e_Pr_(sth{ut*wjvaw(B zVSw4SD#Fm$J8TV&##}9$AZ0<4|87H4D;t+wv9JAmRS^s@a-S%F(Q_~Wdb~#ita^_> zs6cq1aSr(1ar+<7nBKMWXpwsrjdUh;bC-XW0o%(q0K`{^04P$6BPq>W1*aqES^Qy6 zixUHrUbbBInk})+9*4|3>s6Or^OZk>ib|EC*YuYDuPZs1yYhj2IQQgZc_0s$0ZEXm zd-ni^QLcQAT3898vwu}@=#oCm?Iri;p|X*bk;=ap>7Sc7u3x+Q=`%jz$GzXXyvEa> zSYR{ypVFi4X|C<AdfS_{3gy0g|KNJZ^)>*sQ$~X9do@o2=oK&f51)_(Kp%71kF#vW zYbY29xD_W!dh!qI)f3|8W8}>_$x~jd+<HW`|DPS(#TGVq-UIi*2^$YU=gFY~ffv^e z1X_xZFR}1(So9Jni^=Ox(VKVW?uM)9=qaC^ST!0~Pf3+7)-PG~N;8}g+k{St(Z?oQ ztNhuokfdZM^%hg9VOyf5FQ*=LpuJ5DxEfb7>J1Du5v=x0!SQ9pB@hyv_X)-Z7Us=s zS^W~UkjTds5#s#C(31}x09Cxdzc#H-iV<vh74u8izfRE-AXMJOgF3s2aFOTdfWV6b z5Ofgl7E06v)VdzItVQ{375J%f0n&3;nTvnsT2bP|PsLR9Jl+i^Vi4-iGYJ<w-l&p} zzei#eLbH$=)2vB(Ir##>V$cF~CNIn>A#!S!T0fSuG%^Q2uOtev+@mVCY12bf%V*I$ z^XY=;W(q3FWxNfHHK=GlNf;k<5N$(3qB}#lE-0xD8ibBYGyP*-th}63i<niOx>XFa zP3d^@Hdgx@r&C#nf7^Gr;jDTUpS-#Foo@wJaT66ZzH_&R38p}6$tFWI)Xr7tHiIJ* zjNY{3mx^g9pGk7)<SkQfdK?K7ae{l(M29oFBnC2gt2I6xvI2H&3<(Yg^!~PG3mX+A zdmCvbXhLI@qzV{=@~EWWGo4KkI(I0K{x_8Rd}8ioYOqnky4c{L;wi;7p=O4<SsLbO znx|!fwnaLw9HvkUzDbhtll1xh>Ml0unwr{ES6({NGr>1QV3yDvk$GYZP>Uq4)B~a; zGL%co%tVc}pd*jq5kz-{T(c1v8pD$ojUmli;f%QTyOzmXPgLQ2y1Ww)_0JLGQ|0_{ z60am1y;E?kDH1d2rpn43x&~%)I5hdzi{jw^g7^E*_^$2NnRhNUETB#^l`FuB`gYWi zqdnR+EU9CVi;U(4DslK}waP&d+;xx2XEPa$UUBX+<L*cp4tN|My3nu!;KJ$!RGX&o z;;QTtsVghQWb1%hHgQ-9gj_rw^3BVu_)|99o->TF-Ao}3Hi%RSI{0jQuGTo3Xih~W z-*192FAawMvWjbe@0jK^l(E}x^(MgvoA$fT5IIHE0zqrc+IuYFx!D)PAL6v1GSYD@ z7^SKn4$UOdEhf&LUbG2;D+zJ|h6?L;BL&+Mh!P}Cu{`WBy1xi)kU$*_H)E^Lyo1c| zAvo0ip^h$(R=~tpmO(5zhe{;VgBJiU-DzG!XS7oGrf~>U3*08BucNxu){(a_M(jtW zUUpM<uqJ!Z$H2<?nva9E6>rnU%bLoeX%<+vjL_Z_L56}W3Zte@RomqlJ&7uw%R5Bl zFT^YWu?0BA+<#}g&bvJ5lbZAt9x?>B(?M?s$rP8>!WoY<KG}ew=-vrA7N@B>TXzl> zaP24O*m+P`=)yqYPE4()<>dqwyNHPNv$855nOc%`900tkQiGI55Ky_nwt`Fr4yA?4 z2m-1y*oKQ-u1*V)2m-1x*wz+#T$dK=BM7L$VB1*ab5mMqjv%0@!M3Hy?bfsqiy)vj zgZuWRc?Z&MM|(S;cO;$4r)vk`MNYcc*&SFAvgrxgUGF3(3)eYM`a%wiLJs{Qhk;2h zgCUopkjrq$y;+=ef<uS4pKAAg%Wj{i8Oq02D?gF}1bEL{;5}Ob%t1Qv=NSOdO#^`0 z3%nQX03^N%KtKl_mKz`d-%0aR0V#tndQx(N>iGOoRjNj{d!_RlM`@=O<f-cSq#}H% zgv0RX5}mFT5=0L-4a1QQ7_L)Q7zsoumdNY_U4>O?ctM;PO~+s%Ea&lp!YWaKoh}lV z#1lQ8trOXv>D+;8oXADfb-ZS2w6e;#WNXZ=(ddO~k_0*Bk{ARLo48V#$Io7ry|i8` z4x*`&y!>EoZgX2*Q#_xK%1o<x8A4<{ONeB_qP$+hii`5}dPJ($!Kf@=EcOy?nKH#= zPD*a@g&W2Ac&AXPz)6xIcnluBnn#o4)TgwHFn)t^o*=gv-WIOpknj6czK?6T0v!WN z=D(A3#Na;N*7qfOcoz@NVh|t#6m*&2!@Ia>tdMtlcZ5c13YR8Mi_LLCj81D&uM}DY zV&VC@eHBpMJb%Va>Jeb>XrhuNqpcZ!o-yGMuSgCEkvaVkD;OXE=V<MWk}V1yl|lc} zkB%K;pMQ>@UXIR=8Y1bjYAv!rkQHWAdW4dg=!kp#L>ZA@B7^2d4FO7_cv$A<NB5{4 zl*A=)f2J8Eox9wb8AnhFdPOjE6@wKH#x;xUIj=z^!v#v^YJ;>E1f?OKcVgg{V6rRk zIz=6Ez|A`Z<F?3Hu^g#AKnae4VAxRO1vWL~Cd}kR@K(SEK(wHA&Lzb6iAD7z`ut<c z5_EZ*WyTUEAt$+Y8=P5x=IuP!%`rs6+fa)=(4=f3H!>(etipj0qs-a_V^MQW`q zE>6iKV93}k)_^0LcCJlwYfHbSVOCeMvs=O~YnjZFSmwkfSDLG{C@a#wdRod5^U;Fa zwKX)sHI^?R(Nd%d_rD8dF)nZfI2ngTL?+k!`$(O=v5iT9`;-uKP3>Z0%i#_em1|kC zA+GW)iDC#zF5GQgoyt9&^g8{&K6EA$(0_P8ViuurFeH0su0C*|$yO<8dlQ1~FgzEx zL>=$!N)Ph30Jhcmb<8W_i%CZ~G@#x0Rwf&n#<LxQDk|OM;;f9mtA(Kx0VXoGf+U;n zWjVd!>W8Um4>{!=j*8|6TibVjQ<&}I&W?-C$T-M((kXI_W5BDrM^j5DG&qf8v|hRU zL6&^VlI1XrVMvJ4GjnsOo|IYCa}9*ju5cQbm%4fZNsbl4_|Cl=i{U&5Bbtvg+Qw3> zO{r%9Eex~qXOUYDM};UCe}3Fv706_FG-R8@z^#xuN>x$9#{F*V2cClX&T9mt49k2| zQzB&DoP%-Srhh{|RNda*rm0)@u_w#ig^s~GDAD6lbsvw6pjqh03SK==X%Sh8GGg>7 zb(Gcs%<U1~O6DYtmHW)(fD!{9)0}5o$1${q#J%Si%5!)n3-bSgm1~G?spL>*;t-{) z-}}qJtncI%Hce#h^FbMfpy6QXoG+nVA?WVQTp`cWh!P?k1nZYrAqsa*HE||s*lR<Y z@i|H{Q?+CmX96PT@96-`OyAdBAy@+(>;QK%;U|0AIVoHT+c7kvT0hVjw1TD-JM*wX zlEanO6t-ZIc!@(6bGq$ER1%}dvT&s00MqQAA0wM8z&F~;`2tLg=9O~Vx>N5H?EYI# z0|Sh7$GK<&=K~x#6K-Z_`6SE|ykh3LEw-m&^^Ygc>k)_iOV_>;laat9M_xSW<z*=9 z2c1g|Bf^J<&Y&X?4%AMcwUiJ4j9?on@L+AbL6~iqcbPGQ)<TR$Y@wLxW0}V*QqHMd zl$O28eS*6RQ-?*@zV%PjKSPCJqmQ?Ay&Q)!N-*x@1y)Fa8#0X=h&UGGkkwm8ROghO z?AE6**dym&qU0^43Nzz^m_W#E_+C`^iyS|=svjJ{*?jsOjRhW1k3ViK_lyi~#)>gA zPPn)T$ws9pb7bYR_YZ?H8X<{b8`;IfGI=I?E|s_69vtc`ri5q4EP*+;6;AR|<KcA% z1;||TwA6{B+?`J?QHdX*K?GRE&<D*mmzzl<jZbMHn7r&yymAX)Ymm2lSO8UNBmg8w zVzBYBG0JV#m-YfxN7nRCp~YbhDtgI5N`^GVM1MtweZ=BBwJOZ0xBl)RXXp{gQGeVY zAIA`w1H3OLlKDJ0!s{V3>B%&TIuLuj6mg)r3nFi8;2hRsvKfhLs-VG@8%JP}%TeX* z2K72e(z>zscwav@HaYoP>qF^GCeg$xp<zb2AaW!I5haf#dFJZ0_8HljpuQyf<@!6^ z=SR~7x(1$J<7_>GMHtqtTswz(m)zfNOCk><lI@u`CFfCN7&F%cbY30a3XH}Rl=QGV zWxNrir6dmV{Ztk&J%B4R8X&_|5x)zVn@qn2(p?&o8xG`^S<YPaP<B$+$_=`-a7wGr z<AglZWF-5vyl>0fV4dD1js|q(NLI<3Qs`J{Qg<K2{XfGuXL;Upq%O!Ld$Z6qROuRu zK5hS8;Far3EY3OPPq8Uuq@>!oYM07<UHWS+$_kIdy6Wf}IaWJ-S@>464R-`+pOU|t z*(%Sj(?JhHfbW!Zbb}3t8YoDqA_(HqFRRtcIR5(o;lInnK+=@^z1E}eEi+dTe}+C6 zzw*<@+k*((Ehw`tLQU{J;aT?1816XoPxOWM1EP$S+J1}Y{zst7LT_rQiBvD&w08F< zRF)bs5rPu*;bjvaH}i}nKgRSTWwa+i4!@VIpGt%pVc!3_2iKcsT#e1_38?5Tf|dG> zVGW@dvVyTRL&=syQ2G6pahM#cV2*TE<5f+mZV3^GV5B3i?`wh!XehPBgJ!c>BrBq| zWK2X{VW6~U1Ws6O^h8OK7KV0<BFmtr<-GU{>^4Abn3Qa1J1+hx>H3ih-|;u}Tp$)U z^cT2+lt99~0-+UEL0m(vF^uOFXb7{NwEaC6z0=c7VX??lcXWJwh&UGrdE1nz73t;@ z_pWMqR~?TQ)6?@K!8M2ZI<yF0|0m>>Ue9H%7KUp?y|t!-cj*X=0-QH*Ss8pnq}7JR zOcodpwz1aTtQy7<Uqy6tFMTe16J2Qwr?&aw_3zZ|*&Id2Uod75_1Rz#y`!E5bZ0qa zo0^e+uLS!)sHjCO+inH-mhI{K%&P}T?^)sHEP+zbHy)HnBCj2LroHT%fkEP4{>B@( z*&s8=(D(m$|LC`fE<MgyH0<~h`5;A?aW5nf4I1?|V#gqFDjQiT6|j;3Ko5L@BY<cE zive+yl{<Ib$KED+NG`Y~@RN1er|~?)(`Q`&jk5$C;ioUaA%kwZc<{rhFO`j|E;cmd zP>~cPBOsI4CKiFoB%;8`1=wGi6Y&GD&&H}mgA=p|Ma;veZF>7{+#&c1v462^L)sVh zEQe^L5D^)H+@138Na*p@#dv=$&xQA4_%w<Ja0jtZQLz9U<ND|qlBty)1MOBYy6r6g z{3T7Rg%+b2hnSM;q_%1-qKu9Wr5GcPb*dC&hRvpH-bvm1e0HTdJ+AA%AU&#RIk7Qb z)s4k12dUw?#3ug0F_z0DxnS}%L(sI9r<vvn51l|KYCL}G2m)lQly0C#dI_<9pn+px zrz*8>^-Q8mJF=SUX*!o6tPc|P?r2+;1~7hV>-zgX&xS&I7|1xos5?jtkDdb>8${_Q zWCP~tX&KSw>(B3&+V)&VG01ixN3|7%<x%VE|IVGxv`IJ;)@|wxo?v<bAPG(wA)h?F zDY`K*oPTs0LbbqPw^GOS)=35jbb-{dn!9&0^iCrorr2UHW;4MP)ww9l&B>3rhqJg6 zva-PwkND!!<oKE#ODdcgM7}_Gf@>=3PsT7taNiKpdA^XFhE~c_XT2d0QMy@8Vtjz~ z<2mXAJq6+uz(b*X-1kM|H@Cx5BwI2SjERtgFG#ZSOJMy@P#RF;s#C{y?osN(!l`3T zwW*NEcN@6cpks2Lir8zAx5p=Hsejw@!_J`RT4Jw-kTZ>H0@*8;U~94Ohh%KWc5j0m zLka~-31^ES#q`^l@OSe#hIpUU5^ssL(2`0qh=keFO=Z&!Ukfy>%4#^EjcS$>@aD5@ zHY&9Uoz<Bh_Qj!vo@r`b$GK%unf~@j4eX~dE_DwvXEvN0$*w6@(D|iKay5Zw;naNw zDfr#rB}lN>*0rt&oiKvnKo*B*EZ&rtQQ9~HhhdAfP<X=}%KS;5hz~n27wpl_Dzs`C zstjEq9y&^+DCGxs^5{60VaGNTr6WmQ@g@4!y2jF%c@D-`+NauTJQdLJN$lNt=}agU z210%Pk&Zhm;G2n@&VEgB#T-Jw!`C5m0w9&u5u&9zbyaDQ>E)^=FcSJ3DUz%d6NeAl zoYWwLyb%v%(78Y=D6(e-08q!1q$uJ|Ct??5b}qr@om;#T|FWnxs-LWt1tPGg^aEI- zGDZg!EI<=0Ro+Ru0@z`CikxGxIh*NjH~1B?#NrhA%_>7j=)tDt>oP|WF)`|~uHQh7 zYG=zF>X`5Bo?>5j&FJ@)C*l6^StQgnJ@GRQgYL>6iixmy@4$BwDw@uL!;SX-uX&J$ zvjb_L&fxF9y~Fn#IWC=>)2&TC&~c$W+)#1OjU0LrL}-T6p<AOKsFi<~lt8cqJ8p5h zJk4z);od5=Yaz?--V>H{;x)mPHE!<iH#$o&P~GG#)O`z3t)6wQuE%=F-M7eg{+>8p z)km>gzN##b^VXAyTXl7t5)5qcMTJ?BMJ{Z#+je77JP<g#Etb1po_8;!XgXQ8e16Ov zt4$|s@6R*H3U*Dra~wPbmlBt-#ys(j#}!5bqHxMRs(}L^azv0%+ikm)dbr&9u4$Ax z^W=D+U?=C6NnK^gS6+kv_2mvRH@0UOcBE3*SquQhKXk~#^JhGQoTd?3?$K-n#W;bO zLwTHxfH|UQQQm0ACY*%%t>#fm4j!B3eCL#q?7JQ`{^0e-SnF=`Y>1lNra6O1?&x_d zIT&j#m6s7%itZSsM(|w@>b2`)Q67oj^zbD{n+~x|DOZc<w-h!eFHDcI+a*jo6h-{` zlBgvVo;lkMY;=|95~DP-%CO`ho77A;2dcu89~~gICGCr02-E_+p0%3ODy?j2aCmfQ z3!<;!@aYYW5X<E~pJBRsqoY;E1EYJyNiw(Xc36XBGFjlDwBkJj;m}oCV(geqlI7on zK6%)()LSZsbu~3WfO4x~39AYah94DUC7Dl*AgaFlpbXarU35>dcs{dy`Xmr+Je^iz z|KKM^j@yX`SK&cy^_`bx^Y>%oy{}jKaRT_f*|PsqCoQetRQSORSYe}-M0jR2nF6ia zu17{rVpbMZ!2;>u5dvLz_8?%zWy6WAe{M_?^=y(W^EMrQTM}W3#J{pBu33z{j&0t4 z)q~g!7o!$EGJEMY!D%-;HKk|W`6O8U5G)ZR!}`LJ-J#dusZ|J;`zapK%)BddejpZ+ z7bb9yz00jlY7PBjU*M5!GxZFtkt4&qSP36&{yfBtdZ{0-gSC{UC!t7~P1Dg)l~|h{ zQMGR%-_Z!4IA#Wha`-4c>14}gStT<Fe+th#5@Y)d1VLc#!-AN5p_3fgU1@XVEQX^Z z$3YVT_RGlEqY8xs7WY8QpbqyEdeO+LlJ6?}u9AkFc|l~T!Av73#LhX6+@zw=#ouWQ zoNr;x?>lFr{Cn70J~@P=gWVE&_;l9D*QDX)Otft2>$6y^xWOCEc8lVPI%fn`7jldI zG9rjFnRi*n_<^r*I=g%=<Ol!6UM6+QnI)@RhaMo{wH57b)(@2}mf$X&I%GQ7?p<Gz zoHzynR(~wW#wZ3KL+RpUd#qNhbe2a=Xxt(FlAcl;nM!YQP%@$CC0elT0t_3aBjVHM zQIyA<UVS0@H5|niWr=5Oa+IFVmf#2U!HQB7Fnfw$(bN!Nl`+9Zqa~Nktuk6COxC_? zj(FaI%_dujPSfCsa27A$J*CKHx)m0nl~gX&Y)iQ=zqNlP{(D<ESfA~s1DxnRhx~|q zlgI7kTpx?YdB7eOB0hw31f?^UJi@F|*a%@U&#D);uEAn)N5&(yT17nf6Rr2K<OyXa z`qSULtw#g4d|s((L>P}Oh~?zbLBhS_9YHhG#yHV5^Nh*N+v=sdZw+<fB8bTmPf2UJ z8u>gqekaJ{Mz4wMnUy1B6}pf4sq+z^vvT7>nVKUH*5;YNVz5ubmN4~=6z@epQjzTj z3ppH1yrL=CF;GiH5^<e4#k!&Wae2Hhs+av914vBo!Hb?rWhn#2rxTI1X)|G{Y1D7X z2?H1;B16fcyln0xbRtMdDhR-5@Il%lmbUSR5D^T&W=7QCzA)j2KWiUiku#3YayYiP zEoM|RzNIL^zbjy|KKHm2hT;WI%km&eJOBQWAJ*1at<gO_M%j+p*b83OwkVhczG(%D zP2&orip5A>K`Urm4O&SOgdccSF|A-yZ_i6L)e6(=6>>~XsS?j5X!A`)`88Ezuk(#; z1_E8K&sWyge6{#M(_cELQnTZ9EB^+|N<&gif`^);@#P8S;G%^gT<m!sE}M!keLbtE z{*_~c6?DEv$T8M?mgn??=Xs70P_#LB$lXeD1os+ZKbj`|E@z+&C@)5Ee-vopMEkGF zQ@~WwmfT@#S)z7ep7AOVtgM`%_BVY=d0l2+fg@t}rL{(3Ctr2N=JWN8mWHnE;0o^W zIpVapzi*{D!aD-C!DzDUEzszrae*syAeSmm@Knr3+LazXdv3`)Um!toM5327NwcH> zfwC$NXmw{6l0M6VD#>0{T;3?|u_T#>n~azCfY-^z9)qmpF3}|p$%P;Au#j5P-`H+n zaa#7bRQKYUfc{x<!Lky*_8HCMbE7+tmiPxsq|3!2<yZnC=Svoe!(BT|*ff$pMN4s| ztdb#F5rJHGTS}Y>v@+hfB{Qs$$(mLXux?PxRIT5Ur1_470Ryj5Wecg@PcAxN(5vJ5 zS<)PFz(d(0M?Iq?aa%^hy0{hVF+ffDCSXx)wv2|atp~N#Q7!q?IsrsNvf(NaVz1vr zi0T8UX~6%Nv%<iE<Q?y*8sGJwW$=Abx2mqj<oQmh5Wqw8l|6@DbIL=H>n5rbSBqe6 z8=LX3JCZOzwAcD4)=;@Vt3HCDH+h6GcBHk3F)xfcK22+Ecx-dar3>gb9_!8K>ZLc0 z4{BHUtWJ+iN`GCW^~PNRmM4SjcP-J43h@hZ_-S%?HK@?m<4&doX%#Uc+hp7D7q1<1 zx_I=H8pN(RY&6EpE5hr8em%5p7U+^-($KD5fN_UmHh!5pMZnT;(r-3|)c<+k4eX{d z3XSL%gqM;sm~UQZ4pd9MpOp@-J<DPk;WJ*F!S^leG*?Zf_VEmZ%a*xjI1IEXV`wR` zjC_f&Ij#1ndFIW<I#REZeoVRk5Q>B>gV->0SihbxAO##l&@glm8CC1xGbfZR{<vka zu69>h;X>0?faec~vgO^TM+2qhwXaMWF6)hM>bf(2ziP}=C{cW|_#(m`OI~hyCh0`M zKe@@BkAUEpkNk{!t61#p{59A2UMNwgIeAfu2=bEwE!5$f;fkldt+TT|aV;P!MHx%c zRM?ds{h?O-j8<hRE=+e7$$QkM{yEvk49T7UPOJ;O3VwEYK$6<Z#Pu7@@1?}EVVS~b zFS)1Jj5!6ui(Q(10MhyPGdVLv`Lq~=KnU8E(NLxK7+&ZrwqKb;>m~jmQhwK&=qQ_% z2*fbe^7`96);CPf*0Y-$)Q->U3sOJUJg6HXQ?G647CG6%hPl1@Sh93sE42eyTw*Eu zVO5}B=N)fZk&PvuG0AS@@^3pUKolErH0rW+qe$W3DhXtC#=$WOd%v49q)2vs{?wrt zaGNud>21^?T+tdK?}2WU_%R0m+0B?_<Kagt&P$I-I3lMA8f{?c3zF~SzxM)*t$LyA zqy06J$%j^NWlAnf*wwn3{q*iSb@{o+(m>ssL9^v8vEf1WsFgvZ&>Hjw29K_}z<(`q znG+o9{+227lmuL=O9^rTp)6TD05X3FYfTLPF|MQ<uazcP6zM;HF}?ypsZ}gyRTUbh zLtlJX7$_nnbVetG+lC@xU4Q2)qYnDyYp|kqUrK3Xd7*LvS~WRP1AmCE`TDl?+klJl zt4lYq){|*6hzr5Rucg}FDnFY-J_mc0UAp_Wcw`xQwVuRb0ul7-!U?g5Hgt1D<1xtj zu~Z~;Em>^QK5LM;9>P0e{5Z}^dSY$HXX09EL(VxS6Dbw*d8Ml(y1)vY(6(~u_Rfq> zPzM29RB67s(@X49;jVYiR*l)dPIsY4w1mp8X9IHaiJMhrEpKWQU!p7Ey|z<FZp~Zi z){Y++{bCLzq6@{5x&ByTQ|1|kQo(Z;RXWMBj-@es7!8iLMY3=G@jRWEK!eYYC=X>F zhOX11Anwg)u!}NM9@5ie6W=+8Lv@+ujt6O6B(ua#8-f0DSVKkc9hdzrOI{N~wV~e- zU4gmcn8Lqc$>KBV-l%G4NL`cYx4N@kOouT#DZO9K;r8fj;@a1(45K?VSzasUW=b;# z<?l+>{QYkcoziAWf=%}4;^ba5{J_J16UwkMX>)l9oTVv4D$_H)#Q5#LjAoRcx@=x& za#zT=;}v=SI+*oB4PPxk_Ye!=uoO`Et>Uf(zqK%!NmhFMTJw8xitt(K-%`<9+%*yN zv1xah`J1=oC1O$fsQ)DDofLr(NM~^I`a6CuCZl5T!l7!3Q&3Wvy!)#}?ZybO=$}Qn z{Ciz|8mshf7eH!%0H0k=|E07gb^3hkU}sD_>KD9~wASMxTl$0_UYnjt`Au)o#ze8k zkZjsCJ+LK))&#(ePp}YGlv#PSwTmUD_UseeSKM1P7C(6>J>j@+M_E=`ZKz1MT{+U6 zeY&hoTTK(=@K!D}?=LmqKh-V|#w~mz=C$j80Bp;gamQ2+#cI>8`)&{@`=K4?S<oUa z`1JEHyy*l2E%y(S<we0eQCDj`J>RwyOW6?uz^BvCrllSwc^WmyDi!Tx7AP}8dVD-J z$73u-bwlOR7JU<_?&43%;=P5F^ELCsr*jzvQZEA4uyTjbgLvr@uxBgY&rh2#4BBoB z=p;!S*jkNSN=1C-T6uZUq7HCx+yHJo=IHTzh59|EB3!8)RgXf!ATV8tD(m*jveUcs z{ug?VTuH73pqd(BZ?da>%IdmaloQV0UcDe+JuRtBEo&-|gabY(5i&zYU=Ect=sXz} zW3yJPs`f5x;-SRQ_7+KGS#tUdl1gjPUb;8dDj3o`{0fVGav7!NNd)wKz%*=?3HcR9 zOvUaur!py-I*jP;3;ms}k?|huDb>vUnQ46Gxnn?orvbnWh|<5wjg+Vl@a8#u(hDD^ zHi<JQ>5@qNs-#+l7?5?VWv=iU7r0grkfdboJ{Vt-<38jviO&pOA|6hy<Z){`rnRqM zZqCWNECON2i{CkS;B3)cJl)07VM90(uJ-hZ@#g>rq&kvt^a$kf1N}9;SAI1&VF_p& zIlyJ()JiU=>rVqVla6XRby)D@vU)2y$h5CQws+$^0?FjQO&QzHDVZ5GntD_<DlIo( zLA<UVQamSK3@2S&!-MrOBcVqkd($wh9$O%E=I22UM=X5xy>nqWp##Klgr1$BS)rw< z-81oltp07KMc#)et4JMof7han`-^K?Q7#-GE#*&ResMLD^!Pjc1fqWuDTt^vD<sva zrP0!`>HPmQ&L7Ln!t5jd`i1ToJm2c|xn1@uy@r<h7U*R$e_9=Ub7IIMWh-b|mA0fP z<*;%wI5k}(bc5%bR`MjBpee2u#H1J1>%p>Q^NMC?7sSPaNGYC4G$#m6O;<9LO+fR4 ztDjQG)1<c#a$R#!!>UeD%1F1{<xESlQks;&dqA_P9Tbx;m(*VOz>De%mF$HCSPK9& z*dd|yLmz^#;p3k}U`{UU*(3v_k#l?IJjXjYYD4xf-)bgdH%R!4OioQz{h!YoEr)xv zk3Y#g%wi;Zb|Td2tvyY_(ME7vGcrwTcd(@oLvygTu3^>+>z;XbqWTZgmf4pBU|ZQg zS-VlZPTFMb;{qw`C?e?qive*Bl8m^6f}dSBid?Oop+kpP9bLs3ghd(EmAR&24ps*` zej4`K93$#QphDI^ke`p!KIVl&Cd<sjgOr5JZ}o{8wEBNCX8wxrce$?$&ZFmh4rnN` z7xN-Cb@p{~8M!wB(%jVjZG;~B>!G_5#rOpLqENeZSD!UqB#wcFjUf6AT_puyO<VKP zB+{`$f>Ui0T8Rzdo%DQYE*lT0(ZN(}rvM3oYE=n1rp5%V!DZEMjy9i5{p`8s2@rw? zLD_Lbb!ByhmYtcbQ5S<k3F^3g<l-*S3+`+{AvZ;+>}bOHmwYc8UEfVeXN9T+>^}&P zZ(cr<BPld(c=PG)JS=IpnOEh_8@0bo^iCXzB-JLJr*B^^d)Y1eimh%V>WAA6mJcqT ziX#q1H5nr-WKFVI5cBwUE-m-f*y_c4<@H$~y)N$zLn4<6L#z9v{EJmUmAtR!yWCvB z=sj(4c6NcO)xf_&UQUU+0cXNNMSq5OhPBCz_`k)aSAd}(5%wV_jhg*FvEGMFqtv*= zEMXr%t*cpD@I-6=@PA;C53PBk**pV+H1NOxUVf?xyBhG8cx5k_V_6kDlw95FCQMvx zs5Y%|r<l_p{g6X@>oHvcmVCsGz4u5g8Gk@xjwhegJ}|kju@~L|+;IOQjC6mhNxfxp z)~mnV5zFJCGxRhw*R}LoP9=rQQ^PFDj&Gjds(7}a|KmOW5IyBgqd~cMf$3kRBQ6Sx ze~n&DaXNt<&E!H+z7?{SzGhl|V&giCK>B>@Lmf%!72)j6WAHj1{8mON-T18`TAh+j z3F`hB1<%18seqpL3FhZw7;BWtAemF6c5n7(1zUk1c^NK1eDK%R2@8xrQCrsNzrqEv z4XYt=|2J*{D+Z>?7g-NQB1NQ@P^H=PY~tbqxp3wUIf6}lLw-N7Vn(-K<nkg0;7!`s z_NF!S6~-{(3w~J23Vw?ED$HhTjz`n~pDr2H;u30x1L;N;De{~+FML}+JFo&;9rF6z zP!d)!%~H&OHfkw&|J!iy>S%-1qO`qjJ#XTd#Qt&SS6YQA(o0OO$C5X=qRTlDc#(He zR~^yz%c+V$k-u8YyA0W0OFFxrhy-)13p(Fj$V_{T37lQv?irlM%b4vL;R`rZyT}qy zA$Ng1F^Wv54+w2OdMY&4>NT9)qawGP0h(pXFh^hIz|*E}@WmL>1X>VmdMyhq=f(S@ z^z=bUZ=mM5tLDUvG%9NZaVZR@x+-n)v+NF5JFA1;kq}6YH12W8k@5tI7ii<4b)a6? z<PfIYr<@g@N5+vibGmXm!})TAo}2F<be0$U&N;OQ*vxGA8aQ{i?s3ye`@}bJKLJl? zg6Idx1sdb;CtothOl~@Z9X&48spM#XbtOFO8sKYzcMYEXF|*CKczSp`b#2=Egv2E6 zJ}x#Lu7Hnq$lF1w7-1!N_W=wZI|@Ny)-C`H{Ok(Qz>2+6zt0Wj&<X~aSRF`K0kdE7 z7?mYJ74G<I+6F(kWil;&vN$QxBFwgRFj@~94bhnq%-L&}XcjC_T_yAAy3a={8x~cH zJ3&)tKkQhCokqbv{U+Pif;W>A+$%ZsUPRKOMQ(HsD}Pu#J<3+=6PG=Jdz#C@_x}VT ziq4IK$FcPSrwfsCP#L@s)$ZegL-(PM2tBObba2ByqKoJPpgLK<=2g3>Vby+b=*}G& zV$qg?(ATz97t87g_6G&QW@V&mH6fwqc=SpRip|{p*8(gWx*hvn^(z7P%SH208Kbt6 zC>9q(!#qCWt>n<$*L&Lke3`=-|9b2u;0;ZE%w;5cPtGRlw{7zqw#CJ@=j%mcl{U_w zU&Z(6w{8m<wocIQ>onEEZ$;brN@!J?i<hSTkH!tB9v&bo=oPx*#SqG%L&ooQY&slU zd8n-l?&N&LmA~rx>#yEEp6peZhQ%tXt1hmhLPf(fJd#GArP-C0FbpSK4&y9xwPA~b zE@FxWGQ1|-iEs%j20!qU@@!oT=IU8B(%brKPB}*YfNX-j;*budpEPG4sNQMXvzo^$ zii8VMeMZ_RDKF5${&QS@zrf!(Q(^56mJqc-stNV@7YU^`;UY~RdEc0$uAwnILzP+i z3`WH7v`WHD2wC&v|4Nl{Z_=?ctaRYoSi%WQ3(e_xmce{3%wit#xp$Rx=Dy`bMP#3> zam!dITj=}iZfdxwm)*wW>sdP0yW0moMf|X{eWF`XbUO2D`NyyXeGHUFhxE}Ev%7El zX@Z9?Yip2>PTREo#*(s%m@jvPg<d-A*_V#3C5n=iR!5hvcvEAWqlB`G+{!}v7rkov zk+06<e-pZ^-O3g`?!NvnY}bifGIDJPNVgK(J5{?GTSV23#4G@1W|AzslM1^Xd+d_I z9};VtUH8H&-TS(n?doq+OspjYw<m{WQpn{j{Uf){<CRX4CvV~Pe?Qx|6-&8g(qDY1 zO+1&<A6Fr?DOP{?J<^r?GAzm{Zo2^EuS?lk-(`IcL{{WP9xh2^yo$>Hma6^qo9g&y zE=rD0%qXr9%9l^3WqiRzzGZCX8tz?f4~Z-9jI;39CH#yptHWX(F+(%0ouY$Ut<mc# z$#C#8b|#JbMFKX8?7r!07qb$b(W0Awud2>WaZ+Z{*V&I`5O;Ame@aTv|0gh&zQ#n! z-o=%{)mxdA;&UhO)RwLB$)~2JY@r!SUb1Xin~<$z)8$RMD`f-~V~aB4%RKO2jJlo( zu^AwkJdrX17Mtx?MPuGdqQ{Y89-q8Z{Ub@-CREq8(tqJg!a}}!{HJ2*G978@dBhEy zw}gy2?n6c)T7(o_vc8h}Z<V{}J~F-UCZWHkC$7ljj_ELv)Xq7~ZJRP2V=T!VVnJBy z`E!hsa?W}l;#<A8&;6}|5VdiJCc7om?)r_vVreIoXVvuMzi)cwv=rg5Ve#1QY+ST$ zr)NaW9L~Y#AJo-<b)0sLW%sA2Fw0oFEAuER4k7-vM|KagpLoMV@Y!R~y=-7~tB%X! z5VQQKB*%Q{UZMW+uU?WN@@{b$c00k*!KI=3olz$C9gR|%Bri@9^GTT#Erc$lYvDBQ zC(j<k3mPs9FQ)Sy?uC345CsA9xkS12z?Y4+%Fm|jD1q6(WcPwjv-q-@36X2H>p%-k zNbs_Zx*F9)FYMY5wHFhT^N(8NZsYxsuxL1snyth5)a!=mAeK6_r)P_ET~eHTCR7t2 zU4i0#3c0RNTDNL(i{K~OA^D6#4rebJ3zQUXe2bW9l4bT;r5sJ{kM)IV);#l40E$!= zxpjrT;D5FJi)i8+KtBs9lyPrLoH_{Fj`{zAYj}t(`_4+V<hv&qfLP+1SM$o>b5mWY z6Uut#bwAlENsYU9eFnW8r<nRJ9BJi$kx&*1mx>KY=gj&JE~TY<7p|=1GY@mUQXkPP z&SDeRZSYj&p0DSC+#HcctGh3ztM0zRG(BX*;?5a0fC~9BbG$3y9&%}u(7uHJ$_kpc za<c|U7k`nH>@i#&kQhHO$ZpA~-&1w6+~QU}x!SO;G&U{~3-F~V_jKlG@eLcyxVZm* zxCW)<kHsZkP4O)(^`k2C0TN%2Dc|l^W@j$v@^^Qpn-&y(kWU;<8GnR~yR6n3FB*s| z^2`O@OIc5|o&T1oWF&wT>fQBH+0!@^UM32l5Jf8Q8BAG{6ZKojl{5ugRLB46)l>fq zFzoah#MRuFT;LM#l-Ygh2?E^)-8v|qAI(W+?Vd?XpS24GY}qpW>{LgAyQB2wq~Zb& zG*64){-jiheXXf{_6d2em6$sC1cT;NNc8kwkUk>=&Lx8i4x#+)>@G2VIb(q^@|-+Z zx3*>S!8Kb4Rdjc%*>ErV5D^Tv?_IAxxYCFf=<2lykA*?ob5QK>Zb-7+i<ev^BjTX0 zARB(={)B^8ev)a{IytChsP*oUP#WDISCloO_3U(P_#tzCofa$5)=Z&Lw|!sxQ5cIb zv=u>{dGs$yl8eUJV|Iz(WjaXkW%9I7@CL+bmb@-zF*Co$mAGMx2KoKy4+k3Xnp$4U zfA74q+mSDjlTWE8<n4MX3a&mP$FnAqa)(j&Kt}-ON}7vz3TvNj@31F-V~Km!D7z&? z20mFjSMgm~x=#`zSHO5Vkv4L3>^|#H)rCFBWEFCrRLeJ3`Sy(|WzdvMjdoVB-04nF z-!cc+8q|;h&#L>0l8f5<gXSc~xNdVlR&vlp-7@+g7-su+v%0b|-K+Pso?eLR&*^2i zrDVq_9m%oyO0Uo)AVg}fzW?g}=i|}61sOFIb6mRFzXDgK>FG4X+*5W}ccl2fC=FT8 zVc)p077g3B%Gkq^mZBEfZ@+TKKAaKoTHhG<4dSXagj;)V?OJDA@qJ~Gm9~fJq{GgF zG(ODW^@Drai0iK3_%SP$&3gKo2Y&wmoM)_{X9-nj4>4J8HbXDAaK9T6iP_teKN2Zk zeKS>1ukSPvQH5b7POf{0(2W}8Hn}bmC$~w*AMEmI`x*bL1m>3l@u@*m9Za62(-?YP zg|nZzhYrj3ue@gp{c?8F{HcN%Nb`WS)+eplwzvS?(;fdIU!^Bii#ER7Ff~XZ^j8os zOr=<;xj0`g0gI=-t)#P9;Rg9)7)+)1&z|22AI1)%Qrx|g15X=6TBYJ;4qb5-irX%h zR~uM@GN#e>z}YgJW}2J^Av~+`*lkyglHk-zmIodc@cH~vpL;-n-(^}A%3<X&08vgi zpT5_5Q0ZHRgbAMRSJR!3c#MRC1FA$wIief@H~NMOhUS{BAP$0=^~ICi%_ExW4{YzR ztng3dV=n6G+PePWx^j<-{!Wk%X&F@$>1N5JbWjJTdJwmBfMoMV3VQ4n54Sf9ysAKv z>W1;Fkc~la(g*x|yF#8?XWGyD9!(T(uFTo8W*-t<q6`<yqyzHI(IIK8yeFLu$G0yT zhBMKyv@$+k@Y1=N?^77k8Gx3Nm7ctYc|#+H=}Ad(EEu7~5R(abAeL}c!IAdP=0x&p z^2L%;KXl<=HxVbl+*cj2zGNgF8f+)3`%Q@O+ev|k#anLr8OTySH1Pt|cnfyg5Lt;r zWd7~*-6DZEPyf1={X7=hnehK3gsCYIf&TaMkFr?h?OFLWuhZ)f%%$yaUO|sCCF;-I zN|(i}eYXjfKfPj!u^qH=%QHENR};&w{L2M|!9MKuOu1Up6h?SJ`QOoYTfQb=9)6zz zDpo~s<?p&|vuF9YN0GvRXmc*zTb;0HptdHJUBPC)cIy6TLl~3ayY>Da{!eIp?+Ku8 zk&QvGr(;YySk(ip8>Iy`nZk;H7a)h6wo1-VXmS!<0l~nnULd^Y(3DE|{Nu_>+`|j7 z)NBYu7H`|!@`I5ENtrUm_oovo&|;Ah*}VDDIPBA5bDY;mKQk!qkW&j`x77-{{J@-t zKmC!ZffRmbvfF;CgNEM&o&qi~ylmC7?aP;-(jvG!r`}QXR96qnpsD_9&pzP1J0?~2 zOJtYktCU}Q*e)~6A!#&hP6DoH-Mr;IkVMUJp5L{Y3C&k?jAv7rcc4msp3h&QT@8El z2jBj~p6-=jx139SDwzLa8LK@<M~!+MEk)tlA`BD82Ii{8tE0kbyr(F$w^iwELKSCp z!DakZ*m71)FE6QB$AkY{)Gjsy#sRUU8ZFg}>2JoHep-ULrKQU^NN&mgmP^EC5_L;X zR1lavSa8q68F6!0*#Ay3^z9Jl?ceX+oY;bCNi+tXZKgcSr(aoMeI?V-;rlu&NZe`E zyswk}jVpU;|C4#+Vq20GX-VL7Kow@a?55}t{o$`6r`)Mva((D_8Y}$q$HS*%b8So- z6&kHX4Fsh9n8Vu>aveLCjSBrgt!GGlPWrCY@V;kL@yBjDRN;PUDU&8aS1f67GA9lZ z*Hn@p#*NPJ01yJ{G=p}H&bFossGya*1|zA@D`KYzlvavIE1r!?8g>3Rw5UwC78b7I z(g4@o7w7(S@e?_#OgR#bQ*FH9AUR}AtvhyUKu#d3ZnUHKP51PJpT&vMJxw}XC6(z$ zJL;_@o%O!K%ZA(|Cz)rucW;E0{;OXamPv?~-5UAjTsp0+HXIxFhRTM)#DosA{ofK4 zbHOVN#s!vA8;xLx4uPyWc<BUb<06LN9xgbPmDjc#C}^l$wEOM1fOps*?(+~;b<5mW z_671WSNyiGp5NEKE`pbCv!c=>@no<$)VF&s=&HI~&d)npYPIxn$jK(Qs_o3Ut;kJH zZ=R7A5`KQDDvP7TnC9&?5QnmDUO5_C$)%b0it8jCH1t|I<6K^1?*DVe2)!4H7h(0F zLDvF`CG1YIlT)*xe0@LtFK5IuTIXy8Oe`nEWuW~c4|7M)sU7{-u_;^UaCil!RP4s^ zT<(LM2WfidjW4<D7;O5BS6&AOsTSi&#W0mb&F~nuBbafBAQUZ%goS}R3KTB+Xx*pB zg`9YB^_nDWrCUtAB%qo1>BAgY{419xB~F!at&-u|VJZFVGwPda(o0cV`qL;jqgGS< zcr^Vn+&?7X5Y=ICi-^l~fAS&#IfFBgK#5QsX=6{ZxGU<twfp3u-K{rNTt)EHvS`{; z_e{I_q#OPR(oR<sIp_{rUpTlfxR%MlbPrDMS^{bZ#()z+)}i}UMKQMv=L<$Lh+BPI zkIlrHsC_&JHsZY3S$nX2$3Acv@rIb6yq`Uu;ydBkPRXa*Sp2sd!p@JaOs=ZD6%nom zwfMBP>B3JQyEi{w`*^`t>6A^+6NIm%<p1|H(M~&x7H!dORL|3nf|lfA5JyX&0r`1F zDQ`17a*0lGV77$an*EkjD8KsY&f*64JmaP3AxG9e!2*(&Wn@1{$Tp!aY+n9}#05BR zjoOnN)QAT+<GZ~DCp_9#F6+bvI@l%bg;kG^?CBTw3n9PlAy74@8V4W<B+F?z=u69G zs&|pV=XVAfAPmyzs<Ce`fs9}H@4wn371y8Taz^@9j7B?u{$d|u3S!CRs$Q||JjNHV z^<KARlaWl$+!<wI<{$(-UJDIVLx!!IXQ1_EypHGwDd#DwEJ-tFDVNp!S>ecX&2afm zzKS)eA8D6VrMoSyyxBPrnLV`@gEf61)4M*@)10ua6@y~px=U2d)m+@~@$#6Q$LQ>p zl!OQ`pT{^8MRY(6u}*|Wp5M8}xF8%JT=4Y3#&S_{K3<qw{7!K>?S`2KlIMnL851Ql zZVH!tC}75gjS+*`+UQ3D3!+d@aD%zHRq1`eBJX8(CQ^9e;B?Y!6Cv83C;p<Q)VdSj z43Gn$r^r#Yd-Q20>)kjL`yEwFYksp;r`p=*^Iq2DyOOM&ynAcpyX$Rt%P1_hf*kMZ zO8{oz&sbvoukp(KJwUqhbBO&vPv`juH2If+{01_BK9WE0!U)-;9Ycc4EAyjkcbx<f z3hETV>;+Jjkx`^4s|%$IAl5<U`Z+ZCGi~S;JiA3fJME;Y&c&R{`J_fbE;|MCG-)Wn zk&$e%I^RGnQm@;XHm6!IIX2_w5(AazbJ6^v2q?=r#Ck<kOrNw>q}vD~94ETBD;)wG zVD)K#Ur&3isWB3+C@n6Gch`-07U#OoKdbV&Wk6hBz#3Ur5+RH+1fImlNF5?4jJwRJ zO|D}!X3bqRjg1Pev8zh~5FftZ(i|!eGzRNk&WvT2bUU`Gb!)<#_~tz5QEzTh?Oc)S z?<_&Ne(M?(jV*r&He6bnm#*D&W`mlW`V@|uy{l(DqBJo^MoGDhI|SMln8^qtvjHh_ z1agkmg$sW<*X}xVTWMSE!)x_B=05XWp`)RkQ?45*CNLFibwjQP>br-1q)rXuSHIY@ zVR*2wx3Rvg#9!dd%jbj4HsLdVrbv>9HYyCol_~Ekt~#M2mz~8~%dUdpI)D#$^oXYE zwyC?4Vn+DEGiOF*cqqKGGav?8p+c8e=4;pPI;B8qB8R9zr%?SAB3<3~SSLdQK`@1a z=l8+T$z8gbly%!W8?!10CQ^o}5SHZdr^>-P?&_WpZy7;cc{OzGXv)XD1dpu}M2dQx z+#pTYt78V+8J;?A@|oDAvaJg;qblMqBw>J8U-u_Q8m0Wxk9{NrdRSd}1r4$eojjr> zblFvj=`BXEAUD5IOhi+#5jPefEmE<)Bgr;~2u4O=u4RiewBG{~WqUnp)Z~Hz4stJ> zkv2owfvEt9M=2s{72jt!2JfP3BbfDUb)f_rjBw}_0(b-VeHMl^7GjIa>c`^-TFILc z>qO{s3z#B4qhyK@m+&cwT$slwm9T=bQp87z?sM4$y!MKI(eV+SAk?*f52#+-yC&*i zuwkuJfp~DgDwMZh<kJz2x~*nIE|_xK2=3N5;<1ya8&I}X@)YXkYF(g&5({+cc)QMv zJVMShR?6mvA-1mWytxvQ(TMy&eHh_ZA3uzQE6V%@dHai59JZU=QSb3Rhv_+V?`He} zVZkJ3LPZInuBmRm4zpDZ^i~wSpNO=El;%PNXDoTa?_#d>NCU+<z6+!46c-I7D1E!C z>u5{aF#|v#B;B7gr&4F*Q4)9CTCY>F#HC^dBe6nwtizOQoPwg12^=ZAB&(p7O(D2e zETlbaf%PDQEnkAZe5d2k@3bsKaNOjL8UyWAIvubeQNx6WfV~d|OfiPLsOgN<TuV<@ z#A7VJPMqF^(UkQYBRuHidm9U)J{Idm;T}4}Y?#JEET~i$ptcko!w}W#5*h%7kX#a! zn7E08P_}j-%=zj<A=K|@=;Ur|(K?#y9c@m&csecW8oUa>#W5hHkL@pl5!T1z1T2Ax zd;A|Htp-K&89S2_GB@c3LP!C@5<czR;vVXnghc$p!lbRiY|f;p8cN^W0#0vjEy?-@ z6G*c2v!@-a$tdW#cC}(Z?k|d2E@eHTIunLX9J%#L@^e2hLq}|>=^djZ7qo1n#T!&` z0TE2bE!^u3X?3B%n8BMebRvkwsMWO1c1N`w0E`syF+^2vLqvy86}{XvKr=hdE-EVO z8}2?Ak<Jmm1;ISOMfB<Fj(AXUl?eov#IzV<kmMK@M)dTh`#~MiMWLH=UAYDuIK~bC z{5cRet_7<LtDSk{K^*LLsu`DfsY3ACEVJeVcrBJoEx8sGrwfZEl$?schAXA|7=UEZ zYz3*MP_>`htM25j_~e40Jc@)d8l-*dXTBV>?$9`gIeMfV-%VnmF%_yHBWsq&h?ot* zRo#B26$u08>OkaJFPC0K8=%ituC6-PlVKFJT|?_MTjV0o2;)qd;BM5+W{^lBX$q*w zypOe`u)C5=$aHw1-qJ3Vp1h@l3Fn6cuC4?FdE508_QM;)exnGasHd)a5?HV%lL-t$ zGa8IOMa-{GWVnh``odhRie?tJiF=?A(hJnbkr}%RK?GSz#?Fp=h&5?2Gke|Jo|S&) zf&qI+gA^9wwe!VXn8yyZeid*Z;$zmla-m%CpUsgWYf@6A5}u;SDYDPNVN2tPR~?R{ zuZB6-w@_=Z^0I83P?%if#JDY2189)X(22f((-N%-r=FpUS+=YnuPWK#+6>?cB0abc zm9b7Soki+|PTLlulS-<tGUvj_m(nXsv#6UsIw4#SG;mTb`1Q-i>NHwJ;e};<T)yu} z@1SvOcNw({jC3oJ1Zv4NwMd!aDaMfp63*EeNbL&T!N1itY^{9&UZH>CqX(w9QJO93 z#h!H8-ZHU81HblOrH`JIe4x0Ns7dSNFv(<@QylLby>3%1r9A2|=U!f2C_9A~4Ms9_ z$^rNezV)=Xt);o4E;44Lzx(^>y+At#tj-ky-?)gWD65^M$JF?+6U%t|G)Lg@@3Z}1 z1a<O`Mnujb&8=L+dn=sGgW1ro0Y!WbF|cJJd&~OS@eGYPzMW6fpy{ezoZ*=iM(*sz z9SHf;t*R0ij}ieiLoJo0@vOPiNY34ru;*efE>oG(Ef^uf^T3ZV@%5pe?%LG+vxE3e zgDS#vXtM;+Y7XGqXCVoOo~Bbdj!jYAhj8z?RjJ8aH24x6Iz<4E!I3(h(RYCu^D2$Z zB%&`sxp0IiVym32m{FYJngfulN^10yR-|+*9Y~e`_;Dm$Qdp2zEM^lLHC(Ni15<w3 z5$?{6nL$L)EfC6z2(EDjZ_>8veY4EFH~ERQ0;O8{v458?xSd(cY3h3oM{RQ8Hm}tX zB7uX*6-c4QlSS7#d+T~S7Goym1il~(d7%Lr`_XOSW!i{YP10Azy5=k)W<FXW%VPFc z`iZby=gv5D;TRnKEYFNIkd|q1?f$(oKRu`ItIp8PrKVPBnK{rsoFF(clyLweGawUk z4g@3}ZLMf;59t$q9s1FO`r6_`#|rkt{`oYenezjIoaq_7-er;xfeqBdHKwR=tv)Vl zJ6Mw?B8`wzFHVDyvz7HGZ|wux#|Nay_rv#En}G+of2S<qb>$cNa1aG)P~}kiG+StV z1+~lcqjm}Oi*U#-th-(V7MMUXUZ0?kpre&#?JYqNB*}gEwkxln`g_fWrNcu$%wJjL zt%$w36P1+{(h^#ZDijR{XXD(}q|92TL?mEyl?}ndydx&#M;i*U0R-qasX1peoy0-A zsoUUXZ*a8?R6RehDrFBwrHaS}$0;FbH%o`sh?S(DpR7fF=qZntC2!7ho+ZB5u;q-K zy!lbP6REUpH)8K2M?vXlP%8&LS9|N-xFq_dxsy`6d}QDV4!&}biv7t%C0xa;SLI|H zfbd%9Vvo$H3tF`wSq$~rrwh7Unvv6K{Cj)<7t@dZupZ2b+UFlM4D<(|VhjO?aWP!o z5=&gKKvPC6RMz7qtw`yX4d`*GUw@oj+}CURd~oY+Jblyq*okp|zs`v6T?pkqF)+!g z6y5a3Q^>8L1S*eACG4&Ax#tQVZ`~~`@%sv#nae>M?Kzg##glkK+MttHwr8NE8o*7= z15m+WVQT?&f1uvdEtIsk5F(p6hyEn)`#fwVk7W{DQ1vlYhD05wSp|0stWN;X!E-@e z=VDV5(j6iKkc@>OAdCktgQMy}Y$zZuQK|fyCeBcA6FPI;ZSjx5^y+lt=)9RSxV<nn zhRk6xkJ>(<M#mvzQD~UzBD{l?N16qyV$HKCI>{D_7?hB!SeBM;BFFi&j$%5F1Fvga zN<+8XDpfhy-ZPcYV-6l0mj=TFp?YQ_y<o6^SE;FKA&e=0Vt?58z1E2xY{jiJca-K# zfdWgP+ld$=CSQ=-3If~+tT+^0TTXBI^W?cJi~a0w3q|`-dQ9x}+!Mfjf^R|sc(UX+ zMSvDeNq9`8J_V!5*`oZ^wczygx_;H?$=%MzgDmuFPPO6`Pkpo~$3TP8#}yjGEN2pZ zIigh6US?G@rH8PnmG-C!f4@>I!HDEp7iobi+gg|`Yba&D0=LIjb(&6V(AmakYwJx_ zO9<M%y>Ts2khfjThy6J8I<6@d+~J)@)#gmHiAY;R6`^V*g27b)bX}4xXgxw4=&guJ zSYz{PPC}O^)w*xMe0mc`B~n0`C`qo~mfvlzRBC_;ygqqbdmJXgrYFWTf@aPvL8Z~$ z8?R5YiQz*&;D>DB7R9Hgg`Yr$78Z-~kTw)Ae1kVWQ%~fe%f6QRaJUdXk8KJyQJX|e z1L7oc491GttfM$Iv~3St(u<8YCPO7eV^9QgT>%hC1|kqNpZe-B$-~h1m1VXh_(PK{ zwDB++m*i0*1I&wCF_q*cO^_1I&J*d#HbTT6%=NQPm8Yr&H8s8aPGfyVY0$r4#^b0# z6GkSSe7+ewQF|HcVYniU_Skf#Ot5Pgpe%}%YE8p4caxLz2A3@6b9P)$h_By=lFKrP z0E0Qj$M~dXsfXREDo{H7G-`^Z)E`%$4s><Y*P3bGkJHuMci1ft?jmuEVQnEt?spsc zB=JX3xu}U4Wm3P!)`aF+6ShiOo5=-sQr=n2=c1|av$0v_%>vNTCG)Ir%(jg1?2)I1 z5KogpJI@5>B#kB9CJsG^S6t}zWahI;9PBkrqgru^7aL7#R2kf+kKnG5sI+4Q@vgkU zQH<xa!B!VTdbeg529;}5L&(uih=UlW^G1g3_F2GU;$+5+Q5>doH5^2G9?|2##q$)2 zy2|kmbzOBba7ghy98hp=eR{*6SNGZ*MdRLlYYV|c*b-;qI$TZNrie-Q6s2`hacyzl zT-1{&N@lr;bQs}nVpq;<h9M&vlW90fHl2m?u4nvO2AU>QY1pxbD&6BsJk_vnUJn#F z^NYNncH4$p67KQdN5gQ9uGWqmxx8BmdMWEl%3_k!%$)V+<k2w_)`uauj<m@dYB9x= zCzl&m#5mW4Ens98RIjnDo)Ymcz_R>uXg1sqZ30|3<!`(DG^dSN#IWz{kopEf5cw7h zY#Bo5`uiG=MH4icMH6I@PlDoQ#@m(!0%fhTlzv@(*jQ7o^Q9$87$kWXTrVsgLb%GD zG!R)08pW7xl(qNQ)&=db!-Y+3?pQ;_ynDYcRMq<sDNk>!E%Rz=+R?g;I#d(#z5=#f z9H%k0nla=s<s_R4i+c|#$VpS)La?Qni^+dmVAYi3CtgAi8cfSG8=}`@d))5{-ZR;` zR*bk|`mfHr-i516yqt@8E%dsMWoTH$Melr?&2V=<+H&=k4v^JjXL1Xx2n7Wb4<T|L zJ4=qJ18k@!^{zFyR9+pPUaloQ-17(RETa7ZT^}8yXN`79yzVRp1>ZD1Mz!TV#Pc_L zl9oliKvtnyWeSseGCH-?j+4rXS}^HjYFRs}j%QLO-G;7YfL<dT4B%Qfdu#8OO1C7* z8^uJ#S6{AKHNAZ4lHsAA?r1|@O?k23mw&h}hW)VDtlOp%_!)m@$#t*meH7j}=ccJt zLUnmB@=_l`P;@6Dsx(|nIcfWXS9j@xW0fVbQr`7Q&3UFUfGuP~Fr|1O)q%>6oCQN| z4JpIOj<BH^Z5Ino>85s^k*2r%l2=S``3;@o&psLKZ*30vT>0De38&UDWxt&LHjJ6q zSn|P-z`01MJrD}ii@uGVU6m>Y{D~Be-f-BJ)$7UG<nzfWp;52}ouYMd2oI5pdt&lb zIZM;$q3QA_<VDg2DIyTO+e?nUGQG7(BTA_ft#uhcR$F#YSCe-4XTo@OxVvb&b|q&s z9va$!;OKumLd7eZ2xS?2!m!J30~jg<EU5=`->bX5#oLK~h@E)ERNsFNwBgf|%Yd3w zuHL4w<Wz<)XdulL4bgCd0!YCaolZok&LWF2B5AyBt#$?7F4@+ujoMp#Yaf7D9v=S9 zR|9>WZH*1pRYCJC^H<w^rlRqg2Gk<-D3JqUZsCJeSX3J$=U5_G%Kwqn*49|P4{XVf zW;9#@YFqn5m`yq3QINpIhiy?ncvt0Of?OnLxL7~L9XRpbxPGNDkbf|rrAZw2_G*r$ zZ%6IM-Kn#NPKX2hn67|pB|vMDLiY2B@0$$Lq%cVk=2o;UxJ;!@k`H!93#RNH>B)Rs z78}ZI=(2$sn8_)U@_!`|YIzz7%);uzf1~z@p_5ZHhjRm)9ykSs0z0_!6F${g4+-NZ zIfby86zG?DrfC^c!i)GKjXt(ULU@W@VPPe2$|L=G@GYGZFGrjkZpGbxz{155CRt3N zaOh9Pa1tiz^MzI~WwjmaIy*lY)}Brl<!$ocd5?Rv+nZNa%x3?ev!`vDT4VpNgRZN2 zP?eoDbO-H;2^1A}T(kIUzFOScSgIOVz%lK#<>#^5_DYEyglzfcF{ZqFY5tSf23<^; z$9enRilJgv2N@^Sm5nR>CRk>C>CVF^8!vi@{qux+N4+D*5)+=s=SvKJ_iTJR13<vn zKDB>=cbi2ye{7!q69Ddq^SipuFPZi)-9@oMfKE==EDqGIhXH5|Khod6g-6&2K`$=* zM%<a1g*?}JCa1n1?+BaH#;3W=-mRXTGTz&T-KVV1!_=jXAw^F@udr0B+zFY&h_F&v zC-l)}U2ykUN0=n#lG)e3wh}0Xv)Rj{UYzrre?D;)E$6XLmB=OR6C+Cup=anK7io@0 z*i)>E>UV3_Q(GlZb%6i3m5<k2KH3!5RPw^SLQ~qPDfa)PGC{}FdW4v6t-V>_ky-y( zlr)#(PZ4~|msH%Jc&a+@pY@YkHVH^5mb<X?eoZ*jL}p>wEvB&r6ly{?mRnFT;lV4K z^+KJED6GD-_kg9+eDCb`Z<$Sq7y*&7wU|?`#@0;xOI62;TKUaHBV#2=A)&^fc}f6l zaiTI<^v=WDa&Jup3IGF$LfJICmCsG#ap5u@Hr2EqW;$)W=-QN7$d8^2jgyuhM!#x_ zlWw%?xZTN{R<;#lz*UyVoB)$RVtXe+aHl8H6nc9ST|)3l4DvWTGZ#$~%-d3TphEWk z506FqjT_XhQ<q^RvzT}@WMdt|S&|<LRZ~e`?S{yeK1G#c5!z21(=G`qc$ZmlnIA{7 z3z<q0Ol@H-xI!)3YW+gvik3pv2{oFPDBXL#+akS+MJmI$(i=D;#ux50Tx}TCsa=?A zQC)FNmdw1#r?k>e#7Z?#9R#IdQP|4zwLI<ME~lguunOlG{iwHCsHKFuEHEp_Sj_(= z$rJB}OhUCD!Y(bxbm5^ST(H`$8YhKJ1E~0jcE`D#b+x2YEf!kB4xyxQ14@^p>rhvv zav^jmqqi`qkwoAaQBj{HPFbvKn*u7SlG@H76jWSznSSzg=3R@Kprp)h7AQm!<*Y?F zkXnqGq4XN46=p96irONSyHqsAojY(HBvz$=S5k)XkeK6?ehm+?DB$gd`O!Z`8K2^A zI^=yjJ%dfz@_$GKKO6p+9upe}7Z0C+kO&Nc!iY)Wq+|$k3Q8(!Bpp2iqc|pJ@e(9T zlFTB76~!i%U7B<mGG%edmLpdlCl@!b0zQ5LL4}GGD^aRUxe6hbs)SXGs8Op<y#|e1 z0%5ZmSIydLojo4)iFwCD!zDLDr!(-W&s=fYwXkp~Y!+5F?6AuoTRh^p6HYthq*I&4 zb5~4U*6Pu-)QpLqtTC?Vu{-sfX)<Y58%~oIo5^~kYC2WkrIlSXnLNB6-MGxUyzO-P z(NXk<*H1M!f?o~6{}4r%+YQX)QzwvcYkXxk^I^Oban|u;oT6|Z#GU}oO()=ehFsf^ rSNY>^MQygY$tO+$E-!!awx&|feQU46W@p<i?yb7mrmLiKuB`+BSF0BU literal 21944 zcmV)4K+3;&Pew8T0RR9109CjE4gdfE0IpO3099T90RR9100000000000000000000 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 PQtWEZ=5h_SOlTAUVvCDK diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.ttf index f2c3ebaec0e7306f4ea36c98f43e301c0a3308b3..fc8625c81c8443eaf422fec5138f0bcc2a78fa19 100644 GIT binary patch delta 1083 zcmYjQe`p(J7=FL+E_avY^201i)plE!TeGr)Y18a7`oq>HU1ORt*+5}-wxLa$>0*zy zZmCM6c2X#V$}(KVu1(t&Hguq7&Q=PF?2jR`Kc@JD;MUDQoG4nsiAuW9w^;<??%wB~ z_qq3d?)%<v>JR$Gk2C`W0L<_TaL~K&fY;Y?ej*Go`wOzYeW{ohn~kF)7X=`pzGK5K z8nGk*E?&ZXV?rB9eQPhQ0nEJtU_3Jr8`6-s0_3k?lm?EBB*wJgK1Gc6-qw=wSpP#; z-aHF%_5^ZjG8xar#7X)$HoS_&_GD@}U3I2$3kp^MsC;CwFV@|1A_Oq~G8&Llv9w0s zld;KkH|kx_$5Qd`t?4uxS_9xC+ThUe;-P>6;Dct=k84Nc+NqPp&oN(v`U#-m!+4cC z@OMR!J`~=+S2LV9A2)h3b?h#!rI+D35c0e2q^?%y_U!Tp)PTCnuee3QLIqJ!?sIA& zfVh-yrK;cKQQV5+@dVTcA6^c-;7~C-9rn^^f+*TIQl)oMa5$YP3!uVTfdWw=Gdp~S zjMv1~+oWKF=yvH$Tjh#I(-u)wT%yhPptDAAG}w$h=MV^|lgK2IHw)KzQ8seNhOE4v zQn9Hs(9Y=}u@T8wRd415(<Z`O6}Q1#ZLJy!St^>SdB17=HM!C%OF#M3Rhx|lYP0f^ zVA}4LMJn(O4{S2(1x=uBvLx$hwbE`;Bs~>X)n8$07_E1j4J{35K}XC@p4!sXjAgIQ zT+cKn8dsXc=H3?nqX$}Tt@*Z{kDY6u3|0o844w>r68tk%8R`z53f<}0-!a`$+~eD` z(plHJ7Jfba`{TzW&5^&lM!PO{6{61QQ_-cp+x9M%O5@1A_5DuTV`;t%M(z&o85F!1 zZvPkADiipA`YY~den;*FlFiM{lDcekULj*yZNB}9Z5GbOcEdrG{Nn<ce1^kuSf=k_ z0avL3MT8vK@wssV?7)*cjA3X49Y~-+6STn7&;u{RDCDy8f@)_B1um$@L@OMESSfLE zL5(oReqguREwpu$-CzawG0U@e*&>@_<Lp)T5_^{UnC+f-eQrIsetJDyyiqI^zbk%I z{JQv6@yp`%)x)ca)&849K(e<M!g>E<pPbRd(G6?79(&H?eIFAvI$y>VWVl?$9JIq{ zWz2({@MWxnhl!_*h5zv;+E3cbyczu5IS9faXfT3Z55oW?^D~!z=5R45mOjb`m-l6- NmV3|%0fLKQ`4^>=6|VpQ delta 2627 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 QiT0OhM7<*fKSJjJ0di_dOaK4? diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff index 1184295def56183abcff437cd382b3b295a8bac0..2d3087ab4960a26677e544f8f6ab204326240a85 100644 GIT binary patch delta 23558 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 BsapU5 delta 24424 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Italic.woff2 index aa05e142c4293315104e02adac9ed65dff454deb..08510d85a779a19c24b2514204ff9e204edbb3df 100644 GIT binary patch literal 22076 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 literal 22748 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.ttf index 8acb365453b7590425ad0fe65c41a5488d3d64e9..5115a044ea407f8ef1fc646c3485162f0df1258c 100644 GIT binary patch delta 2111 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 delta 2691 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 B5kvq0 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff index 9f8228fc38b5d404b5573cad5b33f28dbfb47cf7..42b74ab13306c0c6c361740282b13a3b36c56065 100644 GIT binary patch delta 36114 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 delta 36390 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Main-Regular.woff2 index e3f71eb7e9c0568f6144e45c59b3000ed3dda7d4..18647fa6afbc40c64b6cb0a5142c2ebae8a21212 100644 GIT binary patch literal 32312 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≦e4Xlp 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 literal 32464 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.ttf index a645df64e5114034e6596c79103b380dfcbc8061..326b523bd0eca107f1bfe422f211306e491eb278 100644 GIT binary patch delta 4785 zcmb7IdvF^^8Q<O8+dG}!&(p(_C7pC9+miLPWZ7~o$Ihd6jGfXzg3}V$N$S$Zb?Q)( znZhM0bSRGkRg(gR4g|`yLzxK^QkVfc1q!q!g_#cgQQ9d33``l`LxB$CL40?Tn>0-e zjOI>zyWj5Z{=V<``#$L-=g7C7COX0hAqP5+IJ9r>t@+Z{vopUy=o2aE-M4gTag{2s z48imJ;rYVSZAaq0_wfA)J#ZYJmk+MqaOip8^M66;o_U0<_ua6#whH|&gdVKGw|K+N z#}3|~yTb?VKOpqc<nn>V{o&l{Zy@wButC-3<pcVn@FF(`FMwy1T0V5-Xjpb#1qRy@ z!r!?0mZilf{_!~;p}Pw({^Fs<qpSGiwzt5uu|Rxf@z8;5*KR)s8+r*Lx_|YSwIf&G z@pIVl7k0q>->lwxVD-d5*FKHVXJH(jLIjoI`$^)5;|fST&pz?*s6N>KGjZVyu<rr1 z|It*Ga0E}!oVCsGZu$`+cmZLo%^;3L3oto{c0^{*4qiH#f6d^<Nf-MwXvdyCkM?A$ zE-C~EXi^=jRBP38xg-Z<J>d6os*)5K6MW3?gRVfS2E#)Ybx2k5Xa03$ZdWkmD_Y)F zNS}#}7J@bl#)R;W2OK<X4_n-;w=b``7<Nq758jTG!JsvfrFr-EaMDpIIFjM*?mW#V z01z|}w?E-$&=9)!yc5H@;GDW~&=8!ACx~B!zWfY@<+;6Z;xuO*)^VAEcDaFp#+$70 zMq>jUpt47AT6PWHmP*!`5FYSWD%DE0RIQZ(0s|huzjOC7C8;Kj+t5(OfNrRwFd@m9 zqNwUTrdS|B{VJQ_qNLHFlHdp&e%q?-5UgBd6iaE&6%^AFhfgwrag<_}N%T996Xs=Z z-A0Jb&HR+ycbelcrWOFIj1b`=CZ^C2&!;e<8v&sp#3)0{h!R2%BF4JW!5I$Oi+DcG z8;E%U5TKA@N>^WNo1eMNRyWW~Ut-KCS=m_mGVA}vZh$vXZ8|qKvVDo(NH`Qsy96OH z;4z}E11iAk10akK6LbO4hHx|CmOK4QQd3Q9=r#gTgZT7AT>5>dDhY@7!G>+Qp!q|= zs>0EdEPu{n6$MW6x~T>C62j<@E^q?n>EZo(XJS6ypT)$2Gs$p|w~lRtsamh%cKIBb z1g%z#bw|i85MC7S=NSiaC%FTZZW)U^6RAePA`oKtg^k!Pv~$D`u{(#p*^~m9X9}hq z=@K=E5S#|FRmAa>=Kyquc#iQ)NDxdH0T(GH3&7_h*@)@RB>hch0qrlD)%^e70#0zx z&2F6<9~&z7X^CFdCxRQi2KF6S0OEkD?)Smg1%viR%LsAJ&<7ZVXMq_51{(}77=D03 z!zo>bP?BFQYEv3@EKkqg6tKl(qc-QROfVZ?nb>v0iu=`6Hfj?nXVHeXctzPBa^+Pj zU`sq{>vM~V{v6hic?(J=lXN?WCX2aHwAkMlrqtg^=BLW3zM0L;ni|X{`~9L3^4^AA zo9T61dBXcV3}W6jENAi=5Y~8m6N%xUp*q@xe&3WvF(qyw(}siMM%3qLB#{977I=(t zdWJ#n5f*d{7KA=w!zrerb|u4$b}?Yg8!vd#&R~{dN6D>McyZTGk6giKpu4%Q4G?Ni zGcYoO(8#8dF*sv6QBe~kiK<nI49Gy0t|l4YF`b7@b?;EBt6|_<Md_%SDQ2MfH8&Gv z{W*zR_(Ji{4^W7Iig!{D6w1NE96YKTl_Uye)HthP_q-#u7}|2r^vZXs=(RW)c|QRo zIUwSX5I81;{`a3Ce1V64KIpL%+{WaQU4Sx1bzlz<?3u;hrpJb{=)jDOV}WTp<|*yc zs01vcOfWQyXOv$7zcPWaB@3(p41#G3NECq;JkKpaeki`0AKq*x*uTL{862d)+0-|B zX|r(oPDO-?h?g$g@x^@_9t>eLbJeCsy_U}<;*pToZMC3T9nVUFZvdA}9)cu-6BU0q z{TO65DF=Ks>1hzPOUMmjG&u`iH)EjMAuE2`K}c}=kjtC)a9Aj99<7zeP90tt8`PA| z#1`WTXQ65#z$z}?Y4hZFX`;m`1FJCRz1yytdy4}<6Lu0lJnbO#J$x(_-ZybzZM4ux zWW-ItTMOYhkqcpaBD!l|FkQFuR_>9#y9nl3q=y0s1t@A9<X+T|CQ<9Wgc)z7u&|kG zD8vKBAeB%vaY$bRZ*CMhjF}plGd0qnkAhxny##Z4hCx^_G5zmW83IYEDb>?{P0J_( zum-CNh#A1G3qq}ve9WZOK^xS~%=;aw6jaTy?9@i(Qq@RTfIbvQr+n0B%}%)k5dLzx zf8XfH)X?D8?ZbyBw%_Geg~O>vO7y3L0ehBFDOllbB<i+<{t0BKMEm2}Whc>N(eaUk zv-`t=)Xa-_?>=b5;RCT$I-))6B^G=3;O3OareW%GI6`aF8906us5FRQKqKhRrc}fn z>A`RVbS1zm3V6|55tNX?$W=%;X3=Oepok5P^P5H+<CNz0nb%qUmsJ2s+i-O-t198( z^}OI8@cQHu<OtcQm&{}WU<ns<iHVj1<&ya^HOeSIO?5g`*2N@`Pkn&c3E8=GSc2M* zPsza)kNMq^u_V3eZeFxNPW2hdJq796<%e*2T7XoINsounYp<I*nHejIzGyTc$gK}& zx27>i>p>2pS)?yf5hMyitrL)^kcMh#8qGB=Qx(Mq2^{NyoDpe0fYwm4C5kU8wXe`^ z6w^&deRz1fKAr84g^~sY=?+gjMGI)Kp~9UcX~at>l|pG9;3}#Cgc(XQfWVdXDlpfW zplTWv;eKC$I6ioDUvAs1JF*QDVK5f6g$9Nllz7;6EAygQX&jv#-s|CeU5#xnrml@$ z)hBIt^+}Qt&hGg3;vvbsXCjlVXdJaCa;4#d$KNXue9gA23yg5l>#$g?keuBb^;_c^ z8&mXuU!ThhYDm;9GS9-<vBsFm-$4QzfC^{_`bE<^<{^xiFhJgoGYvt^5xflCr3+A` zK!h=7YI53)r@aD5cG3K;V$}B#x10g)>g(<G*G(|e>+2?f5?}cRP4(5a8R9VG3_UUT z1XCdXH+EtOupgt%%}Oz&gk-yw@u+|cq7LFKo4<%mFF_nbXx4_n6{Zw->QL|$IMI-V zPKbL!J38SEo{W)lR}sLE>R+b!0PB;oI-&-B9OlECH*#Gg-ea{-WC~@@M&qH`zTwZ; zDIZk*E{>mrnxBNj5nsp}m!PCno*kcvrPI-Lz?KS4&$$G}&KmJ;H8rbEdVHAq#@>GV zk5@;?4cP0jNl9sXMp9!|$r_)Mvg47Ub}oo-dan<oVEYw(3w{EM1$M3n;lhC2nkd!r zQ>{BogIH{Rx0KUy`{i~Ge-VEVIKj>(ykLYo@oD4~QwibV9VPU4j@!ZH)$-5)t5)^Y zs<=<IYw4gz5S+|M1zxG{wB6<>r6QH*{jpebE+h;lgS|4fO9L{w9&`BJu8NIQ!itk8 zR0<7FI%k;6`P2_AlbU1^2JP<Na#W5)dG92{cUqkA`w;kv&`Rqc?@Q|+#xeX`@-^-x zJ<6x}$JjMOQTVy|G0U}<m!zLq&)8P%yX{XpW}PF>r(9>;?{t6PbI3dH8}VEHKMuTC zj>s<ue;v9vTo1n(ITHD4&&PY#qc6mM()*!!PyBm{N0Qm(Kb6zUpHiPmr_&Fp74<Rg zct*<nuJ6JAy9RC?xG`(dv-@)O+;jQ27JP*#i}#f7E}y9Esr+^5q3T5S@tQu|KYYHP ztgnr18M!dJJo=l)&&G0NU)ki|^w@aM`0=K#`L&6=HurBnJ9%s>HT8onw{Q9F*3qrT zKM=+N;d*Yq=Tq-=HvW#Robk5-dOrW~?>D~NziVe`i$C6*A>(Keu6el1a24Q+!&UFL zo89lixzzEaSi~PfLHzah%dLk_D0roH;lyV0t6Ix-vR5InG-P7rgS)W-A7l{tiv%)v z99k0G>#f}<<F;QGe^qO@VIYnQt>Y)-g-%EN*X^ISpK1TFeP;da`d8M!y#Da|L+f8! ze{lVa>z`dez1~_swtidhXsn8G>+l`@=U%zve%mb;1Q`k$zjP5g16QYw;niolZGr;m z(Qcaqy}r<GQ`C<G-8PTHxY=#9OZx3(KYmBI-+?OJW9L5K`Wx4J_`Y~_1zrX!4})HK snIB#vqaX^QFp8j_*0c9L-n#dbF9eF^qVVpO8@H6oHL!;X7|!kd52(fhCjbBd delta 1825 zcmZuxZ){Ul6hH6v@4Bt+MmyLT>m6*fD_#FH#u!5eG}+jgFrt7_c(iwW)%LaNd$27= z3qrDpD0G$JfQT|tg2AZ84;WAhejo$&1CdA|65|(5jKdIAOtqf3zJ*D4o7eNZ=lt$D z_jm5Q@4^IoAj_tJ0RSWH1{G}Y?Q{ErA8mObV9z!5ZV$z{#P#DRdjVc{0x%PyT@ta4 zY8(KE>=@_!69chZmRolL_WlJ>d}M$V6X-VsjO|0KABYb3TW_{)Mf@wkODs>hu+=a9 z43N5wzGj}MDNgr;Du4w~qoa<GNkbaZ=m*$s!Gdo@;~{Qq<4_kaz@%_3#tkKyk&^Y8 z42uF0xEOtKb?hnJ&>;Zb+(cZIE{@b4062pAm|KY?P3-woJPL3S<8T;Q@S(lJT2ZbJ z^q*?e|1QXGF!3*@SoDKxAB2^NM$G{0S?pcnx7OklW-o;0ff;Zx&e?c=nO7J{k$K3H z^J%jTFoj%l3LJ8j!U)FX!9q=D;p>&DFBpmKV82$KQ;%r+v@5h{bw0gK|6$RHVU6KT z@y3$6Qd{X=W7f384Cb3<SIURy)XceT*<v|w-D&-?;?mr6^Wv3E<>{*Q{IdDCt6!+T zzF<#{p=PhG(l$;gnXLV0;r>NJ-Fp1}R=>8Prr~pYi~T|4S;ydF(b?bBo@%<`dd=P7 zKII8}P2QtEoo}<>;r}?$6PQ@?S#x>wX!9RS$6J^d+VcCdu~uQZY5C!{XIB)h_@JF@ zzuJDM{oYEHiE{8+xojf1&D3@uidA^p0N;NyHYHWI`CsyO^=0-u6t6F|6A6Fg!DM<4 z7H4-K9AZlF9ONF${e#i;B8Fz_(jDw%KEtPNjdCLSsaAUY70%?c)u0CXEouOQNDCx$ zCQbB{`FtLoBy%H89Fzax?5F(Y{Kfp6x%YD8xp#6Wa&P61=Z@u$<}$ehxmR-WT+~c~ z$#_R?na4+q>KX0yS)!E>f9eH5J3X+pN@gzywMMJc7a596N{uFSS@|4`wPNnP%BuO* z3kuvC8>wBmsII=@F?*w9v9rnL_IQ2%z>?;rN;NZ9G?n)ud-Zg7*|y9G>$6Xc9xF*z zFh)f^zy_qq`sIHE&I*`?Vt87?DyWBk1*^dduPRsrrSP_bwKM#sj1SH#ej`*dcNA=% z&Y!|!Wnf?)$gNiw;p`-<QZNG+_LPEIs9?`4SOs0|w+dE+Lsh9@4OFRCD_A?jU&@A6 z&nSK)1T>cvY{vYl=>lb7(cE7hPYfp`1H44+p+@5Kc$PK!JYEl3L&eB|K>9)vDuk$$ zbP6Gt;Zd?TAd_3jI-V2Ast^~ZvEg;xCc1fB4=3>*@o1QIN?bG&3dRK~7*7sR;&Y`u zq?J5mHOaIBYgXrzG$}^n0`a&!uE3)kP<HE_b-TpgHaIxwis4qC<Az*VzP%A8r2a2> zHVw+k=TR0{P*qs%Gz>;0o@}HdP41#$BFiG{@jE(0kIP`##7D$JtS{a#4RT3J(1C5B zf=I(DvQr4tB$0SZ`Z~KwZ-NR1c6Wi{B-5I`F0ZSQO<7F1U0fu}?TAt`wG)m6S8X7i z)N0@*Dbeb7i=kvBA&D+A5|y{??hST78nHYKJ#2k;>xp|RO9#Xuir<Y+kbpxJfe>W6 s$7_q|)CFPjvhE-Ml4Ts3u6J)&2ZL*LJB7&FU~sKsgYq?E@S9=!57hU__W%F@ diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff index 87d4f223eaad873324b3e0d42a9a0cf211929ed6..5b4041aa87c634e4550920a48e033b4af133d7c8 100644 GIT binary patch delta 22395 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 ZIeod>th`=t4!?NSV3+^_00IC101v&`pO*jt delta 20762 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 C3F`F# diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-BoldItalic.woff2 index 83b49962aa8353a7eb7cdea57fe843af4dc06f88..ba55276d03067f0c9f592d1d9e4faa43482b7454 100644 GIT binary patch literal 21192 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 literal 19720 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 bXssLhNj(c?!93G5;NEIzo9EzaliuzI?ubzb diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.ttf index 9c38359cca652bf7fc7e7f9581df11e3267a375a..f148fceeb07b6482aeb5944dafd3749d62416327 100644 GIT binary patch delta 5257 zcma)A3vgW3c|Nau?%jv>efRErrQOxum3F1ozV%qitA{O1a*$(;1tS_G%MUr&LfD2F zrqfGE%HVX`q!F*Ubs>ZR2}8$&OD1gyg^n}OmeP#LG?UQM2_@4EG;PQ@X)>dt{^#xr zKR|AG=k7gw&wn2G|Nj5`zk45hiJX6v7ziVT9OxcI(Jiyr=ZjlU%^XDNE9c?rEsIAN zR#@^k6@*Tw;Qwojcb;gEBlc;8o@$5xO9xjD9evaH<}aWh4%@?r7LKpLbr(X<z5r+C z(2=_i{@1P@Z$bM%5PI<Z(t(Bj!4nTXhtR`k;aYWR>432y$H>=V!N=f2YU${SlNTo) zGhpyDgz&eI+_t!I?~C*ABlOVsq5rL;3ny3b@7j;Te=$M(^1{&rH+P-97dCW1LTq~F zw&N#ueeTDw;b(pT<A1tx?7+%r|NHo9gr0<c^dKUr2<KOc3b!jG<$3<cA4Cm({ayST zK94L&N6*fjweGyJp;1f-nwP*i`V3+W&m)X`@Q(1z+2obo`K!8fn{{W*(FN%CA%-x+ zds}N5ut=Wl2sc8o99(0FEFy+6n`<r1@a#?SX}B@!i2FP)CuhilEnN0xy+yz3OC~Di zs#fl$$wWGt;4*ww)#umzrQ!&!RDOB;;R|o<{|U8gU2$e5v4TaBu-4^`cjPoX!RL*W zpLy@S72`r@t{8OVh|it3PW6qAyJcT^uqSH=KcYSG^G*Cc)QetjxNI2V-fl!Cq+=q{ z>6x>3xTzrcRU$}Q1V`m(7`TtlBT74|@R{Q(1O0LXW5cW0oI?0@6N4<Q0e!HoV;h_J zaDC`AeP_{AC-f9JCzSP8Yo%%pzNMn3`ZT{G90hLV;J$?T0dJOy!k|*&a#G*JNT54V z&RChG5XRk&fWmCvh3Q+oHl_p`ZiQlPIwa#&MzJIZIDh#iA`^+bT{0oE%grUm$(cX3 z5*fCb15dsTo*YNNZrFx6kyygO;H;JxQ%GWjNn`~P%m`kF2tf02QxIhsU**uvY$0H; zuoVHjnXQ=DxO`&a=4%-@ZB36SuHGwTpoEwR0CT4su6K-$4)%AY+hZX=_+QO>g?k}7 zRiEr&vV#~h=f0AOiP-^hEdvUAUj>j5FaQu`2yB^)F+7p3-8#Mdb_XPi&#U`G+-oPw zr<aafWQFlIyF|l;KmP}L@F{+};jGM#R$@fbf|(G$Zg6;bn0r+2j(Rkkomx0%BZL^X zm|G(9y#&L5Ok7SvZ_nC$@_n@!A-0$|7y{h7*E9H4;E3Jm{f1S?jBbJT1!{sVa)?nv znLrIuf|g|nMT!7DN~L)uNhTuvX2f}ci(nT{zBI=8_(3M*mkkok(Y4t^7;(&R*;p?x z5+c8ut%N9(D8R%yo&&H9u?Xfn1;wZs&3>X*>B*&2ny<}<cH`X&(2Qp0hb%WqMc|>Q z^>i{R04i2%kSuTs5b`$x60kM%OMuK}S@Q$lCgL2(DVfkkjx7Z{LLMn>HM;ZBK*bg6 z<y~pc*(l}KSm#ZH#Xz{dubo=9mfX(k%Omdiq!rSM-03HzZSPi>?~b~^Lrw<N4hd7Q z<Z~wW4<z~&!fkFMWA2<TF6QK5P-~9`o%XIl8%<^!or#gSgyEwvD5_r>xxr4Z>*zG1 z?FfL2tdHOy;_ssYG=l!V5gCdRN|FhJX&az9Q0PO9LxoW>#Zyhx<A@M_#-b2P@jUP~ z?wk?zg3rV9yvqdI510wF{I$%CW=#P*N{(G)Ix*9g7TGHoG;74*;NZyMh<hTfdb;~R zX_X^ctyU@)tHlvkt5rl^r7M+M6Q7diF8MV>1(p*;2s{XXRXHh=EveVsfZWSG%GzYB zBm*g7`g;eXgxDu1zr?85%jX!SYz`Bfr_;lzY#ZFR&u!xei}mHxTzHuf!tTQo@p|3+ z_PxRg|6o5O3BpFli3Ku<wF5u$cd^kovHKB7u_C0{OF)e?xZZFUdZ4tFF~Q(cWuwLv zfE5)?log~Pte|DY5hff%wPcVjl4Q~jBpX8VJd)*tyit3uF;Jf|HX9iM^sX^-^Cd-o z=da!?MG~h_9<SK5*s0OlYNHGp%Z~kD<G>otwQdo~O=VzD>v}TPlgOkkax|;?08mlX z0A*lKNL1j?X3|04m4IZMouUG&DmS1jp{kc9tZAIqO`d)<s>)K=&Tz0R=JbV<J9XLV z25RNNcXVP(4`dP+X8FXuc^3|PQt6v&eeL1>b-&g>&7z?|ET@HuWx}S;ZX4R72FER& zJr&()t706HxRZI>=9L@v7^>o)9NJy4<c1{I4a3onxJbut5M{5Dub?v8j(*dy#xVua z#H9_&O#_L6yOscYG7lM+68M{?67UCNyQJ3yih9!;t$duhaizT|mz^Kl6TzZT(>9r0 zApQR^7TT|o_{gLX3LNhh@z>nB)YK|gz1p4Z>Pg6Q7{rPR7jUP^q%HO|`O_3IrfM<E zWDPi301e+7P&4Nur8j~=Pk&Jx$d)pNs4Cfu*@`RRbx!Aoc1%?J4Z{)%Xi<mNDY<<S zcd#B0vr}BN_LS_FN=H{jbx3V^e>xLP3>F4Gns2DwV`J1Y_B)RrdAz6dNT?&`*Bn-c zsnsTXw^VQSV)?-2o>V*=Qb(pHGTVfHtU+r36#pZD`C`MR`k-=Bj94N>D5BHAe*th~ z3^E<!AJG-4NswDDU;$1_3#N(`&W=IG<71ahKWZiFWb`U4N^k#gK4wC3*(?UEC=3Y9 zH3y-@<`HNxkyt`;_vSj{9+%C6%D5~PcMTY{T&;mz0kRY>ZgQq@J9xa6XOK%!B&&&} zd0FN&AWIUMNs?rjJM~BIW^{6jmaLRm^=_+y+3x6Y9%ptvA}Kc5#IK3WzDF3AnFAa` zIzF{ey8aJS+fz)}rNBe0eY=JUNG!HR1+4+kG1>L^AX84GZd6A*(dmYDdnsW9G9(z} ziHLqps9`h0Qcy5NwE_=cdYCa(5N;TtAd6S^3Riwiry0%R%Ll=B<~GJs^J%5w85z!H zhj)(b%+_=Dpw?k3KZxa)43Ob0n&2{n1K)_UB*b1#2n(~FFaucAn)**qr)jaJJAmxW zIEQDPyNfeh_c?GNShqVeNsn7{Eze$e)Il;GC5toM7O;B$qIX9?+1hU{yA@&`&DF1u z+ov2!MUk`tm$Zj06}K4!+>`4}bt;xnBBAScm%FihS3~hPdi988b+-ll$@KQYQno#0 z=}E~QJ?^kaNf-X-Ym<F?!k)MICCSrO_d5q>o3xd|e+xydf~K+Ztu0O>a{+@;i5Ugd z0VW9Q704V2G6u0N%hWKRlV%|DOtDyyHlBw*IsnoF27H{o$c<~+XRn%HK-<~e5WE6d z1j3bww0C1;m)0?rei9y7xy<<Dr8{WZw|283^)-wp#s+GId<vdZ?N*ti3a(f-1f)og zX630=M7ssF(bS3}HcDnpK=~380TR)h7L3*m1e3~y@cayrRhyMt!rkLJoo9Er99w#e zerGkTr-*||4zlA$8=q<n4Af_1ultf+k$@djSGcT)^B!9vu4;}p?iwAsN4885`(S-e zulGc24i#hTXFruGEqyhc8ma_i_(f+ZG&-r<heF+v{K3UU@LT|of8K|Yy8bKNi~kA@ zA$~57a9>tiUG5*mUtN8!zX#h^-|f#Ec>Usf39o=r35>i}F!DCz8^m%I?o#Ct7_FN$ zA3kNjsMfWrM~Letjq~KKJQB|a1K1(u%6O5ujtuGjoe@tUCdCwgmyIq`9P)XJaYmik zb04m#llLOGpteQ;75m`!#>(tc0EN2pv(DEJEw?#kH0Gj@nU5D?3&um66h@g$xm zDe9#c*bk)__+hzM2`k^VJZ#->v)F!Vf1~XkXT<rUYoGhLr`MbEzT-QpR{i7J-GRNq zQ1IQ*gW*4koQWQeIbweuZ^WN!zoY%%JN_>5=gE_)aOz(>|1zCSzpvk?|0r{&tGDZg z?tR_A&3-3W=<)UZXYbGR59A-{n=|^}DEy-MTv;vuw(?B%Q0?Y^W8lD`GI(w%IrL8b zo5OR%7eLNFxTU(~%Z*gyOQZWnpC9WPdtkh6{LuI-6O$8fZGCpz7biO=FKqv#soK;( zP1mQtJpDG@oVY<atktKTd!6-PAsdAkN(jA~|HjWZ&g(x~PqWp3xi6l<7vWXLMYIQw z930(nMBpg4+BG<5Mf=>^eJ4SHjv*D_vwm^)p8Jz{dG(3=$H?2Y)t}uTPXZkSA0y<0 zU$Fu4qUYOi?ndp<vcm7cYTv1L`%emQ*VfmeqaF3F-gv6Lw|Qax-`0Py{txS~tUtbX zcJ0}<XV$*4_Vn75YhPb`V(rY@Lu;#RcdgwSABt61A3N23?)5L6u^Se2Of1DLFxTU7 zG}{;!e!SHt$d10%YEv|Z{-)Jt2<lO*EujzwJ!Q_rFT37G_TxtDx&xKz6KEXW1{&%v zSoJVEgqBucJMBLAxzj(U(Pda1i>F`Yg~e6mM;Z#CAPS){imV>|vzJygkN&g2P%6lG SEFa!lEY-js24L`l^M3*GJ5444 delta 1784 zcmZ`(eM}Q)7=P|sN?QuF$d^#t7X+kOj<$RXOr=OOhLb4nI|k48<f{Ej?*#Op>f%0d zZsNKDR^u3RMiXZiai5uqb1pH<G}G;mDN8giOElBqA1+Il+q&ntV;bY$<nH;s&+~ge z-}mnP3_W?4P5=b}Ij|Enu(7wV&eJvW0t4{+5!7z<huPSVho*V~MzjFbcm6?<*g?Am zU>wcBZ;lOwXYyz60qpq!AZvVp6=JA2156g9)DMKVZ$35KZA5$rVD~kiV*~j+#2Wyw zo<?00&vOYj(?%b{gga4D!H31+n@^gyA^{z!cS2D=dwbk)6yTLxX#YOU4#z0L6vq7p z+>;0!=GH9DL;E-npt}-_3gVg9D)s^#Zb$!_Se%RP`cp^&jG-Og1sXgkFVF?pZYJnI z(e3|d(R8I{<?aNHdZ538fNIImQb4<wx*O{Y%J2zL_XG062)HQc<9PKlPgzKjdB~FE z>82^5lvr{IT(XseBWRNs4J3JPY+>Sa>TSATqt)EiUdp(hS(N#OeuE)mbY$7HuABI5 zch2(MZRQs(1(x6PMi-3bPZR_S4TWD8wG~Yj$BJ(*{I=wHsbDR%UR!k9X0zR~@3Q|y zCdwRTpOtSYzrXm?3TI_*<?X6lOZF|<SG}(KlH>Q9kDO-b{o13<rn=``JKP%+9*yT@ zy{-Ow!-tLQ8ZS0AHjOsBo8N4)x4f}z!?KTCt6TTA>DxB7oon~DUwz`(@;xi8D=w}a z>F{)1_BMNay#3zrTw~bWo@YAu_vg0%0a+UP;Na&|2k-_dGJQ2&r7fi|V%vIUoM`w9 z4<>ncJZqXv3{xgN2YJTw{2)1bU@^rd&mZv8v+1NhWp~I!lOL-(<ny?b2WkZ^979<J z1d$Gh`c#VOXVd94DoJuMMQUdM#@(;!Z_;Pd6Vg%X1L=L~J?XG?NIEE`q@=W08j+$> z$jkwiyqvNpZ=?*Bly3eoQOc)3cLPw)FHEhG*=?ZB&}Hfk#w=5IPOjOKw;;cuu&8)p zNvU;_!nN5+S^46M%Bm&Rj+&*;TBgqB_S82tHZ`l+%$PAZuMgRs^U-D5@{n0SeJ^#; zlqjTf)b0V+B1P_Bej9P8U>Yazl8QA@2CRy;V1buaoB`R8RI%<MeKzHRNmZW%CDaua zo9E*vFqvg80ghg4z}*yeM?MC`6y(!ysh9>6J*8p|c<GZW)<QXbPsJHfqRCUS?je0P z9nd&ceGW8ajH=j-@e}h2EOLU*Xl#2tIKYdf+V3D9mup$A$K`gBRh$qUh>$*ikc;>^ zC+Uv(8RMg5cY{oBAw4`BAsv1;z=gN>u<N<!`=4e-zFTBNLBB5=5q;7407pEGi?ouS z#D9cZh4H{cRXoeZg<v#7T#Sopcr>S4p!2a6lIr%Mp&=%W*|)I645nS~c(m$->v3hP zo?EdKR%t}>b{dC*B2U(F0v8|T0z__ytigXLc~CZEG_L1^f@157ZWf2wI7d){?Q;<U zy|zUHT%3qJNBX)Gt4VK+izw{X3d2d}dv-H!Mv1066LyddhS*IZj?7iU5?{w!!iud% zUKC@kb#;P29*l_sBLqWo$#uQH)&Fn7k0bf@aocq1v1=LwH+Su6`~>q(oTaIn<dqY@ ZSbe@#ncE`4E}ySUl|K37pzu$S`!6x9$SVK< diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff index 959746ef56fb302f4f8381cd199acb54ab7db0ed..31d0038498aa6e24ae80b7a25dce5f1636224e2b 100644 GIT binary patch delta 23066 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 SZw|kB)nJ$a0RRF2{{Rn8b(@F) delta 21301 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¥%cc*&By$+WPCi?4GJ$lcmuDIkK!HviXi5C(arb zO<6iNSRA3SvSh)+7f<`0$i5Q));&><cYH13Fg=(j`ymUY|3ZMnD#WOl7$?0>R^en? z81M2Sicql&UFtrhAfO2Wt2DP8Rb88=XY@fj=T0)aW2?K?b9n+h=Q59qA)Js1zw37# zC{r+3N3pr8kPdw8ytQT7kKf!|VM&lYE_LRJxzTy=28UzZ90)K}Ss|iWM~)1B7YTVs zq{Af#a+7xuj|mBr^Phk37<$sesZau3Fz&XT;m`M1WxFzR--h%6!;V?~m0p-bGpcV$ zrQg#rr}hX$x&+3LQkh3Us(D9IVIgBoCiacfc;yy|)l78H5&TCWEHmocwYuV@5##H% zr`o!Dzh>ds!09VPJh|7s<J{;*-yLbE88KY<xE*-xaj*x^VMvx3#bYW&l*lWaJepJ2 zqH<PF40rksF_0>7z5biHC;xGpn_?JWGCFK|++2_3^ZZ;^ILq@w%FuHLVMfq(?{=u` z*JAZ{ri1!~eztdZK87nuM5#pC^Rg&M=pH@o1}0XW85L)ywq{!a(phan^(X$(mTvjF z;ae5ojILLMf^LSQ#=Jy$R2zY{8u$U9yS20CeCfEkTS^~r%(=uSHpW=*HcJ8$!BO&x zkiK2C!HnK{HsxfzSzK7gLxAg$s>7QVUHz;2;CJV=M7DbV1`Ujn?E7(=c5T0;{!ups zSod<4L_yH9;luOkP58vI^w02~!4Iv0pltE*mA%ea!Q(S>#(#35qG|Y;v?P~_Rg~%I zGK6F#2o*qNZ$nDKe$5^%5>dx>)pGD-zc_3cOxN3MldAVfY*kewo>Gw-(G|lYK3K_N z5JC<C7E4N^8swM5%0J%3TiK>KGrg}Mqr$WTep2>gAx`W*E(1?73-dJ8ST+zk8LwTy zt(YR%<bwFa?AGh)Z)%;c#le$8?U7&6@H~9;s%pUNFM|p+rwcro@>0_e3$K%nn-6p) zei97a@5AnJizj8`SkNTdt!M7*cw=iXs&<@)@-zBV$Y_ex&iOswZC<W5>BXS5@_5Xi zzK~pggf!atLzR#Fo1sk0m}~>So9~6ZJ-+#;i<x*39L85WXV?0TkxViMlaG0HG<jLS zizR?>Mvf}-=AbBuj%c2zpv)+VDr$@Vp;Aybe?#5YS<>(HB6RVJTDo}lv?RD-Lxx<! z1jG1^x;LqVx2dMRkQ_bec^Sq5W78joIhLZ8p8bVwiF|ReyBY~&Xw1v&)^*7w6Fv^W z5!^TF{iEtcSiwh$qye#vdj7%}jrP`d26;dh3>3VZ{BJ!-Z8C&dGyLUKSL3!bq|Ow+ zz=_;o1ru{F$1x)3UHh9N(bS@|H#dXZ(Y9L(M#Y$mta=k#MGLp=!RXl9F-1SkFL!i@ zDDqUcwePuj+Urs_Ob2Gg{;Lb^O9Lg9$3^KPU}6NG!RR1ML(p(ek<9YJ_d#Nhvjf0y z-LNU}?^4~by=^`7miFJ{e>OH#%b7_n_<yYAnWrO^Rn03?VO~ebHYCPfH@36;;Y9I` z-583qf4KPAV@e&zH&pmKpIF*kr`x#l^>ZPfsdp3f8QFQo_bqbpL)Ugc?;}*sU1m`( z5y!#(wOJ}2IFQy4_!vM?!kj90X8r`^Asz0x+X&RwT8pXdnkA~945PMQi0OV;6Md|v zKIccOqma>eCHu8RAY2o=z*a@2xPTg)Gbk{ww;BV~a%5J_GvXf%V{>%$aOl-L2Pr0b zu7hf1ulf3-{z&*V$J2Md-8$4>!WsnN_jCe6k*v*nSioUi{O-q8E0p{~iU81?GInt{ zK|t>|Ud#afGZjL>-Mx*Gf5t>AS52hH>A^Abbhgyc3gig>V0hP**4FiwAX|^O{f;}b zgd(}fnt6cyPdHlRFVgG9Hs4kmdZbuzp}#)~_%Y~3zrMv+kEW=+bp?ivsEgsXxBim< zg)5x_+|#`OSOlYs?JobmW(|04)%7A*PAP>?lpL$Q-D!Jb88DJ=1)3j7rs07mamV6f zs4DLLpU*+KN~I~9PGt$PG&35J*~9sIl8qA&L@Y;M&JgrP!}*%3WOdkxZ_`(&?(7Eb zM67xjl0!p=zu?nWwV`vW-3>1;k#gG_4Qp+W7EHJv-u?OtS$|oip8!?)p`?n*++R8l zi*h}kdRvn%);FfQDg$ipUr_Ig&*H~4uL$HH(%|%Z>9}L{41KCp_*kt!f-Bns0x>)z z!D&g7EC-e<qiTY=QHINQM!y{F9--=<o8O97hq+7FeW|S+>=9w)5VAE2HRu*D68KW) z{~rC7$Jj{K>h-f)xB~Q{X~%I{W!=+8oW$EmpO=mdXi+x{ZZZp#b?US^R5KE;=eRY= z*Y6^V$}$#*CJ>6##uxhwE+{ydAFJ!R_;@_i_QHR(%T+h69lMz3{7?;XYM-+Vk>;wl zkhSlNC`;4oRS>K$D>;_dcDX{@sfj6!lskTj&;Nn=Ck-ANq7ew<LmBv-G!LfTvGiTX z$qA%xINT7I!y$_jVAPcTm&tlL%iGzxz@zd{CAw6f`<H{cHQKjlhpXkiqR3F0zDC1e z1zQg!R$3V@Qrl;C1WWl5^IR;5IC2z1v{@c&gXLX1(m1E5cfY)qKD2~o$xgaWEdRyB z8|xiMQ6pH>tD6F6Ql?6}5xFa>yq}YjNr_1#4B)rO(352C#e@F%ou7B5OVCQm+UwdZ z1t<T+An6y(BdZg_W1Q`WsO<H!|NC?Ay6nnbd$Pugd$*_GeO9@VSBF_d#9Y#Uwofq7 zXqXzd{Z>NIO%|*F^{#0=n2ZLF10F#9e$9G+kcao*r`0$RYYs;w6XIju?iQZ${l8iA zQi6k#zmQkTNr}LlVWj*d#<kL=sUx}?uI{oh`{S7Pf*AcD&T{fV8uI(4MtHU}#j`CZ z@4{no+IoO8$-`(Nuth$&^P<&o1!Z8oOURlB97}hMyS7cIdyA1mg1e=1(O~uY*{Q5v z>lgNGOPV$Cuu2>(rqYtRN%ZO4+kVDuR*?I)Gu^SLVf>K#kovVk9Rr+(OvfV=&VsFs zB?6pOLhW_QTru`a?HZp5S$J}F<f}@wB55E|kJ$0AkoaxL_;f~Cu<{hNoa#KJMqKv+ zi;Y!muecA)I4&&Xsr|8kwaR-_@+$Q19JYsrF>65eiTvIf0&Vnvjd37SS9g+U%!N0j z>vf%u!Bn^N7C(n^u<%udtL6vsyf)5As@*eFd(?D{BIaG%PJ0AYpLaMMUE0-vuhib? zY1@~>45S1T6#2d^)$%I)`W`A{(2y<PE?f-LfH|kyaGWsBKh+`&S-te6DeC=2n9#2= zL1f@@?3vw@N$0ZTj~T{rK^*rjLiUE9Yjwsi6|D)z-}z&;Z@956)lvnsN#d<#PLW+Y zC49m=l8-Mmp%S6bbZ@BYY={rDzrrIu8t@c2RilFyFtO722r+eab=IajevQapj8n0~ zudV7>m>by9)P)Pf-k)FxZ%6#?c*}Lf?g;?!tUeylKmolZ!ziQyM5eH^{;0u4nbb4T zO4VJn*2NP^)Rg7SO>0O|+TZaQJq70fTJiMGp}rrc-I<|%B1(K4Z&5kzKq40EG+t2; z`M7^va$aB@ysqKKm?L-iB;DYqG_oJM{C9D2fi5}AHW*9H4~?>XgaV$_x_-}3<7N&R zh=R!B{m(@5kfVN#m4kvmCYc&)Kw{I~X?TU+7FLaI0%=!EbT5^J>X2(8`pIEQBdaWz z0W#P@aTyqE`9D-kHs;7ZI*~t%4{`#%yPlq=TK;NC2Bp}0MWQt^Vs{_2D{!+45j7l5 zRO%F4jM^gVURYY_TB+&ExTG?hVbB8>KRr?{Nloy+XbY%k?p7k7S95P(CY{}{jJ$m$ zeH;1b1W2U81hW4elLfMnJ%d2`QI*vrX8zaLdyqs3Ud+7IP=a;@=;*0f1~=CfMSVya zy@8c(N?ZX`PjFO$0#7z~7Mu54cf`J&#ql)Pitcl(oarja+kY`XyNJP2tlohg-;cE7 z*4z&Sby1p;?dK9op6D@)Du3~Zt~zD_*Vh&!6DBa0*nsG&CuJZj-rqv+doL=C3(AW5 zNfj>(QwK_6H~Vdz8E)9bej>5wf=-X7nn}CmFu9Of4^82*xrg?y=-tI2xI7G}qTP0_ z^8X3I5<l&(2N9|SiNa_g;Vt>@EQ|yAe|@2mg@ephKAa9BhFIZ><aRe))wA(;;8=`+ z+Rk-U0#xAolP3(4wSfW8*xNdh0YN?<t*>cRfnh3^NEwi;<mc1oc231+i~K&)DwY0p z)^><X2^$*<74Je}(@2<XWv!9t^1$oM8!x7qVeUpbNq9P?#A8B62*PyU)h~ELe*+D3 zOOM%9A&vc{Z7F3JPJ`F)R7&V=`*t$Zz8yE{+u{Ek`gVMlI^KY9prf+yuL~4%S&S&& zL)545A8>*JeDv7a$KX4R<$Ar@Y?TGibZWjYm^MyT{AL;)kQ<hz4phqFB*WQ2X1pSB z?eLA97ty%`BFUZsD#$U@C?r&Df9{u+VzUrW+Kd~HwtY<ejbBUMB0n-BMnTkKdBx}+ zuNvFWxR^pDXWY4)$i|qiXMgnvk~|toD@3Ewmo*H+E9f}3+q<@FBZQ^Zggax4P(Xc| z^|sQOPNWjL#xO72XOkNONd6kAq-W}=00r(l#zv6-PsT8Y6s0hxMFAsIe~9=*aED6x zc@k}$xP}cHH<m}QU3D$JQjcd+iV}qz<x=H@XC-4ww^*;%y}y>%;7fcsxMBe@t{lDg z+Y&69Ik=TpEcnlR^Xv14XSXV?YGqg2fx_J{!<WZzb6EEJR5Z-+3Q#0F90?<s9ryvd zY*UdrCw+SQn#AXC4;Bl#e{{;V(P20&<clqacle<RHhwP3gDfVI$MWgazsp5`FBZ4) zPvCU}Nc7|9y=1=>w+x{dOS>P?po4!o1;!w;R1q<+X9}*wcM^8of-_LwrdG<_f61aT z-O?i<5>E`NHpt`47#PK=QgftY%Tx@aNck1U`g(Y*uURyQI-@25e~jT80&pfl4TB)2 zX*G&@H)d)m3t7&m-1J#cqEZQ?P$!H#!<+W)?Mtcjl|eEOKlu}Gfv+EC_T|-+iC=Sh zqt)<~PGe=R71#AAx0csdFS!~4!!Br8tM?8ruSOY^&UIQhYsvOPuXC-30NHo{BWCao zG>2A4%NP(Y`jI6Ie<Mo@fhq8LO0E=6vzE_#j;WzJnB#uoY<b)R8X~H}>6g8r^LTlA z5@7_mdBX#B$*tu1um82obxi(CP$*)SiIf)gjNtPNY*=R;vKjz5M`Ia^F^ijNf-(I1 z-^wC(N&EHHtF8y2tSEuE`7c<9@1b2Z7%eOT!7*Sm!X%hsf5K#7JZTKh%m)1J`s(^x zIjEfmE^;<HetV*8APs+^R7v<%^>{MvM7+&wG28lL6o^uNh|QWBWJ;|*hDfj1@x0C{ zPsv-9!Y32eZn3t%-uXnHze3G~F?aKR&g!MAJKvO?)lbZK`%3J+Co^^@Ybav!TMX*> z-TpMFQ)q9re{&o-O#pCdBpGLv`#4$9qB=PS&I8mD`Jf}96I+{y7y8w*9Wykv25UZe zJDbW)fba=~(5Q!4!gLIh>m$4&NS>Hln5k!g|FU`*$4>2C%N5f_=INFd8_JmC_*IrW zYI;gPr2>l`uiBW4Orp0k|A~Hc;Y!xBREu9dm9l#Ve}?a#*>s}MpV@Ue{w+yWHoTg@ z9RR?+x$9;>aZI7w>QmWxDl*K*z=>ZOzNcINjh+6vo$~%1?%Q^6&F}tC-5ubo<I~zl zzkd|<Kwu0=jF!@bBC;0_R6v3X<WHy*l-zzWJ>lG&PPy>dbZq*AyEtKlvx5hA&u$#e zKW+~}e~hrF@82r?Sq!=6&~0a{QH5vawF|1%iLgO55Q&&RkY$W%A}f1QXC}e~#ZdoR zZn;W!bgHbIsSF45cR43E#;?7qmKx=_mF7h8h(cJ|iAMAbg<MOee}_>nbONuvD(cl# zOjsgr06eWxd%Ybgth_7zUkHu~!an!e;z!ROe^1&P2CBPtMd{7|c!~deLUhg;{oH4B zKe4l*GoqEnByz;B;WyAN^v3G~K!i<cvN#D`$SMToKyRaIagxY9(RYkt)*!j|kJ`d0 z`@kdjO@0p}M);LSZFzY0WCYLktLIK1KD09Ev|PtD&@H&7N=rDoHK9ZtJM2Am?=u$5 ze-9X)X*0NFTD_(H`E|_&dmc#Ai`ynXe+h``p1;67d-Q%+NLy0(Qfb8!nWNX9))Gl< zn|xk~Ujw4{C|d;I=~vv|#~SUV%@x=m|HVQbGxWZVne&n3>1bQp7&Td$D<+yp?XyRp zc<NoiIcC2^!27r*s?R@Ur4XRV*azMif7|18=+J0bLztqYOD#fZ1b~pe>F<1!=gB~} zDg@c;iLLdu-dw#|<~%X6%Cjk5_}}-i3#r$$Zc*~dW^O<L%uLPmzpcj?u$EnY(oUSq z1D{`Zqh7ohrMfq;G{dj}q9=4{Hx1seDxhf@p%#edaXq!rs4T`sDGDGB^;z9Me|7Hb zIdK|`p}~~+v1Gp6d-hD638qAp_^mTMvUC`fuHrP>U6WKbquY(LXuZ%qoA7%1s7fXi zb@0*{ow|x%L?=eaZvx}b8;DRMtu{e~qJz*%N2eykhl)d3{>GEzjA#G&(Y0YFSry#t zI6O#ggWTrcQQZsMmzMHe`sQ+Ie+MQD9)sz{CoX%E>m-&|{yAPcp35eZ*;E2!jyLk_ zz2+j-V|u@9`b0BL(I^E$HBWcnzuIj7G{uS3Lx^9YJN&0hscfo%jTbG*!qvp@E9~YH zbIX^m0ftnnzrC|IFAI6MPaj${binev2@wu3^3*TYG9NUuvCGdt2njBKf8(V@e5)jk z6K(oIL{MjJNsf;#$tpU5uAx^(Q3D7%d*m<yQUMHM8tR2a>dgL(M+{7ehh!;kc7>0# z$V~*j;(s{vT-HejONCrAu|UW2fR%L|vM9q;F}Ul&$&Zg$ifJ~S9S&vfGqE%r1|#un zep5k3@+*gn6TAbyMis^6e|Zt1lq<)tTkOm4&c<jmiHSMht6+<5Tr^oK^Ze#=fkD1- z=kISWi{3m|UR<#w5qNE_X91b-0|2x$2Wf`C$vGAu%x*@a0NU=VoxJw7IDh&k#)3V0 z0|@9lgIIcDVQ|5V(bqom=095*vG4x?M=xX>^Vb(Q75u&LV_??ee@|x+M$X;;LWb}S zw2GcY7e;3Z2m*UKP~ap|Fu@8rKty07ZgYl%c|*>=3UZ<rXd&cx^~$OJacOhC+pd-+ zGf`J%Nm&n5`uZ$GT_$n&<!}K*QARCOAXf&_jnci=;*fdjS=b96VP$1V=+-l8BF0Ww z-Xiy!iApL=@8D(7f2kYSlQsZV%2!Km<#&lYt8Bv&N9witlTkt}ivxgp=Gf{XZD(Bp z@qPz`_ssnA?v|>@Dl;ix%9L)#&EyL|wwu;4EEe<P^yzHsLOlE4qXKhzFoLW%-h1*a z!sz(jO+P1GMSJMolL)1PhyZCQWEtsRSTeB<K_N6Vsv?RIe|_<-)&}6o&i2N7f4)&m zdX|A!VW5O5$;!itq%0UsizD$cVV>}WrNiQO82(Ky^PfJk)s4<%n4iDNz4HwU7&G9i zF~9bsj*bbpOb&{s*}H$#&pEYNv{9_p>)!8fug?9|#c9g<u5U(QPt~-nXn7gUR9xLN z41;o}G6sKAf99ac^`q71qD(@;pBDS^u|6)!?4|-Toem+T07bfmDD^vwoLT$ox`VZP zwI*SNq5rB6j#vtU;2>cO$GnRPss1OlUZNB+iw%t^lo8%&ck0!p&0gu{P28+Uu#GEq zdb31-(RAPV>!sFiE=qV>L?T3sIhJ$n$koH$bp|40O)~)frlD$%f-pjoA&H(tL>2>I zXA}_bcNUhHywdpppM(GOocuFc2i-@lTaxQ0e-Hw>ZoEpa<G%+GOxDQH{!c2Iojw2n z009610A-VwQzd`60g?h=0|W!@1kMHD2Nwsq2we$o3MmU83*QWA4KWTr4|Nb)5fu^T z5|9&?6qprc76}%*7dscC7;qTk8O0i@8*>~M9NHbU9v&X-AAuj#AebR3A-5u3BJ?A+ zBrGKlCFv&UCyytOC{ifSDeEe&ED$X8Ev7DFFIO;nF<^f(12V2N9y8xGr8QDD%{DbQ zkT)?mjW{1Ti#c66usSF@k2?rEVmrb-LOj_$s6L8696!xKi9s?!(Ly&uOF~~lZ2$oP z000310E$&ZkzWry^#BV4=l}o!0NApb1ONa40NApb1pnFpCIlM-%>V)b2mk^A00000 z0C?IRj{|?Kok0+VznQJAXWPEMwQV=5&6rhKg>_@qwh`5~ZQF11F9+vjzvUN|0MZLA zM&FU8-)*0!(zPT*ACac>NpsCCZ$p~wB~gnAyM9(*N4h&jmdmpEH<db%3>Rnjck_+K zr(KEB4YbrQ_}o^iTubwIBGqaUZAyl0B44(VsdaxWzC@n9A}DvMr)?>hVZ_Lq|6jDO z#f9X$X~gJIt34%CzW=`|hs|@s@~ik|BF(j>*Nf3Jwp)@VuPnbvmiMRe#@~)|k8w9y z`V7BoW3>iEj4fGL6R%^4aW&|xbBrfIoYtbg93<Pgl4Li<^3i)MOGZ&{d==&^(-FkU zJ4#rr?{R6wIBHsLGHDtmO?J^tlZ|Hyl{$+AU1;$%8fzcB2U6r(dioBsjC?%^QVfiN zYR^$bUjP6Ac-muNWME)A`(KSAiuu(4oB!Qdq=6!+AQb?j<_5o$H&!x#y#LRv@ZW+V zis>xFEd>UK{y1i!?ww4lfl3q@7y&&A5=H=c+Dyu|5duII1kh!cp$Rmi585E34Qe35 z-8G~D5}XWgfE*`V=5RUr`T+3#9kARZ&<CHD16DNe*$dCTvfZN}K@=Hfk{RY%WQBFM zIN^+I9(dUqV}QH!A#itpkv~^slkK}(J>B&VH>PJgCaJnADyg8nvdSo}h(fxp^H2Vt z9D!7zD~JS)Y(NZSGXV)EbOj(U5&$f$Z0sDIT--doeEb4}Lc$`VV&W2#QqnTA5P3Oy z1w|!g6;(BL4NWa=9bG+r14AQY6H_yD28uv15IZ9aSde85041LTLM;HZ9#>oje@x7^ zfr4QWgyHwobN9<2CP6BogFhz0Dj~-UKnkE3+CV!%2ifRZ8{peKV>ng<vf-XYwnR#@ zBSl5_ywQ*YPxR$@HGeWWhVnE2W-7m4<-Z;B9md}QV>6cxpSC4i9_?6m6zxRzr0rS` z{JVEKUd^9u-DTuw3ZWyvUgf{-fAhDkQPp<qFc6$)f5pCCaum4C3@LN_)}uPxSOMF| zQt0pRc3oyV7K~Rji$C*XR=RE)=xOqdT8+m0TC34)&@c9`o6&mWI7>LDc9xjvJh}Pm zfc%c;Q=8HE#CCW%o3|Uhv%6?R+75Q$l0SJC{^Vtssbw1Ufll6Q72$$me~U}+@{Ag$ zVP0L4UwmnT^z_qYGBHE()w5G0QNKL9RnmvTzL;!fsl;(KaUrEO_FRs+LkGpsk{$A? zGE5Y0q|R4w>-m0|*pf*MQVM5YRHLlJC54n}y}dxo1!om`p(4a|RB_WZjW|2ek{w$& zuzLe0O~lfl@2h0PhbRr9fA~<Z`=oS5@W#8rLB{pvKMPmC;3skvn4yG27byY=Pm$o6 z+$}WZdykr;rfkA5FuZaz`CCUKm<1<t#$stJHi&NY+{CM6&+o)GFC430zatUU0b?lo zdBGckcd&~^!9jR!1VIBhVg5lbs-Sl%ky!m3&GrN6Qhn{Thg&eVf8@2)x^vC20i*lX z9s3vGzJu!L6DIl@3=i|_$vuTRtn~|?Jz}TNM(iK5>>1AK$T1>eI?ao)rggErj={pG z<H-<~U`5SWOv50OZ$prSKcib0v@d8P%u@BrsHUP_^M|oUf;$?W)F-RDjRm=vQ7HGc z=Y=yKV$g*dH(_*Ze`c4)C0LAQJF#2r$tku|9kCkmJ6073d_W}jAYUQ4E}uuDQ!5Yz z8;w3V?r|N<qF=a==0C@LQx*UKc-m~i)d7KF006-ATSd1|*PHHck0voV3%C;j-;dy* zH)0}j2}vnw8Cf}b1w|!g6;(k^T|-k#TSr$<-@wqw*u>P#lUH98f9ppOTpK_L0098I zyt}(AwlD<+En|}C=tiTbZ(wL-Y+@R<nYo3fm9>qnoxMYpj!w=|xwyKydw6<z`}q3# zOQbTnqOExvk}Zg#XjMnc`JR8<o<`NVZEN)}dcif$VPge{hZl$Bj+Z4T-$oCdKJ!v2 zp8P}d4&)2clCz(ta)+X>(7OTj-UH!9V>lMJnxwu{>0;nahcdj`1ais24a87eGv`gi zX%S{uW3m9NOOTzN+L@a6ZqE_%3JrW@V_ezTmC}CelDgC>r+(-WwuvL^BS)Ub$?aaB aIel|`dmZ&n)VDhlcw(sl0RRF2{{Roo=<5yu diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Math-Italic.woff2 index e3ea522a6a2da7b5bfcde8aa4cc4825593e3f857..9871ab6b83556fe1ebfe44fd44184d58432ff4ea 100644 GIT binary patch literal 21668 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 literal 20096 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.ttf index ff108512453a58cdbfa2549249ee5f2562640f08..dce35c8fdf260dffc5b8d5cd5f9d360b5f19ce2c 100644 GIT binary patch delta 585 zcmYk1&r4KM6vw~k-j_4#q=QV0MC%C(xycwJhe1dxN@!s}Xw#yZ*EI8<_1?@&2bpoo z7YYe6A$r4Fw8(buvaz66QV=5j0fCD)E<z$)R7l87XY>Uv?mgf0Ip1^6z0YRE=PG$1 z04;a`iRAFrzUcX{bI*Z0ub3uNj^UO*c0B~_FhHTycwUzjZUTyfT#sj5)A<tF*an;q zp!un3jJeF&>z(5mH0@$$aakr=e+SH)R@%6AczWR-Fk&$~Wm##@2n@>?ys*rm+j8=S zw#AMd8<^3Sol6-LktdG<t3G(gF$yltgidpQiE}+`IO)V}sh=No5707hZY*EErY`~a zH@QFIj;7uD^6olNSYiJo2t+xqi9`I|0D^BCmaCV|09%=sDj%#i>fY0w_f{7+6RiWk z&@8`k6&rm^+yCP0+q)#tqnhj<nouX~GlP1k)N3(Z7eDYv2WD?b9=a~xa)-V*QLti$ z2;cQ>5op-q80Wf%cJ<zlsh{?MiaK!tQg@wrWhI*md5svYcW905eaUBE6OM4UuLXiw z^|izh)_kqu7=?X(0PPg>b;E!Bpvck{pSR$oT*X=B;G)P|M_|HIlitzF#mP^Spu$sK UR8rBY-|G1E1%3~KYBjX}1*AuUDgXcg delta 1645 zcmZuxUrbw782`?_ZDB36MPW|twln@HxN`dsHdgC47<3>NWW_n>99-Jd-V3+4O?#oh zB3;~rN|tC=jT-l4jEN5>Q`86J!(yUY7UMHUAMnBGgBhAkV-}=-x4oT&aFUzz`+nc= z`*&{6`EHB6^9ol00swZn3_MJYMLquTy0{FWc#)lorNm73y@|_czX8Ct#O5{16Q>nm zX$}3sL?)S9Yy9yK0QEBf+uKPomqFeMa0T^Hn^YDPAJ0Zc5&sU5{9a;Wyzw>d7XbMu z<c>%ZD~L5?{0CT|4v97?r7i3eTyFx*Gy;%+lypq|`R1(zfTRa(rNo5{S*bgL_E%_A zRZOuv5yx8qmr!rn%%pQ#*NvMvz{}VKc`1`+nQK=!Z)3v|)UN;se%x<yO*n21)P8RH zWNSQG;E)4y7vctMHWA>whkZSPrbGC}i94<@jMjDT-E;w6S6L|0b*R$wSyl;<N-jMG zF5SBf8klthbGEEbOBUh|d=vN~@GCO9AHTb;7u=JM&|hHVf769)pT29U?yFbjO=9N+ zXvePgj<8yBWwxCx7jMk=4{elqTIz-K+#R?_0bakzqv$sG1<GhSJ=)kBfU9f)aiOJ` zbpcL}D}*`|xQc$Im)j^6XOs}P@o(`%CCE9Ki|b10TFO))*iBiCdZM39`E>MXW1*8b znJqQ7d#tv)db`8f@W6wOO?w~O_i*zguKfq#AkafCt!?d(KGxCs_+fXK;PLwWf$p9o zM|+P2p9sN|$4|h?zW!4KgW=Od!%vMwo*o^0X8cTa;@Pv$oqOJdRn8axR9bpotQLfe z7w$s?XxoVw%EsLM;!=JABM;i9rX^sB<fII-)#endE9@oq`!kKBx-uUD2aFq-!*iK3 zFb{3`iz^xvG{UO}HbXsJH?U<JUr&z0M+R?)X0mQzXElETOE#1X;O{W)LF;{TPyaQD z2^`?A8<>My?n?vnFvNXrU=wukRs)-%nfDvmvW>6jR6b(xcIY-&^Efeop<19pFK{ZI zS<K2wNuwRHPU`o1k9GOIJ}(_$IXS7)XiR2mjJfHs8WXHL#lCJ`+)GC!QKfw`G0swp zBjN-*HyIVxT$E+yM1NX|htsMSPG^&h`UNj71nCY<moD0kJIk^;IjvH!;1#-e7B@O| z@7gNu2<7v6Ath?kjJP0R@#CFF`-T69-K~Ekau!DtD-%_s-PXLUN%RcMvFtpHQ++5p zicizdX#}fvLXvY8K{TDv@?w@zBosNu)Eq0s>6{v8S*l5lMu#JGEW^}_I#N-%X?1X) z;1ep@j9@Cxi?Sk4D~y)g5ox$@oQhh|Drs6K=<(!YSvjNSgq*DCeS5~jksTh}HdpcF zCC}>qrEhtgaj#2Pz>l}43EvpY^4}I>Cl2B)ZZ4m0t(jBh!EkuM*awY0tY0^L{7NNo F{09tXb`Ssn diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff index f0d6ea739b8405ce37eab96c71feb4b0091503f4..992cb3d6d0d1f881f1dff8c1784ea52662b99a61 100644 GIT binary patch delta 16213 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 R!r}2R3;#|y2rw9g{6Cbv9NYi^ delta 16756 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Bold.woff2 index 4cf8f146967e1243ebfd1eab7ff9c596be939f2a..6dd10388adaf48c986009e84fe140d000dc0d8b3 100644 GIT binary patch literal 15296 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 SkI?^@_f-$7vvt4<0000?Lwaif literal 15732 zcmV-)J&VG3Pew8T0RR9106la74gdfE0E83(06iH10RR9100000000000000000000 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.ttf index 3dd767131a57981bb2e065f4a34010ff3f3ad45f..a3eb86c38da4946aed6475e9977f3a1ec090f4ce 100644 GIT binary patch delta 561 zcmYk2&ubG=5XZmo?b@_WY$`<B3YrKi9!iTvN+{yN_~W3UV8Kh9=IxqhE7@e54eeF~ z@lvtHgZQ9=c+wv9B9`byDC8)TKR~E|Kn0OjQKSUhZ)gM$^X4<(H}huZZEcIyuc8V8 zpa=J1AaniZ@W`dw(p4a{MKxo)$~!-p4gu;0AWVC%oRE*B?|?$U`>|;+=YEcDFxMIf z!cTL`_o(**<>&OBx%|TPY-+um{0*3R=493Ff$^1fAiYX$)N!&^6^hF@?A4%f!g0$% z^U4q(Pk&*<@A;ywj?Z+j0F$qHzvHUF6AvOO#t#`M3d+r@zRDa2;!tMEEBfWdfo31z zpJx56SIT-%9yLD!E(gFeBu3~z%EMeYgwFRJYk!v}xL@lNDz%--m^ejhMYNx#<quQQ zbH5NaHmP7^`1Ox}{$+AXN-XNj>ZG`*^Xh_39Mx}CJT94G&|*AW@5Eq&AA}?lq<;Nd zjp`w5Oy9AR5<;(8XLQ{P)i!NAQtd*iRb_TD{{?NI1&%S=XNd^vZ8mTXjW(MY6#Z>J zfFt5!n>+r~56Xf_xAh*JH5y2v2oDSFI)fY>UH1>w=6z|3ioQGlM+d>JFsI-eVs{tO EJ!lty;s5{u delta 1633 zcmZuxT}&KR6h3$M2UuX)t$-D=T(GUsF2n5dQ@Uc6zb%xt2#YPn0(+UA-I=;OyY39^ zQXi&?@u8+k)qODfh(7pcgz8ftd@@bb_}s+A2NR7ZMreYjF|BxJXJ`p>limBB?|$c; z@7&p)FMcOm4~PK-0K9Mw91x$3b%jQ6UFrm2X=LMKhUFTD)+LPZ0dP&?icYx?>uv$$ zYVbUq%%w8->wnw=5Pt)x{v^e;9P&PZBF0deO0OnIzjr-E{0G3iTb5X&eop@dV6h&# zK3SFwR?)((V}mgyj>;Lm$Z`B*6hr~YqjXkelRu@d0xVzxfeb6=$n~0GEVhk$s<MpK z^0)sTG=%vT-dtAGg$Ey@zA%gWo4LG{`}oGAy8zj1sQ&;s2;qK*Yrt_Upz<5{*Z*F> zY;ec{cN-Em>v9s{gp<ME?uJ(UB*=EcT$qiE1P;=5n>uTmM$MHd>)aazh*irhfy+EK zpa?EAz?y9vpUqd26FlRW`S;4FsF3472#a+Ce?hgwyh^yg{;7L+|NPDZ=Ox?lK3X>I zV5`#I_%ULXw&Fu$n>!A=(+_jppYRU_xVhj!(QWQql+ki^jB!qY=5hq29wXCJGdRI~ zRAJOPp{bN-eca|w=}Q*oHXoOMX8led{#r_{OWh@5smdVe$4oO9F>j`PJLS;&!b6AC z<*ul#@>JK<dh2}tL(kMVG(LOyxu)lvUpN9SKwH~hJbLW-OYI#eP6j&pE+H7|?&<A2 z)qgtt@&LSY=2duYaA<gBG;(%q{M<zJ_4AW&OijmT-n?*e_L38u%%PdK-ub6JFF%DA zTHZ^%RSs4PSKlqJVrEPAB2yrlk{7PP(#G_XRAV#}?~|FPP;Jdepbn;N%z+!?Hg>>q zNZQy5jc~)pE~tey8@u=Lwd53hW%FKWBEQ<$w_D%9mi}@Bd?L;&jMnf{Ell7Dw`OAw zYPj!g?0_hD&&Ey&I1by`1x=0-8@u=LwVdi$uz4@^xOQ`WSl`%f;5Qo#XLGB0B_->$ zUF@JCK{(wR5`qF9ku)Wx(wL}7swf5MxGM6V{o-JcDek8eGE?cG$P!X!b%M=Evx_mN zYB4FVB*%4@R>VkF)g#$_N}?g&5NMe0Q*~OhgV_sGUQ@Cv6?lQ~*>A!28#vG~Z67EU z3Vep?@)cI((ZHDwkFmeRK~vb7Z{uLhn#;-#cnXRx(`iYQ@+(q;nuF2v_=4I$5%2NL z$cknOV%el#V0nomkv0@jQZ>w7RufX5>as**<54=9lT=F`wFCjWJ9v-}@>VsxN;8+T z6{e)wQd**AJB&sKrzq3I9$D9O;jS)C%quxv<25C1`tF*HM4z1a|94cnmTlcQo8_GN mayh3xbQ2%(lS8E;{bFmyvZ{<mA|v)bYVQ&AUqg0wpzc4`FK@B{ diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff index 9da0dfe39632bb169458e6ed72c84803a6c058c1..f4fa252a2c1626909a43a41af1e57ca25ee0f176 100644 GIT binary patch delta 14998 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 E0MiE1-T(jq delta 15560 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Italic.woff2 index ce19ae03d50fade531801d77634f35ed06f90681..9f2501a3aacb36edb18aa674188250d43992ff2e 100644 GIT binary patch literal 14484 zcmV;FIBUmuPew8T0RR91063HY4gdfE0CgMy0601T0RR9100000000000000000000 z00006U;u&y2s#Ou7ZC^wfw~ldo+|-10we>2ZVQ2W00bZfh;j#laSVY98$4wd?AS|q z90*vv4~YN2B{#;z9EtMJ*`0MqYkQ-7l-vvR?vPK|4#R{yv*%?Hhd^v35=l6rP_A0( zv0px9u!c2Un=*5m>Wb}U61jFV{vqtL5t7Uf&u_E$-X|0#1xyrB3_#jwqNNoS0SDUC z+0(hXwX1Tw-JNc8)$Ux>MTVEXYOB7jFEgvEXV9jB)hFhE@5B~Pl-Qf~*%ST<;Q4>< z`|We?x0-<-SbzadKxGlPB8a1AzywAO!+L(W_DMosIp$5LK-mHvY$*%B2$^E?N$3+g zPQ7gTD7UY#>bM|5A|xbf;2}QN1LMq^WcQ27;Xb$18ocZNZ%yt0tJK^yqY2dxI9wnn z>@37BJ1?slxo-|Gd*7R7u&<u&Es4u6G00Yt_X-4$?^w1+tZoE(=|R468Caxr@cd@v zoZHdOJ1f+m0j;rsrRMJk1>gSw;{pFSXQ^DJWJ`v0<ADOxot${ODZ=IQ|5e)FBz;eu z8TKSgz>2l-?j_U9|I#nEPh*Fs6Zb&u|7>QZzgqHGBLnd`S<KB*ve`u!R#%t0)YZb) zP)oD-W+bCzY#F5mwMqtgw2aXm&+QS(l39x;-a~+tAiDhW4Z_P}ihzS8xF`p*DI-$~ zp!-gJ>2W06HdH%Or}^QGuY-gTS_uC-0D!V1o8bX;(<=a2f7msACl3Oz^DhDZ+lRk@ z@bYn8eRBzjyKpe>TBxr7y0-wEE}8(q*Pa6aS7>ozH0ILbr611!W+86;Y?PoxnSfd5 zTV&E<Q!Yf_g1+9j`&DOV+dMhrvuh@2-yEDHi_cBuavnbpfU8V}kVxZ4|61Sd7yV|& z&U#=DFCI66oAUP~?ngiP-gmxn*%>DsB>B(z8}I2hw!s(jZn@#QtFE~G_C4O;Krbz1 zV1G!R2GD(82Og`+0?^y~CxjE<&GK$)k`WUSK8u3^&;EgV`HbTA=g9RA%g3}v`Rsv2 z^M5(X>DLRLI}t)dIBP!vrgI9O2;*3L60ih+d`-T5p31DAhsE&rOB5AXzC7fI7g5L_ z9k_q9bpL3mcpZ7k67^JIiZthQWcYC<tWn<89jICYc?_;sgKyu!_RS!fnIoE+5<ZM8 zGfxf-Ag_4|3jR7$kU&v_6ER|V@~Eg_S%r^)o%T--WD34J$gQPx6pj-AeUq)u+d292 zCZ^XezqP1FFxhoHxEmMkT-J*UQ1Z(Y5b1#Em84xkh<(W<A8X<#F(|A(CBSEf=8J!P z`W1-8$-=NAslV(>W|D?*9>OJ&Hz;=b`&2?EnwEA%UK56rRV;;NKqSx=jCaUHgnhnh z?t3XkqY&n(5rJ?6os6mcqz$;|QJjih5?#-rlE!oXhS=e0a)tmi{3!)FPf9Qv73gDR zU|z}sw575h{_*M8C9ADtJ)!)<YjQx#**tq6EC1EonXbOydgyh)`ETO0ci+QKPKP(O zO9jh6c&#LZSOYDyF(rwHs{cU7dc?VcoGxDF7b1_w%Dcm!&9!K!`qt-AfXFXpU)iYp zjK+`)d9+oC4r^9`9qoxucsyaopS$<is352BBP|ISs3m8mD#Qp#FP8e-o^67ePNDqb z-|bNT*W79I^r_%o_6(?agHR&Sk~nBfJai-hx{?TyBtcJ-p)V;bSD+!jnxlpv2Zi5f z>H!-Z7@KH_1}G*MNF)NO#6c$UFp>nwB@qfqg0Un+DJkB`fEEI#mP9+yaY0ndvj_2s z$%SSR+Ktoo8g~aU6DuRGc~>J@;Yh7c>=T@8s5;Jhx2{4ChIq}!7+eTPjFDJ^+bnA< z>NW7RpBT~l7lPst{({$MPk&!`>oNzIJlCMbjOA9sIq>lU+Rz+tJ-66+;G*2I{*Fpg zcovOE37K(Md{W+>%S<!k+(kx=@7J`=7#z9exrY#vSMrKgo{C>ym6-r-*)wK1G@>CB zCocgp3jV_7_sTBgPja{&yPu?NcP)g$l<X*3gL|lBBJbYBQz)YGz6|lSRC1n|A@9T4 zDNkW2Z?lJ#6(C=9%)3r0`$(dh($O_0Y+Q?`MV`cO3YuSe@i2jxLFvkeOA`%rIo)~f zf};yUY)wKDL#wvC6~}|KP?i8-B>fSE@rNK~3?8BG3O<buS`|l9&%ur=^{}Ww(US?7 z>Pl$D9_4VcWd7($1g`Ep&Cq#AscJL%7)2wvvg6x`)|xuY{^d&dCo{d?3Tq%nd%{oQ z-sonY;K53K*xJiAmHh?RI=tbG9XuNu6lR6(iWcGDrP%(ADw8hnV2zK6nE{d!kP!3O zt?oKed6O8M{JA_-5lAnZM6b9jK$U*Mm{1g_}aDY@3`IeE4CH5G6l=0-c-z+DEH zok2J#8jK~YqB7oMk+?4JR(X#J8UT7nx&*;+BS5AExrK%dl1&OYZUo4cAomK=NIoeL zxDlXGf;=inC&i>d;zoc{3G%EUqm+{Zg&P4XCCICSv{Fq9G;Rc_mEfWd5=ry^eRxV7 zjsZy+4PY0f!4#woV0KbioK#;gNP{iN9<VzZ98LzOlfl)U!|mkoI61sdzShT26^HUC zZ&+(9&39PF`Qfxu!EZoteO&f(k8s_wol^kg7C`(pyw1Y~(hmWmqwAxN!Nb5U(IG-N z#h~KDK!U=M02cJg4k#gZE3|P*0LYl6Y<0tCiTxvVRh-wAF#NgszOMOp*tVXBZrJL) zsccnodqKK=6G=~&URoJ;>FJ7YTXLc7%upHn{@f3%_?Vf)(pwgtuxF3b*xiTaU^D9U zJHBHs?U6N4TA6bA#B3G1s`nD}C3W3_lbZQ{Q3j9mWj9t$N7vQJu?<CQ>5d+2nj_h* zwm#71Ak3C`j`990(+t8O2t!TK_|G-YRfTsm;e!(?&!CTcjy|M}yBQK*!@z{_A<zq0 zk}Hd6B%t<>27qzlm?qM+NE$Pzs+P>SV-dNK#Wo(}j@MYCS?14`r6tq1SunJqY9J}n zwlc`>RIe6Xq#dnPiniasjI>5;o-QD2IiSkVW_gPvD+|Cl)fsZOjl<y;5~XQbKRPW= ziJ+-5@H}>;93na0w!49L@$i!UZ5-@v%2QiH2Fb>)H7Ugx;{oj*pel3;Kscd^Y&eV< z@HP@zHw^Xx7E;AG=-EU|HuXP7x*-lCO8>#%@n+YsP02FXdvGkwwNi+bE)hs$%L;&Q z;O(Odl_ye7PCRUO7}I&f%K~57MJq#}nrdaL#uLr0#1ZK{{PjS3C0M!?*${gxvRK1X zuO}1P?*a~6eE<UnAcWd0jT>_D%31yR-pyqipvTZX&3n@7+`AVGKgHZ_;Q;KAo7EVq z$`eU+B4L;TV<dr>z_8<BUBJ0_eF6_rWvI?WNE&GqRT}_;&u4V}5@1@q-ZlW6373Nn zcB2{PWs^Zp<VHlf_xx(6Z<RR7w>tKJVD;OTL~JKEr%PK%xJ~m0lJuOY8UPS|Wi=bp zAP)w*-{*@1FY%09D`H8)GieQsGj2=5k^keScxC<*Xzu_ODzAoBEhn5f_<lsX4v!BH zSZ|1<gPwY6{W|~J2><Fs^v()QXR}#8A^a>=%|0f4(DzeRq}-t#7xGuUN#yy%n=LuK zhd9DhmA6e7>-8QKL#9;<lh0!W$5?%F=|tum4>Wp79v&r9HEGk9td6~`%+}I4-@N<5 ziD6w3mi31K*u0u>mPjX38jUd>x<r+(BE+Z-OU#t!dvt)LzbA#Cy3Lq?6bMgKo(p7k zPK)`E-N1<<bm<-<6$~_7lZ$)_3y2?}Di6?o)Q(&G>_(G&_V>APL=``ytL6|JEa9?x zXE(Q{0bo1P3si;79!L@}cN5v-L=MDnNR{;mXnCYuuE~vR?6PZqLr<z;?rp8EqvRGj zmoPE@xa_@wV~470TVj;usl=ET_f%oTj@Y1?Olwxs49h*?sMvQAfFBwGs1BDvB2`cW z9HB~!N1~scR5hvhc6h?K&J7%qT^l0dI@X4bM<iu2)(nm|tS@-1Pu}|O9qHP4gw((p zKh)@5E?aXekrphXouEF~=qgarUxrCBJ!Ea%@~Y780`_B-hX;uinvBn;*RA6hsB)Oq z_SPL#!RE-9zjq>b<ik!D&sLKKD-&aEnp6oJ_9#w9+}l4J&a9!Hxt>TSKx+<=PvXfz z$ok?r;YU0rw=1TP^5tWUm)HW<-ye2A{_>x-?c(XSD5;XC!ri|0Rm)kSg~W+DExRHg z8rjnjRw{I?!$rQF1<c5gKC%JP+&)Ju2GsL2dPITPus>=Y>3OQ`(A3fg&C5hqJ8r`E zJ~1Yfpf2+8Sw*B-^+k;I4Q^NDjnOw^X-eOjNlW;YQ)LN#%@gI1b$BJ|5l820U1BwT zVE`hvm{cmkF*o9$YznS_{ua?HY#ys#&gvppRuc&CqSjifbyV3UI2J_v3v#0y#xt5< ziz&x5R7FPVgaECWHka&zGy5ssL&~_2Dx`w|eH$7aWhMabGsfNSv4SHdF`&<n?$9Rf z##XV7lVOZ)R7uoYYK08a;zKi6Ww8s-d&xx4Pud<CJlg44MRyT+Dw=fR-4yc-I60rO zZ`sTzUwTkT?j24H*v2_253jb)ZTvHG`wJP+6RikiK2)YPlV}Y6Q#5>>PLKtz(K&2$ zhdCV!(G|i^s%{66?=e)xyj;?t;@9nh12p=fqvUM78MX4#nI>;EH*+V!V%bx<z%1NS zY_=F7cQnI9DxP`99E*BhM2x7_kJ>F>p8WwUOo};ia6$lg3?8i<wKOKtS{*8_*2}_0 zvz)q_ZwF~!=PK$f>p5kVAr1&@MwErN7fbt~bPM7n8$ECCFC;w2qDGJ;Jbse_;Wc`M zwX~~j3{}(sc1e{Uv89Ui@4Y!=9UJQ`#lS_gO2}Q~Nth|WWqVetc+b1fB}!<@IzC&N z4VDTtgrIJ)c>Fe$ieD*2r*f#Qnqj$c@f6H_Xhx#=Rub>Z2X~Y$e&&ddh+bEx?M?gS z{ULWcDHxunmfvzJgtv;fxUuMg=jo8~u}q@2)5-ovOQa%lD!*T_np0CkQxL3<OS0=u zV_)X+n-CXl9(>@%>A~&W7Ef2zsDC7Rm{xJ&dtV591blRFtLZv;gl^dr!cQrKByl?G zdKxg>Lc4CvR#wJw;w(Fx&7hMj71x@*6j=hX&4$6a)p3XrdTDl*wo_FvyWROJ1G3yx zW$Y3V4cK?GkTd(j7iN3wYT<BG|NcnSQut?D!=w+99W?icSEd-3(B{OF+Wk?gED3Z! zJ1b<tv7XDeVu1x-$Dlk6#E7#Os-~Ls47foR-xG-^c@kLr^^=nuBo#neP+xNJaWfZZ zQ82~MzQ0T+K{8R-ZqFVivU+c~NP+^M0iBLyGLEf62RzTFWX)=hN%I|gd@9Ec0iMNN z3Coc>IJs|f7O`|rx9_2<-k>!j+*iA2evU7JW;C==U~#@_`ZqeR#+C|gk!CqSs68_3 zj1EU+cz2;>Koyo^WTM$aoIMRTRxfY0bleiTnk{bzFs6G-@sn}#<h1-aJ4fasjY~0z zdy|Ri+Y+mNFQGK82__X`T&4XKBu0sc=0Ryv6D~`%ug3D1TtOW1+(i2!)DAd3D(c9N zw?in_p)uWRd^SBG(rtG8;~Pa<f>bp1V@Uz=4O(EKVu+_|AU`sGz*-OokiVvr45d=8 zG}bd|Mq{a;QpvO!QLeRNH~L@}A5{CG(cAPW?L!}I6a?(m`x30H{ArETf_U;vecwGQ zdS1)0p(0$GyX~d+4&6SW>Owv7R$39+;ksyy#N)0@G{RgeTP4s-7JyVEwVDTBE$))0 zYT_fH2n?F%iDY{LLT216yG{V~UL~^75RvBLC8|acVvP;&HqR%Z+@9ICAXBtX%$2r; zpEA7w*leZ-psL*fGw!~&JStxiosMBq2VgXMAZPR#K+OqcdzD;Mqik#hEZ!0BNc5?| zrM-)h08<`qs{&(+&&eI~IRRBxj0?R>^9GWuhKtT@C6>k-@*HrVWUo*#h21_9$pq8u zuh*qu&x#op!S#phQf@qoyb_^VXe29(8H)>fr=An3*H+48)JPX1>G6(ADh4AwcB+CK z1C5`u$c5Oxwpw1M5{ua~$Z<*2vVLF4a6+}}e&`>sUXEb<)382~)hJ8)3^EcmuhAf7 zKI_NalUETNk7O9-5ddp=K7-)<1zBbt-DA_@ZKatYFWPLScYLPE^%GakZcH;;=6>~u zc#J);gcvow#qbevSbWOEohm`O9Oj*tRC<}{kN;+oh&tO1Ae^Ho?bsXFXo9^{9f$?Y zce{kDddPbV=lZgEqTt@D-`Losge~Mdd+tTN_>hxb@c`<x{_G)|7V|leH%z;-<o3)3 z19+=3vbO;Q(~VGKf7BZ5dWV(+7`81>)nuRjZ8;;w&ZP7^7hoR1l<e=#l@O!;5j_3! zw^-C*x-6;B!oXC9^C5-b;-pdVQ@_s7q77KGgt1l3YDGrVrK*oGuE(di_vJwasiYx* zjy3Z<?o?!@q)qS%7fZh-#H|5=3qdAu&h?WS@xf4#bNP;VnZ{Z^w&7BaZm=JtLVJu= z55>~KL9?2+qF+f~kO~Q>en(Oo-*h@+tifayv{Afi>LLq~iZ`Ruw3*w6ms@79o|VN9 zS%Fy=)kI6Yro=d~esCpjHHM*HW{D}uf4mng%a0&laH4C!_;TGaxITzzX8N%&v5=(K zkL<@sz+j?EW=Pw$GZKkery9Dp08-p*dm<MHn>K=>YTtVGIrD6e@3<!mHwD0eyD{HA zWNpk#0r1hmC$>lt3iJ~8e5lSTh_Npxn?&dG<5e;`w1!8UM!Dj&BI<(+(g$)mOzh>Z zD|(QX1zEi&VO$WP2E+`Z2K|c93+6*A1z{&P5<hy_cyrROR}@ue5))no&vI$<%}4LV zMBlq*o%s6X`9>1CIGunuJ&|tWn_(za|Ej<lx0$y2eBcd2{`G|ndymy(K|Q^^v*eiV z?%@TXa@;yW$IjsLsO)uofI>lF+<Lrh!sO^HQCa%UrZF$5c5jc3)+=cq5YBW8oKNnC z0=vMDLLq|xYZ+YnlOZK(KD!fgWhoVoVnc9|Iq66ggt(lfd_e|GN)jf)(}#aL1drQ4 z<}VnEQO9?(=k!l$#KGhwa%IOn6KzXAPK+Ta$UtB<MELwB=};&?cqGk0TEJnAU0-xq zaVSfJ=%G(J&-o-XaN9W^PM}k<Kk{>Vn+UFm!lrU+NT&(Bi%-}%eevBVON_jP@}zHf zC8WO1q<k}v7o2!rOQ19G0(#wjx-XjQfOJTl{>dImlPy`bpO7Jadq-jFQ*qU+_zQYz z@t-}&u*ecZhf5n5M@&2d?T&b)w19`j%nWe@<rm&kM{|Vl#CkBkc~wx1jB~!tb-c5n z);YNa6&FGLTJ_vIZ;xR9alYcYKBO?rGg4GGOF>~+5^PJabtNV1f1gpTc$Slt%}x%I z9iBnYE!C<raTIrS<Kn}GaZy+_hH$ZKCX6@cyj<o?a))0w-|oZF)wVF>+WHN+BhOk( zJ%I&h;FUiz61V+yQ6NBnxB6EnCY_A6TTZ!WXV}L5{ioYfmnc7)yYY9r=)Gh1_F>x^ z#stIGabzfCt^91`l7(?J*I}FT?GrjTtDXMBES7|UAA>zE3^0aZ>2^9*O^&)B+o@@Y zqA00x|9Wj1%R@yi<hZMGIO4rGR;qQn67{;mzqwQzm6$f@t%#O$Ni>Wa_o&6leKlA( zs+9E-5`L2ur3EV~QAeW)sT(2`i(CP>j@@D3ksx}?X3qMoR2uQks94UbFx94z3v&F> zKfcIacKO>szDuPlH2{&&KxA|jk=0zBht!arbeF|MEW{sskzVD-qAy3q@BZS+&ri+S za9e_jjX7A*nk<YR<ke>_a8_Jv|B$Xb`fqC~a~5ZFezi#Ze2ynoE7S^8M&mn+vkwDr z@c~(mKI2TRL8#wRDP3lR5G4@AxPAiKjImjcn3FNF2)C#Tm6cJ<$Bu&JQ=)~6Ya3qv zOIai1W-it}M%p6`f6zXAp1H;vt--}5&`H`%c2Ils!uc%&D3#y@f(b~iWTQ>;yp@`~ zo?y86K#Py!;VgQVliI@<R*PO~1K_`ht8I>^s4%5`9p}BpS%`>;ZgbhdRo=Ga-nu+; z@(x?$$d!^g6|OdzY=V5%%jG3@mBY0QPjSBA`@IxVEqD!{cF15{$2npDv%oNukZ;J( zM>RVU3LvT(N^)rqnzO!t9nFDoIAsDg!_glX=X&$eBIsPf0M2;`9y^Lbp)$VlvHLl1 zrzlCTJ*v{VA{K3OOqWAVx=QyA9TnkV+Yi3Yg0!j#vp1>2b-ab4`sD(R$j;ita*y9+ zIV^Jm;gm>npnuGqu^>OW>Bkt<*9Z5_lH@+E6Xi5Khv}+*sEoq?C;bn%(LW-I6Z2`E z`RbS5#Y1Bg74<H<EZWi(Dom|>>oZ10uCAYAU-Q-R=HU<Chiv~gG56`wRi4R;MalCe z3OS7aQ1i=?=RPFQ{RbQb2O*xNkH5*P3<WIW%y)hhm2o{lV-=XCmvbv?Qc48no{DEA z)XYcehT8Py5G^p|+DnZsS2e;N8IGVzQ+yiF$hspew%W@6&v_)oHp5m^&?tUaWZZb| z+rj;miPy9YFMn5Ci{Dr8_!nQ&`aqs;5{E<y2E;;8tFx8W=6F3xc1iY8MnI#jwCp<C zY0m!jRC}UJnfc>6_yL}ysn(efpIEnBE{6u|!Id0chFwY>koiRA*&Dif<z@2elxcZc zc}V}E$@xC%vynUOJ0tvyWob3SO0#4xG*qML@v#d9*-J(!?Xzt8yS;jW@wHG^79@W} z)vg`6d_5NH_P721F}3$icQwCLIkY56jWcq*D?$q_b0p?fO}4oCVxOle;7<&){i_#P zXJv(_avJ9Dw#9psdH*QBt5?SLG}D|lMi-;8o?G8Gm{cjW^AcaO$eIg9b|YV>c|Ilo zb^j~XZOR&wHRV!!9o9)_v!5U)luJo5FO1k&d7B>X>;-*s>HpYo%zmTJp3f4UG&^r6 zs-u@Y1)hKt>jWoh9*cj?MsTK+on~7RpE)Ygccf-K2-|^`J;(HRZZ6XL3)R%8zT=YX zmlUQz<xPNme$X@IQ(?<kS%0Pd`Jw|jhgvrH6|<_XDZha9dOFl8p7W)Rx>?Jgj%%pT z*wiTHN{g)QS=%8)U|CmWpcQ4D_QpPG_Y8+6A$h$^eLk`$VDWF?4tnZoof|rrT03*i zPqoz$d-_hY`D*kwxjc>{23gHn-_QrW)!_6n)6yj|P@3sU+L3HW&<p9Cjsf)ZPl(>H zOrJUl5Ms5nTlem<>Vu5$p9FiM>{p1+CHnxyMYXZeCqu2Y3;F?^t~`7QVDUZd4g|-x ziS{LDr|sybS1aU5rD_==`3$?ed)Ju^IK(AX8`J*9(nA0pN!2H-SX-KDThCDD#8c~M z^|><+wI(F=Ny&OxTmlJ;2R_2^sym>_7q6z3HjQ?$yiYiB5NJygD4xBKKgrvpQYm4d zTQN||gC-1@x+!&ID+ae5N2pCR82~EpWx8wq_!}U5-k~CL6NVq)VGsRoHR(f^VTS|P z-yh3>8310@b~9@+swH*3<*#pn_)9ucD0+EW$raF$7Z(^@&8W>Y1|2=&cTN_C%V{9+ zZs0vZLD+u6aT07@RM2hpr4eWV)lZZ4+33CZdf%n8IIP!5zIhKIsf6ymuEIcUmG%i_ zWhCnuAN{<V-*0&c(aS^?B8X$axEOe`pk6$wpu}j@n@o-QVX!zz<$$&#nA|creL#$Z z)JpztvaUiDr1WMrCKhq$_3rA(`|~Y~hEK`zFdH{_@CwOIJ!h&40;TmHwc-`!T;q82 z$~^Oi+8ac>uK75f8Oy3K*V;NaxpZ?TUZPdJ*XGO|e|gx(TpKqXw4PK~tG5*BUk>Eo zt8N4#3~^Q`FM&uM-<lV0%YX5PZI<L!oHfYl052wKS?;SXFA^6@J(>=$#u~-dt8d_< zUEY|t&AfF{VWD~0cM+8=0WdGGqZ5ApY-NbLEIG?*n0?t5$8<H3cYU+bsh|D8#bUd9 z|K#nZv2HzBq9p}1)A2$A)od<!f%^;AuPRi@EbnGCk8z*kKCM*c-^$*^Y^{tJJ-`z` zU?OYEB&f2sv60HR9O|2#3GCh49WV>Guin9h@SSF_Cg_k0Cq6$_>d6pW<v}_x#?aPp ziXRcp^_Q;{L{^(D{rMXff4U`0{gkKl>Sz08*7f^m#TpBsOooQ~A5=&xBmk*Y2rc$O z+(O_#|Ayl4Rtz?M3)1KjM|^&Q$d?=b?RBR7PuVX)Y}WH3mb&bttu=;LUssr9Ll7U& z5m$d5DE1fR!>SI2C?*o?O^w0asrF6p2dbqK7##0;?p=R=KI~Y)nG$83Hy1-hye;lJ zU@z>8;EA#4=nt!lB}HkqFOC+^t%1k=$Lm^fkoqy+PTZTOD2&HJW;?&KY~@mdvNeJs z`2-bf;Uu_9XLZ4oT7XK+vfZ-qn`ZO2eYL%;A8)OO;WO=u(7D&)uyKoNYq7@YTDqmr z+j8WBt;+tyG%73YTE<y)?r!4RJT7eB*1}9##aTmBB9O8sWp(|#W^LY2GSrhq41w$^ zG}?6iI>HR5Yl&AAE;fPc7@7{<MbDIv-EX_<^97zauFXRK0sme+5(?2{lFx@Qe)w<H z^jZ6L%W=|U<mId%%HymTPNwV;`FwoUa-LQ0k$Ir)`;VW5PD`_m{^U2TVr$dAyNF^0 zD0@$aOq?=d{~oW<fTpmN%n^zVN5-;VP3S;%s6R(jRl<&ZuFOo-tvx9;C$;04W;0D5 zj>OfdbF~me+sUGYr_-`DS?@A;;84s|gf{!cZ`%SEzc?3_BtbZ~tunKU6|soCMN}eb zsoSSBRGRL!zz_>bB_ZJLF+W-sFXdQ{{7Er!Hkbo)TV(z_)_vXEk2S^83U`{SZ~Y2s zKufFVf6StuF0lkjx-^Q#lE5T6%$aAA$)wSK%Drzw&U#Oj377LpHfOy*VEj#BEk#4W zHdD${S27qaX~|4HsiVTBtFpV-cnOpnQi7DO{-U6j-NtG~gnw5Gu+8Y4(@i$iEit{l zc}MzCs+0>Q?-nj)+uafzAnGADaQrt0%Nc3*1WG+xe+NrO^h~m!%Sznvi|EVZkxLjw zgDF)A2+po%hK)v4hm1yMc(vdxKztq=i10xUfl-Z#TD%8cG>-BN9a60rT=q7w?6F?? zHZN~{;gvVooSmOn=$A_Qx<`Bn0UbTm{hl6$!^P3T>0d;&@C(2I<GAGHO^?k$4l~87 zDmt8uOY#|k8}R2+19>a#mCJKXe`*xn7=?^oSv42HA~iLidoGop7GF1>uFg)Cr%H>h zPHK-v&RaoT#)=ZWY1^M7tK}XjjA2}k+qzp_>>_RX`{6sB^~p;$MWgD8i*q5PJl<Vm z?TRFrapl=K6he!OnAR&A7}p3<8#>y6Ig08~@EM$L6E|mOV6RdIO@Xbd<P{sY6V^f0 z`H1<x(eS2=B_A8cp*UQtFP(X0S2w<!uxFs*L)5>FqNf;y!eD-KJ}htwe*M;#{*GY2 z8a7lnRA1p+D^`NYSis`fcO*Br#kYfOGo1At6pK2sL_7gPzG9_=D=6xEe=$S|fU2)H zUf{A{L>jH2@)o6%ZA9Bj-&WBPxB4aOzeRF1HaS_9tkC+^)zS1QYX3jxaAnugV@{sD zP@1yFofaS2!c*2sg_g=<i8`D292gx!b#N|}YdyIE@)ncGRTj)JO6r{gp1?-OWIscx z#F_sgJ)v;*U1mpoo4}#cwhual!Rf@;SgV#Gi4;n{Nx;y+OErm^v5eO^IqpJdx^-!# zb@DD#H1StTMSwR!vX@Jy+~o~<PEr2MWs0uBGP>XVB4IyHOh`bG&SM<bsBA<uiK4`) zCx}ybIO7HJ{p>C}%FPY6T4$Pdj?(mFkYk5Xt92Oox9NPQ_}rmO!OwHle0_aRHLJIu zm14$LK4q`4)=?6lU9qZ0!_PXvip`lKmH6UqiPE1D%F09ok?fwHURy{gMDNY$bP%Ix zFr5yWb3T?*6nyc!N-ge_!8pZ^1JOC$YzjVE@J#w4B$Ys_EiRaGDu#9`U1rSPf>q=o zD3w^-e{1wZIc|2Ma|*AYMj_<Ryr)Zy&)UN@<mN)K_?snP%T%T@91<MIumGYbQcrof z6*wG%iOZB-GZhONULxx+S6Vs-SSN*{gU0oB`C>6tG?vfn{f4W=_uv<n6HA3e0L{s2 zS+{pjpuYNt>vzf;C1%(xvWl(rc@}HqYR21#l}!=2?z?m)P2$U~fv{%S=&os;nR&Q+ zZm+%bB9cmRIAsEFAEAat=ar%2j&yU5+q34mI;eurXxi?`Vp$CQHJ1xU+o4Q;pGRxo zrf?A1o$L<r*Ty9~8mFfrG8ii=7J<cxqQjxfmr-qg$Lvo(9Rfp;TUUH9ZH*20vd*qp za!{gqX7rEo%uEC@xNPT%lL=8W!})u;Kbn{!)PQ#G0;u673^M!xH6SQ9Cr$vlwVNW? z#!DUYS0t-nZAfANoNzxYz{}<M6L>Nl9nIH;pNF4bd|BnTF+Lx9RpO8wy6EjUO?~;2 zgMU`!+}};W^pl$zylg?@%1y<yQOg$_YTl6t9S&NiTJDy4k}qb1fkAlo43w)zr@`5T zu^z2H*y3}0?6#S!asM1135nf8HyvhXijBFZxaRxiPIozlOS0i&i}wG{&N3CR$g0FW zyl&9(KG47|d&1Lo(R@G1>r`AT#80h~I6K=ak-&kOJde$cK5|xM$NM1Mbc}{377g!- zPd^0~&!VF?0?qe#eaG=>G&mRhU!H*>1i@_Ci_Vus;+KtPe$-;t@TSS(kT8(pShTp3 ztK(D%T&ox*^B%d1?k0to@2V9!1RIv~MCl?mtNPe2Yv<y^l<Jzog1kCgR@+W;3q5i3 z!Ebh-nT7`I!K;^)lF@Z6qZNnQjv|;}fNAL$=?96!X`J*#0xbKye59an6KVGp;f0eh zH5Gxi!>Jqq*WxYoYIp^12feBQ(A)@zqq08W=gLdc(&3sl02xUOoc7olM7v4QKN_&O z4r7@#3bnG0pl;b0qkQx8Xe5p928yq{Uc3q!Soh=;`@t3OI`4Xj$Egwq6>=!g8~m5> zr!X;^^HOqBotl%e{Gjrx;4H=eCv?)<M5*Cc?f;BUWW9Fo<<N%USfi$7<RmYg5hPzU zWtW(Z1uQXPs-4}6<Z^`e?!`gP5}A=K)D%`Fc>kzt)^d*<NjL=dZ<Wg-Vl`o>EwL@` zuhhwc=aX&YeGzKPM!4BTZKx$_arE@_3wvv#A%72Va%Q3Gza+$!A-x_fV9UcyQWXTu zW(YLl3C^_e;7~H>uk_yca*#?DIjSP&yic)ac3M-paxRST<*dtl5WztE4G0P2$2Gn5 zKwKbeq2T7LXNy#bYKDZp^=04kHrs4EV-qz@hs<Vx8VEbC>gug#))`GqlPBkbT$$9F z&{|AM@uLTb?tyMMz#zgS3#U5XFfg39=$)g>NIh}&%iV1KdXCrL^O8a%{_0)a5-QOZ z>xR@yHhO@TXBM7eFwA~JF(b*7u^u<B<4h?LRemV=D#*tB6L&o+uSyJO1;6`!=;iyI zd*ZT`)vd0@iveBU1*glq1b{2b>!%gMN>EMzHL~8)dwuZ*{+gW7OM3YRAAZT&KnT<d zfII`q4#8|_^9Ty%=LF3S>ruj|UCMd_1#LJ4*zibZ%&XC|8ZE@MPp>RX9Uff1nIC@1 z3bj@>GJBSyN|%P!w{QszoI|IRXB?7aoJXwSNO05Q&7d=HSp4&!15W?)^FRIeS8xI+ zKl$pDkKVp{v)TB?XgBg5@fu}|2*H~uoc#3j_ujmuBiUpJV6x2s!KC&fV*cn@j`Jy> zwkdm1qQC<H1>wbLU>I8nRCQD>)b8~H>e?F-z4o8C-I~tEWtk|QzVxkM{cP2Dw8VId zq7E+K=!ajj4n&}lcmZ1%5lJ;1O50=}sX}joA8!!RexD<vy{oeRzDVK%=a{LVo2Fqt zVEMb3FW_tVdOo978oP4ZqAUdEaoGH@eQ6e4+M&z@5NjZpRYKBsU5}ynVxGGQes`F~ zfnfN6Zgv0!*92i$3uta@a9>vR;h4I{U}Xik`5IB%P&xqn^Aj`t-74*;PUs!HI~7RM z28!%~OlkP9=BtG=zqyux=k4?fL1IC0Jof?qOrQ#M)Uh<B%C*6wLq0S!Rski^{D8&C z^oSH2&33Rv=yg%B>_}?_AfW+ZFatB;8QZ9*q70u^MhJQ)W#4B@w09-e1}q?L0XB?k zwKTV<o-UkFwJ?*wZD~Oo%!IqPAA<YPxwGNSGCQzP)Ed!V3IanR7G_nvWR-p4=r4Zr zWO<KAT&j5$4?+vQF!)SaEu=dn8&m**LZmUg{EenNXGTBN%<*YT%zf|K_rYOsTk-Qa zW@^Cy0udhRL~{E+r=)(^NsO>SvIUyYT(P#s9`81^I;KL}rq>=)SO^f_2eB3f(J7-Y zt|Ay6_(?G{ilQWnJ$Jdxq_jtw>SE|IdJ@^J3{rR`e}eYs9E3=U7Tm1?vu$p88;y<j zt|coG7nu3t=b^g&+%!z}4zw)8lO$fDR|idIF)9X0r61Y7gvYf+1h&CK80s8mgy0~M z7qrg}(OwISaMq1P1WuodnPWRq5Apf&W|a*?U+dr%zLL_EG9LgDYTY(=m?R--C)x~6 zHx#)UA|HG%3iDP1f^mxwJI#Atk2MhN0yO*HNrJHuhy~tb0zZ#?y|11g_Uq-Ojs!f! zhvnI+24y``UIr0Wn1I#r*jr+kbpa1}i*Lu8V;XyS5g;rewLpuAm#&mol;%Y|mq4JC zt*wnBO$mhi%AFdyy|BE;L!5Wby?8^U#ha*FDv?lWWNkR>i|u%r_a!hcIQAApoCRk3 zlclv~KYFe8oE@SB(3PM#2iYFvOP_d@sX&CnA}!e&U*mD4b-MgoVihj^>}EiR6RQMC zM(~wrAtfJLXX~OM5G--yTyqw=g-zN_Wk_Ku-_y3g0-A<(5MMrhaG26@KInzMTAT15 z->Yd#uPyZ0n;n2dbY0HdZ33qZK?s7vn`Efw)h=woG|N3P?a<3NBHS(w;T8_AdP897 zxdObIbHON3h<P`lm(8)Di>?AW(=tPrwrI!}Sb1@V+Y1FKWl*oG5+vVo4Cer7C<GY= z$qzW2T8$f^dRK4q-0pD*5yKGT&72EHfuf`*<NsBR@)Pa3TYIK+mI;YI>aq~Z{A2v_ z&iPXHHt?&;SsNxr1AFoy3P8?Ka}b_W!<4bVE34;m?4kzHaLHo=N2M(U83k!fxAL<v z{g|b{z4DAz(Bh5`MRnMM;7mdGh^!l{LxZPRVxjTtD4qFl?fbmn;y@ou8ieHX&SU7T ziW+wE)+R+@7j_mFkvhu!ZMC#Cu5)J-raqXXB)L>!tVibOF5+siVn+xv3Mh2^Sarhl z?R52UG$VH}JlWR@kLa!Cz+>IMY0dmLqYVzqNkcVqB2HRFD0R6IC=^-7uKlw*A;~68 z#@jw3(AAoNX<OL;OUfSZ`d0SRd;}X(E#;CZSNiHF!Ytx@Lb%b}&$%K^cS^{ySk4nZ z0(JaS(Kxfiwl1>tbs}cz!!0U&vWD*hV(2{2Y2h#=3URt;G1%j;vNhP0se6}vCYULb zxR1trD6<$ZSiLB*TrxX!w$%6Z%mAWQ$_7eZW=WOuPP;c;e)_vw9Ga3HSeIG7-FytD zv;V=u_~b2xv_r4S;^#t#(8a;nvP1wwd)dqc!f0nVj%j72w<-tWCOVQIRzo94|2j)n z+*U+lVZO;z8lmm%b>yDO)a86ay{N<eW8FuNYHQp!18E9OG-`eKY^yQ~VS9L}TBi$d zEs>XiuwOUW*dbx-Z^fLV7qX-lg6K)S{@d&mmSxUxE;Y-3&VnLAn#v%Wh7usvaXRs1 zmZg4)xa6cAoem;l`i*o>&dUU0^PNs8WvO@QF+nX>QCK_#N2QVKatT7l3A=YnNsVk# z>@>raIRrg7@wprl(RqS`5N9e%1SzYv%A(Gz)REIwA3nu!6!gd?)R-rYB04&W#|F5y zAr?^~MGe4q856O&h7f6{qBqfC>3CdJ<H%HB$olg$nrb*I+D$3r^<kRX!rfjqa@>&! zMBk{(ViGpDI>eIe1eFCWA<|5R@H$<$sK+ZOzO$&4co1z0M%=3tk>R}~JgLWdw{7-Q z;5Oct76zm5&?3=;h!q*WE<q5mMnnebR9!flqoApE;jkzzXd9?V%H^@cJlZFn704-+ zhNEhib;iqsWI;=la4RB}UZGXX=R~QU+wD`RU|v}(qGX_ou&dUMrmC)oGw5`ZOBi3K zsKHF7y<x3iKHmS^-v05o-~8(5KmFpfqI^_#OI^}q)fU3;lp?=d57g%w(-bWt5GjdU zEw<az?>*Fa@pMc3f$#1k2AUxw51NY@veWKvj@rZ>GO;DE?`p}-JwpfRqR%a&9>W3} zJJY0(14&WEntetV=<p%fmERp%i%$6pFBgO8xvFLMZ^!LGe_%cs<s7bCuNgALfE%}$ zk1jl?oVGIuqLNeJ3ynJaHn<5l%COiZ3xXXnwT%WIjL~(h`zP$7;j)@$5tmJ!8`x10 zr9nguyA<;(h?|m;P$-QLtSFw)aGMv?30*AszKh1sl^rl(c1}kC3zRu9I9k3?kh0tz z{?F*5ndNY4w+#({rYwPQqkqD0c)=oEQY|oi7Zr0CL;>%SMbO~IMv$Xna1?FDm}o-U zm(EgG-*b2JJ6P;u3*K~_kglpC<*L=kYLaV2)Js<*a+0nJ71)adV=&t%3?MdWWNrCC zHsEQUXK)K{)%&GnR003&Q9iYFYGC>dv>|lAGN7D+_vr396(Wh-D4Tk66WT;Mt5V!& zuU44&1d)~{)g}8E62XL(@VjC<@26bSux$~6sdK!(DjQ(Qb@@&t@e)UIw37%B4~w|p zZ3mt;=yvcDU&?7pZ&~8f;7W)}1BDf5=>fh6JBS(JUK?g1uC{$wtMLFI2-DPXnF31> z>qev#TQw@QrbUM-WB*zuT`^@d@0m``Y2>6w#jL0FoQ9{0Bs|8WhiBM6T3aEXru5!( zBqKT}K2TUInjg>&vQer*qx?7=_Jpw>RSz+&m2`b4b=mI*zRRbr%vfE`!pI<z*)YX$ zRFt*TP$P^12#X`yDNiCbpYeLRIv}#(rc)3OL--kCzvEbSGT{c^5P#>;XQ&sEz#sv# z)f<^T+kYq1;P5KTjcv6$Ef@E|eC)x~(~a^UEdW4PjL5ayY9J?!aOANR<@c2W<agYI zYK^gMK5L+d-WHd(==T!wT`PVSlNac&?*a47?=upbuAV_6FS6q-r3^MGw>H&W`!2RY z@rq$V8%>QWEfEI2x<Y2QFTrA>$7ppW8z^19=hQlb%mK&=;Z)*%Gv~V+J7&L1*v4%^ zNq%i*!**8d*$o@EqCb<1=np&VWb^9=sn0X5uz)Hx#sKFJ3NtwT(~0xED)TL?%^&&6 z)`PU1FX`3Roq9>{xAVNMz+RSI95B>i+;h!}rsiBmWE>c&32yNE?7_TG+;59(>=w4d z6N8wX;syxX03f2aRq<>j{aTq6_{S3{A&V_g#vAbTYOAHs5K~M`Pcjv5%%4<=6A=Ic zUk>TFZ<~LaOMjzcu-^dyzCPOUA69%k1XuN6NEF|+5r%Lfgt`Wq0D4kse<c^VM^WnG z3EbNzJl2&PMn|J2MTOfw&|6GldoH8eUK%PbnHUo2gwI|PJ7w7FG{W%Lejo)Z^q0Ry z^=K2f7p2KKwu&LG`h^o6H*Y`+E=|?NM*7j&>g8(@--ZkO3SZc2=%%FS$}6X;nGQjb zx90Z-+vp)$xqGqv9&w;kmUrBqnR>}Xql~leXrqGg<fN@X?1tyq+tv@tiU*asqEe70 zW{QGk9$Qt>f2@glJh?yE-o_`11te3DLF0>Qj*qs#i>0Ssq<B!5cXjrd&b$kLF{h=p z@Yh8wr<eYz03PIu2zknm_NBn3`sBl}6?_r45Bp=5HJ4xdr$f)y5Dp0pwNYeTC?0ue z1+aD^MI-1K7Y{Enzf-7=v%5%yVblaBjF<;+B7BFTrJ!SLhZm2Yv^u~|^mfo*U=oyS z?<6GF3zIN5?@YoGCt(s^QuJFAK$FPrO8rZcLN)Ku>DFUdpLVU<4B*PvC<m8<j7*W- zU6V^XmtM1ebgj!#6&BR2H6|%BE=##>5+ve7<W#6otEA}>!boFAG=(|GaLJ6Q-ll5J zQiY`Tr+PE#el09!MCZ(IWYn$8z$MkERdZ*$g!S7}j7zL2_qOTKxeufW#?c*<k$ky4 zRRX@e#5Y1JR%+-M44897rrBn8s?CF_2!27z<)|WGr~VGaqR6Mcb5o2&*4tT&ae0PD zM5PTTTGLV$Ha(X^#GJwfuNam_qG)YW+)qTS+MpI~XrVqo7m2D!Zze@M*5<n2L{#T8 zr#BNYEo^DbsR!Lgyx2wr#Q7DD<RGWaiMw9H6)`xp_7YB@fmG*;M~`$G({R7VGggeG zDjZtR)TCdrevM)<dkly!VIbHk@MnH0CnH<42=cnX$IDX)jQlS<>VLQMTbC%&NMghy zqoAUpV~E4V!WJ(<q9n;uaHQhmOP4_)Q<iKwgha%0Nl3}aDJZGr$ycCIkzyrEl_{sD zp`~YFWMXDvRmsNA!O6wVqe?X|pBlCN>I4LZM1sIZ%YEzfVBiZs1PAeu0KWE(8DIJ? zL~uA!FdC9z42*?jNP$$a+cTz}bKV)FI7^({)h?51WQPM4%7R|HqHdbqY4N7WoH-GE zbzAd5gkamgbQ_u?sJ0!s+VNHGt#cwoZ%==FXLlFoYHP<_{q3Og0(hgZ_B4bW{ZsHC z;I7bf8W6P4BtRg1ES-*tf>GBVEW(CF?IjEV2%;xM^#tnj7|@^2fUDiLQ|i^V0Zmfo mN|&OR0Ek1Qjn%bSn*Z6;G&u^!3NOINqr`1EjasAlCOrVeD)Gkv literal 15024 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 G0000sx++@$ diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.ttf index f117cd619e99bf1d030446c40c725a1e79c57b71..3be73ce17f8e383d115aafd096b80310e5bbd537 100644 GIT binary patch delta 560 zcmYk3QAkr!7{~wT-0P;ywuFhBY2F9xK}17JWQ0-?L=X88(Hy(F%QknF-QCmOkcrYl z@F5X|4ph(8L-i)B=b|2zh=_U-MCc)6LWq!J)Np>o8}#tq@Av<o|GD2e_wH5Lvu~^f z2EdPdP>>kC**|c#e18duXUR<@Ekg|Vj(bUe1eltfDQJ8p@E(}jqxHz7$XFY}&0RqM z4EP>pjJzQKBp^DdH)gW4lWVnwTf{$sXvj<(sc_H3H$Y4yZ_qT;CBt)|T%rNj$mlk$ zLh*0-)ME-nY2Z%QP8wUCYumtBH?9A%jG|zr<_n}%(pt{2(h2?UIxu|>P>aIO7Z$_S zHX!$$_TLdsT0B^;exL)JlwShJ0QGg=O4s$G@wI35&>L;2e}eh)%vg|}C8{f`udUxh z6M>8S@F^8?u-X6O*T4SsRg80J@?HE4o0FCJWv+F~UcIY}Q$nE%(zE`aAXMy9AA&{{ zl8!zoU+NM0Lm!gbc%+<~NH&+6;MC)469u189W%peQpe2c5509+!3}(JSw$b~aJd2P z?7GXI|NIj?$5O8E$9d%ouE2)CEKQw42BsXbTVzc5%c{Mh$Sp@>^YYO7Evxz4J~|EE JgVkyX9095dfTREb delta 1618 zcma)6TTC2P82-=9USNS`sZc7#a-dY8U1l#_N>{8xVJ(G%u(Sna3)9`h&TMyQCp!ZR z^<j+h!5CxJeK0;5FC_X_K@*>CADTWG`(Q$%iN0AAV>PL<4=Db#Gekma(n-#o@BhyC z-_AKRpZr7~+#?1M0Pw;qz{BE1ED#?4Vm1RXe-GKkL{?Pm1~(W${44<1kXX?vcfI;1 zz}44rJ+h>xvRk#^{|>N_1gLl~C2A`2J^&qKKv^oYwsds*){lsP1(<nFVq&s3sQ(Nw z_cn69lEe(r^%p;k32!0MDrNQ6ozD(`g@W4vWIK~fh~-ms6krw|2xP@omAqQngSMH7 zDq@zYZRggpAoO?Ft2s>%{_)N=fcy`rzpmz)`tF<CcL37csDA@E2;+R4tHXBPQ1+$k z^MBkk28SFFKO}9|=^(%bPlS59>bh_wtp|7DF?Hsa0!B0Axi$$9D;9<^n*cB%4bGB= zgBA#H9-4KL<9_Pz_79fUQS-sVw-*+w`~QRr-aHD}+IZi+JAXVh$9c&Epjfh5Hl`{@ z=Z_Jin3*5s?(Y<D%r~|1NSmXv6cI=*T4wG>aKJ;HBR~-~6n~rVHC<Zc5$^uq#mn(N zhY#;W@xyqacq3kA5SLXldH^x|FYSS8*$>9#9Zr|KtlU#kS>>(v)f{-Dw(em4p(h&- zH$HU)nt(R99Bn=JbX$AJ@e}?|ArK6OySjUNPxhUPJkt-)o_-FV9~e9{G#q{5?8v#% zvGd~-FHTOyrY~H)G&AeKEOS^)OHX_^A>Nh$poNzA5-*jEmBO``SJ%+9sbWEtVJRhD zPQ#VWZ{n=dI7qzKrl4{Xhq*20yBaMEb9gxxZOlU(q-^YfdU(smPN;%)8@u-KRpcaW z*t{1S$S*eb?Z!7SSxqSco`|Cyt&cd~JRQUYj&SQX=D^F{v@s9k++7<xK;WBf?1TpX zyp3IZ_$p4}Q#S8~Zs&J4_F;TuH$jb=;7m?k%gZTAr|pRj8V&|eb%ukXARS_woKk2k zAu}bx{B%S~2%i1oP`4@Wqob0j(1C=QWZAV*ahlC6#6(4lvAn!A#Zt=|F(1t-dNh|$ zF&Z|6AdS#{vQAs~KlDYG*W{c+gF;Z~-d}}Xvj34a)As&Cp&(>MT}q3q0+wK$?s%+5 zY|pFMn`pIWdY|s_dkV5H(J7{}{0d7_vo$)7f1>?82_Db1Bx{x+mRr&bVxCdi&}c?Z zFhxV(WhKe-RF@cyjf~L=l_{2b%o6zNZsQ>#Bv{dGUn;JMaz?z8VYF0^NTUOjRMaCL zN!Qg#AfP4kvZ`x>CTGmL0~66PYo+#4OU3PUbFnSs-MpLL;)|au&G<LDqdasGAE_Y+ dieKk0HM^G;c{my!vgcuYj+&ni+1Y{We*x5>a*hB1 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff index 6ed98780a7a46c0c459d2f455fff7ee01954d3f4..ec283f418b58a52b4d635333e918de46dc22b2a5 100644 GIT binary patch delta 13917 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 E0O4)~F8}}l delta 14412 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_SansSerif-Regular.woff2 index 27611491a1fcae82b54021dcddf3de913573b065..e46094fba16105fc781298a1bb73b7e9dcf205c1 100644 GIT binary patch literal 13300 zcmV<QGYiajPew8T0RR9105kLe4gdfE0C12105h2Y0RR9100000000000000000000 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 literal 13708 zcmV;7HFL^$Pew8T0RR9105yyN4gdfE0CeC005viI0RR9100000000000000000000 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.ttf index e6f34542e296e006bd7f5b313ec59b1e42f12d8c..40c8a997accbb83e0912055f90889921b110beb6 100644 GIT binary patch delta 567 zcmYk3&1(};6vfY*Nt#JplR#5wyP1GpxDXpkDJ@8Cu-Hy42=$W|O@=g`33QsF9VLZo zTuQqs4AhNE(Ul<h5kx2=0XM<FAkYd?H!fU=*sbH4bP8p7bARXD_qg}n_o^;hA4C-b zKnxEdBY)-U(D0?sQXR<l(ajeu-Nu$UOI@L!D%^8YxZGI)ZnUV+E!l?EOz!_?{v*)! z*wEK(`Uzm6$*361>q}qXJTu6@fayPGQC}RmzT*JeB)w77ELL@;M=+`Vr7>t)PUY6? z@D#OQaAUb#(4&!ljhYgZmR_;N{q7gQOp7|TqFco~@r@DSCX0shc6rSi|5Cfa2K+`$ zd$nlCHorI6@HOg9NEl{pNWHvn1j_r4xBtFPN6;RE>dtBNgKgwY-aS$>x%l}*bjd$? z1p7lT509hU)V5tGdpfK_l6&1J*$D}|?m<=^m$*gdO7iayHi;0@j0!(Lm%==DJ+Dm} zpS&O5XYT<-ZFV--U5#SZKNyN~!*i}97U-ioVu^3H7qE;OGy)Fcj7S6=#()?LxZ{L> zN;1V<;Kwi`@8KfKu(8gnB^WT>_-(azuuzxXr@53+-A}oRMC9&DDV@%wc^$#V<NpD* Cn0q(? delta 1669 zcmbVMO>7%Q6n?X7JFXKu4oyl40VbA_QgGL6C!i8aq^PNh6RT0`h(ryLF6)VRTYJ6o zZsO!p=Y*=B5I#Ur4~1Te#HFMa+(6<|2?>G3p%NepNC+WBP!R$SVBUDg5Q+~GBkjKL zeeeJ6&+T`}Tkn%P5CDk47RYdVE}u+ix|hBOn0Xc1(|TF6*Q|3lQ2z~poYL1_3bP>{ zU}*#G%Bo!~-|GMDCxF}nK=&&}&9RY>VrU#?uvpq$r4zrui}(kC>E{im6$X~w*8sBD zk$c=QSX~S5Cp%ccMIvsL-Hqk5{wZ|8061T&=-T|Tr_P{WLOoN~Hf*xha|QJr>eSN8 z?8$Fmzl;rC1ql3XR~+|~Ph(pEE0@szqFrTn<igiC0Ty|_3m`!n<xOb-$L)gPjli`( zzk0eZAqOM@1;P4#1SIv*)MKLqqj(j(0~ozGKfY4HY&>6Jn*i~0VH(bJYYaXHA6GEv zBaJ)LClc{+d^ny&f}8RB@XOI3S9*{B0^Ra=-0#-g7lUotC}dv>VZXd*tkbxYeb^rZ zNxIz_nwgMxnvG{?9;(Y|;@40sBftV`JogY5K7uj?K`br-g;Q{Or`c>GM`052AE<oO z{GfR*8WXW-;)evh_F9-PqqPvOiG%rhNq*{{=y3P>16{#=q3)h=q&M1k&;I^_1NR=h zZ}9%12Rb<aZz{is$Ore}v)g6+`pimC{Q!yly_R`2^QH2856lZJ;k)&mz%s<~J@9;d z&=2PY_Cpvh2^`qPhshYcDfkEsk}m{~w)6AF_O%M&^YraQ?G5rPf3}DT9F#5!EI~xN zCa?_C(t85?U_|Z`*bjqpQsBTYJ}en>R`3xR^SARvF@L>XppO?gR<Sp$X3=ozh<=Es zRrQI(X*H$NDdw0(i{^EcSvpJ5tfecVyPZ>G-1!KdH8hJ(>RN%7H)pj4wzQJhtETOq zWW}|TR?So_H&dw=8BHrHt&h{)K8J-<C+-<mb<B!IRYg_C?k+AmO>}IPjvTGkYD!si zjWgPYg2g8eiT3ON4BM%H5qTCz(!7bh=tQVyx&}ST99CUt1<Hq_C-DFEuW6J}Xu&WY z&zi5Sx;3rJC=w-8XO@F;Yjvx@s?;?Y&1Z9T&SsY9o%1{rv^{l7Nhw}75lppp%`9mz zlo)OGqS4IcJk{Lskm0)acrxj<w(cm7S>jD6=Q6qfT7qp;<MYMg?JJ8P$qjpXn8X?{ jFHfjMCO+ctTC+@5om9Czp2<uJd0fa$>vJLa$LakG9-LA( diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff index 4a48e65f0de679fce0ca17c32f8b52bd3de33fca..4eafae7583d45b9bc8002a32f6eefb5926f7f5f8 100644 GIT binary patch delta 11423 zcmY+qWmMkI7cKnY?k>gM-5rX%ySuwXpv8-8aV=IT?(SOLwYa<c<@bNz`{ACo_L{R# zcIHfyl}s`@x7OVjfR~b_BnS-jX>8pf<o{Z|fBzr<&;Nf-NsXBe1fpa3jH-OXSQ6f* z+swhl`7;*u$vHkD0r~;PVCLyg0s^tLe{#}KFoERY%`Ba*96ojRAQ03K5C|b{33K(* z%ES%$+?lQUQw00}1J%mj#}WhrlK_FJKgCkl>(x0{))pq_AP}wgr-ti4;A^D1TYm;W zJ4F2C#Gjym#Q;0Cc5wIp)Wv^t|No#}1tnqcWcI0}#r@<W{{apLPsYK-`!g@iBM1b5 zNIrukU;&7QjwTKkpQHZwnLGvrf;2Wn@#k=Ma&!M2;HMZQ{RwN{(K=ygSBp>1BJ#=q zOA>_~wLR>;(%}!~Pat*w(av4RK1NdclVK#0VT?_>(L5I1GuotLmMUh<LA9xa%R=as zmHp=K@qB1}9I&(miiy`6J`7aW2%EgRDuk!ct@k@ZA39OAAZ21uulaGwl3~e!Bz6)W z!!mx45_PZZ2Cq%^-zJBvA7#)+l+n9JuX4|6kKwzBE$IT18=|od$ikji&}lADj8&UP z=HGVkO}@cOdcvZne{WZ4_8K1G60Ki=`xWdV7E%9|VkDIdaO^s}9VrY)VLH?KX`@-L z6Dmdb*STZCo<nv()y1}U*_!LPLAq#p>HE852R3p`gqSzX-;7Xw*jfJVC;w@Jk%M*( z$_tuBqm#*pxcqdCja})b5=tz&jfAdHeJ6_3zqd`6=C$e!z9(($eRmPUoupKmcK9%y z0^DDSXyzO@fWkxKSD3H@@ReGIfFms=AvKMkJ?ZVu<>V!>JY1tHDy%%sPGam%yaL!Y zSk!p+;Q6ZRtVaS<3#-held9f31V-Mi?s~(u5Pi@{$12%iD0X9+p5#%4rgD4k$|{y9 zFr}DCtTsaIv~GDlSKnV0Ei3;ORR}%kE^~m<lrX=(062lvMUcPYTQk~?+tl|XNZ@97 zW#h{T(CD`zU5g1_zqy1#;VyUL&9B(J>vi1$vaJOnRwcK}Tt_SLP-w`8+BHJ$0*YAC zRpZDlbTQ5${<5BMl<7DhoNqMm&_2RGIj?M;HCQimZ!Y2KzR31=P|@9g^XQtuwSG0+ zRnbUI0QIpLYEAC5D=s~*-N@SaTyUtO;5qWRq9o%at08DICNo?r5u;chnTLG#q#$py zKHhb*<dqYN*<D7mvBvfU?T@Jagw9x!!=UGhF$>X7ewe1eq92hihX&%W)PYDEaee7_ zyr?9taL@N~-A8S+PT8+6@e2_ZBL^>phl4sFfRWwycVf`BoA66aRlwa3V(<6wM&7G> zhBv2uC>uU63adDdJZ`RT0UsNoPlLOM(lpj(yKk58s9yB(H}jp9fA1_SAqY1<Oc2P4 zkRNToocp^HQwT&~miTTWY<z_v_ARDr!%ch`@+MaFXSu2_+EuU<S4ZI#m>ND<!SJJK z2TXv@CX%@w&C;*!!CWqYX5mHz=FJn~WJ7vH>xTx~u#fTrz0-R%ZCQD<(*VnLv|O@Y zhGt^nP>eO?yt=Eq9lH@@h+eololUKI4sB*kfM0BXI;X)8NFDQr>W8x*y-XCk-=~8` ziqK_e7OG7rDmC>EkaL7ftWKy$TmCjJ07->x=eg+-(esqiEO-s3&EDvZS*(H_#mo86 zqlQ#96-6$^V?nUP^5G?TmvvyQfnM+LAhFajv@y%_3M{*=;hDg7#(go}Uu>${BS`&e z5J(b^$FTO~N0_l|Y+ChYS*FXG2$kf7m|nK#Ecg?YJe-L#9E*b!LT=mV5Ol|}fVm^b ztki7nY(-cq_YGBnJ->-tAYbOjP2SYHrZow>`TS&d9_TBmh{VMRH5irR3g?5da%YqJ zAz@MUEt8#u^^j~Dd>R%N$upv#Cg~7a1$G*<wqs0_HL}j3puBmWUEA~rtO<fq=A4#f zzXQg!;Zu5hZ_;H0{qwDv)_K<jki+lPcJ(^4V@HqR)^N4Qp2QcY-n}Qbd+p%kxeC5s z>ao|cP->(>vb8$3KFY$WGwwCypK^SnP*@n^U~ouhDCNS3;V+m#btCvgziJ+Pni^&n zc`s`|oIQy!=b#hS)-M*=H>@s_H*A=Z3TzYV8836s*Owj`LQtdYCvRi}epYI?hPad; zYH|cNmxerq3>e=BL-AKT;f3&5Lgi*FI0>#e|5K6+;{-fS*1<(&RF}GVGWwKeXuuW1 zG}%k1>Ws6sfhH)Pc=(}kXy%FZs5YTGT>=K1t!LNJksg+Lxg=UW9B_~Is3NytP%*LT zv85Ap+~)f0!tvVt7Jc@BulMm_nYN~@;^YQ8I4C4C{3Ik1g83c67a#b(CPqYB74B7U z>a|v``fu`Eem3+x4`S`;!Z{R#=3<wrx9cn!jSJipasn(&<jZ6xoroaIyeK=SLndl( zBdpm1A8RzSautTgIwi0`Uo@*0wi|ck4=u>|BY-a&H8SDsLgoT!Q?vQ|b_uCYrtZ?I zB;}Zysrl$p75F?dB$&<PwQg=vt<9tnUPq;*kw-q;b}EkYxN6!VS4{0^mb0_;G4cIz ziYaNfhM{nYl{!H>PPK@YbAFF(O<Jq4TMPbUk{@~T$_NEmLedvVXFHHz`aQkoTYv{C zlCAO;UEp$8)zTPnoz!j&Jib5fKd@3aR-LOcSD1o?3UIu?RanF!$S}lJvXm4%+~Cbn zWzR1Yw@Tg5<U2IegBe^zp<(4tB=ET(-fimQq=3^Y(EmGzZ2YcbTlICl!NPG8Ecfr3 zk!7L?h>peou+qlN)-=$;)*I08Vul|MElP)<cXPQ*9ZLfiVx=gHgUxNDk<uB^44Yps zgP+EswlZ|jA`xOR`UtVmeg?kJAQ+{BP+=3NaX!#LV1aA_sSV^7Cwvii?Gqk30ts}Y zfKG9BaaQ$#K0%gbJ$a|7Vho3&aKYtp!F1em`$r`s>O3b5(v^wOy*6eCk^1Shj%X>j zGnnZj328vx9#C3oqiI~|qGxS>buIN#O^3No<rcn~`;MaDdULPGyy5)3yE6K^W?spL z32zJUgPc>>tY@?TXVkEH=g?bh;YV)9z;Bv%IYYmRIG|mx)z46NvII?FTh5j{`Zy-6 zRm}HHpD2rAPeANLlgH7Lg&I8OJKNM{TI`p##!vwFtsR<VD)8EQU~Us;^jLaWW}m*s zeNa852-kNwp{~`|+ENpizX5yuS7b16SbZsnz7K=W7{c83GLn>4KEKtF>MWh9^Tyst zxjfo-7k-@__vqI4rHEpWYK~1~r>kA%@t|6Q7Xw?7?q~`(aqLkO{>*SfP*yDU161$0 zIu;O>7wQVe`7N;`1`<MZNj8X0m6sJW*;-k%{YOf{R_4$Q>-<_0GLbx-TAFI<1u+*$ zBZ35+JS1`E$H&iiwO1>1lqbR`y4SB`3c-kz!m-hv@R;|-3YhRGtz;+AsE`!Z;v$mq z%oynf^2`{aaK#Z{$T+C#$B0ylmG@tU`4$0p;Rwg@35Rf_b+U5X-yO<(Ly|KNNgRQ% zR(KySxfXVN7OFcEd&f^gDyK_94Dpiz`$@TvQ!pD(u|q_>KCk~~<jveEuw59w#tT*t z-I603eQ#wA?%Hz`oIm0baY%^>@k{a_IN=w0hYpy((qIQT(T@&Qtz6yEP8xFNQSSi9 z^Fr)nIyxLGPieoCRq-|k<;u#^DeFe1nD??RXk3~|SIfYT3S=gELtCU%9i9wC)ovOK zSHkg{Srq$VHlCLsB_T=h8uybZi2f(!<MKI-C`#w_F>r>Xj9<N{{%O7*g?)jYOg4>C zxwSBK2@8`YFCFOPBPL?MLoCfNhMNQOc{pHuJxkSHM?<Zz{^+T-EO>-!7qDSAT=@(^ z0<1#RMdn$-WJ54K&`~&pwd88E;&6y+h@i{v_>l+1D*KFfwoaEOM0v#li@nt@v#1~; zRAOyn{yf)th2bn$dQB|Y$lxTk$Yl-^$k5$bC2nTfVdeB6*U=^x`fz!&JzRhVEjk49 z*q-{mzF6|_olsP4F;-(=*kl^fg09E7OQUV#MC#$pe>;pf9wKvfLD%Tg(VllrTT)dL zDoq|F5|U(27!=>~t;3tLWQ5|4Ff!Zf58k`7<~{uyuA;m%t0KHku`V6wflDz(nv#Q; zlLkj35{TXOl0R#}<a*PF{}vEN9*%svTF0WHM2Q$90H%bSqX=y$$Y^(>!z_UITHd$+ z8{<N+_4j?vjmB#I9*<YR`YD|iwb+rZrVZQX4@*xU&kki6s<xLi_Qyi_l)iL+$&0nB z-@g&Ro{qb{U^{#s6XUb<0s(4wugUC`*_O4y!ytqkwLBUtUqY)T1UR6fHE6(_BORyS zOH;P@tt|Sl3jV|fOAZpspR5h5;d1*SE4@ClsJe7_K|CK}FJW&dSnTvfT6qE8cEceb zHAQnG9u;IadAb1|f3k=_(c`lFwTdQzK%l7;l?n8kOW~Iwavb>`M@%0Iwk|_+@ZIQc zTN%rp<*S+DnOmWBn_?h=r^`yfcy23MPpKG~l(@UJVh<sa>3ED=7QVdQliN+Zw3hoy z0u7OEtfl2hrk_a3bb(r58tNXdJXA1YVan6b8UZsSu`PCOKw3N+I4;YeUg@w68GMMm zOck{)qehbFfTnPB@4mi9R*a`j4Z6p!=>P=DACnID8h!A9AHX8khhE#Cg(u>ENpi4! zs78Q=pM-1afM4IQeLOb368vdJtMjrY4!9M(@IJp&62AMFlG)_ce7<}2_YT7Ep!ftM z#g)TUua?B<8*_`pLu2v@?qA9E#cKT_==~Q%r<bbbrY1E5kKLyUmn!?I8)rY!3~tmi z&JzRwL*3P^E}+70CV+qKRx7-Xs*!j{VK0RHDC5=`M#k3|^$2`Mp_Ord$EAFGn%>RM z@;ugtY6|YhjxaGuGf^2F)0D+W)ysjN5YAd3+oXXNpJi8ldO;PV@Q<4}sSH$ML!79; zv1H5L6S=E<jBO$JD^v=v^i@aCv%Eu@nwK--AM-?Z3?QnGJQ>W44RvySn5PRpGtiSO zp^H|6vg4Q>={J^!)!vnidUA;OP|kBJED9d@cpPz;N(^y4=C1mBq>8y2`d$RA>;R%A zAv>X*HagCVueMCTcw}DDSM`T}|6cXojt`Isa7Lh@Uwv2B^7199$89-j$85%D6pyT2 zmv>`M8EEB9rBMjiG6mrax~Q4DjHTjWt|OWc2~hObd`o_PG=$7U6<i^c-Zy-8y0s%} zB&7CAkhL2oi2&Jg&yOZopo)Ru9w$sDrwDoH#t(iPNoJgq`_=5Y-OZ}M&+7IE`jlER zWvm+)FE3$9=?u3~<-x|3t(OH!7g<s77efbJ0$k=`S98gZtKmu%>$^I06YYTqWwnaw z1?AU*1Oxe^J{AJ8(KEOyG%4eU6BVR5M10Qsm;D)tk4}VnQpD-AVrKBjW$G583-UEQ z+#Cn%xM4KC#gw5+l-oMA0V~y3#72J+`Barn#4eM#=O-OZ-JLvnD!$T|yONw0B{q;# z0kin4>09HVJ_zXk@PoVE9v73imhtVnCPF$aILZUVM@CP$kN7oNA}S{;x5^_PRPXx) zxKY$aSk&glp+`SBw)Qj@*=3vFpFkI$;OkN$f!%COk3J8{(?m^`RtLXr!Na2F()xqP zgM&vv!(I3@blb(){mf(M3IE>ui|J+pfZh52U^Z3!K+<zYD$c(75}U0o%7X9xFntKp zuqeU|{&96(3XTZ2lO?0igK}PHek94)K@^XeEnACcvxZhAt?|5M7dL6w(?_F~^y6Xv zB0@V(O|$ekQc&D08>onN-d#w4HO#gGudlB0-q!2l5{J@Ez1V;>*E7mwNkY5?ywZQM z*y{VX*7x@z@34v2{~*^Wh9Vc05adF2hQPpKv>ist#Knzr-j!uh9+gd2P3d?F!-GiE zPtZfwfT@Vs6`DkgUfxoFKeW$J9bRNf{awt29R7`RF^?T3hv%v?7Y|CvZ3`P#>*U@% z$b;cV*mSd7n8Juu_=lG6){v+gkPFF70<IScj_)#6qgBi=-h66B;TZu23*D#?wKm{A zFytM&6l>~-OAJCF92@eU0}F_&`jTMq)pv1{D~VAoLe5v{LMg0sz1ZnBWODNrE*ChZ z_I>~SL=n}c%usGPBhG=M+}L~)3aC5DJb-;Fa|+zC%kdA`W6yp5oW*Z|KUTScyZLh5 zX$9Ov<)QvAG>2BoZh<r_Zbg|fzlk3HtOTPB8)U6J^xZfLElPd2t7vWtyAK=8Y=~94 z@PXt68XpWstTuWe9k<Q}v`~CJt(<P!kJ#^fAf2#Cqx`roI=!urNj(2rN;m1a^&_d< z&i@ksO}4Mx5U)gGzm6ORn3J>F=Y2nvnDOgVpGXFGbuA_(6BznC$Rf_fEfkHJu2C;4 zS>v(VJpoxhhpY{K%+ZySsA~GU#hVg!T3xAV<8PaL%%iTFy_?{o@mpyqMkVaI8vn<! zY>rrZc8j0Gg)*;ogF;C}ky>wgjA668u1py2Ea&P}gSG0sg%uSD5R=8iM=vs+4(W*@ z{1Me&jo*ixd^DP?29jn+o;lT%)Z|g_iw7IL@t4l&V(e>Jd)(Hh<BCaOr*b9F5-6A! zjCnRM7&vNAg)u>s9mn|~m=!2$5i=CuP<YR?=y--xPa!$<$3?vC+mE2$9fO3z84iHM zENz_4<Gb`+NwQA|L?WpBqh=<?{ro`ga;8g6`~;Ftn<&&Mw{Rm8Di#(mFKDlZ<||M0 zUhQWsi$c%Cdu>b`-urWdE2r)brvCLjKV>DvcH#A}Zhlv<$_;xYv2Ep`da##wY$T<5 z=1R;QT7_Z%vUJnpteD0URARe%UvVUm?Kt<Ne8*0=_bOEerg?8UhI5xO)@7dOultqv zF1=0fjX}xe6Ngb?b|vg(cjeAxrvC;bRhej&a-+)pQrApn`4##qBhpaOBU%1cTS$yY zBqq*Wamx>-3*-`aD$C2r?;)xbJQXhA8dJ=w!uw><M$HfA)btWj7gQftsqG<U&SLwY z0Cm+wAw^{X5yK$W6-xMz`GJ6j5bT<C7bR~;eWbE!olrSfi}`6$S$b7fabw=lxSv@N zX1sE7e0Y^)VL0qi1B^LQdvap6n9$lp(!}ysrZ!mCEq}7?P9s}~$hb<baNg4-5W@Fy zemQ;M1x;xbk2ER<6&byf-;X_(?BZRYIpsjZS1-^4GqD)(;H8%*g);#XG$a_LPF^$U zA(xE3KE~N3jdp5GC!uk|D|~GoOi#6s4U%0$=oIo|o_|$0%9hc$4UT5xgnjqk2_}g* z^jEmK^=Pd$h>p1w4A%WWG=4^$Nt-Wn3(-a8Ft|+*Y<|`Kz4(UsA=lruobyd<C#P(K z4a091@I}&;8dudGXWqLfVqgTeuiwFlz>8<T+*gsQMdHe~47NQeoMs~bzQ!pf{B?t1 z`Kxg%qeOk=LXMIaB65t2x$Ontgxey#gvttD(soYwiMvpYcHG}KAuWsDY`X6yd}bgt z8ru-|hwegTa-SJ;2F#7rBqF1rzdu)5f%(5W;5C%lirdz#Uf^N=ukLRmj{1kPZ+{$H zVVH!R`_fr8GU9N`M0RNuAaTf}FbMVdogep8bADDUbzXLnVM_hszjIQ8m&O}wSV9U9 zPfXA1j<zkP{vMl20=e=Oo7>YRHxWDyj|eei@h?Jz2ZE#n5lA4}o0Fnp3Ib8DW<O(? z0gZ9e9mqUJmx05}j(&|-<kPVqu=RRR7g?|p;79&|(22w)DT$R5@p4u+Z5nvv_y{i# z^#l1`4o#xx;TqSHP~bCv+i0=CuDFfU*wa?e+?=`It*=VA9E6>4e9jlo`T3L4Oy!iR z#uhFUIZ)zlCx0q8CY>DOnfC7ELO637fax}zj9!va3>3Yeu3uF*uA>Alex=Cn@4ics zyZjoJ#VdtEohzR_o9u#mZDgoB!5+FFG}0>g)-U|#XA(7>eOH*UE$dp(Y612B^eTlg zI{z~Tl>(=|a~S-cZzNtTfu2zgJoX{Dzl5_W+S4u#s+WR}^%#eia*$Hk-r>a>INON! zoL~pNs~t{~L-O{VZM+)PO*EeJJMz0)J6Kd?Oopw4ZJB^>3+YK;;~Xana_b{*{TQAV z2;P<|79Dh)R`Ydjyp)of?gWe0H3l1L`)>Bv3*mO%`dSG#9XC3EH4~JG^84&PbpY=h z>a52V#4CJUf+k15Mo)W3N((Xo2n{ICq>Nx`X-N^g9_8AS@XT30@nMx+vigI5gD0>7 zd;?`#1eCF$E};zEU0)MkimTxL8G@lI_F$sb>H!BO|D)UPF9f0nRqOA=;Riz*>I9`( zfzIT`BtgeC!=;wa8mW|YO3DsqwoliRuv5FG#ZDdX3G)%(QW8f|IVaHpbc#iv>BMef z5+{m_@4z}dAvgt7=_7-(H>`Qja|=L0C+ZPi`tQwP0Ys4pUV5Q47KO4MQeBr_4D;27 zym`#eWok^vp-GFNDx&Er%6rHV&8Z8a=KZ@CeF*)le{KYE>$rYh6pL8==W0)5hTEQd zT2(Jf?wJHlq*v!ojFUI8T?13)-J#gD>FyF>;nK;KGbt(7da>LhaN*D)5l9`Wd}@LA z$L4l*e%i}nQi?w{LIPh4Lsn4X)Dpw%0X2+IAtW$AzppA2-{zUgsA$9brZ?9O^(#xB zOzF`~U(zgE<=sBJ)rGE%dPuUIov(?ty*D2Th&33VF1@CSdBqiIV5+!Q-iaYb;I3@L z3E`5Y{91&%G$nE0lS+t$A6ixixSThlrl=z1fW<)3Dq>r1w$4;Qhe4Wc|I52i!*ps# znrkUs#_eXV!JUby92uXRi<|rl)nI9|>+Q>kH?>2Hd31W)gU5{yn%h=XuZ&?dTBy<e zTx9#}d&GoMPg)EV8;JVgC&Y|j7~ril7tZ1ed%8@APm+_;V@lEfjHo)xwf{=)GOO5l zjx*VgWb9^Ai+PvOu(kJbJ|s->5Wm<9!FUI)yhN&OQ`M+U9Reb+W(=~)Q!cj0(CJ*c zrgCtJr&x8uK0cT2knGgy4I%rvy~6+-2Z<&Gb@iS0R=ow7FUhkOn`Sbil;EJNCyr7) z!pa$;7mjSq=r_7K9wKV_=;U|mIv>9(B>4S;ZI$s$j4X9Npl{~Fh7s#cX;V_a^4rC^ z-?2<bWJ7!vUp8c}Q|AkIhr5OwpRC(F;vIiwY1blsGPCKBNYBdX!UkzfIyk94Yv0`7 zOxs}jkf|(Sz3(9vH##wVIg*_J>th!wvESJLFN<7wQm<&aoY@uxLVi$<FBc1*wj*a8 zv%=iyuTgj1zl(8yj9_Q}YH|hc_18z`YPHbI9qoz~=j~ynFKc4vqzegYG*pC;Q&1tG zMr!k+1?E|DgO6-&y=c<0mDU6tnHIaB2(K3<iy`g-Bcf1ut?XFX-^plNLhU(mR2qr~ z#DBeU3%ZPYmJ~}I=QOlF_g<KZU<I~Omc!>At5Tc};0Q!^ZOgp+4Id0M#~V=tOHqW- zyBES9!xo4q<ap)mEhp9s0!KPzh#uz8u~1=>99^=7^dxEq_p@Ayl5ZIdq<LtYJJyA@ z4UXRc)U%bzdBdo;O_^{EbHb)B>W+&%*T$5<_nXbf=L2Bt$>?!OYV&P^yJIW8B-i&f zr)|+vax}$sVn0&0E-mo_OP3$DnZVs|Ct&ythM|qLX~BoJXy+zk_z&tj^W8n`y48Nd z#f;s}2*L)=P#_ZSioxbuq54S<?mE^g_s}X(%ODV^x!a#4&YHp&lD;MJKKxzDz?w-1 zH@p43yGM&yNrUGUA-s@Wwi8z>M1XEMZMFvjhO&V#a-qikwUW4))a9dAWe;69EUQqr zvAUv#^ozYuI}La(q$G>}Kl$D=O-K-Hx!%Gp2K5+udR`y}4(yQ%^K(zt>RgT?G52@C zHU68gKO28Bu7C#{jxz19X>ryac4;sWG4cSIGV;*bOiAGL_GxlYvUHKJi81>?jLobe z%V?iC7*vnzPs2`am-{m1%I51Dv!iZG2zWA+-z2oPs<?0`8dVLet0-T$ZC*sw6r>n+ z&;=X_QtMkdOJPCSpQln*8>2;Jsqz?@M)fCkVlVV`WJknI3a2vku8WtjkvWKXw%qVR zfjU%=KQh{Oia!~#@GiDkCz6aLMNJ2bHyj&)RN>i+GD^A?G~aLXE?~$Hccw#)AMw<y zh3o!9rST?Zbl8Z4&zxrVy61X(16wHUO^OP(-QJbcv`W|9dqD}WasDPG7ZL=_8d#Db zdwn4%;WlhOAD`~KsY_~bB~5~VPFTBh?(lS=SUj3PAA;S`MDcPpF?75yzftchrf$r1 z#M=BNp*s$T5di;&ezX>k)v<HlD?&?A5su8EKCD%x@5Mk9{0~vIpt7Vq3EPfwqj-od z^g*!b27d7#IlHaT9ekFRmi-+V^cpTZ*|FvBEi4JO3k_RWwpsDFmWiWY_)3v(lHeC! zuI2*e&1sYxonYFLT%0(C2^}iYSbk&%0RbVN1fX@ZQmb|dHE9}eUHTf*A)hs~ScW5( zs1>f2jG_~dV5MrUN2={#LV~%T4*(J$4U10?B<)QWRKeS4c~iXqRFwel64+67N1QpV zbh@<20`P=n#oXHXW~X952X?X3QCS;iD;H)?i+1#hefljzzo#s{2I6K#RH~(?cUPZ6 z<{54S0Y6`xkJDTA4%JvGh(@~M@0WQCe%#hx^oEnw-iZcLw+e_jn<bxtM2GT9)J4yJ zPr`K5S)(sUMRWhQJ%E4jnM2J<$nu0)3P{DPj6Rxlmcey7$dq9}UV!5WtaRQ$1>$%% zXVPpQPdP^mz}9qn8yqIh*0wdvFo4Ytp(6wSODP2^iDEiY&iI$_1YGu=cSs1O0;nk| zigsUQqid$pM_$(!`j4dCeH~_%L`F`Y7B!h2(s1nXRpB)yp#euj>pk$)Q`w1YYd9o4 zQrNr@m@t&DnIRw>U!u{ff5eGWBl!!@XrOj?%V1gXMII8cZ`I<EDW&nBKedIWSKqLM zC`R<)>j^I2;!n3@7Gsjb!{~WasOeaI8d4r9AN<<G>D#8wy}&l5lG5A{7VSE)IxLZ$ zPN<67{}!@(C;&gGkYiDfULOxKS+S;R(%4$Aqep3|S{TCbFZj#Dbwwo((wHY>P7S0S zzP*tV7qVr1w{kn&_y`LaVWpHkdkrVjuV$Y)73<zj++$g$`(l_fSe9CyI`n`tb!N5` zjA)2U2>Fz=6AEUcr^>PWOCSRbB#xc*Fg~H9o#r4VbPvpnRdbeP!f5s*d`KD6W)2^W z{d~REQZyGeA@6!RN{W<$*!5XWQQ5YoX_9hUuKlg9IBz$j)^st+j1F$T;-@)ui85la zn~<6TO@b2);W@i&(MzKm_U^U~`P!c=@yG}X2X^`kuFYle(kq+Z;GHRHvT=OXkvG8h zV<SP<XAnRWPz{#Z>|obn`bZ34q&@KX?YZa<ap~(fyy@A5b?f&i(J3|5r1W-An74D} zN`$9M$7-THx{VWt^-xM6&iPXwfwrBs+dfnFcuu|Fy%*kkaK-dyNxm|lWdsQKa`d*T zVAI#`V0EBd0dW(&6cj_fH=y8TxO@pmr00<2RRsWf(*X$h*rohrQZTi8p2c#nU%2p< zcg)PY;Ruc8#M;8|OQ#a4ZG34<#&)Osdu6UBn@3=J3%qQ0`w;vuQWWXrgGbI3Hs~aU zhKxv8C?lD}(+l}+jqyoaENroMA>Y8&mq}|$#Hjcsu7ohRe&bk$IC*XSOvytks`86T zy9d0D53c{>AUjQPz|6!{jP|AEl~DRkb<MXC+D*4jcGMV(%X^*dG5X^5Y}6X8?5Lco z+gCLjaCXT_X|{o{Ev^E&Wpf-I4F#*Uqz9udk@W+Ag!$a=^F;KfV<IDMEpCfMSSHtX zM>xZhlE!TCS|B+FkH^T%oGra?gR?U%!ht<~Ren0C<HqlCZxf*uK~l;L8>+Ilg`w<@ z{bvoDp&|xZ$=RpQV&A*w$P?WHHPX`A+|7@+Vv0Nuo)!j>;Go<V&)e<}XA0pVEbjW% zpI&8Me1^A%U8Ozbvo=bthQg$(ggH%IWHNsu1*m-yAd2jK+uTToP9KqDHpI2^T?Qih zAr#w;qS!36;En0fm5v~XD>r64Fh1h_v)fDVCe}cF3vCYdN9-6h3G64OQ7`+-YQH$Q zwdY(*!+#~x!Fhx)fsrJhNg0fTWLQR+eQnpOcJwqqJZxnB+W4F|dUW+RF7;N0FFTvM z?(VAmo+HEmthKo<ep$s)Bs93$Xa}4YhQen@q@~q{7q?D&8q3z+Hgf1Ctb}7on+U$` z`CZU?7&kg_u9}fH={a5-b=`HLwarX@>*^<7o0rvFS;yMM&THhjzX4xt59D0_dCZd( zU=w;XP>a{$aUpg$Qh^$M{^2bi`?X;DstChUl_tB~iHL{}Hcj^*No;iK^XE$aU_)vw zO|%^1R7w>2);#NoBZGAWyr93gXR?%*n<w94*pEYX4V@o~{J{{^k{LBc7|t~Nt_=3$ z9788fY1AC0>9v{B@&vFyA;0F^as?KU^*y;Vr8unT$gJZEu^3OqG|_;p@y?Z(w&~o~ zujVsLK<@ZrEZ<gtAG697oi6}**2jn1#)i;*n}l!>qqkE_LD0O^__<Se-$tQJ?QK*N zT5YbC4fD|;d2u>zCJ!G?%`TdY;tC>=2sh-QRO_L?jNyM_R2&mhPQsfcdUfR=dP`%x zfgEmz)?Wej*ep_wKZr^uw!}M<>wD*>MV5n!&QFq}>WB$%mY=$AOxywMlERcV)tO-o zSJ}id(st*5l`xw)>Wy9BC;rUm5dQ?fF88}=K5J!{LaroSYw`;8?8k66pmYl1e%9GE zX8tiXvijV;@V%ik;_O?8oqpfB9Cmh=V`tjnB?s9Buv*o0t9+5cacv%;<(1zRkjEF= z<M+_+GTmBs`m?rt#7hkbO+O0Col_Rt)7G?f&F#l*(5<LsN-Ytt(IHs(A|sGfS4M=k z5H)Eim*duFr4?6`OhJytuc#?1o?O14j#Jc#S{7m8RGCEsCDQ1iLpe|-^FmJBQqmX! zH*<k1o@^uWIOjIR`>E1lYTxK|b^s}T{%m?ZHjK!GWp2ZCT>#)XPmVPgKa|PcQbmjV z_HGG->K#CXoy5%yc>-}`z2?!Z5nFOLHPZv-1i#{<hm<+<J}=S!m4^3y8?dSk4=|$a zl6=QSZtT7A<&#A^nL+0p^{J+8^+Z^zUWqJ-L!ZDL6r^PV&(1}j3M%jBvEW7v<w@K= zeTRaaJ>BDF90PQy8`q!mp*E?HLJthC1lFjd`|GFH-t%$&iEAtW5)Euz5Wk`(cTo!( zh0u$<Up@dQ+<{wGT~9F&oi7TLg725V1&n-N1}p2N;wp&Nns_t_r1kKh==?o!3}05y zEf1W{n;zyMHsAdgY-|e-!J96po8C55>NYa{&Z^2DkAOx+x;*t;J?Q-@;nrf4lV2?B zS*LJ*C{HG}b2&K2HjwpJUMDduIz&(w)dC)?f30hdqkmJHUiV(!*6+vaiha&q>>dO* zELbA_azUUVOpWf)r`24p%01mZdt5vy!hb9O3_JwUIVBIo?ytU=Ai<_EX_i1dZ!e3H z{W+u|wE!4|j5P}e#q4R~M@tG0P>|Gd$MK>v;k9Ur;?tvluT`H8CPrTnW(`Zaxj4_v z_q37+oT$OrYKY4)oU)=#q(!~U$*K(~K*6_Yk4_V+%`DWK@ge{8WckSe4Z$X6!zY6W zWh|nSSc-gE>{gCRC{xg1dVvtjWEbJ8ne?Nx317J!SN`)s2TcOy|M@C9%o~Ogw=`Yr zcr!d5yoZZH9zDc<vjZ*CoruI8KP^t`H!3kaWYb%wAxdLeYVH3rrmIadKXdv4!KJM8 zSvL4t4M?0sMXL+^&;6ve5wN00C<1pN1c<}Wji6QLvb+D=e!RaALN0@EesWk4_<zw) zdj@?LSbp}T@IM~}K@K8^hz1dZXMpe_pg|JgY#=5G07MOL3POY!0eyj>1@S`?g7hI0 zKYd#eG9(X(2qFvwd;#AE8AIHGbRpb8To9@s?-1soFW@JiLJ|-+xFd)Mg7UMYYLFH9 zAcz-&6QuT;805WTW^8V3-1>2WD~|bN-~;%Ws9A%I$^-WS4N${E{BOG{wnbKV_h@(b z+(3PJaBx117`u=$i@CX}2sjcV;sq4$MtkTLgyD?78ZIF&CN4G${cDqPglX%f^{?*k zDdHi-L<>Fy3QSyFuo+L3&w9}Rb!u!3ZfZ$_4VD;foDtdsl6C`;N-GAFMw#?{d>E&a zN8Ei}ee`{t1li_;Kqof{HFXU1OwfR-vGG518dGCSWAiP@S{yLekiWwuV7sDA@`(P3 zZ6x+2M?KEqqn0L9#+X61I(S96jCuB46fTCvh=U|FnQ=WKJ~(-twbHRP5hjOvleF(l z<Da(tD=hu#-p6ELJ<Y6vTn?D4P%e_tTjY>Yor683kWCBtDLRQ65P@3@4roTIePx1j zqGp>_gumzMP;5k<RXUX0Bb6jhq0T-VhAX6#tL^PqA8+d-7s4`f4Gk<Uaf~suk~!Xm z<=0!R{5N;bc=X|(pDX%Of0rP;DVObZGtr^J0(VO}CB<xa8y<Q8PNL@V^H=1MUJeWA z9s51@+e4S1VeZG+`!BQm8~`hD!e?vkx0l*v#yAM0&{o45HH}!HQ?*;jq-iI&U0#@U zl9u*j9;c1EAf!}AyAl5(I%|F0T;t;Hc>8BF*?p#jW8J`?HxZl`=43A;nxAi(UPJ}N zCj)66w@9$F)iV=)60awxI&>!P90%n66UFn_p#qdwK_$=0-<mg7PfS=3z>wEA-~LW; zg4I>J{O?lQ_dtP#h=4%V9ZlX|5XepLkm2C=sogxV`-Iii^{yUn50|&s_g8l}IFXd! m)Ty*+G;CuuON<!2W@T^KkPr!xKn6>&m!CHe*vAJ5<^KRW<-d9W delta 11848 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 UZD4>_A5?*_2N~GsCjjOD0nm<uIsgCw diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Script-Regular.woff2 index b0aed195ca3be06a66c66919dfd66564882bdd81..69b1754d7e2aae2800977b68a8da73027b6cbd4a 100644 GIT binary patch literal 11792 zcmV+rF7MHIPew8T0RR9104@*!4gdfE09*I~04=)!0RR9100000000000000000000 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 literal 12064 zcmV+*FW=C2Pew8T0RR91052c_4gdfE0ANG_04~M=0RR9100000000000000000000 z00006U;u(z2rdbi7ZC^wfslCrDgibEBm;p63q}A0AO($c2Z06*feITnRt4M`x?$r0 z#)Hpxq9`4l$-w{D11dw-?oS7RsD?<oH9E}IT61-=G_6~k9DQ2X5NHZ*#@MJW7hUg; z@OGTK)k@7<cN3$$)Pw3!e|b19G3*N^`c;30B8KPv<J&3P(BAQ@Tr4Y0rmgr<Kibt1 z8v7)d=i&GFd~2U`@3%1!lOhzICM3vx8mKq_bLk%t{{kmD;DnDccl-m#Fz}Om6>4^_ z;D)ZUZ+5D}%<{c+eKToFX?clCyaY!%08}jGy%P?dV*maAb$;G~H}gQUp0o~Oxeh~x z_79<V<C7?WK3WP?KvZ<dMUQ2b0e+i3uZVo_K`RQV7zLtYF{u&|1fAWuuwrW$kr%qq zZ9i5QwF+;$Smb5ya++#0DIi(SgKwF7`eEussJ-?7wSBXqR3OdGKJdvPwlY}8RwY4` zZ$(W}a?({dgI~<;fAd)9*G&WnwL`GHJRKnX!0TFs+t}82oldG`2%VI~?9HVA{R{iw zms5ZDI(r>y)W~JqQYy6yfm-W5r-UA7KLI#b`%1+dA#J*Wp8re#tiGoyU_p&RzdEBy z*YcZ|iYZ{bm#XTl;tC2bYg!rBHmuGzRbmC#7oHN8PKmIA9PLh5GDo-0w?D&{pVwL0 zzW?PVAB_(<VINfv)?rsgnnr$t)&G)7_RPsrU`Af_Ombd%&@+W;fuIUf?X?%R%yS_w z0l2DCbX(3AUCJWWro5ymQ*?D~EwMsHlBqEWu-x-(iK}VO<f{Z((!5jAG1Tr~K@mc1 zPeUmm=AD*uOL-Qz^?%}gXc<uJb#LT{etv%Eg7=-{QUDMBprW%OS588X190alivZ=l z6&mMMyms|bV?rF#a|xZbY;F(T6k9w_&ifw>DK`^h_?XToUU7Yuz0}sb)5S<hQ&Osl zWU-C6W;Jb>u63ST`>D%8yoI0@93#ru9C<0_vDFdfZs*4`1bq6#_oxF#6$sB=>w*1$ zVD8_ibol7FnKL_v8Pan{qVd1tD&AumDXj^w30I{V05MoY1ii=1kN^|#>=9}BIAor& z9k*wnoEELpEAY{Y)8t-(hfCk#=#dF~;)GdR86#rof-k7ytOzrtpD_f+LY8~eIUAxo z*rkFu-HK?tNC=PIRL0#<09uf0oPZ)v97VB|#44>l@nJ|IS~MnEd|6DD6~Mk2MtplH zq`GDi$)4D+dCQApOd3vII8pJ;JMoAdKX(^bhAGm;F;)a+J{o|)1Cl0lw}7B?BFSqe z?0s7l)7zE-Md#Hx{zu&l7JF<Se3J>yVSfq+x$fB7hZ=BDs~uo4PB}EG?Tu6e+7v!9 zLCb^@qR-KrlVjA6f=X<}EQ`h>&8U+=-6QB|)bS2lEuT59MEi%@&_E`+j31Fbh9>S5 zASU-%#DaoYPh$*uLX1*F3!n|lF#MzLox*4DOBs;fY9<JznT`Dmm+7bRx7#|t@?CSX zGfv(9`7N#VEwrBMB7?Q@QnS1=;?vSHZ&ZP(&H9}f!-yjR1zkJ?m?BL(=_f?zQZ23O zu%T#x#7^m1?5VS-L9t2=cQxX~LuP;_X^13T9MJp6fm@i%$mR=2ODtMyUL=_i9~NO; zp1<wRJhbd>dYj!+$<L3}x;JbiL+g=Y2N^HWr389ZfIg)#pdt*Z1S2ZLm?|)#YH<#f z#H$De{DczzpVL#!vA5|-W@Jh{OyE-j0Tm#m6e21@OeILD3@KG0qpDUBRPcb>6KFqB ztHEoR;4H+eGM8$A=r-2rdg&ZM-+(t<i5pUtHBMzI?SILIi`wIe^E8Wo*t#d)$m9~8 z`Xu=k@KR^C#;zrqAe(3k)Su=;_ZPJOaGJNWkypO+&~O7(=ykRTSM`_3aEo%SGTf2( z5IJrczDFi*bO+_M31R7Oxto6W(o2LJsj6|f*kR{!xcrbu96;!j>LHOer^-ju)Cf?e z1LO^kS(JQSQn8da_;#N6<)`i^*(`eMCkcx~Z|lKcg-BtJPf@x+%GrsBx=60@n-GSH zP+**BERl|C@K6uc%x6V`9*hR*;)W6`>`2s=B&{{zXh@Bx(T(_9qQ<i}XPY!wrK=(_ z&p4^+D&%Q?!zl+{NT(QZu%y~33FjiHhy~E0K=c?tKTR@1L3JcNb0sR#Dy!Z$0Y%u; zl4cg${R}KSt8OV)yu+m^^9vt{xccPbQ*=!;Rd*IHLQo>tv^#UCe3={HepH%r>5Wd7 zz;o26`|y_w9*lAMm4Zi0-li%rYfFbT4=GDF@Z{A}MuJ)ly9E_AzQOWy`&yBeg4*IZ zA^H-CCSV=&ft741?ek9U_2kz9Q8A!5I<=e>Tc(>$ZW^5#)Er=5)Rt;fH|bk)Yvk=B z0}fi^HtxAoaPPw1eL=Ssl;~3U#L6U8FN$P(Z)Z4<QJesqCNXKi3L;|DfD;0niAw`s z5D}jSf)H3wLK=vIh{QCIguq6U(m)nOB&UHQ1h$Zp2C5(;H4QW&uz|ER&;=3cX=V?_ zlmIm!N2Gr#moO0(W)p@qM1v(M=72RI!WIzqJrNC#r1XX}Ai))o;0{ReOp)OY$nXis z@D0d=e#J??DPKTo_BEJ0`@uSC-~97R3!HFDI&@mW38rq6S}hHIGyOj}4y7M3rt3F4 z&o!#jO_pJnB^1{1qG_DUw69{CX6m^N0dFVHp3iOIGFOqb&Eyg0akN0#$mUE_dRXY< zGKqgRql>o<XOqgY-odstr&gc97;x)0goe=I01XnBLGP6sJFZ!DA)||6OSw5D){>A= z)kaI0neoJF2`To3xZ=rXvxx$rv^#{r(A}CY60pd~_(hN_4+!T0_rtKhj#xN<tD){b z*qzh}VLcCo?tY<1NX}<1t65^&?qkY)D8l3FNcCSiO5fHp^xc+NqZ-D_YDim3r-wp> zJAy|n4jd7182glft1>ofHPMAZ6NwW+sadAj6-Pj^6H`iN0>TqMktsRlf!cW(f$%^{ zhq}^iedN^82{1rrlQkZ&F*mx)4J6#B6ajx^euO@b2c^5^r!vJWCNXNe)Ig~>>(B!} zm0%y`a`SbxABBeNh&5isuFz>HNz(Ym9d*7Sc*B@@Z$f+2L&6nhuvO-{D02|Nm9!QN zI<?(^Yh;qb4x@5$PlT*C#(gc1zS_G3w#>^|tNbu7#v{JsL`bU9F^3}7&F^<Wp4fWC zs&v!3O-2T(Z7ShBNy8cNQbso$S+6UreYK^0y7;^l*eyDT#MT1VJg{<O_MY7<Lxr*s zx~SEx+qLhvvcZ}uBNny7NI9<j2c@uMwUlXdj4ftVoifw288froIRlx*+qRm-T8M() z^_Y<ixOjA35Z8_(-(h3apI`HW?gCcyIHp|U^g4F;3ZHk(03)TLe_dx$Iqs~FS~mRw zVfWjrs0B4q2(6`ahsJB}hFaZK#9m5k+h53RCp<*x%y}O#=V|Dc!4i+Ouv$GXjQ)Tx znQMKjD=p#l0EGaw<si<kMEMr+t*9NxPLuC8A>7Vt7HVH0WixL7mW6f|ARI<GeOf~s z-@$6&KBYG87XI2>GeO*}+|RkMW6{1HPf?mI2S*d<N0@}fw2CF$*cG(G**0mB?avK8 z-$QY2=&4<%^BB4Q@!;xavnDwGX(i>6yQS+-kqXNJINH-W3QoYXU73V6dxD!k;@YCx zξ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 KZqM2T0002O@mFpD diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.ttf index 37faa0f9fe41ddb1c9a15725f8ad4856599193a1..f0aff83efb32936ad31565206b00af3c90d6fb2a 100644 GIT binary patch delta 1428 zcmah}T}&KR6h8Ofnc1D$KlXpvUE1YuDJ;Tvm)&7kx}kzqY_&xDP*jvHKMRqCO(6y( zae31kjcKo~jqxYt!PK8L;?`)4Q5&`CgC-WECN{kE$p;l`tVUD8Gwh<EO`PQ3`<?H6 z=bm%sOy-xN7yAo90Kf|Kz+m9ueXY^146g_9w;?+)n9JlF>^*L@p93Jm;G@$)<nh_{ z7H;N|d^Y#B>&hxX;52~g`D|t?k9-9{3+lm`9iJU}meW4OKLDs_M~5>*>XB2Q0r*tp z5~HKTg^a}MH<$o}pl&obJ(KU1Cs5Ff_J`w>gPFqF*{1+1&!c@Lmzl}K7v?#%^#s9* zOm6tWzPSJv^Z|fyI6pZxefrv0Zvfol!h#>qA05tL{qoKf`Xi_>0EH-?m#7=tHGuIQ zX>si`v+V+@=piH$b|zv`PmC`MA;v6}i{h*Q_{gTO*05&Un=bkH7Hg$dDkkxQCa%g= zk|!38CSp7(Ytq<wWa2J?Ps#iFNAk3{4mHkFlBn11a(M!h<Z`?D>xyrL4%uvqTpiX@ zUFoir7Os|+e-nVUA78&lUZ7J@2R&GOd&o(sUh~%Lq}rN>cn1x22#L0~xVFuQshW2G zPn!SaRrreX3GHa*7R!#}k|{|_IJHS-Ef=;^e|tW*rFG8<`<qmh`8oR?RJHTp?6nSi zrBk@^-8m9H^H?);sCHT8&5o+72)-bz{(`)E6CrzrmPlxcm=@ib$&jN_5*VXafggAD zT4E>;fj+Y64vDWg8l75VKr~7QCQ*?PYMXzk!p+mF&#Wl)CrU+Xqzd74Y7>=|;)L@N z;tfIyZU^Pvu064O7h#cbdBQ8MZpJDE9(T_NgAj%|q)}(<G~d>#B_gd&H7+7<5&QXy zyKy7H=Q)M}EpRLBhdw>v(B0kX*i8bKJ$p6+0^UV?4Ek}FJ@F9evn)5mv;^UHHRy}C zX<7`ooA(x06q1r0m5MkksUD?MBTThfy^Ls`ibplfh=%R0*GtOURf##3bW$+;Rg;uV zF^kJ-WvQfOQvGHjnO01|FREEl|0_iJ%azGO3w?mTM9<S@Cb4_iNwy?Z2svRvSP~n> z6H>q7nDL<T3F9T%Bag{*@-y-)@}hh}{!yt^o-~2!l)2h`2=CJG!*%j{WB0?hj_Y7z z-y;K8T3`Eh^ZfJkwFOaS_o8jYkG=H#!SDCIPeJ1~{(7+$C_Tdu_|vpW;!pc`?$lKb zmkW12g9`*$#j_oPh*ZAhPjDrW;`;*ad_IsWep=OFF350HmkTlq7jTs@0S{UwO!0^K zUKumk2N%m&fDkd4u?RjAEn{g5Z=oaPK$*8f8+#kNU=s2$i&@7Y3!}x~o4;lJawJG1 U{O8C3KfL>ff>jV8>+4|q3($fXu>b%7 delta 2284 zcma)7ZERcB8Gg^XANIX={Mp!!?JOrvN$Vzd9NV!QD|MTu^~#!2+MueSj`rf*#%>+Q zvfU;HG$Rd7DnF)aN82bvXoFF8S~Y1zi~<q@K@mv&C?F8yvqF=YL>WvQ(tglp@AbW* z70nNhbbX%peV_O9oO}J~PyRdG1_A&scmM=AvUg@AHFeLOsEO=G?UB;FR*(GniKkIM z2SCH6lP!jNT(J-F$9c3qH~-GM555BEeFebr+c~XSN4*CiRmI&tS3Py~U%Lv^h_3*I z&X;v<)?aRY4iILj%a+S}Ta!6`9}{dq#fI{HYw2V_c@hZ+QGTPkP|_aS_RF6F^jtu> zJg+U);ga({lpjW!)wFqi_v@Fjz}P<l<j?90&DQf5FFXj4yaYfVtvB@gr<Zo;(S8W| zZJ?0C{WaQ+?b^WpwEWj=ZwjuBATM_lk{t49)2Sf;SRABX61PcbuUm*^8IZ3zCJP<w z<nl)OD=OvCc@vK+z2drbD#y1eIpLj;-28rJ4}VoTkqV*NX2wnh10I_^uzus%1Rb0Z zvzg4;uS6yhBKW)lA#~R5rdNMYd0UOfLNJQuv9OI$qpUStbEcBNrEZQGZf>`#^bh6o zQ-!H~Zm3^Tt!Qz_%XDjkUv~E`d!1W|iGRQ=UC~wb*{&CFR<AOaFS`$QtOf6Rs*3!I z_lGp-<72)7pD*MWzj^;JB=v`ThXr5AE2{jMuQ!swj$KB_L8I3}uP2wy=CbL|0RQNV zi9~VQ`P;tRU2!C?zdrV)Kh{-LJ-rTrQ1=6O`~1A>4@>kPYDD6ngf=g~;6F|ReJ~C? zL49V&L~4Vd2+1MyV77Pfq;5N}1%mvs?n+-DY=#VMMW%bZb8=gDY$Oru_Y>(lJ;HYc zVy4S!q{kr-KZ1h>eP()UYwBitD!6qu!|C87zBnAf^VySIZ=R2FZLogDpUI`iGP!Jy z9|^IWyBT<*Z%MM*WnYgfosvTVb$gBoL60jaklc1P@NKXC*Ro;nctLeYvfx(><DxSX za>(O(!R7b6g#5Vd;EA5OHpROPWEf_x+boF$@VbnSrMuJk%$f_|-0#UVJ_Uf$jCk@g z0X#z^7KXtzXi39cAayuKL=QjLGt`dLyXf!eQ}hEt6s83(ToPSkMSM)WD5+9YF4&IQ zllHRxPxh~sNo7XSl||*Waz?qR{98S&zUw&d_`=DY8Ru^2flda@^4v?8^~3IoufZYU zI}PyOQ)iUb{puUn9+yJGew6KISNyi{3oc<2aySNK6j(lYMQ)MOK<R^gOQb-*T;WTR zzKsH!j3?U317saaMo&=?;eWX2fguX>zeTc!%aur;etDG-Mz@HbG!U*ubG#mvGDJ2< zfgV7NDRgFQNY=ubMjB&@=B#9N9ujPJ1@~S-1&0wVfZxLaCbw3PxjPLi?Q$*uB0B19 z2Z+lo7LEJxG0HW59VnTY;z#U|g#{RZl7&U^!_O@&K^L5{uzZ8Qi=^SKrFTJ?{N2Ky z)%a~p=ItcFNr}c8JWl>&Obs!C0R6RvDY)pLEi6EhK5JnS2I-20B?t?*SXjP6-$joK z+bq2cGSZV4_F(+>Y67p3U}~X$s!^FMx7emqjHQyv@pvjZnq)imW@WC%W=a*kR?>&r zt+i4@{VsVlW01G7J!P%NCQI6^K7VSDc87lO@J!`ieRRJ*ccQ8_iVL+?aiKA%vs5C< z@@;klC2n!nP#w@4&B{WJB@@X+=DV4#GKbf!lWm$<TwF}dYpwDzZ7G4N3$g39x2;as zD&F!uj{Rt6JEr%rx>#wI*?zsLH%{ua%xH<-hX0Z`_L5N5JIa-&X`ER&+FH~aIzvUZ zQqpTpbURU-)f;WrD(h_K)@io4uGdWVw8<D|t4)t4MiXW<%b95>wMtdHr>e6~DH<zI z?qgajua;Y_dVXZ2S!z`3t!AQGsTwtp>@7~OZ4nLAaw7Jb;9PynR(=L4d_}rRnrGuj iWWq>4S<inH|AyI4)GE7*#huo^%i4>0Q_0E-xc?7)H0;s< diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff index 0832f7a468852ced3080993f4a826e8ef608befe..0358ee4a3eb557fc65845240c3547b9a6bc17a7c 100644 GIT binary patch delta 4748 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 S79SC({T=hiz(S(|^8W$1!?OPX delta 5155 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size1-Regular.woff2 index 483e7b66e0f49b65dcc2110d44886220bb2c3e51..f951ed01694dd1354a826726f73f0e388798af1d 100644 GIT binary patch literal 5332 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 literal 5592 zcmV;}6({O<Pew8T0RR9102SB(4gdfE05YHe02P4%0RR9100000000000000000000 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.ttf index cf326236c0e940c533606031140a116d7ab707ec..4f72f167953526b7d33051bd8cf0c2cfcbab5718 100644 GIT binary patch delta 767 zcmZ8fT}V?=9RHnjx4F5yP3=y1-Ov%bjTIA2)M7-@hXzSe5JsWiY#-957bkw;$0Q<p zs0TY_1R>Ew&>+x_z^5S4@~sG}2kWJW5Gv?JdWr0Ra}(*p|NK7A@1FlT_uSjPYZtO$ z0GybGguXN9o0?B(_cj5~6uEu<X-!|a^|F)nC(<kZqa%JodK#B$kmGtH{a#uB38;?% z`~8HL(aEm>_8lR#CQ=jeQ^R+D5&sTU`;#&4s@gTb3e?P!*P2YmvYKs*%}|4GG8&TU zk@3+V><tBs1`Da7ey!)h#Y)oqNuNt=<2qL5IBA)*e^5)uE?=6gqYbS9rfz*GGon9v zm;%B+fHmmDG5yQi&O<ccPWdc2nhDpqn~qxs>vPM}pBgK#^NI@DFRsZd_w5xg<T|0- zawRufu9oOdptY3SDF0TP+{qm*IseCZ-clS(M&`9+&{(I<Il;Ydk#}ae+gk{_j&ts` z7t)n(#(j#oQPs^Xh0j%HUZ%7w^OF?^L~f6-V0M3H!Je_{xtnv-V?7;;QeVcH-K!`a zyG;57blQ-ZsYwNh7=r3qz?|xJMK@uWHpszx(^KPy{-IDjiyUp@ou|<p1eY@6x92bq zTSQc?ujdq!s1zEFwG^1JNEm{jm{nX?10tt}#RoNXw>Dg8@do9r4Z}v-WTV_;s%_3t zO=_ES`umoPT*67bDsmG7OfGUWYFTrUTXy*l9%rYEz7s7{9>*{Q9TU`b00|@u1L2R7 XI2!S@khl^#E0!a9EA5?aZNc>y^o^y$ delta 1715 zcma)6ZA@EL7=F*`7xar#F3_?v4$9XGD{aAj5W<{7=NuWbE{v!PyK67)b?xm<dx7F4 zoo3k&vn*R~obInte@tT>jYgMf{H198p>f8q_{SKX(PSpe68|`SZ+nV_@WYebbDsBk zpZDwJv}-dL=Sn~TzzyfX1gECrgVBl8Pu&FY{f+FYL{?N^{I>NxfPWT%{E%4G81lG! zCvkJmtEuca!jFFe>=*`cyqppXD)JtHL5zXARAzbp?GL{;@SgxJ7t@lM6yn<N0Ie7U zd(vsCB-TGiUciF4kmyQhwc^TW)QWZ=+HYlY2~qwkcNPO)L3=hU7FAet&ZAvKn<-*e zdi?WW-ou8lLF;d7uAtpipX>$*J&X-MqUI&_=Pw@{0qFSx^(CMX#dD1|<G41cd)Ip7 zerp|V59l5z)6Y2lw7paR$hlKj>#x_?Q9H6*1bb?_+x9<d&JErE8ncm)%QvC~*9}AS zsY@~P>~$~GfS|9s3seY{dmF|nZLpWKjm?Da^y=rmv&32c$!noD@2L0cS<jGuy(v(( zH2+FUCyOgrE?ikDo;)N79X3K7I|Sj-CK7O7Tx0-}d|r#001fv?9vW&M!Y^4}|6gZ3 z7Qk#qKC4hBK&r_w57t3fzwT|#1RY(DeU4a#K(aJ`_ugE?=sj?lZX4m>tzN6Io%(C7 z@3_q;U@talG>Xaf8DF=hAE@boe$F>W@2u+|`#O3}=rX=QB`d%!w2XoQFvI(J27w{6 z>-T*<Mo5=GNbmfkANBW{J^euR=lvb}Wxs2f;M+37j75ywsoYS-tZwKu${5RRsT@`w z>@?Zx>Jhh_?BL*>2b0=`rbcM4NO2RYz*!5TE_eB=KjJL45cfvqX%tnvAmD&$jwwFL zr#UvkgOK3Z3{7x>V+*+88pqa6yo(IM8=QAT8~L7NPc455OEy*t;JulR`+t?(HSQ2G zffo7_#}wT3O^!_vqaSc=h90`ku?5;p-5gst@h&=VI>3213|n63*n{~?wE~Ssfk$)d za$ZiQHP)Bd#iHTx{@u}VB+SO8f}B!VJRwU;LK<L)l|;zCRU8>M#QWHhw5YIy2{9>U zmyd|YrP;Z-{Hzo`CZ!fKVm_8rv{){ml2|kpW+NrGNwS-3wxMREd_m4BEF21lhPPJc zZ4PYPC+izsT3QNaMJ@e|SPWt5v0eZ5UgDE(*F29rgY$^hajMY+_9a<Mvtv?0$}dVu zW{kv+;(y-eSweRE@w8m1I^(%{ZAr{a42g`Kkdy+3EhtGTUt(HXV)4V1Y)X}ss(P}j z7+|%bBcVvBnvDlDaZ!{r;^~aUDy@htc5s@B+K4@^Y3j(}U?Gv0Rjm*z$Qh&O!Kv8f z_8zn0(l7UPmQVD2V$uV_PSUTB1)s1IAMukm{ZerC0o#HiPsC#5{G8xttnzCi>+8_) EFJK^q7ytkO diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff index 14f6485abb4e1483c0adf14e93c7d838efdcebfc..8a053d23ae37b5b78b68ee2fa436e4c3600eacd9 100644 GIT binary patch delta 4376 zcmY+HcQhPf+s0>=AbO2%1&fH@J5hopYV@|+Dp42F4bfJj1yQ1l9xX&fqPHb#h+Yz% zAVgW6ck{j9_s92~^PA_nuDPDM?>T4YoS7n#O99YNM_nC&0N8OS7$EyM^J)B7|6Bk6 zp<^H@0sv%itgDR$u4eP**v`$y6YJGtbt0DTTvUgK-E$u(0MLqI^=&L9SOA2lqZ<H_ zD**t08~_lfPteTmJKA`I*v)r*u;&T?7Yaw$00aO)RI#Bs0HA|vBI8e-9Bk|XfHW1G zk@yG0le8WutcfkGgw<?VIEjKGp-yf-{@C0gRwJ?GKHr6mxO&)ObEHaGt^W_JOjAlX z8-HwFQYZj`0QP{ThXmnn<K}?vS_xYmdnb4%7Un^$o*v%V=IBPTnF6fO=~<HP>WOr~ zZl?KH#0d+yJgOn%Kf7j(??2Z^HMw)!b*7Hr9RAWl!#;+3K=(@#FTOx=mxv;dH~9d1 za6cn+Tn>RitlO=BH3{L62A#*zk56Ka>kmgRMSt#)sbt*k63XMgr@|2aH}2rRP|^E| zWPWLn{-$L&rk84klYjU+zcRoRCWbi{b|A3+eU4BZ%c^`r>G8p=HGOf51~EfQ|M1f0 zicK3!j)mZZC_k}uEyobP{zv6UbE2$?XXfS4Q3o3eeseLQ*Y$~E;@~#}i6q|nXV$Xd zUh5f#L5G08yMJOh!kAtAwihP>w|<35TFDj}4kgmG-lE*-?i(bp&H-WGp~je0G7Uxh zjrsUWf3tkfLH$>`%827vd7<6c-*~pe+sF44&Mq*+F$*UWrIwYvo8#|LT<mlsQYM?E z231mvLO5+o98>!Do`DSusf9)BD{T+e3S&oT%24%SLRu)9Be4|I{7hZ(`u_QuB|3>; zxi;6-t-!*UnJWxw<(WC)a0pA0<TKKnqCY5OeGs+)DCgysuFlRL>%CqB`_5k64Jly| zk964()`{oP^Gy0i4{d(nx8NHmzYuuN@Cp?FmJ_2PoobFkf=>jf4%U+FpHq#8q}?-= z3)Jjq|K2oe`pB5ps+~iFhL&xZi||Vc-*EA7f3%8$W<omW4XOhNSc=?Hf9=o{ZyL@4 z+%MxZD-8;U<OV)|r-)LaIU1r9Jhy(^X$<WM?K&Er4b9zM;Ajlq)w34!|D+aG7Gvf} zVAuMPv9wi83ADNXk)eJX*8M%-YUd7{^Hz%hP-|}#r{C(xru6H}Vp>edm72VUv~x0A zWz%a#^%KoD-TQBmYrZF=qQ%!f$z?xODrkKacNX7I1n1<RS4HHa@wv)N?Yts!3+Bx* z`oEu`M~)$POy|FIXhL!wu3Vj86XIR6R1M`Q>{Vk>Q((cZZZ)n;bY0d9=2C_U<=v&A zNa=}5o`Ey21k!sU1Cc?jlegYS_x^>{q}QohyPho(=zkc|P&4`TRWUQoy!E^c&Ob@? zsD%U<oyXx2sOZ2zdUaI0$<1FlQ(3()jb02k`X!7oO^Mi3oWo1>R<NZfC{<8q%L*J7 zLM7g3lL8+FQjca&rH~HivJ3_`OWP;1Z*N(yDwj|<{H{w8G}7~yu79cR0_A^O{mw=5 z)qWp)!mG%n1i+_1s_E<#t!1cpN8$Jv9v#9px%dq$g|>QGQ>%%9-}{9OA*+x)#f&A* z2u9z!&K1%q^Eobd<ZoSNJqG$$Ng`d^7>4W5BX;2HwhreXOkCTEY&Q>^t4S}nn-L|` z@;i>3L7A|R0=t1#rfF|^-?<q|b3BBFWG1*ZA=TAzXIxiBzLUjXto*=q#QIs^M;NJL z%>I@kz@;56hv|XV8qAm3?d_WF6kh9Eed$-3ky#JtJy}i?IrO9tWBNvR6=H9Zb1=43 zr?i61JN;o!o!iqVIuB}Q<>%>C^Aa}k8#@g}806J_NPMrHzHP=;6Xlz1x%9~2k0VTf zeh13!^td$=q1-AKk?deUBgV^8gb(4rzjKOgydu3ovz{_S%H%Kk{k<{Y3bIC?zQM^6 zuEO-rGV$mjX9mudB26W=8}jf1<1E}s9GgHT(Zb=^Jf|+{hmln+5EO;GMY_|5^@%=I z73$jRxdHW|GC6O;uNB|y_6TxgW9fRCnqgv)UncuXQy@lLS28vmNgZo<R&df+gc+!X zUJx0F`U+)ZqV1x3$EHT=tamqNaBVP|OBL<BY%n()@jar_FXo6JGD`U{=8>0V&p^AH zg1u!rVR@9H5%VNXho;@o8aMM+fnjB|N%uA_`Lp?0*WQTHSlbLiX<Lu`)Dl$bI7ZSl zUv@;E?A6A_*&L5PeV~)hOY1B&_}T|%pwTnQto7`P+pg$bQ0!r2niHvRMVP&O(5f>P z>_h$VXP*yrITJa9CGV;rX@Mxh#WirC)o1+CGsTJ-0>{0KN!e1qOij`5zu_03x4S~; zBX*?gE0e%c@;{0yI7C+$XRoeXnhj$7mbzA&!3@fulE{=U`73l2sDMw_d+ld?ow)YW z+>uUH&>mw`?fUccpX~4-duv)ni^OoQPZc(fzeZFOCmRpt1XuBpTJ(@chXjx&L3&QI z1$8@1E5M47qN9`iN1(_Ui{)XKjLew1<Euq)v)QU<HF+@gqS~hZUDtH9t>ec=bMAK= zl*^Qz;-7qv&H}7V^C1Pon^K$c(kqpUGC{?vu%4}~QD^PEkoDz&1<^AJDW9IIdM&F{ z6`Yzz&_z3|@pN!zAtX2}WDb1fkz>G}+&U!nF?;-@np#LnXf+r9>LW8jCZ}cvUwdhE zjFl8cMNLGd^3UyRR;`u+WFvb!;fkD5hD(dvsQ9EtSvl~`<AbCDZ?PB<r9;{FnuOw% z1QHa)`R3QmcHZ1DjFBe%7|F==YRnPj&|ObtkKfDgnAlS%5Joe-aRDEQbF#X>m}8&L zhlNd#$ELaxQeBAMK1xPWo+vgZwnTLsP=?<gxsFy}Ni|Rl#BogBQp(Q%$~t+nG0Z?@ zlP`Qw!rXa8PyRL7c68|O@^`IkCO?uYQcplBWd@HJdVTI2arnt{7XqiA;lvNyB#qhR zi5#wOwRP^w#IOh5;{&(f4tB;Y*)7NajJ=bvOR=jEM8@|_CLxqeVejHc0MoYI(HA+N zoK5Jxgc~X8NV<g5Z061wSq+#BD%L7Ix+F=}M0>J|@ol4Tonh<cmZXP5&5+c_+W2G{ zGti>2YT_{R;R06qBC#We<^6+f`H9?RbBW-q{GPLsodutOu1wIAPyrq1_ZID?(~+|y zCOYkW%^Y{J9fDvo*rO__7ZCr>g;>pI#_2)^sb0^457O6;D%0No&Xm|rba{~ZIAE|2 z)C(fMadVYqc_LeTa!~M;x%eq-amAX(=ihbQWj|&FAKtB4*H`mv-f$pV<U7X|(l@Dc z=HQ^%#}A23muCgT{5o@+6g+fkcA~aJEz745chz19mJLS9qrAw>mXC&IY)>tp)x$bf zwIbshM^MVbJhI&sadFL#k@?F>z#bDz2peI;;e$e8?*(O8V~4PEDp&2r?l>+cX@Q)o zOLzVlgWPN1afKs<R7_^pG0*8mbO*;Y-R$L8H`VQ0IzdCe`B<%WvCI^i7_FwrXytO- zCO607e!GLZr)Zy_-=8Qh%GeJ#udU^I%)e&(u*cAwXl_lkabBstyO3@vC*R=t>#uP% zQ}VY@4T8aHkLI??vmJjL3W%8*DU5Hin}o9K27f2_2)N2+VQb!W%3dk7{#teIwIv5X zw#>3_v>gKZYFbVkAP>4R!;-GEtrzi7@{=ibVmjV+;+|mK5utfbFe|hCv7)yGb@mn; zYqmnwy9JH@_A4$l2a@a|YQ^u?poP_N(SXBvH+4%dxuIIy0^+t-W}F2#exf3}qpN5r zcqF4k8PA=hUQTr%*jhf0+5NghutSi2LYm$hZvk!u?`Ij`l@(Sz*&r-mczjUV2v@xN zkjkdP5k5;EMnS%C6ESYAcyc#6?{pfP0^7)&j*dLWlxi=PrffOT2{SQ=8s$v<^fUX= zb2@M-6{|NwLOWIM(y;pUPjHBmm+au}jK2K#P4~`Jy)c)Oaz_S3uQ!v2n}WrUyY~WC ziif}r_v=+|#hKvl>nJz2C1U3Ww*vaax`$3<#E&FGsQOOfu6#F5Bi`^m!6<>xmYId~ z&-MDw56|$%-g17$YXDz9sV)lvrn^M7CNT>&pC!gJWFKQL{-(=I2v5pjM6ZeSHg;cy zXDnX=?BQpH{X+Ko4hvzj7iUHs?BGM+sJ|dl#qa%uBH6ar4u+W&_tU*iPpT{)IHVa0 zT#?c;C=B&l%*2~JY3OJ~!^@e%iD67Q%&t%QJCdjZQSLLReyQ#khQl=3#A57B$w1by zX5fmK$3gZJs77>lK1wElzxuL+k<$^@r<bDosIIxN?4C@nv&i8ZLw9zEkyi0Rs+SU* z6UX_MK+=nj8HcaQ2iYdxF2)npu%LbgF_RS9VsIkh!lQYo_iCf+w=s>1k}Xv!nMfNh zPP`Wj_ICjL_0N-{P3j6_7yks7Dj2@2HM!g|K#aSIb$~g+@{|9YFR3pJ37YYBv6>LT z`R4+F|E%3<54;<|i)$qzQIfzl;OU}+8X+bTweaSSeLy1%*BMeWL$U@X(eJukzVTSU z1GNMr!%beSu|?n$)(hAO5xm?m65SHYsGr7SDwGj1vs9L$8MXwWAa38XkH&$L*@X<l zAze^kl69a0%})D2Md9{vIO%CUiv8u#a^ij)BSv0{@@YO9kW7CI@~<hltpFk=i|iiw zaXN$c+FVHW!!02+uaM9YTDYr$M@R?<nCT^h{r6IEIF2m>N(V`fgTIZk!A+Wk>jHIB zVMVYA1(o|M;wt=II3;$E{W3D&;JqnIJxV3x^M2p<!*<N}yY0nIUO1#oAGb_|QIji$ zN>R7?(-_2o?D&ou3B{WmwwpG=!<+LP@tcdAldF-l?dz#c!9DqsuWf%?zc2+DA4RW; zuRYV6q6v3rrviX$O#$-y8gkrQpe-E!%bv#;j)2=Q;nm%N2uBX}L2s=pPd_FJCXt1@ zLbrN7NxmU$bnRBd>r5Gn=;QNUB{;pTO2pLJc(M{ZA_J)N#p|YD<DqQIMy_am&E01g zY!HYq@fDewZK1hiQgQd{3cIzX&5TWHef5U!RmCwP&#OO&?yJ)xhJGi41%zm470n6$ zM$S_2o(@gV><h`)mR-vDRt^c9KT!eE(+bjyCdRY`T=4t)ZRD-M&rQ0P%D`V`!=J}p zDxis-bY@)QJ5`iAZ`DU-a#!Sr{%$A?Fx6M5uJ+=N`#9n4UIvw>xBdK6^7nq38(&#r zGvoe-zwB+Y>*mPesishCP*}0=-~<VK1M(>$CeM-UCJVtXUfiqd)JU1+Qkk=zr!R!? zQI4n|dxp6Y`uU%RAkoU|;gasH69g_#JUfqad{aOEwq)67eSa6ZC(Jf)*M9cUAc4mT zEfb_a)&IVypX%hL7j@Qtch+)+HmRf-!JR`J!*+HfORp?*HB!$c5O=C?Eh(W~@l<1o zrE0sP6#GQEeQPMdQKG;b&D{GlhO<QU$L!XhKeVHGX=Bu45gvX0t>P9Cpf;=h*O(XZ z%VwK##J}TCCkpzK1liol$YgbR%X`r_nl`O@MV{@nk6Ym|swQ|vR`Il7F!V5{?Q-Sj z>a&6Iy%KFR2iAwj3P$A?JD-Tr3BqPM;zYu{CBv}PGBu9b6r%vOJbLOCZh77s|6Ft` aRfCgi>E<GCbeQy?e=j2hfZW^w<o^ND%OKwX delta 4803 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size2-Regular.woff2 index 5ff7060676d81f040dafd77ac0ac9e68eef20767..181d9625a796eea012f0ebe09f720ed3eaaeab39 100644 GIT binary patch literal 5080 zcmV;}6DRC<Pew8T0RR91029~%4gdfE04rnw026@#0RR9100000000000000000000 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 literal 5392 zcmV+r74PbIPew8T0RR9102L4b4gdfE057Nj02H_Y0RR9100000000000000000000 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.ttf index ff7e2b90106baf6920ef84d26890d21617a4730a..56d2dc6c5d2d2d620951db50de45424415b704f9 100644 GIT binary patch delta 682 zcmYjPO=uHA6#jNL+3aT1)JhUdTFLs?s0SmfM3G_?sY(e{NDrd6W{vp~60@{HQeuhV zQLx~MUOb3+5qhb?(B7nnqR>MxQlTkSy`<nlilQQMecMLpz?=DgX6L<mv$L`9(JBN0 zUfhF-<WM4_56tlyKuMCCOcf0C@bJ(T;%|vRPTeVKw9*LVY4T*uY~h1%<s0B02Gpln zW85Tt2hd~tayCDaxx3g~C;Sy~-N>bloBqis@5y>eS~QnSR}D!LHYh<q3Hx(}Qu)N( zAHs5j_-MYEG6Ii$pNQKB>jk51Vp{!8{1S2Pwoyo58>whiP#JJsHjCq>O61r85L_bv znK_m=KQCQ81^B4|RKcLr`i}YOx-Q6Xq?x}lfpw|17&|MnbQe!ZXZXBxieN1vJs``= z*IY#xHrv$A=jC`G9bos2B0A`)U+?Vy0aa|0f|batU;kHrQZX4ud0jc++y%xq_?mK> zh1a>}4pkZL5-EH%+h_UUpceposdpkg&~OM5jG%%^JZB56A&Ps0`_%BdWzjAT2g$v< z&1K}u;ihF-U#y0;Y)xBJ)<Y}by3o>F9jiZA-5-x^=An=6!57^-YfUxmsVW$=OK>Qp zzM$B`0s_RgFr%Miwv9!c$3h!B&?k7>*omN^x3RQM?_e1r-qyW1F22S&6k%e5vfe@# jx!UfYWl^=eLBqNao$pcoLN^bDj`DbDP^O{<x^m|~E$^2A delta 1676 zcma)6Z)jUp6hHUA<h6NevetD~(o(OT(^b1PX}eKNT~}O#+lpP6A>wq~>&tE4bIHpi zd2L#Uq#(#ZWFH<X^OLCChwX!Zf;z`O3Cchi`yx2p2k}d%s1==p=#1y)-DoIfc;UYL zJHK<z@0@erOK$DDI8gxt08v;01&+_82ZyFE9a#Yg-9YxZk=LDC=WAC1v~d7(-dJ=Q z^0@91kG6RyoBy)&>z@I_H*vq7)k_ZY?Ev?_hi7Xxw>*FO$VnCP4*)G!O|EC!Uvz&& z{Z8a|nI^C3s!D!G;vy3Fn|XKX(cqtNpgoOtE>|%0*omH3P)js4n%9>ccsKk9+LzI0 zww~wHU)=l{8)^ekSDix1oqanq1kig6{g<2~cfP&$_!z+5D`;1M0{Y+z-Gbw`K<kI< z`+rXmdY4w6ppy!n>-5s<9`DoOX@u3Z`ZBsA-Zw3U3dJlS1CWt<!2ki8csRLpc*`*E zjK2W&|6iQAbU-zsr&b9NUkhafFTCAw&{q>rZ?1LEL&|5$b!D~g#DMatj@!pJjsFH= z1@9i<s}Ig-jnli*>O|>Ja1=WhU1KG0EVM1y4U}H+GNIj>wVJ|eqwsX_yz&tPIDJ$R zx%I{B6@)EzPu&7|2QAT74+P*8p1t^%75r`(^ur)L3n$?Pc$0okZzxJ%Y-{+z@78MG zU!h*QcH4_-J%RRaAl{_5**mBO8ha-Y{4#{7SVUZ1{rc*r|3GJ>u|Tj+sq0l5YT{H{ zT0_l#Owl0R%rr;e3FB3E_${>EDV;{5)%{wst<puJ|4uTCiT+ds!Z0f_#qaGIi51ui zhQtBb3@=F>gb19GSZ(4XWEjp#J_<2%UE=nJeg#W*)C=HS3WU&li~K6y7-9ll^i_!| zMCk>I6-d!fBo4p>v?g&7V#+p&)h0ed=amV`M`0v*R^oQluQUpDhysrloaLgGHC?vd z=x0NT#3MU~63GPH%S%?)W@*FXw!sJ3KHG?E>w}XcB6yS?Fm;<v8hVE3mk;QN`BTTz z*7JP$5YH~;^kS-DyQxAk%h^yo!Nw}ADP)I?*?@YI7fV*bW{G$rKC-^DY;$14KH2v1 za=9GO>#q5nz7)sOyZis^y&@;wsCk)r0_V~Fas2E7t!%j_JH$)8xX3e1jKrS6KeXmq z;+l5Yv`W4+U6^;vdXY0Ea+bmE5~eNK8D6X~*W@g{Z<@_G-1eiV{fGh97&;kG#(g!J z%=AUw%IR}C&g!k`EHydHbazZMUDp{K94r|{%W+Hbl9dxZ56+~fH}(XCtNMM{s^VRX p-AB5;Ut$TBgh?BTczxab`&t%kYbur6E6*u;rs}^GQmetHe*oKla6te7 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff index d3626cef39b774137c67500ed0bdf3fc93391fdc..0ec99ad1a9fd2e810162e3cde1a1ef8a94cc1b40 100644 GIT binary patch delta 2444 zcmY+Gc{r5o8^<5p5MwDamSh|bLdP<;k@b{G$dKh^AA1RnNsKJ75|yltBukQsj!>tP zZ5;cSQL>M9?4cqKvSfa*&hPif@44R3^}P4@x$oz`-|Kp>=YED{-=Lu|JPrrg06c^= zfx!MO8S<~a|Nj32Z>y>S0CxbaTEP%Zt0;eY1$q!+jRxC6FzHHmcqgyW5HtV+Fn|{Z z2?KnIet`h+r~tr~2ms%Mevy$CKaVRA94rKjfakvm`2~dg0>E|(c2s~j_Kc(-d3(Xf z!y5oZJ?x{s&*7+yjtj5|uUo>lG>jYq!M1uKFoX>IeTQuu7&o1&9sPjIUa%hmP72`S zfrjWkk;y<0GMpC?008te7!6AJwt_qYec-C$V%U-a;5_f*8i6KWz7hg};QziZCqflt zN+kKf!Tgo*W*1<fscthp@^Go0SEgL&q0-y*cPd)u2GzZ-T2AHDmyn_b>#qYx-oj6* z`-g$y;<BhTgCEljSMwZ01^lT<C_jIoPxFhin7<_@>zhe~Nt3eb#j4{KA4$qxsIh!T z^UI1C2bTMdcY<g!d3_Uwvs&MxQIqd1(5d%vwfTQtE0PNDPI}_-8<J|QvlMX>yGvDE z**&#du1uw|R||)`32n?9g|9zyANi&v97#qD5U(x89(|c;`%)W2=bC;$2wlrFKbjf2 zN6VlwV+zvzAKLX&^>D>(3jI!^!($GY6m_Uu<^m>Wj>iU1jG4uT$q8!oh@XoqJ9qYP zT=Bz1nkR3<{1A_R7gH{qR=e3U%dJmzUgql<Ig=szhf0H2x`T-7OKFOOnNuOoDcaF- z$={};pMIu+Gww`6U?@VY20|@5wsC#?{QD|ntOH+}h;qp;xHynG&2U>Cn*A<ydP;cI zfnL<krQmyp-t8A^;n5NpSA<^wa=DFfuG9~o^g(H+ut7YY=i&J6SI^QVuRgoP|2cJS z)LMWvoZ1$hQ?7AO!HAI?`F7<-3FXicr5ca2mB#N@p#yVt!$yY(lj2Z31xIO9NN!#} zZ}ruJH<SjNVqdFS`z@r8o-3LiPBl-Ca;|Ip+%foGqVAWO=}&!OvNNK;XNVlKYg`J! z*tu5^j|KJBMdG8L3<y2F>2K_MBmY{bra3mf^Wzt8nW(;kahdV6GrbkznME8waz@6O z0If4uwpiGA!)?b?TeTZ1P9E1|{)nSXRj8eQvQRdr{CuxTrgHs4e<L|t2xUl;$zey8 zm1`TlmB;cSTP<vLO3o9HSN2X?3{u;@4_2W@NzVzkBt@*g)c8v3T^k}{t|f(r&9O>$ zsaiSvV6rsmfPQkOJ%hZ9X4kRdTvU>Dt2q(JfiYw}zMGJ0SqxbSAfJ<R8aB`x<E;t_ zb~Ni+iIhPpgWRhAlLl<y)A&<u6>(zJ>eP~knQ~*qr&5iD66U?>yEq`zf3(;NJH zGErVu)x2Pjs_z*6eYe|^q`PIgZL)+Ka-piM8br4okLc|vqBLPnt_jvz6D@dc)naD- zD!<2k&bZXN2DKdQt^Ts)N~_yR^l9jr-4Yww&K4hxBwY+9b)3>l2pQ+4s{EnslWRL% z#TB+Q)W-Z85?r=fh_!HgM7tN9T*Dat^+8$L^<|@l>ZM5c7XFpc?WL6%2U#5B#bzr` z*QqP%ae0>J(M1&R;fiV{pJM?_$zLhUgISrRjH9)eR-sp)))h|r8mt6<2o1$rq>O0= zS2@*>+&^zqC+8JoBdImx;Mk)q#ce#WgE?nZ!!aVUbH!*SY&U1@+k8Cv@}jiFFRiuY znzfF+o$FBN2gV7OH1c}rGWk)9UEDO)a8CJZaY1NZ&teizWa~?kfR@OGds$pGE{M}~ zf#llWHwE>C$>1h=xUU&8RYImrnLH(d?r3Td_2@=7Ss3&6iF1agRrH-~r3i&T7mLjB zthFF}626hY<6-m*y{*?K(u`tjX#BKN8NUvFBjUE>Hn+=h&l6a_b2hoVjFOGbO5=Pz zW|zElN}hklGueZSHsACO?^<Jj57*0olDxd0dkd0js^4rfHqA5epOF6ezHoG+_k-kn zrgTcRZpxbebYarC!nM3ZwfJ?zi-lvzw(zIX%6ika+y;Y;PdiecK^Xr^$z$^V@#pk4 z@QDz>5CeCo|Bl+Jzl~azce^#nOA~#8mzmR`ZRU^P8Xf13kdC3}fvui9T!1|6MersN z#8L@71cE1ES36d3Eg<)_vM81lh}5zDMR|e1$iv6$ertl!Hb=g77t~(|d>o%(1&pZv zxqr(4oGD0dw*&FIVBHfX3;-p9TS7n=6mKJTekSqUZl)A)D?!idydAz@ZV+mzP6*Ft z=Qs%+!MNOI=a2=zO$xzHWxpN*f!)&=Ey{K;k&qRa&t}%C#sf^rVj^Oi;{S+yiWiIf zi;JpBc~v*jOXQx?OZQe;5CZYI1YxZ$aVFz{VrTx|6pO`5VNGm7KUi6;AFQ3d`Q59m zOaDCB{3@_n<D&CV%m$MUq%&j%UMKT#A|Ou!f$6R2N$@3jPjbFOv8mteYDXhxOol9x zk;oJ10Q5pD5&6#7!`f@+`YT6qs#wzF0ByNow?a*vv|@Hj!_9Ev$6Bx2)3|PXJR6Kk z7>)|s)2GwlNZMmCdC`x0bQ6_cJ!!VWI@#N6t=n`dKhJR@ZI@90Ucnvq{n0OY5;~aN zo7Lm*6l7{uWPYQUDYqH+%Se1IuYTtdo5;r9TSLEL$Im~w&-s*~Vq3>&$l<;qQA<NG zGp#CL`#+aUX+$_3F8>@TgwMux>+Q9LXHK^TW}tjs6}ytS3m3Y1hVRt%bS|rg^^)iM z$`9K)x*h+{M>F6$4Y?W5PrKBWo`;V3Y&m0JzneIW#$1lVUMaa~c(u}&L^*(!YPZde z4pB16WN*H5Dyu>XZz66zI0u>(3!1YvC$ePAwRL^A-|Lw>ufN?O3)%};Rb*}ksWW$L zkDV5I<CSahY-y%{a^_CNua$SY$Wv#79oyoax4BVk9{u$)4z_2qozEU8rgA`o&9kWj ze@;YLbn#b87eD{^FYpAhtS%%DITXVwgkiT=#}F|qYCP&g>O&Y^wPtlWH4XJqLS;ug zy}j{edfNT8q_o_$*fdJo-C9l6-un8Fz*16DEI7k^j!KoEpO?RWDlw5?<?)+e(?f6e bSP_Ot``OK%*+CtrB>(>9hz+o@SU~VU5WrJR delta 2866 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size3-Regular.woff2 index e45ca49db8c66ca43ce41bd15a219db59b0c9350..c2985cd380cfbf10866dbd90d13159b5f10b156e 100644 GIT binary patch literal 3400 zcmV-O4Y%@lPew8T0RR9101Ze04gdfE02`1101Wg10RR9100000000000000000000 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 literal 3728 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.ttf index 3034091cdb7b1c98799073e1770eb57c24747d70..baf02091aa2038c2771d198ab7a24c85f3fa2682 100644 GIT binary patch delta 2119 zcma)7Yitx%6h8N{b7yvDx4SztyL8KAySwb#0!8-O)`my~EKwl^B!EO(D0CsTG|&)~ z!V(QhgZLn$q9KZ!h|wq!D@mh9Vqy@5AN~*$K_L*M{xAV4k7{3@+1(Oqd@!?j=AJX> zeCM3++<UiY*((e4KmfoEyMaOTq9rpE^M78r3qb!4washWTRLktFZ~|CNTK}k+HGAS zeB)JVKeY9oZS7}_^H=fvuK?<SwwA4(sP_QGae&;m>527Ebsyb=^WOlxncTXTR&(de zrvQBKqb`%nt;@HF1U-lWKSV_|*WR_=I_z1220x*Edei2$EgQWZ+fbg1a<08)dnbIQ z4xt=HIn>e8zHZg(9brsJ1K`U$H*f8l(;vMAFtrtcyw|y9UFYR*8|%?@H`?ccLIU3> zsfpzZkdH}6M-GsxSgpsU3(6N0;?q0|9Xvva)Tinizy7o!oTxsHt2+f@*5@=GS_D#W z6(RRdBO(%y*|(S3&se;MrP8U46<`Y-Xw00}26n&fAd)29l5F*{2I~fk)5**V@dK1d zRv(|8C!^Qs9MQoR!DPgBQ^aMNXwuIElW9OmrW6TJMd-Ld6dno3(kf%eIA=#Gq4?ue z<|8xOhU@C<>xSD#W^h@i?d&4CKnUZ+<)(78nN&4RO`6RUop!Tnt7v9*kilp{O7d7n zB9lz`19&GB+04{zBH%YAfzbrUE*2OG3(4VT!j{vSY$h9}77NM?a<f-N8kcA5z9h9_ zK_yz|UOIC1$ihsjX5K@kFC!<pDho<WpUDbVOM+8sw15b#aY|Z#lB6o-OZ-k*jTM!I zV_lL~&~Lyd4(z9Mz=ix&V8*J=4=M8VkL(P*I7W|jo16N&y87|lD7T5pk1>OR4$;=p zQKaTR3^b(>Xgo8sS@Q148BF|*oN*M4V`wgt_g@s<$;Q93)LSmPNn;Sx_S$JX!csUA z4&&lX$I@v}HjDjDU~^5cL0%)i3YS))D4ZhnT-9_DheB|%IG_B0)ZmgKJ=Tx%<<`3a zqYwN)*vR1?Ty#^0yXk}cS(t<=dH_?@!{J!Ws&odqA_TP>oD&%3QtvY7Rze!AZ`7zR zs##%orBiW=g~S_J+8S0PLRNzQpdwolEiD+6WtlPSF>P0{9HCu>U5VA&i`g_J5wTIM z-!&cG$|sbgn{d4_y#Y-t$D0Ox=n$C5Okvm?O+x2L(fPP*#_gC_T%oa;y*{@>@-|DR zjP+#Gx(~Mnt{1=GG$jx|T_6N*7q;)_Eh@W-Ox;G)$R|zxH;L{sG<xfrk6xe`nF}e` zJxc#j_S$fKxLWb(UPdn>XKjNa`l@smCfJ1)Im2#dARB`?o-%fk)w*snDx|$0y@||Q zym;i(Cc|yG=&hR=QyUD~xa{lxYdEaFvOU2m2&LFiBA&)<3;8AjcG=dWo>>!197#kh zY4jTs1u}YbbQ(Da+o8gG-BYQ=Qz@r|t36%T2~T7inxh3C{Nyxw1Z?bpO)ATlPLtw^ zQiS(-6NxeSs9CmPkJ|=E*K_C^LRZ;Niv&zOcko8y3Jve@W^Q-x9dEUQ4tRVgVTm=@ zH#6T&hR6_2(r4&#Hi<1|Iktm6$KGUTIPetT$Y0{8_(gujK^=x8>c~2_I8I3*O_SD0 zpGmhwwOA$giMPcU;<_A`m&yC&g9UVqFe~TEtuAZ00V>1t0M5^R_m8pn!2ZF>q67N^ z)}Ow4m=O%@$8pGN)O)NS^oSz~l-*--WA^=*ma@=jEv%Hz^2;HB=O1S_NZ|?<LQ$OC zIs>0}VFqw`1K&}k1Z%MN8e!{*5wp%3QEY}q%xLd)e_Y$Fz!uws+tJ^`QJfR-qg0$z z{7dgE%^A#x6Qwza7|}{|2Lwr?G?(tsyXboIa7pim6#J;RY3eV`s;df-q_whYeea2? OFmYm7f;}9CvcCWbiH#Tl delta 2976 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff index 93c57a6f97f529f7cbf7ff49678c423a54aa34c0..ff6731972f9c71b8128634552f7dbe687e43f697 100644 GIT binary patch delta 4266 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 R(T)jzNb4H}fT&b}{Xalsw?Y5_ delta 4612 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 C&PhoC diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Size4-Regular.woff2 index 53b65afcff022dc8512e61cb25f7075715de8f7c..a4e810da5e31a364ad7ba2ff229562f97ae0f49f 100644 GIT binary patch literal 4720 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 literal 5028 zcmV;V6I<+ePew8T0RR91028DD4gdfE04qQM0259C0RR9100000000000000000000 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.ttf b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.ttf index 2fd85294ab68105c5ae44fd65332fce36c49f8cd..e66c218df5d876ff6f8b08410d2111de3976915a 100644 GIT binary patch delta 834 zcmYk4TS!xJ9LK-s;#8c|a+R9a(JfK&GHsMeMcK{jLBWS0&~}`2r*Q5#&r0iI!^#J{ z;)yJR9(;)MA&p@dpHhOvhX{<2?4gT64?Xly5K*n~#)2OH`+a|(|L^+Wd38gKUKS$| z0N4<P1W!v_ZT-H(mu7+fW>Swgpz1^W*U!+uOaHC+q@jpAZ0$fa;Wu{c{=kxb`72<Y z1G2{aYQIjN3k?6D&G7dOcF(teJVX5j2rg(owQHSueFErvN47=Nd=WLRTqs}zCxKH7 z7z6f>91#fR1A?_D=vCX!Zv6o0OY|)PbwC%cS`W~F%y^|&4fr}85e^Vt0pzG2>^Byl zKN<thcQO8&9`fm<7k@4AzKHQ75K&J%FRtOb>ByM2Joxh@n9fkrp;%>~B9u`jJf2ZY z>F#4W+rJ}A`b>i5+Iv6$S<?tPBY1(+aH0_o6k!r~a0Gi%hWprtS<*^);YJmT`CCm} zjT-Vv-j?y~Bq_owl=Hpvu$C+r&E%_504wZhAZ;LXqcHxP+RA7<TzJjO74R@JGDTNL z6E@O1*hXdn7qYQA{*BtrQ;K}D0;+tLDn=nmJyuZ1Q8n(OVH&rRSsrxaAm(78g{7x? zU&lNLN7#T8=9Y873T%RcDXy@{;RW-yQ6k9ZQ=@5@(;+GG1{@V1;*$bg>5%w>lcJX` zl;m^rFXfYi8%Rmt&XMNn*YIA3%{&yYG6%vgb0S<Lvhw?Ibu8~xmo<`!P$EOlWbAmd zMnVhB8c%VNU+-K>OK8Q*l$PNVl$1_Gq0pMrmj8IRs0$}j+y=Mw273^MjzM-k4nMTm c&EdFY-W*Ycq1eobESS$O^k%TV5RW70FCt{6jsO4v delta 2140 zcma)-Uu;u#6vxlK{j<@vTL&GEG1w0_po6aKx&dX5A+QxDlQA~=qawR>cWrTPFTHnk zGm(oUBL>kBnke}1!3X~&Mv;XF6CcngUDTLpki-{_KKOva7$q?g=l8UCKu{8ze0t9B z-0$z4^ZWhouRZ>v{Ovi}B#DU1={VVFsBfS-+}*qXbt2<3qC>Hiq9r>P{X{e-h@{_R zM-3rwEI&YWB7*1bBU(Il)%X2xL^&T(*~@W7*AVv-o$iG#jgL-@xUO}60sk72wl1M6 z!}HG@Gep^4h^<Q`R8w*IrB_h!H3S+GDPw%zc%2)9=ZIwAXeOpSf9CBQL`S;NfIFp( zYf|354dVvrMOsOzFYK&*2@M%UCG}cHH?GWlTuF559P}5ptg4+o{Wl6uz6bp&k|_-P znOueCmQd*>=ZF7%lrd$*ND9!f6?NDpl0$1+*0xr)g5lx^4c(`Xx0H~L^Esy_l8U*I zrjP(%Q*?|RJU~t{J)`-g)$9L?cp{4n$AS50H+}iW!HSMQsm%5Z%dTEL@0zoDd$z%p zJ@gfL8Z>}*P!DRs2jDHR7j%J@;C-+Gd;(az8pJ>w2!JJ)-(-#11_A3iAJ64HY&(I; zlekzV@B=Sc02Trk@_0Mo3G=}s;08Vr0jy=qI&Pvy_RQXd<v8m&H)})S3gD(2!4N=B zlP<vFhjy?9)LCQR1zruuxdGOAKr0IT0n2eN$aXoX2CU--ImTlz;2dbGpb5kN3|av1 zYC<+WI68JbbP2o)=8AELhd>Yb6d0fn@J_In6L2Cf$j$ODECtH|7xn|*L0;_&AixE{ z$M6jZ;7z4c{=y4J`3AjSn#yn2x5(FL^QZN?RW>|eY76fYUp-sFt0g;qjd+LzJa2wR z5Ac*5dPu&0Gr!UZ+PzaG<rSkouNf7l<iwqToIeu3`GvQ?Ff4xIq0R1amXywOmAO6T z72eAE3w%`zAE;hbv$%H2(mJthd40o*m8<-XtJegYg3Y0paBJJzb?YM=+8^xL*tzMU z&0Ds1bw{^t?|FDf?;|_=cJ=Qb7<_ck-hKNYd;Ez5jwcTeDTmO_vbE~%qJ;}|dr0)m zorBn|!7&pv>&oKEBb3f)BUw5;J!z<JbD>mzYf=4B7Z)huC#&D`W&AEEmTx0JB`n`g z)pW-49ps^REZ=!Y+#^Nkk`*tf8tGTd_s-=vQL?g707qh<htZpI2_Fx92?zbI<;zqq ze{T6U+9iKy`F0A~R$0D-YHWKg-+4#eBWt!JR=k|r96wsV7x~S(0+n1~Yet*MCgTZ1 z_+yPC913k{3Wr)kqD$42@w6C-CDn9H4Tzp}Ea<vh+|tJ4h}e-((qeN=8CFvhJCs3n z-@(BNP0eMKhML{2#>YmLY&4TLqM2-56=paX67Aw{U6UoeSA36})svaD2n9pIw!0g# zx(@tr+rr<G%jJS8#Yh}h#)Brh=xn^NwOBKs!t#{j>Vk#I0aq?*B*bo2SF=aeVZn<N zJMlmCpH&52uE9i7FDeEyBSua!v#LO3G#OLVIwp^$ht;ew5~>*J=@osNnl7q)i-Lfd zTX{>cC0NX6%@xW~B{`}b8dXK1A4Nnr_Y1{ncO?u%Yj1AWW7(u;=s`U>%8fVoMSBxQ z^}QbDFHbg4Pd)pC%{_O`XHQTVcc@C5nm##Ymz>f9$tP9iPn}FJFBwZGyQ9%A%XV8f MTDVWr>?~FM3q2H|Z~y=R diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff index e90fa2bc7ff9e2f81e57a567be2a8620ef9c8d27..c66d149d5e2a4a5e98d696ceaded67669edc6579 100644 GIT binary patch delta 17818 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 XQbD?nOpJ^He8@qw00962|Nj6FIFd=F delta 18411 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 diff --git a/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff2 b/plugins/tiddlywiki/katex/files/fonts/KaTeX_Typewriter-Regular.woff2 index e40ab151617cb25fce5b4e739aab4f44ff3a652d..e5bf2ce1ff1a199931a53c6654cd08d7b2603ace 100644 GIT binary patch literal 16868 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 literal 17272 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 X7IHyB_z7@g-T~&)gHWZ(YH|VqvZ`!^ diff --git a/plugins/tiddlywiki/katex/files/katex.css b/plugins/tiddlywiki/katex/files/katex.css new file mode 100644 index 000000000..ba8875820 --- /dev/null +++ b/plugins/tiddlywiki/katex/files/katex.css @@ -0,0 +1,1035 @@ +/* stylelint-disable font-family-no-missing-generic-family-keyword */ +@font-face { + font-family: 'KaTeX_AMS'; + src: url(fonts/KaTeX_AMS-Regular.woff2) format('woff2'), url(fonts/KaTeX_AMS-Regular.woff) format('woff'), url(fonts/KaTeX_AMS-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Caligraphic'; + src: url(fonts/KaTeX_Caligraphic-Bold.woff2) format('woff2'), url(fonts/KaTeX_Caligraphic-Bold.woff) format('woff'), url(fonts/KaTeX_Caligraphic-Bold.ttf) format('truetype'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Caligraphic'; + src: url(fonts/KaTeX_Caligraphic-Regular.woff2) format('woff2'), url(fonts/KaTeX_Caligraphic-Regular.woff) format('woff'), url(fonts/KaTeX_Caligraphic-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Fraktur'; + src: url(fonts/KaTeX_Fraktur-Bold.woff2) format('woff2'), url(fonts/KaTeX_Fraktur-Bold.woff) format('woff'), url(fonts/KaTeX_Fraktur-Bold.ttf) format('truetype'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Fraktur'; + src: url(fonts/KaTeX_Fraktur-Regular.woff2) format('woff2'), url(fonts/KaTeX_Fraktur-Regular.woff) format('woff'), url(fonts/KaTeX_Fraktur-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(fonts/KaTeX_Main-Bold.woff2) format('woff2'), url(fonts/KaTeX_Main-Bold.woff) format('woff'), url(fonts/KaTeX_Main-Bold.ttf) format('truetype'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(fonts/KaTeX_Main-BoldItalic.woff2) format('woff2'), url(fonts/KaTeX_Main-BoldItalic.woff) format('woff'), url(fonts/KaTeX_Main-BoldItalic.ttf) format('truetype'); + font-weight: bold; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(fonts/KaTeX_Main-Italic.woff2) format('woff2'), url(fonts/KaTeX_Main-Italic.woff) format('woff'), url(fonts/KaTeX_Main-Italic.ttf) format('truetype'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(fonts/KaTeX_Main-Regular.woff2) format('woff2'), url(fonts/KaTeX_Main-Regular.woff) format('woff'), url(fonts/KaTeX_Main-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Math'; + src: url(fonts/KaTeX_Math-BoldItalic.woff2) format('woff2'), url(fonts/KaTeX_Math-BoldItalic.woff) format('woff'), url(fonts/KaTeX_Math-BoldItalic.ttf) format('truetype'); + font-weight: bold; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_Math'; + src: url(fonts/KaTeX_Math-Italic.woff2) format('woff2'), url(fonts/KaTeX_Math-Italic.woff) format('woff'), url(fonts/KaTeX_Math-Italic.ttf) format('truetype'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_SansSerif'; + src: url(fonts/KaTeX_SansSerif-Bold.woff2) format('woff2'), url(fonts/KaTeX_SansSerif-Bold.woff) format('woff'), url(fonts/KaTeX_SansSerif-Bold.ttf) format('truetype'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_SansSerif'; + src: url(fonts/KaTeX_SansSerif-Italic.woff2) format('woff2'), url(fonts/KaTeX_SansSerif-Italic.woff) format('woff'), url(fonts/KaTeX_SansSerif-Italic.ttf) format('truetype'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_SansSerif'; + src: url(fonts/KaTeX_SansSerif-Regular.woff2) format('woff2'), url(fonts/KaTeX_SansSerif-Regular.woff) format('woff'), url(fonts/KaTeX_SansSerif-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Script'; + src: url(fonts/KaTeX_Script-Regular.woff2) format('woff2'), url(fonts/KaTeX_Script-Regular.woff) format('woff'), url(fonts/KaTeX_Script-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size1'; + src: url(fonts/KaTeX_Size1-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size1-Regular.woff) format('woff'), url(fonts/KaTeX_Size1-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size2'; + src: url(fonts/KaTeX_Size2-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size2-Regular.woff) format('woff'), url(fonts/KaTeX_Size2-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size3'; + src: url(fonts/KaTeX_Size3-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size3-Regular.woff) format('woff'), url(fonts/KaTeX_Size3-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size4'; + src: url(fonts/KaTeX_Size4-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size4-Regular.woff) format('woff'), url(fonts/KaTeX_Size4-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Typewriter'; + src: url(fonts/KaTeX_Typewriter-Regular.woff2) format('woff2'), url(fonts/KaTeX_Typewriter-Regular.woff) format('woff'), url(fonts/KaTeX_Typewriter-Regular.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} +.katex { + font: normal 1.21em KaTeX_Main, Times New Roman, serif; + line-height: 1.2; + text-indent: 0; + text-rendering: auto; + border-color: currentColor; +} +.katex * { + -ms-high-contrast-adjust: none !important; +} +.katex .katex-version::after { + content: "0.12.0"; +} +.katex .katex-mathml { + position: absolute; + clip: rect(1px, 1px, 1px, 1px); + padding: 0; + border: 0; + height: 1px; + width: 1px; + overflow: hidden; +} +.katex .katex-html { + /* \newline is an empty block at top level, between .base elements */ +} +.katex .katex-html > .newline { + display: block; +} +.katex .base { + position: relative; + display: inline-block; + white-space: nowrap; + width: min-content; +} +.katex .strut { + display: inline-block; +} +.katex .textbf { + font-weight: bold; +} +.katex .textit { + font-style: italic; +} +.katex .textrm { + font-family: KaTeX_Main; +} +.katex .textsf { + font-family: KaTeX_SansSerif; +} +.katex .texttt { + font-family: KaTeX_Typewriter; +} +.katex .mathnormal { + font-family: KaTeX_Math; + font-style: italic; +} +.katex .mathit { + font-family: KaTeX_Main; + font-style: italic; +} +.katex .mathrm { + font-style: normal; +} +.katex .mathbf { + font-family: KaTeX_Main; + font-weight: bold; +} +.katex .boldsymbol { + font-family: KaTeX_Math; + font-weight: bold; + font-style: italic; +} +.katex .amsrm { + font-family: KaTeX_AMS; +} +.katex .mathbb, +.katex .textbb { + font-family: KaTeX_AMS; +} +.katex .mathcal { + font-family: KaTeX_Caligraphic; +} +.katex .mathfrak, +.katex .textfrak { + font-family: KaTeX_Fraktur; +} +.katex .mathtt { + font-family: KaTeX_Typewriter; +} +.katex .mathscr, +.katex .textscr { + font-family: KaTeX_Script; +} +.katex .mathsf, +.katex .textsf { + font-family: KaTeX_SansSerif; +} +.katex .mathboldsf, +.katex .textboldsf { + font-family: KaTeX_SansSerif; + font-weight: bold; +} +.katex .mathitsf, +.katex .textitsf { + font-family: KaTeX_SansSerif; + font-style: italic; +} +.katex .mainrm { + font-family: KaTeX_Main; + font-style: normal; +} +.katex .vlist-t { + display: inline-table; + table-layout: fixed; + border-collapse: collapse; +} +.katex .vlist-r { + display: table-row; +} +.katex .vlist { + display: table-cell; + vertical-align: bottom; + position: relative; +} +.katex .vlist > span { + display: block; + height: 0; + position: relative; +} +.katex .vlist > span > span { + display: inline-block; +} +.katex .vlist > span > .pstrut { + overflow: hidden; + width: 0; +} +.katex .vlist-t2 { + margin-right: -2px; +} +.katex .vlist-s { + display: table-cell; + vertical-align: bottom; + font-size: 1px; + width: 2px; + min-width: 2px; +} +.katex .vbox { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-direction: column; + flex-direction: column; + align-items: baseline; +} +.katex .hbox { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-direction: row; + flex-direction: row; + width: 100%; +} +.katex .thinbox { + display: inline-flex; + flex-direction: row; + width: 0; + max-width: 0; +} +.katex .msupsub { + text-align: left; +} +.katex .mfrac > span > span { + text-align: center; +} +.katex .mfrac .frac-line { + display: inline-block; + width: 100%; + border-bottom-style: solid; +} +.katex .mfrac .frac-line, +.katex .overline .overline-line, +.katex .underline .underline-line, +.katex .hline, +.katex .hdashline, +.katex .rule { + min-height: 1px; +} +.katex .mspace { + display: inline-block; +} +.katex .llap, +.katex .rlap, +.katex .clap { + width: 0; + position: relative; +} +.katex .llap > .inner, +.katex .rlap > .inner, +.katex .clap > .inner { + position: absolute; +} +.katex .llap > .fix, +.katex .rlap > .fix, +.katex .clap > .fix { + display: inline-block; +} +.katex .llap > .inner { + right: 0; +} +.katex .rlap > .inner, +.katex .clap > .inner { + left: 0; +} +.katex .clap > .inner > span { + margin-left: -50%; + margin-right: 50%; +} +.katex .rule { + display: inline-block; + border: solid 0; + position: relative; +} +.katex .overline .overline-line, +.katex .underline .underline-line, +.katex .hline { + display: inline-block; + width: 100%; + border-bottom-style: solid; +} +.katex .hdashline { + display: inline-block; + width: 100%; + border-bottom-style: dashed; +} +.katex .sqrt > .root { + margin-left: 0.27777778em; + margin-right: -0.55555556em; +} +.katex .sizing.reset-size1.size1, +.katex .fontsize-ensurer.reset-size1.size1 { + font-size: 1em; +} +.katex .sizing.reset-size1.size2, +.katex .fontsize-ensurer.reset-size1.size2 { + font-size: 1.2em; +} +.katex .sizing.reset-size1.size3, +.katex .fontsize-ensurer.reset-size1.size3 { + font-size: 1.4em; +} +.katex .sizing.reset-size1.size4, +.katex .fontsize-ensurer.reset-size1.size4 { + font-size: 1.6em; +} +.katex .sizing.reset-size1.size5, +.katex .fontsize-ensurer.reset-size1.size5 { + font-size: 1.8em; +} +.katex .sizing.reset-size1.size6, +.katex .fontsize-ensurer.reset-size1.size6 { + font-size: 2em; +} +.katex .sizing.reset-size1.size7, +.katex .fontsize-ensurer.reset-size1.size7 { + font-size: 2.4em; +} +.katex .sizing.reset-size1.size8, +.katex .fontsize-ensurer.reset-size1.size8 { + font-size: 2.88em; +} +.katex .sizing.reset-size1.size9, +.katex .fontsize-ensurer.reset-size1.size9 { + font-size: 3.456em; +} +.katex .sizing.reset-size1.size10, +.katex .fontsize-ensurer.reset-size1.size10 { + font-size: 4.148em; +} +.katex .sizing.reset-size1.size11, +.katex .fontsize-ensurer.reset-size1.size11 { + font-size: 4.976em; +} +.katex .sizing.reset-size2.size1, +.katex .fontsize-ensurer.reset-size2.size1 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size2.size2, +.katex .fontsize-ensurer.reset-size2.size2 { + font-size: 1em; +} +.katex .sizing.reset-size2.size3, +.katex .fontsize-ensurer.reset-size2.size3 { + font-size: 1.16666667em; +} +.katex .sizing.reset-size2.size4, +.katex .fontsize-ensurer.reset-size2.size4 { + font-size: 1.33333333em; +} +.katex .sizing.reset-size2.size5, +.katex .fontsize-ensurer.reset-size2.size5 { + font-size: 1.5em; +} +.katex .sizing.reset-size2.size6, +.katex .fontsize-ensurer.reset-size2.size6 { + font-size: 1.66666667em; +} +.katex .sizing.reset-size2.size7, +.katex .fontsize-ensurer.reset-size2.size7 { + font-size: 2em; +} +.katex .sizing.reset-size2.size8, +.katex .fontsize-ensurer.reset-size2.size8 { + font-size: 2.4em; +} +.katex .sizing.reset-size2.size9, +.katex .fontsize-ensurer.reset-size2.size9 { + font-size: 2.88em; +} +.katex .sizing.reset-size2.size10, +.katex .fontsize-ensurer.reset-size2.size10 { + font-size: 3.45666667em; +} +.katex .sizing.reset-size2.size11, +.katex .fontsize-ensurer.reset-size2.size11 { + font-size: 4.14666667em; +} +.katex .sizing.reset-size3.size1, +.katex .fontsize-ensurer.reset-size3.size1 { + font-size: 0.71428571em; +} +.katex .sizing.reset-size3.size2, +.katex .fontsize-ensurer.reset-size3.size2 { + font-size: 0.85714286em; +} +.katex .sizing.reset-size3.size3, +.katex .fontsize-ensurer.reset-size3.size3 { + font-size: 1em; +} +.katex .sizing.reset-size3.size4, +.katex .fontsize-ensurer.reset-size3.size4 { + font-size: 1.14285714em; +} +.katex .sizing.reset-size3.size5, +.katex .fontsize-ensurer.reset-size3.size5 { + font-size: 1.28571429em; +} +.katex .sizing.reset-size3.size6, +.katex .fontsize-ensurer.reset-size3.size6 { + font-size: 1.42857143em; +} +.katex .sizing.reset-size3.size7, +.katex .fontsize-ensurer.reset-size3.size7 { + font-size: 1.71428571em; +} +.katex .sizing.reset-size3.size8, +.katex .fontsize-ensurer.reset-size3.size8 { + font-size: 2.05714286em; +} +.katex .sizing.reset-size3.size9, +.katex .fontsize-ensurer.reset-size3.size9 { + font-size: 2.46857143em; +} +.katex .sizing.reset-size3.size10, +.katex .fontsize-ensurer.reset-size3.size10 { + font-size: 2.96285714em; +} +.katex .sizing.reset-size3.size11, +.katex .fontsize-ensurer.reset-size3.size11 { + font-size: 3.55428571em; +} +.katex .sizing.reset-size4.size1, +.katex .fontsize-ensurer.reset-size4.size1 { + font-size: 0.625em; +} +.katex .sizing.reset-size4.size2, +.katex .fontsize-ensurer.reset-size4.size2 { + font-size: 0.75em; +} +.katex .sizing.reset-size4.size3, +.katex .fontsize-ensurer.reset-size4.size3 { + font-size: 0.875em; +} +.katex .sizing.reset-size4.size4, +.katex .fontsize-ensurer.reset-size4.size4 { + font-size: 1em; +} +.katex .sizing.reset-size4.size5, +.katex .fontsize-ensurer.reset-size4.size5 { + font-size: 1.125em; +} +.katex .sizing.reset-size4.size6, +.katex .fontsize-ensurer.reset-size4.size6 { + font-size: 1.25em; +} +.katex .sizing.reset-size4.size7, +.katex .fontsize-ensurer.reset-size4.size7 { + font-size: 1.5em; +} +.katex .sizing.reset-size4.size8, +.katex .fontsize-ensurer.reset-size4.size8 { + font-size: 1.8em; +} +.katex .sizing.reset-size4.size9, +.katex .fontsize-ensurer.reset-size4.size9 { + font-size: 2.16em; +} +.katex .sizing.reset-size4.size10, +.katex .fontsize-ensurer.reset-size4.size10 { + font-size: 2.5925em; +} +.katex .sizing.reset-size4.size11, +.katex .fontsize-ensurer.reset-size4.size11 { + font-size: 3.11em; +} +.katex .sizing.reset-size5.size1, +.katex .fontsize-ensurer.reset-size5.size1 { + font-size: 0.55555556em; +} +.katex .sizing.reset-size5.size2, +.katex .fontsize-ensurer.reset-size5.size2 { + font-size: 0.66666667em; +} +.katex .sizing.reset-size5.size3, +.katex .fontsize-ensurer.reset-size5.size3 { + font-size: 0.77777778em; +} +.katex .sizing.reset-size5.size4, +.katex .fontsize-ensurer.reset-size5.size4 { + font-size: 0.88888889em; +} +.katex .sizing.reset-size5.size5, +.katex .fontsize-ensurer.reset-size5.size5 { + font-size: 1em; +} +.katex .sizing.reset-size5.size6, +.katex .fontsize-ensurer.reset-size5.size6 { + font-size: 1.11111111em; +} +.katex .sizing.reset-size5.size7, +.katex .fontsize-ensurer.reset-size5.size7 { + font-size: 1.33333333em; +} +.katex .sizing.reset-size5.size8, +.katex .fontsize-ensurer.reset-size5.size8 { + font-size: 1.6em; +} +.katex .sizing.reset-size5.size9, +.katex .fontsize-ensurer.reset-size5.size9 { + font-size: 1.92em; +} +.katex .sizing.reset-size5.size10, +.katex .fontsize-ensurer.reset-size5.size10 { + font-size: 2.30444444em; +} +.katex .sizing.reset-size5.size11, +.katex .fontsize-ensurer.reset-size5.size11 { + font-size: 2.76444444em; +} +.katex .sizing.reset-size6.size1, +.katex .fontsize-ensurer.reset-size6.size1 { + font-size: 0.5em; +} +.katex .sizing.reset-size6.size2, +.katex .fontsize-ensurer.reset-size6.size2 { + font-size: 0.6em; +} +.katex .sizing.reset-size6.size3, +.katex .fontsize-ensurer.reset-size6.size3 { + font-size: 0.7em; +} +.katex .sizing.reset-size6.size4, +.katex .fontsize-ensurer.reset-size6.size4 { + font-size: 0.8em; +} +.katex .sizing.reset-size6.size5, +.katex .fontsize-ensurer.reset-size6.size5 { + font-size: 0.9em; +} +.katex .sizing.reset-size6.size6, +.katex .fontsize-ensurer.reset-size6.size6 { + font-size: 1em; +} +.katex .sizing.reset-size6.size7, +.katex .fontsize-ensurer.reset-size6.size7 { + font-size: 1.2em; +} +.katex .sizing.reset-size6.size8, +.katex .fontsize-ensurer.reset-size6.size8 { + font-size: 1.44em; +} +.katex .sizing.reset-size6.size9, +.katex .fontsize-ensurer.reset-size6.size9 { + font-size: 1.728em; +} +.katex .sizing.reset-size6.size10, +.katex .fontsize-ensurer.reset-size6.size10 { + font-size: 2.074em; +} +.katex .sizing.reset-size6.size11, +.katex .fontsize-ensurer.reset-size6.size11 { + font-size: 2.488em; +} +.katex .sizing.reset-size7.size1, +.katex .fontsize-ensurer.reset-size7.size1 { + font-size: 0.41666667em; +} +.katex .sizing.reset-size7.size2, +.katex .fontsize-ensurer.reset-size7.size2 { + font-size: 0.5em; +} +.katex .sizing.reset-size7.size3, +.katex .fontsize-ensurer.reset-size7.size3 { + font-size: 0.58333333em; +} +.katex .sizing.reset-size7.size4, +.katex .fontsize-ensurer.reset-size7.size4 { + font-size: 0.66666667em; +} +.katex .sizing.reset-size7.size5, +.katex .fontsize-ensurer.reset-size7.size5 { + font-size: 0.75em; +} +.katex .sizing.reset-size7.size6, +.katex .fontsize-ensurer.reset-size7.size6 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size7.size7, +.katex .fontsize-ensurer.reset-size7.size7 { + font-size: 1em; +} +.katex .sizing.reset-size7.size8, +.katex .fontsize-ensurer.reset-size7.size8 { + font-size: 1.2em; +} +.katex .sizing.reset-size7.size9, +.katex .fontsize-ensurer.reset-size7.size9 { + font-size: 1.44em; +} +.katex .sizing.reset-size7.size10, +.katex .fontsize-ensurer.reset-size7.size10 { + font-size: 1.72833333em; +} +.katex .sizing.reset-size7.size11, +.katex .fontsize-ensurer.reset-size7.size11 { + font-size: 2.07333333em; +} +.katex .sizing.reset-size8.size1, +.katex .fontsize-ensurer.reset-size8.size1 { + font-size: 0.34722222em; +} +.katex .sizing.reset-size8.size2, +.katex .fontsize-ensurer.reset-size8.size2 { + font-size: 0.41666667em; +} +.katex .sizing.reset-size8.size3, +.katex .fontsize-ensurer.reset-size8.size3 { + font-size: 0.48611111em; +} +.katex .sizing.reset-size8.size4, +.katex .fontsize-ensurer.reset-size8.size4 { + font-size: 0.55555556em; +} +.katex .sizing.reset-size8.size5, +.katex .fontsize-ensurer.reset-size8.size5 { + font-size: 0.625em; +} +.katex .sizing.reset-size8.size6, +.katex .fontsize-ensurer.reset-size8.size6 { + font-size: 0.69444444em; +} +.katex .sizing.reset-size8.size7, +.katex .fontsize-ensurer.reset-size8.size7 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size8.size8, +.katex .fontsize-ensurer.reset-size8.size8 { + font-size: 1em; +} +.katex .sizing.reset-size8.size9, +.katex .fontsize-ensurer.reset-size8.size9 { + font-size: 1.2em; +} +.katex .sizing.reset-size8.size10, +.katex .fontsize-ensurer.reset-size8.size10 { + font-size: 1.44027778em; +} +.katex .sizing.reset-size8.size11, +.katex .fontsize-ensurer.reset-size8.size11 { + font-size: 1.72777778em; +} +.katex .sizing.reset-size9.size1, +.katex .fontsize-ensurer.reset-size9.size1 { + font-size: 0.28935185em; +} +.katex .sizing.reset-size9.size2, +.katex .fontsize-ensurer.reset-size9.size2 { + font-size: 0.34722222em; +} +.katex .sizing.reset-size9.size3, +.katex .fontsize-ensurer.reset-size9.size3 { + font-size: 0.40509259em; +} +.katex .sizing.reset-size9.size4, +.katex .fontsize-ensurer.reset-size9.size4 { + font-size: 0.46296296em; +} +.katex .sizing.reset-size9.size5, +.katex .fontsize-ensurer.reset-size9.size5 { + font-size: 0.52083333em; +} +.katex .sizing.reset-size9.size6, +.katex .fontsize-ensurer.reset-size9.size6 { + font-size: 0.5787037em; +} +.katex .sizing.reset-size9.size7, +.katex .fontsize-ensurer.reset-size9.size7 { + font-size: 0.69444444em; +} +.katex .sizing.reset-size9.size8, +.katex .fontsize-ensurer.reset-size9.size8 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size9.size9, +.katex .fontsize-ensurer.reset-size9.size9 { + font-size: 1em; +} +.katex .sizing.reset-size9.size10, +.katex .fontsize-ensurer.reset-size9.size10 { + font-size: 1.20023148em; +} +.katex .sizing.reset-size9.size11, +.katex .fontsize-ensurer.reset-size9.size11 { + font-size: 1.43981481em; +} +.katex .sizing.reset-size10.size1, +.katex .fontsize-ensurer.reset-size10.size1 { + font-size: 0.24108004em; +} +.katex .sizing.reset-size10.size2, +.katex .fontsize-ensurer.reset-size10.size2 { + font-size: 0.28929605em; +} +.katex .sizing.reset-size10.size3, +.katex .fontsize-ensurer.reset-size10.size3 { + font-size: 0.33751205em; +} +.katex .sizing.reset-size10.size4, +.katex .fontsize-ensurer.reset-size10.size4 { + font-size: 0.38572806em; +} +.katex .sizing.reset-size10.size5, +.katex .fontsize-ensurer.reset-size10.size5 { + font-size: 0.43394407em; +} +.katex .sizing.reset-size10.size6, +.katex .fontsize-ensurer.reset-size10.size6 { + font-size: 0.48216008em; +} +.katex .sizing.reset-size10.size7, +.katex .fontsize-ensurer.reset-size10.size7 { + font-size: 0.57859209em; +} +.katex .sizing.reset-size10.size8, +.katex .fontsize-ensurer.reset-size10.size8 { + font-size: 0.69431051em; +} +.katex .sizing.reset-size10.size9, +.katex .fontsize-ensurer.reset-size10.size9 { + font-size: 0.83317261em; +} +.katex .sizing.reset-size10.size10, +.katex .fontsize-ensurer.reset-size10.size10 { + font-size: 1em; +} +.katex .sizing.reset-size10.size11, +.katex .fontsize-ensurer.reset-size10.size11 { + font-size: 1.19961427em; +} +.katex .sizing.reset-size11.size1, +.katex .fontsize-ensurer.reset-size11.size1 { + font-size: 0.20096463em; +} +.katex .sizing.reset-size11.size2, +.katex .fontsize-ensurer.reset-size11.size2 { + font-size: 0.24115756em; +} +.katex .sizing.reset-size11.size3, +.katex .fontsize-ensurer.reset-size11.size3 { + font-size: 0.28135048em; +} +.katex .sizing.reset-size11.size4, +.katex .fontsize-ensurer.reset-size11.size4 { + font-size: 0.32154341em; +} +.katex .sizing.reset-size11.size5, +.katex .fontsize-ensurer.reset-size11.size5 { + font-size: 0.36173633em; +} +.katex .sizing.reset-size11.size6, +.katex .fontsize-ensurer.reset-size11.size6 { + font-size: 0.40192926em; +} +.katex .sizing.reset-size11.size7, +.katex .fontsize-ensurer.reset-size11.size7 { + font-size: 0.48231511em; +} +.katex .sizing.reset-size11.size8, +.katex .fontsize-ensurer.reset-size11.size8 { + font-size: 0.57877814em; +} +.katex .sizing.reset-size11.size9, +.katex .fontsize-ensurer.reset-size11.size9 { + font-size: 0.69453376em; +} +.katex .sizing.reset-size11.size10, +.katex .fontsize-ensurer.reset-size11.size10 { + font-size: 0.83360129em; +} +.katex .sizing.reset-size11.size11, +.katex .fontsize-ensurer.reset-size11.size11 { + font-size: 1em; +} +.katex .delimsizing.size1 { + font-family: KaTeX_Size1; +} +.katex .delimsizing.size2 { + font-family: KaTeX_Size2; +} +.katex .delimsizing.size3 { + font-family: KaTeX_Size3; +} +.katex .delimsizing.size4 { + font-family: KaTeX_Size4; +} +.katex .delimsizing.mult .delim-size1 > span { + font-family: KaTeX_Size1; +} +.katex .delimsizing.mult .delim-size4 > span { + font-family: KaTeX_Size4; +} +.katex .nulldelimiter { + display: inline-block; + width: 0.12em; +} +.katex .delimcenter { + position: relative; +} +.katex .op-symbol { + position: relative; +} +.katex .op-symbol.small-op { + font-family: KaTeX_Size1; +} +.katex .op-symbol.large-op { + font-family: KaTeX_Size2; +} +.katex .op-limits > .vlist-t { + text-align: center; +} +.katex .accent > .vlist-t { + text-align: center; +} +.katex .accent .accent-body { + position: relative; +} +.katex .accent .accent-body:not(.accent-full) { + width: 0; +} +.katex .overlay { + display: block; +} +.katex .mtable .vertical-separator { + display: inline-block; + min-width: 1px; +} +.katex .mtable .arraycolsep { + display: inline-block; +} +.katex .mtable .col-align-c > .vlist-t { + text-align: center; +} +.katex .mtable .col-align-l > .vlist-t { + text-align: left; +} +.katex .mtable .col-align-r > .vlist-t { + text-align: right; +} +.katex .svg-align { + text-align: left; +} +.katex svg { + display: block; + position: absolute; + width: 100%; + height: inherit; + fill: currentColor; + stroke: currentColor; + fill-rule: nonzero; + fill-opacity: 1; + stroke-width: 1; + stroke-linecap: butt; + stroke-linejoin: miter; + stroke-miterlimit: 4; + stroke-dasharray: none; + stroke-dashoffset: 0; + stroke-opacity: 1; +} +.katex svg path { + stroke: none; +} +.katex img { + border-style: none; + min-width: 0; + min-height: 0; + max-width: none; + max-height: none; +} +.katex .stretchy { + width: 100%; + display: block; + position: relative; + overflow: hidden; +} +.katex .stretchy::before, +.katex .stretchy::after { + content: ""; +} +.katex .hide-tail { + width: 100%; + position: relative; + overflow: hidden; +} +.katex .halfarrow-left { + position: absolute; + left: 0; + width: 50.2%; + overflow: hidden; +} +.katex .halfarrow-right { + position: absolute; + right: 0; + width: 50.2%; + overflow: hidden; +} +.katex .brace-left { + position: absolute; + left: 0; + width: 25.1%; + overflow: hidden; +} +.katex .brace-center { + position: absolute; + left: 25%; + width: 50%; + overflow: hidden; +} +.katex .brace-right { + position: absolute; + right: 0; + width: 25.1%; + overflow: hidden; +} +.katex .x-arrow-pad { + padding: 0 0.5em; +} +.katex .x-arrow, +.katex .mover, +.katex .munder { + text-align: center; +} +.katex .boxpad { + padding: 0 0.3em 0 0.3em; +} +.katex .fbox, +.katex .fcolorbox { + box-sizing: border-box; + border: 0.04em solid; +} +.katex .cancel-pad { + padding: 0 0.2em 0 0.2em; +} +.katex .cancel-lap { + margin-left: -0.2em; + margin-right: -0.2em; +} +.katex .sout { + border-bottom-style: solid; + border-bottom-width: 0.08em; +} +.katex-display { + display: block; + margin: 1em 0; + text-align: center; +} +.katex-display > .katex { + display: block; + text-align: center; + white-space: nowrap; +} +.katex-display > .katex > .katex-html { + display: block; + position: relative; +} +.katex-display > .katex > .katex-html > .tag { + position: absolute; + right: 0; +} +.katex-display.leqno > .katex > .katex-html > .tag { + left: 0; + right: auto; +} +.katex-display.fleqn > .katex { + text-align: left; + padding-left: 2em; +} + diff --git a/plugins/tiddlywiki/katex/files/katex.js b/plugins/tiddlywiki/katex/files/katex.js index 8f2991188..37fb0fa89 100644 --- a/plugins/tiddlywiki/katex/files/katex.js +++ b/plugins/tiddlywiki/katex/files/katex.js @@ -177,10 +177,14 @@ function () { var Token_Token = /*#__PURE__*/ function () { + // don't expand the token + // used in \noexpand function Token(text, // the text of this token loc) { this.text = void 0; this.loc = void 0; + this.noexpand = void 0; + this.treatAsRelax = void 0; this.text = text; this.loc = loc; } @@ -362,13 +366,23 @@ var assert = function assert(value) { return value; }; +/** + * Return the protocol of a URL, or "_relative" if the URL does not specify a + * protocol (and thus is relative). + */ + +var protocolFromUrl = function protocolFromUrl(url) { + var protocol = /^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(url); + return protocol != null ? protocol[1] : "_relative"; +}; /* harmony default export */ var utils = ({ contains: contains, deflt: deflt, escape: utils_escape, hyphenate: hyphenate, getBaseElem: getBaseElem, - isCharacterBox: utils_isCharacterBox + isCharacterBox: utils_isCharacterBox, + protocolFromUrl: protocolFromUrl }); // CONCATENATED MODULE: ./src/Settings.js /* eslint no-console:0 */ @@ -396,29 +410,35 @@ var Settings_Settings = function () { function Settings(options) { this.displayMode = void 0; + this.output = void 0; this.leqno = void 0; this.fleqn = void 0; this.throwOnError = void 0; this.errorColor = void 0; this.macros = void 0; + this.minRuleThickness = void 0; this.colorIsTextColor = void 0; this.strict = void 0; + this.trust = void 0; this.maxSize = void 0; this.maxExpand = void 0; - this.allowedProtocols = void 0; + this.globalGroup = void 0; // allow null options options = options || {}; this.displayMode = utils.deflt(options.displayMode, false); + this.output = utils.deflt(options.output, "htmlAndMathml"); this.leqno = utils.deflt(options.leqno, false); this.fleqn = utils.deflt(options.fleqn, false); this.throwOnError = utils.deflt(options.throwOnError, true); this.errorColor = utils.deflt(options.errorColor, "#cc0000"); this.macros = options.macros || {}; + this.minRuleThickness = Math.max(0, utils.deflt(options.minRuleThickness, 0)); this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); this.strict = utils.deflt(options.strict, "warn"); + this.trust = utils.deflt(options.trust, false); this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity)); this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); - this.allowedProtocols = utils.deflt(options.allowedProtocols, ["http", "https", "mailto", "_relative"]); + this.globalGroup = utils.deflt(options.globalGroup, false); } /** * Report nonstrict (non-LaTeX-compatible) input. @@ -485,12 +505,30 @@ function () { typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); return false; } + } + /** + * Check whether to test potentially dangerous input, and return + * `true` (trusted) or `false` (untrusted). The sole argument `context` + * should be an object with `command` field specifying the relevant LaTeX + * command (as a string starting with `\`), and any other arguments, etc. + * If `context` has a `url` field, a `protocol` field will automatically + * get added by this function (changing the specified object). + */ + ; + + _proto.isTrusted = function isTrusted(context) { + if (context.url && !context.protocol) { + context.protocol = utils.protocolFromUrl(context.url); + } + + var trust = typeof this.trust === "function" ? this.trust(context) : this.trust; + return Boolean(trust); }; return Settings; }(); -/* harmony default export */ var src_Settings = (Settings_Settings); + // CONCATENATED MODULE: ./src/Style.js /** * This file contains information and classes for the various kinds of styles @@ -721,25 +759,100 @@ function supportedCodepoint(codepoint) { } // CONCATENATED MODULE: ./src/svgGeometry.js /** - * This file provides support to domTree.js + * This file provides support to domTree.js and delimiter.js. * It's a storehouse of path geometry for SVG images. */ // In all paths below, the viewBox-to-em scale is 1000:1. -var hLinePad = 80; // padding above a sqrt viniculum. +var hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping. +// The viniculum of a \sqrt can be made thicker by a KaTeX rendering option. +// Think of variable extraViniculum as two detours in the SVG path. +// The detour begins at the lower left of the area labeled extraViniculum below. +// The detour proceeds one extraViniculum distance up and slightly to the right, +// displacing the radiused corner between surd and viniculum. The radius is +// traversed as usual, then the detour resumes. It goes right, to the end of +// the very long viniculumn, then down one extraViniculum distance, +// after which it resumes regular path geometry for the radical. -var svgGeometry_path = { +/* viniculum + / + /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum + / █████████████████████←0.04em (40 unit) std viniculum thickness + / / + / / + / /\ + / / surd +*/ + +var sqrtMain = function sqrtMain(extraViniculum, hLinePad) { // sqrtMain path geometry is from glyph U221A in the font KaTeX Main - // All surds have 80 units padding above the viniculumn. - sqrtMain: "M95," + (622 + hLinePad) + "c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\ns-65,47,-65,47z M834 " + hLinePad + "H400000v40H845z", + return "M95," + (622 + extraViniculum + hLinePad) + "\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl" + extraViniculum / 2.075 + " -" + extraViniculum + "\nc5.3,-9.3,12,-14,20,-14\nH400000v" + (40 + extraViniculum) + "H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM" + (834 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) { // size1 is from glyph U221A in the font KaTeX_Size1-Regular - sqrtSize1: "M263," + (601 + hLinePad) + "c0.7,0,18,39.7,52,119c34,79.3,68.167,\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\ns76,-59,76,-59s76,-60,76,-60z M1001 " + hLinePad + "H40000v40H1012z", + return "M263," + (601 + extraViniculum + hLinePad) + "c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl" + extraViniculum / 2.084 + " -" + extraViniculum + "\nc4.7,-7.3,11,-11,19,-11\nH40000v" + (40 + extraViniculum) + "H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) { // size2 is from glyph U221A in the font KaTeX_Size2-Regular - // The 80 units padding is most obvious here. Note start node at M1001 80. - sqrtSize2: "M1001," + hLinePad + "H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\nM1001 " + hLinePad + "H400000v40H1013z", + return "M983 " + (10 + extraViniculum + hLinePad) + "\nl" + extraViniculum / 3.13 + " -" + extraViniculum + "\nc4,-6.7,10,-10,18,-10 H400000v" + (40 + extraViniculum) + "\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) { // size3 is from glyph U221A in the font KaTeX_Size3-Regular - sqrtSize3: "M424," + (2398 + hLinePad) + "c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M1001 " + hLinePad + "H400000v40H1014z", + return "M424," + (2398 + extraViniculum + hLinePad) + "\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl" + extraViniculum / 4.223 + " -" + extraViniculum + "c4,-6.7,10,-10,18,-10 H400000\nv" + (40 + extraViniculum) + "H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M" + (1001 + extraViniculum) + " " + hLinePad + "\nh400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) { // size4 is from glyph U221A in the font KaTeX_Size4-Regular - sqrtSize4: "M473," + (2713 + hLinePad) + "c339.3,-1799.3,509.3,-2700,510,-2702\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\nM1001 " + hLinePad + "H400000v40H1017z", + return "M473," + (2713 + extraViniculum + hLinePad) + "\nc339.3,-1799.3,509.3,-2700,510,-2702 l" + extraViniculum / 5.298 + " -" + extraViniculum + "\nc3.3,-7.3,9.3,-11,18,-11 H400000v" + (40 + extraViniculum) + "H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "H1017.7z"; +}; + +var sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) { + // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular + // One path edge has a variable length. It runs vertically from the viniculumn + // to a point near (14 units) the bottom of the surd. The viniculum + // is normally 40 units thick. So the length of the line in question is: + var vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum; + return "M702 " + (extraViniculum + hLinePad) + "H400000" + (40 + extraViniculum) + "\nH742v" + vertSegment + "l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 " + hLinePad + "H400000v" + (40 + extraViniculum) + "H742z"; +}; + +var sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) { + extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox. + + var path = ""; + + switch (size) { + case "sqrtMain": + path = sqrtMain(extraViniculum, hLinePad); + break; + + case "sqrtSize1": + path = sqrtSize1(extraViniculum, hLinePad); + break; + + case "sqrtSize2": + path = sqrtSize2(extraViniculum, hLinePad); + break; + + case "sqrtSize3": + path = sqrtSize3(extraViniculum, hLinePad); + break; + + case "sqrtSize4": + path = sqrtSize4(extraViniculum, hLinePad); + break; + + case "sqrtTall": + path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight); + } + + return path; +}; +var svgGeometry_path = { + // Two paths that cover gaps in built-up parentheses. + leftParenInner: "M291 0 H417 V300 H291 z", + rightParenInner: "M457 0 H583 V300 H457 z", // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", // doublerightarrow is from glyph U+21D2 in font KaTeX Main @@ -817,9 +930,6 @@ var svgGeometry_path = { shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" }; -/* harmony default export */ var svgGeometry = ({ - path: svgGeometry_path -}); // CONCATENATED MODULE: ./src/tree.js @@ -1383,7 +1493,7 @@ function () { this.pathName = void 0; this.alternate = void 0; this.pathName = pathName; - this.alternate = alternate; // Used only for tall \sqrt + this.alternate = alternate; // Used only for \sqrt } var _proto6 = PathNode.prototype; @@ -1395,7 +1505,7 @@ function () { if (this.alternate) { node.setAttribute("d", this.alternate); } else { - node.setAttribute("d", svgGeometry.path[this.pathName]); + node.setAttribute("d", svgGeometry_path[this.pathName]); } return node; @@ -1405,7 +1515,7 @@ function () { if (this.alternate) { return "<path d='" + this.alternate + "'/>"; } else { - return "<path d='" + svgGeometry.path[this.pathName] + "'/>"; + return "<path d='" + svgGeometry_path[this.pathName] + "'/>"; } }; @@ -1467,6 +1577,7 @@ function assertSpan(group) { // This file is GENERATED by buildMetrics.sh. DO NOT MODIFY. /* harmony default export */ var fontMetricsData = ({ "AMS-Regular": { + "32": [0, 0, 0, 0, 0.25], "65": [0, 0.68889, 0, 0, 0.72222], "66": [0, 0.68889, 0, 0, 0.66667], "67": [0, 0.68889, 0, 0, 0.72222], @@ -1494,6 +1605,7 @@ function assertSpan(group) { "89": [0, 0.68889, 0, 0, 0.72222], "90": [0, 0.68889, 0, 0, 0.66667], "107": [0, 0.68889, 0, 0, 0.55556], + "160": [0, 0, 0, 0, 0.25], "165": [0, 0.675, 0.025, 0, 0.75], "174": [0.15559, 0.69224, 0, 0, 0.94666], "240": [0, 0.68889, 0, 0, 0.55556], @@ -1724,16 +1836,7 @@ function assertSpan(group) { "57371": [0.13597, 0.63597, 0, 0, 0.77778] }, "Caligraphic-Regular": { - "48": [0, 0.43056, 0, 0, 0.5], - "49": [0, 0.43056, 0, 0, 0.5], - "50": [0, 0.43056, 0, 0, 0.5], - "51": [0.19444, 0.43056, 0, 0, 0.5], - "52": [0.19444, 0.43056, 0, 0, 0.5], - "53": [0.19444, 0.43056, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0.19444, 0.43056, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0.19444, 0.43056, 0, 0, 0.5], + "32": [0, 0, 0, 0, 0.25], "65": [0, 0.68333, 0, 0.19445, 0.79847], "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], @@ -1759,9 +1862,11 @@ function assertSpan(group) { "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], - "90": [0, 0.68333, 0.07944, 0.13889, 0.72473] + "90": [0, 0.68333, 0.07944, 0.13889, 0.72473], + "160": [0, 0, 0, 0, 0.25] }, "Fraktur-Regular": { + "32": [0, 0, 0, 0, 0.25], "33": [0, 0.69141, 0, 0, 0.29574], "34": [0, 0.69141, 0, 0, 0.21471], "38": [0, 0.69141, 0, 0, 0.73786], @@ -1843,6 +1948,7 @@ function assertSpan(group) { "120": [0.18906, 0.47534, 0, 0, 0.38865], "121": [0.18906, 0.47534, 0, 0, 0.49884], "122": [0.18906, 0.47534, 0, 0, 0.39054], + "160": [0, 0, 0, 0, 0.25], "8216": [0, 0.69141, 0, 0, 0.21471], "8217": [0, 0.69141, 0, 0, 0.21471], "58112": [0, 0.62119, 0, 0, 0.49749], @@ -1855,6 +1961,7 @@ function assertSpan(group) { "58119": [0, 0.47534, 0, 0, 0.50073] }, "Main-Bold": { + "32": [0, 0, 0, 0, 0.25], "33": [0, 0.69444, 0, 0, 0.35], "34": [0, 0.69444, 0, 0, 0.60278], "35": [0.19444, 0.69444, 0, 0, 0.95833], @@ -1948,6 +2055,8 @@ function assertSpan(group) { "124": [0.25, 0.75, 0, 0, 0.31944], "125": [0.25, 0.75, 0, 0, 0.575], "126": [0.35, 0.34444, 0, 0, 0.575], + "160": [0, 0, 0, 0, 0.25], + "163": [0, 0.69444, 0, 0, 0.86853], "168": [0, 0.69444, 0, 0, 0.575], "172": [0, 0.44444, 0, 0, 0.76666], "176": [0, 0.69444, 0, 0, 0.86944], @@ -2105,6 +2214,7 @@ function assertSpan(group) { "57376": [0.19444, 0.69444, 0, 0, 0] }, "Main-BoldItalic": { + "32": [0, 0, 0, 0, 0.25], "33": [0, 0.69444, 0.11417, 0, 0.38611], "34": [0, 0.69444, 0.07939, 0, 0.62055], "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], @@ -2191,7 +2301,7 @@ function assertSpan(group) { "121": [0.19444, 0.44444, 0.105, 0, 0.56166], "122": [0, 0.44444, 0.13889, 0, 0.49055], "126": [0.35, 0.34444, 0.11472, 0, 0.59111], - "163": [0, 0.69444, 0, 0, 0.86853], + "160": [0, 0, 0, 0, 0.25], "168": [0, 0.69444, 0.11473, 0, 0.59111], "176": [0, 0.69444, 0, 0, 0.94888], "184": [0.17014, 0, 0, 0, 0.53222], @@ -2233,6 +2343,7 @@ function assertSpan(group) { "8221": [0, 0.69444, 0.07939, 0, 0.62055] }, "Main-Italic": { + "32": [0, 0, 0, 0, 0.25], "33": [0, 0.69444, 0.12417, 0, 0.30667], "34": [0, 0.69444, 0.06961, 0, 0.51444], "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], @@ -2319,7 +2430,7 @@ function assertSpan(group) { "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], "122": [0, 0.43056, 0.12292, 0, 0.40889], "126": [0.35, 0.31786, 0.11585, 0, 0.51111], - "163": [0, 0.69444, 0, 0, 0.76909], + "160": [0, 0, 0, 0, 0.25], "168": [0, 0.66786, 0.10474, 0, 0.51111], "176": [0, 0.69444, 0, 0, 0.83129], "184": [0.17014, 0, 0, 0, 0.46], @@ -2328,10 +2439,8 @@ function assertSpan(group) { "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], "230": [0, 0.43056, 0.07514, 0, 0.71555], "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], - "305": [0, 0.43056, 0, 0.02778, 0.32246], "338": [0, 0.68333, 0.12028, 0, 0.98499], "339": [0, 0.43056, 0.07514, 0, 0.71555], - "567": [0.19444, 0.43056, 0, 0.08334, 0.38403], "710": [0, 0.69444, 0.06646, 0, 0.51111], "711": [0, 0.62847, 0.08295, 0, 0.51111], "713": [0, 0.56167, 0.10333, 0, 0.51111], @@ -2457,6 +2566,7 @@ function assertSpan(group) { "125": [0.25, 0.75, 0, 0, 0.5], "126": [0.35, 0.31786, 0, 0, 0.5], "160": [0, 0, 0, 0, 0.25], + "163": [0, 0.69444, 0, 0, 0.76909], "167": [0.19444, 0.69444, 0, 0, 0.44445], "168": [0, 0.66786, 0, 0, 0.5], "172": [0, 0.43056, 0, 0, 0.66667], @@ -2639,6 +2749,17 @@ function assertSpan(group) { "57376": [0.19444, 0.69444, 0, 0, 0] }, "Math-BoldItalic": { + "32": [0, 0, 0, 0, 0.25], + "48": [0, 0.44444, 0, 0, 0.575], + "49": [0, 0.44444, 0, 0, 0.575], + "50": [0, 0.44444, 0, 0, 0.575], + "51": [0.19444, 0.44444, 0, 0, 0.575], + "52": [0.19444, 0.44444, 0, 0, 0.575], + "53": [0.19444, 0.44444, 0, 0, 0.575], + "54": [0, 0.64444, 0, 0, 0.575], + "55": [0.19444, 0.44444, 0, 0, 0.575], + "56": [0, 0.64444, 0, 0, 0.575], + "57": [0.19444, 0.44444, 0, 0, 0.575], "65": [0, 0.68611, 0, 0, 0.86944], "66": [0, 0.68611, 0.04835, 0, 0.8664], "67": [0, 0.68611, 0.06979, 0, 0.81694], @@ -2691,6 +2812,7 @@ function assertSpan(group) { "120": [0, 0.44444, 0, 0, 0.65903], "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], "122": [0, 0.44444, 0.04213, 0, 0.55509], + "160": [0, 0, 0, 0, 0.25], "915": [0, 0.68611, 0.15972, 0, 0.65694], "916": [0, 0.68611, 0, 0, 0.95833], "920": [0, 0.68611, 0.03194, 0, 0.86722], @@ -2731,9 +2853,22 @@ function assertSpan(group) { "981": [0.19444, 0.69444, 0, 0, 0.7125], "982": [0, 0.44444, 0.03194, 0, 0.975], "1009": [0.19444, 0.44444, 0, 0, 0.6118], - "1013": [0, 0.44444, 0, 0, 0.48333] + "1013": [0, 0.44444, 0, 0, 0.48333], + "57649": [0, 0.44444, 0, 0, 0.39352], + "57911": [0.19444, 0.44444, 0, 0, 0.43889] }, "Math-Italic": { + "32": [0, 0, 0, 0, 0.25], + "48": [0, 0.43056, 0, 0, 0.5], + "49": [0, 0.43056, 0, 0, 0.5], + "50": [0, 0.43056, 0, 0, 0.5], + "51": [0.19444, 0.43056, 0, 0, 0.5], + "52": [0.19444, 0.43056, 0, 0, 0.5], + "53": [0.19444, 0.43056, 0, 0, 0.5], + "54": [0, 0.64444, 0, 0, 0.5], + "55": [0.19444, 0.43056, 0, 0, 0.5], + "56": [0, 0.64444, 0, 0, 0.5], + "57": [0.19444, 0.43056, 0, 0, 0.5], "65": [0, 0.68333, 0, 0.13889, 0.75], "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], @@ -2786,6 +2921,7 @@ function assertSpan(group) { "120": [0, 0.43056, 0, 0.02778, 0.57153], "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], + "160": [0, 0, 0, 0, 0.25], "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], "916": [0, 0.68333, 0, 0.16667, 0.83334], "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], @@ -2826,104 +2962,12 @@ function assertSpan(group) { "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], "982": [0, 0.43056, 0.02778, 0, 0.82813], "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059] - }, - "Math-Regular": { - "65": [0, 0.68333, 0, 0.13889, 0.75], - "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], - "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], - "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], - "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], - "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], - "71": [0, 0.68333, 0, 0.08334, 0.78625], - "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], - "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], - "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], - "76": [0, 0.68333, 0, 0.02778, 0.68056], - "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], - "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], - "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], - "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], - "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], - "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], - "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], - "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], - "86": [0, 0.68333, 0.22222, 0, 0.58333], - "87": [0, 0.68333, 0.13889, 0, 0.94445], - "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], - "89": [0, 0.68333, 0.22222, 0, 0.58056], - "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], - "97": [0, 0.43056, 0, 0, 0.52859], - "98": [0, 0.69444, 0, 0, 0.42917], - "99": [0, 0.43056, 0, 0.05556, 0.43276], - "100": [0, 0.69444, 0, 0.16667, 0.52049], - "101": [0, 0.43056, 0, 0.05556, 0.46563], - "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], - "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], - "104": [0, 0.69444, 0, 0, 0.57616], - "105": [0, 0.65952, 0, 0, 0.34451], - "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], - "107": [0, 0.69444, 0.03148, 0, 0.5206], - "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], - "109": [0, 0.43056, 0, 0, 0.87801], - "110": [0, 0.43056, 0, 0, 0.60023], - "111": [0, 0.43056, 0, 0.05556, 0.48472], - "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], - "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], - "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], - "115": [0, 0.43056, 0, 0.05556, 0.46875], - "116": [0, 0.61508, 0, 0.08334, 0.36111], - "117": [0, 0.43056, 0, 0.02778, 0.57246], - "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], - "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], - "120": [0, 0.43056, 0, 0.02778, 0.57153], - "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], - "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], - "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], - "916": [0, 0.68333, 0, 0.16667, 0.83334], - "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "923": [0, 0.68333, 0, 0.16667, 0.69445], - "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], - "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], - "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], - "934": [0, 0.68333, 0, 0.08334, 0.66667], - "936": [0, 0.68333, 0.11, 0.05556, 0.61222], - "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], - "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], - "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], - "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], - "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], - "949": [0, 0.43056, 0, 0.08334, 0.46632], - "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], - "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], - "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], - "953": [0, 0.43056, 0, 0.05556, 0.35394], - "954": [0, 0.43056, 0, 0, 0.57616], - "955": [0, 0.69444, 0, 0, 0.58334], - "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], - "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], - "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], - "959": [0, 0.43056, 0, 0.05556, 0.48472], - "960": [0, 0.43056, 0.03588, 0, 0.57003], - "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], - "963": [0, 0.43056, 0.03588, 0, 0.57141], - "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], - "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], - "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], - "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], - "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], - "969": [0, 0.43056, 0.03588, 0, 0.62245], - "977": [0, 0.69444, 0, 0.08334, 0.59144], - "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], - "982": [0, 0.43056, 0.02778, 0, 0.82813], - "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059] + "1013": [0, 0.43056, 0, 0.05556, 0.4059], + "57649": [0, 0.43056, 0, 0.02778, 0.32246], + "57911": [0.19444, 0.43056, 0, 0.08334, 0.38403] }, "SansSerif-Bold": { + "32": [0, 0, 0, 0, 0.25], "33": [0, 0.69444, 0, 0, 0.36667], "34": [0, 0.69444, 0, 0, 0.55834], "35": [0.19444, 0.69444, 0, 0, 0.91667], @@ -3011,6 +3055,7 @@ function assertSpan(group) { "121": [0.19444, 0.45833, 0.01528, 0, 0.5], "122": [0, 0.45833, 0, 0, 0.47639], "126": [0.35, 0.34444, 0, 0, 0.55], + "160": [0, 0, 0, 0, 0.25], "168": [0, 0.69444, 0, 0, 0.55], "176": [0, 0.69444, 0, 0, 0.73334], "180": [0, 0.69444, 0, 0, 0.55], @@ -3044,6 +3089,7 @@ function assertSpan(group) { "8221": [0, 0.69444, 0, 0, 0.55834] }, "SansSerif-Italic": { + "32": [0, 0, 0, 0, 0.25], "33": [0, 0.69444, 0.05733, 0, 0.31945], "34": [0, 0.69444, 0.00316, 0, 0.5], "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], @@ -3131,6 +3177,7 @@ function assertSpan(group) { "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], "122": [0, 0.44444, 0.08752, 0, 0.43472], "126": [0.35, 0.32659, 0.08826, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], "168": [0, 0.67937, 0.06385, 0, 0.5], "176": [0, 0.69444, 0, 0, 0.73752], "184": [0.17014, 0, 0, 0, 0.44445], @@ -3165,6 +3212,7 @@ function assertSpan(group) { "8221": [0, 0.69444, 0.00316, 0, 0.5] }, "SansSerif-Regular": { + "32": [0, 0, 0, 0, 0.25], "33": [0, 0.69444, 0, 0, 0.31945], "34": [0, 0.69444, 0, 0, 0.5], "35": [0.19444, 0.69444, 0, 0, 0.83334], @@ -3252,6 +3300,7 @@ function assertSpan(group) { "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], "122": [0, 0.44444, 0, 0, 0.43472], "126": [0.35, 0.32659, 0, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], "168": [0, 0.67937, 0, 0, 0.5], "176": [0, 0.69444, 0, 0, 0.66667], "184": [0.17014, 0, 0, 0, 0.44445], @@ -3286,6 +3335,7 @@ function assertSpan(group) { "8221": [0, 0.69444, 0, 0, 0.5] }, "Script-Regular": { + "32": [0, 0, 0, 0, 0.25], "65": [0, 0.7, 0.22925, 0, 0.80253], "66": [0, 0.7, 0.04087, 0, 0.90757], "67": [0, 0.7, 0.1689, 0, 0.66619], @@ -3311,9 +3361,11 @@ function assertSpan(group) { "87": [0, 0.7, 0.27523, 0, 0.80532], "88": [0, 0.7, 0.26006, 0, 0.94445], "89": [0, 0.7, 0.2939, 0, 0.70961], - "90": [0, 0.7, 0.24037, 0, 0.8212] + "90": [0, 0.7, 0.24037, 0, 0.8212], + "160": [0, 0, 0, 0, 0.25] }, "Size1-Regular": { + "32": [0, 0, 0, 0, 0.25], "40": [0.35001, 0.85, 0, 0, 0.45834], "41": [0.35001, 0.85, 0, 0, 0.45834], "47": [0.35001, 0.85, 0, 0, 0.57778], @@ -3322,6 +3374,7 @@ function assertSpan(group) { "93": [0.35001, 0.85, 0, 0, 0.41667], "123": [0.35001, 0.85, 0, 0, 0.58334], "125": [0.35001, 0.85, 0, 0, 0.58334], + "160": [0, 0, 0, 0, 0.25], "710": [0, 0.72222, 0, 0, 0.55556], "732": [0, 0.72222, 0, 0, 0.55556], "770": [0, 0.72222, 0, 0, 0.55556], @@ -3359,6 +3412,7 @@ function assertSpan(group) { "10758": [0.25001, 0.75, 0, 0, 0.83334] }, "Size2-Regular": { + "32": [0, 0, 0, 0, 0.25], "40": [0.65002, 1.15, 0, 0, 0.59722], "41": [0.65002, 1.15, 0, 0, 0.59722], "47": [0.65002, 1.15, 0, 0, 0.81111], @@ -3367,6 +3421,7 @@ function assertSpan(group) { "93": [0.65002, 1.15, 0, 0, 0.47222], "123": [0.65002, 1.15, 0, 0, 0.66667], "125": [0.65002, 1.15, 0, 0, 0.66667], + "160": [0, 0, 0, 0, 0.25], "710": [0, 0.75, 0, 0, 1.0], "732": [0, 0.75, 0, 0, 1.0], "770": [0, 0.75, 0, 0, 1.0], @@ -3396,6 +3451,7 @@ function assertSpan(group) { "10758": [0.55001, 1.05, 0, 0, 1.11111] }, "Size3-Regular": { + "32": [0, 0, 0, 0, 0.25], "40": [0.95003, 1.45, 0, 0, 0.73611], "41": [0.95003, 1.45, 0, 0, 0.73611], "47": [0.95003, 1.45, 0, 0, 1.04445], @@ -3404,6 +3460,7 @@ function assertSpan(group) { "93": [0.95003, 1.45, 0, 0, 0.52778], "123": [0.95003, 1.45, 0, 0, 0.75], "125": [0.95003, 1.45, 0, 0, 0.75], + "160": [0, 0, 0, 0, 0.25], "710": [0, 0.75, 0, 0, 1.44445], "732": [0, 0.75, 0, 0, 1.44445], "770": [0, 0.75, 0, 0, 1.44445], @@ -3417,6 +3474,7 @@ function assertSpan(group) { "10217": [0.95003, 1.45, 0, 0, 0.75] }, "Size4-Regular": { + "32": [0, 0, 0, 0, 0.25], "40": [1.25003, 1.75, 0, 0, 0.79167], "41": [1.25003, 1.75, 0, 0, 0.79167], "47": [1.25003, 1.75, 0, 0, 1.27778], @@ -3425,6 +3483,7 @@ function assertSpan(group) { "93": [1.25003, 1.75, 0, 0, 0.58334], "123": [1.25003, 1.75, 0, 0, 0.80556], "125": [1.25003, 1.75, 0, 0, 0.80556], + "160": [0, 0, 0, 0, 0.25], "710": [0, 0.825, 0, 0, 1.8889], "732": [0, 0.825, 0, 0, 1.8889], "770": [0, 0.825, 0, 0, 1.8889], @@ -3695,7 +3754,15 @@ var sigmasAndXis = { ptPerEm: [10.0, 10.0, 10.0], // The space between adjacent `|` columns in an array definition. From // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. - doubleRuleSep: [0.2, 0.2, 0.2] + doubleRuleSep: [0.2, 0.2, 0.2], + // The width of separator lines in {array} environments. From + // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm. + arrayRuleWidth: [0.04, 0.04, 0.04], + // Two values from LaTeX source2e: + fboxsep: [0.3, 0.3, 0.3], + // 3 pt / ptPerEm + fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm + }; // This map contains a mapping from font name and character code to character // metrics, including height, depth, italic correction, and skew (kern from the // character to the corresponding \skewchar) @@ -4129,9 +4196,10 @@ defineSymbol(symbols_math, ams, symbols_textord, "\u25A0", "\\blacksquare"); defineSymbol(symbols_math, ams, symbols_textord, "\u29EB", "\\blacklozenge"); defineSymbol(symbols_math, ams, symbols_textord, "\u2605", "\\bigstar"); defineSymbol(symbols_math, ams, symbols_textord, "\u2222", "\\sphericalangle", true); -defineSymbol(symbols_math, ams, symbols_textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 (ð) to \matheth. We map to AMS function \eth +defineSymbol(symbols_math, ams, symbols_textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 to \matheth. We map to AMS function \eth defineSymbol(symbols_math, ams, symbols_textord, "\xF0", "\\eth", true); +defineSymbol(symbols_text, main, symbols_textord, "\xF0", "\xF0"); defineSymbol(symbols_math, ams, symbols_textord, "\u2571", "\\diagup"); defineSymbol(symbols_math, ams, symbols_textord, "\u2572", "\\diagdown"); defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\square"); @@ -4147,13 +4215,13 @@ defineSymbol(symbols_math, ams, symbols_textord, "\u2136", "\\beth", true); defineSymbol(symbols_math, ams, symbols_textord, "\u2138", "\\daleth", true); defineSymbol(symbols_math, ams, symbols_textord, "\u2137", "\\gimel", true); // AMS Greek -defineSymbol(symbols_math, ams, symbols_textord, "\u03DD", "\\digamma"); +defineSymbol(symbols_math, ams, symbols_textord, "\u03DD", "\\digamma", true); defineSymbol(symbols_math, ams, symbols_textord, "\u03F0", "\\varkappa"); // AMS Delimiters -defineSymbol(symbols_math, ams, symbols_open, "\u250C", "\\ulcorner", true); -defineSymbol(symbols_math, ams, symbols_close, "\u2510", "\\urcorner", true); -defineSymbol(symbols_math, ams, symbols_open, "\u2514", "\\llcorner", true); -defineSymbol(symbols_math, ams, symbols_close, "\u2518", "\\lrcorner", true); // AMS Binary Relations +defineSymbol(symbols_math, ams, symbols_open, "\u250C", "\\@ulcorner", true); +defineSymbol(symbols_math, ams, symbols_close, "\u2510", "\\@urcorner", true); +defineSymbol(symbols_math, ams, symbols_open, "\u2514", "\\@llcorner", true); +defineSymbol(symbols_math, ams, symbols_close, "\u2518", "\\@lrcorner", true); // AMS Binary Relations defineSymbol(symbols_math, ams, rel, "\u2266", "\\leqq", true); defineSymbol(symbols_math, ams, rel, "\u2A7D", "\\leqslant", true); @@ -4381,28 +4449,22 @@ defineSymbol(symbols_math, main, bin, "\u2228", "\\lor"); defineSymbol(symbols_math, main, bin, "\u2227", "\\wedge", true); defineSymbol(symbols_math, main, bin, "\u2228", "\\vee", true); defineSymbol(symbols_math, main, symbols_textord, "\u221A", "\\surd"); -defineSymbol(symbols_math, main, symbols_open, "(", "("); -defineSymbol(symbols_math, main, symbols_open, "[", "["); defineSymbol(symbols_math, main, symbols_open, "\u27E8", "\\langle", true); defineSymbol(symbols_math, main, symbols_open, "\u2223", "\\lvert"); defineSymbol(symbols_math, main, symbols_open, "\u2225", "\\lVert"); -defineSymbol(symbols_math, main, symbols_close, ")", ")"); -defineSymbol(symbols_math, main, symbols_close, "]", "]"); defineSymbol(symbols_math, main, symbols_close, "?", "?"); defineSymbol(symbols_math, main, symbols_close, "!", "!"); defineSymbol(symbols_math, main, symbols_close, "\u27E9", "\\rangle", true); defineSymbol(symbols_math, main, symbols_close, "\u2223", "\\rvert"); defineSymbol(symbols_math, main, symbols_close, "\u2225", "\\rVert"); defineSymbol(symbols_math, main, rel, "=", "="); -defineSymbol(symbols_math, main, rel, "<", "<"); -defineSymbol(symbols_math, main, rel, ">", ">"); defineSymbol(symbols_math, main, rel, ":", ":"); defineSymbol(symbols_math, main, rel, "\u2248", "\\approx", true); defineSymbol(symbols_math, main, rel, "\u2245", "\\cong", true); defineSymbol(symbols_math, main, rel, "\u2265", "\\ge"); defineSymbol(symbols_math, main, rel, "\u2265", "\\geq", true); defineSymbol(symbols_math, main, rel, "\u2190", "\\gets"); -defineSymbol(symbols_math, main, rel, ">", "\\gt"); +defineSymbol(symbols_math, main, rel, ">", "\\gt", true); defineSymbol(symbols_math, main, rel, "\u2208", "\\in", true); defineSymbol(symbols_math, main, rel, "\uE020", "\\@not"); defineSymbol(symbols_math, main, rel, "\u2282", "\\subset", true); @@ -4415,7 +4477,7 @@ defineSymbol(symbols_math, main, rel, "\u22A8", "\\models"); defineSymbol(symbols_math, main, rel, "\u2190", "\\leftarrow", true); defineSymbol(symbols_math, main, rel, "\u2264", "\\le"); defineSymbol(symbols_math, main, rel, "\u2264", "\\leq", true); -defineSymbol(symbols_math, main, rel, "<", "\\lt"); +defineSymbol(symbols_math, main, rel, "<", "\\lt", true); defineSymbol(symbols_math, main, rel, "\u2192", "\\rightarrow", true); defineSymbol(symbols_math, main, rel, "\u2192", "\\to"); defineSymbol(symbols_math, ams, rel, "\u2271", "\\ngeq", true); @@ -4426,6 +4488,7 @@ defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\space"); // Ref: La defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\nobreakspace"); defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ "); +defineSymbol(symbols_text, main, symbols_spacing, "\xA0", " "); defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\space"); defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\nobreakspace"); @@ -4457,15 +4520,15 @@ defineSymbol(symbols_text, main, symbols_textord, "}", "\\}"); defineSymbol(symbols_text, main, symbols_textord, "}", "\\textbraceright"); defineSymbol(symbols_math, main, symbols_open, "{", "\\lbrace"); defineSymbol(symbols_math, main, symbols_close, "}", "\\rbrace"); -defineSymbol(symbols_math, main, symbols_open, "[", "\\lbrack"); -defineSymbol(symbols_text, main, symbols_textord, "[", "\\lbrack"); -defineSymbol(symbols_math, main, symbols_close, "]", "\\rbrack"); -defineSymbol(symbols_text, main, symbols_textord, "]", "\\rbrack"); -defineSymbol(symbols_math, main, symbols_open, "(", "\\lparen"); -defineSymbol(symbols_math, main, symbols_close, ")", "\\rparen"); -defineSymbol(symbols_text, main, symbols_textord, "<", "\\textless"); // in T1 fontenc +defineSymbol(symbols_math, main, symbols_open, "[", "\\lbrack", true); +defineSymbol(symbols_text, main, symbols_textord, "[", "\\lbrack", true); +defineSymbol(symbols_math, main, symbols_close, "]", "\\rbrack", true); +defineSymbol(symbols_text, main, symbols_textord, "]", "\\rbrack", true); +defineSymbol(symbols_math, main, symbols_open, "(", "\\lparen", true); +defineSymbol(symbols_math, main, symbols_close, ")", "\\rparen", true); +defineSymbol(symbols_text, main, symbols_textord, "<", "\\textless", true); // in T1 fontenc -defineSymbol(symbols_text, main, symbols_textord, ">", "\\textgreater"); // in T1 fontenc +defineSymbol(symbols_text, main, symbols_textord, ">", "\\textgreater", true); // in T1 fontenc defineSymbol(symbols_math, main, symbols_open, "\u230A", "\\lfloor", true); defineSymbol(symbols_math, main, symbols_close, "\u230B", "\\rfloor", true); @@ -4474,7 +4537,7 @@ defineSymbol(symbols_math, main, symbols_close, "\u2309", "\\rceil", true); defineSymbol(symbols_math, main, symbols_textord, "\\", "\\backslash"); defineSymbol(symbols_math, main, symbols_textord, "\u2223", "|"); defineSymbol(symbols_math, main, symbols_textord, "\u2223", "\\vert"); -defineSymbol(symbols_text, main, symbols_textord, "|", "\\textbar"); // in T1 fontenc +defineSymbol(symbols_text, main, symbols_textord, "|", "\\textbar", true); // in T1 fontenc defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\|"); defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\Vert"); @@ -4504,8 +4567,6 @@ defineSymbol(symbols_math, main, op, "\u2A02", "\\bigotimes"); defineSymbol(symbols_math, main, op, "\u2A01", "\\bigoplus"); defineSymbol(symbols_math, main, op, "\u2A00", "\\bigodot"); defineSymbol(symbols_math, main, op, "\u222E", "\\oint"); -defineSymbol(symbols_math, main, op, "\u222F", "\\oiint"); -defineSymbol(symbols_math, main, op, "\u2230", "\\oiiint"); defineSymbol(symbols_math, main, op, "\u2A06", "\\bigsqcup"); defineSymbol(symbols_math, main, op, "\u222B", "\\smallint"); defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\textellipsis"); @@ -4526,14 +4587,16 @@ defineSymbol(symbols_math, main, symbols_accent, "\u02C7", "\\check"); defineSymbol(symbols_math, main, symbols_accent, "^", "\\hat"); defineSymbol(symbols_math, main, symbols_accent, "\u20D7", "\\vec"); defineSymbol(symbols_math, main, symbols_accent, "\u02D9", "\\dot"); -defineSymbol(symbols_math, main, symbols_accent, "\u02DA", "\\mathring"); -defineSymbol(symbols_math, main, mathord, "\u0131", "\\imath", true); -defineSymbol(symbols_math, main, mathord, "\u0237", "\\jmath", true); +defineSymbol(symbols_math, main, symbols_accent, "\u02DA", "\\mathring"); // \imath and \jmath should be invariant to \mathrm, \mathbf, etc., so use PUA + +defineSymbol(symbols_math, main, mathord, "\uE131", "\\@imath"); +defineSymbol(symbols_math, main, mathord, "\uE237", "\\@jmath"); +defineSymbol(symbols_math, main, symbols_textord, "\u0131", "\u0131"); +defineSymbol(symbols_math, main, symbols_textord, "\u0237", "\u0237"); defineSymbol(symbols_text, main, symbols_textord, "\u0131", "\\i", true); defineSymbol(symbols_text, main, symbols_textord, "\u0237", "\\j", true); defineSymbol(symbols_text, main, symbols_textord, "\xDF", "\\ss", true); defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true); -defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true); defineSymbol(symbols_text, main, symbols_textord, "\u0153", "\\oe", true); defineSymbol(symbols_text, main, symbols_textord, "\xF8", "\\o", true); defineSymbol(symbols_text, main, symbols_textord, "\xC6", "\\AE", true); @@ -4570,34 +4633,31 @@ var ligatures = { "``": true, "''": true }; -defineSymbol(symbols_text, main, symbols_textord, "\u2013", "--"); +defineSymbol(symbols_text, main, symbols_textord, "\u2013", "--", true); defineSymbol(symbols_text, main, symbols_textord, "\u2013", "\\textendash"); -defineSymbol(symbols_text, main, symbols_textord, "\u2014", "---"); +defineSymbol(symbols_text, main, symbols_textord, "\u2014", "---", true); defineSymbol(symbols_text, main, symbols_textord, "\u2014", "\\textemdash"); -defineSymbol(symbols_text, main, symbols_textord, "\u2018", "`"); +defineSymbol(symbols_text, main, symbols_textord, "\u2018", "`", true); defineSymbol(symbols_text, main, symbols_textord, "\u2018", "\\textquoteleft"); -defineSymbol(symbols_text, main, symbols_textord, "\u2019", "'"); +defineSymbol(symbols_text, main, symbols_textord, "\u2019", "'", true); defineSymbol(symbols_text, main, symbols_textord, "\u2019", "\\textquoteright"); -defineSymbol(symbols_text, main, symbols_textord, "\u201C", "``"); +defineSymbol(symbols_text, main, symbols_textord, "\u201C", "``", true); defineSymbol(symbols_text, main, symbols_textord, "\u201C", "\\textquotedblleft"); -defineSymbol(symbols_text, main, symbols_textord, "\u201D", "''"); +defineSymbol(symbols_text, main, symbols_textord, "\u201D", "''", true); defineSymbol(symbols_text, main, symbols_textord, "\u201D", "\\textquotedblright"); // \degree from gensymb package defineSymbol(symbols_math, main, symbols_textord, "\xB0", "\\degree", true); defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\degree"); // \textdegree from inputenc package defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Italic defines this character "163". +// mode, but among our fonts, only Main-Regular defines this character "163". -defineSymbol(symbols_math, main, mathord, "\xA3", "\\pounds"); -defineSymbol(symbols_math, main, mathord, "\xA3", "\\mathsterling", true); -defineSymbol(symbols_text, main, mathord, "\xA3", "\\pounds"); -defineSymbol(symbols_text, main, mathord, "\xA3", "\\textsterling", true); +defineSymbol(symbols_math, main, symbols_textord, "\xA3", "\\pounds"); +defineSymbol(symbols_math, main, symbols_textord, "\xA3", "\\mathsterling", true); +defineSymbol(symbols_text, main, symbols_textord, "\xA3", "\\pounds"); +defineSymbol(symbols_text, main, symbols_textord, "\xA3", "\\textsterling", true); defineSymbol(symbols_math, ams, symbols_textord, "\u2720", "\\maltese"); -defineSymbol(symbols_text, ams, symbols_textord, "\u2720", "\\maltese"); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ "); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", " "); -defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); // There are lots of symbols which are the same, so we add them in afterwards. +defineSymbol(symbols_text, ams, symbols_textord, "\u2720", "\\maltese"); // There are lots of symbols which are the same, so we add them in afterwards. // All of these are textords in math mode var mathTextSymbols = "0123456789/@.\""; @@ -4608,7 +4668,7 @@ for (var symbols_i = 0; symbols_i < mathTextSymbols.length; symbols_i++) { } // All of these are textords in text mode -var textSymbols = "0123456789!@*()-=+[]<>|\";:?/.,"; +var textSymbols = "0123456789!@*()-=+\";:?/.,"; for (var src_symbols_i = 0; src_symbols_i < textSymbols.length; src_symbols_i++) { var _ch = textSymbols.charAt(src_symbols_i); @@ -4737,7 +4797,7 @@ for (var symbols_i4 = 0; symbols_i4 < 10; symbols_i4++) { // TODO(edemaine): Fix this. -var extraLatin = "ÇÐÞçþ"; +var extraLatin = "\xC7\xD0\xDE\xE7\xFE"; for (var _i5 = 0; _i5 < extraLatin.length; _i5++) { var _ch5 = extraLatin.charAt(_i5); @@ -4745,15 +4805,6 @@ for (var _i5 = 0; _i5 < extraLatin.length; _i5++) { defineSymbol(symbols_math, main, mathord, _ch5, _ch5); defineSymbol(symbols_text, main, symbols_textord, _ch5, _ch5); } - -defineSymbol(symbols_text, main, symbols_textord, "ð", "ð"); // Unicode versions of existing characters - -defineSymbol(symbols_text, main, symbols_textord, "\u2013", "–"); -defineSymbol(symbols_text, main, symbols_textord, "\u2014", "—"); -defineSymbol(symbols_text, main, symbols_textord, "\u2018", "‘"); -defineSymbol(symbols_text, main, symbols_textord, "\u2019", "’"); -defineSymbol(symbols_text, main, symbols_textord, "\u201C", "“"); -defineSymbol(symbols_text, main, symbols_textord, "\u201D", "”"); // CONCATENATED MODULE: ./src/wide-character.js /** * This file provides support for Unicode range U+1D400 to U+1D7FF, @@ -4775,8 +4826,8 @@ defineSymbol(symbols_text, main, symbols_textord, "\u201D", "”"); var wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright ["mathbf", "textbf", "Main-Bold"], // a-z bold upright -["mathdefault", "textit", "Math-Italic"], // A-Z italic -["mathdefault", "textit", "Math-Italic"], // a-z italic +["mathnormal", "textit", "Math-Italic"], // A-Z italic +["mathnormal", "textit", "Math-Italic"], // a-z italic ["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic ["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic // Map fancy A-Z letters to script, not calligraphic. @@ -4895,6 +4946,7 @@ function () { this.fontShape = void 0; this.sizeMultiplier = void 0; this.maxSize = void 0; + this.minRuleThickness = void 0; this._fontMetrics = void 0; this.style = data.style; this.color = data.color; @@ -4907,6 +4959,7 @@ function () { this.fontShape = data.fontShape || ''; this.sizeMultiplier = sizeMultipliers[this.size - 1]; this.maxSize = data.maxSize; + this.minRuleThickness = data.minRuleThickness; this._fontMetrics = undefined; } /** @@ -4928,7 +4981,8 @@ function () { fontFamily: this.fontFamily, fontWeight: this.fontWeight, fontShape: this.fontShape, - maxSize: this.maxSize + maxSize: this.maxSize, + minRuleThickness: this.minRuleThickness }; for (var key in extension) { @@ -5276,15 +5330,10 @@ var units_calculateSize = function calculateSize(sizeValue, options) { -// The following have to be loaded from Main-Italic font, using class mathit -var mathitLetters = ["\\imath", "ı", // dotless i -"\\jmath", "ȷ", // dotless j -"\\pounds", "\\mathsterling", "\\textsterling", "£"]; /** * Looks up the given symbol in fontMetrics, after applying any symbol * replacements defined in symbol.js */ - var buildCommon_lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this. fontName, mode) { // Replace the value with its replaced value from symbol.js @@ -5325,7 +5374,7 @@ var buildCommon_makeSymbol = function makeSymbol(value, fontName, mode, options, symbolNode = new domTree_SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes); } else { // TODO(emily): Figure out a good way to only print this in development - typeof console !== "undefined" && console.warn("No character metrics for '" + value + "' in style '" + fontName + "'"); + typeof console !== "undefined" && console.warn("No character metrics " + ("for '" + value + "' in style '" + fontName + "' and mode '" + mode + "'")); symbolNode = new domTree_SymbolNode(value, 0, 0, 0, 0, 0, classes); } @@ -5348,8 +5397,6 @@ var buildCommon_makeSymbol = function makeSymbol(value, fontName, mode, options, /** * Makes a symbol in Main-Regular or AMS-Regular. * Used for rel, bin, open, close, inner, and punct. - * - * TODO(#953): Make `options` mandatory and always pass it in. */ @@ -5365,7 +5412,7 @@ var buildCommon_mathsym = function mathsym(value, mode, options, classes) { // text ordinal and is therefore not present as a symbol in the symbols // table for text, as well as a special case for boldsymbol because it // can be used for bold + and - - if (options && options.font && options.font === "boldsymbol" && buildCommon_lookupSymbol(value, "Main-Bold", mode).metrics) { + if (options.font === "boldsymbol" && buildCommon_lookupSymbol(value, "Main-Bold", mode).metrics) { return buildCommon_makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"])); } else if (value === "\\" || src_symbols[mode][value].font === "main") { return buildCommon_makeSymbol(value, "Main-Regular", mode, options, classes); @@ -5373,54 +5420,6 @@ var buildCommon_mathsym = function mathsym(value, mode, options, classes) { return buildCommon_makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"])); } }; -/** - * Determines which of the two font names (Main-Italic and Math-Italic) and - * corresponding style tags (maindefault or mathit) to use for default math font, - * depending on the symbol. - */ - - -var buildCommon_mathdefault = function mathdefault(value, mode, options, classes) { - if (/[0-9]/.test(value.charAt(0)) || // glyphs for \imath and \jmath do not exist in Math-Italic so we - // need to use Main-Italic instead - utils.contains(mathitLetters, value)) { - return { - fontName: "Main-Italic", - fontClass: "mathit" - }; - } else { - return { - fontName: "Math-Italic", - fontClass: "mathdefault" - }; - } -}; -/** - * Determines which of the font names (Main-Italic, Math-Italic, and Caligraphic) - * and corresponding style tags (mathit, mathdefault, or mathcal) to use for font - * "mathnormal", depending on the symbol. Use this function instead of fontMap for - * font "mathnormal". - */ - - -var buildCommon_mathnormal = function mathnormal(value, mode, options, classes) { - if (utils.contains(mathitLetters, value)) { - return { - fontName: "Main-Italic", - fontClass: "mathit" - }; - } else if (/[0-9]/.test(value.charAt(0))) { - return { - fontName: "Caligraphic-Regular", - fontClass: "mathcal" - }; - } else { - return { - fontName: "Math-Italic", - fontClass: "mathdefault" - }; - } -}; /** * Determines which of the two font names (Main-Bold and Math-BoldItalic) and * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol", @@ -5429,8 +5428,8 @@ var buildCommon_mathnormal = function mathnormal(value, mode, options, classes) */ -var boldsymbol = function boldsymbol(value, mode, options, classes) { - if (buildCommon_lookupSymbol(value, "Math-BoldItalic", mode).metrics) { +var boldsymbol = function boldsymbol(value, mode, options, classes, type) { + if (type !== "textord" && buildCommon_lookupSymbol(value, "Math-BoldItalic", mode).metrics) { return { fontName: "Math-BoldItalic", fontClass: "boldsymbol" @@ -5468,13 +5467,10 @@ var buildCommon_makeOrd = function makeOrd(group, options, type) { var fontName; var fontClasses; - if (fontOrFamily === "boldsymbol" || fontOrFamily === "mathnormal") { - var fontData = fontOrFamily === "boldsymbol" ? boldsymbol(text, mode, options, classes) : buildCommon_mathnormal(text, mode, options, classes); + if (fontOrFamily === "boldsymbol") { + var fontData = boldsymbol(text, mode, options, classes, type); fontName = fontData.fontName; fontClasses = [fontData.fontClass]; - } else if (utils.contains(mathitLetters, text)) { - fontName = "Main-Italic"; - fontClasses = ["mathit"]; } else if (isFont) { fontName = fontMap[fontOrFamily].fontName; fontClasses = [fontOrFamily]; @@ -5499,8 +5495,7 @@ var buildCommon_makeOrd = function makeOrd(group, options, type) { if (type === "mathord") { - var fontLookup = buildCommon_mathdefault(text, mode, options, classes); - return buildCommon_makeSymbol(text, fontLookup.fontName, mode, options, classes.concat([fontLookup.fontClass])); + return buildCommon_makeSymbol(text, "Math-Italic", mode, options, classes.concat(["mathnormal"])); } else if (type === "textord") { var font = src_symbols[mode][text] && src_symbols[mode][text].font; @@ -5629,7 +5624,7 @@ var buildCommon_makeSvgSpan = function makeSvgSpan(classes, children, options, s var makeLineSpan = function makeLineSpan(className, options, thickness) { var line = buildCommon_makeSpan([className], [], options); - line.height = thickness || options.fontMetrics().defaultRuleThickness; + line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness); line.style.borderBottomWidth = line.height + "em"; line.maxFontSize = 1.0; return line; @@ -5918,12 +5913,13 @@ var fontMap = { variant: "italic", fontName: "Main-Italic" }, - // Default math font, "mathnormal" and "boldsymbol" are missing because they - // require the use of several fonts: Main-Italic and Math-Italic for default - // math font, Main-Italic, Math-Italic, Caligraphic for "mathnormal", and - // Math-BoldItalic and Main-Bold for "boldsymbol". This is handled by a - // special case in makeOrd which ends up calling mathdefault, mathnormal, - // and boldsymbol. + "mathnormal": { + variant: "italic", + fontName: "Math-Italic" + }, + // "boldsymbol" is missing because they require the use of multiple fonts: + // Math-BoldItalic and Main-Bold. This is handled by a special case in + // makeOrd which ends up calling boldsymbol. // families "mathbb": { variant: "double-struck", @@ -5958,7 +5954,9 @@ var svgData = { // oval to overlay the integrand oiintSize2: ["oiintSize2", 1.472, 0.659], oiiintSize1: ["oiiintSize1", 1.304, 0.499], - oiiintSize2: ["oiiintSize2", 1.98, 0.659] + oiiintSize2: ["oiiintSize2", 1.98, 0.659], + leftParenInner: ["leftParenInner", 0.875, 0.3], + rightParenInner: ["rightParenInner", 0.875, 0.3] }; var buildCommon_staticSvg = function staticSvg(value, options) { @@ -6000,88 +5998,6 @@ var buildCommon_staticSvg = function staticSvg(value, options) { svgData: svgData, tryCombineChars: buildCommon_tryCombineChars }); -// CONCATENATED MODULE: ./src/parseNode.js - - -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ -function assertNodeType(node, type) { - var typedNode = checkNodeType(node, type); - - if (!typedNode) { - throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node))); - } // $FlowFixMe: Unsure why. - - - return typedNode; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function checkNodeType(node, type) { - if (node && node.type === type) { - // The definition of ParseNode<TYPE> doesn't communicate to flow that - // `type: TYPE` (as that's not explicitly mentioned anywhere), though that - // happens to be true for all our value types. - // $FlowFixMe - return node; - } - - return null; -} -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ - -function assertAtomFamily(node, family) { - var typedNode = checkAtomFamily(node, family); - - if (!typedNode) { - throw new Error("Expected node of type \"atom\" and family \"" + family + "\", but got " + (node ? node.type === "atom" ? "atom of family " + node.family : "node of type " + node.type : String(node))); - } - - return typedNode; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function checkAtomFamily(node, family) { - return node && node.type === "atom" && node.family === family ? node : null; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function assertSymbolNodeType(node) { - var typedNode = checkSymbolNodeType(node); - - if (!typedNode) { - throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node))); - } - - return typedNode; -} -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - -function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) { - // $FlowFixMe - return node; - } - - return null; -} // CONCATENATED MODULE: ./src/spacingData.js /** * Describes spaces between different classes of atoms. @@ -6176,7 +6092,20 @@ var tightSpacings = { } }; // CONCATENATED MODULE: ./src/defineFunction.js +/** Context provided to function handlers for error messages. */ +// Note: reverse the order of the return type union will cause a flow error. +// See https://github.com/facebook/flow/issues/3663. +// More general version of `HtmlBuilder` for nodes (e.g. \sum, accent types) +// whose presence impacts super/subscripting. In this case, ParseNode<"supsub"> +// delegates its HTML building to the HtmlBuilder corresponding to these nodes. +/** + * Final function spec for use at parse time. + * This is almost identical to `FunctionPropSpec`, except it + * 1. includes the function handler, and + * 2. requires all arguments except argTypes. + * It is generated by `defineFunction()` below. + */ /** * All registered functions. @@ -6198,7 +6127,6 @@ var _htmlGroupBuilders = {}; var _mathmlGroupBuilders = {}; function defineFunction(_ref) { var type = _ref.type, - nodeType = _ref.nodeType, names = _ref.names, props = _ref.props, handler = _ref.handler, @@ -6214,15 +6142,10 @@ function defineFunction(_ref) { allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, numOptionalArgs: props.numOptionalArgs || 0, infix: !!props.infix, - consumeMode: props.consumeMode, handler: handler }; for (var i = 0; i < names.length; ++i) { - // TODO: The value type of _functions should be a type union of all - // possible `FunctionSpec<>` possibilities instead of `FunctionSpec<*>`, - // which is an existential type. - // $FlowFixMe _functions[names[i]] = data; } @@ -6261,9 +6184,8 @@ function defineFunctionBuilders(_ref2) { } // Since the corresponding buildHTML/buildMathML function expects a // list of elements, we normalize for different kinds of arguments -var defineFunction_ordargument = function ordargument(arg) { - var node = checkNodeType(arg, "ordgroup"); - return node ? node.body : [arg]; +var ordargument = function ordargument(arg) { + return arg.type === "ordgroup" ? arg.body : [arg]; }; // CONCATENATED MODULE: ./src/buildHTML.js /** @@ -6280,14 +6202,13 @@ var defineFunction_ordargument = function ordargument(arg) { - var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`) // depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6, // and the text before Rule 19. var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"]; var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"]; -var buildHTML_styleMap = { +var styleMap = { "display": src_Style.DISPLAY, "text": src_Style.TEXT, "script": src_Style.SCRIPT, @@ -6340,13 +6261,12 @@ var buildHTML_buildExpression = function buildExpression(expression, options, is var glueOptions = options; if (expression.length === 1) { - var node = checkNodeType(expression[0], "sizing") || checkNodeType(expression[0], "styling"); + var node = expression[0]; - if (!node) {// No match. - } else if (node.type === "sizing") { + if (node.type === "sizing") { glueOptions = options.havingSize(node.size); } else if (node.type === "styling") { - glueOptions = options.havingStyle(buildHTML_styleMap[node.style]); + glueOptions = options.havingStyle(styleMap[node.style]); } } // Dummy spans for determining spacings between surrounding atoms. // If `expression` has no atoms on the left or right, class "leftmost" @@ -6360,6 +6280,7 @@ var buildHTML_buildExpression = function buildExpression(expression, options, is // Before determining what spaces to insert, perform bin cancellation. // Binary operators change to ordinary symbols in some contexts. + var isRoot = isRealGroup === "root"; traverseNonSpaceNodes(groups, function (node, prev) { var prevType = prev.classes[0]; var type = node.classes[0]; @@ -6371,7 +6292,7 @@ var buildHTML_buildExpression = function buildExpression(expression, options, is } }, { node: dummyPrev - }, dummyNext); + }, dummyNext, isRoot); traverseNonSpaceNodes(groups, function (node, prev) { var prevType = getTypeOfDomTree(prev); var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style. @@ -6384,7 +6305,7 @@ var buildHTML_buildExpression = function buildExpression(expression, options, is } }, { node: dummyPrev - }, dummyNext); + }, dummyNext, isRoot); return groups; }; // Depth-first traverse non-space `nodes`, calling `callback` with the current and // previous node as arguments, optionally returning a node to insert after the @@ -6392,7 +6313,7 @@ var buildHTML_buildExpression = function buildExpression(expression, options, is // function to insert after it. `next` is a node that will be added to the right. // Used for bin cancellation and inserting spacings. -var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next) { +var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) { if (next) { // temporarily append the right node, if exists nodes.push(next); @@ -6406,29 +6327,34 @@ var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev if (partialGroup) { // Recursive DFS - traverseNonSpaceNodes(partialGroup.children, callback, prev); + // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array + traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot); continue; } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit // spacing should go between atoms of different classes - if (node.classes[0] === "mspace") { - continue; - } + var nonspace = !node.hasClass("mspace"); - var result = callback(node, prev.node); + if (nonspace) { + var result = callback(node, prev.node); - if (result) { - if (prev.insertAfter) { - prev.insertAfter(result); - } else { - // insert at front - nodes.unshift(result); - i++; + if (result) { + if (prev.insertAfter) { + prev.insertAfter(result); + } else { + // insert at front + nodes.unshift(result); + i++; + } } } - prev.node = node; + if (nonspace) { + prev.node = node; + } else if (isRoot && node.hasClass("newline")) { + prev.node = buildHTML_makeSpan(["leftmost"]); // treat like beginning of line + } prev.insertAfter = function (index) { return function (n) { @@ -6445,7 +6371,7 @@ var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev var buildHTML_checkPartialGroup = function checkPartialGroup(node) { - if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor) { + if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor || node instanceof domTree_Span && node.hasClass("enclosing")) { return node; } @@ -6530,10 +6456,6 @@ function buildHTMLUnbreakable(children, options) { var body = buildHTML_makeSpan(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at // the height of the expression, and the bottom of the HTML element // falls at the depth of the expression. - // We used to have separate top and bottom struts, where the bottom strut - // would like to use `vertical-align: top`, but in IE 9 this lowers the - // baseline of the box to the bottom of this strut (instead of staying in - // the normal place) so we use an absolute value for vertical-align instead. var strut = buildHTML_makeSpan(["strut"]); strut.style.height = body.height + body.depth + "em"; @@ -6557,7 +6479,7 @@ function buildHTML(tree, options) { } // Build the expression contained in the tree - var expression = buildHTML_buildExpression(tree, options, true); + var expression = buildHTML_buildExpression(tree, options, "root"); var children = []; // Create one base node for each chunk between potential line breaks. // The TeXBook [p.173] says "A formula will be broken only after a // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary @@ -6945,7 +6867,20 @@ var buildMathML_getVariant = function getVariant(group, options) { if (font === "mathit") { return "italic"; } else if (font === "boldsymbol") { - return "bold-italic"; + return group.type === "textord" ? "bold" : "bold-italic"; + } else if (font === "mathbf") { + return "bold"; + } else if (font === "mathbb") { + return "double-struck"; + } else if (font === "mathfrak") { + return "fraktur"; + } else if (font === "mathscr" || font === "mathcal") { + // MathML makes no distinction between script and caligrahpic + return "script"; + } else if (font === "mathsf") { + return "sans-serif"; + } else if (font === "mathtt") { + return "monospace"; } var text = group.text; @@ -6972,42 +6907,55 @@ var buildMathML_getVariant = function getVariant(group, options) { * <mtext> tag. */ -var buildMathML_buildExpression = function buildExpression(expression, options) { +var buildMathML_buildExpression = function buildExpression(expression, options, isOrdgroup) { + if (expression.length === 1) { + var group = buildMathML_buildGroup(expression[0], options); + + if (isOrdgroup && group instanceof mathMLTree_MathNode && group.type === "mo") { + // When TeX writers want to suppress spacing on an operator, + // they often put the operator by itself inside braces. + group.setAttribute("lspace", "0em"); + group.setAttribute("rspace", "0em"); + } + + return [group]; + } + var groups = []; var lastGroup; for (var i = 0; i < expression.length; i++) { - var group = buildMathML_buildGroup(expression[i], options); + var _group = buildMathML_buildGroup(expression[i], options); - if (group instanceof mathMLTree_MathNode && lastGroup instanceof mathMLTree_MathNode) { + if (_group instanceof mathMLTree_MathNode && lastGroup instanceof mathMLTree_MathNode) { // Concatenate adjacent <mtext>s - if (group.type === 'mtext' && lastGroup.type === 'mtext' && group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) { + if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) { var _lastGroup$children; - (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, group.children); + (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, _group.children); continue; // Concatenate adjacent <mn>s - } else if (group.type === 'mn' && lastGroup.type === 'mn') { + } else if (_group.type === 'mn' && lastGroup.type === 'mn') { var _lastGroup$children2; - (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, group.children); + (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, _group.children); continue; // Concatenate <mn>...</mn> followed by <mi>.</mi> - } else if (group.type === 'mi' && group.children.length === 1 && lastGroup.type === 'mn') { - var child = group.children[0]; + } else if (_group.type === 'mi' && _group.children.length === 1 && lastGroup.type === 'mn') { + var child = _group.children[0]; if (child instanceof mathMLTree_TextNode && child.text === '.') { var _lastGroup$children3; - (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, group.children); + (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, _group.children); continue; } } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) { var lastChild = lastGroup.children[0]; - if (lastChild instanceof mathMLTree_TextNode && lastChild.text === "\u0338" && (group.type === 'mo' || group.type === 'mi' || group.type === 'mn')) { - var _child = group.children[0]; + if (lastChild instanceof mathMLTree_TextNode && lastChild.text === "\u0338" && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) { + var _child = _group.children[0]; if (_child instanceof mathMLTree_TextNode && _child.text.length > 0) { // Overlay with combining character long solidus @@ -7018,8 +6966,8 @@ var buildMathML_buildExpression = function buildExpression(expression, options) } } - groups.push(group); - lastGroup = group; + groups.push(_group); + lastGroup = _group; } return groups; @@ -7029,8 +6977,8 @@ var buildMathML_buildExpression = function buildExpression(expression, options) * if there's more than one. Returns a single node instead of an array. */ -var buildExpressionRow = function buildExpressionRow(expression, options) { - return buildMathML_makeRow(buildMathML_buildExpression(expression, options)); +var buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) { + return buildMathML_makeRow(buildMathML_buildExpression(expression, options, isOrdgroup)); }; /** * Takes a group from the parser and calls the appropriate groupBuilders function @@ -7059,7 +7007,7 @@ var buildMathML_buildGroup = function buildGroup(group, options) { * we can do appropriate styling. */ -function buildMathML(tree, texExpression, options) { +function buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) { var expression = buildMathML_buildExpression(tree, options); // Wrap up the expression in an mrow so it is presented in the semantics // tag correctly, unless it's a single <mrow> or <mtable>. @@ -7075,13 +7023,20 @@ function buildMathML(tree, texExpression, options) { var annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]); annotation.setAttribute("encoding", "application/x-tex"); var semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - var math = new mathMLTree.MathNode("math", [semantics]); // You can't style <math> nodes, so we wrap the node in a span. + var math = new mathMLTree.MathNode("math", [semantics]); + math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); + + if (isDisplayMode) { + math.setAttribute("display", "block"); + } // You can't style <math> nodes, so we wrap the node in a span. // NOTE: The span class is not typed to have <math> nodes as children, and // we don't want to make the children type more generic since the children // of span are expected to have more fields in `buildHtml` contexts. - // $FlowFixMe - return buildCommon.makeSpan(["katex-mathml"], [math]); + + var wrapperClass = forMathmlOnly ? "katex" : "katex-mathml"; // $FlowFixMe + + return buildCommon.makeSpan([wrapperClass], [math]); } // CONCATENATED MODULE: ./src/buildTree.js @@ -7094,7 +7049,8 @@ function buildMathML(tree, texExpression, options) { var buildTree_optionsFromSettings = function optionsFromSettings(settings) { return new src_Options({ style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT, - maxSize: settings.maxSize + maxSize: settings.maxSize, + minRuleThickness: settings.minRuleThickness }); }; @@ -7118,9 +7074,21 @@ var buildTree_displayWrap = function displayWrap(node, settings) { var buildTree_buildTree = function buildTree(tree, expression, settings) { var options = buildTree_optionsFromSettings(settings); - var mathMLNode = buildMathML(tree, expression, options); - var htmlNode = buildHTML(tree, options); - var katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, htmlNode]); + var katexNode; + + if (settings.output === "mathml") { + return buildMathML(tree, expression, options, settings.displayMode, true); + } else if (settings.output === "html") { + var htmlNode = buildHTML(tree, options); + katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); + } else { + var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false); + + var _htmlNode = buildHTML(tree, options); + + katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, _htmlNode]); + } + return buildTree_displayWrap(katexNode, settings); }; var buildTree_buildHTMLTree = function buildHTMLTree(tree, expression, settings) { @@ -7474,6 +7442,47 @@ var stretchy_encloseSpan = function encloseSpan(inner, label, pad, options) { mathMLnode: stretchy_mathMLnode, svgSpan: stretchy_svgSpan }); +// CONCATENATED MODULE: ./src/parseNode.js + + +/** + * Asserts that the node is of the given type and returns it with stricter + * typing. Throws if the node's type does not match. + */ +function assertNodeType(node, type) { + if (!node || node.type !== type) { + throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node))); + } + + return node; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function assertSymbolNodeType(node) { + var typedNode = checkSymbolNodeType(node); + + if (!typedNode) { + throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node))); + } + + return typedNode; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function checkSymbolNodeType(node) { + if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) { + // $FlowFixMe + return node; + } + + return null; +} // CONCATENATED MODULE: ./src/functions/accent.js @@ -7489,10 +7498,9 @@ var accent_htmlBuilder = function htmlBuilder(grp, options) { // Accents are handled in the TeXbook pg. 443, rule 12. var base; var group; - var supSub = checkNodeType(grp, "supsub"); var supSubGroup; - if (supSub) { + if (grp && grp.type === "supsub") { // If our base is a character box, and we have superscripts and // subscripts, the supsub will defer to us. In particular, we want // to attach the superscripts and subscripts to the inner body (so @@ -7501,16 +7509,16 @@ var accent_htmlBuilder = function htmlBuilder(grp, options) { // sticking the base of the accent into the base of the supsub, and // rendering that, while keeping track of where the accent is. // The real accent group is the base of the supsub group - group = assertNodeType(supSub.base, "accent"); // The character box is the base of the accent group + group = assertNodeType(grp.base, "accent"); // The character box is the base of the accent group base = group.base; // Stick the character box into the base of the supsub group - supSub.base = base; // Rerender the supsub group with its new base, and store that + grp.base = base; // Rerender the supsub group with its new base, and store that // result. - supSubGroup = assertSpan(buildHTML_buildGroup(supSub, options)); // reset original base + supSubGroup = assertSpan(buildHTML_buildGroup(grp, options)); // reset original base - supSub.base = group; + grp.base = group; } else { group = assertNodeType(grp, "accent"); base = group.base; @@ -7558,7 +7566,11 @@ var accent_htmlBuilder = function htmlBuilder(grp, options) { accent = buildCommon.staticSvg("vec", options); width = buildCommon.svgData.vec[1]; } else { - accent = buildCommon.makeSymbol(group.label, "Main-Regular", group.mode, options); // Remove the italic correction of the accent, because it only serves to + accent = buildCommon.makeOrd({ + mode: group.mode, + text: group.label + }, options, "textord"); + accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to // shift the accent over to a place we don't want. accent.italic = 0; @@ -7730,8 +7742,8 @@ defineFunction({ var kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns var vlist = buildCommon.makeVList({ - positionType: "bottom", - positionData: accentBody.height + kern, + positionType: "top", + positionData: innerGroup.height, children: [{ type: "elem", elem: accentBody, @@ -7967,7 +7979,7 @@ defineFunction({ type: "color", mode: parser.mode, color: color, - body: defineFunction_ordargument(body) + body: ordargument(body) }; }, htmlBuilder: color_htmlBuilder, @@ -7985,7 +7997,12 @@ defineFunction({ handler: function handler(_ref2, args) { var parser = _ref2.parser, breakOnTokenText = _ref2.breakOnTokenText; - var color = assertNodeType(args[0], "color-token").color; // If we see a styling function, parse out the implicit body + var color = assertNodeType(args[0], "color-token").color; // Set macro \current@color in current namespace to store the current + // color, mimicking the behavior of color.sty. + // This is currently used just to correctly color a \right + // that follows a \color command. + + parser.gullet.macros.set("\\current@color", color); // Parse out the implicit body that should be colored. var body = parser.parseExpression(true, breakOnTokenText); return { @@ -8075,6 +8092,203 @@ defineFunction({ return node; } }); +// CONCATENATED MODULE: ./src/functions/def.js + + + +var globalMap = { + "\\global": "\\global", + "\\long": "\\\\globallong", + "\\\\globallong": "\\\\globallong", + "\\def": "\\gdef", + "\\gdef": "\\gdef", + "\\edef": "\\xdef", + "\\xdef": "\\xdef", + "\\let": "\\\\globallet", + "\\futurelet": "\\\\globalfuture" +}; + +var def_checkControlSequence = function checkControlSequence(tok) { + var name = tok.text; + + if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { + throw new src_ParseError("Expected a control sequence", tok); + } + + return name; +}; + +var getRHS = function getRHS(parser) { + var tok = parser.gullet.popToken(); + + if (tok.text === "=") { + // consume optional equals + tok = parser.gullet.popToken(); + + if (tok.text === " ") { + // consume one optional space + tok = parser.gullet.popToken(); + } + } + + return tok; +}; + +var letCommand = function letCommand(parser, name, tok, global) { + var macro = parser.gullet.macros.get(tok.text); + + if (macro == null) { + // don't expand it later even if a macro with the same name is defined + // e.g., \let\foo=\frac \def\frac{\relax} \frac12 + tok.noexpand = true; + macro = { + tokens: [tok], + numArgs: 0, + // reproduce the same behavior in expansion + unexpandable: !parser.gullet.isExpandable(tok.text) + }; + } + + parser.gullet.macros.set(name, macro, global); +}; // <assignment> -> <non-macro assignment>|<macro assignment> +// <non-macro assignment> -> <simple assignment>|\global<non-macro assignment> +// <macro assignment> -> <definition>|<prefix><macro assignment> +// <prefix> -> \global|\long|\outer + + +defineFunction({ + type: "internal", + names: ["\\global", "\\long", "\\\\globallong"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref) { + var parser = _ref.parser, + funcName = _ref.funcName; + parser.consumeSpaces(); + var token = parser.fetch(); + + if (globalMap[token.text]) { + // KaTeX doesn't have \par, so ignore \long + if (funcName === "\\global" || funcName === "\\\\globallong") { + token.text = globalMap[token.text]; + } + + return assertNodeType(parser.parseFunction(), "internal"); + } + + throw new src_ParseError("Invalid token after macro prefix", token); + } +}); // Basic support for macro definitions: \def, \gdef, \edef, \xdef +// <definition> -> <def><control sequence><definition text> +// <def> -> \def|\gdef|\edef|\xdef +// <definition text> -> <parameter text><left brace><balanced text><right brace> + +defineFunction({ + type: "internal", + names: ["\\def", "\\gdef", "\\edef", "\\xdef"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref2) { + var parser = _ref2.parser, + funcName = _ref2.funcName; + var arg = parser.gullet.consumeArgs(1)[0]; + + if (arg.length !== 1) { + throw new src_ParseError("\\gdef's first argument must be a macro name"); + } + + var name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ... + + var numArgs = 0; + arg = parser.gullet.consumeArgs(1)[0]; + + while (arg.length === 1 && arg[0].text === "#") { + arg = parser.gullet.consumeArgs(1)[0]; + + if (arg.length !== 1) { + throw new src_ParseError("Invalid argument number length \"" + arg.length + "\""); + } + + if (!/^[1-9]$/.test(arg[0].text)) { + throw new src_ParseError("Invalid argument number \"" + arg[0].text + "\""); + } + + numArgs++; + + if (parseInt(arg[0].text) !== numArgs) { + throw new src_ParseError("Argument number \"" + arg[0].text + "\" out of order"); + } + + arg = parser.gullet.consumeArgs(1)[0]; + } + + if (funcName === "\\edef" || funcName === "\\xdef") { + arg = parser.gullet.expandTokens(arg); + arg.reverse(); // to fit in with stack order + } // Final arg is the expansion of the macro + + + parser.gullet.macros.set(name, { + tokens: arg, + numArgs: numArgs + }, funcName === globalMap[funcName]); + return { + type: "internal", + mode: parser.mode + }; + } +}); // <simple assignment> -> <let assignment> +// <let assignment> -> \futurelet<control sequence><token><token> +// | \let<control sequence><equals><one optional space><token> +// <equals> -> <optional spaces>|<optional spaces>= + +defineFunction({ + type: "internal", + names: ["\\let", "\\\\globallet"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref3) { + var parser = _ref3.parser, + funcName = _ref3.funcName; + var name = def_checkControlSequence(parser.gullet.popToken()); + parser.gullet.consumeSpaces(); + var tok = getRHS(parser); + letCommand(parser, name, tok, funcName === "\\\\globallet"); + return { + type: "internal", + mode: parser.mode + }; + } +}); // ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf + +defineFunction({ + type: "internal", + names: ["\\futurelet", "\\\\globalfuture"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref4) { + var parser = _ref4.parser, + funcName = _ref4.funcName; + var name = def_checkControlSequence(parser.gullet.popToken()); + var middle = parser.gullet.popToken(); + var tok = parser.gullet.popToken(); + letCommand(parser, name, tok, funcName === "\\\\globalfuture"); + parser.gullet.pushToken(tok); + parser.gullet.pushToken(middle); + return { + type: "internal", + mode: parser.mode + }; + } +}); // CONCATENATED MODULE: ./src/delimiter.js /** * This file deals with creating delimiters of various sizes. The TeXbook @@ -8105,6 +8319,7 @@ defineFunction({ + /** * Get the metrics for a given symbol and font, after transformation (i.e. * after following replacement from symbols.js) @@ -8208,13 +8423,18 @@ var delimiter_makeInner = function makeInner(symbol, font, mode) { type: "elem", elem: inner }; +}; // Helper for makeStackedDelim + + +var lap = { + type: "kern", + size: -0.005 }; /** * Make a stacked delimiter out of a given delimiter, with the total height at * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook. */ - var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) { // There are four parts, the top, an optional middle, a repeated part, and a // bottom. @@ -8335,7 +8555,7 @@ var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, c var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need - var repeatCount = Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal)); // Compute the total height of the delimiter including all the symbols + var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note // that in this context, "center" means that the delimiter should be @@ -8349,7 +8569,15 @@ var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, c } // Calculate the depth - var depth = realHeightTotal / 2 - axisHeight; // Now, we start building the pieces that will go into the vlist + var depth = realHeightTotal / 2 - axisHeight; // This function differs from the TeX procedure in one way. + // We shift each repeat element downwards by 0.005em, to prevent a gap + // due to browser floating point rounding error. + // Then, at the last element-to element joint, we add one extra repeat + // element to cover the gap created by the shifts. + // Find the shift needed to align the upper end of the extra element at a point + // 0.005em above the lower end of the top element. + + var shiftOfExtraElement = (repeatCount + 1) * 0.005 - repeatHeightTotal; // Now, we start building the pieces that will go into the vlist // Keep a list of the inner pieces var inners = []; // Add the bottom symbol @@ -8359,20 +8587,61 @@ var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, c if (middle === null) { // Add that many symbols for (var i = 0; i < repeatCount; i++) { + inners.push(lap); // overlap + inners.push(delimiter_makeInner(repeat, font, mode)); } } else { // When there is a middle bit, we need the middle part and two repeated // sections for (var _i = 0; _i < repeatCount; _i++) { + inners.push(lap); inners.push(delimiter_makeInner(repeat, font, mode)); - } + } // Insert one extra repeat element. + + + inners.push({ + type: "kern", + size: shiftOfExtraElement + }); + inners.push(delimiter_makeInner(repeat, font, mode)); + inners.push(lap); // Now insert the middle of the brace. inners.push(delimiter_makeInner(middle, font, mode)); for (var _i2 = 0; _i2 < repeatCount; _i2++) { + inners.push(lap); inners.push(delimiter_makeInner(repeat, font, mode)); } + } // To cover the gap create by the overlaps, insert one more repeat element, + // at a position that juts 0.005 above the bottom of the top element. + + + if ((repeat === "\u239C" || repeat === "\u239F") && repeatCount === 0) { + // Parentheses need a short repeat element in order to avoid an overrun. + // We'll make a 0.3em tall element from a SVG. + var overlap = buildCommon.svgData.leftParenInner[2] / 2; + inners.push({ + type: "kern", + size: -overlap + }); + var pathName = repeat === "\u239C" ? "leftParenInner" : "rightParenInner"; + var innerSpan = buildCommon.staticSvg(pathName, options); + inners.push({ + type: "elem", + elem: innerSpan + }); + inners.push({ + type: "kern", + size: -overlap + }); + } else { + inners.push({ + type: "kern", + size: shiftOfExtraElement + }); + inners.push(delimiter_makeInner(repeat, font, mode)); + inners.push(lap); } // Add the top symbol @@ -8393,19 +8662,9 @@ var vbPad = 80; // padding above the surd, measured inside the viewBox. var emPad = 0.08; // padding, in ems, measured in the document. -var delimiter_sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, options) { - var alternate; - - if (sqrtName === "sqrtTall") { - // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular - // One path edge has a variable length. It runs from the viniculumn - // to a point near (14 units) the bottom of the surd. The viniculum - // is 40 units thick. So the length of the line in question is: - var vertSegment = viewBoxHeight - 54 - vbPad; - alternate = "M702 " + vbPad + "H400000v40H742v" + vertSegment + "l-4 4-4 4c-.667.7\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 " + vbPad + "H400000v40H742z"; - } - - var pathNode = new domTree_PathNode(sqrtName, alternate); +var delimiter_sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) { + var path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight); + var pathNode = new domTree_PathNode(sqrtName, path); var svg = new SvgNode([pathNode], { // Note: 1000:1 ratio of viewBox to document em width. "width": "400em", @@ -8427,7 +8686,10 @@ var makeSqrtImage = function makeSqrtImage(height, options) { var delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions); var sizeMultiplier = newOptions.sizeMultiplier; // default - // Create a span containing an SVG image of a sqrt symbol. + // The standard sqrt SVGs each have a 0.04em thick viniculum. + // If Settings.minRuleThickness is larger than that, we add extraViniculum. + + var extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol. var span; var spanHeight = 0; @@ -8441,7 +8703,8 @@ var makeSqrtImage = function makeSqrtImage(height, options) { if (delim.type === "small") { // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. - viewBoxHeight = 1000 + vbPad; // 1000 unit glyph height. + // 1000 unit normal glyph height. + viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad; if (height < 1.0) { sizeMultiplier = 1.0; // mimic a \textfont radical @@ -8449,26 +8712,26 @@ var makeSqrtImage = function makeSqrtImage(height, options) { sizeMultiplier = 0.7; // mimic a \scriptfont radical } - spanHeight = (1.0 + emPad) / sizeMultiplier; - texHeight = 1.00 / sizeMultiplier; - span = delimiter_sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, options); + spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier; + texHeight = (1.00 + extraViniculum) / sizeMultiplier; + span = delimiter_sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, extraViniculum, options); span.style.minWidth = "0.853em"; advanceWidth = 0.833 / sizeMultiplier; // from the font. } else if (delim.type === "large") { // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size]; - texHeight = sizeToMaxHeight[delim.size] / sizeMultiplier; - spanHeight = (sizeToMaxHeight[delim.size] + emPad) / sizeMultiplier; - span = delimiter_sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, options); + texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier; + spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier; + span = delimiter_sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options); span.style.minWidth = "1.02em"; advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font. } else { // Tall sqrt. In TeX, this would be stacked using multiple glyphs. // We'll use a single SVG to accomplish the same thing. - spanHeight = height + emPad; - texHeight = height; - viewBoxHeight = Math.floor(1000 * height) + vbPad; - span = delimiter_sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, options); + spanHeight = height + extraViniculum + emPad; + texHeight = height + extraViniculum; + viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad; + span = delimiter_sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, extraViniculum, options); span.style.minWidth = "0.742em"; advanceWidth = 1.056; } @@ -8482,7 +8745,7 @@ var makeSqrtImage = function makeSqrtImage(height, options) { // This actually should depend on the chosen font -- e.g. \boldmath // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and // have thicker rules. - ruleWidth: options.fontMetrics().sqrtRuleThickness * sizeMultiplier + ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier }; }; // There are three kinds of delimiters, delimiters that stack when they become // too large @@ -8804,8 +9067,10 @@ function checkDelimiter(delim, context) { if (symDelim && utils.contains(delimiters, symDelim.text)) { return symDelim; + } else if (symDelim) { + throw new src_ParseError("Invalid delimiter '" + symDelim.text + "' after '" + context.funcName + "'", delim); } else { - throw new src_ParseError("Invalid delimiter: '" + (symDelim ? symDelim.text : JSON.stringify(delim)) + "' after '" + context.funcName + "'", delim); + throw new src_ParseError("Invalid delimiter type '" + delim.type + "'", delim); } } @@ -8874,10 +9139,18 @@ defineFunction({ // \left case below triggers parsing of \right in // `const right = parser.parseFunction();` // uses this return value. + var color = context.parser.gullet.macros.get("\\current@color"); + + if (color && typeof color !== "string") { + throw new src_ParseError("\\current@color set to non-string in \\right"); + } + return { type: "leftright-right", mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text + delim: checkDelimiter(args[0], context).text, + color: color // undefined if not set via \color + }; } }); @@ -8903,7 +9176,8 @@ defineFunction({ mode: parser.mode, body: body, left: delim.text, - right: right.delim + right: right.delim, + rightColor: right.color }; }, htmlBuilder: function htmlBuilder(group, options) { @@ -8960,12 +9234,13 @@ defineFunction({ } } - var rightDelim; // Same for the right delimiter + var rightDelim; // Same for the right delimiter, but using color specified by \color if (group.right === ".") { rightDelim = makeNullDelimiter(options, ["mclose"]); } else { - rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, options, group.mode, ["mclose"]); + var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options; + rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, ["mclose"]); } // Add it to the end of the expression. @@ -8985,6 +9260,11 @@ defineFunction({ if (group.right !== ".") { var rightNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.right, group.mode)]); rightNode.setAttribute("fence", "true"); + + if (group.rightColor) { + rightNode.setAttribute("mathcolor", group.rightColor); + } + inner.push(rightNode); } @@ -9087,16 +9367,25 @@ var enclose_htmlBuilder = function htmlBuilder(group, options) { } // Add vertical padding - var vertPad = 0; // ref: LaTeX source2e: \fboxsep = 3pt; \fboxrule = .4pt - // ref: cancel package: \advance\totalheight2\p@ % "+2" + var vertPad = 0; + var ruleThickness = 0; // ref: cancel package: \advance\totalheight2\p@ % "+2" if (/box/.test(label)) { - vertPad = label === "colorbox" ? 0.3 : 0.34; + ruleThickness = Math.max(options.fontMetrics().fboxrule, // default + options.minRuleThickness // User override. + ); + vertPad = options.fontMetrics().fboxsep + (label === "colorbox" ? 0 : ruleThickness); } else { vertPad = isSingleChar ? 0.2 : 0; } img = stretchy.encloseSpan(inner, label, vertPad, options); + + if (/fbox|boxed|fcolorbox/.test(label)) { + img.style.borderStyle = "solid"; + img.style.borderWidth = ruleThickness + "em"; + } + imgShift = inner.depth + vertPad; if (group.backgroundColor) { @@ -9157,6 +9446,7 @@ var enclose_htmlBuilder = function htmlBuilder(group, options) { }; var enclose_mathmlBuilder = function mathmlBuilder(group, options) { + var fboxsep = 0; var node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildMathML_buildGroup(group.body, options)]); switch (group.label) { @@ -9180,14 +9470,17 @@ var enclose_mathmlBuilder = function mathmlBuilder(group, options) { case "\\colorbox": // <menclose> doesn't have a good notation option. So use <mpadded> // instead. Set some attributes that come included with <menclose>. - node.setAttribute("width", "+6pt"); - node.setAttribute("height", "+6pt"); - node.setAttribute("lspace", "3pt"); // LaTeX source2e: \fboxsep = 3pt + fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm; + node.setAttribute("width", "+" + 2 * fboxsep + "pt"); + node.setAttribute("height", "+" + 2 * fboxsep + "pt"); + node.setAttribute("lspace", fboxsep + "pt"); // - node.setAttribute("voffset", "3pt"); + node.setAttribute("voffset", fboxsep + "pt"); if (group.label === "\\fcolorbox") { - var thk = options.fontMetrics().defaultRuleThickness; + var thk = Math.max(options.fontMetrics().fboxrule, // default + options.minRuleThickness // user override + ); node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor)); } @@ -9262,7 +9555,7 @@ defineFunction({ names: ["\\fbox"], props: { numArgs: 1, - argTypes: ["text"], + argTypes: ["hbox"], allowedInText: true }, handler: function handler(_ref3, args) { @@ -9350,18 +9643,19 @@ function defineEnvironment(_ref) { + function getHLines(parser) { // Return an array. The array length = number of hlines. // Each element in the array tells if the line is dashed. var hlineInfo = []; parser.consumeSpaces(); - var nxt = parser.nextToken.text; + var nxt = parser.fetch().text; while (nxt === "\\hline" || nxt === "\\hdashline") { parser.consume(); hlineInfo.push(nxt === "\\hdashline"); parser.consumeSpaces(); - nxt = parser.nextToken.text; + nxt = parser.fetch().text; } return hlineInfo; @@ -9397,8 +9691,10 @@ function parseArray(parser, _ref, style) { throw new src_ParseError("Invalid \\arraystretch: " + stretch); } } - } + } // Start group for first cell + + parser.gullet.beginGroup(); var row = []; var body = [row]; var rowGaps = []; @@ -9408,7 +9704,10 @@ function parseArray(parser, _ref, style) { while (true) { // eslint-disable-line no-constant-condition + // Parse each cell in its own group (namespace) var cell = parser.parseExpression(false, "\\cr"); + parser.gullet.endGroup(); + parser.gullet.beginGroup(); cell = { type: "ordgroup", mode: parser.mode, @@ -9425,7 +9724,7 @@ function parseArray(parser, _ref, style) { } row.push(cell); - var next = parser.nextToken.text; + var next = parser.fetch().text; if (next === "&") { parser.consume(); @@ -9452,7 +9751,10 @@ function parseArray(parser, _ref, style) { } else { throw new src_ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); } - } + } // End cell group + + + parser.gullet.endGroup(); // End array group defining \\ parser.gullet.endGroup(); return { @@ -9486,11 +9788,24 @@ var array_htmlBuilder = function htmlBuilder(group, options) { var hLinesBeforeRow = group.hLinesBeforeRow; var nc = 0; var body = new Array(nr); - var hlines = []; // Horizontal spacing + var hlines = []; + var ruleThickness = Math.max( // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em. + options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override. + ); // Horizontal spacing var pt = 1 / options.fontMetrics().ptPerEm; - var arraycolsep = 5 * pt; // \arraycolsep in article.cls - // Vertical spacing + var arraycolsep = 5 * pt; // default value, i.e. \arraycolsep in article.cls + + if (group.colSeparationType && group.colSeparationType === "small") { + // We're in a {smallmatrix}. Default column space is \thickspace, + // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}. + // But that needs adjustment because LaTeX applies \scriptstyle to the + // entire array, including the colspace, but this function applies + // \scriptstyle only inside each element. + var localMultiplier = options.havingStyle(src_Style.SCRIPT).sizeMultiplier; + arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier); + } // Vertical spacing + var baselineskip = 12 * pt; // see size10.clo // Default \jot from ltmath.dtx @@ -9602,17 +9917,15 @@ var array_htmlBuilder = function htmlBuilder(group, options) { cols.push(colSep); } - if (colDescr.separator === "|") { + if (colDescr.separator === "|" || colDescr.separator === ":") { + var lineType = colDescr.separator === "|" ? "solid" : "dashed"; var separator = buildCommon.makeSpan(["vertical-separator"], [], options); separator.style.height = totalHeight + "em"; + separator.style.borderRightWidth = ruleThickness + "em"; + separator.style.borderRightStyle = lineType; + separator.style.margin = "0 -" + ruleThickness / 2 + "em"; separator.style.verticalAlign = -(totalHeight - offset) + "em"; cols.push(separator); - } else if (colDescr.separator === ":") { - var _separator = buildCommon.makeSpan(["vertical-separator", "vs-dashed"], [], options); - - _separator.style.height = totalHeight + "em"; - _separator.style.verticalAlign = -(totalHeight - offset) + "em"; - cols.push(_separator); } else { throw new src_ParseError("Invalid separator type: " + colDescr.separator); } @@ -9679,8 +9992,8 @@ var array_htmlBuilder = function htmlBuilder(group, options) { body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any. if (hlines.length > 0) { - var line = buildCommon.makeLineSpan("hline", options, 0.05); - var dashes = buildCommon.makeLineSpan("hdashline", options, 0.05); + var line = buildCommon.makeLineSpan("hline", options, ruleThickness); + var dashes = buildCommon.makeLineSpan("hdashline", options, ruleThickness); var vListElems = [{ type: "elem", elem: body, @@ -9737,14 +10050,15 @@ var array_mathmlBuilder = function mathmlBuilder(group, options) { // The 0.16 and 0.09 values are found emprically. They produce an array // similar to LaTeX and in which content does not interfere with \hines. - var gap = 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0); + var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray} + : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0); table.setAttribute("rowspacing", gap + "em"); // MathML table lines go only between cells. // To place a line on an edge we'll use <menclose>, if necessary. var menclose = ""; var align = ""; - if (group.cols) { + if (group.cols && group.cols.length > 0) { // Find column alignment, column spacing, and vertical lines. var cols = group.cols; var columnLines = ""; @@ -9801,6 +10115,8 @@ var array_mathmlBuilder = function mathmlBuilder(group, options) { table.setAttribute("columnspacing", spacing.trim()); } else if (group.colSeparationType === "alignat") { table.setAttribute("columnspacing", "0em"); + } else if (group.colSeparationType === "small") { + table.setAttribute("columnspacing", "0.2778em"); } else { table.setAttribute("columnspacing", "1em"); } // Address \hline and \hdashline @@ -9820,13 +10136,18 @@ var array_mathmlBuilder = function mathmlBuilder(group, options) { table.setAttribute("rowlines", rowLines.trim()); } - if (menclose === "") { - return table; - } else { - var wrapper = new mathMLTree.MathNode("menclose", [table]); - wrapper.setAttribute("notation", menclose.trim()); - return wrapper; + if (menclose !== "") { + table = new mathMLTree.MathNode("menclose", [table]); + table.setAttribute("notation", menclose.trim()); } + + if (group.arraystretch && group.arraystretch < 1) { + // A small array. Wrap in scriptstyle so row gap is not too large. + table = new mathMLTree.MathNode("mstyle", [table]); + table.setAttribute("scriptlevel", "1"); + } + + return table; }; // Convenience function for aligned and alignedat environments. @@ -9852,13 +10173,12 @@ var array_alignedHandler = function alignedHandler(context, args) { mode: context.mode, body: [] }; - var ordgroup = checkNodeType(args[0], "ordgroup"); - if (ordgroup) { + if (args[0] && args[0].type === "ordgroup") { var arg0 = ""; - for (var i = 0; i < ordgroup.body.length; i++) { - var textord = assertNodeType(ordgroup.body[i], "textord"); + for (var i = 0; i < args[0].body.length; i++) { + var textord = assertNodeType(args[0].body[i], "textord"); arg0 += textord.text; } @@ -9871,10 +10191,8 @@ var array_alignedHandler = function alignedHandler(context, args) { for (var _i3 = 1; _i3 < row.length; _i3 += 2) { // Modify ordgroup node within styling node var styling = assertNodeType(row[_i3], "styling"); - - var _ordgroup = assertNodeType(styling.body[0], "ordgroup"); - - _ordgroup.body.unshift(emptyGroup); + var ordgroup = assertNodeType(styling.body[0], "ordgroup"); + ordgroup.body.unshift(emptyGroup); } if (!isAligned) { @@ -9992,20 +10310,84 @@ defineEnvironment({ mode: context.mode, body: [res], left: delimiters[0], - right: delimiters[1] + right: delimiters[1], + rightColor: undefined // \right uninfluenced by \color in array + } : res; }, htmlBuilder: array_htmlBuilder, mathmlBuilder: array_mathmlBuilder +}); +defineEnvironment({ + type: "array", + names: ["smallmatrix"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + var payload = { + arraystretch: 0.5 + }; + var res = parseArray(context.parser, payload, "script"); + res.colSeparationType = "small"; + return res; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); +defineEnvironment({ + type: "array", + names: ["subarray"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + // Parsing of {subarray} is similar to {array} + var symNode = checkSymbolNodeType(args[0]); + var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; + var cols = colalign.map(function (nde) { + var node = assertSymbolNodeType(nde); + var ca = node.text; // {subarray} only recognizes "l" & "c" + + if ("lc".indexOf(ca) !== -1) { + return { + type: "align", + align: ca + }; + } + + throw new src_ParseError("Unknown column alignment: " + ca, nde); + }); + + if (cols.length > 1) { + throw new src_ParseError("{subarray} can contain only one column"); + } + + var res = { + cols: cols, + hskipBeforeAndAfter: false, + arraystretch: 0.5 + }; + res = parseArray(context.parser, res, "script"); + + if (res.body.length > 0 && res.body[0].length > 1) { + throw new src_ParseError("{subarray} can contain only one column"); + } + + return res; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder }); // A cases environment (in amsmath.sty) is almost equivalent to // \def\arraystretch{1.2}% // \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. // {dcases} is a {cases} environment where cells are set in \displaystyle, // as defined in mathtools.sty. +// {rcases} is another mathtools environment. It's brace is on the right side. defineEnvironment({ type: "array", - names: ["cases", "dcases"], + names: ["cases", "dcases", "rcases", "drcases"], props: { numArgs: 0 }, @@ -10035,8 +10417,9 @@ defineEnvironment({ type: "leftright", mode: context.mode, body: [res], - left: "\\{", - right: "." + left: context.envName.indexOf("r") > -1 ? "." : "\\{", + right: context.envName.indexOf("r") > -1 ? "\\}" : ".", + rightColor: undefined }; }, htmlBuilder: array_htmlBuilder, @@ -10189,6 +10572,7 @@ defineFunction({ + var mclass_makeSpan = buildCommon.makeSpan; function mclass_htmlBuilder(group, options) { @@ -10197,8 +10581,44 @@ function mclass_htmlBuilder(group, options) { } function mclass_mathmlBuilder(group, options) { + var node; var inner = buildMathML_buildExpression(group.body, options); - return mathMLTree.newDocumentFragment(inner); + + if (group.mclass === "minner") { + return mathMLTree.newDocumentFragment(inner); + } else if (group.mclass === "mord") { + if (group.isCharacterBox) { + node = inner[0]; + node.type = "mi"; + } else { + node = new mathMLTree.MathNode("mi", inner); + } + } else { + if (group.isCharacterBox) { + node = inner[0]; + node.type = "mo"; + } else { + node = new mathMLTree.MathNode("mo", inner); + } // Set spacing based on what is the most likely adjacent atom type. + // See TeXbook p170. + + + if (group.mclass === "mbin") { + node.attributes.lspace = "0.22em"; // medium space + + node.attributes.rspace = "0.22em"; + } else if (group.mclass === "mpunct") { + node.attributes.lspace = "0em"; + node.attributes.rspace = "0.17em"; // thinspace + } else if (group.mclass === "mopen" || group.mclass === "mclose") { + node.attributes.lspace = "0em"; + node.attributes.rspace = "0em"; + } // MathML <mo> default space is 5/18 em, so <mrel> needs no action. + // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo + + } + + return node; } // Math class commands except \mathop @@ -10216,7 +10636,9 @@ defineFunction({ type: "mclass", mode: parser.mode, mclass: "m" + funcName.substr(5), - body: defineFunction_ordargument(body) + // TODO(kevinb): don't prefix with 'm' + body: ordargument(body), + isCharacterBox: utils.isCharacterBox(body) }; }, htmlBuilder: mclass_htmlBuilder, @@ -10249,7 +10671,8 @@ defineFunction({ type: "mclass", mode: parser.mode, mclass: binrelClass(args[0]), - body: [args[1]] + body: [args[1]], + isCharacterBox: utils.isCharacterBox(args[1]) }; } }); // Build a relation or stacked op by placing one symbol on top of another @@ -10282,7 +10705,7 @@ defineFunction({ parentIsSupSub: false, symbol: false, suppressBaseShift: funcName !== "\\stackrel", - body: defineFunction_ordargument(baseArg) + body: ordargument(baseArg) }; var supsub = { type: "supsub", @@ -10295,7 +10718,8 @@ defineFunction({ type: "mclass", mode: parser.mode, mclass: mclass, - body: [supsub] + body: [supsub], + isCharacterBox: utils.isCharacterBox(supsub) }; }, htmlBuilder: mclass_htmlBuilder, @@ -10308,6 +10732,7 @@ defineFunction({ + var font_htmlBuilder = function htmlBuilder(group, options) { var font = group.font; var newOptions = options.withFont(font); @@ -10365,7 +10790,8 @@ defineFunction({ }, handler: function handler(_ref2, args) { var parser = _ref2.parser; - var body = args[0]; // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the + var body = args[0]; + var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the // argument's bin|rel|ord status return { @@ -10377,14 +10803,15 @@ defineFunction({ mode: parser.mode, font: "boldsymbol", body: body - }] + }], + isCharacterBox: isCharacterBox }; } }); // Old font changing functions defineFunction({ type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it"], + names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], props: { numArgs: 0, allowedInText: true @@ -10797,20 +11224,8 @@ defineFunction({ var numer = args[4]; var denom = args[5]; // Look into the parse nodes to get the desired delimiters. - var leftNode = checkNodeType(args[0], "atom"); - - if (leftNode) { - leftNode = assertAtomFamily(args[0], "open"); - } - - var leftDelim = leftNode ? delimFromValue(leftNode.text) : null; - var rightNode = checkNodeType(args[1], "atom"); - - if (rightNode) { - rightNode = assertAtomFamily(args[1], "close"); - } - - var rightDelim = rightNode ? delimFromValue(rightNode.text) : null; + var leftDelim = args[0].type === "atom" && args[0].family === "open" ? delimFromValue(args[0].text) : null; + var rightDelim = args[1].type === "atom" && args[1].family === "close" ? delimFromValue(args[1].text) : null; var barNode = assertNodeType(args[2], "size"); var hasBarLine; var barSize = null; @@ -10827,15 +11242,15 @@ defineFunction({ var size = "auto"; - var styl = checkNodeType(args[3], "ordgroup"); + var styl = args[3]; - if (styl) { + if (styl.type === "ordgroup") { if (styl.body.length > 0) { var textOrd = assertNodeType(styl.body[0], "textord"); size = stylArray[Number(textOrd.text)]; } } else { - styl = assertNodeType(args[3], "textord"); + styl = assertNodeType(styl, "textord"); size = stylArray[Number(styl.text)]; } @@ -10922,14 +11337,13 @@ var horizBrace_htmlBuilder = function htmlBuilder(grp, options) { var supSubGroup; var group; - var supSub = checkNodeType(grp, "supsub"); - if (supSub) { + if (grp.type === "supsub") { // Ref: LaTeX source2e: }}}}\limits} // i.e. LaTeX treats the brace similar to an op and passes it // with \limits, so we need to assign supsub style. - supSubGroup = supSub.sup ? buildHTML_buildGroup(supSub.sup, options.havingStyle(style.sup()), options) : buildHTML_buildGroup(supSub.sub, options.havingStyle(style.sub()), options); - group = assertNodeType(supSub.base, "horizBrace"); + supSubGroup = grp.sup ? buildHTML_buildGroup(grp.sup, options.havingStyle(style.sup()), options) : buildHTML_buildGroup(grp.sub, options.havingStyle(style.sub()), options); + group = assertNodeType(grp.base, "horizBrace"); } else { group = assertNodeType(grp, "horizBrace"); } // Build the base group @@ -11067,11 +11481,19 @@ defineFunction({ var parser = _ref.parser; var body = args[1]; var href = assertNodeType(args[0], "url").url; + + if (!parser.settings.isTrusted({ + command: "\\href", + url: href + })) { + return parser.formatUnsupportedCmd("\\href"); + } + return { type: "href", mode: parser.mode, href: href, - body: defineFunction_ordargument(body) + body: ordargument(body) }; }, htmlBuilder: function htmlBuilder(group, options) { @@ -11100,6 +11522,14 @@ defineFunction({ handler: function handler(_ref2, args) { var parser = _ref2.parser; var href = assertNodeType(args[0], "url").url; + + if (!parser.settings.isTrusted({ + command: "\\url", + url: href + })) { + return parser.formatUnsupportedCmd("\\url"); + } + var chars = []; for (var i = 0; i < href.length; i++) { @@ -11126,10 +11556,122 @@ defineFunction({ type: "href", mode: parser.mode, href: href, - body: defineFunction_ordargument(body) + body: ordargument(body) }; } }); +// CONCATENATED MODULE: ./src/functions/html.js + + + + + + +defineFunction({ + type: "html", + names: ["\\htmlClass", "\\htmlId", "\\htmlStyle", "\\htmlData"], + props: { + numArgs: 2, + argTypes: ["raw", "original"], + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName, + token = _ref.token; + var value = assertNodeType(args[0], "raw").string; + var body = args[1]; + + if (parser.settings.strict) { + parser.settings.reportNonstrict("htmlExtension", "HTML extension is disabled on strict mode"); + } + + var trustContext; + var attributes = {}; + + switch (funcName) { + case "\\htmlClass": + attributes.class = value; + trustContext = { + command: "\\htmlClass", + class: value + }; + break; + + case "\\htmlId": + attributes.id = value; + trustContext = { + command: "\\htmlId", + id: value + }; + break; + + case "\\htmlStyle": + attributes.style = value; + trustContext = { + command: "\\htmlStyle", + style: value + }; + break; + + case "\\htmlData": + { + var data = value.split(","); + + for (var i = 0; i < data.length; i++) { + var keyVal = data[i].split("="); + + if (keyVal.length !== 2) { + throw new src_ParseError("Error parsing key-value for \\htmlData"); + } + + attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); + } + + trustContext = { + command: "\\htmlData", + attributes: attributes + }; + break; + } + + default: + throw new Error("Unrecognized html command"); + } + + if (!parser.settings.isTrusted(trustContext)) { + return parser.formatUnsupportedCmd(funcName); + } + + return { + type: "html", + mode: parser.mode, + attributes: attributes, + body: ordargument(body) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildHTML_buildExpression(group.body, options, false); + var classes = ["enclosing"]; + + if (group.attributes.class) { + classes.push.apply(classes, group.attributes.class.trim().split(/\s+/)); + } + + var span = buildCommon.makeSpan(classes, elements, options); + + for (var attr in group.attributes) { + if (attr !== "class" && group.attributes.hasOwnProperty(attr)) { + span.setAttribute(attr, group.attributes[attr]); + } + } + + return span; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return buildExpressionRow(group.body, options); + } +}); // CONCATENATED MODULE: ./src/functions/htmlmathml.js @@ -11147,8 +11689,8 @@ defineFunction({ return { type: "htmlmathml", mode: parser.mode, - html: defineFunction_ordargument(args[0]), - mathml: defineFunction_ordargument(args[1]) + html: ordargument(args[0]), + mathml: ordargument(args[1]) }; }, htmlBuilder: function htmlBuilder(group, options) { @@ -11159,6 +11701,185 @@ defineFunction({ return buildExpressionRow(group.mathml, options); } }); +// CONCATENATED MODULE: ./src/functions/includegraphics.js + + + + + + + +var includegraphics_sizeData = function sizeData(str) { + if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { + // str is a number with no unit specified. + // default unit is bp, per graphix package. + return { + number: +str, + unit: "bp" + }; + } else { + var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); + + if (!match) { + throw new src_ParseError("Invalid size: '" + str + "' in \\includegraphics"); + } + + var data = { + number: +(match[1] + match[2]), + // sign + magnitude, cast to number + unit: match[3] + }; + + if (!validUnit(data)) { + throw new src_ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); + } + + return data; + } +}; + +defineFunction({ + type: "includegraphics", + names: ["\\includegraphics"], + props: { + numArgs: 1, + numOptionalArgs: 1, + argTypes: ["raw", "url"], + allowedInText: false + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var width = { + number: 0, + unit: "em" + }; + var height = { + number: 0.9, + unit: "em" + }; // sorta character sized. + + var totalheight = { + number: 0, + unit: "em" + }; + var alt = ""; + + if (optArgs[0]) { + var attributeStr = assertNodeType(optArgs[0], "raw").string; // Parser.js does not parse key/value pairs. We get a string. + + var attributes = attributeStr.split(","); + + for (var i = 0; i < attributes.length; i++) { + var keyVal = attributes[i].split("="); + + if (keyVal.length === 2) { + var str = keyVal[1].trim(); + + switch (keyVal[0].trim()) { + case "alt": + alt = str; + break; + + case "width": + width = includegraphics_sizeData(str); + break; + + case "height": + height = includegraphics_sizeData(str); + break; + + case "totalheight": + totalheight = includegraphics_sizeData(str); + break; + + default: + throw new src_ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics."); + } + } + } + } + + var src = assertNodeType(args[0], "url").url; + + if (alt === "") { + // No alt given. Use the file name. Strip away the path. + alt = src; + alt = alt.replace(/^.*[\\/]/, ''); + alt = alt.substring(0, alt.lastIndexOf('.')); + } + + if (!parser.settings.isTrusted({ + command: "\\includegraphics", + url: src + })) { + return parser.formatUnsupportedCmd("\\includegraphics"); + } + + return { + type: "includegraphics", + mode: parser.mode, + alt: alt, + width: width, + height: height, + totalheight: totalheight, + src: src + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var height = units_calculateSize(group.height, options); + var depth = 0; + + if (group.totalheight.number > 0) { + depth = units_calculateSize(group.totalheight, options) - height; + depth = Number(depth.toFixed(2)); + } + + var width = 0; + + if (group.width.number > 0) { + width = units_calculateSize(group.width, options); + } + + var style = { + height: height + depth + "em" + }; + + if (width > 0) { + style.width = width + "em"; + } + + if (depth > 0) { + style.verticalAlign = -depth + "em"; + } + + var node = new domTree_Img(group.src, group.alt, style); + node.height = height; + node.depth = depth; + return node; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mglyph", []); + node.setAttribute("alt", group.alt); + var height = units_calculateSize(group.height, options); + var depth = 0; + + if (group.totalheight.number > 0) { + depth = units_calculateSize(group.totalheight, options) - height; + depth = depth.toFixed(2); + node.setAttribute("valign", "-" + depth + "em"); + } + + node.setAttribute("height", height + depth + "em"); + + if (group.width.number > 0) { + var width = units_calculateSize(group.width, options); + node.setAttribute("width", width + "em"); + } + + node.setAttribute("src", group.src); + return node; + } +}); // CONCATENATED MODULE: ./src/functions/kern.js // Horizontal spacing commands @@ -11258,21 +11979,16 @@ defineFunction({ // two items involved in the lap. // Next, use a strut to set the height of the HTML bounding box. // Otherwise, a tall argument may be misplaced. + // This code resolved issue #1153 var strut = buildCommon.makeSpan(["strut"]); strut.style.height = node.height + node.depth + "em"; strut.style.verticalAlign = -node.depth + "em"; node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall. + // This code resolves issue #1234 - node = buildCommon.makeVList({ - positionType: "firstBaseline", - children: [{ - type: "elem", - elem: node - }] - }, options); // Get the horizontal spacing correct relative to adjacent items. - - return buildCommon.makeSpan(["mord"], [node], options); + node = buildCommon.makeSpan(["thinbox"], [node], options); + return buildCommon.makeSpan(["mord", "vbox"], [node], options); }, mathmlBuilder: function mathmlBuilder(group, options) { // mathllap, mathrlap, mathclap @@ -11297,8 +12013,7 @@ defineFunction({ props: { numArgs: 0, allowedInText: true, - allowedInMath: false, - consumeMode: "math" + allowedInMath: false }, handler: function handler(_ref, args) { var funcName = _ref.funcName, @@ -11306,12 +12021,9 @@ defineFunction({ var outerMode = parser.mode; parser.switchMode("math"); var close = funcName === "\\(" ? "\\)" : "$"; - var body = parser.parseExpression(false, close); // We can't expand the next symbol after the closing $ until after - // switching modes back. So don't consume within expect. - - parser.expect(close, false); + var body = parser.parseExpression(false, close); + parser.expect(close); parser.switchMode(outerMode); - parser.consume(); return { type: "styling", mode: parser.mode, @@ -11371,10 +12083,10 @@ defineFunction({ return { type: "mathchoice", mode: parser.mode, - display: defineFunction_ordargument(args[0]), - text: defineFunction_ordargument(args[1]), - script: defineFunction_ordargument(args[2]), - scriptscript: defineFunction_ordargument(args[3]) + display: ordargument(args[0]), + text: ordargument(args[1]), + script: ordargument(args[2]), + scriptscript: ordargument(args[3]) }; }, htmlBuilder: function htmlBuilder(group, options) { @@ -11387,6 +12099,121 @@ defineFunction({ return buildExpressionRow(body, options); } }); +// CONCATENATED MODULE: ./src/functions/utils/assembleSupSub.js + + +// For an operator with limits, assemble the base, sup, and sub into a span. +var assembleSupSub_assembleSupSub = function assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift) { + base = buildCommon.makeSpan([], [base]); + var sub; + var sup; // We manually have to handle the superscripts and subscripts. This, + // aside from the kern calculations, is copied from supsub. + + if (supGroup) { + var elem = buildHTML_buildGroup(supGroup, options.havingStyle(style.sup()), options); + sup = { + elem: elem, + kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) + }; + } + + if (subGroup) { + var _elem = buildHTML_buildGroup(subGroup, options.havingStyle(style.sub()), options); + + sub = { + elem: _elem, + kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) + }; + } // Build the final group as a vlist of the possible subscript, base, + // and possible superscript. + + + var finalGroup; + + if (sup && sub) { + var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; + finalGroup = buildCommon.makeVList({ + positionType: "bottom", + positionData: bottom, + children: [{ + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }, { + type: "elem", + elem: sub.elem, + marginLeft: -slant + "em" + }, { + type: "kern", + size: sub.kern + }, { + type: "elem", + elem: base + }, { + type: "kern", + size: sup.kern + }, { + type: "elem", + elem: sup.elem, + marginLeft: slant + "em" + }, { + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }] + }, options); + } else if (sub) { + var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note + // that we are supposed to shift the limits by 1/2 of the slant, + // but since we are centering the limits adding a full slant of + // margin will shift by 1/2 that. + + finalGroup = buildCommon.makeVList({ + positionType: "top", + positionData: top, + children: [{ + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }, { + type: "elem", + elem: sub.elem, + marginLeft: -slant + "em" + }, { + type: "kern", + size: sub.kern + }, { + type: "elem", + elem: base + }] + }, options); + } else if (sup) { + var _bottom = base.depth + baseShift; + + finalGroup = buildCommon.makeVList({ + positionType: "bottom", + positionData: _bottom, + children: [{ + type: "elem", + elem: base + }, { + type: "kern", + size: sup.kern + }, { + type: "elem", + elem: sup.elem, + marginLeft: slant + "em" + }, { + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }] + }, options); + } else { + // This case probably shouldn't occur (this would mean the + // supsub was sending us a group with no superscript or + // subscript) but be safe. + return base; + } + + return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options); +}; // CONCATENATED MODULE: ./src/functions/op.js // Limits, symbols @@ -11398,6 +12225,7 @@ defineFunction({ + // Most operators have a large successor symbol, but these don't. var noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also // "supsub" since some of them (like \int) can affect super/subscripting. @@ -11408,15 +12236,14 @@ var op_htmlBuilder = function htmlBuilder(grp, options) { var subGroup; var hasLimits = false; var group; - var supSub = checkNodeType(grp, "supsub"); - if (supSub) { + if (grp.type === "supsub") { // If we have limits, supsub will pass us its group to handle. Pull // out the superscript and subscript and set the group to the op in // its base. - supGroup = supSub.sup; - subGroup = supSub.sub; - group = assertNodeType(supSub.base, "op"); + supGroup = grp.sup; + subGroup = grp.sub; + group = assertNodeType(grp.base, "op"); hasLimits = true; } else { group = assertNodeType(grp, "op"); @@ -11488,7 +12315,7 @@ var op_htmlBuilder = function htmlBuilder(grp, options) { var output = []; for (var i = 1; i < group.name.length; i++) { - output.push(buildCommon.mathsym(group.name[i], group.mode)); + output.push(buildCommon.mathsym(group.name[i], group.mode, options)); } base = buildCommon.makeSpan(["mop"], output, options); @@ -11512,117 +12339,7 @@ var op_htmlBuilder = function htmlBuilder(grp, options) { } if (hasLimits) { - // IE 8 clips \int if it is in a display: inline-block. We wrap it - // in a new span so it is an inline, and works. - base = buildCommon.makeSpan([], [base]); - var sub; - var sup; // We manually have to handle the superscripts and subscripts. This, - // aside from the kern calculations, is copied from supsub. - - if (supGroup) { - var elem = buildHTML_buildGroup(supGroup, options.havingStyle(style.sup()), options); - sup = { - elem: elem, - kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) - }; - } - - if (subGroup) { - var _elem = buildHTML_buildGroup(subGroup, options.havingStyle(style.sub()), options); - - sub = { - elem: _elem, - kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) - }; - } // Build the final group as a vlist of the possible subscript, base, - // and possible superscript. - - - var finalGroup; - - if (sup && sub) { - var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; - finalGroup = buildCommon.makeVList({ - positionType: "bottom", - positionData: bottom, - children: [{ - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }, { - type: "elem", - elem: sub.elem, - marginLeft: -slant + "em" - }, { - type: "kern", - size: sub.kern - }, { - type: "elem", - elem: base - }, { - type: "kern", - size: sup.kern - }, { - type: "elem", - elem: sup.elem, - marginLeft: slant + "em" - }, { - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }] - }, options); - } else if (sub) { - var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note - // that we are supposed to shift the limits by 1/2 of the slant, - // but since we are centering the limits adding a full slant of - // margin will shift by 1/2 that. - - finalGroup = buildCommon.makeVList({ - positionType: "top", - positionData: top, - children: [{ - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }, { - type: "elem", - elem: sub.elem, - marginLeft: -slant + "em" - }, { - type: "kern", - size: sub.kern - }, { - type: "elem", - elem: base - }] - }, options); - } else if (sup) { - var _bottom = base.depth + baseShift; - - finalGroup = buildCommon.makeVList({ - positionType: "bottom", - positionData: _bottom, - children: [{ - type: "elem", - elem: base - }, { - type: "kern", - size: sup.kern - }, { - type: "elem", - elem: sup.elem, - marginLeft: slant + "em" - }, { - type: "kern", - size: options.fontMetrics().bigOpSpacing5 - }] - }, options); - } else { - // This case probably shouldn't occur (this would mean the - // supsub was sending us a group with no superscript or - // subscript) but be safe. - return base; - } - - return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options); + return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift); } else { if (baseShift) { base.style.position = "relative"; @@ -11649,8 +12366,6 @@ var op_mathmlBuilder = function mathmlBuilder(group, options) { } else { // This is a text operator. Add all of the characters from the // operator's name. - // TODO(emily): Add a space in the middle of some of these - // operators, like \limsup. node = new mathMLTree_MathNode("mi", [new mathMLTree_TextNode(group.name.slice(1))]); // Append an <mo>⁡</mo>. // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 @@ -11724,7 +12439,7 @@ defineFunction({ limits: false, parentIsSupSub: false, symbol: false, - body: defineFunction_ordargument(body) + body: ordargument(body) }; }, htmlBuilder: op_htmlBuilder, @@ -11819,114 +12534,157 @@ defineFunction({ - // \operatorname + + + +// NOTE: Unlike most `htmlBuilder`s, this one handles not only +// "operatorname", but also "supsub" since \operatorname* can +var operatorname_htmlBuilder = function htmlBuilder(grp, options) { + // Operators are handled in the TeXbook pg. 443-444, rule 13(a). + var supGroup; + var subGroup; + var hasLimits = false; + var group; + + if (grp.type === "supsub") { + // If we have limits, supsub will pass us its group to handle. Pull + // out the superscript and subscript and set the group to the op in + // its base. + supGroup = grp.sup; + subGroup = grp.sub; + group = assertNodeType(grp.base, "operatorname"); + hasLimits = true; + } else { + group = assertNodeType(grp, "operatorname"); + } + + var base; + + if (group.body.length > 0) { + var body = group.body.map(function (child) { + // $FlowFixMe: Check if the node has a string `text` property. + var childText = child.text; + + if (typeof childText === "string") { + return { + type: "textord", + mode: child.mode, + text: childText + }; + } else { + return child; + } + }); // Consolidate function names into symbol characters. + + var expression = buildHTML_buildExpression(body, options.withFont("mathrm"), true); + + for (var i = 0; i < expression.length; i++) { + var child = expression[i]; + + if (child instanceof domTree_SymbolNode) { + // Per amsopn package, + // change minus to hyphen and \ast to asterisk + child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); + } + } + + base = buildCommon.makeSpan(["mop"], expression, options); + } else { + base = buildCommon.makeSpan(["mop"], [], options); + } + + if (hasLimits) { + return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0); + } else { + return base; + } +}; + +var operatorname_mathmlBuilder = function mathmlBuilder(group, options) { + // The steps taken here are similar to the html version. + var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction? + + var isAllString = true; // default + + for (var i = 0; i < expression.length; i++) { + var node = expression[i]; + + if (node instanceof mathMLTree.SpaceNode) {// Do nothing + } else if (node instanceof mathMLTree.MathNode) { + switch (node.type) { + case "mi": + case "mn": + case "ms": + case "mspace": + case "mtext": + break; + // Do nothing yet. + + case "mo": + { + var child = node.children[0]; + + if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { + child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); + } else { + isAllString = false; + } + + break; + } + + default: + isAllString = false; + } + } else { + isAllString = false; + } + } + + if (isAllString) { + // Write a single TextNode instead of multiple nested tags. + var word = expression.map(function (node) { + return node.toText(); + }).join(""); + expression = [new mathMLTree.TextNode(word)]; + } + + var identifier = new mathMLTree.MathNode("mi", expression); + identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as ⁡ + // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp + + var operator = new mathMLTree.MathNode("mo", [buildMathML_makeText("\u2061", "text")]); + + if (group.parentIsSupSub) { + return new mathMLTree.MathNode("mo", [identifier, operator]); + } else { + return mathMLTree.newDocumentFragment([identifier, operator]); + } +}; // \operatorname // amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ + defineFunction({ type: "operatorname", - names: ["\\operatorname"], + names: ["\\operatorname", "\\operatorname*"], props: { numArgs: 1 }, handler: function handler(_ref, args) { - var parser = _ref.parser; + var parser = _ref.parser, + funcName = _ref.funcName; var body = args[0]; return { type: "operatorname", mode: parser.mode, - body: defineFunction_ordargument(body) + body: ordargument(body), + alwaysHandleSupSub: funcName === "\\operatorname*", + limits: false, + parentIsSupSub: false }; }, - htmlBuilder: function htmlBuilder(group, options) { - if (group.body.length > 0) { - var body = group.body.map(function (child) { - // $FlowFixMe: Check if the node has a string `text` property. - var childText = child.text; - - if (typeof childText === "string") { - return { - type: "textord", - mode: child.mode, - text: childText - }; - } else { - return child; - } - }); // Consolidate function names into symbol characters. - - var expression = buildHTML_buildExpression(body, options.withFont("mathrm"), true); - - for (var i = 0; i < expression.length; i++) { - var child = expression[i]; - - if (child instanceof domTree_SymbolNode) { - // Per amsopn package, - // change minus to hyphen and \ast to asterisk - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } - } - - return buildCommon.makeSpan(["mop"], expression, options); - } else { - return buildCommon.makeSpan(["mop"], [], options); - } - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // The steps taken here are similar to the html version. - var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction? - - var isAllString = true; // default - - for (var i = 0; i < expression.length; i++) { - var node = expression[i]; - - if (node instanceof mathMLTree.SpaceNode) {// Do nothing - } else if (node instanceof mathMLTree.MathNode) { - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mspace": - case "mtext": - break; - // Do nothing yet. - - case "mo": - { - var child = node.children[0]; - - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } else { - isAllString = false; - } - - break; - } - - default: - isAllString = false; - } - } else { - isAllString = false; - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - var word = expression.map(function (node) { - return node.toText(); - }).join(""); - expression = [new mathMLTree.TextNode(word)]; - } - - var identifier = new mathMLTree.MathNode("mi", expression); - identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as ⁡ - // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp - - var operator = new mathMLTree.MathNode("mo", [buildMathML_makeText("\u2061", "text")]); - return mathMLTree.newDocumentFragment([identifier, operator]); - } + htmlBuilder: operatorname_htmlBuilder, + mathmlBuilder: operatorname_mathmlBuilder }); // CONCATENATED MODULE: ./src/functions/ordgroup.js @@ -11943,7 +12701,7 @@ defineFunctionBuilders({ return buildCommon.makeSpan(["mord"], buildHTML_buildExpression(group.body, options, true), options); }, mathmlBuilder: function mathmlBuilder(group, options) { - return buildExpressionRow(group.body, options); + return buildExpressionRow(group.body, options, true); } }); // CONCATENATED MODULE: ./src/functions/overline.js @@ -11974,6 +12732,7 @@ defineFunction({ var line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns + var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; var vlist = buildCommon.makeVList({ positionType: "firstBaseline", children: [{ @@ -11981,13 +12740,13 @@ defineFunction({ elem: innerGroup }, { type: "kern", - size: 3 * line.height + size: 3 * defaultRuleThickness }, { type: "elem", elem: line }, { type: "kern", - size: line.height + size: defaultRuleThickness }] }, options); return buildCommon.makeSpan(["mord", "overline"], [vlist], options); @@ -12019,7 +12778,7 @@ defineFunction({ return { type: "phantom", mode: parser.mode, - body: defineFunction_ordargument(body) + body: ordargument(body) }; }, htmlBuilder: function htmlBuilder(group, options) { @@ -12073,7 +12832,7 @@ defineFunction({ return buildCommon.makeSpan(["mord"], [node], options); }, mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options); + var inner = buildMathML_buildExpression(ordargument(group.body), options); var phantom = new mathMLTree.MathNode("mphantom", inner); var node = new mathMLTree.MathNode("mpadded", [phantom]); node.setAttribute("height", "0px"); @@ -12103,84 +12862,13 @@ defineFunction({ return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options); }, mathmlBuilder: function mathmlBuilder(group, options) { - var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options); + var inner = buildMathML_buildExpression(ordargument(group.body), options); var phantom = new mathMLTree.MathNode("mphantom", inner); var node = new mathMLTree.MathNode("mpadded", [phantom]); node.setAttribute("width", "0px"); return node; } }); -// CONCATENATED MODULE: ./src/functions/sizing.js - - - - - -function sizingGroup(value, options, baseOptions) { - var inner = buildHTML_buildExpression(value, options, false); - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize - // manually. Handle nested size changes. - - for (var i = 0; i < inner.length; i++) { - var pos = inner[i].classes.indexOf("sizing"); - - if (pos < 0) { - Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); - } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { - // This is a nested size change: e.g., inner[i] is the "b" in - // `\Huge a \small b`. Override the old size (the `reset-` class) - // but not the new size. - inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; - } - - inner[i].height *= multiplier; - inner[i].depth *= multiplier; - } - - return buildCommon.makeFragment(inner); -} -var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; -var sizing_htmlBuilder = function htmlBuilder(group, options) { - // Handle sizing operators like \Huge. Real TeX doesn't actually allow - // these functions inside of math expressions, so we do some special - // handling. - var newOptions = options.havingSize(group.size); - return sizingGroup(group.body, newOptions, options); -}; -defineFunction({ - type: "sizing", - names: sizeFuncs, - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(_ref, args) { - var breakOnTokenText = _ref.breakOnTokenText, - funcName = _ref.funcName, - parser = _ref.parser; - var body = parser.parseExpression(false, breakOnTokenText); - return { - type: "sizing", - mode: parser.mode, - // Figure out what size to use based on the list of functions above - size: sizeFuncs.indexOf(funcName) + 1, - body: body - }; - }, - htmlBuilder: sizing_htmlBuilder, - mathmlBuilder: function mathmlBuilder(group, options) { - var newOptions = options.havingSize(group.size); - var inner = buildMathML_buildExpression(group.body, newOptions); - var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size - // changes, because we don't keep state of what style we're currently - // in, so we can't reset the size to normal before changing it. Now - // that we're passing an options parameter we should be able to fix - // this. - - node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); - return node; - } -}); // CONCATENATED MODULE: ./src/functions/raisebox.js @@ -12195,7 +12883,7 @@ defineFunction({ names: ["\\raisebox"], props: { numArgs: 2, - argTypes: ["size", "text"], + argTypes: ["size", "hbox"], allowedInText: true }, handler: function handler(_ref, args) { @@ -12210,21 +12898,7 @@ defineFunction({ }; }, htmlBuilder: function htmlBuilder(group, options) { - var text = { - type: "text", - mode: group.mode, - body: defineFunction_ordargument(group.body), - font: "mathrm" // simulate \textrm - - }; - var sizedText = { - type: "sizing", - mode: group.mode, - body: [text], - size: 6 // simulate \normalsize - - }; - var body = sizing_htmlBuilder(sizedText, options); + var body = buildHTML_buildGroup(group.body, options); var dy = units_calculateSize(group.dy, options); return buildCommon.makeVList({ positionType: "shift", @@ -12312,6 +12986,77 @@ defineFunction({ return wrapper; } }); +// CONCATENATED MODULE: ./src/functions/sizing.js + + + + + +function sizingGroup(value, options, baseOptions) { + var inner = buildHTML_buildExpression(value, options, false); + var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize + // manually. Handle nested size changes. + + for (var i = 0; i < inner.length; i++) { + var pos = inner[i].classes.indexOf("sizing"); + + if (pos < 0) { + Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); + } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { + // This is a nested size change: e.g., inner[i] is the "b" in + // `\Huge a \small b`. Override the old size (the `reset-` class) + // but not the new size. + inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; + } + + inner[i].height *= multiplier; + inner[i].depth *= multiplier; + } + + return buildCommon.makeFragment(inner); +} +var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; +var sizing_htmlBuilder = function htmlBuilder(group, options) { + // Handle sizing operators like \Huge. Real TeX doesn't actually allow + // these functions inside of math expressions, so we do some special + // handling. + var newOptions = options.havingSize(group.size); + return sizingGroup(group.body, newOptions, options); +}; +defineFunction({ + type: "sizing", + names: sizeFuncs, + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref, args) { + var breakOnTokenText = _ref.breakOnTokenText, + funcName = _ref.funcName, + parser = _ref.parser; + var body = parser.parseExpression(false, breakOnTokenText); + return { + type: "sizing", + mode: parser.mode, + // Figure out what size to use based on the list of functions above + size: sizeFuncs.indexOf(funcName) + 1, + body: body + }; + }, + htmlBuilder: sizing_htmlBuilder, + mathmlBuilder: function mathmlBuilder(group, options) { + var newOptions = options.havingSize(group.size); + var inner = buildMathML_buildExpression(group.body, newOptions); + var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size + // changes, because we don't keep state of what style we're currently + // in, so we can't reset the size to normal before changing it. Now + // that we're passing an options parameter we should be able to fix + // this. + + node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); + return node; + } +}); // CONCATENATED MODULE: ./src/functions/smash.js // smash, with optional [tb], as in AMS @@ -12587,15 +13332,7 @@ defineFunction({ }, mathmlBuilder: function mathmlBuilder(group, options) { // Figure out what style we're changing to. - // TODO(kevinb): dedupe this with buildHTML.js - // This will be easier of handling of styling nodes is in the same file. - var styleMap = { - "display": src_Style.DISPLAY, - "text": src_Style.TEXT, - "script": src_Style.SCRIPT, - "scriptscript": src_Style.SCRIPTSCRIPT - }; - var newStyle = styleMap[group.style]; + var newStyle = styling_styleMap[group.style]; var newOptions = options.havingStyle(newStyle); var inner = buildMathML_buildExpression(group.body, newOptions); var node = new mathMLTree.MathNode("mstyle", inner); @@ -12642,6 +13379,10 @@ var supsub_htmlBuilderDelegate = function htmlBuilderDelegate(group, options) { // (e.g. `\displaystyle\sum_2^3`) var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub); return delegate ? op_htmlBuilder : null; + } else if (base.type === "operatorname") { + var _delegate = base.alwaysHandleSupSub && (options.style.size === src_Style.DISPLAY.size || base.limits); + + return _delegate ? operatorname_htmlBuilder : null; } else if (base.type === "accent") { return utils.isCharacterBox(base.base) ? accent_htmlBuilder : null; } else if (base.type === "horizBrace") { @@ -12801,18 +13542,17 @@ defineFunctionBuilders({ var isBrace = false; var isOver; var isSup; - var horizBrace = checkNodeType(group.base, "horizBrace"); - if (horizBrace) { + if (group.base && group.base.type === "horizBrace") { isSup = !!group.sup; - if (isSup === horizBrace.isOver) { + if (isSup === group.base.isOver) { isBrace = true; - isOver = horizBrace.isOver; + isOver = group.base.isOver; } } - if (group.base && group.base.type === "op") { + if (group.base && (group.base.type === "op" || group.base.type === "operatorname")) { group.base.parentIsSupSub = true; } @@ -12835,6 +13575,8 @@ defineFunctionBuilders({ if (base && base.type === "op" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) { nodeType = "mover"; + } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === src_Style.DISPLAY)) { + nodeType = "mover"; } else { nodeType = "msup"; } @@ -12843,6 +13585,8 @@ defineFunctionBuilders({ if (_base && _base.type === "op" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) { nodeType = "munder"; + } else if (_base && _base.type === "operatorname" && _base.alwaysHandleSupSub && (_base.limits || options.style === src_Style.DISPLAY)) { + nodeType = "munder"; } else { nodeType = "msub"; } @@ -12851,6 +13595,8 @@ defineFunctionBuilders({ if (_base2 && _base2.type === "op" && _base2.limits && options.style === src_Style.DISPLAY) { nodeType = "munderover"; + } else if (_base2 && _base2.type === "operatorname" && _base2.alwaysHandleSupSub && (options.style === src_Style.DISPLAY || _base2.limits)) { + nodeType = "munderover"; } else { nodeType = "msubsup"; } @@ -13083,8 +13829,7 @@ defineFunction({ numArgs: 1, argTypes: ["text"], greediness: 2, - allowedInText: true, - consumeMode: "text" + allowedInText: true }, handler: function handler(_ref, args) { var parser = _ref.parser, @@ -13093,7 +13838,7 @@ defineFunction({ return { type: "text", mode: parser.mode, - body: defineFunction_ordargument(body), + body: ordargument(body), font: funcName }; }, @@ -13135,18 +13880,19 @@ defineFunction({ var line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns + var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; var vlist = buildCommon.makeVList({ positionType: "top", positionData: innerGroup.height, children: [{ type: "kern", - size: line.height + size: defaultRuleThickness }, { type: "elem", elem: line }, { type: "kern", - size: 3 * line.height + size: 3 * defaultRuleThickness }, { type: "elem", elem: innerGroup @@ -13236,8 +13982,9 @@ var functions = _functions; - // Disabled until https://github.com/KaTeX/KaTeX/pull/1794 is merged. -// import "./functions/includegraphics"; + + + @@ -13308,7 +14055,8 @@ combiningDiacriticalMarkString + "*") + // ...plus accents "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair combiningDiacriticalMarkString + "*") + // ...plus accents "|\\\\verb\\*([^]).*?\\3" + // \verb* -"|\\\\verb([^*a-zA-Z]).*?\\4" + ( // \verb unstarred +"|\\\\verb([^*a-zA-Z]).*?\\4" + // \verb unstarred +"|\\\\operatorname\\*" + ( // \operatorname* "|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces "|" + controlSymbolRegexString + ")"); // \\, \', etc. @@ -13534,6 +14282,7 @@ function () { + var builtinMacros = {}; /* harmony default export */ var macros = (builtinMacros); // This function might one day accept an additional argument and do more things. @@ -13541,7 +14290,37 @@ function defineMacro(name, body) { builtinMacros[name] = body; } ////////////////////////////////////////////////////////////////////// // macro tools -// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 + +defineMacro("\\noexpand", function (context) { + // The expansion is the token itself; but that token is interpreted + // as if its meaning were ‘\relax’ if it is a control sequence that + // would ordinarily be expanded by TeX’s expansion rules. + var t = context.popToken(); + + if (context.isExpandable(t.text)) { + t.noexpand = true; + t.treatAsRelax = true; + } + + return { + tokens: [t], + numArgs: 0 + }; +}); +defineMacro("\\expandafter", function (context) { + // TeX first reads the token that comes immediately after \expandafter, + // without expanding it; let’s call this token t. Then TeX reads the + // token that comes after t (and possibly more tokens, if that token + // has an argument), replacing it by its expansion. Finally TeX puts + // t back in front of that expansion. + var t = context.popToken(); + context.expandOnce(true); // expand only an expandable token + + return { + tokens: [t], + numArgs: 0 + }; +}); // LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 // TeX source: \long\def\@firstoftwo#1#2{#1} defineMacro("\\@firstoftwo", function (context) { @@ -13560,12 +14339,14 @@ defineMacro("\\@secondoftwo", function (context) { numArgs: 0 }; }); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol. If it matches #1, then the macro expands to #2; otherwise, #3. -// Note, however, that it does not consume the next symbol in either case. +// symbol that isn't a space, consuming any spaces but not consuming the +// first nonspace character. If that nonspace character matches #1, then +// the macro expands to #2; otherwise, it expands to #3. defineMacro("\\@ifnextchar", function (context) { var args = context.consumeArgs(3); // symbol, if, else + context.consumeSpaces(); var nextToken = context.future(); if (args[0].length === 1 && args[0][0].text === nextToken.text) { @@ -13678,74 +14459,6 @@ defineMacro("\\char", function (context) { } return "\\@char{" + number + "}"; -}); // Basic support for macro definitions: -// \def\macro{expansion} -// \def\macro#1{expansion} -// \def\macro#1#2{expansion} -// \def\macro#1#2#3#4#5#6#7#8#9{expansion} -// Also the \gdef and \global\def equivalents - -var macros_def = function def(context, global) { - var arg = context.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("\\gdef's first argument must be a macro name"); - } - - var name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ... - - var numArgs = 0; - arg = context.consumeArgs(1)[0]; - - while (arg.length === 1 && arg[0].text === "#") { - arg = context.consumeArgs(1)[0]; - - if (arg.length !== 1) { - throw new src_ParseError("Invalid argument number length \"" + arg.length + "\""); - } - - if (!/^[1-9]$/.test(arg[0].text)) { - throw new src_ParseError("Invalid argument number \"" + arg[0].text + "\""); - } - - numArgs++; - - if (parseInt(arg[0].text) !== numArgs) { - throw new src_ParseError("Argument number \"" + arg[0].text + "\" out of order"); - } - - arg = context.consumeArgs(1)[0]; - } // Final arg is the expansion of the macro - - - context.macros.set(name, { - tokens: arg, - numArgs: numArgs - }, global); - return ''; -}; - -defineMacro("\\gdef", function (context) { - return macros_def(context, true); -}); -defineMacro("\\def", function (context) { - return macros_def(context, false); -}); -defineMacro("\\global", function (context) { - var next = context.consumeArgs(1)[0]; - - if (next.length !== 1) { - throw new src_ParseError("Invalid command after \\global"); - } - - var command = next[0].text; // TODO: Should expand command - - if (command === "\\def") { - // \global\def is equivalent to \gdef - return macros_def(context, true); - } else { - throw new src_ParseError("Invalid command '" + command + "' after \\global"); - } }); // \newcommand{\macro}[args]{definition} // \renewcommand{\macro}[args]{definition} // TODO: Optional arguments: \newcommand{\macro}[args][default]{definition} @@ -13805,6 +14518,30 @@ defineMacro("\\renewcommand", function (context) { }); defineMacro("\\providecommand", function (context) { return macros_newcommand(context, true, true); +}); // terminal (console) tools + +defineMacro("\\message", function (context) { + var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console + + console.log(arg.reverse().map(function (token) { + return token.text; + }).join("")); + return ''; +}); +defineMacro("\\errmessage", function (context) { + var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console + + console.error(arg.reverse().map(function (token) { + return token.text; + }).join("")); + return ''; +}); +defineMacro("\\show", function (context) { + var tok = context.popToken(); + var name = tok.text; // eslint-disable-next-line no-console + + console.log(tok, context.macros.get(name), src_functions[name], src_symbols.math[name], src_symbols.text[name]); + return ''; }); ////////////////////////////////////////////////////////////////////// // Grouping // \let\bgroup={ \let\egroup=} @@ -13887,7 +14624,13 @@ defineMacro("\u231E", "\\llcorner"); defineMacro("\u231F", "\\lrcorner"); defineMacro("\xA9", "\\copyright"); defineMacro("\xAE", "\\textregistered"); -defineMacro("\uFE0F", "\\textregistered"); ////////////////////////////////////////////////////////////////////// +defineMacro("\uFE0F", "\\textregistered"); // The KaTeX fonts have corners at codepoints that don't match Unicode. +// For MathML purposes, use the Unicode code point. + +defineMacro("\\ulcorner", "\\html@mathml{\\@ulcorner}{\\mathop{\\char\"231c}}"); +defineMacro("\\urcorner", "\\html@mathml{\\@urcorner}{\\mathop{\\char\"231d}}"); +defineMacro("\\llcorner", "\\html@mathml{\\@llcorner}{\\mathop{\\char\"231e}}"); +defineMacro("\\lrcorner", "\\html@mathml{\\@lrcorner}{\\mathop{\\char\"231f}}"); ////////////////////////////////////////////////////////////////////// // LaTeX_2ε // \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ // \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} @@ -13911,7 +14654,9 @@ defineMacro("\\varSigma", "\\mathit{\\Sigma}"); defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}"); defineMacro("\\varPhi", "\\mathit{\\Phi}"); defineMacro("\\varPsi", "\\mathit{\\Psi}"); -defineMacro("\\varOmega", "\\mathit{\\Omega}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript +defineMacro("\\varOmega", "\\mathit{\\Omega}"); //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} + +defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript // \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} @@ -14128,10 +14873,11 @@ defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5 defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"); defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb -- A simulation of bold. -// It works by typesetting three copies of the argument with small offsets. -// Ref: a rather lengthy macro in ambsy.sty +// The version in ambsy.sty works by typesetting three copies of the argument +// with small offsets. We use two copies. We omit the vertical offset because +// of rendering problems that makeVList encounters in Safari. -defineMacro("\\pmb", "\\html@mathml{\\@binrel{#1}{" + "\\mathrlap{#1}" + "\\mathrlap{\\mkern0.4mu\\raisebox{0.4mu}{$#1$}}" + "{\\mkern0.8mu#1}" + "}}{\\mathbf{#1}}"); ////////////////////////////////////////////////////////////////////// +defineMacro("\\pmb", "\\html@mathml{" + "\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}" + "{\\mathbf{#1}}"); ////////////////////////////////////////////////////////////////////// // LaTeX source2e // \\ defaults to \newline, but changes to \cr within array environment @@ -14152,13 +14898,13 @@ defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5e // \TeX} // This code aligns the top of the A with the T (from the perspective of TeX's // boxes, though visually the A appears to extend above slightly). -// We compute the corresponding \raisebox when A is rendered at \scriptsize, -// which is size3, which has a scale factor of 0.7 (see Options.js). +// We compute the corresponding \raisebox when A is rendered in \normalsize +// \scriptstyle, which has a scale factor of 0.7 (see Options.js). var latexRaiseA = fontMetricsData['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular']["A".charCodeAt(0)][1] + "em"; -defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo +defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo -defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} +defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} // \def\@hspace#1{\hskip #1\relax} // \def\@hspacer#1{\vrule \@width\z@\nobreak // \hskip #1\hskip \z@skip} @@ -14236,8 +14982,8 @@ defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentc defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}"); -defineMacro("\\limsup", "\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"); -defineMacro("\\liminf", "\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"); ////////////////////////////////////////////////////////////////////// +defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); +defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); ////////////////////////////////////////////////////////////////////// // MathML alternates for KaTeX glyphs in the Unicode private area defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}"); @@ -14253,7 +14999,9 @@ defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}"); defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}"); defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}"); defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}"); -defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); ////////////////////////////////////////////////////////////////////// +defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); +defineMacro("\\imath", "\\html@mathml{\\@imath}{\u0131}"); +defineMacro("\\jmath", "\\html@mathml{\\@jmath}{\u0237}"); ////////////////////////////////////////////////////////////////////// // stmaryrd and semantic // The stmaryrd and semantic packages render the next four items by calling a // glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros. @@ -14271,7 +15019,11 @@ defineMacro("\u2983", "\\lBrace"); // blackboard bold { defineMacro("\u2984", "\\rBrace"); // blackboard bold } // TODO: Create variable sized versions of the last two items. I believe that // will require new font glyphs. -////////////////////////////////////////////////////////////////////// +// The stmaryrd function `\minuso` provides a "Plimsoll" symbol that +// superimposes the characters \circ and \mathminus. Used in chemistry. + +defineMacro("\\minuso", "\\mathbin{\\html@mathml{" + "{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}" + "{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}" + "{\\char`⦵}}"); +defineMacro("⦵", "\\minuso"); ////////////////////////////////////////////////////////////////////// // texvc.sty // The texvc package contains macros available in mediawiki pages. // We omit the functions deprecated at @@ -14345,15 +15097,24 @@ defineMacro("\\Zeta", "\\mathrm{Z}"); ////////////////////////////////////////// // statmath.sty // https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf -defineMacro("\\argmin", "\\DOTSB\\mathop{\\operatorname{arg\\,min}}\\limits"); -defineMacro("\\argmax", "\\DOTSB\\mathop{\\operatorname{arg\\,max}}\\limits"); // Custom Khan Academy colors, should be moved to an optional package +defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); +defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); +defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"); ////////////////////////////////////////////////////////////////////// +// braket.sty +// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf + +defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); +defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); +defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); +defineMacro("\\Bra", "\\left\\langle#1\\right|"); +defineMacro("\\Ket", "\\left|#1\\right\\rangle"); // Custom Khan Academy colors, should be moved to an optional package defineMacro("\\blue", "\\textcolor{##6495ed}{#1}"); defineMacro("\\orange", "\\textcolor{##ffa500}{#1}"); defineMacro("\\pink", "\\textcolor{##ff00af}{#1}"); defineMacro("\\red", "\\textcolor{##df0030}{#1}"); defineMacro("\\green", "\\textcolor{##28ae7b}{#1}"); -defineMacro("\\gray", "\\textcolor{gray}{##1}"); +defineMacro("\\gray", "\\textcolor{gray}{#1}"); defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}"); defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}"); defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}"); @@ -14606,18 +15367,22 @@ function () { * At the moment, macro expansion doesn't handle delimited macros, * i.e. things like those defined by \def\foo#1\end{…}. * See the TeX book page 202ff. for details on how those should behave. + * + * If expandableOnly, only expandable tokens are expanded and + * an undefined control sequence results in an error. */ ; - _proto.expandOnce = function expandOnce() { + _proto.expandOnce = function expandOnce(expandableOnly) { var topToken = this.popToken(); var name = topToken.text; + var expansion = !topToken.noexpand ? this._getExpansion(name) : null; - var expansion = this._getExpansion(name); + if (expansion == null || expandableOnly && expansion.unexpandable) { + if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { + throw new src_ParseError("Undefined control sequence: " + name); + } - if (expansion == null) { - // mainly checking for undefined here - // Fully expanded this.pushToken(topToken); return topToken; } @@ -14688,7 +15453,9 @@ function () { if (expanded instanceof Token_Token) { // \relax stops the expansion, but shouldn't get returned (a // null return value couldn't get implemented as a function). - if (expanded.text === "\\relax") { + // the token after \noexpand is interpreted as if its meaning + // were ‘\relax’ + if (expanded.text === "\\relax" || expanded.treatAsRelax) { this.stack.pop(); } else { return this.stack.pop(); // === expanded @@ -14707,18 +15474,29 @@ function () { ; _proto.expandMacro = function expandMacro(name) { - if (!this.macros.get(name)) { - return undefined; - } + return this.macros.has(name) ? this.expandTokens([new Token_Token(name)]) : undefined; + } + /** + * Fully expand the given token stream and return the resulting list of tokens + */ + ; + _proto.expandTokens = function expandTokens(tokens) { var output = []; var oldStackLength = this.stack.length; - this.pushToken(new Token_Token(name)); + this.pushTokens(tokens); while (this.stack.length > oldStackLength) { - var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded. + var expanded = this.expandOnce(true); // expand only expandable tokens + // expandOnce returns Token if and only if it's fully expanded. if (expanded instanceof Token_Token) { + if (expanded.treatAsRelax) { + // the expansion of \noexpand is the token itself + expanded.noexpand = false; + expanded.treatAsRelax = false; + } + output.push(this.stack.pop()); } } @@ -14799,700 +15577,24 @@ function () { _proto.isDefined = function isDefined(name) { return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name); + } + /** + * Determine whether a command is expandable. + */ + ; + + _proto.isExpandable = function isExpandable(name) { + var macro = this.macros.get(name); + return macro != null ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable // TODO(ylem): #2085 + : src_functions.hasOwnProperty(name) + /* && !functions[name].primitive*/ + ; }; return MacroExpander; }(); -// CONCATENATED MODULE: ./src/unicodeAccents.js -// Mapping of Unicode accent characters to their LaTeX equivalent in text and -// math mode (when they exist). -/* harmony default export */ var unicodeAccents = ({ - "\u0301": { - text: "\\'", - math: '\\acute' - }, - "\u0300": { - text: '\\`', - math: '\\grave' - }, - "\u0308": { - text: '\\"', - math: '\\ddot' - }, - "\u0303": { - text: '\\~', - math: '\\tilde' - }, - "\u0304": { - text: '\\=', - math: '\\bar' - }, - "\u0306": { - text: "\\u", - math: '\\breve' - }, - "\u030C": { - text: '\\v', - math: '\\check' - }, - "\u0302": { - text: '\\^', - math: '\\hat' - }, - "\u0307": { - text: '\\.', - math: '\\dot' - }, - "\u030A": { - text: '\\r', - math: '\\mathring' - }, - "\u030B": { - text: '\\H' - } -}); -// CONCATENATED MODULE: ./src/unicodeSymbols.js -// This file is GENERATED by unicodeMake.js. DO NOT MODIFY. -/* harmony default export */ var unicodeSymbols = ({ - "\xE1": "a\u0301", - // á = \'{a} - "\xE0": "a\u0300", - // à = \`{a} - "\xE4": "a\u0308", - // ä = \"{a} - "\u01DF": "a\u0308\u0304", - // ǟ = \"\={a} - "\xE3": "a\u0303", - // ã = \~{a} - "\u0101": "a\u0304", - // ā = \={a} - "\u0103": "a\u0306", - // ă = \u{a} - "\u1EAF": "a\u0306\u0301", - // ắ = \u\'{a} - "\u1EB1": "a\u0306\u0300", - // ằ = \u\`{a} - "\u1EB5": "a\u0306\u0303", - // ẵ = \u\~{a} - "\u01CE": "a\u030C", - // ǎ = \v{a} - "\xE2": "a\u0302", - // â = \^{a} - "\u1EA5": "a\u0302\u0301", - // ấ = \^\'{a} - "\u1EA7": "a\u0302\u0300", - // ầ = \^\`{a} - "\u1EAB": "a\u0302\u0303", - // ẫ = \^\~{a} - "\u0227": "a\u0307", - // ȧ = \.{a} - "\u01E1": "a\u0307\u0304", - // ǡ = \.\={a} - "\xE5": "a\u030A", - // å = \r{a} - "\u01FB": "a\u030A\u0301", - // ǻ = \r\'{a} - "\u1E03": "b\u0307", - // ḃ = \.{b} - "\u0107": "c\u0301", - // ć = \'{c} - "\u010D": "c\u030C", - // č = \v{c} - "\u0109": "c\u0302", - // ĉ = \^{c} - "\u010B": "c\u0307", - // ċ = \.{c} - "\u010F": "d\u030C", - // ď = \v{d} - "\u1E0B": "d\u0307", - // ḋ = \.{d} - "\xE9": "e\u0301", - // é = \'{e} - "\xE8": "e\u0300", - // è = \`{e} - "\xEB": "e\u0308", - // ë = \"{e} - "\u1EBD": "e\u0303", - // ẽ = \~{e} - "\u0113": "e\u0304", - // ē = \={e} - "\u1E17": "e\u0304\u0301", - // ḗ = \=\'{e} - "\u1E15": "e\u0304\u0300", - // ḕ = \=\`{e} - "\u0115": "e\u0306", - // ĕ = \u{e} - "\u011B": "e\u030C", - // ě = \v{e} - "\xEA": "e\u0302", - // ê = \^{e} - "\u1EBF": "e\u0302\u0301", - // ế = \^\'{e} - "\u1EC1": "e\u0302\u0300", - // ề = \^\`{e} - "\u1EC5": "e\u0302\u0303", - // ễ = \^\~{e} - "\u0117": "e\u0307", - // ė = \.{e} - "\u1E1F": "f\u0307", - // ḟ = \.{f} - "\u01F5": "g\u0301", - // ǵ = \'{g} - "\u1E21": "g\u0304", - // ḡ = \={g} - "\u011F": "g\u0306", - // ğ = \u{g} - "\u01E7": "g\u030C", - // ǧ = \v{g} - "\u011D": "g\u0302", - // ĝ = \^{g} - "\u0121": "g\u0307", - // ġ = \.{g} - "\u1E27": "h\u0308", - // ḧ = \"{h} - "\u021F": "h\u030C", - // ȟ = \v{h} - "\u0125": "h\u0302", - // ĥ = \^{h} - "\u1E23": "h\u0307", - // ḣ = \.{h} - "\xED": "i\u0301", - // í = \'{i} - "\xEC": "i\u0300", - // ì = \`{i} - "\xEF": "i\u0308", - // ï = \"{i} - "\u1E2F": "i\u0308\u0301", - // ḯ = \"\'{i} - "\u0129": "i\u0303", - // ĩ = \~{i} - "\u012B": "i\u0304", - // ī = \={i} - "\u012D": "i\u0306", - // ĭ = \u{i} - "\u01D0": "i\u030C", - // ǐ = \v{i} - "\xEE": "i\u0302", - // î = \^{i} - "\u01F0": "j\u030C", - // ǰ = \v{j} - "\u0135": "j\u0302", - // ĵ = \^{j} - "\u1E31": "k\u0301", - // ḱ = \'{k} - "\u01E9": "k\u030C", - // ǩ = \v{k} - "\u013A": "l\u0301", - // ĺ = \'{l} - "\u013E": "l\u030C", - // ľ = \v{l} - "\u1E3F": "m\u0301", - // ḿ = \'{m} - "\u1E41": "m\u0307", - // ṁ = \.{m} - "\u0144": "n\u0301", - // ń = \'{n} - "\u01F9": "n\u0300", - // ǹ = \`{n} - "\xF1": "n\u0303", - // ñ = \~{n} - "\u0148": "n\u030C", - // ň = \v{n} - "\u1E45": "n\u0307", - // ṅ = \.{n} - "\xF3": "o\u0301", - // ó = \'{o} - "\xF2": "o\u0300", - // ò = \`{o} - "\xF6": "o\u0308", - // ö = \"{o} - "\u022B": "o\u0308\u0304", - // ȫ = \"\={o} - "\xF5": "o\u0303", - // õ = \~{o} - "\u1E4D": "o\u0303\u0301", - // ṍ = \~\'{o} - "\u1E4F": "o\u0303\u0308", - // ṏ = \~\"{o} - "\u022D": "o\u0303\u0304", - // ȭ = \~\={o} - "\u014D": "o\u0304", - // ō = \={o} - "\u1E53": "o\u0304\u0301", - // ṓ = \=\'{o} - "\u1E51": "o\u0304\u0300", - // ṑ = \=\`{o} - "\u014F": "o\u0306", - // ŏ = \u{o} - "\u01D2": "o\u030C", - // ǒ = \v{o} - "\xF4": "o\u0302", - // ô = \^{o} - "\u1ED1": "o\u0302\u0301", - // ố = \^\'{o} - "\u1ED3": "o\u0302\u0300", - // ồ = \^\`{o} - "\u1ED7": "o\u0302\u0303", - // ỗ = \^\~{o} - "\u022F": "o\u0307", - // ȯ = \.{o} - "\u0231": "o\u0307\u0304", - // ȱ = \.\={o} - "\u0151": "o\u030B", - // ő = \H{o} - "\u1E55": "p\u0301", - // ṕ = \'{p} - "\u1E57": "p\u0307", - // ṗ = \.{p} - "\u0155": "r\u0301", - // ŕ = \'{r} - "\u0159": "r\u030C", - // ř = \v{r} - "\u1E59": "r\u0307", - // ṙ = \.{r} - "\u015B": "s\u0301", - // ś = \'{s} - "\u1E65": "s\u0301\u0307", - // ṥ = \'\.{s} - "\u0161": "s\u030C", - // š = \v{s} - "\u1E67": "s\u030C\u0307", - // ṧ = \v\.{s} - "\u015D": "s\u0302", - // ŝ = \^{s} - "\u1E61": "s\u0307", - // ṡ = \.{s} - "\u1E97": "t\u0308", - // ẗ = \"{t} - "\u0165": "t\u030C", - // ť = \v{t} - "\u1E6B": "t\u0307", - // ṫ = \.{t} - "\xFA": "u\u0301", - // ú = \'{u} - "\xF9": "u\u0300", - // ù = \`{u} - "\xFC": "u\u0308", - // ü = \"{u} - "\u01D8": "u\u0308\u0301", - // ǘ = \"\'{u} - "\u01DC": "u\u0308\u0300", - // ǜ = \"\`{u} - "\u01D6": "u\u0308\u0304", - // ǖ = \"\={u} - "\u01DA": "u\u0308\u030C", - // ǚ = \"\v{u} - "\u0169": "u\u0303", - // ũ = \~{u} - "\u1E79": "u\u0303\u0301", - // ṹ = \~\'{u} - "\u016B": "u\u0304", - // ū = \={u} - "\u1E7B": "u\u0304\u0308", - // ṻ = \=\"{u} - "\u016D": "u\u0306", - // ŭ = \u{u} - "\u01D4": "u\u030C", - // ǔ = \v{u} - "\xFB": "u\u0302", - // û = \^{u} - "\u016F": "u\u030A", - // ů = \r{u} - "\u0171": "u\u030B", - // ű = \H{u} - "\u1E7D": "v\u0303", - // ṽ = \~{v} - "\u1E83": "w\u0301", - // ẃ = \'{w} - "\u1E81": "w\u0300", - // ẁ = \`{w} - "\u1E85": "w\u0308", - // ẅ = \"{w} - "\u0175": "w\u0302", - // ŵ = \^{w} - "\u1E87": "w\u0307", - // ẇ = \.{w} - "\u1E98": "w\u030A", - // ẘ = \r{w} - "\u1E8D": "x\u0308", - // ẍ = \"{x} - "\u1E8B": "x\u0307", - // ẋ = \.{x} - "\xFD": "y\u0301", - // ý = \'{y} - "\u1EF3": "y\u0300", - // ỳ = \`{y} - "\xFF": "y\u0308", - // ÿ = \"{y} - "\u1EF9": "y\u0303", - // ỹ = \~{y} - "\u0233": "y\u0304", - // ȳ = \={y} - "\u0177": "y\u0302", - // ŷ = \^{y} - "\u1E8F": "y\u0307", - // ẏ = \.{y} - "\u1E99": "y\u030A", - // ẙ = \r{y} - "\u017A": "z\u0301", - // ź = \'{z} - "\u017E": "z\u030C", - // ž = \v{z} - "\u1E91": "z\u0302", - // ẑ = \^{z} - "\u017C": "z\u0307", - // ż = \.{z} - "\xC1": "A\u0301", - // Á = \'{A} - "\xC0": "A\u0300", - // À = \`{A} - "\xC4": "A\u0308", - // Ä = \"{A} - "\u01DE": "A\u0308\u0304", - // Ǟ = \"\={A} - "\xC3": "A\u0303", - // Ã = \~{A} - "\u0100": "A\u0304", - // Ā = \={A} - "\u0102": "A\u0306", - // Ă = \u{A} - "\u1EAE": "A\u0306\u0301", - // Ắ = \u\'{A} - "\u1EB0": "A\u0306\u0300", - // Ằ = \u\`{A} - "\u1EB4": "A\u0306\u0303", - // Ẵ = \u\~{A} - "\u01CD": "A\u030C", - // Ǎ = \v{A} - "\xC2": "A\u0302", - // Â = \^{A} - "\u1EA4": "A\u0302\u0301", - // Ấ = \^\'{A} - "\u1EA6": "A\u0302\u0300", - // Ầ = \^\`{A} - "\u1EAA": "A\u0302\u0303", - // Ẫ = \^\~{A} - "\u0226": "A\u0307", - // Ȧ = \.{A} - "\u01E0": "A\u0307\u0304", - // Ǡ = \.\={A} - "\xC5": "A\u030A", - // Å = \r{A} - "\u01FA": "A\u030A\u0301", - // Ǻ = \r\'{A} - "\u1E02": "B\u0307", - // Ḃ = \.{B} - "\u0106": "C\u0301", - // Ć = \'{C} - "\u010C": "C\u030C", - // Č = \v{C} - "\u0108": "C\u0302", - // Ĉ = \^{C} - "\u010A": "C\u0307", - // Ċ = \.{C} - "\u010E": "D\u030C", - // Ď = \v{D} - "\u1E0A": "D\u0307", - // Ḋ = \.{D} - "\xC9": "E\u0301", - // É = \'{E} - "\xC8": "E\u0300", - // È = \`{E} - "\xCB": "E\u0308", - // Ë = \"{E} - "\u1EBC": "E\u0303", - // Ẽ = \~{E} - "\u0112": "E\u0304", - // Ē = \={E} - "\u1E16": "E\u0304\u0301", - // Ḗ = \=\'{E} - "\u1E14": "E\u0304\u0300", - // Ḕ = \=\`{E} - "\u0114": "E\u0306", - // Ĕ = \u{E} - "\u011A": "E\u030C", - // Ě = \v{E} - "\xCA": "E\u0302", - // Ê = \^{E} - "\u1EBE": "E\u0302\u0301", - // Ế = \^\'{E} - "\u1EC0": "E\u0302\u0300", - // Ề = \^\`{E} - "\u1EC4": "E\u0302\u0303", - // Ễ = \^\~{E} - "\u0116": "E\u0307", - // Ė = \.{E} - "\u1E1E": "F\u0307", - // Ḟ = \.{F} - "\u01F4": "G\u0301", - // Ǵ = \'{G} - "\u1E20": "G\u0304", - // Ḡ = \={G} - "\u011E": "G\u0306", - // Ğ = \u{G} - "\u01E6": "G\u030C", - // Ǧ = \v{G} - "\u011C": "G\u0302", - // Ĝ = \^{G} - "\u0120": "G\u0307", - // Ġ = \.{G} - "\u1E26": "H\u0308", - // Ḧ = \"{H} - "\u021E": "H\u030C", - // Ȟ = \v{H} - "\u0124": "H\u0302", - // Ĥ = \^{H} - "\u1E22": "H\u0307", - // Ḣ = \.{H} - "\xCD": "I\u0301", - // Í = \'{I} - "\xCC": "I\u0300", - // Ì = \`{I} - "\xCF": "I\u0308", - // Ï = \"{I} - "\u1E2E": "I\u0308\u0301", - // Ḯ = \"\'{I} - "\u0128": "I\u0303", - // Ĩ = \~{I} - "\u012A": "I\u0304", - // Ī = \={I} - "\u012C": "I\u0306", - // Ĭ = \u{I} - "\u01CF": "I\u030C", - // Ǐ = \v{I} - "\xCE": "I\u0302", - // Î = \^{I} - "\u0130": "I\u0307", - // İ = \.{I} - "\u0134": "J\u0302", - // Ĵ = \^{J} - "\u1E30": "K\u0301", - // Ḱ = \'{K} - "\u01E8": "K\u030C", - // Ǩ = \v{K} - "\u0139": "L\u0301", - // Ĺ = \'{L} - "\u013D": "L\u030C", - // Ľ = \v{L} - "\u1E3E": "M\u0301", - // Ḿ = \'{M} - "\u1E40": "M\u0307", - // Ṁ = \.{M} - "\u0143": "N\u0301", - // Ń = \'{N} - "\u01F8": "N\u0300", - // Ǹ = \`{N} - "\xD1": "N\u0303", - // Ñ = \~{N} - "\u0147": "N\u030C", - // Ň = \v{N} - "\u1E44": "N\u0307", - // Ṅ = \.{N} - "\xD3": "O\u0301", - // Ó = \'{O} - "\xD2": "O\u0300", - // Ò = \`{O} - "\xD6": "O\u0308", - // Ö = \"{O} - "\u022A": "O\u0308\u0304", - // Ȫ = \"\={O} - "\xD5": "O\u0303", - // Õ = \~{O} - "\u1E4C": "O\u0303\u0301", - // Ṍ = \~\'{O} - "\u1E4E": "O\u0303\u0308", - // Ṏ = \~\"{O} - "\u022C": "O\u0303\u0304", - // Ȭ = \~\={O} - "\u014C": "O\u0304", - // Ō = \={O} - "\u1E52": "O\u0304\u0301", - // Ṓ = \=\'{O} - "\u1E50": "O\u0304\u0300", - // Ṑ = \=\`{O} - "\u014E": "O\u0306", - // Ŏ = \u{O} - "\u01D1": "O\u030C", - // Ǒ = \v{O} - "\xD4": "O\u0302", - // Ô = \^{O} - "\u1ED0": "O\u0302\u0301", - // Ố = \^\'{O} - "\u1ED2": "O\u0302\u0300", - // Ồ = \^\`{O} - "\u1ED6": "O\u0302\u0303", - // Ỗ = \^\~{O} - "\u022E": "O\u0307", - // Ȯ = \.{O} - "\u0230": "O\u0307\u0304", - // Ȱ = \.\={O} - "\u0150": "O\u030B", - // Ő = \H{O} - "\u1E54": "P\u0301", - // Ṕ = \'{P} - "\u1E56": "P\u0307", - // Ṗ = \.{P} - "\u0154": "R\u0301", - // Ŕ = \'{R} - "\u0158": "R\u030C", - // Ř = \v{R} - "\u1E58": "R\u0307", - // Ṙ = \.{R} - "\u015A": "S\u0301", - // Ś = \'{S} - "\u1E64": "S\u0301\u0307", - // Ṥ = \'\.{S} - "\u0160": "S\u030C", - // Š = \v{S} - "\u1E66": "S\u030C\u0307", - // Ṧ = \v\.{S} - "\u015C": "S\u0302", - // Ŝ = \^{S} - "\u1E60": "S\u0307", - // Ṡ = \.{S} - "\u0164": "T\u030C", - // Ť = \v{T} - "\u1E6A": "T\u0307", - // Ṫ = \.{T} - "\xDA": "U\u0301", - // Ú = \'{U} - "\xD9": "U\u0300", - // Ù = \`{U} - "\xDC": "U\u0308", - // Ü = \"{U} - "\u01D7": "U\u0308\u0301", - // Ǘ = \"\'{U} - "\u01DB": "U\u0308\u0300", - // Ǜ = \"\`{U} - "\u01D5": "U\u0308\u0304", - // Ǖ = \"\={U} - "\u01D9": "U\u0308\u030C", - // Ǚ = \"\v{U} - "\u0168": "U\u0303", - // Ũ = \~{U} - "\u1E78": "U\u0303\u0301", - // Ṹ = \~\'{U} - "\u016A": "U\u0304", - // Ū = \={U} - "\u1E7A": "U\u0304\u0308", - // Ṻ = \=\"{U} - "\u016C": "U\u0306", - // Ŭ = \u{U} - "\u01D3": "U\u030C", - // Ǔ = \v{U} - "\xDB": "U\u0302", - // Û = \^{U} - "\u016E": "U\u030A", - // Ů = \r{U} - "\u0170": "U\u030B", - // Ű = \H{U} - "\u1E7C": "V\u0303", - // Ṽ = \~{V} - "\u1E82": "W\u0301", - // Ẃ = \'{W} - "\u1E80": "W\u0300", - // Ẁ = \`{W} - "\u1E84": "W\u0308", - // Ẅ = \"{W} - "\u0174": "W\u0302", - // Ŵ = \^{W} - "\u1E86": "W\u0307", - // Ẇ = \.{W} - "\u1E8C": "X\u0308", - // Ẍ = \"{X} - "\u1E8A": "X\u0307", - // Ẋ = \.{X} - "\xDD": "Y\u0301", - // Ý = \'{Y} - "\u1EF2": "Y\u0300", - // Ỳ = \`{Y} - "\u0178": "Y\u0308", - // Ÿ = \"{Y} - "\u1EF8": "Y\u0303", - // Ỹ = \~{Y} - "\u0232": "Y\u0304", - // Ȳ = \={Y} - "\u0176": "Y\u0302", - // Ŷ = \^{Y} - "\u1E8E": "Y\u0307", - // Ẏ = \.{Y} - "\u0179": "Z\u0301", - // Ź = \'{Z} - "\u017D": "Z\u030C", - // Ž = \v{Z} - "\u1E90": "Z\u0302", - // Ẑ = \^{Z} - "\u017B": "Z\u0307", - // Ż = \.{Z} - "\u03AC": "\u03B1\u0301", - // ά = \'{α} - "\u1F70": "\u03B1\u0300", - // ὰ = \`{α} - "\u1FB1": "\u03B1\u0304", - // ᾱ = \={α} - "\u1FB0": "\u03B1\u0306", - // ᾰ = \u{α} - "\u03AD": "\u03B5\u0301", - // έ = \'{ε} - "\u1F72": "\u03B5\u0300", - // ὲ = \`{ε} - "\u03AE": "\u03B7\u0301", - // ή = \'{η} - "\u1F74": "\u03B7\u0300", - // ὴ = \`{η} - "\u03AF": "\u03B9\u0301", - // ί = \'{ι} - "\u1F76": "\u03B9\u0300", - // ὶ = \`{ι} - "\u03CA": "\u03B9\u0308", - // ϊ = \"{ι} - "\u0390": "\u03B9\u0308\u0301", - // ΐ = \"\'{ι} - "\u1FD2": "\u03B9\u0308\u0300", - // ῒ = \"\`{ι} - "\u1FD1": "\u03B9\u0304", - // ῑ = \={ι} - "\u1FD0": "\u03B9\u0306", - // ῐ = \u{ι} - "\u03CC": "\u03BF\u0301", - // ό = \'{ο} - "\u1F78": "\u03BF\u0300", - // ὸ = \`{ο} - "\u03CD": "\u03C5\u0301", - // ύ = \'{υ} - "\u1F7A": "\u03C5\u0300", - // ὺ = \`{υ} - "\u03CB": "\u03C5\u0308", - // ϋ = \"{υ} - "\u03B0": "\u03C5\u0308\u0301", - // ΰ = \"\'{υ} - "\u1FE2": "\u03C5\u0308\u0300", - // ῢ = \"\`{υ} - "\u1FE1": "\u03C5\u0304", - // ῡ = \={υ} - "\u1FE0": "\u03C5\u0306", - // ῠ = \u{υ} - "\u03CE": "\u03C9\u0301", - // ώ = \'{ω} - "\u1F7C": "\u03C9\u0300", - // ὼ = \`{ω} - "\u038E": "\u03A5\u0301", - // Ύ = \'{Υ} - "\u1FEA": "\u03A5\u0300", - // Ὺ = \`{Υ} - "\u03AB": "\u03A5\u0308", - // Ϋ = \"{Υ} - "\u1FE9": "\u03A5\u0304", - // Ῡ = \={Υ} - "\u1FE8": "\u03A5\u0306", - // Ῠ = \u{Υ} - "\u038F": "\u03A9\u0301", - // Ώ = \'{Ω} - "\u1FFA": "\u03A9\u0300" // Ὼ = \`{Ω} - -}); // CONCATENATED MODULE: ./src/Parser.js /* eslint no-constant-condition:0 */ @@ -15504,11 +15606,373 @@ function () { + // Pre-evaluate both modules as unicodeSymbols require String.normalize() - - - - +var unicodeAccents = { + "́": { + "text": "\\'", + "math": "\\acute" + }, + "̀": { + "text": "\\`", + "math": "\\grave" + }, + "̈": { + "text": "\\\"", + "math": "\\ddot" + }, + "̃": { + "text": "\\~", + "math": "\\tilde" + }, + "̄": { + "text": "\\=", + "math": "\\bar" + }, + "̆": { + "text": "\\u", + "math": "\\breve" + }, + "̌": { + "text": "\\v", + "math": "\\check" + }, + "̂": { + "text": "\\^", + "math": "\\hat" + }, + "̇": { + "text": "\\.", + "math": "\\dot" + }, + "̊": { + "text": "\\r", + "math": "\\mathring" + }, + "̋": { + "text": "\\H" + } +}; +var unicodeSymbols = { + "á": "á", + "à": "à", + "ä": "ä", + "ǟ": "ǟ", + "ã": "ã", + "ā": "ā", + "ă": "ă", + "ắ": "ắ", + "ằ": "ằ", + "ẵ": "ẵ", + "ǎ": "ǎ", + "â": "â", + "ấ": "ấ", + "ầ": "ầ", + "ẫ": "ẫ", + "ȧ": "ȧ", + "ǡ": "ǡ", + "å": "å", + "ǻ": "ǻ", + "ḃ": "ḃ", + "ć": "ć", + "č": "č", + "ĉ": "ĉ", + "ċ": "ċ", + "ď": "ď", + "ḋ": "ḋ", + "é": "é", + "è": "è", + "ë": "ë", + "ẽ": "ẽ", + "ē": "ē", + "ḗ": "ḗ", + "ḕ": "ḕ", + "ĕ": "ĕ", + "ě": "ě", + "ê": "ê", + "ế": "ế", + "ề": "ề", + "ễ": "ễ", + "ė": "ė", + "ḟ": "ḟ", + "ǵ": "ǵ", + "ḡ": "ḡ", + "ğ": "ğ", + "ǧ": "ǧ", + "ĝ": "ĝ", + "ġ": "ġ", + "ḧ": "ḧ", + "ȟ": "ȟ", + "ĥ": "ĥ", + "ḣ": "ḣ", + "í": "í", + "ì": "ì", + "ï": "ï", + "ḯ": "ḯ", + "ĩ": "ĩ", + "ī": "ī", + "ĭ": "ĭ", + "ǐ": "ǐ", + "î": "î", + "ǰ": "ǰ", + "ĵ": "ĵ", + "ḱ": "ḱ", + "ǩ": "ǩ", + "ĺ": "ĺ", + "ľ": "ľ", + "ḿ": "ḿ", + "ṁ": "ṁ", + "ń": "ń", + "ǹ": "ǹ", + "ñ": "ñ", + "ň": "ň", + "ṅ": "ṅ", + "ó": "ó", + "ò": "ò", + "ö": "ö", + "ȫ": "ȫ", + "õ": "õ", + "ṍ": "ṍ", + "ṏ": "ṏ", + "ȭ": "ȭ", + "ō": "ō", + "ṓ": "ṓ", + "ṑ": "ṑ", + "ŏ": "ŏ", + "ǒ": "ǒ", + "ô": "ô", + "ố": "ố", + "ồ": "ồ", + "ỗ": "ỗ", + "ȯ": "ȯ", + "ȱ": "ȱ", + "ő": "ő", + "ṕ": "ṕ", + "ṗ": "ṗ", + "ŕ": "ŕ", + "ř": "ř", + "ṙ": "ṙ", + "ś": "ś", + "ṥ": "ṥ", + "š": "š", + "ṧ": "ṧ", + "ŝ": "ŝ", + "ṡ": "ṡ", + "ẗ": "ẗ", + "ť": "ť", + "ṫ": "ṫ", + "ú": "ú", + "ù": "ù", + "ü": "ü", + "ǘ": "ǘ", + "ǜ": "ǜ", + "ǖ": "ǖ", + "ǚ": "ǚ", + "ũ": "ũ", + "ṹ": "ṹ", + "ū": "ū", + "ṻ": "ṻ", + "ŭ": "ŭ", + "ǔ": "ǔ", + "û": "û", + "ů": "ů", + "ű": "ű", + "ṽ": "ṽ", + "ẃ": "ẃ", + "ẁ": "ẁ", + "ẅ": "ẅ", + "ŵ": "ŵ", + "ẇ": "ẇ", + "ẘ": "ẘ", + "ẍ": "ẍ", + "ẋ": "ẋ", + "ý": "ý", + "ỳ": "ỳ", + "ÿ": "ÿ", + "ỹ": "ỹ", + "ȳ": "ȳ", + "ŷ": "ŷ", + "ẏ": "ẏ", + "ẙ": "ẙ", + "ź": "ź", + "ž": "ž", + "ẑ": "ẑ", + "ż": "ż", + "Á": "Á", + "À": "À", + "Ä": "Ä", + "Ǟ": "Ǟ", + "Ã": "Ã", + "Ā": "Ā", + "Ă": "Ă", + "Ắ": "Ắ", + "Ằ": "Ằ", + "Ẵ": "Ẵ", + "Ǎ": "Ǎ", + "Â": "Â", + "Ấ": "Ấ", + "Ầ": "Ầ", + "Ẫ": "Ẫ", + "Ȧ": "Ȧ", + "Ǡ": "Ǡ", + "Å": "Å", + "Ǻ": "Ǻ", + "Ḃ": "Ḃ", + "Ć": "Ć", + "Č": "Č", + "Ĉ": "Ĉ", + "Ċ": "Ċ", + "Ď": "Ď", + "Ḋ": "Ḋ", + "É": "É", + "È": "È", + "Ë": "Ë", + "Ẽ": "Ẽ", + "Ē": "Ē", + "Ḗ": "Ḗ", + "Ḕ": "Ḕ", + "Ĕ": "Ĕ", + "Ě": "Ě", + "Ê": "Ê", + "Ế": "Ế", + "Ề": "Ề", + "Ễ": "Ễ", + "Ė": "Ė", + "Ḟ": "Ḟ", + "Ǵ": "Ǵ", + "Ḡ": "Ḡ", + "Ğ": "Ğ", + "Ǧ": "Ǧ", + "Ĝ": "Ĝ", + "Ġ": "Ġ", + "Ḧ": "Ḧ", + "Ȟ": "Ȟ", + "Ĥ": "Ĥ", + "Ḣ": "Ḣ", + "Í": "Í", + "Ì": "Ì", + "Ï": "Ï", + "Ḯ": "Ḯ", + "Ĩ": "Ĩ", + "Ī": "Ī", + "Ĭ": "Ĭ", + "Ǐ": "Ǐ", + "Î": "Î", + "İ": "İ", + "Ĵ": "Ĵ", + "Ḱ": "Ḱ", + "Ǩ": "Ǩ", + "Ĺ": "Ĺ", + "Ľ": "Ľ", + "Ḿ": "Ḿ", + "Ṁ": "Ṁ", + "Ń": "Ń", + "Ǹ": "Ǹ", + "Ñ": "Ñ", + "Ň": "Ň", + "Ṅ": "Ṅ", + "Ó": "Ó", + "Ò": "Ò", + "Ö": "Ö", + "Ȫ": "Ȫ", + "Õ": "Õ", + "Ṍ": "Ṍ", + "Ṏ": "Ṏ", + "Ȭ": "Ȭ", + "Ō": "Ō", + "Ṓ": "Ṓ", + "Ṑ": "Ṑ", + "Ŏ": "Ŏ", + "Ǒ": "Ǒ", + "Ô": "Ô", + "Ố": "Ố", + "Ồ": "Ồ", + "Ỗ": "Ỗ", + "Ȯ": "Ȯ", + "Ȱ": "Ȱ", + "Ő": "Ő", + "Ṕ": "Ṕ", + "Ṗ": "Ṗ", + "Ŕ": "Ŕ", + "Ř": "Ř", + "Ṙ": "Ṙ", + "Ś": "Ś", + "Ṥ": "Ṥ", + "Š": "Š", + "Ṧ": "Ṧ", + "Ŝ": "Ŝ", + "Ṡ": "Ṡ", + "Ť": "Ť", + "Ṫ": "Ṫ", + "Ú": "Ú", + "Ù": "Ù", + "Ü": "Ü", + "Ǘ": "Ǘ", + "Ǜ": "Ǜ", + "Ǖ": "Ǖ", + "Ǚ": "Ǚ", + "Ũ": "Ũ", + "Ṹ": "Ṹ", + "Ū": "Ū", + "Ṻ": "Ṻ", + "Ŭ": "Ŭ", + "Ǔ": "Ǔ", + "Û": "Û", + "Ů": "Ů", + "Ű": "Ű", + "Ṽ": "Ṽ", + "Ẃ": "Ẃ", + "Ẁ": "Ẁ", + "Ẅ": "Ẅ", + "Ŵ": "Ŵ", + "Ẇ": "Ẇ", + "Ẍ": "Ẍ", + "Ẋ": "Ẋ", + "Ý": "Ý", + "Ỳ": "Ỳ", + "Ÿ": "Ÿ", + "Ỹ": "Ỹ", + "Ȳ": "Ȳ", + "Ŷ": "Ŷ", + "Ẏ": "Ẏ", + "Ź": "Ź", + "Ž": "Ž", + "Ẑ": "Ẑ", + "Ż": "Ż", + "ά": "ά", + "ὰ": "ὰ", + "ᾱ": "ᾱ", + "ᾰ": "ᾰ", + "έ": "έ", + "ὲ": "ὲ", + "ή": "ή", + "ὴ": "ὴ", + "ί": "ί", + "ὶ": "ὶ", + "ϊ": "ϊ", + "ΐ": "ΐ", + "ῒ": "ῒ", + "ῑ": "ῑ", + "ῐ": "ῐ", + "ό": "ό", + "ὸ": "ὸ", + "ύ": "ύ", + "ὺ": "ὺ", + "ϋ": "ϋ", + "ΰ": "ΰ", + "ῢ": "ῢ", + "ῡ": "ῡ", + "ῠ": "ῠ", + "ώ": "ώ", + "ὼ": "ὼ", + "Ύ": "Ύ", + "Ὺ": "Ὺ", + "Ϋ": "Ϋ", + "Ῡ": "Ῡ", + "Ῠ": "Ῠ", + "Ώ": "Ώ", + "Ὼ": "Ὼ" +}; /** * This file contains the parser used to parse out a TeX expression from the @@ -15571,8 +16035,8 @@ function () { consume = true; } - if (this.nextToken.text !== text) { - throw new src_ParseError("Expected '" + text + "', got '" + this.nextToken.text + "'", this.nextToken); + if (this.fetch().text !== text) { + throw new src_ParseError("Expected '" + text + "', got '" + this.fetch().text + "'", this.fetch()); } if (consume) { @@ -15580,13 +16044,26 @@ function () { } } /** - * Considers the current look ahead token as consumed, - * and fetches the one after that as the new look ahead. + * Discards the current lookahead token, considering it consumed. */ ; _proto.consume = function consume() { - this.nextToken = this.gullet.expandNextToken(); + this.nextToken = null; + } + /** + * Return the current lookahead token, or if there isn't one (at the + * beginning, or if the previous lookahead token was consume()d), + * fetch the next token as the new lookahead token and return it. + */ + ; + + _proto.fetch = function fetch() { + if (this.nextToken == null) { + this.nextToken = this.gullet.expandNextToken(); + } + + return this.nextToken; } /** * Switches between "text" and "math" modes. @@ -15603,23 +16080,28 @@ function () { ; _proto.parse = function parse() { - // Create a group namespace for the math expression. - // (LaTeX creates a new group for every $...$, $$...$$, \[...\].) - this.gullet.beginGroup(); // Use old \color behavior (same as LaTeX's \textcolor) if requested. + if (!this.settings.globalGroup) { + // Create a group namespace for the math expression. + // (LaTeX creates a new group for every $...$, $$...$$, \[...\].) + this.gullet.beginGroup(); + } // Use old \color behavior (same as LaTeX's \textcolor) if requested. // We do this within the group for the math expression, so it doesn't // pollute settings.macros. + if (this.settings.colorIsTextColor) { this.gullet.macros.set("\\color", "\\textcolor"); } // Try to parse the input - this.consume(); var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end - this.expect("EOF", false); // End the group namespace for the expression + this.expect("EOF"); // End the group namespace for the expression + + if (!this.settings.globalGroup) { + this.gullet.endGroup(); + } - this.gullet.endGroup(); return parse; }; @@ -15633,7 +16115,7 @@ function () { this.consumeSpaces(); } - var lex = this.nextToken; + var lex = this.fetch(); if (Parser.endOfExpression.indexOf(lex.text) !== -1) { break; @@ -15651,6 +16133,8 @@ function () { if (!atom) { break; + } else if (atom.type === "internal") { + continue; } body.push(atom); @@ -15676,15 +16160,13 @@ function () { var funcName; for (var i = 0; i < body.length; i++) { - var node = checkNodeType(body[i], "infix"); - - if (node) { + if (body[i].type === "infix") { if (overIndex !== -1) { - throw new src_ParseError("only one infix operator per group", node.token); + throw new src_ParseError("only one infix operator per group", body[i].token); } overIndex = i; - funcName = node.replaceWith; + funcName = body[i].replaceWith; } } @@ -15714,15 +16196,15 @@ function () { }; } - var _node; + var node; if (funcName === "\\\\abovefrac") { - _node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); + node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); } else { - _node = this.callFunction(funcName, [numerNode, denomNode], []); + node = this.callFunction(funcName, [numerNode, denomNode], []); } - return [_node]; + return [node]; } else { return body; } @@ -15733,12 +16215,10 @@ function () { * Handle a subscript or superscript with nice errors. */ _proto.handleSupSubscript = function handleSupSubscript(name) { - var symbolToken = this.nextToken; + var symbolToken = this.fetch(); var symbol = symbolToken.text; this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - - var group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS); + var group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS, undefined, undefined, true); // ignore spaces before sup/subscript argument if (!group) { throw new src_ParseError("Expected group after '" + symbol + "'", symbolToken); @@ -15752,8 +16232,7 @@ function () { */ ; - _proto.handleUnsupportedCmd = function handleUnsupportedCmd() { - var text = this.nextToken.text; + _proto.formatUnsupportedCmd = function formatUnsupportedCmd(text) { var textordArray = []; for (var i = 0; i < text.length; i++) { @@ -15775,7 +16254,6 @@ function () { color: this.settings.errorColor, body: [textNode] }; - this.consume(); return colorNode; } /** @@ -15800,16 +16278,18 @@ function () { // Guaranteed in math mode, so eat any spaces first. this.consumeSpaces(); // Lex the first token - var lex = this.nextToken; + var lex = this.fetch(); if (lex.text === "\\limits" || lex.text === "\\nolimits") { // We got a limit control - var opNode = checkNodeType(base, "op"); - - if (opNode) { + if (base && base.type === "op") { var limits = lex.text === "\\limits"; - opNode.limits = limits; - opNode.alwaysHandleSupSub = true; + base.limits = limits; + base.alwaysHandleSupSub = true; + } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub) { + var _limits = lex.text === "\\limits"; + + base.limits = _limits; } else { throw new src_ParseError("Limit controls must follow a math operator", lex); } @@ -15844,7 +16324,7 @@ function () { var primes = [prime]; this.consume(); // Keep lexing tokens until we get something that's not a prime - while (this.nextToken.text === "'") { + while (this.fetch().text === "'") { // For each one, add another prime to the list primes.push(prime); this.consume(); @@ -15852,7 +16332,7 @@ function () { // superscript in with the primes. - if (this.nextToken.text === "^") { + if (this.fetch().text === "^") { primes.push(this.handleSupSubscript("superscript")); } // Put everything into an ordgroup as the superscript @@ -15891,7 +16371,7 @@ function () { _proto.parseFunction = function parseFunction(breakOnTokenText, name, // For error reporting. greediness) { - var token = this.nextToken; + var token = this.fetch(); var func = token.text; var funcData = src_functions[func]; @@ -15899,29 +16379,14 @@ function () { return null; } + this.consume(); // consume command token + if (greediness != null && funcData.greediness <= greediness) { throw new src_ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token); } else if (this.mode === "text" && !funcData.allowedInText) { throw new src_ParseError("Can't use function '" + func + "' in text mode", token); } else if (this.mode === "math" && funcData.allowedInMath === false) { throw new src_ParseError("Can't use function '" + func + "' in math mode", token); - } // hyperref package sets the catcode of % as an active character - - - if (funcData.argTypes && funcData.argTypes[0] === "url") { - this.gullet.lexer.setCatcode("%", 13); - } // Consume the command token after possibly switching to the - // mode specified by the function (for instant mode switching), - // and then immediately switch back. - - - if (funcData.consumeMode) { - var oldMode = this.mode; - this.switchMode(funcData.consumeMode); - this.consume(); - this.switchMode(oldMode); - } else { - this.consume(); } var _this$parseArguments = this.parseArguments(func, funcData), @@ -15977,22 +16442,14 @@ function () { // put spaces between the arguments (e.g., ‘\row x n’), because // TeX doesn’t use single spaces as undelimited arguments." - if (i > 0 && !isOptional) { - this.consumeSpaces(); - } // Also consume leading spaces in math mode, as parseSymbol + var consumeSpaces = i > 0 && !isOptional || // Also consume leading spaces in math mode, as parseSymbol // won't know what to do with them. This can only happen with // macros, e.g. \frac\foo\foo where \foo expands to a space symbol. - // In LaTeX, the \foo's get treated as (blank) arguments). + // In LaTeX, the \foo's get treated as (blank) arguments. // In KaTeX, for now, both spaces will get consumed. // TODO(edemaine) - - - if (i === 0 && !isOptional && this.mode === "math") { - this.consumeSpaces(); - } - - var nextToken = this.nextToken; - var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional, baseGreediness); + i === 0 && !isOptional && this.mode === "math"; + var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional, baseGreediness, consumeSpaces); if (!arg) { if (isOptional) { @@ -16000,7 +16457,7 @@ function () { continue; } - throw new src_ParseError("Expected group after '" + func + "'", nextToken); + throw new src_ParseError("Expected group after '" + func + "'", this.fetch()); } (isOptional ? optArgs : args).push(arg); @@ -16016,24 +16473,56 @@ function () { */ ; - _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness) { + _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness, consumeSpaces) { switch (type) { case "color": + if (consumeSpaces) { + this.consumeSpaces(); + } + return this.parseColorGroup(optional); case "size": + if (consumeSpaces) { + this.consumeSpaces(); + } + return this.parseSizeGroup(optional); case "url": - return this.parseUrlGroup(optional); + return this.parseUrlGroup(optional, consumeSpaces); case "math": case "text": - return this.parseGroup(name, optional, greediness, undefined, type); + return this.parseGroup(name, optional, greediness, undefined, type, consumeSpaces); + + case "hbox": + { + // hbox argument type wraps the argument in the equivalent of + // \hbox, which is like \text but switching to \textstyle size. + var group = this.parseGroup(name, optional, greediness, undefined, "text", consumeSpaces); + + if (!group) { + return group; + } + + var styledGroup = { + type: "styling", + mode: group.mode, + body: [group], + style: "text" // simulate \textstyle + + }; + return styledGroup; + } case "raw": { - if (optional && this.nextToken.text === "{") { + if (consumeSpaces) { + this.consumeSpaces(); + } + + if (optional && this.fetch().text === "{") { return null; } @@ -16046,22 +16535,26 @@ function () { string: token.text }; } else { - throw new src_ParseError("Expected raw group", this.nextToken); + throw new src_ParseError("Expected raw group", this.fetch()); } } case "original": case null: case undefined: - return this.parseGroup(name, optional, greediness); + return this.parseGroup(name, optional, greediness, undefined, undefined, consumeSpaces); default: - throw new src_ParseError("Unknown group type as " + name, this.nextToken); + throw new src_ParseError("Unknown group type as " + name, this.fetch()); } - }; + } + /** + * Discard any space tokens, fetching the next non-space token. + */ + ; _proto.consumeSpaces = function consumeSpaces() { - while (this.nextToken.text === " ") { + while (this.fetch().text === " ") { this.consume(); } } @@ -16075,17 +16568,14 @@ function () { optional, raw) { var groupBegin = optional ? "[" : "{"; var groupEnd = optional ? "]" : "}"; - var nextToken = this.nextToken; + var beginToken = this.fetch(); - if (nextToken.text !== groupBegin) { + if (beginToken.text !== groupBegin) { if (optional) { return null; - } else if (raw && nextToken.text !== "EOF" && /[^{}[\]]/.test(nextToken.text)) { - // allow a single character in raw string group - this.gullet.lexer.setCatcode("%", 14); // reset the catcode of % - + } else if (raw && beginToken.text !== "EOF" && /[^{}[\]]/.test(beginToken.text)) { this.consume(); - return nextToken; + return beginToken; } } @@ -16093,13 +16583,14 @@ function () { this.mode = "text"; this.expect(groupBegin); var str = ""; - var firstToken = this.nextToken; + var firstToken = this.fetch(); var nested = 0; // allow nested braces in raw string group var lastToken = firstToken; + var nextToken; - while (raw && nested > 0 || this.nextToken.text !== groupEnd) { - switch (this.nextToken.text) { + while ((nextToken = this.fetch()).text !== groupEnd || raw && nested > 0) { + switch (nextToken.text) { case "EOF": throw new src_ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str)); @@ -16112,15 +16603,13 @@ function () { break; } - lastToken = this.nextToken; + lastToken = nextToken; str += lastToken.text; this.consume(); } - this.mode = outerMode; - this.gullet.lexer.setCatcode("%", 14); // reset the catcode of % - this.expect(groupEnd); + this.mode = outerMode; return firstToken.range(lastToken, str); } /** @@ -16133,12 +16622,13 @@ function () { _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) { var outerMode = this.mode; this.mode = "text"; - var firstToken = this.nextToken; + var firstToken = this.fetch(); var lastToken = firstToken; var str = ""; + var nextToken; - while (this.nextToken.text !== "EOF" && regex.test(str + this.nextToken.text)) { - lastToken = this.nextToken; + while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { + lastToken = nextToken; str += lastToken.text; this.consume(); } @@ -16192,7 +16682,7 @@ function () { var res; var isBlank = false; - if (!optional && this.nextToken.text !== "{") { + if (!optional && this.fetch().text !== "{") { res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); } else { res = this.parseStringGroup("size", optional); @@ -16235,13 +16725,18 @@ function () { }; } /** - * Parses an URL, checking escaped letters and allowed protocols. + * Parses an URL, checking escaped letters and allowed protocols, + * and setting the catcode of % as an active character (as in \hyperref). */ ; - _proto.parseUrlGroup = function parseUrlGroup(optional) { + _proto.parseUrlGroup = function parseUrlGroup(optional, consumeSpaces) { + this.gullet.lexer.setCatcode("%", 13); // active character + var res = this.parseStringGroup("url", optional, true); // get raw string + this.gullet.lexer.setCatcode("%", 14); // comment character + if (!res) { return null; } // hyperref package allows backslashes alone in href, but doesn't @@ -16251,14 +16746,6 @@ function () { var url = res.text.replace(/\\([#$%&~_^{}])/g, '$1'); - var protocol = /^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(url); - protocol = protocol != null ? protocol[1] : "_relative"; - var allowed = this.settings.allowedProtocols; - - if (!utils.contains(allowed, "*") && !utils.contains(allowed, protocol)) { - throw new src_ParseError("Forbidden protocol '" + protocol + "'", res); - } - return { type: "url", mode: this.mode, @@ -16280,26 +16767,35 @@ function () { ; _proto.parseGroup = function parseGroup(name, // For error reporting. - optional, greediness, breakOnTokenText, mode) { + optional, greediness, breakOnTokenText, mode, consumeSpaces) { + // Switch to specified mode var outerMode = this.mode; - var firstToken = this.nextToken; - var text = firstToken.text; // Switch to specified mode if (mode) { this.switchMode(mode); - } + } // Consume spaces if requested, crucially *after* we switch modes, + // so that the next non-space token is parsed in the correct mode. - var groupEnd; + + if (consumeSpaces) { + this.consumeSpaces(); + } // Get first token + + + var firstToken = this.fetch(); + var text = firstToken.text; var result; // Try to parse an open brace or \begingroup if (optional ? text === "[" : text === "{" || text === "\\begingroup") { - groupEnd = Parser.endOfGroup[text]; // Start a new group namespace + this.consume(); + var groupEnd = Parser.endOfGroup[text]; // Start a new group namespace this.gullet.beginGroup(); // If we get a brace, parse an expression - this.consume(); var expression = this.parseExpression(false, groupEnd); - var lastToken = this.nextToken; // End group namespace before consuming symbol after close brace + var lastToken = this.fetch(); // Check that we got a matching closing brace + + this.expect(groupEnd); // End group namespace this.gullet.endGroup(); result = { @@ -16326,18 +16822,14 @@ function () { throw new src_ParseError("Undefined control sequence: " + text, firstToken); } - result = this.handleUnsupportedCmd(); + result = this.formatUnsupportedCmd(text); + this.consume(); } } // Switch mode back if (mode) { this.switchMode(outerMode); - } // Make sure we got a close brace - - - if (groupEnd) { - this.expect(groupEnd); } return result; @@ -16393,12 +16885,12 @@ function () { } /** * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like verbatim + * symbols and special functions like \verb. */ ; _proto.parseSymbol = function parseSymbol() { - var nucleus = this.nextToken; + var nucleus = this.fetch(); var text = nucleus.text; if (/^\\verb[^a-zA-Z]/.test(text)) { @@ -16491,11 +16983,18 @@ function () { } else if (this.mode === "math") { this.settings.reportNonstrict("unicodeTextInMathMode", "Unicode text character \"" + text[0] + "\" used in math mode", nucleus); } - } + } // All nonmathematical Unicode characters are rendered as if they + // are in text mode (wrapped in \text) because that's what it + // takes to render them in LaTeX. Setting `mode: this.mode` is + // another natural choice (the user requested math mode), but + // this makes it more difficult for getCharacterMetrics() to + // distinguish Unicode characters without metrics and those for + // which we want to simulate the letter M. + symbol = { type: "textord", - mode: this.mode, + mode: "text", loc: SourceLocation.range(nucleus), text: text }; @@ -16653,7 +17152,7 @@ var renderToString = function renderToString(expression, options) { var katex_generateParseTree = function generateParseTree(expression, options) { - var settings = new src_Settings(options); + var settings = new Settings_Settings(options); return src_parseTree(expression, settings); }; /** @@ -16680,7 +17179,7 @@ var katex_renderError = function renderError(error, expression, options) { var katex_renderToDomTree = function renderToDomTree(expression, options) { - var settings = new src_Settings(options); + var settings = new Settings_Settings(options); try { var tree = src_parseTree(expression, settings); @@ -16696,7 +17195,7 @@ var katex_renderToDomTree = function renderToDomTree(expression, options) { var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) { - var settings = new src_Settings(options); + var settings = new Settings_Settings(options); try { var tree = src_parseTree(expression, settings); @@ -16710,7 +17209,7 @@ var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) { /** * Current KaTeX version */ - version: "0.10.2", + version: "0.12.0", /** * Renders the given LaTeX into an HTML+MathML combination, and adds @@ -16806,4 +17305,4 @@ var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) { /***/ }) /******/ ])["default"]; -}); +}); \ No newline at end of file diff --git a/plugins/tiddlywiki/katex/files/katex.min.css b/plugins/tiddlywiki/katex/files/katex.min.css index c804fc128..98b7c7bde 100644 --- a/plugins/tiddlywiki/katex/files/katex.min.css +++ b/plugins/tiddlywiki/katex/files/katex.min.css @@ -1 +1 @@ -@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.10.2"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} +@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto;border-color:currentColor}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.12.0"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed;border-collapse:collapse}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .vbox{-ms-flex-direction:column;flex-direction:column;align-items:baseline}.katex .hbox,.katex .vbox{display:-ms-inline-flexbox;display:inline-flex}.katex .hbox{-ms-flex-direction:row;flex-direction:row;width:100%}.katex .thinbox{display:inline-flex;flex-direction:row;width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left;padding-left:2em} diff --git a/plugins/tiddlywiki/katex/files/katex.min.js b/plugins/tiddlywiki/katex/files/katex.min.js index 80045b56d..4df7e1722 100644 --- a/plugins/tiddlywiki/katex/files/katex.min.js +++ b/plugins/tiddlywiki/katex/files/katex.min.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.katex=e():t.katex=e()}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(a,n,function(e){return t[e]}.bind(null,n));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e,r){},function(t,e,r){"use strict";r.r(e);r(0);var a=function(){function t(t,e,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=t,this.start=e,this.end=r}return t.range=function(e,r){return r?e&&e.loc&&r.loc&&e.loc.lexer===r.loc.lexer?new t(e.loc.lexer,e.loc.start,r.loc.end):null:e&&e.loc},t}(),n=function(){function t(t,e){this.text=void 0,this.loc=void 0,this.text=t,this.loc=e}return t.prototype.range=function(e,r){return new t(r,a.range(this,e))},t}(),o=function t(e,r){this.position=void 0;var a,n="KaTeX parse error: "+e,o=r&&r.loc;if(o&&o.start<=o.end){var i=o.lexer.input;a=o.start;var s=o.end;a===i.length?n+=" at end of input: ":n+=" at position "+(a+1)+": ";var h=i.slice(a,s).replace(/[^]/g,"$&\u0332");n+=(a>15?"\u2026"+i.slice(a-15,a):i.slice(0,a))+h+(s+15<i.length?i.slice(s,s+15)+"\u2026":i.slice(s))}var l=new Error(n);return l.name="ParseError",l.__proto__=t.prototype,l.position=a,l};o.prototype.__proto__=Error.prototype;var i=o,s=/([A-Z])/g,h={"&":"&",">":">","<":"<",'"':""","'":"'"},l=/[&><"']/g;var m=function t(e){return"ordgroup"===e.type?1===e.body.length?t(e.body[0]):e:"color"===e.type?1===e.body.length?t(e.body[0]):e:"font"===e.type?t(e.body):e},c={contains:function(t,e){return-1!==t.indexOf(e)},deflt:function(t,e){return void 0===t?e:t},escape:function(t){return String(t).replace(l,function(t){return h[t]})},hyphenate:function(t){return t.replace(s,"-$1").toLowerCase()},getBaseElem:m,isCharacterBox:function(t){var e=m(t);return"mathord"===e.type||"textord"===e.type||"atom"===e.type}},u=function(){function t(t){this.displayMode=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.allowedProtocols=void 0,t=t||{},this.displayMode=c.deflt(t.displayMode,!1),this.leqno=c.deflt(t.leqno,!1),this.fleqn=c.deflt(t.fleqn,!1),this.throwOnError=c.deflt(t.throwOnError,!0),this.errorColor=c.deflt(t.errorColor,"#cc0000"),this.macros=t.macros||{},this.colorIsTextColor=c.deflt(t.colorIsTextColor,!1),this.strict=c.deflt(t.strict,"warn"),this.maxSize=Math.max(0,c.deflt(t.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(t.maxExpand,1e3)),this.allowedProtocols=c.deflt(t.allowedProtocols,["http","https","mailto","_relative"])}var e=t.prototype;return e.reportNonstrict=function(t,e,r){var a=this.strict;if("function"==typeof a&&(a=a(t,e,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new i("LaTeX-incompatible input and strict mode is set to 'error': "+e+" ["+t+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]")}},e.useStrictBehavior=function(t,e,r){var a=this.strict;if("function"==typeof a)try{a=a(t,e,r)}catch(t){a="error"}return!(!a||"ignore"===a)&&(!0===a||"error"===a||("warn"===a?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]"),!1)))},t}(),d=function(){function t(t,e,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=e,this.cramped=r}var e=t.prototype;return e.sup=function(){return p[f[this.id]]},e.sub=function(){return p[g[this.id]]},e.fracNum=function(){return p[x[this.id]]},e.fracDen=function(){return p[v[this.id]]},e.cramp=function(){return p[b[this.id]]},e.text=function(){return p[y[this.id]]},e.isTight=function(){return this.size>=2},t}(),p=[new d(0,0,!1),new d(1,0,!0),new d(2,1,!1),new d(3,1,!0),new d(4,2,!1),new d(5,2,!0),new d(6,3,!1),new d(7,3,!0)],f=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],x=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],w={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},k=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var S=[];function z(t){for(var e=0;e<S.length;e+=2)if(t>=S[e]&&t<=S[e+1])return!0;return!1}k.forEach(function(t){return t.blocks.forEach(function(t){return S.push.apply(S,t)})});var M={path:{sqrtMain:"M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\ns-65,47,-65,47z M834 80H400000v40H845z",sqrtSize1:"M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\ns76,-59,76,-59s76,-60,76,-60z M1001 80H40000v40H1012z",sqrtSize2:"M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\nM1001 80H400000v40H1013z",sqrtSize3:"M424,2478c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M1001 80H400000v40H1014z",sqrtSize4:"M473,2793c339.3,-1799.3,509.3,-2700,510,-2702\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\nM1001 80H400000v40H1017z",doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"}},T=function(){function t(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){for(var t=document.createDocumentFragment(),e=0;e<this.children.length;e++)t.appendChild(this.children[e].toNode());return t},e.toMarkup=function(){for(var t="",e=0;e<this.children.length;e++)t+=this.children[e].toMarkup();return t},e.toText=function(){var t=function(t){return t.toText()};return this.children.map(t).join("")},t}(),A=function(t){return t.filter(function(t){return t}).join(" ")},B=function(t,e,r){if(this.classes=t||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},e){e.style.isTight()&&this.classes.push("mtight");var a=e.getColor();a&&(this.style.color=a)}},q=function(t){var e=document.createElement(t);for(var r in e.className=A(this.classes),this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&e.setAttribute(a,this.attributes[a]);for(var n=0;n<this.children.length;n++)e.appendChild(this.children[n].toNode());return e},C=function(t){var e="<"+t;this.classes.length&&(e+=' class="'+c.escape(A(this.classes))+'"');var r="";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");for(var n in r&&(e+=' style="'+c.escape(r)+'"'),this.attributes)this.attributes.hasOwnProperty(n)&&(e+=" "+n+'="'+c.escape(this.attributes[n])+'"');e+=">";for(var o=0;o<this.children.length;o++)e+=this.children[o].toMarkup();return e+="</"+t+">"},N=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,t,r,a),this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,"span")},e.toMarkup=function(){return C.call(this,"span")},t}(),I=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,e,a),this.children=r||[],this.setAttribute("href",t)}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,"a")},e.toMarkup=function(){return C.call(this,"a")},t}(),O={"\xee":"\u0131\u0302","\xef":"\u0131\u0308","\xed":"\u0131\u0301","\xec":"\u0131\u0300"},E=function(){function t(t,e,r,a,n,o,i,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=t,this.height=e||0,this.depth=r||0,this.italic=a||0,this.skew=n||0,this.width=o||0,this.classes=i||[],this.style=s||{},this.maxFontSize=0;var h=function(t){for(var e=0;e<k.length;e++)for(var r=k[e],a=0;a<r.blocks.length;a++){var n=r.blocks[a];if(t>=n[0]&&t<=n[1])return r.name}return null}(this.text.charCodeAt(0));h&&this.classes.push(h+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=O[this.text])}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createTextNode(this.text),e=null;for(var r in this.italic>0&&((e=document.createElement("span")).style.marginRight=this.italic+"em"),this.classes.length>0&&((e=e||document.createElement("span")).className=A(this.classes)),this.style)this.style.hasOwnProperty(r)&&((e=e||document.createElement("span")).style[r]=this.style[r]);return e?(e.appendChild(t),e):t},e.toMarkup=function(){var t=!1,e="<span";this.classes.length&&(t=!0,e+=' class="',e+=c.escape(A(this.classes)),e+='"');var r="";for(var a in this.italic>0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");r&&(t=!0,e+=' style="'+c.escape(r)+'"');var n=c.escape(this.text);return t?(e+=">",e+=n,e+="</span>"):n},t}(),R=function(){function t(t,e){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=e||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<svg";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</svg>"},t}(),L=function(){function t(t,e){this.pathName=void 0,this.alternate=void 0,this.pathName=t,this.alternate=e}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?t.setAttribute("d",this.alternate):t.setAttribute("d",M.path[this.pathName]),t},e.toMarkup=function(){return this.alternate?"<path d='"+this.alternate+"'/>":"<path d='"+M.path[this.pathName]+"'/>"},t}(),H=function(){function t(t){this.attributes=void 0,this.attributes=t||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","line");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t},e.toMarkup=function(){var t="<line";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");return t+="/>"},t}();var P={"AMS-Regular":{65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473]},"Fraktur-Regular":{33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],163:[0,.69444,0,0,.86853],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],163:[0,.69444,0,0,.76909],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],305:[0,.43056,0,.02778,.32246],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],567:[.19444,.43056,0,.08334,.38403],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,1],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.67,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.744,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.744,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333]},"Math-Italic":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"Math-Regular":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"SansSerif-Bold":{33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212]},"Size1-Regular":{40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},D={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2]},F={"\xc5":"A","\xc7":"C","\xd0":"D","\xde":"o","\xe5":"a","\xe7":"c","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function V(t,e,r){if(!P[e])throw new Error("Font metrics not found for font: "+e+".");var a=t.charCodeAt(0),n=P[e][a];if(!n&&t[0]in F&&(a=F[t[0]].charCodeAt(0),n=P[e][a]),n||"text"!==r||z(a)&&(n=P[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var U={};var G={bin:1,close:1,inner:1,open:1,punct:1,rel:1},X={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},Y={math:{},text:{}},_=Y;function W(t,e,r,a,n,o){Y[t][n]={font:e,group:r,replace:a},o&&a&&(Y[t][a]=Y[t][n])}var j="main",$="ams",Z="bin",K="mathord",J="op-token",Q="rel";W("math",j,Q,"\u2261","\\equiv",!0),W("math",j,Q,"\u227a","\\prec",!0),W("math",j,Q,"\u227b","\\succ",!0),W("math",j,Q,"\u223c","\\sim",!0),W("math",j,Q,"\u22a5","\\perp"),W("math",j,Q,"\u2aaf","\\preceq",!0),W("math",j,Q,"\u2ab0","\\succeq",!0),W("math",j,Q,"\u2243","\\simeq",!0),W("math",j,Q,"\u2223","\\mid",!0),W("math",j,Q,"\u226a","\\ll",!0),W("math",j,Q,"\u226b","\\gg",!0),W("math",j,Q,"\u224d","\\asymp",!0),W("math",j,Q,"\u2225","\\parallel"),W("math",j,Q,"\u22c8","\\bowtie",!0),W("math",j,Q,"\u2323","\\smile",!0),W("math",j,Q,"\u2291","\\sqsubseteq",!0),W("math",j,Q,"\u2292","\\sqsupseteq",!0),W("math",j,Q,"\u2250","\\doteq",!0),W("math",j,Q,"\u2322","\\frown",!0),W("math",j,Q,"\u220b","\\ni",!0),W("math",j,Q,"\u221d","\\propto",!0),W("math",j,Q,"\u22a2","\\vdash",!0),W("math",j,Q,"\u22a3","\\dashv",!0),W("math",j,Q,"\u220b","\\owns"),W("math",j,"punct",".","\\ldotp"),W("math",j,"punct","\u22c5","\\cdotp"),W("math",j,"textord","#","\\#"),W("text",j,"textord","#","\\#"),W("math",j,"textord","&","\\&"),W("text",j,"textord","&","\\&"),W("math",j,"textord","\u2135","\\aleph",!0),W("math",j,"textord","\u2200","\\forall",!0),W("math",j,"textord","\u210f","\\hbar",!0),W("math",j,"textord","\u2203","\\exists",!0),W("math",j,"textord","\u2207","\\nabla",!0),W("math",j,"textord","\u266d","\\flat",!0),W("math",j,"textord","\u2113","\\ell",!0),W("math",j,"textord","\u266e","\\natural",!0),W("math",j,"textord","\u2663","\\clubsuit",!0),W("math",j,"textord","\u2118","\\wp",!0),W("math",j,"textord","\u266f","\\sharp",!0),W("math",j,"textord","\u2662","\\diamondsuit",!0),W("math",j,"textord","\u211c","\\Re",!0),W("math",j,"textord","\u2661","\\heartsuit",!0),W("math",j,"textord","\u2111","\\Im",!0),W("math",j,"textord","\u2660","\\spadesuit",!0),W("text",j,"textord","\xa7","\\S",!0),W("text",j,"textord","\xb6","\\P",!0),W("math",j,"textord","\u2020","\\dag"),W("text",j,"textord","\u2020","\\dag"),W("text",j,"textord","\u2020","\\textdagger"),W("math",j,"textord","\u2021","\\ddag"),W("text",j,"textord","\u2021","\\ddag"),W("text",j,"textord","\u2021","\\textdaggerdbl"),W("math",j,"close","\u23b1","\\rmoustache",!0),W("math",j,"open","\u23b0","\\lmoustache",!0),W("math",j,"close","\u27ef","\\rgroup",!0),W("math",j,"open","\u27ee","\\lgroup",!0),W("math",j,Z,"\u2213","\\mp",!0),W("math",j,Z,"\u2296","\\ominus",!0),W("math",j,Z,"\u228e","\\uplus",!0),W("math",j,Z,"\u2293","\\sqcap",!0),W("math",j,Z,"\u2217","\\ast"),W("math",j,Z,"\u2294","\\sqcup",!0),W("math",j,Z,"\u25ef","\\bigcirc"),W("math",j,Z,"\u2219","\\bullet"),W("math",j,Z,"\u2021","\\ddagger"),W("math",j,Z,"\u2240","\\wr",!0),W("math",j,Z,"\u2a3f","\\amalg"),W("math",j,Z,"&","\\And"),W("math",j,Q,"\u27f5","\\longleftarrow",!0),W("math",j,Q,"\u21d0","\\Leftarrow",!0),W("math",j,Q,"\u27f8","\\Longleftarrow",!0),W("math",j,Q,"\u27f6","\\longrightarrow",!0),W("math",j,Q,"\u21d2","\\Rightarrow",!0),W("math",j,Q,"\u27f9","\\Longrightarrow",!0),W("math",j,Q,"\u2194","\\leftrightarrow",!0),W("math",j,Q,"\u27f7","\\longleftrightarrow",!0),W("math",j,Q,"\u21d4","\\Leftrightarrow",!0),W("math",j,Q,"\u27fa","\\Longleftrightarrow",!0),W("math",j,Q,"\u21a6","\\mapsto",!0),W("math",j,Q,"\u27fc","\\longmapsto",!0),W("math",j,Q,"\u2197","\\nearrow",!0),W("math",j,Q,"\u21a9","\\hookleftarrow",!0),W("math",j,Q,"\u21aa","\\hookrightarrow",!0),W("math",j,Q,"\u2198","\\searrow",!0),W("math",j,Q,"\u21bc","\\leftharpoonup",!0),W("math",j,Q,"\u21c0","\\rightharpoonup",!0),W("math",j,Q,"\u2199","\\swarrow",!0),W("math",j,Q,"\u21bd","\\leftharpoondown",!0),W("math",j,Q,"\u21c1","\\rightharpoondown",!0),W("math",j,Q,"\u2196","\\nwarrow",!0),W("math",j,Q,"\u21cc","\\rightleftharpoons",!0),W("math",$,Q,"\u226e","\\nless",!0),W("math",$,Q,"\ue010","\\@nleqslant"),W("math",$,Q,"\ue011","\\@nleqq"),W("math",$,Q,"\u2a87","\\lneq",!0),W("math",$,Q,"\u2268","\\lneqq",!0),W("math",$,Q,"\ue00c","\\@lvertneqq"),W("math",$,Q,"\u22e6","\\lnsim",!0),W("math",$,Q,"\u2a89","\\lnapprox",!0),W("math",$,Q,"\u2280","\\nprec",!0),W("math",$,Q,"\u22e0","\\npreceq",!0),W("math",$,Q,"\u22e8","\\precnsim",!0),W("math",$,Q,"\u2ab9","\\precnapprox",!0),W("math",$,Q,"\u2241","\\nsim",!0),W("math",$,Q,"\ue006","\\@nshortmid"),W("math",$,Q,"\u2224","\\nmid",!0),W("math",$,Q,"\u22ac","\\nvdash",!0),W("math",$,Q,"\u22ad","\\nvDash",!0),W("math",$,Q,"\u22ea","\\ntriangleleft"),W("math",$,Q,"\u22ec","\\ntrianglelefteq",!0),W("math",$,Q,"\u228a","\\subsetneq",!0),W("math",$,Q,"\ue01a","\\@varsubsetneq"),W("math",$,Q,"\u2acb","\\subsetneqq",!0),W("math",$,Q,"\ue017","\\@varsubsetneqq"),W("math",$,Q,"\u226f","\\ngtr",!0),W("math",$,Q,"\ue00f","\\@ngeqslant"),W("math",$,Q,"\ue00e","\\@ngeqq"),W("math",$,Q,"\u2a88","\\gneq",!0),W("math",$,Q,"\u2269","\\gneqq",!0),W("math",$,Q,"\ue00d","\\@gvertneqq"),W("math",$,Q,"\u22e7","\\gnsim",!0),W("math",$,Q,"\u2a8a","\\gnapprox",!0),W("math",$,Q,"\u2281","\\nsucc",!0),W("math",$,Q,"\u22e1","\\nsucceq",!0),W("math",$,Q,"\u22e9","\\succnsim",!0),W("math",$,Q,"\u2aba","\\succnapprox",!0),W("math",$,Q,"\u2246","\\ncong",!0),W("math",$,Q,"\ue007","\\@nshortparallel"),W("math",$,Q,"\u2226","\\nparallel",!0),W("math",$,Q,"\u22af","\\nVDash",!0),W("math",$,Q,"\u22eb","\\ntriangleright"),W("math",$,Q,"\u22ed","\\ntrianglerighteq",!0),W("math",$,Q,"\ue018","\\@nsupseteqq"),W("math",$,Q,"\u228b","\\supsetneq",!0),W("math",$,Q,"\ue01b","\\@varsupsetneq"),W("math",$,Q,"\u2acc","\\supsetneqq",!0),W("math",$,Q,"\ue019","\\@varsupsetneqq"),W("math",$,Q,"\u22ae","\\nVdash",!0),W("math",$,Q,"\u2ab5","\\precneqq",!0),W("math",$,Q,"\u2ab6","\\succneqq",!0),W("math",$,Q,"\ue016","\\@nsubseteqq"),W("math",$,Z,"\u22b4","\\unlhd"),W("math",$,Z,"\u22b5","\\unrhd"),W("math",$,Q,"\u219a","\\nleftarrow",!0),W("math",$,Q,"\u219b","\\nrightarrow",!0),W("math",$,Q,"\u21cd","\\nLeftarrow",!0),W("math",$,Q,"\u21cf","\\nRightarrow",!0),W("math",$,Q,"\u21ae","\\nleftrightarrow",!0),W("math",$,Q,"\u21ce","\\nLeftrightarrow",!0),W("math",$,Q,"\u25b3","\\vartriangle"),W("math",$,"textord","\u210f","\\hslash"),W("math",$,"textord","\u25bd","\\triangledown"),W("math",$,"textord","\u25ca","\\lozenge"),W("math",$,"textord","\u24c8","\\circledS"),W("math",$,"textord","\xae","\\circledR"),W("text",$,"textord","\xae","\\circledR"),W("math",$,"textord","\u2221","\\measuredangle",!0),W("math",$,"textord","\u2204","\\nexists"),W("math",$,"textord","\u2127","\\mho"),W("math",$,"textord","\u2132","\\Finv",!0),W("math",$,"textord","\u2141","\\Game",!0),W("math",$,"textord","\u2035","\\backprime"),W("math",$,"textord","\u25b2","\\blacktriangle"),W("math",$,"textord","\u25bc","\\blacktriangledown"),W("math",$,"textord","\u25a0","\\blacksquare"),W("math",$,"textord","\u29eb","\\blacklozenge"),W("math",$,"textord","\u2605","\\bigstar"),W("math",$,"textord","\u2222","\\sphericalangle",!0),W("math",$,"textord","\u2201","\\complement",!0),W("math",$,"textord","\xf0","\\eth",!0),W("math",$,"textord","\u2571","\\diagup"),W("math",$,"textord","\u2572","\\diagdown"),W("math",$,"textord","\u25a1","\\square"),W("math",$,"textord","\u25a1","\\Box"),W("math",$,"textord","\u25ca","\\Diamond"),W("math",$,"textord","\xa5","\\yen",!0),W("text",$,"textord","\xa5","\\yen",!0),W("math",$,"textord","\u2713","\\checkmark",!0),W("text",$,"textord","\u2713","\\checkmark"),W("math",$,"textord","\u2136","\\beth",!0),W("math",$,"textord","\u2138","\\daleth",!0),W("math",$,"textord","\u2137","\\gimel",!0),W("math",$,"textord","\u03dd","\\digamma"),W("math",$,"textord","\u03f0","\\varkappa"),W("math",$,"open","\u250c","\\ulcorner",!0),W("math",$,"close","\u2510","\\urcorner",!0),W("math",$,"open","\u2514","\\llcorner",!0),W("math",$,"close","\u2518","\\lrcorner",!0),W("math",$,Q,"\u2266","\\leqq",!0),W("math",$,Q,"\u2a7d","\\leqslant",!0),W("math",$,Q,"\u2a95","\\eqslantless",!0),W("math",$,Q,"\u2272","\\lesssim",!0),W("math",$,Q,"\u2a85","\\lessapprox",!0),W("math",$,Q,"\u224a","\\approxeq",!0),W("math",$,Z,"\u22d6","\\lessdot"),W("math",$,Q,"\u22d8","\\lll",!0),W("math",$,Q,"\u2276","\\lessgtr",!0),W("math",$,Q,"\u22da","\\lesseqgtr",!0),W("math",$,Q,"\u2a8b","\\lesseqqgtr",!0),W("math",$,Q,"\u2251","\\doteqdot"),W("math",$,Q,"\u2253","\\risingdotseq",!0),W("math",$,Q,"\u2252","\\fallingdotseq",!0),W("math",$,Q,"\u223d","\\backsim",!0),W("math",$,Q,"\u22cd","\\backsimeq",!0),W("math",$,Q,"\u2ac5","\\subseteqq",!0),W("math",$,Q,"\u22d0","\\Subset",!0),W("math",$,Q,"\u228f","\\sqsubset",!0),W("math",$,Q,"\u227c","\\preccurlyeq",!0),W("math",$,Q,"\u22de","\\curlyeqprec",!0),W("math",$,Q,"\u227e","\\precsim",!0),W("math",$,Q,"\u2ab7","\\precapprox",!0),W("math",$,Q,"\u22b2","\\vartriangleleft"),W("math",$,Q,"\u22b4","\\trianglelefteq"),W("math",$,Q,"\u22a8","\\vDash",!0),W("math",$,Q,"\u22aa","\\Vvdash",!0),W("math",$,Q,"\u2323","\\smallsmile"),W("math",$,Q,"\u2322","\\smallfrown"),W("math",$,Q,"\u224f","\\bumpeq",!0),W("math",$,Q,"\u224e","\\Bumpeq",!0),W("math",$,Q,"\u2267","\\geqq",!0),W("math",$,Q,"\u2a7e","\\geqslant",!0),W("math",$,Q,"\u2a96","\\eqslantgtr",!0),W("math",$,Q,"\u2273","\\gtrsim",!0),W("math",$,Q,"\u2a86","\\gtrapprox",!0),W("math",$,Z,"\u22d7","\\gtrdot"),W("math",$,Q,"\u22d9","\\ggg",!0),W("math",$,Q,"\u2277","\\gtrless",!0),W("math",$,Q,"\u22db","\\gtreqless",!0),W("math",$,Q,"\u2a8c","\\gtreqqless",!0),W("math",$,Q,"\u2256","\\eqcirc",!0),W("math",$,Q,"\u2257","\\circeq",!0),W("math",$,Q,"\u225c","\\triangleq",!0),W("math",$,Q,"\u223c","\\thicksim"),W("math",$,Q,"\u2248","\\thickapprox"),W("math",$,Q,"\u2ac6","\\supseteqq",!0),W("math",$,Q,"\u22d1","\\Supset",!0),W("math",$,Q,"\u2290","\\sqsupset",!0),W("math",$,Q,"\u227d","\\succcurlyeq",!0),W("math",$,Q,"\u22df","\\curlyeqsucc",!0),W("math",$,Q,"\u227f","\\succsim",!0),W("math",$,Q,"\u2ab8","\\succapprox",!0),W("math",$,Q,"\u22b3","\\vartriangleright"),W("math",$,Q,"\u22b5","\\trianglerighteq"),W("math",$,Q,"\u22a9","\\Vdash",!0),W("math",$,Q,"\u2223","\\shortmid"),W("math",$,Q,"\u2225","\\shortparallel"),W("math",$,Q,"\u226c","\\between",!0),W("math",$,Q,"\u22d4","\\pitchfork",!0),W("math",$,Q,"\u221d","\\varpropto"),W("math",$,Q,"\u25c0","\\blacktriangleleft"),W("math",$,Q,"\u2234","\\therefore",!0),W("math",$,Q,"\u220d","\\backepsilon"),W("math",$,Q,"\u25b6","\\blacktriangleright"),W("math",$,Q,"\u2235","\\because",!0),W("math",$,Q,"\u22d8","\\llless"),W("math",$,Q,"\u22d9","\\gggtr"),W("math",$,Z,"\u22b2","\\lhd"),W("math",$,Z,"\u22b3","\\rhd"),W("math",$,Q,"\u2242","\\eqsim",!0),W("math",j,Q,"\u22c8","\\Join"),W("math",$,Q,"\u2251","\\Doteq",!0),W("math",$,Z,"\u2214","\\dotplus",!0),W("math",$,Z,"\u2216","\\smallsetminus"),W("math",$,Z,"\u22d2","\\Cap",!0),W("math",$,Z,"\u22d3","\\Cup",!0),W("math",$,Z,"\u2a5e","\\doublebarwedge",!0),W("math",$,Z,"\u229f","\\boxminus",!0),W("math",$,Z,"\u229e","\\boxplus",!0),W("math",$,Z,"\u22c7","\\divideontimes",!0),W("math",$,Z,"\u22c9","\\ltimes",!0),W("math",$,Z,"\u22ca","\\rtimes",!0),W("math",$,Z,"\u22cb","\\leftthreetimes",!0),W("math",$,Z,"\u22cc","\\rightthreetimes",!0),W("math",$,Z,"\u22cf","\\curlywedge",!0),W("math",$,Z,"\u22ce","\\curlyvee",!0),W("math",$,Z,"\u229d","\\circleddash",!0),W("math",$,Z,"\u229b","\\circledast",!0),W("math",$,Z,"\u22c5","\\centerdot"),W("math",$,Z,"\u22ba","\\intercal",!0),W("math",$,Z,"\u22d2","\\doublecap"),W("math",$,Z,"\u22d3","\\doublecup"),W("math",$,Z,"\u22a0","\\boxtimes",!0),W("math",$,Q,"\u21e2","\\dashrightarrow",!0),W("math",$,Q,"\u21e0","\\dashleftarrow",!0),W("math",$,Q,"\u21c7","\\leftleftarrows",!0),W("math",$,Q,"\u21c6","\\leftrightarrows",!0),W("math",$,Q,"\u21da","\\Lleftarrow",!0),W("math",$,Q,"\u219e","\\twoheadleftarrow",!0),W("math",$,Q,"\u21a2","\\leftarrowtail",!0),W("math",$,Q,"\u21ab","\\looparrowleft",!0),W("math",$,Q,"\u21cb","\\leftrightharpoons",!0),W("math",$,Q,"\u21b6","\\curvearrowleft",!0),W("math",$,Q,"\u21ba","\\circlearrowleft",!0),W("math",$,Q,"\u21b0","\\Lsh",!0),W("math",$,Q,"\u21c8","\\upuparrows",!0),W("math",$,Q,"\u21bf","\\upharpoonleft",!0),W("math",$,Q,"\u21c3","\\downharpoonleft",!0),W("math",$,Q,"\u22b8","\\multimap",!0),W("math",$,Q,"\u21ad","\\leftrightsquigarrow",!0),W("math",$,Q,"\u21c9","\\rightrightarrows",!0),W("math",$,Q,"\u21c4","\\rightleftarrows",!0),W("math",$,Q,"\u21a0","\\twoheadrightarrow",!0),W("math",$,Q,"\u21a3","\\rightarrowtail",!0),W("math",$,Q,"\u21ac","\\looparrowright",!0),W("math",$,Q,"\u21b7","\\curvearrowright",!0),W("math",$,Q,"\u21bb","\\circlearrowright",!0),W("math",$,Q,"\u21b1","\\Rsh",!0),W("math",$,Q,"\u21ca","\\downdownarrows",!0),W("math",$,Q,"\u21be","\\upharpoonright",!0),W("math",$,Q,"\u21c2","\\downharpoonright",!0),W("math",$,Q,"\u21dd","\\rightsquigarrow",!0),W("math",$,Q,"\u21dd","\\leadsto"),W("math",$,Q,"\u21db","\\Rrightarrow",!0),W("math",$,Q,"\u21be","\\restriction"),W("math",j,"textord","\u2018","`"),W("math",j,"textord","$","\\$"),W("text",j,"textord","$","\\$"),W("text",j,"textord","$","\\textdollar"),W("math",j,"textord","%","\\%"),W("text",j,"textord","%","\\%"),W("math",j,"textord","_","\\_"),W("text",j,"textord","_","\\_"),W("text",j,"textord","_","\\textunderscore"),W("math",j,"textord","\u2220","\\angle",!0),W("math",j,"textord","\u221e","\\infty",!0),W("math",j,"textord","\u2032","\\prime"),W("math",j,"textord","\u25b3","\\triangle"),W("math",j,"textord","\u0393","\\Gamma",!0),W("math",j,"textord","\u0394","\\Delta",!0),W("math",j,"textord","\u0398","\\Theta",!0),W("math",j,"textord","\u039b","\\Lambda",!0),W("math",j,"textord","\u039e","\\Xi",!0),W("math",j,"textord","\u03a0","\\Pi",!0),W("math",j,"textord","\u03a3","\\Sigma",!0),W("math",j,"textord","\u03a5","\\Upsilon",!0),W("math",j,"textord","\u03a6","\\Phi",!0),W("math",j,"textord","\u03a8","\\Psi",!0),W("math",j,"textord","\u03a9","\\Omega",!0),W("math",j,"textord","A","\u0391"),W("math",j,"textord","B","\u0392"),W("math",j,"textord","E","\u0395"),W("math",j,"textord","Z","\u0396"),W("math",j,"textord","H","\u0397"),W("math",j,"textord","I","\u0399"),W("math",j,"textord","K","\u039a"),W("math",j,"textord","M","\u039c"),W("math",j,"textord","N","\u039d"),W("math",j,"textord","O","\u039f"),W("math",j,"textord","P","\u03a1"),W("math",j,"textord","T","\u03a4"),W("math",j,"textord","X","\u03a7"),W("math",j,"textord","\xac","\\neg",!0),W("math",j,"textord","\xac","\\lnot"),W("math",j,"textord","\u22a4","\\top"),W("math",j,"textord","\u22a5","\\bot"),W("math",j,"textord","\u2205","\\emptyset"),W("math",$,"textord","\u2205","\\varnothing"),W("math",j,K,"\u03b1","\\alpha",!0),W("math",j,K,"\u03b2","\\beta",!0),W("math",j,K,"\u03b3","\\gamma",!0),W("math",j,K,"\u03b4","\\delta",!0),W("math",j,K,"\u03f5","\\epsilon",!0),W("math",j,K,"\u03b6","\\zeta",!0),W("math",j,K,"\u03b7","\\eta",!0),W("math",j,K,"\u03b8","\\theta",!0),W("math",j,K,"\u03b9","\\iota",!0),W("math",j,K,"\u03ba","\\kappa",!0),W("math",j,K,"\u03bb","\\lambda",!0),W("math",j,K,"\u03bc","\\mu",!0),W("math",j,K,"\u03bd","\\nu",!0),W("math",j,K,"\u03be","\\xi",!0),W("math",j,K,"\u03bf","\\omicron",!0),W("math",j,K,"\u03c0","\\pi",!0),W("math",j,K,"\u03c1","\\rho",!0),W("math",j,K,"\u03c3","\\sigma",!0),W("math",j,K,"\u03c4","\\tau",!0),W("math",j,K,"\u03c5","\\upsilon",!0),W("math",j,K,"\u03d5","\\phi",!0),W("math",j,K,"\u03c7","\\chi",!0),W("math",j,K,"\u03c8","\\psi",!0),W("math",j,K,"\u03c9","\\omega",!0),W("math",j,K,"\u03b5","\\varepsilon",!0),W("math",j,K,"\u03d1","\\vartheta",!0),W("math",j,K,"\u03d6","\\varpi",!0),W("math",j,K,"\u03f1","\\varrho",!0),W("math",j,K,"\u03c2","\\varsigma",!0),W("math",j,K,"\u03c6","\\varphi",!0),W("math",j,Z,"\u2217","*"),W("math",j,Z,"+","+"),W("math",j,Z,"\u2212","-"),W("math",j,Z,"\u22c5","\\cdot",!0),W("math",j,Z,"\u2218","\\circ"),W("math",j,Z,"\xf7","\\div",!0),W("math",j,Z,"\xb1","\\pm",!0),W("math",j,Z,"\xd7","\\times",!0),W("math",j,Z,"\u2229","\\cap",!0),W("math",j,Z,"\u222a","\\cup",!0),W("math",j,Z,"\u2216","\\setminus"),W("math",j,Z,"\u2227","\\land"),W("math",j,Z,"\u2228","\\lor"),W("math",j,Z,"\u2227","\\wedge",!0),W("math",j,Z,"\u2228","\\vee",!0),W("math",j,"textord","\u221a","\\surd"),W("math",j,"open","(","("),W("math",j,"open","[","["),W("math",j,"open","\u27e8","\\langle",!0),W("math",j,"open","\u2223","\\lvert"),W("math",j,"open","\u2225","\\lVert"),W("math",j,"close",")",")"),W("math",j,"close","]","]"),W("math",j,"close","?","?"),W("math",j,"close","!","!"),W("math",j,"close","\u27e9","\\rangle",!0),W("math",j,"close","\u2223","\\rvert"),W("math",j,"close","\u2225","\\rVert"),W("math",j,Q,"=","="),W("math",j,Q,"<","<"),W("math",j,Q,">",">"),W("math",j,Q,":",":"),W("math",j,Q,"\u2248","\\approx",!0),W("math",j,Q,"\u2245","\\cong",!0),W("math",j,Q,"\u2265","\\ge"),W("math",j,Q,"\u2265","\\geq",!0),W("math",j,Q,"\u2190","\\gets"),W("math",j,Q,">","\\gt"),W("math",j,Q,"\u2208","\\in",!0),W("math",j,Q,"\ue020","\\@not"),W("math",j,Q,"\u2282","\\subset",!0),W("math",j,Q,"\u2283","\\supset",!0),W("math",j,Q,"\u2286","\\subseteq",!0),W("math",j,Q,"\u2287","\\supseteq",!0),W("math",$,Q,"\u2288","\\nsubseteq",!0),W("math",$,Q,"\u2289","\\nsupseteq",!0),W("math",j,Q,"\u22a8","\\models"),W("math",j,Q,"\u2190","\\leftarrow",!0),W("math",j,Q,"\u2264","\\le"),W("math",j,Q,"\u2264","\\leq",!0),W("math",j,Q,"<","\\lt"),W("math",j,Q,"\u2192","\\rightarrow",!0),W("math",j,Q,"\u2192","\\to"),W("math",$,Q,"\u2271","\\ngeq",!0),W("math",$,Q,"\u2270","\\nleq",!0),W("math",j,"spacing","\xa0","\\ "),W("math",j,"spacing","\xa0","~"),W("math",j,"spacing","\xa0","\\space"),W("math",j,"spacing","\xa0","\\nobreakspace"),W("text",j,"spacing","\xa0","\\ "),W("text",j,"spacing","\xa0","~"),W("text",j,"spacing","\xa0","\\space"),W("text",j,"spacing","\xa0","\\nobreakspace"),W("math",j,"spacing",null,"\\nobreak"),W("math",j,"spacing",null,"\\allowbreak"),W("math",j,"punct",",",","),W("math",j,"punct",";",";"),W("math",$,Z,"\u22bc","\\barwedge",!0),W("math",$,Z,"\u22bb","\\veebar",!0),W("math",j,Z,"\u2299","\\odot",!0),W("math",j,Z,"\u2295","\\oplus",!0),W("math",j,Z,"\u2297","\\otimes",!0),W("math",j,"textord","\u2202","\\partial",!0),W("math",j,Z,"\u2298","\\oslash",!0),W("math",$,Z,"\u229a","\\circledcirc",!0),W("math",$,Z,"\u22a1","\\boxdot",!0),W("math",j,Z,"\u25b3","\\bigtriangleup"),W("math",j,Z,"\u25bd","\\bigtriangledown"),W("math",j,Z,"\u2020","\\dagger"),W("math",j,Z,"\u22c4","\\diamond"),W("math",j,Z,"\u22c6","\\star"),W("math",j,Z,"\u25c3","\\triangleleft"),W("math",j,Z,"\u25b9","\\triangleright"),W("math",j,"open","{","\\{"),W("text",j,"textord","{","\\{"),W("text",j,"textord","{","\\textbraceleft"),W("math",j,"close","}","\\}"),W("text",j,"textord","}","\\}"),W("text",j,"textord","}","\\textbraceright"),W("math",j,"open","{","\\lbrace"),W("math",j,"close","}","\\rbrace"),W("math",j,"open","[","\\lbrack"),W("text",j,"textord","[","\\lbrack"),W("math",j,"close","]","\\rbrack"),W("text",j,"textord","]","\\rbrack"),W("math",j,"open","(","\\lparen"),W("math",j,"close",")","\\rparen"),W("text",j,"textord","<","\\textless"),W("text",j,"textord",">","\\textgreater"),W("math",j,"open","\u230a","\\lfloor",!0),W("math",j,"close","\u230b","\\rfloor",!0),W("math",j,"open","\u2308","\\lceil",!0),W("math",j,"close","\u2309","\\rceil",!0),W("math",j,"textord","\\","\\backslash"),W("math",j,"textord","\u2223","|"),W("math",j,"textord","\u2223","\\vert"),W("text",j,"textord","|","\\textbar"),W("math",j,"textord","\u2225","\\|"),W("math",j,"textord","\u2225","\\Vert"),W("text",j,"textord","\u2225","\\textbardbl"),W("text",j,"textord","~","\\textasciitilde"),W("text",j,"textord","\\","\\textbackslash"),W("text",j,"textord","^","\\textasciicircum"),W("math",j,Q,"\u2191","\\uparrow",!0),W("math",j,Q,"\u21d1","\\Uparrow",!0),W("math",j,Q,"\u2193","\\downarrow",!0),W("math",j,Q,"\u21d3","\\Downarrow",!0),W("math",j,Q,"\u2195","\\updownarrow",!0),W("math",j,Q,"\u21d5","\\Updownarrow",!0),W("math",j,J,"\u2210","\\coprod"),W("math",j,J,"\u22c1","\\bigvee"),W("math",j,J,"\u22c0","\\bigwedge"),W("math",j,J,"\u2a04","\\biguplus"),W("math",j,J,"\u22c2","\\bigcap"),W("math",j,J,"\u22c3","\\bigcup"),W("math",j,J,"\u222b","\\int"),W("math",j,J,"\u222b","\\intop"),W("math",j,J,"\u222c","\\iint"),W("math",j,J,"\u222d","\\iiint"),W("math",j,J,"\u220f","\\prod"),W("math",j,J,"\u2211","\\sum"),W("math",j,J,"\u2a02","\\bigotimes"),W("math",j,J,"\u2a01","\\bigoplus"),W("math",j,J,"\u2a00","\\bigodot"),W("math",j,J,"\u222e","\\oint"),W("math",j,J,"\u222f","\\oiint"),W("math",j,J,"\u2230","\\oiiint"),W("math",j,J,"\u2a06","\\bigsqcup"),W("math",j,J,"\u222b","\\smallint"),W("text",j,"inner","\u2026","\\textellipsis"),W("math",j,"inner","\u2026","\\mathellipsis"),W("text",j,"inner","\u2026","\\ldots",!0),W("math",j,"inner","\u2026","\\ldots",!0),W("math",j,"inner","\u22ef","\\@cdots",!0),W("math",j,"inner","\u22f1","\\ddots",!0),W("math",j,"textord","\u22ee","\\varvdots"),W("math",j,"accent-token","\u02ca","\\acute"),W("math",j,"accent-token","\u02cb","\\grave"),W("math",j,"accent-token","\xa8","\\ddot"),W("math",j,"accent-token","~","\\tilde"),W("math",j,"accent-token","\u02c9","\\bar"),W("math",j,"accent-token","\u02d8","\\breve"),W("math",j,"accent-token","\u02c7","\\check"),W("math",j,"accent-token","^","\\hat"),W("math",j,"accent-token","\u20d7","\\vec"),W("math",j,"accent-token","\u02d9","\\dot"),W("math",j,"accent-token","\u02da","\\mathring"),W("math",j,K,"\u0131","\\imath",!0),W("math",j,K,"\u0237","\\jmath",!0),W("text",j,"textord","\u0131","\\i",!0),W("text",j,"textord","\u0237","\\j",!0),W("text",j,"textord","\xdf","\\ss",!0),W("text",j,"textord","\xe6","\\ae",!0),W("text",j,"textord","\xe6","\\ae",!0),W("text",j,"textord","\u0153","\\oe",!0),W("text",j,"textord","\xf8","\\o",!0),W("text",j,"textord","\xc6","\\AE",!0),W("text",j,"textord","\u0152","\\OE",!0),W("text",j,"textord","\xd8","\\O",!0),W("text",j,"accent-token","\u02ca","\\'"),W("text",j,"accent-token","\u02cb","\\`"),W("text",j,"accent-token","\u02c6","\\^"),W("text",j,"accent-token","\u02dc","\\~"),W("text",j,"accent-token","\u02c9","\\="),W("text",j,"accent-token","\u02d8","\\u"),W("text",j,"accent-token","\u02d9","\\."),W("text",j,"accent-token","\u02da","\\r"),W("text",j,"accent-token","\u02c7","\\v"),W("text",j,"accent-token","\xa8",'\\"'),W("text",j,"accent-token","\u02dd","\\H"),W("text",j,"accent-token","\u25ef","\\textcircled");var tt={"--":!0,"---":!0,"``":!0,"''":!0};W("text",j,"textord","\u2013","--"),W("text",j,"textord","\u2013","\\textendash"),W("text",j,"textord","\u2014","---"),W("text",j,"textord","\u2014","\\textemdash"),W("text",j,"textord","\u2018","`"),W("text",j,"textord","\u2018","\\textquoteleft"),W("text",j,"textord","\u2019","'"),W("text",j,"textord","\u2019","\\textquoteright"),W("text",j,"textord","\u201c","``"),W("text",j,"textord","\u201c","\\textquotedblleft"),W("text",j,"textord","\u201d","''"),W("text",j,"textord","\u201d","\\textquotedblright"),W("math",j,"textord","\xb0","\\degree",!0),W("text",j,"textord","\xb0","\\degree"),W("text",j,"textord","\xb0","\\textdegree",!0),W("math",j,K,"\xa3","\\pounds"),W("math",j,K,"\xa3","\\mathsterling",!0),W("text",j,K,"\xa3","\\pounds"),W("text",j,K,"\xa3","\\textsterling",!0),W("math",$,"textord","\u2720","\\maltese"),W("text",$,"textord","\u2720","\\maltese"),W("text",j,"spacing","\xa0","\\ "),W("text",j,"spacing","\xa0"," "),W("text",j,"spacing","\xa0","~");for(var et=0;et<'0123456789/@."'.length;et++){var rt='0123456789/@."'.charAt(et);W("math",j,"textord",rt,rt)}for(var at=0;at<'0123456789!@*()-=+[]<>|";:?/.,'.length;at++){var nt='0123456789!@*()-=+[]<>|";:?/.,'.charAt(at);W("text",j,"textord",nt,nt)}for(var ot="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",it=0;it<ot.length;it++){var st=ot.charAt(it);W("math",j,K,st,st),W("text",j,"textord",st,st)}W("math",$,"textord","C","\u2102"),W("text",$,"textord","C","\u2102"),W("math",$,"textord","H","\u210d"),W("text",$,"textord","H","\u210d"),W("math",$,"textord","N","\u2115"),W("text",$,"textord","N","\u2115"),W("math",$,"textord","P","\u2119"),W("text",$,"textord","P","\u2119"),W("math",$,"textord","Q","\u211a"),W("text",$,"textord","Q","\u211a"),W("math",$,"textord","R","\u211d"),W("text",$,"textord","R","\u211d"),W("math",$,"textord","Z","\u2124"),W("text",$,"textord","Z","\u2124"),W("math",j,K,"h","\u210e"),W("text",j,K,"h","\u210e");for(var ht="",lt=0;lt<ot.length;lt++){var mt=ot.charAt(lt);W("math",j,K,mt,ht=String.fromCharCode(55349,56320+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56372+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56424+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56580+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56736+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56788+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56840+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56944+lt)),W("text",j,"textord",mt,ht),lt<26&&(W("math",j,K,mt,ht=String.fromCharCode(55349,56632+lt)),W("text",j,"textord",mt,ht),W("math",j,K,mt,ht=String.fromCharCode(55349,56476+lt)),W("text",j,"textord",mt,ht))}W("math",j,K,"k",ht=String.fromCharCode(55349,56668)),W("text",j,"textord","k",ht);for(var ct=0;ct<10;ct++){var ut=ct.toString();W("math",j,K,ut,ht=String.fromCharCode(55349,57294+ct)),W("text",j,"textord",ut,ht),W("math",j,K,ut,ht=String.fromCharCode(55349,57314+ct)),W("text",j,"textord",ut,ht),W("math",j,K,ut,ht=String.fromCharCode(55349,57324+ct)),W("text",j,"textord",ut,ht),W("math",j,K,ut,ht=String.fromCharCode(55349,57334+ct)),W("text",j,"textord",ut,ht)}for(var dt=0;dt<"\xc7\xd0\xde\xe7\xfe".length;dt++){var pt="\xc7\xd0\xde\xe7\xfe".charAt(dt);W("math",j,K,pt,pt),W("text",j,"textord",pt,pt)}W("text",j,"textord","\xf0","\xf0"),W("text",j,"textord","\u2013","\u2013"),W("text",j,"textord","\u2014","\u2014"),W("text",j,"textord","\u2018","\u2018"),W("text",j,"textord","\u2019","\u2019"),W("text",j,"textord","\u201c","\u201c"),W("text",j,"textord","\u201d","\u201d");var ft=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathdefault","textit","Math-Italic"],["mathdefault","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["","",""],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],gt=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],xt=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],vt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],bt=function(t,e){return e.size<2?t:xt[t-1][e.size-1]},yt=function(){function t(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=vt[this.size-1],this.maxSize=e.maxSize,this._fontMetrics=void 0}var e=t.prototype;return e.extend=function(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize};for(var a in e)e.hasOwnProperty(a)&&(r[a]=e[a]);return new t(r)},e.havingStyle=function(t){return this.style===t?this:this.extend({style:t,size:bt(this.textSize,t)})},e.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},e.havingSize=function(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:vt[t-1]})},e.havingBaseStyle=function(e){e=e||this.style.text();var r=bt(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})},e.havingBaseSizing=function(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})},e.withColor=function(t){return this.extend({color:t})},e.withPhantom=function(){return this.extend({phantom:!0})},e.withFont=function(t){return this.extend({font:t})},e.withTextFontFamily=function(t){return this.extend({fontFamily:t,font:""})},e.withTextFontWeight=function(t){return this.extend({fontWeight:t,font:""})},e.withTextFontShape=function(t){return this.extend({fontShape:t,font:""})},e.sizingClasses=function(t){return t.size!==this.size?["sizing","reset-size"+t.size,"size"+this.size]:[]},e.baseSizingClasses=function(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]},e.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=function(t){var e;if(!U[e=t>=5?0:t>=3?1:2]){var r=U[e]={cssEmPerMu:D.quad[e]/18};for(var a in D)D.hasOwnProperty(a)&&(r[a]=D[a][e])}return U[e]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?"transparent":this.color},t}();yt.BASESIZE=6;var wt=yt,kt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},St={ex:!0,em:!0,mu:!0},zt=function(t,e){var r;if(t.unit in kt)r=kt[t.unit]/e.fontMetrics().ptPerEm/e.sizeMultiplier;else if("mu"===t.unit)r=e.fontMetrics().cssEmPerMu;else{var a;if(a=e.style.isTight()?e.havingStyle(e.style.text()):e,"ex"===t.unit)r=a.fontMetrics().xHeight;else{if("em"!==t.unit)throw new i("Invalid unit: '"+t.unit+"'");r=a.fontMetrics().quad}a!==e&&(r*=a.sizeMultiplier/e.sizeMultiplier)}return Math.min(t.number*r,e.maxSize)},Mt=["\\imath","\u0131","\\jmath","\u0237","\\pounds","\\mathsterling","\\textsterling","\xa3"],Tt=function(t,e,r){return _[r][t]&&_[r][t].replace&&(t=_[r][t].replace),{value:t,metrics:V(t,e,r)}},At=function(t,e,r,a,n){var o,i=Tt(t,e,r),s=i.metrics;if(t=i.value,s){var h=s.italic;("text"===r||a&&"mathit"===a.font)&&(h=0),o=new E(t,s.height,s.depth,h,s.skew,s.width,n)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+t+"' in style '"+e+"'"),o=new E(t,0,0,0,0,0,n);if(a){o.maxFontSize=a.sizeMultiplier,a.style.isTight()&&o.classes.push("mtight");var l=a.getColor();l&&(o.style.color=l)}return o},Bt=function(t,e){if(A(t.classes)!==A(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;for(var r in t.style)if(t.style.hasOwnProperty(r)&&t.style[r]!==e.style[r])return!1;for(var a in e.style)if(e.style.hasOwnProperty(a)&&t.style[a]!==e.style[a])return!1;return!0},qt=function(t){for(var e=0,r=0,a=0,n=0;n<t.children.length;n++){var o=t.children[n];o.height>e&&(e=o.height),o.depth>r&&(r=o.depth),o.maxFontSize>a&&(a=o.maxFontSize)}t.height=e,t.depth=r,t.maxFontSize=a},Ct=function(t,e,r,a){var n=new N(t,e,r,a);return qt(n),n},Nt=function(t,e,r,a){return new N(t,e,r,a)},It=function(t){var e=new T(t);return qt(e),e},Ot=function(t,e,r){var a="";switch(t){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=t}return a+"-"+("textbf"===e&&"textit"===r?"BoldItalic":"textbf"===e?"Bold":"textit"===e?"Italic":"Regular")},Et={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Rt={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Lt={fontMap:Et,makeSymbol:At,mathsym:function(t,e,r,a){return void 0===a&&(a=[]),r&&r.font&&"boldsymbol"===r.font&&Tt(t,"Main-Bold",e).metrics?At(t,"Main-Bold",e,r,a.concat(["mathbf"])):"\\"===t||"main"===_[e][t].font?At(t,"Main-Regular",e,r,a):At(t,"AMS-Regular",e,r,a.concat(["amsrm"]))},makeSpan:Ct,makeSvgSpan:Nt,makeLineSpan:function(t,e,r){var a=Ct([t],[],e);return a.height=r||e.fontMetrics().defaultRuleThickness,a.style.borderBottomWidth=a.height+"em",a.maxFontSize=1,a},makeAnchor:function(t,e,r,a){var n=new I(t,e,r,a);return qt(n),n},makeFragment:It,wrapFragment:function(t,e){return t instanceof T?Ct([],[t],e):t},makeVList:function(t,e){for(var r=function(t){if("individualShift"===t.positionType){for(var e=t.children,r=[e[0]],a=-e[0].shift-e[0].elem.depth,n=a,o=1;o<e.length;o++){var i=-e[o].shift-n-e[o].elem.depth,s=i-(e[o-1].elem.height+e[o-1].elem.depth);n+=i,r.push({type:"kern",size:s}),r.push(e[o])}return{children:r,depth:a}}var h;if("top"===t.positionType){for(var l=t.positionData,m=0;m<t.children.length;m++){var c=t.children[m];l-="kern"===c.type?c.size:c.elem.height+c.elem.depth}h=l}else if("bottom"===t.positionType)h=-t.positionData;else{var u=t.children[0];if("elem"!==u.type)throw new Error('First child must have type "elem".');if("shift"===t.positionType)h=-u.elem.depth-t.positionData;else{if("firstBaseline"!==t.positionType)throw new Error("Invalid positionType "+t.positionType+".");h=-u.elem.depth}}return{children:t.children,depth:h}}(t),a=r.children,n=r.depth,o=0,i=0;i<a.length;i++){var s=a[i];if("elem"===s.type){var h=s.elem;o=Math.max(o,h.maxFontSize,h.height)}}o+=2;var l=Ct(["pstrut"],[]);l.style.height=o+"em";for(var m=[],c=n,u=n,d=n,p=0;p<a.length;p++){var f=a[p];if("kern"===f.type)d+=f.size;else{var g=f.elem,x=f.wrapperClasses||[],v=f.wrapperStyle||{},b=Ct(x,[l,g],void 0,v);b.style.top=-o-d-g.depth+"em",f.marginLeft&&(b.style.marginLeft=f.marginLeft),f.marginRight&&(b.style.marginRight=f.marginRight),m.push(b),d+=g.height+g.depth}c=Math.min(c,d),u=Math.max(u,d)}var y,w=Ct(["vlist"],m);if(w.style.height=u+"em",c<0){var k=Ct([],[]),S=Ct(["vlist"],[k]);S.style.height=-c+"em";var z=Ct(["vlist-s"],[new E("\u200b")]);y=[Ct(["vlist-r"],[w,z]),Ct(["vlist-r"],[S])]}else y=[Ct(["vlist-r"],[w])];var M=Ct(["vlist-t"],y);return 2===y.length&&M.classes.push("vlist-t2"),M.height=u,M.depth=-c,M},makeOrd:function(t,e,r){var a,n=t.mode,o=t.text,s=["mord"],h="math"===n||"text"===n&&e.font,l=h?e.font:e.fontFamily;if(55349===o.charCodeAt(0)){var m=function(t,e){var r=1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536,a="math"===e?0:1;if(119808<=r&&r<120484){var n=Math.floor((r-119808)/26);return[ft[n][2],ft[n][a]]}if(120782<=r&&r<=120831){var o=Math.floor((r-120782)/10);return[gt[o][2],gt[o][a]]}if(120485===r||120486===r)return[ft[0][2],ft[0][a]];if(120486<r&&r<120782)return["",""];throw new i("Unsupported character: "+t)}(o,n),u=m[0],d=m[1];return At(o,u,n,e,s.concat(d))}if(l){var p,f;if("boldsymbol"===l||"mathnormal"===l){var g="boldsymbol"===l?function(t,e,r,a){return Tt(t,"Math-BoldItalic",e).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(o,n):(a=o,c.contains(Mt,a)?{fontName:"Main-Italic",fontClass:"mathit"}:/[0-9]/.test(a.charAt(0))?{fontName:"Caligraphic-Regular",fontClass:"mathcal"}:{fontName:"Math-Italic",fontClass:"mathdefault"});p=g.fontName,f=[g.fontClass]}else c.contains(Mt,o)?(p="Main-Italic",f=["mathit"]):h?(p=Et[l].fontName,f=[l]):(p=Ot(l,e.fontWeight,e.fontShape),f=[l,e.fontWeight,e.fontShape]);if(Tt(o,p,n).metrics)return At(o,p,n,e,s.concat(f));if(tt.hasOwnProperty(o)&&"Typewriter"===p.substr(0,10)){for(var x=[],v=0;v<o.length;v++)x.push(At(o[v],p,n,e,s.concat(f)));return It(x)}}if("mathord"===r){var b=function(t,e,r,a){return/[0-9]/.test(t.charAt(0))||c.contains(Mt,t)?{fontName:"Main-Italic",fontClass:"mathit"}:{fontName:"Math-Italic",fontClass:"mathdefault"}}(o);return At(o,b.fontName,n,e,s.concat([b.fontClass]))}if("textord"===r){var y=_[n][o]&&_[n][o].font;if("ams"===y){var w=Ot("amsrm",e.fontWeight,e.fontShape);return At(o,w,n,e,s.concat("amsrm",e.fontWeight,e.fontShape))}if("main"!==y&&y){var k=Ot(y,e.fontWeight,e.fontShape);return At(o,k,n,e,s.concat(k,e.fontWeight,e.fontShape))}var S=Ot("textrm",e.fontWeight,e.fontShape);return At(o,S,n,e,s.concat(e.fontWeight,e.fontShape))}throw new Error("unexpected type: "+r+" in makeOrd")},makeGlue:function(t,e){var r=Ct(["mspace"],[],e),a=zt(t,e);return r.style.marginRight=a+"em",r},staticSvg:function(t,e){var r=Rt[t],a=r[0],n=r[1],o=r[2],i=new L(a),s=new R([i],{width:n+"em",height:o+"em",style:"width:"+n+"em",viewBox:"0 0 "+1e3*n+" "+1e3*o,preserveAspectRatio:"xMinYMin"}),h=Nt(["overlay"],[s],e);return h.height=o,h.style.height=o+"em",h.style.width=n+"em",h},svgData:Rt,tryCombineChars:function(t){for(var e=0;e<t.length-1;e++){var r=t[e],a=t[e+1];r instanceof E&&a instanceof E&&Bt(r,a)&&(r.text+=a.text,r.height=Math.max(r.height,a.height),r.depth=Math.max(r.depth,a.depth),r.italic=a.italic,t.splice(e+1,1),e--)}return t}};function Ht(t,e){var r=Pt(t,e);if(!r)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return r}function Pt(t,e){return t&&t.type===e?t:null}function Dt(t,e){var r=function(t,e){return t&&"atom"===t.type&&t.family===e?t:null}(t,e);if(!r)throw new Error('Expected node of type "atom" and family "'+e+'", but got '+(t?"atom"===t.type?"atom of family "+t.family:"node of type "+t.type:String(t)));return r}function Ft(t){return t&&("atom"===t.type||X.hasOwnProperty(t.type))?t:null}var Vt={number:3,unit:"mu"},Ut={number:4,unit:"mu"},Gt={number:5,unit:"mu"},Xt={mord:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mop:{mord:Vt,mop:Vt,mrel:Gt,minner:Vt},mbin:{mord:Ut,mop:Ut,mopen:Ut,minner:Ut},mrel:{mord:Gt,mop:Gt,mopen:Gt,minner:Gt},mopen:{},mclose:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mpunct:{mord:Vt,mop:Vt,mrel:Gt,mopen:Vt,mclose:Vt,mpunct:Vt,minner:Vt},minner:{mord:Vt,mop:Vt,mbin:Ut,mrel:Gt,mopen:Vt,mpunct:Vt,minner:Vt}},Yt={mord:{mop:Vt},mop:{mord:Vt,mop:Vt},mbin:{},mrel:{},mopen:{},mclose:{mop:Vt},mpunct:{},minner:{mop:Vt}},_t={},Wt={},jt={};function $t(t){for(var e=t.type,r=(t.nodeType,t.names),a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs,argTypes:a.argTypes,greediness:void 0===a.greediness?1:a.greediness,allowedInText:!!a.allowedInText,allowedInMath:void 0===a.allowedInMath||a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,consumeMode:a.consumeMode,handler:n},h=0;h<r.length;++h)_t[r[h]]=s;e&&(o&&(Wt[e]=o),i&&(jt[e]=i))}function Zt(t){$t({type:t.type,names:[],props:{numArgs:0},handler:function(){throw new Error("Should never be called.")},htmlBuilder:t.htmlBuilder,mathmlBuilder:t.mathmlBuilder})}var Kt=function(t){var e=Pt(t,"ordgroup");return e?e.body:[t]},Jt=Lt.makeSpan,Qt=["leftmost","mbin","mopen","mrel","mop","mpunct"],te=["rightmost","mrel","mclose","mpunct"],ee={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT},re={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},ae=function(t,e,r,a){void 0===a&&(a=[null,null]);for(var n=[],o=0;o<t.length;o++){var i=he(t[o],e);if(i instanceof T){var s=i.children;n.push.apply(n,s)}else n.push(i)}if(!r)return n;var h=e;if(1===t.length){var l=Pt(t[0],"sizing")||Pt(t[0],"styling");l&&("sizing"===l.type?h=e.havingSize(l.size):"styling"===l.type&&(h=e.havingStyle(ee[l.style])))}var m=Jt([a[0]||"leftmost"],[],e),u=Jt([a[1]||"rightmost"],[],e);return ne(n,function(t,e){var r=e.classes[0],a=t.classes[0];"mbin"===r&&c.contains(te,a)?e.classes[0]="mord":"mbin"===a&&c.contains(Qt,r)&&(t.classes[0]="mord")},{node:m},u),ne(n,function(t,e){var r=ie(e),a=ie(t),n=r&&a?t.hasClass("mtight")?Yt[r][a]:Xt[r][a]:null;if(n)return Lt.makeGlue(n,h)},{node:m},u),n},ne=function t(e,r,a,n){n&&e.push(n);for(var o=0;o<e.length;o++){var i=e[o],s=oe(i);if(s)t(s.children,r,a);else if("mspace"!==i.classes[0]){var h=r(i,a.node);h&&(a.insertAfter?a.insertAfter(h):(e.unshift(h),o++)),a.node=i,a.insertAfter=function(t){return function(r){e.splice(t+1,0,r),o++}}(o)}}n&&e.pop()},oe=function(t){return t instanceof T||t instanceof I?t:null},ie=function(t,e){return t?(e&&(t=function t(e,r){var a=oe(e);if(a){var n=a.children;if(n.length){if("right"===r)return t(n[n.length-1],"right");if("left"===r)return t(n[0],"left")}}return e}(t,e)),re[t.classes[0]]||null):null},se=function(t,e){var r=["nulldelimiter"].concat(t.baseSizingClasses());return Jt(e.concat(r))},he=function(t,e,r){if(!t)return Jt();if(Wt[t.type]){var a=Wt[t.type](t,e);if(r&&e.size!==r.size){a=Jt(e.sizingClasses(r),[a],e);var n=e.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new i("Got group of unknown type: '"+t.type+"'")};function le(t,e){var r=Jt(["base"],t,e),a=Jt(["strut"]);return a.style.height=r.height+r.depth+"em",a.style.verticalAlign=-r.depth+"em",r.children.unshift(a),r}function me(t,e){var r=null;1===t.length&&"tag"===t[0].type&&(r=t[0].tag,t=t[0].body);for(var a,n=ae(t,e,!0),o=[],i=[],s=0;s<n.length;s++)if(i.push(n[s]),n[s].hasClass("mbin")||n[s].hasClass("mrel")||n[s].hasClass("allowbreak")){for(var h=!1;s<n.length-1&&n[s+1].hasClass("mspace")&&!n[s+1].hasClass("newline");)s++,i.push(n[s]),n[s].hasClass("nobreak")&&(h=!0);h||(o.push(le(i,e)),i=[])}else n[s].hasClass("newline")&&(i.pop(),i.length>0&&(o.push(le(i,e)),i=[]),o.push(n[s]));i.length>0&&o.push(le(i,e)),r&&((a=le(ae(r,e,!0))).classes=["tag"],o.push(a));var l=Jt(["katex-html"],o);if(l.setAttribute("aria-hidden","true"),a){var m=a.children[0];m.style.height=l.height+l.depth+"em",m.style.verticalAlign=-l.depth+"em"}return l}function ce(t){return new T(t)}var ue=function(){function t(t,e){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=t,this.attributes={},this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.getAttribute=function(t){return this.attributes[t]},e.toNode=function(){var t=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<"+this.type;for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+'="',t+=c.escape(this.attributes[e]),t+='"');t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</"+this.type+">"},e.toText=function(){return this.children.map(function(t){return t.toText()}).join("")},t}(),de=function(){function t(t){this.text=void 0,this.text=t}var e=t.prototype;return e.toNode=function(){return document.createTextNode(this.text)},e.toMarkup=function(){return c.escape(this.toText())},e.toText=function(){return this.text},t}(),pe={MathNode:ue,TextNode:de,SpaceNode:function(){function t(t){this.width=void 0,this.character=void 0,this.width=t,this.character=t>=.05555&&t<=.05556?"\u200a":t>=.1666&&t<=.1667?"\u2009":t>=.2222&&t<=.2223?"\u2005":t>=.2777&&t<=.2778?"\u2005\u200a":t>=-.05556&&t<=-.05555?"\u200a\u2063":t>=-.1667&&t<=-.1666?"\u2009\u2063":t>=-.2223&&t<=-.2222?"\u205f\u2063":t>=-.2778&&t<=-.2777?"\u2005\u2063":null}var e=t.prototype;return e.toNode=function(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return t.setAttribute("width",this.width+"em"),t},e.toMarkup=function(){return this.character?"<mtext>"+this.character+"</mtext>":'<mspace width="'+this.width+'em"/>'},e.toText=function(){return this.character?this.character:" "},t}(),newDocumentFragment:ce},fe=function(t,e,r){return!_[e][t]||!_[e][t].replace||55349===t.charCodeAt(0)||tt.hasOwnProperty(t)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(t=_[e][t].replace),new pe.TextNode(t)},ge=function(t){return 1===t.length?t[0]:new pe.MathNode("mrow",t)},xe=function(t,e){if("texttt"===e.fontFamily)return"monospace";if("textsf"===e.fontFamily)return"textit"===e.fontShape&&"textbf"===e.fontWeight?"sans-serif-bold-italic":"textit"===e.fontShape?"sans-serif-italic":"textbf"===e.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===e.fontShape&&"textbf"===e.fontWeight)return"bold-italic";if("textit"===e.fontShape)return"italic";if("textbf"===e.fontWeight)return"bold";var r=e.font;if(!r||"mathnormal"===r)return null;var a=t.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"bold-italic";var n=t.text;return c.contains(["\\imath","\\jmath"],n)?null:(_[a][n]&&_[a][n].replace&&(n=_[a][n].replace),V(n,Lt.fontMap[r].fontName,a)?Lt.fontMap[r].variant:null)},ve=function(t,e){for(var r,a=[],n=0;n<t.length;n++){var o=ye(t[n],e);if(o instanceof ue&&r instanceof ue){if("mtext"===o.type&&"mtext"===r.type&&o.getAttribute("mathvariant")===r.getAttribute("mathvariant")){var i;(i=r.children).push.apply(i,o.children);continue}if("mn"===o.type&&"mn"===r.type){var s;(s=r.children).push.apply(s,o.children);continue}if("mi"===o.type&&1===o.children.length&&"mn"===r.type){var h=o.children[0];if(h instanceof de&&"."===h.text){var l;(l=r.children).push.apply(l,o.children);continue}}else if("mi"===r.type&&1===r.children.length){var m=r.children[0];if(m instanceof de&&"\u0338"===m.text&&("mo"===o.type||"mi"===o.type||"mn"===o.type)){var c=o.children[0];c instanceof de&&c.text.length>0&&(c.text=c.text.slice(0,1)+"\u0338"+c.text.slice(1),a.pop())}}}a.push(o),r=o}return a},be=function(t,e){return ge(ve(t,e))},ye=function(t,e){if(!t)return new pe.MathNode("mrow");if(jt[t.type])return jt[t.type](t,e);throw new i("Got group of unknown type: '"+t.type+"'")};var we=function(t){return new wt({style:t.displayMode?w.DISPLAY:w.TEXT,maxSize:t.maxSize})},ke=function(t,e){if(e.displayMode){var r=["katex-display"];e.leqno&&r.push("leqno"),e.fleqn&&r.push("fleqn"),t=Lt.makeSpan(r,[t])}return t},Se=function(t,e,r){var a=we(r),n=function(t,e,r){var a,n=ve(t,r);a=1===n.length&&n[0]instanceof ue&&c.contains(["mrow","mtable"],n[0].type)?n[0]:new pe.MathNode("mrow",n);var o=new pe.MathNode("annotation",[new pe.TextNode(e)]);o.setAttribute("encoding","application/x-tex");var i=new pe.MathNode("semantics",[a,o]),s=new pe.MathNode("math",[i]);return Lt.makeSpan(["katex-mathml"],[s])}(t,e,a),o=me(t,a),i=Lt.makeSpan(["katex"],[n,o]);return ke(i,r)},ze={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb"},Me={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Te=function(t){return"ordgroup"===t.type?t.body.length:1},Ae=function(t,e,r,a){var n,o=t.height+t.depth+2*r;if(/fbox|color/.test(e)){if(n=Lt.makeSpan(["stretchy",e],[],a),"fbox"===e){var i=a.color&&a.getColor();i&&(n.style.borderColor=i)}}else{var s=[];/^[bx]cancel$/.test(e)&&s.push(new H({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(e)&&s.push(new H({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new R(s,{width:"100%",height:o+"em"});n=Lt.makeSvgSpan([],[h],a)}return n.height=o,n.style.height=o+"em",n},Be=function(t){var e=new pe.MathNode("mo",[new pe.TextNode(ze[t.substr(1)])]);return e.setAttribute("stretchy","true"),e},qe=function(t,e){var r=function(){var r=4e5,a=t.label.substr(1);if(c.contains(["widehat","widecheck","widetilde","utilde"],a)){var n,o,i,s=Te(t.base);if(s>5)"widehat"===a||"widecheck"===a?(n=420,r=2364,i=.42,o=a+"4"):(n=312,r=2340,i=.34,o="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===a||"widecheck"===a?(r=[0,1062,2364,2364,2364][h],n=[0,239,300,360,420][h],i=[0,.24,.3,.3,.36,.42][h],o=a+h):(r=[0,600,1033,2339,2340][h],n=[0,260,286,306,312][h],i=[0,.26,.286,.3,.306,.34][h],o="tilde"+h)}var l=new L(o),m=new R([l],{width:"100%",height:i+"em",viewBox:"0 0 "+r+" "+n,preserveAspectRatio:"none"});return{span:Lt.makeSvgSpan([],[m],e),minWidth:0,height:i}}var u,d,p=[],f=Me[a],g=f[0],x=f[1],v=f[2],b=v/1e3,y=g.length;if(1===y)u=["hide-tail"],d=[f[3]];else if(2===y)u=["halfarrow-left","halfarrow-right"],d=["xMinYMin","xMaxYMin"];else{if(3!==y)throw new Error("Correct katexImagesData or update code here to support\n "+y+" children.");u=["brace-left","brace-center","brace-right"],d=["xMinYMin","xMidYMin","xMaxYMin"]}for(var w=0;w<y;w++){var k=new L(g[w]),S=new R([k],{width:"400em",height:b+"em",viewBox:"0 0 "+r+" "+v,preserveAspectRatio:d[w]+" slice"}),z=Lt.makeSvgSpan([u[w]],[S],e);if(1===y)return{span:z,minWidth:x,height:b};z.style.height=b+"em",p.push(z)}return{span:Lt.makeSpan(["stretchy"],p,e),minWidth:x,height:b}}(),a=r.span,n=r.minWidth,o=r.height;return a.height=o,a.style.height=o+"em",n>0&&(a.style.minWidth=n+"em"),a},Ce=function(t,e){var r,a,n,o=Pt(t,"supsub");o?(r=(a=Ht(o.base,"accent")).base,o.base=r,n=function(t){if(t instanceof N)return t;throw new Error("Expected span<HtmlDomNode> but got "+String(t)+".")}(he(o,e)),o.base=a):r=(a=Ht(t,"accent")).base;var i=he(r,e.havingCrampedStyle()),s=0;if(a.isShifty&&c.isCharacterBox(r)){var h=c.getBaseElem(r);s=function(t){if(t instanceof E)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}(he(h,e.havingCrampedStyle())).skew}var l,m=Math.min(i.height,e.fontMetrics().xHeight);if(a.isStretchy)l=qe(a,e),l=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:l,wrapperClasses:["svg-align"],wrapperStyle:s>0?{width:"calc(100% - "+2*s+"em)",marginLeft:2*s+"em"}:void 0}]},e);else{var u,d;"\\vec"===a.label?(u=Lt.staticSvg("vec",e),d=Lt.svgData.vec[1]):((u=Lt.makeSymbol(a.label,"Main-Regular",a.mode,e)).italic=0,d=u.width),l=Lt.makeSpan(["accent-body"],[u]);var p="\\textcircled"===a.label;p&&(l.classes.push("accent-full"),m=i.height);var f=s;p||(f-=d/2),l.style.left=f+"em","\\textcircled"===a.label&&(l.style.top=".2em"),l=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-m},{type:"elem",elem:l}]},e)}var g=Lt.makeSpan(["mord","accent"],[l],e);return n?(n.children[0]=g,n.height=Math.max(g.height,n.height),n.classes[0]="mord",n):g},Ne=function(t,e){var r=t.isStretchy?Be(t.label):new pe.MathNode("mo",[fe(t.label,t.mode)]),a=new pe.MathNode("mover",[ye(t.base,e),r]);return a.setAttribute("accent","true"),a},Ie=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(t){return"\\"+t}).join("|"));$t({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(t,e){var r=e[0],a=!Ie.test(t.funcName),n=!a||"\\widehat"===t.funcName||"\\widetilde"===t.funcName||"\\widecheck"===t.funcName;return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=e[0];return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"accentUnder",mode:r.mode,label:a,base:n}},htmlBuilder:function(t,e){var r=he(t.base,e),a=qe(t,e),n="\\utilde"===t.label?.12:0,o=Lt.makeVList({positionType:"bottom",positionData:a.height+n,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:r}]},e);return Lt.makeSpan(["mord","accentunder"],[o],e)},mathmlBuilder:function(t,e){var r=Be(t.label),a=new pe.MathNode("munder",[ye(t.base,e),r]);return a.setAttribute("accentunder","true"),a}});var Oe=function(t){var e=new pe.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};$t({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:r[0]}},htmlBuilder:function(t,e){var r,a=e.style,n=e.havingStyle(a.sup()),o=Lt.wrapFragment(he(t.body,n,e),e);o.classes.push("x-arrow-pad"),t.below&&(n=e.havingStyle(a.sub()),(r=Lt.wrapFragment(he(t.below,n,e),e)).classes.push("x-arrow-pad"));var i,s=qe(t,e),h=-e.fontMetrics().axisHeight+.5*s.height,l=-e.fontMetrics().axisHeight-.5*s.height-.111;if((o.depth>.25||"\\xleftequilibrium"===t.label)&&(l-=o.depth),r){var m=-e.fontMetrics().axisHeight+r.height+.5*s.height+.111;i=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:l},{type:"elem",elem:s,shift:h},{type:"elem",elem:r,shift:m}]},e)}else i=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:l},{type:"elem",elem:s,shift:h}]},e);return i.children[0].children[0].children[1].classes.push("svg-align"),Lt.makeSpan(["mrel","x-arrow"],[i],e)},mathmlBuilder:function(t,e){var r,a=Be(t.label);if(t.body){var n=Oe(ye(t.body,e));if(t.below){var o=Oe(ye(t.below,e));r=new pe.MathNode("munderover",[a,o,n])}else r=new pe.MathNode("mover",[a,n])}else if(t.below){var i=Oe(ye(t.below,e));r=new pe.MathNode("munder",[a,i])}else r=Oe(),r=new pe.MathNode("mover",[a,r]);return r}}),$t({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],"ordgroup").body,n="",o=0;o<a.length;o++){n+=Ht(a[o],"textord").text}var s=parseInt(n);if(isNaN(s))throw new i("\\@char has non-numeric argument "+n);return{type:"textord",mode:r.mode,text:String.fromCharCode(s)}}});var Ee=function(t,e){var r=ae(t.body,e.withColor(t.color),!1);return Lt.makeFragment(r)},Re=function(t,e){var r=ve(t.body,e.withColor(t.color)),a=new pe.MathNode("mstyle",r);return a.setAttribute("mathcolor",t.color),a};$t({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","original"]},handler:function(t,e){var r=t.parser,a=Ht(e[0],"color-token").color,n=e[1];return{type:"color",mode:r.mode,color:a,body:Kt(n)}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,greediness:3,argTypes:["color"]},handler:function(t,e){var r=t.parser,a=t.breakOnTokenText,n=Ht(e[0],"color-token").color,o=r.parseExpression(!0,a);return{type:"color",mode:r.mode,color:n,body:o}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:"cr",names:["\\cr","\\newline"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=r[0],i="\\cr"===n,s=!1;return i||(s=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode")),{type:"cr",mode:a.mode,newLine:s,newRow:i,size:o&&Ht(o,"size").value}},htmlBuilder:function(t,e){if(t.newRow)throw new i("\\cr valid only within a tabular/array environment");var r=Lt.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=zt(t.size,e)+"em")),r},mathmlBuilder:function(t,e){var r=new pe.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",zt(t.size,e)+"em")),r}});var Le=function(t,e,r){var a=V(_.math[t]&&_.math[t].replace||t,e,r);if(!a)throw new Error("Unsupported symbol "+t+" and font size "+e+".");return a},He=function(t,e,r,a){var n=r.havingBaseStyle(e),o=Lt.makeSpan(a.concat(n.sizingClasses(r)),[t],r),i=n.sizeMultiplier/r.sizeMultiplier;return o.height*=i,o.depth*=i,o.maxFontSize=n.sizeMultiplier,o},Pe=function(t,e,r){var a=e.havingBaseStyle(r),n=(1-e.sizeMultiplier/a.sizeMultiplier)*e.fontMetrics().axisHeight;t.classes.push("delimcenter"),t.style.top=n+"em",t.height-=n,t.depth+=n},De=function(t,e,r,a,n,o){var i=function(t,e,r,a){return Lt.makeSymbol(t,"Size"+e+"-Regular",r,a)}(t,e,n,a),s=He(Lt.makeSpan(["delimsizing","size"+e],[i],a),w.TEXT,a,o);return r&&Pe(s,a,w.TEXT),s},Fe=function(t,e,r){var a;return a="Size1-Regular"===e?"delim-size1":"delim-size4",{type:"elem",elem:Lt.makeSpan(["delimsizinginner",a],[Lt.makeSpan([],[Lt.makeSymbol(t,e,r)])])}},Ve=function(t,e,r,a,n,o){var i,s,h,l;i=h=l=t,s=null;var m="Size1-Regular";"\\uparrow"===t?h=l="\u23d0":"\\Uparrow"===t?h=l="\u2016":"\\downarrow"===t?i=h="\u23d0":"\\Downarrow"===t?i=h="\u2016":"\\updownarrow"===t?(i="\\uparrow",h="\u23d0",l="\\downarrow"):"\\Updownarrow"===t?(i="\\Uparrow",h="\u2016",l="\\Downarrow"):"["===t||"\\lbrack"===t?(i="\u23a1",h="\u23a2",l="\u23a3",m="Size4-Regular"):"]"===t||"\\rbrack"===t?(i="\u23a4",h="\u23a5",l="\u23a6",m="Size4-Regular"):"\\lfloor"===t||"\u230a"===t?(h=i="\u23a2",l="\u23a3",m="Size4-Regular"):"\\lceil"===t||"\u2308"===t?(i="\u23a1",h=l="\u23a2",m="Size4-Regular"):"\\rfloor"===t||"\u230b"===t?(h=i="\u23a5",l="\u23a6",m="Size4-Regular"):"\\rceil"===t||"\u2309"===t?(i="\u23a4",h=l="\u23a5",m="Size4-Regular"):"("===t||"\\lparen"===t?(i="\u239b",h="\u239c",l="\u239d",m="Size4-Regular"):")"===t||"\\rparen"===t?(i="\u239e",h="\u239f",l="\u23a0",m="Size4-Regular"):"\\{"===t||"\\lbrace"===t?(i="\u23a7",s="\u23a8",l="\u23a9",h="\u23aa",m="Size4-Regular"):"\\}"===t||"\\rbrace"===t?(i="\u23ab",s="\u23ac",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\lgroup"===t||"\u27ee"===t?(i="\u23a7",l="\u23a9",h="\u23aa",m="Size4-Regular"):"\\rgroup"===t||"\u27ef"===t?(i="\u23ab",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\lmoustache"===t||"\u23b0"===t?(i="\u23a7",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\rmoustache"!==t&&"\u23b1"!==t||(i="\u23ab",l="\u23a9",h="\u23aa",m="Size4-Regular");var c=Le(i,m,n),u=c.height+c.depth,d=Le(h,m,n),p=d.height+d.depth,f=Le(l,m,n),g=f.height+f.depth,x=0,v=1;if(null!==s){var b=Le(s,m,n);x=b.height+b.depth,v=2}var y=u+g+x,k=Math.ceil((e-y)/(v*p)),S=y+k*v*p,z=a.fontMetrics().axisHeight;r&&(z*=a.sizeMultiplier);var M=S/2-z,T=[];if(T.push(Fe(l,m,n)),null===s)for(var A=0;A<k;A++)T.push(Fe(h,m,n));else{for(var B=0;B<k;B++)T.push(Fe(h,m,n));T.push(Fe(s,m,n));for(var q=0;q<k;q++)T.push(Fe(h,m,n))}T.push(Fe(i,m,n));var C=a.havingBaseStyle(w.TEXT),N=Lt.makeVList({positionType:"bottom",positionData:M,children:T},C);return He(Lt.makeSpan(["delimsizing","mult"],[N],C),w.TEXT,a,o)},Ue=function(t,e,r,a){var n;"sqrtTall"===t&&(n="M702 80H400000v40H742v"+(r-54-80)+"l-4 4-4 4c-.667.7\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 80H400000v40H742z");var o=new L(t,n),i=new R([o],{width:"400em",height:e+"em",viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Lt.makeSvgSpan(["hide-tail"],[i],a)},Ge=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],Xe=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],Ye=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],_e=[0,1.2,1.8,2.4,3],We=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],je=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],$e=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Ze=function(t){if("small"===t.type)return"Main-Regular";if("large"===t.type)return"Size"+t.size+"-Regular";if("stack"===t.type)return"Size4-Regular";throw new Error("Add support for delim type '"+t.type+"' here.")},Ke=function(t,e,r,a){for(var n=Math.min(2,3-a.style.size);n<r.length&&"stack"!==r[n].type;n++){var o=Le(t,Ze(r[n]),"math"),i=o.height+o.depth;if("small"===r[n].type&&(i*=a.havingBaseStyle(r[n].style).sizeMultiplier),i>e)return r[n]}return r[r.length-1]},Je=function(t,e,r,a,n,o){var i;"<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),i=c.contains(Ye,t)?We:c.contains(Ge,t)?$e:je;var s=Ke(t,e,i,a);return"small"===s.type?function(t,e,r,a,n,o){var i=Lt.makeSymbol(t,"Main-Regular",n,a),s=He(i,e,a,o);return r&&Pe(s,a,e),s}(t,s.style,r,a,n,o):"large"===s.type?De(t,s.size,r,a,n,o):Ve(t,e,r,a,n,o)},Qe=function(t,e){var r,a,n=e.havingBaseSizing(),o=Ke("\\surd",t*n.sizeMultiplier,$e,n),i=n.sizeMultiplier,s=0,h=0,l=0;return"small"===o.type?(t<1?i=1:t<1.4&&(i=.7),h=1/i,(r=Ue("sqrtMain",s=1.08/i,l=1080,e)).style.minWidth="0.853em",a=.833/i):"large"===o.type?(l=1080*_e[o.size],h=_e[o.size]/i,s=(_e[o.size]+.08)/i,(r=Ue("sqrtSize"+o.size,s,l,e)).style.minWidth="1.02em",a=1/i):(s=t+.08,h=t,l=Math.floor(1e3*t)+80,(r=Ue("sqrtTall",s,l,e)).style.minWidth="0.742em",a=1.056),r.height=h,r.style.height=s+"em",{span:r,advanceWidth:a,ruleWidth:e.fontMetrics().sqrtRuleThickness*i}},tr=function(t,e,r,a,n){if("<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),c.contains(Ge,t)||c.contains(Ye,t))return De(t,e,!1,r,a,n);if(c.contains(Xe,t))return Ve(t,_e[e],!1,r,a,n);throw new i("Illegal delimiter: '"+t+"'")},er=Je,rr=function(t,e,r,a,n,o){var i=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,h=Math.max(e-i,r+i),l=Math.max(h/500*901,2*h-s);return Je(t,l,!0,a,n,o)},ar={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},nr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function or(t,e){var r=Ft(t);if(r&&c.contains(nr,r.text))return r;throw new i("Invalid delimiter: '"+(r?r.text:JSON.stringify(t))+"' after '"+e.funcName+"'",t)}function ir(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}$t({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:ar[t.funcName].size,mclass:ar[t.funcName].mclass,delim:r.text}},htmlBuilder:function(t,e){return"."===t.delim?Lt.makeSpan([t.mclass]):tr(t.delim,t.size,e,t.mode,[t.mclass])},mathmlBuilder:function(t){var e=[];"."!==t.delim&&e.push(fe(t.delim,t.mode));var r=new pe.MathNode("mo",e);return"mopen"===t.mclass||"mclose"===t.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r}}),$t({type:"leftright-right",names:["\\right"],props:{numArgs:1},handler:function(t,e){return{type:"leftright-right",mode:t.parser.mode,delim:or(e[0],t).text}}}),$t({type:"leftright",names:["\\left"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t),a=t.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var o=Ht(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:r.text,right:o.delim}},htmlBuilder:function(t,e){ir(t);for(var r,a,n=ae(t.body,e,!0,["mopen","mclose"]),o=0,i=0,s=!1,h=0;h<n.length;h++)n[h].isMiddle?s=!0:(o=Math.max(n[h].height,o),i=Math.max(n[h].depth,i));if(o*=e.sizeMultiplier,i*=e.sizeMultiplier,r="."===t.left?se(e,["mopen"]):rr(t.left,o,i,e,t.mode,["mopen"]),n.unshift(r),s)for(var l=1;l<n.length;l++){var m=n[l].isMiddle;m&&(n[l]=rr(m.delim,o,i,m.options,t.mode,[]))}return a="."===t.right?se(e,["mclose"]):rr(t.right,o,i,e,t.mode,["mclose"]),n.push(a),Lt.makeSpan(["minner"],n,e)},mathmlBuilder:function(t,e){ir(t);var r=ve(t.body,e);if("."!==t.left){var a=new pe.MathNode("mo",[fe(t.left,t.mode)]);a.setAttribute("fence","true"),r.unshift(a)}if("."!==t.right){var n=new pe.MathNode("mo",[fe(t.right,t.mode)]);n.setAttribute("fence","true"),r.push(n)}return ge(r)}}),$t({type:"middle",names:["\\middle"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);if(!t.parser.leftrightDepth)throw new i("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},htmlBuilder:function(t,e){var r;if("."===t.delim)r=se(e,[]);else{r=tr(t.delim,1,e,t.mode,[]);var a={delim:t.delim,options:e};r.isMiddle=a}return r},mathmlBuilder:function(t,e){var r="\\vert"===t.delim||"|"===t.delim?fe("|","text"):fe(t.delim,t.mode),a=new pe.MathNode("mo",[r]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var sr=function(t,e){var r,a,n=Lt.wrapFragment(he(t.body,e),e),o=t.label.substr(1),i=e.sizeMultiplier,s=0,h=c.isCharacterBox(t.body);if("sout"===o)(r=Lt.makeSpan(["stretchy","sout"])).height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else{/cancel/.test(o)?h||n.classes.push("cancel-pad"):n.classes.push("boxpad");var l=0;l=/box/.test(o)?"colorbox"===o?.3:.34:h?.2:0,r=Ae(n,o,l,e),s=n.depth+l,t.backgroundColor&&(r.style.backgroundColor=t.backgroundColor,t.borderColor&&(r.style.borderColor=t.borderColor))}return a=t.backgroundColor?Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:s},{type:"elem",elem:n,shift:0}]},e):Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:0},{type:"elem",elem:r,shift:s,wrapperClasses:/cancel/.test(o)?["svg-align"]:[]}]},e),/cancel/.test(o)&&(a.height=n.height,a.depth=n.depth),/cancel/.test(o)&&!h?Lt.makeSpan(["mord","cancel-lap"],[a],e):Lt.makeSpan(["mord"],[a],e)},hr=function(t,e){var r=new pe.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[ye(t.body,e)]);switch(t.label){case"\\cancel":r.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":r.setAttribute("notation","downdiagonalstrike");break;case"\\sout":r.setAttribute("notation","horizontalstrike");break;case"\\fbox":r.setAttribute("notation","box");break;case"\\fcolorbox":case"\\colorbox":if(r.setAttribute("width","+6pt"),r.setAttribute("height","+6pt"),r.setAttribute("lspace","3pt"),r.setAttribute("voffset","3pt"),"\\fcolorbox"===t.label){var a=e.fontMetrics().defaultRuleThickness;r.setAttribute("style","border: "+a+"em solid "+String(t.borderColor))}break;case"\\xcancel":r.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return t.backgroundColor&&r.setAttribute("mathbackground",t.backgroundColor),r};$t({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],"color-token").color,i=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,body:i}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:["color","color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],"color-token").color,i=Ht(e[1],"color-token").color,s=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:i,borderColor:o,body:s}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["text"],allowedInText:!0},handler:function(t,e){return{type:"enclose",mode:t.parser.mode,label:"\\fbox",body:e[0]}}}),$t({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout"],props:{numArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=e[0];return{type:"enclose",mode:a.mode,label:n,body:o}},htmlBuilder:sr,mathmlBuilder:hr});var lr={};function mr(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:n},h=0;h<r.length;++h)lr[r[h]]=s;o&&(Wt[e]=o),i&&(jt[e]=i)}function cr(t){var e=[];t.consumeSpaces();for(var r=t.nextToken.text;"\\hline"===r||"\\hdashline"===r;)t.consume(),e.push("\\hdashline"===r),t.consumeSpaces(),r=t.nextToken.text;return e}function ur(t,e,r){var a=e.hskipBeforeAndAfter,n=e.addJot,o=e.cols,s=e.arraystretch,h=e.colSeparationType;if(t.gullet.beginGroup(),t.gullet.macros.set("\\\\","\\cr"),!s){var l=t.gullet.expandMacroAsText("\\arraystretch");if(null==l)s=1;else if(!(s=parseFloat(l))||s<0)throw new i("Invalid \\arraystretch: "+l)}var m=[],c=[m],u=[],d=[];for(d.push(cr(t));;){var p=t.parseExpression(!1,"\\cr");p={type:"ordgroup",mode:t.mode,body:p},r&&(p={type:"styling",mode:t.mode,style:r,body:[p]}),m.push(p);var f=t.nextToken.text;if("&"===f)t.consume();else{if("\\end"===f){1===m.length&&"styling"===p.type&&0===p.body[0].body.length&&c.pop(),d.length<c.length+1&&d.push([]);break}if("\\cr"!==f)throw new i("Expected & or \\\\ or \\cr or \\end",t.nextToken);var g=Ht(t.parseFunction(),"cr");u.push(g.size),d.push(cr(t)),m=[],c.push(m)}}return t.gullet.endGroup(),{type:"array",mode:t.mode,addJot:n,arraystretch:s,body:c,cols:o,rowGaps:u,hskipBeforeAndAfter:a,hLinesBeforeRow:d,colSeparationType:h}}function dr(t){return"d"===t.substr(0,1)?"display":"text"}var pr=function(t,e){var r,a,n=t.body.length,o=t.hLinesBeforeRow,s=0,h=new Array(n),l=[],m=1/e.fontMetrics().ptPerEm,u=5*m,d=12*m,p=3*m,f=t.arraystretch*d,g=.7*f,x=.3*f,v=0;function b(t){for(var e=0;e<t.length;++e)e>0&&(v+=.25),l.push({pos:v,isDashed:t[e]})}for(b(o[0]),r=0;r<t.body.length;++r){var y=t.body[r],w=g,k=x;s<y.length&&(s=y.length);var S=new Array(y.length);for(a=0;a<y.length;++a){var z=he(y[a],e);k<z.depth&&(k=z.depth),w<z.height&&(w=z.height),S[a]=z}var M=t.rowGaps[r],T=0;M&&(T=zt(M,e))>0&&(k<(T+=x)&&(k=T),T=0),t.addJot&&(k+=p),S.height=w,S.depth=k,v+=w,S.pos=v,v+=k+T,h[r]=S,b(o[r+1])}var A,B,q=v/2+e.fontMetrics().axisHeight,C=t.cols||[],N=[];for(a=0,B=0;a<s||B<C.length;++a,++B){for(var I=C[B]||{},O=!0;"separator"===I.type;){if(O||((A=Lt.makeSpan(["arraycolsep"],[])).style.width=e.fontMetrics().doubleRuleSep+"em",N.push(A)),"|"===I.separator){var E=Lt.makeSpan(["vertical-separator"],[],e);E.style.height=v+"em",E.style.verticalAlign=-(v-q)+"em",N.push(E)}else{if(":"!==I.separator)throw new i("Invalid separator type: "+I.separator);var R=Lt.makeSpan(["vertical-separator","vs-dashed"],[],e);R.style.height=v+"em",R.style.verticalAlign=-(v-q)+"em",N.push(R)}I=C[++B]||{},O=!1}if(!(a>=s)){var L=void 0;(a>0||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.pregap,u))&&((A=Lt.makeSpan(["arraycolsep"],[])).style.width=L+"em",N.push(A));var H=[];for(r=0;r<n;++r){var P=h[r],D=P[a];if(D){var F=P.pos-q;D.depth=P.depth,D.height=P.height,H.push({type:"elem",elem:D,shift:F})}}H=Lt.makeVList({positionType:"individualShift",children:H},e),H=Lt.makeSpan(["col-align-"+(I.align||"c")],[H]),N.push(H),(a<s-1||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.postgap,u))&&((A=Lt.makeSpan(["arraycolsep"],[])).style.width=L+"em",N.push(A))}}if(h=Lt.makeSpan(["mtable"],N),l.length>0){for(var V=Lt.makeLineSpan("hline",e,.05),U=Lt.makeLineSpan("hdashline",e,.05),G=[{type:"elem",elem:h,shift:0}];l.length>0;){var X=l.pop(),Y=X.pos-q;X.isDashed?G.push({type:"elem",elem:U,shift:Y}):G.push({type:"elem",elem:V,shift:Y})}h=Lt.makeVList({positionType:"individualShift",children:G},e)}return Lt.makeSpan(["mord"],[h],e)},fr={c:"center ",l:"left ",r:"right "},gr=function(t,e){var r=new pe.MathNode("mtable",t.body.map(function(t){return new pe.MathNode("mtr",t.map(function(t){return new pe.MathNode("mtd",[ye(t,e)])}))})),a=.16+t.arraystretch-1+(t.addJot?.09:0);r.setAttribute("rowspacing",a+"em");var n="",o="";if(t.cols){var i=t.cols,s="",h=!1,l=0,m=i.length;"separator"===i[0].type&&(n+="top ",l=1),"separator"===i[i.length-1].type&&(n+="bottom ",m-=1);for(var c=l;c<m;c++)"align"===i[c].type?(o+=fr[i[c].align],h&&(s+="none "),h=!0):"separator"===i[c].type&&h&&(s+="|"===i[c].separator?"solid ":"dashed ",h=!1);r.setAttribute("columnalign",o.trim()),/[sd]/.test(s)&&r.setAttribute("columnlines",s.trim())}if("align"===t.colSeparationType){for(var u=t.cols||[],d="",p=1;p<u.length;p++)d+=p%2?"0em ":"1em ";r.setAttribute("columnspacing",d.trim())}else"alignat"===t.colSeparationType?r.setAttribute("columnspacing","0em"):r.setAttribute("columnspacing","1em");var f="",g=t.hLinesBeforeRow;n+=g[0].length>0?"left ":"",n+=g[g.length-1].length>0?"right ":"";for(var x=1;x<g.length-1;x++)f+=0===g[x].length?"none ":g[x][0]?"dashed ":"solid ";if(/[sd]/.test(f)&&r.setAttribute("rowlines",f.trim()),""===n)return r;var v=new pe.MathNode("menclose",[r]);return v.setAttribute("notation",n.trim()),v},xr=function(t,e){var r,a=[],n=ur(t.parser,{cols:a,addJot:!0},"display"),o=0,s={type:"ordgroup",mode:t.mode,body:[]},h=Pt(e[0],"ordgroup");if(h){for(var l="",m=0;m<h.body.length;m++){l+=Ht(h.body[m],"textord").text}r=Number(l),o=2*r}var c=!o;n.body.forEach(function(t){for(var e=1;e<t.length;e+=2){var a=Ht(t[e],"styling");Ht(a.body[0],"ordgroup").body.unshift(s)}if(c)o<t.length&&(o=t.length);else{var n=t.length/2;if(r<n)throw new i("Too many math in a row: expected "+r+", but got "+n,t[0])}});for(var u=0;u<o;++u){var d="r",p=0;u%2==1?d="l":u>0&&c&&(p=1),a[u]={type:"align",align:d,pregap:p,postgap:0}}return n.colSeparationType=c?"align":"alignat",n};mr({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(t,e){var r={cols:(Ft(e[0])?[e[0]]:Ht(e[0],"ordgroup").body).map(function(t){var e=function(t){var e=Ft(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}(t).text;if(-1!=="lcr".indexOf(e))return{type:"align",align:e};if("|"===e)return{type:"separator",separator:"|"};if(":"===e)return{type:"separator",separator:":"};throw new i("Unknown column alignment: "+e,t)}),hskipBeforeAndAfter:!0};return ur(t.parser,r,dr(t.envName))},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],props:{numArgs:0},handler:function(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName],r=ur(t.parser,{hskipBeforeAndAfter:!1},dr(t.envName));return e?{type:"leftright",mode:t.mode,body:[r],left:e[0],right:e[1]}:r},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["cases","dcases"],props:{numArgs:0},handler:function(t){var e=ur(t.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},dr(t.envName));return{type:"leftright",mode:t.mode,body:[e],left:"\\{",right:"."}},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["aligned"],props:{numArgs:0},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["gathered"],props:{numArgs:0},handler:function(t){return ur(t.parser,{cols:[{type:"align",align:"c"}],addJot:!0},"display")},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:"array",names:["alignedat"],props:{numArgs:1},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),$t({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(t,e){throw new i(t.funcName+" valid only within array environment")}});var vr=lr;$t({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];if("ordgroup"!==n.type)throw new i("Invalid environment name",n);for(var o="",s=0;s<n.body.length;++s)o+=Ht(n.body[s],"textord").text;if("\\begin"===a){if(!vr.hasOwnProperty(o))throw new i("No such environment: "+o,n);var h=vr[o],l=r.parseArguments("\\begin{"+o+"}",h),m=l.args,c=l.optArgs,u={mode:r.mode,envName:o,parser:r},d=h.handler(u,m,c);r.expect("\\end",!1);var p=r.nextToken,f=Ht(r.parseFunction(),"environment");if(f.name!==o)throw new i("Mismatch: \\begin{"+o+"} matched by \\end{"+f.name+"}",p);return d}return{type:"environment",mode:r.mode,name:o,nameGroup:n}}});var br=Lt.makeSpan;function yr(t,e){var r=ae(t.body,e,!0);return br([t.mclass],r,e)}function wr(t,e){var r=ve(t.body,e);return pe.newDocumentFragment(r)}$t({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+a.substr(5),body:Kt(n)}},htmlBuilder:yr,mathmlBuilder:wr});var kr=function(t){var e="ordgroup"===t.type&&t.body.length?t.body[0]:t;return"atom"!==e.type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family};$t({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:function(t,e){return{type:"mclass",mode:t.parser.mode,mclass:kr(e[0]),body:[e[1]]}}}),$t({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[1],i=e[0];r="\\stackrel"!==n?kr(o):"mrel";var s={type:"op",mode:o.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:Kt(o)},h={type:"supsub",mode:i.mode,base:s,sup:"\\underset"===n?null:i,sub:"\\underset"===n?i:null};return{type:"mclass",mode:a.mode,mclass:r,body:[h]}},htmlBuilder:yr,mathmlBuilder:wr});var Sr=function(t,e){var r=t.font,a=e.withFont(r);return he(t.body,a)},zr=function(t,e){var r=t.font,a=e.withFont(r);return ye(t.body,a)},Mr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};$t({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0],o=a;return o in Mr&&(o=Mr[o]),{type:"font",mode:r.mode,font:o.slice(1),body:n}},htmlBuilder:Sr,mathmlBuilder:zr}),$t({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=e[0];return{type:"mclass",mode:r.mode,mclass:kr(a),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:a}]}}}),$t({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=t.breakOnTokenText,o=r.mode,i=r.parseExpression(!0,n);return{type:"font",mode:o,font:"math"+a.slice(1),body:{type:"ordgroup",mode:r.mode,body:i}}},htmlBuilder:Sr,mathmlBuilder:zr});var Tr=function(t,e){var r=e;return"display"===t?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:"text"===t&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===t?r=w.SCRIPT:"scriptscript"===t&&(r=w.SCRIPTSCRIPT),r},Ar=function(t,e){var r,a=Tr(t.size,e.style),n=a.fracNum(),o=a.fracDen();r=e.havingStyle(n);var i=he(t.numer,r,e);if(t.continued){var s=8.5/e.fontMetrics().ptPerEm,h=3.5/e.fontMetrics().ptPerEm;i.height=i.height<s?s:i.height,i.depth=i.depth<h?h:i.depth}r=e.havingStyle(o);var l,m,c,u,d,p,f,g,x,v,b=he(t.denom,r,e);if(t.hasBarLine?(t.barSize?(m=zt(t.barSize,e),l=Lt.makeLineSpan("frac-line",e,m)):l=Lt.makeLineSpan("frac-line",e),m=l.height,c=l.height):(l=null,m=0,c=e.fontMetrics().defaultRuleThickness),a.size===w.DISPLAY.size||"display"===t.size?(u=e.fontMetrics().num1,d=m>0?3*c:7*c,p=e.fontMetrics().denom1):(m>0?(u=e.fontMetrics().num2,d=c):(u=e.fontMetrics().num3,d=3*c),p=e.fontMetrics().denom2),l){var y=e.fontMetrics().axisHeight;u-i.depth-(y+.5*m)<d&&(u+=d-(u-i.depth-(y+.5*m))),y-.5*m-(b.height-p)<d&&(p+=d-(y-.5*m-(b.height-p)));var k=-(y-.5*m);f=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:p},{type:"elem",elem:l,shift:k},{type:"elem",elem:i,shift:-u}]},e)}else{var S=u-i.depth-(b.height-p);S<d&&(u+=.5*(d-S),p+=.5*(d-S)),f=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:p},{type:"elem",elem:i,shift:-u}]},e)}return r=e.havingStyle(a),f.height*=r.sizeMultiplier/e.sizeMultiplier,f.depth*=r.sizeMultiplier/e.sizeMultiplier,g=a.size===w.DISPLAY.size?e.fontMetrics().delim1:e.fontMetrics().delim2,x=null==t.leftDelim?se(e,["mopen"]):er(t.leftDelim,g,!0,e.havingStyle(a),t.mode,["mopen"]),v=t.continued?Lt.makeSpan([]):null==t.rightDelim?se(e,["mclose"]):er(t.rightDelim,g,!0,e.havingStyle(a),t.mode,["mclose"]),Lt.makeSpan(["mord"].concat(r.sizingClasses(e)),[x,Lt.makeSpan(["mfrac"],[f]),v],e)},Br=function(t,e){var r=new pe.MathNode("mfrac",[ye(t.numer,e),ye(t.denom,e)]);if(t.hasBarLine){if(t.barSize){var a=zt(t.barSize,e);r.setAttribute("linethickness",a+"em")}}else r.setAttribute("linethickness","0px");var n=Tr(t.size,e.style);if(n.size!==e.style.size){r=new pe.MathNode("mstyle",[r]);var o=n.size===w.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",o),r.setAttribute("scriptlevel","0")}if(null!=t.leftDelim||null!=t.rightDelim){var i=[];if(null!=t.leftDelim){var s=new pe.MathNode("mo",[new pe.TextNode(t.leftDelim.replace("\\",""))]);s.setAttribute("fence","true"),i.push(s)}if(i.push(r),null!=t.rightDelim){var h=new pe.MathNode("mo",[new pe.TextNode(t.rightDelim.replace("\\",""))]);h.setAttribute("fence","true"),i.push(h)}return ge(i)}return r};$t({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,greediness:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[0],i=e[1],s=null,h=null,l="auto";switch(n){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,s="(",h=")";break;case"\\\\bracefrac":r=!1,s="\\{",h="\\}";break;case"\\\\brackfrac":r=!1,s="[",h="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\cfrac":case"\\dfrac":case"\\dbinom":l="display";break;case"\\tfrac":case"\\tbinom":l="text"}return{type:"genfrac",mode:a.mode,continued:"\\cfrac"===n,numer:o,denom:i,hasBarLine:r,leftDelim:s,rightDelim:h,size:l,barSize:null}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler:function(t){var e,r=t.parser,a=t.funcName,n=t.token;switch(a){case"\\over":e="\\frac";break;case"\\choose":e="\\binom";break;case"\\atop":e="\\\\atopfrac";break;case"\\brace":e="\\\\bracefrac";break;case"\\brack":e="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:e,token:n}}});var qr=["display","text","script","scriptscript"],Cr=function(t){var e=null;return t.length>0&&(e="."===(e=t)?null:e),e};$t({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,greediness:6,argTypes:["math","math","size","text","math","math"]},handler:function(t,e){var r=t.parser,a=e[4],n=e[5],o=Pt(e[0],"atom");o&&(o=Dt(e[0],"open"));var i=o?Cr(o.text):null,s=Pt(e[1],"atom");s&&(s=Dt(e[1],"close"));var h,l=s?Cr(s.text):null,m=Ht(e[2],"size"),c=null;h=!!m.isBlank||(c=m.value).number>0;var u="auto",d=Pt(e[3],"ordgroup");if(d){if(d.body.length>0){var p=Ht(d.body[0],"textord");u=qr[Number(p.text)]}}else d=Ht(e[3],"textord"),u=qr[Number(d.text)];return{type:"genfrac",mode:r.mode,numer:a,denom:n,continued:!1,hasBarLine:h,barSize:c,leftDelim:i,rightDelim:l,size:u}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(t,e){var r=t.parser,a=(t.funcName,t.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ht(e[0],"size").value,token:a}}}),$t({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(t,e){var r=t.parser,a=(t.funcName,e[0]),n=function(t){if(!t)throw new Error("Expected non-null, but got "+String(t));return t}(Ht(e[1],"infix").size),o=e[2],i=n.number>0;return{type:"genfrac",mode:r.mode,numer:a,denom:o,continued:!1,hasBarLine:i,barSize:n,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Ar,mathmlBuilder:Br});var Nr=function(t,e){var r,a,n=e.style,o=Pt(t,"supsub");o?(r=o.sup?he(o.sup,e.havingStyle(n.sup()),e):he(o.sub,e.havingStyle(n.sub()),e),a=Ht(o.base,"horizBrace")):a=Ht(t,"horizBrace");var i,s=he(a.base,e.havingBaseStyle(w.DISPLAY)),h=qe(a,e);if(a.isOver?(i=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:h}]},e)).children[0].children[0].children[1].classes.push("svg-align"):(i=Lt.makeVList({positionType:"bottom",positionData:s.depth+.1+h.height,children:[{type:"elem",elem:h},{type:"kern",size:.1},{type:"elem",elem:s}]},e)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Lt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e);i=a.isOver?Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},e):Lt.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},e)}return Lt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e)};$t({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName;return{type:"horizBrace",mode:r.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:Nr,mathmlBuilder:function(t,e){var r=Be(t.label);return new pe.MathNode(t.isOver?"mover":"munder",[ye(t.base,e),r])}}),$t({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[1],n=Ht(e[0],"url").url;return{type:"href",mode:r.mode,href:n,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e,!1);return Lt.makeAnchor(t.href,[],r,e)},mathmlBuilder:function(t,e){var r=be(t.body,e);return r instanceof ue||(r=new ue("mrow",[r])),r.setAttribute("href",t.href),r}}),$t({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],"url").url,n=[],o=0;o<a.length;o++){var i=a[o];"~"===i&&(i="\\textasciitilde"),n.push({type:"textord",mode:"text",text:i})}var s={type:"text",mode:r.mode,font:"\\texttt",body:n};return{type:"href",mode:r.mode,href:a,body:Kt(s)}}}),$t({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:function(t,e){return{type:"htmlmathml",mode:t.parser.mode,html:Kt(e[0]),mathml:Kt(e[1])}},htmlBuilder:function(t,e){var r=ae(t.html,e,!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){return be(t.mathml,e)}}),$t({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=Ht(e[0],"size");if(r.settings.strict){var o="m"===a[1],i="mu"===n.value.unit;o?(i||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, not "+n.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):i&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:n.value}},htmlBuilder:function(t,e){return Lt.makeGlue(t.dimension,e)},mathmlBuilder:function(t,e){var r=zt(t.dimension,e);return new pe.SpaceNode(r)}}),$t({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"lap",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:function(t,e){var r;"clap"===t.alignment?(r=Lt.makeSpan([],[he(t.body,e)]),r=Lt.makeSpan(["inner"],[r],e)):r=Lt.makeSpan(["inner"],[he(t.body,e)]);var a=Lt.makeSpan(["fix"],[]),n=Lt.makeSpan([t.alignment],[r,a],e),o=Lt.makeSpan(["strut"]);return o.style.height=n.height+n.depth+"em",o.style.verticalAlign=-n.depth+"em",n.children.unshift(o),n=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:n}]},e),Lt.makeSpan(["mord"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mpadded",[ye(t.body,e)]);if("rlap"!==t.alignment){var a="llap"===t.alignment?"-1":"-0.5";r.setAttribute("lspace",a+"width")}return r.setAttribute("width","0px"),r}}),$t({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1,consumeMode:"math"},handler:function(t,e){var r=t.funcName,a=t.parser,n=a.mode;a.switchMode("math");var o="\\("===r?"\\)":"$",i=a.parseExpression(!1,o);return a.expect(o,!1),a.switchMode(n),a.consume(),{type:"styling",mode:a.mode,style:"text",body:i}}}),$t({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){throw new i("Mismatched "+t.funcName)}});var Ir=function(t,e){switch(e.style.size){case w.DISPLAY.size:return t.display;case w.TEXT.size:return t.text;case w.SCRIPT.size:return t.script;case w.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};$t({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4},handler:function(t,e){return{type:"mathchoice",mode:t.parser.mode,display:Kt(e[0]),text:Kt(e[1]),script:Kt(e[2]),scriptscript:Kt(e[3])}},htmlBuilder:function(t,e){var r=Ir(t,e),a=ae(r,e,!1);return Lt.makeFragment(a)},mathmlBuilder:function(t,e){var r=Ir(t,e);return be(r,e)}});var Or=["\\smallint"],Er=function(t,e){var r,a,n,o=!1,i=Pt(t,"supsub");i?(r=i.sup,a=i.sub,n=Ht(i.base,"op"),o=!0):n=Ht(t,"op");var s,h=e.style,l=!1;if(h.size===w.DISPLAY.size&&n.symbol&&!c.contains(Or,n.name)&&(l=!0),n.symbol){var m=l?"Size2-Regular":"Size1-Regular",u="";if("\\oiint"!==n.name&&"\\oiiint"!==n.name||(u=n.name.substr(1),n.name="oiint"===u?"\\iint":"\\iiint"),s=Lt.makeSymbol(n.name,m,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),u.length>0){var d=s.italic,p=Lt.staticSvg(u+"Size"+(l?"2":"1"),e);s=Lt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),n.name="\\"+u,s.classes.unshift("mop"),s.italic=d}}else if(n.body){var f=ae(n.body,e,!0);1===f.length&&f[0]instanceof E?(s=f[0]).classes[0]="mop":s=Lt.makeSpan(["mop"],Lt.tryCombineChars(f),e)}else{for(var g=[],x=1;x<n.name.length;x++)g.push(Lt.mathsym(n.name[x],n.mode));s=Lt.makeSpan(["mop"],g,e)}var v=0,b=0;if((s instanceof E||"\\oiint"===n.name||"\\oiiint"===n.name)&&!n.suppressBaseShift&&(v=(s.height-s.depth)/2-e.fontMetrics().axisHeight,b=s.italic),o){var y,k,S;if(s=Lt.makeSpan([],[s]),r){var z=he(r,e.havingStyle(h.sup()),e);k={elem:z,kern:Math.max(e.fontMetrics().bigOpSpacing1,e.fontMetrics().bigOpSpacing3-z.depth)}}if(a){var M=he(a,e.havingStyle(h.sub()),e);y={elem:M,kern:Math.max(e.fontMetrics().bigOpSpacing2,e.fontMetrics().bigOpSpacing4-M.height)}}if(k&&y){var T=e.fontMetrics().bigOpSpacing5+y.elem.height+y.elem.depth+y.kern+s.depth+v;S=Lt.makeVList({positionType:"bottom",positionData:T,children:[{type:"kern",size:e.fontMetrics().bigOpSpacing5},{type:"elem",elem:y.elem,marginLeft:-b+"em"},{type:"kern",size:y.kern},{type:"elem",elem:s},{type:"kern",size:k.kern},{type:"elem",elem:k.elem,marginLeft:b+"em"},{type:"kern",size:e.fontMetrics().bigOpSpacing5}]},e)}else if(y){var A=s.height-v;S=Lt.makeVList({positionType:"top",positionData:A,children:[{type:"kern",size:e.fontMetrics().bigOpSpacing5},{type:"elem",elem:y.elem,marginLeft:-b+"em"},{type:"kern",size:y.kern},{type:"elem",elem:s}]},e)}else{if(!k)return s;var B=s.depth+v;S=Lt.makeVList({positionType:"bottom",positionData:B,children:[{type:"elem",elem:s},{type:"kern",size:k.kern},{type:"elem",elem:k.elem,marginLeft:b+"em"},{type:"kern",size:e.fontMetrics().bigOpSpacing5}]},e)}return Lt.makeSpan(["mop","op-limits"],[S],e)}return v&&(s.style.position="relative",s.style.top=v+"em"),s},Rr=function(t,e){var r;if(t.symbol)r=new ue("mo",[fe(t.name,t.mode)]),c.contains(Or,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new ue("mo",ve(t.body,e));else{r=new ue("mi",[new de(t.name.slice(1))]);var a=new ue("mo",[fe("\u2061","text")]);r=t.parentIsSupSub?new ue("mo",[r,a]):ce([r,a])}return r},Lr={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};$t({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:function(t,e){var r=t.parser,a=t.funcName;return 1===a.length&&(a=Lr[a]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"op",names:["\\mathop"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Kt(a)}},htmlBuilder:Er,mathmlBuilder:Rr});var Hr={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};function Pr(t,e,r){for(var a=ae(t,e,!1),n=e.sizeMultiplier/r.sizeMultiplier,o=0;o<a.length;o++){var i=a[o].classes.indexOf("sizing");i<0?Array.prototype.push.apply(a[o].classes,e.sizingClasses(r)):a[o].classes[i+1]==="reset-size"+e.size&&(a[o].classes[i+1]="reset-size"+r.size),a[o].height*=n,a[o].depth*=n}return Lt.makeFragment(a)}$t({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return 1===r.length&&(r=Hr[r]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:"operatorname",names:["\\operatorname"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"operatorname",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){if(t.body.length>0){for(var r=t.body.map(function(t){var e=t.text;return"string"==typeof e?{type:"textord",mode:t.mode,text:e}:t}),a=ae(r,e.withFont("mathrm"),!0),n=0;n<a.length;n++){var o=a[n];o instanceof E&&(o.text=o.text.replace(/\u2212/,"-").replace(/\u2217/,"*"))}return Lt.makeSpan(["mop"],a,e)}return Lt.makeSpan(["mop"],[],e)},mathmlBuilder:function(t,e){for(var r=ve(t.body,e.withFont("mathrm")),a=!0,n=0;n<r.length;n++){var o=r[n];if(o instanceof pe.SpaceNode);else if(o instanceof pe.MathNode)switch(o.type){case"mi":case"mn":case"ms":case"mspace":case"mtext":break;case"mo":var i=o.children[0];1===o.children.length&&i instanceof pe.TextNode?i.text=i.text.replace(/\u2212/,"-").replace(/\u2217/,"*"):a=!1;break;default:a=!1}else a=!1}if(a){var s=r.map(function(t){return t.toText()}).join("");r=[new pe.TextNode(s)]}var h=new pe.MathNode("mi",r);h.setAttribute("mathvariant","normal");var l=new pe.MathNode("mo",[fe("\u2061","text")]);return pe.newDocumentFragment([h,l])}}),Zt({type:"ordgroup",htmlBuilder:function(t,e){return t.semisimple?Lt.makeFragment(ae(t.body,e,!1)):Lt.makeSpan(["mord"],ae(t.body,e,!0),e)},mathmlBuilder:function(t,e){return be(t.body,e)}}),$t({type:"overline",names:["\\overline"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"overline",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle()),a=Lt.makeLineSpan("overline-line",e),n=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*a.height},{type:"elem",elem:a},{type:"kern",size:a.height}]},e);return Lt.makeSpan(["mord","overline"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mo",[new pe.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new pe.MathNode("mover",[ye(t.body,e),r]);return a.setAttribute("accent","true"),a}}),$t({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"phantom",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e.withPhantom(),!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){var r=ve(t.body,e);return new pe.MathNode("mphantom",r)}}),$t({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"hphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a<r.children.length;a++)r.children[a].height=0,r.children[a].depth=0;return r=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e),Lt.makeSpan(["mord"],[r],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode("mphantom",r),n=new pe.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}}),$t({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"vphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan(["inner"],[he(t.body,e.withPhantom())]),a=Lt.makeSpan(["fix"],[]);return Lt.makeSpan(["mord","rlap"],[r,a],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode("mphantom",r),n=new pe.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}});var Dr=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],Fr=function(t,e){var r=e.havingSize(t.size);return Pr(t.body,r,e)};$t({type:"sizing",names:Dr,props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!1,r);return{type:"sizing",mode:n.mode,size:Dr.indexOf(a)+1,body:o}},htmlBuilder:Fr,mathmlBuilder:function(t,e){var r=e.havingSize(t.size),a=ve(t.body,r),n=new pe.MathNode("mstyle",a);return n.setAttribute("mathsize",r.sizeMultiplier+"em"),n}}),$t({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","text"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ht(e[0],"size").value,n=e[1];return{type:"raisebox",mode:r.mode,dy:a,body:n}},htmlBuilder:function(t,e){var r={type:"text",mode:t.mode,body:Kt(t.body),font:"mathrm"},a={type:"sizing",mode:t.mode,body:[r],size:6},n=Fr(a,e),o=zt(t.dy,e);return Lt.makeVList({positionType:"shift",positionData:-o,children:[{type:"elem",elem:n}]},e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mpadded",[ye(t.body,e)]),a=t.dy.number+t.dy.unit;return r.setAttribute("voffset",a),r}}),$t({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler:function(t,e,r){var a=t.parser,n=r[0],o=Ht(e[0],"size"),i=Ht(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&Ht(n,"size").value,width:o.value,height:i.value}},htmlBuilder:function(t,e){var r=Lt.makeSpan(["mord","rule"],[],e),a=zt(t.width,e),n=zt(t.height,e),o=t.shift?zt(t.shift,e):0;return r.style.borderRightWidth=a+"em",r.style.borderTopWidth=n+"em",r.style.bottom=o+"em",r.width=a,r.height=n+o,r.depth=-o,r.maxFontSize=1.125*n*e.sizeMultiplier,r},mathmlBuilder:function(t,e){var r=zt(t.width,e),a=zt(t.height,e),n=t.shift?zt(t.shift,e):0,o=e.color&&e.getColor()||"black",i=new pe.MathNode("mspace");i.setAttribute("mathbackground",o),i.setAttribute("width",r+"em"),i.setAttribute("height",a+"em");var s=new pe.MathNode("mpadded",[i]);return n>=0?s.setAttribute("height","+"+n+"em"):(s.setAttribute("height",n+"em"),s.setAttribute("depth","+"+-n+"em")),s.setAttribute("voffset",n+"em"),s}}),$t({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=!1,o=!1,i=r[0]&&Ht(r[0],"ordgroup");if(i)for(var s="",h=0;h<i.body.length;++h){if("t"===(s=i.body[h].text))n=!0;else{if("b"!==s){n=!1,o=!1;break}o=!0}}else n=!0,o=!0;var l=e[0];return{type:"smash",mode:a.mode,body:l,smashHeight:n,smashDepth:o}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var a=0;a<r.children.length;a++)r.children[a].height=0;if(t.smashDepth&&(r.depth=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].depth=0;var o=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e);return Lt.makeSpan(["mord"],[o],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mpadded",[ye(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r}}),$t({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=r[0],o=e[0];return{type:"sqrt",mode:a.mode,body:o,index:n}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle());0===r.height&&(r.height=e.fontMetrics().xHeight),r=Lt.wrapFragment(r,e);var a=e.fontMetrics().defaultRuleThickness,n=a;e.style.id<w.TEXT.id&&(n=e.fontMetrics().xHeight);var o=a+n/4,i=r.height+r.depth+o+a,s=Qe(i,e),h=s.span,l=s.ruleWidth,m=s.advanceWidth,c=h.height-l;c>r.height+r.depth+o&&(o=(o+c-r.height-r.depth)/2);var u=h.height-r.height-o-l;r.style.paddingLeft=m+"em";var d=Lt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:h},{type:"kern",size:l}]},e);if(t.index){var p=e.havingStyle(w.SCRIPTSCRIPT),f=he(t.index,p,e),g=.6*(d.height-d.depth),x=Lt.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},e),v=Lt.makeSpan(["root"],[x]);return Lt.makeSpan(["mord","sqrt"],[v,d],e)}return Lt.makeSpan(["mord","sqrt"],[d],e)},mathmlBuilder:function(t,e){var r=t.body,a=t.index;return a?new pe.MathNode("mroot",[ye(r,e),ye(a,e)]):new pe.MathNode("msqrt",[ye(r,e)])}});var Vr={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};$t({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!0,r),i=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:i,body:o}},htmlBuilder:function(t,e){var r=Vr[t.style],a=e.havingStyle(r).withFont("");return Pr(t.body,a,e)},mathmlBuilder:function(t,e){var r={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT}[t.style],a=e.havingStyle(r),n=ve(t.body,a),o=new pe.MathNode("mstyle",n),i={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[t.style];return o.setAttribute("scriptlevel",i[0]),o.setAttribute("displaystyle",i[1]),o}});Zt({type:"supsub",htmlBuilder:function(t,e){var r=function(t,e){var r=t.base;return r?"op"===r.type?r.limits&&(e.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?Er:null:"accent"===r.type?c.isCharacterBox(r.base)?Ce:null:"horizBrace"===r.type&&!t.sub===r.isOver?Nr:null:null}(t,e);if(r)return r(t,e);var a,n,o,i=t.base,s=t.sup,h=t.sub,l=he(i,e),m=e.fontMetrics(),u=0,d=0,p=i&&c.isCharacterBox(i);if(s){var f=e.havingStyle(e.style.sup());a=he(s,f,e),p||(u=l.height-f.fontMetrics().supDrop*f.sizeMultiplier/e.sizeMultiplier)}if(h){var g=e.havingStyle(e.style.sub());n=he(h,g,e),p||(d=l.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}o=e.style===w.DISPLAY?m.sup1:e.style.cramped?m.sup3:m.sup2;var x,v=e.sizeMultiplier,b=.5/m.ptPerEm/v+"em",y=null;if(n){var k=t.base&&"op"===t.base.type&&t.base.name&&("\\oiint"===t.base.name||"\\oiiint"===t.base.name);(l instanceof E||k)&&(y=-l.italic+"em")}if(a&&n){u=Math.max(u,o,a.depth+.25*m.xHeight),d=Math.max(d,m.sub2);var S=4*m.defaultRuleThickness;if(u-a.depth-(n.height-d)<S){d=S-(u-a.depth)+n.height;var z=.8*m.xHeight-(u-a.depth);z>0&&(u+=z,d-=z)}var M=[{type:"elem",elem:n,shift:d,marginRight:b,marginLeft:y},{type:"elem",elem:a,shift:-u,marginRight:b}];x=Lt.makeVList({positionType:"individualShift",children:M},e)}else if(n){d=Math.max(d,m.sub1,n.height-.8*m.xHeight);var T=[{type:"elem",elem:n,marginLeft:y,marginRight:b}];x=Lt.makeVList({positionType:"shift",positionData:d,children:T},e)}else{if(!a)throw new Error("supsub must have either sup or sub.");u=Math.max(u,o,a.depth+.25*m.xHeight),x=Lt.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:a,marginRight:b}]},e)}var A=ie(l,"right")||"mord";return Lt.makeSpan([A],[l,Lt.makeSpan(["msupsub"],[x])],e)},mathmlBuilder:function(t,e){var r,a=!1,n=Pt(t.base,"horizBrace");n&&!!t.sup===n.isOver&&(a=!0,r=n.isOver),t.base&&"op"===t.base.type&&(t.base.parentIsSupSub=!0);var o,i=[ye(t.base,e)];if(t.sub&&i.push(ye(t.sub,e)),t.sup&&i.push(ye(t.sup,e)),a)o=r?"mover":"munder";else if(t.sub)if(t.sup){var s=t.base;o=s&&"op"===s.type&&s.limits&&e.style===w.DISPLAY?"munderover":"msubsup"}else{var h=t.base;o=h&&"op"===h.type&&h.limits&&(e.style===w.DISPLAY||h.alwaysHandleSupSub)?"munder":"msub"}else{var l=t.base;o=l&&"op"===l.type&&l.limits&&(e.style===w.DISPLAY||l.alwaysHandleSupSub)?"mover":"msup"}return new pe.MathNode(o,i)}}),Zt({type:"atom",htmlBuilder:function(t,e){return Lt.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder:function(t,e){var r=new pe.MathNode("mo",[fe(t.text,t.mode)]);if("bin"===t.family){var a=xe(t,e);"bold-italic"===a&&r.setAttribute("mathvariant",a)}else"punct"===t.family?r.setAttribute("separator","true"):"open"!==t.family&&"close"!==t.family||r.setAttribute("stretchy","false");return r}});var Ur={mi:"italic",mn:"normal",mtext:"normal"};Zt({type:"mathord",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,"mathord")},mathmlBuilder:function(t,e){var r=new pe.MathNode("mi",[fe(t.text,t.mode,e)]),a=xe(t,e)||"italic";return a!==Ur[r.type]&&r.setAttribute("mathvariant",a),r}}),Zt({type:"textord",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,"textord")},mathmlBuilder:function(t,e){var r,a=fe(t.text,t.mode,e),n=xe(t,e)||"normal";return r="text"===t.mode?new pe.MathNode("mtext",[a]):/[0-9]/.test(t.text)?new pe.MathNode("mn",[a]):"\\prime"===t.text?new pe.MathNode("mo",[a]):new pe.MathNode("mi",[a]),n!==Ur[r.type]&&r.setAttribute("mathvariant",n),r}});var Gr={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Xr={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};Zt({type:"spacing",htmlBuilder:function(t,e){if(Xr.hasOwnProperty(t.text)){var r=Xr[t.text].className||"";if("text"===t.mode){var a=Lt.makeOrd(t,e,"textord");return a.classes.push(r),a}return Lt.makeSpan(["mspace",r],[Lt.mathsym(t.text,t.mode,e)],e)}if(Gr.hasOwnProperty(t.text))return Lt.makeSpan(["mspace",Gr[t.text]],[],e);throw new i('Unknown type of space "'+t.text+'"')},mathmlBuilder:function(t,e){if(!Xr.hasOwnProperty(t.text)){if(Gr.hasOwnProperty(t.text))return new pe.MathNode("mspace");throw new i('Unknown type of space "'+t.text+'"')}return new pe.MathNode("mtext",[new pe.TextNode("\xa0")])}});var Yr=function(){var t=new pe.MathNode("mtd",[]);return t.setAttribute("width","50%"),t};Zt({type:"tag",mathmlBuilder:function(t,e){var r=new pe.MathNode("mtable",[new pe.MathNode("mtr",[Yr(),new pe.MathNode("mtd",[be(t.body,e)]),Yr(),new pe.MathNode("mtd",[be(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});var _r={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Wr={"\\textbf":"textbf","\\textmd":"textmd"},jr={"\\textit":"textit","\\textup":"textup"},$r=function(t,e){var r=t.font;return r?_r[r]?e.withTextFontFamily(_r[r]):Wr[r]?e.withTextFontWeight(Wr[r]):e.withTextFontShape(jr[r]):e};$t({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],greediness:2,allowedInText:!0,consumeMode:"text"},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"text",mode:r.mode,body:Kt(n),font:a}},htmlBuilder:function(t,e){var r=$r(t,e),a=ae(t.body,r,!0);return Lt.makeSpan(["mord","text"],Lt.tryCombineChars(a),r)},mathmlBuilder:function(t,e){var r=$r(t,e);return be(t.body,r)}}),$t({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){return{type:"underline",mode:t.parser.mode,body:e[0]}},htmlBuilder:function(t,e){var r=he(t.body,e),a=Lt.makeLineSpan("underline-line",e),n=Lt.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:a.height},{type:"elem",elem:a},{type:"kern",size:3*a.height},{type:"elem",elem:r}]},e);return Lt.makeSpan(["mord","underline"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode("mo",[new pe.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new pe.MathNode("munder",[ye(t.body,e),r]);return a.setAttribute("accentunder","true"),a}}),$t({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(t,e,r){throw new i("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(t,e){for(var r=Zr(t),a=[],n=e.havingStyle(e.style.text()),o=0;o<r.length;o++){var i=r[o];"~"===i&&(i="\\textasciitilde"),a.push(Lt.makeSymbol(i,"Typewriter-Regular",t.mode,n,["mord","texttt"]))}return Lt.makeSpan(["mord","text"].concat(n.sizingClasses(e)),Lt.tryCombineChars(a),n)},mathmlBuilder:function(t,e){var r=new pe.TextNode(Zr(t)),a=new pe.MathNode("mtext",[r]);return a.setAttribute("mathvariant","monospace"),a}});var Zr=function(t){return t.body.replace(/ /g,t.star?"\u2423":"\xa0")},Kr=_t,Jr=new RegExp("^(\\\\[a-zA-Z@]+)[ \r\n\t]*$"),Qr=new RegExp("[\u0300-\u036f]+$"),ta="([ \r\n\t]+)|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff][\u0300-\u036f]*|[\ud800-\udbff][\udc00-\udfff][\u0300-\u036f]*|\\\\verb\\*([^]).*?\\3|\\\\verb([^*a-zA-Z]).*?\\4|\\\\[a-zA-Z@]+[ \r\n\t]*|\\\\[^\ud800-\udfff])",ea=function(){function t(t,e){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=t,this.settings=e,this.tokenRegex=new RegExp(ta,"g"),this.catcodes={"%":14}}var e=t.prototype;return e.setCatcode=function(t,e){this.catcodes[t]=e},e.lex=function(){var t=this.input,e=this.tokenRegex.lastIndex;if(e===t.length)return new n("EOF",new a(this,e,e));var r=this.tokenRegex.exec(t);if(null===r||r.index!==e)throw new i("Unexpected character: '"+t[e]+"'",new n(t[e],new a(this,e,e+1)));var o=r[2]||" ";if(14===this.catcodes[o]){var s=t.indexOf("\n",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=t.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}var h=o.match(Jr);return h&&(o=h[1]),new n(o,new a(this,e,this.tokenRegex.lastIndex))},t}(),ra=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=e,this.builtins=t,this.undefStack=[]}var e=t.prototype;return e.beginGroup=function(){this.undefStack.push({})},e.endGroup=function(){if(0===this.undefStack.length)throw new i("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var t=this.undefStack.pop();for(var e in t)t.hasOwnProperty(e)&&(void 0===t[e]?delete this.current[e]:this.current[e]=t[e])},e.has=function(t){return this.current.hasOwnProperty(t)||this.builtins.hasOwnProperty(t)},e.get=function(t){return this.current.hasOwnProperty(t)?this.current[t]:this.builtins[t]},e.set=function(t,e,r){if(void 0===r&&(r=!1),r){for(var a=0;a<this.undefStack.length;a++)delete this.undefStack[a][t];this.undefStack.length>0&&(this.undefStack[this.undefStack.length-1][t]=e)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(t)&&(n[t]=this.current[t])}this.current[t]=e},t}(),aa={},na=aa;function oa(t,e){aa[t]=e}oa("\\@firstoftwo",function(t){return{tokens:t.consumeArgs(2)[0],numArgs:0}}),oa("\\@secondoftwo",function(t){return{tokens:t.consumeArgs(2)[1],numArgs:0}}),oa("\\@ifnextchar",function(t){var e=t.consumeArgs(3),r=t.future();return 1===e[0].length&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}}),oa("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),oa("\\TextOrMath",function(t){var e=t.consumeArgs(2);return"text"===t.mode?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var ia={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};oa("\\char",function(t){var e,r=t.popToken(),a="";if("'"===r.text)e=8,r=t.popToken();else if('"'===r.text)e=16,r=t.popToken();else if("`"===r.text)if("\\"===(r=t.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new i("\\char` missing argument");a=r.text.charCodeAt(0)}else e=10;if(e){if(null==(a=ia[r.text])||a>=e)throw new i("Invalid base-"+e+" digit "+r.text);for(var n;null!=(n=ia[t.future().text])&&n<e;)a*=e,a+=n,t.popToken()}return"\\@char{"+a+"}"});var sa=function(t,e){var r=t.consumeArgs(1)[0];if(1!==r.length)throw new i("\\gdef's first argument must be a macro name");var a=r[0].text,n=0;for(r=t.consumeArgs(1)[0];1===r.length&&"#"===r[0].text;){if(1!==(r=t.consumeArgs(1)[0]).length)throw new i('Invalid argument number length "'+r.length+'"');if(!/^[1-9]$/.test(r[0].text))throw new i('Invalid argument number "'+r[0].text+'"');if(n++,parseInt(r[0].text)!==n)throw new i('Argument number "'+r[0].text+'" out of order');r=t.consumeArgs(1)[0]}return t.macros.set(a,{tokens:r,numArgs:n},e),""};oa("\\gdef",function(t){return sa(t,!0)}),oa("\\def",function(t){return sa(t,!1)}),oa("\\global",function(t){var e=t.consumeArgs(1)[0];if(1!==e.length)throw new i("Invalid command after \\global");var r=e[0].text;if("\\def"===r)return sa(t,!0);throw new i("Invalid command '"+r+"' after \\global")});var ha=function(t,e,r){var a=t.consumeArgs(1)[0];if(1!==a.length)throw new i("\\newcommand's first argument must be a macro name");var n=a[0].text,o=t.isDefined(n);if(o&&!e)throw new i("\\newcommand{"+n+"} attempting to redefine "+n+"; use \\renewcommand");if(!o&&!r)throw new i("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var s=0;if(1===(a=t.consumeArgs(1)[0]).length&&"["===a[0].text){for(var h="",l=t.expandNextToken();"]"!==l.text&&"EOF"!==l.text;)h+=l.text,l=t.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new i("Invalid number of arguments: "+h);s=parseInt(h),a=t.consumeArgs(1)[0]}return t.macros.set(n,{tokens:a,numArgs:s}),""};oa("\\newcommand",function(t){return ha(t,!1,!0)}),oa("\\renewcommand",function(t){return ha(t,!0,!1)}),oa("\\providecommand",function(t){return ha(t,!0,!0)}),oa("\\bgroup","{"),oa("\\egroup","}"),oa("\\lq","`"),oa("\\rq","'"),oa("\\aa","\\r a"),oa("\\AA","\\r A"),oa("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),oa("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),oa("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),oa("\u212c","\\mathscr{B}"),oa("\u2130","\\mathscr{E}"),oa("\u2131","\\mathscr{F}"),oa("\u210b","\\mathscr{H}"),oa("\u2110","\\mathscr{I}"),oa("\u2112","\\mathscr{L}"),oa("\u2133","\\mathscr{M}"),oa("\u211b","\\mathscr{R}"),oa("\u212d","\\mathfrak{C}"),oa("\u210c","\\mathfrak{H}"),oa("\u2128","\\mathfrak{Z}"),oa("\\Bbbk","\\Bbb{k}"),oa("\xb7","\\cdotp"),oa("\\llap","\\mathllap{\\textrm{#1}}"),oa("\\rlap","\\mathrlap{\\textrm{#1}}"),oa("\\clap","\\mathclap{\\textrm{#1}}"),oa("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),oa("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),oa("\\ne","\\neq"),oa("\u2260","\\neq"),oa("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),oa("\u2209","\\notin"),oa("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),oa("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),oa("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),oa("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),oa("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),oa("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),oa("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),oa("\u27c2","\\perp"),oa("\u203c","\\mathclose{!\\mkern-0.8mu!}"),oa("\u220c","\\notni"),oa("\u231c","\\ulcorner"),oa("\u231d","\\urcorner"),oa("\u231e","\\llcorner"),oa("\u231f","\\lrcorner"),oa("\xa9","\\copyright"),oa("\xae","\\textregistered"),oa("\ufe0f","\\textregistered"),oa("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),oa("\u22ee","\\vdots"),oa("\\varGamma","\\mathit{\\Gamma}"),oa("\\varDelta","\\mathit{\\Delta}"),oa("\\varTheta","\\mathit{\\Theta}"),oa("\\varLambda","\\mathit{\\Lambda}"),oa("\\varXi","\\mathit{\\Xi}"),oa("\\varPi","\\mathit{\\Pi}"),oa("\\varSigma","\\mathit{\\Sigma}"),oa("\\varUpsilon","\\mathit{\\Upsilon}"),oa("\\varPhi","\\mathit{\\Phi}"),oa("\\varPsi","\\mathit{\\Psi}"),oa("\\varOmega","\\mathit{\\Omega}"),oa("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"),oa("\\boxed","\\fbox{$\\displaystyle{#1}$}"),oa("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),oa("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),oa("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");var la={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};oa("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in la?e=la[r]:"\\not"===r.substr(0,4)?e="\\dotsb":r in _.math&&c.contains(["bin","rel"],_.math[r].group)&&(e="\\dotsb"),e});var ma={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};oa("\\dotso",function(t){return t.future().text in ma?"\\ldots\\,":"\\ldots"}),oa("\\dotsc",function(t){var e=t.future().text;return e in ma&&","!==e?"\\ldots\\,":"\\ldots"}),oa("\\cdots",function(t){return t.future().text in ma?"\\@cdots\\,":"\\@cdots"}),oa("\\dotsb","\\cdots"),oa("\\dotsm","\\cdots"),oa("\\dotsi","\\!\\cdots"),oa("\\dotsx","\\ldots\\,"),oa("\\DOTSI","\\relax"),oa("\\DOTSB","\\relax"),oa("\\DOTSX","\\relax"),oa("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),oa("\\,","\\tmspace+{3mu}{.1667em}"),oa("\\thinspace","\\,"),oa("\\>","\\mskip{4mu}"),oa("\\:","\\tmspace+{4mu}{.2222em}"),oa("\\medspace","\\:"),oa("\\;","\\tmspace+{5mu}{.2777em}"),oa("\\thickspace","\\;"),oa("\\!","\\tmspace-{3mu}{.1667em}"),oa("\\negthinspace","\\!"),oa("\\negmedspace","\\tmspace-{4mu}{.2222em}"),oa("\\negthickspace","\\tmspace-{5mu}{.277em}"),oa("\\enspace","\\kern.5em "),oa("\\enskip","\\hskip.5em\\relax"),oa("\\quad","\\hskip1em\\relax"),oa("\\qquad","\\hskip2em\\relax"),oa("\\tag","\\@ifstar\\tag@literal\\tag@paren"),oa("\\tag@paren","\\tag@literal{({#1})}"),oa("\\tag@literal",function(t){if(t.macros.get("\\df@tag"))throw new i("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),oa("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),oa("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),oa("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),oa("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),oa("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\mathrlap{\\mkern0.4mu\\raisebox{0.4mu}{$#1$}}{\\mkern0.8mu#1}}}{\\mathbf{#1}}"),oa("\\\\","\\newline"),oa("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var ca=P["Main-Regular"]["T".charCodeAt(0)][1]-.7*P["Main-Regular"]["A".charCodeAt(0)][1]+"em";oa("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+ca+"}{\\scriptsize A}\\kern-.15em\\TeX}{LaTeX}}"),oa("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+ca+"}{\\scriptsize A}\\kern-.15em\\TeX}{KaTeX}}"),oa("\\hspace","\\@ifstar\\@hspacer\\@hspace"),oa("\\@hspace","\\hskip #1\\relax"),oa("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),oa("\\ordinarycolon",":"),oa("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),oa("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),oa("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),oa("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),oa("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),oa("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),oa("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),oa("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),oa("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),oa("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),oa("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),oa("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),oa("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),oa("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),oa("\u2237","\\dblcolon"),oa("\u2239","\\eqcolon"),oa("\u2254","\\coloneqq"),oa("\u2255","\\eqqcolon"),oa("\u2a74","\\Coloneqq"),oa("\\ratio","\\vcentcolon"),oa("\\coloncolon","\\dblcolon"),oa("\\colonequals","\\coloneqq"),oa("\\coloncolonequals","\\Coloneqq"),oa("\\equalscolon","\\eqqcolon"),oa("\\equalscoloncolon","\\Eqqcolon"),oa("\\colonminus","\\coloneq"),oa("\\coloncolonminus","\\Coloneq"),oa("\\minuscolon","\\eqcolon"),oa("\\minuscoloncolon","\\Eqcolon"),oa("\\coloncolonapprox","\\Colonapprox"),oa("\\coloncolonsim","\\Colonsim"),oa("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),oa("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),oa("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),oa("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),oa("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),oa("\\limsup","\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"),oa("\\liminf","\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"),oa("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),oa("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),oa("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),oa("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),oa("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),oa("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),oa("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),oa("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),oa("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),oa("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),oa("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),oa("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),oa("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),oa("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),oa("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),oa("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),oa("\u27e6","\\llbracket"),oa("\u27e7","\\rrbracket"),oa("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),oa("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),oa("\u2983","\\lBrace"),oa("\u2984","\\rBrace"),oa("\\darr","\\downarrow"),oa("\\dArr","\\Downarrow"),oa("\\Darr","\\Downarrow"),oa("\\lang","\\langle"),oa("\\rang","\\rangle"),oa("\\uarr","\\uparrow"),oa("\\uArr","\\Uparrow"),oa("\\Uarr","\\Uparrow"),oa("\\N","\\mathbb{N}"),oa("\\R","\\mathbb{R}"),oa("\\Z","\\mathbb{Z}"),oa("\\alef","\\aleph"),oa("\\alefsym","\\aleph"),oa("\\Alpha","\\mathrm{A}"),oa("\\Beta","\\mathrm{B}"),oa("\\bull","\\bullet"),oa("\\Chi","\\mathrm{X}"),oa("\\clubs","\\clubsuit"),oa("\\cnums","\\mathbb{C}"),oa("\\Complex","\\mathbb{C}"),oa("\\Dagger","\\ddagger"),oa("\\diamonds","\\diamondsuit"),oa("\\empty","\\emptyset"),oa("\\Epsilon","\\mathrm{E}"),oa("\\Eta","\\mathrm{H}"),oa("\\exist","\\exists"),oa("\\harr","\\leftrightarrow"),oa("\\hArr","\\Leftrightarrow"),oa("\\Harr","\\Leftrightarrow"),oa("\\hearts","\\heartsuit"),oa("\\image","\\Im"),oa("\\infin","\\infty"),oa("\\Iota","\\mathrm{I}"),oa("\\isin","\\in"),oa("\\Kappa","\\mathrm{K}"),oa("\\larr","\\leftarrow"),oa("\\lArr","\\Leftarrow"),oa("\\Larr","\\Leftarrow"),oa("\\lrarr","\\leftrightarrow"),oa("\\lrArr","\\Leftrightarrow"),oa("\\Lrarr","\\Leftrightarrow"),oa("\\Mu","\\mathrm{M}"),oa("\\natnums","\\mathbb{N}"),oa("\\Nu","\\mathrm{N}"),oa("\\Omicron","\\mathrm{O}"),oa("\\plusmn","\\pm"),oa("\\rarr","\\rightarrow"),oa("\\rArr","\\Rightarrow"),oa("\\Rarr","\\Rightarrow"),oa("\\real","\\Re"),oa("\\reals","\\mathbb{R}"),oa("\\Reals","\\mathbb{R}"),oa("\\Rho","\\mathrm{P}"),oa("\\sdot","\\cdot"),oa("\\sect","\\S"),oa("\\spades","\\spadesuit"),oa("\\sub","\\subset"),oa("\\sube","\\subseteq"),oa("\\supe","\\supseteq"),oa("\\Tau","\\mathrm{T}"),oa("\\thetasym","\\vartheta"),oa("\\weierp","\\wp"),oa("\\Zeta","\\mathrm{Z}"),oa("\\argmin","\\DOTSB\\mathop{\\operatorname{arg\\,min}}\\limits"),oa("\\argmax","\\DOTSB\\mathop{\\operatorname{arg\\,max}}\\limits"),oa("\\blue","\\textcolor{##6495ed}{#1}"),oa("\\orange","\\textcolor{##ffa500}{#1}"),oa("\\pink","\\textcolor{##ff00af}{#1}"),oa("\\red","\\textcolor{##df0030}{#1}"),oa("\\green","\\textcolor{##28ae7b}{#1}"),oa("\\gray","\\textcolor{gray}{##1}"),oa("\\purple","\\textcolor{##9d38bd}{#1}"),oa("\\blueA","\\textcolor{##ccfaff}{#1}"),oa("\\blueB","\\textcolor{##80f6ff}{#1}"),oa("\\blueC","\\textcolor{##63d9ea}{#1}"),oa("\\blueD","\\textcolor{##11accd}{#1}"),oa("\\blueE","\\textcolor{##0c7f99}{#1}"),oa("\\tealA","\\textcolor{##94fff5}{#1}"),oa("\\tealB","\\textcolor{##26edd5}{#1}"),oa("\\tealC","\\textcolor{##01d1c1}{#1}"),oa("\\tealD","\\textcolor{##01a995}{#1}"),oa("\\tealE","\\textcolor{##208170}{#1}"),oa("\\greenA","\\textcolor{##b6ffb0}{#1}"),oa("\\greenB","\\textcolor{##8af281}{#1}"),oa("\\greenC","\\textcolor{##74cf70}{#1}"),oa("\\greenD","\\textcolor{##1fab54}{#1}"),oa("\\greenE","\\textcolor{##0d923f}{#1}"),oa("\\goldA","\\textcolor{##ffd0a9}{#1}"),oa("\\goldB","\\textcolor{##ffbb71}{#1}"),oa("\\goldC","\\textcolor{##ff9c39}{#1}"),oa("\\goldD","\\textcolor{##e07d10}{#1}"),oa("\\goldE","\\textcolor{##a75a05}{#1}"),oa("\\redA","\\textcolor{##fca9a9}{#1}"),oa("\\redB","\\textcolor{##ff8482}{#1}"),oa("\\redC","\\textcolor{##f9685d}{#1}"),oa("\\redD","\\textcolor{##e84d39}{#1}"),oa("\\redE","\\textcolor{##bc2612}{#1}"),oa("\\maroonA","\\textcolor{##ffbde0}{#1}"),oa("\\maroonB","\\textcolor{##ff92c6}{#1}"),oa("\\maroonC","\\textcolor{##ed5fa6}{#1}"),oa("\\maroonD","\\textcolor{##ca337c}{#1}"),oa("\\maroonE","\\textcolor{##9e034e}{#1}"),oa("\\purpleA","\\textcolor{##ddd7ff}{#1}"),oa("\\purpleB","\\textcolor{##c6b9fc}{#1}"),oa("\\purpleC","\\textcolor{##aa87ff}{#1}"),oa("\\purpleD","\\textcolor{##7854ab}{#1}"),oa("\\purpleE","\\textcolor{##543b78}{#1}"),oa("\\mintA","\\textcolor{##f5f9e8}{#1}"),oa("\\mintB","\\textcolor{##edf2df}{#1}"),oa("\\mintC","\\textcolor{##e0e5cc}{#1}"),oa("\\grayA","\\textcolor{##f6f7f7}{#1}"),oa("\\grayB","\\textcolor{##f0f1f2}{#1}"),oa("\\grayC","\\textcolor{##e3e5e6}{#1}"),oa("\\grayD","\\textcolor{##d6d8da}{#1}"),oa("\\grayE","\\textcolor{##babec2}{#1}"),oa("\\grayF","\\textcolor{##888d93}{#1}"),oa("\\grayG","\\textcolor{##626569}{#1}"),oa("\\grayH","\\textcolor{##3b3e40}{#1}"),oa("\\grayI","\\textcolor{##21242c}{#1}"),oa("\\kaBlue","\\textcolor{##314453}{#1}"),oa("\\kaGreen","\\textcolor{##71B307}{#1}");var ua={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},da=function(){function t(t,e,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=e,this.expansionCount=0,this.feed(t),this.macros=new ra(na,e.macros),this.mode=r,this.stack=[]}var e=t.prototype;return e.feed=function(t){this.lexer=new ea(t,this.settings)},e.switchMode=function(t){this.mode=t},e.beginGroup=function(){this.macros.beginGroup()},e.endGroup=function(){this.macros.endGroup()},e.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},e.popToken=function(){return this.future(),this.stack.pop()},e.pushToken=function(t){this.stack.push(t)},e.pushTokens=function(t){var e;(e=this.stack).push.apply(e,t)},e.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},e.consumeArgs=function(t){for(var e=[],r=0;r<t;++r){this.consumeSpaces();var a=this.popToken();if("{"===a.text){for(var n=[],o=1;0!==o;){var s=this.popToken();if(n.push(s),"{"===s.text)++o;else if("}"===s.text)--o;else if("EOF"===s.text)throw new i("End of input in macro argument",a)}n.pop(),n.reverse(),e[r]=n}else{if("EOF"===a.text)throw new i("End of input expecting macro argument");e[r]=[a]}}return e},e.expandOnce=function(){var t=this.popToken(),e=t.text,r=this._getExpansion(e);if(null==r)return this.pushToken(t),t;if(this.expansionCount++,this.expansionCount>this.settings.maxExpand)throw new i("Too many expansions: infinite loop or need to increase maxExpand setting");var a=r.tokens;if(r.numArgs)for(var n=this.consumeArgs(r.numArgs),o=(a=a.slice()).length-1;o>=0;--o){var s=a[o];if("#"===s.text){if(0===o)throw new i("Incomplete placeholder at end of macro body",s);if("#"===(s=a[--o]).text)a.splice(o+1,1);else{if(!/^[1-9]$/.test(s.text))throw new i("Not a valid argument number",s);var h;(h=a).splice.apply(h,[o,2].concat(n[+s.text-1]))}}}return this.pushTokens(a),a},e.expandAfterFuture=function(){return this.expandOnce(),this.future()},e.expandNextToken=function(){for(;;){var t=this.expandOnce();if(t instanceof n){if("\\relax"!==t.text)return this.stack.pop();this.stack.pop()}}throw new Error},e.expandMacro=function(t){if(this.macros.get(t)){var e=[],r=this.stack.length;for(this.pushToken(new n(t));this.stack.length>r;){this.expandOnce()instanceof n&&e.push(this.stack.pop())}return e}},e.expandMacroAsText=function(t){var e=this.expandMacro(t);return e?e.map(function(t){return t.text}).join(""):e},e._getExpansion=function(t){var e=this.macros.get(t);if(null==e)return e;var r="function"==typeof e?e(this):e;if("string"==typeof r){var a=0;if(-1!==r.indexOf("#"))for(var n=r.replace(/##/g,"");-1!==n.indexOf("#"+(a+1));)++a;for(var o=new ea(r,this.settings),i=[],s=o.lex();"EOF"!==s.text;)i.push(s),s=o.lex();return i.reverse(),{tokens:i,numArgs:a}}return r},e.isDefined=function(t){return this.macros.has(t)||Kr.hasOwnProperty(t)||_.math.hasOwnProperty(t)||_.text.hasOwnProperty(t)||ua.hasOwnProperty(t)},t}(),pa={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"}},fa={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\u010f":"d\u030c","\u1e0b":"d\u0307","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u013a":"l\u0301","\u013e":"l\u030c","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\u010e":"D\u030c","\u1e0a":"D\u0307","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0139":"L\u0301","\u013d":"L\u030c","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u0164":"T\u030c","\u1e6a":"T\u0307","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},ga=function(){function t(t,e){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new da(t,e,this.mode),this.settings=e,this.leftrightDepth=0}var e=t.prototype;return e.expect=function(t,e){if(void 0===e&&(e=!0),this.nextToken.text!==t)throw new i("Expected '"+t+"', got '"+this.nextToken.text+"'",this.nextToken);e&&this.consume()},e.consume=function(){this.nextToken=this.gullet.expandNextToken()},e.switchMode=function(t){this.mode=t,this.gullet.switchMode(t)},e.parse=function(){this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor"),this.consume();var t=this.parseExpression(!1);return this.expect("EOF",!1),this.gullet.endGroup(),t},e.parseExpression=function(e,r){for(var a=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.nextToken;if(-1!==t.endOfExpression.indexOf(n.text))break;if(r&&n.text===r)break;if(e&&Kr[n.text]&&Kr[n.text].infix)break;var o=this.parseAtom(r);if(!o)break;a.push(o)}return"text"===this.mode&&this.formLigatures(a),this.handleInfixNodes(a)},e.handleInfixNodes=function(t){for(var e,r=-1,a=0;a<t.length;a++){var n=Pt(t[a],"infix");if(n){if(-1!==r)throw new i("only one infix operator per group",n.token);r=a,e=n.replaceWith}}if(-1!==r&&e){var o,s,h=t.slice(0,r),l=t.slice(r+1);return o=1===h.length&&"ordgroup"===h[0].type?h[0]:{type:"ordgroup",mode:this.mode,body:h},s=1===l.length&&"ordgroup"===l[0].type?l[0]:{type:"ordgroup",mode:this.mode,body:l},["\\\\abovefrac"===e?this.callFunction(e,[o,t[r],s],[]):this.callFunction(e,[o,s],[])]}return t},e.handleSupSubscript=function(e){var r=this.nextToken,a=r.text;this.consume(),this.consumeSpaces();var n=this.parseGroup(e,!1,t.SUPSUB_GREEDINESS);if(!n)throw new i("Expected group after '"+a+"'",r);return n},e.handleUnsupportedCmd=function(){for(var t=this.nextToken.text,e=[],r=0;r<t.length;r++)e.push({type:"textord",mode:"text",text:t[r]});var a={type:"text",mode:this.mode,body:e},n={type:"color",mode:this.mode,color:this.settings.errorColor,body:[a]};return this.consume(),n},e.parseAtom=function(t){var e,r,a=this.parseGroup("atom",!1,null,t);if("text"===this.mode)return a;for(;;){this.consumeSpaces();var n=this.nextToken;if("\\limits"===n.text||"\\nolimits"===n.text){var o=Pt(a,"op");if(!o)throw new i("Limit controls must follow a math operator",n);var s="\\limits"===n.text;o.limits=s,o.alwaysHandleSupSub=!0,this.consume()}else if("^"===n.text){if(e)throw new i("Double superscript",n);e=this.handleSupSubscript("superscript")}else if("_"===n.text){if(r)throw new i("Double subscript",n);r=this.handleSupSubscript("subscript")}else{if("'"!==n.text)break;if(e)throw new i("Double superscript",n);var h={type:"textord",mode:this.mode,text:"\\prime"},l=[h];for(this.consume();"'"===this.nextToken.text;)l.push(h),this.consume();"^"===this.nextToken.text&&l.push(this.handleSupSubscript("superscript")),e={type:"ordgroup",mode:this.mode,body:l}}}return e||r?{type:"supsub",mode:this.mode,base:a,sup:e,sub:r}:a},e.parseFunction=function(t,e,r){var a=this.nextToken,n=a.text,o=Kr[n];if(!o)return null;if(null!=r&&o.greediness<=r)throw new i("Got function '"+n+"' with no arguments"+(e?" as "+e:""),a);if("text"===this.mode&&!o.allowedInText)throw new i("Can't use function '"+n+"' in text mode",a);if("math"===this.mode&&!1===o.allowedInMath)throw new i("Can't use function '"+n+"' in math mode",a);if(o.argTypes&&"url"===o.argTypes[0]&&this.gullet.lexer.setCatcode("%",13),o.consumeMode){var s=this.mode;this.switchMode(o.consumeMode),this.consume(),this.switchMode(s)}else this.consume();var h=this.parseArguments(n,o),l=h.args,m=h.optArgs;return this.callFunction(n,l,m,a,t)},e.callFunction=function(t,e,r,a,n){var o={funcName:t,parser:this,token:a,breakOnTokenText:n},s=Kr[t];if(s&&s.handler)return s.handler(o,e,r);throw new i("No function handler for "+t)},e.parseArguments=function(t,e){var r=e.numArgs+e.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var a=e.greediness,n=[],o=[],s=0;s<r;s++){var h=e.argTypes&&e.argTypes[s],l=s<e.numOptionalArgs;s>0&&!l&&this.consumeSpaces(),0!==s||l||"math"!==this.mode||this.consumeSpaces();var m=this.nextToken,c=this.parseGroupOfType("argument to '"+t+"'",h,l,a);if(!c){if(l){o.push(null);continue}throw new i("Expected group after '"+t+"'",m)}(l?o:n).push(c)}return{args:n,optArgs:o}},e.parseGroupOfType=function(t,e,r,a){switch(e){case"color":return this.parseColorGroup(r);case"size":return this.parseSizeGroup(r);case"url":return this.parseUrlGroup(r);case"math":case"text":return this.parseGroup(t,r,a,void 0,e);case"raw":if(r&&"{"===this.nextToken.text)return null;var n=this.parseStringGroup("raw",r,!0);if(n)return{type:"raw",mode:"text",string:n.text};throw new i("Expected raw group",this.nextToken);case"original":case null:case void 0:return this.parseGroup(t,r,a);default:throw new i("Unknown group type as "+t,this.nextToken)}},e.consumeSpaces=function(){for(;" "===this.nextToken.text;)this.consume()},e.parseStringGroup=function(t,e,r){var a=e?"[":"{",n=e?"]":"}",o=this.nextToken;if(o.text!==a){if(e)return null;if(r&&"EOF"!==o.text&&/[^{}[\]]/.test(o.text))return this.gullet.lexer.setCatcode("%",14),this.consume(),o}var s=this.mode;this.mode="text",this.expect(a);for(var h="",l=this.nextToken,m=0,c=l;r&&m>0||this.nextToken.text!==n;){switch(this.nextToken.text){case"EOF":throw new i("Unexpected end of input in "+t,l.range(c,h));case a:m++;break;case n:m--}h+=(c=this.nextToken).text,this.consume()}return this.mode=s,this.gullet.lexer.setCatcode("%",14),this.expect(n),l.range(c,h)},e.parseRegexGroup=function(t,e){var r=this.mode;this.mode="text";for(var a=this.nextToken,n=a,o="";"EOF"!==this.nextToken.text&&t.test(o+this.nextToken.text);)o+=(n=this.nextToken).text,this.consume();if(""===o)throw new i("Invalid "+e+": '"+a.text+"'",a);return this.mode=r,a.range(n,o)},e.parseColorGroup=function(t){var e=this.parseStringGroup("color",t);if(!e)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text);if(!r)throw new i("Invalid color: '"+e.text+"'",e);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a="#"+a),{type:"color-token",mode:this.mode,color:a}},e.parseSizeGroup=function(t){var e,r=!1;if(!(e=t||"{"===this.nextToken.text?this.parseStringGroup("size",t):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;t||0!==e.text.length||(e.text="0pt",r=!0);var a=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e.text);if(!a)throw new i("Invalid size: '"+e.text+"'",e);var n,o={number:+(a[1]+a[2]),unit:a[3]};if("string"!=typeof(n=o)&&(n=n.unit),!(n in kt||n in St||"ex"===n))throw new i("Invalid unit: '"+o.unit+"'",e);return{type:"size",mode:this.mode,value:o,isBlank:r}},e.parseUrlGroup=function(t){var e=this.parseStringGroup("url",t,!0);if(!e)return null;var r=e.text.replace(/\\([#$%&~_^{}])/g,"$1"),a=/^\s*([^\\\/#]*?)(?::|�*58|�*3a)/i.exec(r);a=null!=a?a[1]:"_relative";var n=this.settings.allowedProtocols;if(!c.contains(n,"*")&&!c.contains(n,a))throw new i("Forbidden protocol '"+a+"'",e);return{type:"url",mode:this.mode,url:r}},e.parseGroup=function(e,r,n,o,s){var h,l,m=this.mode,c=this.nextToken,u=c.text;if(s&&this.switchMode(s),r?"["===u:"{"===u||"\\begingroup"===u){h=t.endOfGroup[u],this.gullet.beginGroup(),this.consume();var d=this.parseExpression(!1,h),p=this.nextToken;this.gullet.endGroup(),l={type:"ordgroup",mode:this.mode,loc:a.range(c,p),body:d,semisimple:"\\begingroup"===u||void 0}}else if(r)l=null;else if(null==(l=this.parseFunction(o,e,n)||this.parseSymbol())&&"\\"===u[0]&&!ua.hasOwnProperty(u)){if(this.settings.throwOnError)throw new i("Undefined control sequence: "+u,c);l=this.handleUnsupportedCmd()}return s&&this.switchMode(m),h&&this.expect(h),l},e.formLigatures=function(t){for(var e=t.length-1,r=0;r<e;++r){var n=t[r],o=n.text;"-"===o&&"-"===t[r+1].text&&(r+1<e&&"-"===t[r+2].text?(t.splice(r,3,{type:"textord",mode:"text",loc:a.range(n,t[r+2]),text:"---"}),e-=2):(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:"--"}),e-=1)),"'"!==o&&"`"!==o||t[r+1].text!==o||(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:o+o}),e-=1)}},e.parseSymbol=function(){var t=this.nextToken,e=t.text;if(/^\\verb[^a-zA-Z]/.test(e)){this.consume();var r=e.slice(5),n="*"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new i("\\verb assertion failed --\n please report what input caused this bug");return{type:"verb",mode:"text",body:r=r.slice(1,-1),star:n}}fa.hasOwnProperty(e[0])&&!_[this.mode][e[0]]&&(this.settings.strict&&"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Accented Unicode text character "'+e[0]+'" used in math mode',t),e=fa[e[0]]+e.substr(1));var o,s=Qr.exec(e);if(s&&("i"===(e=e.substring(0,s.index))?e="\u0131":"j"===e&&(e="\u0237")),_[this.mode][e]){this.settings.strict&&"math"===this.mode&&"\xc7\xd0\xde\xe7\xfe".indexOf(e)>=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+e[0]+'" used in math mode',t);var h,l=_[this.mode][e].group,m=a.range(t);if(G.hasOwnProperty(l)){var c=l;h={type:"atom",mode:this.mode,family:c,loc:m,text:e}}else h={type:l,mode:this.mode,loc:m,text:e};o=h}else{if(!(e.charCodeAt(0)>=128))return null;this.settings.strict&&(z(e.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+e[0]+'" used in math mode',t):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+e[0]+'" ('+e.charCodeAt(0)+")",t)),o={type:"textord",mode:this.mode,loc:a.range(t),text:e}}if(this.consume(),s)for(var u=0;u<s[0].length;u++){var d=s[0][u];if(!pa[d])throw new i("Unknown accent ' "+d+"'",t);var p=pa[d][this.mode];if(!p)throw new i("Accent "+d+" unsupported in "+this.mode+" mode",t);o={type:"accent",mode:this.mode,loc:a.range(t),label:p,isStretchy:!1,isShifty:!0,base:o}}return o},t}();ga.endOfExpression=["}","\\endgroup","\\end","\\right","&"],ga.endOfGroup={"[":"]","{":"}","\\begingroup":"\\endgroup"},ga.SUPSUB_GREEDINESS=1;var xa=function(t,e){if(!("string"==typeof t||t instanceof String))throw new TypeError("KaTeX can only parse string typed expression");var r=new ga(t,e);delete r.gullet.macros.current["\\df@tag"];var a=r.parse();if(r.gullet.macros.get("\\df@tag")){if(!e.displayMode)throw new i("\\tag works only in display equations");r.gullet.feed("\\df@tag"),a=[{type:"tag",mode:"text",body:a,tag:r.parse()}]}return a},va=function(t,e,r){e.textContent="";var a=ya(t,r).toNode();e.appendChild(a)};"undefined"!=typeof document&&"CSS1Compat"!==document.compatMode&&("undefined"!=typeof console&&console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."),va=function(){throw new i("KaTeX doesn't work in quirks mode.")});var ba=function(t,e,r){if(r.throwOnError||!(t instanceof i))throw t;var a=Lt.makeSpan(["katex-error"],[new E(e)]);return a.setAttribute("title",t.toString()),a.setAttribute("style","color:"+r.errorColor),a},ya=function(t,e){var r=new u(e);try{var a=xa(t,r);return Se(a,t,r)}catch(e){return ba(e,t,r)}},wa={version:"0.10.2",render:va,renderToString:function(t,e){return ya(t,e).toMarkup()},ParseError:i,__parse:function(t,e){var r=new u(e);return xa(t,r)},__renderToDomTree:ya,__renderToHTMLTree:function(t,e){var r=new u(e);try{return function(t,e,r){var a=me(t,we(r)),n=Lt.makeSpan(["katex"],[a]);return ke(n,r)}(xa(t,r),0,r)}catch(e){return ba(e,t,r)}},__setFontMetrics:function(t,e){P[t]=e},__defineSymbol:W,__defineMacro:oa,__domTree:{Span:N,Anchor:I,SymbolNode:E,SvgNode:R,PathNode:L,LineNode:H}};e.default=wa}]).default}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.katex=e():t.katex=e()}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(a,n,function(e){return t[e]}.bind(null,n));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e,r){},function(t,e,r){"use strict";r.r(e);r(0);var a=function(){function t(t,e,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=t,this.start=e,this.end=r}return t.range=function(e,r){return r?e&&e.loc&&r.loc&&e.loc.lexer===r.loc.lexer?new t(e.loc.lexer,e.loc.start,r.loc.end):null:e&&e.loc},t}(),n=function(){function t(t,e){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=t,this.loc=e}return t.prototype.range=function(e,r){return new t(r,a.range(this,e))},t}(),i=function t(e,r){this.position=void 0;var a,n="KaTeX parse error: "+e,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;a=i.start;var s=i.end;a===o.length?n+=" at end of input: ":n+=" at position "+(a+1)+": ";var l=o.slice(a,s).replace(/[^]/g,"$&\u0332");n+=(a>15?"\u2026"+o.slice(a-15,a):o.slice(0,a))+l+(s+15<o.length?o.slice(s,s+15)+"\u2026":o.slice(s))}var h=new Error(n);return h.name="ParseError",h.__proto__=t.prototype,h.position=a,h};i.prototype.__proto__=Error.prototype;var o=i,s=/([A-Z])/g,l={"&":"&",">":">","<":"<",'"':""","'":"'"},h=/[&><"']/g;var m=function t(e){return"ordgroup"===e.type?1===e.body.length?t(e.body[0]):e:"color"===e.type?1===e.body.length?t(e.body[0]):e:"font"===e.type?t(e.body):e},c={contains:function(t,e){return-1!==t.indexOf(e)},deflt:function(t,e){return void 0===t?e:t},escape:function(t){return String(t).replace(h,function(t){return l[t]})},hyphenate:function(t){return t.replace(s,"-$1").toLowerCase()},getBaseElem:m,isCharacterBox:function(t){var e=m(t);return"mathord"===e.type||"textord"===e.type||"atom"===e.type},protocolFromUrl:function(t){var e=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(t);return null!=e?e[1]:"_relative"}},u=function(){function t(t){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,t=t||{},this.displayMode=c.deflt(t.displayMode,!1),this.output=c.deflt(t.output,"htmlAndMathml"),this.leqno=c.deflt(t.leqno,!1),this.fleqn=c.deflt(t.fleqn,!1),this.throwOnError=c.deflt(t.throwOnError,!0),this.errorColor=c.deflt(t.errorColor,"#cc0000"),this.macros=t.macros||{},this.minRuleThickness=Math.max(0,c.deflt(t.minRuleThickness,0)),this.colorIsTextColor=c.deflt(t.colorIsTextColor,!1),this.strict=c.deflt(t.strict,"warn"),this.trust=c.deflt(t.trust,!1),this.maxSize=Math.max(0,c.deflt(t.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(t.maxExpand,1e3)),this.globalGroup=c.deflt(t.globalGroup,!1)}var e=t.prototype;return e.reportNonstrict=function(t,e,r){var a=this.strict;if("function"==typeof a&&(a=a(t,e,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new o("LaTeX-incompatible input and strict mode is set to 'error': "+e+" ["+t+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]")}},e.useStrictBehavior=function(t,e,r){var a=this.strict;if("function"==typeof a)try{a=a(t,e,r)}catch(t){a="error"}return!(!a||"ignore"===a)&&(!0===a||"error"===a||("warn"===a?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]"),!1)))},e.isTrusted=function(t){t.url&&!t.protocol&&(t.protocol=c.protocolFromUrl(t.url));var e="function"==typeof this.trust?this.trust(t):this.trust;return Boolean(e)},t}(),p=function(){function t(t,e,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=e,this.cramped=r}var e=t.prototype;return e.sup=function(){return d[f[this.id]]},e.sub=function(){return d[g[this.id]]},e.fracNum=function(){return d[x[this.id]]},e.fracDen=function(){return d[v[this.id]]},e.cramp=function(){return d[b[this.id]]},e.text=function(){return d[y[this.id]]},e.isTight=function(){return this.size>=2},t}(),d=[new p(0,0,!1),new p(1,0,!0),new p(2,1,!1),new p(3,1,!0),new p(4,2,!1),new p(5,2,!0),new p(6,3,!1),new p(7,3,!0)],f=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],x=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],w={DISPLAY:d[0],TEXT:d[2],SCRIPT:d[4],SCRIPTSCRIPT:d[6]},k=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var S=[];function M(t){for(var e=0;e<S.length;e+=2)if(t>=S[e]&&t<=S[e+1])return!0;return!1}k.forEach(function(t){return t.blocks.forEach(function(t){return S.push.apply(S,t)})});var z={leftParenInner:"M291 0 H417 V300 H291 z",rightParenInner:"M457 0 H583 V300 H457 z",doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},A=function(){function t(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){for(var t=document.createDocumentFragment(),e=0;e<this.children.length;e++)t.appendChild(this.children[e].toNode());return t},e.toMarkup=function(){for(var t="",e=0;e<this.children.length;e++)t+=this.children[e].toMarkup();return t},e.toText=function(){var t=function(t){return t.toText()};return this.children.map(t).join("")},t}(),T=function(t){return t.filter(function(t){return t}).join(" ")},B=function(t,e,r){if(this.classes=t||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},e){e.style.isTight()&&this.classes.push("mtight");var a=e.getColor();a&&(this.style.color=a)}},C=function(t){var e=document.createElement(t);for(var r in e.className=T(this.classes),this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&e.setAttribute(a,this.attributes[a]);for(var n=0;n<this.children.length;n++)e.appendChild(this.children[n].toNode());return e},q=function(t){var e="<"+t;this.classes.length&&(e+=' class="'+c.escape(T(this.classes))+'"');var r="";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");for(var n in r&&(e+=' style="'+c.escape(r)+'"'),this.attributes)this.attributes.hasOwnProperty(n)&&(e+=" "+n+'="'+c.escape(this.attributes[n])+'"');e+=">";for(var i=0;i<this.children.length;i++)e+=this.children[i].toMarkup();return e+="</"+t+">"},N=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,t,r,a),this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return C.call(this,"span")},e.toMarkup=function(){return q.call(this,"span")},t}(),I=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,e,a),this.children=r||[],this.setAttribute("href",t)}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return C.call(this,"a")},e.toMarkup=function(){return q.call(this,"a")},t}(),O=function(){function t(t,e,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=e,this.src=t,this.classes=["mord"],this.style=r}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createElement("img");for(var e in t.src=this.src,t.alt=this.alt,t.className="mord",this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);return t},e.toMarkup=function(){var t="<img src='"+this.src+" 'alt='"+this.alt+"' ",e="";for(var r in this.style)this.style.hasOwnProperty(r)&&(e+=c.hyphenate(r)+":"+this.style[r]+";");return e&&(t+=' style="'+c.escape(e)+'"'),t+="'/>"},t}(),R={"\xee":"\u0131\u0302","\xef":"\u0131\u0308","\xed":"\u0131\u0301","\xec":"\u0131\u0300"},E=function(){function t(t,e,r,a,n,i,o,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=t,this.height=e||0,this.depth=r||0,this.italic=a||0,this.skew=n||0,this.width=i||0,this.classes=o||[],this.style=s||{},this.maxFontSize=0;var l=function(t){for(var e=0;e<k.length;e++)for(var r=k[e],a=0;a<r.blocks.length;a++){var n=r.blocks[a];if(t>=n[0]&&t<=n[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=R[this.text])}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createTextNode(this.text),e=null;for(var r in this.italic>0&&((e=document.createElement("span")).style.marginRight=this.italic+"em"),this.classes.length>0&&((e=e||document.createElement("span")).className=T(this.classes)),this.style)this.style.hasOwnProperty(r)&&((e=e||document.createElement("span")).style[r]=this.style[r]);return e?(e.appendChild(t),e):t},e.toMarkup=function(){var t=!1,e="<span";this.classes.length&&(t=!0,e+=' class="',e+=c.escape(T(this.classes)),e+='"');var r="";for(var a in this.italic>0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");r&&(t=!0,e+=' style="'+c.escape(r)+'"');var n=c.escape(this.text);return t?(e+=">",e+=n,e+="</span>"):n},t}(),L=function(){function t(t,e){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=e||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<svg";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</svg>"},t}(),P=function(){function t(t,e){this.pathName=void 0,this.alternate=void 0,this.pathName=t,this.alternate=e}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?t.setAttribute("d",this.alternate):t.setAttribute("d",z[this.pathName]),t},e.toMarkup=function(){return this.alternate?"<path d='"+this.alternate+"'/>":"<path d='"+z[this.pathName]+"'/>"},t}(),D=function(){function t(t){this.attributes=void 0,this.attributes=t||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","line");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t},e.toMarkup=function(){var t="<line";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");return t+="/>"},t}();function H(t){if(t instanceof E)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}var F={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,1],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.67,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.744,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.744,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},V={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},U={"\xc5":"A","\xc7":"C","\xd0":"D","\xde":"o","\xe5":"a","\xe7":"c","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function G(t,e,r){if(!F[e])throw new Error("Font metrics not found for font: "+e+".");var a=t.charCodeAt(0),n=F[e][a];if(!n&&t[0]in U&&(a=U[t[0]].charCodeAt(0),n=F[e][a]),n||"text"!==r||M(a)&&(n=F[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var Y={};var W={bin:1,close:1,inner:1,open:1,punct:1,rel:1},X={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},_={math:{},text:{}},j=_;function $(t,e,r,a,n,i){_[t][n]={font:e,group:r,replace:a},i&&a&&(_[t][a]=_[t][n])}var Z="main",K="ams",J="bin",Q="mathord",tt="op-token",et="rel";$("math",Z,et,"\u2261","\\equiv",!0),$("math",Z,et,"\u227a","\\prec",!0),$("math",Z,et,"\u227b","\\succ",!0),$("math",Z,et,"\u223c","\\sim",!0),$("math",Z,et,"\u22a5","\\perp"),$("math",Z,et,"\u2aaf","\\preceq",!0),$("math",Z,et,"\u2ab0","\\succeq",!0),$("math",Z,et,"\u2243","\\simeq",!0),$("math",Z,et,"\u2223","\\mid",!0),$("math",Z,et,"\u226a","\\ll",!0),$("math",Z,et,"\u226b","\\gg",!0),$("math",Z,et,"\u224d","\\asymp",!0),$("math",Z,et,"\u2225","\\parallel"),$("math",Z,et,"\u22c8","\\bowtie",!0),$("math",Z,et,"\u2323","\\smile",!0),$("math",Z,et,"\u2291","\\sqsubseteq",!0),$("math",Z,et,"\u2292","\\sqsupseteq",!0),$("math",Z,et,"\u2250","\\doteq",!0),$("math",Z,et,"\u2322","\\frown",!0),$("math",Z,et,"\u220b","\\ni",!0),$("math",Z,et,"\u221d","\\propto",!0),$("math",Z,et,"\u22a2","\\vdash",!0),$("math",Z,et,"\u22a3","\\dashv",!0),$("math",Z,et,"\u220b","\\owns"),$("math",Z,"punct",".","\\ldotp"),$("math",Z,"punct","\u22c5","\\cdotp"),$("math",Z,"textord","#","\\#"),$("text",Z,"textord","#","\\#"),$("math",Z,"textord","&","\\&"),$("text",Z,"textord","&","\\&"),$("math",Z,"textord","\u2135","\\aleph",!0),$("math",Z,"textord","\u2200","\\forall",!0),$("math",Z,"textord","\u210f","\\hbar",!0),$("math",Z,"textord","\u2203","\\exists",!0),$("math",Z,"textord","\u2207","\\nabla",!0),$("math",Z,"textord","\u266d","\\flat",!0),$("math",Z,"textord","\u2113","\\ell",!0),$("math",Z,"textord","\u266e","\\natural",!0),$("math",Z,"textord","\u2663","\\clubsuit",!0),$("math",Z,"textord","\u2118","\\wp",!0),$("math",Z,"textord","\u266f","\\sharp",!0),$("math",Z,"textord","\u2662","\\diamondsuit",!0),$("math",Z,"textord","\u211c","\\Re",!0),$("math",Z,"textord","\u2661","\\heartsuit",!0),$("math",Z,"textord","\u2111","\\Im",!0),$("math",Z,"textord","\u2660","\\spadesuit",!0),$("text",Z,"textord","\xa7","\\S",!0),$("text",Z,"textord","\xb6","\\P",!0),$("math",Z,"textord","\u2020","\\dag"),$("text",Z,"textord","\u2020","\\dag"),$("text",Z,"textord","\u2020","\\textdagger"),$("math",Z,"textord","\u2021","\\ddag"),$("text",Z,"textord","\u2021","\\ddag"),$("text",Z,"textord","\u2021","\\textdaggerdbl"),$("math",Z,"close","\u23b1","\\rmoustache",!0),$("math",Z,"open","\u23b0","\\lmoustache",!0),$("math",Z,"close","\u27ef","\\rgroup",!0),$("math",Z,"open","\u27ee","\\lgroup",!0),$("math",Z,J,"\u2213","\\mp",!0),$("math",Z,J,"\u2296","\\ominus",!0),$("math",Z,J,"\u228e","\\uplus",!0),$("math",Z,J,"\u2293","\\sqcap",!0),$("math",Z,J,"\u2217","\\ast"),$("math",Z,J,"\u2294","\\sqcup",!0),$("math",Z,J,"\u25ef","\\bigcirc"),$("math",Z,J,"\u2219","\\bullet"),$("math",Z,J,"\u2021","\\ddagger"),$("math",Z,J,"\u2240","\\wr",!0),$("math",Z,J,"\u2a3f","\\amalg"),$("math",Z,J,"&","\\And"),$("math",Z,et,"\u27f5","\\longleftarrow",!0),$("math",Z,et,"\u21d0","\\Leftarrow",!0),$("math",Z,et,"\u27f8","\\Longleftarrow",!0),$("math",Z,et,"\u27f6","\\longrightarrow",!0),$("math",Z,et,"\u21d2","\\Rightarrow",!0),$("math",Z,et,"\u27f9","\\Longrightarrow",!0),$("math",Z,et,"\u2194","\\leftrightarrow",!0),$("math",Z,et,"\u27f7","\\longleftrightarrow",!0),$("math",Z,et,"\u21d4","\\Leftrightarrow",!0),$("math",Z,et,"\u27fa","\\Longleftrightarrow",!0),$("math",Z,et,"\u21a6","\\mapsto",!0),$("math",Z,et,"\u27fc","\\longmapsto",!0),$("math",Z,et,"\u2197","\\nearrow",!0),$("math",Z,et,"\u21a9","\\hookleftarrow",!0),$("math",Z,et,"\u21aa","\\hookrightarrow",!0),$("math",Z,et,"\u2198","\\searrow",!0),$("math",Z,et,"\u21bc","\\leftharpoonup",!0),$("math",Z,et,"\u21c0","\\rightharpoonup",!0),$("math",Z,et,"\u2199","\\swarrow",!0),$("math",Z,et,"\u21bd","\\leftharpoondown",!0),$("math",Z,et,"\u21c1","\\rightharpoondown",!0),$("math",Z,et,"\u2196","\\nwarrow",!0),$("math",Z,et,"\u21cc","\\rightleftharpoons",!0),$("math",K,et,"\u226e","\\nless",!0),$("math",K,et,"\ue010","\\@nleqslant"),$("math",K,et,"\ue011","\\@nleqq"),$("math",K,et,"\u2a87","\\lneq",!0),$("math",K,et,"\u2268","\\lneqq",!0),$("math",K,et,"\ue00c","\\@lvertneqq"),$("math",K,et,"\u22e6","\\lnsim",!0),$("math",K,et,"\u2a89","\\lnapprox",!0),$("math",K,et,"\u2280","\\nprec",!0),$("math",K,et,"\u22e0","\\npreceq",!0),$("math",K,et,"\u22e8","\\precnsim",!0),$("math",K,et,"\u2ab9","\\precnapprox",!0),$("math",K,et,"\u2241","\\nsim",!0),$("math",K,et,"\ue006","\\@nshortmid"),$("math",K,et,"\u2224","\\nmid",!0),$("math",K,et,"\u22ac","\\nvdash",!0),$("math",K,et,"\u22ad","\\nvDash",!0),$("math",K,et,"\u22ea","\\ntriangleleft"),$("math",K,et,"\u22ec","\\ntrianglelefteq",!0),$("math",K,et,"\u228a","\\subsetneq",!0),$("math",K,et,"\ue01a","\\@varsubsetneq"),$("math",K,et,"\u2acb","\\subsetneqq",!0),$("math",K,et,"\ue017","\\@varsubsetneqq"),$("math",K,et,"\u226f","\\ngtr",!0),$("math",K,et,"\ue00f","\\@ngeqslant"),$("math",K,et,"\ue00e","\\@ngeqq"),$("math",K,et,"\u2a88","\\gneq",!0),$("math",K,et,"\u2269","\\gneqq",!0),$("math",K,et,"\ue00d","\\@gvertneqq"),$("math",K,et,"\u22e7","\\gnsim",!0),$("math",K,et,"\u2a8a","\\gnapprox",!0),$("math",K,et,"\u2281","\\nsucc",!0),$("math",K,et,"\u22e1","\\nsucceq",!0),$("math",K,et,"\u22e9","\\succnsim",!0),$("math",K,et,"\u2aba","\\succnapprox",!0),$("math",K,et,"\u2246","\\ncong",!0),$("math",K,et,"\ue007","\\@nshortparallel"),$("math",K,et,"\u2226","\\nparallel",!0),$("math",K,et,"\u22af","\\nVDash",!0),$("math",K,et,"\u22eb","\\ntriangleright"),$("math",K,et,"\u22ed","\\ntrianglerighteq",!0),$("math",K,et,"\ue018","\\@nsupseteqq"),$("math",K,et,"\u228b","\\supsetneq",!0),$("math",K,et,"\ue01b","\\@varsupsetneq"),$("math",K,et,"\u2acc","\\supsetneqq",!0),$("math",K,et,"\ue019","\\@varsupsetneqq"),$("math",K,et,"\u22ae","\\nVdash",!0),$("math",K,et,"\u2ab5","\\precneqq",!0),$("math",K,et,"\u2ab6","\\succneqq",!0),$("math",K,et,"\ue016","\\@nsubseteqq"),$("math",K,J,"\u22b4","\\unlhd"),$("math",K,J,"\u22b5","\\unrhd"),$("math",K,et,"\u219a","\\nleftarrow",!0),$("math",K,et,"\u219b","\\nrightarrow",!0),$("math",K,et,"\u21cd","\\nLeftarrow",!0),$("math",K,et,"\u21cf","\\nRightarrow",!0),$("math",K,et,"\u21ae","\\nleftrightarrow",!0),$("math",K,et,"\u21ce","\\nLeftrightarrow",!0),$("math",K,et,"\u25b3","\\vartriangle"),$("math",K,"textord","\u210f","\\hslash"),$("math",K,"textord","\u25bd","\\triangledown"),$("math",K,"textord","\u25ca","\\lozenge"),$("math",K,"textord","\u24c8","\\circledS"),$("math",K,"textord","\xae","\\circledR"),$("text",K,"textord","\xae","\\circledR"),$("math",K,"textord","\u2221","\\measuredangle",!0),$("math",K,"textord","\u2204","\\nexists"),$("math",K,"textord","\u2127","\\mho"),$("math",K,"textord","\u2132","\\Finv",!0),$("math",K,"textord","\u2141","\\Game",!0),$("math",K,"textord","\u2035","\\backprime"),$("math",K,"textord","\u25b2","\\blacktriangle"),$("math",K,"textord","\u25bc","\\blacktriangledown"),$("math",K,"textord","\u25a0","\\blacksquare"),$("math",K,"textord","\u29eb","\\blacklozenge"),$("math",K,"textord","\u2605","\\bigstar"),$("math",K,"textord","\u2222","\\sphericalangle",!0),$("math",K,"textord","\u2201","\\complement",!0),$("math",K,"textord","\xf0","\\eth",!0),$("text",Z,"textord","\xf0","\xf0"),$("math",K,"textord","\u2571","\\diagup"),$("math",K,"textord","\u2572","\\diagdown"),$("math",K,"textord","\u25a1","\\square"),$("math",K,"textord","\u25a1","\\Box"),$("math",K,"textord","\u25ca","\\Diamond"),$("math",K,"textord","\xa5","\\yen",!0),$("text",K,"textord","\xa5","\\yen",!0),$("math",K,"textord","\u2713","\\checkmark",!0),$("text",K,"textord","\u2713","\\checkmark"),$("math",K,"textord","\u2136","\\beth",!0),$("math",K,"textord","\u2138","\\daleth",!0),$("math",K,"textord","\u2137","\\gimel",!0),$("math",K,"textord","\u03dd","\\digamma",!0),$("math",K,"textord","\u03f0","\\varkappa"),$("math",K,"open","\u250c","\\@ulcorner",!0),$("math",K,"close","\u2510","\\@urcorner",!0),$("math",K,"open","\u2514","\\@llcorner",!0),$("math",K,"close","\u2518","\\@lrcorner",!0),$("math",K,et,"\u2266","\\leqq",!0),$("math",K,et,"\u2a7d","\\leqslant",!0),$("math",K,et,"\u2a95","\\eqslantless",!0),$("math",K,et,"\u2272","\\lesssim",!0),$("math",K,et,"\u2a85","\\lessapprox",!0),$("math",K,et,"\u224a","\\approxeq",!0),$("math",K,J,"\u22d6","\\lessdot"),$("math",K,et,"\u22d8","\\lll",!0),$("math",K,et,"\u2276","\\lessgtr",!0),$("math",K,et,"\u22da","\\lesseqgtr",!0),$("math",K,et,"\u2a8b","\\lesseqqgtr",!0),$("math",K,et,"\u2251","\\doteqdot"),$("math",K,et,"\u2253","\\risingdotseq",!0),$("math",K,et,"\u2252","\\fallingdotseq",!0),$("math",K,et,"\u223d","\\backsim",!0),$("math",K,et,"\u22cd","\\backsimeq",!0),$("math",K,et,"\u2ac5","\\subseteqq",!0),$("math",K,et,"\u22d0","\\Subset",!0),$("math",K,et,"\u228f","\\sqsubset",!0),$("math",K,et,"\u227c","\\preccurlyeq",!0),$("math",K,et,"\u22de","\\curlyeqprec",!0),$("math",K,et,"\u227e","\\precsim",!0),$("math",K,et,"\u2ab7","\\precapprox",!0),$("math",K,et,"\u22b2","\\vartriangleleft"),$("math",K,et,"\u22b4","\\trianglelefteq"),$("math",K,et,"\u22a8","\\vDash",!0),$("math",K,et,"\u22aa","\\Vvdash",!0),$("math",K,et,"\u2323","\\smallsmile"),$("math",K,et,"\u2322","\\smallfrown"),$("math",K,et,"\u224f","\\bumpeq",!0),$("math",K,et,"\u224e","\\Bumpeq",!0),$("math",K,et,"\u2267","\\geqq",!0),$("math",K,et,"\u2a7e","\\geqslant",!0),$("math",K,et,"\u2a96","\\eqslantgtr",!0),$("math",K,et,"\u2273","\\gtrsim",!0),$("math",K,et,"\u2a86","\\gtrapprox",!0),$("math",K,J,"\u22d7","\\gtrdot"),$("math",K,et,"\u22d9","\\ggg",!0),$("math",K,et,"\u2277","\\gtrless",!0),$("math",K,et,"\u22db","\\gtreqless",!0),$("math",K,et,"\u2a8c","\\gtreqqless",!0),$("math",K,et,"\u2256","\\eqcirc",!0),$("math",K,et,"\u2257","\\circeq",!0),$("math",K,et,"\u225c","\\triangleq",!0),$("math",K,et,"\u223c","\\thicksim"),$("math",K,et,"\u2248","\\thickapprox"),$("math",K,et,"\u2ac6","\\supseteqq",!0),$("math",K,et,"\u22d1","\\Supset",!0),$("math",K,et,"\u2290","\\sqsupset",!0),$("math",K,et,"\u227d","\\succcurlyeq",!0),$("math",K,et,"\u22df","\\curlyeqsucc",!0),$("math",K,et,"\u227f","\\succsim",!0),$("math",K,et,"\u2ab8","\\succapprox",!0),$("math",K,et,"\u22b3","\\vartriangleright"),$("math",K,et,"\u22b5","\\trianglerighteq"),$("math",K,et,"\u22a9","\\Vdash",!0),$("math",K,et,"\u2223","\\shortmid"),$("math",K,et,"\u2225","\\shortparallel"),$("math",K,et,"\u226c","\\between",!0),$("math",K,et,"\u22d4","\\pitchfork",!0),$("math",K,et,"\u221d","\\varpropto"),$("math",K,et,"\u25c0","\\blacktriangleleft"),$("math",K,et,"\u2234","\\therefore",!0),$("math",K,et,"\u220d","\\backepsilon"),$("math",K,et,"\u25b6","\\blacktriangleright"),$("math",K,et,"\u2235","\\because",!0),$("math",K,et,"\u22d8","\\llless"),$("math",K,et,"\u22d9","\\gggtr"),$("math",K,J,"\u22b2","\\lhd"),$("math",K,J,"\u22b3","\\rhd"),$("math",K,et,"\u2242","\\eqsim",!0),$("math",Z,et,"\u22c8","\\Join"),$("math",K,et,"\u2251","\\Doteq",!0),$("math",K,J,"\u2214","\\dotplus",!0),$("math",K,J,"\u2216","\\smallsetminus"),$("math",K,J,"\u22d2","\\Cap",!0),$("math",K,J,"\u22d3","\\Cup",!0),$("math",K,J,"\u2a5e","\\doublebarwedge",!0),$("math",K,J,"\u229f","\\boxminus",!0),$("math",K,J,"\u229e","\\boxplus",!0),$("math",K,J,"\u22c7","\\divideontimes",!0),$("math",K,J,"\u22c9","\\ltimes",!0),$("math",K,J,"\u22ca","\\rtimes",!0),$("math",K,J,"\u22cb","\\leftthreetimes",!0),$("math",K,J,"\u22cc","\\rightthreetimes",!0),$("math",K,J,"\u22cf","\\curlywedge",!0),$("math",K,J,"\u22ce","\\curlyvee",!0),$("math",K,J,"\u229d","\\circleddash",!0),$("math",K,J,"\u229b","\\circledast",!0),$("math",K,J,"\u22c5","\\centerdot"),$("math",K,J,"\u22ba","\\intercal",!0),$("math",K,J,"\u22d2","\\doublecap"),$("math",K,J,"\u22d3","\\doublecup"),$("math",K,J,"\u22a0","\\boxtimes",!0),$("math",K,et,"\u21e2","\\dashrightarrow",!0),$("math",K,et,"\u21e0","\\dashleftarrow",!0),$("math",K,et,"\u21c7","\\leftleftarrows",!0),$("math",K,et,"\u21c6","\\leftrightarrows",!0),$("math",K,et,"\u21da","\\Lleftarrow",!0),$("math",K,et,"\u219e","\\twoheadleftarrow",!0),$("math",K,et,"\u21a2","\\leftarrowtail",!0),$("math",K,et,"\u21ab","\\looparrowleft",!0),$("math",K,et,"\u21cb","\\leftrightharpoons",!0),$("math",K,et,"\u21b6","\\curvearrowleft",!0),$("math",K,et,"\u21ba","\\circlearrowleft",!0),$("math",K,et,"\u21b0","\\Lsh",!0),$("math",K,et,"\u21c8","\\upuparrows",!0),$("math",K,et,"\u21bf","\\upharpoonleft",!0),$("math",K,et,"\u21c3","\\downharpoonleft",!0),$("math",K,et,"\u22b8","\\multimap",!0),$("math",K,et,"\u21ad","\\leftrightsquigarrow",!0),$("math",K,et,"\u21c9","\\rightrightarrows",!0),$("math",K,et,"\u21c4","\\rightleftarrows",!0),$("math",K,et,"\u21a0","\\twoheadrightarrow",!0),$("math",K,et,"\u21a3","\\rightarrowtail",!0),$("math",K,et,"\u21ac","\\looparrowright",!0),$("math",K,et,"\u21b7","\\curvearrowright",!0),$("math",K,et,"\u21bb","\\circlearrowright",!0),$("math",K,et,"\u21b1","\\Rsh",!0),$("math",K,et,"\u21ca","\\downdownarrows",!0),$("math",K,et,"\u21be","\\upharpoonright",!0),$("math",K,et,"\u21c2","\\downharpoonright",!0),$("math",K,et,"\u21dd","\\rightsquigarrow",!0),$("math",K,et,"\u21dd","\\leadsto"),$("math",K,et,"\u21db","\\Rrightarrow",!0),$("math",K,et,"\u21be","\\restriction"),$("math",Z,"textord","\u2018","`"),$("math",Z,"textord","$","\\$"),$("text",Z,"textord","$","\\$"),$("text",Z,"textord","$","\\textdollar"),$("math",Z,"textord","%","\\%"),$("text",Z,"textord","%","\\%"),$("math",Z,"textord","_","\\_"),$("text",Z,"textord","_","\\_"),$("text",Z,"textord","_","\\textunderscore"),$("math",Z,"textord","\u2220","\\angle",!0),$("math",Z,"textord","\u221e","\\infty",!0),$("math",Z,"textord","\u2032","\\prime"),$("math",Z,"textord","\u25b3","\\triangle"),$("math",Z,"textord","\u0393","\\Gamma",!0),$("math",Z,"textord","\u0394","\\Delta",!0),$("math",Z,"textord","\u0398","\\Theta",!0),$("math",Z,"textord","\u039b","\\Lambda",!0),$("math",Z,"textord","\u039e","\\Xi",!0),$("math",Z,"textord","\u03a0","\\Pi",!0),$("math",Z,"textord","\u03a3","\\Sigma",!0),$("math",Z,"textord","\u03a5","\\Upsilon",!0),$("math",Z,"textord","\u03a6","\\Phi",!0),$("math",Z,"textord","\u03a8","\\Psi",!0),$("math",Z,"textord","\u03a9","\\Omega",!0),$("math",Z,"textord","A","\u0391"),$("math",Z,"textord","B","\u0392"),$("math",Z,"textord","E","\u0395"),$("math",Z,"textord","Z","\u0396"),$("math",Z,"textord","H","\u0397"),$("math",Z,"textord","I","\u0399"),$("math",Z,"textord","K","\u039a"),$("math",Z,"textord","M","\u039c"),$("math",Z,"textord","N","\u039d"),$("math",Z,"textord","O","\u039f"),$("math",Z,"textord","P","\u03a1"),$("math",Z,"textord","T","\u03a4"),$("math",Z,"textord","X","\u03a7"),$("math",Z,"textord","\xac","\\neg",!0),$("math",Z,"textord","\xac","\\lnot"),$("math",Z,"textord","\u22a4","\\top"),$("math",Z,"textord","\u22a5","\\bot"),$("math",Z,"textord","\u2205","\\emptyset"),$("math",K,"textord","\u2205","\\varnothing"),$("math",Z,Q,"\u03b1","\\alpha",!0),$("math",Z,Q,"\u03b2","\\beta",!0),$("math",Z,Q,"\u03b3","\\gamma",!0),$("math",Z,Q,"\u03b4","\\delta",!0),$("math",Z,Q,"\u03f5","\\epsilon",!0),$("math",Z,Q,"\u03b6","\\zeta",!0),$("math",Z,Q,"\u03b7","\\eta",!0),$("math",Z,Q,"\u03b8","\\theta",!0),$("math",Z,Q,"\u03b9","\\iota",!0),$("math",Z,Q,"\u03ba","\\kappa",!0),$("math",Z,Q,"\u03bb","\\lambda",!0),$("math",Z,Q,"\u03bc","\\mu",!0),$("math",Z,Q,"\u03bd","\\nu",!0),$("math",Z,Q,"\u03be","\\xi",!0),$("math",Z,Q,"\u03bf","\\omicron",!0),$("math",Z,Q,"\u03c0","\\pi",!0),$("math",Z,Q,"\u03c1","\\rho",!0),$("math",Z,Q,"\u03c3","\\sigma",!0),$("math",Z,Q,"\u03c4","\\tau",!0),$("math",Z,Q,"\u03c5","\\upsilon",!0),$("math",Z,Q,"\u03d5","\\phi",!0),$("math",Z,Q,"\u03c7","\\chi",!0),$("math",Z,Q,"\u03c8","\\psi",!0),$("math",Z,Q,"\u03c9","\\omega",!0),$("math",Z,Q,"\u03b5","\\varepsilon",!0),$("math",Z,Q,"\u03d1","\\vartheta",!0),$("math",Z,Q,"\u03d6","\\varpi",!0),$("math",Z,Q,"\u03f1","\\varrho",!0),$("math",Z,Q,"\u03c2","\\varsigma",!0),$("math",Z,Q,"\u03c6","\\varphi",!0),$("math",Z,J,"\u2217","*"),$("math",Z,J,"+","+"),$("math",Z,J,"\u2212","-"),$("math",Z,J,"\u22c5","\\cdot",!0),$("math",Z,J,"\u2218","\\circ"),$("math",Z,J,"\xf7","\\div",!0),$("math",Z,J,"\xb1","\\pm",!0),$("math",Z,J,"\xd7","\\times",!0),$("math",Z,J,"\u2229","\\cap",!0),$("math",Z,J,"\u222a","\\cup",!0),$("math",Z,J,"\u2216","\\setminus"),$("math",Z,J,"\u2227","\\land"),$("math",Z,J,"\u2228","\\lor"),$("math",Z,J,"\u2227","\\wedge",!0),$("math",Z,J,"\u2228","\\vee",!0),$("math",Z,"textord","\u221a","\\surd"),$("math",Z,"open","\u27e8","\\langle",!0),$("math",Z,"open","\u2223","\\lvert"),$("math",Z,"open","\u2225","\\lVert"),$("math",Z,"close","?","?"),$("math",Z,"close","!","!"),$("math",Z,"close","\u27e9","\\rangle",!0),$("math",Z,"close","\u2223","\\rvert"),$("math",Z,"close","\u2225","\\rVert"),$("math",Z,et,"=","="),$("math",Z,et,":",":"),$("math",Z,et,"\u2248","\\approx",!0),$("math",Z,et,"\u2245","\\cong",!0),$("math",Z,et,"\u2265","\\ge"),$("math",Z,et,"\u2265","\\geq",!0),$("math",Z,et,"\u2190","\\gets"),$("math",Z,et,">","\\gt",!0),$("math",Z,et,"\u2208","\\in",!0),$("math",Z,et,"\ue020","\\@not"),$("math",Z,et,"\u2282","\\subset",!0),$("math",Z,et,"\u2283","\\supset",!0),$("math",Z,et,"\u2286","\\subseteq",!0),$("math",Z,et,"\u2287","\\supseteq",!0),$("math",K,et,"\u2288","\\nsubseteq",!0),$("math",K,et,"\u2289","\\nsupseteq",!0),$("math",Z,et,"\u22a8","\\models"),$("math",Z,et,"\u2190","\\leftarrow",!0),$("math",Z,et,"\u2264","\\le"),$("math",Z,et,"\u2264","\\leq",!0),$("math",Z,et,"<","\\lt",!0),$("math",Z,et,"\u2192","\\rightarrow",!0),$("math",Z,et,"\u2192","\\to"),$("math",K,et,"\u2271","\\ngeq",!0),$("math",K,et,"\u2270","\\nleq",!0),$("math",Z,"spacing","\xa0","\\ "),$("math",Z,"spacing","\xa0","~"),$("math",Z,"spacing","\xa0","\\space"),$("math",Z,"spacing","\xa0","\\nobreakspace"),$("text",Z,"spacing","\xa0","\\ "),$("text",Z,"spacing","\xa0"," "),$("text",Z,"spacing","\xa0","~"),$("text",Z,"spacing","\xa0","\\space"),$("text",Z,"spacing","\xa0","\\nobreakspace"),$("math",Z,"spacing",null,"\\nobreak"),$("math",Z,"spacing",null,"\\allowbreak"),$("math",Z,"punct",",",","),$("math",Z,"punct",";",";"),$("math",K,J,"\u22bc","\\barwedge",!0),$("math",K,J,"\u22bb","\\veebar",!0),$("math",Z,J,"\u2299","\\odot",!0),$("math",Z,J,"\u2295","\\oplus",!0),$("math",Z,J,"\u2297","\\otimes",!0),$("math",Z,"textord","\u2202","\\partial",!0),$("math",Z,J,"\u2298","\\oslash",!0),$("math",K,J,"\u229a","\\circledcirc",!0),$("math",K,J,"\u22a1","\\boxdot",!0),$("math",Z,J,"\u25b3","\\bigtriangleup"),$("math",Z,J,"\u25bd","\\bigtriangledown"),$("math",Z,J,"\u2020","\\dagger"),$("math",Z,J,"\u22c4","\\diamond"),$("math",Z,J,"\u22c6","\\star"),$("math",Z,J,"\u25c3","\\triangleleft"),$("math",Z,J,"\u25b9","\\triangleright"),$("math",Z,"open","{","\\{"),$("text",Z,"textord","{","\\{"),$("text",Z,"textord","{","\\textbraceleft"),$("math",Z,"close","}","\\}"),$("text",Z,"textord","}","\\}"),$("text",Z,"textord","}","\\textbraceright"),$("math",Z,"open","{","\\lbrace"),$("math",Z,"close","}","\\rbrace"),$("math",Z,"open","[","\\lbrack",!0),$("text",Z,"textord","[","\\lbrack",!0),$("math",Z,"close","]","\\rbrack",!0),$("text",Z,"textord","]","\\rbrack",!0),$("math",Z,"open","(","\\lparen",!0),$("math",Z,"close",")","\\rparen",!0),$("text",Z,"textord","<","\\textless",!0),$("text",Z,"textord",">","\\textgreater",!0),$("math",Z,"open","\u230a","\\lfloor",!0),$("math",Z,"close","\u230b","\\rfloor",!0),$("math",Z,"open","\u2308","\\lceil",!0),$("math",Z,"close","\u2309","\\rceil",!0),$("math",Z,"textord","\\","\\backslash"),$("math",Z,"textord","\u2223","|"),$("math",Z,"textord","\u2223","\\vert"),$("text",Z,"textord","|","\\textbar",!0),$("math",Z,"textord","\u2225","\\|"),$("math",Z,"textord","\u2225","\\Vert"),$("text",Z,"textord","\u2225","\\textbardbl"),$("text",Z,"textord","~","\\textasciitilde"),$("text",Z,"textord","\\","\\textbackslash"),$("text",Z,"textord","^","\\textasciicircum"),$("math",Z,et,"\u2191","\\uparrow",!0),$("math",Z,et,"\u21d1","\\Uparrow",!0),$("math",Z,et,"\u2193","\\downarrow",!0),$("math",Z,et,"\u21d3","\\Downarrow",!0),$("math",Z,et,"\u2195","\\updownarrow",!0),$("math",Z,et,"\u21d5","\\Updownarrow",!0),$("math",Z,tt,"\u2210","\\coprod"),$("math",Z,tt,"\u22c1","\\bigvee"),$("math",Z,tt,"\u22c0","\\bigwedge"),$("math",Z,tt,"\u2a04","\\biguplus"),$("math",Z,tt,"\u22c2","\\bigcap"),$("math",Z,tt,"\u22c3","\\bigcup"),$("math",Z,tt,"\u222b","\\int"),$("math",Z,tt,"\u222b","\\intop"),$("math",Z,tt,"\u222c","\\iint"),$("math",Z,tt,"\u222d","\\iiint"),$("math",Z,tt,"\u220f","\\prod"),$("math",Z,tt,"\u2211","\\sum"),$("math",Z,tt,"\u2a02","\\bigotimes"),$("math",Z,tt,"\u2a01","\\bigoplus"),$("math",Z,tt,"\u2a00","\\bigodot"),$("math",Z,tt,"\u222e","\\oint"),$("math",Z,tt,"\u2a06","\\bigsqcup"),$("math",Z,tt,"\u222b","\\smallint"),$("text",Z,"inner","\u2026","\\textellipsis"),$("math",Z,"inner","\u2026","\\mathellipsis"),$("text",Z,"inner","\u2026","\\ldots",!0),$("math",Z,"inner","\u2026","\\ldots",!0),$("math",Z,"inner","\u22ef","\\@cdots",!0),$("math",Z,"inner","\u22f1","\\ddots",!0),$("math",Z,"textord","\u22ee","\\varvdots"),$("math",Z,"accent-token","\u02ca","\\acute"),$("math",Z,"accent-token","\u02cb","\\grave"),$("math",Z,"accent-token","\xa8","\\ddot"),$("math",Z,"accent-token","~","\\tilde"),$("math",Z,"accent-token","\u02c9","\\bar"),$("math",Z,"accent-token","\u02d8","\\breve"),$("math",Z,"accent-token","\u02c7","\\check"),$("math",Z,"accent-token","^","\\hat"),$("math",Z,"accent-token","\u20d7","\\vec"),$("math",Z,"accent-token","\u02d9","\\dot"),$("math",Z,"accent-token","\u02da","\\mathring"),$("math",Z,Q,"\ue131","\\@imath"),$("math",Z,Q,"\ue237","\\@jmath"),$("math",Z,"textord","\u0131","\u0131"),$("math",Z,"textord","\u0237","\u0237"),$("text",Z,"textord","\u0131","\\i",!0),$("text",Z,"textord","\u0237","\\j",!0),$("text",Z,"textord","\xdf","\\ss",!0),$("text",Z,"textord","\xe6","\\ae",!0),$("text",Z,"textord","\u0153","\\oe",!0),$("text",Z,"textord","\xf8","\\o",!0),$("text",Z,"textord","\xc6","\\AE",!0),$("text",Z,"textord","\u0152","\\OE",!0),$("text",Z,"textord","\xd8","\\O",!0),$("text",Z,"accent-token","\u02ca","\\'"),$("text",Z,"accent-token","\u02cb","\\`"),$("text",Z,"accent-token","\u02c6","\\^"),$("text",Z,"accent-token","\u02dc","\\~"),$("text",Z,"accent-token","\u02c9","\\="),$("text",Z,"accent-token","\u02d8","\\u"),$("text",Z,"accent-token","\u02d9","\\."),$("text",Z,"accent-token","\u02da","\\r"),$("text",Z,"accent-token","\u02c7","\\v"),$("text",Z,"accent-token","\xa8",'\\"'),$("text",Z,"accent-token","\u02dd","\\H"),$("text",Z,"accent-token","\u25ef","\\textcircled");var rt={"--":!0,"---":!0,"``":!0,"''":!0};$("text",Z,"textord","\u2013","--",!0),$("text",Z,"textord","\u2013","\\textendash"),$("text",Z,"textord","\u2014","---",!0),$("text",Z,"textord","\u2014","\\textemdash"),$("text",Z,"textord","\u2018","`",!0),$("text",Z,"textord","\u2018","\\textquoteleft"),$("text",Z,"textord","\u2019","'",!0),$("text",Z,"textord","\u2019","\\textquoteright"),$("text",Z,"textord","\u201c","``",!0),$("text",Z,"textord","\u201c","\\textquotedblleft"),$("text",Z,"textord","\u201d","''",!0),$("text",Z,"textord","\u201d","\\textquotedblright"),$("math",Z,"textord","\xb0","\\degree",!0),$("text",Z,"textord","\xb0","\\degree"),$("text",Z,"textord","\xb0","\\textdegree",!0),$("math",Z,"textord","\xa3","\\pounds"),$("math",Z,"textord","\xa3","\\mathsterling",!0),$("text",Z,"textord","\xa3","\\pounds"),$("text",Z,"textord","\xa3","\\textsterling",!0),$("math",K,"textord","\u2720","\\maltese"),$("text",K,"textord","\u2720","\\maltese");for(var at=0;at<'0123456789/@."'.length;at++){var nt='0123456789/@."'.charAt(at);$("math",Z,"textord",nt,nt)}for(var it=0;it<'0123456789!@*()-=+";:?/.,'.length;it++){var ot='0123456789!@*()-=+";:?/.,'.charAt(it);$("text",Z,"textord",ot,ot)}for(var st="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",lt=0;lt<st.length;lt++){var ht=st.charAt(lt);$("math",Z,Q,ht,ht),$("text",Z,"textord",ht,ht)}$("math",K,"textord","C","\u2102"),$("text",K,"textord","C","\u2102"),$("math",K,"textord","H","\u210d"),$("text",K,"textord","H","\u210d"),$("math",K,"textord","N","\u2115"),$("text",K,"textord","N","\u2115"),$("math",K,"textord","P","\u2119"),$("text",K,"textord","P","\u2119"),$("math",K,"textord","Q","\u211a"),$("text",K,"textord","Q","\u211a"),$("math",K,"textord","R","\u211d"),$("text",K,"textord","R","\u211d"),$("math",K,"textord","Z","\u2124"),$("text",K,"textord","Z","\u2124"),$("math",Z,Q,"h","\u210e"),$("text",Z,Q,"h","\u210e");for(var mt="",ct=0;ct<st.length;ct++){var ut=st.charAt(ct);$("math",Z,Q,ut,mt=String.fromCharCode(55349,56320+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56372+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56424+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56580+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56736+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56788+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56840+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56944+ct)),$("text",Z,"textord",ut,mt),ct<26&&($("math",Z,Q,ut,mt=String.fromCharCode(55349,56632+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56476+ct)),$("text",Z,"textord",ut,mt))}$("math",Z,Q,"k",mt=String.fromCharCode(55349,56668)),$("text",Z,"textord","k",mt);for(var pt=0;pt<10;pt++){var dt=pt.toString();$("math",Z,Q,dt,mt=String.fromCharCode(55349,57294+pt)),$("text",Z,"textord",dt,mt),$("math",Z,Q,dt,mt=String.fromCharCode(55349,57314+pt)),$("text",Z,"textord",dt,mt),$("math",Z,Q,dt,mt=String.fromCharCode(55349,57324+pt)),$("text",Z,"textord",dt,mt),$("math",Z,Q,dt,mt=String.fromCharCode(55349,57334+pt)),$("text",Z,"textord",dt,mt)}for(var ft=0;ft<"\xc7\xd0\xde\xe7\xfe".length;ft++){var gt="\xc7\xd0\xde\xe7\xfe".charAt(ft);$("math",Z,Q,gt,gt),$("text",Z,"textord",gt,gt)}var xt=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathnormal","textit","Math-Italic"],["mathnormal","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["","",""],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],vt=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],bt=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],yt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],wt=function(t,e){return e.size<2?t:bt[t-1][e.size-1]},kt=function(){function t(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=yt[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}var e=t.prototype;return e.extend=function(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var a in e)e.hasOwnProperty(a)&&(r[a]=e[a]);return new t(r)},e.havingStyle=function(t){return this.style===t?this:this.extend({style:t,size:wt(this.textSize,t)})},e.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},e.havingSize=function(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:yt[t-1]})},e.havingBaseStyle=function(e){e=e||this.style.text();var r=wt(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})},e.havingBaseSizing=function(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})},e.withColor=function(t){return this.extend({color:t})},e.withPhantom=function(){return this.extend({phantom:!0})},e.withFont=function(t){return this.extend({font:t})},e.withTextFontFamily=function(t){return this.extend({fontFamily:t,font:""})},e.withTextFontWeight=function(t){return this.extend({fontWeight:t,font:""})},e.withTextFontShape=function(t){return this.extend({fontShape:t,font:""})},e.sizingClasses=function(t){return t.size!==this.size?["sizing","reset-size"+t.size,"size"+this.size]:[]},e.baseSizingClasses=function(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]},e.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=function(t){var e;if(!Y[e=t>=5?0:t>=3?1:2]){var r=Y[e]={cssEmPerMu:V.quad[e]/18};for(var a in V)V.hasOwnProperty(a)&&(r[a]=V[a][e])}return Y[e]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?"transparent":this.color},t}();kt.BASESIZE=6;var St=kt,Mt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},zt={ex:!0,em:!0,mu:!0},At=function(t){return"string"!=typeof t&&(t=t.unit),t in Mt||t in zt||"ex"===t},Tt=function(t,e){var r;if(t.unit in Mt)r=Mt[t.unit]/e.fontMetrics().ptPerEm/e.sizeMultiplier;else if("mu"===t.unit)r=e.fontMetrics().cssEmPerMu;else{var a;if(a=e.style.isTight()?e.havingStyle(e.style.text()):e,"ex"===t.unit)r=a.fontMetrics().xHeight;else{if("em"!==t.unit)throw new o("Invalid unit: '"+t.unit+"'");r=a.fontMetrics().quad}a!==e&&(r*=a.sizeMultiplier/e.sizeMultiplier)}return Math.min(t.number*r,e.maxSize)},Bt=function(t,e,r){return j[r][t]&&j[r][t].replace&&(t=j[r][t].replace),{value:t,metrics:G(t,e,r)}},Ct=function(t,e,r,a,n){var i,o=Bt(t,e,r),s=o.metrics;if(t=o.value,s){var l=s.italic;("text"===r||a&&"mathit"===a.font)&&(l=0),i=new E(t,s.height,s.depth,l,s.skew,s.width,n)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+t+"' in style '"+e+"' and mode '"+r+"'"),i=new E(t,0,0,0,0,0,n);if(a){i.maxFontSize=a.sizeMultiplier,a.style.isTight()&&i.classes.push("mtight");var h=a.getColor();h&&(i.style.color=h)}return i},qt=function(t,e){if(T(t.classes)!==T(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;for(var r in t.style)if(t.style.hasOwnProperty(r)&&t.style[r]!==e.style[r])return!1;for(var a in e.style)if(e.style.hasOwnProperty(a)&&t.style[a]!==e.style[a])return!1;return!0},Nt=function(t){for(var e=0,r=0,a=0,n=0;n<t.children.length;n++){var i=t.children[n];i.height>e&&(e=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>a&&(a=i.maxFontSize)}t.height=e,t.depth=r,t.maxFontSize=a},It=function(t,e,r,a){var n=new N(t,e,r,a);return Nt(n),n},Ot=function(t,e,r,a){return new N(t,e,r,a)},Rt=function(t){var e=new A(t);return Nt(e),e},Et=function(t,e,r){var a="";switch(t){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=t}return a+"-"+("textbf"===e&&"textit"===r?"BoldItalic":"textbf"===e?"Bold":"textit"===e?"Italic":"Regular")},Lt={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Pt={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659],leftParenInner:["leftParenInner",.875,.3],rightParenInner:["rightParenInner",.875,.3]},Dt={fontMap:Lt,makeSymbol:Ct,mathsym:function(t,e,r,a){return void 0===a&&(a=[]),"boldsymbol"===r.font&&Bt(t,"Main-Bold",e).metrics?Ct(t,"Main-Bold",e,r,a.concat(["mathbf"])):"\\"===t||"main"===j[e][t].font?Ct(t,"Main-Regular",e,r,a):Ct(t,"AMS-Regular",e,r,a.concat(["amsrm"]))},makeSpan:It,makeSvgSpan:Ot,makeLineSpan:function(t,e,r){var a=It([t],[],e);return a.height=Math.max(r||e.fontMetrics().defaultRuleThickness,e.minRuleThickness),a.style.borderBottomWidth=a.height+"em",a.maxFontSize=1,a},makeAnchor:function(t,e,r,a){var n=new I(t,e,r,a);return Nt(n),n},makeFragment:Rt,wrapFragment:function(t,e){return t instanceof A?It([],[t],e):t},makeVList:function(t,e){for(var r=function(t){if("individualShift"===t.positionType){for(var e=t.children,r=[e[0]],a=-e[0].shift-e[0].elem.depth,n=a,i=1;i<e.length;i++){var o=-e[i].shift-n-e[i].elem.depth,s=o-(e[i-1].elem.height+e[i-1].elem.depth);n+=o,r.push({type:"kern",size:s}),r.push(e[i])}return{children:r,depth:a}}var l;if("top"===t.positionType){for(var h=t.positionData,m=0;m<t.children.length;m++){var c=t.children[m];h-="kern"===c.type?c.size:c.elem.height+c.elem.depth}l=h}else if("bottom"===t.positionType)l=-t.positionData;else{var u=t.children[0];if("elem"!==u.type)throw new Error('First child must have type "elem".');if("shift"===t.positionType)l=-u.elem.depth-t.positionData;else{if("firstBaseline"!==t.positionType)throw new Error("Invalid positionType "+t.positionType+".");l=-u.elem.depth}}return{children:t.children,depth:l}}(t),a=r.children,n=r.depth,i=0,o=0;o<a.length;o++){var s=a[o];if("elem"===s.type){var l=s.elem;i=Math.max(i,l.maxFontSize,l.height)}}i+=2;var h=It(["pstrut"],[]);h.style.height=i+"em";for(var m=[],c=n,u=n,p=n,d=0;d<a.length;d++){var f=a[d];if("kern"===f.type)p+=f.size;else{var g=f.elem,x=f.wrapperClasses||[],v=f.wrapperStyle||{},b=It(x,[h,g],void 0,v);b.style.top=-i-p-g.depth+"em",f.marginLeft&&(b.style.marginLeft=f.marginLeft),f.marginRight&&(b.style.marginRight=f.marginRight),m.push(b),p+=g.height+g.depth}c=Math.min(c,p),u=Math.max(u,p)}var y,w=It(["vlist"],m);if(w.style.height=u+"em",c<0){var k=It([],[]),S=It(["vlist"],[k]);S.style.height=-c+"em";var M=It(["vlist-s"],[new E("\u200b")]);y=[It(["vlist-r"],[w,M]),It(["vlist-r"],[S])]}else y=[It(["vlist-r"],[w])];var z=It(["vlist-t"],y);return 2===y.length&&z.classes.push("vlist-t2"),z.height=u,z.depth=-c,z},makeOrd:function(t,e,r){var a=t.mode,n=t.text,i=["mord"],s="math"===a||"text"===a&&e.font,l=s?e.font:e.fontFamily;if(55349===n.charCodeAt(0)){var h=function(t,e){var r=1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536,a="math"===e?0:1;if(119808<=r&&r<120484){var n=Math.floor((r-119808)/26);return[xt[n][2],xt[n][a]]}if(120782<=r&&r<=120831){var i=Math.floor((r-120782)/10);return[vt[i][2],vt[i][a]]}if(120485===r||120486===r)return[xt[0][2],xt[0][a]];if(120486<r&&r<120782)return["",""];throw new o("Unsupported character: "+t)}(n,a),m=h[0],c=h[1];return Ct(n,m,a,e,i.concat(c))}if(l){var u,p;if("boldsymbol"===l){var d=function(t,e,r,a,n){return"textord"!==n&&Bt(t,"Math-BoldItalic",e).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(n,a,0,0,r);u=d.fontName,p=[d.fontClass]}else s?(u=Lt[l].fontName,p=[l]):(u=Et(l,e.fontWeight,e.fontShape),p=[l,e.fontWeight,e.fontShape]);if(Bt(n,u,a).metrics)return Ct(n,u,a,e,i.concat(p));if(rt.hasOwnProperty(n)&&"Typewriter"===u.substr(0,10)){for(var f=[],g=0;g<n.length;g++)f.push(Ct(n[g],u,a,e,i.concat(p)));return Rt(f)}}if("mathord"===r)return Ct(n,"Math-Italic",a,e,i.concat(["mathnormal"]));if("textord"===r){var x=j[a][n]&&j[a][n].font;if("ams"===x){var v=Et("amsrm",e.fontWeight,e.fontShape);return Ct(n,v,a,e,i.concat("amsrm",e.fontWeight,e.fontShape))}if("main"!==x&&x){var b=Et(x,e.fontWeight,e.fontShape);return Ct(n,b,a,e,i.concat(b,e.fontWeight,e.fontShape))}var y=Et("textrm",e.fontWeight,e.fontShape);return Ct(n,y,a,e,i.concat(e.fontWeight,e.fontShape))}throw new Error("unexpected type: "+r+" in makeOrd")},makeGlue:function(t,e){var r=It(["mspace"],[],e),a=Tt(t,e);return r.style.marginRight=a+"em",r},staticSvg:function(t,e){var r=Pt[t],a=r[0],n=r[1],i=r[2],o=new P(a),s=new L([o],{width:n+"em",height:i+"em",style:"width:"+n+"em",viewBox:"0 0 "+1e3*n+" "+1e3*i,preserveAspectRatio:"xMinYMin"}),l=Ot(["overlay"],[s],e);return l.height=i,l.style.height=i+"em",l.style.width=n+"em",l},svgData:Pt,tryCombineChars:function(t){for(var e=0;e<t.length-1;e++){var r=t[e],a=t[e+1];r instanceof E&&a instanceof E&&qt(r,a)&&(r.text+=a.text,r.height=Math.max(r.height,a.height),r.depth=Math.max(r.depth,a.depth),r.italic=a.italic,t.splice(e+1,1),e--)}return t}},Ht={number:3,unit:"mu"},Ft={number:4,unit:"mu"},Vt={number:5,unit:"mu"},Ut={mord:{mop:Ht,mbin:Ft,mrel:Vt,minner:Ht},mop:{mord:Ht,mop:Ht,mrel:Vt,minner:Ht},mbin:{mord:Ft,mop:Ft,mopen:Ft,minner:Ft},mrel:{mord:Vt,mop:Vt,mopen:Vt,minner:Vt},mopen:{},mclose:{mop:Ht,mbin:Ft,mrel:Vt,minner:Ht},mpunct:{mord:Ht,mop:Ht,mrel:Vt,mopen:Ht,mclose:Ht,mpunct:Ht,minner:Ht},minner:{mord:Ht,mop:Ht,mbin:Ft,mrel:Vt,mopen:Ht,mpunct:Ht,minner:Ht}},Gt={mord:{mop:Ht},mop:{mord:Ht,mop:Ht},mbin:{},mrel:{},mopen:{},mclose:{mop:Ht},mpunct:{},minner:{mop:Ht}},Yt={},Wt={},Xt={};function _t(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,i=t.htmlBuilder,o=t.mathmlBuilder,s={type:e,numArgs:a.numArgs,argTypes:a.argTypes,greediness:void 0===a.greediness?1:a.greediness,allowedInText:!!a.allowedInText,allowedInMath:void 0===a.allowedInMath||a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,handler:n},l=0;l<r.length;++l)Yt[r[l]]=s;e&&(i&&(Wt[e]=i),o&&(Xt[e]=o))}function jt(t){_t({type:t.type,names:[],props:{numArgs:0},handler:function(){throw new Error("Should never be called.")},htmlBuilder:t.htmlBuilder,mathmlBuilder:t.mathmlBuilder})}var $t=function(t){return"ordgroup"===t.type?t.body:[t]},Zt=Dt.makeSpan,Kt=["leftmost","mbin","mopen","mrel","mop","mpunct"],Jt=["rightmost","mrel","mclose","mpunct"],Qt={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT},te={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},ee=function(t,e,r,a){void 0===a&&(a=[null,null]);for(var n=[],i=0;i<t.length;i++){var o=oe(t[i],e);if(o instanceof A){var s=o.children;n.push.apply(n,s)}else n.push(o)}if(!r)return n;var l=e;if(1===t.length){var h=t[0];"sizing"===h.type?l=e.havingSize(h.size):"styling"===h.type&&(l=e.havingStyle(Qt[h.style]))}var m=Zt([a[0]||"leftmost"],[],e),u=Zt([a[1]||"rightmost"],[],e),p="root"===r;return re(n,function(t,e){var r=e.classes[0],a=t.classes[0];"mbin"===r&&c.contains(Jt,a)?e.classes[0]="mord":"mbin"===a&&c.contains(Kt,r)&&(t.classes[0]="mord")},{node:m},u,p),re(n,function(t,e){var r=ne(e),a=ne(t),n=r&&a?t.hasClass("mtight")?Gt[r][a]:Ut[r][a]:null;if(n)return Dt.makeGlue(n,l)},{node:m},u,p),n},re=function t(e,r,a,n,i){n&&e.push(n);for(var o=0;o<e.length;o++){var s=e[o],l=ae(s);if(l)t(l.children,r,a,null,i);else{var h=!s.hasClass("mspace");if(h){var m=r(s,a.node);m&&(a.insertAfter?a.insertAfter(m):(e.unshift(m),o++))}h?a.node=s:i&&s.hasClass("newline")&&(a.node=Zt(["leftmost"])),a.insertAfter=function(t){return function(r){e.splice(t+1,0,r),o++}}(o)}}n&&e.pop()},ae=function(t){return t instanceof A||t instanceof I||t instanceof N&&t.hasClass("enclosing")?t:null},ne=function(t,e){return t?(e&&(t=function t(e,r){var a=ae(e);if(a){var n=a.children;if(n.length){if("right"===r)return t(n[n.length-1],"right");if("left"===r)return t(n[0],"left")}}return e}(t,e)),te[t.classes[0]]||null):null},ie=function(t,e){var r=["nulldelimiter"].concat(t.baseSizingClasses());return Zt(e.concat(r))},oe=function(t,e,r){if(!t)return Zt();if(Wt[t.type]){var a=Wt[t.type](t,e);if(r&&e.size!==r.size){a=Zt(e.sizingClasses(r),[a],e);var n=e.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new o("Got group of unknown type: '"+t.type+"'")};function se(t,e){var r=Zt(["base"],t,e),a=Zt(["strut"]);return a.style.height=r.height+r.depth+"em",a.style.verticalAlign=-r.depth+"em",r.children.unshift(a),r}function le(t,e){var r=null;1===t.length&&"tag"===t[0].type&&(r=t[0].tag,t=t[0].body);for(var a,n=ee(t,e,"root"),i=[],o=[],s=0;s<n.length;s++)if(o.push(n[s]),n[s].hasClass("mbin")||n[s].hasClass("mrel")||n[s].hasClass("allowbreak")){for(var l=!1;s<n.length-1&&n[s+1].hasClass("mspace")&&!n[s+1].hasClass("newline");)s++,o.push(n[s]),n[s].hasClass("nobreak")&&(l=!0);l||(i.push(se(o,e)),o=[])}else n[s].hasClass("newline")&&(o.pop(),o.length>0&&(i.push(se(o,e)),o=[]),i.push(n[s]));o.length>0&&i.push(se(o,e)),r&&((a=se(ee(r,e,!0))).classes=["tag"],i.push(a));var h=Zt(["katex-html"],i);if(h.setAttribute("aria-hidden","true"),a){var m=a.children[0];m.style.height=h.height+h.depth+"em",m.style.verticalAlign=-h.depth+"em"}return h}function he(t){return new A(t)}var me=function(){function t(t,e){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=t,this.attributes={},this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.getAttribute=function(t){return this.attributes[t]},e.toNode=function(){var t=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<"+this.type;for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+'="',t+=c.escape(this.attributes[e]),t+='"');t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</"+this.type+">"},e.toText=function(){return this.children.map(function(t){return t.toText()}).join("")},t}(),ce=function(){function t(t){this.text=void 0,this.text=t}var e=t.prototype;return e.toNode=function(){return document.createTextNode(this.text)},e.toMarkup=function(){return c.escape(this.toText())},e.toText=function(){return this.text},t}(),ue={MathNode:me,TextNode:ce,SpaceNode:function(){function t(t){this.width=void 0,this.character=void 0,this.width=t,this.character=t>=.05555&&t<=.05556?"\u200a":t>=.1666&&t<=.1667?"\u2009":t>=.2222&&t<=.2223?"\u2005":t>=.2777&&t<=.2778?"\u2005\u200a":t>=-.05556&&t<=-.05555?"\u200a\u2063":t>=-.1667&&t<=-.1666?"\u2009\u2063":t>=-.2223&&t<=-.2222?"\u205f\u2063":t>=-.2778&&t<=-.2777?"\u2005\u2063":null}var e=t.prototype;return e.toNode=function(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return t.setAttribute("width",this.width+"em"),t},e.toMarkup=function(){return this.character?"<mtext>"+this.character+"</mtext>":'<mspace width="'+this.width+'em"/>'},e.toText=function(){return this.character?this.character:" "},t}(),newDocumentFragment:he},pe=function(t,e,r){return!j[e][t]||!j[e][t].replace||55349===t.charCodeAt(0)||rt.hasOwnProperty(t)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(t=j[e][t].replace),new ue.TextNode(t)},de=function(t){return 1===t.length?t[0]:new ue.MathNode("mrow",t)},fe=function(t,e){if("texttt"===e.fontFamily)return"monospace";if("textsf"===e.fontFamily)return"textit"===e.fontShape&&"textbf"===e.fontWeight?"sans-serif-bold-italic":"textit"===e.fontShape?"sans-serif-italic":"textbf"===e.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===e.fontShape&&"textbf"===e.fontWeight)return"bold-italic";if("textit"===e.fontShape)return"italic";if("textbf"===e.fontWeight)return"bold";var r=e.font;if(!r||"mathnormal"===r)return null;var a=t.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===t.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var n=t.text;return c.contains(["\\imath","\\jmath"],n)?null:(j[a][n]&&j[a][n].replace&&(n=j[a][n].replace),G(n,Dt.fontMap[r].fontName,a)?Dt.fontMap[r].variant:null)},ge=function(t,e,r){if(1===t.length){var a=ve(t[0],e);return r&&a instanceof me&&"mo"===a.type&&(a.setAttribute("lspace","0em"),a.setAttribute("rspace","0em")),[a]}for(var n,i=[],o=0;o<t.length;o++){var s=ve(t[o],e);if(s instanceof me&&n instanceof me){if("mtext"===s.type&&"mtext"===n.type&&s.getAttribute("mathvariant")===n.getAttribute("mathvariant")){var l;(l=n.children).push.apply(l,s.children);continue}if("mn"===s.type&&"mn"===n.type){var h;(h=n.children).push.apply(h,s.children);continue}if("mi"===s.type&&1===s.children.length&&"mn"===n.type){var m=s.children[0];if(m instanceof ce&&"."===m.text){var c;(c=n.children).push.apply(c,s.children);continue}}else if("mi"===n.type&&1===n.children.length){var u=n.children[0];if(u instanceof ce&&"\u0338"===u.text&&("mo"===s.type||"mi"===s.type||"mn"===s.type)){var p=s.children[0];p instanceof ce&&p.text.length>0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),n=s}return i},xe=function(t,e,r){return de(ge(t,e,r))},ve=function(t,e){if(!t)return new ue.MathNode("mrow");if(Xt[t.type])return Xt[t.type](t,e);throw new o("Got group of unknown type: '"+t.type+"'")};function be(t,e,r,a,n){var i,o=ge(t,r);i=1===o.length&&o[0]instanceof me&&c.contains(["mrow","mtable"],o[0].type)?o[0]:new ue.MathNode("mrow",o);var s=new ue.MathNode("annotation",[new ue.TextNode(e)]);s.setAttribute("encoding","application/x-tex");var l=new ue.MathNode("semantics",[i,s]),h=new ue.MathNode("math",[l]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&h.setAttribute("display","block");var m=n?"katex":"katex-mathml";return Dt.makeSpan([m],[h])}var ye=function(t){return new St({style:t.displayMode?w.DISPLAY:w.TEXT,maxSize:t.maxSize,minRuleThickness:t.minRuleThickness})},we=function(t,e){if(e.displayMode){var r=["katex-display"];e.leqno&&r.push("leqno"),e.fleqn&&r.push("fleqn"),t=Dt.makeSpan(r,[t])}return t},ke=function(t,e,r){var a,n=ye(r);if("mathml"===r.output)return be(t,e,n,r.displayMode,!0);if("html"===r.output){var i=le(t,n);a=Dt.makeSpan(["katex"],[i])}else{var o=be(t,e,n,r.displayMode,!1),s=le(t,n);a=Dt.makeSpan(["katex"],[o,s])}return we(a,r)},Se={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb"},Me={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},ze=function(t){return"ordgroup"===t.type?t.body.length:1},Ae=function(t,e,r,a){var n,i=t.height+t.depth+2*r;if(/fbox|color/.test(e)){if(n=Dt.makeSpan(["stretchy",e],[],a),"fbox"===e){var o=a.color&&a.getColor();o&&(n.style.borderColor=o)}}else{var s=[];/^[bx]cancel$/.test(e)&&s.push(new D({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(e)&&s.push(new D({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var l=new L(s,{width:"100%",height:i+"em"});n=Dt.makeSvgSpan([],[l],a)}return n.height=i,n.style.height=i+"em",n},Te=function(t){var e=new ue.MathNode("mo",[new ue.TextNode(Se[t.substr(1)])]);return e.setAttribute("stretchy","true"),e},Be=function(t,e){var r=function(){var r=4e5,a=t.label.substr(1);if(c.contains(["widehat","widecheck","widetilde","utilde"],a)){var n,i,o,s=ze(t.base);if(s>5)"widehat"===a||"widecheck"===a?(n=420,r=2364,o=.42,i=a+"4"):(n=312,r=2340,o=.34,i="tilde4");else{var l=[1,1,2,2,3,3][s];"widehat"===a||"widecheck"===a?(r=[0,1062,2364,2364,2364][l],n=[0,239,300,360,420][l],o=[0,.24,.3,.3,.36,.42][l],i=a+l):(r=[0,600,1033,2339,2340][l],n=[0,260,286,306,312][l],o=[0,.26,.286,.3,.306,.34][l],i="tilde"+l)}var h=new P(i),m=new L([h],{width:"100%",height:o+"em",viewBox:"0 0 "+r+" "+n,preserveAspectRatio:"none"});return{span:Dt.makeSvgSpan([],[m],e),minWidth:0,height:o}}var u,p,d=[],f=Me[a],g=f[0],x=f[1],v=f[2],b=v/1e3,y=g.length;if(1===y)u=["hide-tail"],p=[f[3]];else if(2===y)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==y)throw new Error("Correct katexImagesData or update code here to support\n "+y+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var w=0;w<y;w++){var k=new P(g[w]),S=new L([k],{width:"400em",height:b+"em",viewBox:"0 0 "+r+" "+v,preserveAspectRatio:p[w]+" slice"}),M=Dt.makeSvgSpan([u[w]],[S],e);if(1===y)return{span:M,minWidth:x,height:b};M.style.height=b+"em",d.push(M)}return{span:Dt.makeSpan(["stretchy"],d,e),minWidth:x,height:b}}(),a=r.span,n=r.minWidth,i=r.height;return a.height=i,a.style.height=i+"em",n>0&&(a.style.minWidth=n+"em"),a};function Ce(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function qe(t){var e=Ne(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function Ne(t){return t&&("atom"===t.type||X.hasOwnProperty(t.type))?t:null}var Ie=function(t,e){var r,a,n;t&&"supsub"===t.type?(r=(a=Ce(t.base,"accent")).base,t.base=r,n=function(t){if(t instanceof N)return t;throw new Error("Expected span<HtmlDomNode> but got "+String(t)+".")}(oe(t,e)),t.base=a):r=(a=Ce(t,"accent")).base;var i=oe(r,e.havingCrampedStyle()),o=0;if(a.isShifty&&c.isCharacterBox(r)){var s=c.getBaseElem(r);o=H(oe(s,e.havingCrampedStyle())).skew}var l,h=Math.min(i.height,e.fontMetrics().xHeight);if(a.isStretchy)l=Be(a,e),l=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:l,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+2*o+"em)",marginLeft:2*o+"em"}:void 0}]},e);else{var m,u;"\\vec"===a.label?(m=Dt.staticSvg("vec",e),u=Dt.svgData.vec[1]):((m=H(m=Dt.makeOrd({mode:a.mode,text:a.label},e,"textord"))).italic=0,u=m.width),l=Dt.makeSpan(["accent-body"],[m]);var p="\\textcircled"===a.label;p&&(l.classes.push("accent-full"),h=i.height);var d=o;p||(d-=u/2),l.style.left=d+"em","\\textcircled"===a.label&&(l.style.top=".2em"),l=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-h},{type:"elem",elem:l}]},e)}var f=Dt.makeSpan(["mord","accent"],[l],e);return n?(n.children[0]=f,n.height=Math.max(f.height,n.height),n.classes[0]="mord",n):f},Oe=function(t,e){var r=t.isStretchy?Te(t.label):new ue.MathNode("mo",[pe(t.label,t.mode)]),a=new ue.MathNode("mover",[ve(t.base,e),r]);return a.setAttribute("accent","true"),a},Re=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(t){return"\\"+t}).join("|"));_t({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(t,e){var r=e[0],a=!Re.test(t.funcName),n=!a||"\\widehat"===t.funcName||"\\widetilde"===t.funcName||"\\widecheck"===t.funcName;return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:Ie,mathmlBuilder:Oe}),_t({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=e[0];return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ie,mathmlBuilder:Oe}),_t({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"accentUnder",mode:r.mode,label:a,base:n}},htmlBuilder:function(t,e){var r=oe(t.base,e),a=Be(t,e),n="\\utilde"===t.label?.12:0,i=Dt.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord","accentunder"],[i],e)},mathmlBuilder:function(t,e){var r=Te(t.label),a=new ue.MathNode("munder",[ve(t.base,e),r]);return a.setAttribute("accentunder","true"),a}});var Ee=function(t){var e=new ue.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};_t({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:r[0]}},htmlBuilder:function(t,e){var r,a=e.style,n=e.havingStyle(a.sup()),i=Dt.wrapFragment(oe(t.body,n,e),e);i.classes.push("x-arrow-pad"),t.below&&(n=e.havingStyle(a.sub()),(r=Dt.wrapFragment(oe(t.below,n,e),e)).classes.push("x-arrow-pad"));var o,s=Be(t,e),l=-e.fontMetrics().axisHeight+.5*s.height,h=-e.fontMetrics().axisHeight-.5*s.height-.111;if((i.depth>.25||"\\xleftequilibrium"===t.label)&&(h-=i.depth),r){var m=-e.fontMetrics().axisHeight+r.height+.5*s.height+.111;o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:s,shift:l},{type:"elem",elem:r,shift:m}]},e)}else o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:s,shift:l}]},e);return o.children[0].children[0].children[1].classes.push("svg-align"),Dt.makeSpan(["mrel","x-arrow"],[o],e)},mathmlBuilder:function(t,e){var r,a=Te(t.label);if(t.body){var n=Ee(ve(t.body,e));if(t.below){var i=Ee(ve(t.below,e));r=new ue.MathNode("munderover",[a,i,n])}else r=new ue.MathNode("mover",[a,n])}else if(t.below){var o=Ee(ve(t.below,e));r=new ue.MathNode("munder",[a,o])}else r=Ee(),r=new ue.MathNode("mover",[a,r]);return r}}),_t({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ce(e[0],"ordgroup").body,n="",i=0;i<a.length;i++){n+=Ce(a[i],"textord").text}var s=parseInt(n);if(isNaN(s))throw new o("\\@char has non-numeric argument "+n);return{type:"textord",mode:r.mode,text:String.fromCharCode(s)}}});var Le=function(t,e){var r=ee(t.body,e.withColor(t.color),!1);return Dt.makeFragment(r)},Pe=function(t,e){var r=ge(t.body,e.withColor(t.color)),a=new ue.MathNode("mstyle",r);return a.setAttribute("mathcolor",t.color),a};_t({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","original"]},handler:function(t,e){var r=t.parser,a=Ce(e[0],"color-token").color,n=e[1];return{type:"color",mode:r.mode,color:a,body:$t(n)}},htmlBuilder:Le,mathmlBuilder:Pe}),_t({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,greediness:3,argTypes:["color"]},handler:function(t,e){var r=t.parser,a=t.breakOnTokenText,n=Ce(e[0],"color-token").color;r.gullet.macros.set("\\current@color",n);var i=r.parseExpression(!0,a);return{type:"color",mode:r.mode,color:n,body:i}},htmlBuilder:Le,mathmlBuilder:Pe}),_t({type:"cr",names:["\\cr","\\newline"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=r[0],o="\\cr"===n,s=!1;return o||(s=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode")),{type:"cr",mode:a.mode,newLine:s,newRow:o,size:i&&Ce(i,"size").value}},htmlBuilder:function(t,e){if(t.newRow)throw new o("\\cr valid only within a tabular/array environment");var r=Dt.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=Tt(t.size,e)+"em")),r},mathmlBuilder:function(t,e){var r=new ue.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",Tt(t.size,e)+"em")),r}});var De={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},He=function(t){var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new o("Expected a control sequence",t);return e},Fe=function(t,e,r,a){var n=t.gullet.macros.get(r.text);null==n&&(r.noexpand=!0,n={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,n,a)};_t({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler:function(t){var e=t.parser,r=t.funcName;e.consumeSpaces();var a=e.fetch();if(De[a.text])return"\\global"!==r&&"\\\\globallong"!==r||(a.text=De[a.text]),Ce(e.parseFunction(),"internal");throw new o("Invalid token after macro prefix",a)}}),_t({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0},handler:function(t){var e=t.parser,r=t.funcName,a=e.gullet.consumeArgs(1)[0];if(1!==a.length)throw new o("\\gdef's first argument must be a macro name");var n=a[0].text,i=0;for(a=e.gullet.consumeArgs(1)[0];1===a.length&&"#"===a[0].text;){if(1!==(a=e.gullet.consumeArgs(1)[0]).length)throw new o('Invalid argument number length "'+a.length+'"');if(!/^[1-9]$/.test(a[0].text))throw new o('Invalid argument number "'+a[0].text+'"');if(i++,parseInt(a[0].text)!==i)throw new o('Argument number "'+a[0].text+'" out of order');a=e.gullet.consumeArgs(1)[0]}return"\\edef"!==r&&"\\xdef"!==r||(a=e.gullet.expandTokens(a)).reverse(),e.gullet.macros.set(n,{tokens:a,numArgs:i},r===De[r]),{type:"internal",mode:e.mode}}}),_t({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0},handler:function(t){var e=t.parser,r=t.funcName,a=He(e.gullet.popToken());e.gullet.consumeSpaces();var n=function(t){var e=t.gullet.popToken();return"="===e.text&&" "===(e=t.gullet.popToken()).text&&(e=t.gullet.popToken()),e}(e);return Fe(e,a,n,"\\\\globallet"===r),{type:"internal",mode:e.mode}}}),_t({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0},handler:function(t){var e=t.parser,r=t.funcName,a=He(e.gullet.popToken()),n=e.gullet.popToken(),i=e.gullet.popToken();return Fe(e,a,i,"\\\\globalfuture"===r),e.gullet.pushToken(i),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var Ve=function(t,e,r){var a=G(j.math[t]&&j.math[t].replace||t,e,r);if(!a)throw new Error("Unsupported symbol "+t+" and font size "+e+".");return a},Ue=function(t,e,r,a){var n=r.havingBaseStyle(e),i=Dt.makeSpan(a.concat(n.sizingClasses(r)),[t],r),o=n.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=n.sizeMultiplier,i},Ge=function(t,e,r){var a=e.havingBaseStyle(r),n=(1-e.sizeMultiplier/a.sizeMultiplier)*e.fontMetrics().axisHeight;t.classes.push("delimcenter"),t.style.top=n+"em",t.height-=n,t.depth+=n},Ye=function(t,e,r,a,n,i){var o=function(t,e,r,a){return Dt.makeSymbol(t,"Size"+e+"-Regular",r,a)}(t,e,n,a),s=Ue(Dt.makeSpan(["delimsizing","size"+e],[o],a),w.TEXT,a,i);return r&&Ge(s,a,w.TEXT),s},We=function(t,e,r){var a;return a="Size1-Regular"===e?"delim-size1":"delim-size4",{type:"elem",elem:Dt.makeSpan(["delimsizinginner",a],[Dt.makeSpan([],[Dt.makeSymbol(t,e,r)])])}},Xe={type:"kern",size:-.005},_e=function(t,e,r,a,n,i){var o,s,l,h;o=l=h=t,s=null;var m="Size1-Regular";"\\uparrow"===t?l=h="\u23d0":"\\Uparrow"===t?l=h="\u2016":"\\downarrow"===t?o=l="\u23d0":"\\Downarrow"===t?o=l="\u2016":"\\updownarrow"===t?(o="\\uparrow",l="\u23d0",h="\\downarrow"):"\\Updownarrow"===t?(o="\\Uparrow",l="\u2016",h="\\Downarrow"):"["===t||"\\lbrack"===t?(o="\u23a1",l="\u23a2",h="\u23a3",m="Size4-Regular"):"]"===t||"\\rbrack"===t?(o="\u23a4",l="\u23a5",h="\u23a6",m="Size4-Regular"):"\\lfloor"===t||"\u230a"===t?(l=o="\u23a2",h="\u23a3",m="Size4-Regular"):"\\lceil"===t||"\u2308"===t?(o="\u23a1",l=h="\u23a2",m="Size4-Regular"):"\\rfloor"===t||"\u230b"===t?(l=o="\u23a5",h="\u23a6",m="Size4-Regular"):"\\rceil"===t||"\u2309"===t?(o="\u23a4",l=h="\u23a5",m="Size4-Regular"):"("===t||"\\lparen"===t?(o="\u239b",l="\u239c",h="\u239d",m="Size4-Regular"):")"===t||"\\rparen"===t?(o="\u239e",l="\u239f",h="\u23a0",m="Size4-Regular"):"\\{"===t||"\\lbrace"===t?(o="\u23a7",s="\u23a8",h="\u23a9",l="\u23aa",m="Size4-Regular"):"\\}"===t||"\\rbrace"===t?(o="\u23ab",s="\u23ac",h="\u23ad",l="\u23aa",m="Size4-Regular"):"\\lgroup"===t||"\u27ee"===t?(o="\u23a7",h="\u23a9",l="\u23aa",m="Size4-Regular"):"\\rgroup"===t||"\u27ef"===t?(o="\u23ab",h="\u23ad",l="\u23aa",m="Size4-Regular"):"\\lmoustache"===t||"\u23b0"===t?(o="\u23a7",h="\u23ad",l="\u23aa",m="Size4-Regular"):"\\rmoustache"!==t&&"\u23b1"!==t||(o="\u23ab",h="\u23a9",l="\u23aa",m="Size4-Regular");var c=Ve(o,m,n),u=c.height+c.depth,p=Ve(l,m,n),d=p.height+p.depth,f=Ve(h,m,n),g=f.height+f.depth,x=0,v=1;if(null!==s){var b=Ve(s,m,n);x=b.height+b.depth,v=2}var y=u+g+x,k=Math.max(0,Math.ceil((e-y)/(v*d))),S=y+k*v*d,M=a.fontMetrics().axisHeight;r&&(M*=a.sizeMultiplier);var z=S/2-M,A=.005*(k+1)-d,T=[];if(T.push(We(h,m,n)),null===s)for(var B=0;B<k;B++)T.push(Xe),T.push(We(l,m,n));else{for(var C=0;C<k;C++)T.push(Xe),T.push(We(l,m,n));T.push({type:"kern",size:A}),T.push(We(l,m,n)),T.push(Xe),T.push(We(s,m,n));for(var q=0;q<k;q++)T.push(Xe),T.push(We(l,m,n))}if("\u239c"!==l&&"\u239f"!==l||0!==k)T.push({type:"kern",size:A}),T.push(We(l,m,n)),T.push(Xe);else{var N=Dt.svgData.leftParenInner[2]/2;T.push({type:"kern",size:-N});var I="\u239c"===l?"leftParenInner":"rightParenInner",O=Dt.staticSvg(I,a);T.push({type:"elem",elem:O}),T.push({type:"kern",size:-N})}T.push(We(o,m,n));var R=a.havingBaseStyle(w.TEXT),E=Dt.makeVList({positionType:"bottom",positionData:z,children:T},R);return Ue(Dt.makeSpan(["delimsizing","mult"],[E],R),w.TEXT,a,i)},je=function(t,e,r,a,n){var i=function(t,e,r){e*=1e3;var a="";switch(t){case"sqrtMain":a=function(t,e){return"M95,"+(622+t+e)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+t/2.075+" -"+t+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+t)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+t)+" "+e+"h400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize1":a=function(t,e){return"M263,"+(601+t+e)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+t/2.084+" -"+t+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+t)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+t)+" "+e+"h400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize2":a=function(t,e){return"M983 "+(10+t+e)+"\nl"+t/3.13+" -"+t+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+t)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+t)+" "+e+"h400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize3":a=function(t,e){return"M424,"+(2398+t+e)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+t/4.223+" -"+t+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+t)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+t)+" "+e+"\nh400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize4":a=function(t,e){return"M473,"+(2713+t+e)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+t/5.298+" -"+t+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+t)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+t)+" "+e+"h400000v"+(40+t)+"H1017.7z"}(e,80);break;case"sqrtTall":a=function(t,e,r){return"M702 "+(t+e)+"H400000"+(40+t)+"\nH742v"+(r-54-e-t)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+e+"H400000v"+(40+t)+"H742z"}(e,80,r)}return a}(t,a,r),o=new P(t,i),s=new L([o],{width:"400em",height:e+"em",viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Dt.makeSvgSpan(["hide-tail"],[s],n)},$e=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],Ze=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],Ke=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Je=[0,1.2,1.8,2.4,3],Qe=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],tr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],er=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],rr=function(t){if("small"===t.type)return"Main-Regular";if("large"===t.type)return"Size"+t.size+"-Regular";if("stack"===t.type)return"Size4-Regular";throw new Error("Add support for delim type '"+t.type+"' here.")},ar=function(t,e,r,a){for(var n=Math.min(2,3-a.style.size);n<r.length&&"stack"!==r[n].type;n++){var i=Ve(t,rr(r[n]),"math"),o=i.height+i.depth;if("small"===r[n].type&&(o*=a.havingBaseStyle(r[n].style).sizeMultiplier),o>e)return r[n]}return r[r.length-1]},nr=function(t,e,r,a,n,i){var o;"<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),o=c.contains(Ke,t)?Qe:c.contains($e,t)?er:tr;var s=ar(t,e,o,a);return"small"===s.type?function(t,e,r,a,n,i){var o=Dt.makeSymbol(t,"Main-Regular",n,a),s=Ue(o,e,a,i);return r&&Ge(s,a,e),s}(t,s.style,r,a,n,i):"large"===s.type?Ye(t,s.size,r,a,n,i):_e(t,e,r,a,n,i)},ir=function(t,e){var r,a,n=e.havingBaseSizing(),i=ar("\\surd",t*n.sizeMultiplier,er,n),o=n.sizeMultiplier,s=Math.max(0,e.minRuleThickness-e.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(t<1?o=1:t<1.4&&(o=.7),h=(1+s)/o,(r=je("sqrtMain",l=(1+s+.08)/o,m=1e3+1e3*s+80,s,e)).style.minWidth="0.853em",a=.833/o):"large"===i.type?(m=1080*Je[i.size],h=(Je[i.size]+s)/o,l=(Je[i.size]+s+.08)/o,(r=je("sqrtSize"+i.size,l,m,s,e)).style.minWidth="1.02em",a=1/o):(l=t+s+.08,h=t+s,m=Math.floor(1e3*t+s)+80,(r=je("sqrtTall",l,m,s,e)).style.minWidth="0.742em",a=1.056),r.height=h,r.style.height=l+"em",{span:r,advanceWidth:a,ruleWidth:(e.fontMetrics().sqrtRuleThickness+s)*o}},or=function(t,e,r,a,n){if("<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),c.contains($e,t)||c.contains(Ke,t))return Ye(t,e,!1,r,a,n);if(c.contains(Ze,t))return _e(t,Je[e],!1,r,a,n);throw new o("Illegal delimiter: '"+t+"'")},sr=nr,lr=function(t,e,r,a,n,i){var o=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,l=Math.max(e-o,r+o),h=Math.max(l/500*901,2*l-s);return nr(t,h,!0,a,n,i)},hr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},mr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function cr(t,e){var r=Ne(t);if(r&&c.contains(mr,r.text))return r;throw new o(r?"Invalid delimiter '"+r.text+"' after '"+e.funcName+"'":"Invalid delimiter type '"+t.type+"'",t)}function ur(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}_t({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:hr[t.funcName].size,mclass:hr[t.funcName].mclass,delim:r.text}},htmlBuilder:function(t,e){return"."===t.delim?Dt.makeSpan([t.mclass]):or(t.delim,t.size,e,t.mode,[t.mclass])},mathmlBuilder:function(t){var e=[];"."!==t.delim&&e.push(pe(t.delim,t.mode));var r=new ue.MathNode("mo",e);return"mopen"===t.mclass||"mclose"===t.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r}}),_t({type:"leftright-right",names:["\\right"],props:{numArgs:1},handler:function(t,e){var r=t.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new o("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:cr(e[0],t).text,color:r}}}),_t({type:"leftright",names:["\\left"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t),a=t.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var i=Ce(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(t,e){ur(t);for(var r,a,n=ee(t.body,e,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l<n.length;l++)n[l].isMiddle?s=!0:(i=Math.max(n[l].height,i),o=Math.max(n[l].depth,o));if(i*=e.sizeMultiplier,o*=e.sizeMultiplier,r="."===t.left?ie(e,["mopen"]):lr(t.left,i,o,e,t.mode,["mopen"]),n.unshift(r),s)for(var h=1;h<n.length;h++){var m=n[h].isMiddle;m&&(n[h]=lr(m.delim,i,o,m.options,t.mode,[]))}if("."===t.right)a=ie(e,["mclose"]);else{var c=t.rightColor?e.withColor(t.rightColor):e;a=lr(t.right,i,o,c,t.mode,["mclose"])}return n.push(a),Dt.makeSpan(["minner"],n,e)},mathmlBuilder:function(t,e){ur(t);var r=ge(t.body,e);if("."!==t.left){var a=new ue.MathNode("mo",[pe(t.left,t.mode)]);a.setAttribute("fence","true"),r.unshift(a)}if("."!==t.right){var n=new ue.MathNode("mo",[pe(t.right,t.mode)]);n.setAttribute("fence","true"),t.rightColor&&n.setAttribute("mathcolor",t.rightColor),r.push(n)}return de(r)}}),_t({type:"middle",names:["\\middle"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t);if(!t.parser.leftrightDepth)throw new o("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},htmlBuilder:function(t,e){var r;if("."===t.delim)r=ie(e,[]);else{r=or(t.delim,1,e,t.mode,[]);var a={delim:t.delim,options:e};r.isMiddle=a}return r},mathmlBuilder:function(t,e){var r="\\vert"===t.delim||"|"===t.delim?pe("|","text"):pe(t.delim,t.mode),a=new ue.MathNode("mo",[r]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var pr=function(t,e){var r,a,n=Dt.wrapFragment(oe(t.body,e),e),i=t.label.substr(1),o=e.sizeMultiplier,s=0,l=c.isCharacterBox(t.body);if("sout"===i)(r=Dt.makeSpan(["stretchy","sout"])).height=e.fontMetrics().defaultRuleThickness/o,s=-.5*e.fontMetrics().xHeight;else{/cancel/.test(i)?l||n.classes.push("cancel-pad"):n.classes.push("boxpad");var h=0,m=0;/box/.test(i)?(m=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),h=e.fontMetrics().fboxsep+("colorbox"===i?0:m)):h=l?.2:0,r=Ae(n,i,h,e),/fbox|boxed|fcolorbox/.test(i)&&(r.style.borderStyle="solid",r.style.borderWidth=m+"em"),s=n.depth+h,t.backgroundColor&&(r.style.backgroundColor=t.backgroundColor,t.borderColor&&(r.style.borderColor=t.borderColor))}return a=t.backgroundColor?Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:s},{type:"elem",elem:n,shift:0}]},e):Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:0},{type:"elem",elem:r,shift:s,wrapperClasses:/cancel/.test(i)?["svg-align"]:[]}]},e),/cancel/.test(i)&&(a.height=n.height,a.depth=n.depth),/cancel/.test(i)&&!l?Dt.makeSpan(["mord","cancel-lap"],[a],e):Dt.makeSpan(["mord"],[a],e)},dr=function(t,e){var r=0,a=new ue.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[ve(t.body,e)]);switch(t.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*r+"pt"),a.setAttribute("height","+"+2*r+"pt"),a.setAttribute("lspace",r+"pt"),a.setAttribute("voffset",r+"pt"),"\\fcolorbox"===t.label){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(t.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return t.backgroundColor&&a.setAttribute("mathbackground",t.backgroundColor),a};_t({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=Ce(e[0],"color-token").color,o=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:i,body:o}},htmlBuilder:pr,mathmlBuilder:dr}),_t({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:["color","color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=Ce(e[0],"color-token").color,o=Ce(e[1],"color-token").color,s=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:pr,mathmlBuilder:dr}),_t({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(t,e){return{type:"enclose",mode:t.parser.mode,label:"\\fbox",body:e[0]}}}),_t({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout"],props:{numArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=e[0];return{type:"enclose",mode:a.mode,label:n,body:i}},htmlBuilder:pr,mathmlBuilder:dr});var fr={};function gr(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,i=t.htmlBuilder,o=t.mathmlBuilder,s={type:e,numArgs:a.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:n},l=0;l<r.length;++l)fr[r[l]]=s;i&&(Wt[e]=i),o&&(Xt[e]=o)}function xr(t){var e=[];t.consumeSpaces();for(var r=t.fetch().text;"\\hline"===r||"\\hdashline"===r;)t.consume(),e.push("\\hdashline"===r),t.consumeSpaces(),r=t.fetch().text;return e}function vr(t,e,r){var a=e.hskipBeforeAndAfter,n=e.addJot,i=e.cols,s=e.arraystretch,l=e.colSeparationType;if(t.gullet.beginGroup(),t.gullet.macros.set("\\\\","\\cr"),!s){var h=t.gullet.expandMacroAsText("\\arraystretch");if(null==h)s=1;else if(!(s=parseFloat(h))||s<0)throw new o("Invalid \\arraystretch: "+h)}t.gullet.beginGroup();var m=[],c=[m],u=[],p=[];for(p.push(xr(t));;){var d=t.parseExpression(!1,"\\cr");t.gullet.endGroup(),t.gullet.beginGroup(),d={type:"ordgroup",mode:t.mode,body:d},r&&(d={type:"styling",mode:t.mode,style:r,body:[d]}),m.push(d);var f=t.fetch().text;if("&"===f)t.consume();else{if("\\end"===f){1===m.length&&"styling"===d.type&&0===d.body[0].body.length&&c.pop(),p.length<c.length+1&&p.push([]);break}if("\\cr"!==f)throw new o("Expected & or \\\\ or \\cr or \\end",t.nextToken);var g=Ce(t.parseFunction(),"cr");u.push(g.size),p.push(xr(t)),m=[],c.push(m)}}return t.gullet.endGroup(),t.gullet.endGroup(),{type:"array",mode:t.mode,addJot:n,arraystretch:s,body:c,cols:i,rowGaps:u,hskipBeforeAndAfter:a,hLinesBeforeRow:p,colSeparationType:l}}function br(t){return"d"===t.substr(0,1)?"display":"text"}var yr=function(t,e){var r,a,n=t.body.length,i=t.hLinesBeforeRow,s=0,l=new Array(n),h=[],m=Math.max(e.fontMetrics().arrayRuleWidth,e.minRuleThickness),u=1/e.fontMetrics().ptPerEm,p=5*u;t.colSeparationType&&"small"===t.colSeparationType&&(p=e.havingStyle(w.SCRIPT).sizeMultiplier/e.sizeMultiplier*.2778);var d=12*u,f=3*u,g=t.arraystretch*d,x=.7*g,v=.3*g,b=0;function y(t){for(var e=0;e<t.length;++e)e>0&&(b+=.25),h.push({pos:b,isDashed:t[e]})}for(y(i[0]),r=0;r<t.body.length;++r){var k=t.body[r],S=x,M=v;s<k.length&&(s=k.length);var z=new Array(k.length);for(a=0;a<k.length;++a){var A=oe(k[a],e);M<A.depth&&(M=A.depth),S<A.height&&(S=A.height),z[a]=A}var T=t.rowGaps[r],B=0;T&&(B=Tt(T,e))>0&&(M<(B+=v)&&(M=B),B=0),t.addJot&&(M+=f),z.height=S,z.depth=M,b+=S,z.pos=b,b+=M+B,l[r]=z,y(i[r+1])}var C,q,N=b/2+e.fontMetrics().axisHeight,I=t.cols||[],O=[];for(a=0,q=0;a<s||q<I.length;++a,++q){for(var R=I[q]||{},E=!0;"separator"===R.type;){if(E||((C=Dt.makeSpan(["arraycolsep"],[])).style.width=e.fontMetrics().doubleRuleSep+"em",O.push(C)),"|"!==R.separator&&":"!==R.separator)throw new o("Invalid separator type: "+R.separator);var L="|"===R.separator?"solid":"dashed",P=Dt.makeSpan(["vertical-separator"],[],e);P.style.height=b+"em",P.style.borderRightWidth=m+"em",P.style.borderRightStyle=L,P.style.margin="0 -"+m/2+"em",P.style.verticalAlign=-(b-N)+"em",O.push(P),R=I[++q]||{},E=!1}if(!(a>=s)){var D=void 0;(a>0||t.hskipBeforeAndAfter)&&0!==(D=c.deflt(R.pregap,p))&&((C=Dt.makeSpan(["arraycolsep"],[])).style.width=D+"em",O.push(C));var H=[];for(r=0;r<n;++r){var F=l[r],V=F[a];if(V){var U=F.pos-N;V.depth=F.depth,V.height=F.height,H.push({type:"elem",elem:V,shift:U})}}H=Dt.makeVList({positionType:"individualShift",children:H},e),H=Dt.makeSpan(["col-align-"+(R.align||"c")],[H]),O.push(H),(a<s-1||t.hskipBeforeAndAfter)&&0!==(D=c.deflt(R.postgap,p))&&((C=Dt.makeSpan(["arraycolsep"],[])).style.width=D+"em",O.push(C))}}if(l=Dt.makeSpan(["mtable"],O),h.length>0){for(var G=Dt.makeLineSpan("hline",e,m),Y=Dt.makeLineSpan("hdashline",e,m),W=[{type:"elem",elem:l,shift:0}];h.length>0;){var X=h.pop(),_=X.pos-N;X.isDashed?W.push({type:"elem",elem:Y,shift:_}):W.push({type:"elem",elem:G,shift:_})}l=Dt.makeVList({positionType:"individualShift",children:W},e)}return Dt.makeSpan(["mord"],[l],e)},wr={c:"center ",l:"left ",r:"right "},kr=function(t,e){var r=new ue.MathNode("mtable",t.body.map(function(t){return new ue.MathNode("mtr",t.map(function(t){return new ue.MathNode("mtd",[ve(t,e)])}))})),a=.5===t.arraystretch?.1:.16+t.arraystretch-1+(t.addJot?.09:0);r.setAttribute("rowspacing",a+"em");var n="",i="";if(t.cols&&t.cols.length>0){var o=t.cols,s="",l=!1,h=0,m=o.length;"separator"===o[0].type&&(n+="top ",h=1),"separator"===o[o.length-1].type&&(n+="bottom ",m-=1);for(var c=h;c<m;c++)"align"===o[c].type?(i+=wr[o[c].align],l&&(s+="none "),l=!0):"separator"===o[c].type&&l&&(s+="|"===o[c].separator?"solid ":"dashed ",l=!1);r.setAttribute("columnalign",i.trim()),/[sd]/.test(s)&&r.setAttribute("columnlines",s.trim())}if("align"===t.colSeparationType){for(var u=t.cols||[],p="",d=1;d<u.length;d++)p+=d%2?"0em ":"1em ";r.setAttribute("columnspacing",p.trim())}else"alignat"===t.colSeparationType?r.setAttribute("columnspacing","0em"):"small"===t.colSeparationType?r.setAttribute("columnspacing","0.2778em"):r.setAttribute("columnspacing","1em");var f="",g=t.hLinesBeforeRow;n+=g[0].length>0?"left ":"",n+=g[g.length-1].length>0?"right ":"";for(var x=1;x<g.length-1;x++)f+=0===g[x].length?"none ":g[x][0]?"dashed ":"solid ";return/[sd]/.test(f)&&r.setAttribute("rowlines",f.trim()),""!==n&&(r=new ue.MathNode("menclose",[r])).setAttribute("notation",n.trim()),t.arraystretch&&t.arraystretch<1&&(r=new ue.MathNode("mstyle",[r])).setAttribute("scriptlevel","1"),r},Sr=function(t,e){var r,a=[],n=vr(t.parser,{cols:a,addJot:!0},"display"),i=0,s={type:"ordgroup",mode:t.mode,body:[]};if(e[0]&&"ordgroup"===e[0].type){for(var l="",h=0;h<e[0].body.length;h++){l+=Ce(e[0].body[h],"textord").text}r=Number(l),i=2*r}var m=!i;n.body.forEach(function(t){for(var e=1;e<t.length;e+=2){var a=Ce(t[e],"styling");Ce(a.body[0],"ordgroup").body.unshift(s)}if(m)i<t.length&&(i=t.length);else{var n=t.length/2;if(r<n)throw new o("Too many math in a row: expected "+r+", but got "+n,t[0])}});for(var c=0;c<i;++c){var u="r",p=0;c%2==1?u="l":c>0&&m&&(p=1),a[c]={type:"align",align:u,pregap:p,postgap:0}}return n.colSeparationType=m?"align":"alignat",n};gr({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(t,e){var r={cols:(Ne(e[0])?[e[0]]:Ce(e[0],"ordgroup").body).map(function(t){var e=qe(t).text;if(-1!=="lcr".indexOf(e))return{type:"align",align:e};if("|"===e)return{type:"separator",separator:"|"};if(":"===e)return{type:"separator",separator:":"};throw new o("Unknown column alignment: "+e,t)}),hskipBeforeAndAfter:!0};return vr(t.parser,r,br(t.envName))},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],props:{numArgs:0},handler:function(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName],r=vr(t.parser,{hskipBeforeAndAfter:!1},br(t.envName));return e?{type:"leftright",mode:t.mode,body:[r],left:e[0],right:e[1],rightColor:void 0}:r},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(t){var e=vr(t.parser,{arraystretch:.5},"script");return e.colSeparationType="small",e},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["subarray"],props:{numArgs:1},handler:function(t,e){var r=(Ne(e[0])?[e[0]]:Ce(e[0],"ordgroup").body).map(function(t){var e=qe(t).text;if(-1!=="lc".indexOf(e))return{type:"align",align:e};throw new o("Unknown column alignment: "+e,t)});if(r.length>1)throw new o("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=vr(t.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new o("{subarray} can contain only one column");return a},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(t){var e=vr(t.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},br(t.envName));return{type:"leftright",mode:t.mode,body:[e],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["aligned"],props:{numArgs:0},handler:Sr,htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["gathered"],props:{numArgs:0},handler:function(t){return vr(t.parser,{cols:[{type:"align",align:"c"}],addJot:!0},"display")},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["alignedat"],props:{numArgs:1},handler:Sr,htmlBuilder:yr,mathmlBuilder:kr}),_t({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(t,e){throw new o(t.funcName+" valid only within array environment")}});var Mr=fr;_t({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];if("ordgroup"!==n.type)throw new o("Invalid environment name",n);for(var i="",s=0;s<n.body.length;++s)i+=Ce(n.body[s],"textord").text;if("\\begin"===a){if(!Mr.hasOwnProperty(i))throw new o("No such environment: "+i,n);var l=Mr[i],h=r.parseArguments("\\begin{"+i+"}",l),m=h.args,c=h.optArgs,u={mode:r.mode,envName:i,parser:r},p=l.handler(u,m,c);r.expect("\\end",!1);var d=r.nextToken,f=Ce(r.parseFunction(),"environment");if(f.name!==i)throw new o("Mismatch: \\begin{"+i+"} matched by \\end{"+f.name+"}",d);return p}return{type:"environment",mode:r.mode,name:i,nameGroup:n}}});var zr=Dt.makeSpan;function Ar(t,e){var r=ee(t.body,e,!0);return zr([t.mclass],r,e)}function Tr(t,e){var r,a=ge(t.body,e);return"minner"===t.mclass?ue.newDocumentFragment(a):("mord"===t.mclass?t.isCharacterBox?(r=a[0]).type="mi":r=new ue.MathNode("mi",a):(t.isCharacterBox?(r=a[0]).type="mo":r=new ue.MathNode("mo",a),"mbin"===t.mclass?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):"mpunct"===t.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):"mopen"!==t.mclass&&"mclose"!==t.mclass||(r.attributes.lspace="0em",r.attributes.rspace="0em")),r)}_t({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+a.substr(5),body:$t(n),isCharacterBox:c.isCharacterBox(n)}},htmlBuilder:Ar,mathmlBuilder:Tr});var Br=function(t){var e="ordgroup"===t.type&&t.body.length?t.body[0]:t;return"atom"!==e.type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family};_t({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:function(t,e){return{type:"mclass",mode:t.parser.mode,mclass:Br(e[0]),body:[e[1]],isCharacterBox:c.isCharacterBox(e[1])}}}),_t({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,i=e[1],o=e[0];r="\\stackrel"!==n?Br(i):"mrel";var s={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:$t(i)},l={type:"supsub",mode:o.mode,base:s,sup:"\\underset"===n?null:o,sub:"\\underset"===n?o:null};return{type:"mclass",mode:a.mode,mclass:r,body:[l],isCharacterBox:c.isCharacterBox(l)}},htmlBuilder:Ar,mathmlBuilder:Tr});var Cr=function(t,e){var r=t.font,a=e.withFont(r);return oe(t.body,a)},qr=function(t,e){var r=t.font,a=e.withFont(r);return ve(t.body,a)},Nr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};_t({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0],i=a;return i in Nr&&(i=Nr[i]),{type:"font",mode:r.mode,font:i.slice(1),body:n}},htmlBuilder:Cr,mathmlBuilder:qr}),_t({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=e[0],n=c.isCharacterBox(a);return{type:"mclass",mode:r.mode,mclass:Br(a),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:a}],isCharacterBox:n}}}),_t({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=t.breakOnTokenText,i=r.mode,o=r.parseExpression(!0,n);return{type:"font",mode:i,font:"math"+a.slice(1),body:{type:"ordgroup",mode:r.mode,body:o}}},htmlBuilder:Cr,mathmlBuilder:qr});var Ir=function(t,e){var r=e;return"display"===t?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:"text"===t&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===t?r=w.SCRIPT:"scriptscript"===t&&(r=w.SCRIPTSCRIPT),r},Or=function(t,e){var r,a=Ir(t.size,e.style),n=a.fracNum(),i=a.fracDen();r=e.havingStyle(n);var o=oe(t.numer,r,e);if(t.continued){var s=8.5/e.fontMetrics().ptPerEm,l=3.5/e.fontMetrics().ptPerEm;o.height=o.height<s?s:o.height,o.depth=o.depth<l?l:o.depth}r=e.havingStyle(i);var h,m,c,u,p,d,f,g,x,v,b=oe(t.denom,r,e);if(t.hasBarLine?(t.barSize?(m=Tt(t.barSize,e),h=Dt.makeLineSpan("frac-line",e,m)):h=Dt.makeLineSpan("frac-line",e),m=h.height,c=h.height):(h=null,m=0,c=e.fontMetrics().defaultRuleThickness),a.size===w.DISPLAY.size||"display"===t.size?(u=e.fontMetrics().num1,p=m>0?3*c:7*c,d=e.fontMetrics().denom1):(m>0?(u=e.fontMetrics().num2,p=c):(u=e.fontMetrics().num3,p=3*c),d=e.fontMetrics().denom2),h){var y=e.fontMetrics().axisHeight;u-o.depth-(y+.5*m)<p&&(u+=p-(u-o.depth-(y+.5*m))),y-.5*m-(b.height-d)<p&&(d+=p-(y-.5*m-(b.height-d)));var k=-(y-.5*m);f=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:d},{type:"elem",elem:h,shift:k},{type:"elem",elem:o,shift:-u}]},e)}else{var S=u-o.depth-(b.height-d);S<p&&(u+=.5*(p-S),d+=.5*(p-S)),f=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:d},{type:"elem",elem:o,shift:-u}]},e)}return r=e.havingStyle(a),f.height*=r.sizeMultiplier/e.sizeMultiplier,f.depth*=r.sizeMultiplier/e.sizeMultiplier,g=a.size===w.DISPLAY.size?e.fontMetrics().delim1:e.fontMetrics().delim2,x=null==t.leftDelim?ie(e,["mopen"]):sr(t.leftDelim,g,!0,e.havingStyle(a),t.mode,["mopen"]),v=t.continued?Dt.makeSpan([]):null==t.rightDelim?ie(e,["mclose"]):sr(t.rightDelim,g,!0,e.havingStyle(a),t.mode,["mclose"]),Dt.makeSpan(["mord"].concat(r.sizingClasses(e)),[x,Dt.makeSpan(["mfrac"],[f]),v],e)},Rr=function(t,e){var r=new ue.MathNode("mfrac",[ve(t.numer,e),ve(t.denom,e)]);if(t.hasBarLine){if(t.barSize){var a=Tt(t.barSize,e);r.setAttribute("linethickness",a+"em")}}else r.setAttribute("linethickness","0px");var n=Ir(t.size,e.style);if(n.size!==e.style.size){r=new ue.MathNode("mstyle",[r]);var i=n.size===w.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",i),r.setAttribute("scriptlevel","0")}if(null!=t.leftDelim||null!=t.rightDelim){var o=[];if(null!=t.leftDelim){var s=new ue.MathNode("mo",[new ue.TextNode(t.leftDelim.replace("\\",""))]);s.setAttribute("fence","true"),o.push(s)}if(o.push(r),null!=t.rightDelim){var l=new ue.MathNode("mo",[new ue.TextNode(t.rightDelim.replace("\\",""))]);l.setAttribute("fence","true"),o.push(l)}return de(o)}return r};_t({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,greediness:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,i=e[0],o=e[1],s=null,l=null,h="auto";switch(n){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,s="(",l=")";break;case"\\\\bracefrac":r=!1,s="\\{",l="\\}";break;case"\\\\brackfrac":r=!1,s="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\cfrac":case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text"}return{type:"genfrac",mode:a.mode,continued:"\\cfrac"===n,numer:i,denom:o,hasBarLine:r,leftDelim:s,rightDelim:l,size:h,barSize:null}},htmlBuilder:Or,mathmlBuilder:Rr}),_t({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler:function(t){var e,r=t.parser,a=t.funcName,n=t.token;switch(a){case"\\over":e="\\frac";break;case"\\choose":e="\\binom";break;case"\\atop":e="\\\\atopfrac";break;case"\\brace":e="\\\\bracefrac";break;case"\\brack":e="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:e,token:n}}});var Er=["display","text","script","scriptscript"],Lr=function(t){var e=null;return t.length>0&&(e="."===(e=t)?null:e),e};_t({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,greediness:6,argTypes:["math","math","size","text","math","math"]},handler:function(t,e){var r,a=t.parser,n=e[4],i=e[5],o="atom"===e[0].type&&"open"===e[0].family?Lr(e[0].text):null,s="atom"===e[1].type&&"close"===e[1].family?Lr(e[1].text):null,l=Ce(e[2],"size"),h=null;r=!!l.isBlank||(h=l.value).number>0;var m="auto",c=e[3];if("ordgroup"===c.type){if(c.body.length>0){var u=Ce(c.body[0],"textord");m=Er[Number(u.text)]}}else c=Ce(c,"textord"),m=Er[Number(c.text)];return{type:"genfrac",mode:a.mode,numer:n,denom:i,continued:!1,hasBarLine:r,barSize:h,leftDelim:o,rightDelim:s,size:m}},htmlBuilder:Or,mathmlBuilder:Rr}),_t({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(t,e){var r=t.parser,a=(t.funcName,t.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ce(e[0],"size").value,token:a}}}),_t({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(t,e){var r=t.parser,a=(t.funcName,e[0]),n=function(t){if(!t)throw new Error("Expected non-null, but got "+String(t));return t}(Ce(e[1],"infix").size),i=e[2],o=n.number>0;return{type:"genfrac",mode:r.mode,numer:a,denom:i,continued:!1,hasBarLine:o,barSize:n,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Or,mathmlBuilder:Rr});var Pr=function(t,e){var r,a,n=e.style;"supsub"===t.type?(r=t.sup?oe(t.sup,e.havingStyle(n.sup()),e):oe(t.sub,e.havingStyle(n.sub()),e),a=Ce(t.base,"horizBrace")):a=Ce(t,"horizBrace");var i,o=oe(a.base,e.havingBaseStyle(w.DISPLAY)),s=Be(a,e);if(a.isOver?(i=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},e)).children[0].children[0].children[1].classes.push("svg-align"):(i=Dt.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},e)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Dt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e);i=a.isOver?Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},e):Dt.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},e)}return Dt.makeSpan(["mord",a.isOver?"mover":"munder"],[i],e)};_t({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName;return{type:"horizBrace",mode:r.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:Pr,mathmlBuilder:function(t,e){var r=Te(t.label);return new ue.MathNode(t.isOver?"mover":"munder",[ve(t.base,e),r])}}),_t({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[1],n=Ce(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:r.mode,href:n,body:$t(a)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(t,e){var r=ee(t.body,e,!1);return Dt.makeAnchor(t.href,[],r,e)},mathmlBuilder:function(t,e){var r=xe(t.body,e);return r instanceof me||(r=new me("mrow",[r])),r.setAttribute("href",t.href),r}}),_t({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ce(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:a}))return r.formatUnsupportedCmd("\\url");for(var n=[],i=0;i<a.length;i++){var o=a[i];"~"===o&&(o="\\textasciitilde"),n.push({type:"textord",mode:"text",text:o})}var s={type:"text",mode:r.mode,font:"\\texttt",body:n};return{type:"href",mode:r.mode,href:a,body:$t(s)}}}),_t({type:"html",names:["\\htmlClass","\\htmlId","\\htmlStyle","\\htmlData"],props:{numArgs:2,argTypes:["raw","original"],allowedInText:!0},handler:function(t,e){var r,a=t.parser,n=t.funcName,i=(t.token,Ce(e[0],"raw").string),s=e[1];a.settings.strict&&a.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var l={};switch(n){case"\\htmlClass":l.class=i,r={command:"\\htmlClass",class:i};break;case"\\htmlId":l.id=i,r={command:"\\htmlId",id:i};break;case"\\htmlStyle":l.style=i,r={command:"\\htmlStyle",style:i};break;case"\\htmlData":for(var h=i.split(","),m=0;m<h.length;m++){var c=h[m].split("=");if(2!==c.length)throw new o("Error parsing key-value for \\htmlData");l["data-"+c[0].trim()]=c[1].trim()}r={command:"\\htmlData",attributes:l};break;default:throw new Error("Unrecognized html command")}return a.settings.isTrusted(r)?{type:"html",mode:a.mode,attributes:l,body:$t(s)}:a.formatUnsupportedCmd(n)},htmlBuilder:function(t,e){var r=ee(t.body,e,!1),a=["enclosing"];t.attributes.class&&a.push.apply(a,t.attributes.class.trim().split(/\s+/));var n=Dt.makeSpan(a,r,e);for(var i in t.attributes)"class"!==i&&t.attributes.hasOwnProperty(i)&&n.setAttribute(i,t.attributes[i]);return n},mathmlBuilder:function(t,e){return xe(t.body,e)}}),_t({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:function(t,e){return{type:"htmlmathml",mode:t.parser.mode,html:$t(e[0]),mathml:$t(e[1])}},htmlBuilder:function(t,e){var r=ee(t.html,e,!1);return Dt.makeFragment(r)},mathmlBuilder:function(t,e){return xe(t.mathml,e)}});var Dr=function(t){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(t))return{number:+t,unit:"bp"};var e=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t);if(!e)throw new o("Invalid size: '"+t+"' in \\includegraphics");var r={number:+(e[1]+e[2]),unit:e[3]};if(!At(r))throw new o("Invalid unit: '"+r.unit+"' in \\includegraphics.");return r};_t({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:function(t,e,r){var a=t.parser,n={number:0,unit:"em"},i={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var h=Ce(r[0],"raw").string.split(","),m=0;m<h.length;m++){var c=h[m].split("=");if(2===c.length){var u=c[1].trim();switch(c[0].trim()){case"alt":l=u;break;case"width":n=Dr(u);break;case"height":i=Dr(u);break;case"totalheight":s=Dr(u);break;default:throw new o("Invalid key: '"+c[0]+"' in \\includegraphics.")}}}var p=Ce(e[0],"url").url;return""===l&&(l=(l=(l=p).replace(/^.*[\\/]/,"")).substring(0,l.lastIndexOf("."))),a.settings.isTrusted({command:"\\includegraphics",url:p})?{type:"includegraphics",mode:a.mode,alt:l,width:n,height:i,totalheight:s,src:p}:a.formatUnsupportedCmd("\\includegraphics")},htmlBuilder:function(t,e){var r=Tt(t.height,e),a=0;t.totalheight.number>0&&(a=Tt(t.totalheight,e)-r,a=Number(a.toFixed(2)));var n=0;t.width.number>0&&(n=Tt(t.width,e));var i={height:r+a+"em"};n>0&&(i.width=n+"em"),a>0&&(i.verticalAlign=-a+"em");var o=new O(t.src,t.alt,i);return o.height=r,o.depth=a,o},mathmlBuilder:function(t,e){var r=new ue.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var a=Tt(t.height,e),n=0;if(t.totalheight.number>0&&(n=(n=Tt(t.totalheight,e)-a).toFixed(2),r.setAttribute("valign","-"+n+"em")),r.setAttribute("height",a+n+"em"),t.width.number>0){var i=Tt(t.width,e);r.setAttribute("width",i+"em")}return r.setAttribute("src",t.src),r}}),_t({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=Ce(e[0],"size");if(r.settings.strict){var i="m"===a[1],o="mu"===n.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, not "+n.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:n.value}},htmlBuilder:function(t,e){return Dt.makeGlue(t.dimension,e)},mathmlBuilder:function(t,e){var r=Tt(t.dimension,e);return new ue.SpaceNode(r)}}),_t({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"lap",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:function(t,e){var r;"clap"===t.alignment?(r=Dt.makeSpan([],[oe(t.body,e)]),r=Dt.makeSpan(["inner"],[r],e)):r=Dt.makeSpan(["inner"],[oe(t.body,e)]);var a=Dt.makeSpan(["fix"],[]),n=Dt.makeSpan([t.alignment],[r,a],e),i=Dt.makeSpan(["strut"]);return i.style.height=n.height+n.depth+"em",i.style.verticalAlign=-n.depth+"em",n.children.unshift(i),n=Dt.makeSpan(["thinbox"],[n],e),Dt.makeSpan(["mord","vbox"],[n],e)},mathmlBuilder:function(t,e){var r=new ue.MathNode("mpadded",[ve(t.body,e)]);if("rlap"!==t.alignment){var a="llap"===t.alignment?"-1":"-0.5";r.setAttribute("lspace",a+"width")}return r.setAttribute("width","0px"),r}}),_t({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=t.funcName,a=t.parser,n=a.mode;a.switchMode("math");var i="\\("===r?"\\)":"$",o=a.parseExpression(!1,i);return a.expect(i),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:o}}}),_t({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){throw new o("Mismatched "+t.funcName)}});var Hr=function(t,e){switch(e.style.size){case w.DISPLAY.size:return t.display;case w.TEXT.size:return t.text;case w.SCRIPT.size:return t.script;case w.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};_t({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4},handler:function(t,e){return{type:"mathchoice",mode:t.parser.mode,display:$t(e[0]),text:$t(e[1]),script:$t(e[2]),scriptscript:$t(e[3])}},htmlBuilder:function(t,e){var r=Hr(t,e),a=ee(r,e,!1);return Dt.makeFragment(a)},mathmlBuilder:function(t,e){var r=Hr(t,e);return xe(r,e)}});var Fr=function(t,e,r,a,n,i,o){var s,l,h;if(t=Dt.makeSpan([],[t]),e){var m=oe(e,a.havingStyle(n.sup()),a);l={elem:m,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-m.depth)}}if(r){var c=oe(r,a.havingStyle(n.sub()),a);s={elem:c,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-c.height)}}if(l&&s){var u=a.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+t.depth+o;h=Dt.makeVList({positionType:"bottom",positionData:u,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:t},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:i+"em"},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(s){var p=t.height-o;h=Dt.makeVList({positionType:"top",positionData:p,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:t}]},a)}else{if(!l)return t;var d=t.depth+o;h=Dt.makeVList({positionType:"bottom",positionData:d,children:[{type:"elem",elem:t},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:i+"em"},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}return Dt.makeSpan(["mop","op-limits"],[h],a)},Vr=["\\smallint"],Ur=function(t,e){var r,a,n,i=!1;"supsub"===t.type?(r=t.sup,a=t.sub,n=Ce(t.base,"op"),i=!0):n=Ce(t,"op");var o,s=e.style,l=!1;if(s.size===w.DISPLAY.size&&n.symbol&&!c.contains(Vr,n.name)&&(l=!0),n.symbol){var h=l?"Size2-Regular":"Size1-Regular",m="";if("\\oiint"!==n.name&&"\\oiiint"!==n.name||(m=n.name.substr(1),n.name="oiint"===m?"\\iint":"\\iiint"),o=Dt.makeSymbol(n.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),m.length>0){var u=o.italic,p=Dt.staticSvg(m+"Size"+(l?"2":"1"),e);o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),n.name="\\"+m,o.classes.unshift("mop"),o.italic=u}}else if(n.body){var d=ee(n.body,e,!0);1===d.length&&d[0]instanceof E?(o=d[0]).classes[0]="mop":o=Dt.makeSpan(["mop"],Dt.tryCombineChars(d),e)}else{for(var f=[],g=1;g<n.name.length;g++)f.push(Dt.mathsym(n.name[g],n.mode,e));o=Dt.makeSpan(["mop"],f,e)}var x=0,v=0;return(o instanceof E||"\\oiint"===n.name||"\\oiiint"===n.name)&&!n.suppressBaseShift&&(x=(o.height-o.depth)/2-e.fontMetrics().axisHeight,v=o.italic),i?Fr(o,r,a,e,s,v,x):(x&&(o.style.position="relative",o.style.top=x+"em"),o)},Gr=function(t,e){var r;if(t.symbol)r=new me("mo",[pe(t.name,t.mode)]),c.contains(Vr,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new me("mo",ge(t.body,e));else{r=new me("mi",[new ce(t.name.slice(1))]);var a=new me("mo",[pe("\u2061","text")]);r=t.parentIsSupSub?new me("mo",[r,a]):he([r,a])}return r},Yr={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};_t({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:function(t,e){var r=t.parser,a=t.funcName;return 1===a.length&&(a=Yr[a]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:Ur,mathmlBuilder:Gr}),_t({type:"op",names:["\\mathop"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:$t(a)}},htmlBuilder:Ur,mathmlBuilder:Gr});var Wr={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};_t({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Ur,mathmlBuilder:Gr}),_t({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Ur,mathmlBuilder:Gr}),_t({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return 1===r.length&&(r=Wr[r]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:r}},htmlBuilder:Ur,mathmlBuilder:Gr});var Xr=function(t,e){var r,a,n,i,o=!1;if("supsub"===t.type?(r=t.sup,a=t.sub,n=Ce(t.base,"operatorname"),o=!0):n=Ce(t,"operatorname"),n.body.length>0){for(var s=n.body.map(function(t){var e=t.text;return"string"==typeof e?{type:"textord",mode:t.mode,text:e}:t}),l=ee(s,e.withFont("mathrm"),!0),h=0;h<l.length;h++){var m=l[h];m instanceof E&&(m.text=m.text.replace(/\u2212/,"-").replace(/\u2217/,"*"))}i=Dt.makeSpan(["mop"],l,e)}else i=Dt.makeSpan(["mop"],[],e);return o?Fr(i,r,a,e,e.style,0,0):i};function _r(t,e,r){for(var a=ee(t,e,!1),n=e.sizeMultiplier/r.sizeMultiplier,i=0;i<a.length;i++){var o=a[i].classes.indexOf("sizing");o<0?Array.prototype.push.apply(a[i].classes,e.sizingClasses(r)):a[i].classes[o+1]==="reset-size"+e.size&&(a[i].classes[o+1]="reset-size"+r.size),a[i].height*=n,a[i].depth*=n}return Dt.makeFragment(a)}_t({type:"operatorname",names:["\\operatorname","\\operatorname*"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"operatorname",mode:r.mode,body:$t(n),alwaysHandleSupSub:"\\operatorname*"===a,limits:!1,parentIsSupSub:!1}},htmlBuilder:Xr,mathmlBuilder:function(t,e){for(var r=ge(t.body,e.withFont("mathrm")),a=!0,n=0;n<r.length;n++){var i=r[n];if(i instanceof ue.SpaceNode);else if(i instanceof ue.MathNode)switch(i.type){case"mi":case"mn":case"ms":case"mspace":case"mtext":break;case"mo":var o=i.children[0];1===i.children.length&&o instanceof ue.TextNode?o.text=o.text.replace(/\u2212/,"-").replace(/\u2217/,"*"):a=!1;break;default:a=!1}else a=!1}if(a){var s=r.map(function(t){return t.toText()}).join("");r=[new ue.TextNode(s)]}var l=new ue.MathNode("mi",r);l.setAttribute("mathvariant","normal");var h=new ue.MathNode("mo",[pe("\u2061","text")]);return t.parentIsSupSub?new ue.MathNode("mo",[l,h]):ue.newDocumentFragment([l,h])}}),jt({type:"ordgroup",htmlBuilder:function(t,e){return t.semisimple?Dt.makeFragment(ee(t.body,e,!1)):Dt.makeSpan(["mord"],ee(t.body,e,!0),e)},mathmlBuilder:function(t,e){return xe(t.body,e,!0)}}),_t({type:"overline",names:["\\overline"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"overline",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=oe(t.body,e.havingCrampedStyle()),a=Dt.makeLineSpan("overline-line",e),n=e.fontMetrics().defaultRuleThickness,i=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]},e);return Dt.makeSpan(["mord","overline"],[i],e)},mathmlBuilder:function(t,e){var r=new ue.MathNode("mo",[new ue.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new ue.MathNode("mover",[ve(t.body,e),r]);return a.setAttribute("accent","true"),a}}),_t({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"phantom",mode:r.mode,body:$t(a)}},htmlBuilder:function(t,e){var r=ee(t.body,e.withPhantom(),!1);return Dt.makeFragment(r)},mathmlBuilder:function(t,e){var r=ge(t.body,e);return new ue.MathNode("mphantom",r)}}),_t({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"hphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Dt.makeSpan([],[oe(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a<r.children.length;a++)r.children[a].height=0,r.children[a].depth=0;return r=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e),Dt.makeSpan(["mord"],[r],e)},mathmlBuilder:function(t,e){var r=ge($t(t.body),e),a=new ue.MathNode("mphantom",r),n=new ue.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}}),_t({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"vphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Dt.makeSpan(["inner"],[oe(t.body,e.withPhantom())]),a=Dt.makeSpan(["fix"],[]);return Dt.makeSpan(["mord","rlap"],[r,a],e)},mathmlBuilder:function(t,e){var r=ge($t(t.body),e),a=new ue.MathNode("mphantom",r),n=new ue.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}}),_t({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ce(e[0],"size").value,n=e[1];return{type:"raisebox",mode:r.mode,dy:a,body:n}},htmlBuilder:function(t,e){var r=oe(t.body,e),a=Tt(t.dy,e);return Dt.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:r}]},e)},mathmlBuilder:function(t,e){var r=new ue.MathNode("mpadded",[ve(t.body,e)]),a=t.dy.number+t.dy.unit;return r.setAttribute("voffset",a),r}}),_t({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler:function(t,e,r){var a=t.parser,n=r[0],i=Ce(e[0],"size"),o=Ce(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&Ce(n,"size").value,width:i.value,height:o.value}},htmlBuilder:function(t,e){var r=Dt.makeSpan(["mord","rule"],[],e),a=Tt(t.width,e),n=Tt(t.height,e),i=t.shift?Tt(t.shift,e):0;return r.style.borderRightWidth=a+"em",r.style.borderTopWidth=n+"em",r.style.bottom=i+"em",r.width=a,r.height=n+i,r.depth=-i,r.maxFontSize=1.125*n*e.sizeMultiplier,r},mathmlBuilder:function(t,e){var r=Tt(t.width,e),a=Tt(t.height,e),n=t.shift?Tt(t.shift,e):0,i=e.color&&e.getColor()||"black",o=new ue.MathNode("mspace");o.setAttribute("mathbackground",i),o.setAttribute("width",r+"em"),o.setAttribute("height",a+"em");var s=new ue.MathNode("mpadded",[o]);return n>=0?s.setAttribute("height","+"+n+"em"):(s.setAttribute("height",n+"em"),s.setAttribute("depth","+"+-n+"em")),s.setAttribute("voffset",n+"em"),s}});var jr=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];_t({type:"sizing",names:jr,props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,i=n.parseExpression(!1,r);return{type:"sizing",mode:n.mode,size:jr.indexOf(a)+1,body:i}},htmlBuilder:function(t,e){var r=e.havingSize(t.size);return _r(t.body,r,e)},mathmlBuilder:function(t,e){var r=e.havingSize(t.size),a=ge(t.body,r),n=new ue.MathNode("mstyle",a);return n.setAttribute("mathsize",r.sizeMultiplier+"em"),n}}),_t({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=!1,i=!1,o=r[0]&&Ce(r[0],"ordgroup");if(o)for(var s="",l=0;l<o.body.length;++l){if("t"===(s=o.body[l].text))n=!0;else{if("b"!==s){n=!1,i=!1;break}i=!0}}else n=!0,i=!0;var h=e[0];return{type:"smash",mode:a.mode,body:h,smashHeight:n,smashDepth:i}},htmlBuilder:function(t,e){var r=Dt.makeSpan([],[oe(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var a=0;a<r.children.length;a++)r.children[a].height=0;if(t.smashDepth&&(r.depth=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].depth=0;var i=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord"],[i],e)},mathmlBuilder:function(t,e){var r=new ue.MathNode("mpadded",[ve(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r}}),_t({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=r[0],i=e[0];return{type:"sqrt",mode:a.mode,body:i,index:n}},htmlBuilder:function(t,e){var r=oe(t.body,e.havingCrampedStyle());0===r.height&&(r.height=e.fontMetrics().xHeight),r=Dt.wrapFragment(r,e);var a=e.fontMetrics().defaultRuleThickness,n=a;e.style.id<w.TEXT.id&&(n=e.fontMetrics().xHeight);var i=a+n/4,o=r.height+r.depth+i+a,s=ir(o,e),l=s.span,h=s.ruleWidth,m=s.advanceWidth,c=l.height-h;c>r.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=l.height-r.height-i-h;r.style.paddingLeft=m+"em";var p=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},e);if(t.index){var d=e.havingStyle(w.SCRIPTSCRIPT),f=oe(t.index,d,e),g=.6*(p.height-p.depth),x=Dt.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},e),v=Dt.makeSpan(["root"],[x]);return Dt.makeSpan(["mord","sqrt"],[v,p],e)}return Dt.makeSpan(["mord","sqrt"],[p],e)},mathmlBuilder:function(t,e){var r=t.body,a=t.index;return a?new ue.MathNode("mroot",[ve(r,e),ve(a,e)]):new ue.MathNode("msqrt",[ve(r,e)])}});var $r={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};_t({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,i=n.parseExpression(!0,r),o=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:o,body:i}},htmlBuilder:function(t,e){var r=$r[t.style],a=e.havingStyle(r).withFont("");return _r(t.body,a,e)},mathmlBuilder:function(t,e){var r=$r[t.style],a=e.havingStyle(r),n=ge(t.body,a),i=new ue.MathNode("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[t.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});jt({type:"supsub",htmlBuilder:function(t,e){var r=function(t,e){var r=t.base;return r?"op"===r.type?r.limits&&(e.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?Ur:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(e.style.size===w.DISPLAY.size||r.limits)?Xr:null:"accent"===r.type?c.isCharacterBox(r.base)?Ie:null:"horizBrace"===r.type&&!t.sub===r.isOver?Pr:null:null}(t,e);if(r)return r(t,e);var a,n,i,o=t.base,s=t.sup,l=t.sub,h=oe(o,e),m=e.fontMetrics(),u=0,p=0,d=o&&c.isCharacterBox(o);if(s){var f=e.havingStyle(e.style.sup());a=oe(s,f,e),d||(u=h.height-f.fontMetrics().supDrop*f.sizeMultiplier/e.sizeMultiplier)}if(l){var g=e.havingStyle(e.style.sub());n=oe(l,g,e),d||(p=h.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}i=e.style===w.DISPLAY?m.sup1:e.style.cramped?m.sup3:m.sup2;var x,v=e.sizeMultiplier,b=.5/m.ptPerEm/v+"em",y=null;if(n){var k=t.base&&"op"===t.base.type&&t.base.name&&("\\oiint"===t.base.name||"\\oiiint"===t.base.name);(h instanceof E||k)&&(y=-h.italic+"em")}if(a&&n){u=Math.max(u,i,a.depth+.25*m.xHeight),p=Math.max(p,m.sub2);var S=4*m.defaultRuleThickness;if(u-a.depth-(n.height-p)<S){p=S-(u-a.depth)+n.height;var M=.8*m.xHeight-(u-a.depth);M>0&&(u+=M,p-=M)}var z=[{type:"elem",elem:n,shift:p,marginRight:b,marginLeft:y},{type:"elem",elem:a,shift:-u,marginRight:b}];x=Dt.makeVList({positionType:"individualShift",children:z},e)}else if(n){p=Math.max(p,m.sub1,n.height-.8*m.xHeight);var A=[{type:"elem",elem:n,marginLeft:y,marginRight:b}];x=Dt.makeVList({positionType:"shift",positionData:p,children:A},e)}else{if(!a)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,a.depth+.25*m.xHeight),x=Dt.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:a,marginRight:b}]},e)}var T=ne(h,"right")||"mord";return Dt.makeSpan([T],[h,Dt.makeSpan(["msupsub"],[x])],e)},mathmlBuilder:function(t,e){var r,a=!1;t.base&&"horizBrace"===t.base.type&&!!t.sup===t.base.isOver&&(a=!0,r=t.base.isOver),!t.base||"op"!==t.base.type&&"operatorname"!==t.base.type||(t.base.parentIsSupSub=!0);var n,i=[ve(t.base,e)];if(t.sub&&i.push(ve(t.sub,e)),t.sup&&i.push(ve(t.sup,e)),a)n=r?"mover":"munder";else if(t.sub)if(t.sup){var o=t.base;n=o&&"op"===o.type&&o.limits&&e.style===w.DISPLAY?"munderover":o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(e.style===w.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=t.base;n=s&&"op"===s.type&&s.limits&&(e.style===w.DISPLAY||s.alwaysHandleSupSub)?"munder":s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||e.style===w.DISPLAY)?"munder":"msub"}else{var l=t.base;n=l&&"op"===l.type&&l.limits&&(e.style===w.DISPLAY||l.alwaysHandleSupSub)?"mover":l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||e.style===w.DISPLAY)?"mover":"msup"}return new ue.MathNode(n,i)}}),jt({type:"atom",htmlBuilder:function(t,e){return Dt.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder:function(t,e){var r=new ue.MathNode("mo",[pe(t.text,t.mode)]);if("bin"===t.family){var a=fe(t,e);"bold-italic"===a&&r.setAttribute("mathvariant",a)}else"punct"===t.family?r.setAttribute("separator","true"):"open"!==t.family&&"close"!==t.family||r.setAttribute("stretchy","false");return r}});var Zr={mi:"italic",mn:"normal",mtext:"normal"};jt({type:"mathord",htmlBuilder:function(t,e){return Dt.makeOrd(t,e,"mathord")},mathmlBuilder:function(t,e){var r=new ue.MathNode("mi",[pe(t.text,t.mode,e)]),a=fe(t,e)||"italic";return a!==Zr[r.type]&&r.setAttribute("mathvariant",a),r}}),jt({type:"textord",htmlBuilder:function(t,e){return Dt.makeOrd(t,e,"textord")},mathmlBuilder:function(t,e){var r,a=pe(t.text,t.mode,e),n=fe(t,e)||"normal";return r="text"===t.mode?new ue.MathNode("mtext",[a]):/[0-9]/.test(t.text)?new ue.MathNode("mn",[a]):"\\prime"===t.text?new ue.MathNode("mo",[a]):new ue.MathNode("mi",[a]),n!==Zr[r.type]&&r.setAttribute("mathvariant",n),r}});var Kr={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Jr={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};jt({type:"spacing",htmlBuilder:function(t,e){if(Jr.hasOwnProperty(t.text)){var r=Jr[t.text].className||"";if("text"===t.mode){var a=Dt.makeOrd(t,e,"textord");return a.classes.push(r),a}return Dt.makeSpan(["mspace",r],[Dt.mathsym(t.text,t.mode,e)],e)}if(Kr.hasOwnProperty(t.text))return Dt.makeSpan(["mspace",Kr[t.text]],[],e);throw new o('Unknown type of space "'+t.text+'"')},mathmlBuilder:function(t,e){if(!Jr.hasOwnProperty(t.text)){if(Kr.hasOwnProperty(t.text))return new ue.MathNode("mspace");throw new o('Unknown type of space "'+t.text+'"')}return new ue.MathNode("mtext",[new ue.TextNode("\xa0")])}});var Qr=function(){var t=new ue.MathNode("mtd",[]);return t.setAttribute("width","50%"),t};jt({type:"tag",mathmlBuilder:function(t,e){var r=new ue.MathNode("mtable",[new ue.MathNode("mtr",[Qr(),new ue.MathNode("mtd",[xe(t.body,e)]),Qr(),new ue.MathNode("mtd",[xe(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});var ta={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},ea={"\\textbf":"textbf","\\textmd":"textmd"},ra={"\\textit":"textit","\\textup":"textup"},aa=function(t,e){var r=t.font;return r?ta[r]?e.withTextFontFamily(ta[r]):ea[r]?e.withTextFontWeight(ea[r]):e.withTextFontShape(ra[r]):e};_t({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],greediness:2,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"text",mode:r.mode,body:$t(n),font:a}},htmlBuilder:function(t,e){var r=aa(t,e),a=ee(t.body,r,!0);return Dt.makeSpan(["mord","text"],Dt.tryCombineChars(a),r)},mathmlBuilder:function(t,e){var r=aa(t,e);return xe(t.body,r)}}),_t({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){return{type:"underline",mode:t.parser.mode,body:e[0]}},htmlBuilder:function(t,e){var r=oe(t.body,e),a=Dt.makeLineSpan("underline-line",e),n=e.fontMetrics().defaultRuleThickness,i=Dt.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord","underline"],[i],e)},mathmlBuilder:function(t,e){var r=new ue.MathNode("mo",[new ue.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new ue.MathNode("munder",[ve(t.body,e),r]);return a.setAttribute("accentunder","true"),a}}),_t({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(t,e,r){throw new o("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(t,e){for(var r=na(t),a=[],n=e.havingStyle(e.style.text()),i=0;i<r.length;i++){var o=r[i];"~"===o&&(o="\\textasciitilde"),a.push(Dt.makeSymbol(o,"Typewriter-Regular",t.mode,n,["mord","texttt"]))}return Dt.makeSpan(["mord","text"].concat(n.sizingClasses(e)),Dt.tryCombineChars(a),n)},mathmlBuilder:function(t,e){var r=new ue.TextNode(na(t)),a=new ue.MathNode("mtext",[r]);return a.setAttribute("mathvariant","monospace"),a}});var na=function(t){return t.body.replace(/ /g,t.star?"\u2423":"\xa0")},ia=Yt,oa=new RegExp("^(\\\\[a-zA-Z@]+)[ \r\n\t]*$"),sa=new RegExp("[\u0300-\u036f]+$"),la="([ \r\n\t]+)|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff][\u0300-\u036f]*|[\ud800-\udbff][\udc00-\udfff][\u0300-\u036f]*|\\\\verb\\*([^]).*?\\3|\\\\verb([^*a-zA-Z]).*?\\4|\\\\operatorname\\*|\\\\[a-zA-Z@]+[ \r\n\t]*|\\\\[^\ud800-\udfff])",ha=function(){function t(t,e){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=t,this.settings=e,this.tokenRegex=new RegExp(la,"g"),this.catcodes={"%":14}}var e=t.prototype;return e.setCatcode=function(t,e){this.catcodes[t]=e},e.lex=function(){var t=this.input,e=this.tokenRegex.lastIndex;if(e===t.length)return new n("EOF",new a(this,e,e));var r=this.tokenRegex.exec(t);if(null===r||r.index!==e)throw new o("Unexpected character: '"+t[e]+"'",new n(t[e],new a(this,e,e+1)));var i=r[2]||" ";if(14===this.catcodes[i]){var s=t.indexOf("\n",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=t.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}var l=i.match(oa);return l&&(i=l[1]),new n(i,new a(this,e,this.tokenRegex.lastIndex))},t}(),ma=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=e,this.builtins=t,this.undefStack=[]}var e=t.prototype;return e.beginGroup=function(){this.undefStack.push({})},e.endGroup=function(){if(0===this.undefStack.length)throw new o("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var t=this.undefStack.pop();for(var e in t)t.hasOwnProperty(e)&&(void 0===t[e]?delete this.current[e]:this.current[e]=t[e])},e.has=function(t){return this.current.hasOwnProperty(t)||this.builtins.hasOwnProperty(t)},e.get=function(t){return this.current.hasOwnProperty(t)?this.current[t]:this.builtins[t]},e.set=function(t,e,r){if(void 0===r&&(r=!1),r){for(var a=0;a<this.undefStack.length;a++)delete this.undefStack[a][t];this.undefStack.length>0&&(this.undefStack[this.undefStack.length-1][t]=e)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(t)&&(n[t]=this.current[t])}this.current[t]=e},t}(),ca={},ua=ca;function pa(t,e){ca[t]=e}pa("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}}),pa("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}}),pa("\\@firstoftwo",function(t){return{tokens:t.consumeArgs(2)[0],numArgs:0}}),pa("\\@secondoftwo",function(t){return{tokens:t.consumeArgs(2)[1],numArgs:0}}),pa("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return 1===e[0].length&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}}),pa("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),pa("\\TextOrMath",function(t){var e=t.consumeArgs(2);return"text"===t.mode?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var da={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};pa("\\char",function(t){var e,r=t.popToken(),a="";if("'"===r.text)e=8,r=t.popToken();else if('"'===r.text)e=16,r=t.popToken();else if("`"===r.text)if("\\"===(r=t.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new o("\\char` missing argument");a=r.text.charCodeAt(0)}else e=10;if(e){if(null==(a=da[r.text])||a>=e)throw new o("Invalid base-"+e+" digit "+r.text);for(var n;null!=(n=da[t.future().text])&&n<e;)a*=e,a+=n,t.popToken()}return"\\@char{"+a+"}"});var fa=function(t,e,r){var a=t.consumeArgs(1)[0];if(1!==a.length)throw new o("\\newcommand's first argument must be a macro name");var n=a[0].text,i=t.isDefined(n);if(i&&!e)throw new o("\\newcommand{"+n+"} attempting to redefine "+n+"; use \\renewcommand");if(!i&&!r)throw new o("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var s=0;if(1===(a=t.consumeArgs(1)[0]).length&&"["===a[0].text){for(var l="",h=t.expandNextToken();"]"!==h.text&&"EOF"!==h.text;)l+=h.text,h=t.expandNextToken();if(!l.match(/^\s*[0-9]+\s*$/))throw new o("Invalid number of arguments: "+l);s=parseInt(l),a=t.consumeArgs(1)[0]}return t.macros.set(n,{tokens:a,numArgs:s}),""};pa("\\newcommand",function(t){return fa(t,!1,!0)}),pa("\\renewcommand",function(t){return fa(t,!0,!1)}),pa("\\providecommand",function(t){return fa(t,!0,!0)}),pa("\\message",function(t){var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(function(t){return t.text}).join("")),""}),pa("\\errmessage",function(t){var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(function(t){return t.text}).join("")),""}),pa("\\show",function(t){var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),ia[r],j.math[r],j.text[r]),""}),pa("\\bgroup","{"),pa("\\egroup","}"),pa("\\lq","`"),pa("\\rq","'"),pa("\\aa","\\r a"),pa("\\AA","\\r A"),pa("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),pa("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),pa("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),pa("\u212c","\\mathscr{B}"),pa("\u2130","\\mathscr{E}"),pa("\u2131","\\mathscr{F}"),pa("\u210b","\\mathscr{H}"),pa("\u2110","\\mathscr{I}"),pa("\u2112","\\mathscr{L}"),pa("\u2133","\\mathscr{M}"),pa("\u211b","\\mathscr{R}"),pa("\u212d","\\mathfrak{C}"),pa("\u210c","\\mathfrak{H}"),pa("\u2128","\\mathfrak{Z}"),pa("\\Bbbk","\\Bbb{k}"),pa("\xb7","\\cdotp"),pa("\\llap","\\mathllap{\\textrm{#1}}"),pa("\\rlap","\\mathrlap{\\textrm{#1}}"),pa("\\clap","\\mathclap{\\textrm{#1}}"),pa("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),pa("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),pa("\\ne","\\neq"),pa("\u2260","\\neq"),pa("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),pa("\u2209","\\notin"),pa("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),pa("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),pa("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),pa("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),pa("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),pa("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),pa("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),pa("\u27c2","\\perp"),pa("\u203c","\\mathclose{!\\mkern-0.8mu!}"),pa("\u220c","\\notni"),pa("\u231c","\\ulcorner"),pa("\u231d","\\urcorner"),pa("\u231e","\\llcorner"),pa("\u231f","\\lrcorner"),pa("\xa9","\\copyright"),pa("\xae","\\textregistered"),pa("\ufe0f","\\textregistered"),pa("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),pa("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),pa("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),pa("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),pa("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),pa("\u22ee","\\vdots"),pa("\\varGamma","\\mathit{\\Gamma}"),pa("\\varDelta","\\mathit{\\Delta}"),pa("\\varTheta","\\mathit{\\Theta}"),pa("\\varLambda","\\mathit{\\Lambda}"),pa("\\varXi","\\mathit{\\Xi}"),pa("\\varPi","\\mathit{\\Pi}"),pa("\\varSigma","\\mathit{\\Sigma}"),pa("\\varUpsilon","\\mathit{\\Upsilon}"),pa("\\varPhi","\\mathit{\\Phi}"),pa("\\varPsi","\\mathit{\\Psi}"),pa("\\varOmega","\\mathit{\\Omega}"),pa("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),pa("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"),pa("\\boxed","\\fbox{$\\displaystyle{#1}$}"),pa("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),pa("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),pa("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");var ga={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};pa("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in ga?e=ga[r]:"\\not"===r.substr(0,4)?e="\\dotsb":r in j.math&&c.contains(["bin","rel"],j.math[r].group)&&(e="\\dotsb"),e});var xa={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};pa("\\dotso",function(t){return t.future().text in xa?"\\ldots\\,":"\\ldots"}),pa("\\dotsc",function(t){var e=t.future().text;return e in xa&&","!==e?"\\ldots\\,":"\\ldots"}),pa("\\cdots",function(t){return t.future().text in xa?"\\@cdots\\,":"\\@cdots"}),pa("\\dotsb","\\cdots"),pa("\\dotsm","\\cdots"),pa("\\dotsi","\\!\\cdots"),pa("\\dotsx","\\ldots\\,"),pa("\\DOTSI","\\relax"),pa("\\DOTSB","\\relax"),pa("\\DOTSX","\\relax"),pa("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),pa("\\,","\\tmspace+{3mu}{.1667em}"),pa("\\thinspace","\\,"),pa("\\>","\\mskip{4mu}"),pa("\\:","\\tmspace+{4mu}{.2222em}"),pa("\\medspace","\\:"),pa("\\;","\\tmspace+{5mu}{.2777em}"),pa("\\thickspace","\\;"),pa("\\!","\\tmspace-{3mu}{.1667em}"),pa("\\negthinspace","\\!"),pa("\\negmedspace","\\tmspace-{4mu}{.2222em}"),pa("\\negthickspace","\\tmspace-{5mu}{.277em}"),pa("\\enspace","\\kern.5em "),pa("\\enskip","\\hskip.5em\\relax"),pa("\\quad","\\hskip1em\\relax"),pa("\\qquad","\\hskip2em\\relax"),pa("\\tag","\\@ifstar\\tag@literal\\tag@paren"),pa("\\tag@paren","\\tag@literal{({#1})}"),pa("\\tag@literal",function(t){if(t.macros.get("\\df@tag"))throw new o("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),pa("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),pa("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),pa("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),pa("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),pa("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),pa("\\\\","\\newline"),pa("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var va=F["Main-Regular"]["T".charCodeAt(0)][1]-.7*F["Main-Regular"]["A".charCodeAt(0)][1]+"em";pa("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+va+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),pa("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+va+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),pa("\\hspace","\\@ifstar\\@hspacer\\@hspace"),pa("\\@hspace","\\hskip #1\\relax"),pa("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),pa("\\ordinarycolon",":"),pa("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),pa("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),pa("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),pa("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),pa("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),pa("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),pa("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),pa("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),pa("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),pa("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),pa("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),pa("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),pa("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),pa("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),pa("\u2237","\\dblcolon"),pa("\u2239","\\eqcolon"),pa("\u2254","\\coloneqq"),pa("\u2255","\\eqqcolon"),pa("\u2a74","\\Coloneqq"),pa("\\ratio","\\vcentcolon"),pa("\\coloncolon","\\dblcolon"),pa("\\colonequals","\\coloneqq"),pa("\\coloncolonequals","\\Coloneqq"),pa("\\equalscolon","\\eqqcolon"),pa("\\equalscoloncolon","\\Eqqcolon"),pa("\\colonminus","\\coloneq"),pa("\\coloncolonminus","\\Coloneq"),pa("\\minuscolon","\\eqcolon"),pa("\\minuscoloncolon","\\Eqcolon"),pa("\\coloncolonapprox","\\Colonapprox"),pa("\\coloncolonsim","\\Colonsim"),pa("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),pa("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),pa("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),pa("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),pa("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),pa("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),pa("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),pa("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),pa("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),pa("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),pa("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),pa("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),pa("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),pa("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),pa("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),pa("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),pa("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),pa("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),pa("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),pa("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),pa("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),pa("\\imath","\\html@mathml{\\@imath}{\u0131}"),pa("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),pa("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),pa("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),pa("\u27e6","\\llbracket"),pa("\u27e7","\\rrbracket"),pa("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),pa("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),pa("\u2983","\\lBrace"),pa("\u2984","\\rBrace"),pa("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),pa("\u29b5","\\minuso"),pa("\\darr","\\downarrow"),pa("\\dArr","\\Downarrow"),pa("\\Darr","\\Downarrow"),pa("\\lang","\\langle"),pa("\\rang","\\rangle"),pa("\\uarr","\\uparrow"),pa("\\uArr","\\Uparrow"),pa("\\Uarr","\\Uparrow"),pa("\\N","\\mathbb{N}"),pa("\\R","\\mathbb{R}"),pa("\\Z","\\mathbb{Z}"),pa("\\alef","\\aleph"),pa("\\alefsym","\\aleph"),pa("\\Alpha","\\mathrm{A}"),pa("\\Beta","\\mathrm{B}"),pa("\\bull","\\bullet"),pa("\\Chi","\\mathrm{X}"),pa("\\clubs","\\clubsuit"),pa("\\cnums","\\mathbb{C}"),pa("\\Complex","\\mathbb{C}"),pa("\\Dagger","\\ddagger"),pa("\\diamonds","\\diamondsuit"),pa("\\empty","\\emptyset"),pa("\\Epsilon","\\mathrm{E}"),pa("\\Eta","\\mathrm{H}"),pa("\\exist","\\exists"),pa("\\harr","\\leftrightarrow"),pa("\\hArr","\\Leftrightarrow"),pa("\\Harr","\\Leftrightarrow"),pa("\\hearts","\\heartsuit"),pa("\\image","\\Im"),pa("\\infin","\\infty"),pa("\\Iota","\\mathrm{I}"),pa("\\isin","\\in"),pa("\\Kappa","\\mathrm{K}"),pa("\\larr","\\leftarrow"),pa("\\lArr","\\Leftarrow"),pa("\\Larr","\\Leftarrow"),pa("\\lrarr","\\leftrightarrow"),pa("\\lrArr","\\Leftrightarrow"),pa("\\Lrarr","\\Leftrightarrow"),pa("\\Mu","\\mathrm{M}"),pa("\\natnums","\\mathbb{N}"),pa("\\Nu","\\mathrm{N}"),pa("\\Omicron","\\mathrm{O}"),pa("\\plusmn","\\pm"),pa("\\rarr","\\rightarrow"),pa("\\rArr","\\Rightarrow"),pa("\\Rarr","\\Rightarrow"),pa("\\real","\\Re"),pa("\\reals","\\mathbb{R}"),pa("\\Reals","\\mathbb{R}"),pa("\\Rho","\\mathrm{P}"),pa("\\sdot","\\cdot"),pa("\\sect","\\S"),pa("\\spades","\\spadesuit"),pa("\\sub","\\subset"),pa("\\sube","\\subseteq"),pa("\\supe","\\supseteq"),pa("\\Tau","\\mathrm{T}"),pa("\\thetasym","\\vartheta"),pa("\\weierp","\\wp"),pa("\\Zeta","\\mathrm{Z}"),pa("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),pa("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),pa("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),pa("\\bra","\\mathinner{\\langle{#1}|}"),pa("\\ket","\\mathinner{|{#1}\\rangle}"),pa("\\braket","\\mathinner{\\langle{#1}\\rangle}"),pa("\\Bra","\\left\\langle#1\\right|"),pa("\\Ket","\\left|#1\\right\\rangle"),pa("\\blue","\\textcolor{##6495ed}{#1}"),pa("\\orange","\\textcolor{##ffa500}{#1}"),pa("\\pink","\\textcolor{##ff00af}{#1}"),pa("\\red","\\textcolor{##df0030}{#1}"),pa("\\green","\\textcolor{##28ae7b}{#1}"),pa("\\gray","\\textcolor{gray}{#1}"),pa("\\purple","\\textcolor{##9d38bd}{#1}"),pa("\\blueA","\\textcolor{##ccfaff}{#1}"),pa("\\blueB","\\textcolor{##80f6ff}{#1}"),pa("\\blueC","\\textcolor{##63d9ea}{#1}"),pa("\\blueD","\\textcolor{##11accd}{#1}"),pa("\\blueE","\\textcolor{##0c7f99}{#1}"),pa("\\tealA","\\textcolor{##94fff5}{#1}"),pa("\\tealB","\\textcolor{##26edd5}{#1}"),pa("\\tealC","\\textcolor{##01d1c1}{#1}"),pa("\\tealD","\\textcolor{##01a995}{#1}"),pa("\\tealE","\\textcolor{##208170}{#1}"),pa("\\greenA","\\textcolor{##b6ffb0}{#1}"),pa("\\greenB","\\textcolor{##8af281}{#1}"),pa("\\greenC","\\textcolor{##74cf70}{#1}"),pa("\\greenD","\\textcolor{##1fab54}{#1}"),pa("\\greenE","\\textcolor{##0d923f}{#1}"),pa("\\goldA","\\textcolor{##ffd0a9}{#1}"),pa("\\goldB","\\textcolor{##ffbb71}{#1}"),pa("\\goldC","\\textcolor{##ff9c39}{#1}"),pa("\\goldD","\\textcolor{##e07d10}{#1}"),pa("\\goldE","\\textcolor{##a75a05}{#1}"),pa("\\redA","\\textcolor{##fca9a9}{#1}"),pa("\\redB","\\textcolor{##ff8482}{#1}"),pa("\\redC","\\textcolor{##f9685d}{#1}"),pa("\\redD","\\textcolor{##e84d39}{#1}"),pa("\\redE","\\textcolor{##bc2612}{#1}"),pa("\\maroonA","\\textcolor{##ffbde0}{#1}"),pa("\\maroonB","\\textcolor{##ff92c6}{#1}"),pa("\\maroonC","\\textcolor{##ed5fa6}{#1}"),pa("\\maroonD","\\textcolor{##ca337c}{#1}"),pa("\\maroonE","\\textcolor{##9e034e}{#1}"),pa("\\purpleA","\\textcolor{##ddd7ff}{#1}"),pa("\\purpleB","\\textcolor{##c6b9fc}{#1}"),pa("\\purpleC","\\textcolor{##aa87ff}{#1}"),pa("\\purpleD","\\textcolor{##7854ab}{#1}"),pa("\\purpleE","\\textcolor{##543b78}{#1}"),pa("\\mintA","\\textcolor{##f5f9e8}{#1}"),pa("\\mintB","\\textcolor{##edf2df}{#1}"),pa("\\mintC","\\textcolor{##e0e5cc}{#1}"),pa("\\grayA","\\textcolor{##f6f7f7}{#1}"),pa("\\grayB","\\textcolor{##f0f1f2}{#1}"),pa("\\grayC","\\textcolor{##e3e5e6}{#1}"),pa("\\grayD","\\textcolor{##d6d8da}{#1}"),pa("\\grayE","\\textcolor{##babec2}{#1}"),pa("\\grayF","\\textcolor{##888d93}{#1}"),pa("\\grayG","\\textcolor{##626569}{#1}"),pa("\\grayH","\\textcolor{##3b3e40}{#1}"),pa("\\grayI","\\textcolor{##21242c}{#1}"),pa("\\kaBlue","\\textcolor{##314453}{#1}"),pa("\\kaGreen","\\textcolor{##71B307}{#1}");var ba={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},ya=function(){function t(t,e,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=e,this.expansionCount=0,this.feed(t),this.macros=new ma(ua,e.macros),this.mode=r,this.stack=[]}var e=t.prototype;return e.feed=function(t){this.lexer=new ha(t,this.settings)},e.switchMode=function(t){this.mode=t},e.beginGroup=function(){this.macros.beginGroup()},e.endGroup=function(){this.macros.endGroup()},e.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},e.popToken=function(){return this.future(),this.stack.pop()},e.pushToken=function(t){this.stack.push(t)},e.pushTokens=function(t){var e;(e=this.stack).push.apply(e,t)},e.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},e.consumeArgs=function(t){for(var e=[],r=0;r<t;++r){this.consumeSpaces();var a=this.popToken();if("{"===a.text){for(var n=[],i=1;0!==i;){var s=this.popToken();if(n.push(s),"{"===s.text)++i;else if("}"===s.text)--i;else if("EOF"===s.text)throw new o("End of input in macro argument",a)}n.pop(),n.reverse(),e[r]=n}else{if("EOF"===a.text)throw new o("End of input expecting macro argument");e[r]=[a]}}return e},e.expandOnce=function(t){var e=this.popToken(),r=e.text,a=e.noexpand?null:this._getExpansion(r);if(null==a||t&&a.unexpandable){if(t&&null==a&&"\\"===r[0]&&!this.isDefined(r))throw new o("Undefined control sequence: "+r);return this.pushToken(e),e}if(this.expansionCount++,this.expansionCount>this.settings.maxExpand)throw new o("Too many expansions: infinite loop or need to increase maxExpand setting");var n=a.tokens;if(a.numArgs)for(var i=this.consumeArgs(a.numArgs),s=(n=n.slice()).length-1;s>=0;--s){var l=n[s];if("#"===l.text){if(0===s)throw new o("Incomplete placeholder at end of macro body",l);if("#"===(l=n[--s]).text)n.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new o("Not a valid argument number",l);var h;(h=n).splice.apply(h,[s,2].concat(i[+l.text-1]))}}}return this.pushTokens(n),n},e.expandAfterFuture=function(){return this.expandOnce(),this.future()},e.expandNextToken=function(){for(;;){var t=this.expandOnce();if(t instanceof n){if("\\relax"!==t.text&&!t.treatAsRelax)return this.stack.pop();this.stack.pop()}}throw new Error},e.expandMacro=function(t){return this.macros.has(t)?this.expandTokens([new n(t)]):void 0},e.expandTokens=function(t){var e=[],r=this.stack.length;for(this.pushTokens(t);this.stack.length>r;){var a=this.expandOnce(!0);a instanceof n&&(a.treatAsRelax&&(a.noexpand=!1,a.treatAsRelax=!1),e.push(this.stack.pop()))}return e},e.expandMacroAsText=function(t){var e=this.expandMacro(t);return e?e.map(function(t){return t.text}).join(""):e},e._getExpansion=function(t){var e=this.macros.get(t);if(null==e)return e;var r="function"==typeof e?e(this):e;if("string"==typeof r){var a=0;if(-1!==r.indexOf("#"))for(var n=r.replace(/##/g,"");-1!==n.indexOf("#"+(a+1));)++a;for(var i=new ha(r,this.settings),o=[],s=i.lex();"EOF"!==s.text;)o.push(s),s=i.lex();return o.reverse(),{tokens:o,numArgs:a}}return r},e.isDefined=function(t){return this.macros.has(t)||ia.hasOwnProperty(t)||j.math.hasOwnProperty(t)||j.text.hasOwnProperty(t)||ba.hasOwnProperty(t)},e.isExpandable=function(t){var e=this.macros.get(t);return null!=e?"string"==typeof e||"function"==typeof e||!e.unexpandable:ia.hasOwnProperty(t)},t}(),wa={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"}},ka={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\u010f":"d\u030c","\u1e0b":"d\u0307","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u013a":"l\u0301","\u013e":"l\u030c","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\u010e":"D\u030c","\u1e0a":"D\u0307","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0139":"L\u0301","\u013d":"L\u030c","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u0164":"T\u030c","\u1e6a":"T\u0307","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Sa=function(){function t(t,e){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new ya(t,e,this.mode),this.settings=e,this.leftrightDepth=0}var e=t.prototype;return e.expect=function(t,e){if(void 0===e&&(e=!0),this.fetch().text!==t)throw new o("Expected '"+t+"', got '"+this.fetch().text+"'",this.fetch());e&&this.consume()},e.consume=function(){this.nextToken=null},e.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},e.switchMode=function(t){this.mode=t,this.gullet.switchMode(t)},e.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");var t=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),t},e.parseExpression=function(e,r){for(var a=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.fetch();if(-1!==t.endOfExpression.indexOf(n.text))break;if(r&&n.text===r)break;if(e&&ia[n.text]&&ia[n.text].infix)break;var i=this.parseAtom(r);if(!i)break;"internal"!==i.type&&a.push(i)}return"text"===this.mode&&this.formLigatures(a),this.handleInfixNodes(a)},e.handleInfixNodes=function(t){for(var e,r=-1,a=0;a<t.length;a++)if("infix"===t[a].type){if(-1!==r)throw new o("only one infix operator per group",t[a].token);r=a,e=t[a].replaceWith}if(-1!==r&&e){var n,i,s=t.slice(0,r),l=t.slice(r+1);return n=1===s.length&&"ordgroup"===s[0].type?s[0]:{type:"ordgroup",mode:this.mode,body:s},i=1===l.length&&"ordgroup"===l[0].type?l[0]:{type:"ordgroup",mode:this.mode,body:l},["\\\\abovefrac"===e?this.callFunction(e,[n,t[r],i],[]):this.callFunction(e,[n,i],[])]}return t},e.handleSupSubscript=function(e){var r=this.fetch(),a=r.text;this.consume();var n=this.parseGroup(e,!1,t.SUPSUB_GREEDINESS,void 0,void 0,!0);if(!n)throw new o("Expected group after '"+a+"'",r);return n},e.formatUnsupportedCmd=function(t){for(var e=[],r=0;r<t.length;r++)e.push({type:"textord",mode:"text",text:t[r]});var a={type:"text",mode:this.mode,body:e};return{type:"color",mode:this.mode,color:this.settings.errorColor,body:[a]}},e.parseAtom=function(t){var e,r,a=this.parseGroup("atom",!1,null,t);if("text"===this.mode)return a;for(;;){this.consumeSpaces();var n=this.fetch();if("\\limits"===n.text||"\\nolimits"===n.text){if(a&&"op"===a.type){var i="\\limits"===n.text;a.limits=i,a.alwaysHandleSupSub=!0}else{if(!a||"operatorname"!==a.type||!a.alwaysHandleSupSub)throw new o("Limit controls must follow a math operator",n);var s="\\limits"===n.text;a.limits=s}this.consume()}else if("^"===n.text){if(e)throw new o("Double superscript",n);e=this.handleSupSubscript("superscript")}else if("_"===n.text){if(r)throw new o("Double subscript",n);r=this.handleSupSubscript("subscript")}else{if("'"!==n.text)break;if(e)throw new o("Double superscript",n);var l={type:"textord",mode:this.mode,text:"\\prime"},h=[l];for(this.consume();"'"===this.fetch().text;)h.push(l),this.consume();"^"===this.fetch().text&&h.push(this.handleSupSubscript("superscript")),e={type:"ordgroup",mode:this.mode,body:h}}}return e||r?{type:"supsub",mode:this.mode,base:a,sup:e,sub:r}:a},e.parseFunction=function(t,e,r){var a=this.fetch(),n=a.text,i=ia[n];if(!i)return null;if(this.consume(),null!=r&&i.greediness<=r)throw new o("Got function '"+n+"' with no arguments"+(e?" as "+e:""),a);if("text"===this.mode&&!i.allowedInText)throw new o("Can't use function '"+n+"' in text mode",a);if("math"===this.mode&&!1===i.allowedInMath)throw new o("Can't use function '"+n+"' in math mode",a);var s=this.parseArguments(n,i),l=s.args,h=s.optArgs;return this.callFunction(n,l,h,a,t)},e.callFunction=function(t,e,r,a,n){var i={funcName:t,parser:this,token:a,breakOnTokenText:n},s=ia[t];if(s&&s.handler)return s.handler(i,e,r);throw new o("No function handler for "+t)},e.parseArguments=function(t,e){var r=e.numArgs+e.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var a=e.greediness,n=[],i=[],s=0;s<r;s++){var l=e.argTypes&&e.argTypes[s],h=s<e.numOptionalArgs,m=s>0&&!h||0===s&&!h&&"math"===this.mode,c=this.parseGroupOfType("argument to '"+t+"'",l,h,a,m);if(!c){if(h){i.push(null);continue}throw new o("Expected group after '"+t+"'",this.fetch())}(h?i:n).push(c)}return{args:n,optArgs:i}},e.parseGroupOfType=function(t,e,r,a,n){switch(e){case"color":return n&&this.consumeSpaces(),this.parseColorGroup(r);case"size":return n&&this.consumeSpaces(),this.parseSizeGroup(r);case"url":return this.parseUrlGroup(r,n);case"math":case"text":return this.parseGroup(t,r,a,void 0,e,n);case"hbox":var i=this.parseGroup(t,r,a,void 0,"text",n);return i?{type:"styling",mode:i.mode,body:[i],style:"text"}:i;case"raw":if(n&&this.consumeSpaces(),r&&"{"===this.fetch().text)return null;var s=this.parseStringGroup("raw",r,!0);if(s)return{type:"raw",mode:"text",string:s.text};throw new o("Expected raw group",this.fetch());case"original":case null:case void 0:return this.parseGroup(t,r,a,void 0,void 0,n);default:throw new o("Unknown group type as "+t,this.fetch())}},e.consumeSpaces=function(){for(;" "===this.fetch().text;)this.consume()},e.parseStringGroup=function(t,e,r){var a=e?"[":"{",n=e?"]":"}",i=this.fetch();if(i.text!==a){if(e)return null;if(r&&"EOF"!==i.text&&/[^{}[\]]/.test(i.text))return this.consume(),i}var s=this.mode;this.mode="text",this.expect(a);for(var l,h="",m=this.fetch(),c=0,u=m;(l=this.fetch()).text!==n||r&&c>0;){switch(l.text){case"EOF":throw new o("Unexpected end of input in "+t,m.range(u,h));case a:c++;break;case n:c--}h+=(u=l).text,this.consume()}return this.expect(n),this.mode=s,m.range(u,h)},e.parseRegexGroup=function(t,e){var r=this.mode;this.mode="text";for(var a,n=this.fetch(),i=n,s="";"EOF"!==(a=this.fetch()).text&&t.test(s+a.text);)s+=(i=a).text,this.consume();if(""===s)throw new o("Invalid "+e+": '"+n.text+"'",n);return this.mode=r,n.range(i,s)},e.parseColorGroup=function(t){var e=this.parseStringGroup("color",t);if(!e)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text);if(!r)throw new o("Invalid color: '"+e.text+"'",e);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a="#"+a),{type:"color-token",mode:this.mode,color:a}},e.parseSizeGroup=function(t){var e,r=!1;if(!(e=t||"{"===this.fetch().text?this.parseStringGroup("size",t):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;t||0!==e.text.length||(e.text="0pt",r=!0);var a=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e.text);if(!a)throw new o("Invalid size: '"+e.text+"'",e);var n={number:+(a[1]+a[2]),unit:a[3]};if(!At(n))throw new o("Invalid unit: '"+n.unit+"'",e);return{type:"size",mode:this.mode,value:n,isBlank:r}},e.parseUrlGroup=function(t,e){this.gullet.lexer.setCatcode("%",13);var r=this.parseStringGroup("url",t,!0);if(this.gullet.lexer.setCatcode("%",14),!r)return null;var a=r.text.replace(/\\([#$%&~_^{}])/g,"$1");return{type:"url",mode:this.mode,url:a}},e.parseGroup=function(e,r,n,i,s,l){var h=this.mode;s&&this.switchMode(s),l&&this.consumeSpaces();var m,c=this.fetch(),u=c.text;if(r?"["===u:"{"===u||"\\begingroup"===u){this.consume();var p=t.endOfGroup[u];this.gullet.beginGroup();var d=this.parseExpression(!1,p),f=this.fetch();this.expect(p),this.gullet.endGroup(),m={type:"ordgroup",mode:this.mode,loc:a.range(c,f),body:d,semisimple:"\\begingroup"===u||void 0}}else if(r)m=null;else if(null==(m=this.parseFunction(i,e,n)||this.parseSymbol())&&"\\"===u[0]&&!ba.hasOwnProperty(u)){if(this.settings.throwOnError)throw new o("Undefined control sequence: "+u,c);m=this.formatUnsupportedCmd(u),this.consume()}return s&&this.switchMode(h),m},e.formLigatures=function(t){for(var e=t.length-1,r=0;r<e;++r){var n=t[r],i=n.text;"-"===i&&"-"===t[r+1].text&&(r+1<e&&"-"===t[r+2].text?(t.splice(r,3,{type:"textord",mode:"text",loc:a.range(n,t[r+2]),text:"---"}),e-=2):(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:"--"}),e-=1)),"'"!==i&&"`"!==i||t[r+1].text!==i||(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:i+i}),e-=1)}},e.parseSymbol=function(){var t=this.fetch(),e=t.text;if(/^\\verb[^a-zA-Z]/.test(e)){this.consume();var r=e.slice(5),n="*"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new o("\\verb assertion failed --\n please report what input caused this bug");return{type:"verb",mode:"text",body:r=r.slice(1,-1),star:n}}ka.hasOwnProperty(e[0])&&!j[this.mode][e[0]]&&(this.settings.strict&&"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Accented Unicode text character "'+e[0]+'" used in math mode',t),e=ka[e[0]]+e.substr(1));var i,s=sa.exec(e);if(s&&("i"===(e=e.substring(0,s.index))?e="\u0131":"j"===e&&(e="\u0237")),j[this.mode][e]){this.settings.strict&&"math"===this.mode&&"\xc7\xd0\xde\xe7\xfe".indexOf(e)>=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+e[0]+'" used in math mode',t);var l,h=j[this.mode][e].group,m=a.range(t);if(W.hasOwnProperty(h)){var c=h;l={type:"atom",mode:this.mode,family:c,loc:m,text:e}}else l={type:h,mode:this.mode,loc:m,text:e};i=l}else{if(!(e.charCodeAt(0)>=128))return null;this.settings.strict&&(M(e.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+e[0]+'" used in math mode',t):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+e[0]+'" ('+e.charCodeAt(0)+")",t)),i={type:"textord",mode:"text",loc:a.range(t),text:e}}if(this.consume(),s)for(var u=0;u<s[0].length;u++){var p=s[0][u];if(!wa[p])throw new o("Unknown accent ' "+p+"'",t);var d=wa[p][this.mode];if(!d)throw new o("Accent "+p+" unsupported in "+this.mode+" mode",t);i={type:"accent",mode:this.mode,loc:a.range(t),label:d,isStretchy:!1,isShifty:!0,base:i}}return i},t}();Sa.endOfExpression=["}","\\endgroup","\\end","\\right","&"],Sa.endOfGroup={"[":"]","{":"}","\\begingroup":"\\endgroup"},Sa.SUPSUB_GREEDINESS=1;var Ma=function(t,e){if(!("string"==typeof t||t instanceof String))throw new TypeError("KaTeX can only parse string typed expression");var r=new Sa(t,e);delete r.gullet.macros.current["\\df@tag"];var a=r.parse();if(r.gullet.macros.get("\\df@tag")){if(!e.displayMode)throw new o("\\tag works only in display equations");r.gullet.feed("\\df@tag"),a=[{type:"tag",mode:"text",body:a,tag:r.parse()}]}return a},za=function(t,e,r){e.textContent="";var a=Ta(t,r).toNode();e.appendChild(a)};"undefined"!=typeof document&&"CSS1Compat"!==document.compatMode&&("undefined"!=typeof console&&console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."),za=function(){throw new o("KaTeX doesn't work in quirks mode.")});var Aa=function(t,e,r){if(r.throwOnError||!(t instanceof o))throw t;var a=Dt.makeSpan(["katex-error"],[new E(e)]);return a.setAttribute("title",t.toString()),a.setAttribute("style","color:"+r.errorColor),a},Ta=function(t,e){var r=new u(e);try{var a=Ma(t,r);return ke(a,t,r)}catch(e){return Aa(e,t,r)}},Ba={version:"0.12.0",render:za,renderToString:function(t,e){return Ta(t,e).toMarkup()},ParseError:o,__parse:function(t,e){var r=new u(e);return Ma(t,r)},__renderToDomTree:Ta,__renderToHTMLTree:function(t,e){var r=new u(e);try{return function(t,e,r){var a=le(t,ye(r)),n=Dt.makeSpan(["katex"],[a]);return we(n,r)}(Ma(t,r),0,r)}catch(e){return Aa(e,t,r)}},__setFontMetrics:function(t,e){F[t]=e},__defineSymbol:$,__defineMacro:pa,__domTree:{Span:N,Anchor:I,SymbolNode:E,SvgNode:L,PathNode:P,LineNode:D}};e.default=Ba}]).default}); \ No newline at end of file diff --git a/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css b/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css index f083f6062..9838a7566 100644 --- a/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css +++ b/plugins/tiddlywiki/katex/files/katex.without-font-face.min.css @@ -1 +1 @@ -.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.10.2"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} +.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto;border-color:currentColor}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.12.0"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed;border-collapse:collapse}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .vbox{-ms-flex-direction:column;flex-direction:column;align-items:baseline}.katex .hbox,.katex .vbox{display:-ms-inline-flexbox;display:inline-flex}.katex .hbox{-ms-flex-direction:row;flex-direction:row;width:100%}.katex .thinbox{display:inline-flex;flex-direction:row;width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left;padding-left:2em} diff --git a/plugins/tiddlywiki/katex/files/mhchem.min.js b/plugins/tiddlywiki/katex/files/mhchem.min.js index 3a6228a3b..432a76af0 100644 --- a/plugins/tiddlywiki/katex/files/mhchem.min.js +++ b/plugins/tiddlywiki/katex/files/mhchem.min.js @@ -1,1683 +1 @@ -/* eslint-disable */ -/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ - -/************************************************************* - * - * KaTeX mhchem.js - * - * This file implements a KaTeX version of mhchem version 3.3.0. - * It is adapted from MathJax/extensions/TeX/mhchem.js - * It differs from the MathJax version as follows: - * 1. The interface is changed so that it can be called from KaTeX, not MathJax. - * 2. \rlap and \llap are replaced with \mathrlap and \mathllap. - * 3. Four lines of code are edited in order to use \raisebox instead of \raise. - * 4. The reaction arrow code is simplified. All reaction arrows are rendered - * using KaTeX extensible arrows instead of building non-extensible arrows. - * 5. \tripledash vertical alignment is slightly adjusted. - * - * This code, as other KaTeX code, is released under the MIT license. - * - * /************************************************************* - * - * MathJax/extensions/TeX/mhchem.js - * - * Implements the \ce command for handling chemical formulas - * from the mhchem LaTeX package. - * - * --------------------------------------------------------------------- - * - * Copyright (c) 2011-2015 The MathJax Consortium - * Copyright (c) 2015-2018 Martin Hensel - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Coding Style -// - use '' for identifiers that can by minified/uglified -// - use "" for strings that need to stay untouched - -// version: "3.3.0" for MathJax and KaTeX - -/**************************************** -***************************************** -* TiddlyWiki: moved the katex-module definitions to wrapper.js -***************************************** -*****************************************/ - - // - // This is the main function for handing the \ce and \pu commands. - // It takes the argument to \ce or \pu and returns the corresponding TeX string. - // - - // TiddlyWiki: replaced `var chemParse =` with `module.exports =` ... no more modifications in this file - module.exports = function (tokens, stateMachine) { - // Recreate the argument string from KaTeX's array of tokens. - var str = ""; - var expectedLoc = tokens[tokens.length - 1].loc.start - for (var i = tokens.length - 1; i >= 0; i--) { - if(tokens[i].loc.start > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = tokens[i].loc.start; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - var tex = texify.go(mhchemParser.go(str, stateMachine)); - return tex; - }; - - // - // Core parser for mhchem syntax (recursive) - // - /** @type {MhchemParser} */ - var mhchemParser = { - // - // Parses mchem \ce syntax - // - // Call like - // go("H2O"); - // - go: function (input, stateMachine) { - if (!input) { return []; } - if (stateMachine === undefined) { stateMachine = 'ce'; } - var state = '0'; - - // - // String buffers for parsing: - // - // buffer.a == amount - // buffer.o == element - // buffer.b == left-side superscript - // buffer.p == left-side subscript - // buffer.q == right-side subscript - // buffer.d == right-side superscript - // - // buffer.r == arrow - // buffer.rdt == arrow, script above, type - // buffer.rd == arrow, script above, content - // buffer.rqt == arrow, script below, type - // buffer.rq == arrow, script below, content - // - // buffer.text_ - // buffer.rm - // etc. - // - // buffer.parenthesisLevel == int, starting at 0 - // buffer.sb == bool, space before - // buffer.beginsWithBond == bool - // - // These letters are also used as state names. - // - // Other states: - // 0 == begin of main part (arrow/operator unlikely) - // 1 == next entity - // 2 == next entity (arrow/operator unlikely) - // 3 == next atom - // c == macro - // - /** @type {Buffer} */ - var buffer = {}; - buffer['parenthesisLevel'] = 0; - - input = input.replace(/\n/g, " "); - input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-"); - input = input.replace(/[\u2026]/g, "..."); - - // - // Looks through mhchemParser.transitions, to execute a matching action - // (recursive) - // - var lastInput; - var watchdog = 10; - /** @type {ParserOutput[]} */ - var output = []; - while (true) { - if (lastInput !== input) { - watchdog = 10; - lastInput = input; - } else { - watchdog--; - } - // - // Find actions in transition table - // - var machine = mhchemParser.stateMachines[stateMachine]; - var t = machine.transitions[state] || machine.transitions['*']; - iterateTransitions: - for (var i=0; i<t.length; i++) { - var matches = mhchemParser.patterns.match_(t[i].pattern, input); - if (matches) { - // - // Execute actions - // - var task = t[i].task; - for (var iA=0; iA<task.action_.length; iA++) { - var o; - // - // Find and execute action - // - if (machine.actions[task.action_[iA].type_]) { - o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option); - } else if (mhchemParser.actions[task.action_[iA].type_]) { - o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option); - } else { - throw ["MhchemBugA", "mhchem bug A. Please report. (" + task.action_[iA].type_ + ")"]; // Trying to use non-existing action - } - // - // Add output - // - mhchemParser.concatArray(output, o); - } - // - // Set next state, - // Shorten input, - // Continue with next character - // (= apply only one transition per position) - // - state = task.nextState || state; - if (input.length > 0) { - if (!task.revisit) { - input = matches.remainder; - } - if (!task.toContinue) { - break iterateTransitions; - } - } else { - return output; - } - } - } - // - // Prevent infinite loop - // - if (watchdog <= 0) { - throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character - } - } - }, - concatArray: function (a, b) { - if (b) { - if (Array.isArray(b)) { - for (var iB=0; iB<b.length; iB++) { - a.push(b[iB]); - } - } else { - a.push(b); - } - } - }, - - patterns: { - // - // Matching patterns - // either regexps or function that return null or {match_:"a", remainder:"bc"} - // - patterns: { - // property names must not look like integers ("2") for correct property traversal order, later on - 'empty': /^$/, - 'else': /^./, - 'else2': /^./, - 'space': /^\s/, - 'space A': /^\s(?=[A-Z\\$])/, - 'space$': /^\s$/, - 'a-z': /^[a-z]/, - 'x': /^x/, - 'x$': /^x$/, - 'i$': /^i$/, - 'letters': /^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/, - '\\greek': /^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/, - 'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/, - '$one lowercase latin letter$ $': /^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/, - 'one lowercase greek letter $': /^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/, - 'digits': /^[0-9]+/, - '-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/, - '-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/, - '(-)(9.,9)(e)(99)': function (input) { - var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/); - if (m && m[0]) { - return { match_: m.splice(1), remainder: input.substr(m[0].length) }; - } - return null; - }, - '(-)(9)^(-9)': function (input) { - var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/); - if (m && m[0]) { - return { match_: m.splice(1), remainder: input.substr(m[0].length) }; - } - return null; - }, - 'state of aggregation $': function (input) { // ... or crystal system - var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat) - if (a && a.remainder.match(/^($|[\s,;\)\]\}])/)) { return a; } // AND end of 'phrase' - var m = input.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/); // OR crystal system ($o$) (\ca$c$) - if (m) { - return { match_: m[0], remainder: input.substr(m[0].length) }; - } - return null; - }, - '_{(state of aggregation)}$': /^_\{(\([a-z]{1,3}\))\}/, - '{[(': /^(?:\\\{|\[|\()/, - ')]}': /^(?:\)|\]|\\\})/, - ', ': /^[,;]\s*/, - ',': /^[,;]/, - '.': /^[.]/, - '. ': /^([.\u22C5\u00B7\u2022])\s*/, - '...': /^\.\.\.(?=$|[^.])/, - '* ': /^([*])\s*/, - '^{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}"); }, - '^($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", ""); }, - '^a': /^\^([0-9]+|[^\\_])/, - '^\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); }, - '^\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", ""); }, - '^\\x': /^\^(\\[a-zA-Z]+)\s*/, - '^(-1)': /^\^(-?\d+)/, - '\'': /^'/, - '_{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}"); }, - '_($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", ""); }, - '_9': /^_([+\-]?[0-9]+|[^\\])/, - '_\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); }, - '_\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", ""); }, - '_\\x': /^_(\\[a-zA-Z]+)\s*/, - '^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/, - '{}': /^\{\}/, - '{...}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", ""); }, - '{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}"); }, - '$...$': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); }, - '${(...)}$': function (input) { return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$"); }, - '$(...)$': function (input) { return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$"); }, - '=<>': /^[=<>]/, - '#': /^[#\u2261]/, - '+': /^\+/, - '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/, // -space -, -; -] -/ -$ -state-of-aggregation - '-9': /^-(?=[0-9])/, - '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/, - '-': /^-/, - 'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/, - 'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/, - 'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/, - '\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}"); }, - '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/, - 'CMT': /^[CMT](?=\[)/, - '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]"); }, - '1st-level escape': /^(&|\\\\|\\hline)\s*/, - '\\,': /^(?:\\[,\ ;:])/, // \\x - but output no space before - '\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); }, - '\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", ""); }, - '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/, - '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/, - 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, // only those with numbers in front, because the others will be formatted correctly anyway - 'others': /^[\/~|]/, - '\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}"); }, - '\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}"); }, - '\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}"); }, - '\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}"); }, - '\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}"); }, - '\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}"); }, - '\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}"); }, - '\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}"); }, - 'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, - 'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, // 0 could be oxidation or charge - 'roman numeral': /^[IVX]+/, - '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/, - 'amount': function (input) { - var match; - // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing - match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); - if (a) { // e.g. $2n-1$, $-$ - match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - } - return null; - }, - 'amount2': function (input) { return this['amount'](input); }, - '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/, - 'formula$': function (input) { - if (input.match(/^\([a-z]+\)$/)) { return null; } // state of aggregation = no formula - var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - return null; - }, - 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/, - '/': /^\s*(\/)\s*/, - '//': /^\s*(\/\/)\s*/, - '*': /^\s*[*.]\s*/ - }, - findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) { - /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */ - var _match = function (input, pattern) { - if (typeof pattern === "string") { - if (input.indexOf(pattern) !== 0) { return null; } - return pattern; - } else { - var match = input.match(pattern); - if (!match) { return null; } - return match[0]; - } - }; - /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */ - var _findObserveGroups = function (input, i, endChars) { - var braces = 0; - while (i < input.length) { - var a = input.charAt(i); - var match = _match(input.substr(i), endChars); - if (match !== null && braces === 0) { - return { endMatchBegin: i, endMatchEnd: i + match.length }; - } else if (a === "{") { - braces++; - } else if (a === "}") { - if (braces === 0) { - throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"]; - } else { - braces--; - } - } - i++; - } - if (braces > 0) { - return null; - } - return null; - }; - var match = _match(input, begExcl); - if (match === null) { return null; } - input = input.substr(match.length); - match = _match(input, begIncl); - if (match === null) { return null; } - var e = _findObserveGroups(input, match.length, endIncl || endExcl); - if (e === null) { return null; } - var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin)); - if (!(beg2Excl || beg2Incl)) { - return { - match_: match1, - remainder: input.substr(e.endMatchEnd) - }; - } else { - var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl); - if (group2 === null) { return null; } - /** @type {string[]} */ - var matchRet = [match1, group2.match_]; - return { - match_: (combine ? matchRet.join("") : matchRet), - remainder: group2.remainder - }; - } - }, - - // - // Matching function - // e.g. match("a", input) will look for the regexp called "a" and see if it matches - // returns null or {match_:"a", remainder:"bc"} - // - match_: function (m, input) { - var pattern = mhchemParser.patterns.patterns[m]; - if (pattern === undefined) { - throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern - } else if (typeof pattern === "function") { - return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser - } else { // RegExp - var match = input.match(pattern); - if (match) { - var mm; - if (match[2]) { - mm = [ match[1], match[2] ]; - } else if (match[1]) { - mm = match[1]; - } else { - mm = match[0]; - } - return { match_: mm, remainder: input.substr(match[0].length) }; - } - return null; - } - } - }, - - // - // Generic state machine actions - // - actions: { - 'a=': function (buffer, m) { buffer.a = (buffer.a || "") + m; }, - 'b=': function (buffer, m) { buffer.b = (buffer.b || "") + m; }, - 'p=': function (buffer, m) { buffer.p = (buffer.p || "") + m; }, - 'o=': function (buffer, m) { buffer.o = (buffer.o || "") + m; }, - 'q=': function (buffer, m) { buffer.q = (buffer.q || "") + m; }, - 'd=': function (buffer, m) { buffer.d = (buffer.d || "") + m; }, - 'rm=': function (buffer, m) { buffer.rm = (buffer.rm || "") + m; }, - 'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || "") + m; }, - 'insert': function (buffer, m, a) { return { type_: a }; }, - 'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; }, - 'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; }, - 'copy': function (buffer, m) { return m; }, - 'rm': function (buffer, m) { return { type_: 'rm', p1: m || ""}; }, - 'text': function (buffer, m) { return mhchemParser.go(m, 'text'); }, - '{text}': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'text')); - ret.push("}"); - return ret; - }, - 'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); }, - 'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); }, - 'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; }, - 'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; }, - 'ce': function (buffer, m) { return mhchemParser.go(m); }, - '1/2': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m.match(/^[+\-]/)) { - ret.push(m.substr(0, 1)); - m = m.substr(1); - } - var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/); - n[1] = n[1].replace(/\$/g, ""); - ret.push({ type_: 'frac', p1: n[1], p2: n[2] }); - if (n[3]) { - n[3] = n[3].replace(/\$/g, ""); - ret.push({ type_: 'tex-math', p1: n[3] }); - } - return ret; - }, - '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); } - }, - // - // createTransitions - // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] } - // with expansion of 'a|b' to 'a' and 'b' (at 2 places) - // - createTransitions: function (o) { - var pattern, state; - /** @type {string[]} */ - var stateArray; - var i; - // - // 1. Collect all states - // - /** @type {Transitions} */ - var transitions = {}; - for (pattern in o) { - for (state in o[pattern]) { - stateArray = state.split("|"); - o[pattern][state].stateArray = stateArray; - for (i=0; i<stateArray.length; i++) { - transitions[stateArray[i]] = []; - } - } - } - // - // 2. Fill states - // - for (pattern in o) { - for (state in o[pattern]) { - stateArray = o[pattern][state].stateArray || []; - for (i=0; i<stateArray.length; i++) { - // - // 2a. Normalize actions into array: 'text=' ==> [{type_:'text='}] - // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).) - // - /** @type {any} */ - var p = o[pattern][state]; - if (p.action_) { - p.action_ = [].concat(p.action_); - for (var k=0; k<p.action_.length; k++) { - if (typeof p.action_[k] === "string") { - p.action_[k] = { type_: p.action_[k] }; - } - } - } else { - p.action_ = []; - } - // - // 2.b Multi-insert - // - var patternArray = pattern.split("|"); - for (var j=0; j<patternArray.length; j++) { - if (stateArray[i] === '*') { // insert into all - for (var t in transitions) { - transitions[t].push({ pattern: patternArray[j], task: p }); - } - } else { - transitions[stateArray[i]].push({ pattern: patternArray[j], task: p }); - } - } - } - } - } - return transitions; - }, - stateMachines: {} - }; - - // - // Definition of state machines - // - mhchemParser.stateMachines = { - // - // \ce state machines - // - //#region ce - 'ce': { // main parser - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - 'else': { - '0|1|2': { action_: 'beginsWithBond=false', revisit: true, toContinue: true } }, - 'oxidation$': { - '0': { action_: 'oxidation-output' } }, - 'CMT': { - 'r': { action_: 'rdt=', nextState: 'rt' }, - 'rd': { action_: 'rqt=', nextState: 'rdt' } }, - 'arrowUpDown': { - '0|1|2|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '1' } }, - 'uprightEntities': { - '0|1|2': { action_: [ 'o=', 'output' ], nextState: '1' } }, - 'orbital': { - '0|1|2|3': { action_: 'o=', nextState: 'o' } }, - '->': { - '0|1|2|3': { action_: 'r=', nextState: 'r' }, - 'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' }, - '*': { action_: [ 'output', 'r=' ], nextState: 'r' } }, - '+': { - 'o': { action_: 'd= kv', nextState: 'd' }, - 'd|D': { action_: 'd=', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd|qD': { action_: 'd=', nextState: 'qd' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' }, - '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - 'amount': { - '0|2': { action_: 'a=', nextState: 'a' } }, - 'pm-operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\pm' } ], nextState: '0' } }, - 'operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - '-$': { - 'o|q': { action_: [ 'charge or bond', 'output' ], nextState: 'qd' }, - 'd': { action_: 'd=', nextState: 'd' }, - 'D': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd': { action_: 'd=', nextState: 'qd' }, - 'qD|dq': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - '-9': { - '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } }, - '- orbital overlap': { - 'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } }, - '-': { - '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: "-" } ], nextState: '3' }, - '3': { action_: { type_: 'bond', option: "-" } }, - 'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "-" } ], nextState: '3' }, - 'b': { action_: 'b=' }, - 'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' }, - 'D|qD|p': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - 'amount2': { - '1|3': { action_: 'a=', nextState: 'a' } }, - 'letters': { - '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, - 'q|dq': { action_: ['output', 'o='], nextState: 'o' }, - 'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } }, - 'digits': { - 'o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q': { action_: [ 'output', 'o=' ], nextState: 'o' }, - 'a': { action_: 'o=', nextState: 'o' } }, - 'space A': { - 'b|p|bp': {} }, - 'space': { - 'a': { nextState: 'as' }, - '0': { action_: 'sb=false' }, - '1|2': { action_: 'sb=true' }, - 'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' }, - '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} }, - '1st-level escape': { - '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] }, - '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } }, - '[(...)]': { - 'r|rt': { action_: 'rd=', nextState: 'rd' }, - 'rd|rdt': { action_: 'rq=', nextState: 'rdq' } }, - '...': { - 'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: "..." } ], nextState: '3' }, - '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } }, - '. |* ': { - '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } }, - 'state of aggregation $': { - '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } }, - '{[(': { - 'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } }, - ')]}': { - '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' }, - 'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } }, - ', ': { - '*': { action_: [ 'output', 'comma' ], nextState: '0' } }, - '^_': { // ^ and _ without a sensible argument - '*': { } }, - '^{(...)}|^($...$)': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'D' }, - 'q': { action_: 'd=', nextState: 'qD' }, - 'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } }, - '^a|^\\x{}{}|^\\x{}|^\\x|\'': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'd|qd|D|qD': { action_: 'd=' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } }, - '_{(state of aggregation)}$': { - 'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': { - '0|1|2|as': { action_: 'p=', nextState: 'p' }, - 'b': { action_: 'p=', nextState: 'bp' }, - '3|o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '=<>': { - '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } }, - '#': { - '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "#" } ], nextState: '3' } }, - '{}': { - '*': { action_: { type_: 'output', option: 1 }, nextState: '1' } }, - '{...}': { - '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' }, - 'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '$...$': { - 'a': { action_: 'a=' }, // 2$n$ - '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, // not 'amount' - 'as|o': { action_: 'o=' }, - 'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '\\bond{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: "3" } }, - '\\frac{(...)}': { - '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } }, - '\\overset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } }, - '\\underset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } }, - '\\underbrace{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } }, - '\\color{(...)}0': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } }, - '\\ce{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } }, - '\\,': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } }, - '\\x{}{}|\\x{}|\\x': { - '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' }, - '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } }, - 'others': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } }, - 'else2': { - 'a': { action_: 'a to o', nextState: 'o', revisit: true }, - 'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true }, - 'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true }, - '*': { action_: [ 'output', 'copy' ], nextState: '3' } } - }), - actions: { - 'o after d': function (buffer, m) { - var ret; - if ((buffer.d || "").match(/^[0-9]+$/)) { - var tmp = buffer.d; - buffer.d = undefined; - ret = this['output'](buffer); - buffer.b = tmp; - } else { - ret = this['output'](buffer); - } - mhchemParser.actions['o='](buffer, m); - return ret; - }, - 'd= kv': function (buffer, m) { - buffer.d = m; - buffer.dType = 'kv'; - }, - 'charge or bond': function (buffer, m) { - if (buffer['beginsWithBond']) { - /** @type {ParserOutput[]} */ - var ret = []; - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - return ret; - } else { - buffer.d = m; - } - }, - '- after o/d': function (buffer, m, isAfterD) { - var c1 = mhchemParser.patterns.match_('orbital', buffer.o || ""); - var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || ""); - var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || ""); - var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || ""); - var hyphenFollows = m==="-" && ( c1 && c1.remainder==="" || c2 || c3 || c4 ); - if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) { - buffer.o = '$' + buffer.o + '$'; - } - /** @type {ParserOutput[]} */ - var ret = []; - if (hyphenFollows) { - mhchemParser.concatArray(ret, this['output'](buffer)); - ret.push({ type_: 'hyphen' }); - } else { - c1 = mhchemParser.patterns.match_('digits', buffer.d || ""); - if (isAfterD && c1 && c1.remainder==='') { - mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m)); - mhchemParser.concatArray(ret, this['output'](buffer)); - } else { - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - } - } - return ret; - }, - 'a to o': function (buffer) { - buffer.o = buffer.a; - buffer.a = undefined; - }, - 'sb=true': function (buffer) { buffer.sb = true; }, - 'sb=false': function (buffer) { buffer.sb = false; }, - 'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; }, - 'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; }, - 'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; }, - 'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; }, - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') }; - }, - 'comma': function (buffer, m) { - var a = m.replace(/\s*$/, ''); - var withSpace = (a !== m); - if (withSpace && buffer['parenthesisLevel'] === 0) { - return { type_: 'comma enumeration L', p1: a }; - } else { - return { type_: 'comma enumeration M', p1: a }; - } - }, - 'output': function (buffer, m, entityFollows) { - // entityFollows: - // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb) - // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1) - // 2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as) - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - if (!buffer.r) { - ret = []; - if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) { - //ret = []; - } else { - if (buffer.sb) { - ret.push({ type_: 'entitySkip' }); - } - if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) { - buffer.o = buffer.a; - buffer.a = undefined; - } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) { - buffer.o = buffer.a; - buffer.d = buffer.b; - buffer.q = buffer.p; - buffer.a = buffer.b = buffer.p = undefined; - } else { - if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) { - buffer.dType = 'oxidation'; - } else if (buffer.o && buffer.dType==='kv' && !buffer.q) { - buffer.dType = undefined; - } - } - ret.push({ - type_: 'chemfive', - a: mhchemParser.go(buffer.a, 'a'), - b: mhchemParser.go(buffer.b, 'bd'), - p: mhchemParser.go(buffer.p, 'pq'), - o: mhchemParser.go(buffer.o, 'o'), - q: mhchemParser.go(buffer.q, 'pq'), - d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')), - dType: buffer.dType - }); - } - } else { // r - /** @type {ParserOutput[]} */ - var rd; - if (buffer.rdt === 'M') { - rd = mhchemParser.go(buffer.rd, 'tex-math'); - } else if (buffer.rdt === 'T') { - rd = [ { type_: 'text', p1: buffer.rd || "" } ]; - } else { - rd = mhchemParser.go(buffer.rd); - } - /** @type {ParserOutput[]} */ - var rq; - if (buffer.rqt === 'M') { - rq = mhchemParser.go(buffer.rq, 'tex-math'); - } else if (buffer.rqt === 'T') { - rq = [ { type_: 'text', p1: buffer.rq || ""} ]; - } else { - rq = mhchemParser.go(buffer.rq); - } - ret = { - type_: 'arrow', - r: buffer.r, - rd: rd, - rq: rq - }; - } - for (var p in buffer) { - if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') { - delete buffer[p]; - } - } - return ret; - }, - 'oxidation-output': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation')); - ret.push("}"); - return ret; - }, - 'frac-output': function (buffer, m) { - return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'overset-output': function (buffer, m) { - return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underset-output': function (buffer, m) { - return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underbrace-output': function (buffer, m) { - return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) }; - }, - 'r=': function (buffer, m) { buffer.r = m; }, - 'rdt=': function (buffer, m) { buffer.rdt = m; }, - 'rd=': function (buffer, m) { buffer.rd = m; }, - 'rqt=': function (buffer, m) { buffer.rqt = m; }, - 'rq=': function (buffer, m) { buffer.rq = m; }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; } - } - }, - 'a': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - '$(...)$': { - '*': { action_: 'tex-math tight', nextState: '1' } }, - ',': { - '*': { action_: { type_: 'insert', option: 'commaDecimal' } } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'o': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - 'letters': { - '*': { action_: 'rm' } }, - '\\ca': { - '*': { action_: { type_: 'insert', option: 'circa' } } }, - '\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: '{text}' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'text': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '{...}': { - '*': { action_: 'text=' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '\\greek': { - '*': { action_: [ 'output', 'rm' ] } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: [ 'output', 'copy' ] } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.text_) { - /** @type {ParserOutput} */ - var ret = { type_: 'text', p1: buffer.text_ }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'pq': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'state of aggregation $': { - '*': { action_: 'state of aggregation' } }, - 'i$': { - '0': { nextState: '!f', revisit: true } }, - '(KV letters),': { - '0': { action_: 'rm', nextState: '0' } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'letters': { - '*': { action_: 'rm' } }, - '-9.,9': { - '*': { action_: '9,9' } }, - ',': { - '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') }; - } - } - }, - 'bd': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'x$': { - '0': { nextState: '!f', revisit: true } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '-9.,9 no missing 0': { - '*': { action_: '9,9' } }, - '.': { - '*': { action_: { type_: 'insert', option: 'electron dot' } } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'x': { - '*': { action_: { type_: 'insert', option: 'KV x' } } }, - 'letters': { - '*': { action_: 'rm' } }, - '\'': { - '*': { action_: { type_: 'insert', option: 'prime' } } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') }; - } - } - }, - 'oxidation': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'roman numeral': { - '*': { action_: 'roman-numeral' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || "" }; } - } - }, - 'tex-math': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'tex-math tight': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - '-|+': { - '*': { action_: 'tight operator' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'tight operator': function (buffer, m) { buffer.o = (buffer.o || "") + "{"+m+"}"; }, - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - '9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - ',': { - '*': { action_: 'comma' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; } - } - }, - //#endregion - // - // \pu state machines - // - //#region pu - 'pu': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - 'space$': { - '*': { action_: [ 'output', 'space' ] } }, - '{[(|)]}': { - '0|a': { action_: 'copy' } }, - '(-)(9)^(-9)': { - '0': { action_: 'number^', nextState: 'a' } }, - '(-)(9.,9)(e)(99)': { - '0': { action_: 'enumber', nextState: 'a' } }, - 'space': { - '0|a': {} }, - 'pm-operator': { - '0|a': { action_: { type_: 'operator', option: '\\pm' }, nextState: '0' } }, - 'operator': { - '0|a': { action_: 'copy', nextState: '0' } }, - '//': { - 'd': { action_: 'o=', nextState: '/' } }, - '/': { - 'd': { action_: 'o=', nextState: '/' } }, - '{...}|else': { - '0|d': { action_: 'd=', nextState: 'd' }, - 'a': { action_: [ 'space', 'd=' ], nextState: 'd' }, - '/|q': { action_: 'q=', nextState: 'q' } } - }), - actions: { - 'enumber': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - if (m[1]) { - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - if (m[2]) { - if (m[2].match(/[,.]/)) { - mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9')); - } else { - ret.push(m[2]); - } - } - m[3] = m[4] || m[3]; - if (m[3]) { - m[3] = m[3].trim(); - if (m[3] === "e" || m[3].substr(0, 1) === "*") { - ret.push({ type_: 'cdot' }); - } else { - ret.push({ type_: 'times' }); - } - } - } - if (m[3]) { - ret.push("10^{"+m[5]+"}"); - } - return ret; - }, - 'number^': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - ret.push("^{"+m[2]+"}"); - return ret; - }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }, - 'space': function () { return { type_: 'pu-space-1' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - var md = mhchemParser.patterns.match_('{(...)}', buffer.d || ""); - if (md && md.remainder === '') { buffer.d = md.match_; } - var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || ""); - if (mq && mq.remainder === '') { buffer.q = mq.match_; } - if (buffer.d) { - buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - } - if (buffer.q) { // fraction - buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - var b5 = { - d: mhchemParser.go(buffer.d, 'pu'), - q: mhchemParser.go(buffer.q, 'pu') - }; - if (buffer.o === '//') { - ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q }; - } else { - ret = b5.d; - if (b5.d.length > 1 || b5.q.length > 1) { - ret.push({ type_: ' / ' }); - } else { - ret.push({ type_: '/' }); - } - mhchemParser.concatArray(ret, b5.q); - } - } else { // no fraction - ret = mhchemParser.go(buffer.d, 'pu-2'); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-2': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '*': { - '*': { action_: [ 'output', 'cdot' ], nextState: '0' } }, - '\\x': { - '*': { action_: 'rm=' } }, - 'space': { - '*': { action_: [ 'output', 'space' ], nextState: '0' } }, - '^{(...)}|^(-1)': { - '1': { action_: '^(-1)' } }, - '-9.,9': { - '0': { action_: 'rm=', nextState: '0' }, - '1': { action_: '^(-1)', nextState: '0' } }, - '{...}|else': { - '*': { action_: 'rm=', nextState: '1' } } - }), - actions: { - 'cdot': function () { return { type_: 'tight cdot' }; }, - '^(-1)': function (buffer, m) { buffer.rm += "^{"+m+"}"; }, - 'space': function () { return { type_: 'pu-space-2' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret = []; - if (buffer.rm) { - var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || ""); - if (mrm && mrm.remainder === '') { - ret = mhchemParser.go(mrm.match_, 'pu'); - } else { - ret = { type_: 'rm', p1: buffer.rm }; - } - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '0': { action_: 'output-0' }, - 'o': { action_: 'output-o' } }, - ',': { - '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } }, - '.': { - '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; }, - 'output-0': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length % 3; - if (a === 0) { a = 3; } - for (var i=buffer.text_.length-3; i>0; i-=3) { - ret.push(buffer.text_.substr(i, 3)); - ret.push({ type_: '1000 separator' }); - } - ret.push(buffer.text_.substr(0, a)); - ret.reverse(); - } else { - ret.push(buffer.text_); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - }, - 'output-o': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length - 3; - for (var i=0; i<a; i+=3) { - ret.push(buffer.text_.substr(i, 3)); - ret.push({ type_: '1000 separator' }); - } - ret.push(buffer.text_.substr(i)); - } else { - ret.push(buffer.text_); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - //#endregion - }; - - // - // texify: Take MhchemParser output and convert it to TeX - // - /** @type {Texify} */ - var texify = { - go: function (input, isInner) { // (recursive, max 4 levels) - if (!input) { return ""; } - var res = ""; - var cee = false; - for (var i=0; i < input.length; i++) { - var inputi = input[i]; - if (typeof inputi === "string") { - res += inputi; - } else { - res += texify._go2(inputi); - if (inputi.type_ === '1st-level escape') { cee = true; } - } - } - if (!isInner && !cee && res) { - res = "{" + res + "}"; - } - return res; - }, - _goInner: function (input) { - if (!input) { return input; } - return texify.go(input, true); - }, - _go2: function (buf) { - /** @type {undefined | string} */ - var res; - switch (buf.type_) { - case 'chemfive': - res = ""; - var b5 = { - a: texify._goInner(buf.a), - b: texify._goInner(buf.b), - p: texify._goInner(buf.p), - o: texify._goInner(buf.o), - q: texify._goInner(buf.q), - d: texify._goInner(buf.d) - }; - // - // a - // - if (b5.a) { - if (b5.a.match(/^[+\-]/)) { b5.a = "{"+b5.a+"}"; } - res += b5.a + "\\,"; - } - // - // b and p - // - if (b5.b || b5.p) { - res += "{\\vphantom{X}}"; - res += "^{\\hphantom{"+(b5.b||"")+"}}_{\\hphantom{"+(b5.p||"")+"}}"; - res += "{\\vphantom{X}}"; - res += "^{\\smash[t]{\\vphantom{2}}\\mathllap{"+(b5.b||"")+"}}"; - res += "_{\\vphantom{2}\\mathllap{\\smash[t]{"+(b5.p||"")+"}}}"; - } - // - // o - // - if (b5.o) { - if (b5.o.match(/^[+\-]/)) { b5.o = "{"+b5.o+"}"; } - res += b5.o; - } - // - // q and d - // - if (buf.dType === 'kv') { - if (b5.d || b5.q) { - res += "{\\vphantom{X}}"; - } - if (b5.d) { - res += "^{"+b5.d+"}"; - } - if (b5.q) { - res += "_{\\smash[t]{"+b5.q+"}}"; - } - } else if (buf.dType === 'oxidation') { - if (b5.d) { - res += "{\\vphantom{X}}"; - res += "^{"+b5.d+"}"; - } - if (b5.q) { - res += "{\\vphantom{X}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - } else { - if (b5.q) { - res += "{\\vphantom{X}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - if (b5.d) { - res += "{\\vphantom{X}}"; - res += "^{"+b5.d+"}"; - } - } - break; - case 'rm': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'text': - if (buf.p1.match(/[\^_]/)) { - buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}"); - res = "\\mathrm{"+buf.p1+"}"; - } else { - res = "\\text{"+buf.p1+"}"; - } - break; - case 'roman numeral': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'state of aggregation': - res = "\\mskip2mu "+texify._goInner(buf.p1); - break; - case 'state of aggregation subscript': - res = "\\mskip1mu "+texify._goInner(buf.p1); - break; - case 'bond': - res = texify._getBond(buf.kind_); - if (!res) { - throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"]; - } - break; - case 'frac': - var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}"; - res = "\\mathchoice{\\textstyle"+c+"}{"+c+"}{"+c+"}{"+c+"}"; - break; - case 'pu-frac': - var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - res = "\\mathchoice{\\textstyle"+d+"}{"+d+"}{"+d+"}{"+d+"}"; - break; - case 'tex-math': - res = buf.p1 + " "; - break; - case 'frac-ce': - res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'overset': - res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underset': - res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underbrace': - res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}"; - break; - case 'color': - res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}"; - break; - case 'color0': - res = "\\color{" + buf.color + "}"; - break; - case 'arrow': - var b6 = { - rd: texify._goInner(buf.rd), - rq: texify._goInner(buf.rq) - }; - var arrow = "\\x" + texify._getArrow(buf.r); - if (b6.rq) { arrow += "[{" + b6.rq + "}]"; } - if (b6.rd) { - arrow += "{" + b6.rd + "}"; - } else { - arrow += "{}"; - } - res = arrow; - break; - case 'operator': - res = texify._getOperator(buf.kind_); - break; - case '1st-level escape': - res = buf.p1+" "; // &, \\\\, \\hlin - break; - case 'space': - res = " "; - break; - case 'entitySkip': - res = "~"; - break; - case 'pu-space-1': - res = "~"; - break; - case 'pu-space-2': - res = "\\mkern3mu "; - break; - case '1000 separator': - res = "\\mkern2mu "; - break; - case 'commaDecimal': - res = "{,}"; - break; - case 'comma enumeration L': - res = "{"+buf.p1+"}\\mkern6mu "; - break; - case 'comma enumeration M': - res = "{"+buf.p1+"}\\mkern3mu "; - break; - case 'comma enumeration S': - res = "{"+buf.p1+"}\\mkern1mu "; - break; - case 'hyphen': - res = "\\text{-}"; - break; - case 'addition compound': - res = "\\,{\\cdot}\\,"; - break; - case 'electron dot': - res = "\\mkern1mu \\bullet\\mkern1mu "; - break; - case 'KV x': - res = "{\\times}"; - break; - case 'prime': - res = "\\prime "; - break; - case 'cdot': - res = "\\cdot "; - break; - case 'tight cdot': - res = "\\mkern1mu{\\cdot}\\mkern1mu "; - break; - case 'times': - res = "\\times "; - break; - case 'circa': - res = "{\\sim}"; - break; - case '^': - res = "uparrow"; - break; - case 'v': - res = "downarrow"; - break; - case 'ellipsis': - res = "\\ldots "; - break; - case '/': - res = "/"; - break; - case ' / ': - res = "\\,/\\,"; - break; - default: - assertNever(buf); - throw ["MhchemBugT", "mhchem bug T. Please report."]; // Missing texify rule or unknown MhchemParser output - } - assertString(res); - return res; - }, - _getArrow: function (a) { - switch (a) { - case "->": return "rightarrow"; - case "\u2192": return "rightarrow"; - case "\u27F6": return "rightarrow"; - case "<-": return "leftarrow"; - case "<->": return "leftrightarrow"; - case "<-->": return "rightleftarrows"; - case "<=>": return "rightleftharpoons"; - case "\u21CC": return "rightleftharpoons"; - case "<=>>": return "rightequilibrium"; - case "<<=>": return "leftequilibrium"; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getBond: function (a) { - switch (a) { - case "-": return "{-}"; - case "1": return "{-}"; - case "=": return "{=}"; - case "2": return "{=}"; - case "#": return "{\\equiv}"; - case "3": return "{\\equiv}"; - case "~": return "{\\tripledash}"; - case "~-": return "{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}"; - case "~=": return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}"; - case "~--": return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}"; - case "-~-": return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}"; - case "...": return "{{\\cdot}{\\cdot}{\\cdot}}"; - case "....": return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}"; - case "->": return "{\\rightarrow}"; - case "<-": return "{\\leftarrow}"; - case "<": return "{<}"; - case ">": return "{>}"; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getOperator: function (a) { - switch (a) { - case "+": return " {}+{} "; - case "-": return " {}-{} "; - case "=": return " {}={} "; - case "<": return " {}<{} "; - case ">": return " {}>{} "; - case "<<": return " {}\\ll{} "; - case ">>": return " {}\\gg{} "; - case "\\pm": return " {}\\pm{} "; - case "\\approx": return " {}\\approx{} "; - case "$\\approx$": return " {}\\approx{} "; - case "v": return " \\downarrow{} "; - case "(v)": return " \\downarrow{} "; - case "^": return " \\uparrow{} "; - case "(^)": return " \\uparrow{} "; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - } - }; - - // - // Helpers for code anaylsis - // Will show type error at calling position - // - /** @param {number} a */ - function assertNever(a) {} - /** @param {string} a */ - function assertString(a) {} +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],e);else{var n="object"==typeof exports?e(require("katex")):e(t.katex);for(var o in n)("object"==typeof exports?exports:t)[o]=n[o]}}("undefined"!=typeof self?self:this,function(t){return function(t){var e={};function n(o){if(e[o])return e[o].exports;var a=e[o]={i:o,l:!1,exports:{}};return t[o].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(o,a,function(e){return t[e]}.bind(null,a));return o},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=1)}([function(e,n){e.exports=t},function(t,e,n){"use strict";n.r(e);var o=n(0),a=n.n(o);a.a.__defineMacro("\\ce",function(t){return r(t.consumeArgs(1)[0],"ce")}),a.a.__defineMacro("\\pu",function(t){return r(t.consumeArgs(1)[0],"pu")}),a.a.__defineMacro("\\tripledash","{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}");var r=function(t,e){for(var n="",o=t[t.length-1].loc.start,a=t.length-1;a>=0;a--)t[a].loc.start>o&&(n+=" ",o=t[a].loc.start),n+=t[a].text,o+=t[a].text.length;return c.go(i.go(n,e))},i={go:function(t,e){if(!t)return[];void 0===e&&(e="ce");var n,o="0",a={};a.parenthesisLevel=0,t=(t=(t=t.replace(/\n/g," ")).replace(/[\u2212\u2013\u2014\u2010]/g,"-")).replace(/[\u2026]/g,"...");for(var r=10,c=[];;){n!==t?(r=10,n=t):r--;var u=i.stateMachines[e],p=u.transitions[o]||u.transitions["*"];t:for(var s=0;s<p.length;s++){var _=i.patterns.match_(p[s].pattern,t);if(_){for(var d=p[s].task,m=0;m<d.action_.length;m++){var l;if(u.actions[d.action_[m].type_])l=u.actions[d.action_[m].type_](a,_.match_,d.action_[m].option);else{if(!i.actions[d.action_[m].type_])throw["MhchemBugA","mhchem bug A. Please report. ("+d.action_[m].type_+")"];l=i.actions[d.action_[m].type_](a,_.match_,d.action_[m].option)}i.concatArray(c,l)}if(o=d.nextState||o,!(t.length>0))return c;if(d.revisit||(t=_.remainder),!d.toContinue)break t}}if(r<=0)throw["MhchemBugU","mhchem bug U. Please report."]}},concatArray:function(t,e){if(e)if(Array.isArray(e))for(var n=0;n<e.length;n++)t.push(e[n]);else t.push(e)},patterns:{patterns:{empty:/^$/,else:/^./,else2:/^./,space:/^\s/,"space A":/^\s(?=[A-Z\\$])/,space$:/^\s$/,"a-z":/^[a-z]/,x:/^x/,x$:/^x$/,i$:/^i$/,letters:/^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/,"\\greek":/^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/,"one lowercase latin letter $":/^(?:([a-z])(?:$|[^a-zA-Z]))$/,"$one lowercase latin letter$ $":/^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/,"one lowercase greek letter $":/^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/,digits:/^[0-9]+/,"-9.,9":/^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/,"-9.,9 no missing 0":/^[+\-]?[0-9]+(?:[.,][0-9]+)?/,"(-)(9.,9)(e)(99)":function(t){var e=t.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/);return e&&e[0]?{match_:e.splice(1),remainder:t.substr(e[0].length)}:null},"(-)(9)^(-9)":function(t){var e=t.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/);return e&&e[0]?{match_:e.splice(1),remainder:t.substr(e[0].length)}:null},"state of aggregation $":function(t){var e=i.patterns.findObserveGroups(t,"",/^\([a-z]{1,3}(?=[\),])/,")","");if(e&&e.remainder.match(/^($|[\s,;\)\]\}])/))return e;var n=t.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/);return n?{match_:n[0],remainder:t.substr(n[0].length)}:null},"_{(state of aggregation)}$":/^_\{(\([a-z]{1,3}\))\}/,"{[(":/^(?:\\\{|\[|\()/,")]}":/^(?:\)|\]|\\\})/,", ":/^[,;]\s*/,",":/^[,;]/,".":/^[.]/,". ":/^([.\u22C5\u00B7\u2022])\s*/,"...":/^\.\.\.(?=$|[^.])/,"* ":/^([*])\s*/,"^{(...)}":function(t){return i.patterns.findObserveGroups(t,"^{","","","}")},"^($...$)":function(t){return i.patterns.findObserveGroups(t,"^","$","$","")},"^a":/^\^([0-9]+|[^\\_])/,"^\\x{}{}":function(t){return i.patterns.findObserveGroups(t,"^",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"^\\x{}":function(t){return i.patterns.findObserveGroups(t,"^",/^\\[a-zA-Z]+\{/,"}","")},"^\\x":/^\^(\\[a-zA-Z]+)\s*/,"^(-1)":/^\^(-?\d+)/,"'":/^'/,"_{(...)}":function(t){return i.patterns.findObserveGroups(t,"_{","","","}")},"_($...$)":function(t){return i.patterns.findObserveGroups(t,"_","$","$","")},_9:/^_([+\-]?[0-9]+|[^\\])/,"_\\x{}{}":function(t){return i.patterns.findObserveGroups(t,"_",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"_\\x{}":function(t){return i.patterns.findObserveGroups(t,"_",/^\\[a-zA-Z]+\{/,"}","")},"_\\x":/^_(\\[a-zA-Z]+)\s*/,"^_":/^(?:\^(?=_)|\_(?=\^)|[\^_]$)/,"{}":/^\{\}/,"{...}":function(t){return i.patterns.findObserveGroups(t,"","{","}","")},"{(...)}":function(t){return i.patterns.findObserveGroups(t,"{","","","}")},"$...$":function(t){return i.patterns.findObserveGroups(t,"","$","$","")},"${(...)}$":function(t){return i.patterns.findObserveGroups(t,"${","","","}$")},"$(...)$":function(t){return i.patterns.findObserveGroups(t,"$","","","$")},"=<>":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(t){return i.patterns.findObserveGroups(t,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(t){return i.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(t){return i.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(t){return i.patterns.findObserveGroups(t,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(t){return i.patterns.findObserveGroups(t,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(t){return i.patterns.findObserveGroups(t,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(t){var e;if(e=t.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/))return{match_:e[0],remainder:t.substr(e[0].length)};var n=i.patterns.findObserveGroups(t,"","$","$","");return n&&(e=n.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/))?{match_:e[0],remainder:t.substr(e[0].length)}:null},amount2:function(t){return this.amount(t)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(t){if(t.match(/^\([a-z]+\)$/))return null;var e=t.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);return e?{match_:e[0],remainder:t.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(t,e,n,o,a,r,i,c,u,p){var s=function(t,e){if("string"==typeof e)return 0!==t.indexOf(e)?null:e;var n=t.match(e);return n?n[0]:null},_=s(t,e);if(null===_)return null;if(t=t.substr(_.length),null===(_=s(t,n)))return null;var d=function(t,e,n){for(var o=0;e<t.length;){var a=t.charAt(e),r=s(t.substr(e),n);if(null!==r&&0===o)return{endMatchBegin:e,endMatchEnd:e+r.length};if("{"===a)o++;else if("}"===a){if(0===o)throw["ExtraCloseMissingOpen","Extra close brace or missing open brace"];o--}e++}return null}(t,_.length,o||a);if(null===d)return null;var m=t.substring(0,o?d.endMatchEnd:d.endMatchBegin);if(r||i){var l=this.findObserveGroups(t.substr(d.endMatchEnd),r,i,c,u);if(null===l)return null;var f=[m,l.match_];return{match_:p?f.join(""):f,remainder:l.remainder}}return{match_:m,remainder:t.substr(d.endMatchEnd)}},match_:function(t,e){var n=i.patterns.patterns[t];if(void 0===n)throw["MhchemBugP","mhchem bug P. Please report. ("+t+")"];if("function"==typeof n)return i.patterns.patterns[t](e);var o=e.match(n);return o?{match_:o[2]?[o[1],o[2]]:o[1]?o[1]:o[0],remainder:e.substr(o[0].length)}:null}},actions:{"a=":function(t,e){t.a=(t.a||"")+e},"b=":function(t,e){t.b=(t.b||"")+e},"p=":function(t,e){t.p=(t.p||"")+e},"o=":function(t,e){t.o=(t.o||"")+e},"q=":function(t,e){t.q=(t.q||"")+e},"d=":function(t,e){t.d=(t.d||"")+e},"rm=":function(t,e){t.rm=(t.rm||"")+e},"text=":function(t,e){t.text_=(t.text_||"")+e},insert:function(t,e,n){return{type_:n}},"insert+p1":function(t,e,n){return{type_:n,p1:e}},"insert+p1+p2":function(t,e,n){return{type_:n,p1:e[0],p2:e[1]}},copy:function(t,e){return e},rm:function(t,e){return{type_:"rm",p1:e||""}},text:function(t,e){return i.go(e,"text")},"{text}":function(t,e){var n=["{"];return i.concatArray(n,i.go(e,"text")),n.push("}"),n},"tex-math":function(t,e){return i.go(e,"tex-math")},"tex-math tight":function(t,e){return i.go(e,"tex-math tight")},bond:function(t,e,n){return{type_:"bond",kind_:n||e}},"color0-output":function(t,e){return{type_:"color0",color:e[0]}},ce:function(t,e){return i.go(e)},"1/2":function(t,e){var n=[];e.match(/^[+\-]/)&&(n.push(e.substr(0,1)),e=e.substr(1));var o=e.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);return o[1]=o[1].replace(/\$/g,""),n.push({type_:"frac",p1:o[1],p2:o[2]}),o[3]&&(o[3]=o[3].replace(/\$/g,""),n.push({type_:"tex-math",p1:o[3]})),n},"9,9":function(t,e){return i.go(e,"9,9")}},createTransitions:function(t){var e,n,o,a,r={};for(e in t)for(n in t[e])for(o=n.split("|"),t[e][n].stateArray=o,a=0;a<o.length;a++)r[o[a]]=[];for(e in t)for(n in t[e])for(o=t[e][n].stateArray||[],a=0;a<o.length;a++){var i=t[e][n];if(i.action_){i.action_=[].concat(i.action_);for(var c=0;c<i.action_.length;c++)"string"==typeof i.action_[c]&&(i.action_[c]={type_:i.action_[c]})}else i.action_=[];for(var u=e.split("|"),p=0;p<u.length;p++)if("*"===o[a])for(var s in r)r[s].push({pattern:u[p],task:i});else r[o[a]].push({pattern:u[p],task:i})}return r},stateMachines:{}};i.stateMachines={ce:{transitions:i.createTransitions({empty:{"*":{action_:"output"}},else:{"0|1|2":{action_:"beginsWithBond=false",revisit:!0,toContinue:!0}},oxidation$:{0:{action_:"oxidation-output"}},CMT:{r:{action_:"rdt=",nextState:"rt"},rd:{action_:"rqt=",nextState:"rdt"}},arrowUpDown:{"0|1|2|as":{action_:["sb=false","output","operator"],nextState:"1"}},uprightEntities:{"0|1|2":{action_:["o=","output"],nextState:"1"}},orbital:{"0|1|2|3":{action_:"o=",nextState:"o"}},"->":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(t,e){var n;if((t.d||"").match(/^[0-9]+$/)){var o=t.d;t.d=void 0,n=this.output(t),t.b=o}else n=this.output(t);return i.actions["o="](t,e),n},"d= kv":function(t,e){t.d=e,t.dType="kv"},"charge or bond":function(t,e){if(t.beginsWithBond){var n=[];return i.concatArray(n,this.output(t)),i.concatArray(n,i.actions.bond(t,e,"-")),n}t.d=e},"- after o/d":function(t,e,n){var o=i.patterns.match_("orbital",t.o||""),a=i.patterns.match_("one lowercase greek letter $",t.o||""),r=i.patterns.match_("one lowercase latin letter $",t.o||""),c=i.patterns.match_("$one lowercase latin letter$ $",t.o||""),u="-"===e&&(o&&""===o.remainder||a||r||c);!u||t.a||t.b||t.p||t.d||t.q||o||!r||(t.o="$"+t.o+"$");var p=[];return u?(i.concatArray(p,this.output(t)),p.push({type_:"hyphen"})):(o=i.patterns.match_("digits",t.d||""),n&&o&&""===o.remainder?(i.concatArray(p,i.actions["d="](t,e)),i.concatArray(p,this.output(t))):(i.concatArray(p,this.output(t)),i.concatArray(p,i.actions.bond(t,e,"-")))),p},"a to o":function(t){t.o=t.a,t.a=void 0},"sb=true":function(t){t.sb=!0},"sb=false":function(t){t.sb=!1},"beginsWithBond=true":function(t){t.beginsWithBond=!0},"beginsWithBond=false":function(t){t.beginsWithBond=!1},"parenthesisLevel++":function(t){t.parenthesisLevel++},"parenthesisLevel--":function(t){t.parenthesisLevel--},"state of aggregation":function(t,e){return{type_:"state of aggregation",p1:i.go(e,"o")}},comma:function(t,e){var n=e.replace(/\s*$/,"");return n!==e&&0===t.parenthesisLevel?{type_:"comma enumeration L",p1:n}:{type_:"comma enumeration M",p1:n}},output:function(t,e,n){var o,a,r;t.r?(a="M"===t.rdt?i.go(t.rd,"tex-math"):"T"===t.rdt?[{type_:"text",p1:t.rd||""}]:i.go(t.rd),r="M"===t.rqt?i.go(t.rq,"tex-math"):"T"===t.rqt?[{type_:"text",p1:t.rq||""}]:i.go(t.rq),o={type_:"arrow",r:t.r,rd:a,rq:r}):(o=[],(t.a||t.b||t.p||t.o||t.q||t.d||n)&&(t.sb&&o.push({type_:"entitySkip"}),t.o||t.q||t.d||t.b||t.p||2===n?t.o||t.q||t.d||!t.b&&!t.p?t.o&&"kv"===t.dType&&i.patterns.match_("d-oxidation$",t.d||"")?t.dType="oxidation":t.o&&"kv"===t.dType&&!t.q&&(t.dType=void 0):(t.o=t.a,t.d=t.b,t.q=t.p,t.a=t.b=t.p=void 0):(t.o=t.a,t.a=void 0),o.push({type_:"chemfive",a:i.go(t.a,"a"),b:i.go(t.b,"bd"),p:i.go(t.p,"pq"),o:i.go(t.o,"o"),q:i.go(t.q,"pq"),d:i.go(t.d,"oxidation"===t.dType?"oxidation":"bd"),dType:t.dType})));for(var c in t)"parenthesisLevel"!==c&&"beginsWithBond"!==c&&delete t[c];return o},"oxidation-output":function(t,e){var n=["{"];return i.concatArray(n,i.go(e,"oxidation")),n.push("}"),n},"frac-output":function(t,e){return{type_:"frac-ce",p1:i.go(e[0]),p2:i.go(e[1])}},"overset-output":function(t,e){return{type_:"overset",p1:i.go(e[0]),p2:i.go(e[1])}},"underset-output":function(t,e){return{type_:"underset",p1:i.go(e[0]),p2:i.go(e[1])}},"underbrace-output":function(t,e){return{type_:"underbrace",p1:i.go(e[0]),p2:i.go(e[1])}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:i.go(e[1])}},"r=":function(t,e){t.r=e},"rdt=":function(t,e){t.rdt=e},"rd=":function(t,e){t.rd=e},"rqt=":function(t,e){t.rqt=e},"rq=":function(t,e){t.rq=e},operator:function(t,e,n){return{type_:"operator",kind_:n||e}}}},a:{transitions:i.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:i.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(t){if(t.text_){var e={type_:"text",p1:t.text_};for(var n in t)delete t[n];return e}}}},pq:{transitions:i.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(t,e){return{type_:"state of aggregation subscript",p1:i.go(e,"o")}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:i.go(e[1],"pq")}}}},bd:{transitions:i.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(t,e){return{type_:"color",color1:e[0],color2:i.go(e[1],"bd")}}}},oxidation:{transitions:i.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(t,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var n in t)delete t[n];return e}}}},"tex-math tight":{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(t,e){t.o=(t.o||"")+"{"+e+"}"},output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var n in t)delete t[n];return e}}}},"9,9":{transitions:i.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:i.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),e[1]&&(i.concatArray(n,i.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?i.concatArray(n,i.go(e[2],"pu-9,9")):n.push(e[2])),e[3]=e[4]||e[3],e[3]&&(e[3]=e[3].trim(),"e"===e[3]||"*"===e[3].substr(0,1)?n.push({type_:"cdot"}):n.push({type_:"times"}))),e[3]&&n.push("10^{"+e[5]+"}"),n},"number^":function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),i.concatArray(n,i.go(e[1],"pu-9,9")),n.push("^{"+e[2]+"}"),n},operator:function(t,e,n){return{type_:"operator",kind_:n||e}},space:function(){return{type_:"pu-space-1"}},output:function(t){var e,n=i.patterns.match_("{(...)}",t.d||"");n&&""===n.remainder&&(t.d=n.match_);var o=i.patterns.match_("{(...)}",t.q||"");if(o&&""===o.remainder&&(t.q=o.match_),t.d&&(t.d=t.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.d=t.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),t.q){t.q=t.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.q=t.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F");var a={d:i.go(t.d,"pu"),q:i.go(t.q,"pu")};"//"===t.o?e={type_:"pu-frac",p1:a.d,p2:a.q}:(e=a.d,a.d.length>1||a.q.length>1?e.push({type_:" / "}):e.push({type_:"/"}),i.concatArray(e,a.q))}else e=i.go(t.d,"pu-2");for(var r in t)delete t[r];return e}}},"pu-2":{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"*":{"*":{action_:["output","cdot"],nextState:"0"}},"\\x":{"*":{action_:"rm="}},space:{"*":{action_:["output","space"],nextState:"0"}},"^{(...)}|^(-1)":{1:{action_:"^(-1)"}},"-9.,9":{0:{action_:"rm=",nextState:"0"},1:{action_:"^(-1)",nextState:"0"}},"{...}|else":{"*":{action_:"rm=",nextState:"1"}}}),actions:{cdot:function(){return{type_:"tight cdot"}},"^(-1)":function(t,e){t.rm+="^{"+e+"}"},space:function(){return{type_:"pu-space-2"}},output:function(t){var e=[];if(t.rm){var n=i.patterns.match_("{(...)}",t.rm||"");e=n&&""===n.remainder?i.go(n.match_,"pu"):{type_:"rm",p1:t.rm}}for(var o in t)delete t[o];return e}}},"pu-9,9":{transitions:i.createTransitions({empty:{0:{action_:"output-0"},o:{action_:"output-o"}},",":{0:{action_:["output-0","comma"],nextState:"o"}},".":{0:{action_:["output-0","copy"],nextState:"o"}},else:{"*":{action_:"text="}}}),actions:{comma:function(){return{type_:"commaDecimal"}},"output-0":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){var n=t.text_.length%3;0===n&&(n=3);for(var o=t.text_.length-3;o>0;o-=3)e.push(t.text_.substr(o,3)),e.push({type_:"1000 separator"});e.push(t.text_.substr(0,n)),e.reverse()}else e.push(t.text_);for(var a in t)delete t[a];return e},"output-o":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){for(var n=t.text_.length-3,o=0;o<n;o+=3)e.push(t.text_.substr(o,3)),e.push({type_:"1000 separator"});e.push(t.text_.substr(o))}else e.push(t.text_);for(var a in t)delete t[a];return e}}}};var c={go:function(t,e){if(!t)return"";for(var n="",o=!1,a=0;a<t.length;a++){var r=t[a];"string"==typeof r?n+=r:(n+=c._go2(r),"1st-level escape"===r.type_&&(o=!0))}return e||o||!n||(n="{"+n+"}"),n},_goInner:function(t){return t?c.go(t,!0):t},_go2:function(t){var e;switch(t.type_){case"chemfive":e="";var n={a:c._goInner(t.a),b:c._goInner(t.b),p:c._goInner(t.p),o:c._goInner(t.o),q:c._goInner(t.q),d:c._goInner(t.d)};n.a&&(n.a.match(/^[+\-]/)&&(n.a="{"+n.a+"}"),e+=n.a+"\\,"),(n.b||n.p)&&(e+="{\\vphantom{X}}",e+="^{\\hphantom{"+(n.b||"")+"}}_{\\hphantom{"+(n.p||"")+"}}",e+="{\\vphantom{X}}",e+="^{\\smash[t]{\\vphantom{2}}\\mathllap{"+(n.b||"")+"}}",e+="_{\\vphantom{2}\\mathllap{\\smash[t]{"+(n.p||"")+"}}}"),n.o&&(n.o.match(/^[+\-]/)&&(n.o="{"+n.o+"}"),e+=n.o),"kv"===t.dType?((n.d||n.q)&&(e+="{\\vphantom{X}}"),n.d&&(e+="^{"+n.d+"}"),n.q&&(e+="_{\\smash[t]{"+n.q+"}}")):"oxidation"===t.dType?(n.d&&(e+="{\\vphantom{X}}",e+="^{"+n.d+"}"),n.q&&(e+="{\\vphantom{X}}",e+="_{\\smash[t]{"+n.q+"}}")):(n.q&&(e+="{\\vphantom{X}}",e+="_{\\smash[t]{"+n.q+"}}"),n.d&&(e+="{\\vphantom{X}}",e+="^{"+n.d+"}"));break;case"rm":e="\\mathrm{"+t.p1+"}";break;case"text":t.p1.match(/[\^_]/)?(t.p1=t.p1.replace(" ","~").replace("-","\\text{-}"),e="\\mathrm{"+t.p1+"}"):e="\\text{"+t.p1+"}";break;case"roman numeral":e="\\mathrm{"+t.p1+"}";break;case"state of aggregation":e="\\mskip2mu "+c._goInner(t.p1);break;case"state of aggregation subscript":e="\\mskip1mu "+c._goInner(t.p1);break;case"bond":if(!(e=c._getBond(t.kind_)))throw["MhchemErrorBond","mhchem Error. Unknown bond type ("+t.kind_+")"];break;case"frac":var o="\\frac{"+t.p1+"}{"+t.p2+"}";e="\\mathchoice{\\textstyle"+o+"}{"+o+"}{"+o+"}{"+o+"}";break;case"pu-frac":var a="\\frac{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";e="\\mathchoice{\\textstyle"+a+"}{"+a+"}{"+a+"}{"+a+"}";break;case"tex-math":e=t.p1+" ";break;case"frac-ce":e="\\frac{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";break;case"overset":e="\\overset{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";break;case"underset":e="\\underset{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";break;case"underbrace":e="\\underbrace{"+c._goInner(t.p1)+"}_{"+c._goInner(t.p2)+"}";break;case"color":e="{\\color{"+t.color1+"}{"+c._goInner(t.color2)+"}}";break;case"color0":e="\\color{"+t.color+"}";break;case"arrow":var r={rd:c._goInner(t.rd),rq:c._goInner(t.rq)},i="\\x"+c._getArrow(t.r);r.rq&&(i+="[{"+r.rq+"}]"),e=i+=r.rd?"{"+r.rd+"}":"{}";break;case"operator":e=c._getOperator(t.kind_);break;case"1st-level escape":e=t.p1+" ";break;case"space":e=" ";break;case"entitySkip":case"pu-space-1":e="~";break;case"pu-space-2":e="\\mkern3mu ";break;case"1000 separator":e="\\mkern2mu ";break;case"commaDecimal":e="{,}";break;case"comma enumeration L":e="{"+t.p1+"}\\mkern6mu ";break;case"comma enumeration M":e="{"+t.p1+"}\\mkern3mu ";break;case"comma enumeration S":e="{"+t.p1+"}\\mkern1mu ";break;case"hyphen":e="\\text{-}";break;case"addition compound":e="\\,{\\cdot}\\,";break;case"electron dot":e="\\mkern1mu \\bullet\\mkern1mu ";break;case"KV x":e="{\\times}";break;case"prime":e="\\prime ";break;case"cdot":e="\\cdot ";break;case"tight cdot":e="\\mkern1mu{\\cdot}\\mkern1mu ";break;case"times":e="\\times ";break;case"circa":e="{\\sim}";break;case"^":e="uparrow";break;case"v":e="downarrow";break;case"ellipsis":e="\\ldots ";break;case"/":e="/";break;case" / ":e="\\,/\\,";break;default:throw["MhchemBugT","mhchem bug T. Please report."]}return e},_getArrow:function(t){switch(t){case"->":case"\u2192":case"\u27f6":return"rightarrow";case"<-":return"leftarrow";case"<->":return"leftrightarrow";case"<--\x3e":return"rightleftarrows";case"<=>":case"\u21cc":return"rightleftharpoons";case"<=>>":return"rightequilibrium";case"<<=>":return"leftequilibrium";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(t){switch(t){case"-":case"1":return"{-}";case"=":case"2":return"{=}";case"#":case"3":return"{\\equiv}";case"~":return"{\\tripledash}";case"~-":return"{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";case"~=":case"~--":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"-~-":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(t){switch(t){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":case"$\\approx$":return" {}\\approx{} ";case"v":case"(v)":return" \\downarrow{} ";case"^":case"(^)":return" \\uparrow{} ";default:throw["MhchemBugT","mhchem bug T. Please report."]}}}}]).default}); \ No newline at end of file diff --git a/plugins/tiddlywiki/katex/files/tiddlywiki.files b/plugins/tiddlywiki/katex/files/tiddlywiki.files index fc6dc276f..1a1ffa088 100644 --- a/plugins/tiddlywiki/katex/files/tiddlywiki.files +++ b/plugins/tiddlywiki/katex/files/tiddlywiki.files @@ -32,7 +32,9 @@ "type": "application/javascript", "title": "$:/plugins/tiddlywiki/katex/mhchem.min.js", "module-type": "library" - } + }, + "prefix": "(function(realRequire) {var require = function(m) {if(m===\"katex\"){m = \"$:/plugins/tiddlywiki/katex/katex.min.js\"};return realRequire(m);};", + "suffix": "})(require);\n" } ] } diff --git a/plugins/tiddlywiki/katex/plugin.info b/plugins/tiddlywiki/katex/plugin.info index 13df252d8..830abf934 100644 --- a/plugins/tiddlywiki/katex/plugin.info +++ b/plugins/tiddlywiki/katex/plugin.info @@ -3,5 +3,5 @@ "name": "KaTeX", "description": "KaTeX library for mathematical typography", "list": "readme usage", - "library-version": "v0.10.2" + "library-version": "v0.12.0" } diff --git a/plugins/tiddlywiki/katex/readme.tid b/plugins/tiddlywiki/katex/readme.tid index 0d8c291a3..e6817bf94 100644 --- a/plugins/tiddlywiki/katex/readme.tid +++ b/plugins/tiddlywiki/katex/readme.tid @@ -1,6 +1,6 @@ title: $:/plugins/tiddlywiki/katex/readme -This is a TiddlyWiki plugin for mathematical and chemical typesetting based on [ext[KaTeX from Khan Academy|http://khan.github.io/KaTeX/]] (v0.10.2) and [ext[mhchem|https://github.com/mhchem/MathJax-mhchem]] through a [ext[Katex extension|https://github.com/KaTeX/KaTeX/tree/master/contrib/mhchem]]. +This is a TiddlyWiki plugin for mathematical and chemical typesetting based on [ext[KaTeX from Khan Academy|http://khan.github.io/KaTeX/]] (v0.12.0) and [ext[mhchem|https://github.com/mhchem/MathJax-mhchem]] through a [ext[Katex extension|https://github.com/KaTeX/KaTeX/tree/master/contrib/mhchem]]. It is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js. diff --git a/plugins/tiddlywiki/katex/wrapper.js b/plugins/tiddlywiki/katex/wrapper.js index 57536b63e..983392802 100644 --- a/plugins/tiddlywiki/katex/wrapper.js +++ b/plugins/tiddlywiki/katex/wrapper.js @@ -15,18 +15,6 @@ Wrapper for `katex.min.js` that provides a `<$latex>` widget. It is also availab var katex = require("$:/plugins/tiddlywiki/katex/katex.min.js"), chemParse = require("$:/plugins/tiddlywiki/katex/mhchem.min.js"), Widget = require("$:/core/modules/widgets/widget.js").widget; -// Add \ce, \pu, and \tripledash to the KaTeX macros. -katex.__defineMacro("\\ce", function(context) { - return chemParse(context.consumeArgs(1)[0], "ce") -}); -katex.__defineMacro("\\pu", function(context) { - return chemParse(context.consumeArgs(1)[0], "pu"); -}); -// Needed for \bond for the ~ forms -// Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not -// a mathematical minus, U+2212. So we need that extra 0.56. -katex.__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu" -+ "\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}"); var KaTeXWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); From 12f18474755c94362eef7191eafb532bafb743b1 Mon Sep 17 00:00:00 2001 From: Simon Baird <simon.baird@gmail.com> Date: Sun, 31 Jan 2021 10:32:18 -0500 Subject: [PATCH 1224/2376] Support upload saver without username/password (#5455) The default behaviour is unchanged, but if you write "yes" to $:/UploadWithUrlOnly then it will assume it's possible to upload with a blank username and password, as long as the host is set. The motivation is to support a upload plugin compatible upload service that uses some method to authenticate other than the legacy upload plugin user/password params. Without this patch, the user would need to enter something random in the user and password fields for TW to decide the upload plugin can be used. --- core/modules/savers/upload.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/modules/savers/upload.js b/core/modules/savers/upload.js index bcf4b9d54..a7264338d 100644 --- a/core/modules/savers/upload.js +++ b/core/modules/savers/upload.js @@ -28,10 +28,22 @@ UploadSaver.prototype.save = function(text,method,callback) { password = $tw.utils.getPassword("upload"), uploadDir = this.wiki.getTextReference("$:/UploadDir") || ".", uploadFilename = this.wiki.getTextReference("$:/UploadFilename") || "index.html", + uploadWithUrlOnly = this.wiki.getTextReference("$:/UploadWithUrlOnly") || "no", url = this.wiki.getTextReference("$:/UploadURL"); // Bail out if we don't have the bits we need - if(!username || username.toString().trim() === "" || !password || password.toString().trim() === "") { - return false; + if (uploadWithUrlOnly === "yes") { + // The url is good enough. No need for a username and password. + // Assume the server uses some other kind of auth mechanism. + if(!url || url.toString().trim() === "") { + return false; + } + } + else { + // Require username and password to be present. + // Assume the server uses the standard UploadPlugin username/password. + if(!username || username.toString().trim() === "" || !password || password.toString().trim() === "") { + return false; + } } // Construct the url if not provided if(!url) { From 9f9ce6595b08032a602981f82940ca113cff8211 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 3 Feb 2021 15:13:56 +0000 Subject: [PATCH 1225/2376] Make it easier to subclass the wikitext parser with a custom rule set We can now pass arrays of rule classes to the parser constructor, overriding the rules that would normally be used by the parser. This allows us to create custom variants of the wikitext parser with their own content type. It could also provide a basis for a new Markdown parser based on our existing wikitext parser but with new rules. --- boot/boot.js | 21 ++++--- core/modules/parsers/wikiparser/wikiparser.js | 58 +++++++++++++------ .../new/ParserSubclassingMechanism.tid | 42 ++++++++++++++ 3 files changed, 95 insertions(+), 26 deletions(-) create mode 100644 editions/dev/tiddlers/new/ParserSubclassingMechanism.tid diff --git a/boot/boot.js b/boot/boot.js index 353e5e0f6..fbac37d77 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -892,6 +892,19 @@ $tw.modules.applyMethods = function(moduleType,targetObject) { return targetObject; }; +/* +Return a class created from a modules. The module should export the properties to be added to those of the optional base class +*/ +$tw.modules.createClassFromModule = function(moduleExports,baseClass) { + var newClass = function() {}; + if(baseClass) { + newClass.prototype = new baseClass(); + newClass.prototype.constructor = baseClass; + } + $tw.utils.extend(newClass.prototype,moduleExports); + return newClass; +}; + /* Return an array of classes created from the modules of a specified type. Each module should export the properties to be added to those of the optional base class */ @@ -899,13 +912,7 @@ $tw.modules.createClassesFromModules = function(moduleType,subType,baseClass) { var classes = Object.create(null); $tw.modules.forEachModuleOfType(moduleType,function(title,moduleExports) { if(!subType || moduleExports.types[subType]) { - var newClass = function() {}; - if(baseClass) { - newClass.prototype = new baseClass(); - newClass.prototype.constructor = baseClass; - } - $tw.utils.extend(newClass.prototype,moduleExports); - classes[moduleExports.name] = newClass; + classes[moduleExports.name] = $tw.modules.createClassFromModule(moduleExports,baseClass); } }); return classes; diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index dbeed9de2..e6f860a91 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -25,6 +25,14 @@ Attributes are stored as hashmaps of the following objects: /*global $tw: false */ "use strict"; +/* +type: content type of text +text: text to be parsed +options: see below: + parseAsInline: true to parse text as inline instead of block + wiki: reference to wiki to use + _canonical_uri: optional URI of content if text is missing or empty +*/ var WikiParser = function(type,text,options) { this.wiki = options.wiki; var self = this; @@ -33,19 +41,6 @@ var WikiParser = function(type,text,options) { this.loadRemoteTiddler(options._canonical_uri); text = $tw.language.getRawString("LazyLoadingWarning"); } - // Initialise the classes if we don't have them already - if(!this.pragmaRuleClasses) { - WikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules("wikirule","pragma",$tw.WikiRuleBase); - this.setupRules(WikiParser.prototype.pragmaRuleClasses,"$:/config/WikiParserRules/Pragmas/"); - } - if(!this.blockRuleClasses) { - WikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules("wikirule","block",$tw.WikiRuleBase); - this.setupRules(WikiParser.prototype.blockRuleClasses,"$:/config/WikiParserRules/Block/"); - } - if(!this.inlineRuleClasses) { - WikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules("wikirule","inline",$tw.WikiRuleBase); - this.setupRules(WikiParser.prototype.inlineRuleClasses,"$:/config/WikiParserRules/Inline/"); - } // Save the parse text this.type = type || "text/vnd.tiddlywiki"; this.source = text || ""; @@ -54,13 +49,38 @@ var WikiParser = function(type,text,options) { this.configTrimWhiteSpace = false; // Set current parse position this.pos = 0; - // Instantiate the pragma parse rules - this.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,"pragma",0); - // Instantiate the parser block and inline rules - this.blockRules = this.instantiateRules(this.blockRuleClasses,"block",0); - this.inlineRules = this.instantiateRules(this.inlineRuleClasses,"inline",0); - // Parse any pragmas + // Start with empty output this.tree = []; + // Assemble the rule classes we're going to use + var pragmaRuleClasses, blockRuleClasses, inlineRuleClasses; + if(options.rules) { + pragmaRuleClasses = options.rules.pragma; + blockRuleClasses = options.rules.block; + inlineRuleClasses = options.rules.inline; + } else { + // Setup the rule classes if we don't have them already + if(!this.pragmaRuleClasses) { + WikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules("wikirule","pragma",$tw.WikiRuleBase); + this.setupRules(WikiParser.prototype.pragmaRuleClasses,"$:/config/WikiParserRules/Pragmas/"); + } + pragmaRuleClasses = this.pragmaRuleClasses; + if(!this.blockRuleClasses) { + WikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules("wikirule","block",$tw.WikiRuleBase); + this.setupRules(WikiParser.prototype.blockRuleClasses,"$:/config/WikiParserRules/Block/"); + } + blockRuleClasses = this.blockRuleClasses; + if(!this.inlineRuleClasses) { + WikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules("wikirule","inline",$tw.WikiRuleBase); + this.setupRules(WikiParser.prototype.inlineRuleClasses,"$:/config/WikiParserRules/Inline/"); + } + inlineRuleClasses = this.inlineRuleClasses; + } + // Instantiate the pragma parse rules + this.pragmaRules = this.instantiateRules(pragmaRuleClasses,"pragma",0); + // Instantiate the parser block and inline rules + this.blockRules = this.instantiateRules(blockRuleClasses,"block",0); + this.inlineRules = this.instantiateRules(inlineRuleClasses,"inline",0); + // Parse any pragmas var topBranch = this.parsePragmas(); // Parse the text into inline runs or blocks if(options.parseAsInline) { diff --git a/editions/dev/tiddlers/new/ParserSubclassingMechanism.tid b/editions/dev/tiddlers/new/ParserSubclassingMechanism.tid new file mode 100644 index 000000000..c4aab295e --- /dev/null +++ b/editions/dev/tiddlers/new/ParserSubclassingMechanism.tid @@ -0,0 +1,42 @@ +created: 20210203150855206 +modified: 20210203150855206 +title: ParserSubclassingMechanism + +!! Introduction + +The wikitext parser subclassing mechanism makes it possible for custom parsers to use the wiki text parsing engine, but to customise the rules that are used. + +!! Example + +Here is an example of a subclass of the checkbox widget that adds logging to the event handler: + +```js +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var WikiParser = require("$:/core/modules/parsers/wikiparser/wikiparser.js")["text/vnd.tiddlywiki"], + HtmlParser = $tw.modules.createClassFromModule(require("$:/core/modules/parsers/wikiparser/rules/html.js"),$tw.WikiRuleBase), + EntityParser = $tw.modules.createClassFromModule(require("$:/core/modules/parsers/wikiparser/rules/entity.js"),$tw.WikiRuleBase); + +var MyCustomWikiParser = function(type,text,options) { + var parser = new WikiParser(type,text,$tw.utils.extend({},options,{ + // Force the parser to parse in inline mode + parseAsInline: true, + // Specify which rules will be used + rules: { + pragma: [], + block: [], + inline: [HtmlParser,EntityParser] + } + })); + this.tree = parser.tree; + this.prototype = parser.prototype; +}; + +exports["text/vnd.my-custom-type"] = MyCustomWikiParser; + +})(); +``` From bfa062f23d2727c6f38e8d0ba48648ab906144b3 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Thu, 4 Feb 2021 08:11:07 -0800 Subject: [PATCH 1226/2376] Fix filesystem (#5465) --- core/modules/commands/savewikifolder.js | 18 ++++- core/modules/syncer.js | 4 -- core/modules/utils/filesystem.js | 67 +++++++++++++------ .../filesystem/filesystemadaptor.js | 42 ++++++------ plugins/tiddlywiki/savetrail/savetrail.js | 8 +-- .../tiddlywiki/tiddlyweb/tiddlywebadaptor.js | 14 ++-- 6 files changed, 96 insertions(+), 57 deletions(-) diff --git a/core/modules/commands/savewikifolder.js b/core/modules/commands/savewikifolder.js index 1e3ab36c6..f5cfb9cd7 100644 --- a/core/modules/commands/savewikifolder.js +++ b/core/modules/commands/savewikifolder.js @@ -158,11 +158,25 @@ WikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) { }; WikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) { + var title = tiddler.fields.title, fileInfo, pathFilters, extFilters; + if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")) { + pathFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"); + } + if(this.wiki.tiddlerExists("$:/config/FileSystemExtensions")) { + extFilters = this.wiki.getTiddlerText("$:/config/FileSystemExtensions","").split("\n"); + } var fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ directory: path.resolve(this.wikiFolderPath,directory), - wiki: this.wiki + wiki: this.wiki, + pathFilters: pathFilters, + extFilters: extFilters, + originalpath: this.wiki.extractTiddlerDataItem("$:/config/OriginalTiddlerPaths",title, "") }); - $tw.utils.saveTiddlerToFileSync(tiddler,fileInfo); + try { + $tw.utils.saveTiddlerToFileSync(tiddler,fileInfo); + } catch (err) { + console.log("SaveWikiFolder: Error saving file '" + fileInfo.filepath + "', tiddler: '" + tiddler.fields.title); + } }; WikiFolderMaker.prototype.saveJSONFile = function(filename,json) { diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 90ed41032..23d21097f 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -640,10 +640,6 @@ DeleteTiddlerTask.prototype.run = function(callback) { } // Remove the info stored about this tiddler delete self.syncer.tiddlerInfo[self.title]; - if($tw.boot.files){ - // Remove the tiddler from $tw.boot.files - delete $tw.boot.files[self.title]; - } // Invoke the callback callback(null); },{ diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 9d05f7a8d..b7fe2156c 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -252,7 +252,7 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { extFilters: options.extFilters, wiki: options.wiki }); - if(metaExt){ + if(metaExt) { if(metaExt === ".tid") { // Overriding to the .tid extension needs special handling fileInfo.type = "application/x-tiddler"; @@ -388,20 +388,18 @@ exports.generateTiddlerFilepath = function(title,options) { // If the last write failed with an error, or if path does not start with: // the resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, // then encodeURIComponent() and resolve to tiddler directory - var newPath = fullPath, + var writePath = $tw.hooks.invokeHook("th-make-tiddler-path",fullPath), encode = (options.fileInfo || {writeError: false}).writeError == true; - if(!encode){ + if(!encode) { encode = !(fullPath.indexOf(path.resolve(directory)) == 0 || fullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 || fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0); } - if(encode){ - fullPath = path.resolve(directory, encodeURIComponent(fullPath)); + if(encode) { + writePath = path.resolve(directory,encodeURIComponent(fullPath)); } - // Call hook to allow plugins to modify the final path - fullPath = $tw.hooks.invokeHook("th-make-tiddler-path", newPath, fullPath); // Return the full path to the file - return fullPath; + return writePath; }; /* @@ -419,14 +417,29 @@ exports.saveTiddlerToFile = function(tiddler,fileInfo,callback) { if(err) { return callback(err); } - fs.writeFile(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text","bag"]}),"utf8",callback); + fs.writeFile(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text","bag"]}),"utf8",function(err) { + if(err) { + return callback(err); + } + return callback(null,fileInfo); + }); }); } else { // Save the tiddler as a self contained templated file if(fileInfo.type === "application/x-tiddler") { - fs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text","bag"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8",callback); + fs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: ["text","bag"]}) + (!!tiddler.fields.text ? "\n\n" + tiddler.fields.text : ""),"utf8",function(err) { + if(err) { + return callback(err); + } + return callback(null,fileInfo); + }); } else { - fs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: ["bag"]})],null,$tw.config.preferences.jsonSpaces),"utf8",callback); + fs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: ["bag"]})],null,$tw.config.preferences.jsonSpaces),"utf8",function(err) { + if(err) { + return callback(err); + } + return callback(null,fileInfo); + }); } } }; @@ -457,10 +470,12 @@ exports.saveTiddlerToFileSync = function(tiddler,fileInfo) { /* Delete a file described by the fileInfo if it exits */ -exports.deleteTiddlerFile = function(fileInfo, callback) { +exports.deleteTiddlerFile = function(fileInfo,callback) { //Only attempt to delete files that exist on disk if(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) { - return callback(null); + //For some reason, the tiddler is only in memory or we can't modify the file at this path + $tw.syncer.displayError("Server deleteTiddlerFile task failed for filepath: "+fileInfo.filepath); + return callback(null,fileInfo); } // Delete the file fs.unlink(fileInfo.filepath,function(err) { @@ -473,10 +488,20 @@ exports.deleteTiddlerFile = function(fileInfo, callback) { if(err) { return callback(err); } - return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback); + return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) { + if(err) { + return callback(err); + } + return callback(null,fileInfo); + }); }); } else { - return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback); + return $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) { + if(err) { + return callback(err); + } + return callback(null,fileInfo); + }); } }); }; @@ -486,25 +511,25 @@ Cleanup old files on disk, by comparing the options values: adaptorInfo from $tw.syncer.tiddlerInfo bootInfo from $tw.boot.files */ -exports.cleanupTiddlerFiles = function(options, callback) { +exports.cleanupTiddlerFiles = function(options,callback) { var adaptorInfo = options.adaptorInfo || {}, bootInfo = options.bootInfo || {}, title = options.title || "undefined"; if(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) { - return $tw.utils.deleteTiddlerFile(adaptorInfo, function(err){ + $tw.utils.deleteTiddlerFile(adaptorInfo,function(err) { if(err) { if ((err.code == "EPERM" || err.code == "EACCES") && err.syscall == "unlink") { // Error deleting the previous file on disk, should fail gracefully - $tw.syncer.displayError("Server desynchronized. Error cleaning up previous file for tiddler: "+title, err); - return callback(null); + $tw.syncer.displayError("Server desynchronized. Error cleaning up previous file for tiddler: \""+title+"\"",err); + return callback(null,bootInfo); } else { return callback(err); } } - return callback(null); + return callback(null,bootInfo); }); } else { - return callback(null); + return callback(null,bootInfo); } }; diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index 7e3cd2fa2..5b2eda092 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -54,10 +54,10 @@ It is the responsibility of the filesystem adaptor to update this.boot.files for FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { // Always generate a fileInfo object when this fuction is called var title = tiddler.fields.title, newInfo, pathFilters, extFilters; - if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")){ + if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")) { pathFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"); } - if(this.wiki.tiddlerExists("$:/config/FileSystemExtensions")){ + if(this.wiki.tiddlerExists("$:/config/FileSystemExtensions")) { extFilters = this.wiki.getTiddlerText("$:/config/FileSystemExtensions","").split("\n"); } newInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ @@ -66,9 +66,8 @@ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { extFilters: extFilters, wiki: this.wiki, fileInfo: this.boot.files[title], - originalpath: this.wiki.extractTiddlerDataItem("$:/config/OriginalTiddlerPaths",title, "") + originalpath: this.wiki.extractTiddlerDataItem("$:/config/OriginalTiddlerPaths",title,"") }); - this.boot.files[title] = newInfo; callback(null,newInfo); }; @@ -76,35 +75,38 @@ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { /* Save a tiddler and invoke the callback with (err,adaptorInfo,revision) */ -FileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) { +FileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback,options) { var self = this; + var syncerInfo = options.tiddlerInfo || {}; this.getTiddlerFileInfo(tiddler,function(err,fileInfo) { if(err) { return callback(err); } - $tw.utils.saveTiddlerToFile(tiddler,fileInfo,function(err) { + $tw.utils.saveTiddlerToFile(tiddler,fileInfo,function(err,fileInfo) { if(err) { if ((err.code == "EPERM" || err.code == "EACCES") && err.syscall == "open") { - var bootInfo = self.boot.files[tiddler.fields.title]; - bootInfo.writeError = true; - self.boot.files[tiddler.fields.title] = bootInfo; - $tw.syncer.displayError("Sync for tiddler [["+tiddler.fields.title+"]] will be retried with encoded filepath", encodeURIComponent(bootInfo.filepath)); + fileInfo = fileInfo || self.boot.files[tiddler.fields.title]; + fileInfo.writeError = true; + self.boot.files[tiddler.fields.title] = fileInfo; + $tw.syncer.logger.log("Sync failed for \""+tiddler.fields.title+"\" and will be retried with encoded filepath",encodeURIComponent(fileInfo.filepath)); return callback(err); } else { return callback(err); } } + // Store new boot info only after successful writes + self.boot.files[tiddler.fields.title] = fileInfo; // Cleanup duplicates if the file moved or changed extensions var options = { - adaptorInfo: ($tw.syncer.tiddlerInfo[tiddler.fields.title] || {adaptorInfo: {} }).adaptorInfo, - bootInfo: self.boot.files[tiddler.fields.title] || {}, + adaptorInfo: syncerInfo.adaptorInfo || {}, + bootInfo: fileInfo || {}, title: tiddler.fields.title }; - $tw.utils.cleanupTiddlerFiles(options, function(err){ + $tw.utils.cleanupTiddlerFiles(options,function(err,fileInfo) { if(err) { return callback(err); } - return callback(null, self.boot.files[tiddler.fields.title]); + return callback(null,fileInfo); }); }); }); @@ -127,20 +129,22 @@ FileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) { fileInfo = this.boot.files[title]; // Only delete the tiddler if we have writable information for the file if(fileInfo) { - $tw.utils.deleteTiddlerFile(fileInfo, function(err){ + $tw.utils.deleteTiddlerFile(fileInfo,function(err,fileInfo) { if(err) { if ((err.code == "EPERM" || err.code == "EACCES") && err.syscall == "unlink") { // Error deleting the file on disk, should fail gracefully - $tw.syncer.displayError("Server desynchronized. Error deleting file for deleted tiddler: "+title, err); - return callback(null); + $tw.syncer.displayError("Server desynchronized. Error deleting file for deleted tiddler \"" + title + "\"",err); + return callback(null,fileInfo); } else { return callback(err); } } - return callback(null); + // Remove the tiddler from self.boot.files & return null adaptorInfo + delete self.boot.files[title]; + return callback(null,null); }); } else { - callback(null); + callback(null,null); } }; diff --git a/plugins/tiddlywiki/savetrail/savetrail.js b/plugins/tiddlywiki/savetrail/savetrail.js index 69ef752a7..ec6fe7c01 100644 --- a/plugins/tiddlywiki/savetrail/savetrail.js +++ b/plugins/tiddlywiki/savetrail/savetrail.js @@ -106,7 +106,7 @@ SaveTrailSyncAdaptor.prototype.saveTiddler = function(tiddler,callback) { saveTiddlerFile(tiddler,{reason: "modified"}); } } - callback(null); + callback(null,null); }; /* @@ -120,7 +120,7 @@ SaveTrailSyncAdaptor.prototype.loadTiddler = function(title,callback) { Delete a tiddler and invoke the callback with (err) */ SaveTrailSyncAdaptor.prototype.deleteTiddler = function(title,callback,options) { - callback(null); + callback(null,null); }; function saveTiddlerFile(tiddler,options) { @@ -139,8 +139,8 @@ function saveTiddlerFile(tiddler,options) { link.setAttribute("target","_blank"); link.setAttribute("rel","noopener noreferrer"); if(Blob !== undefined) { - var blob = new Blob([text], {type: "text/plain"}); - link.setAttribute("href", URL.createObjectURL(blob)); + var blob = new Blob([text],{type: "text/plain"}); + link.setAttribute("href",URL.createObjectURL(blob)); } else { link.setAttribute("href","data:text/plain," + encodeURIComponent(text)); } diff --git a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js index 135b91055..ff4db2185 100644 --- a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js +++ b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js @@ -182,10 +182,10 @@ TiddlyWebAdaptor.prototype.getSkinnyTiddlers = function(callback) { /* Save a tiddler and invoke the callback with (err,adaptorInfo,revision) */ -TiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,callback) { +TiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,callback,options) { var self = this; if(this.isReadOnly) { - return callback(null); + return callback(null,options.tiddlerInfo.adaptorInfo); } $tw.utils.httpRequest({ url: this.host + "recipes/" + encodeURIComponent(this.recipe) + "/tiddlers/" + encodeURIComponent(tiddler.fields.title), @@ -207,7 +207,7 @@ TiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,callback) { // Invoke the callback callback(null,{ bag: etagInfo.bag - }, etagInfo.revision); + },etagInfo.revision); } } }); @@ -238,12 +238,12 @@ tiddlerInfo: the syncer's tiddlerInfo for this tiddler TiddlyWebAdaptor.prototype.deleteTiddler = function(title,callback,options) { var self = this; if(this.isReadOnly) { - return callback(null); + return callback(null,options.tiddlerInfo.adaptorInfo); } // If we don't have a bag it means that the tiddler hasn't been seen by the server, so we don't need to delete it var bag = options.tiddlerInfo.adaptorInfo && options.tiddlerInfo.adaptorInfo.bag; if(!bag) { - return callback(null); + return callback(null,options.tiddlerInfo.adaptorInfo); } // Issue HTTP request to delete the tiddler $tw.utils.httpRequest({ @@ -253,8 +253,8 @@ TiddlyWebAdaptor.prototype.deleteTiddler = function(title,callback,options) { if(err) { return callback(err); } - // Invoke the callback - callback(null); + // Invoke the callback & return null adaptorInfo + callback(null,null); } }); }; From 40d21f607a88ad02ecc94dcdc7e63b93a53cd1b2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 7 Feb 2021 12:48:06 +0000 Subject: [PATCH 1227/2376] Docs: Minor formatting tweaks I was cloning this docs tiddler to experiment with docs for a new widget and noticed some punctuation inconsistencies --- .../tiddlers/styleguide/Tiddler Structure.tid | 4 ++- .../tiddlers/widgets/EventCatcherWidget.tid | 36 +++++++++---------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/editions/tw5.com/tiddlers/styleguide/Tiddler Structure.tid b/editions/tw5.com/tiddlers/styleguide/Tiddler Structure.tid index 8e96a87ed..9d4df128a 100644 --- a/editions/tw5.com/tiddlers/styleguide/Tiddler Structure.tid +++ b/editions/tw5.com/tiddlers/styleguide/Tiddler Structure.tid @@ -1,5 +1,5 @@ created: 20150110183300000 -modified: 20150117152556000 +modified: 20210207124737959 title: Tiddler Structure tags: [[Improving TiddlyWiki Documentation]] @@ -13,4 +13,6 @@ Use numbered lists for step-by-step instructions, and bullet points for lists wh Use a table when information naturally falls into three or more columns, and also for lists of parameters, attributes, etc in [[reference tiddlers|Reference Tiddlers]]. +Avoid periods at the end of list items, headings and table cell text. + The documentation describes the current reality of ~TiddlyWiki. Avoid discussing future aspirations. diff --git a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid index 4dfd810aa..33aa06db8 100644 --- a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid @@ -14,9 +14,9 @@ The event catcher widget traps DOM-initiated Javascript events dispatched within In order for the events to be trapped they must: -* be of one of the events specified in the event catcher widget's `events` attribute. -* arise within a DOM node specified by the widget's `selector` attribute. -* support event bubbling. +* be of one of the events specified in the event catcher widget's `events` attribute +* arise within a DOM node specified by the widget's `selector` attribute +* support event bubbling Use of the event catcher widget is beneficial when using large numbers of other trigger widgets such as the ButtonWidget is causing performance problems. The workflow it enables is akin to what is referred to as "event delegation" in JavaScript parlance. @@ -25,11 +25,11 @@ Use of the event catcher widget is beneficial when using large numbers of other The content of the `<$eventcatcher>` widget is displayed normally. |!Attribute |!Description | -|events |Space separated list of JavaScript events to be trapped, for example "click" or "click dblclick". | -|selector |A CSS selector. Only events originating inside a DOM node with this selector will be trapped. | +|events |Space separated list of JavaScript events to be trapped, for example "click" or "click dblclick" | +|selector |A CSS selector. Only events originating inside a DOM node with this selector will be trapped | |actions-* |Action strings to be invoked when a matching event is trapped. Each event is mapped to an action attribute name of the form <code>actions-<em>event</em></code> where <code><em>event</em></code> represents the type of the event. For example: `actions-click` or `actions-dblclick` | |tag |Optional. The HTML element the widget creates to capture the events, defaults to:<br>» `span` when parsed in inline-mode<br>» `div` when parsed in block-mode | -|class |Optional. A CSS class name (or names) to be assigned to the widget HTML element. | +|class |Optional. A CSS class name (or names) to be assigned to the widget HTML element | ! Variables @@ -38,18 +38,18 @@ The following variables are made available to the actions: |!Variables |!Description | |`dom-*` |All DOM attributes of the node matching the given selector are made available as variables, with the prefix `dom-` | |`modifier` |The [[modifier Variable]] contains the Modifier Key held during the event (can be "normal", "ctrl", "shift", "alt" or combinations thereof) | -|`event-mousebutton`|The mouse button (if any) used to trigger the event (can be "left", "right" or "middle"). Note that not all event types support the mousebutton property | -|`event-type`|The type property of the JavaScript event | -|`event-detail-*`|Any properties in the detail attribute of the event are made available with the prefix `event-detail-` | -|`tv-popup-coords`|A co-ordinate string that can be used with the ActionPopupWidget to trigger a popup at the DOM node matching the selector where the event originated | -|`tv-selectednode-posx`|`x` offset position of the selected DOM node | -|`tv-selectednode-posy`|`y` offset position of the selected DOM node | -|`tv-selectednode-width`|`offsetWidth` of the selected DOM node | -|`tv-selectednode-height`|`offsetHeight` of the selected DOM node | -|`event-fromselected-posx`|`x` position of the event relative to the selected DOM node | -|`event-fromselected-posy`|`y` position of the event relative to the selected DOM node | -|`event-fromcatcher-posx`|`x` position of the event relative to the event catcher DOM node | -|`event-fromcatcher-posy`|`y` position of the event relative to the event catcher DOM node | +|`event-mousebutton` |The mouse button (if any) used to trigger the event (can be "left", "right" or "middle"). Note that not all event types support the mousebutton property | +|`event-type` |The type property of the JavaScript event | +|`event-detail-*` |Any properties in the detail attribute of the event are made available with the prefix `event-detail-` | +|`tv-popup-coords` |A co-ordinate string that can be used with the ActionPopupWidget to trigger a popup at the DOM node matching the selector where the event originated | +|`tv-selectednode-posx` |`x` offset position of the selected DOM node | +|`tv-selectednode-posy` |`y` offset position of the selected DOM node | +|`tv-selectednode-width` |`offsetWidth` of the selected DOM node | +|`tv-selectednode-height` |`offsetHeight` of the selected DOM node | +|`event-fromselected-posx` |`x` position of the event relative to the selected DOM node | +|`event-fromselected-posy` |`y` position of the event relative to the selected DOM node | +|`event-fromcatcher-posx` |`x` position of the event relative to the event catcher DOM node | +|`event-fromcatcher-posy` |`y` position of the event relative to the event catcher DOM node | ! Example From c0dc2669c0d617d739ea58277131b0760c757020 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 11 Feb 2021 08:39:50 -0500 Subject: [PATCH 1228/2376] Preallocating in LinkedList's toArray method (#5488) --- core/modules/utils/linked-list.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/utils/linked-list.js b/core/modules/utils/linked-list.js index 3fdc7f8b2..06242b454 100644 --- a/core/modules/utils/linked-list.js +++ b/core/modules/utils/linked-list.js @@ -89,8 +89,9 @@ LinkedList.prototype.each = function(callback) { }; LinkedList.prototype.toArray = function() { - var output = []; - this.each(function(value) { output.push(value); }); + var output = new Array(this.length), + index = 0; + this.each(function(value) { output[index++] = value; }); return output; }; From 50d0b6ee50689fd7ed8d7e8cc7ac4ea285da36d9 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 13 Feb 2021 10:28:31 +0000 Subject: [PATCH 1229/2376] Modals: don't crash if options.event is missing Raised here: https://groups.google.com/d/msgid/tiddlywiki/3E83D2D3-42B2-4AA1-A042-52AB1D7B9B15%40gmail.com --- core/modules/utils/dom/modal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/dom/modal.js b/core/modules/utils/dom/modal.js index 561dbf298..db66b1abc 100644 --- a/core/modules/utils/dom/modal.js +++ b/core/modules/utils/dom/modal.js @@ -31,7 +31,7 @@ Modal.prototype.display = function(title,options) { options = options || {}; this.srcDocument = options.variables && (options.variables.rootwindow === "true" || options.variables.rootwindow === "yes") ? document : - (options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document); + (options.event && options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document); this.srcWindow = this.srcDocument.defaultView; var self = this, refreshHandler, From 0ed32fded996826a59832d7a7555bb16c4a57864 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 13 Feb 2021 12:03:35 +0000 Subject: [PATCH 1230/2376] Freelinks: Add a filter for which tiddlers can be the targets of freelinks --- plugins/tiddlywiki/freelinks/settings.tid | 2 ++ plugins/tiddlywiki/freelinks/text.js | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/freelinks/settings.tid b/plugins/tiddlywiki/freelinks/settings.tid index 844eb1d26..dc4577ab7 100644 --- a/plugins/tiddlywiki/freelinks/settings.tid +++ b/plugins/tiddlywiki/freelinks/settings.tid @@ -1,5 +1,7 @@ title: $:/plugins/tiddlywiki/freelinks/settings +Filter defining tiddlers to which freelinks are made: <$edit-text tiddler="$:/config/Freelinks/TargetFilter" tag="input" placeholder="Filter expression..." default=""/> + <$checkbox tiddler="$:/config/Freelinks/Enable" field="text" checked="yes" unchecked="no" default="no"> <$link to="$:/config/Freelinks/Enable">Enable freelinking within tiddler view templates</$link> </$checkbox> <$checkbox tiddler="$:/config/Freelinks/IgnoreCase" field="text" checked="yes" unchecked="no" default="no"> <$link to="$:/config/Freelinks/IgnoreCase">Ignore case</$link> </$checkbox> diff --git a/plugins/tiddlywiki/freelinks/text.js b/plugins/tiddlywiki/freelinks/text.js index 867eb030a..b11eb0ef5 100755 --- a/plugins/tiddlywiki/freelinks/text.js +++ b/plugins/tiddlywiki/freelinks/text.js @@ -12,6 +12,8 @@ An override of the core text widget that automatically linkifies the text /*global $tw: false */ "use strict"; +var TITLE_TARGET_FILTER = "$:/config/Freelinks/TargetFilter"; + var Widget = require("$:/core/modules/widgets/widget.js").widget, LinkWidget = require("$:/core/modules/widgets/link.js").link, ButtonWidget = require("$:/core/modules/widgets/button.js").button, @@ -51,7 +53,9 @@ TextNodeWidget.prototype.execute = function() { if(this.getVariable("tv-wikilinks",{defaultValue:"yes"}).trim() !== "no" && this.getVariable("tv-freelinks",{defaultValue:"no"}).trim() === "yes" && !this.isWithinButtonOrLink()) { // Get the information about the current tiddler titles, and construct a regexp this.tiddlerTitleInfo = this.wiki.getGlobalCache("tiddler-title-info-" + (ignoreCase ? "insensitive" : "sensitive"),function() { - var sortedTitles = self.wiki.allTitles().sort(function(a,b) { + var targetFilterText = self.wiki.getTiddlerText(TITLE_TARGET_FILTER), + titles = !!targetFilterText ? self.wiki.filterTiddlers(targetFilterText,$tw.rootWidget) : self.wiki.allTitles(), + sortedTitles = titles.sort(function(a,b) { var lenA = a.length, lenB = b.length; // First sort by length, so longer titles are first From 5ad1193eb6453e79e45c4a94fed3b2b1c10c2b75 Mon Sep 17 00:00:00 2001 From: morosanuae <morosanuae@yahoo.com> Date: Sat, 13 Feb 2021 22:16:06 +0200 Subject: [PATCH 1231/2376] Create TW Icons by morosanuae.tid (#5495) --- .../tiddlers/community/TW Icons by morosanuae.tid | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 editions/tw5.com/tiddlers/community/TW Icons by morosanuae.tid diff --git a/editions/tw5.com/tiddlers/community/TW Icons by morosanuae.tid b/editions/tw5.com/tiddlers/community/TW Icons by morosanuae.tid new file mode 100644 index 000000000..36fa47d85 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/TW Icons by morosanuae.tid @@ -0,0 +1,9 @@ +created: 20210204010508263 +modified: 20210204010941713 +tags: Images SVG Icons +title: "TW Icons" by morosanuae +type: text/vnd.tiddlywiki +url: https://morosanuae.github.io/tw-icons + +> A large collection of icons for TiddlyWiki. +{{!!url}} From 625ea364c4e856e2da0622017f59a6ebb308ca6a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 17 Feb 2021 12:49:45 +0000 Subject: [PATCH 1232/2376] Fix typo in Chinese (Simplified) --- languages/zh-Hans/ControlPanel.multids | 2 -- 1 file changed, 2 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 00ae235cf..0d337531c 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -129,9 +129,7 @@ Saving/TiddlySpot/Filename: 上传文件名 Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //默认之服务器网址 `http://<wikiname>.tiddlyspot.com/store.cgi`,可改为定制之服务器网址,例如 `http://example.com/store.php`。// Saving/TiddlySpot/Password: 密码 -Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服务目前可能仅提供唯读。详见 http://tiddlyspot.com/ Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服务目前仅以唯读形式提供。相关最新详细信息,请参阅 http://tiddlyspot.com/ 。~TiddlySpot 保存模块仍可用于保存到兼容的服务器。 - Saving/TiddlySpot/ServerURL: 服务器网址 Saving/TiddlySpot/UploadDir: 上传文件夹 Saving/TiddlySpot/UserName: 用户 From 010fa140c7d55c072e2423c2a0492c612b10a216 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 20 Feb 2021 10:43:01 +0000 Subject: [PATCH 1233/2376] Bug issue template: Add section about configuration --- .github/ISSUE_TEMPLATE/bug_report.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a1ad60cc7..77d3f5f03 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,6 +23,11 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. +**TiddlyWiki Configuration (please complete the following information):** + - Version [e.g. v5.1.24] + - Saving mechanism [e.g. Node.js, TiddlyDesktop, TiddlyHost etc] + - Plugins installed [e.g. Freelinks, TiddlyMap] + **Desktop (please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] From ef76349c37662e9706acfffc2c2edb51a920183d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Feb 2021 12:11:39 +0000 Subject: [PATCH 1234/2376] Add support for utils-browser modules --- core/language/en-GB/Docs/ModuleTypes.multids | 1 + core/modules/startup/load-modules.js | 3 +++ 2 files changed, 4 insertions(+) diff --git a/core/language/en-GB/Docs/ModuleTypes.multids b/core/language/en-GB/Docs/ModuleTypes.multids index 1e1abd424..9a03d8887 100644 --- a/core/language/en-GB/Docs/ModuleTypes.multids +++ b/core/language/en-GB/Docs/ModuleTypes.multids @@ -23,6 +23,7 @@ tiddlerfield: Defines the behaviour of an individual tiddler field. tiddlermethod: Adds methods to the `$tw.Tiddler` prototype. upgrader: Applies upgrade processing to tiddlers during an upgrade/import. utils: Adds methods to `$tw.utils`. +utils-browser: Adds browser-specific methods to `$tw.utils`. utils-node: Adds Node.js-specific methods to `$tw.utils`. widget: Widgets encapsulate DOM rendering and refreshing. wikimethod: Adds methods to `$tw.Wiki`. diff --git a/core/modules/startup/load-modules.js b/core/modules/startup/load-modules.js index e2234d0ac..1dc71f7ac 100644 --- a/core/modules/startup/load-modules.js +++ b/core/modules/startup/load-modules.js @@ -22,6 +22,9 @@ exports.startup = function() { if($tw.node) { $tw.modules.applyMethods("utils-node",$tw.utils); } + if($tw.browser) { + $tw.modules.applyMethods("utils-browser",$tw.utils); + } $tw.modules.applyMethods("global",$tw); $tw.modules.applyMethods("config",$tw.config); $tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap("tiddlerfield"); From e84c87ef37e63473e111a37292ceb977eeb87bd2 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 24 Feb 2021 01:26:17 +0800 Subject: [PATCH 1235/2376] Update chinese language files (#5514) * Add chinese descriptions for module-type `utils-browser` * Fixed typos --- languages/zh-Hans/Docs/ModuleTypes.multids | 3 ++- languages/zh-Hant/Docs/ModuleTypes.multids | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/Docs/ModuleTypes.multids b/languages/zh-Hans/Docs/ModuleTypes.multids index 742241742..75de9a855 100644 --- a/languages/zh-Hans/Docs/ModuleTypes.multids +++ b/languages/zh-Hans/Docs/ModuleTypes.multids @@ -23,7 +23,8 @@ tiddlerfield: 定义个别条目栏位的行为。 tiddlermethod: 添加方法至 `$tw.Tiddler` 原型。 upgrader: 于升级/导入过程中,套用升级处理至条目。 utils: 添加方法至 `$tw.utils`。 -utils-node: 将特定于 Node.js 的方法添加到 '$tw.utils'。 +utils-browser: 将特定于浏览器的方法添加到 `$tw.utils`。 +utils-node: 将特定于 Node.js 的方法添加到 `$tw.utils`。 widget: 封装 DOM 渲染和刷新的小部件。 wikimethod: 添加方法至 `$tw.Wiki`。 wikirule: WikiText 解析器的个别的语法规则。 diff --git a/languages/zh-Hant/Docs/ModuleTypes.multids b/languages/zh-Hant/Docs/ModuleTypes.multids index 8c16ebdbf..baba51100 100644 --- a/languages/zh-Hant/Docs/ModuleTypes.multids +++ b/languages/zh-Hant/Docs/ModuleTypes.multids @@ -23,7 +23,8 @@ tiddlerfield: 定義個別條目欄位的行為。 tiddlermethod: 新增方法至 `$tw.Tiddler` 原型。 upgrader: 於升級/導入過程中,套用升級處理至條目。 utils: 新增方法至 `$tw.utils`。 -utils-node: 將特定於 Node.js 的方法新增到 '$tw.utils'。. +utils-browser: 將特定於瀏覽器的方法新增到 `$tw.utils`。 +utils-node: 將特定於 Node.js 的方法新增到 `$tw.utils`。 widget: 封裝 DOM 渲染和刷新的小工具。 wikimethod: 新增方法至 `$tw.Wiki`。 wikirule: WikiText 解析器的個別的語法規則。 From d56e8764a1f02a214df5da1cc95191be2da2491b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 1 Mar 2021 17:59:29 +0000 Subject: [PATCH 1236/2376] Button widget: apply aria-expanded attribute when controlling a popup Addresses (1) and (5) from #5519 --- core/modules/widgets/button.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 5b15c875f..9186e1808 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -66,6 +66,9 @@ ButtonWidget.prototype.render = function(parent,nextSibling) { if(this["aria-label"]) { domNode.setAttribute("aria-label",this["aria-label"]); } + if(this.popup || this.popupTitle) { + domNode.setAttribute("aria-expanded",isPoppedUp ? "true" : "false"); + } // Set the tabindex if(this.tabIndex) { domNode.setAttribute("tabindex",this.tabIndex); From 6e93770459c36756002018614dc2d3824dc70ffb Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 7 Mar 2021 10:23:14 +0000 Subject: [PATCH 1237/2376] Update RangeWidget and RadioWidget examples from #5158 @pmario we avoid using the details element because it doesn't remember its state across refreshes. It's not something that we should encourage people to use if they don't understand the limitations. I also simplified the radio widget example because putting all the options on one line with a vertical bar separator is not a common way to display radio buttons. --- .../tiddlers/widgets/RadioWidget Example.tid | 25 +++++++++++-------- .../tiddlers/widgets/RangeWidget Example.tid | 9 +++---- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid b/editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid index 64d8914c1..577ed7f16 100644 --- a/editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid +++ b/editions/tw5.com/tiddlers/widgets/RadioWidget Example.tid @@ -1,5 +1,5 @@ created: 20201130181015815 -modified: 20201130183426619 +modified: 20210307102027763 tags: RadioWidget title: RadioWidget Example type: text/vnd.tiddlywiki @@ -14,19 +14,22 @@ type: text/vnd.tiddlywiki !! Using Actions -If you select an option, the value is written to $:/temp/test/value and the ''id'' field of tiddler: $:/temp/test will be updated. +When you select an option below the following acitons will occur: -A notification showing the ''actionValue'' will be shown. +* the value is written to $:/temp/test/value +* the ''id'' field of tiddler: $:/temp/test will be updated +* a notification showing the ''actionValue'' will be shown <$tiddler tiddler="$:/temp/test"> - <$radio field="id" value="a" actions=<<radioActions>> > Option a </$radio>| - <$radio field="id" value="b" actions=<<radioActions>> > Option b </$radio>| - <$radio field="id" value="c" actions=<<radioActions>> > Option c </$radio>| + +<$radio field="id" value="a" actions=<<radioActions>> > Option a </$radio> + +<$radio field="id" value="b" actions=<<radioActions>> > Option b </$radio> + +<$radio field="id" value="c" actions=<<radioActions>> > Option c </$radio> + </$tiddler> ---- +The wikitext of this example is shown below: -<details> - <summary>Show the code [[RadioWidget Example]]</summary> - <pre><code><$view mode=text&><pre><code> -</details> +<$codeblock code={{RadioWidget Example!!text}}/> diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid index 822313374..731ec41a7 100644 --- a/editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget Example.tid @@ -1,5 +1,5 @@ created: 20201130191618831 -modified: 20201130194441670 +modified: 20210307102027763 tags: RangeWidget title: RangeWidget Example type: text/vnd.tiddlywiki @@ -48,7 +48,6 @@ type: text/vnd.tiddlywiki --- -<details> - <summary>Show the code [[RangeWidget Example]]</summary> - <pre><code><$view mode=text&><pre><code> -</details> +The wikitext of this example is shown below: + +<$codeblock code={{RangeWidget Example!!text}}/> From b58e4236b78190c3f86a1dea6832c017f65009ce Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 7 Mar 2021 10:32:51 +0000 Subject: [PATCH 1238/2376] Docs tweaks * The "tip" macro isn't designed to be used in a table cell (it generates a blockquote) * We avoid full stops at the end of table entries or list items It seems to be incredibly hard to police consistency with documentation but I think it's very important --- editions/tw5.com/tiddlers/widgets/RadioWidget.tid | 13 ++++++------- editions/tw5.com/tiddlers/widgets/RangeWidget.tid | 6 +++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid index c8798900f..0b55e4e34 100644 --- a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid @@ -15,13 +15,12 @@ The content of the `<$radio>` widget is displayed within an HTML `<label>` eleme |!Attribute |!Description | |tiddler |Title of the tiddler to manipulate (defaults to the [[current tiddler|Current Tiddler]]) | -|field |The field of the //tiddler// bound to the radio button| -|index|<<.from-version "5.1.14">> The index of the //tiddler// being [[DataTiddler|DataTiddlers]] bound to the radio button<<.tip "takes precedence over //field//">>| -|value |The value for the //field// or //index// of the //tiddler//| -|class |The CSS classes assigned to the label around the radio button<$macrocall $name=".tip" _="""<<.from-version "5.1.14">> `tc-radio` is always applied by default, as well as `tc-radio-selected` when selected"""/>| -|actions|<<.from-version "5.1.23">> Optional, A string containing ActionWidgets to be triggered when the value changes. <br>The variable: ''actionValue'' is available for the actions. | -|disabled|<<.from-version "5.1.23">> Optional, disables the radio input if set to "yes". Defaults to "no"| - +|field |The field of the //tiddler// bound to the radio button | +|index|<<.from-version "5.1.14">> The index of the //tiddler// being [[DataTiddler|DataTiddlers]] bound to the radio button (takes precedence over //field//) | +|value |The value for the //field// or //index// of the //tiddler// | +|class |The CSS classes assigned to the label around the radio button <<.from-version "5.1.14">> `tc-radio` is always applied by default, as well as `tc-radio-selected` when selected | +|actions|<<.from-version "5.1.23">> Optional string containing ActionWidgets to be triggered when the value changes. <br>The variable: ''actionValue'' is available for the actions | +|disabled|<<.from-version "5.1.23">> Optional. Set to "yes" to disable the radio input. Defaults to "no" | !! Field Mode diff --git a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid index 195b32fec..b0ff73543 100644 --- a/editions/tw5.com/tiddlers/widgets/RangeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RangeWidget.tid @@ -16,14 +16,14 @@ The content of the `<$range>` widget is ignored. |!Attribute |!Description | |tiddler |Title of the tiddler to manipulate (defaults to the [[current tiddler|Current Tiddler]]) | |field |The field of the //tiddler// bound to the range slider| -|index|<<.from-version "5.1.22">> The index of the //tiddler//, a [[DataTiddler|DataTiddlers]], to which the radio button is bound<<.tip "be sure to set the //tiddler// correctly">> | +|index|<<.from-version "5.1.22">> The index of the //tiddler//, a [[DataTiddler|DataTiddlers]], to which the radio button is bound | |min |The minimum value to be able to be set by the `<$range>` widget | |max |The maximum value to be able to be set by the `<$range>` widget | |increment |The minimum amount by which a value may be changed. Defaults to 1 | -|default |If the field is missing or empty this is the default position for the widget handle relative to the min and max values.| +|default |If the field is missing or empty this is the default position for the widget handle relative to the min and max values| |class |CSS classes to be assigned to the label around the range slider | |actions|<<.from-version "5.1.23">> Optional, A string containing ActionWidgets to be triggered when the value changes. <br>The variable: ''actionValue'' is available for ''all'' actions.<br>The variable: ''actionValueHasChanged'' is always `yes` here.| -|actionsStart|<<.from-version "5.1.23">> Optional, A string containing ~ActionWidgets to be triggered when the "handle" is ''clicked''. <br>The variable: ''actionValueHasChanged'' is always `no` here.| +|actionsStart|<<.from-version "5.1.23">> Optional, A string containing ~ActionWidgets to be triggered when the "handle" is ''clicked''. <br>The variable: ''actionValueHasChanged'' is always `no` here| |actionsStop|<<.from-version "5.1.23">> Optional, A string containing ~ActionWidgets to be triggered when the "handle" is ''released''. <br>The variable: ''actionValueHasChanged'' is `yes`, ''if'' the new-value is different to the start-value | |disabled|<<.from-version "5.1.23">> Optional, disables the range input if set to "yes". Defaults to "no"| From 5e4430dbf9ff66d9a18fbdf3005abcd716efc07d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 7 Mar 2021 15:49:07 +0000 Subject: [PATCH 1239/2376] Fix Radio widget to refresh selectively, and use the checked attribute properly --- core/modules/widgets/radio.js | 18 +++++++++++++----- .../tw5.com/tiddlers/widgets/RadioWidget.tid | 3 ++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/modules/widgets/radio.js b/core/modules/widgets/radio.js index 43b6e5dab..b943a25ed 100644 --- a/core/modules/widgets/radio.js +++ b/core/modules/widgets/radio.js @@ -41,7 +41,7 @@ RadioWidget.prototype.render = function(parent,nextSibling) { this.inputDomNode = this.document.createElement("input"); this.inputDomNode.setAttribute("type","radio"); if(isChecked) { - this.inputDomNode.setAttribute("checked","true"); + this.inputDomNode.checked = true; } if(this.isDisabled === "yes") { this.inputDomNode.setAttribute("disabled",true); @@ -62,10 +62,14 @@ RadioWidget.prototype.render = function(parent,nextSibling) { RadioWidget.prototype.getValue = function() { var value, tiddler = this.wiki.getTiddler(this.radioTitle); - if (this.radioIndex) { - value = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex); + if(tiddler) { + if(this.radioIndex) { + value = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex); + } else { + value = tiddler.getFieldString(this.radioField); + } } else { - value = tiddler && tiddler.getFieldString(this.radioField); + value = this.radioDefault; } return value; }; @@ -101,6 +105,7 @@ RadioWidget.prototype.execute = function() { this.radioIndex = this.getAttribute("index"); this.radioValue = this.getAttribute("value"); this.radioClass = this.getAttribute("class",""); + this.radioDefault = this.getAttribute("default"); this.isDisabled = this.getAttribute("disabled","no"); this.radioActions = this.getAttribute("actions",""); // Make the child widgets @@ -112,9 +117,12 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ RadioWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(($tw.utils.count(changedAttributes) > 0) || changedTiddlers[this.radioTitle]) { + if(($tw.utils.count(changedAttributes) > 0)) { this.refreshSelf(); return true; + } else if(changedTiddlers[this.radioTitle]) { + this.inputDomNode.checked = this.getValue() === this.radioValue; + return this.refreshChildren(changedTiddlers); } else { return this.refreshChildren(changedTiddlers); } diff --git a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid index 0b55e4e34..77ece4e28 100644 --- a/editions/tw5.com/tiddlers/widgets/RadioWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/RadioWidget.tid @@ -1,6 +1,6 @@ caption: radio created: 20131212195353929 -modified: 20201130184330254 +modified: 20210307154753471 tags: Widgets title: RadioWidget type: text/vnd.tiddlywiki @@ -17,6 +17,7 @@ The content of the `<$radio>` widget is displayed within an HTML `<label>` eleme |tiddler |Title of the tiddler to manipulate (defaults to the [[current tiddler|Current Tiddler]]) | |field |The field of the //tiddler// bound to the radio button | |index|<<.from-version "5.1.14">> The index of the //tiddler// being [[DataTiddler|DataTiddlers]] bound to the radio button (takes precedence over //field//) | +|default |<<.from-version "5.1.24">> The default value to be used for matching if the tiddler, field or index are missing | |value |The value for the //field// or //index// of the //tiddler// | |class |The CSS classes assigned to the label around the radio button <<.from-version "5.1.14">> `tc-radio` is always applied by default, as well as `tc-radio-selected` when selected | |actions|<<.from-version "5.1.23">> Optional string containing ActionWidgets to be triggered when the value changes. <br>The variable: ''actionValue'' is available for the actions | From 81546c5bf49c6644e4e69edc433208d5ba238743 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 8 Mar 2021 17:47:04 +0000 Subject: [PATCH 1240/2376] Menubar plugin: Add optional dropdown-position Fixes #5533 --- plugins/tiddlywiki/menubar/menu.tid | 2 +- plugins/tiddlywiki/menubar/readme.tid | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/menubar/menu.tid b/plugins/tiddlywiki/menubar/menu.tid index 8123af1bf..2d8f06aaa 100644 --- a/plugins/tiddlywiki/menubar/menu.tid +++ b/plugins/tiddlywiki/menubar/menu.tid @@ -55,7 +55,7 @@ tags: $:/tags/PageTemplate <$list filter="[<currentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]" variable="ignore"> <$set name="dropdown-state" value=<<qualify "$:/state/popup/topmenu/dropdown/">>> <$set name="dropdown-state" value={{{ [<dropdown-state>addsuffix<currentTiddler>] }}}> -<$reveal type="popup" state=<<dropdown-state>> class={{{ [<currentTiddler>get[dropdown]get[class]] }}} tag="div"> +<$reveal type="popup" state=<<dropdown-state>> position={{{ [<currentTiddler>get[dropdown-position]else[below]] }}} class={{{ [<currentTiddler>get[dropdown]get[class]] }}} tag="div"> <div class="tc-drop-down"> <$transclude/> </div> diff --git a/plugins/tiddlywiki/menubar/readme.tid b/plugins/tiddlywiki/menubar/readme.tid index 8677a0cc5..4282654bd 100644 --- a/plugins/tiddlywiki/menubar/readme.tid +++ b/plugins/tiddlywiki/menubar/readme.tid @@ -19,6 +19,7 @@ Menu items are tagged <<tag $:/tags/MenuBar>>. The following fields are used by |caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required | |target |For simple link menu items specifies a tiddler title as the target of the link | |is-dropdown |Set to `yes` to indicate a dropdown menu item | +|dropdown-position |Optional position for the dropdown (can be ''left'', ''above'', ''aboveleft'', ''aboveright'', ''right'', ''belowleft'', ''belowright'' or ''below'') | |text |For dropdown menu items, specifies the body of the dropdown | |custom-menu-content |Optional wikitext to be displayed in place of the caption | |custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide | From 3c9ee052a357dd225971eece61386e56c895957d Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Mon, 8 Mar 2021 19:00:41 +0100 Subject: [PATCH 1241/2376] Update SystemTags.tid (#5530) Interestingly, in spite of the missing quote characters, the tiddler renders well on https://tiddlywiki.com/#SystemTags but not on https://tiddlywiki.com/prerelease/#SystemTags --- editions/tw5.com/tiddlers/concepts/SystemTags.tid | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/editions/tw5.com/tiddlers/concepts/SystemTags.tid b/editions/tw5.com/tiddlers/concepts/SystemTags.tid index 6b6d4a5a1..0d0798f33 100644 --- a/editions/tw5.com/tiddlers/concepts/SystemTags.tid +++ b/editions/tw5.com/tiddlers/concepts/SystemTags.tid @@ -28,11 +28,11 @@ These are the system tags defined by the ~TiddlyWiki core: !! System tags defined by ~TiddlyWiki plugins -|<<tag "$:/tags/HelpPanel>> |can be seen at: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]] see: top left page control bubble| -|<<tag "$:/tags/HelpPanel/Videos>> |help panel "videos" tab| -|<<tag "$:/tags/MakeQR>> |can be seen at: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]]. see: Tiddler toolbar | -|<<tag "$:/tags/TranslationGroup>> |used by the [[translators edition|https://tiddlywiki.com/editions/translators/]] | -|<<tag "$:/tags/TwitterUsage>> |twitter plugin | -|<<tag "$:/tags/ViewToolbarButton/QRcode>> |see: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]] | -|<<tag "$:/tags/test-spec>> |tiddlywiki test suite | +|<<tag "$:/tags/HelpPanel">> |can be seen at: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]] see: top left page control bubble| +|<<tag "$:/tags/HelpPanel/Videos">> |help panel "videos" tab| +|<<tag "$:/tags/MakeQR">> |can be seen at: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]]. see: Tiddler toolbar | +|<<tag "$:/tags/TranslationGroup">> |used by the [[translators edition|https://tiddlywiki.com/editions/translators/]] | +|<<tag "$:/tags/TwitterUsage">> |twitter plugin | +|<<tag "$:/tags/ViewToolbarButton/QRcode">> |see: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]] | +|<<tag "$:/tags/test-spec">> |tiddlywiki test suite | From c69a3e827a372462be594a1309db2287cdcf858e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 8 Mar 2021 23:01:55 +0000 Subject: [PATCH 1242/2376] Include correct plugin library in prerelease edition --- editions/prerelease/tiddlers/system/download-empty.tid | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 editions/prerelease/tiddlers/system/download-empty.tid diff --git a/editions/prerelease/tiddlers/system/download-empty.tid b/editions/prerelease/tiddlers/system/download-empty.tid new file mode 100644 index 000000000..9e0c48c4f --- /dev/null +++ b/editions/prerelease/tiddlers/system/download-empty.tid @@ -0,0 +1,9 @@ +title: $:/editions/tw5.com/download-empty + +\define saveTiddlerFilter() +[[$:/core]] [[$:/isEncrypted]] [[$:/themes/tiddlywiki/snowwhite]] [[$:/themes/tiddlywiki/vanilla]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] [[$:/config/OfficialPluginLibrary]] +[sort[title]] +\end +\define savingEmpty() +yes +\end +{{$:/core/templates/tiddlywiki5.html}} From 8980927b54a2c49eec6075dd557a1a01195c6dd0 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 9 Mar 2021 09:23:46 +0000 Subject: [PATCH 1243/2376] Build empty.html with the main edition So that we get the OfficialPluginLibrary tiddler added in c69a3e827 included in the empty prerelease --- bin/build-site.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/build-site.sh b/bin/build-site.sh index f896abcac..5bd4de5ba 100755 --- a/bin/build-site.sh +++ b/bin/build-site.sh @@ -107,7 +107,7 @@ node $TW5_BUILD_TIDDLYWIKI \ # /empty.html Empty # /empty.hta For Internet Explorer node $TW5_BUILD_TIDDLYWIKI \ - ./editions/empty \ + $TW5_BUILD_MAIN_EDITION \ --verbose \ --output $TW5_BUILD_OUTPUT \ --build empty \ From 9eda02868f21e9dd1733ffe26352bd7ac96285b4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 9 Mar 2021 18:07:07 +0000 Subject: [PATCH 1244/2376] Introduce messagecatcher widget --- core/modules/widgets/messagecatcher.js | 100 ++++++++++++++++++ .../tiddlers/widgets/MessageCatcherWidget.tid | 42 ++++++++ 2 files changed, 142 insertions(+) create mode 100644 core/modules/widgets/messagecatcher.js create mode 100644 editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid diff --git a/core/modules/widgets/messagecatcher.js b/core/modules/widgets/messagecatcher.js new file mode 100644 index 000000000..ae5435f6a --- /dev/null +++ b/core/modules/widgets/messagecatcher.js @@ -0,0 +1,100 @@ +/*\ +title: $:/core/modules/widgets/messagecatcher.js +type: application/javascript +module-type: widget + +Message catcher widget + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/widgets/widget.js").widget; + +var MessageCatcherWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); +}; + +/* +Inherit from the base widget class +*/ +MessageCatcherWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +MessageCatcherWidget.prototype.render = function(parent,nextSibling) { + var self = this; + // Remember parent + this.parentDomNode = parent; + // Compute attributes and execute state + this.computeAttributes(); + this.execute(); + // Add our message handler + if(this.messageType) { + this.addEventListeners([ + {type: this.messageType, handler: "handleEvent"} + ]); + } + // Render children + this.renderChildren(parent,null); +}; + +/* +Compute the internal state of the widget +*/ +MessageCatcherWidget.prototype.execute = function() { + var self = this; + // Get attributes that require a refresh on change + this.messageType = this.getAttribute("type"); + this.messageActions = this.getAttribute("actions"); + // Make child widgets + this.makeChildWidgets(); +}; + +/* +Handle an event +*/ +MessageCatcherWidget.prototype.handleEvent = function(event) { + if(this.messageActions) { + // Collect all the event properties into variables + var collectProps = function(obj,prefix) { + prefix = prefix || ""; + var props = {}; + $tw.utils.each(obj,function(value,name) { + if(["string","boolean","number"].indexOf(typeof value) !== -1) { + props[prefix + name] = value.toString(); + } + }); + return props; + }; + var variables = $tw.utils.extend( + {}, + collectProps(event.paramObject,"event-paramObject-"), + collectProps(event,"event-"), + { + modifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event) + }); + this.invokeActionString(this.messageActions,this,event,variables); + } + return false; +}; + +/* +Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering +*/ +MessageCatcherWidget.prototype.refresh = function(changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if(changedAttributes["type"]) { + this.refreshSelf(); + return true; + } + return this.refreshChildren(changedTiddlers); +}; + +exports.messagecatcher = MessageCatcherWidget; + +})(); diff --git a/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid new file mode 100644 index 000000000..406c4cda5 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid @@ -0,0 +1,42 @@ +created: 20210309133636211 +modified: 20210309133636211 +tags: Widgets +title: MessageCatcherWidget +type: text/vnd.tiddlywiki + +! Introduction + +<<.from-version "5.1.24">> + +The message catcher widget traps [[messages|Messages]] dispatched within its child content, and allows invoking a series of ActionWidgets in response to those messages. + +! Content and Attributes + +The content of the `<$messagecatcher>` widget is displayed normally. + +|!Attribute |!Description | +|type |Name of the message be trapped, for example "tm-scroll" or "tm-navigate" | +|actions |Action string to be invoked when a matching message is trapped | + +! Variables + +The message catcher widget + +|!Variables |!Description | +|`event-*` |All string-based properties of the `event` object, with the names prefixed with `event-` | +|`event-paramObject-*` |All string-based properties of the `event.paramObject` object, with the names prefixed with `event-paramObject-` | +|`modifier` |For messages that originated with browser events, the modifier keys that were pressed when the event was fired. The possible modifiers are ''norma'' (no modifiers), ''ctrl'', ''ctrl-alt'', ''ctrl-shift'', ''alt'', ''alt-shift'', ''shift'' and ''ctrl-alt-shift'' | + +! Example + +<$macrocall $name="wikitext-example-without-html" src=""" +\define actions() +<$action-log/> +\end + +<$messagecatcher type="tm-navigate" actions=<<actions>>> + +Click on [[this link]] to fire an action. See the browser JavaScript console for the output + +</$messagecatcher> +"""/> \ No newline at end of file From 85646e5db36855fff156d1b6ffc139a901a52985 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 9 Mar 2021 18:11:36 +0000 Subject: [PATCH 1245/2376] Update tw5.com docs macro to allow macros within examples This was supposed to be committed before 9eda02868 --- editions/tw5.com/tiddlers/system/wikitext-macros.tid | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/editions/tw5.com/tiddlers/system/wikitext-macros.tid b/editions/tw5.com/tiddlers/system/wikitext-macros.tid index c609205ab..5b9c190be 100644 --- a/editions/tw5.com/tiddlers/system/wikitext-macros.tid +++ b/editions/tw5.com/tiddlers/system/wikitext-macros.tid @@ -14,7 +14,9 @@ $src$ That renders as: +$$$text/vnd.tiddlywiki $src$ +$$$ ... and the underlying HTML is: @@ -35,7 +37,9 @@ $src$ That renders as: +$$$text/vnd.tiddlywiki $src$ +$$$ </div> \end From 37fd52e6c99b71e2063865abe43865c5ca00ce2c Mon Sep 17 00:00:00 2001 From: Quentin Minster <laomaiweng@minster.io> Date: Wed, 10 Mar 2021 22:33:50 +0000 Subject: [PATCH 1246/2376] Signing the CLA (#5536) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index f535dc12b..852b0f30e 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -445,3 +445,5 @@ Yoonchae Lee, @BlueGreenMagick, 2021/01/21 Dyllon Gagnier, @slaymaker1907, 2021/01/24 J. Wilhelm, @jeremyredhead, 2021/01/27 + +Quentin Minster, @laomaiweng, 2021/03/10 From 05acf3dce4e0d0628631891a3c7cf6f5e600c223 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Fri, 12 Mar 2021 22:12:06 +0100 Subject: [PATCH 1247/2376] fix wiki.search options invert init problem (#5542) --- core/modules/wiki.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 2d66f5440..ccda3ee95 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1242,7 +1242,7 @@ exports.search = function(text,options) { var results = [], source = options.source || this.each; source(function(tiddler,title) { - if(searchTiddler(title) !== options.invert) { + if(searchTiddler(title) !== invert) { results.push(title); } }); From e157d16b724172f752da0ff714847e0c0ca9664d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 13 Mar 2021 13:19:12 +0000 Subject: [PATCH 1248/2376] Add data-tag-title attribute to tag pills Fixes #5543 --- core/ui/TagTemplate.tid | 2 +- core/wiki/macros/tag.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/TagTemplate.tid b/core/ui/TagTemplate.tid index 7e1306b27..3856854f5 100644 --- a/core/ui/TagTemplate.tid +++ b/core/ui/TagTemplate.tid @@ -1,7 +1,7 @@ title: $:/core/ui/TagTemplate \whitespace trim -<span class="tc-tag-list-item"> +<span class="tc-tag-list-item" data-tag-title=<<currentTiddler>>> <$set name="transclusion" value=<<currentTiddler>>> <$macrocall $name="tag-pill-body" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag="""$button""" element-attributes="""popup=<<qualify "$:/state/popup/tag">> dragFilter='[all[current]tagging[]]' tag='span'"""/> <$reveal state=<<qualify "$:/state/popup/tag">> type="popup" position="below" animate="yes" class="tc-drop-down"> diff --git a/core/wiki/macros/tag.tid b/core/wiki/macros/tag.tid index 131d62cb4..f19a0b978 100644 --- a/core/wiki/macros/tag.tid +++ b/core/wiki/macros/tag.tid @@ -20,7 +20,7 @@ $actions$<$transclude tiddler="""$icon$"""/><$view tiddler=<<__tag__>> field="ti \end \define tag-pill(tag,element-tag:"span",element-attributes:"",actions:"") -<span class="tc-tag-list-item"> +<span class="tc-tag-list-item" data-tag-title=<<__tag__>>> <$macrocall $name="tag-pill-body" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag="""$element-tag$""" element-attributes="""$element-attributes$""" actions="""$actions$"""/> </span> \end From 7b1a0c6e6a8bd2d3badf8766af0cd3f5f7ac5ec8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 14 Mar 2021 10:27:05 +0000 Subject: [PATCH 1249/2376] Fix ES5 issue Fixes #5545 --- core/modules/filters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index 1a3c6f451..7c6cc3768 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -63,7 +63,7 @@ function parseFilterOperation(operators,filterString,p) { operator.operator = "title"; } operator.operands = []; - function parseOperand(bracketType) { + var parseOperand = function(bracketType) { var operand = {}; switch (bracketType) { case "{": // Curly brackets From a6958bfe85d7ac369efd99690852f1993398564b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 14 Mar 2021 10:34:41 +0000 Subject: [PATCH 1250/2376] Fix css-escape-polyfill.js on old iOS Fixes #5546 --- core/modules/startup/css-escape-polyfill.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/startup/css-escape-polyfill.js b/core/modules/startup/css-escape-polyfill.js index 288a7336b..dfc904f89 100644 --- a/core/modules/startup/css-escape-polyfill.js +++ b/core/modules/startup/css-escape-polyfill.js @@ -19,7 +19,7 @@ exports.synchronous = true; /*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */ // https://github.com/umdjs/umd/blob/master/returnExports.js -exports.startup = factory(root); +exports.startup = function() {factory(root);}; }(typeof global != 'undefined' ? global : this, function(root) { if (root.CSS && root.CSS.escape) { @@ -109,6 +109,6 @@ exports.startup = factory(root); root.CSS = {}; } - root.CSS.escape = cssEscape; + Object.getPrototypeOf(root.CSS).escape = cssEscape; })); From 715ce6b603e68b5d90008617b68aadbdb37ceefa Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Thu, 18 Mar 2021 09:54:54 +0100 Subject: [PATCH 1251/2376] Add tag: Community Edditions (#5548) Add tag: Community Edditions --- .../community/resources/Projectify by Nicolas Petton.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid b/editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid index a65a29775..0a0eb1697 100644 --- a/editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid +++ b/editions/tw5.com/tiddlers/community/resources/Projectify by Nicolas Petton.tid @@ -1,6 +1,6 @@ created: 202101061831 modified: 20210110204503082 -tags: [[Community Plugins]] +tags: [[Community Plugins]] [[Community Editions]] title: Projectify by Nicolas Petton type: text/vnd.tiddlywiki url: https://projectify.wiki From 427eb6d08511009f6ee09145f8f2268d90328f35 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Thu, 18 Mar 2021 04:57:21 -0400 Subject: [PATCH 1252/2376] Refactored filter tests to use nifty spyOn method (#5550) --- editions/test/tiddlers/tests/test-filters.js | 30 ++++---------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index a820c4d04..b67a2d298 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -14,22 +14,6 @@ Tests the filtering mechanism. /* global $tw, require */ "use strict"; -// This wrapper method is used to collect warnings which should be emitted -// by certain deprecated tests. -function collectLog(block) { - var messages = []; - var oldLog = console.log; - console.log = function(a) { - messages.push(Array.prototype.join.call(arguments, " ")); - } - try { - block(); - } finally { - console.log = oldLog; - } - return messages; -}; - describe("Filter tests", function() { // Test filter parsing @@ -265,14 +249,12 @@ function runTests(wiki) { // The following 2 tests should write a log -> WARNING: Filter modifier has a deprecated regexp operand XXXX // The test should pass anyway. it("should handle the field operator with a regular expression operand", function() { - var warnings = collectLog(function() { - expect(wiki.filterTiddlers("[modifier/JoeBloggs/]").join(",")).toBe("TiddlerOne"); - }); - expect(warnings).toEqual(["WARNING: Filter modifier has a deprecated regexp operand /JoeBloggs/"]); - warnings = collectLog(function() { - expect(wiki.filterTiddlers("[modifier/Jo/]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); - }); - expect(warnings).toEqual(["WARNING: Filter modifier has a deprecated regexp operand /Jo/"]); + spyOn(console, 'log'); + expect(wiki.filterTiddlers("[modifier/JoeBloggs/]").join(",")).toBe("TiddlerOne"); + expect(console.log).toHaveBeenCalledWith("WARNING: Filter", "modifier", "has a deprecated regexp operand", /JoeBloggs/); + console.log.calls.reset(); + expect(wiki.filterTiddlers("[modifier/Jo/]").join(",")).toBe("TiddlerOne,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,one"); + expect(console.log).toHaveBeenCalledWith("WARNING: Filter", "modifier", "has a deprecated regexp operand", /Jo/); }); it("should handle the prefix operator", function() { From 743d9c56c0e106c7314e5e2a085333effea54d6d Mon Sep 17 00:00:00 2001 From: cdruan <80615570+cdruan@users.noreply.github.com> Date: Thu, 18 Mar 2021 01:57:43 -0700 Subject: [PATCH 1253/2376] Signing the CLA (#5551) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index 852b0f30e..c633abdbd 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -447,3 +447,5 @@ Dyllon Gagnier, @slaymaker1907, 2021/01/24 J. Wilhelm, @jeremyredhead, 2021/01/27 Quentin Minster, @laomaiweng, 2021/03/10 + +Cindy Ruan, @cdruan, 2021/03/18 From 80ee5adb148d7220474096a0e80da05148ca7323 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 19 Mar 2021 15:37:59 +0000 Subject: [PATCH 1254/2376] Extend transclude widget to optionally set variables Partially fixes #5199 --- core/modules/widgets/transclude.js | 11 +++++- core/modules/widgets/widget.js | 35 +++++++++++++++++-- .../tiddlers/widgets/TranscludeWidget.tid | 3 +- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 1af7f9c42..c57579919 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -75,8 +75,17 @@ TranscludeWidget.prototype.execute = function() { ]}]; } } + // Assign any variables set via attributes starting with $ + var variables = Object.create(null); + $tw.utils.each(this.attributes,function(attribute,name) { + if(name.charAt(0) === "$") { + variables[name.substr(1)] = attribute; + } + }); // Construct the child widgets - this.makeChildWidgets(parseTreeNodes); + this.makeChildWidgets(parseTreeNodes,{ + variables: variables + }); }; /* diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 1925bfe00..50405c19c 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -333,9 +333,22 @@ Widget.prototype.assignAttributes = function(domNode,options) { /* Make child widgets correspondng to specified parseTreeNodes */ -Widget.prototype.makeChildWidgets = function(parseTreeNodes) { +Widget.prototype.makeChildWidgets = function(parseTreeNodes,options) { + options = options || {}; this.children = []; var self = this; + // Create set variable widgets for each variable + $tw.utils.each(options.variables,function(value,name) { + var setVariableWidget = { + type: "set", + attributes: { + name: {type: "string", value: name}, + value: {type: "string", value: value} + }, + children: parseTreeNodes + }; + parseTreeNodes = [setVariableWidget]; + }); $tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) { self.children.push(self.makeChildWidget(childNode)); }); @@ -343,16 +356,32 @@ Widget.prototype.makeChildWidgets = function(parseTreeNodes) { /* Construct the widget object for a parse tree node +options include: + variables: optional hashmap of variables to wrap around the widget */ -Widget.prototype.makeChildWidget = function(parseTreeNode) { +Widget.prototype.makeChildWidget = function(parseTreeNode,options) { + options = options || {}; var WidgetClass = this.widgetClasses[parseTreeNode.type]; if(!WidgetClass) { WidgetClass = this.widgetClasses.text; parseTreeNode = {type: "text", text: "Undefined widget '" + parseTreeNode.type + "'"}; } + // Create set variable widgets for each variable + $tw.utils.each(options.variables,function(value,name) { + var setVariableWidget = { + type: "set", + attributes: { + name: {type: "string", value: name}, + value: {type: "string", value: value} + }, + children: [ + parseTreeNode + ] + }; + parseTreeNode = setVariableWidget; + }); return new WidgetClass(parseTreeNode,{ wiki: this.wiki, - variables: {}, parentWidget: this, document: this.document }); diff --git a/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid b/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid index 0501d7091..c28e44432 100644 --- a/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid @@ -1,5 +1,5 @@ created: 20130824142500000 -modified: 20140717175900970 +modified: 20210319150601867 tags: Widgets title: TranscludeWidget type: text/vnd.tiddlywiki @@ -17,6 +17,7 @@ The TranscludeWidget dynamically imports content from another tiddler. |index |The index of a property in a [[DataTiddler|DataTiddlers]] | |subtiddler |Optional SubTiddler title when the target tiddler is a [[plugin|Plugins]] (see below) | |mode |Override the default parsing mode for the transcluded text to "block" or "inline" | +|//(attributes starting with $)// |<<.from-version "5.1.24">> The $ is removed from each attribute name to specify a variable name that is assigned the specified value for the scope of the transclusion | The TranscludeWidget treats any contained content as a fallback if the target of the transclusion is not defined (ie a missing tiddler or a missing field). From 9af68297cd4c1df8e5d3bd238a7949bd4143aeb4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 19 Mar 2021 16:14:15 +0000 Subject: [PATCH 1255/2376] Fix transclusion refreshing Missed off 80ee5adb148d7220474096a0e80da05148ca7323 --- core/modules/widgets/transclude.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index c57579919..515301ce5 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -112,7 +112,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ TranscludeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) { + if(Object.keys(changedAttributes).length || changedTiddlers[this.transcludeTitle]) { this.refreshSelf(); return true; } else { From a38dc1730010c6a2b6a011aff4818bbc67c04055 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 19 Mar 2021 17:09:53 +0000 Subject: [PATCH 1256/2376] Extend render command to allow multiple variables to be passed --- core/language/en-GB/Help/render.tid | 7 ++++--- core/modules/commands/render.js | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/language/en-GB/Help/render.tid b/core/language/en-GB/Help/render.tid index 2b7b168c9..47be85517 100644 --- a/core/language/en-GB/Help/render.tid +++ b/core/language/en-GB/Help/render.tid @@ -8,15 +8,15 @@ Optionally, the title of a template tiddler can be specified. In this case, inst A name and value for an additional variable may optionally also be specified. ``` ---render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>] +--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [ [<name>] [<value>] ]* ``` * ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered * ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename * ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material) * ''template'': Optional template through which each tiddler is rendered -* ''name'': Name of optional variable -* ''value'': Value of optional variable +* ''name'': Name of optional variables +* ''value'': Value of optional variables By default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory. @@ -26,6 +26,7 @@ Notes: * Any missing directories in the path to the filename are automatically created. * When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render "[[Motovun Jack.jpg]]"` * The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/` +* Multiple ''name''/''value'' pairs can be used to pass more than one variable * The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated Examples: diff --git a/core/modules/commands/render.js b/core/modules/commands/render.js index e9321c2b0..ece2b838f 100644 --- a/core/modules/commands/render.js +++ b/core/modules/commands/render.js @@ -37,14 +37,14 @@ Command.prototype.execute = function() { filenameFilter = this.params[1] || "[is[tiddler]addsuffix[.html]]", type = this.params[2] || "text/html", template = this.params[3], - varName = this.params[4], - varValue = this.params[5], + variableList = this.params.slice(4), tiddlers = wiki.filterTiddlers(tiddlerFilter); $tw.utils.each(tiddlers,function(title) { var parser = wiki.parseTiddler(template || title), variables = {currentTiddler: title}; - if(varName) { - variables[varName] = varValue || ""; + while(variableList.length >= 2) { + variables[variableList[0]] = variableList[1]; + variableList = variableList.slice(2); } var widgetNode = wiki.makeWidget(parser,{variables: variables}), container = $tw.fakeDocument.createElement("div"); From 8aad7b00abba61d67a01a13db51c3fedf6bede75 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 19 Mar 2021 18:35:10 +0000 Subject: [PATCH 1257/2376] Render command: fix bug with multiple variable usage --- core/modules/commands/render.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/modules/commands/render.js b/core/modules/commands/render.js index ece2b838f..b10d0f5d5 100644 --- a/core/modules/commands/render.js +++ b/core/modules/commands/render.js @@ -38,15 +38,15 @@ Command.prototype.execute = function() { type = this.params[2] || "text/html", template = this.params[3], variableList = this.params.slice(4), - tiddlers = wiki.filterTiddlers(tiddlerFilter); - $tw.utils.each(tiddlers,function(title) { - var parser = wiki.parseTiddler(template || title), - variables = {currentTiddler: title}; + tiddlers = wiki.filterTiddlers(tiddlerFilter), + variables = Object.create(null); while(variableList.length >= 2) { variables[variableList[0]] = variableList[1]; variableList = variableList.slice(2); } - var widgetNode = wiki.makeWidget(parser,{variables: variables}), + $tw.utils.each(tiddlers,function(title) { + var parser = wiki.parseTiddler(template || title); + var widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title})}), container = $tw.fakeDocument.createElement("div"); widgetNode.render(container,null); var text = type === "text/html" ? container.innerHTML : container.textContent, From a44a8c31f076d0926c32f6cabd13bfbc42c2dc16 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sat, 20 Mar 2021 17:43:36 +0800 Subject: [PATCH 1258/2376] Update chinese help texts for render command (#5553) --- languages/zh-Hans/Help/render.tid | 2 +- languages/zh-Hant/Help/render.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/languages/zh-Hans/Help/render.tid b/languages/zh-Hans/Help/render.tid index e1400bd74..c7894ac9a 100644 --- a/languages/zh-Hans/Help/render.tid +++ b/languages/zh-Hans/Help/render.tid @@ -8,7 +8,7 @@ description: 呈现个别条目到文件 也可以选择性地指定附加变量的名称和值。 ``` ---render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>] +--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [ [<name>] [<value>] ]* ``` * ''tiddler-filter'': 标识要呈现的条目的筛选器 diff --git a/languages/zh-Hant/Help/render.tid b/languages/zh-Hant/Help/render.tid index 7a0b352a4..6909fbe2f 100644 --- a/languages/zh-Hant/Help/render.tid +++ b/languages/zh-Hant/Help/render.tid @@ -8,7 +8,7 @@ description: 呈現個別條目到檔案 也可以選擇性地指定附加變數的名稱和值。 ``` ---render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>] +--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [ [<name>] [<value>] ]* ``` * ''tiddler-filter'': 標識要呈現的條目的篩選器 From 99bef2614cc430ea0ef0ca5e76975bb4dce24845 Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sat, 20 Mar 2021 23:43:35 +0100 Subject: [PATCH 1259/2376] Update SelectWidget.tid (#5555) Added instrux for placeholder value. [Ref.](https://github.com/Jermolene/TiddlyWiki5/issues/5544) --- editions/tw5.com/tiddlers/widgets/SelectWidget.tid | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/SelectWidget.tid b/editions/tw5.com/tiddlers/widgets/SelectWidget.tid index 47c1117a6..8042b9d86 100644 --- a/editions/tw5.com/tiddlers/widgets/SelectWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/SelectWidget.tid @@ -53,6 +53,17 @@ This example sets the title of the current wiki [[$:/SiteTitle]] to one of a lis <option>The Dice Man</option> </$select>"/> +!!! Simple List with Placeholder Value + +To display a default value that is also disabled, effectively functioning as a placeholder, this form can be used: + +<$macrocall $name="wikitext-example-without-html" src="<$select tiddler="$:/SiteTitle" default="Choose a new site title"> +<option disabled>Choose a new site title</option> +<option>A Tale of Two Cities</option> +<option>A New Kind of Science</option> +<option>The Dice Man</option> +</$select>"/> + !! Value lists In this example the `value` attribute has been used to specify the text that should be used as the value of the entry instead of the display text. @@ -117,4 +128,4 @@ This example uses the `multiple` keyword to specify that we should be able to se <$list filter='[list[$:/generated-list-demo-state!!testing]]'> <$view field='title' /><br /> </$list> -"/> \ No newline at end of file +"/> From 0beac47243b4d380c4e180f59c1e236b711dea6d Mon Sep 17 00:00:00 2001 From: twMat <boardsmm@gmail.com> Date: Sun, 21 Mar 2021 17:55:18 +0100 Subject: [PATCH 1260/2376] Update SelectWidget.tid (#5556) Placeholder value - Correction of previous attempt. --- editions/tw5.com/tiddlers/widgets/SelectWidget.tid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/SelectWidget.tid b/editions/tw5.com/tiddlers/widgets/SelectWidget.tid index 8042b9d86..66475c2e8 100644 --- a/editions/tw5.com/tiddlers/widgets/SelectWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/SelectWidget.tid @@ -55,10 +55,10 @@ This example sets the title of the current wiki [[$:/SiteTitle]] to one of a lis !!! Simple List with Placeholder Value -To display a default value that is also disabled, effectively functioning as a placeholder, this form can be used: +To display a default value that is also disabled, effectively functioning as a placeholder, the following form can be used. Note that the targeted field must be empty, or not exist, for the placeholder to show in the widget: -<$macrocall $name="wikitext-example-without-html" src="<$select tiddler="$:/SiteTitle" default="Choose a new site title"> -<option disabled>Choose a new site title</option> +<$macrocall $name="wikitext-example-without-html" src="<$select tiddler='New Tiddler' field='text' default='Choose a new text'> +<option disabled>Choose a new text</option> <option>A Tale of Two Cities</option> <option>A New Kind of Science</option> <option>The Dice Man</option> From 9c31ff1fb1261fd2a15e6f2bac0bba255e7765a7 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Mar 2021 09:08:32 +0000 Subject: [PATCH 1261/2376] Use window.setTimeout(fn,0) for $tw.utils.nextTick in the browser It seems that best practice has now moved to using zero: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout --- core/modules/utils/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 4c9c3e96d..f3167fdfa 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -618,7 +618,7 @@ exports.nextTick = function(fn) { /*global window: false */ if(typeof process === "undefined") { // Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts - window.setTimeout(fn,4); + window.setTimeout(fn,0); } else { process.nextTick(fn); } From 7f202f35b4b142b474fc13170c0bd724a2729b4f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Mar 2021 09:50:54 +0000 Subject: [PATCH 1262/2376] Minor refactoring for clarity See https://github.com/Jermolene/TiddlyWiki5/commit/9af68297cd4c1df8e5d3bd238a7949bd4143aeb4#r48540814 --- core/modules/widgets/transclude.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 515301ce5..e2f2e78dc 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -112,7 +112,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ TranscludeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(Object.keys(changedAttributes).length || changedTiddlers[this.transcludeTitle]) { + if($tw.utils.count(changedAttributes) || changedTiddlers[this.transcludeTitle]) { this.refreshSelf(); return true; } else { From f5887d9e25cd6638996e60caaab0d3c9b3625110 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 22 Mar 2021 15:22:49 +0000 Subject: [PATCH 1263/2376] Add a link to the community aggregator --- editions/tw5.com/tiddlers/$__StoryList.tid | 5 +++++ .../community/Community Links Aggregator.tid | 10 ++++++++++ .../tw5.com/tiddlers/community/Community.tid | 6 ++++-- .../tiddlers/hellothere/HelloThumbnail.tid | 2 +- .../HelloThumbnail - TiddlyWikiLinks.tid | 6 ++++++ .../tw5.com/tiddlers/images/TiddlyWikiLinks.png | Bin 0 -> 11963 bytes .../tiddlers/images/TiddlyWikiLinks.png.meta | 3 +++ 7 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 editions/tw5.com/tiddlers/$__StoryList.tid create mode 100644 editions/tw5.com/tiddlers/community/Community Links Aggregator.tid create mode 100644 editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - TiddlyWikiLinks.tid create mode 100644 editions/tw5.com/tiddlers/images/TiddlyWikiLinks.png create mode 100644 editions/tw5.com/tiddlers/images/TiddlyWikiLinks.png.meta diff --git a/editions/tw5.com/tiddlers/$__StoryList.tid b/editions/tw5.com/tiddlers/$__StoryList.tid new file mode 100644 index 000000000..f21633f4a --- /dev/null +++ b/editions/tw5.com/tiddlers/$__StoryList.tid @@ -0,0 +1,5 @@ +created: 20210322152203906 +list: [[Documentation Macros]] HelloThere GettingStarted Community +modified: 20210322152237613 +title: $:/StoryList +type: text/vnd.tiddlywiki \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/community/Community Links Aggregator.tid b/editions/tw5.com/tiddlers/community/Community Links Aggregator.tid new file mode 100644 index 000000000..ff73b7788 --- /dev/null +++ b/editions/tw5.com/tiddlers/community/Community Links Aggregator.tid @@ -0,0 +1,10 @@ +title: Community Links Aggregator +tags: Community +modified: 20210322151848025 +created: 20210322151848025 + +The ~TiddlyWiki Community Links Aggregator is a collection of regularly updated links to useful and interesting TiddlyWiki material curated by our team of community editors. The site aggregates links curated by individual members of the TiddlyWiki community. It lets you see the latest links, and explore them through categories and timelines. + +https://links.tiddlywiki.com/ + +This site works best with a crowd of people posting links. The pressure on individuals is reduced because not everybody needs to catch every interesting link that flies past. The aggregation effects reduce the impact of mistakes. For example, if one person mis-tags a link under an inappropriate topic, the site will show that only one person added that tag, versus the majority using more appropriate tags. In that way, we hope that a sort of wisdom of the crowds will emerge, with consensus emerging as to the most useful ways to describe and categorise links. diff --git a/editions/tw5.com/tiddlers/community/Community.tid b/editions/tw5.com/tiddlers/community/Community.tid index 86b158cb7..75e8e623c 100644 --- a/editions/tw5.com/tiddlers/community/Community.tid +++ b/editions/tw5.com/tiddlers/community/Community.tid @@ -1,9 +1,11 @@ created: 20130909151600000 -modified: 20210106151027426 +modified: 20210322152237662 tags: TableOfContents title: Community type: text/vnd.tiddlywiki -Here we gather the latest and most useful material from the TiddlyWiki community. +<<.tip "The latest and most useful links are now being gathered in the [[Community Links Aggregator]].">> + +Once all the relevant links have been transferred over these entries will be removed from the main tiddlywiki.com site. <<tabs "Forums Latest Tutorials [[Community Editions]] [[Community Plugins]] [[Community Themes]] [[Community Palettes]] [[Other Resources]] Examples Articles Meetups" "Latest">> diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid b/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid index f97b16ea6..bb42aa6a7 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid @@ -1,5 +1,5 @@ created: 20150414070451144 -list: [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Gentle Guide]] [[HelloThumbnail - Firefox Apocalypse]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - TiddlyMap]] [[HelloThumbnail - HelpingTiddlyWiki]] [[HelloThumbnail - Developers]] [[HelloThumbnail - Classic]] +list: [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Gentle Guide]] [[HelloThumbnail - Firefox Apocalypse]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - TiddlyWikiLinks]] [[HelloThumbnail - TiddlyMap]] [[HelloThumbnail - HelpingTiddlyWiki]] [[HelloThumbnail - Developers]] [[HelloThumbnail - Classic]] modified: 20150414070948246 title: HelloThumbnail type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - TiddlyWikiLinks.tid b/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - TiddlyWikiLinks.tid new file mode 100644 index 000000000..a5b3e44ad --- /dev/null +++ b/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - TiddlyWikiLinks.tid @@ -0,0 +1,6 @@ +title: HelloThumbnail - TiddlyWikiLinks +tags: HelloThumbnail +color: #D5B7EA +image: TiddlyWikiLinks +caption: links.tiddlywiki.com +link: Community Links Aggregator diff --git a/editions/tw5.com/tiddlers/images/TiddlyWikiLinks.png b/editions/tw5.com/tiddlers/images/TiddlyWikiLinks.png new file mode 100644 index 0000000000000000000000000000000000000000..6715866d4d9488c3c6d1c714f81878ca9dc63aea GIT binary patch literal 11963 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 literal 0 HcmV?d00001 diff --git a/editions/tw5.com/tiddlers/images/TiddlyWikiLinks.png.meta b/editions/tw5.com/tiddlers/images/TiddlyWikiLinks.png.meta new file mode 100644 index 000000000..5ac185287 --- /dev/null +++ b/editions/tw5.com/tiddlers/images/TiddlyWikiLinks.png.meta @@ -0,0 +1,3 @@ +title: TiddlyWikiLinks +type: image/png +tags: picture From 226df2ad7d2978d3d7400d94767a0503e495cf98 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 23 Mar 2021 09:27:16 +0000 Subject: [PATCH 1264/2376] Fix exporting of tiddlers that begin and end with double quotes --- core/wiki/macros/export.tid | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/wiki/macros/export.tid b/core/wiki/macros/export.tid index 629333ff8..c3256c431 100644 --- a/core/wiki/macros/export.tid +++ b/core/wiki/macros/export.tid @@ -6,25 +6,24 @@ $baseFilename$$(extension)$ \end \define exportButton(exportFilter:"[!is[system]sort[title]]",lingoBase,baseFilename:"tiddlers") -<span class="tc-popup-keep"><$button popup=<<qualify "$:/state/popup/export">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> +<$vars hint={{{ [<__lingoBase__>addsuffix[Hint]get[text]] }}} caption={{{ [<__lingoBase__>addsuffix[Caption]get[text]] }}}> +<span class="tc-popup-keep"><$button popup=<<qualify "$:/state/popup/export">> tooltip=<<hint>> aria-label=<<caption>> class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/export-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$lingoBase$Caption}}/></span> +<span class="tc-btn-text"><$text text=<<caption>>/></span> </$list> -</$button></span><$reveal state=<<qualify "$:/state/popup/export">> type="popup" position="below" animate="yes"> +</$button></span></$vars><$reveal state=<<qualify "$:/state/popup/export">> type="popup" position="below" animate="yes"> <div class="tc-drop-down"> <$set name="count" value={{{ [subfilter<__exportFilter__>count[]] }}}> <$list filter="[all[shadows+tiddlers]tag[$:/tags/Exporter]]"> <$list filter="[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]" variable="ignore"> -<$set name="extension" value={{!!extension}}> <$button class="tc-btn-invisible"> -<$action-sendmessage $message="tm-download-file" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename """$baseFilename$""">>/> +<$action-sendmessage $message="tm-download-file" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename={{{ [<__baseFilename__>addsuffix{!!extension}] }}}/> <$action-deletetiddler $tiddler=<<qualify "$:/state/popup/export">>/> <$transclude field="description"/> </$button> -</$set> </$list> </$list> </$set> From c3955c3cf93039452dac1a6b0db8cf7594a72c14 Mon Sep 17 00:00:00 2001 From: FND <FND@users.noreply.github.com> Date: Wed, 24 Mar 2021 22:21:45 +0100 Subject: [PATCH 1265/2376] Add another podcast link (#5567) --- editions/tw5.com/tiddlers/about/History of TiddlyWiki.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/about/History of TiddlyWiki.tid b/editions/tw5.com/tiddlers/about/History of TiddlyWiki.tid index b5ef197ff..a06939805 100644 --- a/editions/tw5.com/tiddlers/about/History of TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/about/History of TiddlyWiki.tid @@ -6,7 +6,7 @@ type: text/vnd.tiddlywiki //These are personal reflections on the history and development of TiddlyWiki from JeremyRuston.// -//There is also a [[podcast|https://changelog.com/196/]] discussing TiddlyWiki's backstory.// +//There is also a [[podcast from 2016|https://changelog.com/podcast/196]] discussing TiddlyWiki's backstory as well as a [[recording from 2021|https://twit.tv/shows/floss-weekly/episodes/620]].// ! Origins of TiddlyWiki From a2e7cc51b536d9482ce71a64dbe9f7aa8e063dbc Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Fri, 26 Mar 2021 01:39:32 -0700 Subject: [PATCH 1266/2376] Fix 5483 & 3483 (#5504) --- boot/boot.js | 1 + core/modules/commands/savewikifolder.js | 4 +- core/modules/utils/filesystem.js | 64 ++++++++++--------- .../filesystem/filesystemadaptor.js | 6 +- 4 files changed, 41 insertions(+), 34 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index fbac37d77..6e99863f8 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2133,6 +2133,7 @@ $tw.loadWikiTiddlers = function(wikiPath,options) { fileInfo = $tw.boot.files[title]; if(fileInfo.isEditableFile) { relativePath = path.relative($tw.boot.wikiTiddlersPath,fileInfo.filepath); + fileInfo.originalpath = relativePath; output[title] = path.sep === "/" ? relativePath : diff --git a/core/modules/commands/savewikifolder.js b/core/modules/commands/savewikifolder.js index f5cfb9cd7..cd4b5f26e 100644 --- a/core/modules/commands/savewikifolder.js +++ b/core/modules/commands/savewikifolder.js @@ -167,10 +167,10 @@ WikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) { } var fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{ directory: path.resolve(this.wikiFolderPath,directory), - wiki: this.wiki, pathFilters: pathFilters, extFilters: extFilters, - originalpath: this.wiki.extractTiddlerDataItem("$:/config/OriginalTiddlerPaths",title, "") + wiki: this.wiki, + fileInfo: {} }); try { $tw.utils.saveTiddlerToFileSync(tiddler,fileInfo); diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index b7fe2156c..230090840 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -213,13 +213,13 @@ Options include: extFilters: optional array of filters to be used to generate the base path wiki: optional wiki for evaluating the pathFilters, fileInfo: an existing fileInfo to check against - originalpath: a preferred filepath if no pathFilters match */ exports.generateTiddlerFileInfo = function(tiddler,options) { var fileInfo = {}, metaExt; // Propagate the isEditableFile flag - if(options.fileInfo) { - fileInfo.isEditableFile = options.fileInfo.isEditableFile || false; + if(options.fileInfo && !!options.fileInfo.isEditableFile) { + fileInfo.isEditableFile = true; + fileInfo.originalpath = options.fileInfo.originalpath; } // Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace var hasUnsafeFields = false; @@ -247,7 +247,7 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { fileInfo.hasMetaFile = true; } if(options.extFilters) { - // Check for extension override + // Check for extension overrides metaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{ extFilters: options.extFilters, wiki: options.wiki @@ -279,8 +279,7 @@ exports.generateTiddlerFileInfo = function(tiddler,options) { directory: options.directory, pathFilters: options.pathFilters, wiki: options.wiki, - fileInfo: options.fileInfo, - originalpath: options.originalpath + fileInfo: options.fileInfo }); return fileInfo; }; @@ -292,8 +291,7 @@ Options include: wiki: optional wiki for evaluating the extFilters */ exports.generateTiddlerExtension = function(title,options) { - var self = this, - extension; + var extension; // Check if any of the extFilters applies if(options.extFilters && options.wiki) { $tw.utils.each(options.extFilters,function(filter) { @@ -319,11 +317,10 @@ Options include: fileInfo: an existing fileInfo object to check against */ exports.generateTiddlerFilepath = function(title,options) { - var self = this, - directory = options.directory || "", + var directory = options.directory || "", extension = options.extension || "", - originalpath = options.originalpath || "", - filepath; + originalpath = (options.fileInfo && options.fileInfo.originalpath) ? options.fileInfo.originalpath : "", + filepath; // Check if any of the pathFilters applies if(options.pathFilters && options.wiki) { $tw.utils.each(options.pathFilters,function(filter) { @@ -336,7 +333,7 @@ exports.generateTiddlerFilepath = function(title,options) { } }); } - if(!filepath && originalpath !== "") { + if(!filepath && !!originalpath) { //Use the originalpath without the extension var ext = path.extname(originalpath); filepath = originalpath.substring(0,originalpath.length - ext.length); @@ -345,27 +342,35 @@ exports.generateTiddlerFilepath = function(title,options) { // Remove any forward or backward slashes so we don't create directories filepath = filepath.replace(/\/|\\/g,"_"); } - //If the path does not start with "." or ".." and a path seperator, then + // Replace any Windows control codes + filepath = filepath.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i,"_$1_"); + // Replace any leading spaces with the same number of underscores + filepath = filepath.replace(/^ +/,function (u) { return u.replace(/ /g, "_")}); + //If the path does not start with "." or ".." && a path seperator, then if(!/^\.{1,2}[/\\]/g.test(filepath)) { // Don't let the filename start with any dots because such files are invisible on *nix - filepath = filepath.replace(/^\.+/g,"_"); + filepath = filepath.replace(/^\.+/g,function (u) { return u.replace(/\./g, "_")}); + } + // Replace any Unicode control codes + filepath = filepath.replace(/[\x00-\x1f\x80-\x9f]/g,"_"); + // Replace any characters that can't be used in cross-platform filenames + filepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\:|\"|\||\?|\*|\^/g,"_")); + // Replace any dots or spaces at the end of the extension with the same number of underscores + extension = extension.replace(/[\. ]+$/, function (u) { return u.replace(/[\. ]/g, "_")}); + // Truncate the extension if it is too long + if(extension.length > 32) { + extension = extension.substr(0,32); } // If the filepath already ends in the extension then remove it if(filepath.substring(filepath.length - extension.length) === extension) { filepath = filepath.substring(0,filepath.length - extension.length); } - // Remove any characters that can't be used in cross-platform filenames - filepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\:|\"|\||\?|\*|\^/g,"_")); // Truncate the filename if it is too long if(filepath.length > 200) { filepath = filepath.substr(0,200); } - // Truncate the extension if it is too long - if(extension.length > 32) { - extension = extension.substr(0,32); - } - // If the resulting filename is blank (eg because the title is just punctuation characters) - if(!filepath) { + // If the resulting filename is blank (eg because the title is just punctuation) + if(!filepath || /^_+$/g.test(filepath)) { // ...then just use the character codes of the title filepath = ""; $tw.utils.each(title.split(""),function(char) { @@ -386,14 +391,15 @@ exports.generateTiddlerFilepath = function(title,options) { count++; } while(fs.existsSync(fullPath)); // If the last write failed with an error, or if path does not start with: - // the resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, - // then encodeURIComponent() and resolve to tiddler directory - var writePath = $tw.hooks.invokeHook("th-make-tiddler-path",fullPath), + // the resolved options.directory, the resolved wikiPath directory, the wikiTiddlersPath directory, + // or the 'originalpath' directory, then encodeURIComponent() and resolve to tiddler directory. + var writePath = $tw.hooks.invokeHook("th-make-tiddler-path",fullPath,fullPath), encode = (options.fileInfo || {writeError: false}).writeError == true; if(!encode) { - encode = !(fullPath.indexOf(path.resolve(directory)) == 0 || - fullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 || - fullPath.indexOf($tw.boot.wikiTiddlersPath) == 0); + encode = !(writePath.indexOf($tw.boot.wikiTiddlersPath) == 0 || + writePath.indexOf(path.resolve(directory)) == 0 || + writePath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 || + writePath.indexOf(path.resolve($tw.boot.wikiTiddlersPath,originalpath)) == 0 ); } if(encode) { writePath = path.resolve(directory,encodeURIComponent(fullPath)); diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index 5b2eda092..0ed686c84 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -53,7 +53,8 @@ It is the responsibility of the filesystem adaptor to update this.boot.files for */ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { // Always generate a fileInfo object when this fuction is called - var title = tiddler.fields.title, newInfo, pathFilters, extFilters; + var title = tiddler.fields.title, newInfo, pathFilters, extFilters, + fileInfo = this.boot.files[title]; if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")) { pathFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"); } @@ -65,8 +66,7 @@ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { pathFilters: pathFilters, extFilters: extFilters, wiki: this.wiki, - fileInfo: this.boot.files[title], - originalpath: this.wiki.extractTiddlerDataItem("$:/config/OriginalTiddlerPaths",title,"") + fileInfo: fileInfo }); callback(null,newInfo); }; From 5be647b610ebb56cd5091132350f9e3f5730c0b4 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Fri, 26 Mar 2021 01:41:41 -0700 Subject: [PATCH 1267/2376] Fix 4461 (#5522) --- core/modules/server/routes/get-login-basic.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/server/routes/get-login-basic.js b/core/modules/server/routes/get-login-basic.js index c3cb16eb6..2a71d6e33 100644 --- a/core/modules/server/routes/get-login-basic.js +++ b/core/modules/server/routes/get-login-basic.js @@ -25,8 +25,9 @@ exports.handler = function(request,response,state) { response.end(); } else { // Redirect to the root wiki if login worked + var location = ($tw.syncadaptor && $tw.syncadaptor.host)? $tw.syncadaptor.host: "/"; response.writeHead(302,{ - Location: "/" + Location: location }); response.end(); } From 3d608892bdd707a7b2c3d0f54843d37d516da007 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Fri, 26 Mar 2021 01:42:31 -0700 Subject: [PATCH 1268/2376] targeted fix for 5366 (#5416) --- core/modules/utils/filesystem.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 230090840..121cbc4c7 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -419,7 +419,7 @@ exports.saveTiddlerToFile = function(tiddler,fileInfo,callback) { if(fileInfo.hasMetaFile) { // Save the tiddler as a separate body and meta file var typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/plain"] || {encoding: "utf8"}; - fs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) { + fs.writeFile(fileInfo.filepath,tiddler.fields.text || "",typeInfo.encoding,function(err) { if(err) { return callback(err); } @@ -461,7 +461,7 @@ exports.saveTiddlerToFileSync = function(tiddler,fileInfo) { if(fileInfo.hasMetaFile) { // Save the tiddler as a separate body and meta file var typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/plain"] || {encoding: "utf8"}; - fs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding); + fs.writeFileSync(fileInfo.filepath,tiddler.fields.text || "",typeInfo.encoding); fs.writeFileSync(fileInfo.filepath + ".meta",tiddler.getFieldStringBlock({exclude: ["text","bag"]}),"utf8"); } else { // Save the tiddler as a self contained templated file @@ -471,6 +471,7 @@ exports.saveTiddlerToFileSync = function(tiddler,fileInfo) { fs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: ["bag"]})],null,$tw.config.preferences.jsonSpaces),"utf8"); } } + return fileInfo; }; /* From 85835ebe42979d213436709ef18ac7de64b1a8b6 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Fri, 26 Mar 2021 10:32:12 +0100 Subject: [PATCH 1269/2376] fix 5424 add button is in new line (#5425) --- core/ui/EditTemplate/fields.tid | 2 +- core/ui/EditTemplate/type.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/EditTemplate/fields.tid b/core/ui/EditTemplate/fields.tid index 7afaf8ac1..91578a99a 100644 --- a/core/ui/EditTemplate/fields.tid +++ b/core/ui/EditTemplate/fields.tid @@ -84,7 +84,7 @@ $value={{{ [<newFieldValueTiddler>get[text]] }}}/> <$fieldmangler> <div class="tc-edit-field-add"> -<em class="tc-edit tc-big-gap-right"> +<em class="tc-edit tc-small-gap-right"> <<lingo Fields/Add/Prompt>> </em> <$vars refreshTitle=<<qualify "$:/temp/fieldname/refresh">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>> diff --git a/core/ui/EditTemplate/type.tid b/core/ui/EditTemplate/type.tid index 4b458aa5b..1ab0247ee 100644 --- a/core/ui/EditTemplate/type.tid +++ b/core/ui/EditTemplate/type.tid @@ -7,7 +7,7 @@ first-search-filter: [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[d \whitespace trim <$set name="refreshTitle" value=<<qualify "$:/temp/type-search/refresh">>> <div class="tc-edit-type-selector-wrapper"> -<em class="tc-edit tc-big-gap-right"><<lingo Type/Prompt>></em> +<em class="tc-edit tc-small-gap-right"><<lingo Type/Prompt>></em> <div class="tc-type-selector-dropdown-wrapper"> <div class="tc-type-selector"><$fieldmangler> <$macrocall $name="keyboard-driven-input" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field="type" tag="input" default="" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify "$:/state/popup/type-dropdown">> class="tc-edit-typeeditor tc-edit-texteditor tc-popup-handle" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups="yes" configTiddlerFilter="[[$:/core/ui/EditTemplate/type]]" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify "$:/state/popup/type-dropdown">> class="tc-btn-invisible tc-btn-dropdown tc-small-gap" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message="tm-remove-field" param="type" class="tc-btn-invisible tc-btn-icon" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter="[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]"/></$button> From 860568136f913ba04a287899e1fb97c728f0fea7 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Mon, 29 Mar 2021 10:02:47 +0200 Subject: [PATCH 1270/2376] ViewSwitcher : use Button widget instead of LinkWidget (#5573) --- core/wiki/viewswitcher.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/wiki/viewswitcher.tid b/core/wiki/viewswitcher.tid index 0586aade5..011bf3cdb 100644 --- a/core/wiki/viewswitcher.tid +++ b/core/wiki/viewswitcher.tid @@ -7,9 +7,9 @@ $:/core/images/storyview-$(storyview)$ <div class="tc-chooser tc-viewswitcher"> <$list filter="[storyviews[]]" variable="storyview"> <$set name="cls" filter="[<storyview>prefix{$:/view}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item"><div class=<<cls>>> -<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link> +<$button tag="a" class="tc-tiddlylink tc-btn-invisible" to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$button> </div> </$set> </$list> </div> -</$linkcatcher> \ No newline at end of file +</$linkcatcher> From 55e44a95543d76d8a379591f8ef7a6e0149d8865 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Mon, 29 Mar 2021 17:45:12 +0200 Subject: [PATCH 1271/2376] This PR add tc-tiny-gap-xxx to the vanilla theme. It is similar to   and should replace it. (#5574) --- themes/tiddlywiki/vanilla/base.tid | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index c197d3971..b34917222 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -2946,6 +2946,19 @@ select { ** Other utility classes */ +.tc-tiny-gap { + margin-left: .25em; + margin-right: .25em; +} + +.tc-tiny-gap-left { + margin-left: .25em; +} + +.tc-tiny-gap-right { + margin-right: .25em; +} + .tc-small-gap { margin-left: .5em; margin-right: .5em; From d6ea369f5ef9d3092a360a4286a99902df37782b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 31 Mar 2021 14:15:01 +0100 Subject: [PATCH 1272/2376] Edit text widgets should use default text for missing fields --- core/modules/editor/factory.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index 3cf595371..f1463fe5c 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -103,7 +103,11 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { var tiddler = this.wiki.getTiddler(this.editTitle); if(tiddler) { // If we've got a tiddler, the value to display is the field string value - value = tiddler.getFieldString(this.editField); + if(tiddler.hasField(this.editField)) { + value = tiddler.getFieldString(this.editField); + } else { + value = this.editDefault || ""; + } if(this.editField === "text") { type = tiddler.fields.type || "text/vnd.tiddlywiki"; } From 3b35411abadc3bcf0f569d7b848de13ff31dc2be Mon Sep 17 00:00:00 2001 From: cdruan <80615570+cdruan@users.noreply.github.com> Date: Fri, 2 Apr 2021 01:25:01 -0700 Subject: [PATCH 1273/2376] Change css-escape-polyfill to a tw uitility method (#5552) * Replace css-escape-polyfill.js with escapecss.js utility module * Add $tw.utils.escapeCSS() method and invoke that function within the escapecss operator. * Add test cases for the "escapecss" filter operator * Fix $tw.boot.doesTaskMatchPlatform() so it works as expected if a module's export.platforms contains more than one values * Add missed files to the last commit --- boot/boot.js | 19 ++++++-- core/modules/filters/encodings.js | 2 +- .../escapecss.js} | 44 +++++++------------ editions/test/tiddlers/tests/test-filters.js | 11 +++++ 4 files changed, 45 insertions(+), 31 deletions(-) rename core/modules/{startup/css-escape-polyfill.js => utils/escapecss.js} (75%) diff --git a/boot/boot.js b/boot/boot.js index 6e99863f8..ba780a109 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -2467,16 +2467,29 @@ $tw.boot.executeNextStartupTask = function(callback) { }; /* -Returns true if we are running on one platforms specified in a task modules `platforms` array +Returns true if we are running on one of the platforms specified in taskModule's +`platforms` array; or if `platforms` property is not defined. */ $tw.boot.doesTaskMatchPlatform = function(taskModule) { var platforms = taskModule.platforms; if(platforms) { for(var t=0; t<platforms.length; t++) { - if((platforms[t] === "browser" && !$tw.browser) || (platforms[t] === "node" && !$tw.node)) { - return false; + switch (platforms[t]) { + case "browser": + if ($tw.browser) { + return true; + } + break; + case "node": + if ($tw.node) { + return true; + } + break; + default: + $tw.utils.error("Module " + taskModule.name + ": '" + platforms[t] + "' in export.platforms invalid"); } } + return false; } return true; }; diff --git a/core/modules/filters/encodings.js b/core/modules/filters/encodings.js index 557599c1a..a41086604 100644 --- a/core/modules/filters/encodings.js +++ b/core/modules/filters/encodings.js @@ -102,7 +102,7 @@ exports.escapecss = function(source,operator,options) { var results = []; source(function(tiddler,title) { // escape any character with a special meaning in CSS using CSS.escape() - results.push(CSS.escape(title)); + results.push($tw.utils.escapeCSS(title)); }); return results; }; diff --git a/core/modules/startup/css-escape-polyfill.js b/core/modules/utils/escapecss.js similarity index 75% rename from core/modules/startup/css-escape-polyfill.js rename to core/modules/utils/escapecss.js index dfc904f89..5935b034a 100644 --- a/core/modules/startup/css-escape-polyfill.js +++ b/core/modules/utils/escapecss.js @@ -1,33 +1,28 @@ /*\ -title: $:/core/modules/startup/CSSescape.js +title: $:/core/modules/utils/escapecss.js type: application/javascript -module-type: startup +module-type: utils -Polyfill for CSS.escape() +Provides CSS.escape() functionality. \*/ -(function(root,factory){ +(function(){ + /*jslint node: true, browser: true */ -/*global $tw: false */ +/*global $tw: false, window: false */ "use strict"; -// Export name and synchronous status -exports.name = "css-escape"; -exports.platforms = ["browser"]; -exports.after = ["startup"]; -exports.synchronous = true; - -/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */ -// https://github.com/umdjs/umd/blob/master/returnExports.js -exports.startup = function() {factory(root);}; -}(typeof global != 'undefined' ? global : this, function(root) { - - if (root.CSS && root.CSS.escape) { - return; +exports.escapeCSS = (function() { + // use browser's native CSS.escape() function if available + if ($tw.browser && window.CSS && window.CSS.escape) { + return window.CSS.escape; } - // https://drafts.csswg.org/cssom/#serialize-an-identifier - var cssEscape = function(value) { + // otherwise, a utility method is provided + // see also https://drafts.csswg.org/cssom/#serialize-an-identifier + + /*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */ + return function(value) { if (arguments.length == 0) { throw new TypeError('`CSS.escape` requires an argument.'); } @@ -104,11 +99,6 @@ exports.startup = function() {factory(root);}; } return result; }; +})(); - if (!root.CSS) { - root.CSS = {}; - } - - Object.getPrototypeOf(root.CSS).escape = cssEscape; - -})); +})(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index b67a2d298..ca184a40d 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -796,6 +796,17 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[[12]pad[9],[abc]]").join(",")).toBe("abcabca12"); expect(wiki.filterTiddlers("[[12]pad:suffix[9],[abc]]").join(",")).toBe("12abcabca"); }); + + it("should handle the escapecss operator", function() { + expect(wiki.filterTiddlers("[[Hello There]escapecss[]]").join(",")).toBe("Hello\\ There"); + expect(wiki.filterTiddlers('\'"Reveal.js" by Devin Weaver[1]\' +[escapecss[]]').join(",")).toBe('\\"Reveal\\.js\\"\\ by\\ Devin\\ Weaver\\[1\\]'); + expect(wiki.filterTiddlers(".foo#bar (){} '--a' 0 \0 +[escapecss[]]").join(",")).toBe("\\.foo\\#bar,\\(\\)\\{\\},--a,\\30 ,\ufffd"); + expect(wiki.filterTiddlers("'' +[escapecss[]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("1234 +[escapecss[]]").join(",")).toBe("\\31 234"); + expect(wiki.filterTiddlers("'-25' +[escapecss[]]").join(",")).toBe("-\\32 5"); + expect(wiki.filterTiddlers("'-' +[escapecss[]]").join(",")).toBe("\\-"); + }); + } }); From ef6307a64e387f97f9cd1575db6d357bf35844b1 Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Fri, 2 Apr 2021 04:32:32 -0400 Subject: [PATCH 1274/2376] Do not escape double quotes in tiddler DIVs to save space (#5383) * double quotes are no longer escaped in html bodies * changed tiddlyweb's html-div-tiddler; documentation French version still needs a translation though --- core/modules/utils/utils.js | 9 +++++++++ core/modules/widgets/view.js | 7 +++++++ core/templates/html-div-tiddler.tid | 2 +- editions/tw5.com/tiddlers/widgets/ViewWidget.tid | 1 + plugins/tiddlywiki/tiddlyweb/html-div-tiddler.tid | 2 +- 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index f3167fdfa..ecae23ec8 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -515,6 +515,15 @@ exports.htmlEncode = function(s) { } }; +// Converts like htmlEncode, but forgets the double quote for brevity +exports.htmlTextEncode = function(s) { + if(s) { + return s.toString().replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">"); + } else { + return ""; + } +}; + // Converts all HTML entities to their character equivalents exports.entityDecode = function(s) { var converter = String.fromCodePoint || String.fromCharCode, diff --git a/core/modules/widgets/view.js b/core/modules/widgets/view.js index 30da34147..fed369771 100755 --- a/core/modules/widgets/view.js +++ b/core/modules/widgets/view.js @@ -65,6 +65,9 @@ ViewWidget.prototype.execute = function() { case "htmlencoded": this.text = this.getValueAsHtmlEncoded(); break; + case "htmltextencoded": + this.text = this.getValueAsHtmlTextEncoded(); + break; case "urlencoded": this.text = this.getValueAsUrlEncoded(); break; @@ -160,6 +163,10 @@ ViewWidget.prototype.getValueAsHtmlEncoded = function() { return $tw.utils.htmlEncode(this.getValueAsText()); }; +ViewWidget.prototype.getValueAsHtmlTextEncoded = function() { + return $tw.utils.htmlTextEncode(this.getValueAsText()); +}; + ViewWidget.prototype.getValueAsUrlEncoded = function() { return encodeURIComponent(this.getValueAsText()); }; diff --git a/core/templates/html-div-tiddler.tid b/core/templates/html-div-tiddler.tid index 6e3001cf5..640fe766b 100644 --- a/core/templates/html-div-tiddler.tid +++ b/core/templates/html-div-tiddler.tid @@ -5,5 +5,5 @@ title: $:/core/templates/html-div-tiddler This template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields. -->`<div`<$fields template=' $name$="$encoded_value$"'></$fields>`> -<pre>`<$view field="text" format="htmlencoded" />`</pre> +<pre>`<$view field="text" format="htmltextencoded" />`</pre> </div>` diff --git a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid index 3efdb98cb..c8910261e 100644 --- a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid @@ -29,6 +29,7 @@ The following formats can be specified in the `format` attribute: |!Format |!Description | |''text'' |Plain text (default) | |''htmlencoded'' |The field is displayed with HTML encoding | +|''htmltextencoded'' |The field is displayed with HTML encoding, only double quotes (") are not escaped. This creates a more compact htmlencoding appropriate for html text content, but //not// for attributes. | |''urlencoded'' |The field is displayed with URL encoding | |''doubleurlencoded'' |The field is displayed with double URL encoding | |''htmlwikified'' |The field is wikified according to the mode attribute and the resulting HTML returned as plain text (ie HTML elements will appear in plain text) | diff --git a/plugins/tiddlywiki/tiddlyweb/html-div-tiddler.tid b/plugins/tiddlywiki/tiddlyweb/html-div-tiddler.tid index 95e2a21b2..ff27343fc 100644 --- a/plugins/tiddlywiki/tiddlyweb/html-div-tiddler.tid +++ b/plugins/tiddlywiki/tiddlyweb/html-div-tiddler.tid @@ -5,5 +5,5 @@ title: $:/core/templates/html-div-tiddler This template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields. This version includes the tiddler changecount as the field `revision`. -->`<div`<$fields exclude='text revision bag' template=' $name$="$encoded_value$"'></$fields>` revision="`<<changecount>>`" bag="default"> -<pre>`<$view field="text" format="htmlencoded" />`</pre> +<pre>`<$view field="text" format="htmltextencoded" />`</pre> </div>` From 54d3782167cd6a029354aed1c6220bb1cb000420 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 2 Apr 2021 09:34:27 +0100 Subject: [PATCH 1275/2376] Add version banner for docs for #5383 --- editions/tw5.com/tiddlers/widgets/ViewWidget.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid index c8910261e..fe6f48cc1 100644 --- a/editions/tw5.com/tiddlers/widgets/ViewWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ViewWidget.tid @@ -1,6 +1,6 @@ caption: view created: 20131024141900000 -modified: 20180730201626985 +modified: 20210402093330113 tags: Widgets title: ViewWidget type: text/vnd.tiddlywiki @@ -29,7 +29,7 @@ The following formats can be specified in the `format` attribute: |!Format |!Description | |''text'' |Plain text (default) | |''htmlencoded'' |The field is displayed with HTML encoding | -|''htmltextencoded'' |The field is displayed with HTML encoding, only double quotes (") are not escaped. This creates a more compact htmlencoding appropriate for html text content, but //not// for attributes. | +|''htmltextencoded'' |<<.from-version "5.1.24">> The field is displayed with HTML encoding, only double quotes (") are not escaped. This creates a more compact htmlencoding appropriate for html text content, but //not// for attributes. | |''urlencoded'' |The field is displayed with URL encoding | |''doubleurlencoded'' |The field is displayed with double URL encoding | |''htmlwikified'' |The field is wikified according to the mode attribute and the resulting HTML returned as plain text (ie HTML elements will appear in plain text) | From 28521d82f3df5cc7dd7a3aaecb95dd8cece9c500 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 2 Apr 2021 09:47:38 +0100 Subject: [PATCH 1276/2376] Revert "Extend transclude widget to optionally set variables" Actually a partial reversion, because we're keeping the minor refactoring of makeChildWidget() in widget.js This reverts commit 80ee5adb148d7220474096a0e80da05148ca7323. --- core/modules/widgets/transclude.js | 13 ++----------- .../tw5.com/tiddlers/widgets/TranscludeWidget.tid | 3 +-- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index e2f2e78dc..1af7f9c42 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -75,17 +75,8 @@ TranscludeWidget.prototype.execute = function() { ]}]; } } - // Assign any variables set via attributes starting with $ - var variables = Object.create(null); - $tw.utils.each(this.attributes,function(attribute,name) { - if(name.charAt(0) === "$") { - variables[name.substr(1)] = attribute; - } - }); // Construct the child widgets - this.makeChildWidgets(parseTreeNodes,{ - variables: variables - }); + this.makeChildWidgets(parseTreeNodes); }; /* @@ -112,7 +103,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ TranscludeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if($tw.utils.count(changedAttributes) || changedTiddlers[this.transcludeTitle]) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) { this.refreshSelf(); return true; } else { diff --git a/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid b/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid index c28e44432..0501d7091 100644 --- a/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/TranscludeWidget.tid @@ -1,5 +1,5 @@ created: 20130824142500000 -modified: 20210319150601867 +modified: 20140717175900970 tags: Widgets title: TranscludeWidget type: text/vnd.tiddlywiki @@ -17,7 +17,6 @@ The TranscludeWidget dynamically imports content from another tiddler. |index |The index of a property in a [[DataTiddler|DataTiddlers]] | |subtiddler |Optional SubTiddler title when the target tiddler is a [[plugin|Plugins]] (see below) | |mode |Override the default parsing mode for the transcluded text to "block" or "inline" | -|//(attributes starting with $)// |<<.from-version "5.1.24">> The $ is removed from each attribute name to specify a variable name that is assigned the specified value for the scope of the transclusion | The TranscludeWidget treats any contained content as a fallback if the target of the transclusion is not defined (ie a missing tiddler or a missing field). From c976aad5e000332bb21d3c2a05f52e769f21ccb0 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 2 Apr 2021 13:15:39 +0100 Subject: [PATCH 1277/2376] Update the contributing guidelines Following the discussion in #5484 --- .../tiddlers/community/Contributing.tid | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/Contributing.tid b/editions/tw5.com/tiddlers/community/Contributing.tid index e481866fc..72837636c 100644 --- a/editions/tw5.com/tiddlers/community/Contributing.tid +++ b/editions/tw5.com/tiddlers/community/Contributing.tid @@ -1,17 +1,29 @@ created: 20131101111400000 -modified: 20190115165616599 +modified: 20210402095728684 tags: Community title: Contributing type: text/vnd.tiddlywiki -We welcome contributions to the code and documentation of TiddlyWiki in several ways: +Here we focus on contributions via GitHub Pull Requests but there are many other ways that anyone can help the TiddlyWiki project, such as [[reporting bugs|ReportingBugs]] or helping to [[improve our documentation|Improving TiddlyWiki Documentation]]. + +! Rules for Pull Requests + +PRs must meet these minimum requirements before they can be considered for merging: + +* The material in the PR must be free of licensing restrictions. Which means that either: +** The author must hold the copyright in all of the material themselves +** The material must be licensed under a license compatible with TiddlyWiki's BSD license +* The author must sign the Contributors License Agreement (see below) +* Each PR should only make a single feature change +* PRs must be self-contained. Although they can link to material elsewhere, everything needed to understand the intention of the PR should be included +* Adequate narrative to explain the motivation and implementation of the change +* Documentation as appropriate for end-users or developers +* Observe the coding style +* Read the developers documentation + +Finally, please open a consultation issue prior to investing time in making a large PR. -* ReportingBugs -* Helping to [[improve our documentation|Improving TiddlyWiki Documentation]] -* Contributing to the code via [[GitHub|https://github.com/Jermolene/TiddlyWiki5]] -** See https://tiddlywiki.com/dev for more details -There are other ways to [[help TiddlyWiki|HelpingTiddlyWiki]] too. ! Contributor License Agreement @@ -24,9 +36,3 @@ There are other ways to [[help TiddlyWiki|HelpingTiddlyWiki]] too. --- //The CLA documents used for this project were created using [[Harmony Project Templates|http://www.harmonyagreements.org]]. "HA-CLA-I-LIST Version 1.0" for "CLA-individual" and "HA-CLA-E-LIST Version 1.0" for "CLA-entity".// - -!! Remarks - -''If you do not own the copyright in the entire work of authorship'': - -In this case, please clearly state so and provide links and any additional information that clarify under which license the rest of the code is distributed. From 013218b85240202ee6b37755753b11d4ff76c5b2 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 2 Apr 2021 14:39:29 +0100 Subject: [PATCH 1278/2376] Further updates to contributing guidelines --- .../tiddlers/community/Contributing.tid | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/Contributing.tid b/editions/tw5.com/tiddlers/community/Contributing.tid index 72837636c..5cc3777fa 100644 --- a/editions/tw5.com/tiddlers/community/Contributing.tid +++ b/editions/tw5.com/tiddlers/community/Contributing.tid @@ -15,15 +15,31 @@ PRs must meet these minimum requirements before they can be considered for mergi ** The material must be licensed under a license compatible with TiddlyWiki's BSD license * The author must sign the Contributors License Agreement (see below) * Each PR should only make a single feature change +* The title of the PR should be 50 characters or less +* The title of the PR should be capitalised, and should not end with a period +* The title of the PR should be written in the imperative mood. See below +* Adequate explanation in the body of the PR for the motivation and implementation of the change. Focus on the //why// and //what//, rather than the //how// * PRs must be self-contained. Although they can link to material elsewhere, everything needed to understand the intention of the PR should be included -* Adequate narrative to explain the motivation and implementation of the change * Documentation as appropriate for end-users or developers * Observe the coding style * Read the developers documentation +* Please open a consultation issue prior to investing time in making a large PR -Finally, please open a consultation issue prior to investing time in making a large PR. +The "imperative mood" means written as if giving a command or instruction. See [[this excellent post|https://chris.beams.io/posts/git-commit/#imperative]] for more details, but the gist is that the title of the PR should make sense when used to complete the sentence "If applied, this commit will...". So for example, these are good PR titles: +* If applied, this commit will //update the contributing guidelines// +* If applied, this commit will //change css-escape-polyfill to a $tw.utils method// +* If applied, this commit will //make it easier to subclass the wikitext parser with a custom rule set// +These a poorly worded PR titles: + +* ~~If applied, this commit will //edit text widgets should use default text for missing fields//~~ +* ~~If applied, this commit will //signing the CLA//~~ +* ~~If applied, this commit will //don't crash if options.event is missing//~~ + +PR titles may also include a short prefix to indicate the subsystem to which they apply. For example: + +* //Menu plugin: Include menu text in aerial rotator// ! Contributor License Agreement From a8fe653e3cf7e44f7f18a4eb299c75f29ff36371 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 2 Apr 2021 14:45:17 +0100 Subject: [PATCH 1279/2376] Update contributing guidelines --- .../tw5.com/tiddlers/community/Contributing.tid | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/community/Contributing.tid b/editions/tw5.com/tiddlers/community/Contributing.tid index 5cc3777fa..05da11caa 100644 --- a/editions/tw5.com/tiddlers/community/Contributing.tid +++ b/editions/tw5.com/tiddlers/community/Contributing.tid @@ -25,7 +25,9 @@ PRs must meet these minimum requirements before they can be considered for mergi * Read the developers documentation * Please open a consultation issue prior to investing time in making a large PR -The "imperative mood" means written as if giving a command or instruction. See [[this excellent post|https://chris.beams.io/posts/git-commit/#imperative]] for more details, but the gist is that the title of the PR should make sense when used to complete the sentence "If applied, this commit will...". So for example, these are good PR titles: +!! Imperative Mood for PR Titles + +The "imperative mood" means written as if giving a command or instruction. See [[this post|https://chris.beams.io/posts/git-commit/#imperative]] for more details, but the gist is that the title of the PR should make sense when used to complete the sentence "If applied, this commit will...". So for example, these are good PR titles: * If applied, this commit will //update the contributing guidelines// * If applied, this commit will //change css-escape-polyfill to a $tw.utils method// @@ -41,6 +43,18 @@ PR titles may also include a short prefix to indicate the subsystem to which the * //Menu plugin: Include menu text in aerial rotator// +! Commenting on Pull Requests + +One of the principles of open source is that many pairs of eyes on the code can improve quality. So, we welcome comments and critiques of pending PRs. [[Conventional Comments|https://conventionalcomments.org]] has some techcniques to help make comments as constructive and actionable as possible. Notably, they recommend prefixing a comment with a label to clarify the intention: + +|praise |Praises highlight something positive. Try to leave at least one of these comments per review. Do not leave false praise (which can actually be damaging). Do look for something to sincerely praise | +|nitpick |Nitpicks are small, trivial, but necessary changes. Distinguishing nitpick comments significantly helps direct the reader's attention to comments requiring more involvement | +|suggestion |Suggestions are specific requests to improve the subject under review. It is assumed that we all want to do what's best, so these comments are never dismissed as “mere suggestions”, but are taken seriously | +|issue |Issues represent user-facing problems. If possible, it's great to follow this kind of comment with a suggestion | +|question |Questions are appropriate if you have a potential concern but are not quite sure if it's relevant or not. Asking the author for clarification or investigation can lead to a quick resolution | +|thought |Thoughts represent an idea that popped up from reviewing. These comments are non-blocking by nature, but they are extremely valuable and can lead to more focused initiatives and mentoring opportunities | +|chore |Chores are simple tasks that must be done before the subject can be “officially” accepted. Usually, these comments reference some common process. Try to leave a link to the process description so that the reader knows how to resolve the chore | + ! Contributor License Agreement {{Contributor License Agreement}} From 55735d7552b95135409946c4d68c8fc24bdd15e4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 4 Apr 2021 11:25:39 +0100 Subject: [PATCH 1280/2376] BibTeX plugin: Report errors more sanely Fixes #5581 --- plugins/tiddlywiki/bibtex/deserializer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/bibtex/deserializer.js b/plugins/tiddlywiki/bibtex/deserializer.js index 2259cb78d..60f314aa4 100644 --- a/plugins/tiddlywiki/bibtex/deserializer.js +++ b/plugins/tiddlywiki/bibtex/deserializer.js @@ -28,7 +28,8 @@ exports["application/x-bibtex"] = function(text,fields) { } if(typeof data === "string") { return [{ - title: "BibTeX import error: " + data, + title: "BibTeX import error", + text: data }]; } // Convert each entry From dce425ecb82b8e98641b8d2ab31ba8d3321b2fc8 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 4 Apr 2021 11:48:24 +0100 Subject: [PATCH 1281/2376] Update release note Apologies for the delay --- .../prerelease/tiddlers/Release 5.1.24.tid | 109 ++++++++++++++++-- .../tiddlers/releasenotes/Release 5.1.23.tid | 4 - .../tw5.com/tiddlers/system/doc-styles.tid | 6 - 3 files changed, 102 insertions(+), 17 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index c03440848..b9b7be658 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -11,16 +11,111 @@ type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.23...master]]// -<div class="doc-plain-list"> +! Performance Improvements -! Improvements +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5380">> (and again [[here|https://github.com/Jermolene/TiddlyWiki5/pull/5488]]) the efficiency of the linked list implementation +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5362">> [[all Operator]] to use new linked list implementation +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5369">> [[links Operator]] to use new linked list implementation +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5383">> unneeded escaping of double quotes in tiddler DIVs inside single file wikis (saving about 10% from the size of empty.html) -* +! Usability Improvements -! Contributors +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/a360adbba924d222c5b55709133c18890c04398d">> dropzone size when story river is empty +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5326">> fill colour for "remove tag" button +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5370">> page title so that the separating em-dash is only used if the site subtitle is present +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5397">> broken aria-label in $:/PaletteManager +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5451">> macro calls to use the same parser as that used for widget attributes + +! Hackability Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/9eda02868f21e9dd1733ffe26352bd7ac96285b4">> new MessageCatcherWidget +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/d25e540dd2f0decf61c52fdc665a28a5dfeda93f">> support for `image/vnd.microsoft.icon` content type + +! Client-server Improvements + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/e96a54c7531a2d9e07745e27d2015d8d7d09588f">> crash running in client server configuration when 'etag' header is missing +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5423">> blank favicon when using lazily loaded images +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/4461">> web server issue with custom path prefix and basic authentication +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/5366">> crash on Node.js with ActionSetFieldWidget when type field is given a value upon new tiddler creation +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5329">> issue with tiddler titles that already end in the required extension +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5465">> several consistency issues with the filesystem plugin +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/5483">> issue with encoding of $:/config/OriginalTiddlerPaths outside the wiki folder + +! Plugin Improvements + +!! [[XLSX Utilities Plugin]] + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/5400">> crash with the XLSX Utils plugin + +!! [[KaTeX Plugin]] + +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/f2aba29d94cddcff6d7c188c4aa0b668995d8002">> to KaTeX v0.12.0 + +!! [[Freelinks Plugin]] + +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/0ed32fded996826a59832d7a7555bb16c4a57864">> the Freelinks plugin with a filter to determine which tiddlers can be the targets of freelinks + +!! [[Menubar Plugin]] + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/discussions/5533">> Menu plugin to support optional ''dropdown-position'' field + +!! [[BibTeX Plugin]] + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/5581">> BibTeX Plugin to report errors more sensibly + +! Developer Experience Improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5279">> support for [[server sent events|https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events]] +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5382">> the widget subclassing mechanism to work with widgets that add event listeners in their constructor +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5377">> the Jasmine test suite output +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/9f9ce6595b08032a602981f82940ca113cff8211">> wikitext parser with a subclassing mechanism +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/ef76349c37662e9706acfffc2c2edb51a920183d">> added support for ''utils-browser'' modules + +! Other Bug Fixes + +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5376">> issue with [[lookup Operator]] returning "undefined" under some circumstances +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/5396">> crash with unterminated wikitext comments +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5453">> tiddler info area content bleeding on close animation +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5452">> inline/block widget parsing glitch +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5401">> runaway regexp when parsing filters +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5440">> right margin of tag pill when used outside of the tags wrapper +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5455">> upload saver to optionally work without a username or password +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/5e4430dbf9ff66d9a18fbdf3005abcd716efc07d">> RadioWidget to refresh selectively, and to use the ''checked'' attirubte correctly +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5542">> "invert" option of `wiki.search()` method +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/e157d16b724172f752da0ff714847e0c0ca9664d">> ''data-tag-title'' attribute to tag pills +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/7b1a0c6e6a8bd2d3badf8766af0cd3f5f7ac5ec8">> ES5 compatibility issue +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/a38dc1730010c6a2b6a011aff4818bbc67c04055">> RenderCommand to allow multiple variables to be passed +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/226df2ad7d2978d3d7400d94767a0503e495cf98">> exporting of tiddlers that begin and end with double quotes +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/commit/d56e8764a1f02a214df5da1cc95191be2da2491b">> accessibility of button widget when controlling a popup +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/d6ea369f5ef9d3092a360a4286a99902df37782b">> EditTextWidget to use default text for missing fields +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5552">> css-escape-polyfill to work under Node.js [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: -* <<contributor Jermolene>> - -</div> +* <<contributor Arlen22 +* <<contributor BlueGreenMagick>> +* <<contributor BramChen>> +* <<contributor BurningTreeC>> +* <<contributor cdruan>> +* <<contributor clutterstack>> +* <<contributor CodaCodr>> +* <<contributor dixonge>> +* <<contributor donmor>> +* <<contributor FlashSystems>> +* <<contributor flibbles>> +* <<contributor hoelzro>> +* <<contributor jeremyredhead>> +* <<contributor joebordes>> +* <<contributor joshuafontany>> +* <<contributor kookma>> +* <<contributor laomaiweng>> +* <<contributor leehawk787>> +* <<contributor morosanuae>> +* <<contributor neumark>> +* <<contributor NicolasPetton>> +* <<contributor OdinJorna>> +* <<contributor pmario>> +* <<contributor saqimtias>> +* <<contributor simonbaird>> +* <<contributor slaymaker1907>> +* <<contributor twMat>> diff --git a/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid index fe51734bb..e7edb63f4 100644 --- a/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid +++ b/editions/tw5.com/tiddlers/releasenotes/Release 5.1.23.tid @@ -12,8 +12,6 @@ type: text/vnd.tiddlywiki //[[See GitHub for detailed change history of this release|https://github.com/Jermolene/TiddlyWiki5/compare/v5.1.22...v5.1.23]]// -<div class="doc-plain-list"> - ! Performance Improvements * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5206">> filter execution to use a more efficient linked list structure for intermediate results @@ -293,5 +291,3 @@ Please note that using this plugin does not guarantee compliance with any partic * <<contributor saqimtiaz>> * <<contributor twMat>> * <<contributor xcazin>> - -</div> diff --git a/editions/tw5.com/tiddlers/system/doc-styles.tid b/editions/tw5.com/tiddlers/system/doc-styles.tid index 469e27d05..2e33a266c 100644 --- a/editions/tw5.com/tiddlers/system/doc-styles.tid +++ b/editions/tw5.com/tiddlers/system/doc-styles.tid @@ -217,9 +217,3 @@ tr.doc-table-subheading { .doc-link-badge:hover { text-decoration: underline; } - -.doc-plain-list ul, -.doc-plain-list ol { - list-style: none; - padding-left: 0; -} From fdf89f83c2d1696d7225030d89106be7e58b371e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 5 Apr 2021 10:11:03 +0100 Subject: [PATCH 1282/2376] Fix typo in v5.1.24 release note --- editions/prerelease/tiddlers/Release 5.1.24.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index b9b7be658..24c911f12 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -80,7 +80,7 @@ type: text/vnd.tiddlywiki * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5401">> runaway regexp when parsing filters * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5440">> right margin of tag pill when used outside of the tags wrapper * <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5455">> upload saver to optionally work without a username or password -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/5e4430dbf9ff66d9a18fbdf3005abcd716efc07d">> RadioWidget to refresh selectively, and to use the ''checked'' attirubte correctly +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/5e4430dbf9ff66d9a18fbdf3005abcd716efc07d">> RadioWidget to refresh selectively, and to use the ''checked'' attribute correctly * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5542">> "invert" option of `wiki.search()` method * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/e157d16b724172f752da0ff714847e0c0ca9664d">> ''data-tag-title'' attribute to tag pills * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/7b1a0c6e6a8bd2d3badf8766af0cd3f5f7ac5ec8">> ES5 compatibility issue From e2d35751e2de14c4b728f4e6d71328ce1a94f01f Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 5 Apr 2021 10:11:29 +0100 Subject: [PATCH 1283/2376] Rebuild readme.md and contributing.md --- contributing.md | 2 +- license | 2 +- readme.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contributing.md b/contributing.md index cb328b582..d815a5b65 100644 --- a/contributing.md +++ b/contributing.md @@ -1,3 +1,3 @@ -<h1 class="">Contributing to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a></h1><p>We welcome contributions to the code and documentation of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> in several ways:</p><ul><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ReportingBugs.html">ReportingBugs</a></li><li>Helping to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Improving%2520TiddlyWiki%2520Documentation.html">improve our documentation</a></li><li>Contributing to the code via <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">GitHub</a><ul><li>See <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev</a> for more details</li></ul></li></ul><p>There are other ways to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/HelpingTiddlyWiki.html">help TiddlyWiki</a> too.</p><h1 class="">Contributor License Agreement</h1><p>Like other <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/OpenSource.html">OpenSource</a> projects, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> needs a signed contributor license agreement from individual contributors. This is a legal agreement that allows contributors to assert that they own the copyright of their contribution, and that they agree to license it to the <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/UnaMesa.html">UnaMesa</a> Association (the legal entity that owns <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on behalf of the community).</p><ul><li>For individuals use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a></li><li>For entities use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a></li></ul><h1 class="">How to sign the CLA</h1><p>Create a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/GitHub.html">GitHub</a> pull request to add your name to <code>cla-individual.md</code> or <code>cla-entity.md</code>, with the date in the format (YYYY/MM/DD).</p><p><strong>step by step</strong></p><ol><li>Navigate to <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a> or <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a> according to whether you are signing as an individual or representative of an organisation</li><li>Ensure that the "branch" dropdown at the top left is set to <code>tiddlywiki-com</code></li><li>Click the "edit" button at the top-right corner (clicking this button will fork the project so you can edit the file)</li><li>Add your name at the bottom<ul><li>eg: <code>Jeremy Ruston, @Jermolene, 2011/11/22</code></li></ul></li><li>Below the edit box for the CLA text you should see a box labelled <strong>Propose file change</strong></li><li>Enter a brief title to explain the change (eg, "Signing the CLA")</li><li>Click the green button labelled <strong>Propose file change</strong></li><li>On the following screen, click the green button labelled <strong>Create pull request</strong></li></ol><hr><p><em>The CLA documents used for this project were created using <a class="tc-tiddlylink-external" href="http://www.harmonyagreements.org" rel="noopener noreferrer" target="_blank">Harmony Project Templates</a>. "HA-CLA-I-LIST Version 1.0" for "CLA-individual" and "HA-CLA-E-LIST Version 1.0" for "CLA-entity".</em></p><h2 class="">Remarks</h2><p><strong>If you do not own the copyright in the entire work of authorship</strong>:</p><p>In this case, please clearly state so and provide links and any additional information that clarify under which license the rest of the code is distributed. +<h1 class="">Contributing to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a></h1><p>Here we focus on contributions via <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/GitHub.html">GitHub</a> Pull Requests but there are many other ways that anyone can help the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> project, such as <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ReportingBugs.html">reporting bugs</a> or helping to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Improving%2520TiddlyWiki%2520Documentation.html">improve our documentation</a>.</p><h1 class="">Rules for Pull Requests</h1><p>PRs must meet these minimum requirements before they can be considered for merging:</p><ul><li>The material in the PR must be free of licensing restrictions. Which means that either:<ul><li>The author must hold the copyright in all of the material themselves</li><li>The material must be licensed under a license compatible with <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>'s BSD license</li></ul></li><li>The author must sign the Contributors License Agreement (see below)</li><li>Each PR should only make a single feature change</li><li>The title of the PR should be 50 characters or less</li><li>The title of the PR should be capitalised, and should not end with a period</li><li>The title of the PR should be written in the imperative mood. See below</li><li>Adequate explanation in the body of the PR for the motivation and implementation of the change. Focus on the <em>why</em> and <em>what</em>, rather than the <em>how</em></li><li>PRs must be self-contained. Although they can link to material elsewhere, everything needed to understand the intention of the PR should be included</li><li>Documentation as appropriate for end-users or developers</li><li>Observe the coding style</li><li>Read the developers documentation</li><li>Please open a consultation issue prior to investing time in making a large PR</li></ul><h2 class="">Imperative Mood for PR Titles</h2><p>The "imperative mood" means written as if giving a command or instruction. See <a class="tc-tiddlylink-external" href="https://chris.beams.io/posts/git-commit/#imperative" rel="noopener noreferrer" target="_blank">this post</a> for more details, but the gist is that the title of the PR should make sense when used to complete the sentence "If applied, this commit will...". So for example, these are good PR titles:</p><ul><li>If applied, this commit will <em>update the contributing guidelines</em></li><li>If applied, this commit will <em>change css-escape-polyfill to a $tw.utils method</em></li><li>If applied, this commit will <em>make it easier to subclass the wikitext parser with a custom rule set</em></li></ul><p>These a poorly worded PR titles:</p><ul><li><strike>If applied, this commit will <em>edit text widgets should use default text for missing fields</em></strike></li><li><strike>If applied, this commit will <em>signing the CLA</em></strike></li><li><strike>If applied, this commit will <em>don't crash if options.event is missing</em></strike></li></ul><p>PR titles may also include a short prefix to indicate the subsystem to which they apply. For example:</p><ul><li><em>Menu plugin: Include menu text in aerial rotator</em></li></ul><h1 class="">Commenting on Pull Requests</h1><p>One of the principles of open source is that many pairs of eyes on the code can improve quality. So, we welcome comments and critiques of pending PRs. <a class="tc-tiddlylink-external" href="https://conventionalcomments.org" rel="noopener noreferrer" target="_blank">Conventional Comments</a> has some techcniques to help make comments as constructive and actionable as possible. Notably, they recommend prefixing a comment with a label to clarify the intention:</p><table><tbody><tr class="evenRow"><td align="left">praise</td><td align="left">Praises highlight something positive. Try to leave at least one of these comments per review. Do not leave false praise (which can actually be damaging). Do look for something to sincerely praise</td></tr><tr class="oddRow"><td align="left">nitpick</td><td align="left">Nitpicks are small, trivial, but necessary changes. Distinguishing nitpick comments significantly helps direct the reader's attention to comments requiring more involvement</td></tr><tr class="evenRow"><td align="left">suggestion</td><td align="left">Suggestions are specific requests to improve the subject under review. It is assumed that we all want to do what's best, so these comments are never dismissed as “mere suggestions”, but are taken seriously</td></tr><tr class="oddRow"><td align="left">issue</td><td align="left">Issues represent user-facing problems. If possible, it's great to follow this kind of comment with a suggestion</td></tr><tr class="evenRow"><td align="left">question</td><td align="left">Questions are appropriate if you have a potential concern but are not quite sure if it's relevant or not. Asking the author for clarification or investigation can lead to a quick resolution</td></tr><tr class="oddRow"><td align="left">thought</td><td align="left">Thoughts represent an idea that popped up from reviewing. These comments are non-blocking by nature, but they are extremely valuable and can lead to more focused initiatives and mentoring opportunities</td></tr><tr class="evenRow"><td align="left">chore</td><td align="left">Chores are simple tasks that must be done before the subject can be “officially” accepted. Usually, these comments reference some common process. Try to leave a link to the process description so that the reader knows how to resolve the chore</td></tr></tbody></table><h1 class="">Contributor License Agreement</h1><p>Like other <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/OpenSource.html">OpenSource</a> projects, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> needs a signed contributor license agreement from individual contributors. This is a legal agreement that allows contributors to assert that they own the copyright of their contribution, and that they agree to license it to the <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/UnaMesa.html">UnaMesa</a> Association (the legal entity that owns <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on behalf of the community).</p><ul><li>For individuals use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a></li><li>For entities use: <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a></li></ul><h1 class="">How to sign the CLA</h1><p>Create a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/GitHub.html">GitHub</a> pull request to add your name to <code>cla-individual.md</code> or <code>cla-entity.md</code>, with the date in the format (YYYY/MM/DD).</p><p><strong>step by step</strong></p><ol><li>Navigate to <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-individual.md" rel="noopener noreferrer" target="_blank">licenses/CLA-individual</a> or <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses/cla-entity.md" rel="noopener noreferrer" target="_blank">licenses/CLA-entity</a> according to whether you are signing as an individual or representative of an organisation</li><li>Ensure that the "branch" dropdown at the top left is set to <code>tiddlywiki-com</code></li><li>Click the "edit" button at the top-right corner (clicking this button will fork the project so you can edit the file)</li><li>Add your name at the bottom<ul><li>eg: <code>Jeremy Ruston, @Jermolene, 2011/11/22</code></li></ul></li><li>Below the edit box for the CLA text you should see a box labelled <strong>Propose file change</strong></li><li>Enter a brief title to explain the change (eg, "Signing the CLA")</li><li>Click the green button labelled <strong>Propose file change</strong></li><li>On the following screen, click the green button labelled <strong>Create pull request</strong></li></ol><hr><p><em>The CLA documents used for this project were created using <a class="tc-tiddlylink-external" href="http://www.harmonyagreements.org" rel="noopener noreferrer" target="_blank">Harmony Project Templates</a>. "HA-CLA-I-LIST Version 1.0" for "CLA-individual" and "HA-CLA-E-LIST Version 1.0" for "CLA-entity".</em> </p><p><em>This file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a></em> </p> \ No newline at end of file diff --git a/license b/license index 25ae1f1a4..8692e0f9f 100644 --- a/license +++ b/license @@ -1,7 +1,7 @@ TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com) Copyright (c) 2004-2007, Jeremy Ruston -Copyright (c) 2007-2020, UnaMesa Association +Copyright (c) 2007-2021, UnaMesa Association All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/readme.md b/readme.md index 81ed51eee..a8d5fdd2d 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,7 @@ <p>Welcome to <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, a non-linear personal web notebook that anyone can use and keep forever, independently of any corporation.</p><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is a complete interactive wiki in <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/JavaScript.html">JavaScript</a>. It can be used as a single HTML file in the browser or as a powerful Node.js application. It is highly customisable: the entire user interface is itself implemented in hackable <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/WikiText.html">WikiText</a>.</p><p>Learn more and see it in action at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/</a></p><p>Developer documentation is in progress at <a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev/" rel="noopener noreferrer" target="_blank">https://tiddlywiki.com/dev/</a></p><h1 class="">Join the Community</h1><p> <h2 class="">Users</h2><p>The TiddlyWiki discussion groups are mailing lists for talking about TiddlyWiki: requests for help, announcements of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.</p><ul><li>The main TiddlyWiki group: <a class="tc-tiddlylink-external" href="https://groups.google.com/group/TiddlyWiki" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/TiddlyWiki</a><blockquote><div>Note that you do not need a Google Account to join the discussion groups. Subscribe by sending an email to <a class="tc-tiddlylink-external" href="mailto:tiddlywiki+subscribe@googlegroups.com" rel="noopener noreferrer" target="_blank">mailto:tiddlywiki+subscribe@googlegroups.com</a>.</div></blockquote><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywiki@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Watch recordings of our regular <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520Hangouts.html">TiddlyWiki Hangouts</a></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>New: Join us on our live chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> !</li><li>There is also a discord available at <a class="tc-tiddlylink-external" href="https://discord.gg/HFFZVQ8" rel="noopener noreferrer" target="_blank">https://discord.gg/HFFZVQ8</a></li></ul><h2 class="">Developers</h2><p>There are several resources for developers to learn more about <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> and to discuss and contribute to its development.</p><ul><li><a class="tc-tiddlylink-external" href="https://tiddlywiki.com/dev" rel="noopener noreferrer" target="_blank">tiddlywiki.com/dev</a> is the official developer documentation</li><li>Get involved in the <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5" rel="noopener noreferrer" target="_blank">development on GitHub</a><ul><li><a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/discussions" rel="noopener noreferrer" target="_blank">Discussions</a> are for Q&A and open-ended discussion</li><li><a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/issues" rel="noopener noreferrer" target="_blank">Issues</a> are for raising bug reports and proposing specific, actionable new ideas</li></ul></li><li>The older TiddlyWikiDev Google Group is now closed in favour of <a class="tc-tiddlylink-external" href="https://github.com/Jermolene/TiddlyWiki5/discussions" rel="noopener noreferrer" target="_blank">GitHub Discussions</a> but remains a useful archive: <a class="tc-tiddlylink-external" href="https://groups.google.com/group/TiddlyWikiDev" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/TiddlyWikiDev</a><ul><li>An enhanced group search facility is available on <a class="tc-tiddlylink-external" href="https://www.mail-archive.com/tiddlywikidev@googlegroups.com/" rel="noopener noreferrer" target="_blank">mail-archive.com</a></li></ul></li><li>Follow <a class="tc-tiddlylink-external" href="http://twitter.com/#!/TiddlyWiki" rel="noopener noreferrer" target="_blank">@TiddlyWiki on Twitter</a> for the latest news</li><li>Chat at <a class="tc-tiddlylink-external" href="https://gitter.im/TiddlyWiki/public" rel="noopener noreferrer" target="_blank">https://gitter.im/TiddlyWiki/public</a> (development room coming soon)</li></ul><p>New releases of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyDesktop.html">TiddlyDesktop</a> and <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyFox.html">TiddlyFox</a> are announced via the discussion groups and <a class="tc-tiddlylink-external" href="https://twitter.com/TiddlyWiki" rel="noopener noreferrer" target="_blank">Twitter</a> (you can also subscribe to an Atom/RSS feed of <a class="tc-tiddlylink-external" href="https://github.com/jermolene/tiddlywiki5/releases.atom" rel="noopener noreferrer" target="_blank">TiddlyWiki releases from GitHub</a>)</p><h2 class="">Documentation</h2><p>There is also a discussion group specifically for discussing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> documentation improvement initiatives: <a class="tc-tiddlylink-external" href="https://groups.google.com/group/tiddlywikidocs" rel="noopener noreferrer" target="_blank">https://groups.google.com/group/tiddlywikidocs</a> </p> -</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><div><code>npm install -g tiddlywiki</code></div><div>If it fails with an error you may need to re-run the command as an administrator:</div><div><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</div></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><div><code>tiddlywiki --version</code></div></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.23"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <span class="doc-icon"><svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z" fill-rule="evenodd"></path></svg></span> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><div>npm install -g tiddlywiki@5.1.13</div></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.20</span> First, there can be zero or more plugin references identified by the prefix <code>+</code> for plugin names or <code>++</code> for a path to a plugin folder. These plugins are loaded in addition to any specified in the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a>.</p><p>The next argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p>For example:</p><pre><code>tiddlywiki --version +</p><h1 class="">Installing <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><ol><li>Install <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Node.js.html">Node.js</a><ul><li>either from your favourite package manager: typically <code>apt-get install nodejs</code> on Debian/Ubuntu Linux or <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Termux for Android</a>, or <code>brew install node</code> on a Mac</li><li>or directly from <a class="tc-tiddlylink-external" href="http://nodejs.org" rel="noopener noreferrer" target="_blank">http://nodejs.org</a></li></ul></li><li>Open a command line terminal and type:<blockquote><div><code>npm install -g tiddlywiki</code></div><div>If it fails with an error you may need to re-run the command as an administrator:</div><div><code>sudo npm install -g tiddlywiki</code> (Mac/Linux)</div></blockquote></li><li>Check <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> is installed by typing:<blockquote><div><code>tiddlywiki --version</code></div></blockquote></li><li>In response, you should see <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> report its current version (eg "5.1.24-prerelease"; you may also see other debugging information reported)</li><li>Try it out:<ol><li><code>tiddlywiki mynewwiki --init server</code> to create a folder for a new wiki that includes server-related components</li><li><code>tiddlywiki mynewwiki --listen</code> to start <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></li><li>Visit <a class="tc-tiddlylink-external" href="http://127.0.0.1:8080/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8080/</a> in your browser</li><li>Try editing and creating tiddlers</li></ol></li><li>Optionally, make an offline copy:<ul><li>click the <span class="doc-icon"><svg class="tc-image-save-button tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z" fill-rule="evenodd"></path></svg></span> <strong>save changes</strong> button in the sidebar, <strong>OR</strong></li><li><code>tiddlywiki mynewwiki --build index</code></li></ul></li></ol><p>The <code>-g</code> flag causes <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> to be installed globally. Without it, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> will only be available in the directory where you installed it.</p><p>If you are using Debian or Debian-based Linux and you are receiving a <code>node: command not found</code> error though node.js package is installed, you may need to create a symbolic link between <code>nodejs</code> and <code>node</code>. Consult your distro's manual and <code>whereis</code> to correctly create a link. See github <a class="tc-tiddlylink-external" href="http://github.com/Jermolene/TiddlyWiki5/issues/1434" rel="noopener noreferrer" target="_blank">issue 1434</a></p><p>Example Debian v8.0: <code>sudo ln -s /usr/bin/nodejs /usr/bin/node</code></p><p>You can also install prior versions like this:</p><blockquote><div>npm install -g tiddlywiki@5.1.13</div></blockquote><h1 class="">Using <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki5.html">TiddlyWiki5</a> includes a set of <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for use on the command line to perform an extensive set of operations based on <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a>, <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a> and <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://tiddlywiki.com/static/TiddlyWikiFiles.html">TiddlyWikiFiles</a>.</p><p>For example, the following command loads the tiddlers from a <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> HTML file and then saves one of them in static HTML:</p><pre><code>tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html</code></pre><p>Running <code>tiddlywiki</code> from the command line boots the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.</p><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.20</span> First, there can be zero or more plugin references identified by the prefix <code>+</code> for plugin names or <code>++</code> for a path to a plugin folder. These plugins are loaded in addition to any specified in the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a>.</p><p>The next argument is the optional path to the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolder</a> to be loaded. If not present, then the current directory is used.</p><p>The commands and their individual arguments follow, each command being identified by the prefix <code>--</code>.</p><pre><code>tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]</code></pre><p>For example:</p><pre><code>tiddlywiki --version tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen tiddlywiki ++./mygreatplugin mywiki --listen</code></pre><p><span class="doc-from-version"><svg class="tc-image-warning tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt"><path d="M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z" fill-rule="evenodd"></path></svg> New in: 5.1.18</span> Commands such as the <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/ListenCommand.html">ListenCommand</a> that support large numbers of parameters can use <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/NamedCommandParameters.html">NamedCommandParameters</a> to make things less unwieldy. For example:</p><pre><code>tiddlywiki wikipath --listen username=jeremy port=8090</code></pre><p>See <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Commands.html">Commands</a> for a full listing of the available commands. </p><h1 class="">Upgrading <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a> on Node.js</h1><p>If you've installed <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki%2520on%2520Node.js.html">TiddlyWiki on Node.js</a> on the usual way, when a new version is released you can upgrade it with this command:</p><pre><code>npm update -g tiddlywiki</code></pre><p>On Mac or Linux you'll need to add <strong>sudo</strong> like this:</p><pre><code>sudo npm update -g tiddlywiki</code></pre><h1 class="">Also see</h1><p><ul class=""><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWikiFolders.html">TiddlyWikiFolders</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFileSyntax.html">MultiTiddlerFileSyntax</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/MultiTiddlerFiles.html">MultiTiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlerFiles.html">TiddlerFiles</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Generating%2520Static%2520Sites%2520with%2520TiddlyWiki.html">Generating Static Sites with TiddlyWiki</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/How%2520to%2520build%2520a%2520TiddlyWiki5%2520from%2520individual%2520tiddlers.html">How to build a TiddlyWiki5 from individual tiddlers</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520TiddlyWiki%2520for%2520GitHub%2520project%2520documentation.html">Using TiddlyWiki for GitHub project documentation</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Using%2520a%2520custom%2520path%2520prefix%2520with%2520the%2520client-server%2520edition.html">Using a custom path prefix with the client-server edition</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Building%2520TiddlyWikiClassic.html">Building TiddlyWikiClassic</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Customising%2520Tiddler%2520File%2520Naming.html">Customising Tiddler File Naming</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Environment%2520Variables%2520on%2520Node.js.html">Environment Variables on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520Prerelease%2520on%2520Node.js.html">Installing TiddlyWiki Prerelease on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520custom%2520plugins%2520on%2520Node.js.html">Installing custom plugins on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Scripts%2520for%2520TiddlyWiki%2520on%2520Node.js.html">Scripts for TiddlyWiki on Node.js</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Serving%2520TW5%2520from%2520Android.html">Node.js on Termux</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Working%2520with%2520the%2520TiddlyWiki5%2520repository.html">Working with the TiddlyWiki5 repository</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520a%2520plugin%2520from%2520the%2520plugin%2520library.html">Installing a plugin from the plugin library</a></li><li><a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/Installing%2520TiddlyWiki%2520on%2520Microsoft%2520Internet%2520Information%2520Server.html">Internet Information Services</a></li></ul></p><p><em>This readme file was automatically generated by <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://tiddlywiki.com/static/TiddlyWiki.html">TiddlyWiki</a></em> From b90aad9cea19a5304e73eb2afa7aa7e6a01215d0 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 6 Apr 2021 13:13:12 +0100 Subject: [PATCH 1284/2376] Fix typo in filtered permalink example Fixes #5588 --- editions/tw5.com/tiddlers/concepts/PermaLinks.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/concepts/PermaLinks.tid b/editions/tw5.com/tiddlers/concepts/PermaLinks.tid index 5127228d6..40c7a1925 100644 --- a/editions/tw5.com/tiddlers/concepts/PermaLinks.tid +++ b/editions/tw5.com/tiddlers/concepts/PermaLinks.tid @@ -1,5 +1,5 @@ created: 20140502213500000 -modified: 20160622111355787 +modified: 20210406131243532 tags: Features Concepts title: PermaLinks type: text/vnd.tiddlywiki @@ -32,7 +32,7 @@ If the target tiddler isn't present in the story list then it is automatically i It is also possible to specify a story filter without specifying a target tiddler for navigation: -<a href="https://tiddlywiki.com/#:[tags[task]]" rel="noopener noreferrer">~https://tiddlywiki.com/#:[tags[task]]</a> +<a href="https://tiddlywiki.com/#:[tag[task]]" rel="noopener noreferrer">~https://tiddlywiki.com/#:[tag[task]]</a> ! About URL encoding From 953fb9f237ad78e409c03d4b29b9854d8abf6cdf Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 7 Apr 2021 17:43:41 +0100 Subject: [PATCH 1285/2376] BibTeX Plugin: Force fieldnames to be lowercase Fixes #5591 --- plugins/tiddlywiki/bibtex/deserializer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tiddlywiki/bibtex/deserializer.js b/plugins/tiddlywiki/bibtex/deserializer.js index 60f314aa4..eb021f3a6 100644 --- a/plugins/tiddlywiki/bibtex/deserializer.js +++ b/plugins/tiddlywiki/bibtex/deserializer.js @@ -39,7 +39,7 @@ exports["application/x-bibtex"] = function(text,fields) { "bibtex-entry-type": entry.entryType }; $tw.utils.each(entry.entryTags,function(value,name) { - fields["bibtex-" + name] = value; + fields["bibtex-" + name.toLowerCase()] = value; }); results.push(fields); }); From b9647b2c48152dac069a1099a0822b32375a66cf Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 8 Apr 2021 16:56:36 +0100 Subject: [PATCH 1286/2376] Ensure Fieldmangler widget doesn't propogate events that it traps Fixes #5593 --- core/modules/widgets/fieldmangler.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/modules/widgets/fieldmangler.js b/core/modules/widgets/fieldmangler.js index a8b18ffa1..fb249cbf2 100644 --- a/core/modules/widgets/fieldmangler.js +++ b/core/modules/widgets/fieldmangler.js @@ -67,7 +67,7 @@ FieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) { deletion = {}; deletion[event.param] = undefined; this.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion)); - return true; + return false; }; FieldManglerWidget.prototype.handleAddFieldEvent = function(event) { @@ -105,7 +105,7 @@ FieldManglerWidget.prototype.handleAddFieldEvent = function(event) { } } this.wiki.addTiddler(new $tw.Tiddler(tiddler,addition)); - return true; + return false; }; FieldManglerWidget.prototype.handleRemoveTagEvent = function(event) { @@ -122,7 +122,7 @@ FieldManglerWidget.prototype.handleRemoveTagEvent = function(event) { this.wiki.addTiddler(new $tw.Tiddler(tiddler,modification)); } } - return true; + return false; }; FieldManglerWidget.prototype.handleAddTagEvent = function(event) { @@ -140,7 +140,7 @@ FieldManglerWidget.prototype.handleAddTagEvent = function(event) { tag.push(event.param.trim()); this.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification)); } - return true; + return false; }; exports.fieldmangler = FieldManglerWidget; From eced60853f8f96d1a3dbb9bc8997ae3899c0254c Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 10 Apr 2021 10:48:50 +0200 Subject: [PATCH 1287/2376] Extend Dropzone widget (#5597) * Extend dropzone widget with optional actions invoked after tm-import-tiddlers message has been sent. Allows triggering an alternative UX for the import * Allow restricting a dropzone to specific mimeTypes via mimeTypes and mimeTypesPrefix attributes * Use a mimeTypesFilter instead of the mimeTypes and mimeTypesPrefix attributes * Updated refresh handling * Syntax cleanup * Replace references to mimeType with content type for consistency with existing documentation. Update documentation for DropZone widget --- core/modules/widgets/dropzone.js | 42 ++++++++++++++++--- .../tiddlers/widgets/DropzoneWidget.tid | 10 +++-- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 08af202bb..82cef63e3 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -12,6 +12,8 @@ Dropzone widget /*global $tw: false */ "use strict"; +var IMPORT_TITLE = "$:/Import"; + var Widget = require("$:/core/modules/widgets/widget.js").widget; var DropZoneWidget = function(parseTreeNode,options) { @@ -110,10 +112,38 @@ DropZoneWidget.prototype.handleDragEndEvent = function(event) { $tw.utils.removeClass(this.domNodes[0],"tc-dragover"); }; +DropZoneWidget.prototype.filterByContentTypes = function(tiddlerFieldsArray) { + var filteredTypes, + filtered = [], + types = []; + $tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) { + types.push(tiddlerFields.type); + }); + filteredTypes = this.wiki.filterTiddlers(this.contentTypesFilter,this,this.wiki.makeTiddlerIterator(types)); + $tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) { + if(filteredTypes.indexOf(tiddlerFields.type) !== -1) { + filtered.push(tiddlerFields); + } + }); + return filtered; +}; + +DropZoneWidget.prototype.readFileCallback = function(tiddlerFieldsArray) { + if(this.contentTypesFilter) { + tiddlerFieldsArray = this.filterByContentTypes(tiddlerFieldsArray); + } + if(tiddlerFieldsArray.length) { + this.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: this.autoOpenOnImport, importTitle: this.importTitle}); + if(this.actions) { + this.invokeActionString(this.actions,this,event,{importTitle: this.importTitle}); + } + } +}; + DropZoneWidget.prototype.handleDropEvent = function(event) { var self = this, readFileCallback = function(tiddlerFieldsArray) { - self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle}); + self.readFileCallback(tiddlerFieldsArray); }; this.leaveDrag(event); // Check for being over a TEXTAREA or INPUT @@ -149,7 +179,7 @@ DropZoneWidget.prototype.handleDropEvent = function(event) { DropZoneWidget.prototype.handlePasteEvent = function(event) { var self = this, readFileCallback = function(tiddlerFieldsArray) { - self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle}); + self.readFileCallback(tiddlerFieldsArray); }; // Let the browser handle it if we're in a textarea or input box if(["TEXTAREA","INPUT"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) { @@ -176,7 +206,7 @@ DropZoneWidget.prototype.handlePasteEvent = function(event) { if($tw.log.IMPORT) { console.log("Importing string '" + str + "', type: '" + type + "'"); } - self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify([tiddlerFields]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle}); + readFileCallback([tiddlerFields]); }); } } @@ -194,7 +224,9 @@ DropZoneWidget.prototype.execute = function() { this.dropzoneDeserializer = this.getAttribute("deserializer"); this.dropzoneEnable = (this.getAttribute("enable") || "yes") === "yes"; this.autoOpenOnImport = this.getAttribute("autoOpenOnImport"); - this.importTitle = this.getAttribute("importTitle"); + this.importTitle = this.getAttribute("importTitle",IMPORT_TITLE); + this.actions = this.getAttribute("actions"); + this.contentTypesFilter = this.getAttribute("contentTypesFilter"); // Make child widgets this.makeChildWidgets(); }; @@ -204,7 +236,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of */ DropZoneWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) { + if($tw.utils.count(changedAttributes) > 0) { this.refreshSelf(); return true; } diff --git a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid index 1794cf98d..6da7561d7 100644 --- a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid @@ -1,6 +1,6 @@ caption: dropzone created: 20131024141900000 -modified: 20200403103224328 +modified: 20210410062410660 tags: Widgets title: DropzoneWidget type: text/vnd.tiddlywiki @@ -16,9 +16,13 @@ It sends a [[WidgetMessage: tm-import-tiddlers]] carrying a JSON representation |!Attribute |!Description | |deserializer |<<.from-version "5.1.15">> Optional name of deserializer to be used (by default the deserializer is derived from the file extension) | |enable |<<.from-version "5.1.22">> Optional value "no" to disable the dropzone functionality (defaults to "yes") | -|class |<<.from-version "5.1.22">> Optional CSS class to be assigned to the dropzone (defaults to "tc-drag-over") | +|class |<<.from-version "5.1.22">> Optional CSS class to be assigned to the DOM node created by the dropzone (defaults to "tc-dropzone") | |autoOpenOnImport |<<.from-version "5.1.23">> Optional value "no" or "yes" that can override tv-auto-open-on-import | -|importTitle|<<.from-version "5.1.23">> optional tiddler title to use for import process instead of ~$:/Import | +|importTitle|<<.from-version "5.1.23">> Optional tiddler title to use for import process instead of ~$:/Import | +|actions|<<.from-version "5.1.24">> Optional actions string to be invoked after the `tm-import-tiddlers` message has been sent. The variable `importTitle` provides the title of the tiddler used for the import process. | +|contentTypesFilter |<<.from-version "5.1.24">> Optional filter that specifies the [[content types|ContentType]] accepted by the dropzone. | + +<<.tip """Use the `prefix` filter operator to easily accept multiple related content types. For example this filter will accept all image content types: `[prefix[image/]]`""">> The list of available deserializers can be inspected by executing `Object.keys($tw.Wiki.tiddlerDeserializerModules).sort().join("\n")` in the browser JavaScript console. From 7f3fed2f50b790579d128f8c2a2aea40d984635d Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 10 Apr 2021 11:23:16 +0200 Subject: [PATCH 1288/2376] Update DropzoneWidget.tid (#5598) --- editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid index 1794cf98d..b55cd2aa0 100644 --- a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid @@ -16,7 +16,7 @@ It sends a [[WidgetMessage: tm-import-tiddlers]] carrying a JSON representation |!Attribute |!Description | |deserializer |<<.from-version "5.1.15">> Optional name of deserializer to be used (by default the deserializer is derived from the file extension) | |enable |<<.from-version "5.1.22">> Optional value "no" to disable the dropzone functionality (defaults to "yes") | -|class |<<.from-version "5.1.22">> Optional CSS class to be assigned to the dropzone (defaults to "tc-drag-over") | +|class |<<.from-version "5.1.22">> Optional CSS class to be assigned to the DOM node created by the dropzone (defaults to "tc-dropzone") | |autoOpenOnImport |<<.from-version "5.1.23">> Optional value "no" or "yes" that can override tv-auto-open-on-import | |importTitle|<<.from-version "5.1.23">> optional tiddler title to use for import process instead of ~$:/Import | From 55173c17a31ec41f70750d7f1df86b93ffdaca29 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 10 Apr 2021 16:42:25 +0100 Subject: [PATCH 1289/2376] Remove obsolete link --- .../Hosting TiddlyWiki5 on GoogleDrive.tid | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid diff --git a/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid b/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid deleted file mode 100644 index 32a889751..000000000 --- a/editions/tw5.com/tiddlers/community/resources/Hosting TiddlyWiki5 on GoogleDrive.tid +++ /dev/null @@ -1,14 +0,0 @@ -created: 20140315085406905 -modified: 20210106151027120 -tags: Tutorials -title: "Hosting TiddlyWiki5 on GoogleDrive" by Tony Ching -type: text/vnd.tiddlywiki -url: https://googledrive.com/host/0B51gSXixfJ2Qb0I4R2M4MWJVMlU - -Tony Ching's quick guide for sharing TiddlyWiki with Google Drive. - -{{!!url}} - -<<< -Anyway your self-contained a non-linear personal web notebook can be hosted on Google Drive, a free cloud service from Google.com. Because TiddlyWiki5 now supports the Stanford Javascript Crypto Library (SJCL), you can encrypt your content from prying eyes (excluding the NSA of course) -<<< From 89546b3357b0696a7047e6915bd6cd137b589de6 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 11 Apr 2021 10:10:16 +0100 Subject: [PATCH 1290/2376] Add a hidden setting to control HTML sandboxing --- core/modules/parsers/htmlparser.js | 6 ++++-- .../Hidden Setting HtmlParserDisableSandbox.tid | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid diff --git a/core/modules/parsers/htmlparser.js b/core/modules/parsers/htmlparser.js index 39b0c21df..206ab9c78 100644 --- a/core/modules/parsers/htmlparser.js +++ b/core/modules/parsers/htmlparser.js @@ -23,10 +23,12 @@ var HtmlParser = function(type,text,options) { type: "element", tag: "iframe", attributes: { - src: {type: "string", value: src}, - sandbox: {type: "string", value: ""} + src: {type: "string", value: src} } }]; + if($tw.wiki.getTiddlerText("$:/config/HtmlParser/DisableSandbox","no") !== "yes") { + this.tree[0].attributes.sandbox = {type: "string", value: $tw.wiki.getTiddlerText("$:/config/HtmlParser/SandboxTokens","")}; + } }; exports["text/html"] = HtmlParser; diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid new file mode 100644 index 000000000..47f19b2cd --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid @@ -0,0 +1,13 @@ +created: 20210411100148461 +modified: 20210411100148461 +tags: [[Hidden Settings]] +title: Hidden Setting: HTML Parser Sandbox +type: text/vnd.tiddlywiki + +<.from-version "5.1.24">> By default, tiddlers with the type `text/html` are displayed in an iframe with the [[sandbox attribute|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox]] set to the empty string. This causes all security restrictions to be applied, disabling many features such as JavaScript, downloads and external file references. This is the safest setting. + +To globally disable the sandbox, set the tiddler $:/config/HtmlParser/DisableSandbox to `yes`. This will mean that the code in the iframe has full access to TiddlyWiki's internals, which means that a malicious HTML page could exfiltrate data from a private wiki. + +To keep the sandbox but control which restrictions are applied, ensure that $:/config/HtmlParser/DisableSandbox is not set to `yes`, and then set $:/config/HtmlParser/SandboxTokens to the desired list of tokens [[from the MDN documentation|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox]]. + +Note that these are global settings. To control the sandboxing on an individual tiddler basis will require a custom `<iframe>` to be used. From ac022ec79f05715f62fd8382ebb6b49cd1c8f960 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 11 Apr 2021 11:28:21 +0100 Subject: [PATCH 1291/2376] Fix typo --- .../hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid index 47f19b2cd..e17e7998c 100644 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting HtmlParserDisableSandbox.tid @@ -4,7 +4,7 @@ tags: [[Hidden Settings]] title: Hidden Setting: HTML Parser Sandbox type: text/vnd.tiddlywiki -<.from-version "5.1.24">> By default, tiddlers with the type `text/html` are displayed in an iframe with the [[sandbox attribute|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox]] set to the empty string. This causes all security restrictions to be applied, disabling many features such as JavaScript, downloads and external file references. This is the safest setting. +<<.from-version "5.1.24">> By default, tiddlers with the type `text/html` are displayed in an iframe with the [[sandbox attribute|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox]] set to the empty string. This causes all security restrictions to be applied, disabling many features such as JavaScript, downloads and external file references. This is the safest setting. To globally disable the sandbox, set the tiddler $:/config/HtmlParser/DisableSandbox to `yes`. This will mean that the code in the iframe has full access to TiddlyWiki's internals, which means that a malicious HTML page could exfiltrate data from a private wiki. From caec6bc3fea9155eb2b0aae64d577c565dd7b088 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 16 Apr 2021 09:20:39 +0100 Subject: [PATCH 1292/2376] Update SVG optimiser script --- bin/optimise-svgs.js | 84 +++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/bin/optimise-svgs.js b/bin/optimise-svgs.js index 28f4f715d..4920ab920 100755 --- a/bin/optimise-svgs.js +++ b/bin/optimise-svgs.js @@ -5,52 +5,52 @@ Optimise the SVGs in ./core/images using SVGO from https://github.com/svg/svgo Install SVGO with the following command in the root of the repo: -npm install svgo +npm install svgo@2.3.0 */ "use strict"; var fs = require("fs"), path = require("path"), - SVGO = require("svgo"), - svgo = new SVGO({ + { optimize } = require("svgo"), + config = { plugins: [ - {cleanupAttrs: true}, - {removeDoctype: true}, - {removeXMLProcInst: true}, - {removeComments: true}, - {removeMetadata: true}, - {removeTitle: true}, - {removeDesc: true}, - {removeUselessDefs: true}, - {removeEditorsNSData: true}, - {removeEmptyAttrs: true}, - {removeHiddenElems: true}, - {removeEmptyText: true}, - {removeEmptyContainers: true}, - {removeViewBox: false}, - {cleanupEnableBackground: true}, - {convertStyleToAttrs: true}, - {convertColors: true}, - {convertPathData: true}, - {convertTransform: true}, - {removeUnknownsAndDefaults: true}, - {removeNonInheritableGroupAttrs: true}, - {removeUselessStrokeAndFill: true}, - {removeUnusedNS: true}, - {cleanupIDs: true}, - {cleanupNumericValues: true}, - {moveElemsAttrsToGroup: true}, - {moveGroupAttrsToElems: true}, - {collapseGroups: true}, - {removeRasterImages: false}, - {mergePaths: true}, - {convertShapeToPath: true}, - {sortAttrs: true}, - {removeDimensions: false}, - {removeAttrs: {attrs: "(stroke|fill)"}} + 'cleanupAttrs', + 'removeDoctype', + 'removeXMLProcInst', + 'removeComments', + 'removeMetadata', + 'removeTitle', + 'removeDesc', + 'removeUselessDefs', + 'removeEditorsNSData', + 'removeEmptyAttrs', + 'removeHiddenElems', + 'removeEmptyText', + 'removeEmptyContainers', + // 'removeViewBox', + 'cleanupEnableBackground', + 'convertStyleToAttrs', + 'convertColors', + 'convertPathData', + 'convertTransform', + 'removeUnknownsAndDefaults', + 'removeNonInheritableGroupAttrs', + 'removeUselessStrokeAndFill', + 'removeUnusedNS', + 'cleanupIDs', + 'cleanupNumericValues', + 'moveElemsAttrsToGroup', + 'moveGroupAttrsToElems', + 'collapseGroups', + // 'removeRasterImages', + 'mergePaths', + 'convertShapeToPath', + 'sortAttrs', + //'removeDimensions', + {name: 'removeAttrs', params: { attrs: '(stroke|fill)' } } ] - }); + }; var basepath = "./core/images/", files = fs.readdirSync(basepath).sort(); @@ -66,12 +66,14 @@ files.forEach(function(filename) { fakeSVG = body.join("\n"); // A hack to make the new-journal-button work fakeSVG = fakeSVG.replace("<<now \"DD\">>","<<now "DD">>"); - svgo.optimize(fakeSVG, {path: filepath}).then(function(result) { + config.path = filepath; + var result = optimize(fakeSVG,config); + if(result) { var newSVG = header.join("\n") + "\n\n" + result.data.replace("<<now "DD">>","<<now \"DD\">>"); fs.writeFileSync(filepath,newSVG); - },function(err) { + } else { console.log("Error " + err + " with " + filename) process.exit(); - }); + }; } }); From a6a2535c3ac511dbdd75446861ac5f6f7be2076b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 16 Apr 2021 09:21:47 +0100 Subject: [PATCH 1293/2376] Add plus/minus icons --- core/images/minus-button.tid | 6 ++++++ core/images/plus-button.tid | 7 +++++++ 2 files changed, 13 insertions(+) create mode 100644 core/images/minus-button.tid create mode 100644 core/images/plus-button.tid diff --git a/core/images/minus-button.tid b/core/images/minus-button.tid new file mode 100644 index 000000000..37ca537f2 --- /dev/null +++ b/core/images/minus-button.tid @@ -0,0 +1,6 @@ +title: $:/core/images/minus-button +tags: $:/tags/Image + +<svg width="22pt" height="22pt" class="tc-image-minus-button tc-image-button" viewBox="0 0 128 128"> + <path d="M64,0 C99.346224,0 128,28.653776 128,64 C128,99.346224 99.346224,128 64,128 C28.653776,128 0,99.346224 0,64 C0,28.653776 28.653776,0 64,0 Z M64.3322905,16 C37.8226225,16 16.3322905,37.490332 16.3322905,64 C16.3322905,90.509668 37.8226225,112 64.3322905,112 C90.8419585,112 112.332291,90.509668 112.332291,64 C112.332291,37.490332 90.8419585,16 64.3322905,16 Z"></path> + <rect x="24" y="56" width="80" height="16" rx="8"></rect></svg> \ No newline at end of file diff --git a/core/images/plus-button.tid b/core/images/plus-button.tid new file mode 100644 index 000000000..b737155fb --- /dev/null +++ b/core/images/plus-button.tid @@ -0,0 +1,7 @@ +title: $:/core/images/plus-button +tags: $:/tags/Image + +<svg width="22pt" height="22pt" class="tc-image-plus-button tc-image-button" viewBox="0 0 128 128"> + <path d="M64,-0.333044483 C99.346224,-0.333044483 128,28.3207315 128,63.6669555 C128,99.0131795 99.346224,127.666956 64,127.666956 C28.653776,127.666956 0,99.0131795 0,63.6669555 C0,28.3207315 28.653776,-0.333044483 64,-0.333044483 Z M64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 Z"></path> + <rect x="24" y="56" width="80" height="16" rx="8"></rect> + <rect x="56" y="24" width="16" height="80" rx="8"></rect></svg> \ No newline at end of file From c325380231a8c592a6e51d4498c1e6c3a241b539 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Fri, 16 Apr 2021 09:25:07 +0100 Subject: [PATCH 1294/2376] Run the SVG optimiser on the new plus/minus icons --- core/images/minus-button.tid | 4 +--- core/images/plus-button.tid | 5 +---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/core/images/minus-button.tid b/core/images/minus-button.tid index 37ca537f2..7132ed3e9 100644 --- a/core/images/minus-button.tid +++ b/core/images/minus-button.tid @@ -1,6 +1,4 @@ title: $:/core/images/minus-button tags: $:/tags/Image -<svg width="22pt" height="22pt" class="tc-image-minus-button tc-image-button" viewBox="0 0 128 128"> - <path d="M64,0 C99.346224,0 128,28.653776 128,64 C128,99.346224 99.346224,128 64,128 C28.653776,128 0,99.346224 0,64 C0,28.653776 28.653776,0 64,0 Z M64.3322905,16 C37.8226225,16 16.3322905,37.490332 16.3322905,64 C16.3322905,90.509668 37.8226225,112 64.3322905,112 C90.8419585,112 112.332291,90.509668 112.332291,64 C112.332291,37.490332 90.8419585,16 64.3322905,16 Z"></path> - <rect x="24" y="56" width="80" height="16" rx="8"></rect></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-minus-button tc-image-button" viewBox="0 0 128 128"><path d="M64 0c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64C0 28.654 28.654 0 64 0zm.332 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z"/><rect width="80" height="16" x="24" y="56" rx="8"/></svg> \ No newline at end of file diff --git a/core/images/plus-button.tid b/core/images/plus-button.tid index b737155fb..b001f3e2f 100644 --- a/core/images/plus-button.tid +++ b/core/images/plus-button.tid @@ -1,7 +1,4 @@ title: $:/core/images/plus-button tags: $:/tags/Image -<svg width="22pt" height="22pt" class="tc-image-plus-button tc-image-button" viewBox="0 0 128 128"> - <path d="M64,-0.333044483 C99.346224,-0.333044483 128,28.3207315 128,63.6669555 C128,99.0131795 99.346224,127.666956 64,127.666956 C28.653776,127.666956 0,99.0131795 0,63.6669555 C0,28.3207315 28.653776,-0.333044483 64,-0.333044483 Z M64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 Z"></path> - <rect x="24" y="56" width="80" height="16" rx="8"></rect> - <rect x="56" y="24" width="16" height="80" rx="8"></rect></svg> \ No newline at end of file +<svg width="22pt" height="22pt" class="tc-image-plus-button tc-image-button" viewBox="0 0 128 128"><path d="M64-.333c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64zM64 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z"/><rect width="80" height="16" x="24" y="56" rx="8"/><rect width="16" height="80" x="56" y="24" rx="8"/></svg> \ No newline at end of file From 7878e77e9687de63293c348ecc1eed45876869ec Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 18 Apr 2021 10:09:49 +0100 Subject: [PATCH 1295/2376] Update docs for PUT and DELETE APIs to mention CSRF requirements --- .../tiddlers/webserver/WebServer API_ Delete Tiddler.tid | 6 +++++- .../tiddlers/webserver/WebServer API_ Put Tiddler.tid | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/webserver/WebServer API_ Delete Tiddler.tid b/editions/tw5.com/tiddlers/webserver/WebServer API_ Delete Tiddler.tid index 962d74902..523012553 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer API_ Delete Tiddler.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer API_ Delete Tiddler.tid @@ -1,5 +1,5 @@ created: 20181002112106875 -modified: 20181002124355314 +modified: 20210418100750769 tags: [[WebServer API]] title: WebServer API: Delete Tiddler type: text/vnd.tiddlywiki @@ -14,6 +14,10 @@ Parameters: * ''title'' - URI encoded title of the tiddler to delete +Headers: + +* ''x-requested-with'' - must be set to `TiddlyWiki` in order for the request to succeed, unless [[WebServer Parameter: csrf-disable]] is set to `yes` + Response: * 204 No Content \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/webserver/WebServer API_ Put Tiddler.tid b/editions/tw5.com/tiddlers/webserver/WebServer API_ Put Tiddler.tid index 8bdedcf3b..d9c774bdb 100644 --- a/editions/tw5.com/tiddlers/webserver/WebServer API_ Put Tiddler.tid +++ b/editions/tw5.com/tiddlers/webserver/WebServer API_ Put Tiddler.tid @@ -1,5 +1,5 @@ created: 20181002131341062 -modified: 20181002131556452 +modified: 20210418100750769 tags: [[WebServer API]] title: WebServer API: Put Tiddler type: text/vnd.tiddlywiki @@ -16,6 +16,10 @@ Parameters: * ''title'' - URI encoded title of the tiddler to save +Headers: + +* ''x-requested-with'' - must be set to `TiddlyWiki` in order for the request to succeed, unless [[WebServer Parameter: csrf-disable]] is set to `yes` + Response: * 204 No Content From 85ba7ac041ef4e17c1ebed3132ca6c08c3dc4602 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 20 Apr 2021 09:15:11 +0100 Subject: [PATCH 1296/2376] Extend list widget with "index" attribute (#5611) * Extend list widget with "index" attribute * Fix refreshing bug * Clarify performance note --- core/modules/widgets/list.js | 71 ++++++++--- editions/test/tiddlers/tests/test-widget.js | 117 ++++++++++++++++++ .../tw5.com/tiddlers/widgets/ListWidget.tid | 35 +++++- 3 files changed, 202 insertions(+), 21 deletions(-) diff --git a/core/modules/widgets/list.js b/core/modules/widgets/list.js index a49bf01ea..426adb307 100755 --- a/core/modules/widgets/list.js +++ b/core/modules/widgets/list.js @@ -61,6 +61,7 @@ ListWidget.prototype.execute = function() { this.template = this.getAttribute("template"); this.editTemplate = this.getAttribute("editTemplate"); this.variableName = this.getAttribute("variable","currentTiddler"); + this.indexName = this.getAttribute("index"); this.storyViewName = this.getAttribute("storyview"); this.historyTitle = this.getAttribute("history"); // Compose the list elements @@ -72,7 +73,7 @@ ListWidget.prototype.execute = function() { members = this.getEmptyMessage(); } else { $tw.utils.each(this.list,function(title,index) { - members.push(self.makeItemTemplate(title)); + members.push(self.makeItemTemplate(title,index)); }); } // Construct the child widgets @@ -105,7 +106,7 @@ ListWidget.prototype.getEmptyMessage = function() { /* Compose the template for a list item */ -ListWidget.prototype.makeItemTemplate = function(title) { +ListWidget.prototype.makeItemTemplate = function(title,index) { // Check if the tiddler is a draft var tiddler = this.wiki.getTiddler(title), isDraft = tiddler && tiddler.hasField("draft.of"), @@ -128,7 +129,14 @@ ListWidget.prototype.makeItemTemplate = function(title) { } } // Return the list item - return {type: "listitem", itemTitle: title, variableName: this.variableName, children: templateTree}; + var parseTreeNode = {type: "listitem", itemTitle: title, variableName: this.variableName, children: templateTree}; + if(this.indexName) { + parseTreeNode.index = index.toString(); + parseTreeNode.indexName = this.indexName; + parseTreeNode.isFirst = index === 0; + parseTreeNode.isLast = index === this.list.length - 1; + } + return parseTreeNode; }; /* @@ -142,7 +150,7 @@ ListWidget.prototype.refresh = function(changedTiddlers) { this.storyview.refreshStart(changedTiddlers,changedAttributes); } // Completely refresh if any of our attributes have changed - if(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) { + if(changedAttributes.filter || changedAttributes.variable || changedAttributes.index || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) { this.refreshSelf(); result = true; } else { @@ -211,23 +219,41 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) { this.removeChildDomNodes(); this.children = []; } - // Cycle through the list, inserting and removing list items as needed - var hasRefreshed = false; - for(var t=0; t<this.list.length; t++) { - var index = this.findListItem(t,this.list[t]); - if(index === undefined) { - // The list item must be inserted - this.insertListItem(t,this.list[t]); - hasRefreshed = true; - } else { - // There are intervening list items that must be removed - for(var n=index-1; n>=t; n--) { - this.removeListItem(n); + // If we are providing an index variable then we must refresh the items, otherwise we can rearrange them + var hasRefreshed = false,t; + if(this.indexName) { + // Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items + for(t=0; t<this.list.length; t++) { + if(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) { + if(this.children[t]) { + this.removeListItem(t); + } + this.insertListItem(t,this.list[t]); hasRefreshed = true; + } else { + // Refresh the item we're reusing + var refreshed = this.children[t].refresh(changedTiddlers); + hasRefreshed = hasRefreshed || refreshed; + } + } + } else { + // Cycle through the list, inserting and removing list items as needed + for(t=0; t<this.list.length; t++) { + var index = this.findListItem(t,this.list[t]); + if(index === undefined) { + // The list item must be inserted + this.insertListItem(t,this.list[t]); + hasRefreshed = true; + } else { + // There are intervening list items that must be removed + for(var n=index-1; n>=t; n--) { + this.removeListItem(n); + hasRefreshed = true; + } + // Refresh the item we're reusing + var refreshed = this.children[t].refresh(changedTiddlers); + hasRefreshed = hasRefreshed || refreshed; } - // Refresh the item we're reusing - var refreshed = this.children[t].refresh(changedTiddlers); - hasRefreshed = hasRefreshed || refreshed; } } // Remove any left over items @@ -257,7 +283,7 @@ Insert a new list item at the specified index */ ListWidget.prototype.insertListItem = function(index,title) { // Create, insert and render the new child widgets - var widget = this.makeChildWidget(this.makeItemTemplate(title)); + var widget = this.makeChildWidget(this.makeItemTemplate(title,index)); widget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work this.children.splice(index,0,widget); var nextSibling = widget.findNextSiblingDomNode(); @@ -311,6 +337,11 @@ Compute the internal state of the widget ListItemWidget.prototype.execute = function() { // Set the current list item title this.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle); + if(this.parseTreeNode.indexName) { + this.setVariable(this.parseTreeNode.indexName,this.parseTreeNode.index); + this.setVariable(this.parseTreeNode.indexName + "-first",this.parseTreeNode.isFirst ? "yes" : "no"); + this.setVariable(this.parseTreeNode.indexName + "-last",this.parseTreeNode.isLast ? "yes" : "no"); + } // Construct the child widgets this.makeChildWidgets(); }; diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index f3d500489..72ef2f9b4 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -350,6 +350,123 @@ describe("Widget module", function() { expect(wrapper.children[0].children[4].sequenceNumber).toBe(5); }); + + it("should deal with the list widget using an index variable", function() { + var wiki = new $tw.Wiki(); + // Add some tiddlers + wiki.addTiddlers([ + {title: "TiddlerOne", text: "Jolly Old World"}, + {title: "TiddlerTwo", text: "Worldly Old Jelly"}, + {title: "TiddlerThree", text: "Golly Gosh"}, + {title: "TiddlerFour", text: "Lemon Squash"} + ]); + // Construct the widget node + var text = "<$list index='index'><$view field='text'/><$text text=<<index>>/><$text text=<<index-first>>/><$text text=<<index-last>>/></$list>"; + var widgetNode = createWidgetNode(parseText(text,wiki),wiki); + // Render the widget node to the DOM + var wrapper = renderWidgetNode(widgetNode); + // Test the rendering + expect(wrapper.innerHTML).toBe("<p>Lemon Squash0yesnoJolly Old World1nonoGolly Gosh2nonoWorldly Old Jelly3noyes</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(2); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(3); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(4); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(5); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(6); + expect(wrapper.children[0].children[5].sequenceNumber).toBe(7); + expect(wrapper.children[0].children[6].sequenceNumber).toBe(8); + expect(wrapper.children[0].children[7].sequenceNumber).toBe(9); + expect(wrapper.children[0].children[8].sequenceNumber).toBe(10); + expect(wrapper.children[0].children[9].sequenceNumber).toBe(11); + expect(wrapper.children[0].children[10].sequenceNumber).toBe(12); + expect(wrapper.children[0].children[11].sequenceNumber).toBe(13); + expect(wrapper.children[0].children[12].sequenceNumber).toBe(14); + expect(wrapper.children[0].children[13].sequenceNumber).toBe(15); + expect(wrapper.children[0].children[14].sequenceNumber).toBe(16); + expect(wrapper.children[0].children[15].sequenceNumber).toBe(17); + // Add another tiddler + wiki.addTiddler({title: "TiddlerFive", text: "Jalapeno Peppers"}); + // Refresh + refreshWidgetNode(widgetNode,wrapper,["TiddlerFive"]); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers0yesnoLemon Squash1nonoJolly Old World2nonoGolly Gosh3nonoWorldly Old Jelly4noyes</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(18); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(19); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(20); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(21); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(22); + expect(wrapper.children[0].children[5].sequenceNumber).toBe(23); + expect(wrapper.children[0].children[6].sequenceNumber).toBe(24); + expect(wrapper.children[0].children[7].sequenceNumber).toBe(25); + expect(wrapper.children[0].children[8].sequenceNumber).toBe(26); + expect(wrapper.children[0].children[9].sequenceNumber).toBe(27); + expect(wrapper.children[0].children[10].sequenceNumber).toBe(28); + expect(wrapper.children[0].children[11].sequenceNumber).toBe(29); + expect(wrapper.children[0].children[12].sequenceNumber).toBe(30); + expect(wrapper.children[0].children[13].sequenceNumber).toBe(31); + expect(wrapper.children[0].children[14].sequenceNumber).toBe(32); + expect(wrapper.children[0].children[15].sequenceNumber).toBe(33); + expect(wrapper.children[0].children[16].sequenceNumber).toBe(34); + expect(wrapper.children[0].children[17].sequenceNumber).toBe(35); + expect(wrapper.children[0].children[18].sequenceNumber).toBe(36); + expect(wrapper.children[0].children[19].sequenceNumber).toBe(37); + // Remove a tiddler + wiki.deleteTiddler("TiddlerThree"); + // Refresh + refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers0yesnoLemon Squash1nonoJolly Old World2nonoWorldly Old Jelly3noyes</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(18); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(19); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(20); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(21); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(22); + expect(wrapper.children[0].children[5].sequenceNumber).toBe(23); + expect(wrapper.children[0].children[6].sequenceNumber).toBe(24); + expect(wrapper.children[0].children[7].sequenceNumber).toBe(25); + expect(wrapper.children[0].children[8].sequenceNumber).toBe(26); + expect(wrapper.children[0].children[9].sequenceNumber).toBe(27); + expect(wrapper.children[0].children[10].sequenceNumber).toBe(28); + expect(wrapper.children[0].children[11].sequenceNumber).toBe(29); + expect(wrapper.children[0].children[12].sequenceNumber).toBe(38); + expect(wrapper.children[0].children[13].sequenceNumber).toBe(39); + expect(wrapper.children[0].children[14].sequenceNumber).toBe(40); + expect(wrapper.children[0].children[15].sequenceNumber).toBe(41); + // Add it back a tiddler + wiki.addTiddler({title: "TiddlerThree", text: "Something"}); + // Refresh + refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); + // Test the refreshing + expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers0yesnoLemon Squash1nonoJolly Old World2nonoSomething3nonoWorldly Old Jelly4noyes</p>"); + // Test the sequence numbers in the DOM + expect(wrapper.sequenceNumber).toBe(0); + expect(wrapper.children[0].sequenceNumber).toBe(1); + expect(wrapper.children[0].children[0].sequenceNumber).toBe(18); + expect(wrapper.children[0].children[1].sequenceNumber).toBe(19); + expect(wrapper.children[0].children[2].sequenceNumber).toBe(20); + expect(wrapper.children[0].children[3].sequenceNumber).toBe(21); + expect(wrapper.children[0].children[4].sequenceNumber).toBe(22); + expect(wrapper.children[0].children[5].sequenceNumber).toBe(23); + expect(wrapper.children[0].children[6].sequenceNumber).toBe(24); + expect(wrapper.children[0].children[7].sequenceNumber).toBe(25); + expect(wrapper.children[0].children[8].sequenceNumber).toBe(26); + expect(wrapper.children[0].children[9].sequenceNumber).toBe(27); + expect(wrapper.children[0].children[10].sequenceNumber).toBe(28); + expect(wrapper.children[0].children[11].sequenceNumber).toBe(29); + expect(wrapper.children[0].children[12].sequenceNumber).toBe(42); + expect(wrapper.children[0].children[13].sequenceNumber).toBe(43); + expect(wrapper.children[0].children[14].sequenceNumber).toBe(44); + expect(wrapper.children[0].children[15].sequenceNumber).toBe(45); + }); + it("should deal with the list widget followed by other widgets", function() { var wiki = new $tw.Wiki(); // Add some tiddlers diff --git a/editions/tw5.com/tiddlers/widgets/ListWidget.tid b/editions/tw5.com/tiddlers/widgets/ListWidget.tid index 272df8d87..363d87e2d 100644 --- a/editions/tw5.com/tiddlers/widgets/ListWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ListWidget.tid @@ -1,6 +1,6 @@ caption: list created: 20131024141900000 -modified: 20190608162410684 +modified: 20210416175333981 tags: Widgets Lists title: ListWidget type: text/vnd.tiddlywiki @@ -82,10 +82,43 @@ The action of the list widget depends on the results of the filter combined with |template |The title of a template tiddler for transcluding each tiddler in the list. When no template is specified, the body of the ListWidget serves as the item template. With no body, a simple link to the tiddler is returned. | |editTemplate |An alternative template to use for [[DraftTiddlers|DraftMechanism]] in edit mode | |variable |The name for a [[variable|Variables]] in which the title of each listed tiddler is stored. Defaults to ''currentTiddler'' | +|index |<<.from-version "5.1.24">> Optional name for a [[variable|Variables]] in which the numeric index of each listed tiddler is stored (see below) | |emptyMessage |Message to be displayed when the list is empty | |storyview |Optional name of module responsible for animating/processing the list | |history |The title of the tiddler containing the navigation history | +!! `index` attribute + +The optional `index` attribute specifies the name of a variable to hold the numeric index of the current item in the list. + +Two additional variables are also set to indicate the first and last items in the list: + +* `<index-variable-name>-first` is set to `yes` for the first entry in the list, `no` for the others +* `<index-variable-name>-last` is set to `yes` for the last entry in the list, `no` for the others + +For example: + + +``` +<$list filter="[tag[About]sort[title]]" index="index"> +<div> +<<index>>: ''<$text text=<<currentTiddler>>/>'' (is first: <<index-first>>, is last: <<index-last>>) +</div> +</$list> +``` + +Displays as: + +<<< +<$list filter="[tag[About]sort[title]]" index="index"> +<div> +<<index>>: ''<$text text=<<currentTiddler>>/>'' (is first: <<index-first>>, is last: <<index-last>>) +</div> +</$list> +<<< + +Note that using the `index` attribute degrades the performance of the list widget because it prevents the optimisation of refreshes by moving list items around instead of rerendering them. + !! Edit mode The `<$list>` widget can optionally render draft tiddlers through a different template to handle editing, see DraftMechanism. From 051a468c631f017e9520f9bef91f7069b6e183c1 Mon Sep 17 00:00:00 2001 From: Simon Baird <simon.baird@gmail.com> Date: Fri, 23 Apr 2021 12:45:44 -0400 Subject: [PATCH 1297/2376] Add info on TiddlyHost saving & revised TiddlySpot (#5622) I updated the English text only. Will need some help with the translations. Summary: - Mention that TiddlySpot is deprecated and doesn't allow site creation any more. Suggest using TiddlyHost instead. - Remove obsolete intructions about creating TiddlySpot sites. - Misc editing/rewording/tweaking of existing TiddlySpot info for tidiness and clarity. - Add new information about saving on TiddlyHost. - Add logos because why not.. Note: I usually prefer the non-camel case versions of Tiddlyspot and Tiddlyhost, but decided to go with the CamelCase WikiWords here to fit in with the existing conventions. --- .../tiddlers/saving/Saving on TiddlyHost.tid | 17 +++++++ .../tiddlers/saving/Saving on TiddlySpot.tid | 48 ++++++++----------- 2 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 editions/tw5.com/tiddlers/saving/Saving on TiddlyHost.tid diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlyHost.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlyHost.tid new file mode 100644 index 000000000..7cb9a1ec7 --- /dev/null +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlyHost.tid @@ -0,0 +1,17 @@ +caption: ~TiddlyHost +color: #29B6F6 +community-author: Simon Baird +created: 20210422191232572 +delivery: Service +description: Online service for creating and hosting TiddlyWikis +method: save +modified: 20210423003921468 +tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Safari Saving Windows iOS Edge +title: Saving on TiddlyHost +type: text/vnd.tiddlywiki + +[img width=140 [https://github.com/simonbaird/tiddlyhost/raw/main/rails/app/assets/images/logo-800.png]] + +[[TiddlyHost.com|https://tiddlyhost.com/]] is a hosting service for TiddlyWiki created by Simon Baird. Once you sign up and confirm your email you can create "sites", (i.e. ~TiddlyWikis), with support for online saving. Sites can be private or public, and you can optionally list them on the taggable and searchable [[TiddlyHost Hub|https://tiddlyhost.com/hub]] where they'll be discoverable by others. + +Unlike [[TiddlySpot|Saving on TiddlySpot]], [[TiddlyHost|https://tiddlyhost.com]] is secure, open source, and has proper support for TiddlyWiki5. It also allows uploading existing ~TiddlyWiki files, supports TiddlyWikiClassic, and lets you claim ownership of your ~TiddlySpot sites. For more information see the [[FAQ|https://github.com/simonbaird/tiddlyhost/wiki/FAQ]] and the [[About|https://tiddlyhost.com/about]] page. diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid index 77361f307..f34daf59b 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid @@ -1,56 +1,46 @@ caption: ~TiddlySpot color: #29B6F6 -community-author: Simon Baird and Daniel Baird +community-author: Simon Baird & Daniel Baird created: 20130825213500000 delivery: Service -description: Free online service for hosting TiddlyWiki files +description: Online TiddlyWiki hosting. (Deprecated in favour of TiddlyHost) method: save -modified: 20200507202953380 +modified: 20210423004027196 tags: Android Chrome Firefox [[Internet Explorer]] Linux Mac Opera PHP Safari Saving Windows iOS Edge title: Saving on TiddlySpot type: text/vnd.tiddlywiki -[[TiddlySpot|http://tiddlyspot.com]] is a free hosting service for TiddlyWiki documents from Simon Baird and Daniel Baird. +---- +<<.warning "''Please note: ~TiddlySpot is in maintenance mode and no longer allows new sites to be created. Instead of ~TiddlySpot you can now use [[TiddlyHost|Saving on TiddlyHost]], a new service from the creator of ~TiddlySpot.''">> +---- +[img[https://raw.githubusercontent.com/simonbaird/tiddlyhost/main/rails/app/assets/images/tiddlyspot-banner-logo.png]] -! Setting up a TiddlyWiki on ~TiddlySpot -To set up a [[TiddlyWiki Classic|TiddlyWikiClassic]], you merely create a new wiki at http://tiddlyspot.com +[[TiddlySpot.com|http://tiddlyspot.com]] is a hosting service for TiddlyWiki created in 2006 by Simon Baird and Daniel Baird. -!!TiddlyWiki5 on ~TiddlySpot -~TiddlyWiki5 also functions well on ~TiddlySpot but this version is not offered directly in the ~TiddlySpot set-up. +In early 2021 it was superseded by [[TiddlyHost|Saving on TiddlyHost]], a new, secure, modern reimagining of ~TiddlySpot. Creating new sites on ~TiddlySpot is no longer supported, (though sites created in 2020 or earlier are still functional). -The simplest way to create a new ~TiddlySpot with ~TiddlyWiki5 is probably through the community created site http://tiddlywiki5.tiddlyspot.com +!! Security warning for ~TiddlySpot -Alternatively, you can upload an existing ~TiddlyWiki5 document from your local disc to ~TiddlySpot by following these steps: - -# Sign up for a new wiki at http://tiddlyspot.com/, and remember the wiki name and password -# Open your locally stored TiddlyWiki document in your browser -# Fill in the ~TiddlySpot wikiname and password in ''Saving'' tab of the ''control panel'' <<.icon $:/core/images/options-button>> -# Click the <<.icon $:/core/images/save-button>> ''save changes'' button. You should get a confirmation notification at the top right saying ''Saved wiki''. Saving can take several seconds if you're on a slow connection or working with a large wiki. -# Navigate to your ~TiddlySpot URL at http://{wikiname}.tiddlyspot.com/ - -Note that your password is sent unencrypted when using ~TiddlySpot. From http://faq.tiddlyspot.com/: +Note that your password is sent unencrypted when using ~TiddlySpot. From the [[FAQ|http://faq.tiddlyspot.com/]]: <<< ''Is Tiddlyspot secure?'' -No. Tiddlyspot does not use SSL/https. Your password is sent in clear text when uploading and when authenticating to access a private site. This means that your Tiddlyspot is vulnerable to packet sniffing and your password could be discovered by a malicious third party. Also your data is transmitted unencrypted when you view your site, even if it is a private site. For this reason please don't put sensitive information such as banking details in your Tiddlyspot and don't use a password that you use for other high security sites. +No. Tiddlyspot does not use SSL/https, so all ~Tiddlyspot web traffic is vulnerable to packet sniffing. This means your password and site data could be intercepted by a malicious third party. For this reason, please don't keep sensitive information in your ~TiddlySpot site, and don't use a password that you use for other web sites. <<< -! Problems with saving on ~TiddlySpot +!! Problems with saving on ~TiddlySpot -In case you run into this error when uploading a new or freshly upgraded local TiddlyWiki to ~TiddlySpot : +In case you run into this error when uploading a freshly upgraded local TiddlyWiki to ~TiddlySpot: <<< -Error while saving: - -Error:NS_ERROR_DOM_BAD_URI: Access to restricted URI denied +Error: NS_ERROR_DOM_BAD_URI: Access to restricted URI denied <<< The upgrade operation falls foul of a security restriction in Firefox. Until this can be resolved, we suggest using Chrome. -*# Use Chrome to open the local TiddlyWiki document you want to upload to ~TiddlySpot and follow the steps 1 through 5 described above -*# Once you've checked the ~TiddlySpot-hosted TiddlyWiki loads properly in Chrome, you should be able to access, edit and [[save using TiddlyFox|Saving with TiddlyFox]] again -* After you've uploaded your local document once, further editing and saving of the online version hosted on ~TiddlySpot should work with any modern browser of your choice. -** Don't forget to fill in the ~TiddlySpot wikiname and password in your ~TiddlySpot TiddlyWiki control panel for any new browser you want to use for saving changes +* Use Chrome to open the local TiddlyWiki document you want to upload to ~TiddlySpot and follow the steps 1 through 5 described at [[Upgrading]]. +* Once you've checked the ~TiddlySpot-hosted TiddlyWiki loads properly in Chrome, you should be able to access, edit and [[save using TiddlyFox|Saving with TiddlyFox]] again. +* After you've uploaded your local document once, further editing and saving of the online version hosted on ~TiddlySpot should work with any modern browser of your choice. (Don't forget to fill in the ~TiddlySpot password in your ~TiddlySpot TiddlyWiki control panel for any new browser you want to use for saving changes.) -* //See also : [[Upgrading]]// +//See also: [[Upgrading]]// From 5e236d35a538d655d6156b874b25c54d53ef805f Mon Sep 17 00:00:00 2001 From: Simon Baird <simon.baird@gmail.com> Date: Sat, 24 Apr 2021 03:54:44 -0400 Subject: [PATCH 1298/2376] Revise the TiddlySpot Saver settings form (#5628) Mention TiddlyHost and link to some documentation on the configuration options. Also remove the TiddlySpot control panel and backups links since they no longer work. Notes: * The last three fields are no use for TiddlySpot or TiddlyHost, but it's possible that someone, somewhere is still using the old store.php from Bidix's UploadPlugin, and would miss them if they were removed. I'd be happy to remove them in a future PR, if it's decided they can be retired. (If they were removed, I could delete the last row here:) https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot * It's still called "TiddlySpot Saver" which I think is fine for now. TiddlyHost might use a different saving method in future so keeping the existing name seems best. --- core/language/en-GB/ControlPanel.multids | 4 ++-- core/ui/ControlPanel/Saving/TiddlySpot.tid | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 6fc42e954..6b8a68ed5 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -123,12 +123,12 @@ Saving/TiddlySpot/BackupDir: Backup Directory Saving/TiddlySpot/ControlPanel: ~TiddlySpot Control Panel Saving/TiddlySpot/Backups: Backups Saving/TiddlySpot/Caption: ~TiddlySpot Saver -Saving/TiddlySpot/Description: These settings are only used when saving to http://tiddlyspot.com or a compatible remote server +Saving/TiddlySpot/Description: These settings are only used when saving to [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]], or a compatible remote server. See [[here|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] for information on ~TiddlySpot and ~TiddlyHost saving configuration. Saving/TiddlySpot/Filename: Upload Filename Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.// Saving/TiddlySpot/Password: Password -Saving/TiddlySpot/ReadOnly: The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers. +Saving/TiddlySpot/ReadOnly: Note that [[TiddlySpot|http://tiddlyspot.com]] no longer allows the creation of new sites. For new sites you can use [[TiddlyHost|https://tiddlyhost.com]], a new hosting service which replaces ~TiddlySpot. Saving/TiddlySpot/ServerURL: Server URL Saving/TiddlySpot/UploadDir: Upload Directory Saving/TiddlySpot/UserName: Wiki Name diff --git a/core/ui/ControlPanel/Saving/TiddlySpot.tid b/core/ui/ControlPanel/Saving/TiddlySpot.tid index dad217251..cb8c9edf3 100644 --- a/core/ui/ControlPanel/Saving/TiddlySpot.tid +++ b/core/ui/ControlPanel/Saving/TiddlySpot.tid @@ -30,8 +30,6 @@ http://$(userName)$.tiddlyspot.com/$path$/ |<<lingo UserName>> |<$edit-text tiddler="$:/UploadName" default="" tag="input"/> | |<<lingo Password>> |<$password name="upload"/> | -|<<lingo Backups>> |<<siteLink backup>> | -|<<lingo ControlPanel>> |<<siteLink controlpanel>> | ''<<lingo Advanced/Heading>>'' From 792171c8fc8b1dbe4df095ef3678287ff7d822b1 Mon Sep 17 00:00:00 2001 From: Simon Baird <simon.baird@gmail.com> Date: Sat, 24 Apr 2021 10:42:02 -0400 Subject: [PATCH 1299/2376] Two typo fixups related to surplus tilde chars (#5627) --- ...irebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid | 2 +- editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/community/resources/TW5-firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid b/editions/tw5.com/tiddlers/community/resources/TW5-firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid index ec5d60f58..0458b4a55 100644 --- a/editions/tw5.com/tiddlers/community/resources/TW5-firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid +++ b/editions/tw5.com/tiddlers/community/resources/TW5-firebase TiddlyWiki5 for Google Firebase by Peter Neumark.tid @@ -1,4 +1,4 @@ -caption: ~TW5-firebase +caption: TW5-firebase color: #FFEB3B community-author: Peter Neumark created: 20210115121027582 diff --git a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid index f34daf59b..e65d171ae 100644 --- a/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid +++ b/editions/tw5.com/tiddlers/saving/Saving on TiddlySpot.tid @@ -26,7 +26,7 @@ Note that your password is sent unencrypted when using ~TiddlySpot. From the [[F <<< ''Is Tiddlyspot secure?'' -No. Tiddlyspot does not use SSL/https, so all ~Tiddlyspot web traffic is vulnerable to packet sniffing. This means your password and site data could be intercepted by a malicious third party. For this reason, please don't keep sensitive information in your ~TiddlySpot site, and don't use a password that you use for other web sites. +No. Tiddlyspot does not use SSL/https, so all ~TiddlySpot web traffic is vulnerable to packet sniffing. This means your password and site data could be intercepted by a malicious third party. For this reason, please don't keep sensitive information in your ~TiddlySpot site, and don't use a password that you use for other web sites. <<< !! Problems with saving on ~TiddlySpot From 80133895baba875d73ebf4adf18895d00efff821 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Sun, 25 Apr 2021 15:22:03 +0800 Subject: [PATCH 1300/2376] Update chinese translations for `Saving/TiddlySpot/` (#5633) --- languages/zh-Hans/ControlPanel.multids | 4 ++-- languages/zh-Hant/ControlPanel.multids | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/languages/zh-Hans/ControlPanel.multids b/languages/zh-Hans/ControlPanel.multids index 0d337531c..6a3862303 100644 --- a/languages/zh-Hans/ControlPanel.multids +++ b/languages/zh-Hans/ControlPanel.multids @@ -124,12 +124,12 @@ Saving/TiddlySpot/BackupDir: 备份文件夹 Saving/TiddlySpot/Backups: 备份 Saving/TiddlySpot/Caption: ~TiddlySpot 保存模块 Saving/TiddlySpot/ControlPanel: ~TiddlySpot 控制台 -Saving/TiddlySpot/Description: 这些设置只适用于保存到 http://tiddlyspot.com 或兼容的远程服务器时。 +Saving/TiddlySpot/Description: 这些设置只适用于保存到 [[TiddlySpot|http://tiddlyspot.com]]、[[TiddlyHost|https://tiddlyhost.com]],或兼容的远程服务器。有关 ~TiddlySpot 和 ~TiddlyHost 的保存设置信息,请参阅[[此处|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]]。 Saving/TiddlySpot/Filename: 上传文件名 Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //默认之服务器网址 `http://<wikiname>.tiddlyspot.com/store.cgi`,可改为定制之服务器网址,例如 `http://example.com/store.php`。// Saving/TiddlySpot/Password: 密码 -Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服务目前仅以唯读形式提供。相关最新详细信息,请参阅 http://tiddlyspot.com/ 。~TiddlySpot 保存模块仍可用于保存到兼容的服务器。 +Saving/TiddlySpot/ReadOnly: 请注意,[[TiddlySpot|http://tiddlyspot.com]] 不再允许创建新网站。对于新网站,您可以使用 [[TiddlyHost|https://tiddlyhost.com]],一个新的取代 ~TiddlySpot 的讬管服务 。 Saving/TiddlySpot/ServerURL: 服务器网址 Saving/TiddlySpot/UploadDir: 上传文件夹 Saving/TiddlySpot/UserName: 用户 diff --git a/languages/zh-Hant/ControlPanel.multids b/languages/zh-Hant/ControlPanel.multids index 3be034d0c..94d988e6d 100644 --- a/languages/zh-Hant/ControlPanel.multids +++ b/languages/zh-Hant/ControlPanel.multids @@ -124,12 +124,12 @@ Saving/TiddlySpot/BackupDir: 備份資料夾 Saving/TiddlySpot/Backups: 備份 Saving/TiddlySpot/Caption: ~TiddlySpot 儲存模組 Saving/TiddlySpot/ControlPanel: ~TiddlySpot 控制台 -Saving/TiddlySpot/Description: 這些設定只適用於儲存到 http://tiddlyspot.com 或相容的遠端伺服器時。 +Saving/TiddlySpot/Description: 這些設定只適用於儲存到 [[TiddlySpot|http://tiddlyspot.com]]、[[TiddlyHost|https://tiddlyhost.com]],或相容的遠端伺服器。有關 ~TiddlySpot 和 ~TiddlyHost 的儲存設定資訊,請參閱[[此處|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]]。 Saving/TiddlySpot/Filename: 上傳檔名 Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //預設之伺服器網址 `http://<wikiname>.tiddlyspot.com/store.cgi`,可改為自訂之伺服器網址,例如 `http://example.com/store.php`。// Saving/TiddlySpot/Password: 密碼 -Saving/TiddlySpot/ReadOnly: ~TiddlySpot 服務目前僅以唯讀形式提供。相關最新詳細資訊,請參閱 http://tiddlyspot.com/ 。~TiddlySpot 儲存模組仍可用於儲存到相容的伺服器。 +Saving/TiddlySpot/ReadOnly: 請注意,[[TiddlySpot|http://tiddlyspot.com]] 不再允許建立新網站。對於新網站,您可以使用 [[TiddlyHost|https://tiddlyhost.com]],一個新的取代 ~TiddlySpot 的託管服務 。 Saving/TiddlySpot/ServerURL: 伺服器網址 Saving/TiddlySpot/UploadDir: 上傳資料夾 Saving/TiddlySpot/UserName: 帳號 From ca1cf7bb4112575c984625fbab68c41c32f7e8b1 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sun, 25 Apr 2021 09:24:02 +0200 Subject: [PATCH 1301/2376] MessageCatcher docs: corrected typo (#5632) --- editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid index 406c4cda5..60f2f23c3 100644 --- a/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/MessageCatcherWidget.tid @@ -25,7 +25,7 @@ The message catcher widget |!Variables |!Description | |`event-*` |All string-based properties of the `event` object, with the names prefixed with `event-` | |`event-paramObject-*` |All string-based properties of the `event.paramObject` object, with the names prefixed with `event-paramObject-` | -|`modifier` |For messages that originated with browser events, the modifier keys that were pressed when the event was fired. The possible modifiers are ''norma'' (no modifiers), ''ctrl'', ''ctrl-alt'', ''ctrl-shift'', ''alt'', ''alt-shift'', ''shift'' and ''ctrl-alt-shift'' | +|`modifier` |For messages that originated with browser events, the modifier keys that were pressed when the event was fired. The possible modifiers are ''normal'' (no modifiers), ''ctrl'', ''ctrl-alt'', ''ctrl-shift'', ''alt'', ''alt-shift'', ''shift'' and ''ctrl-alt-shift'' | ! Example @@ -39,4 +39,4 @@ The message catcher widget Click on [[this link]] to fire an action. See the browser JavaScript console for the output </$messagecatcher> -"""/> \ No newline at end of file +"""/> From 23bd7e7817c974a391f87962669b387520c4a2c7 Mon Sep 17 00:00:00 2001 From: Miha Lunar <mlunar@gmail.com> Date: Sun, 25 Apr 2021 13:12:45 +0200 Subject: [PATCH 1302/2376] Replaced restructuring and added fallback comment --- core/modules/parsers/wikiparser/wikiparser.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index 9af8ddff0..922bb541f 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -168,6 +168,7 @@ WikiParser.prototype.findNextMatch = function(rules,startPos) { WikiParser.prototype.parseRule = function(rule) { var start = this.pos, blocks = rule.parse(); + // Use fallback parent range for blocks that don't define their own for(var i=0; i<blocks.length; i++) { var block = blocks[i]; if(block.start !== undefined) { @@ -229,7 +230,7 @@ WikiParser.prototype.parseBlock = function(terminatorRegExpString) { var start = this.pos; var children = this.parseInlineRun(terminatorRegExp); var end = this.pos; - return [{type: "element", tag: "p", children, start, end }]; + return [{type: "element", tag: "p", children: children, start: start, end: end }]; }; /* From 62fdaa633a3964103638cb9f89544c313022b9fd Mon Sep 17 00:00:00 2001 From: Miha Lunar <mlunar@gmail.com> Date: Sun, 25 Apr 2021 16:03:35 +0200 Subject: [PATCH 1303/2376] Fixed fallback range logic + added ranges to tests --- core/modules/parsers/wikiparser/wikiparser.js | 24 +++++-- .../tiddlers/tests/test-wikitext-parser.js | 62 +++++++++---------- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index 606b5f6f8..6416d14e1 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -187,20 +187,34 @@ WikiParser.prototype.findNextMatch = function(rules,startPos) { WikiParser.prototype.parseRule = function(rule) { var start = this.pos, - blocks = rule.parse(); - // Use fallback parent range for blocks that don't define their own + blocks = rule.parse(), + pending = []; + // Estimate start/end ranges for blocks that don't define their own based on + // sibling and parent ranges for(var i=0; i<blocks.length; i++) { var block = blocks[i]; - if(block.start !== undefined) { + if(block.start === undefined) { block.start = start; + } else { + this.applyRangeEnd(pending,block.start); + pending.length = 0; } - if(block.end !== undefined) { - block.end = this.pos; + if(block.end === undefined) { + pending.push(block); + } else { + start = block.end; } } + this.applyRangeEnd(pending,this.pos); return blocks; }; +WikiParser.prototype.applyRangeEnd = function(blocks,end) { + for(var i=0; i<blocks.length; i++) { + blocks[i].end = end; + } +} + /* Parse any pragmas at the beginning of a block of parse text */ diff --git a/editions/test/tiddlers/tests/test-wikitext-parser.js b/editions/test/tiddlers/tests/test-wikitext-parser.js index ea17ff857..041ca31c0 100644 --- a/editions/test/tiddlers/tests/test-wikitext-parser.js +++ b/editions/test/tiddlers/tests/test-wikitext-parser.js @@ -25,88 +25,88 @@ describe("WikiText parser tests", function() { it("should parse tags", function() { expect(parse("<br>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'br', isBlock : false, attributes : { }, start : 0, end : 4 } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 4, children : [ { type : 'element', tag : 'br', start : 0, end : 4, isBlock : false, attributes : { } } ] } ] ); expect(parse("</br>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'text', text : '</br>' } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 5, children : [ { type : 'text', text : '</br>', start : 0, end : 5 } ] } ] ); expect(parse("<div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { }, children : [ ], start : 0, end : 5 } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 5, children : [ { type : 'element', tag : 'div', start : 0, end : 5, isBlock : false, attributes : { }, children : [ ] } ] } ] ); expect(parse("<div/>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isSelfClosing : true, isBlock : false, attributes : { }, start : 0, end : 6 } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 6, children : [ { type : 'element', tag : 'div', isSelfClosing : true, isBlock : false, attributes : { }, start : 0, end : 6 } ] } ] ); expect(parse("<div></div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { }, children : [ ], start : 0, end : 5 } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 11, children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { }, children : [ ], start : 0, end : 5 } ] } ] ); expect(parse("<div>some text</div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { }, children : [ { type : 'text', text : 'some text' } ], start : 0, end : 5 } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 20, children : [ { type : 'element', tag : 'div', start : 0, end : 20, isBlock : false, attributes : { }, children : [ { type : 'text', text : 'some text', start : 5, end : 14 } ], start : 0, end : 5 } ] } ] ); expect(parse("<div attribute>some text</div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'string', value : 'true', start : 4, end : 14, name: 'attribute' } }, children : [ { type : 'text', text : 'some text' } ], start : 0, end : 15 } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 30, children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'string', value : 'true', start : 4, end : 14, name: 'attribute' } }, children : [ { type : 'text', text : 'some text', start : 15, end : 24 } ], start : 0, end : 15 } ] } ] ); expect(parse("<div attribute='value'>some text</div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'string', name: 'attribute', value : 'value', start: 4, end: 22 } }, children : [ { type : 'text', text : 'some text' } ], start: 0, end: 23 } ] } ] + [ { type : 'element', tag : 'p', start : 0, end : 38, children : [ { type : 'element', tag : 'div', start: 0, end: 38, isBlock : false, attributes : { attribute : { type : 'string', name: 'attribute', value : 'value', start: 4, end: 22 } }, children : [ { type : 'text', text : 'some text', start : 23, end : 32 } ], start : 0, end : 23 } ] } ] ); expect(parse("<div attribute={{TiddlerTitle}}>some text</div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'indirect', name: 'attribute', textReference : 'TiddlerTitle', start : 4, end : 31 } }, children : [ { type : 'text', text : 'some text' } ], start : 0, end : 32 } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 47, children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'indirect', name: 'attribute', textReference : 'TiddlerTitle', start : 4, end : 31 } }, children : [ { type : 'text', text : 'some text', start : 32, end : 41 } ], start : 0, end : 32 } ] } ] ); expect(parse("<$reveal state='$:/temp/search' type='nomatch' text=''>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'reveal', tag: '$reveal', start : 0, attributes : { state : { start : 8, name : 'state', type : 'string', value : '$:/temp/search', end : 31 }, type : { start : 31, name : 'type', type : 'string', value : 'nomatch', end : 46 }, text : { start : 46, name : 'text', type : 'string', value : '', end : 54 } }, end : 55, isBlock : false, children : [ ] } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 55, children : [ { type : 'reveal', tag: '$reveal', start : 0, attributes : { state : { start : 8, name : 'state', type : 'string', value : '$:/temp/search', end : 31 }, type : { start : 31, name : 'type', type : 'string', value : 'nomatch', end : 46 }, text : { start : 46, name : 'text', type : 'string', value : '', end : 54 } }, end : 55, isBlock : false, children : [ ] } ] } ] ); expect(parse("<div attribute={{TiddlerTitle!!field}}>some text</div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'indirect', name : 'attribute', textReference : 'TiddlerTitle!!field', start : 4, end : 38 } }, children : [ { type : 'text', text : 'some text' } ], start : 0, end : 39 } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 54, children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'indirect', name : 'attribute', textReference : 'TiddlerTitle!!field', start : 4, end : 38 } }, children : [ { type : 'text', text : 'some text', start : 39, end : 48 } ], start : 0, end : 39 } ] } ] ); expect(parse("<div attribute={{Tiddler Title!!field}}>some text</div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'indirect', name : 'attribute', textReference : 'Tiddler Title!!field', start : 4, end : 39 } }, children : [ { type : 'text', text : 'some text' } ], start : 0, end : 40 } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 55, children : [ { type : 'element', tag : 'div', isBlock : false, attributes : { attribute : { type : 'indirect', name : 'attribute', textReference : 'Tiddler Title!!field', start : 4, end : 39 } }, children : [ { type : 'text', text : 'some text', start : 40, end : 49 } ], start : 0, end : 40 } ] } ] ); expect(parse("<div attribute={{TiddlerTitle!!field}}>\n\nsome text</div>")).toEqual( - [ { type : 'element', start : 0, attributes : { attribute : { start : 4, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 38 } }, tag : 'div', end : 39, isBlock : true, children : [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'some text' } ] } ] } ] + [ { type : 'element', start : 0, attributes : { attribute : { start : 4, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 38 } }, tag : 'div', end : 39, isBlock : true, children : [ { type : 'element', tag : 'p', start : 41, end : 50, children : [ { type : 'text', text : 'some text', start : 41, end : 50 } ] } ] } ] ); expect(parse("<div><div attribute={{TiddlerTitle!!field}}>\n\nsome text</div></div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : true, children : [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'some text' } ] } ] } ] } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 67, children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : true, children : [ { type : 'element', tag : 'p', start : 46, end : 55, children : [ { type : 'text', text : 'some text', start : 46, end : 55 } ] } ] } ] } ] } ] ); expect(parse("<div><div attribute={{TiddlerTitle!!field}}>\n\n!some heading</div></div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : true, children : [ { type : 'element', tag : 'h1', attributes : { class : { type : 'string', value : '' } }, children : [ { type : 'text', text : 'some heading</div></div>' } ] } ] } ] } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 71, children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : true, children : [ { type : 'element', tag : 'h1', start : 46, end : 71, attributes : { class : { type : 'string', value : '' } }, children : [ { type : 'text', text : 'some heading</div></div>', start : 47, end : 71 } ] } ] } ] } ] } ] ); expect(parse("<div><div attribute={{TiddlerTitle!!field}}>\n!some heading</div></div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : false, children : [ { type : 'text', text : '\n!some heading' } ] } ] } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 70, children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : false, children : [ { type : 'text', text : '\n!some heading', start : 44, end : 58 } ] } ] } ] } ] ); // Regression test for issue (#3306) expect(parse("<div><span><span>\n\nSome text</span></span></div>")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { }, tag : 'span', end : 11, isBlock : false, children : [ { type : 'element', start : 11, attributes : { }, tag : 'span', end : 17, isBlock : true, children : [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'Some text' } ] } ] } ] } ] } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 48, children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { }, tag : 'span', end : 11, isBlock : false, children : [ { type : 'element', start : 11, attributes : { }, tag : 'span', end : 17, isBlock : true, children : [ { type : 'element', tag : 'p', start : 19, end : 28, children : [ { type : 'text', text : 'Some text', start : 19, end : 28 } ] } ] } ] } ] } ] } ] ); }); @@ -114,7 +114,7 @@ describe("WikiText parser tests", function() { it("should parse macro definitions", function() { expect(parse("\\define myMacro()\nnothing\n\\end\n")).toEqual( - [ { type : 'set', attributes : { name : { type : 'string', value : 'myMacro' }, value : { type : 'string', value : 'nothing' } }, children : [ ], params : [ ], isMacroDefinition : true } ] + [ { type : 'set', start : 0, end : 30, attributes : { name : { type : 'string', value : 'myMacro' }, value : { type : 'string', value : 'nothing' } }, children : [ ], params : [ ], isMacroDefinition : true } ] ); @@ -123,38 +123,38 @@ describe("WikiText parser tests", function() { it("should parse inline macro calls", function() { expect(parse("<<john>><<paul>><<george>><<ringo>>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'macrocall', start: 8, params: [ ], name: 'paul', end: 16 }, { type: 'macrocall', start: 16, params: [ ], name: 'george', end: 26 }, { type: 'macrocall', start: 26, params: [ ], name: 'ringo', end: 35 } ] } ] + [ { type: 'element', tag: 'p', start: 0, end: 35, children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'macrocall', start: 8, params: [ ], name: 'paul', end: 16 }, { type: 'macrocall', start: 16, params: [ ], name: 'george', end: 26 }, { type: 'macrocall', start: 26, params: [ ], name: 'ringo', end: 35 } ] } ] ); expect(parse("text <<john one:val1 two: 'val \"2\"' three: \"val '3'\" four: \"\"\"val 4\"5'\"\"\" five: [[val 5]] >>")).toEqual( - [{ type: 'element', tag: 'p', children: [ { type: 'text', text: 'text ' }, { type: 'macrocall', name: 'john', start: 5, params: [ { type: 'macro-parameter', start: 11, value: 'val1', name: 'one', end: 20 }, { type: 'macro-parameter', start: 20, value: 'val "2"', name: 'two', end: 35 }, { type: 'macro-parameter', start: 35, value: 'val \'3\'', name: 'three', end: 52 }, { type: 'macro-parameter', start: 52, value: 'val 4"5\'', name: 'four', end: 73 }, { type: 'macro-parameter', start: 73, value: 'val 5', name: 'five', end: 89 } ], end: 92 } ] } ] + [{ type: 'element', tag: 'p', start: 0, end: 92, children: [ { type: 'text', text: 'text ', start: 0, end: 5 }, { type: 'macrocall', name: 'john', start: 5, params: [ { type: 'macro-parameter', start: 11, value: 'val1', name: 'one', end: 20 }, { type: 'macro-parameter', start: 20, value: 'val "2"', name: 'two', end: 35 }, { type: 'macro-parameter', start: 35, value: 'val \'3\'', name: 'three', end: 52 }, { type: 'macro-parameter', start: 52, value: 'val 4"5\'', name: 'four', end: 73 }, { type: 'macro-parameter', start: 73, value: 'val 5', name: 'five', end: 89 } ], end: 92 } ] } ] ); expect(parse("ignored << carrots <<john>>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'ignored << carrots ' }, { type: 'macrocall', name: 'john', start: 19, params: [ ], end: 27 } ] } ] + [ { type: 'element', tag: 'p', start: 0, end: 27, children: [ { type: 'text', text: 'ignored << carrots ', start: 0, end: 19 }, { type: 'macrocall', name: 'john', start: 19, params: [ ], end: 27 } ] } ] ); expect(parse("text <<<john>>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'text ' }, { type: 'macrocall', name: '<john', start: 5, params: [ ], end: 14 } ] } ] + [ { type: 'element', tag: 'p', start: 0, end: 14, children: [ { type: 'text', text: 'text ', start: 0, end: 5 }, { type: 'macrocall', name: '<john', start: 5, params: [ ], end: 14 } ] } ] ); expect(parse("before\n<<john>>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'before\n' }, { type: 'macrocall', start: 7, params: [ ], name: 'john', end: 15 } ] } ] + [ { type: 'element', tag: 'p', start: 0, end: 15, children: [ { type: 'text', text: 'before\n', start: 0, end: 7 }, { type: 'macrocall', start: 7, params: [ ], name: 'john', end: 15 } ] } ] ); // A single space will cause it to be inline expect(parse("<<john>> ")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'text', text: ' ' } ] } ] + [ { type: 'element', tag: 'p', start: 0, end: 9, children: [ { type: 'macrocall', start: 0, params: [ ], name: 'john', end: 8 }, { type: 'text', text: ' ', start: 8, end: 9 } ] } ] ); expect(parse("text <<outie one:'my <<innie>>' >>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'text ' }, { type: 'macrocall', start: 5, params: [ { type: 'macro-parameter', start: 12, value: 'my <<innie>>', name: 'one', end: 31 } ], name: 'outie', end: 34 } ] } ] + [ { type: 'element', tag: 'p', start: 0, end: 34, children: [ { type: 'text', text: 'text ', start: 0, end: 5 }, { type: 'macrocall', start: 5, params: [ { type: 'macro-parameter', start: 12, value: 'my <<innie>>', name: 'one', end: 31 } ], name: 'outie', end: 34 } ] } ] ); @@ -173,17 +173,17 @@ describe("WikiText parser tests", function() { ); expect(parse("<< carrots\n\n<<john>>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'text', text: '<< carrots' } ] }, { type: 'macrocall', start: 12, params: [ ], name: 'john', end: 20, isBlock: true } ] + [ { type: 'element', tag: 'p', start : 0, end : 10, children: [ { type: 'text', text: '<< carrots', start : 0, end : 10 } ] }, { type: 'macrocall', start: 12, params: [ ], name: 'john', end: 20, isBlock: true } ] ); expect(parse("before\n\n<<john>>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'text', text: 'before' } ] }, { type: 'macrocall', start: 8, name: 'john', params: [ ], end: 16, isBlock: true } ] + [ { type: 'element', tag: 'p', start : 0, end : 6, children: [ { type: 'text', text: 'before', start : 0, end : 6 } ] }, { type: 'macrocall', start: 8, name: 'john', params: [ ], end: 16, isBlock: true } ] ); expect(parse("<<john>>\nafter")).toEqual( - [ { type: 'macrocall', start: 0, name: 'john', params: [ ], end: 8, isBlock: true }, { type: 'element', tag: 'p', children: [ { type: 'text', text: 'after' } ] } ] + [ { type: 'macrocall', start: 0, name: 'john', params: [ ], end: 8, isBlock: true }, { type: 'element', tag: 'p', start: 9, end: 14, children: [ { type: 'text', text: 'after', start: 9, end: 14 } ] } ] ); expect(parse("<<multiline arg:\"\"\"\n\nwikitext\n\"\"\" >>")).toEqual( @@ -211,7 +211,7 @@ describe("WikiText parser tests", function() { ); expect(parse("<<john param>>>")).toEqual( - [ { type: 'element', tag: 'p', children: [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'param', end: 12 } ], name: 'john', end: 14 }, { type: 'text', text: '>' } ] } ] + [ { type: 'element', tag: 'p', start: 0, end: 15, children: [ { type: 'macrocall', start: 0, params: [ { type: 'macro-parameter', start: 6, value: 'param', end: 12 } ], name: 'john', end: 14 }, { type: 'text', text: '>', start: 14, end: 15 } ] } ] ); // equals signs should be allowed @@ -226,7 +226,7 @@ describe("WikiText parser tests", function() { it("should parse horizontal rules", function() { expect(parse("---Not a rule\n\n----\n\nBetween\n\n---")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'entity', entity : '—' }, { type : 'text', text : 'Not a rule' } ] }, { type : 'element', tag : 'hr' }, { type : 'element', tag : 'p', children : [ { type : 'text', text : 'Between' } ] }, { type : 'element', tag : 'hr' } ] + [ { type : 'element', tag : 'p', start : 0, end : 13, children : [ { type : 'entity', entity : '—', start : 0, end : 3 }, { type : 'text', text : 'Not a rule', start : 3, end : 13 } ] }, { type : 'element', tag : 'hr', start : 15, end : 20 }, { type : 'element', tag : 'p', start : 21, end : 28, children : [ { type : 'text', text : 'Between', start : 21, end : 28 } ] }, { type : 'element', tag : 'hr', start : 30, end : 33 } ] ); @@ -235,7 +235,7 @@ describe("WikiText parser tests", function() { it("should parse hard linebreak areas", function() { expect(parse("\"\"\"Something\nin the\nway she moves\n\"\"\"\n\n")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'Something' }, { type : 'element', tag : 'br' }, { type : 'text', text : 'in the' }, { type : 'element', tag : 'br' }, { type : 'text', text : 'way she moves' }, { type : 'element', tag : 'br' } ] } ] + [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'Something', start : 3, end : 12 }, { type : 'element', tag : 'br', start : 12, end : 13 }, { type : 'text', text : 'in the', start : 13, end : 19 }, { type : 'element', tag : 'br', start : 19, end : 20 }, { type : 'text', text : 'way she moves', start : 20, end : 33 }, { type : 'element', tag : 'br', start: 33, end: 37 } ], start : 0, end : 37 } ] ); From 8849ed0d4635e0d09d06023a20be79b77eeec00d Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Sun, 25 Apr 2021 17:05:02 +0200 Subject: [PATCH 1304/2376] Fix refreshing of select widget when attributes change (#5635) --- core/modules/widgets/select.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/select.js b/core/modules/widgets/select.js index 6efeb588f..b3177d967 100644 --- a/core/modules/widgets/select.js +++ b/core/modules/widgets/select.js @@ -170,7 +170,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of SelectWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // If we're using a different tiddler/field/index then completely refresh ourselves - if(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tooltip) { this.refreshSelf(); return true; // If the target tiddler value has changed, just update setting and refresh the children From ac15334bb0596e37aec40ed57f2504cb512e1045 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Sun, 25 Apr 2021 17:17:32 +0200 Subject: [PATCH 1305/2376] Add support for disabled editor toolbar buttons & docs (#5294) * add dynamic toolbar buttons + HowTo * remove some whitespace. * move howto and improve shortcut logic * move howto * add whitespace so it can be removed in an other PR. --- core/ui/EditTemplate/body-toolbar-button.tid | 14 +- ... create dynamic editor toolbar buttons.tid | 126 ++++++++++++++++++ themes/tiddlywiki/vanilla/base.tid | 8 ++ 3 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 editions/tw5.com/tiddlers/howtos/How to create dynamic editor toolbar buttons.tid diff --git a/core/ui/EditTemplate/body-toolbar-button.tid b/core/ui/EditTemplate/body-toolbar-button.tid index 956bfd634..7390b3e20 100644 --- a/core/ui/EditTemplate/body-toolbar-button.tid +++ b/core/ui/EditTemplate/body-toolbar-button.tid @@ -35,22 +35,23 @@ title: $:/core/ui/EditTemplate/body/toolbar/button filter="[all[current]!has[dropdown]]" variable="no-dropdown" -><$button +><$set name=disabled filter={{!!condition-disabled}}><$button class="tc-btn-invisible $(buttonClasses)$" tooltip=<<tooltip-text>> actions={{!!actions}} + disabled=<<disabled>> ><span - data-tw-keyboard-shortcut={{!!shortcuts}} + data-tw-keyboard-shortcut={{{ [<disabled>match[yes]then[]else{!!shortcuts}] }}} /><<toolbar-button-icon>><$transclude tiddler=<<currentTiddler>> field="text" -/></$button></$list><$list +/></$button></$set></$list><$list filter="[all[current]has[dropdown]]" variable="dropdown" @@ -60,24 +61,25 @@ title: $:/core/ui/EditTemplate/body/toolbar/button name="dropdown-state" value=<<qualify "$:/state/EditorToolbarDropdown">> -><$button +><$set name=disabled filter={{!!condition-disabled}}><$button popup=<<dropdown-state>> class="tc-popup-keep tc-btn-invisible $(buttonClasses)$" selectedClass="tc-selected" tooltip=<<tooltip-text>> actions={{!!actions}} + disabled=<<disabled>> ><span - data-tw-keyboard-shortcut={{!!shortcuts}} + data-tw-keyboard-shortcut={{{ [<disabled>match[yes]then[]else{!!shortcuts}] }}} /><<toolbar-button-icon>><$transclude tiddler=<<currentTiddler>> field="text" -/></$button><$reveal +/></$button></$set><$reveal state=<<dropdown-state>> type="popup" diff --git a/editions/tw5.com/tiddlers/howtos/How to create dynamic editor toolbar buttons.tid b/editions/tw5.com/tiddlers/howtos/How to create dynamic editor toolbar buttons.tid new file mode 100644 index 000000000..27ed11d03 --- /dev/null +++ b/editions/tw5.com/tiddlers/howtos/How to create dynamic editor toolbar buttons.tid @@ -0,0 +1,126 @@ +created: 20201216182347597 +modified: 20201217193318816 +tags: +title: How to create dynamic editor toolbar buttons +type: text/vnd.tiddlywiki + +\define disabledFilterExample()`[[$(tempBoldDisabled)$]get[state-disabled]else[no]]` + +\define remove-shortcuts() +<$action-deletetiddler $tiddler=<<shortcutInfo>>/> +<$action-deletetiddler $tiddler=<<shortcutConfigMac>>/> +<$action-deletetiddler $tiddler=<<shortcutConfigNotMac>>/> +<$action-deletetiddler $tiddler=<<tempBold>>/> +<$action-deletetiddler $tiddler=<<tempBoldDisabled>>/> +\end + +\define create-shortcut-tiddlers() +<$action-createtiddler $basetitle=<<shortcutInfo>> + $template="$:/config/ShortcutInfo/bold" + $overwrite="yes" +/> +<$action-navigate $to=<<shortcutInfo>>/> + +<$action-createtiddler $basetitle=<<shortcutConfigMac>> + $template="$:/config/shortcuts-mac/bold" + $overwrite="yes" + text="meta-shift-X" +/> +<$action-navigate $to=<<shortcutConfigMac>>/> + +<$action-createtiddler $basetitle=<<shortcutConfigNotMac>> + $template="$:/config/shortcuts-not-mac/bold" + $overwrite="yes" + text="ctrl-shift-X" +/> +<$action-navigate $to=<<shortcutConfigNotMac>>/> + +\end + +\define clone-bold() +<$action-createtiddler $basetitle=<<tempBold>> + $template="$:/core/ui/EditorToolbar/bold" + $overwrite="yes" + icon="$:/core/images/spiral" + shortcuts="((temp-bold))" + condition-disabled="[[$(tempBoldDisabled)$]get[state-disabled]else[no]]" +/> +<$action-sendmessage $message="tm-edit-tiddler" $param=<<tempBold>>/> +\end + +\define clone-button-bold() +<$button actions=<<clone-bold>> >Create a Temporary Bold Button</$button> +\end + +\define toggle-bold() +<$action-listops $tiddler=<<tempBoldDisabled>> $field="state-disabled" $subfilter="+[toggle[yes],[no]]" /> +\end + +<!-- $vars is needed don't remove it! --> +<$vars tempBold="$:/temp/bold" tempBoldDisabled="$:/temp/bold/disabled" shortcutInfo="$:/config/ShortcutInfo/temp-bold" shortcutConfigMac="$:/config/shortcuts-mac/temp-bold" shortcutConfigNotMac="$:/config/shortcuts-not-mac/temp-bold"> + +!! Create a New Toolbar Button + +The easiest way to create new editor toolbar button is to clone and open one. + +><<clone-button-bold>> + +This tiddler contains all the necessary elements that are important for toolbar buttons. + +<<< + +; text +: We don't discuss the text field details in this howto + +; caption +: The caption field is used to display the shortcut name in the $:/ControlPanel : Keyboard Shortcuts tab + +; condition +: A filter, that defines the button visibility state + +; condition-disabled <<.from-version "5.1.23">> +: A ''filter'', that allows us to define the "disabled" attribute for buttons. eg: <<disabledFilterExample>> +: This condition ''must'' return "no", if the "state tiddler" or "state field" doesn't exist! So there has to be a `else[no]` element in the filter. + +; description +: Is used as the button tooltip + +; icon +: Assigns the button icon. We use `$:/core/images/spiral` {{$:/core/images/spiral}} here. + +; shortcuts +: This is the [[Keyboard Shortcut Descriptor]] eg: `((temp-bold))` + +<<< + +!! Disabled State + +You can use any "state tiddler" to define the button disabled state. It's important, that the ''condition-disabled'' field is a ''filter''. For our example we use the `state-disabled` field from tiddler: <<tempBoldDisabled>> + +The easiest way to test filters is with the $:/AdvancedSearch : Filter tab + +> The temporary "bold button" is disabled: ''"{{{ [<tempBoldDisabled>get[state-disabled]else[no]] }}}"'' ... You can see the button in the editor toolbar if you edit any tiddler! + +> <$button actions=<<toggle-bold>>>Toggle Temporary Bold Button Visisbility</$button> + +!! Create Keyboard Shortcuts for New Button + +For our ~HowTo we use the ''Keyboard Shortcut Descriptor'': `((temp-bold))` + +To create a valid shortcut configuration we need 2 tiddlers: + +>[[$:/config/ShortcutInfo/|$:/config/ShortcutInfo/temp-bold]]''temp-bold'' .. and +>[[$:/config/shortcuts/|$:/config/shortcuts/temp-bold]]''temp-bold'' + +> <$button actions=<<create-shortcut-tiddlers>>>Create Shortcut Tiddlers</$button> + +!! + +!! Clean up the Configuration Tiddlers + +If you don't need the config tiddlers anymore you can + +><$button actions=<<remove-shortcuts>>>Remove the Shortcut Configuration</$button> + + +</$vars><!-- needed don't remove! --> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index b34917222..5fbde4325 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -87,6 +87,10 @@ html button { border-color: <<colour button-border>>; } +button:disabled svg { + fill: <<colour muted-foreground>>; +} + /* ** Basic element styles */ @@ -1605,6 +1609,10 @@ html body.tc-body.tc-single-tiddler-window { fill: <<colour foreground>>; } +.tc-drop-down button:disabled svg { + fill: <<colour muted-foreground>>; +} + .tc-drop-down button.tc-btn-invisible:hover svg { fill: <<colour background>>; } From 8203ee06c37bf86a22406c2a380423d8dac8c149 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sun, 25 Apr 2021 20:37:47 +0200 Subject: [PATCH 1306/2376] Allow suffixes for filter runs (#5252) * Make filter run prefixes extensible * Make filter run prefixes extensible * Support rich suffixes for filter runs * merged conflicts * Pass suffixes to filterrunprefix --- core/modules/filters.js | 22 +- .../tiddlers/tests/test-prefixes-filter.js | 197 ++++++++++++++++++ 2 files changed, 214 insertions(+), 5 deletions(-) diff --git a/core/modules/filters.js b/core/modules/filters.js index 7c6cc3768..7799b23d6 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -137,7 +137,7 @@ exports.parseFilter = function(filterString) { p = 0, // Current position in the filter string match; var whitespaceRegExp = /(\s+)/mg, - operandRegExp = /((?:\+|\-|~|=|\:(\w+))?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg; + operandRegExp = /((?:\+|\-|~|=|\:(\w+)(?:\:([\w\:, ]*))?)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg; while(p < filterString.length) { // Skip any whitespace whitespaceRegExp.lastIndex = p; @@ -162,15 +162,27 @@ exports.parseFilter = function(filterString) { if(match[2]) { operation.namedPrefix = match[2]; } + if(match[3]) { + operation.suffixes = []; + $tw.utils.each(match[3].split(":"),function(subsuffix) { + operation.suffixes.push([]); + $tw.utils.each(subsuffix.split(","),function(entry) { + entry = $tw.utils.trim(entry); + if(entry) { + operation.suffixes[operation.suffixes.length -1].push(entry); + } + }); + }); + } } - if(match[3]) { // Opening square bracket + if(match[4]) { // Opening square bracket p = parseFilterOperation(operation.operators,filterString,p); } else { p = match.index + match[0].length; } - if(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title + if(match[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title operation.operators.push( - {operator: "title", operands: [{text: match[4] || match[5] || match[6]}]} + {operator: "title", operands: [{text: match[5] || match[6] || match[7]}]} ); } results.push(operation); @@ -280,7 +292,7 @@ exports.compileFilter = function(filterString) { var filterRunPrefixes = self.getFilterRunPrefixes(); // Wrap the operator functions in a wrapper function that depends on the prefix operationFunctions.push((function() { - var options = {wiki: self}; + var options = {wiki: self, suffixes: operation.suffixes || []}; switch(operation.prefix || "") { case "": // No prefix means that the operation is unioned into the result return filterRunPrefixes["or"](operationSubFunction, options); diff --git a/editions/test/tiddlers/tests/test-prefixes-filter.js b/editions/test/tiddlers/tests/test-prefixes-filter.js index 62f51263f..c089734b5 100644 --- a/editions/test/tiddlers/tests/test-prefixes-filter.js +++ b/editions/test/tiddlers/tests/test-prefixes-filter.js @@ -18,6 +18,199 @@ describe("general filter prefix tests", function() { var results = wiki.filterTiddlers("[tag[A]] :nonexistent[tag[B]]"); expect(results).toEqual(["Filter Error: Unknown prefix for filter run"]); }); + + // Test filter run prefix parsing + it("should parse filter run prefix suffixes", function() { + + // two runs, one with a named prefix but no suffix + expect($tw.wiki.parseFilter("[[Sparkling water]tags[]] :intersection[[Red wine]tags[]]")).toEqual( + [ + { + "prefix": "", + "operators": [ + { + "operator": "title", + "operands": [ + { + "text": "Sparkling water" + } + ] + }, + { + "operator": "tags", + "operands": [ + { + "text": "" + } + ] + } + ] + }, + { + "prefix": ":intersection", + "operators": [ + { + "operator": "title", + "operands": [ + { + "text": "Red wine" + } + ] + }, + { + "operator": "tags", + "operands": [ + { + "text": "" + } + ] + } + ], + "namedPrefix": "intersection" + } + ] + ); + + // named prefix with no suffix + expect($tw.wiki.parseFilter(":reduce[multiply<accumulator>]")).toEqual( + [ + { + "prefix": ":reduce", + "operators": [ + { + "operator": "multiply", + "operands": [ + { + "variable": true, + "text": "accumulator" + } + ] + } + ], + "namedPrefix": "reduce" + } + ] + ); + + //named prefix with one simple suffix + expect($tw.wiki.parseFilter(":reduce:1[multiply<accumulator>]")).toEqual( + [ + { + "prefix": ":reduce:1", + "operators": [ + { + "operator": "multiply", + "operands": [ + { + "variable": true, + "text": "accumulator" + } + ] + } + ], + "namedPrefix": "reduce", + "suffixes": [ + [ + "1" + ] + ] + } + ] + ); + + //named prefix with two simple suffixes + expect($tw.wiki.parseFilter(":reduce:1:hello[multiply<accumulator>]")).toEqual( + [ + { + "prefix": ":reduce:1:hello", + "operators": [ + { + "operator": "multiply", + "operands": [ + { + "variable": true, + "text": "accumulator" + } + ] + } + ], + "namedPrefix": "reduce", + "suffixes": [ + [ + "1" + ], + [ + "hello", + ] + ] + } + ] + ); + + //named prefix with two rich (comma separated) suffixes + expect($tw.wiki.parseFilter(":reduce:1,one:hello,there[multiply<accumulator>]")).toEqual( + [ + { + "prefix": ":reduce:1,one:hello,there", + "operators": [ + { + "operator": "multiply", + "operands": [ + { + "variable": true, + "text": "accumulator" + } + ] + } + ], + "namedPrefix": "reduce", + "suffixes": [ + [ + "1", + "one" + ], + [ + "hello", + "there" + ] + ] + } + ] + ); + + // suffixes with spaces + expect($tw.wiki.parseFilter(":reduce: 1, one:hello, there [multiply<accumulator>]")).toEqual( + [ + { + "prefix": ":reduce: 1, one:hello, there ", + "operators": [ + { + "operator": "multiply", + "operands": [ + { + "variable": true, + "text": "accumulator" + } + ] + } + ], + "namedPrefix": "reduce", + "suffixes": [ + [ + "1", + "one" + ], + [ + "hello", + "there" + ] + ] + } + ] + ); + + }); + }); describe("'reduce' and 'intersection' filter prefix tests", function() { @@ -80,6 +273,10 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { // Empty input should become empty output expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>]").length).toBe(0); expect(wiki.filterTiddlers("[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0"); + + expect(wiki.filterTiddlers("[tag[non-existent]] :reduce:11,22[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0"); + + expect(wiki.filterTiddlers("[tag[non-existent]] :reduce:11[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]").join(",")).toBe("0"); }); it("should handle the reduce operator", function() { From e2379b599e20cd2c8284f9a7d62e589952c42f9b Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Mon, 26 Apr 2021 12:29:16 +0200 Subject: [PATCH 1307/2376] Fixes Action-listops bug (#5644) --- core/modules/widgets/action-listops.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/core/modules/widgets/action-listops.js b/core/modules/widgets/action-listops.js index 6da84a3e5..a3448ba71 100644 --- a/core/modules/widgets/action-listops.js +++ b/core/modules/widgets/action-listops.js @@ -44,9 +44,7 @@ ActionListopsWidget.prototype.execute = function() { */ ActionListopsWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.$tiddler || changedAttributes.$filter || - changedAttributes.$subfilter || changedAttributes.$field || - changedAttributes.$index || changedAttributes.$tags) { + if($tw.utils.count(changedAttributes) > 0) { this.refreshSelf(); return true; } @@ -60,12 +58,10 @@ ActionListopsWidget.prototype.invokeAction = function(triggeringWidget, //Apply the specified filters to the lists var field = this.listField, index, - type = "!!", list = this.listField; if(this.listIndex) { field = undefined; index = this.listIndex; - type = "##"; list = this.listIndex; } if(this.filter) { @@ -74,15 +70,14 @@ ActionListopsWidget.prototype.invokeAction = function(triggeringWidget, .filterTiddlers(this.filter, this))); } if(this.subfilter) { - var subfilter = "[list[" + this.target + type + list + "]] " + this.subfilter; - this.wiki.setText(this.target, field, index, $tw.utils.stringifyList( - this.wiki - .filterTiddlers(subfilter, this))); + var inputList = this.wiki.getTiddlerList(this.target,field,index), + subfilter = $tw.utils.stringifyList(inputList) + " " + this.subfilter; + this.wiki.setText(this.target, field, index, $tw.utils.stringifyList(this.wiki.filterTiddlers(subfilter,this))); } if(this.filtertags) { var tiddler = this.wiki.getTiddler(this.target), oldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [], - tagfilter = "[list[" + this.target + "!!tags]] " + this.filtertags, + tagfilter = $tw.utils.stringifyList(oldtags) + " " + this.filtertags, newtags = this.wiki.filterTiddlers(tagfilter,this); if($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) { this.wiki.setText(this.target,"tags",undefined,$tw.utils.stringifyList(newtags)); From 4a99e0cc7d4a6b9e7071c0b2a9a0f63c3c7d2492 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Mon, 26 Apr 2021 14:41:26 +0100 Subject: [PATCH 1308/2376] Change "index" attribute of list widget to "counter", and use 1-based counting Extends #5611 --- core/modules/widgets/list.js | 22 +++++++++---------- editions/test/tiddlers/tests/test-widget.js | 12 +++++----- .../tw5.com/tiddlers/widgets/ListWidget.tid | 20 ++++++++--------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/core/modules/widgets/list.js b/core/modules/widgets/list.js index 426adb307..17161ca21 100755 --- a/core/modules/widgets/list.js +++ b/core/modules/widgets/list.js @@ -61,7 +61,7 @@ ListWidget.prototype.execute = function() { this.template = this.getAttribute("template"); this.editTemplate = this.getAttribute("editTemplate"); this.variableName = this.getAttribute("variable","currentTiddler"); - this.indexName = this.getAttribute("index"); + this.counterName = this.getAttribute("counter"); this.storyViewName = this.getAttribute("storyview"); this.historyTitle = this.getAttribute("history"); // Compose the list elements @@ -130,9 +130,9 @@ ListWidget.prototype.makeItemTemplate = function(title,index) { } // Return the list item var parseTreeNode = {type: "listitem", itemTitle: title, variableName: this.variableName, children: templateTree}; - if(this.indexName) { - parseTreeNode.index = index.toString(); - parseTreeNode.indexName = this.indexName; + if(this.counterName) { + parseTreeNode.counter = (index + 1).toString(); + parseTreeNode.counterName = this.counterName; parseTreeNode.isFirst = index === 0; parseTreeNode.isLast = index === this.list.length - 1; } @@ -150,7 +150,7 @@ ListWidget.prototype.refresh = function(changedTiddlers) { this.storyview.refreshStart(changedTiddlers,changedAttributes); } // Completely refresh if any of our attributes have changed - if(changedAttributes.filter || changedAttributes.variable || changedAttributes.index || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) { + if(changedAttributes.filter || changedAttributes.variable || changedAttributes.counter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) { this.refreshSelf(); result = true; } else { @@ -219,9 +219,9 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) { this.removeChildDomNodes(); this.children = []; } - // If we are providing an index variable then we must refresh the items, otherwise we can rearrange them + // If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them var hasRefreshed = false,t; - if(this.indexName) { + if(this.counterName) { // Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items for(t=0; t<this.list.length; t++) { if(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) { @@ -337,10 +337,10 @@ Compute the internal state of the widget ListItemWidget.prototype.execute = function() { // Set the current list item title this.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle); - if(this.parseTreeNode.indexName) { - this.setVariable(this.parseTreeNode.indexName,this.parseTreeNode.index); - this.setVariable(this.parseTreeNode.indexName + "-first",this.parseTreeNode.isFirst ? "yes" : "no"); - this.setVariable(this.parseTreeNode.indexName + "-last",this.parseTreeNode.isLast ? "yes" : "no"); + if(this.parseTreeNode.counterName) { + this.setVariable(this.parseTreeNode.counterName,this.parseTreeNode.counter); + this.setVariable(this.parseTreeNode.counterName + "-first",this.parseTreeNode.isFirst ? "yes" : "no"); + this.setVariable(this.parseTreeNode.counterName + "-last",this.parseTreeNode.isLast ? "yes" : "no"); } // Construct the child widgets this.makeChildWidgets(); diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index 72ef2f9b4..bd766fe7e 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -351,7 +351,7 @@ describe("Widget module", function() { }); - it("should deal with the list widget using an index variable", function() { + it("should deal with the list widget using a counter variable", function() { var wiki = new $tw.Wiki(); // Add some tiddlers wiki.addTiddlers([ @@ -361,12 +361,12 @@ describe("Widget module", function() { {title: "TiddlerFour", text: "Lemon Squash"} ]); // Construct the widget node - var text = "<$list index='index'><$view field='text'/><$text text=<<index>>/><$text text=<<index-first>>/><$text text=<<index-last>>/></$list>"; + var text = "<$list counter='index'><$view field='text'/><$text text=<<index>>/><$text text=<<index-first>>/><$text text=<<index-last>>/></$list>"; var widgetNode = createWidgetNode(parseText(text,wiki),wiki); // Render the widget node to the DOM var wrapper = renderWidgetNode(widgetNode); // Test the rendering - expect(wrapper.innerHTML).toBe("<p>Lemon Squash0yesnoJolly Old World1nonoGolly Gosh2nonoWorldly Old Jelly3noyes</p>"); + expect(wrapper.innerHTML).toBe("<p>Lemon Squash1yesnoJolly Old World2nonoGolly Gosh3nonoWorldly Old Jelly4noyes</p>"); // Test the sequence numbers in the DOM expect(wrapper.sequenceNumber).toBe(0); expect(wrapper.children[0].sequenceNumber).toBe(1); @@ -391,7 +391,7 @@ describe("Widget module", function() { // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerFive"]); // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers0yesnoLemon Squash1nonoJolly Old World2nonoGolly Gosh3nonoWorldly Old Jelly4noyes</p>"); + expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers1yesnoLemon Squash2nonoJolly Old World3nonoGolly Gosh4nonoWorldly Old Jelly5noyes</p>"); // Test the sequence numbers in the DOM expect(wrapper.sequenceNumber).toBe(0); expect(wrapper.children[0].sequenceNumber).toBe(1); @@ -420,7 +420,7 @@ describe("Widget module", function() { // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers0yesnoLemon Squash1nonoJolly Old World2nonoWorldly Old Jelly3noyes</p>"); + expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers1yesnoLemon Squash2nonoJolly Old World3nonoWorldly Old Jelly4noyes</p>"); // Test the sequence numbers in the DOM expect(wrapper.sequenceNumber).toBe(0); expect(wrapper.children[0].sequenceNumber).toBe(1); @@ -445,7 +445,7 @@ describe("Widget module", function() { // Refresh refreshWidgetNode(widgetNode,wrapper,["TiddlerThree"]); // Test the refreshing - expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers0yesnoLemon Squash1nonoJolly Old World2nonoSomething3nonoWorldly Old Jelly4noyes</p>"); + expect(wrapper.innerHTML).toBe("<p>Jalapeno Peppers1yesnoLemon Squash2nonoJolly Old World3nonoSomething4nonoWorldly Old Jelly5noyes</p>"); // Test the sequence numbers in the DOM expect(wrapper.sequenceNumber).toBe(0); expect(wrapper.children[0].sequenceNumber).toBe(1); diff --git a/editions/tw5.com/tiddlers/widgets/ListWidget.tid b/editions/tw5.com/tiddlers/widgets/ListWidget.tid index 363d87e2d..01b28ad9e 100644 --- a/editions/tw5.com/tiddlers/widgets/ListWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ListWidget.tid @@ -82,27 +82,27 @@ The action of the list widget depends on the results of the filter combined with |template |The title of a template tiddler for transcluding each tiddler in the list. When no template is specified, the body of the ListWidget serves as the item template. With no body, a simple link to the tiddler is returned. | |editTemplate |An alternative template to use for [[DraftTiddlers|DraftMechanism]] in edit mode | |variable |The name for a [[variable|Variables]] in which the title of each listed tiddler is stored. Defaults to ''currentTiddler'' | -|index |<<.from-version "5.1.24">> Optional name for a [[variable|Variables]] in which the numeric index of each listed tiddler is stored (see below) | +|counter |<<.from-version "5.1.24">> Optional name for a [[variable|Variables]] in which the 1-based numeric index of each listed tiddler is stored (see below) | |emptyMessage |Message to be displayed when the list is empty | |storyview |Optional name of module responsible for animating/processing the list | |history |The title of the tiddler containing the navigation history | -!! `index` attribute +!! `counter` attribute -The optional `index` attribute specifies the name of a variable to hold the numeric index of the current item in the list. +The optional `counter` attribute specifies the name of a variable to hold the 1-based numeric index of the current item in the list. Two additional variables are also set to indicate the first and last items in the list: -* `<index-variable-name>-first` is set to `yes` for the first entry in the list, `no` for the others -* `<index-variable-name>-last` is set to `yes` for the last entry in the list, `no` for the others +* `<counter-variable-name>-first` is set to `yes` for the first entry in the list, `no` for the others +* `<counter-variable-name>-last` is set to `yes` for the last entry in the list, `no` for the others For example: ``` -<$list filter="[tag[About]sort[title]]" index="index"> +<$list filter="[tag[About]sort[title]]" counter="counter"> <div> -<<index>>: ''<$text text=<<currentTiddler>>/>'' (is first: <<index-first>>, is last: <<index-last>>) +<<counter>>: ''<$text text=<<currentTiddler>>/>'' (is first: <<counter-first>>, is last: <<counter-last>>) </div> </$list> ``` @@ -110,14 +110,14 @@ For example: Displays as: <<< -<$list filter="[tag[About]sort[title]]" index="index"> +<$list filter="[tag[About]sort[title]]" counter="counter"> <div> -<<index>>: ''<$text text=<<currentTiddler>>/>'' (is first: <<index-first>>, is last: <<index-last>>) +<<counter>>: ''<$text text=<<currentTiddler>>/>'' (is first: <<counter-first>>, is last: <<counter-last>>) </div> </$list> <<< -Note that using the `index` attribute degrades the performance of the list widget because it prevents the optimisation of refreshes by moving list items around instead of rerendering them. +Note that using the `counter` attribute degrades the performance of the list widget because it prevents the optimisation of refreshes by moving list items around instead of rerendering them. !! Edit mode From bf773eb39a5900aaaf11987c74a2b49f7a264083 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston <jeremy@jermolene.com> Date: Tue, 27 Apr 2021 10:09:13 +0100 Subject: [PATCH 1309/2376] Add "average" filter operator for arithmetic mean (#5612) --- core/modules/filters/math.js | 80 +++++++++++++++++-- .../tiddlers/tests/test-prefixes-filter.js | 22 +++++ .../filters/Mathematics Operators.tid | 3 +- editions/tw5.com/tiddlers/filters/average.tid | 13 +++ .../examples/average Operator (Examples).tid | 10 +++ .../examples/median Operator (Examples).tid | 10 +++ ...standard-deviation Operator (Examples).tid | 10 +++ .../examples/variance Operator (Examples).tid | 10 +++ editions/tw5.com/tiddlers/filters/median.tid | 13 +++ .../filters/standard-deviation Operator.tid | 15 ++++ .../tiddlers/filters/variance Operator.tid | 15 ++++ 11 files changed, 193 insertions(+), 8 deletions(-) create mode 100644 editions/tw5.com/tiddlers/filters/average.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/average Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/median Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/standard-deviation Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/variance Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/median.tid create mode 100644 editions/tw5.com/tiddlers/filters/standard-deviation Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/variance Operator.tid diff --git a/core/modules/filters/math.js b/core/modules/filters/math.js index f52a8c678..9e767c362 100644 --- a/core/modules/filters/math.js +++ b/core/modules/filters/math.js @@ -125,6 +125,54 @@ exports.minall = makeNumericReducingOperator( Infinity // Initial value ); +exports.median = makeNumericArrayOperator( + function(values) { + var len = values.length, median; + values.sort(); + if(len % 2) { + // Odd, return the middle number + median = values[(len - 1) / 2]; + } else { + // Even, return average of two middle numbers + median = (values[len / 2 - 1] + values[len / 2]) / 2; + } + return [median]; + } +); + +exports.average = makeNumericReducingOperator( + function(accumulator,value) {return accumulator + value}, + 0, // Initial value + function(finalValue,numberOfValues) { + return finalValue/numberOfValues; + } +); + +exports.variance = makeNumericReducingOperator( + function(accumulator,value) {return accumulator + value}, + 0, + function(finalValue,numberOfValues,originalValues) { + return getVarianceFromArray(originalValues,finalValue/numberOfValues); + } +); + +exports["standard-deviation"] = makeNumericReducingOperator( + function(accumulator,value) {return accumulator + value}, + 0, + function(finalValue,numberOfValues,originalValues) { + var variance = getVarianceFromArray(originalValues,finalValue/numberOfValues); + return Math.sqrt(variance); + } +); + +//Calculate the variance of a population of numbers in an array given its mean +function getVarianceFromArray(values,mean) { + var deviationTotal = values.reduce(function(accumulator,value) { + return accumulator + Math.pow(value - mean, 2); + },0); + return deviationTotal/values.length; +}; + function makeNumericBinaryOperator(fnCalc) { return function(source,operator,options) { var result = [], @@ -134,19 +182,37 @@ function makeNumericBinaryOperator(fnCalc) { }); return result; }; -} +}; -function makeNumericReducingOperator(fnCalc,initialValue) { +function makeNumericReducingOperator(fnCalc,initialValue,fnFinal) { initialValue = initialValue || 0; return function(source,operator,options) { var result = []; source(function(tiddler,title) { - result.push(title); + result.push($tw.utils.parseNumber(title)); }); - return [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) { - return fnCalc(accumulator,$tw.utils.parseNumber(currentValue)); - },initialValue))]; + var value = result.reduce(function(accumulator,currentValue) { + return fnCalc(accumulator,currentValue); + },initialValue); + if(fnFinal) { + value = fnFinal(value,result.length,result); + } + return [$tw.utils.stringifyNumber(value)]; }; -} +}; + +function makeNumericArrayOperator(fnCalc) { + return function(source,operator,options) { + var results = []; + source(function(tiddler,title) { + results.push($tw.utils.parseNumber(title)); + }); + results = fnCalc(results); + $tw.utils.each(results,function(value,index) { + results[index] = $tw.utils.stringifyNumber(value); + }); + return results; + }; +}; })(); diff --git a/editions/test/tiddlers/tests/test-prefixes-filter.js b/editions/test/tiddlers/tests/test-prefixes-filter.js index c089734b5..fb8979a83 100644 --- a/editions/test/tiddlers/tests/test-prefixes-filter.js +++ b/editions/test/tiddlers/tests/test-prefixes-filter.js @@ -298,6 +298,28 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { expect(wiki.filterTiddlers("[tag[non-existent]reduce<add-price>else[0]]",anchorWidget).join(",")).toBe("0"); }); + it("should handle the average operator", function() { + expect(wiki.filterTiddlers("[tag[shopping]get[price]average[]]").join(",")).toBe("2.3575"); + expect(parseFloat(wiki.filterTiddlers("[tag[food]get[price]average[]]").join(","))).toBeCloseTo(3.155); + }); + + it("should handle the median operator", function() { + expect(parseFloat(wiki.filterTiddlers("[tag[shopping]get[price]median[]]").join(","))).toBeCloseTo(1.99); + expect(parseFloat(wiki.filterTiddlers("[tag[food]get[price]median[]]").join(","))).toBeCloseTo(3.155); + }); + + it("should handle the variance operator", function() { + expect(parseFloat(wiki.filterTiddlers("[tag[shopping]get[price]variance[]]").join(","))).toBeCloseTo(2.92); + expect(parseFloat(wiki.filterTiddlers("[tag[food]get[price]variance[]]").join(","))).toBeCloseTo(3.367); + expect(wiki.filterTiddlers(" +[variance[]]").toString()).toBe("NaN"); + }); + + it("should handle the standard-deviation operator", function() { + expect(parseFloat(wiki.filterTiddlers("[tag[shopping]get[price]standard-deviation[]]").join(","))).toBeCloseTo(1.71); + expect(parseFloat(wiki.filterTiddlers("[tag[food]get[price]standard-deviation[]]").join(","))).toBeCloseTo(1.835); + expect(wiki.filterTiddlers(" +[standard-deviation[]]").toString()).toBe("NaN"); + }); + it("should handle the :intersection prefix", function() { expect(wiki.filterTiddlers("[[Sparkling water]tags[]] :intersection[[Red wine]tags[]]").join(",")).toBe("drinks,textexample"); expect(wiki.filterTiddlers("[[Brownies]tags[]] :intersection[[Chocolate Cake]tags[]]").join(",")).toBe("food"); diff --git a/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid b/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid index 2040e0293..a0651ea8c 100644 --- a/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid +++ b/editions/tw5.com/tiddlers/filters/Mathematics Operators.tid @@ -1,5 +1,5 @@ created: 20190206140446821 -modified: 20190611155838557 +modified: 20210417090408263 tags: Filters title: Mathematics Operators type: text/vnd.tiddlywiki @@ -26,6 +26,7 @@ The mathematics operators take three different forms: * ''Reducing operators'' apply an operation to all of the numbers in the input list, returning a single result (e.g. sum, product) ** <<.inline-operator-example "=1 =2 =3 =4 +[sum[]]">> ** <<.inline-operator-example "=1 =2 =3 =4 +[product[]]">> +** <<.inline-operator-example "=1 =2 =3 =4 +[average[]]">> Operators can be combined: diff --git a/editions/tw5.com/tiddlers/filters/average.tid b/editions/tw5.com/tiddlers/filters/average.tid new file mode 100644 index 000000000..36f39be1d --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/average.tid @@ -0,0 +1,13 @@ +caption: average +created: 20210417090137714 +modified: 20210426131553482 +op-input: a [[selection of titles|Title Selection]] +op-output: the arithmetic mean of the input as numbers +op-purpose: treating each input title as a number, compute their arithmetic mean +tags: [[Reducing Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: average Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.24">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "average">> diff --git a/editions/tw5.com/tiddlers/filters/examples/average Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/average Operator (Examples).tid new file mode 100644 index 000000000..68fb03694 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/average Operator (Examples).tid @@ -0,0 +1,10 @@ +created: 20210426130837644 +modified: 20210426131553546 +tags: [[Operator Examples]] [[average Operator]] +title: average Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "=1 =3 =4 =5 +[average[]]">> + +Note that if there is no input the operator returns `NaN` +<<.operator-example 2 "[tag[NotATiddler]get[price]] +[average[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/median Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/median Operator (Examples).tid new file mode 100644 index 000000000..ed76964b3 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/median Operator (Examples).tid @@ -0,0 +1,10 @@ +created: 20210426131042769 +modified: 20210426131553560 +tags: [[Operator Examples]] [[median Operator]] +title: median Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "=1 =3 =4 =5 +[median[]]">> + +Note that if there is no input the operator returns `NaN` +<<.operator-example 2 "[title[NotATiddler]get[price]] +[median[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/standard-deviation Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/standard-deviation Operator (Examples).tid new file mode 100644 index 000000000..4290287d8 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/standard-deviation Operator (Examples).tid @@ -0,0 +1,10 @@ +created: 20210426130306824 +modified: 20210426131553553 +tags: [[Operator Examples]] [[standard-deviation Operator]] +title: standard-deviation Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "=1 =3 =4 =5 +[standard-deviation[]]">> + +Note that if there is no input the operator returns `NaN` +<<.operator-example 2 "[title[NotATiddler]get[price]] +[standard-deviation[]]">> diff --git a/editions/tw5.com/tiddlers/filters/examples/variance Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/variance Operator (Examples).tid new file mode 100644 index 000000000..fd0ad07a8 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/variance Operator (Examples).tid @@ -0,0 +1,10 @@ +created: 20210426130620777 +modified: 20210426131553522 +tags: [[Operator Examples]] [[variance Operator]] +title: variance Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "1 3 4 5 +[variance[]]">> + +Note that if there is no input the operator returns `NaN` +<<.operator-example 2 "[title[NotATiddler]is[tiddler]get[price]] +[variance[]]">> diff --git a/editions/tw5.com/tiddlers/filters/median.tid b/editions/tw5.com/tiddlers/filters/median.tid new file mode 100644 index 000000000..da8b6acc4 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/median.tid @@ -0,0 +1,13 @@ +caption: median +created: 20210417090137714 +modified: 20210426131553507 +op-input: a [[selection of titles|Title Selection]] +op-output: the median of the input numbers +op-purpose: treating each input title as a number, compute their median value +tags: [[Filter Operators]] [[Mathematics Operators]] +title: median Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.24">> See [[Mathematics Operators]] for an overview. + +<<.operator-examples "median">> diff --git a/editions/tw5.com/tiddlers/filters/standard-deviation Operator.tid b/editions/tw5.com/tiddlers/filters/standard-deviation Operator.tid new file mode 100644 index 000000000..125c043b1 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/standard-deviation Operator.tid @@ -0,0 +1,15 @@ +caption: standard-deviation +created: 20210426130150358 +modified: 20210426131553530 +op-input: a [[selection of titles|Title Selection]] +op-output: the standard-deviation of the input as numbers +op-purpose: treating each input title as a number, compute their standard-deviation +tags: [[Reducing Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: standard-deviation Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.24">> See [[Mathematics Operators]] for an overview. + +<<.tip """ The `standard-deviation` operator treats the input as a complete population and not a sample""">> + +<<.operator-examples "standard-deviation">> diff --git a/editions/tw5.com/tiddlers/filters/variance Operator.tid b/editions/tw5.com/tiddlers/filters/variance Operator.tid new file mode 100644 index 000000000..913eb2943 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/variance Operator.tid @@ -0,0 +1,15 @@ +caption: variance +created: 20210426130029500 +modified: 20210426131553539 +op-input: a [[selection of titles|Title Selection]] +op-output: the variance of the input as numbers +op-purpose: treating each input title as a number, compute their variance +tags: [[Reducing Mathematics Operators]] [[Filter Operators]] [[Mathematics Operators]] +title: variance Operator +type: text/vnd.tiddlywiki + +<<.from-version "5.1.24">> See [[Mathematics Operators]] for an overview. + +<<.tip """ The `standard-deviation` operator treats the input as a complete population and not a sample""">> + +<<.operator-examples "variance">> From 30d23196b64fa61735938d297e3dbd4e6ef964e5 Mon Sep 17 00:00:00 2001 From: Simon Baird <simon.baird@gmail.com> Date: Tue, 27 Apr 2021 05:14:04 -0400 Subject: [PATCH 1310/2376] Add 401 and 403 error messages for the put saver (#5638) --- core/language/en-GB/Misc.multids | 4 +++- core/modules/savers/put.js | 9 ++++++--- languages/ar-PS/Misc.multids | 2 +- languages/ca-ES/Misc.multids | 2 +- languages/de-DE/Misc.multids | 2 +- languages/el-GR/Misc.multids | 2 +- languages/fa-IR/Misc.multids | 2 +- languages/fr-FR/Misc.multids | 2 +- languages/nl-NL/Misc.multids | 2 +- languages/pt-PT/Misc.multids | 2 +- languages/sl-SI/Misc.multids | 2 +- languages/zh-Hans/Misc.multids | 2 +- languages/zh-Hant/Misc.multids | 2 +- 13 files changed, 20 insertions(+), 15 deletions(-) diff --git a/core/language/en-GB/Misc.multids b/core/language/en-GB/Misc.multids index 81c5758cc..441439640 100644 --- a/core/language/en-GB/Misc.multids +++ b/core/language/en-GB/Misc.multids @@ -24,7 +24,6 @@ Encryption/RepeatPassword: Repeat password Encryption/PasswordNoMatch: Passwords do not match Encryption/SetPassword: Set password Error/Caption: Error -Error/EditConflict: File changed on server Error/Filter: Filter error Error/FilterSyntax: Syntax error in filter expression Error/FilterRunPrefix: Filter Error: Unknown prefix for filter run @@ -32,6 +31,9 @@ Error/IsFilterOperator: Filter Error: Unknown operand for the 'is' filter operat Error/FormatFilterOperator: Filter Error: Unknown suffix for the 'format' filter operator Error/LoadingPluginLibrary: Error loading plugin library Error/NetworkErrorAlert: `<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.` +Error/PutEditConflict: File changed on server +Error/PutForbidden: Permission denied +Error/PutUnauthorized: Authentication required Error/RecursiveTransclusion: Recursive transclusion error in transclude widget Error/RetrievingSkinny: Error retrieving skinny tiddler list Error/SavingToTWEdit: Error saving to TWEdit diff --git a/core/modules/savers/put.js b/core/modules/savers/put.js index 771f21c0e..a6c27c891 100644 --- a/core/modules/savers/put.js +++ b/core/modules/savers/put.js @@ -89,9 +89,12 @@ PutSaver.prototype.save = function(text,method,callback) { if(err) { // response is textual: "XMLHttpRequest error code: 412" var status = Number(err.substring(err.indexOf(':') + 2, err.length)) - if(status === 412) { // edit conflict - var message = $tw.language.getString("Error/EditConflict"); - callback(message); + if(status === 412) { // file changed on server + callback($tw.language.getString("Error/PutEditConflict")); + } else if(status === 401) { // authentication required + callback($tw.language.getString("Error/PutUnauthorized")); + } else if(status === 403) { // permission denied + callback($tw.language.getString("Error/PutForbidden")); } else { callback(err); // fail } diff --git a/languages/ar-PS/Misc.multids b/languages/ar-PS/Misc.multids index 0a129e710..ce941b5a4 100644 --- a/languages/ar-PS/Misc.multids +++ b/languages/ar-PS/Misc.multids @@ -24,7 +24,6 @@ Encryption/RepeatPassword: كرر/ي كلمة السر Encryption/SetPassword: ضبط كلمة السر Encryption/Username: اسم المستخدم Error/Caption: خطأ -Error/EditConflict: تم تغيير الملف على الخادم Error/Filter: خطأ في التصفية Error/FilterSyntax: خطأ في بناء الجملة في تعبير عامل التصفية Error/IsFilterOperator: خطأ في التصفية: معامل غير معروف لعامل التصفية 'is' @@ -32,6 +31,7 @@ Error/IsFilterOperator: خطأ في التصفية: معامل غير معروف Error/LoadingPluginLibrary: خطأ في تحميل مكتبة المكونات الإضافية Error/NetworkErrorAlert: `<h2>''خطأ في الشبكة''</h2> يبدو أن الاتصال بالخادم قد انقطع. قد يشير هذا إلى وجود مشكلة في اتصال الشبكة. يرجى محاولة استعادة اتصال الشبكة قبل المتابعة. <br> <br> '' ستتم مزامنة أي تغييرات غير محفوظة تلقائيًا عند استعادة الاتصال ''. +Error/PutEditConflict: تم تغيير الملف على الخادم Error/WhileSaving: حدث خطأ أثناء الحفظ InternalJavaScriptError/Hint: حسنا، هذا أمر محرج. من المستحسن إعادة تشغيل تدلي ويكي عن طريق إنعاش المتصفح الخاص بك diff --git a/languages/ca-ES/Misc.multids b/languages/ca-ES/Misc.multids index 814270edc..dc2064dde 100644 --- a/languages/ca-ES/Misc.multids +++ b/languages/ca-ES/Misc.multids @@ -22,12 +22,12 @@ Encryption/RepeatPassword: Repetiu la contrasenya Encryption/SetPassword: Indiqueu la contrasenya Encryption/Username: Usuari Error/Caption: S'ha produït un error -Error/EditConflict: El fitxer ha canviat al servidor Error/Filter: S'ha produït un error del filtre Error/FilterSyntax: S'ha produït un error de sintaxi en l'expressió del filtre Error/IsFilterOperator: S'ha produït un error del filtre: operant desconegut per a l’operador de filtre "is" Error/LoadingPluginLibrary: S'ha produït un error en carregar la biblioteca del connector Error/NetworkErrorAlert: `<h2>''Error de la xarxa''</h2>Sembla que s'ha perdut la connexió amb el servidor. Això pot indicar un problema amb la vostra connexió de la xarxa. Intenteu restaurar la connectivitat de xarxa abans de continuar.<br><br>' Qualsevol canvi no guardat es sincronitzarà automàticament quan es restableixi la connectivitat''.' +Error/PutEditConflict: El fitxer ha canviat al servidor Error/RecursiveTransclusion: S'ha produït un error de transclusió recursiva en el widget de transclusió Error/RetrievingSkinny: S'ha produït un error en recuperar la llista de tiddler parcials Error/SavingToTWEdit: S'ha produït un error en desar a TWEdit diff --git a/languages/de-DE/Misc.multids b/languages/de-DE/Misc.multids index 936a1fc0b..f2b4be57e 100644 --- a/languages/de-DE/Misc.multids +++ b/languages/de-DE/Misc.multids @@ -24,7 +24,6 @@ Encryption/RepeatPassword: Passwort wiederholen Encryption/PasswordNoMatch: Passwörter stimmen nicht überein Encryption/SetPassword: Passwort setzen Error/Caption: Fehler -Error/EditConflict: Datei auf Server verändert Error/Filter: Filter Fehler Error/FilterSyntax: Syntax Fehler im Filter-Ausdruck Error/FilterRunPrefix: Filter Fehler: Unbekanntes Prefix für Filter lauf @@ -32,6 +31,7 @@ Error/IsFilterOperator: Filter Fehler: Unbekannter Operand für den 'is' Filter Error/FormatFilterOperator: Filter Fehler: Unbekannter Operand für den 'format' Filter Operator Error/LoadingPluginLibrary: Fehler beim Laden der "plugin library" Error/NetworkErrorAlert: `<h2>''Netzwerk Fehler''</h2>Es scheint, die Verbindung zum Server ist ausgefallen. Das weist auf Probleme mit der Netzwerkverbindung hin. Bitte versuchen Sie die Verbingung wider herzustellen, bevor Sie weitermachen.<br><br>''Nicht gespeicherte Änderungen werden automatich synchronisiert, sobald die Verbindung wider hergestellt ist. +Error/PutEditConflict: Datei auf Server verändert Error/RecursiveTransclusion: Recursive Transclusion: Fehler im "transclude widget" Error/RetrievingSkinny: Fehler beim Empfangen einer "skinny" Tiddler Liste Error/SavingToTWEdit: Fehler beim Speichern mit "TWEdit" diff --git a/languages/el-GR/Misc.multids b/languages/el-GR/Misc.multids index 41a27342c..989ea87ed 100644 --- a/languages/el-GR/Misc.multids +++ b/languages/el-GR/Misc.multids @@ -22,11 +22,11 @@ Encryption/RepeatPassword: Επαναλάβατε το συνθηματικό Encryption/SetPassword: Ορίστε το συνθηματικό Encryption/Username: Όνομα χρήστη Error/Caption: Σφάλμα -Error/EditConflict: Το αρχείο στον εξυπηρετητή είναι διαφορετικό Error/Filter: Σφάλμα φίλτρου Error/FilterSyntax: Συντακτικό σφάλμα στην έκφραση του φίλτρου Error/IsFilterOperator: Σφάλμα φίλτρου: Άγνωστος τελεστέος για τον τελεστή φίλτρου 'is' Error/LoadingPluginLibrary: Σφάλμα κατά την φόρτωση της βιβλιοθήκης του πρόσθετου +Error/PutEditConflict: Το αρχείο στον εξυπηρετητή είναι διαφορετικό Error/RecursiveTransclusion: Σφάλμα αναδρομής σε transclusion στο transclude widget Error/RetrievingSkinny: Σφάλμα κατά την ανάκληση της skinny tiddler λίστας Error/SavingToTWEdit: Σφάλμα κατά την αποθήκευση στο TWEdit diff --git a/languages/fa-IR/Misc.multids b/languages/fa-IR/Misc.multids index 4fef47264..56c2a7ba5 100644 --- a/languages/fa-IR/Misc.multids +++ b/languages/fa-IR/Misc.multids @@ -22,11 +22,11 @@ Encryption/RepeatPassword: تکرار رمز Encryption/SetPassword: تعیین رمز Encryption/Username: نام کاربری Error/Caption: خطا -Error/EditConflict: فایل در سرور عوض شد Error/Filter: خطای فیلتر Error/FilterSyntax: در نحوه‌ی بیان فیلتر خطای نحوی وجود داشت Error/IsFilterOperator: خطای فیلتر: عملکرد ناشناخته‌ای برای عملگر 'is' مشخص شده Error/LoadingPluginLibrary: خطا در بارگزاری کتاب‌خانه افزونه +Error/PutEditConflict: فایل در سرور عوض شد Error/RecursiveTransclusion: Recursive transclusion error in transclude widget Error/RetrievingSkinny: طا در دریافت لیست‌های تیدلر لاغر Error/SavingToTWEdit: خطا در ذخیره در TWEdit diff --git a/languages/fr-FR/Misc.multids b/languages/fr-FR/Misc.multids index 04954a615..ddcc5a589 100644 --- a/languages/fr-FR/Misc.multids +++ b/languages/fr-FR/Misc.multids @@ -23,7 +23,6 @@ Encryption/RepeatPassword: Répéter le mot de passe Encryption/PasswordNoMatch: Les mots de passe ne correspondent pas Encryption/SetPassword: Définir ce mot de passe Error/Caption: Erreur -Error/EditConflict: Le fichier a changé sur le serveur Error/Filter: Erreur de filtre Error/FilterSyntax: Erreur de syntaxe dans l'expression du filtre Error/FilterRunPrefix: Erreur de filtre : Préfixe de run inconnu pour le filtre @@ -31,6 +30,7 @@ Error/IsFilterOperator: Erreur de filtre : Opérande inconnu pour l'opérateur d Error/FormatFilterOperator: Erreur de filtre : Suffixe inconnu pour l'opérateur de filtre 'format' Error/LoadingPluginLibrary: Erreur lors du chargement de la bibliothèque de plugins Error/NetworkErrorAlert: `<h2>''Erreur Réseau''</h2>Il semble que la connexion au serveur soit perdue. Cela peut indiquer un problème avec votre connexion réseau. Essayez de rétablir la connectivité du réseau avant de continuer.<br><br>''Toute modification non enregistrée sera automatiquement synchronisée lorsque la connectivité sera rétablie''.` +Error/PutEditConflict: Le fichier a changé sur le serveur Error/RecursiveTransclusion: Erreur dans le widget //transclude// : transclusion récursive Error/RetrievingSkinny: Erreur pendant la récupération de la liste des tiddlers partiels Error/SavingToTWEdit: Erreur lors de l'enregistrement vers TWEdit diff --git a/languages/nl-NL/Misc.multids b/languages/nl-NL/Misc.multids index 958817def..191d77c54 100644 --- a/languages/nl-NL/Misc.multids +++ b/languages/nl-NL/Misc.multids @@ -23,7 +23,6 @@ Encryption/RepeatPassword: Herhaal wachtwoord Encryption/SetPassword: Vul wachtwoord in Encryption/Username: Gebruikersnaam Error/Caption: Fout -Error/EditConflict: Bestand gewijzigd op server Error/Filter: Filterfout Error/FilterRunPrefix: Filterfout: Onbekend voorvoegsel voor filter 'run' Error/FilterSyntax: Syntaxfout in filter expressie @@ -31,6 +30,7 @@ Error/FormatFilterOperator: Filterfout: Onbekend achtervoegsel voor de 'format' Error/IsFilterOperator: Filterfout: Onbekende operand voor het 'is' filter Error/LoadingPluginLibrary: Fout bij laden van de pluginbibliotheek Error/NetworkErrorAlert: `<h2>''Network fout''</h2>De verbinding met de server lijkt verbroken. Mogelijk een probleem met de netwerkverbinding. Herstel de netwerkverbinding voordat verder wordt gegaan.<br><br>''Niet opgeslagen veranderingen worden gesynchroniseerd als de verbinding hersteld is''.` +Error/PutEditConflict: Bestand gewijzigd op server Error/RecursiveTransclusion: Recursieve transclusiefout in 'transclude' widget Error/RetrievingSkinny: Fout bij ophalen van de 'skinny' tiddlerlijst Error/SavingToTWEdit: Fout bij opslaan naar TWEdit diff --git a/languages/pt-PT/Misc.multids b/languages/pt-PT/Misc.multids index fc6d9ec08..ba456ebf5 100644 --- a/languages/pt-PT/Misc.multids +++ b/languages/pt-PT/Misc.multids @@ -23,11 +23,11 @@ Encryption/RepeatPassword: Repetir palavra passe Encryption/SetPassword: Definir palavra passe Encryption/Username: Nome de utilizador Error/Caption: Erro -Error/EditConflict: File changed on server Error/Filter: Erro de filtro Error/FilterSyntax: Erro de sintaxe na expressão do filtro Error/IsFilterOperator: Erro de Filtro: Operando desconhecido para o operador de filtro 'is' Error/LoadingPluginLibrary: Erro ao carregar a biblioteca de extensões +Error/PutEditConflict: File changed on server Error/RecursiveTransclusion: Erro de transclusão recursiva na widget de transclusão Error/RetrievingSkinny: Erro ao obter a lista simples de tiddlers Error/SavingToTWEdit: Erro ao gravar em TWEdit diff --git a/languages/sl-SI/Misc.multids b/languages/sl-SI/Misc.multids index e4d977e29..37eae79bc 100644 --- a/languages/sl-SI/Misc.multids +++ b/languages/sl-SI/Misc.multids @@ -22,11 +22,11 @@ Encryption/RepeatPassword: Ponovite geslo Encryption/SetPassword: Nastavite geslo Encryption/Username: Uporabniško ime Error/Caption: Napaka -Error/EditConflict: Datoteka je spremenjena na strežniku Error/Filter: Filter napaka Error/FilterSyntax: Sintaktična napaka v izrazu filtra Error/IsFilterOperator: Filter napaka: neznan operand za 'is' operator filtra Error/LoadingPluginLibrary: Napaka pri nalaganju knjižnice vtičnikov +Error/PutEditConflict: Datoteka je spremenjena na strežniku Error/RecursiveTransclusion: Rekurzivna napaka transkluzije v "transclude widget" Error/RetrievingSkinny: Napaka pri pridobivanju "skinny" seznama tiddlerjev Error/SavingToTWEdit: Napaka pri shranjevanju v TWEdit diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 556e8b492..381f28479 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -24,7 +24,6 @@ Encryption/RepeatPassword: 重复输入密码 Encryption/PasswordNoMatch: 密码不匹配 Encryption/SetPassword: 设定密码 Error/Caption: 错误 -Error/EditConflict: 服务器上的文件已更改 Error/Filter: 筛选器错误 Error/FilterRunPrefix: 筛选器错误:筛选器 run 的未知首码 Error/FilterSyntax: 筛选器运算式中的语法错误 @@ -32,6 +31,7 @@ Error/FormatFilterOperator: 筛选器错误:`format` 筛选器运算符的未 Error/IsFilterOperator: 筛选器错误︰'is' 筛选器运算符的未知操作数 Error/LoadingPluginLibrary: 加载插件程式库时,发生错误 Error/NetworkErrorAlert: `<h2>''网络错误''</h2>与服务器的连缐似乎已中断。这可能表示您的网络连缐有问题。请尝试恢复网路连缐才能继续。<br><br>''恢复连缐时,所有未保存的更改,将自动同步''。` +Error/PutEditConflict: 服务器上的文件已更改 Error/RecursiveTransclusion: 于 transclude 小部件中的递回嵌入错误 Error/RetrievingSkinny: 简要条目清单撷取错误 Error/SavingToTWEdit: 保存到 TWEdit 时,发生错误 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index b9d036826..2707d443e 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -24,7 +24,6 @@ Encryption/RepeatPassword: 重複輸入密碼 Encryption/PasswordNoMatch: 密碼不匹配 Encryption/SetPassword: 設定密碼 Error/Caption: 錯誤 -Error/EditConflict: 伺服器上的檔案已更改 Error/Filter: 篩選器錯誤 Error/FilterRunPrefix: 篩選器錯誤:篩選器 run 的未知首碼 Error/FilterSyntax: 篩選器運算式中的語法錯誤 @@ -32,6 +31,7 @@ Error/FormatFilterOperator: 篩選器錯誤:`format` 篩選器運算子的未 Error/IsFilterOperator: 篩選器錯誤︰'is' 篩選器運算子的未知運算元 Error/LoadingPluginLibrary: 載入插件程式庫時,發生錯誤 Error/NetworkErrorAlert: `<h2>''網路錯誤''</h2>與伺服器的連線似乎已中斷。這可能表示您的網路連線有問題。請嘗試恢復網路連線才能繼續。<br><br>''恢復連線時,所有未儲存的變更,將自動同步''。` +Error/PutEditConflict: 伺服器上的檔案已更改 Error/RecursiveTransclusion: 於 transclude 小工具中的遞迴嵌入錯誤 Error/RetrievingSkinny: 簡要條目清單擷取錯誤 Error/SavingToTWEdit: 儲存到 TWEdit 時,發生錯誤 From 07caa16e8714afe9a64eb202375e4a2f95da1508 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Tue, 27 Apr 2021 11:15:27 +0200 Subject: [PATCH 1311/2376] Extend dropzone to also use the specified deserializer for strings either dropped or pasted on to the dropzone. (#5601) --- core/modules/widgets/dropzone.js | 45 +++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 82cef63e3..70bd2bf2e 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -168,7 +168,23 @@ DropZoneWidget.prototype.handleDropEvent = function(event) { } // Try to import the various data types we understand if(numFiles === 0) { - $tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle("Untitled"),readFileCallback); + var fallbackTitle = self.wiki.generateNewTitle("Untitled"); + //Use the deserializer specified if any + if(this.dropzoneDeserializer) { + for(var t= 0; t<dataTransfer.items.length; t++) { + var item = dataTransfer.items[t]; + if(item.kind === "string") { + item.getAsString(function(str){ + var tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: fallbackTitle},{deserializer:self.dropzoneDeserializer}); + if(tiddlerFields && tiddlerFields.length) { + readFileCallback(tiddlerFields); + } + }) + } + } + } else { + $tw.utils.importDataTransfer(dataTransfer,fallbackTitle,readFileCallback); + } } // Tell the browser that we handled the drop event.preventDefault(); @@ -196,17 +212,26 @@ DropZoneWidget.prototype.handlePasteEvent = function(event) { }); } else if(item.kind === "string") { // Create tiddlers from string items - var type = item.type; + var tiddlerFields, + type = item.type; item.getAsString(function(str) { - var tiddlerFields = { - title: self.wiki.generateNewTitle("Untitled"), - text: str, - type: type - }; - if($tw.log.IMPORT) { - console.log("Importing string '" + str + "', type: '" + type + "'"); + // Use the deserializer specified if any + if(self.dropzoneDeserializer) { + tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: self.wiki.generateNewTitle("Untitled")},{deserializer:self.dropzoneDeserializer}); + if(tiddlerFields && tiddlerFields.length) { + readFileCallback(tiddlerFields); + } + } else { + tiddlerFields = { + title: self.wiki.generateNewTitle("Untitled"), + text: str, + type: type + }; + if($tw.log.IMPORT) { + console.log("Importing string '" + str + "', type: '" + type + "'"); + } + readFileCallback([tiddlerFields]); } - readFileCallback([tiddlerFields]); }); } } From cb34c695b5c800eae3ee183365d437e72c9499f0 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 28 Apr 2021 21:22:23 +0800 Subject: [PATCH 1312/2376] Update chinese error messages for the put saver (#5650) --- languages/zh-Hans/Misc.multids | 2 ++ languages/zh-Hant/Misc.multids | 2 ++ 2 files changed, 4 insertions(+) diff --git a/languages/zh-Hans/Misc.multids b/languages/zh-Hans/Misc.multids index 381f28479..221e3d48f 100644 --- a/languages/zh-Hans/Misc.multids +++ b/languages/zh-Hans/Misc.multids @@ -32,6 +32,8 @@ Error/IsFilterOperator: 筛选器错误︰'is' 筛选器运算符的未知操作 Error/LoadingPluginLibrary: 加载插件程式库时,发生错误 Error/NetworkErrorAlert: `<h2>''网络错误''</h2>与服务器的连缐似乎已中断。这可能表示您的网络连缐有问题。请尝试恢复网路连缐才能继续。<br><br>''恢复连缐时,所有未保存的更改,将自动同步''。` Error/PutEditConflict: 服务器上的文件已更改 +Error/PutForbidden: 没有权限 +Error/PutUnauthorized: 需要身分验证 Error/RecursiveTransclusion: 于 transclude 小部件中的递回嵌入错误 Error/RetrievingSkinny: 简要条目清单撷取错误 Error/SavingToTWEdit: 保存到 TWEdit 时,发生错误 diff --git a/languages/zh-Hant/Misc.multids b/languages/zh-Hant/Misc.multids index 2707d443e..5b12d1521 100644 --- a/languages/zh-Hant/Misc.multids +++ b/languages/zh-Hant/Misc.multids @@ -32,6 +32,8 @@ Error/IsFilterOperator: 篩選器錯誤︰'is' 篩選器運算子的未知運算 Error/LoadingPluginLibrary: 載入插件程式庫時,發生錯誤 Error/NetworkErrorAlert: `<h2>''網路錯誤''</h2>與伺服器的連線似乎已中斷。這可能表示您的網路連線有問題。請嘗試恢復網路連線才能繼續。<br><br>''恢復連線時,所有未儲存的變更,將自動同步''。` Error/PutEditConflict: 伺服器上的檔案已更改 +Error/PutForbidden: 沒有權限 +Error/PutUnauthorized: 需要身份驗證 Error/RecursiveTransclusion: 於 transclude 小工具中的遞迴嵌入錯誤 Error/RetrievingSkinny: 簡要條目清單擷取錯誤 Error/SavingToTWEdit: 儲存到 TWEdit 時,發生錯誤 From 41200ab6d76ef6cf9424c3a79a5e01b63ea95b05 Mon Sep 17 00:00:00 2001 From: Chris Nicoll <clutterstack@users.noreply.github.com> Date: Thu, 29 Apr 2021 08:14:28 -0400 Subject: [PATCH 1313/2376] Fix #5310: docs for unique[] filter operator (#5651) Co-authored-by: clutterstack <clutterstack@gmail.com> --- .../filters/examples/unique Operator (Examples).tid | 8 ++++++++ editions/tw5.com/tiddlers/filters/unique.tid | 10 ++++++++++ 2 files changed, 18 insertions(+) create mode 100644 editions/tw5.com/tiddlers/filters/examples/unique Operator (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/unique.tid diff --git a/editions/tw5.com/tiddlers/filters/examples/unique Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/unique Operator (Examples).tid new file mode 100644 index 000000000..5a3f5d7c0 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/unique Operator (Examples).tid @@ -0,0 +1,8 @@ +created: 20210216203925301 +modified: 20210217003209935 +tags: [[unique Operator]] [[Operator Examples]] +title: unique Operator (Examples) + +To remove duplicate entries from a list where deduplication has been prevented using the [[filter run prefix|Filter Expression]] `=`: + +<<.operator-example 1 """=[[E]] =[[A]] =[[B]] =[[C]] =[[C]] =[[D]] =[[C]] +[unique[]]""">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/unique.tid b/editions/tw5.com/tiddlers/filters/unique.tid new file mode 100644 index 000000000..672817968 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/unique.tid @@ -0,0 +1,10 @@ +caption: unique +op-input: a list of items +op-output: a list of unique items +op-parameter: ignored +op-purpose: remove all duplicate items from the current list +tags: [[Filter Operators]] [[Order Operators]] [[Listops Operators]] +title: unique Operator +type: text/vnd.tiddlywiki + +<<.operator-examples "unique">> From 44df6fe52f79bee88357afb4fc3d6f4800aa6dde Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 1 May 2021 11:00:32 +0200 Subject: [PATCH 1314/2376] Fixed issue with widget not being available to filter operator, added test (#5640) --- core/modules/filters/filter.js | 2 +- editions/test/tiddlers/tests/test-prefixes-filter.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/modules/filters/filter.js b/core/modules/filters/filter.js index 2e549672b..4be552cff 100644 --- a/core/modules/filters/filter.js +++ b/core/modules/filters/filter.js @@ -20,7 +20,7 @@ exports.filter = function(source,operator,options) { results = [], target = operator.prefix !== "!"; source(function(tiddler,title) { - var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title])); + var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget); if((list.length > 0) === target) { results.push(title); } diff --git a/editions/test/tiddlers/tests/test-prefixes-filter.js b/editions/test/tiddlers/tests/test-prefixes-filter.js index fb8979a83..5546836e3 100644 --- a/editions/test/tiddlers/tests/test-prefixes-filter.js +++ b/editions/test/tiddlers/tests/test-prefixes-filter.js @@ -335,9 +335,12 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { rootWidget.makeChildWidgets(); var anchorWidget = rootWidget.children[0]; rootWidget.setVariable("larger-than-18","[get[text]length[]compare:integer:gteq[18]]"); + rootWidget.setVariable("nr","18"); + rootWidget.setVariable("larger-than-18-with-var","[get[text]length[]compare:integer:gteq<nr>]"); expect(wiki.filterTiddlers("[tag[textexample]] :filter[get[text]length[]compare:integer:gteq[18]]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake"); expect(wiki.filterTiddlers("[tag[textexample]]",anchorWidget).join(",")).toBe("Sparkling water,Red wine,Cheesecake,Chocolate Cake"); expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18>]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake"); + expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18-with-var>]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake"); }) }); From cb44cc0f2bcce36bddef763aa67342aaa86c4a7e Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 1 May 2021 14:58:40 +0200 Subject: [PATCH 1315/2376] Add :sort filter run prefix (#5653) * Add :sort filter run prefix, docs and tests. Also extended .utils.makeCompareFunction with a flag for caseSensitivity. * Documentation updates * Move case sensitivity handling entirely to utils method so it is reusable --- core/modules/filterrunprefixes/sort.js | 58 +++++++++++++++++++ core/modules/utils/utils.js | 17 +++++- editions/test/tiddlers/tests/test-filters.js | 2 + .../tiddlers/tests/test-prefixes-filter.js | 35 ++++++++++- .../tiddlers/filters/sortsub Operator.tid | 21 +++---- .../filters/syntax/Filter Expression.tid | 6 +- .../syntax/Filter Run Prefix (Examples).tid | 8 ++- .../Sort Filter Run Prefix (Examples).tid | 33 +++++++++++ .../filters/syntax/Sort Filter Run Prefix.tid | 32 ++++++++++ 9 files changed, 194 insertions(+), 18 deletions(-) create mode 100644 core/modules/filterrunprefixes/sort.js create mode 100644 editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix (Examples).tid create mode 100644 editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid diff --git a/core/modules/filterrunprefixes/sort.js b/core/modules/filterrunprefixes/sort.js new file mode 100644 index 000000000..689193fff --- /dev/null +++ b/core/modules/filterrunprefixes/sort.js @@ -0,0 +1,58 @@ +/*\ +title: $:/core/modules/filterrunprefixes/sort.js +type: application/javascript +module-type: filterrunprefix + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter prefix function +*/ +exports.sort = function(operationSubFunction,options) { + return function(results,source,widget) { + if(results.length > 0) { + var suffixes = options.suffixes, + sortType = (suffixes[0] && suffixes[0][0]) ? suffixes[0][0] : "string", + invert = suffixes[1] ? (suffixes[1].indexOf("reverse") !== -1) : false, + isCaseSensitive = suffixes[1] ? (suffixes[1].indexOf("casesensitive") !== -1) : false, + inputTitles = results.toArray(), + sortKeys = [], + indexes = new Array(inputTitles.length), + compareFn; + results.each(function(title) { + var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ + getVariable: function(name) { + switch(name) { + case "currentTiddler": + return "" + title; + default: + return widget.getVariable(name); + } + } + }); + sortKeys.push(key[0] || ""); + }); + results.clear(); + // Prepare an array of indexes to sort + for(var t=0; t<inputTitles.length; t++) { + indexes[t] = t; + } + // Sort the indexes + compareFn = $tw.utils.makeCompareFunction(sortType,{defaultType: "string", invert:invert, isCaseSensitive:isCaseSensitive}); + indexes = indexes.sort(function(a,b) { + return compareFn(sortKeys[a],sortKeys[b]); + }); + // Add to results in correct order + $tw.utils.each(indexes,function(index) { + results.push(inputTitles[index]); + }); + } + } +}; + +})(); \ No newline at end of file diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index ecae23ec8..8e028e47c 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -876,7 +876,9 @@ exports.stringifyNumber = function(num) { exports.makeCompareFunction = function(type,options) { options = options || {}; - var gt = options.invert ? -1 : +1, + // set isCaseSensitive to true if not defined in options + var isCaseSensitive = (options.isCaseSensitive === false) ? false : true, + gt = options.invert ? -1 : +1, lt = options.invert ? +1 : -1, compare = function(a,b) { if(a > b) { @@ -895,7 +897,11 @@ exports.makeCompareFunction = function(type,options) { return compare($tw.utils.parseInt(a),$tw.utils.parseInt(b)); }, "string": function(a,b) { - return compare("" + a,"" +b); + if(!isCaseSensitive) { + a = a.toLowerCase(); + b = b.toLowerCase(); + } + return compare("" + a,"" + b); }, "date": function(a,b) { var dateA = $tw.utils.parseDate(a), @@ -910,6 +916,13 @@ exports.makeCompareFunction = function(type,options) { }, "version": function(a,b) { return $tw.utils.compareVersions(a,b); + }, + "alphanumeric": function(a,b) { + if(!isCaseSensitive) { + a = a.toLowerCase(); + b = b.toLowerCase(); + } + return options.invert ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"}); } }; return (types[type] || types[options.defaultType] || types.number); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index ca184a40d..7125e492e 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -750,6 +750,7 @@ function runTests(wiki) { rootWidget.setVariable("sort1","[length[]]"); rootWidget.setVariable("sort2","[get[text]else[]length[]]"); rootWidget.setVariable("sort3","[{!!value}divide{!!cost}]"); + rootWidget.setVariable("sort4","[{!!title}]"); expect(wiki.filterTiddlers("[sortsub:number<sort1>]",anchorWidget).join(",")).toBe("one,hasList,TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test"); expect(wiki.filterTiddlers("[!sortsub:number<sort1>]",anchorWidget).join(",")).toBe("filter regexp test,a fourth tiddler,$:/ShadowPlugin,$:/TiddlerTwo,Tiddler Three,TiddlerOne,has filter,hasList,one"); expect(wiki.filterTiddlers("[sortsub:string<sort1>]",anchorWidget).join(",")).toBe("TiddlerOne,has filter,$:/TiddlerTwo,Tiddler Three,$:/ShadowPlugin,a fourth tiddler,filter regexp test,one,hasList"); @@ -759,6 +760,7 @@ function runTests(wiki) { expect(wiki.filterTiddlers("[sortsub:string<sort2>]",anchorWidget).join(",")).toBe("one,TiddlerOne,hasList,has filter,$:/ShadowPlugin,a fourth tiddler,Tiddler Three,$:/TiddlerTwo,filter regexp test"); expect(wiki.filterTiddlers("[!sortsub:string<sort2>]",anchorWidget).join(",")).toBe("filter regexp test,$:/TiddlerTwo,Tiddler Three,a fourth tiddler,$:/ShadowPlugin,has filter,hasList,TiddlerOne,one"); expect(wiki.filterTiddlers("[[TiddlerOne]] [[$:/TiddlerTwo]] [[Tiddler Three]] [[a fourth tiddler]] +[!sortsub:number<sort3>]",anchorWidget).join(",")).toBe("$:/TiddlerTwo,Tiddler Three,TiddlerOne,a fourth tiddler"); + expect(wiki.filterTiddlers("a1 a10 a2 a3 b10 b3 b1 c9 c11 c1 +[sortsub:alphanumeric<sort4>]",anchorWidget).join(",")).toBe("a1,a2,a3,a10,b1,b3,b10,c1,c9,c11"); }); it("should handle the toggle operator", function() { diff --git a/editions/test/tiddlers/tests/test-prefixes-filter.js b/editions/test/tiddlers/tests/test-prefixes-filter.js index 5546836e3..1c380e347 100644 --- a/editions/test/tiddlers/tests/test-prefixes-filter.js +++ b/editions/test/tiddlers/tests/test-prefixes-filter.js @@ -253,7 +253,7 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { wiki.addTiddler({ title: "Red wine", tags: ["drinks", "wine", "textexample"], - text: "This is some more text" + text: "This is some more text!" }); wiki.addTiddler({ title: "Cheesecake", @@ -265,6 +265,26 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { tags: ["cakes", "food", "textexample"], text: "This is even more text" }); + wiki.addTiddler({ + title: "Persian love cake", + tags: ["cakes"], + text: "An amazing cake worth the effort to make" + }); + wiki.addTiddler({ + title: "cheesecake", + tags: ["cakes"], + text: "Everyone likes cheescake" + }); + wiki.addTiddler({ + title: "chocolate cake", + tags: ["cakes"], + text: "lower case chocolate cake" + }); + wiki.addTiddler({ + title: "Pound cake", + tags: ["cakes","with tea"], + text: "Does anyone eat pound cake?" + }); it("should handle the :reduce filter prefix", function() { expect(wiki.filterTiddlers("[tag[shopping]] :reduce[get[quantity]add<accumulator>]").join(",")).toBe("22"); @@ -341,8 +361,19 @@ describe("'reduce' and 'intersection' filter prefix tests", function() { expect(wiki.filterTiddlers("[tag[textexample]]",anchorWidget).join(",")).toBe("Sparkling water,Red wine,Cheesecake,Chocolate Cake"); expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18>]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake"); expect(wiki.filterTiddlers("[tag[textexample]filter<larger-than-18-with-var>]",anchorWidget).join(",")).toBe("Red wine,Cheesecake,Chocolate Cake"); - }) + }); + it("should handle the :sort prefix", function() { + expect(wiki.filterTiddlers("a1 a10 a2 a3 b10 b3 b1 c9 c11 c1 :sort:alphanumeric[{!!title}]").join(",")).toBe("a1,a2,a3,a10,b1,b3,b10,c1,c9,c11"); + expect(wiki.filterTiddlers("a1 a10 a2 a3 b10 b3 b1 c9 c11 c1 :sort:alphanumeric:reverse[{!!title}]").join(",")).toBe("c11,c9,c1,b10,b3,b1,a10,a3,a2,a1"); + expect(wiki.filterTiddlers("[tag[shopping]] :sort:number:[get[price]]").join(",")).toBe("Milk,Chick Peas,Rice Pudding,Brownies"); + expect(wiki.filterTiddlers("[tag[textexample]] :sort:number:[get[text]length[]]").join(",")).toBe("Sparkling water,Chocolate Cake,Red wine,Cheesecake"); + expect(wiki.filterTiddlers("[tag[textexample]] :sort:number:reverse[get[text]length[]]").join(",")).toBe("Cheesecake,Red wine,Chocolate Cake,Sparkling water"); + expect(wiki.filterTiddlers("[tag[notatag]] :sort:number[get[price]]").join(",")).toBe(""); + expect(wiki.filterTiddlers("[tag[cakes]] :sort:string[{!!title}]").join(",")).toBe("Cheesecake,cheesecake,Chocolate Cake,chocolate cake,Persian love cake,Pound cake"); + expect(wiki.filterTiddlers("[tag[cakes]] :sort:string:casesensitive[{!!title}]").join(",")).toBe("Cheesecake,Chocolate Cake,Persian love cake,Pound cake,cheesecake,chocolate cake"); + expect(wiki.filterTiddlers("[tag[cakes]] :sort:string:casesensitive,reverse[{!!title}]").join(",")).toBe("chocolate cake,cheesecake,Pound cake,Persian love cake,Chocolate Cake,Cheesecake"); + }); }); })(); \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/sortsub Operator.tid b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid index 0e48e29bc..451b979c9 100644 --- a/editions/tw5.com/tiddlers/filters/sortsub Operator.tid +++ b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid @@ -1,17 +1,17 @@ +caption: sortsub created: 20200424160155182 -modified: 20200424160155182 +modified: 20210428152533501 +op-input: a [[selection of titles|Title Selection]] +op-neg-output: the input, sorted into reverse order by the result of evaluating subfilter <<.param S>> +op-output: the input, sorted into ascending order by the result of evaluating subfilter <<.param S>> +op-parameter: a subfilter to be evaluated +op-parameter-name: S +op-purpose: sort the input by the result of evaluating a subfilter for each item +op-suffix: the type used for the comparison (string, number, integer, date, version), defaulting to string +op-suffix-name: T tags: [[Filter Operators]] [[Field Operators]] [[Order Operators]] [[Negatable Operators]] title: sortsub Operator type: text/vnd.tiddlywiki -caption: sortsub -op-purpose: sort the input by the result of evaluating a subfilter for each item -op-input: a [[selection of titles|Title Selection]] -op-parameter: a subfilter to be evaluated -op-parameter-name: S -op-suffix: the type used for the comparison (string, number, integer, date, version), defaulting to string -op-suffix-name: T -op-output: the input, sorted into ascending order by the result of evaluating subfilter <<.param S>> -op-neg-output: the input, sorted into reverse order by the result of evaluating subfilter <<.param S>> Each item in the list of input titles is passed to the subfilter in turn. The subfilter transforms the input titles into the form needed for sorting. For example, the subfilter `[length[]]` transforms each input title in the number representing its length, and thus sorts the input titles according to their length. @@ -24,6 +24,7 @@ The suffix <<.place T>> determines how the items are compared and can be: * "integer" - invalid integers are interpreted as zero * "date" - invalid dates are interpreted as 1st January 1970 * "version" - invalid versions are interpreted as "v0.0.0" +* "alphanumeric" - treat items as alphanumerics <<.from-version "5.1.24">> Note that subfilters should return the same number of items that they are passed. Any missing entries will be treated as zero or the empty string. In particular, when retrieving the value of a field with the [[get Operator]] it is helpful to guard against a missing field value using the [[else Operator]]. For example `[get[myfield]else[default-value]...`. diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index 577ff6181..ec72fbd6a 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20201214053032397 +modified: 20210428084144231 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -26,6 +26,8 @@ If a run has: * named prefix `:intersection` replaces all filter output so far with titles that are present in the output of this run, as well as the output from previous runs. Forms the input for the next run. <<.from-version "5.1.23">> * named prefix `:reduce` replaces all filter output so far with a single item by repeatedly applying a formula to each input title. A typical use is to add up the values in a given field of each input title. <<.from-version "5.1.23">> ** [[Examples|Filter Run Prefix (Examples)]] +* named prefix `:sort` sorts all filter output so far by applying this run to each input title and sorting according to that output. <<.from-version "5.1.24">> +** See [[Sort Filter Run Prefix]]. <<.tip "Compare named filter run prefix `:filter` with [[filter Operator]] which applies a subfilter to every input title, removing the titles that return an empty result from the subfilter">> @@ -47,7 +49,7 @@ The input of a run is normally a list of all the non-[[shadow|ShadowTiddlers]] t |Prefix|Input|h |`-`, `~`, `=`, `:intersection` or none| <$link to="all Operator">`[all[]]`</$link> tiddler titles, unless otherwise determined by the first [[filter operator|Filter Operators]]| -|`+`, `:filter`, `:reduce`|the filter output of all previous runs so far| +|`+`, `:filter`, `:reduce`,`:sort`|the filter output of all previous runs so far| Precisely because of varying inputs, be aware that both prefixes `-` and `+` do not behave inverse to one another! diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid index fde0a1557..970bcc434 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Run Prefix (Examples).tid @@ -1,6 +1,6 @@ created: 20201117073343969 -modified: 20201208185546667 -tags: [[Filter Syntax]] +modified: 20210428084013109 +tags: [[Filter Syntax]] [[Filter Run Prefix Examples]] title: Filter Run Prefix (Examples) type: text/vnd.tiddlywiki @@ -44,3 +44,7 @@ Specifying a default value when input is empty: `[tag[non-existent]] :reduce[get[price]multiply{!!quantity}add<accumulator>] :else[[0]]` <$macrocall $name=".tip" _="""Unlike the [[reduce Operator]], the `:reduce` prefix cannot specify an initial value for the accumulator, so its initial value will always be empty (which is treated as 0 by mathematical operators). So `=1 =2 =3 :reduce[multiply<accumulator>]` will produce 0, not 6. If you need to specify an initial accumulator value, use the [[reduce Operator]]."""/> + +!! `:sort` examples + +See [[Sort Filter Run Prefix (Examples)]] \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix (Examples).tid b/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix (Examples).tid new file mode 100644 index 000000000..73c95643e --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix (Examples).tid @@ -0,0 +1,33 @@ +created: 20210428074912172 +modified: 20210428085746041 +tags: [[Filter Syntax]] [[Sort Filter Run Prefix]] [[Filter Run Prefix Examples]] +title: Sort Filter Run Prefix (Examples) +type: text/vnd.tiddlywiki + +Sort by title length: + +<<.operator-example 1 "[all[tiddlers]] :sort:number[length[]] +[limit[10]]">> + +Sort by title length reversed: + +<<.operator-example 2 "[all[tiddlers]] :sort:number:reverse[length[]] +[limit[10]]">> + +Sort by text length: + +<<.operator-example 3 "[all[tiddlers]] :sort:number[get[text]length[]] +[limit[10]]">> + +Sort by newest of modified dates: + +<<.operator-example 4 "[tag[Field Operators]] :sort:date[get[modified]else[19700101]] +[limit[10]]">> + +Sort by title: +<<.operator-example 5 "[tag[Field Operators]] :sort:string:casesensitive[get[caption]] +[limit[10]]">> + +Sort by title in reverse order: +<<.operator-example 6 "[tag[Field Operators]] :sort:string:casesensitive,reverse[get[caption]] +[limit[10]]">> + +Sort as text with case sensitivity: +<<.operator-example 7 "Apple Banana Orange Grapefruit guava DragonFruit Kiwi apple orange :sort:string:casesensitive[{!!title}]">> + +Sort as text ignoring case: +<<.operator-example 8 "Apple Banana Orange Grapefruit guava DragonFruit Kiwi apple orange :sort:string:caseinsensitive[{!!title}]">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid b/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid new file mode 100644 index 000000000..2fca72716 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid @@ -0,0 +1,32 @@ +created: 20210428083929749 +modified: 20210428140713422 +tags: [[Filter Syntax]] [[Filter Run Prefix]] +title: Sort Filter Run Prefix +type: text/vnd.tiddlywiki + +<<.from-version "5.1.24">> + +|''purpose'' |sort the input titles by the result of evaluating this filter run for each item | +|''input'' |all titles from previous filter runs | +|''suffix'' |the `:sort` filter run prefix uses a rich suffix, see below for details | +|''output''|the sorted result of previous filter runs | + +Each input title from previous runs is passed to this run in turn. The filter run transforms the input titles into the form needed for sorting. For example, the filter run `[length[]]` transforms each input title in to the number representing its length, and thus sorts the input titles according to their length. + +Note that within the filter run, the "currentTiddler" variable is set to the title of the tiddler being processed. This permits filter runs like `:sort:number[{!!value}divide{!!cost}]` to be used for computation. + +The `:sort` filter run prefix uses an extended syntax that allows for multiple suffixes, some of which are required: + +``` +:sort:<type>:<flaglist>[...filter run...] + +``` + +* ''type'': Required. Determines how the items are compared and can be any of: ''string'', ''alphanumeric'', ''number'', ''integer'', ''version'' or ''date''. +* ''flaglist'': comma separated list of the following flags: +** ''casesensitive'' or ''caseinsensitive'' (required for types `string` and `alphanumeric`). +** ''reverse'' to invert the order of the filter run (optional). + +Note that filter runs used with the `:sort` prefix should return the same number of items that they are passed. Any missing entries will be treated as zero or the empty string. In particular, when retrieving the value of a field with the [[get Operator]] it is helpful to guard against a missing field value using the [[else Operator]]. For example `[get[myfield]else[default-value]...`. + +[[Examples|Sort Filter Run Prefix (Examples)]] \ No newline at end of file From 3f986861538a3cc5c3c6da578b45d0d9138a6b2b Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sun, 2 May 2021 11:20:39 +0200 Subject: [PATCH 1316/2376] Extend <-popup> to create floating popups that must be manually cleared (#5655) --- core/modules/widgets/action-popup.js | 4 +++- editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/modules/widgets/action-popup.js b/core/modules/widgets/action-popup.js index af17b3f51..2903532b6 100644 --- a/core/modules/widgets/action-popup.js +++ b/core/modules/widgets/action-popup.js @@ -37,6 +37,7 @@ Compute the internal state of the widget ActionPopupWidget.prototype.execute = function() { this.actionState = this.getAttribute("$state"); this.actionCoords = this.getAttribute("$coords"); + this.floating = this.getAttribute("$floating","no") === "yes"; }; /* @@ -68,7 +69,8 @@ ActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) { height: parseFloat(match[4]) }, title: this.actionState, - wiki: this.wiki + wiki: this.wiki, + floating: this.floating }); } else { $tw.popup.cancel(0); diff --git a/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid index 17fd51531..c6f62982c 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionPopupWidget.tid @@ -1,6 +1,6 @@ caption: action-popup created: 20200303114556528 -modified: 20200421221304177 +modified: 20210501203451387 tags: Widgets ActionWidgets title: ActionPopupWidget type: text/vnd.tiddlywiki @@ -16,9 +16,12 @@ The ''action-popup'' widget is invisible. Any content within it is ignored. |!Attribute |!Description | |$state |The title of the state tiddler for the popup | |$coords |Optional coordinates for the handle to which popup is positioned (in the format `(x,y,w,h)`) | +|$floating |<<.from-version "5.1.24">> Optional. Defaults to `no`. Set to `yes` to create a popup that must be closed explicitly. | <<.from-version "5.1.23">> If the ''$coords'' attribute is missing or empty then all popups are cancelled. +<<.tip "Delete the state tiddler for a floating popup to close it.">> + ! Examples Here is an example of button that triggers the "more" button in the sidebar "Tools" tab. You may need to scroll to see the popup From cf56a17f28f1e44dcb62c5e161be4ac29e27c3f2 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Sun, 2 May 2021 20:26:50 +0200 Subject: [PATCH 1317/2376] allow unusedtitle macro to use the prefix parameter and fix wiki.generateNewTitle() (#5361) --- .../macros/{uniquetitle.js => unusedtitle.js} | 15 +++--- core/modules/utils/utils.js | 41 +++++++++++++++ core/modules/wiki.js | 20 ++++++-- .../tiddlers/macros/UnusedTitleMacro.tid | 32 ++++++++++-- .../unusedtitle Macro (Examples 1).tid | 51 +++++++++++++++++++ .../tiddlers/macros/examples/unusedtitle.tid | 13 ++++- 6 files changed, 154 insertions(+), 18 deletions(-) rename core/modules/macros/{uniquetitle.js => unusedtitle.js} (59%) create mode 100644 editions/tw5.com/tiddlers/macros/examples/unusedtitle Macro (Examples 1).tid diff --git a/core/modules/macros/uniquetitle.js b/core/modules/macros/unusedtitle.js similarity index 59% rename from core/modules/macros/uniquetitle.js rename to core/modules/macros/unusedtitle.js index 8531d1ce7..952bd0264 100644 --- a/core/modules/macros/uniquetitle.js +++ b/core/modules/macros/unusedtitle.js @@ -2,6 +2,7 @@ title: $:/core/modules/macros/unusedtitle.js type: application/javascript module-type: macro + Macro to return a new title that is unused in the wiki. It can be given a name as a base. \*/ (function(){ @@ -10,25 +11,25 @@ Macro to return a new title that is unused in the wiki. It can be given a name a /*global $tw: false */ "use strict"; -/* -Information about this macro -*/ - exports.name = "unusedtitle"; exports.params = [ {name: "baseName"}, - {name: "options"} + {name: "separator"}, + {name: "template"} ]; /* Run the macro */ -exports.run = function(baseName, options) { +exports.run = function(baseName,separator,template) { + separator = separator || " "; if(!baseName) { baseName = $tw.language.getString("DefaultNewTiddlerTitle"); } - return this.wiki.generateNewTitle(baseName, options); + // $tw.wiki.generateNewTitle = function(baseTitle,options) + // options.prefix must be a string! + return this.wiki.generateNewTitle(baseName, {"prefix": separator, "template": template}); }; })(); diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 8e028e47c..b1d82a427 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -294,6 +294,47 @@ exports.slowInSlowOut = function(t) { return (1 - ((Math.cos(t * Math.PI) + 1) / 2)); }; +exports.formatTitleString = function(template,options) { + var base = options.base || "", + separator = options.separator || "", + counter = options.counter || ""; + var result = "", + t = template, + matches = [ + [/^\$basename\$/i, function() { + return base; + }], + [/^\$count:(\d+)\$/i, function(match) { + return $tw.utils.pad(counter,match[1]); + }], + [/^\$separator\$/i, function() { + return separator; + }], + [/^\$count\$/i, function() { + return counter + ""; + }] + ]; + while(t.length){ + var matchString = ""; + $tw.utils.each(matches, function(m) { + var match = m[0].exec(t); + if(match) { + matchString = m[1].call(null,match); + t = t.substr(match[0].length); + return false; + } + }); + if(matchString) { + result += matchString; + } else { + result += t.charAt(0); + t = t.substr(1); + } + } + result = result.replace(/\\(.)/g,"$1"); + return result; +}; + exports.formatDateString = function(date,template) { var result = "", t = template, diff --git a/core/modules/wiki.js b/core/modules/wiki.js index ccda3ee95..54c3f0810 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -190,15 +190,25 @@ exports.getChangeCount = function(title) { /* Generate an unused title from the specified base +options.prefix must be a string */ exports.generateNewTitle = function(baseTitle,options) { options = options || {}; var c = 0, - title = baseTitle; - while(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) { - title = baseTitle + - (options.prefix || " ") + - (++c); + title = baseTitle, + template = options.template, + prefix = (typeof(options.prefix) === "string") ? options.prefix : " "; + if (template) { + // "count" is important to avoid an endless loop in while(...)!! + template = (/\$count:?(\d+)?\$/i.test(template)) ? template : template + "$count$"; + title = $tw.utils.formatTitleString(template,{"base":baseTitle,"separator":prefix,"counter":c}); + while(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) { + title = $tw.utils.formatTitleString(template,{"base":baseTitle,"separator":prefix,"counter":(++c)}); + } + } else { + while(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) { + title = baseTitle + prefix + (++c); + } } return title; }; diff --git a/editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid b/editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid index 39fdacf93..67c6df23d 100644 --- a/editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid +++ b/editions/tw5.com/tiddlers/macros/UnusedTitleMacro.tid @@ -1,5 +1,6 @@ - caption: unusedtitle +created: 20210104143546885 +modified: 20210427184035684 tags: Macros [[Core Macros]] title: unusedtitle Macro type: text/vnd.tiddlywiki @@ -10,7 +11,30 @@ It uses the same method as the create new tiddler button, a number is appended t !! Parameters -;baseName -: A string specifying the desired base name, defaulting to `New Tiddler` +; baseName +: A string specifying the desired base name, defaulting to `New Tiddler`. <br>The default setting can be adjusted in the $:/ControlPanel '': Info : Basics - tab.'' -<<.macro-examples "unusedtitle">> +; separator +: <<.from-version "5.1.24">> An ''optional'' string specifying the separator between baseName and the unique number. eg: `separator:"-"`. Defaults to a space: `" "`. If you need an empty separator use the ''template''! + +; template +: <<.from-version "5.1.24">> A ''optional'' template string can be used to allow you maximum flexibility. If the template string is used, there will always be a counter value. + +!! Template String + +; `$basename$` +: This variable will be replaced by the content of the ''baseName'' parameter + +; `$separator$` +: This variable will be replaced by the ''separator'' parameter + +;`$count$` +: This variable will be createad automatically and is a counter starting with 0 + +;`$count:4$` +: This variable will be createad automatically and starts at 0000 +: `:4` represents the number of digits + +!! Examples + +<<list-links "[prefix[unusedtitle Macro (E]!sort[]]">> diff --git a/editions/tw5.com/tiddlers/macros/examples/unusedtitle Macro (Examples 1).tid b/editions/tw5.com/tiddlers/macros/examples/unusedtitle Macro (Examples 1).tid new file mode 100644 index 000000000..5c4bc3125 --- /dev/null +++ b/editions/tw5.com/tiddlers/macros/examples/unusedtitle Macro (Examples 1).tid @@ -0,0 +1,51 @@ +created: 20210227212730299 +modified: 20210427184057456 +tags: +title: unusedtitle Macro (Examples 1) +type: text/vnd.tiddlywiki + +\define testCreate() +<$action-createtiddler $basetitle=<<unusedtitle template:"$count:2$-new">>/> +\end + +\define testCreate1() +<$action-createtiddler $basetitle=<<unusedtitle baseName:"new" separator:"-" template:"$count:2$$separator$$basename$">>/> +\end + +\define testNew() +<$action-sendmessage $message="tm-new-tiddler" title=<<unusedtitle baseName:"new" template:"$count:2$-$basename$">> /> +\end + +``` +<<unusedtitle template:"$count:2$-new">> +``` + +<$button actions=<<testCreate>> > +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> +Create Tiddler +</$button> + +``` +<<unusedtitle baseName:"new" template:"$count:2$-$basename$">> +``` + +<$button actions=<<testNew>>> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> +New Tiddler +</$button> + +``` +<<unusedtitle baseName:"new" separator:"-" template:"$count:2$$separator$$basename$">> +``` + +<$button actions=<<testCreate1>>> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> +Create Tiddler +</$button> + +--- + +<details> + <summary>Show the code</summary> + <pre><code><$view><pre><code> +</details> diff --git a/editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid b/editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid index 0389d2d67..a86f0d16e 100644 --- a/editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid +++ b/editions/tw5.com/tiddlers/macros/examples/unusedtitle.tid @@ -1,7 +1,16 @@ +created: 20210104143940715 +modified: 20210228141241657 tags: [[unusedtitle Macro]] [[Macro Examples]] title: unusedtitle Macro (Examples) type: text/vnd.tiddlywiki <$macrocall $name=".example" n="1" eg="""<<unusedtitle>>"""/> -<$macrocall $name=".example" n="2" eg="""<<unusedtitle AnotherBase>>"""/> -<$macrocall $name=".example" n="3" eg="""<<unusedtitle TiddlyWiki>>"""/> +''The following example works best if there is an open tiddler in draft mode, or there is a tiddler named "New Tiddler".'' So you can see the automatic numbering. +<$macrocall $name=".example" n="2" eg="""<<unusedtitle separator:"-">>"""/> +<$macrocall $name=".example" n="3" eg="""<<unusedtitle baseName:"anotherBase">>"""/> +<$macrocall $name=".example" n="4" eg="""<<unusedtitle baseName:"About" separator:"-">>"""/> +<$macrocall $name=".example" n="5" eg="""<<unusedtitle template:"$count:2$-test">>"""/> + +--- + +Working buttons can be found at: [[unusedtitle Macro (Examples 1)]]. You'll have to examine the code to see, what's going on. \ No newline at end of file From d8ac00a10856b1b64311b8e0496344d5b0c1b987 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 4 May 2021 17:31:37 +0100 Subject: [PATCH 1318/2376] TiddlyWebAdaptor: Avoid crashing if server sent events not available Fixes #5663 --- plugins/tiddlywiki/tiddlyweb/sse-client.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/tiddlywiki/tiddlyweb/sse-client.js b/plugins/tiddlywiki/tiddlyweb/sse-client.js index be02133dc..e06abe381 100644 --- a/plugins/tiddlywiki/tiddlyweb/sse-client.js +++ b/plugins/tiddlywiki/tiddlyweb/sse-client.js @@ -40,14 +40,17 @@ function debounce(callback) { } function setupEvents(host) { - var events = new EventSource(host + "events/plugins/tiddlywiki/tiddlyweb"); - var debouncedSync = debounce($tw.syncer.syncFromServer.bind($tw.syncer)); - events.addEventListener("change",debouncedSync); - events.onerror = function() { - events.close(); - setTimeout(function() { - setupEvents(host); - },$tw.syncer.errorRetryInterval); - }; + if(window.EventSource) { + var events = new EventSource(host + "events/plugins/tiddlywiki/tiddlyweb"); + var debouncedSync = debounce($tw.syncer.syncFromServer.bind($tw.syncer)); + events.addEventListener("change",debouncedSync); + events.onerror = function() { + events.close(); + setTimeout(function() { + setupEvents(host); + },$tw.syncer.errorRetryInterval); + }; + } } + })(); From 9cd65efad9706ed60cbe4b0cd016704e4705540b Mon Sep 17 00:00:00 2001 From: ualich <44392621+ualich@users.noreply.github.com> Date: Thu, 6 May 2021 13:24:08 +0200 Subject: [PATCH 1319/2376] Signing the CLA (#5671) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index c633abdbd..caf3df96a 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -449,3 +449,5 @@ J. Wilhelm, @jeremyredhead, 2021/01/27 Quentin Minster, @laomaiweng, 2021/03/10 Cindy Ruan, @cdruan, 2021/03/18 + +Urban Alič, @ualich, 2021/05/06 From e699cf1fe8948ce0e7278cefac0223d09b8ec6f1 Mon Sep 17 00:00:00 2001 From: ualich <44392621+ualich@users.noreply.github.com> Date: Thu, 6 May 2021 13:25:29 +0200 Subject: [PATCH 1320/2376] Display tiddler link in 'Target tiddler already exists' warning (#5672) --- core/ui/EditTemplate/title.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/title.tid b/core/ui/EditTemplate/title.tid index 8972504d2..daac829f6 100644 --- a/core/ui/EditTemplate/title.tid +++ b/core/ui/EditTemplate/title.tid @@ -23,7 +23,7 @@ tags: $:/tags/EditTemplate <div class="tc-message-box"> -{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}} +{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}: <$link to={{!!draft.title}} /> </div> From f4d7b2c7f7ce2786d5c68f361bf070c38b1d7d00 Mon Sep 17 00:00:00 2001 From: FlashSystems <developer@flashsystems.de> Date: Sat, 8 May 2021 17:05:39 +0200 Subject: [PATCH 1321/2376] Network performance optimizations for node.js (#5436) --- core/language/en-GB/Help/listen.tid | 1 + core/modules/server/routes/get-favicon.js | 3 +- core/modules/server/routes/get-file.js | 5 +- core/modules/server/routes/get-index.js | 24 +----- core/modules/server/routes/get-status.js | 3 +- .../modules/server/routes/get-tiddler-html.js | 4 +- core/modules/server/routes/get-tiddler.js | 3 +- .../server/routes/get-tiddlers-json.js | 3 +- core/modules/server/server.js | 75 ++++++++++++++++++- languages/de-DE/Help/listen.tid | 1 + 10 files changed, 83 insertions(+), 39 deletions(-) diff --git a/core/language/en-GB/Help/listen.tid b/core/language/en-GB/Help/listen.tid index 7b2c78cbe..7e6986c74 100644 --- a/core/language/en-GB/Help/listen.tid +++ b/core/language/en-GB/Help/listen.tid @@ -30,6 +30,7 @@ All parameters are optional with safe defaults, and can be specified in any orde * ''tls-key'' - pathname of TLS key file (relative to wiki folder) * ''debug-level'' - optional debug level; set to "debug" to view request details (defaults to "none") * ''gzip'' - set to "yes" to enable gzip compression for some http endpoints (defaults to "no") +* ''use-browser-cache'' - set to "yes" to allow the browser to cache responses to save bandwith (defaults to "no") For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com. diff --git a/core/modules/server/routes/get-favicon.js b/core/modules/server/routes/get-favicon.js index 79dd1a6be..39a391127 100644 --- a/core/modules/server/routes/get-favicon.js +++ b/core/modules/server/routes/get-favicon.js @@ -17,9 +17,8 @@ exports.method = "GET"; exports.path = /^\/favicon.ico$/; exports.handler = function(request,response,state) { - response.writeHead(200, {"Content-Type": "image/x-icon"}); var buffer = state.wiki.getTiddlerText("$:/favicon.ico",""); - response.end(buffer,"base64"); + state.sendResponse(200,{"Content-Type": "image/x-icon"},buffer,"base64"); }; }()); diff --git a/core/modules/server/routes/get-file.js b/core/modules/server/routes/get-file.js index ac4b01d7e..2588e48f7 100644 --- a/core/modules/server/routes/get-file.js +++ b/core/modules/server/routes/get-file.js @@ -34,10 +34,7 @@ exports.handler = function(request,response,state) { content = content; type = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : "application/octet-stream"); } - response.writeHead(status,{ - "Content-Type": type - }); - response.end(content); + state.sendResponse(status,{"Content-Type": type},content); }); }; diff --git a/core/modules/server/routes/get-index.js b/core/modules/server/routes/get-index.js index c90341925..f2d01f793 100644 --- a/core/modules/server/routes/get-index.js +++ b/core/modules/server/routes/get-index.js @@ -12,38 +12,16 @@ GET / /*global $tw: false */ "use strict"; -var zlib = require("zlib"); - exports.method = "GET"; exports.path = /^\/$/; exports.handler = function(request,response,state) { - var acceptEncoding = request.headers["accept-encoding"]; - if(!acceptEncoding) { - acceptEncoding = ""; - } var text = state.wiki.renderTiddler(state.server.get("root-render-type"),state.server.get("root-tiddler")), responseHeaders = { "Content-Type": state.server.get("root-serve-type") }; - /* - If the gzip=yes flag for `listen` is set, check if the user agent permits - compression. If so, compress our response. Note that we use the synchronous - functions from zlib to stay in the imperative style. The current `Server` - doesn't depend on this, and we may just as well use the async versions. - */ - if(state.server.enableGzip) { - if (/\bdeflate\b/.test(acceptEncoding)) { - responseHeaders["Content-Encoding"] = "deflate"; - text = zlib.deflateSync(text); - } else if (/\bgzip\b/.test(acceptEncoding)) { - responseHeaders["Content-Encoding"] = "gzip"; - text = zlib.gzipSync(text); - } - } - response.writeHead(200,responseHeaders); - response.end(text); + state.sendResponse(200,responseHeaders,text); }; }()); diff --git a/core/modules/server/routes/get-status.js b/core/modules/server/routes/get-status.js index c570c090b..1d7979336 100644 --- a/core/modules/server/routes/get-status.js +++ b/core/modules/server/routes/get-status.js @@ -17,7 +17,6 @@ exports.method = "GET"; exports.path = /^\/status$/; exports.handler = function(request,response,state) { - response.writeHead(200, {"Content-Type": "application/json"}); var text = JSON.stringify({ username: state.authenticatedUsername || state.server.get("anon-username") || "", anonymous: !state.authenticatedUsername, @@ -28,7 +27,7 @@ exports.handler = function(request,response,state) { }, tiddlywiki_version: $tw.version }); - response.end(text,"utf8"); + state.sendResponse(200,{"Content-Type": "application/json"},text,"utf8"); }; }()); diff --git a/core/modules/server/routes/get-tiddler-html.js b/core/modules/server/routes/get-tiddler-html.js index 4fe440821..1a1b0c5e5 100644 --- a/core/modules/server/routes/get-tiddler-html.js +++ b/core/modules/server/routes/get-tiddler-html.js @@ -32,9 +32,9 @@ exports.handler = function(request,response,state) { renderTemplate = renderTemplate || state.server.get("tiddler-render-template"); } var text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}}); + // Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS - response.writeHead(200); - response.end(text,"utf8"); + state.sendResponse(200,{},text,"utf8"); } else { response.writeHead(404); response.end(); diff --git a/core/modules/server/routes/get-tiddler.js b/core/modules/server/routes/get-tiddler.js index e125d7055..4db7be012 100644 --- a/core/modules/server/routes/get-tiddler.js +++ b/core/modules/server/routes/get-tiddler.js @@ -36,8 +36,7 @@ exports.handler = function(request,response,state) { tiddlerFields.revision = state.wiki.getChangeCount(title); tiddlerFields.bag = "default"; tiddlerFields.type = tiddlerFields.type || "text/vnd.tiddlywiki"; - response.writeHead(200, {"Content-Type": "application/json"}); - response.end(JSON.stringify(tiddlerFields),"utf8"); + state.sendResponse(200,{"Content-Type": "application/json"},JSON.stringify(tiddlerFields),"utf8"); } else { response.writeHead(404); response.end(); diff --git a/core/modules/server/routes/get-tiddlers-json.js b/core/modules/server/routes/get-tiddlers-json.js index 203900346..6f3f07f6a 100644 --- a/core/modules/server/routes/get-tiddlers-json.js +++ b/core/modules/server/routes/get-tiddlers-json.js @@ -33,7 +33,6 @@ exports.handler = function(request,response,state) { } var excludeFields = (state.queryParameters.exclude || "text").split(","), titles = state.wiki.filterTiddlers(filter); - response.writeHead(200, {"Content-Type": "application/json"}); var tiddlers = []; $tw.utils.each(titles,function(title) { var tiddler = state.wiki.getTiddler(title); @@ -45,7 +44,7 @@ exports.handler = function(request,response,state) { } }); var text = JSON.stringify(tiddlers); - response.end(text,"utf8"); + state.sendResponse(200,{"Content-Type": "application/json"},text,"utf8"); }; }()); diff --git a/core/modules/server/server.js b/core/modules/server/server.js index 6e37e603a..ed3359dc1 100644 --- a/core/modules/server/server.js +++ b/core/modules/server/server.js @@ -17,7 +17,9 @@ if($tw.node) { fs = require("fs"), url = require("url"), path = require("path"), - querystring = require("querystring"); + querystring = require("querystring"), + crypto = require("crypto"), + zlib = require("zlib"); } /* @@ -47,6 +49,8 @@ function Server(options) { this.csrfDisable = this.get("csrf-disable") === "yes"; // Initialize Gzip compression this.enableGzip = this.get("gzip") === "yes"; + // Initialize browser-caching + this.enableBrowserCache = this.get("use-browser-cache") === "yes"; // Initialise authorization var authorizedUserName = (this.get("username") && this.get("password")) ? this.get("username") : "(anon)"; this.authorizationPrincipals = { @@ -78,6 +82,71 @@ function Server(options) { this.transport = require(this.protocol); } +/* +Send a response to the client. This method checks if the response must be sent +or if the client alrady has the data cached. If that's the case only a 304 +response will be transmitted and the browser will use the cached data. +Only requests with status code 200 are considdered for caching. +request: request instance passed to the handler +response: response instance passed to the handler +statusCode: stauts code to send to the browser +headers: response headers (they will be augmented with an `Etag` header) +data: the data to send (passed to the end method of the response instance) +encoding: the encoding of the data to send (passed to the end method of the response instance) +*/ +function sendResponse(request,response,statusCode,headers,data,encoding) { + if(this.enableBrowserCache && (statusCode == 200)) { + var hash = crypto.createHash('md5'); + // Put everything into the hash that could change and invalidate the data that + // the browser already stored. The headers the data and the encoding. + hash.update(data); + hash.update(JSON.stringify(headers)); + if(encoding) { + hash.update(encoding); + } + var contentDigest = hash.digest("hex"); + // RFC 7232 section 2.3 mandates for the etag to be enclosed in quotes + headers["Etag"] = '"' + contentDigest + '"'; + headers["Cache-Control"] = "max-age=0, must-revalidate"; + // Check if any of the hashes contained within the if-none-match header + // matches the current hash. + // If one matches, do not send the data but tell the browser to use the + // cached data. + // We do not implement "*" as it makes no sense here. + var ifNoneMatch = request.headers["if-none-match"]; + if(ifNoneMatch) { + var matchParts = ifNoneMatch.split(",").map(function(etag) { + return etag.replace(/^[ "]+|[ "]+$/g, ""); + }); + if(matchParts.indexOf(contentDigest) != -1) { + response.writeHead(304,headers); + response.end(); + return; + } + } + } + /* + If the gzip=yes is set, check if the user agent permits compression. If so, + compress our response if the raw data is bigger than 2k. Compressing less + data is inefficient. Note that we use the synchronous functions from zlib + to stay in the imperative style. The current `Server` doesn't depend on + this, and we may just as well use the async versions. + */ + if(this.enableGzip && (data.length > 2048)) { + var acceptEncoding = request.headers["accept-encoding"] || ""; + if(/\bdeflate\b/.test(acceptEncoding)) { + headers["Content-Encoding"] = "deflate"; + data = zlib.deflateSync(data); + } else if(/\bgzip\b/.test(acceptEncoding)) { + headers["Content-Encoding"] = "gzip"; + data = zlib.gzipSync(data); + } + } + + response.writeHead(statusCode,headers); + response.end(data,encoding); +} + Server.prototype.defaultVariables = { port: "8080", host: "127.0.0.1", @@ -89,7 +158,8 @@ Server.prototype.defaultVariables = { "system-tiddler-render-type": "text/plain", "system-tiddler-render-template": "$:/core/templates/wikified-tiddler", "debug-level": "none", - "gzip": "no" + "gzip": "no", + "use-browser-cache": "no" }; Server.prototype.get = function(name) { @@ -167,6 +237,7 @@ Server.prototype.requestHandler = function(request,response,options) { state.urlInfo = url.parse(request.url); state.queryParameters = querystring.parse(state.urlInfo.query); state.pathPrefix = options.pathPrefix || this.get("path-prefix") || ""; + state.sendResponse = sendResponse.bind(self,request,response); // Get the principals authorized to access this resource var authorizationType = this.methodMappings[request.method] || "readers"; // Check for the CSRF header if this is a write diff --git a/languages/de-DE/Help/listen.tid b/languages/de-DE/Help/listen.tid index 1426eaf8d..c1b71dda8 100644 --- a/languages/de-DE/Help/listen.tid +++ b/languages/de-DE/Help/listen.tid @@ -31,5 +31,6 @@ Mögliche Parameter: * ''tls-key'' - Pfad zur "TLS key" Datei (relativ zum Wiki Verzeichnis) * ''debug-level'' - "debug" bewikt eine detailierte Anzeige der HTTP Anfrage-Parameter. (Standard: "none") * ''gzip'' - Wenn auf "yes" gesetzt, dann wird gzip Kompression aktiviert. (Standard: "no") +* ''use-browser-cache'' - Ist dieser Parameter auf "yes" gesetzt kann der Browser Inhalte zwischenspeichern um Übertragungsbandbreite zu sparen. (Standard: "no") Für weitere Sicherheitshinweise und Informationen für die Verwendung in lokalen Netzwerken siehe: WebServer auf TiddlyWiki.com From e7b3f6916273c40273782f9eb25d5a83b6bbd99d Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Tue, 11 May 2021 02:27:48 +0800 Subject: [PATCH 1322/2376] Add chinese help texts for `use-browser-cache` (#5677) --- languages/zh-Hans/Help/listen.tid | 1 + languages/zh-Hant/Help/listen.tid | 1 + 2 files changed, 2 insertions(+) diff --git a/languages/zh-Hans/Help/listen.tid b/languages/zh-Hans/Help/listen.tid index 93b01db8f..3efc53c71 100644 --- a/languages/zh-Hans/Help/listen.tid +++ b/languages/zh-Hans/Help/listen.tid @@ -30,5 +30,6 @@ listen 命令使用[[命名的命令参数|NamedCommandParameters]]: * ''tls-key'' - TLS 密钥文件的路径名(相对于维基文件夹) * ''debug-level'' - 可选的调试级别;设置为 "debug" 来查看请求的详细信息;(默认为 "none") * ''gzip'' - 设为 "yes" 以启用某些 http 端点的 gzip 压缩 (默认为 "no") +* ''use-browser-cache'' - 设置为 "yes" 允许浏览器缓存响应,以节省带宽(默认为 "no") 有关向整个本地网络开启实例的信息,以及可能的安全问题,请参阅 TiddlyWiki.com 的 WebServer 条目。 diff --git a/languages/zh-Hant/Help/listen.tid b/languages/zh-Hant/Help/listen.tid index 8c3a9bd63..e76376059 100644 --- a/languages/zh-Hant/Help/listen.tid +++ b/languages/zh-Hant/Help/listen.tid @@ -30,5 +30,6 @@ listen 命令使用[[命名的命令參數|NamedCommandParameters]]: * ''tls-key'' - TLS 密鑰檔案的路徑名(相對於維基資料夾) * ''debug-level'' - 可選的偵錯層級;設定為 "debug" 來檢視請求的詳細資訊;(預設為 "none") * ''gzip'' - 設為 "yes" 以啟用某些 http 端點的 gzip 壓縮 (預設為 "no") +* ''use-browser-cache'' - 設定為 "yes" ,允許瀏覽器快取回應,以節省頻寬(預設值為 "no") 有關向整個本地網路開啟實例的資訊,以及可能的安全問題,請參閱 TiddlyWiki.com 的 WebServer 條目。 From b267a71f2db3418d81b1aeb674d373a43b9fa6de Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sun, 16 May 2021 15:01:46 +0200 Subject: [PATCH 1323/2376] Dropzone: persistent dragover state fix (#5688) --- core/modules/widgets/dropzone.js | 52 ++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 70bd2bf2e..1200441ff 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -37,6 +37,7 @@ DropZoneWidget.prototype.render = function(parent,nextSibling) { this.execute(); // Create element var domNode = this.document.createElement("div"); + this.domNode = domNode; domNode.className = this.dropzoneClass || "tc-dropzone"; // Add event handlers if(this.dropzoneEnable) { @@ -47,10 +48,8 @@ DropZoneWidget.prototype.render = function(parent,nextSibling) { {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"}, {name: "paste", handlerObject: this, handlerMethod: "handlePasteEvent"}, {name: "dragend", handlerObject: this, handlerMethod: "handleDragEndEvent"} - ]); + ]); } - domNode.addEventListener("click",function (event) { - },false); // Insert element parent.insertBefore(domNode,nextSibling); this.renderChildren(domNode,null); @@ -59,12 +58,46 @@ DropZoneWidget.prototype.render = function(parent,nextSibling) { this.currentlyEntered = []; }; +// Handler for transient event listeners added when the dropzone has an active drag in progress +DropZoneWidget.prototype.handleEvent = function(event) { + if(event.type === "click") { + if(this.currentlyEntered.length) { + this.resetState(); + } + } else if(event.type === "dragenter") { + if(event.target && event.target !== this.domNode && !$tw.utils.domContains(this.domNode,event.target)) { + this.resetState(); + } + } else if(event.type === "dragleave") { + // Check if drag left the window + if(event.relatedTarget === null || (event.relatedTarget && event.relatedTarget.nodeName === "HTML")) { + this.resetState(); + } + } +}; + +// Reset the state of the dropzone after a drag has ended +DropZoneWidget.prototype.resetState = function() { + $tw.utils.removeClass(this.domNode,"tc-dragover"); + this.currentlyEntered = []; + this.document.body.removeEventListener("click",this,true); + this.document.body.removeEventListener("dragenter",this,true); + this.document.body.removeEventListener("dragleave",this,true); + this.dragInProgress = false; +}; + DropZoneWidget.prototype.enterDrag = function(event) { if(this.currentlyEntered.indexOf(event.target) === -1) { this.currentlyEntered.push(event.target); } - // If we're entering for the first time we need to apply highlighting - $tw.utils.addClass(this.domNodes[0],"tc-dragover"); + if(!this.dragInProgress) { + this.dragInProgress = true; + // If we're entering for the first time we need to apply highlighting + $tw.utils.addClass(this.domNodes[0],"tc-dragover"); + this.document.body.addEventListener("click",this,true); + this.document.body.addEventListener("dragenter",this,true); + this.document.body.addEventListener("dragleave",this,true); + } }; DropZoneWidget.prototype.leaveDrag = function(event) { @@ -74,12 +107,11 @@ DropZoneWidget.prototype.leaveDrag = function(event) { } // Remove highlighting if we're leaving externally if(this.currentlyEntered.length === 0) { - $tw.utils.removeClass(this.domNodes[0],"tc-dragover"); + this.resetState(); } }; DropZoneWidget.prototype.handleDragEnterEvent = function(event) { - // Check for this window being the source of the drag if($tw.dragInProgress) { return false; } @@ -109,7 +141,7 @@ DropZoneWidget.prototype.handleDragLeaveEvent = function(event) { }; DropZoneWidget.prototype.handleDragEndEvent = function(event) { - $tw.utils.removeClass(this.domNodes[0],"tc-dragover"); + this.resetState(); }; DropZoneWidget.prototype.filterByContentTypes = function(tiddlerFieldsArray) { @@ -117,7 +149,7 @@ DropZoneWidget.prototype.filterByContentTypes = function(tiddlerFieldsArray) { filtered = [], types = []; $tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) { - types.push(tiddlerFields.type); + types.push(tiddlerFields.type || ""); }); filteredTypes = this.wiki.filterTiddlers(this.contentTypesFilter,this,this.wiki.makeTiddlerIterator(types)); $tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) { @@ -157,7 +189,7 @@ DropZoneWidget.prototype.handleDropEvent = function(event) { var self = this, dataTransfer = event.dataTransfer; // Remove highlighting - $tw.utils.removeClass(this.domNodes[0],"tc-dragover"); + this.resetState(); // Import any files in the drop var numFiles = 0; if(dataTransfer.files) { From e84f214280f72c0791004aa3b96f24ef91025897 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 19 May 2021 11:08:48 +0100 Subject: [PATCH 1324/2376] Add link to @sobjornstad's "Grok TiddlyWiki" --- .../Grok TiddlyWiki by Soren Bjornstad.tid | 16 ++++++++++++++++ .../hellothere/A Gentle Guide to TiddlyWiki.tid | 7 +++++-- .../tiddlers/hellothere/HelloThumbnail.tid | 2 +- .../HelloThumbnail - Grok TiddlyWiki.tid | 6 ++++++ .../tw5.com/tiddlers/images/Grok TiddlyWiki.png | Bin 0 -> 96496 bytes .../tiddlers/images/Grok TiddlyWiki.png.meta | 3 +++ 6 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 editions/tw5.com/tiddlers/community/resources/Grok TiddlyWiki by Soren Bjornstad.tid create mode 100644 editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - Grok TiddlyWiki.tid create mode 100644 editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png create mode 100644 editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png.meta diff --git a/editions/tw5.com/tiddlers/community/resources/Grok TiddlyWiki by Soren Bjornstad.tid b/editions/tw5.com/tiddlers/community/resources/Grok TiddlyWiki by Soren Bjornstad.tid new file mode 100644 index 000000000..50f1972ef --- /dev/null +++ b/editions/tw5.com/tiddlers/community/resources/Grok TiddlyWiki by Soren Bjornstad.tid @@ -0,0 +1,16 @@ +created: 20210519110226889 +modified: 20210519110226889 +tags: [[Other Resources]] +title: "Grok TiddlyWiki" by Soren Bjornstad +type: text/vnd.tiddlywiki +url: https://groktiddlywiki.com/read/ + +This new textbook from Soren Bjornstad is highly recommended for learning ~TiddlyWiki. The presentation and design are also a first class example of using ~TiddlyWiki. + +From the site: + +> Grok ~TiddlyWiki is a textbook that helps you build a deep, lasting understanding of and proficiency with ~TiddlyWiki through a combination of detailed explanations, practical exercises, and spaced-repetition reviews of prompts called takeaways. + +{{!!url}} + + diff --git a/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid b/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid index ce3024414..9d2a93d34 100644 --- a/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid +++ b/editions/tw5.com/tiddlers/hellothere/A Gentle Guide to TiddlyWiki.tid @@ -1,5 +1,5 @@ created: 20150325170720682 -modified: 20150926171049725 +modified: 20210519110623819 tags: HelloThere title: A Gentle Guide to TiddlyWiki type: text/vnd.tiddlywiki @@ -16,4 +16,7 @@ How can you make ~TiddlyWiki work for you? We recommend you start with our intro <<list-links "[tag[HelloThere]]">> -Also see [[TiddlyWiki Video Tutorials by Francis Meetze]] \ No newline at end of file +Also see: + +* [["Grok TiddlyWiki" by Soren Bjornstad]] +* [[TiddlyWiki Video Tutorials by Francis Meetze]] \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid b/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid index bb42aa6a7..f50bccca6 100644 --- a/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid +++ b/editions/tw5.com/tiddlers/hellothere/HelloThumbnail.tid @@ -1,5 +1,5 @@ created: 20150414070451144 -list: [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Gentle Guide]] [[HelloThumbnail - Firefox Apocalypse]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - TiddlyWikiLinks]] [[HelloThumbnail - TiddlyMap]] [[HelloThumbnail - HelpingTiddlyWiki]] [[HelloThumbnail - Developers]] [[HelloThumbnail - Classic]] +list: [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Gentle Guide]] [[HelloThumbnail - Grok TiddlyWiki]] [[HelloThumbnail - Firefox Apocalypse]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - TiddlyWikiLinks]] [[HelloThumbnail - TiddlyMap]] [[HelloThumbnail - HelpingTiddlyWiki]] [[HelloThumbnail - Developers]] [[HelloThumbnail - Classic]] modified: 20150414070948246 title: HelloThumbnail type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - Grok TiddlyWiki.tid b/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - Grok TiddlyWiki.tid new file mode 100644 index 000000000..a8cb2d5be --- /dev/null +++ b/editions/tw5.com/tiddlers/hellothere/thumbnails/HelloThumbnail - Grok TiddlyWiki.tid @@ -0,0 +1,6 @@ +title: HelloThumbnail - Grok TiddlyWiki +tags: HelloThumbnail +color: #D5B7EA +image: Grok TiddlyWiki Banner +caption: Grok ~TiddlyWiki +link: "Grok TiddlyWiki" by Soren Bjornstad diff --git a/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png b/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2bec5783c244f2399a371ebae7d498c612f3cc GIT binary patch literal 96496 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 JPDHLkV1k`NmWTiV literal 0 HcmV?d00001 diff --git a/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png.meta b/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png.meta new file mode 100644 index 000000000..a0595cc9f --- /dev/null +++ b/editions/tw5.com/tiddlers/images/Grok TiddlyWiki.png.meta @@ -0,0 +1,3 @@ +title: Grok TiddlyWiki Banner +type: image/png +tags: picture From fe12a4adbf729fcf3d02740ebbfa967021356c46 Mon Sep 17 00:00:00 2001 From: Odin <74539616+OdinJorna@users.noreply.github.com> Date: Wed, 19 May 2021 14:21:22 +0200 Subject: [PATCH 1325/2376] Update releasenotes 5.1.24 (#5670) * Update releasenotes 5.1.24 This includes changes up to 06-05-2021 * Incorporated feedback into release notes 5.1.24 Incorporated feedback and moved the '[[ActionPopupWidget]] to create floating popups that must be manually cleared' under widget improvements. --- .../prerelease/tiddlers/Release 5.1.24.tid | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index 24c911f12..e6649358c 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -25,12 +25,31 @@ type: text/vnd.tiddlywiki * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5370">> page title so that the separating em-dash is only used if the site subtitle is present * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5397">> broken aria-label in $:/PaletteManager * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5451">> macro calls to use the same parser as that used for widget attributes +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/89546b3357b0696a7047e6915bd6cd137b589de6">> a hidden setting to control sandboxing of tiddlers of type `text/html` +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/caec6bc3fea9155eb2b0aae64d577c565dd7b088">> SVG optimiser script +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c325380231a8c592a6e51d4498c1e6c3a241b539">> plus/minus SVG icons: <<.icon $:/core/images/plus-button>> and <<.icon $:/core/images/minus-button>> +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5294">> support for [[dynamic toolbar buttons|How to create dynamic editor toolbar buttons]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5612">> [[average Operator]] for calculating the arithmetic mean of a list of numbers +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/cf56a17f28f1e44dcb62c5e161be4ac29e27c3f2">> unusedtitle macro to use the prefix parameter + ! Hackability Improvements * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/9eda02868f21e9dd1733ffe26352bd7ac96285b4">> new MessageCatcherWidget * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/d25e540dd2f0decf61c52fdc665a28a5dfeda93f">> support for `image/vnd.microsoft.icon` content type +! Widget Improvements +* <<.link-badge-modified "https://github.com/Jermolene/TiddlyWiki5/commit/b9647b2c48152dac069a1099a0822b32375a66cf">> [[FieldManglerWidget]] to ensure it doesn't propogate events that it traps +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5597">> [[DropzoneWidget]] to optionally invoke actions after the `tm-import-tiddlers` message has been sent, and to specify an optional `contentTypesFilter` which determines which content types are accepted by the dropzone. +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5611">> [[ListWidget]] with `index` attribute and here (and [[here| https://github.com/Jermolene/TiddlyWiki5/commit/4a99e0cc7d4a6b9e7071c0b2a9a0f63c3c7d2492]]) +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5635">> [[SelectWidget]] refreshing +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5252">> support for suffixes to filter run prefixes +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5653">> :sort filter run prefix +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5644">> [[ActionListopsWidget]] bug by avoiding stitching together filter expressions for the original list values +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/07caa16e8714afe9a64eb202375e4a2f95da1508">> [[DropzoneWidget]] to also use the specified deserializer for strings either dropped or pasted on to the dropzone +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/44df6fe52f79bee88357afb4fc3d6f4800aa6dde">> issue with widget not being available to filter operator +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/3f986861538a3cc5c3c6da578b45d0d9138a6b2b">> [[ActionPopupWidget]] to create floating popups that must be manually cleared + ! Client-server Improvements * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/e96a54c7531a2d9e07745e27d2015d8d7d09588f">> crash running in client server configuration when 'etag' header is missing @@ -40,6 +59,9 @@ type: text/vnd.tiddlywiki * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5329">> issue with tiddler titles that already end in the required extension * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5465">> several consistency issues with the filesystem plugin * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/5483">> issue with encoding of $:/config/OriginalTiddlerPaths outside the wiki folder +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5628">> the TiddlySpot Saver settings form +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5638">> 401 and 403 error messages for PUT saver +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/d8ac00a10856b1b64311b8e0496344d5b0c1b987">> fixed crash if browser doesn't support Server Sent Events ! Plugin Improvements @@ -62,6 +84,7 @@ type: text/vnd.tiddlywiki !! [[BibTeX Plugin]] * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/issues/5581">> BibTeX Plugin to report errors more sensibly +* <<.link-badge-modified "https://github.com/Jermolene/TiddlyWiki5/commit/953fb9f237ad78e409c03d4b29b9854d8abf6cdf">> BibTex Plugin to force fieldnames to be lowercase ! Developer Experience Improvements @@ -71,6 +94,11 @@ type: text/vnd.tiddlywiki * <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/9f9ce6595b08032a602981f82940ca113cff8211">> wikitext parser with a subclassing mechanism * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/ef76349c37662e9706acfffc2c2edb51a920183d">> added support for ''utils-browser'' modules +! Translation improvements + +* <<.link-badge-improved>> Chinese translations + + ! Other Bug Fixes * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5376">> issue with [[lookup Operator]] returning "undefined" under some circumstances @@ -90,6 +118,7 @@ type: text/vnd.tiddlywiki * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/d6ea369f5ef9d3092a360a4286a99902df37782b">> EditTextWidget to use default text for missing fields * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5552">> css-escape-polyfill to work under Node.js + [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: * <<contributor Arlen22 From dbd3f835bf8399ed1a3da7cc322ec9b6ab783d53 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 19 May 2021 14:10:39 +0100 Subject: [PATCH 1326/2376] Fix crash when sorting by non-string fields tags, list, created, modified are not stored as strings by default. Fixes #5701 --- core/modules/wiki.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 54c3f0810..81459dbc1 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -374,12 +374,12 @@ exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,is var tiddlerA = self.getTiddler(a), tiddlerB = self.getTiddler(b); if(tiddlerA) { - a = tiddlerA.fields[sortField] || ""; + a = tiddlerA.getFieldString(sortField) || ""; } else { a = ""; } if(tiddlerB) { - b = tiddlerB.fields[sortField] || ""; + b = tiddlerB.getFieldString(sortField) || ""; } else { b = ""; } From ec1df7edf00df13d976888be90cd9f8f72067666 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Wed, 19 May 2021 15:12:12 +0200 Subject: [PATCH 1327/2376] Fix whitespace in themes (#5700) --- themes/tiddlywiki/starlight/styles.tid | 12 +-- themes/tiddlywiki/tight/base.tid | 10 +- themes/tiddlywiki/vanilla/base.tid | 144 ++++++++++++------------- 3 files changed, 83 insertions(+), 83 deletions(-) diff --git a/themes/tiddlywiki/starlight/styles.tid b/themes/tiddlywiki/starlight/styles.tid index 164bbb54e..75280b5a2 100644 --- a/themes/tiddlywiki/starlight/styles.tid +++ b/themes/tiddlywiki/starlight/styles.tid @@ -8,17 +8,17 @@ Placeholder for a more thorough refinement of Snow White */ @font-face { - font-family: "Arvo"; - font-style: normal; - font-weight: 400; - src: local("Arvo"), url(<<datauri "$:/themes/tiddlywiki/starlight/arvo.woff">>) format("woff"); + font-family: "Arvo"; + font-style: normal; + font-weight: 400; + src: local("Arvo"), url(<<datauri "$:/themes/tiddlywiki/starlight/arvo.woff">>) format("woff"); } html body, .tc-sidebar-scrollable-backdrop { font-family: "Arvo", "Times"; - background: url(<<datauri "$:/themes/tiddlywiki/starlight/ltbg.jpg">>); + background: url(<<datauri "$:/themes/tiddlywiki/starlight/ltbg.jpg">>); } .tc-page-controls svg { - <<filter "drop-shadow(1px 1px 2px rgba(255,255,255,0.9))">> + <<filter "drop-shadow(1px 1px 2px rgba(255,255,255,0.9))">> } diff --git a/themes/tiddlywiki/tight/base.tid b/themes/tiddlywiki/tight/base.tid index 347927e9c..7d1b8572e 100644 --- a/themes/tiddlywiki/tight/base.tid +++ b/themes/tiddlywiki/tight/base.tid @@ -82,17 +82,17 @@ tags: [[$:/tags/Stylesheet]] } html body.tc-body .tc-tiddler-frame .tc-tiddler-info { - margin: 0 -13px 0 -13px; + margin: 0 -13px 0 -13px; } html body.tc-body .tc-tiddler-frame .tc-fold-banner { - width: 13px; - margin-left: -15px; + width: 13px; + margin-left: -15px; } html body.tc-body .tc-tiddler-frame .tc-unfold-banner { - margin-left: -13px; - margin-top: -4px; + margin-left: -13px; + margin-top: -4px; } } diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 5fbde4325..ab4a1de57 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -76,7 +76,7 @@ $else$ } input[type="search"] { - outline-offset: initial; + outline-offset: initial; } html button { @@ -119,7 +119,7 @@ body.tc-body { <<if-background-attachment """ body.tc-body { - background-color: transparent; + background-color: transparent; } """>> @@ -182,7 +182,7 @@ blockquote.tc-big-quote { margin-left: 50px; margin-right: 50px; padding: 10px; - border-radius: 8px; + border-radius: 8px; } blockquote.tc-big-quote cite:before { @@ -198,8 +198,8 @@ blockquote.tc-big-quote:before { margin-right: 0.25em; vertical-align: -0.4em; position: absolute; - left: -50px; - top: 42px; + left: -50px; + top: 42px; } blockquote.tc-big-quote:after { @@ -211,8 +211,8 @@ blockquote.tc-big-quote:after { margin-right: 0.25em; vertical-align: -0.4em; position: absolute; - right: -80px; - bottom: -20px; + right: -80px; + bottom: -20px; } dl dt { @@ -234,7 +234,7 @@ input:not([type]) { } input[type="checkbox"] { - vertical-align: middle; + vertical-align: middle; } input[type="search"]::-webkit-search-decoration, @@ -597,7 +597,7 @@ html body.tc-body .tc-btn-rounded:hover svg { } .tc-primary-btn { - background: <<colour primary>>; + background: <<colour primary>>; } .tc-sidebar-lists input { @@ -750,7 +750,7 @@ button.tc-untagged-label { .tc-tag-label svg, .tc-tag-label img { height: 1em; width: 1em; - margin-right: 3px; + margin-right: 3px; margin-bottom: 1px; vertical-align: bottom; } @@ -859,7 +859,7 @@ button.tc-btn-invisible.tc-remove-tag-button { } .tc-page-controls .tc-drop-down { - font-size: 1rem; + font-size: 1rem; } .tc-page-controls button { @@ -1118,8 +1118,8 @@ button.tc-btn-invisible.tc-remove-tag-button { } .tc-tiddler-missing .tc-title { - font-style: italic; - font-weight: normal; + font-style: italic; + font-weight: normal; } .tc-tiddler-frame .tc-tiddler-controls { @@ -1151,9 +1151,9 @@ button.tc-btn-invisible.tc-remove-tag-button { } .tc-search button svg, .tc-search a svg { - height: 1.2em; - width: 1.2em; - margin: 0 0.25em; + height: 1.2em; + width: 1.2em; + margin: 0 0.25em; } .tc-tiddler-controls button.tc-selected svg, @@ -1369,39 +1369,39 @@ html body.tc-body.tc-single-tiddler-window { */ .tc-page-controls svg.tc-image-new-button { - fill: <<colour toolbar-new-button>>; + fill: <<colour toolbar-new-button>>; } .tc-page-controls svg.tc-image-options-button { - fill: <<colour toolbar-options-button>>; + fill: <<colour toolbar-options-button>>; } .tc-page-controls svg.tc-image-save-button { - fill: <<colour toolbar-save-button>>; + fill: <<colour toolbar-save-button>>; } .tc-tiddler-controls button svg.tc-image-info-button { - fill: <<colour toolbar-info-button>>; + fill: <<colour toolbar-info-button>>; } .tc-tiddler-controls button svg.tc-image-edit-button { - fill: <<colour toolbar-edit-button>>; + fill: <<colour toolbar-edit-button>>; } .tc-tiddler-controls button svg.tc-image-close-button { - fill: <<colour toolbar-close-button>>; + fill: <<colour toolbar-close-button>>; } .tc-tiddler-controls button svg.tc-image-delete-button { - fill: <<colour toolbar-delete-button>>; + fill: <<colour toolbar-delete-button>>; } .tc-tiddler-controls button svg.tc-image-cancel-button { - fill: <<colour toolbar-cancel-button>>; + fill: <<colour toolbar-cancel-button>>; } .tc-tiddler-controls button svg.tc-image-done-button { - fill: <<colour toolbar-done-button>>; + fill: <<colour toolbar-done-button>>; } /* @@ -1645,10 +1645,10 @@ html body.tc-body.tc-single-tiddler-window { .tc-drop-down .tc-tab-set .tc-tab-buttons button { display: inline-block; - width: auto; - margin-bottom: 0px; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; + width: auto; + margin-bottom: 0px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } .tc-drop-down .tc-prompt { @@ -2075,9 +2075,9 @@ html body.tc-body.tc-single-tiddler-window { } .tc-manager-list-item-heading { - display: block; - width: 100%; - text-align: left; + display: block; + width: 100%; + text-align: left; border-bottom: 1px solid <<colour muted-foreground>>; padding: 3px; } @@ -2099,22 +2099,22 @@ html body.tc-body.tc-single-tiddler-window { } .tc-manager-list-item-content-sidebar { - flex: 1 0; - background: <<colour tiddler-editor-background>>; - border-right: 0.5em solid <<colour muted-foreground>>; - border-bottom: 0.5em solid <<colour muted-foreground>>; - white-space: nowrap; + flex: 1 0; + background: <<colour tiddler-editor-background>>; + border-right: 0.5em solid <<colour muted-foreground>>; + border-bottom: 0.5em solid <<colour muted-foreground>>; + white-space: nowrap; } .tc-manager-list-item-content-item-heading { display: block; width: 100%; text-align: left; - background: <<colour muted-foreground>>; + background: <<colour muted-foreground>>; text-transform: uppercase; font-size: 0.6em; font-weight: bold; - padding: 0.5em 0 0.5em 0; + padding: 0.5em 0 0.5em 0; } .tc-manager-list-item-content-item-body { @@ -2128,10 +2128,10 @@ html body.tc-body.tc-single-tiddler-window { } .tc-manager-list-item-content-tiddler { - flex: 3 1; - border-left: 0.5em solid <<colour muted-foreground>>; - border-right: 0.5em solid <<colour muted-foreground>>; - border-bottom: 0.5em solid <<colour muted-foreground>>; + flex: 3 1; + border-left: 0.5em solid <<colour muted-foreground>>; + border-right: 0.5em solid <<colour muted-foreground>>; + border-bottom: 0.5em solid <<colour muted-foreground>>; } .tc-manager-list-item-content-item-body > table { @@ -2208,7 +2208,7 @@ html body.tc-body.tc-single-tiddler-window { position: absolute; top: 7px; right: 7px; - line-height: 0; + line-height: 0; } .tc-alert-toolbar svg { @@ -2218,8 +2218,8 @@ html body.tc-body.tc-single-tiddler-window { .tc-alert-subtitle { color: <<colour alert-muted-foreground>>; font-weight: bold; - font-size: 0.8em; - margin-bottom: 0.5em; + font-size: 0.8em; + margin-bottom: 0.5em; } .tc-alert-body > p { @@ -2304,11 +2304,11 @@ html body.tc-body.tc-single-tiddler-window { background-color: <<colour background>>; margin: 0.5em 0 0.5em 0; padding: 4px; - align-items: center; + align-items: center; } .tc-plugin-info-sub-plugins .tc-plugin-info { - margin: 0.5em; + margin: 0.5em; background: <<colour background>>; } @@ -2320,8 +2320,8 @@ html body.tc-body.tc-single-tiddler-window { color: <<colour background>>; background: <<colour foreground>>; border-radius: 8px; - padding: 2px 7px; - font-size: 0.75em; + padding: 2px 7px; + font-size: 0.75em; } .tc-plugin-info-sub-plugins .tc-plugin-info-dropdown { @@ -2351,7 +2351,7 @@ a.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg { } .tc-plugin-info-chunk { - margin: 2px; + margin: 2px; } .tc-plugin-info-chunk.tc-plugin-info-toggle { @@ -2375,7 +2375,7 @@ a.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg { line-height: 1.2; flex-grow: 0; flex-shrink: 0; - text-align: right; + text-align: right; } .tc-plugin-info-chunk.tc-plugin-info-description h1 { @@ -2426,7 +2426,7 @@ a.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg { .tc-plugin-info-sub-plugins { padding: 0.5em; - margin: 0 1em 1em 1em; + margin: 0 1em 1em 1em; background: <<colour notification-background>>; } @@ -2475,7 +2475,7 @@ a.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg { .tc-message-box svg { width: 1em; height: 1em; - vertical-align: text-bottom; + vertical-align: text-bottom; } /* @@ -2861,10 +2861,10 @@ body.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg } .tc-diff-tiddlers pre { - margin: 0; - padding: 0; - border: none; - background: none; + margin: 0; + padding: 0; + border: none; + background: none; } /* @@ -2881,40 +2881,40 @@ body.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg */ .tc-tree div { - padding-left: 14px; + padding-left: 14px; } .tc-tree ol { - list-style-type: none; - padding-left: 0; - margin-top: 0; + list-style-type: none; + padding-left: 0; + margin-top: 0; } .tc-tree ol ol { - padding-left: 1em; + padding-left: 1em; } -.tc-tree button { - color: #acacac; +.tc-tree button { + color: #acacac; } .tc-tree svg { - fill: #acacac; + fill: #acacac; } .tc-tree span svg { - width: 1em; - height: 1em; - vertical-align: baseline; + width: 1em; + height: 1em; + vertical-align: baseline; } .tc-tree li span { - color: lightgray; + color: lightgray; } select { - color: <<colour select-tag-foreground>>; - background: <<colour select-tag-background>>; + color: <<colour select-tag-foreground>>; + background: <<colour select-tag-background>>; } /* From c7f6cedc43c759a1fbf5e70aef984c9783da043b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 19 May 2021 14:23:54 +0100 Subject: [PATCH 1328/2376] Update release note --- editions/prerelease/tiddlers/Release 5.1.24.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index e6649358c..8d732167f 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -29,7 +29,7 @@ type: text/vnd.tiddlywiki * <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/caec6bc3fea9155eb2b0aae64d577c565dd7b088">> SVG optimiser script * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c325380231a8c592a6e51d4498c1e6c3a241b539">> plus/minus SVG icons: <<.icon $:/core/images/plus-button>> and <<.icon $:/core/images/minus-button>> * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5294">> support for [[dynamic toolbar buttons|How to create dynamic editor toolbar buttons]] -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5612">> [[average Operator]] for calculating the arithmetic mean of a list of numbers +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5612">> [[average Operator]], [[median Operator]], [[variance Operator]] and [[standard-deviation Operator]] for calculating the arithmetic mean of a list of numbers * <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/cf56a17f28f1e44dcb62c5e161be4ac29e27c3f2">> unusedtitle macro to use the prefix parameter From 05d38054c82a0d87f6d59ef63caead82ddaa6eb0 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Wed, 19 May 2021 22:52:43 +0200 Subject: [PATCH 1329/2376] Drag and drop images in the editor to import and insert (#5699) * Merge * Clean up * More clean up * Ensure image import works when type is not set, clean up post import actions * Removed spurious new line * For non image files insert a tiddler link * Added documentation for new settings and features --- core/language/en-GB/Import.multids | 1 + core/modules/editor/engines/framed.js | 13 +++ core/modules/editor/factory.js | 92 ++++++++++++++++--- core/modules/utils/dom/dragndrop.js | 12 +++ core/modules/widgets/dropzone.js | 9 +- core/ui/EditTemplate/body-editor.tid | 11 ++- core/ui/EditTemplate/body.tid | 16 ++-- core/ui/EditorToolbar/file-import.tid | 41 +++++++++ core/wiki/config/EditorEnableImportFilter.tid | 4 + .../config/EditorImportContentTypesFilter.tid | 4 + .../tw5.com/tiddlers/concepts/SystemTags.tid | 4 +- .../Hidden Setting_ Disable Drag and Drop.tid | 4 +- ...etting_ Enable File Import in Editor_1.tid | 12 +++ ...tings_ Import Content Types for Editor.tid | 11 +++ .../tiddlers/widgets/DropzoneWidget.tid | 5 +- .../tiddlers/widgets/EditTextWidget.tid | 3 +- .../tiddlers/wikitext/Images in WikiText.tid | 4 +- plugins/tiddlywiki/codemirror/engine.js | 31 ++++++- themes/tiddlywiki/vanilla/base.tid | 52 +++++++++++ 19 files changed, 301 insertions(+), 28 deletions(-) create mode 100644 core/ui/EditorToolbar/file-import.tid create mode 100644 core/wiki/config/EditorEnableImportFilter.tid create mode 100644 core/wiki/config/EditorImportContentTypesFilter.tid create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Enable File Import in Editor_1.tid create mode 100644 editions/tw5.com/tiddlers/hiddensettings/Hidden Settings_ Import Content Types for Editor.tid diff --git a/core/language/en-GB/Import.multids b/core/language/en-GB/Import.multids index 3b3308ad5..24b29c3f7 100644 --- a/core/language/en-GB/Import.multids +++ b/core/language/en-GB/Import.multids @@ -1,5 +1,6 @@ title: $:/language/Import/ +Editor/Import/Heading: Import images and insert into the editor. Imported/Hint: The following tiddlers were imported: Listing/Cancel/Caption: Cancel Listing/Hint: These tiddlers are ready to import: diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index c70167f6c..724c4e7f3 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -87,7 +87,20 @@ function FramedEngine(options) { {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"}, {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"} + ]); + // Add drag and drop event listeners if fileDrop is enabled + if(this.widget.isFileDropEnabled) { + $tw.utils.addEventListeners(this.domNode,[ + {name: "dragenter",handlerObject: this.widget,handlerMethod: "handleDragEnterEvent"}, + {name: "dragover",handlerObject: this.widget,handlerMethod: "handleDragOverEvent"}, + {name: "dragleave",handlerObject: this.widget,handlerMethod: "handleDragLeaveEvent"}, + {name: "dragend",handlerObject: this.widget,handlerMethod: "handleDragEndEvent"}, + {name: "drop", handlerObject: this.widget,handlerMethod: "handleDropEvent"}, + {name: "paste", handlerObject: this.widget,handlerMethod: "handlePasteEvent"}, + {name: "click",handlerObject: this.widget,handlerMethod: "handleClickEvent"} + ]); + } // Insert the element into the DOM this.iframeDoc.body.appendChild(this.domNode); } diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index f1463fe5c..dd362be16 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -186,6 +186,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { this.editRefreshTitle = this.getAttribute("refreshTitle"); this.editAutoComplete = this.getAttribute("autocomplete"); this.isDisabled = this.getAttribute("disabled","no"); + this.isFileDropEnabled = this.getAttribute("fileDrop","no") === "yes"; // Get the default editor element tag and type var tag,type; if(this.editField === "text") { @@ -217,7 +218,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { EditTextWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); // Completely rerender if any of our attributes have changed - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes["default"] || changedAttributes["class"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled || changedAttributes.fileDrop) { this.refreshSelf(); return true; } else if (changedTiddlers[this.editRefreshTitle]) { @@ -297,19 +298,88 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { Propogate keydown events to our container for the keyboard widgets benefit */ EditTextWidget.prototype.propogateKeydownEvent = function(event) { - var newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent("Events"); - if(newEvent.initEvent) { - newEvent.initEvent("keydown", true, true); - } - newEvent.keyCode = event.keyCode; - newEvent.which = event.which; - newEvent.metaKey = event.metaKey; - newEvent.ctrlKey = event.ctrlKey; - newEvent.altKey = event.altKey; - newEvent.shiftKey = event.shiftKey; + var newEvent = this.cloneEvent(event,["keyCode","which","metaKey","ctrlKey","altKey","shiftKey"]); return !this.parentDomNode.dispatchEvent(newEvent); }; + EditTextWidget.prototype.cloneEvent = function(event,propertiesToCopy) { + var propertiesToCopy = propertiesToCopy || [], + newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent("Events"); + if(newEvent.initEvent) { + newEvent.initEvent(event.type, true, true); + } + $tw.utils.each(propertiesToCopy,function(prop){ + newEvent[prop] = event[prop]; + }); + return newEvent; + }; + + EditTextWidget.prototype.dispatchDOMEvent = function(newEvent) { + var dispatchNode = this.engine.iframeNode || this.engine.parentNode; + return dispatchNode.dispatchEvent(newEvent); + }; + + /* + Propogate drag and drop events with File data to our container for the dropzone widgets benefit. + If there are no Files, let the browser handle it. + */ + EditTextWidget.prototype.handleDropEvent = function(event) { + if(event.dataTransfer.files.length) { + event.preventDefault(); + event.stopPropagation(); + this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"])); + } + }; + + EditTextWidget.prototype.handlePasteEvent = function(event) { + if(event.clipboardData.files.length) { + event.preventDefault(); + event.stopPropagation(); + this.dispatchDOMEvent(this.cloneEvent(event,["clipboardData"])); + } + }; + + EditTextWidget.prototype.handleDragEnterEvent = function(event) { + if($tw.utils.dragEventContainsFiles(event)) { + // Ignore excessive events fired by FF when entering and leaving text nodes in a text area. + if( event.relatedTarget && (event.relatedTarget.nodeType === 3 || event.target === event.relatedTarget)) { + return true; + } + event.preventDefault(); + return this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"])); + } + return true; + }; + + EditTextWidget.prototype.handleDragOverEvent = function(event) { + if($tw.utils.dragEventContainsFiles(event)) { + // Call preventDefault() in browsers that default to not allowing drop events on textarea + if($tw.browser.isFirefox || $tw.browser.isIE) { + event.preventDefault(); + } + event.dataTransfer.dropEffect = "copy"; + return this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"])); + } + return true; + }; + + EditTextWidget.prototype.handleDragLeaveEvent = function(event) { + // Ignore excessive events fired by FF when entering and leaving text nodes in a text area. + if(event.relatedTarget && ((event.relatedTarget.nodeType === 3) || (event.target === event.relatedTarget))) { + return true; + } + event.preventDefault(); + this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"])); + }; + + EditTextWidget.prototype.handleDragEndEvent = function(event) { + this.dispatchDOMEvent(this.cloneEvent(event)); + }; + + EditTextWidget.prototype.handleClickEvent = function(event) { + return !this.dispatchDOMEvent(this.cloneEvent(event)); + }; + return EditTextWidget; } diff --git a/core/modules/utils/dom/dragndrop.js b/core/modules/utils/dom/dragndrop.js index ba5d590c3..206846b9f 100644 --- a/core/modules/utils/dom/dragndrop.js +++ b/core/modules/utils/dom/dragndrop.js @@ -205,4 +205,16 @@ function parseJSONTiddlers(json,fallbackTitle) { return data; }; +exports.dragEventContainsFiles = function(event) { + if(event.dataTransfer.types) { + for(var i=0; i<event.dataTransfer.types.length; i++) { + if(event.dataTransfer.types[i] === "Files") { + return true; + break; + } + } + } + return false; +}; + })(); diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 1200441ff..9c6a16b20 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -115,6 +115,9 @@ DropZoneWidget.prototype.handleDragEnterEvent = function(event) { if($tw.dragInProgress) { return false; } + if(this.filesOnly && !$tw.utils.dragEventContainsFiles(event)) { + return false; + } this.enterDrag(event); // Tell the browser that we're ready to handle the drop event.preventDefault(); @@ -133,7 +136,10 @@ DropZoneWidget.prototype.handleDragOverEvent = function(event) { } // Tell the browser that we're still interested in the drop event.preventDefault(); - event.dataTransfer.dropEffect = "copy"; // Explicitly show this is a copy + // Check if this is a synthetic event, IE does not allow accessing dropEffect outside of original event handler + if(event.isTrusted) { + event.dataTransfer.dropEffect = "copy"; // Explicitly show this is a copy + } }; DropZoneWidget.prototype.handleDragLeaveEvent = function(event) { @@ -284,6 +290,7 @@ DropZoneWidget.prototype.execute = function() { this.importTitle = this.getAttribute("importTitle",IMPORT_TITLE); this.actions = this.getAttribute("actions"); this.contentTypesFilter = this.getAttribute("contentTypesFilter"); + this.filesOnly = this.getAttribute("filesOnly","no") === "yes"; // Make child widgets this.makeChildWidgets(); }; diff --git a/core/ui/EditTemplate/body-editor.tid b/core/ui/EditTemplate/body-editor.tid index f7e8a3acf..4897aff77 100644 --- a/core/ui/EditTemplate/body-editor.tid +++ b/core/ui/EditTemplate/body-editor.tid @@ -8,6 +8,7 @@ title: $:/core/ui/EditTemplate/body/editor tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}} cancelPopups="yes" + fileDrop={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} ><$set @@ -30,4 +31,12 @@ title: $:/core/ui/EditTemplate/body/editor tiddler="$:/core/ui/EditTemplate/body/toolbar/button" mode="inline" -/></$reveal></$list></$set></$edit> +/></$reveal></$list><$list + + filter="[all[shadows+tiddlers]tag[$:/tags/EditorTools]!has[draft.of]]" + +><$list + filter={{!!condition}} + variable="list-condition" +><$transclude/> +</$list></$list></$set></$edit> diff --git a/core/ui/EditTemplate/body.tid b/core/ui/EditTemplate/body.tid index 8369c82e8..8fdb066ff 100644 --- a/core/ui/EditTemplate/body.tid +++ b/core/ui/EditTemplate/body.tid @@ -5,6 +5,11 @@ tags: $:/tags/EditTemplate \define config-visibility-title() $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$ \end + +\define importFileActions() +<$action-popup $state=<<importState>> $coords="(0,0,0,0)" $floating="yes"/> +\end + <$list filter="[all[current]has[_canonical_uri]]"> <div class="tc-message-box"> @@ -20,9 +25,8 @@ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$ </$list> <$list filter="[all[current]!has[_canonical_uri]]"> - -<$reveal state="$:/state/showeditpreview" type="match" text="yes"> - +<$vars importTitle=<<qualify $:/ImportImage>> importState=<<qualify $:/state/ImportImage>> > +<$dropzone importTitle=<<importTitle>> autoOpenOnImport="no" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class="tc-dropzone-editor" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly="yes" actions=<<importFileActions>> ><$reveal state="$:/state/showeditpreview" type="match" text="yes"> <div class="tc-tiddler-preview"> <$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/> @@ -38,7 +42,6 @@ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$ </div> </div> - </$reveal> <$reveal state="$:/state/showeditpreview" type="nomatch" text="yes"> @@ -46,5 +49,6 @@ $:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$ <$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/> </$reveal> - -</$list> +</$dropzone> +</$vars> +</$list> \ No newline at end of file diff --git a/core/ui/EditorToolbar/file-import.tid b/core/ui/EditorToolbar/file-import.tid new file mode 100644 index 000000000..742597102 --- /dev/null +++ b/core/ui/EditorToolbar/file-import.tid @@ -0,0 +1,41 @@ +title: $:/core/ui/EditorToolbar/file-import +tags: $:/tags/EditorTools +condition: [<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]] + +\define lingo-base() $:/language/Import/ + +\define closePopupActions() +<$action-deletetiddler $filter="[title<importState>] [title<importTitle>]"/> +\end + +\define replacement-text-image() [img[$title$]] + +\define replacement-text-file() [[$title$]] + +\define postImportActions() +<$list filter="[<importTitle>links[]] :reduce[get[type]prefix[image]then<replacement-text-image>else<replacement-text-file>search-replace[$title$],<currentTiddler>addprefix<accumulator>]" variable="imageTitle"> +<$action-sendmessage + $message="tm-edit-text-operation" + $param="replace-selection" + text=<<imageTitle>> +/> +</$list> +<<closePopupActions>> +\end + +\define buttons() +<$button class="tc-btn-invisible" actions=<<closePopupActions>> ><<lingo Listing/Cancel/Caption>></$button> +<$button class="tc-btn-invisible" message="tm-perform-import" param=<<importTitle>> actions=<<postImportActions>> ><<lingo Listing/Import/Caption>></$button> +\end + +<$reveal type="popup" state=<<importState>> tag="div" class="tc-editor-importpopup"> +<div class="tc-editor-import"> +<$list filter="[<importTitle>field:plugin-type[import]]"> +<h2><<lingo Editor/Import/Heading>></h2> +<$tiddler tiddler=<<importTitle>>> +{{||$:/core/ui/ImportListing}} +<<buttons>> +</$tiddler> +</$list> +</div> +</$reveal> diff --git a/core/wiki/config/EditorEnableImportFilter.tid b/core/wiki/config/EditorEnableImportFilter.tid new file mode 100644 index 000000000..55d068e12 --- /dev/null +++ b/core/wiki/config/EditorEnableImportFilter.tid @@ -0,0 +1,4 @@ +title: $:/config/Editor/EnableImportFilter +type: text/vnd.tiddlywiki + +[all[current]type[text/vnd.tiddlywiki]] [all[current]!has[type]] \ No newline at end of file diff --git a/core/wiki/config/EditorImportContentTypesFilter.tid b/core/wiki/config/EditorImportContentTypesFilter.tid new file mode 100644 index 000000000..27a3c1d88 --- /dev/null +++ b/core/wiki/config/EditorImportContentTypesFilter.tid @@ -0,0 +1,4 @@ +title: $:/config/Editor/ImportContentTypesFilter +type: text/vnd.tiddlywiki + +[prefix[image/]] \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/concepts/SystemTags.tid b/editions/tw5.com/tiddlers/concepts/SystemTags.tid index 0d0798f33..30dc35aa5 100644 --- a/editions/tw5.com/tiddlers/concepts/SystemTags.tid +++ b/editions/tw5.com/tiddlers/concepts/SystemTags.tid @@ -1,6 +1,6 @@ created: 20130822080600000 -list: [[SystemTag: $:/tags/AboveStory]] [[SystemTag: $:/tags/AdvancedSearch]] [[SystemTag: $:/tags/AdvancedSearch/FilterButton]] [[SystemTag: $:/tags/Alert]] [[SystemTag: $:/tags/BelowStory]] [[SystemTag: $:/tags/ControlPanel]] [[SystemTag: $:/tags/ControlPanel/Advanced]] [[SystemTag: $:/tags/ControlPanel/Appearance]] [[SystemTag: $:/tags/ControlPanel/Info]] [[SystemTag: $:/tags/ControlPanel/Saving]] [[SystemTag: $:/tags/ControlPanel/Settings]] [[SystemTag: $:/tags/ControlPanel/Toolbars]] [[SystemTag: $:/tags/EditorToolbar]] [[SystemTag: $:/tags/EditPreview]] [[SystemTag: $:/tags/EditTemplate]] [[SystemTag: $:/tags/EditToolbar]] [[SystemTag: $:/tags/Exporter]] [[SystemTag: $:/tags/Filter]] [[SystemTag: $:/tags/Image]] [[SystemTag: $:/tags/ImportPreview]] [[SystemTag: $:/tags/KeyboardShortcut]] [[SystemTag: $:/tags/Layout]] [[SystemTag: $:/tags/Macro]] [[SystemTag: $:/tags/Macro/View]] [[SystemTag: $:/tags/Manager/ItemMain]] [[SystemTag: $:/tags/Manager/ItemSidebar]] [[SystemTag: $:/tags/MoreSideBar]] [[SystemTag: $:/tags/MoreSideBar/Plugins]] [[SystemTag: $:/tags/PageControls]] [[SystemTag: $:/tags/PageTemplate]] [[SystemTag: $:/tags/Palette]] [[SystemTag: $:/tags/PluginLibrary]] [[SystemTag: $:/tags/RawMarkup]] [[SystemTag: $:/tags/RawMarkupWikified]] [[SystemTag: $:/tags/RawMarkupWikified/BottomBody]] [[SystemTag: $:/tags/RawMarkupWikified/TopBody]] [[SystemTag: $:/tags/RawMarkupWikified/TopHead]] [[SystemTag: $:/tags/RawStaticContent]] [[SystemTag: $:/tags/RemoteAssetInfo]] [[SystemTag: $:/tags/SearchResults]] [[SystemTag: $:/tags/ServerConnection]] [[SystemTag: $:/tags/SideBar]] [[SystemTag: $:/tags/SideBarSegment]] [[SystemTag: $:/tags/StartupAction]] [[SystemTag: $:/tags/StartupAction/Browser]] [[SystemTag: $:/tags/StartupAction/Node]] [[SystemTag: $:/tags/Stylesheet]] [[SystemTag: $:/tags/TagDropdown]] [[SystemTag: $:/tags/TextEditor/Snippet]] [[SystemTag: $:/tags/TiddlerInfo]] [[SystemTag: $:/tags/TiddlerInfo/Advanced]] [[SystemTag: $:/tags/TiddlerInfoSegment]] [[SystemTag: $:/tags/ToolbarButtonStyle]] [[SystemTag: $:/tags/TopLeftBar]] [[SystemTag: $:/tags/TopRightBar]] [[SystemTag: $:/tags/ViewTemplate]] [[SystemTag: $:/tags/ViewToolbar]] -modified: 20201123192434277 +list: [[SystemTag: $:/tags/AboveStory]] [[SystemTag: $:/tags/AdvancedSearch]] [[SystemTag: $:/tags/AdvancedSearch/FilterButton]] [[SystemTag: $:/tags/Alert]] [[SystemTag: $:/tags/BelowStory]] [[SystemTag: $:/tags/ControlPanel]] [[SystemTag: $:/tags/ControlPanel/Advanced]] [[SystemTag: $:/tags/ControlPanel/Appearance]] [[SystemTag: $:/tags/ControlPanel/Info]] [[SystemTag: $:/tags/ControlPanel/Saving]] [[SystemTag: $:/tags/ControlPanel/Settings]] [[SystemTag: $:/tags/ControlPanel/Toolbars]] [[SystemTag: $:/tags/EditorTools]] [[SystemTag: $:/tags/EditorToolbar]] [[SystemTag: $:/tags/EditPreview]] [[SystemTag: $:/tags/EditTemplate]] [[SystemTag: $:/tags/EditToolbar]] [[SystemTag: $:/tags/Exporter]] [[SystemTag: $:/tags/Filter]] [[SystemTag: $:/tags/Image]] [[SystemTag: $:/tags/ImportPreview]] [[SystemTag: $:/tags/KeyboardShortcut]] [[SystemTag: $:/tags/Layout]] [[SystemTag: $:/tags/Macro]] [[SystemTag: $:/tags/Macro/View]] [[SystemTag: $:/tags/Manager/ItemMain]] [[SystemTag: $:/tags/Manager/ItemSidebar]] [[SystemTag: $:/tags/MoreSideBar]] [[SystemTag: $:/tags/MoreSideBar/Plugins]] [[SystemTag: $:/tags/PageControls]] [[SystemTag: $:/tags/PageTemplate]] [[SystemTag: $:/tags/Palette]] [[SystemTag: $:/tags/PluginLibrary]] [[SystemTag: $:/tags/RawMarkup]] [[SystemTag: $:/tags/RawMarkupWikified]] [[SystemTag: $:/tags/RawMarkupWikified/BottomBody]] [[SystemTag: $:/tags/RawMarkupWikified/TopBody]] [[SystemTag: $:/tags/RawMarkupWikified/TopHead]] [[SystemTag: $:/tags/RawStaticContent]] [[SystemTag: $:/tags/RemoteAssetInfo]] [[SystemTag: $:/tags/SearchResults]] [[SystemTag: $:/tags/ServerConnection]] [[SystemTag: $:/tags/SideBar]] [[SystemTag: $:/tags/SideBarSegment]] [[SystemTag: $:/tags/StartupAction]] [[SystemTag: $:/tags/StartupAction/Browser]] [[SystemTag: $:/tags/StartupAction/Node]] [[SystemTag: $:/tags/Stylesheet]] [[SystemTag: $:/tags/TagDropdown]] [[SystemTag: $:/tags/TextEditor/Snippet]] [[SystemTag: $:/tags/TiddlerInfo]] [[SystemTag: $:/tags/TiddlerInfo/Advanced]] [[SystemTag: $:/tags/TiddlerInfoSegment]] [[SystemTag: $:/tags/ToolbarButtonStyle]] [[SystemTag: $:/tags/TopLeftBar]] [[SystemTag: $:/tags/TopRightBar]] [[SystemTag: $:/tags/ViewTemplate]] [[SystemTag: $:/tags/ViewToolbar]] +modified: 20210519160636964 tags: Reference Concepts title: SystemTags type: text/vnd.tiddlywiki diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid index 62c07916a..45b00a885 100644 --- a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Disable Drag and Drop.tid @@ -1,10 +1,10 @@ created: 20200315143638556 -modified: 20200315143638556 +modified: 20210519155433742 tags: [[Hidden Settings]] title: Hidden Setting: Disable Drag and Drop type: text/vnd.tiddlywiki -<.from-version "5.1.22">> To disable all the drag and drop operations that are built into the core, set the following tiddler to "no": +<<.from-version "5.1.22">> To disable all the drag and drop operations that are built into the core, set the following tiddler to "no": $:/config/DragAndDrop/Enable diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Enable File Import in Editor_1.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Enable File Import in Editor_1.tid new file mode 100644 index 000000000..aed113132 --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Setting_ Enable File Import in Editor_1.tid @@ -0,0 +1,12 @@ +created: 20210519155447339 +modified: 20210519160010708 +tags: [[Hidden Settings]] +title: Hidden Setting: Enable File Import in Editor +type: text/vnd.tiddlywiki + +<<.from-version "5.1.24">> + +$:/config/Editor/EnableImportFilter + +This filter determines whether dragging and dropping files in the editor works for a given tiddler or not. A non-empty result enables drag and drop in the editor for that tiddler. +This filter is used in such a manner that it respects the global drag and drop setting. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/hiddensettings/Hidden Settings_ Import Content Types for Editor.tid b/editions/tw5.com/tiddlers/hiddensettings/Hidden Settings_ Import Content Types for Editor.tid new file mode 100644 index 000000000..7764f9c41 --- /dev/null +++ b/editions/tw5.com/tiddlers/hiddensettings/Hidden Settings_ Import Content Types for Editor.tid @@ -0,0 +1,11 @@ +created: 20210519155910219 +modified: 20210519160221219 +tags: [[Hidden Settings]] +title: Hidden Settings: Import Content Types for Editor +type: text/vnd.tiddlywiki + +<<.from-version "5.1.24">> + +$:/config/Editor/ImportContentTypesFilter + +This filter determines which `contentTypes` can be imported by dragging and dropping into the editor. It used by a DropzoneWidget wrapped around the editor, for the `contentTypesFilter` attribute. \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid index 6da7561d7..812e88f70 100644 --- a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid @@ -1,6 +1,6 @@ caption: dropzone created: 20131024141900000 -modified: 20210410062410660 +modified: 20210519154948743 tags: Widgets title: DropzoneWidget type: text/vnd.tiddlywiki @@ -21,6 +21,7 @@ It sends a [[WidgetMessage: tm-import-tiddlers]] carrying a JSON representation |importTitle|<<.from-version "5.1.23">> Optional tiddler title to use for import process instead of ~$:/Import | |actions|<<.from-version "5.1.24">> Optional actions string to be invoked after the `tm-import-tiddlers` message has been sent. The variable `importTitle` provides the title of the tiddler used for the import process. | |contentTypesFilter |<<.from-version "5.1.24">> Optional filter that specifies the [[content types|ContentType]] accepted by the dropzone. | +|filesOnly|<<.from-version "5.1.24">> Optional. When set to "yes", the dropzone only accepts files and not string data. Defaults to "no" | <<.tip """Use the `prefix` filter operator to easily accept multiple related content types. For example this filter will accept all image content types: `[prefix[image/]]`""">> @@ -30,7 +31,7 @@ The dropzone widget displays any contained content within the dropzone. ! Display -The dropzone widget creates an HTML `<div class="tc-dropzone">` to contain its content. During a drag operation the class `tc-dragover` is added. CSS is used to provide user feedback. +The dropzone widget creates an HTML `<div class="tc-dropzone">` to contain its content. During a drag operation the class `tc-dragover` is added. CSS is used to provide user feedback. For custom styling of this state where a drag is in progress, specify a custom class name with the `class` attribute and use CSS with the selector `.myclass.tc-dragover`. ! Data types supported diff --git a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid index c2e57e755..96dde07f7 100644 --- a/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EditTextWidget.tid @@ -1,6 +1,6 @@ caption: edit-text created: 20131024141900000 -modified: 20201130184701532 +modified: 20210519154352055 tags: Widgets title: EditTextWidget type: text/vnd.tiddlywiki @@ -36,6 +36,7 @@ The content of the `<$edit-text>` widget is ignored. |inputActions |<<.from-version 5.1.23>> Optional actions that are triggered every time an input event occurs within the input field or textarea | |refreshTitle |<<.from-version 5.1.23>> An optional tiddler title that makes the input field update whenever the specified tiddler changes | |disabled|<<.from-version "5.1.23">> Optional, disables the text input if set to "yes". Defaults to "no"| +|fileDrop|<<.from-version "5.1.24">> Optional. When set to "yes" allows dropping or pasting images into the editor to import them. Defaults to "no"| ! Notes diff --git a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid index 74d25de91..2401346c4 100644 --- a/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/Images in WikiText.tid @@ -1,6 +1,6 @@ caption: Images created: 20131205160221762 -modified: 20160617100358365 +modified: 20210519160846733 tags: WikiText [[Working with TiddlyWiki]] title: Images in WikiText type: text/vnd.tiddlywiki @@ -64,3 +64,5 @@ Renders as: Use the <<.button import>> button (under the <<.sidebar-tab Tools>> tab in the sidebar), or drag and drop. See [[ImportingTiddlers]] for details. + +<<.from-version "5.1.24">> You can also import images by dropping or pasting images into the tiddler editor. diff --git a/plugins/tiddlywiki/codemirror/engine.js b/plugins/tiddlywiki/codemirror/engine.js index fb75fdafe..4d20b7733 100755 --- a/plugins/tiddlywiki/codemirror/engine.js +++ b/plugins/tiddlywiki/codemirror/engine.js @@ -124,8 +124,11 @@ function CodeMirrorEngine(options) { self.widget.invokeActionString(self.widget.editInputActions); } }); + this.cm.on("drop",function(cm,event) { - event.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event + if(!self.widget.isFileDropEnabled) { + event.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event + } return false; }); this.cm.on("keydown",function(cm,event) { @@ -136,6 +139,32 @@ function CodeMirrorEngine(options) { $tw.popup.cancel(0); } }); + // Add drag and drop event listeners if fileDrop is enabled + if(this.widget.isFileDropEnabled) { + // If the drag event contains Files, prevent the default CodeMirror handling + this.cm.on("dragenter",function(cm,event) { + if($tw.utils.dragEventContainsFiles(event)) { + event.preventDefault(); + } + return true; + }); + this.cm.on("dragleave",function(cm,event) { + event.preventDefault(); + }); + this.cm.on("dragover",function(cm,event) { + if($tw.utils.dragEventContainsFiles(event)) { + event.preventDefault(); + } + }); + this.cm.on("drop",function(cm,event) { + if($tw.utils.dragEventContainsFiles(event)) { + event.preventDefault(); + } + }); + this.cm.on("paste",function(cm,event) { + self.widget.handlePasteEvent.call(self.widget,event); + }); + } } /* diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index ab4a1de57..e11cfbd23 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1550,6 +1550,58 @@ html body.tc-body.tc-single-tiddler-window { width: 10%; } + +/* +** Tiddler editor dropzone +*/ + +.tc-dropzone-editor { + position:relative; +} + +.tc-dropzone-editor.tc-dragover .tc-editor-toolbar::after{ + z-index: 10000; + top:0; + left:0; + right:0; + height: 100%; + background: <<colour dropzone-background>>; + content: "<<lingo DropMessage>>"; + pointer-events: none; + position: absolute; + display: flex; + align-items: center; + justify-content: center; + background-color: <<color background>>; + border: 4px dashed <<color modal-border>>; + font-weight: 600; + font-size: 150%; + opacity: 0.8; + color: <<color foreground>>; +} + +.tc-editor-importpopup { + width: 100%; + height: 100%; +} + +.tc-editor-import { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: <<color pre-background>>; + box-shadow: 2px 2px 10px <<colour foreground>>; + padding: 10px; + width: 96%; + border: 1px solid <<color tiddler-controls-foreground>>; + text-align:center; +} + +.tc-editor-import img { + max-height: 500px; +} + /* ** Storyview Classes */ From 1ddc3ab037bab8cefa0b0173367335ea31d665a5 Mon Sep 17 00:00:00 2001 From: Nicolas Petton <nicolas@petton.fr> Date: Fri, 21 May 2021 09:51:15 +0200 Subject: [PATCH 1330/2376] Add throttling for changed tiddlers prefixed with $:/temp/volatile/ (#5458) --- core/modules/startup/render.js | 2 +- core/modules/wiki.js | 5 ++++- editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/modules/startup/render.js b/core/modules/startup/render.js index fa4d21003..682291365 100644 --- a/core/modules/startup/render.js +++ b/core/modules/startup/render.js @@ -82,7 +82,7 @@ exports.startup = function() { var onlyThrottledTiddlersHaveChanged = true; for(var title in changes) { var tiddler = $tw.wiki.getTiddler(title); - if(!tiddler || !(tiddler.hasField("draft.of") || tiddler.hasField("throttle.refresh"))) { + if(!$tw.wiki.isVolatileTiddler(title) && (!tiddler || !(tiddler.hasField("draft.of") || tiddler.hasField("throttle.refresh")))) { onlyThrottledTiddlersHaveChanged = false; } } diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 81459dbc1..6aa6c7ced 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -221,6 +221,10 @@ exports.isTemporaryTiddler = function(title) { return title && title.indexOf("$:/temp/") === 0; }; +exports.isVolatileTiddler = function(title) { + return title && title.indexOf("$:/temp/volatile/") === 0; +}; + exports.isImageTiddler = function(title) { var tiddler = this.getTiddler(title); if(tiddler) { @@ -1549,4 +1553,3 @@ exports.slugify = function(title,options) { }; })(); - diff --git a/editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid b/editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid index 3453bf2b4..e7fb28939 100644 --- a/editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid +++ b/editions/tw5.com/tiddlers/mechanisms/RefreshThrottling.tid @@ -1,5 +1,5 @@ created: 20191013095916159 -modified: 20191014093837558 +modified: 20210203231820284 tags: RefreshMechanism title: RefreshThrottling type: text/vnd.tiddlywiki @@ -11,6 +11,7 @@ The rules governing refresh throttling are: * When a change notification occurs, throttling will only take place if all of the modified tiddlers meet at least one of these criteria: ** Has the field `draft.of` ** Has the field `throttle.refresh` +** Has a title prefixed with `$:/temp/volatile/` * If the refresh cycle is to be throttled, a timer is set for the internal specified in [[$:/config/Drafts/TypingTimeout|Hidden Setting: Typing Refresh Delay]] (cancelling any preciously set timer) ** When the timer fires, the refresh cycle is triggered, passing the aggregated titles of all the deferred refresh cycles From 270ead47012525d757947b9ee171184af28d2567 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Fri, 21 May 2021 10:43:20 +0200 Subject: [PATCH 1331/2376] Eventcatcher: Fixed FF and IE bugs, added stopPropagation attribute (#5711) --- core/modules/utils/dom/dom.js | 4 ++ core/modules/widgets/eventcatcher.js | 52 +++++++++++-------- .../tiddlers/widgets/EventCatcherWidget.tid | 3 +- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/core/modules/utils/dom/dom.js b/core/modules/utils/dom/dom.js index df4c93b73..299011136 100644 --- a/core/modules/utils/dom/dom.js +++ b/core/modules/utils/dom/dom.js @@ -22,6 +22,10 @@ exports.domContains = function(a,b) { !!(a.compareDocumentPosition(b) & 16); }; +exports.domMatchesSelector = function(node,selector) { + return node.matches ? node.matches(selector) : node.msMatchesSelector(selector); +}; + exports.removeChildren = function(node) { while(node.hasChildNodes()) { node.removeChild(node.firstChild); diff --git a/core/modules/widgets/eventcatcher.js b/core/modules/widgets/eventcatcher.js index c014f8997..0b32689a1 100644 --- a/core/modules/widgets/eventcatcher.js +++ b/core/modules/widgets/eventcatcher.js @@ -47,38 +47,46 @@ EventWidget.prototype.render = function(parent,nextSibling) { domNode.addEventListener(type,function(event) { var selector = self.getAttribute("selector"), actions = self.getAttribute("actions-"+type), + stopPropagation = self.getAttribute("stopPropagation","onaction"), selectedNode = event.target, selectedNodeRect, catcherNodeRect, variables = {}; + // Firefox can fire dragover and dragenter events on text nodes instead of their parents + if(selectedNode.nodeType === 3) { + selectedNode = selectedNode.parentNode; + } if(selector) { // Search ancestors for a node that matches the selector - while(!selectedNode.matches(selector) && selectedNode !== domNode) { + while(!$tw.utils.domMatchesSelector(selectedNode,selector) && selectedNode !== domNode) { selectedNode = selectedNode.parentNode; } // If we found one, copy the attributes as variables, otherwise exit - if(selectedNode.matches(selector)) { - $tw.utils.each(selectedNode.attributes,function(attribute) { - variables["dom-" + attribute.name] = attribute.value.toString(); - }); - //Add a variable with a popup coordinate string for the selected node - variables["tv-popup-coords"] = "(" + selectedNode.offsetLeft + "," + selectedNode.offsetTop +"," + selectedNode.offsetWidth + "," + selectedNode.offsetHeight + ")"; - - //Add variables for offset of selected node - variables["tv-selectednode-posx"] = selectedNode.offsetLeft.toString(); - variables["tv-selectednode-posy"] = selectedNode.offsetTop.toString(); - variables["tv-selectednode-width"] = selectedNode.offsetWidth.toString(); - variables["tv-selectednode-height"] = selectedNode.offsetHeight.toString(); + if($tw.utils.domMatchesSelector(selectedNode,selector)) { + // Only set up variables if we have actions to invoke + if(actions) { + $tw.utils.each(selectedNode.attributes,function(attribute) { + variables["dom-" + attribute.name] = attribute.value.toString(); + }); + //Add a variable with a popup coordinate string for the selected node + variables["tv-popup-coords"] = "(" + selectedNode.offsetLeft + "," + selectedNode.offsetTop +"," + selectedNode.offsetWidth + "," + selectedNode.offsetHeight + ")"; - //Add variables for event X and Y position relative to selected node - selectedNodeRect = selectedNode.getBoundingClientRect(); - variables["event-fromselected-posx"] = (event.clientX - selectedNodeRect.left).toString(); - variables["event-fromselected-posy"] = (event.clientY - selectedNodeRect.top).toString(); + //Add variables for offset of selected node + variables["tv-selectednode-posx"] = selectedNode.offsetLeft.toString(); + variables["tv-selectednode-posy"] = selectedNode.offsetTop.toString(); + variables["tv-selectednode-width"] = selectedNode.offsetWidth.toString(); + variables["tv-selectednode-height"] = selectedNode.offsetHeight.toString(); - //Add variables for event X and Y position relative to event catcher node - catcherNodeRect = self.domNode.getBoundingClientRect(); - variables["event-fromcatcher-posx"] = (event.clientX - catcherNodeRect.left).toString(); - variables["event-fromcatcher-posy"] = (event.clientY - catcherNodeRect.top).toString(); + //Add variables for event X and Y position relative to selected node + selectedNodeRect = selectedNode.getBoundingClientRect(); + variables["event-fromselected-posx"] = (event.clientX - selectedNodeRect.left).toString(); + variables["event-fromselected-posy"] = (event.clientY - selectedNodeRect.top).toString(); + + //Add variables for event X and Y position relative to event catcher node + catcherNodeRect = self.domNode.getBoundingClientRect(); + variables["event-fromcatcher-posx"] = (event.clientX - catcherNodeRect.left).toString(); + variables["event-fromcatcher-posy"] = (event.clientY - catcherNodeRect.top).toString(); + } } else { return false; } @@ -106,6 +114,8 @@ EventWidget.prototype.render = function(parent,nextSibling) { variables["event-detail"] = event.detail.toString(); } self.invokeActionString(actions,self,event,variables); + } + if((actions && stopPropagation === "onaction") || stopPropagation === "always") { event.preventDefault(); event.stopPropagation(); return true; diff --git a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid index 33aa06db8..aeda1450f 100644 --- a/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/EventCatcherWidget.tid @@ -1,5 +1,5 @@ created: 20201123113532200 -modified: 20201202200719126 +modified: 20210520162813234 tags: Widgets title: EventCatcherWidget type: text/vnd.tiddlywiki @@ -30,6 +30,7 @@ The content of the `<$eventcatcher>` widget is displayed normally. |actions-* |Action strings to be invoked when a matching event is trapped. Each event is mapped to an action attribute name of the form <code>actions-<em>event</em></code> where <code><em>event</em></code> represents the type of the event. For example: `actions-click` or `actions-dblclick` | |tag |Optional. The HTML element the widget creates to capture the events, defaults to:<br>» `span` when parsed in inline-mode<br>» `div` when parsed in block-mode | |class |Optional. A CSS class name (or names) to be assigned to the widget HTML element | +|stopPropagation |<<.from-version "5.1.24">> Optional. Set to "always" to always stop event propagation even if there are no corresponding actions to invoke, "never" to never stop event propagation, or the default value "onaction" with which event propagation is only stopped if there are corresponding actions that are invoked. | ! Variables From 07ac85d9fa985f6571a85068a81245293a3b7a76 Mon Sep 17 00:00:00 2001 From: Chris Nicoll <clutterstack@users.noreply.github.com> Date: Fri, 21 May 2021 04:54:11 -0400 Subject: [PATCH 1332/2376] Add demo for keyboard-driven-input (#5710) --- ...nstration_ keyboard-driven-input Macro.tid | 121 ++++++++++++++++++ .../kdi-demo-configtid.tid | 6 + 2 files changed, 127 insertions(+) create mode 100644 editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/Demonstration_ keyboard-driven-input Macro.tid create mode 100644 editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/kdi-demo-configtid.tid diff --git a/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/Demonstration_ keyboard-driven-input Macro.tid b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/Demonstration_ keyboard-driven-input Macro.tid new file mode 100644 index 000000000..519f01c0f --- /dev/null +++ b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/Demonstration_ keyboard-driven-input Macro.tid @@ -0,0 +1,121 @@ +created: 20210222140234737 +modified: 20210520174049056 +tags: Learning +title: Demonstration: keyboard-driven-input Macro +type: text/vnd.tiddlywiki + +\define allshortcuts(descriptor) +<$wikify name=scutlist text=<<displayshortcuts (($descriptor$)) '' ' ' ''>> > +<$list filter="[<scutlist>split[ ]join[</kbd> or <kbd>]addprefix[<kbd>]addsuffix[</kbd>]]" variable=scts><<scts>></$list> +</$wikify> +\end + +\define kdi-demo-textmacrocall() +``` +<$macrocall $name=keyboard-driven-input + tiddler="$(tiddler)$" + storeTitle="$(storeTitle)$" + selectionStateTitle="$(selectionStateTitle)$" + configTiddlerFilter="$(configTiddlerFilter)$" + /> +``` +\end + +<$vars configTiddlerFilter="[[kdi-demo-configtid]]" tiddler="kdi-demo-tiddler" storeTitle="kdi-demo-storeTitle" selectionStateTitle="kdi-demo-selectionStateTitle" > + +The [[keyboard-driven-input Macro]] is used to create filtered lists that update as the user types. It also allows navigating the lists, and invoking macros using list items, with the keyboard. + +It consists of an ''[[edit-text widget|EditTextWidget]]'' wrapped in [[keyboard widgets|KeyboardWidget]]. There are <<.def keyboard>> widgets to listen for `((input-accept))`, `((input-accept-variant))`, and `((input-cancel))` keyboard shortcuts, but there is no default behaviour in response to these events; macros must be written to suit the use-case. There is also no default visualisation of the filtered options list. + +!!Types of keyboard input handled by the <<.var keyboard-driven-input>> macro: + +!!!Non-configurable: + +The following keyboard events invoke macros defined alongside <<.var keyboard-driven-input>> in [[$:/core/macros/keyboard-driven-input]]. + +|Input |Purpose |Macro |h +|typing input |composing a string to be used within list filters |<<.var keyboard-input-actions>> | +|`((input-up))` (<<allshortcuts input-up>>) |temporarily selecting the previous item in the filtered list |<<.var input-next-actions>> with parameters <<.param afterOrBefore>>=`"before"`, <<.param reverse>>=`"reverse[]"` | +|`((input-down))` (<<allshortcuts input-down>>) |temporarily selecting the next item in the filtered list |<<.var input-next-actions>> with <<.param afterOrBefore>>=`"after"`, <<.param reverse>>=`""` | + +All of the above actions generate or modify data which <<.var keyboard-driven-input>> keeps in tiddlers specified using the macro's parameters. The data can then be accessed not only by the macros invoked by keyboard shortcuts, but also outside of these, e.g. a macro to display the filtered list(s). + +!!!Configurable through parameters: + +The following keyboard events invoke macros whose names are specified in parameters to <<.var keyboard-driven-input>>. The intended purpose is suggested by the parameter name, but there are no default macros defined within [[$:/core/macros/keyboard-driven-input]]. + +|[[Keyboard shortcut descriptor |Keyboard Shortcut Descriptor]] |Key combination |Parameter |h +|`((input-accept))` |<<allshortcuts input-accept>> |<<.param inputAcceptActions>> | +|`((input-accept-variant))` |<<allshortcuts input-accept-variant>> |<<.param inputAcceptVariantActions>> | +|`((input-cancel))` |<<allshortcuts input-cancel>> |<<.param inputCancelActions>> | + +<<.var keyboard-driven-input>> can be seen in action as part of various core features in TiddlyWiki, e.g.: the [[search feature|Searching in TiddlyWiki]], the [[tag-picker Macro]], and dropdown interfaces in the [[Editor toolbar]] such as [[Insert link]]. + +!!Minimal ingredients for a demonstration + +Keeping in mind that the <<.var keyboard-driven-input>> macro does not, by itself, display list results, or do anything with a selected option, a minimal demonstration of the <<.var keyboard-driven-input>> macro requires: + +# ''a tiddler, containing a filter'' whose results depend on the user's text input, to generate the options from which the user can select +# ''several parameters:'' +#*''a filter'' to return the title of the tiddler where the filter described in step 1 can be found, and +#*''tiddler titles'' to use for storing state information in response to input events. These tiddlers do not need to exist already. If they do exist, the <<.var keyboard-driven-input>> macro will change their contents. + +!!The search filter(s) + +By default, <<.var keyboard-driven-input>> will look for filters in the <<.field first-search-filter>> and <<.field second-search-filter>> fields of a tiddler (whose title is specified by a parameter discussed below). + +This filter can refer to a variable called <<.var userInput>>, which shows the contents of the <<.def edit-text>> widget, as stored in a state tiddler (discussed below), at the time of the latest <kbd><<displayshortcuts ((input-up))>></kbd> or <kbd><<displayshortcuts ((input-down))>></kbd> event. + +''Note:'' If this filter is to be referred to in a context outside the <<.var keyboard-driven-input>> macro (such as in a popup showing the filtered options), the variable <<.var userInput>> has to be defined in those contexts as well (by reading it from a state tiddler). + +!!Minimal parameters + +|Parameter name |Notes |h +|<<.param configTiddlerFilter>> |This is a filter, rather than a tiddler title, allowing conditional behaviour (e.g. checking for an active tab, or preferring a filter that may not be present, with a fallback).<br>The title returned must belong to an existing tiddler, containing at least one filter with which <<.var keyboard-driven-input>> can generate its results list. | +|<<.param tiddler>> |This tiddler contains either the typed input, or the instantaneous result selection, depending upon the most recent event. It is updated with each keystroke in the ''edit-text'' widget, //and// when the user uses the <kbd><<displayshortcuts ((input-up))>></kbd> or <kbd><<displayshortcuts ((input-down))>></kbd> key to cycle through filtered results. | +|<<.param storeTitle>> |This tiddler always reflects the user input (transcluded from the tiddler <<.param tiddler>> after each keystroke into the ''edit-text'' widget). | +|<<.param selectionStateTitle>> |This tiddler is updated on <kbd><<displayshortcuts ((input-up))>></kbd> or <kbd><<displayshortcuts ((input-down))>></kbd> events and contains either the user input with the suffix `-userInput`, or the instantaneous selection with the suffix `-primaryList` or `-secondaryList`, depending on which of up to two filters generated the list it came from. | + +!!Demonstration setup + +I have created a tiddler called <$list filter=<<configTiddlerFilter>> /> and put the following filter into its <<.field first-search-filter>> field: + +<code><$list filter=<<configTiddlerFilter>> ><$text text={{!!first-search-filter}}/></$list></code>. + +This filters for non-system tiddlers whose titles contain the text the user has typed. + +To use the above filter with <<.var keyboard-driven-input>>, the value of the parameter <<.param configTiddlerFilter>> should be a filter that returns <$list filter=<<configTiddlerFilter>> />. + +I can select <<.param tiddler>>, <<.param storeTitle>>, and <<.param selectionStateTitle>> fairly arbitrarily (just making sure not to use titles of tiddlers that I do not want changed). + +This demonstration can now be invoked with the following macro call: + +<<kdi-demo-textmacrocall>> + +!!Demo + +Try typing in here: <$macrocall $name=keyboard-driven-input + tiddler=<<tiddler>> + storeTitle=<<storeTitle>> + selectionStateTitle=<<selectionStateTitle>> + configTiddlerFilter=<<configTiddlerFilter>> + /> + +Observe the changes in the various state tiddlers in the below table. Use <kbd><<displayshortcuts ((input-up))>></kbd> and <kbd><<displayshortcuts ((input-down))>></kbd> keys to navigate among filter results. If nothing changes, try a shorter input to widen the filter. If the input has zero length, the list will contain all non-system tiddlers. + +@@.tablestyle + +|Parameter name |Tiddler title |Contents of <<.field text>> field of the tiddler |h +|<<.param tiddler>> |{{{[<tiddler>]}}} |<pre><$text text={{{[<tiddler>get[text]]}}}/></pre>| +|<<.param storeTitle>> |{{{[<storeTitle>]}}} |<pre><$text text= {{{[<storeTitle>get[text]]}}}/></pre>| +|<<.param selectionStateTitle>> |{{{[<selectionStateTitle>]}}} |<pre><$text text={{{[<selectionStateTitle>get[text]]}}}/></pre>| +@@ + +The <<.var keyboard-driven-input>> macro has many parameters available, including all the attributes of the enclosed ''edit-text'' widget, which make it very flexible in how it is used and how results can be displayed and interacted with. + +See also: [[Customising search results]] and [[$:/core/ui/DefaultSearchResultList]] + +<style> +.tablestyle {width:100%;} +.tablestyle td + td + td {width: 50%;} +</style> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/kdi-demo-configtid.tid b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/kdi-demo-configtid.tid new file mode 100644 index 000000000..f13ff6b15 --- /dev/null +++ b/editions/tw5.com/tiddlers/demonstrations/KeyboardDrivenInput/kdi-demo-configtid.tid @@ -0,0 +1,6 @@ +created: 20210131043724146 +first-search-filter: [!is[system]search:title<userInput>sort[]] +modified: 20210204012422020 +tags: +title: kdi-demo-configtid +type: text/vnd.tiddlywiki \ No newline at end of file From c8528fd1f761963348c4723033916d1499ce9bc6 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Fri, 21 May 2021 11:02:35 +0200 Subject: [PATCH 1333/2376] Update keyboard-driven-input_Macro.tid (#5712) --- .../tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid | 3 +++ 1 file changed, 3 insertions(+) diff --git a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid index 720e612d1..8baff655c 100644 --- a/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid +++ b/editions/tw5.com/tiddlers/macros/keyboard-driven-input_Macro.tid @@ -20,3 +20,6 @@ The additional parameters are: |secondSearchFilterField |the field of the configTiddler where the second search-filter is stored. Defaults to <<.field second-search-filter>> | |filterMinLength |the minimum length of the user input after which items are filtered | +See [[Demonstration: keyboard-driven-input Macro]] for further guidance on using this macro. + + From 81b5fe944a8ebdb27b9972d3fa7093fe5f5ce68c Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Fri, 21 May 2021 02:11:23 -0700 Subject: [PATCH 1334/2376] extend lookup op flexibility with 2 parameters (#5315) --- core/modules/filters/lookup.js | 39 ++++++++++++++++--- .../examples/lookup Operator (Examples).tid | 5 ++- .../tiddlers/filters/lookup Operator.tid | 36 ++++++++++++----- 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/core/modules/filters/lookup.js b/core/modules/filters/lookup.js index 2174e8c47..4af4ac681 100644 --- a/core/modules/filters/lookup.js +++ b/core/modules/filters/lookup.js @@ -5,9 +5,11 @@ module-type: filteroperator Filter operator that looks up values via a title prefix -[lookup:<field>[<prefix>]] +[lookup:<defaultvalue>:<field OR index>[<prefix>],[<field-name OR index-name>]] -Prepends the prefix to the selected items and returns the specified field value +Prepends the prefix to the selected items and returns the specified +field or index value. If the 2nd suffix does not exist, it defaults to field. +If the second operand is missing it defaults to "text" for fields, and "0" for indexes \*/ (function(){ @@ -20,10 +22,35 @@ Prepends the prefix to the selected items and returns the specified field value Export our filter function */ exports.lookup = function(source,operator,options) { - var results = []; - source(function(tiddler,title) { - results.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix || ''); - }); + var results = [], + suffixes = operator.suffixes || [], + defaultSuffix = suffixes[0] ? (suffixes[0][0] || "") : "", + indexSuffix = (suffixes[1] && suffixes[1][0] === "index") ? true : false, + target; + if(operator.operands.length == 2) { + target = operator.operands[1] + } else { + target = indexSuffix ? "0": "text"; + } + if(indexSuffix) { + source(function(tiddler,title) { + var targetTitle = operator.operands[0] + title; + var data = options.wiki.extractTiddlerDataItem(targetTitle,target,defaultSuffix); + results.push(data); + }); + } else { + source(function(tiddler,title) { + var targetTitle = operator.operands[0] + title; + var targetTiddler = options.wiki.getTiddler(targetTitle); + if(targetTiddler) { + var value = targetTiddler.getFieldString(target); + if(value == "" && defaultSuffix !== "") { + value = defaultSuffix; + } + results.push(value); + } + }); + } return results; }; diff --git a/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid index 052e1d2bd..e923e8d5c 100644 --- a/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid @@ -1,7 +1,10 @@ created: 20170907144257037 -modified: 20170907144559822 +modified: 20201224034837935 title: lookup Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[all[shadows+tiddlers]tag[$:/tags/PageControls]lookup[$:/config/PageControlButtons/Visibility/]]" "Retrieve the visibility status of each page control button">> <<.operator-example 2 "[all[shadows+tiddlers]tag[$:/tags/PageControls]lookup:show[$:/config/PageControlButtons/Visibility/]]" "Retrieve the visibility status of each page control button, this time with a default value">> +<<.operator-example 3 "[all[tiddlers]has[plugin-type]removeprefix[$:/plugins/tiddlywiki/]lookup:missing-description:field[$:/plugins/tiddlywiki/],[description]]" "Retrieve the description of all plugin-tiddlers that are in the `$:/plugins/tiddlywiki/` namespace.">> +<<.operator-example 4 "OriginalTiddlerPaths +[lookup:missing-index:index[$:/config/],[HelloThere]]" "Lookup the original tiddler path on disk for the [[Hello There]] tiddler.">> +<<.operator-example 5 "OriginalTiddlerPaths +[lookup:missing-index:index[$:/config/],[MissingTiddler]]" "Lookup the original tiddler path on disk for the [[MissingTiddler]] tiddler.">> diff --git a/editions/tw5.com/tiddlers/filters/lookup Operator.tid b/editions/tw5.com/tiddlers/filters/lookup Operator.tid index 9cbd6d5b5..4262564a4 100644 --- a/editions/tw5.com/tiddlers/filters/lookup Operator.tid +++ b/editions/tw5.com/tiddlers/filters/lookup Operator.tid @@ -1,24 +1,40 @@ caption: lookup created: 20170907103639431 -modified: 20170907144703051 +modified: 20210116081305739 op-input: a [[selection of titles|Title Selection]] -op-output: the lookup values corresponding to each input title -op-parameter: prefix applied to input titles to yield title of lookup tiddler from which value is retrieved -op-parameter-name: P -op-purpose: applies a prefix to each input title to yield the title of a tiddler from which the final value is retrieved -op-suffix: the default value to be used for missing lookups -op-suffix-name: D +op-output: the lookup values corresponding to each lookup tiddler +op-parameter: prefix applied to input titles to yield title of lookup tiddler from which value is retrieved. Now accepts 1 or 2 parameters, see below for details +op-parameter-name: P, T +op-purpose: applies a prefix to each input title to yield the title of a tiddler from which the final value is retrieved. With a single parameter, the default field is "text" and the default index is "0". If a second parameter is provided, that becomes the target field or index. +op-suffix: the default value to be used for missing lookups. This operator can now accept a second suffix, see below for details +op-suffix-name: D, I tags: [[Filter Operators]] title: lookup Operator type: text/vnd.tiddlywiki <<.from-version "5.1.15">> -The action of this operator is as follows: +The action of this operator is as follows with 1 parameter: * Apply the specified prefix to each input tiddler title, yielding a new list of tiddler titles -* Transclude the value of each of those tiddlers -** Substitute the default value for missing or empty tiddlers +* Transclude the value of the `text` field each of those tiddlers +** Substitute the default value for missing or empty values +* Return the list of values + +<<.from-version "5.1.24">> + +The action of this operator is as follows with 2 parameters: + +If there are two parameters provided, use the second parameter as the target field or index. + +<<.note """If there is only one parameter given, the filter checks for a second suffix equal to "index". If this suffix is found, the default target index is "0". +In all other cases, the default target field is "text".""">> + +Then: + +* Apply the specified prefix to each input tiddler title, yielding a new list of tiddler titles +* Transclude the value of the target field or index +** Substitute the default value for missing or empty values * Return the list of values <<.operator-examples "lookup">> From 0003d70132995bfd5e0005692438f2f8e04b27b3 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Fri, 21 May 2021 11:35:40 +0200 Subject: [PATCH 1335/2376] New text operation insert-text (#5707) --- .../editor/operations/text/insert-text.js | 23 +++++++++++++++++ core/ui/EditorToolbar/file-import.tid | 2 +- .../WidgetMessage_ tm-edit-text-operation.tid | 25 ++++++++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 core/modules/editor/operations/text/insert-text.js diff --git a/core/modules/editor/operations/text/insert-text.js b/core/modules/editor/operations/text/insert-text.js new file mode 100644 index 000000000..784714968 --- /dev/null +++ b/core/modules/editor/operations/text/insert-text.js @@ -0,0 +1,23 @@ +/*\ +title: $:/core/modules/editor/operations/text/insert-text.js +type: application/javascript +module-type: texteditoroperation + +Text editor operation insert text at the caret position. If there is a selection it is replaced. + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports["insert-text"] = function(event,operation) { + operation.replacement = event.paramObject.text; + operation.cutStart = operation.selStart; + operation.cutEnd = operation.selEnd; + operation.newSelStart = operation.selStart + operation.replacement.length; + operation.newSelEnd = operation.newSelStart; +}; + +})(); diff --git a/core/ui/EditorToolbar/file-import.tid b/core/ui/EditorToolbar/file-import.tid index 742597102..d8024f3d8 100644 --- a/core/ui/EditorToolbar/file-import.tid +++ b/core/ui/EditorToolbar/file-import.tid @@ -16,7 +16,7 @@ condition: [<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki] <$list filter="[<importTitle>links[]] :reduce[get[type]prefix[image]then<replacement-text-image>else<replacement-text-file>search-replace[$title$],<currentTiddler>addprefix<accumulator>]" variable="imageTitle"> <$action-sendmessage $message="tm-edit-text-operation" - $param="replace-selection" + $param="insert-text" text=<<imageTitle>> /> </$list> diff --git a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-edit-text-operation.tid b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-edit-text-operation.tid index a41207120..ab8d61e6d 100644 --- a/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-edit-text-operation.tid +++ b/editions/tw5.com/tiddlers/messages/WidgetMessage_ tm-edit-text-operation.tid @@ -1,6 +1,6 @@ caption: tm-edit-text-operation created: 20160424211339792 -modified: 20180630073432471 +modified: 20210520053923011 tags: Messages title: WidgetMessage: tm-edit-text-operation type: text/vnd.tiddlywiki @@ -93,6 +93,27 @@ Saves the text of the current //selection// into the provided <<.param "tiddler" </div> \end +\define makeLinkDescription() +<div> + +Creates a wiki text link to the tiddler specified in <<.param "text">>. If there is a selection, it is used as the text of the link. + +|!Name |!Description | +|text |Tiddler title to which the link will be created | + +</div> +\end + +\define insertTextDescription() +<div> + +Inserts the text specified in <<.param "text">> at the caret position. If there is a selection, it is replaced. + +|!Name |!Description | +|text |Text to be inserted | + +</div> +\end A `tm-edit-text-operation` invokes one of the available operations on a __surrounding__ text editor. Therefore the message has to be dispatched within the editor in order for it to catch it. The following properties on the `event` object are required: @@ -114,6 +135,8 @@ At this point the following text operations have been implemented: |<<.def "wrap-lines">>|<<wrapLinesDescription>> | |<<.def "wrap-selection">>|<<wrapSelectionDescription>> | |<<.def "save-selection">>|<<saveSelectionDescription>> | +|<<.def "make-link">>|<<makeLinkDescription>> | +|<<.def "insert-text">>|<<insertTextDescription>>| !Example From 10b20657ccb88ec0b12c1e789f78e76ceead1add Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 22 May 2021 11:50:11 +0200 Subject: [PATCH 1336/2376] Deserializers[] filter operator (#5673) --- core/modules/filters/deserializers.js | 27 +++++++++++++++++++ editions/test/tiddlers/tests/test-filters.js | 4 +++ .../filters/deserializers Operator.tid | 14 ++++++++++ .../deserializers Operator (Examples).tid | 7 +++++ .../tiddlers/widgets/DropzoneWidget.tid | 4 +-- 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 core/modules/filters/deserializers.js create mode 100644 editions/tw5.com/tiddlers/filters/deserializers Operator.tid create mode 100644 editions/tw5.com/tiddlers/filters/examples/deserializers Operator (Examples).tid diff --git a/core/modules/filters/deserializers.js b/core/modules/filters/deserializers.js new file mode 100644 index 000000000..ddca998ea --- /dev/null +++ b/core/modules/filters/deserializers.js @@ -0,0 +1,27 @@ +/*\ +title: $:/core/modules/filters/deserializers.js +type: application/javascript +module-type: filteroperator + +Filter operator for returning the names of the deserializers in this wiki + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.deserializers = function(source,operator,options) { + var results = []; + $tw.utils.each($tw.Wiki.tiddlerDeserializerModules,function(deserializer,type) { + results.push(type); + }); + results.sort(); + return results; +}; + +})(); \ 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 7125e492e..a02114f2b 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -809,6 +809,10 @@ function runTests(wiki) { expect(wiki.filterTiddlers("'-' +[escapecss[]]").join(",")).toBe("\\-"); }); + it("should handle the deserializers operator", function() { + expect(wiki.filterTiddlers("[deserializers[]]").join(",")).toBe("application/javascript,application/json,application/x-tiddler,application/x-tiddler-html-div,application/x-tiddlers,text/css,text/html,text/plain"); + }); + } }); diff --git a/editions/tw5.com/tiddlers/filters/deserializers Operator.tid b/editions/tw5.com/tiddlers/filters/deserializers Operator.tid new file mode 100644 index 000000000..0f271168c --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/deserializers Operator.tid @@ -0,0 +1,14 @@ +caption: deserializers +created: 20210506115203172 +from-version: 5.1.24 +modified: 20210506130322593 +op-input: ignored +op-output: the title of each available deserializer +op-parameter: none +tags: [[Filter Operators]] [[Special Operators]] +title: deserializers Operator +type: text/vnd.tiddlywiki + +<<.tip "You can specify a specific deserializer for a DropzoneWidget to use">> + +<<.operator-examples "deserializers">> diff --git a/editions/tw5.com/tiddlers/filters/examples/deserializers Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/deserializers Operator (Examples).tid new file mode 100644 index 000000000..32efb2f46 --- /dev/null +++ b/editions/tw5.com/tiddlers/filters/examples/deserializers Operator (Examples).tid @@ -0,0 +1,7 @@ +created: 20210506115345021 +modified: 20210506115402052 +tags: [[Operator Examples]] [[deserializer Operator]] +title: deserializers Operator (Examples) +type: text/vnd.tiddlywiki + +<<.operator-example 1 "[deserializers[]]">> diff --git a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid index 812e88f70..acec189c3 100644 --- a/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/DropzoneWidget.tid @@ -1,6 +1,6 @@ caption: dropzone created: 20131024141900000 -modified: 20210519154948743 +modified: 20210506115809131 tags: Widgets title: DropzoneWidget type: text/vnd.tiddlywiki @@ -25,7 +25,7 @@ It sends a [[WidgetMessage: tm-import-tiddlers]] carrying a JSON representation <<.tip """Use the `prefix` filter operator to easily accept multiple related content types. For example this filter will accept all image content types: `[prefix[image/]]`""">> -The list of available deserializers can be inspected by executing `Object.keys($tw.Wiki.tiddlerDeserializerModules).sort().join("\n")` in the browser JavaScript console. +<<.tip "The list of available deserializers can be seen by using the filter `[deserializers[]]` in the Filter tab in [[Advanced Search|$:/AdvancedSearch]].">> The dropzone widget displays any contained content within the dropzone. From bf25c4d34a7f90d95e9c89ed883bb008d247d8e9 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 22 May 2021 12:07:55 +0200 Subject: [PATCH 1337/2376] Docs for new system tag $:/tags/EditorTools (#5705) --- .../systemtags/SystemTag_ $__tags_EditorTools.tid | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_EditorTools.tid diff --git a/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_EditorTools.tid b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_EditorTools.tid new file mode 100644 index 000000000..c4a0401ca --- /dev/null +++ b/editions/tw5.com/tiddlers/systemtags/SystemTag_ $__tags_EditorTools.tid @@ -0,0 +1,9 @@ +caption: $:/tags/EditorTools +created: 20210519160245560 +description: marks the edit mode tiddler toolbar for non-button elements. +modified: 20210519160509587 +tags: SystemTags +title: SystemTag: $:/tags/EditorTools +type: text/vnd.tiddlywiki + +The [[system tag|SystemTags]] `$:/tags/EditorTools` can be used to include non-button UI elements in the edit mode tiddler toolbar. For buttons see [[SystemTag: $:/tags/EditToolbar]]. \ No newline at end of file From 3fc7895af296b84865901ec41fbb628ffe94756d Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Sat, 22 May 2021 20:43:37 +0200 Subject: [PATCH 1338/2376] CurrentTiddler variable consistency in subfilters and prefixes (#5691) * Make currentTiddler variable consistent in subfilters and filter run prefixes * Updated filterun prefix and subfilter operators to use ..currentTiddler instead of outerCurrentTiddler --- core/modules/filterrunprefixes/filter.js | 17 ++++++++-- core/modules/filterrunprefixes/reduce.js | 34 ++++++++++--------- core/modules/filterrunprefixes/sort.js | 18 +++++----- core/modules/filters/filter.js | 13 ++++++- core/modules/filters/reduce.js | 2 ++ core/modules/filters/sortsub.js | 11 +++--- editions/tw5.com/tiddlers/filters/filter.tid | 4 ++- editions/tw5.com/tiddlers/filters/reduce.tid | 3 +- .../tiddlers/filters/sortsub Operator.tid | 6 ++-- .../filters/syntax/Filter Expression.tid | 4 ++- .../filters/syntax/Sort Filter Run Prefix.tid | 4 +-- 11 files changed, 77 insertions(+), 39 deletions(-) diff --git a/core/modules/filterrunprefixes/filter.js b/core/modules/filterrunprefixes/filter.js index 555f8981b..55bc25dd7 100644 --- a/core/modules/filterrunprefixes/filter.js +++ b/core/modules/filterrunprefixes/filter.js @@ -17,10 +17,21 @@ exports.filter = function(operationSubFunction,options) { return function(results,source,widget) { if(results.length > 0) { var resultsToRemove = []; - results.each(function(result) { - var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget); + results.each(function(title) { + var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ + getVariable: function(name) { + switch(name) { + case "currentTiddler": + return "" + title; + case "..currentTiddler": + return widget.getVariable("currentTiddler"); + default: + return widget.getVariable(name); + } + } + }); if(filtered.length === 0) { - resultsToRemove.push(result); + resultsToRemove.push(title); } }); results.remove(resultsToRemove); diff --git a/core/modules/filterrunprefixes/reduce.js b/core/modules/filterrunprefixes/reduce.js index 534c3e450..33ec25c7f 100644 --- a/core/modules/filterrunprefixes/reduce.js +++ b/core/modules/filterrunprefixes/reduce.js @@ -19,23 +19,25 @@ exports.reduce = function(operationSubFunction,options) { var index = 0; results.each(function(title) { var list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ - getVariable: function(name) { - switch(name) { - case "currentTiddler": - return "" + title; - case "accumulator": - return "" + accumulator; - case "index": - return "" + index; - case "revIndex": - return "" + (results.length - 1 - index); - case "length": - return "" + results.length; - default: - return widget.getVariable(name); - } + getVariable: function(name) { + switch(name) { + case "currentTiddler": + return "" + title; + case "..currentTiddler": + return widget.getVariable("currentTiddler"); + case "accumulator": + return "" + accumulator; + case "index": + return "" + index; + case "revIndex": + return "" + (results.length - 1 - index); + case "length": + return "" + results.length; + default: + return widget.getVariable(name); } - }); + } + }); if(list.length > 0) { accumulator = "" + list[0]; } diff --git a/core/modules/filterrunprefixes/sort.js b/core/modules/filterrunprefixes/sort.js index 689193fff..ecaba9313 100644 --- a/core/modules/filterrunprefixes/sort.js +++ b/core/modules/filterrunprefixes/sort.js @@ -26,15 +26,17 @@ exports.sort = function(operationSubFunction,options) { compareFn; results.each(function(title) { var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ - getVariable: function(name) { - switch(name) { - case "currentTiddler": - return "" + title; - default: - return widget.getVariable(name); - } + getVariable: function(name) { + switch(name) { + case "currentTiddler": + return "" + title; + case "..currentTiddler": + return widget.getVariable("currentTiddler"); + default: + return widget.getVariable(name); } - }); + } + }); sortKeys.push(key[0] || ""); }); results.clear(); diff --git a/core/modules/filters/filter.js b/core/modules/filters/filter.js index 4be552cff..8284929a7 100644 --- a/core/modules/filters/filter.js +++ b/core/modules/filters/filter.js @@ -20,7 +20,18 @@ exports.filter = function(source,operator,options) { results = [], target = operator.prefix !== "!"; source(function(tiddler,title) { - var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget); + var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{ + getVariable: function(name) { + switch(name) { + case "currentTiddler": + return "" + title; + case "..currentTiddler": + return options.widget.getVariable("currentTiddler"); + default: + return options.widget.getVariable(name); + } + } + }); if((list.length > 0) === target) { results.push(title); } diff --git a/core/modules/filters/reduce.js b/core/modules/filters/reduce.js index 206936887..831b354a1 100644 --- a/core/modules/filters/reduce.js +++ b/core/modules/filters/reduce.js @@ -31,6 +31,8 @@ exports.reduce = function(source,operator,options) { switch(name) { case "currentTiddler": return "" + title; + case "..currentTiddler": + return options.widget.getVariable("currentTiddler"); case "accumulator": return "" + accumulator; case "index": diff --git a/core/modules/filters/sortsub.js b/core/modules/filters/sortsub.js index f556bfafc..a926362e3 100644 --- a/core/modules/filters/sortsub.js +++ b/core/modules/filters/sortsub.js @@ -27,10 +27,13 @@ exports.sortsub = function(source,operator,options) { iterator(options.wiki.getTiddler(title),title); },{ getVariable: function(name) { - if(name === "currentTiddler") { - return title; - } else { - return options.widget.getVariable(name); + switch(name) { + case "currentTiddler": + return "" + title; + case "..currentTiddler": + return options.widget.getVariable("currentTiddler"); + default: + return options.widget.getVariable(name); } } }); diff --git a/editions/tw5.com/tiddlers/filters/filter.tid b/editions/tw5.com/tiddlers/filters/filter.tid index 62619c20f..bd6cae1b9 100644 --- a/editions/tw5.com/tiddlers/filters/filter.tid +++ b/editions/tw5.com/tiddlers/filters/filter.tid @@ -1,6 +1,6 @@ caption: filter created: 20200929174420821 -modified: 20201027185144953 +modified: 20210522162551921 op-input: a [[selection of titles|Title Selection]] passed as input to the filter op-neg-input: a [[selection of titles|Title Selection]] passed as input to the filter op-neg-output: those input titles that <<.em "do not">> pass the filter <<.place S>> @@ -28,6 +28,8 @@ Simple filter operations can be concatenated together directly (eg `[tag[HelloTh </$vars> ``` +Note that within the subfilter, the "currentTiddler" variable is set to the title of the tiddler being processed. The value of currentTiddler outside the subfilter is available in the variable "..currentTiddler". <<.from-version "5.1.24">> + <<.tip "Compare with the similar [[subfilter|subfilter Operator]] operator which runs a subfilter and directly returns the results">> <<.tip "Compare with the analagous named filter run prefix `:filter`">> diff --git a/editions/tw5.com/tiddlers/filters/reduce.tid b/editions/tw5.com/tiddlers/filters/reduce.tid index d9893346c..d566dad59 100644 --- a/editions/tw5.com/tiddlers/filters/reduce.tid +++ b/editions/tw5.com/tiddlers/filters/reduce.tid @@ -1,6 +1,6 @@ caption: reduce created: 20201004154131193 -modified: 20201208185109549 +modified: 20210522162536854 op-input: a [[selection of titles|Title Selection]] passed as input to the filter op-output: the final result of running the subfilter <<.place S>> op-parameter: a [[filter expression|Filter Expression]]. Optional second parameter for initial value for accumulator @@ -18,6 +18,7 @@ The following variables are available within the subfilter: * ''accumulator'' - the result of the previous subfilter run * ''currentTiddler'' - the input title +* ''..currentTiddler'' - the value of the variable `currentTiddler` outside the subfilter. <<.from-version "5.1.24">> * ''index'' - the numeric index of the current list item (with zero being the first item in the list) * ''revIndex'' - the reverse numeric index of the current list item (with zero being the last item in the list) * ''length'' - the total length of the input list diff --git a/editions/tw5.com/tiddlers/filters/sortsub Operator.tid b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid index 451b979c9..f010357f2 100644 --- a/editions/tw5.com/tiddlers/filters/sortsub Operator.tid +++ b/editions/tw5.com/tiddlers/filters/sortsub Operator.tid @@ -1,6 +1,6 @@ caption: sortsub created: 20200424160155182 -modified: 20210428152533501 +modified: 20210522162521222 op-input: a [[selection of titles|Title Selection]] op-neg-output: the input, sorted into reverse order by the result of evaluating subfilter <<.param S>> op-output: the input, sorted into ascending order by the result of evaluating subfilter <<.param S>> @@ -15,7 +15,9 @@ type: text/vnd.tiddlywiki Each item in the list of input titles is passed to the subfilter in turn. The subfilter transforms the input titles into the form needed for sorting. For example, the subfilter `[length[]]` transforms each input title in the number representing its length, and thus sorts the input titles according to their length. -Note that within the subfilter, the "currentTiddler" variable is set to the title of the tiddler being processed. This permits subfilters like `[{!!value}divide{!!cost}]` to be used for computation. +Note that within the subfilter, the "currentTiddler" variable is set to the title of the tiddler being processed. This permits subfilters like `[{!!value}divide{!!cost}]` to be used for computation. + +The value of currentTiddler outside the subfilter is available in the variable "..currentTiddler". <<.from-version "5.1.24">> The suffix <<.place T>> determines how the items are compared and can be: diff --git a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid index ec72fbd6a..34c07faea 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Filter Expression.tid @@ -1,5 +1,5 @@ created: 20150124182421000 -modified: 20210428084144231 +modified: 20210522162642994 tags: [[Filter Syntax]] title: Filter Expression type: text/vnd.tiddlywiki @@ -33,6 +33,8 @@ If a run has: <<.tip "Compare named filter run prefix `:reduce` with [[reduce Operator]] which is used to used to flatten a list of items down to a single item by repeatedly applying a subfilter.">> +<<.tip """Within the filter runs prefixed with `:reduce`, `:sort` and `:filter`, the "currentTiddler" variable is set to the title of the tiddler being processed. The value of currentTiddler outside the subfilter is available in the variable "..currentTiddler".<<.from-version "5.1.24">>""" >> + In technical / logical terms: |!Run |!Equivalent named prefix |!Interpretation |!Output | diff --git a/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid b/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid index 2fca72716..aed26cb6b 100644 --- a/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid +++ b/editions/tw5.com/tiddlers/filters/syntax/Sort Filter Run Prefix.tid @@ -1,5 +1,5 @@ created: 20210428083929749 -modified: 20210428140713422 +modified: 20210522162628946 tags: [[Filter Syntax]] [[Filter Run Prefix]] title: Sort Filter Run Prefix type: text/vnd.tiddlywiki @@ -13,7 +13,7 @@ type: text/vnd.tiddlywiki Each input title from previous runs is passed to this run in turn. The filter run transforms the input titles into the form needed for sorting. For example, the filter run `[length[]]` transforms each input title in to the number representing its length, and thus sorts the input titles according to their length. -Note that within the filter run, the "currentTiddler" variable is set to the title of the tiddler being processed. This permits filter runs like `:sort:number[{!!value}divide{!!cost}]` to be used for computation. +Note that within the filter run, the "currentTiddler" variable is set to the title of the tiddler being processed. This permits filter runs like `:sort:number[{!!value}divide{!!cost}]` to be used for computation. The value of currentTiddler outside the run is available in the variable "..currentTiddler". The `:sort` filter run prefix uses an extended syntax that allows for multiple suffixes, some of which are required: From 485779f5b2136b7bcd739352b56188d94b0eb9e4 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sat, 22 May 2021 20:00:24 +0100 Subject: [PATCH 1339/2376] Fix crash when accessing variables in filters that don't have a widget context This should catch a large number of crashes, including: Fixes #5716 --- core/modules/filters.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/modules/filters.js b/core/modules/filters.js index 7799b23d6..89a9e8ccf 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -323,6 +323,9 @@ exports.compileFilter = function(filterString) { } else if(typeof source === "object") { // Array or hashmap source = self.makeTiddlerIterator(source); } + if(!widget) { + widget = $tw.rootWidget; + } var results = new $tw.utils.LinkedList(); $tw.utils.each(operationFunctions,function(operationFunction) { operationFunction(results,source,widget); From 3fe5b7777083576e66c962c4365c5171768733c0 Mon Sep 17 00:00:00 2001 From: Xavier Cazin <cazinx@gmail.com> Date: Sun, 23 May 2021 12:07:55 +0200 Subject: [PATCH 1340/2376] Updates to fr-FR translations (#5718) * fr-FR help for the use-browser-cache param of the listen command * fr-FR dialog heading for drag&drop image import in editor * fr-FR translations for PutForbidden & PutUnauthorized errors * fr-FR translations for TiddlySpot and TiddlyHost saver information * Update to fr-FR translations for named filters in $:/AdvancedSearch tab * fr-FR translation update for the render command help * fr-FR update to ModuleTypes translations * fr-FR help update for the sse-enabled param of the listen command * fr-FR update to ControlPanel Basics information * fr-FR translation improvements to TiddlerInfo captions and hints * fr-FR translation for the Layout Switcher caption * fr-FR translation updates for Layout-related information * fr-FR translation for ConfirmAction * fr-FR for the captions related to tag input clearing --- languages/fr-FR/ControlPanel.multids | 6 +++++- languages/fr-FR/Docs/ModuleTypes.multids | 3 ++- languages/fr-FR/EditTemplate.multids | 2 ++ languages/fr-FR/Filters.multids | 5 +++-- languages/fr-FR/Help/listen.tid | 2 ++ languages/fr-FR/Help/render.tid | 9 +++++---- languages/fr-FR/Import.multids | 1 + languages/fr-FR/Misc.multids | 10 ++++++++++ languages/fr-FR/TiddlerInfo.multids | 4 ++-- 9 files changed, 32 insertions(+), 10 deletions(-) diff --git a/languages/fr-FR/ControlPanel.multids b/languages/fr-FR/ControlPanel.multids index 89298c459..8991548b5 100644 --- a/languages/fr-FR/ControlPanel.multids +++ b/languages/fr-FR/ControlPanel.multids @@ -17,6 +17,8 @@ Basics/NewJournal/Tags/Prompt: Tags pour les nouveaux tiddlers journaux Basics/NewTiddler/Title/Prompt: Modèle pour les titres des nouveaux tiddlers Basics/NewTiddler/Tags/Prompt: Tags pour les nouveaux tiddlers Basics/OverriddenShadowTiddlers/Prompt: Nombre de tiddlers //shadow// modifiés +Basics/RemoveTags: Mettre à jour vers le format courant +Basics/RemoveTags/Hint: Met à jour la configuration des tags vers le format le plus récent Basics/ShadowTiddlers/Prompt: Nombre de tiddlers //shadow// Basics/Subtitle/Prompt: Sous-titre Basics/SystemTiddlers/Prompt: Nombre de tiddlers système : @@ -44,6 +46,7 @@ KeyboardShortcuts/Platform/Linux: Plate-forme Linux seulement KeyboardShortcuts/Platform/NonLinux: Plate-formes non-Linux seulement KeyboardShortcuts/Platform/Windows: Plate-forme Windows seulement KeyboardShortcuts/Platform/NonWindows: Plates-formes non-Windows seulement +LayoutSwitcher/Caption: Mise en page LoadedModules/Caption: Modules chargés LoadedModules/Hint: Liste des modules chargés, liés à leurs tiddlers sources. Les italiques indiquent que les tiddlers sources n'existent pas, le plus souvent parce que le module a été créé lors du processus d'amorçage. Palette/Caption: Palette @@ -119,11 +122,12 @@ Saving/TiddlySpot/Advanced/Heading: Paramètres avancés Saving/TiddlySpot/BackupDir: Dossier des //sauvegardes// Saving/TiddlySpot/Backups: Sauvegardes Saving/TiddlySpot/Caption: Enregistreur ~TiddlySpot -Saving/TiddlySpot/Description: Ces paramètres ne servent que lors de la sauvegarde vers http://tiddlyspot.com ou vers un serveur distant compatible +Saving/TiddlySpot/Description: Ces paramètres ne servent que lors de la sauvegarde vers [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]] ou vers un serveur distant compatible. Voir [[here|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] pour plus d'informations sur la configuration de la sauvegarde sur ~TiddlySpot et ~TiddlyHost. Saving/TiddlySpot/Filename: Nom du fichier enregistré Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //L'URL par défaut est `http://<nom du wiki>.tiddlyspot.com/store.cgi`. Elle peut être remplacée par une adresse serveur personnalisée, comme `http://example.com/store.php`.// Saving/TiddlySpot/Password: Mot de passe +Saving/TiddlySpot/ReadOnly: Notez que [[TiddlySpot|http://tiddlyspot.com]] n'autorise plus la création de nouveaux sites. Pour les nouveaux sites vous pouvez utiliser [[TiddlyHost|https://tiddlyhost.com]], un nouveau service d'hébergement qui remplace ~TiddlySpot. Saving/TiddlySpot/ServerURL: URL du serveur Saving/TiddlySpot/UploadDir: Dossier des dépôts Saving/TiddlySpot/UserName: Nom utilisé pour ce Wiki diff --git a/languages/fr-FR/Docs/ModuleTypes.multids b/languages/fr-FR/Docs/ModuleTypes.multids index b6eab3be2..8e3f90a25 100644 --- a/languages/fr-FR/Docs/ModuleTypes.multids +++ b/languages/fr-FR/Docs/ModuleTypes.multids @@ -23,7 +23,8 @@ tiddlerfield: Définit le comportement d'un champ de tiddler. tiddlermethod: Ajoute des méthodes au prototype `$tw.Tiddler`. upgrader: Applique une procédure de mise à jour aux tiddlers lors de l'opération de mise à jour/importation. utils: Ajoute des méthodes dans `$tw.utils`. -utils-node: Ajoute des méthodes spécifiques à Node.js dans `$tw.utils`. +utils-browser: Ajoute des méthodes spécifiques au mode browser dans `$tw.utils`. +utils-node: Ajoute des méthodes spécifiques au mode Node.js dans `$tw.utils`. widget: Les widgets encapsulent les méthodes de rendu et de rafraichissement du DOM. wikimethod: Ajoute des méthodes à `$tw.Wiki`. wikirule: Règles d'analyse pour le parseur WikiText principal. diff --git a/languages/fr-FR/EditTemplate.multids b/languages/fr-FR/EditTemplate.multids index 30def0d81..f6f5c6c8b 100644 --- a/languages/fr-FR/EditTemplate.multids +++ b/languages/fr-FR/EditTemplate.multids @@ -19,6 +19,8 @@ Shadow/Warning: Ceci est un tiddler « shadow ». Toute modification supplantera Tags/Add/Button: ajouter Tags/Add/Button/Hint: ajoute un tag Tags/Add/Placeholder: nom du tag +Tags/ClearInput/Caption: supprime l'entrée +Tags/ClearInput/Hint: Supprime le tag entré Tags/Dropdown/Caption: liste des tags Tags/Dropdown/Hint: Montre la liste des tags Title/BadCharacterWarning: Attention : il est préférable d'éviter l'usage des caractères <<bad-chars>> dans les titres des tiddlers diff --git a/languages/fr-FR/Filters.multids b/languages/fr-FR/Filters.multids index 0fc6cf3c2..e0385fb5f 100644 --- a/languages/fr-FR/Filters.multids +++ b/languages/fr-FR/Filters.multids @@ -9,7 +9,8 @@ Drafts: Les tiddlers en cours d'édition Orphans: Les tiddlers orphelins SystemTiddlers: Les tiddlers système ShadowTiddlers: Les tiddlers shadow -StoryList: Les tiddlers du déroulé, hormis $:/AdvancedSearch OverriddenShadowTiddlers: Les tiddlers shadow modifiés +SessionTiddlers: Les tiddlers modifiés depuis que le dernier chargement du wiki SystemTags: Les tags système -TypedTiddlers: Tiddlers ayant un contenu non wiki-text \ No newline at end of file +StoryList: Les tiddlers du déroulé, hormis <$text text="$:/AdvancedSearch"/> +TypedTiddlers: Tiddlers dont le contenu n'est pas en wiki-text diff --git a/languages/fr-FR/Help/listen.tid b/languages/fr-FR/Help/listen.tid index b6d812bd0..e08215194 100644 --- a/languages/fr-FR/Help/listen.tid +++ b/languages/fr-FR/Help/listen.tid @@ -22,6 +22,7 @@ Tous les paramètres sont optionnels avec des valeurs par défaut sûres, et peu * ''readers'' - liste de personnes de confiance autorisées à lire ce wiki, séparées par des virgules * ''writers'' - liste de personnes de confiance autorisées à modifier ce wiki, séparées par des virgules * ''csrf-disable'' - donner la valeur "yes" pour désactiver les vérifications CSRF (vaut "no" par défaut) +* ''sse-enabled'' - donner la valeur "yes" pour activer les événement envoyés par le serveur (valeur "no" par défaut) * ''root-tiddler'' - le tiddler à servir à la racine (par défaut "$:/core/save/all") * ''root-render-type'' - le type de contenu avec lequel le tiddler racine doit être rendu (par défaut "text/plain") * ''root-serve-type'' - le type de contenu avec lequel le tiddler racine doit être servi (par défaut "text/html") @@ -29,6 +30,7 @@ Tous les paramètres sont optionnels avec des valeurs par défaut sûres, et peu * ''tls-key'' - nom de chemin du fichier de clé TLS (relativement au dossier du wiki) * ''debug-level'' - niveau de débogage optionnel ; mettre à "debug" pour voir le détail des requêtes (par défaut à "none") * ''gzip'' - donner la valeur "yes" pour activer la compression gzip pour certaines interactions http (par défaut à "no") +* ''use-browser-cache'' - une valeur "yes" autorise le navigateur à mettre en cache les réponses pour économiser de la bande passante ("no" par défaut) Pour plus d'informations sur la manière de donner accès à votre instance de serveur à l'ensemble de votre réseau local, ainsi que sur les risques éventuels en matière de sécurité, voir le tiddler [[WebServer sur tiddlywiki.com|https://tiddlywiki.com/#WebServer]]. diff --git a/languages/fr-FR/Help/render.tid b/languages/fr-FR/Help/render.tid index 0fd55a935..79bc99740 100644 --- a/languages/fr-FR/Help/render.tid +++ b/languages/fr-FR/Help/render.tid @@ -8,17 +8,17 @@ Optionellement, on peut spécifier le titre d'un tiddler modèle (template). Dan On peut spécifier le nom et la valeur d'une variable supplémentaire. ``` ---render <filtre-sur-les-tiddlers> [<filtre-des-noms-de-fichier>] [<type-de-rendu>] [<modèle>] [<nom>] [<valeur>] +--render <filtre-sur-les-tiddlers> [<filtre-des-noms-de-fichier>] [<type-de-rendu>] [<modèle>] [ [<nom>] [<valeur>] ]* ``` * ''filtre-sur-les-tiddlers'': Un filtre qui indentifie les tiddlers dont le contenu doit être exécuté * ''filtre-des-noms-de-fichier'': filtre optionnel pour transformer les titres de tiddlers en chemin de fichiers. À défaut, le filtre utilisé est `[is[tiddler]addsuffix[.html]]`, qui utilise le titre inchangé du tiddler comme nom de fichier * ''modèle'': Modèle optionnel via lequel chaque tiddler doit être rendu * ''type-de-rendu'': Type de rendu optionnel : la valeur `text/html` (par défaut) retourne le text HTML complet et `text/plain` se contente de retourner le contenu sous forme texte (autrement dit ignore les balises HTML et autres caractères non imprimables) -* ''nom'': Nom de la variable optionnelle -* ''valeur'': Valeur de la variable optionnelle +* ''nom'': Nom des variables optionnelles +* ''valeur'': Valeur des variables optionnelles -Par défaut, le nom de fichier est résolu relativement au sous-répertoire `output` du réepertoire de l'édition. La commande `--output` peut servir à diriger les sorties vers un répertoire différent. +Par défaut, le nom de fichier est résolu relativement au sous-répertoire `output` du répertoire de l'édition. La commande `--output` peut servir à diriger les sorties vers un répertoire différent. Notes : @@ -26,6 +26,7 @@ Notes : * Les répertoires absents dans le chemin de fichier sont créés automatiquement. * Lorsqu'un tiddler contient des espaces dans le titre, prendre garde à utiliser aussi bien les guillemets nécessaires au shell et les doubles crochets droits propres à TiddlyWiki : `--render "[[Motovun Jack.jpg]]"` * Le filtre des noms de fichier est évalué après avoir initialisé l'élément d'entrée avec le titre du tiddler en cours d'exécution, permettant ainsi d'utiliser le titre comme base de calcul pour le nom de fichier. Par exemple `[encodeuricomponent[]addprefix[static/]]` applique un encodage d'URI à chaque titre, puis ajoute le préfixe `static/` +* Il est possible d'utiliser plusieurs paires ''nom''/''valeur'' pour passer plus d'une variable * La commande `--render` remplace de manière plus souple les deux commandes `--rendertiddler` et `--rendertiddlers`, qui sont du même coup obsolètes. Exemples : diff --git a/languages/fr-FR/Import.multids b/languages/fr-FR/Import.multids index d4dce1c0e..3747a4e78 100644 --- a/languages/fr-FR/Import.multids +++ b/languages/fr-FR/Import.multids @@ -1,5 +1,6 @@ title: $:/language/Import/ +Editor/Import/Heading: Images à importer et à insérer dans l'éditeur. Imported/Hint: Les tiddlers suivants ont été importés : Listing/Cancel/Caption: Annuler Listing/Hint: Les tiddlers suivants sont prêts pour l'importation : diff --git a/languages/fr-FR/Misc.multids b/languages/fr-FR/Misc.multids index ddcc5a589..ab21d9cc5 100644 --- a/languages/fr-FR/Misc.multids +++ b/languages/fr-FR/Misc.multids @@ -10,6 +10,7 @@ ConfirmCancelTiddler: Souhaitez-vous annuler les modifications apportées au tid ConfirmDeleteTiddler: Souhaitez-vous supprimer le tiddler « <$text text=<<title>>/> » ? ConfirmOverwriteTiddler: Souhaitez-vous supplanter le tiddler « <$text text=<<title>>/> » ? ConfirmEditShadowTiddler: Vous êtes sur le point d'éditer un ShadowTiddler. Toute modification supplantera la version par défaut du système, rendant les prochaines mises à jour non-triviales. Êtes-vous sûr(e) de vouloir éditer "<$text text=<<title>>/>"? +ConfirmAction: Souhaitez-vous poursuivre ? Count: total DefaultNewTiddlerTitle: Nouveau tiddler Diffs/CountMessage: <<diff-count>> différences @@ -31,6 +32,8 @@ Error/FormatFilterOperator: Erreur de filtre : Suffixe inconnu pour l'opérateur Error/LoadingPluginLibrary: Erreur lors du chargement de la bibliothèque de plugins Error/NetworkErrorAlert: `<h2>''Erreur Réseau''</h2>Il semble que la connexion au serveur soit perdue. Cela peut indiquer un problème avec votre connexion réseau. Essayez de rétablir la connectivité du réseau avant de continuer.<br><br>''Toute modification non enregistrée sera automatiquement synchronisée lorsque la connectivité sera rétablie''.` Error/PutEditConflict: Le fichier a changé sur le serveur +Error/PutForbidden: Permission refusée +Error/PutUnauthorized: Authentification nécessaire Error/RecursiveTransclusion: Erreur dans le widget //transclude// : transclusion récursive Error/RetrievingSkinny: Erreur pendant la récupération de la liste des tiddlers partiels Error/SavingToTWEdit: Erreur lors de l'enregistrement vers TWEdit @@ -39,6 +42,7 @@ Error/XMLHttpRequest: Code d'erreur XMLHttpRequest InternalJavaScriptError/Title: Erreur interne JavaScript InternalJavaScriptError/Hint: C'est assez embarrassant. Il est recommandé de rafraîchir l'affichage de votre navigateur InvalidFieldName: Caractères illicites dans le nom du champ « <$text text=<<fieldName>>/> ». Les champs ne peuvent contenir que des lettres minuscules non accentuées et les caractères souligné (`_`), tiret (`-`) et point (`.`) +LayoutSwitcher/Description: Ouvre le commutateur de mise en page LazyLoadingWarning: <p>Tentative de chargement d'un contenu externe ''<$text text={{!!_canonical_uri}}/>''</p><p>Si ce message ne disparaît pas, il est possible que vous deviez ajuster le type de contenu du tiddler en fonction du type de votre contenu externe, ou vous utilisez peut-être un navigateur qui n'accepte pas les contenus externes dans cette configuration. Voir https://tiddlywiki.com/#ExternalText</p> LoginToTiddlySpace: Identification sur TiddlySpace Manager/Controls/FilterByTag/None: (aucun) @@ -62,6 +66,8 @@ MissingTiddler/Hint: Le tiddler « <$text text=<<currentTiddler>>/> » est manqu No: Non OfficialPluginLibrary: Bibliothèque officielle des plugins ~TiddlyWiki OfficialPluginLibrary/Hint: La bibliothèque officielle des plugins ~TiddlyWiki sur tiddlywiki.com. Plugins, thèmes et packs pour les différentes langues sont maintenus par l'équipe responsable du noyau. +PageTemplate/Description: la mise en page par défaut de ~TiddlyWiki +PageTemplate/Name: ~PageTemplate par défaut PluginReloadWarning: Merci d'enregistrer {{$:/core/ui/Buttons/save-wiki}} et de recharger {{$:/core/ui/Buttons/refresh}} pour que les changements apportés aux plugins ~JavaScript prennent effet RecentChanges/DateFormat: DD MMM YYYY Shortcuts/Input/AdvancedSearch/Hint: Ouvre le panneau Recherche Avancée depuis le champ de recherche de la barre latérale @@ -73,6 +79,10 @@ Shortcuts/Input/Tab-Left/Hint: Sélectionne l'onglet précédent Shortcuts/Input/Tab-Right/Hint: Sélectionne l'onglet suivant Shortcuts/Input/Up/Hint: Sélectionne l'élément précédent Shortcuts/SidebarLayout/Hint: Change la mise en forme de la barre latérale +Switcher/Subtitle/theme: Change de Thème +Switcher/Subtitle/layout: Change de Mise en page +Switcher/Subtitle/language: Change de Langue +Switcher/Subtitle/palette: Change de Palette SystemTiddler/Tooltip: Ceci est un tiddler système SystemTiddlers/Include/Prompt: Inclure les tiddlers système TagManager/Colour/Heading: Couleur diff --git a/languages/fr-FR/TiddlerInfo.multids b/languages/fr-FR/TiddlerInfo.multids index 6576139c7..9f6f844f7 100644 --- a/languages/fr-FR/TiddlerInfo.multids +++ b/languages/fr-FR/TiddlerInfo.multids @@ -14,8 +14,8 @@ List/Caption: Liste List/Empty: Ce tiddler ne contient pas de champ //list// Listed/Caption: Listé Listed/Empty: Ce tiddler ne figure dans le champ //list// d'aucun autre tiddler -References/Caption: Références -References/Empty: Aucun tiddler ne comporte de lien vers celui-ci +References/Caption: Pointeurs +References/Empty: Aucun tiddler ne pointe vers celui-ci Tagging/Caption: Étiquetage Tagging/Empty: Le titre de ce tiddler ne sert de tag à aucun tiddler Tools/Caption: Outils From 8fbf52e419e71d726ea32b6c44e3ccfc4245d825 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Sun, 23 May 2021 11:19:46 +0100 Subject: [PATCH 1341/2376] Don't issue plugin reload warning for plugin-type: import Fixes #5719 --- core/modules/wiki.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 6aa6c7ced..0fcb9b7b0 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -1509,6 +1509,13 @@ exports.invokeUpgraders = function(titles,tiddlers) { // Determine whether a plugin by title is dynamically loadable exports.doesPluginRequireReload = function(title) { + var tiddler = this.getTiddler(title); + if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"]) { + if(tiddler.fields["plugin-type"] === "import") { + // The import plugin never requires reloading + return false; + } + } return this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title)); }; From 61714cbda34151f0b7e1e8ad690778770044f52f Mon Sep 17 00:00:00 2001 From: Cameron Fischer <fischer.cameron@gmail.com> Date: Sun, 23 May 2021 12:39:06 -0400 Subject: [PATCH 1342/2376] Fixed super minor issue with import pragma (#5521) --- core/modules/parsers/wikiparser/rules/import.js | 2 +- editions/test/tiddlers/tests/test-widget.js | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/modules/parsers/wikiparser/rules/import.js b/core/modules/parsers/wikiparser/rules/import.js index bce5e1ef3..9556c7af5 100644 --- a/core/modules/parsers/wikiparser/rules/import.js +++ b/core/modules/parsers/wikiparser/rules/import.js @@ -36,7 +36,7 @@ exports.parse = function() { // Move past the pragma invocation this.parser.pos = this.matchRegExp.lastIndex; // Parse the filter terminated by a line break - var reMatch = /(.*)(\r?\n)|$/mg; + var reMatch = /(.*)(?:$|\r?\n)/mg; reMatch.lastIndex = this.parser.pos; var match = reMatch.exec(this.parser.source); this.parser.pos = reMatch.lastIndex; diff --git a/editions/test/tiddlers/tests/test-widget.js b/editions/test/tiddlers/tests/test-widget.js index bd766fe7e..459ec33fe 100755 --- a/editions/test/tiddlers/tests/test-widget.js +++ b/editions/test/tiddlers/tests/test-widget.js @@ -702,6 +702,19 @@ describe("Widget module", function() { expect(wrapper.innerHTML).toBe("<p>Don't forget me.</p>"); }); + /** Special case. \import should parse correctly, even if it's + * the only line in the tiddler. Technically doesn't cause a + * visual difference, but may affect plugins if it doesn't. + */ + it("should work when import pragma is standalone", function() { + var wiki = new $tw.Wiki(); + var text = "\\import [prefix[XXX]]"; + var parseTreeNode = parseText(text,wiki); + // Test the resulting parse tree node, since there is no + // rendering which may expose a problem. + expect(parseTreeNode.children[0].attributes.filter.value).toBe('[prefix[XXX]]'); + }); + /** This test reproduces issue #4504. * * The importvariable widget was creating redundant copies into From 2ab0474e14834e8309fca628c34aac4efa663e64 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Sun, 23 May 2021 18:50:27 +0200 Subject: [PATCH 1343/2376] Fix configuration list of HTML5 block elements (#5469) --- core/modules/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/config.js b/core/modules/config.js index 25c27c7ca..77e74edf8 100644 --- a/core/modules/config.js +++ b/core/modules/config.js @@ -34,7 +34,7 @@ exports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl: exports.htmlVoidElements = "area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr".split(","); -exports.htmlBlockElements = "address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video".split(","); +exports.htmlBlockElements = "address,article,aside,audio,blockquote,canvas,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,nav,ol,p,pre,section,summary,table,tfoot,ul,video".split(","); exports.htmlUnsafeElements = "script".split(","); From dcba17fc5f114d4ef120e552b9e8f592d8e37d67 Mon Sep 17 00:00:00 2001 From: Mohammad Rahmani <830394+kookma@users.noreply.github.com> Date: Sun, 23 May 2021 21:43:04 +0430 Subject: [PATCH 1344/2376] Correct pointer shape and color for disabled button (#5692) * Update base.tid this PR addresses the #5625 * Update base.tid The extra space has been removed! --- themes/tiddlywiki/vanilla/base.tid | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index e11cfbd23..d5454a32d 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -505,6 +505,11 @@ button svg, button img, label svg, label img { fill: <<colour foreground>>; } +button:disabled.tc-btn-invisible { + cursor: default; + color: <<colour muted-foreground>>; +} + .tc-btn-boxed { font-size: 0.6em; padding: 0.2em; From c30ce544d194aea0e7f3fce0644c764b619a1067 Mon Sep 17 00:00:00 2001 From: BlueGreenMagick <bluegreenmagick@gmail.com> Date: Tue, 25 May 2021 03:24:37 +0900 Subject: [PATCH 1345/2376] Fix ViewToolbar items inconsistent spacing (#5473) --- core/ui/PageControls/advanced-search.tid | 1 + core/ui/PageControls/closeall.tid | 5 ++++- core/ui/PageControls/controlpanel.tid | 1 + core/ui/PageControls/encryption.tid | 8 ++++++-- core/ui/PageControls/fold-all.tid | 5 ++++- core/ui/PageControls/full-screen.tid | 5 ++++- core/ui/PageControls/home.tid | 5 ++++- core/ui/PageControls/import.tid | 5 ++++- core/ui/PageControls/language.tid | 1 - core/ui/PageControls/manager.tid | 5 ++++- core/ui/PageControls/more-page-actions.tid | 5 ++++- core/ui/PageControls/new-image.tid | 4 +++- core/ui/PageControls/new-journal.tid | 5 ++++- core/ui/PageControls/newtiddler.tid | 4 +++- core/ui/PageControls/palette.tid | 1 - core/ui/PageControls/print.tid | 5 ++++- core/ui/PageControls/refresh.tid | 5 ++++- core/ui/PageControls/savewiki.tid | 5 ++++- core/ui/PageControls/storyview.tid | 1 - core/ui/PageControls/tag-button.tid | 5 ++++- core/ui/PageControls/theme.tid | 1 - core/ui/PageControls/timestamp.tid | 8 ++++++-- core/ui/PageControls/unfold-all.tid | 5 ++++- core/ui/ViewToolbar/clone.tid | 1 - core/ui/ViewToolbar/close-others.tid | 1 - core/ui/ViewToolbar/edit.tid | 1 - core/ui/ViewToolbar/fold-others.tid | 1 - core/ui/ViewToolbar/fold.tid | 2 -- core/ui/ViewToolbar/info.tid | 1 + core/ui/ViewToolbar/more-tiddler-actions.tid | 1 - core/ui/ViewToolbar/new-here.tid | 1 + core/ui/ViewToolbar/new-journal-here.tid | 1 + core/ui/ViewToolbar/open-window.tid | 1 - core/ui/ViewToolbar/permalink.tid | 1 - core/ui/ViewToolbar/permaview.tid | 1 - core/wiki/macros/export.tid | 1 + plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid | 1 - .../tiddlywiki/text-slicer/ui/slice-toolbar-button.tid | 2 +- plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid | 2 +- themes/tiddlywiki/vanilla/base.tid | 4 ++-- 40 files changed, 80 insertions(+), 38 deletions(-) diff --git a/core/ui/PageControls/advanced-search.tid b/core/ui/PageControls/advanced-search.tid index 597395b5b..1549b07f4 100644 --- a/core/ui/PageControls/advanced-search.tid +++ b/core/ui/PageControls/advanced-search.tid @@ -5,6 +5,7 @@ description: {{$:/language/Buttons/AdvancedSearch/Hint}} \whitespace trim \define advanced-search-button(class) +\whitespace trim <$button to="$:/AdvancedSearch" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/advanced-search-button}} diff --git a/core/ui/PageControls/closeall.tid b/core/ui/PageControls/closeall.tid index 213c868df..2665fff0d 100644 --- a/core/ui/PageControls/closeall.tid +++ b/core/ui/PageControls/closeall.tid @@ -3,11 +3,14 @@ tags: $:/tags/PageControls caption: {{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}} description: {{$:/language/Buttons/CloseAll/Hint}} +\whitespace trim <$button message="tm-close-all-tiddlers" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/close-all-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/CloseAll/Caption}}/> +</span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/controlpanel.tid b/core/ui/PageControls/controlpanel.tid index 82fac7398..1f57b35bf 100644 --- a/core/ui/PageControls/controlpanel.tid +++ b/core/ui/PageControls/controlpanel.tid @@ -5,6 +5,7 @@ description: {{$:/language/Buttons/ControlPanel/Hint}} \whitespace trim \define control-panel-button(class) +\whitespace trim <$button to="$:/ControlPanel" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/options-button}} diff --git a/core/ui/PageControls/encryption.tid b/core/ui/PageControls/encryption.tid index b4b5e553f..9f8ae0bd6 100644 --- a/core/ui/PageControls/encryption.tid +++ b/core/ui/PageControls/encryption.tid @@ -10,7 +10,9 @@ description: {{$:/language/Buttons/Encryption/Hint}} {{$:/core/images/locked-padlock}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/> +</span> </$list> </$button> </$reveal> @@ -20,7 +22,9 @@ description: {{$:/language/Buttons/Encryption/Hint}} {{$:/core/images/unlocked-padlock}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/> +</span> </$list> </$button> </$reveal> diff --git a/core/ui/PageControls/fold-all.tid b/core/ui/PageControls/fold-all.tid index 15dcca2df..46c3165b8 100644 --- a/core/ui/PageControls/fold-all.tid +++ b/core/ui/PageControls/fold-all.tid @@ -3,12 +3,15 @@ tags: $:/tags/PageControls caption: {{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}} description: {{$:/language/Buttons/FoldAll/Hint}} +\whitespace trim <$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-fold-all-tiddlers" $param=<<currentTiddler>> foldedStatePrefix="$:/state/folded/"/> <$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem"> {{$:/core/images/fold-all-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/FoldAll/Caption}}/> +</span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/full-screen.tid b/core/ui/PageControls/full-screen.tid index efaeadb2e..ada7d5a65 100644 --- a/core/ui/PageControls/full-screen.tid +++ b/core/ui/PageControls/full-screen.tid @@ -3,11 +3,14 @@ tags: $:/tags/PageControls caption: {{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}} description: {{$:/language/Buttons/FullScreen/Hint}} +\whitespace trim <$button message="tm-full-screen" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/full-screen-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/FullScreen/Caption}}/> +</span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/home.tid b/core/ui/PageControls/home.tid index 946ac2361..f3a0b1787 100644 --- a/core/ui/PageControls/home.tid +++ b/core/ui/PageControls/home.tid @@ -3,11 +3,14 @@ tags: $:/tags/PageControls caption: {{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}} description: {{$:/language/Buttons/Home/Hint}} +\whitespace trim <$button message="tm-home" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/home-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Home/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Home/Caption}}/> +</span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/import.tid b/core/ui/PageControls/import.tid index dbf3121b7..39ca51eb6 100644 --- a/core/ui/PageControls/import.tid +++ b/core/ui/PageControls/import.tid @@ -3,13 +3,16 @@ tags: $:/tags/PageControls caption: {{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}} description: {{$:/language/Buttons/Import/Hint}} +\whitespace trim <div class="tc-file-input-wrapper"> <$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/import-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Import/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Import/Caption}}/> +</span> </$list> </$button> <$browse tooltip={{$:/language/Buttons/Import/Hint}}/> diff --git a/core/ui/PageControls/language.tid b/core/ui/PageControls/language.tid index ffae7449a..623c71004 100644 --- a/core/ui/PageControls/language.tid +++ b/core/ui/PageControls/language.tid @@ -16,7 +16,6 @@ $(languagePluginTitle)$/icon </$set> </span> </$list> -<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Language/Caption}}/></span> </$list> diff --git a/core/ui/PageControls/manager.tid b/core/ui/PageControls/manager.tid index 7255747f4..d2144c574 100644 --- a/core/ui/PageControls/manager.tid +++ b/core/ui/PageControls/manager.tid @@ -5,12 +5,15 @@ description: {{$:/language/Buttons/Manager/Hint}} \whitespace trim \define manager-button(class) +\whitespace trim <$button to="$:/Manager" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/list}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Manager/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Manager/Caption}}/> +</span> </$list> </$button> \end diff --git a/core/ui/PageControls/more-page-actions.tid b/core/ui/PageControls/more-page-actions.tid index e74185824..b52f99ec9 100644 --- a/core/ui/PageControls/more-page-actions.tid +++ b/core/ui/PageControls/more-page-actions.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}} description: {{$:/language/Buttons/More/Hint}} +\whitespace trim \define config-title() $:/config/PageControlButtons/Visibility/$(listItem)$ \end @@ -11,7 +12,9 @@ $:/config/PageControlButtons/Visibility/$(listItem)$ {{$:/core/images/down-arrow}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/More/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/More/Caption}}/> +</span> </$list> </$button><$reveal state=<<qualify "$:/state/popup/more">> type="popup" position="below" animate="yes"> diff --git a/core/ui/PageControls/new-image.tid b/core/ui/PageControls/new-image.tid index fab7df573..b37fba7c5 100644 --- a/core/ui/PageControls/new-image.tid +++ b/core/ui/PageControls/new-image.tid @@ -9,6 +9,8 @@ description: {{$:/language/Buttons/NewImage/Hint}} {{$:/core/images/new-image-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/NewImage/Caption}}/> +</span> </$list> </$button> diff --git a/core/ui/PageControls/new-journal.tid b/core/ui/PageControls/new-journal.tid index 914352e1b..8ae8ee78a 100644 --- a/core/ui/PageControls/new-journal.tid +++ b/core/ui/PageControls/new-journal.tid @@ -5,12 +5,15 @@ description: {{$:/language/Buttons/NewJournal/Hint}} \whitespace trim \define journalButton() +\whitespace trim <$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-journal-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/NewJournal/Caption}}/> +</span> </$list> </$button> \end diff --git a/core/ui/PageControls/newtiddler.tid b/core/ui/PageControls/newtiddler.tid index 7ea1994ff..cd2f56913 100644 --- a/core/ui/PageControls/newtiddler.tid +++ b/core/ui/PageControls/newtiddler.tid @@ -9,6 +9,8 @@ description: {{$:/language/Buttons/NewTiddler/Hint}} {{$:/core/images/new-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/NewTiddler/Caption}}/> +</span> </$list> </$button> diff --git a/core/ui/PageControls/palette.tid b/core/ui/PageControls/palette.tid index 569b7e8ca..6fdbdb439 100644 --- a/core/ui/PageControls/palette.tid +++ b/core/ui/PageControls/palette.tid @@ -9,7 +9,6 @@ description: {{$:/language/Buttons/Palette/Hint}} <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/palette}} </$list> -<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Palette/Caption}}/></span> </$list> diff --git a/core/ui/PageControls/print.tid b/core/ui/PageControls/print.tid index c0782ff33..ef664b6e3 100644 --- a/core/ui/PageControls/print.tid +++ b/core/ui/PageControls/print.tid @@ -3,11 +3,14 @@ tags: $:/tags/PageControls caption: {{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}} description: {{$:/language/Buttons/Print/Hint}} +\whitespace trim <$button message="tm-print" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/print-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Print/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Print/Caption}}/> +</span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/refresh.tid b/core/ui/PageControls/refresh.tid index b8bc437f8..38692f817 100644 --- a/core/ui/PageControls/refresh.tid +++ b/core/ui/PageControls/refresh.tid @@ -3,11 +3,14 @@ tags: $:/tags/PageControls caption: {{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}} description: {{$:/language/Buttons/Refresh/Hint}} +\whitespace trim <$button message="tm-browser-refresh" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/refresh-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Refresh/Caption}}/> +</span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/savewiki.tid b/core/ui/PageControls/savewiki.tid index e44c99276..9e4a345ac 100644 --- a/core/ui/PageControls/savewiki.tid +++ b/core/ui/PageControls/savewiki.tid @@ -3,6 +3,7 @@ tags: $:/tags/PageControls caption: {{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}} description: {{$:/language/Buttons/SaveWiki/Hint}} +\whitespace trim <$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>> <$wikify name="site-title" text={{$:/config/SaveWikiButton/Filename}}> <$action-sendmessage $message="tm-save-wiki" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/> @@ -12,7 +13,9 @@ description: {{$:/language/Buttons/SaveWiki/Hint}} {{$:/core/images/save-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/SaveWiki/Caption}}/> +</span> </$list> </span> </$button> \ No newline at end of file diff --git a/core/ui/PageControls/storyview.tid b/core/ui/PageControls/storyview.tid index a426b91aa..c4d0b7365 100644 --- a/core/ui/PageControls/storyview.tid +++ b/core/ui/PageControls/storyview.tid @@ -14,7 +14,6 @@ $:/core/images/storyview-$(storyview)$ <$transclude tiddler=<<icon>>/> </$set> </$list> -<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span> </$list> diff --git a/core/ui/PageControls/tag-button.tid b/core/ui/PageControls/tag-button.tid index e7e6bdc89..e2b5c9277 100644 --- a/core/ui/PageControls/tag-button.tid +++ b/core/ui/PageControls/tag-button.tid @@ -5,12 +5,15 @@ description: {{$:/language/Buttons/TagManager/Hint}} \whitespace trim \define control-panel-button(class) +\whitespace trim <$button to="$:/TagManager" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class="""$(tv-config-toolbar-class)$ $class$"""> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/tag-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/TagManager/Caption}}/> +</span> </$list> </$button> \end diff --git a/core/ui/PageControls/theme.tid b/core/ui/PageControls/theme.tid index be3dbb0f9..2d8eadc7b 100644 --- a/core/ui/PageControls/theme.tid +++ b/core/ui/PageControls/theme.tid @@ -9,7 +9,6 @@ description: {{$:/language/Buttons/Theme/Hint}} <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/theme-button}} </$list> -<$text text=" "/> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"><$text text={{$:/language/Buttons/Theme/Caption}}/></span> </$list> diff --git a/core/ui/PageControls/timestamp.tid b/core/ui/PageControls/timestamp.tid index abf89b70c..a54b3f2ca 100644 --- a/core/ui/PageControls/timestamp.tid +++ b/core/ui/PageControls/timestamp.tid @@ -11,7 +11,9 @@ description: {{$:/language/Buttons/Timestamp/Hint}} {{$:/core/images/timestamp-on}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Timestamp/On/Caption}}/> +</span> </$list> </$button> </$reveal> @@ -22,7 +24,9 @@ description: {{$:/language/Buttons/Timestamp/Hint}} {{$:/core/images/timestamp-off}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/> +</span> </$list> </$button> </$reveal> diff --git a/core/ui/PageControls/unfold-all.tid b/core/ui/PageControls/unfold-all.tid index 9f91bc288..6e8357a3b 100644 --- a/core/ui/PageControls/unfold-all.tid +++ b/core/ui/PageControls/unfold-all.tid @@ -3,12 +3,15 @@ tags: $:/tags/PageControls caption: {{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}} description: {{$:/language/Buttons/UnfoldAll/Hint}} +\whitespace trim <$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>> <$action-sendmessage $message="tm-unfold-all-tiddlers" $param=<<currentTiddler>> foldedStatePrefix="$:/state/folded/"/> <$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem"> {{$:/core/images/unfold-all-button}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span> +<span class="tc-btn-text"> +<$text text={{$:/language/Buttons/UnfoldAll/Caption}}/> +</span> </$list> </$button> \ No newline at end of file diff --git a/core/ui/ViewToolbar/clone.tid b/core/ui/ViewToolbar/clone.tid index dcba64486..434418106 100644 --- a/core/ui/ViewToolbar/clone.tid +++ b/core/ui/ViewToolbar/clone.tid @@ -10,7 +10,6 @@ description: {{$:/language/Buttons/Clone/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/Clone/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/close-others.tid b/core/ui/ViewToolbar/close-others.tid index 47bde5fdc..57fbf222c 100644 --- a/core/ui/ViewToolbar/close-others.tid +++ b/core/ui/ViewToolbar/close-others.tid @@ -10,7 +10,6 @@ description: {{$:/language/Buttons/CloseOthers/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/CloseOthers/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/edit.tid b/core/ui/ViewToolbar/edit.tid index 9d12243b2..f0ab31e4e 100644 --- a/core/ui/ViewToolbar/edit.tid +++ b/core/ui/ViewToolbar/edit.tid @@ -10,7 +10,6 @@ description: {{$:/language/Buttons/Edit/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/Edit/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/fold-others.tid b/core/ui/ViewToolbar/fold-others.tid index 290a03ac3..244977509 100644 --- a/core/ui/ViewToolbar/fold-others.tid +++ b/core/ui/ViewToolbar/fold-others.tid @@ -11,7 +11,6 @@ description: {{$:/language/Buttons/FoldOthers/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/FoldOthers/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/fold.tid b/core/ui/ViewToolbar/fold.tid index a392b4a77..fd3363688 100644 --- a/core/ui/ViewToolbar/fold.tid +++ b/core/ui/ViewToolbar/fold.tid @@ -12,7 +12,6 @@ description: {{$:/language/Buttons/Fold/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/Fold/Caption}}/> </span> </$list> @@ -26,7 +25,6 @@ description: {{$:/language/Buttons/Fold/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/Unfold/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/info.tid b/core/ui/ViewToolbar/info.tid index 3639aac09..02fd9abd7 100644 --- a/core/ui/ViewToolbar/info.tid +++ b/core/ui/ViewToolbar/info.tid @@ -5,6 +5,7 @@ description: {{$:/language/Buttons/Info/Hint}} \whitespace trim \define button-content() +\whitespace trim <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/info-button}} </$list> diff --git a/core/ui/ViewToolbar/more-tiddler-actions.tid b/core/ui/ViewToolbar/more-tiddler-actions.tid index 9e9bd4528..6b24db362 100644 --- a/core/ui/ViewToolbar/more-tiddler-actions.tid +++ b/core/ui/ViewToolbar/more-tiddler-actions.tid @@ -13,7 +13,6 @@ $:/config/ViewToolbarButtons/Visibility/$(listItem)$ </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/More/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/new-here.tid b/core/ui/ViewToolbar/new-here.tid index 72bd7c3e3..dd4a969e1 100644 --- a/core/ui/ViewToolbar/new-here.tid +++ b/core/ui/ViewToolbar/new-here.tid @@ -10,6 +10,7 @@ description: {{$:/language/Buttons/NewHere/Hint}} </$set> \end \define newHereButton() +\whitespace trim <$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> {{$:/core/images/new-here-button}} diff --git a/core/ui/ViewToolbar/new-journal-here.tid b/core/ui/ViewToolbar/new-journal-here.tid index 0fc55b19f..b64ba7ed7 100644 --- a/core/ui/ViewToolbar/new-journal-here.tid +++ b/core/ui/ViewToolbar/new-journal-here.tid @@ -8,6 +8,7 @@ description: {{$:/language/Buttons/NewJournalHere/Hint}} [[$(currentTiddlerTag)$]] $(journalTags)$ \end \define journalButton() +\whitespace trim <$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>> <$wikify name="journalTitle" text="""<$macrocall $name="now" format=<<journalTitleTemplate>>/>"""> <$action-sendmessage $message="tm-new-tiddler" title=<<journalTitle>> tags=<<journalButtonTags>>/> diff --git a/core/ui/ViewToolbar/open-window.tid b/core/ui/ViewToolbar/open-window.tid index b1eb46f9b..d8ef85c83 100644 --- a/core/ui/ViewToolbar/open-window.tid +++ b/core/ui/ViewToolbar/open-window.tid @@ -10,7 +10,6 @@ description: {{$:/language/Buttons/OpenWindow/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/OpenWindow/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/permalink.tid b/core/ui/ViewToolbar/permalink.tid index 8a53ce11f..5d0677eed 100644 --- a/core/ui/ViewToolbar/permalink.tid +++ b/core/ui/ViewToolbar/permalink.tid @@ -10,7 +10,6 @@ description: {{$:/language/Buttons/Permalink/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/Permalink/Caption}}/> </span> </$list> diff --git a/core/ui/ViewToolbar/permaview.tid b/core/ui/ViewToolbar/permaview.tid index ee95963b1..4a655b970 100644 --- a/core/ui/ViewToolbar/permaview.tid +++ b/core/ui/ViewToolbar/permaview.tid @@ -10,7 +10,6 @@ description: {{$:/language/Buttons/Permaview/Hint}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/language/Buttons/Permaview/Caption}}/> </span> </$list> diff --git a/core/wiki/macros/export.tid b/core/wiki/macros/export.tid index c3256c431..3d0d14760 100644 --- a/core/wiki/macros/export.tid +++ b/core/wiki/macros/export.tid @@ -6,6 +6,7 @@ $baseFilename$$(extension)$ \end \define exportButton(exportFilter:"[!is[system]sort[title]]",lingoBase,baseFilename:"tiddlers") +\whitespace trim <$vars hint={{{ [<__lingoBase__>addsuffix[Hint]get[text]] }}} caption={{{ [<__lingoBase__>addsuffix[Caption]get[text]] }}}> <span class="tc-popup-keep"><$button popup=<<qualify "$:/state/popup/export">> tooltip=<<hint>> aria-label=<<caption>> class=<<tv-config-toolbar-class>> selectedClass="tc-selected"> <$list filter="[<tv-config-toolbar-icons>match[yes]]"> diff --git a/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid b/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid index 20339b22e..e066b51f6 100644 --- a/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid +++ b/plugins/tiddlywiki/qrcode/ViewToolbarButton/Button.tid @@ -13,7 +13,6 @@ description: Generate QR code for this tiddler </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> <span class="tc-btn-text"> -<$text text=" "/> <$text text={{$:/plugins/tiddlywiki/qrcode/ViewToolbarButton!!short-caption}}/> </span> </$list> diff --git a/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid b/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid index 42ef547b1..ef53223d2 100644 --- a/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid +++ b/plugins/tiddlywiki/text-slicer/ui/slice-toolbar-button.tid @@ -17,7 +17,7 @@ Slice this text tiddler into chunks {{$:/plugins/tiddlywiki/text-slicer/images/text-slicer-icon}} </$list> <$list filter="[<tv-config-toolbar-text>match[yes]]"> -<span class="tc-btn-text"> Slice tiddler</span> +<span class="tc-btn-text">Slice tiddler</span> </$list> </$button> </$list> diff --git a/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid b/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid index 46f8a95db..c397badc5 100644 --- a/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid +++ b/plugins/tiddlywiki/tiddlyweb/syncer-actions-refresh.tid @@ -4,6 +4,6 @@ tags: $:/tags/SyncerDropdown <$reveal state="$:/status/IsLoggedIn" type="match" text="yes"> <$button tooltip="Get latest changes from the server" aria-label="Refresh from server" class="tc-btn-invisible"> <$action-sendmessage $message="tm-server-refresh"/> -{{$:/core/images/refresh-button}} <span class="tc-btn-text"><$text text="Get latest changes from the server"/></span> +{{$:/core/images/refresh-button}}<span class="tc-btn-text"><$text text="Get latest changes from the server"/></span> </$button> </$reveal> diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index d5454a32d..7ed449afb 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -564,9 +564,9 @@ html body.tc-body .tc-btn-rounded:hover svg { fill: <<colour muted-foreground>>; } + .tc-btn-text { - padding: 0; - margin: 0; + margin-left: 7px; } /* used for documentation "fake" buttons */ From 7a41283c6bfdfddd24122be5bb8897889ff67415 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Mon, 24 May 2021 20:28:43 +0200 Subject: [PATCH 1346/2376] Format:titlelist operator (#5665) --- core/modules/filters/format/titlelist.js | 25 +++++++++++++++++++ editions/test/tiddlers/tests/test-filters.js | 6 +++++ .../examples/format Operator (Examples).tid | 17 ++++++++++++- editions/tw5.com/tiddlers/filters/format.tid | 3 ++- 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 core/modules/filters/format/titlelist.js diff --git a/core/modules/filters/format/titlelist.js b/core/modules/filters/format/titlelist.js new file mode 100644 index 000000000..47608323d --- /dev/null +++ b/core/modules/filters/format/titlelist.js @@ -0,0 +1,25 @@ +/*\ +title: $:/core/modules/filters/format/titlelist.js +type: application/javascript +module-type: formatfilteroperator +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +/* +Export our filter function +*/ +exports.titlelist = function(source,operand,options) { + var results = []; + source(function(tiddler,title) { + if(title && title.length) { + results.push($tw.utils.stringifyList([title])); + } + }); + return results; +}; + +})(); diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index a02114f2b..ee428b1a0 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -808,6 +808,12 @@ function runTests(wiki) { expect(wiki.filterTiddlers("'-25' +[escapecss[]]").join(",")).toBe("-\\32 5"); expect(wiki.filterTiddlers("'-' +[escapecss[]]").join(",")).toBe("\\-"); }); + + it("should handle the format operator", function() { + expect(wiki.filterTiddlers("[[Hello There]] [[GettingStarted]] +[format:titlelist[]]").join(" ")).toBe("[[Hello There]] GettingStarted"); + expect(wiki.filterTiddlers("[title[Hello There]] +[format:titlelist[]]").join(" ")).toBe("[[Hello There]]"); + expect(wiki.filterTiddlers("[title[HelloThere]] +[format:titlelist[]]").join(" ")).toBe("HelloThere"); + }); it("should handle the deserializers operator", function() { expect(wiki.filterTiddlers("[deserializers[]]").join(",")).toBe("application/javascript,application/json,application/x-tiddler,application/x-tiddler-html-div,application/x-tiddlers,text/css,text/html,text/plain"); diff --git a/editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid index 071d4506d..d7bbc1271 100644 --- a/editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/format Operator (Examples).tid @@ -1,5 +1,5 @@ created: 20201020102735123 -modified: 20201020104004306 +modified: 20210524044020645 tags: [[Operator Examples]] [[format Operator]] title: format Operator (Examples) type: text/vnd.tiddlywiki @@ -14,3 +14,18 @@ Created date with a format string supplied as operator parameter: Modified date shown as a relative date: <<.operator-example 3 "[[HelloThere]get[modified]format:relativedate[]]">> + +A tiddler title with spaces formatted as a title list: +<<.operator-example 4 """[[Hello There]format:titlelist[]]""">> + +All tiddler titles tagged with <<tag TableOfContents>> formatted as a title list : +<<.operator-example 5 """[tag[TableOfContents]format:titlelist[]]""">> + +<<.tip "To create a string to save a [[title list|Title List]] into a list field, use `format:titlelist[]` with the [[join operator|join Operator]]">> +<<.operator-example 6 """[tag[TableOfContents]format:titlelist[]join[ ]]""">> +For example, to save titles tagged `TableOfContents` to the titles field of the tiddler [[format titlelist test]]: + +<$macrocall $name='wikitext-example-without-html' +src='<$button> test +<$action-setfield $tiddler="format titlelist test" titles={{{ [tag[TableOfContents]format:titlelist[]join[ ]] }}}/> +</$button>'/> diff --git a/editions/tw5.com/tiddlers/filters/format.tid b/editions/tw5.com/tiddlers/filters/format.tid index 8cf6f9826..138eb018f 100644 --- a/editions/tw5.com/tiddlers/filters/format.tid +++ b/editions/tw5.com/tiddlers/filters/format.tid @@ -1,6 +1,6 @@ caption: format created: 20201020100834443 -modified: 20201020104004271 +modified: 20210524090002126 op-input: a [[selection of titles|Title Selection]] op-output: input strings formatted according to the specified suffix <<.place B>> op-parameter: optional format string for the formats @@ -19,5 +19,6 @@ The suffix <<.place B>> is one of the following supported string formats: |!Format |!Description | |^`date` |The input string is interpreted as a UTC date and displayed according to the DateFormat specified in the optional operator parameter. (Defaults to "YYYY MM DD 0hh:0mm") | |^`relativedate` |The input string is interpreted as a UTC date and displayed as the interval from the present instant. Any operator parameters are ignored. | +|^`titlelist` |<<.from-version "5.2.0">>The input string wrapped in double square brackets if it contains a space. Appropriate for use in a [[title list|Title List]]. | <<.operator-examples "format">> From 8d7930f66005fae0914d248166ef15a020443143 Mon Sep 17 00:00:00 2001 From: Joshua Fontany <joshua.fontany@gmail.com> Date: Mon, 24 May 2021 13:16:23 -0700 Subject: [PATCH 1347/2376] Update sync methods (#5467) --- core/modules/syncer.js | 13 ++++----- .../moduletypes/SyncAdaptorModules.tid | 19 ++++++++----- .../filesystem/filesystemadaptor.js | 27 ++++++++++++++++--- plugins/tiddlywiki/savetrail/savetrail.js | 27 ++++++++++++++++--- .../tiddlywiki/tiddlyweb/tiddlywebadaptor.js | 27 ++++++++++++++++--- 5 files changed, 92 insertions(+), 21 deletions(-) diff --git a/core/modules/syncer.js b/core/modules/syncer.js index 23d21097f..cbde6a228 100644 --- a/core/modules/syncer.js +++ b/core/modules/syncer.js @@ -601,7 +601,10 @@ SaveTiddlerTask.prototype.run = function(callback) { tiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title); this.syncer.logger.log("Dispatching 'save' task:",this.title); if(tiddler) { - this.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) { + this.syncer.syncadaptor.saveTiddler(tiddler,{ + changeCount: changeCount, + tiddlerInfo: self.syncer.tiddlerInfo[self.title] + },function(err,adaptorInfo,revision) { // If there's an error, exit without changing any internal state if(err) { return callback(err); @@ -615,8 +618,6 @@ SaveTiddlerTask.prototype.run = function(callback) { }; // Invoke the callback callback(null); - },{ - tiddlerInfo: self.syncer.tiddlerInfo[self.title] }); } else { this.syncer.logger.log(" Not Dispatching 'save' task:",this.title,"tiddler does not exist"); @@ -633,7 +634,9 @@ function DeleteTiddlerTask(syncer,title) { DeleteTiddlerTask.prototype.run = function(callback) { var self = this; this.syncer.logger.log("Dispatching 'delete' task:",this.title); - this.syncer.syncadaptor.deleteTiddler(this.title,function(err) { + this.syncer.syncadaptor.deleteTiddler(this.title,{ + tiddlerInfo: self.syncer.tiddlerInfo[this.title] + },function(err,adaptorInfo) { // If there's an error, exit without changing any internal state if(err) { return callback(err); @@ -642,8 +645,6 @@ DeleteTiddlerTask.prototype.run = function(callback) { delete self.syncer.tiddlerInfo[self.title]; // Invoke the callback callback(null); - },{ - tiddlerInfo: self.syncer.tiddlerInfo[this.title] }); }; diff --git a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid index a39c0f8da..910a34e6d 100644 --- a/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid +++ b/editions/dev/tiddlers/from tw5.com/moduletypes/SyncAdaptorModules.tid @@ -69,7 +69,7 @@ Returns a revision ID. Retrieves status information from the server. This method is optional. |!Parameter |!Description | -|callback |Callback function invoked with parameters `err,isLoggedIn,username,isReadOnly` | +|callback |Callback function invoked with parameters `err,isLoggedIn,username,isReadOnly,isAnonymous,isPollingDisabled` | !! `login(username,password,callback)` @@ -128,33 +128,40 @@ The syncer will use the `getUpdatedTiddlers()` method in preference to the `getS |!Parameter |!Description | |callback |Callback function invoked with parameter `err,tiddlers`, where `tiddlers` is an array of tiddler field objects | -!! `saveTiddler(tiddler,callback)` +!! `saveTiddler(tiddler,options,callback)` Saves a tiddler to the server. |!Parameter |!Description | |tiddler |Tiddler to be saved | +|options |See below | |callback |Callback function invoked with parameter `err,adaptorInfo,revision` | |tiddlerInfo |The tiddlerInfo maintained by the syncer for this tiddler | -!! `loadTiddler(title,callback)` +!! `loadTiddler(title,options,callback)` Loads a tiddler from the server. |!Parameter |!Description | |title |Title of tiddler to be retrieved | +|options |See below | |callback |Callback function invoked with parameter `err,tiddlerFields` | -!! `deleteTiddler(title,callback,options)` +!! `deleteTiddler(title,options,callback)` Delete a tiddler from the server. |!Parameter |!Description | |title |Title of tiddler to be deleted | -|callback |Callback function invoked with parameter `err` | |options |See below | +|callback |Callback function invoked with parameter `err` | -The options parameter contains the following properties: +!!! Options + +<<.from-version "5.2.0">> The signature of syncadaptor functions that accept callbacks has been changed so that the callback is always the last argument. A check for the old order of arguments means that this change is backwards compatible. The new order should be prefered when updating or writing new plugins. + +The options parameter may contain the following properties, depending on the method called. |!Property |!Description | +|changeCount |The //new// changeCount value for this tiddler | |tiddlerInfo |The tiddlerInfo maintained by the syncer for this tiddler | diff --git a/plugins/tiddlywiki/filesystem/filesystemadaptor.js b/plugins/tiddlywiki/filesystem/filesystemadaptor.js index 0ed686c84..1d2955ef0 100644 --- a/plugins/tiddlywiki/filesystem/filesystemadaptor.js +++ b/plugins/tiddlywiki/filesystem/filesystemadaptor.js @@ -75,7 +75,14 @@ FileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) { /* Save a tiddler and invoke the callback with (err,adaptorInfo,revision) */ -FileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback,options) { +FileSystemAdaptor.prototype.saveTiddler = function(tiddler,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; var self = this; var syncerInfo = options.tiddlerInfo || {}; this.getTiddlerFileInfo(tiddler,function(err,fileInfo) { @@ -117,14 +124,28 @@ Load a tiddler and invoke the callback with (err,tiddlerFields) We don't need to implement loading for the file system adaptor, because all the tiddler files will have been loaded during the boot process. */ -FileSystemAdaptor.prototype.loadTiddler = function(title,callback) { +FileSystemAdaptor.prototype.loadTiddler = function(title,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; callback(null,null); }; /* Delete a tiddler and invoke the callback with (err) */ -FileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) { +FileSystemAdaptor.prototype.deleteTiddler = function(title,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; var self = this, fileInfo = this.boot.files[title]; // Only delete the tiddler if we have writable information for the file diff --git a/plugins/tiddlywiki/savetrail/savetrail.js b/plugins/tiddlywiki/savetrail/savetrail.js index ec6fe7c01..8c2dd1233 100644 --- a/plugins/tiddlywiki/savetrail/savetrail.js +++ b/plugins/tiddlywiki/savetrail/savetrail.js @@ -99,7 +99,14 @@ SaveTrailSyncAdaptor.prototype.getTiddlerInfo = function(tiddler) { /* Save a tiddler and invoke the callback with (err,adaptorInfo,revision) */ -SaveTrailSyncAdaptor.prototype.saveTiddler = function(tiddler,callback) { +SaveTrailSyncAdaptor.prototype.saveTiddler = function(tiddler,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; if($tw.wiki.checkTiddlerText(ENABLE_TIDDLER_TITLE,"yes")) { var isDraft = $tw.utils.hop(tiddler.fields,"draft.of"); if(!isDraft || $tw.wiki.checkTiddlerText(ENABLE_DRAFTS_TIDDLER_TITLE,"yes")) { @@ -112,14 +119,28 @@ SaveTrailSyncAdaptor.prototype.saveTiddler = function(tiddler,callback) { /* Load a tiddler and invoke the callback with (err,tiddlerFields) */ -SaveTrailSyncAdaptor.prototype.loadTiddler = function(title,callback) { +SaveTrailSyncAdaptor.prototype.loadTiddler = function(title,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; callback(null,null); }; /* Delete a tiddler and invoke the callback with (err) */ -SaveTrailSyncAdaptor.prototype.deleteTiddler = function(title,callback,options) { +SaveTrailSyncAdaptor.prototype.deleteTiddler = function(title,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; callback(null,null); }; diff --git a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js index ff4db2185..5c2db9492 100644 --- a/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js +++ b/plugins/tiddlywiki/tiddlyweb/tiddlywebadaptor.js @@ -182,7 +182,14 @@ TiddlyWebAdaptor.prototype.getSkinnyTiddlers = function(callback) { /* Save a tiddler and invoke the callback with (err,adaptorInfo,revision) */ -TiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,callback,options) { +TiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; var self = this; if(this.isReadOnly) { return callback(null,options.tiddlerInfo.adaptorInfo); @@ -216,7 +223,14 @@ TiddlyWebAdaptor.prototype.saveTiddler = function(tiddler,callback,options) { /* Load a tiddler and invoke the callback with (err,tiddlerFields) */ -TiddlyWebAdaptor.prototype.loadTiddler = function(title,callback) { +TiddlyWebAdaptor.prototype.loadTiddler = function(title,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; var self = this; $tw.utils.httpRequest({ url: this.host + "recipes/" + encodeURIComponent(this.recipe) + "/tiddlers/" + encodeURIComponent(title), @@ -235,7 +249,14 @@ Delete a tiddler and invoke the callback with (err) options include: tiddlerInfo: the syncer's tiddlerInfo for this tiddler */ -TiddlyWebAdaptor.prototype.deleteTiddler = function(title,callback,options) { +TiddlyWebAdaptor.prototype.deleteTiddler = function(title,options,callback) { + // Check for pre v5.2.0 method signature: + if(typeof callback !== "function" && typeof options === "function"){ + var optionsArg = callback; + callback = options; + options = optionsArg; + } + options = options || {}; var self = this; if(this.isReadOnly) { return callback(null,options.tiddlerInfo.adaptorInfo); From fcea51bb95f6e5a379ccdef8600ff298e9f3ed09 Mon Sep 17 00:00:00 2001 From: Chris Nicoll <clutterstack@users.noreply.github.com> Date: Tue, 25 May 2021 16:06:30 -0400 Subject: [PATCH 1348/2376] Fix typo in saqimtiaz username (#5721) --- editions/prerelease/tiddlers/Release 5.1.24.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index 8d732167f..0eca552c9 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -144,7 +144,7 @@ type: text/vnd.tiddlywiki * <<contributor NicolasPetton>> * <<contributor OdinJorna>> * <<contributor pmario>> -* <<contributor saqimtias>> +* <<contributor saqimtiaz>> * <<contributor simonbaird>> * <<contributor slaymaker1907>> * <<contributor twMat>> From 2f31eab8f41ab8cc94f34759262cb00cc28da9e6 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Tue, 25 May 2021 23:16:02 +0200 Subject: [PATCH 1349/2376] Update docs for tabs macro (#5722) --- editions/tw5.com/tiddlers/macros/TabsMacro.tid | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/editions/tw5.com/tiddlers/macros/TabsMacro.tid b/editions/tw5.com/tiddlers/macros/TabsMacro.tid index b55e43545..310103e23 100644 --- a/editions/tw5.com/tiddlers/macros/TabsMacro.tid +++ b/editions/tw5.com/tiddlers/macros/TabsMacro.tid @@ -1,10 +1,9 @@ caption: tabs created: 20131228162203521 -modified: 20180408084453861 +modified: 20210525204556911 tags: Macros [[Core Macros]] title: tabs Macro type: text/vnd.tiddlywiki - The <<.def tabs>> [[macro|Macros]] presents a [[selection of tiddlers|Title Selection]] as a set of tabs that the user can switch between. The tabs display the <<.field caption>> field of a tiddler if it has one, or the tiddler's title otherwise. If specified, the tabs display the <<.field tooltip>> field of a tiddler as the respective button tooltip. @@ -28,7 +27,7 @@ By default the tabs are arranged horizontally above the content. To get vertical ;retain : Optionally, "yes" specifies that the content of the tabs should be retained when switching to another tab, avoiding re-rendering it (this can be useful to avoid video or audio sources unexpectedly resetting) ;actions -: Optionally, actions can be specified that are triggered when changing a tab +: Optionally, actions can be specified that are triggered when changing a tab. Within the actions, the title of the selected tab is available in the <<.var currentTab>> variable and the `currentTiddler` variable from outside the tabs macro is available in the <<.var save-currentTiddler>> ;explicitState : Optionally, an explicit state title can be specified. It will be preferred over the internally computed (qualified) state title From 68930ceb1b0c186eaf78906bbc521f47fe3b5046 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Tue, 25 May 2021 23:18:37 +0200 Subject: [PATCH 1350/2376] Extend keyboard widget (#5648) --- core/modules/keyboard.js | 4 +- core/modules/widgets/keyboard.js | 39 ++++++----- editions/tw5.com/tiddlers/$__key-test.tid | 4 ++ .../tw5.com/tiddlers/$__key-test_action.tid | 11 ++++ .../tiddlers/Key Codes (Example 1).tid | 66 +++++++++++++++++++ .../tw5.com/tiddlers/Key Codes (Example).tid | 43 ++++++++++++ .../tiddlers/Keyboard Codes (Macros).tid | 50 ++++++++++++++ editions/tw5.com/tiddlers/Keyboard Codes.tid | 31 +++++++++ .../tiddlers/widgets/KeyboardWidget.tid | 19 +++++- 9 files changed, 248 insertions(+), 19 deletions(-) create mode 100644 editions/tw5.com/tiddlers/$__key-test.tid create mode 100644 editions/tw5.com/tiddlers/$__key-test_action.tid create mode 100644 editions/tw5.com/tiddlers/Key Codes (Example 1).tid create mode 100644 editions/tw5.com/tiddlers/Key Codes (Example).tid create mode 100644 editions/tw5.com/tiddlers/Keyboard Codes (Macros).tid create mode 100644 editions/tw5.com/tiddlers/Keyboard Codes.tid diff --git a/core/modules/keyboard.js b/core/modules/keyboard.js index fa883f3dd..1ae9ba482 100644 --- a/core/modules/keyboard.js +++ b/core/modules/keyboard.js @@ -285,7 +285,7 @@ KeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) { }; KeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) { - return event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? "ctrl" : + return event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? "ctrl" : event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? "shift" : event.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? "ctrl-shift" : event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? "alt" : @@ -295,7 +295,7 @@ KeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) { event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? "meta" : event.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? "meta-ctrl" : event.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? "meta-ctrl-shift" : - event.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? "meta-ctrl-alt-shift" : "normal"; + event.metaKey && event.ctrlKey && event.shiftKey && event.altKey ? "meta-ctrl-alt-shift" : "normal"; }; KeyboardManager.prototype.getShortcutTiddlerList = function() { diff --git a/core/modules/widgets/keyboard.js b/core/modules/widgets/keyboard.js index 471d35e37..035e4e351 100644 --- a/core/modules/widgets/keyboard.js +++ b/core/modules/widgets/keyboard.js @@ -44,27 +44,36 @@ KeyboardWidget.prototype.render = function(parent,nextSibling) { classes.push("tc-keyboard"); domNode.className = classes.join(" "); // Add a keyboard event handler - domNode.addEventListener("keydown",function (event) { - if($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) { - var handled = self.invokeActions(self,event); - if(self.actions) { - self.invokeActionString(self.actions,self,event); - } - self.dispatchMessage(event); - if(handled || self.actions || self.message) { - event.preventDefault(); - event.stopPropagation(); - } - return true; - } - return false; - },false); + $tw.utils.addEventListeners(domNode,[ + {name: "keydown", handlerObject: this, handlerMethod: "handleChangeEvent"} + ]); // Insert element parent.insertBefore(domNode,nextSibling); this.renderChildren(domNode,null); this.domNodes.push(domNode); }; +KeyboardWidget.prototype.handleChangeEvent = function(event) { + if($tw.keyboardManager.checkKeyDescriptors(event,this.keyInfoArray)) { + var handled = this.invokeActions(this,event); + if(this.actions) { + var variables = { + "event-key": event.key, + "event-code": event.code, + "modifier": $tw.keyboardManager.getEventModifierKeyDescriptor(event) + }; + this.invokeActionString(this.actions,this,event,variables); + } + this.dispatchMessage(event); + if(handled || this.actions || this.message) { + event.preventDefault(); + event.stopPropagation(); + } + return true; + } + return false; +} + KeyboardWidget.prototype.dispatchMessage = function(event) { this.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable("currentTiddler")}); }; diff --git a/editions/tw5.com/tiddlers/$__key-test.tid b/editions/tw5.com/tiddlers/$__key-test.tid new file mode 100644 index 000000000..2504c9321 --- /dev/null +++ b/editions/tw5.com/tiddlers/$__key-test.tid @@ -0,0 +1,4 @@ +created: 20210525102327864 +modified: 20210525102327884 +title: $:/key-test +type: text/vnd.tiddlywiki \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/$__key-test_action.tid b/editions/tw5.com/tiddlers/$__key-test_action.tid new file mode 100644 index 000000000..79a726908 --- /dev/null +++ b/editions/tw5.com/tiddlers/$__key-test_action.tid @@ -0,0 +1,11 @@ +created: 20210525102659716 +modified: 20210525102701077 +title: $:/key-test/action +type: text/vnd.tiddlywiki + +<$vars tv-wikilinks="no"> + +* event-key: +* event-code: +* modifier: +</$vars> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/Key Codes (Example 1).tid b/editions/tw5.com/tiddlers/Key Codes (Example 1).tid new file mode 100644 index 000000000..3abe14699 --- /dev/null +++ b/editions/tw5.com/tiddlers/Key Codes (Example 1).tid @@ -0,0 +1,66 @@ +created: 20210427092418146 +modified: 20210525130708186 +tags: KeyboardWidget +title: Key Codes (Example 1) +type: text/vnd.tiddlywiki + +\define key-test() $:/key-test + +\import [[Keyboard Codes (Macros)]] + +\define keys() +backspace tab clear return enter pause escape space +page_up page_down end home printscreen insert delete + +left up right down results in: ArrowLeft ArrowUp ArrowRight ArrowDown + + 0 1 2 3 +shift+0 shift+1 shift+2 shift+3 results in: = ! " with modifierKey: shift + ctrl+0 ctrl+1 ctrl+2 ctrl+3 + alt+0 alt+1 alt+2 alt+3 + + ctrl+alt+0 ctrl+alt+1 ctrl+alt+2 ctrl+alt+3 + alt+shift+0 alt+shift+1 alt+shift+2 alt+shift+3 + ctrl+shift+0 ctrl+shift+1 ctrl+shift+2 ctrl+shift+3 INFO: ctrl-shift-0 is eaten by windows!! +ctrl+alt+shift+0 ctrl+alt+shift+1 ctrl+alt+shift+2 ctrl+alt+shift+3 + + a s d + shift+a shift+s shift+d + ctrl+a ctrl+s ctrl+d + alt+a alt+s alt+d + + ctrl+shift+a ctrl+shift+s ctrl+shift+d + alt+shift+a alt+shift+s alt+shift+d + ctrl+alt+a ctrl+alt+s ctrl+alt+d +ctrl+alt+shift+a ctrl+alt+shift+s ctrl+alt+shift+d + +numpad0 numpad1 numpad2 numpad3 + +multiply add separator subtract decimal divide + +f1 f2 f3 + +semicolon equals comma dash period slash backquote openbracket backslash closebracket quote +\end + +! Key Codes + +{{$:/key-test/action}} + +! Input Area + +Depending on your OS and browser keyboard settings, some combinations may be "eaten" by the OS, or the browser! + +--> <$keyboard key={{{ [enlist<keys>join[ ]] }}} actions=<<actionKey>> > + <$edit-text tiddler=<<key-test>> placeholder="- Click here. Try keys from list below -" tag=input focus /> +</$keyboard> <-- + +!! Keys to be used + +<pre><code><$vars tv-wikilinks="no"><<keys>></$vars></code></pre> + +All possible keys can be found at: [[Keyboard Codes]] + +! Example Code + +<<showCode>> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/Key Codes (Example).tid b/editions/tw5.com/tiddlers/Key Codes (Example).tid new file mode 100644 index 000000000..6f50863b2 --- /dev/null +++ b/editions/tw5.com/tiddlers/Key Codes (Example).tid @@ -0,0 +1,43 @@ +created: 20210427130002905 +modified: 20210525130748774 +tags: KeyboardWidget +title: Key Codes (Example) +type: text/vnd.tiddlywiki + +\define key-test() $:/key-test + +\import [[Keyboard Codes (Macros)]] + +\define keys() +1 2 3 +shift+1 shift+2 shift+3 +a s d +f1 f2 f3 +\end + +! Key Codes + +{{$:/key-test/action}} + +! Input Area + +Depending on your OS and browser keyboard settings, some combinations may be "eaten" by the OS, or the browser + +--> <$keyboard key={{{ [enlist<keys>join[ ]] }}} actions=<<actionKey>> > + <$edit-text tiddler=<<key-test>> placeholder="- Click here to try keys -" tag=input /> +</$keyboard> <-- + + +!! Keys to be tested + +<$list filter="[enlist<keys>]"><kbd><<currentTiddler>></kbd>, </$list> + +----- + +All usable keys can be found at: [[Keyboard Codes]] + +A more advanced example can be found at: [[Key Codes (Example 1)]] + +! Code + +<<showCode>> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/Keyboard Codes (Macros).tid b/editions/tw5.com/tiddlers/Keyboard Codes (Macros).tid new file mode 100644 index 000000000..4a652db25 --- /dev/null +++ b/editions/tw5.com/tiddlers/Keyboard Codes (Macros).tid @@ -0,0 +1,50 @@ +created: 20210429084127864 +modified: 20210525130830934 +tags: +title: Keyboard Codes (Macros) +type: text/vnd.tiddlywiki + +\define key-test-prefix() $:/key-test + +\define codeState() $:/state/code/$(currentTiddler)$ + +\define getText() +<$vars tv-wikilinks="no"> + +* event-key: ''$(event-key)$'' +* event-code: ''$(event-code)$'' +* modifier: ''$(modifier)$'' +</$vars> +\end + +\define pinDetails() + <$action-setfield $tiddler=<<codeState>> text="open"/> +\end + +\define unpinDetails() + <$action-deletetiddler $tiddler=<<codeState>> /> +\end + +\define toggleDetails(text) +<$list filter="[<codeState>!has[title]]" variable="ignore"> + <$button class="tc-btn-invisible" actions=<<pinDetails>> >$text$ {{$:/core/images/unfold-button}}</$button> +</$list> +<$list filter="[<codeState>has[title]]" variable="ignore"> + <$button class="tc-btn-invisible" actions=<<unpinDetails>> >$text$ {{$:/core/images/fold-button}}</$button> +</$list> +\end + +\define actionKey() +<$action-setfield $tiddler="$:/key-test/action" text=<<getText>> /> +\end + +\define showCode() + +''<<toggleDetails """Toggle this tiddler code""">>'' + +<$list filter="[<codeState>has[title]]" variable=ignore> +<pre><code><$view /></code></pre> +</$list> +\end + +<pre><code><$view /></code></pre> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/Keyboard Codes.tid b/editions/tw5.com/tiddlers/Keyboard Codes.tid new file mode 100644 index 000000000..00e746d39 --- /dev/null +++ b/editions/tw5.com/tiddlers/Keyboard Codes.tid @@ -0,0 +1,31 @@ +created: 20210427090945829 +modified: 20210525103712235 +tags: KeyboardWidget +title: Keyboard Codes +type: text/vnd.tiddlywiki + +! All Key Codes known by the KeyboardWidget + +<kbd>cancel</kbd>, <kbd>help</kbd>, <kbd>backspace</kbd>, <kbd>tab</kbd>, <kbd>clear</kbd>, <kbd>return</kbd>, <kbd>enter</kbd>, <kbd>pause</kbd>, <kbd>escape</kbd>, <kbd>space</kbd>, +<kbd>page_up</kbd>, <kbd>page_down</kbd>, <kbd>end</kbd>, <kbd>home</kbd>, <kbd>left</kbd>, <kbd>up</kbd>, <kbd>right</kbd>, <kbd>down</kbd>, <kbd>printscreen</kbd>, <kbd>insert</kbd>, <kbd>delete</kbd> + +<kbd>0</kbd>, <kbd>1</kbd>, <kbd>2</kbd>, <kbd>3</kbd>, <kbd>4</kbd>, <kbd>5</kbd>, <kbd>6</kbd>, <kbd>7</kbd>, <kbd>8</kbd>, <kbd>9</kbd> + +<kbd>a</kbd>, <kbd>b</kbd>, <kbd>c</kbd>, <kbd>d</kbd>, <kbd>e</kbd>, <kbd>f</kbd>, <kbd>g</kbd>, <kbd>h</kbd>, <kbd>i</kbd>, <kbd>j</kbd>, <kbd>k</kbd>, <kbd>l</kbd>, <kbd>m</kbd>, <kbd>n</kbd>, <kbd>o</kbd>, <kbd>p</kbd>, <kbd>q</kbd>, <kbd>r</kbd>, <kbd>s</kbd>, <kbd>t</kbd>, <kbd>u</kbd>, <kbd>v</kbd>, <kbd>w</kbd>, <kbd>x</kbd>, <kbd>y</kbd>, <kbd>z</kbd> + +<kbd>numpad0</kbd>, <kbd>numpad1</kbd>, <kbd>numpad2</kbd>, <kbd>numpad3</kbd>, <kbd>numpad4</kbd>, <kbd>numpad5</kbd>, <kbd>numpad6</kbd>, <kbd>numpad7</kbd>, <kbd>numpad8</kbd>, <kbd>numpad9</kbd> + +<kbd>multiply</kbd>, <kbd>add</kbd>, <kbd>separator</kbd>, <kbd>subtract</kbd>, <kbd>decimal</kbd>, <kbd>divide</kbd> + +<kbd>f1</kbd>, <kbd>f2</kbd>, <kbd>f3</kbd>, <kbd>f4</kbd>, <kbd>f5</kbd>, <kbd>f6</kbd>, <kbd>f7</kbd>, <kbd>f8</kbd>, <kbd>f9</kbd>, <kbd>f10</kbd>, <kbd>f11</kbd>, <kbd>f12</kbd><br/> +<kbd>f13</kbd>, <kbd>f14</kbd>, <kbd>f15</kbd>, <kbd>f16</kbd>, <kbd>f17</kbd>, <kbd>f18</kbd>, <kbd>f19</kbd>, <kbd>f20</kbd>, <kbd>f21</kbd>, <kbd>f22</kbd>, <kbd>f23</kbd>, <kbd>f24</kbd> + +<kbd>firefoxsemicolon</kbd>, <kbd>firefoxequals</kbd>, <kbd>firefoxminus</kbd> + +<kbd>semicolon</kbd>, <kbd>equals</kbd>, <kbd>comma</kbd>, <kbd>dash</kbd>, <kbd>period</kbd>, <kbd>slash</kbd>, <kbd>backquote</kbd>, <kbd>openbracket</kbd>, <kbd>backslash</kbd>, <kbd>closebracket</kbd>, <kbd>quote</kbd> + +<kbd>shift</kbd>, <kbd>ctrl</kbd>, <kbd>alt</kbd>, <kbd>meta</kbd> + +! Examples + +<<list-links "[tag[KeyboardWidget]prefix[Key Codes (Example]]">> \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid b/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid index 70ca38f46..ce9e3b3e0 100644 --- a/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/KeyboardWidget.tid @@ -1,6 +1,7 @@ caption: keyboard created: 20140302192136805 -modified: 20161003114634019 +list: [[Keyboard Codes]] [[Key Codes (Example)]] [[Key Codes (Example 1)]] [[Possible Keys (Example 2)]] +modified: 20210525102143381 tags: Widgets title: KeyboardWidget type: text/vnd.tiddlywiki @@ -14,13 +15,23 @@ The keyboard widget allows ActionWidgets to be triggered by specific key combina The content of the `<$keyboard>` widget is rendered normally. The keyboard shortcuts only take effect when the focus is within the contained content. |!Attribute |!Description | -|actions |A string containing ActionWidgets to be triggered when the key combination is detected | +|actions |A string containing ActionWidgets to be triggered when the key combination is detected<br><<.from-version "5.2.0">> The variables: ''event-key'', ''event-code'' and ''modifier'' are available for the actions | |message |The title of the [[WidgetMessage|Messages]] to generate | |param |The parameter to be passed with the [[WidgetMessage|Messages]] | |key |Key string identifying the key(s) to be trapped (see below) | |class |A CSS class to be assigned to the generated HTML DIV element | |tag|<<.from-version "5.1.14">> The html element the widget creates to capture the keyboard event, defaults to:<br>» `span` when parsed in inline-mode<br>» `div` when parsed in block-mode| +! Variables + +<<.from-version "5.2.0">> The following variables are made available to the actions: + +|column-1-20 |k +|!Variables |!Description | +|`event-key` |The <<.var event-key>> variable contains the character, if possible. eg: `1`. You can experiment with some settings at: [[Key Codes (Example)]] | +|`event-code` |The <<.var event-code>> variable contains a character description. eg: `Digit1` instead of `1`. Or `Space` instead of an empty string ` `, which is hard to see| +|`modifier` |The [[modifier Variable]] contains the Modifier Key held during the event (can be <kbd>normal</kbd>, <kbd>ctrl</kbd>, <kbd>shift</kbd>, <kbd>alt</kbd> or combinations thereof) | + ! Key Strings Key strings are made up of one or more key specifiers separated by spaces. Each key specifier is zero or more of the modifiers <kbd>alt</kbd>, <kbd>shift</kbd>, <kbd>ctrl</kbd> or <kbd>meta</kbd> followed by the name of a key, all joined with "+" plus or "-" minus symbols. Key names are either the letter or digit printed on the key (eg "a" or "1"), or one of the special keys <kbd>backspace</kbd>, <kbd>tab</kbd>, <kbd>enter</kbd> or <kbd>escape</kbd>. @@ -43,3 +54,7 @@ shift+escape ctrl+enter ctrl+shift+alt+A ``` + +! More Info + +<<list-links "[tag[KeyboardWidget]]">> From ca96f7f62b11ad8f1fe8578996a4fc4186174b36 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Tue, 25 May 2021 23:19:09 +0200 Subject: [PATCH 1351/2376] contain the long list inside a div which is 50% of vertical height (#5385) --- .../tiddlers/concepts/ShadowTiddlers.tid | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid b/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid index 3e1336c1f..014bb5fe4 100644 --- a/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid +++ b/editions/tw5.com/tiddlers/concepts/ShadowTiddlers.tid @@ -1,11 +1,19 @@ -title: ShadowTiddlers -tags: Concepts -modified: 201308091623 +\define actions() +<$action-setfield $tiddler="$:/state/tab/moresidebar-1850697562" $field="text" $value="$:/core/ui/MoreSideBar/Shadows"/> +<$action-setfield $tiddler="$:/state/tab/sidebar--595412856" $field="text" $value="$:/core/ui/SideBar/More"/> +\end +\define click(text) +<$button actions=<<actions>>>$text$</$button> +\end ShadowTiddlers are tiddlers that are loaded from within [[Plugins]]. Unlike ordinary tiddlers, they don't appear in most lists. ShadowTiddlers can be overridden with an ordinary tiddler of the same name. If that tiddler is subsequently deleted then the original shadow tiddler is automatically restored. -The current shadow tiddlers are: +!! Overridden Shadow Tiddlers -<$list filter="[all[shadows]sort[title]]"/> +<<list-links "[is[tiddler]is[shadow]sort[title]]">> + +!! Shadow Tiddlers + +A full list of shadow tiddlers can be found in the sidebar in the "More" -> "Shadows" tab From f342fdc41d4f9e5b469103df064c5fdf84959efe Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Tue, 25 May 2021 23:19:28 +0200 Subject: [PATCH 1352/2376] improve setwidget examples and add a link to and from enlist operator (#5666) --- .../tiddlers/filters/enlist Operator.tid | 5 +- .../tiddlers/widgets/$__docs_anyField.tid | 8 ++ .../tw5.com/tiddlers/widgets/SetWidget.tid | 101 +++++++++++------- 3 files changed, 74 insertions(+), 40 deletions(-) create mode 100644 editions/tw5.com/tiddlers/widgets/$__docs_anyField.tid diff --git a/editions/tw5.com/tiddlers/filters/enlist Operator.tid b/editions/tw5.com/tiddlers/filters/enlist Operator.tid index 18df375f6..e45e97c2a 100644 --- a/editions/tw5.com/tiddlers/filters/enlist Operator.tid +++ b/editions/tw5.com/tiddlers/filters/enlist Operator.tid @@ -1,6 +1,6 @@ caption: enlist created: 20170221144241063 -modified: 20190610165246154 +modified: 20210505100241872 op-input: ignored op-neg-input: a [[selection of titles|Title Selection]] op-neg-output: those input titles that are <<.em not>> listed in <<.place L>> @@ -14,7 +14,7 @@ tags: [[Filter Operators]] [[Field Operators]] [[Selection Constructors]] [[Nega title: enlist Operator type: text/vnd.tiddlywiki -<<.tip " Literal filter operands cannot contain square brackets but you can work around the issue by using a variable:">> +<<.tip """Literal filter operands cannot contain square brackets but you can work around the issue by using a variable. ''Learn more at:'' [[SetWidget]] documentation under the heading "Filtered List Variable Assignment" """>> ``` <$set name="myList" value="first [[second with a space]] third"> @@ -22,5 +22,4 @@ type: text/vnd.tiddlywiki ... ``` - <<.operator-examples "enlist">> diff --git a/editions/tw5.com/tiddlers/widgets/$__docs_anyField.tid b/editions/tw5.com/tiddlers/widgets/$__docs_anyField.tid new file mode 100644 index 000000000..3e0c7f434 --- /dev/null +++ b/editions/tw5.com/tiddlers/widgets/$__docs_anyField.tid @@ -0,0 +1,8 @@ +created: 20210505094244703 +field: list +modified: 20210505094434740 +tags: +title: $:/docs/anyField +type: text/vnd.tiddlywiki + +This tiddler is needed for the last [[SetWidget]] example \ No newline at end of file diff --git a/editions/tw5.com/tiddlers/widgets/SetWidget.tid b/editions/tw5.com/tiddlers/widgets/SetWidget.tid index d34fa1658..12ed35176 100644 --- a/editions/tw5.com/tiddlers/widgets/SetWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/SetWidget.tid @@ -1,6 +1,6 @@ caption: set created: 20131115182700000 -modified: 20180315165405442 +modified: 20210505095640228 tags: Widgets title: SetWidget type: text/vnd.tiddlywiki @@ -15,79 +15,106 @@ The content of the `<$set>` widget is the scope for the value assigned to the va |!Attribute |!Description | |name |The name of the variable to assign (defaults to "currentTiddler") | -|value |The value to assign to the variable if the filter is missing or not empty | +|value |The value to assign to the variable if the <<.attr filter>> attribute is missing or not empty | |tiddler |<<.from-version "5.1.15">> Optional title of the tiddler from which to read the value | |subtiddler |<<.from-version "5.1.16">> Optionally specifies the title of a subtiddler within a plugin tiddler identified by the ''tiddler'' attribute | |field |<<.from-version "5.1.15">> Optional field of the tiddler from which to read the value (only used if ''tiddler'' is used) | |index |<<.from-version "5.1.15">> Optional index of the tiddler from which to read the value (only used if ''tiddler'' is used) | -|filter |An optional filter to be evaluated and assigned to the variable (see below) | +|filter |An optional filter to be evaluated and assigned to the variable (see "Filtered List Variable Assignment" below). The variable can be used with the <<.olink enlist>> operator | |select |<<.from-version "5.1.14">> An optional zero-based index of the item to return from the filter output (see below) | |emptyValue |The value to assign to the variable if the specified value is missing or empty (see below) | <<.tip """If the value of your variable is enclosed in double square brackets this might indicate that you are returning a list of values from the filter. To use a single title from the filter output without the double square brackets see ''Filtered Item Variable Assignment'' below.""">> +! Examples + !! Simple Variable Assignment The simplest way of using set variable widget assigns a string to a variable. The following example assigns a literal string -``` -<$set name="myVariable" value="Some text"> +<<< + +<$macrocall $name='wikitext-example-without-html' +src='<$set name="myVariable" value="Some text"> <$text text=<<myVariable>>/> -</$set> -``` +</$set>' /> + +<<< Both the name and value attributes can be transcluded. For example: -``` -<$set name=<<anotherVariable>> value={{template!!text}}> -<$text text=<<myVariable>>/> -</$set> -``` +<<< + +<$macrocall $name='wikitext-example-without-html' +src='<$set name=anotherVariable value="myVariable"> + <$set name=<<anotherVariable>> value={{$:/language/DefaultNewTiddlerTitle}}> + <$text text=<<myVariable>>/> + </$set> +</$set>' /> + +<<< !! Conditional Variable Assignment This form of the set variable widget chooses one of two specified values according to whether a filter evaluates to an empty list. Here's an example that sets a variable according to whether the current tiddler is called "myMagicTitle": -``` -<$set name="myVariable" filter="[all[current]field:title[myMagicTitle]]" value="It's magic" emptyValue="It's not magic"> +<<< + +<$macrocall $name='wikitext-example-without-html' +src="""<$set name="myVariable" filter="[all[current]field:title[myMagicTitle]]" value="It's magic" emptyValue="It's not magic"> <$text text=<<myVariable>>/> -</$set> -``` +</$set>""" /> + +<<< !! Filtered List Variable Assignment This form of the set variable widget evaluates the filter and assigns the result to the variable as a space-separated list (using double square brackets for titles containing spaces). -``` -<$set name="myVariable" filter="[tag[HelloThere]]"> -<$text text=<<myVariable>>/> -</$set> -``` +<<< -!! Filtered Item Variable Assignment +<$macrocall $name='wikitext-example-without-html' +src='<$set name="myVariable" filter="[tag[HelloThere]]"> +<$text text=<<myVariable>>/> +</$set>' /> + +<<< + +!! Filtered Item Variable Assignment Single Element <<.from-version "5.1.14">> This form of the set variable widget evaluates the filter and assigns the specified result to the variable as a single item (ie, not using double square brackets for titles containing spaces). -``` -<$set name="myVariable" filter="[tag[HelloThere]]" select="0"> +<<< + +<$macrocall $name='wikitext-example-without-html' +src='<$set name="myVariable" filter="[tag[HelloThere]]" select="0"> <$text text=<<myVariable>>/> -</$set> -``` +</$set>'/> + +<<< !! Transcluded Variable Assignment <<.from-version "5.1.15">> This form of the set variable widget obtains the value to assign to the variable from a value in a tiddler field or index. For example: -``` -<$set name="myVariable" tiddler="HelloThere" field="text"> -<$text text=<<myVariable>>/> -</$set> -``` +<<< -The example above could also be written as `<$set name="myVariable" value={{HelloThere!!text}}>`. The advantage of using the ''tiddler'' attribute is that the tiddler title and field or index can themselves be computed. For example: - -``` -<$set name="myVariable" tiddler=<<myTiddler>> field={{$:/currentField}}> +<$macrocall $name='wikitext-example-without-html' +src='<$set name="myVariable" tiddler="HelloThere" field="list"> <$text text=<<myVariable>>/> -</$set> -``` +</$set>'/> + +<<< + +The example above could also be written as `<$set name="myVariable" value={{HelloThere!!list}}>`. The advantage of using the ''tiddler'' attribute is that the tiddler title and field or index can themselves be computed. For example: + +<<< + +<$macrocall $name='wikitext-example-without-html' +src='<$set name="myTiddler" value="HelloThere"> + <$set name="myVariable" tiddler=<<myTiddler>> field={{$:/docs/anyField!!field}}> + <$text text=<<myVariable>>/> + </$set> +</$set>'/> + +<<< From 123666c240ae611fff2675d886c393669dba1729 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Tue, 25 May 2021 23:19:58 +0200 Subject: [PATCH 1353/2376] Add th-before-importing hook mechanism (#5464) --- core/modules/widgets/navigator.js | 9 ++- .../new/Hook_ th-before-importing.tid | 68 +++++++++++++++++++ .../new/Hook__th-importing-tiddler.tid | 4 +- 3 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 editions/dev/tiddlers/new/Hook_ th-before-importing.tid diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 02eee8c43..e1e9e921e 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -557,10 +557,12 @@ NavigatorWidget.prototype.handleImportTiddlersEvent = function(event) { NavigatorWidget.prototype.handlePerformImportEvent = function(event) { var self = this, importTiddler = this.wiki.getTiddler(event.param), - importData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}), + importData, importReport = []; - // Add the tiddlers to the store importReport.push($tw.language.getString("Import/Imported/Hint") + "\n"); + // If you need to modify the import tiddler payload then consider th-importing-tiddler instead + importTiddler = $tw.hooks.invokeHook("th-before-importing",importTiddler); + importData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}), $tw.utils.each(importData.tiddlers,function(tiddlerFields) { var title = tiddlerFields.title; if(title && importTiddler && importTiddler.fields["selection-" + title] !== "unchecked") { @@ -569,7 +571,10 @@ NavigatorWidget.prototype.handlePerformImportEvent = function(event) { } else { var tiddler = new $tw.Tiddler(tiddlerFields); } + // th-importing-tiddler doesn't allow user interaction by default + // If you want to use the default UI then use: $:/core/modules/upgraders/ instead tiddler = $tw.hooks.invokeHook("th-importing-tiddler",tiddler); + // Add the tiddlers to the store self.wiki.addTiddler(tiddler); importReport.push("# [[" + tiddler.fields.title + "]]"); } diff --git a/editions/dev/tiddlers/new/Hook_ th-before-importing.tid b/editions/dev/tiddlers/new/Hook_ th-before-importing.tid new file mode 100644 index 000000000..19157566f --- /dev/null +++ b/editions/dev/tiddlers/new/Hook_ th-before-importing.tid @@ -0,0 +1,68 @@ +created: 20210203184649726 +modified: 20210208152038746 +tags: HookMechanism +title: Hook: th-before-importing +type: text/vnd.tiddlywiki + +This hook allows plugins to inspect or modify the `importTiddler` object ''before'' any tiddlers are imported. It is invoked after the final "Import" button is clicked, but ''before'' the selected tiddlers are being imported into the store. + +''Intended Usecases'': + +* Manipulate the import "selection state" +* Eg: create a customized "log-tiddler" that contains a heading, that should only be written once + +''Important'': + +* This hook ''should not'' be used to manpulate the `importTiddler.fields.text` element! +* If you want to give the users a possibility to verify the imported data, use ùpgraders like: `$:/core/modules/upgraders/` instead +* If you need to manipulate the imported tiddler content, without default user interaction, consider: [[Hook: th-importing-tiddler]] instead + +The hook is part of the `NavigatorWidget.prototype.handlePerformImportEvent` function. + +Hook function parameters: + +* ''importTiddler'': an object, that contains information about "selected / unselected" tiddlers and more + +Return value: + +* ''importTiddler'': object + +The hook must return the `importTiddler` object. For many usecases the object will be returned unmodified. + +''Example code how to implement a hook in your project'' + +``` +/*\ +title: $:/plugins/<author>/<plugin>/th-before-importing.js +type: application/javascript +module-type: startup + +YOUR DISCRCRIPTION COMES HERE! + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false, exports: true */ +"use strict"; + +// Export name and synchronous status +exports.name = "<yournamecomesherewithoutspaces>"; +exports.platforms = ["browser"]; +exports.after = ["startup"]; +exports.synchronous = true; + +// Define your variables here! + +exports.startup = function() { + $tw.hooks.addHook("th-before-importing",function(importTiddler) { + +// YOUR CODE ! + + return importTiddler; + }); +}; + +})(); + +``` \ No newline at end of file diff --git a/editions/dev/tiddlers/new/Hook__th-importing-tiddler.tid b/editions/dev/tiddlers/new/Hook__th-importing-tiddler.tid index 6b9b533f9..a560071e6 100644 --- a/editions/dev/tiddlers/new/Hook__th-importing-tiddler.tid +++ b/editions/dev/tiddlers/new/Hook__th-importing-tiddler.tid @@ -1,11 +1,13 @@ created: 20170209130829546 -modified: 20171010115148355 +modified: 20210203190724491 tags: HookMechanism title: Hook: th-importing-tiddler type: text/vnd.tiddlywiki This hook allows plugins to inspect or modify tiddlers as they are imported via the import mechanism. It is invoked when the final "Import" button is clicked, and the selected tiddlers are being imported into the store. +The hook is part of the `NavigatorWidget.prototype.handlePerformImportEvent` function. + Use this hook if you want to process each imported tiddler after they have been extracted from the files. See [[Hook: th-importing-file]] if you want to control how tiddlers are extracted from files during an import. Hook function parameters: From c6ed4aa84e5e08ce16d4b0c4037ee277a8e021d1 Mon Sep 17 00:00:00 2001 From: Mario Pietsch <pmariojo@gmail.com> Date: Tue, 25 May 2021 23:21:57 +0200 Subject: [PATCH 1354/2376] allow us to import formerly blocked system tiddlers (#5479) --- core/language/en-GB/Import.multids | 4 ++++ core/modules/upgraders/system.js | 11 +++++------ core/modules/widgets/navigator.js | 7 ++++++- core/ui/ImportListing.tid | 21 ++++++++++++++++++++- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/core/language/en-GB/Import.multids b/core/language/en-GB/Import.multids index 24b29c3f7..77e00a111 100644 --- a/core/language/en-GB/Import.multids +++ b/core/language/en-GB/Import.multids @@ -23,7 +23,11 @@ Upgrader/Plugins/Suppressed/Incompatible: Blocked incompatible or obsolete plugi Upgrader/Plugins/Suppressed/Version: Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>). Upgrader/Plugins/Upgraded: Upgraded plugin from <<incoming>> to <<upgraded>>. Upgrader/State/Suppressed: Blocked temporary state tiddler. +Upgrader/System/Disabled: Disabled system tiddler. Upgrader/System/Suppressed: Blocked system tiddler. Upgrader/System/Warning: Core module tiddler. Upgrader/System/Alert: You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable. Upgrader/ThemeTweaks/Created: Migrated theme tweak from <$text text=<<from>>/>. +Upgrader/Tiddler/Disabled: Disabled tiddler. +Upgrader/Tiddler/Selected: User selected. +Upgrader/Tiddler/Unselected: Unselected tiddler. diff --git a/core/modules/upgraders/system.js b/core/modules/upgraders/system.js index de7c48f52..a93a57712 100644 --- a/core/modules/upgraders/system.js +++ b/core/modules/upgraders/system.js @@ -12,8 +12,8 @@ Upgrader module that suppresses certain system tiddlers that shouldn't be import /*global $tw: false */ "use strict"; -var DONT_IMPORT_LIST = ["$:/StoryList","$:/HistoryList"], - DONT_IMPORT_PREFIX_LIST = ["$:/temp/","$:/state/","$:/Import"], +var DONT_IMPORT_LIST = ["$:/Import"], + UNSELECT_PREFIX_LIST = ["$:/temp/","$:/state/","$:/StoryList","$:/HistoryList"], WARN_IMPORT_PREFIX_LIST = ["$:/core/modules/"]; exports.upgrade = function(wiki,titles,tiddlers) { @@ -26,11 +26,10 @@ exports.upgrade = function(wiki,titles,tiddlers) { tiddlers[title] = Object.create(null); messages[title] = $tw.language.getString("Import/Upgrader/System/Suppressed"); } else { - for(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) { - var prefix = DONT_IMPORT_PREFIX_LIST[t]; + for(var t=0; t<UNSELECT_PREFIX_LIST.length; t++) { + var prefix = UNSELECT_PREFIX_LIST[t]; if(title.substr(0,prefix.length) === prefix) { - tiddlers[title] = Object.create(null); - messages[title] = $tw.language.getString("Import/Upgrader/State/Suppressed"); + messages[title] = $tw.language.getString("Import/Upgrader/Tiddler/Unselected"); } } for(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) { diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index e1e9e921e..75ad59a69 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -522,10 +522,15 @@ NavigatorWidget.prototype.handleImportTiddlersEvent = function(event) { }); // Give the active upgrader modules a chance to process the incoming tiddlers var messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers); + // Deselect any disabled, but _not_ suppressed tiddlers + var systemMessage = $tw.language.getString("Import/Upgrader/Tiddler/Unselected"); $tw.utils.each(messages,function(message,title) { newFields["message-" + title] = message; + if (message.indexOf(systemMessage) !== -1) { + newFields["selection-" + title] = "unchecked"; + } }); - // Deselect any suppressed tiddlers + // Deselect suppressed tiddlers ... they have been removed and can't be selected anymore $tw.utils.each(importData.tiddlers,function(tiddler,title) { if($tw.utils.count(tiddler) === 0) { newFields["selection-" + title] = "unchecked"; diff --git a/core/ui/ImportListing.tid b/core/ui/ImportListing.tid index 04ccd9a79..c53be5b18 100644 --- a/core/ui/ImportListing.tid +++ b/core/ui/ImportListing.tid @@ -12,6 +12,24 @@ title: $:/core/ui/ImportListing </$list> \end +\define selectionInfo() +\whitespace trim +<$set name="escUnselected" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}> + <$list filter="[all[current]get<messageField>regexp<escUnselected>]" variable="ignore"> + <$text text={{{[all[current]get<selectionField>match[checked]then{$:/language/Import/Upgrader/Tiddler/Selected}else[]]}}}/> + </$list> +</$set> +\end + +\define libraryInfo() +\whitespace trim +<$set name="escUnselected" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}> + <$list filter="[all[current]get<messageField>!regexp<escUnselected>]" variable="ignore"> + <$text text={{{[all[current]get<messageField>]}}}/> + </$list> +</$set> +\end + \define selectionField() selection-$(payloadTiddler)$ \define renameField() rename-$(payloadTiddler)$ @@ -69,7 +87,8 @@ title: $:/core/ui/ImportListing </$reveal> </td> <td> -<$view field=<<messageField>>/> +<<selectionInfo>> +<<libraryInfo>> <<overWriteWarning>> </td> </tr> From eaf1da66b63828c9226b9c77400f1e35d7a85c0e Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Tue, 25 May 2021 23:22:21 +0200 Subject: [PATCH 1355/2376] Add color-scheme: dark/light to the root element ... (#5720) --- core/palettes/Blanca.tid | 1 + core/palettes/Blue.tid | 1 + core/palettes/BrightMute.tid | 1 + core/palettes/ContrastDark.tid | 1 + core/palettes/ContrastLight.tid | 1 + core/palettes/CupertinoDark.tid | 1 + core/palettes/DarkPhotos.tid | 1 + core/palettes/DesertSand.tid | 1 + core/palettes/GruvBoxDark.tid | 1 + core/palettes/Nord.tid | 1 + core/palettes/Rocker.tid | 1 + core/palettes/SolarFlare.tid | 1 + core/palettes/SolarizedDark.tid | 1 + core/palettes/SolarizedLight.tid | 1 + core/palettes/SpartanDay.tid | 1 + core/palettes/SpartanNight.tid | 1 + core/palettes/Twilight.tid | 1 + core/palettes/Vanilla.tid | 1 + themes/tiddlywiki/vanilla/base.tid | 4 ++++ 19 files changed, 22 insertions(+) diff --git a/core/palettes/Blanca.tid b/core/palettes/Blanca.tid index 5c5afa878..f86705443 100644 --- a/core/palettes/Blanca.tid +++ b/core/palettes/Blanca.tid @@ -1,5 +1,6 @@ title: $:/palettes/Blanca name: Blanca +color-scheme: light description: A clean white palette to let you focus tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/Blue.tid b/core/palettes/Blue.tid index 38a6a3e4a..e3aa21952 100644 --- a/core/palettes/Blue.tid +++ b/core/palettes/Blue.tid @@ -1,5 +1,6 @@ title: $:/palettes/Blue name: Blue +color-scheme: light description: A blue theme tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/BrightMute.tid b/core/palettes/BrightMute.tid index 9c1d3003e..64193c1ce 100644 --- a/core/palettes/BrightMute.tid +++ b/core/palettes/BrightMute.tid @@ -1,5 +1,6 @@ title: $:/palettes/Muted name: Muted +color-scheme: light description: Bright tiddlers on a muted background tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/ContrastDark.tid b/core/palettes/ContrastDark.tid index e12944bf7..ded11b835 100644 --- a/core/palettes/ContrastDark.tid +++ b/core/palettes/ContrastDark.tid @@ -1,5 +1,6 @@ title: $:/palettes/ContrastLight name: Contrast (Light) +color-scheme: light description: High contrast and unambiguous (light version) tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/ContrastLight.tid b/core/palettes/ContrastLight.tid index 04280d08e..d3eb2f731 100644 --- a/core/palettes/ContrastLight.tid +++ b/core/palettes/ContrastLight.tid @@ -1,5 +1,6 @@ title: $:/palettes/ContrastDark name: Contrast (Dark) +color-scheme: dark description: High contrast and unambiguous (dark version) tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/CupertinoDark.tid b/core/palettes/CupertinoDark.tid index f0930f548..956602a0f 100644 --- a/core/palettes/CupertinoDark.tid +++ b/core/palettes/CupertinoDark.tid @@ -1,5 +1,6 @@ title: $:/palettes/CupertinoDark tags: $:/tags/Palette +color-scheme: dark name: Cupertino Dark description: A macOS inspired dark palette type: application/x-tiddler-dictionary diff --git a/core/palettes/DarkPhotos.tid b/core/palettes/DarkPhotos.tid index 2a135f253..4e1949c04 100644 --- a/core/palettes/DarkPhotos.tid +++ b/core/palettes/DarkPhotos.tid @@ -5,6 +5,7 @@ name: DarkPhotos tags: $:/tags/Palette title: $:/palettes/DarkPhotos type: application/x-tiddler-dictionary +color-scheme: light alert-background: #ffe476 alert-border: #b99e2f diff --git a/core/palettes/DesertSand.tid b/core/palettes/DesertSand.tid index ab345d11f..40056962b 100644 --- a/core/palettes/DesertSand.tid +++ b/core/palettes/DesertSand.tid @@ -1,5 +1,6 @@ title: $:/palettes/DesertSand tags: $:/tags/Palette +color-scheme: light name: Desert Sand description: A desert sand palette type: application/x-tiddler-dictionary diff --git a/core/palettes/GruvBoxDark.tid b/core/palettes/GruvBoxDark.tid index 494a9349b..1fa5633c9 100644 --- a/core/palettes/GruvBoxDark.tid +++ b/core/palettes/GruvBoxDark.tid @@ -1,5 +1,6 @@ title: $:/palettes/GruvboxDark name: Gruvbox Dark +color-scheme: dark description: Retro groove color scheme tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/Nord.tid b/core/palettes/Nord.tid index 7af3b01e4..e330b3d0a 100644 --- a/core/palettes/Nord.tid +++ b/core/palettes/Nord.tid @@ -1,5 +1,6 @@ title: $:/palettes/Nord name: Nord +color-scheme: dark description: An arctic, north-bluish color palette. tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/Rocker.tid b/core/palettes/Rocker.tid index 79a253721..bc7d2ded6 100644 --- a/core/palettes/Rocker.tid +++ b/core/palettes/Rocker.tid @@ -1,5 +1,6 @@ title: $:/palettes/Rocker name: Rocker +color-scheme: dark description: A dark theme tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/SolarFlare.tid b/core/palettes/SolarFlare.tid index 5622b29af..e72815657 100644 --- a/core/palettes/SolarFlare.tid +++ b/core/palettes/SolarFlare.tid @@ -1,5 +1,6 @@ title: $:/palettes/SolarFlare name: Solar Flare +color-scheme: light description: Warm, relaxing earth colours tags: $:/tags/Palette type: application/x-tiddler-dictionary diff --git a/core/palettes/SolarizedDark.tid b/core/palettes/SolarizedDark.tid index 2a0fd5e8a..f193bff1c 100644 --- a/core/palettes/SolarizedDark.tid +++ b/core/palettes/SolarizedDark.tid @@ -4,6 +4,7 @@ type: application/x-tiddler-dictionary description: Precision dark colors for machines and people license: MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE name: SolarizedDark +color-scheme: dark alert-background: #073642 alert-border: #93a1a1 diff --git a/core/palettes/SolarizedLight.tid b/core/palettes/SolarizedLight.tid index 3c6979ec6..4bcec81d6 100644 --- a/core/palettes/SolarizedLight.tid +++ b/core/palettes/SolarizedLight.tid @@ -4,6 +4,7 @@ type: application/x-tiddler-dictionary description: Precision colors for machines and people license: MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE name: SolarizedLight +color-scheme: light alert-background: #eee8d5 alert-border: #586e75 diff --git a/core/palettes/SpartanDay.tid b/core/palettes/SpartanDay.tid index 8f722d029..3cd8337a7 100644 --- a/core/palettes/SpartanDay.tid +++ b/core/palettes/SpartanDay.tid @@ -3,6 +3,7 @@ tags: $:/tags/Palette type: application/x-tiddler-dictionary description: Cold, spartan day colors name: Spartan Day +color-scheme: light alert-background: <<colour background>> alert-border: <<colour very-muted-foreground>> diff --git a/core/palettes/SpartanNight.tid b/core/palettes/SpartanNight.tid index f4f672af3..1962c4782 100644 --- a/core/palettes/SpartanNight.tid +++ b/core/palettes/SpartanNight.tid @@ -3,6 +3,7 @@ tags: $:/tags/Palette type: application/x-tiddler-dictionary description: Dark spartan colors name: Spartan Night +color-scheme: dark alert-background: <<colour background>> alert-border: <<colour very-muted-foreground>> diff --git a/core/palettes/Twilight.tid b/core/palettes/Twilight.tid index d90fef328..ff8a0b956 100644 --- a/core/palettes/Twilight.tid +++ b/core/palettes/Twilight.tid @@ -4,6 +4,7 @@ author: Thomas Elmiger type: application/x-tiddler-dictionary name: Twilight description: Delightful, soft darkness. +color-scheme: dark alert-background: rgb(255, 255, 102) alert-border: rgb(232, 232, 125) diff --git a/core/palettes/Vanilla.tid b/core/palettes/Vanilla.tid index 399bf1ac8..d3c7b1441 100644 --- a/core/palettes/Vanilla.tid +++ b/core/palettes/Vanilla.tid @@ -3,6 +3,7 @@ name: Vanilla description: Pale and unobtrusive tags: $:/tags/Palette type: application/x-tiddler-dictionary +color-scheme: light alert-background: #ffe476 alert-border: #b99e2f diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 7ed449afb..30a65926a 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -333,6 +333,10 @@ table tfoot tr td { height: 600px; } +:root { + color-scheme: {{{ [{$:/palette}get[color-scheme]] }}}; +} + /* ** Links */ From 903cfd98a6f4f0ef71ddadae90fa3d0edd5127c5 Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Wed, 26 May 2021 14:54:05 +0800 Subject: [PATCH 1356/2376] Update chinese translations (#5704) --- languages/zh-Hans/Import.multids | 5 +++++ languages/zh-Hant/Import.multids | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/languages/zh-Hans/Import.multids b/languages/zh-Hans/Import.multids index a1320b5c4..f7bcdefaf 100644 --- a/languages/zh-Hans/Import.multids +++ b/languages/zh-Hans/Import.multids @@ -1,5 +1,6 @@ title: $:/language/Import/ +Editor/Import/Heading: 导入图像并插入至编辑器。 Imported/Hint: 下列条目已被导入: Listing/Cancel/Caption: 取消 Listing/Hint: 这些条目已备妥导入: @@ -22,7 +23,11 @@ Upgrader/Plugins/Suppressed/Incompatible: 封锁的不兼容或过时插件。 Upgrader/Plugins/Suppressed/Version: 封锁的插件 (由于传入的 <<incoming>> 不比现有版本 <<existing>> 新)。 Upgrader/Plugins/Upgraded: 升级插件,从 <<incoming>> 到 <<upgraded>>。 Upgrader/State/Suppressed: 封锁的暂存状态条目。 +Upgrader/System/Disabled: 已禁用系統条目。 Upgrader/System/Suppressed: 封锁的系统条目。 Upgrader/System/Warning: 核心模块条目。 Upgrader/System/Alert: 您即将导入一个条目会覆盖一个核心模块条目。不建议这样做,因为可能会使系统不稳定。 Upgrader/ThemeTweaks/Created: 从 <$text text=<<from>>/> 迁移布景主题。 +Upgrader/Tiddler/Disabled: 已禁用系統条目。 +Upgrader/Tiddler/Selected: 用户选定。 +Upgrader/Tiddler/Unselected: 未选定的条目 \ No newline at end of file diff --git a/languages/zh-Hant/Import.multids b/languages/zh-Hant/Import.multids index d87935929..dfcb7a0e9 100644 --- a/languages/zh-Hant/Import.multids +++ b/languages/zh-Hant/Import.multids @@ -1,5 +1,6 @@ title: $:/language/Import/ +Editor/Import/Heading: 導入圖像並插入至編輯器。 Imported/Hint: 下列條目已被導入: Listing/Cancel/Caption: 取消 Listing/Hint: 這些條目已備妥導入: @@ -22,7 +23,11 @@ Upgrader/Plugins/Suppressed/Incompatible: 封鎖的不相容或過時插件。 Upgrader/Plugins/Suppressed/Version: 封鎖的插件 (由於傳入的 <<incoming>> 不比現有版本 <<existing>> 新)。 Upgrader/Plugins/Upgraded: 升級插件,從 <<incoming>> 到 <<upgraded>>。 Upgrader/State/Suppressed: 封鎖的暫存狀態條目。 +Upgrader/System/Disabled: 停用系統條目。 Upgrader/System/Suppressed: 封鎖的系統條目。 Upgrader/System/Warning: 核心模組條目。 Upgrader/System/Alert: 您即將導入一個條目會覆蓋一個核心模組條目。不建議這樣做,因為可能會使系統不穩定。 Upgrader/ThemeTweaks/Created: 從 <$text text=<<from>>/> 遷移佈景主題。 +Upgrader/Tiddler/Disabled: 停用條目。 +Upgrader/Tiddler/Selected: 使用者選定。 +Upgrader/Tiddler/Unselected: 未選定的條目。 From 082aeb92ac251c9771edd97ebe7aaa7c184f4fe9 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 26 May 2021 13:25:19 +0100 Subject: [PATCH 1357/2376] Revert "extend lookup op flexibility with 2 parameters (#5315)" This reverts commit 81b5fe944a8ebdb27b9972d3fa7093fe5f5ce68c. See https://github.com/Jermolene/TiddlyWiki5/pull/5315#issuecomment-848725198 for explanation --- core/modules/filters/lookup.js | 39 +++---------------- .../examples/lookup Operator (Examples).tid | 5 +-- .../tiddlers/filters/lookup Operator.tid | 36 +++++------------ 3 files changed, 17 insertions(+), 63 deletions(-) diff --git a/core/modules/filters/lookup.js b/core/modules/filters/lookup.js index 4af4ac681..2174e8c47 100644 --- a/core/modules/filters/lookup.js +++ b/core/modules/filters/lookup.js @@ -5,11 +5,9 @@ module-type: filteroperator Filter operator that looks up values via a title prefix -[lookup:<defaultvalue>:<field OR index>[<prefix>],[<field-name OR index-name>]] +[lookup:<field>[<prefix>]] -Prepends the prefix to the selected items and returns the specified -field or index value. If the 2nd suffix does not exist, it defaults to field. -If the second operand is missing it defaults to "text" for fields, and "0" for indexes +Prepends the prefix to the selected items and returns the specified field value \*/ (function(){ @@ -22,35 +20,10 @@ If the second operand is missing it defaults to "text" for fields, and "0" for i Export our filter function */ exports.lookup = function(source,operator,options) { - var results = [], - suffixes = operator.suffixes || [], - defaultSuffix = suffixes[0] ? (suffixes[0][0] || "") : "", - indexSuffix = (suffixes[1] && suffixes[1][0] === "index") ? true : false, - target; - if(operator.operands.length == 2) { - target = operator.operands[1] - } else { - target = indexSuffix ? "0": "text"; - } - if(indexSuffix) { - source(function(tiddler,title) { - var targetTitle = operator.operands[0] + title; - var data = options.wiki.extractTiddlerDataItem(targetTitle,target,defaultSuffix); - results.push(data); - }); - } else { - source(function(tiddler,title) { - var targetTitle = operator.operands[0] + title; - var targetTiddler = options.wiki.getTiddler(targetTitle); - if(targetTiddler) { - var value = targetTiddler.getFieldString(target); - if(value == "" && defaultSuffix !== "") { - value = defaultSuffix; - } - results.push(value); - } - }); - } + var results = []; + source(function(tiddler,title) { + results.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix || ''); + }); return results; }; diff --git a/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid b/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid index e923e8d5c..052e1d2bd 100644 --- a/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid +++ b/editions/tw5.com/tiddlers/filters/examples/lookup Operator (Examples).tid @@ -1,10 +1,7 @@ created: 20170907144257037 -modified: 20201224034837935 +modified: 20170907144559822 title: lookup Operator (Examples) type: text/vnd.tiddlywiki <<.operator-example 1 "[all[shadows+tiddlers]tag[$:/tags/PageControls]lookup[$:/config/PageControlButtons/Visibility/]]" "Retrieve the visibility status of each page control button">> <<.operator-example 2 "[all[shadows+tiddlers]tag[$:/tags/PageControls]lookup:show[$:/config/PageControlButtons/Visibility/]]" "Retrieve the visibility status of each page control button, this time with a default value">> -<<.operator-example 3 "[all[tiddlers]has[plugin-type]removeprefix[$:/plugins/tiddlywiki/]lookup:missing-description:field[$:/plugins/tiddlywiki/],[description]]" "Retrieve the description of all plugin-tiddlers that are in the `$:/plugins/tiddlywiki/` namespace.">> -<<.operator-example 4 "OriginalTiddlerPaths +[lookup:missing-index:index[$:/config/],[HelloThere]]" "Lookup the original tiddler path on disk for the [[Hello There]] tiddler.">> -<<.operator-example 5 "OriginalTiddlerPaths +[lookup:missing-index:index[$:/config/],[MissingTiddler]]" "Lookup the original tiddler path on disk for the [[MissingTiddler]] tiddler.">> diff --git a/editions/tw5.com/tiddlers/filters/lookup Operator.tid b/editions/tw5.com/tiddlers/filters/lookup Operator.tid index 4262564a4..9cbd6d5b5 100644 --- a/editions/tw5.com/tiddlers/filters/lookup Operator.tid +++ b/editions/tw5.com/tiddlers/filters/lookup Operator.tid @@ -1,40 +1,24 @@ caption: lookup created: 20170907103639431 -modified: 20210116081305739 +modified: 20170907144703051 op-input: a [[selection of titles|Title Selection]] -op-output: the lookup values corresponding to each lookup tiddler -op-parameter: prefix applied to input titles to yield title of lookup tiddler from which value is retrieved. Now accepts 1 or 2 parameters, see below for details -op-parameter-name: P, T -op-purpose: applies a prefix to each input title to yield the title of a tiddler from which the final value is retrieved. With a single parameter, the default field is "text" and the default index is "0". If a second parameter is provided, that becomes the target field or index. -op-suffix: the default value to be used for missing lookups. This operator can now accept a second suffix, see below for details -op-suffix-name: D, I +op-output: the lookup values corresponding to each input title +op-parameter: prefix applied to input titles to yield title of lookup tiddler from which value is retrieved +op-parameter-name: P +op-purpose: applies a prefix to each input title to yield the title of a tiddler from which the final value is retrieved +op-suffix: the default value to be used for missing lookups +op-suffix-name: D tags: [[Filter Operators]] title: lookup Operator type: text/vnd.tiddlywiki <<.from-version "5.1.15">> -The action of this operator is as follows with 1 parameter: +The action of this operator is as follows: * Apply the specified prefix to each input tiddler title, yielding a new list of tiddler titles -* Transclude the value of the `text` field each of those tiddlers -** Substitute the default value for missing or empty values -* Return the list of values - -<<.from-version "5.1.24">> - -The action of this operator is as follows with 2 parameters: - -If there are two parameters provided, use the second parameter as the target field or index. - -<<.note """If there is only one parameter given, the filter checks for a second suffix equal to "index". If this suffix is found, the default target index is "0". -In all other cases, the default target field is "text".""">> - -Then: - -* Apply the specified prefix to each input tiddler title, yielding a new list of tiddler titles -* Transclude the value of the target field or index -** Substitute the default value for missing or empty values +* Transclude the value of each of those tiddlers +** Substitute the default value for missing or empty tiddlers * Return the list of values <<.operator-examples "lookup">> From 3a740b23bb80c12c802df4e352af67bd87248ea1 Mon Sep 17 00:00:00 2001 From: Simon Huber <huber.simon@protonmail.com> Date: Thu, 27 May 2021 15:07:50 +0200 Subject: [PATCH 1358/2376] Add tc-small-gap-right to tag-pills in tags editTemplate (#5727) --- core/ui/EditTemplate/tags.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/EditTemplate/tags.tid b/core/ui/EditTemplate/tags.tid index 0dd0dd774..f01bcb4ac 100644 --- a/core/ui/EditTemplate/tags.tid +++ b/core/ui/EditTemplate/tags.tid @@ -14,7 +14,7 @@ color:$(foregroundColor)$; \define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:"tags") \whitespace trim <$vars foregroundColor=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">> backgroundColor="""$colour$"""> -<span style=<<tag-styles>> class="tc-tag-label tc-tag-list-item"> +<span style=<<tag-styles>> class="tc-tag-label tc-tag-list-item tc-small-gap-right"> <$transclude tiddler="""$icon$"""/><$view field="title" format="text" /> <$button class="tc-btn-invisible tc-remove-tag-button" style=<<tag-styles>>><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="-[{!!title}]"/>{{$:/core/images/close-button}}</$button> </span> From 9b247f6d63051877781d909ecab5e2e373555acb Mon Sep 17 00:00:00 2001 From: Miha Lunar <mlunar@gmail.com> Date: Sat, 29 May 2021 20:30:04 +0200 Subject: [PATCH 1359/2376] Removed fallback range logic --- core/modules/parsers/wikiparser/wikiparser.js | 38 ++----------------- .../tiddlers/tests/test-wikitext-parser.js | 8 ++-- 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index 6416d14e1..90a3e7446 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -185,36 +185,6 @@ WikiParser.prototype.findNextMatch = function(rules,startPos) { return matchingRule; }; -WikiParser.prototype.parseRule = function(rule) { - var start = this.pos, - blocks = rule.parse(), - pending = []; - // Estimate start/end ranges for blocks that don't define their own based on - // sibling and parent ranges - for(var i=0; i<blocks.length; i++) { - var block = blocks[i]; - if(block.start === undefined) { - block.start = start; - } else { - this.applyRangeEnd(pending,block.start); - pending.length = 0; - } - if(block.end === undefined) { - pending.push(block); - } else { - start = block.end; - } - } - this.applyRangeEnd(pending,this.pos); - return blocks; -}; - -WikiParser.prototype.applyRangeEnd = function(blocks,end) { - for(var i=0; i<blocks.length; i++) { - blocks[i].end = end; - } -} - /* Parse any pragmas at the beginning of a block of parse text */ @@ -234,7 +204,7 @@ WikiParser.prototype.parsePragmas = function() { break; } // Process the pragma rule - var subTree = this.parseRule(nextMatch.rule); + var subTree = nextMatch.rule.parse(); if(subTree.length > 0) { // Quick hack; we only cope with a single parse tree node being returned, which is true at the moment currentTreeBranch.push.apply(currentTreeBranch,subTree); @@ -258,7 +228,7 @@ WikiParser.prototype.parseBlock = function(terminatorRegExpString) { // Look for a block rule that applies at the current position var nextMatch = this.findNextMatch(this.blockRules,this.pos); if(nextMatch && nextMatch.matchIndex === this.pos) { - return this.parseRule(nextMatch.rule); + return nextMatch.rule.parse(); } // Treat it as a paragraph if we didn't find a block rule var start = this.pos; @@ -344,7 +314,7 @@ WikiParser.prototype.parseInlineRunUnterminated = function(options) { this.pos = nextMatch.matchIndex; } // Process the run rule - tree.push.apply(tree,this.parseRule(nextMatch.rule)); + tree.push.apply(tree,nextMatch.rule.parse()); // Look for the next run rule nextMatch = this.findNextMatch(this.inlineRules,this.pos); } @@ -387,7 +357,7 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option this.pos = inlineRuleMatch.matchIndex; } // Process the inline rule - tree.push.apply(tree,this.parseRule(inlineRuleMatch.rule)); + tree.push.apply(tree,inlineRuleMatch.rule.parse()); // Look for the next inline rule inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos); // Look for the next terminator match diff --git a/editions/test/tiddlers/tests/test-wikitext-parser.js b/editions/test/tiddlers/tests/test-wikitext-parser.js index 041ca31c0..da4965c3a 100644 --- a/editions/test/tiddlers/tests/test-wikitext-parser.js +++ b/editions/test/tiddlers/tests/test-wikitext-parser.js @@ -95,7 +95,7 @@ describe("WikiText parser tests", function() { ); expect(parse("<div><div attribute={{TiddlerTitle!!field}}>\n\n!some heading</div></div>")).toEqual( - [ { type : 'element', tag : 'p', start: 0, end: 71, children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : true, children : [ { type : 'element', tag : 'h1', start : 46, end : 71, attributes : { class : { type : 'string', value : '' } }, children : [ { type : 'text', text : 'some heading</div></div>', start : 47, end : 71 } ] } ] } ] } ] } ] + [ { type : 'element', tag : 'p', start: 0, end: 71, children : [ { type : 'element', start : 0, attributes : { }, tag : 'div', end : 5, isBlock : false, children : [ { type : 'element', start : 5, attributes : { attribute : { start : 9, name : 'attribute', type : 'indirect', textReference : 'TiddlerTitle!!field', end : 43 } }, tag : 'div', end : 44, isBlock : true, children : [ { type : 'element', tag : 'h1', attributes : { class : { type : 'string', value : '' } }, children : [ { type : 'text', text : 'some heading</div></div>', start : 47, end : 71 } ] } ] } ] } ] } ] ); expect(parse("<div><div attribute={{TiddlerTitle!!field}}>\n!some heading</div></div>")).toEqual( @@ -114,7 +114,7 @@ describe("WikiText parser tests", function() { it("should parse macro definitions", function() { expect(parse("\\define myMacro()\nnothing\n\\end\n")).toEqual( - [ { type : 'set', start : 0, end : 30, attributes : { name : { type : 'string', value : 'myMacro' }, value : { type : 'string', value : 'nothing' } }, children : [ ], params : [ ], isMacroDefinition : true } ] + [ { type : 'set', attributes : { name : { type : 'string', value : 'myMacro' }, value : { type : 'string', value : 'nothing' } }, children : [ ], params : [ ], isMacroDefinition : true } ] ); @@ -226,7 +226,7 @@ describe("WikiText parser tests", function() { it("should parse horizontal rules", function() { expect(parse("---Not a rule\n\n----\n\nBetween\n\n---")).toEqual( - [ { type : 'element', tag : 'p', start : 0, end : 13, children : [ { type : 'entity', entity : '—', start : 0, end : 3 }, { type : 'text', text : 'Not a rule', start : 3, end : 13 } ] }, { type : 'element', tag : 'hr', start : 15, end : 20 }, { type : 'element', tag : 'p', start : 21, end : 28, children : [ { type : 'text', text : 'Between', start : 21, end : 28 } ] }, { type : 'element', tag : 'hr', start : 30, end : 33 } ] + [ { type : 'element', tag : 'p', start : 0, end : 13, children : [ { type : 'entity', entity : '—' }, { type : 'text', text : 'Not a rule', start : 3, end : 13 } ] }, { type : 'element', tag : 'hr' }, { type : 'element', tag : 'p', start : 21, end : 28, children : [ { type : 'text', text : 'Between', start : 21, end : 28 } ] }, { type : 'element', tag : 'hr' } ] ); @@ -235,7 +235,7 @@ describe("WikiText parser tests", function() { it("should parse hard linebreak areas", function() { expect(parse("\"\"\"Something\nin the\nway she moves\n\"\"\"\n\n")).toEqual( - [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'Something', start : 3, end : 12 }, { type : 'element', tag : 'br', start : 12, end : 13 }, { type : 'text', text : 'in the', start : 13, end : 19 }, { type : 'element', tag : 'br', start : 19, end : 20 }, { type : 'text', text : 'way she moves', start : 20, end : 33 }, { type : 'element', tag : 'br', start: 33, end: 37 } ], start : 0, end : 37 } ] + [ { type : 'element', tag : 'p', children : [ { type : 'text', text : 'Something', start : 3, end : 12 }, { type : 'element', tag : 'br' }, { type : 'text', text : 'in the', start : 13, end : 19 }, { type : 'element', tag : 'br' }, { type : 'text', text : 'way she moves', start : 20, end : 33 }, { type : 'element', tag : 'br' } ], start : 0, end : 37 } ] ); From 8b8f654c9c641cb53092e641c0fdd3a3788d3060 Mon Sep 17 00:00:00 2001 From: Joe Bordes <joe@tsolucio.com> Date: Sun, 30 May 2021 19:47:34 +0200 Subject: [PATCH 1360/2376] Signing the CLA (#5730) --- licenses/cla-individual.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index caf3df96a..e2b436769 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -451,3 +451,6 @@ Quentin Minster, @laomaiweng, 2021/03/10 Cindy Ruan, @cdruan, 2021/03/18 Urban Alič, @ualich, 2021/05/06 + +Joe Bordes, @joebordes, 2021/05/30 + From e694145eeca56abf9817e17ec2080048189d759b Mon Sep 17 00:00:00 2001 From: Joe Bordes <joe@tsolucio.com> Date: Sun, 30 May 2021 19:49:03 +0200 Subject: [PATCH 1361/2376] i18n(es-ES) update to version 5.1.23 (#5731) --- languages/es-ES/Buttons.multids | 35 ++++- languages/es-ES/ControlPanel.multids | 134 +++++++++++++----- languages/es-ES/Dates.multids | 12 +- languages/es-ES/Docs/ModuleTypes.multids | 8 ++ languages/es-ES/Docs/PaletteColours.multids | 109 ++++++++++++++ languages/es-ES/EditTemplate.multids | 29 ++-- languages/es-ES/Exporters.multids | 4 +- languages/es-ES/Fields.multids | 11 +- languages/es-ES/Filters.multids | 18 +-- languages/es-ES/GettingStarted.tid | 1 + languages/es-ES/Help/deletetiddlers.tid | 8 ++ languages/es-ES/Help/fetch.tid | 38 +++++ languages/es-ES/Help/import.tid | 24 ++++ languages/es-ES/Help/init.tid | 8 +- languages/es-ES/Help/listen.tid | 35 +++++ languages/es-ES/Help/load.tid | 7 +- languages/es-ES/Help/makelibrary.tid | 4 +- languages/es-ES/Help/password.tid | 3 +- languages/es-ES/Help/render.tid | 35 +++++ languages/es-ES/Help/rendertiddler.tid | 17 ++- languages/es-ES/Help/rendertiddlers.tid | 12 +- languages/es-ES/Help/save.tid | 25 ++++ languages/es-ES/Help/savetiddler.tid | 5 +- languages/es-ES/Help/savetiddlers.tid | 9 +- languages/es-ES/Help/savewikifolder.tid | 19 +++ languages/es-ES/Help/server.tid | 20 +-- languages/es-ES/Import.multids | 26 +++- languages/es-ES/Misc.multids | 93 +++++++++--- languages/es-ES/NewJournalTags.tid | 3 + languages/es-ES/Notifications.multids | 4 +- languages/es-ES/Search.multids | 1 + languages/es-ES/SideBar.multids | 1 + languages/es-ES/ThemeTweaks.multids | 42 ++++++ languages/es-ES/TiddlerInfo.multids | 4 +- ...ascript.tid => application_javascript.tid} | 1 + ...cation%2Fjson.tid => application_json.tid} | 1 + ...d => application_x_tiddler_dictionary.tid} | 1 + .../Types/{image%2Fgif.tid => image_gif.tid} | 1 + .../{image%2Fjpeg.tid => image_jpeg.tid} | 1 + .../Types/{image%2Fpng.tid => image_png.tid} | 1 + ...mage%2Fsvg%2Bxml.tid => image_svg_xml.tid} | 1 + .../{image%2Fx-icon.tid => image_x-icon.tid} | 1 + .../Types/{text%2Fcss.tid => text_css.tid} | 1 + .../Types/{text%2Fhtml.tid => text_html.tid} | 1 + .../{text%2Fplain.tid => text_plain.tid} | 1 + ...tiddlywiki.tid => text_vnd.tiddlywiki.tid} | 1 + ...x-tiddlywiki.tid => text_x-tiddlywiki.tid} | 1 + languages/es-ES/plugin.info | 6 +- 48 files changed, 686 insertions(+), 137 deletions(-) create mode 100644 languages/es-ES/Docs/PaletteColours.multids create mode 100644 languages/es-ES/Help/deletetiddlers.tid create mode 100644 languages/es-ES/Help/fetch.tid create mode 100644 languages/es-ES/Help/import.tid create mode 100644 languages/es-ES/Help/listen.tid create mode 100644 languages/es-ES/Help/render.tid create mode 100644 languages/es-ES/Help/save.tid create mode 100644 languages/es-ES/Help/savewikifolder.tid create mode 100644 languages/es-ES/NewJournalTags.tid create mode 100644 languages/es-ES/ThemeTweaks.multids rename languages/es-ES/Types/{application%2Fjavascript.tid => application_javascript.tid} (90%) rename languages/es-ES/Types/{application%2Fjson.tid => application_json.tid} (89%) rename languages/es-ES/Types/{application%2Fx-tiddler-dictionary.tid => application_x_tiddler_dictionary.tid} (91%) rename languages/es-ES/Types/{image%2Fgif.tid => image_gif.tid} (87%) rename languages/es-ES/Types/{image%2Fjpeg.tid => image_jpeg.tid} (87%) rename languages/es-ES/Types/{image%2Fpng.tid => image_png.tid} (87%) rename languages/es-ES/Types/{image%2Fsvg%2Bxml.tid => image_svg_xml.tid} (88%) rename languages/es-ES/Types/{image%2Fx-icon.tid => image_x-icon.tid} (89%) rename languages/es-ES/Types/{text%2Fcss.tid => text_css.tid} (89%) rename languages/es-ES/Types/{text%2Fhtml.tid => text_html.tid} (88%) rename languages/es-ES/Types/{text%2Fplain.tid => text_plain.tid} (87%) rename languages/es-ES/Types/{text%2Fvnd.tiddlywiki.tid => text_vnd.tiddlywiki.tid} (89%) rename languages/es-ES/Types/{text%2Fx-tiddlywiki.tid => text_x-tiddlywiki.tid} (89%) diff --git a/languages/es-ES/Buttons.multids b/languages/es-ES/Buttons.multids index 326119583..56271cd72 100644 --- a/languages/es-ES/Buttons.multids +++ b/languages/es-ES/Buttons.multids @@ -6,8 +6,8 @@ Bold/Caption: Negrita Bold/Hint: Aplicar formato de negrita a la selección Cancel/Caption: Cancelar Cancel/Hint: Descarta los cambios -Clear/Caption: *clear -Clear/Hint: *Clear image to solid colour +Clear/Caption: Limpiar +Clear/Hint: Limpiar imagen a color solido Clone/Caption: Clonar Clone/Hint: Hace una copia exacta de este tiddler Close/Caption: Cerrar @@ -18,6 +18,8 @@ CloseOthers/Caption: Cerrar los demás CloseOthers/Hint: Cierra todos tiddlers abiertos excepto este ControlPanel/Caption: Panel de Control ControlPanel/Hint: Abre el Panel de Control +CopyToClipboard/Caption: copiar a portapapeles +CopyToClipboard/Hint: Copia este texto al portapapeles Delete/Caption: Borrar Delete/Hint: Borra este tiddler Edit/Caption: Editar @@ -38,6 +40,7 @@ Excise/Caption/MacroName: Nombre de la macro Excise/Caption/NewTitle: Título del nuevo tiddler Excise/Caption/Replace: Reemplazar texto escindido con: Excise/Caption/Replace/Link: enlace +Excise/Caption/Replace/Macro: macro Excise/Caption/Replace/Transclusion: transclusión Excise/Caption/Tag: Etiqueta el nuevo tiddler con el título de este Excise/Caption/TiddlerExists: ¡Atención! El tiddler ya existe @@ -86,10 +89,16 @@ Language/Caption: Idioma Language/Hint: Selecciona idioma de la interfaz de usuario LineWidth/Caption: Ancho del trazo LineWidth/Hint: Establece el ancho del trazo para pintar +Link/Caption: Enlace +Link/Hint: Crea enlace wikitext +Linkify/Caption: wikilink +Linkify/Hint: Envuelva la selección entre corchetes ListBullet/Caption: Lista con viñetas ListBullet/Hint: Aplica formato de lista con viñetas a la selección ListNumber/Caption: Lista numerada ListNumber/Hint: Aplica formato de lista numerada a la selección +Manager/Caption: Administrador tiddler +Manager/Hint: Abre el administrador del tiddler MonoBlock/Caption: Bloque monoespaciado MonoBlock/Hint: Aplica formato de bloque monoespaciado a la selección MonoLine/Caption: Monoespacio @@ -108,15 +117,15 @@ NewMarkdown/Caption: Nuevo tiddler en Markdown NewMarkdown/Hint: Crea un nuevo tiddler en Markdown NewTiddler/Caption: Nuevo tiddler NewTiddler/Hint: Crea un tiddler nuevo -OpenWindow/Caption: Abrir en ventana nueva -OpenWindow/Hint: Abre el tiddler en una nueva ventana Opacity/Caption: Opacidad Opacity/Hint: Establece la opacidad del trazo +OpenWindow/Caption: Abrir en ventana nueva +OpenWindow/Hint: Abre el tiddler en una nueva ventana Paint/Caption: Color del trazo Paint/Hint: Establece el color del trazo Palette/Caption: Paleta Palette/Hint: Selecciona la paleta de color -Permalink/Caption: Permalink +Permalink/Caption: Enlace permanente Permalink/Hint: Crea en la barra de direcciones del navegador un enlace directo a este tiddler Permaview/Caption: Permaview Permaview/Hint: Crea en la barra de direcciones del navegador un enlace directo a todos los tiddlers abiertos @@ -126,16 +135,21 @@ Preview/Caption: Vista previa Preview/Hint: Muestra el panel de vista previa PreviewType/Caption: Tipo de vista previa PreviewType/Hint: Selecciona el tipo de vista previa +Print/Caption: Imprimir página +Print/Hint: Imprime la página actual Quote/Caption: Bloque de cita Quote/Hint: Aplica formato de bloque de cita a la selección Refresh/Caption: Recargar Refresh/Hint: Actualiza completamente este wiki -Save/Caption: Ok +RotateLeft/Caption: girar a la izquierda +RotateLeft/Hint: Girar la imagen a la izquierda 90 grados +Save/Caption: Vale Save/Hint: Confirma y guarda los cambios realizados en el tiddler SaveWiki/Caption: Guardar cambios SaveWiki/Hint: Confirma y guarda todos los cambios realizados en el wiki ShowSideBar/Caption: Mostrar barra lateral ShowSideBar/Hint: Muestra la barra lateral +SidebarSearch/Hint: Selecciona el campo de búsqueda de la barra lateral Size/Caption: Tamaño de imagen Size/Caption/Height: Altura: Size/Caption/Resize: Cambiar tamaño @@ -158,6 +172,15 @@ TagManager/Caption: Administrador de etiquetas TagManager/Hint: Abre el gestor de etiquetas Theme/Caption: Tema Theme/Hint: Selecciona un estilo visual para el wiki +Timestamp/Caption: Marcas de tiempo +Timestamp/Hint: Elige si las modificaciones actualizan las marcas de tiempo +Timestamp/Off/Caption: las marcas de tiempo están desactivadas +Timestamp/Off/Hint: No actualizar las marcas de tiempo cuando se modifican los tiddlers +Timestamp/On/Caption: las marcas de tiempo están activadas +Timestamp/On/Hint: Actualizar las marcas de tiempo cuando se modifican los tiddlers +ToggleSidebar/Hint: Alternar la visibilidad de la barra lateral +Transcludify/Caption: Transclusión +Transcludify/Hint: Envolver la selección entre llaves Underline/Caption: Subrayado Underline/Hint: Aplica formato de subrayado a la selección Unfold/Caption: Desplegar tiddler diff --git a/languages/es-ES/ControlPanel.multids b/languages/es-ES/ControlPanel.multids index bf6af73ff..5c02edfa2 100644 --- a/languages/es-ES/ControlPanel.multids +++ b/languages/es-ES/ControlPanel.multids @@ -5,14 +5,20 @@ Advanced/Hint: Información interna de TiddlyWiki Appearance/Caption: Aspecto Appearance/Hint: Personaliza la apariencia de TiddlyWiki Basics/AnimDuration/Prompt: Duración de la animación +Basics/AutoFocus/Prompt: Campo de enfoque predeterminado para nuevos tiddlers Basics/Caption: Básico Basics/DefaultTiddlers/BottomHint: Usa [[corchetes dobles]] para títulos con espacios. También puedes mostrarlos ordenados <$button set="$:/DefaultTiddlers" setTo="[list[$:/StoryList]]">de más reciente a más antiguo</$button> Basics/DefaultTiddlers/Prompt: Tiddlers por defecto Basics/DefaultTiddlers/TopHint: Escoge qué tiddlers se muestran al inicio Basics/Language/Prompt: ¡Hola! Selecciona idioma actual Basics/NewJournal/Tags/Prompt: Etiqueta para las nuevas entradas de diario +Basics/NewJournal/Text/Prompt: Texto para las nuevas entradas de diario Basics/NewJournal/Title/Prompt: Formato de título para las nuevas entradas de diario +Basics/NewTiddler/Title/Prompt: Título de nuevos tiddlers +Basics/NewTiddler/Tags/Prompt: Etiquetas de nuevos tiddlers Basics/OverriddenShadowTiddlers/Prompt: Número de tiddlers ocultos anulados +Basics/RemoveTags: Actualizar al formato actual +Basics/RemoveTags/Hint: Actualizar la configuración de las etiquetas al formato más reciente Basics/ShadowTiddlers/Prompt: Número de tiddlers ocultos Basics/Subtitle/Prompt: Subtítulo Basics/SystemTiddlers/Prompt: Número de tiddlers de sistema @@ -32,6 +38,7 @@ KeyboardShortcuts/Add/Prompt: Escribe el atajo KeyboardShortcuts/Caption: Atajos de teclado KeyboardShortcuts/Hint: Administra la asignación de atajos de teclado KeyboardShortcuts/NoShortcuts/Caption: No hay atajo asignado +KeyboardShortcuts/Remove/Hint: Eliminar atajo KeyboardShortcuts/Platform/All: Cualquier plataforma KeyboardShortcuts/Platform/Linux: Sólo Linux KeyboardShortcuts/Platform/Mac: Sólo Macintosh @@ -39,56 +46,89 @@ KeyboardShortcuts/Platform/NonLinux: Todas menos Linux KeyboardShortcuts/Platform/NonMac: Todas menos Macintosh KeyboardShortcuts/Platform/NonWindows: Todas menos Windows KeyboardShortcuts/Platform/Windows: Sólo windows -KeyboardShortcuts/Remove/Hint: Eliminar atajo +LayoutSwitcher/Caption: Disposición LoadedModules/Caption: Módulos cargados LoadedModules/Hint: Modulos cargados en este momento, enlazados con sus tiddlers de origen. Los módulos en itálica carecen de origen, debido normalmente a que se configuraron durante el inicio. Palette/Caption: Paleta Palette/Editor/Clone/Caption: Clonar Palette/Editor/Clone/Prompt: Se recomienda clonar esta paleta antes de editarla. +Palette/Editor/Delete/Hint: eliminar esta entrada de la paleta actual +Palette/Editor/Names/External/Show: Mostrar nombres de colores que no forman parte de la paleta actual +Palette/Editor/Prompt/Modified: Esta paleta de sombras ha sido modificada Palette/Editor/Prompt: Editando -Palette/Editor/Prompt/Modified: Si te has perdido, no desesperes Palette/Editor/Reset/Caption: Restaura la paleta Palette/HideEditor/Caption: Cerrar el editor Palette/Prompt: Paleta actual Palette/ShowEditor/Caption: Abrir el editor -Parsing/Block/Caption: Bloquear reglas sintácticas Parsing/Caption: Interpretación sintáctica -Parsing/Hint: Aquí se pueden deshabilitar globalmente reglas de interpretación sintáctica del wiki. Ten cuidado: deshabilitar ciertas reglas puede hacer que ~TiddlyWiki deje de funcionar correctamente. -En tal caso, puedes recuperar su normal funcionamiento en [[modo seguro|https://tiddlywiki.com/#SafeMode]]. +Parsing/Hint: Aquí se pueden deshabilitar globalmente reglas de interpretación sintáctica del wiki. Ten cuidado: deshabilitar ciertas reglas puede hacer que ~TiddlyWiki deje de funcionar correctamente. En tal caso, puedes recuperar su normal funcionamiento en [[modo seguro|https://tiddlywiki.com/#SafeMode]]. +Parsing/Block/Caption: Bloquear reglas sintácticas Parsing/Inline/Caption: Reglas sintácticas de texto Parsing/Pragma/Caption: Reglas sintácticas del compilador Plugins/Add/Caption: Obten complementos y extensiones Plugins/Add/Hint: Instala plugins desde la librería oficial -Plugins/Caption: Plugins +Plugins/AlreadyInstalled/Hint: Este complemento ya está instalado en la versión <$text text=<<installedVersion>>/> +Plugins/AlsoRequires: También requiere: +Plugins/Caption: Complementos Plugins/Disable/Caption: Desactivar Plugins/Disable/Hint: Desactiva el plugin al actualizar la página Plugins/Disabled/Status: (Desactivado) +Plugins/Downgrade/Caption: bajar de versión Plugins/Empty/Hint: No se han instalado Plugins/Enable/Caption: Activar Plugins/Enable/Hint: Activa este plugin al actualizar la página Plugins/Install/Caption: Instalar -Plugins/Installed/Hint: Plugins instalados actualmente -Plugins/Language/Prompt: Idiomas +Plugins/Installed/Hint: Complementos instalados actualmente Plugins/Languages/Caption: Idiomas Plugins/Languages/Hint: Extensiones de idioma +Plugins/NoInfoFound/Hint: No se ha encontrado ''"<$text text=<<currentTab>>/>"'' +Plugins/NotInstalled/Hint: Este complemento no está instalado actualmente Plugins/OpenPluginLibrary: Abrir biblioteca de complementos y extensiones -Plugins/Plugin/Prompt: Plugins -Plugins/Plugins/Caption: Plugins +Plugins/ClosePluginLibrary: cerrar biblioteca de complementos y extensiones +Plugins/PluginWillRequireReload: (requiere recarga) +Plugins/Plugins/Caption: Complementos Plugins/Plugins/Hint: Complementos y extensiones Plugins/Reinstall/Caption: Reinstalar -Plugins/Theme/Prompt: Temas Plugins/Themes/Caption: Temas Plugins/Themes/Hint: Extensiones de tema -Saving/Caption: Servidor -Saving/Heading: Servidor +Plugins/Update/Caption: actualizar +Plugins/Updates/Caption: Actualizaciones +Plugins/Updates/Hint: Actualizaciones disponibles para complementos instalados +Plugins/Updates/UpdateAll/Caption: Actualizar <<update-count>> complementos +Plugins/SubPluginPrompt: Con <<count>> sub-complementos disponibles +Saving/Caption: Guardando +Saving/DownloadSaver/AutoSave/Description: Permitir guardado automático para el almacenamiento de descargas +Saving/DownloadSaver/AutoSave/Hint: Habilitar guardado automático para el almacenamiento de descargas +Saving/DownloadSaver/Caption: Almacenamiento de descargas +Saving/DownloadSaver/Hint: Esta configuración se aplica al almacenamiento de descarga compatible con HTML5 +Saving/General/Caption: General +Saving/General/Hint: Esta configuración se aplica a todos los sistemas de almacenamiento cargados +Saving/Hint: Configuración utilizada para guardar todo el TiddlyWiki como un solo archivo a través de un módulo de almacenamiento +Saving/GitService/Branch: Rama de destino para guardar +Saving/GitService/CommitMessage: Guardado por TiddlyWiki +Saving/GitService/Description: Esta configuración solo se usa cuando se guarda en <<service-name>> +Saving/GitService/Filename: Nombre del archivo de destino (e.g. `index.html`) +Saving/GitService/Path: Directorio del archivo de destino (e.g. `/wiki/`) +Saving/GitService/Repo: Repositorio de destino (e.g. `Jermolene/TiddlyWiki5`) +Saving/GitService/ServerURL: URL de la API del servidor +Saving/GitService/UserName: Nombre de usuario +Saving/GitService/GitHub/Caption: ~GitHub Saver +Saving/GitService/GitHub/Password: Contraseña, token OAUTH o token de acceso personal (consulta [[Página de ayuda de GitHub|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] para más detalles) +Saving/GitService/GitLab/Caption: ~GitLab Saver +Saving/GitService/GitLab/Password: Token de acceso personal para API (consulta [[página de ayuda de GitLab|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] para más detalles) +Saving/GitService/Gitea/Caption: Gitea Saver +Saving/GitService/Gitea/Password: Token de acceso personal para API (a través de la interfaz web de Gitea: `Configuración | Aplicaciones | Generar token nuevo`) Saving/TiddlySpot/Advanced/Heading: Configuración Avanzada Saving/TiddlySpot/BackupDir: Directorio de copias de seguridad +Saving/TiddlySpot/ControlPanel: ~TiddlySpot Control Panel Saving/TiddlySpot/Backups: Copias de seguridad +Saving/TiddlySpot/Caption: ~TiddlySpot Saver Saving/TiddlySpot/Description: Esta configuración sólo se usa para guardar el wiki en http://tiddlyspot.com o en otro servidor compatible Saving/TiddlySpot/Filename: Nombre del archivo Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //La dirección (URL) por defecto de// TiddlySpot //es `http://<wikiname>.tiddlyspot.com/store.cgi` aunque puede cambiarse a voluntad para usar otro servidor// Saving/TiddlySpot/Password: Contraseña +Saving/TiddlySpot/ReadOnly: Ten en cuenta que [[TiddlySpot|http://tiddlyspot.com]] ya no permite la creación de nuevos sitios. Para sitios nuevos, puede usa [[TiddlyHost|https://tiddlyhost.com]], un nuevo servicio de alojamiento que reemplaza a ~TiddlySpot. Saving/TiddlySpot/ServerURL: Dirección (URL) del servidor Saving/TiddlySpot/UploadDir: Directorio de almacenamiento Saving/TiddlySpot/UserName: Nombre del Wiki @@ -97,20 +137,17 @@ Settings/AutoSave/Disabled/Description: No guardar cambios automáticamente Settings/AutoSave/Enabled/Description: Guardar cambios automáticamente Settings/AutoSave/Hint: Guarda automáticamente los cambios durante la edición Settings/CamelCase/Caption: Enlaces wiki mediante ~CamelCase +Settings/CamelCase/Hint: Desactiva globalmente la opción de enlace automático mediante CamelCase <br> Requiere recargar la página para que surta efecto Settings/CamelCase/Description: Activar enlaces automáticos mediante ~CamelCase -Settings/CamelCase/Hint: Desactiva globalmente la opción de enlace automático mediante CamelCase <br> -Requiere recargar la página para que surta efecto Settings/Caption: Configuración -Settings/DefaultSidebarTab/Caption: Pestaña por defecto de la barra lateral -Settings/DefaultSidebarTab/Hint: Indica qué pestaña de la barra lateral se muestra por defecto al inicio +Settings/EditorToolbar/Caption: Barra de herramientas del editor +Settings/EditorToolbar/Hint: Activa o desactiva la barra de herramientas del editor: +Settings/EditorToolbar/Description: Mostrar la barra de herramientas del editor +Settings/InfoPanelMode/Caption: Modo de panel de información de Tiddler +Settings/InfoPanelMode/Hint: Controla cuándo se cierra el panel de información de tiddler: +Settings/InfoPanelMode/Popup/Description: El panel de información de Tiddler se cierra automáticamente +Settings/InfoPanelMode/Sticky/Description: El panel de información de Tiddler permanece abierto hasta que se cierra explícitamente Settings/Hint: La configuración de estos ajustes te permite personalizar el comportamiento de TiddlyWiki. -Settings/LinkToBehaviour/Caption: Comportamiento al abrir tiddlers... -Settings/LinkToBehaviour/InsideRiver/Hint: ...dentro del StoryRiver -Settings/LinkToBehaviour/OpenAbove: Abrirlo por encima del tiddler actual -Settings/LinkToBehaviour/OpenAtBottom: Abrirlo al final del StoryRiver -Settings/LinkToBehaviour/OpenAtTop: Abrirlo al principio del StoryRiver -Settings/LinkToBehaviour/OpenBelow: Abrirlo por debajo del tiddler actual -Settings/LinkToBehaviour/OutsideRiver/Hint: ...desde fuera del StoryRiver Settings/NavigationAddressBar/Caption: Barra de direcciones Settings/NavigationAddressBar/Hint: Comportamiento de la barra de dirección del navegador cuando se abre un tiddler Settings/NavigationAddressBar/No/Description: No actualizar la barra de dirección @@ -120,25 +157,46 @@ Settings/NavigationHistory/Caption: Historial de navegación Settings/NavigationHistory/Hint: Actualiza el historial de navegación al abrir un tiddler Settings/NavigationHistory/No/Description: No actualizar el historial Settings/NavigationHistory/Yes/Description: Actualizar el historial -Settings/PerformanceInstrumentation/Caption: //Performance Instrumentation// -Settings/PerformanceInstrumentation/Description: Activar //performance instrumentation// -Settings/PerformanceInstrumentation/Hint: Muestra estadísticas de las prestaciones de la página en la consola de desarrollo <br> -Requiere recargar la página para que surta efecto -Settings/TitleLinks/Caption: Títulos de tiddler -Settings/TitleLinks/Hint: Los títulos de los tiddlers se mostrarán y se comportarán como enlaces -Settings/TitleLinks/No/Description: No mostrar como enlaces -Settings/TitleLinks/Yes/Description: Mostrar como enlaces -Settings/ToolbarButtons/Caption: Botones de la barra de herramientas -Settings/ToolbarButtons/Hint: Aspecto por defecto de los botones de la barra de herramientas -Settings/ToolbarButtons/Icons/Description: Mostrar icono -Settings/ToolbarButtons/Text/Description: Mostrar texto +Settings/NavigationPermalinkviewMode/Caption: Modo Permalink/permaview +Settings/NavigationPermalinkviewMode/Hint: Elige cómo se comporta permalink/permaview: +Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Copiar permalink/permaview en el portapapeles +Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Actualizar la barra de direcciones con permalink/permaview +Settings/PerformanceInstrumentation/Caption: //Estadísticas de rendimiento// +Settings/PerformanceInstrumentation/Hint: Muestra estadísticas de las prestaciones de la página en la consola de desarrollo <br>Requiere recargar la página para que surta efecto +Settings/PerformanceInstrumentation/Description: Activar //estadísticas de rendimiento// Settings/ToolbarButtonStyle/Caption: Estilo de botón Settings/ToolbarButtonStyle/Hint: Selecciona el estilo de los botones de la barra de herramientas Settings/ToolbarButtonStyle/Styles/Borderless: Sin borde Settings/ToolbarButtonStyle/Styles/Boxed: Cuadrado Settings/ToolbarButtonStyle/Styles/Rounded: Redondo +Settings/ToolbarButtons/Caption: Botones de la barra de herramientas +Settings/ToolbarButtons/Hint: Aspecto por defecto de los botones de la barra de herramientas +Settings/ToolbarButtons/Icons/Description: Mostrar icono +Settings/ToolbarButtons/Text/Description: Mostrar texto +Settings/DefaultSidebarTab/Caption: Pestaña por defecto de la barra lateral +Settings/DefaultSidebarTab/Hint: Indica qué pestaña de la barra lateral se muestra por defecto al inicio +Settings/DefaultMoreSidebarTab/Caption: Pestaña predeterminada Más de la barra lateral +Settings/DefaultMoreSidebarTab/Hint: Especifica qué pestaña de la barra lateral Más se muestra de forma predeterminada +Settings/LinkToBehaviour/Caption: Comportamiento al abrir tiddlers... +Settings/LinkToBehaviour/InsideRiver/Hint: ...dentro del Visor +Settings/LinkToBehaviour/OutsideRiver/Hint: ...desde fuera del Visor +Settings/LinkToBehaviour/OpenAbove: Abrirlo por encima del tiddler actual +Settings/LinkToBehaviour/OpenBelow: Abrirlo por debajo del tiddler actual +Settings/LinkToBehaviour/OpenAtTop: Abrirlo al principio del Visor +Settings/LinkToBehaviour/OpenAtBottom: Abrirlo al final del Visor +Settings/TitleLinks/Caption: Títulos de tiddler +Settings/TitleLinks/Hint: Los títulos de los tiddlers se mostrarán y se comportarán como enlaces +Settings/TitleLinks/No/Description: No mostrar como enlaces +Settings/TitleLinks/Yes/Description: Mostrar como enlaces +Settings/MissingLinks/Caption: Enlaces Wiki +Settings/MissingLinks/Hint: Elige si quieres vincular a tiddlers que aún no existen +Settings/MissingLinks/Description: Habilitar enlaces a tiddlers inexistentes StoryView/Caption: Vista StoryView/Prompt: Vista actual +Stylesheets/Caption: Hojas de estilo +Stylesheets/Expand/Caption: Expandir todo +Stylesheets/Hint: Este es el CSS renderizado de los tiddlers CSS etiquetados con <<tag "$:/tags/Stylesheet">> +Stylesheets/Restore/Caption: Restaurar Theme/Caption: Tema Theme/Prompt: Tema actual TiddlerFields/Caption: Campos de tiddler @@ -149,6 +207,8 @@ Toolbars/EditToolbar/Hint: Selecciona qué botones mostrar en modo de edición Toolbars/Hint: Selecciona qué botones mostrar en las diferentes barras de herramientas Toolbars/PageControls/Caption: Barra de página Toolbars/PageControls/Hint: Selecciona qué botones mostrar en la barra de página +Toolbars/EditorToolbar/Caption: Barra de herramientas del editor +Toolbars/EditorToolbar/Hint: Elige qué botones se muestran en la barra de herramientas del editor. Ten en cuenta que algunos botones solo aparecerán al editar tiddlers de cierto tipo. Arrastra y suelta para cambiar el orden Toolbars/ViewToolbar/Caption: Barra de visualización Toolbars/ViewToolbar/Hint: Selecciona qué botones mostrar en modo de visualización -Tools/Download/Full/Caption: Descargar el wiki completo \ No newline at end of file +Tools/Download/Full/Caption: Descargar el wiki completo diff --git a/languages/es-ES/Dates.multids b/languages/es-ES/Dates.multids index 4fde1066c..0fd0a2de5 100644 --- a/languages/es-ES/Dates.multids +++ b/languages/es-ES/Dates.multids @@ -50,6 +50,8 @@ Date/Long/Month/6: junio Date/Long/Month/7: julio Date/Long/Month/8: agosto Date/Long/Month/9: septiembre +Date/Period/am: am +Date/Period/pm: pm Date/Short/Day/0: Do Date/Short/Day/1: Lu Date/Short/Day/2: Ma @@ -58,9 +60,17 @@ Date/Short/Day/4: Ju Date/Short/Day/5: Vi Date/Short/Day/6: Sá Date/Short/Month/1: Ene -Date/Short/Month/12: Dic +Date/Short/Month/2: Feb +Date/Short/Month/3: Mar Date/Short/Month/4: Abr +Date/Short/Month/5: May +Date/Short/Month/6: Jun +Date/Short/Month/7: Jul Date/Short/Month/8: Ago +Date/Short/Month/9: Sep +Date/Short/Month/10: Oct +Date/Short/Month/11: Nov +Date/Short/Month/12: Dic RelativeDate/Future/Days: dentro de <<period>> días RelativeDate/Future/Hours: en <<period>> horas RelativeDate/Future/Minutes: en <<period>> minutos diff --git a/languages/es-ES/Docs/ModuleTypes.multids b/languages/es-ES/Docs/ModuleTypes.multids index fd15563ad..3c165dbc9 100644 --- a/languages/es-ES/Docs/ModuleTypes.multids +++ b/languages/es-ES/Docs/ModuleTypes.multids @@ -1,21 +1,29 @@ title: $:/language/Docs/ModuleTypes/ +allfilteroperator: Un suboperador para el operador de filtro ''all''. animation: Animaciones que pueden usarse con RevealWidget +authenticator: Define cómo el servidor HTTP integrado autentifica las solicitudes. +bitmapeditoroperation: Operación de la barra de herramientas para editar mapa de bits. command: Comandos que pueden ejecutarse en Node.js config: Datos para insertar en `$tw.config` filteroperator: Operadores individuales de filtrado global: Datos globales para insertar en `$tw` +info: Publica información del sistema a través del pseudo-complemento [[$:/temp/info-plugin]]. isfilteroperator: Operandos para el operador ''is'' +library: Tipo de módulo genérico para módulos JavaScript de propósito general. macro: Definiciones macro de JavaScript. parser: Reglas sintácticas para diversos tipos de contenido. +route: Define cómo el servidor HTTP integrado gestiona los patrones de URL individuales. saver: Guarda archivos desde el navegador con diferentes métodos. startup: Funciones de inicio storyview: Personaliza la animación y comportamiento de listas +texteditoroperation: Operación de la barra de herramientas para editar texto. tiddlerdeserializer: Convierte diferentes tipos de contenido en tiddlers tiddlerfield: Define el comportamiento de un campo individual tiddlermethod: Añade métodos al prototipo `$tw.Tiddler` upgrader: Aplica la actualización a los tiddlers durante el proceso de actualización/importación. utils: Añade métodos a `$tw.utils` +utils-browser: Añade métodos específicos del navegador a `$tw.utils`. utils-node: Añade métodos específicos de Node.js a `$tw.utils` widget: Encapsula la representación y recarga de ''DOM'' wikimethod: Añade métodos a `$tw.Wiki` diff --git a/languages/es-ES/Docs/PaletteColours.multids b/languages/es-ES/Docs/PaletteColours.multids new file mode 100644 index 000000000..36f78d71e --- /dev/null +++ b/languages/es-ES/Docs/PaletteColours.multids @@ -0,0 +1,109 @@ +title: $:/language/Docs/PaletteColours/ + +alert-background: Fondo de alerta +alert-border: Borde de alerta +alert-highlight: Resaltado de alerta +alert-muted-foreground: Primario de alerta muda +background: Fondo general +blockquote-bar: Barra de cita +button-background: Fondo del botón predeterminado +button-border: Borde del botón predeterminado +button-foreground: Primario del botón predeterminado +dirty-indicator: Indicador de cambios no guardados +code-background: Fondo del código +code-border: Borde del código +code-foreground: Primario del código +download-background: Fondo botón de descarga +download-foreground: Primario botón de descarga +dragger-background: Fondo de arrastre +dragger-foreground: Primario de arrastre +dropdown-background: Fondo desplegable +dropdown-border: Borde desplegable +dropdown-tab-background-selected: Fondo de la pestaña desplegable de pestañas seleccionadas +dropdown-tab-background: Fondo de la pestaña desplegable +dropzone-background: Fondo arrastre ficheros +external-link-background-hover: Fondo de enlace externo al pasar por encima +external-link-background-visited: Fondo de enlace externo visitado +external-link-background: Fondo de enlace externo +external-link-foreground-hover: Primario de enlace externo al pasar por encima +external-link-foreground-visited: Primario de enlace externo visitado +external-link-foreground: Primario de enlace externo +foreground: Primario general +menubar-background: Fondo de la barra de menú +menubar-foreground: Primario de la barra de menú +message-background: Fondo del cuadro de mensaje +message-border: Borde del cuadro de mensaje +message-foreground: Primario del cuadro de mensaje +modal-backdrop: Telón de fondo modal +modal-background: Fondo Modal +modal-border: Borde Modal +modal-footer-background: Fondo del pie en Modal +modal-footer-border: Borde del pie en Modal +modal-header-border: Borde de la cabecera en Modal +muted-foreground: Primario general silenciado +notification-background: Fondo Notificación +notification-border: Borde Notificación +page-background: Fondo Página +pre-background: Preformatted code background +pre-border: Preformatted code border +primary: Primario general +select-tag-background: Fondo `<select>` +select-tag-foreground: Primario `<select>` +sidebar-button-foreground: Primario del botón de la barra lateral +sidebar-controls-foreground-hover: Primario de controles de la barra lateral al pasar por encima +sidebar-controls-foreground: Primario de controles de la barra lateral +sidebar-foreground-shadow: Sombra de la barra lateral +sidebar-foreground: Primario de la barra lateral +sidebar-muted-foreground-hover: Primario de controles silenciados de la barra lateral al pasar por encima +sidebar-muted-foreground: Primario de controles silenciados de la barra lateral +sidebar-tab-background-selected: Fondo de la pestaña de la barra lateral para las pestañas seleccionadas +sidebar-tab-background: Fondo de la pestaña de la barra lateral +sidebar-tab-border-selected: Borde de la pestaña de la barra lateral para las pestañas seleccionadas +sidebar-tab-border: Borde de la pestaña de la barra lateral +sidebar-tab-divider: Divisor de pestañas de la barra lateral +sidebar-tab-foreground-selected: Divisor de pestañas de la barra lateral para las pestañas seleccionadas +sidebar-tab-foreground: Primario de la pestaña de la barra lateral +sidebar-tiddler-link-foreground-hover: Primario enlace tiddler en la barra lateral al pasar por encima +sidebar-tiddler-link-foreground: Primario enlace tiddler en la barra lateral +site-title-foreground: Primario título sitio +static-alert-foreground: Primario de alerta estática +tab-background-selected: Fondo de pestaña para pestañas seleccionadas +tab-background: Fondo de pestaña +tab-border-selected: Borde de pestaña para pestañas seleccionadas +tab-border: Borde de pestañas +tab-divider: Divisor de pestañas +tab-foreground-selected: Primario de pestaña para pestañas seleccionadas +tab-foreground: Primario de pestaña +table-border: Borde Tabla +table-footer-background: Fondo pie tabla +table-header-background: Fondo cabecera tabla +tag-background: Fondo etiqueta +tag-foreground: Primario etiqueta +tiddler-background: Fondo Tiddler +tiddler-border: Borde Tiddler +tiddler-controls-foreground-hover: Primario controles Tiddler al pasar por encima +tiddler-controls-foreground-selected: Primario controles seleccionados en Tiddler +tiddler-controls-foreground: Primario controles Tiddler +tiddler-editor-background: Fondo editor Tiddler +tiddler-editor-border-image: Borde imagen en editor Tiddler +tiddler-editor-border: Borde editor Tiddler +tiddler-editor-fields-even: Fondo editor Tiddler para campos pares +tiddler-editor-fields-odd: Fondo editor Tiddler para campos impares +tiddler-info-background: Fondo panel información en Tiddler +tiddler-info-border: Borde panel información en Tiddler +tiddler-info-tab-background: Fondo pestaña panel información en Tiddler +tiddler-link-background: Fondo enlace Tiddler +tiddler-link-foreground: Primario enlace Tiddler +tiddler-subtitle-foreground: Primario subtítulo Tiddler +tiddler-title-foreground: Primario título Tiddler +toolbar-new-button: Primario botón 'nuevo tiddler' +toolbar-options-button: Primario botón 'opciones' +toolbar-save-button: Primario botón 'guardar' +toolbar-info-button: Primario botón 'información' +toolbar-edit-button: Primario botón 'editar' +toolbar-close-button: Primario botón 'cerrar' +toolbar-delete-button: Primario botón 'eliminar' +toolbar-cancel-button: Primario botón 'cancelar' +toolbar-done-button: Primario botón 'hecho' +untagged-background: Fondo de píldora sin etiquetar +very-muted-foreground: Primario muy silenciado diff --git a/languages/es-ES/EditTemplate.multids b/languages/es-ES/EditTemplate.multids index bb91c3f40..934e87163 100644 --- a/languages/es-ES/EditTemplate.multids +++ b/languages/es-ES/EditTemplate.multids @@ -1,28 +1,35 @@ title: $:/language/EditTemplate/ -Body/External/Hint: Este es un tiddler externo, es decir, guardado fuera del archivo TiddlyWiki principal <br> -Puedes editar sus etiquetas y campos, pero no se puede editar directamente el contenido +Body/External/Hint: Este es un tiddler externo, es decir, guardado fuera del archivo TiddlyWiki principal <br> Puedes editar sus etiquetas y campos, pero no se puede editar directamente el contenido Body/Placeholder: Escribe el texto aquí -Body/Preview/Type/Output: Output +Body/Preview/Type/Output: Visible Field/Remove/Caption: Eliminar campo Field/Remove/Hint: Elimina el campo y su valor +Field/Dropdown/Caption: lista de campos +Field/Dropdown/Hint: Mostrar lista de campos Fields/Add/Button: Añadir campo -Fields/Add/Dropdown/System: Campos de sistema -Fields/Add/Dropdown/User: Campos de usuario +Fields/Add/Button/Hint: Añade el nuevo campo al tiddler Fields/Add/Name/Placeholder: Nombre Fields/Add/Prompt: Añadir Fields/Add/Value/Placeholder: Valor -Shadow/OverriddenWarning: Este es un tiddler oculto modificado<br> -Puedes restituirlo a su versión original eliminando este tiddler -Shadow/Warning: Este es un tiddler oculto<br> -Cualquier cambio que hagas reemplazará la versión original +Fields/Add/Dropdown/System: Campos de sistema +Fields/Add/Dropdown/User: Campos de usuario +Shadow/Warning: Este es un tiddler oculto<br> Cualquier cambio que hagas reemplazará la versión original +Shadow/OverriddenWarning: Este es un tiddler oculto modificado<br> Puedes restituirlo a su versión original eliminando este tiddler Tags/Add/Button: Añadir +Tags/Add/Button/Hint: añadir etiqueta Tags/Add/Placeholder: Nombre +Tags/ClearInput/Caption: vaciar campo +Tags/ClearInput/Hint: Vacia campo etiqueta Tags/Dropdown/Caption: Etiquetas Tags/Dropdown/Hint: Muestra la lista de etiquetas existentes -Type/Delete/Caption: Borrar -Type/Delete/Hint: Borra el tipo de contenido +Title/BadCharacterWarning: Advertencia: evita usar cualquiera de los caracteres <<bad-chars>> en los títulos de tiddler +Title/Exists/Prompt: El tiddler de destino ya existe +Title/Relink/Prompt: Actualizar ''<$text text=<<fromTitle>>/>'' a ''<$text text=<<toTitle>>/>'' en los campos //tags// y //list// de otros tiddlers +Title/References/Prompt: Las siguientes referencias a este tiddler no se actualizarán automáticamente: Type/Dropdown/Caption: Tipos de contenido Type/Dropdown/Hint: Muestra la lista de tipos disponibles +Type/Delete/Caption: Borrar +Type/Delete/Hint: Borra el tipo de contenido Type/Placeholder: Nuevo tipo Type/Prompt: Tipo: diff --git a/languages/es-ES/Exporters.multids b/languages/es-ES/Exporters.multids index 3f2ab1189..9673812f1 100644 --- a/languages/es-ES/Exporters.multids +++ b/languages/es-ES/Exporters.multids @@ -1,6 +1,6 @@ title: $:/language/Exporters/ -CsvFile: Archivo de tipo .CSV -JsonFile: Archivo de tipo .JSON StaticRiver: Cadena de tiddlers como .HTML estático +JsonFile: Archivo de tipo .JSON +CsvFile: Archivo de tipo .CSV TidFile: Tiddler individual como archivo ".tid" diff --git a/languages/es-ES/Fields.multids b/languages/es-ES/Fields.multids index 6e8992542..749ba6231 100644 --- a/languages/es-ES/Fields.multids +++ b/languages/es-ES/Fields.multids @@ -5,31 +5,34 @@ bag: Nombre de la bolsa de la que procede un tiddler caption: Texto que se muestra en una pestaña o botón, con independencia del título del tiddler que lo define color: Valor CSS del color de fondo asociado a un tiddler component: Nombre del componente responsable de un [[tiddler de alerta|AlertMechanism]] +current-tiddler: Usado para incluir el tiddler superior en una [[historia|HistoryMechanism]] created: Fecha de creación del tiddler creator: Nombre del autor del tiddler -current-tiddler: Usado para incluir el tiddler superior en una [[historia|HistoryMechanism]] dependents: En un complemento o extensión, lista de sus dependencias description: Descripción de un complemento, extensión, o diálogo modal draft.of: Título del tiddler del que el actual es borrador draft.title: Nuevo título propuesto para el presente borrador footer: Texto al pie que figurará en un asistente +hide-body: La plantilla de vista ocultará los cuerpos de los tiddlers si se establece en: ''yes'' icon: Nombre del tiddler que contiene el icono que se quiere asociar al presente tiddler library: Si su valor es "Sí", indica que el tiddler debe guardarse como librería de JavaScript list: Lista ordenada de tiddlers asociados al presente tiddler +list-before: Título del tiddler antes del que el presente será añadido a una lista<br> Si el campo existe pero está vacío, el tiddler se añadirá al principio de la lista list-after: Título del tiddler tras el que el presente será añadido a una lista de tiddlers. -list-before: Título del tiddler antes del que el presente será añadido a una lista<br> -Si el campo existe pero está vacío, el tiddler se añadirá al principio de la lista modified: Fecha y hora de última modificación modifier: Nombre del tiddler asociado con quien modificó por última vez el presente tiddler name: Nombre asociado con un complemento o extensión plugin-priority: Valor numérico que indica la prioridad de un complemento o extensión plugin-type: Tipo de complemento o extensión -released: Fecha de la edición de TiddlyWiki revision: Revisión del tiddler existente en el servidor +released: Fecha de la edición de TiddlyWiki source: Dirección de la fuente asociada a un tiddler subtitle: Subtítulo que figurará en un asistente tags: Lista de etiquetas asignadas al tiddler text: Texto principal de un tiddler +throttle.refresh: Si está presente, regula las actualizaciones de este tiddler title: Nombre único de un tiddler +toc-link: Suprime el enlace del tiddler en la tabla de contenido si se establece en: ''no'' type: Tipo de contenido en un tiddler version: Versión de un complemento o extensión +_is_skinny: Si está presente, indica que el campo de texto tiddler debe cargarse desde el servidor diff --git a/languages/es-ES/Filters.multids b/languages/es-ES/Filters.multids index adc627df7..333c10cc4 100644 --- a/languages/es-ES/Filters.multids +++ b/languages/es-ES/Filters.multids @@ -1,14 +1,16 @@ title: $:/language/Filters/ -AllTags: Todas las etiquetas, excepto las de sistema AllTiddlers: Todos los tiddlers, excepto los de sistema -Drafts: Borradores -Missing: Tiddlers vacíos -Orphans: Tiddlers huérfanos -OverriddenShadowTiddlers: Tiddlers ocultos anulados RecentSystemTiddlers: Tiddlers recientemente modificados, incluidos los de sistema RecentTiddlers: Tiddlers recientemente modificados -ShadowTiddlers: Tiddlers ocultos -SystemTags: Etiquetas de sistema +AllTags: Todas las etiquetas, excepto las de sistema +Missing: Tiddlers inexistentes +Drafts: Borradores +Orphans: Tiddlers huérfanos SystemTiddlers: Tiddlers de sistema -TypedTiddlers: Tiddlers que no sonWikiText +ShadowTiddlers: Tiddlers ocultos +OverriddenShadowTiddlers: Tiddlers ocultos anulados +SessionTiddlers: Tiddlers modificados desde que se cargó el wiki +SystemTags: Etiquetas de sistema +StoryList: Tiddlers en la vista, excluyendo <$text text="$:/AdvancedSearch"/> +TypedTiddlers: Tiddlers que no son WikiText diff --git a/languages/es-ES/GettingStarted.tid b/languages/es-ES/GettingStarted.tid index 19d61f5f7..05437a5f1 100644 --- a/languages/es-ES/GettingStarted.tid +++ b/languages/es-ES/GettingStarted.tid @@ -6,6 +6,7 @@ Bienvenido a TiddlyWiki y a su comunidad de usuarios Antes de guardar información importante en TiddlyWiki, es preciso que te asegures de poder hacerlo de manera fiable Visita https://tiddlywiki.com/#GettingStarted para más información (en inglés) + !! Configura este ~TiddlyWiki <div class="tc-control-panel"> diff --git a/languages/es-ES/Help/deletetiddlers.tid b/languages/es-ES/Help/deletetiddlers.tid new file mode 100644 index 000000000..c217d49e8 --- /dev/null +++ b/languages/es-ES/Help/deletetiddlers.tid @@ -0,0 +1,8 @@ +title: $:/language/Help/deletetiddlers +description: Elimina un grupo de tiddlers + +<<.from-version "5.1.20">> Elimina un grupo de tiddlers identificados por un filtro. + +``` +--deletetiddlers <filter> +``` diff --git a/languages/es-ES/Help/fetch.tid b/languages/es-ES/Help/fetch.tid new file mode 100644 index 000000000..938b189d8 --- /dev/null +++ b/languages/es-ES/Help/fetch.tid @@ -0,0 +1,38 @@ +title: $:/language/Help/fetch +description: Obtener tiddlers del wiki por URL + +Obtiene uno o más archivos a través de HTTP/HTTPS e importe los tiddlers que coincidan con un filtro, transformando opcionalmente los títulos entrantes. + +``` +--fetch file <url> <import-filter> <transform-filter> +--fetch files <url-filter> <import-filter> <transform-filter> +--fetch raw-file <url> <transform-filter> +--fetch raw-files <url-filter> <transform-filter> +``` + +Las opciones "file" y "files" obtienen los archivos especificados e intentan importar los tiddlers dentro de ellos (el mismo procesamiento que si los archivos se arrastraran a la ventana del navegador). Las variantes "raw-file" y "raw-files" obtienen los archivos especificados y almacenan los datos del archivo sin procesar en tiddlers, sin aplicar la lógica de importación. + +Con las opciones "file" y "raw-file", solo se obtiene un archivo y el primer parámetro es la URL del archivo que se va a leer. + +Con las opciones "files" y "raw-files", se obtienen varios archivos y el primer parámetro es un filtro que produce una lista de URL de los archivos a leer. Por ejemplo, dado un conjunto de tiddlers etiquetados como "servidor-remoto" que tienen un campo "url", el filtro `[tag[servidor-remoto]get[url]]` recuperará todas las URL disponibles. + +Para las opciones "file" y "files", el parámetro `<import-filter>` especifica un filtro que determina qué tiddlers se importan. El valor predeterminado es "[all[tiddlers]]" si no se proporciona. + +Para todas las opciones, el parámetro `<transform-filter>` especifica un filtro opcional que transforma los títulos de los tiddlers importados. Por ejemplo, `[addprefix[$:/myimports/]]` agregaría el prefijo `$:/myimports/` a cada título. + +Si precede al comando `--fetch` con `--verbose`, se generará información de progreso durante la importación. + +Ten en cuenta que TiddlyWiki no obtendrá una versión anterior de un complemento ya cargado. + +El siguiente ejemplo recupera todos los tiddlers que no son del sistema de https://tiddlywiki.com y los guarda en un archivo JSON: + +``` +tiddlywiki --verbose --fetch file "https://tiddlywiki.com/" "[!is[system]]" "" --rendertiddler "$:/core/templates/exporters/JsonFile" output.json text/plain "" exportFilter "[!is[system]]" +``` + +El siguiente ejemplo recupera el archivo "favicon" de tiddlywiki.com y lo guarda en un archivo llamado "output.ico". Ten en cuenta que el tiddler intermedio "Icon Tiddler" se cita en el comando "--fetch" porque se usa como un filtro de transformación para reemplazar el título predeterminado, mientras que no hay comillas para el comando "--savetiddler" porque es se utiliza directamente como título. + +``` +tiddlywiki --verbose --fetch raw-file "https://tiddlywiki.com/favicon.ico" "[[Icon Tiddler]]" --savetiddler "Icon Tiddler" output.ico +``` + diff --git a/languages/es-ES/Help/import.tid b/languages/es-ES/Help/import.tid new file mode 100644 index 000000000..8bfff2410 --- /dev/null +++ b/languages/es-ES/Help/import.tid @@ -0,0 +1,24 @@ +title: $:/language/Help/import +description: Importar tiddlers desde un archivo + +Importa tiddlers desde TiddlyWiki (`.html`),` .tiddler`, `.tid`,` .json` u otros archivos locales. El deserializador debe especificarse explícitamente, a diferencia del comando `load` que infiere el deserializador a partir de la extensión del archivo. + +``` +--import <filepath> <deserializer> [<title>] [<encoding>] +``` + +Los deserializadores incluidos por defecto son: + +* application/javascript +* application/json +* application/x-tiddler +* application/x-tiddler-html-div +* application/x-tiddlers +* text/html +* text/plain + +El título del tiddler importado tiene como valor predeterminado el nombre del archivo. + +La codificación predeterminada es "utf8", pero puede ser "base64" para importar archivos binarios. + +Ten en cuenta que TiddlyWiki no importará una versión anterior de un complemento ya cargado. diff --git a/languages/es-ES/Help/init.tid b/languages/es-ES/Help/init.tid index afc85f7cc..70100a887 100644 --- a/languages/es-ES/Help/init.tid +++ b/languages/es-ES/Help/init.tid @@ -16,14 +16,8 @@ tiddlywiki ./MyWikiFolder --init empty Nota: * Se creará un directorio para el wiki si es necesario - * La edición por defecto es ''empty'' - * El comando `--init` fallará si el directorio no está vacío - * El comando `--init` elimina toda definición de `includeWikis` contenida en el archivo `tiddlywiki.info` - -* Cuando se indican varias ediciones para su inicialización, las ediciones //planchan// sucesivamente todo archivo compartido, de modo que el -archivo `tiddlywiki.info` final será el que corresponda a la última edición que se indique. - +* Cuando se indican varias ediciones para su inicialización, las ediciones sobrescriben sucesivamente todos los archivos compartidos, de modo que el archivo `tiddlywiki.info` final será el que corresponda a la última edición que se indique. * `--editions` muestra una lista de ediciones disponibles diff --git a/languages/es-ES/Help/listen.tid b/languages/es-ES/Help/listen.tid new file mode 100644 index 000000000..21af6ab4a --- /dev/null +++ b/languages/es-ES/Help/listen.tid @@ -0,0 +1,35 @@ +title: $:/language/Help/listen +description: Proporciona una interfaz de servidor HTTP a TiddlyWiki + +Sirve un wiki a través de HTTP. + +El comando listen usa parámetros con nombre: + +``` +--listen [<name>=<value>]... +``` + +Todos los parámetros son opcionales con valores predeterminados seguros y se pueden especificar en cualquier orden. Los parámetros reconocidos son: + +* ''host'' - nombre de host opcional desde el que servir (el valor predeterminado es "127.0.0.1" también conocido como "localhost") +* ''path-prefix'' - prefijo opcional para rutas +* ''port'' - número de puerto en el que escuchar; los valores no numéricos se interpretan como una variable de entorno del sistema de la que se extrae el número de puerto (el valor predeterminado es "8080") +* ''credentials'' - nombre de ruta del archivo CSV de credenciales (relativo a la carpeta wiki) +* ''anon-username'' - el nombre de usuario para firmar ediciones de usuarios anónimos +* ''username'' - nombre de usuario opcional para autenticación básica +* ''password'' - contraseña opcional para autenticación básica +* ''authenticated-user-header'' - nombre opcional del encabezado que se utilizará para la autenticación de confianza +* ''readers'' - lista separada por comas de los usuarios autorizados a leer de este wiki +* ''writers'' - lista separada por comas de los usuarios autorizados a escribir en este wiki +* ''csrf-disable'' - establecer a "yes" para deshabilitar las comprobaciones CSRF (el valor predeterminado es "no") +* ''sse-enabled'' - establecer a "yes" para habilitar los eventos enviados por el servidor (el valor predeterminado es "no") +* ''root-tiddler'' - el tiddler para servir en la raíz (por defecto es "$:/core/save/all") +* ''root-render-type'' - el tipo de contenido del tiddler raíz (por defecto es "text/plain") +* ''root-serve-type'' - el tipo de contenido con el que se debe servir el tiddler raíz (el valor predeterminado es "text/html") +* ''tls-cert'' - nombre de ruta del archivo de certificado TLS (relativo a la carpeta wiki) +* ''tls-key'' - nombre de ruta del archivo de clave TLS (relativo a la carpeta wiki) +* ''debug-level'' - nivel de depuración opcional; establecer en "debug" para ver los detalles de las solicitudes (el valor predeterminado es "none") +* ''gzip'' - establecer a "yes" para habilitar la compresión gzip para algunos puntos finales http (el valor predeterminado es "no") +* ''use-browser-cache'' - establecer a "yes" para permitir que el navegador almacene en caché las respuestas para ahorrar ancho de banda (el valor predeterminado es "no") + +Para obtener información sobre cómo abrir tu instancia a toda la red local y posibles problemas de seguridad, consulta el tiddler de WebServer en TiddlyWiki.com. diff --git a/languages/es-ES/Help/load.tid b/languages/es-ES/Help/load.tid index 92a66832a..1dcd78b0d 100644 --- a/languages/es-ES/Help/load.tid +++ b/languages/es-ES/Help/load.tid @@ -1,12 +1,15 @@ title: $:/language/Help/load description: Carga tiddlers desde un archivo -Carga tiddlers de archivos de tipo TiddlyWiki 2.x.x.(`.html`), `.tiddler`, `.tid`, `.json` u otros +Carga tiddlers de archivos de tipo TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` u otros archivos locales. El procesamiento aplicado a los archivos entrantes será determinado por la extensión del archivo. Utiliza el comando `import` si necesita especificar el deserializador y la codificación explícitamente. ``` ---load <filepath> +--load <filepath> [noerror] +--load <dirpath> [noerror] ``` +De forma predeterminada, el comando `load` genera un error si no se encuentran tiddlers. El error se puede suprimir proporcionando el parámetro opcional "noerror". + Para cargar tiddlers de un TiddlyWiki encriptado, primero debes especificar la contraseña con el comando PasswordCommand. Por ejemplo: ``` diff --git a/languages/es-ES/Help/makelibrary.tid b/languages/es-ES/Help/makelibrary.tid index 894752d5e..e244796e1 100644 --- a/languages/es-ES/Help/makelibrary.tid +++ b/languages/es-ES/Help/makelibrary.tid @@ -1,11 +1,9 @@ title: $:/language/Help/makelibrary description: Compila la librería de plugins necesaria para actualizar TiddlyWiki - Construye el tiddler `$:/UpgradeLibrary`: librería de actualización -La librería de actualización tiene formato de plugin ordinario, de tipo `library`<br> -Contiene copia de cada uno de los plugins, temas y paquetes de idioma disponibles en el repositorio de TiddlyWiki5 +La librería de actualización tiene formato de plugin ordinario, de tipo `library`. Contiene copia de cada uno de los plugins, temas y paquetes de idioma disponibles en el repositorio de TiddlyWiki5 Este comando es, en principio, para uso interno del equipo de TiddlyWiki y sólo es de interés para aquellos usuarios que deseen compilar actualizaciones personalizadas diff --git a/languages/es-ES/Help/password.tid b/languages/es-ES/Help/password.tid index e6d865408..e603a757e 100644 --- a/languages/es-ES/Help/password.tid +++ b/languages/es-ES/Help/password.tid @@ -1,5 +1,5 @@ title: $:/language/Help/password -description: Establece contraseña para operaciones de cifrado subsiguientes +description: Establece una contraseña para operaciones de cifrado subsiguientes Establece contraseña para las operaciones subsiguientes de cifrado @@ -7,3 +7,4 @@ Establece contraseña para las operaciones subsiguientes de cifrado --password <password> ``` +''Nota'': Esto no debe usarse para servir TiddlyWiki con protección por contraseña. En su lugar, consulta la opción de contraseña en [[ServerCommand]]. diff --git a/languages/es-ES/Help/render.tid b/languages/es-ES/Help/render.tid new file mode 100644 index 000000000..a3a76741d --- /dev/null +++ b/languages/es-ES/Help/render.tid @@ -0,0 +1,35 @@ +title: $:/language/Help/render +description: Renderiza tiddlers individuales en archivos + +Renderiza tiddlers individuales identificados por un filtro y guarda los resultados en los archivos especificados. + +Opcionalmente, se puede especificar el título de un tiddler de plantilla. En este caso, en lugar de representar directamente cada tiddler, la plantilla tiddler se procesa con la variable "currentTiddler" establecida en el título del tiddler que se está procesando. + +También se puede especificar un nombre y valor para variables adicionales. + +``` +--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [ [<name>] [<value>] ]* +``` + +* ''tiddler-filter'': Un filtro que identifica los tiddlers que se procesarán +* ''filename-filter'': Filtro opcional que transforma los títulos de tiddler en nombres de ruta. Si se omite, el valor predeterminado es `[is[tiddler]addsuffix[.html]]`, que utiliza el título del tiddler sin cambios como nombre de archivo +* ''render-type'': Tipo de renderizado opcional: `text/html` (el predeterminado) devuelve el texto HTML completo y `text/plain` simplemente devuelve el contenido del texto (es decir, ignora las etiquetas HTML y otros elementos no imprimibles) +* ''template'': Plantilla opcional a través de la cual se representa cada tiddler +* ''name'': Nombre de variables opcionales +* ''value'': Valor de variables opcionales + +De forma predeterminada, el nombre del archivo se resuelve relativo al subdirectorio `output` del directorio de edición. El comando `--output` se puede usar para dirigir la salida a otro directorio diferente. + +Notas: + +* No se elimina ningún contenido del directorio de salida +* Los directorios que faltan en la ruta al nombre del archivo se crean automáticamente. +* Cuando se refiera a un tiddler con espacios en su título, ten cuidado de usar las comillas requeridas por la línea de comandos y también los corchetes dobles de TiddlyWiki: `--render "[[Motovun Jack.jpg]]"` +* El filtro de nombre de archivo se evalúa con los elementos seleccionados que se establecen en el título del tiddler que se está procesando actualmente, lo que permite que el título se utilice como base para calcular el nombre de archivo. Por ejemplo, `[encodeuricomponent[]addprefix[static/]]` aplica codificación URI a cada título y luego añade el prefijo `static/` +* Se pueden usar múltiples pares ''nombre''/''valor'' para pasar más de una variable +* El comando `--render` es un reemplazo más flexible para los comandos `--rendertiddler` y `--rendertiddlers`, que están en desuso + +Ejemplos: + +* `--render "[!is[system]]" "[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]"` -- muestra todos los tiddlers que no son del sistema como archivos en el subdirectorio "tiddlers" con títulos codificados en URL y la extensión HTML + diff --git a/languages/es-ES/Help/rendertiddler.tid b/languages/es-ES/Help/rendertiddler.tid index 6ae1c2d9c..dd6eaec8e 100644 --- a/languages/es-ES/Help/rendertiddler.tid +++ b/languages/es-ES/Help/rendertiddler.tid @@ -1,13 +1,24 @@ title: $:/language/Help/rendertiddler description: Genera un tiddler del ContentType que se especifique +(Nota: el comando `--rendertiddler` está obsoleto en favor del nuevo y más flexible comando `--render`) + Genera un tiddler del ContentType que se especifique (por defecto `text/html`) y lo guarda con el nombre de archivo especificado +Opcionalmente, se puede especificar el título de un tiddler de plantilla, en cuyo caso el tiddler de plantilla se representa con la variable "currentTiddler" establecida en el tiddler que se está procesando (el primer valor de parámetro). + +También se puede especificar un nombre y valor para variables adicionales. + ``` ---rendertiddler <title> <filename> [<type>] +--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>] ``` -Por defecto, el nombre de archivo es relativo al subdirectorio `output` en el directorio del wiki<br> -Puede usarse el comando `--output` para dirigir la salida a cualquier otro directorio +Por defecto, el nombre de archivo es relativo al subdirectorio `output` en el directorio del wiki. Puede usarse el comando `--output` para dirigir la salida a cualquier otro directorio Los directorios no existentes en la ruta del nombre de archivo se crean automáticamente. + +Por ejemplo, el siguiente comando guarda todos los tiddlers que coinciden con el filtro `[tag[done]]` en un archivo JSON titulado `output.json` aplicando la plantilla principal `$:/core/templates/exporters/JsonFile`. + +``` +--rendertiddler "$:/core/templates/exporters/JsonFile" output.json text/plain "" exportFilter "[tag[done]]" +``` diff --git a/languages/es-ES/Help/rendertiddlers.tid b/languages/es-ES/Help/rendertiddlers.tid index 6c35c6acc..446fd7fbe 100644 --- a/languages/es-ES/Help/rendertiddlers.tid +++ b/languages/es-ES/Help/rendertiddlers.tid @@ -1,20 +1,20 @@ title: $:/language/Help/rendertiddlers description: Genera tiddlers coincidentes con un determinado ContentType +(Nota: el comando `--rendertiddlers` está obsoleto en favor del nuevo y más flexible comando` --render`) + Genera un conjunto de tiddlers de un determinado ContentType (por defecto `text/html`) y extensión de archivo (por defecto, `.html`), coincidentes con el argumento de un filtro ``` ---rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] +--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] ["noclean"] ``` Por ejemplo: ``` ---rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain +--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain ``` -Por defecto, la ruta es relativa al subdirectorio `output` del directorio del wiki<br> -Puede usarse con el comando `--output` para dirigir la salida a un directorio diferente +Por defecto, la ruta es relativa al subdirectorio `output` del directorio del wiki. Puede usarse con el comando `--output` para dirigir la salida a un directorio diferente -Cualquier archivo existente en el directorio de destino será borrado<br> -Los directorios no existentes en la ruta del nombre de archivo se crean automáticamente. +Cualquier archivo existente en el directorio de destino será borrado a no ser que se especifique el comando ''noclean''. Los directorios no existentes en la ruta del nombre de archivo se crean automáticamente. diff --git a/languages/es-ES/Help/save.tid b/languages/es-ES/Help/save.tid new file mode 100644 index 000000000..48f93c020 --- /dev/null +++ b/languages/es-ES/Help/save.tid @@ -0,0 +1,25 @@ +title: $:/language/Help/save +description: Guarda tiddlers individuales sin procesar en archivos + +Guarda tiddlers individuales identificados por un filtro en su texto sin formato o formato binario en los archivos especificados. + +``` +--save <tiddler-filter> <filename-filter> +``` + +* ''tiddler-filter'': Un filtro que identifica a los tiddler que se guardarán. +* ''filename-filter'': Filtro opcional que transforma los títulos de tiddler en nombres de ruta. Si se omite, el valor predeterminado es "[is[tiddler]]", que utiliza el título del tiddler sin cambios como nombre de archivo + +De forma predeterminada, el nombre del archivo se resuelve relativo al subdirectorio `output` del directorio de edición. El comando `--output` se puede usar para dirigir la salida a otro directorio diferente. + +Notas: + +* No se elimina ningún contenido del directorio de salida +* Los directorios que faltan en la ruta al nombre del archivo se crean automáticamente. +* Cuando se refiera a un tiddler con espacios en su título, ten cuidado de usar las comillas requeridas por la línea de comandos y también los corchetes dobles de TiddlyWiki: `--save "[[Motovun Jack.jpg]]"` +* El filtro de nombre de archivo se evalúa con los elementos seleccionados que se establecen en el título del tiddler que se está procesando actualmente, lo que permite que el título se utilice como base para calcular el nombre de archivo. Por ejemplo, `[encodeuricomponent[]addprefix[static/]]` aplica codificación URI a cada título y luego añade el prefijo `static/` +* El comando `--save` es un reemplazo más flexible para los comandos `--savetiddler` y `--savetiddlers`, que están en desuso + +Ejemplos: + +* `--save "[!is[system]is[image]]" "[encodeuricomponent[]addprefix[tiddlers/]]"` -- guarda todos los tiddlers de imágenes que no son del sistema como archivos en el subdirectorio "tiddlers" con títulos codificados en URL diff --git a/languages/es-ES/Help/savetiddler.tid b/languages/es-ES/Help/savetiddler.tid index ab1ca6539..b8c13bdef 100644 --- a/languages/es-ES/Help/savetiddler.tid +++ b/languages/es-ES/Help/savetiddler.tid @@ -1,13 +1,14 @@ title: $:/language/Help/savetiddler description: Guarda un tiddler en un archivo +(Nota: el comando `--savetiddler` está obsoleto en favor del nuevo y más flexible comando `--save`) + Guarda un tiddler individual en formato binario o como texto plano con el nombre de archivo especificado. ``` --savetiddler <title> <filename> ``` -Por defecto, la ruta es relativa al subdirectorio `output` del directorio del wiki<br> -Puede usarse con el comando `--output` para dirigir la salida a un directorio diferente +Por defecto, la ruta es relativa al subdirectorio `output` del directorio del wiki. Puede usarse con el comando `--output` para dirigir la salida a un directorio diferente Los directorios no existentes en la ruta del nombre de archivo se crean automáticamente. diff --git a/languages/es-ES/Help/savetiddlers.tid b/languages/es-ES/Help/savetiddlers.tid index 0c3b6bf2f..f15e8ebd5 100644 --- a/languages/es-ES/Help/savetiddlers.tid +++ b/languages/es-ES/Help/savetiddlers.tid @@ -1,13 +1,16 @@ title: $:/language/Help/savetiddlers description: Guarda un grupo de tiddlers de formato plano en un directorio +(Nota: el comando `--savetiddlers` está obsoleto en favor del nuevo y más flexible comando `--save`) + Guarda un grupo de tiddlers en formato binario o como texto plano en el directorio especificado. ``` ---savetiddlers <filter> <pathname> +--savetiddlers <filter> <pathname> ["noclean"] ``` -Por defecto, la ruta es relativa al subdirectorio `output` del directorio del wiki<br> -Puede usarse con el comando `--output` para dirigir la salida a un directorio diferente +Por defecto, la ruta es relativa al subdirectorio `output` del directorio del wiki. Puede usarse con el comando `--output` para dirigir la salida a un directorio diferente + +El directorio de salida se borra de los archivos existentes antes de guardar los archivos especificados. La eliminación se puede desactivar especificando el indicador "noclean". Los directorios no existentes en la ruta del nombre de archivo se crean automáticamente. diff --git a/languages/es-ES/Help/savewikifolder.tid b/languages/es-ES/Help/savewikifolder.tid new file mode 100644 index 000000000..6522b7155 --- /dev/null +++ b/languages/es-ES/Help/savewikifolder.tid @@ -0,0 +1,19 @@ +title: $:/language/Help/savewikifolder +description: Guarda un wiki en una nueva carpeta de wiki + +<<.from-version "5.1.20">> Guarda el wiki actual como una carpeta de wiki, incluidos tiddlers, complementos y configuración: + +``` +--savewikifolder <wikifolderpath> [<filter>] +``` + +* La carpeta wiki de destino debe estar vacía o no existir +* El filtro especifica qué tiddlers deben incluirse. Es opcional, por defecto es `[all[tiddlers]]` +* Los complementos de la biblioteca oficial de complementos se reemplazan con referencias a esos complementos en el archivo `tiddlywiki.info` +* Los complementos personalizados se descomprimen en su propia carpeta + +Un uso común es convertir un archivo HTML de TiddlyWiki en una carpeta wiki: + +``` +tiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder +``` diff --git a/languages/es-ES/Help/server.tid b/languages/es-ES/Help/server.tid index 8634c9e2a..b16769dfe 100644 --- a/languages/es-ES/Help/server.tid +++ b/languages/es-ES/Help/server.tid @@ -1,18 +1,15 @@ title: $:/language/Help/server -description: Proporciona interfaz de servidor HTTP a TiddlyWiki +description: Proporciona interfaz de servidor HTTP a TiddlyWiki (en desuso a favor del nuevo comando listen) -El servidor compilado para TiddlyWiki5 es muy simple. Aunque es compatible con TiddlyWeb, no soporta muchas de las características necesarias para un uso robusto en Internet. - -En la raíz, sirve un tiddler específico<br> -Fuera de la raíz, sirve tiddlers individuales codificados en JSON, y soporta operaciones básicas HTTP de `GET`, `PUT` y `DELETE`. +Comando obsoleto para servir una wiki a través de HTTP. ``` ---server <port> <roottiddler> <rendertype> <servetype> <username> <password> <host> <pathprefix> +--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level> ``` Los parámetros son -* ''port'' - número de puerto desde el que sirve (por defecto, "8080") +* ''port'' - número de puerto desde el que sirve; valores no numéricos se interpretan como una variable de entorno del sistema de la que se extrae el número de puerto (por defecto, "8080") * ''roottiddler'' - tiddler que se sirve desde la raíz (por defecto, "$:/core/save/all") * ''rendertype'' - tipo de contenido con el que se genera el tiddler raíz (por defecto "text/plain") * ''servetype'' - tipo de contenido con el que se sirve el tiddler raíz (por defecto "text/html") @@ -20,8 +17,9 @@ Los parámetros son * ''password'' - contraseña opcional para autenticación básica * ''host'' - nombre opcional del servidor desde el que se sirve (por defecto, "127.0.0.1" o "localhost") * ''pathprefix'' - prefijo opcional para rutas +* ''debug-level'' - nivel de depuración opcional; establecer en "debug" para ver los detalles de la solicitud (el valor predeterminado es "none") -Si se ha definido contraseña, el navegador pedirá que se introduzca nombre y contraseña. <br>Nótese que la contraseña se transmite en modo texto por lo que esta implementación no es apropiada para uso general. +Si se ha definido contraseña, el navegador pedirá que se introduzca nombre y contraseña. <br>Nótese que la contraseña se transmite en modo texto por lo que esta implementación solo debe usarse en redes seguras or utilizando HTTPS. Por ejemplo: @@ -35,4 +33,10 @@ El nombre de usuario y la contraseña pueden ser especificados como cadenas de s --server 8080 $:/core/save/all text/plain text/html "" "" 192.168.0.245 ``` +El uso de una dirección como esta expone tu sistema a la red local. Para obtener información sobre cómo abrir tu instancia a toda la red local y posibles problemas de seguridad, consulta el tiddler de WebServer en TiddlyWiki.com. + Para ejecutar simultáneamente múltiples servidores TiddlyWiki, deberán configurarse cada uno en un puerto diferente + +``` +--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd +``` diff --git a/languages/es-ES/Import.multids b/languages/es-ES/Import.multids index 0c623b69b..46b912997 100644 --- a/languages/es-ES/Import.multids +++ b/languages/es-ES/Import.multids @@ -1,15 +1,33 @@ title: $:/language/Import/ -Imported/Hint: Se importaron los siguientes tiddlers +Editor/Import/Heading: Importar imágenes e insertarlas en el editor. +Imported/Hint: Se importaron los siguientes tiddlers Listing/Cancel/Caption: Cancelar Listing/Hint: Tiddlers listos para importar Listing/Import/Caption: Importar Listing/Select/Caption: Seleccionar Listing/Status/Caption: Estado Listing/Title/Caption: Título -Upgrader/Plugins/Suppressed/Incompatible: Plugin bloqueado, incompatible u obsoleto -Upgrader/Plugins/Suppressed/Version: Plugin bloqueado debido a que <<incoming>> es más antiguo que el <<existing>> -Upgrader/Plugins/Upgraded: Plugin actualizado de <<incoming>> a <<upgraded>> +Listing/Preview: Vista previa: +Listing/Preview/Text: Texto +Listing/Preview/TextRaw: Texto (crudo) +Listing/Preview/Fields: Campos +Listing/Preview/Diff: Diff +Listing/Preview/DiffFields: Diff (Campos) +Listing/Rename/Tooltip: Renombra tiddler antes de importar +Listing/Rename/Prompt: Renombrar a: +Listing/Rename/ConfirmRename: Renombrar tiddler +Listing/Rename/CancelRename: Cancelar +Listing/Rename/OverwriteWarning: Ya existe un tiddler con este título. +Upgrader/Plugins/Suppressed/Incompatible: Complemento bloqueado, incompatible u obsoleto +Upgrader/Plugins/Suppressed/Version: Complemento bloqueado debido a que <<incoming>> es más antiguo que el <<existing>> +Upgrader/Plugins/Upgraded: Complemento actualizado de <<incoming>> a <<upgraded>> Upgrader/State/Suppressed: Tiddler temporal bloqueado +Upgrader/System/Disabled: Tiddler del sistema deshabilitado. Upgrader/System/Suppressed: Tiddler de sistema bloqueado +Upgrader/System/Warning: tiddler del sistema principal. +Upgrader/System/Alert: Estás a punto de importar un tiddler que sobrescribirá un tiddler del sistema principal. Esto no se recomienda ya que puede hacer que el sistema sea inestable. Upgrader/ThemeTweaks/Created: Ajuste de tema migrado de <$text text=<<from>>/> +Upgrader/Tiddler/Disabled: Tiddler deshabilitado. +Upgrader/Tiddler/Selected: Usuario seleccionado. +Upgrader/Tiddler/Unselected: Tiddler no seleccionado. diff --git a/languages/es-ES/Misc.multids b/languages/es-ES/Misc.multids index df36e3a6c..fb0bedf65 100644 --- a/languages/es-ES/Misc.multids +++ b/languages/es-ES/Misc.multids @@ -1,49 +1,96 @@ title: $:/language/ -AboveStory/ClassicPlugin/Warning: Parece que quieres cargar un plugin diseñado para ~TiddlyWiki Classic. <br> -Ten en cuenta que [[estos plugins no funcionan en TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]<br> -Plugins de ~TiddlyWiki Classic detectados +AboveStory/ClassicPlugin/Warning: Parece que quieres cargar un plugin diseñado para ~TiddlyWiki Classic. <br> Ten en cuenta que [[estos plugins no funcionan en TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]<br> Plugins de ~TiddlyWiki Classic detectados BinaryWarning/Prompt: Este tiddler contiene datos binarios -ClassicWarning/Hint: Este tiddler está escrito en formato de texto de una versión de TiddlyWiki Classic que no es totalmente compatible con la versión 5 de TiddlyWiki<br> -Visite https://tiddlywiki.com/static/Upgrading.html para más información +ClassicWarning/Hint: Este tiddler está escrito en formato de texto de una versión de TiddlyWiki Classic que no es totalmente compatible con la versión 5 de TiddlyWiki<br> Visite https://tiddlywiki.com/static/Upgrading.html para más información ClassicWarning/Upgrade/Caption: Actualizar CloseAll/Button: Cerrar todo ColourPicker/Recent: Recientes: ConfirmCancelTiddler: ¿Deseas descartar los cambios efectuados en "<$text text=<<title>>/>"? ConfirmDeleteTiddler: ¿Deseas borrar "<$text text=<<title>>/>"? -ConfirmEditShadowTiddler: Estás a punto de editar un tiddler oculto<br> -Todo cambio en él afectará al sistema por defecto y pondrá en riesgo futuras actualizaciones del sistema<br> -¿Estás seguro de querer editar "<$text text=<<title>>/>"? -ConfirmOverwriteTiddler: ¿Deseas sobreescribir "<$text text=<<title>>/>"? +ConfirmOverwriteTiddler: ¿Deseas sobrescribir "<$text text=<<title>>/>"? +ConfirmEditShadowTiddler: Estás a punto de editar un tiddler oculto<br> Todo cambio en él afectará al sistema por defecto y pondrá en riesgo futuras actualizaciones del sistema<br> ¿Estás seguro de querer editar "<$text text=<<title>>/>"? +ConfirmAction: ¿Desea continuar? Count: Número DefaultNewTiddlerTitle: Nuevo Tiddler +Diffs/CountMessage: <<diff-count>> diferencias DropMessage: Suéltalo aquí o pulsa ''ESC'' para cancelar Encryption/Cancel: Cancelar -Encryption/ConfirmClearPassword: ¿Deseas borrar la contraseña? <br> -Revocarás el cifrado que se aplica para guardar este wiki -Encryption/Password: Contraseña -Encryption/PasswordNoMatch: Las contraseñas no coinciden +Encryption/ConfirmClearPassword: ¿Deseas borrar la contraseña? <br> Revocarás el cifrado que se aplica para guardar este wiki Encryption/PromptSetPassword: Especifica nueva contraseña para este TiddlyWiki -Encryption/RepeatPassword: Repite la contraseña -Encryption/SetPassword: Establecer contraseña Encryption/Username: Usuario -InternalJavaScriptError/Hint: Tenemos un problema. Se recomienda que reinicies TiddlyWiki +Encryption/Password: Contraseña +Encryption/RepeatPassword: Repite la contraseña +Encryption/PasswordNoMatch: Las contraseñas no coinciden +Encryption/SetPassword: Establecer contraseña +Error/Caption: Error +Error/Filter: Error de filtro +Error/FilterSyntax: Error de sintaxis en la expresión de filtro +Error/FilterRunPrefix: Error en Filtro: Prefijo desconocido para la ejecución del filtro +Error/IsFilterOperator: Error en Filtro: Operando desconocido para el operador de filtro 'is' +Error/FormatFilterOperator: Error en Filtro: Sufijo desconocido para el operador de filtro 'format' +Error/LoadingPluginLibrary: Error al cargar la biblioteca de complementos +Error/NetworkErrorAlert: `<h2>''Error de Red''</h2>Parece que se perdió la conexión con el servidor. Esto puede indicar un problema con tu conexión de red. Intenta restaurar la conectividad de red antes de continuar.<br><br>''Cualquier cambio no guardado se sincronizará automáticamente cuando se restaure la conectividad''.` +Error/PutEditConflict: Archivo cambiado en el servidor +Error/PutForbidden: Permiso denegado +Error/PutUnauthorized: Se requiere autenticación +Error/RecursiveTransclusion: Error de transclusión recursiva en el widget de transclusión +Error/RetrievingSkinny: Error al recuperar la lista resumida de tiddlers +Error/SavingToTWEdit: Error al guardar en TWEdit +Error/WhileSaving: Error al guardar +Error/XMLHttpRequest: Código de error XMLHttpRequest +InternalJavaScriptError/Hint: Hay un problema. Se recomienda que reinicies TiddlyWiki InternalJavaScriptError/Title: Error interno de JavaScript -InvalidFieldName: Caracteres ilegales en el campo "<$text text=<<fieldName>>/>"<br> -Los campos sólo pueden contener letras en minúscula, dígitos y los caracteres guión bajo (`_`), guión corto (`-`) y punto (`.`) -LazyLoadingWarning: <p>Cargando texto externo desde ''<$text text={{!!_canonical_uri}}/>''</p><p>Si este mensaje no desaparece, puede que se deba a que estás usando un navegador que con esta configuración no permite texto externo</br> -Vea https://tiddlywiki.com/#ExternalText</p> +InvalidFieldName: Caracteres ilegales en el campo "<$text text=<<fieldName>>/>"<br> Los campos sólo pueden contener letras en minúscula, dígitos y los caracteres guión bajo (`_`), guión corto (`-`) y punto (`.`) +LayoutSwitcher/Description: Abre el selector de diseño +LazyLoadingWarning: <p>Cargando texto externo desde ''<$text text={{!!_canonical_uri}}/>''</p><p>Si este mensaje no desaparece, puede que se deba a que estás usando un navegador que con esta configuración no permite texto externo</br> Vea https://tiddlywiki.com/#ExternalText</p> +LoginToTiddlySpace: Inicia sesión en TiddlySpace +Manager/Controls/FilterByTag/None: (ninguno) +Manager/Controls/FilterByTag/Prompt: Filtrar por etiqueta: +Manager/Controls/Order/Prompt: Orden inverso +Manager/Controls/Search/Placeholder: Buscar +Manager/Controls/Search/Prompt: Buscar: +Manager/Controls/Show/Option/Tags: etiquetas +Manager/Controls/Show/Option/Tiddlers: tiddlers +Manager/Controls/Show/Prompt: Mostrar: +Manager/Controls/Sort/Prompt: Ordenar por: +Manager/Item/Colour: Color +Manager/Item/Fields: Campos +Manager/Item/Icon/None: (ninguno) +Manager/Item/Icon: Icono +Manager/Item/RawText: Texto sin procesar +Manager/Item/Tags: Etiquetas +Manager/Item/Tools: Herramientas +Manager/Item/WikifiedText: Texto Wikified MissingTiddler/Hint: El tiddler "<$text text=<<currentTiddler>>/>" no existe - haz clic en {{||$:/core/ui/Buttons/edit}} para crearlo -OfficialPluginLibrary: Librería de plugins oficiales de ~TiddlyWiki -OfficialPluginLibrary/Hint: Librería de plugins oficiales de ~TiddlyWiki en tiddlywiki.com<br> -Plugins, temas y paquetes de idioma que mantiene el equipo de TiddlyWiki +No: No +OfficialPluginLibrary: Librería de complementos oficiales de ~TiddlyWiki +OfficialPluginLibrary/Hint: Librería de complementos oficiales de ~TiddlyWiki en tiddlywiki.com<br> Plugins, temas y paquetes de idioma que mantiene el equipo de TiddlyWiki +PageTemplate/Description: la disposición por defecto de ~TiddlyWiki +PageTemplate/Name: ~PageTemplate por defecto PluginReloadWarning: Guarda {{$:/core/ui/Buttons/save-wiki}} y recarga {{$:/core/ui/Buttons/refresh}} para que los cambios surtan efecto. RecentChanges/DateFormat: DD MMM YYYY +Shortcuts/Input/AdvancedSearch/Hint: Abre el panel ~AdvancedSearch desde el campo de búsqueda de la barra lateral +Shortcuts/Input/Accept/Hint: Acepta el elemento seleccionado +Shortcuts/Input/AcceptVariant/Hint: Acepta el elemento seleccionado (variante) +Shortcuts/Input/Cancel/Hint: Vacía el campo de entrada +Shortcuts/Input/Down/Hint: Selecciona el siguiente elemento +Shortcuts/Input/Tab-Left/Hint: Selecciona la Pestaña anterior +Shortcuts/Input/Tab-Right/Hint: Selecciona la siguiente Pestaña +Shortcuts/Input/Up/Hint: Selecciona el elemento anterior +Shortcuts/SidebarLayout/Hint: Cambiar disposición barra lateral +Switcher/Subtitle/theme: Cambiar tema +Switcher/Subtitle/layout: Cambiar disposición +Switcher/Subtitle/language: Cambiar idioma +Switcher/Subtitle/palette: Cambiar paleta SystemTiddler/Tooltip: Este es un tiddler de sistema +SystemTiddlers/Include/Prompt: Incluir tiddlers del sistema TagManager/Colour/Heading: Color TagManager/Count/Heading: Número TagManager/Icon/Heading: Icono +TagManager/Icons/None: Ninguno TagManager/Info/Heading: Información TagManager/Tag/Heading: Etiqueta Tiddler/DateFormat: DD MMM YYYY a las hh:0mm UnsavedChangesWarning: Tienes cambios sin guardar en TiddlyWiki +Yes: Yes diff --git a/languages/es-ES/NewJournalTags.tid b/languages/es-ES/NewJournalTags.tid new file mode 100644 index 000000000..8a3fa5bf8 --- /dev/null +++ b/languages/es-ES/NewJournalTags.tid @@ -0,0 +1,3 @@ +title: $:/config/NewJournal/Tags + +Diario diff --git a/languages/es-ES/Notifications.multids b/languages/es-ES/Notifications.multids index c699dd0d0..2b2cdb051 100644 --- a/languages/es-ES/Notifications.multids +++ b/languages/es-ES/Notifications.multids @@ -1,4 +1,6 @@ title: $:/language/Notifications/ Save/Done: Guardado -Save/Starting: Comenzando a guardar +Save/Starting: Comenzando a guardar wiki +CopiedToClipboard/Succeeded: ¡Copiado al portapapeles! +CopiedToClipboard/Failed: ¡No se pudo copiar al portapapeles! diff --git a/languages/es-ES/Search.multids b/languages/es-ES/Search.multids index 3ed5f4d12..d1eb495d4 100644 --- a/languages/es-ES/Search.multids +++ b/languages/es-ES/Search.multids @@ -8,6 +8,7 @@ Matches: //<small><<resultCount>> coincidencias </small>// Matches/All: Cualquier coincidencia Matches/Title: En título Search: Búsqueda +Search/TooShort: Texto de búsqueda demasiado corto Shadows/Caption: Ocultos Shadows/Hint: Busca en los tiddlers ocultos Shadows/Matches: //<small><<resultCount>> coincidencias </small>// diff --git a/languages/es-ES/SideBar.multids b/languages/es-ES/SideBar.multids index 6723fa5a2..5aa0ed207 100644 --- a/languages/es-ES/SideBar.multids +++ b/languages/es-ES/SideBar.multids @@ -3,6 +3,7 @@ title: $:/language/SideBar/ All/Caption: Todos Contents/Caption: Contenido Drafts/Caption: Borradores +Explorer/Caption: Explorar Missing/Caption: Vacíos More/Caption: Más Open/Caption: Abiertos diff --git a/languages/es-ES/ThemeTweaks.multids b/languages/es-ES/ThemeTweaks.multids new file mode 100644 index 000000000..cf2351de3 --- /dev/null +++ b/languages/es-ES/ThemeTweaks.multids @@ -0,0 +1,42 @@ +title: $:/language/ThemeTweaks/ + +ThemeTweaks: Ajustes del tema +ThemeTweaks/Hint: Puedes modificar ciertos aspectos del tema ''Vanilla''. +Options: Opciones +Options/SidebarLayout: Diseño de la barra lateral +Options/SidebarLayout/Fixed-Fluid: Visor fijado, Herramientas fluido +Options/SidebarLayout/Fluid-Fixed: Visor fluido, Herramientas fijado +Options/StickyTitles: Títulos fijos +Options/StickyTitles/Hint: Hace que los títulos de tiddler se "peguen" en la parte superior de la ventana del navegador +Options/CodeWrapping: Envuelve líneas largas en bloques de código +Settings: Configuración +Settings/FontFamily: Fuente de texto +Settings/CodeFontFamily: Fuente de texto para código +Settings/EditorFontFamily: Fuente de texto para editor +Settings/BackgroundImage: Imagen de fondo de la página +Settings/BackgroundImageAttachment: Archivo adjunto de imagen de fondo de página +Settings/BackgroundImageAttachment/Scroll: Desplazamiento con tiddlers +Settings/BackgroundImageAttachment/Fixed: Fijo en la ventana +Settings/BackgroundImageSize: Tamaño de la imagen de fondo de la página +Settings/BackgroundImageSize/Auto: Automático +Settings/BackgroundImageSize/Cover: Rellenar +Settings/BackgroundImageSize/Contain: Contenido +Metrics: Tamaños +Metrics/FontSize: Tamaño de fuente +Metrics/LineHeight: Altura de línea +Metrics/BodyFontSize: Tamaño de fuente para el cuerpo del tiddler +Metrics/BodyLineHeight: Altura de la línea para el cuerpo del tiddler +Metrics/StoryLeft: Posición izquierda del visor +Metrics/StoryLeft/Hint: Distancia del visor del margen izquierdo de la página +Metrics/StoryTop: Posición superior del visor +Metrics/StoryTop/Hint: Distancia del visor del margen superior de la página +Metrics/StoryRight: Visor derecha +Metrics/StoryRight/Hint: Distancia de la barra lateral del margen izquierdo de la página +Metrics/StoryWidth: Visor ancho +Metrics/StoryWidth/Hint: Ancho total del visor +Metrics/TiddlerWidth: Ancho de Tiddler +Metrics/TiddlerWidth/Hint: dentro del visor +Metrics/SidebarBreakpoint: Punto ruptura barra lateral +Metrics/SidebarBreakpoint/Hint: el ancho mínimo de página en el que el visor y<br> la barra lateral aparecerán una al lado de la otra. +Metrics/SidebarWidth: Ancho barra lateral +Metrics/SidebarWidth/Hint: el ancho de la barra lateral en un diseño fluido-fijo diff --git a/languages/es-ES/TiddlerInfo.multids b/languages/es-ES/TiddlerInfo.multids index a8aefc911..145e86826 100644 --- a/languages/es-ES/TiddlerInfo.multids +++ b/languages/es-ES/TiddlerInfo.multids @@ -2,13 +2,13 @@ title: $:/language/TiddlerInfo/ Advanced/Caption: Avanzado Advanced/PluginInfo/Empty/Hint: No se han instalado -Advanced/PluginInfo/Heading: Detalles del plugin +Advanced/PluginInfo/Heading: Detalles del complemento Advanced/PluginInfo/Hint: Este plugin contiene los siguientes tiddlers ocultos Advanced/ShadowInfo/Heading: Oculto Advanced/ShadowInfo/NotShadow/Hint: El tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> no es de tipo oculto -Advanced/ShadowInfo/OverriddenShadow/Hint: Anulado por un tiddler estándar Advanced/ShadowInfo/Shadow/Hint: El tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> es de tipo oculto Advanced/ShadowInfo/Shadow/Source: Definido en el plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link> +Advanced/ShadowInfo/OverriddenShadow/Hint: Anulado por un tiddler estándar Fields/Caption: Campos List/Caption: Lista List/Empty: Este tiddler no contiene listas diff --git a/languages/es-ES/Types/application%2Fjavascript.tid b/languages/es-ES/Types/application_javascript.tid similarity index 90% rename from languages/es-ES/Types/application%2Fjavascript.tid rename to languages/es-ES/Types/application_javascript.tid index 97315c17f..519f54ccc 100644 --- a/languages/es-ES/Types/application%2Fjavascript.tid +++ b/languages/es-ES/Types/application_javascript.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/application/javascript description: Código JavaScript name: application/javascript group: Desarrollador +group-sort: 2 diff --git a/languages/es-ES/Types/application%2Fjson.tid b/languages/es-ES/Types/application_json.tid similarity index 89% rename from languages/es-ES/Types/application%2Fjson.tid rename to languages/es-ES/Types/application_json.tid index 5a67916ca..60cd774f3 100644 --- a/languages/es-ES/Types/application%2Fjson.tid +++ b/languages/es-ES/Types/application_json.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/application/json description: Datos JSON name: application/json group: Desarrollador +group-sort: 2 diff --git a/languages/es-ES/Types/application%2Fx-tiddler-dictionary.tid b/languages/es-ES/Types/application_x_tiddler_dictionary.tid similarity index 91% rename from languages/es-ES/Types/application%2Fx-tiddler-dictionary.tid rename to languages/es-ES/Types/application_x_tiddler_dictionary.tid index 91a1ecd65..f64953721 100644 --- a/languages/es-ES/Types/application%2Fx-tiddler-dictionary.tid +++ b/languages/es-ES/Types/application_x_tiddler_dictionary.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/application/x-tiddler-dictionary description: Diccionario de datos name: application/x-tiddler-dictionary group: Desarrollador +group-sort: 2 diff --git a/languages/es-ES/Types/image%2Fgif.tid b/languages/es-ES/Types/image_gif.tid similarity index 87% rename from languages/es-ES/Types/image%2Fgif.tid rename to languages/es-ES/Types/image_gif.tid index 64c4b96e5..057fc161c 100644 --- a/languages/es-ES/Types/image%2Fgif.tid +++ b/languages/es-ES/Types/image_gif.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/image/gif description: Imagen .GIF name: image/gif group: Imagen +group-sort: 1 diff --git a/languages/es-ES/Types/image%2Fjpeg.tid b/languages/es-ES/Types/image_jpeg.tid similarity index 87% rename from languages/es-ES/Types/image%2Fjpeg.tid rename to languages/es-ES/Types/image_jpeg.tid index 04d3c8466..663c7347e 100644 --- a/languages/es-ES/Types/image%2Fjpeg.tid +++ b/languages/es-ES/Types/image_jpeg.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/image/jpeg description: Imagen .JPEG name: image/jpeg group: Imagen +group-sort: 1 diff --git a/languages/es-ES/Types/image%2Fpng.tid b/languages/es-ES/Types/image_png.tid similarity index 87% rename from languages/es-ES/Types/image%2Fpng.tid rename to languages/es-ES/Types/image_png.tid index 5abbb4a7d..c9085fc84 100644 --- a/languages/es-ES/Types/image%2Fpng.tid +++ b/languages/es-ES/Types/image_png.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/image/png description: Imagen .PNG name: image/png group: Imagen +group-sort: 1 diff --git a/languages/es-ES/Types/image%2Fsvg%2Bxml.tid b/languages/es-ES/Types/image_svg_xml.tid similarity index 88% rename from languages/es-ES/Types/image%2Fsvg%2Bxml.tid rename to languages/es-ES/Types/image_svg_xml.tid index 04fb05653..ce88de09d 100644 --- a/languages/es-ES/Types/image%2Fsvg%2Bxml.tid +++ b/languages/es-ES/Types/image_svg_xml.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/image/svg+xml description: Imagen .SVG name: image/svg+xml group: Imagen +group-sort: 1 diff --git a/languages/es-ES/Types/image%2Fx-icon.tid b/languages/es-ES/Types/image_x-icon.tid similarity index 89% rename from languages/es-ES/Types/image%2Fx-icon.tid rename to languages/es-ES/Types/image_x-icon.tid index fc7d4fb8a..9a3574bca 100644 --- a/languages/es-ES/Types/image%2Fx-icon.tid +++ b/languages/es-ES/Types/image_x-icon.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/image/x-icon description: Archivo de icono en formato .ICO name: image/x-icon group: Imagen +group-sort: 1 diff --git a/languages/es-ES/Types/text%2Fcss.tid b/languages/es-ES/Types/text_css.tid similarity index 89% rename from languages/es-ES/Types/text%2Fcss.tid rename to languages/es-ES/Types/text_css.tid index 8fbc64f22..b579938bc 100644 --- a/languages/es-ES/Types/text%2Fcss.tid +++ b/languages/es-ES/Types/text_css.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/text/css description: Hoja de estilos estática name: text/css group: Desarrollador +group-sort: 2 diff --git a/languages/es-ES/Types/text%2Fhtml.tid b/languages/es-ES/Types/text_html.tid similarity index 88% rename from languages/es-ES/Types/text%2Fhtml.tid rename to languages/es-ES/Types/text_html.tid index 803c33f07..6fa3c8995 100644 --- a/languages/es-ES/Types/text%2Fhtml.tid +++ b/languages/es-ES/Types/text_html.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/text/html description: Lenguaje de marcado HTML name: text/html group: Texto +group-sort: 0 diff --git a/languages/es-ES/Types/text%2Fplain.tid b/languages/es-ES/Types/text_plain.tid similarity index 87% rename from languages/es-ES/Types/text%2Fplain.tid rename to languages/es-ES/Types/text_plain.tid index 6b6cbd5f3..fd52f2176 100644 --- a/languages/es-ES/Types/text%2Fplain.tid +++ b/languages/es-ES/Types/text_plain.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/text/plain description: Texto plano name: text/plain group: Texto +group-sort: 0 diff --git a/languages/es-ES/Types/text%2Fvnd.tiddlywiki.tid b/languages/es-ES/Types/text_vnd.tiddlywiki.tid similarity index 89% rename from languages/es-ES/Types/text%2Fvnd.tiddlywiki.tid rename to languages/es-ES/Types/text_vnd.tiddlywiki.tid index 510953fec..951b6fb6d 100644 --- a/languages/es-ES/Types/text%2Fvnd.tiddlywiki.tid +++ b/languages/es-ES/Types/text_vnd.tiddlywiki.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/text/vnd.tiddlywiki description: TiddlyWiki 5 name: text/vnd.tiddlywiki group: Texto +group-sort: 0 diff --git a/languages/es-ES/Types/text%2Fx-tiddlywiki.tid b/languages/es-ES/Types/text_x-tiddlywiki.tid similarity index 89% rename from languages/es-ES/Types/text%2Fx-tiddlywiki.tid rename to languages/es-ES/Types/text_x-tiddlywiki.tid index 802e23ce2..c5864db65 100644 --- a/languages/es-ES/Types/text%2Fx-tiddlywiki.tid +++ b/languages/es-ES/Types/text_x-tiddlywiki.tid @@ -2,3 +2,4 @@ title: $:/language/Docs/Types/text/x-tiddlywiki description: TiddlyWiki Classic name: text/x-tiddlywiki group: Texto +group-sort: 0 diff --git a/languages/es-ES/plugin.info b/languages/es-ES/plugin.info index 63ea93a35..b144f8fdf 100644 --- a/languages/es-ES/plugin.info +++ b/languages/es-ES/plugin.info @@ -3,6 +3,6 @@ "name": "es-ES", "plugin-type": "language", "description": "Castellano. (Spain)", - "author": "Pau DeLuca", - "core-version": ">=5.0.0" -} \ No newline at end of file + "author": "Pau DeLuca,Joe Bordes", + "core-version": ">=5.1.23" +} From 1a6d3e686b0b057fc31e6b92b9eb0ba0a659e519 Mon Sep 17 00:00:00 2001 From: Joe Bordes <joe@tsolucio.com> Date: Sun, 30 May 2021 19:49:57 +0200 Subject: [PATCH 1362/2376] i18n(EditorPreview) translate difference view caption (#5732) --- core/language/en-GB/EditTemplate.multids | 2 ++ core/ui/EditTemplate/Preview/diffs-current.tid | 2 +- core/ui/EditTemplate/Preview/diffs-shadow.tid | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/language/en-GB/EditTemplate.multids b/core/language/en-GB/EditTemplate.multids index 8072ba42d..fc436059e 100644 --- a/core/language/en-GB/EditTemplate.multids +++ b/core/language/en-GB/EditTemplate.multids @@ -3,6 +3,8 @@ title: $:/language/EditTemplate/ 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/Preview/Type/Output: output +Body/Preview/Type/DiffShadow: differences from shadow (if any) +Body/Preview/Type/DiffCurrent: differences from current Field/Remove/Caption: remove field Field/Remove/Hint: Remove field Field/Dropdown/Caption: field list diff --git a/core/ui/EditTemplate/Preview/diffs-current.tid b/core/ui/EditTemplate/Preview/diffs-current.tid index 07a6ef647..b552af6b8 100644 --- a/core/ui/EditTemplate/Preview/diffs-current.tid +++ b/core/ui/EditTemplate/Preview/diffs-current.tid @@ -1,6 +1,6 @@ title: $:/core/ui/EditTemplate/body/preview/diffs-current tags: $:/tags/EditPreview -caption: differences from current +caption: {{$:/language/EditTemplate/Body/Preview/Type/DiffCurrent}} list-after: $:/core/ui/EditTemplate/body/preview/output <$list filter="[<currentTiddler>!is[image]]" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}> diff --git a/core/ui/EditTemplate/Preview/diffs-shadow.tid b/core/ui/EditTemplate/Preview/diffs-shadow.tid index 7abfd3952..a9b94e8f3 100644 --- a/core/ui/EditTemplate/Preview/diffs-shadow.tid +++ b/core/ui/EditTemplate/Preview/diffs-shadow.tid @@ -1,6 +1,6 @@ title: $:/core/ui/EditTemplate/body/preview/diffs-shadow tags: $:/tags/EditPreview -caption: differences from shadow (if any) +caption: {{$:/language/EditTemplate/Body/Preview/Type/DiffShadow}} list-after: $:/core/ui/EditTemplate/body/preview/output <$list filter="[<currentTiddler>!is[image]]" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}> From 51fd02d9b6f2cb2cda8daee649f597be31352f73 Mon Sep 17 00:00:00 2001 From: Joe Bordes <joe@tsolucio.com> Date: Sun, 30 May 2021 19:51:44 +0200 Subject: [PATCH 1363/2376] i18n(en-GB) apply grammarly recommendations found while translating es-ES (#5733) --- core/language/en-GB/ControlPanel.multids | 2 +- core/language/en-GB/Help/listen.tid | 6 +++--- core/language/en-GB/Help/render.tid | 2 +- core/language/en-GB/Help/save.tid | 2 +- core/language/en-GB/Import.multids | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index 6b8a68ed5..5c105edbb 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -128,7 +128,7 @@ Saving/TiddlySpot/Filename: Upload Filename Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.// Saving/TiddlySpot/Password: Password -Saving/TiddlySpot/ReadOnly: Note that [[TiddlySpot|http://tiddlyspot.com]] no longer allows the creation of new sites. For new sites you can use [[TiddlyHost|https://tiddlyhost.com]], a new hosting service which replaces ~TiddlySpot. +Saving/TiddlySpot/ReadOnly: Note that [[TiddlySpot|http://tiddlyspot.com]] no longer allows the creation of new sites. For new sites, you can use [[TiddlyHost|https://tiddlyhost.com]], a new hosting service that replaces ~TiddlySpot. Saving/TiddlySpot/ServerURL: Server URL Saving/TiddlySpot/UploadDir: Upload Directory Saving/TiddlySpot/UserName: Wiki Name diff --git a/core/language/en-GB/Help/listen.tid b/core/language/en-GB/Help/listen.tid index 7e6986c74..41425637f 100644 --- a/core/language/en-GB/Help/listen.tid +++ b/core/language/en-GB/Help/listen.tid @@ -19,8 +19,8 @@ All parameters are optional with safe defaults, and can be specified in any orde * ''username'' - optional username for basic authentication * ''password'' - optional password for basic authentication * ''authenticated-user-header'' - optional name of header to be used for trusted authentication -* ''readers'' - comma separated list of principals allowed to read from this wiki -* ''writers'' - comma separated list of principals allowed to write to this wiki +* ''readers'' - comma-separated list of principals allowed to read from this wiki +* ''writers'' - comma-separated list of principals allowed to write to this wiki * ''csrf-disable'' - set to "yes" to disable CSRF checks (defaults to "no") * ''sse-enabled'' - set to "yes" to enable Server-sent events (defaults to "no") * ''root-tiddler'' - the tiddler to serve at the root (defaults to "$:/core/save/all") @@ -30,7 +30,7 @@ All parameters are optional with safe defaults, and can be specified in any orde * ''tls-key'' - pathname of TLS key file (relative to wiki folder) * ''debug-level'' - optional debug level; set to "debug" to view request details (defaults to "none") * ''gzip'' - set to "yes" to enable gzip compression for some http endpoints (defaults to "no") -* ''use-browser-cache'' - set to "yes" to allow the browser to cache responses to save bandwith (defaults to "no") +* ''use-browser-cache'' - set to "yes" to allow the browser to cache responses to save bandwidth (defaults to "no") For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com. diff --git a/core/language/en-GB/Help/render.tid b/core/language/en-GB/Help/render.tid index 47be85517..2cd489eef 100644 --- a/core/language/en-GB/Help/render.tid +++ b/core/language/en-GB/Help/render.tid @@ -24,7 +24,7 @@ Notes: * The output directory is not cleared of any existing files * Any missing directories in the path to the filename are automatically created. -* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render "[[Motovun Jack.jpg]]"` +* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--render "[[Motovun Jack.jpg]]"` * The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/` * Multiple ''name''/''value'' pairs can be used to pass more than one variable * The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated diff --git a/core/language/en-GB/Help/save.tid b/core/language/en-GB/Help/save.tid index cb9971cf9..c178a5314 100644 --- a/core/language/en-GB/Help/save.tid +++ b/core/language/en-GB/Help/save.tid @@ -16,7 +16,7 @@ Notes: * The output directory is not cleared of any existing files * Any missing directories in the path to the filename are automatically created. -* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save "[[Motovun Jack.jpg]]"` +* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--save "[[Motovun Jack.jpg]]"` * The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/` * The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated diff --git a/core/language/en-GB/Import.multids b/core/language/en-GB/Import.multids index 77e00a111..074ec5806 100644 --- a/core/language/en-GB/Import.multids +++ b/core/language/en-GB/Import.multids @@ -1,6 +1,6 @@ title: $:/language/Import/ -Editor/Import/Heading: Import images and insert into the editor. +Editor/Import/Heading: Import images and insert them into the editor. Imported/Hint: The following tiddlers were imported: Listing/Cancel/Caption: Cancel Listing/Hint: These tiddlers are ready to import: From 82ec63e71118f9ee788972371f713579bae67530 Mon Sep 17 00:00:00 2001 From: Joe Bordes <joe@tsolucio.com> Date: Sun, 30 May 2021 20:20:17 +0200 Subject: [PATCH 1364/2376] style(App) eliminate whitespace at the end of code lines (#5735) --- boot/boot.js | 8 ++++---- core/modules/commander.js | 2 +- core/modules/commands/fetch.js | 2 +- core/modules/commands/rendertiddlers.js | 2 +- core/modules/commands/savewikifolder.js | 2 +- core/modules/deserializers.js | 2 +- core/modules/editor/engines/framed.js | 5 ++--- core/modules/editor/factory.js | 7 +++---- core/modules/filterrunprefixes/reduce.js | 2 +- core/modules/filterrunprefixes/sort.js | 2 +- core/modules/filters.js | 8 ++++---- core/modules/filters/editiondescription.js | 2 +- core/modules/filters/fields.js | 2 +- core/modules/filters/format/date.js | 4 ++-- core/modules/filters/format/relativedate.js | 4 ++-- core/modules/filters/has.js | 2 +- core/modules/filters/is/draft.js | 2 +- core/modules/filters/strings.js | 8 ++++---- core/modules/filters/tag.js | 2 +- core/modules/filters/x-listops.js | 10 +++++----- core/modules/indexers/field-indexer.js | 2 +- core/modules/indexers/tag-indexer.js | 4 ++-- core/modules/info/platform.js | 2 +- .../modules/parsers/wikiparser/rules/table.js | 2 +- core/modules/parsers/wikiparser/wikiparser.js | 2 +- core/modules/savers/upload.js | 2 +- core/modules/server/routes/get-login-basic.js | 2 +- core/modules/server/server.js | 6 +++--- core/modules/startup/favicon.js | 2 +- core/modules/startup/rootwidget.js | 4 ++-- core/modules/startup/story.js | 4 ++-- core/modules/storyviews/classic.js | 2 +- core/modules/utils/csv.js | 2 +- core/modules/utils/dom/dom.js | 4 ++-- core/modules/utils/dom/dragndrop.js | 4 ++-- core/modules/utils/dom/modal.js | 2 +- core/modules/utils/dom/popup.js | 2 +- core/modules/utils/dom/scroller.js | 6 +++--- core/modules/utils/filesystem.js | 4 ++-- core/modules/utils/logger.js | 4 ++-- core/modules/utils/performance.js | 2 +- core/modules/utils/utils.js | 4 ++-- core/modules/widgets/action-deletefield.js | 2 +- core/modules/widgets/action-listops.js | 2 +- core/modules/widgets/action-log.js | 6 +++--- core/modules/widgets/button.js | 2 +- core/modules/widgets/droppable.js | 4 ++-- core/modules/widgets/dropzone.js | 4 ++-- core/modules/widgets/edit-bitmap.js | 2 +- core/modules/widgets/edit-shortcut.js | 6 +++--- core/modules/widgets/element.js | 2 +- core/modules/widgets/entity.js | 2 +- core/modules/widgets/eventcatcher.js | 6 +++--- core/modules/widgets/fieldmangler.js | 4 ++-- core/modules/widgets/image.js | 10 +++++----- core/modules/widgets/importvariables.js | 2 +- core/modules/widgets/link.js | 2 +- core/modules/widgets/linkcatcher.js | 2 +- core/modules/widgets/log.js | 2 +- core/modules/widgets/macrocall.js | 2 +- core/modules/widgets/navigator.js | 6 +++--- core/modules/widgets/raw.js | 2 +- core/modules/widgets/reveal.js | 6 +++--- core/modules/widgets/scrollable.js | 6 +++--- core/modules/widgets/setvariable.js | 4 ++-- core/modules/widgets/text.js | 2 +- core/modules/widgets/tiddler.js | 2 +- core/modules/widgets/transclude.js | 2 +- core/modules/widgets/vars.js | 2 +- core/modules/widgets/view.js | 6 +++--- core/modules/widgets/widget.js | 2 +- core/modules/widgets/wikify.js | 2 +- core/modules/wiki.js | 20 +++++++++---------- 73 files changed, 134 insertions(+), 136 deletions(-) diff --git a/boot/boot.js b/boot/boot.js index ba780a109..8d74b2e1b 100644 --- a/boot/boot.js +++ b/boot/boot.js @@ -1154,7 +1154,7 @@ $tw.Wiki = function(options) { var index = tiddlerTitles.indexOf(title); if(index !== -1) { tiddlerTitles.splice(index,1); - } + } } // Record the new tiddler state updateDescriptor["new"] = { @@ -1301,7 +1301,7 @@ $tw.Wiki = function(options) { } } else { if(pluginInfo[title]) { - delete pluginInfo[title]; + delete pluginInfo[title]; results.deletedPlugins.push(title); } } @@ -1940,7 +1940,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) { } } else { console.log("Warning: a directory in a tiddlywiki.files file does not exist."); - console.log("dirPath: " + dirPath); + console.log("dirPath: " + dirPath); console.log("tiddlywiki.files location: " + filepath); } } @@ -2199,7 +2199,7 @@ $tw.loadTiddlersNode = function() { type = parts[0]; if(parts.length === 3 && ["plugins","themes","languages"].indexOf(type) !== -1) { $tw.loadPlugins([parts[1] + "/" + parts[2]],$tw.config[type + "Path"],$tw.config[type + "EnvVar"]); - } + } } }); // Load the tiddlers from the wiki directory diff --git a/core/modules/commander.js b/core/modules/commander.js index 302af525b..b55679a2e 100644 --- a/core/modules/commander.js +++ b/core/modules/commander.js @@ -154,7 +154,7 @@ Commander.prototype.extractNamedParameters = function(params,mandatoryParameters if(errors.length > 0) { return errors.join(" and\n"); } else { - return paramsByName; + return paramsByName; } }; diff --git a/core/modules/commands/fetch.js b/core/modules/commands/fetch.js index 8d0997010..07cda691c 100644 --- a/core/modules/commands/fetch.js +++ b/core/modules/commands/fetch.js @@ -115,7 +115,7 @@ Command.prototype.fetchFile = function(url,options,callback,redirectCount) { if(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) { return self.fetchFile(response.headers.location,options,callback,redirectCount + 1); } else { - return callback("Error " + response.statusCode + " retrieving " + url) + return callback("Error " + response.statusCode + " retrieving " + url) } } }); diff --git a/core/modules/commands/rendertiddlers.js b/core/modules/commands/rendertiddlers.js index dd875e3eb..01af09649 100644 --- a/core/modules/commands/rendertiddlers.js +++ b/core/modules/commands/rendertiddlers.js @@ -36,7 +36,7 @@ Command.prototype.execute = function() { filter = this.params[0], template = this.params[1], outputPath = this.commander.outputPath, - pathname = path.resolve(outputPath,this.params[2]), + pathname = path.resolve(outputPath,this.params[2]), type = this.params[3] || "text/html", extension = this.params[4] || ".html", deleteDirectory = (this.params[5] || "").toLowerCase() !== "noclean", diff --git a/core/modules/commands/savewikifolder.js b/core/modules/commands/savewikifolder.js index cd4b5f26e..406f3a3b2 100644 --- a/core/modules/commands/savewikifolder.js +++ b/core/modules/commands/savewikifolder.js @@ -97,7 +97,7 @@ WikiFolderMaker.prototype.save = function() { // A custom plugin self.log("Processing custom plugin: " + title); self.saveCustomPlugin(tiddler); - } + } } else { // Ordinary tiddler self.saveTiddler("tiddlers",tiddler); diff --git a/core/modules/deserializers.js b/core/modules/deserializers.js index 3139a2611..47e891ed7 100644 --- a/core/modules/deserializers.js +++ b/core/modules/deserializers.js @@ -31,7 +31,7 @@ var parseTiddlerDiv = function(text /* [,fields] */) { for(var f=1; f<arguments.length; f++) { var fields = arguments[f]; for(var t in fields) { - result[t] = fields[t]; + result[t] = fields[t]; } } } diff --git a/core/modules/editor/engines/framed.js b/core/modules/editor/engines/framed.js index 724c4e7f3..2266ce742 100644 --- a/core/modules/editor/engines/framed.js +++ b/core/modules/editor/engines/framed.js @@ -78,7 +78,7 @@ function FramedEngine(options) { } if(this.widget.isDisabled === "yes") { this.domNode.setAttribute("disabled",true); - } + } // Copy the styles from the dummy textarea this.copyStyles(); // Add event listeners @@ -87,7 +87,6 @@ function FramedEngine(options) { {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"}, {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"} - ]); // Add drag and drop event listeners if fileDrop is enabled if(this.widget.isFileDropEnabled) { @@ -183,7 +182,7 @@ Handle a focus event */ FramedEngine.prototype.handleFocusEvent = function(event) { if(this.widget.editCancelPopups) { - $tw.popup.cancel(0); + $tw.popup.cancel(0); } }; diff --git a/core/modules/editor/factory.js b/core/modules/editor/factory.js index dd362be16..601ad2d64 100644 --- a/core/modules/editor/factory.js +++ b/core/modules/editor/factory.js @@ -313,7 +313,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { }); return newEvent; }; - + EditTextWidget.prototype.dispatchDOMEvent = function(newEvent) { var dispatchNode = this.engine.iframeNode || this.engine.parentNode; return dispatchNode.dispatchEvent(newEvent); @@ -358,7 +358,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { event.preventDefault(); } event.dataTransfer.dropEffect = "copy"; - return this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"])); + return this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"])); } return true; }; @@ -375,13 +375,12 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) { EditTextWidget.prototype.handleDragEndEvent = function(event) { this.dispatchDOMEvent(this.cloneEvent(event)); }; - + EditTextWidget.prototype.handleClickEvent = function(event) { return !this.dispatchDOMEvent(this.cloneEvent(event)); }; return EditTextWidget; - } exports.editTextWidgetFactory = editTextWidgetFactory; diff --git a/core/modules/filterrunprefixes/reduce.js b/core/modules/filterrunprefixes/reduce.js index 33ec25c7f..3ec30f491 100644 --- a/core/modules/filterrunprefixes/reduce.js +++ b/core/modules/filterrunprefixes/reduce.js @@ -44,7 +44,7 @@ exports.reduce = function(operationSubFunction,options) { ++index; }); results.clear(); - results.push(accumulator); + results.push(accumulator); } } }; diff --git a/core/modules/filterrunprefixes/sort.js b/core/modules/filterrunprefixes/sort.js index ecaba9313..7bf8142c6 100644 --- a/core/modules/filterrunprefixes/sort.js +++ b/core/modules/filterrunprefixes/sort.js @@ -23,7 +23,7 @@ exports.sort = function(operationSubFunction,options) { inputTitles = results.toArray(), sortKeys = [], indexes = new Array(inputTitles.length), - compareFn; + compareFn; results.each(function(title) { var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{ getVariable: function(name) { diff --git a/core/modules/filters.js b/core/modules/filters.js index 89a9e8ccf..a5e02b543 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -101,10 +101,10 @@ function parseFilterOperation(operators,filterString,p) { } p = nextBracketPos + 1; } - + p = nextBracketPos + 1; parseOperand(bracket); - + // Check for multiple operands while(filterString.charAt(p) === ",") { p++; @@ -116,7 +116,7 @@ function parseFilterOperation(operators,filterString,p) { throw "Missing [ in filter expression"; } } - + // Push this operator operators.push(operator); } while(filterString.charAt(p) !== "]"); @@ -248,7 +248,7 @@ exports.compileFilter = function(filterString) { } else { operatorFunction = filterOperators[operator.operator]; } - + $tw.utils.each(operator.operands,function(operand) { if(operand.indirect) { operand.value = self.getTextReference(operand.text,"",currTiddlerTitle); diff --git a/core/modules/filters/editiondescription.js b/core/modules/filters/editiondescription.js index ee3acd898..2ee387163 100644 --- a/core/modules/filters/editiondescription.js +++ b/core/modules/filters/editiondescription.js @@ -22,7 +22,7 @@ exports.editiondescription = function(source,operator,options) { if(editionInfo) { source(function(tiddler,title) { if($tw.utils.hop(editionInfo,title)) { - results.push(editionInfo[title].description || ""); + results.push(editionInfo[title].description || ""); } }); } diff --git a/core/modules/filters/fields.js b/core/modules/filters/fields.js index 671a1e200..2f0bf26dc 100644 --- a/core/modules/filters/fields.js +++ b/core/modules/filters/fields.js @@ -20,7 +20,7 @@ exports.fields = function(source,operator,options) { fieldName, suffixes = (operator.suffixes || [])[0] || [], operand = $tw.utils.parseStringArray(operator.operand); - + source(function(tiddler,title) { if(tiddler) { if(suffixes.indexOf("include") !== -1) { diff --git a/core/modules/filters/format/date.js b/core/modules/filters/format/date.js index 1b29c5bfb..fcf1a5cad 100644 --- a/core/modules/filters/format/date.js +++ b/core/modules/filters/format/date.js @@ -13,13 +13,13 @@ module-type: formatfilteroperator Export our filter function */ exports.date = function(source,operand,options) { - var results = []; + var results = []; source(function(tiddler,title) { var value = $tw.utils.parseDate(title); if(value && $tw.utils.isDate(value) && value.toString() !== "Invalid Date") { results.push($tw.utils.formatDateString(value,operand || "YYYY MM DD 0hh:0mm")); } - }); + }); return results; }; diff --git a/core/modules/filters/format/relativedate.js b/core/modules/filters/format/relativedate.js index 262aeaaf2..f771bb339 100644 --- a/core/modules/filters/format/relativedate.js +++ b/core/modules/filters/format/relativedate.js @@ -13,13 +13,13 @@ module-type: formatfilteroperator Export our filter function */ exports.relativedate = function(source,operand,options) { - var results = []; + var results = []; source(function(tiddler,title) { var value = $tw.utils.parseDate(title); if(value && $tw.utils.isDate(value) && value.toString() !== "Invalid Date") { results.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description); } - }); + }); return results; }; diff --git a/core/modules/filters/has.js b/core/modules/filters/has.js index bdc267c70..f081809a3 100644 --- a/core/modules/filters/has.js +++ b/core/modules/filters/has.js @@ -61,7 +61,7 @@ exports.has = function(source,operator,options) { if(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) { results.push(title); } - }); + }); } } return results; diff --git a/core/modules/filters/is/draft.js b/core/modules/filters/is/draft.js index 3dd183a46..4888455ba 100644 --- a/core/modules/filters/is/draft.js +++ b/core/modules/filters/is/draft.js @@ -28,7 +28,7 @@ exports.draft = function(source,prefix,options) { if(tiddler && $tw.utils.hop(tiddler.fields,"draft.of") && (tiddler.fields["draft.of"].length !== 0)) { results.push(title); } - }); + }); } return results; }; diff --git a/core/modules/filters/strings.js b/core/modules/filters/strings.js index 38e5be231..286907dca 100644 --- a/core/modules/filters/strings.js +++ b/core/modules/filters/strings.js @@ -105,13 +105,13 @@ exports.splitregexp = function(source,operator,options) { flags = (suffix.indexOf("m") !== -1 ? "m" : "") + (suffix.indexOf("i") !== -1 ? "i" : ""), regExp; try { - regExp = new RegExp(operator.operand || "",flags); + regExp = new RegExp(operator.operand || "",flags); } catch(ex) { return ["RegExp error: " + ex]; } source(function(tiddler,title) { Array.prototype.push.apply(result,title.split(regExp)); - }); + }); return result; }; @@ -123,7 +123,7 @@ exports["search-replace"] = function(source,operator,options) { isRegExp = (suffixes[1] && suffixes[1][0] === "regexp") ? true : false, searchTerm, regExp; - + source(function(tiddler,title) { if(title && (operator.operands.length > 1)) { //Escape regexp characters if the operand is not a regular expression @@ -156,7 +156,7 @@ exports.pad = function(source,operator,options) { var padString = "", padStringLength = targetLength - title.length; while (padStringLength > padString.length) { - padString += fill; + padString += fill; } //make sure we do not exceed the specified length padString = padString.slice(0,padStringLength); diff --git a/core/modules/filters/tag.js b/core/modules/filters/tag.js index e7ddbb361..951a28c6b 100644 --- a/core/modules/filters/tag.js +++ b/core/modules/filters/tag.js @@ -50,7 +50,7 @@ exports.tag = function(source,operator,options) { }); results = options.wiki.sortByList(results,operator.operand); } - } + } } return results; }; diff --git a/core/modules/filters/x-listops.js b/core/modules/filters/x-listops.js index cb8c031a2..760f581a1 100644 --- a/core/modules/filters/x-listops.js +++ b/core/modules/filters/x-listops.js @@ -193,7 +193,7 @@ Extended filter operators to manipulate the current list. step = stepSize || 1, i = 0, opLength = operands.length, - nextOperandIndex; + nextOperandIndex; for(i; i < opLength; i++) { resultsIndex = results.indexOf(operands[i]); if(resultsIndex !== -1) { @@ -211,12 +211,12 @@ Extended filter operators to manipulate the current list. } else { results.push(operands[0]); } - return results; + return results; } /* Toggles an item in the current list. - */ + */ exports.toggle = function(source,operator) { return cycleValueInArray(prepare_results(source),operator.operands); } @@ -228,8 +228,8 @@ Extended filter operators to manipulate the current list. if(step < 0) { operands.reverse(); step = Math.abs(step); - } + } return cycleValueInArray(results,operands,step); } - + })(); diff --git a/core/modules/indexers/field-indexer.js b/core/modules/indexers/field-indexer.js index 0f070e5e5..e49583610 100644 --- a/core/modules/indexers/field-indexer.js +++ b/core/modules/indexers/field-indexer.js @@ -121,7 +121,7 @@ FieldIndexer.prototype.update = function(updateDescriptor) { indexEntry[value].push(updateDescriptor["new"].tiddler.fields.title); } } - }); + }); } }; diff --git a/core/modules/indexers/tag-indexer.js b/core/modules/indexers/tag-indexer.js index c7d297fc9..4721fea08 100644 --- a/core/modules/indexers/tag-indexer.js +++ b/core/modules/indexers/tag-indexer.js @@ -65,7 +65,7 @@ TagSubIndexer.prototype.rebuild = function() { } else { self.index[tag].titles.push(title); } - }); + }); }); }; @@ -83,7 +83,7 @@ TagSubIndexer.prototype.lookup = function(tag) { if(!indexRecord.isSorted) { if(this.indexer.wiki.sortByList) { indexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag); - } + } indexRecord.isSorted = true; } return indexRecord.titles; diff --git a/core/modules/info/platform.js b/core/modules/info/platform.js index b9c140956..0eb0b9ea8 100644 --- a/core/modules/info/platform.js +++ b/core/modules/info/platform.js @@ -22,7 +22,7 @@ exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) { if($tw.browser) { // Document location var setLocationProperty = function(name,value) { - infoTiddlerFields.push({title: "$:/info/url/" + name, text: value}); + infoTiddlerFields.push({title: "$:/info/url/" + name, text: value}); }, location = document.location; setLocationProperty("full", (location.toString()).split("#")[0]); diff --git a/core/modules/parsers/wikiparser/rules/table.js b/core/modules/parsers/wikiparser/rules/table.js index fb72f6890..61cd71948 100644 --- a/core/modules/parsers/wikiparser/rules/table.js +++ b/core/modules/parsers/wikiparser/rules/table.js @@ -161,7 +161,7 @@ exports.parse = function() { // Move the caption to the first row if it isn't already if(table.children.length !== 1) { table.children.pop(); // Take rowContainer out of the children array - table.children.splice(0,0,rowContainer); // Insert it at the bottom + table.children.splice(0,0,rowContainer); // Insert it at the bottom } // Set the alignment - TODO: figure out why TW did this // rowContainer.attributes.align = rowCount === 0 ? "top" : "bottom"; diff --git a/core/modules/parsers/wikiparser/wikiparser.js b/core/modules/parsers/wikiparser/wikiparser.js index e6f860a91..0f917b2b2 100644 --- a/core/modules/parsers/wikiparser/wikiparser.js +++ b/core/modules/parsers/wikiparser/wikiparser.js @@ -378,7 +378,7 @@ WikiParser.prototype.pushTextWidget = function(array,text) { text = $tw.utils.trim(text); } if(text) { - array.push({type: "text", text: text}); + array.push({type: "text", text: text}); } }; diff --git a/core/modules/savers/upload.js b/core/modules/savers/upload.js index a7264338d..6ac056ba9 100644 --- a/core/modules/savers/upload.js +++ b/core/modules/savers/upload.js @@ -50,7 +50,7 @@ UploadSaver.prototype.save = function(text,method,callback) { url = "http://" + username + ".tiddlyspot.com/store.cgi"; } // Assemble the header - var boundary = "---------------------------" + "AaB03x"; + var boundary = "---------------------------" + "AaB03x"; var uploadFormName = "UploadPlugin"; var head = []; head.push("--" + boundary + "\r\nContent-disposition: form-data; name=\"UploadPlugin\"\r\n"); diff --git a/core/modules/server/routes/get-login-basic.js b/core/modules/server/routes/get-login-basic.js index 2a71d6e33..d573a0b5d 100644 --- a/core/modules/server/routes/get-login-basic.js +++ b/core/modules/server/routes/get-login-basic.js @@ -22,7 +22,7 @@ exports.handler = function(request,response,state) { response.writeHead(401,{ "WWW-Authenticate": 'Basic realm="Please provide your username and password to login to ' + state.server.servername + '"' }); - response.end(); + response.end(); } else { // Redirect to the root wiki if login worked var location = ($tw.syncadaptor && $tw.syncadaptor.host)? $tw.syncadaptor.host: "/"; diff --git a/core/modules/server/server.js b/core/modules/server/server.js index ed3359dc1..b4859a2b4 100644 --- a/core/modules/server/server.js +++ b/core/modules/server/server.js @@ -42,7 +42,7 @@ function Server(options) { if(options.variables[variable]) { this.variables[variable] = options.variables[variable]; } - } + } } $tw.utils.extend({},this.defaultVariables,options.variables); // Initialise CSRF @@ -244,7 +244,7 @@ Server.prototype.requestHandler = function(request,response,options) { if(!this.csrfDisable && authorizationType === "writers" && request.headers["x-requested-with"] !== "TiddlyWiki") { response.writeHead(403,"'X-Requested-With' header required to login to '" + this.servername + "'"); response.end(); - return; + return; } // Check whether anonymous access is granted state.allowAnon = this.isAuthorized(authorizationType,null); @@ -253,7 +253,7 @@ Server.prototype.requestHandler = function(request,response,options) { if(!this.authenticators[0].authenticateRequest(request,response,state)) { // Bail if we failed (the authenticator will have sent the response) return; - } + } } // Authorize with the authenticated username if(!this.isAuthorized(authorizationType,state.authenticatedUsername)) { diff --git a/core/modules/startup/favicon.js b/core/modules/startup/favicon.js index 0e730905f..55e7891e2 100644 --- a/core/modules/startup/favicon.js +++ b/core/modules/startup/favicon.js @@ -17,7 +17,7 @@ exports.name = "favicon"; exports.platforms = ["browser"]; exports.after = ["startup"]; exports.synchronous = true; - + // Favicon tiddler var FAVICON_TITLE = "$:/favicon.ico"; diff --git a/core/modules/startup/rootwidget.js b/core/modules/startup/rootwidget.js index 353c25958..6486cf6a2 100644 --- a/core/modules/startup/rootwidget.js +++ b/core/modules/startup/rootwidget.js @@ -27,7 +27,7 @@ exports.startup = function() { }); $tw.rootWidget.addEventListener("tm-show-switcher",function(event) { $tw.modal.display("$:/core/ui/SwitcherModal",{variables: event.paramObject, event: event}); - }); + }); // Install the notification mechanism $tw.notifier = new $tw.utils.Notifier($tw.wiki); $tw.rootWidget.addEventListener("tm-notify",function(event) { @@ -68,7 +68,7 @@ exports.startup = function() { fullScreenDocument[fullscreen._exitFullscreen](); } else { fullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT); - } + } } }); } diff --git a/core/modules/startup/story.js b/core/modules/startup/story.js index 0ca975ce3..18f8e8f1d 100644 --- a/core/modules/startup/story.js +++ b/core/modules/startup/story.js @@ -101,7 +101,7 @@ exports.startup = function() { updateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,"no").trim(), targetTiddler: event.param || event.tiddlerTitle, copyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,"yes").trim() === "yes" ? "permaview" : "none" - }); + }); }); } }; @@ -165,7 +165,7 @@ function openStartupTiddlers(options) { story.addToHistory(target); } else if(storyList.length > 0) { story.addToHistory(storyList[0]); - } + } } } diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js index e5f726f5f..fe6925b99 100644 --- a/core/modules/storyviews/classic.js +++ b/core/modules/storyviews/classic.js @@ -32,7 +32,7 @@ ClassicStoryView.prototype.navigateTo = function(historyInfo) { } if(duration) { // Scroll the node into view - this.listWidget.dispatchEvent({type: "tm-scroll", target: targetElement}); + this.listWidget.dispatchEvent({type: "tm-scroll", target: targetElement}); } else { targetElement.scrollIntoView(); } diff --git a/core/modules/utils/csv.js b/core/modules/utils/csv.js index 37312d847..dec280d8b 100644 --- a/core/modules/utils/csv.js +++ b/core/modules/utils/csv.js @@ -38,7 +38,7 @@ exports.parseCsvStringWithHeader = function(text,options) { var columnName = headings[column]; columnResult[columnName] = $tw.utils.trim(columns[column] || ""); } - results.push(columnResult); + results.push(columnResult); } return results; } diff --git a/core/modules/utils/dom/dom.js b/core/modules/utils/dom/dom.js index 299011136..36c250b20 100644 --- a/core/modules/utils/dom/dom.js +++ b/core/modules/utils/dom/dom.js @@ -69,7 +69,7 @@ Get the first parent element that has scrollbars or use the body as fallback. */ exports.getScrollContainer = function(el) { var doc = el.ownerDocument; - while(el.parentNode) { + while(el.parentNode) { el = el.parentNode; if(el.scrollTop) { return el; @@ -208,7 +208,7 @@ exports.addEventListeners = function(domNode,events) { if(eventInfo.handlerMethod) { handler = function(event) { eventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event); - }; + }; } else { handler = eventInfo.handlerObject; } diff --git a/core/modules/utils/dom/dragndrop.js b/core/modules/utils/dom/dragndrop.js index 206846b9f..de30d49c7 100644 --- a/core/modules/utils/dom/dragndrop.js +++ b/core/modules/utils/dom/dragndrop.js @@ -27,7 +27,7 @@ exports.makeDraggable = function(options) { domNode = options.domNode; // Make the dom node draggable (not necessary for anchor tags) if((domNode.tagName || "").toLowerCase() !== "a") { - domNode.setAttribute("draggable","true"); + domNode.setAttribute("draggable","true"); } // Add event handlers $tw.utils.addEventListeners(domNode,[ @@ -80,7 +80,7 @@ exports.makeDraggable = function(options) { } // Set up the data transfer if(dataTransfer.clearData) { - dataTransfer.clearData(); + dataTransfer.clearData(); } var jsonData = []; if(titles.length > 1) { diff --git a/core/modules/utils/dom/modal.js b/core/modules/utils/dom/modal.js index db66b1abc..58ffba6a4 100644 --- a/core/modules/utils/dom/modal.js +++ b/core/modules/utils/dom/modal.js @@ -105,7 +105,7 @@ Modal.prototype.display = function(title,options) { parentWidget: $tw.rootWidget }); navigatorWidgetNode.render(modalBody,null); - + // Render the title of the message var headerWidgetNode = this.wiki.makeTranscludeWidget(title,{ field: "subtitle", diff --git a/core/modules/utils/dom/popup.js b/core/modules/utils/dom/popup.js index 4ae1a44cd..5eed80c88 100644 --- a/core/modules/utils/dom/popup.js +++ b/core/modules/utils/dom/popup.js @@ -145,7 +145,7 @@ Popup.prototype.show = function(options) { } // Add the click handler if we have any popups if(this.popups.length > 0) { - this.rootElement.addEventListener("click",this,true); + this.rootElement.addEventListener("click",this,true); } }; diff --git a/core/modules/utils/dom/scroller.js b/core/modules/utils/dom/scroller.js index 3f4c71cef..8e49a1f1d 100644 --- a/core/modules/utils/dom/scroller.js +++ b/core/modules/utils/dom/scroller.js @@ -52,7 +52,7 @@ PageScroller.prototype.handleEvent = function(event) { if(event.paramObject && event.paramObject.selector) { this.scrollSelectorIntoView(null,event.paramObject.selector); } else { - this.scrollIntoView(event.target); + this.scrollIntoView(event.target); } return false; // Event was handled } @@ -103,7 +103,7 @@ PageScroller.prototype.scrollIntoView = function(element,callback) { if(duration <= 0) { t = 1; } else { - t = ((Date.now()) - self.startTime) / duration; + t = ((Date.now()) - self.startTime) / duration; } if(t >= 1) { self.cancelScroll(srcWindow); @@ -126,7 +126,7 @@ PageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,ca baseElement = baseElement || document.body; var element = baseElement.querySelector(selector); if(element) { - this.scrollIntoView(element,callback); + this.scrollIntoView(element,callback); } }; diff --git a/core/modules/utils/filesystem.js b/core/modules/utils/filesystem.js index 121cbc4c7..25392e738 100644 --- a/core/modules/utils/filesystem.js +++ b/core/modules/utils/filesystem.js @@ -372,7 +372,7 @@ exports.generateTiddlerFilepath = function(title,options) { // If the resulting filename is blank (eg because the title is just punctuation) if(!filepath || /^_+$/g.test(filepath)) { // ...then just use the character codes of the title - filepath = ""; + filepath = ""; $tw.utils.each(title.split(""),function(char) { if(filepath) { filepath += "-"; @@ -488,7 +488,7 @@ exports.deleteTiddlerFile = function(fileInfo,callback) { fs.unlink(fileInfo.filepath,function(err) { if(err) { return callback(err); - } + } // Delete the metafile if present if(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + ".meta")) { fs.unlink(fileInfo.filepath + ".meta",function(err) { diff --git a/core/modules/utils/logger.js b/core/modules/utils/logger.js index b3981986d..7dc35899f 100644 --- a/core/modules/utils/logger.js +++ b/core/modules/utils/logger.js @@ -45,7 +45,7 @@ Logger.prototype.log = function(/* args */) { self.saveBufferLogger.buffer += " " + arg; }); this.saveBufferLogger.buffer += "\n"; - 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) { 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())); @@ -111,7 +111,7 @@ Logger.prototype.alert = function(/* args */) { } else { // Print an orange message to the console if not in the browser console.error("\x1b[1;33m" + text + "\x1b[0m"); - } + } } }; diff --git a/core/modules/utils/performance.js b/core/modules/utils/performance.js index 9908be4d7..8a86d33c7 100644 --- a/core/modules/utils/performance.js +++ b/core/modules/utils/performance.js @@ -21,7 +21,7 @@ function Performance(enabled) { Performance.prototype.showGreeting = function() { if($tw.browser) { - this.logger.log("Execute $tw.perf.log(); to see filter execution timings"); + this.logger.log("Execute $tw.perf.log(); to see filter execution timings"); } }; diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index b1d82a427..9c29391ae 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -150,7 +150,7 @@ Convert a string to title case (ie capitalise each initial letter) exports.toTitleCase = function(str) { return (str || "").replace(/(^|\s)\S/g, function(c) {return c.toUpperCase();}); } - + /* Find the line break preceding a given position in a string Returns position immediately after that line break, or the start of the string @@ -842,7 +842,7 @@ exports.makeDataUri = function(text,type,_canonical_uri) { parts.push(type); parts.push(isBase64 ? ";base64" : ""); parts.push(","); - parts.push(isBase64 ? text : encodeURIComponent(text)); + parts.push(isBase64 ? text : encodeURIComponent(text)); } return parts.join(""); }; diff --git a/core/modules/widgets/action-deletefield.js b/core/modules/widgets/action-deletefield.js index 45425bf4e..5857ef64d 100644 --- a/core/modules/widgets/action-deletefield.js +++ b/core/modules/widgets/action-deletefield.js @@ -73,7 +73,7 @@ DeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) { } }); if(hasChanged) { - this.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields())); + this.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields())); } } return true; // Action was invoked diff --git a/core/modules/widgets/action-listops.js b/core/modules/widgets/action-listops.js index a3448ba71..802fcaa76 100644 --- a/core/modules/widgets/action-listops.js +++ b/core/modules/widgets/action-listops.js @@ -80,7 +80,7 @@ ActionListopsWidget.prototype.invokeAction = function(triggeringWidget, tagfilter = $tw.utils.stringifyList(oldtags) + " " + this.filtertags, newtags = this.wiki.filterTiddlers(tagfilter,this); if($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) { - this.wiki.setText(this.target,"tags",undefined,$tw.utils.stringifyList(newtags)); + this.wiki.setText(this.target,"tags",undefined,$tw.utils.stringifyList(newtags)); } } return true; // Action was invoked diff --git a/core/modules/widgets/action-log.js b/core/modules/widgets/action-log.js index eacef94bc..fc8412006 100644 --- a/core/modules/widgets/action-log.js +++ b/core/modules/widgets/action-log.js @@ -62,17 +62,17 @@ LogWidget.prototype.log = function() { $tw.utils.each(this.attributes,function(attribute,name) { if(name.substring(0,2) !== "$$") { data[name] = attribute; - } + } }); for(var v in this.variables) { allVars[v] = this.getVariable(v,{defaultValue:""}); - } + } if(this.filter) { filteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars)); $tw.utils.each(filteredVars,function(name) { data[name] = allVars[name]; - }); + }); } dataCount = $tw.utils.count(data); diff --git a/core/modules/widgets/button.js b/core/modules/widgets/button.js index 9186e1808..4b96e6b2b 100644 --- a/core/modules/widgets/button.js +++ b/core/modules/widgets/button.js @@ -227,7 +227,7 @@ ButtonWidget.prototype.execute = function() { ButtonWidget.prototype.updateDomNodeClasses = function() { var domNodeClasses = this.domNode.className.split(" "), oldClasses = this.class.split(" "), - newClasses; + newClasses; this["class"] = this.getAttribute("class",""); newClasses = this.class.split(" "); //Remove classes assigned from the old value of class attribute diff --git a/core/modules/widgets/droppable.js b/core/modules/widgets/droppable.js index c9878930d..104503b25 100644 --- a/core/modules/widgets/droppable.js +++ b/core/modules/widgets/droppable.js @@ -49,7 +49,7 @@ DroppableWidget.prototype.render = function(parent,nextSibling) { {name: "dragover", handlerObject: this, handlerMethod: "handleDragOverEvent"}, {name: "dragleave", handlerObject: this, handlerMethod: "handleDragLeaveEvent"}, {name: "drop", handlerObject: this, handlerMethod: "handleDropEvent"} - ]); + ]); } else { $tw.utils.addClass(this.domNode,this.disabledClass); } @@ -155,7 +155,7 @@ DroppableWidget.prototype.execute = function() { DroppableWidget.prototype.assignDomNodeClasses = function() { var classes = this.getAttribute("class","").split(" "); classes.push("tc-droppable"); - this.domNode.className = classes.join(" "); + this.domNode.className = classes.join(" "); }; /* diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js index 9c6a16b20..04b48c5e4 100644 --- a/core/modules/widgets/dropzone.js +++ b/core/modules/widgets/dropzone.js @@ -82,7 +82,7 @@ DropZoneWidget.prototype.resetState = function() { this.currentlyEntered = []; this.document.body.removeEventListener("click",this,true); this.document.body.removeEventListener("dragenter",this,true); - this.document.body.removeEventListener("dragleave",this,true); + this.document.body.removeEventListener("dragleave",this,true); this.dragInProgress = false; }; @@ -93,7 +93,7 @@ DropZoneWidget.prototype.enterDrag = function(event) { if(!this.dragInProgress) { this.dragInProgress = true; // If we're entering for the first time we need to apply highlighting - $tw.utils.addClass(this.domNodes[0],"tc-dragover"); + $tw.utils.addClass(this.domNodes[0],"tc-dragover"); this.document.body.addEventListener("click",this,true); this.document.body.addEventListener("dragenter",this,true); this.document.body.addEventListener("dragleave",this,true); diff --git a/core/modules/widgets/edit-bitmap.js b/core/modules/widgets/edit-bitmap.js index c6c3dde8c..5065127d8 100644 --- a/core/modules/widgets/edit-bitmap.js +++ b/core/modules/widgets/edit-bitmap.js @@ -156,7 +156,7 @@ EditBitmapWidget.prototype.loadCanvas = function() { }; // Get the current bitmap into an image object if(tiddler && tiddler.fields.type && tiddler.fields.text) { - currImage.src = "data:" + tiddler.fields.type + ";base64," + tiddler.fields.text; + currImage.src = "data:" + tiddler.fields.type + ";base64," + tiddler.fields.text; } else { currImage.width = DEFAULT_IMAGE_WIDTH; currImage.height = DEFAULT_IMAGE_HEIGHT; diff --git a/core/modules/widgets/edit-shortcut.js b/core/modules/widgets/edit-shortcut.js index b70328d5a..31d81b6b8 100644 --- a/core/modules/widgets/edit-shortcut.js +++ b/core/modules/widgets/edit-shortcut.js @@ -33,7 +33,7 @@ EditShortcutWidget.prototype.render = function(parent,nextSibling) { this.inputNode = this.document.createElement("input"); // Assign classes if(this.shortcutClass) { - this.inputNode.className = this.shortcutClass; + this.inputNode.className = this.shortcutClass; } // Assign other attributes if(this.shortcutStyle) { @@ -117,7 +117,7 @@ EditShortcutWidget.prototype.handleKeydownEvent = function(event) { // Ignore the keydown if it was already handled event.preventDefault(); event.stopPropagation(); - return true; + return true; } else { return false; } @@ -145,7 +145,7 @@ EditShortcutWidget.prototype.refresh = function(changedTiddlers) { this.updateInputNode(); return true; } else { - return false; + return false; } }; diff --git a/core/modules/widgets/element.js b/core/modules/widgets/element.js index 41ed4ebd1..a46669f43 100755 --- a/core/modules/widgets/element.js +++ b/core/modules/widgets/element.js @@ -81,7 +81,7 @@ ElementWidget.prototype.refresh = function(changedTiddlers) { if(hasChangedAttributes) { if(!this.isReplaced) { // Update our attributes - this.assignAttributes(this.domNodes[0],{excludeEventAttributes: true}); + this.assignAttributes(this.domNodes[0],{excludeEventAttributes: true}); } else { // If we were replaced then completely refresh ourselves return this.refreshSelf(); diff --git a/core/modules/widgets/entity.js b/core/modules/widgets/entity.js index 0b5e68375..6f1a66fed 100755 --- a/core/modules/widgets/entity.js +++ b/core/modules/widgets/entity.js @@ -51,7 +51,7 @@ EntityWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return false; + return false; } }; diff --git a/core/modules/widgets/eventcatcher.js b/core/modules/widgets/eventcatcher.js index 0b32689a1..75f60379a 100644 --- a/core/modules/widgets/eventcatcher.js +++ b/core/modules/widgets/eventcatcher.js @@ -37,11 +37,11 @@ EventWidget.prototype.render = function(parent,nextSibling) { var tag = this.parseTreeNode.isBlock ? "div" : "span"; if(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) { tag = this.elementTag; - } + } var domNode = this.document.createElement(tag); this.domNode = domNode; // Assign classes - this.assignDomNodeClasses(); + this.assignDomNodeClasses(); // Add our event handler $tw.utils.each(this.types,function(type) { domNode.addEventListener(type,function(event) { @@ -144,7 +144,7 @@ EventWidget.prototype.execute = function() { EventWidget.prototype.assignDomNodeClasses = function() { var classes = this.getAttribute("class","").split(" "); classes.push("tc-eventcatcher"); - this.domNode.className = classes.join(" "); + this.domNode.className = classes.join(" "); }; /* diff --git a/core/modules/widgets/fieldmangler.js b/core/modules/widgets/fieldmangler.js index fb249cbf2..d0d0782b1 100644 --- a/core/modules/widgets/fieldmangler.js +++ b/core/modules/widgets/fieldmangler.js @@ -58,7 +58,7 @@ FieldManglerWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return this.refreshChildren(changedTiddlers); + return this.refreshChildren(changedTiddlers); } }; @@ -133,7 +133,7 @@ FieldManglerWidget.prototype.handleAddTagEvent = function(event) { if(tag !== "") { modification.tags = (tiddler.fields.tags || []).slice(0); $tw.utils.pushTop(modification.tags,tag); - this.wiki.addTiddler(new $tw.Tiddler(tiddler,modification)); + this.wiki.addTiddler(new $tw.Tiddler(tiddler,modification)); } } else if(typeof event.param === "string" && event.param.trim() !== "" && this.mangleTitle.trim() !== "") { var tag = []; diff --git a/core/modules/widgets/image.js b/core/modules/widgets/image.js index 4ecafbd2b..2975cef4c 100644 --- a/core/modules/widgets/image.js +++ b/core/modules/widgets/image.js @@ -86,7 +86,7 @@ ImageWidget.prototype.render = function(parent,nextSibling) { default: src = _canonical_uri; break; - } + } } else { // Just trigger loading of the tiddler this.wiki.getTiddlerText(this.imageSource); @@ -97,7 +97,7 @@ ImageWidget.prototype.render = function(parent,nextSibling) { var domNode = this.document.createElement(tag); domNode.setAttribute("src",src); if(this.imageClass) { - domNode.setAttribute("class",this.imageClass); + domNode.setAttribute("class",this.imageClass); } if(this.imageWidth) { domNode.setAttribute("width",this.imageWidth); @@ -106,10 +106,10 @@ ImageWidget.prototype.render = function(parent,nextSibling) { domNode.setAttribute("height",this.imageHeight); } if(this.imageTooltip) { - domNode.setAttribute("title",this.imageTooltip); + domNode.setAttribute("title",this.imageTooltip); } if(this.imageAlt) { - domNode.setAttribute("alt",this.imageAlt); + domNode.setAttribute("alt",this.imageAlt); } // Insert element parent.insertBefore(domNode,nextSibling); @@ -138,7 +138,7 @@ ImageWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return false; + return false; } }; diff --git a/core/modules/widgets/importvariables.js b/core/modules/widgets/importvariables.js index 56cc0852c..faa2448de 100644 --- a/core/modules/widgets/importvariables.js +++ b/core/modules/widgets/importvariables.js @@ -118,7 +118,7 @@ ImportVariablesWidget.prototype.refresh = function(changedTiddlers) { this.renderChildren(this.parentDomNode,this.findNextSiblingDomNode()); return true; } else { - return this.refreshChildren(changedTiddlers); + return this.refreshChildren(changedTiddlers); } }; diff --git a/core/modules/widgets/link.js b/core/modules/widgets/link.js index 76822668b..d1742af24 100755 --- a/core/modules/widgets/link.js +++ b/core/modules/widgets/link.js @@ -77,7 +77,7 @@ LinkWidget.prototype.renderLink = function(parent,nextSibling) { } } if(this.linkClasses) { - classes.push(this.linkClasses); + classes.push(this.linkClasses); } } else if(this.overrideClasses !== "") { classes.push(this.overrideClasses) diff --git a/core/modules/widgets/linkcatcher.js b/core/modules/widgets/linkcatcher.js index 616a54c32..78322d0f6 100644 --- a/core/modules/widgets/linkcatcher.js +++ b/core/modules/widgets/linkcatcher.js @@ -61,7 +61,7 @@ LinkCatcherWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return this.refreshChildren(changedTiddlers); + return this.refreshChildren(changedTiddlers); } }; diff --git a/core/modules/widgets/log.js b/core/modules/widgets/log.js index 2615547ad..9d6e95159 100644 --- a/core/modules/widgets/log.js +++ b/core/modules/widgets/log.js @@ -23,7 +23,7 @@ exports.constructor = function(parseTreeNode,options) { exports.prototype = {}; exports.prototype.render = function(event) { - Object.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event); + Object.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event); Object.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this); } diff --git a/core/modules/widgets/macrocall.js b/core/modules/widgets/macrocall.js index 2381d0360..9de2e5d67 100644 --- a/core/modules/widgets/macrocall.js +++ b/core/modules/widgets/macrocall.js @@ -44,7 +44,7 @@ MacroCallWidget.prototype.execute = function() { var params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : []; $tw.utils.each(this.attributes,function(attribute,name) { if(name.charAt(0) !== "$") { - params.push({name: name, value: attribute}); + params.push({name: name, value: attribute}); } }); // Get the macro value diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 75ad59a69..9df76acc4 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -95,7 +95,7 @@ NavigatorWidget.prototype.saveStoryList = function(storyList) { {title: this.storyTitle}, storyTiddler, {list: storyList} - )); + )); } }; @@ -105,7 +105,7 @@ NavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) { while(p !== -1) { storyList.splice(p,1); p = storyList.indexOf(title); - } + } } }; @@ -122,7 +122,7 @@ NavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle } while(pos !== -1); } else { storyList.splice(0,0,newTitle); - } + } } }; diff --git a/core/modules/widgets/raw.js b/core/modules/widgets/raw.js index 6ea592d3e..6d0ac41de 100644 --- a/core/modules/widgets/raw.js +++ b/core/modules/widgets/raw.js @@ -32,7 +32,7 @@ RawWidget.prototype.render = function(parent,nextSibling) { var div = this.document.createElement("div"); div.innerHTML=this.parseTreeNode.html; parent.insertBefore(div,nextSibling); - this.domNodes.push(div); + this.domNodes.push(div); }; /* diff --git a/core/modules/widgets/reveal.js b/core/modules/widgets/reveal.js index 2431e7195..aedca6183 100755 --- a/core/modules/widgets/reveal.js +++ b/core/modules/widgets/reveal.js @@ -72,7 +72,7 @@ RevealWidget.prototype.positionPopup = function(domNode) { case "belowright": left = this.popup.left + this.popup.width; top = this.popup.top + this.popup.height; - break; + break; case "right": left = this.popup.left + this.popup.width; top = this.popup.top; @@ -84,7 +84,7 @@ RevealWidget.prototype.positionPopup = function(domNode) { case "aboveleft": left = this.popup.left - domNode.offsetWidth; top = this.popup.top - domNode.offsetHeight; - break; + break; default: // Below left = this.popup.left; top = this.popup.top + this.popup.height; @@ -234,7 +234,7 @@ RevealWidget.prototype.refresh = function(changedTiddlers) { } if(changedAttributes["class"]) { this.assignDomNodeClasses(); - } + } return this.refreshChildren(changedTiddlers); } }; diff --git a/core/modules/widgets/scrollable.js b/core/modules/widgets/scrollable.js index 23be39efd..ddce42351 100644 --- a/core/modules/widgets/scrollable.js +++ b/core/modules/widgets/scrollable.js @@ -41,7 +41,7 @@ ScrollableWidget.prototype.handleScrollEvent = function(event) { if(event.paramObject && event.paramObject.selector) { this.scrollSelectorIntoView(null,event.paramObject.selector); } else { - this.scrollIntoView(event.target); + this.scrollIntoView(event.target); } return false; // Handled event }; @@ -97,7 +97,7 @@ ScrollableWidget.prototype.scrollIntoView = function(element) { if(duration <= 0) { t = 1; } else { - t = ((Date.now()) - self.startTime) / duration; + t = ((Date.now()) - self.startTime) / duration; } if(t >= 1) { self.cancelScroll(); @@ -118,7 +118,7 @@ ScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selecto baseElement = baseElement || document.body; var element = baseElement.querySelector(selector); if(element) { - this.scrollIntoView(element,callback); + this.scrollIntoView(element,callback); } }; diff --git a/core/modules/widgets/setvariable.js b/core/modules/widgets/setvariable.js index 40dbadf16..cc97067c7 100755 --- a/core/modules/widgets/setvariable.js +++ b/core/modules/widgets/setvariable.js @@ -63,7 +63,7 @@ SetWidget.prototype.getValue = function() { if(this.setSubTiddler) { tiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler); } else { - tiddler = this.wiki.getTiddler(this.setTiddler); + tiddler = this.wiki.getTiddler(this.setTiddler); } if(!tiddler) { value = this.setEmptyValue; @@ -84,7 +84,7 @@ SetWidget.prototype.getValue = function() { if(select !== undefined) { value = results[select] || ""; } else { - value = $tw.utils.stringifyList(results); + value = $tw.utils.stringifyList(results); } } if(results.length === 0 && this.setEmptyValue !== undefined) { diff --git a/core/modules/widgets/text.js b/core/modules/widgets/text.js index e3212f590..14f729114 100755 --- a/core/modules/widgets/text.js +++ b/core/modules/widgets/text.js @@ -53,7 +53,7 @@ TextNodeWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return false; + return false; } }; diff --git a/core/modules/widgets/tiddler.js b/core/modules/widgets/tiddler.js index 1296a5b09..0b70ff875 100755 --- a/core/modules/widgets/tiddler.js +++ b/core/modules/widgets/tiddler.js @@ -92,7 +92,7 @@ TiddlerWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return this.refreshChildren(changedTiddlers); + return this.refreshChildren(changedTiddlers); } }; diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 1af7f9c42..2acd8109b 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -107,7 +107,7 @@ TranscludeWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return this.refreshChildren(changedTiddlers); + return this.refreshChildren(changedTiddlers); } }; diff --git a/core/modules/widgets/vars.js b/core/modules/widgets/vars.js index cbd3e0ddc..e4ee8872f 100644 --- a/core/modules/widgets/vars.js +++ b/core/modules/widgets/vars.js @@ -22,7 +22,7 @@ This widget allows multiple variables to be set in one go: var Widget = require("$:/core/modules/widgets/widget.js").widget; var VarsWidget = function(parseTreeNode,options) { - // Initialise + // Initialise this.initialise(parseTreeNode,options); }; diff --git a/core/modules/widgets/view.js b/core/modules/widgets/view.js index fed369771..6effc8939 100755 --- a/core/modules/widgets/view.js +++ b/core/modules/widgets/view.js @@ -108,7 +108,7 @@ ViewWidget.prototype.getValue = function(options) { } else { var tiddler; if(this.viewSubtiddler) { - tiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler); + tiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler); } else { tiddler = this.wiki.getTiddler(this.viewTitle); } @@ -121,7 +121,7 @@ ViewWidget.prototype.getValue = function(options) { if(options.asString) { value = tiddler.getFieldString(this.viewField); } else { - value = tiddler.fields[this.viewField]; + value = tiddler.fields[this.viewField]; } } } @@ -219,7 +219,7 @@ ViewWidget.prototype.refresh = function(changedTiddlers) { this.refreshSelf(); return true; } else { - return false; + return false; } }; diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 50405c19c..ce0102069 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -122,7 +122,7 @@ Widget.prototype.getVariableInfo = function(name,options) { }); // Only substitute variable references if this variable was defined with the \define pragma if(variable.isMacroDefinition) { - value = this.substituteVariableReferences(value); + value = this.substituteVariableReferences(value); } return { text: value, diff --git a/core/modules/widgets/wikify.js b/core/modules/widgets/wikify.js index 853ebff1b..1830b2048 100644 --- a/core/modules/widgets/wikify.js +++ b/core/modules/widgets/wikify.js @@ -100,7 +100,7 @@ WikifyWidget.prototype.getWidgetTree = function() { break; case "text": resultNode.text = widgetNode.parseTreeNode.text; - break; + break; } if(Object.keys(widgetNode.attributes || {}).length > 0) { resultNode.attributes = {}; diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 0fcb9b7b0..072b76dbf 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -111,7 +111,7 @@ exports.deleteTextReference = function(textRef,currTiddlerTitle) { exports.addEventListener = function(type,listener) { this.eventListeners = this.eventListeners || {}; this.eventListeners[type] = this.eventListeners[type] || []; - this.eventListeners[type].push(listener); + this.eventListeners[type].push(listener); }; exports.removeEventListener = function(type,listener) { @@ -227,7 +227,7 @@ exports.isVolatileTiddler = function(title) { exports.isImageTiddler = function(title) { var tiddler = this.getTiddler(title); - if(tiddler) { + if(tiddler) { var contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/vnd.tiddlywiki"]; return !!contentTypeInfo && contentTypeInfo.flags.indexOf("image") !== -1; } else { @@ -237,7 +237,7 @@ exports.isImageTiddler = function(title) { exports.isBinaryTiddler = function(title) { var tiddler = this.getTiddler(title); - if(tiddler) { + if(tiddler) { var contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || "text/vnd.tiddlywiki"]; return !!contentTypeInfo && contentTypeInfo.encoding === "base64"; } else { @@ -734,7 +734,7 @@ exports.getTiddlerDataCached = function(titleOrTiddler,defaultData) { var self = this, tiddler = titleOrTiddler; if(!(tiddler instanceof $tw.Tiddler)) { - tiddler = this.getTiddler(tiddler); + tiddler = this.getTiddler(tiddler); } if(tiddler) { return this.getCacheForTiddler(tiddler.fields.title,"data",function() { @@ -755,7 +755,7 @@ exports.getTiddlerData = function(titleOrTiddler,defaultData) { var tiddler = titleOrTiddler, data; if(!(tiddler instanceof $tw.Tiddler)) { - tiddler = this.getTiddler(tiddler); + tiddler = this.getTiddler(tiddler); } if(tiddler && tiddler.fields.text) { switch(tiddler.fields.type) { @@ -885,7 +885,7 @@ exports.initParsers = function(moduleType) { if(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === "base64") { $tw.Wiki.parsers[type] = $tw.Wiki.parsers["application/octet-stream"]; } - }); + }); } }; @@ -949,7 +949,7 @@ exports.parseTextReference = function(title,field,index,options) { } if(field === "text" || (!field && !index)) { if(tiddler && tiddler.fields) { - return this.parseText(tiddler.fields.type,tiddler.fields.text,options); + return this.parseText(tiddler.fields.type,tiddler.fields.text,options); } else { return null; } @@ -1157,7 +1157,7 @@ exports.search = function(text,options) { searchTermsRegExps = [new RegExp("(" + anchor + terms.join("\\s+") + ")",flags)]; } else if(options.regexp) { try { - searchTermsRegExps = [new RegExp("(" + text + ")",flags)]; + searchTermsRegExps = [new RegExp("(" + text + ")",flags)]; } catch(e) { searchTermsRegExps = null; console.log("Regexp error parsing /(" + text + ")/" + flags + ": ",e); @@ -1179,7 +1179,7 @@ exports.search = function(text,options) { if($tw.utils.isArray(options.field)) { $tw.utils.each(options.field,function(fieldName) { if(fieldName) { - fields.push(fieldName); + fields.push(fieldName); } }); } else { @@ -1448,7 +1448,7 @@ historyTitle: title of history tiddler (defaults to $:/HistoryList) */ exports.addToHistory = function(title,fromPageRect,historyTitle) { var story = new $tw.Story({wiki: this, historyTitle: historyTitle}); - story.addToHistory(title,fromPageRect); + story.addToHistory(title,fromPageRect); console.log("$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!") }; From 652e8b1262786a3e7bcc01b51b4319749ff6674c Mon Sep 17 00:00:00 2001 From: Bram Chen <bram.chen@gmail.com> Date: Mon, 31 May 2021 14:37:01 +0800 Subject: [PATCH 1365/2376] Update chinese translations (#5740) --- languages/zh-Hans/EditTemplate.multids | 2 ++ languages/zh-Hans/Help/listen.tid | 4 ++-- languages/zh-Hans/Help/render.tid | 2 +- languages/zh-Hans/Help/save.tid | 2 +- languages/zh-Hans/Import.multids | 2 +- languages/zh-Hant/EditTemplate.multids | 2 ++ languages/zh-Hant/Help/listen.tid | 4 ++-- languages/zh-Hant/Help/render.tid | 2 +- languages/zh-Hant/Help/save.tid | 2 +- languages/zh-Hant/Import.multids | 2 +- 10 files changed, 14 insertions(+), 10 deletions(-) diff --git a/languages/zh-Hans/EditTemplate.multids b/languages/zh-Hans/EditTemplate.multids index 36b6d84a8..d6d0aca4a 100644 --- a/languages/zh-Hans/EditTemplate.multids +++ b/languages/zh-Hans/EditTemplate.multids @@ -3,6 +3,8 @@ title: $:/language/EditTemplate/ Body/External/Hint: 此条目显示保存于主要的 TiddlyWiki 文件之外的内容。你可以编辑其标签和字段,但不能直接编辑内容本身 Body/Placeholder: 输入此条目的内容 Body/Preview/Type/Output: 输出 +Body/Preview/Type/DiffShadow: 与影子条目的差异(如果有) +Body/Preview/Type/DiffCurrent: 与当前条目的差异 Field/Remove/Caption: 删除字段 Field/Remove/Hint: 删除字段 Field/Dropdown/Caption: 字段列表 diff --git a/languages/zh-Hans/Help/listen.tid b/languages/zh-Hans/Help/listen.tid index 3efc53c71..a75323401 100644 --- a/languages/zh-Hans/Help/listen.tid +++ b/languages/zh-Hans/Help/listen.tid @@ -19,8 +19,8 @@ listen 命令使用[[命名的命令参数|NamedCommandParameters]]: * ''username'' - 可选的基本验证用户名称 * ''password'' - 可选的基本验证密码 * ''authenticated-user-header'' - 可选的标头名称,用于受信任身份验证 -* ''readers'' - 允许读取此维基的主体,以逗号分隔的清单 -* ''writers'' - 允许写入此维基的主体,以逗号分隔的清单 +* ''readers'' - 允许读取此维基,以逗号分隔的用户名称的清单 +* ''writers'' - 允许写入此维基,以逗号分隔的用户名称的清单 * ''csrf-disable'' - 设置为 "yes" 以禁用 CSRF 检查 (默认为 "no") * ''sse-enabled'' - 设置为 "yes" 以启用服务器传送的事件 (默认为 "no") * ''root-tiddler'' - 服务的基本条目 (默认为 "$:/core/save/all") diff --git a/languages/zh-Hans/Help/render.tid b/languages/zh-Hans/Help/render.tid index c7894ac9a..81e347577 100644 --- a/languages/zh-Hans/Help/render.tid +++ b/languages/zh-Hans/Help/render.tid @@ -24,7 +24,7 @@ description: 呈现个别条目到文件 * 输出目录不清除任何现有的文件 * 文件名的路径中,任何不存在的文件夹,将自动创建。 -* 当正呈现的条目名称中带有空格,请注意同时使用命令行接口所要求的引号,与 TiddlyWiki 的双重方括号;`--render "[[Motovun Jack.jpg]]"` +* 当正呈现的条目名称中带有空格,请注意同时使用命令行接口所要求的引号,与 TiddlyWiki 的双重方括号:`--render "[[Motovun Jack.jpg]]"` * 所选的项目被设置为当前正在呈现的条目名称,以此评估文件名筛选器,允条目名称用作基础计算的文件名。例如,`[encodeuricomponent[]addprefix[static/]]` 为每个条目名称套用 URI 编码,然后增加首码 `static/` * `--render` 命令是已弃用的 `--rendertiddler` 和 `--rendertiddlers` 的一个更灵活的替代命令。 diff --git a/languages/zh-Hans/Help/save.tid b/languages/zh-Hans/Help/save.tid index 75f317bcf..5dcf8a97b 100644 --- a/languages/zh-Hans/Help/save.tid +++ b/languages/zh-Hans/Help/save.tid @@ -14,7 +14,7 @@ description: 将个别原始条目保存到文件 * 输出文件夹不清除任何现有的文件 * 文件名的路径中,任何不存在的文件夹,将自动创建。 -* 当正保存的条目的名称中带有空格,请注意同时使用命令行接口所要求的引号,与 TiddlyWiki 的双重方括号;`--save "[[Motovun Jack.jpg]]"` +* 当正保存的条目的名称中带有空格,请注意同时使用命令行接口所要求的引号,与 TiddlyWiki 的双重方括号:`--save "[[Motovun Jack.jpg]]"` * 所选的项目被设置为当前正在保存的条目名称,以此评估文件名筛选器,允条目名称用作基础计算的文件名。例如,`[encodeuricomponent[]addprefix[static/]]` 为每个条目名称套用 URI 编码,然后增加首码 `static/` * `--save` 命令是已被弃用的 `--savetiddler` 和 `--savetiddlers` 的一个更灵活的替代命令。 diff --git a/languages/zh-Hans/Import.multids b/languages/zh-Hans/Import.multids index f7bcdefaf..10b8bcb1d 100644 --- a/languages/zh-Hans/Import.multids +++ b/languages/zh-Hans/Import.multids @@ -1,6 +1,6 @@ title: $:/language/Import/ -Editor/Import/Heading: 导入图像并插入至编辑器。 +Editor/Import/Heading: 导入图像并将其插入至编辑器。 Imported/Hint: 下列条目已被导入: Listing/Cancel/Caption: 取消 Listing/Hint: 这些条目已备妥导入: diff --git a/languages/zh-Hant/EditTemplate.multids b/languages/zh-Hant/EditTemplate.multids index 31912ad90..d8c57347d 100644 --- a/languages/zh-Hant/EditTemplate.multids +++ b/languages/zh-Hant/EditTemplate.multids @@ -3,6 +3,8 @@ title: $:/language/EditTemplate/ Body/External/Hint: 此條目顯示儲存於主要的 TiddlyWiki 檔之外的內容。你可以編輯其標籤和欄位,但不能直接編輯內容本身 Body/Placeholder: 輸入此條目的內容 Body/Preview/Type/Output: 輸出 +Body/Preview/Type/DiffShadow: 與影子條目的差異(如果有) +Body/Preview/Type/DiffCurrent: 與當前條目的差異 Field/Remove/Caption: 刪除欄位 Field/Remove/Hint: 刪除欄位 Field/Dropdown/Caption: 欄位列表 diff --git a/languages/zh-Hant/Help/listen.tid b/languages/zh-Hant/Help/listen.tid index e76376059..c2d96823f 100644 --- a/languages/zh-Hant/Help/listen.tid +++ b/languages/zh-Hant/Help/listen.tid @@ -19,8 +19,8 @@ listen 命令使用[[命名的命令參數|NamedCommandParameters]]: * ''username'' - 可選的基本驗證使用者名稱 * ''password'' - 可選的基本驗證密碼 * ''authenticated-user-header'' - 可選的標頭名稱,用於受信任身份驗證 -* ''readers'' - 允許讀取此維基的主體,以逗號分隔的清單 -* ''writers'' - 允許寫入此維基的主體,以逗號分隔的清單 +* ''readers'' - 允許讀取此維基,以逗號分隔的使用者名稱的清單 +* ''writers'' - 允許寫入此維基,以逗號分隔的使用者名稱的清單 * ''csrf-disable'' - 設定為 "yes" 以停用 CSRF 檢查 (預設為 "no") * ''sse-enabled'' - 設定為 "yes" 以啟用伺服器傳送的事件 (預設為 "no") * ''root-tiddler'' - 服務的基本條目 (預設為 "$:/core/save/all") diff --git a/languages/zh-Hant/Help/render.tid b/languages/zh-Hant/Help/render.tid index 6909fbe2f..a1d4ecb44 100644 --- a/languages/zh-Hant/Help/render.tid +++ b/languages/zh-Hant/Help/render.tid @@ -24,7 +24,7 @@ description: 呈現個別條目到檔案 * 輸出資料夾不清除任何現有的檔案 * 檔名的路徑中,任何不存在的資料夾,將自動建立。 -* 當正呈現的條目名稱中帶有空格,請注意同時使用命令列介面所要求的引號,與 TiddlyWiki 的雙重方括號;`--render "[[Motovun Jack.jpg]]"` +* 當正呈現的條目名稱中帶有空格,請注意同時使用命令列介面所要求的引號,與 TiddlyWiki 的雙重方括號:`--render "[[Motovun Jack.jpg]]"` * 所選的項目被設定為當前正在呈現的條目名稱,以此評估檔名篩選器,允條目名稱用作基礎計算的檔名。例如,`[encodeuricomponent[]addprefix[static/]]` 為每個條目名稱套用 URI 編碼,然後增加首碼 `static/` * `--render` 命令是已棄用的 `--rendertiddler` 和 `--rendertiddlers` 的一個更靈活的替代命令。 diff --git a/languages/zh-Hant/Help/save.tid b/languages/zh-Hant/Help/save.tid index e4fac5669..fb08143a9 100644 --- a/languages/zh-Hant/Help/save.tid +++ b/languages/zh-Hant/Help/save.tid @@ -14,7 +14,7 @@ description: 將個別原始條目儲存到檔案 * 輸出資料夾不清除任何現有的檔案 * 檔名的路徑中,任何不存在的目錄,將自動建立。 -* 當正儲存的條目的名稱中帶有空格,請注意同時使用命令列介面所要求的引號,與 TiddlyWiki 的雙重方括號;`--save "[[Motovun Jack.jpg]]"` +* 當正儲存的條目的名稱中帶有空格,請注意同時使用命令列介面所要求的引號,與 TiddlyWiki 的雙重方括號:`--save "[[Motovun Jack.jpg]]"` * 所選的項目被設定為當前正在儲存的條目名稱,以此評估檔案名篩選器,允條目名稱用作基礎計算的檔名。例如,`[encodeuricomponent[]addprefix[static/]]` 為每個條目名稱套用 URI 編碼,然後增加首碼 `static/` * `--save` 命令是已被棄用的 `--savetiddler` 和 `--savetiddlers` 的一個更靈活的替代命令。 diff --git a/languages/zh-Hant/Import.multids b/languages/zh-Hant/Import.multids index dfcb7a0e9..7e9f395d1 100644 --- a/languages/zh-Hant/Import.multids +++ b/languages/zh-Hant/Import.multids @@ -1,6 +1,6 @@ title: $:/language/Import/ -Editor/Import/Heading: 導入圖像並插入至編輯器。 +Editor/Import/Heading: 導入圖像並將其插入至編輯器。 Imported/Hint: 下列條目已被導入: Listing/Cancel/Caption: 取消 Listing/Hint: 這些條目已備妥導入: From 582b156d5f2b9b8b92f9289aa1288e1edb637450 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 1 Jun 2021 09:28:04 +0100 Subject: [PATCH 1366/2376] Refresh non-action widgets before invoking them Fixes #5744 --- core/modules/widgets/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index ce0102069..3b020bf09 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -570,8 +570,8 @@ Widget.prototype.invokeActions = function(triggeringWidget,event) { for(var t=0; t<this.children.length; t++) { var child = this.children[t]; // Invoke the child if it is an action widget + child.refreshSelf(); if(child.invokeAction) { - child.refreshSelf(); if(child.invokeAction(triggeringWidget,event)) { handled = true; } From 9faaa312998d48c56bd50335820b6b881266af4b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 1 Jun 2021 09:41:14 +0100 Subject: [PATCH 1367/2376] Extend action-createtiddler to make new title available as a variable I'm not sure if the docs are clear, but this is quite a big deal, and along with 582b156d5f2b9b8b92f9289aa1288e1edb637450 makes working with action widgets a lot easier. --- core/modules/widgets/action-createtiddler.js | 16 +++++++++++----- .../ActionCreateTiddlerWidget Example 3.tid | 2 +- .../ActionCreateTiddlerWidget Example 4.tid | 4 ++-- .../widgets/ActionCreateTiddlerWidget.tid | 16 ++++++++++------ .../ActionCreateTiddlerWidget_Example.tid | 8 +++++--- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/core/modules/widgets/action-createtiddler.js b/core/modules/widgets/action-createtiddler.js index d1d1786f7..693c33282 100644 --- a/core/modules/widgets/action-createtiddler.js +++ b/core/modules/widgets/action-createtiddler.js @@ -27,8 +27,11 @@ CreateTiddlerWidget.prototype = new Widget(); Render this widget into the DOM */ CreateTiddlerWidget.prototype.render = function(parent,nextSibling) { + this.parentDomNode = parent; this.computeAttributes(); this.execute(); + // Render children + this.renderChildren(parent,nextSibling); }; /* @@ -44,7 +47,8 @@ CreateTiddlerWidget.prototype.execute = function() { this.actionTemplate = this.getAttribute("$template"); this.useTemplate = !!this.actionTemplate; this.actionOverwrite = this.getAttribute("$overwrite","no"); - + // Construct the child widgets + this.makeChildWidgets(); }; /* @@ -86,18 +90,20 @@ CreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) { if (!this.hasBase && this.useTemplate) { title = this.wiki.generateNewTitle(this.actionTemplate); } else if (!this.hasBase && !this.useTemplate) { - // If NO $basetitle AND NO $template use initial title - // DON'T overwrite any stuff + // If no $basetitle and no $template then use initial title title = this.wiki.generateNewTitle(title); } var templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {}; - var tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title})); + this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title})); + var draftTitle = this.wiki.generateDraftTitle(title); if(this.actionSaveTitle) { this.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable("currentTiddler")); } if(this.actionSaveDraftTitle) { - this.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable("currentTiddler")); + this.wiki.setTextReference(this.actionSaveDraftTitle,draftTitle,this.getVariable("currentTiddler")); } + this.setVariable("createTiddler-title",title); + this.setVariable("createTiddler-draftTitle",draftTitle); return true; // Action was invoked }; diff --git a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 3.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 3.tid index 54524108a..6c66ef165 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 3.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 3.tid @@ -25,4 +25,4 @@ Create Tiddler <$button actions=<<testCreate>> > <$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> Create Tiddler -</$button> - Clicking this button, will also open the Right sidebar: Recent tab +</$button> - Clicking this button will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 4.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 4.tid index b1eb7275f..c3e955b55 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 4.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget Example 4.tid @@ -8,7 +8,7 @@ type: text/vnd.tiddlywiki <$action-createtiddler $basetitle="base" $template="ActionCreateTiddlerWidget Template" aa="new field aa" bb="new field bb" /> \end -This example will uses a base-title: "base" and a template: [[ActionCreateTiddlerWidget Template]]. +This example uses a base-title "base" and a template: [[ActionCreateTiddlerWidget Template]]. There will be new fields "aa" and "bb" which are added to the new tiddlers. @@ -25,4 +25,4 @@ Create Tiddler <$button actions=<<testCreate>> > <$action-setfield $tiddler="$:/state/tab/sidebar--595412856" text="$:/core/ui/SideBar/Recent"/> Create Tiddler -</$button> - Clicking this button, will also open the Right sidebar: Recent tab +</$button> - Clicking this button will also open the Right sidebar: Recent tab diff --git a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid index ca02c2285..04631f4af 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget.tid @@ -1,6 +1,6 @@ caption: action-createtiddler created: 20161020152745942 -modified: 20200131151847266 +modified: 20210601092956998 tags: Widgets ActionWidgets title: ActionCreateTiddlerWidget type: text/vnd.tiddlywiki @@ -16,17 +16,21 @@ There are several differences from the [[tm-new-tiddler message|WidgetMessage: t ! Content and Attributes -The ''action-createtiddler'' widget is invisible. Any content within it is ignored. +The ''action-createtiddler'' widget is invisible. + +<<.from-version "5.1.24">> The action widgets contained within the ''action-createtiddler'' widget are executed after the new tiddler has been created with the title of the tiddler in the variable `createTiddler-title` and `createTiddler-draftTitle`. |!Attribute |!Description | |$basetitle |The initial title that will be attempted. If a tiddler with that title already exists, then a numerical counter is added to the title and incremented until it is unique| -|$savetitle |A text reference identifying a field or index into which the title of the newly created tiddler will be stored after it is created | -|$savedrafttitle |<<.from-version "5.1.20">> A text reference identifying a field or index into which the draft title associated with the newly created tiddler will be stored after it is created. This is useful when using a sequence of action widgets to create a new tiddler, put it into edit mode, and position it within the list of its parent tag | +|$savetitle |//(deprecated – see below))// A text reference identifying a field or index into which the title of the newly created tiddler will be stored after it is created | +|$savedrafttitle |//(deprecated – see below))// <<.from-version "5.1.20">> A text reference identifying a field or index into which the draft title associated with the newly created tiddler will be stored after it is created. This is useful when using a sequence of action widgets to create a new tiddler, put it into edit mode, and position it within the list of its parent tag | |$timestamp |Specifies whether the timestamp(s) of the target tiddler will be updated (''modified'' and ''modifier'', plus ''created'' and ''creator'' for newly created tiddlers). Can be "yes" (the default) or "no" | -|$template |<<.from-version "5.1.22">> The title of a template tiddler, that will be used to create a new tiddler | -|$overwrite |<<.from-version "5.1.22">> If set to "yes", it will overwrite existing tiddlers. ''Be careful!'' | +|$template |<<.from-version "5.1.22">> The title of a template tiddler, that will be used to create a new tiddler | +|$overwrite |<<.from-version "5.1.22">> If set to "yes", it will overwrite existing tiddlers. ''Be careful!'' | |//{any attributes not starting with $}// |Each attribute name specifies a field to be created in the new tiddler | +<<.from-version "5.1.24">> Note that the attributes `$savetitle` and `$savedrafttitle` are no longer needed. Instead, any action widgets that need to use the title of the newly created tiddler should be contained within the ''action-createtiddler'' widget, and reference the variables `createTiddler-title` and `createTiddler-draftTitle` to obtain the title. + ! Examples <<< diff --git a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget_Example.tid b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget_Example.tid index 2be233566..2eb37f9fc 100644 --- a/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget_Example.tid +++ b/editions/tw5.com/tiddlers/widgets/ActionCreateTiddlerWidget_Example.tid @@ -4,9 +4,11 @@ tags: ActionCreateTiddlerWidget title: ActionCreateTiddlerWidget Example type: text/vnd.tiddlywiki -New button caption: <$edit-text tiddler="$:/state/new-button-caption" tag="input" default=""/> +Caption for new button: <$edit-text tiddler="$:/state/new-button-caption" tag="input" default=""/> <$button> -<$action-createtiddler $basetitle="Homemade Button" tags="$:/tags/PageControls" text={{$:/state/new-button-caption}}/> -Create non-functional page control button +<$action-createtiddler $basetitle="Homemade Button" tags="$:/tags/PageControls" text={{$:/state/new-button-caption}}> +<$action-navigate $to=<<createTiddler-title>>/> +</$action-createtiddler> +Create a new non-functional page control button and open the tiddler </$button> \ No newline at end of file From 55c522ab8fb9e4793364a151dedb807b471ea435 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Tue, 1 Jun 2021 11:49:05 +0100 Subject: [PATCH 1368/2376] Improve comments As per @pmario's comment at https://github.com/Jermolene/TiddlyWiki5/commit/582b156d5f2b9b8b92f9289aa1288e1edb637450#commitcomment-51566608 --- core/modules/widgets/widget.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index 3b020bf09..cf73cbca6 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -569,8 +569,9 @@ Widget.prototype.invokeActions = function(triggeringWidget,event) { // For each child widget for(var t=0; t<this.children.length; t++) { var child = this.children[t]; - // Invoke the child if it is an action widget + // Rerender the child to ensure the attribute values are up to date child.refreshSelf(); + // Invoke the child if it is an action widget if(child.invokeAction) { if(child.invokeAction(triggeringWidget,event)) { handled = true; From 2e695801b186cdadb888e6249375f19548bc058a Mon Sep 17 00:00:00 2001 From: Saq Imtiaz <saq.imtiaz@gmail.com> Date: Wed, 2 Jun 2021 14:58:30 +0200 Subject: [PATCH 1369/2376] Transclude widget: refresh selectively when needed (#5736) * Transclude widget: only refresh when transcluded text reference has changed, includes tests * Refactor wiki.parseTextReference so it is re-usable for getting the parser info * Re-arrange methods in wiki.js to improve diff readability --- core/modules/widgets/transclude.js | 9 +- core/modules/wiki.js | 56 +++++--- .../tiddlers/tests/test-parsetextreference.js | 123 ++++++++++++++++++ 3 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 editions/test/tiddlers/tests/test-parsetextreference.js diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 2acd8109b..18645cd27 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -60,6 +60,8 @@ TranscludeWidget.prototype.execute = function() { subTiddler: this.transcludeSubTiddler }), parseTreeNodes = parser ? parser.tree : this.parseTreeNode.children; + this.sourceText = parser ? parser.source : null; + this.parserType = parser? parser.type : null; // Set context variables for recursion detection var recursionMarker = this.makeRecursionMarker(); if(this.recursionMarker === "yes") { @@ -98,12 +100,17 @@ TranscludeWidget.prototype.makeRecursionMarker = function() { return output.join(""); }; +TranscludeWidget.prototype.parserNeedsRefresh = function() { + var parserInfo = this.wiki.getTextReferenceParserInfo(this.transcludeTitle,this.transcludeField,this.transcludeIndex,{subTiddler:this.transcludeSubTiddler}); + return (this.sourceText === undefined || parserInfo.sourceText !== this.sourceText || parserInfo.parserType !== this.parserType) +}; + /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ TranscludeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) { + if(($tw.utils.count(changedAttributes) > 0) || (changedTiddlers[this.transcludeTitle] && this.parserNeedsRefresh())) { this.refreshSelf(); return true; } else { diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 072b76dbf..5401f7b8c 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -937,41 +937,57 @@ exports.parseTiddler = function(title,options) { }; exports.parseTextReference = function(title,field,index,options) { - var tiddler,text; - if(options.subTiddler) { - tiddler = this.getSubTiddler(title,options.subTiddler); - } else { + var tiddler, + text, + parserInfo; + if(!options.subTiddler) { tiddler = this.getTiddler(title); if(field === "text" || (!field && !index)) { this.getTiddlerText(title); // Force the tiddler to be lazily loaded return this.parseTiddler(title,options); } + } + parserInfo = this.getTextReferenceParserInfo(title,field,index,options); + if(parserInfo.sourceText !== null) { + return this.parseText(parserInfo.parserType,parserInfo.sourceText,options); + } else { + return null; + } +}; + +exports.getTextReferenceParserInfo = function(title,field,index,options) { + var tiddler, + parserInfo = { + sourceText : null, + parserType : "text/vnd.tiddlywiki" + }; + if(options.subTiddler) { + tiddler = this.getSubTiddler(title,options.subTiddler); + } else { + tiddler = this.getTiddler(title); } if(field === "text" || (!field && !index)) { if(tiddler && tiddler.fields) { - return this.parseText(tiddler.fields.type,tiddler.fields.text,options); - } else { - return null; + parserInfo.sourceText = tiddler.fields.text || ""; + if(tiddler.fields.type) { + parserInfo.parserType = tiddler.fields.type; + } } } else if(field) { if(field === "title") { - text = title; - } else { - if(!tiddler || !tiddler.hasField(field)) { - return null; - } - text = tiddler.fields[field]; + parserInfo.sourceText = title; + } else if(tiddler && tiddler.fields) { + parserInfo.sourceText = tiddler.fields[field] ? tiddler.fields[field].toString() : null; } - return this.parseText("text/vnd.tiddlywiki",text.toString(),options); } else if(index) { this.getTiddlerText(title); // Force the tiddler to be lazily loaded - text = this.extractTiddlerDataItem(tiddler,index,undefined); - if(text === undefined) { - return null; - } - return this.parseText("text/vnd.tiddlywiki",text,options); + parserInfo.sourceText = this.extractTiddlerDataItem(tiddler,index,null); } -}; + if(parserInfo.sourceText === null) { + parserInfo.parserType = null; + } + return parserInfo; +} /* Make a widget tree for a parse tree diff --git a/editions/test/tiddlers/tests/test-parsetextreference.js b/editions/test/tiddlers/tests/test-parsetextreference.js new file mode 100644 index 000000000..411f7a45b --- /dev/null +++ b/editions/test/tiddlers/tests/test-parsetextreference.js @@ -0,0 +1,123 @@ +/*\ +title: test-parsetextreference.js +type: application/javascript +tags: [[$:/tags/test-spec]] + +Tests for source attribute in parser returned from wiki.parseTextReference + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +describe("Wiki.parseTextReference tests", function() { + + // Create a wiki + var wiki = new $tw.Wiki(); + wiki.addTiddler({ + title: "TiddlerOne", + text: "The quick brown fox in $:/TiddlerTwo", + tags: ["one"], + authors: "Joe Bloggs", + modifier: "JoeBloggs", + modified: "201304152222"}); + wiki.addTiddler({ + title: "$:/TiddlerTwo", + tags: ["two"], + authors: "[[John Doe]]", + modifier: "John", + modified: "201304152211"}); + wiki.addTiddler({ + title: "Tiddler Three", + text: '{"oct":31,"nov":30,"dec":31}', + tags: ["one","two"], + type: "application/json", + modifier: "John", + modified: "201304162202"}); + wiki.addTiddler({ + title: "TiddlerFour", + text: "The quick brown fox in $:/TiddlerTwo", + tags: ["one"], + type: "text/vnd.tiddlywiki", + authors: "Joe Bloggs", + modifier: "JoeBloggs", + modified: "201304152222"}); + // Add a plugin containing some shadow tiddlers + var shadowTiddlers = { + tiddlers: { + "$:/TiddlerFive": { + title: "$:/TiddlerFive", + text: "Everything in federation", + tags: ["two"] + }, + "TiddlerSix": { + title: "TiddlerSix", + text: "Missing inaction from TiddlerOne", + filter: "[[one]] [[a a]] [subfilter{hasList!!list}]", + tags: [] + }, + "TiddlerSeventh": { + title: "TiddlerSeventh", + text: "", + list: "TiddlerOne [[Tiddler Three]] [[a fourth tiddler]] MissingTiddler", + tags: ["one"] + }, + "Tiddler8": { + title: "Tiddler8", + text: "Tidd", + tags: ["one"], + "test-field": "JoeBloggs" + } + } + }; + wiki.addTiddler({ + title: "$:/ShadowPlugin", + text: JSON.stringify(shadowTiddlers), + "plugin-type": "plugin", + type: "application/json"}); + wiki.addTiddler({ + title: "TiddlerNine", + text: "this is plain text", + type: "text/plain" + }); + + // Define a parsing shortcut for souce attribute of parser returned by wiki.parseTextReference + var parseAndGetSource = function(title,field,index,subTiddler) { + var parser = wiki.parseTextReference(title,field,index,{subTiddler: subTiddler}); + return parser ? parser.source : null; + }; + + it("should parse text references and return correct source attribute", function(){ + // Existing tiddler with a text field, no field argument specified + expect(parseAndGetSource("TiddlerOne")).toEqual("The quick brown fox in $:/TiddlerTwo"); + // Existing tiddler with a text field, field argument specified as text + expect(parseAndGetSource("TiddlerOne","text")).toEqual("The quick brown fox in $:/TiddlerTwo"); + // Existing tiddler with no text field + expect(parseAndGetSource("$:/TiddlerTwo")).toEqual(""); + // Existing tiddler, field argument specified as authors + expect(parseAndGetSource("TiddlerOne","authors")).toEqual("Joe Bloggs"); + // Non-existent tiddler, no field argument + expect(parseAndGetSource("MissingTiddler")).toEqual(null); + // Non-existent tiddler, field argument + expect(parseAndGetSource("MissingTiddler","missing-field")).toEqual(null); + // Non-existent tiddler, index specified + expect(parseAndGetSource("MissingTiddler",null,"missing-index")).toEqual(null); + // Existing tiddler with non existent field + expect(parseAndGetSource("TiddlerOne","missing-field")).toEqual(null); + // Data tiddler with index specified + expect(parseAndGetSource("Tiddler Three",null,"oct")).toEqual("31"); + // Existing tiddler with a text field, type set to vnd.tiddlywiki + expect(parseAndGetSource("TiddlerFour")).toEqual("The quick brown fox in $:/TiddlerTwo"); + // Existing subtiddler of a plugin + expect(parseAndGetSource("$:/ShadowPlugin","text",null,"Tiddler8")).toEqual("Tidd"); + // Non-existent subtiddler of a plugin + expect(parseAndGetSource("$:/ShadowPlugin","text",null,"MyMissingTiddler")).toEqual(null); + // Plain text tiddler + expect(parseAndGetSource("TiddlerNine")).toEqual(undefined); + }); + +}); + +})(); From 4f9dd50382b98239b8f611fb513e67146ab3d03a Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 2 Jun 2021 19:14:05 +0100 Subject: [PATCH 1370/2376] Revert "Transclude widget: refresh selectively when needed (#5736)" This reverts commit 2e695801b186cdadb888e6249375f19548bc058a. --- core/modules/widgets/transclude.js | 9 +- core/modules/wiki.js | 56 +++----- .../tiddlers/tests/test-parsetextreference.js | 123 ------------------ 3 files changed, 21 insertions(+), 167 deletions(-) delete mode 100644 editions/test/tiddlers/tests/test-parsetextreference.js diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 18645cd27..2acd8109b 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -60,8 +60,6 @@ TranscludeWidget.prototype.execute = function() { subTiddler: this.transcludeSubTiddler }), parseTreeNodes = parser ? parser.tree : this.parseTreeNode.children; - this.sourceText = parser ? parser.source : null; - this.parserType = parser? parser.type : null; // Set context variables for recursion detection var recursionMarker = this.makeRecursionMarker(); if(this.recursionMarker === "yes") { @@ -100,17 +98,12 @@ TranscludeWidget.prototype.makeRecursionMarker = function() { return output.join(""); }; -TranscludeWidget.prototype.parserNeedsRefresh = function() { - var parserInfo = this.wiki.getTextReferenceParserInfo(this.transcludeTitle,this.transcludeField,this.transcludeIndex,{subTiddler:this.transcludeSubTiddler}); - return (this.sourceText === undefined || parserInfo.sourceText !== this.sourceText || parserInfo.parserType !== this.parserType) -}; - /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ TranscludeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(($tw.utils.count(changedAttributes) > 0) || (changedTiddlers[this.transcludeTitle] && this.parserNeedsRefresh())) { + if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) { this.refreshSelf(); return true; } else { diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 5401f7b8c..072b76dbf 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -937,57 +937,41 @@ exports.parseTiddler = function(title,options) { }; exports.parseTextReference = function(title,field,index,options) { - var tiddler, - text, - parserInfo; - if(!options.subTiddler) { + var tiddler,text; + if(options.subTiddler) { + tiddler = this.getSubTiddler(title,options.subTiddler); + } else { tiddler = this.getTiddler(title); if(field === "text" || (!field && !index)) { this.getTiddlerText(title); // Force the tiddler to be lazily loaded return this.parseTiddler(title,options); } - } - parserInfo = this.getTextReferenceParserInfo(title,field,index,options); - if(parserInfo.sourceText !== null) { - return this.parseText(parserInfo.parserType,parserInfo.sourceText,options); - } else { - return null; - } -}; - -exports.getTextReferenceParserInfo = function(title,field,index,options) { - var tiddler, - parserInfo = { - sourceText : null, - parserType : "text/vnd.tiddlywiki" - }; - if(options.subTiddler) { - tiddler = this.getSubTiddler(title,options.subTiddler); - } else { - tiddler = this.getTiddler(title); } if(field === "text" || (!field && !index)) { if(tiddler && tiddler.fields) { - parserInfo.sourceText = tiddler.fields.text || ""; - if(tiddler.fields.type) { - parserInfo.parserType = tiddler.fields.type; - } + return this.parseText(tiddler.fields.type,tiddler.fields.text,options); + } else { + return null; } } else if(field) { if(field === "title") { - parserInfo.sourceText = title; - } else if(tiddler && tiddler.fields) { - parserInfo.sourceText = tiddler.fields[field] ? tiddler.fields[field].toString() : null; + text = title; + } else { + if(!tiddler || !tiddler.hasField(field)) { + return null; + } + text = tiddler.fields[field]; } + return this.parseText("text/vnd.tiddlywiki",text.toString(),options); } else if(index) { this.getTiddlerText(title); // Force the tiddler to be lazily loaded - parserInfo.sourceText = this.extractTiddlerDataItem(tiddler,index,null); + text = this.extractTiddlerDataItem(tiddler,index,undefined); + if(text === undefined) { + return null; + } + return this.parseText("text/vnd.tiddlywiki",text,options); } - if(parserInfo.sourceText === null) { - parserInfo.parserType = null; - } - return parserInfo; -} +}; /* Make a widget tree for a parse tree diff --git a/editions/test/tiddlers/tests/test-parsetextreference.js b/editions/test/tiddlers/tests/test-parsetextreference.js deleted file mode 100644 index 411f7a45b..000000000 --- a/editions/test/tiddlers/tests/test-parsetextreference.js +++ /dev/null @@ -1,123 +0,0 @@ -/*\ -title: test-parsetextreference.js -type: application/javascript -tags: [[$:/tags/test-spec]] - -Tests for source attribute in parser returned from wiki.parseTextReference - -\*/ -(function(){ - -/*jslint node: true, browser: true */ -/*global $tw: false */ -"use strict"; - -describe("Wiki.parseTextReference tests", function() { - - // Create a wiki - var wiki = new $tw.Wiki(); - wiki.addTiddler({ - title: "TiddlerOne", - text: "The quick brown fox in $:/TiddlerTwo", - tags: ["one"], - authors: "Joe Bloggs", - modifier: "JoeBloggs", - modified: "201304152222"}); - wiki.addTiddler({ - title: "$:/TiddlerTwo", - tags: ["two"], - authors: "[[John Doe]]", - modifier: "John", - modified: "201304152211"}); - wiki.addTiddler({ - title: "Tiddler Three", - text: '{"oct":31,"nov":30,"dec":31}', - tags: ["one","two"], - type: "application/json", - modifier: "John", - modified: "201304162202"}); - wiki.addTiddler({ - title: "TiddlerFour", - text: "The quick brown fox in $:/TiddlerTwo", - tags: ["one"], - type: "text/vnd.tiddlywiki", - authors: "Joe Bloggs", - modifier: "JoeBloggs", - modified: "201304152222"}); - // Add a plugin containing some shadow tiddlers - var shadowTiddlers = { - tiddlers: { - "$:/TiddlerFive": { - title: "$:/TiddlerFive", - text: "Everything in federation", - tags: ["two"] - }, - "TiddlerSix": { - title: "TiddlerSix", - text: "Missing inaction from TiddlerOne", - filter: "[[one]] [[a a]] [subfilter{hasList!!list}]", - tags: [] - }, - "TiddlerSeventh": { - title: "TiddlerSeventh", - text: "", - list: "TiddlerOne [[Tiddler Three]] [[a fourth tiddler]] MissingTiddler", - tags: ["one"] - }, - "Tiddler8": { - title: "Tiddler8", - text: "Tidd", - tags: ["one"], - "test-field": "JoeBloggs" - } - } - }; - wiki.addTiddler({ - title: "$:/ShadowPlugin", - text: JSON.stringify(shadowTiddlers), - "plugin-type": "plugin", - type: "application/json"}); - wiki.addTiddler({ - title: "TiddlerNine", - text: "this is plain text", - type: "text/plain" - }); - - // Define a parsing shortcut for souce attribute of parser returned by wiki.parseTextReference - var parseAndGetSource = function(title,field,index,subTiddler) { - var parser = wiki.parseTextReference(title,field,index,{subTiddler: subTiddler}); - return parser ? parser.source : null; - }; - - it("should parse text references and return correct source attribute", function(){ - // Existing tiddler with a text field, no field argument specified - expect(parseAndGetSource("TiddlerOne")).toEqual("The quick brown fox in $:/TiddlerTwo"); - // Existing tiddler with a text field, field argument specified as text - expect(parseAndGetSource("TiddlerOne","text")).toEqual("The quick brown fox in $:/TiddlerTwo"); - // Existing tiddler with no text field - expect(parseAndGetSource("$:/TiddlerTwo")).toEqual(""); - // Existing tiddler, field argument specified as authors - expect(parseAndGetSource("TiddlerOne","authors")).toEqual("Joe Bloggs"); - // Non-existent tiddler, no field argument - expect(parseAndGetSource("MissingTiddler")).toEqual(null); - // Non-existent tiddler, field argument - expect(parseAndGetSource("MissingTiddler","missing-field")).toEqual(null); - // Non-existent tiddler, index specified - expect(parseAndGetSource("MissingTiddler",null,"missing-index")).toEqual(null); - // Existing tiddler with non existent field - expect(parseAndGetSource("TiddlerOne","missing-field")).toEqual(null); - // Data tiddler with index specified - expect(parseAndGetSource("Tiddler Three",null,"oct")).toEqual("31"); - // Existing tiddler with a text field, type set to vnd.tiddlywiki - expect(parseAndGetSource("TiddlerFour")).toEqual("The quick brown fox in $:/TiddlerTwo"); - // Existing subtiddler of a plugin - expect(parseAndGetSource("$:/ShadowPlugin","text",null,"Tiddler8")).toEqual("Tidd"); - // Non-existent subtiddler of a plugin - expect(parseAndGetSource("$:/ShadowPlugin","text",null,"MyMissingTiddler")).toEqual(null); - // Plain text tiddler - expect(parseAndGetSource("TiddlerNine")).toEqual(undefined); - }); - -}); - -})(); From 753bf8fe62189f551c4b7087c55b87a9bc3e481d Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 2 Jun 2021 21:45:06 +0100 Subject: [PATCH 1371/2376] Revert "Revert "Transclude widget: refresh selectively when needed (#5736)"" This reverts commit 4f9dd50382b98239b8f611fb513e67146ab3d03a. --- core/modules/widgets/transclude.js | 9 +- core/modules/wiki.js | 56 +++++--- .../tiddlers/tests/test-parsetextreference.js | 123 ++++++++++++++++++ 3 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 editions/test/tiddlers/tests/test-parsetextreference.js diff --git a/core/modules/widgets/transclude.js b/core/modules/widgets/transclude.js index 2acd8109b..18645cd27 100755 --- a/core/modules/widgets/transclude.js +++ b/core/modules/widgets/transclude.js @@ -60,6 +60,8 @@ TranscludeWidget.prototype.execute = function() { subTiddler: this.transcludeSubTiddler }), parseTreeNodes = parser ? parser.tree : this.parseTreeNode.children; + this.sourceText = parser ? parser.source : null; + this.parserType = parser? parser.type : null; // Set context variables for recursion detection var recursionMarker = this.makeRecursionMarker(); if(this.recursionMarker === "yes") { @@ -98,12 +100,17 @@ TranscludeWidget.prototype.makeRecursionMarker = function() { return output.join(""); }; +TranscludeWidget.prototype.parserNeedsRefresh = function() { + var parserInfo = this.wiki.getTextReferenceParserInfo(this.transcludeTitle,this.transcludeField,this.transcludeIndex,{subTiddler:this.transcludeSubTiddler}); + return (this.sourceText === undefined || parserInfo.sourceText !== this.sourceText || parserInfo.parserType !== this.parserType) +}; + /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ TranscludeWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) { + if(($tw.utils.count(changedAttributes) > 0) || (changedTiddlers[this.transcludeTitle] && this.parserNeedsRefresh())) { this.refreshSelf(); return true; } else { diff --git a/core/modules/wiki.js b/core/modules/wiki.js index 072b76dbf..5401f7b8c 100755 --- a/core/modules/wiki.js +++ b/core/modules/wiki.js @@ -937,41 +937,57 @@ exports.parseTiddler = function(title,options) { }; exports.parseTextReference = function(title,field,index,options) { - var tiddler,text; - if(options.subTiddler) { - tiddler = this.getSubTiddler(title,options.subTiddler); - } else { + var tiddler, + text, + parserInfo; + if(!options.subTiddler) { tiddler = this.getTiddler(title); if(field === "text" || (!field && !index)) { this.getTiddlerText(title); // Force the tiddler to be lazily loaded return this.parseTiddler(title,options); } + } + parserInfo = this.getTextReferenceParserInfo(title,field,index,options); + if(parserInfo.sourceText !== null) { + return this.parseText(parserInfo.parserType,parserInfo.sourceText,options); + } else { + return null; + } +}; + +exports.getTextReferenceParserInfo = function(title,field,index,options) { + var tiddler, + parserInfo = { + sourceText : null, + parserType : "text/vnd.tiddlywiki" + }; + if(options.subTiddler) { + tiddler = this.getSubTiddler(title,options.subTiddler); + } else { + tiddler = this.getTiddler(title); } if(field === "text" || (!field && !index)) { if(tiddler && tiddler.fields) { - return this.parseText(tiddler.fields.type,tiddler.fields.text,options); - } else { - return null; + parserInfo.sourceText = tiddler.fields.text || ""; + if(tiddler.fields.type) { + parserInfo.parserType = tiddler.fields.type; + } } } else if(field) { if(field === "title") { - text = title; - } else { - if(!tiddler || !tiddler.hasField(field)) { - return null; - } - text = tiddler.fields[field]; + parserInfo.sourceText = title; + } else if(tiddler && tiddler.fields) { + parserInfo.sourceText = tiddler.fields[field] ? tiddler.fields[field].toString() : null; } - return this.parseText("text/vnd.tiddlywiki",text.toString(),options); } else if(index) { this.getTiddlerText(title); // Force the tiddler to be lazily loaded - text = this.extractTiddlerDataItem(tiddler,index,undefined); - if(text === undefined) { - return null; - } - return this.parseText("text/vnd.tiddlywiki",text,options); + parserInfo.sourceText = this.extractTiddlerDataItem(tiddler,index,null); } -}; + if(parserInfo.sourceText === null) { + parserInfo.parserType = null; + } + return parserInfo; +} /* Make a widget tree for a parse tree diff --git a/editions/test/tiddlers/tests/test-parsetextreference.js b/editions/test/tiddlers/tests/test-parsetextreference.js new file mode 100644 index 000000000..411f7a45b --- /dev/null +++ b/editions/test/tiddlers/tests/test-parsetextreference.js @@ -0,0 +1,123 @@ +/*\ +title: test-parsetextreference.js +type: application/javascript +tags: [[$:/tags/test-spec]] + +Tests for source attribute in parser returned from wiki.parseTextReference + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +describe("Wiki.parseTextReference tests", function() { + + // Create a wiki + var wiki = new $tw.Wiki(); + wiki.addTiddler({ + title: "TiddlerOne", + text: "The quick brown fox in $:/TiddlerTwo", + tags: ["one"], + authors: "Joe Bloggs", + modifier: "JoeBloggs", + modified: "201304152222"}); + wiki.addTiddler({ + title: "$:/TiddlerTwo", + tags: ["two"], + authors: "[[John Doe]]", + modifier: "John", + modified: "201304152211"}); + wiki.addTiddler({ + title: "Tiddler Three", + text: '{"oct":31,"nov":30,"dec":31}', + tags: ["one","two"], + type: "application/json", + modifier: "John", + modified: "201304162202"}); + wiki.addTiddler({ + title: "TiddlerFour", + text: "The quick brown fox in $:/TiddlerTwo", + tags: ["one"], + type: "text/vnd.tiddlywiki", + authors: "Joe Bloggs", + modifier: "JoeBloggs", + modified: "201304152222"}); + // Add a plugin containing some shadow tiddlers + var shadowTiddlers = { + tiddlers: { + "$:/TiddlerFive": { + title: "$:/TiddlerFive", + text: "Everything in federation", + tags: ["two"] + }, + "TiddlerSix": { + title: "TiddlerSix", + text: "Missing inaction from TiddlerOne", + filter: "[[one]] [[a a]] [subfilter{hasList!!list}]", + tags: [] + }, + "TiddlerSeventh": { + title: "TiddlerSeventh", + text: "", + list: "TiddlerOne [[Tiddler Three]] [[a fourth tiddler]] MissingTiddler", + tags: ["one"] + }, + "Tiddler8": { + title: "Tiddler8", + text: "Tidd", + tags: ["one"], + "test-field": "JoeBloggs" + } + } + }; + wiki.addTiddler({ + title: "$:/ShadowPlugin", + text: JSON.stringify(shadowTiddlers), + "plugin-type": "plugin", + type: "application/json"}); + wiki.addTiddler({ + title: "TiddlerNine", + text: "this is plain text", + type: "text/plain" + }); + + // Define a parsing shortcut for souce attribute of parser returned by wiki.parseTextReference + var parseAndGetSource = function(title,field,index,subTiddler) { + var parser = wiki.parseTextReference(title,field,index,{subTiddler: subTiddler}); + return parser ? parser.source : null; + }; + + it("should parse text references and return correct source attribute", function(){ + // Existing tiddler with a text field, no field argument specified + expect(parseAndGetSource("TiddlerOne")).toEqual("The quick brown fox in $:/TiddlerTwo"); + // Existing tiddler with a text field, field argument specified as text + expect(parseAndGetSource("TiddlerOne","text")).toEqual("The quick brown fox in $:/TiddlerTwo"); + // Existing tiddler with no text field + expect(parseAndGetSource("$:/TiddlerTwo")).toEqual(""); + // Existing tiddler, field argument specified as authors + expect(parseAndGetSource("TiddlerOne","authors")).toEqual("Joe Bloggs"); + // Non-existent tiddler, no field argument + expect(parseAndGetSource("MissingTiddler")).toEqual(null); + // Non-existent tiddler, field argument + expect(parseAndGetSource("MissingTiddler","missing-field")).toEqual(null); + // Non-existent tiddler, index specified + expect(parseAndGetSource("MissingTiddler",null,"missing-index")).toEqual(null); + // Existing tiddler with non existent field + expect(parseAndGetSource("TiddlerOne","missing-field")).toEqual(null); + // Data tiddler with index specified + expect(parseAndGetSource("Tiddler Three",null,"oct")).toEqual("31"); + // Existing tiddler with a text field, type set to vnd.tiddlywiki + expect(parseAndGetSource("TiddlerFour")).toEqual("The quick brown fox in $:/TiddlerTwo"); + // Existing subtiddler of a plugin + expect(parseAndGetSource("$:/ShadowPlugin","text",null,"Tiddler8")).toEqual("Tidd"); + // Non-existent subtiddler of a plugin + expect(parseAndGetSource("$:/ShadowPlugin","text",null,"MyMissingTiddler")).toEqual(null); + // Plain text tiddler + expect(parseAndGetSource("TiddlerNine")).toEqual(undefined); + }); + +}); + +})(); From 056e6541a1e4e96b8ab03def25300a1891311e37 Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Wed, 2 Jun 2021 21:47:28 +0100 Subject: [PATCH 1372/2376] Revert 582b156d5f2b9b8b92f9289aa1288e1edb637450: Refresh non-action widgets before invocation --- core/modules/widgets/widget.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index cf73cbca6..ce0102069 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -569,10 +569,9 @@ Widget.prototype.invokeActions = function(triggeringWidget,event) { // For each child widget for(var t=0; t<this.children.length; t++) { var child = this.children[t]; - // Rerender the child to ensure the attribute values are up to date - child.refreshSelf(); // Invoke the child if it is an action widget if(child.invokeAction) { + child.refreshSelf(); if(child.invokeAction(triggeringWidget,event)) { handled = true; } From c4a7ae3164d293549ffc3016b8a6b3ada399344e Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" <jeremy@jermolene.com> Date: Thu, 3 Jun 2021 14:14:11 +0100 Subject: [PATCH 1373/2376] Add demo of drag and drop from a standalone HTML file --- drag-and-drop-interop.html | 35 +++++++++++++++++++ editions/dev/tiddlers/HelloThere.tid | 1 + .../new/TiddlyWiki Drag and Drop Interop.tid | 15 ++++++++ .../dev/tiddlers/new/dragndropinterop.html | 35 +++++++++++++++++++ .../tiddlers/new/dragndropinterop.html.meta | 3 ++ .../tiddlers/new/save-dragndropinterop.tid | 3 ++ 6 files changed, 92 insertions(+) create mode 100644 drag-and-drop-interop.html create mode 100644 editions/dev/tiddlers/new/TiddlyWiki Drag and Drop Interop.tid create mode 100644 editions/dev/tiddlers/new/dragndropinterop.html create mode 100644 editions/dev/tiddlers/new/dragndropinterop.html.meta create mode 100644 editions/dev/tiddlers/new/save-dragndropinterop.tid diff --git a/drag-and-drop-interop.html b/drag-and-drop-interop.html new file mode 100644 index 000000000..ecd7aba12 --- /dev/null +++ b/drag-and-drop-interop.html @@ -0,0 +1,35 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>Drag and Drop Interoperability with TiddlyWiki Demo + + + +
      + Drag me to a TiddlyWiki window +
      + + + \ No newline at end of file diff --git a/editions/dev/tiddlers/HelloThere.tid b/editions/dev/tiddlers/HelloThere.tid index 8afc1b22c..021e0ad47 100644 --- a/editions/dev/tiddlers/HelloThere.tid +++ b/editions/dev/tiddlers/HelloThere.tid @@ -13,6 +13,7 @@ Welcome to the developer documentation for TiddlyWiki (https://tiddlywiki.com/). ** HookMechanism ** [[Using ES2016 for Writing Plugins]] ** [[Adding Babel Polyfill to TiddlyWiki]] +** [[TiddlyWiki Drag and Drop Interoperability]] * The original developer documentation from https://tiddlywiki.com: ** [[TiddlyWiki for Developers]] ** [[TiddlyWiki Coding Style Guidelines]] diff --git a/editions/dev/tiddlers/new/TiddlyWiki Drag and Drop Interop.tid b/editions/dev/tiddlers/new/TiddlyWiki Drag and Drop Interop.tid new file mode 100644 index 000000000..6808de4dd --- /dev/null +++ b/editions/dev/tiddlers/new/TiddlyWiki Drag and Drop Interop.tid @@ -0,0 +1,15 @@ +title: TiddlyWiki Drag and Drop Interoperability + +It is straightforward to allow any HTML file to interoperate with TiddlyWiki's drag and drop implementation. + +This example shows how to attach draggable data to a DOM element. The data is provided in two different forms: + +* the string data is used if the element is dragged onto a text editing area +* the tiddler data is used if the element is dragged into TiddlyWiki's import area + +<$button> +<$action-sendmessage $message="tm-download-file" $param="$:/dev/save/dragndropinterop" filename="index.html"/> +Download this sample code + + +<$codeblock code={{DragAndDropInterop}} language="text/html"/> diff --git a/editions/dev/tiddlers/new/dragndropinterop.html b/editions/dev/tiddlers/new/dragndropinterop.html new file mode 100644 index 000000000..ecd7aba12 --- /dev/null +++ b/editions/dev/tiddlers/new/dragndropinterop.html @@ -0,0 +1,35 @@ + + + + + Drag and Drop Interoperability with TiddlyWiki Demo + + + +
      + Drag me to a TiddlyWiki window +
      + + + \ No newline at end of file diff --git a/editions/dev/tiddlers/new/dragndropinterop.html.meta b/editions/dev/tiddlers/new/dragndropinterop.html.meta new file mode 100644 index 000000000..d4adb96b9 --- /dev/null +++ b/editions/dev/tiddlers/new/dragndropinterop.html.meta @@ -0,0 +1,3 @@ +title: DragAndDropInterop +type: text/html + diff --git a/editions/dev/tiddlers/new/save-dragndropinterop.tid b/editions/dev/tiddlers/new/save-dragndropinterop.tid new file mode 100644 index 000000000..3e9eab89f --- /dev/null +++ b/editions/dev/tiddlers/new/save-dragndropinterop.tid @@ -0,0 +1,3 @@ +title: $:/dev/save/dragndropinterop + +<$view tiddler="DragAndDropInterop" field="text"/> From 2b911ac11fb245703a59fb7a34f8265bf6041e47 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Fri, 4 Jun 2021 17:59:45 +0200 Subject: [PATCH 1374/2376] Make the insert- and remove-animations of storyviews work in new windows (#5755) * Make classic storyview work in new windows, too * Make pop storyview work in new windows, too * Make zoomin storyview insert and remove animation work in new windows, too --- core/modules/storyviews/classic.js | 6 +++--- core/modules/storyviews/pop.js | 4 ++-- core/modules/storyviews/zoomin.js | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js index fe6925b99..f33641cab 100644 --- a/core/modules/storyviews/classic.js +++ b/core/modules/storyviews/classic.js @@ -43,7 +43,7 @@ ClassicStoryView.prototype.insert = function(widget) { if(duration) { var targetElement = widget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement.nodeType === Node.TEXT_NODE) { return; } // Get the current height of the tiddler @@ -83,7 +83,7 @@ ClassicStoryView.prototype.remove = function(widget) { widget.removeChildDomNodes(); }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } @@ -118,4 +118,4 @@ ClassicStoryView.prototype.remove = function(widget) { exports.classic = ClassicStoryView; -})(); \ No newline at end of file +})(); diff --git a/core/modules/storyviews/pop.js b/core/modules/storyviews/pop.js index d0592cf18..6e4c54874 100644 --- a/core/modules/storyviews/pop.js +++ b/core/modules/storyviews/pop.js @@ -35,7 +35,7 @@ PopStoryView.prototype.insert = function(widget) { var targetElement = widget.findFirstDomNode(), duration = $tw.utils.getAnimationDuration(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement.nodeType === Node.TEXT_NODE) { return; } // Reset once the transition is over @@ -77,7 +77,7 @@ PopStoryView.prototype.remove = function(widget) { } }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } diff --git a/core/modules/storyviews/zoomin.js b/core/modules/storyviews/zoomin.js index be65b8e3a..a1b2e79e2 100644 --- a/core/modules/storyviews/zoomin.js +++ b/core/modules/storyviews/zoomin.js @@ -130,7 +130,7 @@ function findTitleDomNode(widget,targetClass) { ZoominListView.prototype.insert = function(widget) { var targetElement = widget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement.nodeType === Node.TEXT_NODE) { return; } // Make the newly inserted node position absolute and hidden @@ -147,7 +147,7 @@ ZoominListView.prototype.remove = function(widget) { widget.removeChildDomNodes(); }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } From afa4ea3d03b28c03d3eebbb2fa89bbabf8b4ab19 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 6 Jun 2021 11:47:19 +0200 Subject: [PATCH 1375/2376] Make navigation in new windows work for storyviews (#5759) --- core/modules/storyviews/classic.js | 6 +++--- core/modules/storyviews/pop.js | 6 +++--- core/modules/storyviews/zoomin.js | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js index f33641cab..653a7e437 100644 --- a/core/modules/storyviews/classic.js +++ b/core/modules/storyviews/classic.js @@ -27,7 +27,7 @@ ClassicStoryView.prototype.navigateTo = function(historyInfo) { var listItemWidget = this.listWidget.children[listElementIndex], targetElement = listItemWidget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { return; } if(duration) { @@ -43,7 +43,7 @@ ClassicStoryView.prototype.insert = function(widget) { if(duration) { var targetElement = widget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement.nodeType === Node.TEXT_NODE) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { return; } // Get the current height of the tiddler @@ -83,7 +83,7 @@ ClassicStoryView.prototype.remove = function(widget) { widget.removeChildDomNodes(); }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement.nodeType === Node.TEXT_NODE) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } diff --git a/core/modules/storyviews/pop.js b/core/modules/storyviews/pop.js index 6e4c54874..bb66606c5 100644 --- a/core/modules/storyviews/pop.js +++ b/core/modules/storyviews/pop.js @@ -24,7 +24,7 @@ PopStoryView.prototype.navigateTo = function(historyInfo) { var listItemWidget = this.listWidget.children[listElementIndex], targetElement = listItemWidget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { return; } // Scroll the node into view @@ -35,7 +35,7 @@ PopStoryView.prototype.insert = function(widget) { var targetElement = widget.findFirstDomNode(), duration = $tw.utils.getAnimationDuration(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement.nodeType === Node.TEXT_NODE) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { return; } // Reset once the transition is over @@ -77,7 +77,7 @@ PopStoryView.prototype.remove = function(widget) { } }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement.nodeType === Node.TEXT_NODE) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } diff --git a/core/modules/storyviews/zoomin.js b/core/modules/storyviews/zoomin.js index a1b2e79e2..9ece5823f 100644 --- a/core/modules/storyviews/zoomin.js +++ b/core/modules/storyviews/zoomin.js @@ -48,7 +48,7 @@ ZoominListView.prototype.navigateTo = function(historyInfo) { var listItemWidget = this.listWidget.children[listElementIndex], targetElement = listItemWidget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(!(targetElement instanceof Element)) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { return; } // Make the new tiddler be position absolute and visible so that we can measure it @@ -130,7 +130,7 @@ function findTitleDomNode(widget,targetClass) { ZoominListView.prototype.insert = function(widget) { var targetElement = widget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement.nodeType === Node.TEXT_NODE) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { return; } // Make the newly inserted node position absolute and hidden @@ -147,7 +147,7 @@ ZoominListView.prototype.remove = function(widget) { widget.removeChildDomNodes(); }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement.nodeType === Node.TEXT_NODE) { + if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } From 2f1806ab6a2ebeb814c2034abff6c2f9d3f8b289 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 6 Jun 2021 12:03:08 +0200 Subject: [PATCH 1376/2376] Keyboard widget: don't refresh when class changes (#5758) --- core/modules/widgets/keyboard.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/core/modules/widgets/keyboard.js b/core/modules/widgets/keyboard.js index 035e4e351..bd980121b 100644 --- a/core/modules/widgets/keyboard.js +++ b/core/modules/widgets/keyboard.js @@ -40,9 +40,8 @@ KeyboardWidget.prototype.render = function(parent,nextSibling) { // Create element var domNode = this.document.createElement(tag); // Assign classes - var classes = (this["class"] || "").split(" "); - classes.push("tc-keyboard"); - domNode.className = classes.join(" "); + this.domNode = domNode; + this.assignDomNodeClasses(); // Add a keyboard event handler $tw.utils.addEventListeners(domNode,[ {name: "keydown", handlerObject: this, handlerMethod: "handleChangeEvent"} @@ -90,7 +89,6 @@ KeyboardWidget.prototype.execute = function() { this.key = this.getAttribute("key",""); this.tag = this.getAttribute("tag",""); this.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key); - this["class"] = this.getAttribute("class",""); if(this.key.substr(0,2) === "((" && this.key.substr(-2,2) === "))") { this.shortcutTiddlers = []; var name = this.key.substring(2,this.key.length -2); @@ -102,14 +100,22 @@ KeyboardWidget.prototype.execute = function() { this.makeChildWidgets(); }; +KeyboardWidget.prototype.assignDomNodeClasses = function() { + var classes = this.getAttribute("class","").split(" "); + classes.push("tc-keyboard"); + this.domNode.className = classes.join(" "); +}; + /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ KeyboardWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); - if(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes["class"] || changedAttributes.tag) { + if(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes.tag) { this.refreshSelf(); return true; + } else if(changedAttributes["class"]) { + this.assignDomNodeClasses(); } // Update the keyInfoArray if one of its shortcut-config-tiddlers has changed if(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) { From c18b7527a761bd7da6c603444dd029cfcca55cdc Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Sun, 6 Jun 2021 13:42:28 +0200 Subject: [PATCH 1377/2376] Fix #5760 - tm-focus-selector doesn't work in new windows (#5766) * Pass the original event to invokeActionString * Update rootwidget.js --- core/modules/keyboard.js | 2 +- core/modules/startup/rootwidget.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/modules/keyboard.js b/core/modules/keyboard.js index 1ae9ba482..1d818a25f 100644 --- a/core/modules/keyboard.js +++ b/core/modules/keyboard.js @@ -324,7 +324,7 @@ KeyboardManager.prototype.handleKeydownEvent = function(event) { if(key !== undefined) { event.preventDefault(); event.stopPropagation(); - $tw.rootWidget.invokeActionString(action,$tw.rootWidget); + $tw.rootWidget.invokeActionString(action,$tw.rootWidget,event); return true; } return false; diff --git a/core/modules/startup/rootwidget.js b/core/modules/startup/rootwidget.js index 6486cf6a2..8f119f02a 100644 --- a/core/modules/startup/rootwidget.js +++ b/core/modules/startup/rootwidget.js @@ -40,9 +40,10 @@ exports.startup = function() { // Install the tm-focus-selector message $tw.rootWidget.addEventListener("tm-focus-selector",function(event) { var selector = event.param || "", - element; + element, + doc = event.event ? event.event.target.ownerDocument : document; try { - element = document.querySelector(selector); + element = doc.querySelector(selector); } catch(e) { console.log("Error in selector: ",selector) } From 219beb13cc77bae54637e6d0d737153c9371da40 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Wed, 9 Jun 2021 11:18:15 +0200 Subject: [PATCH 1378/2376] Add test to storyviews if targetElement is null (#5767) * Update classic.js * Update pop.js * Update zoomin.js * simplify test in classic.js * simplify test in pop.js * simplify test in zoomin.js --- core/modules/storyviews/classic.js | 6 +++--- core/modules/storyviews/pop.js | 6 +++--- core/modules/storyviews/zoomin.js | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/modules/storyviews/classic.js b/core/modules/storyviews/classic.js index 653a7e437..c2848c435 100644 --- a/core/modules/storyviews/classic.js +++ b/core/modules/storyviews/classic.js @@ -27,7 +27,7 @@ ClassicStoryView.prototype.navigateTo = function(historyInfo) { var listItemWidget = this.listWidget.children[listElementIndex], targetElement = listItemWidget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { return; } if(duration) { @@ -43,7 +43,7 @@ ClassicStoryView.prototype.insert = function(widget) { if(duration) { var targetElement = widget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { return; } // Get the current height of the tiddler @@ -83,7 +83,7 @@ ClassicStoryView.prototype.remove = function(widget) { widget.removeChildDomNodes(); }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } diff --git a/core/modules/storyviews/pop.js b/core/modules/storyviews/pop.js index bb66606c5..e2634e3d5 100644 --- a/core/modules/storyviews/pop.js +++ b/core/modules/storyviews/pop.js @@ -24,7 +24,7 @@ PopStoryView.prototype.navigateTo = function(historyInfo) { var listItemWidget = this.listWidget.children[listElementIndex], targetElement = listItemWidget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { return; } // Scroll the node into view @@ -35,7 +35,7 @@ PopStoryView.prototype.insert = function(widget) { var targetElement = widget.findFirstDomNode(), duration = $tw.utils.getAnimationDuration(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { return; } // Reset once the transition is over @@ -77,7 +77,7 @@ PopStoryView.prototype.remove = function(widget) { } }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } diff --git a/core/modules/storyviews/zoomin.js b/core/modules/storyviews/zoomin.js index 9ece5823f..b2796e953 100644 --- a/core/modules/storyviews/zoomin.js +++ b/core/modules/storyviews/zoomin.js @@ -48,7 +48,7 @@ ZoominListView.prototype.navigateTo = function(historyInfo) { var listItemWidget = this.listWidget.children[listElementIndex], targetElement = listItemWidget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { return; } // Make the new tiddler be position absolute and visible so that we can measure it @@ -130,7 +130,7 @@ function findTitleDomNode(widget,targetClass) { ZoominListView.prototype.insert = function(widget) { var targetElement = widget.findFirstDomNode(); // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { return; } // Make the newly inserted node position absolute and hidden @@ -147,7 +147,7 @@ ZoominListView.prototype.remove = function(widget) { widget.removeChildDomNodes(); }; // Abandon if the list entry isn't a DOM element (it might be a text node) - if(targetElement === undefined || targetElement.nodeType === Node.TEXT_NODE) { + if(!targetElement || targetElement.nodeType === Node.TEXT_NODE) { removeElement(); return; } From a70b26cd55ec79b4f9dc659622144e1a00c2901e Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 9 Jun 2021 22:32:31 +0200 Subject: [PATCH 1379/2376] Sign the CLA (#5774) --- licenses/cla-individual.md | 1 + 1 file changed, 1 insertion(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index e2b436769..e30cf0cfe 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -454,3 +454,4 @@ Urban Alič, @ualich, 2021/05/06 Joe Bordes, @joebordes, 2021/05/30 +Frank Bruns-Ballhausen, @FBB-de, 2021/06/09 From 6dd1887f0bb79e5abb8fd4d7257ae830592b55bf Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Fri, 11 Jun 2021 17:56:06 +0200 Subject: [PATCH 1380/2376] Use event.event.view.confirm for confirmation messages in navigator.js and action-confirm.js (#5776) --- core/modules/widgets/action-confirm.js | 7 ++++--- core/modules/widgets/navigator.js | 18 +++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/core/modules/widgets/action-confirm.js b/core/modules/widgets/action-confirm.js index eb762f050..5ad798663 100644 --- a/core/modules/widgets/action-confirm.js +++ b/core/modules/widgets/action-confirm.js @@ -58,9 +58,10 @@ Invoke the action associated with this widget */ ConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) { var invokeActions = true, - handled = true; + handled = true, + win = event.event && event.event.view ? event.event.view : window; if(this.prompt) { - invokeActions = confirm(this.message); + invokeActions = win.confirm(this.message); } if(invokeActions) { handled = this.invokeActions(triggeringWidget,event); @@ -74,4 +75,4 @@ ConfirmWidget.prototype.allowActionPropagation = function() { exports["action-confirm"] = ConfirmWidget; -})(); \ No newline at end of file +})(); diff --git a/core/modules/widgets/navigator.js b/core/modules/widgets/navigator.js index 9df76acc4..6991d26e2 100755 --- a/core/modules/widgets/navigator.js +++ b/core/modules/widgets/navigator.js @@ -183,7 +183,8 @@ NavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) { // Place a tiddler in edit mode NavigatorWidget.prototype.handleEditTiddlerEvent = function(event) { - var editTiddler = $tw.hooks.invokeHook("th-editing-tiddler",event); + var editTiddler = $tw.hooks.invokeHook("th-editing-tiddler",event), + win = event.event && event.event.view ? event.event.view : window; if(!editTiddler) { return false; } @@ -192,7 +193,7 @@ NavigatorWidget.prototype.handleEditTiddlerEvent = function(event) { return self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title); } function confirmEditShadow(title) { - return confirm($tw.language.getString( + return win.confirm($tw.language.getString( "ConfirmEditShadowTiddler", {variables: {title: title} @@ -225,7 +226,8 @@ NavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) { storyList = this.getStoryList(), originalTitle = tiddler ? tiddler.fields["draft.of"] : "", originalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined, - confirmationTitle; + confirmationTitle, + win = event.event && event.event.view ? event.event.view : window; if(!tiddler) { return false; } @@ -238,7 +240,7 @@ NavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) { confirmationTitle = title; } // Seek confirmation - if((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || "") !== "") && !confirm($tw.language.getString( + if((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || "") !== "") && !win.confirm($tw.language.getString( "ConfirmDeleteTiddler", {variables: {title: confirmationTitle} @@ -304,7 +306,8 @@ NavigatorWidget.prototype.generateDraftTitle = function(title) { NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) { var title = event.param || event.tiddlerTitle, tiddler = this.wiki.getTiddler(title), - storyList = this.getStoryList(); + storyList = this.getStoryList(), + win = event.event && event.event.view ? event.event.view : window; // Replace the original tiddler with the draft if(tiddler) { var draftTitle = (tiddler.fields["draft.title"] || "").trim(), @@ -313,7 +316,7 @@ NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) { var isRename = draftOf !== draftTitle, isConfirmed = true; if(isRename && this.wiki.tiddlerExists(draftTitle)) { - isConfirmed = confirm($tw.language.getString( + isConfirmed = win.confirm($tw.language.getString( "ConfirmOverwriteTiddler", {variables: {title: draftTitle} @@ -362,6 +365,7 @@ NavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) { // Take a tiddler out of edit mode without saving the changes NavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) { event = $tw.hooks.invokeHook("th-cancelling-tiddler", event); + var win = event.event && event.event.view ? event.event.view : window; // Flip the specified tiddler from draft back to the original var draftTitle = event.param || event.tiddlerTitle, draftTiddler = this.wiki.getTiddler(draftTitle), @@ -372,7 +376,7 @@ NavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) { originalTiddler = this.wiki.getTiddler(originalTitle), storyList = this.getStoryList(); if(this.wiki.isDraftModified(draftTitle)) { - isConfirmed = confirm($tw.language.getString( + isConfirmed = win.confirm($tw.language.getString( "ConfirmCancelTiddler", {variables: {title: draftTitle} From b5db4884388c60accec9e456a3d4a798dbdd6f7b Mon Sep 17 00:00:00 2001 From: Odin <74539616+OdinJorna@users.noreply.github.com> Date: Fri, 11 Jun 2021 18:56:45 +0200 Subject: [PATCH 1381/2376] Update release notes 5.1.24 to 5.2.0 (#5754) --- .../prerelease/tiddlers/Release 5.1.24.tid | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index 0eca552c9..aab85dde8 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -1,8 +1,8 @@ -caption: 5.1.24 +caption: 5.2.0 created: 20201229120443187 -modified: 20201229120443187 +modified: 20210604142913752 tags: ReleaseNotes -title: Release 5.1.24 +title: Release 5.2.0 type: text/vnd.tiddlywiki \define contributor(username) @@ -17,6 +17,7 @@ type: text/vnd.tiddlywiki * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5362">> [[all Operator]] to use new linked list implementation * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5369">> [[links Operator]] to use new linked list implementation * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5383">> unneeded escaping of double quotes in tiddler DIVs inside single file wikis (saving about 10% from the size of empty.html) +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5436">> Network performance for node.js ! Usability Improvements @@ -29,14 +30,26 @@ type: text/vnd.tiddlywiki * <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/commit/caec6bc3fea9155eb2b0aae64d577c565dd7b088">> SVG optimiser script * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/c325380231a8c592a6e51d4498c1e6c3a241b539">> plus/minus SVG icons: <<.icon $:/core/images/plus-button>> and <<.icon $:/core/images/minus-button>> * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5294">> support for [[dynamic toolbar buttons|How to create dynamic editor toolbar buttons]] -* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5612">> [[average Operator]], [[median Operator]], [[variance Operator]] and [[standard-deviation Operator]] for calculating the arithmetic mean of a list of numbers * <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/cf56a17f28f1e44dcb62c5e161be4ac29e27c3f2">> unusedtitle macro to use the prefix parameter +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5672">> link to the existing tiddler when the warning Target tiddler already exists is displayed in EditTemplate +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5699">> (and again [[here|https://github.com/Jermolene/TiddlyWiki5/pull/5705]]) ability to drag 'n drop images in the editor to import and insert +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5707">> text operation [[insert-text|WidgetMessage: tm-edit-text-operation]] +* <<.link-badge-updated "https://github.com/Jermolene/TiddlyWiki5/pull/5467">> syncadaptor "save" "load" and "delete" methods +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5479">> possibility to import formerly blocked system tiddlers +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5720">> color-scheme field to all themes to differentiate between light and dark themes +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5727">> class to make tags in EditTemplate look like the tag-pills in the ViewTemplate +! Filter improvements + +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5612">> [[average Operator]], [[median Operator]], [[variance Operator]] and [[standard-deviation Operator]] for calculating the arithmetic mean of a list of numbers +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5673">> [[deserializers filter Operator|deserializers Operator]] +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5665">> [[format:titlelist operator|format Operator]] ! Hackability Improvements * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/9eda02868f21e9dd1733ffe26352bd7ac96285b4">> new MessageCatcherWidget * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/d25e540dd2f0decf61c52fdc665a28a5dfeda93f">> support for `image/vnd.microsoft.icon` content type +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5458">> Add throttling for changed tiddlers prefixed with $:/volatile/ ! Widget Improvements * <<.link-badge-modified "https://github.com/Jermolene/TiddlyWiki5/commit/b9647b2c48152dac069a1099a0822b32375a66cf">> [[FieldManglerWidget]] to ensure it doesn't propogate events that it traps @@ -49,6 +62,8 @@ type: text/vnd.tiddlywiki * <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/07caa16e8714afe9a64eb202375e4a2f95da1508">> [[DropzoneWidget]] to also use the specified deserializer for strings either dropped or pasted on to the dropzone * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/44df6fe52f79bee88357afb4fc3d6f4800aa6dde">> issue with widget not being available to filter operator * <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/3f986861538a3cc5c3c6da578b45d0d9138a6b2b">> [[ActionPopupWidget]] to create floating popups that must be manually cleared +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/pull/5648">> [[KeyboardWidget]] to allow for more flexibility +* <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/9faaa312998d48c56bd50335820b6b881266af4b">> [[ActionCreateTiddlerWidget]] to make new title available as a variable ! Client-server Improvements @@ -93,10 +108,13 @@ type: text/vnd.tiddlywiki * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5377">> the Jasmine test suite output * <<.link-badge-extended "https://github.com/Jermolene/TiddlyWiki5/commit/9f9ce6595b08032a602981f82940ca113cff8211">> wikitext parser with a subclassing mechanism * <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/commit/ef76349c37662e9706acfffc2c2edb51a920183d">> added support for ''utils-browser'' modules +* <<.link-badge-added "https://github.com/Jermolene/TiddlyWiki5/pull/5464">> th-before-importing hook mechanism to allow plugins to inspect or modify the `importTiddler` object ''before'' any tiddlers are imported ! Translation improvements * <<.link-badge-improved>> Chinese translations +* <<.link-badge-improved>> French translations +* <<.link-badge-improved>> Spanish translations ! Other Bug Fixes @@ -117,7 +135,17 @@ type: text/vnd.tiddlywiki * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/commit/d56e8764a1f02a214df5da1cc95191be2da2491b">> accessibility of button widget when controlling a popup * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/d6ea369f5ef9d3092a360a4286a99902df37782b">> EditTextWidget to use default text for missing fields * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5552">> css-escape-polyfill to work under Node.js - +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/dbd3f835bf8399ed1a3da7cc322ec9b6ab783d53">> crash when sorting by non-string fields +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5711">> some bugs in the [[EventCatcherWidget]] and introduced new `stopPorpagation` attribute +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5691">> CurrentTiddler variable consistency in subfilters and prefixes +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/485779f5b2136b7bcd739352b56188d94b0eb9e4">> crash when accessing variables in filters that don't have a widget context +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/8fbf52e419e71d726ea32b6c44e3ccfc4245d825">> unnecessary triggering reload warning when javascript tiddlers are not subsequently imported +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5521">> minor issue with import pragma +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5700">> leading and trailing whitespace in themes +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5469">> configuration list of HTML5 block elements +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5692">> shape and color for disabled button to work with `tc-btn-invisible` class +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5473">> inconsistent spacing of ViewToolbar items +* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/582b156d5f2b9b8b92f9289aa1288e1edb637450">> a [[bug|https://github.com/Jermolene/TiddlyWiki5/issues/5744]] where non-action widgets are not refreshed before invocation [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: From 4f33d2f35cd2c34ca5edfcf062f23bd1ca7ef177 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz Date: Fri, 11 Jun 2021 19:15:07 +0200 Subject: [PATCH 1382/2376] Update release notes (#5780) --- editions/prerelease/tiddlers/Release 5.1.24.tid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editions/prerelease/tiddlers/Release 5.1.24.tid b/editions/prerelease/tiddlers/Release 5.1.24.tid index aab85dde8..4799ea95d 100644 --- a/editions/prerelease/tiddlers/Release 5.1.24.tid +++ b/editions/prerelease/tiddlers/Release 5.1.24.tid @@ -18,6 +18,7 @@ type: text/vnd.tiddlywiki * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5369">> [[links Operator]] to use new linked list implementation * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5383">> unneeded escaping of double quotes in tiddler DIVs inside single file wikis (saving about 10% from the size of empty.html) * <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5436">> Network performance for node.js +* <<.link-badge-improved "https://github.com/Jermolene/TiddlyWiki5/pull/5736">> refreshing of transclude widget. ! Usability Improvements @@ -145,7 +146,6 @@ type: text/vnd.tiddlywiki * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5469">> configuration list of HTML5 block elements * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5692">> shape and color for disabled button to work with `tc-btn-invisible` class * <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/pull/5473">> inconsistent spacing of ViewToolbar items -* <<.link-badge-fixed "https://github.com/Jermolene/TiddlyWiki5/commit/582b156d5f2b9b8b92f9289aa1288e1edb637450">> a [[bug|https://github.com/Jermolene/TiddlyWiki5/issues/5744]] where non-action widgets are not refreshed before invocation [[@Jermolene|https://github.com/Jermolene]] would like to thank the contributors to this release who have generously given their time to help improve TiddlyWiki: From 960160b3a266a12d3d9d157e7edaef409c308462 Mon Sep 17 00:00:00 2001 From: felixhayashi <4307137+felixhayashi@users.noreply.github.com> Date: Mon, 14 Jun 2021 11:37:04 +0200 Subject: [PATCH 1383/2376] word break property when viewing field values (#1661) --- themes/tiddlywiki/vanilla/base.tid | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index 30a65926a..ea1063f3d 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -1052,6 +1052,7 @@ button.tc-btn-invisible.tc-remove-tag-button { } .tc-view-field-value { + word-break: break-all; } @media (max-width: <>) { From f2e26927c12bcdac831b9b33180c0fe43d289cb0 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 14 Jun 2021 11:59:31 +0200 Subject: [PATCH 1384/2376] Add test for event.event.target being undefined in the tm-focus-selector listener (#5771) --- core/modules/startup/rootwidget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/startup/rootwidget.js b/core/modules/startup/rootwidget.js index 8f119f02a..721f84d5d 100644 --- a/core/modules/startup/rootwidget.js +++ b/core/modules/startup/rootwidget.js @@ -41,7 +41,7 @@ exports.startup = function() { $tw.rootWidget.addEventListener("tm-focus-selector",function(event) { var selector = event.param || "", element, - doc = event.event ? event.event.target.ownerDocument : document; + doc = event.event && event.event.target ? event.event.target.ownerDocument : document; try { element = doc.querySelector(selector); } catch(e) { From 3cd80de5bbadf5711c7c34342ad6bddf5565cf83 Mon Sep 17 00:00:00 2001 From: Simon Huber Date: Mon, 14 Jun 2021 12:01:00 +0200 Subject: [PATCH 1385/2376] Revert #5720 and fix #5770 by removing :root { color-scheme: ... } --- themes/tiddlywiki/vanilla/base.tid | 4 ---- 1 file changed, 4 deletions(-) diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid index ea1063f3d..256152404 100644 --- a/themes/tiddlywiki/vanilla/base.tid +++ b/themes/tiddlywiki/vanilla/base.tid @@ -333,10 +333,6 @@ table tfoot tr td { height: 600px; } -:root { - color-scheme: {{{ [{$:/palette}get[color-scheme]] }}}; -} - /* ** Links */ From 8f9e8c1dee0942d30b34d3199fc7efea1a99e810 Mon Sep 17 00:00:00 2001 From: Saq Imtiaz Date: Mon, 14 Jun 2021 13:03:59 +0200 Subject: [PATCH 1386/2376] Keyboard widget: provide variable for shortcut descriptor to actions. (#5782) --- core/modules/keyboard.js | 16 ++++++++++++---- core/modules/widgets/keyboard.js | 6 +++++- .../tw5.com/tiddlers/widgets/KeyboardWidget.tid | 3 ++- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/core/modules/keyboard.js b/core/modules/keyboard.js index 1d818a25f..5e02a706d 100644 --- a/core/modules/keyboard.js +++ b/core/modules/keyboard.js @@ -179,7 +179,7 @@ Key descriptors have the following format: ctrl+enter ctrl+shift+alt+A */ -KeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) { +KeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor,options) { var components = keyDescriptor.split(/\+|\-/), info = { keyCode: 0, @@ -206,6 +206,9 @@ KeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) { info.keyCode = this.namedKeys[s]; } } + if(options.keyDescriptor) { + info.keyDescriptor = options.keyDescriptor; + } if(info.keyCode) { return info; } else { @@ -237,6 +240,7 @@ KeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) lookupName = function(configName) { var keyDescriptors = wiki.getTiddlerText("$:/config/" + configName + "/" + name); if(keyDescriptors) { + options.keyDescriptor = keyDescriptor; result.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options)); } }; @@ -245,7 +249,7 @@ KeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) }); } } else { - result.push(self.parseKeyDescriptor(keyDescriptor)); + result.push(self.parseKeyDescriptor(keyDescriptor,options)); } }); return result; @@ -276,12 +280,16 @@ KeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) { }; KeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) { + return (this.getMatchingKeyDescriptor(event,keyInfoArray) !== null); +}; + +KeyboardManager.prototype.getMatchingKeyDescriptor = function(event,keyInfoArray) { for(var t=0; t` widget is rendered normally. The keyboard short |!Variables |!Description | |`event-key` |The <<.var event-key>> variable contains the character, if possible. eg: `1`. You can experiment with some settings at: [[Key Codes (Example)]] | |`event-code` |The <<.var event-code>> variable contains a character description. eg: `Digit1` instead of `1`. Or `Space` instead of an empty string ` `, which is hard to see| +|`event-key-descriptor` |The <<.var event-key-descriptor>> variable is available if the keyboard event captured was configured using a [[keyboard shortcut descriptor|Keyboard Shortcut Descriptor]] of the form `((my-shortcut))` which references a configuration tiddler. | |`modifier` |The [[modifier Variable]] contains the Modifier Key held during the event (can be normal, ctrl, shift, alt or combinations thereof) | ! Key Strings From 06318b7617dd2353e8dfdd57ade7bc37c4dfceac Mon Sep 17 00:00:00 2001 From: Saq Imtiaz Date: Mon, 14 Jun 2021 17:46:39 +0200 Subject: [PATCH 1387/2376] Pass reference to widget to CodeMirror (#5790) --- plugins/tiddlywiki/codemirror/engine.js | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/tiddlywiki/codemirror/engine.js b/plugins/tiddlywiki/codemirror/engine.js index 4d20b7733..e5e241a47 100755 --- a/plugins/tiddlywiki/codemirror/engine.js +++ b/plugins/tiddlywiki/codemirror/engine.js @@ -109,6 +109,7 @@ function CodeMirrorEngine(options) { if(this.widget.editTabIndex) { config["tabindex"] = this.widget.editTabIndex; } + config.editWidget = this.widget; // Create the CodeMirror instance this.cm = window.CodeMirror(function(cmDomNode) { // Note that this is a synchronous callback that is called before the constructor returns From 9c0d6a46ccfbb608312402fee111c7c0707fb282 Mon Sep 17 00:00:00 2001 From: Mario Pietsch Date: Mon, 14 Jun 2021 18:39:56 +0200 Subject: [PATCH 1388/2376] Add "commentpragma" html style rule (#5726) * html-comment, that can be used in the pragma area * add commentpragma test * fix typo * fix typo and change comments ab bit * combine html-comment and pragma-comment and add some docs, how to use it * Make docs simpler by removing caching info * change h2 wording --- .../parsers/wikiparser/rules/commentblock.js | 8 ++++++- .../tiddlers/tests/test-wikitext-parser.js | 7 +++++++ .../tiddlers/wikitext/HTML in WikiText.tid | 21 +++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/core/modules/parsers/wikiparser/rules/commentblock.js b/core/modules/parsers/wikiparser/rules/commentblock.js index b7651c272..1c303f38f 100644 --- a/core/modules/parsers/wikiparser/rules/commentblock.js +++ b/core/modules/parsers/wikiparser/rules/commentblock.js @@ -7,6 +7,12 @@ Wiki text block rule for HTML comments. For example: ``` +\define macroX() + +xxxx +\end + + ``` Note that the syntax for comments is simplified to an opening "" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html) @@ -19,7 +25,7 @@ Note that the syntax for comments is simplified to an opening "\n\\define aMacro()\nnothing\n\\end\n")).toEqual( + + [ { type : 'set', attributes : { name : { type : 'string', value : 'aMacro' }, value : { type : 'string', value : 'nothing' } }, children : [ ], params : [ ], isMacroDefinition : true } ] + + ); }); it("should parse inline macro calls", function() { diff --git a/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid b/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid index 412963adc..ec19e8a84 100644 --- a/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid +++ b/editions/tw5.com/tiddlers/wikitext/HTML in WikiText.tid @@ -1,10 +1,12 @@ caption: HTML created: 20131205160816081 -modified: 20201125094415933 +modified: 20210614100305329 tags: WikiText title: HTML in WikiText type: text/vnd.tiddlywiki +! HTML tags and comments + HTML tags and comments can be used directly in WikiText. For example: ``` @@ -14,7 +16,22 @@ This is my nice and simple block of text. HelloThere ``` -[[Widgets share the same syntax as HTML tags|Widgets in WikiText]], and so the following information applies to them, too. +!! Pragma Comments + +<<.from-version 5.2.0>> Comments can now be freely intermixed with pragmas as well as within the main body of a block of wikitext. + +``` + +\define test() +some text +\end + +<> +``` + +! Important + +<<.tip """[[Widgets share the same syntax as HTML tags|Widgets in WikiText]], and so the following information applies to them, too.""">> ! Block mode versus Inline mode From 4c56bd771af0b9e52d2f20e93ada23ae426a46d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez=20Rinc=C3=B3n?= Date: Mon, 14 Jun 2021 18:42:26 +0200 Subject: [PATCH 1389/2376] Signing the CLA (#5794) --- licenses/cla-individual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/licenses/cla-individual.md b/licenses/cla-individual.md index e30cf0cfe..e276f1327 100644 --- a/licenses/cla-individual.md +++ b/licenses/cla-individual.md @@ -455,3 +455,5 @@ Urban Alič, @ualich, 2021/05/06 Joe Bordes, @joebordes, 2021/05/30 Frank Bruns-Ballhausen, @FBB-de, 2021/06/09 + +Álvaro González Rincón, @Alzacon, 2021/06/10 From 2da7ae0b735c45725802d813d15d0c807f95e65b Mon Sep 17 00:00:00 2001 From: "jeremy@jermolene.com" Date: Mon, 14 Jun 2021 18:13:51 +0100 Subject: [PATCH 1390/2376] Action-createtiddler: Ensure child widgets are refreshed before invocation Fixes #5791 --- core/modules/widgets/action-createtiddler.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/modules/widgets/action-createtiddler.js b/core/modules/widgets/action-createtiddler.js index 693c33282..b49eaad20 100644 --- a/core/modules/widgets/action-createtiddler.js +++ b/core/modules/widgets/action-createtiddler.js @@ -104,6 +104,7 @@ CreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) { } this.setVariable("createTiddler-title",title); this.setVariable("createTiddler-draftTitle",draftTitle); + this.refreshChildren(); return true; // Action was invoked }; From 0b56d5fd379e01a86b7faef8e8a70ef49d721d0e Mon Sep 17 00:00:00 2001 From: Mario Pietsch Date: Mon, 21 Jun 2021 13:14:36 +0200 Subject: [PATCH 1391/2376] update German translation (#5811) --- languages/de-DE/ControlPanel.multids | 6 +++++- languages/de-DE/Docs/ModuleTypes.multids | 1 + languages/de-DE/EditTemplate.multids | 2 ++ languages/de-DE/Help/listen.tid | 5 +++-- languages/de-DE/Help/render.tid | 3 ++- languages/de-DE/Import.multids | 5 +++++ languages/de-DE/Misc.multids | 11 ++++++++++- languages/de-DE/ThemeTweaks.multids | 4 ++-- languages/de-DE/TiddlerInfo.multids | 2 +- 9 files changed, 31 insertions(+), 8 deletions(-) diff --git a/languages/de-DE/ControlPanel.multids b/languages/de-DE/ControlPanel.multids index f7c9f46f4..ed5ef024d 100644 --- a/languages/de-DE/ControlPanel.multids +++ b/languages/de-DE/ControlPanel.multids @@ -17,6 +17,8 @@ Basics/NewJournal/Tags/Prompt: Tags des neuen Journal-Tiddlers Basics/NewTiddler/Title/Prompt: Titel des neuen Tiddlers Basics/NewTiddler/Tags/Prompt: Tags des neuen Tiddlers Basics/OverriddenShadowTiddlers/Prompt: Anzahl überschriebener Schatten-Tiddler +Basics/RemoveTags: Auf neues Format umstellen +Basics/RemoveTags/Hint: Die "tags" Konfiguration wird auf das aktuelle Format umgestellt Basics/ShadowTiddlers/Prompt: Anzahl Schatten-Tiddler Basics/Subtitle/Prompt: Untertitel Basics/SystemTiddlers/Prompt: Anzahl System-Tiddler @@ -44,6 +46,7 @@ KeyboardShortcuts/Platform/Linux: Nur Linux KeyboardShortcuts/Platform/NonLinux: Alle Plattformen, außer Linux KeyboardShortcuts/Platform/Windows: Nur Windows KeyboardShortcuts/Platform/NonWindows: Alle Plattformen, außer Windows +LayoutSwitcher/Caption: Layout LoadedModules/Caption: Geladene Module LoadedModules/Hint: Hier werden die geladenen Module und ihre Quelltext-Komponenten angezeigt. Kursiv hervorgehobene Tiddler haben keinen Quelltext. Sie werden während des Boot-Prozesses (Aufrufen des Tiddlywikis) erstellt. Palette/Caption: Palette @@ -120,11 +123,12 @@ Saving/TiddlySpot/BackupDir: Verzeichnis für das "Backup" Saving/TiddlySpot/ControlPanel: ~TiddlySpot Control Panel Saving/TiddlySpot/Backups: "Backups" Saving/TiddlySpot/Caption: Speichern auf ~TiddlySpot -Saving/TiddlySpot/Description: Diese Einstellungen sind nur für http://tiddlyspot.com und kompatible Server aktiv! +Saving/TiddlySpot/Description: Diese Einstellungen sind nur für [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]], und kompatible Server aktiv! [[Diese Beschreibung|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] enthält weitergehende Informationen. Saving/TiddlySpot/Filename: Dateiname für den "Upload" Saving/TiddlySpot/Heading: ~TiddlySpot Saving/TiddlySpot/Hint: //Die Standard-Server-URL ist `http://.tiddlyspot.com/store.cgi` und kann im Feld 'Server-URL' verändert werden. zB: http://example.com/store.php// Saving/TiddlySpot/Password: Passwort +Saving/TiddlySpot/ReadOnly: ~TiddlySpot wurde durch https://tiddlyhost.com ersetzt. Neue Wikis können nur noch unter ~TiddlyHost erstellt werden. Bestehende Projekte können mit bekanntem Passwort gespeichert werden. Genaue Informationen finden Sie unter: http://tiddlyspot.com/ Saving/TiddlySpot/ServerURL: Server-URL Saving/TiddlySpot/UploadDir: Verzeichnis für den "Upload" Saving/TiddlySpot/UserName: Name des Wikis diff --git a/languages/de-DE/Docs/ModuleTypes.multids b/languages/de-DE/Docs/ModuleTypes.multids index 6e433d4f2..5b7738d84 100644 --- a/languages/de-DE/Docs/ModuleTypes.multids +++ b/languages/de-DE/Docs/ModuleTypes.multids @@ -23,6 +23,7 @@ tiddlerfield: Definiert das Verhalten, der unterschiedlichen Tiddler-Felder. tiddlermethod: Methoden werden dem `$tw.Tiddler` Prototypen hinzugefügt. upgrader: Führt spezifische Änderungen während des Upgrade- oder Import-prozesses durch. utils: Methoden werden `$tw.utils` hinzugefügt. +utils-browser: Browser-spezifische Methoden werden zu `$tw.utils` hinzugefügt. utils-node: Erweitert `$tw.utils` mit Methoden aus node.js. widget: Widgets verarbeiten das Rendern und Aktualisieren der Anzeige in der DOM. wikimethod: Methoden werden zu `$tw.Wiki` hinzugefügt. diff --git a/languages/de-DE/EditTemplate.multids b/languages/de-DE/EditTemplate.multids index 6fafba055..517d4334f 100644 --- a/languages/de-DE/EditTemplate.multids +++ b/languages/de-DE/EditTemplate.multids @@ -3,6 +3,8 @@ title: $:/language/EditTemplate/ Body/External/Hint: Dieser Tiddler zeigt den Inhalt einer Datei, die nicht im TW file gespeichert ist. Sie können die "Tags" und "Feld" Texte ändern, jedoch nicht den Inhalt des Tiddlers! Body/Placeholder: Geben Sie den Text für diesen Tiddler ein. Body/Preview/Type/Output: Anzeige +Body/Preview/Type/DiffShadow: Unterschiede zum Schatten-Tiddler (wenn vorhanden) +Body/Preview/Type/DiffCurrent: Unterschiede zum aktuellen Tiddler Field/Remove/Caption: Lösche Feld Field/Remove/Hint: Lösche Feld Field/Dropdown/Caption: Feld Liste diff --git a/languages/de-DE/Help/listen.tid b/languages/de-DE/Help/listen.tid index c1b71dda8..1d4760689 100644 --- a/languages/de-DE/Help/listen.tid +++ b/languages/de-DE/Help/listen.tid @@ -21,9 +21,10 @@ Mögliche Parameter: * ''username'' - Benutzername für die Basis-Authentifizierung * ''password'' - Passwort für die Basis-Authentifizierung * ''authenticated-user-header'' - HTTP Header-Name für vertrauenswürdige, authentifizierte Benutzer -* ''readers'' - Komma separierte Liste für Benutzer, mit Schreiberlaubnis -* ''writers'' - Komma separierte Liste für Benutzer, mit Leseerlaubnis +* ''readers'' - Komma-separierte Liste für Benutzer, mit Schreiberlaubnis +* ''writers'' - Komma-separierte Liste für Benutzer, mit Leseerlaubnis * ''csrf-disable'' - "yes" bedeutet, dass CSRF checks deaktiviert sind. (Standard: "no") +* ''sse-enabled'' - "yes" bedeuted, dass "Server-sent events" aktiv sind (Standard: "no") * ''root-tiddler'' - Tiddler, der für den "Root-Pfad" verwendet wird. (Standard: "$:/core/save/all") * ''root-render-type'' - Darstellungs-Type, die für den Root-Tiddler verwendet wird. (Standard: "text/plain") * ''root-serve-type'' - Inhalts-Type, die für den Root-Tiddler verwendet wird. (Standard: "text/html") diff --git a/languages/de-DE/Help/render.tid b/languages/de-DE/Help/render.tid index a35c59521..bb1b5cda8 100644 --- a/languages/de-DE/Help/render.tid +++ b/languages/de-DE/Help/render.tid @@ -8,7 +8,7 @@ Optionell kann eine Template-Datei angegeben werden. In diesem Fall wird nicht d Es können noch zusätzliche Variablen per Name und Wert gesetzt werden. ``` ---render [] [] [